@stackcraftmx/calcita 0.32.2 → 0.51.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +426 -4
- package/cli/calcita.js +15 -0
- package/cli/checkTexts.js +209 -0
- package/cli/packageVersions.js +17 -3
- package/cli/projectFiles.js +7 -2
- package/cli/templates/module/__Name__Page.test.jsx.tpl +24 -0
- package/cli/templates/project/README.md.tpl +35 -2
- package/cli/templates/project/eslint.config.js.tpl +27 -0
- package/cli/templates/project/src/app/appRouter.jsx.tpl +5 -2
- package/cli/templates/project/src/app/appTexts.js.tpl +2 -1
- package/cli/templates/project/src/core/accountConnector.js.tpl +4 -2
- package/cli/templates/project/src/core/publicPaths.js.tpl +10 -2
- package/cli/templates/project/src/modules/auth/SignInPage.test.jsx.tpl +20 -0
- package/cli/templates/project/src/modules/home/HomePage.test.jsx.tpl +16 -0
- package/cli/templates/project/src/testing/browserGaps.js.tpl +70 -0
- package/cli/templates/project/src/testing/openScreen.jsx.tpl +58 -0
- package/cli/templates/project/src/testing/setup.js.tpl +25 -0
- package/cli/templates/project/vite.config.js.tpl +20 -1
- package/dist/DataTable/AuditTrailDialog.js +3 -2
- package/dist/DataTable/AuditTrailDialog.js.map +1 -1
- package/dist/DataTable/ColumnFilters/HeaderFilterPopover.js +3 -2
- package/dist/DataTable/ColumnFilters/HeaderFilterPopover.js.map +1 -1
- package/dist/DataTable/ColumnFilters/MultiSelectColumnFilter.js +3 -2
- package/dist/DataTable/ColumnFilters/MultiSelectColumnFilter.js.map +1 -1
- package/dist/DataTable/ColumnFilters/SortableFilterHeader.js +3 -2
- package/dist/DataTable/ColumnFilters/SortableFilterHeader.js.map +1 -1
- package/dist/DataTable/EmptyState.js +3 -2
- package/dist/DataTable/EmptyState.js.map +1 -1
- package/dist/DataTable/FilterChips.js +3 -2
- package/dist/DataTable/FilterChips.js.map +1 -1
- package/dist/DataTable/GoToPage.js +71 -14
- package/dist/DataTable/GoToPage.js.map +1 -1
- package/dist/DataTable/ServerTable.js +97 -28
- package/dist/DataTable/ServerTable.js.map +1 -1
- package/dist/DataTable/ServerTableFilterDrawer.js +57 -0
- package/dist/DataTable/ServerTableFilterDrawer.js.map +1 -0
- package/dist/DataTable/StackedCell.js +60 -0
- package/dist/DataTable/StackedCell.js.map +1 -0
- package/dist/DataTable/TableCardsView.js +88 -0
- package/dist/DataTable/TableCardsView.js.map +1 -0
- package/dist/DataTable/columnWidths.js +30 -0
- package/dist/DataTable/columnWidths.js.map +1 -0
- package/dist/DataTable/columns.js +47 -1
- package/dist/DataTable/columns.js.map +1 -1
- package/dist/DataTable/filterContext.js.map +1 -1
- package/dist/DataTable/fixedColumns.js +24 -0
- package/dist/DataTable/fixedColumns.js.map +1 -0
- package/dist/DataTable/goToPageOptions.js +17 -0
- package/dist/DataTable/goToPageOptions.js.map +1 -0
- package/dist/DataTable/useTableView.js +29 -0
- package/dist/DataTable/useTableView.js.map +1 -0
- package/dist/access/PermissionMatrix.js +3 -2
- package/dist/access/PermissionMatrix.js.map +1 -1
- package/dist/account/AccountProvider.js +1 -1
- package/dist/account/AccountSecuritySection.js +3 -2
- package/dist/account/AccountSecuritySection.js.map +1 -1
- package/dist/account/DemoTotpCodeButton.js +3 -2
- package/dist/account/DemoTotpCodeButton.js.map +1 -1
- package/dist/account/ProfileScreen.js +3 -2
- package/dist/account/ProfileScreen.js.map +1 -1
- package/dist/account/SignInScreen.js +3 -2
- package/dist/account/SignInScreen.js.map +1 -1
- package/dist/appShell/AccountMenu.js +3 -2
- package/dist/appShell/AccountMenu.js.map +1 -1
- package/dist/appShell/AppLayout.js +3 -2
- package/dist/appShell/AppLayout.js.map +1 -1
- package/dist/appShell/AppearanceSettings.js +3 -2
- package/dist/appShell/AppearanceSettings.js.map +1 -1
- package/dist/appShell/AuthLayout.js +3 -2
- package/dist/appShell/AuthLayout.js.map +1 -1
- package/dist/appShell/BarActionButton.js +11 -4
- package/dist/appShell/BarActionButton.js.map +1 -1
- package/dist/appShell/BarActions.js +3 -2
- package/dist/appShell/BarActions.js.map +1 -1
- package/dist/appShell/BarCapsule.js +3 -2
- package/dist/appShell/BarCapsule.js.map +1 -1
- package/dist/appShell/BarSearch.js +3 -2
- package/dist/appShell/BarSearch.js.map +1 -1
- package/dist/appShell/HeaderTools.js +3 -2
- package/dist/appShell/HeaderTools.js.map +1 -1
- package/dist/appShell/MobileTabBar.js +3 -2
- package/dist/appShell/MobileTabBar.js.map +1 -1
- package/dist/appShell/SettingsMenu.js +3 -2
- package/dist/appShell/SettingsMenu.js.map +1 -1
- package/dist/appShell/SideMenu.js +3 -2
- package/dist/appShell/SideMenu.js.map +1 -1
- package/dist/appShell/SideMenuEntry.js +3 -2
- package/dist/appShell/SideMenuEntry.js.map +1 -1
- package/dist/appShell/SubmenuActionsMenu.js +3 -2
- package/dist/appShell/SubmenuActionsMenu.js.map +1 -1
- package/dist/appShell/TabBarEditor.js +3 -2
- package/dist/appShell/TabBarEditor.js.map +1 -1
- package/dist/appShell/TopMenu.js +3 -2
- package/dist/appShell/TopMenu.js.map +1 -1
- package/dist/appShell/Wordmark.js +3 -2
- package/dist/appShell/Wordmark.js.map +1 -1
- package/dist/auth/PasswordChecklist.js +3 -2
- package/dist/auth/PasswordChecklist.js.map +1 -1
- package/dist/calendar/EventCalendar.js +3 -2
- package/dist/calendar/EventCalendar.js.map +1 -1
- package/dist/calendar/EventDetails.js +3 -2
- package/dist/calendar/EventDetails.js.map +1 -1
- package/dist/date-pickers.js +28 -2
- package/dist/date-pickers.js.map +1 -1
- package/dist/datePickers/DateInput.js +41 -54
- package/dist/datePickers/DateInput.js.map +1 -1
- package/dist/datePickers/DateTimeInput.js +81 -0
- package/dist/datePickers/DateTimeInput.js.map +1 -0
- package/dist/datePickers/FormDateTimeField.js +12 -0
- package/dist/datePickers/FormDateTimeField.js.map +1 -0
- package/dist/datePickers/FormMonthField.js +12 -0
- package/dist/datePickers/FormMonthField.js.map +1 -0
- package/dist/datePickers/FormTimeField.js +12 -0
- package/dist/datePickers/FormTimeField.js.map +1 -0
- package/dist/datePickers/MonthInput.js +64 -0
- package/dist/datePickers/MonthInput.js.map +1 -0
- package/dist/datePickers/PickerFrame.js +27 -0
- package/dist/datePickers/PickerFrame.js.map +1 -0
- package/dist/datePickers/TimeInput.js +61 -0
- package/dist/datePickers/TimeInput.js.map +1 -0
- package/dist/datePickers/dateTimeRules.js +24 -0
- package/dist/datePickers/dateTimeRules.js.map +1 -0
- package/dist/datePickers/pickerValues.js +106 -0
- package/dist/datePickers/pickerValues.js.map +1 -0
- package/dist/datePickers/useCurrentMinute.js +28 -0
- package/dist/datePickers/useCurrentMinute.js.map +1 -0
- package/dist/datePickers/usePickerField.js +23 -0
- package/dist/datePickers/usePickerField.js.map +1 -0
- package/dist/dictionaries/dictionaries.js +3 -1
- package/dist/dictionaries/dictionaries.js.map +1 -1
- package/dist/downloads/DownloadManager.js +3 -2
- package/dist/downloads/DownloadManager.js.map +1 -1
- package/dist/feedback/ConfirmDialog.js +3 -2
- package/dist/feedback/ConfirmDialog.js.map +1 -1
- package/dist/feedback/ModalWaiting.js +3 -2
- package/dist/feedback/ModalWaiting.js.map +1 -1
- package/dist/feedback/NewBuildNotice.js +3 -2
- package/dist/feedback/NewBuildNotice.js.map +1 -1
- package/dist/filepond/FileDropzone.js +3 -2
- package/dist/filepond/FileDropzone.js.map +1 -1
- package/dist/forms/FormAttachmentsField.js +12 -0
- package/dist/forms/FormAttachmentsField.js.map +1 -0
- package/dist/forms/FormCheckboxGroupField.js +12 -0
- package/dist/forms/FormCheckboxGroupField.js.map +1 -0
- package/dist/forms/FormFileField.js +12 -0
- package/dist/forms/FormFileField.js.map +1 -0
- package/dist/forms/FormFileUploadField.js +12 -0
- package/dist/forms/FormFileUploadField.js.map +1 -0
- package/dist/forms/FormImageField.js +12 -0
- package/dist/forms/FormImageField.js.map +1 -0
- package/dist/forms/FormMaskedField.js +12 -0
- package/dist/forms/FormMaskedField.js.map +1 -0
- package/dist/forms/FormProblemAlert.js +3 -2
- package/dist/forms/FormProblemAlert.js.map +1 -1
- package/dist/forms/FormRepeatingFields.js +54 -0
- package/dist/forms/FormRepeatingFields.js.map +1 -0
- package/dist/forms/FormTransferListField.js +12 -0
- package/dist/forms/FormTransferListField.js.map +1 -0
- package/dist/forms/SubmitButton.js +7 -2
- package/dist/forms/SubmitButton.js.map +1 -1
- package/dist/forms/applyServerProblem.js +10 -3
- package/dist/forms/applyServerProblem.js.map +1 -1
- package/dist/forms/auth/SignInForm.js +3 -2
- package/dist/forms/auth/SignInForm.js.map +1 -1
- package/dist/forms/fieldRules.js +30 -0
- package/dist/forms/fieldRules.js.map +1 -0
- package/dist/forms/listRules.js +111 -0
- package/dist/forms/listRules.js.map +1 -0
- package/dist/forms/security/SecondStepForm.js +3 -2
- package/dist/forms/security/SecondStepForm.js.map +1 -1
- package/dist/forms/security/TwoStepVerificationCard.js +3 -2
- package/dist/forms/security/TwoStepVerificationCard.js.map +1 -1
- package/dist/forms/serverProblemFields.js +17 -0
- package/dist/forms/serverProblemFields.js.map +1 -1
- package/dist/forms/useValidationText.js +18 -0
- package/dist/forms/useValidationText.js.map +1 -0
- package/dist/forms/validation.js +35 -31
- package/dist/forms/validation.js.map +1 -1
- package/dist/forms/validationMessages.js +64 -7
- package/dist/forms/validationMessages.js.map +1 -1
- package/dist/forms.js +54 -29
- package/dist/forms.js.map +1 -1
- package/dist/hookForm/FormAttachmentsField.js +12 -0
- package/dist/hookForm/FormAttachmentsField.js.map +1 -0
- package/dist/hookForm/FormCheckboxGroupField.js +12 -0
- package/dist/hookForm/FormCheckboxGroupField.js.map +1 -0
- package/dist/hookForm/FormFileField.js +12 -0
- package/dist/hookForm/FormFileField.js.map +1 -0
- package/dist/hookForm/FormFileUploadField.js +12 -0
- package/dist/hookForm/FormFileUploadField.js.map +1 -0
- package/dist/hookForm/FormImageField.js +12 -0
- package/dist/hookForm/FormImageField.js.map +1 -0
- package/dist/hookForm/FormMaskedField.js +12 -0
- package/dist/hookForm/FormMaskedField.js.map +1 -0
- package/dist/hookForm/FormProblemAlert.js +3 -2
- package/dist/hookForm/FormProblemAlert.js.map +1 -1
- package/dist/hookForm/FormRepeatingFields.js +44 -0
- package/dist/hookForm/FormRepeatingFields.js.map +1 -0
- package/dist/hookForm/FormTransferListField.js +12 -0
- package/dist/hookForm/FormTransferListField.js.map +1 -0
- package/dist/hookForm/SubmitButton.js +7 -2
- package/dist/hookForm/SubmitButton.js.map +1 -1
- package/dist/hookForm/applyServerProblem.js +8 -3
- package/dist/hookForm/applyServerProblem.js.map +1 -1
- package/dist/inbox/InboxLayout.js +3 -2
- package/dist/inbox/InboxLayout.js.map +1 -1
- package/dist/inbox/MessageList.js +3 -2
- package/dist/inbox/MessageList.js.map +1 -1
- package/dist/inbox/MessageView.js +3 -2
- package/dist/inbox/MessageView.js.map +1 -1
- package/dist/index.js +235 -124
- package/dist/index.js.map +1 -1
- package/dist/inputs/CatalogInput.js +103 -29
- package/dist/inputs/CatalogInput.js.map +1 -1
- package/dist/inputs/CheckboxGroupInput.js +103 -0
- package/dist/inputs/CheckboxGroupInput.js.map +1 -0
- package/dist/inputs/ColorInput.js +7 -4
- package/dist/inputs/ColorInput.js.map +1 -1
- package/dist/inputs/FieldFrame.js +10 -4
- package/dist/inputs/FieldFrame.js.map +1 -1
- package/dist/inputs/FormSection.js +1 -1
- package/dist/inputs/MaskedInput.js +87 -0
- package/dist/inputs/MaskedInput.js.map +1 -0
- package/dist/inputs/NumberInput.js +41 -25
- package/dist/inputs/NumberInput.js.map +1 -1
- package/dist/inputs/RepeatingFields.js +180 -0
- package/dist/inputs/RepeatingFields.js.map +1 -0
- package/dist/inputs/SelectInput.js +50 -9
- package/dist/inputs/SelectInput.js.map +1 -1
- package/dist/inputs/TextInput.js +5 -3
- package/dist/inputs/TextInput.js.map +1 -1
- package/dist/inputs/TransferListInput.js +218 -0
- package/dist/inputs/TransferListInput.js.map +1 -0
- package/dist/inputs/WizardLayout.js +3 -2
- package/dist/inputs/WizardLayout.js.map +1 -1
- package/dist/inputs/inputMasks.js +84 -0
- package/dist/inputs/inputMasks.js.map +1 -0
- package/dist/inputs/selectAllState.js +20 -0
- package/dist/inputs/selectAllState.js.map +1 -0
- package/dist/inputs/useRowKeys.js +26 -0
- package/dist/inputs/useRowKeys.js.map +1 -0
- package/dist/kanban/KanbanBoard.js +3 -2
- package/dist/kanban/KanbanBoard.js.map +1 -1
- package/dist/legal/CookieNotice.js +80 -0
- package/dist/legal/CookieNotice.js.map +1 -0
- package/dist/legal/TermsAcceptanceDialog.js +130 -0
- package/dist/legal/TermsAcceptanceDialog.js.map +1 -0
- package/dist/legal/consentStorage.js +18 -0
- package/dist/legal/consentStorage.js.map +1 -0
- package/dist/legal/useCookieConsent.js +17 -0
- package/dist/legal/useCookieConsent.js.map +1 -0
- package/dist/locales/en.js +257 -1
- package/dist/locales/en.js.map +1 -1
- package/dist/locales/es.js +257 -1
- package/dist/locales/es.js.map +1 -1
- package/dist/maps/MapView.js +3 -2
- package/dist/maps/MapView.js.map +1 -1
- package/dist/mexico/CfdiSummary.js +82 -0
- package/dist/mexico/CfdiSummary.js.map +1 -0
- package/dist/mexico/EfirmaFields.js +168 -0
- package/dist/mexico/EfirmaFields.js.map +1 -0
- package/dist/mexico/certificateReader.js +79 -0
- package/dist/mexico/certificateReader.js.map +1 -0
- package/dist/mexico/cfdiReader.js +81 -0
- package/dist/mexico/cfdiReader.js.map +1 -0
- package/dist/mexico/derReader.js +81 -0
- package/dist/mexico/derReader.js.map +1 -0
- package/dist/mexico/efirmaKey.js +51 -0
- package/dist/mexico/efirmaKey.js.map +1 -0
- package/dist/mexico/mexicoIdentifiers.js +91 -0
- package/dist/mexico/mexicoIdentifiers.js.map +1 -0
- package/dist/mexico/mexicoRules.js +21 -0
- package/dist/mexico/mexicoRules.js.map +1 -0
- package/dist/mexico.js +34 -0
- package/dist/mexico.js.map +1 -0
- package/dist/pwa/InstallAppSetting.js +3 -2
- package/dist/pwa/InstallAppSetting.js.map +1 -1
- package/dist/pwa/InstallInstructionsDialog.js +3 -2
- package/dist/pwa/InstallInstructionsDialog.js.map +1 -1
- package/dist/pwa/InstallPromptBanner.js +3 -2
- package/dist/pwa/InstallPromptBanner.js.map +1 -1
- package/dist/react-hook-form.js +43 -17
- package/dist/react-hook-form.js.map +1 -1
- package/dist/rich-text.js +19 -0
- package/dist/rich-text.js.map +1 -0
- package/dist/richText/FormRichTextField.js +12 -0
- package/dist/richText/FormRichTextField.js.map +1 -0
- package/dist/richText/RichTextEditor.js +111 -0
- package/dist/richText/RichTextEditor.js.map +1 -0
- package/dist/richText/RichTextLinkPopover.js +57 -0
- package/dist/richText/RichTextLinkPopover.js.map +1 -0
- package/dist/richText/RichTextToolbar.js +189 -0
- package/dist/richText/RichTextToolbar.js.map +1 -0
- package/dist/richText/RichTextView.js +27 -0
- package/dist/richText/RichTextView.js.map +1 -0
- package/dist/richText/richTextContentSx.js +42 -0
- package/dist/richText/richTextContentSx.js.map +1 -0
- package/dist/richText/richTextExtensions.js +44 -0
- package/dist/richText/richTextExtensions.js.map +1 -0
- package/dist/richText/richTextRules.js +46 -0
- package/dist/richText/richTextRules.js.map +1 -0
- package/dist/security/ActivityLog.js +3 -2
- package/dist/security/ActivityLog.js.map +1 -1
- package/dist/security/RecoveryCodesDialog.js +3 -2
- package/dist/security/RecoveryCodesDialog.js.map +1 -1
- package/dist/security/SessionsCard.js +3 -2
- package/dist/security/SessionsCard.js.map +1 -1
- package/dist/table.js +23 -2
- package/dist/table.js.map +1 -1
- package/dist/theme/components/glassComponents.js +27 -0
- package/dist/theme/components/glassComponents.js.map +1 -1
- package/dist/theme/components/minimalComponents.js +12 -0
- package/dist/theme/components/minimalComponents.js.map +1 -1
- package/dist/theme/themePieces.js +70 -4
- package/dist/theme/themePieces.js.map +1 -1
- package/dist/toolkit/ToolkitProvider.js +8 -1
- package/dist/toolkit/ToolkitProvider.js.map +1 -1
- package/dist/toolkit/browserNavigation.js +19 -4
- package/dist/toolkit/browserNavigation.js.map +1 -1
- package/dist/toolkit/combineTexts.js +32 -0
- package/dist/toolkit/combineTexts.js.map +1 -0
- package/dist/toolkit/hashNavigation.js +17 -3
- package/dist/toolkit/hashNavigation.js.map +1 -1
- package/dist/toolkit/navigationPaths.js +15 -0
- package/dist/toolkit/navigationPaths.js.map +1 -1
- package/dist/toolkit/pathIndex.js +66 -0
- package/dist/toolkit/pathIndex.js.map +1 -0
- package/dist/toolkit/toolkitSettings.js +19 -1
- package/dist/toolkit/toolkitSettings.js.map +1 -1
- package/dist/types/DataTable/AuditTrailDialog.d.ts +6 -17
- package/dist/types/DataTable/ColumnFilters/HeaderFilterPopover.d.ts +6 -5
- package/dist/types/DataTable/ColumnFilters/MultiSelectColumnFilter.d.ts +6 -9
- package/dist/types/DataTable/ColumnFilters/SortableFilterHeader.d.ts +6 -14
- package/dist/types/DataTable/EmptyState.d.ts +6 -9
- package/dist/types/DataTable/FilterChips.d.ts +6 -11
- package/dist/types/DataTable/GoToPage.d.ts +6 -9
- package/dist/types/DataTable/ServerTable.d.ts +16 -80
- package/dist/types/DataTable/ServerTableFilterDrawer.d.ts +14 -0
- package/dist/types/DataTable/StackedCell.d.ts +12 -0
- package/dist/types/DataTable/TableCardsView.d.ts +27 -0
- package/dist/types/DataTable/columnWidths.d.ts +21 -0
- package/dist/types/DataTable/columns.d.ts +111 -0
- package/dist/types/DataTable/filterContext.d.ts +2 -1
- package/dist/types/DataTable/fixedColumns.d.ts +29 -0
- package/dist/types/DataTable/goToPageOptions.d.ts +15 -0
- package/dist/types/DataTable/index.d.ts +7 -1
- package/dist/types/DataTable/useTableView.d.ts +22 -0
- package/dist/types/access/PermissionMatrix.d.ts +6 -10
- package/dist/types/account/AccountSecuritySection.d.ts +6 -7
- package/dist/types/account/DemoTotpCodeButton.d.ts +6 -5
- package/dist/types/account/ProfileScreen.d.ts +6 -18
- package/dist/types/account/SignInScreen.d.ts +6 -13
- package/dist/types/appShell/AccountMenu.d.ts +6 -11
- package/dist/types/appShell/AppLayout.d.ts +3 -40
- package/dist/types/appShell/AppearanceSettings.d.ts +6 -12
- package/dist/types/appShell/AuthLayout.d.ts +3 -11
- package/dist/types/appShell/BarActionButton.d.ts +6 -10
- package/dist/types/appShell/BarActions.d.ts +6 -15
- package/dist/types/appShell/BarCapsule.d.ts +6 -9
- package/dist/types/appShell/BarSearch.d.ts +6 -15
- package/dist/types/appShell/HeaderTools.d.ts +6 -16
- package/dist/types/appShell/MobileTabBar.d.ts +6 -13
- package/dist/types/appShell/SettingsMenu.d.ts +6 -10
- package/dist/types/appShell/SideMenu.d.ts +6 -20
- package/dist/types/appShell/SideMenuEntry.d.ts +6 -11
- package/dist/types/appShell/SubmenuActionsMenu.d.ts +6 -12
- package/dist/types/appShell/TabBarEditor.d.ts +6 -9
- package/dist/types/appShell/TopMenu.d.ts +6 -5
- package/dist/types/appShell/Wordmark.d.ts +6 -7
- package/dist/types/auth/PasswordChecklist.d.ts +6 -9
- package/dist/types/calendar/EventCalendar.d.ts +6 -23
- package/dist/types/calendar/EventDetails.d.ts +6 -10
- package/dist/types/date-pickers.d.ts +10 -1
- package/dist/types/datePickers/DateInput.d.ts +10 -23
- package/dist/types/datePickers/DateTimeInput.d.ts +30 -0
- package/dist/types/datePickers/FormDateTimeField.d.ts +7 -0
- package/dist/types/datePickers/FormMonthField.d.ts +7 -0
- package/dist/types/datePickers/FormTimeField.d.ts +7 -0
- package/dist/types/datePickers/MonthInput.d.ts +25 -0
- package/dist/types/datePickers/PickerFrame.d.ts +22 -0
- package/dist/types/datePickers/TimeInput.d.ts +24 -0
- package/dist/types/datePickers/dateTimeRules.d.ts +31 -0
- package/dist/types/datePickers/pickerValues.d.ts +114 -0
- package/dist/types/datePickers/useCurrentMinute.d.ts +5 -0
- package/dist/types/datePickers/usePickerField.d.ts +28 -0
- package/dist/types/dictionaries/dictionaries.d.ts +6 -3
- package/dist/types/downloads/DownloadManager.d.ts +6 -6
- package/dist/types/feedback/ConfirmDialog.d.ts +6 -18
- package/dist/types/feedback/ModalWaiting.d.ts +6 -9
- package/dist/types/feedback/NewBuildNotice.d.ts +6 -10
- package/dist/types/filepond/FileDropzone.d.ts +6 -29
- package/dist/types/forms/FormAttachmentsField.d.ts +7 -0
- package/dist/types/forms/FormCheckboxGroupField.d.ts +7 -0
- package/dist/types/forms/FormFileField.d.ts +7 -0
- package/dist/types/forms/FormFileUploadField.d.ts +7 -0
- package/dist/types/forms/FormImageField.d.ts +7 -0
- package/dist/types/forms/FormMaskedField.d.ts +7 -0
- package/dist/types/forms/FormProblemAlert.d.ts +6 -5
- package/dist/types/forms/FormRepeatingFields.d.ts +25 -0
- package/dist/types/forms/FormTransferListField.d.ts +7 -0
- package/dist/types/forms/SubmitButton.d.ts +6 -6
- package/dist/types/forms/auth/SignInForm.d.ts +6 -11
- package/dist/types/forms/fieldRules.d.ts +44 -0
- package/dist/types/forms/index.d.ts +11 -1
- package/dist/types/forms/listRules.d.ts +48 -0
- package/dist/types/forms/security/SecondStepForm.d.ts +6 -14
- package/dist/types/forms/security/TwoStepVerificationCard.d.ts +6 -21
- package/dist/types/forms/serverProblemFields.d.ts +13 -0
- package/dist/types/forms/useValidationText.d.ts +12 -0
- package/dist/types/forms/validation.d.ts +117 -174
- package/dist/types/forms/validationMessages.d.ts +54 -6
- package/dist/types/forms.d.ts +1 -1
- package/dist/types/hookForm/FormAttachmentsField.d.ts +8 -0
- package/dist/types/hookForm/FormCheckboxGroupField.d.ts +8 -0
- package/dist/types/hookForm/FormFileField.d.ts +8 -0
- package/dist/types/hookForm/FormFileUploadField.d.ts +8 -0
- package/dist/types/hookForm/FormImageField.d.ts +8 -0
- package/dist/types/hookForm/FormMaskedField.d.ts +9 -0
- package/dist/types/hookForm/FormProblemAlert.d.ts +6 -5
- package/dist/types/hookForm/FormRepeatingFields.d.ts +27 -0
- package/dist/types/hookForm/FormTransferListField.d.ts +8 -0
- package/dist/types/hookForm/SubmitButton.d.ts +6 -13
- package/dist/types/inbox/InboxLayout.d.ts +6 -17
- package/dist/types/inbox/MessageList.d.ts +6 -18
- package/dist/types/inbox/MessageView.d.ts +6 -14
- package/dist/types/index.d.ts +33 -4
- package/dist/types/inputs/CatalogInput.d.ts +10 -21
- package/dist/types/inputs/CheckboxGroupInput.d.ts +28 -0
- package/dist/types/inputs/ColorInput.d.ts +7 -16
- package/dist/types/inputs/FieldFrame.d.ts +6 -10
- package/dist/types/inputs/MaskedInput.d.ts +38 -0
- package/dist/types/inputs/NumberInput.d.ts +7 -20
- package/dist/types/inputs/RepeatingFields.d.ts +31 -0
- package/dist/types/inputs/SelectInput.d.ts +10 -18
- package/dist/types/inputs/TextInput.d.ts +3 -0
- package/dist/types/inputs/TransferListInput.d.ts +30 -0
- package/dist/types/inputs/WizardLayout.d.ts +6 -19
- package/dist/types/inputs/inputMasks.d.ts +52 -0
- package/dist/types/inputs/selectAllState.d.ts +11 -0
- package/dist/types/inputs/useRowKeys.d.ts +11 -0
- package/dist/types/kanban/KanbanBoard.d.ts +6 -25
- package/dist/types/legal/CookieNotice.d.ts +20 -0
- package/dist/types/legal/TermsAcceptanceDialog.d.ts +20 -0
- package/dist/types/legal/consentStorage.d.ts +16 -0
- package/dist/types/legal/useCookieConsent.d.ts +13 -0
- package/dist/types/locales/en.d.ts +256 -0
- package/dist/types/locales/es.d.ts +256 -0
- package/dist/types/maps/MapView.d.ts +6 -17
- package/dist/types/mexico/CfdiSummary.d.ts +12 -0
- package/dist/types/mexico/EfirmaFields.d.ts +28 -0
- package/dist/types/mexico/certificateReader.d.ts +37 -0
- package/dist/types/mexico/cfdiReader.d.ts +95 -0
- package/dist/types/mexico/derReader.d.ts +54 -0
- package/dist/types/mexico/efirmaKey.d.ts +26 -0
- package/dist/types/mexico/mexicoIdentifiers.d.ts +68 -0
- package/dist/types/mexico/mexicoRules.d.ts +45 -0
- package/dist/types/mexico.d.ts +11 -0
- package/dist/types/pwa/InstallAppSetting.d.ts +6 -6
- package/dist/types/pwa/InstallInstructionsDialog.d.ts +6 -9
- package/dist/types/pwa/InstallPromptBanner.d.ts +6 -11
- package/dist/types/react-hook-form.d.ts +11 -1
- package/dist/types/rich-text.d.ts +5 -0
- package/dist/types/richText/FormRichTextField.d.ts +7 -0
- package/dist/types/richText/RichTextEditor.d.ts +27 -0
- package/dist/types/richText/RichTextLinkPopover.d.ts +17 -0
- package/dist/types/richText/RichTextToolbar.d.ts +15 -0
- package/dist/types/richText/RichTextView.d.ts +10 -0
- package/dist/types/richText/richTextContentSx.d.ts +7 -0
- package/dist/types/richText/richTextExtensions.d.ts +15 -0
- package/dist/types/richText/richTextRules.d.ts +41 -0
- package/dist/types/security/ActivityLog.d.ts +6 -9
- package/dist/types/security/RecoveryCodesDialog.d.ts +6 -11
- package/dist/types/security/SessionsCard.d.ts +6 -11
- package/dist/types/table.d.ts +3 -1
- package/dist/types/theme/themePieces.d.ts +55 -3
- package/dist/types/toolkit/ToolkitProvider.d.ts +13 -1
- package/dist/types/toolkit/browserNavigation.d.ts +7 -3
- package/dist/types/toolkit/combineTexts.d.ts +6 -0
- package/dist/types/toolkit/hashNavigation.d.ts +4 -2
- package/dist/types/toolkit/navigationPaths.d.ts +35 -0
- package/dist/types/toolkit/pathIndex.d.ts +27 -0
- package/dist/types/toolkit/toolkitSettings.d.ts +7 -4
- package/dist/types/ui/actions/ActionsMenu.d.ts +24 -11
- package/dist/types/ui/actions/CopyButton.d.ts +8 -11
- package/dist/types/ui/actions/DownloadMenu.d.ts +6 -29
- package/dist/types/ui/actions/SecretField.d.ts +6 -11
- package/dist/types/ui/actions/SelectionActions.d.ts +6 -13
- package/dist/types/ui/actions/tableRowText.d.ts +6 -0
- package/dist/types/ui/cards/RecordCard.d.ts +40 -0
- package/dist/types/ui/cards/RecordCardSkeleton.d.ts +12 -0
- package/dist/types/ui/countdown/Countdown.d.ts +22 -0
- package/dist/types/ui/countdown/countdownParts.d.ts +39 -0
- package/dist/types/ui/countdown/useCountdown.d.ts +14 -0
- package/dist/types/ui/documents/PdfViewerDialog.d.ts +14 -0
- package/dist/types/ui/filters/DateRangeFilter.d.ts +6 -10
- package/dist/types/ui/filters/FilterDrawer.d.ts +23 -0
- package/dist/types/ui/filters/PeriodRangeSelector.d.ts +6 -13
- package/dist/types/ui/filters/QuickFilters.d.ts +6 -12
- package/dist/types/ui/filters/filterDrawerFields.d.ts +139 -0
- package/dist/types/ui/help/HelpButton.d.ts +11 -0
- package/dist/types/ui/help/HelpCarouselDialog.d.ts +27 -0
- package/dist/types/ui/help/useHelpCarousel.d.ts +21 -0
- package/dist/types/ui/index.d.ts +10 -0
- package/dist/types/ui/labels/IconBadge.d.ts +34 -0
- package/dist/types/ui/labels/MarkedText.d.ts +10 -0
- package/dist/types/ui/labels/Tag.d.ts +6 -12
- package/dist/types/ui/labels/markedTextPieces.d.ts +22 -0
- package/dist/types/ui/layout/CollapsibleSection.d.ts +6 -12
- package/dist/types/ui/layout/ContentDialog.d.ts +6 -10
- package/dist/types/ui/layout/DefinitionList.d.ts +6 -9
- package/dist/types/ui/layout/DetailHeader.d.ts +6 -10
- package/dist/types/ui/layout/ErrorPage.d.ts +6 -17
- package/dist/types/ui/layout/FullPageLoader.d.ts +6 -6
- package/dist/types/ui/layout/GlassPanel.d.ts +6 -8
- package/dist/types/ui/layout/PageHeader.d.ts +6 -10
- package/dist/types/ui/layout/PageHeading.d.ts +6 -11
- package/dist/types/ui/layout/ProfileHeader.d.ts +6 -11
- package/dist/types/ui/layout/ScrollableRow.d.ts +6 -13
- package/dist/types/ui/layout/SectionCard.d.ts +6 -8
- package/dist/types/ui/metrics/BarList.d.ts +6 -12
- package/dist/types/ui/metrics/CalendarHeatmap.d.ts +6 -19
- package/dist/types/ui/metrics/ChartTooltip.d.ts +6 -6
- package/dist/types/ui/metrics/ColumnChart.d.ts +6 -25
- package/dist/types/ui/metrics/LineChart.d.ts +6 -20
- package/dist/types/ui/metrics/MetricCard.d.ts +6 -17
- package/dist/types/ui/metrics/TableToggle.d.ts +6 -6
- package/dist/types/ui/metrics/chartParts.d.ts +15 -30
- package/dist/types/ui/navigation/BackButton.d.ts +6 -9
- package/dist/types/ui/navigation/ColorSchemeToggle.d.ts +6 -9
- package/dist/types/ui/navigation/FontSizeToggle.d.ts +6 -8
- package/dist/types/ui/navigation/LanguageToggle.d.ts +6 -8
- package/dist/types/ui/navigation/PageBreadcrumbs.d.ts +6 -7
- package/dist/types/ui/navigation/RouteTabs.d.ts +39 -0
- package/dist/types/ui/navigation/routeTabMatching.d.ts +27 -0
- package/dist/types/ui/timeline/GroupedTimeline.d.ts +6 -23
- package/dist/types/upload/AttachmentsInput.d.ts +72 -0
- package/dist/types/upload/FileChip.d.ts +18 -0
- package/dist/types/upload/FileDropzone.d.ts +7 -19
- package/dist/types/upload/FileInput.d.ts +31 -0
- package/dist/types/upload/FileUploadInput.d.ts +56 -0
- package/dist/types/upload/ImageInput.d.ts +35 -0
- package/dist/types/upload/TemplateDownloadButton.d.ts +27 -0
- package/dist/types/upload/fileAppearance.d.ts +8 -0
- package/dist/types/upload/fileRules.d.ts +38 -0
- package/dist/types/upload/transferProgress.d.ts +18 -0
- package/dist/types/upload/uploadMachine.d.ts +6 -2
- package/dist/types/upload/uploadWithProgress.d.ts +6 -2
- package/dist/types/upload/useFilePicker.d.ts +39 -0
- package/dist/ui/actions/ActionsMenu.js +109 -17
- package/dist/ui/actions/ActionsMenu.js.map +1 -1
- package/dist/ui/actions/CopyButton.js +37 -12
- package/dist/ui/actions/CopyButton.js.map +1 -1
- package/dist/ui/actions/DownloadMenu.js +3 -2
- package/dist/ui/actions/DownloadMenu.js.map +1 -1
- package/dist/ui/actions/SecretField.js +8 -3
- package/dist/ui/actions/SecretField.js.map +1 -1
- package/dist/ui/actions/SelectionActions.js +3 -2
- package/dist/ui/actions/SelectionActions.js.map +1 -1
- package/dist/ui/actions/tableRowText.js +7 -0
- package/dist/ui/actions/tableRowText.js.map +1 -0
- package/dist/ui/cards/RecordCard.js +146 -0
- package/dist/ui/cards/RecordCard.js.map +1 -0
- package/dist/ui/cards/RecordCardSkeleton.js +38 -0
- package/dist/ui/cards/RecordCardSkeleton.js.map +1 -0
- package/dist/ui/countdown/Countdown.js +39 -0
- package/dist/ui/countdown/Countdown.js.map +1 -0
- package/dist/ui/countdown/countdownParts.js +34 -0
- package/dist/ui/countdown/countdownParts.js.map +1 -0
- package/dist/ui/countdown/useCountdown.js +35 -0
- package/dist/ui/countdown/useCountdown.js.map +1 -0
- package/dist/ui/documents/PdfViewerDialog.js +82 -0
- package/dist/ui/documents/PdfViewerDialog.js.map +1 -0
- package/dist/ui/filters/DateRangeFilter.js +3 -2
- package/dist/ui/filters/DateRangeFilter.js.map +1 -1
- package/dist/ui/filters/FilterDrawer.js +212 -0
- package/dist/ui/filters/FilterDrawer.js.map +1 -0
- package/dist/ui/filters/PeriodRangeSelector.js +3 -2
- package/dist/ui/filters/PeriodRangeSelector.js.map +1 -1
- package/dist/ui/filters/QuickFilters.js +3 -2
- package/dist/ui/filters/QuickFilters.js.map +1 -1
- package/dist/ui/filters/filterDrawerFields.js +119 -0
- package/dist/ui/filters/filterDrawerFields.js.map +1 -0
- package/dist/ui/help/HelpButton.js +22 -0
- package/dist/ui/help/HelpButton.js.map +1 -0
- package/dist/ui/help/HelpCarouselDialog.js +155 -0
- package/dist/ui/help/HelpCarouselDialog.js.map +1 -0
- package/dist/ui/help/useHelpCarousel.js +25 -0
- package/dist/ui/help/useHelpCarousel.js.map +1 -0
- package/dist/ui/labels/IconBadge.js +82 -0
- package/dist/ui/labels/IconBadge.js.map +1 -0
- package/dist/ui/labels/MarkedText.js +31 -0
- package/dist/ui/labels/MarkedText.js.map +1 -0
- package/dist/ui/labels/Tag.js +3 -2
- package/dist/ui/labels/Tag.js.map +1 -1
- package/dist/ui/labels/markedTextPieces.js +64 -0
- package/dist/ui/labels/markedTextPieces.js.map +1 -0
- package/dist/ui/layout/CollapsibleSection.js +3 -2
- package/dist/ui/layout/CollapsibleSection.js.map +1 -1
- package/dist/ui/layout/ContentDialog.js +3 -2
- package/dist/ui/layout/ContentDialog.js.map +1 -1
- package/dist/ui/layout/DefinitionList.js +3 -2
- package/dist/ui/layout/DefinitionList.js.map +1 -1
- package/dist/ui/layout/DetailHeader.js +3 -2
- package/dist/ui/layout/DetailHeader.js.map +1 -1
- package/dist/ui/layout/ErrorPage.js +3 -2
- package/dist/ui/layout/ErrorPage.js.map +1 -1
- package/dist/ui/layout/FullPageLoader.js +3 -2
- package/dist/ui/layout/FullPageLoader.js.map +1 -1
- package/dist/ui/layout/GlassPanel.js +3 -2
- package/dist/ui/layout/GlassPanel.js.map +1 -1
- package/dist/ui/layout/PageHeader.js +3 -2
- package/dist/ui/layout/PageHeader.js.map +1 -1
- package/dist/ui/layout/PageHeading.js +3 -2
- package/dist/ui/layout/PageHeading.js.map +1 -1
- package/dist/ui/layout/ProfileHeader.js +3 -2
- package/dist/ui/layout/ProfileHeader.js.map +1 -1
- package/dist/ui/layout/ScrollableRow.js +3 -2
- package/dist/ui/layout/ScrollableRow.js.map +1 -1
- package/dist/ui/layout/SectionCard.js +3 -2
- package/dist/ui/layout/SectionCard.js.map +1 -1
- package/dist/ui/metrics/BarList.js +3 -2
- package/dist/ui/metrics/BarList.js.map +1 -1
- package/dist/ui/metrics/CalendarHeatmap.js +3 -2
- package/dist/ui/metrics/CalendarHeatmap.js.map +1 -1
- package/dist/ui/metrics/ChartTooltip.js +3 -2
- package/dist/ui/metrics/ChartTooltip.js.map +1 -1
- package/dist/ui/metrics/ColumnChart.js +3 -2
- package/dist/ui/metrics/ColumnChart.js.map +1 -1
- package/dist/ui/metrics/LineChart.js +3 -2
- package/dist/ui/metrics/LineChart.js.map +1 -1
- package/dist/ui/metrics/MetricCard.js +3 -2
- package/dist/ui/metrics/MetricCard.js.map +1 -1
- package/dist/ui/metrics/TableToggle.js +3 -2
- package/dist/ui/metrics/TableToggle.js.map +1 -1
- package/dist/ui/metrics/chartParts.js +7 -4
- package/dist/ui/metrics/chartParts.js.map +1 -1
- package/dist/ui/navigation/BackButton.js +7 -2
- package/dist/ui/navigation/BackButton.js.map +1 -1
- package/dist/ui/navigation/ColorSchemeToggle.js +3 -2
- package/dist/ui/navigation/ColorSchemeToggle.js.map +1 -1
- package/dist/ui/navigation/FontSizeToggle.js +3 -2
- package/dist/ui/navigation/FontSizeToggle.js.map +1 -1
- package/dist/ui/navigation/LanguageToggle.js +3 -2
- package/dist/ui/navigation/LanguageToggle.js.map +1 -1
- package/dist/ui/navigation/PageBreadcrumbs.js +3 -2
- package/dist/ui/navigation/PageBreadcrumbs.js.map +1 -1
- package/dist/ui/navigation/RouteTabs.js +79 -0
- package/dist/ui/navigation/RouteTabs.js.map +1 -0
- package/dist/ui/navigation/routeTabMatching.js +23 -0
- package/dist/ui/navigation/routeTabMatching.js.map +1 -0
- package/dist/ui/timeline/GroupedTimeline.js +3 -2
- package/dist/ui/timeline/GroupedTimeline.js.map +1 -1
- package/dist/upload/AttachmentsInput.js +130 -0
- package/dist/upload/AttachmentsInput.js.map +1 -0
- package/dist/upload/FileChip.js +28 -0
- package/dist/upload/FileChip.js.map +1 -0
- package/dist/upload/FileDropzone.js +23 -87
- package/dist/upload/FileDropzone.js.map +1 -1
- package/dist/upload/FileInput.js +115 -0
- package/dist/upload/FileInput.js.map +1 -0
- package/dist/upload/FileUploadInput.js +288 -0
- package/dist/upload/FileUploadInput.js.map +1 -0
- package/dist/upload/ImageInput.js +128 -0
- package/dist/upload/ImageInput.js.map +1 -0
- package/dist/upload/TemplateDownloadButton.js +68 -0
- package/dist/upload/TemplateDownloadButton.js.map +1 -0
- package/dist/upload/fileAppearance.js +21 -0
- package/dist/upload/fileAppearance.js.map +1 -0
- package/dist/upload/fileRules.js +27 -1
- package/dist/upload/fileRules.js.map +1 -1
- package/dist/upload/transferProgress.js +23 -0
- package/dist/upload/transferProgress.js.map +1 -0
- package/dist/upload/uploadMachine.js +8 -8
- package/dist/upload/uploadMachine.js.map +1 -1
- package/dist/upload/uploadWithProgress.js +1 -1
- package/dist/upload/uploadWithProgress.js.map +1 -1
- package/dist/upload/useFilePicker.js +101 -0
- package/dist/upload/useFilePicker.js.map +1 -0
- package/package.json +44 -1
- package/cli/templates/project/src/app/combineTexts.js.tpl +0 -31
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsxs, jsx } from "react/jsx-runtime";
|
|
3
|
+
import { useId, useState } from "react";
|
|
4
|
+
import Button from "@mui/material/Button";
|
|
5
|
+
import Checkbox from "@mui/material/Checkbox";
|
|
6
|
+
import FormHelperText from "@mui/material/FormHelperText";
|
|
7
|
+
import List from "@mui/material/List";
|
|
8
|
+
import ListItemButton from "@mui/material/ListItemButton";
|
|
9
|
+
import ListItemIcon from "@mui/material/ListItemIcon";
|
|
10
|
+
import ListItemText from "@mui/material/ListItemText";
|
|
11
|
+
import Paper from "@mui/material/Paper";
|
|
12
|
+
import Stack from "@mui/material/Stack";
|
|
13
|
+
import TextField from "@mui/material/TextField";
|
|
14
|
+
import Tooltip from "@mui/material/Tooltip";
|
|
15
|
+
import Typography from "@mui/material/Typography";
|
|
16
|
+
import ChevronLeftRoundedIcon from "@mui/icons-material/ChevronLeftRounded";
|
|
17
|
+
import ChevronRightRoundedIcon from "@mui/icons-material/ChevronRightRounded";
|
|
18
|
+
import KeyboardDoubleArrowLeftRoundedIcon from "@mui/icons-material/KeyboardDoubleArrowLeftRounded";
|
|
19
|
+
import KeyboardDoubleArrowRightRoundedIcon from "@mui/icons-material/KeyboardDoubleArrowRightRounded";
|
|
20
|
+
import { useValidationText } from "../forms/useValidationText.js";
|
|
21
|
+
import FieldFrame from "./FieldFrame.js";
|
|
22
|
+
import { selectAllStateOf } from "./selectAllState.js";
|
|
23
|
+
import { piecePart, withPieceSlots, usePieceProps } from "../theme/themePieces.js";
|
|
24
|
+
import { useToolkitTranslation } from "../toolkit/useToolkitTranslation.js";
|
|
25
|
+
import { warnUnknownProps } from "../toolkit/unknownProps.js";
|
|
26
|
+
const DEFAULT_LIST_HEIGHT = 280;
|
|
27
|
+
const PHONE_ROTATION = Object.freeze({ transform: { xs: "rotate(90deg)", md: "none" } });
|
|
28
|
+
const THEME_NAME = "CalcitaTransferListInput";
|
|
29
|
+
const TransferRoot = piecePart(THEME_NAME, "Root", Stack);
|
|
30
|
+
const TransferList = piecePart(THEME_NAME, "List", Paper);
|
|
31
|
+
const TransferActions = piecePart(THEME_NAME, "Actions", Stack);
|
|
32
|
+
function plainTextOf(text) {
|
|
33
|
+
return String(text ?? "").normalize("NFD").replace(/[̀-ͯ]/g, "").toLowerCase().trim();
|
|
34
|
+
}
|
|
35
|
+
function TransferColumn({ title, items, markedValues, onMark, onMarkMany, onMoveOne, searchable, searchLabel, emptyText, listHeight, disabled, t }) {
|
|
36
|
+
const titleId = useId();
|
|
37
|
+
const [searchText, setSearchText] = useState("");
|
|
38
|
+
const wantedText = plainTextOf(searchText);
|
|
39
|
+
const visibleItems = wantedText ? items.filter((item) => plainTextOf(`${item.label} ${item.description ?? ""}`).includes(wantedText)) : items;
|
|
40
|
+
const visibleValues = visibleItems.filter((item) => !item.disabled).map((item) => item.value);
|
|
41
|
+
const markState = selectAllStateOf(markedValues, visibleValues);
|
|
42
|
+
return /* @__PURE__ */ jsxs(TransferList, { variant: "outlined", ownSx: { flex: 1, minWidth: 0, display: "flex", flexDirection: "column" }, children: [
|
|
43
|
+
/* @__PURE__ */ jsxs(Stack, { direction: "row", sx: { alignItems: "center", gap: 1, px: 1.5, py: 1, borderBottom: 1, borderColor: "divider" }, children: [
|
|
44
|
+
/* @__PURE__ */ jsx(
|
|
45
|
+
Checkbox,
|
|
46
|
+
{
|
|
47
|
+
size: "small",
|
|
48
|
+
sx: { p: 0.5 },
|
|
49
|
+
disabled: disabled || visibleValues.length === 0,
|
|
50
|
+
checked: markState.allChosen,
|
|
51
|
+
indeterminate: markState.someChosen,
|
|
52
|
+
onChange: () => onMarkMany(markState.toggled()),
|
|
53
|
+
slotProps: { input: { "aria-label": t("transfer.markVisible", { list: title }) } }
|
|
54
|
+
}
|
|
55
|
+
),
|
|
56
|
+
/* @__PURE__ */ jsx(Typography, { id: titleId, variant: "subtitle2", sx: { flexGrow: 1 }, children: title }),
|
|
57
|
+
/* @__PURE__ */ jsx(Typography, { variant: "caption", color: "text.secondary", children: markedValues.length > 0 ? t("transfer.markedOf", { marked: markedValues.length, count: items.length }) : items.length })
|
|
58
|
+
] }),
|
|
59
|
+
searchable && /* @__PURE__ */ jsx(
|
|
60
|
+
TextField,
|
|
61
|
+
{
|
|
62
|
+
size: "small",
|
|
63
|
+
type: "search",
|
|
64
|
+
value: searchText,
|
|
65
|
+
onChange: (event) => setSearchText(event.target.value),
|
|
66
|
+
placeholder: searchLabel,
|
|
67
|
+
disabled,
|
|
68
|
+
sx: { m: 1 },
|
|
69
|
+
slotProps: { htmlInput: { "aria-label": `${searchLabel} · ${title}` } }
|
|
70
|
+
}
|
|
71
|
+
),
|
|
72
|
+
/* @__PURE__ */ jsxs(
|
|
73
|
+
List,
|
|
74
|
+
{
|
|
75
|
+
dense: true,
|
|
76
|
+
role: "listbox",
|
|
77
|
+
"aria-labelledby": titleId,
|
|
78
|
+
"aria-multiselectable": "true",
|
|
79
|
+
sx: { height: listHeight, overflowY: "auto", py: 0 },
|
|
80
|
+
children: [
|
|
81
|
+
visibleItems.length === 0 && // vacía de verdad o vacía por lo buscado: no es lo mismo y se dice distinto
|
|
82
|
+
/* @__PURE__ */ jsx(Typography, { variant: "body2", color: "text.secondary", sx: { px: 2, py: 1.5 }, children: items.length > 0 ? t("transfer.noMatches", { text: searchText.trim() }) : emptyText }),
|
|
83
|
+
visibleItems.map((item) => {
|
|
84
|
+
const isMarked = markedValues.includes(item.value);
|
|
85
|
+
return /* @__PURE__ */ jsxs(
|
|
86
|
+
ListItemButton,
|
|
87
|
+
{
|
|
88
|
+
role: "option",
|
|
89
|
+
"aria-selected": isMarked,
|
|
90
|
+
disabled: disabled || item.disabled,
|
|
91
|
+
onClick: () => onMark(item.value),
|
|
92
|
+
onDoubleClick: () => onMoveOne(item.value),
|
|
93
|
+
sx: { py: 0.25 },
|
|
94
|
+
children: [
|
|
95
|
+
/* @__PURE__ */ jsx(ListItemIcon, { sx: { minWidth: 32 }, children: /* @__PURE__ */ jsx(Checkbox, { size: "small", edge: "start", tabIndex: -1, disableRipple: true, checked: isMarked, sx: { p: 0.5 } }) }),
|
|
96
|
+
/* @__PURE__ */ jsx(ListItemText, { primary: item.label, secondary: item.description })
|
|
97
|
+
]
|
|
98
|
+
},
|
|
99
|
+
item.value
|
|
100
|
+
);
|
|
101
|
+
})
|
|
102
|
+
]
|
|
103
|
+
}
|
|
104
|
+
)
|
|
105
|
+
] });
|
|
106
|
+
}
|
|
107
|
+
function TransferListInputContent(props) {
|
|
108
|
+
const {
|
|
109
|
+
name,
|
|
110
|
+
label,
|
|
111
|
+
value,
|
|
112
|
+
onChange,
|
|
113
|
+
onBlur,
|
|
114
|
+
options,
|
|
115
|
+
availableTitle,
|
|
116
|
+
chosenTitle,
|
|
117
|
+
searchable,
|
|
118
|
+
listHeight = DEFAULT_LIST_HEIGHT,
|
|
119
|
+
error,
|
|
120
|
+
helperText = " ",
|
|
121
|
+
disabled = false,
|
|
122
|
+
sx,
|
|
123
|
+
messages,
|
|
124
|
+
texts,
|
|
125
|
+
...unknownProps
|
|
126
|
+
} = usePieceProps(props, THEME_NAME);
|
|
127
|
+
warnUnknownProps(THEME_NAME, unknownProps);
|
|
128
|
+
const { t } = useToolkitTranslation("common", texts);
|
|
129
|
+
const validationTextOf = useValidationText({ name, label, messages });
|
|
130
|
+
const generatedId = useId();
|
|
131
|
+
const inputId = `${name ?? "transfer"}-${generatedId}`;
|
|
132
|
+
const errorText = validationTextOf(error);
|
|
133
|
+
const chosenValues = Array.isArray(value) ? value : [];
|
|
134
|
+
const [markedAvailable, setMarkedAvailable] = useState([]);
|
|
135
|
+
const [markedChosen, setMarkedChosen] = useState([]);
|
|
136
|
+
const available = options.filter((option) => !chosenValues.includes(option.value));
|
|
137
|
+
const chosen = chosenValues.map((chosenValue) => options.find((option) => option.value === chosenValue)).filter(Boolean);
|
|
138
|
+
const isSearchable = searchable ?? options.length > 8;
|
|
139
|
+
const titles = { available: availableTitle ?? t("transfer.available"), chosen: chosenTitle ?? t("transfer.chosen") };
|
|
140
|
+
const change = (values) => {
|
|
141
|
+
onChange(values);
|
|
142
|
+
onBlur?.();
|
|
143
|
+
};
|
|
144
|
+
const toggleIn = (setMarked) => (itemValue) => setMarked((current) => current.includes(itemValue) ? current.filter((markedValue) => markedValue !== itemValue) : [...current, itemValue]);
|
|
145
|
+
const moveToChosen = (values) => {
|
|
146
|
+
change([...chosenValues, ...values.filter((itemValue) => !chosenValues.includes(itemValue))]);
|
|
147
|
+
setMarkedAvailable((current) => current.filter((markedValue) => !values.includes(markedValue)));
|
|
148
|
+
};
|
|
149
|
+
const moveToAvailable = (values) => {
|
|
150
|
+
change(chosenValues.filter((chosenValue) => !values.includes(chosenValue)));
|
|
151
|
+
setMarkedChosen((current) => current.filter((markedValue) => !values.includes(markedValue)));
|
|
152
|
+
};
|
|
153
|
+
const movableOf = (items) => items.filter((item) => !item.disabled).map((item) => item.value);
|
|
154
|
+
const actionButton = (titleKey, Icon, onClick, isDisabled) => /* @__PURE__ */ jsx(Tooltip, { title: t(titleKey), children: /* @__PURE__ */ jsx("span", { children: /* @__PURE__ */ jsx(
|
|
155
|
+
Button,
|
|
156
|
+
{
|
|
157
|
+
variant: "outlined",
|
|
158
|
+
size: "small",
|
|
159
|
+
"aria-label": t(titleKey),
|
|
160
|
+
disabled: disabled || isDisabled,
|
|
161
|
+
onClick,
|
|
162
|
+
sx: { minWidth: 40, px: 1 },
|
|
163
|
+
children: /* @__PURE__ */ jsx(Icon, { fontSize: "small", sx: PHONE_ROTATION })
|
|
164
|
+
}
|
|
165
|
+
) }) });
|
|
166
|
+
const lists = /* @__PURE__ */ jsxs(TransferRoot, { direction: { xs: "column", md: "row" }, ownSx: { gap: 1.5, alignItems: "stretch" }, sx, id: inputId, children: [
|
|
167
|
+
/* @__PURE__ */ jsx(
|
|
168
|
+
TransferColumn,
|
|
169
|
+
{
|
|
170
|
+
title: titles.available,
|
|
171
|
+
items: available,
|
|
172
|
+
markedValues: markedAvailable,
|
|
173
|
+
onMark: toggleIn(setMarkedAvailable),
|
|
174
|
+
onMarkMany: setMarkedAvailable,
|
|
175
|
+
onMoveOne: (itemValue) => moveToChosen([itemValue]),
|
|
176
|
+
searchable: isSearchable,
|
|
177
|
+
searchLabel: t("transfer.search"),
|
|
178
|
+
emptyText: t("transfer.emptyAvailable"),
|
|
179
|
+
listHeight,
|
|
180
|
+
disabled,
|
|
181
|
+
t
|
|
182
|
+
}
|
|
183
|
+
),
|
|
184
|
+
/* @__PURE__ */ jsxs(TransferActions, { direction: { xs: "row", md: "column" }, ownSx: { gap: 1, justifyContent: "center", alignItems: "center" }, children: [
|
|
185
|
+
actionButton("transfer.moveMarked", ChevronRightRoundedIcon, () => moveToChosen(markedAvailable), markedAvailable.length === 0),
|
|
186
|
+
actionButton("transfer.moveAll", KeyboardDoubleArrowRightRoundedIcon, () => moveToChosen(movableOf(available)), movableOf(available).length === 0),
|
|
187
|
+
actionButton("transfer.returnMarked", ChevronLeftRoundedIcon, () => moveToAvailable(markedChosen), markedChosen.length === 0),
|
|
188
|
+
actionButton("transfer.returnAll", KeyboardDoubleArrowLeftRoundedIcon, () => moveToAvailable(movableOf(chosen)), movableOf(chosen).length === 0)
|
|
189
|
+
] }),
|
|
190
|
+
/* @__PURE__ */ jsx(
|
|
191
|
+
TransferColumn,
|
|
192
|
+
{
|
|
193
|
+
title: titles.chosen,
|
|
194
|
+
items: chosen,
|
|
195
|
+
markedValues: markedChosen,
|
|
196
|
+
onMark: toggleIn(setMarkedChosen),
|
|
197
|
+
onMarkMany: setMarkedChosen,
|
|
198
|
+
onMoveOne: (itemValue) => moveToAvailable([itemValue]),
|
|
199
|
+
searchable: isSearchable,
|
|
200
|
+
searchLabel: t("transfer.search"),
|
|
201
|
+
emptyText: t("transfer.emptyChosen"),
|
|
202
|
+
listHeight,
|
|
203
|
+
disabled,
|
|
204
|
+
t
|
|
205
|
+
}
|
|
206
|
+
)
|
|
207
|
+
] });
|
|
208
|
+
const field = /* @__PURE__ */ jsxs("div", { children: [
|
|
209
|
+
lists,
|
|
210
|
+
/* @__PURE__ */ jsx(FormHelperText, { error: Boolean(errorText), role: errorText ? "alert" : void 0, children: errorText ?? helperText })
|
|
211
|
+
] });
|
|
212
|
+
return label ? /* @__PURE__ */ jsx(FieldFrame, { inputId, label, children: field }) : field;
|
|
213
|
+
}
|
|
214
|
+
const TransferListInput = withPieceSlots(TransferListInputContent, THEME_NAME);
|
|
215
|
+
export {
|
|
216
|
+
TransferListInput as default
|
|
217
|
+
};
|
|
218
|
+
//# sourceMappingURL=TransferListInput.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TransferListInput.js","sources":["../../src/inputs/TransferListInput.jsx"],"sourcesContent":["// La lista de transferencia: dos columnas, «Disponibles» y «Elegidos», y botones para pasar de una a otra. Para elegir\n// muchos de una lista larga viendo siempre qué quedó de cada lado (los usuarios que pueden ver un reporte, las sucursales donde\n// puede comprar un cliente). Al formulario llega la lista de los elegidos, en el orden en que se pasaron.\n//\n// Cada columna trae su título con cuántos tiene, su buscador (searchable) y su casilla de «todos los que se ven» (con algo\n// buscado, solo esos). Se marcan los que se quieren pasar (clic o espacio) y se pasan con ›; » pasa todos los de la\n// columna. Doble clic pasa uno directo. En el teléfono las columnas van una debajo de otra y los botones apuntan hacia\n// abajo y arriba. Va fuera de una FormSection: necesita el ancho completo.\n//\n// Se cambia desde el tema del proyecto, como las piezas de MUI: components.CalcitaTransferListInput con defaultProps y\n// styleOverrides de sus partes: root, list, actions.\n//\n// Genérico del paquete: function (regla de la casa).\nimport {useId, useState} from 'react';\nimport Button from '@mui/material/Button';\nimport Checkbox from '@mui/material/Checkbox';\nimport FormHelperText from '@mui/material/FormHelperText';\nimport List from '@mui/material/List';\nimport ListItemButton from '@mui/material/ListItemButton';\nimport ListItemIcon from '@mui/material/ListItemIcon';\nimport ListItemText from '@mui/material/ListItemText';\nimport Paper from '@mui/material/Paper';\nimport Stack from '@mui/material/Stack';\nimport TextField from '@mui/material/TextField';\nimport Tooltip from '@mui/material/Tooltip';\nimport Typography from '@mui/material/Typography';\nimport ChevronLeftRoundedIcon from '@mui/icons-material/ChevronLeftRounded';\nimport ChevronRightRoundedIcon from '@mui/icons-material/ChevronRightRounded';\nimport KeyboardDoubleArrowLeftRoundedIcon from '@mui/icons-material/KeyboardDoubleArrowLeftRounded';\nimport KeyboardDoubleArrowRightRoundedIcon from '@mui/icons-material/KeyboardDoubleArrowRightRounded';\n\nimport {useValidationText} from '@/forms/useValidationText.js';\nimport FieldFrame from '@/inputs/FieldFrame.jsx';\nimport {selectAllStateOf} from '@/inputs/selectAllState.js';\nimport {piecePart, usePieceProps, withPieceSlots} from '@/theme/themePieces.js';\nimport {useToolkitTranslation} from '@/toolkit/useToolkitTranslation.js';\nimport {warnUnknownProps} from '@/toolkit/unknownProps.js';\n\n// lo alto de cada columna antes de deslizar\nconst DEFAULT_LIST_HEIGHT = 280;\n// en el teléfono los botones apuntan hacia abajo (pasar) y hacia arriba (regresar)\nconst PHONE_ROTATION = Object.freeze({transform: {xs: 'rotate(90deg)', md: 'none'}});\n\n// el nombre de la pieza en el tema y sus partes (theme.components.CalcitaTransferListInput)\nconst THEME_NAME = 'CalcitaTransferListInput';\nconst TransferRoot = piecePart(THEME_NAME, 'Root', Stack);\nconst TransferList = piecePart(THEME_NAME, 'List', Paper);\nconst TransferActions = piecePart(THEME_NAME, 'Actions', Stack);\n\n/**\n * Un texto sin acentos ni mayúsculas, para que «queretaro» encuentre «Querétaro».\n *\n * @param {unknown} text\n * @returns {string}\n */\nfunction plainTextOf(text) {\n return String(text ?? '').normalize('NFD').replace(/[̀-ͯ]/g, '').toLowerCase().trim();\n}\n\n/**\n * Una columna: su título con cuántos tiene, su buscador, su casilla de «todos los que se ven» y sus renglones.\n *\n * @param {object} props\n */\nfunction TransferColumn({title, items, markedValues, onMark, onMarkMany, onMoveOne, searchable, searchLabel, emptyText, listHeight, disabled, t}) {\n const titleId = useId();\n const [searchText, setSearchText] = useState('');\n const wantedText = plainTextOf(searchText);\n const visibleItems = wantedText\n ? items.filter((item) => plainTextOf(`${item.label} ${item.description ?? ''}`).includes(wantedText))\n : items;\n const visibleValues = visibleItems.filter((item) => !item.disabled).map((item) => item.value);\n const markState = selectAllStateOf(markedValues, visibleValues);\n\n return (\n <TransferList variant=\"outlined\" ownSx={{flex: 1, minWidth: 0, display: 'flex', flexDirection: 'column'}}>\n <Stack direction=\"row\" sx={{alignItems: 'center', gap: 1, px: 1.5, py: 1, borderBottom: 1, borderColor: 'divider'}}>\n <Checkbox size=\"small\" sx={{p: 0.5}} disabled={disabled || visibleValues.length === 0}\n checked={markState.allChosen} indeterminate={markState.someChosen}\n onChange={() => onMarkMany(markState.toggled())}\n slotProps={{input: {'aria-label': t('transfer.markVisible', {list: title})}}} />\n <Typography id={titleId} variant=\"subtitle2\" sx={{flexGrow: 1}}>{title}</Typography>\n <Typography variant=\"caption\" color=\"text.secondary\">\n {markedValues.length > 0 ? t('transfer.markedOf', {marked: markedValues.length, count: items.length}) : items.length}\n </Typography>\n </Stack>\n {searchable && (\n <TextField size=\"small\" type=\"search\" value={searchText} onChange={(event) => setSearchText(event.target.value)}\n placeholder={searchLabel} disabled={disabled} sx={{m: 1}}\n slotProps={{htmlInput: {'aria-label': `${searchLabel} · ${title}`}}} />\n )}\n <List dense role=\"listbox\" aria-labelledby={titleId} aria-multiselectable=\"true\"\n sx={{height: listHeight, overflowY: 'auto', py: 0}}>\n {visibleItems.length === 0 && (\n // vacía de verdad o vacía por lo buscado: no es lo mismo y se dice distinto\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{px: 2, py: 1.5}}>\n {items.length > 0 ? t('transfer.noMatches', {text: searchText.trim()}) : emptyText}\n </Typography>\n )}\n {visibleItems.map((item) => {\n const isMarked = markedValues.includes(item.value);\n return (\n <ListItemButton key={item.value} role=\"option\" aria-selected={isMarked} disabled={disabled || item.disabled}\n onClick={() => onMark(item.value)} onDoubleClick={() => onMoveOne(item.value)} sx={{py: 0.25}}>\n <ListItemIcon sx={{minWidth: 32}}>\n <Checkbox size=\"small\" edge=\"start\" tabIndex={-1} disableRipple checked={isMarked} sx={{p: 0.5}} />\n </ListItemIcon>\n <ListItemText primary={item.label} secondary={item.description} />\n </ListItemButton>\n );\n })}\n </List>\n </TransferList>\n );\n}\n\n/**\n * @param {object} props\n * @param {string} [props.name]\n * @param {import('react').ReactNode} [props.label] ya traducida\n * @param {Array<string|number>|null|undefined} props.value los elegidos\n * @param {(values: Array<string|number>) => void} props.onChange\n * @param {() => void} [props.onBlur]\n * @param {Array<{value: string|number, label: string, description?: string, disabled?: boolean}>} props.options todos\n * @param {string} [props.availableTitle] ya traducido; por omisión «Disponibles»\n * @param {string} [props.chosenTitle] ya traducido; por omisión «Elegidos»\n * @param {boolean} [props.searchable] un buscador en cada columna (por omisión, con más de 8 opciones)\n * @param {number} [props.listHeight] lo alto de cada columna, en px\n * @param {string|{key: string, values?: object}} [props.error]\n * @param {string} [props.helperText] ya traducida\n * @param {boolean} [props.disabled]\n * @param {object} [props.sx]\n * @param {Record<string, string|object>} [props.messages] el texto del error de este campo, por regla de validación\n * ({required: 'Escriba el RFC', matches: 'El RFC lleva 12 o 13 caracteres'}): gana al de Calcita y al de los textos\n * @param {object} [props.texts] los textos que cambian, con la forma de `common` en los textos del paquete\n */\nfunction TransferListInputContent(props) {\n const {\n name, label, value, onChange, onBlur, options, availableTitle, chosenTitle, searchable, listHeight = DEFAULT_LIST_HEIGHT, error,\n helperText = ' ', disabled = false, sx, messages, texts,\n ...unknownProps\n } = usePieceProps(props, THEME_NAME);\n warnUnknownProps(THEME_NAME, unknownProps);\n const {t} = useToolkitTranslation('common', texts);\n // el texto del error: el de la pantalla (messages), el del proyecto para este campo o el de Calcita\n const validationTextOf = useValidationText({name, label, messages});\n const generatedId = useId();\n const inputId = `${name ?? 'transfer'}-${generatedId}`;\n const errorText = validationTextOf(error);\n const chosenValues = Array.isArray(value) ? value : [];\n // lo marcado para pasar, de cada lado\n const [markedAvailable, setMarkedAvailable] = useState([]);\n const [markedChosen, setMarkedChosen] = useState([]);\n const available = options.filter((option) => !chosenValues.includes(option.value));\n // los elegidos en el orden en que se pasaron\n const chosen = chosenValues.map((chosenValue) => options.find((option) => option.value === chosenValue)).filter(Boolean);\n const isSearchable = searchable ?? options.length > 8;\n const titles = {available: availableTitle ?? t('transfer.available'), chosen: chosenTitle ?? t('transfer.chosen')};\n\n const change = (values) => {\n onChange(values);\n onBlur?.();\n };\n const toggleIn = (setMarked) => (itemValue) => setMarked((current) => (\n current.includes(itemValue) ? current.filter((markedValue) => markedValue !== itemValue) : [...current, itemValue]\n ));\n const moveToChosen = (values) => {\n change([...chosenValues, ...values.filter((itemValue) => !chosenValues.includes(itemValue))]);\n setMarkedAvailable((current) => current.filter((markedValue) => !values.includes(markedValue)));\n };\n const moveToAvailable = (values) => {\n change(chosenValues.filter((chosenValue) => !values.includes(chosenValue)));\n setMarkedChosen((current) => current.filter((markedValue) => !values.includes(markedValue)));\n };\n const movableOf = (items) => items.filter((item) => !item.disabled).map((item) => item.value);\n const actionButton = (titleKey, Icon, onClick, isDisabled) => (\n <Tooltip title={t(titleKey)}>\n <span>\n <Button variant=\"outlined\" size=\"small\" aria-label={t(titleKey)} disabled={disabled || isDisabled} onClick={onClick}\n sx={{minWidth: 40, px: 1}}>\n <Icon fontSize=\"small\" sx={PHONE_ROTATION} />\n </Button>\n </span>\n </Tooltip>\n );\n\n const lists = (\n <TransferRoot direction={{xs: 'column', md: 'row'}} ownSx={{gap: 1.5, alignItems: 'stretch'}} sx={sx} id={inputId}>\n <TransferColumn title={titles.available} items={available} markedValues={markedAvailable}\n onMark={toggleIn(setMarkedAvailable)} onMarkMany={setMarkedAvailable} onMoveOne={(itemValue) => moveToChosen([itemValue])}\n searchable={isSearchable} searchLabel={t('transfer.search')} emptyText={t('transfer.emptyAvailable')}\n listHeight={listHeight} disabled={disabled} t={t} />\n <TransferActions direction={{xs: 'row', md: 'column'}} ownSx={{gap: 1, justifyContent: 'center', alignItems: 'center'}}>\n {actionButton('transfer.moveMarked', ChevronRightRoundedIcon, () => moveToChosen(markedAvailable), markedAvailable.length === 0)}\n {actionButton('transfer.moveAll', KeyboardDoubleArrowRightRoundedIcon, () => moveToChosen(movableOf(available)), movableOf(available).length === 0)}\n {actionButton('transfer.returnMarked', ChevronLeftRoundedIcon, () => moveToAvailable(markedChosen), markedChosen.length === 0)}\n {actionButton('transfer.returnAll', KeyboardDoubleArrowLeftRoundedIcon, () => moveToAvailable(movableOf(chosen)), movableOf(chosen).length === 0)}\n </TransferActions>\n <TransferColumn title={titles.chosen} items={chosen} markedValues={markedChosen}\n onMark={toggleIn(setMarkedChosen)} onMarkMany={setMarkedChosen} onMoveOne={(itemValue) => moveToAvailable([itemValue])}\n searchable={isSearchable} searchLabel={t('transfer.search')} emptyText={t('transfer.emptyChosen')}\n listHeight={listHeight} disabled={disabled} t={t} />\n </TransferRoot>\n );\n\n const field = (\n <div>\n {lists}\n <FormHelperText error={Boolean(errorText)} role={errorText ? 'alert' : undefined}>{errorText ?? helperText}</FormHelperText>\n </div>\n );\n // sin etiqueta va solo (la pantalla pone el título a su manera)\n return label ? <FieldFrame inputId={inputId} label={label}>{field}</FieldFrame> : field;\n}\n\n// lo que se exporta: la pieza con slots y slotProps para cambiar sus partes (themePieces.js)\nconst TransferListInput = withPieceSlots(TransferListInputContent, THEME_NAME);\nexport default TransferListInput;\n"],"names":[],"mappings":"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"}
|
|
@@ -8,13 +8,13 @@ import Step from "@mui/material/Step";
|
|
|
8
8
|
import StepLabel from "@mui/material/StepLabel";
|
|
9
9
|
import Stepper from "@mui/material/Stepper";
|
|
10
10
|
import Typography from "@mui/material/Typography";
|
|
11
|
-
import { piecePart, usePieceProps } from "../theme/themePieces.js";
|
|
11
|
+
import { piecePart, withPieceSlots, usePieceProps } from "../theme/themePieces.js";
|
|
12
12
|
import { warnUnknownProps } from "../toolkit/unknownProps.js";
|
|
13
13
|
const THEME_NAME = "CalcitaWizardLayout";
|
|
14
14
|
const WizardStepper = piecePart(THEME_NAME, "Stepper", Stepper);
|
|
15
15
|
const WizardPhoneSteps = piecePart(THEME_NAME, "PhoneSteps", Box);
|
|
16
16
|
const WizardActions = piecePart(THEME_NAME, "Actions", Stack);
|
|
17
|
-
function
|
|
17
|
+
function WizardLayoutContent(props) {
|
|
18
18
|
const {
|
|
19
19
|
steps,
|
|
20
20
|
activeIndex,
|
|
@@ -57,6 +57,7 @@ function WizardLayout(props) {
|
|
|
57
57
|
] })
|
|
58
58
|
] });
|
|
59
59
|
}
|
|
60
|
+
const WizardLayout = withPieceSlots(WizardLayoutContent, THEME_NAME);
|
|
60
61
|
export {
|
|
61
62
|
WizardLayout as default
|
|
62
63
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WizardLayout.js","sources":["../../src/inputs/WizardLayout.jsx"],"sourcesContent":["// Lo que se ve de un formulario por pasos: los pasos arriba (en el teléfono, «Paso 2 de 4» y su nombre), los campos del paso\n// y los botones (Anterior · Omitir este paso · Siguiente o Enviar). No sabe de formik ni de react-hook-form: el FormWizard de\n// cada uno (/forms y /react-hook-form) pone la lógica (qué revisa «Siguiente», qué hace «Omitir») y le pasa su botón de\n// enviar y su aviso de errores. Suelto sirve para armar un asistente propio con otra librería.\n//\n// Los textos se cambian con `texts`, con la forma de `common` en los textos del paquete: {wizard: {next: 'Continuar'}}.\n//\n// Se cambia desde el tema del proyecto, como las piezas de MUI: components.CalcitaWizardLayout con defaultProps y\n// styleOverrides de sus partes: stepper, phoneSteps, actions.\n//\n// Genérico del paquete: function (regla de la casa).\nimport {useToolkitTranslation} from '@/toolkit/useToolkitTranslation.js';\nimport Box from '@mui/material/Box';\nimport Button from '@mui/material/Button';\nimport Stack from '@mui/material/Stack';\nimport Step from '@mui/material/Step';\nimport StepLabel from '@mui/material/StepLabel';\nimport Stepper from '@mui/material/Stepper';\nimport Typography from '@mui/material/Typography';\nimport {piecePart, usePieceProps} from '@/theme/themePieces.js';\nimport {warnUnknownProps} from '@/toolkit/unknownProps.js';\n\n// el nombre de la pieza en el tema y sus partes (theme.components.CalcitaWizardLayout)\nconst THEME_NAME = 'CalcitaWizardLayout';\nconst WizardStepper = piecePart(THEME_NAME, 'Stepper', Stepper);\nconst WizardPhoneSteps = piecePart(THEME_NAME, 'PhoneSteps', Box);\nconst WizardActions = piecePart(THEME_NAME, 'Actions', Stack);\n\n/**\n * @param {object} props\n * @param {Object[]} props.steps en orden\n * @param {string} props.steps[].key\n * @param {string} props.steps[].label ya traducido\n * @param {boolean} [props.steps[].optional] se puede omitir\n * @param {import('react').ReactNode} props.steps[].content los campos del paso\n * @param {number} props.activeIndex el paso que se ve\n * @param {Set<string>} props.skippedKeys los pasos omitidos\n * @param {boolean} [props.isSubmitting] mientras se envía, «Anterior» se apaga\n * @param {() => void} props.onBack\n * @param {() => void} props.onNext\n * @param {() => void} props.onSkip\n * @param {import('react').ReactNode} props.submitButton el botón de enviar del último paso\n * @param {import('react').ReactNode} [props.problemAlert] el aviso de errores del servidor, arriba de los botones del último paso\n * @param {object} [props.texts] los textos que cambian, con la forma de `common`: {wizard: {next, back, skip, optional, skipped, stepOf}}\n */\
|
|
1
|
+
{"version":3,"file":"WizardLayout.js","sources":["../../src/inputs/WizardLayout.jsx"],"sourcesContent":["// Lo que se ve de un formulario por pasos: los pasos arriba (en el teléfono, «Paso 2 de 4» y su nombre), los campos del paso\n// y los botones (Anterior · Omitir este paso · Siguiente o Enviar). No sabe de formik ni de react-hook-form: el FormWizard de\n// cada uno (/forms y /react-hook-form) pone la lógica (qué revisa «Siguiente», qué hace «Omitir») y le pasa su botón de\n// enviar y su aviso de errores. Suelto sirve para armar un asistente propio con otra librería.\n//\n// Los textos se cambian con `texts`, con la forma de `common` en los textos del paquete: {wizard: {next: 'Continuar'}}.\n//\n// Se cambia desde el tema del proyecto, como las piezas de MUI: components.CalcitaWizardLayout con defaultProps y\n// styleOverrides de sus partes: stepper, phoneSteps, actions.\n//\n// Genérico del paquete: function (regla de la casa).\nimport {useToolkitTranslation} from '@/toolkit/useToolkitTranslation.js';\nimport Box from '@mui/material/Box';\nimport Button from '@mui/material/Button';\nimport Stack from '@mui/material/Stack';\nimport Step from '@mui/material/Step';\nimport StepLabel from '@mui/material/StepLabel';\nimport Stepper from '@mui/material/Stepper';\nimport Typography from '@mui/material/Typography';\nimport {piecePart, usePieceProps, withPieceSlots} from '@/theme/themePieces.js';\nimport {warnUnknownProps} from '@/toolkit/unknownProps.js';\n\n// el nombre de la pieza en el tema y sus partes (theme.components.CalcitaWizardLayout)\nconst THEME_NAME = 'CalcitaWizardLayout';\nconst WizardStepper = piecePart(THEME_NAME, 'Stepper', Stepper);\nconst WizardPhoneSteps = piecePart(THEME_NAME, 'PhoneSteps', Box);\nconst WizardActions = piecePart(THEME_NAME, 'Actions', Stack);\n\n/**\n * @param {object} props\n * @param {Object[]} props.steps en orden\n * @param {string} props.steps[].key\n * @param {string} props.steps[].label ya traducido\n * @param {boolean} [props.steps[].optional] se puede omitir\n * @param {import('react').ReactNode} props.steps[].content los campos del paso\n * @param {number} props.activeIndex el paso que se ve\n * @param {Set<string>} props.skippedKeys los pasos omitidos\n * @param {boolean} [props.isSubmitting] mientras se envía, «Anterior» se apaga\n * @param {() => void} props.onBack\n * @param {() => void} props.onNext\n * @param {() => void} props.onSkip\n * @param {import('react').ReactNode} props.submitButton el botón de enviar del último paso\n * @param {import('react').ReactNode} [props.problemAlert] el aviso de errores del servidor, arriba de los botones del último paso\n * @param {object} [props.texts] los textos que cambian, con la forma de `common`: {wizard: {next, back, skip, optional, skipped, stepOf}}\n */\nfunction WizardLayoutContent(props) {\n // lo que el proyecto puso en su tema (components.CalcitaWizardLayout.defaultProps) y encima lo que llega aquí\n const {\n steps, activeIndex, skippedKeys, isSubmitting = false, onBack, onNext, onSkip, submitButton, problemAlert, texts,\n ...unknownProps\n} = usePieceProps(props, THEME_NAME);\n warnUnknownProps(THEME_NAME, unknownProps);\n const {t} = useToolkitTranslation('common', texts);\n const activeStep = steps[activeIndex];\n const isLastStep = activeIndex === steps.length - 1;\n\n return (\n <Stack spacing={3}>\n {/* en el teléfono los nombres de los pasos no caben: se dice en qué paso va */}\n <WizardStepper activeStep={activeIndex} alternativeLabel ownSx={{display: {xs: 'none', sm: 'flex'}}}>\n {steps.map((step) => {\n let caption;\n if (skippedKeys.has(step.key)) {\n caption = t('wizard.skipped');\n } else if (step.optional) {\n caption = t('wizard.optional');\n }\n return (\n <Step key={step.key} completed={skippedKeys.has(step.key) ? false : undefined}>\n <StepLabel optional={caption && <Typography variant=\"caption\" color=\"text.secondary\">{caption}</Typography>}>\n {step.label}\n </StepLabel>\n </Step>\n );\n })}\n </WizardStepper>\n <WizardPhoneSteps ownSx={{display: {xs: 'block', sm: 'none'}}}>\n <Typography variant=\"overline\" color=\"text.secondary\">{t('wizard.stepOf', {current: activeIndex + 1, total: steps.length})}</Typography>\n <Typography variant=\"h6\">{activeStep.label}</Typography>\n </WizardPhoneSteps>\n\n <Box>{activeStep.content}</Box>\n\n {isLastStep && problemAlert}\n\n <WizardActions direction={{xs: 'column-reverse', sm: 'row'}} spacing={1.5} ownSx={{justifyContent: 'space-between'}}>\n <Button variant=\"text\" color=\"inherit\" disabled={activeIndex === 0 || isSubmitting} onClick={onBack}>\n {t('wizard.back')}\n </Button>\n <Stack direction={{xs: 'column-reverse', sm: 'row'}} spacing={1.5}>\n {activeStep.optional && !isLastStep && (\n <Button variant=\"text\" onClick={onSkip}>{t('wizard.skip')}</Button>\n )}\n {isLastStep\n ? submitButton\n : <Button variant=\"contained\" size=\"large\" onClick={onNext}>{t('wizard.next')}</Button>}\n </Stack>\n </WizardActions>\n </Stack>\n );\n}\n\n// lo que se exporta: la pieza con slots y slotProps para cambiar sus partes (themePieces.js)\nconst WizardLayout = withPieceSlots(WizardLayoutContent, THEME_NAME);\nexport default WizardLayout;\n"],"names":[],"mappings":";;;;;;;;;;;;AAuBA,MAAM,aAAa;AACnB,MAAM,gBAAgB,UAAU,YAAY,WAAW,OAAO;AAC9D,MAAM,mBAAmB,UAAU,YAAY,cAAc,GAAG;AAChE,MAAM,gBAAgB,UAAU,YAAY,WAAW,KAAK;AAmB5D,SAAS,oBAAoB,OAAO;AAEhC,QAAM;AAAA,IACN;AAAA,IAAO;AAAA,IAAa;AAAA,IAAa,eAAe;AAAA,IAAO;AAAA,IAAQ;AAAA,IAAQ;AAAA,IAAQ;AAAA,IAAc;AAAA,IAAc;AAAA,IAC3G,GAAG;AAAA,EAAA,IACH,cAAc,OAAO,UAAU;AAC/B,mBAAiB,YAAY,YAAY;AACzC,QAAM,EAAC,EAAA,IAAK,sBAAsB,UAAU,KAAK;AACjD,QAAM,aAAa,MAAM,WAAW;AACpC,QAAM,aAAa,gBAAgB,MAAM,SAAS;AAElD,SACI,qBAAC,OAAA,EAAM,SAAS,GAEZ,UAAA;AAAA,IAAA,oBAAC,iBAAc,YAAY,aAAa,kBAAgB,MAAC,OAAO,EAAC,SAAS,EAAC,IAAI,QAAQ,IAAI,OAAA,EAAM,GAC5F,UAAA,MAAM,IAAI,CAAC,SAAS;AACjB,UAAI;AACJ,UAAI,YAAY,IAAI,KAAK,GAAG,GAAG;AAC3B,kBAAU,EAAE,gBAAgB;AAAA,MAChC,WAAW,KAAK,UAAU;AACtB,kBAAU,EAAE,iBAAiB;AAAA,MACjC;AACA,aACI,oBAAC,MAAA,EAAoB,WAAW,YAAY,IAAI,KAAK,GAAG,IAAI,QAAQ,QAChE,UAAA,oBAAC,WAAA,EAAU,UAAU,WAAW,oBAAC,YAAA,EAAW,SAAQ,WAAU,OAAM,kBAAkB,UAAA,QAAA,CAAQ,GACzF,UAAA,KAAK,MAAA,CACV,EAAA,GAHO,KAAK,GAIhB;AAAA,IAER,CAAC,EAAA,CACL;AAAA,IACA,qBAAC,kBAAA,EAAiB,OAAO,EAAC,SAAS,EAAC,IAAI,SAAS,IAAI,OAAA,EAAM,GACvD,UAAA;AAAA,MAAA,oBAAC,YAAA,EAAW,SAAQ,YAAW,OAAM,kBAAkB,UAAA,EAAE,iBAAiB,EAAC,SAAS,cAAc,GAAG,OAAO,MAAM,OAAA,CAAO,GAAE;AAAA,MAC3H,oBAAC,YAAA,EAAW,SAAQ,MAAM,qBAAW,MAAA,CAAM;AAAA,IAAA,GAC/C;AAAA,IAEA,oBAAC,KAAA,EAAK,UAAA,WAAW,QAAA,CAAQ;AAAA,IAExB,cAAc;AAAA,IAEf,qBAAC,eAAA,EAAc,WAAW,EAAC,IAAI,kBAAkB,IAAI,MAAA,GAAQ,SAAS,KAAK,OAAO,EAAC,gBAAgB,mBAC/F,UAAA;AAAA,MAAA,oBAAC,QAAA,EAAO,SAAQ,QAAO,OAAM,WAAU,UAAU,gBAAgB,KAAK,cAAc,SAAS,QACxF,UAAA,EAAE,aAAa,GACpB;AAAA,MACA,qBAAC,OAAA,EAAM,WAAW,EAAC,IAAI,kBAAkB,IAAI,MAAA,GAAQ,SAAS,KACzD,UAAA;AAAA,QAAA,WAAW,YAAY,CAAC,cACrB,oBAAC,QAAA,EAAO,SAAQ,QAAO,SAAS,QAAS,UAAA,EAAE,aAAa,EAAA,CAAE;AAAA,QAE7D,aACK,eACA,oBAAC,QAAA,EAAO,SAAQ,aAAY,MAAK,SAAQ,SAAS,QAAS,UAAA,EAAE,aAAa,EAAA,CAAE;AAAA,MAAA,EAAA,CACtF;AAAA,IAAA,EAAA,CACJ;AAAA,EAAA,GACJ;AAER;AAGA,MAAM,eAAe,eAAe,qBAAqB,UAAU;"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
const INPUT_MASK = Object.freeze({
|
|
2
|
+
// 10 dígitos en grupos de 3, 3 y 4; si su país lo escribe distinto, pase su propio patrón
|
|
3
|
+
phone: "999 999 9999",
|
|
4
|
+
postalCode: "99999",
|
|
5
|
+
// la CLABE: banco (3), plaza (3), cuenta (11) y dígito verificador (1)
|
|
6
|
+
clabe: "999 999 99999999999 9",
|
|
7
|
+
card: "9999 9999 9999 9999",
|
|
8
|
+
// RFC de persona física (13); el de persona moral (12) cabe igual
|
|
9
|
+
rfc: "XXXXXXXXXXXXX",
|
|
10
|
+
curp: "XXXXXXXXXXXXXXXXXX",
|
|
11
|
+
// el folio fiscal (UUID) de una factura
|
|
12
|
+
uuid: "HHHHHHHH-HHHH-HHHH-HHHH-HHHHHHHHHHHH"
|
|
13
|
+
});
|
|
14
|
+
const SLOT_RULES = Object.freeze({
|
|
15
|
+
9: /^\d$/,
|
|
16
|
+
A: /^[A-ZÑ]$/,
|
|
17
|
+
X: /^[A-Z0-9Ñ&]$/,
|
|
18
|
+
H: /^[0-9A-F]$/
|
|
19
|
+
});
|
|
20
|
+
function maskPatternOf(mask) {
|
|
21
|
+
return INPUT_MASK[mask] ?? mask;
|
|
22
|
+
}
|
|
23
|
+
function isSlot(patternCharacter) {
|
|
24
|
+
return patternCharacter in SLOT_RULES;
|
|
25
|
+
}
|
|
26
|
+
function slotsOf(pattern) {
|
|
27
|
+
return [...pattern].filter(isSlot);
|
|
28
|
+
}
|
|
29
|
+
function rawValueOf(typedText, pattern) {
|
|
30
|
+
const slots = slotsOf(pattern);
|
|
31
|
+
let raw = "";
|
|
32
|
+
for (const character of (typedText ?? "").toLocaleUpperCase("es-MX")) {
|
|
33
|
+
if (raw.length === slots.length) {
|
|
34
|
+
break;
|
|
35
|
+
}
|
|
36
|
+
if (SLOT_RULES[slots[raw.length]].test(character)) {
|
|
37
|
+
raw += character;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return raw;
|
|
41
|
+
}
|
|
42
|
+
function maskedTextOf(rawValue, pattern) {
|
|
43
|
+
const raw = rawValueOf(rawValue ?? "", pattern);
|
|
44
|
+
let shown = "";
|
|
45
|
+
let usedCharacters = 0;
|
|
46
|
+
for (const patternCharacter of pattern) {
|
|
47
|
+
if (usedCharacters === raw.length) {
|
|
48
|
+
break;
|
|
49
|
+
}
|
|
50
|
+
if (isSlot(patternCharacter)) {
|
|
51
|
+
shown += raw[usedCharacters];
|
|
52
|
+
usedCharacters += 1;
|
|
53
|
+
} else {
|
|
54
|
+
shown += patternCharacter;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return shown;
|
|
58
|
+
}
|
|
59
|
+
function caretPositionOf(typedText, caretPosition, pattern) {
|
|
60
|
+
const valueCharactersBefore = rawValueOf(typedText.slice(0, caretPosition), pattern).length;
|
|
61
|
+
const shown = maskedTextOf(rawValueOf(typedText, pattern), pattern);
|
|
62
|
+
let seen = 0;
|
|
63
|
+
for (let position = 0; position < shown.length; position += 1) {
|
|
64
|
+
if (seen === valueCharactersBefore) {
|
|
65
|
+
return position;
|
|
66
|
+
}
|
|
67
|
+
if (isSlot(pattern[position])) {
|
|
68
|
+
seen += 1;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return shown.length;
|
|
72
|
+
}
|
|
73
|
+
function isMaskComplete(rawValue, pattern) {
|
|
74
|
+
return rawValueOf(rawValue ?? "", pattern).length === slotsOf(pattern).length;
|
|
75
|
+
}
|
|
76
|
+
export {
|
|
77
|
+
INPUT_MASK,
|
|
78
|
+
caretPositionOf,
|
|
79
|
+
isMaskComplete,
|
|
80
|
+
maskPatternOf,
|
|
81
|
+
maskedTextOf,
|
|
82
|
+
rawValueOf
|
|
83
|
+
};
|
|
84
|
+
//# sourceMappingURL=inputMasks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inputMasks.js","sources":["../../src/inputs/inputMasks.js"],"sourcesContent":["// Las máscaras de los campos que se escriben con forma fija: un teléfono, una CLABE, un RFC, un folio fiscal. MaskedInput\n// las usa para que la persona vea los separadores mientras escribe y al formulario llegue el valor LIMPIO (solo dígitos o\n// letras, en mayúsculas), que es lo que valida y guarda el servidor.\n//\n// Un patrón es un texto donde cada lugar dice qué cabe; lo demás son separadores que pone la máscara:\n// 9 un dígito\n// A una letra (Ñ incluida), en mayúscula\n// X una letra o un dígito, en mayúscula (también & y Ñ, que llevan los RFC)\n// H un dígito hexadecimal 0-9 A-F, en mayúscula (los folios fiscales)\n// Por ejemplo '999 999 9999' muestra «555 123 4567» y al formulario llega «5551234567».\n//\n// Lo que no cabe en el lugar que sigue se ignora (una letra donde va un dígito) y nada pasa del largo del patrón. El RFC y la\n// CURP solo se filtran y se pasan a mayúsculas mientras se escriben: que estén bien formados lo revisan sus reglas.\n//\n// Puro (sin React): se prueba con node (inputMasks.test.js).\n//\n// Genérico del paquete: function (regla de la casa).\n\n/** Los patrones de siempre, para no escribirlos en cada pantalla. Uno propio se pasa como texto. */\nexport const INPUT_MASK = Object.freeze({\n // 10 dígitos en grupos de 3, 3 y 4; si su país lo escribe distinto, pase su propio patrón\n phone: '999 999 9999',\n postalCode: '99999',\n // la CLABE: banco (3), plaza (3), cuenta (11) y dígito verificador (1)\n clabe: '999 999 99999999999 9',\n card: '9999 9999 9999 9999',\n // RFC de persona física (13); el de persona moral (12) cabe igual\n rfc: 'XXXXXXXXXXXXX',\n curp: 'XXXXXXXXXXXXXXXXXX',\n // el folio fiscal (UUID) de una factura\n uuid: 'HHHHHHHH-HHHH-HHHH-HHHH-HHHHHHHHHHHH',\n});\n\n// qué cabe en cada clase de lugar del patrón\nconst SLOT_RULES = Object.freeze({\n 9: /^\\d$/,\n A: /^[A-ZÑ]$/,\n X: /^[A-Z0-9Ñ&]$/,\n H: /^[0-9A-F]$/,\n});\n\n/**\n * El patrón de una máscara: el nombre de una de INPUT_MASK o el patrón mismo.\n *\n * @param {string} mask 'phone' | '999-999' …\n * @returns {string}\n */\nexport function maskPatternOf(mask) {\n return INPUT_MASK[mask] ?? mask;\n}\n\n/**\n * @param {string} patternCharacter\n * @returns {boolean}\n */\nfunction isSlot(patternCharacter) {\n return patternCharacter in SLOT_RULES;\n}\n\n/**\n * Los lugares del patrón, en orden (sin los separadores).\n *\n * @param {string} pattern\n * @returns {string[]}\n */\nfunction slotsOf(pattern) {\n return [...pattern].filter(isSlot);\n}\n\n/**\n * El valor limpio de lo que se escribió (o se pegó): cada carácter va al lugar que sigue si cabe; lo que no, se ignora.\n *\n * @param {string} typedText lo que hay en el campo, con o sin separadores\n * @param {string} pattern\n * @returns {string} solo los dígitos o letras, en mayúsculas, hasta el largo del patrón\n */\nexport function rawValueOf(typedText, pattern) {\n const slots = slotsOf(pattern);\n let raw = '';\n for (const character of (typedText ?? '').toLocaleUpperCase('es-MX')) {\n if (raw.length === slots.length) {\n break;\n }\n if (SLOT_RULES[slots[raw.length]].test(character)) {\n raw += character;\n }\n }\n return raw;\n}\n\n/**\n * El valor limpio con sus separadores, como se ve en el campo. Los separadores solo salen entre lo que ya se escribió (sin\n * guiones de más al final).\n *\n * @param {string|null|undefined} rawValue\n * @param {string} pattern\n * @returns {string}\n */\nexport function maskedTextOf(rawValue, pattern) {\n const raw = rawValueOf(rawValue ?? '', pattern);\n let shown = '';\n let usedCharacters = 0;\n for (const patternCharacter of pattern) {\n if (usedCharacters === raw.length) {\n break;\n }\n if (isSlot(patternCharacter)) {\n shown += raw[usedCharacters];\n usedCharacters += 1;\n } else {\n shown += patternCharacter;\n }\n }\n return shown;\n}\n\n/**\n * Dónde queda el cursor después de poner los separadores: justo después del mismo número de dígitos o letras que tenía\n * antes. Sin esto, escribir en medio de un teléfono mandaría el cursor al final.\n *\n * @param {string} typedText lo que había en el campo al escribir\n * @param {number} caretPosition dónde estaba el cursor en typedText\n * @param {string} pattern\n * @returns {number} la posición en el texto ya con sus separadores\n */\nexport function caretPositionOf(typedText, caretPosition, pattern) {\n const valueCharactersBefore = rawValueOf(typedText.slice(0, caretPosition), pattern).length;\n const shown = maskedTextOf(rawValueOf(typedText, pattern), pattern);\n let seen = 0;\n for (let position = 0; position < shown.length; position += 1) {\n if (seen === valueCharactersBefore) {\n return position;\n }\n if (isSlot(pattern[position])) {\n seen += 1;\n }\n }\n return shown.length;\n}\n\n/**\n * ¿Ya se llenaron todos los lugares?\n *\n * @param {string|null|undefined} rawValue\n * @param {string} pattern\n * @returns {boolean}\n */\nexport function isMaskComplete(rawValue, pattern) {\n return rawValueOf(rawValue ?? '', pattern).length === slotsOf(pattern).length;\n}\n"],"names":[],"mappings":"AAmBY,MAAC,aAAa,OAAO,OAAO;AAAA;AAAA,EAEpC,OAAO;AAAA,EACP,YAAY;AAAA;AAAA,EAEZ,OAAO;AAAA,EACP,MAAM;AAAA;AAAA,EAEN,KAAK;AAAA,EACL,MAAM;AAAA;AAAA,EAEN,MAAM;AACV,CAAC;AAGD,MAAM,aAAa,OAAO,OAAO;AAAA,EAC7B,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AACP,CAAC;AAQM,SAAS,cAAc,MAAM;AAChC,SAAO,WAAW,IAAI,KAAK;AAC/B;AAMA,SAAS,OAAO,kBAAkB;AAC9B,SAAO,oBAAoB;AAC/B;AAQA,SAAS,QAAQ,SAAS;AACtB,SAAO,CAAC,GAAG,OAAO,EAAE,OAAO,MAAM;AACrC;AASO,SAAS,WAAW,WAAW,SAAS;AAC3C,QAAM,QAAQ,QAAQ,OAAO;AAC7B,MAAI,MAAM;AACV,aAAW,cAAc,aAAa,IAAI,kBAAkB,OAAO,GAAG;AAClE,QAAI,IAAI,WAAW,MAAM,QAAQ;AAC7B;AAAA,IACJ;AACA,QAAI,WAAW,MAAM,IAAI,MAAM,CAAC,EAAE,KAAK,SAAS,GAAG;AAC/C,aAAO;AAAA,IACX;AAAA,EACJ;AACA,SAAO;AACX;AAUO,SAAS,aAAa,UAAU,SAAS;AAC5C,QAAM,MAAM,WAAW,YAAY,IAAI,OAAO;AAC9C,MAAI,QAAQ;AACZ,MAAI,iBAAiB;AACrB,aAAW,oBAAoB,SAAS;AACpC,QAAI,mBAAmB,IAAI,QAAQ;AAC/B;AAAA,IACJ;AACA,QAAI,OAAO,gBAAgB,GAAG;AAC1B,eAAS,IAAI,cAAc;AAC3B,wBAAkB;AAAA,IACtB,OAAO;AACH,eAAS;AAAA,IACb;AAAA,EACJ;AACA,SAAO;AACX;AAWO,SAAS,gBAAgB,WAAW,eAAe,SAAS;AAC/D,QAAM,wBAAwB,WAAW,UAAU,MAAM,GAAG,aAAa,GAAG,OAAO,EAAE;AACrF,QAAM,QAAQ,aAAa,WAAW,WAAW,OAAO,GAAG,OAAO;AAClE,MAAI,OAAO;AACX,WAAS,WAAW,GAAG,WAAW,MAAM,QAAQ,YAAY,GAAG;AAC3D,QAAI,SAAS,uBAAuB;AAChC,aAAO;AAAA,IACX;AACA,QAAI,OAAO,QAAQ,QAAQ,CAAC,GAAG;AAC3B,cAAQ;AAAA,IACZ;AAAA,EACJ;AACA,SAAO,MAAM;AACjB;AASO,SAAS,eAAe,UAAU,SAAS;AAC9C,SAAO,WAAW,YAAY,IAAI,OAAO,EAAE,WAAW,QAAQ,OAAO,EAAE;AAC3E;"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
function selectAllStateOf(selectedValues, candidateValues) {
|
|
2
|
+
const selected = new Set(selectedValues);
|
|
3
|
+
const chosenCount = candidateValues.filter((value) => selected.has(value)).length;
|
|
4
|
+
const allChosen = candidateValues.length > 0 && chosenCount === candidateValues.length;
|
|
5
|
+
return {
|
|
6
|
+
allChosen,
|
|
7
|
+
someChosen: chosenCount > 0 && !allChosen,
|
|
8
|
+
toggled: () => {
|
|
9
|
+
if (allChosen) {
|
|
10
|
+
const candidates = new Set(candidateValues);
|
|
11
|
+
return selectedValues.filter((value) => !candidates.has(value));
|
|
12
|
+
}
|
|
13
|
+
return [...selectedValues, ...candidateValues.filter((value) => !selected.has(value))];
|
|
14
|
+
}
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
export {
|
|
18
|
+
selectAllStateOf
|
|
19
|
+
};
|
|
20
|
+
//# sourceMappingURL=selectAllState.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"selectAllState.js","sources":["../../src/inputs/selectAllState.js"],"sourcesContent":["// «Elegir todos» de una lista de varias opciones: si su casilla va marcada, a medias o vacía, y qué queda al picarla.\n// Lo comparten la lista desplegable, el catálogo con buscador y el grupo de casillas.\n//\n// «Todos» son los candidatos: todas las opciones, o las que coinciden con lo buscado. Picarlo con todos ya elegidos los\n// quita; si no, agrega los que faltan al final (lo que ya estaba elegido se queda en su orden).\n//\n// Puro (sin React): se prueba con node (selectAllState.test.js).\n//\n// Genérico del paquete: function (regla de la casa).\n\n/**\n * @template T\n * @param {T[]} selectedValues lo elegido hoy\n * @param {T[]} candidateValues lo que abarca «todos» (sin las opciones apagadas)\n * @returns {{allChosen: boolean, someChosen: boolean, toggled: () => T[]}} someChosen: algunos sí y otros no (casilla a medias)\n */\nexport function selectAllStateOf(selectedValues, candidateValues) {\n const selected = new Set(selectedValues);\n const chosenCount = candidateValues.filter((value) => selected.has(value)).length;\n const allChosen = candidateValues.length > 0 && chosenCount === candidateValues.length;\n return {\n allChosen,\n someChosen: chosenCount > 0 && !allChosen,\n toggled: () => {\n if (allChosen) {\n const candidates = new Set(candidateValues);\n return selectedValues.filter((value) => !candidates.has(value));\n }\n return [...selectedValues, ...candidateValues.filter((value) => !selected.has(value))];\n },\n };\n}\n"],"names":[],"mappings":"AAgBO,SAAS,iBAAiB,gBAAgB,iBAAiB;AAC9D,QAAM,WAAW,IAAI,IAAI,cAAc;AACvC,QAAM,cAAc,gBAAgB,OAAO,CAAC,UAAU,SAAS,IAAI,KAAK,CAAC,EAAE;AAC3E,QAAM,YAAY,gBAAgB,SAAS,KAAK,gBAAgB,gBAAgB;AAChF,SAAO;AAAA,IACH;AAAA,IACA,YAAY,cAAc,KAAK,CAAC;AAAA,IAChC,SAAS,MAAM;AACX,UAAI,WAAW;AACX,cAAM,aAAa,IAAI,IAAI,eAAe;AAC1C,eAAO,eAAe,OAAO,CAAC,UAAU,CAAC,WAAW,IAAI,KAAK,CAAC;AAAA,MAClE;AACA,aAAO,CAAC,GAAG,gBAAgB,GAAG,gBAAgB,OAAO,CAAC,UAAU,CAAC,SAAS,IAAI,KAAK,CAAC,CAAC;AAAA,IACzF;AAAA,EACR;AACA;"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { useRef } from "react";
|
|
3
|
+
import { newIdentifier } from "../identifiers.js";
|
|
4
|
+
function useRowKeys(rowCount) {
|
|
5
|
+
const keysRef = useRef([]);
|
|
6
|
+
if (keysRef.current.length !== rowCount) {
|
|
7
|
+
keysRef.current = Array.from({ length: rowCount }, (unused, index) => keysRef.current[index] ?? newIdentifier());
|
|
8
|
+
}
|
|
9
|
+
return {
|
|
10
|
+
keys: keysRef.current,
|
|
11
|
+
added: () => {
|
|
12
|
+
keysRef.current = [...keysRef.current, newIdentifier()];
|
|
13
|
+
},
|
|
14
|
+
removed: (index) => {
|
|
15
|
+
keysRef.current = keysRef.current.filter((unused, keyIndex) => keyIndex !== index);
|
|
16
|
+
},
|
|
17
|
+
// un renglón limpio es otro renglón: los campos de adentro empiezan de cero
|
|
18
|
+
renewed: (index) => {
|
|
19
|
+
keysRef.current = keysRef.current.map((key, keyIndex) => keyIndex === index ? newIdentifier() : key);
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
export {
|
|
24
|
+
useRowKeys
|
|
25
|
+
};
|
|
26
|
+
//# sourceMappingURL=useRowKeys.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useRowKeys.js","sources":["../../src/inputs/useRowKeys.js"],"sourcesContent":["// Una llave estable por renglón de una lista que se repite, para formik (react-hook-form ya trae la suya en useFieldArray).\n//\n// Por qué no el índice: al quitar el renglón 2, el 3 pasa a ser el 2; con el índice como llave React le dejaría al nuevo\n// 2 lo que tenía el viejo (lo escrito a medias en una lista de opciones, un error), y se vería el dato de otro renglón.\n//\n// Si la lista cambia desde afuera (el formulario se limpia o llega del servidor), las llaves se vuelven a hacer.\n//\n// Hook genérico: function (regla de la casa).\nimport {useRef} from 'react';\n\nimport {newIdentifier} from '@/identifiers.js';\n\n/**\n * @param {number} rowCount cuántos renglones tiene la lista hoy\n * @returns {{keys: string[], added: () => void, removed: (index: number) => void, renewed: (index: number) => void}}\n * added / removed / renewed se llaman JUNTO con el cambio de la lista (agregar al final, quitar uno, limpiar uno)\n */\nexport function useRowKeys(rowCount) {\n const keysRef = useRef([]);\n // la lista cambió desde afuera: tantas llaves como renglones\n if (keysRef.current.length !== rowCount) {\n keysRef.current = Array.from({length: rowCount}, (unused, index) => keysRef.current[index] ?? newIdentifier());\n }\n return {\n keys: keysRef.current,\n added: () => {\n keysRef.current = [...keysRef.current, newIdentifier()];\n },\n removed: (index) => {\n keysRef.current = keysRef.current.filter((unused, keyIndex) => keyIndex !== index);\n },\n // un renglón limpio es otro renglón: los campos de adentro empiezan de cero\n renewed: (index) => {\n keysRef.current = keysRef.current.map((key, keyIndex) => (keyIndex === index ? newIdentifier() : key));\n },\n };\n}\n"],"names":[],"mappings":";;;AAiBO,SAAS,WAAW,UAAU;AACjC,QAAM,UAAU,OAAO,EAAE;AAEzB,MAAI,QAAQ,QAAQ,WAAW,UAAU;AACrC,YAAQ,UAAU,MAAM,KAAK,EAAC,QAAQ,SAAQ,GAAG,CAAC,QAAQ,UAAU,QAAQ,QAAQ,KAAK,KAAK,cAAa,CAAE;AAAA,EACjH;AACA,SAAO;AAAA,IACH,MAAM,QAAQ;AAAA,IACd,OAAO,MAAM;AACT,cAAQ,UAAU,CAAC,GAAG,QAAQ,SAAS,cAAa,CAAE;AAAA,IAC1D;AAAA,IACA,SAAS,CAAC,UAAU;AAChB,cAAQ,UAAU,QAAQ,QAAQ,OAAO,CAAC,QAAQ,aAAa,aAAa,KAAK;AAAA,IACrF;AAAA;AAAA,IAEA,SAAS,CAAC,UAAU;AAChB,cAAQ,UAAU,QAAQ,QAAQ,IAAI,CAAC,KAAK,aAAc,aAAa,QAAQ,cAAa,IAAK,GAAI;AAAA,IACzG;AAAA,EACR;AACA;"}
|
|
@@ -27,7 +27,7 @@ import { DUE_STATUS, todayIsoDateOf, dueStatusOf } from "./kanbanCards.js";
|
|
|
27
27
|
import { cardsOfColumn, isOverLimit } from "./kanbanMoves.js";
|
|
28
28
|
import { useToolkitTranslation } from "../toolkit/useToolkitTranslation.js";
|
|
29
29
|
import ActionsMenu from "../ui/actions/ActionsMenu.js";
|
|
30
|
-
import { piecePart, usePieceProps } from "../theme/themePieces.js";
|
|
30
|
+
import { piecePart, withPieceSlots, usePieceProps } from "../theme/themePieces.js";
|
|
31
31
|
import { warnUnknownProps } from "../toolkit/unknownProps.js";
|
|
32
32
|
import { tagOf } from "../ui/labels/tagOf.js";
|
|
33
33
|
const THEME_NAME = "CalcitaKanbanBoard";
|
|
@@ -180,7 +180,7 @@ function QuickAdd({ columnTitle, onAdd, onClose, t }) {
|
|
|
180
180
|
}
|
|
181
181
|
);
|
|
182
182
|
}
|
|
183
|
-
function
|
|
183
|
+
function KanbanBoardContent(props) {
|
|
184
184
|
const {
|
|
185
185
|
columns,
|
|
186
186
|
cards,
|
|
@@ -367,6 +367,7 @@ function KanbanBoard(props) {
|
|
|
367
367
|
);
|
|
368
368
|
}) }) });
|
|
369
369
|
}
|
|
370
|
+
const KanbanBoard = withPieceSlots(KanbanBoardContent, THEME_NAME);
|
|
370
371
|
export {
|
|
371
372
|
KanbanBoard as default
|
|
372
373
|
};
|