@object-ui/plugin-gantt 17.5.0 → 17.7.0
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.
- package/CHANGELOG.md +3259 -0
- package/README.md +637 -137
- package/dist/GanttView.d.ts +65 -55
- package/dist/GanttView.d.ts.map +1 -1
- package/dist/ObjectGantt.d.ts +193 -6
- package/dist/ObjectGantt.d.ts.map +1 -1
- package/dist/QuickFilterBar.d.ts +16 -4
- package/dist/QuickFilterBar.d.ts.map +1 -1
- package/dist/ResourceWorkload.d.ts +2 -2
- package/dist/ResourceWorkload.d.ts.map +1 -1
- package/dist/index.d.ts +55 -13
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1974 -1686
- package/dist/index.umd.cjs +12 -12
- package/dist/scheduling.d.ts +17 -9
- package/dist/scheduling.d.ts.map +1 -1
- package/dist/shifts.d.ts +16 -13
- package/dist/shifts.d.ts.map +1 -1
- package/dist/tzShift.d.ts +55 -0
- package/dist/tzShift.d.ts.map +1 -0
- package/dist/useGanttTranslation.d.ts.map +1 -1
- package/dist/workload.d.ts +1 -1
- package/package.json +17 -14
- package/dist/tsconfig.tsbuildinfo +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,3264 @@
|
|
|
1
1
|
# @object-ui/plugin-gantt
|
|
2
2
|
|
|
3
|
+
## 17.7.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- af243c1: On `tree` and `chart` list views, the toolbar's Filter control and the `UserFilters`
|
|
8
|
+
chips now narrow the view, and on a `gantt` list view the toolbar's Search box now
|
|
9
|
+
narrows the chart (objectui#10250).
|
|
10
|
+
|
|
11
|
+
These three views run their own query instead of drawing the rows `ListView` fetched.
|
|
12
|
+
The tree and chart nodes carried only the authored `filter`, and the gantt node carried
|
|
13
|
+
no search term, so each control changed `ListView`'s own fetch and nothing on screen.
|
|
14
|
+
|
|
15
|
+
- The `tree` node and the object-bound `chart` node now carry the same effective filter
|
|
16
|
+
`ListView`'s own fetch sends, as the `gantt` node has since objectui#10037. The value
|
|
17
|
+
keeps its identity while its content is unchanged, so re-rendering the list does not
|
|
18
|
+
re-query the view.
|
|
19
|
+
- `ObjectGanttSchema` declares two optional keys, `search` and `searchableFields`.
|
|
20
|
+
`ObjectGantt` sends `search` as `$search` and, only alongside a term,
|
|
21
|
+
`searchableFields` as `$searchFields` — the pair a list's own query sends. A `gantt`
|
|
22
|
+
list view writes both from its toolbar Search box and the view's `searchableFields`.
|
|
23
|
+
|
|
24
|
+
Unchanged: the toolbar state still does not reach the query of a `chart` view bound to a
|
|
25
|
+
semantic `dataset`, and the toolbar Search box still does not reach the `tree` or `chart`
|
|
26
|
+
query. objectui#10326 stops offering that Search box on `tree` and `chart` views.
|
|
27
|
+
- 8673402: feat(plugin-gantt): `object-gantt` publishes the eleven `@objectstack/spec` row keys its renderer honours (objectui#11168 slice 4)
|
|
28
|
+
|
|
29
|
+
The `object-gantt` registration now declares `navigation`, `label`, `skipWeekends`, `holidays`, `persistLayout`, `viewName`, `markers`, `criticalPath`, `showBaselines`, `readOnly` and `mobileReadOnly`. Each is a member of the spec's `ComponentPropsMap['object-gantt']` row, and each was measured through the real `SchemaRenderer`, `ObjectGantt` and `GanttView` before it was declared (objectui#11111 decision 3 = B). All eleven are honoured, so the page validator no longer reports any of them as an unknown prop. Where the row's own describe is true of this renderer, the input's description starts with it word for word, followed by what the measurement added:
|
|
30
|
+
|
|
31
|
+
- `navigation`: absent opens the task's record in a drawer; `drawer`, `modal` and `popover` open that overlay; `split` opens the record beside the chart; `page` and a block without `mode` open the record page in the same tab, and `new_window` in a new tab; `none` and `preventNavigation` open nothing; `openNewTab` outranks every mode except `none`; `size` sets the overlay width. The gantt derives the record-page address from the page it is on and does not use a record navigator the host publishes, so a host that publishes one changes nothing. On the object's own list or view route that address is the record page; on any other page, such as a custom page, `/OBJECT/record/ID` is appended to the current address. On inline rows that name no object, no mode opens anything.
|
|
32
|
+
- `label`: a string, or an inline locale map resolved to the display locale, naming the exported PNG/PDF file after `gantt.exportFileName` and before the object's own label.
|
|
33
|
+
- `skipWeekends` and `holidays` (members: `yyyy-mm-dd` strings): working-day auto-schedule math, and the day view folds those days out of its axis. A non-empty `holidays` turns the working calendar on by itself.
|
|
34
|
+
- `persistLayout` and `viewName`: the `objectName:viewName` storage key; `persistLayout: false` removes the save-layout button and stores nothing.
|
|
35
|
+
- `markers`, `criticalPath`, `showBaselines` and `readOnly`.
|
|
36
|
+
- `mobileReadOnly`: on a chart narrower than 640px the chart's write paths are read-only unless `false`; the record drawer locks under `readOnly` alone, so a task's record still opens writable on a narrow chart.
|
|
37
|
+
|
|
38
|
+
The `gantt` input's description no longer names `percentageField`, which nothing reads and the spec refuses by name. It now starts with the row's own describe and states the three required members.
|
|
39
|
+
|
|
40
|
+
Nothing changes at render time: every key was already read. The README and the docs page say what each key does, including the record-page address above. The README no longer lists `{ provider: 'schema', schemaId }` as a source this chart reads: measured, a gantt carrying it queries `objectName` instead.
|
|
41
|
+
- 00f3eb5: `ObjectGanttSchema` declares the ten gantt keys `ObjectGantt` actually reads
|
|
42
|
+
(objectui#5903, triage 2026-08-24). Every one is a real, working, documented
|
|
43
|
+
feature — `readOnly`, `mobileReadOnly`, `markers`, `navigation`, `skipWeekends`,
|
|
44
|
+
`holidays`, `criticalPath`, `showBaselines`, `persistLayout`, `viewName` — and
|
|
45
|
+
none of them was discoverable from the published type, because all ten were read
|
|
46
|
+
as `(schema as any).K`. The cast was the load-bearing part: it kept the read
|
|
47
|
+
invisible to `tsc`, to the zod mirror and to the designer's registry `inputs`.
|
|
48
|
+
|
|
49
|
+
Both halves move together. The TS declaration (`packages/types/src/objectql.ts`)
|
|
50
|
+
and its zod mirror (`src/zod/objectql.zod.ts`) gain the same ten keys at the same
|
|
51
|
+
requiredness — all optional — and no `KnownDrift` entry is added. `navigation` is
|
|
52
|
+
taken from `@objectstack/spec`'s `NavigationConfigSchema` by reference rather than
|
|
53
|
+
restated, matching `ObjectGridSchema.navigation`.
|
|
54
|
+
|
|
55
|
+
⚠️ **The JUSTIFICATION for that parity clause was retired (objectui#9743); the
|
|
56
|
+
clause itself stands and did not move.** As first written it credited the
|
|
57
|
+
`zod-mirror-parity` ratchet with a zero-drift reading for this pair — but at that
|
|
58
|
+
time the ratchet measured three directions and was structurally blind to the
|
|
59
|
+
MIRRORED-but-undeclared one (objectui#9711), so a zero from it recorded that it
|
|
60
|
+
had not looked in that direction, not that nothing was there. objectui#9725
|
|
61
|
+
landed the fourth direction, and it covers this pair BY NAME:
|
|
62
|
+
`packages/types/src/__tests__/zod-mirror-parity.test.ts` registers
|
|
63
|
+
`objectql.zod.ts#ObjectGanttSchema` in both its mirror map and its declaration
|
|
64
|
+
map; `assertionMirroredUndeclaredMatchesLedger` requires every registered pair's
|
|
65
|
+
mirrored-but-undeclared key set to equal that pair's `MirroredUndeclared` ledger
|
|
66
|
+
entry — `never` for a pair the ledger does not name — and
|
|
67
|
+
`assertionNoVacuousMirroredUndeclaredMeasurement` refuses a measurement that has
|
|
68
|
+
degenerated to `any`. ⛔ Read this pair's verdict off that reconciliation, which
|
|
69
|
+
re-derives it on every run, rather than off any figure written here; when this
|
|
70
|
+
paragraph was authored, on 2026-09-18, it required no `MirroredUndeclared` entry
|
|
71
|
+
for the pair.
|
|
72
|
+
|
|
73
|
+
`ObjectGanttProps.schema` is retyped from `ObjectGridSchema` to
|
|
74
|
+
`ObjectGanttSchema`. That is what makes the declaration load-bearing: the ten
|
|
75
|
+
keys are not grid keys, so with the old prop type, dropping the casts would have
|
|
76
|
+
left the reads landing on `BaseSchema`'s index signature — the same invisibility
|
|
77
|
+
in different syntax. The grid-style `{ gantt: { … } }` block is unaffected;
|
|
78
|
+
`getGanttConfig` reads it through that index signature exactly as before, and the
|
|
79
|
+
registered renderer passes `schema: any`, so no runtime shape is turned away.
|
|
80
|
+
|
|
81
|
+
Accept-set change, stated plainly: a **declared** key is now type-validated, so
|
|
82
|
+
`readOnly: 'yes'` is refused where it used to parse green — the same narrowing
|
|
83
|
+
objectui#5074 landed for `viewMode`. An **undeclared** key is still accepted:
|
|
84
|
+
`BaseSchema` is `.passthrough()` and carries an index signature (objectui#5155's
|
|
85
|
+
structural ceiling), so declaring these ten did not buy rejection of a
|
|
86
|
+
misspelling. `packages/types/src/__tests__/gantt-declared-keys.test.ts` pins both
|
|
87
|
+
halves so neither can be misread.
|
|
88
|
+
|
|
89
|
+
The eleventh reported key, `label`, needed no declaration — `BaseSchema` already
|
|
90
|
+
carries it — so only its cast was dropped.
|
|
91
|
+
- 75bd83d: `ObjectGanttSchema` declares the flattened `GanttConfig` face `ObjectGantt`
|
|
92
|
+
actually reads (objectui#6051). `getGanttConfig` has two branches: when
|
|
93
|
+
`startDateField` and `endDateField` are both present at the TOP level it builds
|
|
94
|
+
its config from top-level keys and returns early; otherwise it reads the `gantt`
|
|
95
|
+
block. Everything the first branch reads was undeclared — and unlike
|
|
96
|
+
objectui#5903's ten, none of it was hidden behind a cast. `BaseSchema` carries
|
|
97
|
+
`[key: string]: any` (objectui#5155's structural ceiling) and the helper's
|
|
98
|
+
parameter was `ObjectGridSchema | any`, so `schema.colorField` type-checked as
|
|
99
|
+
`any` with no syntax anywhere to grep for. That is also why the census here is an
|
|
100
|
+
AST enumeration and not a compile-and-observe: an index signature absorbs every
|
|
101
|
+
literal name, so annotating the parameter compiles clean while enforcing nothing.
|
|
102
|
+
|
|
103
|
+
**27 keys join the declared surface, each additive and each with a live read
|
|
104
|
+
site.** 24 flattened `GanttConfig` members — `colorField`, `borderColorField`,
|
|
105
|
+
`dependenciesField`, `parentField`, `typeField`, `lockField`, `objectField`,
|
|
106
|
+
`summaryExtent`, `defaultCollapsedDepth`, `tooltipFields`, `baselineStartField`,
|
|
107
|
+
`baselineEndField`, `groupByField`, `resourceView`, `assigneeField`,
|
|
108
|
+
`effortField`, `capacity`, `quickFilters`, `autoZoomToFilter`, `timeSegments`,
|
|
109
|
+
`interactions`, `exportFileName`, `timeZone`, `dependencyTypes` — plus the three
|
|
110
|
+
query keys the fetch path reads, `staticData`, `filter` and `sort`. Nothing is
|
|
111
|
+
declared that the renderer does not consume.
|
|
112
|
+
|
|
113
|
+
**`GanttConfig` itself gains nine members and is a published type**, exported by
|
|
114
|
+
name from `packages/types/src/index.ts`: `lockField`, `objectField`,
|
|
115
|
+
`summaryExtent`, `defaultCollapsedDepth`, `borderColorField`, `dependencyTypes`,
|
|
116
|
+
`timeZone`, `exportFileName`, `interactions`. The entry file's diff is empty only
|
|
117
|
+
because the export list already named the type — the widening happened at the
|
|
118
|
+
declaration.
|
|
119
|
+
|
|
120
|
+
**The 28th measured key, `gantt` (the block face), is deliberately NOT declared**
|
|
121
|
+
— see the closing section.
|
|
122
|
+
|
|
123
|
+
The 24 are DERIVED from `GanttConfig` rather than restated, so the flat spelling
|
|
124
|
+
cannot fork from the block spelling, and the invariant is pinned in the type
|
|
125
|
+
system: every key of `GanttConfig` must be declared at the node's top level.
|
|
126
|
+
Making that derivation possible moved nine members — `lockField`, `objectField`,
|
|
127
|
+
`summaryExtent`, `defaultCollapsedDepth`, `borderColorField`, `dependencyTypes`,
|
|
128
|
+
`timeZone`, `exportFileName`, `interactions` — out of `plugin-gantt`'s
|
|
129
|
+
package-private `GanttConfigEx` and into `@object-ui/types`' `GanttConfig`. They
|
|
130
|
+
are a MOVE, not new vocabulary: the `gantt` block already honoured all nine, and
|
|
131
|
+
a type private to the plugin could be referenced by neither authoring face.
|
|
132
|
+
|
|
133
|
+
Both halves move together, as in objectui#5903: the TS declaration and its zod
|
|
134
|
+
mirror gain the same 27 keys at the same requiredness (all optional), the
|
|
135
|
+
spec-modelled ones taken from `GanttConfigSchema.shape` by reference, and no
|
|
136
|
+
`KnownDrift` or `UnmirroredDeclared` entry is added. The mirror builds the flat
|
|
137
|
+
face and the `gantt` block from one field map, so they are one schema expressed
|
|
138
|
+
twice.
|
|
139
|
+
|
|
140
|
+
⚠️ **The JUSTIFICATION for that parity clause was retired (objectui#9743) — the
|
|
141
|
+
same retirement objectui#5903's entry carries, for the same clause and the same
|
|
142
|
+
reason; the clause itself stands and did not move.** As first written it credited
|
|
143
|
+
the `zod-mirror-parity` ratchet with a zero-drift reading for this pair, at a time
|
|
144
|
+
when that ratchet measured three directions and was structurally blind to the
|
|
145
|
+
MIRRORED-but-undeclared one (objectui#9711), so a zero from it recorded that it
|
|
146
|
+
had not looked in that direction. objectui#9725 landed the fourth direction, and
|
|
147
|
+
it covers this pair BY NAME:
|
|
148
|
+
`packages/types/src/__tests__/zod-mirror-parity.test.ts` registers
|
|
149
|
+
`objectql.zod.ts#ObjectGanttSchema` in both its mirror map and its declaration
|
|
150
|
+
map; `assertionMirroredUndeclaredMatchesLedger` reconciles every registered pair's
|
|
151
|
+
mirrored-but-undeclared key set against that pair's `MirroredUndeclared` ledger
|
|
152
|
+
entry — `never` for a pair the ledger does not name — and
|
|
153
|
+
`assertionNoVacuousMirroredUndeclaredMeasurement` refuses a measurement that has
|
|
154
|
+
degenerated to `any`. ⛔ Read this pair's verdict off that reconciliation, which
|
|
155
|
+
re-derives it on every run, rather than off any figure written here; when this
|
|
156
|
+
paragraph was authored, on 2026-09-18, it required no `MirroredUndeclared` entry
|
|
157
|
+
for the pair.
|
|
158
|
+
|
|
159
|
+
Accept-set change, stated plainly. All 27 keys are additive — every one is
|
|
160
|
+
optional, and nothing previously legal loses its slot. What changes is that a
|
|
161
|
+
**declared** key is now type-validated, so `capacity: 'one'` and
|
|
162
|
+
`summaryExtent: 'parent'` are refused where they used to parse green. An
|
|
163
|
+
**undeclared** key is still accepted — `BaseSchema` is `.passthrough()`, so this
|
|
164
|
+
bought no rejection of misspellings. There is no narrowing anywhere in this
|
|
165
|
+
change.
|
|
166
|
+
|
|
167
|
+
**`gantt` is severed on purpose (objectui#6475), not overlooked.** It is the 28th
|
|
168
|
+
key of the measured residue and a genuine read — `getGanttConfig`'s second branch
|
|
169
|
+
honours it in full — but it is the one key whose declaration would NOT have been
|
|
170
|
+
additive. It has no mirror entry today, so a block rides through `.passthrough()`
|
|
171
|
+
unvalidated; declaring it as `GanttConfig` means it gets parsed against the spec's
|
|
172
|
+
`GanttConfigSchema`, which REQUIRES `startDateField`, `endDateField` and
|
|
173
|
+
`titleField`, and `ObjectGanttSchema` reaches the CLI's `validate` / `check`
|
|
174
|
+
through `AnyComponentSchema`. A published CLI's refusal behaviour is decided on
|
|
175
|
+
its own card, where reviewers can see what they are approving; objectui#6475
|
|
176
|
+
carries the full measurement, including the case FOR enforcing it (the renderer
|
|
177
|
+
already feeds that block to `GanttConfigSchema.safeParse` and warns, so enforcing
|
|
178
|
+
restores declared = enforced rather than inventing a contract). Today's behaviour
|
|
179
|
+
is pinned in the test file so the omission is a measured state, not a silent gap.
|
|
180
|
+
`packages/types/src/__tests__/gantt-flat-config-declared-keys.test.ts` pins both
|
|
181
|
+
halves so neither can be misread.
|
|
182
|
+
|
|
183
|
+
Which face WINS is unchanged and was not decided here: the flat branch is checked
|
|
184
|
+
first and returns early, so a node carrying both spellings still renders the flat
|
|
185
|
+
one. (`plugin-map` had the opposite precedence ruled on in objectui#5018; no
|
|
186
|
+
equivalent ruling exists for gantt.)
|
|
187
|
+
- d7acad6: **plugin-gantt: the `gantt` block now outranks the flat top-level spelling, and
|
|
188
|
+
the losing face's keys are named instead of dropped.**
|
|
189
|
+
|
|
190
|
+
`getGanttConfig` checked the flattened top-level spelling first and returned
|
|
191
|
+
early, so a node carrying both spellings rendered the flat one and every key
|
|
192
|
+
inside an authored `gantt` block was discarded with **no diagnostic** — not even
|
|
193
|
+
the `GanttConfigSchema.safeParse` warning, which sat behind that early return.
|
|
194
|
+
|
|
195
|
+
`plugin-map` had the identical two-faces shape ruled the other way (maintainer
|
|
196
|
+
ruling on objectui#5018, 2026-08-17, landed in PR #5156): the block wins, with a
|
|
197
|
+
dev-mode warning naming the ignored top-level keys. objectui#6469 inherits that
|
|
198
|
+
ruling, so the two sibling view plugins now answer the same question the same
|
|
199
|
+
way.
|
|
200
|
+
|
|
201
|
+
What changes:
|
|
202
|
+
|
|
203
|
+
- A node carrying **both** spellings now renders the **`gantt` block's** values.
|
|
204
|
+
The block is taken **whole** — the flat keys are not merged into it.
|
|
205
|
+
- In dev, `[ObjectGantt] … these top-level keys are IGNORED: …` names every
|
|
206
|
+
shadowed flat key, once per distinct shadowing.
|
|
207
|
+
- Nothing else moves. A node with only the flat spelling, or only a block, is
|
|
208
|
+
read exactly as before.
|
|
209
|
+
|
|
210
|
+
**Producer-safe:** `ObjectView` (`case 'gantt'`) and `ListView` (`case 'gantt'`)
|
|
211
|
+
both flatten `options.gantt` onto top-level keys and emit **no** `gantt` key, so
|
|
212
|
+
every gantt reached through either view layer still takes the flat branch, and
|
|
213
|
+
the new warning cannot fire on that path. This is the same producer check the
|
|
214
|
+
`plugin-map` flip pinned, re-run on today's `main`.
|
|
215
|
+
|
|
216
|
+
This **supersedes** the precedence sentence in the objectui#6051 changeset
|
|
217
|
+
(`.changeset/6051-gantt-flat-config-declared-keys.md`), which recorded the flat
|
|
218
|
+
branch winning — accurate for that change, which deliberately did not touch
|
|
219
|
+
precedence, and reversed by this one.
|
|
220
|
+
- e3d117a: `ObjectGantt` and `ObjectTree` resolve a relationship target only from the two
|
|
221
|
+
spellings a contract carries, dropping the third one no contract declares
|
|
222
|
+
(objectui#6837, second slice).
|
|
223
|
+
|
|
224
|
+
- `ObjectGantt`'s quick-filter option fetch was
|
|
225
|
+
`fd?.reference_to ?? fd?.reference ?? fd?.referenceTo`; it is now
|
|
226
|
+
`fd?.reference_to ?? fd?.reference`.
|
|
227
|
+
- `ObjectTree`'s `detectParentField` was
|
|
228
|
+
`def?.reference || def?.reference_to || def?.referenceTo`; it is now
|
|
229
|
+
`def?.reference || def?.reference_to`.
|
|
230
|
+
|
|
231
|
+
**Accept-set move — a def carrying ONLY `referenceTo` stops resolving a target
|
|
232
|
+
at these two seams.** Concretely: the gantt quick filter for that field falls
|
|
233
|
+
back to the distinct values present in the loaded rows instead of fetching the
|
|
234
|
+
referenced object's full domain, and the tree stops auto-detecting that field as
|
|
235
|
+
its parent pointer, so records render as a flat forest unless `parentField` is
|
|
236
|
+
configured explicitly. Nothing else changes; the two surviving arms are
|
|
237
|
+
untouched.
|
|
238
|
+
|
|
239
|
+
Two things bound that move:
|
|
240
|
+
|
|
241
|
+
- Any def that entered through the ingestion choke point is unaffected.
|
|
242
|
+
`normalizeSchemaReferenceKeys` reads `reference_to ?? reference ??
|
|
243
|
+
referenceTo` and stamps both snake_case keys, so a `referenceTo`-only def
|
|
244
|
+
arriving via `MetadataProvider` or `ObjectStackAdapter.getObjectSchema`
|
|
245
|
+
already carries `reference_to` before either component sees it. Only a def
|
|
246
|
+
that bypassed that door entirely is affected — and that door is not total:
|
|
247
|
+
`getObjectSchema` is a required member of the published `DataSource`
|
|
248
|
+
interface, and both components call it on the generic `dataSource`.
|
|
249
|
+
- No contract declares the deleted spelling. `@objectstack/spec` 17.2.0's
|
|
250
|
+
`FieldSchema` refuses `referenceTo` by name with `unrecognized_keys`, carrying
|
|
251
|
+
its own "Did you mean `referenceTo` -> `reference`?" rename, and `referenceTo`
|
|
252
|
+
is additionally a tombstone in `RETIRED_FIELD_KEY_TOMBSTONES` (objectui#6041)
|
|
253
|
+
at all three strip sites, so the designer read door removes it before a draft
|
|
254
|
+
round-trips.
|
|
255
|
+
|
|
256
|
+
A repo-wide structure-walk producer census found **0** emitters of `referenceTo`
|
|
257
|
+
reaching either seam, measured in the cell these components read (a value inside
|
|
258
|
+
an object schema's `fields` container) against controls `reference` (92 hits / 36
|
|
259
|
+
files) and `reference_to` (52 / 36) hot in the same pass over the same cells;
|
|
260
|
+
the only two in-cell hits are negative fixtures of the retirement machinery,
|
|
261
|
+
asserting the read door strips the key. Neither `plugin-gantt` nor `plugin-tree`
|
|
262
|
+
emits `referenceTo` anywhere, while both packages' own fixtures are hot on the
|
|
263
|
+
surviving spellings.
|
|
264
|
+
|
|
265
|
+
Pinned by `ObjectGantt.referenceArms-6837.test.tsx` and
|
|
266
|
+
`ObjectTree.referenceArms-6837.test.tsx`, which keep the live arms green beside a
|
|
267
|
+
named refusal for the deleted key.
|
|
268
|
+
|
|
269
|
+
⚠️ **Dated note, 2026-09-30 — the choke point folds, it no longer stamps both keys — objectui#11070.** "`normalizeSchemaReferenceKeys` ... stamps both snake_case keys" above held when this change landed. Later in this same release objectui#11070 (round 4) made that pass fold a legacy spelling onto `reference` without stamping `reference_to`; a def that entered through it still carries `reference`, the one arm both components keep. `.changeset/11070-reference-to-round4.md` states what ships; the text above is kept as the reading of this change.
|
|
270
|
+
- 045d20b: Relationship-target readers resolve a lookup's target from `reference` alone,
|
|
271
|
+
dropping the `reference_to` fallback arm (objectui#6837, half 2).
|
|
272
|
+
|
|
273
|
+
Maintainer ruling, 2026-08-31, 原文照录: 「objectui不是前端的项目吗?后端的元数据只要
|
|
274
|
+
对,前端按协议执行就行了呀」. Protocol normalization belongs on the SERVER; the front
|
|
275
|
+
end just executes the protocol. objectstack#13847 landed the server half — a
|
|
276
|
+
`field-reference-to-alias` conversion rewrites stored `reference_to` to
|
|
277
|
+
`reference` on the serve path and in `os migrate meta`.
|
|
278
|
+
|
|
279
|
+
`reference` is the only target spelling `@objectstack/spec`'s `FieldSchema`
|
|
280
|
+
declares. Measured on the installed 17.2.0: it refuses `reference_to`,
|
|
281
|
+
`referenceTo` and `target` with `unrecognized_keys`, each carrying its own
|
|
282
|
+
"Did you mean -> `reference`?" rename, while a nonsense key gets the same
|
|
283
|
+
refusal with NO rename hint and `reference` parses clean.
|
|
284
|
+
|
|
285
|
+
## ⚠️ BREAKING for a hand-written schema that spells `reference_to` — read this
|
|
286
|
+
|
|
287
|
+
**This is a behaviour change for BYO consumers, and it is being stated rather
|
|
288
|
+
than shipped silently.** ObjectUI is usable without an ObjectStack backend
|
|
289
|
+
(`examples/byo-backend-console`), and a hand-written TypeScript schema passes
|
|
290
|
+
through no zod door, so nothing rejects the legacy spelling at authoring time.
|
|
291
|
+
|
|
292
|
+
**The break surface is narrower than "all BYO consumers", and this is the
|
|
293
|
+
measurement rather than a blanket claim.** Two ingestion choke points stamp both
|
|
294
|
+
snake_case keys from whichever spelling arrived — `MetadataProvider`'s type
|
|
295
|
+
cache for metadata type `object`, and `ObjectStackAdapter.getObjectSchema`. Any
|
|
296
|
+
def that passed either one already carries `reference` and is **completely
|
|
297
|
+
unaffected**. What is affected is exactly:
|
|
298
|
+
|
|
299
|
+
- **A `DataSource` implementation other than `ObjectStackAdapter`.**
|
|
300
|
+
`getObjectSchema` is a required member of the published `DataSource`
|
|
301
|
+
interface, and the readers call it on the generic `dataSource` (through
|
|
302
|
+
`useSettledSchema` and directly), so a host adapter's object schema reaches
|
|
303
|
+
them raw. Every in-repo example of one is on this path:
|
|
304
|
+
`ApiDataSource`, `ValueDataSource`, `packages/types/examples/rest-data-source.ts`,
|
|
305
|
+
`examples/byo-backend-console/src/mockDataSource.ts`,
|
|
306
|
+
`packages/runner/src/lib/mockDataSource.ts`,
|
|
307
|
+
`apps/site/app/components/galleryDataSource.ts`,
|
|
308
|
+
`apps/console/src/sdui-workbench-preview.tsx`,
|
|
309
|
+
`packages/plugin-grid/demo/bulk-actions.tsx`.
|
|
310
|
+
|
|
311
|
+
**Measured on this tree, none of those eight emits a relationship target at all** —
|
|
312
|
+
`reference_to` and `reference` are both zero in each, and
|
|
313
|
+
`examples/byo-backend-console` carries no lookup or master_detail field
|
|
314
|
+
anywhere (its only `reference` hits are a vite triple-slash directive and a
|
|
315
|
+
tsconfig `references` array). The single in-repo producer that WAS on this
|
|
316
|
+
surface, `packages/plugin-gantt/demo/main.tsx`, is fixed here at the producer.
|
|
317
|
+
|
|
318
|
+
⇒ **If you author object metadata by hand and spell a lookup's target
|
|
319
|
+
`reference_to`, rename that key to `reference`.** Symptom if you do not: the
|
|
320
|
+
target silently fails to resolve, and the affected surface degrades rather than
|
|
321
|
+
erroring — a related list is not derived, a gantt quick filter falls back to the
|
|
322
|
+
distinct values in the loaded rows instead of the referenced object's full
|
|
323
|
+
domain, a tree stops auto-detecting its parent pointer, a lookup cell shows a
|
|
324
|
+
raw id, a chart's group-by labels stay unresolved.
|
|
325
|
+
|
|
326
|
+
The ingestion choke point now emits a **dev-mode warning** when a def arrives
|
|
327
|
+
carrying only `reference_to` or `referenceTo` and no `reference`. It names the
|
|
328
|
+
object, the field and the offending key, and points at this ruling. Stamping is
|
|
329
|
+
deliberately unchanged, so nothing that worked stops working. It is memoised
|
|
330
|
+
once per **(object name, field name, spelling, target value)** — every segment
|
|
331
|
+
of that key is pinned, in both directions, in
|
|
332
|
+
`reference-keys.legacyWarning-6837.test.ts`.
|
|
333
|
+
|
|
334
|
+
⛔ **This warning does NOT cover the break described above, and it is worth being
|
|
335
|
+
exact about that rather than letting it read as mitigation.** It lives in
|
|
336
|
+
`normalizeFieldReferenceKeys`, reachable only through
|
|
337
|
+
`normalizeSchemaReferenceKeys`, which has exactly two production call sites —
|
|
338
|
+
`MetadataProvider` (metadata type `object`) and
|
|
339
|
+
`ObjectStackAdapter.getObjectSchema`. Both of those also STAMP the def, so the
|
|
340
|
+
warning fires precisely where the def still resolves and nothing is broken. A
|
|
341
|
+
hand-written schema served through any OTHER `DataSource` — the break surface —
|
|
342
|
+
reaches a reader raw: it never passes through this code and produces **no
|
|
343
|
+
warning at all**. On that path the failure is exactly as silent as before.
|
|
344
|
+
A reader-side or shared-resolver diagnostic, which would cover it, remains open
|
|
345
|
+
on objectui#6837.
|
|
346
|
+
|
|
347
|
+
⚠️ **Dated note, 2026-09-29 — the call-site count above has since moved —
|
|
348
|
+
objectui#7650.** "exactly two production call sites" above held when this change landed
|
|
349
|
+
(`045d20ba8`). Later in this same release objectui#7650 (PR objectui#8868) added a call
|
|
350
|
+
on `MetadataProvider`'s by-name object-schema serve path. Re-measured for objectui#10979
|
|
351
|
+
on `main` at `2eaf5be27`, `normalizeSchemaReferenceKeys` had three production call sites:
|
|
352
|
+
two in `MetadataProvider`, on its list path and on its by-name path, and one in
|
|
353
|
+
`ObjectStackAdapter.getObjectSchema`.
|
|
354
|
+
`.changeset/7650-metadata-item-reference-canonicalisation.md` (PR objectui#8868) states
|
|
355
|
+
what ships; the text above is kept as the reading of this change.
|
|
356
|
+
|
|
357
|
+
## What did NOT change
|
|
358
|
+
|
|
359
|
+
**Every key these readers EMIT is byte-identical**, and that was verified
|
|
360
|
+
mechanically over the whole diff rather than asserted. Eleven of the sixteen
|
|
361
|
+
sites write a target onto a bag whose own contract spells it `reference_to` (or
|
|
362
|
+
camelCase `referenceTo`): the six whose read and write share a line —
|
|
363
|
+
`RecordDetailDrawer`, `RelatedList`, `buildDefaultPageSchema`, `ListView`,
|
|
364
|
+
`FilterConditionField`, `resolveActionParams` — plus five more that read on one
|
|
365
|
+
line and emit on another, and so are just as much emitters: `RecordDetailView`,
|
|
366
|
+
`RecordMetaFooter`, `ObjectGallery`, `fieldEnrichment` (all `reference_to`) and
|
|
367
|
+
`UserFilters` (`referenceTo`). Only the right-hand read narrowed anywhere; the
|
|
368
|
+
emitted key is what its target contract declares, and renaming it would be a
|
|
369
|
+
separate change.
|
|
370
|
+
|
|
371
|
+
**Three readers were deliberately left alone.** `LookupCellRenderer`
|
|
372
|
+
(`fields/src/index.tsx`), `LookupField` and `UserField` read `FieldMetadata` —
|
|
373
|
+
ObjectUI's OWN contract, whose `LookupFieldMetadata` declares `reference_to` and
|
|
374
|
+
never declares `reference`. They are fed by the emitters above and by published
|
|
375
|
+
example schemas (`examples/schema-catalog/src/schemas/fields-lookup/*.json`), so
|
|
376
|
+
narrowing them would break in-repo producers, and `plugin-grid`'s
|
|
377
|
+
`relationalMetaCopySet.derivation.test.ts` re-derives its read set from exactly
|
|
378
|
+
those three sources — where `reference_to` is recorded with verdict
|
|
379
|
+
`adapter-stamped`. `DetailViewFieldSchema` is likewise untouched.
|
|
380
|
+
|
|
381
|
+
⚠️ **Dated note, 2026-09-30 — the stamp, the three readers and the emitted key have since moved — objectui#11070.** Later in this same release objectui#11070 (round 4) retired `reference_to` inside ObjectUI as well. `normalizeFieldReferenceKeys` now FOLDS a legacy `reference_to` / `referenceTo` onto `reference` and no longer stamps `reference_to`, so "Stamping is deliberately unchanged" and "stamp both snake_case keys" above no longer describe what ships. `LookupCellRenderer`, `LookupField` and `UserField` read `reference` only; `LookupFieldMetadata`, `MasterDetailFieldMetadata` and `DetailViewField` (with `DetailViewFieldSchema`) declare `reference`; and the emitters listed under "What did NOT change" write `reference`. A hand-written schema served through a `DataSource` other than `ObjectStackAdapter` that spells only `reference_to` therefore also loses the lookup picker's target and the read cell's name. `.changeset/11070-reference-to-round4.md` states what ships; the text above is kept as the reading of this change.
|
|
382
|
+
- bf244f4: Size the gantt task list from its container, and give a row's dates ONE predicate
|
|
383
|
+
(objectui#7204, objectui#7224; maintainer ruling 2026-09-02, option Y).
|
|
384
|
+
|
|
385
|
+
**A row could show no dates at all.** Two gates decided whether a row's dates were
|
|
386
|
+
painted, and they read two different widths. The Start/End columns were gated on the
|
|
387
|
+
container-derived task-list width; the `8/26 → 9/2` sublabel under the title was gated
|
|
388
|
+
by the component's own `@media (min-width: 640px) { .gantt-sm-hidden { display: none } }`
|
|
389
|
+
rule, which reads the viewport. Between a 640px and a 1023px container both were shut,
|
|
390
|
+
so the row's dates existed in the DOM twice and were painted zero times. The same hole
|
|
391
|
+
opened at any width once the splitter was dragged under the threshold.
|
|
392
|
+
|
|
393
|
+
The sublabel now renders on exactly the complement of the Start/End columns, both from
|
|
394
|
+
the same container-derived width, and the media rule is gone. A row always carries its
|
|
395
|
+
dates one way or the other.
|
|
396
|
+
|
|
397
|
+
**And the task list no longer caps at 320px.** From a 1024px container up, the pane
|
|
398
|
+
takes 3/8 of the container clamped to `[320, 560]` instead of a flat 320. At 1440 that
|
|
399
|
+
is 540px, which leaves the title 287px with the Start/End columns still painted — a
|
|
400
|
+
40-character title measures 262px in the row's font, so real-world task names stop
|
|
401
|
+
truncating to about seven characters while several hundred pixels of chart sit empty.
|
|
402
|
+
Measured in Chromium at a 1440px container: title 53px before, 287px after.
|
|
403
|
+
|
|
404
|
+
The Start/End threshold moves from an estimated 280 to a derived **412** — 32 row
|
|
405
|
+
padding + 160 for the two columns + 28 for the open-details slot + 32 of title
|
|
406
|
+
furniture + 160 minimum title, each term traced to the markup that spends it. Below it
|
|
407
|
+
the sublabel carries the dates. One consequence worth stating: between a 1024px and a
|
|
408
|
+
1097px container the columns are now off and the dates ride the sublabel, which trades
|
|
409
|
+
two 80px date cells for a title that grows from 67px to 291px.
|
|
410
|
+
|
|
411
|
+
Not fixed here, and unchanged: a row's `depth * 14` indent is unbounded, so no single
|
|
412
|
+
default keeps a deeply nested row legible.
|
|
413
|
+
- 7c3df8f: A non-grid view's fetch now carries a platform row ceiling, and crossing it is
|
|
414
|
+
never silent (objectui#7210, maintainer ruling a′, 2026-09-02).
|
|
415
|
+
|
|
416
|
+
Before this, `ObjectGantt`, `ObjectCalendar`, `ObjectMap` and `ObjectTree` each
|
|
417
|
+
issued a `find` with **no `$top` at all**, so the request returned the entire
|
|
418
|
+
filtered result set. At the 186 rows the card was filed from that is invisible;
|
|
419
|
+
on an object with 100k scheduled rows it is the whole table into the browser,
|
|
420
|
+
and nothing an author could write — `pagination.pageSize` included — could
|
|
421
|
+
bound a request that never carried a cap to begin with.
|
|
422
|
+
|
|
423
|
+
**What changed.** Those four fetches now ask for `NON_GRID_ROW_CEILING_TOP`
|
|
424
|
+
rows, draw at most `NON_GRID_ROW_CEILING` of them, and when the result set was
|
|
425
|
+
larger they render a footnote naming both numbers, verbatim as it renders:
|
|
426
|
+
*"Showing the first 2000 of 41234 records. Narrow the filter."* Below the
|
|
427
|
+
ceiling nothing changes: the full set draws and no footnote appears.
|
|
428
|
+
|
|
429
|
+
The four view packages take a **minor**, not a patch: a result set above the
|
|
430
|
+
ceiling is no longer drawn in full, which is a behaviour break whatever the
|
|
431
|
+
fixed group does to the released version number.
|
|
432
|
+
|
|
433
|
+
**The ceiling is a platform constant, not an authorable key** — `2000`, exported
|
|
434
|
+
from `@object-ui/react` as `NON_GRID_ROW_CEILING`. An authored `limit` or
|
|
435
|
+
`dataSource: { limit }` still does not reach these queries, by the same ruling;
|
|
436
|
+
three alternatives were rejected with it (a documentation note only — still the
|
|
437
|
+
whole table; truncating at `pageSize` — silent, and a complete schedule capped
|
|
438
|
+
at one page; an authorable `maxRows` — a new permanent key every author sets).
|
|
439
|
+
|
|
440
|
+
**Why 2,000.** One constant for all four, so the binding view sets it. Measured
|
|
441
|
+
in this repo's jsdom lane: gantt, calendar and map hold their DOM flat as rows
|
|
442
|
+
grow (virtualised task list; four events per day cell; auto-clustering above
|
|
443
|
+
100 markers), while `ObjectTree` flattens every expanded node into the document
|
|
444
|
+
at a linear **5.2 DOM elements per record** with no virtualisation. 2,000 rows
|
|
445
|
+
is where the worst of the four lands at ~10,400 elements — an order of
|
|
446
|
+
magnitude above Lighthouse's "excessive DOM size" warning, and still ~10x the
|
|
447
|
+
real application result set this card came from.
|
|
448
|
+
|
|
449
|
+
New exports on `@object-ui/react`: `NON_GRID_ROW_CEILING`,
|
|
450
|
+
`NON_GRID_ROW_CEILING_TOP`, `applyNonGridRowCeiling`, `NonGridRowCeilingNote`
|
|
451
|
+
and the type `NonGridCeilingResult`. Two new `common.*` i18n keys carry the
|
|
452
|
+
footnote copy in all ten packs.
|
|
453
|
+
- db3896c: `ObjectGantt` refreshes in place when its query really changes, instead of tearing the chart down to the loading placeholder (objectui#7237).
|
|
454
|
+
|
|
455
|
+
Once the chart has painted, a change to its sort, filter, permissions, search or bound source re-runs the query with the chart still mounted, so it keeps its scroll position, its collapsed groups and any inline edit in progress. While the query runs, a thin indeterminate bar over the chart marks the rows on screen as the previous answer, and the rows are replaced when the new answer lands. It is the same `RefreshIndicator` that `ObjectGrid`, `ListView` and `ObjectChart` draw over their rows. The initial load still shows the loading placeholder.
|
|
456
|
+
|
|
457
|
+
The bar also shows during the chart's other in-place re-reads: the toolbar refresh, the re-read after a drag, a dependency link, a delete or a field edit, and a re-read triggered by the data-invalidation bus. Those already kept the chart mounted, but the only sign of them was a disabled refresh button.
|
|
458
|
+
|
|
459
|
+
A changed query that fails is still reported as an error, as it was before. Only a re-read of the same query keeps its last good rows when it fails.
|
|
460
|
+
|
|
461
|
+
`@object-ui/i18n`: new key `gantt.aria.refreshing`, the bar's accessible name, in all ten locale packs.
|
|
462
|
+
- b041b9c: `@object-ui/core` publishes `resolveRecordSourceObjectName`, the ONE reader for "which
|
|
463
|
+
object is this block bound to".
|
|
464
|
+
|
|
465
|
+
Six view plugins each spelled that resolution locally — `ObjectCalendar` twice,
|
|
466
|
+
`ObjectGantt`, `ObjectTree` twice, `ObjectMap`, `ObjectGrid` — and had drifted: three
|
|
467
|
+
wrote `?? schema.objectName`, one `|| ''`, one `: undefined`, one an `'object' in
|
|
468
|
+
dataConfig` test. They now delegate to one function that states the published
|
|
469
|
+
record-source ladder `77cb489b4` declared (`data`, then `staticData`, then `objectName`) once.
|
|
470
|
+
|
|
471
|
+
**No behaviour changes.** Each site's pre-collapse expression is transcribed verbatim
|
|
472
|
+
into `record-source.behaviourNeutrality-7627.test.ts` and asserted equal to its
|
|
473
|
+
post-collapse spelling across the whole contract-valid input matrix — both bindings
|
|
474
|
+
present, data only, `objectName` only, empty `objectName`, empty `data.object`, the
|
|
475
|
+
`api` / `value` / `staticData` / array-shorthand providers, and nothing bound.
|
|
476
|
+
|
|
477
|
+
**Two questions stay two questions.** `normalizeListViewSchema`'s gap-fill (#7477,
|
|
478
|
+
ruling B, landed as `00d2fa682`) is untouched and is NOT re-pointed at the new reader: it answers
|
|
479
|
+
how `objectName` gets POPULATED when absent, where an already-present `objectName` wins.
|
|
480
|
+
The new reader answers which object a block RESOLVES, where the `data` block wins — the
|
|
481
|
+
order declared on both published faces in `@object-ui/types` and pinned by
|
|
482
|
+
`objectql-record-source-refinement-6939.test.ts`. Merging them would silently override
|
|
483
|
+
one standing ruling or the other.
|
|
484
|
+
|
|
485
|
+
**`ObjectGantt`'s `persistLayoutKey` is deliberately excluded** and keeps its inverted
|
|
486
|
+
order, with an in-place comment saying why: its receiver is a localStorage key
|
|
487
|
+
(`gantt-layout:KEY:filters`), not a record source, so re-pointing it would orphan every
|
|
488
|
+
saved layout and filter-chip set of a view carrying both bindings. Two more sites the
|
|
489
|
+
finding listed are not object-name readers at all and were struck: `ObjectGantt`'s
|
|
490
|
+
refresh-handler predicate (`object` OR `api`) and `plugin-dashboard`'s `isObjectProvider`
|
|
491
|
+
type-guard over a widget's `data`.
|
|
492
|
+
|
|
493
|
+
`useSettledSchema`'s doc comment stops prescribing the hand-written ladder at all four
|
|
494
|
+
lines that taught it, so the copies cannot re-seed from the hook that replaced them.
|
|
495
|
+
- edea22a: **BREAKING** — `SchemaRendererProvider`'s `dataSource` prop, and the context
|
|
496
|
+
type every `useSchemaContext()` consumer reads back, are the published
|
|
497
|
+
`DataSource` contract instead of `any`.
|
|
498
|
+
|
|
499
|
+
**FROM** `dataSource={anything}` **TO** `dataSource={adapter}` — a `DataSource`
|
|
500
|
+
from `@object-ui/types`, or `null` / `undefined` when the host has no adapter
|
|
501
|
+
bound.
|
|
502
|
+
|
|
503
|
+
```ts
|
|
504
|
+
// before — compiled, and failed at runtime on the first find()
|
|
505
|
+
<SchemaRendererProvider dataSource={'not-an-adapter'}>
|
|
506
|
+
// before — compiled, and no reader can do anything with it
|
|
507
|
+
<SchemaRendererProvider dataSource={{}}>
|
|
508
|
+
// after
|
|
509
|
+
<SchemaRendererProvider dataSource={adapter}> // a DataSource
|
|
510
|
+
<SchemaRendererProvider dataSource={undefined}> // "I have no adapter"
|
|
511
|
+
```
|
|
512
|
+
|
|
513
|
+
Both sites are typed `DataSource | null | undefined` — the spelling
|
|
514
|
+
`useSettledSchema` in this same package already used. The two absences are part
|
|
515
|
+
of the contract, not a weakening of it: a Studio preview, a `kind:'react'` page
|
|
516
|
+
rendered before the host's adapter connects, and a widget probe driving
|
|
517
|
+
`apiFetch` alone all render with nothing bound, and every reader in the tree
|
|
518
|
+
already guards for it. What the union refuses is everything that is not an
|
|
519
|
+
adapter: a string, an empty object, a plain data bag, a partial adapter missing
|
|
520
|
+
a required member.
|
|
521
|
+
|
|
522
|
+
The measured cost, both halves, because the two `any`s have different blast
|
|
523
|
+
radii (measured separately on `origin/main`, whole-repo type-check over the 33
|
|
524
|
+
packages that depend on `@object-ui/react`):
|
|
525
|
+
|
|
526
|
+
- the **context type** — the `any` that reaches every `useSchemaContext()`
|
|
527
|
+
reader — reds **7 diagnostics at 7 sites in 4 packages**, all of them
|
|
528
|
+
production code or a mocked module factory.
|
|
529
|
+
- the **provider prop** — the injection points — reds **52 diagnostics at 27
|
|
530
|
+
sites in 11 packages**, all but one of them test doubles.
|
|
531
|
+
|
|
532
|
+
That ordering is the reverse of the prediction on the card: the context `any`
|
|
533
|
+
was expected to be the expensive one because it infects the whole tree, and it
|
|
534
|
+
is the cheap one, because every reader in the tree already guarded and none of
|
|
535
|
+
them ever reached past `find` / `getObjectSchema`. The prop is the expensive
|
|
536
|
+
one, because the injection points are overwhelmingly test doubles that were
|
|
537
|
+
never complete adapters. The full accounting is on objectui#7912.
|
|
538
|
+
|
|
539
|
+
Two runtime behaviours change, both in the "no adapter" direction and both
|
|
540
|
+
strictly closer to what the surrounding code already intended:
|
|
541
|
+
|
|
542
|
+
- `@object-ui/components`' `kind:'react'` page passed an empty object as its
|
|
543
|
+
"no adapter yet" stand-in. An empty object is TRUTHY, so it walked past every
|
|
544
|
+
`if (!dataSource)` guard written to catch exactly that state and failed later,
|
|
545
|
+
at the call. It now passes the absent adapter itself, so the guard fires where
|
|
546
|
+
it was meant to. The module-constant identity that stand-in existed for is
|
|
547
|
+
preserved: `null` is a primitive, so the provider's memo is unaffected.
|
|
548
|
+
- `@object-ui/plugin-calendar`, `@object-ui/plugin-gantt` and
|
|
549
|
+
`@object-ui/plugin-kanban` collapse a `null` adapter from the context to
|
|
550
|
+
`undefined` before handing it to their widget, whose prop declares the single
|
|
551
|
+
spelling `dataSource?: DataSource`.
|
|
552
|
+
|
|
553
|
+
Nothing else moves at runtime: no value flowing through this key changes, and
|
|
554
|
+
no data path is touched. A TypeScript consumer outside this repo that handed
|
|
555
|
+
this prop something other than an adapter now gets a compile error naming the
|
|
556
|
+
key (TS2322 / TS2739 / TS2740), which is why the FROM/TO is spelled out above.
|
|
557
|
+
|
|
558
|
+
Five `as any` reads of this context in `@object-ui/fields` are gone — they were
|
|
559
|
+
redundant the moment the seam became honest — and `LookupField`'s local
|
|
560
|
+
re-declaration of the imported context as a `Context` of `any`, which laundered
|
|
561
|
+
its `dataSource` read while looking typed, is gone with them. Both directions of
|
|
562
|
+
the contract are pinned against the real compiler in
|
|
563
|
+
`SchemaRendererContext.dataSourceType.pin.test.ts`, and the card's planted
|
|
564
|
+
documentation probe (a bare string in `packages/react/README.md`'s provider
|
|
565
|
+
example) now fails `pnpm check:doc-snippets`, where it used to exit 0 with zero
|
|
566
|
+
diagnostics.
|
|
567
|
+
|
|
568
|
+
objectui#7912.
|
|
569
|
+
- 233a1b3: Declare the `filter` and `sort` inputs on the `object-map`, `object-gantt`,
|
|
570
|
+
`object-timeline` and `view:timeline` registrations (objectui#8220) — the html
|
|
571
|
+
tier stops reporting `unknown-prop` on two keys the spec declares and all three
|
|
572
|
+
renderers read.
|
|
573
|
+
|
|
574
|
+
objectui#7712's and objectui#8171's defect, three blocks over. `ObjectMap`,
|
|
575
|
+
`ObjectGantt` and `ObjectTimeline` each lower the authored keys onto their own
|
|
576
|
+
query — `$filter` (the authored `filter`, its context tokens resolved first) and
|
|
577
|
+
`$orderby: convertSortToQueryParams(schema.sort)` — but none of the four
|
|
578
|
+
registrations publishing those renderers listed either key in `inputs`, and
|
|
579
|
+
`sdui-parser`'s `validateTree` reports `unknown-prop` for every key no `inputs`
|
|
580
|
+
entry claims. An author writing the spelling that works was told it was unknown.
|
|
581
|
+
|
|
582
|
+
Unlike the kanban and calendar cases, these three blocks had no spec row when the
|
|
583
|
+
defect was filed, so declaring the keys then would have published an authoring
|
|
584
|
+
surface no contract backed. That order is now met on the installed package:
|
|
585
|
+
`@objectstack/spec` 17.5.0 maps `object-map`, `object-gantt` and `object-timeline`
|
|
586
|
+
in `ComponentPropsMap`, each row declaring `filter` as the `ViewFilterRule` array
|
|
587
|
+
and `sort` as the `SortItem` array. ADR-0049 enforce-or-remove therefore resolves
|
|
588
|
+
toward **declare**: both keys have live readers on both ends.
|
|
589
|
+
|
|
590
|
+
Both keys are declared `type: 'array'`. For `filter` that is the rule-array arm
|
|
591
|
+
`[{ field, operator, value }, ...]` and nothing else: the spec refuses the
|
|
592
|
+
MongoDB-style record form at all three doors, and with the key declared as an
|
|
593
|
+
array the html tier now refuses it too, as a `type-mismatch`, instead of passing
|
|
594
|
+
it as an unknown key. `sort` takes `[{ field, order }]`.
|
|
595
|
+
|
|
596
|
+
`view:timeline` declares the same pair as `object-timeline`: it is the same
|
|
597
|
+
renderer under a second tag, the `view:calendar` precedent. The map's and the
|
|
598
|
+
gantt's bare `view:` twins are already retired (objectui#10393, objectui#8008),
|
|
599
|
+
so four registrations carry the declaration, not six.
|
|
600
|
+
|
|
601
|
+
Pinned per plugin in `__tests__/queryKeysDeclared-8220.test.tsx`: the real
|
|
602
|
+
validator over a manifest built from the live registry, with an undeclared-key
|
|
603
|
+
control; the installed spec row's verdict on the same values; and a mount through
|
|
604
|
+
`SchemaRenderer` showing the rule array reach `$filter` and the sort items reach
|
|
605
|
+
`$orderby` on every tag.
|
|
606
|
+
|
|
607
|
+
Not changed here: the console's `registry-inputs-spec-parity` ledger. It does not
|
|
608
|
+
load these three plugins yet and books the blocks as unjudged, owed to
|
|
609
|
+
objectui#11168, so this change moves none of its rows.
|
|
610
|
+
|
|
611
|
+
**Note, 2026-10-02 (objectui#11168 slice 5, shipping in this same release).**
|
|
612
|
+
The last paragraph above says the console's `registry-inputs-spec-parity` gate
|
|
613
|
+
does not load these three plugins yet and books the blocks as unjudged. That no
|
|
614
|
+
longer holds for the release: objectui#11168 loaded all three in this same
|
|
615
|
+
release (`object-map` in slice 3, `object-gantt` in slice 4, `object-timeline`
|
|
616
|
+
in slice 5), so the gate judges each registration in both directions, and its
|
|
617
|
+
unjudged-block ledger books none of them. This change itself still moved none
|
|
618
|
+
of those rows.
|
|
619
|
+
- 91facae: **Breaking behaviour change — a view block now honours only the `data` spelling its published row declares.**
|
|
620
|
+
|
|
621
|
+
Maintainer ruling, decision batch #83 (2026-09-08), verbatim 「8348 以协议为准」: the contract decides. What `os validate` and the save gate refuse under `data`, the renderer refuses too. The shared record-source ladder (`resolveRecordSourceConfig` in `@object-ui/core`) now takes the arm the calling block's row declares, and rung 1 applies only on that arm.
|
|
622
|
+
|
|
623
|
+
⚠️ **`object-calendar` documents authored against the tolerated spelling stop rendering those rows.** The ladder falls past `data` to `staticData`, then to `objectName` — so such a calendar queries its object instead, or draws nothing when it names neither. This is accepted, with no transition window and no staged deprecation (the standing 2026-08-27 posture).
|
|
624
|
+
|
|
625
|
+
**Per block — what the published row says, and what actually moves:**
|
|
626
|
+
|
|
627
|
+
- **`object-calendar`** — row: `ComponentPropsMap['object-calendar'].data` is `z.array(z.unknown())` ("Pre-fetched records — skips the internal fetch"). A record-source **config object** under `data` — `{ provider: 'value', items }`, `{ provider: 'object', object }`, `{ provider: 'api', … }` — is no longer honoured, and this is a real end-to-end change: that object had exactly one carrier into the block, so an authored calendar written that way now queries its object (or draws nothing) instead of drawing the authored rows. There is no longer an api-provider branch to reach here. An **array** under `data` is unchanged, as are `staticData` and `objectName`.
|
|
628
|
+
- **`object-grid`** — row: the `ViewData` union, whose own description says "the bare-array shortcut is refused". `getDataConfig`'s `Array.isArray(schema.data)` head is removed, so the array is no longer a record source at the ladder. ⛔ Measured: this is **not** an end-to-end change for a node rendered through `SchemaRenderer`. An authored `data` array also arrives on the **props channel** (`SchemaRenderer` spreads node keys as props; `ObjectGrid`'s `passedData` lifts an array at higher priority), so such a grid still drew its rows when this landed. The removal took the second read, not the last one; objectui#9571 closed the props carrier afterwards.
|
|
629
|
+
- **`object-map`** — no `ComponentPropsMap` row existed when this landed; the governing row was this repo's own `ObjectMapSchema.data`, `ViewDataSchema.optional()` (the protocol row has since been published, and is the `ViewData` union too). Its array-shorthand head is removed on the same terms, with the same measured caveat at the time: through `SchemaRenderer` the props channel still drew an authored array, until objectui#9571. `data: { provider: 'value', items }` and `staticData` are unchanged.
|
|
630
|
+
- **`object-gantt`** — no `ComponentPropsMap` row when this landed; the governing row was `ObjectGanttSchema.data`, `ViewDataSchema.optional()` (the protocol row has since been published, and is the `ViewData` union too). A bare array under `data` is no longer a record source. Nothing observable moves: this block never lifted one, the array carried no `provider` and matched no fetch branch, and its renderer forwards no host props.
|
|
631
|
+
- **`object-tree`** — **unchanged by this change.** When it landed, no published face declared a `data` row for this block: not `ComponentPropsMap`, not `ObjectTreeSchema` (which declares `objectName` required and no `data`), not its registration `inputs`. Neither arm of the ruling reached it, so its rung 1 kept its previous behaviour and the block was reported rather than guessed at. Once the protocol published `ComponentPropsMap['object-tree']`, the tree moved to the `ViewData` arm too — see the separate `object-tree` entry for objectui#8348.
|
|
632
|
+
|
|
633
|
+
The `data` **prop** — the pre-fetched rows a host such as `ObjectView` or `ListView` passes down — is a different carrier and is untouched on every block. That it is also reachable from an authored node key, because `SchemaRenderer` spreads node keys as props, is what limits the grid and map halves above; it is reported on objectui#8348 rather than changed here.
|
|
634
|
+
- a1c00e3: Honour `filter`, `sort` and the platform row ceiling on a gantt's inline
|
|
635
|
+
(`provider: 'value'`) data (objectui#8769).
|
|
636
|
+
|
|
637
|
+
**The defect was fail-open.** `ObjectGantt`'s `reload` short-circuited the
|
|
638
|
+
inline provider — it set the authored rows and returned BEFORE the adapter
|
|
639
|
+
query, which is the one site that lowers `schema.filter` to `$filter`,
|
|
640
|
+
`schema.sort` to `$orderby` and the objectui#7210 ceiling to `$top`. So an
|
|
641
|
+
inline gantt that declared a `filter` drew **every** authored row, with no
|
|
642
|
+
diagnostic. The key that was dropped is the key that NARROWS, which is why this
|
|
643
|
+
matters: the chart answered a wider question than the author asked. ⛔ Nothing
|
|
644
|
+
was exposed that was not already in the authored schema — this is a
|
|
645
|
+
correctness defect, not a data-access one.
|
|
646
|
+
|
|
647
|
+
Measured two-sided before the repair: the same five rows and the same
|
|
648
|
+
`status = open` filter drew 3 rows through a fetching data source and 5 rows
|
|
649
|
+
inline, with the same matcher on both sides.
|
|
650
|
+
|
|
651
|
+
**What changed.** The inline branch is gone; `provider: 'value'` now goes
|
|
652
|
+
through `resolveDataSource`'s `ValueDataSource` like every other provider,
|
|
653
|
+
which already implements `$filter` / `$orderby` / `$skip` / `$top` / `$select`
|
|
654
|
+
over its own array. No filter combinator was written for this change.
|
|
655
|
+
|
|
656
|
+
**Behaviour you may notice.**
|
|
657
|
+
|
|
658
|
+
- An authored `filter` / `sort` now narrows and orders inline rows. Both
|
|
659
|
+
spellings reach it: `data: { provider: 'value', items }` and `staticData`.
|
|
660
|
+
- The row ceiling now applies to inline rows: past 2,000 drawn rows the chart
|
|
661
|
+
draws 2,000 and shows the footnote naming both numbers, as it already did for
|
|
662
|
+
fetched rows. It is applied to the **filtered** set, so a large inline array
|
|
663
|
+
that a `filter` cuts below the ceiling draws every matching row and stays
|
|
664
|
+
quiet. Rows a host passes down through the `data` React prop are still never
|
|
665
|
+
capped — those are not ours to cap.
|
|
666
|
+
- Inline rows now reach the chart as the adapter's own deep copy rather than as
|
|
667
|
+
the authored array's object identities. `ViewData.items` is serializable
|
|
668
|
+
metadata, so every value the contract admits survives that copy unchanged;
|
|
669
|
+
code comparing a row handed to `onTaskClick` against the authored array with
|
|
670
|
+
`===` would need `id` equality instead.
|
|
671
|
+
- An inline gantt's own write-backs (drag, dependency edit, inline edit,
|
|
672
|
+
delete) now survive the reload that follows them, because the reload reads
|
|
673
|
+
the adapter that took the write instead of re-reading the authored array over
|
|
674
|
+
the top of it.
|
|
675
|
+
- A filter comparand that `@object-ui/core`'s `convertFiltersToAST` refuses does
|
|
676
|
+
**not** throw at render on this path: the inline matcher is local and never
|
|
677
|
+
reaches that converter. The row is excluded and the reason is logged once.
|
|
678
|
+
- 093af32: Take the `@objectstack/*` line to 17.4.0 and follow every contract it moved
|
|
679
|
+
(objectui#8772, with #7783 · #7663 · #8172 · #7845 · #8785).
|
|
680
|
+
|
|
681
|
+
**Breaking on one authored key, deliberately.** A dashboard node's
|
|
682
|
+
`refreshInterval` is now `refreshIntervalSeconds` — the value is unchanged
|
|
683
|
+
(seconds), and the spec refuses the old spelling by name with a message naming
|
|
684
|
+
the new one, so an existing document fails loudly at parse rather than silently
|
|
685
|
+
losing its auto-refresh. `os migrate meta --from 17` lists the mechanical edits.
|
|
686
|
+
The report component's own `refreshInterval` is a different key and is NOT
|
|
687
|
+
affected. (Scored `minor`, not `major`: this repo's fixed group tracks the
|
|
688
|
+
`@objectstack` major — AGENTS.md §版本号策略.)
|
|
689
|
+
|
|
690
|
+
Also authored-surface changes, all following a published spec move rather than a
|
|
691
|
+
local decision:
|
|
692
|
+
|
|
693
|
+
- `element:record_picker`'s `filter` input is now the `ViewFilterRule` array
|
|
694
|
+
form `[{ field, operator, value }, …]`. The MongoDB-style record form is
|
|
695
|
+
refused by the contract (objectstack#14406 converged the last record-form
|
|
696
|
+
`filter` in the map), so a JSX page writing the array form no longer draws a
|
|
697
|
+
false `type-mismatch` and one writing the record form is told.
|
|
698
|
+
- `object-kanban` now publishes `limit`, the row cap its renderer has always
|
|
699
|
+
lowered to `$top`. The spec declares it as of objectstack#16503, so the key
|
|
700
|
+
the docs teach is finally one the save gate stores.
|
|
701
|
+
- `object-gantt`'s ten extension keys (`timeSegments`, `interactions`,
|
|
702
|
+
`lockField`, …) are derived from the spec's `GanttConfigSchema` instead of
|
|
703
|
+
being re-declared locally. Same accept set on the flat face; the nested
|
|
704
|
+
`gantt` block narrows to the spec's, which now refuses an undeclared sub-key
|
|
705
|
+
by name where its `.passthrough()` window used to admit one.
|
|
706
|
+
- The console's preview-gallery samples — the worked examples an author copies —
|
|
707
|
+
move with two spec changes of their own: a job's `timeout` is now `timeoutMs`
|
|
708
|
+
(same unit-in-the-key-name ruling as the dashboard key above), and a flow's
|
|
709
|
+
end node writes `outcome: 'completed'`, the enum having narrowed to
|
|
710
|
+
`completed | refused`.
|
|
711
|
+
- adf5812: Four node type keys retire, and the kanban and gantt families converge on their
|
|
712
|
+
`object-*` spellings: `kanban` (objectui#8802), `kanban-ui` and `kanban-enhanced`
|
|
713
|
+
(objectui#8257), and `gantt` (objectui#8008). All four were ruled by the
|
|
714
|
+
maintainer in one batch on 2026-09-09.
|
|
715
|
+
|
|
716
|
+
**⛔ No stored document moves.** The strings `kanban` and `gantt` name two
|
|
717
|
+
different things at two different layers, and only one of them is retiring:
|
|
718
|
+
|
|
719
|
+
| layer | value | who writes it | retired? |
|
|
720
|
+
| --- | --- | --- | --- |
|
|
721
|
+
| stored `NamedListView.type` | `"kanban"`, `"gantt"` | `CreateViewDialog`, persisted per tenant | **no — untouched** |
|
|
722
|
+
| node type key | `kanban`, `gantt` | hand-authored JSON | **yes** |
|
|
723
|
+
|
|
724
|
+
`ObjectView`'s `switch (viewType)` maps a stored view type onto the node type it
|
|
725
|
+
renders, and it already emitted `object-kanban` and `object-gantt` — as it does
|
|
726
|
+
for all twelve stored view types. So every kanban and gantt view any user ever
|
|
727
|
+
created through the console already renders through the surviving spelling.
|
|
728
|
+
Nothing in a tenant database changes, and ⛔ nothing should be migrated there.
|
|
729
|
+
|
|
730
|
+
**What each retirement was, measured.** Three of the four were
|
|
731
|
+
registration-only: no schema face in `@object-ui/types` ever declared
|
|
732
|
+
`kanban-ui`, `kanban-enhanced` or `gantt` as a component node type, so
|
|
733
|
+
unregistering is the whole retirement. The bare `kanban` key was the exception —
|
|
734
|
+
it had a declared arm on both faces (`KanbanSchema` in `complex.ts` and its Zod
|
|
735
|
+
mirror), and a plain deletion there would have been the objectui#7664 failure:
|
|
736
|
+
`BaseSchema` is `.passthrough()`, so a document naming a dropped key validates
|
|
737
|
+
green and renders nothing. It therefore retires as a **named refusal**: the Zod
|
|
738
|
+
union keeps an arm claiming the literal and answers a `{ "type": "kanban" }`
|
|
739
|
+
document with a message naming `object-kanban` as the remedy, while the
|
|
740
|
+
TypeScript half is the absence of the arm from `ComplexSchema` and of the key
|
|
741
|
+
from `SchemaRegistry`, so `tsc` refuses it at the authoring site.
|
|
742
|
+
|
|
743
|
+
**⭐ This closes objectui#8818's `objectFields` hole — for that ENTRY, not for
|
|
744
|
+
the class.** `SchemaRenderer` strips a fixed enumerated metadata list and
|
|
745
|
+
spreads the rest as React props; `objectFields` is not on that list, and
|
|
746
|
+
`KanbanRenderer` — the component the `kanban-ui` key resolved to — declares
|
|
747
|
+
`objectFields` as a real prop, so an authored value reached the predicate layer
|
|
748
|
+
with no schema face judging it. With the registration gone, no authored node
|
|
749
|
+
reaches that component through the registry. ⚠️ The **class** is still open: the
|
|
750
|
+
hole returns the moment another registered renderer declares an `objectFields`
|
|
751
|
+
prop. objectui#8818's option (a) — stripping at the `SchemaRenderer` boundary —
|
|
752
|
+
is what would close the class.
|
|
753
|
+
|
|
754
|
+
Superseded in this release by objectui#8818: option (a) landed, so the class
|
|
755
|
+
is closed as well. `objectFields` is now on `SchemaRenderer`'s stripped-metadata
|
|
756
|
+
list, and the legacy `props` alias bag drops it too, so an authored
|
|
757
|
+
`objectFields` reaches no component prop on any type key. The paragraph above
|
|
758
|
+
describes the tree this entry was written against.
|
|
759
|
+
|
|
760
|
+
**⚠️ What the `kanban` arm took with it, stated because it is the cost of this
|
|
761
|
+
change.** That arm was the only schema face that ever declared `columns`,
|
|
762
|
+
`cardTitle`, `swimlaneField`, `grouping` and `navigation`, the only one that
|
|
763
|
+
refused `allowCollapse` / `cardTemplates` / `columnWidths` / `titleField` /
|
|
764
|
+
`draggable` / `onColumnAdd` / `onCardAdd` by name, and — through
|
|
765
|
+
`columns: KanbanColumn[]` — the only one that judged a lane's `cards`
|
|
766
|
+
(`240b80f31`).
|
|
767
|
+
|
|
768
|
+
⭐ **The sentence that stood here — «The surviving `ObjectKanbanSchema` face
|
|
769
|
+
declares none of them» — is retired, and the two reasons it failed are DIFFERENT
|
|
770
|
+
defects (objectui#9713).** It is replaced by a dated reading rather than silently
|
|
771
|
+
overwritten, because half of it was true when written and erasing that would be a
|
|
772
|
+
false record of its own:
|
|
773
|
+
|
|
774
|
+
| key named just above | on `ObjectKanbanSchema` when this entry was written (`adf581278`, 2026-09-10) | on `main`, 2026-09-17 | what moved |
|
|
775
|
+
| --- | --- | --- | --- |
|
|
776
|
+
| `columns` | not declared | **declared** | objectui#8913 (PR objectui#8989), six hours after this entry was written |
|
|
777
|
+
| `cardTitle` | not declared | **declared** | objectui#9606 (PR objectui#9709) |
|
|
778
|
+
| `titleField` | **declared** | **declared** | nothing — the sentence was never true of this key |
|
|
779
|
+
| `allowCollapse` | **declared**, a live `z.boolean().optional()` | **declared**, as a `retirementTombstone()` | objectui#8801 retired it; it was declared on this face throughout |
|
|
780
|
+
| `swimlaneField`, `grouping`, `navigation`, `cardTemplates`, `columnWidths`, `draggable`, `onColumnAdd`, `onCardAdd`, and a lane's `cards` | not declared | not declared | nothing |
|
|
781
|
+
|
|
782
|
+
⇒ For `columns` and `cardTitle` the claim **ROTTED**: it was true on 2026-09-10 and
|
|
783
|
+
was falsified afterwards by cards that had no reason to read this file. For
|
|
784
|
+
`titleField` and `allowCollapse` it was **BORN FALSE**: those two are named above as
|
|
785
|
+
keys the `kanban` arm refused BY NAME — which the surviving face indeed does not do
|
|
786
|
+
— but the surviving face declared both of them the whole time, and «declares none of
|
|
787
|
+
them» said otherwise. ⛔ Do not restate any of this in the present tense: a pending
|
|
788
|
+
entry publishes verbatim into the CHANGELOG, and an undated present-tense claim
|
|
789
|
+
about another file is the construction that failed here.
|
|
790
|
+
|
|
791
|
+
⛔ Nothing about an `object-kanban` document changes: it was never judged by the
|
|
792
|
+
`kanban` arm, so all of those keys have always ridden `BaseSchema`'s index
|
|
793
|
+
signature there. What is gone is the `kanban` document that had them. Declaring
|
|
794
|
+
them on `ObjectKanbanSchema` would WIDEN a published accept set, which is a
|
|
795
|
+
maintainer ruling and not part of this one; every one of these readings is
|
|
796
|
+
pinned where it can be seen rather than left to be rediscovered.
|
|
797
|
+
|
|
798
|
+
**Migrating.** Replace `"type": "kanban"` with `"type": "object-kanban"` and
|
|
799
|
+
`"type": "gantt"` with `"type": "object-gantt"` in hand-authored documents. The
|
|
800
|
+
`object-kanban` face requires `groupBy` and one of `bind` / `data` /
|
|
801
|
+
`objectName`; a purely static board (lanes carrying their own cards, no record
|
|
802
|
+
source) adds `"groupBy"` and `"data": []`. `kanban-ui` and `kanban-enhanced`
|
|
803
|
+
have no authored documents anywhere in this repository to migrate.
|
|
804
|
+
|
|
805
|
+
**⚠️ The namespaced spellings retire with the registrations — `view:kanban` and
|
|
806
|
+
`view:gantt` are the same two keys.** `ComponentRegistry.register(type, C,
|
|
807
|
+
{ namespace })` stores BOTH `namespace:type` and a bare-`type` fallback, so
|
|
808
|
+
every one of these keys had a namespaced twin that goes with it:
|
|
809
|
+
|
|
810
|
+
| retired spelling | namespaced twin | author instead |
|
|
811
|
+
| --- | --- | --- |
|
|
812
|
+
| `kanban` | `view:kanban` | `object-kanban` |
|
|
813
|
+
| `gantt` | `view:gantt` | `object-gantt` |
|
|
814
|
+
| `kanban-ui` | `plugin-kanban:kanban-ui` | `object-kanban` |
|
|
815
|
+
| `kanban-enhanced` | `plugin-kanban:kanban-enhanced` | `object-kanban` |
|
|
816
|
+
|
|
817
|
+
Both spellings are pinned as gone, each against a firing control on the
|
|
818
|
+
surviving key, in `plugin-kanban/src/__tests__/kanban-family-registry-keys-retired-8257.test.ts`
|
|
819
|
+
and `plugin-gantt/src/__tests__/bare-gantt-node-key-retired-8008.test.ts`.
|
|
820
|
+
|
|
821
|
+
**What an unmigrated `view:kanban` / `view:gantt` node now renders depends on
|
|
822
|
+
the host.** In `apps/console` it renders the protocol **placeholder** panel, not
|
|
823
|
+
the OBJUI-001 "Unknown component type" error: the console calls the opt-in
|
|
824
|
+
`registerPlaceholders()` (`@object-ui/components`, `renderers/placeholders.tsx`)
|
|
825
|
+
*after* its plugin registrations, `view:kanban` and `view:gantt` are both in
|
|
826
|
+
that file's `PROTOCOL_COMPONENTS` list, and the placeholder only claims a key
|
|
827
|
+
nothing else has taken — which, until this change, `@object-ui/plugin-kanban`
|
|
828
|
+
and `@object-ui/plugin-gantt` had. In every other host, which does not call that
|
|
829
|
+
bootstrap, the same node renders OBJUI-001.
|
|
830
|
+
|
|
831
|
+
**⚠️ `objectui check` will NOT flag either namespaced spelling.** The CLI's
|
|
832
|
+
`known-schema-types.ts` is generated from the repository's real registration
|
|
833
|
+
calls, and the placeholder registration is a real one — so `view:kanban` and
|
|
834
|
+
`view:gantt` are still on that list and still validate green, while the node
|
|
835
|
+
renders a placeholder rather than a board. The bare `kanban` / `gantt` entries
|
|
836
|
+
DID leave the generated list; only the namespaced pair survives, and only
|
|
837
|
+
because of the placeholder. Grep your documents for the namespaced spellings
|
|
838
|
+
directly; do not rely on `objectui check` to find them.
|
|
839
|
+
|
|
840
|
+
`KanbanRenderer` is still exported from this package's entry point
|
|
841
|
+
(`@object-ui/plugin-kanban`); only its registry key is gone. ⚠️ `KanbanEnhanced`
|
|
842
|
+
is a different case, and the earlier draft of this note stated it wrongly: this
|
|
843
|
+
package's `exports` map has exactly two entries — `.` and `./style.css` — and
|
|
844
|
+
the barrel never re-exported the component, so
|
|
845
|
+
`@object-ui/plugin-kanban/KanbanEnhanced` has never been a resolvable specifier
|
|
846
|
+
for a consumer. At this change, with `kanban-enhanced` unregistered,
|
|
847
|
+
`KanbanEnhanced.tsx` had zero non-test importers, and the file was deliberately
|
|
848
|
+
left in place: deleting published-but-unreachable source is a further narrowing
|
|
849
|
+
and needed its own maintainer ruling, which this change did not have.
|
|
850
|
+
|
|
851
|
+
⚠️ **Dated note, 2026-09-25 — that ruling came, and the file has since been
|
|
852
|
+
deleted — objectui#8932.** Later in this same release
|
|
853
|
+
`packages/plugin-kanban/src/KanbanEnhanced.tsx` was deleted, and with it the
|
|
854
|
+
`dist/KanbanEnhanced.d.ts` typings this package shipped for it. The rest of this
|
|
855
|
+
entry is kept as the reading of this change; the objectui#8932 entry states what
|
|
856
|
+
ships.
|
|
857
|
+
|
|
858
|
+
**⚠️ `@object-ui/sdui-parser`: `QUICK_ADD_HOST_TYPES` loses `kanban` with the
|
|
859
|
+
registration.** The `inert-quick-add` diagnostic (objectui#8285) named the two
|
|
860
|
+
tags `ObjectKanbanRenderer` answered to; one of them retires here, so the set is
|
|
861
|
+
now `{ 'object-kanban' }`. ⛔ Nothing is silently dropped by that narrowing, and
|
|
862
|
+
this is measured rather than argued: `checkKanbanQuickAdd` has exactly one call
|
|
863
|
+
site — `validate.ts`'s per-prop walk — and that walk runs only in the branch
|
|
864
|
+
where the manifest RESOLVED the tag. A tag no registration produces is answered
|
|
865
|
+
one level up by `unknown-component`, an **error**, and its props are never
|
|
866
|
+
walked, so on a manifest built from the live registry a `<kanban quickAdd>` node
|
|
867
|
+
draws `error/unknown-component` and nothing else, against a firing control on
|
|
868
|
+
`<object-kanban quickAdd>` that still draws `warning/inert-quick-add`. Keeping
|
|
869
|
+
`kanban` in the set would have been reachable only through a hand-built manifest
|
|
870
|
+
declaring a component of that name — which, after this retirement, is somebody
|
|
871
|
+
else's component, and the message asserts things about `ObjectKanban` that would
|
|
872
|
+
be false of it. This supersedes the `kanban` half of the objectui#8285 entry.
|
|
873
|
+
|
|
874
|
+
**The diagnostic's remedy text moves from a tag to a component.** It used to end
|
|
875
|
+
"render `<kanban-ui>` from a React host that passes `onQuickAdd`". That sentence
|
|
876
|
+
is falsified by this change: `kanban-ui` is no longer a node type key, so a page
|
|
877
|
+
written to the old advice draws `unknown-component`. It now names
|
|
878
|
+
`KanbanRenderer` from `@object-ui/plugin-kanban` — still exported, still
|
|
879
|
+
forwarding both halves by identity — which is the surviving way to get the pair.
|
|
880
|
+
`content/docs/plugins/plugin-kanban.mdx` says the same thing the same way.
|
|
881
|
+
- 7098eed: One record-overlay shell: all five list-type renderers honour all four overlay
|
|
882
|
+
`navigation.mode` values (objectui#9299, director seat decision batch #128 item
|
|
883
|
+
1, 2026-09-13).
|
|
884
|
+
|
|
885
|
+
`ObjectGantt`, `ObjectKanban` and `ObjectCalendar` rendered one drawer for every
|
|
886
|
+
authored mode — `modal`, `split` and `popover` silently WERE the drawer, with no
|
|
887
|
+
diagnostic. `RecordDetailDrawer`'s payload is extracted into the new
|
|
888
|
+
`RecordDetailPanel` (shell-free by construction) and mounted through the shared
|
|
889
|
+
`NavigationOverlay`, which is what `ObjectGrid` and `ObjectTree` already used.
|
|
890
|
+
|
|
891
|
+
User-visible on published surfaces:
|
|
892
|
+
|
|
893
|
+
- **`modal` / `split` / `popover` now do what they say** on the gantt, the
|
|
894
|
+
kanban and the calendar.
|
|
895
|
+
- **`split` renders.** Each renderer passes its own view as `mainContent`, so
|
|
896
|
+
the board / calendar / chart / tree / grid sits beside the record panel.
|
|
897
|
+
Authored `split` used to render NOTHING on `ObjectTree` — and, measured while
|
|
898
|
+
fixing this, on `ObjectGrid` too.
|
|
899
|
+
- **`popover` is anchored to the element the user clicked** — row, node, bar,
|
|
900
|
+
card, event — instead of degrading to a centred dialog. It was honoured on no
|
|
901
|
+
surface before.
|
|
902
|
+
- **Drawer chrome converges** on the shared shell's header (breadcrumb title,
|
|
903
|
+
close, optional expand) for the three renderers that brought their own.
|
|
904
|
+
- **Drawer widths carry over, they are not reset.** The two drag-resize
|
|
905
|
+
implementations become one: a width persisted under the retired
|
|
906
|
+
`objectui.drawerWidth.OBJECT` is read once, written forward to
|
|
907
|
+
`ov:drawer-width:OBJECT` and removed. One key per object across every view
|
|
908
|
+
type. The default width is unchanged at every viewport (objectui#6584); an
|
|
909
|
+
authored width below `min(60vw, 880px)` now widens to it, which is the shell's
|
|
910
|
+
long-standing policy on grid and tree.
|
|
911
|
+
- **Richer record body on grid and tree** — typed widgets, declared labels,
|
|
912
|
+
honoured `hidden` — wherever the object declares its fields. With nothing
|
|
913
|
+
declared those two renderers keep their own value-inference reading, which is
|
|
914
|
+
what preserves the locale-aware date fallback (objectui#4541), the localized
|
|
915
|
+
empty placeholder (objectui#8491) and the `format` hint (objectui#8920); the
|
|
916
|
+
overlay shell is the shared one on that path too.
|
|
917
|
+
|
|
918
|
+
New published API: `RecordDetailPanel`, `buildRecordDetailFields`,
|
|
919
|
+
`RECORD_OVERLAY_DEFAULT_WIDTH` (`@object-ui/plugin-detail`);
|
|
920
|
+
`useOverlayAnchor`, `recordOverlayWidthStorageKey`,
|
|
921
|
+
`legacyRecordDrawerWidthKey` and the `popoverAnchorRef` / `legacyStorageKey`
|
|
922
|
+
props on `NavigationOverlay` (`@object-ui/components`). `RecordDetailDrawer`
|
|
923
|
+
keeps its props and is now a thin wrapper over the shared shell. ⛔ No spec
|
|
924
|
+
change.
|
|
925
|
+
- 502eb58: The row/card click props on the view components now declare the modifier
|
|
926
|
+
payload they have always been invoked with (objectui#9357).
|
|
927
|
+
|
|
928
|
+
`useNavigationOverlay`'s `handleClick` invokes the handler it is given with two
|
|
929
|
+
arguments — the record, and an optional modifier payload (`metaKey` / `ctrlKey`
|
|
930
|
+
/ `button`) a host needs to implement Cmd/Ctrl/middle-click. objectui#9360 made
|
|
931
|
+
the hook's own option say so. These components pass a host-supplied prop
|
|
932
|
+
straight into that option, so the value a host writes against them is invoked
|
|
933
|
+
with two arguments too — and every one of these props declared only the record.
|
|
934
|
+
The payload was therefore invisible on the one line a host reads, exactly as it
|
|
935
|
+
had been on the hook.
|
|
936
|
+
|
|
937
|
+
Thirteen declarations across nine packages now name both parameters:
|
|
938
|
+
|
|
939
|
+
- `ObjectGridComponentProps.onRowClick`
|
|
940
|
+
- `ObjectKanbanComponentProps.onRowClick` (its sibling `onCardClick`, the other
|
|
941
|
+
arm of the same fallback, already declared both)
|
|
942
|
+
- `KanbanRendererProps.schema.onCardClick`
|
|
943
|
+
- `ObjectCalendar`, `ObjectGantt`, `ObjectMap`, `ObjectTree`: `onRowClick`
|
|
944
|
+
- `ObjectTimeline`: `onRowClick` and `onItemClick`, the two arms of one fallback
|
|
945
|
+
- `ListView.onRowClick`
|
|
946
|
+
- `ObjectGallery`: `onRowClick` and `onCardClick`, likewise two arms of one
|
|
947
|
+
- `RelatedList.onRowClick`
|
|
948
|
+
|
|
949
|
+
**Source-compatible, and with no refused class.** A one-parameter handler is
|
|
950
|
+
still assignable to the widened signature, and a handler written against the
|
|
951
|
+
widened signature was already assignable to the narrow one — its minimum
|
|
952
|
+
argument count is still one. The second parameter is spelled `any` rather than
|
|
953
|
+
`HandleClickModifiers`, which is the difference that matters for callers: the
|
|
954
|
+
hook's own option names that interface and therefore refuses a handler whose
|
|
955
|
+
second parameter is annotated narrower (objectui#9360 documents that class and
|
|
956
|
+
the one-line remedy). These faces refuse nothing. A host that discovered the
|
|
957
|
+
payload from the implementation and annotated it `React.MouseEvent` — which is
|
|
958
|
+
what actually arrives — keeps compiling. `any` is also the spelling
|
|
959
|
+
`ObjectKanbanSchema.onCardClick` already carries for this same payload
|
|
960
|
+
(objectui#9341) and the one `BaseSchema`'s own `onClick` / `onChange` /
|
|
961
|
+
`onSubmit` use, and it is forced on the published twins in `@object-ui/types`,
|
|
962
|
+
which may not name a type that lives in a package depending on them.
|
|
963
|
+
|
|
964
|
+
**Runtime behaviour is unchanged.** Nothing is newly called and nothing newly
|
|
965
|
+
passes an argument; only the declarations move.
|
|
966
|
+
|
|
967
|
+
Three declarations that share the name and the shape are deliberately NOT
|
|
968
|
+
widened, because the value flowing through them is not invoked with the
|
|
969
|
+
payload: `VirtualGrid.onRowClick`, whose second parameter is a row index;
|
|
970
|
+
`ManageViewsDialog.onRowClick`, which receives a view id; and the `data-table`
|
|
971
|
+
family (`DataTableSchema.onRowClick`, `ObjectDataTableSchema.onRowClick`),
|
|
972
|
+
whose renderer invokes with one argument. Widening those would have declared a
|
|
973
|
+
payload that never arrives.
|
|
974
|
+
- 199d31b: **`viewMode` is now declared authoring surface on `ObjectGanttSchema`, and both
|
|
975
|
+
gantt renderer branches honour it** (objectui#5074, maintainer ruling
|
|
976
|
+
2026-08-19: declare-and-wire; the spec half landed first upstream).
|
|
977
|
+
|
|
978
|
+
- `ObjectGanttSchema` (TS interface and zod mirror) declares `viewMode`,
|
|
979
|
+
DERIVED from the pinned `@objectstack/spec` `GanttConfigSchema.viewMode`
|
|
980
|
+
enum by reference, so the member list cannot drift. Deliberately no
|
|
981
|
+
default: an omitted `viewMode` keeps letting a persisted layout
|
|
982
|
+
(`persistLayoutKey`) seed the timeline granularity before the renderer's
|
|
983
|
+
`'day'` fallback.
|
|
984
|
+
- The timeline branch (`GanttView`) now receives an authored `viewMode`.
|
|
985
|
+
Previously only the resource-workload branch (`resourceView` +
|
|
986
|
+
`assigneeField`) honoured it, so `viewMode: 'month'` on an ordinary gantt
|
|
987
|
+
view was silently ignored.
|
|
988
|
+
- The `(schema as any).viewMode` cast in `ObjectGantt` is retired; both
|
|
989
|
+
branches read the declared `ganttConfig.viewMode`, which also honours the
|
|
990
|
+
key when authored inside the spec's `gantt` config block.
|
|
991
|
+
- Accept-set note: `viewMode` is now a DECLARED key, so an off-enum value
|
|
992
|
+
(e.g. `viewMode: 'hour'`) becomes a zod validation error where it
|
|
993
|
+
previously passed through unvalidated. Values on the published spec enum
|
|
994
|
+
are unaffected.
|
|
995
|
+
|
|
996
|
+
### Patch Changes
|
|
997
|
+
|
|
998
|
+
- 3759c56: Gantt, chart and grid views refresh in place after a write instead of being rebuilt (objectui#10035).
|
|
999
|
+
|
|
1000
|
+
`ObjectGrid`, `ObjectGantt` and `ObjectChart` query for themselves and read no refresh input, so both object-view layers could show them a write only by remounting them — which lost a gantt's scroll, collapsed groups and zoom, a chart's open drill-down, and a grid's selection, column state and in-progress edit. Each now refetches when the data-invalidation bus (`notifyDataChanged` / `useDataInvalidation` from `@object-ui/react`) reports a change to the object it reads:
|
|
1001
|
+
|
|
1002
|
+
- `@object-ui/plugin-grid`: `ObjectGrid` re-reads its rows into the same table.
|
|
1003
|
+
- `@object-ui/plugin-gantt`: `ObjectGantt` re-reads silently and keeps the chart mounted, as its toolbar refresh does.
|
|
1004
|
+
- `@object-ui/plugin-charts`: `ObjectChart` re-runs its query on both binding shapes — an object-bound aggregate follows its `objectName`, a dataset-bound chart follows the dataset's base object as the `queryDataset` answer names it.
|
|
1005
|
+
- `@object-ui/plugin-view`: the object view keys every view on its identity alone, and declares on the bus its own saves and deletes and each `onMutation` write it hears.
|
|
1006
|
+
- `@object-ui/app-shell`: the object page keys its list and its chart view on identity alone, and declares on the bus the changes it learns of without a data-source write — server actions, flows, imports, realtime events and an explicit refresh.
|
|
1007
|
+
|
|
1008
|
+
Rows a host hands these components (`data`, `bind`, inline values) are still the host's to refresh; only the components' own queries follow the bus.
|
|
1009
|
+
- 75b0d0b: `ObjectGantt` no longer re-issues its record query because React threw a memo cache
|
|
1010
|
+
away (objectui#10036).
|
|
1011
|
+
|
|
1012
|
+
The fetch seam carried two dependencies that AGENTS.md §5 commandment #10 bans — the
|
|
1013
|
+
ninth and tenth instances of the class ruled on objectui#8640. `reload`'s dependency
|
|
1014
|
+
list named `effectiveDataSource`, a `useMemo` result, and the mount effect named
|
|
1015
|
+
`reload`, a `useCallback` result. Both hooks are documented performance hints: React
|
|
1016
|
+
may discard the cache and recompute even when the dependency list compares equal, and
|
|
1017
|
+
the object that comes back is then a new one.
|
|
1018
|
+
|
|
1019
|
+
That is not harmless here. `resolveDataSource` returns the context adapter UNCHANGED
|
|
1020
|
+
for `provider: 'object'`, but CONSTRUCTS a fresh `ApiDataSource` / `ValueDataSource`
|
|
1021
|
+
for `provider: 'api'` and `provider: 'value'` — so on those two providers a discard
|
|
1022
|
+
alone handed `reload` a brand-new adapter for a byte-identical authored config, rebuilt
|
|
1023
|
+
`reload`, and re-fired the mount effect: one redundant round trip per discard, on a
|
|
1024
|
+
view nobody had touched. A discarded `useCallback` moves `reload`'s identity whatever
|
|
1025
|
+
its own dependency list says, so the second half had to move with the first.
|
|
1026
|
+
|
|
1027
|
+
The record fetch now READS the adapter through a ref and KEYS on the values that
|
|
1028
|
+
determine it: the authored config slice `resolveDataSource` actually reads, per
|
|
1029
|
+
provider arm, plus the host's `dataSource` and `apiFetch`. Every authored or host
|
|
1030
|
+
change that used to refetch still refetches — a changed `api` endpoint, changed
|
|
1031
|
+
`read`/`write` config, changed inline `items`, a swapped adapter, a swapped
|
|
1032
|
+
authenticated fetch, a changed object, filter or sort. What no longer refetches is a
|
|
1033
|
+
discard, and an inert key inside `data` that the resolved adapter never reads.
|
|
1034
|
+
|
|
1035
|
+
The file already recorded half of this in the first person: `dataItems` came off that
|
|
1036
|
+
same dependency list because a discard «was enough to give `reload` a fresh identity
|
|
1037
|
+
and re-fire the mount effect below (objectui#6592)». One banned identity came off the
|
|
1038
|
+
line then; the other stayed on it until now.
|
|
1039
|
+
- 875ee61: fix(plugin-calendar, plugin-map, plugin-gantt): the registrations' `inputs` agree with the record-source rule
|
|
1040
|
+
|
|
1041
|
+
All three blocks read their records from one of `data`, `staticData` and
|
|
1042
|
+
`objectName` (in that order), and their `@object-ui/types` zod schemas enforce
|
|
1043
|
+
"one of the three" through `requireRecordSource`. The designer-facing `inputs`
|
|
1044
|
+
on the registrations disagreed with that rule in two ways:
|
|
1045
|
+
|
|
1046
|
+
- `object-calendar` and `calendar` still declared `objectName` as required, so
|
|
1047
|
+
the html tier's validator reported a `missing-required-prop` error on a
|
|
1048
|
+
calendar authored on `staticData` or `data`, which the schema accepts and the
|
|
1049
|
+
renderer draws. `objectName` is now declared without `required`, and its
|
|
1050
|
+
description states the rule, as objectui#7470 did for map and gantt
|
|
1051
|
+
(objectui#10392).
|
|
1052
|
+
- `object-map`, `map` and `object-gantt` did not declare `data` or
|
|
1053
|
+
`staticData`, so the validator reported a block authored on either as an
|
|
1054
|
+
unknown prop. At this change both were declared on all three, on the schema's
|
|
1055
|
+
own arms: `data` is a `{ provider, … }` data-source configuration (an object,
|
|
1056
|
+
so a bare array there draws a type diagnostic, matching the schema), and
|
|
1057
|
+
`staticData` is an array of records. Each description says what the renderer
|
|
1058
|
+
does with the key, including that the map does not implement the `api`
|
|
1059
|
+
provider (objectui#10394).
|
|
1060
|
+
|
|
1061
|
+
⚠️ **Dated note, 2026-09-25 — the bare `map` registration has since been
|
|
1062
|
+
retired — objectui#10393.** Later in this same release `@object-ui/plugin-map`
|
|
1063
|
+
stopped registering the bare `map` key (and its namespaced twin `view:map`),
|
|
1064
|
+
so `map` declares nothing: a node authored `"type": "map"` resolves no
|
|
1065
|
+
renderer, and the html tier reports it as `unknown-component`. The
|
|
1066
|
+
`object-map` and `object-gantt` registrations keep both inputs exactly as
|
|
1067
|
+
described above. The rest of this entry is kept as the reading of this
|
|
1068
|
+
change; the objectui#10393 entry states what ships.
|
|
1069
|
+
|
|
1070
|
+
The renderers' read order and the zod schemas are unchanged. The
|
|
1071
|
+
`@object-ui/plugin-gantt` README sentence that listed the registration's inputs
|
|
1072
|
+
is updated.
|
|
1073
|
+
|
|
1074
|
+
**Correction, 2026-10-01 (objectui#11117).** "One of the three" now has an exception on all
|
|
1075
|
+
three blocks: a block that declares none of them is accepted when its `dataSource.object` names
|
|
1076
|
+
the object, because the registration's `ElementDataSourceGate` lands that name on `objectName`.
|
|
1077
|
+
The `objectName` input description now says so.
|
|
1078
|
+
- e5f4343: Four more date faces now follow the display locale, not the UI language (objectui#10442).
|
|
1079
|
+
|
|
1080
|
+
Each one takes its locale from `useDisplayLocale()` instead of the UI language. With an English UI and
|
|
1081
|
+
a `de-CH` display locale, a date that used to read `3/4/2020` now reads `4.3.2020`. With no display
|
|
1082
|
+
locale declared, the display locale falls back to the UI language, so these dates render as before.
|
|
1083
|
+
|
|
1084
|
+
- `data-table` (`@object-ui/components`): the ISO date and datetime cells.
|
|
1085
|
+
- The record page's History tab (`@object-ui/app-shell`): the `date` and `datetime` values in each
|
|
1086
|
+
field diff.
|
|
1087
|
+
- `ResourceWorkload` (`@object-ui/plugin-gantt`): the column labels and the cell tooltips. With no
|
|
1088
|
+
language at all it used to fall through to the machine's locale; it now gets the display locale's
|
|
1089
|
+
own last resort.
|
|
1090
|
+
- `CalendarView` (`@object-ui/plugin-calendar`): the default locale for the header, the weekday
|
|
1091
|
+
columns and the day cells. An explicit `locale` prop still wins over the display locale.
|
|
1092
|
+
- 2803fac: fix(plugin-gantt): a failed load no longer keeps `ObjectGantt` on its error screen after a later load succeeds
|
|
1093
|
+
|
|
1094
|
+
`ObjectGantt` sets `error` when the current reload fails, and the render returns
|
|
1095
|
+
the error screen early whenever `error` is set. Nothing ever cleared it. After one
|
|
1096
|
+
failed load (a filter or sort change against a flaky backend, say), every later
|
|
1097
|
+
load that succeeded still wrote its rows, but the chart stayed on the error screen
|
|
1098
|
+
until the component remounted.
|
|
1099
|
+
|
|
1100
|
+
The current reload now clears the error when it commits rows, whether it is a
|
|
1101
|
+
changed query or a silent re-read of the same one (a data-invalidation, say). Those
|
|
1102
|
+
rows answer the current query, so the earlier failure no longer describes the
|
|
1103
|
+
screen. A superseded reload's answer is discarded under the existing `isCurrent()`
|
|
1104
|
+
guard, and its clear is discarded with it, so it cannot remove an error the current
|
|
1105
|
+
reload reported.
|
|
1106
|
+
|
|
1107
|
+
The error is deliberately not cleared when a reload starts, although `ObjectGrid`'s
|
|
1108
|
+
load clears there. A silent re-read can overtake a changed query and then fail
|
|
1109
|
+
without reporting it. Had the changed query cleared the error when it started, the
|
|
1110
|
+
chart would go back to an older query's rows with nothing to say they are stale.
|
|
1111
|
+
Until rows that answer the current query land, the error stays on screen. Before the
|
|
1112
|
+
first paint the loading placeholder still shows while a query is in flight.
|
|
1113
|
+
- 9d89c6f: fix(plugin-gantt): a silent re-read that overtakes a changed query now reports that query's failure
|
|
1114
|
+
|
|
1115
|
+
`ObjectGantt` re-reads in two modes. A changed query (a sort, filter or search
|
|
1116
|
+
change) reports a failure on the error screen. A silent re-read of the same query
|
|
1117
|
+
(a data-invalidation, the toolbar refresh, or the read-back after a drag, resize or
|
|
1118
|
+
inline edit) only logs a failure and keeps the last good rows, because those rows
|
|
1119
|
+
still answer that query.
|
|
1120
|
+
|
|
1121
|
+
Only the newest re-read may commit, so a silent re-read that starts while a
|
|
1122
|
+
changed query is still in flight makes that query's run stale. The re-read reads
|
|
1123
|
+
the changed query too. When it failed, the chart kept the rows of the query before
|
|
1124
|
+
the change, with no error and no refreshing state. Those rows answer neither query
|
|
1125
|
+
the user asked for.
|
|
1126
|
+
|
|
1127
|
+
A silent re-read that overtakes a changed query in flight now takes over that
|
|
1128
|
+
query's report: its failure shows the error screen, as the changed query's own
|
|
1129
|
+
failure would. The report passes on if another silent re-read overtakes it, and it
|
|
1130
|
+
is released when the current re-read settles. The same holds for a silent re-read
|
|
1131
|
+
that overtakes the initial load, which used to leave an empty chart with no error.
|
|
1132
|
+
A silent re-read with nothing pending still only logs a failure and keeps its rows.
|
|
1133
|
+
No prop or export changes.
|
|
1134
|
+
- f9c06ef: Every data node that sends its own authored `filter` into a query now resolves the spec's context tokens first (objectui#10666). With `filter: [['owner', '=', '{current_user_id}']]` these nodes used to send the literal token; they now send the signed-in user's id, and `{current_org_id}` resolves to the active organization:
|
|
1135
|
+
|
|
1136
|
+
- `object-calendar`, `object-map` and `object-tree`, on both the object query and the inline (`provider: 'value'`) query;
|
|
1137
|
+
- `object-gantt`, `object-kanban` and `object-timeline`;
|
|
1138
|
+
- `record:related_list` and `record:line_items`, where the node's own filter is combined with the parent-record condition;
|
|
1139
|
+
- the `element:repeater`, `element:number` (both the `aggregate` filter and the `find` fallback) and `element:record_picker` page elements.
|
|
1140
|
+
|
|
1141
|
+
`list-view`, `object-grid` and `object-gallery` already did this, and are unchanged.
|
|
1142
|
+
|
|
1143
|
+
**New in `@object-ui/react`: `useResolvedFilter(filter, scope)`.** Pass it a node's authored filter and `useFilterScope()`. It resolves the filter through `@object-ui/core`'s shared `resolveFilterPlaceholders` and holds the result: re-rendering with an equal filter (even one rebuilt inline on every render) hands back the same value, so a fetch effect keyed on it does not run again, while a structurally different filter or a change of signed-in user or organization resolves again. A filter with no token to resolve is handed back as the value you passed in. The hold is the one `list-view` and `object-gallery` used privately; `plugin-list` now imports it from here, and no second copy remains in that package.
|
|
1144
|
+
|
|
1145
|
+
What changes for an app:
|
|
1146
|
+
|
|
1147
|
+
- A filter with no placeholders reaches the query as before, unchanged.
|
|
1148
|
+
- Nodes that re-queried whenever the host rebuilt an equal filter inline (`object-calendar`, `object-gantt`, `object-kanban`, `object-map`, `object-tree`) no longer issue those redundant queries.
|
|
1149
|
+
- Date macros such as `{today}` in these nodes' own filters are now resolved in the browser's local time, as they already are for `list-view`, `object-grid` and `object-view`. Before, they reached the server as literals, and the server resolved them in the tenant's time zone.
|
|
1150
|
+
|
|
1151
|
+
`@object-ui/types`: the `filter` docblocks on `ObjectMapSchema`, `ObjectTreeSchema`, `ObjectGanttSchema`, `ObjectCalendarSchema`, `ObjectKanbanSchema`, `ObjectChartSchema` and `ObjectGallerySchema` (and the matching zod descriptions) no longer say the filter is forwarded verbatim; they say its context tokens are resolved first. No type changes.
|
|
1152
|
+
- 1659f14: The gantt timeline now follows the display locale, not the UI language (objectui#10668).
|
|
1153
|
+
|
|
1154
|
+
`GanttView` takes its date locale from `useDisplayLocale()` instead of the UI language. This covers the
|
|
1155
|
+
timeline's column and band headers, the toolbar's period label, the task list's start and end dates,
|
|
1156
|
+
a bar's hover card, and the dates shown while a bar is dragged. With an English UI and a `de-CH` display locale, a week column that used to read
|
|
1157
|
+
`3/2` now reads `2.3.`, the same locale `ObjectGantt`'s tooltips and `ResourceWorkload` already use in
|
|
1158
|
+
the same chart. With no display locale declared, the display locale falls back to the UI language, so
|
|
1159
|
+
the timeline renders as before. With no language at all, it used to fall through to the machine's
|
|
1160
|
+
locale; it now gets the display locale's own last resort.
|
|
1161
|
+
- db0beb2: docs(plugin-gantt): authored `object-gantt` examples write their props in the `properties` bag (objectui#10859, batch 6)
|
|
1162
|
+
|
|
1163
|
+
The README's authored `object-gantt` examples now write `{ "type": "object-gantt", "properties": { …, "gantt": { … } } }`, the spelling `@objectstack/spec`'s `ComponentPropsMap['object-gantt']` row declares and `objectui validate` now requires, with the field mapping in the bag's `gantt` block. The flat field-mapping keys are described as what they are, the handoff `ObjectView` and `ListView` write onto the node they compose. The examples that mount `ObjectGantt` directly keep the flat `schema` prop: a component mounted without `SchemaRenderer` receives the node as it reads it, and nothing hoists a bag there. Under `src/`, a new render pin holds that the bag draws what the flat spelling drew, and the catalog-plans pin reads the catalog entries' bag. No runtime change.
|
|
1164
|
+
- 6650259: fix(plugin-calendar): a day event moved across a DST change writes the days it was dropped on (objectui#10866, slice 4)
|
|
1165
|
+
|
|
1166
|
+
- **plugin-calendar.** At this change the month grid moved each date of an event by the milliseconds between two local midnights, the grabbed cell's and the drop cell's, and a date-only value is read at local midnight of its day. So when a DST change lay between one of an event's dates and where it landed, but not between the two cells (or the other way round), that date came back an hour off local midnight; at 23:00 of the day before, the write took the day before. Under `America/Los_Angeles` a span of `date` fields moved across November 1st or March 8th could be written a day short at its start or its end. A move of an event whose start, and end when it has one, are both stored calendar days now writes each `date` field as its stored day moved by the whole days the grid moved it. Every other write is unchanged: a `datetime` field still writes the instant the grid hands back, and at this change the grid's own arithmetic does not change.
|
|
1167
|
+
|
|
1168
|
+
⚠️ **Dated note, 2026-09-29 — the month grid now moves by calendar days — objectui#11005.** Later in this same release the month grid moves a value by the calendar days between the grabbed cell and the drop cell and keeps its time of day, for a move and for a drag of a span's end, so a 10:00 `datetime` stays at 10:00 across a DST change. A `date` value read at local midnight of its day then comes back at local midnight of the day it was dropped on, so the repair described above is removed and a moved `date` field is written as that local day, which is the same day the repair wrote. The rest of this entry is kept as the reading of this change; the objectui#11005 entry states what ships.
|
|
1169
|
+
- **plugin-gantt, types.** The business `timeZone` prose (`GanttConfig.timeZone`, `GanttViewProps.timeZone` and `makeTzShift`) said persisted data stays real instants. A `date` field under a zoned chart has been written as a calendar day since this card's first slice; at this change the prose says so, and says that near a DST change of the chart's zone or the viewer's the shim can place a day's midnight an hour early, onto the day before. Documentation only.
|
|
1170
|
+
|
|
1171
|
+
⚠️ **Dated note, 2026-09-29 — a zoned chart reads and writes a day exactly on a DST change — objectui#10866, slice 5.** Later in this same release `ObjectGantt` inverts the shim exactly for a date-only day, so a stored day is drawn from its own midnight and a drop writes the day it was dropped on, on a DST change of the chart's zone or the viewer's too. The `GanttConfig.timeZone` and `GanttViewProps.timeZone` prose no longer says a day can land on the day before, and `makeTzShift`'s says a day does not take the shim's round trip. The rest of this entry is kept as the reading of this change; the slice-5 entry states what ships.
|
|
1172
|
+
- **core.** The `DATEADD` / `DATEDIFF` / `DATEFORMAT` docblock names how a mixed `DATEDIFF`, one day and one instant, reads each argument when it counts months or years. Comment only.
|
|
1173
|
+
- 4f8b7f8: fix(plugin-calendar,plugin-gantt): a stored date-only day shows on that day in every viewer zone, and a `date` field is written back as a calendar day (objectui#10866, slice 1)
|
|
1174
|
+
|
|
1175
|
+
The calendar and the gantt read a record's `YYYY-MM-DD` value with the engine's own `Date` parse, which reads it as UTC midnight. West of UTC a task due on the 5th therefore showed on the 4th, in both views. Moving it then wrote `toISOString()` into the field: a UTC instant stored in a `Field.date`.
|
|
1176
|
+
|
|
1177
|
+
- **Reads.** Every date-only read in the two plugins now goes through `toDisplayDate` from `@object-ui/core`, which reads the value at local midnight of the day it names. In the calendar these are the object calendar's event start and end, and the `calendar-view` node's events and its authored `currentDate`. In the gantt they are the task start, end and baselines, a marker authored as a day, and the day typed into the inline editor. A value with a time keeps its instant.
|
|
1178
|
+
- **Writes.** A calendar drop, a calendar quick-create and a gantt drag now write a field declared `date` as the local calendar day, `yyyy-MM-dd`. A `datetime` field keeps its instant. When no object schema is available to say which type a field is, the stored value's own shape decides, which is the same split the read makes; a calendar quick-create has no stored value, so there it still writes the instant.
|
|
1179
|
+
- **Gantt `timeZone`.** A chart with a business `timeZone` re-bases every instant into that zone. A date-only day is not re-based: its bar and its marker stand on that day of the chart's calendar for every viewer, and a drop writes the day of the chart's calendar that the bar was dropped on.
|
|
1180
|
+
- **Gantt working calendar.** `skipWeekends` / `holidays` now count the chart's own calendar days (local midnight, the same keys the day columns already folded by) rather than UTC days. The UTC floor put a rescheduled successor on the previous day in every zone except UTC once date-only values read as local days. `@object-ui/types` updates the `holidays` description to match.
|
|
1181
|
+
|
|
1182
|
+
The timeline, charts, formula date functions and i18n helpers are later slices of objectui#10866.
|
|
1183
|
+
- e119f12: fix(plugin-gantt): a gantt move shifts a task's end by the calendar days it shifts the start, keeping each value's time of day across a DST change (objectui#10866, slice 6)
|
|
1184
|
+
|
|
1185
|
+
On the day, week, month, quarter and year scales a drag snaps to whole days. The start moved by calendar days, but the end followed it by the elapsed milliseconds of the start's move, and a summary's group move carried every task beneath it by that same span. Across a DST change of the viewer's zone that span is a whole number of days plus or minus an hour. Under `America/Los_Angeles`, a `date` task from October 29th to October 31st moved three days wrote `end_date` `2026-11-02` where the drop reads November 3rd; a `datetime` end that crossed the change when its start did not moved its wall-clock time by an hour; a task under a moved summary could start on the day before the one it was dropped on. An edge drag past the other edge stopped 24 hours from it, which on a DST day is 23:00 of the day before, or 01:00.
|
|
1186
|
+
|
|
1187
|
+
- **Move.** A drag now counts the calendar days its snapped start moved and moves the start and the end by that many days on the local calendar. Each keeps its hours, minutes, seconds and milliseconds, as objectui#11005 ruled for the calendar's month grid, so a `date` task keeps its length in days and a 10:00 start stays at 10:00. This deliberately changes the instant a drag writes into a `datetime` end across a DST change; what a `datetime` field stores and how it is read are unchanged.
|
|
1188
|
+
- **Edge drags.** The end handle already moved the end by calendar days, keeping its time of day. An edge dragged past the other edge now stops one calendar day from it.
|
|
1189
|
+
- **Group move.** Dragging a summary moves the summary and every unlocked task beneath it by the same calendar days, and the live preview draws what the drop writes.
|
|
1190
|
+
- **Unchanged.** In a zone without DST every day is 24 hours, so a drag writes what it wrote before. The shift-band scale (`timeSegments` in day view) moves by bands on an elapsed-time axis and is unchanged.
|
|
1191
|
+
- f6ae5e2: fix(plugin-gantt): a zoned chart reads and writes a stored day as that day on a DST change (objectui#10866, slice 5)
|
|
1192
|
+
|
|
1193
|
+
A gantt with a business `timeZone` draws every date through a shim that re-bases it into that zone, and hands every dropped date back through the shim's inverse. Since this card's first slice, earlier in this same release, `ObjectGantt` has handed a date-only day in as the shim's inverse of the day's local midnight, and read a dropped `date` field back through the shim. Each direction reads the two zones' offsets at the instant it is handed, so on a DST day of one zone and not the other the round trip missed by an hour. An `America/Los_Angeles` viewer of an `America/New_York` chart saw a stored `2026-03-08` drawn from 23:00 on March 7th, and a drop onto March 8th wrote `2026-03-07`; `2026-11-01` was drawn from 01:00. A `Europe/Berlin` viewer of the same chart saw `2026-03-29` drawn from 23:00 on March 28th, and a drop onto it wrote `2026-03-28`.
|
|
1194
|
+
|
|
1195
|
+
- **plugin-gantt.** `ObjectGantt` now inverts the shim exactly for a day: it hands the view the instant the shim maps onto the day's local midnight, and writes the day of the display date the dropped instant was translated from. A stored day is drawn from its own midnight and a drop writes the day it was dropped on, on a DST change of the chart's zone or the viewer's too. Where the shim draws no instant at that midnight, as when the chart's zone changes its clocks at 00:00, the day is drawn from the first instant after it, on that day. A `datetime` value goes through the shim unchanged, and a chart with no `timeZone` is unchanged.
|
|
1196
|
+
- **types.** The `GanttConfig.timeZone` description said that near a DST change a day could be drawn, and a drop written, as the day before. It now says the day holds on a DST change too.
|
|
1197
|
+
- 0e6e76b: fix(plugin-gantt, plugin-calendar): the `objectName` input description names the `dataSource.object` binding (objectui#11117)
|
|
1198
|
+
|
|
1199
|
+
The designer-facing `objectName` input on `object-gantt` and `object-calendar` (and
|
|
1200
|
+
`view:calendar`, which shares the calendar's list) said the block's schema refuses a block that
|
|
1201
|
+
declares none of `data`, `staticData` and `objectName`. Since objectui#11117 the schema also
|
|
1202
|
+
accepts a block whose `dataSource.object` names the object, because the registration's
|
|
1203
|
+
`ElementDataSourceGate` lands that name on `objectName` before the renderer reads the node. The
|
|
1204
|
+
sentence now says so. No input's name, type, `required` flag or shape changed. (`object-map`'s
|
|
1205
|
+
input already names the binding: objectui#10859 batch 5 rewrote it.)
|
|
1206
|
+
|
|
1207
|
+
The `plugin-gantt` and `plugin-kanban` READMEs carry the same correction.
|
|
1208
|
+
- 858eafb: fix(plugin-gantt,core,plugin-timeline): both gantt surfaces read a date-only end inclusively through one core rule, and a drag writes the same day back (objectui#11141)
|
|
1209
|
+
|
|
1210
|
+
**A widening: `@object-ui/core` gains two exports**, `toDisplayEndDate(value)` and `toInclusiveEndDay(end)`, on its published entry beside `toDisplayDate` (the same file, `utils/date-display.ts`, re-exported by `export *`). Nothing else in `@object-ui/core` is added, removed, renamed or retyped.
|
|
1211
|
+
|
|
1212
|
+
- **A date-only end is inclusive on the object gantt too.** `ObjectGantt` read a stored end like a start, as the named day's local midnight, so every bar was drawn one day short and a successor starting the next day stood one day after its predecessor. The schema catalog's own plans drew that way. A task from `2024-01-01` to `2024-01-15` now runs through January 15th, and a successor starting `2024-01-16` begins exactly where it ends, as the timeline's gantt already drew it (objectui#11112). A task whose date-only start and end name the same day is now one day long, where it was a zero-length milestone. An end with a time part is still an instant, and the bar ends exactly there. Baseline ends read the same way.
|
|
1213
|
+
- **One rule, in `@object-ui/core`.** `toDisplayEndDate` reads an end: a date-only value becomes the start of the next day (a calendar day, so 23 or 25 hours across a DST change), and anything else is read as `toDisplayDate` reads it. `toInclusiveEndDay` is its exact inverse: it names the last day a span ending at an instant runs through. The timeline's gantt and `ObjectGantt` both read their ends through the first, so they cannot drift apart again. A day whose OWN midnight does not exist in the viewer's zone (`America/Santiago` on 2026-09-06, which starts at 01:00) now ends at the next day's midnight; the timeline used to end it at 01:00 of that next day. A day whose NEXT midnight does not exist (2026-09-05 there) still ends at the next day's first hour, as it did.
|
|
1214
|
+
- **A drag writes the day the bar runs through.** A dragged or resized bar whose end lands on a day's midnight writes the day before it into a date-only end field, so reading, dragging and writing a stored `2024-01-15` leaves `2024-01-15`. This also holds under a business `timeZone` whose clock skips a midnight. A `datetime` end still writes its instant.
|
|
1215
|
+
- **The view names that day.** `GanttView`'s End column, row date line, tooltip, drag preview and inline editor now name the last day a bar runs through, and the tooltip's day count includes it. Pressing Enter on an untouched row in the inline editor commits the end it started with. An end inside a day still names that day, and a zero-length task still names its own day. An embedder that passes `GanttView` a `Date` end directly now sees that end named as the last day the bar covers. A local-midnight end is named as the day before, which is where its bar already stopped.
|
|
1216
|
+
- With `autoZoomToFilter: false`, the pinned range ends on the last day any task runs through, and no longer adds an empty day column after it.
|
|
1217
|
+
- c1763e5: fix(plugin-gantt): a number row in the gantt tooltip shows the field's declared decimals, and none when it declares none
|
|
1218
|
+
|
|
1219
|
+
A tooltip row over a `number` field (and the `integer`, `float` and `decimal`
|
|
1220
|
+
spellings the tooltip groups with it) always read two decimals, whatever the field
|
|
1221
|
+
declared. A field declaring `scale: 3` read `1.50`, a field declaring `scale: 0` read
|
|
1222
|
+
`1.50`, and a `number` with no `scale` read `1.50` while the list cell for the same
|
|
1223
|
+
value read `1.5`. The row now reads the field's width through `resolveFieldScale`
|
|
1224
|
+
from `@objectstack/spec/data`, as the list cell does. A declared `scale` is that
|
|
1225
|
+
width. A field with no `scale` shows the value as stored (`1.5`, `12`, `7`), because
|
|
1226
|
+
the protocol gives these types no default width.
|
|
1227
|
+
|
|
1228
|
+
Only the decimals change. The row still uses the display locale, and it still groups
|
|
1229
|
+
thousands as before.
|
|
1230
|
+
- b149617: fix(plugin-gantt): a percent row in the gantt tooltip shows the field's declared decimals
|
|
1231
|
+
|
|
1232
|
+
A tooltip row over a `percent` field declaring `scale: 2` read whole percents
|
|
1233
|
+
(`12%`) while the list cell for the same value read `12.34%`. The row now reads
|
|
1234
|
+
the field's width through `resolveFieldScale` from `@objectstack/spec/data`, as
|
|
1235
|
+
the list cell does. A percent that declares no `scale` is unchanged.
|
|
1236
|
+
|
|
1237
|
+
`@object-ui/plugin-gantt` raises its `@objectstack/spec` floor to `^17.5.0`,
|
|
1238
|
+
the first release exporting `resolveFieldScale`.
|
|
1239
|
+
- 31987bd: Three more reader sites stop riding `BaseSchema`'s index signature (objectui#11355 round 2, part of the preparation for objectui#8347's removal of that signature). None changes runtime behaviour.
|
|
1240
|
+
|
|
1241
|
+
**`ActionBarSchema`, the `action:bar` node, is now exported by `@object-ui/types`.** It used to be declared in `@object-ui/components`' `renderers/action/action-bar.tsx`, which is not on that package's entry, so a host could not import it. It now lives in `@object-ui/types`' `ui-action.ts`, beside `UIActionSchema`: `actions` and `systemActions` are `UIActionSchema[]`, and `location` is `@objectstack/spec`'s `ActionLocation`. It declares no `[key: string]: any`, so a literal typed `ActionBarSchema` may write only its declared members, which are the keys the renderer reads. The renderer imports it from `@object-ui/types`, and its parameter annotation keeps its own index signature for the DOM pass-through (objectui#4422). `@object-ui/components` adds no export.
|
|
1242
|
+
|
|
1243
|
+
**`ObjectChartSchema.isAnimationActive?: boolean` is declared on the TypeScript face.** Code sets it `false` for a render with no entrance animation: `DashboardRenderer` and `DashboardGridLayout` on the `object-chart` nodes they build, and `DatasetWidget` and `DatasetReportRenderer` on the nodes they hand the `chart` registration. `ChartRenderer` honours it. The zod mirror declares no member for it, so it is not an authoring key; `zod-mirror-parity.test.ts` files it as runtime-only.
|
|
1244
|
+
|
|
1245
|
+
**Typed where they stand.**
|
|
1246
|
+
|
|
1247
|
+
- `@object-ui/app-shell`: the list-toolbar `action:bar` nodes in `EnvironmentListToolbar`, `InterfaceListPage` and `ObjectView` are built as `ActionBarSchema` values before they reach `SchemaRenderer`.
|
|
1248
|
+
- `@object-ui/plugin-gantt`: `ObjectGantt`'s dev warning about flat gantt keys that a `gantt` block shadows reads those keys off `ObjectGanttSchema`, which declares every one, instead of through a `Record` conversion.
|
|
1249
|
+
|
|
1250
|
+
**minor, not patch, for `@object-ui/types`.** `ActionBarSchema` is a new export, and `isAnimationActive` is a new member in the shipped `.d.ts`.
|
|
1251
|
+
- 4a1adb7: The schedule-conflict and auto-schedule dialogs' task counts read the right noun form in every language at every count (objectui#11445): `gantt.conflict.body`, `gantt.autoScheduleDlg.body` and `gantt.autoScheduleDlg.skipped` are i18next count families, so German no longer reads `1 betroffene Vorgänge` and Russian reads `3 задачи`. The provider-less fallback reads a family's `_one` / `_other` row for a numeric `count`.
|
|
1252
|
+
- f560ded: The gantt tooltip's `percent` row scales at the storage the field declares
|
|
1253
|
+
(`percentCellScale`, the spec's `percentScaleOf`), the answer the list cell
|
|
1254
|
+
reads. A fraction-stored `1` now reads `100%`, where the old magnitude guess
|
|
1255
|
+
read `1%` (objectui#11475).
|
|
1256
|
+
- 39f4309: Published typings from every `vite-plugin-dts` package now carry an explicit extension on
|
|
1257
|
+
every relative specifier, and a type error in the declaration build now fails the build
|
|
1258
|
+
instead of being printed and ignored (objectui#5439, objectui#5483).
|
|
1259
|
+
|
|
1260
|
+
**Consumers on `moduleResolution: nodenext` or `node16` may see NEW type errors, and that
|
|
1261
|
+
is the fix working.** These packages re-export mostly through NAMED re-exports —
|
|
1262
|
+
`export { useObjectChat } from './useObjectChat'`. TypeScript could not follow the
|
|
1263
|
+
extensionless hop, but it still DECLARED the name, so the symbol resolved to a silent
|
|
1264
|
+
`any`. Nothing errored; consumers simply got no types. With the extension emitted, the
|
|
1265
|
+
symbol carries its real type, and any call site that was relying on the `any` now type
|
|
1266
|
+
checks for the first time. This is the mode that produced the 21 residual `TS7006` on
|
|
1267
|
+
`@object-ui/app-shell` reported against objectui#5365 — a type hole that opened quietly,
|
|
1268
|
+
unlike objectui#5365's own `export * from './ui'` packages where the same defect surfaced
|
|
1269
|
+
immediately as `TS2305: has no exported member`.
|
|
1270
|
+
|
|
1271
|
+
410 extensionless relative specifiers across 19 packages were emitted before this change;
|
|
1272
|
+
the count is now 0 in all 22 packages that build typings through `vite-plugin-dts`.
|
|
1273
|
+
`@object-ui/fields` was already clean — its sources write explicit `.js` specifiers — and
|
|
1274
|
+
is wired so it stays that way.
|
|
1275
|
+
|
|
1276
|
+
The second half changes no emitted output today: 22/22 packages built green unmodified, so
|
|
1277
|
+
making the declaration step's exit code honest turns nothing red. It changes what a FUTURE
|
|
1278
|
+
regression does — print and exit 0, versus fail the build.
|
|
1279
|
+
- 9b61cf1: The package README stops documenting a `navigation` key the spec refuses, and the corrected example is now parsed by the schema that validates it.
|
|
1280
|
+
|
|
1281
|
+
`README.md`'s record-navigation override read
|
|
1282
|
+
`{ mode: 'page', basePath: '/console/apps/.../campaign' }`. `basePath` is not a
|
|
1283
|
+
member of the spec's `NavigationConfig`, and nothing consumes it:
|
|
1284
|
+
`useNavigationOverlay` — where a gantt's `navigation` lands — builds no URL out
|
|
1285
|
+
of the config, and `ObjectGantt` calls the hook with no `onNavigate`, so a
|
|
1286
|
+
page-mode click falls through to the host's `onRowClick`. The destination route
|
|
1287
|
+
is owned by the host and was never authorable through this key, under any
|
|
1288
|
+
spelling.
|
|
1289
|
+
|
|
1290
|
+
That made the snippet worse than inert. `NavigationConfigSchema` is a strict
|
|
1291
|
+
object with no passthrough, so the undeclared key did not fall away quietly — it
|
|
1292
|
+
rejected the **whole** config with `unrecognized_keys`, taking down the
|
|
1293
|
+
`mode: 'page'` the sentence was actually teaching. An author who copied the
|
|
1294
|
+
documented snippet got a rejected navigation config and no page navigation, which
|
|
1295
|
+
is the copy-the-snippet-get-rejected shape objectui#5057 / #5012 named on other
|
|
1296
|
+
keys.
|
|
1297
|
+
|
|
1298
|
+
The example is corrected to `{ "navigation": { "mode": "page" } }` — the shape
|
|
1299
|
+
the sentence demonstrates — and the prose now says who owns the destination route
|
|
1300
|
+
and points at `@objectstack/spec`'s `NavigationConfigSchema` for the member list
|
|
1301
|
+
instead of restating it, matching the derivation `ObjectGanttSchema.navigation`'s
|
|
1302
|
+
doc comment (objectui#5903) adopted for the same concept.
|
|
1303
|
+
|
|
1304
|
+
`view` is **not** substituted for `basePath`. It is a declared member, but it
|
|
1305
|
+
names a form view (the spec: *"Name of the form view to use for details"*) and is
|
|
1306
|
+
forwarded to `onNavigate` as the action argument — it is not a route, so putting
|
|
1307
|
+
it where `basePath` stood would have replaced an invented key with a wrong one.
|
|
1308
|
+
It is documented for what it does.
|
|
1309
|
+
|
|
1310
|
+
No gate in this repo could have caught the original defect, and that is why the
|
|
1311
|
+
fix ships with a measurement rather than a re-reading: `check-doc-snippet-types`
|
|
1312
|
+
compiles `ts`/`tsx` fences and `check-doc-component-types` reads `type` literals,
|
|
1313
|
+
and both are structurally blind to a metadata key in a README — the former's own
|
|
1314
|
+
header records schema-key validity as "a different question … left unruled on
|
|
1315
|
+
purpose". `src/readme-navigation-example.test.ts` closes that hole for this
|
|
1316
|
+
example by EXTRACTING the fence from the README on every run and parsing it
|
|
1317
|
+
against `NavigationConfigSchema`, with a control asserting the same parse still
|
|
1318
|
+
rejects an undeclared key by name, so the green cannot come from a schema that
|
|
1319
|
+
accepts everything.
|
|
1320
|
+
|
|
1321
|
+
`tsconfig.test.json` names `node` in `types` for that test to compile, and its
|
|
1322
|
+
comment — which had recorded that no test in this package touches a Node global
|
|
1323
|
+
— is corrected rather than left standing.
|
|
1324
|
+
|
|
1325
|
+
**Dated note, 2026-10-01 (objectui#11168 slice 4).** Two sentences above describe a README that has since moved. objectui#7334 (same release) gave `ObjectGantt` its own `onNavigate`, so a `page` click no longer falls through to a host handler: the gantt navigates to the record-page address it derives from the page it is on, and no `navigation` member authors that address, `basePath` included. The README example is now the authored node, with `{ "mode": "page" }` inside its `properties` bag, and the prose says where that address leads. The rest of this entry is kept as the reading of this change.
|
|
1326
|
+
- cbc8839: `ObjectGantt`'s export filename resolves a locale-map `label` instead of stringifying it
|
|
1327
|
+
(objectui#6052). A gantt authored as
|
|
1328
|
+
`{ "type": "object-gantt", "objectName": "task", "label": { "en": "Shift Plan", "zh-CN": "排班计划" } }`
|
|
1329
|
+
exported its PNG/PDF as `[object Object]-20260825-1030.png`.
|
|
1330
|
+
|
|
1331
|
+
`BaseSchema.label` is `string | I18nLabel` since #4580's revised Q1-A ruling — `I18nLabel`
|
|
1332
|
+
being the spec's INLINE locale MAP — and the `exportFileName` chain handed that value
|
|
1333
|
+
straight to `String(...)`. It now goes through `resolveI18nLabel` from `@objectstack/spec/ui`,
|
|
1334
|
+
the producer's own resolver for that vocabulary, against the display locale the file already
|
|
1335
|
+
reads via `useDisplayLocale()`. A zh-CN audience gets `排班计划-<stamp>.png`, an en audience
|
|
1336
|
+
`Shift Plan-<stamp>.png`, and a plain-string label is unchanged.
|
|
1337
|
+
|
|
1338
|
+
The next link in the same chain, `objectSchema?.label`, is deliberately left alone: that is
|
|
1339
|
+
the DATA object's label, declared `z.string().optional()` on the spec's `ObjectSchemaBase`,
|
|
1340
|
+
which is a `strictObject` — a locale map there is rejected by the producer rather than
|
|
1341
|
+
resolved by the consumer, and wrapping it would be accepting a second vocabulary at a read
|
|
1342
|
+
site. No filename sanitisation is added either; `GanttView` already strips
|
|
1343
|
+
filesystem-hostile characters downstream, and a resolved map entry goes through the same
|
|
1344
|
+
strip a plain string does.
|
|
1345
|
+
- 45a9aeb: `ObjectGanttSchema.dependencyField` is now marked `@deprecated` on both published
|
|
1346
|
+
declaration faces, naming `dependenciesField` as the canonical spelling
|
|
1347
|
+
(objectui#6470). Nothing is removed and nothing is rejected that was accepted
|
|
1348
|
+
before.
|
|
1349
|
+
|
|
1350
|
+
**What the two spellings were.** `ObjectGanttSchema` declares both, and
|
|
1351
|
+
`getGanttConfig`'s flat branch reads them with a `||`:
|
|
1352
|
+
`dependenciesField: schema.dependenciesField || schema.dependencyField`.
|
|
1353
|
+
`dependenciesField` is the spec's key (`@objectstack/spec`
|
|
1354
|
+
`GanttConfigSchema.dependenciesField`); the singular `dependencyField` has NO
|
|
1355
|
+
spec counterpart — zero occurrences across `packages/spec/src`, measured against
|
|
1356
|
+
a live positive control on the plural. Until objectui#6051 declared the plural,
|
|
1357
|
+
the singular was the ONLY dependencies spelling this interface carried, so for
|
|
1358
|
+
the whole time the alias existed the published type taught the non-spec key and
|
|
1359
|
+
hid the canonical one.
|
|
1360
|
+
|
|
1361
|
+
**What was missing was the ranking, not the behaviour.** The two were declared as
|
|
1362
|
+
equals: nothing on either face said which one to author, so a reader — including
|
|
1363
|
+
an AI writing metadata, which is the reader this project optimises for — had a
|
|
1364
|
+
coin flip between a spec key and pre-spec vocabulary. The marker turns that coin
|
|
1365
|
+
flip into a fact the type itself carries, and the zod mirror's description makes
|
|
1366
|
+
it readable at runtime as well as in an editor.
|
|
1367
|
+
|
|
1368
|
+
This adopts the idiom already ruled for this exact shape rather than inventing a
|
|
1369
|
+
second one: `KanbanConfig`'s pre-#2231 aliases (`groupField`, `cardFields`) carry
|
|
1370
|
+
`/** @deprecated legacy alias for the spec's X */` plus
|
|
1371
|
+
`.describe('Deprecated alias for X')`, and `dependencyField` now reads the same
|
|
1372
|
+
way.
|
|
1373
|
+
|
|
1374
|
+
**⛔ Not a removal, deliberately.** Deleting the alias — or narrowing the
|
|
1375
|
+
renderer's `||` — would break every author who wrote the singular and narrow the
|
|
1376
|
+
accept set of a published surface. That is a maintainer decision on a future
|
|
1377
|
+
enforce-or-remove card once the deprecation has sat a release, and it is
|
|
1378
|
+
explicitly excluded here. Two pins hold the line in both directions:
|
|
1379
|
+
`packages/types/src/__tests__/gantt-dependency-field-deprecated-alias.test.ts`
|
|
1380
|
+
fails if the marker goes missing AND if the alias stops being declared or
|
|
1381
|
+
accepted, and `packages/plugin-gantt/src/ObjectGantt.dependencyAlias.test.tsx`
|
|
1382
|
+
fails if the `||` limb is dropped — the two spellings must keep resolving to the
|
|
1383
|
+
same config, with the canonical one winning when both carry a value.
|
|
1384
|
+
|
|
1385
|
+
`packages/plugin-gantt/README.md`'s `ObjectGanttSchema` example authored the
|
|
1386
|
+
singular; it was the only in-repo site that did, and it now authors the plural
|
|
1387
|
+
with the alias named as legacy. No runtime code, fixture, example app or catalog
|
|
1388
|
+
schema authored it.
|
|
1389
|
+
- f9653ae: Re-key the load-bearing fetch effects in `ObjectMap`, `ObjectCalendar` and
|
|
1390
|
+
`ObjectGantt` onto the primitive fields they actually read off `dataConfig`
|
|
1391
|
+
(`provider` / `object` / `items`) instead of the whole memoised `dataConfig`
|
|
1392
|
+
object (objectui#6592, the deferred half of objectui#6270/PR #6591).
|
|
1393
|
+
`ObjectTree` is a census member too but is deferred out of this change — see
|
|
1394
|
+
the PR body — because its own fetch effects are the surface of PR #6696
|
|
1395
|
+
(objectui#6481), open at the same time.
|
|
1396
|
+
|
|
1397
|
+
`useMemo` carries no semantic guarantee — React is permitted to discard a
|
|
1398
|
+
memo cache and recompute even when its dependency array compares equal to
|
|
1399
|
+
the previous render, and the local `getDataConfig(schema)` helper each of
|
|
1400
|
+
these renderers carries builds a fresh `{ provider, object }` /
|
|
1401
|
+
`{ provider, items }` wrapper object on every call. So a fetch effect keyed
|
|
1402
|
+
on `dataConfig` itself was correct only for as long as that identity
|
|
1403
|
+
happened to survive a discard: a recompute alone (no author or caller
|
|
1404
|
+
action) was enough to re-run the effect and issue an extra
|
|
1405
|
+
`dataSource.find` / `dataSource.getObjectSchema` call. Keying the effects
|
|
1406
|
+
on the primitives instead makes a cache discard a no-op, restoring
|
|
1407
|
+
`useMemo` to a pure optimisation.
|
|
1408
|
+
|
|
1409
|
+
`ObjectGantt`'s `effectiveDataSource` memo deliberately keeps `dataConfig`
|
|
1410
|
+
as a dependency (`resolveDataSource` needs the whole provider-shaped
|
|
1411
|
+
value — the `api` provider's `read`/`write` request config cannot be
|
|
1412
|
+
flattened to a fixed primitive list the way `object`/`value` can), so its
|
|
1413
|
+
`reload()` fetch is decoupled from the redundant direct `dataConfig`
|
|
1414
|
+
dependency but not from `effectiveDataSource`'s own; for the `object`/`value`
|
|
1415
|
+
providers `resolveDataSource` returns its `fallback`/a fresh
|
|
1416
|
+
`ValueDataSource` respectively rather than reading further into the config,
|
|
1417
|
+
which is enough for the two fetch effects to observe no extra call under a
|
|
1418
|
+
recomputed-but-equivalent `dataConfig` in the common case.
|
|
1419
|
+
|
|
1420
|
+
No behaviour change for a schema whose `useMemo` caches survive normally;
|
|
1421
|
+
the effects are unaffected by React discarding one.
|
|
1422
|
+
- 3beef6d: The spec's `dataSource` element binding is now DECLARED by the blocks that read
|
|
1423
|
+
it, so the html tier stops reporting the one working saved-view spelling as
|
|
1424
|
+
`unknown-prop` (objectui#6678).
|
|
1425
|
+
|
|
1426
|
+
`PageComponentSchema.dataSource` — `{ object, view, filter, sort, limit }` — is
|
|
1427
|
+
the one spelling that resolves a saved view for an object-bound block. It works,
|
|
1428
|
+
and it drew the identical `unknown-prop` warning as the two spellings that do
|
|
1429
|
+
nothing (`viewName`, `view`), because `validateTree` looks a prop up in the
|
|
1430
|
+
block's declared `inputs` and no registration declared this key. On the tier
|
|
1431
|
+
built to accept AI-authored pages, where the diagnostic IS the contract, the
|
|
1432
|
+
only signal pointed away from the key that works.
|
|
1433
|
+
|
|
1434
|
+
Adopting the maintainer ruling of 2026-08-29 — option B **in the injection
|
|
1435
|
+
form**:
|
|
1436
|
+
|
|
1437
|
+
- `ELEMENT_DATA_SOURCE_INPUT` is the single declaration, in `@object-ui/core`
|
|
1438
|
+
beside the binding's own semantics; `Registry.register` emits it for any
|
|
1439
|
+
registration whose renderer passed through the new `elementDataSourceBlock()`
|
|
1440
|
+
seam. One mechanism, one copy — not a hand-kept declaration per block, which is
|
|
1441
|
+
the shape that drifts and that a new block forgets. The seam lives in
|
|
1442
|
+
`@object-ui/core` and is re-exported by `@object-ui/react` beside
|
|
1443
|
+
`ElementDataSourceGate` for discoverability; call sites take the core import,
|
|
1444
|
+
because a registration runs at module scope and this repo's suites partially
|
|
1445
|
+
mock `@object-ui/react`.
|
|
1446
|
+
- Seventeen renderers, in thirteen files across twelve packages, reach the seam
|
|
1447
|
+
and now publish the key to the save gate, the parser whitelist, the generated
|
|
1448
|
+
JSX authoring types and the block list. The card named nine blocks; the tree
|
|
1449
|
+
also has `plugin-grid`, `plugin-timeline`, two further `plugin-form` blocks and
|
|
1450
|
+
`element:record_picker` — nothing was hand-listed, so the mechanism covered
|
|
1451
|
+
them. `element:record_picker` consumes the gate's HOOK and status panels rather
|
|
1452
|
+
than the wrapper tag (its object lives under `properties`), and was found by a
|
|
1453
|
+
render probe rather than by reading sources.
|
|
1454
|
+
- `dataSource` on a block that does NOT read it (`flex`, `card`) still reports
|
|
1455
|
+
`unknown-prop`. Adding the key to `sdui-parser`'s `BASE_PROPS` was refused for
|
|
1456
|
+
exactly this reason — that set mirrors `BaseSchema`, and silencing the key
|
|
1457
|
+
everywhere would make the diagnostic lie in the other direction.
|
|
1458
|
+
- New `check:element-data-source-declaration` fails any source that consumes the
|
|
1459
|
+
gate without reaching the seam, so a block added tomorrow cannot forget.
|
|
1460
|
+
|
|
1461
|
+
Behaviour of the binding itself is unchanged — this is a declaration, not a
|
|
1462
|
+
resolution change. The saved view still resolves its columns, and an
|
|
1463
|
+
unresolvable `view` still fails loudly rather than widening to the object's full
|
|
1464
|
+
scope.
|
|
1465
|
+
|
|
1466
|
+
The spec/registry parity gates (repo-wide and the `record:related_list` per-block
|
|
1467
|
+
pin) now derive their accepted set from the WHOLE node contract rather than from
|
|
1468
|
+
`ComponentPropsMap[type]` alone. `PageComponentSchema` accepts and keeps
|
|
1469
|
+
`dataSource` on a page-component node — it is a node-level key, a sibling of
|
|
1470
|
+
`type` and `className`, not a per-block prop — so the gates' previous complaint
|
|
1471
|
+
was measurably wrong. Derived from the spec, not exempted, and both still
|
|
1472
|
+
discriminate against an invented key.
|
|
1473
|
+
- 231d1b9: Gantt toolbar: the period label names the visible window, and the prev/next
|
|
1474
|
+
buttons step it (objectui#7203).
|
|
1475
|
+
|
|
1476
|
+
The label formatted `timelineRange.start` — the memo spanning the whole dataset
|
|
1477
|
+
— so it named the first unit of the entire result set and could not change while
|
|
1478
|
+
the chart was scrolled, because it was not derived from scroll position at all.
|
|
1479
|
+
On a dataset running January to December it therefore read "January 2026" at
|
|
1480
|
+
every scroll position, four pixels above a band header correctly reading
|
|
1481
|
+
"Aug 2026". Measured on the demo fixture in Chromium at 1440x900: on first paint,
|
|
1482
|
+
after the chart auto-scrolls to Today, the label read `December 2025` over
|
|
1483
|
+
columns `28F 29S 30S 31M 1T 2W 3T` with the band beneath them reading `Aug 2026`.
|
|
1484
|
+
Two month labels four pixels apart, disagreeing — and the wrong one is the
|
|
1485
|
+
prominent one, so the chart reads as if the columns were mislabelled.
|
|
1486
|
+
|
|
1487
|
+
The label now names the period at the left edge of the viewport, snapped to the
|
|
1488
|
+
same tier `headerGroups` bands the timeline by: a month under day and week view,
|
|
1489
|
+
a year under month and quarter view, a decade under year view, the shift-day
|
|
1490
|
+
under shift-segmented day view. The toolbar and the band header therefore agree
|
|
1491
|
+
by construction rather than by two derivations that can drift. Wording is
|
|
1492
|
+
unchanged for the month tier — the toolbar still spells the month out
|
|
1493
|
+
("August 2026" beside the header's "Aug 2026").
|
|
1494
|
+
|
|
1495
|
+
The `‹` / `›` buttons rendered an `aria-label` and an icon and carried no
|
|
1496
|
+
`onClick`. They now scroll the visible window one period backwards/forwards at
|
|
1497
|
+
that same tier, clamped to the ends of the timeline (ADR-0049 enforce-or-remove:
|
|
1498
|
+
wiring is the branch the label change makes available). They step the label's
|
|
1499
|
+
tier rather than one column, so a click always changes what the label says.
|
|
1500
|
+
|
|
1501
|
+
The band header is untouched. It was already correct; it is the reference here.
|
|
1502
|
+
- 7c3df8f: The settled-schema convergence, and the gantt's duplicate query gated
|
|
1503
|
+
(objectui#7225, maintainer ruling B, 2026-09-02).
|
|
1504
|
+
|
|
1505
|
+
`useSettledSchema` was extracted and published in PR #6690 with exactly **one**
|
|
1506
|
+
non-test adopter (`ObjectTree`, the component that had an actual defect —
|
|
1507
|
+
objectui#6481's unkeyed latch). `ObjectKanban`, `plugin-view/ObjectView` and
|
|
1508
|
+
`ObjectCalendar` kept their own hand copies of the same shape, so a published
|
|
1509
|
+
export was owed compatibility forever **and** the duplication it was named for
|
|
1510
|
+
stayed. All three now call the hook.
|
|
1511
|
+
|
|
1512
|
+
The migration is a pure deduplication with no behaviour delta — the hook was
|
|
1513
|
+
extracted *from* these three shapes, so each becomes a one-line call.
|
|
1514
|
+
`ObjectCalendar`, which objectui#6482 named as the obstacle, fits via the
|
|
1515
|
+
recipe the hook's own doc comment prescribes for it by name: pass the data
|
|
1516
|
+
source as `undefined` for a render that must not read metadata
|
|
1517
|
+
(`hasInlineData ? undefined : dataSource`), so "inline value data set" is
|
|
1518
|
+
expressed as "there is no source to read from" rather than as a second enable
|
|
1519
|
+
flag. GATE PLACEMENT stays local in all three, which is what #6482 ruled and
|
|
1520
|
+
what made the calendar's obstacle a non-obstacle: it was about the gate half.
|
|
1521
|
+
|
|
1522
|
+
**One observable change:** `ObjectKanban`'s rejected definition read now logs
|
|
1523
|
+
on `console.error` with a `[useSettledSchema]` prefix instead of
|
|
1524
|
+
`console.warn`. Its test spy moves with it, and now asserts on the channel
|
|
1525
|
+
rather than merely silencing it.
|
|
1526
|
+
|
|
1527
|
+
**The gantt's duplicate query is gated** (ask 2 of the card; #6482's
|
|
1528
|
+
undischarged half). `ObjectGantt` listed `objectSchema` in `reload`'s
|
|
1529
|
+
dependency list, so every load issued two unbounded queries — the first with no
|
|
1530
|
+
`$expand` at all. Measured on this component across three latency profiles, the
|
|
1531
|
+
cost is not the mild "round trip bought and thrown away": when the metadata
|
|
1532
|
+
read is the slower of the two, which is the common case on a cold
|
|
1533
|
+
`MetadataCache`, the user sees the full three-step paint — raw foreign-key ids,
|
|
1534
|
+
back to the loading placeholder, then the expanded rows. It now issues one
|
|
1535
|
+
query, already expanded.
|
|
1536
|
+
|
|
1537
|
+
Gating the gantt required its schema resolution to settle on EVERY exit
|
|
1538
|
+
(objectui#7232): the hand-rolled effect returned without settling on
|
|
1539
|
+
`!effectiveDataSource`, on `!resource` and in its `catch` — harmless while
|
|
1540
|
+
nothing waited on it, and a chart that never loads once something does.
|
|
1541
|
+
`useSettledSchema` settles on all three by construction, which is what makes
|
|
1542
|
+
the gate safe; both exits are pinned.
|
|
1543
|
+
|
|
1544
|
+
⛔ Gating is not capping. The row ceiling on these fetches is objectui#7210's
|
|
1545
|
+
separate ruling, in its own commit on the same branch.
|
|
1546
|
+
- 6411def: FLS-gate the `$expand` projection at the five remaining build sites (objectui#7230).
|
|
1547
|
+
|
|
1548
|
+
objectui#7215 / PR #7229 gated `$expand` at the two projection sites in its scope
|
|
1549
|
+
(`ObjectGrid`, `ListView`). The helper is reached from more places than that. This
|
|
1550
|
+
closes the five that were left: `ObjectCalendar`, `ObjectGantt`, `RecordDetailView`,
|
|
1551
|
+
`DetailView`, and `ObjectDataTable` (which builds its own whitelist in
|
|
1552
|
+
`computeLookupExpand` rather than calling `buildExpandFields`).
|
|
1553
|
+
|
|
1554
|
+
**Three of them pass no column list at all**, which makes them the sharp ones:
|
|
1555
|
+
`buildExpandFields` reads an absent column list as "no column restriction" and falls
|
|
1556
|
+
back to **every declared relation on the object**, denied ones included. So a standalone
|
|
1557
|
+
calendar, a gantt, and every record page in the console asked the server to resolve the
|
|
1558
|
+
object's full relation set by default rather than by configuration.
|
|
1559
|
+
|
|
1560
|
+
**`DetailView` was input-gated, and that is the defect rather than the fix.** Its column
|
|
1561
|
+
list is already FLS-filtered field by field, which is exactly the route PR #7229 measured
|
|
1562
|
+
as unsound: an emptied column list reads as "no column restriction", so a detail view
|
|
1563
|
+
whose authored fields are all denied had its `$expand` **widened** from the relations it
|
|
1564
|
+
asked for to every relation the object declares. The principal who may read least was
|
|
1565
|
+
asking for the most.
|
|
1566
|
+
|
|
1567
|
+
**Reproduced before it was fixed**, as a failing test per site.
|
|
1568
|
+
|
|
1569
|
+
**Grading, measured rather than assumed.** Against ObjectStack's own server this is
|
|
1570
|
+
defence-in-depth, exactly as objectui#6898 and #7215 are: `plugin-security`'s
|
|
1571
|
+
`FieldMasker.maskRecord` deletes every unreadable key from each returned row and
|
|
1572
|
+
objectql's expand path writes the resolved record back under that same key, so one
|
|
1573
|
+
statement removes the expanded object and the bare id alike; the expansion sub-read is
|
|
1574
|
+
itself gated (`__expandRead` takes the referenced object's full CRUD + RLS + FLS
|
|
1575
|
+
treatment). It is load-bearing for any backend that does not strip, and the
|
|
1576
|
+
client-request side is real regardless.
|
|
1577
|
+
|
|
1578
|
+
**Nothing a permitted view did stops working.** The gate judges each helper's OUTPUT,
|
|
1579
|
+
which contains only the object's declared reference-bearing fields, so the "`checkField`
|
|
1580
|
+
answers false for an undeclared key" trap cannot be reached and derived / host-joined
|
|
1581
|
+
columns are untouched. An unanswered permission policy filters nothing. Neither
|
|
1582
|
+
`buildExpandFields` nor `computeLookupExpand` is changed.
|
|
1583
|
+
- 92c65aa: `ObjectGantt` no longer blanks the chart when one reload supersedes another
|
|
1584
|
+
|
|
1585
|
+
`reload()` already sequenced concurrent runs with `reloadSeqRef` and guarded every
|
|
1586
|
+
result write with `isCurrent()`, but its `finally` was unguarded — so a **superseded**
|
|
1587
|
+
reload still flipped `loading` / `refreshing` off. The stale run only had to finish
|
|
1588
|
+
first, which is the ordinary case whenever a second reload is issued while the first
|
|
1589
|
+
is still in flight: the placeholder was released, no rows had arrived, and the user
|
|
1590
|
+
saw an empty chart until the fresh response landed.
|
|
1591
|
+
|
|
1592
|
+
The `finally` now clears the flags only when the run reaching it is still the current
|
|
1593
|
+
one. It clears **both** flags rather than only the one its own `silent` mode set:
|
|
1594
|
+
being current at that point means nothing is in flight any more, so clearing only its
|
|
1595
|
+
own mode would strand the other flag whenever the superseded run used the other mode
|
|
1596
|
+
— a silent toolbar refresh overtaken by a filter-change reload would have left the
|
|
1597
|
+
refresh button busy for the life of the component.
|
|
1598
|
+
|
|
1599
|
+
This is the reload guard alone. Nothing about which queries are issued, how they are
|
|
1600
|
+
projected or how they page changes.
|
|
1601
|
+
- e75f4c9: `colorField` now means the same thing in the gantt, the calendar and the timeline
|
|
1602
|
+
(objectui#7243).
|
|
1603
|
+
|
|
1604
|
+
**The inversion this fixes.** `gantt.colorField` is documented as "field that drives the
|
|
1605
|
+
bar color", and the renderer passed the stored value straight into the bar's
|
|
1606
|
+
`backgroundColor`. Pointing the key at a select field therefore emitted
|
|
1607
|
+
`backgroundColor: "open"` — not a colour, so the browser dropped the declaration and
|
|
1608
|
+
every bar rendered identically. OMITTING the key was strictly better: the absent-key
|
|
1609
|
+
branch derived a real colour per status. Declaring the documented key was worse than not
|
|
1610
|
+
declaring it, with no error, warning or console message either way.
|
|
1611
|
+
|
|
1612
|
+
The same key also meant three different things across the three lenses: the timeline
|
|
1613
|
+
resolved the field's authored option `color`, the calendar hashed the raw value onto a
|
|
1614
|
+
fixed palette, and the gantt emitted the raw value. An author colouring three views by
|
|
1615
|
+
one field got three unrelated results, one of which was no colour at all.
|
|
1616
|
+
|
|
1617
|
+
**The ladder.** `@object-ui/core` gains `createFieldColorResolver` — the timeline's
|
|
1618
|
+
resolver, lifted so all three call it:
|
|
1619
|
+
|
|
1620
|
+
1. the field's own option `color` for the record's value;
|
|
1621
|
+
2. else the value itself when it already IS a colour literal (`#rgb`, `#rrggbb`,
|
|
1622
|
+
`#rrggbbaa`, `rgb(...)`, `hsl(...)`);
|
|
1623
|
+
3. else each renderer's own last rung, which is deliberately NOT shared — the gantt
|
|
1624
|
+
derives a semantic-token hex (a bar must be painted), the calendar keeps its
|
|
1625
|
+
theme-aware 8-stop hash (a soft tint, not a solid fill), the timeline draws its
|
|
1626
|
+
default marker.
|
|
1627
|
+
|
|
1628
|
+
**What changes for authors.** A gantt or calendar whose `colorField` points at a select
|
|
1629
|
+
field with authored option colours now paints those colours. A gantt value that is
|
|
1630
|
+
neither an option colour nor a colour literal now derives a colour instead of emitting
|
|
1631
|
+
an invalid CSS value — including a palette NAME (`red`), which now resolves to that
|
|
1632
|
+
palette's hex, the behaviour the key's own contract has always promised ("hex or
|
|
1633
|
+
semantic name") and the one `borderColorField` already had. `gantt.borderColorField`
|
|
1634
|
+
takes rung 1 as well, so an authored option colour reaches the alert stroke; it keeps
|
|
1635
|
+
today's behaviour otherwise and deliberately gains no derivation rung, since the stroke
|
|
1636
|
+
is opt-in and deriving one for every record would draw an alert on records that have
|
|
1637
|
+
none.
|
|
1638
|
+
|
|
1639
|
+
Calendars whose `colorField` points at a plain categorical field are unchanged: that
|
|
1640
|
+
value still reaches `CalendarView`'s deterministic hash exactly as before. The timeline
|
|
1641
|
+
is unchanged apart from accepting the 8-digit `#rrggbbaa` hex spelling the calendar
|
|
1642
|
+
already accepted.
|
|
1643
|
+
- 67d4ed9: `ObjectGantt` no longer treats an EMPTY host `data` array as the rows it was handed (objectui#7333).
|
|
1644
|
+
|
|
1645
|
+
`ObjectGantt` read a host `data` prop at two places, and both accepted `[]`. The
|
|
1646
|
+
reload's short-circuit tested `data && Array.isArray(data)`, and an empty array
|
|
1647
|
+
is truthy, so the chart adopted it and returned before its own query. The gating
|
|
1648
|
+
flag tested `Array.isArray(data)` alone, so the same array also switched off the
|
|
1649
|
+
object-schema gate and the data-invalidation subscription of that query. A gantt
|
|
1650
|
+
whose `data` names its own source, for example `{ provider: 'api', read }`,
|
|
1651
|
+
therefore painted an EMPTY chart whenever a host handed it an array it had not
|
|
1652
|
+
filled yet.
|
|
1653
|
+
|
|
1654
|
+
Both places now read one predicate. A host `data` array is adopted only when it
|
|
1655
|
+
has rows. An empty one reads as "no host rows yet": the chart queries its own
|
|
1656
|
+
source, exactly as it does with no host array at all, and adopts the host's rows
|
|
1657
|
+
when they arrive.
|
|
1658
|
+
|
|
1659
|
+
Who can reach this: the registered `object-gantt` renderer still forwards no
|
|
1660
|
+
host prop, and `ObjectGanttProps` does not declare `data`, so only a caller that
|
|
1661
|
+
renders `ObjectGantt` directly and spreads `data` in was affected.
|
|
1662
|
+
- 2c878be: Honour a gantt view's authored `navigation` — forward it down the gantt
|
|
1663
|
+
view-schema path, and give the component a destination for the non-overlay
|
|
1664
|
+
modes (objectui#7334).
|
|
1665
|
+
|
|
1666
|
+
**Leg 1, `@object-ui/plugin-list`.** `ObjectGantt` resolves
|
|
1667
|
+
`schema.navigation ?? { mode: 'drawer' }` and classifies four overlay modes
|
|
1668
|
+
(`drawer` / `modal` / `split` / `popover`). Nothing ever put `navigation` on the
|
|
1669
|
+
node it receives — `ListView`'s shared `baseProps` declares no such key and the
|
|
1670
|
+
`case 'gantt'` branch added only the data keys — so that fallback was the only
|
|
1671
|
+
branch ever taken. A gantt view authoring `navigation: { mode: 'page' }` (or
|
|
1672
|
+
`modal`, or `split`) opened a drawer instead, with no diagnostic. The key was
|
|
1673
|
+
already authorable and already read; this restores declared = enforced. No new
|
|
1674
|
+
authorable key is added.
|
|
1675
|
+
|
|
1676
|
+
The key is forwarded on the `case 'gantt'` branch and deliberately **not** on
|
|
1677
|
+
the shared `baseProps`, because every other child view resolves this same
|
|
1678
|
+
question through the `onRowClick` that `baseProps` already carries:
|
|
1679
|
+
`ObjectGrid`, `ObjectGallery`, `ObjectKanban`, `ObjectMap`, `ObjectTimeline` and
|
|
1680
|
+
`ObjectTree` hand that callback to `useNavigationOverlay` unconditionally, and
|
|
1681
|
+
the hook gives an external `onRowClick` full priority over any `navigation` — so
|
|
1682
|
+
on `baseProps` the authored config would arrive there only to be outranked.
|
|
1683
|
+
`ObjectCalendar` is the one that would genuinely change behaviour: it mirrors
|
|
1684
|
+
gantt's `navIsOverlay ? undefined : onRowClick`, so an authored non-overlay mode
|
|
1685
|
+
would stop it suppressing the host handler. Gantt is the only branch where
|
|
1686
|
+
forwarding settles the question rather than splitting it, because its wrapper
|
|
1687
|
+
drops host props entirely (objectui#7210 / objectui#7222) and there is no
|
|
1688
|
+
`onRowClick` there to outrank anything.
|
|
1689
|
+
|
|
1690
|
+
**Leg 2, `@object-ui/plugin-gantt`.** `ObjectGantt` now supplies its own
|
|
1691
|
+
`onNavigate`, so a click under an authored `page` or `new_window` actually
|
|
1692
|
+
reaches the record page. Leg 1 alone would have made `page` reachable and inert:
|
|
1693
|
+
`useNavigationOverlay`'s `page` branch calls `onNavigate` and returns with no
|
|
1694
|
+
fallback, this component supplied none, and its registration hands it no host
|
|
1695
|
+
`onRowClick` either — both carriers empty at once, turning an authored `page`
|
|
1696
|
+
from "a drawer opens, which is wrong" into "the click does nothing". The
|
|
1697
|
+
destination is the record-page href the component already computes for the
|
|
1698
|
+
drawer's full-page link, so the two cannot diverge; same-tab navigation uses the
|
|
1699
|
+
history plus `popstate` pair (matching `DashboardRenderer` and `PageHeader`),
|
|
1700
|
+
and `new_window` now opens the app-prefixed href rather than the hook's
|
|
1701
|
+
unprefixed fallback. No host prop is forwarded to the chart.
|
|
1702
|
+
|
|
1703
|
+
A view that authors no `navigation` still gets **no** key and still opens its
|
|
1704
|
+
drawer, so the component's default is unchanged for every gantt in the product
|
|
1705
|
+
today; an authored `none` stays inert.
|
|
1706
|
+
- 3ef0b51: fix(plugin-map, plugin-gantt): the registrations no longer declare `objectName` a required input
|
|
1707
|
+
|
|
1708
|
+
Both renderers read their records from one of three keys (`data`, then
|
|
1709
|
+
`staticData`, then `objectName`), and the `object-map` / `object-gantt` zod schemas
|
|
1710
|
+
enforce "one of the three" through `requireRecordSource` (`77cb489b4`). The
|
|
1711
|
+
registrations' designer-facing `inputs` still said `objectName` was required, on
|
|
1712
|
+
`object-map`, `map` and `object-gantt`, so the html tier's validator reported a
|
|
1713
|
+
`missing-required-prop` error on a block authored on `staticData` or `data` that
|
|
1714
|
+
the schema accepts and the renderer draws.
|
|
1715
|
+
|
|
1716
|
+
`objectName` is now declared without `required`, and its description states the
|
|
1717
|
+
rule: the record source is one of `data`, `staticData` and `objectName`, and the
|
|
1718
|
+
schema refuses a block that declares none of them. No one-of form was added to the
|
|
1719
|
+
input declaration; the zod refinement stays the place that enforces it. The
|
|
1720
|
+
renderers' read order is unchanged. The `@object-ui/plugin-gantt` README sentence
|
|
1721
|
+
that called `objectName` required is corrected (objectui#7470).
|
|
1722
|
+
|
|
1723
|
+
**Correction, 2026-10-01 (objectui#11117).** The rule this entry describes gained an exception:
|
|
1724
|
+
the `object-map` and `object-gantt` schemas also accept a block that declares none of the three
|
|
1725
|
+
when its `dataSource.object` names the object, because the registration's `ElementDataSourceGate`
|
|
1726
|
+
lands that name on `objectName`. The `objectName` input description now says so.
|
|
1727
|
+
- c6198c2: **Breaking for authored metadata:** `ComponentInput.label`, `ComponentInput.defaultValue` and
|
|
1728
|
+
`ComponentInput.advanced` are RETIRED on both faces (objectui#7493 item ① and objectui#7781;
|
|
1729
|
+
maintainer ruling A of 2026-09-06, immediate, no deprecation window; ADR-0049 enforce-or-remove).
|
|
1730
|
+
They are the three keys the manifest serializer does not forward, and nothing read them on any
|
|
1731
|
+
publication or consumption path.
|
|
1732
|
+
|
|
1733
|
+
No manifest ever published them, so no consumer could ever have read them. `sdui-parser`'s
|
|
1734
|
+
serializer (`packages/sdui-parser/src/index.ts`) forwards exactly seven keys per input — `name`,
|
|
1735
|
+
`type`, `of`, `required`, `enum`, `binding`, `description` — so a value authored under any of the three
|
|
1736
|
+
never reached `sdui.manifest.json`, the generated JSX `.d.ts`, or a diagnostic; its boundary type
|
|
1737
|
+
has no slot for them; the registry's data-source seam reads `name` only; and neither the designer
|
|
1738
|
+
nor the app-shell inspectors consult registry `inputs` at all. A structural census over every
|
|
1739
|
+
`inputs:` array in the repository (re-measured on this change's merge-base, `name` 951 and `type`
|
|
1740
|
+
951 as the controls) counted the writes: `label` 908, `defaultValue` 245, `advanced` 9 — written on
|
|
1741
|
+
nearly every registration, read by nothing.
|
|
1742
|
+
|
|
1743
|
+
FROM → TO, per key — all three **TOMBSTONED, not removed**, because the route was measured on
|
|
1744
|
+
the built face before it was chosen: `ComponentInputSchema` is a non-strict `z.object`, and an
|
|
1745
|
+
undeclared key parses GREEN and is silently STRIPPED, so a deletion would have swallowed 1,162
|
|
1746
|
+
authored values in silence. The tombstone is what makes the refusal loud and by name.
|
|
1747
|
+
|
|
1748
|
+
- `label?: string` → `label?: never` on the interface, `retirementTombstone()` on the Zod mirror.
|
|
1749
|
+
Migration: delete the key. An input is identified by its `name` on every path that reaches it;
|
|
1750
|
+
nothing ever rendered a label for it.
|
|
1751
|
+
- `defaultValue?: any` → `defaultValue?: never` / `retirementTombstone()`. Migration: delete the
|
|
1752
|
+
key. The renderer's own fallback read IS the default; tell the author about it in `description`,
|
|
1753
|
+
which IS published. (Tightening the type to `unknown` was ruled out: it closes no error class,
|
|
1754
|
+
since nothing reads the value.)
|
|
1755
|
+
- `advanced?: boolean` → `advanced?: never` / `retirementTombstone()`. Migration: delete the key.
|
|
1756
|
+
No designer surface ever hid an "advanced" input; there is nothing to write instead.
|
|
1757
|
+
|
|
1758
|
+
The retirement kit: `?: never` on `ComponentInput` (`packages/types/src/base.ts`), so authoring one
|
|
1759
|
+
is a `tsc` error at the registration site; `retirementTombstone()` on `ComponentInputSchema`
|
|
1760
|
+
(`packages/types/src/zod/base.zod.ts`), so an authored value is REFUSED at parse time with
|
|
1761
|
+
`code: 'invalid_type'`, the key named in the issue `path`, and the migration note as the message
|
|
1762
|
+
(one string, both channels). Pinned in
|
|
1763
|
+
`packages/types/src/__tests__/component-input-retired-keys-7493.test.ts`, which also holds a
|
|
1764
|
+
tree-scoped absence census over every `inputs:` array under `packages/**` and `apps/**`.
|
|
1765
|
+
|
|
1766
|
+
Accept-set change, stated plainly for reviewers: a document that sets any of the three keys on a
|
|
1767
|
+
`ComponentInput` used to parse GREEN (the value was then dropped by the serializer) and now parses
|
|
1768
|
+
RED. Every in-repo authoring site — 1,199 keys across 110 registration files, the three standalone
|
|
1769
|
+
`ComponentInput[]` arrays and the two named input arrays `tsc` found included — is deleted in the same change, as the ruling's split rule
|
|
1770
|
+
requires; the `WidgetRegistry` seam no longer copies the widget-manifest values onto the synthesized
|
|
1771
|
+
`ComponentInput` (they fed nothing), and the data-source declaration `ELEMENT_DATA_SOURCE_INPUT`
|
|
1772
|
+
drops its `label`. The patch entries on the other packages record exactly that: their registrations
|
|
1773
|
+
stop authoring inert keys, with no runtime or published-manifest change.
|
|
1774
|
+
|
|
1775
|
+
The nine test files that read `defaultValue` off a registration were re-pinned against the
|
|
1776
|
+
renderer's ACTUAL default (its own fallback read, or the `defaultProps` it ships) instead of the
|
|
1777
|
+
declaration that went away; two assertions that only restated the shadow default were dropped with
|
|
1778
|
+
the reason on the line.
|
|
1779
|
+
|
|
1780
|
+
The in-repo zero is what was measured. Whether anything OUTSIDE this repository writes these keys
|
|
1781
|
+
is not measurable from here (the objectui#5674 limit); converting such a write from a silent drop
|
|
1782
|
+
into a named refusal is exactly what the tombstones buy. `WidgetInput`'s own `label` /
|
|
1783
|
+
`defaultValue` / `advanced` (the widget-manifest face) stay declared and writable — nothing has
|
|
1784
|
+
ruled on that face; that it now has no reader either is recorded as objectui#7911.
|
|
1785
|
+
- ce2aaef: One shared record-source ladder, five plugins delegate.
|
|
1786
|
+
|
|
1787
|
+
`@object-ui/core` publishes `resolveRecordSourceConfig(schema)` — the ONE implementation
|
|
1788
|
+
of the ruled three-rung record source ladder: `data` first, then `staticData` wrapped as
|
|
1789
|
+
`{ provider: 'value', items }`, then `objectName` folded to `{ provider: 'object' }`, and
|
|
1790
|
+
`null` when nothing is bound. It is the PRODUCER whose output the reader
|
|
1791
|
+
`resolveRecordSourceObjectName` (`b041b9c0c`) consumes, and it now sits beside it in the same module.
|
|
1792
|
+
|
|
1793
|
+
That ladder is published contract on both faces — `packages/types/src/objectql.ts` and its
|
|
1794
|
+
zod mirror both ship `.describe()` strings naming `getDataConfig`'s order (`77cb489b4`,
|
|
1795
|
+
maintainer ruling 2026-09-02), pinned by `objectql-record-source-refinement-6939.test.ts` —
|
|
1796
|
+
and it was hand-copied into five plugin components with no gate holding them together. A
|
|
1797
|
+
change to the ruled order had five edit sites and nothing that noticed a missed one; that
|
|
1798
|
+
is the AGENTS.md #0.1 drift class.
|
|
1799
|
+
|
|
1800
|
+
**No behaviour changes.** `ObjectCalendar`, `ObjectGantt` and `ObjectTree` now call the
|
|
1801
|
+
shared reader directly. `ObjectGrid` and `ObjectMap` keep their own bare-array `data`
|
|
1802
|
+
shorthand as a documented head above the shared call and are otherwise unchanged.
|
|
1803
|
+
`record-source-config.behaviourNeutrality-7632.test.ts` transcribes all five pre-collapse
|
|
1804
|
+
bodies verbatim and asserts the post-collapse spelling agrees with each across the whole
|
|
1805
|
+
input matrix, so a later edit to the shared reader that moves any site turns red.
|
|
1806
|
+
|
|
1807
|
+
**Two divergences were measured rather than assumed, and both are preserved.**
|
|
1808
|
+
|
|
1809
|
+
`ObjectCalendar`'s `'data' in schema && schema.data` guards existed because its parameter was
|
|
1810
|
+
at that time the union `ObjectGridSchema | CalendarSchema`, whose `CalendarSchema` arm declared
|
|
1811
|
+
neither key. (objectui#8651 has since re-pointed that parameter at the published
|
|
1812
|
+
`ObjectCalendarSchema`, so the union is gone; the CONCLUSION below — that the guard had no
|
|
1813
|
+
runtime effect and removing it is behaviour-neutral — is unaffected.)
|
|
1814
|
+
That is a TypeScript narrowing device with no runtime effect — an absent property reads
|
|
1815
|
+
`undefined`, falsy either way — so the guard could never change which rung is taken. The
|
|
1816
|
+
shared reader's optional-property parameter accepts the union directly, and the
|
|
1817
|
+
equivalence is pinned on a fixture that really lacks both keys rather than argued.
|
|
1818
|
+
|
|
1819
|
+
`ObjectGrid` and `ObjectMap` normalize a bare-array `data` to `{ provider: 'value', items }`;
|
|
1820
|
+
`ObjectCalendar`, `ObjectGantt` and `ObjectTree` do not, and return the array verbatim. That
|
|
1821
|
+
is a real divergence on off-contract input — `ViewData` is a discriminated union over object
|
|
1822
|
+
variants, so an array under `data` cannot be published. It is NOT unified here: the shared
|
|
1823
|
+
rung stays contract-strict and the two sites keep the head locally, the same way `b041b9c0c`
|
|
1824
|
+
left the off-contract `{ provider: 'object' }` tails at their sites. Both sides of the fork are
|
|
1825
|
+
pinned, so neither folding the head in nor deleting it as redundant can happen silently.
|
|
1826
|
+
|
|
1827
|
+
`ObjectTree`'s copy took `schema: any`; it now goes through the shared reader's typed
|
|
1828
|
+
parameter. Types are erased at runtime, so nothing it resolves moves.
|
|
1829
|
+
- fb336df: Move `lucide-react` from `^1.31.0` to `^1.43.0` in every package that declares it, and
|
|
1830
|
+
repair what the jump breaks, so icons resolved from a STRING keep drawing a glyph.
|
|
1831
|
+
|
|
1832
|
+
Measured once against the installed 1.43.0 artifact when this change was made; nothing in
|
|
1833
|
+
the repository re-derives these readings. Across the jump lucide removes no runtime export,
|
|
1834
|
+
no public type name and no `lucide-react/dynamic.mjs` name, and every name this repository
|
|
1835
|
+
imports from `lucide-react` resolves. Exactly one key leaves the runtime `icons` record:
|
|
1836
|
+
`Trash2`, retired in favour of `trash`.
|
|
1837
|
+
|
|
1838
|
+
What a user sees change:
|
|
1839
|
+
|
|
1840
|
+
- Icons the lazy icon seam draws (`resolveIcon`, objectui#9251) get their path data again.
|
|
1841
|
+
lucide 1.43.0 icon modules export their path data inside `__iconData` and no longer
|
|
1842
|
+
export `__iconNode`; the seam now reads both. Reading only `__iconNode` against 1.43.0
|
|
1843
|
+
leaves every such glyph an empty box, with nothing thrown or logged.
|
|
1844
|
+
- `DetailView`'s delete action and three schema-catalog examples spell their icon
|
|
1845
|
+
`trash`, not `trash-2`, so they keep resolving. The glyph is unchanged: 1.43.0's `trash`
|
|
1846
|
+
path data is byte-identical to the `trash-2` path data of 1.31.0 and 1.35.0. Anything
|
|
1847
|
+
that already authored `trash` now draws that same artwork, because lucide moved it under
|
|
1848
|
+
the `trash` name; a few other glyphs were also redrawn upstream.
|
|
1849
|
+
- Icons imported as COMPONENTS carry lucide 1.43.0's own classes: one class per declared
|
|
1850
|
+
alias (a spinner renders `class="lucide lucide-loader-circle lucide-loader-2 ..."`), and
|
|
1851
|
+
no longer the class lucide used to derive from the PascalCase key where that differs
|
|
1852
|
+
(`ArrowDown01` no longer carries `lucide-arrow-down01`). The canonical
|
|
1853
|
+
`lucide-<icon name>` class is still there, so a `.lucide-loader-circle` selector still
|
|
1854
|
+
matches.
|
|
1855
|
+
- Icons resolved from a STRING through the seam keep the classes they had: `lucide`, the
|
|
1856
|
+
canonical `lucide-<icon name>` class and the key-derived class. They do not carry
|
|
1857
|
+
lucide's per-alias classes. That is a maintainer ruling (objectui#8941, option C): the
|
|
1858
|
+
alias list lives only inside each lazily loaded icon module, and it was not moved into
|
|
1859
|
+
the eager name list. A selector that targets an alias class matches a component-imported
|
|
1860
|
+
icon and not a string-resolved one. This also dates the example in the objectui#9251
|
|
1861
|
+
entry: `trash-2` no longer resolves as a string, so no seam-drawn glyph carries
|
|
1862
|
+
`lucide-trash2 lucide-trash-2`; a digit-bearing name that still resolves, such as
|
|
1863
|
+
`arrow-down-0-1`, carries `lucide-arrow-down01 lucide-arrow-down-0-1`.
|
|
1864
|
+
- Updated dependencies [cd2cb41]
|
|
1865
|
+
- Updated dependencies [7b10bef]
|
|
1866
|
+
- Updated dependencies [97abedc]
|
|
1867
|
+
- Updated dependencies [b46c58f]
|
|
1868
|
+
- Updated dependencies [a507334]
|
|
1869
|
+
- Updated dependencies [ad694ac]
|
|
1870
|
+
- Updated dependencies [6f96fca]
|
|
1871
|
+
- Updated dependencies [afb2284]
|
|
1872
|
+
- Updated dependencies [3ac2de8]
|
|
1873
|
+
- Updated dependencies [0aacecc]
|
|
1874
|
+
- Updated dependencies [28b0658]
|
|
1875
|
+
- Updated dependencies [63f4f92]
|
|
1876
|
+
- Updated dependencies [777fca2]
|
|
1877
|
+
- Updated dependencies [c131d9e]
|
|
1878
|
+
- Updated dependencies [5f00ff4]
|
|
1879
|
+
- Updated dependencies [c9e073a]
|
|
1880
|
+
- Updated dependencies [0361d6b]
|
|
1881
|
+
- Updated dependencies [7b395d8]
|
|
1882
|
+
- Updated dependencies [0879812]
|
|
1883
|
+
- Updated dependencies [588380d]
|
|
1884
|
+
- Updated dependencies [8cedb0d]
|
|
1885
|
+
- Updated dependencies [162621b]
|
|
1886
|
+
- Updated dependencies [b06c3de]
|
|
1887
|
+
- Updated dependencies [0d379f5]
|
|
1888
|
+
- Updated dependencies [4c6f549]
|
|
1889
|
+
- Updated dependencies [80c5412]
|
|
1890
|
+
- Updated dependencies [6cc910b]
|
|
1891
|
+
- Updated dependencies [061f5e8]
|
|
1892
|
+
- Updated dependencies [879ecac]
|
|
1893
|
+
- Updated dependencies [c2dabf0]
|
|
1894
|
+
- Updated dependencies [2dd4d3f]
|
|
1895
|
+
- Updated dependencies [e686f4d]
|
|
1896
|
+
- Updated dependencies [212c451]
|
|
1897
|
+
- Updated dependencies [a04b06d]
|
|
1898
|
+
- Updated dependencies [4ab4f1b]
|
|
1899
|
+
- Updated dependencies [fa5fbd9]
|
|
1900
|
+
- Updated dependencies [5f44cc6]
|
|
1901
|
+
- Updated dependencies [b57107d]
|
|
1902
|
+
- Updated dependencies [e3ea4f9]
|
|
1903
|
+
- Updated dependencies [65f1e8d]
|
|
1904
|
+
- Updated dependencies [fd6f5da]
|
|
1905
|
+
- Updated dependencies [1f8ef0a]
|
|
1906
|
+
- Updated dependencies [bb5d4ee]
|
|
1907
|
+
- Updated dependencies [dc666f7]
|
|
1908
|
+
- Updated dependencies [3335767]
|
|
1909
|
+
- Updated dependencies [8b1f066]
|
|
1910
|
+
- Updated dependencies [af243c1]
|
|
1911
|
+
- Updated dependencies [cff4b77]
|
|
1912
|
+
- Updated dependencies [31938f0]
|
|
1913
|
+
- Updated dependencies [961ceaa]
|
|
1914
|
+
- Updated dependencies [f3f4e4c]
|
|
1915
|
+
- Updated dependencies [a05c350]
|
|
1916
|
+
- Updated dependencies [1dbb993]
|
|
1917
|
+
- Updated dependencies [2b5f509]
|
|
1918
|
+
- Updated dependencies [808f339]
|
|
1919
|
+
- Updated dependencies [6cf5999]
|
|
1920
|
+
- Updated dependencies [274e14a]
|
|
1921
|
+
- Updated dependencies [8c10f4f]
|
|
1922
|
+
- Updated dependencies [90dac98]
|
|
1923
|
+
- Updated dependencies [6096f20]
|
|
1924
|
+
- Updated dependencies [544aca2]
|
|
1925
|
+
- Updated dependencies [ea02938]
|
|
1926
|
+
- Updated dependencies [a14fb23]
|
|
1927
|
+
- Updated dependencies [ae98f1d]
|
|
1928
|
+
- Updated dependencies [f98eddf]
|
|
1929
|
+
- Updated dependencies [ce6bd99]
|
|
1930
|
+
- Updated dependencies [a5b08c9]
|
|
1931
|
+
- Updated dependencies [86982ac]
|
|
1932
|
+
- Updated dependencies [8c929e6]
|
|
1933
|
+
- Updated dependencies [cdefa2a]
|
|
1934
|
+
- Updated dependencies [2fc2a24]
|
|
1935
|
+
- Updated dependencies [cc4366d]
|
|
1936
|
+
- Updated dependencies [0961d5e]
|
|
1937
|
+
- Updated dependencies [9d25b9b]
|
|
1938
|
+
- Updated dependencies [6276478]
|
|
1939
|
+
- Updated dependencies [5e67837]
|
|
1940
|
+
- Updated dependencies [ff14e29]
|
|
1941
|
+
- Updated dependencies [9b28151]
|
|
1942
|
+
- Updated dependencies [64563a9]
|
|
1943
|
+
- Updated dependencies [1a5003f]
|
|
1944
|
+
- Updated dependencies [09ab32b]
|
|
1945
|
+
- Updated dependencies [8acc51b]
|
|
1946
|
+
- Updated dependencies [ea9d17f]
|
|
1947
|
+
- Updated dependencies [45362a3]
|
|
1948
|
+
- Updated dependencies [2a943bf]
|
|
1949
|
+
- Updated dependencies [111fa4c]
|
|
1950
|
+
- Updated dependencies [d999617]
|
|
1951
|
+
- Updated dependencies [93a689d]
|
|
1952
|
+
- Updated dependencies [4357a27]
|
|
1953
|
+
- Updated dependencies [e5f4343]
|
|
1954
|
+
- Updated dependencies [3261e64]
|
|
1955
|
+
- Updated dependencies [f5178a2]
|
|
1956
|
+
- Updated dependencies [2ad3671]
|
|
1957
|
+
- Updated dependencies [39bf246]
|
|
1958
|
+
- Updated dependencies [8740e86]
|
|
1959
|
+
- Updated dependencies [d22b37b]
|
|
1960
|
+
- Updated dependencies [9cbe4db]
|
|
1961
|
+
- Updated dependencies [8c0e550]
|
|
1962
|
+
- Updated dependencies [fde4caf]
|
|
1963
|
+
- Updated dependencies [caf0ed0]
|
|
1964
|
+
- Updated dependencies [1daf477]
|
|
1965
|
+
- Updated dependencies [3d614ea]
|
|
1966
|
+
- Updated dependencies [a7df45f]
|
|
1967
|
+
- Updated dependencies [6c2f3c5]
|
|
1968
|
+
- Updated dependencies [fb13e85]
|
|
1969
|
+
- Updated dependencies [c2d8659]
|
|
1970
|
+
- Updated dependencies [6516320]
|
|
1971
|
+
- Updated dependencies [98b1a7c]
|
|
1972
|
+
- Updated dependencies [e0f8202]
|
|
1973
|
+
- Updated dependencies [ac2d6f1]
|
|
1974
|
+
- Updated dependencies [9fbbb17]
|
|
1975
|
+
- Updated dependencies [c3a26cc]
|
|
1976
|
+
- Updated dependencies [a66e58e]
|
|
1977
|
+
- Updated dependencies [d89492c]
|
|
1978
|
+
- Updated dependencies [9a5f998]
|
|
1979
|
+
- Updated dependencies [1c5ee33]
|
|
1980
|
+
- Updated dependencies [9327397]
|
|
1981
|
+
- Updated dependencies [17cc3a3]
|
|
1982
|
+
- Updated dependencies [a9c5ea0]
|
|
1983
|
+
- Updated dependencies [02e6d36]
|
|
1984
|
+
- Updated dependencies [4758b33]
|
|
1985
|
+
- Updated dependencies [4758b33]
|
|
1986
|
+
- Updated dependencies [4758b33]
|
|
1987
|
+
- Updated dependencies [8848ce4]
|
|
1988
|
+
- Updated dependencies [f905090]
|
|
1989
|
+
- Updated dependencies [3cd6c5e]
|
|
1990
|
+
- Updated dependencies [5bb855d]
|
|
1991
|
+
- Updated dependencies [9c78ebe]
|
|
1992
|
+
- Updated dependencies [12809a5]
|
|
1993
|
+
- Updated dependencies [9c78ebe]
|
|
1994
|
+
- Updated dependencies [12809a5]
|
|
1995
|
+
- Updated dependencies [9c78ebe]
|
|
1996
|
+
- Updated dependencies [12809a5]
|
|
1997
|
+
- Updated dependencies [7afc81d]
|
|
1998
|
+
- Updated dependencies [f9c06ef]
|
|
1999
|
+
- Updated dependencies [93a5585]
|
|
2000
|
+
- Updated dependencies [5ad3b88]
|
|
2001
|
+
- Updated dependencies [21eb61a]
|
|
2002
|
+
- Updated dependencies [f9d772b]
|
|
2003
|
+
- Updated dependencies [bf14b64]
|
|
2004
|
+
- Updated dependencies [4345558]
|
|
2005
|
+
- Updated dependencies [97b6c21]
|
|
2006
|
+
- Updated dependencies [26ca2ad]
|
|
2007
|
+
- Updated dependencies [41ae65b]
|
|
2008
|
+
- Updated dependencies [184cfe1]
|
|
2009
|
+
- Updated dependencies [baac95a]
|
|
2010
|
+
- Updated dependencies [13220af]
|
|
2011
|
+
- Updated dependencies [29b45f6]
|
|
2012
|
+
- Updated dependencies [39b8d51]
|
|
2013
|
+
- Updated dependencies [17b323e]
|
|
2014
|
+
- Updated dependencies [b956e69]
|
|
2015
|
+
- Updated dependencies [b32e7de]
|
|
2016
|
+
- Updated dependencies [ff94a12]
|
|
2017
|
+
- Updated dependencies [33e58d8]
|
|
2018
|
+
- Updated dependencies [256b4c9]
|
|
2019
|
+
- Updated dependencies [97672ba]
|
|
2020
|
+
- Updated dependencies [c5ec15c]
|
|
2021
|
+
- Updated dependencies [fec3b1a]
|
|
2022
|
+
- Updated dependencies [b8e0941]
|
|
2023
|
+
- Updated dependencies [0c50f18]
|
|
2024
|
+
- Updated dependencies [285e36b]
|
|
2025
|
+
- Updated dependencies [1dae95a]
|
|
2026
|
+
- Updated dependencies [e32dae1]
|
|
2027
|
+
- Updated dependencies [d0c0c7f]
|
|
2028
|
+
- Updated dependencies [30b11ad]
|
|
2029
|
+
- Updated dependencies [4aebea0]
|
|
2030
|
+
- Updated dependencies [f976774]
|
|
2031
|
+
- Updated dependencies [3d6badf]
|
|
2032
|
+
- Updated dependencies [25cb364]
|
|
2033
|
+
- Updated dependencies [a60539b]
|
|
2034
|
+
- Updated dependencies [de1b879]
|
|
2035
|
+
- Updated dependencies [c6678b1]
|
|
2036
|
+
- Updated dependencies [0638322]
|
|
2037
|
+
- Updated dependencies [e3782d2]
|
|
2038
|
+
- Updated dependencies [db0beb2]
|
|
2039
|
+
- Updated dependencies [997ce38]
|
|
2040
|
+
- Updated dependencies [ae0b9d3]
|
|
2041
|
+
- Updated dependencies [ad1785c]
|
|
2042
|
+
- Updated dependencies [3b469c8]
|
|
2043
|
+
- Updated dependencies [990a2d6]
|
|
2044
|
+
- Updated dependencies [990a2d6]
|
|
2045
|
+
- Updated dependencies [37140f4]
|
|
2046
|
+
- Updated dependencies [1c84036]
|
|
2047
|
+
- Updated dependencies [1c84036]
|
|
2048
|
+
- Updated dependencies [6650259]
|
|
2049
|
+
- Updated dependencies [4f8b7f8]
|
|
2050
|
+
- Updated dependencies [9e6619f]
|
|
2051
|
+
- Updated dependencies [f6ae5e2]
|
|
2052
|
+
- Updated dependencies [eb97ce6]
|
|
2053
|
+
- Updated dependencies [7343376]
|
|
2054
|
+
- Updated dependencies [b2683a2]
|
|
2055
|
+
- Updated dependencies [dded788]
|
|
2056
|
+
- Updated dependencies [b45d463]
|
|
2057
|
+
- Updated dependencies [54a7830]
|
|
2058
|
+
- Updated dependencies [f3135a4]
|
|
2059
|
+
- Updated dependencies [b5696d3]
|
|
2060
|
+
- Updated dependencies [3f9d926]
|
|
2061
|
+
- Updated dependencies [e978ed5]
|
|
2062
|
+
- Updated dependencies [6a7f24e]
|
|
2063
|
+
- Updated dependencies [b3c96d6]
|
|
2064
|
+
- Updated dependencies [8d0ca91]
|
|
2065
|
+
- Updated dependencies [c30c8dd]
|
|
2066
|
+
- Updated dependencies [244d516]
|
|
2067
|
+
- Updated dependencies [deca847]
|
|
2068
|
+
- Updated dependencies [ac15833]
|
|
2069
|
+
- Updated dependencies [ac15833]
|
|
2070
|
+
- Updated dependencies [e2dffc9]
|
|
2071
|
+
- Updated dependencies [328abeb]
|
|
2072
|
+
- Updated dependencies [dd0d78f]
|
|
2073
|
+
- Updated dependencies [24d3e65]
|
|
2074
|
+
- Updated dependencies [95a7c8d]
|
|
2075
|
+
- Updated dependencies [e227156]
|
|
2076
|
+
- Updated dependencies [cc4e476]
|
|
2077
|
+
- Updated dependencies [92970c4]
|
|
2078
|
+
- Updated dependencies [d570eaa]
|
|
2079
|
+
- Updated dependencies [4b742f4]
|
|
2080
|
+
- Updated dependencies [42687ba]
|
|
2081
|
+
- Updated dependencies [6cd8f66]
|
|
2082
|
+
- Updated dependencies [24a0f14]
|
|
2083
|
+
- Updated dependencies [797a30f]
|
|
2084
|
+
- Updated dependencies [27ae632]
|
|
2085
|
+
- Updated dependencies [b4075c0]
|
|
2086
|
+
- Updated dependencies [9b85600]
|
|
2087
|
+
- Updated dependencies [e327c89]
|
|
2088
|
+
- Updated dependencies [2eaf5be]
|
|
2089
|
+
- Updated dependencies [bf7ab35]
|
|
2090
|
+
- Updated dependencies [99878d8]
|
|
2091
|
+
- Updated dependencies [3c13675]
|
|
2092
|
+
- Updated dependencies [63ab761]
|
|
2093
|
+
- Updated dependencies [0eb9f36]
|
|
2094
|
+
- Updated dependencies [ae582b7]
|
|
2095
|
+
- Updated dependencies [62d6f56]
|
|
2096
|
+
- Updated dependencies [51c2949]
|
|
2097
|
+
- Updated dependencies [a4b017e]
|
|
2098
|
+
- Updated dependencies [8732846]
|
|
2099
|
+
- Updated dependencies [559a2e2]
|
|
2100
|
+
- Updated dependencies [db11afd]
|
|
2101
|
+
- Updated dependencies [154075a]
|
|
2102
|
+
- Updated dependencies [582edef]
|
|
2103
|
+
- Updated dependencies [19f484f]
|
|
2104
|
+
- Updated dependencies [0a78a20]
|
|
2105
|
+
- Updated dependencies [615346d]
|
|
2106
|
+
- Updated dependencies [75dcc81]
|
|
2107
|
+
- Updated dependencies [55a12a8]
|
|
2108
|
+
- Updated dependencies [edfcf5a]
|
|
2109
|
+
- Updated dependencies [0a3e540]
|
|
2110
|
+
- Updated dependencies [c021b35]
|
|
2111
|
+
- Updated dependencies [f61dab1]
|
|
2112
|
+
- Updated dependencies [b0a05dd]
|
|
2113
|
+
- Updated dependencies [dd5ff19]
|
|
2114
|
+
- Updated dependencies [54997ff]
|
|
2115
|
+
- Updated dependencies [81f8498]
|
|
2116
|
+
- Updated dependencies [a782fa7]
|
|
2117
|
+
- Updated dependencies [1d6a23d]
|
|
2118
|
+
- Updated dependencies [0645133]
|
|
2119
|
+
- Updated dependencies [76e9df0]
|
|
2120
|
+
- Updated dependencies [0ecaa7d]
|
|
2121
|
+
- Updated dependencies [b24f93a]
|
|
2122
|
+
- Updated dependencies [6158e4c]
|
|
2123
|
+
- Updated dependencies [cff8641]
|
|
2124
|
+
- Updated dependencies [3f61eef]
|
|
2125
|
+
- Updated dependencies [c27b575]
|
|
2126
|
+
- Updated dependencies [84b275c]
|
|
2127
|
+
- Updated dependencies [0e6e76b]
|
|
2128
|
+
- Updated dependencies [bf43afa]
|
|
2129
|
+
- Updated dependencies [385ebc5]
|
|
2130
|
+
- Updated dependencies [3a0e7ab]
|
|
2131
|
+
- Updated dependencies [858eafb]
|
|
2132
|
+
- Updated dependencies [a8c5509]
|
|
2133
|
+
- Updated dependencies [c2a8d23]
|
|
2134
|
+
- Updated dependencies [f4ed238]
|
|
2135
|
+
- Updated dependencies [0ffc423]
|
|
2136
|
+
- Updated dependencies [3cc4fe5]
|
|
2137
|
+
- Updated dependencies [cd5b19a]
|
|
2138
|
+
- Updated dependencies [cd5b19a]
|
|
2139
|
+
- Updated dependencies [17dc167]
|
|
2140
|
+
- Updated dependencies [20d23be]
|
|
2141
|
+
- Updated dependencies [20d23be]
|
|
2142
|
+
- Updated dependencies [2e3da72]
|
|
2143
|
+
- Updated dependencies [1263e40]
|
|
2144
|
+
- Updated dependencies [e6bc087]
|
|
2145
|
+
- Updated dependencies [9419df1]
|
|
2146
|
+
- Updated dependencies [8bab157]
|
|
2147
|
+
- Updated dependencies [a7557a7]
|
|
2148
|
+
- Updated dependencies [7d074ba]
|
|
2149
|
+
- Updated dependencies [6158e4c]
|
|
2150
|
+
- Updated dependencies [6158e4c]
|
|
2151
|
+
- Updated dependencies [52aad5c]
|
|
2152
|
+
- Updated dependencies [18d1a0a]
|
|
2153
|
+
- Updated dependencies [e420df3]
|
|
2154
|
+
- Updated dependencies [7fed09d]
|
|
2155
|
+
- Updated dependencies [c1763e5]
|
|
2156
|
+
- Updated dependencies [58da8ae]
|
|
2157
|
+
- Updated dependencies [a8b9889]
|
|
2158
|
+
- Updated dependencies [138ad45]
|
|
2159
|
+
- Updated dependencies [138ad45]
|
|
2160
|
+
- Updated dependencies [5262f7d]
|
|
2161
|
+
- Updated dependencies [6aa029b]
|
|
2162
|
+
- Updated dependencies [2124d04]
|
|
2163
|
+
- Updated dependencies [be52115]
|
|
2164
|
+
- Updated dependencies [770cc5b]
|
|
2165
|
+
- Updated dependencies [1a88ce2]
|
|
2166
|
+
- Updated dependencies [a1a44d6]
|
|
2167
|
+
- Updated dependencies [e0a9c67]
|
|
2168
|
+
- Updated dependencies [5638529]
|
|
2169
|
+
- Updated dependencies [5638529]
|
|
2170
|
+
- Updated dependencies [d0fba91]
|
|
2171
|
+
- Updated dependencies [c476be0]
|
|
2172
|
+
- Updated dependencies [c82ff39]
|
|
2173
|
+
- Updated dependencies [6c3da53]
|
|
2174
|
+
- Updated dependencies [31987bd]
|
|
2175
|
+
- Updated dependencies [3c3ce15]
|
|
2176
|
+
- Updated dependencies [063119f]
|
|
2177
|
+
- Updated dependencies [e100589]
|
|
2178
|
+
- Updated dependencies [304f611]
|
|
2179
|
+
- Updated dependencies [e46ee77]
|
|
2180
|
+
- Updated dependencies [f9c8c4e]
|
|
2181
|
+
- Updated dependencies [6e9c8d2]
|
|
2182
|
+
- Updated dependencies [9547063]
|
|
2183
|
+
- Updated dependencies [3f6efd6]
|
|
2184
|
+
- Updated dependencies [52c95a1]
|
|
2185
|
+
- Updated dependencies [55d18c6]
|
|
2186
|
+
- Updated dependencies [c4ab6d0]
|
|
2187
|
+
- Updated dependencies [0e9058b]
|
|
2188
|
+
- Updated dependencies [c4ab6d0]
|
|
2189
|
+
- Updated dependencies [5988b6b]
|
|
2190
|
+
- Updated dependencies [6158e4c]
|
|
2191
|
+
- Updated dependencies [00ccdf7]
|
|
2192
|
+
- Updated dependencies [9d9ed54]
|
|
2193
|
+
- Updated dependencies [6007dd4]
|
|
2194
|
+
- Updated dependencies [4a1adb7]
|
|
2195
|
+
- Updated dependencies [4a1adb7]
|
|
2196
|
+
- Updated dependencies [4a1adb7]
|
|
2197
|
+
- Updated dependencies [4a1adb7]
|
|
2198
|
+
- Updated dependencies [185b7a0]
|
|
2199
|
+
- Updated dependencies [50c73fe]
|
|
2200
|
+
- Updated dependencies [ca3de72]
|
|
2201
|
+
- Updated dependencies [83e3f83]
|
|
2202
|
+
- Updated dependencies [401611b]
|
|
2203
|
+
- Updated dependencies [2c0ddf2]
|
|
2204
|
+
- Updated dependencies [4abc0aa]
|
|
2205
|
+
- Updated dependencies [f560ded]
|
|
2206
|
+
- Updated dependencies [f560ded]
|
|
2207
|
+
- Updated dependencies [2b188fa]
|
|
2208
|
+
- Updated dependencies [b654d4e]
|
|
2209
|
+
- Updated dependencies [f68e0a0]
|
|
2210
|
+
- Updated dependencies [aea682a]
|
|
2211
|
+
- Updated dependencies [fcdc8ec]
|
|
2212
|
+
- Updated dependencies [2d576e4]
|
|
2213
|
+
- Updated dependencies [8366acc]
|
|
2214
|
+
- Updated dependencies [95e58a3]
|
|
2215
|
+
- Updated dependencies [9d7419b]
|
|
2216
|
+
- Updated dependencies [fc7db05]
|
|
2217
|
+
- Updated dependencies [fc7db05]
|
|
2218
|
+
- Updated dependencies [9ed8d0f]
|
|
2219
|
+
- Updated dependencies [c73cdb5]
|
|
2220
|
+
- Updated dependencies [6f5719e]
|
|
2221
|
+
- Updated dependencies [b34cc14]
|
|
2222
|
+
- Updated dependencies [ab18797]
|
|
2223
|
+
- Updated dependencies [d0097af]
|
|
2224
|
+
- Updated dependencies [432882b]
|
|
2225
|
+
- Updated dependencies [64dae8e]
|
|
2226
|
+
- Updated dependencies [b06e374]
|
|
2227
|
+
- Updated dependencies [06a8af5]
|
|
2228
|
+
- Updated dependencies [6a91586]
|
|
2229
|
+
- Updated dependencies [a04d7c6]
|
|
2230
|
+
- Updated dependencies [5ccc500]
|
|
2231
|
+
- Updated dependencies [f3c2bb0]
|
|
2232
|
+
- Updated dependencies [978507b]
|
|
2233
|
+
- Updated dependencies [778138e]
|
|
2234
|
+
- Updated dependencies [9801765]
|
|
2235
|
+
- Updated dependencies [9cebfca]
|
|
2236
|
+
- Updated dependencies [460575f]
|
|
2237
|
+
- Updated dependencies [d796c8d]
|
|
2238
|
+
- Updated dependencies [594704f]
|
|
2239
|
+
- Updated dependencies [d3995fe]
|
|
2240
|
+
- Updated dependencies [1b1d772]
|
|
2241
|
+
- Updated dependencies [d88e20f]
|
|
2242
|
+
- Updated dependencies [f66072d]
|
|
2243
|
+
- Updated dependencies [2d7304d]
|
|
2244
|
+
- Updated dependencies [636b236]
|
|
2245
|
+
- Updated dependencies [4172589]
|
|
2246
|
+
- Updated dependencies [d6d8fb9]
|
|
2247
|
+
- Updated dependencies [64d624d]
|
|
2248
|
+
- Updated dependencies [053fdc8]
|
|
2249
|
+
- Updated dependencies [41b7ce3]
|
|
2250
|
+
- Updated dependencies [ae476b8]
|
|
2251
|
+
- Updated dependencies [39f4309]
|
|
2252
|
+
- Updated dependencies [95bad12]
|
|
2253
|
+
- Updated dependencies [d2fb6ef]
|
|
2254
|
+
- Updated dependencies [7cd3987]
|
|
2255
|
+
- Updated dependencies [ee3b878]
|
|
2256
|
+
- Updated dependencies [e304a4e]
|
|
2257
|
+
- Updated dependencies [fda49e5]
|
|
2258
|
+
- Updated dependencies [490d9a9]
|
|
2259
|
+
- Updated dependencies [1117414]
|
|
2260
|
+
- Updated dependencies [6d63cd0]
|
|
2261
|
+
- Updated dependencies [fc62bb4]
|
|
2262
|
+
- Updated dependencies [41df893]
|
|
2263
|
+
- Updated dependencies [0cba1b7]
|
|
2264
|
+
- Updated dependencies [7c96c94]
|
|
2265
|
+
- Updated dependencies [4da5109]
|
|
2266
|
+
- Updated dependencies [00f3eb5]
|
|
2267
|
+
- Updated dependencies [1ec291c]
|
|
2268
|
+
- Updated dependencies [453dbaa]
|
|
2269
|
+
- Updated dependencies [95f8704]
|
|
2270
|
+
- Updated dependencies [f8cdbf2]
|
|
2271
|
+
- Updated dependencies [69a2163]
|
|
2272
|
+
- Updated dependencies [24e027e]
|
|
2273
|
+
- Updated dependencies [2c3cd1b]
|
|
2274
|
+
- Updated dependencies [e176053]
|
|
2275
|
+
- Updated dependencies [e30ed15]
|
|
2276
|
+
- Updated dependencies [90665e0]
|
|
2277
|
+
- Updated dependencies [8d3a529]
|
|
2278
|
+
- Updated dependencies [5ac2e2c]
|
|
2279
|
+
- Updated dependencies [194fae1]
|
|
2280
|
+
- Updated dependencies [63d54dd]
|
|
2281
|
+
- Updated dependencies [7e19d03]
|
|
2282
|
+
- Updated dependencies [b08b7eb]
|
|
2283
|
+
- Updated dependencies [1e946c9]
|
|
2284
|
+
- Updated dependencies [546ddf7]
|
|
2285
|
+
- Updated dependencies [864154e]
|
|
2286
|
+
- Updated dependencies [b023625]
|
|
2287
|
+
- Updated dependencies [75bd83d]
|
|
2288
|
+
- Updated dependencies [44d075b]
|
|
2289
|
+
- Updated dependencies [40c479a]
|
|
2290
|
+
- Updated dependencies [b4393e5]
|
|
2291
|
+
- Updated dependencies [971d387]
|
|
2292
|
+
- Updated dependencies [ee851c3]
|
|
2293
|
+
- Updated dependencies [6414dfd]
|
|
2294
|
+
- Updated dependencies [a8d5c71]
|
|
2295
|
+
- Updated dependencies [905b21f]
|
|
2296
|
+
- Updated dependencies [88e9109]
|
|
2297
|
+
- Updated dependencies [2c45966]
|
|
2298
|
+
- Updated dependencies [db3a600]
|
|
2299
|
+
- Updated dependencies [3a3db76]
|
|
2300
|
+
- Updated dependencies [0d723a3]
|
|
2301
|
+
- Updated dependencies [0c95d3d]
|
|
2302
|
+
- Updated dependencies [3e4fa2c]
|
|
2303
|
+
- Updated dependencies [b5b928a]
|
|
2304
|
+
- Updated dependencies [6fd2cf7]
|
|
2305
|
+
- Updated dependencies [5fa06c4]
|
|
2306
|
+
- Updated dependencies [52a43de]
|
|
2307
|
+
- Updated dependencies [195052f]
|
|
2308
|
+
- Updated dependencies [e4559d1]
|
|
2309
|
+
- Updated dependencies [2c71482]
|
|
2310
|
+
- Updated dependencies [129bcc5]
|
|
2311
|
+
- Updated dependencies [d3005f7]
|
|
2312
|
+
- Updated dependencies [1e7fe0a]
|
|
2313
|
+
- Updated dependencies [a26b9e4]
|
|
2314
|
+
- Updated dependencies [5ef9c4f]
|
|
2315
|
+
- Updated dependencies [46f0bb4]
|
|
2316
|
+
- Updated dependencies [06b82b8]
|
|
2317
|
+
- Updated dependencies [8ec11e1]
|
|
2318
|
+
- Updated dependencies [6f81384]
|
|
2319
|
+
- Updated dependencies [22ba927]
|
|
2320
|
+
- Updated dependencies [8631c32]
|
|
2321
|
+
- Updated dependencies [f8c70f4]
|
|
2322
|
+
- Updated dependencies [5d3a2d1]
|
|
2323
|
+
- Updated dependencies [8f1d995]
|
|
2324
|
+
- Updated dependencies [b362c1b]
|
|
2325
|
+
- Updated dependencies [f9c34df]
|
|
2326
|
+
- Updated dependencies [dddb942]
|
|
2327
|
+
- Updated dependencies [00c665e]
|
|
2328
|
+
- Updated dependencies [29754cf]
|
|
2329
|
+
- Updated dependencies [d7de534]
|
|
2330
|
+
- Updated dependencies [3c2b6f7]
|
|
2331
|
+
- Updated dependencies [6e88630]
|
|
2332
|
+
- Updated dependencies [b84dc18]
|
|
2333
|
+
- Updated dependencies [ac8abb0]
|
|
2334
|
+
- Updated dependencies [9d86e1d]
|
|
2335
|
+
- Updated dependencies [3a5817f]
|
|
2336
|
+
- Updated dependencies [99a3c2d]
|
|
2337
|
+
- Updated dependencies [5961030]
|
|
2338
|
+
- Updated dependencies [f24de8b]
|
|
2339
|
+
- Updated dependencies [c8ea8af]
|
|
2340
|
+
- Updated dependencies [9602dc8]
|
|
2341
|
+
- Updated dependencies [3777538]
|
|
2342
|
+
- Updated dependencies [3190414]
|
|
2343
|
+
- Updated dependencies [4e480f5]
|
|
2344
|
+
- Updated dependencies [38a123c]
|
|
2345
|
+
- Updated dependencies [299102e]
|
|
2346
|
+
- Updated dependencies [30c73cd]
|
|
2347
|
+
- Updated dependencies [830ed58]
|
|
2348
|
+
- Updated dependencies [d7acad6]
|
|
2349
|
+
- Updated dependencies [45a9aeb]
|
|
2350
|
+
- Updated dependencies [713db46]
|
|
2351
|
+
- Updated dependencies [c71e14d]
|
|
2352
|
+
- Updated dependencies [bf3a03c]
|
|
2353
|
+
- Updated dependencies [cb55718]
|
|
2354
|
+
- Updated dependencies [748494b]
|
|
2355
|
+
- Updated dependencies [5967be0]
|
|
2356
|
+
- Updated dependencies [831be72]
|
|
2357
|
+
- Updated dependencies [29cb85b]
|
|
2358
|
+
- Updated dependencies [3e028c8]
|
|
2359
|
+
- Updated dependencies [d0889e2]
|
|
2360
|
+
- Updated dependencies [ce503e5]
|
|
2361
|
+
- Updated dependencies [f20dcf0]
|
|
2362
|
+
- Updated dependencies [12402a9]
|
|
2363
|
+
- Updated dependencies [aff3d7a]
|
|
2364
|
+
- Updated dependencies [4ca30d0]
|
|
2365
|
+
- Updated dependencies [7a5da14]
|
|
2366
|
+
- Updated dependencies [fff9645]
|
|
2367
|
+
- Updated dependencies [9c3b7ce]
|
|
2368
|
+
- Updated dependencies [2c1c967]
|
|
2369
|
+
- Updated dependencies [9486ac6]
|
|
2370
|
+
- Updated dependencies [9486ac6]
|
|
2371
|
+
- Updated dependencies [4d5f9b4]
|
|
2372
|
+
- Updated dependencies [d6ceb8d]
|
|
2373
|
+
- Updated dependencies [dc4365c]
|
|
2374
|
+
- Updated dependencies [e321d52]
|
|
2375
|
+
- Updated dependencies [969ba84]
|
|
2376
|
+
- Updated dependencies [98188c2]
|
|
2377
|
+
- Updated dependencies [4c68077]
|
|
2378
|
+
- Updated dependencies [7977ff9]
|
|
2379
|
+
- Updated dependencies [3beef6d]
|
|
2380
|
+
- Updated dependencies [06b8c42]
|
|
2381
|
+
- Updated dependencies [46b9bc9]
|
|
2382
|
+
- Updated dependencies [f46bd39]
|
|
2383
|
+
- Updated dependencies [b98352a]
|
|
2384
|
+
- Updated dependencies [b76ca67]
|
|
2385
|
+
- Updated dependencies [45ac2cb]
|
|
2386
|
+
- Updated dependencies [b97790a]
|
|
2387
|
+
- Updated dependencies [dbd5194]
|
|
2388
|
+
- Updated dependencies [7c9b044]
|
|
2389
|
+
- Updated dependencies [e552c31]
|
|
2390
|
+
- Updated dependencies [d47de51]
|
|
2391
|
+
- Updated dependencies [3fe6463]
|
|
2392
|
+
- Updated dependencies [b392674]
|
|
2393
|
+
- Updated dependencies [4f3a1e2]
|
|
2394
|
+
- Updated dependencies [31ab372]
|
|
2395
|
+
- Updated dependencies [846889b]
|
|
2396
|
+
- Updated dependencies [2acd8e1]
|
|
2397
|
+
- Updated dependencies [7b90231]
|
|
2398
|
+
- Updated dependencies [26896c6]
|
|
2399
|
+
- Updated dependencies [a439e16]
|
|
2400
|
+
- Updated dependencies [67fc3b0]
|
|
2401
|
+
- Updated dependencies [8579e34]
|
|
2402
|
+
- Updated dependencies [d57db5d]
|
|
2403
|
+
- Updated dependencies [33a3b3c]
|
|
2404
|
+
- Updated dependencies [b87f15b]
|
|
2405
|
+
- Updated dependencies [9409eb9]
|
|
2406
|
+
- Updated dependencies [045d20b]
|
|
2407
|
+
- Updated dependencies [a2d2515]
|
|
2408
|
+
- Updated dependencies [c18d099]
|
|
2409
|
+
- Updated dependencies [0caacca]
|
|
2410
|
+
- Updated dependencies [adb2a86]
|
|
2411
|
+
- Updated dependencies [03380aa]
|
|
2412
|
+
- Updated dependencies [4562ea5]
|
|
2413
|
+
- Updated dependencies [3619792]
|
|
2414
|
+
- Updated dependencies [3561bd2]
|
|
2415
|
+
- Updated dependencies [bf97b98]
|
|
2416
|
+
- Updated dependencies [320374d]
|
|
2417
|
+
- Updated dependencies [b0d308d]
|
|
2418
|
+
- Updated dependencies [b458300]
|
|
2419
|
+
- Updated dependencies [40f34b4]
|
|
2420
|
+
- Updated dependencies [bd0376d]
|
|
2421
|
+
- Updated dependencies [8063bcb]
|
|
2422
|
+
- Updated dependencies [b74a859]
|
|
2423
|
+
- Updated dependencies [d4493fd]
|
|
2424
|
+
- Updated dependencies [240b80f]
|
|
2425
|
+
- Updated dependencies [77cb489]
|
|
2426
|
+
- Updated dependencies [bfaa158]
|
|
2427
|
+
- Updated dependencies [777e5c6]
|
|
2428
|
+
- Updated dependencies [0c386dd]
|
|
2429
|
+
- Updated dependencies [39d69ad]
|
|
2430
|
+
- Updated dependencies [9e37d9b]
|
|
2431
|
+
- Updated dependencies [5ad86dd]
|
|
2432
|
+
- Updated dependencies [16a725f]
|
|
2433
|
+
- Updated dependencies [c4326fe]
|
|
2434
|
+
- Updated dependencies [4dfdcc3]
|
|
2435
|
+
- Updated dependencies [6a449fc]
|
|
2436
|
+
- Updated dependencies [446d93d]
|
|
2437
|
+
- Updated dependencies [ecd9cb2]
|
|
2438
|
+
- Updated dependencies [f08bcd9]
|
|
2439
|
+
- Updated dependencies [98d4108]
|
|
2440
|
+
- Updated dependencies [0e3b3be]
|
|
2441
|
+
- Updated dependencies [a29ae2d]
|
|
2442
|
+
- Updated dependencies [220c18d]
|
|
2443
|
+
- Updated dependencies [eeb6c2f]
|
|
2444
|
+
- Updated dependencies [00d3f09]
|
|
2445
|
+
- Updated dependencies [4388f71]
|
|
2446
|
+
- Updated dependencies [0b1ac58]
|
|
2447
|
+
- Updated dependencies [c93b4d5]
|
|
2448
|
+
- Updated dependencies [c1fe272]
|
|
2449
|
+
- Updated dependencies [3cab570]
|
|
2450
|
+
- Updated dependencies [8ad218d]
|
|
2451
|
+
- Updated dependencies [3e41187]
|
|
2452
|
+
- Updated dependencies [5f78953]
|
|
2453
|
+
- Updated dependencies [639114c]
|
|
2454
|
+
- Updated dependencies [639114c]
|
|
2455
|
+
- Updated dependencies [1490691]
|
|
2456
|
+
- Updated dependencies [e8e4c4d]
|
|
2457
|
+
- Updated dependencies [1f31d3a]
|
|
2458
|
+
- Updated dependencies [d1842ab]
|
|
2459
|
+
- Updated dependencies [854cba3]
|
|
2460
|
+
- Updated dependencies [78ca238]
|
|
2461
|
+
- Updated dependencies [d8ec8d6]
|
|
2462
|
+
- Updated dependencies [351eb31]
|
|
2463
|
+
- Updated dependencies [866cd1d]
|
|
2464
|
+
- Updated dependencies [20c04b2]
|
|
2465
|
+
- Updated dependencies [01c9023]
|
|
2466
|
+
- Updated dependencies [48c19bd]
|
|
2467
|
+
- Updated dependencies [a6d8b8d]
|
|
2468
|
+
- Updated dependencies [4b5bb95]
|
|
2469
|
+
- Updated dependencies [b652514]
|
|
2470
|
+
- Updated dependencies [adbda1b]
|
|
2471
|
+
- Updated dependencies [adbda1b]
|
|
2472
|
+
- Updated dependencies [8952395]
|
|
2473
|
+
- Updated dependencies [e2b3826]
|
|
2474
|
+
- Updated dependencies [a338037]
|
|
2475
|
+
- Updated dependencies [0348bc9]
|
|
2476
|
+
- Updated dependencies [e8c553b]
|
|
2477
|
+
- Updated dependencies [2e32ed4]
|
|
2478
|
+
- Updated dependencies [554e647]
|
|
2479
|
+
- Updated dependencies [3ed3eec]
|
|
2480
|
+
- Updated dependencies [7c3df8f]
|
|
2481
|
+
- Updated dependencies [a4514e8]
|
|
2482
|
+
- Updated dependencies [6411def]
|
|
2483
|
+
- Updated dependencies [db3896c]
|
|
2484
|
+
- Updated dependencies [b9f5ff1]
|
|
2485
|
+
- Updated dependencies [e75f4c9]
|
|
2486
|
+
- Updated dependencies [19f1639]
|
|
2487
|
+
- Updated dependencies [4704aa4]
|
|
2488
|
+
- Updated dependencies [47547d0]
|
|
2489
|
+
- Updated dependencies [1bee5d0]
|
|
2490
|
+
- Updated dependencies [63a8828]
|
|
2491
|
+
- Updated dependencies [b61d7d8]
|
|
2492
|
+
- Updated dependencies [858cd72]
|
|
2493
|
+
- Updated dependencies [cfc9b6d]
|
|
2494
|
+
- Updated dependencies [dc0a60b]
|
|
2495
|
+
- Updated dependencies [554f2b6]
|
|
2496
|
+
- Updated dependencies [72f55c9]
|
|
2497
|
+
- Updated dependencies [26e06d7]
|
|
2498
|
+
- Updated dependencies [669d71b]
|
|
2499
|
+
- Updated dependencies [ed27d7c]
|
|
2500
|
+
- Updated dependencies [52c8cf7]
|
|
2501
|
+
- Updated dependencies [2ceb43a]
|
|
2502
|
+
- Updated dependencies [7cdd2b9]
|
|
2503
|
+
- Updated dependencies [52c8cf7]
|
|
2504
|
+
- Updated dependencies [3399704]
|
|
2505
|
+
- Updated dependencies [02fe257]
|
|
2506
|
+
- Updated dependencies [71a4a53]
|
|
2507
|
+
- Updated dependencies [7bf244b]
|
|
2508
|
+
- Updated dependencies [f0bb9fa]
|
|
2509
|
+
- Updated dependencies [81a2eb1]
|
|
2510
|
+
- Updated dependencies [caa0cd3]
|
|
2511
|
+
- Updated dependencies [caa0cd3]
|
|
2512
|
+
- Updated dependencies [20cb8db]
|
|
2513
|
+
- Updated dependencies [25c7d58]
|
|
2514
|
+
- Updated dependencies [00d2fa6]
|
|
2515
|
+
- Updated dependencies [77b2a18]
|
|
2516
|
+
- Updated dependencies [c6198c2]
|
|
2517
|
+
- Updated dependencies [721d1e0]
|
|
2518
|
+
- Updated dependencies [c2f0f48]
|
|
2519
|
+
- Updated dependencies [1237ae4]
|
|
2520
|
+
- Updated dependencies [2f61238]
|
|
2521
|
+
- Updated dependencies [51eb515]
|
|
2522
|
+
- Updated dependencies [c354ce5]
|
|
2523
|
+
- Updated dependencies [8fe8e5c]
|
|
2524
|
+
- Updated dependencies [feac439]
|
|
2525
|
+
- Updated dependencies [9ae871d]
|
|
2526
|
+
- Updated dependencies [efbd566]
|
|
2527
|
+
- Updated dependencies [2a5bf45]
|
|
2528
|
+
- Updated dependencies [9587fc9]
|
|
2529
|
+
- Updated dependencies [e62c44e]
|
|
2530
|
+
- Updated dependencies [daf9d57]
|
|
2531
|
+
- Updated dependencies [fe8f451]
|
|
2532
|
+
- Updated dependencies [23b9958]
|
|
2533
|
+
- Updated dependencies [c15d7ec]
|
|
2534
|
+
- Updated dependencies [5d0876c]
|
|
2535
|
+
- Updated dependencies [f7ace0a]
|
|
2536
|
+
- Updated dependencies [b041b9c]
|
|
2537
|
+
- Updated dependencies [ce2aaef]
|
|
2538
|
+
- Updated dependencies [544ecba]
|
|
2539
|
+
- Updated dependencies [2ce2612]
|
|
2540
|
+
- Updated dependencies [bc640ec]
|
|
2541
|
+
- Updated dependencies [1e215c4]
|
|
2542
|
+
- Updated dependencies [da6e191]
|
|
2543
|
+
- Updated dependencies [3e377c9]
|
|
2544
|
+
- Updated dependencies [a3eb5d0]
|
|
2545
|
+
- Updated dependencies [4ce14f1]
|
|
2546
|
+
- Updated dependencies [aef97e5]
|
|
2547
|
+
- Updated dependencies [2af1fa7]
|
|
2548
|
+
- Updated dependencies [c14d3a0]
|
|
2549
|
+
- Updated dependencies [a137d0c]
|
|
2550
|
+
- Updated dependencies [caf477f]
|
|
2551
|
+
- Updated dependencies [f6375da]
|
|
2552
|
+
- Updated dependencies [967e5d8]
|
|
2553
|
+
- Updated dependencies [c907a9c]
|
|
2554
|
+
- Updated dependencies [a4611b3]
|
|
2555
|
+
- Updated dependencies [20316ba]
|
|
2556
|
+
- Updated dependencies [d3499b3]
|
|
2557
|
+
- Updated dependencies [91f9276]
|
|
2558
|
+
- Updated dependencies [309c75e]
|
|
2559
|
+
- Updated dependencies [c9f9bae]
|
|
2560
|
+
- Updated dependencies [18897a4]
|
|
2561
|
+
- Updated dependencies [8b7ea39]
|
|
2562
|
+
- Updated dependencies [a915064]
|
|
2563
|
+
- Updated dependencies [dcbf0b2]
|
|
2564
|
+
- Updated dependencies [52cac38]
|
|
2565
|
+
- Updated dependencies [93fea2e]
|
|
2566
|
+
- Updated dependencies [1422a92]
|
|
2567
|
+
- Updated dependencies [d05fe17]
|
|
2568
|
+
- Updated dependencies [a480f79]
|
|
2569
|
+
- Updated dependencies [f08d1a8]
|
|
2570
|
+
- Updated dependencies [64a252d]
|
|
2571
|
+
- Updated dependencies [786bc91]
|
|
2572
|
+
- Updated dependencies [75fca96]
|
|
2573
|
+
- Updated dependencies [7ca6ddd]
|
|
2574
|
+
- Updated dependencies [f1cd290]
|
|
2575
|
+
- Updated dependencies [5a41ce7]
|
|
2576
|
+
- Updated dependencies [8d50bc2]
|
|
2577
|
+
- Updated dependencies [604476d]
|
|
2578
|
+
- Updated dependencies [d1bebb0]
|
|
2579
|
+
- Updated dependencies [95bf128]
|
|
2580
|
+
- Updated dependencies [335abea]
|
|
2581
|
+
- Updated dependencies [edea22a]
|
|
2582
|
+
- Updated dependencies [0f5cadf]
|
|
2583
|
+
- Updated dependencies [4f9f1ee]
|
|
2584
|
+
- Updated dependencies [66e8b2a]
|
|
2585
|
+
- Updated dependencies [aa083cd]
|
|
2586
|
+
- Updated dependencies [12b5992]
|
|
2587
|
+
- Updated dependencies [b93e245]
|
|
2588
|
+
- Updated dependencies [c842594]
|
|
2589
|
+
- Updated dependencies [290de37]
|
|
2590
|
+
- Updated dependencies [e1c27e4]
|
|
2591
|
+
- Updated dependencies [8c8da45]
|
|
2592
|
+
- Updated dependencies [8cd8eb5]
|
|
2593
|
+
- Updated dependencies [f52a9d7]
|
|
2594
|
+
- Updated dependencies [cf1d29e]
|
|
2595
|
+
- Updated dependencies [1bd79c8]
|
|
2596
|
+
- Updated dependencies [af9e957]
|
|
2597
|
+
- Updated dependencies [b1030c7]
|
|
2598
|
+
- Updated dependencies [c974edf]
|
|
2599
|
+
- Updated dependencies [592402e]
|
|
2600
|
+
- Updated dependencies [ad852b6]
|
|
2601
|
+
- Updated dependencies [6778809]
|
|
2602
|
+
- Updated dependencies [3a3dd28]
|
|
2603
|
+
- Updated dependencies [7fb22a1]
|
|
2604
|
+
- Updated dependencies [ad66d79]
|
|
2605
|
+
- Updated dependencies [0758bd8]
|
|
2606
|
+
- Updated dependencies [ee4d19f]
|
|
2607
|
+
- Updated dependencies [37149ec]
|
|
2608
|
+
- Updated dependencies [496d31d]
|
|
2609
|
+
- Updated dependencies [7ed9808]
|
|
2610
|
+
- Updated dependencies [0ea7054]
|
|
2611
|
+
- Updated dependencies [ac0e39a]
|
|
2612
|
+
- Updated dependencies [9a853f2]
|
|
2613
|
+
- Updated dependencies [cb847fd]
|
|
2614
|
+
- Updated dependencies [ee70287]
|
|
2615
|
+
- Updated dependencies [3e98e13]
|
|
2616
|
+
- Updated dependencies [a695f50]
|
|
2617
|
+
- Updated dependencies [fc32921]
|
|
2618
|
+
- Updated dependencies [4eaa835]
|
|
2619
|
+
- Updated dependencies [8f9d87a]
|
|
2620
|
+
- Updated dependencies [b1777ae]
|
|
2621
|
+
- Updated dependencies [24845c4]
|
|
2622
|
+
- Updated dependencies [6f864cf]
|
|
2623
|
+
- Updated dependencies [24d1edd]
|
|
2624
|
+
- Updated dependencies [645087c]
|
|
2625
|
+
- Updated dependencies [33f4a19]
|
|
2626
|
+
- Updated dependencies [6e9a3d4]
|
|
2627
|
+
- Updated dependencies [4a292d2]
|
|
2628
|
+
- Updated dependencies [5323168]
|
|
2629
|
+
- Updated dependencies [841dd2b]
|
|
2630
|
+
- Updated dependencies [3014fc0]
|
|
2631
|
+
- Updated dependencies [dacb402]
|
|
2632
|
+
- Updated dependencies [846cec0]
|
|
2633
|
+
- Updated dependencies [91facae]
|
|
2634
|
+
- Updated dependencies [b38014e]
|
|
2635
|
+
- Updated dependencies [e2feb13]
|
|
2636
|
+
- Updated dependencies [474797d]
|
|
2637
|
+
- Updated dependencies [704e695]
|
|
2638
|
+
- Updated dependencies [9dcc545]
|
|
2639
|
+
- Updated dependencies [d7fecfb]
|
|
2640
|
+
- Updated dependencies [c13d39e]
|
|
2641
|
+
- Updated dependencies [a407bd6]
|
|
2642
|
+
- Updated dependencies [317dbce]
|
|
2643
|
+
- Updated dependencies [309728c]
|
|
2644
|
+
- Updated dependencies [c03d03b]
|
|
2645
|
+
- Updated dependencies [e6ec217]
|
|
2646
|
+
- Updated dependencies [aa08d7e]
|
|
2647
|
+
- Updated dependencies [3a43a15]
|
|
2648
|
+
- Updated dependencies [868e825]
|
|
2649
|
+
- Updated dependencies [f76f436]
|
|
2650
|
+
- Updated dependencies [ce45a03]
|
|
2651
|
+
- Updated dependencies [7cf6f38]
|
|
2652
|
+
- Updated dependencies [fd9c50a]
|
|
2653
|
+
- Updated dependencies [421544b]
|
|
2654
|
+
- Updated dependencies [5cc8c28]
|
|
2655
|
+
- Updated dependencies [fb01022]
|
|
2656
|
+
- Updated dependencies [e9d9212]
|
|
2657
|
+
- Updated dependencies [ecfb693]
|
|
2658
|
+
- Updated dependencies [639ca9d]
|
|
2659
|
+
- Updated dependencies [2152962]
|
|
2660
|
+
- Updated dependencies [40a7c53]
|
|
2661
|
+
- Updated dependencies [abc1b18]
|
|
2662
|
+
- Updated dependencies [81a51db]
|
|
2663
|
+
- Updated dependencies [67749c7]
|
|
2664
|
+
- Updated dependencies [507b61b]
|
|
2665
|
+
- Updated dependencies [512c84b]
|
|
2666
|
+
- Updated dependencies [c300267]
|
|
2667
|
+
- Updated dependencies [fb3a101]
|
|
2668
|
+
- Updated dependencies [d4733f2]
|
|
2669
|
+
- Updated dependencies [7c9145f]
|
|
2670
|
+
- Updated dependencies [1570eac]
|
|
2671
|
+
- Updated dependencies [f391ede]
|
|
2672
|
+
- Updated dependencies [f5cfbbd]
|
|
2673
|
+
- Updated dependencies [f5cfbbd]
|
|
2674
|
+
- Updated dependencies [8b532cb]
|
|
2675
|
+
- Updated dependencies [64c3cdd]
|
|
2676
|
+
- Updated dependencies [4d65991]
|
|
2677
|
+
- Updated dependencies [c42554e]
|
|
2678
|
+
- Updated dependencies [3e71b26]
|
|
2679
|
+
- Updated dependencies [b89583b]
|
|
2680
|
+
- Updated dependencies [70c4523]
|
|
2681
|
+
- Updated dependencies [555b4ec]
|
|
2682
|
+
- Updated dependencies [64f1cf1]
|
|
2683
|
+
- Updated dependencies [da5e4f6]
|
|
2684
|
+
- Updated dependencies [1ccfc23]
|
|
2685
|
+
- Updated dependencies [542718f]
|
|
2686
|
+
- Updated dependencies [7f27bc5]
|
|
2687
|
+
- Updated dependencies [0a174f3]
|
|
2688
|
+
- Updated dependencies [cc00c59]
|
|
2689
|
+
- Updated dependencies [676f677]
|
|
2690
|
+
- Updated dependencies [f95b140]
|
|
2691
|
+
- Updated dependencies [541ce4e]
|
|
2692
|
+
- Updated dependencies [6479086]
|
|
2693
|
+
- Updated dependencies [d79f525]
|
|
2694
|
+
- Updated dependencies [d1865d2]
|
|
2695
|
+
- Updated dependencies [88a629d]
|
|
2696
|
+
- Updated dependencies [cdd2542]
|
|
2697
|
+
- Updated dependencies [ab77513]
|
|
2698
|
+
- Updated dependencies [55ba3ff]
|
|
2699
|
+
- Updated dependencies [0b138da]
|
|
2700
|
+
- Updated dependencies [3ecc369]
|
|
2701
|
+
- Updated dependencies [f1190b0]
|
|
2702
|
+
- Updated dependencies [561abef]
|
|
2703
|
+
- Updated dependencies [ef52001]
|
|
2704
|
+
- Updated dependencies [6a4680b]
|
|
2705
|
+
- Updated dependencies [c3a4273]
|
|
2706
|
+
- Updated dependencies [abf710d]
|
|
2707
|
+
- Updated dependencies [093af32]
|
|
2708
|
+
- Updated dependencies [6df26f0]
|
|
2709
|
+
- Updated dependencies [1bd1be7]
|
|
2710
|
+
- Updated dependencies [d234fa9]
|
|
2711
|
+
- Updated dependencies [adf5812]
|
|
2712
|
+
- Updated dependencies [0eaed83]
|
|
2713
|
+
- Updated dependencies [e36acd4]
|
|
2714
|
+
- Updated dependencies [5058336]
|
|
2715
|
+
- Updated dependencies [2f6b2bf]
|
|
2716
|
+
- Updated dependencies [2028b31]
|
|
2717
|
+
- Updated dependencies [16a1a51]
|
|
2718
|
+
- Updated dependencies [63601ab]
|
|
2719
|
+
- Updated dependencies [c372b29]
|
|
2720
|
+
- Updated dependencies [152f0a7]
|
|
2721
|
+
- Updated dependencies [8693b85]
|
|
2722
|
+
- Updated dependencies [e82dad1]
|
|
2723
|
+
- Updated dependencies [58b7b3d]
|
|
2724
|
+
- Updated dependencies [e77a003]
|
|
2725
|
+
- Updated dependencies [84defab]
|
|
2726
|
+
- Updated dependencies [681d3f1]
|
|
2727
|
+
- Updated dependencies [969d4f2]
|
|
2728
|
+
- Updated dependencies [88561fd]
|
|
2729
|
+
- Updated dependencies [f3bc481]
|
|
2730
|
+
- Updated dependencies [b79aac2]
|
|
2731
|
+
- Updated dependencies [93fc0e7]
|
|
2732
|
+
- Updated dependencies [0601af1]
|
|
2733
|
+
- Updated dependencies [a4b723f]
|
|
2734
|
+
- Updated dependencies [2b10ca0]
|
|
2735
|
+
- Updated dependencies [7db4a81]
|
|
2736
|
+
- Updated dependencies [19a0b0e]
|
|
2737
|
+
- Updated dependencies [526fc11]
|
|
2738
|
+
- Updated dependencies [f8e3e9a]
|
|
2739
|
+
- Updated dependencies [b9d47ec]
|
|
2740
|
+
- Updated dependencies [3b6bc69]
|
|
2741
|
+
- Updated dependencies [6214db6]
|
|
2742
|
+
- Updated dependencies [6732df4]
|
|
2743
|
+
- Updated dependencies [fe9e0d0]
|
|
2744
|
+
- Updated dependencies [63fb72c]
|
|
2745
|
+
- Updated dependencies [804831c]
|
|
2746
|
+
- Updated dependencies [9f5c017]
|
|
2747
|
+
- Updated dependencies [c271413]
|
|
2748
|
+
- Updated dependencies [279e48e]
|
|
2749
|
+
- Updated dependencies [4784bb3]
|
|
2750
|
+
- Updated dependencies [8700d6d]
|
|
2751
|
+
- Updated dependencies [8db2a0f]
|
|
2752
|
+
- Updated dependencies [689953a]
|
|
2753
|
+
- Updated dependencies [30443fb]
|
|
2754
|
+
- Updated dependencies [8d3dbb2]
|
|
2755
|
+
- Updated dependencies [efc1c9c]
|
|
2756
|
+
- Updated dependencies [7d6439c]
|
|
2757
|
+
- Updated dependencies [da45e6b]
|
|
2758
|
+
- Updated dependencies [7533465]
|
|
2759
|
+
- Updated dependencies [835f0f3]
|
|
2760
|
+
- Updated dependencies [6d5db7b]
|
|
2761
|
+
- Updated dependencies [a9d97be]
|
|
2762
|
+
- Updated dependencies [ed35b44]
|
|
2763
|
+
- Updated dependencies [e6040ef]
|
|
2764
|
+
- Updated dependencies [9ba7e9c]
|
|
2765
|
+
- Updated dependencies [729e851]
|
|
2766
|
+
- Updated dependencies [96919a4]
|
|
2767
|
+
- Updated dependencies [345e24a]
|
|
2768
|
+
- Updated dependencies [3bc1bb4]
|
|
2769
|
+
- Updated dependencies [20b507a]
|
|
2770
|
+
- Updated dependencies [2e471dc]
|
|
2771
|
+
- Updated dependencies [6748587]
|
|
2772
|
+
- Updated dependencies [be50942]
|
|
2773
|
+
- Updated dependencies [775e079]
|
|
2774
|
+
- Updated dependencies [7e8b3c0]
|
|
2775
|
+
- Updated dependencies [53374dc]
|
|
2776
|
+
- Updated dependencies [f6fb83f]
|
|
2777
|
+
- Updated dependencies [2049b03]
|
|
2778
|
+
- Updated dependencies [2bf34f7]
|
|
2779
|
+
- Updated dependencies [15b33ae]
|
|
2780
|
+
- Updated dependencies [7cbc724]
|
|
2781
|
+
- Updated dependencies [4a94c38]
|
|
2782
|
+
- Updated dependencies [7098eed]
|
|
2783
|
+
- Updated dependencies [3df7c5c]
|
|
2784
|
+
- Updated dependencies [fb91ac9]
|
|
2785
|
+
- Updated dependencies [fb91ac9]
|
|
2786
|
+
- Updated dependencies [641fb55]
|
|
2787
|
+
- Updated dependencies [8524372]
|
|
2788
|
+
- Updated dependencies [7cbefa5]
|
|
2789
|
+
- Updated dependencies [72d6587]
|
|
2790
|
+
- Updated dependencies [a272a4f]
|
|
2791
|
+
- Updated dependencies [55f39ee]
|
|
2792
|
+
- Updated dependencies [502eb58]
|
|
2793
|
+
- Updated dependencies [0ce32d5]
|
|
2794
|
+
- Updated dependencies [0970a0e]
|
|
2795
|
+
- Updated dependencies [e427e9c]
|
|
2796
|
+
- Updated dependencies [bbc9dc3]
|
|
2797
|
+
- Updated dependencies [02f1813]
|
|
2798
|
+
- Updated dependencies [1ef89c0]
|
|
2799
|
+
- Updated dependencies [ba0b61a]
|
|
2800
|
+
- Updated dependencies [ba0b61a]
|
|
2801
|
+
- Updated dependencies [ba0b61a]
|
|
2802
|
+
- Updated dependencies [ac716ff]
|
|
2803
|
+
- Updated dependencies [e05553c]
|
|
2804
|
+
- Updated dependencies [697aabc]
|
|
2805
|
+
- Updated dependencies [f0f3cd5]
|
|
2806
|
+
- Updated dependencies [ab856ed]
|
|
2807
|
+
- Updated dependencies [f0f2046]
|
|
2808
|
+
- Updated dependencies [20f3e65]
|
|
2809
|
+
- Updated dependencies [bbba098]
|
|
2810
|
+
- Updated dependencies [87af769]
|
|
2811
|
+
- Updated dependencies [3be720e]
|
|
2812
|
+
- Updated dependencies [80a0ecd]
|
|
2813
|
+
- Updated dependencies [43c0d17]
|
|
2814
|
+
- Updated dependencies [c3df43a]
|
|
2815
|
+
- Updated dependencies [d16d0e9]
|
|
2816
|
+
- Updated dependencies [bbe57fd]
|
|
2817
|
+
- Updated dependencies [272a530]
|
|
2818
|
+
- Updated dependencies [462bafb]
|
|
2819
|
+
- Updated dependencies [1779e8d]
|
|
2820
|
+
- Updated dependencies [9aa2a57]
|
|
2821
|
+
- Updated dependencies [f7fcc2c]
|
|
2822
|
+
- Updated dependencies [f0f4d6c]
|
|
2823
|
+
- Updated dependencies [4128188]
|
|
2824
|
+
- Updated dependencies [b253c4e]
|
|
2825
|
+
- Updated dependencies [78a9c67]
|
|
2826
|
+
- Updated dependencies [2e97c8c]
|
|
2827
|
+
- Updated dependencies [4a7ef0d]
|
|
2828
|
+
- Updated dependencies [4598f6d]
|
|
2829
|
+
- Updated dependencies [dea17b4]
|
|
2830
|
+
- Updated dependencies [89bb77a]
|
|
2831
|
+
- Updated dependencies [06611e4]
|
|
2832
|
+
- Updated dependencies [44152c4]
|
|
2833
|
+
- Updated dependencies [3939545]
|
|
2834
|
+
- Updated dependencies [66abbde]
|
|
2835
|
+
- Updated dependencies [dc3893d]
|
|
2836
|
+
- Updated dependencies [1bbaa16]
|
|
2837
|
+
- Updated dependencies [6ee259a]
|
|
2838
|
+
- Updated dependencies [7649f43]
|
|
2839
|
+
- Updated dependencies [d0f52e4]
|
|
2840
|
+
- Updated dependencies [e708426]
|
|
2841
|
+
- Updated dependencies [33e1697]
|
|
2842
|
+
- Updated dependencies [3b6d53b]
|
|
2843
|
+
- Updated dependencies [e22fa12]
|
|
2844
|
+
- Updated dependencies [1560d46]
|
|
2845
|
+
- Updated dependencies [a017617]
|
|
2846
|
+
- Updated dependencies [276d174]
|
|
2847
|
+
- Updated dependencies [2982ed9]
|
|
2848
|
+
- Updated dependencies [741864f]
|
|
2849
|
+
- Updated dependencies [a8198de]
|
|
2850
|
+
- Updated dependencies [0c789a4]
|
|
2851
|
+
- Updated dependencies [05a49f2]
|
|
2852
|
+
- Updated dependencies [b234a84]
|
|
2853
|
+
- Updated dependencies [a78cd37]
|
|
2854
|
+
- Updated dependencies [5ea623e]
|
|
2855
|
+
- Updated dependencies [4d7d322]
|
|
2856
|
+
- Updated dependencies [dc49246]
|
|
2857
|
+
- Updated dependencies [5eabe86]
|
|
2858
|
+
- Updated dependencies [ca5d671]
|
|
2859
|
+
- Updated dependencies [32bf2d6]
|
|
2860
|
+
- Updated dependencies [ff0c384]
|
|
2861
|
+
- Updated dependencies [af4fb29]
|
|
2862
|
+
- Updated dependencies [c698a81]
|
|
2863
|
+
- Updated dependencies [ff5ef1c]
|
|
2864
|
+
- Updated dependencies [befd40c]
|
|
2865
|
+
- Updated dependencies [905913c]
|
|
2866
|
+
- Updated dependencies [9a97800]
|
|
2867
|
+
- Updated dependencies [6358a2d]
|
|
2868
|
+
- Updated dependencies [6bca0e4]
|
|
2869
|
+
- Updated dependencies [81c0bc4]
|
|
2870
|
+
- Updated dependencies [3c76801]
|
|
2871
|
+
- Updated dependencies [d06fba8]
|
|
2872
|
+
- Updated dependencies [60500cb]
|
|
2873
|
+
- Updated dependencies [2fcefb9]
|
|
2874
|
+
- Updated dependencies [77f846a]
|
|
2875
|
+
- Updated dependencies [bc5870c]
|
|
2876
|
+
- Updated dependencies [b55a346]
|
|
2877
|
+
- Updated dependencies [065bba7]
|
|
2878
|
+
- Updated dependencies [f760064]
|
|
2879
|
+
- Updated dependencies [dd19463]
|
|
2880
|
+
- Updated dependencies [6791717]
|
|
2881
|
+
- Updated dependencies [8ea3bee]
|
|
2882
|
+
- Updated dependencies [100547e]
|
|
2883
|
+
- Updated dependencies [3a58149]
|
|
2884
|
+
- Updated dependencies [6d1c155]
|
|
2885
|
+
- Updated dependencies [d7573b3]
|
|
2886
|
+
- Updated dependencies [bf3edfe]
|
|
2887
|
+
- Updated dependencies [2c8474c]
|
|
2888
|
+
- Updated dependencies [6ce89da]
|
|
2889
|
+
- Updated dependencies [0e05aac]
|
|
2890
|
+
- Updated dependencies [ae61ad4]
|
|
2891
|
+
- Updated dependencies [5aed9e4]
|
|
2892
|
+
- Updated dependencies [83c77dc]
|
|
2893
|
+
- Updated dependencies [3c9fca3]
|
|
2894
|
+
- Updated dependencies [18a8e7d]
|
|
2895
|
+
- Updated dependencies [e7957ab]
|
|
2896
|
+
- Updated dependencies [f7e34ca]
|
|
2897
|
+
- Updated dependencies [e719ebd]
|
|
2898
|
+
- Updated dependencies [516583b]
|
|
2899
|
+
- Updated dependencies [f9e4f91]
|
|
2900
|
+
- Updated dependencies [6ef48b1]
|
|
2901
|
+
- Updated dependencies [58be55e]
|
|
2902
|
+
- Updated dependencies [fa429cf]
|
|
2903
|
+
- Updated dependencies [ed8df3e]
|
|
2904
|
+
- Updated dependencies [fe76ece]
|
|
2905
|
+
- Updated dependencies [8b446f5]
|
|
2906
|
+
- Updated dependencies [8e74b27]
|
|
2907
|
+
- Updated dependencies [7102b20]
|
|
2908
|
+
- Updated dependencies [8ebd57f]
|
|
2909
|
+
- Updated dependencies [968dc1e]
|
|
2910
|
+
- Updated dependencies [9a1fb41]
|
|
2911
|
+
- Updated dependencies [617707a]
|
|
2912
|
+
- Updated dependencies [c40f3b8]
|
|
2913
|
+
- Updated dependencies [58770f3]
|
|
2914
|
+
- Updated dependencies [aefe428]
|
|
2915
|
+
- Updated dependencies [485f096]
|
|
2916
|
+
- Updated dependencies [7357447]
|
|
2917
|
+
- Updated dependencies [199d31b]
|
|
2918
|
+
- Updated dependencies [b655a9d]
|
|
2919
|
+
- Updated dependencies [a865c73]
|
|
2920
|
+
- Updated dependencies [3e01cb5]
|
|
2921
|
+
- Updated dependencies [7138bc1]
|
|
2922
|
+
- Updated dependencies [cef27e2]
|
|
2923
|
+
- Updated dependencies [4e8622b]
|
|
2924
|
+
- Updated dependencies [dffd752]
|
|
2925
|
+
- Updated dependencies [06973aa]
|
|
2926
|
+
- Updated dependencies [50798f3]
|
|
2927
|
+
- Updated dependencies [6a576c9]
|
|
2928
|
+
- Updated dependencies [0b12a33]
|
|
2929
|
+
- Updated dependencies [105f3c5]
|
|
2930
|
+
- Updated dependencies [3ccd9e8]
|
|
2931
|
+
- Updated dependencies [689b979]
|
|
2932
|
+
- Updated dependencies [c70f865]
|
|
2933
|
+
- Updated dependencies [e546222]
|
|
2934
|
+
- Updated dependencies [fd13f52]
|
|
2935
|
+
- Updated dependencies [d7bd274]
|
|
2936
|
+
- Updated dependencies [98c3a74]
|
|
2937
|
+
- Updated dependencies [fffa30d]
|
|
2938
|
+
- Updated dependencies [e4e9557]
|
|
2939
|
+
- Updated dependencies [7a28e1e]
|
|
2940
|
+
- Updated dependencies [ebce5a3]
|
|
2941
|
+
- Updated dependencies [fb336df]
|
|
2942
|
+
- Updated dependencies [6c1b105]
|
|
2943
|
+
- Updated dependencies [4dc80d0]
|
|
2944
|
+
- Updated dependencies [9d9040d]
|
|
2945
|
+
- Updated dependencies [20e317c]
|
|
2946
|
+
- Updated dependencies [0fce2ef]
|
|
2947
|
+
- Updated dependencies [42df928]
|
|
2948
|
+
- Updated dependencies [0e2ddd4]
|
|
2949
|
+
- Updated dependencies [b7479ab]
|
|
2950
|
+
- Updated dependencies [9850c6e]
|
|
2951
|
+
- Updated dependencies [de570cc]
|
|
2952
|
+
- Updated dependencies [b2ea297]
|
|
2953
|
+
- Updated dependencies [5b5a5c3]
|
|
2954
|
+
- Updated dependencies [14582b8]
|
|
2955
|
+
- Updated dependencies [51e144e]
|
|
2956
|
+
- Updated dependencies [19cbf10]
|
|
2957
|
+
- Updated dependencies [b6e83be]
|
|
2958
|
+
- Updated dependencies [7e50e84]
|
|
2959
|
+
- Updated dependencies [ab92940]
|
|
2960
|
+
- Updated dependencies [a691c0b]
|
|
2961
|
+
- Updated dependencies [0b1326d]
|
|
2962
|
+
- Updated dependencies [1e66879]
|
|
2963
|
+
- Updated dependencies [c5200f0]
|
|
2964
|
+
- Updated dependencies [af3861f]
|
|
2965
|
+
- Updated dependencies [2a79e84]
|
|
2966
|
+
- Updated dependencies [2609812]
|
|
2967
|
+
- Updated dependencies [515f171]
|
|
2968
|
+
- Updated dependencies [1f4e029]
|
|
2969
|
+
- Updated dependencies [4f14ad7]
|
|
2970
|
+
- Updated dependencies [258d264]
|
|
2971
|
+
- Updated dependencies [cac64b3]
|
|
2972
|
+
- Updated dependencies [4bb940b]
|
|
2973
|
+
- Updated dependencies [17fbbaf]
|
|
2974
|
+
- Updated dependencies [d8cf1cb]
|
|
2975
|
+
- Updated dependencies [0d1e702]
|
|
2976
|
+
- Updated dependencies [b03ba3a]
|
|
2977
|
+
- Updated dependencies [0068348]
|
|
2978
|
+
- Updated dependencies [641543f]
|
|
2979
|
+
- Updated dependencies [8a44390]
|
|
2980
|
+
- Updated dependencies [8033ad1]
|
|
2981
|
+
- Updated dependencies [fa140b8]
|
|
2982
|
+
- Updated dependencies [71cba28]
|
|
2983
|
+
- Updated dependencies [190fbd0]
|
|
2984
|
+
- Updated dependencies [c00bf28]
|
|
2985
|
+
- Updated dependencies [23705b7]
|
|
2986
|
+
- Updated dependencies [93127bd]
|
|
2987
|
+
- Updated dependencies [f2158ec]
|
|
2988
|
+
- Updated dependencies [759606e]
|
|
2989
|
+
- Updated dependencies [fd8dace]
|
|
2990
|
+
- Updated dependencies [72ffc34]
|
|
2991
|
+
- Updated dependencies [a51fa0c]
|
|
2992
|
+
- Updated dependencies [51f3d8d]
|
|
2993
|
+
- Updated dependencies [bf28341]
|
|
2994
|
+
- Updated dependencies [78cbdb5]
|
|
2995
|
+
- Updated dependencies [b7543a9]
|
|
2996
|
+
- Updated dependencies [6c6cee7]
|
|
2997
|
+
- Updated dependencies [42887e0]
|
|
2998
|
+
- Updated dependencies [f1690d4]
|
|
2999
|
+
- Updated dependencies [83fe6e7]
|
|
3000
|
+
- Updated dependencies [d1ab06f]
|
|
3001
|
+
- Updated dependencies [38a9568]
|
|
3002
|
+
- Updated dependencies [f90b8fb]
|
|
3003
|
+
- Updated dependencies [91783c4]
|
|
3004
|
+
- Updated dependencies [982885d]
|
|
3005
|
+
- Updated dependencies [dba7d84]
|
|
3006
|
+
- Updated dependencies [ca39427]
|
|
3007
|
+
- Updated dependencies [bd09957]
|
|
3008
|
+
- Updated dependencies [5a07e67]
|
|
3009
|
+
- Updated dependencies [2d36552]
|
|
3010
|
+
- Updated dependencies [45d8288]
|
|
3011
|
+
- Updated dependencies [b2437a7]
|
|
3012
|
+
- Updated dependencies [f157423]
|
|
3013
|
+
- Updated dependencies [7a90afd]
|
|
3014
|
+
- Updated dependencies [eddc1dd]
|
|
3015
|
+
- Updated dependencies [490f482]
|
|
3016
|
+
- Updated dependencies [27308c5]
|
|
3017
|
+
- Updated dependencies [8689166]
|
|
3018
|
+
- Updated dependencies [c9327c9]
|
|
3019
|
+
- Updated dependencies [920165d]
|
|
3020
|
+
- Updated dependencies [9101be5]
|
|
3021
|
+
- Updated dependencies [f53a8d0]
|
|
3022
|
+
- Updated dependencies [30266cf]
|
|
3023
|
+
- Updated dependencies [968dc1e]
|
|
3024
|
+
- Updated dependencies [57f9b07]
|
|
3025
|
+
- Updated dependencies [3c73d99]
|
|
3026
|
+
- Updated dependencies [d91aed9]
|
|
3027
|
+
- Updated dependencies [ed71d9e]
|
|
3028
|
+
- Updated dependencies [7776fc2]
|
|
3029
|
+
- Updated dependencies [e76634c]
|
|
3030
|
+
- Updated dependencies [c86185e]
|
|
3031
|
+
- Updated dependencies [fb96ecb]
|
|
3032
|
+
- Updated dependencies [1170ed1]
|
|
3033
|
+
- Updated dependencies [92814db]
|
|
3034
|
+
- Updated dependencies [4d73b07]
|
|
3035
|
+
- @object-ui/plugin-detail@17.7.0
|
|
3036
|
+
- @object-ui/react@17.7.0
|
|
3037
|
+
- @object-ui/core@17.7.0
|
|
3038
|
+
- @object-ui/types@17.7.0
|
|
3039
|
+
- @object-ui/i18n@17.7.0
|
|
3040
|
+
- @object-ui/components@17.7.0
|
|
3041
|
+
- @object-ui/fields@17.7.0
|
|
3042
|
+
- @object-ui/permissions@17.7.0
|
|
3043
|
+
|
|
3044
|
+
## 17.6.0
|
|
3045
|
+
|
|
3046
|
+
### Patch Changes
|
|
3047
|
+
|
|
3048
|
+
- 5edc0c5: `object-gantt` / `object-map` / `object-calendar` no longer drop a sort entry that omits `order`.
|
|
3049
|
+
|
|
3050
|
+
The three blocks each inlined a byte-identical private copy of the `sort` →
|
|
3051
|
+
`$orderby` conversion. That copy required BOTH `field` and `order` on an array
|
|
3052
|
+
entry and silently skipped any entry missing one, so a stored view sorting by
|
|
3053
|
+
`[{ field: 'amount' }]` reached the wire with no ordering at all — the authored
|
|
3054
|
+
sort key was lost, not applied. The same copy already treated the STRING
|
|
3055
|
+
spelling `"amount"` as ascending, so this was an inconsistency between two
|
|
3056
|
+
spellings of one thing rather than deliberate strictness.
|
|
3057
|
+
|
|
3058
|
+
All three now import the shared `convertSortToQueryParams` sink from
|
|
3059
|
+
`@object-ui/core` (introduced by objectstack#7137, already used by
|
|
3060
|
+
`object-timeline` and `record:line_items`), and the private copies are gone —
|
|
3061
|
+
the sink is the repo's only definition. Two behavior changes come with it, both
|
|
3062
|
+
of which make the blocks more faithful to what is already declared rather than
|
|
3063
|
+
more tolerant:
|
|
3064
|
+
|
|
3065
|
+
- An array entry that omits `order` now orders ASCENDING instead of vanishing.
|
|
3066
|
+
That is what `QueryParams.$orderby`'s own member shape
|
|
3067
|
+
(`{ field: string; order?: 'asc' | 'desc' }`) says, and what
|
|
3068
|
+
`@object-ui/data-objectstack`'s `serializeOrderBy` already did with a missing
|
|
3069
|
+
direction.
|
|
3070
|
+
- When nothing orderable was authored, the query now carries no `$orderby` at
|
|
3071
|
+
all instead of an empty object. `{}` is truthy and meant "no ordering" only by
|
|
3072
|
+
accident of the adapter's serializer.
|
|
3073
|
+
|
|
3074
|
+
Reachability, so the size of this is not overstated: `SortConfig.order` and
|
|
3075
|
+
`ElementDataSourceSort.order` are REQUIRED in objectui's own types, so a typed
|
|
3076
|
+
caller could never author the dropped shape. The affected surface is untyped
|
|
3077
|
+
stored view metadata (`ElementSavedView` is a loose record by design) — which is
|
|
3078
|
+
exactly where an order-less entry can arrive today.
|
|
3079
|
+
- 6098ecd: plugin-gantt README: the `onTaskUpdate` drag example no longer writes blank dates on a progress drag.
|
|
3080
|
+
|
|
3081
|
+
`GanttViewProps.onTaskUpdate`'s second parameter is
|
|
3082
|
+
`Partial< Pick< GanttTask, 'title' | 'start' | 'end' | 'progress' > >`
|
|
3083
|
+
(`src/GanttView.tsx:345`), so the destructured `start` / `end` are
|
|
3084
|
+
`Date | undefined`. The README's "Drag-and-drop rescheduling" example destructured
|
|
3085
|
+
them and passed both straight to `save(...)`, under a comment asserting they are
|
|
3086
|
+
always real `Date` objects. Both layers of that assertion were wrong.
|
|
3087
|
+
|
|
3088
|
+
The runtime half is the one that mattered. `onTaskUpdate` is the single exit for
|
|
3089
|
+
every edit path, and the progress grip commits changes with **no** dates at all —
|
|
3090
|
+
`commitTaskUpdates([{ task, changes: { progress: cur.value } }])`
|
|
3091
|
+
(`src/GanttView.tsx:1335`), forwarded verbatim by `onTaskUpdate(task, changes)`
|
|
3092
|
+
(`:1091`). A host that copied the example therefore called
|
|
3093
|
+
`save(task.id, { start: undefined, end: undefined })` on every progress drag,
|
|
3094
|
+
blanking the record's start and end dates. Drag is documented as opt-in via
|
|
3095
|
+
`onTaskUpdate` alone and progress drag needs no extra switch, so the path was
|
|
3096
|
+
reachable by default rather than a corner configuration.
|
|
3097
|
+
|
|
3098
|
+
The example now guards with `if (!start || !end) return;` and its comment states
|
|
3099
|
+
the real shape — that only the keys an edit touched are present, and that the
|
|
3100
|
+
progress grip sends just `{ progress }`. Documentation only; no renderer behavior
|
|
3101
|
+
changed.
|
|
3102
|
+
- bb3fab6: Docs only: `packages/plugin-gantt/README.md` no longer teaches two identifiers the
|
|
3103
|
+
package does not export, nor a task shape it does not produce (objectui#5012).
|
|
3104
|
+
Each README import was judged against the entry module's real export surface
|
|
3105
|
+
(35 names, read from the build product's `dist/index.d.ts`), and every corrected
|
|
3106
|
+
snippet was type-checked against that same build product:
|
|
3107
|
+
|
|
3108
|
+
- **`ganttComponents`** — taught as a components map to iterate over for "manual
|
|
3109
|
+
registration" (`Object.entries(ganttComponents).forEach(...)`). It does not
|
|
3110
|
+
exist anywhere in the package, so the snippet was `Object.entries(undefined)`:
|
|
3111
|
+
a `TypeError` on the first line a reader copied. Registration is *only* the
|
|
3112
|
+
side effect of importing the entry point, which runs the two
|
|
3113
|
+
`ComponentRegistry.register(...)` calls in `src/index.tsx`. The section is
|
|
3114
|
+
replaced by what actually happens: the schema types those calls claim
|
|
3115
|
+
(`object-gantt` → `plugin-gantt:object-gantt`, `gantt` → `view:gantt`, both
|
|
3116
|
+
with a bare-`type` fallback), the package's real export surface, and — for the
|
|
3117
|
+
use case the old snippet was reaching for — registering the exported
|
|
3118
|
+
`ObjectGanttRenderer` under a key of your own.
|
|
3119
|
+
|
|
3120
|
+
- **`GanttSchema`** — taught as the component schema type in the TypeScript
|
|
3121
|
+
section. Pure fiction: zero hits in this package and in `@object-ui/types`
|
|
3122
|
+
(a plain grep appears to find it only as a substring of `ObjectGanttSchema`;
|
|
3123
|
+
under a word boundary it has no hits at all). The authored type does exist
|
|
3124
|
+
under its real name, so the example is rewritten around it rather than
|
|
3125
|
+
dropped: `ObjectGanttSchema` from `@object-ui/types`, which is
|
|
3126
|
+
**record-driven** — `type: 'object-gantt'` plus an object name and the fields
|
|
3127
|
+
to read. It never carried the `tasks` array the old snippet assigned to it.
|
|
3128
|
+
No export was added to make the old name true.
|
|
3129
|
+
|
|
3130
|
+
- **`GanttTask`** — the one real name of the three, and the reason the section
|
|
3131
|
+
still failed to compile. The documented shape had drifted from the exported
|
|
3132
|
+
type on three counts: the label field is `title`, not `name`; `start`/`end`
|
|
3133
|
+
are `Date` objects, not ISO strings; and `color` is a CSS color, not a
|
|
3134
|
+
Tailwind class. Both the "Task Structure" reference block and the typed
|
|
3135
|
+
example now match the exported declaration, and the reference block is pinned
|
|
3136
|
+
against it in both assignment directions so a future drift fails a check
|
|
3137
|
+
instead of compiling as an unrelated local interface.
|
|
3138
|
+
|
|
3139
|
+
No code, types or runtime behaviour change — the diff is one README and this
|
|
3140
|
+
changeset. The correction reaches npm with the package's next publish, which is
|
|
3141
|
+
why it declares a patch: `README.md` is in the package's published `files`.
|
|
3142
|
+
- 449ffe8: Fix the `GanttViewMode` JSDoc to name all five granularities (objectui#5132).
|
|
3143
|
+
|
|
3144
|
+
The comment above `export type GanttViewMode` said "one column per day, week,
|
|
3145
|
+
month, or quarter" while the type itself, `VIEW_MODES`, `NOMINAL_DAYS`
|
|
3146
|
+
(`year: 365.25`), the column builder, the toolbar and the header-band logic
|
|
3147
|
+
have honored a fifth member, `'year'`, all along — `'year'` was fully live,
|
|
3148
|
+
just undocumented. Doc-only change, no behavior difference.
|
|
3149
|
+
- Updated dependencies [88085e3]
|
|
3150
|
+
- Updated dependencies [69251bf]
|
|
3151
|
+
- Updated dependencies [57e668f]
|
|
3152
|
+
- Updated dependencies [516663d]
|
|
3153
|
+
- Updated dependencies [41ac1b7]
|
|
3154
|
+
- Updated dependencies [1eaf0a1]
|
|
3155
|
+
- Updated dependencies [7c297e3]
|
|
3156
|
+
- Updated dependencies [a09bc33]
|
|
3157
|
+
- Updated dependencies [460c4d0]
|
|
3158
|
+
- Updated dependencies [0ae27f7]
|
|
3159
|
+
- Updated dependencies [2533ec5]
|
|
3160
|
+
- Updated dependencies [78c0f9a]
|
|
3161
|
+
- Updated dependencies [bbe8b86]
|
|
3162
|
+
- Updated dependencies [8477be5]
|
|
3163
|
+
- Updated dependencies [279fb13]
|
|
3164
|
+
- Updated dependencies [2e82ab2]
|
|
3165
|
+
- Updated dependencies [ad07b65]
|
|
3166
|
+
- Updated dependencies [41f498b]
|
|
3167
|
+
- Updated dependencies [ef0d150]
|
|
3168
|
+
- Updated dependencies [f34226e]
|
|
3169
|
+
- Updated dependencies [564b605]
|
|
3170
|
+
- Updated dependencies [e1d4251]
|
|
3171
|
+
- Updated dependencies [40d3a33]
|
|
3172
|
+
- Updated dependencies [8b9dc62]
|
|
3173
|
+
- Updated dependencies [1184192]
|
|
3174
|
+
- Updated dependencies [a2a9747]
|
|
3175
|
+
- Updated dependencies [65e88e6]
|
|
3176
|
+
- Updated dependencies [a1609a6]
|
|
3177
|
+
- Updated dependencies [53f23bc]
|
|
3178
|
+
- Updated dependencies [c4533dc]
|
|
3179
|
+
- Updated dependencies [be60815]
|
|
3180
|
+
- Updated dependencies [37f6844]
|
|
3181
|
+
- Updated dependencies [93de4f6]
|
|
3182
|
+
- Updated dependencies [2b50261]
|
|
3183
|
+
- Updated dependencies [384f30d]
|
|
3184
|
+
- Updated dependencies [ac600e5]
|
|
3185
|
+
- Updated dependencies [97fba31]
|
|
3186
|
+
- Updated dependencies [232f61a]
|
|
3187
|
+
- Updated dependencies [d374caf]
|
|
3188
|
+
- Updated dependencies [5673576]
|
|
3189
|
+
- Updated dependencies [c1ef923]
|
|
3190
|
+
- Updated dependencies [911ceaa]
|
|
3191
|
+
- Updated dependencies [98eab36]
|
|
3192
|
+
- Updated dependencies [af5e292]
|
|
3193
|
+
- Updated dependencies [3fbbea1]
|
|
3194
|
+
- Updated dependencies [0bffb18]
|
|
3195
|
+
- Updated dependencies [800f455]
|
|
3196
|
+
- Updated dependencies [5458414]
|
|
3197
|
+
- Updated dependencies [3241559]
|
|
3198
|
+
- Updated dependencies [7f96b10]
|
|
3199
|
+
- Updated dependencies [167ec42]
|
|
3200
|
+
- Updated dependencies [616a2a5]
|
|
3201
|
+
- Updated dependencies [6c68b13]
|
|
3202
|
+
- Updated dependencies [0046d8f]
|
|
3203
|
+
- Updated dependencies [f1d4748]
|
|
3204
|
+
- Updated dependencies [bea374e]
|
|
3205
|
+
- Updated dependencies [b1119ec]
|
|
3206
|
+
- Updated dependencies [5607092]
|
|
3207
|
+
- Updated dependencies [9f23d2b]
|
|
3208
|
+
- Updated dependencies [578e025]
|
|
3209
|
+
- Updated dependencies [af025ee]
|
|
3210
|
+
- Updated dependencies [d109a4d]
|
|
3211
|
+
- Updated dependencies [598c89a]
|
|
3212
|
+
- Updated dependencies [4a0bd17]
|
|
3213
|
+
- Updated dependencies [b8b9af4]
|
|
3214
|
+
- Updated dependencies [31676be]
|
|
3215
|
+
- Updated dependencies [8c0d52e]
|
|
3216
|
+
- Updated dependencies [aff10e2]
|
|
3217
|
+
- Updated dependencies [70a774b]
|
|
3218
|
+
- Updated dependencies [7dd93c0]
|
|
3219
|
+
- Updated dependencies [229b17e]
|
|
3220
|
+
- Updated dependencies [9ce096f]
|
|
3221
|
+
- Updated dependencies [e05db88]
|
|
3222
|
+
- Updated dependencies [7458a41]
|
|
3223
|
+
- Updated dependencies [ad13d63]
|
|
3224
|
+
- Updated dependencies [5ffcc14]
|
|
3225
|
+
- Updated dependencies [d971e51]
|
|
3226
|
+
- Updated dependencies [97abb24]
|
|
3227
|
+
- Updated dependencies [deb157a]
|
|
3228
|
+
- Updated dependencies [9c60144]
|
|
3229
|
+
- Updated dependencies [e7747f1]
|
|
3230
|
+
- Updated dependencies [d2ce342]
|
|
3231
|
+
- Updated dependencies [9695da7]
|
|
3232
|
+
- Updated dependencies [ac2f332]
|
|
3233
|
+
- Updated dependencies [a777058]
|
|
3234
|
+
- Updated dependencies [75444e3]
|
|
3235
|
+
- Updated dependencies [58b8346]
|
|
3236
|
+
- Updated dependencies [2d0bd16]
|
|
3237
|
+
- Updated dependencies [a9e17b4]
|
|
3238
|
+
- Updated dependencies [b8ce7dc]
|
|
3239
|
+
- Updated dependencies [dad51e5]
|
|
3240
|
+
- Updated dependencies [1c9c342]
|
|
3241
|
+
- Updated dependencies [787c738]
|
|
3242
|
+
- Updated dependencies [8396656]
|
|
3243
|
+
- Updated dependencies [dbbd38a]
|
|
3244
|
+
- Updated dependencies [8871c14]
|
|
3245
|
+
- Updated dependencies [93fe362]
|
|
3246
|
+
- Updated dependencies [dfc6975]
|
|
3247
|
+
- Updated dependencies [3cf4de0]
|
|
3248
|
+
- Updated dependencies [c9dc811]
|
|
3249
|
+
- Updated dependencies [144ef9b]
|
|
3250
|
+
- Updated dependencies [138ab04]
|
|
3251
|
+
- Updated dependencies [a0b9e91]
|
|
3252
|
+
- Updated dependencies [99bd015]
|
|
3253
|
+
- Updated dependencies [21e4585]
|
|
3254
|
+
- @object-ui/types@17.6.0
|
|
3255
|
+
- @object-ui/fields@17.6.0
|
|
3256
|
+
- @object-ui/i18n@17.6.0
|
|
3257
|
+
- @object-ui/react@17.6.0
|
|
3258
|
+
- @object-ui/plugin-detail@17.6.0
|
|
3259
|
+
- @object-ui/components@17.6.0
|
|
3260
|
+
- @object-ui/core@17.6.0
|
|
3261
|
+
|
|
3
3262
|
## 17.5.0
|
|
4
3263
|
|
|
5
3264
|
### Patch Changes
|