@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.
- package/README.md +127 -22
- package/cli/projectFiles.js +5 -3
- package/cli/templates/project/README.md.tpl +28 -0
- package/cli/templates/project/public/manifest.webmanifest.tpl +6 -6
- package/cli/templates/project/src/app/AppProviders.jsx.tpl +9 -4
- package/cli/templates/project/src/app/appRouter.jsx.tpl +4 -2
- package/cli/templates/project/src/app/appSettings.js.tpl +14 -0
- package/cli/templates/project/src/core/AppLogo.jsx.tpl +3 -1
- package/cli/templates/project/src/core/index.js.tpl +1 -0
- package/cli/templates/project/src/core/publicPaths.js.tpl +24 -0
- package/cli/templates/project/vite.config.js.tpl +27 -1
- package/dist/DataTable/AuditTrailTable.js +5 -3
- package/dist/DataTable/AuditTrailTable.js.map +1 -1
- package/dist/DataTable/ColumnFilters/MultiSelectColumnFilter.js +2 -1
- package/dist/DataTable/ColumnFilters/MultiSelectColumnFilter.js.map +1 -1
- package/dist/DataTable/EmptyState.js +2 -2
- package/dist/DataTable/EmptyState.js.map +1 -1
- package/dist/DataTable/FilterChips.js +2 -2
- package/dist/DataTable/FilterChips.js.map +1 -1
- package/dist/DataTable/GoToPage.js +4 -3
- package/dist/DataTable/GoToPage.js.map +1 -1
- package/dist/DataTable/ServerTable.js +153 -83
- package/dist/DataTable/ServerTable.js.map +1 -1
- package/dist/DataTable/rowSelection.js +61 -0
- package/dist/DataTable/rowSelection.js.map +1 -0
- package/dist/access/PermissionMatrix.js +3 -2
- package/dist/access/PermissionMatrix.js.map +1 -1
- package/dist/account/AccountSecuritySection.js +2 -2
- package/dist/account/AccountSecuritySection.js.map +1 -1
- package/dist/account/ForgotPasswordScreen.js +5 -4
- package/dist/account/ForgotPasswordScreen.js.map +1 -1
- package/dist/account/ProfileScreen.js +39 -13
- package/dist/account/ProfileScreen.js.map +1 -1
- package/dist/account/ResetPasswordScreen.js +3 -2
- package/dist/account/ResetPasswordScreen.js.map +1 -1
- package/dist/account/SignInScreen.js +7 -6
- package/dist/account/SignInScreen.js.map +1 -1
- package/dist/account/accountConnector.js.map +1 -1
- package/dist/account/restAccountConnector.js +2 -1
- package/dist/account/restAccountConnector.js.map +1 -1
- package/dist/adapters/reactRouterRoutes.js +7 -6
- package/dist/adapters/reactRouterRoutes.js.map +1 -1
- package/dist/api/createApiClient.js +40 -5
- package/dist/api/createApiClient.js.map +1 -1
- package/dist/appShell/AccountMenu.js +15 -23
- package/dist/appShell/AccountMenu.js.map +1 -1
- package/dist/appShell/AppLayout.js +42 -15
- package/dist/appShell/AppLayout.js.map +1 -1
- package/dist/appShell/AppearanceSettings.js +29 -6
- package/dist/appShell/AppearanceSettings.js.map +1 -1
- package/dist/appShell/AuthLayout.js +2 -0
- package/dist/appShell/AuthLayout.js.map +1 -1
- package/dist/appShell/BarActionButton.js +3 -3
- package/dist/appShell/BarActionButton.js.map +1 -1
- package/dist/appShell/BarActions.js +19 -8
- package/dist/appShell/BarActions.js.map +1 -1
- package/dist/appShell/BarCapsule.js +19 -4
- package/dist/appShell/BarCapsule.js.map +1 -1
- package/dist/appShell/BarSearch.js +92 -0
- package/dist/appShell/BarSearch.js.map +1 -0
- package/dist/appShell/HeaderTools.js +4 -2
- package/dist/appShell/HeaderTools.js.map +1 -1
- package/dist/appShell/MenuLinks.js +36 -0
- package/dist/appShell/MenuLinks.js.map +1 -0
- package/dist/appShell/MobileTabBar.js +6 -4
- package/dist/appShell/MobileTabBar.js.map +1 -1
- package/dist/appShell/SettingsMenu.js +10 -5
- package/dist/appShell/SettingsMenu.js.map +1 -1
- package/dist/appShell/SideMenu.js +5 -3
- package/dist/appShell/SideMenu.js.map +1 -1
- package/dist/appShell/SideMenuEntry.js +3 -3
- package/dist/appShell/SideMenuEntry.js.map +1 -1
- package/dist/appShell/SubmenuActionsMenu.js +3 -4
- package/dist/appShell/SubmenuActionsMenu.js.map +1 -1
- package/dist/appShell/TopMenu.js +5 -6
- package/dist/appShell/TopMenu.js.map +1 -1
- package/dist/appShell/Wordmark.js +11 -0
- package/dist/appShell/Wordmark.js.map +1 -0
- package/dist/appShell/menuItemText.js +4 -0
- package/dist/appShell/menuItemText.js.map +1 -1
- package/dist/appShell/shellSizes.js +2 -0
- package/dist/appShell/shellSizes.js.map +1 -1
- package/dist/auth/PasswordChecklist.js +2 -2
- package/dist/auth/PasswordChecklist.js.map +1 -1
- package/dist/calendar/EventCalendar.js +16 -5
- package/dist/calendar/EventCalendar.js.map +1 -1
- package/dist/calendar/EventDetails.js +74 -0
- package/dist/calendar/EventDetails.js.map +1 -0
- package/dist/calendar/calendarEvents.js +31 -0
- package/dist/calendar/calendarEvents.js.map +1 -0
- package/dist/calendar.js +8 -1
- package/dist/calendar.js.map +1 -1
- package/dist/charts.js +10 -1
- package/dist/charts.js.map +1 -1
- package/dist/datePickers/DateInput.js +3 -2
- package/dist/datePickers/DateInput.js.map +1 -1
- package/dist/downloads/DownloadManager.js +14 -20
- package/dist/downloads/DownloadManager.js.map +1 -1
- package/dist/downloads/downloadQueue.js +4 -2
- package/dist/downloads/downloadQueue.js.map +1 -1
- package/dist/downloads/downloadsMachine.js +4 -1
- package/dist/downloads/downloadsMachine.js.map +1 -1
- package/dist/downloads/fileTypes.js +22 -0
- package/dist/downloads/fileTypes.js.map +1 -0
- package/dist/feedback/ConfirmDialog.js +3 -2
- package/dist/feedback/ConfirmDialog.js.map +1 -1
- package/dist/feedback/ModalWaiting.js +2 -2
- package/dist/feedback/ModalWaiting.js.map +1 -1
- package/dist/feedback/NewBuildNotice.js +2 -2
- package/dist/feedback/NewBuildNotice.js.map +1 -1
- package/dist/filepond/FileDropzone.js +5 -3
- package/dist/filepond/FileDropzone.js.map +1 -1
- package/dist/formatting.js +171 -143
- package/dist/formatting.js.map +1 -1
- package/dist/forms/FormWizard.js +18 -45
- package/dist/forms/FormWizard.js.map +1 -1
- package/dist/forms/auth/ChangePasswordForm.js +5 -4
- package/dist/forms/auth/ChangePasswordForm.js.map +1 -1
- package/dist/forms/auth/ForgotPasswordForm.js +2 -2
- package/dist/forms/auth/ForgotPasswordForm.js.map +1 -1
- package/dist/forms/auth/SignInForm.js +2 -2
- package/dist/forms/auth/SignInForm.js.map +1 -1
- package/dist/forms/security/SecondStepForm.js +2 -2
- package/dist/forms/security/SecondStepForm.js.map +1 -1
- package/dist/forms/security/TwoStepVerificationCard.js +8 -6
- package/dist/forms/security/TwoStepVerificationCard.js.map +1 -1
- package/dist/hookForm/FormWizard.js +59 -0
- package/dist/hookForm/FormWizard.js.map +1 -0
- package/dist/inbox/InboxLayout.js +44 -8
- package/dist/inbox/InboxLayout.js.map +1 -1
- package/dist/inbox/MessageList.js +71 -21
- package/dist/inbox/MessageList.js.map +1 -1
- package/dist/inbox/MessageView.js +80 -29
- package/dist/inbox/MessageView.js.map +1 -1
- package/dist/inbox/inboxDates.js +4 -3
- package/dist/inbox/inboxDates.js.map +1 -1
- package/dist/index.js +163 -136
- package/dist/index.js.map +1 -1
- package/dist/inputs/CatalogInput.js +8 -4
- package/dist/inputs/CatalogInput.js.map +1 -1
- package/dist/inputs/ColorInput.js +3 -2
- package/dist/inputs/ColorInput.js.map +1 -1
- package/dist/inputs/FormSection.js +3 -3
- package/dist/inputs/FormSection.js.map +1 -1
- package/dist/inputs/NumberInput.js +3 -2
- package/dist/inputs/NumberInput.js.map +1 -1
- package/dist/inputs/SelectInput.js +29 -11
- package/dist/inputs/SelectInput.js.map +1 -1
- package/dist/inputs/TextInput.js +6 -2
- package/dist/inputs/TextInput.js.map +1 -1
- package/dist/inputs/WizardLayout.js +54 -0
- package/dist/inputs/WizardLayout.js.map +1 -0
- package/dist/kanban/KanbanBoard.js +239 -14
- package/dist/kanban/KanbanBoard.js.map +1 -1
- package/dist/kanban/kanbanCards.js +19 -0
- package/dist/kanban/kanbanCards.js.map +1 -0
- package/dist/kanban.js +7 -1
- package/dist/kanban.js.map +1 -1
- package/dist/locales/en.js +74 -1
- package/dist/locales/en.js.map +1 -1
- package/dist/locales/es.js +74 -1
- package/dist/locales/es.js.map +1 -1
- package/dist/maps/MapView.js +28 -8
- package/dist/maps/MapView.js.map +1 -1
- package/dist/navigation/appMenu.js +13 -1
- package/dist/navigation/appMenu.js.map +1 -1
- package/dist/observability/logger.js +18 -0
- package/dist/observability/logger.js.map +1 -1
- package/dist/observability/usePublishedBuildWatch.js +4 -3
- package/dist/observability/usePublishedBuildWatch.js.map +1 -1
- package/dist/pwa/InstallAppSetting.js +6 -5
- package/dist/pwa/InstallAppSetting.js.map +1 -1
- package/dist/pwa/InstallInstructionsDialog.js +2 -2
- package/dist/pwa/InstallInstructionsDialog.js.map +1 -1
- package/dist/pwa/InstallPromptBanner.js +15 -9
- package/dist/pwa/InstallPromptBanner.js.map +1 -1
- package/dist/pwa/useInstallPrompt.js +2 -1
- package/dist/pwa/useInstallPrompt.js.map +1 -1
- package/dist/react-hook-form.js +6 -4
- package/dist/react-hook-form.js.map +1 -1
- package/dist/security/ActivityLog.js +4 -3
- package/dist/security/ActivityLog.js.map +1 -1
- package/dist/security/RecoveryCodesDialog.js +4 -3
- package/dist/security/RecoveryCodesDialog.js.map +1 -1
- package/dist/security/SessionsCard.js +8 -6
- package/dist/security/SessionsCard.js.map +1 -1
- package/dist/table.js +2 -0
- package/dist/table.js.map +1 -1
- package/dist/theme/components/MuiAppBar.js +6 -5
- package/dist/theme/components/MuiAppBar.js.map +1 -1
- package/dist/theme/components/MuiDialog.js +13 -0
- package/dist/theme/components/MuiDialog.js.map +1 -0
- package/dist/theme/components/glassComponents.js +32 -31
- package/dist/theme/components/glassComponents.js.map +1 -1
- package/dist/theme/components/minimalComponents.js +8 -4
- package/dist/theme/components/minimalComponents.js.map +1 -1
- package/dist/theme/createToolkitTheme.js.map +1 -1
- package/dist/theme/glassSurface.js +36 -38
- package/dist/theme/glassSurface.js.map +1 -1
- package/dist/theme/lightDarkStyles.js +48 -0
- package/dist/theme/lightDarkStyles.js.map +1 -0
- package/dist/theme/toolkitComponents.js +2 -0
- package/dist/theme/toolkitComponents.js.map +1 -1
- package/dist/toolkit/ComponentTexts.js +13 -0
- package/dist/toolkit/ComponentTexts.js.map +1 -0
- package/dist/toolkit/ToolkitProvider.js +36 -28
- package/dist/toolkit/ToolkitProvider.js.map +1 -1
- package/dist/toolkit/browserNavigation.js +19 -20
- package/dist/toolkit/browserNavigation.js.map +1 -1
- package/dist/toolkit/componentTextsContext.js +15 -0
- package/dist/toolkit/componentTextsContext.js.map +1 -0
- package/dist/toolkit/hashNavigation.js +40 -0
- package/dist/toolkit/hashNavigation.js.map +1 -0
- package/dist/toolkit/navigationPaths.js +49 -0
- package/dist/toolkit/navigationPaths.js.map +1 -0
- package/dist/toolkit/toolkitSettings.js +24 -4
- package/dist/toolkit/toolkitSettings.js.map +1 -1
- package/dist/toolkit/useFormatters.js +12 -0
- package/dist/toolkit/useFormatters.js.map +1 -0
- package/dist/toolkit/useToolkitTranslation.js +11 -7
- package/dist/toolkit/useToolkitTranslation.js.map +1 -1
- package/dist/types/DataTable/AuditTrailTable.d.ts +3 -1
- package/dist/types/DataTable/EmptyState.d.ts +7 -2
- package/dist/types/DataTable/FilterChips.d.ts +3 -1
- package/dist/types/DataTable/GoToPage.d.ts +7 -2
- package/dist/types/DataTable/SelectionBar.d.ts +32 -0
- package/dist/types/DataTable/ServerTable.d.ts +64 -3
- package/dist/types/DataTable/index.d.ts +1 -1
- package/dist/types/DataTable/rowSelection.d.ts +113 -0
- package/dist/types/access/PermissionMatrix.d.ts +3 -1
- package/dist/types/account/AccountSecuritySection.d.ts +3 -1
- package/dist/types/account/ForgotPasswordScreen.d.ts +3 -1
- package/dist/types/account/ProfileScreen.d.ts +31 -1
- package/dist/types/account/ResetPasswordScreen.d.ts +3 -1
- package/dist/types/account/SignInScreen.d.ts +3 -1
- package/dist/types/account/accountConnector.d.ts +7 -2
- package/dist/types/adapters/reactRouterRoutes.d.ts +14 -2
- package/dist/types/api/createApiClient.d.ts +46 -1
- package/dist/types/appShell/AppLayout.d.ts +15 -1
- package/dist/types/appShell/AppearanceSettings.d.ts +8 -1
- package/dist/types/appShell/BarActionButton.d.ts +2 -2
- package/dist/types/appShell/BarActions.d.ts +6 -1
- package/dist/types/appShell/BarCapsule.d.ts +8 -0
- package/dist/types/appShell/BarSearch.d.ts +24 -0
- package/dist/types/appShell/MenuLinks.d.ts +17 -0
- package/dist/types/appShell/MobileTabBar.d.ts +4 -1
- package/dist/types/appShell/SettingsMenu.d.ts +3 -1
- package/dist/types/appShell/SideMenu.d.ts +3 -1
- package/dist/types/appShell/Wordmark.d.ts +6 -0
- package/dist/types/appShell/menuItemText.d.ts +16 -0
- package/dist/types/appShell/shellSizes.d.ts +1 -0
- package/dist/types/auth/PasswordChecklist.d.ts +3 -1
- package/dist/types/calendar/EventCalendar.d.ts +18 -1
- package/dist/types/calendar/EventDetails.d.ts +36 -0
- package/dist/types/calendar/calendarEvents.d.ts +27 -0
- package/dist/types/calendar.d.ts +2 -0
- package/dist/types/charts.d.ts +4 -0
- package/dist/types/datePickers/DateInput.d.ts +3 -1
- package/dist/types/downloads/DownloadManager.d.ts +7 -1
- package/dist/types/downloads/downloadQueue.d.ts +8 -3
- package/dist/types/downloads/fileTypes.d.ts +39 -0
- package/dist/types/downloads/index.d.ts +1 -0
- package/dist/types/feedback/ConfirmDialog.d.ts +3 -1
- package/dist/types/feedback/ModalWaiting.d.ts +7 -2
- package/dist/types/feedback/NewBuildNotice.d.ts +3 -1
- package/dist/types/filepond/FileDropzone.d.ts +3 -1
- package/dist/types/formatting.d.ts +45 -90
- package/dist/types/forms/FormWizard.d.ts +3 -1
- package/dist/types/forms/auth/ChangePasswordForm.d.ts +3 -1
- package/dist/types/forms/auth/ForgotPasswordForm.d.ts +3 -1
- package/dist/types/forms/auth/SignInForm.d.ts +3 -1
- package/dist/types/forms/security/SecondStepForm.d.ts +3 -1
- package/dist/types/forms/security/TwoStepVerificationCard.d.ts +3 -1
- package/dist/types/hookForm/FormWizard.d.ts +22 -0
- package/dist/types/inbox/InboxLayout.d.ts +14 -2
- package/dist/types/inbox/MessageList.d.ts +30 -5
- package/dist/types/inbox/MessageView.d.ts +35 -3
- package/dist/types/inbox/inboxDates.d.ts +6 -1
- package/dist/types/index.d.ts +15 -8
- package/dist/types/inputs/CatalogInput.d.ts +9 -5
- package/dist/types/inputs/ColorInput.d.ts +3 -1
- package/dist/types/inputs/FormSection.d.ts +2 -2
- package/dist/types/inputs/NumberInput.d.ts +3 -1
- package/dist/types/inputs/SelectInput.d.ts +9 -5
- package/dist/types/inputs/TextInput.d.ts +3 -1
- package/dist/types/inputs/WizardLayout.d.ts +34 -0
- package/dist/types/kanban/KanbanBoard.d.ts +61 -6
- package/dist/types/kanban/kanbanCards.d.ts +22 -0
- package/dist/types/kanban.d.ts +1 -0
- package/dist/types/locales/en.d.ts +77 -0
- package/dist/types/locales/es.d.ts +77 -0
- package/dist/types/maps/MapView.d.ts +12 -3
- package/dist/types/navigation/appMenu.d.ts +8 -0
- package/dist/types/observability/logger.d.ts +13 -0
- package/dist/types/observability/usePublishedBuildWatch.d.ts +3 -1
- package/dist/types/pwa/InstallAppSetting.d.ts +7 -1
- package/dist/types/pwa/InstallInstructionsDialog.d.ts +3 -1
- package/dist/types/pwa/InstallPromptBanner.d.ts +10 -1
- package/dist/types/pwa/useInstallPrompt.d.ts +3 -2
- package/dist/types/react-hook-form.d.ts +1 -0
- package/dist/types/security/ActivityLog.d.ts +3 -1
- package/dist/types/security/RecoveryCodesDialog.d.ts +6 -1
- package/dist/types/security/SessionsCard.d.ts +3 -1
- package/dist/types/table.d.ts +3 -1
- package/dist/types/theme/components/MuiAppBar.d.ts +3 -1
- package/dist/types/theme/components/MuiDialog.d.ts +9 -0
- package/dist/types/theme/components/glassComponents.d.ts +5 -0
- package/dist/types/theme/lightDarkStyles.d.ts +8 -0
- package/dist/types/toolkit/ComponentTexts.d.ts +11 -0
- package/dist/types/toolkit/ToolkitProvider.d.ts +18 -2
- package/dist/types/toolkit/browserNavigation.d.ts +23 -28
- package/dist/types/toolkit/componentTextsContext.d.ts +20 -0
- package/dist/types/toolkit/hashNavigation.d.ts +12 -0
- package/dist/types/toolkit/navigationPaths.d.ts +43 -0
- package/dist/types/toolkit/toolkitSettings.d.ts +49 -4
- package/dist/types/toolkit/useFormatters.d.ts +6 -0
- package/dist/types/toolkit/useToolkitTranslation.d.ts +2 -1
- package/dist/types/ui/actions/ActionsMenu.d.ts +20 -0
- package/dist/types/ui/actions/CopyButton.d.ts +3 -1
- package/dist/types/ui/actions/DownloadMenu.d.ts +8 -3
- package/dist/types/ui/actions/SecretField.d.ts +5 -1
- package/dist/types/ui/actions/SelectionActions.d.ts +39 -0
- package/dist/types/ui/filters/DateRangeFilter.d.ts +3 -1
- package/dist/types/ui/filters/QuickFilters.d.ts +3 -1
- package/dist/types/ui/index.d.ts +1 -1
- package/dist/types/ui/labels/tagOf.d.ts +13 -0
- package/dist/types/ui/layout/CollapsibleSection.d.ts +4 -1
- package/dist/types/ui/layout/ContentDialog.d.ts +3 -1
- package/dist/types/ui/layout/ErrorPage.d.ts +14 -1
- package/dist/types/ui/layout/FullPageLoader.d.ts +7 -1
- package/dist/types/ui/layout/PageHeading.d.ts +3 -1
- package/dist/types/ui/metrics/BarList.d.ts +7 -1
- package/dist/types/ui/metrics/CalendarHeatmap.d.ts +7 -1
- package/dist/types/ui/metrics/ChartTooltip.d.ts +9 -3
- package/dist/types/ui/metrics/ColumnChart.d.ts +23 -11
- package/dist/types/ui/metrics/LineChart.d.ts +41 -0
- package/dist/types/ui/metrics/MetricCard.d.ts +9 -1
- package/dist/types/ui/metrics/TableToggle.d.ts +9 -2
- package/dist/types/ui/metrics/chartParts.d.ts +112 -0
- package/dist/types/ui/navigation/BackButton.d.ts +3 -1
- package/dist/types/ui/navigation/ColorSchemeToggle.d.ts +8 -2
- package/dist/types/ui/navigation/FontSizeToggle.d.ts +7 -2
- package/dist/types/ui/navigation/LanguageToggle.d.ts +8 -3
- package/dist/types/ui/navigation/PageBreadcrumbs.d.ts +5 -2
- package/dist/types/ui/timeline/GroupedTimeline.d.ts +4 -1
- package/dist/types/upload/FileDropzone.d.ts +3 -1
- package/dist/ui/actions/ActionsMenu.js +51 -0
- package/dist/ui/actions/ActionsMenu.js.map +1 -0
- package/dist/ui/actions/CopyButton.js +2 -2
- package/dist/ui/actions/CopyButton.js.map +1 -1
- package/dist/ui/actions/DownloadMenu.js +11 -12
- package/dist/ui/actions/DownloadMenu.js.map +1 -1
- package/dist/ui/actions/SecretField.js +8 -4
- package/dist/ui/actions/SecretField.js.map +1 -1
- package/dist/ui/actions/SelectionActions.js +142 -0
- package/dist/ui/actions/SelectionActions.js.map +1 -0
- package/dist/ui/filters/DateRangeFilter.js +4 -3
- package/dist/ui/filters/DateRangeFilter.js.map +1 -1
- package/dist/ui/filters/QuickFilters.js +2 -2
- package/dist/ui/filters/QuickFilters.js.map +1 -1
- package/dist/ui/labels/tagOf.js +7 -0
- package/dist/ui/labels/tagOf.js.map +1 -0
- package/dist/ui/layout/CollapsibleSection.js +6 -2
- package/dist/ui/layout/CollapsibleSection.js.map +1 -1
- package/dist/ui/layout/ContentDialog.js +2 -2
- package/dist/ui/layout/ContentDialog.js.map +1 -1
- package/dist/ui/layout/ErrorPage.js +21 -7
- package/dist/ui/layout/ErrorPage.js.map +1 -1
- package/dist/ui/layout/FullPageLoader.js +2 -2
- package/dist/ui/layout/FullPageLoader.js.map +1 -1
- package/dist/ui/layout/PageHeading.js +2 -2
- package/dist/ui/layout/PageHeading.js.map +1 -1
- package/dist/ui/metrics/BarList.js +18 -13
- package/dist/ui/metrics/BarList.js.map +1 -1
- package/dist/ui/metrics/CalendarHeatmap.js +11 -6
- package/dist/ui/metrics/CalendarHeatmap.js.map +1 -1
- package/dist/ui/metrics/ChartTooltip.js +1 -1
- package/dist/ui/metrics/ChartTooltip.js.map +1 -1
- package/dist/ui/metrics/ColumnChart.js +59 -63
- package/dist/ui/metrics/ColumnChart.js.map +1 -1
- package/dist/ui/metrics/LineChart.js +117 -0
- package/dist/ui/metrics/LineChart.js.map +1 -0
- package/dist/ui/metrics/MetricCard.js +41 -8
- package/dist/ui/metrics/MetricCard.js.map +1 -1
- package/dist/ui/metrics/TableToggle.js +4 -2
- package/dist/ui/metrics/TableToggle.js.map +1 -1
- package/dist/ui/metrics/chartParts.js +93 -0
- package/dist/ui/metrics/chartParts.js.map +1 -0
- package/dist/ui/navigation/BackButton.js +2 -2
- package/dist/ui/navigation/BackButton.js.map +1 -1
- package/dist/ui/navigation/ColorSchemeToggle.js +6 -3
- package/dist/ui/navigation/ColorSchemeToggle.js.map +1 -1
- package/dist/ui/navigation/FontSizeToggle.js +3 -2
- package/dist/ui/navigation/FontSizeToggle.js.map +1 -1
- package/dist/ui/navigation/LanguageToggle.js +40 -19
- package/dist/ui/navigation/LanguageToggle.js.map +1 -1
- package/dist/ui/navigation/PageBreadcrumbs.js +2 -2
- package/dist/ui/navigation/PageBreadcrumbs.js.map +1 -1
- package/dist/ui/timeline/GroupedTimeline.js +10 -8
- package/dist/ui/timeline/GroupedTimeline.js.map +1 -1
- package/dist/upload/FileDropzone.js +5 -3
- package/dist/upload/FileDropzone.js.map +1 -1
- 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}
|
|
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[]
|
|
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(
|
|
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
|
|
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;
|