@object-ui/plugin-calendar 17.3.0 → 17.6.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 +594 -0
- package/README.md +133 -48
- package/dist/CalendarView.d.ts +24 -4
- package/dist/CalendarView.d.ts.map +1 -1
- package/dist/ObjectCalendar.d.ts +18 -2
- package/dist/ObjectCalendar.d.ts.map +1 -1
- package/dist/index.d.ts +27 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +338 -248
- package/dist/index.umd.cjs +1 -1
- package/package.json +12 -12
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,594 @@
|
|
|
1
1
|
# @object-ui/plugin-calendar
|
|
2
2
|
|
|
3
|
+
## 17.6.0
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 5edc0c5: `object-gantt` / `object-map` / `object-calendar` no longer drop a sort entry that omits `order`.
|
|
8
|
+
|
|
9
|
+
The three blocks each inlined a byte-identical private copy of the `sort` →
|
|
10
|
+
`$orderby` conversion. That copy required BOTH `field` and `order` on an array
|
|
11
|
+
entry and silently skipped any entry missing one, so a stored view sorting by
|
|
12
|
+
`[{ field: 'amount' }]` reached the wire with no ordering at all — the authored
|
|
13
|
+
sort key was lost, not applied. The same copy already treated the STRING
|
|
14
|
+
spelling `"amount"` as ascending, so this was an inconsistency between two
|
|
15
|
+
spellings of one thing rather than deliberate strictness.
|
|
16
|
+
|
|
17
|
+
All three now import the shared `convertSortToQueryParams` sink from
|
|
18
|
+
`@object-ui/core` (introduced by objectstack#7137, already used by
|
|
19
|
+
`object-timeline` and `record:line_items`), and the private copies are gone —
|
|
20
|
+
the sink is the repo's only definition. Two behavior changes come with it, both
|
|
21
|
+
of which make the blocks more faithful to what is already declared rather than
|
|
22
|
+
more tolerant:
|
|
23
|
+
|
|
24
|
+
- An array entry that omits `order` now orders ASCENDING instead of vanishing.
|
|
25
|
+
That is what `QueryParams.$orderby`'s own member shape
|
|
26
|
+
(`{ field: string; order?: 'asc' | 'desc' }`) says, and what
|
|
27
|
+
`@object-ui/data-objectstack`'s `serializeOrderBy` already did with a missing
|
|
28
|
+
direction.
|
|
29
|
+
- When nothing orderable was authored, the query now carries no `$orderby` at
|
|
30
|
+
all instead of an empty object. `{}` is truthy and meant "no ordering" only by
|
|
31
|
+
accident of the adapter's serializer.
|
|
32
|
+
|
|
33
|
+
Reachability, so the size of this is not overstated: `SortConfig.order` and
|
|
34
|
+
`ElementDataSourceSort.order` are REQUIRED in objectui's own types, so a typed
|
|
35
|
+
caller could never author the dropped shape. The affected surface is untyped
|
|
36
|
+
stored view metadata (`ElementSavedView` is a loose record by design) — which is
|
|
37
|
+
exactly where an order-less entry can arrive today.
|
|
38
|
+
- 1cd46bd: Correct the published "works with the `api` data provider" claim for plugin-calendar,
|
|
39
|
+
which `ObjectCalendar` does not implement. `data.provider: 'api'` reaches
|
|
40
|
+
`console.warn('API provider not yet implemented for ObjectCalendar')`
|
|
41
|
+
(`ObjectCalendar.tsx:294-296`), sets the record set to empty and renders a calendar
|
|
42
|
+
with no events; `endpoint` and `method` have no read point anywhere in
|
|
43
|
+
`packages/plugin-calendar/src`, and the package never resolves an `ApiDataSource`.
|
|
44
|
+
|
|
45
|
+
Four publication sites corrected:
|
|
46
|
+
|
|
47
|
+
- `packages/plugin-calendar/src/ObjectCalendar.tsx:22` (file-header JSDoc): "Works
|
|
48
|
+
with object/api/value data providers" → "Works with object/value data providers".
|
|
49
|
+
- `content/docs/plugins/plugin-calendar.mdx:178` (Features list): "Works seamlessly
|
|
50
|
+
with object/api/value data providers" → "Works seamlessly with object/value data
|
|
51
|
+
providers".
|
|
52
|
+
- `content/docs/plugins/index.md:168` (Calendar Plugin section): "Works with
|
|
53
|
+
object/api/value providers" → "Works with object/value providers".
|
|
54
|
+
- `content/docs/plugins/plugin-calendar.mdx` "API Provider" section: the
|
|
55
|
+
copy-pasteable `provider: 'api'` + `endpoint` + `method` recipe is replaced by a
|
|
56
|
+
statement of the real behaviour, matching the merged plugin-map wording.
|
|
57
|
+
|
|
58
|
+
The identical sentence published for **plugin-gantt** is left untouched: there
|
|
59
|
+
`provider: 'api'` is genuinely implemented (`ObjectGantt.tsx:442-445` resolves a real
|
|
60
|
+
`ApiDataSource` through `resolveDataSource`, and `:1155` / `:1495` route write-backs
|
|
61
|
+
through it), so the gantt claim is true and this is a shared sentence, not a shared
|
|
62
|
+
defect.
|
|
63
|
+
|
|
64
|
+
Implementing the `api` provider for calendar is capability expansion and is explicitly
|
|
65
|
+
out of scope here, the same line objectui#5163 drew for plugin-map. No runtime
|
|
66
|
+
behaviour changes: a source comment and docs prose only.
|
|
67
|
+
- e7c5a80: `plugin-calendar`'s README no longer documents imports the package does not export.
|
|
68
|
+
|
|
69
|
+
Three defects in `packages/plugin-calendar/README.md`, all of which made a
|
|
70
|
+
copy-pasted snippet fail to compile. Checked by taking the package's real export
|
|
71
|
+
name set off `src/index.tsx` through the TypeScript compiler API and cross-checking
|
|
72
|
+
every import statement in the README against it — including multi-line import
|
|
73
|
+
blocks, which a single-line grep cannot see.
|
|
74
|
+
|
|
75
|
+
1. **Fabricated (deleted).** A "Manual Registration" section taught
|
|
76
|
+
`import { calendarComponents } from '@object-ui/plugin-calendar'` followed by
|
|
77
|
+
`Object.entries(calendarComponents).forEach(register)`. There is no
|
|
78
|
+
`calendarComponents` export and never was — the identifier does not occur
|
|
79
|
+
anywhere in `src/`. Copying it gave `undefined`, and `Object.entries(undefined)`
|
|
80
|
+
throws a `TypeError`, so the section could not run at all. Registration in this
|
|
81
|
+
package is purely a side effect of importing the entry point, so there is no
|
|
82
|
+
components map to iterate. The fabricated section is replaced by what the
|
|
83
|
+
side-effect import actually claims (the three registered schema types and their
|
|
84
|
+
namespaced keys) and by the package's real export surface — `ObjectCalendar`,
|
|
85
|
+
`CalendarView`, `ObjectCalendarRenderer` plus the component prop types. Hosts
|
|
86
|
+
that want their own registry key are shown the honest way to get one:
|
|
87
|
+
registering the exported `ObjectCalendarRenderer` under it.
|
|
88
|
+
|
|
89
|
+
2. **Wrong import path (path corrected).** `CalendarViewSchema` was imported from
|
|
90
|
+
`@object-ui/plugin-calendar`. The type is real but belongs to `@object-ui/types`;
|
|
91
|
+
this package imports it and does not re-export it, so the documented import was
|
|
92
|
+
a "no exported member" error. The path now points at `@object-ui/types`.
|
|
93
|
+
|
|
94
|
+
3. **Name collision (import re-pointed).** Correcting (2) alone still left the
|
|
95
|
+
snippet uncompilable: the same example imported `CalendarEvent` from
|
|
96
|
+
`@object-ui/plugin-calendar`, which is a real export but a *different* type —
|
|
97
|
+
the `CalendarView` component's runtime shape (`id: string | number`,
|
|
98
|
+
`start: Date`), not the authored JSON shape (`id: string`, `start: string | Date`)
|
|
99
|
+
that `CalendarViewSchema.events` requires and that the README's own "Calendar
|
|
100
|
+
Event Structure" section documents. The example's ISO-string values therefore did
|
|
101
|
+
not typecheck, and the plugin's event type was not assignable to the schema's.
|
|
102
|
+
Both authored types now come from `@object-ui/types`, and the two same-named
|
|
103
|
+
types are documented side by side so the next reader does not re-pick the wrong one.
|
|
104
|
+
|
|
105
|
+
No exports were added to make the README true — the docs were moved to the code,
|
|
106
|
+
not the reverse.
|
|
107
|
+
- 2165d88: Rename four component-props types off the names `@objectstack/spec` starts owning in
|
|
108
|
+
17.0.0, keeping the old spellings as deprecated aliases. No behaviour changes and no
|
|
109
|
+
importer breaks.
|
|
110
|
+
|
|
111
|
+
`@objectstack/spec/ui` exports `ObjectCalendarProps`, `ObjectFormProps`, `ObjectGridProps`
|
|
112
|
+
and `ObjectKanbanProps` from 17.0.0, where each is the AUTHORED props document of the
|
|
113
|
+
matching element — a serialisable authoring surface (`z.input< typeof
|
|
114
|
+
ObjectGridPropsSchema >`). The same-named interfaces here are the RENDERERS' props: a live
|
|
115
|
+
`dataSource`, records pre-fetched by a parent, and the host callbacks. Two different things
|
|
116
|
+
under one word, so the local ones are renamed rather than derived, following the split this
|
|
117
|
+
repo already made for `PageHeaderProps` -> `PageHeaderComponentProps` and the
|
|
118
|
+
`Record*ComponentProps` family in `@object-ui/types`:
|
|
119
|
+
|
|
120
|
+
| package | new name | old name |
|
|
121
|
+
|---|---|---|
|
|
122
|
+
| `@object-ui/plugin-calendar` | `ObjectCalendarComponentProps` | `ObjectCalendarProps` |
|
|
123
|
+
| `@object-ui/plugin-form` | `ObjectFormComponentProps` | `ObjectFormProps` |
|
|
124
|
+
| `@object-ui/plugin-grid` | `ObjectGridComponentProps` | `ObjectGridProps` |
|
|
125
|
+
| `@object-ui/plugin-kanban` | `ObjectKanbanComponentProps` | `ObjectKanbanProps` |
|
|
126
|
+
|
|
127
|
+
Every old name is still exported from its package barrel as a `@deprecated` alias denoting
|
|
128
|
+
the SAME type, pinned per package by `spec-symbol-4650.test.ts`, so existing imports keep
|
|
129
|
+
compiling. New code should use the `ComponentProps` spelling.
|
|
130
|
+
|
|
131
|
+
`@object-ui/app-shell` carries no API change: its `SECRET_MASK` — the ADR-0100 credential
|
|
132
|
+
read mask, which 17.0.0 moves into `@objectstack/spec/data` — is renamed to
|
|
133
|
+
`OBJECTUI_SECRET_MASK` at its declaration in `views/metadata-admin/widgets.tsx`. That
|
|
134
|
+
constant is package-internal and is not re-exported from the barrel, so nothing published
|
|
135
|
+
changes; the rename exists so the local copy cannot be read as the spec's own definition
|
|
136
|
+
while this repo is still pinned below the release that exports it.
|
|
137
|
+
- Updated dependencies [88085e3]
|
|
138
|
+
- Updated dependencies [69251bf]
|
|
139
|
+
- Updated dependencies [57e668f]
|
|
140
|
+
- Updated dependencies [516663d]
|
|
141
|
+
- Updated dependencies [41ac1b7]
|
|
142
|
+
- Updated dependencies [1eaf0a1]
|
|
143
|
+
- Updated dependencies [7c297e3]
|
|
144
|
+
- Updated dependencies [a09bc33]
|
|
145
|
+
- Updated dependencies [460c4d0]
|
|
146
|
+
- Updated dependencies [0ae27f7]
|
|
147
|
+
- Updated dependencies [2533ec5]
|
|
148
|
+
- Updated dependencies [78c0f9a]
|
|
149
|
+
- Updated dependencies [bbe8b86]
|
|
150
|
+
- Updated dependencies [8477be5]
|
|
151
|
+
- Updated dependencies [279fb13]
|
|
152
|
+
- Updated dependencies [2e82ab2]
|
|
153
|
+
- Updated dependencies [ad07b65]
|
|
154
|
+
- Updated dependencies [41f498b]
|
|
155
|
+
- Updated dependencies [ef0d150]
|
|
156
|
+
- Updated dependencies [f34226e]
|
|
157
|
+
- Updated dependencies [564b605]
|
|
158
|
+
- Updated dependencies [e1d4251]
|
|
159
|
+
- Updated dependencies [40d3a33]
|
|
160
|
+
- Updated dependencies [8b9dc62]
|
|
161
|
+
- Updated dependencies [1184192]
|
|
162
|
+
- Updated dependencies [a2a9747]
|
|
163
|
+
- Updated dependencies [65e88e6]
|
|
164
|
+
- Updated dependencies [a1609a6]
|
|
165
|
+
- Updated dependencies [53f23bc]
|
|
166
|
+
- Updated dependencies [c4533dc]
|
|
167
|
+
- Updated dependencies [be60815]
|
|
168
|
+
- Updated dependencies [37f6844]
|
|
169
|
+
- Updated dependencies [93de4f6]
|
|
170
|
+
- Updated dependencies [2b50261]
|
|
171
|
+
- Updated dependencies [384f30d]
|
|
172
|
+
- Updated dependencies [ac600e5]
|
|
173
|
+
- Updated dependencies [97fba31]
|
|
174
|
+
- Updated dependencies [232f61a]
|
|
175
|
+
- Updated dependencies [d374caf]
|
|
176
|
+
- Updated dependencies [5673576]
|
|
177
|
+
- Updated dependencies [c1ef923]
|
|
178
|
+
- Updated dependencies [911ceaa]
|
|
179
|
+
- Updated dependencies [98eab36]
|
|
180
|
+
- Updated dependencies [af5e292]
|
|
181
|
+
- Updated dependencies [3fbbea1]
|
|
182
|
+
- Updated dependencies [0bffb18]
|
|
183
|
+
- Updated dependencies [800f455]
|
|
184
|
+
- Updated dependencies [5458414]
|
|
185
|
+
- Updated dependencies [3241559]
|
|
186
|
+
- Updated dependencies [7f96b10]
|
|
187
|
+
- Updated dependencies [167ec42]
|
|
188
|
+
- Updated dependencies [616a2a5]
|
|
189
|
+
- Updated dependencies [6c68b13]
|
|
190
|
+
- Updated dependencies [0046d8f]
|
|
191
|
+
- Updated dependencies [f1d4748]
|
|
192
|
+
- Updated dependencies [bea374e]
|
|
193
|
+
- Updated dependencies [b1119ec]
|
|
194
|
+
- Updated dependencies [5607092]
|
|
195
|
+
- Updated dependencies [9f23d2b]
|
|
196
|
+
- Updated dependencies [578e025]
|
|
197
|
+
- Updated dependencies [af025ee]
|
|
198
|
+
- Updated dependencies [d109a4d]
|
|
199
|
+
- Updated dependencies [598c89a]
|
|
200
|
+
- Updated dependencies [4a0bd17]
|
|
201
|
+
- Updated dependencies [b8b9af4]
|
|
202
|
+
- Updated dependencies [31676be]
|
|
203
|
+
- Updated dependencies [8c0d52e]
|
|
204
|
+
- Updated dependencies [aff10e2]
|
|
205
|
+
- Updated dependencies [70a774b]
|
|
206
|
+
- Updated dependencies [7dd93c0]
|
|
207
|
+
- Updated dependencies [229b17e]
|
|
208
|
+
- Updated dependencies [9ce096f]
|
|
209
|
+
- Updated dependencies [e05db88]
|
|
210
|
+
- Updated dependencies [7458a41]
|
|
211
|
+
- Updated dependencies [ad13d63]
|
|
212
|
+
- Updated dependencies [5ffcc14]
|
|
213
|
+
- Updated dependencies [d971e51]
|
|
214
|
+
- Updated dependencies [97abb24]
|
|
215
|
+
- Updated dependencies [deb157a]
|
|
216
|
+
- Updated dependencies [9c60144]
|
|
217
|
+
- Updated dependencies [e7747f1]
|
|
218
|
+
- Updated dependencies [d2ce342]
|
|
219
|
+
- Updated dependencies [9695da7]
|
|
220
|
+
- Updated dependencies [ac2f332]
|
|
221
|
+
- Updated dependencies [a777058]
|
|
222
|
+
- Updated dependencies [75444e3]
|
|
223
|
+
- Updated dependencies [58b8346]
|
|
224
|
+
- Updated dependencies [2d0bd16]
|
|
225
|
+
- Updated dependencies [a9e17b4]
|
|
226
|
+
- Updated dependencies [b8ce7dc]
|
|
227
|
+
- Updated dependencies [dad51e5]
|
|
228
|
+
- Updated dependencies [1c9c342]
|
|
229
|
+
- Updated dependencies [787c738]
|
|
230
|
+
- Updated dependencies [8396656]
|
|
231
|
+
- Updated dependencies [dbbd38a]
|
|
232
|
+
- Updated dependencies [8871c14]
|
|
233
|
+
- Updated dependencies [93fe362]
|
|
234
|
+
- Updated dependencies [dfc6975]
|
|
235
|
+
- Updated dependencies [3cf4de0]
|
|
236
|
+
- Updated dependencies [c9dc811]
|
|
237
|
+
- Updated dependencies [144ef9b]
|
|
238
|
+
- Updated dependencies [138ab04]
|
|
239
|
+
- Updated dependencies [a0b9e91]
|
|
240
|
+
- Updated dependencies [99bd015]
|
|
241
|
+
- Updated dependencies [21e4585]
|
|
242
|
+
- @object-ui/types@17.6.0
|
|
243
|
+
- @object-ui/fields@17.6.0
|
|
244
|
+
- @object-ui/i18n@17.6.0
|
|
245
|
+
- @object-ui/react@17.6.0
|
|
246
|
+
- @object-ui/plugin-detail@17.6.0
|
|
247
|
+
- @object-ui/components@17.6.0
|
|
248
|
+
- @object-ui/core@17.6.0
|
|
249
|
+
- @object-ui/mobile@17.6.0
|
|
250
|
+
|
|
251
|
+
## 17.5.0
|
|
252
|
+
|
|
253
|
+
### Minor Changes
|
|
254
|
+
|
|
255
|
+
- 515328f: `calendar-view` has no declared-but-inert inputs left: `allowCreate` works, `colorMapping` is retired (objectui#4454, objectui#4493)
|
|
256
|
+
|
|
257
|
+
Two of this widget's registry inputs were declared and read by nobody — the one
|
|
258
|
+
state ADR-0049's enforce-or-remove framing says must not persist. Measurement
|
|
259
|
+
answered them in opposite directions.
|
|
260
|
+
|
|
261
|
+
**`allowCreate` is enforced.** The handler it would gate was already built in the
|
|
262
|
+
renderer — `handleAddClick`, dispatching `{ type: 'create', payload: {} }` on the
|
|
263
|
+
widget's own `onAction` channel — and simply never passed. `CalendarView` renders
|
|
264
|
+
its **New event** button behind `onAddClick`, so on the SDUI path that button
|
|
265
|
+
never existed and the handler was unreachable: both halves of one feature were
|
|
266
|
+
present and had never been introduced to each other. An authored
|
|
267
|
+
`allowCreate: true` now supplies the handler to `onAddClick`, and clicking the
|
|
268
|
+
button dispatches the create action.
|
|
269
|
+
|
|
270
|
+
The wiring goes through the declared `onAddClick` hatch rather than around it via
|
|
271
|
+
a second prop. That key is already one of the renderer's function-typed host
|
|
272
|
+
hatches (objectui#4453), so a React host could switch the affordance on today and
|
|
273
|
+
that path is untouched — a host handler still replaces the action dispatch rather
|
|
274
|
+
than running alongside it, the same precedence `onEventClick` keeps. An authored
|
|
275
|
+
`onAddClick` string is still dropped, so turning the affordance on cannot
|
|
276
|
+
reintroduce that card's uncaught handler crash.
|
|
277
|
+
|
|
278
|
+
Only the boolean `true` turns it on. Absent, `false`, and the off-type spellings
|
|
279
|
+
JSON invites (`'true'`, `1`, an object) all resolve to the absent-key answer, which
|
|
280
|
+
on this prop is literally what makes the button not render. Every node that never
|
|
281
|
+
authored the key renders exactly as before.
|
|
282
|
+
|
|
283
|
+
**`colorMapping` is removed.** It had no read site anywhere: the renderer's event
|
|
284
|
+
mapping takes the colour straight off the record (`color: record[colorField]`),
|
|
285
|
+
and `CalendarView` resolves a colour from `event.color`. An author who wrote the
|
|
286
|
+
documented `colorMapping: { meeting: 'blue' }` got no mapping, no warning and no
|
|
287
|
+
error — the raw field value was used as the colour, which for a picklist value
|
|
288
|
+
like `meeting` is not a colour at all. It is retired rather than implemented
|
|
289
|
+
because no measured app authors it, and a capability with no pull behind it is not
|
|
290
|
+
worth building. The `content/docs/plugins/plugin-calendar.mdx` schema-API line
|
|
291
|
+
documenting it is removed in the same change.
|
|
292
|
+
|
|
293
|
+
Retiring it is not a behaviour change — the key never had a read site to lose. It
|
|
294
|
+
becomes an ordinary unknown authored key, dropped at the renderer boundary like
|
|
295
|
+
any other.
|
|
296
|
+
|
|
297
|
+
**Grade.** Minor, not patch: measured both ways against the emitted bundle, the
|
|
298
|
+
published registry surface moves — `calendar-view`'s `inputs` array loses a member
|
|
299
|
+
(`colorMapping`: 1 emitted declaration before, 0 after), so the authorable
|
|
300
|
+
vocabulary this widget publishes narrows by one key, and a second declared input
|
|
301
|
+
starts producing a user-visible affordance. The emitted `.d.ts` is byte-identical
|
|
302
|
+
either way; the vocabulary lives in the runtime registry metadata, not in the type
|
|
303
|
+
surface.
|
|
304
|
+
|
|
305
|
+
### Patch Changes
|
|
306
|
+
|
|
307
|
+
- 395e154: authored ISO `currentDate` reaches the calendar as a `Date`; unparseable input falls back to the default instead of crashing
|
|
308
|
+
|
|
309
|
+
`plugin-calendar:calendar-view` declares the input `{ name: 'currentDate', type: 'string', description: 'ISO date string for initial calendar date' }`, while `CalendarViewProps.currentDate` is a `Date`. Nothing converted between the two: the authored string rode the renderer's trailing `{...props}` spread into `useState`'s initial `selectedDate`, and the header's `selectedDate.toLocaleDateString(…)` threw `selectedDate.toLocaleDateString is not a function` — the error boundary instead of the calendar. Writing the one spelling the input documents was the one spelling that could not work, and there was no correct authored value at all, since `type: 'string'` cannot express a `Date`.
|
|
310
|
+
|
|
311
|
+
The renderer now owes the conversion, at its own boundary. `currentDate` is destructured out of the incoming props so the spread can no longer carry the raw value (the consumed-key pattern from the `events` collision fix), parsed once per authored value, and passed to `CalendarView` as the `Date` its prop type declares. Off-spec input — an unparseable string, or any non-string that is not already a `Date` — gets the same answer as an absent key: the component's own default date. An `Invalid Date` is never manufactured and handed on; it does not throw, it renders the literal text "Invalid Date" into the header and the date picker, which is a silent wrong answer where the default is a usable calendar.
|
|
312
|
+
|
|
313
|
+
A `Date` instance passes through untouched, so a React host handing the widget its real declared prop type is unaffected.
|
|
314
|
+
|
|
315
|
+
- c5756ff: `calendar-view` consumes or declares every prop it forwards — an authored `onEventClick` can no longer crash a click
|
|
316
|
+
|
|
317
|
+
`calendar-view`'s renderer ended in `<CalendarView … {...props} />`, where `props` was everything `SchemaRenderer` hands a registered widget: the node's authored keys, the contents of its `props` container, the injected runtime props, and a host's trailing props. That is an unbounded set spread onto a component whose props are a closed list, and the worst collision on it was `onEventClick`: an authored `onEventClick: 'NOT-A-FUNCTION'` rendered a perfectly normal calendar and then threw `onEventClick is not a function` on the first click. React does not route event-handler errors to `SchemaErrorBoundary`, so it surfaced as an uncaught window error — the calendar kept looking fine while its click handling was dead. Both authoring channels reached it, the node's own key and a `props: { onEventClick }` container.
|
|
318
|
+
|
|
319
|
+
The forward set is now exactly `CalendarViewProps`, each key resolved to the type that prop declares; nothing else reaches the component. Declared registry inputs are consumed (`view` narrowed to its declared enum, `currentDate` parsed, `className` forwarded, the field-name inputs read off the schema); `CalendarView`'s callbacks are a declared, function-typed host escape hatch — a host-passed function is forwarded exactly as before, and a non-function value, which is all an SDUI author writing JSON can produce, is dropped, the same answer as an absent key; every other key is dropped.
|
|
320
|
+
|
|
321
|
+
Fixed with it, from the same boundary: an authored `onAction` string killed the same click through the renderer's own action channel; an authored `onDateClick` / `onNavigate` / `onViewChange` / `onEventDrop` / `onTimeRangeSelect` / `onAddClick` string killed its own gesture the same way; an authored `locale` that `Intl` rejects (`en_US`, the underscore spelling) took the whole render down to the error boundary with `RangeError: Incorrect locale information provided`; and an off-enum `view` (`agenda`) rendered a header with no calendar under it at all, where it now falls back to the component's `month` default.
|
|
322
|
+
|
|
323
|
+
No capability is removed and no authorable surface is added: every host path that worked keeps working, including the handler precedence the old spread produced (a host handler replaces the `onAction` dispatch rather than running alongside it). The package's emitted `.d.ts` is unchanged.
|
|
324
|
+
|
|
325
|
+
- 49b9de6: fix(plugin-calendar): authoring `events` on a `calendar-view` node no longer takes the calendar down
|
|
326
|
+
|
|
327
|
+
`calendar-view`'s renderer computed a `CalendarEvent[]` from `schema.data`, passed it
|
|
328
|
+
as `events={…}`, then spread the remaining props **after** it. `SchemaRenderer`
|
|
329
|
+
forwards a node's `events` key as a plain prop, so a node authoring `events` — the
|
|
330
|
+
ordinary SDUI action metadata, legal on any node — landed its `{ onClick: [...] }`
|
|
331
|
+
object on the `events` array prop: `CalendarView` iterated it and threw
|
|
332
|
+
`events is not iterable`, and a spec-legal node rendered an error card instead of its
|
|
333
|
+
calendar.
|
|
334
|
+
|
|
335
|
+
The authored key is now destructured out before the spread, so the computed array
|
|
336
|
+
always wins. This also closes the quiet half of the same collision: an authored
|
|
337
|
+
`events` **array** never threw — it silently replaced the calendar's contents with
|
|
338
|
+
itself.
|
|
339
|
+
|
|
340
|
+
No capability is removed. Nothing in the renderer layer consumes a node's `events`
|
|
341
|
+
key (the action path is `properties.action` through `ActionRunner`), and the
|
|
342
|
+
component's own `onAction` channel is unaffected.
|
|
343
|
+
|
|
344
|
+
- 3e579d6: `object-calendar` / `view:calendar`: the renderer now consumes or declares every prop it forwards, instead of spreading the authored node into `ObjectCalendar`
|
|
345
|
+
|
|
346
|
+
One shared renderer serves both registrations, and it ended in a raw spread of everything `SchemaRenderer` hands a widget — the node's authored keys, its `props` container, the injected runtime props and a host's trailing props — onto a component whose props are a closed list. `ObjectCalendarProps` declares eight callbacks and a `locale`, so an authored value under any of those names landed on the declared prop, and an SDUI author writing JSON can never produce a function:
|
|
347
|
+
|
|
348
|
+
- an authored `onDateClick` string threw `onDateClick is not a function` on an empty day-cell click, and an authored `onNavigate` string threw on **Next period** — both as _uncaught_ window errors, because React does not route event-handler errors to `SchemaErrorBoundary`, so the calendar kept looking fine while that gesture was dead;
|
|
349
|
+
- an authored `locale: 'en_US'` (the underscore spelling a producer writes by accident) threw `RangeError: Incorrect locale information provided` out of render and took the whole calendar to the error boundary.
|
|
350
|
+
|
|
351
|
+
The forward set is now exactly `ObjectCalendarProps`, each key resolved to the type that prop declares: the callback family is a declared, function-typed host escape hatch, `locale` is accepted only when `Intl.getCanonicalLocales` takes it, `data`/`loading` keep the parent pre-fetch path at their declared types, and everything else — including the open tail of authored keys — is dropped.
|
|
352
|
+
|
|
353
|
+
Host-passed functions are unaffected: a React host's handlers, and `ListView`'s `onRowClick`, still reach the component exactly as before.
|
|
354
|
+
|
|
355
|
+
- Updated dependencies [0e67b53]
|
|
356
|
+
- Updated dependencies [ceccdcf]
|
|
357
|
+
- Updated dependencies [d6e5124]
|
|
358
|
+
- Updated dependencies [debad27]
|
|
359
|
+
- Updated dependencies [dc2aa3e]
|
|
360
|
+
- Updated dependencies [ee66e2e]
|
|
361
|
+
- Updated dependencies [e2e6360]
|
|
362
|
+
- Updated dependencies [ee26e65]
|
|
363
|
+
- Updated dependencies [5900ac5]
|
|
364
|
+
- Updated dependencies [932cbcd]
|
|
365
|
+
- Updated dependencies [734d186]
|
|
366
|
+
- Updated dependencies [f650253]
|
|
367
|
+
- Updated dependencies [6d01319]
|
|
368
|
+
- Updated dependencies [3d9769a]
|
|
369
|
+
- Updated dependencies [8f85f8b]
|
|
370
|
+
- Updated dependencies [d0c3b26]
|
|
371
|
+
- Updated dependencies [3fc2971]
|
|
372
|
+
- Updated dependencies [aca27fa]
|
|
373
|
+
- Updated dependencies [dde7283]
|
|
374
|
+
- Updated dependencies [f7c6430]
|
|
375
|
+
- Updated dependencies [4dadf0d]
|
|
376
|
+
- Updated dependencies [ae10a01]
|
|
377
|
+
- Updated dependencies [0f21348]
|
|
378
|
+
- Updated dependencies [d2e2caf]
|
|
379
|
+
- Updated dependencies [92876f0]
|
|
380
|
+
- Updated dependencies [f279deb]
|
|
381
|
+
- Updated dependencies [4b70d28]
|
|
382
|
+
- Updated dependencies [eb7f586]
|
|
383
|
+
- Updated dependencies [e901131]
|
|
384
|
+
- Updated dependencies [ebb4e0e]
|
|
385
|
+
- Updated dependencies [3a9021e]
|
|
386
|
+
- Updated dependencies [d9d3463]
|
|
387
|
+
- Updated dependencies [2a40f69]
|
|
388
|
+
- Updated dependencies [bec3e14]
|
|
389
|
+
- Updated dependencies [613b167]
|
|
390
|
+
- Updated dependencies [b4d3c22]
|
|
391
|
+
- Updated dependencies [1f9b905]
|
|
392
|
+
- Updated dependencies [8f60d73]
|
|
393
|
+
- Updated dependencies [cb13400]
|
|
394
|
+
- Updated dependencies [828549a]
|
|
395
|
+
- Updated dependencies [e1ade8f]
|
|
396
|
+
- Updated dependencies [bc64bfe]
|
|
397
|
+
- Updated dependencies [abb0f81]
|
|
398
|
+
- Updated dependencies [38ab505]
|
|
399
|
+
- Updated dependencies [63fe8fd]
|
|
400
|
+
- Updated dependencies [3e19fe7]
|
|
401
|
+
- Updated dependencies [bb58d1d]
|
|
402
|
+
- Updated dependencies [433ff9f]
|
|
403
|
+
- Updated dependencies [5cc847c]
|
|
404
|
+
- Updated dependencies [6314e87]
|
|
405
|
+
- Updated dependencies [5e2e9fa]
|
|
406
|
+
- Updated dependencies [297534b]
|
|
407
|
+
- Updated dependencies [e7663f2]
|
|
408
|
+
- Updated dependencies [fa21254]
|
|
409
|
+
- Updated dependencies [33c32bf]
|
|
410
|
+
- Updated dependencies [66fb4fa]
|
|
411
|
+
- Updated dependencies [b953a97]
|
|
412
|
+
- Updated dependencies [e076fd5]
|
|
413
|
+
- Updated dependencies [d7f3e30]
|
|
414
|
+
- Updated dependencies [6d641c9]
|
|
415
|
+
- Updated dependencies [7e4f0e5]
|
|
416
|
+
- Updated dependencies [c911544]
|
|
417
|
+
- Updated dependencies [a84385b]
|
|
418
|
+
- Updated dependencies [45e1949]
|
|
419
|
+
- Updated dependencies [92250d6]
|
|
420
|
+
- Updated dependencies [c1d939f]
|
|
421
|
+
- Updated dependencies [58bebf6]
|
|
422
|
+
- Updated dependencies [36310dc]
|
|
423
|
+
- Updated dependencies [52d878a]
|
|
424
|
+
- Updated dependencies [456aac8]
|
|
425
|
+
- Updated dependencies [405e808]
|
|
426
|
+
- Updated dependencies [49ae9f4]
|
|
427
|
+
- Updated dependencies [a3ae404]
|
|
428
|
+
- Updated dependencies [7d04b0e]
|
|
429
|
+
- Updated dependencies [bfdf3d4]
|
|
430
|
+
- Updated dependencies [bb68488]
|
|
431
|
+
- Updated dependencies [c0f9a4b]
|
|
432
|
+
- Updated dependencies [b1e42d0]
|
|
433
|
+
- Updated dependencies [2459a3e]
|
|
434
|
+
- Updated dependencies [ac853ce]
|
|
435
|
+
- Updated dependencies [fa51109]
|
|
436
|
+
- Updated dependencies [d6aa172]
|
|
437
|
+
- Updated dependencies [c32a8a1]
|
|
438
|
+
- Updated dependencies [fe52a04]
|
|
439
|
+
- Updated dependencies [d46f9b8]
|
|
440
|
+
- Updated dependencies [3f5f87c]
|
|
441
|
+
- Updated dependencies [2fea4d2]
|
|
442
|
+
- Updated dependencies [f5e1143]
|
|
443
|
+
- Updated dependencies [dad805d]
|
|
444
|
+
- Updated dependencies [7f1cb33]
|
|
445
|
+
- Updated dependencies [f148a64]
|
|
446
|
+
- Updated dependencies [bb68488]
|
|
447
|
+
- Updated dependencies [2e3b0c0]
|
|
448
|
+
- Updated dependencies [35997ce]
|
|
449
|
+
- Updated dependencies [9461dd3]
|
|
450
|
+
- Updated dependencies [78fa331]
|
|
451
|
+
- Updated dependencies [47f551b]
|
|
452
|
+
- Updated dependencies [31ab1ac]
|
|
453
|
+
- Updated dependencies [0082db8]
|
|
454
|
+
- Updated dependencies [ab04728]
|
|
455
|
+
- Updated dependencies [b388950]
|
|
456
|
+
- Updated dependencies [5bf09fd]
|
|
457
|
+
- Updated dependencies [06915b0]
|
|
458
|
+
- Updated dependencies [ff84b05]
|
|
459
|
+
- @object-ui/i18n@17.5.0
|
|
460
|
+
- @object-ui/react@17.5.0
|
|
461
|
+
- @object-ui/components@17.5.0
|
|
462
|
+
- @object-ui/plugin-detail@17.5.0
|
|
463
|
+
- @object-ui/core@17.5.0
|
|
464
|
+
- @object-ui/fields@17.5.0
|
|
465
|
+
- @object-ui/types@17.5.0
|
|
466
|
+
- @object-ui/mobile@17.5.0
|
|
467
|
+
|
|
468
|
+
## 17.4.0
|
|
469
|
+
|
|
470
|
+
### Patch Changes
|
|
471
|
+
|
|
472
|
+
- 5bfaabd: `PageComponentSchema.dataSource` now reaches every object-bound block, not just
|
|
473
|
+
`list-view` — and `element:record_picker` stops discarding `view`
|
|
474
|
+
(objectstack#6953).
|
|
475
|
+
|
|
476
|
+
objectstack#5576 wired the spec's per-element data binding
|
|
477
|
+
(`dataSource: { object, view?, filter?, sort?, limit? }`) to `list-view` and left
|
|
478
|
+
the same declaration inert on every other page component. Two gaps remained, and
|
|
479
|
+
both were silent:
|
|
480
|
+
|
|
481
|
+
- **`element:record_picker` read four of the five keys and dropped `view`.** So
|
|
482
|
+
`dataSource: { object: 'account', view: 'hot' }` — the spec's own example —
|
|
483
|
+
built a picker over EVERY account instead of the rows the saved view selects.
|
|
484
|
+
Nothing threw and nothing rendered an error; the option list was simply wider
|
|
485
|
+
than what was authored, which also means a user could select a record the page
|
|
486
|
+
said was out of scope.
|
|
487
|
+
- **`object-grid` / `object-form` / `object-kanban` / `object-calendar` /
|
|
488
|
+
`object-chart` / `object-metric` / `record:related_list` read none of it.**
|
|
489
|
+
Each gates its fetch on its own `objectName`, and nothing mapped
|
|
490
|
+
`dataSource.object` onto it, so a page written the way the spec documents
|
|
491
|
+
rendered an empty grid / a field-less form / a board with no cards / an empty
|
|
492
|
+
month / an empty chart / a static metric number — with no request and no
|
|
493
|
+
diagnostic anywhere. Spec-valid metadata rendering nothing is the
|
|
494
|
+
objectstack#4413 shape.
|
|
495
|
+
|
|
496
|
+
Composition follows objectstack#5576's landed semantics unchanged on every block:
|
|
497
|
+
a named saved view supplies the baseline, a key written on the component itself
|
|
498
|
+
overrides it, an explicit binding key overrides both, `filter` AND-combines
|
|
499
|
+
("additional filter criteria" — a binding can narrow a view, never widen it), and
|
|
500
|
+
a `view` name that does not resolve renders a configuration error instead of
|
|
501
|
+
degrading to the object's full scope.
|
|
502
|
+
|
|
503
|
+
- `@object-ui/react` — new `useElementDataSourceSchema(schema, mapping, dataSource?)`
|
|
504
|
+
and `ElementDataSourceGate` apply a resolved binding to the schema keys a given
|
|
505
|
+
block reads, plus `ElementDataSourceErrorPanel` / `ElementDataSourceLoadingPanel`
|
|
506
|
+
for the two non-final states. One precedence table for all blocks rather than
|
|
507
|
+
one copy per block — that copy is how "additional filter criteria" would have
|
|
508
|
+
become two dialects.
|
|
509
|
+
- A mapping names **only** keys its block genuinely reads. A composed value
|
|
510
|
+
written onto a key the block ignores would be accepted and dropped, which is
|
|
511
|
+
the defect being removed, one layer deeper — so a kanban's swimlane `columns`
|
|
512
|
+
never receive a view's field list, and a block with no row cap leaves `limit`
|
|
513
|
+
unmapped. The per-block coverage table, including two residual gaps that are
|
|
514
|
+
named rather than papered over, is in `content/docs/guide/data-source.md`.
|
|
515
|
+
|
|
516
|
+
No behaviour changes for a block that carries no `dataSource`: the binding-free
|
|
517
|
+
path returns the schema by reference, so nothing remounts and nothing refetches.
|
|
518
|
+
|
|
519
|
+
- Updated dependencies [794c497]
|
|
520
|
+
- Updated dependencies [993336f]
|
|
521
|
+
- Updated dependencies [f0a625a]
|
|
522
|
+
- Updated dependencies [b5980f4]
|
|
523
|
+
- Updated dependencies [8aad9fd]
|
|
524
|
+
- Updated dependencies [6719877]
|
|
525
|
+
- Updated dependencies [56ff091]
|
|
526
|
+
- Updated dependencies [0186cdc]
|
|
527
|
+
- Updated dependencies [7864f03]
|
|
528
|
+
- Updated dependencies [ea41a59]
|
|
529
|
+
- Updated dependencies [0cbdca8]
|
|
530
|
+
- Updated dependencies [d229dfa]
|
|
531
|
+
- Updated dependencies [ecae400]
|
|
532
|
+
- Updated dependencies [4bc6c23]
|
|
533
|
+
- Updated dependencies [d3e738a]
|
|
534
|
+
- Updated dependencies [c3b01a7]
|
|
535
|
+
- Updated dependencies [f5f8744]
|
|
536
|
+
- Updated dependencies [7ed3360]
|
|
537
|
+
- Updated dependencies [69becd2]
|
|
538
|
+
- Updated dependencies [5e52495]
|
|
539
|
+
- Updated dependencies [0fa5e4d]
|
|
540
|
+
- Updated dependencies [b750823]
|
|
541
|
+
- Updated dependencies [5bfaabd]
|
|
542
|
+
- Updated dependencies [e06810e]
|
|
543
|
+
- Updated dependencies [ab3ad4f]
|
|
544
|
+
- Updated dependencies [65bb513]
|
|
545
|
+
- Updated dependencies [c97a45e]
|
|
546
|
+
- Updated dependencies [b19162d]
|
|
547
|
+
- Updated dependencies [c2fd122]
|
|
548
|
+
- Updated dependencies [1bd6faa]
|
|
549
|
+
- Updated dependencies [ac2139c]
|
|
550
|
+
- Updated dependencies [b14ab3a]
|
|
551
|
+
- Updated dependencies [e24d767]
|
|
552
|
+
- Updated dependencies [7b3e048]
|
|
553
|
+
- Updated dependencies [8c60819]
|
|
554
|
+
- Updated dependencies [aca561a]
|
|
555
|
+
- Updated dependencies [e64a52e]
|
|
556
|
+
- Updated dependencies [844d17f]
|
|
557
|
+
- Updated dependencies [d8a0be4]
|
|
558
|
+
- Updated dependencies [48132f7]
|
|
559
|
+
- Updated dependencies [4dcd52a]
|
|
560
|
+
- Updated dependencies [42ae5c6]
|
|
561
|
+
- Updated dependencies [0ef9dfd]
|
|
562
|
+
- Updated dependencies [f4b97c8]
|
|
563
|
+
- Updated dependencies [1d723e3]
|
|
564
|
+
- Updated dependencies [0109f54]
|
|
565
|
+
- Updated dependencies [7e5bb5d]
|
|
566
|
+
- Updated dependencies [fbc23e0]
|
|
567
|
+
- Updated dependencies [6d762da]
|
|
568
|
+
- Updated dependencies [e6fdbdc]
|
|
569
|
+
- Updated dependencies [4178d5a]
|
|
570
|
+
- Updated dependencies [54233b1]
|
|
571
|
+
- Updated dependencies [c2ecbae]
|
|
572
|
+
- Updated dependencies [acc34c5]
|
|
573
|
+
- Updated dependencies [c4768a7]
|
|
574
|
+
- Updated dependencies [f9faa7d]
|
|
575
|
+
- Updated dependencies [97b63d7]
|
|
576
|
+
- Updated dependencies [6bb454a]
|
|
577
|
+
- Updated dependencies [11c1e71]
|
|
578
|
+
- Updated dependencies [523be48]
|
|
579
|
+
- Updated dependencies [7e2b7e9]
|
|
580
|
+
- Updated dependencies [33526fd]
|
|
581
|
+
- Updated dependencies [32413ec]
|
|
582
|
+
- Updated dependencies [c1e1e6b]
|
|
583
|
+
- @object-ui/components@17.4.0
|
|
584
|
+
- @object-ui/plugin-detail@17.4.0
|
|
585
|
+
- @object-ui/react@17.4.0
|
|
586
|
+
- @object-ui/core@17.4.0
|
|
587
|
+
- @object-ui/fields@17.4.0
|
|
588
|
+
- @object-ui/i18n@17.4.0
|
|
589
|
+
- @object-ui/types@17.4.0
|
|
590
|
+
- @object-ui/mobile@17.4.0
|
|
591
|
+
|
|
3
592
|
## 17.3.0
|
|
4
593
|
|
|
5
594
|
### Patch Changes
|
|
@@ -1346,6 +1935,7 @@
|
|
|
1346
1935
|
detail view (`TypeError: titleFormat.replace is not a function`) and printed
|
|
1347
1936
|
`Failed to evaluate expression: ${[object Object]}` for every action visibility
|
|
1348
1937
|
predicate.
|
|
1938
|
+
|
|
1349
1939
|
- `@object-ui/core`: `ExpressionEvaluator.evaluate` / `evaluateCondition` now
|
|
1350
1940
|
unwrap Expression envelopes transparently.
|
|
1351
1941
|
- `@object-ui/react`: new `toPredicateInput()` helper to safely normalize
|
|
@@ -1429,6 +2019,7 @@
|
|
|
1429
2019
|
Library builds (vite lib mode) now externalize every non-relative import instead of bundling third-party CJS dependencies into the published dist. This avoids inlined `require("react")` / `require("react-dom")` calls that cause `Calling \`require\` for "react" in an environment that doesn't expose the \`require\` function` runtime errors when consumer apps re-bundle the published dist.
|
|
1430
2020
|
|
|
1431
2021
|
Specifically fixes:
|
|
2022
|
+
|
|
1432
2023
|
- `@object-ui/plugin-dashboard` no longer inlines `react-grid-layout` (and its transitive `react-draggable` / `react-resizable` CJS bundles). `react-grid-layout` is now declared as a peer dependency so consumers install a single ESM-friendly copy.
|
|
1433
2024
|
- `@object-ui/components`, `@object-ui/plugin-calendar`, `@object-ui/plugin-charts`, `@object-ui/plugin-designer` no longer inline `react-i18next` / `i18next` / `use-sync-external-store` CJS shims.
|
|
1434
2025
|
- All plugin packages now use a unified `external: (id) => !/^[./]/.test(id) && !id.startsWith(__dirname)` rule, ensuring future additions of CJS deps are automatically externalized.
|
|
@@ -1495,15 +2086,18 @@
|
|
|
1495
2086
|
- b2be122: fix(mobile): round 2 — kanban readability, calendar default view, timeline dot clipping
|
|
1496
2087
|
|
|
1497
2088
|
**Kanban**
|
|
2089
|
+
|
|
1498
2090
|
- Remove `font-mono` from card titles, descriptions, column headers, and empty-state labels — CRM cards no longer render in a monospace font.
|
|
1499
2091
|
- Constrain column body height (`max-h-full min-h-0` + `h-full` on the layout root) so `ScrollArea` activates and cards don't bleed past the viewport bottom.
|
|
1500
2092
|
- Opportunistically derive `description` (e.g. `$60K · Acme Corp · @owner`) and up to two `badges` (priority/severity/industry/rating) in `ObjectKanban` when the schema/source omits them, giving mobile cards more context at a glance.
|
|
1501
2093
|
|
|
1502
2094
|
**Calendar**
|
|
2095
|
+
|
|
1503
2096
|
- `ObjectCalendar` previously hardcoded `view={schema.defaultView ?? 'month'}`, making the view-selector dropdown a no-op. Wire the `view` state through to the `<Calendar>` prop so user selection is respected.
|
|
1504
2097
|
- On mobile (viewport < 768 px) coerce `day` defaults to `month` via a synchronous lazy initialiser and a resize/orientation effect — avoids the useless 24-hour empty-hour grid for date-only events.
|
|
1505
2098
|
|
|
1506
2099
|
**Timeline**
|
|
2100
|
+
|
|
1507
2101
|
- Add `ml-3` to the `<Timeline>` `<ol>` so the `absolute -left-3` marker dots are no longer clipped at the scroll-container edge.
|
|
1508
2102
|
|
|
1509
2103
|
- Updated dependencies [a2d7023]
|