179 lines
5.6 KiB
JavaScript
179 lines
5.6 KiB
JavaScript
/**
|
|
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));
|