@fayz-ai/admin 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (557) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +44 -0
  3. package/dist/CommandPalette-2AL327XQ.js +258 -0
  4. package/dist/CommandPalette-2AL327XQ.js.map +1 -0
  5. package/dist/ImportWizard-CISHGNQC.js +3 -0
  6. package/dist/ImportWizard-CISHGNQC.js.map +1 -0
  7. package/dist/ScheduleEditor-BSFF7LME.js +1040 -0
  8. package/dist/ScheduleEditor-BSFF7LME.js.map +1 -0
  9. package/dist/SubscriptionPage-NLZAZO4P.js +7 -0
  10. package/dist/SubscriptionPage-NLZAZO4P.js.map +1 -0
  11. package/dist/access/context.d.ts +47 -0
  12. package/dist/access/context.d.ts.map +1 -0
  13. package/dist/access/headless.d.ts +21 -0
  14. package/dist/access/headless.d.ts.map +1 -0
  15. package/dist/access/index.d.ts +12 -0
  16. package/dist/access/index.d.ts.map +1 -0
  17. package/dist/access/limits-registry.d.ts +33 -0
  18. package/dist/access/limits-registry.d.ts.map +1 -0
  19. package/dist/access/module-nav.d.ts +15 -0
  20. package/dist/access/module-nav.d.ts.map +1 -0
  21. package/dist/access/resolver.d.ts +2 -0
  22. package/dist/access/resolver.d.ts.map +1 -0
  23. package/dist/access/types.d.ts +43 -0
  24. package/dist/access/types.d.ts.map +1 -0
  25. package/dist/access/upgrade-modal-store.d.ts +23 -0
  26. package/dist/access/upgrade-modal-store.d.ts.map +1 -0
  27. package/dist/app/AdminShell.d.ts +65 -0
  28. package/dist/app/AdminShell.d.ts.map +1 -0
  29. package/dist/app/LoginPage.d.ts +3 -0
  30. package/dist/app/LoginPage.d.ts.map +1 -0
  31. package/dist/app/admin-app.d.ts +23 -0
  32. package/dist/app/admin-app.d.ts.map +1 -0
  33. package/dist/app/config.d.ts +277 -0
  34. package/dist/app/config.d.ts.map +1 -0
  35. package/dist/app/core-entities.d.ts +25 -0
  36. package/dist/app/core-entities.d.ts.map +1 -0
  37. package/dist/app/derive-contract.d.ts +8 -0
  38. package/dist/app/derive-contract.d.ts.map +1 -0
  39. package/dist/app/nav-contributions.store.d.ts +17 -0
  40. package/dist/app/nav-contributions.store.d.ts.map +1 -0
  41. package/dist/app/routing.d.ts +10 -0
  42. package/dist/app/routing.d.ts.map +1 -0
  43. package/dist/app/scaffold.d.ts +17 -0
  44. package/dist/app/scaffold.d.ts.map +1 -0
  45. package/dist/billing/index.d.ts +5 -0
  46. package/dist/billing/index.d.ts.map +1 -0
  47. package/dist/billing/index.js +3 -0
  48. package/dist/billing/index.js.map +1 -0
  49. package/dist/billing/plan-badge.d.ts +17 -0
  50. package/dist/billing/plan-badge.d.ts.map +1 -0
  51. package/dist/billing/store.d.ts +40 -0
  52. package/dist/billing/store.d.ts.map +1 -0
  53. package/dist/chunk-5O2UJAQ7.js +534 -0
  54. package/dist/chunk-5O2UJAQ7.js.map +1 -0
  55. package/dist/chunk-PNAJODZM.js +315 -0
  56. package/dist/chunk-PNAJODZM.js.map +1 -0
  57. package/dist/chunk-RKXZ7RUG.js +20 -0
  58. package/dist/chunk-RKXZ7RUG.js.map +1 -0
  59. package/dist/chunk-TNTZHUL6.js +817 -0
  60. package/dist/chunk-TNTZHUL6.js.map +1 -0
  61. package/dist/chunk-UMRN6427.js +510 -0
  62. package/dist/chunk-UMRN6427.js.map +1 -0
  63. package/dist/chunk-VN5NTK26.js +36 -0
  64. package/dist/chunk-VN5NTK26.js.map +1 -0
  65. package/dist/chunk-VTEP2AQX.js +101 -0
  66. package/dist/chunk-VTEP2AQX.js.map +1 -0
  67. package/dist/chunk-YUHCC7JY.js +11 -0
  68. package/dist/chunk-YUHCC7JY.js.map +1 -0
  69. package/dist/components/RightRail.d.ts +8 -0
  70. package/dist/components/RightRail.d.ts.map +1 -0
  71. package/dist/components/auth/CenteredLogin.d.ts +13 -0
  72. package/dist/components/auth/CenteredLogin.d.ts.map +1 -0
  73. package/dist/components/auth/LoginForm.d.ts +12 -0
  74. package/dist/components/auth/LoginForm.d.ts.map +1 -0
  75. package/dist/components/auth/LoginPage.d.ts +15 -0
  76. package/dist/components/auth/LoginPage.d.ts.map +1 -0
  77. package/dist/components/auth/OAuthButtons.d.ts +10 -0
  78. package/dist/components/auth/OAuthButtons.d.ts.map +1 -0
  79. package/dist/components/auth/ProtectedRoute.d.ts +11 -0
  80. package/dist/components/auth/ProtectedRoute.d.ts.map +1 -0
  81. package/dist/components/auth/RecoveryForm.d.ts +9 -0
  82. package/dist/components/auth/RecoveryForm.d.ts.map +1 -0
  83. package/dist/components/auth/SignupForm.d.ts +10 -0
  84. package/dist/components/auth/SignupForm.d.ts.map +1 -0
  85. package/dist/components/auth/SplitLogin.d.ts +14 -0
  86. package/dist/components/auth/SplitLogin.d.ts.map +1 -0
  87. package/dist/components/auth/index.d.ts +7 -0
  88. package/dist/components/auth/index.d.ts.map +1 -0
  89. package/dist/components/billing/InvoiceList.d.ts +9 -0
  90. package/dist/components/billing/InvoiceList.d.ts.map +1 -0
  91. package/dist/components/billing/PlanSelector.d.ts +13 -0
  92. package/dist/components/billing/PlanSelector.d.ts.map +1 -0
  93. package/dist/components/billing/SoftLimitBanner.d.ts +5 -0
  94. package/dist/components/billing/SoftLimitBanner.d.ts.map +1 -0
  95. package/dist/components/billing/SubscriptionCard.d.ts +12 -0
  96. package/dist/components/billing/SubscriptionCard.d.ts.map +1 -0
  97. package/dist/components/billing/SubscriptionPage.d.ts +5 -0
  98. package/dist/components/billing/SubscriptionPage.d.ts.map +1 -0
  99. package/dist/components/billing/UpgradeModal.d.ts +3 -0
  100. package/dist/components/billing/UpgradeModal.d.ts.map +1 -0
  101. package/dist/components/billing/UpgradeOverlay.d.ts +15 -0
  102. package/dist/components/billing/UpgradeOverlay.d.ts.map +1 -0
  103. package/dist/components/billing/UpgradePrompt.d.ts +10 -0
  104. package/dist/components/billing/UpgradePrompt.d.ts.map +1 -0
  105. package/dist/components/billing/access-contract.d.ts +18 -0
  106. package/dist/components/billing/access-contract.d.ts.map +1 -0
  107. package/dist/components/billing/gates.d.ts +14 -0
  108. package/dist/components/billing/gates.d.ts.map +1 -0
  109. package/dist/components/billing/index.d.ts +15 -0
  110. package/dist/components/billing/index.d.ts.map +1 -0
  111. package/dist/components/billing/plan-feature.d.ts +11 -0
  112. package/dist/components/billing/plan-feature.d.ts.map +1 -0
  113. package/dist/components/chat/ChatAttachments.d.ts +23 -0
  114. package/dist/components/chat/ChatAttachments.d.ts.map +1 -0
  115. package/dist/components/chat/ChatComposer.d.ts +21 -0
  116. package/dist/components/chat/ChatComposer.d.ts.map +1 -0
  117. package/dist/components/chat/ChatConversation.d.ts +20 -0
  118. package/dist/components/chat/ChatConversation.d.ts.map +1 -0
  119. package/dist/components/chat/ChatFab.d.ts +17 -0
  120. package/dist/components/chat/ChatFab.d.ts.map +1 -0
  121. package/dist/components/chat/ChatHistory.d.ts +16 -0
  122. package/dist/components/chat/ChatHistory.d.ts.map +1 -0
  123. package/dist/components/chat/ChatMessages.d.ts +16 -0
  124. package/dist/components/chat/ChatMessages.d.ts.map +1 -0
  125. package/dist/components/chat/ChatSuggestions.d.ts +17 -0
  126. package/dist/components/chat/ChatSuggestions.d.ts.map +1 -0
  127. package/dist/components/chat/ConfirmActionCard.d.ts +19 -0
  128. package/dist/components/chat/ConfirmActionCard.d.ts.map +1 -0
  129. package/dist/components/chat/RecordChip.d.ts +12 -0
  130. package/dist/components/chat/RecordChip.d.ts.map +1 -0
  131. package/dist/components/chat/index.d.ts +4 -0
  132. package/dist/components/chat/index.d.ts.map +1 -0
  133. package/dist/components/chat/markdown.d.ts +5 -0
  134. package/dist/components/chat/markdown.d.ts.map +1 -0
  135. package/dist/components/connect/AddConnectorPanel.d.ts +32 -0
  136. package/dist/components/connect/AddConnectorPanel.d.ts.map +1 -0
  137. package/dist/components/connect/ConnectConsentPage.d.ts +12 -0
  138. package/dist/components/connect/ConnectConsentPage.d.ts.map +1 -0
  139. package/dist/components/connect/ConnectorDetail.d.ts +29 -0
  140. package/dist/components/connect/ConnectorDetail.d.ts.map +1 -0
  141. package/dist/components/connect/ConnectorMark.d.ts +20 -0
  142. package/dist/components/connect/ConnectorMark.d.ts.map +1 -0
  143. package/dist/components/connect/ConnectorRow.d.ts +33 -0
  144. package/dist/components/connect/ConnectorRow.d.ts.map +1 -0
  145. package/dist/components/connect/ConnectorsPanel.d.ts +40 -0
  146. package/dist/components/connect/ConnectorsPanel.d.ts.map +1 -0
  147. package/dist/components/connect/ConnectorsTab.d.ts +16 -0
  148. package/dist/components/connect/ConnectorsTab.d.ts.map +1 -0
  149. package/dist/components/connect/client-marks.d.ts +31 -0
  150. package/dist/components/connect/client-marks.d.ts.map +1 -0
  151. package/dist/components/connect/index.d.ts +12 -0
  152. package/dist/components/connect/index.d.ts.map +1 -0
  153. package/dist/components/connect/model.d.ts +151 -0
  154. package/dist/components/connect/model.d.ts.map +1 -0
  155. package/dist/components/connect/useConnectors.d.ts +24 -0
  156. package/dist/components/connect/useConnectors.d.ts.map +1 -0
  157. package/dist/components/layout/BottomNav.d.ts +24 -0
  158. package/dist/components/layout/BottomNav.d.ts.map +1 -0
  159. package/dist/components/layout/CommandPalette.d.ts +23 -0
  160. package/dist/components/layout/CommandPalette.d.ts.map +1 -0
  161. package/dist/components/layout/LocationSwitchOverlay.d.ts +3 -0
  162. package/dist/components/layout/LocationSwitchOverlay.d.ts.map +1 -0
  163. package/dist/components/layout/MockModeBanner.d.ts +3 -0
  164. package/dist/components/layout/MockModeBanner.d.ts.map +1 -0
  165. package/dist/components/layout/PrintChrome.d.ts +10 -0
  166. package/dist/components/layout/PrintChrome.d.ts.map +1 -0
  167. package/dist/components/layout/index.d.ts +6 -0
  168. package/dist/components/layout/index.d.ts.map +1 -0
  169. package/dist/components/notes/NotesPanel.d.ts +13 -0
  170. package/dist/components/notes/NotesPanel.d.ts.map +1 -0
  171. package/dist/components/notifications/ChangelogFeed.d.ts +8 -0
  172. package/dist/components/notifications/ChangelogFeed.d.ts.map +1 -0
  173. package/dist/components/notifications/NotificationBell.d.ts +9 -0
  174. package/dist/components/notifications/NotificationBell.d.ts.map +1 -0
  175. package/dist/components/notifications/NotificationInbox.d.ts +13 -0
  176. package/dist/components/notifications/NotificationInbox.d.ts.map +1 -0
  177. package/dist/components/notifications/ToastProvider.d.ts +2 -0
  178. package/dist/components/notifications/ToastProvider.d.ts.map +1 -0
  179. package/dist/components/notifications/index.d.ts +5 -0
  180. package/dist/components/notifications/index.d.ts.map +1 -0
  181. package/dist/components/organization/InviteMemberDialog.d.ts +10 -0
  182. package/dist/components/organization/InviteMemberDialog.d.ts.map +1 -0
  183. package/dist/components/organization/OrgInitializer.d.ts +7 -0
  184. package/dist/components/organization/OrgInitializer.d.ts.map +1 -0
  185. package/dist/components/organization/OrgSwitcher.d.ts +7 -0
  186. package/dist/components/organization/OrgSwitcher.d.ts.map +1 -0
  187. package/dist/components/organization/PermissionMatrixEditor.d.ts +22 -0
  188. package/dist/components/organization/PermissionMatrixEditor.d.ts.map +1 -0
  189. package/dist/components/organization/PermissionProfilesTab.d.ts +3 -0
  190. package/dist/components/organization/PermissionProfilesTab.d.ts.map +1 -0
  191. package/dist/components/organization/TeamTab.d.ts +3 -0
  192. package/dist/components/organization/TeamTab.d.ts.map +1 -0
  193. package/dist/components/organization/TenantOnboarding.d.ts +9 -0
  194. package/dist/components/organization/TenantOnboarding.d.ts.map +1 -0
  195. package/dist/components/organization/index.d.ts +7 -0
  196. package/dist/components/organization/index.d.ts.map +1 -0
  197. package/dist/components/plugins/ConnectorsHub.d.ts +5 -0
  198. package/dist/components/plugins/ConnectorsHub.d.ts.map +1 -0
  199. package/dist/components/plugins/PluginSettingsPanel.d.ts +28 -0
  200. package/dist/components/plugins/PluginSettingsPanel.d.ts.map +1 -0
  201. package/dist/components/right-rail.d.ts +58 -0
  202. package/dist/components/right-rail.d.ts.map +1 -0
  203. package/dist/components/settings/BrandingSettings.d.ts +12 -0
  204. package/dist/components/settings/BrandingSettings.d.ts.map +1 -0
  205. package/dist/components/settings/CompanySettings.d.ts +13 -0
  206. package/dist/components/settings/CompanySettings.d.ts.map +1 -0
  207. package/dist/components/settings/ConnectedBrandingSettings.d.ts +2 -0
  208. package/dist/components/settings/ConnectedBrandingSettings.d.ts.map +1 -0
  209. package/dist/components/settings/ConnectedCompanySettings.d.ts +2 -0
  210. package/dist/components/settings/ConnectedCompanySettings.d.ts.map +1 -0
  211. package/dist/components/settings/ConnectedFieldRulesSettings.d.ts +2 -0
  212. package/dist/components/settings/ConnectedFieldRulesSettings.d.ts.map +1 -0
  213. package/dist/components/settings/ConnectedSecuritySettings.d.ts +2 -0
  214. package/dist/components/settings/ConnectedSecuritySettings.d.ts.map +1 -0
  215. package/dist/components/settings/ConnectedUserProfile.d.ts +3 -0
  216. package/dist/components/settings/ConnectedUserProfile.d.ts.map +1 -0
  217. package/dist/components/settings/FieldRulesSettings.d.ts +11 -0
  218. package/dist/components/settings/FieldRulesSettings.d.ts.map +1 -0
  219. package/dist/components/settings/HolidaysSettings.d.ts +21 -0
  220. package/dist/components/settings/HolidaysSettings.d.ts.map +1 -0
  221. package/dist/components/settings/LocationsCrudPage.d.ts +6 -0
  222. package/dist/components/settings/LocationsCrudPage.d.ts.map +1 -0
  223. package/dist/components/settings/LocationsOverview.d.ts +19 -0
  224. package/dist/components/settings/LocationsOverview.d.ts.map +1 -0
  225. package/dist/components/settings/SecuritySettings.d.ts +17 -0
  226. package/dist/components/settings/SecuritySettings.d.ts.map +1 -0
  227. package/dist/components/settings/SettingsPage.d.ts +46 -0
  228. package/dist/components/settings/SettingsPage.d.ts.map +1 -0
  229. package/dist/components/settings/UserProfile.d.ts +12 -0
  230. package/dist/components/settings/UserProfile.d.ts.map +1 -0
  231. package/dist/components/settings/index.d.ts +11 -0
  232. package/dist/components/settings/index.d.ts.map +1 -0
  233. package/dist/components/shared/ContactPicker.d.ts +92 -0
  234. package/dist/components/shared/ContactPicker.d.ts.map +1 -0
  235. package/dist/components/shared/PersonLink.d.ts +29 -0
  236. package/dist/components/shared/PersonLink.d.ts.map +1 -0
  237. package/dist/components/shared/create-person.d.ts +20 -0
  238. package/dist/components/shared/create-person.d.ts.map +1 -0
  239. package/dist/crud/CrudCardGrid.d.ts +13 -0
  240. package/dist/crud/CrudCardGrid.d.ts.map +1 -0
  241. package/dist/crud/CrudDetailPage.d.ts +23 -0
  242. package/dist/crud/CrudDetailPage.d.ts.map +1 -0
  243. package/dist/crud/CrudFormPage.d.ts +18 -0
  244. package/dist/crud/CrudFormPage.d.ts.map +1 -0
  245. package/dist/crud/CrudListView.d.ts +92 -0
  246. package/dist/crud/CrudListView.d.ts.map +1 -0
  247. package/dist/crud/CrudPage.d.ts +27 -0
  248. package/dist/crud/CrudPage.d.ts.map +1 -0
  249. package/dist/crud/CrudSkeletons.d.ts +21 -0
  250. package/dist/crud/CrudSkeletons.d.ts.map +1 -0
  251. package/dist/crud/DeleteConfirmDialog.d.ts +11 -0
  252. package/dist/crud/DeleteConfirmDialog.d.ts.map +1 -0
  253. package/dist/crud/EntityOverview.d.ts +14 -0
  254. package/dist/crud/EntityOverview.d.ts.map +1 -0
  255. package/dist/crud/ImportWizard.d.ts +18 -0
  256. package/dist/crud/ImportWizard.d.ts.map +1 -0
  257. package/dist/crud/archetype-lookup.d.ts +30 -0
  258. package/dist/crud/archetype-lookup.d.ts.map +1 -0
  259. package/dist/crud/archetypes/ActiveToggle.d.ts +8 -0
  260. package/dist/crud/archetypes/ActiveToggle.d.ts.map +1 -0
  261. package/dist/crud/archetypes/AddressesTab.d.ts +21 -0
  262. package/dist/crud/archetypes/AddressesTab.d.ts.map +1 -0
  263. package/dist/crud/archetypes/ArchetypeStatusBar.d.ts +11 -0
  264. package/dist/crud/archetypes/ArchetypeStatusBar.d.ts.map +1 -0
  265. package/dist/crud/archetypes/BlockSettingsPopover.d.ts +15 -0
  266. package/dist/crud/archetypes/BlockSettingsPopover.d.ts.map +1 -0
  267. package/dist/crud/archetypes/ClientOrdersTab.d.ts +18 -0
  268. package/dist/crud/archetypes/ClientOrdersTab.d.ts.map +1 -0
  269. package/dist/crud/archetypes/EntityLink.d.ts +32 -0
  270. package/dist/crud/archetypes/EntityLink.d.ts.map +1 -0
  271. package/dist/crud/archetypes/LocationDetailTabs.d.ts +11 -0
  272. package/dist/crud/archetypes/LocationDetailTabs.d.ts.map +1 -0
  273. package/dist/crud/archetypes/LocationFormLayout.d.ts +12 -0
  274. package/dist/crud/archetypes/LocationFormLayout.d.ts.map +1 -0
  275. package/dist/crud/archetypes/OrderDetailView.d.ts +115 -0
  276. package/dist/crud/archetypes/OrderDetailView.d.ts.map +1 -0
  277. package/dist/crud/archetypes/OrderFormView.d.ts +112 -0
  278. package/dist/crud/archetypes/OrderFormView.d.ts.map +1 -0
  279. package/dist/crud/archetypes/OrderListView.d.ts +36 -0
  280. package/dist/crud/archetypes/OrderListView.d.ts.map +1 -0
  281. package/dist/crud/archetypes/PersonDetailTabs.d.ts +35 -0
  282. package/dist/crud/archetypes/PersonDetailTabs.d.ts.map +1 -0
  283. package/dist/crud/archetypes/PersonFormLayout.d.ts +13 -0
  284. package/dist/crud/archetypes/PersonFormLayout.d.ts.map +1 -0
  285. package/dist/crud/archetypes/PersonPicker.d.ts +23 -0
  286. package/dist/crud/archetypes/PersonPicker.d.ts.map +1 -0
  287. package/dist/crud/archetypes/ProductDetailTabs.d.ts +11 -0
  288. package/dist/crud/archetypes/ProductDetailTabs.d.ts.map +1 -0
  289. package/dist/crud/archetypes/ProductFormLayout.d.ts +12 -0
  290. package/dist/crud/archetypes/ProductFormLayout.d.ts.map +1 -0
  291. package/dist/crud/archetypes/ScheduleEditor.d.ts +7 -0
  292. package/dist/crud/archetypes/ScheduleEditor.d.ts.map +1 -0
  293. package/dist/crud/archetypes/ServiceDetailTabs.d.ts +10 -0
  294. package/dist/crud/archetypes/ServiceDetailTabs.d.ts.map +1 -0
  295. package/dist/crud/archetypes/ServiceFormLayout.d.ts +12 -0
  296. package/dist/crud/archetypes/ServiceFormLayout.d.ts.map +1 -0
  297. package/dist/crud/archetypes/SubjectDetailTabs.d.ts +12 -0
  298. package/dist/crud/archetypes/SubjectDetailTabs.d.ts.map +1 -0
  299. package/dist/crud/archetypes/SubjectFormLayout.d.ts +14 -0
  300. package/dist/crud/archetypes/SubjectFormLayout.d.ts.map +1 -0
  301. package/dist/crud/createCrudPage.d.ts +34 -0
  302. package/dist/crud/createCrudPage.d.ts.map +1 -0
  303. package/dist/crud/csv-export.d.ts +3 -0
  304. package/dist/crud/csv-export.d.ts.map +1 -0
  305. package/dist/crud/fieldToColumn.d.ts +14 -0
  306. package/dist/crud/fieldToColumn.d.ts.map +1 -0
  307. package/dist/crud/index.d.ts +16 -0
  308. package/dist/crud/index.d.ts.map +1 -0
  309. package/dist/crud/placeholder.d.ts +7 -0
  310. package/dist/crud/placeholder.d.ts.map +1 -0
  311. package/dist/crud/relation-field.d.ts +28 -0
  312. package/dist/crud/relation-field.d.ts.map +1 -0
  313. package/dist/data/client.d.ts +14 -0
  314. package/dist/data/client.d.ts.map +1 -0
  315. package/dist/db.cjs +14 -0
  316. package/dist/db.cjs.map +1 -0
  317. package/dist/db.d.ts +2 -0
  318. package/dist/db.d.ts.map +1 -0
  319. package/dist/db.js +3 -0
  320. package/dist/db.js.map +1 -0
  321. package/dist/hooks/index.d.ts +20 -0
  322. package/dist/hooks/index.d.ts.map +1 -0
  323. package/dist/hooks/useAITools.d.ts +23 -0
  324. package/dist/hooks/useAITools.d.ts.map +1 -0
  325. package/dist/hooks/useAgentSurface.d.ts +15 -0
  326. package/dist/hooks/useAgentSurface.d.ts.map +1 -0
  327. package/dist/hooks/useAuth.d.ts +16 -0
  328. package/dist/hooks/useAuth.d.ts.map +1 -0
  329. package/dist/hooks/useChat.d.ts +38 -0
  330. package/dist/hooks/useChat.d.ts.map +1 -0
  331. package/dist/hooks/useDictation.d.ts +31 -0
  332. package/dist/hooks/useDictation.d.ts.map +1 -0
  333. package/dist/hooks/useFieldRules.d.ts +6 -0
  334. package/dist/hooks/useFieldRules.d.ts.map +1 -0
  335. package/dist/hooks/useFormatters.d.ts +7 -0
  336. package/dist/hooks/useFormatters.d.ts.map +1 -0
  337. package/dist/hooks/useGlobalSearch.d.ts +10 -0
  338. package/dist/hooks/useGlobalSearch.d.ts.map +1 -0
  339. package/dist/hooks/useLayout.d.ts +16 -0
  340. package/dist/hooks/useLayout.d.ts.map +1 -0
  341. package/dist/hooks/useMicLevels.d.ts +10 -0
  342. package/dist/hooks/useMicLevels.d.ts.map +1 -0
  343. package/dist/hooks/useModuleNavigation.d.ts +27 -0
  344. package/dist/hooks/useModuleNavigation.d.ts.map +1 -0
  345. package/dist/hooks/useNotifications.d.ts +11 -0
  346. package/dist/hooks/useNotifications.d.ts.map +1 -0
  347. package/dist/hooks/usePluginPrefs.d.ts +23 -0
  348. package/dist/hooks/usePluginPrefs.d.ts.map +1 -0
  349. package/dist/hooks/usePlugins.d.ts +5 -0
  350. package/dist/hooks/usePlugins.d.ts.map +1 -0
  351. package/dist/hooks/useSystemPermission.d.ts +3 -0
  352. package/dist/hooks/useSystemPermission.d.ts.map +1 -0
  353. package/dist/hooks/useTenant.d.ts +23 -0
  354. package/dist/hooks/useTenant.d.ts.map +1 -0
  355. package/dist/hooks/useTenantPluginSettings.d.ts +12 -0
  356. package/dist/hooks/useTenantPluginSettings.d.ts.map +1 -0
  357. package/dist/hooks/useTenantPlugins.d.ts +10 -0
  358. package/dist/hooks/useTenantPlugins.d.ts.map +1 -0
  359. package/dist/hooks/useTranslation.d.ts +5 -0
  360. package/dist/hooks/useTranslation.d.ts.map +1 -0
  361. package/dist/index.d.ts +93 -0
  362. package/dist/index.d.ts.map +1 -0
  363. package/dist/index.js +17207 -0
  364. package/dist/index.js.map +1 -0
  365. package/dist/lib/agent-approvals.d.ts +27 -0
  366. package/dist/lib/agent-approvals.d.ts.map +1 -0
  367. package/dist/lib/agent-surface.d.ts +78 -0
  368. package/dist/lib/agent-surface.d.ts.map +1 -0
  369. package/dist/lib/ai-tool-handlers.d.ts +154 -0
  370. package/dist/lib/ai-tool-handlers.d.ts.map +1 -0
  371. package/dist/lib/apply-field-rules.d.ts +4 -0
  372. package/dist/lib/apply-field-rules.d.ts.map +1 -0
  373. package/dist/lib/assistant-delegation.d.ts +5 -0
  374. package/dist/lib/assistant-delegation.d.ts.map +1 -0
  375. package/dist/lib/assistant-feature.d.ts +8 -0
  376. package/dist/lib/assistant-feature.d.ts.map +1 -0
  377. package/dist/lib/attachments.d.ts +95 -0
  378. package/dist/lib/attachments.d.ts.map +1 -0
  379. package/dist/lib/auth-context.d.ts +5 -0
  380. package/dist/lib/auth-context.d.ts.map +1 -0
  381. package/dist/lib/cache.d.ts +18 -0
  382. package/dist/lib/cache.d.ts.map +1 -0
  383. package/dist/lib/cn.d.ts +2 -0
  384. package/dist/lib/cn.d.ts.map +1 -0
  385. package/dist/lib/core-ai-tools.d.ts +49 -0
  386. package/dist/lib/core-ai-tools.d.ts.map +1 -0
  387. package/dist/lib/create-client-orders-provider.d.ts +3 -0
  388. package/dist/lib/create-client-orders-provider.d.ts.map +1 -0
  389. package/dist/lib/csv.d.ts +14 -0
  390. package/dist/lib/csv.d.ts.map +1 -0
  391. package/dist/lib/currency.d.ts +7 -0
  392. package/dist/lib/currency.d.ts.map +1 -0
  393. package/dist/lib/dedup.d.ts +2 -0
  394. package/dist/lib/dedup.d.ts.map +1 -0
  395. package/dist/lib/entity-registry.d.ts +19 -0
  396. package/dist/lib/entity-registry.d.ts.map +1 -0
  397. package/dist/lib/entity-routes.d.ts +48 -0
  398. package/dist/lib/entity-routes.d.ts.map +1 -0
  399. package/dist/lib/fayz-agent.d.ts +23 -0
  400. package/dist/lib/fayz-agent.d.ts.map +1 -0
  401. package/dist/lib/format.d.ts +7 -0
  402. package/dist/lib/format.d.ts.map +1 -0
  403. package/dist/lib/locale-config.d.ts +8 -0
  404. package/dist/lib/locale-config.d.ts.map +1 -0
  405. package/dist/lib/notes-tasks-bridge.d.ts +28 -0
  406. package/dist/lib/notes-tasks-bridge.d.ts.map +1 -0
  407. package/dist/lib/org-context.d.ts +5 -0
  408. package/dist/lib/org-context.d.ts.map +1 -0
  409. package/dist/lib/plugins.d.ts +2 -0
  410. package/dist/lib/plugins.d.ts.map +1 -0
  411. package/dist/lib/record-refs.d.ts +31 -0
  412. package/dist/lib/record-refs.d.ts.map +1 -0
  413. package/dist/lib/router.d.ts +15 -0
  414. package/dist/lib/router.d.ts.map +1 -0
  415. package/dist/lib/schedule-config.d.ts +32 -0
  416. package/dist/lib/schedule-config.d.ts.map +1 -0
  417. package/dist/lib/schedule-service.d.ts +76 -0
  418. package/dist/lib/schedule-service.d.ts.map +1 -0
  419. package/dist/lib/search-targets.d.ts +12 -0
  420. package/dist/lib/search-targets.d.ts.map +1 -0
  421. package/dist/lib/speech.d.ts +36 -0
  422. package/dist/lib/speech.d.ts.map +1 -0
  423. package/dist/lib/supabase.d.ts +10 -0
  424. package/dist/lib/supabase.d.ts.map +1 -0
  425. package/dist/org/adapters/mock.d.ts +4 -0
  426. package/dist/org/adapters/mock.d.ts.map +1 -0
  427. package/dist/org/adapters/supabase.d.ts +33 -0
  428. package/dist/org/adapters/supabase.d.ts.map +1 -0
  429. package/dist/org/cache.d.ts +29 -0
  430. package/dist/org/cache.d.ts.map +1 -0
  431. package/dist/org/context.d.ts +36 -0
  432. package/dist/org/context.d.ts.map +1 -0
  433. package/dist/org/index.d.ts +10 -0
  434. package/dist/org/index.d.ts.map +1 -0
  435. package/dist/org/index.js +5 -0
  436. package/dist/org/index.js.map +1 -0
  437. package/dist/org/store.d.ts +20 -0
  438. package/dist/org/store.d.ts.map +1 -0
  439. package/dist/org/team-rows.d.ts +45 -0
  440. package/dist/org/team-rows.d.ts.map +1 -0
  441. package/dist/permissions/PermissionGate.d.ts +12 -0
  442. package/dist/permissions/PermissionGate.d.ts.map +1 -0
  443. package/dist/permissions/context.d.ts +39 -0
  444. package/dist/permissions/context.d.ts.map +1 -0
  445. package/dist/permissions/index.d.ts +5 -0
  446. package/dist/permissions/index.d.ts.map +1 -0
  447. package/dist/permissions/index.js +3 -0
  448. package/dist/permissions/index.js.map +1 -0
  449. package/dist/permissions/roles.d.ts +7 -0
  450. package/dist/permissions/roles.d.ts.map +1 -0
  451. package/dist/permissions/store.d.ts +21 -0
  452. package/dist/permissions/store.d.ts.map +1 -0
  453. package/dist/plugins/ModuleActionBar.d.ts +27 -0
  454. package/dist/plugins/ModuleActionBar.d.ts.map +1 -0
  455. package/dist/plugins/PluginRegistryManager.d.ts +13 -0
  456. package/dist/plugins/PluginRegistryManager.d.ts.map +1 -0
  457. package/dist/plugins/QuickActionsButton.d.ts +12 -0
  458. package/dist/plugins/QuickActionsButton.d.ts.map +1 -0
  459. package/dist/plugins/SettingsGroup.d.ts +25 -0
  460. package/dist/plugins/SettingsGroup.d.ts.map +1 -0
  461. package/dist/plugins/WidgetSlot.d.ts +8 -0
  462. package/dist/plugins/WidgetSlot.d.ts.map +1 -0
  463. package/dist/plugins/createPluginContext.d.ts +28 -0
  464. package/dist/plugins/createPluginContext.d.ts.map +1 -0
  465. package/dist/plugins/createViewRouter.d.ts +38 -0
  466. package/dist/plugins/createViewRouter.d.ts.map +1 -0
  467. package/dist/projects/ProjectsSettings.d.ts +3 -0
  468. package/dist/projects/ProjectsSettings.d.ts.map +1 -0
  469. package/dist/projects/SeuSiteWidget.d.ts +7 -0
  470. package/dist/projects/SeuSiteWidget.d.ts.map +1 -0
  471. package/dist/projects/provider.d.ts +8 -0
  472. package/dist/projects/provider.d.ts.map +1 -0
  473. package/dist/projects/store.d.ts +16 -0
  474. package/dist/projects/store.d.ts.map +1 -0
  475. package/dist/projects/types.d.ts +46 -0
  476. package/dist/projects/types.d.ts.map +1 -0
  477. package/dist/stores/auth.store.d.ts +12 -0
  478. package/dist/stores/auth.store.d.ts.map +1 -0
  479. package/dist/stores/billing.store.d.ts +2 -0
  480. package/dist/stores/billing.store.d.ts.map +1 -0
  481. package/dist/stores/chat.store.d.ts +208 -0
  482. package/dist/stores/chat.store.d.ts.map +1 -0
  483. package/dist/stores/createCrudStore.d.ts +54 -0
  484. package/dist/stores/createCrudStore.d.ts.map +1 -0
  485. package/dist/stores/index.d.ts +13 -0
  486. package/dist/stores/index.d.ts.map +1 -0
  487. package/dist/stores/invite.store.d.ts +11 -0
  488. package/dist/stores/invite.store.d.ts.map +1 -0
  489. package/dist/stores/layout.store.d.ts +2 -0
  490. package/dist/stores/layout.store.d.ts.map +1 -0
  491. package/dist/stores/locale.store.d.ts +17 -0
  492. package/dist/stores/locale.store.d.ts.map +1 -0
  493. package/dist/stores/location.store.d.ts +20 -0
  494. package/dist/stores/location.store.d.ts.map +1 -0
  495. package/dist/stores/notifications.store.d.ts +12 -0
  496. package/dist/stores/notifications.store.d.ts.map +1 -0
  497. package/dist/stores/organization.store.d.ts +2 -0
  498. package/dist/stores/organization.store.d.ts.map +1 -0
  499. package/dist/stores/permissions.store.d.ts +2 -0
  500. package/dist/stores/permissions.store.d.ts.map +1 -0
  501. package/dist/stores/plugin.store.d.ts +24 -0
  502. package/dist/stores/plugin.store.d.ts.map +1 -0
  503. package/dist/stores/tenant.store.d.ts +11 -0
  504. package/dist/stores/tenant.store.d.ts.map +1 -0
  505. package/dist/stores/theme.store.d.ts +17 -0
  506. package/dist/stores/theme.store.d.ts.map +1 -0
  507. package/dist/theme/dark.d.ts +3 -0
  508. package/dist/theme/dark.d.ts.map +1 -0
  509. package/dist/theme/index.d.ts +8 -0
  510. package/dist/theme/index.d.ts.map +1 -0
  511. package/dist/theme/light.d.ts +3 -0
  512. package/dist/theme/light.d.ts.map +1 -0
  513. package/dist/theme/tailwind-preset.d.ts +4 -0
  514. package/dist/theme/tailwind-preset.d.ts.map +1 -0
  515. package/dist/theme/tokens.d.ts +119 -0
  516. package/dist/theme/tokens.d.ts.map +1 -0
  517. package/dist/theme/utils.d.ts +31 -0
  518. package/dist/theme/utils.d.ts.map +1 -0
  519. package/dist/types/auth-adapter.d.ts +14 -0
  520. package/dist/types/auth-adapter.d.ts.map +1 -0
  521. package/dist/types/auth.d.ts +34 -0
  522. package/dist/types/auth.d.ts.map +1 -0
  523. package/dist/types/billing.d.ts +81 -0
  524. package/dist/types/billing.d.ts.map +1 -0
  525. package/dist/types/client-orders.d.ts +47 -0
  526. package/dist/types/client-orders.d.ts.map +1 -0
  527. package/dist/types/crud.d.ts +137 -0
  528. package/dist/types/crud.d.ts.map +1 -0
  529. package/dist/types/entities.d.ts +150 -0
  530. package/dist/types/entities.d.ts.map +1 -0
  531. package/dist/types/entity-lookup.d.ts +18 -0
  532. package/dist/types/entity-lookup.d.ts.map +1 -0
  533. package/dist/types/index.d.ts +17 -0
  534. package/dist/types/index.d.ts.map +1 -0
  535. package/dist/types/integrations.d.ts +48 -0
  536. package/dist/types/integrations.d.ts.map +1 -0
  537. package/dist/types/invite.d.ts +23 -0
  538. package/dist/types/invite.d.ts.map +1 -0
  539. package/dist/types/layout.d.ts +26 -0
  540. package/dist/types/layout.d.ts.map +1 -0
  541. package/dist/types/notifications.d.ts +31 -0
  542. package/dist/types/notifications.d.ts.map +1 -0
  543. package/dist/types/org-adapter.d.ts +92 -0
  544. package/dist/types/org-adapter.d.ts.map +1 -0
  545. package/dist/types/permissions.d.ts +39 -0
  546. package/dist/types/permissions.d.ts.map +1 -0
  547. package/dist/types/platform.d.ts +25 -0
  548. package/dist/types/platform.d.ts.map +1 -0
  549. package/dist/types/plugins.d.ts +269 -0
  550. package/dist/types/plugins.d.ts.map +1 -0
  551. package/dist/types/tenant.d.ts +74 -0
  552. package/dist/types/tenant.d.ts.map +1 -0
  553. package/dist/ui.d.ts +2 -0
  554. package/dist/ui.d.ts.map +1 -0
  555. package/dist/ui.js +3 -0
  556. package/dist/ui.js.map +1 -0
  557. package/package.json +94 -0
@@ -0,0 +1,510 @@
1
+ import React, { useState, useMemo, useCallback, useRef } from 'react';
2
+ import { Check, FileSpreadsheet, Download, ArrowRight, Upload, AlertCircle, ArrowLeft, ChevronDown, Loader2 } from 'lucide-react';
3
+ import { Modal, ModalContent, ModalHeader, ModalTitle, ModalBody, cn, Button } from '@fayz-ai/ui';
4
+ import { useTranslation } from '@fayz-ai/core';
5
+ import { jsx, jsxs } from 'react/jsx-runtime';
6
+
7
+ // src/crud/ImportWizard.tsx
8
+ function getImportableFields(entityDef) {
9
+ return entityDef.fields.filter(
10
+ (f) => f.showInForm !== false && f.key !== "id" && f.type !== "image"
11
+ );
12
+ }
13
+ function generateSampleCSV(fields) {
14
+ const headers = fields.map((f) => f.label);
15
+ const sampleRow = fields.map((f) => {
16
+ switch (f.type) {
17
+ case "email":
18
+ return "example@email.com";
19
+ case "phone":
20
+ return "+5511999999999";
21
+ case "number":
22
+ return "0";
23
+ case "currency":
24
+ return "0.00";
25
+ case "date":
26
+ return "2025-01-01";
27
+ case "datetime":
28
+ return "2025-01-01T09:00";
29
+ case "time":
30
+ return "09:00";
31
+ case "boolean":
32
+ return "true";
33
+ case "select": {
34
+ const opts = f.options ?? [];
35
+ const first = typeof opts[0] === "string" ? opts[0] : opts[0]?.value;
36
+ return first ?? "";
37
+ }
38
+ default:
39
+ return "";
40
+ }
41
+ });
42
+ return [headers.join(","), sampleRow.join(",")].join("\n");
43
+ }
44
+ function downloadCSV(content, filename) {
45
+ const bom = "\uFEFF";
46
+ const blob = new Blob([bom + content], { type: "text/csv;charset=utf-8;" });
47
+ const url = URL.createObjectURL(blob);
48
+ const a = document.createElement("a");
49
+ a.href = url;
50
+ a.download = filename;
51
+ a.click();
52
+ URL.revokeObjectURL(url);
53
+ }
54
+ function parseCSV(text) {
55
+ const lines = text.split(/\r?\n/).filter((l) => l.trim().length > 0);
56
+ if (lines.length === 0) return { headers: [], rows: [] };
57
+ const parse = (line) => {
58
+ const result = [];
59
+ let current = "";
60
+ let inQuotes = false;
61
+ for (let i = 0; i < line.length; i++) {
62
+ const ch = line[i];
63
+ if (ch === '"') {
64
+ if (inQuotes && line[i + 1] === '"') {
65
+ current += '"';
66
+ i++;
67
+ } else {
68
+ inQuotes = !inQuotes;
69
+ }
70
+ } else if (ch === "," && !inQuotes) {
71
+ result.push(current.trim());
72
+ current = "";
73
+ } else {
74
+ current += ch;
75
+ }
76
+ }
77
+ result.push(current.trim());
78
+ return result;
79
+ };
80
+ const headers = parse(lines[0]);
81
+ const rows = lines.slice(1).map(parse);
82
+ return { headers, rows };
83
+ }
84
+ function coerceValue(value, field) {
85
+ const trimmed = value.trim();
86
+ if (trimmed === "") return null;
87
+ switch (field.type) {
88
+ case "number":
89
+ case "currency": {
90
+ const num = Number(trimmed.replace(",", "."));
91
+ return isNaN(num) ? null : num;
92
+ }
93
+ case "boolean":
94
+ return ["true", "1", "yes", "sim", "verdadeiro"].includes(trimmed.toLowerCase());
95
+ default:
96
+ return trimmed;
97
+ }
98
+ }
99
+ var STEPS = ["download", "upload", "mapping", "importing"];
100
+ function StepIndicator({ current }) {
101
+ const t = useTranslation();
102
+ const labels = {
103
+ download: t("crud.import.step.download"),
104
+ upload: t("crud.import.step.upload"),
105
+ mapping: t("crud.import.step.mapping"),
106
+ importing: t("crud.import.step.importing"),
107
+ done: ""
108
+ };
109
+ const currentIdx = STEPS.indexOf(current === "done" ? "importing" : current);
110
+ return /* @__PURE__ */ jsx("div", { className: "flex items-center gap-1.5", children: STEPS.map((step, i) => {
111
+ const isDone = i < currentIdx || current === "done";
112
+ const isActive = step === current;
113
+ return /* @__PURE__ */ jsxs(React.Fragment, { children: [
114
+ i > 0 && /* @__PURE__ */ jsx("div", { className: cn("h-px w-6", isDone ? "bg-primary" : "bg-border") }),
115
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1.5", children: [
116
+ /* @__PURE__ */ jsx(
117
+ "div",
118
+ {
119
+ className: cn(
120
+ "flex h-6 w-6 items-center justify-center rounded-full text-xs font-medium",
121
+ isDone ? "bg-primary text-primary-foreground" : isActive ? "border-2 border-primary text-primary" : "border-2 border-muted-foreground/30 text-muted-foreground"
122
+ ),
123
+ children: isDone ? /* @__PURE__ */ jsx(Check, { className: "h-3 w-3" }) : i + 1
124
+ }
125
+ ),
126
+ /* @__PURE__ */ jsx("span", { className: cn("text-xs hidden sm:inline", isActive ? "text-foreground font-medium" : "text-muted-foreground"), children: labels[step] })
127
+ ] })
128
+ ] }, step);
129
+ }) });
130
+ }
131
+ function DownloadStep({
132
+ entityDef,
133
+ fields,
134
+ onNext
135
+ }) {
136
+ const t = useTranslation();
137
+ const namePlural = entityDef.namePlural ?? entityDef.name + "s";
138
+ const handleDownload = () => {
139
+ const csv = generateSampleCSV(fields);
140
+ downloadCSV(csv, `${namePlural.toLowerCase().replace(/\s+/g, "-")}-template.csv`);
141
+ };
142
+ return /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-center text-center gap-6 py-4", children: [
143
+ /* @__PURE__ */ jsx("div", { className: "h-16 w-16 rounded-2xl bg-primary/10 flex items-center justify-center", children: /* @__PURE__ */ jsx(FileSpreadsheet, { className: "h-8 w-8 text-primary" }) }),
144
+ /* @__PURE__ */ jsxs("div", { className: "space-y-2 max-w-sm", children: [
145
+ /* @__PURE__ */ jsx("h3", { className: "text-base font-semibold", children: t("crud.import.downloadTitle") }),
146
+ /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground", children: t("crud.import.downloadDescription", { entity: namePlural.toLowerCase() }) })
147
+ ] }),
148
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-3 w-full max-w-xs", children: [
149
+ /* @__PURE__ */ jsxs(Button, { variant: "outline", onClick: handleDownload, className: "w-full", children: [
150
+ /* @__PURE__ */ jsx(Download, { className: "h-4 w-4 mr-2" }),
151
+ t("crud.import.downloadTemplate")
152
+ ] }),
153
+ /* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground", children: t("crud.import.downloadHint", { count: String(fields.length) }) })
154
+ ] }),
155
+ /* @__PURE__ */ jsxs(Button, { onClick: onNext, className: "mt-2", children: [
156
+ t("crud.import.alreadyHaveFile"),
157
+ /* @__PURE__ */ jsx(ArrowRight, { className: "h-4 w-4 ml-2" })
158
+ ] })
159
+ ] });
160
+ }
161
+ function UploadStep({
162
+ onParsed,
163
+ onBack
164
+ }) {
165
+ const t = useTranslation();
166
+ const inputRef = useRef(null);
167
+ const [dragOver, setDragOver] = useState(false);
168
+ const [error, setError] = useState(null);
169
+ const processFile = (file) => {
170
+ setError(null);
171
+ if (!file.name.endsWith(".csv")) {
172
+ setError(t("crud.import.invalidFile"));
173
+ return;
174
+ }
175
+ const reader = new FileReader();
176
+ reader.onload = (e) => {
177
+ const text = e.target?.result;
178
+ const parsed = parseCSV(text);
179
+ if (parsed.headers.length === 0) {
180
+ setError(t("crud.import.emptyFile"));
181
+ return;
182
+ }
183
+ if (parsed.rows.length === 0) {
184
+ setError(t("crud.import.noRows"));
185
+ return;
186
+ }
187
+ onParsed(parsed, file.name);
188
+ };
189
+ reader.readAsText(file);
190
+ };
191
+ const handleDrop = (e) => {
192
+ e.preventDefault();
193
+ setDragOver(false);
194
+ const file = e.dataTransfer.files[0];
195
+ if (file) processFile(file);
196
+ };
197
+ return /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-center gap-6 py-4", children: [
198
+ /* @__PURE__ */ jsxs(
199
+ "div",
200
+ {
201
+ onDragOver: (e) => {
202
+ e.preventDefault();
203
+ setDragOver(true);
204
+ },
205
+ onDragLeave: () => setDragOver(false),
206
+ onDrop: handleDrop,
207
+ onClick: () => inputRef.current?.click(),
208
+ className: cn(
209
+ "flex flex-col items-center justify-center gap-3 w-full max-w-sm rounded-xl border-2 border-dashed p-8 cursor-pointer transition-colors",
210
+ dragOver ? "border-primary bg-primary/5" : "border-muted-foreground/25 hover:border-muted-foreground/50"
211
+ ),
212
+ children: [
213
+ /* @__PURE__ */ jsx(Upload, { className: "h-8 w-8 text-muted-foreground" }),
214
+ /* @__PURE__ */ jsxs("div", { className: "text-center", children: [
215
+ /* @__PURE__ */ jsx("p", { className: "text-sm font-medium", children: t("crud.import.uploadTitle") }),
216
+ /* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground mt-1", children: t("crud.import.uploadHint") })
217
+ ] }),
218
+ /* @__PURE__ */ jsx(
219
+ "input",
220
+ {
221
+ ref: inputRef,
222
+ type: "file",
223
+ accept: ".csv",
224
+ className: "hidden",
225
+ onChange: (e) => {
226
+ const file = e.target.files?.[0];
227
+ if (file) processFile(file);
228
+ }
229
+ }
230
+ )
231
+ ]
232
+ }
233
+ ),
234
+ error && /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 text-sm text-destructive", children: [
235
+ /* @__PURE__ */ jsx(AlertCircle, { className: "h-4 w-4 shrink-0" }),
236
+ error
237
+ ] }),
238
+ /* @__PURE__ */ jsxs(Button, { variant: "ghost", onClick: onBack, children: [
239
+ /* @__PURE__ */ jsx(ArrowLeft, { className: "h-4 w-4 mr-2" }),
240
+ t("common.back")
241
+ ] })
242
+ ] });
243
+ }
244
+ function MappingStep({
245
+ csv,
246
+ fileName,
247
+ fields,
248
+ onConfirm,
249
+ onBack
250
+ }) {
251
+ const t = useTranslation();
252
+ const initialMapping = useMemo(() => {
253
+ const map = /* @__PURE__ */ new Map();
254
+ for (let i = 0; i < csv.headers.length; i++) {
255
+ const header = csv.headers[i].toLowerCase().trim();
256
+ const match = fields.find(
257
+ (f) => f.label.toLowerCase() === header || f.key.toLowerCase() === header
258
+ );
259
+ map.set(i, match ?? null);
260
+ }
261
+ return map;
262
+ }, [csv.headers, fields]);
263
+ const [mapping, setMapping] = useState(initialMapping);
264
+ const mappedCount = Array.from(mapping.values()).filter(Boolean).length;
265
+ const previewRows = csv.rows.slice(0, 3);
266
+ const handleSelect = (colIdx, fieldKey) => {
267
+ setMapping((prev) => {
268
+ const next = new Map(prev);
269
+ if (fieldKey === "__ignore__") {
270
+ next.set(colIdx, null);
271
+ } else {
272
+ const field = fields.find((f) => f.key === fieldKey) ?? null;
273
+ for (const [idx, f] of next) {
274
+ if (f?.key === fieldKey) next.set(idx, null);
275
+ }
276
+ next.set(colIdx, field);
277
+ }
278
+ return next;
279
+ });
280
+ };
281
+ const handleConfirm = () => {
282
+ const validMapping = /* @__PURE__ */ new Map();
283
+ for (const [idx, field] of mapping) {
284
+ if (field) validMapping.set(idx, field);
285
+ }
286
+ onConfirm(validMapping);
287
+ };
288
+ return /* @__PURE__ */ jsxs("div", { className: "space-y-4", children: [
289
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between", children: [
290
+ /* @__PURE__ */ jsxs("div", { children: [
291
+ /* @__PURE__ */ jsx("p", { className: "text-sm font-medium", children: t("crud.import.mappingTitle") }),
292
+ /* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground mt-0.5", children: t("crud.import.mappingDescription", {
293
+ file: fileName,
294
+ columns: String(csv.headers.length),
295
+ rows: String(csv.rows.length)
296
+ }) })
297
+ ] }),
298
+ /* @__PURE__ */ jsx("span", { className: "text-xs text-muted-foreground tabular-nums", children: t("crud.import.mappedCount", { count: String(mappedCount), total: String(csv.headers.length) }) })
299
+ ] }),
300
+ /* @__PURE__ */ jsx("div", { className: "overflow-x-auto border rounded-lg", children: /* @__PURE__ */ jsxs("table", { className: "w-full text-sm", children: [
301
+ /* @__PURE__ */ jsx("thead", { children: /* @__PURE__ */ jsxs("tr", { className: "border-b bg-muted/50", children: [
302
+ /* @__PURE__ */ jsx("th", { className: "text-left font-medium text-muted-foreground py-2.5 px-3 w-[35%]", children: t("crud.import.csvColumn") }),
303
+ /* @__PURE__ */ jsx("th", { className: "text-center w-[10%] px-2", children: /* @__PURE__ */ jsx(ArrowRight, { className: "h-3.5 w-3.5 mx-auto text-muted-foreground" }) }),
304
+ /* @__PURE__ */ jsx("th", { className: "text-left font-medium text-muted-foreground py-2.5 px-3 w-[35%]", children: t("crud.import.mapsTo") }),
305
+ /* @__PURE__ */ jsx("th", { className: "text-left font-medium text-muted-foreground py-2.5 px-3 w-[20%]", children: t("crud.import.preview") })
306
+ ] }) }),
307
+ /* @__PURE__ */ jsx("tbody", { children: csv.headers.map((header, idx) => {
308
+ const mapped = mapping.get(idx);
309
+ return /* @__PURE__ */ jsxs("tr", { className: "border-b last:border-0", children: [
310
+ /* @__PURE__ */ jsx("td", { className: "py-2 px-3", children: /* @__PURE__ */ jsx("span", { className: "font-mono text-xs bg-muted px-1.5 py-0.5 rounded", children: header }) }),
311
+ /* @__PURE__ */ jsx("td", { className: "text-center px-2", children: /* @__PURE__ */ jsx(ArrowRight, { className: "h-3 w-3 mx-auto text-muted-foreground/50" }) }),
312
+ /* @__PURE__ */ jsx("td", { className: "py-2 px-3", children: /* @__PURE__ */ jsxs("div", { className: "relative", children: [
313
+ /* @__PURE__ */ jsxs(
314
+ "select",
315
+ {
316
+ value: mapped?.key ?? "__ignore__",
317
+ onChange: (e) => handleSelect(idx, e.target.value),
318
+ className: cn(
319
+ "w-full appearance-none rounded-md border bg-background px-2.5 py-1.5 pr-8 text-sm",
320
+ "focus:outline-none focus:ring-2 focus:ring-ring",
321
+ mapped ? "text-foreground" : "text-muted-foreground"
322
+ ),
323
+ children: [
324
+ /* @__PURE__ */ jsx("option", { value: "__ignore__", children: t("crud.import.skip") }),
325
+ fields.map((f) => /* @__PURE__ */ jsx("option", { value: f.key, children: f.label }, f.key))
326
+ ]
327
+ }
328
+ ),
329
+ /* @__PURE__ */ jsx(ChevronDown, { className: "absolute right-2 top-1/2 -translate-y-1/2 h-3.5 w-3.5 text-muted-foreground pointer-events-none" })
330
+ ] }) }),
331
+ /* @__PURE__ */ jsx("td", { className: "py-2 px-3", children: /* @__PURE__ */ jsx("span", { className: "text-xs text-muted-foreground truncate block max-w-[140px]", children: previewRows[0]?.[idx] ?? "\u2014" }) })
332
+ ] }, idx);
333
+ }) })
334
+ ] }) }),
335
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between pt-2", children: [
336
+ /* @__PURE__ */ jsxs(Button, { variant: "ghost", onClick: onBack, children: [
337
+ /* @__PURE__ */ jsx(ArrowLeft, { className: "h-4 w-4 mr-2" }),
338
+ t("common.back")
339
+ ] }),
340
+ /* @__PURE__ */ jsxs(Button, { onClick: handleConfirm, disabled: mappedCount === 0, children: [
341
+ t("crud.import.startImport"),
342
+ /* @__PURE__ */ jsx(ArrowRight, { className: "h-4 w-4 ml-2" })
343
+ ] })
344
+ ] })
345
+ ] });
346
+ }
347
+ function ImportingStep({
348
+ result,
349
+ progress,
350
+ totalRows,
351
+ onClose
352
+ }) {
353
+ const t = useTranslation();
354
+ if (!result) {
355
+ const processed = progress?.processed ?? 0;
356
+ const total = progress?.total ?? totalRows;
357
+ const percent = total > 0 ? Math.round(processed / total * 100) : 0;
358
+ return /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-center gap-6 py-8", children: [
359
+ /* @__PURE__ */ jsx("div", { className: "relative h-16 w-16 flex items-center justify-center", children: /* @__PURE__ */ jsx(Loader2, { className: "h-10 w-10 animate-spin text-primary" }) }),
360
+ /* @__PURE__ */ jsxs("div", { className: "text-center space-y-1", children: [
361
+ /* @__PURE__ */ jsx("p", { className: "text-sm font-medium", children: t("crud.import.importing") }),
362
+ /* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground", children: t("crud.import.progressCount", { processed: String(processed), total: String(total) }) })
363
+ ] }),
364
+ /* @__PURE__ */ jsxs("div", { className: "w-full max-w-xs space-y-2", children: [
365
+ /* @__PURE__ */ jsx("div", { className: "h-2 w-full rounded-full bg-muted overflow-hidden", children: /* @__PURE__ */ jsx(
366
+ "div",
367
+ {
368
+ className: "h-full rounded-full bg-primary transition-all duration-500 ease-out",
369
+ style: { width: `${percent}%` }
370
+ }
371
+ ) }),
372
+ /* @__PURE__ */ jsxs("p", { className: "text-xs text-muted-foreground text-center tabular-nums", children: [
373
+ percent,
374
+ "%"
375
+ ] })
376
+ ] })
377
+ ] });
378
+ }
379
+ const hasErrors = result.errors.length > 0;
380
+ return /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-center gap-5 py-4", children: [
381
+ /* @__PURE__ */ jsx("div", { className: cn(
382
+ "h-16 w-16 rounded-2xl flex items-center justify-center",
383
+ hasErrors ? "bg-warning/10" : "bg-success/10"
384
+ ), children: hasErrors ? /* @__PURE__ */ jsx(AlertCircle, { className: "h-8 w-8 text-warning" }) : /* @__PURE__ */ jsx(Check, { className: "h-8 w-8 text-success" }) }),
385
+ /* @__PURE__ */ jsxs("div", { className: "text-center space-y-1", children: [
386
+ /* @__PURE__ */ jsx("h3", { className: "text-base font-semibold", children: hasErrors ? t("crud.import.doneWithErrors") : t("crud.import.doneSuccess") }),
387
+ /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground", children: t("crud.import.doneCount", {
388
+ success: String(result.success),
389
+ total: String(totalRows)
390
+ }) })
391
+ ] }),
392
+ /* @__PURE__ */ jsx("div", { className: "w-full max-w-xs", children: /* @__PURE__ */ jsx("div", { className: "h-2 w-full rounded-full bg-muted overflow-hidden", children: /* @__PURE__ */ jsx(
393
+ "div",
394
+ {
395
+ className: cn(
396
+ "h-full rounded-full transition-all duration-300",
397
+ hasErrors ? "bg-warning" : "bg-success"
398
+ ),
399
+ style: { width: "100%" }
400
+ }
401
+ ) }) }),
402
+ hasErrors && /* @__PURE__ */ jsx("div", { className: "w-full max-w-sm max-h-40 overflow-y-auto rounded-lg border", children: /* @__PURE__ */ jsxs("div", { className: "divide-y", children: [
403
+ result.errors.slice(0, 20).map((err, i) => /* @__PURE__ */ jsxs("div", { className: "flex items-start gap-2 px-3 py-2 text-xs", children: [
404
+ /* @__PURE__ */ jsx("span", { className: "text-muted-foreground shrink-0 tabular-nums", children: t("crud.import.rowNumber", { row: String(err.row) }) }),
405
+ /* @__PURE__ */ jsx("span", { className: "text-destructive", children: err.message })
406
+ ] }, i)),
407
+ result.errors.length > 20 && /* @__PURE__ */ jsxs("div", { className: "px-3 py-2 text-xs text-muted-foreground text-center", children: [
408
+ "+",
409
+ result.errors.length - 20,
410
+ " more"
411
+ ] })
412
+ ] }) }),
413
+ /* @__PURE__ */ jsx(Button, { onClick: onClose, children: t("common.done") })
414
+ ] });
415
+ }
416
+ function ImportWizard({ open, onClose, entityDef, onImport }) {
417
+ const t = useTranslation();
418
+ const [step, setStep] = useState("download");
419
+ const [csv, setCsv] = useState(null);
420
+ const [fileName, setFileName] = useState("");
421
+ const [result, setResult] = useState(null);
422
+ const [progress, setProgress] = useState(null);
423
+ const fields = useMemo(() => getImportableFields(entityDef), [entityDef]);
424
+ const handleClose = () => {
425
+ setStep("download");
426
+ setCsv(null);
427
+ setFileName("");
428
+ setResult(null);
429
+ setProgress(null);
430
+ onClose();
431
+ };
432
+ const handleParsed = (parsed, name) => {
433
+ setCsv(parsed);
434
+ setFileName(name);
435
+ setStep("mapping");
436
+ };
437
+ const handleConfirmMapping = useCallback(async (mapping) => {
438
+ if (!csv) return;
439
+ setStep("importing");
440
+ setResult(null);
441
+ setProgress(null);
442
+ const rows = csv.rows.map((row) => {
443
+ const record = {};
444
+ for (const [colIdx, field] of mapping) {
445
+ const rawValue = row[colIdx] ?? "";
446
+ record[field.key] = coerceValue(rawValue, field);
447
+ }
448
+ return record;
449
+ });
450
+ try {
451
+ const res = await onImport(rows, (processed, total) => {
452
+ setProgress({ processed, total });
453
+ });
454
+ setResult(res);
455
+ setStep("done");
456
+ } catch (err) {
457
+ setResult({ success: 0, errors: [{ row: 0, message: err?.message ?? "Import failed" }] });
458
+ setStep("done");
459
+ }
460
+ }, [csv, onImport]);
461
+ const namePlural = entityDef.namePlural ?? entityDef.name + "s";
462
+ return /* @__PURE__ */ jsx(Modal, { open, onOpenChange: (o) => {
463
+ if (!o) handleClose();
464
+ }, children: /* @__PURE__ */ jsxs(ModalContent, { size: "xl", children: [
465
+ /* @__PURE__ */ jsxs(ModalHeader, { children: [
466
+ /* @__PURE__ */ jsx(ModalTitle, { children: t("crud.import.title", { entity: namePlural }) }),
467
+ /* @__PURE__ */ jsx("div", { className: "pt-2", children: /* @__PURE__ */ jsx(StepIndicator, { current: step }) })
468
+ ] }),
469
+ /* @__PURE__ */ jsxs(ModalBody, { children: [
470
+ step === "download" && /* @__PURE__ */ jsx(
471
+ DownloadStep,
472
+ {
473
+ entityDef,
474
+ fields,
475
+ onNext: () => setStep("upload")
476
+ }
477
+ ),
478
+ step === "upload" && /* @__PURE__ */ jsx(
479
+ UploadStep,
480
+ {
481
+ onParsed: handleParsed,
482
+ onBack: () => setStep("download")
483
+ }
484
+ ),
485
+ step === "mapping" && csv && /* @__PURE__ */ jsx(
486
+ MappingStep,
487
+ {
488
+ csv,
489
+ fileName,
490
+ fields,
491
+ onConfirm: handleConfirmMapping,
492
+ onBack: () => setStep("upload")
493
+ }
494
+ ),
495
+ (step === "importing" || step === "done") && /* @__PURE__ */ jsx(
496
+ ImportingStep,
497
+ {
498
+ result,
499
+ progress,
500
+ totalRows: csv?.rows.length ?? 0,
501
+ onClose: handleClose
502
+ }
503
+ )
504
+ ] })
505
+ ] }) });
506
+ }
507
+
508
+ export { ImportWizard };
509
+ //# sourceMappingURL=chunk-UMRN6427.js.map
510
+ //# sourceMappingURL=chunk-UMRN6427.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/crud/ImportWizard.tsx"],"names":[],"mappings":"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","file":"chunk-UMRN6427.js","sourcesContent":["import React, { useState, useRef, useMemo, useCallback } from 'react'\nimport {\n Download, Upload, ArrowRight, ArrowLeft, Check, AlertCircle,\n Loader2, FileSpreadsheet, X, ChevronDown,\n} from 'lucide-react'\nimport {\n Modal, ModalContent, ModalHeader, ModalBody,\n ModalTitle,\n} from '@fayz-ai/ui'\nimport { Button } from '@fayz-ai/ui'\nimport { cn } from '@fayz-ai/ui'\nimport { useTranslation } from '@fayz-ai/core'\nimport type { FieldDef, EntityDef } from '@fayz-ai/core'\n\ntype ImportStep = 'download' | 'upload' | 'mapping' | 'importing' | 'done'\n\ninterface ImportWizardProps {\n open: boolean\n onClose: () => void\n entityDef: EntityDef\n onImport: (\n rows: Record<string, any>[],\n onProgress: (processed: number, total: number) => void,\n ) => Promise<{ success: number; errors: ImportRowError[] }>\n}\n\nexport interface ImportRowError {\n row: number\n message: string\n}\n\ninterface ParsedCSV {\n headers: string[]\n rows: string[][]\n}\n\n// ---------------------------------------------------------------------------\n// CSV utilities\n// ---------------------------------------------------------------------------\n\nfunction getImportableFields(entityDef: EntityDef): FieldDef[] {\n return entityDef.fields.filter(\n (f) => f.showInForm !== false && f.key !== 'id' && f.type !== 'image',\n )\n}\n\nfunction generateSampleCSV(fields: FieldDef[]): string {\n const headers = fields.map((f) => f.label)\n const sampleRow = fields.map((f) => {\n switch (f.type) {\n case 'email': return 'example@email.com'\n case 'phone': return '+5511999999999'\n case 'number': return '0'\n case 'currency': return '0.00'\n case 'date': return '2025-01-01'\n case 'datetime': return '2025-01-01T09:00'\n case 'time': return '09:00'\n case 'boolean': return 'true'\n case 'select': {\n const opts = f.options ?? []\n const first = typeof opts[0] === 'string' ? opts[0] : opts[0]?.value\n return first ?? ''\n }\n default: return ''\n }\n })\n return [headers.join(','), sampleRow.join(',')].join('\\n')\n}\n\nfunction downloadCSV(content: string, filename: string) {\n const bom = '\\uFEFF'\n const blob = new Blob([bom + content], { type: 'text/csv;charset=utf-8;' })\n const url = URL.createObjectURL(blob)\n const a = document.createElement('a')\n a.href = url\n a.download = filename\n a.click()\n URL.revokeObjectURL(url)\n}\n\nfunction parseCSV(text: string): ParsedCSV {\n const lines = text.split(/\\r?\\n/).filter((l) => l.trim().length > 0)\n if (lines.length === 0) return { headers: [], rows: [] }\n\n const parse = (line: string): string[] => {\n const result: string[] = []\n let current = ''\n let inQuotes = false\n for (let i = 0; i < line.length; i++) {\n const ch = line[i]\n if (ch === '\"') {\n if (inQuotes && line[i + 1] === '\"') {\n current += '\"'\n i++\n } else {\n inQuotes = !inQuotes\n }\n } else if (ch === ',' && !inQuotes) {\n result.push(current.trim())\n current = ''\n } else {\n current += ch\n }\n }\n result.push(current.trim())\n return result\n }\n\n const headers = parse(lines[0])\n const rows = lines.slice(1).map(parse)\n return { headers, rows }\n}\n\nfunction coerceValue(value: string, field: FieldDef): any {\n const trimmed = value.trim()\n if (trimmed === '') return null\n switch (field.type) {\n case 'number':\n case 'currency': {\n const num = Number(trimmed.replace(',', '.'))\n return isNaN(num) ? null : num\n }\n case 'boolean':\n return ['true', '1', 'yes', 'sim', 'verdadeiro'].includes(trimmed.toLowerCase())\n default:\n return trimmed\n }\n}\n\n// ---------------------------------------------------------------------------\n// Step indicator\n// ---------------------------------------------------------------------------\n\nconst STEPS: ImportStep[] = ['download', 'upload', 'mapping', 'importing']\n\nfunction StepIndicator({ current }: { current: ImportStep }) {\n const t = useTranslation()\n const labels: Record<ImportStep, string> = {\n download: t('crud.import.step.download'),\n upload: t('crud.import.step.upload'),\n mapping: t('crud.import.step.mapping'),\n importing: t('crud.import.step.importing'),\n done: '',\n }\n const currentIdx = STEPS.indexOf(current === 'done' ? 'importing' : current)\n\n return (\n <div className=\"flex items-center gap-1.5\">\n {STEPS.map((step, i) => {\n const isDone = i < currentIdx || current === 'done'\n const isActive = step === current\n return (\n <React.Fragment key={step}>\n {i > 0 && <div className={cn('h-px w-6', isDone ? 'bg-primary' : 'bg-border')} />}\n <div className=\"flex items-center gap-1.5\">\n <div\n className={cn(\n 'flex h-6 w-6 items-center justify-center rounded-full text-xs font-medium',\n isDone\n ? 'bg-primary text-primary-foreground'\n : isActive\n ? 'border-2 border-primary text-primary'\n : 'border-2 border-muted-foreground/30 text-muted-foreground',\n )}\n >\n {isDone ? <Check className=\"h-3 w-3\" /> : i + 1}\n </div>\n <span className={cn('text-xs hidden sm:inline', isActive ? 'text-foreground font-medium' : 'text-muted-foreground')}>\n {labels[step]}\n </span>\n </div>\n </React.Fragment>\n )\n })}\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Step 1: Download sample\n// ---------------------------------------------------------------------------\n\nfunction DownloadStep({\n entityDef,\n fields,\n onNext,\n}: {\n entityDef: EntityDef\n fields: FieldDef[]\n onNext: () => void\n}) {\n const t = useTranslation()\n const namePlural = entityDef.namePlural ?? entityDef.name + 's'\n\n const handleDownload = () => {\n const csv = generateSampleCSV(fields)\n downloadCSV(csv, `${namePlural.toLowerCase().replace(/\\s+/g, '-')}-template.csv`)\n }\n\n return (\n <div className=\"flex flex-col items-center text-center gap-6 py-4\">\n <div className=\"h-16 w-16 rounded-2xl bg-primary/10 flex items-center justify-center\">\n <FileSpreadsheet className=\"h-8 w-8 text-primary\" />\n </div>\n <div className=\"space-y-2 max-w-sm\">\n <h3 className=\"text-base font-semibold\">{t('crud.import.downloadTitle')}</h3>\n <p className=\"text-sm text-muted-foreground\">\n {t('crud.import.downloadDescription', { entity: namePlural.toLowerCase() })}\n </p>\n </div>\n <div className=\"flex flex-col gap-3 w-full max-w-xs\">\n <Button variant=\"outline\" onClick={handleDownload} className=\"w-full\">\n <Download className=\"h-4 w-4 mr-2\" />\n {t('crud.import.downloadTemplate')}\n </Button>\n <p className=\"text-xs text-muted-foreground\">\n {t('crud.import.downloadHint', { count: String(fields.length) })}\n </p>\n </div>\n <Button onClick={onNext} className=\"mt-2\">\n {t('crud.import.alreadyHaveFile')}\n <ArrowRight className=\"h-4 w-4 ml-2\" />\n </Button>\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Step 2: Upload file\n// ---------------------------------------------------------------------------\n\nfunction UploadStep({\n onParsed,\n onBack,\n}: {\n onParsed: (csv: ParsedCSV, fileName: string) => void\n onBack: () => void\n}) {\n const t = useTranslation()\n const inputRef = useRef<HTMLInputElement>(null)\n const [dragOver, setDragOver] = useState(false)\n const [error, setError] = useState<string | null>(null)\n\n const processFile = (file: File) => {\n setError(null)\n if (!file.name.endsWith('.csv')) {\n setError(t('crud.import.invalidFile'))\n return\n }\n const reader = new FileReader()\n reader.onload = (e) => {\n const text = e.target?.result as string\n const parsed = parseCSV(text)\n if (parsed.headers.length === 0) {\n setError(t('crud.import.emptyFile'))\n return\n }\n if (parsed.rows.length === 0) {\n setError(t('crud.import.noRows'))\n return\n }\n onParsed(parsed, file.name)\n }\n reader.readAsText(file)\n }\n\n const handleDrop = (e: React.DragEvent) => {\n e.preventDefault()\n setDragOver(false)\n const file = e.dataTransfer.files[0]\n if (file) processFile(file)\n }\n\n return (\n <div className=\"flex flex-col items-center gap-6 py-4\">\n <div\n onDragOver={(e) => { e.preventDefault(); setDragOver(true) }}\n onDragLeave={() => setDragOver(false)}\n onDrop={handleDrop}\n onClick={() => inputRef.current?.click()}\n className={cn(\n 'flex flex-col items-center justify-center gap-3 w-full max-w-sm rounded-xl border-2 border-dashed p-8 cursor-pointer transition-colors',\n dragOver ? 'border-primary bg-primary/5' : 'border-muted-foreground/25 hover:border-muted-foreground/50',\n )}\n >\n <Upload className=\"h-8 w-8 text-muted-foreground\" />\n <div className=\"text-center\">\n <p className=\"text-sm font-medium\">{t('crud.import.uploadTitle')}</p>\n <p className=\"text-xs text-muted-foreground mt-1\">{t('crud.import.uploadHint')}</p>\n </div>\n <input\n ref={inputRef}\n type=\"file\"\n accept=\".csv\"\n className=\"hidden\"\n onChange={(e) => {\n const file = e.target.files?.[0]\n if (file) processFile(file)\n }}\n />\n </div>\n {error && (\n <div className=\"flex items-center gap-2 text-sm text-destructive\">\n <AlertCircle className=\"h-4 w-4 shrink-0\" />\n {error}\n </div>\n )}\n <Button variant=\"ghost\" onClick={onBack}>\n <ArrowLeft className=\"h-4 w-4 mr-2\" />\n {t('common.back')}\n </Button>\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Step 3: Column mapping\n// ---------------------------------------------------------------------------\n\nfunction MappingStep({\n csv,\n fileName,\n fields,\n onConfirm,\n onBack,\n}: {\n csv: ParsedCSV\n fileName: string\n fields: FieldDef[]\n onConfirm: (mapping: Map<number, FieldDef>) => void\n onBack: () => void\n}) {\n const t = useTranslation()\n\n // Auto-map by label match (case-insensitive)\n const initialMapping = useMemo(() => {\n const map = new Map<number, FieldDef | null>()\n for (let i = 0; i < csv.headers.length; i++) {\n const header = csv.headers[i].toLowerCase().trim()\n const match = fields.find(\n (f) => f.label.toLowerCase() === header || f.key.toLowerCase() === header,\n )\n map.set(i, match ?? null)\n }\n return map\n }, [csv.headers, fields])\n\n const [mapping, setMapping] = useState(initialMapping)\n\n const mappedCount = Array.from(mapping.values()).filter(Boolean).length\n const previewRows = csv.rows.slice(0, 3)\n\n const handleSelect = (colIdx: number, fieldKey: string) => {\n setMapping((prev) => {\n const next = new Map(prev)\n if (fieldKey === '__ignore__') {\n next.set(colIdx, null)\n } else {\n const field = fields.find((f) => f.key === fieldKey) ?? null\n // Remove this field from any other column\n for (const [idx, f] of next) {\n if (f?.key === fieldKey) next.set(idx, null)\n }\n next.set(colIdx, field)\n }\n return next\n })\n }\n\n const handleConfirm = () => {\n const validMapping = new Map<number, FieldDef>()\n for (const [idx, field] of mapping) {\n if (field) validMapping.set(idx, field)\n }\n onConfirm(validMapping)\n }\n\n return (\n <div className=\"space-y-4\">\n <div className=\"flex items-center justify-between\">\n <div>\n <p className=\"text-sm font-medium\">{t('crud.import.mappingTitle')}</p>\n <p className=\"text-xs text-muted-foreground mt-0.5\">\n {t('crud.import.mappingDescription', {\n file: fileName,\n columns: String(csv.headers.length),\n rows: String(csv.rows.length),\n })}\n </p>\n </div>\n <span className=\"text-xs text-muted-foreground tabular-nums\">\n {t('crud.import.mappedCount', { count: String(mappedCount), total: String(csv.headers.length) })}\n </span>\n </div>\n\n <div className=\"overflow-x-auto border rounded-lg\">\n <table className=\"w-full text-sm\">\n <thead>\n <tr className=\"border-b bg-muted/50\">\n <th className=\"text-left font-medium text-muted-foreground py-2.5 px-3 w-[35%]\">\n {t('crud.import.csvColumn')}\n </th>\n <th className=\"text-center w-[10%] px-2\">\n <ArrowRight className=\"h-3.5 w-3.5 mx-auto text-muted-foreground\" />\n </th>\n <th className=\"text-left font-medium text-muted-foreground py-2.5 px-3 w-[35%]\">\n {t('crud.import.mapsTo')}\n </th>\n <th className=\"text-left font-medium text-muted-foreground py-2.5 px-3 w-[20%]\">\n {t('crud.import.preview')}\n </th>\n </tr>\n </thead>\n <tbody>\n {csv.headers.map((header, idx) => {\n const mapped = mapping.get(idx)\n return (\n <tr key={idx} className=\"border-b last:border-0\">\n <td className=\"py-2 px-3\">\n <span className=\"font-mono text-xs bg-muted px-1.5 py-0.5 rounded\">{header}</span>\n </td>\n <td className=\"text-center px-2\">\n <ArrowRight className=\"h-3 w-3 mx-auto text-muted-foreground/50\" />\n </td>\n <td className=\"py-2 px-3\">\n <div className=\"relative\">\n <select\n value={mapped?.key ?? '__ignore__'}\n onChange={(e) => handleSelect(idx, e.target.value)}\n className={cn(\n 'w-full appearance-none rounded-md border bg-background px-2.5 py-1.5 pr-8 text-sm',\n 'focus:outline-none focus:ring-2 focus:ring-ring',\n mapped ? 'text-foreground' : 'text-muted-foreground',\n )}\n >\n <option value=\"__ignore__\">{t('crud.import.skip')}</option>\n {fields.map((f) => (\n <option key={f.key} value={f.key}>{f.label}</option>\n ))}\n </select>\n <ChevronDown className=\"absolute right-2 top-1/2 -translate-y-1/2 h-3.5 w-3.5 text-muted-foreground pointer-events-none\" />\n </div>\n </td>\n <td className=\"py-2 px-3\">\n <span className=\"text-xs text-muted-foreground truncate block max-w-[140px]\">\n {previewRows[0]?.[idx] ?? '—'}\n </span>\n </td>\n </tr>\n )\n })}\n </tbody>\n </table>\n </div>\n\n <div className=\"flex items-center justify-between pt-2\">\n <Button variant=\"ghost\" onClick={onBack}>\n <ArrowLeft className=\"h-4 w-4 mr-2\" />\n {t('common.back')}\n </Button>\n <Button onClick={handleConfirm} disabled={mappedCount === 0}>\n {t('crud.import.startImport')}\n <ArrowRight className=\"h-4 w-4 ml-2\" />\n </Button>\n </div>\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Step 4: Importing + Done\n// ---------------------------------------------------------------------------\n\nfunction ImportingStep({\n result,\n progress,\n totalRows,\n onClose,\n}: {\n result: { success: number; errors: ImportRowError[] } | null\n progress: { processed: number; total: number } | null\n totalRows: number\n onClose: () => void\n}) {\n const t = useTranslation()\n\n if (!result) {\n const processed = progress?.processed ?? 0\n const total = progress?.total ?? totalRows\n const percent = total > 0 ? Math.round((processed / total) * 100) : 0\n\n return (\n <div className=\"flex flex-col items-center gap-6 py-8\">\n <div className=\"relative h-16 w-16 flex items-center justify-center\">\n <Loader2 className=\"h-10 w-10 animate-spin text-primary\" />\n </div>\n\n <div className=\"text-center space-y-1\">\n <p className=\"text-sm font-medium\">{t('crud.import.importing')}</p>\n <p className=\"text-xs text-muted-foreground\">\n {t('crud.import.progressCount', { processed: String(processed), total: String(total) })}\n </p>\n </div>\n\n {/* Progress bar */}\n <div className=\"w-full max-w-xs space-y-2\">\n <div className=\"h-2 w-full rounded-full bg-muted overflow-hidden\">\n <div\n className=\"h-full rounded-full bg-primary transition-all duration-500 ease-out\"\n style={{ width: `${percent}%` }}\n />\n </div>\n <p className=\"text-xs text-muted-foreground text-center tabular-nums\">\n {percent}%\n </p>\n </div>\n </div>\n )\n }\n\n const hasErrors = result.errors.length > 0\n\n return (\n <div className=\"flex flex-col items-center gap-5 py-4\">\n <div className={cn(\n 'h-16 w-16 rounded-2xl flex items-center justify-center',\n hasErrors ? 'bg-warning/10' : 'bg-success/10',\n )}>\n {hasErrors ? (\n <AlertCircle className=\"h-8 w-8 text-warning\" />\n ) : (\n <Check className=\"h-8 w-8 text-success\" />\n )}\n </div>\n\n <div className=\"text-center space-y-1\">\n <h3 className=\"text-base font-semibold\">\n {hasErrors ? t('crud.import.doneWithErrors') : t('crud.import.doneSuccess')}\n </h3>\n <p className=\"text-sm text-muted-foreground\">\n {t('crud.import.doneCount', {\n success: String(result.success),\n total: String(totalRows),\n })}\n </p>\n </div>\n\n {/* Completed progress bar */}\n <div className=\"w-full max-w-xs\">\n <div className=\"h-2 w-full rounded-full bg-muted overflow-hidden\">\n <div\n className={cn(\n 'h-full rounded-full transition-all duration-300',\n hasErrors ? 'bg-warning' : 'bg-success',\n )}\n style={{ width: '100%' }}\n />\n </div>\n </div>\n\n {hasErrors && (\n <div className=\"w-full max-w-sm max-h-40 overflow-y-auto rounded-lg border\">\n <div className=\"divide-y\">\n {result.errors.slice(0, 20).map((err, i) => (\n <div key={i} className=\"flex items-start gap-2 px-3 py-2 text-xs\">\n <span className=\"text-muted-foreground shrink-0 tabular-nums\">\n {t('crud.import.rowNumber', { row: String(err.row) })}\n </span>\n <span className=\"text-destructive\">{err.message}</span>\n </div>\n ))}\n {result.errors.length > 20 && (\n <div className=\"px-3 py-2 text-xs text-muted-foreground text-center\">\n +{result.errors.length - 20} more\n </div>\n )}\n </div>\n </div>\n )}\n\n <Button onClick={onClose}>{t('common.done')}</Button>\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Main wizard\n// ---------------------------------------------------------------------------\n\nexport function ImportWizard({ open, onClose, entityDef, onImport }: ImportWizardProps) {\n const t = useTranslation()\n const [step, setStep] = useState<ImportStep>('download')\n const [csv, setCsv] = useState<ParsedCSV | null>(null)\n const [fileName, setFileName] = useState('')\n const [result, setResult] = useState<{ success: number; errors: ImportRowError[] } | null>(null)\n const [progress, setProgress] = useState<{ processed: number; total: number } | null>(null)\n\n const fields = useMemo(() => getImportableFields(entityDef), [entityDef])\n\n const handleClose = () => {\n setStep('download')\n setCsv(null)\n setFileName('')\n setResult(null)\n setProgress(null)\n onClose()\n }\n\n const handleParsed = (parsed: ParsedCSV, name: string) => {\n setCsv(parsed)\n setFileName(name)\n setStep('mapping')\n }\n\n const handleConfirmMapping = useCallback(async (mapping: Map<number, FieldDef>) => {\n if (!csv) return\n setStep('importing')\n setResult(null)\n setProgress(null)\n\n // Transform CSV rows → record objects using mapping\n const rows: Record<string, any>[] = csv.rows.map((row) => {\n const record: Record<string, any> = {}\n for (const [colIdx, field] of mapping) {\n const rawValue = row[colIdx] ?? ''\n record[field.key] = coerceValue(rawValue, field)\n }\n return record\n })\n\n try {\n const res = await onImport(rows, (processed, total) => {\n setProgress({ processed, total })\n })\n setResult(res)\n setStep('done')\n } catch (err: any) {\n setResult({ success: 0, errors: [{ row: 0, message: err?.message ?? 'Import failed' }] })\n setStep('done')\n }\n }, [csv, onImport])\n\n const namePlural = entityDef.namePlural ?? entityDef.name + 's'\n\n return (\n <Modal open={open} onOpenChange={(o) => { if (!o) handleClose() }}>\n <ModalContent size=\"xl\">\n <ModalHeader>\n <ModalTitle>{t('crud.import.title', { entity: namePlural })}</ModalTitle>\n <div className=\"pt-2\">\n <StepIndicator current={step} />\n </div>\n </ModalHeader>\n\n <ModalBody>\n {step === 'download' && (\n <DownloadStep\n entityDef={entityDef}\n fields={fields}\n onNext={() => setStep('upload')}\n />\n )}\n {step === 'upload' && (\n <UploadStep\n onParsed={handleParsed}\n onBack={() => setStep('download')}\n />\n )}\n {step === 'mapping' && csv && (\n <MappingStep\n csv={csv}\n fileName={fileName}\n fields={fields}\n onConfirm={handleConfirmMapping}\n onBack={() => setStep('upload')}\n />\n )}\n {(step === 'importing' || step === 'done') && (\n <ImportingStep\n result={result}\n progress={progress}\n totalRows={csv?.rows.length ?? 0}\n onClose={handleClose}\n />\n )}\n </ModalBody>\n </ModalContent>\n </Modal>\n )\n}\n"]}
@@ -0,0 +1,36 @@
1
+ import { create } from 'zustand';
2
+
3
+ // src/billing/store.ts
4
+ var initialState = {
5
+ subscription: null,
6
+ invoices: [],
7
+ plans: [],
8
+ loading: false,
9
+ checkout: null
10
+ };
11
+ var useBillingStore = create((set) => ({
12
+ ...initialState,
13
+ setSubscription: (subscription) => set({ subscription }),
14
+ setInvoices: (invoices) => set({ invoices }),
15
+ setPlans: (plans) => set({ plans }),
16
+ setLoading: (loading) => set({ loading }),
17
+ setCheckout: (checkout) => set({ checkout }),
18
+ reset: () => set(initialState)
19
+ }));
20
+
21
+ // src/billing/plan-badge.ts
22
+ function capitalize(s) {
23
+ return s ? s.charAt(0).toUpperCase() + s.slice(1) : s;
24
+ }
25
+ function resolvePlanBadge(planId, plans) {
26
+ const id = planId || "free";
27
+ const match = plans.find((p) => p.id === id);
28
+ if (match) {
29
+ return { label: match.name, planId: match.id, paid: match.price > 0 };
30
+ }
31
+ return { label: capitalize(id), planId: id, paid: false };
32
+ }
33
+
34
+ export { resolvePlanBadge, useBillingStore };
35
+ //# sourceMappingURL=chunk-VN5NTK26.js.map
36
+ //# sourceMappingURL=chunk-VN5NTK26.js.map