@stackcraftmx/calcita 0.0.0-stage → 0.23.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/LICENSE +110 -0
- package/README.md +611 -2
- package/cli/askQuestions.js +63 -0
- package/cli/calcita.js +150 -0
- package/cli/makeComponent.js +50 -0
- package/cli/makeForm.js +68 -0
- package/cli/makeModule.js +78 -0
- package/cli/makePage.js +62 -0
- package/cli/names.js +64 -0
- package/cli/newProject.js +103 -0
- package/cli/packageVersions.js +38 -0
- package/cli/projectAnswers.js +145 -0
- package/cli/projectConfig.js +38 -0
- package/cli/projectFiles.js +126 -0
- package/cli/screenLabels.js +41 -0
- package/cli/templateFiles.js +186 -0
- package/cli/templates/component/core/__ComponentName__.jsx.tpl +23 -0
- package/cli/templates/component/module/__ComponentName__.jsx.tpl +21 -0
- package/cli/templates/form/formik/__FormName__.jsx.tpl +50 -0
- package/cli/templates/form/hookForm/__FormName__.jsx.tpl +53 -0
- package/cli/templates/form/shared/__formName__Schema.js.tpl +20 -0
- package/cli/templates/form/shared/__formName__Texts.js.tpl +6 -0
- package/cli/templates/module/__Name__Page.jsx.tpl +75 -0
- package/cli/templates/module/__name__Api.js.tpl +39 -0
- package/cli/templates/module/__name__Texts.js.tpl +27 -0
- package/cli/templates/module/menu.js.tpl +21 -0
- package/cli/templates/module/routes.js.tpl +7 -0
- package/cli/templates/moduleServer/__name__Server.js.tpl +68 -0
- package/cli/templates/page/__PageName__Page.jsx.tpl +22 -0
- package/cli/templates/page/__pageName__PageTexts.js.tpl +23 -0
- package/cli/templates/project/README.md.tpl +55 -0
- package/cli/templates/project/dot-gitignore.tpl +11 -0
- package/cli/templates/project/index.html.tpl +20 -0
- package/cli/templates/project/jsconfig.json.tpl +16 -0
- package/cli/templates/project/pnpm-workspace.yaml.tpl +5 -0
- package/cli/templates/project/public/favicon.svg +1 -0
- package/cli/templates/project/public/icons/apple-touch-icon.png +0 -0
- package/cli/templates/project/public/icons/icon-192.png +0 -0
- package/cli/templates/project/public/icons/icon-512-maskable.png +0 -0
- package/cli/templates/project/public/icons/icon-512.png +0 -0
- package/cli/templates/project/public/manifest.webmanifest.tpl +17 -0
- package/cli/templates/project/src/app/AppProviders.jsx.tpl +102 -0
- package/cli/templates/project/src/app/AppShell.jsx.tpl +87 -0
- package/cli/templates/project/src/app/appRouter.jsx.tpl +49 -0
- package/cli/templates/project/src/app/appSettings.js.tpl +13 -0
- package/cli/templates/project/src/app/appTexts.js.tpl +15 -0
- package/cli/templates/project/src/app/combineTexts.js.tpl +31 -0
- package/cli/templates/project/src/app/i18n.js.tpl +19 -0
- package/cli/templates/project/src/app/shellTexts.js.tpl +16 -0
- package/cli/templates/project/src/core/AppLogo.jsx.tpl +12 -0
- package/cli/templates/project/src/core/accountConnector.js.tpl +36 -0
- package/cli/templates/project/src/core/apiClient.js.tpl +15 -0
- package/cli/templates/project/src/core/appPaths.js.tpl +11 -0
- package/cli/templates/project/src/core/index.js.tpl +8 -0
- package/cli/templates/project/src/fakeServer/networkDelay.js.tpl +40 -0
- package/cli/templates/project/src/fakeServer/serverText.js.tpl +20 -0
- package/cli/templates/project/src/main.jsx.tpl +24 -0
- package/cli/templates/project/src/modules/auth/ForgotPasswordPage.jsx.tpl +14 -0
- package/cli/templates/project/src/modules/auth/ResetPasswordPage.jsx.tpl +15 -0
- package/cli/templates/project/src/modules/auth/SignInPage.jsx.tpl +29 -0
- package/cli/templates/project/src/modules/auth/authTexts.js.tpl +6 -0
- package/cli/templates/project/src/modules/auth/routes.js.tpl +11 -0
- package/cli/templates/project/src/modules/home/HomePage.jsx.tpl +38 -0
- package/cli/templates/project/src/modules/home/homeTexts.js.tpl +29 -0
- package/cli/templates/project/src/modules/home/menu.js.tpl +17 -0
- package/cli/templates/project/src/modules/home/routes.js.tpl +4 -0
- package/cli/templates/project/src/modules/profile/ProfilePage.jsx.tpl +13 -0
- package/cli/templates/project/src/modules/profile/routes.js.tpl +6 -0
- package/cli/templates/project/vite.config.js.tpl +27 -0
- package/dist/DataTable/AuditTrailDialog.js +40 -0
- package/dist/DataTable/AuditTrailDialog.js.map +1 -0
- package/dist/DataTable/AuditTrailTable.js +87 -0
- package/dist/DataTable/AuditTrailTable.js.map +1 -0
- package/dist/DataTable/ColumnFilters/HeaderFilterPopover.js +71 -0
- package/dist/DataTable/ColumnFilters/HeaderFilterPopover.js.map +1 -0
- package/dist/DataTable/ColumnFilters/MultiSelectColumnFilter.js +50 -0
- package/dist/DataTable/ColumnFilters/MultiSelectColumnFilter.js.map +1 -0
- package/dist/DataTable/ColumnFilters/SortableFilterHeader.js +54 -0
- package/dist/DataTable/ColumnFilters/SortableFilterHeader.js.map +1 -0
- package/dist/DataTable/ColumnFilters/TextColumnFilter.js +24 -0
- package/dist/DataTable/ColumnFilters/TextColumnFilter.js.map +1 -0
- package/dist/DataTable/EmptyState.js +22 -0
- package/dist/DataTable/EmptyState.js.map +1 -0
- package/dist/DataTable/FilterChips.js +39 -0
- package/dist/DataTable/FilterChips.js.map +1 -0
- package/dist/DataTable/GoToPage.js +62 -0
- package/dist/DataTable/GoToPage.js.map +1 -0
- package/dist/DataTable/ServerTable.js +407 -0
- package/dist/DataTable/ServerTable.js.map +1 -0
- package/dist/DataTable/buildChipConfig.js +27 -0
- package/dist/DataTable/buildChipConfig.js.map +1 -0
- package/dist/DataTable/columns.js +122 -0
- package/dist/DataTable/columns.js.map +1 -0
- package/dist/DataTable/filterContext.js +15 -0
- package/dist/DataTable/filterContext.js.map +1 -0
- package/dist/DataTable/serverTableParams.js +19 -0
- package/dist/DataTable/serverTableParams.js.map +1 -0
- package/dist/DataTable/tableMachine.js +87 -0
- package/dist/DataTable/tableMachine.js.map +1 -0
- package/dist/DataTable/useDebouncedFilter.js +29 -0
- package/dist/DataTable/useDebouncedFilter.js.map +1 -0
- package/dist/DataTable/useTableState.js +132 -0
- package/dist/DataTable/useTableState.js.map +1 -0
- package/dist/access/Can.js +9 -0
- package/dist/access/Can.js.map +1 -0
- package/dist/access/PermissionMatrix.js +83 -0
- package/dist/access/PermissionMatrix.js.map +1 -0
- package/dist/access/RequireAccess.js +14 -0
- package/dist/access/RequireAccess.js.map +1 -0
- package/dist/access/accessRules.js +49 -0
- package/dist/access/accessRules.js.map +1 -0
- package/dist/access/permissionGroups.js +43 -0
- package/dist/access/permissionGroups.js.map +1 -0
- package/dist/access/useCan.js +12 -0
- package/dist/access/useCan.js.map +1 -0
- package/dist/account/AccountProvider.js +58 -0
- package/dist/account/AccountProvider.js.map +1 -0
- package/dist/account/AccountSecuritySection.js +81 -0
- package/dist/account/AccountSecuritySection.js.map +1 -0
- package/dist/account/DemoTotpCodeButton.js +26 -0
- package/dist/account/DemoTotpCodeButton.js.map +1 -0
- package/dist/account/ForgotPasswordScreen.js +26 -0
- package/dist/account/ForgotPasswordScreen.js.map +1 -0
- package/dist/account/ProfileScreen.js +108 -0
- package/dist/account/ProfileScreen.js.map +1 -0
- package/dist/account/ResetPasswordScreen.js +57 -0
- package/dist/account/ResetPasswordScreen.js.map +1 -0
- package/dist/account/SignInScreen.js +101 -0
- package/dist/account/SignInScreen.js.map +1 -0
- package/dist/account/accountConnector.js +31 -0
- package/dist/account/accountConnector.js.map +1 -0
- package/dist/account/demo/createDemoAccountConnector.js +368 -0
- package/dist/account/demo/createDemoAccountConnector.js.map +1 -0
- package/dist/account/demo/totp.js +61 -0
- package/dist/account/demo/totp.js.map +1 -0
- package/dist/account/restAccountConnector.js +117 -0
- package/dist/account/restAccountConnector.js.map +1 -0
- package/dist/account-demo.js +12 -0
- package/dist/account-demo.js.map +1 -0
- package/dist/account.js +25 -0
- package/dist/account.js.map +1 -0
- package/dist/adapters/i18next.js +7 -0
- package/dist/adapters/i18next.js.map +1 -0
- package/dist/adapters/nextNavigation.js +36 -0
- package/dist/adapters/nextNavigation.js.map +1 -0
- package/dist/adapters/reactRouter.js +7 -0
- package/dist/adapters/reactRouter.js.map +1 -0
- package/dist/adapters/reactRouterRoutes.js +48 -0
- package/dist/adapters/reactRouterRoutes.js.map +1 -0
- package/dist/api/ApiError.js +58 -0
- package/dist/api/ApiError.js.map +1 -0
- package/dist/api/createApiClient.js +226 -0
- package/dist/api/createApiClient.js.map +1 -0
- package/dist/api/staleChunks.js +47 -0
- package/dist/api/staleChunks.js.map +1 -0
- package/dist/appShell/AccountMenu.js +86 -0
- package/dist/appShell/AccountMenu.js.map +1 -0
- package/dist/appShell/AppLayout.js +493 -0
- package/dist/appShell/AppLayout.js.map +1 -0
- package/dist/appShell/AppearanceSettings.js +93 -0
- package/dist/appShell/AppearanceSettings.js.map +1 -0
- package/dist/appShell/AuthLayout.js +44 -0
- package/dist/appShell/AuthLayout.js.map +1 -0
- package/dist/appShell/BarActionButton.js +31 -0
- package/dist/appShell/BarActionButton.js.map +1 -0
- package/dist/appShell/BarActions.js +94 -0
- package/dist/appShell/BarActions.js.map +1 -0
- package/dist/appShell/BarCapsule.js +35 -0
- package/dist/appShell/BarCapsule.js.map +1 -0
- package/dist/appShell/HeaderTools.js +53 -0
- package/dist/appShell/HeaderTools.js.map +1 -0
- package/dist/appShell/MobileTabBar.js +346 -0
- package/dist/appShell/MobileTabBar.js.map +1 -0
- package/dist/appShell/SettingsMenu.js +41 -0
- package/dist/appShell/SettingsMenu.js.map +1 -0
- package/dist/appShell/SideMenu.js +217 -0
- package/dist/appShell/SideMenu.js.map +1 -0
- package/dist/appShell/SideMenuEntry.js +140 -0
- package/dist/appShell/SideMenuEntry.js.map +1 -0
- package/dist/appShell/SubmenuActionsMenu.js +71 -0
- package/dist/appShell/SubmenuActionsMenu.js.map +1 -0
- package/dist/appShell/TabBarEditor.js +55 -0
- package/dist/appShell/TabBarEditor.js.map +1 -0
- package/dist/appShell/TopMenu.js +80 -0
- package/dist/appShell/TopMenu.js.map +1 -0
- package/dist/appShell/appMenuContext.js +11 -0
- package/dist/appShell/appMenuContext.js.map +1 -0
- package/dist/appShell/barActionsSlot.js +26 -0
- package/dist/appShell/barActionsSlot.js.map +1 -0
- package/dist/appShell/barMenuPlacement.js +33 -0
- package/dist/appShell/barMenuPlacement.js.map +1 -0
- package/dist/appShell/menuItemText.js +33 -0
- package/dist/appShell/menuItemText.js.map +1 -0
- package/dist/appShell/pageTitle.js +45 -0
- package/dist/appShell/pageTitle.js.map +1 -0
- package/dist/appShell/shellSizes.js +38 -0
- package/dist/appShell/shellSizes.js.map +1 -0
- package/dist/appShell/tabBarRule.js +12 -0
- package/dist/appShell/tabBarRule.js.map +1 -0
- package/dist/appShell/tabBarScroll.js +23 -0
- package/dist/appShell/tabBarScroll.js.map +1 -0
- package/dist/appShell/useDrawerCollapsed.js +29 -0
- package/dist/appShell/useDrawerCollapsed.js.map +1 -0
- package/dist/appShell/useFittingActionCount.js +45 -0
- package/dist/appShell/useFittingActionCount.js.map +1 -0
- package/dist/appShell/usePinnedMobileTabs.js +32 -0
- package/dist/appShell/usePinnedMobileTabs.js.map +1 -0
- package/dist/appShell/useTabBarMinimized.js +33 -0
- package/dist/appShell/useTabBarMinimized.js.map +1 -0
- package/dist/auth/PasswordChecklist.js +44 -0
- package/dist/auth/PasswordChecklist.js.map +1 -0
- package/dist/auth/passwordRules.js +43 -0
- package/dist/auth/passwordRules.js.map +1 -0
- package/dist/calendar/EventCalendar.js +138 -0
- package/dist/calendar/EventCalendar.js.map +1 -0
- package/dist/calendar.js +6 -0
- package/dist/calendar.js.map +1 -0
- package/dist/charts.js +7 -0
- package/dist/charts.js.map +1 -0
- package/dist/date-pickers.js +8 -0
- package/dist/date-pickers.js.map +1 -0
- package/dist/datePickers/DateInput.js +75 -0
- package/dist/datePickers/DateInput.js.map +1 -0
- package/dist/datePickers/FormDateField.js +12 -0
- package/dist/datePickers/FormDateField.js.map +1 -0
- package/dist/dates.js +25 -0
- package/dist/dates.js.map +1 -0
- package/dist/dictionaries/dictionaries.js +48 -0
- package/dist/dictionaries/dictionaries.js.map +1 -0
- package/dist/downloads/DownloadManager.js +201 -0
- package/dist/downloads/DownloadManager.js.map +1 -0
- package/dist/downloads/downloadQueue.js +54 -0
- package/dist/downloads/downloadQueue.js.map +1 -0
- package/dist/downloads/downloadsMachine.js +77 -0
- package/dist/downloads/downloadsMachine.js.map +1 -0
- package/dist/excel/reportWorkbook.js +299 -0
- package/dist/excel/reportWorkbook.js.map +1 -0
- package/dist/excel.js +13 -0
- package/dist/excel.js.map +1 -0
- package/dist/feedback/ConfirmDialog.js +72 -0
- package/dist/feedback/ConfirmDialog.js.map +1 -0
- package/dist/feedback/ModalWaiting.js +23 -0
- package/dist/feedback/ModalWaiting.js.map +1 -0
- package/dist/feedback/NewBuildNotice.js +79 -0
- package/dist/feedback/NewBuildNotice.js.map +1 -0
- package/dist/feedback/StaleBuildBoundary.js +36 -0
- package/dist/feedback/StaleBuildBoundary.js.map +1 -0
- package/dist/feedback/Toaster.js +20 -0
- package/dist/feedback/Toaster.js.map +1 -0
- package/dist/feedback/confirmActionMachine.js +67 -0
- package/dist/feedback/confirmActionMachine.js.map +1 -0
- package/dist/feedback/toast.js +88 -0
- package/dist/feedback/toast.js.map +1 -0
- package/dist/feedback/useConfirmAction.js +40 -0
- package/dist/feedback/useConfirmAction.js.map +1 -0
- package/dist/filepond/FileDropzone.js +254 -0
- package/dist/filepond/FileDropzone.js.map +1 -0
- package/dist/filepond/pondServer.js +48 -0
- package/dist/filepond/pondServer.js.map +1 -0
- package/dist/filepond.js +10 -0
- package/dist/filepond.js.map +1 -0
- package/dist/files.js +43 -0
- package/dist/files.js.map +1 -0
- package/dist/formatting.js +177 -0
- package/dist/formatting.js.map +1 -0
- package/dist/forms/FormCatalogField.js +12 -0
- package/dist/forms/FormCatalogField.js.map +1 -0
- package/dist/forms/FormColorField.js +12 -0
- package/dist/forms/FormColorField.js.map +1 -0
- package/dist/forms/FormNumberField.js +12 -0
- package/dist/forms/FormNumberField.js.map +1 -0
- package/dist/forms/FormProblemAlert.js +15 -0
- package/dist/forms/FormProblemAlert.js.map +1 -0
- package/dist/forms/FormSelectField.js +12 -0
- package/dist/forms/FormSelectField.js.map +1 -0
- package/dist/forms/FormServerProblem.js +23 -0
- package/dist/forms/FormServerProblem.js.map +1 -0
- package/dist/forms/FormTextField.js +12 -0
- package/dist/forms/FormTextField.js.map +1 -0
- package/dist/forms/FormWizard.js +90 -0
- package/dist/forms/FormWizard.js.map +1 -0
- package/dist/forms/SubmitButton.js +14 -0
- package/dist/forms/SubmitButton.js.map +1 -0
- package/dist/forms/applyServerProblem.js +15 -0
- package/dist/forms/applyServerProblem.js.map +1 -0
- package/dist/forms/auth/ChangePasswordForm.js +46 -0
- package/dist/forms/auth/ChangePasswordForm.js.map +1 -0
- package/dist/forms/auth/ForgotPasswordForm.js +50 -0
- package/dist/forms/auth/ForgotPasswordForm.js.map +1 -0
- package/dist/forms/auth/SignInForm.js +48 -0
- package/dist/forms/auth/SignInForm.js.map +1 -0
- package/dist/forms/security/SecondStepForm.js +122 -0
- package/dist/forms/security/SecondStepForm.js.map +1 -0
- package/dist/forms/security/TwoStepVerificationCard.js +336 -0
- package/dist/forms/security/TwoStepVerificationCard.js.map +1 -0
- package/dist/forms/security/securityRules.js +28 -0
- package/dist/forms/security/securityRules.js.map +1 -0
- package/dist/forms/serverProblemFields.js +25 -0
- package/dist/forms/serverProblemFields.js.map +1 -0
- package/dist/forms/useFormikField.js +16 -0
- package/dist/forms/useFormikField.js.map +1 -0
- package/dist/forms/validation.js +55 -0
- package/dist/forms/validation.js.map +1 -0
- package/dist/forms/validationMessages.js +16 -0
- package/dist/forms/validationMessages.js.map +1 -0
- package/dist/forms.js +57 -0
- package/dist/forms.js.map +1 -0
- package/dist/hookForm/FormCatalogField.js +12 -0
- package/dist/hookForm/FormCatalogField.js.map +1 -0
- package/dist/hookForm/FormColorField.js +12 -0
- package/dist/hookForm/FormColorField.js.map +1 -0
- package/dist/hookForm/FormNumberField.js +12 -0
- package/dist/hookForm/FormNumberField.js.map +1 -0
- package/dist/hookForm/FormProblemAlert.js +17 -0
- package/dist/hookForm/FormProblemAlert.js.map +1 -0
- package/dist/hookForm/FormSelectField.js +12 -0
- package/dist/hookForm/FormSelectField.js.map +1 -0
- package/dist/hookForm/FormTextField.js +12 -0
- package/dist/hookForm/FormTextField.js.map +1 -0
- package/dist/hookForm/SubmitButton.js +15 -0
- package/dist/hookForm/SubmitButton.js.map +1 -0
- package/dist/hookForm/applyServerProblem.js +21 -0
- package/dist/hookForm/applyServerProblem.js.map +1 -0
- package/dist/hookForm/useHookFormField.js +19 -0
- package/dist/hookForm/useHookFormField.js.map +1 -0
- package/dist/i18next.js +5 -0
- package/dist/i18next.js.map +1 -0
- package/dist/identifiers.js +8 -0
- package/dist/identifiers.js.map +1 -0
- package/dist/inbox/InboxLayout.js +68 -0
- package/dist/inbox/InboxLayout.js.map +1 -0
- package/dist/inbox/MessageList.js +64 -0
- package/dist/inbox/MessageList.js.map +1 -0
- package/dist/inbox/MessageView.js +53 -0
- package/dist/inbox/MessageView.js.map +1 -0
- package/dist/inbox/inboxDates.js +8 -0
- package/dist/inbox/inboxDates.js.map +1 -0
- package/dist/index.js +383 -0
- package/dist/index.js.map +1 -0
- package/dist/inputs/CatalogInput.js +62 -0
- package/dist/inputs/CatalogInput.js.map +1 -0
- package/dist/inputs/ColorInput.js +108 -0
- package/dist/inputs/ColorInput.js.map +1 -0
- package/dist/inputs/FieldFrame.js +20 -0
- package/dist/inputs/FieldFrame.js.map +1 -0
- package/dist/inputs/FormSection.js +105 -0
- package/dist/inputs/FormSection.js.map +1 -0
- package/dist/inputs/NumberInput.js +69 -0
- package/dist/inputs/NumberInput.js.map +1 -0
- package/dist/inputs/SelectInput.js +66 -0
- package/dist/inputs/SelectInput.js.map +1 -0
- package/dist/inputs/TextInput.js +97 -0
- package/dist/inputs/TextInput.js.map +1 -0
- package/dist/inputs/colorContrast.js +46 -0
- package/dist/inputs/colorContrast.js.map +1 -0
- package/dist/inputs/formLayoutContext.js +9 -0
- package/dist/inputs/formLayoutContext.js.map +1 -0
- package/dist/inputs/numberText.js +48 -0
- package/dist/inputs/numberText.js.map +1 -0
- package/dist/kanban/KanbanBoard.js +113 -0
- package/dist/kanban/KanbanBoard.js.map +1 -0
- package/dist/kanban/kanbanMoves.js +29 -0
- package/dist/kanban/kanbanMoves.js.map +1 -0
- package/dist/kanban.js +9 -0
- package/dist/kanban.js.map +1 -0
- package/dist/laravel/csrfRetry.js +18 -0
- package/dist/laravel/csrfRetry.js.map +1 -0
- package/dist/laravel.js +6 -0
- package/dist/laravel.js.map +1 -0
- package/dist/lastListUrl.js +35 -0
- package/dist/lastListUrl.js.map +1 -0
- package/dist/locales/en.js +714 -0
- package/dist/locales/en.js.map +1 -0
- package/dist/locales/es.js +714 -0
- package/dist/locales/es.js.map +1 -0
- package/dist/maps/MapView.js +96 -0
- package/dist/maps/MapView.js.map +1 -0
- package/dist/maps/mapMarkers.js +19 -0
- package/dist/maps/mapMarkers.js.map +1 -0
- package/dist/maps.js +10 -0
- package/dist/maps.js.map +1 -0
- package/dist/money/money.js +380 -0
- package/dist/money/money.js.map +1 -0
- package/dist/money.js +6 -0
- package/dist/money.js.map +1 -0
- package/dist/navigation/appMenu.js +93 -0
- package/dist/navigation/appMenu.js.map +1 -0
- package/dist/navigation/useMenuBadges.js +45 -0
- package/dist/navigation/useMenuBadges.js.map +1 -0
- package/dist/navigation.js +30 -0
- package/dist/navigation.js.map +1 -0
- package/dist/navigationTrail.js +82 -0
- package/dist/navigationTrail.js.map +1 -0
- package/dist/next.js +5 -0
- package/dist/next.js.map +1 -0
- package/dist/observability/buildWatch.js +19 -0
- package/dist/observability/buildWatch.js.map +1 -0
- package/dist/observability/logger.js +43 -0
- package/dist/observability/logger.js.map +1 -0
- package/dist/observability/publishedBuild.js +39 -0
- package/dist/observability/publishedBuild.js.map +1 -0
- package/dist/observability/usePublishedBuildWatch.js +76 -0
- package/dist/observability/usePublishedBuildWatch.js.map +1 -0
- package/dist/passkeys.js +7 -0
- package/dist/passkeys.js.map +1 -0
- package/dist/periodRanges.js +33 -0
- package/dist/periodRanges.js.map +1 -0
- package/dist/problems.js +51 -0
- package/dist/problems.js.map +1 -0
- package/dist/pwa/InstallAppSetting.js +33 -0
- package/dist/pwa/InstallAppSetting.js.map +1 -0
- package/dist/pwa/InstallInstructionsDialog.js +35 -0
- package/dist/pwa/InstallInstructionsDialog.js.map +1 -0
- package/dist/pwa/InstallPromptBanner.js +64 -0
- package/dist/pwa/InstallPromptBanner.js.map +1 -0
- package/dist/pwa/installInstructions.js +60 -0
- package/dist/pwa/installInstructions.js.map +1 -0
- package/dist/pwa/useInstallPrompt.js +70 -0
- package/dist/pwa/useInstallPrompt.js.map +1 -0
- package/dist/react-hook-form.js +30 -0
- package/dist/react-hook-form.js.map +1 -0
- package/dist/react-router.js +10 -0
- package/dist/react-router.js.map +1 -0
- package/dist/security/ActivityLog.js +79 -0
- package/dist/security/ActivityLog.js.map +1 -0
- package/dist/security/RecoveryCodesDialog.js +84 -0
- package/dist/security/RecoveryCodesDialog.js.map +1 -0
- package/dist/security/SessionsCard.js +81 -0
- package/dist/security/SessionsCard.js.map +1 -0
- package/dist/security/passkeys.js +39 -0
- package/dist/security/passkeys.js.map +1 -0
- package/dist/table.js +35 -0
- package/dist/table.js.map +1 -0
- package/dist/theme/androidDevice.js +16 -0
- package/dist/theme/androidDevice.js.map +1 -0
- package/dist/theme/appleTracking.js +34 -0
- package/dist/theme/appleTracking.js.map +1 -0
- package/dist/theme/components/MuiAppBar.js +27 -0
- package/dist/theme/components/MuiAppBar.js.map +1 -0
- package/dist/theme/components/MuiBackdrop.js +13 -0
- package/dist/theme/components/MuiBackdrop.js.map +1 -0
- package/dist/theme/components/MuiButton.js +25 -0
- package/dist/theme/components/MuiButton.js.map +1 -0
- package/dist/theme/components/MuiButtonBase.js +16 -0
- package/dist/theme/components/MuiButtonBase.js.map +1 -0
- package/dist/theme/components/MuiChip.js +30 -0
- package/dist/theme/components/MuiChip.js.map +1 -0
- package/dist/theme/components/MuiDataGrid.js +30 -0
- package/dist/theme/components/MuiDataGrid.js.map +1 -0
- package/dist/theme/components/MuiDrawer.js +18 -0
- package/dist/theme/components/MuiDrawer.js.map +1 -0
- package/dist/theme/components/MuiMenuItem.js +17 -0
- package/dist/theme/components/MuiMenuItem.js.map +1 -0
- package/dist/theme/components/MuiTypography.js +22 -0
- package/dist/theme/components/MuiTypography.js.map +1 -0
- package/dist/theme/components/glassComponents.js +885 -0
- package/dist/theme/components/glassComponents.js.map +1 -0
- package/dist/theme/components/minimalComponents.js +146 -0
- package/dist/theme/components/minimalComponents.js.map +1 -0
- package/dist/theme/components/paletteOf.js +7 -0
- package/dist/theme/components/paletteOf.js.map +1 -0
- package/dist/theme/createToolkitTheme.js +100 -0
- package/dist/theme/createToolkitTheme.js.map +1 -0
- package/dist/theme/glassSurface.js +328 -0
- package/dist/theme/glassSurface.js.map +1 -0
- package/dist/theme/glassToasterStyles.js +50 -0
- package/dist/theme/glassToasterStyles.js.map +1 -0
- package/dist/theme/mergeComponents.js +42 -0
- package/dist/theme/mergeComponents.js.map +1 -0
- package/dist/theme/stackcraftPalette.js +59 -0
- package/dist/theme/stackcraftPalette.js.map +1 -0
- package/dist/theme/toolkitComponents.js +26 -0
- package/dist/theme/toolkitComponents.js.map +1 -0
- package/dist/timeline.js +8 -0
- package/dist/timeline.js.map +1 -0
- package/dist/toolkit/ToolkitProvider.js +49 -0
- package/dist/toolkit/ToolkitProvider.js.map +1 -0
- package/dist/toolkit/browserNavigation.js +34 -0
- package/dist/toolkit/browserNavigation.js.map +1 -0
- package/dist/toolkit/toolkitContext.js +19 -0
- package/dist/toolkit/toolkitContext.js.map +1 -0
- package/dist/toolkit/toolkitSettings.js +87 -0
- package/dist/toolkit/toolkitSettings.js.map +1 -0
- package/dist/toolkit/useToolkitTranslation.js +18 -0
- package/dist/toolkit/useToolkitTranslation.js.map +1 -0
- package/dist/types/DataTable/AuditTrailDialog.d.ts +32 -0
- package/dist/types/DataTable/AuditTrailTable.d.ts +28 -0
- package/dist/types/DataTable/ColumnFilters/HeaderFilterPopover.d.ts +8 -0
- package/dist/types/DataTable/ColumnFilters/MultiSelectColumnFilter.d.ts +16 -0
- package/dist/types/DataTable/ColumnFilters/SortableFilterHeader.d.ts +26 -0
- package/dist/types/DataTable/ColumnFilters/TextColumnFilter.d.ts +8 -0
- package/dist/types/DataTable/ColumnFilters/index.d.ts +4 -0
- package/dist/types/DataTable/EmptyState.d.ts +8 -0
- package/dist/types/DataTable/FilterChips.d.ts +15 -0
- package/dist/types/DataTable/GoToPage.d.ts +8 -0
- package/dist/types/DataTable/ServerTable.d.ts +110 -0
- package/dist/types/DataTable/buildChipConfig.d.ts +22 -0
- package/dist/types/DataTable/columns.d.ts +93 -0
- package/dist/types/DataTable/filterContext.d.ts +13 -0
- package/dist/types/DataTable/index.d.ts +13 -0
- package/dist/types/DataTable/serverTableParams.d.ts +16 -0
- package/dist/types/DataTable/tableMachine.d.ts +41 -0
- package/dist/types/DataTable/useDebouncedFilter.d.ts +8 -0
- package/dist/types/DataTable/useTableState.d.ts +93 -0
- package/dist/types/access/Can.d.ts +11 -0
- package/dist/types/access/PermissionMatrix.d.ts +21 -0
- package/dist/types/access/RequireAccess.d.ts +11 -0
- package/dist/types/access/accessRules.d.ts +24 -0
- package/dist/types/access/permissionGroups.d.ts +56 -0
- package/dist/types/access/useCan.d.ts +11 -0
- package/dist/types/account/AccountProvider.d.ts +27 -0
- package/dist/types/account/AccountSecuritySection.d.ts +7 -0
- package/dist/types/account/DemoTotpCodeButton.d.ts +6 -0
- package/dist/types/account/ForgotPasswordScreen.d.ts +15 -0
- package/dist/types/account/ProfileScreen.d.ts +13 -0
- package/dist/types/account/ResetPasswordScreen.d.ts +19 -0
- package/dist/types/account/SignInScreen.d.ts +25 -0
- package/dist/types/account/accountConnector.d.ts +263 -0
- package/dist/types/account/demo/createDemoAccountConnector.d.ts +30 -0
- package/dist/types/account/demo/totp.d.ts +45 -0
- package/dist/types/account/restAccountConnector.d.ts +49 -0
- package/dist/types/account-demo.d.ts +2 -0
- package/dist/types/account.d.ts +16 -0
- package/dist/types/adapters/i18next.d.ts +11 -0
- package/dist/types/adapters/nextNavigation.d.ts +33 -0
- package/dist/types/adapters/reactRouter.d.ts +6 -0
- package/dist/types/adapters/reactRouterRoutes.d.ts +30 -0
- package/dist/types/api/ApiError.d.ts +42 -0
- package/dist/types/api/createApiClient.d.ts +146 -0
- package/dist/types/api/staleChunks.d.ts +15 -0
- package/dist/types/appShell/AccountMenu.d.ts +28 -0
- package/dist/types/appShell/AppLayout.d.ts +66 -0
- package/dist/types/appShell/AppearanceSettings.d.ts +34 -0
- package/dist/types/appShell/AuthLayout.d.ts +21 -0
- package/dist/types/appShell/BarActionButton.d.ts +15 -0
- package/dist/types/appShell/BarActions.d.ts +18 -0
- package/dist/types/appShell/BarCapsule.d.ts +12 -0
- package/dist/types/appShell/HeaderTools.d.ts +27 -0
- package/dist/types/appShell/MobileTabBar.d.ts +17 -0
- package/dist/types/appShell/SettingsMenu.d.ts +13 -0
- package/dist/types/appShell/SideMenu.d.ts +31 -0
- package/dist/types/appShell/SideMenuEntry.d.ts +17 -0
- package/dist/types/appShell/SubmenuActionsMenu.d.ts +24 -0
- package/dist/types/appShell/TabBarEditor.d.ts +13 -0
- package/dist/types/appShell/TopMenu.d.ts +7 -0
- package/dist/types/appShell/appMenuContext.d.ts +9 -0
- package/dist/types/appShell/barActionsSlot.d.ts +35 -0
- package/dist/types/appShell/barMenuPlacement.d.ts +9 -0
- package/dist/types/appShell/menuItemText.d.ts +55 -0
- package/dist/types/appShell/pageTitle.d.ts +26 -0
- package/dist/types/appShell/shellSizes.d.ts +45 -0
- package/dist/types/appShell/tabBarRule.d.ts +5 -0
- package/dist/types/appShell/tabBarScroll.d.ts +26 -0
- package/dist/types/appShell/useDrawerCollapsed.d.ts +8 -0
- package/dist/types/appShell/useFittingActionCount.d.ts +7 -0
- package/dist/types/appShell/usePinnedMobileTabs.d.ts +7 -0
- package/dist/types/appShell/useTabBarMinimized.d.ts +8 -0
- package/dist/types/auth/PasswordChecklist.d.ts +11 -0
- package/dist/types/auth/passwordRules.d.ts +34 -0
- package/dist/types/calendar/EventCalendar.d.ts +46 -0
- package/dist/types/calendar.d.ts +1 -0
- package/dist/types/charts.d.ts +2 -0
- package/dist/types/date-pickers.d.ts +2 -0
- package/dist/types/datePickers/DateInput.d.ts +39 -0
- package/dist/types/datePickers/FormDateField.d.ts +7 -0
- package/dist/types/dates.d.ts +18 -0
- package/dist/types/dictionaries/dictionaries.d.ts +54 -0
- package/dist/types/downloads/DownloadManager.d.ts +1 -0
- package/dist/types/downloads/downloadQueue.d.ts +45 -0
- package/dist/types/downloads/downloadsMachine.d.ts +10 -0
- package/dist/types/downloads/index.d.ts +3 -0
- package/dist/types/excel/reportWorkbook.d.ts +157 -0
- package/dist/types/excel.d.ts +1 -0
- package/dist/types/feedback/ConfirmDialog.d.ts +29 -0
- package/dist/types/feedback/ModalWaiting.d.ts +8 -0
- package/dist/types/feedback/NewBuildNotice.d.ts +18 -0
- package/dist/types/feedback/StaleBuildBoundary.d.ts +21 -0
- package/dist/types/feedback/Toaster.d.ts +1 -0
- package/dist/types/feedback/confirmActionMachine.d.ts +19 -0
- package/dist/types/feedback/index.d.ts +8 -0
- package/dist/types/feedback/toast.d.ts +100 -0
- package/dist/types/feedback/useConfirmAction.d.ts +33 -0
- package/dist/types/filepond/FileDropzone.d.ts +59 -0
- package/dist/types/filepond/pondServer.d.ts +17 -0
- package/dist/types/filepond.d.ts +3 -0
- package/dist/types/files.d.ts +29 -0
- package/dist/types/formatting.d.ts +106 -0
- package/dist/types/forms/FormCatalogField.d.ts +6 -0
- package/dist/types/forms/FormColorField.d.ts +6 -0
- package/dist/types/forms/FormNumberField.d.ts +6 -0
- package/dist/types/forms/FormProblemAlert.d.ts +6 -0
- package/dist/types/forms/FormSelectField.d.ts +6 -0
- package/dist/types/forms/FormServerProblem.d.ts +8 -0
- package/dist/types/forms/FormTextField.d.ts +6 -0
- package/dist/types/forms/FormWizard.d.ts +20 -0
- package/dist/types/forms/SubmitButton.d.ts +9 -0
- package/dist/types/forms/applyServerProblem.d.ts +9 -0
- package/dist/types/forms/auth/ChangePasswordForm.d.ts +15 -0
- package/dist/types/forms/auth/ForgotPasswordForm.d.ts +12 -0
- package/dist/types/forms/auth/SignInForm.d.ts +18 -0
- package/dist/types/forms/index.d.ts +19 -0
- package/dist/types/forms/security/SecondStepForm.d.ts +28 -0
- package/dist/types/forms/security/TwoStepVerificationCard.d.ts +81 -0
- package/dist/types/forms/security/securityRules.d.ts +24 -0
- package/dist/types/forms/serverProblemFields.d.ts +19 -0
- package/dist/types/forms/useFormikField.d.ts +11 -0
- package/dist/types/forms/validation.d.ts +251 -0
- package/dist/types/forms/validationMessages.d.ts +12 -0
- package/dist/types/forms.d.ts +2 -0
- package/dist/types/hookForm/FormCatalogField.d.ts +8 -0
- package/dist/types/hookForm/FormColorField.d.ts +8 -0
- package/dist/types/hookForm/FormNumberField.d.ts +8 -0
- package/dist/types/hookForm/FormProblemAlert.d.ts +7 -0
- package/dist/types/hookForm/FormSelectField.d.ts +8 -0
- package/dist/types/hookForm/FormTextField.d.ts +8 -0
- package/dist/types/hookForm/SubmitButton.d.ts +21 -0
- package/dist/types/hookForm/applyServerProblem.d.ts +10 -0
- package/dist/types/hookForm/useHookFormField.d.ts +13 -0
- package/dist/types/i18next.d.ts +1 -0
- package/dist/types/identifiers.d.ts +2 -0
- package/dist/types/inbox/InboxLayout.d.ts +26 -0
- package/dist/types/inbox/MessageList.d.ts +27 -0
- package/dist/types/inbox/MessageView.d.ts +23 -0
- package/dist/types/inbox/inboxDates.d.ts +6 -0
- package/dist/types/index.d.ts +84 -0
- package/dist/types/inputs/CatalogInput.d.ts +41 -0
- package/dist/types/inputs/ColorInput.d.ts +28 -0
- package/dist/types/inputs/FieldFrame.d.ts +14 -0
- package/dist/types/inputs/FormSection.d.ts +29 -0
- package/dist/types/inputs/NumberInput.d.ts +36 -0
- package/dist/types/inputs/SelectInput.d.ts +34 -0
- package/dist/types/inputs/TextInput.d.ts +60 -0
- package/dist/types/inputs/colorContrast.d.ts +18 -0
- package/dist/types/inputs/formLayoutContext.d.ts +3 -0
- package/dist/types/inputs/numberText.d.ts +25 -0
- package/dist/types/kanban/KanbanBoard.d.ts +33 -0
- package/dist/types/kanban/kanbanMoves.d.ts +38 -0
- package/dist/types/kanban.d.ts +2 -0
- package/dist/types/laravel/csrfRetry.d.ts +21 -0
- package/dist/types/laravel.d.ts +1 -0
- package/dist/types/lastListUrl.d.ts +20 -0
- package/dist/types/locales/en.d.ts +711 -0
- package/dist/types/locales/es.d.ts +711 -0
- package/dist/types/maps/MapView.d.ts +32 -0
- package/dist/types/maps/mapMarkers.d.ts +23 -0
- package/dist/types/maps.d.ts +2 -0
- package/dist/types/money/money.d.ts +203 -0
- package/dist/types/money.d.ts +1 -0
- package/dist/types/navigation/appMenu.d.ts +92 -0
- package/dist/types/navigation/useMenuBadges.d.ts +16 -0
- package/dist/types/navigation.d.ts +22 -0
- package/dist/types/navigationTrail.d.ts +49 -0
- package/dist/types/next.d.ts +1 -0
- package/dist/types/observability/buildWatch.d.ts +28 -0
- package/dist/types/observability/logger.d.ts +19 -0
- package/dist/types/observability/publishedBuild.d.ts +35 -0
- package/dist/types/observability/usePublishedBuildWatch.d.ts +16 -0
- package/dist/types/passkeys.d.ts +1 -0
- package/dist/types/periodRanges.d.ts +32 -0
- package/dist/types/problems.d.ts +31 -0
- package/dist/types/pwa/InstallAppSetting.d.ts +1 -0
- package/dist/types/pwa/InstallInstructionsDialog.d.ts +18 -0
- package/dist/types/pwa/InstallPromptBanner.d.ts +7 -0
- package/dist/types/pwa/installInstructions.d.ts +52 -0
- package/dist/types/pwa/useInstallPrompt.d.ts +12 -0
- package/dist/types/react-hook-form.d.ts +11 -0
- package/dist/types/react-router.d.ts +2 -0
- package/dist/types/security/ActivityLog.d.ts +31 -0
- package/dist/types/security/RecoveryCodesDialog.d.ts +11 -0
- package/dist/types/security/SessionsCard.d.ts +22 -0
- package/dist/types/security/passkeys.d.ts +18 -0
- package/dist/types/table.d.ts +1 -0
- package/dist/types/theme/androidDevice.d.ts +11 -0
- package/dist/types/theme/appleTracking.d.ts +17 -0
- package/dist/types/theme/components/MuiAppBar.d.ts +13 -0
- package/dist/types/theme/components/MuiBackdrop.d.ts +11 -0
- package/dist/types/theme/components/MuiButton.d.ts +27 -0
- package/dist/types/theme/components/MuiButtonBase.d.ts +14 -0
- package/dist/types/theme/components/MuiChip.d.ts +29 -0
- package/dist/types/theme/components/MuiDataGrid.d.ts +45 -0
- package/dist/types/theme/components/MuiDrawer.d.ts +13 -0
- package/dist/types/theme/components/MuiMenuItem.d.ts +17 -0
- package/dist/types/theme/components/MuiTypography.d.ts +20 -0
- package/dist/types/theme/components/glassComponents.d.ts +8 -0
- package/dist/types/theme/components/minimalComponents.d.ts +22 -0
- package/dist/types/theme/components/paletteOf.d.ts +5 -0
- package/dist/types/theme/createToolkitTheme.d.ts +48 -0
- package/dist/types/theme/glassSurface.d.ts +247 -0
- package/dist/types/theme/glassToasterStyles.d.ts +7 -0
- package/dist/types/theme/mergeComponents.d.ts +15 -0
- package/dist/types/theme/stackcraftPalette.d.ts +142 -0
- package/dist/types/theme/toolkitComponents.d.ts +4 -0
- package/dist/types/timeline.d.ts +2 -0
- package/dist/types/toolkit/ToolkitProvider.d.ts +31 -0
- package/dist/types/toolkit/browserNavigation.d.ts +32 -0
- package/dist/types/toolkit/toolkitContext.d.ts +28 -0
- package/dist/types/toolkit/toolkitSettings.d.ts +68 -0
- package/dist/types/toolkit/useToolkitTranslation.d.ts +10 -0
- package/dist/types/ui/actions/CopyButton.d.ts +13 -0
- package/dist/types/ui/actions/DownloadMenu.d.ts +50 -0
- package/dist/types/ui/actions/SecretField.d.ts +13 -0
- package/dist/types/ui/filters/DateRangeFilter.d.ts +16 -0
- package/dist/types/ui/filters/PeriodRangeSelector.d.ts +28 -0
- package/dist/types/ui/filters/QuickFilters.d.ts +21 -0
- package/dist/types/ui/filters/SegmentedControl.d.ts +44 -0
- package/dist/types/ui/index.d.ts +33 -0
- package/dist/types/ui/labels/DictionaryText.d.ts +7 -0
- package/dist/types/ui/labels/StatusChip.d.ts +21 -0
- package/dist/types/ui/labels/Tag.d.ts +19 -0
- package/dist/types/ui/layout/CollapsibleSection.d.ts +15 -0
- package/dist/types/ui/layout/ContentDialog.d.ts +13 -0
- package/dist/types/ui/layout/DefinitionList.d.ts +15 -0
- package/dist/types/ui/layout/DetailHeader.d.ts +15 -0
- package/dist/types/ui/layout/ErrorPage.d.ts +22 -0
- package/dist/types/ui/layout/FullPageLoader.d.ts +1 -0
- package/dist/types/ui/layout/GlassLensFilter.d.ts +1 -0
- package/dist/types/ui/layout/GlassPanel.d.ts +11 -0
- package/dist/types/ui/layout/PageHeader.d.ts +15 -0
- package/dist/types/ui/layout/PageHeading.d.ts +18 -0
- package/dist/types/ui/layout/ProfileHeader.d.ts +17 -0
- package/dist/types/ui/layout/ScrollableRow.d.ts +33 -0
- package/dist/types/ui/layout/SectionCard.d.ts +11 -0
- package/dist/types/ui/layout/appBarHeight.d.ts +13 -0
- package/dist/types/ui/metrics/BarList.d.ts +19 -0
- package/dist/types/ui/metrics/CalendarHeatmap.d.ts +28 -0
- package/dist/types/ui/metrics/ChartTooltip.d.ts +5 -0
- package/dist/types/ui/metrics/ColumnChart.d.ts +35 -0
- package/dist/types/ui/metrics/MetricCard.d.ts +31 -0
- package/dist/types/ui/metrics/TableToggle.d.ts +7 -0
- package/dist/types/ui/metrics/barListLabels.d.ts +17 -0
- package/dist/types/ui/metrics/heatmapScale.d.ts +45 -0
- package/dist/types/ui/navigation/BackButton.d.ts +11 -0
- package/dist/types/ui/navigation/ColorSchemeToggle.d.ts +7 -0
- package/dist/types/ui/navigation/DocumentTitle.d.ts +6 -0
- package/dist/types/ui/navigation/FontSizeToggle.d.ts +6 -0
- package/dist/types/ui/navigation/LanguageToggle.d.ts +8 -0
- package/dist/types/ui/navigation/PageBreadcrumbs.d.ts +9 -0
- package/dist/types/ui/navigation/colorMode.d.ts +18 -0
- package/dist/types/ui/navigation/fontSizeLevels.d.ts +25 -0
- package/dist/types/ui/navigation/useFontSize.d.ts +10 -0
- package/dist/types/ui/timeline/GroupedTimeline.d.ts +38 -0
- package/dist/types/ui/timeline/timelineDot.d.ts +19 -0
- package/dist/types/upload/FileDropzone.d.ts +34 -0
- package/dist/types/upload/fileRules.d.ts +51 -0
- package/dist/types/upload/uploadMachine.d.ts +23 -0
- package/dist/types/upload/uploadWithProgress.d.ts +16 -0
- package/dist/ui/actions/CopyButton.js +28 -0
- package/dist/ui/actions/CopyButton.js.map +1 -0
- package/dist/ui/actions/DownloadMenu.js +163 -0
- package/dist/ui/actions/DownloadMenu.js.map +1 -0
- package/dist/ui/actions/SecretField.js +57 -0
- package/dist/ui/actions/SecretField.js.map +1 -0
- package/dist/ui/filters/DateRangeFilter.js +86 -0
- package/dist/ui/filters/DateRangeFilter.js.map +1 -0
- package/dist/ui/filters/PeriodRangeSelector.js +56 -0
- package/dist/ui/filters/PeriodRangeSelector.js.map +1 -0
- package/dist/ui/filters/QuickFilters.js +91 -0
- package/dist/ui/filters/QuickFilters.js.map +1 -0
- package/dist/ui/filters/SegmentedControl.js +80 -0
- package/dist/ui/filters/SegmentedControl.js.map +1 -0
- package/dist/ui/labels/DictionaryText.js +11 -0
- package/dist/ui/labels/DictionaryText.js.map +1 -0
- package/dist/ui/labels/StatusChip.js +52 -0
- package/dist/ui/labels/StatusChip.js.map +1 -0
- package/dist/ui/labels/Tag.js +26 -0
- package/dist/ui/labels/Tag.js.map +1 -0
- package/dist/ui/layout/CollapsibleSection.js +48 -0
- package/dist/ui/layout/CollapsibleSection.js.map +1 -0
- package/dist/ui/layout/ContentDialog.js +97 -0
- package/dist/ui/layout/ContentDialog.js.map +1 -0
- package/dist/ui/layout/DefinitionList.js +30 -0
- package/dist/ui/layout/DefinitionList.js.map +1 -0
- package/dist/ui/layout/DetailHeader.js +27 -0
- package/dist/ui/layout/DetailHeader.js.map +1 -0
- package/dist/ui/layout/ErrorPage.js +40 -0
- package/dist/ui/layout/ErrorPage.js.map +1 -0
- package/dist/ui/layout/FullPageLoader.js +13 -0
- package/dist/ui/layout/FullPageLoader.js.map +1 -0
- package/dist/ui/layout/GlassLensFilter.js +53 -0
- package/dist/ui/layout/GlassLensFilter.js.map +1 -0
- package/dist/ui/layout/GlassPanel.js +18 -0
- package/dist/ui/layout/GlassPanel.js.map +1 -0
- package/dist/ui/layout/PageHeader.js +23 -0
- package/dist/ui/layout/PageHeader.js.map +1 -0
- package/dist/ui/layout/PageHeading.js +51 -0
- package/dist/ui/layout/PageHeading.js.map +1 -0
- package/dist/ui/layout/ProfileHeader.js +64 -0
- package/dist/ui/layout/ProfileHeader.js.map +1 -0
- package/dist/ui/layout/ScrollableRow.js +156 -0
- package/dist/ui/layout/ScrollableRow.js.map +1 -0
- package/dist/ui/layout/SectionCard.js +18 -0
- package/dist/ui/layout/SectionCard.js.map +1 -0
- package/dist/ui/layout/appBarHeight.js +42 -0
- package/dist/ui/layout/appBarHeight.js.map +1 -0
- package/dist/ui/metrics/BarList.js +89 -0
- package/dist/ui/metrics/BarList.js.map +1 -0
- package/dist/ui/metrics/CalendarHeatmap.js +131 -0
- package/dist/ui/metrics/CalendarHeatmap.js.map +1 -0
- package/dist/ui/metrics/ChartTooltip.js +16 -0
- package/dist/ui/metrics/ChartTooltip.js.map +1 -0
- package/dist/ui/metrics/ColumnChart.js +110 -0
- package/dist/ui/metrics/ColumnChart.js.map +1 -0
- package/dist/ui/metrics/MetricCard.js +64 -0
- package/dist/ui/metrics/MetricCard.js.map +1 -0
- package/dist/ui/metrics/TableToggle.js +13 -0
- package/dist/ui/metrics/TableToggle.js.map +1 -0
- package/dist/ui/metrics/barListLabels.js +9 -0
- package/dist/ui/metrics/barListLabels.js.map +1 -0
- package/dist/ui/metrics/heatmapScale.js +67 -0
- package/dist/ui/metrics/heatmapScale.js.map +1 -0
- package/dist/ui/navigation/BackButton.js +28 -0
- package/dist/ui/navigation/BackButton.js.map +1 -0
- package/dist/ui/navigation/ColorSchemeToggle.js +37 -0
- package/dist/ui/navigation/ColorSchemeToggle.js.map +1 -0
- package/dist/ui/navigation/DocumentTitle.js +11 -0
- package/dist/ui/navigation/DocumentTitle.js.map +1 -0
- package/dist/ui/navigation/FontSizeToggle.js +40 -0
- package/dist/ui/navigation/FontSizeToggle.js.map +1 -0
- package/dist/ui/navigation/LanguageToggle.js +27 -0
- package/dist/ui/navigation/LanguageToggle.js.map +1 -0
- package/dist/ui/navigation/PageBreadcrumbs.js +51 -0
- package/dist/ui/navigation/PageBreadcrumbs.js.map +1 -0
- package/dist/ui/navigation/colorMode.js +13 -0
- package/dist/ui/navigation/colorMode.js.map +1 -0
- package/dist/ui/navigation/fontSizeLevels.js +24 -0
- package/dist/ui/navigation/fontSizeLevels.js.map +1 -0
- package/dist/ui/navigation/useFontSize.js +44 -0
- package/dist/ui/navigation/useFontSize.js.map +1 -0
- package/dist/ui/timeline/GroupedTimeline.js +104 -0
- package/dist/ui/timeline/GroupedTimeline.js.map +1 -0
- package/dist/ui/timeline/timelineDot.js +20 -0
- package/dist/ui/timeline/timelineDot.js.map +1 -0
- package/dist/upload/FileDropzone.js +143 -0
- package/dist/upload/FileDropzone.js.map +1 -0
- package/dist/upload/fileRules.js +62 -0
- package/dist/upload/fileRules.js.map +1 -0
- package/dist/upload/uploadMachine.js +73 -0
- package/dist/upload/uploadMachine.js.map +1 -0
- package/dist/upload/uploadWithProgress.js +45 -0
- package/dist/upload/uploadWithProgress.js.map +1 -0
- package/package.json +303 -5
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsxs, jsx } from "react/jsx-runtime";
|
|
3
|
+
import { useToolkitTranslation } from "../toolkit/useToolkitTranslation.js";
|
|
4
|
+
import Box from "@mui/material/Box";
|
|
5
|
+
import Typography from "@mui/material/Typography";
|
|
6
|
+
import CheckCircleIcon from "@mui/icons-material/CheckCircle";
|
|
7
|
+
import RadioButtonUncheckedIcon from "@mui/icons-material/RadioButtonUnchecked";
|
|
8
|
+
import { passwordChecksOf, DEFAULT_PASSWORD_POLICY } from "./passwordRules.js";
|
|
9
|
+
const SCREEN_READER_ONLY_SX = {
|
|
10
|
+
position: "absolute",
|
|
11
|
+
width: "1px",
|
|
12
|
+
height: "1px",
|
|
13
|
+
padding: 0,
|
|
14
|
+
margin: "-1px",
|
|
15
|
+
overflow: "hidden",
|
|
16
|
+
clip: "rect(0 0 0 0)",
|
|
17
|
+
whiteSpace: "nowrap",
|
|
18
|
+
border: 0
|
|
19
|
+
};
|
|
20
|
+
function PasswordChecklist({ password, policy = DEFAULT_PASSWORD_POLICY, id }) {
|
|
21
|
+
const { t } = useToolkitTranslation("auth");
|
|
22
|
+
return /* @__PURE__ */ jsxs(Box, { id, children: [
|
|
23
|
+
/* @__PURE__ */ jsx(Typography, { variant: "caption", color: "text.secondary", component: "p", sx: { mb: 0.5 }, children: t("passwordRules.title") }),
|
|
24
|
+
/* @__PURE__ */ jsx(Box, { component: "ul", sx: { listStyle: "none", m: 0, p: 0, display: "grid", gap: 0.5 }, children: passwordChecksOf(password, policy).map((check) => /* @__PURE__ */ jsxs(
|
|
25
|
+
Box,
|
|
26
|
+
{
|
|
27
|
+
component: "li",
|
|
28
|
+
"data-rule": check.rule,
|
|
29
|
+
"data-met": check.isMet,
|
|
30
|
+
sx: { display: "flex", alignItems: "center", gap: 1, color: check.isMet ? "text.primary" : "text.secondary" },
|
|
31
|
+
children: [
|
|
32
|
+
check.isMet ? /* @__PURE__ */ jsx(CheckCircleIcon, { fontSize: "small", color: "success", "aria-hidden": true }) : /* @__PURE__ */ jsx(RadioButtonUncheckedIcon, { fontSize: "small", color: "disabled", "aria-hidden": true }),
|
|
33
|
+
/* @__PURE__ */ jsx(Typography, { variant: "body2", component: "span", children: t(`passwordRules.${check.rule}`, check.values) }),
|
|
34
|
+
/* @__PURE__ */ jsx(Box, { component: "span", sx: SCREEN_READER_ONLY_SX, children: check.isMet ? t("passwordRules.met") : t("passwordRules.missing") })
|
|
35
|
+
]
|
|
36
|
+
},
|
|
37
|
+
check.rule
|
|
38
|
+
)) })
|
|
39
|
+
] });
|
|
40
|
+
}
|
|
41
|
+
export {
|
|
42
|
+
PasswordChecklist as default
|
|
43
|
+
};
|
|
44
|
+
//# sourceMappingURL=PasswordChecklist.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PasswordChecklist.js","sources":["../../src/auth/PasswordChecklist.jsx"],"sourcesContent":["// La lista de lo que debe tener una contraseña nueva, que se va palomeando mientras la persona escribe: dice qué falta\n// ANTES de enviar, en lugar de un «contraseña inválida» después.\n//\n// Para el lector de pantalla cada renglón dice si ya cumple o falta (con el ícono solo, se oía la regla sin saber cómo\n// iba). Va justo debajo del campo de la contraseña nueva.\n//\n// Genérico del paquete: function (regla de la casa).\nimport {useToolkitTranslation} from '@/toolkit/useToolkitTranslation.js';\nimport Box from '@mui/material/Box';\nimport Typography from '@mui/material/Typography';\nimport CheckCircleIcon from '@mui/icons-material/CheckCircle';\nimport RadioButtonUncheckedIcon from '@mui/icons-material/RadioButtonUnchecked';\n\nimport {DEFAULT_PASSWORD_POLICY, passwordChecksOf} from '@/auth/passwordRules.js';\n\n// texto que solo oye el lector de pantalla (el mismo truco que usa MUI)\nconst SCREEN_READER_ONLY_SX = {\n position: 'absolute', width: '1px', height: '1px', padding: 0, margin: '-1px', overflow: 'hidden', clip: 'rect(0 0 0 0)', whiteSpace: 'nowrap', border: 0,\n};\n\n/**\n * @param {object} props\n * @param {string} props.password lo que lleva escrito la persona\n * @param {object} [props.policy] las reglas; por omisión DEFAULT_PASSWORD_POLICY\n * @param {string} [props.id]\n */\nexport default function PasswordChecklist({password, policy = DEFAULT_PASSWORD_POLICY, id}) {\n const {t} = useToolkitTranslation('auth');\n return (\n <Box id={id}>\n <Typography variant=\"caption\" color=\"text.secondary\" component=\"p\" sx={{mb: 0.5}}>{t('passwordRules.title')}</Typography>\n <Box component=\"ul\" sx={{listStyle: 'none', m: 0, p: 0, display: 'grid', gap: 0.5}}>\n {passwordChecksOf(password, policy).map((check) => (\n <Box component=\"li\" key={check.rule} data-rule={check.rule} data-met={check.isMet}\n sx={{display: 'flex', alignItems: 'center', gap: 1, color: check.isMet ? 'text.primary' : 'text.secondary'}}>\n {check.isMet\n ? <CheckCircleIcon fontSize=\"small\" color=\"success\" aria-hidden />\n : <RadioButtonUncheckedIcon fontSize=\"small\" color=\"disabled\" aria-hidden />}\n <Typography variant=\"body2\" component=\"span\">{t(`passwordRules.${check.rule}`, check.values)}</Typography>\n <Box component=\"span\" sx={SCREEN_READER_ONLY_SX}>{check.isMet ? t('passwordRules.met') : t('passwordRules.missing')}</Box>\n </Box>\n ))}\n </Box>\n </Box>\n );\n}\n"],"names":[],"mappings":";;;;;;;;AAgBA,MAAM,wBAAwB;AAAA,EAC1B,UAAU;AAAA,EAAY,OAAO;AAAA,EAAO,QAAQ;AAAA,EAAO,SAAS;AAAA,EAAG,QAAQ;AAAA,EAAQ,UAAU;AAAA,EAAU,MAAM;AAAA,EAAiB,YAAY;AAAA,EAAU,QAAQ;AAC5J;AAQA,SAAwB,kBAAkB,EAAC,UAAU,SAAS,yBAAyB,MAAK;AACxF,QAAM,EAAC,EAAA,IAAK,sBAAsB,MAAM;AACxC,SACI,qBAAC,OAAI,IACD,UAAA;AAAA,IAAA,oBAAC,YAAA,EAAW,SAAQ,WAAU,OAAM,kBAAiB,WAAU,KAAI,IAAI,EAAC,IAAI,IAAA,GAAO,UAAA,EAAE,qBAAqB,GAAE;AAAA,IAC5G,oBAAC,OAAI,WAAU,MAAK,IAAI,EAAC,WAAW,QAAQ,GAAG,GAAG,GAAG,GAAG,SAAS,QAAQ,KAAK,IAAA,GACzE,UAAA,iBAAiB,UAAU,MAAM,EAAE,IAAI,CAAC,UACrC;AAAA,MAAC;AAAA,MAAA;AAAA,QAAI,WAAU;AAAA,QAAsB,aAAW,MAAM;AAAA,QAAM,YAAU,MAAM;AAAA,QACvE,IAAI,EAAC,SAAS,QAAQ,YAAY,UAAU,KAAK,GAAG,OAAO,MAAM,QAAQ,iBAAiB,iBAAA;AAAA,QAC1F,UAAA;AAAA,UAAA,MAAM,QACD,oBAAC,iBAAA,EAAgB,UAAS,SAAQ,OAAM,WAAU,eAAW,KAAA,CAAC,wBAC7D,0BAAA,EAAyB,UAAS,SAAQ,OAAM,YAAW,eAAW,MAAC;AAAA,UAC9E,oBAAC,YAAA,EAAW,SAAQ,SAAQ,WAAU,QAAQ,UAAA,EAAE,iBAAiB,MAAM,IAAI,IAAI,MAAM,MAAM,GAAE;AAAA,UAC7F,oBAAC,KAAA,EAAI,WAAU,QAAO,IAAI,uBAAwB,UAAA,MAAM,QAAQ,EAAE,mBAAmB,IAAI,EAAE,uBAAuB,EAAA,CAAE;AAAA,QAAA;AAAA,MAAA;AAAA,MAN/F,MAAM;AAAA,IAAA,CAQlC,EAAA,CACL;AAAA,EAAA,GACJ;AAER;"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
const PASSWORD_RULE = Object.freeze({
|
|
2
|
+
minLength: "minLength",
|
|
3
|
+
lowercase: "lowercase",
|
|
4
|
+
uppercase: "uppercase",
|
|
5
|
+
number: "number",
|
|
6
|
+
symbol: "symbol"
|
|
7
|
+
});
|
|
8
|
+
const DEFAULT_PASSWORD_POLICY = Object.freeze({
|
|
9
|
+
minLength: 12,
|
|
10
|
+
lowercase: true,
|
|
11
|
+
uppercase: true,
|
|
12
|
+
number: true,
|
|
13
|
+
symbol: false
|
|
14
|
+
});
|
|
15
|
+
const RULE_PATTERNS = Object.freeze({
|
|
16
|
+
[PASSWORD_RULE.lowercase]: new RegExp("\\p{Ll}", "u"),
|
|
17
|
+
[PASSWORD_RULE.uppercase]: new RegExp("\\p{Lu}", "u"),
|
|
18
|
+
[PASSWORD_RULE.number]: new RegExp("\\p{Nd}", "u"),
|
|
19
|
+
[PASSWORD_RULE.symbol]: /[^\p{L}\p{Nd}\s]/u
|
|
20
|
+
});
|
|
21
|
+
function passwordChecksOf(password, policy = DEFAULT_PASSWORD_POLICY) {
|
|
22
|
+
const text = password ?? "";
|
|
23
|
+
const checks = [];
|
|
24
|
+
if (policy.minLength > 0) {
|
|
25
|
+
checks.push({ rule: PASSWORD_RULE.minLength, isMet: Array.from(text).length >= policy.minLength, values: { count: policy.minLength } });
|
|
26
|
+
}
|
|
27
|
+
[PASSWORD_RULE.lowercase, PASSWORD_RULE.uppercase, PASSWORD_RULE.number, PASSWORD_RULE.symbol].forEach((rule) => {
|
|
28
|
+
if (policy[rule]) {
|
|
29
|
+
checks.push({ rule, isMet: RULE_PATTERNS[rule].test(text), values: {} });
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
return checks;
|
|
33
|
+
}
|
|
34
|
+
function isPasswordAccepted(password, policy = DEFAULT_PASSWORD_POLICY) {
|
|
35
|
+
return passwordChecksOf(password, policy).every((check) => check.isMet);
|
|
36
|
+
}
|
|
37
|
+
export {
|
|
38
|
+
DEFAULT_PASSWORD_POLICY,
|
|
39
|
+
PASSWORD_RULE,
|
|
40
|
+
isPasswordAccepted,
|
|
41
|
+
passwordChecksOf
|
|
42
|
+
};
|
|
43
|
+
//# sourceMappingURL=passwordRules.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"passwordRules.js","sources":["../../src/auth/passwordRules.js"],"sourcesContent":["// Las reglas de una contraseña nueva y su revisión, para la lista que se va palomeando mientras la persona escribe\n// (ChangePasswordForm) y para el esquema del formulario (passwordSchemaOf).\n//\n// Decisiones, con su porqué:\n// - La política la elige el proyecto (DEFAULT_PASSWORD_POLICY es solo el punto de partida): hay clientes que exigen\n// mayúsculas y números por norma interna. La guía del NIST (SP 800-63B) dice que el largo protege más que mezclar\n// tipos de letra; por eso el largo por omisión es 12 y el símbolo no se exige.\n// - Se cuenta por caracteres que ve la persona (Array.from), no por unidades de JavaScript: un emoji cuenta como uno.\n// - Esto es para no gastar un viaje al servidor en lo obvio: la regla que protege es la del backend.\n//\n// Funciones puras, sin React: function (regla de la casa). Se prueban con node --test (passwordRules.test.js).\n\n/** Las reglas que se pueden pedir. */\nexport const PASSWORD_RULE = Object.freeze({\n minLength: 'minLength',\n lowercase: 'lowercase',\n uppercase: 'uppercase',\n number: 'number',\n symbol: 'symbol',\n});\n\n/** La política por omisión: 12 caracteres, con minúscula, mayúscula y número. */\nexport const DEFAULT_PASSWORD_POLICY = Object.freeze({\n minLength: 12,\n lowercase: true,\n uppercase: true,\n number: true,\n symbol: false,\n});\n\n// qué cuenta para cada tipo de caracter (con acentos y ñ: \\p{Ll} y \\p{Lu} son las minúsculas y mayúsculas de cualquier idioma)\nconst RULE_PATTERNS = Object.freeze({\n [PASSWORD_RULE.lowercase]: /\\p{Ll}/u,\n [PASSWORD_RULE.uppercase]: /\\p{Lu}/u,\n [PASSWORD_RULE.number]: /\\p{Nd}/u,\n [PASSWORD_RULE.symbol]: /[^\\p{L}\\p{Nd}\\s]/u,\n});\n\n/**\n * Cada regla que pide la política, con si ya se cumple: es la lista que se pinta palomeada.\n *\n * @param {string} password lo que lleva escrito la persona\n * @param {object} [policy] por omisión DEFAULT_PASSWORD_POLICY\n * @returns {Array<{rule: string, isMet: boolean, values: object}>} en el orden de PASSWORD_RULE\n */\nexport function passwordChecksOf(password, policy = DEFAULT_PASSWORD_POLICY) {\n const text = password ?? '';\n const checks = [];\n if (policy.minLength > 0) {\n checks.push({rule: PASSWORD_RULE.minLength, isMet: Array.from(text).length >= policy.minLength, values: {count: policy.minLength}});\n }\n [PASSWORD_RULE.lowercase, PASSWORD_RULE.uppercase, PASSWORD_RULE.number, PASSWORD_RULE.symbol].forEach((rule) => {\n if (policy[rule]) {\n checks.push({rule, isMet: RULE_PATTERNS[rule].test(text), values: {}});\n }\n });\n return checks;\n}\n\n/**\n * @param {string} password\n * @param {object} [policy]\n * @returns {boolean} si cumple todas las reglas de la política\n */\nexport function isPasswordAccepted(password, policy = DEFAULT_PASSWORD_POLICY) {\n return passwordChecksOf(password, policy).every((check) => check.isMet);\n}\n"],"names":[],"mappings":"AAaY,MAAC,gBAAgB,OAAO,OAAO;AAAA,EACvC,WAAW;AAAA,EACX,WAAW;AAAA,EACX,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,QAAQ;AACZ,CAAC;AAGW,MAAC,0BAA0B,OAAO,OAAO;AAAA,EACjD,WAAW;AAAA,EACX,WAAW;AAAA,EACX,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,QAAQ;AACZ,CAAC;AAGD,MAAM,gBAAgB,OAAO,OAAO;AAAA,EAChC,CAAC,cAAc,SAAS,GAAG,WAAA,WAAA,GAAS;AAAA,EACpC,CAAC,cAAc,SAAS,GAAG,WAAA,WAAA,GAAS;AAAA,EACpC,CAAC,cAAc,MAAM,GAAG,WAAA,WAAA,GAAS;AAAA,EACjC,CAAC,cAAc,MAAM,GAAG;AAC5B,CAAC;AASM,SAAS,iBAAiB,UAAU,SAAS,yBAAyB;AACzE,QAAM,OAAO,YAAY;AACzB,QAAM,SAAS,CAAA;AACf,MAAI,OAAO,YAAY,GAAG;AACtB,WAAO,KAAK,EAAC,MAAM,cAAc,WAAW,OAAO,MAAM,KAAK,IAAI,EAAE,UAAU,OAAO,WAAW,QAAQ,EAAC,OAAO,OAAO,UAAS,EAAC,CAAC;AAAA,EACtI;AACA,GAAC,cAAc,WAAW,cAAc,WAAW,cAAc,QAAQ,cAAc,MAAM,EAAE,QAAQ,CAAC,SAAS;AAC7G,QAAI,OAAO,IAAI,GAAG;AACd,aAAO,KAAK,EAAC,MAAM,OAAO,cAAc,IAAI,EAAE,KAAK,IAAI,GAAG,QAAQ,CAAA,EAAE,CAAC;AAAA,IACzE;AAAA,EACJ,CAAC;AACD,SAAO;AACX;AAOO,SAAS,mBAAmB,UAAU,SAAS,yBAAyB;AAC3E,SAAO,iBAAiB,UAAU,MAAM,EAAE,MAAM,CAAC,UAAU,MAAM,KAAK;AAC1E;"}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsxs, jsx } from "react/jsx-runtime";
|
|
3
|
+
import { useRef, useState } from "react";
|
|
4
|
+
import FullCalendar from "@fullcalendar/react";
|
|
5
|
+
import dayGridPlugin from "@fullcalendar/daygrid";
|
|
6
|
+
import interactionPlugin from "@fullcalendar/interaction";
|
|
7
|
+
import listPlugin from "@fullcalendar/list";
|
|
8
|
+
import timeGridPlugin from "@fullcalendar/timegrid";
|
|
9
|
+
import spanishLocale from "@fullcalendar/core/locales/es";
|
|
10
|
+
import Box from "@mui/material/Box";
|
|
11
|
+
import Button from "@mui/material/Button";
|
|
12
|
+
import IconButton from "@mui/material/IconButton";
|
|
13
|
+
import Stack from "@mui/material/Stack";
|
|
14
|
+
import Tooltip from "@mui/material/Tooltip";
|
|
15
|
+
import Typography from "@mui/material/Typography";
|
|
16
|
+
import { useTheme } from "@mui/material/styles";
|
|
17
|
+
import ChevronLeftRoundedIcon from "@mui/icons-material/ChevronLeftRounded";
|
|
18
|
+
import ChevronRightRoundedIcon from "@mui/icons-material/ChevronRightRounded";
|
|
19
|
+
import { paletteOf } from "../theme/components/paletteOf.js";
|
|
20
|
+
import { useToolkitSettings } from "../toolkit/toolkitContext.js";
|
|
21
|
+
import { useToolkitTranslation } from "../toolkit/useToolkitTranslation.js";
|
|
22
|
+
import SegmentedControl from "../ui/filters/SegmentedControl.js";
|
|
23
|
+
const CALENDAR_VIEW = Object.freeze({ month: "dayGridMonth", week: "timeGridWeek", day: "timeGridDay", list: "listWeek" });
|
|
24
|
+
const VIEW_TEXT_KEY = Object.freeze({
|
|
25
|
+
[CALENDAR_VIEW.month]: "month",
|
|
26
|
+
[CALENDAR_VIEW.week]: "week",
|
|
27
|
+
[CALENDAR_VIEW.day]: "day",
|
|
28
|
+
[CALENDAR_VIEW.list]: "list"
|
|
29
|
+
});
|
|
30
|
+
const DAY_MAX_EVENTS = 3;
|
|
31
|
+
const MONDAY = 1;
|
|
32
|
+
function capitalizeFirst(text) {
|
|
33
|
+
return text ? text.charAt(0).toLocaleUpperCase() + text.slice(1) : text;
|
|
34
|
+
}
|
|
35
|
+
function calendarStylesOf(theme) {
|
|
36
|
+
const palette = paletteOf(theme);
|
|
37
|
+
return {
|
|
38
|
+
"--fc-border-color": palette.divider,
|
|
39
|
+
"--fc-page-bg-color": "transparent",
|
|
40
|
+
"--fc-neutral-bg-color": palette.action.hover,
|
|
41
|
+
"--fc-today-bg-color": `color-mix(in srgb, ${palette.primary.main} 8%, transparent)`,
|
|
42
|
+
"--fc-list-event-hover-bg-color": palette.action.hover,
|
|
43
|
+
"--fc-now-indicator-color": palette.error.main,
|
|
44
|
+
"--fc-highlight-color": `color-mix(in srgb, ${palette.primary.main} 14%, transparent)`,
|
|
45
|
+
"& .fc": { fontFamily: "inherit", fontSize: theme.typography.body2.fontSize },
|
|
46
|
+
// los números de los días y los encabezados son ligas en FullCalendar: sin subrayado y del color del texto
|
|
47
|
+
"& .fc a": { color: "inherit", textDecoration: "none" },
|
|
48
|
+
"& .fc-col-header-cell-cushion": { fontWeight: 600, py: 1 },
|
|
49
|
+
"& .fc-event": { borderRadius: "6px", px: 0.5 },
|
|
50
|
+
// la hora no se encoge: en un día angosto se recortaba («1C» en lugar de «10»); lo que se corta es el nombre
|
|
51
|
+
"& .fc-event-time": { flexShrink: 0, overflow: "visible" },
|
|
52
|
+
"& .fc-scrollgrid": { borderRadius: "12px", overflow: "hidden" },
|
|
53
|
+
"& .fc-list": { borderRadius: "12px" }
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
function EventCalendar({
|
|
57
|
+
events,
|
|
58
|
+
initialView = CALENDAR_VIEW.month,
|
|
59
|
+
views = Object.values(CALENDAR_VIEW),
|
|
60
|
+
onEventClick,
|
|
61
|
+
onDateSelect,
|
|
62
|
+
onEventChange,
|
|
63
|
+
height = "auto",
|
|
64
|
+
ariaLabel
|
|
65
|
+
}) {
|
|
66
|
+
const theme = useTheme();
|
|
67
|
+
const palette = paletteOf(theme);
|
|
68
|
+
const { t } = useToolkitTranslation("calendar");
|
|
69
|
+
const { language } = useToolkitSettings();
|
|
70
|
+
const calendarRef = useRef(null);
|
|
71
|
+
const [title, setTitle] = useState("");
|
|
72
|
+
const [view, setView] = useState(initialView);
|
|
73
|
+
const calendarApi = () => calendarRef.current?.getApi();
|
|
74
|
+
const coloredEvents = events.map((event) => {
|
|
75
|
+
const color = palette[event.tone] ?? palette.primary;
|
|
76
|
+
return { ...event, backgroundColor: color.main, borderColor: color.main, textColor: color.contrastText };
|
|
77
|
+
});
|
|
78
|
+
const changeEvent = async ({ event, revert }) => {
|
|
79
|
+
try {
|
|
80
|
+
await onEventChange({ id: event.id, start: event.startStr, end: event.endStr || null, allDay: event.allDay });
|
|
81
|
+
} catch {
|
|
82
|
+
revert();
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
return /* @__PURE__ */ jsxs(Stack, { spacing: 2, role: "region", "aria-label": ariaLabel, children: [
|
|
86
|
+
/* @__PURE__ */ jsxs(Stack, { direction: { xs: "column", md: "row" }, spacing: 1.5, sx: { alignItems: { md: "center" }, justifyContent: "space-between" }, children: [
|
|
87
|
+
/* @__PURE__ */ jsxs(Stack, { direction: "row", spacing: 1, sx: { alignItems: "center" }, children: [
|
|
88
|
+
/* @__PURE__ */ jsx(Tooltip, { title: t("previous"), children: /* @__PURE__ */ jsx(IconButton, { "aria-label": t("previous"), onClick: () => calendarApi()?.prev(), children: /* @__PURE__ */ jsx(ChevronLeftRoundedIcon, {}) }) }),
|
|
89
|
+
/* @__PURE__ */ jsx(Tooltip, { title: t("next"), children: /* @__PURE__ */ jsx(IconButton, { "aria-label": t("next"), onClick: () => calendarApi()?.next(), children: /* @__PURE__ */ jsx(ChevronRightRoundedIcon, {}) }) }),
|
|
90
|
+
/* @__PURE__ */ jsx(Button, { variant: "outlined", size: "small", onClick: () => calendarApi()?.today(), children: t("today") }),
|
|
91
|
+
/* @__PURE__ */ jsx(Typography, { variant: "h6", component: "h2", sx: { pl: 1 }, "aria-live": "polite", children: capitalizeFirst(title) })
|
|
92
|
+
] }),
|
|
93
|
+
views.length > 1 && /* @__PURE__ */ jsx(
|
|
94
|
+
SegmentedControl,
|
|
95
|
+
{
|
|
96
|
+
ariaLabel: t("view"),
|
|
97
|
+
value: view,
|
|
98
|
+
onChange: (nextView) => calendarApi()?.changeView(nextView),
|
|
99
|
+
options: views.map((value) => ({ value, label: t(`views.${VIEW_TEXT_KEY[value]}`) }))
|
|
100
|
+
}
|
|
101
|
+
)
|
|
102
|
+
] }),
|
|
103
|
+
/* @__PURE__ */ jsx(Box, { sx: calendarStylesOf, children: /* @__PURE__ */ jsx(
|
|
104
|
+
FullCalendar,
|
|
105
|
+
{
|
|
106
|
+
ref: calendarRef,
|
|
107
|
+
plugins: [dayGridPlugin, timeGridPlugin, listPlugin, interactionPlugin],
|
|
108
|
+
initialView,
|
|
109
|
+
headerToolbar: false,
|
|
110
|
+
locale: language === "es" ? spanishLocale : "en",
|
|
111
|
+
firstDay: MONDAY,
|
|
112
|
+
height,
|
|
113
|
+
nowIndicator: true,
|
|
114
|
+
dayMaxEvents: DAY_MAX_EVENTS,
|
|
115
|
+
events: coloredEvents,
|
|
116
|
+
eventDisplay: "block",
|
|
117
|
+
datesSet: (dateInfo) => {
|
|
118
|
+
setTitle(dateInfo.view.title);
|
|
119
|
+
setView(dateInfo.view.type);
|
|
120
|
+
},
|
|
121
|
+
eventClick: onEventClick ? (clickInfo) => onEventClick(clickInfo.event.id) : void 0,
|
|
122
|
+
selectable: Boolean(onDateSelect),
|
|
123
|
+
selectMirror: true,
|
|
124
|
+
select: onDateSelect ? (selectInfo) => {
|
|
125
|
+
onDateSelect({ start: selectInfo.startStr, end: selectInfo.endStr, allDay: selectInfo.allDay });
|
|
126
|
+
calendarApi()?.unselect();
|
|
127
|
+
} : void 0,
|
|
128
|
+
editable: Boolean(onEventChange),
|
|
129
|
+
eventChange: onEventChange ? changeEvent : void 0
|
|
130
|
+
}
|
|
131
|
+
) })
|
|
132
|
+
] });
|
|
133
|
+
}
|
|
134
|
+
export {
|
|
135
|
+
CALENDAR_VIEW,
|
|
136
|
+
EventCalendar as default
|
|
137
|
+
};
|
|
138
|
+
//# sourceMappingURL=EventCalendar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EventCalendar.js","sources":["../../src/calendar/EventCalendar.jsx"],"sourcesContent":["// Un calendario de eventos (@stackcraftmx/calcita/calendar): FullCalendar por dentro, con la barra del framework (anterior y\n// siguiente, «Hoy», el título y la vista con el control segmentado) y los colores del tema. En el idioma de\n// ToolkitProvider, la semana empieza en lunes y marca la hora actual. Las citas van en bloques de su color (el color es\n// información: el tipo de cita), no en puntitos.\n//\n// <EventCalendar events={[{id: '1', title: 'Entrega P-2375', start: '2026-10-20T10:00', end: '2026-10-20T11:00', tone: 'info'}]}\n// onEventClick={openDetail} onDateSelect={openNewEvent} onEventChange={(change) => api.patch(...)} />\n//\n// Arrastrar un evento lo cambia de día u hora: onEventChange recibe lo nuevo y, si truena (el servidor dijo que no), el\n// evento regresa a donde estaba. Sin onEventChange no se puede arrastrar; sin onDateSelect no se pueden elegir días.\n//\n// OJO: las horas se pintan en la zona del navegador (FullCalendar pide un complemento aparte para zonas con nombre).\n//\n// Genérico del paquete: function (regla de la casa).\nimport {useRef, useState} from 'react';\nimport FullCalendar from '@fullcalendar/react';\nimport dayGridPlugin from '@fullcalendar/daygrid';\nimport interactionPlugin from '@fullcalendar/interaction';\nimport listPlugin from '@fullcalendar/list';\nimport timeGridPlugin from '@fullcalendar/timegrid';\nimport spanishLocale from '@fullcalendar/core/locales/es';\nimport Box from '@mui/material/Box';\nimport Button from '@mui/material/Button';\nimport IconButton from '@mui/material/IconButton';\nimport Stack from '@mui/material/Stack';\nimport Tooltip from '@mui/material/Tooltip';\nimport Typography from '@mui/material/Typography';\nimport {useTheme} from '@mui/material/styles';\nimport ChevronLeftRoundedIcon from '@mui/icons-material/ChevronLeftRounded';\nimport ChevronRightRoundedIcon from '@mui/icons-material/ChevronRightRounded';\n\nimport {paletteOf} from '@/theme/components/paletteOf.js';\nimport {useToolkitSettings} from '@/toolkit/toolkitContext.js';\nimport {useToolkitTranslation} from '@/toolkit/useToolkitTranslation.js';\nimport SegmentedControl from '@/ui/filters/SegmentedControl.jsx';\n\n/** Las vistas del calendario (los nombres de FullCalendar). */\nexport const CALENDAR_VIEW = Object.freeze({month: 'dayGridMonth', week: 'timeGridWeek', day: 'timeGridDay', list: 'listWeek'});\n\n// el texto de cada vista en los textos del paquete (calendar.views.*)\nconst VIEW_TEXT_KEY = Object.freeze({\n [CALENDAR_VIEW.month]: 'month', [CALENDAR_VIEW.week]: 'week', [CALENDAR_VIEW.day]: 'day', [CALENDAR_VIEW.list]: 'list',\n});\n// cuántos eventos caben en un día del mes antes del «+2 más»\nconst DAY_MAX_EVENTS = 3;\nconst MONDAY = 1;\n\n/**\n * La primera letra en mayúscula y lo demás como viene: «octubre de 2026» → «Octubre de 2026». OJO: con CSS\n * (text-transform: capitalize) salía «Octubre De 2026»: en español solo va la primera.\n *\n * @param {string} text\n * @returns {string}\n */\nfunction capitalizeFirst(text) {\n return text ? text.charAt(0).toLocaleUpperCase() + text.slice(1) : text;\n}\n\n/**\n * Los colores del calendario sobre el tema (las variables CSS de FullCalendar), en claro y en oscuro.\n *\n * @param {object} theme\n * @returns {object}\n */\nfunction calendarStylesOf(theme) {\n const palette = paletteOf(theme);\n return {\n '--fc-border-color': palette.divider,\n '--fc-page-bg-color': 'transparent',\n '--fc-neutral-bg-color': palette.action.hover,\n '--fc-today-bg-color': `color-mix(in srgb, ${palette.primary.main} 8%, transparent)`,\n '--fc-list-event-hover-bg-color': palette.action.hover,\n '--fc-now-indicator-color': palette.error.main,\n '--fc-highlight-color': `color-mix(in srgb, ${palette.primary.main} 14%, transparent)`,\n '& .fc': {fontFamily: 'inherit', fontSize: theme.typography.body2.fontSize},\n // los números de los días y los encabezados son ligas en FullCalendar: sin subrayado y del color del texto\n '& .fc a': {color: 'inherit', textDecoration: 'none'},\n '& .fc-col-header-cell-cushion': {fontWeight: 600, py: 1},\n '& .fc-event': {borderRadius: '6px', px: 0.5},\n // la hora no se encoge: en un día angosto se recortaba («1C» en lugar de «10»); lo que se corta es el nombre\n '& .fc-event-time': {flexShrink: 0, overflow: 'visible'},\n '& .fc-scrollgrid': {borderRadius: '12px', overflow: 'hidden'},\n '& .fc-list': {borderRadius: '12px'},\n };\n}\n\n/**\n * @param {object} props\n * @param {Array<{id: string, title: string, start: string, end?: string, allDay?: boolean, tone?: string}>} props.events\n * start y end como texto ISO; tone: un color del tema (por omisión primary)\n * @param {string} [props.initialView] una de CALENDAR_VIEW\n * @param {string[]} [props.views] las que se ofrecen en el control segmentado\n * @param {(eventId: string) => void} [props.onEventClick]\n * @param {(range: {start: string, end: string, allDay: boolean}) => void} [props.onDateSelect] al elegir días u horas\n * @param {(change: {id: string, start: string, end: string|null, allDay: boolean}) => Promise<unknown>|void} [props.onEventChange]\n * al arrastrar un evento; si truena, el evento regresa\n * @param {number|'auto'} [props.height]\n * @param {string} props.ariaLabel ya traducido\n */\nexport default function EventCalendar({\n events, initialView = CALENDAR_VIEW.month, views = Object.values(CALENDAR_VIEW), onEventClick, onDateSelect, onEventChange, height = 'auto', ariaLabel,\n}) {\n const theme = useTheme();\n const palette = paletteOf(theme);\n const {t} = useToolkitTranslation('calendar');\n const {language} = useToolkitSettings();\n const calendarRef = useRef(null);\n const [title, setTitle] = useState('');\n const [view, setView] = useState(initialView);\n const calendarApi = () => calendarRef.current?.getApi();\n\n const coloredEvents = events.map((event) => {\n const color = palette[event.tone] ?? palette.primary;\n return {...event, backgroundColor: color.main, borderColor: color.main, textColor: color.contrastText};\n });\n\n const changeEvent = async ({event, revert}) => {\n try {\n await onEventChange({id: event.id, start: event.startStr, end: event.endStr || null, allDay: event.allDay});\n } catch {\n // el servidor dijo que no: el evento regresa a donde estaba (quien llama ya avisó el error)\n revert();\n }\n };\n\n return (\n <Stack spacing={2} role=\"region\" aria-label={ariaLabel}>\n <Stack direction={{xs: 'column', md: 'row'}} spacing={1.5} sx={{alignItems: {md: 'center'}, justifyContent: 'space-between'}}>\n <Stack direction=\"row\" spacing={1} sx={{alignItems: 'center'}}>\n <Tooltip title={t('previous')}>\n <IconButton aria-label={t('previous')} onClick={() => calendarApi()?.prev()}><ChevronLeftRoundedIcon /></IconButton>\n </Tooltip>\n <Tooltip title={t('next')}>\n <IconButton aria-label={t('next')} onClick={() => calendarApi()?.next()}><ChevronRightRoundedIcon /></IconButton>\n </Tooltip>\n <Button variant=\"outlined\" size=\"small\" onClick={() => calendarApi()?.today()}>{t('today')}</Button>\n <Typography variant=\"h6\" component=\"h2\" sx={{pl: 1}} aria-live=\"polite\">{capitalizeFirst(title)}</Typography>\n </Stack>\n {views.length > 1 && (\n <SegmentedControl ariaLabel={t('view')} value={view} onChange={(nextView) => calendarApi()?.changeView(nextView)}\n options={views.map((value) => ({value, label: t(`views.${VIEW_TEXT_KEY[value]}`)}))} />\n )}\n </Stack>\n <Box sx={calendarStylesOf}>\n <FullCalendar ref={calendarRef} plugins={[dayGridPlugin, timeGridPlugin, listPlugin, interactionPlugin]} initialView={initialView}\n headerToolbar={false} locale={language === 'es' ? spanishLocale : 'en'} firstDay={MONDAY} height={height}\n nowIndicator dayMaxEvents={DAY_MAX_EVENTS} events={coloredEvents} eventDisplay=\"block\"\n datesSet={(dateInfo) => {\n setTitle(dateInfo.view.title);\n setView(dateInfo.view.type);\n }}\n eventClick={onEventClick ? (clickInfo) => onEventClick(clickInfo.event.id) : undefined}\n selectable={Boolean(onDateSelect)} selectMirror\n select={onDateSelect ? (selectInfo) => {\n onDateSelect({start: selectInfo.startStr, end: selectInfo.endStr, allDay: selectInfo.allDay});\n calendarApi()?.unselect();\n } : undefined}\n editable={Boolean(onEventChange)} eventChange={onEventChange ? changeEvent : undefined} />\n </Box>\n </Stack>\n );\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAqCO,MAAM,gBAAgB,OAAO,OAAO,EAAC,OAAO,gBAAgB,MAAM,gBAAgB,KAAK,eAAe,MAAM,WAAA,CAAW;AAG9H,MAAM,gBAAgB,OAAO,OAAO;AAAA,EAChC,CAAC,cAAc,KAAK,GAAG;AAAA,EAAS,CAAC,cAAc,IAAI,GAAG;AAAA,EAAQ,CAAC,cAAc,GAAG,GAAG;AAAA,EAAO,CAAC,cAAc,IAAI,GAAG;AACpH,CAAC;AAED,MAAM,iBAAiB;AACvB,MAAM,SAAS;AASf,SAAS,gBAAgB,MAAM;AAC3B,SAAO,OAAO,KAAK,OAAO,CAAC,EAAE,sBAAsB,KAAK,MAAM,CAAC,IAAI;AACvE;AAQA,SAAS,iBAAiB,OAAO;AAC7B,QAAM,UAAU,UAAU,KAAK;AAC/B,SAAO;AAAA,IACH,qBAAqB,QAAQ;AAAA,IAC7B,sBAAsB;AAAA,IACtB,yBAAyB,QAAQ,OAAO;AAAA,IACxC,uBAAuB,sBAAsB,QAAQ,QAAQ,IAAI;AAAA,IACjE,kCAAkC,QAAQ,OAAO;AAAA,IACjD,4BAA4B,QAAQ,MAAM;AAAA,IAC1C,wBAAwB,sBAAsB,QAAQ,QAAQ,IAAI;AAAA,IAClE,SAAS,EAAC,YAAY,WAAW,UAAU,MAAM,WAAW,MAAM,SAAA;AAAA;AAAA,IAElE,WAAW,EAAC,OAAO,WAAW,gBAAgB,OAAA;AAAA,IAC9C,iCAAiC,EAAC,YAAY,KAAK,IAAI,EAAA;AAAA,IACvD,eAAe,EAAC,cAAc,OAAO,IAAI,IAAA;AAAA;AAAA,IAEzC,oBAAoB,EAAC,YAAY,GAAG,UAAU,UAAA;AAAA,IAC9C,oBAAoB,EAAC,cAAc,QAAQ,UAAU,SAAA;AAAA,IACrD,cAAc,EAAC,cAAc,OAAA;AAAA,EAAM;AAE3C;AAeA,SAAwB,cAAc;AAAA,EAClC;AAAA,EAAQ,cAAc,cAAc;AAAA,EAAO,QAAQ,OAAO,OAAO,aAAa;AAAA,EAAG;AAAA,EAAc;AAAA,EAAc;AAAA,EAAe,SAAS;AAAA,EAAQ;AACjJ,GAAG;AACC,QAAM,QAAQ,SAAA;AACd,QAAM,UAAU,UAAU,KAAK;AAC/B,QAAM,EAAC,EAAA,IAAK,sBAAsB,UAAU;AAC5C,QAAM,EAAC,SAAA,IAAY,mBAAA;AACnB,QAAM,cAAc,OAAO,IAAI;AAC/B,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAS,EAAE;AACrC,QAAM,CAAC,MAAM,OAAO,IAAI,SAAS,WAAW;AAC5C,QAAM,cAAc,MAAM,YAAY,SAAS,OAAA;AAE/C,QAAM,gBAAgB,OAAO,IAAI,CAAC,UAAU;AACxC,UAAM,QAAQ,QAAQ,MAAM,IAAI,KAAK,QAAQ;AAC7C,WAAO,EAAC,GAAG,OAAO,iBAAiB,MAAM,MAAM,aAAa,MAAM,MAAM,WAAW,MAAM,aAAA;AAAA,EAC7F,CAAC;AAED,QAAM,cAAc,OAAO,EAAC,OAAO,aAAY;AAC3C,QAAI;AACA,YAAM,cAAc,EAAC,IAAI,MAAM,IAAI,OAAO,MAAM,UAAU,KAAK,MAAM,UAAU,MAAM,QAAQ,MAAM,QAAO;AAAA,IAC9G,QAAQ;AAEJ,aAAA;AAAA,IACJ;AAAA,EACJ;AAEA,8BACK,OAAA,EAAM,SAAS,GAAG,MAAK,UAAS,cAAY,WACzC,UAAA;AAAA,IAAA,qBAAC,SAAM,WAAW,EAAC,IAAI,UAAU,IAAI,SAAQ,SAAS,KAAK,IAAI,EAAC,YAAY,EAAC,IAAI,YAAW,gBAAgB,mBACxG,UAAA;AAAA,MAAA,qBAAC,OAAA,EAAM,WAAU,OAAM,SAAS,GAAG,IAAI,EAAC,YAAY,SAAA,GAChD,UAAA;AAAA,QAAA,oBAAC,SAAA,EAAQ,OAAO,EAAE,UAAU,GACxB,UAAA,oBAAC,YAAA,EAAW,cAAY,EAAE,UAAU,GAAG,SAAS,MAAM,eAAe,KAAA,GAAQ,UAAA,oBAAC,wBAAA,EAAuB,GAAE,EAAA,CAC3G;AAAA,QACA,oBAAC,WAAQ,OAAO,EAAE,MAAM,GACpB,UAAA,oBAAC,cAAW,cAAY,EAAE,MAAM,GAAG,SAAS,MAAM,YAAA,GAAe,QAAQ,UAAA,oBAAC,yBAAA,EAAwB,EAAA,CAAE,EAAA,CACxG;AAAA,QACA,oBAAC,QAAA,EAAO,SAAQ,YAAW,MAAK,SAAQ,SAAS,MAAM,YAAA,GAAe,MAAA,GAAU,UAAA,EAAE,OAAO,GAAE;AAAA,QAC3F,oBAAC,YAAA,EAAW,SAAQ,MAAK,WAAU,MAAK,IAAI,EAAC,IAAI,KAAI,aAAU,UAAU,UAAA,gBAAgB,KAAK,EAAA,CAAE;AAAA,MAAA,GACpG;AAAA,MACC,MAAM,SAAS,KACZ;AAAA,QAAC;AAAA,QAAA;AAAA,UAAiB,WAAW,EAAE,MAAM;AAAA,UAAG,OAAO;AAAA,UAAM,UAAU,CAAC,aAAa,YAAA,GAAe,WAAW,QAAQ;AAAA,UAC7F,SAAS,MAAM,IAAI,CAAC,WAAW,EAAC,OAAO,OAAO,EAAE,SAAS,cAAc,KAAK,CAAC,EAAE,IAAG;AAAA,QAAA;AAAA,MAAA;AAAA,IAAG,GAE/G;AAAA,IACA,oBAAC,KAAA,EAAI,IAAI,kBACL,UAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QAAa,KAAK;AAAA,QAAa,SAAS,CAAC,eAAe,gBAAgB,YAAY,iBAAiB;AAAA,QAAG;AAAA,QAC3F,eAAe;AAAA,QAAO,QAAQ,aAAa,OAAO,gBAAgB;AAAA,QAAM,UAAU;AAAA,QAAQ;AAAA,QAC1F,cAAY;AAAA,QAAC,cAAc;AAAA,QAAgB,QAAQ;AAAA,QAAe,cAAa;AAAA,QAC/E,UAAU,CAAC,aAAa;AACpB,mBAAS,SAAS,KAAK,KAAK;AAC5B,kBAAQ,SAAS,KAAK,IAAI;AAAA,QAC9B;AAAA,QACA,YAAY,eAAe,CAAC,cAAc,aAAa,UAAU,MAAM,EAAE,IAAI;AAAA,QAC7E,YAAY,QAAQ,YAAY;AAAA,QAAG,cAAY;AAAA,QAC/C,QAAQ,eAAe,CAAC,eAAe;AACnC,uBAAa,EAAC,OAAO,WAAW,UAAU,KAAK,WAAW,QAAQ,QAAQ,WAAW,OAAA,CAAO;AAC5F,sBAAA,GAAe,SAAA;AAAA,QACnB,IAAI;AAAA,QACJ,UAAU,QAAQ,aAAa;AAAA,QAAG,aAAa,gBAAgB,cAAc;AAAA,MAAA;AAAA,IAAA,EAAW,CAC1G;AAAA,EAAA,GACJ;AAER;"}
|
package/dist/calendar.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"calendar.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
|
package/dist/charts.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"charts.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { CALENDAR_DATE_FORMAT, default as default2 } from "./datePickers/DateInput.js";
|
|
2
|
+
import { default as default3 } from "./datePickers/FormDateField.js";
|
|
3
|
+
export {
|
|
4
|
+
CALENDAR_DATE_FORMAT,
|
|
5
|
+
default2 as DateInput,
|
|
6
|
+
default3 as FormDateField
|
|
7
|
+
};
|
|
8
|
+
//# sourceMappingURL=date-pickers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"date-pickers.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx } from "react/jsx-runtime";
|
|
3
|
+
import { useId } from "react";
|
|
4
|
+
import dayjs from "dayjs";
|
|
5
|
+
import "dayjs/locale/es";
|
|
6
|
+
import { useToolkitTranslation } from "../toolkit/useToolkitTranslation.js";
|
|
7
|
+
import { AdapterDayjs } from "@mui/x-date-pickers/AdapterDayjs";
|
|
8
|
+
import { DatePicker } from "@mui/x-date-pickers/DatePicker";
|
|
9
|
+
import { LocalizationProvider } from "@mui/x-date-pickers/LocalizationProvider";
|
|
10
|
+
import { enUS, esES } from "@mui/x-date-pickers/locales";
|
|
11
|
+
import { translateValidationMessage } from "../forms/validationMessages.js";
|
|
12
|
+
import FieldFrame from "../inputs/FieldFrame.js";
|
|
13
|
+
const CALENDAR_DATE_FORMAT = "YYYY-MM-DD";
|
|
14
|
+
const DATE_LOOK_BY_LANGUAGE = Object.freeze({
|
|
15
|
+
es: { adapterLocale: "es", displayFormat: "DD/MM/YYYY", localeText: esES.components.MuiLocalizationProvider.defaultProps.localeText },
|
|
16
|
+
en: { adapterLocale: "en", displayFormat: "MM/DD/YYYY", localeText: enUS.components.MuiLocalizationProvider.defaultProps.localeText }
|
|
17
|
+
});
|
|
18
|
+
function pickerValueOf(calendarDate) {
|
|
19
|
+
return calendarDate ? dayjs(calendarDate) : null;
|
|
20
|
+
}
|
|
21
|
+
function DateInput({
|
|
22
|
+
name,
|
|
23
|
+
label,
|
|
24
|
+
value,
|
|
25
|
+
onChange,
|
|
26
|
+
onBlur,
|
|
27
|
+
error,
|
|
28
|
+
helperText = " ",
|
|
29
|
+
minDate,
|
|
30
|
+
maxDate,
|
|
31
|
+
disableFuture = false,
|
|
32
|
+
disablePast = false,
|
|
33
|
+
openTo = "day",
|
|
34
|
+
disabled = false,
|
|
35
|
+
inputRef
|
|
36
|
+
}) {
|
|
37
|
+
const { t, language } = useToolkitTranslation("common");
|
|
38
|
+
const generatedId = useId();
|
|
39
|
+
const inputId = `${name ?? "date"}-${generatedId}`;
|
|
40
|
+
const errorText = translateValidationMessage(t, error);
|
|
41
|
+
const look = DATE_LOOK_BY_LANGUAGE[language] ?? DATE_LOOK_BY_LANGUAGE.es;
|
|
42
|
+
return /* @__PURE__ */ jsx(FieldFrame, { inputId, label, children: /* @__PURE__ */ jsx(LocalizationProvider, { dateAdapter: AdapterDayjs, adapterLocale: look.adapterLocale, localeText: look.localeText, children: /* @__PURE__ */ jsx(
|
|
43
|
+
DatePicker,
|
|
44
|
+
{
|
|
45
|
+
format: look.displayFormat,
|
|
46
|
+
value: pickerValueOf(value),
|
|
47
|
+
minDate: pickerValueOf(minDate) ?? void 0,
|
|
48
|
+
maxDate: pickerValueOf(maxDate) ?? void 0,
|
|
49
|
+
disableFuture,
|
|
50
|
+
disablePast,
|
|
51
|
+
disabled,
|
|
52
|
+
openTo,
|
|
53
|
+
views: openTo === "year" ? ["year", "month", "day"] : void 0,
|
|
54
|
+
inputRef,
|
|
55
|
+
onChange: (pickedDate) => onChange(pickedDate?.isValid() ? pickedDate.format(CALENDAR_DATE_FORMAT) : ""),
|
|
56
|
+
onClose: onBlur,
|
|
57
|
+
slotProps: {
|
|
58
|
+
textField: {
|
|
59
|
+
id: inputId,
|
|
60
|
+
name,
|
|
61
|
+
size: "small",
|
|
62
|
+
fullWidth: true,
|
|
63
|
+
onBlur,
|
|
64
|
+
error: Boolean(errorText),
|
|
65
|
+
helperText: errorText ?? helperText
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
) }) });
|
|
70
|
+
}
|
|
71
|
+
export {
|
|
72
|
+
CALENDAR_DATE_FORMAT,
|
|
73
|
+
DateInput as default
|
|
74
|
+
};
|
|
75
|
+
//# sourceMappingURL=DateInput.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DateInput.js","sources":["../../src/datePickers/DateInput.jsx"],"sourcesContent":["// Campo de FECHA suelto con el DatePicker de MUI X (@stackcraftmx/calcita/date-pickers), con la etiqueta arriba como los\n// demás campos del paquete.\n//\n// Al formulario (y al servidor) viaja la fecha de calendario 'AAAA-MM-DD' en texto; en pantalla se ve DD/MM/AAAA en español\n// y MM/DD/AAAA en inglés, con el calendario y sus textos en el idioma activo. '' = sin fecha. Una fecha de calendario no\n// tiene hora ni zona: nunca se pasa por Date (que la movería de día según la zona).\n//\n// Cada campo trae su LocalizationProvider con dayjs: la pantalla no tiene que poner nada alrededor.\n//\n// Genérico del paquete: function (regla de la casa).\nimport {useId} from 'react';\nimport dayjs from 'dayjs';\nimport 'dayjs/locale/es';\nimport {useToolkitTranslation} from '@/toolkit/useToolkitTranslation.js';\nimport {AdapterDayjs} from '@mui/x-date-pickers/AdapterDayjs';\nimport {DatePicker} from '@mui/x-date-pickers/DatePicker';\nimport {LocalizationProvider} from '@mui/x-date-pickers/LocalizationProvider';\nimport {enUS, esES} from '@mui/x-date-pickers/locales';\n\nimport {translateValidationMessage} from '@/forms/validationMessages.js';\nimport FieldFrame from '@/inputs/FieldFrame.jsx';\n\n/** Cómo viaja una fecha de calendario. */\nexport const CALENDAR_DATE_FORMAT = 'YYYY-MM-DD';\n\n// cómo se ve y con qué textos sale el calendario en cada idioma\nconst DATE_LOOK_BY_LANGUAGE = Object.freeze({\n es: {adapterLocale: 'es', displayFormat: 'DD/MM/YYYY', localeText: esES.components.MuiLocalizationProvider.defaultProps.localeText},\n en: {adapterLocale: 'en', displayFormat: 'MM/DD/YYYY', localeText: enUS.components.MuiLocalizationProvider.defaultProps.localeText},\n});\n\n/**\n * Una fecha de calendario 'AAAA-MM-DD' como la quiere el DatePicker; null si está vacía.\n *\n * @param {string|null|undefined} calendarDate\n * @returns {import('dayjs').Dayjs|null}\n */\nfunction pickerValueOf(calendarDate) {\n // dayjs lee 'AAAA-MM-DD' como día local (a diferencia de new Date, que lo toma en UTC y lo mueve de día)\n return calendarDate ? dayjs(calendarDate) : null;\n}\n\n/**\n * @param {object} props\n * @param {string} [props.name]\n * @param {string} props.label ya traducido\n * @param {string|null|undefined} props.value 'AAAA-MM-DD' o ''\n * @param {(value: string) => void} props.onChange recibe 'AAAA-MM-DD' ('' al borrar o con una fecha a medias)\n * @param {() => void} [props.onBlur]\n * @param {string|{key: string, values?: object}} [props.error]\n * @param {string} [props.helperText]\n * @param {string} [props.minDate] 'AAAA-MM-DD'\n * @param {string} [props.maxDate] 'AAAA-MM-DD'\n * @param {boolean} [props.disableFuture] p. ej. una fecha de nacimiento\n * @param {boolean} [props.disablePast] p. ej. una cita\n * @param {'day'|'month'|'year'} [props.openTo] por dónde abre el calendario (year para un nacimiento)\n * @param {boolean} [props.disabled]\n * @param {import('react').Ref<HTMLInputElement>} [props.inputRef]\n */\nexport default function DateInput({\n name, label, value, onChange, onBlur, error, helperText = ' ', minDate, maxDate, disableFuture = false, disablePast = false,\n openTo = 'day', disabled = false, inputRef,\n}) {\n const {t, language} = useToolkitTranslation('common');\n const generatedId = useId();\n const inputId = `${name ?? 'date'}-${generatedId}`;\n const errorText = translateValidationMessage(t, error);\n const look = DATE_LOOK_BY_LANGUAGE[language] ?? DATE_LOOK_BY_LANGUAGE.es;\n\n return (\n <FieldFrame inputId={inputId} label={label}>\n <LocalizationProvider dateAdapter={AdapterDayjs} adapterLocale={look.adapterLocale} localeText={look.localeText}>\n <DatePicker\n format={look.displayFormat}\n value={pickerValueOf(value)}\n minDate={pickerValueOf(minDate) ?? undefined}\n maxDate={pickerValueOf(maxDate) ?? undefined}\n disableFuture={disableFuture}\n disablePast={disablePast}\n disabled={disabled}\n openTo={openTo}\n views={openTo === 'year' ? ['year', 'month', 'day'] : undefined}\n inputRef={inputRef}\n // una fecha a medias (25/1_/____) todavía no es fecha: viaja como vacía hasta que se complete\n onChange={(pickedDate) => onChange(pickedDate?.isValid() ? pickedDate.format(CALENDAR_DATE_FORMAT) : '')}\n onClose={onBlur}\n slotProps={{\n textField: {\n id: inputId, name, size: 'small', fullWidth: true, onBlur, error: Boolean(errorText), helperText: errorText ?? helperText,\n },\n }}\n />\n </LocalizationProvider>\n </FieldFrame>\n );\n}\n"],"names":[],"mappings":";;;;;;;;;;;;AAuBO,MAAM,uBAAuB;AAGpC,MAAM,wBAAwB,OAAO,OAAO;AAAA,EACxC,IAAI,EAAC,eAAe,MAAM,eAAe,cAAc,YAAY,KAAK,WAAW,wBAAwB,aAAa,WAAA;AAAA,EACxH,IAAI,EAAC,eAAe,MAAM,eAAe,cAAc,YAAY,KAAK,WAAW,wBAAwB,aAAa,WAAA;AAC5H,CAAC;AAQD,SAAS,cAAc,cAAc;AAEjC,SAAO,eAAe,MAAM,YAAY,IAAI;AAChD;AAmBA,SAAwB,UAAU;AAAA,EAC9B;AAAA,EAAM;AAAA,EAAO;AAAA,EAAO;AAAA,EAAU;AAAA,EAAQ;AAAA,EAAO,aAAa;AAAA,EAAK;AAAA,EAAS;AAAA,EAAS,gBAAgB;AAAA,EAAO,cAAc;AAAA,EACtH,SAAS;AAAA,EAAO,WAAW;AAAA,EAAO;AACtC,GAAG;AACC,QAAM,EAAC,GAAG,aAAY,sBAAsB,QAAQ;AACpD,QAAM,cAAc,MAAA;AACpB,QAAM,UAAU,GAAG,QAAQ,MAAM,IAAI,WAAW;AAChD,QAAM,YAAY,2BAA2B,GAAG,KAAK;AACrD,QAAM,OAAO,sBAAsB,QAAQ,KAAK,sBAAsB;AAEtE,SACI,oBAAC,YAAA,EAAW,SAAkB,OAC1B,UAAA,oBAAC,sBAAA,EAAqB,aAAa,cAAc,eAAe,KAAK,eAAe,YAAY,KAAK,YACjG,UAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACG,QAAQ,KAAK;AAAA,MACb,OAAO,cAAc,KAAK;AAAA,MAC1B,SAAS,cAAc,OAAO,KAAK;AAAA,MACnC,SAAS,cAAc,OAAO,KAAK;AAAA,MACnC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,OAAO,WAAW,SAAS,CAAC,QAAQ,SAAS,KAAK,IAAI;AAAA,MACtD;AAAA,MAEA,UAAU,CAAC,eAAe,SAAS,YAAY,YAAY,WAAW,OAAO,oBAAoB,IAAI,EAAE;AAAA,MACvG,SAAS;AAAA,MACT,WAAW;AAAA,QACP,WAAW;AAAA,UACP,IAAI;AAAA,UAAS;AAAA,UAAM,MAAM;AAAA,UAAS,WAAW;AAAA,UAAM;AAAA,UAAQ,OAAO,QAAQ,SAAS;AAAA,UAAG,YAAY,aAAa;AAAA,QAAA;AAAA,MACnH;AAAA,IACJ;AAAA,EAAA,GAER,EAAA,CACJ;AAER;"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx } from "react/jsx-runtime";
|
|
3
|
+
import DateInput from "./DateInput.js";
|
|
4
|
+
import { useFormikField } from "../forms/useFormikField.js";
|
|
5
|
+
function FormDateField({ name, ...dateInputProps }) {
|
|
6
|
+
const fieldProps = useFormikField(name);
|
|
7
|
+
return /* @__PURE__ */ jsx(DateInput, { ...dateInputProps, ...fieldProps });
|
|
8
|
+
}
|
|
9
|
+
export {
|
|
10
|
+
FormDateField as default
|
|
11
|
+
};
|
|
12
|
+
//# sourceMappingURL=FormDateField.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FormDateField.js","sources":["../../src/datePickers/FormDateField.jsx"],"sourcesContent":["// Campo de fecha de formik: DateInput conectado a su campo. Al formulario llega 'AAAA-MM-DD'.\n//\n// Con react-hook-form no hay uno listo (esta puerta no pide react-hook-form): DateInput va dentro de un Controller.\n//\n// Genérico del paquete: function (regla de la casa).\nimport DateInput from '@/datePickers/DateInput.jsx';\nimport {useFormikField} from '@/forms/useFormikField.js';\n\n/**\n * @param {{name: string} & Omit<Parameters<typeof import('@/datePickers/DateInput.jsx').default>[0], 'name'|'value'|'onChange'|'onBlur'|'error'>} props las de\n * DateInput (minDate, maxDate, disableFuture, openTo…), sin value / onChange / onBlur / error\n */\nexport default function FormDateField({name, ...dateInputProps}) {\n const fieldProps = useFormikField(name);\n return <DateInput {...dateInputProps} {...fieldProps} />;\n}\n"],"names":[],"mappings":";;;;AAYA,SAAwB,cAAc,EAAC,MAAM,GAAG,kBAAiB;AAC7D,QAAM,aAAa,eAAe,IAAI;AACtC,SAAO,oBAAC,WAAA,EAAW,GAAG,gBAAiB,GAAG,WAAA,CAAY;AAC1D;"}
|
package/dist/dates.js
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
const PLAIN_DATE_PATTERN = /^(\d{4})-(\d{2})-(\d{2})$/;
|
|
2
|
+
function parseInstant(value) {
|
|
3
|
+
if (value === null || value === void 0 || value === "") {
|
|
4
|
+
return null;
|
|
5
|
+
}
|
|
6
|
+
const instant = new Date(value);
|
|
7
|
+
return Number.isNaN(instant.getTime()) ? null : instant;
|
|
8
|
+
}
|
|
9
|
+
function parsePlainDate(value) {
|
|
10
|
+
const match = typeof value === "string" ? PLAIN_DATE_PATTERN.exec(value) : null;
|
|
11
|
+
if (!match) {
|
|
12
|
+
return null;
|
|
13
|
+
}
|
|
14
|
+
const [year, month, day] = [Number(match[1]), Number(match[2]), Number(match[3])];
|
|
15
|
+
const calendarDate = new Date(Date.UTC(year, month - 1, day));
|
|
16
|
+
if (calendarDate.getUTCMonth() !== month - 1 || calendarDate.getUTCDate() !== day) {
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
return { year, month, day };
|
|
20
|
+
}
|
|
21
|
+
export {
|
|
22
|
+
parseInstant,
|
|
23
|
+
parsePlainDate
|
|
24
|
+
};
|
|
25
|
+
//# sourceMappingURL=dates.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dates.js","sources":["../src/dates.js"],"sourcesContent":["// Fechas que llegan del API, leídas sin librería (Date + Intl).\n//\n// La zona en que se pintan las horas es la del proveedor (`timeZone` de ToolkitProvider; por omisión la del navegador).\n// Un negocio que decide sus cortes en una zona fija la pasa ahí, para que alguien que abre la pantalla desde otra zona\n// vea la misma hora que ve operación.\n//\n// El backend manda instantes ISO con desfase (UTC) y fechas de calendario sin hora (\"2026-08-16\"). Son dos cosas\n// distintas:\n// - un instante es un punto en el tiempo (parseInstant); la zona del negocio la aplica Intl con timeZone al\n// pintarlo (formatting.js), así que aquí no se convierte nada;\n// - una fecha de calendario NO tiene zona: pasarla por Date la podría correr un día (parsePlainDate la separa en\n// año, mes y día).\n//\n// Funciones puras, no renderizan: function (regla de la casa).\n\nconst PLAIN_DATE_PATTERN = /^(\\d{4})-(\\d{2})-(\\d{2})$/;\n\n/**\n * Un instante (ISO con desfase, milisegundos o Date) como Date válido.\n *\n * @param {string|Date|number|null|undefined} value\n * @returns {Date|null} null si no hay dato o no es una fecha válida\n */\nexport function parseInstant(value) {\n if (value === null || value === undefined || value === '') {\n return null;\n }\n const instant = new Date(value);\n return Number.isNaN(instant.getTime()) ? null : instant;\n}\n\n/**\n * Una fecha de calendario (\"2026-08-16\") en sus partes, sin moverla de zona.\n *\n * @param {string|null|undefined} value\n * @returns {{year: number, month: number, day: number}|null} null si no tiene la forma o no existe (2026-02-31)\n */\nexport function parsePlainDate(value) {\n const match = typeof value === 'string' ? PLAIN_DATE_PATTERN.exec(value) : null;\n if (!match) {\n return null;\n }\n const [year, month, day] = [Number(match[1]), Number(match[2]), Number(match[3])];\n // guard clause: Date.UTC \"arregla\" el 31 de febrero pasándolo a marzo; si el día cambió, la fecha no existe\n const calendarDate = new Date(Date.UTC(year, month - 1, day));\n if (calendarDate.getUTCMonth() !== month - 1 || calendarDate.getUTCDate() !== day) {\n return null;\n }\n return {year, month, day};\n}\n"],"names":[],"mappings":"AAeA,MAAM,qBAAqB;AAQpB,SAAS,aAAa,OAAO;AAChC,MAAI,UAAU,QAAQ,UAAU,UAAa,UAAU,IAAI;AACvD,WAAO;AAAA,EACX;AACA,QAAM,UAAU,IAAI,KAAK,KAAK;AAC9B,SAAO,OAAO,MAAM,QAAQ,QAAO,CAAE,IAAI,OAAO;AACpD;AAQO,SAAS,eAAe,OAAO;AAClC,QAAM,QAAQ,OAAO,UAAU,WAAW,mBAAmB,KAAK,KAAK,IAAI;AAC3E,MAAI,CAAC,OAAO;AACR,WAAO;AAAA,EACX;AACA,QAAM,CAAC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,MAAM,CAAC,CAAC,GAAG,OAAO,MAAM,CAAC,CAAC,GAAG,OAAO,MAAM,CAAC,CAAC,CAAC;AAEhF,QAAM,eAAe,IAAI,KAAK,KAAK,IAAI,MAAM,QAAQ,GAAG,GAAG,CAAC;AAC5D,MAAI,aAAa,YAAW,MAAO,QAAQ,KAAK,aAAa,WAAU,MAAO,KAAK;AAC/E,WAAO;AAAA,EACX;AACA,SAAO,EAAC,MAAM,OAAO,IAAG;AAC5B;"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { createLogger } from "../observability/logger.js";
|
|
2
|
+
const log = createLogger("dictionaries");
|
|
3
|
+
const NAMESPACE = "dictionaries";
|
|
4
|
+
const UNKNOWN_ENTRY = Object.freeze({
|
|
5
|
+
value: null,
|
|
6
|
+
labelKey: `${NAMESPACE}:unknown.label`,
|
|
7
|
+
tooltipKey: `${NAMESPACE}:unknown.tooltip`,
|
|
8
|
+
color: "default",
|
|
9
|
+
isKnown: false
|
|
10
|
+
});
|
|
11
|
+
function dictionaryEntryOf(value, keyPrefix, color, { hasShortLabel = false } = {}) {
|
|
12
|
+
return Object.freeze({
|
|
13
|
+
value,
|
|
14
|
+
labelKey: `${NAMESPACE}:${keyPrefix}.label`,
|
|
15
|
+
tooltipKey: `${NAMESPACE}:${keyPrefix}.tooltip`,
|
|
16
|
+
...hasShortLabel ? { shortLabelKey: `${NAMESPACE}:${keyPrefix}.shortLabel` } : {},
|
|
17
|
+
color,
|
|
18
|
+
isKnown: true
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
function lookup(dictionary, value) {
|
|
22
|
+
if (value !== null && value !== void 0 && Object.hasOwn(dictionary, value)) {
|
|
23
|
+
return dictionary[value];
|
|
24
|
+
}
|
|
25
|
+
if (value !== null && value !== void 0) {
|
|
26
|
+
log.warn("valor sin entrada en el diccionario", { value });
|
|
27
|
+
}
|
|
28
|
+
return { ...UNKNOWN_ENTRY, value: value ?? null };
|
|
29
|
+
}
|
|
30
|
+
function labelOf(dictionaryEntry, translate) {
|
|
31
|
+
if (dictionaryEntry.isKnown || dictionaryEntry.value === null) {
|
|
32
|
+
return translate(dictionaryEntry.labelKey);
|
|
33
|
+
}
|
|
34
|
+
return dictionaryEntry.value;
|
|
35
|
+
}
|
|
36
|
+
function shortLabelOf(dictionaryEntry, translate) {
|
|
37
|
+
if (dictionaryEntry.isKnown && dictionaryEntry.shortLabelKey) {
|
|
38
|
+
return translate(dictionaryEntry.shortLabelKey);
|
|
39
|
+
}
|
|
40
|
+
return labelOf(dictionaryEntry, translate);
|
|
41
|
+
}
|
|
42
|
+
export {
|
|
43
|
+
dictionaryEntryOf,
|
|
44
|
+
labelOf,
|
|
45
|
+
lookup,
|
|
46
|
+
shortLabelOf
|
|
47
|
+
};
|
|
48
|
+
//# sourceMappingURL=dictionaries.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dictionaries.js","sources":["../../src/dictionaries/dictionaries.js"],"sourcesContent":["// Diccionarios de valores cerrados que llegan del API → etiqueta, tooltip y color del chip (StatusChip, DictionaryText).\n//\n// El paquete trae el mecanismo; los diccionarios los arma cada proyecto con dictionaryEntryOf:\n//\n// export const ORDER_STATUS = Object.freeze({\n// pending: dictionaryEntryOf('pending', 'orderStatus.pending', 'warning'),\n// paid: dictionaryEntryOf('paid', 'orderStatus.paid', 'success'),\n// });\n//\n// Forma de cada entrada: {value, labelKey, tooltipKey, color, isKnown} y, solo en algunas, shortLabelKey\n// - value: el código del API tal cual.\n// - labelKey / tooltipKey: llaves de texto del namespace \"dictionaries\" (los textos los pone el proyecto con `texts` o\n// `translate` de ToolkitProvider). El texto NUNCA va aquí: así cambia de idioma sin tocar el diccionario.\n// - shortLabelKey: palabra corta para una columna angosta («Rechazada» por «Rechazada por estructura»). Solo la traen\n// las entradas cuyo nombre completo no cabe; quien la pinta deja el nombre completo en el tooltip (StatusChip, short).\n// - color: color de paleta de MUI (success, warning, error, info, default).\n// - isKnown: false solo en la entrada \"unknown\"; sirve para pintar el código crudo cuando no hay texto (p. ej. un\n// estatus nuevo que el backend empezó a mandar).\n//\n// Se congelan con Object.freeze para que nadie los mute por accidente desde una pantalla.\n// Un valor que el API mande y no esté en el diccionario no truena la pantalla: lookup regresa la entrada \"unknown\" y lo\n// anota en el log para agregarlo.\n//\n// Funciones puras, no renderizan: function (regla de la casa).\nimport {createLogger} from '@/observability/logger.js';\n\nconst log = createLogger('dictionaries');\n\nconst NAMESPACE = 'dictionaries';\n\nconst UNKNOWN_ENTRY = Object.freeze({\n value: null,\n labelKey: `${NAMESPACE}:unknown.label`,\n tooltipKey: `${NAMESPACE}:unknown.tooltip`,\n color: 'default',\n isKnown: false,\n});\n\n/**\n * Una entrada de diccionario, congelada.\n *\n * @param {string} value el código del API\n * @param {string} keyPrefix dónde viven sus textos dentro del namespace dictionaries ('orderStatus.paid' → orderStatus.paid.label)\n * @param {string} color color de paleta de MUI\n * @param {{hasShortLabel?: boolean}} [options] hasShortLabel: trae palabra corta (keyPrefix.shortLabel)\n * @returns {{value: string, labelKey: string, tooltipKey: string, shortLabelKey?: string, color: string, isKnown: boolean}}\n */\nexport function dictionaryEntryOf(value, keyPrefix, color, {hasShortLabel = false} = {}) {\n return Object.freeze({\n value,\n labelKey: `${NAMESPACE}:${keyPrefix}.label`,\n tooltipKey: `${NAMESPACE}:${keyPrefix}.tooltip`,\n ...(hasShortLabel ? {shortLabelKey: `${NAMESPACE}:${keyPrefix}.shortLabel`} : {}),\n color,\n isKnown: true,\n });\n}\n\n/**\n * La entrada del diccionario para un valor del API.\n *\n * @param {Record<string, object>} dictionary p. ej. ORDER_STATUS\n * @param {string|null|undefined} value código del API\n * @returns {{value: string|null, labelKey: string, tooltipKey: string, color: string, isKnown: boolean}}\n */\nexport function lookup(dictionary, value) {\n if (value !== null && value !== undefined && Object.hasOwn(dictionary, value)) {\n return dictionary[value];\n }\n if (value !== null && value !== undefined) {\n log.warn('valor sin entrada en el diccionario', {value});\n }\n return {...UNKNOWN_ENTRY, value: value ?? null};\n}\n\n/**\n * Texto que se pinta para una entrada: su etiqueta traducida o, si el valor no está en el diccionario, el código\n * crudo. Un estatus nuevo se lee con su código y no como \"Sin estatus\".\n *\n * @param {{value: string|null, labelKey: string, isKnown: boolean}} dictionaryEntry lo que regresa lookup\n * @param {(key: string) => string} translate el t de useToolkitTranslation\n * @returns {string}\n */\nexport function labelOf(dictionaryEntry, translate) {\n if (dictionaryEntry.isKnown || dictionaryEntry.value === null) {\n return translate(dictionaryEntry.labelKey);\n }\n return dictionaryEntry.value;\n}\n\n/**\n * La palabra corta de una entrada, para una columna angosta. Una entrada sin palabra corta regresa su etiqueta de siempre.\n *\n * @param {object} dictionaryEntry entrada del diccionario (lookup)\n * @param {Function} translate traductor\n * @returns {string}\n */\nexport function shortLabelOf(dictionaryEntry, translate) {\n if (dictionaryEntry.isKnown && dictionaryEntry.shortLabelKey) {\n return translate(dictionaryEntry.shortLabelKey);\n }\n return labelOf(dictionaryEntry, translate);\n}\n"],"names":[],"mappings":";AA0BA,MAAM,MAAM,aAAa,cAAc;AAEvC,MAAM,YAAY;AAElB,MAAM,gBAAgB,OAAO,OAAO;AAAA,EAChC,OAAO;AAAA,EACP,UAAU,GAAG,SAAS;AAAA,EACtB,YAAY,GAAG,SAAS;AAAA,EACxB,OAAO;AAAA,EACP,SAAS;AACb,CAAC;AAWM,SAAS,kBAAkB,OAAO,WAAW,OAAO,EAAC,gBAAgB,MAAK,IAAI,IAAI;AACrF,SAAO,OAAO,OAAO;AAAA,IACjB;AAAA,IACA,UAAU,GAAG,SAAS,IAAI,SAAS;AAAA,IACnC,YAAY,GAAG,SAAS,IAAI,SAAS;AAAA,IACrC,GAAI,gBAAgB,EAAC,eAAe,GAAG,SAAS,IAAI,SAAS,cAAa,IAAI;IAC9E;AAAA,IACA,SAAS;AAAA,EACjB,CAAK;AACL;AASO,SAAS,OAAO,YAAY,OAAO;AACtC,MAAI,UAAU,QAAQ,UAAU,UAAa,OAAO,OAAO,YAAY,KAAK,GAAG;AAC3E,WAAO,WAAW,KAAK;AAAA,EAC3B;AACA,MAAI,UAAU,QAAQ,UAAU,QAAW;AACvC,QAAI,KAAK,uCAAuC,EAAC,MAAK,CAAC;AAAA,EAC3D;AACA,SAAO,EAAC,GAAG,eAAe,OAAO,SAAS,KAAI;AAClD;AAUO,SAAS,QAAQ,iBAAiB,WAAW;AAChD,MAAI,gBAAgB,WAAW,gBAAgB,UAAU,MAAM;AAC3D,WAAO,UAAU,gBAAgB,QAAQ;AAAA,EAC7C;AACA,SAAO,gBAAgB;AAC3B;AASO,SAAS,aAAa,iBAAiB,WAAW;AACrD,MAAI,gBAAgB,WAAW,gBAAgB,eAAe;AAC1D,WAAO,UAAU,gBAAgB,aAAa;AAAA,EAClD;AACA,SAAO,QAAQ,iBAAiB,SAAS;AAC7C;"}
|