dbf-mirador 4.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +203 -0
- package/README.md +133 -0
- package/dist/CommentSharp-B0J_-jEq.js +325 -0
- package/dist/CommentSharp-B0J_-jEq.js.map +1 -0
- package/dist/FailedImageContext-aQXnWSHN.js +318 -0
- package/dist/FailedImageContext-aQXnWSHN.js.map +1 -0
- package/dist/PluginHook-CFw_6P5c.js +54 -0
- package/dist/PluginHook-CFw_6P5c.js.map +1 -0
- package/dist/WindowCanvasNavigationControls-CUX723BQ.js +242 -0
- package/dist/WindowCanvasNavigationControls-CUX723BQ.js.map +1 -0
- package/dist/action-types-DjIbTE-A.js +74 -0
- package/dist/action-types-DjIbTE-A.js.map +1 -0
- package/dist/canvas-C8oHvXFN.js +41 -0
- package/dist/canvas-C8oHvXFN.js.map +1 -0
- package/dist/canvases-gRqhr-IH.js +3154 -0
- package/dist/canvases-gRqhr-IH.js.map +1 -0
- package/dist/createSvgIcon-Cwt8YPfm.js +2 -0
- package/dist/getters-COus7Mvg.js +2066 -0
- package/dist/getters-COus7Mvg.js.map +1 -0
- package/dist/index.module-CbBRf_R8.js +403 -0
- package/dist/index.module-CbBRf_R8.js.map +1 -0
- package/dist/mirador.es.js +39600 -0
- package/dist/mirador.es.js.map +1 -0
- package/dist/mirador.min.js +334 -0
- package/dist/mirador.min.js.map +1 -0
- package/dist/react-error-boundary.esm-B_pT-oCS.js +67 -0
- package/dist/react-error-boundary.esm-B_pT-oCS.js.map +1 -0
- package/dist/visuallyHidden-DmYvwNdU.js +98 -0
- package/dist/visuallyHidden-DmYvwNdU.js.map +1 -0
- package/dist/window-zelwU7wz.js +138 -0
- package/dist/window-zelwU7wz.js.map +1 -0
- package/package.json +138 -0
- package/src/components/AccessTokenSender.jsx +34 -0
- package/src/components/AnnotationSettings.jsx +31 -0
- package/src/components/AnnotationsOverlay.jsx +328 -0
- package/src/components/App.jsx +34 -0
- package/src/components/AppProviders.jsx +129 -0
- package/src/components/AttributionPanel.jsx +78 -0
- package/src/components/AudioViewer.jsx +39 -0
- package/src/components/BackgroundPluginArea.jsx +9 -0
- package/src/components/Branding.jsx +33 -0
- package/src/components/CanvasAnnotations.jsx +125 -0
- package/src/components/CanvasInfo.jsx +46 -0
- package/src/components/CanvasLayers.jsx +367 -0
- package/src/components/ChangeThemeDialog.jsx +65 -0
- package/src/components/CollapsibleSection.jsx +53 -0
- package/src/components/CollectionDialog.jsx +236 -0
- package/src/components/CollectionInfo.jsx +48 -0
- package/src/components/CompanionArea.jsx +140 -0
- package/src/components/CompanionWindow.jsx +228 -0
- package/src/components/CompanionWindowFactory.jsx +38 -0
- package/src/components/CompanionWindowSection.jsx +11 -0
- package/src/components/CustomPanel.jsx +22 -0
- package/src/components/ErrorContent.jsx +65 -0
- package/src/components/ErrorDialog.jsx +47 -0
- package/src/components/FullScreenButton.jsx +47 -0
- package/src/components/GalleryView.jsx +36 -0
- package/src/components/GalleryViewThumbnail.jsx +160 -0
- package/src/components/IIIFAuthentication.jsx +144 -0
- package/src/components/IIIFDropTarget.jsx +168 -0
- package/src/components/IIIFIFrameCommunication.jsx +45 -0
- package/src/components/IIIFResourceLabel.jsx +26 -0
- package/src/components/IIIFThumbnail.jsx +214 -0
- package/src/components/ImageFailureMessage.jsx +42 -0
- package/src/components/LabelValueMetadata.jsx +46 -0
- package/src/components/LanguageSettings.jsx +46 -0
- package/src/components/LayersPanel.jsx +24 -0
- package/src/components/LocalePicker.jsx +56 -0
- package/src/components/ManifestForm.jsx +79 -0
- package/src/components/ManifestInfo.jsx +67 -0
- package/src/components/ManifestListItem.jsx +209 -0
- package/src/components/ManifestListItemError.jsx +53 -0
- package/src/components/ManifestRelatedLinks.jsx +154 -0
- package/src/components/MinimalWindow.jsx +104 -0
- package/src/components/MiradorMenuButton.jsx +71 -0
- package/src/components/MosaicRenderPreview.jsx +16 -0
- package/src/components/NestedMenu.jsx +42 -0
- package/src/components/NewBrowserWindow.jsx +34 -0
- package/src/components/OpenSeadragonComponent.jsx +258 -0
- package/src/components/OpenSeadragonTileSource.jsx +105 -0
- package/src/components/OpenSeadragonViewer.jsx +161 -0
- package/src/components/PluginHook.jsx +27 -0
- package/src/components/PrimaryWindow.jsx +115 -0
- package/src/components/SanitizedHtml.jsx +37 -0
- package/src/components/ScrollIndicatedDialogContent.jsx +60 -0
- package/src/components/ScrollTo.jsx +61 -0
- package/src/components/SearchHit.jsx +220 -0
- package/src/components/SearchPanel.jsx +80 -0
- package/src/components/SearchPanelControls.jsx +174 -0
- package/src/components/SearchPanelNavigation.jsx +84 -0
- package/src/components/SearchResults.jsx +138 -0
- package/src/components/SelectCollection.jsx +44 -0
- package/src/components/SidebarIndexItem.jsx +11 -0
- package/src/components/SidebarIndexList.jsx +73 -0
- package/src/components/SidebarIndexTableOfContents.jsx +170 -0
- package/src/components/SidebarIndexThumbnail.jsx +22 -0
- package/src/components/TextViewer.jsx +37 -0
- package/src/components/ThumbnailCanvasGrouping.jsx +122 -0
- package/src/components/ThumbnailNavigation.jsx +231 -0
- package/src/components/VideoViewer.jsx +35 -0
- package/src/components/ViewerInfo.jsx +55 -0
- package/src/components/ViewerNavigation.jsx +72 -0
- package/src/components/Window.jsx +150 -0
- package/src/components/WindowAuthenticationBar.jsx +176 -0
- package/src/components/WindowCanvasNavigationControls.jsx +91 -0
- package/src/components/WindowList.jsx +71 -0
- package/src/components/WindowListButton.jsx +57 -0
- package/src/components/WindowSideBar.jsx +48 -0
- package/src/components/WindowSideBarAnnotationsPanel.jsx +51 -0
- package/src/components/WindowSideBarButtons.jsx +151 -0
- package/src/components/WindowSideBarCanvasPanel.jsx +165 -0
- package/src/components/WindowSideBarCollectionPanel.jsx +179 -0
- package/src/components/WindowSideBarInfoPanel.jsx +67 -0
- package/src/components/WindowThumbnailSettings.jsx +130 -0
- package/src/components/WindowTopBar.jsx +125 -0
- package/src/components/WindowTopBarPluginArea.jsx +8 -0
- package/src/components/WindowTopBarPluginMenu.jsx +78 -0
- package/src/components/WindowTopBarTitle.jsx +73 -0
- package/src/components/WindowTopMenu.jsx +81 -0
- package/src/components/WindowTopMenuButton.jsx +49 -0
- package/src/components/WindowViewSettings.jsx +95 -0
- package/src/components/WindowViewer.jsx +26 -0
- package/src/components/Workspace.jsx +124 -0
- package/src/components/WorkspaceAdd.jsx +221 -0
- package/src/components/WorkspaceAddButton.jsx +73 -0
- package/src/components/WorkspaceArea.jsx +66 -0
- package/src/components/WorkspaceControlPanel.jsx +85 -0
- package/src/components/WorkspaceControlPanelButtons.jsx +20 -0
- package/src/components/WorkspaceDialog.jsx +11 -0
- package/src/components/WorkspaceElastic.jsx +88 -0
- package/src/components/WorkspaceElasticWindow.jsx +79 -0
- package/src/components/WorkspaceExport.jsx +99 -0
- package/src/components/WorkspaceImport.jsx +89 -0
- package/src/components/WorkspaceMenu.jsx +126 -0
- package/src/components/WorkspaceMenuButton.jsx +42 -0
- package/src/components/WorkspaceMosaic.jsx +149 -0
- package/src/components/WorkspaceOptionsButton.jsx +35 -0
- package/src/components/WorkspaceOptionsMenu.jsx +112 -0
- package/src/components/WorkspaceSelectionDialog.jsx +165 -0
- package/src/components/ZoomControls.jsx +57 -0
- package/src/components/icons/BookViewIcon.jsx +14 -0
- package/src/components/icons/CanvasIndexIcon.jsx +14 -0
- package/src/components/icons/GalleryViewIcon.jsx +17 -0
- package/src/components/icons/MiradorIcon.jsx +14 -0
- package/src/components/icons/RestoreZoomIcon.jsx +15 -0
- package/src/components/icons/ThumbnailNavigationBottomIcon.jsx +15 -0
- package/src/components/icons/ThumbnailNavigationRightIcon.jsx +16 -0
- package/src/components/icons/WindowMaxIcon.jsx +15 -0
- package/src/components/icons/WindowMinIcon.jsx +15 -0
- package/src/components/icons/WindowOptionsIcon.jsx +16 -0
- package/src/components/icons/WorkspaceTypeElasticIcon.jsx +157 -0
- package/src/components/icons/WorkspaceTypeMosaicIcon.jsx +162 -0
- package/src/components/icons/index.js +27 -0
- package/src/components/index.js +108 -0
- package/src/config/css-ns.js +10 -0
- package/src/config/index.js +2 -0
- package/src/config/settings.js +607 -0
- package/src/containers/AnnotationSettings.js +27 -0
- package/src/containers/AnnotationsOverlay.js +51 -0
- package/src/containers/AppProviders.js +20 -0
- package/src/containers/AttributionPanel.js +20 -0
- package/src/containers/AudioViewer.js +16 -0
- package/src/containers/BackgroundPluginArea.js +4 -0
- package/src/containers/Branding.js +4 -0
- package/src/containers/CanvasAnnotations.js +32 -0
- package/src/containers/CanvasInfo.js +20 -0
- package/src/containers/CanvasLayers.js +25 -0
- package/src/containers/ChangeThemeDialog.js +29 -0
- package/src/containers/CollapsibleSection.js +3 -0
- package/src/containers/CollectionDialog.js +48 -0
- package/src/containers/CollectionInfo.js +29 -0
- package/src/containers/CompanionArea.js +22 -0
- package/src/containers/CompanionWindow.js +40 -0
- package/src/containers/CompanionWindowFactory.js +23 -0
- package/src/containers/CustomPanel.js +13 -0
- package/src/containers/ErrorContent.js +20 -0
- package/src/containers/ErrorDialog.js +28 -0
- package/src/containers/FullScreenButton.js +22 -0
- package/src/containers/GalleryView.js +23 -0
- package/src/containers/GalleryViewThumbnail.js +51 -0
- package/src/containers/IIIFAuthentication.js +86 -0
- package/src/containers/IIIFThumbnail.js +17 -0
- package/src/containers/LabelValueMetadata.js +14 -0
- package/src/containers/LanguageSettings.js +26 -0
- package/src/containers/LayersPanel.js +16 -0
- package/src/containers/LocalePicker.js +3 -0
- package/src/containers/ManifestForm.js +16 -0
- package/src/containers/ManifestInfo.js +29 -0
- package/src/containers/ManifestListItem.js +52 -0
- package/src/containers/ManifestListItemError.js +15 -0
- package/src/containers/ManifestRelatedLinks.js +28 -0
- package/src/containers/MinimalWindow.js +25 -0
- package/src/containers/MiradorMenuButton.js +7 -0
- package/src/containers/MosaicRenderPreview.js +14 -0
- package/src/containers/OpenSeadragonViewer.js +59 -0
- package/src/containers/PrimaryWindow.js +27 -0
- package/src/containers/SanitizedHtml.js +3 -0
- package/src/containers/ScrollIndicatedDialogContent.js +3 -0
- package/src/containers/SearchHit.js +71 -0
- package/src/containers/SearchPanel.js +23 -0
- package/src/containers/SearchPanelControls.js +36 -0
- package/src/containers/SearchPanelNavigation.js +39 -0
- package/src/containers/SearchResults.js +38 -0
- package/src/containers/SelectCollection.js +24 -0
- package/src/containers/SidebarIndexItem.js +8 -0
- package/src/containers/SidebarIndexList.js +28 -0
- package/src/containers/SidebarIndexTableOfContents.js +31 -0
- package/src/containers/SidebarIndexThumbnail.js +18 -0
- package/src/containers/TextViewer.js +19 -0
- package/src/containers/ThumbnailCanvasGrouping.js +29 -0
- package/src/containers/ThumbnailNavigation.js +48 -0
- package/src/containers/VideoViewer.js +16 -0
- package/src/containers/ViewerInfo.js +30 -0
- package/src/containers/ViewerNavigation.js +31 -0
- package/src/containers/Window.js +45 -0
- package/src/containers/WindowAuthenticationBar.js +7 -0
- package/src/containers/WindowCanvasNavigationControls.js +15 -0
- package/src/containers/WindowList.js +30 -0
- package/src/containers/WindowListButton.js +15 -0
- package/src/containers/WindowSideBar.js +20 -0
- package/src/containers/WindowSideBarAnnotationsPanel.js +23 -0
- package/src/containers/WindowSideBarButtons.js +75 -0
- package/src/containers/WindowSideBarCanvasPanel.js +50 -0
- package/src/containers/WindowSideBarCollectionPanel.js +48 -0
- package/src/containers/WindowSideBarInfoPanel.js +35 -0
- package/src/containers/WindowThumbnailSettings.js +31 -0
- package/src/containers/WindowTopBar.js +39 -0
- package/src/containers/WindowTopBarPluginArea.js +8 -0
- package/src/containers/WindowTopBarPluginMenu.js +7 -0
- package/src/containers/WindowTopBarTitle.js +17 -0
- package/src/containers/WindowTopMenu.js +28 -0
- package/src/containers/WindowTopMenuButton.js +7 -0
- package/src/containers/WindowViewSettings.js +30 -0
- package/src/containers/WindowViewer.js +10 -0
- package/src/containers/Workspace.js +36 -0
- package/src/containers/WorkspaceAdd.js +27 -0
- package/src/containers/WorkspaceAddButton.js +30 -0
- package/src/containers/WorkspaceArea.js +21 -0
- package/src/containers/WorkspaceControlPanel.js +10 -0
- package/src/containers/WorkspaceControlPanelButtons.js +7 -0
- package/src/containers/WorkspaceElastic.js +41 -0
- package/src/containers/WorkspaceElasticWindow.js +36 -0
- package/src/containers/WorkspaceExport.js +18 -0
- package/src/containers/WorkspaceImport.js +19 -0
- package/src/containers/WorkspaceMenu.js +30 -0
- package/src/containers/WorkspaceMenuButton.js +10 -0
- package/src/containers/WorkspaceMosaic.js +32 -0
- package/src/containers/WorkspaceOptionsButton.js +7 -0
- package/src/containers/WorkspaceOptionsMenu.js +3 -0
- package/src/containers/WorkspaceSelectionDialog.js +26 -0
- package/src/containers/ZoomControls.js +26 -0
- package/src/containers/index.js +94 -0
- package/src/contexts/FailedImageContext.js +8 -0
- package/src/contexts/FailedImageProvider.jsx +34 -0
- package/src/contexts/FullScreenContext.js +5 -0
- package/src/contexts/LocaleContext.js +5 -0
- package/src/contexts/OpenSeadragonViewerContext.js +5 -0
- package/src/contexts/WorkspaceContext.js +5 -0
- package/src/contexts/index.js +4 -0
- package/src/extend/PluginContext.js +5 -0
- package/src/extend/PluginProvider.jsx +22 -0
- package/src/extend/index.js +9 -0
- package/src/extend/pluginMapping.js +44 -0
- package/src/extend/pluginPreprocessing.js +45 -0
- package/src/extend/pluginValidation.js +58 -0
- package/src/extend/usePlugins.js +13 -0
- package/src/extend/withPlugins.jsx +46 -0
- package/src/hooks/index.js +4 -0
- package/src/hooks/useCanvasWorldService.js +10 -0
- package/src/hooks/useThumbnailService.js +8 -0
- package/src/i18n.js +71 -0
- package/src/index.js +18 -0
- package/src/init.js +20 -0
- package/src/lib/AnnotationFactory.js +23 -0
- package/src/lib/AnnotationItem.js +123 -0
- package/src/lib/AnnotationList.js +31 -0
- package/src/lib/AnnotationPage.js +41 -0
- package/src/lib/AnnotationResource.js +122 -0
- package/src/lib/CanvasAnnotationDisplay.js +148 -0
- package/src/lib/CanvasGroupings.js +55 -0
- package/src/lib/CanvasWorld.js +214 -0
- package/src/lib/CompanionWindowRegistry.js +23 -0
- package/src/lib/FullScreenHandle.jsx +76 -0
- package/src/lib/MiradorCanvas.js +211 -0
- package/src/lib/MiradorManifest.js +44 -0
- package/src/lib/MiradorViewer.jsx +53 -0
- package/src/lib/MosaicLayout.js +77 -0
- package/src/lib/OpenSeadragonCanvasOverlay.js +114 -0
- package/src/lib/ThumbnailFactory.js +310 -0
- package/src/lib/TruncatedHit.js +34 -0
- package/src/lib/asArray.js +11 -0
- package/src/lib/htmlRules.js +28 -0
- package/src/lib/iiif.js +12 -0
- package/src/lib/index.js +23 -0
- package/src/lib/readImageMetadata.js +21 -0
- package/src/lib/svgShapesToPath.js +49 -0
- package/src/locales/README.md +60 -0
- package/src/locales/ar/translation.json +141 -0
- package/src/locales/bg/translation.json +164 -0
- package/src/locales/de/translation.json +169 -0
- package/src/locales/en/translation.json +170 -0
- package/src/locales/et/translation.json +164 -0
- package/src/locales/fa/translation.json +164 -0
- package/src/locales/fr/translation.json +158 -0
- package/src/locales/hr/translation.json +164 -0
- package/src/locales/hu/translation.json +166 -0
- package/src/locales/it/translation.json +162 -0
- package/src/locales/ja/translation.json +156 -0
- package/src/locales/kr/translation.json +162 -0
- package/src/locales/lt/translation.json +153 -0
- package/src/locales/nbNo/translation.json +162 -0
- package/src/locales/nl/translation.json +139 -0
- package/src/locales/pl/translation.json +162 -0
- package/src/locales/ptBr/translation.json +133 -0
- package/src/locales/sr/translation.json +155 -0
- package/src/locales/sv/translation.json +157 -0
- package/src/locales/ta/translation.json +167 -0
- package/src/locales/vi/translation.json +156 -0
- package/src/locales/zhCn/translation.json +163 -0
- package/src/locales/zhTw/translation.json +163 -0
- package/src/plugins/OSDReferences.js +15 -0
- package/src/plugins/index.js +1 -0
- package/src/state/actions/action-types.js +76 -0
- package/src/state/actions/annotation.js +123 -0
- package/src/state/actions/auth.js +109 -0
- package/src/state/actions/canvas.js +65 -0
- package/src/state/actions/catalog.js +22 -0
- package/src/state/actions/companionWindow.js +107 -0
- package/src/state/actions/config.js +49 -0
- package/src/state/actions/elasticLayout.js +10 -0
- package/src/state/actions/errors.js +22 -0
- package/src/state/actions/index.js +19 -0
- package/src/state/actions/infoResponse.js +90 -0
- package/src/state/actions/layers.js +14 -0
- package/src/state/actions/manifest.js +65 -0
- package/src/state/actions/search.js +97 -0
- package/src/state/actions/window.js +209 -0
- package/src/state/actions/workspace.js +84 -0
- package/src/state/createPluggableStore.js +24 -0
- package/src/state/createStore.js +33 -0
- package/src/state/index.js +21 -0
- package/src/state/reducers/accessTokens.js +59 -0
- package/src/state/reducers/annotations.js +48 -0
- package/src/state/reducers/auth.js +43 -0
- package/src/state/reducers/catalog.js +30 -0
- package/src/state/reducers/companionWindows.js +49 -0
- package/src/state/reducers/config.js +39 -0
- package/src/state/reducers/elasticLayout.js +29 -0
- package/src/state/reducers/errors.js +51 -0
- package/src/state/reducers/index.js +15 -0
- package/src/state/reducers/infoResponses.js +61 -0
- package/src/state/reducers/layers.js +23 -0
- package/src/state/reducers/manifests.js +52 -0
- package/src/state/reducers/rootReducer.js +44 -0
- package/src/state/reducers/search.js +145 -0
- package/src/state/reducers/utils.js +45 -0
- package/src/state/reducers/viewers.js +42 -0
- package/src/state/reducers/windows.js +185 -0
- package/src/state/reducers/workspace.js +111 -0
- package/src/state/sagas/annotations.js +48 -0
- package/src/state/sagas/app.js +56 -0
- package/src/state/sagas/auth.js +151 -0
- package/src/state/sagas/iiif.js +233 -0
- package/src/state/sagas/index.js +30 -0
- package/src/state/sagas/windows.js +293 -0
- package/src/state/selectors/annotations.js +138 -0
- package/src/state/selectors/auth.js +100 -0
- package/src/state/selectors/canvases.js +260 -0
- package/src/state/selectors/companionWindows.js +182 -0
- package/src/state/selectors/config.js +100 -0
- package/src/state/selectors/getters.js +90 -0
- package/src/state/selectors/index.js +17 -0
- package/src/state/selectors/layers.js +79 -0
- package/src/state/selectors/manifests.js +433 -0
- package/src/state/selectors/ranges.js +147 -0
- package/src/state/selectors/searches.js +249 -0
- package/src/state/selectors/sequences.js +134 -0
- package/src/state/selectors/thumbnails.js +28 -0
- package/src/state/selectors/utils.js +18 -0
- package/src/state/selectors/viewer.js +19 -0
- package/src/state/selectors/windows.js +98 -0
- package/src/state/selectors/workspace.js +52 -0
- package/src/state/selectors/wrappers.js +15 -0
- package/src/styles/react-mosaic-component.js +288 -0
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { createSelector } from 'reselect';
|
|
2
|
+
import { miradorSlice, EMPTY_ARRAY, EMPTY_OBJECT } from './utils';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Returns the manifest titles for all open windows.
|
|
6
|
+
* @param {object} state
|
|
7
|
+
* @returns {Array} containing manifests ids.
|
|
8
|
+
*/
|
|
9
|
+
export function getWindowManifests(state) {
|
|
10
|
+
return Object.values(miradorSlice(state).windows).map((window) => window.manifestId);
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Returns the opened windows.
|
|
15
|
+
* @param {object} state
|
|
16
|
+
* @returns {object} {id: {canvasId: {...}, ...}, ...}
|
|
17
|
+
*/
|
|
18
|
+
export function getWindows(state) {
|
|
19
|
+
return miradorSlice(state).windows || EMPTY_OBJECT;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Returns a window based on a given windowId.
|
|
24
|
+
* @param {object} state
|
|
25
|
+
* @param {object} props
|
|
26
|
+
* @param {string} props.windowId
|
|
27
|
+
* @returns {object|undefined}
|
|
28
|
+
*/
|
|
29
|
+
export function getWindow(state, { windowId }) {
|
|
30
|
+
return getWindows(state)[windowId];
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Returns the viewer for a given window.
|
|
35
|
+
* @param {object} state
|
|
36
|
+
* @param {object} props
|
|
37
|
+
* @param {string} props.windowId
|
|
38
|
+
* @returns {object|undefined} {flip: false, rotation: 0, x: 1, y: 2, zoom: 0.5}
|
|
39
|
+
*/
|
|
40
|
+
export const getViewer = createSelector(
|
|
41
|
+
[(state) => miradorSlice(state).viewers, (state, { windowId }) => windowId],
|
|
42
|
+
(viewers, windowId) => viewers[windowId],
|
|
43
|
+
);
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Returns the workspace.
|
|
47
|
+
* @param {object} state
|
|
48
|
+
* @returns {object}
|
|
49
|
+
*/
|
|
50
|
+
export function getWorkspace(state) {
|
|
51
|
+
return miradorSlice(state).workspace;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Returns the windowIds.
|
|
56
|
+
* @param {object} state
|
|
57
|
+
* @returns {Array}
|
|
58
|
+
*/
|
|
59
|
+
export const getWindowIds = createSelector([getWorkspace], ({ windowIds }) => windowIds || EMPTY_ARRAY);
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Returns all manifests including manifest information.
|
|
63
|
+
* @param {object} state
|
|
64
|
+
* @returns {object}
|
|
65
|
+
*/
|
|
66
|
+
export function getManifests(state) {
|
|
67
|
+
return miradorSlice(state).manifests || EMPTY_OBJECT;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Get the relevant manifest information for a given manifest.
|
|
72
|
+
* @param {object} state
|
|
73
|
+
* @param {object} props
|
|
74
|
+
* @param {string} props.manifestId
|
|
75
|
+
* @param {string} props.windowId
|
|
76
|
+
* @returns {object}
|
|
77
|
+
*/
|
|
78
|
+
export function getManifest(state, { manifestId, windowId }) {
|
|
79
|
+
const manifests = getManifests(state);
|
|
80
|
+
return manifests && manifests[manifestId || (windowId && (getWindow(state, { windowId }) || EMPTY_OBJECT).manifestId)];
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Get the opened catalog.
|
|
85
|
+
* @param {object} state
|
|
86
|
+
* @returns {object} containing manifestIds for the manifests in the catalog
|
|
87
|
+
*/
|
|
88
|
+
export function getCatalog(state) {
|
|
89
|
+
return miradorSlice(state).catalog || EMPTY_OBJECT;
|
|
90
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export * from './annotations';
|
|
2
|
+
export * from './canvases';
|
|
3
|
+
export * from './companionWindows';
|
|
4
|
+
export * from './config';
|
|
5
|
+
export * from './getters';
|
|
6
|
+
export * from './manifests';
|
|
7
|
+
export * from './windows';
|
|
8
|
+
export * from './workspace';
|
|
9
|
+
export * from './searches';
|
|
10
|
+
export * from './ranges';
|
|
11
|
+
export * from './layers';
|
|
12
|
+
export * from './sequences';
|
|
13
|
+
export * from './auth';
|
|
14
|
+
export * from './utils';
|
|
15
|
+
export * from './viewer';
|
|
16
|
+
export * from './thumbnails';
|
|
17
|
+
export * from './wrappers';
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { createSelector } from 'reselect';
|
|
2
|
+
import { getMiradorCanvasWrapper } from './wrappers';
|
|
3
|
+
import { getCanvas, getVisibleCanvasIds } from './canvases';
|
|
4
|
+
import { miradorSlice, EMPTY_ARRAY } from './utils';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Get the image layers from a canvas.
|
|
8
|
+
* @param {object} state
|
|
9
|
+
* @param {object} props
|
|
10
|
+
* @param {string} props.canvasId
|
|
11
|
+
* @param {string} props.windowId
|
|
12
|
+
* @param {string} props.companionWindowId
|
|
13
|
+
* @returns {Array}
|
|
14
|
+
*/
|
|
15
|
+
export const getCanvasLayers = createSelector([getCanvas, getMiradorCanvasWrapper], (canvas, getMiradorCanvas) => {
|
|
16
|
+
if (!canvas) return [];
|
|
17
|
+
return getMiradorCanvas(canvas).imageResources;
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
export const getLayersForWindow = createSelector(
|
|
21
|
+
[(state) => miradorSlice(state).layers, (state, { windowId }) => windowId],
|
|
22
|
+
(layers, windowId) => (layers ? layers[windowId] || EMPTY_ARRAY : EMPTY_ARRAY),
|
|
23
|
+
);
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Get the layer state for a particular canvas.
|
|
27
|
+
* @param {object} state
|
|
28
|
+
* @param {string} windowId
|
|
29
|
+
* @returns {object}
|
|
30
|
+
*/
|
|
31
|
+
export const getLayers = createSelector(
|
|
32
|
+
[getLayersForWindow, (state, { canvasId }) => canvasId],
|
|
33
|
+
(layers, canvasId) => layers[canvasId],
|
|
34
|
+
);
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Returns a list of canvas layers, sorted by the layer state configuration.
|
|
38
|
+
* @param {object} state
|
|
39
|
+
* @param {object} props
|
|
40
|
+
* @param {string} props.companionWindowId
|
|
41
|
+
* @returns {Array}
|
|
42
|
+
*/
|
|
43
|
+
export const getSortedLayers = createSelector([getCanvasLayers, getLayers], (canvasLayers, layerConfig) => {
|
|
44
|
+
if (!layerConfig) return canvasLayers;
|
|
45
|
+
|
|
46
|
+
const sorted = canvasLayers.sort((a, b) => {
|
|
47
|
+
if (
|
|
48
|
+
layerConfig[a.id] &&
|
|
49
|
+
layerConfig[a.id].index !== undefined &&
|
|
50
|
+
layerConfig[b.id] &&
|
|
51
|
+
layerConfig[b.id].index !== undefined
|
|
52
|
+
) {
|
|
53
|
+
return layerConfig[a.id].index - layerConfig[b.id].index;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// sort a layer with index data above layers without
|
|
57
|
+
if (layerConfig[a.id] && layerConfig[a.id].index !== undefined) return -1;
|
|
58
|
+
if (layerConfig[b.id] && layerConfig[b.id].index !== undefined) return 1;
|
|
59
|
+
|
|
60
|
+
return 0;
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
return sorted;
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Get all the layer configuration for visible canvases.
|
|
68
|
+
* @param {object} state
|
|
69
|
+
* @param {object} props
|
|
70
|
+
* @param {string} props.windowId
|
|
71
|
+
* @returns {object}
|
|
72
|
+
*/
|
|
73
|
+
export const getLayersForVisibleCanvases = createSelector([getVisibleCanvasIds, getLayersForWindow], (canvasIds, layers) =>
|
|
74
|
+
canvasIds.reduce((acc, canvasId) => {
|
|
75
|
+
// eslint-disable-next-line no-param-reassign
|
|
76
|
+
acc[canvasId] = layers[canvasId];
|
|
77
|
+
return acc;
|
|
78
|
+
}, {}),
|
|
79
|
+
);
|
|
@@ -0,0 +1,433 @@
|
|
|
1
|
+
import { createSelector } from 'reselect';
|
|
2
|
+
import { PropertyValue, Utils, Resource } from 'manifesto.js';
|
|
3
|
+
import asArray from '../../lib/asArray';
|
|
4
|
+
import { getCompanionWindowLocale } from './companionWindows';
|
|
5
|
+
import { getManifest } from './getters';
|
|
6
|
+
import { getConfig } from './config';
|
|
7
|
+
import { getThumbnailFactory } from './thumbnails';
|
|
8
|
+
|
|
9
|
+
/** */
|
|
10
|
+
function createManifestoInstance(json, locale) {
|
|
11
|
+
if (!json) return undefined;
|
|
12
|
+
// Use structuredClone to create a deep copy and prevent Manifesto from mutating the json
|
|
13
|
+
const manifestoObject = Utils.parseManifest(structuredClone(json), locale ? { locale } : undefined);
|
|
14
|
+
if (manifestoObject) {
|
|
15
|
+
// Local patching of Manifesto so that when its a Collection, it behaves similarly
|
|
16
|
+
if (typeof manifestoObject.getSequences != 'function') {
|
|
17
|
+
manifestoObject.getSequences = () => [];
|
|
18
|
+
}
|
|
19
|
+
return manifestoObject;
|
|
20
|
+
}
|
|
21
|
+
return undefined;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/** */
|
|
25
|
+
export const getLocale = createSelector(
|
|
26
|
+
[getCompanionWindowLocale, getConfig, (state, { locale }) => locale],
|
|
27
|
+
(companionWindowLocale, config = {}, locale) => locale || companionWindowLocale || config.language || config.fallbackLanguages,
|
|
28
|
+
);
|
|
29
|
+
|
|
30
|
+
const defaultManifestStatus = Object.freeze({ missing: true });
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Convenience selector to get a manifest (or placeholder).
|
|
34
|
+
* @param {object} state
|
|
35
|
+
* @param {object} props
|
|
36
|
+
* @param {string} props.windowId
|
|
37
|
+
* @returns {object} {error: null: id: string, isFetching: boolean, json: {...}}
|
|
38
|
+
*/
|
|
39
|
+
export const getManifestStatus = createSelector([getManifest], (manifest) => manifest || defaultManifestStatus);
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Convenience selector to get a manifest loading error
|
|
43
|
+
* @param {object} state
|
|
44
|
+
* @param {object} props
|
|
45
|
+
* @param {string} props.manifestId
|
|
46
|
+
* @returns {string|null}
|
|
47
|
+
*/
|
|
48
|
+
export const getManifestError = createSelector([getManifest], (manifest) => manifest && manifest.error);
|
|
49
|
+
|
|
50
|
+
/** Instantiate a manifesto instance */
|
|
51
|
+
const getContextualManifestoInstance = createSelector(
|
|
52
|
+
getManifest,
|
|
53
|
+
(manifest) => manifest && createManifestoInstance(manifest.json),
|
|
54
|
+
);
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Instantiate a manifesto instance
|
|
58
|
+
* @param {object} state
|
|
59
|
+
* @param {object} props
|
|
60
|
+
* @param {string} props.manifestId
|
|
61
|
+
* @returns {object}
|
|
62
|
+
*/
|
|
63
|
+
export const getManifestoInstance = createSelector(
|
|
64
|
+
getContextualManifestoInstance,
|
|
65
|
+
(state, { json }) => json,
|
|
66
|
+
(manifesto, manifestJson) => (manifestJson && createManifestoInstance(manifestJson)) || manifesto,
|
|
67
|
+
);
|
|
68
|
+
|
|
69
|
+
export const getManifestLocale = createSelector(
|
|
70
|
+
[getManifestoInstance, getLocale],
|
|
71
|
+
(manifest, locale) =>
|
|
72
|
+
locale ?? (manifest && manifest.options && manifest.options.locale && manifest.options.locale.replace(/-.*$/, '')),
|
|
73
|
+
);
|
|
74
|
+
|
|
75
|
+
/** */
|
|
76
|
+
function getProperty(property) {
|
|
77
|
+
return createSelector([getManifestoInstance], (manifest) => manifest && manifest.getProperty(property));
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Return the IIIF v3 provider of a manifest or null.
|
|
82
|
+
* @param {object} state
|
|
83
|
+
* @param {object} props
|
|
84
|
+
* @param {string} props.manifestId
|
|
85
|
+
* @param {string} props.windowId
|
|
86
|
+
* @returns {string|null}
|
|
87
|
+
*/
|
|
88
|
+
export const getManifestProviderName = createSelector(
|
|
89
|
+
[getProperty('provider'), getManifestLocale],
|
|
90
|
+
(provider, locale) => provider && provider[0].label && PropertyValue.parse(provider[0].label).getValue(locale),
|
|
91
|
+
);
|
|
92
|
+
|
|
93
|
+
const EMPTY_LOGO_OPTS = Object.freeze({});
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Return the IIIF v3 provider logo.
|
|
97
|
+
* @param {object} state
|
|
98
|
+
* @param {object} props
|
|
99
|
+
* @returns {string|null}
|
|
100
|
+
*/
|
|
101
|
+
export const getProviderLogo = createSelector(
|
|
102
|
+
[getProperty('provider'), (state) => getThumbnailFactory(state, EMPTY_LOGO_OPTS)],
|
|
103
|
+
(provider, thumbnailFactory) => {
|
|
104
|
+
const logo = provider && provider[0] && provider[0].logo && provider[0].logo[0];
|
|
105
|
+
if (!logo) return null;
|
|
106
|
+
return thumbnailFactory.get(new Resource(logo))?.url;
|
|
107
|
+
},
|
|
108
|
+
);
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Get the logo for a manifest.
|
|
112
|
+
* @param {object} state
|
|
113
|
+
* @param {object} props
|
|
114
|
+
* @returns {string|null}
|
|
115
|
+
*/
|
|
116
|
+
export const getManifestLogo = createSelector(
|
|
117
|
+
[getManifestoInstance, getProviderLogo],
|
|
118
|
+
(manifest, v3logo) => v3logo || (manifest && manifest.getLogo()),
|
|
119
|
+
);
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* Return the IIIF v3 homepage of a manifest or null.
|
|
123
|
+
* @param {object} state
|
|
124
|
+
* @param {object} props
|
|
125
|
+
* @param {string} props.manifestId
|
|
126
|
+
* @param {string} props.windowId
|
|
127
|
+
* @returns {string|null}
|
|
128
|
+
*/
|
|
129
|
+
export const getManifestHomepage = createSelector(
|
|
130
|
+
[getProperty('homepage'), getManifestLocale],
|
|
131
|
+
(homepages, locale) =>
|
|
132
|
+
homepages &&
|
|
133
|
+
asArray(homepages).map((homepage) => ({
|
|
134
|
+
label: PropertyValue.parse(homepage.label).getValue(locale),
|
|
135
|
+
value: homepage.id || homepage['@id'],
|
|
136
|
+
})),
|
|
137
|
+
);
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* Return the IIIF v3 renderings of a manifest or null.
|
|
141
|
+
* @param {object} state
|
|
142
|
+
* @param {object} props
|
|
143
|
+
* @param {string} props.manifestId
|
|
144
|
+
* @param {string} props.windowId
|
|
145
|
+
* @returns {string|null}
|
|
146
|
+
*/
|
|
147
|
+
export const getManifestRenderings = createSelector(
|
|
148
|
+
[getManifestoInstance, getManifestLocale],
|
|
149
|
+
(manifest, locale) =>
|
|
150
|
+
manifest &&
|
|
151
|
+
manifest.getRenderings().map((rendering) => ({
|
|
152
|
+
label: rendering.getLabel().getValue(locale),
|
|
153
|
+
value: rendering.id,
|
|
154
|
+
})),
|
|
155
|
+
);
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* Return the IIIF v2/v3 seeAlso data from a manifest or null.
|
|
159
|
+
* @param {object} state
|
|
160
|
+
* @param {object} props
|
|
161
|
+
* @param {string} props.manifestId
|
|
162
|
+
* @param {string} props.windowId
|
|
163
|
+
* @returns {string|null}
|
|
164
|
+
*/
|
|
165
|
+
export const getManifestSeeAlso = createSelector(
|
|
166
|
+
[getProperty('seeAlso'), getManifestLocale],
|
|
167
|
+
(seeAlso, locale) =>
|
|
168
|
+
seeAlso &&
|
|
169
|
+
asArray(seeAlso).map((related) => ({
|
|
170
|
+
format: related.format,
|
|
171
|
+
label: PropertyValue.parse(related.label).getValue(locale),
|
|
172
|
+
value: related.id || related['@id'],
|
|
173
|
+
})),
|
|
174
|
+
);
|
|
175
|
+
|
|
176
|
+
/**
|
|
177
|
+
* Return the IIIF v2/v3 seeAlso data from a manifest or null.
|
|
178
|
+
* @param {object} state
|
|
179
|
+
* @param {object} props
|
|
180
|
+
* @param {string} props.manifestId
|
|
181
|
+
* @param {string} props.windowId
|
|
182
|
+
* @returns {string|null}
|
|
183
|
+
* @deprecated This does not actually return the content of "related" and
|
|
184
|
+
* might be removed in a future version.
|
|
185
|
+
* @see getManifestSeeAlso
|
|
186
|
+
*/
|
|
187
|
+
export const getManifestRelatedContent = getManifestSeeAlso;
|
|
188
|
+
|
|
189
|
+
/**
|
|
190
|
+
* Return the IIIF v2 realated links manifest or null
|
|
191
|
+
* @param {object} state
|
|
192
|
+
* @param {object} props
|
|
193
|
+
* @param {string} props.manifestId
|
|
194
|
+
* @param {string} props.windowId
|
|
195
|
+
* @returns {string|null}
|
|
196
|
+
*/
|
|
197
|
+
export const getManifestRelated = createSelector(
|
|
198
|
+
[getProperty('related'), getManifestLocale],
|
|
199
|
+
(relatedLinks, locale) =>
|
|
200
|
+
relatedLinks &&
|
|
201
|
+
asArray(relatedLinks).map((related) =>
|
|
202
|
+
typeof related === 'string'
|
|
203
|
+
? {
|
|
204
|
+
value: related,
|
|
205
|
+
}
|
|
206
|
+
: {
|
|
207
|
+
format: related.format,
|
|
208
|
+
label: PropertyValue.parse(related.label).getValue(locale),
|
|
209
|
+
value: related.id || related['@id'],
|
|
210
|
+
},
|
|
211
|
+
),
|
|
212
|
+
);
|
|
213
|
+
|
|
214
|
+
/**
|
|
215
|
+
* Return the IIIF requiredStatement (v3) or attribution (v2) data from a manifest or null
|
|
216
|
+
* @param {object} state
|
|
217
|
+
* @param {object} props
|
|
218
|
+
* @param {string} props.manifestId
|
|
219
|
+
* @param {string} props.windowId
|
|
220
|
+
* @returns {string|null}
|
|
221
|
+
*/
|
|
222
|
+
export const getRequiredStatement = createSelector(
|
|
223
|
+
[getLocale, getManifestoInstance],
|
|
224
|
+
(locale, manifest) =>
|
|
225
|
+
manifest &&
|
|
226
|
+
asArray(manifest.getRequiredStatement()).flatMap((labelValuePair) => {
|
|
227
|
+
const values = labelValuePair?.getValues(locale) ?? [];
|
|
228
|
+
if (!values.length) {
|
|
229
|
+
return [];
|
|
230
|
+
}
|
|
231
|
+
const labels = labelValuePair?.getLabels(locale) ?? [];
|
|
232
|
+
return Array.from({ length: Math.max(labels.length, values.length) }, (_, idx) => idx)
|
|
233
|
+
.filter((idx) => values[idx])
|
|
234
|
+
.map((idx) => ({
|
|
235
|
+
label: labels[idx] ?? null,
|
|
236
|
+
values: [values[idx]],
|
|
237
|
+
}));
|
|
238
|
+
}),
|
|
239
|
+
);
|
|
240
|
+
|
|
241
|
+
/**
|
|
242
|
+
* Return the IIIF v2 rights (v3) or license (v2) data from a manifest or null
|
|
243
|
+
* @param {object} state
|
|
244
|
+
* @param {object} props
|
|
245
|
+
* @param {string} props.manifestId
|
|
246
|
+
* @param {string} props.windowId
|
|
247
|
+
* @returns {string|null}
|
|
248
|
+
*/
|
|
249
|
+
export const getRights = createSelector(
|
|
250
|
+
[getProperty('rights'), getProperty('license'), getManifestLocale],
|
|
251
|
+
(rights, license, locale) => {
|
|
252
|
+
const data = rights || license;
|
|
253
|
+
return asArray(PropertyValue.parse(data).getValues(locale));
|
|
254
|
+
},
|
|
255
|
+
);
|
|
256
|
+
|
|
257
|
+
/**
|
|
258
|
+
* Return the supplied thumbnail for a manifest or null.
|
|
259
|
+
* @param {object} state
|
|
260
|
+
* @param {object} props
|
|
261
|
+
* @param {string} props.manifestId
|
|
262
|
+
* @param {string} props.windowId
|
|
263
|
+
* @returns {string|null}
|
|
264
|
+
*/
|
|
265
|
+
export function getManifestThumbnail(state, props) {
|
|
266
|
+
const manifest = getManifestoInstance(state, props);
|
|
267
|
+
const thumbnailFactory = getThumbnailFactory(state, 80, 120);
|
|
268
|
+
if (!manifest) return undefined;
|
|
269
|
+
const thumbnail = thumbnailFactory.get(manifest);
|
|
270
|
+
return thumbnail && thumbnail.url;
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
/**
|
|
274
|
+
* Return manifest title.
|
|
275
|
+
* @param {object} state
|
|
276
|
+
* @param {object} props
|
|
277
|
+
* @param {string} props.manifestId
|
|
278
|
+
* @param {string} props.windowId
|
|
279
|
+
* @returns {string}
|
|
280
|
+
*/
|
|
281
|
+
export const getManifestTitle = createSelector(
|
|
282
|
+
[getManifestoInstance, getManifestLocale],
|
|
283
|
+
(manifest, locale) => manifest && manifest.getLabel().getValue(locale),
|
|
284
|
+
);
|
|
285
|
+
|
|
286
|
+
/**
|
|
287
|
+
* Return manifest description (IIIF v2) -- distinct from any description field nested under metadata.
|
|
288
|
+
* @param {object} state
|
|
289
|
+
* @param {object} props
|
|
290
|
+
* @param {string} props.manifestId
|
|
291
|
+
* @param {string} props.windowId
|
|
292
|
+
* @returns {string|null}
|
|
293
|
+
*/
|
|
294
|
+
export const getManifestDescription = createSelector(
|
|
295
|
+
[getLocale, getManifestoInstance],
|
|
296
|
+
(locale, manifest) => manifest && manifest.getDescription().getValue(locale),
|
|
297
|
+
);
|
|
298
|
+
|
|
299
|
+
/**
|
|
300
|
+
* Return manifest summary (IIIF v3).
|
|
301
|
+
* @param {object} state
|
|
302
|
+
* @param {object} props
|
|
303
|
+
* @param {string} props.manifestId
|
|
304
|
+
* @param {string} props.windowId
|
|
305
|
+
* @return {string|null}
|
|
306
|
+
*/
|
|
307
|
+
export const getManifestSummary = createSelector(
|
|
308
|
+
[getProperty('summary'), getManifestLocale],
|
|
309
|
+
(summary, locale) => summary && PropertyValue.parse(summary).getValue(locale),
|
|
310
|
+
);
|
|
311
|
+
|
|
312
|
+
/**
|
|
313
|
+
* Return manifest title.
|
|
314
|
+
* @param {object} state
|
|
315
|
+
* @param {object} props
|
|
316
|
+
* @param {string} props.manifestId
|
|
317
|
+
* @param {string} props.windowId
|
|
318
|
+
* @returns {string}
|
|
319
|
+
*/
|
|
320
|
+
export const getManifestUrl = createSelector([getManifestoInstance], (manifest) => manifest && manifest.id);
|
|
321
|
+
|
|
322
|
+
/**
|
|
323
|
+
* Return metadata in a label / value structure
|
|
324
|
+
* This is a potential seam for pulling the i18n locale from
|
|
325
|
+
* state and plucking out the appropriate language.
|
|
326
|
+
* For now we're just getting the first.
|
|
327
|
+
* @param {object} Manifesto IIIF Resource (e.g. canvas, manifest)
|
|
328
|
+
* @param iiifResource
|
|
329
|
+
* @returns {Array[Object]}
|
|
330
|
+
*/
|
|
331
|
+
export function getDestructuredMetadata(iiifResource, locale = undefined) {
|
|
332
|
+
return (
|
|
333
|
+
iiifResource &&
|
|
334
|
+
iiifResource.getMetadata().map((labelValuePair) => ({
|
|
335
|
+
label: labelValuePair.getLabel(locale),
|
|
336
|
+
values: labelValuePair.getValues(locale),
|
|
337
|
+
}))
|
|
338
|
+
);
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
/**
|
|
342
|
+
* Return manifest metadata in a label / value structure
|
|
343
|
+
* @param {object} state
|
|
344
|
+
* @param {object} props
|
|
345
|
+
* @param {string} props.manifestId
|
|
346
|
+
* @param {string} props.windowId
|
|
347
|
+
* @returns {Array[Object]}
|
|
348
|
+
*/
|
|
349
|
+
export const getManifestMetadata = createSelector(
|
|
350
|
+
[getManifestoInstance, getManifestLocale],
|
|
351
|
+
(manifest, locale) => manifest && getDestructuredMetadata(manifest, locale),
|
|
352
|
+
);
|
|
353
|
+
|
|
354
|
+
/** */
|
|
355
|
+
function getLocalesForStructure(item) {
|
|
356
|
+
const languages = new Set([]);
|
|
357
|
+
|
|
358
|
+
/** Extract language indicators from IIIF v2 or v3 manifests */
|
|
359
|
+
const extractLanguage = (i) => {
|
|
360
|
+
if (!(i && typeof i === 'object')) return;
|
|
361
|
+
|
|
362
|
+
// IIIF v2 pattern
|
|
363
|
+
if (i['@language'] && i['@value']) {
|
|
364
|
+
languages.add(i['@language']);
|
|
365
|
+
return;
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
// IIIF v3 pattern
|
|
369
|
+
Object.keys(i).forEach((key) => {
|
|
370
|
+
languages.add(key);
|
|
371
|
+
});
|
|
372
|
+
};
|
|
373
|
+
|
|
374
|
+
if (Array.isArray(item)) {
|
|
375
|
+
item.forEach((i) => extractLanguage(i));
|
|
376
|
+
} else {
|
|
377
|
+
extractLanguage(item);
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
return [...languages];
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
/** */
|
|
384
|
+
function getLocales(resource) {
|
|
385
|
+
if (!resource) return [];
|
|
386
|
+
|
|
387
|
+
const metadata = resource.getProperty('metadata') || [];
|
|
388
|
+
const languages = {};
|
|
389
|
+
|
|
390
|
+
for (let i = 0; i < metadata.length; i += 1) {
|
|
391
|
+
const item = metadata[i];
|
|
392
|
+
getLocalesForStructure(item.label).forEach((l) => {
|
|
393
|
+
languages[l] = true;
|
|
394
|
+
});
|
|
395
|
+
getLocalesForStructure(item.value).forEach((l) => {
|
|
396
|
+
languages[l] = true;
|
|
397
|
+
});
|
|
398
|
+
}
|
|
399
|
+
return Object.keys(languages);
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
export const getMetadataLocales = createSelector([getManifestoInstance], (manifest) => getLocales(manifest));
|
|
403
|
+
|
|
404
|
+
/**
|
|
405
|
+
* Returns manifest search service.
|
|
406
|
+
* @param {object} state
|
|
407
|
+
* @param {object} props
|
|
408
|
+
* @param {string} props.manifestId
|
|
409
|
+
* @returns {string|null}
|
|
410
|
+
*/
|
|
411
|
+
export const getManifestSearchService = createSelector([getManifestoInstance], (manifest) => {
|
|
412
|
+
if (!manifest) return null;
|
|
413
|
+
const searchService =
|
|
414
|
+
manifest.getService('http://iiif.io/api/search/0/search') || manifest.getService('http://iiif.io/api/search/1/search');
|
|
415
|
+
if (searchService) return searchService;
|
|
416
|
+
return null;
|
|
417
|
+
});
|
|
418
|
+
|
|
419
|
+
/**
|
|
420
|
+
* Returns manifest autocomplete service.
|
|
421
|
+
* @param {object} state
|
|
422
|
+
* @param {object} props
|
|
423
|
+
* @param {string} props.manifestId
|
|
424
|
+
* @returns {string|null}
|
|
425
|
+
*/
|
|
426
|
+
export const getManifestAutocompleteService = createSelector([getManifestSearchService], (searchService) => {
|
|
427
|
+
const autocompleteService =
|
|
428
|
+
searchService &&
|
|
429
|
+
(searchService.getService('http://iiif.io/api/search/0/autocomplete') ||
|
|
430
|
+
searchService.getService('http://iiif.io/api/search/1/autocomplete'));
|
|
431
|
+
|
|
432
|
+
return autocompleteService && autocompleteService;
|
|
433
|
+
});
|