salix/front/core/components/multi-check/multi-check.js

128 lines
3.0 KiB
JavaScript
Raw Normal View History

2018-02-10 15:18:01 +00:00
import ngModule from '../../module';
2019-10-18 19:36:30 +00:00
import FormInput from '../form-input';
import './style.scss';
2018-02-10 15:18:01 +00:00
/**
2019-09-06 06:07:46 +00:00
* Multicheck component for checking all form instances at once
* @param {SmallInt} checkAll Primary input-check state: 0 -> uncheck, 1 -> checked
* @param {Array} data List of options shown in drop-down
* @param {Array} models Elements to check / unCheck
*/
2019-10-18 19:36:30 +00:00
export default class MultiCheck extends FormInput {
constructor($element, $scope) {
super($element, $scope);
2019-04-30 07:19:40 +00:00
this._checked = false;
this.checkField = 'checked';
this.isIntermediate = false;
}
/**
* Gets array model instance
*
* @return {ArrayModel} - Array model instance
*/
get model() {
return this._model;
2017-06-26 08:52:22 +00:00
}
/**
* Sets the array model instance
* Changes intermediate property for
* the check component
*
* @param {ArrayModel} value - Array model instance
*/
set model(value) {
this._model = value;
if (value) {
value.on('rowChange', () => {
2019-04-30 07:19:40 +00:00
this.isIntermediate = !this.areAllUnchecked() && !this.areAllChecked();
if (this.areAllChecked())
this._checked = true;
2019-04-30 07:19:40 +00:00
else if (!this.areAllChecked())
this._checked = false;
});
value.on('dataChange', () => {
if (this.checked) this.toggle();
});
}
}
2019-04-30 07:19:40 +00:00
/**
* Gets current check state
*/
get checked() {
return this._checked;
}
/**
* Sets current check state
*
* @param {Boolean} value - Checkbox state [undefined, true, false]
*/
set checked(value) {
this._checked = value;
this.checkAll = value;
this.toggle();
this.emit('change', value);
2019-04-30 07:19:40 +00:00
}
/**
* Returns a bolean result for
* checked instances
*
* @return {Boolean} - True if all instances are checked
*/
areAllChecked() {
if (!this.model || !this.model.data) return;
const data = this.model.data;
return data.every(item => {
return item[this.checkField] === true;
});
}
/**
2019-04-30 07:19:40 +00:00
* Returns a bolean result for
* checked instances
*
* @return {Boolean} - False if all instances are checked
*/
2019-04-30 07:19:40 +00:00
areAllUnchecked() {
if (!this.model || !this.model.data) return;
const data = this.model.data;
return data.every(item => {
return item[this.checkField] === false;
});
2017-06-26 08:52:22 +00:00
}
/**
2019-04-30 07:19:40 +00:00
* Toggles checked property on
* all instances
*/
2019-04-30 07:19:40 +00:00
toggle() {
const data = this.model.data;
if (!data) return;
data.forEach(el => {
2019-04-30 07:19:40 +00:00
el[this.checkField] = this.checkAll;
});
2017-10-19 12:13:28 +00:00
}
2017-06-26 08:52:22 +00:00
}
2018-02-10 15:18:01 +00:00
ngModule.component('vnMultiCheck', {
2017-06-26 08:52:22 +00:00
template: require('./multi-check.html'),
controller: MultiCheck,
bindings: {
model: '<',
checkField: '<?',
checkAll: '=?',
disabled: '<?'
2017-06-26 08:52:22 +00:00
}
});