calendar
All repositories: gitoria
3.9 KB
// calendar.hl — `/`: the month view under the app header, with the user's private events (ticket calendar#2).// The events live in events.hl; the faces below are what the month view calls (`emit server …`, the trailing// `session` is always the server's since hybriel #16). Each answers with the events of the six weeks on screen.// Signed out: no session user → nothing is read or written.parent './main.hl'import MonthView from './month-view/month-view.hl'import { userIdOfSession } from '../users.hl'import { eventsBetween, saveEvent, deleteEvent, defaultsOf, saveDefaults, upcoming } from '../events.hl'import { describe, shift } from './month-view/reminders.hl'import { serverToday } from './month-view/clock.hl'import { isDate } from './month-view/dates.hl'__title = 'Calendar'// the request's headers (hybriel #105, names lowercase): the month view writes its names in the request's language on// the first render (calendar#6)headers = nullString requestLanguage = headers != null && headers['accept-language'] != null ? headers['accept-language'] : ''View {calendarPage {MonthView { acceptLanguage = requestLanguage }}}// the window is two dates the page shows; anything else is refusedvalidWindow = (first, last) => { return isDate(first) && isDate(last) }on server calLoad(first, last, session) {let u = userIdOfSession(session)if (u == null) { return { error = 'log in with ident first' } }if (!validWindow(first, last)) { return { error = 'not a date' } }return { events = eventsBetween(u, first, last) defaults = describe(defaultsOf(u)) soon = soonOf(u) defaultRows = defaultsOf(u) }}on server calSave(fields, first, last, session) {let u = userIdOfSession(session)if (u == null) { return { error = 'log in with ident first' } }if (!validWindow(first, last)) { return { error = 'not a date' } }if (fields == null || hlTypeName(fields) != 'Hybrid') { return { error = 'the event must be an object' } }let r = saveEvent(u, fields)if (r.error != null) { return { error = r.error } }return { events = eventsBetween(u, first, last) defaults = describe(defaultsOf(u)) soon = soonOf(u) defaultRows = defaultsOf(u) }}on server calDelete(id, first, last, session) {let u = userIdOfSession(session)if (u == null) { return { error = 'log in with ident first' } }if (!validWindow(first, last)) { return { error = 'not a date' } }let r = deleteEvent(u, id)if (r.error != null) { return { error = r.error } }return { events = eventsBetween(u, first, last) defaults = describe(defaultsOf(u)) soon = soonOf(u) defaultRows = defaultsOf(u) }}// the events with the reminders that apply, from two days back to nine days ahead (what the browser plans its notifications from)soonOf = (u) => {let t = serverToday()return upcoming(u, shift(t, -2), shift(t, 9))}// the calendar settings: the default reminders (rows)on server calSettingsLoad(session) {let u = userIdOfSession(session)if (u == null) { return { error = 'log in with ident first' } }return { rows = defaultsOf(u) defaults = describe(defaultsOf(u)) soon = soonOf(u) defaultRows = defaultsOf(u) }}on server calSettingsSave(rows, session) {let u = userIdOfSession(session)if (u == null) { return { error = 'log in with ident first' } }let r = saveDefaults(u, rows)if (r.error != null) { return { error = r.error } }return { rows = defaultsOf(u) defaults = describe(defaultsOf(u)) soon = soonOf(u) defaultRows = defaultsOf(u) }}// the same save as calSave, sent while the server cannot be reached: a statement-form emit the offline layer queues and// replays (an event that is also emitted in value form is never queued — hence its own name)on server calSaveQueued(fields, first, last, session) {let u = userIdOfSession(session)if (u == null) { return { error = 'log in with ident first' } }if (fields == null || hlTypeName(fields) != 'Hybrid') { return { error = 'the event must be an object' } }let r = saveEvent(u, fields)if (r.error != null) { return { error = r.error } }return { ok = true }}
Branches
- mainmain branch
Latest commits
- 99c73346antcolony#40: history (LOG.md), worker briefs (missions/) and reports moved here from antcolony, numbered per project; old numbers in antcolony docs/mission-map.mdmre
- 76edaa62calendar: Hybriel master ff51cf46 (re-vendor round, static workaround removed)mre
- 90a3fc2cdeploy.sh: back up live storage/.sessions/.env before every deploy (newest 5 kept)mre
- 6722b72ddeploy.sh: never send .git or .gitignore to Byrodinmre
- be099807State of 2026-09-27, before the move to gitoriamre