@object-ui/types 3.0.2 → 3.1.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.
Files changed (85) hide show
  1. package/dist/app.d.ts +217 -0
  2. package/dist/app.d.ts.map +1 -1
  3. package/dist/app.js +85 -1
  4. package/dist/complex.d.ts +129 -35
  5. package/dist/complex.d.ts.map +1 -1
  6. package/dist/data-display.d.ts +105 -1
  7. package/dist/data-display.d.ts.map +1 -1
  8. package/dist/data.d.ts +45 -0
  9. package/dist/data.d.ts.map +1 -1
  10. package/dist/designer.d.ts +197 -35
  11. package/dist/designer.d.ts.map +1 -1
  12. package/dist/designer.js +11 -1
  13. package/dist/index.d.ts +21 -10
  14. package/dist/index.d.ts.map +1 -1
  15. package/dist/index.js +2 -0
  16. package/dist/layout.d.ts +39 -2
  17. package/dist/layout.d.ts.map +1 -1
  18. package/dist/navigation.d.ts +27 -0
  19. package/dist/navigation.d.ts.map +1 -1
  20. package/dist/objectql.d.ts +641 -7
  21. package/dist/objectql.d.ts.map +1 -1
  22. package/dist/record-components.d.ts +160 -0
  23. package/dist/record-components.d.ts.map +1 -0
  24. package/dist/record-components.js +8 -0
  25. package/dist/reports.d.ts +37 -0
  26. package/dist/reports.d.ts.map +1 -1
  27. package/dist/theme.d.ts +5 -0
  28. package/dist/theme.d.ts.map +1 -1
  29. package/dist/views.d.ts +257 -3
  30. package/dist/views.d.ts.map +1 -1
  31. package/dist/workflow.d.ts +198 -0
  32. package/dist/workflow.d.ts.map +1 -1
  33. package/dist/zod/app.zod.d.ts +42 -2
  34. package/dist/zod/app.zod.d.ts.map +1 -1
  35. package/dist/zod/app.zod.js +61 -1
  36. package/dist/zod/complex.zod.d.ts +138 -6
  37. package/dist/zod/complex.zod.d.ts.map +1 -1
  38. package/dist/zod/complex.zod.js +65 -2
  39. package/dist/zod/data-display.zod.d.ts +4 -0
  40. package/dist/zod/data-display.zod.d.ts.map +1 -1
  41. package/dist/zod/data-display.zod.js +2 -0
  42. package/dist/zod/form.zod.d.ts +6 -6
  43. package/dist/zod/index.zod.d.ts +368 -43
  44. package/dist/zod/index.zod.d.ts.map +1 -1
  45. package/dist/zod/index.zod.js +2 -2
  46. package/dist/zod/layout.zod.d.ts +6 -6
  47. package/dist/zod/navigation.zod.d.ts +58 -12
  48. package/dist/zod/navigation.zod.d.ts.map +1 -1
  49. package/dist/zod/navigation.zod.js +21 -9
  50. package/dist/zod/objectql.zod.d.ts +515 -27
  51. package/dist/zod/objectql.zod.d.ts.map +1 -1
  52. package/dist/zod/objectql.zod.js +162 -0
  53. package/dist/zod/reports.zod.d.ts +38 -38
  54. package/dist/zod/views.zod.d.ts +161 -7
  55. package/dist/zod/views.zod.d.ts.map +1 -1
  56. package/dist/zod/views.zod.js +21 -2
  57. package/package.json +2 -2
  58. package/src/__tests__/app-creation-types.test.ts +177 -0
  59. package/src/__tests__/dashboard-config.test.ts +208 -0
  60. package/src/__tests__/examples-metadata-compliance.test.ts +264 -0
  61. package/src/__tests__/navigation-model.test.ts +406 -0
  62. package/src/__tests__/p1-spec-alignment.test.ts +660 -0
  63. package/src/__tests__/p2-spec-exports.test.ts +312 -0
  64. package/src/__tests__/phase2-schemas.test.ts +108 -0
  65. package/src/app.ts +377 -0
  66. package/src/complex.ts +131 -31
  67. package/src/data-display.ts +107 -0
  68. package/src/data.ts +49 -0
  69. package/src/designer.ts +219 -30
  70. package/src/index.ts +192 -3
  71. package/src/layout.ts +55 -2
  72. package/src/navigation.ts +20 -0
  73. package/src/objectql.ts +757 -8
  74. package/src/record-components.ts +188 -0
  75. package/src/reports.ts +43 -0
  76. package/src/theme.ts +6 -0
  77. package/src/views.ts +275 -3
  78. package/src/workflow.ts +226 -0
  79. package/src/zod/app.zod.ts +74 -1
  80. package/src/zod/complex.zod.ts +67 -2
  81. package/src/zod/data-display.zod.ts +2 -0
  82. package/src/zod/index.zod.ts +5 -0
  83. package/src/zod/navigation.zod.ts +22 -10
  84. package/src/zod/objectql.zod.ts +167 -0
  85. package/src/zod/views.zod.ts +21 -2
@@ -21,11 +21,13 @@ import { z } from 'zod';
21
21
  export declare const ViewTypeSchema: z.ZodEnum<{
22
22
  list: "list";
23
23
  grid: "grid";
24
+ map: "map";
24
25
  kanban: "kanban";
25
26
  calendar: "calendar";
26
27
  timeline: "timeline";
27
28
  detail: "detail";
28
- map: "map";
29
+ gallery: "gallery";
30
+ gantt: "gantt";
29
31
  }>;
30
32
  /**
31
33
  * Detail View Field Schema
@@ -34,16 +36,27 @@ export declare const DetailViewFieldSchema: z.ZodObject<{
34
36
  name: z.ZodString;
35
37
  label: z.ZodOptional<z.ZodString>;
36
38
  type: z.ZodOptional<z.ZodEnum<{
39
+ number: "number";
40
+ boolean: "boolean";
37
41
  date: "date";
38
42
  custom: "custom";
43
+ url: "url";
44
+ user: "user";
39
45
  link: "link";
46
+ select: "select";
40
47
  markdown: "markdown";
41
48
  text: "text";
49
+ lookup: "lookup";
50
+ email: "email";
42
51
  badge: "badge";
43
52
  datetime: "datetime";
53
+ currency: "currency";
54
+ percent: "percent";
44
55
  html: "html";
45
56
  image: "image";
46
57
  json: "json";
58
+ phone: "phone";
59
+ master_detail: "master_detail";
47
60
  }>>;
48
61
  format: z.ZodOptional<z.ZodString>;
49
62
  render: z.ZodOptional<z.ZodType<any, unknown, z.core.$ZodTypeInternals<any, unknown>>>;
@@ -51,6 +64,14 @@ export declare const DetailViewFieldSchema: z.ZodObject<{
51
64
  readonly: z.ZodOptional<z.ZodBoolean>;
52
65
  visible: z.ZodOptional<z.ZodUnion<readonly [z.ZodBoolean, z.ZodString]>>;
53
66
  span: z.ZodOptional<z.ZodNumber>;
67
+ options: z.ZodOptional<z.ZodArray<z.ZodObject<{
68
+ label: z.ZodString;
69
+ value: z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean]>;
70
+ color: z.ZodOptional<z.ZodString>;
71
+ }, z.core.$strip>>>;
72
+ reference_to: z.ZodOptional<z.ZodString>;
73
+ reference_field: z.ZodOptional<z.ZodString>;
74
+ currency: z.ZodOptional<z.ZodString>;
54
75
  }, z.core.$strip>;
55
76
  /**
56
77
  * Detail View Section Schema
@@ -63,16 +84,27 @@ export declare const DetailViewSectionSchema: z.ZodObject<{
63
84
  name: z.ZodString;
64
85
  label: z.ZodOptional<z.ZodString>;
65
86
  type: z.ZodOptional<z.ZodEnum<{
87
+ number: "number";
88
+ boolean: "boolean";
66
89
  date: "date";
67
90
  custom: "custom";
91
+ url: "url";
92
+ user: "user";
68
93
  link: "link";
94
+ select: "select";
69
95
  markdown: "markdown";
70
96
  text: "text";
97
+ lookup: "lookup";
98
+ email: "email";
71
99
  badge: "badge";
72
100
  datetime: "datetime";
101
+ currency: "currency";
102
+ percent: "percent";
73
103
  html: "html";
74
104
  image: "image";
75
105
  json: "json";
106
+ phone: "phone";
107
+ master_detail: "master_detail";
76
108
  }>>;
77
109
  format: z.ZodOptional<z.ZodString>;
78
110
  render: z.ZodOptional<z.ZodType<any, unknown, z.core.$ZodTypeInternals<any, unknown>>>;
@@ -80,11 +112,21 @@ export declare const DetailViewSectionSchema: z.ZodObject<{
80
112
  readonly: z.ZodOptional<z.ZodBoolean>;
81
113
  visible: z.ZodOptional<z.ZodUnion<readonly [z.ZodBoolean, z.ZodString]>>;
82
114
  span: z.ZodOptional<z.ZodNumber>;
115
+ options: z.ZodOptional<z.ZodArray<z.ZodObject<{
116
+ label: z.ZodString;
117
+ value: z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean]>;
118
+ color: z.ZodOptional<z.ZodString>;
119
+ }, z.core.$strip>>>;
120
+ reference_to: z.ZodOptional<z.ZodString>;
121
+ reference_field: z.ZodOptional<z.ZodString>;
122
+ currency: z.ZodOptional<z.ZodString>;
83
123
  }, z.core.$strip>>;
84
124
  collapsible: z.ZodOptional<z.ZodBoolean>;
85
125
  defaultCollapsed: z.ZodOptional<z.ZodBoolean>;
86
126
  columns: z.ZodOptional<z.ZodNumber>;
87
127
  visible: z.ZodOptional<z.ZodUnion<readonly [z.ZodBoolean, z.ZodString]>>;
128
+ showBorder: z.ZodOptional<z.ZodBoolean>;
129
+ headerColor: z.ZodOptional<z.ZodString>;
88
130
  }, z.core.$strip>;
89
131
  /**
90
132
  * Detail View Tab Schema
@@ -138,16 +180,27 @@ export declare const DetailViewSchema: z.ZodObject<{
138
180
  name: z.ZodString;
139
181
  label: z.ZodOptional<z.ZodString>;
140
182
  type: z.ZodOptional<z.ZodEnum<{
183
+ number: "number";
184
+ boolean: "boolean";
141
185
  date: "date";
142
186
  custom: "custom";
187
+ url: "url";
188
+ user: "user";
143
189
  link: "link";
190
+ select: "select";
144
191
  markdown: "markdown";
145
192
  text: "text";
193
+ lookup: "lookup";
194
+ email: "email";
146
195
  badge: "badge";
147
196
  datetime: "datetime";
197
+ currency: "currency";
198
+ percent: "percent";
148
199
  html: "html";
149
200
  image: "image";
150
201
  json: "json";
202
+ phone: "phone";
203
+ master_detail: "master_detail";
151
204
  }>>;
152
205
  format: z.ZodOptional<z.ZodString>;
153
206
  render: z.ZodOptional<z.ZodType<any, unknown, z.core.$ZodTypeInternals<any, unknown>>>;
@@ -155,26 +208,47 @@ export declare const DetailViewSchema: z.ZodObject<{
155
208
  readonly: z.ZodOptional<z.ZodBoolean>;
156
209
  visible: z.ZodOptional<z.ZodUnion<readonly [z.ZodBoolean, z.ZodString]>>;
157
210
  span: z.ZodOptional<z.ZodNumber>;
211
+ options: z.ZodOptional<z.ZodArray<z.ZodObject<{
212
+ label: z.ZodString;
213
+ value: z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean]>;
214
+ color: z.ZodOptional<z.ZodString>;
215
+ }, z.core.$strip>>>;
216
+ reference_to: z.ZodOptional<z.ZodString>;
217
+ reference_field: z.ZodOptional<z.ZodString>;
218
+ currency: z.ZodOptional<z.ZodString>;
158
219
  }, z.core.$strip>>;
159
220
  collapsible: z.ZodOptional<z.ZodBoolean>;
160
221
  defaultCollapsed: z.ZodOptional<z.ZodBoolean>;
161
222
  columns: z.ZodOptional<z.ZodNumber>;
162
223
  visible: z.ZodOptional<z.ZodUnion<readonly [z.ZodBoolean, z.ZodString]>>;
224
+ showBorder: z.ZodOptional<z.ZodBoolean>;
225
+ headerColor: z.ZodOptional<z.ZodString>;
163
226
  }, z.core.$strip>>>;
164
227
  fields: z.ZodOptional<z.ZodArray<z.ZodObject<{
165
228
  name: z.ZodString;
166
229
  label: z.ZodOptional<z.ZodString>;
167
230
  type: z.ZodOptional<z.ZodEnum<{
231
+ number: "number";
232
+ boolean: "boolean";
168
233
  date: "date";
169
234
  custom: "custom";
235
+ url: "url";
236
+ user: "user";
170
237
  link: "link";
238
+ select: "select";
171
239
  markdown: "markdown";
172
240
  text: "text";
241
+ lookup: "lookup";
242
+ email: "email";
173
243
  badge: "badge";
174
244
  datetime: "datetime";
245
+ currency: "currency";
246
+ percent: "percent";
175
247
  html: "html";
176
248
  image: "image";
177
249
  json: "json";
250
+ phone: "phone";
251
+ master_detail: "master_detail";
178
252
  }>>;
179
253
  format: z.ZodOptional<z.ZodString>;
180
254
  render: z.ZodOptional<z.ZodType<any, unknown, z.core.$ZodTypeInternals<any, unknown>>>;
@@ -182,6 +256,14 @@ export declare const DetailViewSchema: z.ZodObject<{
182
256
  readonly: z.ZodOptional<z.ZodBoolean>;
183
257
  visible: z.ZodOptional<z.ZodUnion<readonly [z.ZodBoolean, z.ZodString]>>;
184
258
  span: z.ZodOptional<z.ZodNumber>;
259
+ options: z.ZodOptional<z.ZodArray<z.ZodObject<{
260
+ label: z.ZodString;
261
+ value: z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean]>;
262
+ color: z.ZodOptional<z.ZodString>;
263
+ }, z.core.$strip>>>;
264
+ reference_to: z.ZodOptional<z.ZodString>;
265
+ reference_field: z.ZodOptional<z.ZodString>;
266
+ currency: z.ZodOptional<z.ZodString>;
185
267
  }, z.core.$strip>>>;
186
268
  actions: z.ZodOptional<z.ZodArray<z.ZodAny>>;
187
269
  tabs: z.ZodOptional<z.ZodArray<z.ZodObject<{
@@ -242,11 +324,13 @@ export declare const ViewSwitcherSchema: z.ZodObject<{
242
324
  type: z.ZodEnum<{
243
325
  list: "list";
244
326
  grid: "grid";
327
+ map: "map";
245
328
  kanban: "kanban";
246
329
  calendar: "calendar";
247
330
  timeline: "timeline";
248
331
  detail: "detail";
249
- map: "map";
332
+ gallery: "gallery";
333
+ gantt: "gantt";
250
334
  }>;
251
335
  label: z.ZodOptional<z.ZodString>;
252
336
  icon: z.ZodOptional<z.ZodString>;
@@ -255,20 +339,24 @@ export declare const ViewSwitcherSchema: z.ZodObject<{
255
339
  defaultView: z.ZodOptional<z.ZodEnum<{
256
340
  list: "list";
257
341
  grid: "grid";
342
+ map: "map";
258
343
  kanban: "kanban";
259
344
  calendar: "calendar";
260
345
  timeline: "timeline";
261
346
  detail: "detail";
262
- map: "map";
347
+ gallery: "gallery";
348
+ gantt: "gantt";
263
349
  }>>;
264
350
  activeView: z.ZodOptional<z.ZodEnum<{
265
351
  list: "list";
266
352
  grid: "grid";
353
+ map: "map";
267
354
  kanban: "kanban";
268
355
  calendar: "calendar";
269
356
  timeline: "timeline";
270
357
  detail: "detail";
271
- map: "map";
358
+ gallery: "gallery";
359
+ gantt: "gantt";
272
360
  }>>;
273
361
  variant: z.ZodOptional<z.ZodEnum<{
274
362
  dropdown: "dropdown";
@@ -284,6 +372,16 @@ export declare const ViewSwitcherSchema: z.ZodObject<{
284
372
  onViewChange: z.ZodOptional<z.ZodString>;
285
373
  persistPreference: z.ZodOptional<z.ZodBoolean>;
286
374
  storageKey: z.ZodOptional<z.ZodString>;
375
+ allowCreateView: z.ZodOptional<z.ZodBoolean>;
376
+ viewActions: z.ZodOptional<z.ZodArray<z.ZodObject<{
377
+ type: z.ZodEnum<{
378
+ delete: "delete";
379
+ share: "share";
380
+ settings: "settings";
381
+ duplicate: "duplicate";
382
+ }>;
383
+ icon: z.ZodOptional<z.ZodString>;
384
+ }, z.core.$strip>>>;
287
385
  }, z.core.$loose>;
288
386
  /**
289
387
  * Filter UI Schema
@@ -426,16 +524,27 @@ export declare const ViewComponentSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
426
524
  name: z.ZodString;
427
525
  label: z.ZodOptional<z.ZodString>;
428
526
  type: z.ZodOptional<z.ZodEnum<{
527
+ number: "number";
528
+ boolean: "boolean";
429
529
  date: "date";
430
530
  custom: "custom";
531
+ url: "url";
532
+ user: "user";
431
533
  link: "link";
534
+ select: "select";
432
535
  markdown: "markdown";
433
536
  text: "text";
537
+ lookup: "lookup";
538
+ email: "email";
434
539
  badge: "badge";
435
540
  datetime: "datetime";
541
+ currency: "currency";
542
+ percent: "percent";
436
543
  html: "html";
437
544
  image: "image";
438
545
  json: "json";
546
+ phone: "phone";
547
+ master_detail: "master_detail";
439
548
  }>>;
440
549
  format: z.ZodOptional<z.ZodString>;
441
550
  render: z.ZodOptional<z.ZodType<any, unknown, z.core.$ZodTypeInternals<any, unknown>>>;
@@ -443,26 +552,47 @@ export declare const ViewComponentSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
443
552
  readonly: z.ZodOptional<z.ZodBoolean>;
444
553
  visible: z.ZodOptional<z.ZodUnion<readonly [z.ZodBoolean, z.ZodString]>>;
445
554
  span: z.ZodOptional<z.ZodNumber>;
555
+ options: z.ZodOptional<z.ZodArray<z.ZodObject<{
556
+ label: z.ZodString;
557
+ value: z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean]>;
558
+ color: z.ZodOptional<z.ZodString>;
559
+ }, z.core.$strip>>>;
560
+ reference_to: z.ZodOptional<z.ZodString>;
561
+ reference_field: z.ZodOptional<z.ZodString>;
562
+ currency: z.ZodOptional<z.ZodString>;
446
563
  }, z.core.$strip>>;
447
564
  collapsible: z.ZodOptional<z.ZodBoolean>;
448
565
  defaultCollapsed: z.ZodOptional<z.ZodBoolean>;
449
566
  columns: z.ZodOptional<z.ZodNumber>;
450
567
  visible: z.ZodOptional<z.ZodUnion<readonly [z.ZodBoolean, z.ZodString]>>;
568
+ showBorder: z.ZodOptional<z.ZodBoolean>;
569
+ headerColor: z.ZodOptional<z.ZodString>;
451
570
  }, z.core.$strip>>>;
452
571
  fields: z.ZodOptional<z.ZodArray<z.ZodObject<{
453
572
  name: z.ZodString;
454
573
  label: z.ZodOptional<z.ZodString>;
455
574
  type: z.ZodOptional<z.ZodEnum<{
575
+ number: "number";
576
+ boolean: "boolean";
456
577
  date: "date";
457
578
  custom: "custom";
579
+ url: "url";
580
+ user: "user";
458
581
  link: "link";
582
+ select: "select";
459
583
  markdown: "markdown";
460
584
  text: "text";
585
+ lookup: "lookup";
586
+ email: "email";
461
587
  badge: "badge";
462
588
  datetime: "datetime";
589
+ currency: "currency";
590
+ percent: "percent";
463
591
  html: "html";
464
592
  image: "image";
465
593
  json: "json";
594
+ phone: "phone";
595
+ master_detail: "master_detail";
466
596
  }>>;
467
597
  format: z.ZodOptional<z.ZodString>;
468
598
  render: z.ZodOptional<z.ZodType<any, unknown, z.core.$ZodTypeInternals<any, unknown>>>;
@@ -470,6 +600,14 @@ export declare const ViewComponentSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
470
600
  readonly: z.ZodOptional<z.ZodBoolean>;
471
601
  visible: z.ZodOptional<z.ZodUnion<readonly [z.ZodBoolean, z.ZodString]>>;
472
602
  span: z.ZodOptional<z.ZodNumber>;
603
+ options: z.ZodOptional<z.ZodArray<z.ZodObject<{
604
+ label: z.ZodString;
605
+ value: z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean]>;
606
+ color: z.ZodOptional<z.ZodString>;
607
+ }, z.core.$strip>>>;
608
+ reference_to: z.ZodOptional<z.ZodString>;
609
+ reference_field: z.ZodOptional<z.ZodString>;
610
+ currency: z.ZodOptional<z.ZodString>;
473
611
  }, z.core.$strip>>>;
474
612
  actions: z.ZodOptional<z.ZodArray<z.ZodAny>>;
475
613
  tabs: z.ZodOptional<z.ZodArray<z.ZodObject<{
@@ -526,11 +664,13 @@ export declare const ViewComponentSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
526
664
  type: z.ZodEnum<{
527
665
  list: "list";
528
666
  grid: "grid";
667
+ map: "map";
529
668
  kanban: "kanban";
530
669
  calendar: "calendar";
531
670
  timeline: "timeline";
532
671
  detail: "detail";
533
- map: "map";
672
+ gallery: "gallery";
673
+ gantt: "gantt";
534
674
  }>;
535
675
  label: z.ZodOptional<z.ZodString>;
536
676
  icon: z.ZodOptional<z.ZodString>;
@@ -539,20 +679,24 @@ export declare const ViewComponentSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
539
679
  defaultView: z.ZodOptional<z.ZodEnum<{
540
680
  list: "list";
541
681
  grid: "grid";
682
+ map: "map";
542
683
  kanban: "kanban";
543
684
  calendar: "calendar";
544
685
  timeline: "timeline";
545
686
  detail: "detail";
546
- map: "map";
687
+ gallery: "gallery";
688
+ gantt: "gantt";
547
689
  }>>;
548
690
  activeView: z.ZodOptional<z.ZodEnum<{
549
691
  list: "list";
550
692
  grid: "grid";
693
+ map: "map";
551
694
  kanban: "kanban";
552
695
  calendar: "calendar";
553
696
  timeline: "timeline";
554
697
  detail: "detail";
555
- map: "map";
698
+ gallery: "gallery";
699
+ gantt: "gantt";
556
700
  }>>;
557
701
  variant: z.ZodOptional<z.ZodEnum<{
558
702
  dropdown: "dropdown";
@@ -568,6 +712,16 @@ export declare const ViewComponentSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
568
712
  onViewChange: z.ZodOptional<z.ZodString>;
569
713
  persistPreference: z.ZodOptional<z.ZodBoolean>;
570
714
  storageKey: z.ZodOptional<z.ZodString>;
715
+ allowCreateView: z.ZodOptional<z.ZodBoolean>;
716
+ viewActions: z.ZodOptional<z.ZodArray<z.ZodObject<{
717
+ type: z.ZodEnum<{
718
+ delete: "delete";
719
+ share: "share";
720
+ settings: "settings";
721
+ duplicate: "duplicate";
722
+ }>;
723
+ icon: z.ZodOptional<z.ZodString>;
724
+ }, z.core.$strip>>>;
571
725
  }, z.core.$loose>, z.ZodObject<{
572
726
  id: z.ZodOptional<z.ZodString>;
573
727
  name: z.ZodOptional<z.ZodString>;
@@ -1 +1 @@
1
- {"version":3,"file":"views.zod.d.ts","sourceRoot":"","sources":["../../src/zod/views.zod.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;;;;;;;GAQG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB;;GAEG;AACH,eAAO,MAAM,cAAc;;;;;;;;EAAoG,CAAC;AAEhI;;GAEG;AACH,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;iBAUhC,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBASlC,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,mBAAmB;;;;;;;iBAO9B,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA+B3B,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAe7B,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAezB,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAavB,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2BAK9B,CAAC;AAEH;;GAEG;AACH,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AAChE,MAAM,MAAM,yBAAyB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAC9E,MAAM,MAAM,2BAA2B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAClF,MAAM,MAAM,uBAAuB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAC1E,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AACpE,MAAM,MAAM,sBAAsB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AACxE,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AAChE,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC"}
1
+ {"version":3,"file":"views.zod.d.ts","sourceRoot":"","sources":["../../src/zod/views.zod.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;;;;;;;GAQG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB;;GAEG;AACH,eAAO,MAAM,cAAc;;;;;;;;;;EAAwH,CAAC;AAEpJ;;GAEG;AACH,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAsBhC,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAWlC,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,mBAAmB;;;;;;;iBAO9B,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA+B3B,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAoB7B,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAezB,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAavB,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2BAK9B,CAAC;AAEH;;GAEG;AACH,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AAChE,MAAM,MAAM,yBAAyB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAC9E,MAAM,MAAM,2BAA2B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAClF,MAAM,MAAM,uBAAuB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAC1E,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AACpE,MAAM,MAAM,sBAAsB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AACxE,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AAChE,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC"}
@@ -19,20 +19,32 @@ import { BaseSchema, SchemaNodeSchema } from './base.zod.js';
19
19
  /**
20
20
  * View Type Schema
21
21
  */
22
- export const ViewTypeSchema = z.enum(['list', 'detail', 'grid', 'kanban', 'calendar', 'timeline', 'map']).describe('View type');
22
+ export const ViewTypeSchema = z.enum(['list', 'detail', 'grid', 'kanban', 'calendar', 'timeline', 'map', 'gallery', 'gantt']).describe('View type');
23
23
  /**
24
24
  * Detail View Field Schema
25
25
  */
26
26
  export const DetailViewFieldSchema = z.object({
27
27
  name: z.string().describe('Field name/path'),
28
28
  label: z.string().optional().describe('Display label'),
29
- type: z.enum(['text', 'image', 'link', 'badge', 'date', 'datetime', 'json', 'html', 'markdown', 'custom']).optional().describe('Field type for rendering'),
29
+ type: z.enum([
30
+ 'text', 'number', 'currency', 'percent', 'boolean', 'select', 'lookup', 'master_detail',
31
+ 'email', 'url', 'phone', 'user',
32
+ 'image', 'link', 'badge', 'date', 'datetime', 'json', 'html', 'markdown', 'custom',
33
+ ]).optional().describe('Field type for rendering'),
30
34
  format: z.string().optional().describe('Format string (e.g., date format)'),
31
35
  render: SchemaNodeSchema.optional().describe('Custom renderer'),
32
36
  value: z.any().optional().describe('Field value'),
33
37
  readonly: z.boolean().optional().describe('Whether field is read-only'),
34
38
  visible: z.union([z.boolean(), z.string()]).optional().describe('Field visibility condition'),
35
39
  span: z.number().optional().describe('Span across columns (for grid layout)'),
40
+ options: z.array(z.object({
41
+ label: z.string(),
42
+ value: z.union([z.string(), z.number(), z.boolean()]),
43
+ color: z.string().optional(),
44
+ })).optional().describe('Options for select/lookup fields'),
45
+ reference_to: z.string().optional().describe('Referenced object name for lookup/master_detail fields'),
46
+ reference_field: z.string().optional().describe('Display field on the referenced object'),
47
+ currency: z.string().optional().describe('Currency code for currency fields (e.g. USD, EUR)'),
36
48
  });
37
49
  /**
38
50
  * Detail View Section Schema
@@ -46,6 +58,8 @@ export const DetailViewSectionSchema = z.object({
46
58
  defaultCollapsed: z.boolean().optional().describe('Default collapsed state'),
47
59
  columns: z.number().optional().describe('Grid columns for field layout'),
48
60
  visible: z.union([z.boolean(), z.string()]).optional().describe('Section visibility condition'),
61
+ showBorder: z.boolean().optional().describe('Show border around section'),
62
+ headerColor: z.string().optional().describe('Header background color (Tailwind class)'),
49
63
  });
50
64
  /**
51
65
  * Detail View Tab Schema
@@ -111,6 +125,11 @@ export const ViewSwitcherSchema = BaseSchema.extend({
111
125
  onViewChange: z.string().optional().describe('View change callback'),
112
126
  persistPreference: z.boolean().optional().describe('Persist view preference'),
113
127
  storageKey: z.string().optional().describe('Storage key for persisting view'),
128
+ allowCreateView: z.boolean().optional().describe('Show "+" button to add/create a new view'),
129
+ viewActions: z.array(z.object({
130
+ type: z.enum(['share', 'settings', 'duplicate', 'delete']).describe('Action type'),
131
+ icon: z.string().optional().describe('Action icon'),
132
+ })).optional().describe('Per-view action icons'),
114
133
  });
115
134
  /**
116
135
  * Filter UI Schema
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@object-ui/types",
3
- "version": "3.0.2",
3
+ "version": "3.1.0",
4
4
  "description": "Pure TypeScript type definitions for Object UI - The Protocol Layer",
5
5
  "type": "module",
6
6
  "sideEffects": false,
@@ -76,7 +76,7 @@
76
76
  "directory": "packages/types"
77
77
  },
78
78
  "dependencies": {
79
- "@objectstack/spec": "^3.0.4",
79
+ "@objectstack/spec": "^3.2.0",
80
80
  "zod": "^4.3.6"
81
81
  },
82
82
  "devDependencies": {
@@ -0,0 +1,177 @@
1
+ /**
2
+ * ObjectUI
3
+ * Copyright (c) 2024-present ObjectStack Inc.
4
+ *
5
+ * This source code is licensed under the MIT license found in the
6
+ * LICENSE file in the root directory of this source tree.
7
+ */
8
+
9
+ import { describe, it, expect } from 'vitest';
10
+ import { isValidAppName, wizardDraftToAppSchema } from '@object-ui/types';
11
+ import type {
12
+ AppWizardDraft,
13
+ AppWizardStep,
14
+ BrandingConfig,
15
+ ObjectSelection,
16
+ EditorMode,
17
+ AppSchema,
18
+ } from '@object-ui/types';
19
+
20
+ describe('App Creation Types', () => {
21
+ describe('isValidAppName', () => {
22
+ it('should accept simple snake_case names', () => {
23
+ expect(isValidAppName('my_app')).toBe(true);
24
+ expect(isValidAppName('crm')).toBe(true);
25
+ expect(isValidAppName('sales_dashboard')).toBe(true);
26
+ expect(isValidAppName('app123')).toBe(true);
27
+ });
28
+
29
+ it('should reject invalid names', () => {
30
+ expect(isValidAppName('')).toBe(false);
31
+ expect(isValidAppName('My App')).toBe(false);
32
+ expect(isValidAppName('my-app')).toBe(false);
33
+ expect(isValidAppName('MyApp')).toBe(false);
34
+ expect(isValidAppName('123app')).toBe(false);
35
+ expect(isValidAppName('_app')).toBe(false);
36
+ expect(isValidAppName('app_')).toBe(false);
37
+ expect(isValidAppName('app__name')).toBe(false);
38
+ });
39
+
40
+ it('should accept multi-segment snake_case', () => {
41
+ expect(isValidAppName('my_cool_app')).toBe(true);
42
+ expect(isValidAppName('a_b_c_d')).toBe(true);
43
+ });
44
+ });
45
+
46
+ describe('wizardDraftToAppSchema', () => {
47
+ it('should convert draft to AppSchema', () => {
48
+ const draft: AppWizardDraft = {
49
+ name: 'test_app',
50
+ title: 'Test Application',
51
+ description: 'A test app',
52
+ icon: 'LayoutDashboard',
53
+ layout: 'sidebar',
54
+ objects: [],
55
+ navigation: [
56
+ { id: 'nav_1', type: 'object', label: 'Contacts', objectName: 'contacts' },
57
+ ],
58
+ branding: {
59
+ logo: 'https://example.com/logo.svg',
60
+ primaryColor: '#3b82f6',
61
+ favicon: 'https://example.com/favicon.ico',
62
+ },
63
+ };
64
+
65
+ const schema: AppSchema = wizardDraftToAppSchema(draft);
66
+ expect(schema.type).toBe('app');
67
+ expect(schema.name).toBe('test_app');
68
+ expect(schema.title).toBe('Test Application');
69
+ expect(schema.label).toBe('Test Application');
70
+ expect(schema.description).toBe('A test app');
71
+ expect(schema.icon).toBe('LayoutDashboard');
72
+ expect(schema.logo).toBe('https://example.com/logo.svg');
73
+ expect(schema.favicon).toBe('https://example.com/favicon.ico');
74
+ expect(schema.branding).toEqual({
75
+ logo: 'https://example.com/logo.svg',
76
+ primaryColor: '#3b82f6',
77
+ favicon: 'https://example.com/favicon.ico',
78
+ });
79
+ expect(schema.layout).toBe('sidebar');
80
+ expect(schema.navigation).toHaveLength(1);
81
+ expect(schema.navigation![0].id).toBe('nav_1');
82
+ });
83
+
84
+ it('should handle draft with empty navigation', () => {
85
+ const draft: AppWizardDraft = {
86
+ name: 'empty_app',
87
+ title: 'Empty',
88
+ layout: 'header',
89
+ objects: [],
90
+ navigation: [],
91
+ branding: {},
92
+ };
93
+
94
+ const schema = wizardDraftToAppSchema(draft);
95
+ expect(schema.navigation).toEqual([]);
96
+ expect(schema.layout).toBe('header');
97
+ expect(schema.label).toBe('Empty');
98
+ });
99
+
100
+ it('should preserve icon and label for sidebar/app-switcher display', () => {
101
+ const draft: AppWizardDraft = {
102
+ name: 'sales_crm',
103
+ title: 'Sales CRM',
104
+ icon: 'TrendingUp',
105
+ layout: 'sidebar',
106
+ objects: [],
107
+ navigation: [],
108
+ branding: {
109
+ logo: 'https://example.com/sales-logo.png',
110
+ primaryColor: '#10b981',
111
+ },
112
+ };
113
+
114
+ const schema = wizardDraftToAppSchema(draft);
115
+ // These fields are critical for AppSidebar and app switcher
116
+ expect(schema.icon).toBe('TrendingUp');
117
+ expect(schema.label).toBe('Sales CRM');
118
+ expect(schema.branding).toEqual({
119
+ logo: 'https://example.com/sales-logo.png',
120
+ primaryColor: '#10b981',
121
+ });
122
+ });
123
+
124
+ it('should handle draft without icon gracefully', () => {
125
+ const draft: AppWizardDraft = {
126
+ name: 'no_icon_app',
127
+ title: 'No Icon',
128
+ layout: 'sidebar',
129
+ objects: [],
130
+ navigation: [],
131
+ branding: {},
132
+ };
133
+
134
+ const schema = wizardDraftToAppSchema(draft);
135
+ expect(schema.icon).toBeUndefined();
136
+ expect(schema.label).toBe('No Icon');
137
+ });
138
+ });
139
+
140
+ describe('Type Shape Verification', () => {
141
+ it('should accept valid AppWizardStep', () => {
142
+ const step: AppWizardStep = {
143
+ id: 'basic',
144
+ label: 'Basic Info',
145
+ description: 'Enter app details',
146
+ icon: 'Settings',
147
+ };
148
+ expect(step.id).toBe('basic');
149
+ expect(step.label).toBe('Basic Info');
150
+ });
151
+
152
+ it('should accept valid BrandingConfig', () => {
153
+ const config: BrandingConfig = {
154
+ logo: 'https://example.com/logo.png',
155
+ primaryColor: '#ff5733',
156
+ favicon: 'https://example.com/favicon.ico',
157
+ fontFamily: 'Inter',
158
+ };
159
+ expect(config.primaryColor).toBe('#ff5733');
160
+ });
161
+
162
+ it('should accept valid ObjectSelection', () => {
163
+ const obj: ObjectSelection = {
164
+ name: 'contacts',
165
+ label: 'Contacts',
166
+ icon: 'Users',
167
+ selected: true,
168
+ };
169
+ expect(obj.selected).toBe(true);
170
+ });
171
+
172
+ it('should accept valid EditorMode', () => {
173
+ const modes: EditorMode[] = ['edit', 'preview', 'code'];
174
+ expect(modes).toHaveLength(3);
175
+ });
176
+ });
177
+ });