Den anden vej af samme forbindelse. En note, der nævner en opgave, viste den; nu
viser opgaven noten. Uden det virker forbindelsen kun, hvis man tilfældigvis
sidder og læser noten, og det er den halvdel, ingen har brug for hjælp til.
Undervejs viste det sig, at en opgave slet ikke havde en adresse. Skuffen åbner
over den liste, man står på, og ændrer ingenting i URL'en — hvilket er rigtigt for
et klik og ubrugeligt for et link: man kan ikke sende nogen en opgave, og en note,
der nævner en, har ingen steder at sende dem hen. Min egen henvisningsform pegede
altså på noget, der ikke fandtes.
/opgave/{id} findes nu. Den åbner skuffen og træder til side — erstatter sig selv
med opgavens eget projekt, så man lander hvor opgaven bor, med den åben, og
tilbage-knappen ikke går gennem en side, der kun nogensinde viderestillede.
Prøven henter opgavens id fra API'et frem for fra adresselinjen, netop fordi den
ikke står der.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
51 lines
1.5 KiB
Svelte
51 lines
1.5 KiB
Svelte
<script>
|
|
/**
|
|
* A task, by address.
|
|
*
|
|
* There was no such thing until a note wanted to point at one. Opening a task
|
|
* shows a drawer over whatever list you were on and changes nothing in the URL,
|
|
* which is right for a click and useless for a link — you cannot send somebody a
|
|
* task, and a note that mentions one has nowhere to send them either.
|
|
*
|
|
* So this opens the drawer and then steps aside, replacing itself with the
|
|
* task's own project. The person lands where the task lives, with it open, and
|
|
* the back button does not walk them through a page that only ever redirected.
|
|
*/
|
|
import { page } from '$app/stores';
|
|
import { goto } from '$app/navigation';
|
|
import { api } from '$lib/api.js';
|
|
import { app } from '$lib/stores.svelte.js';
|
|
import { t } from '$lib/i18n.svelte.js';
|
|
|
|
let status = $state('loading');
|
|
|
|
$effect(() => {
|
|
open($page.params.id);
|
|
});
|
|
|
|
async function open(id) {
|
|
if (!id) return;
|
|
try {
|
|
const task = await api.getTask(id);
|
|
app.openDetail(id);
|
|
// replaceState, so Back goes where they came from rather than here.
|
|
await goto(task.project_id ? `/projekt/${task.project_id}` : '/', { replaceState: true });
|
|
} catch {
|
|
// 404 for both "no such task" and "not yours", so an id tells a stranger
|
|
// nothing about whether it exists.
|
|
status = 'missing';
|
|
}
|
|
}
|
|
</script>
|
|
|
|
{#if status === 'missing'}
|
|
<p class="clear">{t('detail.notFound')}</p>
|
|
{/if}
|
|
|
|
<style>
|
|
.clear {
|
|
padding: var(--s4);
|
|
color: var(--ink-faint);
|
|
}
|
|
</style>
|