@goplusvn/core 0.1.0 → 0.1.2

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 (591) hide show
  1. package/package.json +31 -175
  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
  370. package/dist/audit/index.d.mts +0 -115
  371. package/dist/audit/index.d.ts +0 -115
  372. package/dist/audit/index.js +0 -204
  373. package/dist/audit/index.js.map +0 -1
  374. package/dist/audit/index.mjs +0 -200
  375. package/dist/audit/index.mjs.map +0 -1
  376. package/dist/auth/index.d.mts +0 -86
  377. package/dist/auth/index.d.ts +0 -86
  378. package/dist/auth/index.js +0 -210
  379. package/dist/auth/index.js.map +0 -1
  380. package/dist/auth/index.mjs +0 -198
  381. package/dist/auth/index.mjs.map +0 -1
  382. package/dist/button-1dWvP9Ib.d.mts +0 -30
  383. package/dist/button-1dWvP9Ib.d.ts +0 -30
  384. package/dist/calendar-2QzdEo1z.d.mts +0 -20
  385. package/dist/calendar-2QzdEo1z.d.ts +0 -20
  386. package/dist/code-generation/index.d.mts +0 -30
  387. package/dist/code-generation/index.d.ts +0 -30
  388. package/dist/code-generation/index.js +0 -31
  389. package/dist/code-generation/index.js.map +0 -1
  390. package/dist/code-generation/index.mjs +0 -28
  391. package/dist/code-generation/index.mjs.map +0 -1
  392. package/dist/configs/index.d.mts +0 -175
  393. package/dist/configs/index.d.ts +0 -175
  394. package/dist/configs/index.js +0 -254
  395. package/dist/configs/index.js.map +0 -1
  396. package/dist/configs/index.mjs +0 -233
  397. package/dist/configs/index.mjs.map +0 -1
  398. package/dist/crud/index.d.mts +0 -646
  399. package/dist/crud/index.d.ts +0 -646
  400. package/dist/crud/index.js +0 -11772
  401. package/dist/crud/index.js.map +0 -1
  402. package/dist/crud/index.mjs +0 -11665
  403. package/dist/crud/index.mjs.map +0 -1
  404. package/dist/crud/server.d.mts +0 -20
  405. package/dist/crud/server.d.ts +0 -20
  406. package/dist/crud/server.js +0 -123
  407. package/dist/crud/server.js.map +0 -1
  408. package/dist/crud/server.mjs +0 -120
  409. package/dist/crud/server.mjs.map +0 -1
  410. package/dist/data-table-skeleton-12NA8Mjx.d.mts +0 -39
  411. package/dist/data-table-skeleton-12NA8Mjx.d.ts +0 -39
  412. package/dist/dialog-bKfjZMTd.d.mts +0 -22
  413. package/dist/dialog-bKfjZMTd.d.ts +0 -22
  414. package/dist/dynamic-icon-DrGIiu2N.d.mts +0 -10
  415. package/dist/dynamic-icon-DrGIiu2N.d.ts +0 -10
  416. package/dist/home/index.d.mts +0 -269
  417. package/dist/home/index.d.ts +0 -269
  418. package/dist/home/index.js +0 -1678
  419. package/dist/home/index.js.map +0 -1
  420. package/dist/home/index.mjs +0 -1635
  421. package/dist/home/index.mjs.map +0 -1
  422. package/dist/hooks/index.d.mts +0 -7
  423. package/dist/hooks/index.d.ts +0 -7
  424. package/dist/hooks/index.js +0 -8316
  425. package/dist/hooks/index.js.map +0 -1
  426. package/dist/hooks/index.mjs +0 -8255
  427. package/dist/hooks/index.mjs.map +0 -1
  428. package/dist/index-50hpiPrV.d.ts +0 -116
  429. package/dist/index-B9zQVEVi.d.mts +0 -116
  430. package/dist/index.d.mts +0 -5
  431. package/dist/index.d.ts +0 -5
  432. package/dist/index.js +0 -123
  433. package/dist/index.js.map +0 -1
  434. package/dist/index.mjs +0 -118
  435. package/dist/index.mjs.map +0 -1
  436. package/dist/infrastructure/index.d.mts +0 -423
  437. package/dist/infrastructure/index.d.ts +0 -423
  438. package/dist/infrastructure/index.js +0 -633
  439. package/dist/infrastructure/index.js.map +0 -1
  440. package/dist/infrastructure/index.mjs +0 -619
  441. package/dist/infrastructure/index.mjs.map +0 -1
  442. package/dist/label-DWTEkNPo.d.ts +0 -226
  443. package/dist/label-LPpdcoBx.d.mts +0 -226
  444. package/dist/layout/index.d.mts +0 -48
  445. package/dist/layout/index.d.ts +0 -48
  446. package/dist/layout/index.js +0 -117
  447. package/dist/layout/index.js.map +0 -1
  448. package/dist/layout/index.mjs +0 -90
  449. package/dist/layout/index.mjs.map +0 -1
  450. package/dist/navigation/index.d.mts +0 -16
  451. package/dist/navigation/index.d.ts +0 -16
  452. package/dist/navigation/index.js +0 -53
  453. package/dist/navigation/index.js.map +0 -1
  454. package/dist/navigation/index.mjs +0 -50
  455. package/dist/navigation/index.mjs.map +0 -1
  456. package/dist/notification/index.d.mts +0 -105
  457. package/dist/notification/index.d.ts +0 -105
  458. package/dist/notification/index.js +0 -278
  459. package/dist/notification/index.js.map +0 -1
  460. package/dist/notification/index.mjs +0 -274
  461. package/dist/notification/index.mjs.map +0 -1
  462. package/dist/organization/index.d.mts +0 -99
  463. package/dist/organization/index.d.ts +0 -99
  464. package/dist/organization/index.js +0 -360
  465. package/dist/organization/index.js.map +0 -1
  466. package/dist/organization/index.mjs +0 -352
  467. package/dist/organization/index.mjs.map +0 -1
  468. package/dist/plugin/index.d.mts +0 -83
  469. package/dist/plugin/index.d.ts +0 -83
  470. package/dist/plugin/index.js +0 -86
  471. package/dist/plugin/index.js.map +0 -1
  472. package/dist/plugin/index.mjs +0 -84
  473. package/dist/plugin/index.mjs.map +0 -1
  474. package/dist/providers/index.d.mts +0 -25
  475. package/dist/providers/index.d.ts +0 -25
  476. package/dist/providers/index.js +0 -84
  477. package/dist/providers/index.js.map +0 -1
  478. package/dist/providers/index.mjs +0 -77
  479. package/dist/providers/index.mjs.map +0 -1
  480. package/dist/rbac/index.d.mts +0 -226
  481. package/dist/rbac/index.d.ts +0 -226
  482. package/dist/rbac/index.js +0 -4784
  483. package/dist/rbac/index.js.map +0 -1
  484. package/dist/rbac/index.mjs +0 -4722
  485. package/dist/rbac/index.mjs.map +0 -1
  486. package/dist/rbac/permissions.d.mts +0 -26
  487. package/dist/rbac/permissions.d.ts +0 -26
  488. package/dist/rbac/permissions.js +0 -94
  489. package/dist/rbac/permissions.js.map +0 -1
  490. package/dist/rbac/permissions.mjs +0 -90
  491. package/dist/rbac/permissions.mjs.map +0 -1
  492. package/dist/rbac/server.d.mts +0 -1
  493. package/dist/rbac/server.d.ts +0 -1
  494. package/dist/rbac/server.js +0 -128
  495. package/dist/rbac/server.js.map +0 -1
  496. package/dist/rbac/server.mjs +0 -124
  497. package/dist/rbac/server.mjs.map +0 -1
  498. package/dist/schemas/index.d.mts +0 -1257
  499. package/dist/schemas/index.d.ts +0 -1257
  500. package/dist/schemas/index.js +0 -572
  501. package/dist/schemas/index.js.map +0 -1
  502. package/dist/schemas/index.mjs +0 -523
  503. package/dist/schemas/index.mjs.map +0 -1
  504. package/dist/server-QuYCTa89.d.mts +0 -83
  505. package/dist/server-QuYCTa89.d.ts +0 -83
  506. package/dist/sonner-C74GlRDQ.d.mts +0 -71
  507. package/dist/sonner-C74GlRDQ.d.ts +0 -71
  508. package/dist/status-BOXZgIqX.d.mts +0 -12
  509. package/dist/status-BOXZgIqX.d.ts +0 -12
  510. package/dist/system/index.d.mts +0 -77
  511. package/dist/system/index.d.ts +0 -77
  512. package/dist/system/index.js +0 -102
  513. package/dist/system/index.js.map +0 -1
  514. package/dist/system/index.mjs +0 -100
  515. package/dist/system/index.mjs.map +0 -1
  516. package/dist/tabs-C6FfBwPY.d.mts +0 -18
  517. package/dist/tabs-C6FfBwPY.d.ts +0 -18
  518. package/dist/tenant-provider-B8eC_Wpb.d.mts +0 -27
  519. package/dist/tenant-provider-B8eC_Wpb.d.ts +0 -27
  520. package/dist/types/index.d.mts +0 -469
  521. package/dist/types/index.d.ts +0 -469
  522. package/dist/types/index.js +0 -25
  523. package/dist/types/index.js.map +0 -1
  524. package/dist/types/index.mjs +0 -21
  525. package/dist/types/index.mjs.map +0 -1
  526. package/dist/ui/auth.d.mts +0 -39
  527. package/dist/ui/auth.d.ts +0 -39
  528. package/dist/ui/auth.js +0 -4941
  529. package/dist/ui/auth.js.map +0 -1
  530. package/dist/ui/auth.mjs +0 -4896
  531. package/dist/ui/auth.mjs.map +0 -1
  532. package/dist/ui/crud.d.mts +0 -2
  533. package/dist/ui/crud.d.ts +0 -2
  534. package/dist/ui/crud.js +0 -4
  535. package/dist/ui/crud.js.map +0 -1
  536. package/dist/ui/crud.mjs +0 -3
  537. package/dist/ui/crud.mjs.map +0 -1
  538. package/dist/ui/data-display.d.mts +0 -596
  539. package/dist/ui/data-display.d.ts +0 -596
  540. package/dist/ui/data-display.js +0 -5307
  541. package/dist/ui/data-display.js.map +0 -1
  542. package/dist/ui/data-display.mjs +0 -5212
  543. package/dist/ui/data-display.mjs.map +0 -1
  544. package/dist/ui/feedback.d.mts +0 -55
  545. package/dist/ui/feedback.d.ts +0 -55
  546. package/dist/ui/feedback.js +0 -2608
  547. package/dist/ui/feedback.js.map +0 -1
  548. package/dist/ui/feedback.mjs +0 -2526
  549. package/dist/ui/feedback.mjs.map +0 -1
  550. package/dist/ui/forms.d.mts +0 -309
  551. package/dist/ui/forms.d.ts +0 -309
  552. package/dist/ui/forms.js +0 -4656
  553. package/dist/ui/forms.js.map +0 -1
  554. package/dist/ui/forms.mjs +0 -4571
  555. package/dist/ui/forms.mjs.map +0 -1
  556. package/dist/ui/index.d.mts +0 -331
  557. package/dist/ui/index.d.ts +0 -331
  558. package/dist/ui/index.js +0 -16953
  559. package/dist/ui/index.js.map +0 -1
  560. package/dist/ui/index.mjs +0 -16598
  561. package/dist/ui/index.mjs.map +0 -1
  562. package/dist/ui/primitives/client.d.mts +0 -61
  563. package/dist/ui/primitives/client.d.ts +0 -61
  564. package/dist/ui/primitives/client.js +0 -3408
  565. package/dist/ui/primitives/client.js.map +0 -1
  566. package/dist/ui/primitives/client.mjs +0 -3256
  567. package/dist/ui/primitives/client.mjs.map +0 -1
  568. package/dist/ui/primitives.d.mts +0 -113
  569. package/dist/ui/primitives.d.ts +0 -113
  570. package/dist/ui/primitives.js +0 -3356
  571. package/dist/ui/primitives.js.map +0 -1
  572. package/dist/ui/primitives.mjs +0 -3227
  573. package/dist/ui/primitives.mjs.map +0 -1
  574. package/dist/user/index.d.mts +0 -228
  575. package/dist/user/index.d.ts +0 -228
  576. package/dist/user/index.js +0 -4306
  577. package/dist/user/index.js.map +0 -1
  578. package/dist/user/index.mjs +0 -4260
  579. package/dist/user/index.mjs.map +0 -1
  580. package/dist/utils/index.d.mts +0 -205
  581. package/dist/utils/index.d.ts +0 -205
  582. package/dist/utils/index.js +0 -574
  583. package/dist/utils/index.js.map +0 -1
  584. package/dist/utils/index.mjs +0 -514
  585. package/dist/utils/index.mjs.map +0 -1
  586. package/dist/workflow/index.d.mts +0 -40
  587. package/dist/workflow/index.d.ts +0 -40
  588. package/dist/workflow/index.js +0 -3710
  589. package/dist/workflow/index.js.map +0 -1
  590. package/dist/workflow/index.mjs +0 -3677
  591. package/dist/workflow/index.mjs.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/configs/status.ts","../../src/utils/index.ts"],"names":["twMerge","clsx","wait"],"mappings":"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","file":"index.js","sourcesContent":["export const STATUS_ACTIVE = \"active\";\nexport const STATUS_INACTIVE = \"inactive\";\n\nexport const STATUS_VALUES = [STATUS_ACTIVE, STATUS_INACTIVE] as const;\n\nexport const STATUS_OPTIONS = [\n { label: \"crud.common.options.active\", value: STATUS_ACTIVE },\n { label: \"crud.common.options.inactive\", value: STATUS_INACTIVE },\n];\n\nexport const STATUS_COLORS: Record<\n string,\n \"success\" | \"warning\" | \"default\" | \"destructive\" | \"secondary\" | \"outline\"\n> = {\n [STATUS_ACTIVE]: \"success\",\n [STATUS_INACTIVE]: \"warning\",\n};\n\nexport function booleanToStatus(value: boolean): string {\n return value ? STATUS_ACTIVE : STATUS_INACTIVE;\n}\n\nexport function statusToBoolean(value: string): boolean {\n return value === STATUS_ACTIVE;\n}\n","// @goerp/core/utils\n// Utility functions for GoERP platform\n\nimport { clsx } from \"clsx\";\nimport type { ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\n// Import types from core/types\nimport type { LocaleType, FormatStyleType } from \"../types\";\n\n// ============================================================================\n// Class Names\n// ============================================================================\n\n/**\n * Merge Tailwind CSS classes with clsx\n */\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n\n// ============================================================================\n// String Utilities\n// ============================================================================\n\n/**\n * Get initials from full name\n */\nexport function getInitials(fullName: string): string {\n if (fullName.length === 0) return \"\";\n const names = fullName.split(\" \");\n const initials = names.map((name) => name.charAt(0).toUpperCase()).join(\"\");\n return initials;\n}\n\n/**\n * Slugify string\n */\nexport function slugify(text: string): string {\n return text\n .toLowerCase()\n .normalize(\"NFD\")\n .replace(/[\\u0300-\\u036f]/g, \"\")\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/(^-|-$)/g, \"\");\n}\n\n/**\n * Convert camelCase to Title Case\n */\nexport function camelCaseToTitleCase(camelCaseStr: string): string {\n return camelCaseStr\n .replace(/([A-Z])/g, \" $1\")\n .replace(/^./, (char) => char.toUpperCase());\n}\n\n/**\n * Convert Title Case to camelCase\n */\nexport function titleCaseToCamelCase(titleCaseStr: string): string {\n return titleCaseStr\n .toLowerCase()\n .replace(/[-_\\s]+(.)/g, (_, char) => char.toUpperCase())\n .replace(/[-_]/g, \"\");\n}\n\n// ============================================================================\n// Number Utilities\n// ============================================================================\n\nexport const isEven = (num: number) => num % 2 === 0;\nexport const isNonNegative = (num: number) => num >= 0;\n\n/**\n * Đọc số tiền thành chữ tiếng Việt\n * Dùng chung cho tất cả các phiếu in (hợp đồng, phiếu thu, phiếu chi, phiếu nhập/xuất kho, v.v.)\n * @param amount - Số tiền (VND)\n * @returns Chuỗi đọc bằng chữ, VD: \"Bảy mươi hai triệu một trăm năm mươi chín nghìn tám trăm hai mươi đồng\"\n */\nexport function readMoney(amount: number): string {\n if (!Number.isFinite(amount)) return \"Không đồng\"\n\n const isNegative = amount < 0\n\n // Bỏ phần thập phân - VND không có đơn vị lẻ\n amount = Math.floor(Math.abs(amount))\n\n if (amount === 0) return \"Không đồng\"\n\n const unit = [\"\", \"nghìn\", \"triệu\", \"tỷ\", \"nghìn tỷ\", \"triệu tỷ\"]\n const digit = [\n \"không\",\n \"một\",\n \"hai\",\n \"ba\",\n \"bốn\",\n \"năm\",\n \"sáu\",\n \"bảy\",\n \"tám\",\n \"chín\",\n ]\n\n let str = amount.toString()\n const groups: string[] = []\n while (str.length > 0) {\n groups.push(str.slice(-3))\n str = str.slice(0, -3)\n }\n\n let result = \"\"\n for (let i = 0; i < groups.length; i++) {\n const group = groups[i]\n if (group === \"000\") continue\n\n const [a, b, c] = group.padStart(3, \"0\").split(\"\").map(Number)\n let groupResult = \"\"\n\n const hasHundreds = a !== 0 || groups.length > 1\n\n if (hasHundreds) {\n groupResult += `${digit[a]} trăm `\n }\n\n if (b === 0 && c !== 0) {\n if (hasHundreds) groupResult += \"lẻ \"\n } else if (b === 1) {\n groupResult += \"mười \"\n } else if (b > 1) {\n groupResult += `${digit[b]} mươi `\n }\n\n if (c === 1 && b > 1) {\n groupResult += \"mốt \"\n } else if (c === 5 && b > 0) {\n groupResult += \"lăm \"\n } else if (c !== 0) {\n groupResult += `${digit[c]} `\n }\n\n if (i === groups.length - 1 && a === 0) {\n groupResult = groupResult.replace(\"không trăm \", \"\")\n if (b === 0) groupResult = groupResult.replace(\"lẻ \", \"\")\n }\n\n if (groupResult.trim() !== \"\") {\n result = `${groupResult.trim()} ${unit[i]} ${result}`\n }\n }\n\n result = result.trim() + \" đồng\"\n\n if (isNegative) {\n return \"Âm \" + result\n }\n\n return result.charAt(0).toUpperCase() + result.slice(1)\n}\n\n/**\n * Format currency with locale\n */\nexport function formatCurrency(\n value: number,\n locales: LocaleType = \"vi\",\n currency: string = \"VND\",\n): string {\n return new Intl.NumberFormat(locales === \"vi\" ? \"vi-VN\" : locales, {\n style: \"decimal\",\n maximumFractionDigits: 0,\n }).format(value);\n}\n\n/**\n * Format number with locale\n */\nexport function formatNumber(\n value: number,\n options?: {\n locale?: string;\n minimumFractionDigits?: number;\n maximumFractionDigits?: number;\n },\n): string {\n const {\n locale = \"vi-VN\",\n minimumFractionDigits = 0,\n maximumFractionDigits = 2,\n } = options || {};\n\n return new Intl.NumberFormat(locale, {\n minimumFractionDigits,\n maximumFractionDigits,\n }).format(value);\n}\n\n/**\n * Format percent\n */\nexport function formatPercent(\n value: number,\n locales: LocaleType = \"vi\",\n): string {\n return new Intl.NumberFormat(locales === \"vi\" ? \"vi-VN\" : locales, {\n style: \"percent\",\n maximumFractionDigits: 0,\n }).format(value);\n}\n\n/**\n * Format number to compact (e.g., 1K, 1M)\n */\nexport function formatNumberToCompact(\n value: number,\n locales: LocaleType = \"vi\",\n): string {\n return new Intl.NumberFormat(locales === \"vi\" ? \"vi-VN\" : locales, {\n notation: \"compact\",\n compactDisplay: \"short\",\n }).format(value);\n}\n\n/**\n * Format file size\n */\nexport function formatFileSize(bytes: number, decimals: number = 2): string {\n if (bytes === 0) return \"0 Bytes\";\n\n const k = 1000;\n const dm = decimals < 0 ? 0 : decimals;\n const sizes = [\"Bytes\", \"KB\", \"MB\", \"GB\", \"TB\", \"PB\"];\n\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n\n return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + \" \" + sizes[i];\n}\n\n/**\n * Format unread count\n */\nexport function formatUnreadCount(unreadCount: number): string | number {\n return unreadCount >= 100 ? \"+99\" : unreadCount;\n}\n\n// ============================================================================\n// Date Utilities\n// ============================================================================\n\n/**\n * Format date with Vietnamese locale (Asia/Ho_Chi_Minh timezone)\n */\nexport function formatDate(\n date: Date | string,\n options?: {\n locale?: string;\n format?: \"short\" | \"medium\" | \"long\" | \"full\";\n },\n): string {\n const { locale = \"vi-VN\", format = \"medium\" } = options || {};\n const dateObj = typeof date === \"string\" ? new Date(date) : date;\n\n const formatOptions: Record<string, Intl.DateTimeFormatOptions> = {\n short: { day: \"2-digit\", month: \"2-digit\", year: \"numeric\", timeZone: \"Asia/Ho_Chi_Minh\" },\n medium: { day: \"2-digit\", month: \"short\", year: \"numeric\", timeZone: \"Asia/Ho_Chi_Minh\" },\n long: { day: \"numeric\", month: \"long\", year: \"numeric\", timeZone: \"Asia/Ho_Chi_Minh\" },\n full: { weekday: \"long\", day: \"numeric\", month: \"long\", year: \"numeric\", timeZone: \"Asia/Ho_Chi_Minh\" },\n };\n\n return new Intl.DateTimeFormat(locale, formatOptions[format]).format(dateObj);\n}\n\n/**\n * Format datetime with Vietnamese locale (Asia/Ho_Chi_Minh timezone)\n */\nexport function formatDateTime(\n date: Date | string,\n options?: {\n locale?: string;\n },\n): string {\n const { locale = \"vi-VN\" } = options || {};\n const dateObj = typeof date === \"string\" ? new Date(date) : date;\n\n return new Intl.DateTimeFormat(locale, {\n day: \"2-digit\",\n month: \"2-digit\",\n year: \"numeric\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n timeZone: \"Asia/Ho_Chi_Minh\",\n }).format(dateObj);\n}\n\n/**\n * Format relative date (Today, Yesterday, or date) - Asia/Ho_Chi_Minh timezone\n */\nexport function formatRelativeDate(value?: string | number | Date): string {\n if (!value) return \"No Date\";\n\n const date = new Date(value);\n const today = new Date();\n const yesterday = new Date();\n yesterday.setDate(today.getDate() - 1);\n\n // Compare dates in Vietnam timezone\n const vnDateStr = new Intl.DateTimeFormat(\"en-CA\", { timeZone: \"Asia/Ho_Chi_Minh\", year: \"numeric\", month: \"2-digit\", day: \"2-digit\" }).format(date);\n const vnTodayStr = new Intl.DateTimeFormat(\"en-CA\", { timeZone: \"Asia/Ho_Chi_Minh\", year: \"numeric\", month: \"2-digit\", day: \"2-digit\" }).format(today);\n const vnYesterdayStr = new Intl.DateTimeFormat(\"en-CA\", { timeZone: \"Asia/Ho_Chi_Minh\", year: \"numeric\", month: \"2-digit\", day: \"2-digit\" }).format(yesterday);\n\n if (vnDateStr === vnTodayStr) return \"Today\";\n if (vnDateStr === vnYesterdayStr) return \"Yesterday\";\n\n return formatDate(date);\n}\n\n/**\n * Check if date is before today (Asia/Ho_Chi_Minh timezone)\n */\nexport function isBeforeToday(date: Date): boolean {\n const vnTodayStr = new Intl.DateTimeFormat(\"en-CA\", { timeZone: \"Asia/Ho_Chi_Minh\", year: \"numeric\", month: \"2-digit\", day: \"2-digit\" }).format(new Date());\n const vnDateStr = new Intl.DateTimeFormat(\"en-CA\", { timeZone: \"Asia/Ho_Chi_Minh\", year: \"numeric\", month: \"2-digit\", day: \"2-digit\" }).format(date);\n return vnDateStr < vnTodayStr;\n}\n\n// ============================================================================\n// Path Utilities\n// ============================================================================\n\n/**\n * Ensure path has prefix\n */\nexport function ensureWithPrefix(value: string, prefix: string): string {\n return value.startsWith(prefix) ? value : `${prefix}${value}`;\n}\n\n/**\n * Ensure path has suffix\n */\nexport function ensureWithSuffix(value: string, suffix: string): string {\n return value.endsWith(suffix) ? value : `${value}${suffix}`;\n}\n\n/**\n * Ensure path without prefix\n */\nexport function ensureWithoutPrefix(value: string, prefix: string): string {\n return value.startsWith(prefix) ? value.slice(prefix.length) : value;\n}\n\n/**\n * Ensure path without suffix\n */\nexport function ensureWithoutSuffix(value: string, suffix: string): string {\n return value.endsWith(suffix) ? value.slice(0, -suffix.length) : value;\n}\n\n/**\n * Check if pathname is active\n */\nexport function isActivePathname(\n basePathname: string,\n currentPathname: string,\n exactMatch: boolean = false,\n): boolean {\n if (typeof basePathname !== \"string\" || typeof currentPathname !== \"string\") {\n throw new Error(\"Both basePathname and currentPathname must be strings\");\n }\n\n if (exactMatch) {\n return basePathname === currentPathname;\n }\n\n return (\n currentPathname.startsWith(basePathname) &&\n (currentPathname.length === basePathname.length ||\n currentPathname[basePathname.length] === \"/\")\n );\n}\n\n// ============================================================================\n// General Utilities\n// ============================================================================\n\n/**\n * Wait/sleep function\n */\nexport function wait(ms: number = 250): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Debounce function\n */\nexport function debounce<T extends (...args: unknown[]) => unknown>(\n func: T,\n wait: number,\n): (...args: Parameters<T>) => void {\n let timeout: ReturnType<typeof setTimeout> | null = null;\n\n return (...args: Parameters<T>) => {\n if (timeout) {\n clearTimeout(timeout);\n }\n timeout = setTimeout(() => func(...args), wait);\n };\n}\n\n/**\n * Deep clone object\n */\nexport function deepClone<T>(obj: T): T {\n return JSON.parse(JSON.stringify(obj));\n}\n\n/**\n * Check if value is empty\n */\nexport function isEmpty(value: unknown): boolean {\n if (value === null || value === undefined) return true;\n if (typeof value === \"string\") return value.trim() === \"\";\n if (Array.isArray(value)) return value.length === 0;\n if (typeof value === \"object\") return Object.keys(value).length === 0;\n return false;\n}\n\n/**\n * Generate a random ID\n */\nexport function generateId(prefix?: string): string {\n const id = Math.random().toString(36).substring(2, 11);\n return prefix ? `${prefix}_${id}` : id;\n}\n\n/**\n * Get dictionary value safely\n */\nexport function getDictionaryValue(\n key: string,\n section: Record<string, unknown>,\n fallback?: string,\n): string {\n const value = section[key];\n\n if (typeof value !== \"string\") {\n if (fallback !== undefined) {\n return fallback;\n }\n\n const normalizedKey = key.replace(/[-_]/g, \"\");\n const normalizedValue = section[normalizedKey];\n\n if (typeof normalizedValue === \"string\") {\n return normalizedValue;\n }\n\n return key;\n }\n\n return value;\n}\n\n/**\n * Format overview card value based on style\n */\nexport function formatOverviewCardValue(\n value: number,\n formatStyle: FormatStyleType,\n): string | number {\n switch (formatStyle) {\n case \"percent\":\n return formatPercent(value);\n case \"currency\":\n return formatCurrency(value);\n default:\n return value.toLocaleString(\"vi-VN\", {\n maximumFractionDigits: 0,\n });\n }\n}\n\n// ============================================================================\n// Additional Utilities (migrated from shared-utils)\n// ============================================================================\n\n/**\n * Get credit card brand name from number\n */\nexport function getCreditCardBrandName(number: string): string {\n const re = {\n visa: /^4/,\n mastercard: /^5[1-5]/,\n amex: /^3[47]/,\n discover: /^6(?:011|5)/,\n };\n\n for (const [type, regex] of Object.entries(re)) {\n if (regex.test(number)) return type;\n }\n return \"unknown\";\n}\n\n/**\n * Convert rem to pixels\n */\nexport function remToPx(rem: number): number {\n if (typeof document === \"undefined\") return rem * 16;\n const rootFontSize = parseFloat(\n getComputedStyle(document.documentElement).fontSize,\n );\n return rem * rootFontSize;\n}\n\n/**\n * Check if string is a valid URL\n */\nexport function isUrl(text: string): boolean {\n try {\n new URL(text);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Rating to percentage string\n */\nexport function ratingToPercentage(\n rating: number,\n maxRating: number,\n fractionDigits: number = 0,\n): string {\n const value = ((rating / maxRating) * 100).toFixed(fractionDigits);\n return value + \"%\";\n}\n\n/**\n * Ensure redirect pathname with query params\n */\nexport function ensureRedirectPathname(\n basePathname: string,\n redirectPathname: string,\n): string {\n const searchParams = new URLSearchParams({\n redirectTo: ensureWithoutSuffix(redirectPathname, \"/\"),\n });\n\n return ensureWithSuffix(basePathname, \"?\" + searchParams.toString());\n}\n\n/**\n * Get discounted price\n */\nexport function getDiscountedPrice(\n price: number,\n discountRate: number,\n isAnnual: boolean = false,\n): number {\n if (isAnnual) {\n const annualPrice = price * 12;\n const discountedAnnualPrice = annualPrice * (1 - discountRate);\n return discountedAnnualPrice / 12;\n } else {\n return price * (1 - discountRate);\n }\n}\n\n/**\n * Convert time string to Date\n */\nexport function timeToDate(timeString: string, baseDate = new Date()): Date {\n if (!/^\\d{2}:\\d{2}$/.test(timeString)) {\n throw new Error(\"Invalid time format. Use 'HH:mm'.\");\n }\n\n const [hours, minutes] = timeString.split(\":\").map(Number);\n const date = new Date(baseDate);\n\n date.setHours(hours, minutes, 0, 0);\n\n return date;\n}\n\n/**\n * Format file type\n */\nexport function formatFileType(type: string): string {\n return type.slice(0, type.lastIndexOf(\"/\"));\n}\n\n/**\n * Format date with time (Asia/Ho_Chi_Minh timezone)\n */\nexport function formatDateWithTime(value: string | number | Date): string {\n const date = new Date(value);\n return new Intl.DateTimeFormat(\"vi-VN\", {\n day: \"2-digit\",\n month: \"2-digit\",\n year: \"numeric\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n timeZone: \"Asia/Ho_Chi_Minh\",\n }).format(date);\n}\n\n/**\n * Format date short (MMM dd) - Asia/Ho_Chi_Minh timezone\n */\nexport function formatDateShort(value: string | number | Date): string {\n const date = new Date(value);\n return new Intl.DateTimeFormat(\"en-US\", {\n month: \"short\",\n day: \"2-digit\",\n timeZone: \"Asia/Ho_Chi_Minh\",\n }).format(date);\n}\n\n/**\n * Format time (Asia/Ho_Chi_Minh timezone)\n */\nexport function formatTime(value: string | number | Date): string {\n const date = new Date(value);\n return new Intl.DateTimeFormat(\"en-US\", {\n hour: \"numeric\",\n minute: \"2-digit\",\n hour12: true,\n timeZone: \"Asia/Ho_Chi_Minh\",\n }).format(date);\n}\n\n/**\n * Format duration from milliseconds\n */\nexport function formatDuration(value: string | number | Date): string {\n const numberValue = Number(value);\n const isNegative = numberValue < 0;\n const absoluteValue = Math.abs(numberValue);\n\n const hours = Math.floor(absoluteValue / 3600000);\n const minutes = Math.floor((absoluteValue % 3600000) / 60000);\n const seconds = Math.floor((absoluteValue % 60000) / 1000);\n\n const parts = [];\n if (hours) parts.push(`${hours}h`);\n if (minutes) parts.push(`${minutes}m`);\n if (seconds) parts.push(`${seconds}s`);\n\n const formattedDuration = parts.join(\" \") || \"0s\";\n\n return isNegative ? `-${formattedDuration}` : formattedDuration;\n}\n\n/**\n * Format distance to now\n */\nexport function formatDistance(value: string | number | Date): string {\n const date = new Date(value);\n const now = new Date();\n const diffMs = now.getTime() - date.getTime();\n const diffMins = Math.floor(diffMs / 60000);\n const diffHours = Math.floor(diffMs / 3600000);\n const diffDays = Math.floor(diffMs / 86400000);\n\n if (diffMins < 1) return \"just now\";\n if (diffMins < 60) return `${diffMins} mins ago`;\n if (diffHours < 24) return `${diffHours} hrs ago`;\n if (diffDays < 30) return `${diffDays} days ago`;\n if (diffDays < 365) return `${Math.floor(diffDays / 30)} months ago`;\n return `${Math.floor(diffDays / 365)} years ago`;\n}\n\n// Re-export status constants from configs\nexport {\n STATUS_COLORS,\n STATUS_ACTIVE,\n STATUS_INACTIVE,\n STATUS_OPTIONS,\n STATUS_VALUES,\n booleanToStatus,\n statusToBoolean,\n} from \"../configs/status\";\n\n// ============================================================================\n// Localization Utilities\n// ============================================================================\n\nconst LOCALE_LIST = [\"vi\", \"en\"];\n\nexport function isPathnameMissingLocale(pathname: string) {\n return !LOCALE_LIST.some((locale) => pathname.startsWith(`/${locale}`));\n}\n\nexport function getLocaleFromPathname(pathname: string) {\n return LOCALE_LIST.find((locale) => pathname.startsWith(`/${locale}`));\n}\n\nexport function ensureLocalizedPathname(pathname: string, locale: string) {\n if (!pathname || !locale)\n throw new Error(\"Pathname or Locale cannot be empty\");\n return isPathnameMissingLocale(pathname)\n ? `${ensureWithPrefix(locale, \"/\")}${ensureWithPrefix(pathname, \"/\")}`\n : pathname;\n}\n\nexport function relocalizePathname(pathname: string, locale: string) {\n if (!pathname || !locale)\n throw new Error(\"Pathname or Locale cannot be empty\");\n const segments = pathname.split(\"/\");\n segments[1] = locale;\n return segments.join(\"/\");\n}\n\n// ============================================================================\n// Logger\n// ============================================================================\n\ntype LogLevel = \"info\" | \"warn\" | \"error\" | \"debug\";\n\ninterface LogEntry {\n timestamp: string;\n level: LogLevel;\n message: string;\n context?: Record<string, unknown>;\n error?: Error | unknown;\n}\n\nclass Logger {\n private log(\n level: LogLevel,\n message: string,\n context?: Record<string, unknown>,\n error?: unknown,\n ) {\n const entry: LogEntry = {\n timestamp: new Date().toISOString(),\n level,\n message,\n context,\n };\n\n if (error instanceof Error) {\n entry.error = {\n name: error.name,\n message: error.message,\n stack: error.stack,\n };\n } else if (error) {\n entry.error = error;\n }\n\n const logString = JSON.stringify(entry);\n switch (level) {\n case \"error\":\n console.error(logString);\n break;\n case \"warn\":\n console.warn(logString);\n break;\n case \"debug\":\n if (process.env.NODE_ENV === \"development\") console.debug(logString);\n break;\n default:\n console.log(logString);\n }\n }\n\n info(message: string, context?: Record<string, unknown>) {\n this.log(\"info\", message, context);\n }\n warn(message: string, context?: Record<string, unknown>) {\n this.log(\"warn\", message, context);\n }\n error(message: string, error?: unknown, context?: Record<string, unknown>) {\n this.log(\"error\", message, context, error);\n }\n debug(message: string, context?: Record<string, unknown>) {\n this.log(\"debug\", message, context);\n }\n}\n\nexport const logger = new Logger();\n\n// ============================================================================\n// Tab Navigation Utilities\n// ============================================================================\n\nimport type {\n NavigationType,\n NavigationNestedItemWithHrefType,\n NavigationNestedItemWithItemsType,\n DynamicIconNameType,\n} from \"../types\";\n\nexport function shouldExcludeFromTabs(pathname: string): boolean {\n const excludePatterns = [\n \"/sign-in\",\n \"/sign-out\",\n \"/forgot-password\",\n \"/new-password\",\n \"/verify-email\",\n \"/register\",\n \"/unauthorized\",\n \"/not-found\",\n \"/maintenance\",\n \"/coming-soon\",\n ];\n if (\n pathname.includes(\"/ui/\") ||\n pathname.includes(\"/colors\") ||\n pathname.includes(\"/typography\")\n )\n return true;\n return excludePatterns.some((pattern) => pathname.includes(pattern));\n}\n\nexport function normalizePathname(pathname: string): string {\n return pathname.replace(/^\\/[a-z]{2}(\\/|$)/, \"/\") || \"/\";\n}\n\nfunction formatSegmentLabel(segment: string): string {\n return segment\n .replace(/[-_]+/g, \" \")\n .replace(/\\b\\w/g, (char) => char.toUpperCase());\n}\n\nexport function findRouteTitle(\n pathname: string,\n navigations: NavigationType[],\n): string | null {\n const result = findRouteInfo(pathname, navigations);\n return result?.title || null;\n}\n\nexport function findRouteIcon(\n pathname: string,\n navigations: NavigationType[],\n): DynamicIconNameType | null {\n const result = findRouteInfo(pathname, navigations);\n return (result?.iconName as DynamicIconNameType) || null;\n}\n\ninterface RouteInfo {\n title: string;\n iconName?: DynamicIconNameType;\n}\n\nfunction findRouteInfo(\n pathname: string,\n navigations: NavigationType[],\n): RouteInfo | null {\n const normalizedPath = normalizePathname(pathname);\n let exactMatch: RouteInfo | null = null;\n const prefixMatches: Array<{ itemPath: string; routeInfo: RouteInfo }> = [];\n\n function searchItems(\n items:\n | NavigationType[\"items\"]\n | Array<\n NavigationNestedItemWithHrefType | NavigationNestedItemWithItemsType\n >\n | undefined,\n ): void {\n if (!items) return;\n for (const item of items) {\n if (\"href\" in item && item.href) {\n const itemPath = normalizePathname(item.href);\n if (normalizedPath === itemPath) {\n exactMatch = {\n title: item.title,\n iconName:\n \"iconName\" in item\n ? (item.iconName as DynamicIconNameType | undefined)\n : undefined,\n };\n } else if (normalizedPath.startsWith(itemPath + \"/\")) {\n prefixMatches.push({\n itemPath,\n routeInfo: {\n title: item.title,\n iconName:\n \"iconName\" in item\n ? (item.iconName as DynamicIconNameType | undefined)\n : undefined,\n },\n });\n }\n }\n if (\"items\" in item && item.items) searchItems(item.items);\n }\n }\n\n for (const nav of navigations) {\n searchItems(nav.items);\n if (exactMatch) return exactMatch;\n }\n\n if (prefixMatches.length > 0) {\n prefixMatches.sort((a, b) => b.itemPath.length - a.itemPath.length);\n return prefixMatches[0].routeInfo;\n }\n\n const segments = normalizedPath.split(\"/\").filter(Boolean);\n return segments.length > 0\n ? { title: formatSegmentLabel(segments[segments.length - 1]) }\n : { title: \"Home\" };\n}\n"]}
@@ -1,514 +0,0 @@
1
- import { clsx } from 'clsx';
2
- import { twMerge } from 'tailwind-merge';
3
-
4
- // src/utils/index.ts
5
-
6
- // src/configs/status.ts
7
- var STATUS_ACTIVE = "active";
8
- var STATUS_INACTIVE = "inactive";
9
- var STATUS_VALUES = [STATUS_ACTIVE, STATUS_INACTIVE];
10
- var STATUS_OPTIONS = [
11
- { label: "crud.common.options.active", value: STATUS_ACTIVE },
12
- { label: "crud.common.options.inactive", value: STATUS_INACTIVE }
13
- ];
14
- var STATUS_COLORS = {
15
- [STATUS_ACTIVE]: "success",
16
- [STATUS_INACTIVE]: "warning"
17
- };
18
- function booleanToStatus(value) {
19
- return value ? STATUS_ACTIVE : STATUS_INACTIVE;
20
- }
21
- function statusToBoolean(value) {
22
- return value === STATUS_ACTIVE;
23
- }
24
-
25
- // src/utils/index.ts
26
- function cn(...inputs) {
27
- return twMerge(clsx(inputs));
28
- }
29
- function getInitials(fullName) {
30
- if (fullName.length === 0) return "";
31
- const names = fullName.split(" ");
32
- const initials = names.map((name) => name.charAt(0).toUpperCase()).join("");
33
- return initials;
34
- }
35
- function slugify(text) {
36
- return text.toLowerCase().normalize("NFD").replace(/[\u0300-\u036f]/g, "").replace(/[^a-z0-9]+/g, "-").replace(/(^-|-$)/g, "");
37
- }
38
- function camelCaseToTitleCase(camelCaseStr) {
39
- return camelCaseStr.replace(/([A-Z])/g, " $1").replace(/^./, (char) => char.toUpperCase());
40
- }
41
- function titleCaseToCamelCase(titleCaseStr) {
42
- return titleCaseStr.toLowerCase().replace(/[-_\s]+(.)/g, (_, char) => char.toUpperCase()).replace(/[-_]/g, "");
43
- }
44
- var isEven = (num) => num % 2 === 0;
45
- var isNonNegative = (num) => num >= 0;
46
- function readMoney(amount) {
47
- if (!Number.isFinite(amount)) return "Kh\xF4ng \u0111\u1ED3ng";
48
- const isNegative = amount < 0;
49
- amount = Math.floor(Math.abs(amount));
50
- if (amount === 0) return "Kh\xF4ng \u0111\u1ED3ng";
51
- const unit = ["", "ngh\xECn", "tri\u1EC7u", "t\u1EF7", "ngh\xECn t\u1EF7", "tri\u1EC7u t\u1EF7"];
52
- const digit = [
53
- "kh\xF4ng",
54
- "m\u1ED9t",
55
- "hai",
56
- "ba",
57
- "b\u1ED1n",
58
- "n\u0103m",
59
- "s\xE1u",
60
- "b\u1EA3y",
61
- "t\xE1m",
62
- "ch\xEDn"
63
- ];
64
- let str = amount.toString();
65
- const groups = [];
66
- while (str.length > 0) {
67
- groups.push(str.slice(-3));
68
- str = str.slice(0, -3);
69
- }
70
- let result = "";
71
- for (let i = 0; i < groups.length; i++) {
72
- const group = groups[i];
73
- if (group === "000") continue;
74
- const [a, b, c] = group.padStart(3, "0").split("").map(Number);
75
- let groupResult = "";
76
- const hasHundreds = a !== 0 || groups.length > 1;
77
- if (hasHundreds) {
78
- groupResult += `${digit[a]} tr\u0103m `;
79
- }
80
- if (b === 0 && c !== 0) {
81
- if (hasHundreds) groupResult += "l\u1EBB ";
82
- } else if (b === 1) {
83
- groupResult += "m\u01B0\u1EDDi ";
84
- } else if (b > 1) {
85
- groupResult += `${digit[b]} m\u01B0\u01A1i `;
86
- }
87
- if (c === 1 && b > 1) {
88
- groupResult += "m\u1ED1t ";
89
- } else if (c === 5 && b > 0) {
90
- groupResult += "l\u0103m ";
91
- } else if (c !== 0) {
92
- groupResult += `${digit[c]} `;
93
- }
94
- if (i === groups.length - 1 && a === 0) {
95
- groupResult = groupResult.replace("kh\xF4ng tr\u0103m ", "");
96
- if (b === 0) groupResult = groupResult.replace("l\u1EBB ", "");
97
- }
98
- if (groupResult.trim() !== "") {
99
- result = `${groupResult.trim()} ${unit[i]} ${result}`;
100
- }
101
- }
102
- result = result.trim() + " \u0111\u1ED3ng";
103
- if (isNegative) {
104
- return "\xC2m " + result;
105
- }
106
- return result.charAt(0).toUpperCase() + result.slice(1);
107
- }
108
- function formatCurrency(value, locales = "vi", currency = "VND") {
109
- return new Intl.NumberFormat(locales === "vi" ? "vi-VN" : locales, {
110
- style: "decimal",
111
- maximumFractionDigits: 0
112
- }).format(value);
113
- }
114
- function formatNumber(value, options) {
115
- const {
116
- locale = "vi-VN",
117
- minimumFractionDigits = 0,
118
- maximumFractionDigits = 2
119
- } = options || {};
120
- return new Intl.NumberFormat(locale, {
121
- minimumFractionDigits,
122
- maximumFractionDigits
123
- }).format(value);
124
- }
125
- function formatPercent(value, locales = "vi") {
126
- return new Intl.NumberFormat(locales === "vi" ? "vi-VN" : locales, {
127
- style: "percent",
128
- maximumFractionDigits: 0
129
- }).format(value);
130
- }
131
- function formatNumberToCompact(value, locales = "vi") {
132
- return new Intl.NumberFormat(locales === "vi" ? "vi-VN" : locales, {
133
- notation: "compact",
134
- compactDisplay: "short"
135
- }).format(value);
136
- }
137
- function formatFileSize(bytes, decimals = 2) {
138
- if (bytes === 0) return "0 Bytes";
139
- const k = 1e3;
140
- const dm = decimals < 0 ? 0 : decimals;
141
- const sizes = ["Bytes", "KB", "MB", "GB", "TB", "PB"];
142
- const i = Math.floor(Math.log(bytes) / Math.log(k));
143
- return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + " " + sizes[i];
144
- }
145
- function formatUnreadCount(unreadCount) {
146
- return unreadCount >= 100 ? "+99" : unreadCount;
147
- }
148
- function formatDate(date, options) {
149
- const { locale = "vi-VN", format = "medium" } = options || {};
150
- const dateObj = typeof date === "string" ? new Date(date) : date;
151
- const formatOptions = {
152
- short: { day: "2-digit", month: "2-digit", year: "numeric", timeZone: "Asia/Ho_Chi_Minh" },
153
- medium: { day: "2-digit", month: "short", year: "numeric", timeZone: "Asia/Ho_Chi_Minh" },
154
- long: { day: "numeric", month: "long", year: "numeric", timeZone: "Asia/Ho_Chi_Minh" },
155
- full: { weekday: "long", day: "numeric", month: "long", year: "numeric", timeZone: "Asia/Ho_Chi_Minh" }
156
- };
157
- return new Intl.DateTimeFormat(locale, formatOptions[format]).format(dateObj);
158
- }
159
- function formatDateTime(date, options) {
160
- const { locale = "vi-VN" } = options || {};
161
- const dateObj = typeof date === "string" ? new Date(date) : date;
162
- return new Intl.DateTimeFormat(locale, {
163
- day: "2-digit",
164
- month: "2-digit",
165
- year: "numeric",
166
- hour: "2-digit",
167
- minute: "2-digit",
168
- timeZone: "Asia/Ho_Chi_Minh"
169
- }).format(dateObj);
170
- }
171
- function formatRelativeDate(value) {
172
- if (!value) return "No Date";
173
- const date = new Date(value);
174
- const today = /* @__PURE__ */ new Date();
175
- const yesterday = /* @__PURE__ */ new Date();
176
- yesterday.setDate(today.getDate() - 1);
177
- const vnDateStr = new Intl.DateTimeFormat("en-CA", { timeZone: "Asia/Ho_Chi_Minh", year: "numeric", month: "2-digit", day: "2-digit" }).format(date);
178
- const vnTodayStr = new Intl.DateTimeFormat("en-CA", { timeZone: "Asia/Ho_Chi_Minh", year: "numeric", month: "2-digit", day: "2-digit" }).format(today);
179
- const vnYesterdayStr = new Intl.DateTimeFormat("en-CA", { timeZone: "Asia/Ho_Chi_Minh", year: "numeric", month: "2-digit", day: "2-digit" }).format(yesterday);
180
- if (vnDateStr === vnTodayStr) return "Today";
181
- if (vnDateStr === vnYesterdayStr) return "Yesterday";
182
- return formatDate(date);
183
- }
184
- function isBeforeToday(date) {
185
- const vnTodayStr = new Intl.DateTimeFormat("en-CA", { timeZone: "Asia/Ho_Chi_Minh", year: "numeric", month: "2-digit", day: "2-digit" }).format(/* @__PURE__ */ new Date());
186
- const vnDateStr = new Intl.DateTimeFormat("en-CA", { timeZone: "Asia/Ho_Chi_Minh", year: "numeric", month: "2-digit", day: "2-digit" }).format(date);
187
- return vnDateStr < vnTodayStr;
188
- }
189
- function ensureWithPrefix(value, prefix) {
190
- return value.startsWith(prefix) ? value : `${prefix}${value}`;
191
- }
192
- function ensureWithSuffix(value, suffix) {
193
- return value.endsWith(suffix) ? value : `${value}${suffix}`;
194
- }
195
- function ensureWithoutPrefix(value, prefix) {
196
- return value.startsWith(prefix) ? value.slice(prefix.length) : value;
197
- }
198
- function ensureWithoutSuffix(value, suffix) {
199
- return value.endsWith(suffix) ? value.slice(0, -suffix.length) : value;
200
- }
201
- function isActivePathname(basePathname, currentPathname, exactMatch = false) {
202
- if (typeof basePathname !== "string" || typeof currentPathname !== "string") {
203
- throw new Error("Both basePathname and currentPathname must be strings");
204
- }
205
- if (exactMatch) {
206
- return basePathname === currentPathname;
207
- }
208
- return currentPathname.startsWith(basePathname) && (currentPathname.length === basePathname.length || currentPathname[basePathname.length] === "/");
209
- }
210
- function wait(ms = 250) {
211
- return new Promise((resolve) => setTimeout(resolve, ms));
212
- }
213
- function debounce(func, wait2) {
214
- let timeout = null;
215
- return (...args) => {
216
- if (timeout) {
217
- clearTimeout(timeout);
218
- }
219
- timeout = setTimeout(() => func(...args), wait2);
220
- };
221
- }
222
- function deepClone(obj) {
223
- return JSON.parse(JSON.stringify(obj));
224
- }
225
- function isEmpty(value) {
226
- if (value === null || value === void 0) return true;
227
- if (typeof value === "string") return value.trim() === "";
228
- if (Array.isArray(value)) return value.length === 0;
229
- if (typeof value === "object") return Object.keys(value).length === 0;
230
- return false;
231
- }
232
- function generateId(prefix) {
233
- const id = Math.random().toString(36).substring(2, 11);
234
- return prefix ? `${prefix}_${id}` : id;
235
- }
236
- function getDictionaryValue(key, section, fallback) {
237
- const value = section[key];
238
- if (typeof value !== "string") {
239
- if (fallback !== void 0) {
240
- return fallback;
241
- }
242
- const normalizedKey = key.replace(/[-_]/g, "");
243
- const normalizedValue = section[normalizedKey];
244
- if (typeof normalizedValue === "string") {
245
- return normalizedValue;
246
- }
247
- return key;
248
- }
249
- return value;
250
- }
251
- function formatOverviewCardValue(value, formatStyle) {
252
- switch (formatStyle) {
253
- case "percent":
254
- return formatPercent(value);
255
- case "currency":
256
- return formatCurrency(value);
257
- default:
258
- return value.toLocaleString("vi-VN", {
259
- maximumFractionDigits: 0
260
- });
261
- }
262
- }
263
- function getCreditCardBrandName(number) {
264
- const re = {
265
- visa: /^4/,
266
- mastercard: /^5[1-5]/,
267
- amex: /^3[47]/,
268
- discover: /^6(?:011|5)/
269
- };
270
- for (const [type, regex] of Object.entries(re)) {
271
- if (regex.test(number)) return type;
272
- }
273
- return "unknown";
274
- }
275
- function remToPx(rem) {
276
- if (typeof document === "undefined") return rem * 16;
277
- const rootFontSize = parseFloat(
278
- getComputedStyle(document.documentElement).fontSize
279
- );
280
- return rem * rootFontSize;
281
- }
282
- function isUrl(text) {
283
- try {
284
- new URL(text);
285
- return true;
286
- } catch {
287
- return false;
288
- }
289
- }
290
- function ratingToPercentage(rating, maxRating, fractionDigits = 0) {
291
- const value = (rating / maxRating * 100).toFixed(fractionDigits);
292
- return value + "%";
293
- }
294
- function ensureRedirectPathname(basePathname, redirectPathname) {
295
- const searchParams = new URLSearchParams({
296
- redirectTo: ensureWithoutSuffix(redirectPathname, "/")
297
- });
298
- return ensureWithSuffix(basePathname, "?" + searchParams.toString());
299
- }
300
- function getDiscountedPrice(price, discountRate, isAnnual = false) {
301
- if (isAnnual) {
302
- const annualPrice = price * 12;
303
- const discountedAnnualPrice = annualPrice * (1 - discountRate);
304
- return discountedAnnualPrice / 12;
305
- } else {
306
- return price * (1 - discountRate);
307
- }
308
- }
309
- function timeToDate(timeString, baseDate = /* @__PURE__ */ new Date()) {
310
- if (!/^\d{2}:\d{2}$/.test(timeString)) {
311
- throw new Error("Invalid time format. Use 'HH:mm'.");
312
- }
313
- const [hours, minutes] = timeString.split(":").map(Number);
314
- const date = new Date(baseDate);
315
- date.setHours(hours, minutes, 0, 0);
316
- return date;
317
- }
318
- function formatFileType(type) {
319
- return type.slice(0, type.lastIndexOf("/"));
320
- }
321
- function formatDateWithTime(value) {
322
- const date = new Date(value);
323
- return new Intl.DateTimeFormat("vi-VN", {
324
- day: "2-digit",
325
- month: "2-digit",
326
- year: "numeric",
327
- hour: "2-digit",
328
- minute: "2-digit",
329
- timeZone: "Asia/Ho_Chi_Minh"
330
- }).format(date);
331
- }
332
- function formatDateShort(value) {
333
- const date = new Date(value);
334
- return new Intl.DateTimeFormat("en-US", {
335
- month: "short",
336
- day: "2-digit",
337
- timeZone: "Asia/Ho_Chi_Minh"
338
- }).format(date);
339
- }
340
- function formatTime(value) {
341
- const date = new Date(value);
342
- return new Intl.DateTimeFormat("en-US", {
343
- hour: "numeric",
344
- minute: "2-digit",
345
- hour12: true,
346
- timeZone: "Asia/Ho_Chi_Minh"
347
- }).format(date);
348
- }
349
- function formatDuration(value) {
350
- const numberValue = Number(value);
351
- const isNegative = numberValue < 0;
352
- const absoluteValue = Math.abs(numberValue);
353
- const hours = Math.floor(absoluteValue / 36e5);
354
- const minutes = Math.floor(absoluteValue % 36e5 / 6e4);
355
- const seconds = Math.floor(absoluteValue % 6e4 / 1e3);
356
- const parts = [];
357
- if (hours) parts.push(`${hours}h`);
358
- if (minutes) parts.push(`${minutes}m`);
359
- if (seconds) parts.push(`${seconds}s`);
360
- const formattedDuration = parts.join(" ") || "0s";
361
- return isNegative ? `-${formattedDuration}` : formattedDuration;
362
- }
363
- function formatDistance(value) {
364
- const date = new Date(value);
365
- const now = /* @__PURE__ */ new Date();
366
- const diffMs = now.getTime() - date.getTime();
367
- const diffMins = Math.floor(diffMs / 6e4);
368
- const diffHours = Math.floor(diffMs / 36e5);
369
- const diffDays = Math.floor(diffMs / 864e5);
370
- if (diffMins < 1) return "just now";
371
- if (diffMins < 60) return `${diffMins} mins ago`;
372
- if (diffHours < 24) return `${diffHours} hrs ago`;
373
- if (diffDays < 30) return `${diffDays} days ago`;
374
- if (diffDays < 365) return `${Math.floor(diffDays / 30)} months ago`;
375
- return `${Math.floor(diffDays / 365)} years ago`;
376
- }
377
- var LOCALE_LIST = ["vi", "en"];
378
- function isPathnameMissingLocale(pathname) {
379
- return !LOCALE_LIST.some((locale) => pathname.startsWith(`/${locale}`));
380
- }
381
- function getLocaleFromPathname(pathname) {
382
- return LOCALE_LIST.find((locale) => pathname.startsWith(`/${locale}`));
383
- }
384
- function ensureLocalizedPathname(pathname, locale) {
385
- if (!pathname || !locale)
386
- throw new Error("Pathname or Locale cannot be empty");
387
- return isPathnameMissingLocale(pathname) ? `${ensureWithPrefix(locale, "/")}${ensureWithPrefix(pathname, "/")}` : pathname;
388
- }
389
- function relocalizePathname(pathname, locale) {
390
- if (!pathname || !locale)
391
- throw new Error("Pathname or Locale cannot be empty");
392
- const segments = pathname.split("/");
393
- segments[1] = locale;
394
- return segments.join("/");
395
- }
396
- var Logger = class {
397
- log(level, message, context, error) {
398
- const entry = {
399
- timestamp: (/* @__PURE__ */ new Date()).toISOString(),
400
- level,
401
- message,
402
- context
403
- };
404
- if (error instanceof Error) {
405
- entry.error = {
406
- name: error.name,
407
- message: error.message,
408
- stack: error.stack
409
- };
410
- } else if (error) {
411
- entry.error = error;
412
- }
413
- const logString = JSON.stringify(entry);
414
- switch (level) {
415
- case "error":
416
- console.error(logString);
417
- break;
418
- case "warn":
419
- console.warn(logString);
420
- break;
421
- case "debug":
422
- if (process.env.NODE_ENV === "development") console.debug(logString);
423
- break;
424
- default:
425
- console.log(logString);
426
- }
427
- }
428
- info(message, context) {
429
- this.log("info", message, context);
430
- }
431
- warn(message, context) {
432
- this.log("warn", message, context);
433
- }
434
- error(message, error, context) {
435
- this.log("error", message, context, error);
436
- }
437
- debug(message, context) {
438
- this.log("debug", message, context);
439
- }
440
- };
441
- var logger = new Logger();
442
- function shouldExcludeFromTabs(pathname) {
443
- const excludePatterns = [
444
- "/sign-in",
445
- "/sign-out",
446
- "/forgot-password",
447
- "/new-password",
448
- "/verify-email",
449
- "/register",
450
- "/unauthorized",
451
- "/not-found",
452
- "/maintenance",
453
- "/coming-soon"
454
- ];
455
- if (pathname.includes("/ui/") || pathname.includes("/colors") || pathname.includes("/typography"))
456
- return true;
457
- return excludePatterns.some((pattern) => pathname.includes(pattern));
458
- }
459
- function normalizePathname(pathname) {
460
- return pathname.replace(/^\/[a-z]{2}(\/|$)/, "/") || "/";
461
- }
462
- function formatSegmentLabel(segment) {
463
- return segment.replace(/[-_]+/g, " ").replace(/\b\w/g, (char) => char.toUpperCase());
464
- }
465
- function findRouteTitle(pathname, navigations) {
466
- const result = findRouteInfo(pathname, navigations);
467
- return result?.title || null;
468
- }
469
- function findRouteIcon(pathname, navigations) {
470
- const result = findRouteInfo(pathname, navigations);
471
- return result?.iconName || null;
472
- }
473
- function findRouteInfo(pathname, navigations) {
474
- const normalizedPath = normalizePathname(pathname);
475
- let exactMatch = null;
476
- const prefixMatches = [];
477
- function searchItems(items) {
478
- if (!items) return;
479
- for (const item of items) {
480
- if ("href" in item && item.href) {
481
- const itemPath = normalizePathname(item.href);
482
- if (normalizedPath === itemPath) {
483
- exactMatch = {
484
- title: item.title,
485
- iconName: "iconName" in item ? item.iconName : void 0
486
- };
487
- } else if (normalizedPath.startsWith(itemPath + "/")) {
488
- prefixMatches.push({
489
- itemPath,
490
- routeInfo: {
491
- title: item.title,
492
- iconName: "iconName" in item ? item.iconName : void 0
493
- }
494
- });
495
- }
496
- }
497
- if ("items" in item && item.items) searchItems(item.items);
498
- }
499
- }
500
- for (const nav of navigations) {
501
- searchItems(nav.items);
502
- if (exactMatch) return exactMatch;
503
- }
504
- if (prefixMatches.length > 0) {
505
- prefixMatches.sort((a, b) => b.itemPath.length - a.itemPath.length);
506
- return prefixMatches[0].routeInfo;
507
- }
508
- const segments = normalizedPath.split("/").filter(Boolean);
509
- return segments.length > 0 ? { title: formatSegmentLabel(segments[segments.length - 1]) } : { title: "Home" };
510
- }
511
-
512
- export { STATUS_ACTIVE, STATUS_COLORS, STATUS_INACTIVE, STATUS_OPTIONS, STATUS_VALUES, booleanToStatus, camelCaseToTitleCase, cn, debounce, deepClone, ensureLocalizedPathname, ensureRedirectPathname, ensureWithPrefix, ensureWithSuffix, ensureWithoutPrefix, ensureWithoutSuffix, findRouteIcon, findRouteTitle, formatCurrency, formatDate, formatDateShort, formatDateTime, formatDateWithTime, formatDistance, formatDuration, formatFileSize, formatFileType, formatNumber, formatNumberToCompact, formatOverviewCardValue, formatPercent, formatRelativeDate, formatTime, formatUnreadCount, generateId, getCreditCardBrandName, getDictionaryValue, getDiscountedPrice, getInitials, getLocaleFromPathname, isActivePathname, isBeforeToday, isEmpty, isEven, isNonNegative, isPathnameMissingLocale, isUrl, logger, normalizePathname, ratingToPercentage, readMoney, relocalizePathname, remToPx, shouldExcludeFromTabs, slugify, statusToBoolean, timeToDate, titleCaseToCamelCase, wait };
513
- //# sourceMappingURL=index.mjs.map
514
- //# sourceMappingURL=index.mjs.map