oxjs/source/Ox.UI/js/Form/Ox.CheckboxGroup.js

90 lines
2.9 KiB
JavaScript
Raw Normal View History

2011-07-29 18:48:43 +00:00
// vim: et:ts=4:sw=4:sts=4:ft=javascript
2011-11-05 16:46:53 +00:00
'use strict';
2011-05-16 08:24:46 +00:00
/*@
Ox.CheckboxGroup <f:Ox.Element> CheckboxGroup Object
() -> <f> CheckboxGroup Object
(options) -> <f> CheckboxGroup Object
(options, self) -> <f> CheckboxGroup Object
options <o> Options object
checkboxes <a|[]> array of checkboxes
max <n|1> max selected
min <n|1> min selected
type <s|"group"> type ("group" or "list")
width <n> width in px
2011-05-16 08:24:46 +00:00
self <o> shared private variable
change <!> triggered when checked property changes
passes {checked, id, title}
@*/
2011-04-22 22:03:10 +00:00
2011-05-16 08:24:46 +00:00
Ox.CheckboxGroup = function(options, self) {
2011-04-22 22:03:10 +00:00
self = self || {};
var that = Ox.Element({}, self)
2011-04-22 22:03:10 +00:00
.defaults({
// fixme: should 'checkboxes' be 'items'?
2011-04-22 22:03:10 +00:00
checkboxes: [],
max: 1,
min: 1,
type: 'group',
2011-04-22 22:03:10 +00:00
width: 256
})
.options(options || {})
.addClass('OxCheckboxGroup Ox' + Ox.toTitleCase(self.options.type));
2011-04-22 22:03:10 +00:00
2011-06-19 18:25:37 +00:00
self.optionGroup = new Ox.OptionGroup(
2011-04-22 22:03:10 +00:00
self.options.checkboxes,
self.options.min,
self.options.max
);
2011-04-22 22:03:10 +00:00
self.options.checkboxes = self.optionGroup.init();
self.$checkboxes = [];
if (self.options.type == 'group') {
self.checkboxWidth = Ox.divideInt(
2011-04-22 22:03:10 +00:00
self.options.width + (self.options.checkboxes.length - 1) * 6,
self.options.checkboxes.length
).map(function(v, i) {
2011-04-22 22:03:10 +00:00
return v + (i < self.options.checkboxes.length - 1 ? 10 : 0);
});
};
self.options.checkboxes.forEach(function(checkbox, index) {
self.$checkboxes[index] = Ox.Checkbox(Ox.extend(checkbox, {
2011-04-22 22:03:10 +00:00
group: true,
id: checkbox.id,
width: self.options.type == 'group'
? self.checkboxWidth[index] : self.options.width
2011-04-22 22:03:10 +00:00
}))
.bindEvent('change', function() {
change(index);
2011-04-22 22:03:10 +00:00
})
.appendTo(that);
});
function change(index) {
var toggled = self.optionGroup.toggle(index);
//Ox.Log('Form', 'change', index, 'toggled', toggled)
2011-04-22 22:03:10 +00:00
if (toggled.length) {
toggled.forEach(function(index, i) {
self.$checkboxes[index].toggleChecked();
2011-04-22 22:03:10 +00:00
});
that.triggerEvent('change', {
checked: self.optionGroup.checked().map(function(v) {
2011-04-22 22:03:10 +00:00
return self.options.checkboxes[v].id;
})
});
}
}
that.value = function() {
return self.options.checkboxes.filter(function(checkbox) {
return checkbox.checked;
}).map(function(checkbox) {
return checkbox.id;
});
};
2011-04-22 22:03:10 +00:00
return that;
};