From 8bfc210f23b25431d7476cc4fcabbf52a46748c7 Mon Sep 17 00:00:00 2001 From: Frederick Muriuki Muriithi Date: Mon, 26 Jan 2026 12:13:41 -0600 Subject: Bug: DataTables: Check both radio buttons and checkboxes. Extract logic for checking/unchecking a datatable's row's checkbox or radio button as relevant, into a new function. Use new function instead of multiple copies of the logic. --- uploader/static/js/datatables.js | 32 ++++++++++++++++------ .../phenotypes/confirm-delete-phenotypes.html | 3 +- 2 files changed, 25 insertions(+), 10 deletions(-) diff --git a/uploader/static/js/datatables.js b/uploader/static/js/datatables.js index 2ed435b..bfcda2a 100644 --- a/uploader/static/js/datatables.js +++ b/uploader/static/js/datatables.js @@ -21,6 +21,26 @@ var defaultLengthMenu = (data) => { return menuList; }; +var setRowCheckableProperty = (node, state) => { + /** + * Set a row's (`node`) checkbox's or radio button's checked state to the + * boolean value `state`. + **/ + if(typeof(state) == "boolean") { + var pseudoclass = state == false ? ":checked" : ":not(:checked)"; + var checkable = ( + $(node).find(`input[type="checkbox"]${pseudoclass}`)[0] + || + $(node).find(`input[type="radio"]${pseudoclass}`)[0]); + $(checkable).prop("checked", state); + } else { + throw new Error("`state` *MUST* be a boolean value.") + } +}; + +var setRowChecked = (node) => {setRowCheckableProperty(node, true);}; +var setRowUnchecked = (node) => {setRowCheckableProperty(node, false);}; + var buildDataTable = (tableId, data = [], columns = [], userSettings = {}) => { var defaultSettings = { responsive: true, @@ -41,12 +61,10 @@ var buildDataTable = (tableId, data = [], columns = [], userSettings = {}) => { drawCallback: function (settings) { var api = this.api(); api.rows({selected: true}).nodes().each((node, index) => { - $(node).find('input[type="checkbox"]:checked') - .prop("checked", true); + setRowChecked(node); }); api.rows({selected: false}).nodes().each((node, index) => { - $(node).find('input[type="checkbox"]:not(:checked)') - .prop("checked", false); + setRowUnchecked(node); }); } } @@ -61,8 +79,7 @@ var buildDataTable = (tableId, data = [], columns = [], userSettings = {}) => { .rows(indexes) .nodes() .each((node, index) => { - $(node).find('input[type="checkbox"]:not(:checked)') - .prop("checked", true); + setRowChecked(node); }); }); theDataTable.on("deselect", (event, datatable, type, indexes) => { @@ -70,8 +87,7 @@ var buildDataTable = (tableId, data = [], columns = [], userSettings = {}) => { .rows(indexes) .nodes() .each(function(node, index) { - $(node).find('input[type="checkbox"]:checked') - .prop("checked", false); + setRowUnchecked(node); }); }); diff --git a/uploader/templates/phenotypes/confirm-delete-phenotypes.html b/uploader/templates/phenotypes/confirm-delete-phenotypes.html index 36cab2c..efce397 100644 --- a/uploader/templates/phenotypes/confirm-delete-phenotypes.html +++ b/uploader/templates/phenotypes/confirm-delete-phenotypes.html @@ -89,8 +89,7 @@ var api = this.api(); api.rows().select(); api.rows({selected: true}).nodes().each((node, index) => { - $(node).find('input[type="checkbox"]:not(:checked)') - .prop("checked", true); + setRowChecked(node); }); } }); -- cgit 1.4.1