and the advanced search default pane.
modified: Open-ILS/src/templates/opac/parts/advanced/expert.tt2
modified: Open-ILS/src/templates/opac/parts/advanced/numeric.tt2
modified: Open-ILS/src/templates/opac/parts/advanced/search.tt2
modified: Open-ILS/src/templates/opac/parts/pref_lib_display.tt2
modified: Open-ILS/src/templates/opac/parts/searchbar.tt2
modified: Open-ILS/src/templates/opac/results.tt2
new file: Open-ILS/src/templates/staff/admin/workstation/t_search_prefs.tt2
modified: Open-ILS/web/js/ui/default/staff/admin/workstation/app.js
modified: Open-ILS/web/js/ui/default/staff/cat/catalog/app.js
$self->load_search_filter_groups($ctx->{search_ou});
$self->load_org_util_funcs;
$self->load_perm_funcs;
+ $self->_get_pref_lib;
return Apache2::Const::OK;
}
my $pref_ou = $ctx->{pref_ou};
if (defined($pref_ou) and $pref_ou ne '' and $pref_ou != $org and ($pref_ou ne $ctx->{aou_tree}->()->id) and not $query =~ / pref_ou\(\S+\)/) {
my $plib = $ctx->{get_aou}->($pref_ou)->shortname;
- $query = "pref_ou($plib) $query";
+ my $pref_scrubber = "pref_ou($plib) $query";
+ push @naive_query_re, $pref_scrubber;
}
if (my $grp = $ctx->{copy_location_group}) {
push @naive_query_re, $thing;
}
- # This gives templates a way to take site() and depth() back out of
+ # This gives templates a way to take site(), pref_ou(), and depth() back out of
# query strings when they shouldn't be there (because they're controllable
# with other widgets).
$ctx->{naive_query_scrub} = sub {
use OpenILS::Utils::Fieldmapper;
use OpenILS::Application::AppUtils;
use OpenSRF::MultiSession;
+use CGI qw/:standard/;
+use CGI::Cookie;
my $U = 'OpenILS::Application::AppUtils';
my $self = shift;
my $ctx = $self->ctx;
+ if( $ctx->{is_staff}) {
# plib param takes precedence
- my $plib = $self->cgi->param('plib');
+ # my $plib = $self->cgi->param('plib'); #replaced url 'plib' with cookie 'pplib'
+ my $plib = $self->cgi->cookie('pplib');
+ my $pref_clump = $plib;
+ my ($org, $grp) = split(/:/, $pref_clump);
+ $ctx->{pref_lib_org} = $self->_resolve_org_id_or_shortname($org);
+ $ctx->{pref_ou} = $ctx->{pref_lib_org};
return $plib if $plib;
+ }
if ($self->apache->headers_in->get('OILS-Pref-Lib')) {
return $self->apache->headers_in->get('OILS-Pref-Lib');
<form action="[% ctx.opac_root %]/results" method="get">
+ <meta http-equiv="Set-Cookie" content="pplib=[%CGI.param('plib')%];path=/">
<div class="header_middle">[% l("Expert Search") %]</div>
<input type="hidden" name="_special" value="1" />
<table class="expert-search">
<form action="[% ctx.opac_root %]/results" method="get">
+
+ <meta http-equiv="Set-Cookie" content="pplib=[%CGI.param('plib')%];path=/">
<div class="header_middle">[% l("Numeric Search") %]</div>
<input type="hidden" name="contains" value="contains" />
<input type="hidden" name="_special" value="1" />
<option value="identifier|tcn">[% l('TCN') %]</option>
<option value="item_barcode">[% l('Item Barcode') %]</option>
</select>
-
<input type="text" name="query" size="16" autofocus placeholder='[% l("Identifier") %]' />
<br/>
[%- lib_select_id="numeric_search_library" -%]
PROCESS "opac/parts/misc_util.tt2";
PROCESS get_library;
%]
+
+<meta http-equiv="Set-Cookie" content="pplib=[%CGI.param('plib')%]; path=/">
<form action="[% ctx.opac_root %]/results" method="get">
<div id='adv_global_search' class='data_grid data_grid_center'>
<div id='adv_search_rows'>
class='hidden'[% END %]>
<strong><label for="[% adv_chunk.id %]">
[% adv_chunk.adv_label %] </label></strong><br />
+
[%
IF adv_chunk.adv_special;
SWITCH adv_chunk.adv_special;
BLOCK build_org_selector;
node_stack = [{org => org_unit || ctx.aouct_tree || ctx.aou_tree}];
- inherited_vis = ctx.get_cgf('opac.org_unit.non_inherited_visibility').enabled == 'f';
+ inherited_vis = ctx.get_cgf('opac.org_unit.non_inherited_visibility').enabled == 'f'; #get configuration 'opac.org_unit's option for non-inherited visibility and disable it(f)
IF !name;
- name = loc_name;
+ name = loc_name; #If name doesn't exist, set it to loc_name - Defined in misc_util.tt2 get_library
END;
IF !value;
- value = loc_value;
+ value = loc_value;#If value doesn't exist, set it to loc_value - Defined in misc_util.tt2 get_library
END;
# if the selected org unit is out of hiding scope,
css_class = '';
disabled = '';
selected = '';
- visible = org_unit.opac_visible == 't';
+ visible = org_unit.opac_visible == 't'; #enable visibility for org_unit's opac_visible option
# org and all children are invisible.
NEXT IF !visible AND inherited_vis AND !ctx.is_staff;
END;
# add the child org units
+ # Allows child org_units to be displayed
FOR child IN org_unit.children.reverse;
node_stack.push({org => child});
END;
SET pad_depth = pad_depth + 1 IF loc_grp;
# determine the depth by calculating the distance from the root
+ # This gives the Search Library dropdown its child-parent padding
porg = ctx.get_aou(org_unit.parent_ou);
WHILE porg;
SET pad_depth = pad_depth + 1 IF porg.opac_visible == 't' OR ctx.is_staff;
porg = ctx.get_aou(porg.parent_ou);
END;
-
+
pad_depth = pad_depth * 2;
- display_name = loc_grp ? loc_grp.name : org_unit.name %]
+ display_name = loc_grp ? loc_grp.name : org_unit.name #If there is a loc_grp, use loc_grp.name. Otherwise use org_unit.name?
+ %]
<option value='[% node_value %]' [% selected %] [% disabled %] [% css_class %]>
- [% ' ' FOR [0..pad_depth]; display_name | html %]
+ [% ' ' FOR [0..pad_depth]; display_name | html %]
</option>
[%- END %]
-[%- IF ctx.pref_ou && ctx.pref_ou != ctx.search_ou; %]
-<span class="preflib">[%
- l('Preferred library: [_1]', '<span class="bold">' _ ctx.get_aou(ctx.pref_ou).name _ '</span>');
+[%- IF ctx.pref_ou && ctx.pref_ou != ctx.search_ou; ctx.pref_ou = CGI.cookie('pplib')%]
+<span class="preflib"> [%
+ l('Preferred library: [_1]','<span class="bold">' _ ctx.get_aou(ctx.pref_ou).name _ '</span>');
IF NOT ctx.is_staff %]<a href="[% mkurl(ctx.opac_root _ '/myopac/prefs_settings')
%]" class="preflib_change" title="[% l("Change preferred library"); %]">[% l('?') %]</a>[% END; %]
</span>
[%- END %]
<div id="search-box">
<span class="search_catalog_lbl mobile_hide">[% l('Search the Catalog') %]</span>
- <span class="adv_search_catalog_lbl"><a href="[% mkurl(ctx.opac_root _ '/advanced', {}, expert_search_parms.merge(browse_search_parms, facet_search_parms)) %]"
+ <span class="adv_search_catalog_lbl"><a href="[% mkurl(ctx.opac_root _ '/advanced', {"plib" => CGI.cookie('pplib')}, expert_search_parms.merge(browse_search_parms, facet_search_parms)) %]"
id="home_adv_search_link" rel="nofollow" vocab="">[% l('Advanced Search') %]</a></span>
<span class="browse_the_catalog_lbl"><a href="[% mkurl(ctx.opac_root _ '/browse', {}, expert_search_parms.merge(general_search_parms, facet_search_parms, ['fi:has_browse_entry'])) %]" rel="nofollow" vocab="">[% l('Browse the Catalog') %]</a></span>
</div>
[% UNLESS took_care_of_form %]</form>[% END %]
[% IF (is_advanced AND NOT is_special) AND CGI.param('qtype') %]
<div class="opac-auto-102">
- [ <a href="[% mkurl(ctx.opac_root _ '/advanced') %]" rel="nofollow" vocab="">[%
+ [ <a href="[% mkurl(ctx.opac_root _ '/advanced', {"plib" => CGI.cookie('pplib')}) %]" rel="nofollow" vocab="">[%
l('Refine My Original Search')
%]</a> ]
</div>
<a href="[% mkurl(ctx.opac_root _ '/home', {$loc_name => loc_value}, 1) %]" rel="nofollow" vocab="">[% l('Another Search') %]</a>
</div>
<div class="results_header_btns">
- <a href="[% mkurl(ctx.opac_root _ '/advanced',{}, expert_search_parms.merge(browse_search_parms, facet_search_parms)) %]" rel="nofollow" vocab="">[% l('Advanced Search') %]</a>
+ <a href="[% mkurl(ctx.opac_root _ '/advanced',{"plib" => CGI.cookie('pplib')}, expert_search_parms.merge(browse_search_parms, facet_search_parms)) %]" rel="nofollow" vocab="">[% l('Advanced Search') %]</a>
</div>
<div id="refine_hits" class="results_header_btns result_block_visible"><a onclick="getFacety();">[% l('Refine these results') %]</a></div>
<div id="return_to_hits" class="results_header_btns"><a onclick="getResulty();">[% l('Back to results') %]</a></div>
s.PREFS_REMOVE_KEY_CONFIRM =
'[% l('Delete content for key "[_1]"?', '{{deleteKey}}') %]';
s.DEFAULT_WS_LABEL = '[% l('[_1] (Default)', '{{ws}}') %]';
+ s.DEFAULT_ORG_LABEL = '[% l( '[_1] {{org}}') %]';
+ s.DEFAULT_PREF_ORG_LABEL = '[% l( '[_1] {{org}}') %]';
s.WS_EXISTS = '[% l("Workstation name already exists. Use it anyway?") %]';
}]);
</script>
<div ng-view></div>
[% END %]
+
+
+
+
--- /dev/null
+<div class="container" id="admin-workstation-printing">
+
+<style>
+ /* TODO: more context and move me */
+ textarea {
+ height: 400px;
+ width: 100%;
+ }
+ h2 { margin-bottom: 15px }
+
+</style>
+
+ <div class="row">
+ <div class="col-md-12">
+ <h2>[% l('Library & Search Preferences') %]</h2>
+ </div>
+ </div>
+
+ <div class="row">
+ <div class="col-md-6">
+ <h3>Default Search Library</h3>
+ <p>The default search library setting determines what library is searched from the advanced
+ search screen and portal page by default. Manual selection of a search library will override
+ it. One recommendation is to set the search library to the highest point you would normally
+ want to search.</p>
+ <div class="btn-group " dropdown>
+ <button type="button" class="btn btn-default dropdown-toggle">
+ <span style="padding-right: 5px;">{{getDefaultSelectedName}}</span>
+ <span class="caret"></span>
+ </button>
+ <ul class="dropdown-menu">
+ <li ng-repeat="org in orgList" ng-hide="hiddenTest(org.id)">
+ <a href ng-click="orgDefaultChanged(org)" a-disabled="disableTest(org.id)"
+ style="padding-left: {{org.depth * 10 + 5}}px">
+ {{org.shortname}}
+ </a>
+ </li>
+ </ul>
+ </div>
+ </div> <!-- col -->
+ </div><!-- row -->
+
+ <div class="row">
+ <div class="col-md-6">
+ <h3>Preferred Library</h3>
+ <p>The preferred library is used to show copies and URIs regardless of the library
+ searched. One recommendation is to set this to your workstation library so that local
+ copies show up first in search results.</p>
+ <div class="btn-group " dropdown>
+ <button type="button" class="btn btn-default dropdown-toggle">
+ <span style="padding-right: 5px;">{{getPrefDefaultSelectedName}}</span>
+ <span class="caret"></span>
+ </button>
+ <ul class="dropdown-menu">
+ <li ng-repeat="org in orgList" ng-hide="hiddenTest(org.id)">
+ <a href ng-click="prefOrgDefaultChanged(org)" a-disabled="disableTest(org.id)"
+ style="padding-left: {{org.depth * 10 + 5}}px">
+ {{org.shortname}}
+ </a>
+ </li>
+ </ul>
+ </div>
+ </div> <!-- col -->
+ </div> <!-- row -->
+
+ <div class="row">
+ <div class="col-md-6">
+ <h3>Default Advanced Search Pane</h3>
+ <p>Advanced search has secondary panes for Numeric and MARC Expert searching. You
+ can change which one is loaded by default when opening a new catalog window here.</p>
+
+ <div class="btn-group " dropdown>
+ <button type="button" class="btn btn-default dropdown-toggle" ng-model ="selectedPane">
+ <span style="padding-right: 5px;">{{getPrefDefaultSelectedPane}}</span>
+ <span class="caret"></span>
+ </button>
+ <ul class="dropdown-menu">
+ <li ng-repeat="pane in paneList" value= "{{pane}}" >
+ <a href ng-click="prefPaneDefaultChanged(pane)" >
+ {{pane}}
+ </a>
+ </li>
+ </ul>
+ </div>
+
+ </div><!-- col -->
+ </div><!-- row -->
+
+ <br>
+ <div>
+ <button class="btn btn-default" ng-click="setDefaultLibs() ">
+ [% l('Save') %]
+ </button>
+ </div>
+</div><!-- container -->
+
</div>
</div>
</div>
+
+ <div class="row new-entry">
+ <div class="col-md-6">
+ <span class="glyphicon glyphicon-search"></span>
+ <a target="self" href="./admin/workstation/search/prefs">
+ [% l('Set Search Preferences') %]
+ </a>
+ </div>
+ </div>
<div class="row new-entry">
<div class="col-md-6">
<div class="panel-title text-center">[% l('Item Search and Cataloging') %]</div>
</div>
<div class="panel-body">
+ <div>
+ <form action="/eg/opac/results" method="get">
+ <input type="search" alt="Catalog Search" name="query"
+ placeholder="Search catalog for..."/>
+ <input id="none" type="submit" value="Search">
+ </form>
+ </div>
<div>
<img src="/xul/server/skin/media/images/portal/bucket.png"/>
<a target="_self" href="./cat/bucket/record/">[% l('Record Buckets') %]</a>
<img src="/xul/server/skin/media/images/portal/bucket.png"/>
<a target="_self" href="./cat/bucket/copy/">[% l('Copy Buckets') %]</a>
</div>
+ <div>
+ <form action="/eg/opac/results" method="get">
+ <input type="search" alt="Catalog Search" maxlength="200"
+ size="20" name="query"
+ placeholder="Search catalog for..." />
+ <input id="search-submit-go" type="submit" value="Search"
+ title="Search" class="opac-button" onclick="setTimeout
+ (function(){$("search-submit-spinner")
+ .className=""; $("search-submit-go")
+ .className="hidden"}, 2000)">
+ </form>
+ </div>
</div>
</div>
</div>
controller: 'StoredPrefsCtrl',
resolve : resolver
});
+
+ $routeProvider.when('/admin/workstation/search/prefs', {
+ templateUrl: './admin/workstation/t_search_prefs',
+ controller: 'SearchPrefsCtrl',
+ resolve : resolver
+ });
// default page
var allWorkstations = [];
var permMap = {};
$scope.contextOrg = egCore.org.get(egCore.auth.user().ws_ou());
-
egCore.perm.hasPermAt('REGISTER_WORKSTATION', true)
.then(function(orgList) {
// fetch the stored WS info
egCore.hatch.getItem('eg.workstation.all')
.then(function(all) {
- allWorkstations = all || [];
+ allWorkstations = all || [];
$scope.workstations =
allWorkstations.map(function(w) { return w.name });
return egCore.hatch.getItem('eg.workstation.default');
'eg.hatch.url', $scope.hatchURL);
}
}])
+/*
+ * Search Preferences Controller
+ */
+.controller('SearchPrefsCtrl',
+ ['$scope','$window','$location', 'egCore', 'egOrg','egConfirmDialog', 'egAuth',
+function($scope , $window , $location, egCore, egOrg, egConfirmDialog, egAuth) {
+ console.log('SearchPrefsCtrl');
+ $scope.orgList = egOrg.list().map(function(org) {
+ return {
+ id : org.id(),
+ shortname : org.shortname(),
+ depth : org.ou_type().depth()
+ }
+ });
+
+ $scope.paneList = ['Advanced', 'Numeric', 'Expert'];
+ var preferredPane;
+
+ egCore.hatch.getItem('eg.pref.lib.default')
+ .then(function(prefDef) {
+ if (prefDef == undefined) {
+ egCore.hatch.setItem(
+ 'eg.pref.lib.default', $scope.orgList[0]);
+ prefDef = $scope.orgList[0].shortname;
+ }
+ //This lets our dropdown auto-select our default preferred lib.
+ $scope.selectedPrefOrg = prefDef;
+ $scope.getPrefDefaultSelectedName = getSelectedName($scope.selectedPrefOrg.shortname);
+ });
+
+ egCore.hatch.getItem('eg.adv.pane.default')
+ .then(function(prefPane) {
+ if (prefPane == undefined) {
+ egCore.hatch.setItem(
+ 'eg.adv.pane.default', 'advanced');
+ preferredPane = 'Advanced';
+ prefPane = 'advanced';
+ }
+ //This lets our dropdown auto-select our default pane.
+ switch(prefPane) {
+ case 'advanced':
+ $scope.selectedPane = 'Advanced';
+ break;
+ case 'numeric':
+ $scope.selectedPane = 'Numeric';
+ break;
+ case 'expert':
+ $scope.selectedPane = 'Expert'
+ break;
+ default:
+ $scope.selectedPane = 'Advanced';
+ }
+ $scope.getPrefDefaultSelectedPane = getSelectedName($scope.selectedPane);
+ });
+
+
+ egCore.hatch.getItem('eg.search.lib.default')
+ .then(function(def) {
+ if (def == undefined) {
+ egCore.hatch.setItem(
+ 'eg.search.lib.default', $scope.orgList[0]);
+ def = $scope.orgList[0].shortname;
+ }
+ //This lets our dropdown auto-select our default search lib.
+ $scope.selectedOrg = def;
+ $scope.getDefaultSelectedName = getSelectedName($scope.selectedOrg.shortname);
+ });
+
+ $scope.orgDefaultChanged = function(org) {
+ $scope.selectedOrg = org;
+ $scope.getDefaultSelectedName = $scope.selectedOrg.shortname;
+ if ($scope.onchange) $scope.onchange($scope.getDefaultSelectedName);
+ }
+
+ $scope.prefOrgDefaultChanged = function(org) {
+ $scope.selectedPrefOrg = org;
+ $scope.getPrefDefaultSelectedName = $scope.selectedPrefOrg.shortname;
+ if ($scope.onchange) $scope.onchange($scope.getPrefDefaultSelectedName);
+ }
+
+ $scope.prefPaneDefaultChanged = function(pane) {
+ $scope.selectedPane = pane;
+ $scope.getPrefDefaultSelectedPane = $scope.selectedPane;
+ if ($scope.onchange) $scope.onchange($scope.getPrefDefaultSelectedName);
+ }
+
+ var getSelectedName = function(prefOrg) {
+ if (prefOrg) {
+ return prefOrg;
+ } else {
+ return $scope.orgList[0].shortname;
+ }
+ }
+
+ $scope.setDefaultLibs = function() {
+ if($scope.selectedOrg.shortname){
+ setDefaultSearchLib();
+ }
+ if($scope.selectedPrefOrg.shortname ){
+ setDefaultPrefLib();
+ }
+ if($scope.selectedPane ){
+ setDefaultPrefPane();
+ }
+ }
+
+ function setDefaultSearchLib() {
+ if($scope.selectedOrg){
+ egCore.hatch.setItem(
+ 'eg.search.lib.default', ($scope.selectedOrg))
+ }
+ }
+
+ function setDefaultPrefLib() {
+ if($scope.selectedPrefOrg ) {
+ egCore.hatch.setItem(
+ 'eg.pref.lib.default', $scope.selectedPrefOrg)
+ }
+ }
+
+ function setDefaultPrefPane() {
+ if($scope.selectedPane) {
+ switch($scope.selectedPane) {
+ case 'Advanced':
+ preferredPane = 'advanced';
+ break;
+ case 'Numeric':
+ preferredPane = 'numeric';
+ break;
+ case 'Expert':
+ preferredPane = 'expert';
+ break;
+ default:
+ preferredPane = 'advanced';
+ }
+ egCore.hatch.setItem(
+ 'eg.adv.pane.default', preferredPane)
+ }
+ }
+
+ // ---------------------
+ // Hatch Configs
+ $scope.hatchURL = egCore.hatch.hatchURL();
+ $scope.hatchRequired =
+ egCore.hatch.getLocalItem('eg.hatch.required');
+
+ $scope.updateHatchRequired = function() {
+ egCore.hatch.setLocalItem(
+ 'eg.hatch.required', $scope.hatchRequired);
+ }
+
+ $scope.updateHatchURL = function() {
+ egCore.hatch.setLocalItem(
+ 'eg.hatch.url', $scope.hatchURL);
+ }
+
+}])
.controller('PrintConfigCtrl',
['$scope','egCore',
if ($scope.catalog_url) return;
var url = $location.absUrl().replace(/\/staff.*/, '/opac/advanced');
+ var default_search_library = egCore.hatch.getLocalItem('eg.search.lib.default');
+ var preferred_search_library = egCore.hatch.getLocalItem('eg.pref.lib.default');
+ var default_adv_pane = egCore.hatch.getLocalItem('eg.adv.pane.default');
+
+ if (default_search_library.id) {
+ url += '?locg=' + default_search_library.id;
+ }
+
+ if (preferred_search_library.id) {
+ url += '&plib=' + preferred_search_library.id;
+ }
+
+ if (default_adv_pane) {
+ url += '&pane=' + default_adv_pane;
+ }
// A record ID in the path indicates a request for the record-
// specific page.
coArgs, {title : $scope.selectedNcType()}
);
}
+ $scope.args.barcode=' ';
}
function performCheckout(method, args, data) {