@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.
Files changed (49) hide show
  1. package/dist/packages/stack/src/plugins/cms/client/components/forms/content-form.cjs +58 -34
  2. package/dist/packages/stack/src/plugins/cms/client/components/forms/content-form.mjs +58 -34
  3. package/dist/packages/stack/src/plugins/cms/client/components/inverse-relations-panel.cjs +29 -7
  4. package/dist/packages/stack/src/plugins/cms/client/components/inverse-relations-panel.mjs +29 -7
  5. package/dist/packages/ui/src/components/auto-form/helpers.cjs +24 -1
  6. package/dist/packages/ui/src/components/auto-form/helpers.mjs +24 -1
  7. package/dist/plugins/blog/api/index.d.cts +3 -2
  8. package/dist/plugins/blog/api/index.d.mts +3 -2
  9. package/dist/plugins/blog/api/index.d.ts +3 -2
  10. package/dist/plugins/blog/client/components/index.cjs +21 -0
  11. package/dist/plugins/blog/client/components/index.d.cts +71 -1
  12. package/dist/plugins/blog/client/components/index.d.mts +71 -1
  13. package/dist/plugins/blog/client/components/index.d.ts +71 -1
  14. package/dist/plugins/blog/client/components/index.mjs +15 -1
  15. package/dist/plugins/blog/client/hooks/index.d.cts +3 -2
  16. package/dist/plugins/blog/client/hooks/index.d.mts +3 -2
  17. package/dist/plugins/blog/client/hooks/index.d.ts +3 -2
  18. package/dist/plugins/blog/client/index.d.cts +3 -2
  19. package/dist/plugins/blog/client/index.d.mts +3 -2
  20. package/dist/plugins/blog/client/index.d.ts +3 -2
  21. package/dist/plugins/blog/query-keys.d.cts +3 -2
  22. package/dist/plugins/blog/query-keys.d.mts +3 -2
  23. package/dist/plugins/blog/query-keys.d.ts +3 -2
  24. package/dist/plugins/kanban/api/index.d.cts +1 -1
  25. package/dist/plugins/kanban/api/index.d.mts +1 -1
  26. package/dist/plugins/kanban/api/index.d.ts +1 -1
  27. package/dist/plugins/kanban/query-keys.d.cts +1 -1
  28. package/dist/plugins/kanban/query-keys.d.mts +1 -1
  29. package/dist/plugins/kanban/query-keys.d.ts +1 -1
  30. package/dist/shared/{stack.6mEHS2WH.d.mts → stack.BnSAhKJi.d.ts} +4 -3
  31. package/dist/shared/{stack.C1jLzFZ6.d.mts → stack.CLWhMntf.d.cts} +6 -5
  32. package/dist/shared/{stack.BQmuNl5p.d.mts → stack.CuhcFsAx.d.cts} +3 -38
  33. package/dist/shared/{stack.BQmuNl5p.d.ts → stack.CuhcFsAx.d.mts} +3 -38
  34. package/dist/shared/{stack.BQmuNl5p.d.cts → stack.CuhcFsAx.d.ts} +3 -38
  35. package/dist/shared/{stack.AJTXI7kw.d.cts → stack.DNLuzDb3.d.cts} +4 -3
  36. package/dist/shared/{stack.QYn-Px94.d.ts → stack.Dfc44JiE.d.mts} +4 -3
  37. package/dist/shared/{stack.DF1ewpVE.d.ts → stack.DiodAFAa.d.mts} +6 -5
  38. package/dist/shared/stack.Dsatjh0B.d.cts +35 -0
  39. package/dist/shared/stack.Dsatjh0B.d.mts +35 -0
  40. package/dist/shared/stack.Dsatjh0B.d.ts +35 -0
  41. package/dist/shared/{stack.XulPeAD3.d.cts → stack.ufcExQIR.d.ts} +6 -5
  42. package/package.json +14 -1
  43. package/src/plugins/blog/client/components/index.tsx +52 -0
  44. package/src/plugins/cms/__tests__/auto-form-nested-config.test.ts +177 -0
  45. package/src/plugins/cms/client/components/forms/content-form.tsx +93 -47
  46. package/src/plugins/cms/client/components/inverse-relations-panel.tsx +49 -1
  47. package/dist/shared/{stack.j5SFLC1d.d.ts → stack.D4Cea8II.d.ts} +13 -13
  48. package/dist/shared/{stack.Bzfx-_lq.d.mts → stack.HE_IvqV5.d.mts} +13 -13
  49. 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} ({total})
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", {} & {