source: Klonkt/src/views/pages/guardian.ejs@ f06ed56

main
Last change on this file since f06ed56 was f06ed56, checked in by Bart <bart@…>, 4 weeks ago

Een logboek, zodat de reden ergens blijft staan

Guardianship-events waren vluchtig: onGuardianshipEvent wekte de long-poll,
zocht in een tabel van zeven soorten of er een push bij hoorde, en liet de rest
vallen. Elf van de achttien soorten verdwenen spoorloos, met hun inhoud. Een
weigering droeg reason: 'not_a_teapot' tot precies daar en niet verder --
terwijl §4.2 eist dat de ward en zijn guardians die reden te HOREN krijgen, en
niet dat ze hem afleiden uit een aanbod dat opeens weg is.

Vastleggen en melden zijn nu twee dingen. Alles komt in ap_guardian_events;
welke gebeurtenis een mens wakker maakt blijft de aparte, korte lijst die het
altijd al was.

Ingeklapt en onderaan, want hier vraagt niets om een antwoord. Zou dit tussen
de wachtrijen staan, dan wordt "moet ik iets doen" onleesbaar -- dezelfde reden
waarom de afgehandelde hulpvragen daar al staan.

200 per account, jongste eerst. Een logboek dat oneindig groeit wordt er een
die niemand opent, en afkappen aan de verkeerde kant zou hem onbruikbaar maken
op het moment dat er juist iets gebeurt. Schrijffouten worden geslikt: het
logboek is bijzaak en mag de commit of de weigering zelf nooit meesleuren.

Onbekende soorten vallen in de PWA terug op hun ruwe naam. Zichtbaar en lelijk
is beter dan netjes en afwezig.

Co-Authored-By: Claude Opus 5 <claude@…>

  • Property mode set to 100644
File size: 4.8 KB
Line 
1<!DOCTYPE html>
2<html lang="<%= lang %>">
3<head>
4 <meta charset="utf-8">
5 <meta name="viewport" content="width=device-width, initial-scale=1">
6 <title><%= t('guardian.app_name') %></title>
7 <link rel="manifest" href="/guardian/manifest.webmanifest">
8 <link rel="icon" href="/guardian/icon.svg" type="image/svg+xml">
9 <meta name="theme-color" content="#ff6b35">
10 <link rel="stylesheet" href="/guardian/app.css">
11</head>
12<body>
13 <header class="g-head">
14 <span class="g-buoy">🛟</span>
15 <div class="g-head-txt">
16 <h1><%= t('guardian.app_name') %></h1>
17 <p class="g-sub"><%= t('guardian.tagline') %></p>
18 </div>
19 <% if (sites.length > 1) { %>
20 <select id="site-picker" aria-label="<%= t('guardian.acting_as') %>">
21 <% for (const s of sites) { %>
22 <option value="<%= s.slug %>" <%= s.slug === state.site ? 'selected' : '' %>>@<%= s.slug %></option>
23 <% } %>
24 </select>
25 <% } else { %>
26 <span class="g-me" title="<%= t('guardian.acting_as') %>">@<%= state.site %></span>
27 <% } %>
28</header>
29
30 <main>
31 <!-- 1. Hulpverzoeken, uitgelicht over alle wards heen. Dat is waar dit voor
32 bestaat, en het moet opvallen zonder dat je eerst een kind opent.
33 De volledige geschiedenis per kind staat in dat kind zijn paneel. -->
34 <section id="help-section">
35 <div class="g-sec-head">
36 <h2><%= t('guardian.help_title') %></h2>
37 <span id="help-count" class="g-badge" hidden></span>
38 </div>
39 <p class="g-sec-sub"><%= t('guardian.help_sub') %></p>
40 <div id="help-list" class="g-list"></div>
41 <p id="help-empty" class="g-empty"><%= t('guardian.help_empty') %></p>
42 </section>
43
44 <!-- 2. Nieuwe ward adopteren. -->
45 <section id="adopt-section">
46 <div class="g-sec-head"><h2><%= t('guardian.adopt_title') %></h2></div>
47 <p class="g-sec-sub"><%= t('guardian.adopt_sub') %></p>
48 <form id="adopt-form" autocomplete="off">
49 <input id="adopt-handle" type="text" inputmode="email" autocomplete="off"
50 placeholder="@kind@server.eu" aria-label="<%= t('guardian.adopt_label') %>">
51 <button type="submit" id="adopt-btn"><%= t('guardian.adopt_btn') %></button>
52 </form>
53 <p id="adopt-msg" class="g-msg" hidden></p>
54 </section>
55
56 <!-- 3. Verzonden aanvragen (nog niet beantwoord). -->
57 <section id="pending-section" hidden>
58 <div class="g-sec-head"><h2><%= t('guardian.pending_title') %></h2></div>
59 <p class="g-sec-sub"><%= t('guardian.pending_sub') %></p>
60 <div id="pending-list" class="g-list"></div>
61 </section>
62
63 <!-- 4. Mijn wards. Elk kind is een regel die opent naar een paneel met
64 alles over dat kind: instellingen, volgverzoeken, hulpvragen en
65 recente berichten. Een guardian denkt per kind, niet per functie. -->
66 <section id="wards-section">
67 <div class="g-sec-head"><h2><%= t('guardian.wards_title') %></h2></div>
68 <div id="wards-list" class="g-list"></div>
69 <p id="wards-empty" class="g-empty"><%= t('guardian.wards_empty') %></p>
70 </section>
71
72 <!-- 4b. Even afwezig (FEP-633c 3.6.1): de verantwoordelijke handeling.
73 Wie zich afmeldt telt niet mee in de besluiten, en een enkel
74 antwoord brengt je meteen terug. Alleen zichtbaar met wards. -->
75 <section id="away-section" hidden>
76 <div class="g-sec-head"><h2><%= t('guardian.away_title') %></h2></div>
77 <p class="g-sec-sub"><%= t('guardian.away_sub') %></p>
78 <div class="g-away-row">
79 <button id="away-week" class="quiet small"><%= t('guardian.away_week') %></button>
80 <button id="away-month" class="quiet small"><%= t('guardian.away_month') %></button>
81 </div>
82 <p id="away-msg" class="g-msg" hidden></p>
83 </section>
84
85 <!-- 5. Meldingen. -->
86 <section id="push-section">
87 <div class="g-sec-head"><h2><%= t('guardian.push_title') %></h2></div>
88 <p class="g-sec-sub"><%= t('guardian.push_sub') %></p>
89 <button id="push-toggle" class="quiet" data-on-label="<%= t('guardian.push_off') %>"
90 data-off-label="<%= t('guardian.push_on') %>"><%= t('guardian.push_on') %></button>
91 <p id="push-msg" class="g-msg" hidden></p>
92 </section>
93
94 <!-- 6. Het logboek (FEP-633c §4.2). Onderaan en ingeklapt, want hier vraagt
95 niets om een antwoord: het staat er zodat een besluit -- en vooral de
96 REDEN ervan -- ergens na te lezen is. Zonder dit merkte een ward een
97 weigering alleen doordat er iets uit een lijst verdween. -->
98 <section id="log-section">
99 <div class="g-sec-head"><h2><%= t('guardian.panel_history') %></h2></div>
100 <div id="g-log"></div>
101 </section>
102 </main>
103
104 <script type="application/json" id="guardian-state"><%- JSON.stringify(state) %></script>
105 <script src="/guardian/app.js" defer></script>
106</body>
107</html>
Note: See TracBrowser for help on using the repository browser.