@fayz-ai/admin 0.47.0 → 0.48.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 (355) hide show
  1. package/dist/ImportWizard-SYP3OXZU.js +3 -0
  2. package/dist/{ImportWizard-7UFB2PPF.js.map → ImportWizard-SYP3OXZU.js.map} +1 -1
  3. package/dist/PersonTimeline-X7JTPUWJ.js +3 -0
  4. package/dist/PersonTimeline-X7JTPUWJ.js.map +1 -0
  5. package/dist/ScheduleEditor-BXWJ7CMI.js +6 -0
  6. package/dist/{ScheduleEditor-MNHZCQIG.js.map → ScheduleEditor-BXWJ7CMI.js.map} +1 -1
  7. package/dist/SubscriptionPage-VBDDRSVW.js +8 -0
  8. package/dist/{SubscriptionPage-JWWS44SE.js.map → SubscriptionPage-VBDDRSVW.js.map} +1 -1
  9. package/dist/access/ModuleUnavailable.d.ts +14 -0
  10. package/dist/access/ModuleUnavailable.d.ts.map +1 -0
  11. package/dist/access/context.d.ts.map +1 -1
  12. package/dist/access/useModuleAccess.d.ts +11 -0
  13. package/dist/access/useModuleAccess.d.ts.map +1 -0
  14. package/dist/app/AdminShell.d.ts +1 -1
  15. package/dist/app/AdminShell.d.ts.map +1 -1
  16. package/dist/app/OfflineBoot.d.ts.map +1 -1
  17. package/dist/app/admin-app.d.ts +1 -1
  18. package/dist/app/admin-app.d.ts.map +1 -1
  19. package/dist/app/config.d.ts +3 -3
  20. package/dist/app/config.d.ts.map +1 -1
  21. package/dist/app/rail-preset.d.ts.map +1 -1
  22. package/dist/billing/TrialWidget.d.ts.map +1 -1
  23. package/dist/billing/ai-usage.d.ts +67 -0
  24. package/dist/billing/ai-usage.d.ts.map +1 -0
  25. package/dist/billing/index.d.ts +2 -0
  26. package/dist/billing/index.d.ts.map +1 -1
  27. package/dist/billing/index.js +3 -2
  28. package/dist/billing/module-families.d.ts +25 -0
  29. package/dist/billing/module-families.d.ts.map +1 -0
  30. package/dist/billing/module-pricing.d.ts +199 -0
  31. package/dist/billing/module-pricing.d.ts.map +1 -0
  32. package/dist/{chunk-IUCDHAAB.js → chunk-2Q6QHTZV.js} +13 -78
  33. package/dist/chunk-2Q6QHTZV.js.map +1 -0
  34. package/dist/{chunk-46UABOOC.js → chunk-5GCC7YCE.js} +40 -39
  35. package/dist/chunk-5GCC7YCE.js.map +1 -0
  36. package/dist/{chunk-WXNTUCX3.js → chunk-E4MESMNR.js} +10 -4
  37. package/dist/chunk-E4MESMNR.js.map +1 -0
  38. package/dist/chunk-F346TYKO.js +1448 -0
  39. package/dist/chunk-F346TYKO.js.map +1 -0
  40. package/dist/chunk-GZWX4ZIK.js +111 -0
  41. package/dist/chunk-GZWX4ZIK.js.map +1 -0
  42. package/dist/{chunk-OINP2UYL.js → chunk-KVIINVY6.js} +133 -169
  43. package/dist/chunk-KVIINVY6.js.map +1 -0
  44. package/dist/chunk-OEY3V6J3.js +581 -0
  45. package/dist/chunk-OEY3V6J3.js.map +1 -0
  46. package/dist/{chunk-V2IBAF4O.js → chunk-ZMP52ZHM.js} +23 -83
  47. package/dist/chunk-ZMP52ZHM.js.map +1 -0
  48. package/dist/components/RightRail.d.ts.map +1 -1
  49. package/dist/components/auth/CenteredLogin.d.ts +1 -1
  50. package/dist/components/auth/CenteredLogin.d.ts.map +1 -1
  51. package/dist/components/auth/LoginForm.d.ts +1 -1
  52. package/dist/components/auth/LoginForm.d.ts.map +1 -1
  53. package/dist/components/auth/LoginPage.d.ts +1 -1
  54. package/dist/components/auth/LoginPage.d.ts.map +1 -1
  55. package/dist/components/auth/OAuthButtons.d.ts +1 -1
  56. package/dist/components/auth/OAuthButtons.d.ts.map +1 -1
  57. package/dist/components/auth/ProtectedRoute.d.ts +1 -1
  58. package/dist/components/auth/ProtectedRoute.d.ts.map +1 -1
  59. package/dist/components/auth/RecoveryForm.d.ts.map +1 -1
  60. package/dist/components/auth/SignupForm.d.ts.map +1 -1
  61. package/dist/components/auth/SplitLogin.d.ts +1 -1
  62. package/dist/components/auth/SplitLogin.d.ts.map +1 -1
  63. package/dist/components/billing/AiUsageSection.d.ts +16 -0
  64. package/dist/components/billing/AiUsageSection.d.ts.map +1 -0
  65. package/dist/components/billing/InvoiceList.d.ts +1 -1
  66. package/dist/components/billing/InvoiceList.d.ts.map +1 -1
  67. package/dist/components/billing/PlanCheckoutSheet.d.ts +24 -0
  68. package/dist/components/billing/PlanCheckoutSheet.d.ts.map +1 -0
  69. package/dist/components/billing/PlanSelector.d.ts +1 -1
  70. package/dist/components/billing/PlanSelector.d.ts.map +1 -1
  71. package/dist/components/billing/PricingOverview.d.ts +20 -0
  72. package/dist/components/billing/PricingOverview.d.ts.map +1 -0
  73. package/dist/components/billing/SoftLimitWidget.d.ts.map +1 -1
  74. package/dist/components/billing/SubscriptionCard.d.ts +1 -1
  75. package/dist/components/billing/SubscriptionCard.d.ts.map +1 -1
  76. package/dist/components/billing/SubscriptionPage.d.ts.map +1 -1
  77. package/dist/components/billing/UpgradePrompt.d.ts.map +1 -1
  78. package/dist/components/billing/access-contract.d.ts +5 -3
  79. package/dist/components/billing/access-contract.d.ts.map +1 -1
  80. package/dist/components/billing/plan-feature.d.ts.map +1 -1
  81. package/dist/components/chat/AssistantActivityBar.d.ts.map +1 -1
  82. package/dist/components/chat/AssistantInvite.d.ts.map +1 -1
  83. package/dist/components/chat/AssistantRecordingView.d.ts.map +1 -1
  84. package/dist/components/chat/ChatAttachments.d.ts.map +1 -1
  85. package/dist/components/chat/ChatComposer.d.ts.map +1 -1
  86. package/dist/components/chat/ChatConversation.d.ts.map +1 -1
  87. package/dist/components/chat/ChatFab.d.ts.map +1 -1
  88. package/dist/components/chat/ChatHistory.d.ts.map +1 -1
  89. package/dist/components/chat/ChatMessages.d.ts.map +1 -1
  90. package/dist/components/chat/ChatSuggestions.d.ts.map +1 -1
  91. package/dist/components/chat/ChoiceCard.d.ts.map +1 -1
  92. package/dist/components/chat/ConfirmActionCard.d.ts.map +1 -1
  93. package/dist/components/chat/ConnectorSuggestionCard.d.ts.map +1 -1
  94. package/dist/components/chat/RecordChip.d.ts.map +1 -1
  95. package/dist/components/chat/TourCoachCard.d.ts.map +1 -1
  96. package/dist/components/connect/AddConnectorPanel.d.ts.map +1 -1
  97. package/dist/components/connect/ConnectConsentPage.d.ts.map +1 -1
  98. package/dist/components/connect/ConnectorDetail.d.ts.map +1 -1
  99. package/dist/components/connect/ConnectorRow.d.ts.map +1 -1
  100. package/dist/components/connect/ConnectorSyncActions.d.ts.map +1 -1
  101. package/dist/components/connect/ConnectorsPanel.d.ts.map +1 -1
  102. package/dist/components/layout/BottomNav.d.ts.map +1 -1
  103. package/dist/components/notifications/NotificationInbox.d.ts +1 -1
  104. package/dist/components/notifications/NotificationInbox.d.ts.map +1 -1
  105. package/dist/components/notifications/UpdateReady.d.ts.map +1 -1
  106. package/dist/components/organization/PermissionMatrixEditor.d.ts.map +1 -1
  107. package/dist/components/organization/PermissionProfilesTab.d.ts.map +1 -1
  108. package/dist/components/organization/TeamTab.d.ts.map +1 -1
  109. package/dist/components/plugins/ConnectorsHub.d.ts.map +1 -1
  110. package/dist/components/plugins/PluginSettingsPanel.d.ts.map +1 -1
  111. package/dist/components/settings/AddModulesPanel.d.ts.map +1 -1
  112. package/dist/components/settings/BrandingSettings.d.ts.map +1 -1
  113. package/dist/components/settings/CompanySettings.d.ts +1 -1
  114. package/dist/components/settings/CompanySettings.d.ts.map +1 -1
  115. package/dist/components/settings/ConnectedCompanySettings.d.ts.map +1 -1
  116. package/dist/components/settings/ConnectedFieldRulesSettings.d.ts.map +1 -1
  117. package/dist/components/settings/ConnectedModulesSettings.d.ts.map +1 -1
  118. package/dist/components/settings/ConnectedSecuritySettings.d.ts.map +1 -1
  119. package/dist/components/settings/FieldRulesEditor.d.ts +12 -0
  120. package/dist/components/settings/FieldRulesEditor.d.ts.map +1 -0
  121. package/dist/components/settings/FieldRulesSettings.d.ts.map +1 -1
  122. package/dist/components/settings/HolidaysSettings.d.ts.map +1 -1
  123. package/dist/components/settings/ModuleCard.d.ts +18 -3
  124. package/dist/components/settings/ModuleCard.d.ts.map +1 -1
  125. package/dist/components/settings/ModuleFamilyBits.d.ts +4 -0
  126. package/dist/components/settings/ModuleFamilyBits.d.ts.map +1 -0
  127. package/dist/components/settings/ModulesSettings.d.ts +3 -1
  128. package/dist/components/settings/ModulesSettings.d.ts.map +1 -1
  129. package/dist/components/settings/SecuritySettings.d.ts +1 -1
  130. package/dist/components/settings/SecuritySettings.d.ts.map +1 -1
  131. package/dist/components/settings/SettingsPage.d.ts +19 -0
  132. package/dist/components/settings/SettingsPage.d.ts.map +1 -1
  133. package/dist/components/settings/UserProfile.d.ts +1 -1
  134. package/dist/components/settings/UserProfile.d.ts.map +1 -1
  135. package/dist/components/settings/module-links.d.ts +10 -0
  136. package/dist/components/settings/module-links.d.ts.map +1 -0
  137. package/dist/components/settings/module-scope.d.ts +28 -0
  138. package/dist/components/settings/module-scope.d.ts.map +1 -0
  139. package/dist/components/settings/settings-focus.d.ts +17 -0
  140. package/dist/components/settings/settings-focus.d.ts.map +1 -0
  141. package/dist/components/settings/settings-parents.d.ts +11 -0
  142. package/dist/components/settings/settings-parents.d.ts.map +1 -0
  143. package/dist/components/settings/settings-sections.d.ts +56 -0
  144. package/dist/components/settings/settings-sections.d.ts.map +1 -0
  145. package/dist/components/settings/settings-shortcuts.d.ts +7 -0
  146. package/dist/components/settings/settings-shortcuts.d.ts.map +1 -0
  147. package/dist/components/settings/settings-subtabs.d.ts +14 -0
  148. package/dist/components/settings/settings-subtabs.d.ts.map +1 -0
  149. package/dist/components/shared/ContactPicker.d.ts.map +1 -1
  150. package/dist/components/shared/PersonLink.d.ts.map +1 -1
  151. package/dist/components/shared/RecordPickerModal.d.ts.map +1 -1
  152. package/dist/components/survey/PublicSurveyPage.d.ts.map +1 -1
  153. package/dist/crud/CrudDetailPage.d.ts.map +1 -1
  154. package/dist/crud/CrudFormPage.d.ts.map +1 -1
  155. package/dist/crud/CrudListView.d.ts.map +1 -1
  156. package/dist/crud/CrudPage.d.ts.map +1 -1
  157. package/dist/crud/EntityOverview.d.ts.map +1 -1
  158. package/dist/crud/ImportWizard.d.ts.map +1 -1
  159. package/dist/crud/InlineField.d.ts +36 -0
  160. package/dist/crud/InlineField.d.ts.map +1 -0
  161. package/dist/crud/LookupCreateInline.d.ts.map +1 -1
  162. package/dist/crud/RelatedSection.d.ts.map +1 -1
  163. package/dist/crud/TagsField.d.ts.map +1 -1
  164. package/dist/crud/archetypes/AccessTab.d.ts.map +1 -1
  165. package/dist/crud/archetypes/ActiveToggle.d.ts.map +1 -1
  166. package/dist/crud/archetypes/AddressFormModal.d.ts +34 -0
  167. package/dist/crud/archetypes/AddressFormModal.d.ts.map +1 -0
  168. package/dist/crud/archetypes/AddressesTab.d.ts +2 -20
  169. package/dist/crud/archetypes/AddressesTab.d.ts.map +1 -1
  170. package/dist/crud/archetypes/ArchetypeStatusBar.d.ts.map +1 -1
  171. package/dist/crud/archetypes/BlockSettingsPopover.d.ts +1 -1
  172. package/dist/crud/archetypes/BlockSettingsPopover.d.ts.map +1 -1
  173. package/dist/crud/archetypes/ClientOrdersTab.d.ts.map +1 -1
  174. package/dist/crud/archetypes/KanbanBoard.d.ts.map +1 -1
  175. package/dist/crud/archetypes/LocationFormLayout.d.ts.map +1 -1
  176. package/dist/crud/archetypes/OrderBoardView.d.ts.map +1 -1
  177. package/dist/crud/archetypes/OrderCreateScreen.d.ts +3 -1
  178. package/dist/crud/archetypes/OrderCreateScreen.d.ts.map +1 -1
  179. package/dist/crud/archetypes/OrderDetailPage.d.ts.map +1 -1
  180. package/dist/crud/archetypes/OrderDetailRail.d.ts.map +1 -1
  181. package/dist/crud/archetypes/OrderFormView.d.ts.map +1 -1
  182. package/dist/crud/archetypes/PayeeAccountsSection.d.ts.map +1 -1
  183. package/dist/crud/archetypes/PaymentStatusBadge.d.ts.map +1 -1
  184. package/dist/crud/archetypes/PersonPicker.d.ts.map +1 -1
  185. package/dist/crud/archetypes/ScheduleDateExceptions.d.ts.map +1 -1
  186. package/dist/crud/archetypes/ScheduleGridPanel.d.ts.map +1 -1
  187. package/dist/crud/fieldToColumn.d.ts.map +1 -1
  188. package/dist/db.cjs +831 -5
  189. package/dist/db.d.ts +2 -1
  190. package/dist/db.d.ts.map +1 -1
  191. package/dist/db.js +1 -1
  192. package/dist/directory/AppSwitcher.d.ts.map +1 -1
  193. package/dist/handbook/NotebookPanel.d.ts.map +1 -1
  194. package/dist/hooks/useAITools.d.ts.map +1 -1
  195. package/dist/hooks/useAuth.d.ts +3 -3
  196. package/dist/hooks/useAuth.d.ts.map +1 -1
  197. package/dist/hooks/useChat.d.ts.map +1 -1
  198. package/dist/hooks/useFieldRules.d.ts +4 -2
  199. package/dist/hooks/useFieldRules.d.ts.map +1 -1
  200. package/dist/hooks/useFormatters.d.ts.map +1 -1
  201. package/dist/hooks/useGlobalSearch.d.ts.map +1 -1
  202. package/dist/hooks/useLayout.d.ts.map +1 -1
  203. package/dist/hooks/useNotifications.d.ts +1 -1
  204. package/dist/hooks/useNotifications.d.ts.map +1 -1
  205. package/dist/hooks/useTenant.d.ts +2 -2
  206. package/dist/hooks/useTenant.d.ts.map +1 -1
  207. package/dist/hooks/useTenantPlugins.d.ts +1 -1
  208. package/dist/impersonation/ImpersonationBanner.d.ts.map +1 -1
  209. package/dist/index.d.ts +48 -8
  210. package/dist/index.d.ts.map +1 -1
  211. package/dist/index.js +4945 -4555
  212. package/dist/index.js.map +1 -1
  213. package/dist/lib/currency.d.ts +6 -0
  214. package/dist/lib/currency.d.ts.map +1 -1
  215. package/dist/lib/field-rules-db.d.ts +36 -0
  216. package/dist/lib/field-rules-db.d.ts.map +1 -0
  217. package/dist/onboarding/ActivationProvider.d.ts.map +1 -1
  218. package/dist/onboarding/activation.store.d.ts +1 -1
  219. package/dist/onboarding/activation.store.d.ts.map +1 -1
  220. package/dist/onboarding/checklist.d.ts +1 -1
  221. package/dist/onboarding/checklist.d.ts.map +1 -1
  222. package/dist/onboarding/tasks.d.ts +1 -1
  223. package/dist/onboarding/tasks.d.ts.map +1 -1
  224. package/dist/org/WorkspaceChooser.d.ts.map +1 -1
  225. package/dist/org/WorkspaceUnitSheet.d.ts.map +1 -1
  226. package/dist/org/adapters/supabase.d.ts +1 -0
  227. package/dist/org/adapters/supabase.d.ts.map +1 -1
  228. package/dist/org/index.js +2 -2
  229. package/dist/permissions/v1-catalog.d.ts +16 -0
  230. package/dist/permissions/v1-catalog.d.ts.map +1 -0
  231. package/dist/plugins/PluginRegistryManager.d.ts.map +1 -1
  232. package/dist/plugins/QuickActionsButton.d.ts.map +1 -1
  233. package/dist/plugins/SettingsGroup.d.ts +12 -4
  234. package/dist/plugins/SettingsGroup.d.ts.map +1 -1
  235. package/dist/plugins/WidgetSlot.d.ts.map +1 -1
  236. package/dist/projects/ProjectsSettings.d.ts.map +1 -1
  237. package/dist/projects/SeuSiteWidget.d.ts.map +1 -1
  238. package/dist/settings/MessageTemplateRow.d.ts +16 -0
  239. package/dist/settings/MessageTemplateRow.d.ts.map +1 -0
  240. package/dist/settings/SettingsForm.d.ts +60 -0
  241. package/dist/settings/SettingsForm.d.ts.map +1 -0
  242. package/dist/settings/UnitScopePicker.d.ts +22 -0
  243. package/dist/settings/UnitScopePicker.d.ts.map +1 -0
  244. package/dist/settings/core-v1-tabs.d.ts +8 -0
  245. package/dist/settings/core-v1-tabs.d.ts.map +1 -0
  246. package/dist/settings/defineSettingsTab.d.ts +17 -0
  247. package/dist/settings/defineSettingsTab.d.ts.map +1 -0
  248. package/dist/settings/registry-parent.d.ts +8 -0
  249. package/dist/settings/registry-parent.d.ts.map +1 -0
  250. package/dist/settings/useSettingKeys.d.ts +28 -0
  251. package/dist/settings/useSettingKeys.d.ts.map +1 -0
  252. package/dist/stores/auth.store.d.ts +1 -1
  253. package/dist/stores/auth.store.d.ts.map +1 -1
  254. package/dist/stores/notifications.store.d.ts +1 -1
  255. package/dist/stores/notifications.store.d.ts.map +1 -1
  256. package/dist/stores/tenant.store.d.ts +1 -1
  257. package/dist/stores/tenant.store.d.ts.map +1 -1
  258. package/dist/tasks/TasksPanel.d.ts +4 -0
  259. package/dist/tasks/TasksPanel.d.ts.map +1 -0
  260. package/dist/tasks/TasksRailPanel.d.ts.map +1 -1
  261. package/dist/tasks/index.d.ts +15 -14
  262. package/dist/tasks/index.d.ts.map +1 -1
  263. package/dist/timeline/PersonTimeline.d.ts +1 -0
  264. package/dist/timeline/PersonTimeline.d.ts.map +1 -1
  265. package/dist/types/billing.d.ts +2 -0
  266. package/dist/types/billing.d.ts.map +1 -1
  267. package/dist/types/plugins.d.ts +2 -0
  268. package/dist/types/plugins.d.ts.map +1 -1
  269. package/dist/ui.d.ts +2 -1
  270. package/dist/ui.d.ts.map +1 -1
  271. package/dist/ui.js +1 -1
  272. package/dist/units/MemberUnitsCell.d.ts.map +1 -1
  273. package/dist/units/UnitMembersTab.d.ts.map +1 -1
  274. package/dist/units/UnitSwitcher.d.ts.map +1 -1
  275. package/package.json +7 -7
  276. package/dist/ImportWizard-7UFB2PPF.js +0 -3
  277. package/dist/ScheduleEditor-MNHZCQIG.js +0 -6
  278. package/dist/SubscriptionPage-JWWS44SE.js +0 -9
  279. package/dist/access/index.d.ts +0 -12
  280. package/dist/access/index.d.ts.map +0 -1
  281. package/dist/access/resolver.d.ts +0 -2
  282. package/dist/access/resolver.d.ts.map +0 -1
  283. package/dist/app/LoginPage.d.ts +0 -3
  284. package/dist/app/LoginPage.d.ts.map +0 -1
  285. package/dist/chunk-46UABOOC.js.map +0 -1
  286. package/dist/chunk-IUCDHAAB.js.map +0 -1
  287. package/dist/chunk-OINP2UYL.js.map +0 -1
  288. package/dist/chunk-QOS6UAQ4.js +0 -54
  289. package/dist/chunk-QOS6UAQ4.js.map +0 -1
  290. package/dist/chunk-V2IBAF4O.js.map +0 -1
  291. package/dist/chunk-VH4LLIMH.js +0 -531
  292. package/dist/chunk-VH4LLIMH.js.map +0 -1
  293. package/dist/chunk-WXNTUCX3.js.map +0 -1
  294. package/dist/components/auth/index.d.ts +0 -7
  295. package/dist/components/auth/index.d.ts.map +0 -1
  296. package/dist/components/layout/index.d.ts +0 -6
  297. package/dist/components/layout/index.d.ts.map +0 -1
  298. package/dist/components/notifications/index.d.ts +0 -5
  299. package/dist/components/notifications/index.d.ts.map +0 -1
  300. package/dist/components/organization/index.d.ts +0 -5
  301. package/dist/components/organization/index.d.ts.map +0 -1
  302. package/dist/components/settings/index.d.ts +0 -11
  303. package/dist/components/settings/index.d.ts.map +0 -1
  304. package/dist/crud/index.d.ts +0 -18
  305. package/dist/crud/index.d.ts.map +0 -1
  306. package/dist/hooks/index.d.ts +0 -20
  307. package/dist/hooks/index.d.ts.map +0 -1
  308. package/dist/lib/format.d.ts +0 -7
  309. package/dist/lib/format.d.ts.map +0 -1
  310. package/dist/lib/plugins.d.ts +0 -2
  311. package/dist/lib/plugins.d.ts.map +0 -1
  312. package/dist/stores/billing.store.d.ts +0 -2
  313. package/dist/stores/billing.store.d.ts.map +0 -1
  314. package/dist/stores/index.d.ts +0 -13
  315. package/dist/stores/index.d.ts.map +0 -1
  316. package/dist/stores/layout.store.d.ts +0 -2
  317. package/dist/stores/layout.store.d.ts.map +0 -1
  318. package/dist/stores/permissions.store.d.ts +0 -2
  319. package/dist/stores/permissions.store.d.ts.map +0 -1
  320. package/dist/tasks/components/TaskCard.d.ts +0 -11
  321. package/dist/tasks/components/TaskCard.d.ts.map +0 -1
  322. package/dist/tasks/components/TaskDetail.d.ts +0 -5
  323. package/dist/tasks/components/TaskDetail.d.ts.map +0 -1
  324. package/dist/tasks/components/TaskLabelBadge.d.ts +0 -9
  325. package/dist/tasks/components/TaskLabelBadge.d.ts.map +0 -1
  326. package/dist/tasks/components/TaskPriorityBadge.d.ts +0 -7
  327. package/dist/tasks/components/TaskPriorityBadge.d.ts.map +0 -1
  328. package/dist/tasks/components/TaskQuickAdd.d.ts +0 -5
  329. package/dist/tasks/components/TaskQuickAdd.d.ts.map +0 -1
  330. package/dist/tasks/components/TaskSourceBadge.d.ts +0 -5
  331. package/dist/tasks/components/TaskSourceBadge.d.ts.map +0 -1
  332. package/dist/tasks/components/TaskStatusGroup.d.ts +0 -17
  333. package/dist/tasks/components/TaskStatusGroup.d.ts.map +0 -1
  334. package/dist/tasks/components/TasksFilterBar.d.ts +0 -3
  335. package/dist/tasks/components/TasksFilterBar.d.ts.map +0 -1
  336. package/dist/tasks/components/TasksPanel.d.ts +0 -14
  337. package/dist/tasks/components/TasksPanel.d.ts.map +0 -1
  338. package/dist/tasks/data/mock.d.ts +0 -3
  339. package/dist/tasks/data/mock.d.ts.map +0 -1
  340. package/dist/tasks/data/supabase.d.ts +0 -3
  341. package/dist/tasks/data/supabase.d.ts.map +0 -1
  342. package/dist/tasks/entity.d.ts +0 -11
  343. package/dist/tasks/entity.d.ts.map +0 -1
  344. package/dist/tasks/store.d.ts +0 -34
  345. package/dist/tasks/store.d.ts.map +0 -1
  346. package/dist/tasks/types.d.ts +0 -89
  347. package/dist/tasks/types.d.ts.map +0 -1
  348. package/dist/theme/index.d.ts +0 -8
  349. package/dist/theme/index.d.ts.map +0 -1
  350. package/dist/timeline/index.d.ts +0 -7
  351. package/dist/timeline/index.d.ts.map +0 -1
  352. package/dist/timeline-LECYQ4IA.js +0 -3
  353. package/dist/timeline-LECYQ4IA.js.map +0 -1
  354. package/dist/types/index.d.ts +0 -16
  355. package/dist/types/index.d.ts.map +0 -1
@@ -1,29 +1,11 @@
1
+ import { useTrial } from './chunk-OEY3V6J3.js';
1
2
  import { navigateTo } from './chunk-VX3WJLKK.js';
2
- import { useOrganizationStore, cn } from './chunk-QOS6UAQ4.js';
3
- import { create } from 'zustand';
4
- import * as React from 'react';
3
+ import { cn } from './chunk-GZWX4ZIK.js';
5
4
  import { Crown, Clock } from 'lucide-react';
6
5
  import { tl } from '@fayz-ai/core';
7
- import { useLayoutStore } from '@fayz-ai/ui';
6
+ import { useLayoutStore, Button } from '@fayz-ai/ui';
8
7
  import { jsx, jsxs } from 'react/jsx-runtime';
9
8
 
10
- var initialState = {
11
- subscription: null,
12
- invoices: [],
13
- plans: [],
14
- loading: false,
15
- checkout: null
16
- };
17
- var useBillingStore = create((set) => ({
18
- ...initialState,
19
- setSubscription: (subscription) => set({ subscription }),
20
- setInvoices: (invoices) => set({ invoices }),
21
- setPlans: (plans) => set({ plans }),
22
- setLoading: (loading) => set({ loading }),
23
- setCheckout: (checkout) => set({ checkout }),
24
- reset: () => set(initialState)
25
- }));
26
-
27
9
  // src/billing/plan-badge.ts
28
10
  function capitalize(s) {
29
11
  return s ? s.charAt(0).toUpperCase() + s.slice(1) : s;
@@ -36,57 +18,6 @@ function resolvePlanBadge(planId, plans) {
36
18
  }
37
19
  return { label: capitalize(id), planId: id, paid: false };
38
20
  }
39
- var NO_TRIAL = { status: "none", daysLeft: 0, endingSoon: false };
40
- var DAY_MS = 864e5;
41
- function resolveTrial(org, paidPlanIds2, now = Date.now()) {
42
- if (!org?.trialEndsAt) return NO_TRIAL;
43
- if (org.plan && paidPlanIds2.has(org.plan)) return NO_TRIAL;
44
- const ends = Date.parse(org.trialEndsAt);
45
- if (Number.isNaN(ends)) return NO_TRIAL;
46
- const remaining = ends - now;
47
- if (remaining <= 0) return { status: "expired", endsAt: org.trialEndsAt, daysLeft: 0, endingSoon: false };
48
- const daysLeft = Math.ceil(remaining / DAY_MS);
49
- return {
50
- status: "active",
51
- endsAt: org.trialEndsAt,
52
- daysLeft,
53
- endingSoon: remaining <= 2 * DAY_MS
54
- };
55
- }
56
- function effectivePlan(org, plans, trial, trialPlanId) {
57
- if (trial.status === "active") {
58
- const named2 = trialPlanId ? plans.find((p) => p.id === trialPlanId) : void 0;
59
- if (named2) return named2;
60
- const paid = plans.filter((p) => p.price > 0);
61
- if (paid.length) return paid.reduce((best, p) => p.price > best.price ? p : best);
62
- }
63
- if (plans.length === 0) return null;
64
- const named = org?.plan ? plans.find((p) => p.id === org.plan) : void 0;
65
- if (named) return named;
66
- const floor = plans.reduce((cheapest, p) => p.price < cheapest.price ? p : cheapest);
67
- if (org?.plan) {
68
- console.warn(
69
- `[billing] tenant plan "${org.plan}" n\xE3o existe neste cat\xE1logo (${plans.map((p) => p.id).join(", ")}) \u2014 aplicando o piso "${floor.id}"`
70
- );
71
- }
72
- return floor;
73
- }
74
- function paidPlanIds(plans) {
75
- return new Set(plans.filter((p) => p.price > 0).map((p) => p.id));
76
- }
77
- function useTrial() {
78
- const org = useOrganizationStore((s) => s.currentOrg);
79
- const plans = useBillingStore((s) => s.plans);
80
- const [now, setNow] = React.useState(() => Date.now());
81
- React.useEffect(() => {
82
- const id = window.setInterval(() => setNow(Date.now()), 36e5);
83
- return () => window.clearInterval(id);
84
- }, []);
85
- return React.useMemo(
86
- () => resolveTrial(org, paidPlanIds(plans), now),
87
- [org?.plan, org?.trialEndsAt, plans, now]
88
- );
89
- }
90
21
  function TrialWidget({ totalDays = 30, route = "/settings/subscription", className }) {
91
22
  const trial = useTrial();
92
23
  const collapsed = useLayoutStore((s) => s.sidebarCollapsed);
@@ -96,8 +27,10 @@ function TrialWidget({ totalDays = 30, route = "/settings/subscription", classNa
96
27
  const label = expired ? tl("Trial ended", "Seu teste terminou") : trial.daysLeft <= 1 ? tl("Last day of your trial", "\xDAltimo dia do teste") : tl(`${trial.daysLeft} days of trial left`, `${trial.daysLeft} dias de teste`);
97
28
  if (collapsed) {
98
29
  return /* @__PURE__ */ jsx(
99
- "button",
30
+ Button,
100
31
  {
32
+ variant: "bare",
33
+ size: "bare",
101
34
  type: "button",
102
35
  onClick: () => navigateTo(route),
103
36
  title: label,
@@ -113,13 +46,15 @@ function TrialWidget({ totalDays = 30, route = "/settings/subscription", classNa
113
46
  );
114
47
  }
115
48
  return /* @__PURE__ */ jsxs(
116
- "button",
49
+ Button,
117
50
  {
51
+ variant: "bare",
52
+ size: "bare",
118
53
  type: "button",
119
54
  onClick: () => navigateTo(route),
120
55
  "data-tour": "billing.trial",
121
56
  className: cn(
122
- "w-full rounded-button px-1.5 py-1.5 text-left transition-colors",
57
+ "w-full rounded-button px-1.5 py-1.5 text-left transition-colors inline-block whitespace-normal text-[length:inherit] font-normal",
123
58
  expired ? "bg-primary/15 hover:bg-primary/25" : "hover:bg-sidebar-accent/50",
124
59
  className
125
60
  ),
@@ -152,6 +87,6 @@ function TrialWidget({ totalDays = 30, route = "/settings/subscription", classNa
152
87
  );
153
88
  }
154
89
 
155
- export { NO_TRIAL, TrialWidget, effectivePlan, paidPlanIds, resolvePlanBadge, resolveTrial, useBillingStore, useTrial };
156
- //# sourceMappingURL=chunk-IUCDHAAB.js.map
157
- //# sourceMappingURL=chunk-IUCDHAAB.js.map
90
+ export { TrialWidget, resolvePlanBadge };
91
+ //# sourceMappingURL=chunk-2Q6QHTZV.js.map
92
+ //# sourceMappingURL=chunk-2Q6QHTZV.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/billing/plan-badge.ts","../src/billing/TrialWidget.tsx"],"names":[],"mappings":"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","file":"chunk-2Q6QHTZV.js","sourcesContent":["import type { Plan } from '@fayz-ai/core'\n\nexport interface PlanBadgeInfo {\n /** Display label, e.g. 'Free' or 'Pro'. */\n label: string\n /** Resolved plan id (falls back to the raw org.plan string). */\n planId: string\n /** Paid plan (price > 0) — drives the Crown icon + gold styling in the menus. */\n paid: boolean\n}\n\nfunction capitalize(s: string): string {\n return s ? s.charAt(0).toUpperCase() + s.slice(1) : s\n}\n\n/**\n * Resolve an org's `plan` string against the configured billing plans into the\n * badge shown next to the user in both menus. Falls back to a capitalized\n * version of the raw string when the id isn't in config (defensive — e.g. a\n * legacy 'free' tenant before billing was wired).\n */\nexport function resolvePlanBadge(\n planId: string | undefined | null,\n plans: Plan[],\n): PlanBadgeInfo {\n const id = planId || 'free'\n const match = plans.find((p) => p.id === id)\n if (match) {\n return { label: match.name, planId: match.id, paid: match.price > 0 }\n }\n return { label: capitalize(id), planId: id, paid: false }\n}\n","import * as React from 'react'\nimport { Clock, Crown } from 'lucide-react'\nimport { tl } from '@fayz-ai/core'\nimport { cn } from '../lib/cn'\nimport { navigateTo } from '../app/routing'\nimport { Button, useLayoutStore } from '@fayz-ai/ui'\nimport { useTrial } from './trial'\n\nexport interface TrialWidgetProps {\n /** Length of the window, for the progress bar. Matches the DB column default (migration 044). */\n totalDays?: number\n /** Where \"see the plans\" goes. */\n route?: string\n className?: string\n}\n\n/**\n * The trial, in the rail.\n *\n * A countdown is a promise about the future, so it belongs where somebody looks\n * at their own progress — one line under the getting-started checklist, in the\n * menu's own colours, not a banner across the app. Two states only:\n *\n * • RUNNING — informational, and quiet until the last two days.\n * • ENDED — the paywall's face. It stops being a note and becomes a button,\n * because at that point every gated feature in the product is already\n * answering \"not on your plan\" and this is the one place that says why.\n *\n * There is no third state: a paying tenant, or one that predates trials, gets\n * nothing at all.\n */\nexport function TrialWidget({ totalDays = 30, route = '/settings/subscription', className }: TrialWidgetProps) {\n const trial = useTrial()\n const collapsed = useLayoutStore((s) => s.sidebarCollapsed)\n\n if (trial.status === 'none') return null\n\n const expired = trial.status === 'expired'\n const pct = Math.max(0, Math.min(100, (trial.daysLeft / totalDays) * 100))\n\n const label = expired\n ? tl('Trial ended', 'Seu teste terminou')\n : trial.daysLeft <= 1\n ? tl('Last day of your trial', 'Último dia do teste')\n : tl(`${trial.daysLeft} days of trial left`, `${trial.daysLeft} dias de teste`)\n\n if (collapsed) {\n return (\n <Button\n variant=\"bare\"\n size=\"bare\"\n type=\"button\"\n onClick={() => navigateTo(route)}\n title={label}\n aria-label={label}\n data-tour=\"billing.trial\"\n className={cn(\n 'flex w-full items-center justify-center rounded-button p-1.5 transition-colors',\n expired\n ? 'bg-primary/15 text-primary hover:bg-primary/25'\n : 'text-sidebar-foreground/70 hover:bg-sidebar-accent/60',\n className,\n )}\n >\n {expired ? <Crown className=\"h-4 w-4\" /> : <Clock className=\"h-4 w-4\" />}\n </Button>\n )\n }\n\n return (\n <Button\n variant=\"bare\"\n size=\"bare\"\n type=\"button\"\n onClick={() => navigateTo(route)}\n data-tour=\"billing.trial\"\n className={cn(\n 'w-full rounded-button px-1.5 py-1.5 text-left transition-colors inline-block whitespace-normal text-[length:inherit] font-normal',\n expired ? 'bg-primary/15 hover:bg-primary/25' : 'hover:bg-sidebar-accent/50',\n className,\n )}\n >\n <span className=\"flex items-center gap-2\">\n {expired\n ? <Crown className=\"h-3.5 w-3.5 shrink-0 text-primary\" />\n : <Clock className={cn('h-3.5 w-3.5 shrink-0', trial.endingSoon ? 'text-warning' : 'text-sidebar-muted')} />}\n <span\n className={cn(\n 'min-w-0 flex-1 truncate text-[12px] font-medium',\n expired ? 'text-sidebar-foreground' : 'text-sidebar-foreground/90',\n )}\n >\n {label}\n </span>\n </span>\n {expired ? (\n <span className=\"mt-1 block pl-[22px] text-[11px] leading-snug text-sidebar-muted\">\n {tl('Choose a plan to keep the assistant', 'Escolha um plano para manter o assistente')}\n </span>\n ) : (\n <span className=\"mt-1.5 block h-1 overflow-hidden rounded-full bg-sidebar-accent\">\n <span\n className={cn(\n 'block h-full rounded-full transition-all',\n trial.endingSoon ? 'bg-warning' : 'bg-sidebar-foreground/70',\n )}\n style={{ width: `${pct}%` }}\n />\n </span>\n )}\n </Button>\n )\n}\n"]}
@@ -1,6 +1,6 @@
1
1
  import { useState, useMemo, useCallback, useRef } from 'react';
2
- import { FileSpreadsheet, Download, ArrowRight, Upload, AlertCircle, ArrowLeft, ChevronDown, Loader2, Check } from 'lucide-react';
3
- import { Modal, ModalContent, ModalHeader, ModalTitle, WizardSteps, ModalBody, Button, cn } from '@fayz-ai/ui';
2
+ import { FileSpreadsheet, Download, ArrowRight, Upload, AlertCircle, ArrowLeft, Loader2, Check } from 'lucide-react';
3
+ import { Modal, ModalContent, ModalHeader, ModalTitle, WizardSteps, ModalBody, Button, cn, Select, SelectTrigger, SelectValue, SelectContent, SelectItem, DataTable } from '@fayz-ai/ui';
4
4
  import { useTranslation } from '@fayz-ai/core';
5
5
  import { jsx, jsxs } from 'react/jsx-runtime';
6
6
 
@@ -232,6 +232,41 @@ function MappingStep({
232
232
  const [mapping, setMapping] = useState(initialMapping);
233
233
  const mappedCount = Array.from(mapping.values()).filter(Boolean).length;
234
234
  const previewRows = csv.rows.slice(0, 3);
235
+ const columns = [
236
+ {
237
+ id: "csv",
238
+ header: t("crud.import.csvColumn"),
239
+ meta: { className: "w-[35%]" },
240
+ cell: ({ row }) => /* @__PURE__ */ jsx("span", { className: "font-mono text-xs bg-muted px-1.5 py-0.5 rounded", children: row.original.header })
241
+ },
242
+ {
243
+ id: "arrow",
244
+ header: () => /* @__PURE__ */ jsx(ArrowRight, { className: "h-3.5 w-3.5 mx-auto text-muted-foreground" }),
245
+ meta: { className: "w-[10%] px-2 text-center" },
246
+ cell: () => /* @__PURE__ */ jsx(ArrowRight, { className: "h-3 w-3 mx-auto text-muted-foreground/50" })
247
+ },
248
+ {
249
+ id: "field",
250
+ header: t("crud.import.mapsTo"),
251
+ meta: { className: "w-[35%]" },
252
+ cell: ({ row: { original: { idx } } }) => {
253
+ const mapped = mapping.get(idx);
254
+ return /* @__PURE__ */ jsxs(Select, { value: mapped?.key ?? "__ignore__", onValueChange: (v) => handleSelect(idx, v), children: [
255
+ /* @__PURE__ */ jsx(SelectTrigger, { className: cn("h-8 px-2.5", mapped ? "text-foreground" : "text-muted-foreground"), children: /* @__PURE__ */ jsx(SelectValue, {}) }),
256
+ /* @__PURE__ */ jsxs(SelectContent, { children: [
257
+ /* @__PURE__ */ jsx(SelectItem, { value: "__ignore__", children: t("crud.import.skip") }),
258
+ fields.map((f) => /* @__PURE__ */ jsx(SelectItem, { value: f.key, children: f.label }, f.key))
259
+ ] })
260
+ ] });
261
+ }
262
+ },
263
+ {
264
+ id: "preview",
265
+ header: t("crud.import.preview"),
266
+ meta: { className: "w-[20%]" },
267
+ cell: ({ row }) => /* @__PURE__ */ jsx("span", { className: "text-xs text-muted-foreground truncate block max-w-[140px]", children: previewRows[0]?.[row.original.idx] ?? "\u2014" })
268
+ }
269
+ ];
235
270
  const handleSelect = (colIdx, fieldKey) => {
236
271
  setMapping((prev) => {
237
272
  const next = new Map(prev);
@@ -266,41 +301,7 @@ function MappingStep({
266
301
  ] }),
267
302
  /* @__PURE__ */ jsx("span", { className: "text-xs text-muted-foreground tabular-nums", children: t("crud.import.mappedCount", { count: String(mappedCount), total: String(csv.headers.length) }) })
268
303
  ] }),
269
- /* @__PURE__ */ jsx("div", { className: "overflow-x-auto border rounded-lg", children: /* @__PURE__ */ jsxs("table", { className: "w-full text-sm", children: [
270
- /* @__PURE__ */ jsx("thead", { children: /* @__PURE__ */ jsxs("tr", { className: "border-b bg-muted/50", children: [
271
- /* @__PURE__ */ jsx("th", { className: "text-left font-medium text-muted-foreground py-2.5 px-3 w-[35%]", children: t("crud.import.csvColumn") }),
272
- /* @__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" }) }),
273
- /* @__PURE__ */ jsx("th", { className: "text-left font-medium text-muted-foreground py-2.5 px-3 w-[35%]", children: t("crud.import.mapsTo") }),
274
- /* @__PURE__ */ jsx("th", { className: "text-left font-medium text-muted-foreground py-2.5 px-3 w-[20%]", children: t("crud.import.preview") })
275
- ] }) }),
276
- /* @__PURE__ */ jsx("tbody", { children: csv.headers.map((header, idx) => {
277
- const mapped = mapping.get(idx);
278
- return /* @__PURE__ */ jsxs("tr", { className: "border-b last:border-0", children: [
279
- /* @__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 }) }),
280
- /* @__PURE__ */ jsx("td", { className: "text-center px-2", children: /* @__PURE__ */ jsx(ArrowRight, { className: "h-3 w-3 mx-auto text-muted-foreground/50" }) }),
281
- /* @__PURE__ */ jsx("td", { className: "py-2 px-3", children: /* @__PURE__ */ jsxs("div", { className: "relative", children: [
282
- /* @__PURE__ */ jsxs(
283
- "select",
284
- {
285
- value: mapped?.key ?? "__ignore__",
286
- onChange: (e) => handleSelect(idx, e.target.value),
287
- className: cn(
288
- "w-full appearance-none rounded-md border bg-background px-2.5 py-1.5 pr-8 text-sm",
289
- "focus:outline-none focus:ring-2 focus:ring-ring",
290
- mapped ? "text-foreground" : "text-muted-foreground"
291
- ),
292
- children: [
293
- /* @__PURE__ */ jsx("option", { value: "__ignore__", children: t("crud.import.skip") }),
294
- fields.map((f) => /* @__PURE__ */ jsx("option", { value: f.key, children: f.label }, f.key))
295
- ]
296
- }
297
- ),
298
- /* @__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" })
299
- ] }) }),
300
- /* @__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" }) })
301
- ] }, idx);
302
- }) })
303
- ] }) }),
304
+ /* @__PURE__ */ jsx(DataTable, { variant: "flat", columns, data: csv.headers.map((header, idx) => ({ header, idx })), getRowId: (r) => String(r.idx) }),
304
305
  /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between pt-2", children: [
305
306
  /* @__PURE__ */ jsxs(Button, { variant: "ghost", onClick: onBack, children: [
306
307
  /* @__PURE__ */ jsx(ArrowLeft, { className: "h-4 w-4 mr-2" }),
@@ -481,5 +482,5 @@ function ImportWizard({ open, onClose, entityDef, onImport }) {
481
482
  }
482
483
 
483
484
  export { ImportWizard };
484
- //# sourceMappingURL=chunk-46UABOOC.js.map
485
- //# sourceMappingURL=chunk-46UABOOC.js.map
485
+ //# sourceMappingURL=chunk-5GCC7YCE.js.map
486
+ //# sourceMappingURL=chunk-5GCC7YCE.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/crud/ImportWizard.tsx"],"names":[],"mappings":"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","file":"chunk-5GCC7YCE.js","sourcesContent":["import React, { useState, useRef, useMemo, useCallback } from 'react'\nimport {\n Download, Upload, ArrowRight, ArrowLeft, Check, AlertCircle,\n Loader2, FileSpreadsheet, X,\n} from 'lucide-react'\nimport type { ColumnDef } from '@tanstack/react-table'\nimport {\n Button, DataTable, Modal, ModalContent, ModalHeader, ModalBody, ModalTitle,\n Select, SelectContent, SelectItem, SelectTrigger, SelectValue, WizardSteps, cn,\n} 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\nconst STEPS: ImportStep[] = ['download', 'upload', 'mapping', 'importing']\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 columns: ColumnDef<{ header: string; idx: number }>[] = [\n {\n id: 'csv',\n header: t('crud.import.csvColumn'),\n meta: { className: 'w-[35%]' },\n cell: ({ row }) => <span className=\"font-mono text-xs bg-muted px-1.5 py-0.5 rounded\">{row.original.header}</span>,\n },\n {\n id: 'arrow',\n header: () => <ArrowRight className=\"h-3.5 w-3.5 mx-auto text-muted-foreground\" />,\n meta: { className: 'w-[10%] px-2 text-center' },\n cell: () => <ArrowRight className=\"h-3 w-3 mx-auto text-muted-foreground/50\" />,\n },\n {\n id: 'field',\n header: t('crud.import.mapsTo'),\n meta: { className: 'w-[35%]' },\n cell: ({ row: { original: { idx } } }) => {\n const mapped = mapping.get(idx)\n return (\n <Select value={mapped?.key ?? '__ignore__'} onValueChange={(v) => handleSelect(idx, v)}>\n <SelectTrigger className={cn('h-8 px-2.5', mapped ? 'text-foreground' : 'text-muted-foreground')}>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"__ignore__\">{t('crud.import.skip')}</SelectItem>\n {fields.map((f) => (\n <SelectItem key={f.key} value={f.key}>{f.label}</SelectItem>\n ))}\n </SelectContent>\n </Select>\n )\n },\n },\n {\n id: 'preview',\n header: t('crud.import.preview'),\n meta: { className: 'w-[20%]' },\n cell: ({ row }) => (\n <span className=\"text-xs text-muted-foreground truncate block max-w-[140px]\">\n {previewRows[0]?.[row.original.idx] ?? '—'}\n </span>\n ),\n },\n ]\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 <DataTable variant=\"flat\" columns={columns} data={csv.headers.map((header, idx) => ({ header, idx }))} getRowId={(r) => String(r.idx)} />\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 const wizardSteps = [\n { id: 'download', label: t('crud.import.step.download') },\n { id: 'upload', label: t('crud.import.step.upload') },\n { id: 'mapping', label: t('crud.import.step.mapping') },\n { id: 'importing', label: t('crud.import.step.importing') },\n ]\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 <WizardSteps steps={wizardSteps} current={STEPS.indexOf(step === 'done' ? 'importing' : 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"]}
@@ -5,6 +5,8 @@ import * as LucideIcons from 'lucide-react';
5
5
  import { ChevronRight } from 'lucide-react';
6
6
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
7
7
 
8
+ // src/timeline/PersonTimeline.tsx
9
+
8
10
  // src/timeline/registry.ts
9
11
  var sources = /* @__PURE__ */ new Map();
10
12
  function registerTimelineSource(source) {
@@ -16,6 +18,8 @@ function unregisterTimelineSource(id) {
16
18
  function getTimelineSources() {
17
19
  return Array.from(sources.values());
18
20
  }
21
+
22
+ // src/timeline/usePersonTimeline.ts
19
23
  var DEFAULT_PAGE_SIZE = 20;
20
24
  function newestFirst(a, b) {
21
25
  return new Date(b.occurredAt).getTime() - new Date(a.occurredAt).getTime();
@@ -238,11 +242,13 @@ function PersonTimeline({
238
242
  (chip) => {
239
243
  const active = chip.id ? activeSourceIds?.length === 1 && activeSourceIds[0] === chip.id : !activeSourceIds;
240
244
  return /* @__PURE__ */ jsx(
241
- "button",
245
+ Button,
242
246
  {
247
+ variant: "bare",
248
+ size: "bare",
243
249
  type: "button",
244
250
  onClick: () => setActiveSourceIds(chip.id ? [chip.id] : void 0),
245
- className: `rounded-full border px-2.5 py-1 text-xs transition-colors ${active ? "border-primary bg-primary/10 text-primary" : "border-border text-muted-foreground hover:bg-muted hover:text-foreground"}`,
251
+ className: `font-normal rounded-full border px-2.5 py-1 text-xs transition-colors ${active ? "border-primary bg-primary/10 text-primary" : "border-border text-muted-foreground hover:bg-muted hover:text-foreground"}`,
246
252
  children: chip.label
247
253
  },
248
254
  chip.id ?? "__all__"
@@ -266,5 +272,5 @@ function PersonTimeline({
266
272
  }
267
273
 
268
274
  export { PersonTimeline, TimelineList, TimelineSkeleton, getTimelineSources, registerTimelineSource, unregisterTimelineSource, usePersonTimeline };
269
- //# sourceMappingURL=chunk-WXNTUCX3.js.map
270
- //# sourceMappingURL=chunk-WXNTUCX3.js.map
275
+ //# sourceMappingURL=chunk-E4MESMNR.js.map
276
+ //# sourceMappingURL=chunk-E4MESMNR.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/timeline/registry.ts","../src/timeline/usePersonTimeline.ts","../src/timeline/TimelineList.tsx","../src/timeline/PersonTimeline.tsx"],"names":["sources","useState","jsx","jsxs","Card","CardContent"],"mappings":"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","file":"chunk-E4MESMNR.js","sourcesContent":["import type { TimelineSource } from './types'\n\n/**\n * Quem contribui para a linha do tempo de uma pessoa.\n *\n * Registro de módulo, e não contexto de React: os plugins registram no momento\n * em que a fábrica deles roda (`createScribePlugin(...)` dentro do\n * `defineSaas`), que é antes de qualquer árvore montar. Um contexto obrigaria\n * cada app a lembrar de embrulhar a aba num provider — e \"funciona se você\n * lembrou\" é o oposto do que este registro existe para dar.\n */\nconst sources = new Map<string, TimelineSource>()\n\nexport function registerTimelineSource(source: TimelineSource): void {\n // Idempotente: em dev o módulo do plugin recarrega com o HMR, e uma segunda\n // fonte com o mesmo id duplicaria cada evento na tela.\n sources.set(source.id, source)\n}\n\nexport function unregisterTimelineSource(id: string): void {\n sources.delete(id)\n}\n\nexport function getTimelineSources(): TimelineSource[] {\n return Array.from(sources.values())\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport { getActiveTenantId } from '@fayz-ai/core'\nimport { getTimelineSources } from './registry'\nimport type { TimelineItem, TimelineSource } from './types'\n\nconst DEFAULT_PAGE_SIZE = 20\n\nfunction newestFirst(a: TimelineItem, b: TimelineItem): number {\n return new Date(b.occurredAt).getTime() - new Date(a.occurredAt).getTime()\n}\n\nexport interface UsePersonTimelineResult {\n items: TimelineItem[]\n sources: TimelineSource[]\n loading: boolean\n loadingMore: boolean\n hasMore: boolean\n loadMore: () => void\n reload: () => void\n}\n\n/**\n * Intercala as fontes registradas numa lista só, em ordem.\n *\n * O ponto todo é a paginação. A versão ingênua pede N de cada fonte e corta o\n * resultado — e aí a fonte volumosa esconde a outra: com 30 agendamentos e um\n * pagamento de hoje, o pagamento não aparece, porque o corte veio depois de os\n * agendamentos já terem enchido a lista. Aqui cada página pergunta a TODAS as\n * fontes \"o que você tem antes deste instante\", junta, ordena e corta; a\n * próxima página repete a pergunta a partir da data do último item mostrado.\n * Assim nenhuma fonte esconde a outra, por mais desbalanceadas que sejam.\n */\nexport function usePersonTimeline({\n personId,\n pageSize = DEFAULT_PAGE_SIZE,\n activeSourceIds,\n}: {\n personId: string\n pageSize?: number\n /** Filtro por tipo. Ausente = todas. */\n activeSourceIds?: string[]\n}): UsePersonTimelineResult {\n const allSources = useMemo(() => getTimelineSources(), [])\n const sources = useMemo(\n () => (activeSourceIds ? allSources.filter((s) => activeSourceIds.includes(s.id)) : allSources),\n [allSources, activeSourceIds],\n )\n\n const [items, setItems] = useState<TimelineItem[]>([])\n const [loading, setLoading] = useState(true)\n const [loadingMore, setLoadingMore] = useState(false)\n const [hasMore, setHasMore] = useState(false)\n\n // Cortar por data faz o mesmo evento poder voltar na página seguinte (dois\n // eventos no mesmo instante, relógios diferentes). O id é o que decide.\n const seen = useRef<Set<string>>(new Set())\n // Muda a cada recarga: uma resposta de uma busca abandonada não pode\n // sobrescrever a lista da busca atual.\n const runId = useRef(0)\n\n const tenantId = getActiveTenantId() ?? ''\n\n const fetchPage = useCallback(\n async (before: string | undefined, run: number): Promise<{ page: TimelineItem[]; more: boolean }> => {\n // `limit + 1` para saber se ainda tem, sem uma segunda ida ao banco.\n const wanted = pageSize + 1\n const results = await Promise.all(\n sources.map((source) =>\n source\n .fetch({ personId, tenantId, before, limit: wanted })\n // Uma fonte que falha vira lista vazia: a linha do tempo inteira não\n // pode sumir porque um plugin quebrou.\n .catch((err) => {\n console.warn(`[timeline] source \"${source.id}\" failed`, err)\n return [] as TimelineItem[]\n }),\n ),\n )\n\n if (run !== runId.current) return { page: [], more: false }\n\n const merged = results\n .flat()\n .filter((item) => item.occurredAt && !seen.current.has(item.id))\n .sort(newestFirst)\n\n const page = merged.slice(0, pageSize)\n for (const item of page) seen.current.add(item.id)\n\n // Ainda tem se sobrou no bolo já lido, OU se alguma fonte devolveu o\n // limite cheio (sinal de que ela tem mais atrás).\n const more = merged.length > page.length || results.some((r) => r.length >= wanted)\n return { page, more }\n },\n [sources, personId, tenantId, pageSize],\n )\n\n const reload = useCallback(() => {\n const run = ++runId.current\n seen.current = new Set()\n setLoading(true)\n void fetchPage(undefined, run).then(({ page, more }) => {\n if (run !== runId.current) return\n setItems(page)\n setHasMore(more)\n setLoading(false)\n })\n }, [fetchPage])\n\n useEffect(() => {\n if (!personId || !tenantId || sources.length === 0) {\n setItems([])\n setHasMore(false)\n setLoading(false)\n return\n }\n reload()\n }, [personId, tenantId, sources, reload])\n\n const loadMore = useCallback(() => {\n const last = items[items.length - 1]\n if (!last || loadingMore) return\n const run = runId.current\n setLoadingMore(true)\n void fetchPage(last.occurredAt, run).then(({ page, more }) => {\n if (run !== runId.current) return\n setItems((prev) => [...prev, ...page])\n setHasMore(more && page.length > 0)\n setLoadingMore(false)\n })\n }, [items, loadingMore, fetchPage])\n\n return { items, sources: allSources, loading, loadingMore, hasMore, loadMore, reload }\n}\n","import React from 'react'\nimport * as LucideIcons from 'lucide-react'\nimport type { LucideIcon } from 'lucide-react'\nimport { ChevronRight } from 'lucide-react'\nimport { Badge, Card, CardContent } from '@fayz-ai/ui'\nimport type { TimelineItem, TimelineTone } from './types'\n\n// ---------------------------------------------------------------------------\n// O DESENHO da linha do tempo, sem de onde os itens vieram.\n//\n// Separado da `PersonTimeline` porque o desenho passou a ter DOIS consumidores:\n// a aba Atividade (que intercala sete fontes) e a aba Registros (que lista as\n// respostas de formulário da própria pessoa). Uma ficha clínica que mostrasse\n// duas listas com formas diferentes para a mesma pergunta — \"o que aconteceu,\n// em ordem\" — obrigaria a reaprender a leitura ao trocar de aba.\n//\n// Aqui não há consulta, paginação nem filtro: quem monta a lista é quem sabe de\n// onde ela vem.\n// ---------------------------------------------------------------------------\n\n// Tom → tokens do tema. Um lugar só: é isto que faz uma fonte nova herdar\n// claro/escuro e a paleta do app sem escrever uma cor.\nconst TONE_CLASSES: Record<TimelineTone, string> = {\n neutral: 'bg-muted text-muted-foreground',\n info: 'bg-info-soft text-info-soft-foreground',\n success: 'bg-success-soft text-success-soft-foreground',\n warning: 'bg-warning-soft text-warning-soft-foreground',\n magic: 'bg-magic-soft text-magic-soft-foreground',\n primary: 'bg-primary/10 text-primary',\n rose: 'bg-destructive-soft text-destructive-soft-foreground',\n}\n\nfunction resolveIcon(name?: string): LucideIcon {\n const icons = LucideIcons as unknown as Record<string, LucideIcon | undefined>\n const icon = name ? icons[name] : undefined\n return (typeof icon === 'function' || typeof icon === 'object' ? icon : undefined) ?? LucideIcons.CircleDashed\n}\n\nfunction formatWhen(value: string): string {\n try {\n return new Intl.DateTimeFormat(undefined, {\n day: '2-digit',\n month: 'short',\n year: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n }).format(new Date(value))\n } catch {\n return value\n }\n}\n\n/**\n * O trilho + a bolha, numa coluna fixa à esquerda. Mesma grade no esqueleto e\n * no item real, para a chegada do conteúdo ser troca de cinza por texto e não a\n * lista mudando de forma.\n *\n * Flex com largura fixa, e não `grid-cols-[…]`: uma utility arbitrária que só\n * existe neste arquivo não chega a ser gerada no CSS do app, e o sintoma não é\n * erro nenhum — é a linha do tempo empilhada, bolha centrada e cartão embaixo.\n * O trilho vira segmento de flex pela mesma razão: nada de posição absoluta\n * dependendo de uma coluna que pode não existir.\n */\nfunction Rail({ first, last, children }: { first: boolean; last: boolean; children: React.ReactNode }) {\n return (\n <div className=\"flex w-11 shrink-0 flex-col items-center\">\n {/* Invisível no primeiro: o espaço continua, para todas as bolhas\n começarem na mesma altura do cartão ao lado. */}\n <span className={`h-4 w-px ${first ? '' : 'bg-border'}`} aria-hidden />\n <div className=\"flex h-10 w-10 items-center justify-center rounded-full border border-border bg-background shadow-sm\">\n {children}\n </div>\n {!last && <span className=\"w-px flex-1 bg-border\" aria-hidden />}\n </div>\n )\n}\n\nfunction TimelineSkeleton() {\n return (\n <ol className=\"space-y-0\" aria-hidden>\n {[0, 1, 2].map((row, index) => (\n <li key={row} className=\"flex gap-4\">\n <Rail first={index === 0} last={index === 2}>\n <div className=\"h-7 w-7 animate-pulse rounded-full bg-muted\" />\n </Rail>\n <Card className={`min-w-0 flex-1 ${index === 2 ? 'mb-0' : 'mb-4'}`}>\n <CardContent className=\"p-4\">\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"min-w-0 flex-1 space-y-2\">\n <div className=\"h-5 w-20 animate-pulse rounded-full bg-muted\" />\n {/* Larguras diferentes por linha: três barras idênticas leem\n como padrão gráfico, não como texto carregando. */}\n <div className={`h-4 animate-pulse rounded bg-muted ${index === 1 ? 'w-1/2' : 'w-2/3'}`} />\n </div>\n <div className=\"h-3 w-24 shrink-0 animate-pulse rounded bg-muted\" />\n </div>\n </CardContent>\n </Card>\n </li>\n ))}\n </ol>\n )\n}\n\nfunction TimelineRow({\n item,\n tone,\n href,\n onSelect,\n actions,\n preview,\n first,\n last,\n}: {\n item: TimelineItem\n tone: TimelineTone\n href?: string\n onSelect?: (item: TimelineItem) => void\n actions?: React.ReactNode\n /** O conteúdo do registro, aberto DENTRO do cartão. Ver `renderPreview`. */\n preview?: React.ReactNode\n first: boolean\n last: boolean\n}) {\n const clickable = Boolean(href) || Boolean(onSelect)\n const Icon = resolveIcon(item.icon)\n const card = (\n <Card\n className={`group ${last ? 'mb-0' : 'mb-4'} ${\n // O cursor e a sombra só existem quando há para onde ir: é o que\n // distingue, ANTES do clique, o que é atalho do que é só registro.\n clickable ? 'cursor-pointer transition-shadow hover:shadow-md' : ''\n }`}\n {...(!href && onSelect ? { onClick: () => onSelect(item) } : {})}\n >\n <div className=\"flex items-stretch\">\n <CardContent className=\"min-w-0 flex-1 p-4\">\n <div className=\"flex min-w-0 flex-col gap-3 sm:flex-row sm:items-start sm:justify-between\">\n <div className=\"min-w-0\">\n {item.badge && <Badge variant=\"secondary\">{item.badge}</Badge>}\n <h3 className={`truncate text-sm font-semibold text-foreground ${item.badge ? 'mt-2' : ''}`}>\n {item.title}\n </h3>\n </div>\n <div className=\"flex shrink-0 items-center gap-1\">\n <time className=\"text-xs font-medium text-muted-foreground\">{formatWhen(item.occurredAt)}</time>\n {/* Os verbos da linha aparecem no hover, como no resto do SDK: uma\n fileira de ícones sempre visível transforma a lista num painel\n de botões e rouba a leitura do que aconteceu. */}\n {actions && (\n <div className=\"flex gap-0.5 opacity-0 transition-opacity group-hover:opacity-100 focus-within:opacity-100\">\n {actions}\n </div>\n )}\n </div>\n </div>\n {item.description && (\n <p className=\"mt-2 whitespace-pre-wrap text-sm leading-6 text-muted-foreground\">{item.description}</p>\n )}\n {/* O conteúdo, aberto no lugar. Separado por uma régua porque sem ela\n o corpo do formulário encosta no título e os dois viram um bloco\n só de texto. */}\n {preview && (\n <div\n className=\"mt-3 border-t border-border pt-3\"\n // O cartão inteiro é clicável; o conteúdo dentro dele não pode\n // abrir a tela cheia ao encostar numa palavra — nem impedir que se\n // selecione um trecho para copiar.\n onClick={(e) => e.stopPropagation()}\n >\n {preview}\n </div>\n )}\n </CardContent>\n\n {/* A SETA que promete o clique.\n Estava em cima, na fileira de ações, como mais um ícone entre outros —\n e um botão \"abrir\" ao lado de um \"ocultar\" faz o leitor escolher entre\n dois verbos quando o gesto natural é clicar no cartão. À direita e no\n meio da altura, ela diz o que o cartão inteiro faz, em vez de\n concorrer com ele. O espaço fica reservado sempre: aparecer no hover\n empurrando o texto seria pior do que não aparecer. */}\n {clickable && (\n <div className=\"flex shrink-0 items-center pr-4 opacity-0 transition-opacity group-hover:opacity-100\">\n <ChevronRight className=\"h-6 w-6 text-muted-foreground\" aria-hidden />\n </div>\n )}\n </div>\n </Card>\n )\n\n return (\n <li className=\"flex gap-4\">\n <Rail first={first} last={last}>\n <div className={`flex h-7 w-7 items-center justify-center rounded-full ${TONE_CLASSES[tone]}`}>\n <Icon className=\"h-4 w-4\" />\n </div>\n </Rail>\n <div className=\"min-w-0 flex-1\">\n {/* `<a>` de verdade, e não um onClick: o clique do meio abre em outra\n aba, o hover mostra o destino na barra de status, e o teclado alcança\n sem nada além do HTML. */}\n {href ? <a href={href} className=\"block no-underline\">{card}</a> : card}\n </div>\n </li>\n )\n}\n\n\n/**\n * A lista: trilho, bolha e cartão, do jeito que a ficha inteira mostra\n * histórico.\n *\n * `renderActions` é a única costura que a aba Registros precisou: ver e\n * arquivar um documento são verbos DAQUELA aba, e a Atividade — que é leitura —\n * não tem nenhum.\n */\nexport function TimelineList({\n items,\n toneFor,\n hrefFor,\n onSelect,\n renderActions,\n renderPreview,\n expandedIds,\n}: {\n items: TimelineItem[]\n /** Tom da bolha quando o item não declara o seu. */\n toneFor?: (item: TimelineItem) => TimelineTone\n hrefFor?: (item: TimelineItem) => string | undefined\n /** Clique no cartão quando ele não é um link — o caso da aba Registros, que\n * abre o documento na própria aba em vez de navegar. */\n onSelect?: (item: TimelineItem) => void\n renderActions?: (item: TimelineItem) => React.ReactNode\n /**\n * O conteúdo do item, aberto dentro do cartão — para ler sem clicar.\n *\n * Só é chamado para o que `expandedIds` mandar abrir: montar o corpo de cem\n * formulários para esconder noventa e nove custa a rolagem inteira.\n */\n renderPreview?: (item: TimelineItem) => React.ReactNode\n /** Quais itens estão abertos. Ausente = nenhum. */\n expandedIds?: ReadonlySet<string>\n}) {\n return (\n <ol className=\"space-y-0\">\n {items.map((item, index) => (\n <TimelineRow\n key={item.id}\n item={item}\n // Item ganha do padrão: um evento que foge da regra da fonte dele\n // (uma exclusão dentro de \"Cadastro\") pode dizer o seu.\n tone={item.tone ?? toneFor?.(item) ?? 'neutral'}\n href={hrefFor?.(item)}\n onSelect={onSelect}\n actions={renderActions?.(item)}\n preview={expandedIds?.has(item.id) ? renderPreview?.(item) : undefined}\n first={index === 0}\n last={index === items.length - 1}\n />\n ))}\n </ol>\n )\n}\n\nexport { TimelineSkeleton }\n","import React, { useState } from 'react'\nimport { Button, Card, CardContent } from '@fayz-ai/ui'\nimport { usePersonTimeline } from './usePersonTimeline'\nimport { TimelineList, TimelineSkeleton } from './TimelineList'\nimport type { TimelineItem } from './types'\n// Importing the component registers the core sources; there is no separate install step.\nimport './core-sources'\n\n/**\n * A linha do tempo de uma pessoa, montada a partir das fontes registradas.\n *\n * Genérico de propósito, em `packages/admin` e não no app: \"o que aconteceu com\n * esta pessoa\" não é específico de salão — a mesma tela serve aluno, paciente e\n * cliente. O app só monta.\n */\nexport function PersonTimeline({\n personId,\n pageSize,\n recordPath,\n}: {\n personId: string\n pageSize?: number\n /**\n * A rota da ficha desta pessoa (`/clients/8e48…`), que é o app quem sabe.\n *\n * Com ela, cada item vira atalho para a aba onde o evento mora — clicar num\n * pagamento abre o Extrato, clicar numa gravação abre Gravações. Sem ela a\n * linha do tempo funciona igual, só não navega: é degradação, não erro.\n */\n recordPath?: string\n}) {\n const [activeSourceIds, setActiveSourceIds] = useState<string[] | undefined>(undefined)\n const { items, sources, loading, loadingMore, hasMore, loadMore } = usePersonTimeline({\n personId,\n pageSize,\n activeSourceIds,\n })\n\n const toneBySource = React.useMemo(\n () => new Map(sources.map((s) => [s.id, s.tone ?? 'neutral'] as const)),\n [sources],\n )\n\n const hrefFor = React.useCallback(\n (item: TimelineItem): string | undefined => {\n if (item.href) return item.href\n if (!recordPath || !item.targetTab) return undefined\n // Mesma forma de rota que o CrudDetailPage usa ao trocar de aba, para o\n // link cair exatamente onde a aba clicada à mão cairia.\n return `#${recordPath}/${item.targetTab}`\n },\n [recordPath],\n )\n\n // Com seis fontes numa base antiga, a lista única fica ilegível. As pastilhas\n // são de seleção ÚNICA (Tudo, ou um tipo): multi-seleção pareceria mais\n // poderosa e na prática vira um estado que ninguém consegue ler de relance.\n const filters = sources.length > 1 && (\n <div className=\"flex flex-wrap gap-1.5\">\n {[{ id: undefined, label: 'Tudo' }, ...sources.map((s) => ({ id: s.id as string | undefined, label: s.label }))].map(\n (chip) => {\n const active = chip.id\n ? activeSourceIds?.length === 1 && activeSourceIds[0] === chip.id\n : !activeSourceIds\n return (\n <Button\n variant=\"bare\"\n size=\"bare\"\n key={chip.id ?? '__all__'}\n type=\"button\"\n onClick={() => setActiveSourceIds(chip.id ? [chip.id] : undefined)}\n className={`font-normal rounded-full border px-2.5 py-1 text-xs transition-colors ${\n active\n ? 'border-primary bg-primary/10 text-primary'\n : 'border-border text-muted-foreground hover:bg-muted hover:text-foreground'\n }`}\n >\n {chip.label}\n </Button>\n )\n },\n )}\n </div>\n )\n\n return (\n <div className=\"space-y-4\">\n {filters}\n\n {loading ? (\n <TimelineSkeleton />\n ) : items.length === 0 ? (\n <Card>\n <CardContent className=\"flex min-h-40 items-center justify-center p-6 text-sm text-muted-foreground\">\n {activeSourceIds\n ? 'Nada deste tipo no histórico desta pessoa.'\n : 'Ainda não há histórico para esta pessoa.'}\n </CardContent>\n </Card>\n ) : (\n <>\n <TimelineList\n items={items}\n // Item ganha da fonte: um evento que foge da regra dela (uma\n // exclusão dentro de \"Cadastro\") pode dizer o seu — o próprio\n // TimelineList resolve essa precedência.\n toneFor={(item) => toneBySource.get(item.sourceId) ?? 'neutral'}\n hrefFor={hrefFor}\n />\n {hasMore && (\n <div className=\"flex justify-center\">\n <Button variant=\"outline\" size=\"sm\" disabled={loadingMore} onClick={loadMore}>\n {loadingMore ? 'Carregando…' : 'Carregar mais'}\n </Button>\n </div>\n )}\n </>\n )}\n </div>\n )\n}\n"]}