Skip to content

Commit 1674912

Browse files
Merge pull request #160 from AlexanderBlanchardAC/DIS-219-Filter-Holds
Filter Holds
2 parents 7c6620e + cbf7960 commit 1674912

File tree

5 files changed

+243
-7
lines changed

5 files changed

+243
-7
lines changed

code/web/interface/themes/responsive/MyAccount/holdsList.tpl

+17
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,21 @@
3232
{/foreach}
3333
</select>
3434

35+
{if count($linkedUsers) > 0}
36+
<div id="linkedUsersDropdownContainer" class="form-group d-flex align-items-center mt-2 mt-md-0 ms-md-3">
37+
<label for="linkedUsersDropdown" class="control-label me-2 mb-0">{translate text="Linked Users" isPublicFacing=true}&nbsp;</label>
38+
<select id="linkedUsersDropdown" class="form-control me-2 mt-2 mt-md-0" name="linkedUserIds[]" multiple="multiple" size="2">
39+
<option value="" {if empty($selectedUsers)}selected{/if}>None</option>
40+
{foreach from=$linkedUsers item=user}
41+
<option value="{$user->id}"{if in_array($user->id, $selectedUsers)} selected="selected"{/if}>{$user->displayName}</option>
42+
{/foreach}
43+
</select>
44+
<button type="button" class="btn btn-primary mt-2 mt-md-0" onclick="AspenDiscovery.Account.filterOutLinkedUsers();">
45+
{translate text="Hide Users" isPublicFacing=true}
46+
</button>
47+
</div>
48+
{/if}
49+
3550
{if empty($hideCoversFormDisplayed)}
3651
{* Display the Hide Covers switch above the first section that has holds; and only display it once *}
3752
<label for="hideCovers_{$source}" class="control-label checkbox pull-right"> {translate text="Hide Covers" isPublicFacing=true} <input id="hideCovers_{$source}" type="checkbox" onclick="AspenDiscovery.Account.loadHolds('{$source}', $('#availableHoldSort_{$source} option:selected').val(), $('#unavailableHoldSort option:selected').val(), !$('#hideCovers_{$source}').is(':checked'));" {if $showCovers == false}checked="checked"{/if}></label>
@@ -84,6 +99,8 @@
8499
<a href="#" onclick="AspenDiscovery.Account.confirmThawHoldSelected()" class="btn btn-sm btn-default">{translate text="Thaw Selected" isPublicFacing=true}</a>
85100
<a href="#" onclick="AspenDiscovery.Account.confirmThawHoldAll('{$userId}')" class="btn btn-sm btn-default">{translate text="Thaw All" isPublicFacing=true}</a>
86101
{/if}
102+
<a href="#" onclick="AspenDiscovery.Account.displayOnlySelectedHolds()" class="btn btn-sm btn-default">{translate text="Display Selected" isPublicFacing=true}</a>
103+
<a href="#" onclick="AspenDiscovery.Account.clearDisplayOnlySelectedHolds()" class="btn btn-sm btn-default">{translate text="Display All" isPublicFacing=true}</a>
87104
</div>
88105
<div class="btn-group">
89106
<input type="hidden" name="withSelectedAction" value="">

code/web/interface/themes/responsive/js/aspen.js

+57-2
Original file line numberDiff line numberDiff line change
@@ -5775,9 +5775,18 @@ AspenDiscovery.Account = (function () {
57755775
return false;
57765776
},
57775777

5778-
loadHolds: function (source, availableHoldSort, unavailableHoldSort, showCovers) {
5778+
loadHolds: function (source, availableHoldSort, unavailableHoldSort, showCovers, selectedUsers, selectedTitles) {
57795779
AspenDiscovery.Account.currentHoldSource = source;
57805780
var url = Globals.path + "/MyAccount/AJAX?method=getHolds&source=" + source;
5781+
5782+
if (selectedUsers && selectedUsers.length > 0) {
5783+
url += "&selectedUsers=" + selectedUsers.join(',');
5784+
}
5785+
5786+
if (selectedTitles !== undefined) {
5787+
url += "&selectedHolds=" + encodeURIComponent(JSON.stringify(selectedTitles));
5788+
}
5789+
57815790
if (availableHoldSort !== undefined) {
57825791
url += "&availableHoldSort=" + availableHoldSort;
57835792
}
@@ -5792,7 +5801,9 @@ AspenDiscovery.Account = (function () {
57925801
source: source,
57935802
availableHoldSort: availableHoldSort,
57945803
unavailableHoldSort: unavailableHoldSort,
5795-
showCovers: showCovers
5804+
showCovers: showCovers,
5805+
selectedUsers: selectedUsers,
5806+
selectedTitles: selectedTitles
57965807
};
57975808
var newUrl = AspenDiscovery.buildUrl(document.location.origin + document.location.pathname, 'source', source);
57985809
if (document.location.href) {
@@ -6830,6 +6841,50 @@ AspenDiscovery.Account = (function () {
68306841
return queryString;
68316842
},
68326843

6844+
filterOutLinkedUsers: function () {
6845+
var selectedUsers = $('#linkedUsersDropdown').val();
6846+
if (selectedUsers && selectedUsers.length > 0) {
6847+
sessionStorage.setItem('selectedUsers', JSON.stringify(selectedUsers));
6848+
var availableHoldSort = $('#availableHoldSort_' + AspenDiscovery.Account.currentHoldSource).val();
6849+
var unavailableHoldSort = $('#unavailableHoldSort_' + AspenDiscovery.Account.currentHoldSource).val();
6850+
var showCovers = $('#showCovers').prop('checked');
6851+
AspenDiscovery.Account.loadHolds(AspenDiscovery.Account.currentHoldSource, availableHoldSort, unavailableHoldSort, showCovers, selectedUsers, undefined);
6852+
}
6853+
},
6854+
6855+
displayOnlySelectedHolds: function () {
6856+
var selectedTitles = AspenDiscovery.getSelectedTitles();
6857+
6858+
if (selectedTitles) {
6859+
var availableHoldSort = $('#availableHoldSort_' + AspenDiscovery.Account.currentHoldSource).val();
6860+
var unavailableHoldSort = $('#unavailableHoldSort_' + AspenDiscovery.Account.currentHoldSource).val();
6861+
var showCovers = $('#showCovers').prop('checked');
6862+
6863+
var selectedUsers = sessionStorage.getItem('selectedUsers');
6864+
if (selectedUsers) {
6865+
selectedUsers = JSON.parse(selectedUsers);
6866+
} else {
6867+
selectedUsers = [];
6868+
}
6869+
AspenDiscovery.Account.loadHolds(AspenDiscovery.Account.currentHoldSource, availableHoldSort, unavailableHoldSort, showCovers, selectedUsers, selectedTitles);
6870+
}
6871+
6872+
},
6873+
6874+
clearDisplayOnlySelectedHolds: function () {
6875+
var availableHoldSort = $('#availableHoldSort_' + AspenDiscovery.Account.currentHoldSource).val();
6876+
var unavailableHoldSort = $('#unavailableHoldSort_' + AspenDiscovery.Account.currentHoldSource).val();
6877+
var showCovers = $('#showCovers').prop('checked');
6878+
6879+
var selectedUsers = sessionStorage.getItem('selectedUsers');
6880+
if (selectedUsers) {
6881+
selectedUsers = JSON.parse(selectedUsers);
6882+
} else {
6883+
selectedUsers = [];
6884+
}
6885+
AspenDiscovery.Account.loadHolds(AspenDiscovery.Account.currentHoldSource, availableHoldSort, unavailableHoldSort, showCovers, selectedUsers, []);
6886+
},
6887+
68336888
saveSearch: function (searchId) {
68346889
if (!Globals.loggedIn) {
68356890
AspenDiscovery.Account.ajaxLogin(null, function () {

code/web/interface/themes/responsive/js/aspen/account.js

+57-2
Original file line numberDiff line numberDiff line change
@@ -256,9 +256,18 @@ AspenDiscovery.Account = (function () {
256256
return false;
257257
},
258258

259-
loadHolds: function (source, availableHoldSort, unavailableHoldSort, showCovers) {
259+
loadHolds: function (source, availableHoldSort, unavailableHoldSort, showCovers, selectedUsers, selectedTitles) {
260260
AspenDiscovery.Account.currentHoldSource = source;
261261
var url = Globals.path + "/MyAccount/AJAX?method=getHolds&source=" + source;
262+
263+
if (selectedUsers && selectedUsers.length > 0) {
264+
url += "&selectedUsers=" + selectedUsers.join(',');
265+
}
266+
267+
if (selectedTitles !== undefined) {
268+
url += "&selectedHolds=" + encodeURIComponent(JSON.stringify(selectedTitles));
269+
}
270+
262271
if (availableHoldSort !== undefined) {
263272
url += "&availableHoldSort=" + availableHoldSort;
264273
}
@@ -273,7 +282,9 @@ AspenDiscovery.Account = (function () {
273282
source: source,
274283
availableHoldSort: availableHoldSort,
275284
unavailableHoldSort: unavailableHoldSort,
276-
showCovers: showCovers
285+
showCovers: showCovers,
286+
selectedUsers: selectedUsers,
287+
selectedTitles: selectedTitles
277288
};
278289
var newUrl = AspenDiscovery.buildUrl(document.location.origin + document.location.pathname, 'source', source);
279290
if (document.location.href) {
@@ -1311,6 +1322,50 @@ AspenDiscovery.Account = (function () {
13111322
return queryString;
13121323
},
13131324

1325+
filterOutLinkedUsers: function () {
1326+
var selectedUsers = $('#linkedUsersDropdown').val();
1327+
if (selectedUsers && selectedUsers.length > 0) {
1328+
sessionStorage.setItem('selectedUsers', JSON.stringify(selectedUsers));
1329+
var availableHoldSort = $('#availableHoldSort_' + AspenDiscovery.Account.currentHoldSource).val();
1330+
var unavailableHoldSort = $('#unavailableHoldSort_' + AspenDiscovery.Account.currentHoldSource).val();
1331+
var showCovers = $('#showCovers').prop('checked');
1332+
AspenDiscovery.Account.loadHolds(AspenDiscovery.Account.currentHoldSource, availableHoldSort, unavailableHoldSort, showCovers, selectedUsers, undefined);
1333+
}
1334+
},
1335+
1336+
displayOnlySelectedHolds: function () {
1337+
var selectedTitles = AspenDiscovery.getSelectedTitles();
1338+
1339+
if (selectedTitles) {
1340+
var availableHoldSort = $('#availableHoldSort_' + AspenDiscovery.Account.currentHoldSource).val();
1341+
var unavailableHoldSort = $('#unavailableHoldSort_' + AspenDiscovery.Account.currentHoldSource).val();
1342+
var showCovers = $('#showCovers').prop('checked');
1343+
1344+
var selectedUsers = sessionStorage.getItem('selectedUsers');
1345+
if (selectedUsers) {
1346+
selectedUsers = JSON.parse(selectedUsers);
1347+
} else {
1348+
selectedUsers = [];
1349+
}
1350+
AspenDiscovery.Account.loadHolds(AspenDiscovery.Account.currentHoldSource, availableHoldSort, unavailableHoldSort, showCovers, selectedUsers, selectedTitles);
1351+
}
1352+
1353+
},
1354+
1355+
clearDisplayOnlySelectedHolds: function () {
1356+
var availableHoldSort = $('#availableHoldSort_' + AspenDiscovery.Account.currentHoldSource).val();
1357+
var unavailableHoldSort = $('#unavailableHoldSort_' + AspenDiscovery.Account.currentHoldSource).val();
1358+
var showCovers = $('#showCovers').prop('checked');
1359+
1360+
var selectedUsers = sessionStorage.getItem('selectedUsers');
1361+
if (selectedUsers) {
1362+
selectedUsers = JSON.parse(selectedUsers);
1363+
} else {
1364+
selectedUsers = [];
1365+
}
1366+
AspenDiscovery.Account.loadHolds(AspenDiscovery.Account.currentHoldSource, availableHoldSort, unavailableHoldSort, showCovers, selectedUsers, []);
1367+
},
1368+
13141369
saveSearch: function (searchId) {
13151370
if (!Globals.loggedIn) {
13161371
AspenDiscovery.Account.ajaxLogin(null, function () {

code/web/release_notes/25.02.00.MD

+3
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,9 @@
125125
- Eliminate the time portion of display dates from Aspen Open Archives search results (DIS-242) (*JStaub*)
126126

127127
//alexander
128+
### Holds Updates
129+
- Added the ability for users to filter the display by removing the holds of selected linked users and by filtering the display by selected holds. (*AB*)
130+
- Export holds will take account of the new filters, exporting only the holds on the screen. (*AB*)
128131
### Indexing Updates
129132
- Add the option of only indexing records by the 856 field if the record does not have eContent items. (DIS-196) (*AB*)
130133

code/web/services/MyAccount/AJAX.php

+109-3
Original file line numberDiff line numberDiff line change
@@ -3081,7 +3081,10 @@ public function exportHolds() {
30813081
$selectedUnavailableSortOption = ($showPosition ? 'position' : 'title');
30823082
}
30833083

3084-
$allHolds = $user->getHolds(true, $selectedUnavailableSortOption, $selectedAvailableSortOption, $source);
3084+
$selectedHolds = $this->setFilterSelectedHolds();
3085+
$selectedUsers = $this->setFilterLinkedUsers();
3086+
3087+
$allHolds = $this->filterHolds($user->getHolds(true, $selectedUnavailableSortOption, $selectedAvailableSortOption, $source), $selectedUsers, $selectedHolds);
30853088

30863089
$showDateWhenSuspending = $user->showDateWhenSuspending();
30873090

@@ -3550,6 +3553,63 @@ public function getCheckouts(): array {
35503553
return $result;
35513554
}
35523555

3556+
public function filterHolds(array $allHolds, array $selectedUsers, $selectedHolds): array {
3557+
if (!empty($selectedHolds) && !is_array($selectedHolds)) {
3558+
$selectedHoldsArray = [];
3559+
parse_str($selectedHolds, $parsedHolds);
3560+
3561+
if (isset($parsedHolds['selected'])) {
3562+
foreach ($parsedHolds['selected'] as $holdKey => $value) {
3563+
if (preg_match('/(\d+)\|(\d+)\|/', $holdKey, $matches)) {
3564+
$selectedHoldsArray[] = [
3565+
'userId' => (int)$matches[1],
3566+
'recordId' => (int)$matches[2],
3567+
];
3568+
}
3569+
}
3570+
}
3571+
$selectedHolds = $selectedHoldsArray;
3572+
}
3573+
3574+
$filteredHolds = [
3575+
'available' => [],
3576+
'unavailable' => [],
3577+
];
3578+
3579+
foreach (['available', 'unavailable'] as $type) {
3580+
foreach ($allHolds[$type] as $key => $hold) {
3581+
$includeHold = true;
3582+
3583+
if (!empty($selectedUsers) && in_array($hold->userId, $selectedUsers)) {
3584+
$includeHold = false;
3585+
}
3586+
3587+
if (!empty($selectedHolds)) {
3588+
$matchFound = false;
3589+
foreach ($selectedHolds as $selectedHold) {
3590+
3591+
$holdRecordId = intval(trim($hold->recordId));
3592+
$selectedHoldRecordId = intval(trim($selectedHold['recordId']));
3593+
$holdUserId = intval(trim($hold->userId));
3594+
$selectedHoldUserId = intval(trim($selectedHold['userId']));
3595+
if ($holdRecordId == $selectedHoldRecordId && $holdUserId == $selectedHoldUserId){
3596+
$matchFound = true;
3597+
break;
3598+
}
3599+
}
3600+
if (!$matchFound) {
3601+
$includeHold = false;
3602+
}
3603+
}
3604+
3605+
if ($includeHold) {
3606+
$filteredHolds[$type][$key] = $hold;
3607+
}
3608+
}
3609+
}
3610+
return $filteredHolds;
3611+
}
3612+
35533613
/** @noinspection PhpUnused */
35543614
public function getHolds(): array {
35553615
global $interface;
@@ -3602,6 +3662,12 @@ public function getHolds(): array {
36023662
$showPlacedColumn = $user->showHoldPlacedDate();
36033663
$interface->assign('showPlacedColumn', $showPlacedColumn);
36043664

3665+
$selectedUsers = $this->setFilterLinkedUsers();
3666+
$interface->assign('selectedUsers', $selectedUsers);
3667+
3668+
$selectedHolds = $this->setFilterSelectedHolds();
3669+
$interface->assign('selectedHolds', $selectedHolds);
3670+
36053671
$location = new Location();
36063672
$pickupBranches = $location->getPickupBranches($user);
36073673
$interface->assign('numPickupBranches', count($pickupBranches));
@@ -3634,7 +3700,8 @@ public function getHolds(): array {
36343700
$availableHoldSortOptions['location'] = 'Pickup Location';
36353701
}
36363702

3637-
if (count($user->getLinkedUsers()) > 0) {
3703+
$linkedUsers = $user->getLinkedUsers();
3704+
if (count($linkedUsers) > 0) {
36383705
$unavailableHoldSortOptions['libraryAccount'] = 'Library Account';
36393706
$availableHoldSortOptions['libraryAccount'] = 'Library Account';
36403707
}
@@ -3643,6 +3710,7 @@ public function getHolds(): array {
36433710
'available' => $availableHoldSortOptions,
36443711
'unavailable' => $unavailableHoldSortOptions,
36453712
]);
3713+
$interface->assign('linkedUsers', $linkedUsers);
36463714

36473715
if ($selectedAvailableSortOption == null || !array_key_exists($selectedAvailableSortOption, $availableHoldSortOptions)) {
36483716
$selectedAvailableSortOption = 'expire';
@@ -3664,7 +3732,7 @@ public function getHolds(): array {
36643732
global $offlineMode;
36653733
if (!$offlineMode) {
36663734
if ($user) {
3667-
$allHolds = $user->getHolds(true, $selectedUnavailableSortOption, $selectedAvailableSortOption, $source);
3735+
$allHolds = $this->filterHolds($user->getHolds(true, $selectedUnavailableSortOption, $selectedAvailableSortOption, $source), $selectedUsers, $selectedHolds);
36683736
$interface->assign('recordList', $allHolds);
36693737
}
36703738
}
@@ -3953,6 +4021,44 @@ function setSort($requestParameter, $sortType) {
39534021
return $sort;
39544022
}
39554023

4024+
function setFilterLinkedUsers(): array {
4025+
global $interface;
4026+
$selectedUsers = [];
4027+
if (isset($_REQUEST['selectedUsers'])) {
4028+
$selectedUsers = explode(',', $_REQUEST['selectedUsers']);
4029+
if (isset($_SESSION)) {
4030+
$_SESSION['selectedUsers'] = $selectedUsers;
4031+
}
4032+
} elseif (isset($_SESSION['selectedUsers'])) {
4033+
$selectedUsers = $_SESSION['selectedUsers'];
4034+
}
4035+
$interface->assign('selectedUsers', $selectedUsers);
4036+
4037+
return $selectedUsers;
4038+
}
4039+
4040+
function setFilterSelectedHolds() {
4041+
global $interface;
4042+
$selectedHolds = [];
4043+
4044+
if (isset($_REQUEST['selectedHolds'])) {
4045+
$selectedHolds = json_decode($_REQUEST['selectedHolds'], true);
4046+
4047+
if (isset($_SESSION)) {
4048+
if (empty($selectedHolds)) {
4049+
unset($_SESSION['selectedHolds']);
4050+
} else {
4051+
$_SESSION['selectedHolds'] = $selectedHolds;
4052+
}
4053+
}
4054+
} elseif (isset($_SESSION['selectedHolds'])) {
4055+
$selectedHolds = $_SESSION['selectedHolds'];
4056+
}
4057+
$interface->assign('selectedHolds', $selectedHolds);
4058+
4059+
return $selectedHolds;
4060+
}
4061+
39564062
/**
39574063
* @param string $selectedSortOption
39584064
* @param Checkout[] $allCheckedOut

0 commit comments

Comments
 (0)