Skip to content
Snippets Groups Projects
Unverified Commit 1eefa8d3 authored by aeschylus's avatar aeschylus Committed by GitHub
Browse files

Merge pull request #2265 from ProjectMirador/reselect-reorg

Extract reselected methods into their own files
parents 07ce8f06 946fd839
Branches
Tags
No related merge requests found
import manifestFixture019 from '../../fixtures/version-2/019.json';
import {
getSelectedCanvas,
getSelectedCanvases,
} from '../../../src/state/selectors/canvases';
describe('getSelectedCanvas', () => {
const state = {
windows: {
a: {
id: 'a',
manifestId: 'x',
canvasIndex: 1,
},
},
manifests: {
x: {
id: 'x',
json: manifestFixture019,
},
},
};
const noManifestationState = {
windows: {
a: {
id: 'a',
manifestId: 'x',
canvasIndex: 1,
},
},
manifests: {
x: {
id: 'x',
},
},
};
it('should return canvas based on the canvas index stored window state', () => {
const selectedCanvas = getSelectedCanvas(state, { windowId: 'a' });
expect(selectedCanvas.id).toEqual(
'https://purl.stanford.edu/fr426cg9537/iiif/canvas/fr426cg9537_1',
);
});
it('should return undefined when there is no manifestation to get a canvas from', () => {
const selectedCanvas = getSelectedCanvas(noManifestationState, { windowId: 'a' });
expect(selectedCanvas).toBeUndefined();
});
});
describe('getSelectedCanvases', () => {
const state = {
windows: {
a: {
id: 'a',
manifestId: 'x',
canvasIndex: 1,
view: 'book',
},
},
manifests: {
x: {
id: 'x',
json: manifestFixture019,
},
},
};
const noManifestationState = {
windows: {
a: {
id: 'a',
manifestId: 'x',
canvasIndex: 1,
},
},
manifests: {
x: {
id: 'x',
},
},
};
it('should return canvas groupings based on the canvas index stored window state', () => {
const selectedCanvases = getSelectedCanvases(state, { windowId: 'a' });
expect(selectedCanvases.length).toEqual(2);
expect(selectedCanvases.map(canvas => canvas.id)).toEqual([
'https://purl.stanford.edu/fr426cg9537/iiif/canvas/fr426cg9537_1',
'https://purl.stanford.edu/rz176rt6531/iiif/canvas/rz176rt6531_1',
]);
});
it('should return undefined when there is no manifestation to get a canvas from', () => {
const selectedCanvas = getSelectedCanvases(noManifestationState, { windowId: 'a' });
expect(selectedCanvas).toBeUndefined();
});
});
......@@ -6,20 +6,12 @@ import manifestFixtureWithAProvider from '../../fixtures/version-3/with_a_provid
import {
getCanvasLabel,
getCompanionWindowForPosition,
getDestructuredMetadata,
getAnnotationResourcesByMotivation,
getIdAndContentOfResources,
getLanguagesFromConfigWithCurrent,
getSelectedCanvas,
getSelectedCanvases,
getManifest,
getManifestLogo,
getManifestCanvases,
getManifestDescription,
getThumbnailNavigationPosition,
getManifestProvider,
getManifestTitle,
getManifestThumbnail,
getSelectedAnnotationIds,
getSelectedTargetAnnotations,
getSelectedTargetsAnnotations,
......@@ -27,123 +19,11 @@ import {
getWindowViewType,
getIdAndLabelOfCanvases,
getCompanionWindowsOfWindow,
getManifestMetadata,
getWindowTitles,
} from '../../../src/state/selectors';
import Annotation from '../../../src/lib/Annotation';
import AnnotationResource from '../../../src/lib/AnnotationResource';
describe('getManifest()', () => {
const state = {
windows: {
a: { id: 'a', manifestId: 'x' },
b: { id: 'b', manifestId: 'y' },
c: { id: 'c' },
},
manifests: {
x: { id: 'x' },
},
};
it('should return the manifest of a certain id', () => {
const received = getManifest(state, { manifestId: 'x' });
const expected = { id: 'x' };
expect(received).toEqual(expected);
});
it('should return the manifest of a certain window', () => {
const received = getManifest(state, { windowId: 'a' });
const expected = { id: 'x' };
expect(received).toEqual(expected);
});
it('should return undefined if window doesnt exist', () => {
const received = getManifest(state, { windowId: 'unknown' });
expect(received).toBeUndefined();
});
it('should return undefined if window has no manifest id', () => {
const received = getManifest(state, { windowId: 'c' });
expect(received).toBeUndefined();
});
it('should return undefined if manifest does not exist', () => {
const received = getManifest(state, { windowId: 'b' });
expect(received).toBeUndefined();
});
});
describe('getManifestLogo()', () => {
it('should return manifest logo id', () => {
const received = getManifestLogo({ manifests: { x: { json: manifestFixture001 } } }, { manifestId: 'x' });
expect(received).toEqual(manifestFixture001.logo['@id']);
});
it('should return null if manifest has no logo', () => {
const received = getManifestLogo({ manifests: { x: {} } }, { manifestId: 'x' });
expect(received).toBeUndefined();
});
});
describe('getManifestThumbnail()', () => {
it('should return manifest thumbnail id', () => {
const state = { manifests: { x: { json: manifestFixture001 } } };
const received = getManifestThumbnail(state, { manifestId: 'x' });
expect(received).toEqual(manifestFixture001.thumbnail['@id']);
});
it('returns the first canvas thumbnail id', () => {
const manifest = {
'@context': 'http://iiif.io/api/presentation/2/context.json',
'@id':
'http://iiif.io/api/presentation/2.1/example/fixtures/19/manifest.json',
'@type': 'sc:Manifest',
sequences: [
{
canvases: [
{
thumbnail: { id: 'xyz' },
},
],
},
],
};
const state = { manifests: { x: { json: manifest } } };
const received = getManifestThumbnail(state, { manifestId: 'x' });
expect(received).toEqual('xyz');
});
it('returns a thumbnail sized image url from the first canvas', () => {
const state = { manifests: { x: { json: manifestFixture019 } } };
const received = getManifestThumbnail(state, { manifestId: 'x' });
expect(received).toEqual('https://stacks.stanford.edu/image/iiif/hg676jb4964%2F0380_796-44/full/,80/0/default.jpg');
});
it('should return null if manifest has no thumbnail', () => {
const state = { manifests: { x: {} } };
const received = getManifestThumbnail(state, { manifestId: 'x' });
expect(received).toBeNull();
});
});
describe('getManifestCanvases', () => {
it('returns an empty array if the manifestation is not loaded', () => {
const state = { manifests: { x: {} } };
const received = getManifestCanvases(state, { manifestId: 'x' });
expect(received).toEqual([]);
});
it('returns canvases from the manifest', () => {
const state = { manifests: { x: { json: manifestFixture001 } } };
const received = getManifestCanvases(state, { manifestId: 'x' });
expect(received.length).toBe(1);
expect(received[0].id).toBe('https://iiif.bodleian.ox.ac.uk/iiif/canvas/9cca8fdd-4a61-4429-8ac1-f648764b4d6d.json');
});
});
describe('getThumbnailNavigationPosition', () => {
const state = {
windows: {
......@@ -171,42 +51,6 @@ describe('getThumbnailNavigationPosition', () => {
});
});
describe('getManifestTitle', () => {
it('should return manifest title', () => {
const state = { manifests: { x: { json: manifestFixture001 } } };
const received = getManifestTitle(state, { manifestId: 'x' });
expect(received).toBe('Bodleian Library Human Freaks 2 (33)');
});
it('should return undefined if manifest undefined', () => {
const received = getManifestTitle({ manifests: {} }, { manifestId: 'x' });
expect(received).toBeUndefined();
});
});
describe('getWindowTitles', () => {
it('should return manifest titles for the open windows', () => {
const state = {
windows: {
a: { manifestId: 'amanifest' },
b: { manifestId: 'bmanifest' },
},
manifests: {
amanifest: { json: manifestFixture001 },
bmanifest: { json: manifestFixture002 },
cmanifest: { json: manifestFixture019 },
},
};
const received = getWindowTitles(state);
expect(received).toEqual({
a: 'Bodleian Library Human Freaks 2 (33)',
b: 'Test 2 Manifest: Metadata Pairs',
});
});
});
describe('getWindowViewType', () => {
const state = {
windows: {
......@@ -231,128 +75,6 @@ describe('getWindowViewType', () => {
});
});
describe('getManifestDescription', () => {
it('should return manifest description', () => {
const state = { manifests: { x: { json: manifestFixture001 } } };
const received = getManifestDescription(state, { manifestId: 'x' });
expect(received).toBe('[Handbill of Mr. Becket, [1787] ]');
});
it('should return undefined if manifest undefined', () => {
const received = getManifestDescription({ manifests: {} }, { manifestId: 'x' });
expect(received).toBeUndefined();
});
});
describe('getManifestProvider', () => {
it('should return manifest provider label', () => {
const state = { manifests: { x: { json: manifestFixtureWithAProvider } } };
const received = getManifestProvider(state, { manifestId: 'x' });
expect(received).toBe('Example Organization');
});
it('should return undefined if manifest undefined', () => {
const received = getManifestProvider({ manifests: {} }, { manifestId: 'x' });
expect(received).toBeUndefined();
});
});
describe('getSelectedCanvas', () => {
const state = {
windows: {
a: {
id: 'a',
manifestId: 'x',
canvasIndex: 1,
},
},
manifests: {
x: {
id: 'x',
json: manifestFixture019,
},
},
};
const noManifestationState = {
windows: {
a: {
id: 'a',
manifestId: 'x',
canvasIndex: 1,
},
},
manifests: {
x: {
id: 'x',
},
},
};
it('should return canvas based on the canvas index stored window state', () => {
const selectedCanvas = getSelectedCanvas(state, { windowId: 'a' });
expect(selectedCanvas.id).toEqual(
'https://purl.stanford.edu/fr426cg9537/iiif/canvas/fr426cg9537_1',
);
});
it('should return undefined when there is no manifestation to get a canvas from', () => {
const selectedCanvas = getSelectedCanvas(noManifestationState, { windowId: 'a' });
expect(selectedCanvas).toBeUndefined();
});
});
describe('getSelectedCanvases', () => {
const state = {
windows: {
a: {
id: 'a',
manifestId: 'x',
canvasIndex: 1,
view: 'book',
},
},
manifests: {
x: {
id: 'x',
json: manifestFixture019,
},
},
};
const noManifestationState = {
windows: {
a: {
id: 'a',
manifestId: 'x',
canvasIndex: 1,
},
},
manifests: {
x: {
id: 'x',
},
},
};
it('should return canvas groupings based on the canvas index stored window state', () => {
const selectedCanvases = getSelectedCanvases(state, { windowId: 'a' });
expect(selectedCanvases.length).toEqual(2);
expect(selectedCanvases.map(canvas => canvas.id)).toEqual([
'https://purl.stanford.edu/fr426cg9537/iiif/canvas/fr426cg9537_1',
'https://purl.stanford.edu/rz176rt6531/iiif/canvas/rz176rt6531_1',
]);
});
it('should return undefined when there is no manifestation to get a canvas from', () => {
const selectedCanvas = getSelectedCanvases(noManifestationState, { windowId: 'a' });
expect(selectedCanvas).toBeUndefined();
});
});
describe('getCanvasLabel', () => {
it('should return label of the canvas', () => {
const canvas = manifesto
......@@ -375,45 +97,6 @@ describe('getCanvasLabel', () => {
});
});
describe('getDestructuredMetadata', () => {
it('should return the first value of label/value attributes for each object in the array ', () => {
const iiifResource = manifesto.create(manifestFixture002);
const received = getDestructuredMetadata(iiifResource);
const expected = [{
label: 'date',
value: 'some date',
}];
expect(received).toEqual(expected);
});
it('returns an empty array if there is no metadata', () => {
const iiifResource = manifesto.create(manifestFixture019);
const received = getDestructuredMetadata(iiifResource);
expect(received).toEqual([]);
});
});
describe('getManifestMetadata', () => {
it('should return the first value of label/value attributes for each object in the array ', () => {
const state = { manifests: { x: { json: manifestFixture002 } } };
const received = getManifestMetadata(state, { manifestId: 'x' });
const expected = [{
label: 'date',
value: 'some date',
}];
expect(received).toEqual(expected);
});
it('returns an empty array if there is no metadata', () => {
const iiifResource = manifesto.create(manifestFixture019);
const received = getDestructuredMetadata(iiifResource);
expect(received).toEqual([]);
});
});
describe('getSelectedTargetAnnotations', () => {
it('returns annotations for the given canvasId that have resources', () => {
......
import manifesto from 'manifesto.js';
import manifestFixture001 from '../../fixtures/version-2/001.json';
import manifestFixture002 from '../../fixtures/version-2/002.json';
import manifestFixture019 from '../../fixtures/version-2/019.json';
import manifestFixtureWithAProvider from '../../fixtures/version-3/with_a_provider.json';
import {
getDestructuredMetadata,
getManifest,
getManifestLogo,
getManifestCanvases,
getManifestDescription,
getManifestProvider,
getManifestTitle,
getManifestThumbnail,
getManifestMetadata,
} from '../../../src/state/selectors/manifests';
describe('getManifest()', () => {
const state = {
windows: {
a: { id: 'a', manifestId: 'x' },
b: { id: 'b', manifestId: 'y' },
c: { id: 'c' },
},
manifests: {
x: { id: 'x' },
},
};
it('should return the manifest of a certain id', () => {
const received = getManifest(state, { manifestId: 'x' });
const expected = { id: 'x' };
expect(received).toEqual(expected);
});
it('should return the manifest of a certain window', () => {
const received = getManifest(state, { windowId: 'a' });
const expected = { id: 'x' };
expect(received).toEqual(expected);
});
it('should return undefined if window doesnt exist', () => {
const received = getManifest(state, { windowId: 'unknown' });
expect(received).toBeUndefined();
});
it('should return undefined if window has no manifest id', () => {
const received = getManifest(state, { windowId: 'c' });
expect(received).toBeUndefined();
});
it('should return undefined if manifest does not exist', () => {
const received = getManifest(state, { windowId: 'b' });
expect(received).toBeUndefined();
});
});
describe('getManifestLogo()', () => {
it('should return manifest logo id', () => {
const received = getManifestLogo({ manifests: { x: { json: manifestFixture001 } } }, { manifestId: 'x' });
expect(received).toEqual(manifestFixture001.logo['@id']);
});
it('should return null if manifest has no logo', () => {
const received = getManifestLogo({ manifests: { x: {} } }, { manifestId: 'x' });
expect(received).toBeUndefined();
});
});
describe('getManifestThumbnail()', () => {
it('should return manifest thumbnail id', () => {
const state = { manifests: { x: { json: manifestFixture001 } } };
const received = getManifestThumbnail(state, { manifestId: 'x' });
expect(received).toEqual(manifestFixture001.thumbnail['@id']);
});
it('returns the first canvas thumbnail id', () => {
const manifest = {
'@context': 'http://iiif.io/api/presentation/2/context.json',
'@id':
'http://iiif.io/api/presentation/2.1/example/fixtures/19/manifest.json',
'@type': 'sc:Manifest',
sequences: [
{
canvases: [
{
thumbnail: { id: 'xyz' },
},
],
},
],
};
const state = { manifests: { x: { json: manifest } } };
const received = getManifestThumbnail(state, { manifestId: 'x' });
expect(received).toEqual('xyz');
});
it('returns a thumbnail sized image url from the first canvas', () => {
const state = { manifests: { x: { json: manifestFixture019 } } };
const received = getManifestThumbnail(state, { manifestId: 'x' });
expect(received).toEqual('https://stacks.stanford.edu/image/iiif/hg676jb4964%2F0380_796-44/full/,80/0/default.jpg');
});
it('should return null if manifest has no thumbnail', () => {
const state = { manifests: { x: {} } };
const received = getManifestThumbnail(state, { manifestId: 'x' });
expect(received).toBeNull();
});
});
describe('getManifestCanvases', () => {
it('returns an empty array if the manifestation is not loaded', () => {
const state = { manifests: { x: {} } };
const received = getManifestCanvases(state, { manifestId: 'x' });
expect(received).toEqual([]);
});
it('returns canvases from the manifest', () => {
const state = { manifests: { x: { json: manifestFixture001 } } };
const received = getManifestCanvases(state, { manifestId: 'x' });
expect(received.length).toBe(1);
expect(received[0].id).toBe('https://iiif.bodleian.ox.ac.uk/iiif/canvas/9cca8fdd-4a61-4429-8ac1-f648764b4d6d.json');
});
});
describe('getManifestTitle', () => {
it('should return manifest title', () => {
const state = { manifests: { x: { json: manifestFixture001 } } };
const received = getManifestTitle(state, { manifestId: 'x' });
expect(received).toBe('Bodleian Library Human Freaks 2 (33)');
});
it('should return undefined if manifest undefined', () => {
const received = getManifestTitle({ manifests: {} }, { manifestId: 'x' });
expect(received).toBeUndefined();
});
});
describe('getManifestDescription', () => {
it('should return manifest description', () => {
const state = { manifests: { x: { json: manifestFixture001 } } };
const received = getManifestDescription(state, { manifestId: 'x' });
expect(received).toBe('[Handbill of Mr. Becket, [1787] ]');
});
it('should return undefined if manifest undefined', () => {
const received = getManifestDescription({ manifests: {} }, { manifestId: 'x' });
expect(received).toBeUndefined();
});
});
describe('getManifestProvider', () => {
it('should return manifest provider label', () => {
const state = { manifests: { x: { json: manifestFixtureWithAProvider } } };
const received = getManifestProvider(state, { manifestId: 'x' });
expect(received).toBe('Example Organization');
});
it('should return undefined if manifest undefined', () => {
const received = getManifestProvider({ manifests: {} }, { manifestId: 'x' });
expect(received).toBeUndefined();
});
});
describe('getDestructuredMetadata', () => {
it('should return the first value of label/value attributes for each object in the array ', () => {
const iiifResource = manifesto.create(manifestFixture002);
const received = getDestructuredMetadata(iiifResource);
const expected = [{
label: 'date',
value: 'some date',
}];
expect(received).toEqual(expected);
});
it('returns an empty array if there is no metadata', () => {
const iiifResource = manifesto.create(manifestFixture019);
const received = getDestructuredMetadata(iiifResource);
expect(received).toEqual([]);
});
});
describe('getManifestMetadata', () => {
it('should return the first value of label/value attributes for each object in the array ', () => {
const state = { manifests: { x: { json: manifestFixture002 } } };
const received = getManifestMetadata(state, { manifestId: 'x' });
const expected = [{
label: 'date',
value: 'some date',
}];
expect(received).toEqual(expected);
});
it('returns an empty array if there is no metadata', () => {
const iiifResource = manifesto.create(manifestFixture019);
const received = getDestructuredMetadata(iiifResource);
expect(received).toEqual([]);
});
});
import manifestFixture001 from '../../fixtures/version-2/001.json';
import manifestFixture002 from '../../fixtures/version-2/002.json';
import manifestFixture019 from '../../fixtures/version-2/019.json';
import {
getWindowTitles,
} from '../../../src/state/selectors/windows';
describe('getWindowTitles', () => {
it('should return manifest titles for the open windows', () => {
const state = {
windows: {
a: { manifestId: 'amanifest' },
b: { manifestId: 'bmanifest' },
},
manifests: {
amanifest: { json: manifestFixture001 },
bmanifest: { json: manifestFixture002 },
cmanifest: { json: manifestFixture019 },
},
};
const received = getWindowTitles(state);
expect(received).toEqual({
a: 'Bodleian Library Human Freaks 2 (33)',
b: 'Test 2 Manifest: Metadata Pairs',
});
});
});
import { createSelector } from 'reselect';
import CanvasGroupings from '../../lib/CanvasGroupings';
import { getManifestoInstance } from './manifests';
/**
* Return the current canvas selected in a window
* @param {object} state
* @param {object} props
* @param {string} props.manifestId
* @param {string} props.windowId
* @return {Object}
*/
export const getSelectedCanvas = createSelector(
[
getManifestoInstance,
(state, { windowId }) => state.windows[windowId].canvasIndex,
],
(manifest, canvasIndex) => manifest
&& manifest
.getSequences()[0]
.getCanvasByIndex(canvasIndex),
);
/**
* Return the current canvases selected in a window
* For book view returns 2, for single returns 1
* @param {object} state
* @param {object} props
* @param {string} props.manifestId
* @param {string} props.windowId
* @return {Array}
*/
export const getSelectedCanvases = createSelector(
[
getManifestoInstance,
(state, { windowId }) => state.windows[windowId],
],
(manifest, { canvasIndex, view }) => manifest
&& new CanvasGroupings(
manifest.getSequences()[0].getCanvases(),
view,
).getCanvases(canvasIndex),
);
import { createSelector } from 'reselect';
import filter from 'lodash/filter';
import flatten from 'lodash/flatten';
import manifesto, { LanguageMap } from 'manifesto.js';
import Annotation from '../../lib/Annotation';
import ManifestoCanvas from '../../lib/ManifestoCanvas';
import CanvasGroupings from '../../lib/CanvasGroupings';
/** Get the relevant manifest information */
export function getManifest(state, { manifestId, windowId }) {
return state.manifests[
manifestId
|| (windowId && state.windows[windowId] && state.windows[windowId].manifestId)
];
}
/** Instantiate a manifesto instance */
export const getManifestoInstance = createSelector(
[getManifest],
manifest => manifest && manifest.json && manifesto.create(manifest.json),
);
/**
* Get the logo for a manifest
* @param {object} state
* @param {object} props
* @param {string} props.manifestId
* @param {string} props.windowId
* @return {String|null}
*/
export const getManifestLogo = createSelector(
[getManifestoInstance],
manifest => manifest && manifest.getLogo(),
);
/**
* Return the IIIF v3 provider of a manifest or null
* @param {object} state
* @param {object} props
* @param {string} props.manifestId
* @param {string} props.windowId
* @return {String|null}
*/
export const getManifestProvider = createSelector(
[getManifestoInstance],
manifest => manifest
&& manifest.getProperty('provider')
&& manifest.getProperty('provider')[0].label
&& LanguageMap.parse(manifest.getProperty('provider')[0].label, manifest.options.locale).map(label => label.value)[0],
);
/**
* Return the supplied thumbnail for a manifest or null
* @param {object} state
* @param {object} props
* @param {string} props.manifestId
* @param {string} props.windowId
* @return {String|null}
*/
export function getManifestThumbnail(state, props) {
/** */
function getTopLevelManifestThumbnail() {
const manifest = getManifestoInstance(state, props);
return manifest
&& manifest.getThumbnail()
&& manifest.getThumbnail().id;
}
/** */
function getFirstCanvasThumbnail() {
const canvases = getManifestCanvases(state, props);
return canvases.length > 0 && canvases[0].getThumbnail() && canvases[0].getThumbnail().id;
}
/** */
function generateThumbnailFromFirstCanvas() {
const canvases = getManifestCanvases(state, props);
if (canvases.length === 0) return null;
const manifestoCanvas = new ManifestoCanvas(canvases[0]);
return manifestoCanvas.thumbnail(null, 80);
}
return getTopLevelManifestThumbnail()
|| getFirstCanvasThumbnail()
|| generateThumbnailFromFirstCanvas();
}
/**
* Return the logo of a manifest or null
* @param {object} state
* @param {object} props
* @param {string} props.manifestId
* @param {string} props.windowId
* @return {String|null}
*/
export const getManifestCanvases = createSelector(
[getManifestoInstance],
(manifest) => {
if (!manifest) {
return [];
}
if (!manifest.getSequences || !manifest.getSequences()[0]) {
return [];
}
return manifest.getSequences()[0].getCanvases();
},
);
export * from './canvases';
export * from './manifests';
export * from './windows';
/**
* Return ids and labels of canvases
......@@ -125,46 +18,6 @@ export function getIdAndLabelOfCanvases(canvases) {
}));
}
/**
* Return the current canvas selected in a window
* @param {object} state
* @param {object} props
* @param {string} props.manifestId
* @param {string} props.windowId
* @return {Object}
*/
export const getSelectedCanvas = createSelector(
[
getManifestoInstance,
(state, { windowId }) => state.windows[windowId].canvasIndex,
],
(manifest, canvasIndex) => manifest
&& manifest
.getSequences()[0]
.getCanvasByIndex(canvasIndex),
);
/**
* Return the current canvases selected in a window
* For book view returns 2, for single returns 1
* @param {object} state
* @param {object} props
* @param {string} props.manifestId
* @param {string} props.windowId
* @return {Array}
*/
export const getSelectedCanvases = createSelector(
[
getManifestoInstance,
(state, { windowId }) => state.windows[windowId],
],
(manifest, { canvasIndex, view }) => manifest
&& new CanvasGroupings(
manifest.getSequences()[0].getCanvases(),
view,
).getCanvases(canvasIndex),
);
/**
* Return annotations for an array of targets
* @param {object} state
......@@ -235,34 +88,6 @@ export function getThumbnailNavigationPosition(state, windowId) {
&& state.companionWindows[state.windows[windowId].thumbnailNavigationId].position;
}
/**
* Return manifest title
* @param {object} state
* @param {object} props
* @param {string} props.manifestId
* @param {string} props.windowId
* @return {String}
*/
export const getManifestTitle = createSelector(
[getManifestoInstance],
manifest => manifest
&& manifest.getLabel().map(label => label.value)[0],
);
/**
* Return the manifest titles for all open windows
* @param {object} state
* @return {object}
*/
export function getWindowTitles(state) {
const result = {};
Object.keys(state.windows).forEach((windowId) => {
result[windowId] = getManifestTitle(state, { windowId });
});
return result;
}
/** Return type of view in a certain window.
* @param {object} state
......@@ -275,20 +100,6 @@ export function getWindowViewType(state, windowId) {
return state.windows[windowId] && state.windows[windowId].view;
}
/**
* Return manifest description
* @param {object} state
* @param {object} props
* @param {string} props.manifestId
* @param {string} props.windowId
* @return {String}
*/
export const getManifestDescription = createSelector(
[getManifestoInstance],
manifest => manifest
&& manifest.getDescription().map(label => label.value)[0],
);
/**
* Return canvas label, or alternatively return the given index + 1 to be displayed
* @param {object} canvas
......@@ -304,36 +115,6 @@ export function getCanvasLabel(canvas, canvasIndex) {
return String(canvasIndex + 1);
}
/**
* Return metadata in a label / value structure
* This is a potential seam for pulling the i18n locale from
* state and plucking out the appropriate language.
* For now we're just getting the first.
* @param {object} Manifesto IIIF Resource (e.g. canvas, manifest)
* @return {Array[Object]}
*/
export function getDestructuredMetadata(iiifResource) {
return (iiifResource
&& iiifResource.getMetadata().map(labelValuePair => ({
label: labelValuePair.getLabel(),
value: labelValuePair.getValue(),
}))
);
}
/**
* Return manifest metadata in a label / value structure
* @param {object} state
* @param {object} props
* @param {string} props.manifestId
* @param {string} props.windowId
* @return {Array[Object]}
*/
export const getManifestMetadata = createSelector(
[getManifestoInstance],
manifest => manifest && getDestructuredMetadata(manifest),
);
/**
* Return canvas description
* @param {object} canvas
......
import { createSelector } from 'reselect';
import manifesto, { LanguageMap } from 'manifesto.js';
import ManifestoCanvas from '../../lib/ManifestoCanvas';
/** Get the relevant manifest information */
export function getManifest(state, { manifestId, windowId }) {
return state.manifests[
manifestId
|| (windowId && state.windows[windowId] && state.windows[windowId].manifestId)
];
}
/** Instantiate a manifesto instance */
export const getManifestoInstance = createSelector(
[getManifest],
manifest => manifest && manifest.json && manifesto.create(manifest.json),
);
/**
* Get the logo for a manifest
* @param {object} state
* @param {object} props
* @param {string} props.manifestId
* @param {string} props.windowId
* @return {String|null}
*/
export const getManifestLogo = createSelector(
[getManifestoInstance],
manifest => manifest && manifest.getLogo(),
);
/**
* Return the IIIF v3 provider of a manifest or null
* @param {object} state
* @param {object} props
* @param {string} props.manifestId
* @param {string} props.windowId
* @return {String|null}
*/
export const getManifestProvider = createSelector(
[getManifestoInstance],
manifest => manifest
&& manifest.getProperty('provider')
&& manifest.getProperty('provider')[0].label
&& LanguageMap.parse(manifest.getProperty('provider')[0].label, manifest.options.locale).map(label => label.value)[0],
);
/**
* Return the supplied thumbnail for a manifest or null
* @param {object} state
* @param {object} props
* @param {string} props.manifestId
* @param {string} props.windowId
* @return {String|null}
*/
export function getManifestThumbnail(state, props) {
/** */
function getTopLevelManifestThumbnail() {
const manifest = getManifestoInstance(state, props);
return manifest
&& manifest.getThumbnail()
&& manifest.getThumbnail().id;
}
/** */
function getFirstCanvasThumbnail() {
const canvases = getManifestCanvases(state, props);
return canvases.length > 0 && canvases[0].getThumbnail() && canvases[0].getThumbnail().id;
}
/** */
function generateThumbnailFromFirstCanvas() {
const canvases = getManifestCanvases(state, props);
if (canvases.length === 0) return null;
const manifestoCanvas = new ManifestoCanvas(canvases[0]);
return manifestoCanvas.thumbnail(null, 80);
}
return getTopLevelManifestThumbnail()
|| getFirstCanvasThumbnail()
|| generateThumbnailFromFirstCanvas();
}
/**
* Return the logo of a manifest or null
* @param {object} state
* @param {object} props
* @param {string} props.manifestId
* @param {string} props.windowId
* @return {String|null}
*/
export const getManifestCanvases = createSelector(
[getManifestoInstance],
(manifest) => {
if (!manifest) {
return [];
}
if (!manifest.getSequences || !manifest.getSequences()[0]) {
return [];
}
return manifest.getSequences()[0].getCanvases();
},
);
/**
* Return manifest title
* @param {object} state
* @param {object} props
* @param {string} props.manifestId
* @param {string} props.windowId
* @return {String}
*/
export const getManifestTitle = createSelector(
[getManifestoInstance],
manifest => manifest
&& manifest.getLabel().map(label => label.value)[0],
);
/**
* Return manifest description
* @param {object} state
* @param {object} props
* @param {string} props.manifestId
* @param {string} props.windowId
* @return {String}
*/
export const getManifestDescription = createSelector(
[getManifestoInstance],
manifest => manifest
&& manifest.getDescription().map(label => label.value)[0],
);
/**
* Return metadata in a label / value structure
* This is a potential seam for pulling the i18n locale from
* state and plucking out the appropriate language.
* For now we're just getting the first.
* @param {object} Manifesto IIIF Resource (e.g. canvas, manifest)
* @return {Array[Object]}
*/
export function getDestructuredMetadata(iiifResource) {
return (iiifResource
&& iiifResource.getMetadata().map(labelValuePair => ({
label: labelValuePair.getLabel(),
value: labelValuePair.getValue(),
}))
);
}
/**
* Return manifest metadata in a label / value structure
* @param {object} state
* @param {object} props
* @param {string} props.manifestId
* @param {string} props.windowId
* @return {Array[Object]}
*/
export const getManifestMetadata = createSelector(
[getManifestoInstance],
manifest => manifest && getDestructuredMetadata(manifest),
);
import { getManifestTitle } from './manifests';
/**
* Return the manifest titles for all open windows
* @param {object} state
* @return {object}
*/
export function getWindowTitles(state) {
const result = {};
Object.keys(state.windows).forEach((windowId) => {
result[windowId] = getManifestTitle(state, { windowId });
});
return result;
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment