refactor check all checkbox js utility

This commit is contained in:
Felix Hamann 2019-04-07 22:31:27 +02:00
parent c6a175ae5a
commit d43fbca0c3
3 changed files with 67 additions and 47 deletions

View File

@ -1073,9 +1073,9 @@ siteLayout' headingOverride widget = do
-- addScript $ StaticR js_utils_asyncForm_js -- addScript $ StaticR js_utils_asyncForm_js
-- addScript $ StaticR js_utils_asyncTable_js -- addScript $ StaticR js_utils_asyncTable_js
-- addScript $ StaticR js_utils_asyncTableFilter_js -- addScript $ StaticR js_utils_asyncTableFilter_js
-- addScript $ StaticR js_utils_checkAll_js
-- addScript $ StaticR js_utils_httpClient_js -- addScript $ StaticR js_utils_httpClient_js
-- JavaScript utils -- JavaScript utils
addScript $ StaticR js_utils_checkAll_js
addScript $ StaticR js_utils_form_js addScript $ StaticR js_utils_form_js
addScript $ StaticR js_utils_inputs_js addScript $ StaticR js_utils_inputs_js
addScript $ StaticR js_utils_modal_js addScript $ StaticR js_utils_modal_js

View File

@ -16,8 +16,8 @@
label { label {
display: block; display: block;
height: 24px; height: 20px;
width: 24px; width: 20px;
background-color: #f3f3f3; background-color: #f3f3f3;
box-shadow: inset 0 1px 2px 1px rgba(50, 50, 50, 0.05); box-shadow: inset 0 1px 2px 1px rgba(50, 50, 50, 0.05);
border: 2px solid var(--color-primary); border: 2px solid var(--color-primary);
@ -55,14 +55,16 @@
:checked + label::before { :checked + label::before {
background-color: white; background-color: white;
transform: rotate(45deg); transform: rotate(45deg);
left: 4px; left: 2px;
top: 11px;
} }
:checked + label::after { :checked + label::after {
background-color: white; background-color: white;
transform: rotate(-45deg); transform: rotate(-45deg);
top: 11px; top: 9px;
width: 13px; width: 12px;
left: 7px;
} }
[disabled] + label { [disabled] + label {

View File

@ -3,38 +3,54 @@
window.utils = window.utils || {}; window.utils = window.utils || {};
var ASYNC_TABLE_CONTENT_CHANGED_CLASS = 'async-table--changed'; /**
var JS_INITIALIZED_CLASS = 'js-check-all-initialized'; *
* Check All Checkbox Utility
* adds a Check All Checkbox above columns with only checkboxes
*
* Attribute: [none]
* (will be set up automatically on tables)
*
* Example usage:
* (table with one column thats only checkboxes)
*/
var CHECK_ALL_UTIL_NAME = 'checkAll';
var CHECK_ALL_UTIL_SELECTOR = 'table';
var CHECKBOX_SELECTOR = '[type="checkbox"]'; var CHECKBOX_SELECTOR = '[type="checkbox"]';
function getCheckboxId() { var CHECK_ALL_INITIALIZED_CLASS = 'check-all--initialized';
return 'check-all-checkbox-' + Math.floor(Math.random() * 100000);
}
window.utils.checkAll = function(wrapper, options) {
if ((!wrapper || wrapper.classList.contains(JS_INITIALIZED_CLASS)) && !wrapper.classList.contains(ASYNC_TABLE_CONTENT_CHANGED_CLASS)) {
return false;
}
options = options || {};
var checkAllUtil = function(element) {
var columns = []; var columns = [];
var checkboxColumn = []; var checkboxColumn = [];
var checkAllCheckbox = null; var checkAllCheckbox = null;
var utilInstances = [];
function init() { function init() {
if (!element) {
throw new Error('Check All utility cannot be setup without an element!');
}
columns = gatherColumns(wrapper); gatherColumns();
setupCheckAllCheckbox();
setupCheckAllCheckbox(findCheckboxColumn(columns)); // mark initialized
element.classList.add(CHECK_ALL_INITIALIZED_CLASS);
wrapper.classList.add(JS_INITIALIZED_CLASS); return {
name: CHECK_ALL_UTIL_NAME,
element: element,
destroy: function() {},
};
} }
function gatherColumns(table) { function getCheckboxId() {
var rows = Array.from(table.querySelectorAll('tr')); return 'check-all-checkbox-' + Math.floor(Math.random() * 100000);
}
function gatherColumns(tble) {
var rows = Array.from(element.querySelectorAll('tr'));
var cols = []; var cols = [];
rows.forEach(function(tr) { rows.forEach(function(tr) {
var cells = Array.from(tr.querySelectorAll('td')); var cells = Array.from(tr.querySelectorAll('td'));
@ -45,7 +61,7 @@
cols[cellIndex].push(cell); cols[cellIndex].push(cell);
}); });
}); });
return cols; columns = cols;
} }
function findCheckboxColumn(columns) { function findCheckboxColumn(columns) {
@ -68,21 +84,25 @@
return onlyCheckboxes; return onlyCheckboxes;
} }
function setupCheckAllCheckbox(columnId) { function setupCheckAllCheckbox() {
if (columnId === null) { var checkboxColumnId = findCheckboxColumn(columns);
if (checkboxColumnId === null) {
return; return;
} }
checkboxColumn = columns[columnId]; checkboxColumn = columns[checkboxColumnId];
var firstRow = wrapper.querySelector('tr'); var firstRow = element.querySelector('tr');
var th = Array.from(firstRow.querySelectorAll('th, td'))[columnId]; var th = Array.from(firstRow.querySelectorAll('th, td'))[checkboxColumnId];
th.innerHTML = 'test'; th.innerHTML = 'test';
checkAllCheckbox = document.createElement('input'); checkAllCheckbox = document.createElement('input');
checkAllCheckbox.setAttribute('type', 'checkbox'); checkAllCheckbox.setAttribute('type', 'checkbox');
checkAllCheckbox.setAttribute('id', getCheckboxId()); checkAllCheckbox.setAttribute('id', getCheckboxId());
th.innerHTML = ''; th.innerHTML = '';
th.insertBefore(checkAllCheckbox, null); th.insertBefore(checkAllCheckbox, null);
utilInstances.push(window.utils.setup('checkbox', checkAllCheckbox));
if (UtilRegistry) {
UtilRegistry.setup(UtilRegistry.find('checkbox'));
}
checkAllCheckbox.addEventListener('input', onCheckAllCheckboxInput); checkAllCheckbox.addEventListener('input', onCheckAllCheckboxInput);
setupCheckboxListeners(); setupCheckboxListeners();
@ -103,9 +123,9 @@
} }
function updateCheckAllCheckboxState() { function updateCheckAllCheckboxState() {
var allChecked = checkboxColumn.reduce(function(acc, cell) { var allChecked = checkboxColumn.every(function(cell) {
return acc && cell.querySelector(CHECKBOX_SELECTOR).checked; return cell.querySelector(CHECKBOX_SELECTOR).checked;
}, true); })
checkAllCheckbox.checked = allChecked; checkAllCheckbox.checked = allChecked;
} }
@ -115,17 +135,15 @@
}); });
} }
function destroy() { return init();
utilInstances.forEach(function(util) {
util.destroy();
});
}
init();
return {
scope: wrapper,
destroy: destroy,
};
}; };
// register check all checkbox util
if (UtilRegistry) {
UtilRegistry.register({
name: CHECK_ALL_UTIL_NAME,
selector: CHECK_ALL_UTIL_SELECTOR,
setup: checkAllUtil
});
}
})(); })();