@object-ui/components 0.3.1 → 2.0.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 (326) hide show
  1. package/.turbo/turbo-build.log +34 -0
  2. package/CHANGELOG.md +13 -0
  3. package/README.md +13 -0
  4. package/dist/index.css +1 -1
  5. package/dist/index.js +36430 -25529
  6. package/dist/index.umd.cjs +53 -32
  7. package/dist/src/SchemaRenderer.d.ts +3 -0
  8. package/dist/src/custom/action-param-dialog.d.ts +21 -0
  9. package/dist/src/{ui → custom}/button-group.d.ts +1 -1
  10. package/dist/src/custom/field.d.ts +19 -0
  11. package/dist/src/custom/index.d.ts +14 -0
  12. package/dist/src/custom/input-group.d.ts +14 -0
  13. package/dist/src/{ui → custom}/item.d.ts +1 -1
  14. package/dist/src/custom/native-select.d.ts +12 -0
  15. package/dist/src/custom/navigation-overlay.d.ts +50 -0
  16. package/dist/src/custom/sort-builder.d.ts +22 -0
  17. package/dist/src/index.d.ts +2 -0
  18. package/dist/src/renderers/action/action-button.d.ts +11 -0
  19. package/dist/src/renderers/action/action-group.d.ts +25 -0
  20. package/dist/src/renderers/action/action-icon.d.ts +10 -0
  21. package/dist/src/renderers/action/action-menu.d.ts +19 -0
  22. package/dist/src/renderers/action/index.d.ts +0 -0
  23. package/dist/src/renderers/action/resolve-icon.d.ts +6 -0
  24. package/dist/src/renderers/data-display/table.d.ts +1 -1
  25. package/dist/src/renderers/layout/page.d.ts +1 -1
  26. package/dist/src/renderers/placeholders.d.ts +1 -1
  27. package/dist/src/ui/accordion.d.ts +4 -4
  28. package/dist/src/ui/alert-dialog.d.ts +17 -11
  29. package/dist/src/ui/alert.d.ts +4 -5
  30. package/dist/src/ui/aspect-ratio.d.ts +1 -1
  31. package/dist/src/ui/avatar.d.ts +3 -3
  32. package/dist/src/ui/badge.d.ts +3 -3
  33. package/dist/src/ui/breadcrumb.d.ts +16 -8
  34. package/dist/src/ui/calendar.d.ts +7 -7
  35. package/dist/src/ui/card.d.ts +7 -8
  36. package/dist/src/ui/carousel.d.ts +5 -6
  37. package/dist/src/ui/chart.d.ts +62 -0
  38. package/dist/src/ui/checkbox.d.ts +1 -1
  39. package/dist/src/ui/collapsible.d.ts +3 -3
  40. package/dist/src/ui/command.d.ts +78 -16
  41. package/dist/src/ui/context-menu.d.ts +14 -12
  42. package/dist/src/ui/dialog.d.ts +17 -13
  43. package/dist/src/ui/drawer.d.ts +19 -10
  44. package/dist/src/ui/dropdown-menu.d.ts +20 -18
  45. package/dist/src/ui/form.d.ts +6 -7
  46. package/dist/src/ui/hover-card.d.ts +3 -3
  47. package/dist/src/ui/index.d.ts +2 -8
  48. package/dist/src/ui/input-otp.d.ts +30 -7
  49. package/dist/src/ui/label.d.ts +2 -1
  50. package/dist/src/ui/menubar.d.ts +19 -17
  51. package/dist/src/ui/navigation-menu.d.ts +9 -11
  52. package/dist/src/ui/pagination.d.ts +25 -10
  53. package/dist/src/ui/popover.d.ts +4 -5
  54. package/dist/src/ui/progress.d.ts +1 -1
  55. package/dist/src/ui/radio-group.d.ts +2 -2
  56. package/dist/src/ui/resizable.d.ts +5 -8
  57. package/dist/src/ui/scroll-area.d.ts +2 -2
  58. package/dist/src/ui/select.d.ts +11 -13
  59. package/dist/src/ui/sheet.d.ts +23 -11
  60. package/dist/src/ui/sidebar.d.ts +27 -29
  61. package/dist/src/ui/skeleton.d.ts +1 -1
  62. package/dist/src/ui/slider.d.ts +1 -1
  63. package/dist/src/ui/sonner.d.ts +2 -1
  64. package/dist/src/ui/switch.d.ts +2 -2
  65. package/dist/src/ui/tabs.d.ts +1 -1
  66. package/dist/src/ui/textarea.d.ts +1 -1
  67. package/dist/src/ui/toast.d.ts +22 -0
  68. package/dist/src/ui/toggle-group.d.ts +8 -3
  69. package/dist/src/ui/toggle.d.ts +4 -1
  70. package/dist/src/ui/tooltip.d.ts +4 -4
  71. package/dist/src/ui/typography.d.ts +21 -0
  72. package/package.json +20 -9
  73. package/shadcn-components.json +52 -47
  74. package/src/SchemaRenderer.tsx +28 -0
  75. package/src/__tests__/PageRendererRegions.test.tsx +668 -0
  76. package/src/__tests__/Registry.test.ts +21 -0
  77. package/src/__tests__/basic-renderers.test.tsx +1 -1
  78. package/src/__tests__/complex-disclosure-renderers.test.tsx +3 -2
  79. package/src/__tests__/compliance.test.tsx +72 -0
  80. package/src/__tests__/feedback-overlay-renderers.test.tsx +1 -1
  81. package/src/__tests__/form-renderers.test.tsx +1 -1
  82. package/src/__tests__/layout-data-renderers.test.tsx +1 -1
  83. package/src/__tests__/navigation-overlay.test.tsx +273 -0
  84. package/src/__tests__/view-compliance.test.tsx +153 -0
  85. package/src/custom/action-param-dialog.tsx +264 -0
  86. package/src/{ui → custom}/button-group.tsx +1 -1
  87. package/src/{ui → custom}/combobox.tsx +3 -3
  88. package/src/{ui → custom}/date-picker.tsx +3 -3
  89. package/src/custom/field.tsx +81 -0
  90. package/src/{ui → custom}/filter-builder.tsx +3 -3
  91. package/src/custom/index.ts +14 -0
  92. package/src/custom/input-group.tsx +53 -0
  93. package/src/{ui → custom}/item.tsx +1 -1
  94. package/src/custom/native-select.tsx +33 -0
  95. package/src/custom/navigation-overlay.tsx +296 -0
  96. package/src/custom/sort-builder.tsx +129 -0
  97. package/src/index.css +20 -1
  98. package/src/index.ts +2 -0
  99. package/src/renderers/action/action-button.tsx +147 -0
  100. package/src/renderers/action/action-group.tsx +270 -0
  101. package/src/renderers/action/action-icon.tsx +150 -0
  102. package/src/renderers/action/action-menu.tsx +203 -0
  103. package/src/renderers/action/index.ts +18 -0
  104. package/src/renderers/action/resolve-icon.ts +35 -0
  105. package/src/renderers/basic/button-group.tsx +1 -0
  106. package/src/renderers/basic/div.tsx +12 -1
  107. package/src/renderers/basic/html.tsx +1 -0
  108. package/src/renderers/basic/icon.tsx +1 -0
  109. package/src/renderers/basic/image.tsx +1 -0
  110. package/src/renderers/basic/navigation-menu.tsx +1 -0
  111. package/src/renderers/basic/pagination.tsx +31 -4
  112. package/src/renderers/basic/separator.tsx +1 -0
  113. package/src/renderers/basic/span.tsx +12 -1
  114. package/src/renderers/basic/text.tsx +4 -2
  115. package/src/renderers/complex/__tests__/data-table-batch-editing.test.tsx +275 -0
  116. package/src/renderers/complex/__tests__/data-table-cell-renderer.test.tsx +120 -0
  117. package/src/renderers/complex/__tests__/data-table-editing.test.tsx +221 -0
  118. package/src/renderers/complex/carousel.tsx +1 -0
  119. package/src/renderers/complex/data-table.tsx +355 -95
  120. package/src/renderers/complex/filter-builder.tsx +2 -1
  121. package/src/renderers/complex/resizable.tsx +2 -1
  122. package/src/renderers/complex/scroll-area.tsx +25 -7
  123. package/src/renderers/complex/table.tsx +1 -0
  124. package/src/renderers/data-display/alert.tsx +1 -0
  125. package/src/renderers/data-display/avatar.tsx +1 -0
  126. package/src/renderers/data-display/badge.tsx +1 -0
  127. package/src/renderers/data-display/breadcrumb.tsx +1 -0
  128. package/src/renderers/data-display/kbd.tsx +1 -0
  129. package/src/renderers/data-display/list.tsx +21 -49
  130. package/src/renderers/data-display/statistic.tsx +21 -5
  131. package/src/renderers/data-display/table.tsx +21 -11
  132. package/src/renderers/data-display/tree-view.tsx +7 -1
  133. package/src/renderers/disclosure/accordion.tsx +1 -0
  134. package/src/renderers/disclosure/collapsible.tsx +1 -0
  135. package/src/renderers/disclosure/toggle-group.tsx +2 -0
  136. package/src/renderers/feedback/empty.tsx +1 -0
  137. package/src/renderers/feedback/loading.tsx +2 -1
  138. package/src/renderers/feedback/progress.tsx +1 -0
  139. package/src/renderers/feedback/skeleton.tsx +1 -0
  140. package/src/renderers/feedback/sonner.tsx +1 -0
  141. package/src/renderers/feedback/spinner.tsx +1 -0
  142. package/src/renderers/feedback/toast.tsx +1 -0
  143. package/src/renderers/feedback/toaster.tsx +1 -0
  144. package/src/renderers/form/button.tsx +35 -1
  145. package/src/renderers/form/calendar.tsx +1 -0
  146. package/src/renderers/form/checkbox.tsx +38 -16
  147. package/src/renderers/form/combobox.tsx +2 -1
  148. package/src/renderers/form/command.tsx +1 -0
  149. package/src/renderers/form/date-picker.tsx +1 -0
  150. package/src/renderers/form/file-upload.tsx +1 -0
  151. package/src/renderers/form/form.tsx +115 -19
  152. package/src/renderers/form/input-otp.tsx +1 -0
  153. package/src/renderers/form/input.tsx +3 -0
  154. package/src/renderers/form/label.tsx +1 -0
  155. package/src/renderers/form/radio-group.tsx +1 -0
  156. package/src/renderers/form/select.tsx +35 -15
  157. package/src/renderers/form/slider.tsx +1 -0
  158. package/src/renderers/form/switch.tsx +1 -0
  159. package/src/renderers/form/textarea.tsx +50 -27
  160. package/src/renderers/form/toggle.tsx +3 -45
  161. package/src/renderers/index.ts +1 -0
  162. package/src/renderers/layout/aspect-ratio.tsx +2 -1
  163. package/src/renderers/layout/card.tsx +10 -2
  164. package/src/renderers/layout/container.tsx +1 -0
  165. package/src/renderers/layout/flex.tsx +1 -0
  166. package/src/renderers/layout/grid.tsx +23 -8
  167. package/src/renderers/layout/page.tsx +433 -57
  168. package/src/renderers/layout/semantic.tsx +1 -0
  169. package/src/renderers/layout/stack.tsx +2 -1
  170. package/src/renderers/layout/tabs.tsx +43 -17
  171. package/src/renderers/navigation/header-bar.tsx +1 -0
  172. package/src/renderers/navigation/sidebar.tsx +11 -0
  173. package/src/renderers/overlay/alert-dialog.tsx +1 -0
  174. package/src/renderers/overlay/context-menu.tsx +1 -0
  175. package/src/renderers/overlay/dialog.tsx +1 -0
  176. package/src/renderers/overlay/drawer.tsx +1 -0
  177. package/src/renderers/overlay/dropdown-menu.tsx +1 -0
  178. package/src/renderers/overlay/hover-card.tsx +1 -0
  179. package/src/renderers/overlay/menubar.tsx +1 -0
  180. package/src/renderers/overlay/popover.tsx +1 -0
  181. package/src/renderers/overlay/sheet.tsx +1 -0
  182. package/src/renderers/overlay/tooltip.tsx +1 -0
  183. package/src/renderers/placeholders.tsx +4 -4
  184. package/src/stories/CRMApp.stories.tsx +706 -0
  185. package/src/stories/Guide.mdx +55 -0
  186. package/src/stories/Introduction.mdx +61 -0
  187. package/src/stories/MockedData.stories.tsx +121 -0
  188. package/src/stories/assets/accessibility.png +0 -0
  189. package/src/stories/assets/accessibility.svg +1 -0
  190. package/src/stories/assets/addon-library.png +0 -0
  191. package/src/stories/assets/assets.png +0 -0
  192. package/src/stories/assets/avif-test-image.avif +0 -0
  193. package/src/stories/assets/context.png +0 -0
  194. package/src/stories/assets/discord.svg +1 -0
  195. package/src/stories/assets/docs.png +0 -0
  196. package/src/stories/assets/figma-plugin.png +0 -0
  197. package/src/stories/assets/github.svg +1 -0
  198. package/src/stories/assets/share.png +0 -0
  199. package/src/stories/assets/styling.png +0 -0
  200. package/src/stories/assets/testing.png +0 -0
  201. package/src/stories/assets/theming.png +0 -0
  202. package/src/stories/assets/tutorials.svg +1 -0
  203. package/src/stories/assets/youtube.svg +1 -0
  204. package/src/stories/button.css +30 -0
  205. package/src/stories/header.css +32 -0
  206. package/src/stories/page.css +68 -0
  207. package/src/stories-json/accordion.stories.tsx +43 -0
  208. package/src/stories-json/aggrid.stories.tsx +103 -0
  209. package/src/stories-json/alert.stories.tsx +39 -0
  210. package/src/stories-json/aspect-ratio.stories.tsx +34 -0
  211. package/src/stories-json/avatar.stories.tsx +38 -0
  212. package/src/stories-json/badge.stories.tsx +53 -0
  213. package/src/stories-json/breadcrumb.stories.tsx +30 -0
  214. package/src/stories-json/button-group.stories.tsx +43 -0
  215. package/src/stories-json/button.stories.tsx +73 -0
  216. package/src/stories-json/calendar.stories.tsx +85 -0
  217. package/src/stories-json/card.stories.tsx +48 -0
  218. package/src/stories-json/carousel.stories.tsx +33 -0
  219. package/src/stories-json/charts.stories.tsx +195 -0
  220. package/src/stories-json/chatbot.stories.tsx +248 -0
  221. package/src/stories-json/code-editor.stories.tsx +92 -0
  222. package/src/stories-json/collapsible.stories.tsx +40 -0
  223. package/src/stories-json/controls.stories.tsx +36 -0
  224. package/src/stories-json/crm-live-data.stories.tsx +154 -0
  225. package/src/stories-json/dashboard.stories.tsx +318 -0
  226. package/src/stories-json/data-table.stories.tsx +136 -0
  227. package/src/stories-json/data_display_extras.stories.tsx +102 -0
  228. package/src/stories-json/date-picker.stories.tsx +28 -0
  229. package/src/stories-json/detail-view.stories.tsx +258 -0
  230. package/src/stories-json/dialog.stories.tsx +43 -0
  231. package/src/stories-json/feedback_extras.stories.tsx +40 -0
  232. package/src/stories-json/feedback_others.stories.tsx +46 -0
  233. package/src/stories-json/form-variants.stories.tsx +210 -0
  234. package/src/stories-json/form_advanced.stories.tsx +117 -0
  235. package/src/stories-json/form_extras.stories.tsx +123 -0
  236. package/src/stories-json/grid.stories.tsx +56 -0
  237. package/src/stories-json/icon.stories.tsx +36 -0
  238. package/src/stories-json/input.stories.tsx +52 -0
  239. package/src/stories-json/kanban.stories.tsx +295 -0
  240. package/src/stories-json/layout_extended.stories.tsx +76 -0
  241. package/src/stories-json/layout_flex.stories.tsx +107 -0
  242. package/src/stories-json/list-view.stories.tsx +97 -0
  243. package/src/stories-json/markdown.stories.tsx +129 -0
  244. package/src/stories-json/menus.stories.tsx +63 -0
  245. package/src/stories-json/metric-card.stories.tsx +143 -0
  246. package/src/stories-json/navigation-menu.stories.tsx +37 -0
  247. package/src/stories-json/object-aggrid-advanced.stories.tsx +389 -0
  248. package/src/stories-json/object-aggrid.stories.tsx +252 -0
  249. package/src/stories-json/object-form.stories.tsx +130 -0
  250. package/src/stories-json/object-gantt.stories.tsx +114 -0
  251. package/src/stories-json/object-grid.stories.tsx +315 -0
  252. package/src/stories-json/object-map.stories.tsx +116 -0
  253. package/src/stories-json/object-view.stories.tsx +118 -0
  254. package/src/stories-json/overlay_extras.stories.tsx +113 -0
  255. package/src/stories-json/overlay_others.stories.tsx +76 -0
  256. package/src/stories-json/page.stories.tsx +55 -0
  257. package/src/stories-json/reports.stories.tsx +163 -0
  258. package/src/stories-json/resizable.stories.tsx +44 -0
  259. package/src/stories-json/select.stories.tsx +34 -0
  260. package/src/stories-json/separator.stories.tsx +41 -0
  261. package/src/stories-json/sidebar.stories.tsx +147 -0
  262. package/src/stories-json/statistic.stories.tsx +44 -0
  263. package/src/stories-json/tabs.stories.tsx +51 -0
  264. package/src/stories-json/timeline.stories.tsx +188 -0
  265. package/src/stories-json/typography.stories.tsx +45 -0
  266. package/src/ui/accordion.tsx +47 -53
  267. package/src/ui/alert-dialog.tsx +103 -117
  268. package/src/ui/alert.tsx +35 -36
  269. package/src/ui/aspect-ratio.tsx +1 -5
  270. package/src/ui/avatar.tsx +41 -42
  271. package/src/ui/badge.tsx +6 -15
  272. package/src/ui/breadcrumb.tsx +81 -75
  273. package/src/ui/button.tsx +10 -11
  274. package/src/ui/calendar.tsx +178 -51
  275. package/src/ui/card.tsx +51 -110
  276. package/src/ui/carousel.tsx +136 -113
  277. package/src/ui/chart.tsx +367 -0
  278. package/src/ui/checkbox.tsx +20 -22
  279. package/src/ui/collapsible.tsx +5 -25
  280. package/src/ui/command.tsx +106 -135
  281. package/src/ui/context-menu.tsx +69 -116
  282. package/src/ui/dialog.tsx +94 -113
  283. package/src/ui/drawer.tsx +82 -99
  284. package/src/ui/dropdown-menu.tsx +134 -188
  285. package/src/ui/form.tsx +51 -40
  286. package/src/ui/hover-card.tsx +18 -33
  287. package/src/ui/index.ts +2 -8
  288. package/src/ui/input-otp.tsx +42 -52
  289. package/src/ui/input.tsx +13 -15
  290. package/src/ui/label.tsx +17 -15
  291. package/src/ui/menubar.tsx +188 -206
  292. package/src/ui/navigation-menu.tsx +96 -136
  293. package/src/ui/pagination.tsx +86 -96
  294. package/src/ui/popover.tsx +24 -41
  295. package/src/ui/progress.tsx +21 -22
  296. package/src/ui/radio-group.tsx +19 -20
  297. package/src/ui/resizable.tsx +32 -42
  298. package/src/ui/scroll-area.tsx +38 -48
  299. package/src/ui/select.tsx +129 -157
  300. package/src/ui/separator.tsx +2 -2
  301. package/src/ui/sheet.tsx +110 -107
  302. package/src/ui/sidebar.tsx +442 -408
  303. package/src/ui/skeleton.tsx +6 -11
  304. package/src/ui/slider.tsx +19 -54
  305. package/src/ui/sonner.tsx +19 -1
  306. package/src/ui/switch.tsx +19 -21
  307. package/src/ui/tabs.tsx +6 -37
  308. package/src/ui/textarea.tsx +8 -4
  309. package/src/ui/toast.tsx +137 -0
  310. package/src/ui/toggle-group.tsx +28 -37
  311. package/src/ui/toggle.tsx +19 -19
  312. package/src/ui/tooltip.tsx +21 -52
  313. package/src/ui/typography.tsx +85 -0
  314. package/tsconfig.json +1 -1
  315. package/vite.config.ts +9 -1
  316. package/vitest.config.ts +5 -0
  317. package/ISSUES_FOUND.md +0 -128
  318. /package/dist/src/{ui → custom}/combobox.d.ts +0 -0
  319. /package/dist/src/{ui → custom}/date-picker.d.ts +0 -0
  320. /package/dist/src/{ui → custom}/empty.d.ts +0 -0
  321. /package/dist/src/{ui → custom}/filter-builder.d.ts +0 -0
  322. /package/dist/src/{ui → custom}/kbd.d.ts +0 -0
  323. /package/dist/src/{ui → custom}/spinner.d.ts +0 -0
  324. /package/src/{ui → custom}/empty.tsx +0 -0
  325. /package/src/{ui → custom}/kbd.tsx +0 -0
  326. /package/src/{ui → custom}/spinner.tsx +0 -0
@@ -0,0 +1,389 @@
1
+ import type { Meta, StoryObj } from '@storybook/react';
2
+ import { SchemaRenderer } from '../SchemaRenderer';
3
+ import type { BaseSchema } from '@object-ui/types';
4
+
5
+ const meta = {
6
+ title: 'Plugins/Data Views/Object AgGrid Advanced',
7
+ component: SchemaRenderer,
8
+ parameters: {
9
+ layout: 'padded',
10
+ },
11
+ tags: ['autodocs'],
12
+ argTypes: {
13
+ schema: { table: { disable: true } },
14
+ },
15
+ } satisfies Meta<any>;
16
+
17
+ export default meta;
18
+ type Story = StoryObj<typeof meta>;
19
+
20
+ const renderStory = (args: any) => <SchemaRenderer schema={args as unknown as BaseSchema} />;
21
+
22
+ // Mock data source for demonstration
23
+ const createMockDataSource = (objectName: string, data: any[]) => {
24
+ const mockSchema = {
25
+ name: objectName,
26
+ label: objectName.charAt(0).toUpperCase() + objectName.slice(1),
27
+ fields: {} as any
28
+ };
29
+
30
+ // Infer fields from data
31
+ if (data.length > 0) {
32
+ const firstRow = data[0];
33
+ Object.keys(firstRow).forEach(key => {
34
+ let type = 'text';
35
+ const value = firstRow[key];
36
+
37
+ if (typeof value === 'number') type = 'number';
38
+ else if (typeof value === 'boolean') type = 'boolean';
39
+ else if (key.includes('email')) type = 'email';
40
+ else if (key.includes('phone')) type = 'phone';
41
+ else if (key.includes('url') || key.includes('website')) type = 'url';
42
+ else if (key.includes('date')) type = 'date';
43
+ else if (key.includes('price') || key.includes('cost') || key.includes('amount') || key.includes('salary')) type = 'currency';
44
+ else if (key.includes('percent') || key.includes('rate')) type = 'percent';
45
+
46
+ mockSchema.fields[key] = {
47
+ name: key,
48
+ label: key.charAt(0).toUpperCase() + key.slice(1).replace(/_/g, ' '),
49
+ type,
50
+ sortable: true,
51
+ filterable: true,
52
+ editable: key !== 'id' // All fields except ID are editable
53
+ };
54
+ });
55
+ }
56
+
57
+ return {
58
+ find: async () => ({
59
+ data,
60
+ total: data.length,
61
+ page: 1,
62
+ pageSize: data.length,
63
+ hasMore: false
64
+ }),
65
+ getObjectSchema: async () => mockSchema
66
+ };
67
+ };
68
+
69
+ // Sample data for advanced examples
70
+ const employeesData = [
71
+ {
72
+ id: '1',
73
+ name: 'Alice Johnson',
74
+ email: 'alice.j@company.com',
75
+ department: 'Engineering',
76
+ position: 'Senior Developer',
77
+ salary: 95000,
78
+ start_date: '2020-01-15',
79
+ status: 'Active'
80
+ },
81
+ {
82
+ id: '2',
83
+ name: 'Bob Smith',
84
+ email: 'bob.s@company.com',
85
+ department: 'Marketing',
86
+ position: 'Marketing Manager',
87
+ salary: 72000,
88
+ start_date: '2021-03-20',
89
+ status: 'Active'
90
+ },
91
+ {
92
+ id: '3',
93
+ name: 'Carol Davis',
94
+ email: 'carol.d@company.com',
95
+ department: 'Sales',
96
+ position: 'Sales Representative',
97
+ salary: 68000,
98
+ start_date: '2021-06-10',
99
+ status: 'Active'
100
+ },
101
+ {
102
+ id: '4',
103
+ name: 'David Wilson',
104
+ email: 'david.w@company.com',
105
+ department: 'Engineering',
106
+ position: 'Lead Engineer',
107
+ salary: 102000,
108
+ start_date: '2019-08-01',
109
+ status: 'Active'
110
+ },
111
+ {
112
+ id: '5',
113
+ name: 'Eve Brown',
114
+ email: 'eve.b@company.com',
115
+ department: 'HR',
116
+ position: 'HR Specialist',
117
+ salary: 65000,
118
+ start_date: '2022-02-14',
119
+ status: 'On Leave'
120
+ },
121
+ {
122
+ id: '6',
123
+ name: 'Frank Miller',
124
+ email: 'frank.m@company.com',
125
+ department: 'Engineering',
126
+ position: 'Software Engineer',
127
+ salary: 88000,
128
+ start_date: '2021-11-03',
129
+ status: 'Active'
130
+ },
131
+ {
132
+ id: '7',
133
+ name: 'Grace Lee',
134
+ email: 'grace.l@company.com',
135
+ department: 'Marketing',
136
+ position: 'Content Writer',
137
+ salary: 58000,
138
+ start_date: '2022-05-22',
139
+ status: 'Active'
140
+ },
141
+ {
142
+ id: '8',
143
+ name: 'Henry Clark',
144
+ email: 'henry.c@company.com',
145
+ department: 'Sales',
146
+ position: 'Sales Manager',
147
+ salary: 85000,
148
+ start_date: '2020-09-15',
149
+ status: 'Active'
150
+ },
151
+ ];
152
+
153
+ const ordersData = [
154
+ {
155
+ id: 'ORD-001',
156
+ customer: 'Acme Corp',
157
+ product: 'Enterprise License',
158
+ quantity: 10,
159
+ amount: 15750,
160
+ date: '2024-01-15',
161
+ status: 'Delivered'
162
+ },
163
+ {
164
+ id: 'ORD-002',
165
+ customer: 'TechStart Inc',
166
+ product: 'Professional Plan',
167
+ quantity: 5,
168
+ amount: 8500,
169
+ date: '2024-01-18',
170
+ status: 'Shipped'
171
+ },
172
+ {
173
+ id: 'ORD-003',
174
+ customer: 'Global Solutions',
175
+ product: 'Enterprise License',
176
+ quantity: 15,
177
+ amount: 22300,
178
+ date: '2024-01-20',
179
+ status: 'Processing'
180
+ },
181
+ {
182
+ id: 'ORD-004',
183
+ customer: 'Innovation Labs',
184
+ product: 'Professional Plan',
185
+ quantity: 8,
186
+ amount: 12100,
187
+ date: '2024-01-22',
188
+ status: 'Delivered'
189
+ },
190
+ {
191
+ id: 'ORD-005',
192
+ customer: 'Future Systems',
193
+ product: 'Starter Plan',
194
+ quantity: 20,
195
+ amount: 9800,
196
+ date: '2024-01-25',
197
+ status: 'Shipped'
198
+ },
199
+ ];
200
+
201
+ // Advanced Stories
202
+
203
+ export const WithStatusBarAndAggregations: Story = {
204
+ render: renderStory,
205
+ name: 'Status Bar & Aggregations',
206
+ args: {
207
+ type: 'object-aggrid',
208
+ objectName: 'employees',
209
+ dataSource: createMockDataSource('employees', employeesData),
210
+ pagination: true,
211
+ pageSize: 10,
212
+ theme: 'quartz',
213
+ height: 550,
214
+ rowSelection: 'multiple',
215
+ statusBar: {
216
+ enabled: true,
217
+ aggregations: ['count', 'sum', 'avg', 'min', 'max']
218
+ },
219
+ columnConfig: {
220
+ resizable: true,
221
+ sortable: true,
222
+ filterable: true
223
+ }
224
+ } as any,
225
+ };
226
+
227
+ export const WithContextMenu: Story = {
228
+ render: renderStory,
229
+ name: 'Context Menu',
230
+ args: {
231
+ type: 'object-aggrid',
232
+ objectName: 'employees',
233
+ dataSource: createMockDataSource('employees', employeesData),
234
+ pagination: true,
235
+ pageSize: 10,
236
+ theme: 'quartz',
237
+ height: 500,
238
+ contextMenu: {
239
+ enabled: true,
240
+ items: ['copy', 'copyWithHeaders', 'separator', 'export', 'autoSizeAll']
241
+ },
242
+ columnConfig: {
243
+ resizable: true,
244
+ sortable: true,
245
+ filterable: true
246
+ }
247
+ } as any,
248
+ };
249
+
250
+ export const InlineEditingWithSelection: Story = {
251
+ render: renderStory,
252
+ name: 'Inline Editing + Row Selection',
253
+ args: {
254
+ type: 'object-aggrid',
255
+ objectName: 'orders',
256
+ dataSource: createMockDataSource('orders', ordersData),
257
+ editable: true,
258
+ singleClickEdit: true,
259
+ pagination: true,
260
+ pageSize: 10,
261
+ theme: 'alpine',
262
+ height: 500,
263
+ rowSelection: 'multiple',
264
+ columnConfig: {
265
+ resizable: true,
266
+ sortable: true,
267
+ filterable: true
268
+ }
269
+ } as any,
270
+ };
271
+
272
+ export const FullFeatured: Story = {
273
+ render: renderStory,
274
+ name: 'Full Featured (All Options)',
275
+ args: {
276
+ type: 'object-aggrid',
277
+ objectName: 'employees',
278
+ dataSource: createMockDataSource('employees', employeesData),
279
+ editable: true,
280
+ singleClickEdit: false,
281
+ pagination: true,
282
+ pageSize: 5,
283
+ theme: 'quartz',
284
+ height: 600,
285
+ rowSelection: 'multiple',
286
+ animateRows: true,
287
+ enableRangeSelection: true,
288
+ exportConfig: {
289
+ enabled: true,
290
+ fileName: 'employees.csv'
291
+ },
292
+ statusBar: {
293
+ enabled: true,
294
+ aggregations: ['count', 'sum', 'avg']
295
+ },
296
+ contextMenu: {
297
+ enabled: true,
298
+ items: ['copy', 'copyWithHeaders', 'separator', 'export', 'autoSizeAll']
299
+ },
300
+ columnConfig: {
301
+ resizable: true,
302
+ sortable: true,
303
+ filterable: true
304
+ }
305
+ } as any,
306
+ };
307
+
308
+ export const AlpineThemeFullFeatured: Story = {
309
+ render: renderStory,
310
+ name: 'Alpine Theme (Full Featured)',
311
+ args: {
312
+ type: 'object-aggrid',
313
+ objectName: 'orders',
314
+ dataSource: createMockDataSource('orders', ordersData),
315
+ editable: true,
316
+ singleClickEdit: true,
317
+ pagination: true,
318
+ pageSize: 5,
319
+ theme: 'alpine',
320
+ height: 550,
321
+ rowSelection: 'multiple',
322
+ exportConfig: {
323
+ enabled: true,
324
+ fileName: 'orders.csv'
325
+ },
326
+ statusBar: {
327
+ enabled: true,
328
+ aggregations: ['count', 'sum']
329
+ },
330
+ contextMenu: {
331
+ enabled: true,
332
+ items: ['copy', 'export', 'autoSizeAll']
333
+ },
334
+ columnConfig: {
335
+ resizable: true,
336
+ sortable: true,
337
+ filterable: true
338
+ }
339
+ } as any,
340
+ };
341
+
342
+ export const BalhamThemeWithExport: Story = {
343
+ render: renderStory,
344
+ name: 'Balham Theme + Export',
345
+ args: {
346
+ type: 'object-aggrid',
347
+ objectName: 'employees',
348
+ dataSource: createMockDataSource('employees', employeesData),
349
+ pagination: true,
350
+ pageSize: 10,
351
+ theme: 'balham',
352
+ height: 500,
353
+ rowSelection: 'multiple',
354
+ exportConfig: {
355
+ enabled: true,
356
+ fileName: 'employees-balham.csv',
357
+ onlySelected: true
358
+ },
359
+ columnConfig: {
360
+ resizable: true,
361
+ sortable: true,
362
+ filterable: true
363
+ }
364
+ } as any,
365
+ };
366
+
367
+ export const MaterialThemeWithStatusBar: Story = {
368
+ render: renderStory,
369
+ name: 'Material Theme + Status Bar',
370
+ args: {
371
+ type: 'object-aggrid',
372
+ objectName: 'orders',
373
+ dataSource: createMockDataSource('orders', ordersData),
374
+ pagination: true,
375
+ pageSize: 10,
376
+ theme: 'material',
377
+ height: 550,
378
+ rowSelection: 'multiple',
379
+ statusBar: {
380
+ enabled: true,
381
+ aggregations: ['count', 'sum', 'avg']
382
+ },
383
+ columnConfig: {
384
+ resizable: true,
385
+ sortable: true,
386
+ filterable: true
387
+ }
388
+ } as any,
389
+ };
@@ -0,0 +1,252 @@
1
+ import type { Meta, StoryObj } from '@storybook/react';
2
+ import { SchemaRenderer } from '../SchemaRenderer';
3
+ import type { BaseSchema } from '@object-ui/types';
4
+ import { ObjectStackAdapter } from '@object-ui/data-objectstack';
5
+
6
+ const meta = {
7
+ title: 'Plugins/Data Views/Object AgGrid',
8
+ component: SchemaRenderer,
9
+ parameters: {
10
+ layout: 'padded',
11
+ },
12
+ tags: ['autodocs'],
13
+ argTypes: {
14
+ schema: { table: { disable: true } },
15
+ },
16
+ } satisfies Meta<any>;
17
+
18
+ export default meta;
19
+ type Story = StoryObj<typeof meta>;
20
+
21
+ const renderStory = (args: any) => <SchemaRenderer schema={args as unknown as BaseSchema} />;
22
+
23
+ // Mock data source for demonstration
24
+ const createMockDataSource = (objectName: string, data: any[]) => {
25
+ const mockSchema = {
26
+ name: objectName,
27
+ label: objectName.charAt(0).toUpperCase() + objectName.slice(1),
28
+ fields: {} as any
29
+ };
30
+
31
+ // Infer fields from data
32
+ if (data.length > 0) {
33
+ const firstRow = data[0];
34
+ Object.keys(firstRow).forEach(key => {
35
+ let type = 'text';
36
+ const value = firstRow[key];
37
+
38
+ if (typeof value === 'number') type = 'number';
39
+ else if (typeof value === 'boolean') type = 'boolean';
40
+ else if (key.includes('email')) type = 'email';
41
+ else if (key.includes('phone')) type = 'phone';
42
+ else if (key.includes('url') || key.includes('website')) type = 'url';
43
+ else if (key.includes('date')) type = 'date';
44
+ else if (key.includes('price') || key.includes('cost') || key.includes('amount')) type = 'currency';
45
+ else if (key.includes('percent') || key.includes('rate')) type = 'percent';
46
+
47
+ mockSchema.fields[key] = {
48
+ name: key,
49
+ label: key.charAt(0).toUpperCase() + key.slice(1).replace(/_/g, ' '),
50
+ type,
51
+ sortable: true,
52
+ filterable: true
53
+ };
54
+ });
55
+ }
56
+
57
+ return {
58
+ find: async () => ({
59
+ data,
60
+ total: data.length,
61
+ page: 1,
62
+ pageSize: data.length,
63
+ hasMore: false
64
+ }),
65
+ getObjectSchema: async () => mockSchema
66
+ };
67
+ };
68
+
69
+ const contactsData = [
70
+ {
71
+ id: '1',
72
+ name: 'John Doe',
73
+ email: 'john.doe@example.com',
74
+ phone: '+1-555-0101',
75
+ company: 'Acme Corp',
76
+ status: 'Active',
77
+ created_date: '2024-01-15'
78
+ },
79
+ {
80
+ id: '2',
81
+ name: 'Jane Smith',
82
+ email: 'jane.smith@example.com',
83
+ phone: '+1-555-0102',
84
+ company: 'Tech Solutions',
85
+ status: 'Active',
86
+ created_date: '2024-01-20'
87
+ },
88
+ {
89
+ id: '3',
90
+ name: 'Bob Johnson',
91
+ email: 'bob.johnson@example.com',
92
+ phone: '+1-555-0103',
93
+ company: 'Innovate Inc',
94
+ status: 'Inactive',
95
+ created_date: '2024-02-01'
96
+ },
97
+ {
98
+ id: '4',
99
+ name: 'Alice Williams',
100
+ email: 'alice.w@example.com',
101
+ phone: '+1-555-0104',
102
+ company: 'Creative Studio',
103
+ status: 'Active',
104
+ created_date: '2024-02-10'
105
+ },
106
+ {
107
+ id: '5',
108
+ name: 'Charlie Brown',
109
+ email: 'charlie.b@example.com',
110
+ phone: '+1-555-0105',
111
+ company: 'Digital Agency',
112
+ status: 'Active',
113
+ created_date: '2024-02-15'
114
+ },
115
+ ];
116
+
117
+ const productsData = [
118
+ {
119
+ id: '1',
120
+ name: 'Laptop Pro',
121
+ category: 'Electronics',
122
+ price: 1299.99,
123
+ stock: 45,
124
+ rating: 4.5,
125
+ available: true
126
+ },
127
+ {
128
+ id: '2',
129
+ name: 'Wireless Mouse',
130
+ category: 'Electronics',
131
+ price: 29.99,
132
+ stock: 150,
133
+ rating: 4.2,
134
+ available: true
135
+ },
136
+ {
137
+ id: '3',
138
+ name: 'Desk Chair',
139
+ category: 'Furniture',
140
+ price: 299.99,
141
+ stock: 20,
142
+ rating: 4.8,
143
+ available: true
144
+ },
145
+ {
146
+ id: '4',
147
+ name: 'Monitor 27"',
148
+ category: 'Electronics',
149
+ price: 399.99,
150
+ stock: 35,
151
+ rating: 4.6,
152
+ available: true
153
+ },
154
+ {
155
+ id: '5',
156
+ name: 'Keyboard Mechanical',
157
+ category: 'Electronics',
158
+ price: 149.99,
159
+ stock: 60,
160
+ rating: 4.7,
161
+ available: false
162
+ },
163
+ ];
164
+
165
+ export const ContactsGrid: Story = {
166
+ render: renderStory,
167
+ args: {
168
+ type: 'object-aggrid',
169
+ objectName: 'contacts',
170
+ dataSource: createMockDataSource('contacts', contactsData),
171
+ pagination: true,
172
+ pageSize: 10,
173
+ theme: 'quartz',
174
+ height: 500,
175
+ animateRows: true,
176
+ columnConfig: {
177
+ resizable: true,
178
+ sortable: true,
179
+ filterable: true
180
+ }
181
+ } as any,
182
+ };
183
+
184
+ export const ProductsGrid: Story = {
185
+ render: renderStory,
186
+ args: {
187
+ type: 'object-aggrid',
188
+ objectName: 'products',
189
+ dataSource: createMockDataSource('products', productsData),
190
+ pagination: true,
191
+ pageSize: 10,
192
+ theme: 'quartz',
193
+ height: 500,
194
+ animateRows: true,
195
+ columnConfig: {
196
+ resizable: true,
197
+ sortable: true,
198
+ filterable: true
199
+ }
200
+ } as any,
201
+ };
202
+
203
+ export const WithFieldSelection: Story = {
204
+ render: renderStory,
205
+ args: {
206
+ type: 'object-aggrid',
207
+ objectName: 'contacts',
208
+ dataSource: createMockDataSource('contacts', contactsData),
209
+ fieldNames: ['name', 'email', 'company', 'status'],
210
+ pagination: true,
211
+ pageSize: 10,
212
+ theme: 'alpine',
213
+ height: 400
214
+ } as any,
215
+ };
216
+
217
+ export const EditableGrid: Story = {
218
+ render: renderStory,
219
+ args: {
220
+ type: 'object-aggrid',
221
+ objectName: 'products',
222
+ dataSource: createMockDataSource('products', productsData),
223
+ editable: true,
224
+ singleClickEdit: true,
225
+ pagination: true,
226
+ pageSize: 10,
227
+ theme: 'quartz',
228
+ height: 500,
229
+ columnConfig: {
230
+ resizable: true,
231
+ sortable: true,
232
+ filterable: true
233
+ }
234
+ } as any,
235
+ };
236
+
237
+ export const WithExport: Story = {
238
+ render: renderStory,
239
+ args: {
240
+ type: 'object-aggrid',
241
+ objectName: 'contacts',
242
+ dataSource: createMockDataSource('contacts', contactsData),
243
+ pagination: true,
244
+ pageSize: 10,
245
+ theme: 'quartz',
246
+ height: 500,
247
+ exportConfig: {
248
+ enabled: true,
249
+ fileName: 'contacts-export.csv'
250
+ }
251
+ } as any,
252
+ };