@btst/stack 2.11.4 → 2.11.5
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/dist/packages/stack/src/plugins/cms/client/components/forms/content-form.cjs +58 -34
- package/dist/packages/stack/src/plugins/cms/client/components/forms/content-form.mjs +58 -34
- package/dist/packages/stack/src/plugins/cms/client/components/inverse-relations-panel.cjs +29 -7
- package/dist/packages/stack/src/plugins/cms/client/components/inverse-relations-panel.mjs +29 -7
- package/dist/packages/ui/src/components/auto-form/helpers.cjs +24 -1
- package/dist/packages/ui/src/components/auto-form/helpers.mjs +24 -1
- package/dist/plugins/blog/api/index.d.cts +3 -2
- package/dist/plugins/blog/api/index.d.mts +3 -2
- package/dist/plugins/blog/api/index.d.ts +3 -2
- package/dist/plugins/blog/client/components/index.cjs +21 -0
- package/dist/plugins/blog/client/components/index.d.cts +71 -1
- package/dist/plugins/blog/client/components/index.d.mts +71 -1
- package/dist/plugins/blog/client/components/index.d.ts +71 -1
- package/dist/plugins/blog/client/components/index.mjs +15 -1
- package/dist/plugins/blog/client/hooks/index.d.cts +3 -2
- package/dist/plugins/blog/client/hooks/index.d.mts +3 -2
- package/dist/plugins/blog/client/hooks/index.d.ts +3 -2
- package/dist/plugins/blog/client/index.d.cts +3 -2
- package/dist/plugins/blog/client/index.d.mts +3 -2
- package/dist/plugins/blog/client/index.d.ts +3 -2
- package/dist/plugins/blog/query-keys.d.cts +3 -2
- package/dist/plugins/blog/query-keys.d.mts +3 -2
- package/dist/plugins/blog/query-keys.d.ts +3 -2
- package/dist/plugins/kanban/api/index.d.cts +1 -1
- package/dist/plugins/kanban/api/index.d.mts +1 -1
- package/dist/plugins/kanban/api/index.d.ts +1 -1
- package/dist/plugins/kanban/query-keys.d.cts +1 -1
- package/dist/plugins/kanban/query-keys.d.mts +1 -1
- package/dist/plugins/kanban/query-keys.d.ts +1 -1
- package/dist/shared/{stack.6mEHS2WH.d.mts → stack.BnSAhKJi.d.ts} +4 -3
- package/dist/shared/{stack.C1jLzFZ6.d.mts → stack.CLWhMntf.d.cts} +6 -5
- package/dist/shared/{stack.BQmuNl5p.d.mts → stack.CuhcFsAx.d.cts} +3 -38
- package/dist/shared/{stack.BQmuNl5p.d.ts → stack.CuhcFsAx.d.mts} +3 -38
- package/dist/shared/{stack.BQmuNl5p.d.cts → stack.CuhcFsAx.d.ts} +3 -38
- package/dist/shared/{stack.AJTXI7kw.d.cts → stack.DNLuzDb3.d.cts} +4 -3
- package/dist/shared/{stack.QYn-Px94.d.ts → stack.Dfc44JiE.d.mts} +4 -3
- package/dist/shared/{stack.DF1ewpVE.d.ts → stack.DiodAFAa.d.mts} +6 -5
- package/dist/shared/stack.Dsatjh0B.d.cts +35 -0
- package/dist/shared/stack.Dsatjh0B.d.mts +35 -0
- package/dist/shared/stack.Dsatjh0B.d.ts +35 -0
- package/dist/shared/{stack.XulPeAD3.d.cts → stack.ufcExQIR.d.ts} +6 -5
- package/package.json +14 -1
- package/src/plugins/blog/client/components/index.tsx +52 -0
- package/src/plugins/cms/__tests__/auto-form-nested-config.test.ts +177 -0
- package/src/plugins/cms/client/components/forms/content-form.tsx +93 -47
- package/src/plugins/cms/client/components/inverse-relations-panel.tsx +49 -1
- package/dist/shared/{stack.j5SFLC1d.d.ts → stack.D4Cea8II.d.ts} +13 -13
- package/dist/shared/{stack.Bzfx-_lq.d.mts → stack.HE_IvqV5.d.mts} +13 -13
- package/dist/shared/{stack.B6S3cgwN.d.cts → stack.Rtcvl8sS.d.cts} +13 -13
|
@@ -95,6 +95,19 @@ export function InverseRelationsPanel({
|
|
|
95
95
|
return null;
|
|
96
96
|
}
|
|
97
97
|
|
|
98
|
+
// When a single source content type has multiple belongsTo fields pointing
|
|
99
|
+
// at this target type (e.g. StackSynergy has both compoundAId and
|
|
100
|
+
// compoundBId → compound), the section title alone ("Stack Synergy") is
|
|
101
|
+
// ambiguous — two cards would render with identical headings. Mark those
|
|
102
|
+
// relations so we can disambiguate them by field name.
|
|
103
|
+
const sourceTypeCounts = new Map<string, number>();
|
|
104
|
+
for (const rel of inverseRelations) {
|
|
105
|
+
sourceTypeCounts.set(
|
|
106
|
+
rel.sourceType,
|
|
107
|
+
(sourceTypeCounts.get(rel.sourceType) ?? 0) + 1,
|
|
108
|
+
);
|
|
109
|
+
}
|
|
110
|
+
|
|
98
111
|
return (
|
|
99
112
|
<div className="space-y-4">
|
|
100
113
|
<h3 className="text-lg font-semibold">Related Items</h3>
|
|
@@ -109,12 +122,32 @@ export function InverseRelationsPanel({
|
|
|
109
122
|
Link={Link}
|
|
110
123
|
client={client}
|
|
111
124
|
headers={headers}
|
|
125
|
+
ambiguous={(sourceTypeCounts.get(relation.sourceType) ?? 0) > 1}
|
|
112
126
|
/>
|
|
113
127
|
))}
|
|
114
128
|
</div>
|
|
115
129
|
);
|
|
116
130
|
}
|
|
117
131
|
|
|
132
|
+
/**
|
|
133
|
+
* Turn a relation field name like `compoundAId` / `categoryIds` into a
|
|
134
|
+
* friendlier label like `Compound A` / `Category` for display in the
|
|
135
|
+
* inverse-relations panel when two sections would otherwise share a title.
|
|
136
|
+
*
|
|
137
|
+
* Strips a trailing `Id` or `Ids`, splits camelCase boundaries, and
|
|
138
|
+
* title-cases the result. Leaves unrecognised shapes as-is so we never
|
|
139
|
+
* produce an empty string.
|
|
140
|
+
*/
|
|
141
|
+
function humanizeFieldName(fieldName: string): string {
|
|
142
|
+
const stripped = fieldName.replace(/Ids?$/, "") || fieldName;
|
|
143
|
+
const words = stripped
|
|
144
|
+
.replace(/([a-z0-9])([A-Z])/g, "$1 $2")
|
|
145
|
+
.replace(/[_-]+/g, " ")
|
|
146
|
+
.trim()
|
|
147
|
+
.split(/\s+/);
|
|
148
|
+
return words.map((w) => (w ? w[0]!.toUpperCase() + w.slice(1) : w)).join(" ");
|
|
149
|
+
}
|
|
150
|
+
|
|
118
151
|
interface InverseRelationSectionProps {
|
|
119
152
|
relation: InverseRelation;
|
|
120
153
|
contentTypeSlug: string;
|
|
@@ -128,6 +161,12 @@ interface InverseRelationSectionProps {
|
|
|
128
161
|
}>;
|
|
129
162
|
client: ReturnType<typeof createApiClient<CMSApiRouter>>;
|
|
130
163
|
headers?: HeadersInit;
|
|
164
|
+
/**
|
|
165
|
+
* True when another inverse relation from the same `sourceType` is also
|
|
166
|
+
* being rendered — in which case the field-name suffix is shown so the
|
|
167
|
+
* user can tell the two cards apart.
|
|
168
|
+
*/
|
|
169
|
+
ambiguous: boolean;
|
|
131
170
|
}
|
|
132
171
|
|
|
133
172
|
function InverseRelationSection({
|
|
@@ -139,6 +178,7 @@ function InverseRelationSection({
|
|
|
139
178
|
Link,
|
|
140
179
|
client,
|
|
141
180
|
headers,
|
|
181
|
+
ambiguous,
|
|
142
182
|
}: InverseRelationSectionProps) {
|
|
143
183
|
const [isExpanded, setIsExpanded] = useState(true);
|
|
144
184
|
const [deleteItemId, setDeleteItemId] = useState<string | null>(null);
|
|
@@ -205,6 +245,7 @@ function InverseRelationSection({
|
|
|
205
245
|
};
|
|
206
246
|
|
|
207
247
|
const LinkComponent = Link ?? "a";
|
|
248
|
+
const fieldLabel = ambiguous ? humanizeFieldName(relation.fieldName) : null;
|
|
208
249
|
|
|
209
250
|
return (
|
|
210
251
|
<Card>
|
|
@@ -220,7 +261,13 @@ function InverseRelationSection({
|
|
|
220
261
|
) : (
|
|
221
262
|
<ChevronRight className="h-4 w-4" />
|
|
222
263
|
)}
|
|
223
|
-
{relation.sourceTypeName}
|
|
264
|
+
<span>{relation.sourceTypeName}</span>
|
|
265
|
+
{fieldLabel && (
|
|
266
|
+
<span className="font-normal text-muted-foreground">
|
|
267
|
+
· {fieldLabel}
|
|
268
|
+
</span>
|
|
269
|
+
)}
|
|
270
|
+
<span className="font-normal text-muted-foreground">({total})</span>
|
|
224
271
|
</CardTitle>
|
|
225
272
|
</button>
|
|
226
273
|
</CardHeader>
|
|
@@ -269,6 +316,7 @@ function InverseRelationSection({
|
|
|
269
316
|
>
|
|
270
317
|
<Plus className="h-4 w-4 mr-2" />
|
|
271
318
|
Add {relation.sourceTypeName}
|
|
319
|
+
{fieldLabel ? ` (${fieldLabel})` : ""}
|
|
272
320
|
</Button>
|
|
273
321
|
</div>
|
|
274
322
|
</CardContent>
|
|
@@ -7,12 +7,12 @@ import { QueryClient } from '@tanstack/react-query';
|
|
|
7
7
|
|
|
8
8
|
declare const createBoardSchema: z.ZodObject<{
|
|
9
9
|
description: z.ZodOptional<z.ZodString>;
|
|
10
|
+
name: z.ZodString;
|
|
11
|
+
createdAt: z.ZodOptional<z.ZodCoercedDate<unknown>>;
|
|
12
|
+
updatedAt: z.ZodOptional<z.ZodCoercedDate<unknown>>;
|
|
10
13
|
slug: z.ZodOptional<z.ZodString>;
|
|
11
14
|
ownerId: z.ZodOptional<z.ZodString>;
|
|
12
15
|
organizationId: z.ZodOptional<z.ZodString>;
|
|
13
|
-
createdAt: z.ZodOptional<z.ZodCoercedDate<unknown>>;
|
|
14
|
-
updatedAt: z.ZodOptional<z.ZodCoercedDate<unknown>>;
|
|
15
|
-
name: z.ZodString;
|
|
16
16
|
}, z.core.$strip>;
|
|
17
17
|
declare const updateBoardSchema: z.ZodObject<{
|
|
18
18
|
createdAt: z.ZodOptional<z.ZodOptional<z.ZodCoercedDate<unknown>>>;
|
|
@@ -331,19 +331,19 @@ declare const kanbanBackendPlugin: (hooks?: KanbanBackendHooks) => _btst_stack_p
|
|
|
331
331
|
body: better_call.StandardSchemaV1<{
|
|
332
332
|
name: string;
|
|
333
333
|
description?: string | undefined;
|
|
334
|
+
createdAt?: unknown;
|
|
335
|
+
updatedAt?: unknown;
|
|
334
336
|
slug?: string | undefined;
|
|
335
337
|
ownerId?: string | undefined;
|
|
336
338
|
organizationId?: string | undefined;
|
|
337
|
-
createdAt?: unknown;
|
|
338
|
-
updatedAt?: unknown;
|
|
339
339
|
}, {
|
|
340
340
|
name: string;
|
|
341
341
|
description?: string | undefined;
|
|
342
|
+
createdAt?: unknown;
|
|
343
|
+
updatedAt?: unknown;
|
|
342
344
|
slug?: string | undefined;
|
|
343
345
|
ownerId?: string | undefined;
|
|
344
346
|
organizationId?: string | undefined;
|
|
345
|
-
createdAt?: unknown;
|
|
346
|
-
updatedAt?: unknown;
|
|
347
347
|
}>;
|
|
348
348
|
}, {
|
|
349
349
|
columns: ColumnWithTasks[];
|
|
@@ -360,20 +360,20 @@ declare const kanbanBackendPlugin: (hooks?: KanbanBackendHooks) => _btst_stack_p
|
|
|
360
360
|
method: "PUT";
|
|
361
361
|
body: better_call.StandardSchemaV1<{
|
|
362
362
|
description?: string | undefined;
|
|
363
|
+
name?: string | undefined;
|
|
364
|
+
createdAt?: unknown;
|
|
365
|
+
updatedAt?: unknown;
|
|
363
366
|
slug?: string | undefined;
|
|
364
367
|
ownerId?: string | undefined;
|
|
365
368
|
organizationId?: string | undefined;
|
|
366
|
-
createdAt?: unknown;
|
|
367
|
-
updatedAt?: unknown;
|
|
368
|
-
name?: string | undefined;
|
|
369
369
|
}, {
|
|
370
370
|
description?: string | undefined;
|
|
371
|
+
name?: string | undefined;
|
|
372
|
+
createdAt?: unknown;
|
|
373
|
+
updatedAt?: unknown;
|
|
371
374
|
slug?: string | undefined;
|
|
372
375
|
ownerId?: string | undefined;
|
|
373
376
|
organizationId?: string | undefined;
|
|
374
|
-
createdAt?: unknown;
|
|
375
|
-
updatedAt?: unknown;
|
|
376
|
-
name?: string | undefined;
|
|
377
377
|
}>;
|
|
378
378
|
}, Board>;
|
|
379
379
|
readonly deleteBoard: better_call.StrictEndpoint<"/boards/:id", {} & {
|
|
@@ -7,12 +7,12 @@ import { QueryClient } from '@tanstack/react-query';
|
|
|
7
7
|
|
|
8
8
|
declare const createBoardSchema: z.ZodObject<{
|
|
9
9
|
description: z.ZodOptional<z.ZodString>;
|
|
10
|
+
name: z.ZodString;
|
|
11
|
+
createdAt: z.ZodOptional<z.ZodCoercedDate<unknown>>;
|
|
12
|
+
updatedAt: z.ZodOptional<z.ZodCoercedDate<unknown>>;
|
|
10
13
|
slug: z.ZodOptional<z.ZodString>;
|
|
11
14
|
ownerId: z.ZodOptional<z.ZodString>;
|
|
12
15
|
organizationId: z.ZodOptional<z.ZodString>;
|
|
13
|
-
createdAt: z.ZodOptional<z.ZodCoercedDate<unknown>>;
|
|
14
|
-
updatedAt: z.ZodOptional<z.ZodCoercedDate<unknown>>;
|
|
15
|
-
name: z.ZodString;
|
|
16
16
|
}, z.core.$strip>;
|
|
17
17
|
declare const updateBoardSchema: z.ZodObject<{
|
|
18
18
|
createdAt: z.ZodOptional<z.ZodOptional<z.ZodCoercedDate<unknown>>>;
|
|
@@ -331,19 +331,19 @@ declare const kanbanBackendPlugin: (hooks?: KanbanBackendHooks) => _btst_stack_p
|
|
|
331
331
|
body: better_call.StandardSchemaV1<{
|
|
332
332
|
name: string;
|
|
333
333
|
description?: string | undefined;
|
|
334
|
+
createdAt?: unknown;
|
|
335
|
+
updatedAt?: unknown;
|
|
334
336
|
slug?: string | undefined;
|
|
335
337
|
ownerId?: string | undefined;
|
|
336
338
|
organizationId?: string | undefined;
|
|
337
|
-
createdAt?: unknown;
|
|
338
|
-
updatedAt?: unknown;
|
|
339
339
|
}, {
|
|
340
340
|
name: string;
|
|
341
341
|
description?: string | undefined;
|
|
342
|
+
createdAt?: unknown;
|
|
343
|
+
updatedAt?: unknown;
|
|
342
344
|
slug?: string | undefined;
|
|
343
345
|
ownerId?: string | undefined;
|
|
344
346
|
organizationId?: string | undefined;
|
|
345
|
-
createdAt?: unknown;
|
|
346
|
-
updatedAt?: unknown;
|
|
347
347
|
}>;
|
|
348
348
|
}, {
|
|
349
349
|
columns: ColumnWithTasks[];
|
|
@@ -360,20 +360,20 @@ declare const kanbanBackendPlugin: (hooks?: KanbanBackendHooks) => _btst_stack_p
|
|
|
360
360
|
method: "PUT";
|
|
361
361
|
body: better_call.StandardSchemaV1<{
|
|
362
362
|
description?: string | undefined;
|
|
363
|
+
name?: string | undefined;
|
|
364
|
+
createdAt?: unknown;
|
|
365
|
+
updatedAt?: unknown;
|
|
363
366
|
slug?: string | undefined;
|
|
364
367
|
ownerId?: string | undefined;
|
|
365
368
|
organizationId?: string | undefined;
|
|
366
|
-
createdAt?: unknown;
|
|
367
|
-
updatedAt?: unknown;
|
|
368
|
-
name?: string | undefined;
|
|
369
369
|
}, {
|
|
370
370
|
description?: string | undefined;
|
|
371
|
+
name?: string | undefined;
|
|
372
|
+
createdAt?: unknown;
|
|
373
|
+
updatedAt?: unknown;
|
|
371
374
|
slug?: string | undefined;
|
|
372
375
|
ownerId?: string | undefined;
|
|
373
376
|
organizationId?: string | undefined;
|
|
374
|
-
createdAt?: unknown;
|
|
375
|
-
updatedAt?: unknown;
|
|
376
|
-
name?: string | undefined;
|
|
377
377
|
}>;
|
|
378
378
|
}, Board>;
|
|
379
379
|
readonly deleteBoard: better_call.StrictEndpoint<"/boards/:id", {} & {
|
|
@@ -7,12 +7,12 @@ import { QueryClient } from '@tanstack/react-query';
|
|
|
7
7
|
|
|
8
8
|
declare const createBoardSchema: z.ZodObject<{
|
|
9
9
|
description: z.ZodOptional<z.ZodString>;
|
|
10
|
+
name: z.ZodString;
|
|
11
|
+
createdAt: z.ZodOptional<z.ZodCoercedDate<unknown>>;
|
|
12
|
+
updatedAt: z.ZodOptional<z.ZodCoercedDate<unknown>>;
|
|
10
13
|
slug: z.ZodOptional<z.ZodString>;
|
|
11
14
|
ownerId: z.ZodOptional<z.ZodString>;
|
|
12
15
|
organizationId: z.ZodOptional<z.ZodString>;
|
|
13
|
-
createdAt: z.ZodOptional<z.ZodCoercedDate<unknown>>;
|
|
14
|
-
updatedAt: z.ZodOptional<z.ZodCoercedDate<unknown>>;
|
|
15
|
-
name: z.ZodString;
|
|
16
16
|
}, z.core.$strip>;
|
|
17
17
|
declare const updateBoardSchema: z.ZodObject<{
|
|
18
18
|
createdAt: z.ZodOptional<z.ZodOptional<z.ZodCoercedDate<unknown>>>;
|
|
@@ -331,19 +331,19 @@ declare const kanbanBackendPlugin: (hooks?: KanbanBackendHooks) => _btst_stack_p
|
|
|
331
331
|
body: better_call.StandardSchemaV1<{
|
|
332
332
|
name: string;
|
|
333
333
|
description?: string | undefined;
|
|
334
|
+
createdAt?: unknown;
|
|
335
|
+
updatedAt?: unknown;
|
|
334
336
|
slug?: string | undefined;
|
|
335
337
|
ownerId?: string | undefined;
|
|
336
338
|
organizationId?: string | undefined;
|
|
337
|
-
createdAt?: unknown;
|
|
338
|
-
updatedAt?: unknown;
|
|
339
339
|
}, {
|
|
340
340
|
name: string;
|
|
341
341
|
description?: string | undefined;
|
|
342
|
+
createdAt?: unknown;
|
|
343
|
+
updatedAt?: unknown;
|
|
342
344
|
slug?: string | undefined;
|
|
343
345
|
ownerId?: string | undefined;
|
|
344
346
|
organizationId?: string | undefined;
|
|
345
|
-
createdAt?: unknown;
|
|
346
|
-
updatedAt?: unknown;
|
|
347
347
|
}>;
|
|
348
348
|
}, {
|
|
349
349
|
columns: ColumnWithTasks[];
|
|
@@ -360,20 +360,20 @@ declare const kanbanBackendPlugin: (hooks?: KanbanBackendHooks) => _btst_stack_p
|
|
|
360
360
|
method: "PUT";
|
|
361
361
|
body: better_call.StandardSchemaV1<{
|
|
362
362
|
description?: string | undefined;
|
|
363
|
+
name?: string | undefined;
|
|
364
|
+
createdAt?: unknown;
|
|
365
|
+
updatedAt?: unknown;
|
|
363
366
|
slug?: string | undefined;
|
|
364
367
|
ownerId?: string | undefined;
|
|
365
368
|
organizationId?: string | undefined;
|
|
366
|
-
createdAt?: unknown;
|
|
367
|
-
updatedAt?: unknown;
|
|
368
|
-
name?: string | undefined;
|
|
369
369
|
}, {
|
|
370
370
|
description?: string | undefined;
|
|
371
|
+
name?: string | undefined;
|
|
372
|
+
createdAt?: unknown;
|
|
373
|
+
updatedAt?: unknown;
|
|
371
374
|
slug?: string | undefined;
|
|
372
375
|
ownerId?: string | undefined;
|
|
373
376
|
organizationId?: string | undefined;
|
|
374
|
-
createdAt?: unknown;
|
|
375
|
-
updatedAt?: unknown;
|
|
376
|
-
name?: string | undefined;
|
|
377
377
|
}>;
|
|
378
378
|
}, Board>;
|
|
379
379
|
readonly deleteBoard: better_call.StrictEndpoint<"/boards/:id", {} & {
|