@vritti/quantum-ui 0.3.12 → 0.3.13
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/dist/Alert.js +1 -1
- package/dist/Alert.js.map +1 -1
- package/dist/Avatar.js +1 -1
- package/dist/Avatar.js.map +1 -1
- package/dist/Badge2.js +2 -2
- package/dist/BillingCycleSelector.js +37 -0
- package/dist/BillingCycleSelector.js.map +1 -0
- package/dist/Breadcrumb.js +1 -1
- package/dist/Breadcrumb.js.map +1 -1
- package/dist/Button.js +1 -1
- package/dist/Button.js.map +1 -1
- package/dist/Button2.js +2 -2
- package/dist/CardSkeleton.js.map +1 -1
- package/dist/CategoryFilter.js +6 -4
- package/dist/CategoryFilter.js.map +1 -1
- package/dist/Checkbox.js.map +1 -1
- package/dist/Checkbox2.js +4 -4
- package/dist/CheckboxGroup.js.map +1 -1
- package/dist/Collapsible.js.map +1 -1
- package/dist/Combination.js +1129 -0
- package/dist/Combination.js.map +1 -0
- package/dist/CompanySelector.js +20 -0
- package/dist/CompanySelector.js.map +1 -0
- package/dist/ConfirmHost.js.map +1 -1
- package/dist/CountrySelector.js +37 -0
- package/dist/CountrySelector.js.map +1 -0
- package/dist/CurrencyField.js +1 -0
- package/dist/CurrencyField.js.map +1 -1
- package/dist/CustomerSelector.js +2 -2
- package/dist/CustomerSelector.js.map +1 -1
- package/dist/DangerZoneSkeleton.js +21 -3
- package/dist/DangerZoneSkeleton.js.map +1 -1
- package/dist/DatePicker.js +3 -3
- package/dist/DatePicker.js.map +1 -1
- package/dist/DateTimePicker.js +2 -2
- package/dist/DetailSectionSkeleton.js.map +1 -1
- package/dist/Dialog.js.map +1 -1
- package/dist/DropdownMenu.js.map +1 -1
- package/dist/FeaturePermissionSelector.js +37 -0
- package/dist/FeaturePermissionSelector.js.map +1 -0
- package/dist/Form.js.map +1 -1
- package/dist/FormSection.js +4 -4
- package/dist/FormSection.js.map +1 -1
- package/dist/HierarchyGraph.js +5 -10621
- package/dist/HierarchyGraph.js.map +1 -1
- package/dist/ISOCountrySelect.js +283 -0
- package/dist/ISOCountrySelect.js.map +1 -0
- package/dist/IconSelect.js +1 -1
- package/dist/IconSelect.js.map +1 -1
- package/dist/InventoryItemSelector.js +2 -2
- package/dist/InventoryItemSelector.js.map +1 -1
- package/dist/Kbd.js +1 -1
- package/dist/Kbd.js.map +1 -1
- package/dist/Label.js +1 -1
- package/dist/LayoutModeContext.js.map +1 -1
- package/dist/LegalEntitySelector.js +37 -0
- package/dist/LegalEntitySelector.js.map +1 -0
- package/dist/LocationSelector.js +2 -2
- package/dist/LocationSelector.js.map +1 -1
- package/dist/LotSelector.js +2 -2
- package/dist/LotSelector.js.map +1 -1
- package/dist/OTPField.js.map +1 -1
- package/dist/PageContent.js.map +1 -1
- package/dist/PageHeaderSkeleton.js +21 -10
- package/dist/PageHeaderSkeleton.js.map +1 -1
- package/dist/PasswordField.js.map +1 -1
- package/dist/PermissionGate.js +49 -5
- package/dist/PermissionGate.js.map +1 -1
- package/dist/PersonSelector.js +20 -0
- package/dist/PersonSelector.js.map +1 -0
- package/dist/PhoneField.js.map +1 -1
- package/dist/PurchaseOrderSelector.js +2 -2
- package/dist/PurchaseOrderSelector.js.map +1 -1
- package/dist/QuantSelector.js +2 -2
- package/dist/QuantSelector.js.map +1 -1
- package/dist/RadioGroup.js +6 -6
- package/dist/RadioGroup.js.map +1 -1
- package/dist/RoleSelector.js +20 -0
- package/dist/RoleSelector.js.map +1 -0
- package/dist/Select.js +4 -1
- package/dist/Select.js.map +1 -1
- package/dist/SelectFilter.js.map +1 -1
- package/dist/Separator.js.map +1 -1
- package/dist/SerialSelector.js +2 -2
- package/dist/SerialSelector.js.map +1 -1
- package/dist/Sidebar.js +2 -2
- package/dist/Sidebar.js.map +1 -1
- package/dist/SingleSelect.js +2 -2
- package/dist/SingleSelect.js.map +1 -1
- package/dist/SiteGroupSelector.js +37 -0
- package/dist/SiteGroupSelector.js.map +1 -0
- package/dist/SiteSelector.js +37 -0
- package/dist/SiteSelector.js.map +1 -0
- package/dist/Sonner.js +1 -1
- package/dist/Sonner.js.map +1 -1
- package/dist/Sortable.js +4 -4417
- package/dist/Sortable.js.map +1 -1
- package/dist/StepProgressIndicator.js.map +1 -1
- package/dist/SupplierItemSelector.js +2 -2
- package/dist/SupplierItemSelector.js.map +1 -1
- package/dist/SupplierSelector.js +2 -2
- package/dist/SupplierSelector.js.map +1 -1
- package/dist/Switch.js +3 -3
- package/dist/Switch.js.map +1 -1
- package/dist/TabsSkeleton.js +101 -49
- package/dist/TabsSkeleton.js.map +1 -1
- package/dist/TaxClassSelector.js +20 -0
- package/dist/TaxClassSelector.js.map +1 -0
- package/dist/TextField.js.map +1 -1
- package/dist/ThemeContext.js.map +1 -1
- package/dist/ThemeToggle.js.map +1 -1
- package/dist/Toggle.js +1 -1
- package/dist/Toggle.js.map +1 -1
- package/dist/Tooltip.js.map +1 -1
- package/dist/Typography.js.map +1 -1
- package/dist/UomSelector.js +2 -2
- package/dist/UomSelector.js.map +1 -1
- package/dist/UploadFile.js.map +1 -1
- package/dist/assets/quantum-ui.css +25 -13
- package/dist/calendar2.js +1 -1
- package/dist/collapsible2.js +1 -1
- package/dist/components/CompanySelector.js +2 -0
- package/dist/components/CompanySelector.js.map +1 -0
- package/dist/components/FormattedDate.js +2 -2
- package/dist/components/HierarchyGraph.js +2 -1
- package/dist/components/HierarchyGraph.js.map +1 -1
- package/dist/components/PermissionGate.js +1 -1
- package/dist/components/PersonSelector.js +2 -0
- package/dist/components/PersonSelector.js.map +1 -0
- package/dist/components/ScanBarcodeButton.js.map +1 -1
- package/dist/components/TreeView.js +7 -7
- package/dist/components/TreeView.js.map +1 -1
- package/dist/core.esm.js +4025 -0
- package/dist/core.esm.js.map +1 -0
- package/dist/dropdown-menu.js +10 -10
- package/dist/field.js +1 -1
- package/dist/image-component.js.map +1 -1
- package/dist/index.js +15 -3
- package/dist/index.js.map +1 -1
- package/dist/index10.js +102 -1499
- package/dist/index10.js.map +1 -1
- package/dist/index11.js +1499 -37
- package/dist/index11.js.map +1 -1
- package/dist/index12.js +29 -477
- package/dist/index12.js.map +1 -1
- package/dist/index13.js +427 -231
- package/dist/index13.js.map +1 -1
- package/dist/index14.js +215 -1074
- package/dist/index14.js.map +1 -1
- package/dist/index15.js +1140 -14
- package/dist/index15.js.map +1 -1
- package/dist/index16.js +13 -19
- package/dist/index16.js.map +1 -1
- package/dist/index17.js +24 -172
- package/dist/index17.js.map +1 -1
- package/dist/index18.js +168 -175
- package/dist/index18.js.map +1 -1
- package/dist/index19.js +173 -201
- package/dist/index19.js.map +1 -1
- package/dist/index20.js +203 -69
- package/dist/index20.js.map +1 -1
- package/dist/index21.js +70 -211
- package/dist/index21.js.map +1 -1
- package/dist/index22.js +207 -117
- package/dist/index22.js.map +1 -1
- package/dist/index23.js +123 -71
- package/dist/index23.js.map +1 -1
- package/dist/index24.js +74 -11
- package/dist/index24.js.map +1 -1
- package/dist/index25.js +13 -1134
- package/dist/index25.js.map +1 -1
- package/dist/index26.js +1120 -219
- package/dist/index26.js.map +1 -1
- package/dist/index27.js +202 -2506
- package/dist/index27.js.map +1 -1
- package/dist/index28.js +2527 -23
- package/dist/index28.js.map +1 -1
- package/dist/index29.js +32 -4
- package/dist/index29.js.map +1 -1
- package/dist/index3.js +11543 -267
- package/dist/index3.js.map +1 -1
- package/dist/index30.js +3 -1124
- package/dist/index30.js.map +1 -1
- package/dist/index31.js +1 -1
- package/dist/index32.js +7 -7
- package/dist/index34.js +1 -1
- package/dist/index37.js +1 -1
- package/dist/index38.js +21 -42
- package/dist/index38.js.map +1 -1
- package/dist/index4.js +272 -132
- package/dist/index4.js.map +1 -1
- package/dist/index5.js +138 -388
- package/dist/index5.js.map +1 -1
- package/dist/index6.js +386 -7
- package/dist/index6.js.map +1 -1
- package/dist/index7.js +13 -92
- package/dist/index7.js.map +1 -1
- package/dist/index8.js +92 -43
- package/dist/index8.js.map +1 -1
- package/dist/index9.js +42 -102
- package/dist/index9.js.map +1 -1
- package/dist/lib/components/Alert/Alert.d.ts.map +1 -1
- package/dist/lib/components/Avatar/Avatar.d.ts.map +1 -1
- package/dist/lib/components/Breadcrumb/Breadcrumb.d.ts.map +1 -1
- package/dist/lib/components/Button/Button.d.ts.map +1 -1
- package/dist/lib/components/Card/CardSkeleton.d.ts.map +1 -1
- package/dist/lib/components/Checkbox/Checkbox.d.ts.map +1 -1
- package/dist/lib/components/CheckboxGroup/CheckboxGroup.d.ts.map +1 -1
- package/dist/lib/components/Collapsible/Collapsible.d.ts.map +1 -1
- package/dist/lib/components/CompanySelector/CompanySelector.d.ts +4 -0
- package/dist/lib/components/CompanySelector/CompanySelector.d.ts.map +1 -0
- package/dist/lib/components/CompanySelector/index.d.ts +2 -0
- package/dist/lib/components/CompanySelector/index.d.ts.map +1 -0
- package/dist/lib/components/ConfirmHost/ConfirmHost.d.ts.map +1 -1
- package/dist/lib/components/CurrencyField/CurrencyField.d.ts.map +1 -1
- package/dist/lib/components/DangerZone/DangerZone.d.ts +3 -1
- package/dist/lib/components/DangerZone/DangerZone.d.ts.map +1 -1
- package/dist/lib/components/DataTable/CompactTableSkeleton.d.ts.map +1 -1
- package/dist/lib/components/DataTable/DataTable.d.ts.map +1 -1
- package/dist/lib/components/DataTable/cells/cells.d.ts.map +1 -1
- package/dist/lib/components/DataTable/components/DataTableSelectionBar.d.ts.map +1 -1
- package/dist/lib/components/DataTable/components/RowActions.d.ts.map +1 -1
- package/dist/lib/components/DataTable/hooks/useDataTable.d.ts.map +1 -1
- package/dist/lib/components/DataTable/store/store.d.ts.map +1 -1
- package/dist/lib/components/DataTable/types.d.ts.map +1 -1
- package/dist/lib/components/DatePicker/DatePicker.d.ts +2 -2
- package/dist/lib/components/DatePicker/DatePicker.d.ts.map +1 -1
- package/dist/lib/components/DetailField/DetailField.d.ts.map +1 -1
- package/dist/lib/components/DetailField/DetailHeader.d.ts.map +1 -1
- package/dist/lib/components/DetailField/DetailSectionSkeleton.d.ts.map +1 -1
- package/dist/lib/components/Dialog/Dialog.d.ts.map +1 -1
- package/dist/lib/components/DropdownMenu/DropdownMenu.d.ts.map +1 -1
- package/dist/lib/components/DropdownMenu/types.d.ts.map +1 -1
- package/dist/lib/components/Editor/editor-ui/color-picker.d.ts.map +1 -1
- package/dist/lib/components/Editor/editor-ui/image-component.d.ts.map +1 -1
- package/dist/lib/components/Editor/nodes/autocomplete-node.d.ts.map +1 -1
- package/dist/lib/components/Editor/plugins/actions/max-length-plugin.d.ts.map +1 -1
- package/dist/lib/components/Editor/plugins/embeds/auto-embed-plugin.d.ts.map +1 -1
- package/dist/lib/components/Editor/plugins/embeds/youtube-plugin.d.ts.map +1 -1
- package/dist/lib/components/Editor/plugins/emojis-plugin.d.ts.map +1 -1
- package/dist/lib/components/Editor/plugins/floating-link-editor-plugin.d.ts.map +1 -1
- package/dist/lib/components/Editor/plugins/floating-text-format-plugin.d.ts.map +1 -1
- package/dist/lib/components/Editor/plugins/images-plugin.d.ts.map +1 -1
- package/dist/lib/components/Editor/plugins/keywords-plugin.d.ts.map +1 -1
- package/dist/lib/components/Editor/plugins/layout-plugin.d.ts.map +1 -1
- package/dist/lib/components/Editor/plugins/list-max-indent-level-plugin.d.ts.map +1 -1
- package/dist/lib/components/Editor/plugins/mentions-plugin.d.ts.map +1 -1
- package/dist/lib/components/Editor/plugins/picker/component-picker-option.d.ts.map +1 -1
- package/dist/lib/components/Editor/plugins/tab-focus-plugin.d.ts.map +1 -1
- package/dist/lib/components/Editor/plugins/table-plugin.d.ts.map +1 -1
- package/dist/lib/components/Editor/plugins/toolbar/clear-formatting-toolbar-plugin.d.ts.map +1 -1
- package/dist/lib/components/Editor/plugins/typing-pref-plugin.d.ts.map +1 -1
- package/dist/lib/components/Editor/shared/invariant.d.ts.map +1 -1
- package/dist/lib/components/Editor/shared/react-patches.d.ts.map +1 -1
- package/dist/lib/components/Editor/shared/react-test-utils.d.ts.map +1 -1
- package/dist/lib/components/Editor/shared/simple-diff-with-cursor.d.ts.map +1 -1
- package/dist/lib/components/Editor/shared/use-layout-effect.d.ts.map +1 -1
- package/dist/lib/components/Editor/transformers/markdown-table-transformer.d.ts.map +1 -1
- package/dist/lib/components/Editor/utils/collapsible.d.ts.map +1 -1
- package/dist/lib/components/Editor/utils/doc-serialization.d.ts.map +1 -1
- package/dist/lib/components/Editor/utils/emoji-list.d.ts.map +1 -1
- package/dist/lib/components/Editor/utils/get-dom-range-rect.d.ts.map +1 -1
- package/dist/lib/components/Editor/utils/get-selected-node.d.ts.map +1 -1
- package/dist/lib/components/Editor/utils/guard.d.ts.map +1 -1
- package/dist/lib/components/Editor/utils/set-floating-elem-position-for-link-editor.d.ts.map +1 -1
- package/dist/lib/components/Editor/utils/set-floating-elem-position.d.ts.map +1 -1
- package/dist/lib/components/Editor/utils/swipe.d.ts.map +1 -1
- package/dist/lib/components/Editor/utils/url.d.ts.map +1 -1
- package/dist/lib/components/Form/Form.d.ts.map +1 -1
- package/dist/lib/components/OTPField/OTPField.d.ts.map +1 -1
- package/dist/lib/components/PageContent/PageContent.d.ts.map +1 -1
- package/dist/lib/components/PageHeader/PageHeader.d.ts.map +1 -1
- package/dist/lib/components/PasswordField/PasswordField.d.ts.map +1 -1
- package/dist/lib/components/PermissionGate/PermissionGate.d.ts +15 -4
- package/dist/lib/components/PermissionGate/PermissionGate.d.ts.map +1 -1
- package/dist/lib/components/PermissionGate/index.d.ts +1 -1
- package/dist/lib/components/PermissionGate/index.d.ts.map +1 -1
- package/dist/lib/components/PersonSelector/PersonSelector.d.ts +4 -0
- package/dist/lib/components/PersonSelector/PersonSelector.d.ts.map +1 -0
- package/dist/lib/components/PersonSelector/index.d.ts +2 -0
- package/dist/lib/components/PersonSelector/index.d.ts.map +1 -0
- package/dist/lib/components/PhoneField/PhoneField.d.ts.map +1 -1
- package/dist/lib/components/RadioGroup/RadioGroup.d.ts.map +1 -1
- package/dist/lib/components/ScanBarcodeButton/ScanBarcodeButton.d.ts.map +1 -1
- package/dist/lib/components/Select/SelectFilter.d.ts.map +1 -1
- package/dist/lib/components/Select/components/MultiSelect/MultiSelect.d.ts.map +1 -1
- package/dist/lib/components/Select/components/MultiSelect/MultiSelectFilter.d.ts.map +1 -1
- package/dist/lib/components/Select/components/SingleSelect/SingleSelect.d.ts.map +1 -1
- package/dist/lib/components/Select/components/SingleSelect/SingleSelectFilter.d.ts.map +1 -1
- package/dist/lib/components/Select/hooks/useSelect.d.ts.map +1 -1
- package/dist/lib/components/Select/hooks/useSingleSelect.d.ts.map +1 -1
- package/dist/lib/components/Select/types.d.ts +1 -1
- package/dist/lib/components/Select/types.d.ts.map +1 -1
- package/dist/lib/components/Separator/Separator.d.ts.map +1 -1
- package/dist/lib/components/Sidebar/Sidebar.d.ts.map +1 -1
- package/dist/lib/components/Sonner/Sonner.d.ts.map +1 -1
- package/dist/lib/components/Sonner/toast.d.ts.map +1 -1
- package/dist/lib/components/StepProgressIndicator/StepProgressIndicator.d.ts.map +1 -1
- package/dist/lib/components/Switch/Switch.d.ts.map +1 -1
- package/dist/lib/components/Tabs/Tabs.d.ts +2 -0
- package/dist/lib/components/Tabs/Tabs.d.ts.map +1 -1
- package/dist/lib/components/Tabs/TabsSkeleton.d.ts.map +1 -1
- package/dist/lib/components/TextField/TextField.d.ts.map +1 -1
- package/dist/lib/components/ThemeToggle/ThemeToggle.d.ts.map +1 -1
- package/dist/lib/components/Toggle/Toggle.d.ts.map +1 -1
- package/dist/lib/components/Tooltip/Tooltip.d.ts.map +1 -1
- package/dist/lib/components/TreeView/TreeView.d.ts.map +1 -1
- package/dist/lib/components/Typography/Typography.d.ts.map +1 -1
- package/dist/lib/components/UploadFile/UploadFile.d.ts.map +1 -1
- package/dist/lib/components/index.d.ts +2 -0
- package/dist/lib/components/index.d.ts.map +1 -1
- package/dist/lib/config/index.d.ts.map +1 -1
- package/dist/lib/context/LayoutModeContext.d.ts.map +1 -1
- package/dist/lib/context/ThemeContext.d.ts.map +1 -1
- package/dist/lib/hooks/useBUCurrency.d.ts.map +1 -1
- package/dist/lib/hooks/useBUTimezone.d.ts.map +1 -1
- package/dist/lib/hooks/useBarcodeScanner.d.ts.map +1 -1
- package/dist/lib/hooks/useFormatters.d.ts.map +1 -1
- package/dist/lib/hooks/useSSE.d.ts.map +1 -1
- package/dist/lib/hooks/useTheme.d.ts.map +1 -1
- package/dist/lib/index.d.ts.map +1 -1
- package/dist/lib/selects/billing-cycle/BillingCycleFilter.d.ts +12 -0
- package/dist/lib/selects/billing-cycle/BillingCycleFilter.d.ts.map +1 -0
- package/dist/lib/selects/billing-cycle/BillingCycleSelector.d.ts +4 -0
- package/dist/lib/selects/billing-cycle/BillingCycleSelector.d.ts.map +1 -0
- package/dist/lib/selects/billing-cycle/index.d.ts +3 -0
- package/dist/lib/selects/billing-cycle/index.d.ts.map +1 -0
- package/dist/lib/selects/category/CategoryFilter.d.ts.map +1 -1
- package/dist/lib/selects/category/CategorySelector.d.ts.map +1 -1
- package/dist/lib/selects/cost-category/CostCategorySelector.d.ts.map +1 -1
- package/dist/lib/selects/country/CountryFilter.d.ts +12 -0
- package/dist/lib/selects/country/CountryFilter.d.ts.map +1 -0
- package/dist/lib/selects/country/CountrySelector.d.ts +4 -0
- package/dist/lib/selects/country/CountrySelector.d.ts.map +1 -0
- package/dist/lib/selects/country/index.d.ts +3 -0
- package/dist/lib/selects/country/index.d.ts.map +1 -0
- package/dist/lib/selects/feature-permission/FeaturePermissionFilter.d.ts +12 -0
- package/dist/lib/selects/feature-permission/FeaturePermissionFilter.d.ts.map +1 -0
- package/dist/lib/selects/feature-permission/FeaturePermissionSelector.d.ts +4 -0
- package/dist/lib/selects/feature-permission/FeaturePermissionSelector.d.ts.map +1 -0
- package/dist/lib/selects/feature-permission/index.d.ts +3 -0
- package/dist/lib/selects/feature-permission/index.d.ts.map +1 -0
- package/dist/lib/selects/icon/IconSelect.d.ts.map +1 -1
- package/dist/lib/selects/index.d.ts +9 -0
- package/dist/lib/selects/index.d.ts.map +1 -1
- package/dist/lib/selects/inventory-item/InventoryItemSelector.d.ts +2 -2
- package/dist/lib/selects/inventory-item/InventoryItemSelector.d.ts.map +1 -1
- package/dist/lib/selects/iso-country/ISOCountrySelect.d.ts +15 -0
- package/dist/lib/selects/iso-country/ISOCountrySelect.d.ts.map +1 -0
- package/dist/lib/selects/iso-country/index.d.ts +3 -0
- package/dist/lib/selects/iso-country/index.d.ts.map +1 -0
- package/dist/lib/selects/iso-country/iso-countries.d.ts +7 -0
- package/dist/lib/selects/iso-country/iso-countries.d.ts.map +1 -0
- package/dist/lib/selects/legal-entity/LegalEntityFilter.d.ts +12 -0
- package/dist/lib/selects/legal-entity/LegalEntityFilter.d.ts.map +1 -0
- package/dist/lib/selects/legal-entity/LegalEntitySelector.d.ts +4 -0
- package/dist/lib/selects/legal-entity/LegalEntitySelector.d.ts.map +1 -0
- package/dist/lib/selects/legal-entity/index.d.ts +3 -0
- package/dist/lib/selects/legal-entity/index.d.ts.map +1 -0
- package/dist/lib/selects/location/LocationSelector.d.ts.map +1 -1
- package/dist/lib/selects/purchase-order/PurchaseOrderSelector.d.ts.map +1 -1
- package/dist/lib/selects/purchase-order-item/PurchaseOrderItemSelector.d.ts.map +1 -1
- package/dist/lib/selects/role/RoleSelector.d.ts +4 -0
- package/dist/lib/selects/role/RoleSelector.d.ts.map +1 -0
- package/dist/lib/selects/role/index.d.ts +2 -0
- package/dist/lib/selects/role/index.d.ts.map +1 -0
- package/dist/lib/selects/serial/SerialSelector.d.ts.map +1 -1
- package/dist/lib/selects/site/SiteFilter.d.ts +12 -0
- package/dist/lib/selects/site/SiteFilter.d.ts.map +1 -0
- package/dist/lib/selects/site/SiteSelector.d.ts +4 -0
- package/dist/lib/selects/site/SiteSelector.d.ts.map +1 -0
- package/dist/lib/selects/site/index.d.ts +3 -0
- package/dist/lib/selects/site/index.d.ts.map +1 -0
- package/dist/lib/selects/site-group/SiteGroupFilter.d.ts +12 -0
- package/dist/lib/selects/site-group/SiteGroupFilter.d.ts.map +1 -0
- package/dist/lib/selects/site-group/SiteGroupSelector.d.ts +4 -0
- package/dist/lib/selects/site-group/SiteGroupSelector.d.ts.map +1 -0
- package/dist/lib/selects/site-group/index.d.ts +3 -0
- package/dist/lib/selects/site-group/index.d.ts.map +1 -0
- package/dist/lib/selects/supplier/SupplierSelector.d.ts.map +1 -1
- package/dist/lib/selects/supplier-item/SupplierItemFilter.d.ts.map +1 -1
- package/dist/lib/selects/supplier-item/SupplierItemSelector.d.ts.map +1 -1
- package/dist/lib/selects/tax-class/TaxClassSelector.d.ts +4 -0
- package/dist/lib/selects/tax-class/TaxClassSelector.d.ts.map +1 -0
- package/dist/lib/selects/tax-class/index.d.ts +2 -0
- package/dist/lib/selects/tax-class/index.d.ts.map +1 -0
- package/dist/lib/theme/index.d.ts.map +1 -1
- package/dist/lib/types/catalog-resolver.d.ts +50 -17
- package/dist/lib/types/catalog-resolver.d.ts.map +1 -1
- package/dist/lib/utils/axios.d.ts.map +1 -1
- package/dist/lib/utils/cn.d.ts +3 -0
- package/dist/lib/utils/cn.d.ts.map +1 -0
- package/dist/lib/utils/dagre.d.ts +2 -0
- package/dist/lib/utils/dagre.d.ts.map +1 -0
- package/dist/lib/utils/dnd-kit/core.d.ts +2 -0
- package/dist/lib/utils/dnd-kit/core.d.ts.map +1 -0
- package/dist/lib/utils/dnd-kit/sortable.d.ts +2 -0
- package/dist/lib/utils/dnd-kit/sortable.d.ts.map +1 -0
- package/dist/lib/utils/dnd-kit/utilities.d.ts +2 -0
- package/dist/lib/utils/dnd-kit/utilities.d.ts.map +1 -0
- package/dist/lib/utils/formHelpers.d.ts.map +1 -1
- package/dist/lib/utils/format.d.ts.map +1 -1
- package/dist/lib/utils/permission-deps.d.ts +9 -0
- package/dist/lib/utils/permission-deps.d.ts.map +1 -0
- package/dist/lib/utils/react-flow.d.ts +2 -0
- package/dist/lib/utils/react-flow.d.ts.map +1 -0
- package/dist/lib/utils/zod.d.ts +9 -0
- package/dist/lib/utils/zod.d.ts.map +1 -1
- package/dist/popover.js +1 -1
- package/dist/select2.js +1 -1
- package/dist/selects/billing-cycle.js +2 -0
- package/dist/selects/billing-cycle.js.map +1 -0
- package/dist/selects/cost-category.js +2 -2
- package/dist/selects/cost-category.js.map +1 -1
- package/dist/selects/country.js +2 -0
- package/dist/selects/country.js.map +1 -0
- package/dist/selects/feature-permission.js +2 -0
- package/dist/selects/feature-permission.js.map +1 -0
- package/dist/selects/iso-country.js +2 -0
- package/dist/selects/iso-country.js.map +1 -0
- package/dist/selects/legal-entity.js +2 -0
- package/dist/selects/legal-entity.js.map +1 -0
- package/dist/selects/purchase-order-item.js +1 -1
- package/dist/selects/purchase-order-item.js.map +1 -1
- package/dist/selects/role.js +2 -0
- package/dist/selects/role.js.map +1 -0
- package/dist/selects/site-group.js +2 -0
- package/dist/selects/site-group.js.map +1 -0
- package/dist/selects/site.js +2 -0
- package/dist/selects/site.js.map +1 -0
- package/dist/selects/tax-class.js +2 -0
- package/dist/selects/tax-class.js.map +1 -0
- package/dist/selects/tax-group.js +2 -2
- package/dist/selects/tax-group.js.map +1 -1
- package/dist/separator2.js +1 -1
- package/dist/sortable.esm.js +780 -0
- package/dist/sortable.esm.js.map +1 -0
- package/dist/theme/index.js.map +1 -1
- package/dist/toast.js +2 -26
- package/dist/toast.js.map +1 -1
- package/dist/tooltip2.js +1 -1
- package/dist/types/catalog-resolver.js +5 -2
- package/dist/types/catalog-resolver.js.map +1 -1
- package/dist/useBUTimezone.js.map +1 -1
- package/dist/useDataTable.js +58 -60
- package/dist/useDataTable.js.map +1 -1
- package/dist/useFormatters.js.map +1 -1
- package/dist/useTheme.js.map +1 -1
- package/dist/useTimer.js +2 -2
- package/dist/useTimer.js.map +1 -1
- package/dist/utilities.esm.js +333 -0
- package/dist/utilities.esm.js.map +1 -0
- package/dist/utils/axios.js +1 -1
- package/dist/utils/axios.js.map +1 -1
- package/dist/utils/cn.js +6 -0
- package/dist/utils/cn.js.map +1 -0
- package/dist/utils/currency.js +2 -2
- package/dist/utils/dagre.js +4 -0
- package/dist/utils/dagre.js.map +1 -0
- package/dist/utils/dnd-kit/core.js +2 -0
- package/dist/utils/dnd-kit/core.js.map +1 -0
- package/dist/utils/dnd-kit/sortable.js +2 -0
- package/dist/utils/dnd-kit/sortable.js.map +1 -0
- package/dist/utils/dnd-kit/utilities.js +2 -0
- package/dist/utils/dnd-kit/utilities.js.map +1 -0
- package/dist/utils/format.js +2 -2
- package/dist/utils/format.js.map +1 -1
- package/dist/utils/hotkeys.js +1 -1
- package/dist/utils/money.js +1 -1
- package/dist/utils/permission-deps.js +64 -0
- package/dist/utils/permission-deps.js.map +1 -0
- package/dist/utils/react-flow.js +2 -0
- package/dist/utils/react-flow.js.map +1 -0
- package/dist/utils/timezone.js +1 -1
- package/dist/utils/zod.js +11 -1
- package/dist/utils/zod.js.map +1 -1
- package/package.json +73 -1
package/dist/DatePicker.js
CHANGED
|
@@ -167,8 +167,8 @@ const DatePicker = forwardRef((rawProps, ref) => {
|
|
|
167
167
|
const nextMinDay = minDayTime === null ? void 0 : new Date(minDayTime);
|
|
168
168
|
const nextMaxDay = maxDayTime === null ? void 0 : new Date(maxDayTime);
|
|
169
169
|
setMonth((currentMonth) => clampMonth(currentMonth, nextMinDay, nextMaxDay));
|
|
170
|
-
onValueChange?.(
|
|
171
|
-
onChange?.(
|
|
170
|
+
onValueChange?.(null);
|
|
171
|
+
onChange?.(null);
|
|
172
172
|
}, [controlled, rawSelectedTime, selectedTime, minDayTime, maxDayTime, onValueChange, onChange]);
|
|
173
173
|
useEffect(() => {
|
|
174
174
|
if (selectedTime !== null) return;
|
|
@@ -177,7 +177,7 @@ const DatePicker = forwardRef((rawProps, ref) => {
|
|
|
177
177
|
setMonth((currentMonth) => clampMonth(currentMonth, nextMinDay, nextMaxDay));
|
|
178
178
|
}, [selectedTime, minDayTime, maxDayTime]);
|
|
179
179
|
const emit = (next) => {
|
|
180
|
-
const iso = toIso(next);
|
|
180
|
+
const iso = toIso(next) ?? null;
|
|
181
181
|
onValueChange?.(iso);
|
|
182
182
|
onChange?.(iso);
|
|
183
183
|
};
|
package/dist/DatePicker.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DatePicker.js","sources":["../lib/components/DatePicker/DatePicker.tsx"],"sourcesContent":["import {\n min as earliestDate,\n format,\n getDaysInMonth,\n isAfter,\n isBefore,\n isValid,\n max as latestDate,\n parse,\n startOfDay,\n startOfMonth,\n} from 'date-fns';\nimport { CalendarIcon } from 'lucide-react';\nimport type React from 'react';\nimport { forwardRef, useEffect, useRef, useState } from 'react';\nimport { Button } from '../../../shadcn/shadcnButton';\nimport { Calendar, type CalendarProps } from '../../../shadcn/shadcnCalendar';\nimport { Input } from '../../../shadcn/shadcnInput';\nimport { Popover, PopoverContent, PopoverTrigger } from '../../../shadcn/shadcnPopover';\nimport { useLocale } from '../../hooks/useLocale';\nimport { Field, FieldDescription, FieldError, FieldLabel } from '../Field';\n\ntype DatePickerValue = string | undefined;\ntype DateParts = { day: string; month: string; year: string };\n\nconst ISO = 'yyyy-MM-dd';\nconst MANUAL = 'dd/MM/yyyy';\nconst DEFAULT_DISPLAY = 'P';\nconst objectWithHasOwn = Object as ObjectConstructor & { hasOwn(target: object, key: PropertyKey): boolean };\n\nconst emptyParts = (): DateParts => ({ day: '', month: '', year: '' });\nconst digits = (value: string, max: number) => value.replace(/\\D/g, '').slice(0, max);\nconst hasValueProp = (props: object, key: string) => objectWithHasOwn.hasOwn(props, key);\nconst parseIso = (value?: string) => {\n if (!value || !/^\\d{4}-\\d{2}-\\d{2}$/.test(value)) return undefined;\n const next = parse(value, ISO, new Date());\n return isValid(next) && format(next, ISO) === value ? next : undefined;\n};\nconst toParts = (date?: Date): DateParts =>\n date\n ? {\n day: format(date, 'dd'),\n month: format(date, 'MM'),\n year: format(date, 'yyyy'),\n }\n : emptyParts();\nconst toIso = (date?: Date) => (date ? format(date, ISO) : undefined);\n\nconst parseManualDate = ({ day, month, year }: DateParts) => {\n if (day.length !== 2 || month.length !== 2 || year.length !== 4) return undefined;\n const next = parse(`${day}/${month}/${year}`, MANUAL, new Date());\n return isValid(next) && format(next, MANUAL) === `${day}/${month}/${year}` ? next : undefined;\n};\n\nconst previewManualDate = (parts: DateParts, fallbackMonth: Date) => {\n const year = parts.year ? Number(parts.year) : fallbackMonth.getFullYear();\n const month = parts.month ? Number(parts.month) : fallbackMonth.getMonth() + 1;\n const day = parts.day ? Number(parts.day) : Number.NaN;\n\n if (!Number.isInteger(year) || year < 1 || !Number.isInteger(month) || month < 1 || month > 12) return undefined;\n if (!Number.isInteger(day) || day < 1) return undefined;\n\n const maxDay = getDaysInMonth(new Date(year, month - 1, 1));\n if (day > maxDay) return undefined;\n\n const next = new Date(year, month - 1, day);\n return isValid(next) ? next : undefined;\n};\n\nconst latest = (dates: Array<Date | undefined>) => {\n const values = dates.filter((value): value is Date => !!value);\n return values.length > 0 ? latestDate(values) : undefined;\n};\n\nconst earliest = (dates: Array<Date | undefined>) => {\n const values = dates.filter((value): value is Date => !!value);\n return values.length > 0 ? earliestDate(values) : undefined;\n};\n\nconst isWithinDayBounds = (date: Date, minDay?: Date, maxDay?: Date) =>\n (!minDay || !isBefore(startOfDay(date), minDay)) && (!maxDay || !isAfter(startOfDay(date), maxDay));\n\nconst coerceWithinDayBounds = (date: Date | undefined, minDay?: Date, maxDay?: Date) =>\n date && isWithinDayBounds(date, minDay, maxDay) ? date : undefined;\n\nconst visibleMonthFromParts = (parts: DateParts, fallbackMonth: Date) => {\n const hasYear = parts.year.length === 4;\n const hasMonth = parts.month.length > 0;\n\n if (!hasYear && !hasMonth) return fallbackMonth;\n\n const year = hasYear ? Number(parts.year) : fallbackMonth.getFullYear();\n const month = hasMonth ? Number(parts.month) : fallbackMonth.getMonth() + 1;\n\n if (!Number.isInteger(year) || year < 1 || year > 9999) return fallbackMonth;\n if (!Number.isInteger(month) || month < 1 || month > 12) return new Date(year, fallbackMonth.getMonth(), 1);\n\n return new Date(year, month - 1, 1);\n};\n\nconst clampMonth = (month: Date, minDay?: Date, maxDay?: Date) => {\n const monthStart = startOfMonth(month);\n const minMonth = minDay ? startOfMonth(minDay) : undefined;\n const maxMonth = maxDay ? startOfMonth(maxDay) : undefined;\n\n if (minMonth && minDay && isBefore(monthStart, minMonth)) return minDay;\n if (maxMonth && maxDay && isAfter(monthStart, maxMonth)) return maxDay;\n return month;\n};\n\nconst maxDayForParts = (parts: DateParts, fallbackMonth: Date) => {\n const year = parts.year.length === 4 ? Number(parts.year) : fallbackMonth.getFullYear();\n const month = parts.month.length > 0 ? Number(parts.month) - 1 : fallbackMonth.getMonth();\n const safeMonth = month >= 0 && month < 12 ? month : fallbackMonth.getMonth();\n return getDaysInMonth(new Date(year, safeMonth, 1));\n};\n\nconst mergeDisabledMatchers = (\n disabled: CalendarProps['disabled'],\n minDay?: Date,\n maxDay?: Date,\n): CalendarProps['disabled'] => {\n const matchers = disabled ? (Array.isArray(disabled) ? [...disabled] : [disabled]) : [];\n if (minDay) matchers.push({ before: minDay });\n if (maxDay) matchers.push({ after: maxDay });\n return matchers.length > 0 ? matchers : undefined;\n};\n\nexport interface DatePickerProps {\n name?: string;\n label?: string;\n description?: React.ReactNode;\n error?: string;\n placeholder?: string;\n value?: DatePickerValue;\n onValueChange?: (value: string | undefined) => void;\n onChange?: (value: string | undefined) => void;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n calendarProps?: CalendarProps;\n className?: string;\n id?: string;\n onBlur?: () => void;\n disabled?: boolean;\n disableInput?: boolean;\n displayFormat?: string;\n minDate?: Date;\n maxDate?: Date;\n}\n\nexport const DatePicker = forwardRef<HTMLInputElement, DatePickerProps>((rawProps, ref) => {\n const controlled = hasValueProp(rawProps, 'value');\n const openControlled = hasValueProp(rawProps, 'open');\n const {\n label,\n description,\n error,\n placeholder = 'Select date',\n value,\n onValueChange,\n onChange,\n open: openProp,\n onOpenChange,\n calendarProps,\n className,\n id,\n onBlur,\n disabled,\n disableInput = true,\n displayFormat = DEFAULT_DISPLAY,\n minDate,\n maxDate,\n ...props\n } = rawProps;\n\n const locale = useLocale();\n const formatOptions = locale ? { locale } : undefined;\n\n const parsedValue = parseIso(value);\n const minDay = minDate ? startOfDay(minDate) : undefined;\n const maxDay = maxDate ? startOfDay(maxDate) : undefined;\n const {\n mode: _calendarMode,\n month: _calendarMonth,\n onMonthChange: calendarOnMonthChange,\n startMonth: calendarStartMonth,\n endMonth: calendarEndMonth,\n disabled: calendarDisabledProp,\n captionLayout: _calendarCaptionLayout,\n ...calendarRestProps\n } = calendarProps ?? {};\n\n const [localValue, setLocalValue] = useState<Date | undefined>(() =>\n coerceWithinDayBounds(parsedValue, minDay, maxDay),\n );\n const [openState, setOpenState] = useState(false);\n const [month, setMonth] = useState<Date>(() =>\n clampMonth(parsedValue ?? minDay ?? maxDay ?? new Date(), minDay, maxDay),\n );\n const [draftParts, setDraftParts] = useState<DateParts>(() => toParts(parsedValue));\n const lastInvalidTimeRef = useRef<number | null>(null);\n\n const rawSelected = controlled ? parsedValue : localValue;\n const selected = coerceWithinDayBounds(rawSelected, minDay, maxDay);\n const rawSelectedTime = rawSelected?.getTime() ?? null;\n const minDayTime = minDay?.getTime() ?? null;\n const maxDayTime = maxDay?.getTime() ?? null;\n const selectedTime = selected?.getTime() ?? null;\n const selectedPreview = previewManualDate(draftParts, month);\n const calendarSelected =\n selectedPreview && isWithinDayBounds(selectedPreview, minDay, maxDay) ? selectedPreview : selected;\n const inputId = id ?? props.name ?? 'date';\n const startMonth = latest([minDay, calendarStartMonth]);\n const endMonth = earliest([maxDay, calendarEndMonth]);\n const calendarDisabled = mergeDisabledMatchers(calendarDisabledProp, minDay, maxDay);\n const isOpen = openControlled ? openProp : openState;\n const setOpen = openControlled ? (onOpenChange ?? (() => {})) : setOpenState;\n\n useEffect(() => {\n if (!controlled) return;\n const next = selectedTime === null ? undefined : new Date(selectedTime);\n const nextMinDay = minDayTime === null ? undefined : new Date(minDayTime);\n const nextMaxDay = maxDayTime === null ? undefined : new Date(maxDayTime);\n setDraftParts(toParts(next));\n setMonth((currentMonth) => (next ? next : clampMonth(currentMonth, nextMinDay, nextMaxDay)));\n }, [controlled, selectedTime, minDayTime, maxDayTime]);\n\n useEffect(() => {\n if (rawSelectedTime === null || selectedTime !== null) {\n lastInvalidTimeRef.current = null;\n return;\n }\n if (lastInvalidTimeRef.current === rawSelectedTime) return;\n\n lastInvalidTimeRef.current = rawSelectedTime;\n\n if (!controlled) setLocalValue(undefined);\n setDraftParts(emptyParts());\n\n const nextMinDay = minDayTime === null ? undefined : new Date(minDayTime);\n const nextMaxDay = maxDayTime === null ? undefined : new Date(maxDayTime);\n setMonth((currentMonth) => clampMonth(currentMonth, nextMinDay, nextMaxDay));\n\n onValueChange?.(undefined);\n onChange?.(undefined);\n }, [controlled, rawSelectedTime, selectedTime, minDayTime, maxDayTime, onValueChange, onChange]);\n\n useEffect(() => {\n if (selectedTime !== null) return;\n const nextMinDay = minDayTime === null ? undefined : new Date(minDayTime);\n const nextMaxDay = maxDayTime === null ? undefined : new Date(maxDayTime);\n setMonth((currentMonth) => clampMonth(currentMonth, nextMinDay, nextMaxDay));\n }, [selectedTime, minDayTime, maxDayTime]);\n\n const emit = (next?: Date) => {\n const iso = toIso(next);\n onValueChange?.(iso);\n onChange?.(iso);\n };\n\n const commit = (next?: Date) => {\n if (!controlled) setLocalValue(next);\n setDraftParts(toParts(next));\n setMonth((currentMonth) => (next ? next : clampMonth(currentMonth, minDay, maxDay)));\n emit(next);\n };\n\n const updateDraftDate = (nextParts: DateParts) => {\n setDraftParts(nextParts);\n\n const nextMonth = clampMonth(visibleMonthFromParts(nextParts, month), minDay, maxDay);\n if (nextMonth.getTime() !== month.getTime()) setMonth(nextMonth);\n\n if (!nextParts.day && !nextParts.month && !nextParts.year) {\n commit(undefined);\n return;\n }\n\n const parsedDate = parseManualDate(nextParts);\n if (!parsedDate || !isWithinDayBounds(parsedDate, minDay, maxDay)) return;\n\n commit(parsedDate);\n };\n\n return (\n <Field data-disabled={disabled}>\n {label && <FieldLabel htmlFor={inputId}>{label}</FieldLabel>}\n <div className=\"relative\">\n <Input\n ref={ref}\n id={inputId}\n value={selected ? format(selected, displayFormat, formatOptions) : ''}\n disabled={disabled}\n readOnly\n aria-invalid={!!error}\n placeholder={placeholder}\n className={`pr-10 ${className ?? ''}`.trim()}\n onClick={() => !disabled && setOpen(true)}\n onBlur={() => onBlur?.()}\n onKeyDown={(e) => {\n if (e.key !== 'ArrowDown') return;\n e.preventDefault();\n setOpen(true);\n }}\n {...props}\n />\n <div className=\"absolute inset-y-0 right-1 flex items-center\">\n <Popover open={isOpen} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-xs\"\n aria-label=\"Select date\"\n disabled={disabled}\n className=\"text-muted-foreground hover:text-foreground\"\n >\n <CalendarIcon />\n <span className=\"sr-only\">Select date</span>\n </Button>\n </PopoverTrigger>\n <PopoverContent className=\"w-auto overflow-hidden p-0\" align=\"end\" sideOffset={10}>\n {!disableInput && (\n <div className=\"border-b p-2\">\n <div className=\"flex items-center justify-center\">\n <div className=\"inline-flex items-center gap-1 rounded-lg border border-border/70 bg-muted/40 p-1\">\n <Input\n value={draftParts.day}\n placeholder=\"DD\"\n inputMode=\"numeric\"\n maxLength={2}\n className=\"!h-6 w-10 rounded-md border-transparent bg-background px-1.5 py-0 text-center text-xs font-semibold shadow-xs\"\n onChange={(e) => {\n const day = digits(e.target.value, 2);\n if (day === '00') return;\n if (day.length === 2) {\n const nextDay = Number(day);\n if (nextDay < 1 || nextDay > maxDayForParts(draftParts, month)) return;\n }\n updateDraftDate({ ...draftParts, day });\n }}\n />\n <Input\n value={draftParts.month}\n placeholder=\"MM\"\n inputMode=\"numeric\"\n maxLength={2}\n className=\"!h-6 w-10 rounded-md border-transparent bg-background px-1.5 py-0 text-center text-xs font-semibold shadow-xs\"\n onChange={(e) => {\n const monthValue = digits(e.target.value, 2);\n if (monthValue === '00') return;\n if (monthValue.length === 2) {\n const nextMonth = Number(monthValue);\n if (nextMonth < 1 || nextMonth > 12) return;\n }\n\n let day = draftParts.day;\n if (day.length === 2) {\n const cappedDay = Math.min(\n Number(day),\n maxDayForParts({ ...draftParts, month: monthValue }, month),\n );\n day = String(cappedDay).padStart(2, '0');\n }\n\n updateDraftDate({ ...draftParts, day, month: monthValue });\n }}\n />\n <Input\n value={draftParts.year}\n placeholder=\"YYYY\"\n inputMode=\"numeric\"\n maxLength={4}\n className=\"!h-6 w-16 rounded-md border-transparent bg-background px-1.5 py-0 text-center text-xs font-semibold shadow-xs\"\n onChange={(e) => updateDraftDate({ ...draftParts, year: digits(e.target.value, 4) })}\n onKeyDown={(e) => {\n if (e.key !== 'Enter') return;\n e.preventDefault();\n updateDraftDate(draftParts);\n setOpen(false);\n }}\n />\n </div>\n </div>\n </div>\n )}\n <Calendar\n {...calendarRestProps}\n locale={calendarRestProps.locale ?? locale}\n mode=\"single\"\n captionLayout=\"label\"\n startMonth={startMonth}\n endMonth={endMonth}\n disabled={calendarDisabled}\n month={month}\n onMonthChange={(nextMonth) => {\n const safeMonth = clampMonth(nextMonth, minDay, maxDay);\n setMonth(safeMonth);\n setDraftParts((current) => ({\n ...current,\n month: format(safeMonth, 'MM', formatOptions),\n year: format(safeMonth, 'yyyy', formatOptions),\n }));\n calendarOnMonthChange?.(safeMonth);\n }}\n selected={calendarSelected}\n onSelect={(next) => {\n // react-day-picker's mode=\"single\" toggles to undefined when the user clicks\n // the already-selected date. Ignore that path — clicking a highlighted date\n // shouldn't silently clear the value (it's nearly always an accident). To clear,\n // use the manual input or a dedicated Clear UI.\n if (!next) return;\n if (!isWithinDayBounds(next, minDay, maxDay)) return;\n commit(next);\n onBlur?.();\n setOpen(false);\n }}\n />\n </PopoverContent>\n </Popover>\n </div>\n </div>\n {description && !error && <FieldDescription>{description}</FieldDescription>}\n {error && <FieldError>{error}</FieldError>}\n </Field>\n );\n});\n\nDatePicker.displayName = 'DatePicker';\n"],"names":["latestDate","earliestDate","CalendarIcon","Calendar"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"DatePicker.js","sources":["../lib/components/DatePicker/DatePicker.tsx"],"sourcesContent":["import {\n min as earliestDate,\n format,\n getDaysInMonth,\n isAfter,\n isBefore,\n isValid,\n max as latestDate,\n parse,\n startOfDay,\n startOfMonth,\n} from 'date-fns';\nimport { CalendarIcon } from 'lucide-react';\nimport type React from 'react';\nimport { forwardRef, useEffect, useRef, useState } from 'react';\nimport { Button } from '../../../shadcn/shadcnButton';\nimport { Calendar, type CalendarProps } from '../../../shadcn/shadcnCalendar';\nimport { Input } from '../../../shadcn/shadcnInput';\nimport { Popover, PopoverContent, PopoverTrigger } from '../../../shadcn/shadcnPopover';\nimport { useLocale } from '../../hooks/useLocale';\nimport { Field, FieldDescription, FieldError, FieldLabel } from '../Field';\n\ntype DatePickerValue = string | undefined;\ntype DateParts = { day: string; month: string; year: string };\n\nconst ISO = 'yyyy-MM-dd';\nconst MANUAL = 'dd/MM/yyyy';\nconst DEFAULT_DISPLAY = 'P';\nconst objectWithHasOwn = Object as ObjectConstructor & { hasOwn(target: object, key: PropertyKey): boolean };\n\nconst emptyParts = (): DateParts => ({ day: '', month: '', year: '' });\nconst digits = (value: string, max: number) => value.replace(/\\D/g, '').slice(0, max);\nconst hasValueProp = (props: object, key: string) => objectWithHasOwn.hasOwn(props, key);\nconst parseIso = (value?: string) => {\n if (!value || !/^\\d{4}-\\d{2}-\\d{2}$/.test(value)) return undefined;\n const next = parse(value, ISO, new Date());\n return isValid(next) && format(next, ISO) === value ? next : undefined;\n};\nconst toParts = (date?: Date): DateParts =>\n date\n ? {\n day: format(date, 'dd'),\n month: format(date, 'MM'),\n year: format(date, 'yyyy'),\n }\n : emptyParts();\nconst toIso = (date?: Date) => (date ? format(date, ISO) : undefined);\n\nconst parseManualDate = ({ day, month, year }: DateParts) => {\n if (day.length !== 2 || month.length !== 2 || year.length !== 4) return undefined;\n const next = parse(`${day}/${month}/${year}`, MANUAL, new Date());\n return isValid(next) && format(next, MANUAL) === `${day}/${month}/${year}` ? next : undefined;\n};\n\nconst previewManualDate = (parts: DateParts, fallbackMonth: Date) => {\n const year = parts.year ? Number(parts.year) : fallbackMonth.getFullYear();\n const month = parts.month ? Number(parts.month) : fallbackMonth.getMonth() + 1;\n const day = parts.day ? Number(parts.day) : Number.NaN;\n\n if (!Number.isInteger(year) || year < 1 || !Number.isInteger(month) || month < 1 || month > 12) return undefined;\n if (!Number.isInteger(day) || day < 1) return undefined;\n\n const maxDay = getDaysInMonth(new Date(year, month - 1, 1));\n if (day > maxDay) return undefined;\n\n const next = new Date(year, month - 1, day);\n return isValid(next) ? next : undefined;\n};\n\nconst latest = (dates: Array<Date | undefined>) => {\n const values = dates.filter((value): value is Date => !!value);\n return values.length > 0 ? latestDate(values) : undefined;\n};\n\nconst earliest = (dates: Array<Date | undefined>) => {\n const values = dates.filter((value): value is Date => !!value);\n return values.length > 0 ? earliestDate(values) : undefined;\n};\n\nconst isWithinDayBounds = (date: Date, minDay?: Date, maxDay?: Date) =>\n (!minDay || !isBefore(startOfDay(date), minDay)) && (!maxDay || !isAfter(startOfDay(date), maxDay));\n\nconst coerceWithinDayBounds = (date: Date | undefined, minDay?: Date, maxDay?: Date) =>\n date && isWithinDayBounds(date, minDay, maxDay) ? date : undefined;\n\nconst visibleMonthFromParts = (parts: DateParts, fallbackMonth: Date) => {\n const hasYear = parts.year.length === 4;\n const hasMonth = parts.month.length > 0;\n\n if (!hasYear && !hasMonth) return fallbackMonth;\n\n const year = hasYear ? Number(parts.year) : fallbackMonth.getFullYear();\n const month = hasMonth ? Number(parts.month) : fallbackMonth.getMonth() + 1;\n\n if (!Number.isInteger(year) || year < 1 || year > 9999) return fallbackMonth;\n if (!Number.isInteger(month) || month < 1 || month > 12) return new Date(year, fallbackMonth.getMonth(), 1);\n\n return new Date(year, month - 1, 1);\n};\n\nconst clampMonth = (month: Date, minDay?: Date, maxDay?: Date) => {\n const monthStart = startOfMonth(month);\n const minMonth = minDay ? startOfMonth(minDay) : undefined;\n const maxMonth = maxDay ? startOfMonth(maxDay) : undefined;\n\n if (minMonth && minDay && isBefore(monthStart, minMonth)) return minDay;\n if (maxMonth && maxDay && isAfter(monthStart, maxMonth)) return maxDay;\n return month;\n};\n\nconst maxDayForParts = (parts: DateParts, fallbackMonth: Date) => {\n const year = parts.year.length === 4 ? Number(parts.year) : fallbackMonth.getFullYear();\n const month = parts.month.length > 0 ? Number(parts.month) - 1 : fallbackMonth.getMonth();\n const safeMonth = month >= 0 && month < 12 ? month : fallbackMonth.getMonth();\n return getDaysInMonth(new Date(year, safeMonth, 1));\n};\n\nconst mergeDisabledMatchers = (\n disabled: CalendarProps['disabled'],\n minDay?: Date,\n maxDay?: Date,\n): CalendarProps['disabled'] => {\n const matchers = disabled ? (Array.isArray(disabled) ? [...disabled] : [disabled]) : [];\n if (minDay) matchers.push({ before: minDay });\n if (maxDay) matchers.push({ after: maxDay });\n return matchers.length > 0 ? matchers : undefined;\n};\n\nexport interface DatePickerProps {\n name?: string;\n label?: string;\n description?: React.ReactNode;\n error?: string;\n placeholder?: string;\n value?: DatePickerValue;\n onValueChange?: (value: string | null) => void;\n onChange?: (value: string | null) => void;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n calendarProps?: CalendarProps;\n className?: string;\n id?: string;\n onBlur?: () => void;\n disabled?: boolean;\n disableInput?: boolean;\n displayFormat?: string;\n minDate?: Date;\n maxDate?: Date;\n}\n\nexport const DatePicker = forwardRef<HTMLInputElement, DatePickerProps>((rawProps, ref) => {\n const controlled = hasValueProp(rawProps, 'value');\n const openControlled = hasValueProp(rawProps, 'open');\n const {\n label,\n description,\n error,\n placeholder = 'Select date',\n value,\n onValueChange,\n onChange,\n open: openProp,\n onOpenChange,\n calendarProps,\n className,\n id,\n onBlur,\n disabled,\n disableInput = true,\n displayFormat = DEFAULT_DISPLAY,\n minDate,\n maxDate,\n ...props\n } = rawProps;\n\n const locale = useLocale();\n const formatOptions = locale ? { locale } : undefined;\n\n const parsedValue = parseIso(value);\n const minDay = minDate ? startOfDay(minDate) : undefined;\n const maxDay = maxDate ? startOfDay(maxDate) : undefined;\n const {\n mode: _calendarMode,\n month: _calendarMonth,\n onMonthChange: calendarOnMonthChange,\n startMonth: calendarStartMonth,\n endMonth: calendarEndMonth,\n disabled: calendarDisabledProp,\n captionLayout: _calendarCaptionLayout,\n ...calendarRestProps\n } = calendarProps ?? {};\n\n const [localValue, setLocalValue] = useState<Date | undefined>(() =>\n coerceWithinDayBounds(parsedValue, minDay, maxDay),\n );\n const [openState, setOpenState] = useState(false);\n const [month, setMonth] = useState<Date>(() =>\n clampMonth(parsedValue ?? minDay ?? maxDay ?? new Date(), minDay, maxDay),\n );\n const [draftParts, setDraftParts] = useState<DateParts>(() => toParts(parsedValue));\n const lastInvalidTimeRef = useRef<number | null>(null);\n\n const rawSelected = controlled ? parsedValue : localValue;\n const selected = coerceWithinDayBounds(rawSelected, minDay, maxDay);\n const rawSelectedTime = rawSelected?.getTime() ?? null;\n const minDayTime = minDay?.getTime() ?? null;\n const maxDayTime = maxDay?.getTime() ?? null;\n const selectedTime = selected?.getTime() ?? null;\n const selectedPreview = previewManualDate(draftParts, month);\n const calendarSelected =\n selectedPreview && isWithinDayBounds(selectedPreview, minDay, maxDay) ? selectedPreview : selected;\n const inputId = id ?? props.name ?? 'date';\n const startMonth = latest([minDay, calendarStartMonth]);\n const endMonth = earliest([maxDay, calendarEndMonth]);\n const calendarDisabled = mergeDisabledMatchers(calendarDisabledProp, minDay, maxDay);\n const isOpen = openControlled ? openProp : openState;\n const setOpen = openControlled ? (onOpenChange ?? (() => {})) : setOpenState;\n\n useEffect(() => {\n if (!controlled) return;\n const next = selectedTime === null ? undefined : new Date(selectedTime);\n const nextMinDay = minDayTime === null ? undefined : new Date(minDayTime);\n const nextMaxDay = maxDayTime === null ? undefined : new Date(maxDayTime);\n setDraftParts(toParts(next));\n setMonth((currentMonth) => (next ? next : clampMonth(currentMonth, nextMinDay, nextMaxDay)));\n }, [controlled, selectedTime, minDayTime, maxDayTime]);\n\n useEffect(() => {\n if (rawSelectedTime === null || selectedTime !== null) {\n lastInvalidTimeRef.current = null;\n return;\n }\n if (lastInvalidTimeRef.current === rawSelectedTime) return;\n\n lastInvalidTimeRef.current = rawSelectedTime;\n\n if (!controlled) setLocalValue(undefined);\n setDraftParts(emptyParts());\n\n const nextMinDay = minDayTime === null ? undefined : new Date(minDayTime);\n const nextMaxDay = maxDayTime === null ? undefined : new Date(maxDayTime);\n setMonth((currentMonth) => clampMonth(currentMonth, nextMinDay, nextMaxDay));\n\n onValueChange?.(null);\n onChange?.(null);\n }, [controlled, rawSelectedTime, selectedTime, minDayTime, maxDayTime, onValueChange, onChange]);\n\n useEffect(() => {\n if (selectedTime !== null) return;\n const nextMinDay = minDayTime === null ? undefined : new Date(minDayTime);\n const nextMaxDay = maxDayTime === null ? undefined : new Date(maxDayTime);\n setMonth((currentMonth) => clampMonth(currentMonth, nextMinDay, nextMaxDay));\n }, [selectedTime, minDayTime, maxDayTime]);\n\n const emit = (next?: Date) => {\n const iso = toIso(next) ?? null;\n onValueChange?.(iso);\n onChange?.(iso);\n };\n\n const commit = (next?: Date) => {\n if (!controlled) setLocalValue(next);\n setDraftParts(toParts(next));\n setMonth((currentMonth) => (next ? next : clampMonth(currentMonth, minDay, maxDay)));\n emit(next);\n };\n\n const updateDraftDate = (nextParts: DateParts) => {\n setDraftParts(nextParts);\n\n const nextMonth = clampMonth(visibleMonthFromParts(nextParts, month), minDay, maxDay);\n if (nextMonth.getTime() !== month.getTime()) setMonth(nextMonth);\n\n if (!nextParts.day && !nextParts.month && !nextParts.year) {\n commit(undefined);\n return;\n }\n\n const parsedDate = parseManualDate(nextParts);\n if (!parsedDate || !isWithinDayBounds(parsedDate, minDay, maxDay)) return;\n\n commit(parsedDate);\n };\n\n return (\n <Field data-disabled={disabled}>\n {label && <FieldLabel htmlFor={inputId}>{label}</FieldLabel>}\n <div className=\"relative\">\n <Input\n ref={ref}\n id={inputId}\n value={selected ? format(selected, displayFormat, formatOptions) : ''}\n disabled={disabled}\n readOnly\n aria-invalid={!!error}\n placeholder={placeholder}\n className={`pr-10 ${className ?? ''}`.trim()}\n onClick={() => !disabled && setOpen(true)}\n onBlur={() => onBlur?.()}\n onKeyDown={(e) => {\n if (e.key !== 'ArrowDown') return;\n e.preventDefault();\n setOpen(true);\n }}\n {...props}\n />\n <div className=\"absolute inset-y-0 right-1 flex items-center\">\n <Popover open={isOpen} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-xs\"\n aria-label=\"Select date\"\n disabled={disabled}\n className=\"text-muted-foreground hover:text-foreground\"\n >\n <CalendarIcon />\n <span className=\"sr-only\">Select date</span>\n </Button>\n </PopoverTrigger>\n <PopoverContent className=\"w-auto overflow-hidden p-0\" align=\"end\" sideOffset={10}>\n {!disableInput && (\n <div className=\"border-b p-2\">\n <div className=\"flex items-center justify-center\">\n <div className=\"inline-flex items-center gap-1 rounded-lg border border-border/70 bg-muted/40 p-1\">\n <Input\n value={draftParts.day}\n placeholder=\"DD\"\n inputMode=\"numeric\"\n maxLength={2}\n className=\"!h-6 w-10 rounded-md border-transparent bg-background px-1.5 py-0 text-center text-xs font-semibold shadow-xs\"\n onChange={(e) => {\n const day = digits(e.target.value, 2);\n if (day === '00') return;\n if (day.length === 2) {\n const nextDay = Number(day);\n if (nextDay < 1 || nextDay > maxDayForParts(draftParts, month)) return;\n }\n updateDraftDate({ ...draftParts, day });\n }}\n />\n <Input\n value={draftParts.month}\n placeholder=\"MM\"\n inputMode=\"numeric\"\n maxLength={2}\n className=\"!h-6 w-10 rounded-md border-transparent bg-background px-1.5 py-0 text-center text-xs font-semibold shadow-xs\"\n onChange={(e) => {\n const monthValue = digits(e.target.value, 2);\n if (monthValue === '00') return;\n if (monthValue.length === 2) {\n const nextMonth = Number(monthValue);\n if (nextMonth < 1 || nextMonth > 12) return;\n }\n\n let day = draftParts.day;\n if (day.length === 2) {\n const cappedDay = Math.min(\n Number(day),\n maxDayForParts({ ...draftParts, month: monthValue }, month),\n );\n day = String(cappedDay).padStart(2, '0');\n }\n\n updateDraftDate({ ...draftParts, day, month: monthValue });\n }}\n />\n <Input\n value={draftParts.year}\n placeholder=\"YYYY\"\n inputMode=\"numeric\"\n maxLength={4}\n className=\"!h-6 w-16 rounded-md border-transparent bg-background px-1.5 py-0 text-center text-xs font-semibold shadow-xs\"\n onChange={(e) => updateDraftDate({ ...draftParts, year: digits(e.target.value, 4) })}\n onKeyDown={(e) => {\n if (e.key !== 'Enter') return;\n e.preventDefault();\n updateDraftDate(draftParts);\n setOpen(false);\n }}\n />\n </div>\n </div>\n </div>\n )}\n <Calendar\n {...calendarRestProps}\n locale={calendarRestProps.locale ?? locale}\n mode=\"single\"\n captionLayout=\"label\"\n startMonth={startMonth}\n endMonth={endMonth}\n disabled={calendarDisabled}\n month={month}\n onMonthChange={(nextMonth) => {\n const safeMonth = clampMonth(nextMonth, minDay, maxDay);\n setMonth(safeMonth);\n setDraftParts((current) => ({\n ...current,\n month: format(safeMonth, 'MM', formatOptions),\n year: format(safeMonth, 'yyyy', formatOptions),\n }));\n calendarOnMonthChange?.(safeMonth);\n }}\n selected={calendarSelected}\n onSelect={(next) => {\n // Ignore react-day-picker's toggle-to-undefined when clicking the already-selected date (accidental clear); use manual input to clear\n if (!next) return;\n if (!isWithinDayBounds(next, minDay, maxDay)) return;\n commit(next);\n onBlur?.();\n setOpen(false);\n }}\n />\n </PopoverContent>\n </Popover>\n </div>\n </div>\n {description && !error && <FieldDescription>{description}</FieldDescription>}\n {error && <FieldError>{error}</FieldError>}\n </Field>\n );\n});\n\nDatePicker.displayName = 'DatePicker';\n"],"names":["latestDate","earliestDate","CalendarIcon","Calendar"],"mappings":"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"}
|
package/dist/DateTimePicker.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
|
-
import { T as TZDate } from './
|
|
3
|
-
import { t as tz } from './
|
|
2
|
+
import { T as TZDate } from './index6.js';
|
|
3
|
+
import { t as tz } from './index7.js';
|
|
4
4
|
import { forwardRef, useState, useRef, useEffect } from 'react';
|
|
5
5
|
import { u as useBUTimezone } from './useBUTimezone.js';
|
|
6
6
|
import { u as useLocale } from './useLocale.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DetailSectionSkeleton.js","sources":["../lib/components/DetailField/DetailField.tsx","../lib/components/DetailField/DetailHeader.tsx","../lib/components/DetailField/DetailSection.tsx","../lib/components/DetailField/DetailSectionSkeleton.tsx"],"sourcesContent":["import type React from 'react';\nimport { useFormatters } from '../../hooks/useFormatters';\nimport type { CurrencyAmount } from '../../utils/format';\nimport { Skeleton } from '../Skeleton';\n\nexport type DetailFieldType = 'string' | 'number' | 'currency' | 'date' | 'dateTime';\n\nexport type { CurrencyAmount };\n\ninterface DetailFieldBase {\n label: React.ReactNode;\n className?: string;\n loading?: boolean;\n}\n\ninterface DetailFieldStringProps extends DetailFieldBase {\n type: 'string';\n value: React.ReactNode;\n
|
|
1
|
+
{"version":3,"file":"DetailSectionSkeleton.js","sources":["../lib/components/DetailField/DetailField.tsx","../lib/components/DetailField/DetailHeader.tsx","../lib/components/DetailField/DetailSection.tsx","../lib/components/DetailField/DetailSectionSkeleton.tsx"],"sourcesContent":["import type React from 'react';\nimport { useFormatters } from '../../hooks/useFormatters';\nimport type { CurrencyAmount } from '../../utils/format';\nimport { Skeleton } from '../Skeleton';\n\nexport type DetailFieldType = 'string' | 'number' | 'currency' | 'date' | 'dateTime';\n\nexport type { CurrencyAmount };\n\ninterface DetailFieldBase {\n label: React.ReactNode;\n className?: string;\n loading?: boolean;\n}\n\ninterface DetailFieldStringProps extends DetailFieldBase {\n type: 'string';\n value: React.ReactNode;\n mono?: boolean;\n}\n\ninterface DetailFieldNumberProps extends DetailFieldBase {\n type: 'number';\n value: number | string | null | undefined;\n fractionDigits?: number;\n}\n\ninterface DetailFieldCurrencyProps extends DetailFieldBase {\n type: 'currency';\n value: CurrencyAmount | null | undefined;\n exchangeRate?: number | null;\n}\n\ninterface DetailFieldDateProps extends DetailFieldBase {\n type: 'date';\n value: string | null | undefined;\n}\n\ninterface DetailFieldDateTimeProps extends DetailFieldBase {\n type: 'dateTime';\n value: string | null | undefined;\n timeZone?: string;\n}\n\nexport type DetailFieldProps =\n | DetailFieldStringProps\n | DetailFieldNumberProps\n | DetailFieldCurrencyProps\n | DetailFieldDateProps\n | DetailFieldDateTimeProps;\n\nexport const DetailField: React.FC<DetailFieldProps> = (props) => {\n const { label, className, loading } = props;\n const fmt = useFormatters();\n\n if (loading) {\n return (\n <div className={className}>\n <p className=\"text-sm text-muted-foreground\">{label}</p>\n <Skeleton className=\"mt-1 h-5 w-32\" />\n </div>\n );\n }\n\n let primary: React.ReactNode;\n let secondary: string | undefined;\n let isMono = false;\n\n switch (props.type) {\n case 'string': {\n ({ primary, secondary } = fmt.string(props.value));\n isMono = !!props.mono;\n break;\n }\n case 'number': {\n ({ primary, secondary } = fmt.number(props.value, { fractionDigits: props.fractionDigits }));\n isMono = true;\n break;\n }\n case 'currency': {\n ({ primary, secondary } = fmt.currency(props.value, { exchangeRate: props.exchangeRate }));\n isMono = true;\n break;\n }\n case 'date': {\n ({ primary, secondary } = fmt.date(props.value));\n break;\n }\n case 'dateTime': {\n ({ primary, secondary } = fmt.dateTime(props.value, { timeZone: props.timeZone }));\n break;\n }\n }\n\n return (\n <div className={className}>\n <p className=\"text-sm text-muted-foreground\">{label}</p>\n <p className={`font-medium mt-1${isMono ? ' font-mono' : ''}`}>{primary}</p>\n {secondary && <p className=\"mt-1 text-xs text-muted-foreground\">{secondary}</p>}\n </div>\n );\n};\n","import type React from 'react';\nimport { cn } from '../../../shadcn/utils';\nimport { Typography } from '../Typography';\n\nexport interface DetailHeaderProps {\n title: React.ReactNode;\n badges?: React.ReactNode;\n description?: React.ReactNode;\n actions?: React.ReactNode;\n className?: string;\n}\n\n// Standard detail-view header: title + inline badges on the left, action buttons on the right\nexport const DetailHeader: React.FC<DetailHeaderProps> = ({ title, badges, description, actions, className }) => (\n <div className={cn('flex items-start justify-between gap-4', className)}>\n <div className=\"min-w-0 space-y-1\">\n <div className=\"flex flex-wrap items-center gap-3\">\n <Typography variant=\"h4\">{title}</Typography>\n {badges}\n </div>\n {description && (\n <Typography variant=\"body2\" intent=\"muted\">\n {description}\n </Typography>\n )}\n </div>\n {actions && <div className=\"flex shrink-0 items-center gap-2 self-center\">{actions}</div>}\n </div>\n);\n\nDetailHeader.displayName = 'DetailHeader';\n","import type React from 'react';\nimport { cn } from '../../../shadcn/utils';\n\nexport interface DetailSectionProps {\n children: React.ReactNode;\n className?: string;\n wrap?: boolean;\n}\n\nexport const DetailSection: React.FC<DetailSectionProps> = ({ children, className, wrap }) => (\n <div\n className={cn(\n 'inline-flex items-stretch divide-x divide-border rounded-md border bg-muted/40 overflow-hidden',\n wrap && 'flex-wrap',\n className,\n )}\n >\n {children}\n </div>\n);\n","import { Skeleton } from '../Skeleton';\nimport { DetailSection } from './DetailSection';\n\nexport interface DetailSectionSkeletonProps {\n count?: number;\n wrap?: boolean;\n className?: string;\n}\n\n// Loading placeholder matching <DetailSection> with <DetailField> children — label + value skeleton per cell\nexport const DetailSectionSkeleton = ({ count = 3, wrap, className }: DetailSectionSkeletonProps) => (\n <DetailSection wrap={wrap} className={className}>\n {Array.from({ length: count }).map((_, i) => (\n <div\n // biome-ignore lint/suspicious/noArrayIndexKey: <static skeleton list>\n key={`detail-skel-${i}`}\n className=\"space-y-1.5 px-4 py-2\"\n >\n <Skeleton className=\"h-3 w-12\" />\n <Skeleton className=\"h-4 w-20\" />\n </div>\n ))}\n </DetailSection>\n);\n\nDetailSectionSkeleton.displayName = 'DetailSectionSkeleton';\n"],"names":[],"mappings":"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"}
|
package/dist/Dialog.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Dialog.js","sources":["../shadcn/shadcnDialog/dialog.tsx","../lib/components/Dialog/Dialog.tsx"],"sourcesContent":["'use client';\n\nimport * as DialogPrimitive from '@radix-ui/react-dialog';\nimport { X } from 'lucide-react';\nimport type * as React from 'react';\nimport { forwardRef } from 'react';\n\nimport { cn } from '../utils';\n\n// Dialog root wrapper with data-slot attribute\nfunction Dialog({ ...props }: React.ComponentProps<typeof DialogPrimitive.Root>) {\n return <DialogPrimitive.Root data-slot=\"dialog\" {...props} />;\n}\n\n// Dialog trigger wrapper with data-slot attribute\nfunction DialogTrigger({ ...props }: React.ComponentProps<typeof DialogPrimitive.Trigger>) {\n return <DialogPrimitive.Trigger data-slot=\"dialog-trigger\" {...props} />;\n}\n\n// Dialog portal pass-through\nfunction DialogPortal({ ...props }: React.ComponentProps<typeof DialogPrimitive.Portal>) {\n return <DialogPrimitive.Portal {...props} />;\n}\n\n// Dialog close wrapper with data-slot attribute\nfunction DialogClose({ ...props }: React.ComponentProps<typeof DialogPrimitive.Close>) {\n return <DialogPrimitive.Close data-slot=\"dialog-close\" {...props} />;\n}\n\nconst DialogOverlay = forwardRef<\n React.ElementRef<typeof DialogPrimitive.Overlay>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Overlay\n ref={ref}\n data-slot=\"dialog-overlay\"\n className={cn(\n 'fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0',\n className,\n )}\n {...props}\n />\n));\nDialogOverlay.displayName = DialogPrimitive.Overlay.displayName;\n\nconst DialogContent = forwardRef<\n React.ElementRef<typeof DialogPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content>\n>(({ className, children, ...props }, ref) => (\n <DialogPortal>\n <DialogOverlay />\n <DialogPrimitive.Content\n ref={ref}\n data-slot=\"dialog-content\"\n className={cn(\n 'fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 sm:rounded-lg',\n className,\n )}\n {...props}\n >\n {children}\n <DialogPrimitive.Close className=\"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground\">\n <X className=\"h-4 w-4\" />\n <span className=\"sr-only\">Close</span>\n </DialogPrimitive.Close>\n </DialogPrimitive.Content>\n </DialogPortal>\n));\nDialogContent.displayName = DialogPrimitive.Content.displayName;\n\n// Dialog header layout container\nfunction DialogHeader({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) {\n return (\n <div\n data-slot=\"dialog-header\"\n className={cn('flex flex-col gap-2 text-center sm:text-left', className)}\n {...props}\n />\n );\n}\nDialogHeader.displayName = 'DialogHeader';\n\n// Dialog footer layout container\nfunction DialogFooter({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) {\n return (\n <div\n data-slot=\"dialog-footer\"\n className={cn('flex flex-col-reverse gap-2 sm:flex-row sm:justify-end', className)}\n {...props}\n />\n );\n}\nDialogFooter.displayName = 'DialogFooter';\n\nconst DialogTitle = forwardRef<\n React.ElementRef<typeof DialogPrimitive.Title>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Title\n ref={ref}\n data-slot=\"dialog-title\"\n className={cn('text-lg font-semibold leading-none tracking-tight', className)}\n {...props}\n />\n));\nDialogTitle.displayName = DialogPrimitive.Title.displayName;\n\nconst DialogDescription = forwardRef<\n React.ElementRef<typeof DialogPrimitive.Description>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Description\n ref={ref}\n data-slot=\"dialog-description\"\n className={cn('text-sm text-muted-foreground', className)}\n {...props}\n />\n));\nDialogDescription.displayName = DialogPrimitive.Description.displayName;\n\nexport {\n Dialog,\n DialogClose,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogOverlay,\n DialogPortal,\n DialogTitle,\n DialogTrigger,\n};\n","import type { LucideIcon } from 'lucide-react';\nimport type React from 'react';\nimport { useEffect, useRef } from 'react';\nimport {\n Dialog as ShadcnDialog,\n DialogContent as ShadcnDialogContent,\n DialogDescription as ShadcnDialogDescription,\n DialogHeader as ShadcnDialogHeader,\n DialogTitle as ShadcnDialogTitle,\n DialogTrigger as ShadcnDialogTrigger,\n} from '../../../shadcn/shadcnDialog';\nimport { cn } from '../../../shadcn/utils';\nimport type { DialogHandle } from '../../hooks/useDialog';\n\nexport interface DialogActionsProps {\n children: React.ReactNode;\n className?: string;\n}\n\n// Standard dialog/form action bar — a top divider with right-aligned buttons that stack on mobile.\n// Use to wrap a form's submit/cancel buttons so every dialog shares the same footer layout.\nexport function DialogActions({ children, className }: DialogActionsProps) {\n return (\n <div className={cn('flex flex-col-reverse gap-2 border-t px-6 pt-4 pb-6 sm:flex-row sm:justify-end', className)}>\n {children}\n </div>\n );\n}\n\nDialogActions.displayName = 'DialogActions';\n\nconst OPEN_DIALOG_SELECTOR = '[data-state=\"open\"][role=\"dialog\"], [data-state=\"open\"][role=\"alertdialog\"]';\n\nfunction ensurePointerEventsWatchdog() {\n const g = globalThis as { __quantumUiPointerWatchdog?: boolean };\n if (g.__quantumUiPointerWatchdog || typeof document === 'undefined') return;\n g.__quantumUiPointerWatchdog = true;\n const fix = () => {\n if (document.body.style.pointerEvents === 'none' && !document.querySelector(OPEN_DIALOG_SELECTOR)) {\n document.body.style.pointerEvents = '';\n }\n };\n new MutationObserver(fix).observe(document.body, { attributes: true, attributeFilter: ['style'] });\n}\n\nfunction isTopmostDialog(el: HTMLElement | null) {\n if (!el || typeof document === 'undefined') return true;\n const open = document.querySelectorAll(OPEN_DIALOG_SELECTOR);\n return open.length === 0 || open[open.length - 1] === el;\n}\n\nfunction ensureEscapeManager() {\n const g = globalThis as { __quantumUiEscapeMgr?: boolean };\n if (g.__quantumUiEscapeMgr || typeof document === 'undefined') return;\n g.__quantumUiEscapeMgr = true;\n document.addEventListener(\n 'keydown',\n (e) => {\n if (e.key !== 'Escape') return;\n const confirmStore = (\n globalThis as { __quantumUiConfirmStore?: { getSnapshot: () => { open: boolean }; cancel: () => void } }\n ).__quantumUiConfirmStore;\n if (!confirmStore?.getSnapshot().open) return;\n e.preventDefault();\n e.stopImmediatePropagation();\n confirmStore.cancel();\n },\n true,\n );\n}\n\nexport interface DialogProps {\n // Handle from useDialog() — controls open state and cleanup\n handle: DialogHandle;\n // anchor — render prop that receives open(); button renders outside DialogTrigger\n anchor?: (open: () => void) => React.ReactNode;\n // content — render prop that receives close()\n content?: (close: () => void) => React.ReactNode;\n // trigger — legacy ReactNode trigger (wrapped in DialogTrigger automatically)\n trigger?: React.ReactNode;\n // Required header icon — rendered as a badge before the title to standardize dialog headers.\n icon: LucideIcon;\n // Colour of the header icon badge. Use 'destructive' for delete dialogs, 'warning' for cautions.\n iconVariant?: 'default' | 'destructive' | 'warning';\n title: React.ReactNode;\n description: React.ReactNode;\n // Optional badge-style slot rendered inline with the title in the header.\n // Use for short status indicators tied to the dialog's subject (e.g. \"Draft\", \"Derived unit\").\n badgeSlot?: React.ReactNode;\n children?: React.ReactNode;\n className?: string;\n}\n\n// Composite dialog — controlled by a useDialog() handle\nexport function Dialog({\n handle,\n anchor,\n content,\n trigger,\n icon: Icon,\n iconVariant = 'default',\n title,\n description,\n badgeSlot,\n children,\n className,\n}: DialogProps) {\n const contentRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n ensurePointerEventsWatchdog();\n ensureEscapeManager();\n }, []);\n\n return (\n <ShadcnDialog open={handle.isOpen} onOpenChange={handle.onOpenChange}>\n {anchor ? anchor(handle.open) : trigger && <ShadcnDialogTrigger asChild>{trigger}</ShadcnDialogTrigger>}\n <ShadcnDialogContent\n ref={contentRef}\n className={cn('flex max-h-[95vh] flex-col gap-0 p-0', className)}\n onInteractOutside={(e) => {\n if (!isTopmostDialog(contentRef.current)) e.preventDefault();\n }}\n >\n <ShadcnDialogHeader className=\"shrink-0 border-b px-6 pt-6 pb-4\">\n <ShadcnDialogTitle>\n <span className=\"flex items-center gap-2\">\n <span\n className={cn(\n 'flex size-8 shrink-0 items-center justify-center rounded-lg',\n iconVariant === 'destructive' && 'bg-destructive/10 text-destructive',\n iconVariant === 'warning' && 'bg-warning/10 text-warning',\n (!iconVariant || iconVariant === 'default') && 'bg-primary/10 text-primary',\n )}\n >\n <Icon className=\"size-4\" />\n </span>\n <span>{title}</span>\n {badgeSlot}\n </span>\n </ShadcnDialogTitle>\n <ShadcnDialogDescription>{description}</ShadcnDialogDescription>\n </ShadcnDialogHeader>\n {content ? (\n content(handle.close)\n ) : (\n <div className=\"min-h-0 flex-1 overflow-y-auto overscroll-contain px-6 py-4\">{children}</div>\n )}\n </ShadcnDialogContent>\n </ShadcnDialog>\n );\n}\n\nDialog.displayName = 'Dialog';\n"],"names":["Dialog","DialogPrimitive.Root","DialogPrimitive.Trigger","DialogPrimitive.Portal","DialogPrimitive.Overlay","DialogPrimitive.Content","DialogPrimitive.Close","DialogPrimitive.Title","DialogPrimitive.Description","ShadcnDialog","ShadcnDialogTrigger","ShadcnDialogContent","ShadcnDialogHeader","ShadcnDialogTitle","ShadcnDialogDescription"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Dialog.js","sources":["../shadcn/shadcnDialog/dialog.tsx","../lib/components/Dialog/Dialog.tsx"],"sourcesContent":["'use client';\n\nimport * as DialogPrimitive from '@radix-ui/react-dialog';\nimport { X } from 'lucide-react';\nimport type * as React from 'react';\nimport { forwardRef } from 'react';\n\nimport { cn } from '../utils';\n\n// Dialog root wrapper with data-slot attribute\nfunction Dialog({ ...props }: React.ComponentProps<typeof DialogPrimitive.Root>) {\n return <DialogPrimitive.Root data-slot=\"dialog\" {...props} />;\n}\n\n// Dialog trigger wrapper with data-slot attribute\nfunction DialogTrigger({ ...props }: React.ComponentProps<typeof DialogPrimitive.Trigger>) {\n return <DialogPrimitive.Trigger data-slot=\"dialog-trigger\" {...props} />;\n}\n\n// Dialog portal pass-through\nfunction DialogPortal({ ...props }: React.ComponentProps<typeof DialogPrimitive.Portal>) {\n return <DialogPrimitive.Portal {...props} />;\n}\n\n// Dialog close wrapper with data-slot attribute\nfunction DialogClose({ ...props }: React.ComponentProps<typeof DialogPrimitive.Close>) {\n return <DialogPrimitive.Close data-slot=\"dialog-close\" {...props} />;\n}\n\nconst DialogOverlay = forwardRef<\n React.ElementRef<typeof DialogPrimitive.Overlay>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Overlay\n ref={ref}\n data-slot=\"dialog-overlay\"\n className={cn(\n 'fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0',\n className,\n )}\n {...props}\n />\n));\nDialogOverlay.displayName = DialogPrimitive.Overlay.displayName;\n\nconst DialogContent = forwardRef<\n React.ElementRef<typeof DialogPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content>\n>(({ className, children, ...props }, ref) => (\n <DialogPortal>\n <DialogOverlay />\n <DialogPrimitive.Content\n ref={ref}\n data-slot=\"dialog-content\"\n className={cn(\n 'fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 sm:rounded-lg',\n className,\n )}\n {...props}\n >\n {children}\n <DialogPrimitive.Close className=\"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground\">\n <X className=\"h-4 w-4\" />\n <span className=\"sr-only\">Close</span>\n </DialogPrimitive.Close>\n </DialogPrimitive.Content>\n </DialogPortal>\n));\nDialogContent.displayName = DialogPrimitive.Content.displayName;\n\n// Dialog header layout container\nfunction DialogHeader({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) {\n return (\n <div\n data-slot=\"dialog-header\"\n className={cn('flex flex-col gap-2 text-center sm:text-left', className)}\n {...props}\n />\n );\n}\nDialogHeader.displayName = 'DialogHeader';\n\n// Dialog footer layout container\nfunction DialogFooter({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) {\n return (\n <div\n data-slot=\"dialog-footer\"\n className={cn('flex flex-col-reverse gap-2 sm:flex-row sm:justify-end', className)}\n {...props}\n />\n );\n}\nDialogFooter.displayName = 'DialogFooter';\n\nconst DialogTitle = forwardRef<\n React.ElementRef<typeof DialogPrimitive.Title>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Title\n ref={ref}\n data-slot=\"dialog-title\"\n className={cn('text-lg font-semibold leading-none tracking-tight', className)}\n {...props}\n />\n));\nDialogTitle.displayName = DialogPrimitive.Title.displayName;\n\nconst DialogDescription = forwardRef<\n React.ElementRef<typeof DialogPrimitive.Description>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Description\n ref={ref}\n data-slot=\"dialog-description\"\n className={cn('text-sm text-muted-foreground', className)}\n {...props}\n />\n));\nDialogDescription.displayName = DialogPrimitive.Description.displayName;\n\nexport {\n Dialog,\n DialogClose,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogOverlay,\n DialogPortal,\n DialogTitle,\n DialogTrigger,\n};\n","import type { LucideIcon } from 'lucide-react';\nimport type React from 'react';\nimport { useEffect, useRef } from 'react';\nimport {\n Dialog as ShadcnDialog,\n DialogContent as ShadcnDialogContent,\n DialogDescription as ShadcnDialogDescription,\n DialogHeader as ShadcnDialogHeader,\n DialogTitle as ShadcnDialogTitle,\n DialogTrigger as ShadcnDialogTrigger,\n} from '../../../shadcn/shadcnDialog';\nimport { cn } from '../../../shadcn/utils';\nimport type { DialogHandle } from '../../hooks/useDialog';\n\nexport interface DialogActionsProps {\n children: React.ReactNode;\n className?: string;\n}\n\n// Standard dialog/form action bar — a top divider with right-aligned buttons that stack on mobile\nexport function DialogActions({ children, className }: DialogActionsProps) {\n return (\n <div className={cn('flex flex-col-reverse gap-2 border-t px-6 pt-4 pb-6 sm:flex-row sm:justify-end', className)}>\n {children}\n </div>\n );\n}\n\nDialogActions.displayName = 'DialogActions';\n\nconst OPEN_DIALOG_SELECTOR = '[data-state=\"open\"][role=\"dialog\"], [data-state=\"open\"][role=\"alertdialog\"]';\n\nfunction ensurePointerEventsWatchdog() {\n const g = globalThis as { __quantumUiPointerWatchdog?: boolean };\n if (g.__quantumUiPointerWatchdog || typeof document === 'undefined') return;\n g.__quantumUiPointerWatchdog = true;\n const fix = () => {\n if (document.body.style.pointerEvents === 'none' && !document.querySelector(OPEN_DIALOG_SELECTOR)) {\n document.body.style.pointerEvents = '';\n }\n };\n new MutationObserver(fix).observe(document.body, { attributes: true, attributeFilter: ['style'] });\n}\n\nfunction isTopmostDialog(el: HTMLElement | null) {\n if (!el || typeof document === 'undefined') return true;\n const open = document.querySelectorAll(OPEN_DIALOG_SELECTOR);\n return open.length === 0 || open[open.length - 1] === el;\n}\n\nfunction ensureEscapeManager() {\n const g = globalThis as { __quantumUiEscapeMgr?: boolean };\n if (g.__quantumUiEscapeMgr || typeof document === 'undefined') return;\n g.__quantumUiEscapeMgr = true;\n document.addEventListener(\n 'keydown',\n (e) => {\n if (e.key !== 'Escape') return;\n const confirmStore = (\n globalThis as { __quantumUiConfirmStore?: { getSnapshot: () => { open: boolean }; cancel: () => void } }\n ).__quantumUiConfirmStore;\n if (!confirmStore?.getSnapshot().open) return;\n e.preventDefault();\n e.stopImmediatePropagation();\n confirmStore.cancel();\n },\n true,\n );\n}\n\nexport interface DialogProps {\n handle: DialogHandle;\n anchor?: (open: () => void) => React.ReactNode;\n content?: (close: () => void) => React.ReactNode;\n trigger?: React.ReactNode;\n icon: LucideIcon;\n iconVariant?: 'default' | 'destructive' | 'warning';\n title: React.ReactNode;\n description: React.ReactNode;\n badgeSlot?: React.ReactNode;\n children?: React.ReactNode;\n className?: string;\n}\n\n// Composite dialog — controlled by a useDialog() handle\nexport function Dialog({\n handle,\n anchor,\n content,\n trigger,\n icon: Icon,\n iconVariant = 'default',\n title,\n description,\n badgeSlot,\n children,\n className,\n}: DialogProps) {\n const contentRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n ensurePointerEventsWatchdog();\n ensureEscapeManager();\n }, []);\n\n return (\n <ShadcnDialog open={handle.isOpen} onOpenChange={handle.onOpenChange}>\n {anchor ? anchor(handle.open) : trigger && <ShadcnDialogTrigger asChild>{trigger}</ShadcnDialogTrigger>}\n <ShadcnDialogContent\n ref={contentRef}\n className={cn('flex max-h-[95vh] flex-col gap-0 p-0', className)}\n onInteractOutside={(e) => {\n if (!isTopmostDialog(contentRef.current)) e.preventDefault();\n }}\n >\n <ShadcnDialogHeader className=\"shrink-0 border-b px-6 pt-6 pb-4\">\n <ShadcnDialogTitle>\n <span className=\"flex items-center gap-2\">\n <span\n className={cn(\n 'flex size-8 shrink-0 items-center justify-center rounded-lg',\n iconVariant === 'destructive' && 'bg-destructive/10 text-destructive',\n iconVariant === 'warning' && 'bg-warning/10 text-warning',\n (!iconVariant || iconVariant === 'default') && 'bg-primary/10 text-primary',\n )}\n >\n <Icon className=\"size-4\" />\n </span>\n <span>{title}</span>\n {badgeSlot}\n </span>\n </ShadcnDialogTitle>\n <ShadcnDialogDescription>{description}</ShadcnDialogDescription>\n </ShadcnDialogHeader>\n {content ? (\n content(handle.close)\n ) : (\n <div className=\"min-h-0 flex-1 overflow-y-auto overscroll-contain px-6 py-4\">{children}</div>\n )}\n </ShadcnDialogContent>\n </ShadcnDialog>\n );\n}\n\nDialog.displayName = 'Dialog';\n"],"names":["Dialog","DialogPrimitive.Root","DialogPrimitive.Trigger","DialogPrimitive.Portal","DialogPrimitive.Overlay","DialogPrimitive.Content","DialogPrimitive.Close","DialogPrimitive.Title","DialogPrimitive.Description","ShadcnDialog","ShadcnDialogTrigger","ShadcnDialogContent","ShadcnDialogHeader","ShadcnDialogTitle","ShadcnDialogDescription"],"mappings":"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"}
|
package/dist/DropdownMenu.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DropdownMenu.js","sources":["../lib/components/DropdownMenu/DropdownMenu.tsx"],"sourcesContent":["import type React from 'react';\nimport { Fragment, useState } from 'react';\nimport {\n DropdownMenuCheckboxItem as ShadcnDropdownMenuCheckboxItem,\n DropdownMenuContent as ShadcnDropdownMenuContent,\n DropdownMenuGroup as ShadcnDropdownMenuGroup,\n DropdownMenuItem as ShadcnDropdownMenuItem,\n DropdownMenuLabel as ShadcnDropdownMenuLabel,\n DropdownMenuPortal as ShadcnDropdownMenuPortal,\n DropdownMenuRadioGroup as ShadcnDropdownMenuRadioGroup,\n DropdownMenuRadioItem as ShadcnDropdownMenuRadioItem,\n DropdownMenu as ShadcnDropdownMenuRoot,\n DropdownMenuSeparator as ShadcnDropdownMenuSeparator,\n DropdownMenuShortcut as ShadcnDropdownMenuShortcut,\n DropdownMenuSub as ShadcnDropdownMenuSub,\n DropdownMenuSubContent as ShadcnDropdownMenuSubContent,\n DropdownMenuSubTrigger as ShadcnDropdownMenuSubTrigger,\n DropdownMenuTrigger as ShadcnDropdownMenuTrigger,\n} from '../../../shadcn/shadcnDropdownMenu';\nimport type { DialogHandle } from '../../hooks/useDialog';\nimport { Button } from '../Button';\nimport { Dialog } from '../Dialog';\nimport type { DialogMenuItem, DropdownMenuProps, MenuItem } from './types';\n\nconst DropdownMenuRoot = ShadcnDropdownMenuRoot;\nconst DropdownMenuCheckboxItem = ShadcnDropdownMenuCheckboxItem;\nconst DropdownMenuContent = ShadcnDropdownMenuContent;\nconst DropdownMenuGroup = ShadcnDropdownMenuGroup;\nconst DropdownMenuItem = ShadcnDropdownMenuItem;\nconst DropdownMenuLabel = ShadcnDropdownMenuLabel;\nconst DropdownMenuPortal = ShadcnDropdownMenuPortal;\nconst DropdownMenuRadioGroup = ShadcnDropdownMenuRadioGroup;\nconst DropdownMenuRadioItem = ShadcnDropdownMenuRadioItem;\nconst DropdownMenuSeparator = ShadcnDropdownMenuSeparator;\nconst DropdownMenuShortcut = ShadcnDropdownMenuShortcut;\nconst DropdownMenuSub = ShadcnDropdownMenuSub;\nconst DropdownMenuSubContent = ShadcnDropdownMenuSubContent;\nconst DropdownMenuSubTrigger = ShadcnDropdownMenuSubTrigger;\nconst DropdownMenuTrigger = ShadcnDropdownMenuTrigger;\n\n// Renders a single menu item based on its type — supports nested submenus\nconst renderMenuItem = (item: MenuItem, index: number, onDialogSelect?: (id: string) => void): React.ReactNode => {\n switch (item.type) {\n case 'separator':\n return <DropdownMenuSeparator key={item.id ?? `separator-${index}`} />;\n\n case 'label':\n return <DropdownMenuLabel key={item.id}>{item.label}</DropdownMenuLabel>;\n\n case 'item': {\n const Icon = item.icon;\n return (\n <DropdownMenuItem\n key={item.id}\n onClick={item.onClick}\n disabled={item.disabled}\n className={item.variant === 'destructive' ? 'text-destructive focus:text-destructive' : undefined}\n >\n {Icon && <Icon className=\"mr-2 h-4 w-4\" />}\n <span>{item.label}</span>\n {item.shortcut && <DropdownMenuShortcut>{item.shortcut}</DropdownMenuShortcut>}\n </DropdownMenuItem>\n );\n }\n\n case 'checkbox': {\n const Icon = item.icon;\n return (\n <DropdownMenuCheckboxItem\n key={item.id}\n checked={item.checked}\n onCheckedChange={item.onCheckedChange}\n disabled={item.disabled}\n >\n {Icon && <Icon className=\"mr-2 h-4 w-4\" />}\n {item.label}\n </DropdownMenuCheckboxItem>\n );\n }\n\n case 'radio-group':\n return (\n <DropdownMenuRadioGroup key={item.id} value={item.value} onValueChange={item.onValueChange}>\n {item.items.map((radioItem) => {\n const Icon = radioItem.icon;\n return (\n <DropdownMenuRadioItem key={radioItem.value} value={radioItem.value} disabled={radioItem.disabled}>\n {Icon && <Icon className=\"mr-2 h-4 w-4\" />}\n {radioItem.label}\n </DropdownMenuRadioItem>\n );\n })}\n </DropdownMenuRadioGroup>\n );\n\n case 'sub': {\n const Icon = item.icon;\n return (\n <DropdownMenuSub key={item.id}>\n <DropdownMenuSubTrigger disabled={item.disabled}>\n {Icon && <Icon className=\"mr-2 h-4 w-4\" />}\n <span>{item.label}</span>\n </DropdownMenuSubTrigger>\n <DropdownMenuPortal>\n <DropdownMenuSubContent>\n {item.items.map((subItem, subIndex) => renderMenuItem(subItem, subIndex, onDialogSelect))}\n </DropdownMenuSubContent>\n </DropdownMenuPortal>\n </DropdownMenuSub>\n );\n }\n\n case 'group':\n return (\n <DropdownMenuGroup key={item.id}>\n {item.label && <DropdownMenuLabel>{item.label}</DropdownMenuLabel>}\n {item.items.map((groupItem, groupIndex) => renderMenuItem(groupItem, groupIndex, onDialogSelect))}\n </DropdownMenuGroup>\n );\n\n case 'dialog': {\n const Icon = item.icon;\n return (\n <DropdownMenuItem\n key={item.id}\n disabled={item.disabled}\n onSelect={(e) => {\n e.preventDefault();\n onDialogSelect?.(item.id);\n }}\n >\n {Icon && <Icon className=\"mr-2 h-4 w-4\" />}\n <span>{item.label}</span>\n </DropdownMenuItem>\n );\n }\n\n case 'custom': {\n const content = typeof item.render === 'function' ? item.render() : item.render;\n if (item.asMenuItem) {\n return (\n <DropdownMenuItem key={item.id} onClick={item.onClick} disabled={item.disabled}>\n {content}\n </DropdownMenuItem>\n );\n }\n return <Fragment key={item.id}>{content}</Fragment>;\n }\n\n default:\n return null;\n }\n};\n\n/**\n * DropdownMenu - A flexible, data-driven dropdown menu component\n *\n * This component provides a declarative API for building dropdown menus without\n * manually composing primitive components. It supports all dropdown menu features\n * including items, checkboxes, radio groups, submenus, separators, labels, and groups.\n *\n * @example\n * ```tsx\n * import { DropdownMenu } from '@vritti/quantum-ui/DropdownMenu';\n * import { Settings, User, LogOut } from 'lucide-react';\n *\n * function UserMenu() {\n * const [showStatus, setShowStatus] = useState(true);\n *\n * return (\n * <DropdownMenu\n * trigger={{ label: 'Menu', variant: 'outline' }}\n * items={[\n * { type: 'label', id: 'account-label', label: 'My Account' },\n * { type: 'item', id: 'profile', label: 'Profile', icon: User, shortcut: '⌘P' },\n * { type: 'item', id: 'settings', label: 'Settings', icon: Settings },\n * { type: 'separator' },\n * {\n * type: 'checkbox',\n * id: 'status',\n * label: 'Show Status',\n * checked: showStatus,\n * onCheckedChange: setShowStatus,\n * },\n * { type: 'separator' },\n * {\n * type: 'item',\n * id: 'logout',\n * label: 'Log out',\n * icon: LogOut,\n * variant: 'destructive',\n * },\n * ]}\n * align=\"end\"\n * />\n * );\n * }\n * ```\n */\nexport const DropdownMenu: React.FC<DropdownMenuProps> = ({\n trigger,\n items,\n modal = false,\n contentClassName,\n align = 'end',\n side,\n}) => {\n const [activeDialogId, setActiveDialogId] = useState<string | null>(null);\n const TriggerIcon = trigger.icon;\n\n // Collect all dialog-type items (including nested) for rendering outside the Radix root\n const collectDialogItems = (menuItems: MenuItem[]): DialogMenuItem[] => {\n const result: DialogMenuItem[] = [];\n for (const item of menuItems) {\n if (item.type === 'dialog') result.push(item);\n if (item.type === 'sub' || item.type === 'group') result.push(...collectDialogItems(item.items));\n }\n return result;\n };\n\n const dialogItems = collectDialogItems(items);\n\n return (\n <>\n <DropdownMenuRoot modal={modal}>\n <DropdownMenuTrigger asChild>\n {trigger.children ?? (\n <Button variant={trigger.variant} className={trigger.className}>\n {TriggerIcon && <TriggerIcon className=\"mr-2 h-4 w-4\" />}\n {trigger.label}\n </Button>\n )}\n </DropdownMenuTrigger>\n <DropdownMenuContent\n className={contentClassName}\n align={align}\n side={side}\n onCloseAutoFocus={(event) => {\n if (!modal) {\n event.preventDefault();\n }\n }}\n >\n {items.map((item, index) => renderMenuItem(item, index, setActiveDialogId))}\n </DropdownMenuContent>\n </DropdownMenuRoot>\n {dialogItems.map((item) => {\n const handle: DialogHandle = {\n isOpen: activeDialogId === item.id,\n open: () => setActiveDialogId(item.id),\n close: () => setActiveDialogId(null),\n onOpenChange: (val) => {\n if (!val) setActiveDialogId(null);\n },\n };\n return (\n <Dialog\n key={item.id}\n handle={handle}\n icon={item.icon}\n title={item.dialog.title}\n description={item.dialog.description}\n badgeSlot={item.dialog.badgeSlot}\n content={item.dialog.content}\n />\n );\n })}\n </>\n );\n};\n\nDropdownMenu.displayName = 'DropdownMenu';\n"],"names":["ShadcnDropdownMenuRoot","ShadcnDropdownMenuCheckboxItem","ShadcnDropdownMenuContent","ShadcnDropdownMenuGroup","ShadcnDropdownMenuItem","ShadcnDropdownMenuLabel","ShadcnDropdownMenuPortal","ShadcnDropdownMenuRadioGroup","ShadcnDropdownMenuRadioItem","ShadcnDropdownMenuSeparator","ShadcnDropdownMenuShortcut","ShadcnDropdownMenuSub","ShadcnDropdownMenuSubContent","ShadcnDropdownMenuSubTrigger","ShadcnDropdownMenuTrigger","Fragment"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"DropdownMenu.js","sources":["../lib/components/DropdownMenu/DropdownMenu.tsx"],"sourcesContent":["import type React from 'react';\nimport { Fragment, useState } from 'react';\nimport {\n DropdownMenuCheckboxItem as ShadcnDropdownMenuCheckboxItem,\n DropdownMenuContent as ShadcnDropdownMenuContent,\n DropdownMenuGroup as ShadcnDropdownMenuGroup,\n DropdownMenuItem as ShadcnDropdownMenuItem,\n DropdownMenuLabel as ShadcnDropdownMenuLabel,\n DropdownMenuPortal as ShadcnDropdownMenuPortal,\n DropdownMenuRadioGroup as ShadcnDropdownMenuRadioGroup,\n DropdownMenuRadioItem as ShadcnDropdownMenuRadioItem,\n DropdownMenu as ShadcnDropdownMenuRoot,\n DropdownMenuSeparator as ShadcnDropdownMenuSeparator,\n DropdownMenuShortcut as ShadcnDropdownMenuShortcut,\n DropdownMenuSub as ShadcnDropdownMenuSub,\n DropdownMenuSubContent as ShadcnDropdownMenuSubContent,\n DropdownMenuSubTrigger as ShadcnDropdownMenuSubTrigger,\n DropdownMenuTrigger as ShadcnDropdownMenuTrigger,\n} from '../../../shadcn/shadcnDropdownMenu';\nimport type { DialogHandle } from '../../hooks/useDialog';\nimport { Button } from '../Button';\nimport { Dialog } from '../Dialog';\nimport type { DialogMenuItem, DropdownMenuProps, MenuItem } from './types';\n\nconst DropdownMenuRoot = ShadcnDropdownMenuRoot;\nconst DropdownMenuCheckboxItem = ShadcnDropdownMenuCheckboxItem;\nconst DropdownMenuContent = ShadcnDropdownMenuContent;\nconst DropdownMenuGroup = ShadcnDropdownMenuGroup;\nconst DropdownMenuItem = ShadcnDropdownMenuItem;\nconst DropdownMenuLabel = ShadcnDropdownMenuLabel;\nconst DropdownMenuPortal = ShadcnDropdownMenuPortal;\nconst DropdownMenuRadioGroup = ShadcnDropdownMenuRadioGroup;\nconst DropdownMenuRadioItem = ShadcnDropdownMenuRadioItem;\nconst DropdownMenuSeparator = ShadcnDropdownMenuSeparator;\nconst DropdownMenuShortcut = ShadcnDropdownMenuShortcut;\nconst DropdownMenuSub = ShadcnDropdownMenuSub;\nconst DropdownMenuSubContent = ShadcnDropdownMenuSubContent;\nconst DropdownMenuSubTrigger = ShadcnDropdownMenuSubTrigger;\nconst DropdownMenuTrigger = ShadcnDropdownMenuTrigger;\n\n// Renders a single menu item based on its type — supports nested submenus\nconst renderMenuItem = (item: MenuItem, index: number, onDialogSelect?: (id: string) => void): React.ReactNode => {\n switch (item.type) {\n case 'separator':\n return <DropdownMenuSeparator key={item.id ?? `separator-${index}`} />;\n\n case 'label':\n return <DropdownMenuLabel key={item.id}>{item.label}</DropdownMenuLabel>;\n\n case 'item': {\n const Icon = item.icon;\n return (\n <DropdownMenuItem\n key={item.id}\n onClick={item.onClick}\n disabled={item.disabled}\n className={item.variant === 'destructive' ? 'text-destructive focus:text-destructive' : undefined}\n >\n {Icon && <Icon className=\"mr-2 h-4 w-4\" />}\n <span>{item.label}</span>\n {item.shortcut && <DropdownMenuShortcut>{item.shortcut}</DropdownMenuShortcut>}\n </DropdownMenuItem>\n );\n }\n\n case 'checkbox': {\n const Icon = item.icon;\n return (\n <DropdownMenuCheckboxItem\n key={item.id}\n checked={item.checked}\n onCheckedChange={item.onCheckedChange}\n disabled={item.disabled}\n >\n {Icon && <Icon className=\"mr-2 h-4 w-4\" />}\n {item.label}\n </DropdownMenuCheckboxItem>\n );\n }\n\n case 'radio-group':\n return (\n <DropdownMenuRadioGroup key={item.id} value={item.value} onValueChange={item.onValueChange}>\n {item.items.map((radioItem) => {\n const Icon = radioItem.icon;\n return (\n <DropdownMenuRadioItem key={radioItem.value} value={radioItem.value} disabled={radioItem.disabled}>\n {Icon && <Icon className=\"mr-2 h-4 w-4\" />}\n {radioItem.label}\n </DropdownMenuRadioItem>\n );\n })}\n </DropdownMenuRadioGroup>\n );\n\n case 'sub': {\n const Icon = item.icon;\n return (\n <DropdownMenuSub key={item.id}>\n <DropdownMenuSubTrigger disabled={item.disabled}>\n {Icon && <Icon className=\"mr-2 h-4 w-4\" />}\n <span>{item.label}</span>\n </DropdownMenuSubTrigger>\n <DropdownMenuPortal>\n <DropdownMenuSubContent>\n {item.items.map((subItem, subIndex) => renderMenuItem(subItem, subIndex, onDialogSelect))}\n </DropdownMenuSubContent>\n </DropdownMenuPortal>\n </DropdownMenuSub>\n );\n }\n\n case 'group':\n return (\n <DropdownMenuGroup key={item.id}>\n {item.label && <DropdownMenuLabel>{item.label}</DropdownMenuLabel>}\n {item.items.map((groupItem, groupIndex) => renderMenuItem(groupItem, groupIndex, onDialogSelect))}\n </DropdownMenuGroup>\n );\n\n case 'dialog': {\n const Icon = item.icon;\n return (\n <DropdownMenuItem\n key={item.id}\n disabled={item.disabled}\n onSelect={(e) => {\n e.preventDefault();\n onDialogSelect?.(item.id);\n }}\n >\n {Icon && <Icon className=\"mr-2 h-4 w-4\" />}\n <span>{item.label}</span>\n </DropdownMenuItem>\n );\n }\n\n case 'custom': {\n const content = typeof item.render === 'function' ? item.render() : item.render;\n if (item.asMenuItem) {\n return (\n <DropdownMenuItem key={item.id} onClick={item.onClick} disabled={item.disabled}>\n {content}\n </DropdownMenuItem>\n );\n }\n return <Fragment key={item.id}>{content}</Fragment>;\n }\n\n default:\n return null;\n }\n};\n\n// A flexible, data-driven dropdown menu built from a declarative items array\nexport const DropdownMenu: React.FC<DropdownMenuProps> = ({\n trigger,\n items,\n modal = false,\n contentClassName,\n align = 'end',\n side,\n}) => {\n const [activeDialogId, setActiveDialogId] = useState<string | null>(null);\n const TriggerIcon = trigger.icon;\n\n // Collect all dialog-type items (including nested) for rendering outside the Radix root\n const collectDialogItems = (menuItems: MenuItem[]): DialogMenuItem[] => {\n const result: DialogMenuItem[] = [];\n for (const item of menuItems) {\n if (item.type === 'dialog') result.push(item);\n if (item.type === 'sub' || item.type === 'group') result.push(...collectDialogItems(item.items));\n }\n return result;\n };\n\n const dialogItems = collectDialogItems(items);\n\n return (\n <>\n <DropdownMenuRoot modal={modal}>\n <DropdownMenuTrigger asChild>\n {trigger.children ?? (\n <Button variant={trigger.variant} className={trigger.className}>\n {TriggerIcon && <TriggerIcon className=\"mr-2 h-4 w-4\" />}\n {trigger.label}\n </Button>\n )}\n </DropdownMenuTrigger>\n <DropdownMenuContent\n className={contentClassName}\n align={align}\n side={side}\n onCloseAutoFocus={(event) => {\n if (!modal) {\n event.preventDefault();\n }\n }}\n >\n {items.map((item, index) => renderMenuItem(item, index, setActiveDialogId))}\n </DropdownMenuContent>\n </DropdownMenuRoot>\n {dialogItems.map((item) => {\n const handle: DialogHandle = {\n isOpen: activeDialogId === item.id,\n open: () => setActiveDialogId(item.id),\n close: () => setActiveDialogId(null),\n onOpenChange: (val) => {\n if (!val) setActiveDialogId(null);\n },\n };\n return (\n <Dialog\n key={item.id}\n handle={handle}\n icon={item.icon}\n title={item.dialog.title}\n description={item.dialog.description}\n badgeSlot={item.dialog.badgeSlot}\n content={item.dialog.content}\n />\n );\n })}\n </>\n );\n};\n\nDropdownMenu.displayName = 'DropdownMenu';\n"],"names":["ShadcnDropdownMenuRoot","ShadcnDropdownMenuCheckboxItem","ShadcnDropdownMenuContent","ShadcnDropdownMenuGroup","ShadcnDropdownMenuItem","ShadcnDropdownMenuLabel","ShadcnDropdownMenuPortal","ShadcnDropdownMenuRadioGroup","ShadcnDropdownMenuRadioItem","ShadcnDropdownMenuSeparator","ShadcnDropdownMenuShortcut","ShadcnDropdownMenuSub","ShadcnDropdownMenuSubContent","ShadcnDropdownMenuSubTrigger","ShadcnDropdownMenuTrigger","Fragment"],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { jsx } from 'react/jsx-runtime';
|
|
2
|
+
import { forwardRef } from 'react';
|
|
3
|
+
import { S as SelectFilter } from './SelectFilter.js';
|
|
4
|
+
import { S as Select } from './Select.js';
|
|
5
|
+
|
|
6
|
+
const FeaturePermissionFilter = Object.assign(
|
|
7
|
+
forwardRef((props, ref) => /* @__PURE__ */ jsx(
|
|
8
|
+
SelectFilter,
|
|
9
|
+
{
|
|
10
|
+
ref,
|
|
11
|
+
name: "permissionId",
|
|
12
|
+
label: "Permission",
|
|
13
|
+
placeholder: "Select permission",
|
|
14
|
+
optionsEndpoint: "select-api/feature-permissions",
|
|
15
|
+
fieldKeys: { valueKey: "id", labelKey: "label" },
|
|
16
|
+
...props
|
|
17
|
+
}
|
|
18
|
+
)),
|
|
19
|
+
{ displayName: "FeaturePermissionFilter", defaultLabel: "Permission", defaultName: "permissionId" }
|
|
20
|
+
);
|
|
21
|
+
|
|
22
|
+
const FeaturePermissionSelector = forwardRef((props, ref) => /* @__PURE__ */ jsx(
|
|
23
|
+
Select,
|
|
24
|
+
{
|
|
25
|
+
ref,
|
|
26
|
+
label: "Permissions",
|
|
27
|
+
placeholder: "Select permissions",
|
|
28
|
+
searchable: true,
|
|
29
|
+
optionsEndpoint: "select-api/feature-permissions",
|
|
30
|
+
fieldKeys: { valueKey: "id", labelKey: "label", descriptionKey: "code" },
|
|
31
|
+
...props
|
|
32
|
+
}
|
|
33
|
+
));
|
|
34
|
+
FeaturePermissionSelector.displayName = "FeaturePermissionSelector";
|
|
35
|
+
|
|
36
|
+
export { FeaturePermissionFilter as F, FeaturePermissionSelector as a };
|
|
37
|
+
//# sourceMappingURL=FeaturePermissionSelector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FeaturePermissionSelector.js","sources":["../lib/selects/feature-permission/FeaturePermissionFilter.tsx","../lib/selects/feature-permission/FeaturePermissionSelector.tsx"],"sourcesContent":["import { forwardRef } from 'react';\nimport { SelectFilter, type SelectFilterProps } from '../../components/Select/SelectFilter';\n\nexport type FeaturePermissionFilterProps = Omit<SelectFilterProps, 'optionsEndpoint' | 'name'> & { name?: string };\n\n// Pre-configured SelectFilter for a feature's permissions — scope with params={{ versionId, featureId }}\nexport const FeaturePermissionFilter = Object.assign(\n forwardRef<HTMLButtonElement, FeaturePermissionFilterProps>((props, ref) => (\n <SelectFilter\n ref={ref}\n name=\"permissionId\"\n label=\"Permission\"\n placeholder=\"Select permission\"\n optionsEndpoint=\"select-api/feature-permissions\"\n fieldKeys={{ valueKey: 'id', labelKey: 'label' }}\n {...props}\n />\n )),\n { displayName: 'FeaturePermissionFilter', defaultLabel: 'Permission', defaultName: 'permissionId' },\n);\n","import { forwardRef } from 'react';\nimport { Select, type SelectProps } from '../../components/Select/Select';\n\nexport type FeaturePermissionSelectorProps = Omit<SelectProps, 'optionsEndpoint'>;\n\n// Pre-configured Select for a feature's permissions; scope with params={{ versionId, featureId, excludeId }}.\nexport const FeaturePermissionSelector = forwardRef<HTMLButtonElement, FeaturePermissionSelectorProps>((props, ref) => (\n <Select\n ref={ref}\n label=\"Permissions\"\n placeholder=\"Select permissions\"\n searchable\n optionsEndpoint=\"select-api/feature-permissions\"\n fieldKeys={{ valueKey: 'id', labelKey: 'label', descriptionKey: 'code' }}\n {...props}\n />\n));\nFeaturePermissionSelector.displayName = 'FeaturePermissionSelector';\n"],"names":[],"mappings":";;;;;AAMO,MAAM,0BAA0B,MAAA,CAAO,MAAA;AAAA,EAC5C,UAAA,CAA4D,CAAC,KAAA,EAAO,GAAA,qBAClE,GAAA;AAAA,IAAC,YAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,IAAA,EAAK,cAAA;AAAA,MACL,KAAA,EAAM,YAAA;AAAA,MACN,WAAA,EAAY,mBAAA;AAAA,MACZ,eAAA,EAAgB,gCAAA;AAAA,MAChB,SAAA,EAAW,EAAE,QAAA,EAAU,IAAA,EAAM,UAAU,OAAA,EAAQ;AAAA,MAC9C,GAAG;AAAA;AAAA,GAEP,CAAA;AAAA,EACD,EAAE,WAAA,EAAa,yBAAA,EAA2B,YAAA,EAAc,YAAA,EAAc,aAAa,cAAA;AACrF;;ACbO,MAAM,yBAAA,GAA4B,UAAA,CAA8D,CAAC,KAAA,EAAO,GAAA,qBAC7G,GAAA;AAAA,EAAC,MAAA;AAAA,EAAA;AAAA,IACC,GAAA;AAAA,IACA,KAAA,EAAM,aAAA;AAAA,IACN,WAAA,EAAY,oBAAA;AAAA,IACZ,UAAA,EAAU,IAAA;AAAA,IACV,eAAA,EAAgB,gCAAA;AAAA,IAChB,WAAW,EAAE,QAAA,EAAU,MAAM,QAAA,EAAU,OAAA,EAAS,gBAAgB,MAAA,EAAO;AAAA,IACtE,GAAG;AAAA;AACN,CACD;AACD,yBAAA,CAA0B,WAAA,GAAc,2BAAA;;;;"}
|
package/dist/Form.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Form.js","sources":["../lib/utils/formHelpers.ts","../lib/components/Form/Form.tsx"],"sourcesContent":["import type { FieldPath, FieldValues, UseFormReturn } from 'react-hook-form';\n\n/**\n * Field mapping configuration for API error to form field mapping\n */\nexport interface FieldMapping {\n [apiField: string]: string; // Maps API field names to form field names\n}\n\n/**\n * Axios error structure (or similar HTTP client error structure)\n */\ninterface AxiosLikeError {\n response?: {\n data?: unknown;\n };\n}\n\n/**\n * RFC 9457 field error structure\n */\nexport interface FieldError {\n field: string;\n message: string;\n}\n\n/**\n * API error structure with field-specific errors\n * Supports RFC 9457 Problem Details format\n */\nexport interface ApiErrorResponse {\n type?: string; // RFC 9457: URI reference identifying the problem type\n title?: string; // RFC 9457: Short human-readable summary\n status?: number; // RFC 9457: HTTP status code\n label?: string; // Root error heading displayed to the user\n detail?: string; // RFC 9457: Human-readable explanation\n instance?: string; // RFC 9457: URI reference for the specific occurrence\n errors?: FieldError[];\n}\n\n/**\n * Options for mapping API errors to form\n */\nexport interface MapApiErrorsOptions {\n /**\n * Field name mapping from API to form fields\n */\n fieldMapping?: FieldMapping;\n\n /**\n * Whether to set root error for general messages\n */\n setRootError?: boolean;\n}\n\n/**\n * Maps an RFC 9457 Problem Details API error response to react-hook-form errors.\n *\n * Root errors (`label`/`title` + `detail`) and field errors (`errors[]`) are\n * handled independently -- a single response can populate both the root error\n * alert and inline field errors at the same time.\n *\n * @param error - The error object from API response\n * @param form - The react-hook-form instance\n * @param options - Mapping options\n *\n * @example\n * ```tsx\n * try {\n * await api.post('/login', data);\n * } catch (error) {\n * mapApiErrorsToForm(error.response?.data, form, {\n * fieldMapping: {\n * 'email_address': 'email',\n * 'password_hash': 'password'\n * }\n * });\n * }\n * ```\n */\nexport function mapApiErrorsToForm<TFieldValues extends FieldValues = FieldValues>(\n error: unknown,\n form: UseFormReturn<TFieldValues>,\n options: MapApiErrorsOptions = {},\n): void {\n const { fieldMapping = {}, setRootError = true } = options;\n\n if (!error || typeof error !== 'object') {\n if (setRootError) {\n form.setError('root', {\n type: 'Error',\n message: 'An error occurred',\n });\n }\n return;\n }\n\n // Extract error data from axios response structure\n const axiosError = error as AxiosLikeError;\n const errorData = axiosError.response?.data || error;\n const apiError = errorData as ApiErrorResponse;\n\n // Extract title/label for error heading (RFC 9457)\n const errorTitle = apiError.label || apiError.title || 'Error';\n const generalMessage = apiError.detail;\n\n // Map field-specific errors (field is always present in RFC 9457)\n let mappedFieldErrorsCount = 0;\n if (apiError.errors && Array.isArray(apiError.errors)) {\n for (const errorItem of apiError.errors) {\n const formField = fieldMapping[errorItem.field] || errorItem.field;\n\n form.setError(formField as FieldPath<TFieldValues>, {\n type: 'manual',\n message: errorItem.message,\n });\n mappedFieldErrorsCount += 1;\n }\n }\n\n // Root error is shown only when no field errors are present\n if (generalMessage && setRootError && mappedFieldErrorsCount === 0) {\n form.setError('root', {\n type: errorTitle,\n message: generalMessage,\n });\n }\n}\n","import type { UseMutationResult } from '@tanstack/react-query';\nimport type React from 'react';\nimport { Children, cloneElement, Fragment, isValidElement, useCallback } from 'react';\nimport {\n Controller,\n type ControllerProps,\n type FieldPath,\n type FieldValues,\n FormProvider,\n type UseFormReturn,\n} from 'react-hook-form';\nimport type { Country } from 'react-phone-number-input';\nimport { cn } from '../../../shadcn/utils';\nimport { axios } from '../../utils/axios';\nimport { type FieldMapping, mapApiErrorsToForm } from '../../utils/formHelpers';\nimport { Alert } from '../Alert';\nimport { Button } from '../Button';\nimport { Checkbox } from '../Checkbox';\nimport { CheckboxGroup } from '../CheckboxGroup';\nimport { DatePicker } from '../DatePicker';\nimport { DateTimePicker } from '../DateTimePicker';\nimport { PhoneField } from '../PhoneField';\nimport { RadioGroup } from '../RadioGroup';\nimport { Switch } from '../Switch';\nimport { UploadFile } from '../UploadFile';\n\n// Re-export Controller for explicit usage\nexport { Controller } from 'react-hook-form';\n\n/**\n * Recursively process children to wrap form fields with Controller\n * and inject loading state into submit buttons\n */\nfunction processChildren<\n TFieldValues extends FieldValues = FieldValues,\n _TContext = any,\n TTransformedValues extends FieldValues | undefined = TFieldValues,\n>(\n children: React.ReactNode,\n control: ControllerProps<TFieldValues, FieldPath<TFieldValues>, TTransformedValues>['control'],\n isSubmitting: boolean,\n setValue: UseFormReturn<TFieldValues, _TContext, TTransformedValues>['setValue'],\n onCancel?: () => void,\n reset?: UseFormReturn<TFieldValues, _TContext, TTransformedValues>['reset'],\n): React.ReactNode {\n return Children.map(children, (child) => {\n // Handle non-element children (strings, numbers, null, etc.)\n if (!isValidElement(child)) {\n return child;\n }\n\n const childProps = child.props as any;\n const isFragment = child.type === Fragment;\n\n // Handle form fields with name prop (but not Fragments)\n if (!isFragment && childProps.name && typeof childProps.name === 'string') {\n const name = childProps.name as FieldPath<TFieldValues>;\n\n return (\n <Controller\n key={name}\n control={control}\n name={name}\n render={({ field, fieldState }) => {\n // Check if this is a Checkbox, Switch, RadioGroup, or CheckboxGroup component\n const isCheckbox = child.type === Checkbox;\n const isSwitch = child.type === Switch;\n const isRadioGroup = child.type === RadioGroup;\n const isCheckboxGroup = child.type === CheckboxGroup;\n const isPhone = child.type === PhoneField;\n const isDatePicker = child.type === DatePicker;\n const isDateTimePicker = child.type === DateTimePicker;\n\n const fieldProps =\n isCheckbox || isSwitch\n ? {\n checked: field.value,\n onCheckedChange: field.onChange,\n onBlur: field.onBlur,\n ref: field.ref,\n }\n : isRadioGroup || isCheckboxGroup\n ? {\n value: field.value,\n onValueChange: field.onChange,\n onBlur: field.onBlur,\n }\n : isDatePicker\n ? {\n value: field.value,\n onValueChange: field.onChange,\n onBlur: field.onBlur,\n ref: field.ref,\n }\n : isDateTimePicker\n ? {\n value: field.value,\n onValueChange: field.onChange,\n onBlur: field.onBlur,\n ref: field.ref,\n }\n : isPhone\n ? {\n ...field,\n onCountryChange: (country: Country | undefined) => {\n setValue(`${name}Country` as FieldPath<TFieldValues>, country as any);\n },\n }\n : field;\n\n const isUploadFile = child.type === UploadFile;\n\n return cloneElement(child, {\n ...childProps,\n ...fieldProps,\n error: fieldState.error?.message || (fieldState.error ? 'Invalid' : undefined),\n name: undefined, // Remove name to avoid passing it to the underlying input\n ...(isUploadFile ? { isLoading: isSubmitting } : {}),\n });\n }}\n />\n );\n }\n\n // Handle cancel buttons - wire up form.reset() + onCancel callback\n if (childProps['data-cancel'] && onCancel && reset) {\n return cloneElement(child, {\n ...childProps,\n onClick: () => {\n reset();\n onCancel();\n },\n });\n }\n\n // Handle submit buttons - inject loading state via isLoading prop\n if (childProps.type === 'submit') {\n const isButtonElement =\n child.type === Button || (typeof child.type === 'function' && (child.type as any).displayName === 'Button');\n\n if (isButtonElement) {\n return cloneElement(child, {\n ...childProps,\n isLoading: isSubmitting,\n });\n }\n }\n\n // Handle React Fragments - process their children directly\n if (isFragment) {\n return processChildren(childProps.children, control, isSubmitting, setValue, onCancel, reset);\n }\n\n // Recurse into children for container elements (divs, FieldGroups, etc.)\n if (childProps.children != null) {\n return cloneElement(child, {\n ...childProps,\n children: processChildren(childProps.children, control, isSubmitting, setValue, onCancel, reset),\n });\n }\n\n // Return unchanged if no name prop and no children\n return child;\n });\n}\n\nexport interface FormProps<\n TFieldValues extends FieldValues = FieldValues,\n TContext = any,\n TTransformedValues extends FieldValues | undefined = TFieldValues,\n TMutationData = unknown,\n TMutationError = Error,\n TMutationVariables = any,\n> extends Omit<React.FormHTMLAttributes<HTMLFormElement>, 'onSubmit'> {\n /**\n * The react-hook-form form instance\n */\n form: UseFormReturn<TFieldValues, TContext, TTransformedValues>;\n\n /**\n * Form submit handler - receives the transformed values if transformation is applied.\n * Optional when using `mutation` prop.\n */\n onSubmit?: Parameters<UseFormReturn<TFieldValues, TContext, TTransformedValues>['handleSubmit']>[0];\n\n /**\n * Children elements - automatically wrapped with Controller if they have a name prop\n */\n children: React.ReactNode;\n\n /**\n * Position of the root error display\n * @default 'bottom'\n */\n rootErrorPosition?: 'top' | 'bottom';\n\n /**\n * Additional classes for the root error display\n */\n rootErrorClassName?: string;\n\n /**\n * Action element rendered in the root error Alert (e.g. button or link)\n * Positioned in the top-right corner using AlertAction\n */\n rootErrorAction?: React.ReactNode;\n\n /**\n * Field mapping for automatic API error mapping\n * Maps API field names to form field names\n */\n fieldMapping?: FieldMapping;\n\n /**\n * TanStack Query mutation for automatic handling.\n * When provided, the form will use `mutateAsync` to submit data and handle errors automatically.\n * The mutation's own callbacks (onSuccess, onError, etc.) will fire automatically.\n * Form only adds `mapApiErrorsToForm` as an extra error handling layer.\n * Optional - you can use `onSubmit` instead for forms that don't use mutations.\n */\n mutation?: UseMutationResult<TMutationData, TMutationError, TMutationVariables, unknown>;\n\n /**\n * Transform form data to mutation variables before submission.\n * Only used when `mutation` prop is provided.\n */\n transformSubmit?: (\n data: TTransformedValues extends undefined ? TFieldValues : TTransformedValues,\n ) => TMutationVariables;\n\n /**\n * Automatically calls form.reset() after a successful mutation.\n * Set to false for \"edit\" forms where resetting clears pre-populated values.\n * @default true\n */\n resetOnSuccess?: boolean;\n\n /**\n * Called when a cancel button (marked with data-cancel) is clicked.\n * Form.reset() is called automatically before invoking this callback.\n */\n onCancel?: () => void;\n}\n\n/**\n * Smart Form component that automatically wraps children with Controller\n *\n * Usage with onSubmit:\n * ```tsx\n * <Form form={form} onSubmit={handleSubmit}>\n * <TextField name=\"email\" label=\"Email\" description=\"Your email address\" />\n * <PasswordField name=\"password\" label=\"Password\" />\n * <Button type=\"submit\">Submit</Button>\n * </Form>\n * ```\n *\n * Usage with TanStack Query mutation:\n * ```tsx\n * const mutation = useMutation({\n * mutationFn: (data) => api.post('/login', data),\n * onSuccess: (data) => console.log('Success!', data),\n * onError: (error) => console.error('Error!', error),\n * });\n *\n * <Form\n * form={form}\n * mutation={mutation}\n * transformSubmit={(data) => ({ ...data, timestamp: Date.now() })}\n * >\n * <TextField name=\"email\" label=\"Email\" />\n * <Button type=\"submit\">Submit</Button>\n * </Form>\n * ```\n */\nexport function Form<\n TFieldValues extends FieldValues = FieldValues,\n TContext = any,\n TTransformedValues extends FieldValues | undefined = TFieldValues,\n TMutationData = unknown,\n TMutationError = Error,\n TMutationVariables = any,\n>({\n form,\n onSubmit,\n children,\n rootErrorPosition = 'bottom',\n rootErrorClassName,\n rootErrorAction,\n fieldMapping,\n mutation,\n transformSubmit,\n resetOnSuccess,\n onCancel,\n className,\n ...props\n}: FormProps<TFieldValues, TContext, TTransformedValues, TMutationData, TMutationError, TMutationVariables>) {\n // Compute isSubmitting from both form state and mutation state\n const isSubmitting = form.formState.isSubmitting || (mutation?.isPending ?? false);\n\n // Wrap the submit handler with automatic error mapping (always enabled)\n // Form only adds mapApiErrorsToForm - the mutation's own callbacks fire automatically\n const wrappedOnSubmit = useCallback(\n async (data: TTransformedValues extends undefined ? TFieldValues : TTransformedValues) => {\n // Suppress error toasts during form submission — Form handles errors inline\n const interceptorId = axios.interceptors.request.use((config) => ({\n ...config,\n showErrorToast: false,\n }));\n\n try {\n if (mutation) {\n const variables = transformSubmit ? transformSubmit(data) : data;\n // mutateAsync will trigger the mutation's onSuccess/onError callbacks\n await mutation.mutateAsync(variables as TMutationVariables);\n } else if (onSubmit) {\n await onSubmit(data as any);\n }\n\n // Reset form after successful submission (default: true)\n if (resetOnSuccess !== false) form.reset();\n } catch (error) {\n // Form's only job: map API errors to form fields\n // mapApiErrorsToForm handles axios error structure extraction internally\n mapApiErrorsToForm(error, form as any, {\n fieldMapping,\n });\n // Log error for debugging\n console.error('[Form Submission Error]', error);\n // Error is swallowed, not re-thrown (mutation's onError already fired)\n } finally {\n axios.interceptors.request.eject(interceptorId);\n }\n },\n [onSubmit, mutation, transformSubmit, fieldMapping, form, resetOnSuccess],\n );\n\n const handleSubmit = form.handleSubmit(wrappedOnSubmit as any);\n\n // Process children recursively to automatically wrap with Controller\n const processedChildren = processChildren(children, form.control, isSubmitting, form.setValue, onCancel, form.reset);\n\n const childArray = Children.toArray(processedChildren);\n const actionsIndex = childArray.findIndex(\n (child) => isValidElement(child) && (child.type as { displayName?: string })?.displayName === 'DialogActions',\n );\n const hasActions = actionsIndex !== -1;\n const bodyChildren = hasActions ? childArray.filter((_, index) => index !== actionsIndex) : processedChildren;\n const actions = hasActions ? childArray[actionsIndex] : null;\n\n const topError =\n rootErrorPosition === 'top' && form.formState.errors.root ? (\n <Alert\n variant=\"destructive\"\n title={form.formState.errors.root.type || 'Error'}\n description={form.formState.errors.root.message}\n action={rootErrorAction}\n className={cn('mb-4', rootErrorClassName)}\n />\n ) : null;\n const bottomError =\n rootErrorPosition === 'bottom' && form.formState.errors.root ? (\n <Alert\n variant=\"destructive\"\n title={form.formState.errors.root.type || 'Error'}\n description={form.formState.errors.root.message}\n action={rootErrorAction}\n className={cn('mt-4', rootErrorClassName)}\n />\n ) : null;\n\n return (\n <FormProvider {...form}>\n <form\n onSubmit={handleSubmit}\n className={cn(hasActions ? 'flex min-h-0 flex-1 flex-col' : 'space-y-4', className)}\n {...props}\n >\n {hasActions ? (\n <>\n <div className=\"min-h-0 flex-1 space-y-4 overflow-y-auto overscroll-contain px-6 py-4 [scrollbar-gutter:stable]\">\n {topError}\n {bodyChildren}\n {bottomError}\n </div>\n {actions}\n </>\n ) : (\n <>\n {topError}\n {processedChildren}\n {bottomError}\n </>\n )}\n </form>\n </FormProvider>\n );\n}\n\nForm.displayName = 'Form';\n"],"names":["Fragment"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Form.js","sources":["../lib/utils/formHelpers.ts","../lib/components/Form/Form.tsx"],"sourcesContent":["import type { FieldPath, FieldValues, UseFormReturn } from 'react-hook-form';\n\nexport interface FieldMapping {\n [apiField: string]: string;\n}\n\ninterface AxiosLikeError {\n response?: {\n data?: unknown;\n };\n}\n\nexport interface FieldError {\n field: string;\n message: string;\n}\n\nexport interface ApiErrorResponse {\n type?: string;\n title?: string;\n status?: number;\n label?: string;\n detail?: string;\n instance?: string;\n errors?: FieldError[];\n}\n\nexport interface MapApiErrorsOptions {\n fieldMapping?: FieldMapping;\n setRootError?: boolean;\n}\n\n// Maps an RFC 9457 Problem Details API error response to react-hook-form root + field errors.\nexport function mapApiErrorsToForm<TFieldValues extends FieldValues = FieldValues>(\n error: unknown,\n form: UseFormReturn<TFieldValues>,\n options: MapApiErrorsOptions = {},\n): void {\n const { fieldMapping = {}, setRootError = true } = options;\n\n if (!error || typeof error !== 'object') {\n if (setRootError) {\n form.setError('root', {\n type: 'Error',\n message: 'An error occurred',\n });\n }\n return;\n }\n\n // Extract error data from axios response structure\n const axiosError = error as AxiosLikeError;\n const errorData = axiosError.response?.data || error;\n const apiError = errorData as ApiErrorResponse;\n\n // Extract title/label for error heading (RFC 9457)\n const errorTitle = apiError.label || apiError.title || 'Error';\n const generalMessage = apiError.detail;\n\n // Map field-specific errors (field is always present in RFC 9457)\n let mappedFieldErrorsCount = 0;\n if (apiError.errors && Array.isArray(apiError.errors)) {\n for (const errorItem of apiError.errors) {\n const formField = fieldMapping[errorItem.field] || errorItem.field;\n\n form.setError(formField as FieldPath<TFieldValues>, {\n type: 'manual',\n message: errorItem.message,\n });\n mappedFieldErrorsCount += 1;\n }\n }\n\n // Root error is shown only when no field errors are present\n if (generalMessage && setRootError && mappedFieldErrorsCount === 0) {\n form.setError('root', {\n type: errorTitle,\n message: generalMessage,\n });\n }\n}\n","import type { UseMutationResult } from '@tanstack/react-query';\nimport type React from 'react';\nimport { Children, cloneElement, Fragment, isValidElement, useCallback } from 'react';\nimport {\n Controller,\n type ControllerProps,\n type FieldPath,\n type FieldValues,\n FormProvider,\n type UseFormReturn,\n} from 'react-hook-form';\nimport type { Country } from 'react-phone-number-input';\nimport { cn } from '../../../shadcn/utils';\nimport { axios } from '../../utils/axios';\nimport { type FieldMapping, mapApiErrorsToForm } from '../../utils/formHelpers';\nimport { Alert } from '../Alert';\nimport { Button } from '../Button';\nimport { Checkbox } from '../Checkbox';\nimport { CheckboxGroup } from '../CheckboxGroup';\nimport { DatePicker } from '../DatePicker';\nimport { DateTimePicker } from '../DateTimePicker';\nimport { PhoneField } from '../PhoneField';\nimport { RadioGroup } from '../RadioGroup';\nimport { Switch } from '../Switch';\nimport { UploadFile } from '../UploadFile';\n\n// Re-export Controller for explicit usage\nexport { Controller } from 'react-hook-form';\n\n// Recursively process children to wrap form fields with Controller and inject loading state into submit buttons\nfunction processChildren<\n TFieldValues extends FieldValues = FieldValues,\n _TContext = any,\n TTransformedValues extends FieldValues | undefined = TFieldValues,\n>(\n children: React.ReactNode,\n control: ControllerProps<TFieldValues, FieldPath<TFieldValues>, TTransformedValues>['control'],\n isSubmitting: boolean,\n setValue: UseFormReturn<TFieldValues, _TContext, TTransformedValues>['setValue'],\n onCancel?: () => void,\n reset?: UseFormReturn<TFieldValues, _TContext, TTransformedValues>['reset'],\n): React.ReactNode {\n return Children.map(children, (child) => {\n // Handle non-element children (strings, numbers, null, etc.)\n if (!isValidElement(child)) {\n return child;\n }\n\n const childProps = child.props as any;\n const isFragment = child.type === Fragment;\n\n // Handle form fields with name prop (but not Fragments)\n if (!isFragment && childProps.name && typeof childProps.name === 'string') {\n const name = childProps.name as FieldPath<TFieldValues>;\n\n return (\n <Controller\n key={name}\n control={control}\n name={name}\n render={({ field, fieldState }) => {\n // Check if this is a Checkbox, Switch, RadioGroup, or CheckboxGroup component\n const isCheckbox = child.type === Checkbox;\n const isSwitch = child.type === Switch;\n const isRadioGroup = child.type === RadioGroup;\n const isCheckboxGroup = child.type === CheckboxGroup;\n const isPhone = child.type === PhoneField;\n const isDatePicker = child.type === DatePicker;\n const isDateTimePicker = child.type === DateTimePicker;\n\n const fieldProps =\n isCheckbox || isSwitch\n ? {\n checked: field.value,\n onCheckedChange: field.onChange,\n onBlur: field.onBlur,\n ref: field.ref,\n }\n : isRadioGroup || isCheckboxGroup\n ? {\n value: field.value,\n onValueChange: field.onChange,\n onBlur: field.onBlur,\n }\n : isDatePicker\n ? {\n value: field.value,\n onValueChange: field.onChange,\n onBlur: field.onBlur,\n ref: field.ref,\n }\n : isDateTimePicker\n ? {\n value: field.value,\n onValueChange: field.onChange,\n onBlur: field.onBlur,\n ref: field.ref,\n }\n : isPhone\n ? {\n ...field,\n onCountryChange: (country: Country | undefined) => {\n setValue(`${name}Country` as FieldPath<TFieldValues>, country as any);\n },\n }\n : field;\n\n const isUploadFile = child.type === UploadFile;\n\n return cloneElement(child, {\n ...childProps,\n ...fieldProps,\n error: fieldState.error?.message || (fieldState.error ? 'Invalid' : undefined),\n name: undefined, // Remove name to avoid passing it to the underlying input\n ...(isUploadFile ? { isLoading: isSubmitting } : {}),\n });\n }}\n />\n );\n }\n\n // Handle cancel buttons - wire up form.reset() + onCancel callback\n if (childProps['data-cancel'] && onCancel && reset) {\n return cloneElement(child, {\n ...childProps,\n onClick: () => {\n reset();\n onCancel();\n },\n });\n }\n\n // Handle submit buttons - inject loading state via isLoading prop\n if (childProps.type === 'submit') {\n const isButtonElement =\n child.type === Button || (typeof child.type === 'function' && (child.type as any).displayName === 'Button');\n\n if (isButtonElement) {\n return cloneElement(child, {\n ...childProps,\n isLoading: isSubmitting,\n });\n }\n }\n\n // Handle React Fragments - process their children directly\n if (isFragment) {\n return processChildren(childProps.children, control, isSubmitting, setValue, onCancel, reset);\n }\n\n // Recurse into children for container elements (divs, FieldGroups, etc.)\n if (childProps.children != null) {\n return cloneElement(child, {\n ...childProps,\n children: processChildren(childProps.children, control, isSubmitting, setValue, onCancel, reset),\n });\n }\n\n // Return unchanged if no name prop and no children\n return child;\n });\n}\n\nexport interface FormProps<\n TFieldValues extends FieldValues = FieldValues,\n TContext = any,\n TTransformedValues extends FieldValues | undefined = TFieldValues,\n TMutationData = unknown,\n TMutationError = Error,\n TMutationVariables = any,\n> extends Omit<React.FormHTMLAttributes<HTMLFormElement>, 'onSubmit'> {\n form: UseFormReturn<TFieldValues, TContext, TTransformedValues>;\n\n onSubmit?: Parameters<UseFormReturn<TFieldValues, TContext, TTransformedValues>['handleSubmit']>[0];\n\n children: React.ReactNode;\n\n rootErrorPosition?: 'top' | 'bottom';\n\n rootErrorClassName?: string;\n\n rootErrorAction?: React.ReactNode;\n\n fieldMapping?: FieldMapping;\n\n mutation?: UseMutationResult<TMutationData, TMutationError, TMutationVariables, unknown>;\n\n transformSubmit?: (\n data: TTransformedValues extends undefined ? TFieldValues : TTransformedValues,\n ) => TMutationVariables;\n\n resetOnSuccess?: boolean;\n\n onCancel?: () => void;\n}\n\n// Smart Form component that automatically wraps children with Controller\nexport function Form<\n TFieldValues extends FieldValues = FieldValues,\n TContext = any,\n TTransformedValues extends FieldValues | undefined = TFieldValues,\n TMutationData = unknown,\n TMutationError = Error,\n TMutationVariables = any,\n>({\n form,\n onSubmit,\n children,\n rootErrorPosition = 'bottom',\n rootErrorClassName,\n rootErrorAction,\n fieldMapping,\n mutation,\n transformSubmit,\n resetOnSuccess,\n onCancel,\n className,\n ...props\n}: FormProps<TFieldValues, TContext, TTransformedValues, TMutationData, TMutationError, TMutationVariables>) {\n // Compute isSubmitting from both form state and mutation state\n const isSubmitting = form.formState.isSubmitting || (mutation?.isPending ?? false);\n\n // Wrap the submit handler with automatic error mapping; the mutation's own callbacks fire automatically\n const wrappedOnSubmit = useCallback(\n async (data: TTransformedValues extends undefined ? TFieldValues : TTransformedValues) => {\n // Suppress error toasts during form submission — Form handles errors inline\n const interceptorId = axios.interceptors.request.use((config) => ({\n ...config,\n showErrorToast: false,\n }));\n\n try {\n if (mutation) {\n const variables = transformSubmit ? transformSubmit(data) : data;\n // mutateAsync will trigger the mutation's onSuccess/onError callbacks\n await mutation.mutateAsync(variables as TMutationVariables);\n } else if (onSubmit) {\n await onSubmit(data as any);\n }\n\n // Reset form after successful submission (default: true)\n if (resetOnSuccess !== false) form.reset();\n } catch (error) {\n // Map API errors to form fields — mapApiErrorsToForm extracts the axios error structure internally\n mapApiErrorsToForm(error, form as any, {\n fieldMapping,\n });\n // Log error for debugging\n console.error('[Form Submission Error]', error);\n // Error is swallowed, not re-thrown (mutation's onError already fired)\n } finally {\n axios.interceptors.request.eject(interceptorId);\n }\n },\n [onSubmit, mutation, transformSubmit, fieldMapping, form, resetOnSuccess],\n );\n\n const handleSubmit = form.handleSubmit(wrappedOnSubmit as any);\n\n // Process children recursively to automatically wrap with Controller\n const processedChildren = processChildren(children, form.control, isSubmitting, form.setValue, onCancel, form.reset);\n\n const childArray = Children.toArray(processedChildren);\n const actionsIndex = childArray.findIndex(\n (child) => isValidElement(child) && (child.type as { displayName?: string })?.displayName === 'DialogActions',\n );\n const hasActions = actionsIndex !== -1;\n const bodyChildren = hasActions ? childArray.filter((_, index) => index !== actionsIndex) : processedChildren;\n const actions = hasActions ? childArray[actionsIndex] : null;\n\n const topError =\n rootErrorPosition === 'top' && form.formState.errors.root ? (\n <Alert\n variant=\"destructive\"\n title={form.formState.errors.root.type || 'Error'}\n description={form.formState.errors.root.message}\n action={rootErrorAction}\n className={cn('mb-4', rootErrorClassName)}\n />\n ) : null;\n const bottomError =\n rootErrorPosition === 'bottom' && form.formState.errors.root ? (\n <Alert\n variant=\"destructive\"\n title={form.formState.errors.root.type || 'Error'}\n description={form.formState.errors.root.message}\n action={rootErrorAction}\n className={cn('mt-4', rootErrorClassName)}\n />\n ) : null;\n\n return (\n <FormProvider {...form}>\n <form\n onSubmit={handleSubmit}\n className={cn(hasActions ? 'flex min-h-0 flex-1 flex-col' : 'space-y-4', className)}\n {...props}\n >\n {hasActions ? (\n <>\n <div className=\"min-h-0 flex-1 space-y-4 overflow-y-auto overscroll-contain px-6 py-4 [scrollbar-gutter:stable]\">\n {topError}\n {bodyChildren}\n {bottomError}\n </div>\n {actions}\n </>\n ) : (\n <>\n {topError}\n {processedChildren}\n {bottomError}\n </>\n )}\n </form>\n </FormProvider>\n );\n}\n\nForm.displayName = 'Form';\n"],"names":["Fragment"],"mappings":"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"}
|
package/dist/FormSection.js
CHANGED
|
@@ -10,11 +10,11 @@ function FormSection({
|
|
|
10
10
|
contentClassName
|
|
11
11
|
}) {
|
|
12
12
|
return /* @__PURE__ */ jsxs("section", { className: cn("space-y-3", className), children: [
|
|
13
|
-
/* @__PURE__ */ jsxs("div", { className: cn("
|
|
14
|
-
/* @__PURE__ */ jsx("
|
|
15
|
-
description ? /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground", children: description }) : null
|
|
13
|
+
/* @__PURE__ */ jsxs("div", { className: cn("border-b pb-2", headerClassName), children: [
|
|
14
|
+
/* @__PURE__ */ jsx("div", { className: "text-xs font-semibold uppercase tracking-widest text-muted-foreground", children: title }),
|
|
15
|
+
description ? /* @__PURE__ */ jsx("p", { className: "mt-1 text-sm text-muted-foreground", children: description }) : null
|
|
16
16
|
] }),
|
|
17
|
-
/* @__PURE__ */ jsx("div", { className: cn(contentClassName), children })
|
|
17
|
+
/* @__PURE__ */ jsx("div", { className: cn(contentClassName ?? "grid grid-cols-2 gap-4"), children })
|
|
18
18
|
] });
|
|
19
19
|
}
|
|
20
20
|
FormSection.displayName = "FormSection";
|