Skip to content

Commit 669dd97

Browse files
[imageGalleryNavigation] Use filter/sort from Gallery page. (#620)
1 parent 3257ca9 commit 669dd97

File tree

2 files changed

+76
-8
lines changed

2 files changed

+76
-8
lines changed

plugins/imageGalleryNavigation/imageGalleryNavigation.js

Lines changed: 75 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,24 @@
11
(async () => {
22
const localStorageGalleryKey = "imageGalleryNavigation-GalleryID";
3+
const localStorageGalleryParams = "imageGalleryNavigation-GalleryParams";
4+
5+
const defaultSearchParams = new URLSearchParams({
6+
sortby: "title",
7+
sortdir: "asc",
8+
});
39

410
// In order to handle scenarios where an image is in multiple galleries, capture ID of gallery the user is navigating from.
511
// If user navigates directly to an image URL and image is in multiple galleries, we will just use the first gallery in list.
612
// This may break if user jumps around in browser history, in which case we will fall back to basic scenario of assuming first gallery in list.
713
async function setupGalleryImageLinks() {
814
document.querySelectorAll("a[href*='/images/']").forEach(function (link) {
915
link.addEventListener("click", () => {
16+
// Parse Gallery URL.
1017
var galleryID = window.location.pathname.split("/")[2];
18+
19+
// Save Gallery Info.
1120
localStorage.setItem(localStorageGalleryKey, galleryID);
21+
localStorage.setItem(localStorageGalleryParams, window.location.search);
1222
});
1323
});
1424
}
@@ -22,17 +32,29 @@
2232
if (imageGalleries != null && imageGalleries.length > 0) {
2333
// Get first entry in galleries list.
2434
var galleryID = imageGalleries[0];
35+
var galleryParams = defaultSearchParams;
2536

2637
// Check if there is a saved gallery ID and it is in gallery list. If true, use saved ID.
2738
var savedGalleryId = localStorage.getItem(localStorageGalleryKey);
39+
var savedGalleryParamsStr = localStorage.getItem(
40+
localStorageGalleryParams
41+
);
42+
var savedGalleryParams = savedGalleryParamsStr
43+
? new URLSearchParams(savedGalleryParamsStr)
44+
: defaultSearchParams;
2845
if (savedGalleryId != null && imageGalleries.includes(savedGalleryId)) {
2946
galleryID = savedGalleryId;
47+
48+
if (savedGalleryParams != null) {
49+
galleryParams = savedGalleryParams;
50+
}
3051
} else {
3152
localStorage.setItem(localStorageGalleryKey, galleryID);
53+
localStorage.setItem(localStorageGalleryParams, null);
3254
}
3355

3456
// Get gallery image list.
35-
var galleryImages = await findGalleryImages(galleryID);
57+
var galleryImages = await findGalleryImages(galleryID, galleryParams);
3658
var totalImageCount = galleryImages.length;
3759
var currentImageIndex = galleryImages.indexOf(imageID);
3860
var nextImageID =
@@ -113,7 +135,6 @@
113135

114136
function redirectToImage(imageID) {
115137
const baseImagesPath = "/images/";
116-
// window.location.href = `${baseImagesPath}${imageID}`;
117138
window.location.replace(`${baseImagesPath}${imageID}`);
118139
}
119140

@@ -134,6 +155,55 @@
134155
return ((index % arrayLength) + arrayLength) % arrayLength;
135156
}
136157

158+
function getFindFilter(searchParams) {
159+
var findFilter = {
160+
per_page: -1,
161+
sort: searchParams.has("sortby") ? searchParams.get("sortby") : "title",
162+
direction: searchParams.has("sortdir")
163+
? searchParams.get("sortdir").toUpperCase()
164+
: "ASC",
165+
};
166+
167+
return findFilter;
168+
}
169+
170+
function getImageFilter(galleryID, searchParams) {
171+
var imageFilter = {
172+
galleries: { value: galleryID, modifier: "INCLUDES_ALL" },
173+
};
174+
175+
if (searchParams.has("c")) {
176+
searchParams.getAll("c").forEach((cStr) => {
177+
// Parse filter condition string.
178+
cStr = cStr.replaceAll("(", "{").replaceAll(")", "}");
179+
cObj = JSON.parse(cStr);
180+
181+
// Init filter type field.
182+
imageFilter[cObj.type] = {};
183+
184+
// Get all keys (except for "type").
185+
var keys = Object.keys(cObj);
186+
keys.splice(keys.indexOf("type"), 1);
187+
188+
// Add all filter data.
189+
keys.forEach((keyName) => {
190+
if (typeof cObj[keyName] === "object") {
191+
// Special parsing for object type "value" fields (used where there's possibly a value and value2)
192+
var keys2 = Object.keys(cObj[keyName]);
193+
keys2.forEach((keyName2) => {
194+
imageFilter[cObj.type][keyName2] = cObj[keyName][keyName2];
195+
});
196+
} else {
197+
imageFilter[cObj.type][keyName] = cObj[keyName];
198+
}
199+
});
200+
});
201+
}
202+
203+
console.log(imageFilter);
204+
return imageFilter;
205+
}
206+
137207
// *** GQL Calls ***
138208

139209
// Find Image by ID
@@ -148,11 +218,9 @@
148218

149219
// Find Images by Gallery ID
150220
// Return Images list (id)
151-
async function findGalleryImages(galleryID) {
152-
const imageFilter = {
153-
galleries: { value: galleryID, modifier: "INCLUDES_ALL" },
154-
};
155-
const findFilter = { per_page: -1, sort: "title" };
221+
async function findGalleryImages(galleryID, galleryParams) {
222+
const imageFilter = getImageFilter(galleryID, galleryParams);
223+
const findFilter = getFindFilter(galleryParams);
156224
const variables = { image_filter: imageFilter, filter: findFilter };
157225
const query = `query ($image_filter: ImageFilterType!, $filter: FindFilterType!) { findImages(image_filter: $image_filter, filter: $filter) { images { id } } }`;
158226
return await csLib

plugins/imageGalleryNavigation/imageGalleryNavigation.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
name: imageGalleryNavigation
22
# requires: CommunityScriptsUILibrary
33
description: This plugin adds features for navigating between images within a Gallery from the Image details page.
4-
version: 0.1
4+
version: 0.2
55
ui:
66
requires:
77
- CommunityScriptsUILibrary

0 commit comments

Comments
 (0)