From 3380dacfcd88ea8168e84caccf0c4e41ccd8df33 Mon Sep 17 00:00:00 2001 From: Bill Erickson Date: Sat, 12 Aug 2017 11:12:17 -0400 Subject: [PATCH] LP#1694577 Reports template searching and paging Adds a new template search from along the top of the reports interface. Templates may be searched name and/or description. Adds paging support to the template, reports, and output interfaces. Signed-off-by: Bill Erickson Signed-off-by: Galen Charlton Signed-off-by: Jason Etheridge --- Open-ILS/web/opac/locale/en-US/reports.dtd | 10 +++ Open-ILS/web/reports/oils_rpt.css | 12 +++ Open-ILS/web/reports/oils_rpt.js | 9 +++ Open-ILS/web/reports/oils_rpt.xhtml | 43 +++++++--- .../web/reports/oils_rpt_folder_window.js | 78 ++++++++++++++++++- .../web/reports/oils_rpt_folder_window.xhtml | 7 +- Open-ILS/web/reports/oils_rpt_folders.js | 63 +++++++++++++-- Open-ILS/web/reports/oils_rpt_vars.js | 1 + 8 files changed, 203 insertions(+), 20 deletions(-) diff --git a/Open-ILS/web/opac/locale/en-US/reports.dtd b/Open-ILS/web/opac/locale/en-US/reports.dtd index 85fc17de74..4654292f8b 100644 --- a/Open-ILS/web/opac/locale/en-US/reports.dtd +++ b/Open-ILS/web/opac/locale/en-US/reports.dtd @@ -188,6 +188,16 @@ + + + + + + + + + + diff --git a/Open-ILS/web/reports/oils_rpt.css b/Open-ILS/web/reports/oils_rpt.css index 17a71ed9b5..da744b2b7c 100644 --- a/Open-ILS/web/reports/oils_rpt.css +++ b/Open-ILS/web/reports/oils_rpt.css @@ -303,6 +303,10 @@ button:disabled { .oils_rpt_generic_table { width: 100%; } .oils_rpt_generic_table td { border: 1px solid #808080; padding: 5px; } +#oils_rpt_content_count_row a { + padding-left: 5px; +} + #oils_rpt_content_count_row_2 { border-top: 2px solid #808080; border-bottom: 1px solid #808080; @@ -334,3 +338,11 @@ button:disabled { #oils_rpt_editor_sched_confirm:first-child { font-size: 110%; } + +#template_search_form_wrapper label { + font-weight: bold; +} + +#template_search_form_wrapper span { + padding-right: 10px; +} diff --git a/Open-ILS/web/reports/oils_rpt.js b/Open-ILS/web/reports/oils_rpt.js index 3d212def50..3a755527b1 100644 --- a/Open-ILS/web/reports/oils_rpt.js +++ b/Open-ILS/web/reports/oils_rpt.js @@ -28,12 +28,21 @@ function oilsInitReports() { dojo.cookie(COOKIE_SES, SESSION, { 'path' : '/', 'secure' : true}); dojo.cookie('ws_ou', USER.ws_ou(), { 'path' : '/', 'secure' : true}); + // set the search form to submit-on-enter + DOM.template_search_query.onkeyup = function(evt) { + if (evt.keyCode == 13 && + DOM.template_search_query.value) { + DOM.template_search_submit_button.onclick(); + } + } + oilsRptFetchOrgTree( function() { oilsLoadRptTree( function() { hideMe(DOM.oils_rpt_tree_loading); unHideMe(DOM.oils_rpt_folder_table); + unHideMe(DOM.template_search_form_wrapper); } ) } diff --git a/Open-ILS/web/reports/oils_rpt.xhtml b/Open-ILS/web/reports/oils_rpt.xhtml index f3ceac565b..c5bcd2831b 100644 --- a/Open-ILS/web/reports/oils_rpt.xhtml +++ b/Open-ILS/web/reports/oils_rpt.xhtml @@ -45,6 +45,29 @@ &reports.common.loading; +
+ + + + + + + + + + + +
+ @@ -66,7 +89,8 @@
- +
@@ -76,14 +100,15 @@
&reports.oils_rpt.manage_folder_contents;
- - - - - +
- : - &reports.oils_rpt.created_by; -
+
+ : + &reports.oils_rpt.created_by; +
+
+ &reports.oils_rpt_template_search_results; +
+
diff --git a/Open-ILS/web/reports/oils_rpt_folder_window.js b/Open-ILS/web/reports/oils_rpt_folder_window.js index f5e0cf8c31..d1ba641179 100644 --- a/Open-ILS/web/reports/oils_rpt_folder_window.js +++ b/Open-ILS/web/reports/oils_rpt_folder_window.js @@ -23,24 +23,57 @@ function oilsRptFolderWindow(type, folderId) { // maps folder IDs to their containing oilsRptFolderWindow objects oilsRptFolderWindow.folderIdMap = {}; -oilsRptFolderWindow.prototype.draw = function() { +// Here lie the contents of a specific folder +oilsRptFolderWindow.prototype.draw = function(viaPaging) { _debug('drawing folder window for ' + this.folderNode.folder.name() ); + // always start a new folder at the first page of results + if (!viaPaging) oilsRptOutputOffset = 0; + + console.log('drawing folder ' + this.folderNode.folder.name() + + ' ; offset=' + oilsRptOutputOffset + ' ; limit=' + oilsRptOutputLimit); + var obj = this; setSelector(DOM.oils_rpt_output_limit_selector, oilsRptOutputLimit); setSelector(DOM.oils_rpt_output_limit_selector_2, oilsRptOutputLimit2); DOM.oils_rpt_output_limit_selector.onchange = function() { oilsRptOutputLimit = getSelectorVal(DOM.oils_rpt_output_limit_selector); - obj.draw(); + obj.draw(); // resets offset } DOM.oils_rpt_output_limit_selector_2.onchange = function() { oilsRptOutputLimit2 = getSelectorVal(DOM.oils_rpt_output_limit_selector_2); - obj.draw(); + obj.draw(); // resets offset } + DOM.oils_rpt_output_next_selector.onclick = function() { + oilsRptOutputOffset += Number(oilsRptOutputLimit); + obj.draw(true); + } + + // Enable / disable the Previous and Start links depending on + // current page. + if (oilsRptOutputOffset <= 0) { + DOM.oils_rpt_output_prev_selector.onclick = function(){}; + DOM.oils_rpt_output_first_selector.onclick = function(){}; + DOM.oils_rpt_output_prev_selector.removeAttribute('href'); + DOM.oils_rpt_output_first_selector.removeAttribute('href'); + } else { + DOM.oils_rpt_output_prev_selector.setAttribute('href', 'javascript:'); + DOM.oils_rpt_output_first_selector.setAttribute('href', 'javascript:'); + + DOM.oils_rpt_output_prev_selector.onclick = function() { + oilsRptOutputOffset -= Number(oilsRptOutputLimit); + obj.draw(true); + } + + DOM.oils_rpt_output_first_selector.onclick = function() { + obj.draw(); // resets offset + } + } + var mine = ( this.folderNode.folder.owner().id() == USER.id() ); _debug('drawing folder window with type '+this.type); @@ -486,6 +519,22 @@ oilsRptFolderWindow.prototype.drawFolderDetails = function() { } +oilsRptFolderWindow.prototype.createSearchRequest = function() { + var field = getSelectorVal(DOM.template_search_fields_selector); + var fields = field ? [field] : ['name', 'description']; + + return new Request( + 'open-ils.reporter:open-ils.reporter.search.templates.atomic', + SESSION, { + limit : oilsRptOutputLimit, + offset : oilsRptOutputOffset, + query : DOM.template_search_query.value, + folder : getSelectorVal(DOM.template_search_folder_selector), + fields : fields, + } + ); +} + oilsRptFolderWindow.prototype.fetchFolderData = function(callback) { hideMe(DOM.oils_rpt_content_count_row_2); @@ -493,7 +542,8 @@ oilsRptFolderWindow.prototype.fetchFolderData = function(callback) { removeChildren(this.selector); var req = new Request(OILS_RPT_FETCH_FOLDER_DATA, - SESSION, this.type, this.folderNode.folder.id(), oilsRptOutputLimit); + SESSION, this.type, this.folderNode.folder.id(), + oilsRptOutputLimit, oilsRptOutputOffset); hideMe(DOM.oils_rpt_pending_output); @@ -504,6 +554,26 @@ oilsRptFolderWindow.prototype.fetchFolderData = function(callback) { SESSION, this.folderNode.folder.id(), oilsRptOutputLimit, 0); } + // Displaying the special template "Search Results" folder means + // starting a new search. + var hidableNodes = document.getElementsByClassName('hidden-for-search-results'); + var showableNodes = document.getElementsByClassName('show-for-search-results'); + if (this.type == 'template' && + this.folderNode.folder.id() == oilsRptSearchResultFolderId) { + req = this.createSearchRequest(); + + // when displaying search results, hide anything that should be hidden + dojo.forEach(hidableNodes, function(n) { n.style.visibility = 'hidden' }); + dojo.forEach(showableNodes, function(n) { n.style.visibility = 'visible' }); + hideMe(DOM.real_folder_name); + unHideMe(DOM.search_results_folder_name); + } else { + dojo.forEach(hidableNodes, function(n) { n.style.visibility = 'visible' }); + dojo.forEach(showableNodes, function(n) { n.style.visibility = 'hidden' }); + unHideMe(DOM.real_folder_name); + hideMe(DOM.search_results_folder_name); + } + var obj = this; removeChildren(obj.selector); req.callback( diff --git a/Open-ILS/web/reports/oils_rpt_folder_window.xhtml b/Open-ILS/web/reports/oils_rpt_folder_window.xhtml index 34090bce65..1003cc364c 100644 --- a/Open-ILS/web/reports/oils_rpt_folder_window.xhtml +++ b/Open-ILS/web/reports/oils_rpt_folder_window.xhtml @@ -9,7 +9,7 @@ - - diff --git a/Open-ILS/web/reports/oils_rpt_folders.js b/Open-ILS/web/reports/oils_rpt_folders.js index 2c2b3ffed3..71c656dc6f 100644 --- a/Open-ILS/web/reports/oils_rpt_folders.js +++ b/Open-ILS/web/reports/oils_rpt_folders.js @@ -6,6 +6,9 @@ var oilsRptFolderNodeCache = {}; oilsRptFolderNodeCache.template = {}; oilsRptFolderNodeCache.report = {}; oilsRptFolderNodeCache.output = {}; +// ephemeral template search results folder needs an ID. +var oilsRptSearchResultFolderId = -1000; +var oilsRptSearchResultFolderWindowId = null; oilsRptSetSubClass('oilsRptFolderManager','oilsRptObject'); @@ -130,6 +133,10 @@ oilsRptFolderManager.prototype.draw = function(auth) { oilsRptSharedOutputFolderTree.addNode(this.soId, -1, rpt_strings.FOLDERS_OUTPUT) + DOM.template_search_submit_button.onclick = function() { + oilsRptObject.find(oilsRptSearchResultFolderWindowId).draw(); + } + this.fetchFolders(auth); } @@ -190,6 +197,15 @@ oilsRptFolderManager.prototype.drawFolders = function(type, folders) { var tree; var owners = {}; + // Special search results folders ; not added to folder tree. + if (type == 'template') { + var resFolder = new rtf(); + resFolder.id(oilsRptSearchResultFolderId); + resFolder.name(''); // not shown + resFolder.owner(USER); + folders.unshift(resFolder); + } + for( var i = 0; i < folders.length; i++ ) { var folder = folders[i]; @@ -199,6 +215,9 @@ oilsRptFolderManager.prototype.drawFolders = function(type, folders) { oilsRptFolderNodeCache[type][folder.id()] = node; node.folderWindow = new oilsRptFolderWindow(type, folder.id()) + if (folder.id() == oilsRptSearchResultFolderId) + oilsRptSearchResultFolderWindowId = node.folderWindow.id; + /* _debug("creating folder node for "+folder.name()+" : id = "+ folder.id()+' treeId = '+id + ' window id = ' + node.folderWindow.id); @@ -238,9 +257,9 @@ oilsRptFolderManager.prototype.drawFolders = function(type, folders) { } } + var search_folders = []; for( var i = 0; i < folders.length; i++ ) { - var folder = folders[i]; var mine = (folder.owner().id() == USER.id()); var pid; @@ -283,8 +302,13 @@ oilsRptFolderManager.prototype.drawFolders = function(type, folders) { node = this.findNode(type, folder.id()); id = node.treeId; - if( folder.parent() ) - pid = this.findNode(type, folder.parent()).treeId; + if( folder.parent() ) { + var pnode = this.findNode(type, folder.parent()); + pid = pnode.treeId; + node.depth = pnode.depth + 1; + } else { + node.depth = 0; + } var fname = folder.name(); @@ -304,9 +328,38 @@ oilsRptFolderManager.prototype.drawFolders = function(type, folders) { +pid + ' parent = ' + folder.parent() + ' folder-window = ' + node.folderWindow.id ); */ - tree.addNode(id, pid, fname, action); - tree.close(pid); + if (folder.id() != oilsRptSearchResultFolderId) { + search_folders.push({id : folder.id(), pid: folder.parent(), fname : fname, depth : node.depth}); + tree.addNode(id, pid, fname, action); + tree.close(pid); + } } + + // search only applies to templates + if (type != 'template') return; + + // Sort the list of search folders from top to bottom of the folder tree. + var depth_cache = {}; + function add_folder(node) { + if (!node) return; + + var label = node.fname; + // Left-pad the selector options by depth with U+2003 'EM SPACE' + // characters so the browser won't collapse the space. + for (var i = 0; i < node.depth; i++) label = ' ' + label; + + insertSelectorVal( + DOM.template_search_folder_selector, -1, label, node.id); + + var children = search_folders.filter( + function(f) { return (f.pid == node.id) }); + dojo.forEach(children, add_folder); + } + + // start with the parent-less folders + dojo.forEach( + search_folders.filter( + function(f) {return f.pid == null}), add_folder); } diff --git a/Open-ILS/web/reports/oils_rpt_vars.js b/Open-ILS/web/reports/oils_rpt_vars.js index bf3594ed9d..bd9a5e510e 100644 --- a/Open-ILS/web/reports/oils_rpt_vars.js +++ b/Open-ILS/web/reports/oils_rpt_vars.js @@ -24,6 +24,7 @@ var oilsRptSharedOutputFolderTree; var oilsRptOutputLimit = 10; var oilsRptOutputLimit2 = 10; +var oilsRptOutputOffset = 0; var OILS_RPT_INVALID_DATA = 'oils_rpt_invalid_input'; -- 2.43.2
+ + &reports.oils_rpt_paging_start; + &reports.oils_rpt_paging_prev; + &reports.oils_rpt_paging_next; &reports.oils_rpt_folder_window.pending_items; + &reports.oils_rpt_folder_window.new_template;