@goplusvn/core 0.1.0 → 0.1.1

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 (369) hide show
  1. package/package.json +2 -1
  2. package/src/assets/erp_wallpaper.png +0 -0
  3. package/src/assets/goeat_logo.png +0 -0
  4. package/src/audit/audit-manager.ts +139 -0
  5. package/src/audit/index.ts +11 -0
  6. package/src/audit/memory-audit-logger.ts +86 -0
  7. package/src/audit/types.ts +50 -0
  8. package/src/auth/auth-service.ts +97 -0
  9. package/src/auth/index.ts +266 -0
  10. package/src/code-generation/index.ts +69 -0
  11. package/src/configs/auth-routes.ts +17 -0
  12. package/src/configs/crud.ts +136 -0
  13. package/src/configs/data/navigations.ts +781 -0
  14. package/src/configs/data/oauth-links.ts +10 -0
  15. package/src/configs/entities/material-categories.config.ts +125 -0
  16. package/src/configs/i18n.ts +12 -0
  17. package/src/configs/index.ts +26 -0
  18. package/src/configs/status.ts +25 -0
  19. package/src/configs/themes.ts +100 -0
  20. package/src/crud/components/crud-bulk-actions.tsx +91 -0
  21. package/src/crud/components/crud-card-view.tsx +241 -0
  22. package/src/crud/components/crud-context.tsx +122 -0
  23. package/src/crud/components/crud-delete-dialog.tsx +145 -0
  24. package/src/crud/components/crud-dialog.tsx +406 -0
  25. package/src/crud/components/crud-empty-state.tsx +104 -0
  26. package/src/crud/components/crud-export-button.tsx +170 -0
  27. package/src/crud/components/crud-field-renderer.tsx +653 -0
  28. package/src/crud/components/crud-filter-chips.tsx +102 -0
  29. package/src/crud/components/crud-filters/checkbox-filter.tsx +97 -0
  30. package/src/crud/components/crud-filters/datetime-filter.tsx +83 -0
  31. package/src/crud/components/crud-filters/filter-builder.tsx +66 -0
  32. package/src/crud/components/crud-filters/index.tsx +76 -0
  33. package/src/crud/components/crud-filters/radio-filter.tsx +86 -0
  34. package/src/crud/components/crud-filters/select-filter.tsx +141 -0
  35. package/src/crud/components/crud-filters/text-filter.tsx +86 -0
  36. package/src/crud/components/crud-form.tsx +642 -0
  37. package/src/crud/components/crud-import-dialog.tsx +440 -0
  38. package/src/crud/components/crud-infinite-scroll.tsx +116 -0
  39. package/src/crud/components/crud-page.tsx +1017 -0
  40. package/src/crud/components/crud-provider.tsx +277 -0
  41. package/src/crud/components/crud-row-actions.tsx +189 -0
  42. package/src/crud/components/crud-search.tsx +82 -0
  43. package/src/crud/components/crud-sheet.tsx +336 -0
  44. package/src/crud/components/crud-table-skeleton.tsx +26 -0
  45. package/src/crud/components/crud-table-toolbar.tsx +91 -0
  46. package/src/crud/components/crud-table.tsx +352 -0
  47. package/src/crud/components/crud-virtual-table.tsx +55 -0
  48. package/src/crud/components/index.tsx +20 -0
  49. package/src/crud/crud-filters/checkbox-filter.tsx +87 -0
  50. package/src/crud/crud-filters/datetime-filter.tsx +82 -0
  51. package/src/crud/crud-filters/filter-builder.tsx +64 -0
  52. package/src/crud/crud-filters/index.tsx +78 -0
  53. package/src/crud/crud-filters/radio-filter.tsx +79 -0
  54. package/src/crud/crud-filters/select-filter.tsx +148 -0
  55. package/src/crud/crud-filters/text-filter.tsx +81 -0
  56. package/src/crud/index.ts +43 -0
  57. package/src/crud/lib/crud-service.test.ts +334 -0
  58. package/src/crud/lib/crud-service.ts +358 -0
  59. package/src/crud/lib/crud-utils.test.ts +354 -0
  60. package/src/crud/lib/crud-utils.ts +299 -0
  61. package/src/crud/lib/crud-validator.ts +247 -0
  62. package/src/crud/lib/data-loader.ts +234 -0
  63. package/src/crud/lib/field-calculator.ts +241 -0
  64. package/src/crud/lib/field-formatter.ts +240 -0
  65. package/src/crud/lib/import-export-service.test.ts +290 -0
  66. package/src/crud/lib/import-export-service.ts +352 -0
  67. package/src/crud/lib/import-server-utils.ts +109 -0
  68. package/src/crud/lib/lazy-loader.ts +241 -0
  69. package/src/crud/lib/parse-filters.ts +85 -0
  70. package/src/crud/lib/permissions.ts +52 -0
  71. package/src/crud/lib/serialize-config.ts +60 -0
  72. package/src/crud/lib/stream-loader.ts +145 -0
  73. package/src/crud/lib/translate-config.ts +335 -0
  74. package/src/crud/lib/types.ts +11 -0
  75. package/src/crud/pages/entity-crud-page.tsx +144 -0
  76. package/src/crud/server.ts +8 -0
  77. package/src/home/constants.tsx +142 -0
  78. package/src/home/feature-showcase.tsx +171 -0
  79. package/src/home/home-page.tsx +191 -0
  80. package/src/home/hooks/index.ts +1 -0
  81. package/src/home/hooks/useWidgetPreferences.ts +167 -0
  82. package/src/home/index.ts +33 -0
  83. package/src/home/quick-access-dialog.tsx +271 -0
  84. package/src/home/quick-access-menu.tsx +267 -0
  85. package/src/home/types.ts +140 -0
  86. package/src/home/welcome-card.tsx +92 -0
  87. package/src/home/widget-container.tsx +258 -0
  88. package/src/home/widgets/base-widget.tsx +200 -0
  89. package/src/home/widgets/customers-widget.tsx +74 -0
  90. package/src/home/widgets/index.ts +6 -0
  91. package/src/home/widgets/orders-widget.tsx +87 -0
  92. package/src/home/widgets/revenue-widget.tsx +71 -0
  93. package/src/home/widgets/stock-widget.tsx +109 -0
  94. package/src/hooks/index.tsx +598 -0
  95. package/src/hooks/use-tenant.test.tsx +30 -0
  96. package/src/hooks/use-tenant.ts +5 -0
  97. package/src/index.ts +17 -0
  98. package/src/infrastructure/__tests__/architecture-verification.spec.ts +103 -0
  99. package/src/infrastructure/api-service.ts +317 -0
  100. package/src/infrastructure/cache/cache-manager.ts +107 -0
  101. package/src/infrastructure/cache/cache.ts +120 -0
  102. package/src/infrastructure/cache/index.ts +8 -0
  103. package/src/infrastructure/cache/types.ts +48 -0
  104. package/src/infrastructure/cron/cron-manager.ts +239 -0
  105. package/src/infrastructure/cron/index.ts +6 -0
  106. package/src/infrastructure/cron/types.ts +41 -0
  107. package/src/infrastructure/event-bus/event-bus.ts +145 -0
  108. package/src/infrastructure/event-bus/index.ts +2 -0
  109. package/src/infrastructure/event-bus/types.ts +22 -0
  110. package/src/infrastructure/index.ts +32 -0
  111. package/src/infrastructure/lock/decorators.ts +67 -0
  112. package/src/infrastructure/lock/index.ts +2 -0
  113. package/src/infrastructure/lock/lock-manager.ts +33 -0
  114. package/src/infrastructure/logger/index.ts +2 -0
  115. package/src/infrastructure/logger/logger.ts +96 -0
  116. package/src/infrastructure/logger/types.ts +25 -0
  117. package/src/layout/index.tsx +185 -0
  118. package/src/navigation/index.ts +91 -0
  119. package/src/notification/index.ts +14 -0
  120. package/src/notification/notification-service.ts +120 -0
  121. package/src/notification/storage/in-memory.ts +56 -0
  122. package/src/notification/storage/index.ts +1 -0
  123. package/src/notification/types.ts +51 -0
  124. package/src/organization/branch-service.ts +299 -0
  125. package/src/organization/branches.config.ts +154 -0
  126. package/src/organization/index.ts +5 -0
  127. package/src/plugin/apps-registry.ts +97 -0
  128. package/src/plugin/index.ts +5 -0
  129. package/src/plugin/types.ts +41 -0
  130. package/src/providers/index.tsx +109 -0
  131. package/src/providers/tenant-provider.tsx +45 -0
  132. package/src/rbac/components/roles/role-card.tsx +158 -0
  133. package/src/rbac/components/roles/role-stats-cards.tsx +29 -0
  134. package/src/rbac/components/roles/role-toolbar.tsx +123 -0
  135. package/src/rbac/hooks/use-role-operations.ts +159 -0
  136. package/src/rbac/hooks/use-roles-data.ts +59 -0
  137. package/src/rbac/index.ts +297 -0
  138. package/src/rbac/lib/permission-helpers.ts +63 -0
  139. package/src/rbac/pages/action-list-page.tsx +25 -0
  140. package/src/rbac/pages/resource-list-page.tsx +25 -0
  141. package/src/rbac/pages/role-list-page.tsx +378 -0
  142. package/src/rbac/permission-service.ts +140 -0
  143. package/src/rbac/permissions.ts +135 -0
  144. package/src/rbac/resource-service.ts +115 -0
  145. package/src/rbac/resource-validator.ts +119 -0
  146. package/src/rbac/role-service.ts +165 -0
  147. package/src/rbac/server.ts +16 -0
  148. package/src/rbac/types.ts +38 -0
  149. package/src/schemas/action.schema.ts +66 -0
  150. package/src/schemas/branch.schema.ts +52 -0
  151. package/src/schemas/coming-soon-schema.ts +9 -0
  152. package/src/schemas/company.schema.ts +44 -0
  153. package/src/schemas/forgot-passward-schema.ts +9 -0
  154. package/src/schemas/index.ts +30 -0
  155. package/src/schemas/material-category.schema.ts +43 -0
  156. package/src/schemas/material-pricing.schema.ts +74 -0
  157. package/src/schemas/material.schema.ts +76 -0
  158. package/src/schemas/materials.ts +52 -0
  159. package/src/schemas/new-passward-schema.ts +15 -0
  160. package/src/schemas/partner-company.schema.ts +149 -0
  161. package/src/schemas/register-schema.ts +36 -0
  162. package/src/schemas/resource.schema.ts +133 -0
  163. package/src/schemas/role.schema.ts +11 -0
  164. package/src/schemas/sign-in-schema.ts +24 -0
  165. package/src/schemas/supplier-pricing.schema.ts +15 -0
  166. package/src/schemas/supplier.schema.ts +120 -0
  167. package/src/schemas/system-category-group.schema.ts +67 -0
  168. package/src/schemas/system-category.schema.ts +77 -0
  169. package/src/schemas/system-config.schema.ts +118 -0
  170. package/src/schemas/uom.schema.ts +75 -0
  171. package/src/schemas/user-supplier.schema.ts +179 -0
  172. package/src/schemas/user.schema.ts +18 -0
  173. package/src/schemas/verify-email-schema.ts +9 -0
  174. package/src/schemas/warehouse.schema.ts +49 -0
  175. package/src/system/components/categories/category-list.tsx +529 -0
  176. package/src/system/components/categories/category-manager.tsx +89 -0
  177. package/src/system/components/categories/group-sidebar.tsx +308 -0
  178. package/src/system/components/settings/setting-dialogs.tsx +197 -0
  179. package/src/system/components/settings/setting-field.tsx +291 -0
  180. package/src/system/components/settings/setting-form-dialog.tsx +308 -0
  181. package/src/system/components/settings/settings-groups.ts +80 -0
  182. package/src/system/components/settings/settings-search.tsx +71 -0
  183. package/src/system/components/settings/settings-section.tsx +74 -0
  184. package/src/system/components/settings/settings-sidebar.tsx +81 -0
  185. package/src/system/constants.ts +3 -0
  186. package/src/system/index.ts +150 -0
  187. package/src/system/job-manager.ts +176 -0
  188. package/src/system/pages/components/categories/category-list.tsx +537 -0
  189. package/src/system/pages/components/categories/category-manager.tsx +90 -0
  190. package/src/system/pages/components/categories/group-sidebar.tsx +311 -0
  191. package/src/system/pages/components/settings/sales-rules-settings.tsx +222 -0
  192. package/src/system/pages/components/settings/setting-dialogs.tsx +197 -0
  193. package/src/system/pages/components/settings/setting-field.tsx +292 -0
  194. package/src/system/pages/components/settings/setting-form-dialog.tsx +308 -0
  195. package/src/system/pages/components/settings/settings-groups.ts +87 -0
  196. package/src/system/pages/components/settings/settings-page.tsx +372 -0
  197. package/src/system/pages/components/settings/settings-search.tsx +71 -0
  198. package/src/system/pages/components/settings/settings-section.tsx +74 -0
  199. package/src/system/pages/components/settings/settings-sidebar.tsx +81 -0
  200. package/src/system/pages/components/settings/system-settings.tsx +244 -0
  201. package/src/system/pages/system-category-page.tsx +15 -0
  202. package/src/system/pages/system-settings-page.tsx +380 -0
  203. package/src/system/schemas/system-category-group.schema.ts +46 -0
  204. package/src/system/schemas/system-category.schema.ts +56 -0
  205. package/src/system/services/settings-service.ts +127 -0
  206. package/src/system/services/system-category-service.ts +63 -0
  207. package/src/system/types.ts +45 -0
  208. package/src/types/index.ts +703 -0
  209. package/src/ui/auth/auth-layout.tsx +135 -0
  210. package/src/ui/auth/forgot-password-form.tsx +98 -0
  211. package/src/ui/auth/index.tsx +7 -0
  212. package/src/ui/auth/new-password-form.tsx +107 -0
  213. package/src/ui/auth/oauth-links.tsx +30 -0
  214. package/src/ui/auth/register-form.tsx +202 -0
  215. package/src/ui/auth/sign-in-form.tsx +238 -0
  216. package/src/ui/auth/verify-email-form.tsx +104 -0
  217. package/src/ui/crud/index.tsx +10 -0
  218. package/src/ui/data-display/accordion.tsx +65 -0
  219. package/src/ui/data-display/aspect-ratio.tsx +11 -0
  220. package/src/ui/data-display/avatar.tsx +163 -0
  221. package/src/ui/data-display/bento-grid.tsx +77 -0
  222. package/src/ui/data-display/carousel.tsx +249 -0
  223. package/src/ui/data-display/chart.tsx +363 -0
  224. package/src/ui/data-display/code-block-highlight.tsx +54 -0
  225. package/src/ui/data-display/collapsible.tsx +42 -0
  226. package/src/ui/data-display/compact-stat-bar.tsx +149 -0
  227. package/src/ui/data-display/data-table/data-table-context.tsx +255 -0
  228. package/src/ui/data-display/data-table/data-table-empty-state.tsx +133 -0
  229. package/src/ui/data-display/data-table/data-table-skeleton.tsx +145 -0
  230. package/src/ui/data-display/data-table/data-table-toolbar.tsx +353 -0
  231. package/src/ui/data-display/data-table/data-table.tsx +597 -0
  232. package/src/ui/data-display/data-table/index.ts +44 -0
  233. package/src/ui/data-display/data-table-column-header.tsx +75 -0
  234. package/src/ui/data-display/data-table-pagination.tsx +130 -0
  235. package/src/ui/data-display/data-table-view-options.tsx +59 -0
  236. package/src/ui/data-display/formatted-number-input.tsx +210 -0
  237. package/src/ui/data-display/highlight.tsx +20 -0
  238. package/src/ui/data-display/hover-card.tsx +48 -0
  239. package/src/ui/data-display/index.tsx +50 -0
  240. package/src/ui/data-display/iphone-15-pro.tsx +114 -0
  241. package/src/ui/data-display/kanban/index.ts +4 -0
  242. package/src/ui/data-display/kanban/kanban-board.tsx +192 -0
  243. package/src/ui/data-display/kanban/kanban-column.tsx +74 -0
  244. package/src/ui/data-display/kanban/kanban-item.tsx +50 -0
  245. package/src/ui/data-display/kanban/kanban-types.ts +21 -0
  246. package/src/ui/data-display/kpi-card.tsx +68 -0
  247. package/src/ui/data-display/media-grid.tsx +110 -0
  248. package/src/ui/data-display/safari.tsx +175 -0
  249. package/src/ui/data-display/show-more-text.tsx +55 -0
  250. package/src/ui/data-display/tabs.tsx +68 -0
  251. package/src/ui/data-display/timeline.tsx +256 -0
  252. package/src/ui/feedback/alert.tsx +60 -0
  253. package/src/ui/feedback/context-menu.tsx +245 -0
  254. package/src/ui/feedback/drawer.tsx +132 -0
  255. package/src/ui/feedback/error-dialog.tsx +273 -0
  256. package/src/ui/feedback/index.tsx +183 -0
  257. package/src/ui/feedback/progress.tsx +32 -0
  258. package/src/ui/feedback/sheet.tsx +148 -0
  259. package/src/ui/feedback/sonner.tsx +36 -0
  260. package/src/ui/forms/command.tsx +157 -0
  261. package/src/ui/forms/date-picker.tsx +73 -0
  262. package/src/ui/forms/date-range-picker.tsx +76 -0
  263. package/src/ui/forms/date-time-picker.tsx +109 -0
  264. package/src/ui/forms/editor/editor-menu-bar.tsx +394 -0
  265. package/src/ui/forms/editor/index.tsx +130 -0
  266. package/src/ui/forms/editor/multi-select-example.tsx +1234 -0
  267. package/src/ui/forms/emoji-picker.tsx +109 -0
  268. package/src/ui/forms/file-dropzone.tsx +169 -0
  269. package/src/ui/forms/file-thumbnail.tsx +29 -0
  270. package/src/ui/forms/index.tsx +201 -0
  271. package/src/ui/forms/input-file.tsx +99 -0
  272. package/src/ui/forms/input-group.tsx +46 -0
  273. package/src/ui/forms/input-otp.tsx +81 -0
  274. package/src/ui/forms/input-phone.tsx +172 -0
  275. package/src/ui/forms/input-spin.tsx +116 -0
  276. package/src/ui/forms/input-tags.tsx +219 -0
  277. package/src/ui/forms/input-time.tsx +42 -0
  278. package/src/ui/forms/multi-select.tsx +629 -0
  279. package/src/ui/forms/multiple-date-picker.tsx +74 -0
  280. package/src/ui/forms/radio-group.tsx +42 -0
  281. package/src/ui/forms/rating.tsx +158 -0
  282. package/src/ui/forms/time-picker.tsx +57 -0
  283. package/src/ui/index.tsx +17 -0
  284. package/src/ui/layout/animated-list.tsx +77 -0
  285. package/src/ui/layout/animated-sidebar.tsx +294 -0
  286. package/src/ui/layout/command-menu.tsx +355 -0
  287. package/src/ui/layout/customizer.tsx +324 -0
  288. package/src/ui/layout/footer.tsx +43 -0
  289. package/src/ui/layout/full-screen-toggle.tsx +52 -0
  290. package/src/ui/layout/header-breadcrumb.tsx +77 -0
  291. package/src/ui/layout/horizontal-layout-header.tsx +83 -0
  292. package/src/ui/layout/horizontal-layout.tsx +50 -0
  293. package/src/ui/layout/index.tsx +25 -0
  294. package/src/ui/layout/language-dropdown.tsx +103 -0
  295. package/src/ui/layout/logo.tsx +63 -0
  296. package/src/ui/layout/main-layout.tsx +57 -0
  297. package/src/ui/layout/mode-dropdown.tsx +58 -0
  298. package/src/ui/layout/notification-dropdown.tsx +127 -0
  299. package/src/ui/layout/page-tabs.tsx +306 -0
  300. package/src/ui/layout/route-cache.tsx +214 -0
  301. package/src/ui/layout/sidebar-group-icon-menu.tsx +195 -0
  302. package/src/ui/layout/sidebar.tsx +279 -0
  303. package/src/ui/layout/tab-content-cache.tsx +201 -0
  304. package/src/ui/layout/tab-navigation-provider.tsx +536 -0
  305. package/src/ui/layout/toggle-mobile-sidebar.tsx +33 -0
  306. package/src/ui/layout/top-bar-header-menubar.tsx +412 -0
  307. package/src/ui/layout/user-dropdown.tsx +188 -0
  308. package/src/ui/layout/vertical-layout-header.tsx +65 -0
  309. package/src/ui/layout/vertical-layout.tsx +47 -0
  310. package/src/ui/management/audit-log-page.tsx +209 -0
  311. package/src/ui/management/cache-management.tsx +349 -0
  312. package/src/ui/management/index.ts +3 -0
  313. package/src/ui/management/job-management.tsx +308 -0
  314. package/src/ui/pages/not-found.tsx +30 -0
  315. package/src/ui/primitives/badge.tsx +66 -0
  316. package/src/ui/primitives/breadcrumb.tsx +103 -0
  317. package/src/ui/primitives/button.tsx +129 -0
  318. package/src/ui/primitives/calendar.tsx +74 -0
  319. package/src/ui/primitives/card.tsx +86 -0
  320. package/src/ui/primitives/checkbox.tsx +31 -0
  321. package/src/ui/primitives/client.ts +30 -0
  322. package/src/ui/primitives/combobox.tsx +290 -0
  323. package/src/ui/primitives/dialog.tsx +121 -0
  324. package/src/ui/primitives/dropdown-menu.tsx +239 -0
  325. package/src/ui/primitives/dynamic-icon.tsx +24 -0
  326. package/src/ui/primitives/index.tsx +134 -0
  327. package/src/ui/primitives/input-number.tsx +131 -0
  328. package/src/ui/primitives/input.tsx +22 -0
  329. package/src/ui/primitives/keyboard.tsx +23 -0
  330. package/src/ui/primitives/label.tsx +24 -0
  331. package/src/ui/primitives/menubar.tsx +262 -0
  332. package/src/ui/primitives/navigation-menu.tsx +157 -0
  333. package/src/ui/primitives/pagination.tsx +118 -0
  334. package/src/ui/primitives/popover.tsx +56 -0
  335. package/src/ui/primitives/prefetch-link.tsx +60 -0
  336. package/src/ui/primitives/resizable.tsx +59 -0
  337. package/src/ui/primitives/scroll-area.tsx +63 -0
  338. package/src/ui/primitives/select.tsx +172 -0
  339. package/src/ui/primitives/separator.tsx +51 -0
  340. package/src/ui/primitives/sidebar.tsx +844 -0
  341. package/src/ui/primitives/slider.tsx +27 -0
  342. package/src/ui/primitives/status-badge.tsx +47 -0
  343. package/src/ui/primitives/sticky-layout.tsx +50 -0
  344. package/src/ui/primitives/switch.tsx +29 -0
  345. package/src/ui/primitives/table.tsx +116 -0
  346. package/src/ui/primitives/tabs.tsx +55 -0
  347. package/src/ui/primitives/toggle-group.tsx +70 -0
  348. package/src/ui/primitives/toggle.tsx +47 -0
  349. package/src/ui/primitives/tooltip.tsx +59 -0
  350. package/src/user/components/dangerous-zone.tsx +34 -0
  351. package/src/user/components/delete-account-form.tsx +40 -0
  352. package/src/user/components/index.ts +4 -0
  353. package/src/user/components/profile-info-form.tsx +390 -0
  354. package/src/user/components/profile-info.tsx +32 -0
  355. package/src/user/components/unified-profile-dialog.tsx +1019 -0
  356. package/src/user/components/user-stats.tsx +27 -0
  357. package/src/user/components/user-toolbar.tsx +137 -0
  358. package/src/user/components/users-card-view.tsx +253 -0
  359. package/src/user/index.ts +11 -0
  360. package/src/user/pages/user-list-page.tsx +234 -0
  361. package/src/user/pages/users-client-page.tsx +385 -0
  362. package/src/user/profile-page.tsx +19 -0
  363. package/src/user/schemas.ts +68 -0
  364. package/src/user/types.ts +34 -0
  365. package/src/user/user-service.ts +538 -0
  366. package/src/utils/index.ts +906 -0
  367. package/src/workflow/activity-timeline.tsx +412 -0
  368. package/src/workflow/approval-workflow.tsx +31 -0
  369. package/src/workflow/index.ts +2 -0
@@ -0,0 +1,703 @@
1
+ // @goerp/core/types
2
+ // Core TypeScript types for GoERP platform
3
+ // Consolidated from packages/shared/types
4
+
5
+ import type { LucideIcon, icons } from "lucide-react";
6
+ import type { ComponentType, SVGAttributes, ReactNode } from "react";
7
+ import type { z } from "zod";
8
+
9
+ // ============================================================================
10
+ // Locale & Theme Types
11
+ // ============================================================================
12
+
13
+ export const supportedLocales = ["vi", "en"] as const;
14
+ export type LocaleType = (typeof supportedLocales)[number];
15
+
16
+ export interface SearchResultItem {
17
+ id: string;
18
+ title: string;
19
+ subtitle?: string;
20
+ url?: string;
21
+ action?: () => void;
22
+ iconName?: DynamicIconNameType;
23
+ }
24
+
25
+ export interface SearchGroup {
26
+ heading: string;
27
+ items: SearchResultItem[];
28
+ }
29
+
30
+ export const supportedThemes = [
31
+ "zinc",
32
+ "slate",
33
+ "stone",
34
+ "gray",
35
+ "neutral",
36
+ "red",
37
+ "rose",
38
+ "orange",
39
+ "green",
40
+ "blue",
41
+ "yellow",
42
+ "violet",
43
+ ] as const;
44
+ export type ThemeType = (typeof supportedThemes)[number];
45
+
46
+ export const radii = [0, 0.3, 0.5, 0.75, 1] as const;
47
+ export type RadiusType = (typeof radii)[number];
48
+
49
+ // ============================================================================
50
+ // Layout & UI Types
51
+ // ============================================================================
52
+
53
+ export type LayoutType = "vertical" | "horizontal";
54
+ export type ModeType = "light" | "dark" | "system";
55
+ export type OrientationType = "vertical" | "horizontal";
56
+ export type DirectionType = "ltr" | "rtl";
57
+ export type SidebarVariantType = "sidebar" | "floating" | "inset";
58
+ export type SidebarCollapsibleType = "offcanvas" | "icon" | "none";
59
+ export type DensityType = "comfortable" | "compact";
60
+
61
+ export type SettingsType = {
62
+ theme: ThemeType;
63
+ mode: ModeType;
64
+ radius: RadiusType;
65
+ layout: LayoutType;
66
+ locale: LocaleType;
67
+ sidebarVariant: SidebarVariantType;
68
+ sidebarCollapsible: SidebarCollapsibleType;
69
+ density: DensityType;
70
+ };
71
+
72
+ // ============================================================================
73
+ // Icon Types
74
+ // ============================================================================
75
+
76
+ export interface IconProps extends SVGAttributes<SVGElement> {
77
+ children?: never;
78
+ color?: string;
79
+ }
80
+
81
+ export type IconType = ComponentType<IconProps> | LucideIcon;
82
+ export type DynamicIconNameType = keyof typeof icons;
83
+
84
+ // ============================================================================
85
+ // Auth Form Types
86
+ // ============================================================================
87
+
88
+ export interface ForgotPasswordFormType {
89
+ email: string;
90
+ }
91
+
92
+ export interface NewPasswordFormType {
93
+ password: string;
94
+ confirmPassword: string;
95
+ }
96
+
97
+ export interface SignInFormType {
98
+ email: string;
99
+ password: string;
100
+ }
101
+
102
+ export interface RegisterFormType {
103
+ firstName: string;
104
+ lastName: string;
105
+ username: string;
106
+ email: string;
107
+ password: string;
108
+ confirmPassword: string;
109
+ }
110
+
111
+ export interface VerifyEmailFormType {
112
+ email: string;
113
+ }
114
+
115
+ // ============================================================================
116
+ // User Types
117
+ // ============================================================================
118
+
119
+ export interface UserType {
120
+ id: string;
121
+ firstName: string;
122
+ lastName: string;
123
+ name: string;
124
+ password: string;
125
+ username: string;
126
+ role: string;
127
+ avatar: string;
128
+ background: string;
129
+ status: string;
130
+ phoneNumber: string;
131
+ email: string;
132
+ state: string;
133
+ country: string;
134
+ address: string;
135
+ zipCode: string;
136
+ language: string;
137
+ timeZone: string;
138
+ currency: string;
139
+ organization: string;
140
+ twoFactorAuth: boolean;
141
+ loginAlerts: boolean;
142
+ accountReoveryOption?: "email" | "sms" | "codes";
143
+ connections: number;
144
+ followers: number;
145
+ }
146
+
147
+ // ============================================================================
148
+ // Permission Types
149
+ // ============================================================================
150
+
151
+ export interface Permission {
152
+ resourceCode: string;
153
+ actionCode: string;
154
+ }
155
+
156
+ export type PermissionType = Permission;
157
+
158
+ export type PermissionMatrix = Record<string, Record<string, boolean>>;
159
+
160
+ // ============================================================================
161
+ // Route & Navigation Types
162
+ // ============================================================================
163
+
164
+ export interface RouteType {
165
+ type: "guest" | "public";
166
+ exceptions?: string[];
167
+ }
168
+
169
+ export interface NotificationType {
170
+ unreadCount: number;
171
+ notifications: Array<{
172
+ id: string;
173
+ iconName: DynamicIconNameType;
174
+ content: string;
175
+ url: string;
176
+ date: Date;
177
+ isRead: boolean;
178
+ }>;
179
+ }
180
+
181
+ export type FormatStyleType = "percent" | "duration" | "currency" | "regular";
182
+
183
+ export interface NavigationType {
184
+ title: string;
185
+ iconName?: DynamicIconNameType;
186
+ items: NavigationRootItem[];
187
+ }
188
+
189
+ export type NavigationRootItem =
190
+ | NavigationRootItemWithHrefType
191
+ | NavigationRootItemWithItemsType;
192
+
193
+ export interface NavigationRootItemBasicType {
194
+ title: string;
195
+ label?: string;
196
+ iconName: DynamicIconNameType;
197
+ resource?: string;
198
+ action?: string;
199
+ }
200
+
201
+ export interface NavigationRootItemWithHrefType
202
+ extends NavigationRootItemBasicType {
203
+ href: string;
204
+ items?: never;
205
+ }
206
+
207
+ export interface NavigationRootItemWithItemsType
208
+ extends NavigationRootItemBasicType {
209
+ items: (
210
+ | NavigationNestedItemWithHrefType
211
+ | NavigationNestedItemWithItemsType
212
+ )[];
213
+ href?: never;
214
+ }
215
+
216
+ export interface NavigationNestedItemBasicType {
217
+ title: string;
218
+ label?: string;
219
+ resource?: string;
220
+ action?: string;
221
+ iconName?: DynamicIconNameType;
222
+ }
223
+
224
+ export interface NavigationNestedItemWithHrefType
225
+ extends NavigationNestedItemBasicType {
226
+ href: string;
227
+ items?: never;
228
+ }
229
+
230
+ export interface NavigationNestedItemWithItemsType
231
+ extends NavigationNestedItemBasicType {
232
+ items: (
233
+ | NavigationNestedItemWithHrefType
234
+ | NavigationNestedItemWithItemsType
235
+ )[];
236
+ href?: never;
237
+ }
238
+
239
+ export type NavigationNestedItem =
240
+ | NavigationNestedItemWithHrefType
241
+ | NavigationNestedItemWithItemsType;
242
+
243
+ // ============================================================================
244
+ // OAuth & File Types
245
+ // ============================================================================
246
+
247
+ export interface OAuthLinkType {
248
+ href: string;
249
+ label: string;
250
+ icon: IconType;
251
+ }
252
+
253
+ export interface FileType {
254
+ id: string;
255
+ name: string;
256
+ size: number;
257
+ type: string;
258
+ url: string;
259
+ }
260
+
261
+ // ============================================================================
262
+ // Entity Configuration
263
+ // ============================================================================
264
+
265
+ export interface EntityConfig {
266
+ name: string;
267
+ label: string;
268
+ pluralLabel: string;
269
+ icon?: LucideIcon;
270
+ iconName?: string;
271
+ description?: string;
272
+ /**
273
+ * Resource code used for permission checking.
274
+ * If not specified, falls back to `name`.
275
+ * Must match a valid resource code in the Resource table.
276
+ */
277
+ permissionResource?: string;
278
+ apiEndpoint: string;
279
+ idField: string;
280
+ displayField: string;
281
+ fields: FieldConfig[];
282
+ filters?: FilterConfig[];
283
+ defaultSort?: {
284
+ field: string;
285
+ direction: "asc" | "desc";
286
+ };
287
+ permissions?: CrudPermissions;
288
+ features?: CrudFeatures;
289
+ codeGeneration?: CodeGenerationConfig;
290
+ formSections?: FormSection[];
291
+ formMode?: FormModeConfig;
292
+ rowActions?: RowAction[];
293
+ include?: string[];
294
+ }
295
+
296
+ export interface CodeGenerationConfig {
297
+ enabled: boolean;
298
+ field: string;
299
+ ruleId?: string;
300
+ entityType?: string;
301
+ showPreview?: boolean;
302
+ allowManualOverride?: boolean;
303
+ generateOnCreate?: boolean;
304
+ generateOnEdit?: boolean;
305
+ }
306
+
307
+ export interface FormSection {
308
+ title: string;
309
+ description?: string;
310
+ fields: string[];
311
+ defaultOpen?: boolean;
312
+ }
313
+
314
+ export interface FormModeConfig {
315
+ create?: "dialog" | "sheet" | "navigate";
316
+ edit?: "dialog" | "sheet" | "navigate";
317
+ createPath?: string;
318
+ editPath?: string;
319
+ sheetSide?: "top" | "right" | "bottom" | "left";
320
+ }
321
+
322
+ export interface RowAction {
323
+ label: string;
324
+ icon?: string;
325
+ action:
326
+ | "copy"
327
+ | "duplicate"
328
+ | "view"
329
+ | "archive"
330
+ | "custom"
331
+ | "approve"
332
+ | "reject"
333
+ | "set-default"
334
+ | "view-history";
335
+ handler?: (
336
+ rowId: string,
337
+ rowData: Record<string, unknown>,
338
+ ) => void | Promise<void>;
339
+ visibleWhen?: (rowData: Record<string, unknown>) => boolean;
340
+ variant?:
341
+ | "default"
342
+ | "destructive"
343
+ | "outline"
344
+ | "secondary"
345
+ | "ghost"
346
+ | "link";
347
+ excludeFields?: string[];
348
+ transformData?: (rowData: Record<string, unknown>) => Record<string, unknown>;
349
+ }
350
+
351
+ // ============================================================================
352
+ // Field Configuration
353
+ // ============================================================================
354
+
355
+ export type FieldType =
356
+ | "text"
357
+ | "email"
358
+ | "url"
359
+ | "number"
360
+ | "integer"
361
+ | "textarea"
362
+ | "boolean"
363
+ | "date"
364
+ | "datetime"
365
+ | "time"
366
+ | "select"
367
+ | "multiselect"
368
+ | "file"
369
+ | "image"
370
+ | "json"
371
+ | "custom"
372
+ | "switch"
373
+ | "relation";
374
+
375
+ export interface FieldConfig {
376
+ name: string;
377
+ label: string;
378
+ type: FieldType;
379
+ required?: boolean;
380
+ defaultValue?: unknown;
381
+ placeholder?: string;
382
+ helpText?: string;
383
+ description?: string;
384
+ rows?: number;
385
+ disabled?: boolean;
386
+ disableOnCreate?: boolean;
387
+ disableOnEdit?: boolean;
388
+ fullWidth?: boolean;
389
+ validation?: z.ZodTypeAny;
390
+ hideInTable?: boolean;
391
+ hideInForm?: boolean;
392
+ showInImport?: boolean;
393
+ width?: number | string;
394
+ minWidth?: number | string;
395
+ maxWidth?: number | string;
396
+ isDisplayOnly?: boolean;
397
+ sortable?: boolean;
398
+ filterable?: boolean;
399
+ order?: number;
400
+ options?: Array<
401
+ | string
402
+ | number
403
+ | boolean
404
+ | { label: string; value: string | number | boolean }
405
+ >;
406
+ dataSource?: DataSource;
407
+ dependsOn?: string;
408
+ section?: string;
409
+ showWhen?: FieldShowWhen;
410
+ calculate?: FieldCalculate;
411
+ format?: FieldFormat;
412
+ transform?: FieldTransform;
413
+ actions?: FieldAction[];
414
+ help?: FieldHelp;
415
+ dependencies?: FieldDependencies;
416
+ cascade?: FieldCascade;
417
+ renderCell?: (value: unknown, row: Record<string, unknown>) => ReactNode;
418
+ renderForm?: (props: Record<string, unknown>) => ReactNode;
419
+ renderInput?: (
420
+ value: unknown,
421
+ onChange: (value: unknown) => void,
422
+ ) => ReactNode;
423
+ relation?: {
424
+ entity: string;
425
+ displayField: string;
426
+ valueField: string;
427
+ filter?: Record<string, unknown>;
428
+ };
429
+ }
430
+
431
+ export interface FieldShowWhen {
432
+ field: string;
433
+ value: unknown;
434
+ operator?:
435
+ | "equals"
436
+ | "notEquals"
437
+ | "contains"
438
+ | "greaterThan"
439
+ | "lessThan"
440
+ | "isEmpty"
441
+ | "isNotEmpty";
442
+ }
443
+
444
+ export interface FieldCalculate {
445
+ dependsOn: string[];
446
+ formula: string | ((values: Record<string, unknown>) => unknown);
447
+ mode?: "onChange" | "onBlur" | "always";
448
+ }
449
+
450
+ export interface FieldFormat {
451
+ type: "currency" | "percentage" | "date" | "datetime" | "number" | "custom";
452
+ options?: {
453
+ currency?: string;
454
+ locale?: string;
455
+ decimals?: number;
456
+ dateFormat?: string;
457
+ custom?: (value: unknown) => string;
458
+ };
459
+ }
460
+
461
+ export interface FieldTransform {
462
+ input?: (value: unknown) => unknown;
463
+ output?: (value: unknown) => unknown;
464
+ }
465
+
466
+ export interface FieldAction {
467
+ label: string;
468
+ icon?: string;
469
+ action: "clear" | "copy" | "generate" | "validate" | "custom";
470
+ handler?: (
471
+ field: FieldConfig,
472
+ formData: Record<string, unknown>,
473
+ ) => void | Promise<void>;
474
+ visibleWhen?: {
475
+ field: string;
476
+ operator: "equals" | "notEquals" | "isEmpty" | "isNotEmpty";
477
+ value: unknown;
478
+ };
479
+ }
480
+
481
+ export interface FieldHelp {
482
+ text?: string;
483
+ tooltip?: string;
484
+ link?: {
485
+ url: string;
486
+ text: string;
487
+ openInNewTab?: boolean;
488
+ };
489
+ examples?: string[];
490
+ }
491
+
492
+ export interface FieldDependencies {
493
+ fields: string[];
494
+ condition: "all" | "any" | "none";
495
+ rules: Array<{
496
+ field: string;
497
+ operator:
498
+ | "equals"
499
+ | "notEquals"
500
+ | "contains"
501
+ | "greaterThan"
502
+ | "lessThan"
503
+ | "isEmpty"
504
+ | "isNotEmpty";
505
+ value: unknown;
506
+ }>;
507
+ }
508
+
509
+ export interface FieldCascade {
510
+ triggerField: string;
511
+ action: "clear" | "reset" | "update";
512
+ updateFields?: string[];
513
+ }
514
+
515
+ export interface ValidationRule {
516
+ type:
517
+ | "required"
518
+ | "email"
519
+ | "url"
520
+ | "min"
521
+ | "max"
522
+ | "minLength"
523
+ | "maxLength"
524
+ | "pattern"
525
+ | "custom";
526
+ value?: unknown;
527
+ message: string;
528
+ validator?: (value: unknown, formData: Record<string, unknown>) => boolean;
529
+ }
530
+
531
+ // ============================================================================
532
+ // Data Source
533
+ // ============================================================================
534
+
535
+ export interface DataSource {
536
+ type: "static" | "api";
537
+ options?: Array<{ label: string; value: string | number | boolean }>;
538
+ endpoint?: string;
539
+ params?: Record<string, unknown>;
540
+ labelField?: string;
541
+ valueField?: string;
542
+ searchable?: boolean;
543
+ cacheTime?: number;
544
+ transform?: (
545
+ data: unknown[],
546
+ ) => Array<{ label: string; value: string | number | boolean }>;
547
+ }
548
+
549
+ // ============================================================================
550
+ // Filter Configuration
551
+ // ============================================================================
552
+
553
+ export type FilterType =
554
+ | "text"
555
+ | "datetime"
556
+ | "select"
557
+ | "checkbox"
558
+ | "switch"
559
+ | "radio"
560
+ | "custom";
561
+
562
+ export interface FilterConfig {
563
+ name: string;
564
+ label: string;
565
+ type: FilterType;
566
+ field: string;
567
+ operator?: FilterOperator;
568
+ defaultValue?: unknown;
569
+ options?: Array<{ label: string; value: string | number | boolean }>;
570
+ dataSource?: DataSource;
571
+ renderFilter?: (props: Record<string, unknown>) => ReactNode;
572
+ multiple?: boolean;
573
+ mode?: "single" | "range" | string;
574
+ }
575
+
576
+ export type FilterOperator =
577
+ | "eq"
578
+ | "ne"
579
+ | "gt"
580
+ | "gte"
581
+ | "lt"
582
+ | "lte"
583
+ | "contains"
584
+ | "startsWith"
585
+ | "endsWith"
586
+ | "in"
587
+ | "notIn"
588
+ | "between"
589
+ | "isNull"
590
+ | "isNotNull";
591
+
592
+ export interface ActiveFilter {
593
+ name: string;
594
+ value: unknown;
595
+ operator: FilterOperator;
596
+ }
597
+
598
+ // ============================================================================
599
+ // CRUD Operations
600
+ // ============================================================================
601
+
602
+ export interface SortingState {
603
+ field: string;
604
+ direction: "asc" | "desc";
605
+ }
606
+
607
+ export interface CrudQueryParams {
608
+ page: number;
609
+ pageSize: number;
610
+ search?: string;
611
+ sort?: SortingState;
612
+ filters?: ActiveFilter[];
613
+ }
614
+
615
+ export interface CrudResponse<T = unknown> {
616
+ data: T[];
617
+ total: number;
618
+ page: number;
619
+ pageSize: number;
620
+ }
621
+
622
+ export interface CrudPermissions {
623
+ create?: boolean;
624
+ read?: boolean;
625
+ update?: boolean;
626
+ delete?: boolean;
627
+ export?: boolean;
628
+ import?: boolean;
629
+ approve?: boolean;
630
+ reject?: boolean;
631
+ }
632
+
633
+ export interface CrudFeatures {
634
+ search?: boolean;
635
+ bulkActions?: boolean;
636
+ export?: boolean;
637
+ import?: boolean;
638
+ showRowNumber?: boolean;
639
+ showRowSelection?: boolean;
640
+ }
641
+
642
+ // ============================================================================
643
+ // Import/Export
644
+ // ============================================================================
645
+
646
+ export interface ImportOptions {
647
+ format: "csv" | "xlsx" | "json";
648
+ skipErrors?: boolean;
649
+ updateExisting?: boolean;
650
+ mapping?: Record<string, string>;
651
+ }
652
+
653
+ export interface ExportOptions {
654
+ format: "csv" | "xlsx" | "json";
655
+ fields?: string[];
656
+ filters?: ActiveFilter[];
657
+ allData?: boolean;
658
+ }
659
+
660
+ export interface ImportResult {
661
+ success: boolean;
662
+ imported: number;
663
+ failed: number;
664
+ errors: Array<{
665
+ row: number;
666
+ field: string;
667
+ message: string;
668
+ }>;
669
+ }
670
+
671
+ // ============================================================================
672
+ // Entity Filter Types
673
+ // ============================================================================
674
+
675
+ export interface ActionFilters {
676
+ page?: number;
677
+ pageSize?: number;
678
+ search?: string;
679
+ status?: string;
680
+ }
681
+
682
+ export interface ResourceFilters {
683
+ page?: number;
684
+ pageSize?: number;
685
+ search?: string;
686
+ status?: string;
687
+ group?: string;
688
+ type?: string;
689
+ }
690
+
691
+ export interface UomFilters {
692
+ page?: number;
693
+ pageSize?: number;
694
+ search?: string;
695
+ status?: string;
696
+ }
697
+
698
+ export interface WarehouseFilters {
699
+ page?: number;
700
+ pageSize?: number;
701
+ search?: string;
702
+ status?: string;
703
+ }