/** List of checkboxes. Internally value stored as javascript array of values. @class checklist @extends list @final @example <a href="#" id="options" data-type="checklist" data-pk="1" data-url="/post" data-original-title="Select options"></a> <script> $(function(){ $('#options').editable({ value: [2, 3], source: [ {value: 1, text: 'option1'}, {value: 2, text: 'option2'}, {value: 3, text: 'option3'} ] } }); }); </script> **/ (function ($) { var Checklist = function (options) { this.init('checklist', options, Checklist.defaults); }; $.fn.editableutils.inherit(Checklist, $.fn.editabletypes.list); $.extend(Checklist.prototype, { renderList: function() { var $label, $div; if(!$.isArray(this.sourceData)) { return; } for(var i=0; i<this.sourceData.length; i++) { $label = $('<label>').append($('<input>', { type: 'checkbox', value: this.sourceData[i].value, name: this.options.name })) .append($('<span>').text(' '+this.sourceData[i].text)); $('<div>').append($label).appendTo(this.$input); } }, value2str: function(value) { return $.isArray(value) ? value.join($.trim(this.options.separator)) : ''; //it is also possible to sent as array //return value; }, //parse separated string str2value: function(str) { var reg, value = null; if(typeof str === 'string' && str.length) { reg = new RegExp('\\s*'+$.trim(this.options.separator)+'\\s*'); value = str.split(reg); } else if($.isArray(str)) { value = str; } return value; }, //set checked on required checkboxes value2input: function(value) { var $checks = this.$input.find('input[type="checkbox"]'); $checks.removeAttr('checked'); if($.isArray(value) && value.length) { $checks.each(function(i, el) { var $el = $(el); // cannot use $.inArray as it performs strict comparison $.each(value, function(j, val){ /*jslint eqeq: true*/ if($el.val() == val) { /*jslint eqeq: false*/ $el.attr('checked', 'checked'); } }); }); } }, input2value: function() { var checked = []; this.$input.find('input:checked').each(function(i, el) { checked.push($(el).val()); }); return checked; }, //collect text of checked boxes value2htmlFinal: function(value, element) { var selected = [], item, i, html = ''; if($.isArray(value) && value.length <= this.options.limit) { for(i=0; i<value.length; i++){ item = this.itemByVal(value[i]); if(item) { selected.push($('<div>').text(item.text).html()); } } html = selected.join(this.options.viewseparator); } else { html = this.options.limitText.replace('{checked}', $.isArray(value) ? value.length : 0).replace('{count}', this.sourceData.length); } $(element).html(html); }, activate: function() { this.$input.find('input[type="checkbox"]').first().focus(); }, autosubmit: function() { this.$input.find('input[type="checkbox"]').on('keydown', function(e){ if (e.which === 13) { $(this).closest('form').submit(); } }); } }); Checklist.defaults = $.extend({}, $.fn.editabletypes.list.defaults, { /** @property tpl @default <div></div> **/ tpl:'<div></div>', /** @property inputclass @type string @default span2 editable-checklist **/ inputclass: 'span2 editable-checklist', /** Separator of values in string when sending to server @property separator @type string @default ', ' **/ separator: ',', /** Separator of text when display as element content. @property viewseparator @type string @default '<br>' **/ viewseparator: '<br>', /** Maximum number of items shown as element content. If checked more items - <code>limitText</code> will be shown. @property limit @type integer @default 4 **/ limit: 4, /** Text shown when count of checked items is greater than <code>limit</code> parameter. You can use <code>{checked}</code> and <code>{count}</code> placeholders. @property limitText @type string @default 'Selected {checked} of {count}' **/ limitText: 'Selected {checked} of {count}' }); $.fn.editabletypes.checklist = Checklist; }(window.jQuery));