@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 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]