Skip to content

Commit 373fbbe

Browse files
Merge pull request #74 from DHBern/66-when-navigating-to-a-non-existing-verse-eg-fr276813-it-should-display-dieser-vers-existiert-nicht-in-fr-2-b-oä-instead-of-lade-text
66 When navigating to a non-existing verse, e.g. "fr2/768/13" it should display "Dieser Vers existiert nicht in Fr. 2 (b)" o.ä. instead of "Lade Text..."
2 parents fa0df90 + acf9aae commit 373fbbe

7 files changed

Lines changed: 255 additions & 99 deletions

File tree

src/lib/components/toaster.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
import { createToaster } from '@skeletonlabs/skeleton-svelte';
2+
3+
export const toaster = createToaster({ max: 3, overlap: true });

src/routes/+layout.svelte

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
import { AppBar, Modal } from '@skeletonlabs/skeleton-svelte';
66
import { page } from '$app/state';
77
import { base } from '$app/paths';
8+
import { toaster } from '$lib/components/toaster';
9+
import { Toaster } from '@skeletonlabs/skeleton-svelte';
810
/** @type {{children?: import('svelte').Snippet}} */
911
let { children } = $props();
1012
@@ -97,3 +99,5 @@
9799
<main id="page-content" class="flex-auto px-4">
98100
{@render children?.()}
99101
</main>
102+
103+
<Toaster {toaster}></Toaster>

src/routes/Devilstable.svelte

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<script>
2-
import { Popover, TagsInput } from '@skeletonlabs/skeleton-svelte';
2+
import { TagsInput } from '@skeletonlabs/skeleton-svelte';
33
import Brush from './Brush.svelte';
44
import Detail from './Detail.svelte';
55
import { summaryLabel } from '$lib/constants';

src/routes/fassungen/[thirties]/FassungenContent.svelte

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
<script>
22
import { onMount } from 'svelte';
33
import { page } from '$app/state';
4-
import { goto } from '$app/navigation';
5-
import { base } from '$app/paths';
64
import { NUMBER_OF_PAGES } from '$lib/constants';
75
import createObserver from './observer';
86

src/routes/textzeugen/[[sigla]]/[[thirties]]/[[verse]]/+page.js

Lines changed: 35 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@ export async function load({ fetch, params }) {
1111
let thirties = params.thirties ?? '1';
1212
/** @type string | boolean */
1313
let verse = params.verse?.padStart(2, '0') ?? '01';
14+
15+
const ranges = await fetch(`${api}/json/contiguous_ranges.json`).then((res) => res.json());
16+
1417
// if params.thirties is not defined, we need to find the lowest thirty & verse that exists in all siglas
1518
if (sigla?.length === 1) {
1619
const lowestPromises = fetch(`${api}/json/metadata-ms-page/${sigla[0]}.json`).then((r) =>
@@ -50,13 +53,36 @@ export async function load({ fetch, params }) {
5053
(/** @type {{ l: string, id:string | string[]; }} */ entry) =>
5154
entry.l.includes(`${thirties}.${verse}`)
5255
);
53-
54-
if (selectedIndex > 0) {
55-
returnObjects.push(data[witnes][selectedIndex - 1] ?? {});
56-
}
57-
returnObjects.push({ ...data[witnes][selectedIndex], active: true });
58-
if (selectedIndex <= data[witnes].length - 1) {
59-
returnObjects.push(data[witnes][selectedIndex + 1] ?? {});
56+
if (selectedIndex === -1) {
57+
console.warn(`No page found for ${witnes} with thirties ${thirties} and verse ${verse}.`);
58+
// loop through the l array of all pages and find the page that contains the thirties that is closest to the requested thirties
59+
const closestPages = data[witnes].reduce(
60+
(closest, current, i, array) => {
61+
const lowestThirties = Number(current.l[0].split('.')[0]);
62+
if (lowestThirties < Number(thirties)) {
63+
let returnArray = [];
64+
if (i > 0) {
65+
returnArray.push(array[i - 1]);
66+
}
67+
returnArray.push({ ...current, active: true });
68+
if (i < array.length - 1) {
69+
returnArray.push(array[i + 1]);
70+
}
71+
return returnArray;
72+
}
73+
return closest;
74+
},
75+
[{ ...data[witnes][0], active: true }, data[witnes][1]]
76+
);
77+
returnObjects = closestPages;
78+
} else {
79+
if (selectedIndex > 0) {
80+
returnObjects.push(data[witnes][selectedIndex - 1] ?? {});
81+
}
82+
returnObjects.push({ ...data[witnes][selectedIndex], active: true });
83+
if (selectedIndex <= data[witnes].length - 1) {
84+
returnObjects.push(data[witnes][selectedIndex + 1] ?? {});
85+
}
6086
}
6187
} else {
6288
returnObjects = [data[witnes][0], data[witnes][1]];
@@ -93,6 +119,7 @@ export async function load({ fetch, params }) {
93119
sigla: witnes,
94120
meta: meta ? meta[i] : false
95121
};
96-
})
122+
}),
123+
ranges: ranges['contiguous-ranges'].filter((r) => sigla?.includes(r.label))
97124
};
98125
}

src/routes/textzeugen/[[sigla]]/[[thirties]]/[[verse]]/+page.svelte

Lines changed: 61 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
import { Switch } from '@skeletonlabs/skeleton-svelte';
66
import { base } from '$app/paths';
77
import { page } from '$app/state';
8-
import { replaceState } from '$app/navigation';
8+
import { goto, replaceState } from '$app/navigation';
99
import { iiif } from '$lib/constants';
1010
1111
/** @type {{data: import('./$types').PageData}} */
@@ -62,8 +62,12 @@
6262
}
6363
return link.toString();
6464
};
65-
let localVerses = $state(Array(data.content?.length).fill(`${data.thirties}.${data.verse}`));
66-
let targetverses = $state(Array(data.content?.length).fill(`${data.thirties}.${data.verse}`));
65+
let localVerses = $state(
66+
Array(data.content?.length).fill(`${data.thirties}.${data.verse ? data.verse : '01'}`)
67+
);
68+
let targetverses = $state(
69+
Array(data.content?.length).fill(`${data.thirties}.${data.verse ? data.verse : '01'}`)
70+
);
6771
const generateLocalPagesFromData = (d) => {
6872
return d?.map((c) => {
6973
if (typeof c.meta === 'object') {
@@ -81,14 +85,18 @@
8185
if (typeof c.meta === 'object') {
8286
let meta = await c.meta;
8387
let active = meta.find((m) => m.active);
84-
return await active.iiif;
88+
return active?.iiif;
8589
}
8690
});
8791
};
8892
let currentIiif = $state(generateIiifFromData(data.content));
8993
$effect(() => {
90-
localVerses = Array(data.content?.length).fill(`${data.thirties}.${data.verse}`);
91-
targetverses = Array(data.content?.length).fill(`${data.thirties}.${data.verse}`);
94+
localVerses = Array(data.content?.length).fill(
95+
`${data.thirties}.${data.verse ? data.verse : '01'}`
96+
);
97+
targetverses = Array(data.content?.length).fill(
98+
`${data.thirties}.${data.verse ? data.verse : '01'}`
99+
);
92100
localPages = generateLocalPagesFromData(data.content);
93101
currentIiif = generateIiifFromData(data.content);
94102
});
@@ -101,8 +109,9 @@
101109
const indexCurrent = (await localPages[i]).findIndex(
102110
(/** @type {{ id: string; }} */ p) => p.id === pageInfo.id
103111
);
112+
const pageArray = await localPages[i];
104113
// Don't switch the iiif viewer on page change, just on click
105-
// localPages[i][indexCurrent]?.iiif.then((/** @type {any} */ iiif) => {
114+
//pageArray[indexCurrent]?.iiif.then((/** @type {any} */ iiif) => {
106115
// currentIiif[i] = iiif;
107116
// });
108117
const createObject = (/** @type {string} */ id) => {
@@ -114,22 +123,23 @@
114123
};
115124
};
116125
117-
//switch statement for the cases -1, 0, localPages[i].length
126+
//switch statement for the cases -1, 0,pageArray.length
118127
switch (indexCurrent) {
119128
case -1:
120-
console.error('current page not found in localPages', pageInfo.id);
129+
console.error('current page not found in localPages', pageInfo);
121130
break;
122131
case 0:
123132
if (pageInfo.previous) {
124-
localPages[i] = [createObject(pageInfo.previous), ...(await localPages[i])];
133+
localPages[i] = [createObject(pageInfo.previous), ...pageArray];
125134
}
126135
break;
127-
case localPages[i].length - 1:
136+
case pageArray.length - 1:
128137
if (pageInfo.next) {
129-
localPages[i] = [...(await localPages[i]), createObject(pageInfo.next)];
138+
localPages[i] = [...pageArray, createObject(pageInfo.next)];
130139
}
131140
break;
132141
}
142+
return true;
133143
};
134144
</script>
135145
@@ -161,7 +171,7 @@
161171
</section>
162172
{#if data.content}
163173
<div class="grid grid-cols-[repeat(auto-fit,minmax(550px,1fr))] gap-4">
164-
{#each data.content as content, i}
174+
{#each data.content as content, i (content.sigla)}
165175
<article
166176
class="grid grid-cols-[repeat(auto-fit,minmax(500px,1fr))] gap-4 preset-filled-surface-500 my-4 py-4 px-8 rounded-xl"
167177
>
@@ -203,28 +213,45 @@
203213
{#await localPages[i]}
204214
Lade Text...
205215
{:then pages}
206-
<TextzeugenContent
207-
{pages}
208-
targetverse={targetverses[i]}
209-
localVerseChange={(verse) => {
210-
localVerses[i] = verse;
211-
if (synchro) {
212-
const indexOfOther = localVerses.findIndex((v) => v != verse);
213-
if (indexOfOther != -1) {
214-
localVerses[indexOfOther] = verse;
215-
targetverses[indexOfOther] = verse;
216+
{#if pages?.length && pages[0].id}
217+
<TextzeugenContent
218+
{pages}
219+
targetverse={targetverses[i]}
220+
localVerseChange={(verse) => {
221+
localVerses[i] = verse;
222+
if (synchro) {
223+
const indexOfOther = localVerses.findIndex((v) => v != verse);
224+
if (indexOfOther != -1) {
225+
localVerses[indexOfOther] = verse;
226+
targetverses[indexOfOther] = verse;
227+
}
216228
}
217-
}
218-
replaceState(
219-
`${base}/textzeugen/${page.params.sigla}/${verse.replace('.', '/')}?${page.url.searchParams.toString()}`,
220-
{}
221-
);
222-
}}
223-
localPageChange={(
224-
/** @type {{ id: string; previous: string; next: string; }} */ pageinfo
225-
) => checklocalPages(pageinfo, i, content.sigla)}
226-
localIiifChange={(/** @type {Object} */ e) => (currentIiif[i] = e)}
227-
/>
229+
replaceState(
230+
`${base}/textzeugen/${page.params.sigla}/${verse.replace('.', '/')}?${page.url.searchParams.toString()}`,
231+
{}
232+
);
233+
}}
234+
localPageChange={(
235+
/** @type {{ id: string; previous: string; next: string; }} */ pageinfo
236+
) => {
237+
checklocalPages(pageinfo, i, content.sigla);
238+
}}
239+
localIiifChange={(/** @type {Object} */ e) => (currentIiif[i] = e)}
240+
range={data.ranges.find((r) => r.label === content.sigla).values}
241+
label={content.sigla}
242+
/>
243+
{:else}
244+
<p class="text-error-500">
245+
Keine Daten zum Vers gefunden. Möglicherweise existiert der Vers nicht? <button
246+
onclick={() => {
247+
goto(
248+
`${base}/textzeugen/${page.params.sigla}/${localVerses[i].replace('.', '/')}?${page.url.searchParams.toString()}`
249+
);
250+
}}
251+
class="btn">aktualisieren</button
252+
>
253+
</p>
254+
{/if}
228255
{/await}
229256
</section>
230257
{#if !(page.url.searchParams.get('iiif')?.split('-')[i] === 'false')}

0 commit comments

Comments
 (0)