import { GridDataFiltered } from "./GridDataFiltered.js";
import { PopupRenderer } from "../../map/popup/PopupRenderer.js";
export { LightboxData }
/**
* Class representing lightbox data.
*/
class LightboxData extends GridDataFiltered {
/**
* Create a lightbox data object.
* @param {Object} galleryConfigDict - Gallery configuration dictionary.
*/
constructor(galleryConfigDict) {
super(galleryConfigDict)
}
/**
* Get the shown position of an item inside the lightbox by index.
* @param {Number} index - Data index.
* @returns Promise containing the gallery index.
*/
shownItemPosition(index) {
return this.galleryItems.slice(0, index).reduce((acc, curr, index) => {
if (curr != null && 'numItemsOnSlide' in curr)
return acc + curr['numItemsOnSlide']
return acc + 1
}, 1)
}
/**
* Based on a buffer for adjacent items, check if an item is completely loaded.
* @param {Number} index - Item index.
* @param {Array} bufferSize - Number of previous and subsequent items, that should be checked too.
* @returns True or false, depending on whether the condition is met.
*/
isItemCompletelyLoaded(index, bufferSize = [0, 0]) {
const [bufferIndices, isBufferItemLoadedList] = this._getBufferInfo(index, bufferSize);
return isBufferItemLoadedList.every(item => item === true)
}
/**
* Based on a buffer for adjacent items, get an lightbox data item.
* @param {Number} indexC - Item index. If negative, reverse is activated.
* @param {Array} bufferSize - Adjacent items that should be loaded too.
* @returns Promise containing the item and its index.
*/
getItem(indexC, bufferSize = [0, 0]) {
const reversed = indexC < 0 ? true : false;
const indexP = this._getGalleryItemIndex(indexC);
let [startIndexP, count] = this._bufferHelper(indexP, bufferSize);
const [indicesLeftFromStartIndex,] = this._getBufferInfo(indexC, [bufferSize[0], 0]);
const observeShift = indicesLeftFromStartIndex.includes(startIndexP);
if (count != 0) {
startIndexP = this.gallerySourceIndices.length == 0 ? indexP : startIndexP;
return this.loadItems(startIndexP, count, reversed).then((updatedIndexP) => {
let newIndexC = indexP;
if (observeShift) {
const indexShift = startIndexP - updatedIndexP;
newIndexC = indexP - indexShift;
if (reversed && newIndexC > 0)
newIndexC = newIndexC - this.galleryItemAmount;
}
return this.getItem(newIndexC, bufferSize)
})
}
else {
return Promise.resolve([this.galleryItems.at(indexC), this._getGalleryItemIndex(indexC)])
}
}
/**
* Get the sidebar template.
* @returns Promise containing the sidebar template.
*/
getSidebarTemplate() {
if (this.metadataTemplate)
return Promise.resolve(this.metadataTemplate)
return PopupRenderer.fetchTemplate(this.adapter.metadataTemplateUrl)
}
/**
* Get the share link for a specific item based on the index.
* @param {Number} index - Item index.
* @returns {String|undefined} URL of the gallery site containing the shared item identifier as query parameter.
*/
getShareLink(index) {
const shareID = this.galleryItems[index]?.['pid'];
if (!shareID)
return undefined
const searchParams = new URLSearchParams(window.location.search)
searchParams.set("shareID", shareID);
const shareLink = window.location.origin + window.location.pathname + '?' + decodeURIComponent(searchParams.toString());
return shareLink
}
}