@stackcraftmx/calcita 0.32.1 → 0.47.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 +263 -2
- package/cli/packageVersions.js +12 -3
- package/cli/projectFiles.js +5 -2
- package/cli/templates/module/__Name__Page.test.jsx.tpl +24 -0
- package/cli/templates/project/README.md.tpl +14 -1
- package/cli/templates/project/src/app/appRouter.jsx.tpl +5 -2
- package/cli/templates/project/src/core/accountConnector.js.tpl +4 -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 +12 -0
- package/dist/DataTable/GoToPage.js +69 -13
- package/dist/DataTable/GoToPage.js.map +1 -1
- package/dist/DataTable/ServerTable.js +2 -0
- package/dist/DataTable/ServerTable.js.map +1 -1
- package/dist/DataTable/ServerTableFilterDrawer.js +52 -0
- package/dist/DataTable/ServerTableFilterDrawer.js.map +1 -0
- package/dist/DataTable/filterContext.js.map +1 -1
- package/dist/DataTable/goToPageOptions.js +17 -0
- package/dist/DataTable/goToPageOptions.js.map +1 -0
- package/dist/date-pickers.js +28 -2
- package/dist/date-pickers.js.map +1 -1
- package/dist/datePickers/DateInput.js +15 -34
- package/dist/datePickers/DateInput.js.map +1 -1
- package/dist/datePickers/DateTimeInput.js +75 -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 +58 -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 +55 -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 +22 -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/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/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/applyServerProblem.js +10 -3
- package/dist/forms/applyServerProblem.js.map +1 -1
- package/dist/forms/listRules.js +111 -0
- package/dist/forms/listRules.js.map +1 -0
- package/dist/forms/serverProblemFields.js +17 -0
- package/dist/forms/serverProblemFields.js.map +1 -1
- package/dist/forms.js +51 -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/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/applyServerProblem.js +8 -3
- package/dist/hookForm/applyServerProblem.js.map +1 -1
- package/dist/index.js +188 -100
- package/dist/index.js.map +1 -1
- package/dist/inputs/CatalogInput.js +74 -7
- package/dist/inputs/CatalogInput.js.map +1 -1
- package/dist/inputs/CheckboxGroupInput.js +100 -0
- package/dist/inputs/CheckboxGroupInput.js.map +1 -0
- package/dist/inputs/MaskedInput.js +86 -0
- package/dist/inputs/MaskedInput.js.map +1 -0
- package/dist/inputs/NumberInput.js +12 -1
- package/dist/inputs/NumberInput.js.map +1 -1
- package/dist/inputs/RepeatingFields.js +177 -0
- package/dist/inputs/RepeatingFields.js.map +1 -0
- package/dist/inputs/SelectInput.js +43 -5
- package/dist/inputs/SelectInput.js.map +1 -1
- package/dist/inputs/TransferListInput.js +215 -0
- package/dist/inputs/TransferListInput.js.map +1 -0
- 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/legal/CookieNotice.js +79 -0
- package/dist/legal/CookieNotice.js.map +1 -0
- package/dist/legal/TermsAcceptanceDialog.js +129 -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 +233 -1
- package/dist/locales/en.js.map +1 -1
- package/dist/locales/es.js +233 -1
- package/dist/locales/es.js.map +1 -1
- package/dist/mexico/CfdiSummary.js +81 -0
- package/dist/mexico/CfdiSummary.js.map +1 -0
- package/dist/mexico/EfirmaFields.js +167 -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 +86 -0
- package/dist/mexico/mexicoIdentifiers.js.map +1 -0
- package/dist/mexico/mexicoRules.js +16 -0
- package/dist/mexico/mexicoRules.js.map +1 -0
- package/dist/mexico.js +32 -0
- package/dist/mexico.js.map +1 -0
- package/dist/react-hook-form.js +40 -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 +108 -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 +26 -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/SessionsCard.js +11 -7
- package/dist/security/SessionsCard.js.map +1 -1
- package/dist/table.js +2 -0
- package/dist/table.js.map +1 -1
- package/dist/theme/components/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/types/DataTable/ServerTableFilterDrawer.d.ts +21 -0
- package/dist/types/DataTable/filterContext.d.ts +2 -1
- package/dist/types/DataTable/goToPageOptions.d.ts +15 -0
- package/dist/types/DataTable/index.d.ts +1 -0
- package/dist/types/date-pickers.d.ts +10 -1
- package/dist/types/datePickers/DateInput.d.ts +6 -4
- package/dist/types/datePickers/DateTimeInput.d.ts +50 -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 +39 -0
- package/dist/types/datePickers/PickerFrame.d.ts +22 -0
- package/dist/types/datePickers/TimeInput.d.ts +38 -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 +24 -0
- package/dist/types/dictionaries/dictionaries.d.ts +6 -3
- 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/FormRepeatingFields.d.ts +25 -0
- package/dist/types/forms/FormTransferListField.d.ts +7 -0
- package/dist/types/forms/index.d.ts +10 -1
- package/dist/types/forms/listRules.d.ts +48 -0
- package/dist/types/forms/serverProblemFields.d.ts +13 -0
- 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/FormRepeatingFields.d.ts +27 -0
- package/dist/types/hookForm/FormTransferListField.d.ts +8 -0
- package/dist/types/index.d.ts +25 -3
- package/dist/types/inputs/CatalogInput.d.ts +7 -1
- package/dist/types/inputs/CheckboxGroupInput.d.ts +39 -0
- package/dist/types/inputs/MaskedInput.d.ts +35 -0
- package/dist/types/inputs/RepeatingFields.d.ts +52 -0
- package/dist/types/inputs/SelectInput.d.ts +6 -1
- package/dist/types/inputs/TransferListInput.d.ts +43 -0
- 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/legal/CookieNotice.d.ts +30 -0
- package/dist/types/legal/TermsAcceptanceDialog.d.ts +32 -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 +232 -0
- package/dist/types/locales/es.d.ts +232 -0
- package/dist/types/mexico/CfdiSummary.d.ts +17 -0
- package/dist/types/mexico/EfirmaFields.d.ts +38 -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 +61 -0
- package/dist/types/mexico/mexicoRules.d.ts +29 -0
- package/dist/types/mexico.d.ts +11 -0
- package/dist/types/react-hook-form.d.ts +10 -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 +42 -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 +13 -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/table.d.ts +1 -1
- package/dist/types/ui/actions/ActionsMenu.d.ts +18 -3
- package/dist/types/ui/actions/CopyButton.d.ts +7 -4
- package/dist/types/ui/actions/tableRowText.d.ts +6 -0
- package/dist/types/ui/cards/RecordCard.d.ts +65 -0
- package/dist/types/ui/cards/RecordCardSkeleton.d.ts +17 -0
- package/dist/types/ui/countdown/Countdown.d.ts +31 -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 +21 -0
- package/dist/types/ui/filters/FilterDrawer.d.ts +34 -0
- package/dist/types/ui/filters/filterDrawerFields.d.ts +139 -0
- package/dist/types/ui/help/HelpButton.d.ts +15 -0
- package/dist/types/ui/help/HelpCarouselDialog.d.ts +35 -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/navigation/RouteTabs.d.ts +44 -0
- package/dist/types/ui/navigation/routeTabMatching.d.ts +27 -0
- package/dist/types/upload/AttachmentsInput.d.ts +62 -0
- package/dist/types/upload/FileChip.d.ts +18 -0
- package/dist/types/upload/FileDropzone.d.ts +3 -0
- package/dist/types/upload/FileInput.d.ts +48 -0
- package/dist/types/upload/FileUploadInput.d.ts +80 -0
- package/dist/types/upload/ImageInput.d.ts +53 -0
- package/dist/types/upload/TemplateDownloadButton.d.ts +39 -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 +98 -15
- package/dist/ui/actions/ActionsMenu.js.map +1 -1
- package/dist/ui/actions/CopyButton.js +31 -11
- package/dist/ui/actions/CopyButton.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 +145 -0
- package/dist/ui/cards/RecordCard.js.map +1 -0
- package/dist/ui/cards/RecordCardSkeleton.js +33 -0
- package/dist/ui/cards/RecordCardSkeleton.js.map +1 -0
- package/dist/ui/countdown/Countdown.js +38 -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 +81 -0
- package/dist/ui/documents/PdfViewerDialog.js.map +1 -0
- package/dist/ui/filters/FilterDrawer.js +211 -0
- package/dist/ui/filters/FilterDrawer.js.map +1 -0
- package/dist/ui/filters/filterDrawerFields.js +119 -0
- package/dist/ui/filters/filterDrawerFields.js.map +1 -0
- package/dist/ui/help/HelpButton.js +17 -0
- package/dist/ui/help/HelpButton.js.map +1 -0
- package/dist/ui/help/HelpCarouselDialog.js +154 -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/navigation/RouteTabs.js +75 -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/upload/AttachmentsInput.js +127 -0
- package/dist/upload/AttachmentsInput.js.map +1 -0
- package/dist/upload/FileChip.js +27 -0
- package/dist/upload/FileChip.js.map +1 -0
- package/dist/upload/FileDropzone.js +19 -84
- package/dist/upload/FileDropzone.js.map +1 -1
- package/dist/upload/FileInput.js +112 -0
- package/dist/upload/FileInput.js.map +1 -0
- package/dist/upload/FileUploadInput.js +285 -0
- package/dist/upload/FileUploadInput.js.map +1 -0
- package/dist/upload/ImageInput.js +125 -0
- package/dist/upload/ImageInput.js.map +1 -0
- package/dist/upload/TemplateDownloadButton.js +67 -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
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsxs, Fragment, jsx } from "react/jsx-runtime";
|
|
3
|
+
import { useState } from "react";
|
|
4
|
+
import Button from "@mui/material/Button";
|
|
5
|
+
import TuneRoundedIcon from "@mui/icons-material/TuneRounded";
|
|
6
|
+
import { useTableFilter } from "./filterContext.js";
|
|
7
|
+
import { useToolkitTranslation } from "../toolkit/useToolkitTranslation.js";
|
|
8
|
+
import { warnUnknownProps } from "../toolkit/unknownProps.js";
|
|
9
|
+
import FilterDrawer from "../ui/filters/FilterDrawer.js";
|
|
10
|
+
import { activeDrawerFilterCountOf } from "../ui/filters/filterDrawerFields.js";
|
|
11
|
+
function ServerTableFilterDrawer({ fields, anchor, width, title, buttonLabel, onApply, children, texts, ...unknownProps }) {
|
|
12
|
+
warnUnknownProps("ServerTableFilterDrawer", unknownProps);
|
|
13
|
+
const { t } = useToolkitTranslation("common", texts);
|
|
14
|
+
const { filters, setFilters } = useTableFilter();
|
|
15
|
+
const [isOpen, setIsOpen] = useState(false);
|
|
16
|
+
const activeCount = activeDrawerFilterCountOf(fields, filters);
|
|
17
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
18
|
+
/* @__PURE__ */ jsx(
|
|
19
|
+
Button,
|
|
20
|
+
{
|
|
21
|
+
size: "small",
|
|
22
|
+
variant: activeCount > 0 ? "contained" : "outlined",
|
|
23
|
+
startIcon: /* @__PURE__ */ jsx(TuneRoundedIcon, {}),
|
|
24
|
+
"aria-haspopup": "dialog",
|
|
25
|
+
onClick: () => setIsOpen(true),
|
|
26
|
+
children: activeCount > 0 ? t("filterDrawer.openWithCount", { count: activeCount }) : buttonLabel ?? t("filterDrawer.open")
|
|
27
|
+
}
|
|
28
|
+
),
|
|
29
|
+
/* @__PURE__ */ jsx(
|
|
30
|
+
FilterDrawer,
|
|
31
|
+
{
|
|
32
|
+
open: isOpen,
|
|
33
|
+
onClose: () => setIsOpen(false),
|
|
34
|
+
fields,
|
|
35
|
+
values: filters,
|
|
36
|
+
anchor,
|
|
37
|
+
width,
|
|
38
|
+
title,
|
|
39
|
+
texts,
|
|
40
|
+
onApply: (values) => {
|
|
41
|
+
setFilters(values);
|
|
42
|
+
onApply?.(values);
|
|
43
|
+
},
|
|
44
|
+
children
|
|
45
|
+
}
|
|
46
|
+
)
|
|
47
|
+
] });
|
|
48
|
+
}
|
|
49
|
+
export {
|
|
50
|
+
ServerTableFilterDrawer as default
|
|
51
|
+
};
|
|
52
|
+
//# sourceMappingURL=ServerTableFilterDrawer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ServerTableFilterDrawer.js","sources":["../../src/DataTable/ServerTableFilterDrawer.jsx"],"sourcesContent":["// El botón «Filtros» de ServerTable con su cajón de búsqueda (FilterDrawer): se pone en toolbarExtra y lee y cambia los\n// filtros de SU tabla (los de la dirección, los mismos de los chips). El botón dice cuántos filtros del cajón hay puestos.\n//\n// const FILTER_FIELDS = [{name: 'total', label: 'Total', kind: FILTER_FIELD_KIND.comparison, prefix: '$'}, …];\n// <ServerTable … filterDefaults={{...MIS_DEFAULTS, ...filterDrawerDefaultsOf(FILTER_FIELDS)}}\n// filterKinds={{...MIS_KINDS, ...filterDrawerKindsOf(FILTER_FIELDS)}}\n// chipConfig={buildChipConfig(filterDrawerChipsOf(FILTER_FIELDS, {t, formatDate}))}\n// toolbarExtra={<ServerTableFilterDrawer fields={FILTER_FIELDS} />} />\n//\n// filterDefaults: la tabla solo guarda en la dirección lo que declara ahí. filterKinds: las listas se leen como lista. Los\n// chips dicen cada filtro en palabras y cada uno se quita con su ×.\n//\n// Genérico del paquete: function (regla de la casa).\nimport {useState} from 'react';\nimport Button from '@mui/material/Button';\nimport TuneRoundedIcon from '@mui/icons-material/TuneRounded';\n\nimport {useTableFilter} from '@/DataTable/filterContext.js';\nimport {useToolkitTranslation} from '@/toolkit/useToolkitTranslation.js';\nimport {warnUnknownProps} from '@/toolkit/unknownProps.js';\nimport FilterDrawer from '@/ui/filters/FilterDrawer.jsx';\nimport {activeDrawerFilterCountOf} from '@/ui/filters/filterDrawerFields.js';\n\n/**\n * @param {object} props\n * @param {object[]} props.fields los campos del cajón (filterDrawerFields.js)\n * @param {'left'|'right'} [props.anchor] de qué lado sale; por omisión la derecha\n * @param {number} [props.width] su ancho en escritorio\n * @param {string} [props.title] ya traducido; por omisión «Filtros»\n * @param {string} [props.buttonLabel] ya traducido; por omisión «Filtros» (con los puestos, «Filtros (3)»)\n * @param {(values: Record<string, unknown>) => void} [props.onApply] aviso de lo que se buscó (la tabla ya se filtró)\n * @param {import('react').ReactNode} [props.children] algo más abajo de los campos del cajón\n * @param {object} [props.texts] los textos que cambian, con la forma de `common` en los textos del paquete\n */\nexport default function ServerTableFilterDrawer({fields, anchor, width, title, buttonLabel, onApply, children, texts, ...unknownProps}) {\n warnUnknownProps('ServerTableFilterDrawer', unknownProps);\n const {t} = useToolkitTranslation('common', texts);\n const {filters, setFilters} = useTableFilter();\n const [isOpen, setIsOpen] = useState(false);\n const activeCount = activeDrawerFilterCountOf(fields, filters);\n\n return (\n <>\n <Button size=\"small\" variant={activeCount > 0 ? 'contained' : 'outlined'} startIcon={<TuneRoundedIcon />}\n aria-haspopup=\"dialog\" onClick={() => setIsOpen(true)}>\n {activeCount > 0 ? t('filterDrawer.openWithCount', {count: activeCount}) : (buttonLabel ?? t('filterDrawer.open'))}\n </Button>\n <FilterDrawer open={isOpen} onClose={() => setIsOpen(false)} fields={fields} values={filters} anchor={anchor} width={width} title={title}\n texts={texts}\n onApply={(values) => {\n setFilters(values);\n onApply?.(values);\n }}>\n {children}\n </FilterDrawer>\n </>\n );\n}\n"],"names":[],"mappings":";;;;;;;;;;AAkCA,SAAwB,wBAAwB,EAAC,QAAQ,QAAQ,OAAO,OAAO,aAAa,SAAS,UAAU,OAAO,GAAG,aAAA,GAAe;AACpI,mBAAiB,2BAA2B,YAAY;AACxD,QAAM,EAAC,EAAA,IAAK,sBAAsB,UAAU,KAAK;AACjD,QAAM,EAAC,SAAS,WAAA,IAAc,eAAA;AAC9B,QAAM,CAAC,QAAQ,SAAS,IAAI,SAAS,KAAK;AAC1C,QAAM,cAAc,0BAA0B,QAAQ,OAAO;AAE7D,SACI,qBAAA,UAAA,EACI,UAAA;AAAA,IAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QAAO,MAAK;AAAA,QAAQ,SAAS,cAAc,IAAI,cAAc;AAAA,QAAY,+BAAY,iBAAA,EAAgB;AAAA,QAC9F,iBAAc;AAAA,QAAS,SAAS,MAAM,UAAU,IAAI;AAAA,QACvD,UAAA,cAAc,IAAI,EAAE,8BAA8B,EAAC,OAAO,YAAA,CAAY,IAAK,eAAe,EAAE,mBAAmB;AAAA,MAAA;AAAA,IAAA;AAAA,IAEpH;AAAA,MAAC;AAAA,MAAA;AAAA,QAAa,MAAM;AAAA,QAAQ,SAAS,MAAM,UAAU,KAAK;AAAA,QAAG;AAAA,QAAgB,QAAQ;AAAA,QAAS;AAAA,QAAgB;AAAA,QAAc;AAAA,QAC9G;AAAA,QACA,SAAS,CAAC,WAAW;AACjB,qBAAW,MAAM;AACjB,oBAAU,MAAM;AAAA,QACpB;AAAA,QACT;AAAA,MAAA;AAAA,IAAA;AAAA,EACL,GACJ;AAER;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"filterContext.js","sources":["../../src/DataTable/filterContext.js"],"sourcesContent":["// Contexto que comparten los encabezados de columna con la tabla.\n//\n// Existe para que renderHeader de cada columna no reciba media docena de props: el encabezado pide lo que necesita\n// (el filtro de SU campo, el orden y las facetas del servidor) y la tabla no se entera.\n//\n// Funciones puras, no renderizan: function (regla de la casa).\nimport {createContext, useContext} from 'react';\n\nexport const TableFilterContext = createContext(null);\n\n/**\n * @returns {{filters: object, setFilter: Function, clearFilter: Function, sortOrders: Array, toggleSort: Function, clearSort: Function, facets: object}}\n */\nexport function useTableFilter() {\n const tableFilterValue = useContext(TableFilterContext);\n if (!tableFilterValue) {\n // mejor tronar aquí que pintar un encabezado muerto que no filtra y nadie entiende por qué\n throw new Error('Un encabezado de columna se montó fuera de <ServerTable>.');\n }\n return tableFilterValue;\n}\n"],"names":[],"mappings":";;AAQY,MAAC,qBAAqB,cAAc,IAAI;AAK7C,SAAS,iBAAiB;AAC7B,QAAM,mBAAmB,WAAW,kBAAkB;AACtD,MAAI,CAAC,kBAAkB;AAEnB,UAAM,IAAI,MAAM,2DAA2D;AAAA,EAC/E;AACA,SAAO;AACX;"}
|
|
1
|
+
{"version":3,"file":"filterContext.js","sources":["../../src/DataTable/filterContext.js"],"sourcesContent":["// Contexto que comparten los encabezados de columna con la tabla.\n//\n// Existe para que renderHeader de cada columna no reciba media docena de props: el encabezado pide lo que necesita\n// (el filtro de SU campo, el orden y las facetas del servidor) y la tabla no se entera.\n//\n// Funciones puras, no renderizan: function (regla de la casa).\nimport {createContext, useContext} from 'react';\n\nexport const TableFilterContext = createContext(null);\n\n/**\n * @returns {{filters: object, setFilter: Function, setFilters: Function, clearFilter: Function, sortOrders: Array, toggleSort: Function, clearSort: Function, facets: object}}\n */\nexport function useTableFilter() {\n const tableFilterValue = useContext(TableFilterContext);\n if (!tableFilterValue) {\n // mejor tronar aquí que pintar un encabezado muerto que no filtra y nadie entiende por qué\n throw new Error('Un encabezado de columna se montó fuera de <ServerTable>.');\n }\n return tableFilterValue;\n}\n"],"names":[],"mappings":";;AAQY,MAAC,qBAAqB,cAAc,IAAI;AAK7C,SAAS,iBAAiB;AAC7B,QAAM,mBAAmB,WAAW,kBAAkB;AACtD,MAAI,CAAC,kBAAkB;AAEnB,UAAM,IAAI,MAAM,2DAA2D;AAAA,EAC/E;AACA,SAAO;AACX;"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
function pageNumbersOf(pageCount) {
|
|
2
|
+
return Array.from({ length: pageCount }, (unused, position) => position + 1);
|
|
3
|
+
}
|
|
4
|
+
function filterPages(pageNumbers, { inputValue }) {
|
|
5
|
+
const typedText = inputValue.trim();
|
|
6
|
+
if (!typedText) {
|
|
7
|
+
return pageNumbers;
|
|
8
|
+
}
|
|
9
|
+
const startingWith = pageNumbers.filter((pageNumber) => String(pageNumber).startsWith(typedText));
|
|
10
|
+
const containing = pageNumbers.filter((pageNumber) => !String(pageNumber).startsWith(typedText) && String(pageNumber).includes(typedText));
|
|
11
|
+
return [...startingWith, ...containing];
|
|
12
|
+
}
|
|
13
|
+
export {
|
|
14
|
+
filterPages,
|
|
15
|
+
pageNumbersOf
|
|
16
|
+
};
|
|
17
|
+
//# sourceMappingURL=goToPageOptions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"goToPageOptions.js","sources":["../../src/DataTable/goToPageOptions.js"],"sourcesContent":["// «Ir a la página N»: qué páginas enseña la lista según lo que se teclea.\n//\n// Sin recorte: GoToPage pinta solo las páginas que se ven (react-window), así que la lista puede traer decenas de miles de\n// páginas y deslizarse hasta la última. Al teclear, primero las que EMPIEZAN con lo tecleado (13 da 13, 130, 131...) y\n// después las que lo contienen (213, 1013...).\n//\n// Puro (sin React): se prueba con node (goToPageOptions.test.js).\n//\n// Genérico del paquete: function (regla de la casa).\n\n/**\n * @param {number} pageCount cuántas páginas tiene la tabla\n * @returns {number[]} las páginas como las cuenta una persona: 1, 2, 3... pageCount\n */\nexport function pageNumbersOf(pageCount) {\n return Array.from({length: pageCount}, (unused, position) => position + 1);\n}\n\n/**\n * filterOptions del Autocomplete.\n *\n * @param {number[]} pageNumbers todas las páginas\n * @param {{inputValue: string}} state lo que lleva tecleado la persona\n * @returns {number[]} sin teclear, todas; tecleando, primero las que empiezan así y luego las que lo contienen\n */\nexport function filterPages(pageNumbers, {inputValue}) {\n const typedText = inputValue.trim();\n if (!typedText) {\n return pageNumbers;\n }\n\n const startingWith = pageNumbers.filter((pageNumber) => String(pageNumber).startsWith(typedText));\n const containing = pageNumbers.filter((pageNumber) => !String(pageNumber).startsWith(typedText) && String(pageNumber).includes(typedText));\n return [...startingWith, ...containing];\n}\n"],"names":[],"mappings":"AAcO,SAAS,cAAc,WAAW;AACrC,SAAO,MAAM,KAAK,EAAC,QAAQ,UAAS,GAAG,CAAC,QAAQ,aAAa,WAAW,CAAC;AAC7E;AASO,SAAS,YAAY,aAAa,EAAC,WAAU,GAAG;AACnD,QAAM,YAAY,WAAW,KAAI;AACjC,MAAI,CAAC,WAAW;AACZ,WAAO;AAAA,EACX;AAEA,QAAM,eAAe,YAAY,OAAO,CAAC,eAAe,OAAO,UAAU,EAAE,WAAW,SAAS,CAAC;AAChG,QAAM,aAAa,YAAY,OAAO,CAAC,eAAe,CAAC,OAAO,UAAU,EAAE,WAAW,SAAS,KAAK,OAAO,UAAU,EAAE,SAAS,SAAS,CAAC;AACzI,SAAO,CAAC,GAAG,cAAc,GAAG,UAAU;AAC1C;"}
|
package/dist/date-pickers.js
CHANGED
|
@@ -1,8 +1,34 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { default as default2 } from "./datePickers/DateInput.js";
|
|
2
2
|
import { default as default3 } from "./datePickers/FormDateField.js";
|
|
3
|
+
import { default as default4 } from "./datePickers/DateTimeInput.js";
|
|
4
|
+
import { default as default5 } from "./datePickers/FormDateTimeField.js";
|
|
5
|
+
import { default as default6 } from "./datePickers/TimeInput.js";
|
|
6
|
+
import { default as default7 } from "./datePickers/FormTimeField.js";
|
|
7
|
+
import { default as default8 } from "./datePickers/MonthInput.js";
|
|
8
|
+
import { default as default9 } from "./datePickers/FormMonthField.js";
|
|
9
|
+
import { CALENDAR_DATE_FORMAT, CALENDAR_MONTH_FORMAT, DEFAULT_MINUTES_STEP, INSTANT_FORMAT, TIME_OF_DAY_FORMAT, earliestInstantFromNow, instantPlusMinutes, latestInstantOf, timeZoneNameOf } from "./datePickers/pickerValues.js";
|
|
10
|
+
import { minutesAfterRule, minutesFromNowRule } from "./datePickers/dateTimeRules.js";
|
|
11
|
+
import { useCurrentMinute } from "./datePickers/useCurrentMinute.js";
|
|
3
12
|
export {
|
|
4
13
|
CALENDAR_DATE_FORMAT,
|
|
14
|
+
CALENDAR_MONTH_FORMAT,
|
|
15
|
+
DEFAULT_MINUTES_STEP,
|
|
5
16
|
default2 as DateInput,
|
|
6
|
-
|
|
17
|
+
default4 as DateTimeInput,
|
|
18
|
+
default3 as FormDateField,
|
|
19
|
+
default5 as FormDateTimeField,
|
|
20
|
+
default9 as FormMonthField,
|
|
21
|
+
default7 as FormTimeField,
|
|
22
|
+
INSTANT_FORMAT,
|
|
23
|
+
default8 as MonthInput,
|
|
24
|
+
TIME_OF_DAY_FORMAT,
|
|
25
|
+
default6 as TimeInput,
|
|
26
|
+
earliestInstantFromNow,
|
|
27
|
+
instantPlusMinutes,
|
|
28
|
+
latestInstantOf,
|
|
29
|
+
minutesAfterRule,
|
|
30
|
+
minutesFromNowRule,
|
|
31
|
+
timeZoneNameOf,
|
|
32
|
+
useCurrentMinute
|
|
7
33
|
};
|
|
8
34
|
//# sourceMappingURL=date-pickers.js.map
|
package/dist/date-pickers.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"date-pickers.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"date-pickers.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;"}
|
|
@@ -1,21 +1,11 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { jsx } from "react/jsx-runtime";
|
|
3
|
-
import { useId } from "react";
|
|
4
3
|
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
4
|
import { DatePicker } from "@mui/x-date-pickers/DatePicker";
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
import FieldFrame from "../inputs/FieldFrame.js";
|
|
5
|
+
import PickerFrame, { textFieldSlotPropsOf } from "./PickerFrame.js";
|
|
6
|
+
import { CALENDAR_DATE_FORMAT } from "./pickerValues.js";
|
|
7
|
+
import { usePickerField } from "./usePickerField.js";
|
|
13
8
|
import { warnUnknownProps } from "../toolkit/unknownProps.js";
|
|
14
|
-
const CALENDAR_DATE_FORMAT = "YYYY-MM-DD";
|
|
15
|
-
const DATE_LOOK_BY_LANGUAGE = Object.freeze({
|
|
16
|
-
es: { adapterLocale: "es", displayFormat: "DD/MM/YYYY", localeText: esES.components.MuiLocalizationProvider.defaultProps.localeText },
|
|
17
|
-
en: { adapterLocale: "en", displayFormat: "MM/DD/YYYY", localeText: enUS.components.MuiLocalizationProvider.defaultProps.localeText }
|
|
18
|
-
});
|
|
19
9
|
function pickerValueOf(calendarDate) {
|
|
20
10
|
return calendarDate ? dayjs(calendarDate) : null;
|
|
21
11
|
}
|
|
@@ -34,19 +24,17 @@ function DateInput({
|
|
|
34
24
|
openTo = "day",
|
|
35
25
|
disabled = false,
|
|
36
26
|
inputRef,
|
|
27
|
+
pickerProps,
|
|
37
28
|
texts,
|
|
38
29
|
...unknownProps
|
|
39
30
|
}) {
|
|
40
31
|
warnUnknownProps("DateInput", unknownProps);
|
|
41
|
-
const {
|
|
42
|
-
|
|
43
|
-
const inputId = `${name ?? "date"}-${generatedId}`;
|
|
44
|
-
const errorText = translateValidationMessage(t, error);
|
|
45
|
-
const look = DATE_LOOK_BY_LANGUAGE[language] ?? DATE_LOOK_BY_LANGUAGE.es;
|
|
46
|
-
return /* @__PURE__ */ jsx(FieldFrame, { inputId, label, children: /* @__PURE__ */ jsx(LocalizationProvider, { dateAdapter: AdapterDayjs, adapterLocale: look.adapterLocale, localeText: look.localeText, children: /* @__PURE__ */ jsx(
|
|
32
|
+
const { language, inputId, errorText, formats } = usePickerField({ name, kind: "date", error, texts });
|
|
33
|
+
return /* @__PURE__ */ jsx(PickerFrame, { inputId, label, language, children: /* @__PURE__ */ jsx(
|
|
47
34
|
DatePicker,
|
|
48
35
|
{
|
|
49
|
-
|
|
36
|
+
...pickerProps,
|
|
37
|
+
format: formats.date,
|
|
50
38
|
value: pickerValueOf(value),
|
|
51
39
|
minDate: pickerValueOf(minDate) ?? void 0,
|
|
52
40
|
maxDate: pickerValueOf(maxDate) ?? void 0,
|
|
@@ -54,23 +42,16 @@ function DateInput({
|
|
|
54
42
|
disablePast,
|
|
55
43
|
disabled,
|
|
56
44
|
openTo,
|
|
57
|
-
views: openTo === "year" ? ["year", "month", "day"] :
|
|
45
|
+
views: openTo === "year" ? ["year", "month", "day"] : pickerProps?.views,
|
|
58
46
|
inputRef,
|
|
59
47
|
onChange: (pickedDate) => onChange(pickedDate?.isValid() ? pickedDate.format(CALENDAR_DATE_FORMAT) : ""),
|
|
60
|
-
onClose:
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
size: "small",
|
|
66
|
-
fullWidth: true,
|
|
67
|
-
onBlur,
|
|
68
|
-
error: Boolean(errorText),
|
|
69
|
-
helperText: errorText ?? helperText
|
|
70
|
-
}
|
|
71
|
-
}
|
|
48
|
+
onClose: () => {
|
|
49
|
+
pickerProps?.onClose?.();
|
|
50
|
+
onBlur?.();
|
|
51
|
+
},
|
|
52
|
+
slotProps: textFieldSlotPropsOf({ id: inputId, name, onBlur, error: Boolean(errorText), helperText: errorText ?? helperText }, pickerProps)
|
|
72
53
|
}
|
|
73
|
-
) })
|
|
54
|
+
) });
|
|
74
55
|
}
|
|
75
56
|
export {
|
|
76
57
|
CALENDAR_DATE_FORMAT,
|
|
@@ -1 +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
|
|
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 (PickerFrame): la pantalla no tiene que poner nada alrededor.\n//\n// Genérico del paquete: function (regla de la casa).\nimport dayjs from 'dayjs';\nimport {DatePicker} from '@mui/x-date-pickers/DatePicker';\n\nimport PickerFrame, {textFieldSlotPropsOf} from '@/datePickers/PickerFrame.jsx';\nimport {CALENDAR_DATE_FORMAT} from '@/datePickers/pickerValues.js';\nimport {usePickerField} from '@/datePickers/usePickerField.js';\nimport {warnUnknownProps} from '@/toolkit/unknownProps.js';\n\nexport {CALENDAR_DATE_FORMAT};\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 * @param {object} [props.pickerProps] lo demás del DatePicker de MUI X que aquí no tiene nombre (shouldDisableDate, slots,\n * slotProps…); value y onChange son del campo\n * @param {object} [props.texts] los textos que cambian, con la forma de `common` en los textos del paquete\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, pickerProps, texts,\n ...unknownProps\n}) {\n warnUnknownProps('DateInput', unknownProps);\n const {language, inputId, errorText, formats} = usePickerField({name, kind: 'date', error, texts});\n\n return (\n <PickerFrame inputId={inputId} label={label} language={language}>\n <DatePicker\n {...pickerProps}\n format={formats.date}\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'] : pickerProps?.views}\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={() => {\n pickerProps?.onClose?.();\n onBlur?.();\n }}\n slotProps={textFieldSlotPropsOf({id: inputId, name, onBlur, error: Boolean(errorText), helperText: errorText ?? helperText}, pickerProps)}\n />\n </PickerFrame>\n );\n}\n"],"names":[],"mappings":";;;;;;;;AA0BA,SAAS,cAAc,cAAc;AAEjC,SAAO,eAAe,MAAM,YAAY,IAAI;AAChD;AAsBA,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;AAAA,EAAU;AAAA,EAAa;AAAA,EACzD,GAAG;AACP,GAAG;AACC,mBAAiB,aAAa,YAAY;AAC1C,QAAM,EAAC,UAAU,SAAS,WAAW,QAAA,IAAW,eAAe,EAAC,MAAM,MAAM,QAAQ,OAAO,OAAM;AAEjG,SACI,oBAAC,aAAA,EAAY,SAAkB,OAAc,UACzC,UAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACI,GAAG;AAAA,MACJ,QAAQ,QAAQ;AAAA,MAChB,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;AAAA,MACnE;AAAA,MAEA,UAAU,CAAC,eAAe,SAAS,YAAY,YAAY,WAAW,OAAO,oBAAoB,IAAI,EAAE;AAAA,MACvG,SAAS,MAAM;AACX,qBAAa,UAAA;AACb,iBAAA;AAAA,MACJ;AAAA,MACA,WAAW,qBAAqB,EAAC,IAAI,SAAS,MAAM,QAAQ,OAAO,QAAQ,SAAS,GAAG,YAAY,aAAa,WAAA,GAAa,WAAW;AAAA,IAAA;AAAA,EAAA,GAEhJ;AAER;"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx } from "react/jsx-runtime";
|
|
3
|
+
import { DateTimePicker } from "@mui/x-date-pickers/DateTimePicker";
|
|
4
|
+
import PickerFrame, { textFieldSlotPropsOf } from "./PickerFrame.js";
|
|
5
|
+
import { timeZoneNameOf, latestInstantOf, earliestInstantFromNow, DEFAULT_MINUTES_STEP, instantTextOf, pickerInstantOf } from "./pickerValues.js";
|
|
6
|
+
import { useCurrentMinute } from "./useCurrentMinute.js";
|
|
7
|
+
import { usePickerField } from "./usePickerField.js";
|
|
8
|
+
import { intlLocaleOf } from "../toolkit/toolkitSettings.js";
|
|
9
|
+
import { useToolkitSettings } from "../toolkit/toolkitContext.js";
|
|
10
|
+
import { warnUnknownProps } from "../toolkit/unknownProps.js";
|
|
11
|
+
const HELPER_SEPARATOR = " · ";
|
|
12
|
+
function DateTimeInput({
|
|
13
|
+
name,
|
|
14
|
+
label,
|
|
15
|
+
value,
|
|
16
|
+
onChange,
|
|
17
|
+
onBlur,
|
|
18
|
+
error,
|
|
19
|
+
helperText,
|
|
20
|
+
minDateTime,
|
|
21
|
+
minimumMinutesFromNow,
|
|
22
|
+
maxDateTime,
|
|
23
|
+
disableFuture = false,
|
|
24
|
+
disablePast = false,
|
|
25
|
+
minutesStep = DEFAULT_MINUTES_STEP,
|
|
26
|
+
timeZone,
|
|
27
|
+
showTimeZone = true,
|
|
28
|
+
timeZoneLabel,
|
|
29
|
+
disabled = false,
|
|
30
|
+
inputRef,
|
|
31
|
+
pickerProps,
|
|
32
|
+
texts,
|
|
33
|
+
...unknownProps
|
|
34
|
+
}) {
|
|
35
|
+
warnUnknownProps("DateTimeInput", unknownProps);
|
|
36
|
+
const field = usePickerField({ name, kind: "dateTime", error, texts });
|
|
37
|
+
const { languages } = useToolkitSettings();
|
|
38
|
+
const shownTimeZone = timeZone ?? field.timeZone;
|
|
39
|
+
const zoneText = showTimeZone ? timeZoneLabel ?? timeZoneNameOf(shownTimeZone, intlLocaleOf(field.language, languages)) : null;
|
|
40
|
+
const helperLine = [helperText, zoneText].filter(Boolean).join(HELPER_SEPARATOR) || " ";
|
|
41
|
+
const hasClockRule = minimumMinutesFromNow != null;
|
|
42
|
+
const currentMinute = useCurrentMinute(hasClockRule);
|
|
43
|
+
const earliest = latestInstantOf(minDateTime, hasClockRule ? earliestInstantFromNow(minimumMinutesFromNow, currentMinute) : "");
|
|
44
|
+
return /* @__PURE__ */ jsx(PickerFrame, { inputId: field.inputId, label, language: field.language, children: /* @__PURE__ */ jsx(
|
|
45
|
+
DateTimePicker,
|
|
46
|
+
{
|
|
47
|
+
...pickerProps,
|
|
48
|
+
timezone: shownTimeZone,
|
|
49
|
+
format: field.formats.dateTime,
|
|
50
|
+
ampm: field.formats.ampm,
|
|
51
|
+
value: pickerInstantOf(value, shownTimeZone),
|
|
52
|
+
minDateTime: pickerInstantOf(earliest, shownTimeZone) ?? void 0,
|
|
53
|
+
maxDateTime: pickerInstantOf(maxDateTime, shownTimeZone) ?? void 0,
|
|
54
|
+
disableFuture,
|
|
55
|
+
disablePast,
|
|
56
|
+
disabled,
|
|
57
|
+
minutesStep,
|
|
58
|
+
timeSteps: { minutes: minutesStep, ...pickerProps?.timeSteps },
|
|
59
|
+
inputRef,
|
|
60
|
+
onChange: (pickedValue) => onChange(instantTextOf(pickedValue)),
|
|
61
|
+
onClose: () => {
|
|
62
|
+
pickerProps?.onClose?.();
|
|
63
|
+
onBlur?.();
|
|
64
|
+
},
|
|
65
|
+
slotProps: textFieldSlotPropsOf(
|
|
66
|
+
{ id: field.inputId, name, onBlur, error: Boolean(field.errorText), helperText: field.errorText ?? helperLine },
|
|
67
|
+
pickerProps
|
|
68
|
+
)
|
|
69
|
+
}
|
|
70
|
+
) });
|
|
71
|
+
}
|
|
72
|
+
export {
|
|
73
|
+
DateTimeInput as default
|
|
74
|
+
};
|
|
75
|
+
//# sourceMappingURL=DateTimeInput.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DateTimeInput.js","sources":["../../src/datePickers/DateTimeInput.jsx"],"sourcesContent":["// Campo de FECHA CON HORA suelto con el DateTimePicker de MUI X (@stackcraftmx/calcita/date-pickers), para un instante:\n// una cita, un envío programado, «posponer hasta».\n//\n// Viaja como instante en UTC ('2026-11-01T18:30:00Z') y se pinta en la zona del proveedor (ToolkitProvider timeZone),\n// rotulada abajo con su nombre («Hora estándar central»): quien lo ve sabe en qué hora está escribiendo aunque su equipo\n// esté en otra zona. Lee también lo que llega del servidor con desfase ('…-06:00'). '' = vacío. La hora sale de 24 horas o\n// con a.m. y p.m. según el hourCycle del proveedor.\n//\n// Los minutos van de uno en uno (minutesStep los cambia). Para «al menos N minutos después de ahora» (publicar con\n// anticipación) está minimumMinutesFromNow: el mínimo se recorre solo con el reloj mientras la pantalla está abierta. Para\n// «el fin, al menos N minutos después del inicio», minDateTime={instantPlusMinutes(startsAt, N)}. Con formik, las mismas\n// reglas en yup: minutesFromNowRule y minutesAfterRule (el servidor vuelve a revisar).\n//\n// Para una hora del día sin fecha («abre a las 09:00») va TimeInput; para una fecha sin hora, DateInput.\n//\n// Genérico del paquete: function (regla de la casa).\nimport {DateTimePicker} from '@mui/x-date-pickers/DateTimePicker';\n\nimport PickerFrame, {textFieldSlotPropsOf} from '@/datePickers/PickerFrame.jsx';\nimport {\n DEFAULT_MINUTES_STEP, earliestInstantFromNow, instantTextOf, latestInstantOf, pickerInstantOf, timeZoneNameOf,\n} from '@/datePickers/pickerValues.js';\nimport {useCurrentMinute} from '@/datePickers/useCurrentMinute.js';\nimport {usePickerField} from '@/datePickers/usePickerField.js';\nimport {intlLocaleOf} from '@/toolkit/toolkitSettings.js';\nimport {useToolkitSettings} from '@/toolkit/toolkitContext.js';\nimport {warnUnknownProps} from '@/toolkit/unknownProps.js';\n\n// entre la ayuda de la pantalla y el nombre de la zona\nconst HELPER_SEPARATOR = ' · ';\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 el instante ('2026-11-01T18:30:00Z' o con desfase) o ''\n * @param {(value: string) => void} props.onChange recibe el instante en UTC ('' al borrar o a medias)\n * @param {() => void} [props.onBlur]\n * @param {string|{key: string, values?: object}} [props.error]\n * @param {string} [props.helperText] ya traducida; va antes del nombre de la zona\n * @param {string} [props.minDateTime] instante (el fin de algo: instantPlusMinutes(startsAt, 30))\n * @param {number} [props.minimumMinutesFromNow] al menos tantos minutos después de ahora; se recorre con el reloj\n * @param {string} [props.maxDateTime] instante\n * @param {boolean} [props.disableFuture]\n * @param {boolean} [props.disablePast] p. ej. un envío programado\n * @param {number} [props.minutesStep] de cuánto en cuánto van los minutos; por omisión de uno en uno (15 para citas de\n * cuarto de hora)\n * @param {string} [props.timeZone] otra zona que la del proveedor (la de una sucursal); rotulada igual\n * @param {boolean} [props.showTimeZone] false quita el nombre de la zona de abajo (por omisión se ve)\n * @param {string} [props.timeZoneLabel] ya traducido, en lugar del nombre que da el navegador\n * @param {boolean} [props.disabled]\n * @param {import('react').Ref<HTMLInputElement>} [props.inputRef]\n * @param {object} [props.pickerProps] lo demás del DateTimePicker de MUI X que aquí no tiene nombre (views, shouldDisableDate,\n * slots, slotProps…); value y onChange son del campo\n * @param {object} [props.texts] los textos que cambian, con la forma de `common` en los textos del paquete\n */\nexport default function DateTimeInput({\n name, label, value, onChange, onBlur, error, helperText, minDateTime, minimumMinutesFromNow, maxDateTime, disableFuture = false,\n disablePast = false, minutesStep = DEFAULT_MINUTES_STEP, timeZone, showTimeZone = true, timeZoneLabel, disabled = false, inputRef, pickerProps, texts,\n ...unknownProps\n}) {\n warnUnknownProps('DateTimeInput', unknownProps);\n const field = usePickerField({name, kind: 'dateTime', error, texts});\n const {languages} = useToolkitSettings();\n const shownTimeZone = timeZone ?? field.timeZone;\n const zoneText = showTimeZone ? (timeZoneLabel ?? timeZoneNameOf(shownTimeZone, intlLocaleOf(field.language, languages))) : null;\n const helperLine = [helperText, zoneText].filter(Boolean).join(HELPER_SEPARATOR) || ' ';\n // el mínimo que de verdad aplica: el que da la pantalla o el de «ahora + N minutos», el más tarde\n const hasClockRule = minimumMinutesFromNow != null;\n const currentMinute = useCurrentMinute(hasClockRule);\n const earliest = latestInstantOf(minDateTime, hasClockRule ? earliestInstantFromNow(minimumMinutesFromNow, currentMinute) : '');\n\n return (\n <PickerFrame inputId={field.inputId} label={label} language={field.language}>\n <DateTimePicker\n {...pickerProps}\n timezone={shownTimeZone}\n format={field.formats.dateTime}\n ampm={field.formats.ampm}\n value={pickerInstantOf(value, shownTimeZone)}\n minDateTime={pickerInstantOf(earliest, shownTimeZone) ?? undefined}\n maxDateTime={pickerInstantOf(maxDateTime, shownTimeZone) ?? undefined}\n disableFuture={disableFuture}\n disablePast={disablePast}\n disabled={disabled}\n minutesStep={minutesStep}\n timeSteps={{minutes: minutesStep, ...pickerProps?.timeSteps}}\n inputRef={inputRef}\n onChange={(pickedValue) => onChange(instantTextOf(pickedValue))}\n onClose={() => {\n pickerProps?.onClose?.();\n onBlur?.();\n }}\n slotProps={textFieldSlotPropsOf(\n {id: field.inputId, name, onBlur, error: Boolean(field.errorText), helperText: field.errorText ?? helperLine},\n pickerProps,\n )}\n />\n </PickerFrame>\n );\n}\n"],"names":[],"mappings":";;;;;;;;;;AA6BA,MAAM,mBAAmB;AA2BzB,SAAwB,cAAc;AAAA,EAClC;AAAA,EAAM;AAAA,EAAO;AAAA,EAAO;AAAA,EAAU;AAAA,EAAQ;AAAA,EAAO;AAAA,EAAY;AAAA,EAAa;AAAA,EAAuB;AAAA,EAAa,gBAAgB;AAAA,EAC1H,cAAc;AAAA,EAAO,cAAc;AAAA,EAAsB;AAAA,EAAU,eAAe;AAAA,EAAM;AAAA,EAAe,WAAW;AAAA,EAAO;AAAA,EAAU;AAAA,EAAa;AAAA,EAChJ,GAAG;AACP,GAAG;AACC,mBAAiB,iBAAiB,YAAY;AAC9C,QAAM,QAAQ,eAAe,EAAC,MAAM,MAAM,YAAY,OAAO,OAAM;AACnE,QAAM,EAAC,UAAA,IAAa,mBAAA;AACpB,QAAM,gBAAgB,YAAY,MAAM;AACxC,QAAM,WAAW,eAAgB,iBAAiB,eAAe,eAAe,aAAa,MAAM,UAAU,SAAS,CAAC,IAAK;AAC5H,QAAM,aAAa,CAAC,YAAY,QAAQ,EAAE,OAAO,OAAO,EAAE,KAAK,gBAAgB,KAAK;AAEpF,QAAM,eAAe,yBAAyB;AAC9C,QAAM,gBAAgB,iBAAiB,YAAY;AACnD,QAAM,WAAW,gBAAgB,aAAa,eAAe,uBAAuB,uBAAuB,aAAa,IAAI,EAAE;AAE9H,SACI,oBAAC,eAAY,SAAS,MAAM,SAAS,OAAc,UAAU,MAAM,UAC/D,UAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACI,GAAG;AAAA,MACJ,UAAU;AAAA,MACV,QAAQ,MAAM,QAAQ;AAAA,MACtB,MAAM,MAAM,QAAQ;AAAA,MACpB,OAAO,gBAAgB,OAAO,aAAa;AAAA,MAC3C,aAAa,gBAAgB,UAAU,aAAa,KAAK;AAAA,MACzD,aAAa,gBAAgB,aAAa,aAAa,KAAK;AAAA,MAC5D;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,WAAW,EAAC,SAAS,aAAa,GAAG,aAAa,UAAA;AAAA,MAClD;AAAA,MACA,UAAU,CAAC,gBAAgB,SAAS,cAAc,WAAW,CAAC;AAAA,MAC9D,SAAS,MAAM;AACX,qBAAa,UAAA;AACb,iBAAA;AAAA,MACJ;AAAA,MACA,WAAW;AAAA,QACP,EAAC,IAAI,MAAM,SAAS,MAAM,QAAQ,OAAO,QAAQ,MAAM,SAAS,GAAG,YAAY,MAAM,aAAa,WAAA;AAAA,QAClG;AAAA,MAAA;AAAA,IACJ;AAAA,EAAA,GAER;AAER;"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx } from "react/jsx-runtime";
|
|
3
|
+
import DateTimeInput from "./DateTimeInput.js";
|
|
4
|
+
import { useFormikField } from "../forms/useFormikField.js";
|
|
5
|
+
function FormDateTimeField({ name, ...inputProps }) {
|
|
6
|
+
const fieldProps = useFormikField(name);
|
|
7
|
+
return /* @__PURE__ */ jsx(DateTimeInput, { ...inputProps, ...fieldProps });
|
|
8
|
+
}
|
|
9
|
+
export {
|
|
10
|
+
FormDateTimeField as default
|
|
11
|
+
};
|
|
12
|
+
//# sourceMappingURL=FormDateTimeField.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FormDateTimeField.js","sources":["../../src/datePickers/FormDateTimeField.jsx"],"sourcesContent":["// Campo de fecha con hora de formik: DateTimeInput conectado a su campo. Al formulario llega el instante en\n// UTC ('2026-11-01T18:30:00Z').\n//\n// Con react-hook-form no hay uno listo (esta puerta no pide react-hook-form): DateTimeInput va dentro de un Controller.\n//\n// Genérico del paquete: function (regla de la casa).\nimport DateTimeInput from '@/datePickers/DateTimeInput.jsx';\nimport {useFormikField} from '@/forms/useFormikField.js';\n\n/**\n * @param {{name: string} & Omit<Parameters<typeof import('@/datePickers/DateTimeInput.jsx').default>[0], 'name'|'value'|'onChange'|'onBlur'|'error'>} props las de\n * DateTimeInput (minDateTime, minimumMinutesFromNow, disablePast, minutesStep, timeZone…), sin value / onChange / onBlur / error\n */\nexport default function FormDateTimeField({name, ...inputProps}) {\n const fieldProps = useFormikField(name);\n return <DateTimeInput {...inputProps} {...fieldProps} />;\n}\n"],"names":[],"mappings":";;;;AAaA,SAAwB,kBAAkB,EAAC,MAAM,GAAG,cAAa;AAC7D,QAAM,aAAa,eAAe,IAAI;AACtC,SAAO,oBAAC,eAAA,EAAe,GAAG,YAAa,GAAG,WAAA,CAAY;AAC1D;"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx } from "react/jsx-runtime";
|
|
3
|
+
import MonthInput from "./MonthInput.js";
|
|
4
|
+
import { useFormikField } from "../forms/useFormikField.js";
|
|
5
|
+
function FormMonthField({ name, ...inputProps }) {
|
|
6
|
+
const fieldProps = useFormikField(name);
|
|
7
|
+
return /* @__PURE__ */ jsx(MonthInput, { ...inputProps, ...fieldProps });
|
|
8
|
+
}
|
|
9
|
+
export {
|
|
10
|
+
FormMonthField as default
|
|
11
|
+
};
|
|
12
|
+
//# sourceMappingURL=FormMonthField.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FormMonthField.js","sources":["../../src/datePickers/FormMonthField.jsx"],"sourcesContent":["// Campo de mes de formik: MonthInput conectado a su campo. Al formulario llega 'AAAA-MM'.\n//\n// Con react-hook-form no hay uno listo (esta puerta no pide react-hook-form): MonthInput va dentro de un Controller.\n//\n// Genérico del paquete: function (regla de la casa).\nimport MonthInput from '@/datePickers/MonthInput.jsx';\nimport {useFormikField} from '@/forms/useFormikField.js';\n\n/**\n * @param {{name: string} & Omit<Parameters<typeof import('@/datePickers/MonthInput.jsx').default>[0], 'name'|'value'|'onChange'|'onBlur'|'error'>} props las de\n * MonthInput (minMonth, maxMonth, disableFuture…), sin value / onChange / onBlur / error\n */\nexport default function FormMonthField({name, ...inputProps}) {\n const fieldProps = useFormikField(name);\n return <MonthInput {...inputProps} {...fieldProps} />;\n}\n"],"names":[],"mappings":";;;;AAYA,SAAwB,eAAe,EAAC,MAAM,GAAG,cAAa;AAC1D,QAAM,aAAa,eAAe,IAAI;AACtC,SAAO,oBAAC,YAAA,EAAY,GAAG,YAAa,GAAG,WAAA,CAAY;AACvD;"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx } from "react/jsx-runtime";
|
|
3
|
+
import TimeInput from "./TimeInput.js";
|
|
4
|
+
import { useFormikField } from "../forms/useFormikField.js";
|
|
5
|
+
function FormTimeField({ name, ...inputProps }) {
|
|
6
|
+
const fieldProps = useFormikField(name);
|
|
7
|
+
return /* @__PURE__ */ jsx(TimeInput, { ...inputProps, ...fieldProps });
|
|
8
|
+
}
|
|
9
|
+
export {
|
|
10
|
+
FormTimeField as default
|
|
11
|
+
};
|
|
12
|
+
//# sourceMappingURL=FormTimeField.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FormTimeField.js","sources":["../../src/datePickers/FormTimeField.jsx"],"sourcesContent":["// Campo de hora de formik: TimeInput conectado a su campo. Al formulario llega 'HH:mm'.\n//\n// Con react-hook-form no hay uno listo (esta puerta no pide react-hook-form): TimeInput va dentro de un Controller.\n//\n// Genérico del paquete: function (regla de la casa).\nimport TimeInput from '@/datePickers/TimeInput.jsx';\nimport {useFormikField} from '@/forms/useFormikField.js';\n\n/**\n * @param {{name: string} & Omit<Parameters<typeof import('@/datePickers/TimeInput.jsx').default>[0], 'name'|'value'|'onChange'|'onBlur'|'error'>} props las de\n * TimeInput (minTime, maxTime, minutesStep…), sin value / onChange / onBlur / error\n */\nexport default function FormTimeField({name, ...inputProps}) {\n const fieldProps = useFormikField(name);\n return <TimeInput {...inputProps} {...fieldProps} />;\n}\n"],"names":[],"mappings":";;;;AAYA,SAAwB,cAAc,EAAC,MAAM,GAAG,cAAa;AACzD,QAAM,aAAa,eAAe,IAAI;AACtC,SAAO,oBAAC,WAAA,EAAW,GAAG,YAAa,GAAG,WAAA,CAAY;AACtD;"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx } from "react/jsx-runtime";
|
|
3
|
+
import { DatePicker } from "@mui/x-date-pickers/DatePicker";
|
|
4
|
+
import PickerFrame, { textFieldSlotPropsOf } from "./PickerFrame.js";
|
|
5
|
+
import { monthTextOf, pickerMonthOf } from "./pickerValues.js";
|
|
6
|
+
import { usePickerField } from "./usePickerField.js";
|
|
7
|
+
import { warnUnknownProps } from "../toolkit/unknownProps.js";
|
|
8
|
+
const MONTH_VIEWS = ["year", "month"];
|
|
9
|
+
function MonthInput({
|
|
10
|
+
name,
|
|
11
|
+
label,
|
|
12
|
+
value,
|
|
13
|
+
onChange,
|
|
14
|
+
onBlur,
|
|
15
|
+
error,
|
|
16
|
+
helperText = " ",
|
|
17
|
+
minMonth,
|
|
18
|
+
maxMonth,
|
|
19
|
+
disableFuture = false,
|
|
20
|
+
disablePast = false,
|
|
21
|
+
disabled = false,
|
|
22
|
+
inputRef,
|
|
23
|
+
pickerProps,
|
|
24
|
+
texts,
|
|
25
|
+
...unknownProps
|
|
26
|
+
}) {
|
|
27
|
+
warnUnknownProps("MonthInput", unknownProps);
|
|
28
|
+
const field = usePickerField({ name, kind: "month", error, texts });
|
|
29
|
+
return /* @__PURE__ */ jsx(PickerFrame, { inputId: field.inputId, label, language: field.language, children: /* @__PURE__ */ jsx(
|
|
30
|
+
DatePicker,
|
|
31
|
+
{
|
|
32
|
+
...pickerProps,
|
|
33
|
+
views: MONTH_VIEWS,
|
|
34
|
+
openTo: "month",
|
|
35
|
+
format: field.formats.month,
|
|
36
|
+
value: pickerMonthOf(value),
|
|
37
|
+
minDate: pickerMonthOf(minMonth) ?? void 0,
|
|
38
|
+
maxDate: pickerMonthOf(maxMonth) ?? void 0,
|
|
39
|
+
disableFuture,
|
|
40
|
+
disablePast,
|
|
41
|
+
disabled,
|
|
42
|
+
inputRef,
|
|
43
|
+
onChange: (pickedValue) => onChange(monthTextOf(pickedValue)),
|
|
44
|
+
onClose: () => {
|
|
45
|
+
pickerProps?.onClose?.();
|
|
46
|
+
onBlur?.();
|
|
47
|
+
},
|
|
48
|
+
slotProps: textFieldSlotPropsOf(
|
|
49
|
+
{ id: field.inputId, name, onBlur, error: Boolean(field.errorText), helperText: field.errorText ?? helperText },
|
|
50
|
+
pickerProps
|
|
51
|
+
)
|
|
52
|
+
}
|
|
53
|
+
) });
|
|
54
|
+
}
|
|
55
|
+
export {
|
|
56
|
+
MonthInput as default
|
|
57
|
+
};
|
|
58
|
+
//# sourceMappingURL=MonthInput.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MonthInput.js","sources":["../../src/datePickers/MonthInput.jsx"],"sourcesContent":["// Campo de MES suelto con el DatePicker de MUI X en meses y años (@stackcraftmx/calcita/date-pickers): el mes de un\n// reporte, de un saldo, de un cierre.\n//\n// Viaja 'AAAA-MM' en texto y se ve con el nombre del mes en el idioma activo («noviembre 2026»). Abre en los meses del año\n// que ya tiene; el año se cambia arriba. '' = vacío. Como la fecha, no se pasa por Date (que lo movería de mes según la\n// zona el día 1).\n//\n// Genérico del paquete: function (regla de la casa).\nimport {DatePicker} from '@mui/x-date-pickers/DatePicker';\n\nimport PickerFrame, {textFieldSlotPropsOf} from '@/datePickers/PickerFrame.jsx';\nimport {monthTextOf, pickerMonthOf} from '@/datePickers/pickerValues.js';\nimport {usePickerField} from '@/datePickers/usePickerField.js';\nimport {warnUnknownProps} from '@/toolkit/unknownProps.js';\n\n// primero el año y luego el mes: el selector abre en los meses y el año se cambia con su botón de arriba\nconst MONTH_VIEWS = ['year', 'month'];\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' o ''\n * @param {(value: string) => void} props.onChange recibe 'AAAA-MM' ('' al borrar o 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.minMonth] 'AAAA-MM'\n * @param {string} [props.maxMonth] 'AAAA-MM'\n * @param {boolean} [props.disableFuture] p. ej. el mes de un reporte que ya cerró\n * @param {boolean} [props.disablePast]\n * @param {boolean} [props.disabled]\n * @param {import('react').Ref<HTMLInputElement>} [props.inputRef]\n * @param {object} [props.pickerProps] lo demás del DatePicker de MUI X que aquí no tiene nombre (shouldDisableMonth, slots,\n * slotProps…); value y onChange son del campo\n * @param {object} [props.texts] los textos que cambian, con la forma de `common` en los textos del paquete\n */\nexport default function MonthInput({\n name, label, value, onChange, onBlur, error, helperText = ' ', minMonth, maxMonth, disableFuture = false, disablePast = false,\n disabled = false, inputRef, pickerProps, texts,\n ...unknownProps\n}) {\n warnUnknownProps('MonthInput', unknownProps);\n const field = usePickerField({name, kind: 'month', error, texts});\n\n return (\n <PickerFrame inputId={field.inputId} label={label} language={field.language}>\n <DatePicker\n {...pickerProps}\n views={MONTH_VIEWS}\n openTo=\"month\"\n format={field.formats.month}\n value={pickerMonthOf(value)}\n minDate={pickerMonthOf(minMonth) ?? undefined}\n maxDate={pickerMonthOf(maxMonth) ?? undefined}\n disableFuture={disableFuture}\n disablePast={disablePast}\n disabled={disabled}\n inputRef={inputRef}\n onChange={(pickedValue) => onChange(monthTextOf(pickedValue))}\n onClose={() => {\n pickerProps?.onClose?.();\n onBlur?.();\n }}\n slotProps={textFieldSlotPropsOf(\n {id: field.inputId, name, onBlur, error: Boolean(field.errorText), helperText: field.errorText ?? helperText},\n pickerProps,\n )}\n />\n </PickerFrame>\n );\n}\n"],"names":[],"mappings":";;;;;;;AAgBA,MAAM,cAAc,CAAC,QAAQ,OAAO;AAqBpC,SAAwB,WAAW;AAAA,EAC/B;AAAA,EAAM;AAAA,EAAO;AAAA,EAAO;AAAA,EAAU;AAAA,EAAQ;AAAA,EAAO,aAAa;AAAA,EAAK;AAAA,EAAU;AAAA,EAAU,gBAAgB;AAAA,EAAO,cAAc;AAAA,EACxH,WAAW;AAAA,EAAO;AAAA,EAAU;AAAA,EAAa;AAAA,EACzC,GAAG;AACP,GAAG;AACC,mBAAiB,cAAc,YAAY;AAC3C,QAAM,QAAQ,eAAe,EAAC,MAAM,MAAM,SAAS,OAAO,OAAM;AAEhE,SACI,oBAAC,eAAY,SAAS,MAAM,SAAS,OAAc,UAAU,MAAM,UAC/D,UAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACI,GAAG;AAAA,MACJ,OAAO;AAAA,MACP,QAAO;AAAA,MACP,QAAQ,MAAM,QAAQ;AAAA,MACtB,OAAO,cAAc,KAAK;AAAA,MAC1B,SAAS,cAAc,QAAQ,KAAK;AAAA,MACpC,SAAS,cAAc,QAAQ,KAAK;AAAA,MACpC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,UAAU,CAAC,gBAAgB,SAAS,YAAY,WAAW,CAAC;AAAA,MAC5D,SAAS,MAAM;AACX,qBAAa,UAAA;AACb,iBAAA;AAAA,MACJ;AAAA,MACA,WAAW;AAAA,QACP,EAAC,IAAI,MAAM,SAAS,MAAM,QAAQ,OAAO,QAAQ,MAAM,SAAS,GAAG,YAAY,MAAM,aAAa,WAAA;AAAA,QAClG;AAAA,MAAA;AAAA,IACJ;AAAA,EAAA,GAER;AAER;"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx } from "react/jsx-runtime";
|
|
3
|
+
import "dayjs/locale/es.js";
|
|
4
|
+
import { AdapterDayjs } from "@mui/x-date-pickers/AdapterDayjs";
|
|
5
|
+
import { LocalizationProvider } from "@mui/x-date-pickers/LocalizationProvider";
|
|
6
|
+
import { enUS, esES } from "@mui/x-date-pickers/locales";
|
|
7
|
+
import FieldFrame from "../inputs/FieldFrame.js";
|
|
8
|
+
const ADAPTER_BY_LANGUAGE = Object.freeze({
|
|
9
|
+
es: { adapterLocale: "es", localeText: esES.components.MuiLocalizationProvider.defaultProps.localeText },
|
|
10
|
+
en: { adapterLocale: "en", localeText: enUS.components.MuiLocalizationProvider.defaultProps.localeText }
|
|
11
|
+
});
|
|
12
|
+
function textFieldSlotPropsOf(textField, pickerProps) {
|
|
13
|
+
const screenSlotProps = pickerProps?.slotProps ?? {};
|
|
14
|
+
return {
|
|
15
|
+
...screenSlotProps,
|
|
16
|
+
textField: { size: "small", fullWidth: true, ...textField, ...screenSlotProps.textField }
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
function PickerFrame({ inputId, label, language, children }) {
|
|
20
|
+
const adapter = ADAPTER_BY_LANGUAGE[language] ?? ADAPTER_BY_LANGUAGE.es;
|
|
21
|
+
return /* @__PURE__ */ jsx(FieldFrame, { inputId, label, children: /* @__PURE__ */ jsx(LocalizationProvider, { dateAdapter: AdapterDayjs, adapterLocale: adapter.adapterLocale, localeText: adapter.localeText, children }) });
|
|
22
|
+
}
|
|
23
|
+
export {
|
|
24
|
+
PickerFrame as default,
|
|
25
|
+
textFieldSlotPropsOf
|
|
26
|
+
};
|
|
27
|
+
//# sourceMappingURL=PickerFrame.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PickerFrame.js","sources":["../../src/datePickers/PickerFrame.jsx"],"sourcesContent":["// El marco que comparten los campos de fecha, fecha con hora, hora y mes: la etiqueta arriba como los demás campos del\n// paquete (FieldFrame; dentro de una FormSection, el renglón de Apple) y el LocalizationProvider de MUI X con dayjs, el\n// idioma activo y los textos del calendario en ese idioma. Así la pantalla no pone nada alrededor.\n//\n// También arma las piezas de MUI X que se repiten en los cuatro (textFieldSlotPropsOf): el campo chico, a todo lo ancho,\n// con su error o su ayuda abajo, y lo que la pantalla le pase en pickerProps.slotProps.textField encima.\n//\n// Genérico del paquete: function (regla de la casa).\n\n// con .js: Node (la prueba de humo, Next al pintar en el servidor) no completa la extensión de un archivo suelto de dayjs\nimport 'dayjs/locale/es.js';\nimport {AdapterDayjs} from '@mui/x-date-pickers/AdapterDayjs';\nimport {LocalizationProvider} from '@mui/x-date-pickers/LocalizationProvider';\nimport {enUS, esES} from '@mui/x-date-pickers/locales';\n\nimport FieldFrame from '@/inputs/FieldFrame.jsx';\n\n// el idioma de dayjs (nombres de meses y días) y los textos del calendario de MUI X en cada idioma; el que no está aquí\n// sale en español, como desde antes\nconst ADAPTER_BY_LANGUAGE = Object.freeze({\n es: {adapterLocale: 'es', localeText: esES.components.MuiLocalizationProvider.defaultProps.localeText},\n en: {adapterLocale: 'en', localeText: enUS.components.MuiLocalizationProvider.defaultProps.localeText},\n});\n\n/**\n * Los slotProps del selector con el campo de la casa y, encima, lo que pasó la pantalla en pickerProps.slotProps.\n *\n * @param {object} textField lo de la casa: id, name, onBlur, error, helperText\n * @param {object} [pickerProps] lo que la pantalla le pasa al selector de MUI X\n * @returns {object}\n */\nexport function textFieldSlotPropsOf(textField, pickerProps) {\n const screenSlotProps = pickerProps?.slotProps ?? {};\n return {\n ...screenSlotProps,\n textField: {size: 'small', fullWidth: true, ...textField, ...screenSlotProps.textField},\n };\n}\n\n/**\n * @param {object} props\n * @param {string} props.inputId\n * @param {import('react').ReactNode} props.label ya traducida\n * @param {string} props.language el del proveedor más cercano\n * @param {import('react').ReactNode} props.children el selector de MUI X\n */\nexport default function PickerFrame({inputId, label, language, children}) {\n const adapter = ADAPTER_BY_LANGUAGE[language] ?? ADAPTER_BY_LANGUAGE.es;\n\n return (\n <FieldFrame inputId={inputId} label={label}>\n <LocalizationProvider dateAdapter={AdapterDayjs} adapterLocale={adapter.adapterLocale} localeText={adapter.localeText}>\n {children}\n </LocalizationProvider>\n </FieldFrame>\n );\n}\n"],"names":[],"mappings":";;;;;;;AAmBA,MAAM,sBAAsB,OAAO,OAAO;AAAA,EACtC,IAAI,EAAC,eAAe,MAAM,YAAY,KAAK,WAAW,wBAAwB,aAAa,WAAA;AAAA,EAC3F,IAAI,EAAC,eAAe,MAAM,YAAY,KAAK,WAAW,wBAAwB,aAAa,WAAA;AAC/F,CAAC;AASM,SAAS,qBAAqB,WAAW,aAAa;AACzD,QAAM,kBAAkB,aAAa,aAAa,CAAA;AAClD,SAAO;AAAA,IACH,GAAG;AAAA,IACH,WAAW,EAAC,MAAM,SAAS,WAAW,MAAM,GAAG,WAAW,GAAG,gBAAgB,UAAA;AAAA,EAAS;AAE9F;AASA,SAAwB,YAAY,EAAC,SAAS,OAAO,UAAU,YAAW;AACtE,QAAM,UAAU,oBAAoB,QAAQ,KAAK,oBAAoB;AAErE,SACI,oBAAC,YAAA,EAAW,SAAkB,OAC1B,8BAAC,sBAAA,EAAqB,aAAa,cAAc,eAAe,QAAQ,eAAe,YAAY,QAAQ,YACtG,UACL,GACJ;AAER;"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx } from "react/jsx-runtime";
|
|
3
|
+
import { TimePicker } from "@mui/x-date-pickers/TimePicker";
|
|
4
|
+
import PickerFrame, { textFieldSlotPropsOf } from "./PickerFrame.js";
|
|
5
|
+
import { DEFAULT_MINUTES_STEP, timeTextOf, pickerTimeOf } from "./pickerValues.js";
|
|
6
|
+
import { usePickerField } from "./usePickerField.js";
|
|
7
|
+
import { warnUnknownProps } from "../toolkit/unknownProps.js";
|
|
8
|
+
function TimeInput({
|
|
9
|
+
name,
|
|
10
|
+
label,
|
|
11
|
+
value,
|
|
12
|
+
onChange,
|
|
13
|
+
onBlur,
|
|
14
|
+
error,
|
|
15
|
+
helperText = " ",
|
|
16
|
+
minTime,
|
|
17
|
+
maxTime,
|
|
18
|
+
minutesStep = DEFAULT_MINUTES_STEP,
|
|
19
|
+
disabled = false,
|
|
20
|
+
inputRef,
|
|
21
|
+
pickerProps,
|
|
22
|
+
texts,
|
|
23
|
+
...unknownProps
|
|
24
|
+
}) {
|
|
25
|
+
warnUnknownProps("TimeInput", unknownProps);
|
|
26
|
+
const field = usePickerField({ name, kind: "time", error, texts });
|
|
27
|
+
return /* @__PURE__ */ jsx(PickerFrame, { inputId: field.inputId, label, language: field.language, children: /* @__PURE__ */ jsx(
|
|
28
|
+
TimePicker,
|
|
29
|
+
{
|
|
30
|
+
...pickerProps,
|
|
31
|
+
format: field.formats.time,
|
|
32
|
+
ampm: field.formats.ampm,
|
|
33
|
+
value: pickerTimeOf(value),
|
|
34
|
+
minTime: pickerTimeOf(minTime) ?? void 0,
|
|
35
|
+
maxTime: pickerTimeOf(maxTime) ?? void 0,
|
|
36
|
+
disabled,
|
|
37
|
+
minutesStep,
|
|
38
|
+
timeSteps: { minutes: minutesStep, ...pickerProps?.timeSteps },
|
|
39
|
+
inputRef,
|
|
40
|
+
onChange: (pickedValue) => onChange(timeTextOf(pickedValue)),
|
|
41
|
+
onClose: () => {
|
|
42
|
+
pickerProps?.onClose?.();
|
|
43
|
+
onBlur?.();
|
|
44
|
+
},
|
|
45
|
+
slotProps: textFieldSlotPropsOf(
|
|
46
|
+
{ id: field.inputId, name, onBlur, error: Boolean(field.errorText), helperText: field.errorText ?? helperText },
|
|
47
|
+
pickerProps
|
|
48
|
+
)
|
|
49
|
+
}
|
|
50
|
+
) });
|
|
51
|
+
}
|
|
52
|
+
export {
|
|
53
|
+
TimeInput as default
|
|
54
|
+
};
|
|
55
|
+
//# sourceMappingURL=TimeInput.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TimeInput.js","sources":["../../src/datePickers/TimeInput.jsx"],"sourcesContent":["// Campo de HORA suelto con el TimePicker de MUI X (@stackcraftmx/calcita/date-pickers), para una hora del día sin fecha:\n// la hora de una cita en un día ya elegido, el horario de una sucursal, «recordar a las 08:00».\n//\n// Viaja 'HH:mm' de 24 horas aunque en pantalla se vea con a.m. y p.m. (el hourCycle del proveedor decide cómo se ve, no\n// cómo viaja). Una hora del día no tiene zona: no se pasa por Date ni por UTC. '' = vacía.\n//\n// Para un instante (fecha y hora de algo que pasa una vez) va DateTimeInput, que sí viaja en UTC.\n//\n// Genérico del paquete: function (regla de la casa).\nimport {TimePicker} from '@mui/x-date-pickers/TimePicker';\n\nimport PickerFrame, {textFieldSlotPropsOf} from '@/datePickers/PickerFrame.jsx';\nimport {DEFAULT_MINUTES_STEP, pickerTimeOf, timeTextOf} from '@/datePickers/pickerValues.js';\nimport {usePickerField} from '@/datePickers/usePickerField.js';\nimport {warnUnknownProps} from '@/toolkit/unknownProps.js';\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 'HH:mm' o ''\n * @param {(value: string) => void} props.onChange recibe 'HH:mm' ('' al borrar o 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.minTime] 'HH:mm'\n * @param {string} [props.maxTime] 'HH:mm'\n * @param {number} [props.minutesStep] de cuánto en cuánto van los minutos; por omisión de uno en uno (30 para citas de\n * media hora)\n * @param {boolean} [props.disabled]\n * @param {import('react').Ref<HTMLInputElement>} [props.inputRef]\n * @param {object} [props.pickerProps] lo demás del TimePicker de MUI X que aquí no tiene nombre (views, shouldDisableTime,\n * slots, slotProps…); value y onChange son del campo\n * @param {object} [props.texts] los textos que cambian, con la forma de `common` en los textos del paquete\n */\nexport default function TimeInput({\n name, label, value, onChange, onBlur, error, helperText = ' ', minTime, maxTime, minutesStep = DEFAULT_MINUTES_STEP, disabled = false, inputRef,\n pickerProps, texts,\n ...unknownProps\n}) {\n warnUnknownProps('TimeInput', unknownProps);\n const field = usePickerField({name, kind: 'time', error, texts});\n\n return (\n <PickerFrame inputId={field.inputId} label={label} language={field.language}>\n <TimePicker\n {...pickerProps}\n format={field.formats.time}\n ampm={field.formats.ampm}\n value={pickerTimeOf(value)}\n minTime={pickerTimeOf(minTime) ?? undefined}\n maxTime={pickerTimeOf(maxTime) ?? undefined}\n disabled={disabled}\n minutesStep={minutesStep}\n timeSteps={{minutes: minutesStep, ...pickerProps?.timeSteps}}\n inputRef={inputRef}\n onChange={(pickedValue) => onChange(timeTextOf(pickedValue))}\n onClose={() => {\n pickerProps?.onClose?.();\n onBlur?.();\n }}\n slotProps={textFieldSlotPropsOf(\n {id: field.inputId, name, onBlur, error: Boolean(field.errorText), helperText: field.errorText ?? helperText},\n pickerProps,\n )}\n />\n </PickerFrame>\n );\n}\n"],"names":[],"mappings":";;;;;;;AAmCA,SAAwB,UAAU;AAAA,EAC9B;AAAA,EAAM;AAAA,EAAO;AAAA,EAAO;AAAA,EAAU;AAAA,EAAQ;AAAA,EAAO,aAAa;AAAA,EAAK;AAAA,EAAS;AAAA,EAAS,cAAc;AAAA,EAAsB,WAAW;AAAA,EAAO;AAAA,EACvI;AAAA,EAAa;AAAA,EACb,GAAG;AACP,GAAG;AACC,mBAAiB,aAAa,YAAY;AAC1C,QAAM,QAAQ,eAAe,EAAC,MAAM,MAAM,QAAQ,OAAO,OAAM;AAE/D,SACI,oBAAC,eAAY,SAAS,MAAM,SAAS,OAAc,UAAU,MAAM,UAC/D,UAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACI,GAAG;AAAA,MACJ,QAAQ,MAAM,QAAQ;AAAA,MACtB,MAAM,MAAM,QAAQ;AAAA,MACpB,OAAO,aAAa,KAAK;AAAA,MACzB,SAAS,aAAa,OAAO,KAAK;AAAA,MAClC,SAAS,aAAa,OAAO,KAAK;AAAA,MAClC;AAAA,MACA;AAAA,MACA,WAAW,EAAC,SAAS,aAAa,GAAG,aAAa,UAAA;AAAA,MAClD;AAAA,MACA,UAAU,CAAC,gBAAgB,SAAS,WAAW,WAAW,CAAC;AAAA,MAC3D,SAAS,MAAM;AACX,qBAAa,UAAA;AACb,iBAAA;AAAA,MACJ;AAAA,MACA,WAAW;AAAA,QACP,EAAC,IAAI,MAAM,SAAS,MAAM,QAAQ,OAAO,QAAQ,MAAM,SAAS,GAAG,YAAY,MAAM,aAAa,WAAA;AAAA,QAClG;AAAA,MAAA;AAAA,IACJ;AAAA,EAAA,GAER;AAER;"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { instantPlusMinutes, earliestInstantFromNow } from "./pickerValues.js";
|
|
2
|
+
function minutesFromNowRule(minutes) {
|
|
3
|
+
return {
|
|
4
|
+
name: "minutesFromNow",
|
|
5
|
+
message: { key: "validation:minutesFromNow", values: { count: minutes } },
|
|
6
|
+
// la hora se toma al revisar, no al armar el esquema: el mínimo se recorre con el reloj
|
|
7
|
+
test: (value) => !value || Date.parse(String(value)) >= Date.parse(earliestInstantFromNow(minutes))
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
function minutesAfterRule(startField, minutes) {
|
|
11
|
+
return {
|
|
12
|
+
name: "minutesAfter",
|
|
13
|
+
message: { key: "validation:minutesAfter", values: { count: minutes } },
|
|
14
|
+
test: (value, context) => {
|
|
15
|
+
const earliest = instantPlusMinutes(context.parent?.[startField], minutes);
|
|
16
|
+
return !value || !earliest || Date.parse(String(value)) >= Date.parse(earliest);
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
export {
|
|
21
|
+
minutesAfterRule,
|
|
22
|
+
minutesFromNowRule
|
|
23
|
+
};
|
|
24
|
+
//# sourceMappingURL=dateTimeRules.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dateTimeRules.js","sources":["../../src/datePickers/dateTimeRules.js"],"sourcesContent":["// Las reglas de yup para una fecha con hora que depende del reloj o de otro campo, con sus mensajes en el idioma activo:\n//\n// minutesFromNowRule(5) al menos 5 minutos después de ahora (publicar algo con anticipación)\n// minutesAfterRule('startsAt', 30) al menos 30 minutos después del campo startsAt (algo que dura al menos media hora)\n//\n// Yup.object({\n// startsAt: Yup.string().required().test(minutesFromNowRule(5)),\n// endsAt: Yup.string().required().test(minutesAfterRule('startsAt', 30)),\n// })\n//\n// Un campo vacío pasa: que sea obligatorio lo dice required(). El servidor vuelve a revisar: entre que se llena el\n// formulario y se guarda pasa el tiempo.\n//\n// Son objetos de .test() y no un Yup propio: el proyecto usa su copia de yup y aquí no se importa.\n//\n// Genérico del paquete: function (regla de la casa).\nimport {earliestInstantFromNow, instantPlusMinutes} from '@/datePickers/pickerValues.js';\n\n/**\n * @param {number} minutes\n * @returns {{name: string, message: {key: string, values: {count: number}}, test: (value: unknown) => boolean}}\n */\nexport function minutesFromNowRule(minutes) {\n return {\n name: 'minutesFromNow',\n message: {key: 'validation:minutesFromNow', values: {count: minutes}},\n // la hora se toma al revisar, no al armar el esquema: el mínimo se recorre con el reloj\n test: (value) => !value || Date.parse(String(value)) >= Date.parse(earliestInstantFromNow(minutes)),\n };\n}\n\n/**\n * @param {string} startField el nombre del campo de inicio, en el mismo objeto del esquema\n * @param {number} minutes\n * @returns {{name: string, message: {key: string, values: {count: number}}, test: (value: unknown, context: {parent: object}) => boolean}}\n */\nexport function minutesAfterRule(startField, minutes) {\n return {\n name: 'minutesAfter',\n message: {key: 'validation:minutesAfter', values: {count: minutes}},\n test: (value, context) => {\n const earliest = instantPlusMinutes(context.parent?.[startField], minutes);\n // sin inicio todavía no hay contra qué comparar: eso lo dice la regla del inicio\n return !value || !earliest || Date.parse(String(value)) >= Date.parse(earliest);\n },\n };\n}\n"],"names":[],"mappings":";AAsBO,SAAS,mBAAmB,SAAS;AACxC,SAAO;AAAA,IACH,MAAM;AAAA,IACN,SAAS,EAAC,KAAK,6BAA6B,QAAQ,EAAC,OAAO,QAAO,EAAC;AAAA;AAAA,IAEpE,MAAM,CAAC,UAAU,CAAC,SAAS,KAAK,MAAM,OAAO,KAAK,CAAC,KAAK,KAAK,MAAM,uBAAuB,OAAO,CAAC;AAAA,EAC1G;AACA;AAOO,SAAS,iBAAiB,YAAY,SAAS;AAClD,SAAO;AAAA,IACH,MAAM;AAAA,IACN,SAAS,EAAC,KAAK,2BAA2B,QAAQ,EAAC,OAAO,QAAO,EAAC;AAAA,IAClE,MAAM,CAAC,OAAO,YAAY;AACtB,YAAM,WAAW,mBAAmB,QAAQ,SAAS,UAAU,GAAG,OAAO;AAEzE,aAAO,CAAC,SAAS,CAAC,YAAY,KAAK,MAAM,OAAO,KAAK,CAAC,KAAK,KAAK,MAAM,QAAQ;AAAA,IAClF;AAAA,EACR;AACA;"}
|