Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions .changeset/lookup-picker-draft-objects.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
---
"@object-ui/app-shell": patch
---

fix(studio): lookup target picker can see the package's own draft objects

When designing a set of related objects in one authoring pass, the field
inspector's lookup "related object" picker only listed **published** objects
(`list('object')`), so sibling objects still in draft — the ones you're most
likely to point a new lookup at — were invisible and had to be typed as a raw
API name, blind. The picker now also merges unpublished object drafts
(`listDrafts({ type: 'object' })`, labelled "(草稿)"), so a lookup can target a
sibling object before the package's first publish.
Original file line number Diff line number Diff line change
Expand Up @@ -1034,18 +1034,32 @@

React.useEffect(() => {
let cancelled = false;
client
.list<{ name?: string; label?: string }>('object')
.then((items) => {
Promise.all([
client.list<{ name?: string; label?: string }>('object'),
// Draft objects are not yet published, so `list('object')` can't see
// them. Include them so a lookup can target a SIBLING object being
// designed in the same authoring pass (before the package's first
// publish) instead of forcing the author to type an API name blind.
client.listDrafts({ type: 'object' }).catch(() => [] as Array<{ name?: string }>),

Check failure on line 1043 in packages/app-shell/src/views/metadata-admin/inspectors/ObjectFieldInspector.tsx

View workflow job for this annotation

GitHub Actions / Test

packages/app-shell/src/views/metadata-admin/inspectors/ObjectFieldInspector.test.tsx > ObjectFieldInspector — power props (conditional & validation) > offers conditional-required for non-text types too

TypeError: client.listDrafts is not a function ❯ packages/app-shell/src/views/metadata-admin/inspectors/ObjectFieldInspector.tsx:1043:14 ❯ Object.react_stack_bottom_frame node_modules/.pnpm/react-dom@19.2.7_react@19.2.7/node_modules/react-dom/cjs/react-dom-client.development.js:25989:20 ❯ runWithFiberInDEV node_modules/.pnpm/react-dom@19.2.7_react@19.2.7/node_modules/react-dom/cjs/react-dom-client.development.js:874:13 ❯ commitHookEffectListMount node_modules/.pnpm/react-dom@19.2.7_react@19.2.7/node_modules/react-dom/cjs/react-dom-client.development.js:13249:29 ❯ commitHookPassiveMountEffects node_modules/.pnpm/react-dom@19.2.7_react@19.2.7/node_modules/react-dom/cjs/react-dom-client.development.js:13336:11 ❯ commitPassiveMountOnFiber node_modules/.pnpm/react-dom@19.2.7_react@19.2.7/node_modules/react-dom/cjs/react-dom-client.development.js:15484:13 ❯ recursivelyTraversePassiveMountEffects node_modules/.pnpm/react-dom@19.2.7_react@19.2.7/node_modules/react-dom/cjs/react-dom-client.development.js:15439:11 ❯ commitPassiveMountOnFiber node_modules/.pnpm/react-dom@19.2.7_react@19.2.7/node_modules/react-dom/cjs/react-dom-client.development.js:15519:11 ❯ flushPassiveEffects node_modules/.pnpm/react-dom@19.2.7_react@19.2.7/node_modules/react-dom/cjs/react-dom-client.development.js:18432:9 ❯ flushPendingEffects node_modules/.pnpm/react-dom@19.2.7_react@19.2.7/node_modules/react-dom/cjs/react-dom-client.development.js:18358:14

Check failure on line 1043 in packages/app-shell/src/views/metadata-admin/inspectors/ObjectFieldInspector.tsx

View workflow job for this annotation

GitHub Actions / Test

packages/app-shell/src/views/metadata-admin/inspectors/ObjectFieldInspector.test.tsx > ObjectFieldInspector — power props (conditional & validation) > commits a conditional-required CEL predicate

TypeError: client.listDrafts is not a function ❯ packages/app-shell/src/views/metadata-admin/inspectors/ObjectFieldInspector.tsx:1043:14 ❯ Object.react_stack_bottom_frame node_modules/.pnpm/react-dom@19.2.7_react@19.2.7/node_modules/react-dom/cjs/react-dom-client.development.js:25989:20 ❯ runWithFiberInDEV node_modules/.pnpm/react-dom@19.2.7_react@19.2.7/node_modules/react-dom/cjs/react-dom-client.development.js:874:13 ❯ commitHookEffectListMount node_modules/.pnpm/react-dom@19.2.7_react@19.2.7/node_modules/react-dom/cjs/react-dom-client.development.js:13249:29 ❯ commitHookPassiveMountEffects node_modules/.pnpm/react-dom@19.2.7_react@19.2.7/node_modules/react-dom/cjs/react-dom-client.development.js:13336:11 ❯ commitPassiveMountOnFiber node_modules/.pnpm/react-dom@19.2.7_react@19.2.7/node_modules/react-dom/cjs/react-dom-client.development.js:15484:13 ❯ recursivelyTraversePassiveMountEffects node_modules/.pnpm/react-dom@19.2.7_react@19.2.7/node_modules/react-dom/cjs/react-dom-client.development.js:15439:11 ❯ commitPassiveMountOnFiber node_modules/.pnpm/react-dom@19.2.7_react@19.2.7/node_modules/react-dom/cjs/react-dom-client.development.js:15519:11 ❯ flushPassiveEffects node_modules/.pnpm/react-dom@19.2.7_react@19.2.7/node_modules/react-dom/cjs/react-dom-client.development.js:18432:9 ❯ flushPendingEffects node_modules/.pnpm/react-dom@19.2.7_react@19.2.7/node_modules/react-dom/cjs/react-dom-client.development.js:18358:14

Check failure on line 1043 in packages/app-shell/src/views/metadata-admin/inspectors/ObjectFieldInspector.tsx

View workflow job for this annotation

GitHub Actions / Test

packages/app-shell/src/views/metadata-admin/inspectors/ObjectFieldInspector.test.tsx > ObjectFieldInspector — power props (conditional & validation) > commits min length for text fields (alongside max length)

TypeError: client.listDrafts is not a function ❯ packages/app-shell/src/views/metadata-admin/inspectors/ObjectFieldInspector.tsx:1043:14 ❯ Object.react_stack_bottom_frame node_modules/.pnpm/react-dom@19.2.7_react@19.2.7/node_modules/react-dom/cjs/react-dom-client.development.js:25989:20 ❯ runWithFiberInDEV node_modules/.pnpm/react-dom@19.2.7_react@19.2.7/node_modules/react-dom/cjs/react-dom-client.development.js:874:13 ❯ commitHookEffectListMount node_modules/.pnpm/react-dom@19.2.7_react@19.2.7/node_modules/react-dom/cjs/react-dom-client.development.js:13249:29 ❯ commitHookPassiveMountEffects node_modules/.pnpm/react-dom@19.2.7_react@19.2.7/node_modules/react-dom/cjs/react-dom-client.development.js:13336:11 ❯ commitPassiveMountOnFiber node_modules/.pnpm/react-dom@19.2.7_react@19.2.7/node_modules/react-dom/cjs/react-dom-client.development.js:15484:13 ❯ recursivelyTraversePassiveMountEffects node_modules/.pnpm/react-dom@19.2.7_react@19.2.7/node_modules/react-dom/cjs/react-dom-client.development.js:15439:11 ❯ commitPassiveMountOnFiber node_modules/.pnpm/react-dom@19.2.7_react@19.2.7/node_modules/react-dom/cjs/react-dom-client.development.js:15519:11 ❯ flushPassiveEffects node_modules/.pnpm/react-dom@19.2.7_react@19.2.7/node_modules/react-dom/cjs/react-dom-client.development.js:18432:9 ❯ flushPendingEffects node_modules/.pnpm/react-dom@19.2.7_react@19.2.7/node_modules/react-dom/cjs/react-dom-client.development.js:18358:14

Check failure on line 1043 in packages/app-shell/src/views/metadata-admin/inspectors/ObjectFieldInspector.tsx

View workflow job for this annotation

GitHub Actions / Test

packages/app-shell/src/views/metadata-admin/inspectors/ObjectFieldInspector.test.tsx > ObjectFieldInspector — power props (conditional & validation) > commits inline help text

TypeError: client.listDrafts is not a function ❯ packages/app-shell/src/views/metadata-admin/inspectors/ObjectFieldInspector.tsx:1043:14 ❯ Object.react_stack_bottom_frame node_modules/.pnpm/react-dom@19.2.7_react@19.2.7/node_modules/react-dom/cjs/react-dom-client.development.js:25989:20 ❯ runWithFiberInDEV node_modules/.pnpm/react-dom@19.2.7_react@19.2.7/node_modules/react-dom/cjs/react-dom-client.development.js:874:13 ❯ commitHookEffectListMount node_modules/.pnpm/react-dom@19.2.7_react@19.2.7/node_modules/react-dom/cjs/react-dom-client.development.js:13249:29 ❯ commitHookPassiveMountEffects node_modules/.pnpm/react-dom@19.2.7_react@19.2.7/node_modules/react-dom/cjs/react-dom-client.development.js:13336:11 ❯ commitPassiveMountOnFiber node_modules/.pnpm/react-dom@19.2.7_react@19.2.7/node_modules/react-dom/cjs/react-dom-client.development.js:15484:13 ❯ recursivelyTraversePassiveMountEffects node_modules/.pnpm/react-dom@19.2.7_react@19.2.7/node_modules/react-dom/cjs/react-dom-client.development.js:15439:11 ❯ commitPassiveMountOnFiber node_modules/.pnpm/react-dom@19.2.7_react@19.2.7/node_modules/react-dom/cjs/react-dom-client.development.js:15519:11 ❯ flushPassiveEffects node_modules/.pnpm/react-dom@19.2.7_react@19.2.7/node_modules/react-dom/cjs/react-dom-client.development.js:18432:9 ❯ flushPendingEffects node_modules/.pnpm/react-dom@19.2.7_react@19.2.7/node_modules/react-dom/cjs/react-dom-client.development.js:18358:14

Check failure on line 1043 in packages/app-shell/src/views/metadata-admin/inspectors/ObjectFieldInspector.tsx

View workflow job for this annotation

GitHub Actions / Test

packages/app-shell/src/views/metadata-admin/inspectors/ObjectFieldInspector.test.tsx > ObjectFieldInspector — default value > omits the default-value editor for lookup fields

TypeError: client.listDrafts is not a function ❯ packages/app-shell/src/views/metadata-admin/inspectors/ObjectFieldInspector.tsx:1043:14 ❯ Object.react_stack_bottom_frame node_modules/.pnpm/react-dom@19.2.7_react@19.2.7/node_modules/react-dom/cjs/react-dom-client.development.js:25989:20 ❯ runWithFiberInDEV node_modules/.pnpm/react-dom@19.2.7_react@19.2.7/node_modules/react-dom/cjs/react-dom-client.development.js:874:13 ❯ commitHookEffectListMount node_modules/.pnpm/react-dom@19.2.7_react@19.2.7/node_modules/react-dom/cjs/react-dom-client.development.js:13249:29 ❯ commitHookPassiveMountEffects node_modules/.pnpm/react-dom@19.2.7_react@19.2.7/node_modules/react-dom/cjs/react-dom-client.development.js:13336:11 ❯ commitPassiveMountOnFiber node_modules/.pnpm/react-dom@19.2.7_react@19.2.7/node_modules/react-dom/cjs/react-dom-client.development.js:15484:13 ❯ recursivelyTraversePassiveMountEffects node_modules/.pnpm/react-dom@19.2.7_react@19.2.7/node_modules/react-dom/cjs/react-dom-client.development.js:15439:11 ❯ commitPassiveMountOnFiber node_modules/.pnpm/react-dom@19.2.7_react@19.2.7/node_modules/react-dom/cjs/react-dom-client.development.js:15519:11 ❯ flushPassiveEffects node_modules/.pnpm/react-dom@19.2.7_react@19.2.7/node_modules/react-dom/cjs/react-dom-client.development.js:18432:9 ❯ flushPendingEffects node_modules/.pnpm/react-dom@19.2.7_react@19.2.7/node_modules/react-dom/cjs/react-dom-client.development.js:18358:14

Check failure on line 1043 in packages/app-shell/src/views/metadata-admin/inspectors/ObjectFieldInspector.tsx

View workflow job for this annotation

GitHub Actions / Test

packages/app-shell/src/views/metadata-admin/inspectors/ObjectFieldInspector.test.tsx > ObjectFieldInspector — default value > omits the default-value editor for computed fields

TypeError: client.listDrafts is not a function ❯ packages/app-shell/src/views/metadata-admin/inspectors/ObjectFieldInspector.tsx:1043:14 ❯ Object.react_stack_bottom_frame node_modules/.pnpm/react-dom@19.2.7_react@19.2.7/node_modules/react-dom/cjs/react-dom-client.development.js:25989:20 ❯ runWithFiberInDEV node_modules/.pnpm/react-dom@19.2.7_react@19.2.7/node_modules/react-dom/cjs/react-dom-client.development.js:874:13 ❯ commitHookEffectListMount node_modules/.pnpm/react-dom@19.2.7_react@19.2.7/node_modules/react-dom/cjs/react-dom-client.development.js:13249:29 ❯ commitHookPassiveMountEffects node_modules/.pnpm/react-dom@19.2.7_react@19.2.7/node_modules/react-dom/cjs/react-dom-client.development.js:13336:11 ❯ commitPassiveMountOnFiber node_modules/.pnpm/react-dom@19.2.7_react@19.2.7/node_modules/react-dom/cjs/react-dom-client.development.js:15484:13 ❯ recursivelyTraversePassiveMountEffects node_modules/.pnpm/react-dom@19.2.7_react@19.2.7/node_modules/react-dom/cjs/react-dom-client.development.js:15439:11 ❯ commitPassiveMountOnFiber node_modules/.pnpm/react-dom@19.2.7_react@19.2.7/node_modules/react-dom/cjs/react-dom-client.development.js:15519:11 ❯ flushPassiveEffects node_modules/.pnpm/react-dom@19.2.7_react@19.2.7/node_modules/react-dom/cjs/react-dom-client.development.js:18432:9 ❯ flushPendingEffects node_modules/.pnpm/react-dom@19.2.7_react@19.2.7/node_modules/react-dom/cjs/react-dom-client.development.js:18358:14

Check failure on line 1043 in packages/app-shell/src/views/metadata-admin/inspectors/ObjectFieldInspector.tsx

View workflow job for this annotation

GitHub Actions / Test

packages/app-shell/src/views/metadata-admin/inspectors/ObjectFieldInspector.test.tsx > ObjectFieldInspector — default value > offers a select (not a text box) default for a boolean field

TypeError: client.listDrafts is not a function ❯ packages/app-shell/src/views/metadata-admin/inspectors/ObjectFieldInspector.tsx:1043:14 ❯ Object.react_stack_bottom_frame node_modules/.pnpm/react-dom@19.2.7_react@19.2.7/node_modules/react-dom/cjs/react-dom-client.development.js:25989:20 ❯ runWithFiberInDEV node_modules/.pnpm/react-dom@19.2.7_react@19.2.7/node_modules/react-dom/cjs/react-dom-client.development.js:874:13 ❯ commitHookEffectListMount node_modules/.pnpm/react-dom@19.2.7_react@19.2.7/node_modules/react-dom/cjs/react-dom-client.development.js:13249:29 ❯ commitHookPassiveMountEffects node_modules/.pnpm/react-dom@19.2.7_react@19.2.7/node_modules/react-dom/cjs/react-dom-client.development.js:13336:11 ❯ commitPassiveMountOnFiber node_modules/.pnpm/react-dom@19.2.7_react@19.2.7/node_modules/react-dom/cjs/react-dom-client.development.js:15484:13 ❯ recursivelyTraversePassiveMountEffects node_modules/.pnpm/react-dom@19.2.7_react@19.2.7/node_modules/react-dom/cjs/react-dom-client.development.js:15439:11 ❯ commitPassiveMountOnFiber node_modules/.pnpm/react-dom@19.2.7_react@19.2.7/node_modules/react-dom/cjs/react-dom-client.development.js:15519:11 ❯ flushPassiveEffects node_modules/.pnpm/react-dom@19.2.7_react@19.2.7/node_modules/react-dom/cjs/react-dom-client.development.js:18432:9 ❯ flushPendingEffects node_modules/.pnpm/react-dom@19.2.7_react@19.2.7/node_modules/react-dom/cjs/react-dom-client.development.js:18358:14

Check failure on line 1043 in packages/app-shell/src/views/metadata-admin/inspectors/ObjectFieldInspector.tsx

View workflow job for this annotation

GitHub Actions / Test

packages/app-shell/src/views/metadata-admin/inspectors/ObjectFieldInspector.test.tsx > ObjectFieldInspector — default value > commits a text default for a text field

TypeError: client.listDrafts is not a function ❯ packages/app-shell/src/views/metadata-admin/inspectors/ObjectFieldInspector.tsx:1043:14 ❯ Object.react_stack_bottom_frame node_modules/.pnpm/react-dom@19.2.7_react@19.2.7/node_modules/react-dom/cjs/react-dom-client.development.js:25989:20 ❯ runWithFiberInDEV node_modules/.pnpm/react-dom@19.2.7_react@19.2.7/node_modules/react-dom/cjs/react-dom-client.development.js:874:13 ❯ commitHookEffectListMount node_modules/.pnpm/react-dom@19.2.7_react@19.2.7/node_modules/react-dom/cjs/react-dom-client.development.js:13249:29 ❯ commitHookPassiveMountEffects node_modules/.pnpm/react-dom@19.2.7_react@19.2.7/node_modules/react-dom/cjs/react-dom-client.development.js:13336:11 ❯ commitPassiveMountOnFiber node_modules/.pnpm/react-dom@19.2.7_react@19.2.7/node_modules/react-dom/cjs/react-dom-client.development.js:15484:13 ❯ recursivelyTraversePassiveMountEffects node_modules/.pnpm/react-dom@19.2.7_react@19.2.7/node_modules/react-dom/cjs/react-dom-client.development.js:15439:11 ❯ commitPassiveMountOnFiber node_modules/.pnpm/react-dom@19.2.7_react@19.2.7/node_modules/react-dom/cjs/react-dom-client.development.js:15519:11 ❯ flushPassiveEffects node_modules/.pnpm/react-dom@19.2.7_react@19.2.7/node_modules/react-dom/cjs/react-dom-client.development.js:18432:9 ❯ flushPendingEffects node_modules/.pnpm/react-dom@19.2.7_react@19.2.7/node_modules/react-dom/cjs/react-dom-client.development.js:18358:14

Check failure on line 1043 in packages/app-shell/src/views/metadata-admin/inspectors/ObjectFieldInspector.tsx

View workflow job for this annotation

GitHub Actions / Test

packages/app-shell/src/views/metadata-admin/inspectors/ObjectFieldInspector.test.tsx > ObjectFieldInspector — duplicate field > avoids name collisions when a copy already exists

TypeError: client.listDrafts is not a function ❯ packages/app-shell/src/views/metadata-admin/inspectors/ObjectFieldInspector.tsx:1043:14 ❯ Object.react_stack_bottom_frame node_modules/.pnpm/react-dom@19.2.7_react@19.2.7/node_modules/react-dom/cjs/react-dom-client.development.js:25989:20 ❯ runWithFiberInDEV node_modules/.pnpm/react-dom@19.2.7_react@19.2.7/node_modules/react-dom/cjs/react-dom-client.development.js:874:13 ❯ commitHookEffectListMount node_modules/.pnpm/react-dom@19.2.7_react@19.2.7/node_modules/react-dom/cjs/react-dom-client.development.js:13249:29 ❯ commitHookPassiveMountEffects node_modules/.pnpm/react-dom@19.2.7_react@19.2.7/node_modules/react-dom/cjs/react-dom-client.development.js:13336:11 ❯ commitPassiveMountOnFiber node_modules/.pnpm/react-dom@19.2.7_react@19.2.7/node_modules/react-dom/cjs/react-dom-client.development.js:15484:13 ❯ recursivelyTraversePassiveMountEffects node_modules/.pnpm/react-dom@19.2.7_react@19.2.7/node_modules/react-dom/cjs/react-dom-client.development.js:15439:11 ❯ commitPassiveMountOnFiber node_modules/.pnpm/react-dom@19.2.7_react@19.2.7/node_modules/react-dom/cjs/react-dom-client.development.js:15519:11 ❯ flushPassiveEffects node_modules/.pnpm/react-dom@19.2.7_react@19.2.7/node_modules/react-dom/cjs/react-dom-client.development.js:18432:9 ❯ flushPendingEffects node_modules/.pnpm/react-dom@19.2.7_react@19.2.7/node_modules/react-dom/cjs/react-dom-client.development.js:18358:14

Check failure on line 1043 in packages/app-shell/src/views/metadata-admin/inspectors/ObjectFieldInspector.tsx

View workflow job for this annotation

GitHub Actions / Test

packages/app-shell/src/views/metadata-admin/inspectors/ObjectFieldInspector.test.tsx > ObjectFieldInspector — duplicate field > clones the field below itself with a unique name and selects it

TypeError: client.listDrafts is not a function ❯ packages/app-shell/src/views/metadata-admin/inspectors/ObjectFieldInspector.tsx:1043:14 ❯ Object.react_stack_bottom_frame node_modules/.pnpm/react-dom@19.2.7_react@19.2.7/node_modules/react-dom/cjs/react-dom-client.development.js:25989:20 ❯ runWithFiberInDEV node_modules/.pnpm/react-dom@19.2.7_react@19.2.7/node_modules/react-dom/cjs/react-dom-client.development.js:874:13 ❯ commitHookEffectListMount node_modules/.pnpm/react-dom@19.2.7_react@19.2.7/node_modules/react-dom/cjs/react-dom-client.development.js:13249:29 ❯ commitHookPassiveMountEffects node_modules/.pnpm/react-dom@19.2.7_react@19.2.7/node_modules/react-dom/cjs/react-dom-client.development.js:13336:11 ❯ commitPassiveMountOnFiber node_modules/.pnpm/react-dom@19.2.7_react@19.2.7/node_modules/react-dom/cjs/react-dom-client.development.js:15484:13 ❯ recursivelyTraversePassiveMountEffects node_modules/.pnpm/react-dom@19.2.7_react@19.2.7/node_modules/react-dom/cjs/react-dom-client.development.js:15439:11 ❯ commitPassiveMountOnFiber node_modules/.pnpm/react-dom@19.2.7_react@19.2.7/node_modules/react-dom/cjs/react-dom-client.development.js:15519:11 ❯ flushPassiveEffects node_modules/.pnpm/react-dom@19.2.7_react@19.2.7/node_modules/react-dom/cjs/react-dom-client.development.js:18432:9 ❯ flushPendingEffects node_modules/.pnpm/react-dom@19.2.7_react@19.2.7/node_modules/react-dom/cjs/react-dom-client.development.js:18358:14
])
.then(([published, drafts]) => {
if (cancelled) return;
const mapped = items
.filter((i) => typeof i?.name === 'string' && i.name)
.map((i) => ({
value: i.name as string,
label: i.label ? `${i.label} (${i.name})` : (i.name as string),
}))
.sort((a, b) => a.value.localeCompare(b.value));
setOpts(mapped);
const byName = new Map<string, { value: string; label: string }>();
for (const i of published ?? []) {
if (typeof i?.name === 'string' && i.name && !byName.has(i.name)) {
byName.set(i.name, {
value: i.name,
label: i.label ? `${i.label} (${i.name})` : i.name,
});
}
}
for (const d of drafts ?? []) {
const name = (d as { name?: string }).name;
if (typeof name === 'string' && name && !byName.has(name)) {
byName.set(name, { value: name, label: `${name} (草稿)` });
}
}
setOpts([...byName.values()].sort((a, b) => a.value.localeCompare(b.value)));
})
.catch(() => {
// Empty list — picker falls back to free-text. No banner needed.
Expand Down
Loading