VulpesOS/gaia/apps/sms/views/shared/js/selection_handler.js
OverSu b38dea0597 Publish Vulpes Preview 15 sources for desktop, Android and Tundra
Share Gaia assets and adapters, keep private profiles and development documents local, and update both public READMEs.
2026-09-30 23:13:03 +02:00

138 lines
3.1 KiB
JavaScript
Executable file

/*exported SelectionHandler */
(function(exports) {
'use strict';
const REQUIRED_KEYS = [
// elements
'container',
'checkUncheckAllButton',
// methods
'updateSelectionStatus',
'getIdIterator',
'isInEditMode'
];
var SelectionHandler = function constructor(options) {
// Set the necessary properties and method for selection module and throw
// error if not existed in options.
if (typeof options !== 'object') {
throw new Error('options should be a valid object');
}
REQUIRED_KEYS.forEach((key) => {
if (options[key] === undefined) {
throw new Error('Selection options does not provide required key ' + key);
}
this[key] = options[key];
});
this.selected = new Set();
this.container.addEventListener(
'click', this.onSelected.bind(this)
);
this.checkUncheckAllButton.addEventListener(
'click', this.toggleCheckedAll.bind(this)
);
};
SelectionHandler.prototype = {
get selectedCount() {
return this.selected.size;
},
get selectedList() {
return Array.from(this.selected);
},
get inputIdSet() {
var itemIdSet = new Set();
for(var id of this.getIdIterator()) {
itemIdSet.add(id.toString());
}
return itemIdSet;
},
allSelected: function sel_allSelected() {
/*jshint unused: false */
var allItemCount = 0;
var selectedCount = this.selectedCount;
for (var id of this.getIdIterator()) {
if (++allItemCount > selectedCount) {
return false;
}
}
return true;
},
onSelected: function sel_onSelected(event) {
if (!this.isInEditMode()) {
return;
}
var target = event.target;
var value = target.value;
var existed = this.selected.has(value);
if (target.checked && !existed) {
this.selected.add(value);
} else if (!target.checked && existed) {
this.selected.delete(value);
} else {
// Don't emit event if no selection change
return;
}
this.updateSelectionStatus();
},
select: function sel_select(id) {
this.selected.add('' + id);
},
unselect: function sel_unselect(id) {
this.selected.delete('' + id);
},
// Update check status of input elements in the container
updateCheckboxes: function sel_updateCheckboxes() {
var inputs = this.container.querySelectorAll('input[type=checkbox]');
var length = inputs.length;
for (var i = 0; i < length; i++) {
inputs[i].checked = this.selected.has(inputs[i].value);
}
},
// if no message or few are checked : select all the messages
// and if all messages are checked : deselect them all.
toggleCheckedAll: function sel_toggleCheckedAll() {
var allInputs = this.inputIdSet;
var allSelected = (this.selected.size === allInputs.size);
if (allSelected) {
this.selected.clear();
} else {
this.selected = allInputs;
}
this.updateCheckboxes();
this.updateSelectionStatus();
},
cleanForm: function sel_cleanForm() {
// Reset all inputs
this.selected.clear();
this.updateCheckboxes();
// Reset vars for deleting methods
this.updateSelectionStatus();
}
};
exports.SelectionHandler = SelectionHandler;
}(this));