feat(projects): et projekts kalender kan vises som en uge
Ugen fandtes på Kommende og på Kalender, men ikke dér hvor et projekt bor — og det
er dér, "hvornår sker de her fire ting" oftest bliver spurgt.
Inde i kalendervisningen frem for som en fjerde `view_mode`. `view_mode` er
projektets og delt med alle, der kan se det, mens uge eller måned er et spørgsmål
om hvor bred skærmen er, foran hvilken der sidder én person — samme grund som
sidebjælkens bredde ligger i localStorage af. Og en fjerde værdi ville kræve en
tabelombygning: `CHECK (view_mode IN ('list','board','calendar'))` kan SQLite ikke
ændre på plads.
**Og så fandt den en fejl, der har ligget og ventet.** `cursor` blev sat med
`span === 'week' ? … : …`, hvilket læser `span` i det øjeblik komponenten bliver
til og fanger den værdi for altid. Byggeriet har advaret om det lige så længe. Så
længe hver visning havde sin egen komponent, gjorde det ingen forskel — og det
gjorde det i samme sekund, en vælger begyndte at skifte `span` på den samme.
Markøren stod på den 1. i måneden, og et skift til uge landede på ugen omkring den
1.: "27. jul.–2. aug." for en person, der kiggede på august.
Rettet, med den ene undtagelse skrevet ned: en månedsvisnings markør *er* den
første i måneden, så et skift til uge, mens man står i den indeværende måned,
skal lande på den uge, i dag ligger i — ikke på ugen omkring den 1.
Og en anden fælde, jeg selv gik i undervejs: en underklasses felter sættes *efter*
basens konstruktør er kørt. Nøglen til localStorage som et felt på en underklasse
betød, at valget blev gemt ét sted og læst et andet — en uge, man havde valgt, var
en måned igen efter en genindlæsning. Nøglen er et argument nu; et argument har
ingen rækkefølge at tage fejl af.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
dcb71f4c14
commit
868588de10
@@ -890,27 +890,55 @@ export const upcomingView = new UpcomingView();
|
||||
const CALENDAR_MODES = ['week', 'month'];
|
||||
|
||||
class CalendarViewMode {
|
||||
mode = $state(readCalendarMode());
|
||||
mode = $state('month');
|
||||
|
||||
// Nøglen som argument frem for som felt på en underklasse.
|
||||
//
|
||||
// Den vej blev prøvet og virkede ikke: en underklasses felter sættes *efter*
|
||||
// basens konstruktør er kørt, så en læsning i konstruktøren brugte basens nøgle
|
||||
// og skrivningen bagefter underklassens. Valget blev gemt ét sted og læst et
|
||||
// andet, og en uge, man havde valgt, var en måned igen efter en genindlæsning.
|
||||
// Et argument har ingen rækkefølge at tage fejl af.
|
||||
constructor(storageKey = 'verdande:calendar') {
|
||||
this.storageKey = storageKey;
|
||||
this.mode = readCalendarMode(storageKey);
|
||||
}
|
||||
|
||||
set(next) {
|
||||
if (!CALENDAR_MODES.includes(next)) return;
|
||||
this.mode = next;
|
||||
try {
|
||||
localStorage.setItem('verdande:calendar', next);
|
||||
localStorage.setItem(this.storageKey, next);
|
||||
} catch {
|
||||
// Private browsing; the choice simply will not persist.
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function readCalendarMode() {
|
||||
function readCalendarMode(key) {
|
||||
if (typeof localStorage === 'undefined') return 'month';
|
||||
const stored = localStorage.getItem('verdande:calendar');
|
||||
const stored = localStorage.getItem(key);
|
||||
return CALENDAR_MODES.includes(stored) ? stored : 'month';
|
||||
}
|
||||
|
||||
export const calendarView = new CalendarViewMode();
|
||||
|
||||
/**
|
||||
* Måned eller uge på et projekts kalender.
|
||||
*
|
||||
* Sin egen nøgle, af samme grund som Kalenders er sin egen: det er tre steder med
|
||||
* hver sit spørgsmål. Kommende åbner på en liste over de næste syv dage, Kalender
|
||||
* *er* gitteret, og et projekts kalender er en del af en side, der også kan være
|
||||
* en liste og et board. At dele værdien ville betyde, at man valgte en uge ét sted
|
||||
* og fandt et andet ændret.
|
||||
*
|
||||
* Og ikke på projektet. `view_mode` er projektets — den er delt med alle, der kan
|
||||
* se det — mens uge eller måned er et spørgsmål om, hvor bred skærmen er, foran
|
||||
* hvilken der sidder én person. Det er den samme grund, som sidebjælkens bredde
|
||||
* ligger i localStorage af.
|
||||
*/
|
||||
export const projectCalendarView = new CalendarViewMode('verdande:project-calendar');
|
||||
|
||||
/**
|
||||
* Whether the lists show what has already been finished.
|
||||
*
|
||||
|
||||
Reference in New Issue
Block a user