summaryrefslogtreecommitdiff
path: root/doc
diff options
context:
space:
mode:
authorerdgeist <erdgeist@erdgeist.org>2026-07-19 17:55:46 +0200
committererdgeist <erdgeist@erdgeist.org>2026-07-19 17:55:46 +0200
commit68368d6cff798a9df8e931e8ee1f44ae0dc02a14 (patch)
tree6bd82eca8258a14a820ac1d5b025155056793df7 /doc
parente0c2d7a066793683a911bee7f7210d80eb6b2055 (diff)
Add some history for future maintainers/editors
Diffstat (limited to 'doc')
-rw-r--r--doc/DESIGN_HISTORY.md42
1 files changed, 42 insertions, 0 deletions
diff --git a/doc/DESIGN_HISTORY.md b/doc/DESIGN_HISTORY.md
new file mode 100644
index 0000000..0bf780a
--- /dev/null
+++ b/doc/DESIGN_HISTORY.md
@@ -0,0 +1,42 @@
1## Events and the calendar
2
3### Problem
4
5Calendar entries required an internal Node — every event
6needed a page somewhere in the tree. Editors avoided this: either the
7updates stream absorbed non-news content, or a page got created with
8no natural place in the navigation. The calendar widget went dormant
9rather than get used under those terms.
10
11### Rebuild.
12
13The Event model was rewritten around the RRULE humanizer
14(`app/models/concerns/rrule_humanizer.rb`) and a picker UI bound to it
15by a deliberate scope rule: the picker only generates or reads back
16RRULE shapes the humanizer can also render as prose. A picker that
17could express more than the humanizer can describe would let an
18editor create a schedule that renders as blank text on the public
19page — worse than a raw string the editor had to type by hand.
20`Event#node_id` became optional, so an event can point outward (an
21external URL) instead of requiring a page. This is what made reviving
22the calendar possible at all.
23
24### The problem that surfaced next
25
26Once events no longer needed a node, turning the calendar on directly
27would have meant every chapter's regular open evening becoming an
28entry — a handful of one-off items buried under dozens of recurring,
29low-signal rows.
30
31### Resolution:
32
33Two widgets, not one:
34
35- `open_erfas_today` took the recurring, date-filtered case — which
36 chapters are open today. Its label went through rejected drafts
37 before landing on phrasing that admits it's a curated sample, not a
38 complete listing.
39- `div#frontpage_calendar` was reserved for the one-off case —
40 conferences, memorial gatherings. Its CSS carries an unconditional
41 `display: none` with no override anywhere in the stylesheet — not a
42 bug, a widget staged for a UI that hasn't been built yet.