From 625b11f672158c32e391f4fcebd58db818eccfee Mon Sep 17 00:00:00 2001 From: Owen Leonard Date: Fri, 28 Jan 2022 17:14:15 +0000 Subject: [PATCH] Bug 29971: Remember selections across patron search pages This patch modifies the patron search results page to enable checkbox selections to be remembered in the browser's localStorage. This allows checkbox selections to persist while navigating through multiple pages of search results or even across multiple different searches. Once selected, these values can be added to a patron list or submitted for merging. Selections can be cleared manually and will be automatically be removed upon logout. To test, apply the patch and rebuild the staff interface CSS (https://wiki.koha-community.org/wiki/Working_with_SCSS_in_the_OPAC_and_staff_client). - In the staff interface perform a patron search in the Patrons module which will return multiple pages of results.. - Check checkboxes next to several patrons. - After one checkbox is checked the "Add to patron list" button should be enabled. - After more than one checkbox is checked the "Merge selected patrons" button should be enabled. - A box should appear in the toolbar above the search results, "Patrons selected: X" - Navigate to another page of results. Check more checkboxes. The "Patrons selected" information should be updated. - Return to the first page of results. Your original selections should still be checked. - Test that the correct set of patrons is used when clicking "Merge selected patrons" or when using "Add to patron list." - Click the "Clear" button in the selections information box. Checkboxes should be cleared on every page of results you previously checked. - The "Add to patron list" and "Merge selected patrons" buttons should become disabled. - After making several selections, log out of the staff interface and log back in, returning to the same patron search. Your selections should have been forgotten. --- .../prog/css/src/staff-global.scss | 20 +++ .../prog/en/modules/members/member.tt | 128 +++++++++++++----- .../modules/members/tables/members_results.tt | 2 +- .../intranet-tmpl/prog/js/staff-global.js | 1 + 4 files changed, 115 insertions(+), 36 deletions(-) diff --git a/koha-tmpl/intranet-tmpl/prog/css/src/staff-global.scss b/koha-tmpl/intranet-tmpl/prog/css/src/staff-global.scss index fa3421dee1..36c2d5b075 100644 --- a/koha-tmpl/intranet-tmpl/prog/css/src/staff-global.scss +++ b/koha-tmpl/intranet-tmpl/prog/css/src/staff-global.scss @@ -2204,6 +2204,26 @@ li { } } +#patron_search_selected { + background-color: #F9FEFF; + border: 1px solid #B9D8D9; + border-color: #A2CBCC #CEE0E3 #CEE0E3 #A2CBCC; + border-radius: 3px; + color: #333; + display: inline-block; + font-size: 11px; + line-height: 1.5; + padding: 5px 10px; + text-align: center; + vertical-align: middle; + white-space: nowrap; +} + +#clear-patron-selection { + display: inline-block; + margin-left: 1em; +} + #search-facets { border: 1px solid #B9D8D9; border-radius: 5px 5px 0 0; diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/members/member.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/members/member.tt index 82d3a5bbb4..0271434610 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/modules/members/member.tt +++ b/koha-tmpl/intranet-tmpl/prog/en/modules/members/member.tt @@ -99,6 +99,10 @@ [% IF CAN_user_borrowers_edit_borrowers %] [% END %] + [% END %] @@ -245,14 +249,38 @@ getSearchByLocation( false ); }); + function showPatronSelections( number ){ + $("#patron_search_selected").show().find("span").text(_("Patrons selected: " + number ) ); + } + $(document).ready(function() { $('#merge-patrons').prop('disabled', true); $('#memberresultst').on('change', 'input.selection', function() { - if ( $('.selection:checked').length > 1 ) { + var patron_search_selections = JSON.parse( localStorage.getItem("patron_search_selections") ) || []; + var borrowernumber = $(this).val(); + if( $(this).prop("checked") ){ + patron_search_selections.push( $(this).val() ); + localStorage.setItem('patron_search_selections', JSON.stringify( patron_search_selections )); + showPatronSelections( patron_search_selections.length ); + } else { + var filtered = patron_search_selections.filter(function( value ){ + return value !== borrowernumber; + }); + if( filtered.length > 0 ){ + localStorage.setItem('patron_search_selections', JSON.stringify( filtered )); + patron_search_selections = filtered; + showPatronSelections( filtered.length ); + } else { + patron_search_selections = []; + localStorage.removeItem('patron_search_selections'); + $("#patron_search_selected").hide(); + } + } + if ( patron_search_selections.length > 1 ) { /* More than one checkbox has been checked */ $('#merge-patrons').prop('disabled', false).removeClass("disabled"); $("#patronlist-menu").removeClass("disabled").prop("disabled", false); - } else if ( $('.selection:checked').length == 1 ) { + } else if ( patron_search_selections.length == 1 ) { /* At least one checkbox has been checked */ $('#merge-patrons').prop('disabled', true).addClass("disabled"); $("#patronlist-menu").removeClass("disabled").prop("disabled", false); @@ -264,17 +292,22 @@ }); $('#merge-patrons').on('click', function() { - var merge_patrons_url = 'merge-patrons.pl?' + $('.selection:checked') - .map(function() { - return "id=" + $(this).val() - }).get().join('&'); + var patron_search_selections = JSON.parse( localStorage.getItem("patron_search_selections") ) || []; + var merge_patrons_url = 'merge-patrons.pl?id=' + patron_search_selections.join("&id="); window.location.href = merge_patrons_url; }); - $("#patronlist-dropdown").on("click", ".patron-list-add", function(e){ + $("#clear-patron-selection").on("click", function(e){ e.preventDefault(); + $(".selection").prop("checked", false).change(); + localStorage.removeItem("patron_search_selections"); + $("#patron_search_selected").hide(); + }); - if ( $("#memberresultst input:checkbox:checked").length == 0 ) { + $("#patronlist-dropdown").on("click", ".patron-list-add", function(e){ + e.preventDefault(); + var patron_search_selections = JSON.parse( localStorage.getItem("patron_search_selections") ) || []; + if ( patron_search_selections.length == 0 ) { alert( _("You have not selected any patrons to add to a list!") ); $(".btn-group").removeClass("open"); /* Close button menu */ return false; @@ -496,6 +529,9 @@ stickTo: "#searchresults", stickyClass: "floating" }); + }, + "drawCallback": function(){ + prepSelections(); } }, columns_settings); update_searched(); @@ -505,35 +541,57 @@ }); function patronListAdd(){ - var borrowernumbers = []; - $("#memberresultst").find("input:checkbox:checked").each(function(){ - borrowernumbers.push($(this).val()); - }); - var data = { - add_to_patron_list: $("#add_to_patron_list").val(), - new_patron_list: $("#new_patron_list").val(), - borrowernumbers: borrowernumbers - }; - $.ajax({ - data: data, - type: 'POST', - url: '/cgi-bin/koha/svc/members/add_to_list', - success: function(data) { - $("#patron_list_dialog").show(); - $("#patron_list_dialog > span.patrons-length").html(data.patrons_added_to_list); - $("#patron_list_dialog > a").attr("href", "/cgi-bin/koha/patron_lists/list.pl?patron_list_id=" + data.patron_list.patron_list_id); - $("#patron_list_dialog > a").html(data.patron_list.name); - - if ( $('#add_to_patron_list').val() == 'new' ) { - /* Add a new entry to the menu */ - $("#patronlist-dropdown .divider").before('
  • ' + data.patron_list.name + '
  • '); + var borrowernumbers = JSON.parse( localStorage.getItem("patron_search_selections") ) || []; + if ( borrowernumbers.length > 0 ){ + var data = { + add_to_patron_list: $("#add_to_patron_list").val(), + new_patron_list: $("#new_patron_list").val(), + borrowernumbers: borrowernumbers + }; + $.ajax({ + data: data, + type: 'POST', + url: '/cgi-bin/koha/svc/members/add_to_list', + success: function(data) { + $("#patron_list_dialog").show(); + $("#patron_list_dialog > span.patrons-length").html(data.patrons_added_to_list); + $("#patron_list_dialog > a").attr("href", "/cgi-bin/koha/patron_lists/list.pl?patron_list_id=" + data.patron_list.patron_list_id); + $("#patron_list_dialog > a").html(data.patron_list.name); + + if ( $('#add_to_patron_list').val() == 'new' ) { + /* Add a new entry to the menu */ + $("#patronlist-dropdown .divider").before('
  • ' + data.patron_list.name + '
  • '); + } + }, + error: function() { + alert( _("An error occurred. Patron list could not be updated.") ); } - }, - error: function() { - alert( _("An error occurred. Patron list could not be updated.") ); + }); + return true; + } else { + alert( _("You have not selected any patrons to add to a list!") ); + return false; + } + } + + function prepSelections(){ + var selected_patrons = JSON.parse( localStorage.getItem("patron_search_selections") ); + if( selected_patrons && selected_patrons.length > 0 ){ + showPatronSelections( selected_patrons.length ); + + $('#merge-patrons').prop('disabled', true); + $("input.selection").each(function(){ + var cardnumber = $(this).val(); + if( selected_patrons.indexOf( cardnumber ) >= 0 ){ + $(this).prop("checked", true ); + } + }); + + if( selected_patrons.length > 1 ){ + $('#merge-patrons').removeClass("disabled").prop('disabled', false); + $('#patronlist-menu').removeClass("disabled").prop('disabled', false); } - }); - return true; + } } function getSearchByLocation( setstate ){ diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/members/tables/members_results.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/members/tables/members_results.tt index d339638c4a..31176437a7 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/modules/members/tables/members_results.tt +++ b/koha-tmpl/intranet-tmpl/prog/en/modules/members/tables/members_results.tt @@ -14,7 +14,7 @@ { [% IF CAN_user_borrowers_edit_borrowers || CAN_user_tools_manage_patron_lists %] "dt_borrowernumber": - "", + "", [% END %] "dt_cardnumber": "[% IF ( CAN_user_circulate_circulate_remaining_permissions ) %][% data.cardnumber | html | $To %][% ELSE %][% data.cardnumber | html | $To %][% END %]", diff --git a/koha-tmpl/intranet-tmpl/prog/js/staff-global.js b/koha-tmpl/intranet-tmpl/prog/js/staff-global.js index c62a037e52..ee967e97f1 100644 --- a/koha-tmpl/intranet-tmpl/prog/js/staff-global.js +++ b/koha-tmpl/intranet-tmpl/prog/js/staff-global.js @@ -205,6 +205,7 @@ function logOut(){ removeLastBorrower(); localStorage.removeItem("sql_reports_activetab"); localStorage.removeItem("searches"); + localStorage.removeItem("patron_search_selections"); } function openHelp(){ -- 2.20.1