fix(noter): niveauer i lister, flere linjer i en blok, og en søgning man kan vælge i
Tre ting meldt ind sammen. De to første manglede; den tredje var i stykker. --- man kunne søge og ikke vælge --- Regression fra #84. Siden holdt op med at SKRIVE adressen, men blev ved med at læse den ved hver ændring: let asked = $derived($page.url.searchParams.get('note')); $effect(() => { if (!asked || selectedId === asked) return; … }); Kom man fra ⌘K med `?note=<id1>`, stod `asked` fast på id1 for altid. Hvert klik på en anden række satte `selectedId`, effekten så uenigheden og åbnede id1 igen. Man blev trukket tilbage til den første træffer. En adresse, der ikke følger med, er ikke en tilstand at holde sig enig med. Den læses nu ved ankomsten — og der er TO ankomster, hvilket den første udgave af rettelsen ikke tog højde for: layoutet tegner ingenting, mens kontoen hentes, så siden monteres efter den første navigation er forbi, og en lytter registreret der hører den aldrig. `/noter?note=<id>` tastet eller fulgt udefra åbnede så ingenting. `onMount` og `afterNavigate`, samme funktion, med `id === selectedId` som værn mod at begge fyrer. --- en blok kunne ikke gemme flere linjer --- Shift+retur bliver i blokken, men det browseren lægger ind er et <br>, og `textContent` på et <br> er den tomme streng. Blokken blev skrevet til Markdown som én linje: "first linesecond line". Usynligt indtil en genindlæsning, for på skærmen står linjerne rigtigt hele tiden. `codeText()` læser blokken rekursivt og gør <br> til et linjeskift. Rekursivt, fordi indholdet ligger i et <code> inde i <pre>: en filtrering over <pre>'ens egne børn spørger det ene element om en textContent, der allerede har tabt linjeskiftet. --- lister havde ingen vej til niveau to --- Tab var ikke bundet til noget uden for forslagslisten, så den gjorde det, Tab gør: flyttede fokus ud af noten. Den rykker nu ind og shift+Tab ud, og kun inde i en liste — ellers er noten en boks, man ikke kan tabbe ud af. Og skriveren ville have tabt resultatet: `list()` læste kun en underliste, der ligger INDE i sit punkt. Lægger browseren den som søskende, og de gør det uens, blev grenen sprunget over uden lyd. At binde Tab uden den her halvdel ville have lavet en fejl, hvor indrykkede punkter forsvandt ved gemningen. Begge nye prøver måler EFTER en genindlæsning. Før den ser begge dele rigtige ud på skærmen; det er turen gennem Markdown, der afgør, om det blev skrevet ned. Fuld chromium-suite kørt to gange: 92 bestået, 0 fejlet, begge gange. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
1bb2c9cda6
commit
f34690f41a
@@ -14,8 +14,8 @@
|
||||
import { api, humanMessage } from '$lib/api.js';
|
||||
import { app } from '$lib/stores.svelte.js';
|
||||
import { page } from '$app/stores';
|
||||
import { untrack } from 'svelte';
|
||||
import { goto } from '$app/navigation';
|
||||
import { onMount, untrack } from 'svelte';
|
||||
import { afterNavigate, goto } from '$app/navigation';
|
||||
import { t, tag } from '$lib/i18n.svelte.js';
|
||||
import { NOTE, startDrag } from '$lib/dnd.js';
|
||||
import { colorVar } from '$lib/colors.js';
|
||||
@@ -511,15 +511,43 @@
|
||||
query = inURL;
|
||||
});
|
||||
|
||||
// Arriving from somewhere that names a note — a task's panel, a project's page —
|
||||
// opens it rather than dropping the person on a list to find it again.
|
||||
let asked = $derived($page.url.searchParams.get('note'));
|
||||
$effect(() => {
|
||||
if (!asked || selectedId === asked) return;
|
||||
const found = notes.find((n) => n.id === asked);
|
||||
/**
|
||||
* En note, man kommer MED — en besked fra klokken, et link fra en opgave, en
|
||||
* træffer i ⌘K. Den åbnes, så man ikke bliver sat af på en liste og skal finde
|
||||
* den igen.
|
||||
*
|
||||
* Bundet til selve navigationen og ikke til adressens indhold, og det er hele
|
||||
* pointen. Siden skriver aldrig adressen — det blev fjernet, fordi det kostede
|
||||
* bogstaver ud af søgefeltet — så `?note=` bliver stående på den, man kom med,
|
||||
* uanset hvad man klikker bagefter. En effekt, der læste den igen, hver gang
|
||||
* noget ændrede sig, så derfor `selectedId` uenig med adressen og åbnede den
|
||||
* gamle igen: man kunne søge og ikke vælge, for hvert klik på en anden række
|
||||
* sprang tilbage til den første.
|
||||
*
|
||||
* En adresse, der ikke følger med, er ikke en tilstand at holde sig enig med.
|
||||
* Den er en besked, der kommer én gang — så den læses ved ankomsten frem for
|
||||
* ved hver ændring.
|
||||
*/
|
||||
function openFromURL(url) {
|
||||
const id = url?.searchParams.get('note');
|
||||
if (!id || id === selectedId) return;
|
||||
const found = notes.find((n) => n.id === id);
|
||||
if (found) open(found);
|
||||
else api.note(asked).then(open).catch(() => {});
|
||||
});
|
||||
else api.note(id).then(open).catch(() => {});
|
||||
}
|
||||
|
||||
// To veje ind, fordi der er to måder at ankomme på, og hver af dem er blind for
|
||||
// den anden.
|
||||
//
|
||||
// `afterNavigate` alene rækker ikke: layoutet tegner ingenting, mens kontoen
|
||||
// hentes, så den her side bliver monteret EFTER den første navigation er forbi.
|
||||
// En lytter, der registreres der, hører den aldrig — `/noter?note=<id>` tastet
|
||||
// eller fulgt udefra åbnede så ingenting.
|
||||
//
|
||||
// Og `onMount` alene rækker heller ikke: går man til en anden note inde i
|
||||
// programmet, monteres siden ikke om.
|
||||
onMount(() => openFromURL($page.url));
|
||||
afterNavigate((nav) => openFromURL(nav?.to?.url ?? $page.url));
|
||||
|
||||
/**
|
||||
* Hvilken hentning der gælder.
|
||||
|
||||
Reference in New Issue
Block a user