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

165 lines
4.2 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);
this.checkAll = false;
2019-04-30 07:19:40 +00:00
this._checked = false;
this.checkField = 'checked';
this.isIntermediate = false;
2020-09-01 13:13:33 +00:00
this.mayusEnabled = false;
this.window.addEventListener('keydown', event => {
if (event.key === 'Shift')
this.mayusEnabled = true;
});
this.window.addEventListener('keyup', event => {
if (event.key === 'Shift')
this.mayusEnabled = false;
});
this.window.addEventListener('selectstart', event => {
if (this.mayusEnabled)
event.preventDefault();
});
}
/**
* 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
2020-09-01 13:13:33 +00:00
* Changes indeterminate property for
* the check component
*
* @param {ArrayModel} value - Array model instance
*/
set model(value) {
this._model = value;
if (value) {
2020-09-01 13:13:33 +00:00
value.on('rowChange', row => {
this.isIndeterminate = !this.areAllUnchecked() && !this.areAllChecked();
if (this.mayusEnabled) {
this.currentSelection = row.obj.$orgIndex;
if (this.lastSelection != undefined && this.currentSelection != undefined)
this.setSelection(row.value, this.lastSelection, this.currentSelection);
}
this.lastSelection = row.obj.$orgIndex;
2019-04-30 07:19:40 +00:00
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();
});
}
}
2020-09-01 13:13:33 +00:00
setSelection(value, from, to) {
let start = from;
let end = to;
if (from > to) {
start = to;
end = from;
}
const data = this.model.data;
for (let i = start; i <= end; i++)
data[i].checked = value;
}
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
}
2020-07-24 15:46:06 +00:00
ngModule.vnComponent('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
}
});