@stackcraftmx/calcita 0.23.0 → 0.26.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 (403) hide show
  1. package/README.md +127 -22
  2. package/cli/projectFiles.js +5 -3
  3. package/cli/templates/project/README.md.tpl +28 -0
  4. package/cli/templates/project/public/manifest.webmanifest.tpl +6 -6
  5. package/cli/templates/project/src/app/AppProviders.jsx.tpl +9 -4
  6. package/cli/templates/project/src/app/appRouter.jsx.tpl +4 -2
  7. package/cli/templates/project/src/app/appSettings.js.tpl +14 -0
  8. package/cli/templates/project/src/core/AppLogo.jsx.tpl +3 -1
  9. package/cli/templates/project/src/core/index.js.tpl +1 -0
  10. package/cli/templates/project/src/core/publicPaths.js.tpl +24 -0
  11. package/cli/templates/project/vite.config.js.tpl +27 -1
  12. package/dist/DataTable/AuditTrailTable.js +5 -3
  13. package/dist/DataTable/AuditTrailTable.js.map +1 -1
  14. package/dist/DataTable/ColumnFilters/MultiSelectColumnFilter.js +2 -1
  15. package/dist/DataTable/ColumnFilters/MultiSelectColumnFilter.js.map +1 -1
  16. package/dist/DataTable/EmptyState.js +2 -2
  17. package/dist/DataTable/EmptyState.js.map +1 -1
  18. package/dist/DataTable/FilterChips.js +2 -2
  19. package/dist/DataTable/FilterChips.js.map +1 -1
  20. package/dist/DataTable/GoToPage.js +4 -3
  21. package/dist/DataTable/GoToPage.js.map +1 -1
  22. package/dist/DataTable/ServerTable.js +153 -83
  23. package/dist/DataTable/ServerTable.js.map +1 -1
  24. package/dist/DataTable/rowSelection.js +61 -0
  25. package/dist/DataTable/rowSelection.js.map +1 -0
  26. package/dist/access/PermissionMatrix.js +3 -2
  27. package/dist/access/PermissionMatrix.js.map +1 -1
  28. package/dist/account/AccountSecuritySection.js +2 -2
  29. package/dist/account/AccountSecuritySection.js.map +1 -1
  30. package/dist/account/ForgotPasswordScreen.js +5 -4
  31. package/dist/account/ForgotPasswordScreen.js.map +1 -1
  32. package/dist/account/ProfileScreen.js +39 -13
  33. package/dist/account/ProfileScreen.js.map +1 -1
  34. package/dist/account/ResetPasswordScreen.js +3 -2
  35. package/dist/account/ResetPasswordScreen.js.map +1 -1
  36. package/dist/account/SignInScreen.js +7 -6
  37. package/dist/account/SignInScreen.js.map +1 -1
  38. package/dist/account/accountConnector.js.map +1 -1
  39. package/dist/account/restAccountConnector.js +2 -1
  40. package/dist/account/restAccountConnector.js.map +1 -1
  41. package/dist/adapters/reactRouterRoutes.js +7 -6
  42. package/dist/adapters/reactRouterRoutes.js.map +1 -1
  43. package/dist/api/createApiClient.js +40 -5
  44. package/dist/api/createApiClient.js.map +1 -1
  45. package/dist/appShell/AccountMenu.js +15 -23
  46. package/dist/appShell/AccountMenu.js.map +1 -1
  47. package/dist/appShell/AppLayout.js +42 -15
  48. package/dist/appShell/AppLayout.js.map +1 -1
  49. package/dist/appShell/AppearanceSettings.js +29 -6
  50. package/dist/appShell/AppearanceSettings.js.map +1 -1
  51. package/dist/appShell/AuthLayout.js +2 -0
  52. package/dist/appShell/AuthLayout.js.map +1 -1
  53. package/dist/appShell/BarActionButton.js +3 -3
  54. package/dist/appShell/BarActionButton.js.map +1 -1
  55. package/dist/appShell/BarActions.js +19 -8
  56. package/dist/appShell/BarActions.js.map +1 -1
  57. package/dist/appShell/BarCapsule.js +19 -4
  58. package/dist/appShell/BarCapsule.js.map +1 -1
  59. package/dist/appShell/BarSearch.js +92 -0
  60. package/dist/appShell/BarSearch.js.map +1 -0
  61. package/dist/appShell/HeaderTools.js +4 -2
  62. package/dist/appShell/HeaderTools.js.map +1 -1
  63. package/dist/appShell/MenuLinks.js +36 -0
  64. package/dist/appShell/MenuLinks.js.map +1 -0
  65. package/dist/appShell/MobileTabBar.js +6 -4
  66. package/dist/appShell/MobileTabBar.js.map +1 -1
  67. package/dist/appShell/SettingsMenu.js +10 -5
  68. package/dist/appShell/SettingsMenu.js.map +1 -1
  69. package/dist/appShell/SideMenu.js +5 -3
  70. package/dist/appShell/SideMenu.js.map +1 -1
  71. package/dist/appShell/SideMenuEntry.js +3 -3
  72. package/dist/appShell/SideMenuEntry.js.map +1 -1
  73. package/dist/appShell/SubmenuActionsMenu.js +3 -4
  74. package/dist/appShell/SubmenuActionsMenu.js.map +1 -1
  75. package/dist/appShell/TopMenu.js +5 -6
  76. package/dist/appShell/TopMenu.js.map +1 -1
  77. package/dist/appShell/Wordmark.js +11 -0
  78. package/dist/appShell/Wordmark.js.map +1 -0
  79. package/dist/appShell/menuItemText.js +4 -0
  80. package/dist/appShell/menuItemText.js.map +1 -1
  81. package/dist/appShell/shellSizes.js +2 -0
  82. package/dist/appShell/shellSizes.js.map +1 -1
  83. package/dist/auth/PasswordChecklist.js +2 -2
  84. package/dist/auth/PasswordChecklist.js.map +1 -1
  85. package/dist/calendar/EventCalendar.js +16 -5
  86. package/dist/calendar/EventCalendar.js.map +1 -1
  87. package/dist/calendar/EventDetails.js +74 -0
  88. package/dist/calendar/EventDetails.js.map +1 -0
  89. package/dist/calendar/calendarEvents.js +31 -0
  90. package/dist/calendar/calendarEvents.js.map +1 -0
  91. package/dist/calendar.js +8 -1
  92. package/dist/calendar.js.map +1 -1
  93. package/dist/charts.js +10 -1
  94. package/dist/charts.js.map +1 -1
  95. package/dist/datePickers/DateInput.js +3 -2
  96. package/dist/datePickers/DateInput.js.map +1 -1
  97. package/dist/downloads/DownloadManager.js +14 -20
  98. package/dist/downloads/DownloadManager.js.map +1 -1
  99. package/dist/downloads/downloadQueue.js +4 -2
  100. package/dist/downloads/downloadQueue.js.map +1 -1
  101. package/dist/downloads/downloadsMachine.js +4 -1
  102. package/dist/downloads/downloadsMachine.js.map +1 -1
  103. package/dist/downloads/fileTypes.js +22 -0
  104. package/dist/downloads/fileTypes.js.map +1 -0
  105. package/dist/feedback/ConfirmDialog.js +3 -2
  106. package/dist/feedback/ConfirmDialog.js.map +1 -1
  107. package/dist/feedback/ModalWaiting.js +2 -2
  108. package/dist/feedback/ModalWaiting.js.map +1 -1
  109. package/dist/feedback/NewBuildNotice.js +2 -2
  110. package/dist/feedback/NewBuildNotice.js.map +1 -1
  111. package/dist/filepond/FileDropzone.js +5 -3
  112. package/dist/filepond/FileDropzone.js.map +1 -1
  113. package/dist/formatting.js +171 -143
  114. package/dist/formatting.js.map +1 -1
  115. package/dist/forms/FormWizard.js +18 -45
  116. package/dist/forms/FormWizard.js.map +1 -1
  117. package/dist/forms/auth/ChangePasswordForm.js +5 -4
  118. package/dist/forms/auth/ChangePasswordForm.js.map +1 -1
  119. package/dist/forms/auth/ForgotPasswordForm.js +2 -2
  120. package/dist/forms/auth/ForgotPasswordForm.js.map +1 -1
  121. package/dist/forms/auth/SignInForm.js +2 -2
  122. package/dist/forms/auth/SignInForm.js.map +1 -1
  123. package/dist/forms/security/SecondStepForm.js +2 -2
  124. package/dist/forms/security/SecondStepForm.js.map +1 -1
  125. package/dist/forms/security/TwoStepVerificationCard.js +8 -6
  126. package/dist/forms/security/TwoStepVerificationCard.js.map +1 -1
  127. package/dist/hookForm/FormWizard.js +59 -0
  128. package/dist/hookForm/FormWizard.js.map +1 -0
  129. package/dist/inbox/InboxLayout.js +44 -8
  130. package/dist/inbox/InboxLayout.js.map +1 -1
  131. package/dist/inbox/MessageList.js +71 -21
  132. package/dist/inbox/MessageList.js.map +1 -1
  133. package/dist/inbox/MessageView.js +80 -29
  134. package/dist/inbox/MessageView.js.map +1 -1
  135. package/dist/inbox/inboxDates.js +4 -3
  136. package/dist/inbox/inboxDates.js.map +1 -1
  137. package/dist/index.js +163 -136
  138. package/dist/index.js.map +1 -1
  139. package/dist/inputs/CatalogInput.js +8 -4
  140. package/dist/inputs/CatalogInput.js.map +1 -1
  141. package/dist/inputs/ColorInput.js +3 -2
  142. package/dist/inputs/ColorInput.js.map +1 -1
  143. package/dist/inputs/FormSection.js +3 -3
  144. package/dist/inputs/FormSection.js.map +1 -1
  145. package/dist/inputs/NumberInput.js +3 -2
  146. package/dist/inputs/NumberInput.js.map +1 -1
  147. package/dist/inputs/SelectInput.js +29 -11
  148. package/dist/inputs/SelectInput.js.map +1 -1
  149. package/dist/inputs/TextInput.js +6 -2
  150. package/dist/inputs/TextInput.js.map +1 -1
  151. package/dist/inputs/WizardLayout.js +54 -0
  152. package/dist/inputs/WizardLayout.js.map +1 -0
  153. package/dist/kanban/KanbanBoard.js +239 -14
  154. package/dist/kanban/KanbanBoard.js.map +1 -1
  155. package/dist/kanban/kanbanCards.js +19 -0
  156. package/dist/kanban/kanbanCards.js.map +1 -0
  157. package/dist/kanban.js +7 -1
  158. package/dist/kanban.js.map +1 -1
  159. package/dist/locales/en.js +74 -1
  160. package/dist/locales/en.js.map +1 -1
  161. package/dist/locales/es.js +74 -1
  162. package/dist/locales/es.js.map +1 -1
  163. package/dist/maps/MapView.js +28 -8
  164. package/dist/maps/MapView.js.map +1 -1
  165. package/dist/navigation/appMenu.js +13 -1
  166. package/dist/navigation/appMenu.js.map +1 -1
  167. package/dist/observability/logger.js +18 -0
  168. package/dist/observability/logger.js.map +1 -1
  169. package/dist/observability/usePublishedBuildWatch.js +4 -3
  170. package/dist/observability/usePublishedBuildWatch.js.map +1 -1
  171. package/dist/pwa/InstallAppSetting.js +6 -5
  172. package/dist/pwa/InstallAppSetting.js.map +1 -1
  173. package/dist/pwa/InstallInstructionsDialog.js +2 -2
  174. package/dist/pwa/InstallInstructionsDialog.js.map +1 -1
  175. package/dist/pwa/InstallPromptBanner.js +15 -9
  176. package/dist/pwa/InstallPromptBanner.js.map +1 -1
  177. package/dist/pwa/useInstallPrompt.js +2 -1
  178. package/dist/pwa/useInstallPrompt.js.map +1 -1
  179. package/dist/react-hook-form.js +6 -4
  180. package/dist/react-hook-form.js.map +1 -1
  181. package/dist/security/ActivityLog.js +4 -3
  182. package/dist/security/ActivityLog.js.map +1 -1
  183. package/dist/security/RecoveryCodesDialog.js +4 -3
  184. package/dist/security/RecoveryCodesDialog.js.map +1 -1
  185. package/dist/security/SessionsCard.js +8 -6
  186. package/dist/security/SessionsCard.js.map +1 -1
  187. package/dist/table.js +2 -0
  188. package/dist/table.js.map +1 -1
  189. package/dist/theme/components/MuiAppBar.js +6 -5
  190. package/dist/theme/components/MuiAppBar.js.map +1 -1
  191. package/dist/theme/components/MuiDialog.js +13 -0
  192. package/dist/theme/components/MuiDialog.js.map +1 -0
  193. package/dist/theme/components/glassComponents.js +32 -31
  194. package/dist/theme/components/glassComponents.js.map +1 -1
  195. package/dist/theme/components/minimalComponents.js +8 -4
  196. package/dist/theme/components/minimalComponents.js.map +1 -1
  197. package/dist/theme/createToolkitTheme.js.map +1 -1
  198. package/dist/theme/glassSurface.js +36 -38
  199. package/dist/theme/glassSurface.js.map +1 -1
  200. package/dist/theme/lightDarkStyles.js +48 -0
  201. package/dist/theme/lightDarkStyles.js.map +1 -0
  202. package/dist/theme/toolkitComponents.js +2 -0
  203. package/dist/theme/toolkitComponents.js.map +1 -1
  204. package/dist/toolkit/ComponentTexts.js +13 -0
  205. package/dist/toolkit/ComponentTexts.js.map +1 -0
  206. package/dist/toolkit/ToolkitProvider.js +36 -28
  207. package/dist/toolkit/ToolkitProvider.js.map +1 -1
  208. package/dist/toolkit/browserNavigation.js +19 -20
  209. package/dist/toolkit/browserNavigation.js.map +1 -1
  210. package/dist/toolkit/componentTextsContext.js +15 -0
  211. package/dist/toolkit/componentTextsContext.js.map +1 -0
  212. package/dist/toolkit/hashNavigation.js +40 -0
  213. package/dist/toolkit/hashNavigation.js.map +1 -0
  214. package/dist/toolkit/navigationPaths.js +49 -0
  215. package/dist/toolkit/navigationPaths.js.map +1 -0
  216. package/dist/toolkit/toolkitSettings.js +24 -4
  217. package/dist/toolkit/toolkitSettings.js.map +1 -1
  218. package/dist/toolkit/useFormatters.js +12 -0
  219. package/dist/toolkit/useFormatters.js.map +1 -0
  220. package/dist/toolkit/useToolkitTranslation.js +11 -7
  221. package/dist/toolkit/useToolkitTranslation.js.map +1 -1
  222. package/dist/types/DataTable/AuditTrailTable.d.ts +3 -1
  223. package/dist/types/DataTable/EmptyState.d.ts +7 -2
  224. package/dist/types/DataTable/FilterChips.d.ts +3 -1
  225. package/dist/types/DataTable/GoToPage.d.ts +7 -2
  226. package/dist/types/DataTable/SelectionBar.d.ts +32 -0
  227. package/dist/types/DataTable/ServerTable.d.ts +64 -3
  228. package/dist/types/DataTable/index.d.ts +1 -1
  229. package/dist/types/DataTable/rowSelection.d.ts +113 -0
  230. package/dist/types/access/PermissionMatrix.d.ts +3 -1
  231. package/dist/types/account/AccountSecuritySection.d.ts +3 -1
  232. package/dist/types/account/ForgotPasswordScreen.d.ts +3 -1
  233. package/dist/types/account/ProfileScreen.d.ts +31 -1
  234. package/dist/types/account/ResetPasswordScreen.d.ts +3 -1
  235. package/dist/types/account/SignInScreen.d.ts +3 -1
  236. package/dist/types/account/accountConnector.d.ts +7 -2
  237. package/dist/types/adapters/reactRouterRoutes.d.ts +14 -2
  238. package/dist/types/api/createApiClient.d.ts +46 -1
  239. package/dist/types/appShell/AppLayout.d.ts +15 -1
  240. package/dist/types/appShell/AppearanceSettings.d.ts +8 -1
  241. package/dist/types/appShell/BarActionButton.d.ts +2 -2
  242. package/dist/types/appShell/BarActions.d.ts +6 -1
  243. package/dist/types/appShell/BarCapsule.d.ts +8 -0
  244. package/dist/types/appShell/BarSearch.d.ts +24 -0
  245. package/dist/types/appShell/MenuLinks.d.ts +17 -0
  246. package/dist/types/appShell/MobileTabBar.d.ts +4 -1
  247. package/dist/types/appShell/SettingsMenu.d.ts +3 -1
  248. package/dist/types/appShell/SideMenu.d.ts +3 -1
  249. package/dist/types/appShell/Wordmark.d.ts +6 -0
  250. package/dist/types/appShell/menuItemText.d.ts +16 -0
  251. package/dist/types/appShell/shellSizes.d.ts +1 -0
  252. package/dist/types/auth/PasswordChecklist.d.ts +3 -1
  253. package/dist/types/calendar/EventCalendar.d.ts +18 -1
  254. package/dist/types/calendar/EventDetails.d.ts +36 -0
  255. package/dist/types/calendar/calendarEvents.d.ts +27 -0
  256. package/dist/types/calendar.d.ts +2 -0
  257. package/dist/types/charts.d.ts +4 -0
  258. package/dist/types/datePickers/DateInput.d.ts +3 -1
  259. package/dist/types/downloads/DownloadManager.d.ts +7 -1
  260. package/dist/types/downloads/downloadQueue.d.ts +8 -3
  261. package/dist/types/downloads/fileTypes.d.ts +39 -0
  262. package/dist/types/downloads/index.d.ts +1 -0
  263. package/dist/types/feedback/ConfirmDialog.d.ts +3 -1
  264. package/dist/types/feedback/ModalWaiting.d.ts +7 -2
  265. package/dist/types/feedback/NewBuildNotice.d.ts +3 -1
  266. package/dist/types/filepond/FileDropzone.d.ts +3 -1
  267. package/dist/types/formatting.d.ts +45 -90
  268. package/dist/types/forms/FormWizard.d.ts +3 -1
  269. package/dist/types/forms/auth/ChangePasswordForm.d.ts +3 -1
  270. package/dist/types/forms/auth/ForgotPasswordForm.d.ts +3 -1
  271. package/dist/types/forms/auth/SignInForm.d.ts +3 -1
  272. package/dist/types/forms/security/SecondStepForm.d.ts +3 -1
  273. package/dist/types/forms/security/TwoStepVerificationCard.d.ts +3 -1
  274. package/dist/types/hookForm/FormWizard.d.ts +22 -0
  275. package/dist/types/inbox/InboxLayout.d.ts +14 -2
  276. package/dist/types/inbox/MessageList.d.ts +30 -5
  277. package/dist/types/inbox/MessageView.d.ts +35 -3
  278. package/dist/types/inbox/inboxDates.d.ts +6 -1
  279. package/dist/types/index.d.ts +15 -8
  280. package/dist/types/inputs/CatalogInput.d.ts +9 -5
  281. package/dist/types/inputs/ColorInput.d.ts +3 -1
  282. package/dist/types/inputs/FormSection.d.ts +2 -2
  283. package/dist/types/inputs/NumberInput.d.ts +3 -1
  284. package/dist/types/inputs/SelectInput.d.ts +9 -5
  285. package/dist/types/inputs/TextInput.d.ts +3 -1
  286. package/dist/types/inputs/WizardLayout.d.ts +34 -0
  287. package/dist/types/kanban/KanbanBoard.d.ts +61 -6
  288. package/dist/types/kanban/kanbanCards.d.ts +22 -0
  289. package/dist/types/kanban.d.ts +1 -0
  290. package/dist/types/locales/en.d.ts +77 -0
  291. package/dist/types/locales/es.d.ts +77 -0
  292. package/dist/types/maps/MapView.d.ts +12 -3
  293. package/dist/types/navigation/appMenu.d.ts +8 -0
  294. package/dist/types/observability/logger.d.ts +13 -0
  295. package/dist/types/observability/usePublishedBuildWatch.d.ts +3 -1
  296. package/dist/types/pwa/InstallAppSetting.d.ts +7 -1
  297. package/dist/types/pwa/InstallInstructionsDialog.d.ts +3 -1
  298. package/dist/types/pwa/InstallPromptBanner.d.ts +10 -1
  299. package/dist/types/pwa/useInstallPrompt.d.ts +3 -2
  300. package/dist/types/react-hook-form.d.ts +1 -0
  301. package/dist/types/security/ActivityLog.d.ts +3 -1
  302. package/dist/types/security/RecoveryCodesDialog.d.ts +6 -1
  303. package/dist/types/security/SessionsCard.d.ts +3 -1
  304. package/dist/types/table.d.ts +3 -1
  305. package/dist/types/theme/components/MuiAppBar.d.ts +3 -1
  306. package/dist/types/theme/components/MuiDialog.d.ts +9 -0
  307. package/dist/types/theme/components/glassComponents.d.ts +5 -0
  308. package/dist/types/theme/lightDarkStyles.d.ts +8 -0
  309. package/dist/types/toolkit/ComponentTexts.d.ts +11 -0
  310. package/dist/types/toolkit/ToolkitProvider.d.ts +18 -2
  311. package/dist/types/toolkit/browserNavigation.d.ts +23 -28
  312. package/dist/types/toolkit/componentTextsContext.d.ts +20 -0
  313. package/dist/types/toolkit/hashNavigation.d.ts +12 -0
  314. package/dist/types/toolkit/navigationPaths.d.ts +43 -0
  315. package/dist/types/toolkit/toolkitSettings.d.ts +49 -4
  316. package/dist/types/toolkit/useFormatters.d.ts +6 -0
  317. package/dist/types/toolkit/useToolkitTranslation.d.ts +2 -1
  318. package/dist/types/ui/actions/ActionsMenu.d.ts +20 -0
  319. package/dist/types/ui/actions/CopyButton.d.ts +3 -1
  320. package/dist/types/ui/actions/DownloadMenu.d.ts +8 -3
  321. package/dist/types/ui/actions/SecretField.d.ts +5 -1
  322. package/dist/types/ui/actions/SelectionActions.d.ts +39 -0
  323. package/dist/types/ui/filters/DateRangeFilter.d.ts +3 -1
  324. package/dist/types/ui/filters/QuickFilters.d.ts +3 -1
  325. package/dist/types/ui/index.d.ts +1 -1
  326. package/dist/types/ui/labels/tagOf.d.ts +13 -0
  327. package/dist/types/ui/layout/CollapsibleSection.d.ts +4 -1
  328. package/dist/types/ui/layout/ContentDialog.d.ts +3 -1
  329. package/dist/types/ui/layout/ErrorPage.d.ts +14 -1
  330. package/dist/types/ui/layout/FullPageLoader.d.ts +7 -1
  331. package/dist/types/ui/layout/PageHeading.d.ts +3 -1
  332. package/dist/types/ui/metrics/BarList.d.ts +7 -1
  333. package/dist/types/ui/metrics/CalendarHeatmap.d.ts +7 -1
  334. package/dist/types/ui/metrics/ChartTooltip.d.ts +9 -3
  335. package/dist/types/ui/metrics/ColumnChart.d.ts +23 -11
  336. package/dist/types/ui/metrics/LineChart.d.ts +41 -0
  337. package/dist/types/ui/metrics/MetricCard.d.ts +9 -1
  338. package/dist/types/ui/metrics/TableToggle.d.ts +9 -2
  339. package/dist/types/ui/metrics/chartParts.d.ts +112 -0
  340. package/dist/types/ui/navigation/BackButton.d.ts +3 -1
  341. package/dist/types/ui/navigation/ColorSchemeToggle.d.ts +8 -2
  342. package/dist/types/ui/navigation/FontSizeToggle.d.ts +7 -2
  343. package/dist/types/ui/navigation/LanguageToggle.d.ts +8 -3
  344. package/dist/types/ui/navigation/PageBreadcrumbs.d.ts +5 -2
  345. package/dist/types/ui/timeline/GroupedTimeline.d.ts +4 -1
  346. package/dist/types/upload/FileDropzone.d.ts +3 -1
  347. package/dist/ui/actions/ActionsMenu.js +51 -0
  348. package/dist/ui/actions/ActionsMenu.js.map +1 -0
  349. package/dist/ui/actions/CopyButton.js +2 -2
  350. package/dist/ui/actions/CopyButton.js.map +1 -1
  351. package/dist/ui/actions/DownloadMenu.js +11 -12
  352. package/dist/ui/actions/DownloadMenu.js.map +1 -1
  353. package/dist/ui/actions/SecretField.js +8 -4
  354. package/dist/ui/actions/SecretField.js.map +1 -1
  355. package/dist/ui/actions/SelectionActions.js +142 -0
  356. package/dist/ui/actions/SelectionActions.js.map +1 -0
  357. package/dist/ui/filters/DateRangeFilter.js +4 -3
  358. package/dist/ui/filters/DateRangeFilter.js.map +1 -1
  359. package/dist/ui/filters/QuickFilters.js +2 -2
  360. package/dist/ui/filters/QuickFilters.js.map +1 -1
  361. package/dist/ui/labels/tagOf.js +7 -0
  362. package/dist/ui/labels/tagOf.js.map +1 -0
  363. package/dist/ui/layout/CollapsibleSection.js +6 -2
  364. package/dist/ui/layout/CollapsibleSection.js.map +1 -1
  365. package/dist/ui/layout/ContentDialog.js +2 -2
  366. package/dist/ui/layout/ContentDialog.js.map +1 -1
  367. package/dist/ui/layout/ErrorPage.js +21 -7
  368. package/dist/ui/layout/ErrorPage.js.map +1 -1
  369. package/dist/ui/layout/FullPageLoader.js +2 -2
  370. package/dist/ui/layout/FullPageLoader.js.map +1 -1
  371. package/dist/ui/layout/PageHeading.js +2 -2
  372. package/dist/ui/layout/PageHeading.js.map +1 -1
  373. package/dist/ui/metrics/BarList.js +18 -13
  374. package/dist/ui/metrics/BarList.js.map +1 -1
  375. package/dist/ui/metrics/CalendarHeatmap.js +11 -6
  376. package/dist/ui/metrics/CalendarHeatmap.js.map +1 -1
  377. package/dist/ui/metrics/ChartTooltip.js +1 -1
  378. package/dist/ui/metrics/ChartTooltip.js.map +1 -1
  379. package/dist/ui/metrics/ColumnChart.js +59 -63
  380. package/dist/ui/metrics/ColumnChart.js.map +1 -1
  381. package/dist/ui/metrics/LineChart.js +117 -0
  382. package/dist/ui/metrics/LineChart.js.map +1 -0
  383. package/dist/ui/metrics/MetricCard.js +41 -8
  384. package/dist/ui/metrics/MetricCard.js.map +1 -1
  385. package/dist/ui/metrics/TableToggle.js +4 -2
  386. package/dist/ui/metrics/TableToggle.js.map +1 -1
  387. package/dist/ui/metrics/chartParts.js +93 -0
  388. package/dist/ui/metrics/chartParts.js.map +1 -0
  389. package/dist/ui/navigation/BackButton.js +2 -2
  390. package/dist/ui/navigation/BackButton.js.map +1 -1
  391. package/dist/ui/navigation/ColorSchemeToggle.js +6 -3
  392. package/dist/ui/navigation/ColorSchemeToggle.js.map +1 -1
  393. package/dist/ui/navigation/FontSizeToggle.js +3 -2
  394. package/dist/ui/navigation/FontSizeToggle.js.map +1 -1
  395. package/dist/ui/navigation/LanguageToggle.js +40 -19
  396. package/dist/ui/navigation/LanguageToggle.js.map +1 -1
  397. package/dist/ui/navigation/PageBreadcrumbs.js +2 -2
  398. package/dist/ui/navigation/PageBreadcrumbs.js.map +1 -1
  399. package/dist/ui/timeline/GroupedTimeline.js +10 -8
  400. package/dist/ui/timeline/GroupedTimeline.js.map +1 -1
  401. package/dist/upload/FileDropzone.js +5 -3
  402. package/dist/upload/FileDropzone.js.map +1 -1
  403. package/package.json +16 -7
@@ -1,6 +1,10 @@
1
+ import { SELECTION_PHONE_LAYOUT } from '../ui/actions/SelectionActions.js';
2
+ export { SELECTION_PHONE_LAYOUT };
3
+ export type RowSelection = import('./rowSelection.js').RowSelection;
4
+ /** @typedef {import('./rowSelection.js').RowSelection} RowSelection */
1
5
  /**
2
6
  * @param {object} props
3
- * @param {(params: {filters: Record<string, any>, sortOrders: Array<{column: string, direction: 'asc'|'desc'}>, page: number, pageSize: number}, signal: AbortSignal) => Promise<{rows: any[], total: number, facets?: Record<string, Array<{value: any, total: number}>>, capped?: boolean}>} props.fetchPage
7
+ * @param {(params: {filters: Record<string, any>, sortOrders: Array<{column: string, direction: 'asc'|'desc'}>, page: number, pageSize: number}, signal: AbortSignal) => Promise<{rows: any[], total: number, facets?: Record<string, Array<{value: any, total: number}> | number>, capped?: boolean}>} props.fetchPage
4
8
  * page cuenta desde 0; toServerTableParams lo convierte a la query del API
5
9
  * @param {string} props.queryKey cambia cuando cambia el CONJUNTO (no los filtros): dispara recarga
6
10
  * @param {boolean} [props.enabled] false mientras la sección está oculta: una tabla que nadie ve no consulta
@@ -48,8 +52,32 @@
48
52
  * @param {string} [props.ariaLabel] nombre de la tabla para lectores de pantalla
49
53
  * @param {string} [props.fixedColumn] campo de la columna que se queda pegada a la izquierda al deslizar de lado (como
50
54
  * fixedSelectColumn de mui-datatables)
55
+ * @param {Array<{key: string, label: string, icon?: import('react').ReactNode, color?: 'inherit'|'primary'|'secondary'|'error'|'info'|'success'|'warning', isDisabled?: (selection: RowSelection) => boolean, onClick: (selection: RowSelection, helpers: {clearSelection: () => void, refresh: () => void}) => unknown}>} [props.selectionActions]
56
+ * con ellas cada renglón lleva su casilla y, al elegir, sale la barra de los elegidos con estas acciones. label ya
57
+ * traducido; onClick recibe la selección (con isAllMatching mande `filters`, no `ids`) y cómo quitar la selección y volver
58
+ * a consultar después de actuar
59
+ * @param {(row: any) => boolean} [props.isRowSelectable] cuáles renglones se pueden elegir (un pedido entregado no se cancela)
60
+ * @param {boolean} [props.allowSelectAllMatching] la casilla de arriba elige todos los que coinciden (la acción recibe los
61
+ * filtros) y el aviso deja quedarse solo con la página; por omisión sí. false: la casilla elige la página y nunca se
62
+ * ofrece «todos»
63
+ * @param {(selection: RowSelection) => void} [props.onSelectionChange] cada que cambia la selección; también enciende las
64
+ * casillas sin barra de acciones (la pantalla pinta las suyas)
65
+ * @param {'top'|'split'} [props.selectionPhoneLayout] SELECTION_PHONE_LAYOUT: en el teléfono con vidrio o minimalista, todo
66
+ * arriba (por omisión) o el conteo arriba y las acciones abajo. Sin vidrio, en el renglón como en escritorio
67
+ * @param {(request: {filters: Record<string, any>, sortOrders: Array<{column: string, direction: 'asc'|'desc'}>, page: number, pageSize: number}) => void} [props.onQueryChange]
68
+ * cada que cambia lo que pide la tabla (un filtro, el orden, la página), antes de consultar: para la lógica de negocio que
69
+ * depende de lo filtrado («si eligió Cancelados, enseñe el motivo»)
70
+ * @param {(result: {rows: any[], total: number, facets: object, capped: boolean}) => void} [props.onLoaded] cada que llega una
71
+ * página del servidor
72
+ * @param {(error: unknown) => void} [props.onLoadError] cuando la consulta falla (la tabla ya enseña su aviso con «Reintentar»)
73
+ * @param {object} [props.gridProps] lo demás del DataGrid de MUI, sobre todo sus eventos (onRowClick, onRowDoubleClick,
74
+ * onCellKeyDown…). OJO: lo que la tabla controla (paginar, ordenar y filtrar en el servidor, el alto, la selección) no se
75
+ * reemplaza desde aquí: para eso están sus props
76
+ * @param {object} [props.texts] los textos de la tabla que cambian, con la forma de `table` en los textos del paquete
77
+ * (src/locales/es.js), ya en el idioma de la pantalla: {selection: {clear: 'Deseleccionar'}, empty: {filtered: '…'}}.
78
+ * También les llegan a sus filtros de columna, sus chips y su barra de elegidos
51
79
  */
52
- export default function ServerTable({ fetchPage, queryKey, enabled, columns, filterKinds, filterDefaults, chipConfig, quickFilters, searchField, searchPlaceholder, searchInBar, collapseSearchInBar, emptyLabel, countLabel, pageSizeOptions, defaultPageSize, getRowId, prefix, refreshToken, footer, toolbarExtra, header, beforeQuickFilters, columnGroupingModel, getRowClassName, isRowVisible, hideFooterWhenAllRowsFit, showGoToPage, striped, getRowHeight, gridSx, maxGridHeight, ariaLabel, fixedColumn, }: {
80
+ export default function ServerTable({ fetchPage, queryKey, enabled, columns, filterKinds, filterDefaults, chipConfig, quickFilters, searchField, searchPlaceholder, searchInBar, collapseSearchInBar, emptyLabel, countLabel, pageSizeOptions, defaultPageSize, getRowId, prefix, refreshToken, footer, toolbarExtra, header, beforeQuickFilters, columnGroupingModel, getRowClassName, isRowVisible, hideFooterWhenAllRowsFit, showGoToPage, striped, getRowHeight, gridSx, maxGridHeight, ariaLabel, fixedColumn, selectionActions, isRowSelectable, allowSelectAllMatching, onSelectionChange, selectionPhoneLayout, onQueryChange, onLoaded, onLoadError, gridProps, texts, }: {
53
81
  fetchPage: (params: {
54
82
  filters: Record<string, any>;
55
83
  sortOrders: Array<{
@@ -64,7 +92,7 @@ export default function ServerTable({ fetchPage, queryKey, enabled, columns, fil
64
92
  facets?: Record<string, Array<{
65
93
  value: any;
66
94
  total: number;
67
- }>>;
95
+ }> | number>;
68
96
  capped?: boolean;
69
97
  }>;
70
98
  queryKey: string;
@@ -107,4 +135,37 @@ export default function ServerTable({ fetchPage, queryKey, enabled, columns, fil
107
135
  maxGridHeight?: number;
108
136
  ariaLabel?: string;
109
137
  fixedColumn?: string;
138
+ selectionActions?: Array<{
139
+ key: string;
140
+ label: string;
141
+ icon?: import('react').ReactNode;
142
+ color?: 'inherit' | 'primary' | 'secondary' | 'error' | 'info' | 'success' | 'warning';
143
+ isDisabled?: (selection: RowSelection) => boolean;
144
+ onClick: (selection: RowSelection, helpers: {
145
+ clearSelection: () => void;
146
+ refresh: () => void;
147
+ }) => unknown;
148
+ }>;
149
+ isRowSelectable?: (row: any) => boolean;
150
+ allowSelectAllMatching?: boolean;
151
+ onSelectionChange?: (selection: RowSelection) => void;
152
+ selectionPhoneLayout?: 'top' | 'split';
153
+ onQueryChange?: (request: {
154
+ filters: Record<string, any>;
155
+ sortOrders: Array<{
156
+ column: string;
157
+ direction: 'asc' | 'desc';
158
+ }>;
159
+ page: number;
160
+ pageSize: number;
161
+ }) => void;
162
+ onLoaded?: (result: {
163
+ rows: any[];
164
+ total: number;
165
+ facets: object;
166
+ capped: boolean;
167
+ }) => void;
168
+ onLoadError?: (error: unknown) => void;
169
+ gridProps?: object;
170
+ texts?: object;
110
171
  }): import("react").JSX.Element;
@@ -3,7 +3,7 @@ export { default as AuditTrailTable } from './AuditTrailTable.js';
3
3
  export { default as EmptyState } from './EmptyState.js';
4
4
  export { default as FilterChips } from './FilterChips.js';
5
5
  export { default as GoToPage } from './GoToPage.js';
6
- export { default as ServerTable } from './ServerTable.js';
6
+ export { SELECTION_PHONE_LAYOUT, default as ServerTable } from './ServerTable.js';
7
7
  export { buildChipConfig } from './buildChipConfig.js';
8
8
  export { detailColumn, facetColumn, textColumn } from './columns.js';
9
9
  export { TableFilterContext, useTableFilter } from './filterContext.js';
@@ -0,0 +1,113 @@
1
+ export type RowSelection = {
2
+ /**
3
+ * los ids elegidos; vacío con isAllMatching
4
+ */
5
+ ids: Array<string | number>;
6
+ /**
7
+ * los renglones elegidos tal como se vieron; vacío con isAllMatching
8
+ */
9
+ rows: any[];
10
+ /**
11
+ * cuántos van: los elegidos o, con isAllMatching, el total de la tabla
12
+ */
13
+ count: number;
14
+ /**
15
+ * true = todos los que coinciden con `filters` (mande los filtros, no los ids)
16
+ */
17
+ isAllMatching: boolean;
18
+ /**
19
+ * con isAllMatching, el total es «al menos esto» (el servidor cuenta hasta un tope)
20
+ */
21
+ isCapped: boolean;
22
+ /**
23
+ * los filtros puestos en la tabla
24
+ */
25
+ filters: Record<string, any>;
26
+ };
27
+ /**
28
+ * Lo que recibe cada acción de los elegidos (y onSelectionChange).
29
+ *
30
+ * @typedef {object} RowSelection
31
+ * @property {Array<string|number>} ids los ids elegidos; vacío con isAllMatching
32
+ * @property {any[]} rows los renglones elegidos tal como se vieron; vacío con isAllMatching
33
+ * @property {number} count cuántos van: los elegidos o, con isAllMatching, el total de la tabla
34
+ * @property {boolean} isAllMatching true = todos los que coinciden con `filters` (mande los filtros, no los ids)
35
+ * @property {boolean} isCapped con isAllMatching, el total es «al menos esto» (el servidor cuenta hasta un tope)
36
+ * @property {Record<string, any>} filters los filtros puestos en la tabla
37
+ */
38
+ /** Nada elegido. */
39
+ export declare const EMPTY_ROW_SELECTION: Readonly<{
40
+ rowsById: Map<any, any>;
41
+ isAllMatching: false;
42
+ }>;
43
+ /**
44
+ * Lo que reciben las acciones, a partir del estado de la tabla.
45
+ *
46
+ * @param {{rowsById: Map<string|number, any>, isAllMatching: boolean}} selection
47
+ * @param {{total: number, capped?: boolean, filters: Record<string, any>}} table
48
+ * @returns {RowSelection}
49
+ */
50
+ export declare function rowSelectionOf(selection: {
51
+ rowsById: Map<string | number, any>;
52
+ isAllMatching: boolean;
53
+ }, { total, capped, filters }: {
54
+ total: number;
55
+ capped?: boolean;
56
+ filters: Record<string, any>;
57
+ }): RowSelection;
58
+ /**
59
+ * Los ids que el DataGrid debe pintar marcados en la página que se ve. Con «todos los que coinciden», todos los de la
60
+ * página que se pueden elegir.
61
+ *
62
+ * @param {{rowsById: Map<string|number, any>, isAllMatching: boolean}} selection
63
+ * @param {Array<string|number>} selectablePageIds los ids de la página que se pueden elegir
64
+ * @returns {Set<string|number>}
65
+ */
66
+ export declare function checkedIdsOf(selection: {
67
+ rowsById: Map<string | number, any>;
68
+ isAllMatching: boolean;
69
+ }, selectablePageIds: Array<string | number>): Set<string | number>;
70
+ /**
71
+ * El DataGrid avisó qué ids quedaron marcados (por una casilla de renglón o la de la página).
72
+ *
73
+ * Con «todos los que coinciden», desmarcar uno sale de ese modo y se quedan elegidos los de esta página que siguen
74
+ * marcados (lo mismo que hace Gmail).
75
+ *
76
+ * Con allMatchingOnWholePage, la página completa elegida DE UN GOLPE (la casilla de arriba, o un rango con Shift que la
77
+ * cubre) elige todos los que coinciden. OJO: se decide por lo que cambió y no por el motivo que manda el DataGrid, que usa
78
+ * el mismo para la casilla de arriba y para un rango. Llenar la página picando uno por uno no: ahí el aviso lo ofrece. Si
79
+ * no hay más renglones que los de la página, se quedan los picados (la acción recibe ids, que es lo más claro).
80
+ *
81
+ * @param {{rowsById: Map<string|number, any>, isAllMatching: boolean}} selection
82
+ * @param {Set<string|number>} checkedIds lo que el DataGrid trae marcado (incluye los de otras páginas)
83
+ * @param {Map<string|number, any>} pageRowsById los renglones de la página que se ve, por id
84
+ * @param {Array<string|number>} selectablePageIds los ids de la página que se pueden elegir
85
+ * @param {{allMatchingOnWholePage?: boolean, total?: number, capped?: boolean}} [options]
86
+ * @returns {{rowsById: Map<string|number, any>, isAllMatching: boolean}}
87
+ */
88
+ export declare function selectionAfterCheck(selection: {
89
+ rowsById: Map<string | number, any>;
90
+ isAllMatching: boolean;
91
+ }, checkedIds: Set<string | number>, pageRowsById: Map<string | number, any>, selectablePageIds: Array<string | number>, { allMatchingOnWholePage, total, capped }?: {
92
+ allMatchingOnWholePage?: boolean;
93
+ total?: number;
94
+ capped?: boolean;
95
+ }): {
96
+ rowsById: Map<string | number, any>;
97
+ isAllMatching: boolean;
98
+ };
99
+ /**
100
+ * ¿Se le ofrece «Elegir los N que coinciden»? Cuando ya eligió toda la página y hay más renglones que esos.
101
+ *
102
+ * @param {{rowsById: Map<string|number, any>, isAllMatching: boolean}} selection
103
+ * @param {Array<string|number>} selectablePageIds
104
+ * @param {{total: number, capped?: boolean}} table
105
+ * @returns {boolean}
106
+ */
107
+ export declare function canSelectAllMatching(selection: {
108
+ rowsById: Map<string | number, any>;
109
+ isAllMatching: boolean;
110
+ }, selectablePageIds: Array<string | number>, { total, capped }: {
111
+ total: number;
112
+ capped?: boolean;
113
+ }): boolean;
@@ -4,8 +4,9 @@
4
4
  * @param {string[]} props.value los permisos del perfil
5
5
  * @param {(value: string[]) => void} [props.onChange] sin ella, o con readOnly, solo se ven
6
6
  * @param {boolean} [props.readOnly] un perfil que no se puede cambiar (el de administración)
7
+ * @param {object} [props.texts] los textos que cambian, con la forma de `access` en los textos del paquete
7
8
  */
8
- export default function PermissionMatrix({ groups, value, onChange, readOnly }: {
9
+ export default function PermissionMatrix({ groups, value, onChange, readOnly, texts }: {
9
10
  groups: Array<{
10
11
  key: string;
11
12
  label: string;
@@ -18,4 +19,5 @@ export default function PermissionMatrix({ groups, value, onChange, readOnly }:
18
19
  value: string[];
19
20
  onChange?: (value: string[]) => void;
20
21
  readOnly?: boolean;
22
+ texts?: object;
21
23
  }): import("react").JSX.Element;
@@ -1,7 +1,9 @@
1
1
  /**
2
2
  * @param {object} props
3
3
  * @param {boolean} [props.showPasswordChange] por omisión sí
4
+ * @param {object} [props.texts] los textos que cambian, con la forma de `account` en los textos del paquete
4
5
  */
5
- export default function AccountSecuritySection({ showPasswordChange }: {
6
+ export default function AccountSecuritySection({ showPasswordChange, texts }: {
6
7
  showPasswordChange?: boolean;
8
+ texts?: object;
7
9
  }): import("react").JSX.Element;
@@ -5,11 +5,13 @@
5
5
  * @param {string} [props.brandName]
6
6
  * @param {boolean} [props.showLanguageToggle]
7
7
  * @param {boolean} [props.showColorSchemeToggle]
8
+ * @param {object} [props.texts] los textos que cambian, con la forma de `auth` en los textos del paquete
8
9
  */
9
- export default function ForgotPasswordScreen({ signInPath, logo, brandName, showLanguageToggle, showColorSchemeToggle }: {
10
+ export default function ForgotPasswordScreen({ signInPath, logo, brandName, showLanguageToggle, showColorSchemeToggle, texts }: {
10
11
  signInPath?: string;
11
12
  logo?: import('react').ReactNode;
12
13
  brandName?: string;
13
14
  showLanguageToggle?: boolean;
14
15
  showColorSchemeToggle?: boolean;
16
+ texts?: object;
15
17
  }): import("react").JSX.Element;
@@ -4,10 +4,40 @@ export declare const PROFILE_TAB: Readonly<{
4
4
  security: "security";
5
5
  preferences: "preferences";
6
6
  }>;
7
+ export type AccountUser = import('./accountConnector.js').AccountUser;
8
+ /** @typedef {import('./accountConnector.js').AccountUser} AccountUser */
7
9
  /**
8
10
  * @param {object} props
9
11
  * @param {boolean} [props.showColorScheme] el ajuste de claro u oscuro en Preferencias; sin modo oscuro, false
12
+ * @param {{initialValues?: (user: AccountUser & Record<string, any>) => Record<string, any>, rules?: Record<string, any>, fields: import('react').ReactNode}} [props.extraFields]
13
+ * campos propios en «Sus datos», debajo del teléfono: sus valores de inicio salen del usuario de la sesión (lo que su
14
+ * conector ponga en session.user), sus reglas de yup y sus campos (FormTextField, FormSelectField… de /forms). Al guardar
15
+ * viajan a connector.updateProfile junto con name y phone
16
+ * @param {Array<{key: string, label: string, content: import('react').ReactNode}>} [props.extraTabs] pestañas propias,
17
+ * después de las de la casa; label ya traducido
18
+ * @param {Array<'data'|'security'|'preferences'>} [props.hiddenTabs] pestañas de la casa que no se ven (PROFILE_TAB)
19
+ * @param {(tab: string) => void} [props.onTabChange] cada que se cambia de pestaña
20
+ * @param {(saved: {values: Record<string, any>, response: unknown}) => void} [props.onProfileSaved] después de guardar «Sus datos»
21
+ * @param {object} [props.texts] los textos que cambian, con la forma de `account` en los textos del paquete:
22
+ * {profile: {tabs: {data: 'Mis datos'}}}
10
23
  */
11
- export default function ProfileScreen({ showColorScheme }: {
24
+ export default function ProfileScreen({ showColorScheme, extraFields, extraTabs, hiddenTabs, onTabChange, onProfileSaved, texts, }: {
12
25
  showColorScheme?: boolean;
26
+ extraFields?: {
27
+ initialValues?: (user: AccountUser & Record<string, any>) => Record<string, any>;
28
+ rules?: Record<string, any>;
29
+ fields: import('react').ReactNode;
30
+ };
31
+ extraTabs?: Array<{
32
+ key: string;
33
+ label: string;
34
+ content: import('react').ReactNode;
35
+ }>;
36
+ hiddenTabs?: Array<'data' | 'security' | 'preferences'>;
37
+ onTabChange?: (tab: string) => void;
38
+ onProfileSaved?: (saved: {
39
+ values: Record<string, any>;
40
+ response: unknown;
41
+ }) => void;
42
+ texts?: object;
13
43
  }): import("react").JSX.Element | null;
@@ -7,8 +7,9 @@
7
7
  * @param {string} [props.brandName]
8
8
  * @param {boolean} [props.showLanguageToggle]
9
9
  * @param {boolean} [props.showColorSchemeToggle]
10
+ * @param {object} [props.texts] los textos que cambian, con la forma de `account` en los textos del paquete
10
11
  */
11
- export default function ResetPasswordScreen({ signInPath, forgotPasswordPath, tokenParam, logo, brandName, showLanguageToggle, showColorSchemeToggle, }: {
12
+ export default function ResetPasswordScreen({ signInPath, forgotPasswordPath, tokenParam, logo, brandName, showLanguageToggle, showColorSchemeToggle, texts, }: {
12
13
  signInPath: string;
13
14
  forgotPasswordPath?: string;
14
15
  tokenParam?: string;
@@ -16,4 +17,5 @@ export default function ResetPasswordScreen({ signInPath, forgotPasswordPath, to
16
17
  brandName?: string;
17
18
  showLanguageToggle?: boolean;
18
19
  showColorSchemeToggle?: boolean;
20
+ texts?: object;
19
21
  }): import("react").JSX.Element;
@@ -7,8 +7,9 @@
7
7
  * @param {import('react').ReactNode | ((helpers: {signIn: (credentials: {email: string, password: string, remember?: boolean}) => Promise<void>}) => import('react').ReactNode)} [props.footer]
8
8
  * @param {boolean} [props.showLanguageToggle] por omisión sí
9
9
  * @param {boolean} [props.showColorSchemeToggle] por omisión sí
10
+ * @param {object} [props.texts] los textos que cambian, con la forma de `auth` en los textos del paquete
10
11
  */
11
- export default function SignInScreen({ homePath, forgotPasswordPath, logo, brandName, footer, showLanguageToggle, showColorSchemeToggle }: {
12
+ export default function SignInScreen({ homePath, forgotPasswordPath, logo, brandName, footer, showLanguageToggle, showColorSchemeToggle, texts }: {
12
13
  homePath?: string;
13
14
  forgotPasswordPath?: string;
14
15
  logo?: import('react').ReactNode;
@@ -22,4 +23,5 @@ export default function SignInScreen({ homePath, forgotPasswordPath, logo, brand
22
23
  }) => import('react').ReactNode);
23
24
  showLanguageToggle?: boolean;
24
25
  showColorSchemeToggle?: boolean;
26
+ texts?: object;
25
27
  }): import("react").JSX.Element | null;
@@ -113,10 +113,14 @@ export type AccountConnector = {
113
113
  token: string;
114
114
  newPassword: string;
115
115
  }) => Promise<void>;
116
+ /**
117
+ * name, phone y
118
+ * los campos propios de ProfileScreen (extraFields)
119
+ */
116
120
  updateProfile: (input: {
117
121
  name: string;
118
122
  phone: string;
119
- }) => Promise<{
123
+ } & Record<string, any>) => Promise<{
120
124
  message?: string;
121
125
  } | void>;
122
126
  changePassword: (input: {
@@ -236,7 +240,8 @@ export type AccountConnector = {
236
240
  * @property {() => Promise<void>} signOut
237
241
  * @property {(input: {email: string}) => Promise<void>} requestPasswordReset contesta igual exista o no el correo
238
242
  * @property {(input: {token: string, newPassword: string}) => Promise<void>} resetPassword desde el enlace del correo
239
- * @property {(input: {name: string, phone: string}) => Promise<{message?: string}|void>} updateProfile
243
+ * @property {(input: {name: string, phone: string} & Record<string, any>) => Promise<{message?: string}|void>} updateProfile name, phone y
244
+ * los campos propios de ProfileScreen (extraFields)
240
245
  * @property {(input: {currentPassword?: string, newPassword: string}) => Promise<void>} changePassword
241
246
  * @property {() => Promise<AccountSecurity>} loadSecurity
242
247
  * @property {() => Promise<{secret: string, qrImageUrl?: string|null}>} startTotp una clave nueva (todavía sin activar)
@@ -3,9 +3,13 @@
3
3
  *
4
4
  * @param {object|undefined} access la regla (accessRules.js); sin ella, el grupo es de todos
5
5
  * @param {object[]} routes las rutas del módulo
6
+ * @param {{fallback?: import('react').ReactNode}} [options] fallback: lo que ve quien no tiene permiso; por omisión la página
7
+ * de «sin permiso» de la casa (con ErrorPage y sus props se arma una propia: un botón para pedir acceso)
6
8
  * @returns {object} la ruta de react-router
7
9
  */
8
- export declare function withAccess(access: object | undefined, routes: object[]): object;
10
+ export declare function withAccess(access: object | undefined, routes: object[], { fallback }?: {
11
+ fallback?: import('react').ReactNode;
12
+ }): object;
9
13
  /**
10
14
  * ¿Se está descargando la pantalla siguiente?
11
15
  *
@@ -26,5 +30,13 @@ export declare function withChunkRecovery(routes: object[]): object[];
26
30
  * nuestro lado». Las dos últimas con su botón para recargar.
27
31
  *
28
32
  * createBrowserRouter([{path: '/', element: <App />, ErrorBoundary: RouteErrorScreen, children: [...]}])
33
+ *
34
+ * Con props (como errorElement) se extiende igual que ErrorPage, y onError recibe lo que tronó (para Sentry o su aviso):
35
+ * {errorElement: <RouteErrorScreen onError={(error) => reportError(error)} extraActions={<SupportButton />} />}
36
+ *
37
+ * @param {object} [props] las de ErrorPage (extraActions, actions, children, icon, homePath, onGoHome, texts) y:
38
+ * @param {(error: unknown, kind: string) => void} [props.onError] cada error que llega aquí, con su tipo (ERROR_PAGE_KIND)
29
39
  */
30
- export declare function RouteErrorScreen(): import("react").JSX.Element;
40
+ export declare function RouteErrorScreen({ onError, ...errorPageProps }?: {
41
+ onError?: (error: unknown, kind: string) => void;
42
+ }): import("react").JSX.Element;
@@ -22,6 +22,23 @@ export declare function apiUrlOf(baseUrl: string, path: string, params?: Record<
22
22
  * @returns {number|null}
23
23
  */
24
24
  export declare function retryAfterSecondsOf(retryAfterHeader: string | null): number | null;
25
+ /**
26
+ * El ApiError de una respuesta que salió mal, para lo que no pasa por createApiClient: la subida con avance
27
+ * (uploadWithProgress regresa la respuesta tal cual) o un fetch propio. Es el mismo error que da el cliente: el problema RFC
28
+ * 9457 del servidor ({title, detail, errors}), su status (401 = sesión vencida, 422 = errores por campo) y el texto del
29
+ * paquete si el cuerpo no es JSON (un 502 del proxy). Así la pantalla no lee el error a mano.
30
+ *
31
+ * const response = await uploadWithProgress(url, form, {headers, onProgress, signal});
32
+ * if (!response.ok) throw await apiErrorOf(response);
33
+ *
34
+ * @param {Response} response
35
+ * @param {{toProblem?: (body: any, response: Response) => any}} [options] el mismo adaptador de createApiClient, para un
36
+ * backend que contesta a su manera (Laravel manda {message, errors})
37
+ * @returns {Promise<ApiError>}
38
+ */
39
+ export declare function apiErrorOf(response: Response, { toProblem }?: {
40
+ toProblem?: (body: any, response: Response) => any;
41
+ }): Promise<ApiError>;
25
42
  export type ApiRequestOptions = {
26
43
  /**
27
44
  * objeto → JSON; FormData, Blob o URLSearchParams tal cual
@@ -126,10 +143,19 @@ export type ApiClient = {
126
143
  * {refreshPath: '/auth/csrf-token'}; por omisión la cookie XSRF-TOKEN y el header X-XSRF-TOKEN
127
144
  * @param {number} [options.timeoutMilliseconds] el tiempo máximo de una consulta (0 = sin límite); por omisión 60 s
128
145
  * @param {(error: ApiError) => void} [options.onUnauthenticated] qué hacer con un 401 (normalmente ir a iniciar sesión)
146
+ * @param {(request: {method: string, url: string}) => void} [options.onRequest] cada petición, al salir
147
+ * @param {(response: {method: string, url: string, status: number, durationMilliseconds: number}) => void} [options.onResponse]
148
+ * cada respuesta, buena o mala, al llegar
149
+ * @param {(error: ApiError, request: {method: string, url: string}) => void} [options.onError] cada error (sin red, 4xx, 5xx,
150
+ * una respuesta que no es JSON), en un solo lugar: Sentry, un aviso propio. Cancelar no es error
151
+ * @param {(body: any, response: Response) => object|null} [options.toProblem] el error de un backend que no contesta en
152
+ * RFC 9457, a esa forma: (body) => ({title: body.message, errors: body.errors}). Por omisión el cuerpo tal cual
153
+ * @param {(body: any, request: {method: string, url: string}) => any} [options.mapResponse] la respuesta buena de un backend
154
+ * que la envuelve: (body) => body.data. Por omisión tal cual
129
155
  * @param {typeof fetch} [options.fetch] para un servidor de mentira o para las pruebas; por omisión el del navegador
130
156
  * @returns {ApiClient}
131
157
  */
132
- export declare function createApiClient({ baseUrl, credentials, getToken, headers: commonHeaders, publishedBuildHeader, csrf, timeoutMilliseconds: defaultTimeoutMilliseconds, onUnauthenticated, fetch: fetchImplementation, }?: {
158
+ export declare function createApiClient({ baseUrl, credentials, getToken, headers: commonHeaders, publishedBuildHeader, csrf, timeoutMilliseconds: defaultTimeoutMilliseconds, onUnauthenticated, onRequest, onResponse, onError, toProblem, mapResponse, fetch: fetchImplementation, }?: {
133
159
  baseUrl?: string;
134
160
  credentials?: RequestCredentials;
135
161
  getToken?: () => string | null | undefined;
@@ -142,5 +168,24 @@ export declare function createApiClient({ baseUrl, credentials, getToken, header
142
168
  } | null;
143
169
  timeoutMilliseconds?: number;
144
170
  onUnauthenticated?: (error: ApiError) => void;
171
+ onRequest?: (request: {
172
+ method: string;
173
+ url: string;
174
+ }) => void;
175
+ onResponse?: (response: {
176
+ method: string;
177
+ url: string;
178
+ status: number;
179
+ durationMilliseconds: number;
180
+ }) => void;
181
+ onError?: (error: ApiError, request: {
182
+ method: string;
183
+ url: string;
184
+ }) => void;
185
+ toProblem?: (body: any, response: Response) => object | null;
186
+ mapResponse?: (body: any, request: {
187
+ method: string;
188
+ url: string;
189
+ }) => any;
145
190
  fetch?: typeof fetch;
146
191
  }): ApiClient;
@@ -6,6 +6,9 @@ export declare const MENU_POSITION: Readonly<{
6
6
  /**
7
7
  * @param {object} props
8
8
  * @param {import('react').ReactNode} [props.logo] el logo chico (28 px), en la barra junto al nombre y en el cajón del teléfono
9
+ * @param {import('react').ReactNode} [props.wordmark] el logo ancho, la marca con su nombre en una sola imagen (como el de muchas
10
+ * empresas): va en lugar del logo y el nombre en la barra y arriba del menú del teléfono, a 24 px de alto. Con el menú
11
+ * encogido se queda el logo chico (logo), si lo hay. brandName sigue siendo su nombre para el lector de pantalla
9
12
  * @param {string} [props.brandName] el nombre de la app; por omisión el appName de ToolkitProvider
10
13
  * @param {string} [props.brandCaption] el renglón chico debajo del nombre («Panel de administración»)
11
14
  * @param {string} [props.homePath] por omisión '/'
@@ -31,10 +34,17 @@ export declare const MENU_POSITION: Readonly<{
31
34
  * @param {boolean} [props.minimizeTabBarOnScroll] en el teléfono con vidrio, la barra de pestañas se encoge al leer hacia
32
35
  * abajo y regresa al subir (como iOS 26); por omisión sí
33
36
  * @param {number|string} [props.contentMaxWidth] por omisión 1400
37
+ * @param {(collapsed: boolean) => void} [props.onMenuCollapse] la persona encogió (true) o abrió (false) el menú lateral
38
+ * @param {(isOpen: boolean) => void} [props.onMobileMenuChange] se abrió o se cerró el menú del teléfono (el cajón)
39
+ * @param {(keys: string[]|null) => void} [props.onMobileTabsChange] la persona eligió sus pestañas del teléfono (las llaves
40
+ * de menuItemKeyOf; null: regresó a las de omisión). Se recuerdan en el navegador; con esto el proyecto las puede guardar
41
+ * en su servidor
42
+ * @param {object} [props.texts] los textos que cambian, con la forma de `layout` en los textos del paquete (para todo el marco)
34
43
  * @param {import('react').ReactNode} props.children el contenido
35
44
  */
36
- export declare const AppLayout: ({ logo, brandName, brandCaption, homePath, menuItems, menuPosition, user, profilePath, accountMenuItems, onSignOut, isSigningOut, headerActions, accountSettings, menuBadges, sidebarFooter, showFontSizeToggle, showLanguageToggle, showColorSchemeToggle, ribbons, isNavigating, defaultCollapsed, minimizeTabBarOnScroll, contentMaxWidth, children, }: {
45
+ export declare const AppLayout: ({ logo, wordmark, brandName, brandCaption, homePath, menuItems, menuPosition, user, profilePath, accountMenuItems, onSignOut, isSigningOut, headerActions, accountSettings, menuBadges, sidebarFooter, showFontSizeToggle, showLanguageToggle, showColorSchemeToggle, ribbons, isNavigating, defaultCollapsed, minimizeTabBarOnScroll, contentMaxWidth, onMenuCollapse, onMobileMenuChange, onMobileTabsChange, texts, children, }: {
37
46
  logo?: import('react').ReactNode;
47
+ wordmark?: import('react').ReactNode;
38
48
  brandName?: string;
39
49
  brandCaption?: string;
40
50
  homePath?: string;
@@ -62,5 +72,9 @@ export declare const AppLayout: ({ logo, brandName, brandCaption, homePath, menu
62
72
  defaultCollapsed?: boolean;
63
73
  minimizeTabBarOnScroll?: boolean;
64
74
  contentMaxWidth?: number | string;
75
+ onMenuCollapse?: (collapsed: boolean) => void;
76
+ onMobileMenuChange?: (isOpen: boolean) => void;
77
+ onMobileTabsChange?: (keys: string[] | null) => void;
78
+ texts?: object;
65
79
  children: import('react').ReactNode;
66
80
  }) => import("react").JSX.Element;
@@ -26,9 +26,16 @@ export declare function SettingSection({ label, value, options, onChange }: {
26
26
  * @param {boolean} [props.showFontSize] por omisión sí
27
27
  * @param {boolean} [props.showLanguage] por omisión sí
28
28
  * @param {boolean} [props.showColorScheme] por omisión sí
29
+ * @param {(level: string) => void} [props.onFontSizeChange] la persona eligió otro tamaño de letra (para guardarlo en su
30
+ * servidor; el idioma ya sale por onLanguageChange de ToolkitProvider)
31
+ * @param {(mode: 'light'|'dark'|'system') => void} [props.onColorSchemeChange] la persona eligió otro modo
32
+ * @param {object} [props.texts] los textos que cambian, con la forma de `layout` en los textos del paquete
29
33
  */
30
- export default function AppearanceSettings({ showFontSize, showLanguage, showColorScheme }: {
34
+ export default function AppearanceSettings({ showFontSize, showLanguage, showColorScheme, onFontSizeChange, onColorSchemeChange, texts, }: {
31
35
  showFontSize?: boolean;
32
36
  showLanguage?: boolean;
33
37
  showColorScheme?: boolean;
38
+ onFontSizeChange?: (level: string) => void;
39
+ onColorSchemeChange?: (mode: 'light' | 'dark' | 'system') => void;
40
+ texts?: object;
34
41
  }): import("react").JSX.Element[];
@@ -1,14 +1,14 @@
1
1
  /**
2
2
  * @param {object} props
3
3
  * @param {string} props.label el nombre de la acción, ya traducido: «Agregar sucursal»
4
- * @param {import('react').ReactNode} props.icon el ícono (<AddRoundedIcon />)
4
+ * @param {import('react').ReactNode} [props.icon] el ícono (<AddRoundedIcon />); sin él, se ve su texto
5
5
  * @param {(event: object) => void} [props.onClick]
6
6
  * @param {boolean} [props.disabled]
7
7
  * @param {'inherit'|'primary'|'secondary'|'success'|'error'|'info'|'warning'} [props.color] por omisión primary
8
8
  */
9
9
  export default function BarActionButton({ label, icon, onClick, disabled, color, ...buttonProps }: {
10
10
  label: string;
11
- icon: import('react').ReactNode;
11
+ icon?: import('react').ReactNode;
12
12
  onClick?: (event: object) => void;
13
13
  disabled?: boolean;
14
14
  color?: 'inherit' | 'primary' | 'secondary' | 'success' | 'error' | 'info' | 'warning';
@@ -7,12 +7,17 @@
7
7
  * grupo, en la franja)
8
8
  * @param {object|Function|Array} [props.inlineSx] estilos de la cápsula cuando se queda en la pantalla
9
9
  * @param {boolean} [props.bare] sin cápsula alrededor: lo de adentro ya es una (un buscador)
10
+ * @param {boolean} [props.exclusive] en el teléfono, mientras se ve, es lo único del renglón flotante (con los demás grupos
11
+ * exclusivos): los otros se esconden, como el modo de edición del iPhone deja solo lo de lo elegido. Lo usa SelectionActions
12
+ * @param {object} [props.texts] los textos que cambian, con la forma de `layout` en los textos del paquete
10
13
  */
11
- export default function BarActions({ children, label, order, sx, inlineSx, bare }: {
14
+ export default function BarActions({ children, label, order, sx, inlineSx, bare, exclusive, texts }: {
12
15
  children: import('react').ReactNode;
13
16
  label?: string;
14
17
  order?: number;
15
18
  sx?: object | Function | any[];
16
19
  inlineSx?: object | Function | any[];
17
20
  bare?: boolean;
21
+ exclusive?: boolean;
22
+ texts?: object;
18
23
  }): import("react").JSX.Element;
@@ -1,4 +1,12 @@
1
1
  export declare const BAR_CAPSULE_HEIGHT_PIXELS = 48;
2
+ /**
3
+ * Los botones de adentro de un solo color y sin relleno, borde ni sombra (la regla de la barra con vidrio). La usan también
4
+ * la franja (BarActions) y lo que se ponga junto a la barra.
5
+ *
6
+ * @param {string} color el del texto de la barra ('inherit' en la franja)
7
+ * @returns {object} estilos para el sx del contenedor
8
+ */
9
+ export declare function monochromeButtonsSxOf(color: string): object;
2
10
  /**
3
11
  * Lo demás va al div de la cápsula: aria-label (el nombre del grupo para quien usa lector de pantalla), id, onClick…
4
12
  * role va por omisión en 'group' (lo que se agrupa se anuncia junto).
@@ -0,0 +1,24 @@
1
+ /**
2
+ * @param {object} props
3
+ * @param {string} props.value lo escrito
4
+ * @param {(value: string) => void} props.onChange recibe el texto, no el evento
5
+ * @param {string} props.placeholder ya traducido: qué se busca («Buscar por título o etiqueta»); también es su nombre para el
6
+ * lector de pantalla
7
+ * @param {boolean} [props.inBar] en la barra de la app (por omisión) o dentro de la pantalla
8
+ * @param {boolean} [props.collapsible] en la barra, sin usar se encoge a la lupa; por omisión sí (false: siempre abierta)
9
+ * @param {number} [props.order] en qué lugar va entre las cápsulas de la barra (por omisión la primera)
10
+ * @param {() => void} [props.onFocus]
11
+ * @param {() => void} [props.onBlur]
12
+ * @param {import('react').Ref<HTMLInputElement>} [props.inputRef] la caja, para enfocarla desde afuera (un atajo «/»)
13
+ */
14
+ export default function BarSearch({ value, onChange, placeholder, inBar, collapsible, order, onFocus, onBlur, inputRef }: {
15
+ value: string;
16
+ onChange: (value: string) => void;
17
+ placeholder: string;
18
+ inBar?: boolean;
19
+ collapsible?: boolean;
20
+ order?: number;
21
+ onFocus?: () => void;
22
+ onBlur?: () => void;
23
+ inputRef?: import('react').Ref<HTMLInputElement>;
24
+ }): import("react").JSX.Element;
@@ -0,0 +1,17 @@
1
+ /**
2
+ * @param {object} props
3
+ * @param {Array<{to?: string, href?: string, onClick?: Function, label?: string, labelKey?: string, Icon?: import('react').ElementType, icon?: import('react').ReactNode}>} props.links
4
+ * @param {() => void} props.onClose cierra el menú al elegir
5
+ */
6
+ export default function MenuLinks({ links, onClose }: {
7
+ links: Array<{
8
+ to?: string;
9
+ href?: string;
10
+ onClick?: Function;
11
+ label?: string;
12
+ labelKey?: string;
13
+ Icon?: import('react').ElementType;
14
+ icon?: import('react').ReactNode;
15
+ }>;
16
+ onClose: () => void;
17
+ }): import("react").JSX.Element[];
@@ -6,12 +6,15 @@
6
6
  * @param {import('react').ReactNode} [props.account] la cuenta (o el engrane), en su círculo junto a la barra
7
7
  * @param {import('react').ReactNode} [props.moreFooter] lo que va al final de la hoja de «Más» (la tarjeta del menú lateral)
8
8
  * @param {boolean} [props.minimizeOnScroll] se encoge al leer hacia abajo; por omisión sí
9
+ * @param {(keys: string[]|null) => void} [props.onPinnedTabsChange] la persona eligió sus pestañas (null: regresó a las de
10
+ * omisión)
9
11
  */
10
- export default function MobileTabBar({ menuItems, activeItem, menuBadges, account, moreFooter, minimizeOnScroll }: {
12
+ export default function MobileTabBar({ menuItems, activeItem, menuBadges, account, moreFooter, minimizeOnScroll, onPinnedTabsChange }: {
11
13
  menuItems: object[];
12
14
  activeItem: object | null;
13
15
  menuBadges?: Record<string, number>;
14
16
  account?: import('react').ReactNode;
15
17
  moreFooter?: import('react').ReactNode;
16
18
  minimizeOnScroll?: boolean;
19
+ onPinnedTabsChange?: (keys: string[] | null) => void;
17
20
  }): import("react").JSX.Element;