From 278c2c2a8237647e75fbe2706019b5b1b543b3e4 Mon Sep 17 00:00:00 2001 From: Felix Hamann Date: Wed, 20 Feb 2019 22:06:30 +0100 Subject: [PATCH] initial work on check-all-checkbox --- src/Foundation.hs | 1 + static/js/utils/asyncTable.js | 2 +- static/js/utils/checkAll.js | 70 +++++++++++++++++++++++++++++++++++ templates/table/layout.julius | 3 +- 4 files changed, 74 insertions(+), 2 deletions(-) create mode 100644 static/js/utils/checkAll.js diff --git a/src/Foundation.hs b/src/Foundation.hs index 84766c47e..98bdd1c5a 100644 --- a/src/Foundation.hs +++ b/src/Foundation.hs @@ -1020,6 +1020,7 @@ siteLayout' headingOverride widget = do addScript $ StaticR js_utils_alerts_js addScript $ StaticR js_utils_asidenav_js addScript $ StaticR js_utils_asyncTable_js + addScript $ StaticR js_utils_checkAll_js addScript $ StaticR js_utils_form_js addScript $ StaticR js_utils_inputs_js addScript $ StaticR js_utils_setup_js diff --git a/static/js/utils/asyncTable.js b/static/js/utils/asyncTable.js index fe164d3b2..d11f6298e 100644 --- a/static/js/utils/asyncTable.js +++ b/static/js/utils/asyncTable.js @@ -18,7 +18,7 @@ var scrollTable; function init() { - var table = wrapper.querySelector('#' + tableIdent); + var table = wrapper.querySelector('#' + tableIdent); if (!table) { return; diff --git a/static/js/utils/checkAll.js b/static/js/utils/checkAll.js new file mode 100644 index 000000000..6b8d51e48 --- /dev/null +++ b/static/js/utils/checkAll.js @@ -0,0 +1,70 @@ +(function collonadeClosure() { + 'use strict'; + + window.utils = window.utils || {}; + + var JS_INITIALIZED_CLASS = 'js-initialized'; + var CHECKBOX_SELECTOR = '.checkbox'; + + window.utils.checkAll = function(wrapper, options) { + + if (!wrapper || wrapper.classList.contains(JS_INITIALIZED_CLASS)) { + return false; + } + options = options || {}; + + var columns = []; + + function init() { + + columns = gatherColumns(wrapper); + + var checkboxColumn = findCheckboxColumn(columns); + if (checkboxColumn) { + setup(checkboxColumn); + } + } + + function gatherColumns(table) { + var rows = Array.from(table.querySelectorAll('tr')); + var cols = []; + rows.forEach(function(tr) { + var cells = Array.from(tr.querySelectorAll('td')); + cells.forEach(function(cell, iCell) { + if (!cols[iCell]) { + cols[iCell] = []; + } + cols[iCell].push(cell); + }); + }); + return cols; + } + + function findCheckboxColumn(cols) { + var checkboxColumn = null; + cols.forEach(function(col, i) { + if (isCheckboxColumn(col)) { + checkboxColumn = i; + } + }); + return checkboxColumn; + } + + function isCheckboxColumn(col) { + var onlyCheckboxes = true; + col.forEach(function(cell) { + console.log('checking', cell); + if (onlyCheckboxes && !cell.querySelector(CHECKBOX_SELECTOR)) { + onlyCheckboxes = false; + } + }); + return onlyCheckboxes; + } + + function setup(column) { + console.log('setting up column', column); + } + + init(); + }; +})(); diff --git a/templates/table/layout.julius b/templates/table/layout.julius index 3bc39312d..d0f02a7d0 100644 --- a/templates/table/layout.julius +++ b/templates/table/layout.julius @@ -1,10 +1,11 @@ document.addEventListener('DOMContentLoaded', function() { var dbtIdent = #{String $ dbtIdent}; var headerDBTableShortcircuit = #{String (toPathPiece HeaderDBTableShortcircuit)}; - var selector = '#' + dbtIdent + '-table-wrapper:not(.js-initialized)'; + var selector = '#' + dbtIdent + '-table-wrapper'; var wrapper = document.querySelector(selector); if (wrapper) { window.utils.setup('asyncTable', wrapper, { headerDBTableShortcircuit, dbtIdent }); + window.utils.setup('checkAll', wrapper); } });