@graview/primitives 0.1.27 → 0.1.29

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (271) hide show
  1. package/dist/app-bar.d.ts.map +1 -1
  2. package/dist/app-bar.js +9 -9
  3. package/dist/app-bar.js.map +1 -1
  4. package/dist/app-link-door.d.ts +3 -0
  5. package/dist/app-link-door.d.ts.map +1 -0
  6. package/dist/app-link-door.js +11 -0
  7. package/dist/app-link-door.js.map +1 -0
  8. package/dist/app-link.d.ts +20 -0
  9. package/dist/app-link.d.ts.map +1 -0
  10. package/dist/app-link.js +131 -0
  11. package/dist/app-link.js.map +1 -0
  12. package/dist/arrange-bar.d.ts +47 -4
  13. package/dist/arrange-bar.d.ts.map +1 -1
  14. package/dist/arrange-bar.js +73 -11
  15. package/dist/arrange-bar.js.map +1 -1
  16. package/dist/arrange-lists.d.ts +58 -1
  17. package/dist/arrange-lists.d.ts.map +1 -1
  18. package/dist/arrange-lists.js +152 -23
  19. package/dist/arrange-lists.js.map +1 -1
  20. package/dist/arrangement.d.ts.map +1 -1
  21. package/dist/arrangement.js +3 -1
  22. package/dist/arrangement.js.map +1 -1
  23. package/dist/bar-panes.d.ts +1 -0
  24. package/dist/bar-panes.d.ts.map +1 -1
  25. package/dist/bar-panes.js +1 -0
  26. package/dist/bar-panes.js.map +1 -1
  27. package/dist/chat.d.ts.map +1 -1
  28. package/dist/chat.js +3 -1
  29. package/dist/chat.js.map +1 -1
  30. package/dist/choosing.d.ts +36 -0
  31. package/dist/choosing.d.ts.map +1 -0
  32. package/dist/choosing.js +224 -0
  33. package/dist/choosing.js.map +1 -0
  34. package/dist/connections.d.ts.map +1 -1
  35. package/dist/connections.js +2 -1
  36. package/dist/connections.js.map +1 -1
  37. package/dist/declared-lens-doors.d.ts.map +1 -1
  38. package/dist/declared-lens-doors.js +5 -1
  39. package/dist/declared-lens-doors.js.map +1 -1
  40. package/dist/declared-lenses.d.ts +3 -2
  41. package/dist/declared-lenses.d.ts.map +1 -1
  42. package/dist/declared-lenses.js +5 -4
  43. package/dist/declared-lenses.js.map +1 -1
  44. package/dist/default-views.d.ts.map +1 -1
  45. package/dist/default-views.js +74 -18
  46. package/dist/default-views.js.map +1 -1
  47. package/dist/draft-frame.d.ts +1 -0
  48. package/dist/draft-frame.d.ts.map +1 -1
  49. package/dist/draft-frame.js +1 -0
  50. package/dist/draft-frame.js.map +1 -1
  51. package/dist/editable.d.ts +19 -1
  52. package/dist/editable.d.ts.map +1 -1
  53. package/dist/editable.js +62 -34
  54. package/dist/editable.js.map +1 -1
  55. package/dist/files.d.ts +1 -0
  56. package/dist/files.d.ts.map +1 -1
  57. package/dist/files.js +1 -0
  58. package/dist/files.js.map +1 -1
  59. package/dist/find.d.ts.map +1 -1
  60. package/dist/find.js +13 -6
  61. package/dist/find.js.map +1 -1
  62. package/dist/frame.d.ts +1 -2
  63. package/dist/frame.d.ts.map +1 -1
  64. package/dist/frame.js +19 -2
  65. package/dist/frame.js.map +1 -1
  66. package/dist/framework-views.d.ts +1 -0
  67. package/dist/framework-views.d.ts.map +1 -1
  68. package/dist/framework-views.js +1 -0
  69. package/dist/framework-views.js.map +1 -1
  70. package/dist/home-view.d.ts +1 -0
  71. package/dist/home-view.d.ts.map +1 -1
  72. package/dist/home-view.js +1 -0
  73. package/dist/home-view.js.map +1 -1
  74. package/dist/index.d.ts +14 -4
  75. package/dist/index.d.ts.map +1 -1
  76. package/dist/index.js +11 -4
  77. package/dist/index.js.map +1 -1
  78. package/dist/installation.js +1 -1
  79. package/dist/installation.js.map +1 -1
  80. package/dist/kind-shape.d.ts +130 -0
  81. package/dist/kind-shape.d.ts.map +1 -0
  82. package/dist/kind-shape.js +299 -0
  83. package/dist/kind-shape.js.map +1 -0
  84. package/dist/kind-stop.d.ts +16 -0
  85. package/dist/kind-stop.d.ts.map +1 -0
  86. package/dist/kind-stop.js +377 -0
  87. package/dist/kind-stop.js.map +1 -0
  88. package/dist/lens/arranging.d.ts.map +1 -1
  89. package/dist/lens/arranging.js +13 -4
  90. package/dist/lens/arranging.js.map +1 -1
  91. package/dist/lens/calendar-dates.d.ts +4 -3
  92. package/dist/lens/calendar-dates.d.ts.map +1 -1
  93. package/dist/lens/calendar-dates.js +12 -5
  94. package/dist/lens/calendar-dates.js.map +1 -1
  95. package/dist/lens/calendar-drawing.js +8 -8
  96. package/dist/lens/calendar-drawing.js.map +1 -1
  97. package/dist/lens/calendar-options.d.ts +2 -0
  98. package/dist/lens/calendar-options.d.ts.map +1 -1
  99. package/dist/lens/calendar-options.js.map +1 -1
  100. package/dist/lens/calendar-placing.d.ts +13 -0
  101. package/dist/lens/calendar-placing.d.ts.map +1 -1
  102. package/dist/lens/calendar-placing.js +23 -2
  103. package/dist/lens/calendar-placing.js.map +1 -1
  104. package/dist/lens/calendar-spans.d.ts.map +1 -1
  105. package/dist/lens/calendar-spans.js +5 -4
  106. package/dist/lens/calendar-spans.js.map +1 -1
  107. package/dist/lens/calendar-view.js +9 -5
  108. package/dist/lens/calendar-view.js.map +1 -1
  109. package/dist/lens/columns.d.ts.map +1 -1
  110. package/dist/lens/columns.js +35 -7
  111. package/dist/lens/columns.js.map +1 -1
  112. package/dist/lens/timeline.d.ts +1 -1
  113. package/dist/lens/timeline.d.ts.map +1 -1
  114. package/dist/lens/timeline.js +126 -16
  115. package/dist/lens/timeline.js.map +1 -1
  116. package/dist/lines-key.d.ts.map +1 -1
  117. package/dist/lines-key.js +11 -5
  118. package/dist/lines-key.js.map +1 -1
  119. package/dist/map-asks.d.ts +10 -0
  120. package/dist/map-asks.d.ts.map +1 -0
  121. package/dist/map-asks.js +17 -0
  122. package/dist/map-asks.js.map +1 -0
  123. package/dist/map-key.d.ts +3 -0
  124. package/dist/map-key.d.ts.map +1 -0
  125. package/dist/map-key.js +35 -0
  126. package/dist/map-key.js.map +1 -0
  127. package/dist/map-panel-door.d.ts +26 -0
  128. package/dist/map-panel-door.d.ts.map +1 -0
  129. package/dist/map-panel-door.js +42 -0
  130. package/dist/map-panel-door.js.map +1 -0
  131. package/dist/map-panel.d.ts +8 -0
  132. package/dist/map-panel.d.ts.map +1 -0
  133. package/dist/map-panel.js +351 -0
  134. package/dist/map-panel.js.map +1 -0
  135. package/dist/markdown-body.d.ts +11 -0
  136. package/dist/markdown-body.d.ts.map +1 -0
  137. package/dist/markdown-body.js +89 -0
  138. package/dist/markdown-body.js.map +1 -0
  139. package/dist/notice-stacks.d.ts +13 -0
  140. package/dist/notice-stacks.d.ts.map +1 -0
  141. package/dist/notice-stacks.js +141 -0
  142. package/dist/notice-stacks.js.map +1 -0
  143. package/dist/notices.d.ts +2 -0
  144. package/dist/notices.d.ts.map +1 -1
  145. package/dist/notices.js +30 -132
  146. package/dist/notices.js.map +1 -1
  147. package/dist/pages.d.ts +9 -1
  148. package/dist/pages.d.ts.map +1 -1
  149. package/dist/pages.js +8 -1
  150. package/dist/pages.js.map +1 -1
  151. package/dist/places.d.ts +1 -1
  152. package/dist/places.d.ts.map +1 -1
  153. package/dist/places.js +9 -5
  154. package/dist/places.js.map +1 -1
  155. package/dist/primitives/index.d.ts +11 -1
  156. package/dist/primitives/index.d.ts.map +1 -1
  157. package/dist/primitives/index.js +15 -4
  158. package/dist/primitives/index.js.map +1 -1
  159. package/dist/problem-count.d.ts +18 -0
  160. package/dist/problem-count.d.ts.map +1 -0
  161. package/dist/problem-count.js +46 -0
  162. package/dist/problem-count.js.map +1 -0
  163. package/dist/prose-editor.d.ts +4 -1
  164. package/dist/prose-editor.d.ts.map +1 -1
  165. package/dist/prose-editor.js +13 -6
  166. package/dist/prose-editor.js.map +1 -1
  167. package/dist/relation-key.d.ts +3 -1
  168. package/dist/relation-key.d.ts.map +1 -1
  169. package/dist/relation-key.js +23 -6
  170. package/dist/relation-key.js.map +1 -1
  171. package/dist/repeat-picker-door.d.ts +10 -0
  172. package/dist/repeat-picker-door.d.ts.map +1 -0
  173. package/dist/repeat-picker-door.js +13 -0
  174. package/dist/repeat-picker-door.js.map +1 -0
  175. package/dist/repeat-picker.d.ts +29 -0
  176. package/dist/repeat-picker.d.ts.map +1 -0
  177. package/dist/repeat-picker.js +64 -0
  178. package/dist/repeat-picker.js.map +1 -0
  179. package/dist/resolve-app-context.d.ts +3 -0
  180. package/dist/resolve-app-context.d.ts.map +1 -0
  181. package/dist/resolve-app-context.js +10 -0
  182. package/dist/resolve-app-context.js.map +1 -0
  183. package/dist/rule-line.d.ts.map +1 -1
  184. package/dist/rule-line.js +2 -1
  185. package/dist/rule-line.js.map +1 -1
  186. package/dist/scene-bar.js +2 -2
  187. package/dist/scene-bar.js.map +1 -1
  188. package/dist/scene-css.d.ts.map +1 -1
  189. package/dist/scene-css.js +224 -213
  190. package/dist/scene-css.js.map +1 -1
  191. package/dist/scene-places.d.ts +6 -0
  192. package/dist/scene-places.d.ts.map +1 -1
  193. package/dist/scene-places.js +14 -14
  194. package/dist/scene-places.js.map +1 -1
  195. package/dist/scene-way-back-door.d.ts +1 -0
  196. package/dist/scene-way-back-door.d.ts.map +1 -1
  197. package/dist/scene-way-back-door.js +1 -0
  198. package/dist/scene-way-back-door.js.map +1 -1
  199. package/dist/scene.d.ts +3 -1
  200. package/dist/scene.d.ts.map +1 -1
  201. package/dist/scene.js +3 -1
  202. package/dist/scene.js.map +1 -1
  203. package/dist/seat-field.js +2 -2
  204. package/dist/seat-field.js.map +1 -1
  205. package/dist/seat-panel.d.ts +1 -0
  206. package/dist/seat-panel.d.ts.map +1 -1
  207. package/dist/seat-panel.js +5 -2
  208. package/dist/seat-panel.js.map +1 -1
  209. package/dist/seeding.d.ts.map +1 -1
  210. package/dist/seeding.js +2 -1
  211. package/dist/seeding.js.map +1 -1
  212. package/dist/several-bar.d.ts +23 -0
  213. package/dist/several-bar.d.ts.map +1 -0
  214. package/dist/several-bar.js +158 -0
  215. package/dist/several-bar.js.map +1 -0
  216. package/dist/several-door.d.ts +7 -0
  217. package/dist/several-door.d.ts.map +1 -0
  218. package/dist/several-door.js +20 -0
  219. package/dist/several-door.js.map +1 -0
  220. package/dist/shell.d.ts +10 -2
  221. package/dist/shell.d.ts.map +1 -1
  222. package/dist/shell.js +15 -12
  223. package/dist/shell.js.map +1 -1
  224. package/dist/spec-css.d.ts.map +1 -1
  225. package/dist/spec-css.js +70 -55
  226. package/dist/spec-css.js.map +1 -1
  227. package/dist/spec-views.d.ts +8 -0
  228. package/dist/spec-views.d.ts.map +1 -1
  229. package/dist/spec-views.js +16 -5
  230. package/dist/spec-views.js.map +1 -1
  231. package/dist/states-bar.d.ts +15 -0
  232. package/dist/states-bar.d.ts.map +1 -0
  233. package/dist/states-bar.js +36 -0
  234. package/dist/states-bar.js.map +1 -0
  235. package/dist/text-body.d.ts +7 -3
  236. package/dist/text-body.d.ts.map +1 -1
  237. package/dist/text-body.js +10 -2
  238. package/dist/text-body.js.map +1 -1
  239. package/dist/theme.d.ts.map +1 -1
  240. package/dist/theme.js +11 -4
  241. package/dist/theme.js.map +1 -1
  242. package/dist/workbench/activity.d.ts +2 -0
  243. package/dist/workbench/activity.d.ts.map +1 -1
  244. package/dist/workbench/activity.js +5 -2
  245. package/dist/workbench/activity.js.map +1 -1
  246. package/dist/workbench/agent-seat.d.ts.map +1 -1
  247. package/dist/workbench/agent-seat.js +3 -2
  248. package/dist/workbench/agent-seat.js.map +1 -1
  249. package/dist/workbench/answer-args.d.ts +3 -1
  250. package/dist/workbench/answer-args.d.ts.map +1 -1
  251. package/dist/workbench/answer-args.js +18 -7
  252. package/dist/workbench/answer-args.js.map +1 -1
  253. package/dist/workbench/back-out.d.ts.map +1 -1
  254. package/dist/workbench/back-out.js +12 -4
  255. package/dist/workbench/back-out.js.map +1 -1
  256. package/dist/workbench/index.d.ts +1 -1
  257. package/dist/workbench/index.d.ts.map +1 -1
  258. package/dist/workbench/index.js +1 -1
  259. package/dist/workbench/index.js.map +1 -1
  260. package/dist/workbench/inspector-door.d.ts +34 -0
  261. package/dist/workbench/inspector-door.d.ts.map +1 -0
  262. package/dist/workbench/inspector-door.js +96 -0
  263. package/dist/workbench/inspector-door.js.map +1 -0
  264. package/dist/workbench/inspector.d.ts +8 -27
  265. package/dist/workbench/inspector.d.ts.map +1 -1
  266. package/dist/workbench/inspector.js +15 -28
  267. package/dist/workbench/inspector.js.map +1 -1
  268. package/dist/workbench/trail.d.ts.map +1 -1
  269. package/dist/workbench/trail.js +3 -2
  270. package/dist/workbench/trail.js.map +1 -1
  271. package/package.json +6 -6
@@ -0,0 +1,299 @@
1
+ import { dateOn, labelOf } from "@graview/core";
2
+ import { edgeWords } from "@graview/core/words";
3
+ import { fieldSpecOf } from "@graview/core/blocks";
4
+ import { districtState } from "@graview/core/city";
5
+ import { readableFields } from "@graview/core/words";
6
+ /*
7
+ * WHAT A KIND OPENS TO WHEN THE APP DREW NO PICTURE OF IT, read from its
8
+ * declaration and from its records — no React, so a test, the stop and a
9
+ * harness agree on it (`kind-stop.tsx` draws it).
10
+ *
11
+ * A district opened used to be six chips and "+30 more" in a box floating
12
+ * in an empty field. What a person wants from a set of records is what
13
+ * they are, what is going on in them, and what to do; the SHAPE of the
14
+ * picture follows the data rather than being chips for everything:
15
+ *
16
+ * - a kind with a main choice (its lifecycle's field, else one called
17
+ * status, stage, state or phase: `districtState`) and few enough records
18
+ * to stand in columns is a BOARD by that choice;
19
+ * - a kind with a main date some of whose records fall in the month around
20
+ * today is a CALENDAR on it (a week when they all fall in one);
21
+ * - everything else is a TABLE of a few columns that say something.
22
+ */
23
+ /** Past this many records a board's columns are a wall; the table pages them. */
24
+ export const BOARD_AT_MOST = 300;
25
+ /** Records that typically last longer than this many days are not a calendar's: they would fill every square. */
26
+ export const LONGEST_DAYS = 14;
27
+ /** How many rows a table draws before it offers more. */
28
+ export const TABLE_PAGE = 50;
29
+ /** How many of the kind's own facts a table gives a column each, and how many relations. */
30
+ export const TABLE_FIELDS = 3;
31
+ export const TABLE_RELATIONS = 2;
32
+ /** A field's declared type ("date", "enum", "boolean", …), through optional and default. */
33
+ export function fieldTypeOf(schema, kind, field) {
34
+ const shape = schema.tryDefinition(kind)?.fields?.shape;
35
+ const spec = shape?.[field] === undefined ? undefined : fieldSpecOf(shape[field]);
36
+ return spec?.type;
37
+ }
38
+ const fieldsOf = (schema, kind) => Object.keys((schema.tryDefinition(kind)?.fields?.shape ?? {}));
39
+ const isDate = (type) => type === "date" || type === "datetime";
40
+ /** A field that says when something is due, rather than when it happens. */
41
+ const DUE = /^(due|dueOn|dueAt|dueDate|deadline|by)$/i;
42
+ /** A field that says when something happens or starts. */
43
+ const WHEN = /^(date|on|day|when|at|start|starts|startsOn|startsAt|begins|from|sown|scheduled|scheduledFor|planned|plannedFor)$/i;
44
+ /** A yes-or-no that says something is finished. */
45
+ const DONE = /^(done|finished|complete|completed|closed)$/i;
46
+ /** The kind's main date: its `start` or `when` role, else a due date, else one named for when it happens. Undefined when it has none. */
47
+ export function mainDate(schema, kind) {
48
+ const definition = schema.tryDefinition(kind);
49
+ const fields = fieldsOf(schema, kind);
50
+ const dates = fields.filter((field) => isDate(fieldTypeOf(schema, kind, field)));
51
+ if (dates.length === 0)
52
+ return undefined;
53
+ const roles = (definition?.fieldRoles ?? {});
54
+ const role = (name) => (roles[name] !== undefined && dates.includes(roles[name]) ? roles[name] : undefined);
55
+ const field = role("start") ?? role("when") ?? dates.find((one) => DUE.test(one)) ?? dates.find((one) => WHEN.test(one));
56
+ if (!field)
57
+ return undefined;
58
+ const end = role("end") ?? dates.find((one) => one !== field && /^(end|ends|until|to|finish|finished|harvested|through)$/i.test(one));
59
+ const done = fields.find((one) => DONE.test(one) && fieldTypeOf(schema, kind, one) === "boolean");
60
+ return { field, due: DUE.test(field), ...(end ? { end } : {}), ...(done ? { done } : {}) };
61
+ }
62
+ /** Days from `a` to `b`, both YYYY-MM-DD (or a moment, read by its day). */
63
+ export function daysBetween(a, b) {
64
+ return Math.round((Date.parse(`${b.slice(0, 10)}T00:00:00Z`) - Date.parse(`${a.slice(0, 10)}T00:00:00Z`)) / 86_400_000);
65
+ }
66
+ const dayOf = (value) => (typeof value === "string" && /^\d{4}-\d{2}-\d{2}/.test(value) ? value.slice(0, 10) : undefined);
67
+ /** What a kind opens to: a board, a calendar or a table, chosen by its declaration and its records. */
68
+ export function kindShape(schema, kind, nodes, today) {
69
+ const state = districtState(schema, kind);
70
+ if (state && nodes.length > 0 && nodes.length <= BOARD_AT_MOST)
71
+ return { shape: "board", field: state.field };
72
+ const date = mainDate(schema, kind);
73
+ if (date && !date.due) {
74
+ /*
75
+ * A calendar opens on today: it is the picture only when today's month
76
+ * has something in it, and a week when everything this month falls in
77
+ * this week. A conference ten years long, or albums of thirty, is a
78
+ * table in date order instead of an empty month.
79
+ */
80
+ // A date that repeats stands where its next occurrence falls, as long as its first lasted.
81
+ const moved = (node) => {
82
+ const from = dayOf(node[date.field]);
83
+ const next = dayOf(dateOn(node, date.field, today));
84
+ return from && next ? daysBetween(from, next) : 0;
85
+ };
86
+ const spans = nodes
87
+ .map((node) => ({ from: dayOf(dateOn(node, date.field, today)), to: date.end && dayOf(node[date.end]) ? dayAfter(dayOf(node[date.end]), moved(node)) : undefined }))
88
+ .filter((span) => span.from !== undefined)
89
+ .map((span) => ({ from: span.from, to: span.to && span.to > span.from ? span.to : span.from }));
90
+ const first = `${today.slice(0, 7)}-01`;
91
+ const last = dayAfter(`${dayAfter(first, 31).slice(0, 7)}-01`, -1);
92
+ // What stands in today's month: what starts in it, or what is under way across it.
93
+ const month = spans.filter((span) => span.from <= last && span.to >= first);
94
+ /*
95
+ * A calendar draws days. Records that each last a season — a plot's
96
+ * rotation, March to October — fill every square of every month with
97
+ * the same bars and say nothing; those are a table in date order.
98
+ */
99
+ const lengths = spans.map((span) => daysBetween(span.from, span.to)).sort((a, b) => a - b);
100
+ const typical = lengths[Math.floor(lengths.length / 2)] ?? 0;
101
+ if (month.length > 0 && typical <= LONGEST_DAYS) {
102
+ const monday = dayAfter(today, -((new Date(`${today}T00:00:00Z`).getUTCDay() + 6) % 7));
103
+ const sunday = dayAfter(monday, 6);
104
+ const week = month.every((span) => span.from >= monday && span.to <= sunday);
105
+ return { shape: "calendar", start: date.field, ...(date.end ? { end: date.end } : {}), ...(date.done ? { done: date.done } : {}), range: week ? "week" : "month" };
106
+ }
107
+ }
108
+ return { shape: "table" };
109
+ }
110
+ /** The order a table of this kind opens in when nobody chose one: its main date, latest first, where it has one. */
111
+ export function tableOrder(schema, kind) {
112
+ const date = mainDate(schema, kind);
113
+ return date ? { by: date.field, direction: date.due ? "asc" : "desc" } : undefined;
114
+ }
115
+ /**
116
+ * THE LENS A SHAPE IS, as the seat drafts one (`recipeDraft`): what keeping
117
+ * the derived picture declares. A table is kept as a list of the kind's
118
+ * records in the order and grouping it was arranged in.
119
+ */
120
+ export function shapeRecipe(kind, shape, arrangement = {}) {
121
+ switch (shape.shape) {
122
+ case "board":
123
+ return { lens: "columns", kind, column: shape.field };
124
+ case "calendar":
125
+ return { lens: "calendar", kind, start: shape.start, ...(shape.end ? { end: shape.end } : {}), ...(shape.done ? { done: shape.done } : {}), range: shape.range };
126
+ case "table":
127
+ return {
128
+ lens: "blocks",
129
+ kind,
130
+ as: "row",
131
+ ...(arrangement.group?.by ? { group: arrangement.group.by } : {}),
132
+ ...(arrangement.sort ? { sort: { by: arrangement.sort.by, ...(arrangement.sort.direction === "desc" ? { direction: "desc" } : {}) } } : {}),
133
+ };
134
+ }
135
+ }
136
+ /** How many records a sample reads to choose the table's columns. */
137
+ const SAMPLE = 60;
138
+ /**
139
+ * THE TABLE'S COLUMNS: the kind's glance — the facts its declaration says a
140
+ * glance shows, else its fields in declared order — kept to the ones most
141
+ * of its records actually have, never the name again and never prose; then
142
+ * the relations most of its records have, said in the kind's own words
143
+ * ("What is held there: sessions"), whose cells are the far records' names.
144
+ */
145
+ export function tableColumns(schema, kind, nodes, graph) {
146
+ const definition = schema.tryDefinition(kind);
147
+ const sample = nodes.slice(0, SAMPLE);
148
+ const seen = new Map();
149
+ sample.forEach((node) => {
150
+ const label = labelOf(definition, node);
151
+ readableFields(node, definition, { glance: true, said: [label] }).forEach((field, at) => {
152
+ if (field.long || field.files || field.app)
153
+ return;
154
+ const held = seen.get(field.key);
155
+ if (held)
156
+ held.count++;
157
+ else
158
+ seen.set(field.key, { label: field.label, count: 1, at });
159
+ });
160
+ });
161
+ const enough = Math.max(1, Math.ceil(sample.length / 3));
162
+ const fields = [...seen.entries()]
163
+ .filter(([, one]) => one.count >= enough)
164
+ .sort((a, b) => a[1].at - b[1].at)
165
+ .slice(0, TABLE_FIELDS)
166
+ .map(([key, one]) => ({ about: "field", key, label: one.label }));
167
+ const relations = new Map();
168
+ for (const node of sample) {
169
+ const counted = new Set();
170
+ for (const [direction, edges] of [["out", graph.outEdges(node.id)], ["in", graph.inEdges(node.id)]]) {
171
+ for (const edge of edges) {
172
+ const far = graph.getNode(direction === "out" ? edge.to : edge.from);
173
+ if (!far || far.id === node.id)
174
+ continue;
175
+ const key = `${edge.kind}|${direction}`;
176
+ if (counted.has(key))
177
+ continue;
178
+ counted.add(key);
179
+ const held = relations.get(key);
180
+ if (held)
181
+ held.count++;
182
+ else
183
+ relations.set(key, { edge: edge.kind, direction, far: far.kind, count: 1 });
184
+ }
185
+ }
186
+ }
187
+ const edges = [...relations.entries()]
188
+ .sort((a, b) => b[1].count - a[1].count)
189
+ .slice(0, TABLE_RELATIONS)
190
+ .map(([key, one]) => {
191
+ const words = edgeWords(schema, one.direction === "out" ? kind : one.far, one.edge, one.direction);
192
+ return { about: "edge", key, label: words.charAt(0).toUpperCase() + words.slice(1), edge: one.edge, direction: one.direction };
193
+ });
194
+ return [...fields, ...edges];
195
+ }
196
+ /** A table cell: a field's value in words, or the far records' names — the first, and how many more. */
197
+ export function cellOf(schema, node, column, graph) {
198
+ if (column.about === "field") {
199
+ const definition = schema.tryDefinition(node.kind);
200
+ // A glance's reading: prose said by its start, Markdown's syntax taken out (FR-180).
201
+ const field = readableFields(node, definition, { excerpt: true }).find((one) => one.key === column.key);
202
+ return { text: field?.value ?? "" };
203
+ }
204
+ const edges = column.direction === "out" ? graph.outEdges(node.id) : graph.inEdges(node.id);
205
+ const names = edges
206
+ .filter((edge) => edge.kind === column.edge)
207
+ .map((edge) => graph.getNode(column.direction === "out" ? edge.to : edge.from))
208
+ .filter((far) => far !== undefined)
209
+ .map((far) => labelOf(schema.tryDefinition(far.kind), far));
210
+ if (names.length === 0)
211
+ return { text: "" };
212
+ return names.length === 1 ? { text: names[0] } : { text: `${names[0]} +${names.length - 1}`, title: names.join(", ") };
213
+ }
214
+ /** The broken rules that name one of these records, grouped by rule, most first. */
215
+ export function problemsByRule(violations, memberIds,
216
+ /** The rule's own name for itself (an invariant's `label`): a violation's label may be the record's. */
217
+ ruleLabel = () => undefined) {
218
+ const groups = new Map();
219
+ for (const violation of violations) {
220
+ const named = violation.nodeIds.filter((id) => memberIds.has(id));
221
+ if (named.length === 0 && !(violation.subjectId !== undefined && memberIds.has(violation.subjectId)))
222
+ continue;
223
+ const held = groups.get(violation.invariant) ?? { invariant: violation.invariant, label: ruleLabel(violation.invariant) || violation.label || violation.message, violations: [], records: new Set() };
224
+ held.violations.push(violation);
225
+ for (const id of named)
226
+ held.records.add(id);
227
+ if (violation.subjectId !== undefined && memberIds.has(violation.subjectId))
228
+ held.records.add(violation.subjectId);
229
+ groups.set(violation.invariant, held);
230
+ }
231
+ return [...groups.values()]
232
+ .sort((a, b) => b.violations.length - a.violations.length)
233
+ .map((group) => ({ invariant: group.invariant, label: group.label, violations: group.violations, records: [...group.records] }));
234
+ }
235
+ /** How far ahead "soon" looks, in days: today and the six after it. */
236
+ export const SOON_DAYS = 6;
237
+ export function dateFacts(schema, kind, nodes, today) {
238
+ const date = mainDate(schema, kind);
239
+ if (!date)
240
+ return undefined;
241
+ const state = districtState(schema, kind);
242
+ const finished = (node) => {
243
+ if (date.done !== undefined && node[date.done] === true)
244
+ return true;
245
+ if (!state)
246
+ return false;
247
+ const at = state.values.indexOf(String(node[state.field]));
248
+ return at >= 0 && state.tiers[at] === "done";
249
+ };
250
+ let overdue = 0;
251
+ let soon = 0;
252
+ for (const node of nodes) {
253
+ // A date that repeats counts by its next occurrence.
254
+ const day = dayOf(dateOn(node, date.field, today));
255
+ if (!day || finished(node))
256
+ continue;
257
+ const away = daysBetween(today, day);
258
+ if (date.due && away < 0)
259
+ overdue++;
260
+ else if (away >= 0 && away <= SOON_DAYS)
261
+ soon++;
262
+ }
263
+ if (overdue === 0 && soon === 0)
264
+ return undefined;
265
+ return { field: date.field, due: date.due, overdue, soon };
266
+ }
267
+ /** The day `days` after `day`, YYYY-MM-DD. */
268
+ export function dayAfter(day, days) {
269
+ return new Date(Date.parse(`${day.slice(0, 10)}T00:00:00Z`) + days * 86_400_000).toISOString().slice(0, 10);
270
+ }
271
+ /** The filter that keeps what a date fact counts: before today, or from today through the next six days. */
272
+ export function dateFilter(facts, which, today) {
273
+ return which === "overdue"
274
+ ? [{ key: facts.field, value: `before:${today}` }]
275
+ : [
276
+ { key: facts.field, value: `after:${dayAfter(today, -1)}` },
277
+ { key: facts.field, value: `before:${dayAfter(today, SOON_DAYS + 1)}` },
278
+ ];
279
+ }
280
+ /** What has happened to a kind's records since a moment: how many were added and how many changed (added ones are not counted twice). */
281
+ export function changedSince(ops, kind, since, kindOf) {
282
+ const added = new Set();
283
+ const changed = new Set();
284
+ for (const op of ops) {
285
+ if (op.at <= since)
286
+ continue;
287
+ for (const primitive of op.primitives) {
288
+ if (primitive.op === "add-node" && primitive.node?.kind === kind)
289
+ added.add(primitive.node.id);
290
+ else if (primitive.op === "patch-node" && primitive.id !== undefined && kindOf(primitive.id) === kind)
291
+ changed.add(primitive.id);
292
+ }
293
+ }
294
+ for (const id of added)
295
+ changed.delete(id);
296
+ // Only what is still here: a record added and taken away again is no news.
297
+ return { added: [...added].filter((id) => kindOf(id) === kind).length, changed: [...changed].filter((id) => kindOf(id) === kind).length };
298
+ }
299
+ //# sourceMappingURL=kind-shape.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kind-shape.js","sourceRoot":"","sources":["../src/kind-shape.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import { type AnySchema } from "@graview/core";
2
+ import "./frame.js";
3
+ export interface KindStopProps {
4
+ readonly kind: string;
5
+ /** The records the stop is of: the district's members on this side of the horizon. */
6
+ readonly members: readonly {
7
+ readonly id: string;
8
+ readonly kind: string;
9
+ }[];
10
+ /** The records a broken rule names. */
11
+ readonly flagged?: readonly string[];
12
+ /** What the place is called, when the address names it differently from the kind's plural. */
13
+ readonly label?: string;
14
+ }
15
+ export declare function KindStop<S extends AnySchema>({ kind, members: given, flagged, label }: KindStopProps): import("react").JSX.Element;
16
+ //# sourceMappingURL=kind-stop.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kind-stop.d.ts","sourceRoot":"","sources":["../src/kind-stop.tsx"],"names":[],"mappings":"AACA,OAAO,EAAsE,KAAK,SAAS,EAAwD,MAAM,eAAe,CAAC;AAkCzK,OAAO,YAAY,CAAC;AA+BpB,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,sFAAsF;IACtF,QAAQ,CAAC,OAAO,EAAE,SAAS;QAAE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC5E,uCAAuC;IACvC,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,8FAA8F;IAC9F,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AA2BD,wBAAgB,QAAQ,CAAC,CAAC,SAAS,SAAS,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAY,EAAE,KAAK,EAAE,EAAE,aAAa,+BA2FzG"}