@object-ui/plugin-gantt 17.2.0 → 17.5.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 +529 -0
- package/README.md +0 -11
- package/dist/GanttView.d.ts +9 -0
- package/dist/GanttView.d.ts.map +1 -1
- package/dist/ObjectGantt.d.ts.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1088 -1039
- package/dist/index.umd.cjs +3 -3
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/dist/useGanttTranslation.d.ts.map +1 -1
- package/package.json +15 -15
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,525 @@
|
|
|
1
1
|
# @object-ui/plugin-gantt
|
|
2
2
|
|
|
3
|
+
## 17.5.0
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- ebb4e0e: The date formatter's last three en-US channels now follow the display locale
|
|
8
|
+
(objectui#4272).
|
|
9
|
+
|
|
10
|
+
objectui#4468 (PR #4512) pointed every date _renderer_ at `useDisplayLocale()`.
|
|
11
|
+
Three channels were out of its reach because they are properties of the
|
|
12
|
+
formatter's signature and of its callers rather than of any renderer, so a `zh`
|
|
13
|
+
console still met English dates in three places:
|
|
14
|
+
|
|
15
|
+
- **`formatDate`'s `'short'` branch** hardcoded
|
|
16
|
+
`toLocaleDateString('en-US', { month: 'short' })`, so it rendered an English
|
|
17
|
+
month even when the caller had threaded `options.locale` into that very call.
|
|
18
|
+
Its only consumers are ObjectGrid's two mobile-card date cells, which threaded
|
|
19
|
+
no locale — fixing either half alone moves nothing, so both land here.
|
|
20
|
+
- **`formatDateTime` took no options parameter at all**, so no caller could
|
|
21
|
+
localize it however hard it tried; it always handed `Intl` an `undefined` tag,
|
|
22
|
+
which means the MACHINE's locale — neither of the repo's two locale channels.
|
|
23
|
+
The parameter is optional and lands together with its consumers, plugin-gantt's
|
|
24
|
+
four tooltip call sites.
|
|
25
|
+
- **The lookup picker's MongoDB `$date` fallback** called a bare
|
|
26
|
+
`toLocaleDateString()` with no tag.
|
|
27
|
+
|
|
28
|
+
One resolver everywhere, as before: `useDisplayLocale()` (tenant regional
|
|
29
|
+
default → active UI language → `'en'`). `Intl` accepts `'zh'` verbatim, so there
|
|
30
|
+
is still no mapping table anywhere.
|
|
31
|
+
|
|
32
|
+
English output is byte-identical at every touched site — `en` and `en-US` agree
|
|
33
|
+
on all twelve short month names — and the `'short'` layout itself is unchanged:
|
|
34
|
+
only the month token is localized, the compact `"Jan 15, '24"` shape around it
|
|
35
|
+
is a deliberate fixed layout for narrow cards.
|
|
36
|
+
|
|
37
|
+
`@object-ui/fields` is `minor` because `formatDateTime`'s new optional parameter
|
|
38
|
+
is visible in the package's entry `.d.ts`; the plugin packages' own `.d.ts` files
|
|
39
|
+
are byte-identical, so their change is module-local.
|
|
40
|
+
|
|
41
|
+
- 828549a: The gantt's conflict dialog shows the number of affected tasks again, not a literal `{2}`
|
|
42
|
+
|
|
43
|
+
`gantt.conflict.body` was resolved at the render site with a literal string replace on **single** braces — `t('gantt.conflict.body').replace('{count}', String(n))` — while all ten locale packs spell the placeholder the i18next way, `{{count}}`. `"…{{count}}…".replace("{count}", "2")` consumes the inner seven characters and leaves the outer pair behind, so every user on every loaded pack read "自动重新排程 **{2}** 个受影响的任务?". The dialog now interpolates through i18next (`t('gantt.conflict.body', { count })`), the idiom `gantt.delete.body` already used.
|
|
44
|
+
|
|
45
|
+
The two sibling keys three lines away in the same file, `gantt.autoScheduleDlg.body` and `.skipped`, were **not** broken — pack and call site both used single braces, and they rendered correctly. They are converted anyway, because that split is the whole mechanism: two write-confirmation dialogs in one component carried two different interpolation idioms, so `conflict.body` drifting to the i18next spelling in the packs (which is the correct spelling, and matches every other placeholder in the bundle) silently broke the render. Leaving the auto-schedule keys on the literal-replace idiom leaves the same trap armed for the next translator. All ten packs and the plugin's bundled English fallback table now agree on `{{count}}` for all three; only the braces moved, no translation was reworded.
|
|
46
|
+
|
|
47
|
+
`gantt.quickFilter.resultSummary` stays deliberately single-brace — its `ObjectGantt` call site really does resolve `{shown}`/`{total}` with a literal replace, and that convention is pinned by its own parity test. It is now the only key in the gantt namespace on that idiom, and the comments at both spellings say so.
|
|
48
|
+
|
|
49
|
+
Nothing caught this, and each gate was silent for its own reason: the cross-pack parity check compares en against each pack, and all eleven spellings agreed; the en-drift check compares a pack against its own history, and the packs were born matching. Both are **relative** comparisons, and the defect lived in the **absolute** relationship between a pack's spelling and the syntax the call site resolves. The existing render test asserted the dialog body contains `'1'` — which `{1}` satisfies. The new pin asserts the absolute form directly, under a real loaded pack, for every way a placeholder can survive to the screen.
|
|
50
|
+
|
|
51
|
+
- e1ade8f: An illegal gantt dependency link now says why it was refused, instead of doing nothing
|
|
52
|
+
|
|
53
|
+
Dragging a dependency onto a target the gantt refuses — itself, a locked row, a group row, or one that would close a dependency cycle — produced no feedback of any kind: no toast, no dialog, no cursor change, no target outline, not even a console warning. The guard was right and completely invisible, so a user drawing a legitimate-looking dependency got a dead interaction and no way to learn the constraint. The rejection was silent in both places it could have shown: a refused bar never became the drop target, so it got no hover treatment at all, and the release handler only ran its body when a target _had_ been registered, so the drop itself was a no-op.
|
|
54
|
+
|
|
55
|
+
Both halves are now wired, and both read the **same** verdict. `canReceiveLink`'s four-branch boolean became `classifyLinkTarget`, which returns which branch refused (or `null`), with the boolean derived from it. The hover affordance and the drop toast are two consumers of that one classification, so the reason a user is shown cannot drift from the reason the link was actually refused — there is no second classifier to disagree. The branch names are the leaves of the new `gantt.link.rejected.*` keys, so a branch added later without a message surfaces as a missing key rather than as a plausible-but-wrong sentence.
|
|
56
|
+
|
|
57
|
+
During the drag, a refused bar under the pointer gets `cursor: not-allowed` and a destructive outline; on release it raises a toast naming the reason. Four messages, one per branch, in all ten packs. Both the cursor and the outline are driven from inline `style` rather than utility classes, matching the bar's existing read-only cursor three lines away and for the same reason recorded there: `cursor-not-allowed` and the ring alpha utilities are not emitted in the prebuilt components CSS, so a class would look correct in a DOM test and render nothing in a browser.
|
|
58
|
+
|
|
59
|
+
Deliberately unchanged: a host veto through `onBeforeDependencyCreate` stays silent. That rejection carries a reason only the host knows, and the gantt has none to show — surfacing it means exposing a rejection-reason output on the public component, which is a separate contract rather than a rider on this one. The four built-in reasons are the gantt's own policy and are the only ones it can explain.
|
|
60
|
+
|
|
61
|
+
One of the four, `group`, has no end-to-end path today: a `type: 'group'` row renders no bar, so the drag can never target it. The message is kept anyway — without it the branch would render a raw key on screen if it ever did fire — and the test pins the reachability fact, so it goes red the day group rows gain a bar. Filed as objectui#4209.
|
|
62
|
+
|
|
63
|
+
- db4ad6b: Gantt tooltip currency re-formats when the tenant currency resolves
|
|
64
|
+
(objectui#4542).
|
|
65
|
+
|
|
66
|
+
ObjectGantt's `tasks` memo builds every tooltip string eagerly inside its
|
|
67
|
+
callback, and the `'currency'` case resolves its code down to the tenant
|
|
68
|
+
default (`resolveFieldCurrency(def, tenantCurrency)`). `tenantCurrency` was
|
|
69
|
+
not in the memo's dependency array, so the value was read but never watched.
|
|
70
|
+
|
|
71
|
+
That default comes from `GET /api/v1/auth/me/localization`, which is cosmetic
|
|
72
|
+
and non-blocking and therefore answers AFTER first paint. The context change
|
|
73
|
+
re-rendered ObjectGantt, but with none of `data` / `ganttConfig` /
|
|
74
|
+
`objectSchema` / `displayLocale` changed the memo handed back its cached task
|
|
75
|
+
array — so a tooltip amount kept the pre-resolution rendering (a plain
|
|
76
|
+
`1,234.50` instead of `€1,234.50`) until something unrelated invalidated the
|
|
77
|
+
memo.
|
|
78
|
+
|
|
79
|
+
This is the currency twin of objectui#4272, which added `displayLocale` to
|
|
80
|
+
this same array for the same reason, and it is not covered by that dep: the
|
|
81
|
+
producer writes currency and locale from one response, so a tenant that
|
|
82
|
+
configures BOTH re-runs the memo through the locale channel — but a tenant
|
|
83
|
+
that configures a currency and no locale (the common shape, since the tenant
|
|
84
|
+
locale is frequently unset) leaves `displayLocale` untouched and the currency
|
|
85
|
+
stale.
|
|
86
|
+
|
|
87
|
+
Module-local: the fix is one dependency, the package's `.d.ts` files are
|
|
88
|
+
byte-identical, and rendering is unchanged whenever the channel resolves
|
|
89
|
+
before first paint or a field carries its own currency code.
|
|
90
|
+
|
|
91
|
+
- a908882: Gantt tooltip numbers and currency follow the display locale (objectui#4553).
|
|
92
|
+
|
|
93
|
+
`formatFieldValue`, the tooltip value formatter inside ObjectGantt's `tasks`
|
|
94
|
+
memo, had its four TEMPORAL call sites threaded with `useDisplayLocale()` by
|
|
95
|
+
objectui#4272. The numeric cases beside them passed no locale, so they reached
|
|
96
|
+
`new Intl.NumberFormat(undefined, …)` — the MACHINE's locale, which is neither
|
|
97
|
+
of the repo's two locale channels.
|
|
98
|
+
|
|
99
|
+
One tooltip therefore rendered two conventions. A German session read
|
|
100
|
+
`5. Jan. 2024` on the date row and `1,234.50` on the amount row directly below
|
|
101
|
+
it, where German groups with `.` and marks the decimal with `,`. Inverted
|
|
102
|
+
separators do not read as an unstyled number; they read as a different number.
|
|
103
|
+
The currency row was affected in the symbol's POSITION too — `1.234,50 EUR`
|
|
104
|
+
rather than `EUR1,234.50` — while the currency CODE itself was already resolved
|
|
105
|
+
correctly (objectui#4542 made the memo watch it); only the locale rendering that
|
|
106
|
+
code was missing.
|
|
107
|
+
|
|
108
|
+
`number` / `integer` / `float` / `decimal` and `currency` now pass the
|
|
109
|
+
`displayLocale` already read at component level, using each formatter's existing
|
|
110
|
+
locale parameter. No formatter signature changed and no memo dependency changed
|
|
111
|
+
(`displayLocale` has been in that array since objectui#4272), so this is
|
|
112
|
+
consumer-side threading only: the package's `.d.ts` files are byte-identical and
|
|
113
|
+
English output is unchanged at every touched site.
|
|
114
|
+
|
|
115
|
+
Known gap, tracked on objectui#4553: the `percent` row still does not follow the
|
|
116
|
+
display locale. `formatPercent(value, precision)` takes no locale parameter —
|
|
117
|
+
it is `${percentDisplayValue(value).toFixed(precision)}%`, so it builds no
|
|
118
|
+
`Intl.NumberFormat` at all and renders in NO locale rather than the machine's
|
|
119
|
+
(ASCII decimal mark, never grouped, identical on every machine). Closing that
|
|
120
|
+
needs a `@object-ui/fields` signature change, which is outside this change's
|
|
121
|
+
ruled surface, and is pinned by a test here so the gap cannot drift unnoticed.
|
|
122
|
+
|
|
123
|
+
- 0ca6096: A gantt task titled `A$&B` no longer prints `{{title}}` back into its own delete dialog — the two hand-rolled provider-less fallback interpolators are literal, like i18next
|
|
124
|
+
|
|
125
|
+
objectui#3418 fixed the shared helper's fallback interpolator: `String.prototype.replace` became `split(needle).join(value)`, because `replace` and `replaceAll` both interpret `$&`, `` $` ``, `$'` and `$$` in the **replacement** string and i18next does not. Two hand-rolled copies of that interpolator never got the fix. Both are deliberate non-users of `createSafeTranslation` — each falls back per key so a host dictionary that covers the common keys but lags on newer ones still resolves what it has — so the shared fix had no path to reach them.
|
|
126
|
+
|
|
127
|
+
The reachable one is gantt's. `gantt.delete.body` is `'"{{title}}" will be permanently removed. …'` and its call site interpolates the record's own title, which is user data:
|
|
128
|
+
|
|
129
|
+
| task title | rendered before | rendered now |
|
|
130
|
+
| ---------- | --------------------------------------------------------------------- | ----------------------------------------- |
|
|
131
|
+
| `A$&B` | `"A{{title}}B" will be permanently removed.` | `"A$&B" will be permanently removed.` |
|
|
132
|
+
| `` x$`y `` | `"x"y" will be permanently removed.` | `` "x$`y" will be permanently removed. `` |
|
|
133
|
+
| `p$$q` | `"p$q" will be permanently removed.` | `"p$$q" will be permanently removed.` |
|
|
134
|
+
| `u$'v` | `"u" will be permanently removed. …v" will be permanently removed. …` | `"u$'v" will be permanently removed.` |
|
|
135
|
+
|
|
136
|
+
The first row is the ugly one: `$&` expands to the matched text, so the placeholder itself is printed back to the user inside the record's own name. Gantt's copy also carried the other half of the same defect — a bare string needle substitutes only the **first** occurrence, where i18next substitutes every one — and `split`/`join` fixes both at once.
|
|
137
|
+
|
|
138
|
+
The import wizard's copy used a `g`-flagged `RegExp`, which covered the repeated-placeholder half but could not touch the `$`-pattern half: that harm lives in the replacement string, not the needle. Its values are authored metadata — field labels and type names spliced into `grid.import.missingRequiredHint` and `grid.import.legacyReferenceBlocked` — so a label containing `$&` corrupted the hint the same way. Retiring the `RegExp` also retires an unescaped needle, since the placeholder name went into the pattern uninterpolated; that was inert while every placeholder name is a bare identifier, and is now structurally impossible.
|
|
139
|
+
|
|
140
|
+
This is the provider-less path only (standalone embedding, unit tests). With an `I18nProvider` mounted, i18next serves these keys and was already literal on both sides — which is exactly why the divergence was invisible. No pack, key or call site changed; the three `{{count}}` gantt keys take numbers and were never affected, and `gantt.quickFilter.resultSummary`'s deliberate single-brace idiom is resolved by its call site rather than this interpolator and is untouched.
|
|
141
|
+
|
|
142
|
+
- 36310dc: `formatPercent` groups its output and follows the display locale — the last
|
|
143
|
+
tooltip/cell channel (objectui#4553).
|
|
144
|
+
|
|
145
|
+
PR #4557 threaded the gantt tooltip's number and currency rows and measured that
|
|
146
|
+
the percent row could not follow: `formatPercent(value, precision)` took no
|
|
147
|
+
locale parameter, and its whole body was
|
|
148
|
+
`${percentDisplayValue(value).toFixed(precision)}%`. It built no
|
|
149
|
+
`Intl.NumberFormat` and never reached `formatDisplayNumber` — so unlike its
|
|
150
|
+
siblings it did not render in the MACHINE's locale, it rendered in **no** locale:
|
|
151
|
+
an ASCII decimal mark, never a grouping separator, byte-identical on every
|
|
152
|
+
machine.
|
|
153
|
+
|
|
154
|
+
**English output MOVES, and that is the fix.** Because the function never
|
|
155
|
+
grouped, `1235%` was wrong in en-US too, not only in German. Grouping and locale
|
|
156
|
+
therefore land together:
|
|
157
|
+
|
|
158
|
+
| | before | after |
|
|
159
|
+
| ---------- | ------- | -------------- |
|
|
160
|
+
| en, 1234.5 | `1235%` | `1,235%` |
|
|
161
|
+
| de, 1234.5 | `1235%` | `1.235\u00a0%` |
|
|
162
|
+
| de, 80 | `80%` | `80\u00a0%` |
|
|
163
|
+
|
|
164
|
+
Values below the grouping threshold are unchanged in English (`80%`, `12.5%`,
|
|
165
|
+
`33.33%`), so the move is confined to four digits and up. German changes at every
|
|
166
|
+
magnitude, because the no-break space before the sign is part of the locale's
|
|
167
|
+
percent convention — which is what routing through `Intl` buys over appending a
|
|
168
|
+
literal `%`.
|
|
169
|
+
|
|
170
|
+
The scaling contract is untouched: `percentDisplayValue` still disambiguates a
|
|
171
|
+
fraction-stored percent (`0.8` → 80%) from a whole one, so the list cell and the
|
|
172
|
+
dashboard measure formatter still agree.
|
|
173
|
+
|
|
174
|
+
Consumers are threaded in the same change, the parameter never landing
|
|
175
|
+
speculatively:
|
|
176
|
+
|
|
177
|
+
- **fields** — `PercentCellRenderer`, on BOTH of its paths. Its whole-percent
|
|
178
|
+
branch (`progress` / `completion` fields, which store 0-100 and must skip the
|
|
179
|
+
fraction scaling) was a second bare `toFixed` call; leaving it behind would
|
|
180
|
+
have made one grid internally inconsistent, so both branches now share one
|
|
181
|
+
locale-aware body and differ only in the scaling policy.
|
|
182
|
+
- **plugin-gantt** — the tooltip percent row, completing objectui#4553's switch.
|
|
183
|
+
- **plugin-grid** — the mobile card's percent cell, which sits in the same
|
|
184
|
+
density row as a date cell objectui#4272 had already localized.
|
|
185
|
+
- **plugin-dashboard** — `renderFieldValue`'s percent branch. It is a plain
|
|
186
|
+
function rather than a component, so it takes the locale as an optional fourth
|
|
187
|
+
parameter beside the `tenantCurrency` already threaded that way, and both of
|
|
188
|
+
its callers pass it and declare it in their memo dependency arrays.
|
|
189
|
+
|
|
190
|
+
Bumps follow each package's own `.d.ts` diff, measured in both directions.
|
|
191
|
+
`@object-ui/fields` and `@object-ui/plugin-dashboard` are `minor` on the
|
|
192
|
+
objectui#4272 / PR #4544 precedent — quoted from that changeset: "`@object-ui/fields`
|
|
193
|
+
is `minor` because `formatDateTime`'s new optional parameter is visible in the
|
|
194
|
+
package's entry `.d.ts`; the plugin packages' own `.d.ts` files are
|
|
195
|
+
byte-identical, so their change is module-local." Here `formatPercent` and
|
|
196
|
+
`renderFieldValue` each gain an entry-visible optional parameter, while
|
|
197
|
+
plugin-gantt's and plugin-grid's `.d.ts` files are byte-identical and stay
|
|
198
|
+
`patch`.
|
|
199
|
+
|
|
200
|
+
- Updated dependencies [0e67b53]
|
|
201
|
+
- Updated dependencies [ceccdcf]
|
|
202
|
+
- Updated dependencies [d6e5124]
|
|
203
|
+
- Updated dependencies [debad27]
|
|
204
|
+
- Updated dependencies [dc2aa3e]
|
|
205
|
+
- Updated dependencies [ee66e2e]
|
|
206
|
+
- Updated dependencies [e2e6360]
|
|
207
|
+
- Updated dependencies [ee26e65]
|
|
208
|
+
- Updated dependencies [5900ac5]
|
|
209
|
+
- Updated dependencies [932cbcd]
|
|
210
|
+
- Updated dependencies [734d186]
|
|
211
|
+
- Updated dependencies [f650253]
|
|
212
|
+
- Updated dependencies [6d01319]
|
|
213
|
+
- Updated dependencies [3d9769a]
|
|
214
|
+
- Updated dependencies [8f85f8b]
|
|
215
|
+
- Updated dependencies [d0c3b26]
|
|
216
|
+
- Updated dependencies [3fc2971]
|
|
217
|
+
- Updated dependencies [aca27fa]
|
|
218
|
+
- Updated dependencies [dde7283]
|
|
219
|
+
- Updated dependencies [f7c6430]
|
|
220
|
+
- Updated dependencies [4dadf0d]
|
|
221
|
+
- Updated dependencies [ae10a01]
|
|
222
|
+
- Updated dependencies [0f21348]
|
|
223
|
+
- Updated dependencies [d2e2caf]
|
|
224
|
+
- Updated dependencies [92876f0]
|
|
225
|
+
- Updated dependencies [f279deb]
|
|
226
|
+
- Updated dependencies [4b70d28]
|
|
227
|
+
- Updated dependencies [eb7f586]
|
|
228
|
+
- Updated dependencies [e901131]
|
|
229
|
+
- Updated dependencies [ebb4e0e]
|
|
230
|
+
- Updated dependencies [3a9021e]
|
|
231
|
+
- Updated dependencies [d9d3463]
|
|
232
|
+
- Updated dependencies [2a40f69]
|
|
233
|
+
- Updated dependencies [bec3e14]
|
|
234
|
+
- Updated dependencies [613b167]
|
|
235
|
+
- Updated dependencies [b4d3c22]
|
|
236
|
+
- Updated dependencies [1f9b905]
|
|
237
|
+
- Updated dependencies [8f60d73]
|
|
238
|
+
- Updated dependencies [cb13400]
|
|
239
|
+
- Updated dependencies [828549a]
|
|
240
|
+
- Updated dependencies [e1ade8f]
|
|
241
|
+
- Updated dependencies [bc64bfe]
|
|
242
|
+
- Updated dependencies [abb0f81]
|
|
243
|
+
- Updated dependencies [38ab505]
|
|
244
|
+
- Updated dependencies [63fe8fd]
|
|
245
|
+
- Updated dependencies [3e19fe7]
|
|
246
|
+
- Updated dependencies [bb58d1d]
|
|
247
|
+
- Updated dependencies [433ff9f]
|
|
248
|
+
- Updated dependencies [5cc847c]
|
|
249
|
+
- Updated dependencies [6314e87]
|
|
250
|
+
- Updated dependencies [5e2e9fa]
|
|
251
|
+
- Updated dependencies [297534b]
|
|
252
|
+
- Updated dependencies [e7663f2]
|
|
253
|
+
- Updated dependencies [fa21254]
|
|
254
|
+
- Updated dependencies [33c32bf]
|
|
255
|
+
- Updated dependencies [66fb4fa]
|
|
256
|
+
- Updated dependencies [b953a97]
|
|
257
|
+
- Updated dependencies [e076fd5]
|
|
258
|
+
- Updated dependencies [d7f3e30]
|
|
259
|
+
- Updated dependencies [6d641c9]
|
|
260
|
+
- Updated dependencies [7e4f0e5]
|
|
261
|
+
- Updated dependencies [a84385b]
|
|
262
|
+
- Updated dependencies [45e1949]
|
|
263
|
+
- Updated dependencies [92250d6]
|
|
264
|
+
- Updated dependencies [c1d939f]
|
|
265
|
+
- Updated dependencies [58bebf6]
|
|
266
|
+
- Updated dependencies [36310dc]
|
|
267
|
+
- Updated dependencies [52d878a]
|
|
268
|
+
- Updated dependencies [456aac8]
|
|
269
|
+
- Updated dependencies [405e808]
|
|
270
|
+
- Updated dependencies [49ae9f4]
|
|
271
|
+
- Updated dependencies [a3ae404]
|
|
272
|
+
- Updated dependencies [7d04b0e]
|
|
273
|
+
- Updated dependencies [bfdf3d4]
|
|
274
|
+
- Updated dependencies [bb68488]
|
|
275
|
+
- Updated dependencies [c0f9a4b]
|
|
276
|
+
- Updated dependencies [b1e42d0]
|
|
277
|
+
- Updated dependencies [2459a3e]
|
|
278
|
+
- Updated dependencies [ac853ce]
|
|
279
|
+
- Updated dependencies [fa51109]
|
|
280
|
+
- Updated dependencies [d6aa172]
|
|
281
|
+
- Updated dependencies [c32a8a1]
|
|
282
|
+
- Updated dependencies [fe52a04]
|
|
283
|
+
- Updated dependencies [d46f9b8]
|
|
284
|
+
- Updated dependencies [3f5f87c]
|
|
285
|
+
- Updated dependencies [2fea4d2]
|
|
286
|
+
- Updated dependencies [f5e1143]
|
|
287
|
+
- Updated dependencies [dad805d]
|
|
288
|
+
- Updated dependencies [7f1cb33]
|
|
289
|
+
- Updated dependencies [f148a64]
|
|
290
|
+
- Updated dependencies [bb68488]
|
|
291
|
+
- Updated dependencies [2e3b0c0]
|
|
292
|
+
- Updated dependencies [35997ce]
|
|
293
|
+
- Updated dependencies [9461dd3]
|
|
294
|
+
- Updated dependencies [78fa331]
|
|
295
|
+
- Updated dependencies [47f551b]
|
|
296
|
+
- Updated dependencies [31ab1ac]
|
|
297
|
+
- Updated dependencies [0082db8]
|
|
298
|
+
- Updated dependencies [ab04728]
|
|
299
|
+
- Updated dependencies [b388950]
|
|
300
|
+
- Updated dependencies [5bf09fd]
|
|
301
|
+
- Updated dependencies [06915b0]
|
|
302
|
+
- Updated dependencies [ff84b05]
|
|
303
|
+
- @object-ui/i18n@17.5.0
|
|
304
|
+
- @object-ui/react@17.5.0
|
|
305
|
+
- @object-ui/components@17.5.0
|
|
306
|
+
- @object-ui/plugin-detail@17.5.0
|
|
307
|
+
- @object-ui/core@17.5.0
|
|
308
|
+
- @object-ui/fields@17.5.0
|
|
309
|
+
- @object-ui/types@17.5.0
|
|
310
|
+
|
|
311
|
+
## 17.4.0
|
|
312
|
+
|
|
313
|
+
### Patch Changes
|
|
314
|
+
|
|
315
|
+
- 022002a: `PageComponentSchema.dataSource` now reaches the remaining object-bound public
|
|
316
|
+
blocks: `object-gantt` / `object-timeline` / `object-map` / `object-pivot` /
|
|
317
|
+
`object-master-detail-form` / `embeddable-form` / `record:line_items`
|
|
318
|
+
(objectstack#7121).
|
|
319
|
+
|
|
320
|
+
objectstack#6953 wired the spec's per-element data binding
|
|
321
|
+
(`dataSource: { object, view?, filter?, sort?, limit? }`) to the eight blocks it
|
|
322
|
+
named and left the same declaration inert on these seven. Each gates its fetch on
|
|
323
|
+
its own object key and nothing mapped `dataSource.object` onto it, so a page
|
|
324
|
+
written the way the spec documents rendered an empty gantt / an empty timeline
|
|
325
|
+
rail / a map with no markers / an empty cross-tab / a field-less form — with no
|
|
326
|
+
request and no diagnostic anywhere. Spec-valid metadata rendering nothing is the
|
|
327
|
+
objectstack#4413 shape.
|
|
328
|
+
|
|
329
|
+
Composition follows objectstack#5576's landed semantics unchanged, through the
|
|
330
|
+
shared `ElementDataSourceGate` (no change to it or to the resolution layer): a
|
|
331
|
+
named saved view supplies the baseline, a key written on the component itself
|
|
332
|
+
overrides it, an explicit binding key overrides both, `filter` AND-combines
|
|
333
|
+
("additional filter criteria" — a binding can narrow a view, never widen it), and
|
|
334
|
+
a `view` name that does not resolve renders a configuration error on every one of
|
|
335
|
+
these blocks instead of degrading to the object's full scope.
|
|
336
|
+
|
|
337
|
+
Each block maps **only** the keys it genuinely reads, which for this batch means
|
|
338
|
+
several keys stay deliberately unmapped rather than being parked somewhere
|
|
339
|
+
plausible:
|
|
340
|
+
|
|
341
|
+
- `object-gantt` and `object-map` take `object` / `filter` / `sort`; neither has a
|
|
342
|
+
row cap or a field-list read site.
|
|
343
|
+
- `object-pivot` takes `object` / `filter`; a cross-tab orders itself by its own
|
|
344
|
+
row/column grouping and cannot be computed over a truncated page.
|
|
345
|
+
- `object-timeline` takes `object` only — its fetch is
|
|
346
|
+
`find(objectName, { options: { $top: 100 } })`, with no filter/sort read site
|
|
347
|
+
at all, so a named view is error-checked and then contributes nothing.
|
|
348
|
+
- `embeddable-form` and `object-master-detail-form` take `object` only (the
|
|
349
|
+
parent object, in the master-detail case); a form that writes one record has no
|
|
350
|
+
collection query for `filter` / `sort` / `limit` to narrow.
|
|
351
|
+
- `record:line_items` takes `object` onto **`childObject`** — the collection it
|
|
352
|
+
actually lists — and nothing else: its query is the parent FK plus a fixed
|
|
353
|
+
`$top: 500`, and its `columns` are editable `GridColumn` objects rather than a
|
|
354
|
+
field-name projection a view could supply.
|
|
355
|
+
|
|
356
|
+
The per-block coverage table, including every residual gap named above, is in
|
|
357
|
+
`content/docs/guide/data-source.md`.
|
|
358
|
+
|
|
359
|
+
No behaviour change for a block that carries no `dataSource`: the binding-free
|
|
360
|
+
path returns the schema by reference, so nothing remounts and nothing refetches.
|
|
361
|
+
|
|
362
|
+
- 6d762da: The five locale keys behind #3546's eight no-fallback `t()` call sites are now defined in all ten packs, so the built-in-view toasts, the activity-timeline source link, the wizard's required-field toast and the Gantt refresh button's accessible name are translated instead of falling back to English — or, on two surfaces, to the key itself (part of #3546).
|
|
363
|
+
|
|
364
|
+
`scripts/check-i18n-call-site-keys.mjs` measured 258 keys that a `t()` call site asks for and no pack defines. These five were the subset with no working inline default: `console.objectView.cannotEditMetaView`, `console.objectView.cannotDeleteMetaView`, `detail.viewSource`, `gantt.toolbar.refresh` and `wizard.missingRequired`. Adding a `defaultValue` is deliberately not the fix — that mechanism is what kept all 258 invisible for months.
|
|
365
|
+
|
|
366
|
+
**Two of the eight sites really did render the raw key**, and both go through a binding with nothing in front of i18next. `ObjectView.tsx` calls `useObjectTranslation()` directly, so five toasts read `console.objectView.cannotEditMetaView` / `cannotDeleteMetaView` on screen; the `|| 'Built-in views cannot be renamed.'` guards next to them were dead on every path, because i18next answers a miss with the key itself and a non-empty string never falls through `||`. Those four unreachable English strings are removed rather than repaired: one key served four call sites (rename / pin / set-as-default / configure), so the pack copy covers any change to a built-in view instead of naming one operation. `RecordActivityTimeline.tsx` fails the same way for a subtler reason — `useDetailTranslation` is `createSafeTranslation(..., 'detail.back')`, and because `detail.back` does resolve, the probe hands back i18next's `t` for every key and bypasses the defaults map wholesale, so `detail.viewSource` reached the user verbatim.
|
|
367
|
+
|
|
368
|
+
**The other two sites were not rendering a raw key**, contrary to the issue's description, and are fixed here as the milder "English in all ten languages" class. `wizard.missingRequired` is its own hook's probe key, so the probe failed and `createSafeTranslation` correctly served its English default. `gantt.toolbar.refresh` goes through `useGanttTranslation`, which deliberately does not use `createSafeTranslation` and falls back per key — so the refresh button's `aria-label` was "Refresh", in English, never the key. Screen-reader users heard an English word rather than an identifier; a `zh` session now hears 刷新.
|
|
369
|
+
|
|
370
|
+
Regression cover is provider-mounted on purpose: with no `I18nProvider` the defaults maps answer every one of these keys and the assertions pass while the console is broken, which is precisely the false-green the issue documents. For the two sites whose English output was already correct, `en` cannot discriminate before from after — the `zh` assertions are the ones that pin the fix.
|
|
371
|
+
|
|
372
|
+
- Updated dependencies [794c497]
|
|
373
|
+
- Updated dependencies [993336f]
|
|
374
|
+
- Updated dependencies [f0a625a]
|
|
375
|
+
- Updated dependencies [b5980f4]
|
|
376
|
+
- Updated dependencies [8aad9fd]
|
|
377
|
+
- Updated dependencies [6719877]
|
|
378
|
+
- Updated dependencies [56ff091]
|
|
379
|
+
- Updated dependencies [0186cdc]
|
|
380
|
+
- Updated dependencies [7864f03]
|
|
381
|
+
- Updated dependencies [ea41a59]
|
|
382
|
+
- Updated dependencies [0cbdca8]
|
|
383
|
+
- Updated dependencies [d229dfa]
|
|
384
|
+
- Updated dependencies [ecae400]
|
|
385
|
+
- Updated dependencies [4bc6c23]
|
|
386
|
+
- Updated dependencies [d3e738a]
|
|
387
|
+
- Updated dependencies [c3b01a7]
|
|
388
|
+
- Updated dependencies [f5f8744]
|
|
389
|
+
- Updated dependencies [7ed3360]
|
|
390
|
+
- Updated dependencies [69becd2]
|
|
391
|
+
- Updated dependencies [5e52495]
|
|
392
|
+
- Updated dependencies [0fa5e4d]
|
|
393
|
+
- Updated dependencies [b750823]
|
|
394
|
+
- Updated dependencies [5bfaabd]
|
|
395
|
+
- Updated dependencies [e06810e]
|
|
396
|
+
- Updated dependencies [ab3ad4f]
|
|
397
|
+
- Updated dependencies [65bb513]
|
|
398
|
+
- Updated dependencies [c97a45e]
|
|
399
|
+
- Updated dependencies [b19162d]
|
|
400
|
+
- Updated dependencies [c2fd122]
|
|
401
|
+
- Updated dependencies [1bd6faa]
|
|
402
|
+
- Updated dependencies [ac2139c]
|
|
403
|
+
- Updated dependencies [b14ab3a]
|
|
404
|
+
- Updated dependencies [e24d767]
|
|
405
|
+
- Updated dependencies [7b3e048]
|
|
406
|
+
- Updated dependencies [8c60819]
|
|
407
|
+
- Updated dependencies [aca561a]
|
|
408
|
+
- Updated dependencies [e64a52e]
|
|
409
|
+
- Updated dependencies [844d17f]
|
|
410
|
+
- Updated dependencies [d8a0be4]
|
|
411
|
+
- Updated dependencies [48132f7]
|
|
412
|
+
- Updated dependencies [4dcd52a]
|
|
413
|
+
- Updated dependencies [42ae5c6]
|
|
414
|
+
- Updated dependencies [0ef9dfd]
|
|
415
|
+
- Updated dependencies [f4b97c8]
|
|
416
|
+
- Updated dependencies [1d723e3]
|
|
417
|
+
- Updated dependencies [0109f54]
|
|
418
|
+
- Updated dependencies [7e5bb5d]
|
|
419
|
+
- Updated dependencies [fbc23e0]
|
|
420
|
+
- Updated dependencies [6d762da]
|
|
421
|
+
- Updated dependencies [e6fdbdc]
|
|
422
|
+
- Updated dependencies [4178d5a]
|
|
423
|
+
- Updated dependencies [54233b1]
|
|
424
|
+
- Updated dependencies [c2ecbae]
|
|
425
|
+
- Updated dependencies [acc34c5]
|
|
426
|
+
- Updated dependencies [c4768a7]
|
|
427
|
+
- Updated dependencies [f9faa7d]
|
|
428
|
+
- Updated dependencies [97b63d7]
|
|
429
|
+
- Updated dependencies [6bb454a]
|
|
430
|
+
- Updated dependencies [11c1e71]
|
|
431
|
+
- Updated dependencies [523be48]
|
|
432
|
+
- Updated dependencies [7e2b7e9]
|
|
433
|
+
- Updated dependencies [33526fd]
|
|
434
|
+
- Updated dependencies [32413ec]
|
|
435
|
+
- Updated dependencies [c1e1e6b]
|
|
436
|
+
- @object-ui/components@17.4.0
|
|
437
|
+
- @object-ui/plugin-detail@17.4.0
|
|
438
|
+
- @object-ui/react@17.4.0
|
|
439
|
+
- @object-ui/core@17.4.0
|
|
440
|
+
- @object-ui/fields@17.4.0
|
|
441
|
+
- @object-ui/i18n@17.4.0
|
|
442
|
+
- @object-ui/types@17.4.0
|
|
443
|
+
|
|
444
|
+
## 17.3.0
|
|
445
|
+
|
|
446
|
+
### Patch Changes
|
|
447
|
+
|
|
448
|
+
- 5c856ec: `ObjectGantt`'s quick-filter bar is now localized instead of pinned to Chinese. The four `QuickFilterBar` labels (`all`, `clear`, `empty`, `resultSummary`) were hardcoded as Chinese string literals at the `ObjectGantt` call site, so the bar read 全部 / 清除筛选 / 无可选项 / 显示 N / M 项任务 under an `en`, `ja`, `es` or `ar` session while the rest of the gantt toolbar localized correctly — a conspicuous mismatch, and a violation of the English-only-codebase rule. `QuickFilterBar` itself was never at fault: it is presentational and already falls back to English, so the host was the only thing pinning the copy.
|
|
449
|
+
|
|
450
|
+
The four strings moved into a new `gantt.quickFilter` namespace, added to all ten built-in locale packs, and the call site now resolves them through the gantt package's existing `useGanttTranslation` — the same per-key hook every other gantt string already uses, so a host dictionary that lags on these keys still renders the bundled English default rather than a raw key. `gantt.quickFilter.resultSummary` deliberately keeps SINGLE-brace placeholders (`{shown}` / `{total}`): the call site substitutes them with a literal `.replace`, not i18next interpolation, matching `gantt.autoScheduleDlg.body` and the placeholder convention `all-locales-key-parity` already recognises. Anyone retranslating these packs must keep that spelling — a respell to `{{shown}}` would render the raw placeholder to the user.
|
|
451
|
+
|
|
452
|
+
- Updated dependencies [18cd432]
|
|
453
|
+
- Updated dependencies [b7165ce]
|
|
454
|
+
- Updated dependencies [532cf8b]
|
|
455
|
+
- Updated dependencies [680080a]
|
|
456
|
+
- Updated dependencies [a7651e6]
|
|
457
|
+
- Updated dependencies [d915c47]
|
|
458
|
+
- Updated dependencies [b71fc92]
|
|
459
|
+
- Updated dependencies [65516ba]
|
|
460
|
+
- Updated dependencies [94c5b7c]
|
|
461
|
+
- Updated dependencies [ca0fa8f]
|
|
462
|
+
- Updated dependencies [34595eb]
|
|
463
|
+
- Updated dependencies [3889ffb]
|
|
464
|
+
- Updated dependencies [5781fb1]
|
|
465
|
+
- Updated dependencies [7e2406a]
|
|
466
|
+
- Updated dependencies [bbbde12]
|
|
467
|
+
- Updated dependencies [5a24ad9]
|
|
468
|
+
- Updated dependencies [9e9e9a9]
|
|
469
|
+
- Updated dependencies [19b8c9b]
|
|
470
|
+
- Updated dependencies [56409c2]
|
|
471
|
+
- Updated dependencies [042e09d]
|
|
472
|
+
- Updated dependencies [7d08c3f]
|
|
473
|
+
- Updated dependencies [9cbcbf4]
|
|
474
|
+
- Updated dependencies [85c4c9c]
|
|
475
|
+
- Updated dependencies [fd54c3e]
|
|
476
|
+
- Updated dependencies [4eeb932]
|
|
477
|
+
- Updated dependencies [6fe485b]
|
|
478
|
+
- Updated dependencies [5c856ec]
|
|
479
|
+
- Updated dependencies [23018cc]
|
|
480
|
+
- Updated dependencies [58a00f0]
|
|
481
|
+
- Updated dependencies [53811d1]
|
|
482
|
+
- Updated dependencies [b17ce4c]
|
|
483
|
+
- Updated dependencies [68b6a28]
|
|
484
|
+
- Updated dependencies [0554e88]
|
|
485
|
+
- Updated dependencies [d915c47]
|
|
486
|
+
- Updated dependencies [f44d872]
|
|
487
|
+
- Updated dependencies [28b2e65]
|
|
488
|
+
- Updated dependencies [509104a]
|
|
489
|
+
- Updated dependencies [825bbe3]
|
|
490
|
+
- Updated dependencies [6195841]
|
|
491
|
+
- Updated dependencies [5dd0127]
|
|
492
|
+
- Updated dependencies [06632e9]
|
|
493
|
+
- Updated dependencies [c7fba27]
|
|
494
|
+
- Updated dependencies [a415684]
|
|
495
|
+
- Updated dependencies [a4cff5b]
|
|
496
|
+
- Updated dependencies [175bd79]
|
|
497
|
+
- Updated dependencies [5af2852]
|
|
498
|
+
- Updated dependencies [12bf669]
|
|
499
|
+
- Updated dependencies [34d9169]
|
|
500
|
+
- Updated dependencies [5881a2c]
|
|
501
|
+
- Updated dependencies [9bc3709]
|
|
502
|
+
- Updated dependencies [f833d3a]
|
|
503
|
+
- Updated dependencies [30ae33a]
|
|
504
|
+
- Updated dependencies [a6ec93d]
|
|
505
|
+
- Updated dependencies [2a9513d]
|
|
506
|
+
- Updated dependencies [49f7449]
|
|
507
|
+
- Updated dependencies [71be406]
|
|
508
|
+
- Updated dependencies [d22ae31]
|
|
509
|
+
- Updated dependencies [c7ed4c3]
|
|
510
|
+
- Updated dependencies [2409e1d]
|
|
511
|
+
- Updated dependencies [789fe3e]
|
|
512
|
+
- Updated dependencies [f789c3b]
|
|
513
|
+
- Updated dependencies [a321fa4]
|
|
514
|
+
- Updated dependencies [8d8094a]
|
|
515
|
+
- @object-ui/core@17.3.0
|
|
516
|
+
- @object-ui/fields@17.3.0
|
|
517
|
+
- @object-ui/components@17.3.0
|
|
518
|
+
- @object-ui/plugin-detail@17.3.0
|
|
519
|
+
- @object-ui/types@17.3.0
|
|
520
|
+
- @object-ui/i18n@17.3.0
|
|
521
|
+
- @object-ui/react@17.3.0
|
|
522
|
+
|
|
3
523
|
## 17.2.0
|
|
4
524
|
|
|
5
525
|
### Patch Changes
|
|
@@ -1109,6 +1629,7 @@ fields` formatters) and feeds `GanttView` a `task.fields` array that replaces
|
|
|
1109
1629
|
non-en/zh locales) and the `common.addToFavorites` /
|
|
1110
1630
|
`common.removeFromFavorites` keys across all ten built-in locales so
|
|
1111
1631
|
the `builtInLocales` parity tests pass.
|
|
1632
|
+
|
|
1112
1633
|
- @object-ui/components@5.0.2
|
|
1113
1634
|
- @object-ui/fields@5.0.2
|
|
1114
1635
|
- @object-ui/react@5.0.2
|
|
@@ -1408,6 +1929,7 @@ fields` formatters) and feeds `GanttView` a `task.fields` array that replaces
|
|
|
1408
1929
|
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.
|
|
1409
1930
|
|
|
1410
1931
|
Specifically fixes:
|
|
1932
|
+
|
|
1411
1933
|
- `@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.
|
|
1412
1934
|
- `@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.
|
|
1413
1935
|
- All plugin packages now use a unified `external: (id) => !/^[./]/.test(id) && !id.startsWith(__dirname)` rule, ensuring future additions of CJS deps are automatically externalized.
|
|
@@ -1466,24 +1988,29 @@ fields` formatters) and feeds `GanttView` a `task.fields` array that replaces
|
|
|
1466
1988
|
- a2d7023: End-user feature batch — forms, designer history, import/export, and PWA offline sync.
|
|
1467
1989
|
|
|
1468
1990
|
**Forms (`@object-ui/fields`, `@object-ui/providers`)**
|
|
1991
|
+
|
|
1469
1992
|
- `FileField`: native `<input capture="environment">` camera capture for mobile devices, plus a uploading-progress indicator driven by `UploadProvider`.
|
|
1470
1993
|
- `ImageField`: per-image inline crop/rotate via the lazy-loaded `ImageCropperDialog` (canvas-based, zero new deps).
|
|
1471
1994
|
- New `UploadProvider` in `@object-ui/providers` with pluggable adapters for S3 and Azure Blob (plus the default object-URL adapter for local previews). XHR-based with progress, abort, and retry.
|
|
1472
1995
|
- `LookupField`: `lookup.dependsOn: string | string[]` to chain dependent lookups (e.g. State depends on Country); the trigger is gated until parent values are present and the OData `$filter` is built automatically.
|
|
1473
1996
|
|
|
1474
1997
|
**Container-aware widget widths (`@object-ui/components`)**
|
|
1998
|
+
|
|
1475
1999
|
- New `useResizeObserver(ref)` hook exposing `{ width, height }` of any element. SSR-safe; reads the initial size via `getBoundingClientRect`.
|
|
1476
2000
|
- `plugin-gantt` and `plugin-kanban` now react to their container size instead of `window.innerWidth`, so they behave correctly inside split panels and dashboards.
|
|
1477
2001
|
|
|
1478
2002
|
**Designer history (`@object-ui/plugin-designer`)**
|
|
2003
|
+
|
|
1479
2004
|
- `useUndoRedo` (and therefore `useDesignerHistory`) gains `persistKey` + `storage` options to round-trip the undo/redo stack through `sessionStorage`, plus a `clearPersisted()` cleanup helper. Drafts now survive accidental tab refreshes.
|
|
1480
2005
|
- New `<HistoryPanel>` component renders the timeline visually with one-click jump-to-checkpoint via the new `jumpTo(index)` API.
|
|
1481
2006
|
|
|
1482
2007
|
**Import wizard (`@object-ui/plugin-grid`)**
|
|
2008
|
+
|
|
1483
2009
|
- Saved column-mapping templates: name, save, re-apply, and delete via a new template bar in the mapping step. Persisted under `objectui:import-templates:${objectName}` (override via `templateStorageKey` / `templateStorage`).
|
|
1484
2010
|
- Inline validation correction: cells with errors in the preview step are now editable; corrections feed straight into the import without requiring a re-upload, with green-bar status indicators for fixed rows.
|
|
1485
2011
|
|
|
1486
2012
|
**PWA offline sync (`@object-ui/mobile`)**
|
|
2013
|
+
|
|
1487
2014
|
- New `MemoryOfflineQueue` / `IndexedDbOfflineQueue` (`createOfflineQueue()` picks the best backend) backed by IndexedDB.
|
|
1488
2015
|
- `createOfflineDataSource(inner, { queue })` wraps any DataSource so mutations issued while offline (or that fail with a network-style error) are queued and replayed in order on reconnect. Includes `replay()`, `drop()`, `clear()`, `pending()`, an `onChange` notifier, and an opt-in `resolveConflict` hook for stale-write conflicts.
|
|
1489
2016
|
- New `useOfflineSync(source)` hook exposes `{ isOnline, pending, isReplaying, replay, drop, clear }` and auto-replays on the browser's `online` event.
|
|
@@ -1492,11 +2019,13 @@ fields` formatters) and feeds `GanttView` a `task.fields` array that replaces
|
|
|
1492
2019
|
- e93fe35: Mobile UX round 3 — Gantt and Map
|
|
1493
2020
|
|
|
1494
2021
|
**@object-ui/plugin-gantt**
|
|
2022
|
+
|
|
1495
2023
|
- Added a sticky vertical "Today" marker on the timeline plus a one-tap **Jump to Today** toolbar button so on-call users can re-orient the view instantly on small screens.
|
|
1496
2024
|
- Added a **collapsible task list** (toolbar toggle + auto-collapse on the first narrow render) so the timeline area gets the full viewport on phones.
|
|
1497
2025
|
- Added **pinch-to-zoom** touch gestures on the timeline; wired `columnWidthOverride` state so the existing zoom buttons also respond (previously a no-op).
|
|
1498
2026
|
|
|
1499
2027
|
**@object-ui/plugin-map**
|
|
2028
|
+
|
|
1500
2029
|
- Added a **geolocate button** with the standard `navigator.geolocation.getCurrentPosition` permission flow, an inline error banner, a busy state, and a **user-location marker** (blue dot) the map flies to on success.
|
|
1501
2030
|
- **Cluster tap-through**: tapping a cluster now flies the map in (zoom + 2, capped at 20) instead of just sitting there.
|
|
1502
2031
|
- On mobile, the desktop popup is replaced by a **bottom-sheet record card** with safe-area padding and an explicit close button. Desktop continues to use the popup.
|
package/README.md
CHANGED
|
@@ -422,17 +422,6 @@ const gantt: GanttSchema = {
|
|
|
422
422
|
};
|
|
423
423
|
```
|
|
424
424
|
|
|
425
|
-
<!-- release-metadata:v3.3.0 -->
|
|
426
|
-
|
|
427
|
-
## Compatibility
|
|
428
|
-
|
|
429
|
-
- **React:** 18.x or 19.x
|
|
430
|
-
- **Node.js:** ≥ 18
|
|
431
|
-
- **TypeScript:** ≥ 5.0 (strict mode)
|
|
432
|
-
- **`@objectstack/spec`:** ^3.3.0
|
|
433
|
-
- **`@objectstack/client`:** ^3.3.0
|
|
434
|
-
- **Tailwind CSS:** ≥ 3.4 (for packages with UI)
|
|
435
|
-
|
|
436
425
|
## Links
|
|
437
426
|
|
|
438
427
|
- 📚 [Documentation](https://www.objectui.org/docs/plugins/plugin-gantt)
|
package/dist/GanttView.d.ts
CHANGED
|
@@ -28,6 +28,15 @@ export declare function resolveBarDragMode(clientX: number, rect: {
|
|
|
28
28
|
* - `ss` start-to-start, `ff` finish-to-finish, `sf` start-to-finish
|
|
29
29
|
*/
|
|
30
30
|
export type GanttLinkType = 'fs' | 'ss' | 'ff' | 'sf';
|
|
31
|
+
/**
|
|
32
|
+
* Why the gantt's built-in drop-target policy refuses a dependency link
|
|
33
|
+
* (objectui#4158). These names are the leaves of `gantt.link.rejected.*`, so
|
|
34
|
+
* the message a user reads is selected by the same branch that did the
|
|
35
|
+
* refusing. Not a host-facing rejection channel — a host's own veto via
|
|
36
|
+
* `onBeforeDependencyCreate` carries a reason only the host knows, and
|
|
37
|
+
* surfacing that is a separate contract.
|
|
38
|
+
*/
|
|
39
|
+
export type GanttLinkRejection = 'self' | 'locked' | 'group' | 'cycle';
|
|
31
40
|
export interface GanttDependencyObject {
|
|
32
41
|
id: string | number;
|
|
33
42
|
type?: GanttLinkType;
|
package/dist/GanttView.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GanttView.d.ts","sourceRoot":"","sources":["../src/GanttView.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"GanttView.d.ts","sourceRoot":"","sources":["../src/GanttView.tsx"],"names":[],"mappings":"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"}
|