brd-ui-kit 0.1.76 → 0.1.78
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/brd-ui-kit.css +1 -1
- package/dist/calendar-PqChui7l.cjs +2 -0
- package/dist/{calendar-B5QCV34E.cjs.map → calendar-PqChui7l.cjs.map} +1 -1
- package/dist/{calendar-Ba3kHG6w.js → calendar-XWqEaWHP.js} +4 -3
- package/dist/{calendar-Ba3kHG6w.js.map → calendar-XWqEaWHP.js.map} +1 -1
- package/dist/{calendar-locale-BHyNJPb2.cjs → calendar-locale-CosU_VZY.cjs} +2 -2
- package/dist/{calendar-locale-BHyNJPb2.cjs.map → calendar-locale-CosU_VZY.cjs.map} +1 -1
- package/dist/{calendar-locale-DQ9wj0zF.js → calendar-locale-DqQZymBn.js} +2 -2
- package/dist/{calendar-locale-DQ9wj0zF.js.map → calendar-locale-DqQZymBn.js.map} +1 -1
- package/dist/components/app-sidebar/app-sidebar.d.ts +2 -2
- package/dist/components/checkbox-group/checkbox-group.d.ts +29 -0
- package/dist/components/checkbox-group/index.d.ts +2 -0
- package/dist/components/checkbox-group.d.ts +2 -0
- package/dist/components/data-table/data-table-row-actions-column.d.ts +2 -2
- package/dist/components/files-uploader/files-uploader.d.ts +2 -2
- package/dist/components/icons/ArrowCounterClockwise.d.ts +1 -0
- package/dist/components/icons/BoundingBox.d.ts +1 -0
- package/dist/components/icons/Briefcase.d.ts +1 -0
- package/dist/components/icons/Building.d.ts +1 -0
- package/dist/components/icons/Buildings.d.ts +1 -0
- package/dist/components/icons/CaretDown.d.ts +1 -0
- package/dist/components/icons/CaretLeft.d.ts +1 -0
- package/dist/components/icons/CaretRight.d.ts +1 -0
- package/dist/components/icons/CaretUp.d.ts +1 -0
- package/dist/components/icons/CaretUpDown.d.ts +1 -0
- package/dist/components/icons/ChartLine.d.ts +1 -0
- package/dist/components/icons/Check.d.ts +1 -0
- package/dist/components/icons/CheckCircle.d.ts +1 -0
- package/dist/components/icons/Clock.d.ts +1 -0
- package/dist/components/icons/CreditCard.d.ts +1 -0
- package/dist/components/icons/DotsThree.d.ts +1 -0
- package/dist/components/icons/DownloadSimple.d.ts +1 -0
- package/dist/components/icons/EnvelopeSimple.d.ts +1 -0
- package/dist/components/icons/Eye.d.ts +1 -0
- package/dist/components/icons/EyeSlash.d.ts +1 -0
- package/dist/components/icons/FileText.d.ts +1 -0
- package/dist/components/icons/Folder.d.ts +1 -0
- package/dist/components/icons/Funnel.d.ts +1 -0
- package/dist/components/icons/Gear.d.ts +1 -0
- package/dist/components/icons/Info.d.ts +1 -0
- package/dist/components/icons/LockKey.d.ts +1 -0
- package/dist/components/icons/MagnifyingGlass.d.ts +1 -0
- package/dist/components/icons/MaxLogo.d.ts +1 -0
- package/dist/components/icons/Package.d.ts +1 -0
- package/dist/components/icons/Pencil.d.ts +1 -0
- package/dist/components/icons/Phone.d.ts +1 -0
- package/dist/components/icons/Plus.d.ts +1 -0
- package/dist/components/icons/PresentationChart.d.ts +1 -0
- package/dist/components/icons/SpinnerGap.d.ts +1 -0
- package/dist/components/icons/TelegramLogo.d.ts +1 -0
- package/dist/components/icons/Trash.d.ts +1 -0
- package/dist/components/icons/UserCircleGear.d.ts +1 -0
- package/dist/components/icons/Users.d.ts +1 -0
- package/dist/components/icons/UsersFour.d.ts +1 -0
- package/dist/components/icons/Warning.d.ts +1 -0
- package/dist/components/icons/WarningCircle.d.ts +1 -0
- package/dist/components/icons/WhatsAppLogoFilled.d.ts +1 -0
- package/dist/components/icons/Wrench.d.ts +1 -0
- package/dist/components/icons/X.d.ts +1 -0
- package/dist/components/icons/XCircle.d.ts +1 -0
- package/dist/components/icons/index.d.ts +50 -0
- package/dist/components/icons/stroke-icon.d.ts +19 -0
- package/dist/components/icons.d.ts +2 -0
- package/dist/components/input-password/input-password.d.ts +1 -1
- package/dist/components/ui/dropdown-menu/dropdown-menu.d.ts +2 -2
- package/dist/components/ui/icon/icon-map.d.ts +68 -0
- package/dist/components/ui/icon/icon.d.ts +6 -6
- package/dist/components/ui/icon/index.d.ts +3 -1
- package/dist/components/ui/toggle-group/toggle-group.styles.d.ts +1 -1
- package/dist/components-app-pagination-app-pagination.cjs +1 -1
- package/dist/components-app-pagination-app-pagination.cjs.map +1 -1
- package/dist/components-app-pagination-app-pagination.js +34 -32
- package/dist/components-app-pagination-app-pagination.js.map +1 -1
- package/dist/components-app-sidebar-app-sidebar.cjs +1 -1
- package/dist/components-app-sidebar-app-sidebar.cjs.map +1 -1
- package/dist/components-app-sidebar-app-sidebar.js +33 -32
- package/dist/components-app-sidebar-app-sidebar.js.map +1 -1
- package/dist/components-avatar-uploader-avatar-uploader.cjs +2 -2
- package/dist/components-avatar-uploader-avatar-uploader.cjs.map +1 -1
- package/dist/components-avatar-uploader-avatar-uploader.js +23 -4
- package/dist/components-avatar-uploader-avatar-uploader.js.map +1 -1
- package/dist/components-basic-avatar-basic-avatar.cjs +2 -2
- package/dist/components-basic-avatar-basic-avatar.cjs.map +1 -1
- package/dist/components-basic-avatar-basic-avatar.js +24 -4
- package/dist/components-basic-avatar-basic-avatar.js.map +1 -1
- package/dist/components-checkbox-group-checkbox-group.cjs +4 -0
- package/dist/components-checkbox-group-checkbox-group.cjs.map +1 -0
- package/dist/components-checkbox-group-checkbox-group.js +305 -0
- package/dist/components-checkbox-group-checkbox-group.js.map +1 -0
- package/dist/components-checkbox-group.cjs +2 -0
- package/dist/components-checkbox-group.cjs.map +1 -0
- package/dist/components-checkbox-group.js +5 -0
- package/dist/components-checkbox-group.js.map +1 -0
- package/dist/components-data-table-data-table-actions-column.cjs +1 -1
- package/dist/components-data-table-data-table-actions-column.cjs.map +1 -1
- package/dist/components-data-table-data-table-actions-column.js +6 -5
- package/dist/components-data-table-data-table-actions-column.js.map +1 -1
- package/dist/components-data-table-data-table-column-visibility.cjs +1 -1
- package/dist/components-data-table-data-table-column-visibility.cjs.map +1 -1
- package/dist/components-data-table-data-table-column-visibility.js +10 -9
- package/dist/components-data-table-data-table-column-visibility.js.map +1 -1
- package/dist/components-data-table-data-table-row-actions-column.cjs +1 -1
- package/dist/components-data-table-data-table-row-actions-column.cjs.map +1 -1
- package/dist/components-data-table-data-table-row-actions-column.js +20 -19
- package/dist/components-data-table-data-table-row-actions-column.js.map +1 -1
- package/dist/components-files-uploader-files-uploader.cjs +3 -3
- package/dist/components-files-uploader-files-uploader.cjs.map +1 -1
- package/dist/components-files-uploader-files-uploader.js +41 -38
- package/dist/components-files-uploader-files-uploader.js.map +1 -1
- package/dist/components-icons-ArrowCounterClockwise.cjs +2 -0
- package/dist/components-icons-ArrowCounterClockwise.cjs.map +1 -0
- package/dist/components-icons-ArrowCounterClockwise.js +5 -0
- package/dist/components-icons-ArrowCounterClockwise.js.map +1 -0
- package/dist/components-icons-BoundingBox.cjs +2 -0
- package/dist/components-icons-BoundingBox.cjs.map +1 -0
- package/dist/components-icons-BoundingBox.js +5 -0
- package/dist/components-icons-BoundingBox.js.map +1 -0
- package/dist/components-icons-Briefcase.cjs +2 -0
- package/dist/components-icons-Briefcase.cjs.map +1 -0
- package/dist/components-icons-Briefcase.js +5 -0
- package/dist/components-icons-Briefcase.js.map +1 -0
- package/dist/components-icons-Building.cjs +2 -0
- package/dist/components-icons-Building.cjs.map +1 -0
- package/dist/components-icons-Building.js +5 -0
- package/dist/components-icons-Building.js.map +1 -0
- package/dist/components-icons-Buildings.cjs +2 -0
- package/dist/components-icons-Buildings.cjs.map +1 -0
- package/dist/components-icons-Buildings.js +5 -0
- package/dist/components-icons-Buildings.js.map +1 -0
- package/dist/components-icons-CaretDown.cjs +2 -0
- package/dist/components-icons-CaretDown.cjs.map +1 -0
- package/dist/components-icons-CaretDown.js +5 -0
- package/dist/components-icons-CaretDown.js.map +1 -0
- package/dist/components-icons-CaretLeft.cjs +2 -0
- package/dist/components-icons-CaretLeft.cjs.map +1 -0
- package/dist/components-icons-CaretLeft.js +5 -0
- package/dist/components-icons-CaretLeft.js.map +1 -0
- package/dist/components-icons-CaretRight.cjs +2 -0
- package/dist/components-icons-CaretRight.cjs.map +1 -0
- package/dist/components-icons-CaretRight.js +5 -0
- package/dist/components-icons-CaretRight.js.map +1 -0
- package/dist/components-icons-CaretUp.cjs +2 -0
- package/dist/components-icons-CaretUp.cjs.map +1 -0
- package/dist/components-icons-CaretUp.js +5 -0
- package/dist/components-icons-CaretUp.js.map +1 -0
- package/dist/components-icons-CaretUpDown.cjs +2 -0
- package/dist/components-icons-CaretUpDown.cjs.map +1 -0
- package/dist/components-icons-CaretUpDown.js +5 -0
- package/dist/components-icons-CaretUpDown.js.map +1 -0
- package/dist/components-icons-ChartLine.cjs +2 -0
- package/dist/components-icons-ChartLine.cjs.map +1 -0
- package/dist/components-icons-ChartLine.js +5 -0
- package/dist/components-icons-ChartLine.js.map +1 -0
- package/dist/components-icons-Check.cjs +2 -0
- package/dist/components-icons-Check.cjs.map +1 -0
- package/dist/components-icons-Check.js +5 -0
- package/dist/components-icons-Check.js.map +1 -0
- package/dist/components-icons-CheckCircle.cjs +2 -0
- package/dist/components-icons-CheckCircle.cjs.map +1 -0
- package/dist/components-icons-CheckCircle.js +5 -0
- package/dist/components-icons-CheckCircle.js.map +1 -0
- package/dist/components-icons-Clock.cjs +2 -0
- package/dist/components-icons-Clock.cjs.map +1 -0
- package/dist/components-icons-Clock.js +5 -0
- package/dist/components-icons-Clock.js.map +1 -0
- package/dist/components-icons-CreditCard.cjs +2 -0
- package/dist/components-icons-CreditCard.cjs.map +1 -0
- package/dist/components-icons-CreditCard.js +5 -0
- package/dist/components-icons-CreditCard.js.map +1 -0
- package/dist/components-icons-DotsThree.cjs +2 -0
- package/dist/components-icons-DotsThree.cjs.map +1 -0
- package/dist/components-icons-DotsThree.js +5 -0
- package/dist/components-icons-DotsThree.js.map +1 -0
- package/dist/components-icons-DownloadSimple.cjs +2 -0
- package/dist/components-icons-DownloadSimple.cjs.map +1 -0
- package/dist/components-icons-DownloadSimple.js +5 -0
- package/dist/components-icons-DownloadSimple.js.map +1 -0
- package/dist/components-icons-EnvelopeSimple.cjs +2 -0
- package/dist/components-icons-EnvelopeSimple.cjs.map +1 -0
- package/dist/components-icons-EnvelopeSimple.js +5 -0
- package/dist/components-icons-EnvelopeSimple.js.map +1 -0
- package/dist/components-icons-Eye.cjs +2 -0
- package/dist/components-icons-Eye.cjs.map +1 -0
- package/dist/components-icons-Eye.js +5 -0
- package/dist/components-icons-Eye.js.map +1 -0
- package/dist/components-icons-EyeSlash.cjs +2 -0
- package/dist/components-icons-EyeSlash.cjs.map +1 -0
- package/dist/components-icons-EyeSlash.js +5 -0
- package/dist/components-icons-EyeSlash.js.map +1 -0
- package/dist/components-icons-FileText.cjs +2 -0
- package/dist/components-icons-FileText.cjs.map +1 -0
- package/dist/components-icons-FileText.js +5 -0
- package/dist/components-icons-FileText.js.map +1 -0
- package/dist/components-icons-Folder.cjs +2 -0
- package/dist/components-icons-Folder.cjs.map +1 -0
- package/dist/components-icons-Folder.js +5 -0
- package/dist/components-icons-Folder.js.map +1 -0
- package/dist/components-icons-Funnel.cjs +2 -0
- package/dist/components-icons-Funnel.cjs.map +1 -0
- package/dist/components-icons-Funnel.js +5 -0
- package/dist/components-icons-Funnel.js.map +1 -0
- package/dist/components-icons-Gear.cjs +2 -0
- package/dist/components-icons-Gear.cjs.map +1 -0
- package/dist/components-icons-Gear.js +5 -0
- package/dist/components-icons-Gear.js.map +1 -0
- package/dist/components-icons-Info.cjs +2 -0
- package/dist/components-icons-Info.cjs.map +1 -0
- package/dist/components-icons-Info.js +5 -0
- package/dist/components-icons-Info.js.map +1 -0
- package/dist/components-icons-LockKey.cjs +2 -0
- package/dist/components-icons-LockKey.cjs.map +1 -0
- package/dist/components-icons-LockKey.js +5 -0
- package/dist/components-icons-LockKey.js.map +1 -0
- package/dist/components-icons-MagnifyingGlass.cjs +2 -0
- package/dist/components-icons-MagnifyingGlass.cjs.map +1 -0
- package/dist/components-icons-MagnifyingGlass.js +5 -0
- package/dist/components-icons-MagnifyingGlass.js.map +1 -0
- package/dist/components-icons-MaxLogo.cjs +2 -0
- package/dist/components-icons-MaxLogo.cjs.map +1 -0
- package/dist/components-icons-MaxLogo.js +5 -0
- package/dist/components-icons-MaxLogo.js.map +1 -0
- package/dist/components-icons-Package.cjs +2 -0
- package/dist/components-icons-Package.cjs.map +1 -0
- package/dist/components-icons-Package.js +5 -0
- package/dist/components-icons-Package.js.map +1 -0
- package/dist/components-icons-Pencil.cjs +2 -0
- package/dist/components-icons-Pencil.cjs.map +1 -0
- package/dist/components-icons-Pencil.js +5 -0
- package/dist/components-icons-Pencil.js.map +1 -0
- package/dist/components-icons-Phone.cjs +2 -0
- package/dist/components-icons-Phone.cjs.map +1 -0
- package/dist/components-icons-Phone.js +5 -0
- package/dist/components-icons-Phone.js.map +1 -0
- package/dist/components-icons-Plus.cjs +2 -0
- package/dist/components-icons-Plus.cjs.map +1 -0
- package/dist/components-icons-Plus.js +5 -0
- package/dist/components-icons-Plus.js.map +1 -0
- package/dist/components-icons-PresentationChart.cjs +2 -0
- package/dist/components-icons-PresentationChart.cjs.map +1 -0
- package/dist/components-icons-PresentationChart.js +5 -0
- package/dist/components-icons-PresentationChart.js.map +1 -0
- package/dist/components-icons-SpinnerGap.cjs +2 -0
- package/dist/components-icons-SpinnerGap.cjs.map +1 -0
- package/dist/components-icons-SpinnerGap.js +5 -0
- package/dist/components-icons-SpinnerGap.js.map +1 -0
- package/dist/components-icons-TelegramLogo.cjs +2 -0
- package/dist/components-icons-TelegramLogo.cjs.map +1 -0
- package/dist/components-icons-TelegramLogo.js +5 -0
- package/dist/components-icons-TelegramLogo.js.map +1 -0
- package/dist/components-icons-Trash.cjs +2 -0
- package/dist/components-icons-Trash.cjs.map +1 -0
- package/dist/components-icons-Trash.js +5 -0
- package/dist/components-icons-Trash.js.map +1 -0
- package/dist/components-icons-UserCircleGear.cjs +2 -0
- package/dist/components-icons-UserCircleGear.cjs.map +1 -0
- package/dist/components-icons-UserCircleGear.js +5 -0
- package/dist/components-icons-UserCircleGear.js.map +1 -0
- package/dist/components-icons-Users.cjs +2 -0
- package/dist/components-icons-Users.cjs.map +1 -0
- package/dist/components-icons-Users.js +5 -0
- package/dist/components-icons-Users.js.map +1 -0
- package/dist/components-icons-UsersFour.cjs +2 -0
- package/dist/components-icons-UsersFour.cjs.map +1 -0
- package/dist/components-icons-UsersFour.js +5 -0
- package/dist/components-icons-UsersFour.js.map +1 -0
- package/dist/components-icons-Warning.cjs +2 -0
- package/dist/components-icons-Warning.cjs.map +1 -0
- package/dist/components-icons-Warning.js +5 -0
- package/dist/components-icons-Warning.js.map +1 -0
- package/dist/components-icons-WarningCircle.cjs +2 -0
- package/dist/components-icons-WarningCircle.cjs.map +1 -0
- package/dist/components-icons-WarningCircle.js +5 -0
- package/dist/components-icons-WarningCircle.js.map +1 -0
- package/dist/components-icons-WhatsAppLogoFilled.cjs +2 -0
- package/dist/components-icons-WhatsAppLogoFilled.cjs.map +1 -0
- package/dist/components-icons-WhatsAppLogoFilled.js +5 -0
- package/dist/components-icons-WhatsAppLogoFilled.js.map +1 -0
- package/dist/components-icons-Wrench.cjs +2 -0
- package/dist/components-icons-Wrench.cjs.map +1 -0
- package/dist/components-icons-Wrench.js +5 -0
- package/dist/components-icons-Wrench.js.map +1 -0
- package/dist/components-icons-X.cjs +2 -0
- package/dist/components-icons-X.cjs.map +1 -0
- package/dist/components-icons-X.js +5 -0
- package/dist/components-icons-X.js.map +1 -0
- package/dist/components-icons-XCircle.cjs +2 -0
- package/dist/components-icons-XCircle.cjs.map +1 -0
- package/dist/components-icons-XCircle.js +5 -0
- package/dist/components-icons-XCircle.js.map +1 -0
- package/dist/components-icons-stroke-icon.cjs +2 -0
- package/dist/components-icons-stroke-icon.cjs.map +1 -0
- package/dist/components-icons-stroke-icon.js +39 -0
- package/dist/components-icons-stroke-icon.js.map +1 -0
- package/dist/components-icons.cjs +2 -0
- package/dist/components-icons.cjs.map +1 -0
- package/dist/components-icons.js +97 -0
- package/dist/components-icons.js.map +1 -0
- package/dist/components-input-contact-input-contact.cjs +4 -4
- package/dist/components-input-contact-input-contact.cjs.map +1 -1
- package/dist/components-input-contact-input-contact.js +103 -74
- package/dist/components-input-contact-input-contact.js.map +1 -1
- package/dist/components-input-password-input-password.cjs +1 -1
- package/dist/components-input-password-input-password.cjs.map +1 -1
- package/dist/components-input-password-input-password.js +14 -52
- package/dist/components-input-password-input-password.js.map +1 -1
- package/dist/components-ui-calendar-calendar.cjs +1 -1
- package/dist/components-ui-calendar-calendar.js +4 -3
- package/dist/components-ui-calendar-calendar.js.map +1 -1
- package/dist/components-ui-calendar.cjs +1 -1
- package/dist/components-ui-calendar.js +2 -2
- package/dist/components-ui-checkbox-checkbox.cjs +1 -1
- package/dist/components-ui-checkbox-checkbox.cjs.map +1 -1
- package/dist/components-ui-checkbox-checkbox.js +15 -14
- package/dist/components-ui-checkbox-checkbox.js.map +1 -1
- package/dist/components-ui-combobox-combobox.cjs +1 -1
- package/dist/components-ui-combobox-combobox.cjs.map +1 -1
- package/dist/components-ui-combobox-combobox.js +31 -30
- package/dist/components-ui-combobox-combobox.js.map +1 -1
- package/dist/components-ui-dialog-dialog.cjs +1 -1
- package/dist/components-ui-dialog-dialog.cjs.map +1 -1
- package/dist/components-ui-dialog-dialog.js +26 -25
- package/dist/components-ui-dialog-dialog.js.map +1 -1
- package/dist/components-ui-dropdown-menu-dropdown-menu.cjs +2 -2
- package/dist/components-ui-dropdown-menu-dropdown-menu.cjs.map +1 -1
- package/dist/components-ui-dropdown-menu-dropdown-menu.js +46 -45
- package/dist/components-ui-dropdown-menu-dropdown-menu.js.map +1 -1
- package/dist/components-ui-icon-icon-map.cjs +2 -0
- package/dist/components-ui-icon-icon-map.cjs.map +1 -0
- package/dist/components-ui-icon-icon-map.js +71 -0
- package/dist/components-ui-icon-icon-map.js.map +1 -0
- package/dist/components-ui-icon-icon.cjs +1 -1
- package/dist/components-ui-icon-icon.cjs.map +1 -1
- package/dist/components-ui-icon-icon.js +27 -54
- package/dist/components-ui-icon-icon.js.map +1 -1
- package/dist/components-ui-icon.cjs +1 -1
- package/dist/components-ui-icon.js +3 -1
- package/dist/components-ui-icon.js.map +1 -1
- package/dist/components-ui-pagination-pagination.cjs +2 -2
- package/dist/components-ui-pagination-pagination.cjs.map +1 -1
- package/dist/components-ui-pagination-pagination.js +48 -45
- package/dist/components-ui-pagination-pagination.js.map +1 -1
- package/dist/components-ui-select-calendar-menu-select-calendar-menu.cjs +1 -1
- package/dist/components-ui-select-calendar-menu-select-calendar-menu.cjs.map +1 -1
- package/dist/components-ui-select-calendar-menu-select-calendar-menu.js +4 -3
- package/dist/components-ui-select-calendar-menu-select-calendar-menu.js.map +1 -1
- package/dist/components-ui-select-select.cjs +1 -1
- package/dist/components-ui-select-select.cjs.map +1 -1
- package/dist/components-ui-select-select.js +42 -41
- package/dist/components-ui-select-select.js.map +1 -1
- package/dist/components-ui-sonner-sonner.cjs +1 -1
- package/dist/components-ui-sonner-sonner.cjs.map +1 -1
- package/dist/components-ui-sonner-sonner.js +38 -32
- package/dist/components-ui-sonner-sonner.js.map +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.d.ts +9 -7
- package/dist/index.js +228 -225
- package/dist/index.js.map +1 -1
- package/package.json +33 -16
- package/dist/calendar-B5QCV34E.cjs +0 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"components-data-table-data-table-row-actions-column.cjs","sources":["../src/components/data-table/data-table-row-actions-column.tsx"],"sourcesContent":["import type { ColumnDef, Row } from \"@tanstack/react-table\";\nimport type { IconName } from \"phosphor-strokes-icons/by-name\";\nimport type { ReactNode } from \"react\";\n\nimport { Button } from \"@/components/ui/button\";\nimport {\n ConfigurableDropdownMenu,\n type DropdownMenuConfigNode,\n} from \"@/components/ui/dropdown-menu\";\nimport { Icon } from \"@/components/ui/icon\";\nimport { cn } from \"@/lib/utils\";\n\nimport { createDataTableActionsColumn } from \"./data-table-actions-column\";\n\ntype DataTableRowActionContext<TData> = {\n row: Row<TData>;\n data: TData;\n};\n\ntype DataTableRowActionBase = {\n hidden?: boolean;\n id?: string;\n};\n\ntype DataTableRowActionLabel = DataTableRowActionBase & {\n label: string;\n type: \"label\";\n};\n\ntype DataTableRowActionSeparator = DataTableRowActionBase & {\n type: \"separator\";\n};\n\ntype DataTableRowActionItem<TData> = DataTableRowActionBase & {\n type?: \"item\";\n label: string;\n icon?: ReactNode;\n iconType?: IconName;\n shortcut?: string;\n disabled?: boolean;\n readOnly?: boolean;\n alert?: boolean;\n children?: DataTableRowActionNode<TData>[];\n onSelect?: (ctx: DataTableRowActionContext<TData>) => void;\n};\n\ntype DataTableRowActionNode<TData> =\n | DataTableRowActionItem<TData>\n | DataTableRowActionLabel\n | DataTableRowActionSeparator;\n\ntype DataTableRowActionsColumnOptions<TData> = {\n id?: string;\n header?: ColumnDef<TData>[\"header\"];\n align?: \"start\" | \"center\" | \"end\";\n editingRowId?: string | null;\n trigger?: (ctx: DataTableRowActionContext<TData>) => ReactNode;\n actions?:\n | DataTableRowActionNode<TData>[]\n | ((ctx: DataTableRowActionContext<TData>) => DataTableRowActionNode<TData>[]);\n onStartEdit?: (ctx: DataTableRowActionContext<TData>) => void;\n onSaveEdit?: (ctx: DataTableRowActionContext<TData>) => void;\n onCancelEdit?: (ctx: DataTableRowActionContext<TData>) => void;\n onDelete?: (ctx: DataTableRowActionContext<TData>) => void;\n includeDefaultActions?: boolean;\n labels?: {\n cancelAriaLabel?: string;\n delete?: string;\n edit?: string;\n empty?: string;\n saveAriaLabel?: string;\n };\n};\n\nfunction mapRowActionNode<TData>(\n item: DataTableRowActionNode<TData>,\n ctx: DataTableRowActionContext<TData>,\n): DropdownMenuConfigNode | null {\n if (item.hidden) {\n return null;\n }\n\n if (item.type === \"separator\") {\n return {\n id: item.id,\n type: \"separator\",\n };\n }\n\n if (item.type === \"label\") {\n return {\n id: item.id,\n type: \"label\",\n label: item.label,\n };\n }\n\n const children = item.children\n ?.map((child) => mapRowActionNode(child, ctx))\n .filter((child): child is DropdownMenuConfigNode => child !== null);\n\n return {\n id: item.id,\n type: \"item\",\n label: item.label,\n disabled: item.disabled,\n readOnly: item.readOnly,\n alert: item.alert,\n icon: item.icon,\n iconType: item.iconType,\n shortcut: item.shortcut,\n children,\n onSelect: item.onSelect ? () => item.onSelect?.(ctx) : undefined,\n };\n}\n\nexport function createDataTableRowActionsColumn<TData>(\n options: DataTableRowActionsColumnOptions<TData> = {},\n): ColumnDef<TData> {\n const {\n id = \"actions\",\n header,\n align = \"end\",\n editingRowId,\n trigger,\n actions,\n onStartEdit,\n onSaveEdit,\n onCancelEdit,\n onDelete,\n labels,\n includeDefaultActions = true,\n } = options;\n\n return createDataTableActionsColumn<TData>({\n id,\n header,\n renderCell: ({ row, data }) => {\n const ctx = { row, data };\n const isEditingRow = editingRowId === row.id;\n\n if (isEditingRow && (onSaveEdit || onCancelEdit)) {\n return (\n <div\n className=\"flex flex-col items-center gap-6\"\n onClick={(event) => event.stopPropagation()}\n onKeyDown={(event) => event.stopPropagation()}\n role=\"presentation\"\n >\n {onSaveEdit ? (\n <Button\n type=\"button\"\n variant=\"circleGhost\"\n size=\"icon-md\"\n aria-label={labels?.saveAriaLabel ?? \"Сохранить изменения\"}\n onClick={() => onSaveEdit(ctx)}\n >\n <Icon\n type=\"check-circle\"\n className=\"text-success-text\"\n aria-hidden\n />\n </Button>\n ) : null}\n {onCancelEdit ? (\n <Button\n type=\"button\"\n variant=\"circleGhost\"\n size=\"icon-md\"\n aria-label={labels?.cancelAriaLabel ?? \"Отменить редактирование\"}\n onClick={() => onCancelEdit(ctx)}\n >\n <Icon\n type=\"x-circle\"\n className=\"text-error-text\"\n aria-hidden\n />\n </Button>\n ) : null}\n </div>\n );\n }\n\n const resolvedActions =\n typeof actions === \"function\" ? actions(ctx) : (actions ?? []);\n const defaultActions: DataTableRowActionNode<TData>[] = [\n ...(onStartEdit\n ? [\n {\n id: `${id}-edit-${row.id}`,\n label: labels?.edit ?? \"Редактировать\",\n onSelect: onStartEdit,\n iconType: \"pencil-simple\",\n } satisfies DataTableRowActionItem<TData>,\n ]\n : []),\n ...(onDelete\n ? [\n { type: \"separator\" } satisfies DataTableRowActionSeparator,\n {\n id: `${id}-delete-${row.id}`,\n label: labels?.delete ?? \"Удалить\",\n iconType: \"trash\",\n alert: true,\n onSelect: onDelete,\n } satisfies DataTableRowActionItem<TData>,\n ]\n : []),\n ];\n\n const menuItems = [\n ...resolvedActions,\n ...(includeDefaultActions ? defaultActions : []),\n ]\n .map((item) => mapRowActionNode(item, ctx))\n .filter((item): item is DropdownMenuConfigNode => item !== null);\n\n const resolvedTrigger = trigger ? (\n trigger(ctx)\n ) : (\n <Button\n type=\"button\"\n variant=\"circleGhost\"\n size=\"icon-xs\"\n aria-label=\"Открыть действия строки\"\n >\n <Icon\n type=\"dots-three\"\n aria-hidden\n />\n </Button>\n );\n\n return (\n <div\n className={cn(\"flex justify-end\")}\n onClick={(event) => event.stopPropagation()}\n onKeyDown={(event) => event.stopPropagation()}\n role=\"presentation\"\n >\n <ConfigurableDropdownMenu\n trigger={resolvedTrigger}\n items={\n menuItems.length > 0\n ? menuItems\n : [\n {\n id: `${id}-empty-${row.id}`,\n type: \"item\",\n label: labels?.empty ?? \"Нет действий\",\n readOnly: true,\n },\n ]\n }\n contentProps={{ align }}\n />\n </div>\n );\n },\n });\n}\n\nexport type {\n DataTableRowActionContext,\n DataTableRowActionItem,\n DataTableRowActionLabel,\n DataTableRowActionNode,\n DataTableRowActionSeparator,\n DataTableRowActionsColumnOptions,\n};\n"],"names":["mapRowActionNode","item","ctx","children","child","createDataTableRowActionsColumn","options","id","header","align","editingRowId","trigger","actions","onStartEdit","onSaveEdit","onCancelEdit","onDelete","labels","includeDefaultActions","createDataTableActionsColumn","row","data","jsxs","event","jsx","Button","Icon","resolvedActions","defaultActions","menuItems","resolvedTrigger","cn","ConfigurableDropdownMenu"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"components-data-table-data-table-row-actions-column.cjs","sources":["../src/components/data-table/data-table-row-actions-column.tsx"],"sourcesContent":["import type { ColumnDef, Row } from \"@tanstack/react-table\";\nimport type { ReactNode } from \"react\";\n\nimport { Button } from \"@/components/ui/button\";\nimport {\n ConfigurableDropdownMenu,\n type DropdownMenuConfigNode,\n} from \"@/components/ui/dropdown-menu\";\nimport { Icon } from \"@/components/ui/icon\";\nimport type { IconType } from \"@/components/ui/icon\";\nimport { cn } from \"@/lib/utils\";\n\nimport { createDataTableActionsColumn } from \"./data-table-actions-column\";\n\ntype DataTableRowActionContext<TData> = {\n row: Row<TData>;\n data: TData;\n};\n\ntype DataTableRowActionBase = {\n hidden?: boolean;\n id?: string;\n};\n\ntype DataTableRowActionLabel = DataTableRowActionBase & {\n label: string;\n type: \"label\";\n};\n\ntype DataTableRowActionSeparator = DataTableRowActionBase & {\n type: \"separator\";\n};\n\ntype DataTableRowActionItem<TData> = DataTableRowActionBase & {\n type?: \"item\";\n label: string;\n icon?: ReactNode;\n iconType?: IconType;\n shortcut?: string;\n disabled?: boolean;\n readOnly?: boolean;\n alert?: boolean;\n children?: DataTableRowActionNode<TData>[];\n onSelect?: (ctx: DataTableRowActionContext<TData>) => void;\n};\n\ntype DataTableRowActionNode<TData> =\n | DataTableRowActionItem<TData>\n | DataTableRowActionLabel\n | DataTableRowActionSeparator;\n\ntype DataTableRowActionsColumnOptions<TData> = {\n id?: string;\n header?: ColumnDef<TData>[\"header\"];\n align?: \"start\" | \"center\" | \"end\";\n editingRowId?: string | null;\n trigger?: (ctx: DataTableRowActionContext<TData>) => ReactNode;\n actions?:\n | DataTableRowActionNode<TData>[]\n | ((ctx: DataTableRowActionContext<TData>) => DataTableRowActionNode<TData>[]);\n onStartEdit?: (ctx: DataTableRowActionContext<TData>) => void;\n onSaveEdit?: (ctx: DataTableRowActionContext<TData>) => void;\n onCancelEdit?: (ctx: DataTableRowActionContext<TData>) => void;\n onDelete?: (ctx: DataTableRowActionContext<TData>) => void;\n includeDefaultActions?: boolean;\n labels?: {\n cancelAriaLabel?: string;\n delete?: string;\n edit?: string;\n empty?: string;\n saveAriaLabel?: string;\n };\n};\n\nfunction mapRowActionNode<TData>(\n item: DataTableRowActionNode<TData>,\n ctx: DataTableRowActionContext<TData>,\n): DropdownMenuConfigNode | null {\n if (item.hidden) {\n return null;\n }\n\n if (item.type === \"separator\") {\n return {\n id: item.id,\n type: \"separator\",\n };\n }\n\n if (item.type === \"label\") {\n return {\n id: item.id,\n type: \"label\",\n label: item.label,\n };\n }\n\n const children = item.children\n ?.map((child) => mapRowActionNode(child, ctx))\n .filter((child): child is DropdownMenuConfigNode => child !== null);\n\n return {\n id: item.id,\n type: \"item\",\n label: item.label,\n disabled: item.disabled,\n readOnly: item.readOnly,\n alert: item.alert,\n icon: item.icon,\n iconType: item.iconType,\n shortcut: item.shortcut,\n children,\n onSelect: item.onSelect ? () => item.onSelect?.(ctx) : undefined,\n };\n}\n\nexport function createDataTableRowActionsColumn<TData>(\n options: DataTableRowActionsColumnOptions<TData> = {},\n): ColumnDef<TData> {\n const {\n id = \"actions\",\n header,\n align = \"end\",\n editingRowId,\n trigger,\n actions,\n onStartEdit,\n onSaveEdit,\n onCancelEdit,\n onDelete,\n labels,\n includeDefaultActions = true,\n } = options;\n\n return createDataTableActionsColumn<TData>({\n id,\n header,\n renderCell: ({ row, data }) => {\n const ctx = { row, data };\n const isEditingRow = editingRowId === row.id;\n\n if (isEditingRow && (onSaveEdit || onCancelEdit)) {\n return (\n <div\n className=\"flex flex-col items-center gap-6\"\n onClick={(event) => event.stopPropagation()}\n onKeyDown={(event) => event.stopPropagation()}\n role=\"presentation\"\n >\n {onSaveEdit ? (\n <Button\n type=\"button\"\n variant=\"circleGhost\"\n size=\"icon-md\"\n aria-label={labels?.saveAriaLabel ?? \"Сохранить изменения\"}\n onClick={() => onSaveEdit(ctx)}\n >\n <Icon\n type=\"check-circle\"\n className=\"text-success-text\"\n aria-hidden\n />\n </Button>\n ) : null}\n {onCancelEdit ? (\n <Button\n type=\"button\"\n variant=\"circleGhost\"\n size=\"icon-md\"\n aria-label={labels?.cancelAriaLabel ?? \"Отменить редактирование\"}\n onClick={() => onCancelEdit(ctx)}\n >\n <Icon\n type=\"x-circle\"\n className=\"text-error-text\"\n aria-hidden\n />\n </Button>\n ) : null}\n </div>\n );\n }\n\n const resolvedActions =\n typeof actions === \"function\" ? actions(ctx) : (actions ?? []);\n const defaultActions: DataTableRowActionNode<TData>[] = [\n ...(onStartEdit\n ? [\n {\n id: `${id}-edit-${row.id}`,\n label: labels?.edit ?? \"Редактировать\",\n onSelect: onStartEdit,\n iconType: \"pencil-simple\",\n } satisfies DataTableRowActionItem<TData>,\n ]\n : []),\n ...(onDelete\n ? [\n { type: \"separator\" } satisfies DataTableRowActionSeparator,\n {\n id: `${id}-delete-${row.id}`,\n label: labels?.delete ?? \"Удалить\",\n iconType: \"trash\",\n alert: true,\n onSelect: onDelete,\n } satisfies DataTableRowActionItem<TData>,\n ]\n : []),\n ];\n\n const menuItems = [\n ...resolvedActions,\n ...(includeDefaultActions ? defaultActions : []),\n ]\n .map((item) => mapRowActionNode(item, ctx))\n .filter((item): item is DropdownMenuConfigNode => item !== null);\n\n const resolvedTrigger = trigger ? (\n trigger(ctx)\n ) : (\n <Button\n type=\"button\"\n variant=\"circleGhost\"\n size=\"icon-xs\"\n aria-label=\"Открыть действия строки\"\n >\n <Icon\n type=\"dots-three\"\n aria-hidden\n />\n </Button>\n );\n\n return (\n <div\n className={cn(\"flex justify-end\")}\n onClick={(event) => event.stopPropagation()}\n onKeyDown={(event) => event.stopPropagation()}\n role=\"presentation\"\n >\n <ConfigurableDropdownMenu\n trigger={resolvedTrigger}\n items={\n menuItems.length > 0\n ? menuItems\n : [\n {\n id: `${id}-empty-${row.id}`,\n type: \"item\",\n label: labels?.empty ?? \"Нет действий\",\n readOnly: true,\n },\n ]\n }\n contentProps={{ align }}\n />\n </div>\n );\n },\n });\n}\n\nexport type {\n DataTableRowActionContext,\n DataTableRowActionItem,\n DataTableRowActionLabel,\n DataTableRowActionNode,\n DataTableRowActionSeparator,\n DataTableRowActionsColumnOptions,\n};\n"],"names":["mapRowActionNode","item","ctx","children","child","createDataTableRowActionsColumn","options","id","header","align","editingRowId","trigger","actions","onStartEdit","onSaveEdit","onCancelEdit","onDelete","labels","includeDefaultActions","createDataTableActionsColumn","row","data","jsxs","event","jsx","Button","Icon","resolvedActions","defaultActions","menuItems","resolvedTrigger","cn","ConfigurableDropdownMenu"],"mappings":"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"}
|
|
@@ -3,9 +3,10 @@ import { Button as u } from "./components-ui-button-button.js";
|
|
|
3
3
|
import "./components-ui-button-button.styles.js";
|
|
4
4
|
import { ConfigurableDropdownMenu as $ } from "./components-ui-dropdown-menu-dropdown-menu.js";
|
|
5
5
|
import { Icon as y } from "./components-ui-icon-icon.js";
|
|
6
|
+
import "phosphor-strokes-icons/icons";
|
|
6
7
|
import { cn as k } from "./lib-utils.js";
|
|
7
8
|
import { createDataTableActionsColumn as E } from "./components-data-table-data-table-actions-column.js";
|
|
8
|
-
function
|
|
9
|
+
function g(e, o) {
|
|
9
10
|
if (e.hidden)
|
|
10
11
|
return null;
|
|
11
12
|
if (e.type === "separator")
|
|
@@ -19,7 +20,7 @@ function m(e, o) {
|
|
|
19
20
|
type: "label",
|
|
20
21
|
label: e.label
|
|
21
22
|
};
|
|
22
|
-
const c = e.children?.map((i) =>
|
|
23
|
+
const c = e.children?.map((i) => g(i, o)).filter((i) => i !== null);
|
|
23
24
|
return {
|
|
24
25
|
id: e.id,
|
|
25
26
|
type: "item",
|
|
@@ -34,7 +35,7 @@ function m(e, o) {
|
|
|
34
35
|
onSelect: e.onSelect ? () => e.onSelect?.(o) : void 0
|
|
35
36
|
};
|
|
36
37
|
}
|
|
37
|
-
function
|
|
38
|
+
function K(e = {}) {
|
|
38
39
|
const {
|
|
39
40
|
id: o = "actions",
|
|
40
41
|
header: c,
|
|
@@ -46,15 +47,15 @@ function O(e = {}) {
|
|
|
46
47
|
onSaveEdit: s,
|
|
47
48
|
onCancelEdit: p,
|
|
48
49
|
onDelete: h,
|
|
49
|
-
labels:
|
|
50
|
+
labels: r,
|
|
50
51
|
includeDefaultActions: v = !0
|
|
51
52
|
} = e;
|
|
52
53
|
return E({
|
|
53
54
|
id: o,
|
|
54
55
|
header: c,
|
|
55
|
-
renderCell: ({ row:
|
|
56
|
-
const a = { row:
|
|
57
|
-
if (x ===
|
|
56
|
+
renderCell: ({ row: l, data: C }) => {
|
|
57
|
+
const a = { row: l, data: C };
|
|
58
|
+
if (x === l.id && (s || p))
|
|
58
59
|
return /* @__PURE__ */ T(
|
|
59
60
|
"div",
|
|
60
61
|
{
|
|
@@ -69,7 +70,7 @@ function O(e = {}) {
|
|
|
69
70
|
type: "button",
|
|
70
71
|
variant: "circleGhost",
|
|
71
72
|
size: "icon-md",
|
|
72
|
-
"aria-label":
|
|
73
|
+
"aria-label": r?.saveAriaLabel ?? "Сохранить изменения",
|
|
73
74
|
onClick: () => s(a),
|
|
74
75
|
children: /* @__PURE__ */ n(
|
|
75
76
|
y,
|
|
@@ -87,7 +88,7 @@ function O(e = {}) {
|
|
|
87
88
|
type: "button",
|
|
88
89
|
variant: "circleGhost",
|
|
89
90
|
size: "icon-md",
|
|
90
|
-
"aria-label":
|
|
91
|
+
"aria-label": r?.cancelAriaLabel ?? "Отменить редактирование",
|
|
91
92
|
onClick: () => p(a),
|
|
92
93
|
children: /* @__PURE__ */ n(
|
|
93
94
|
y,
|
|
@@ -105,8 +106,8 @@ function O(e = {}) {
|
|
|
105
106
|
const A = typeof d == "function" ? d(a) : d ?? [], D = [
|
|
106
107
|
...f ? [
|
|
107
108
|
{
|
|
108
|
-
id: `${o}-edit-${
|
|
109
|
-
label:
|
|
109
|
+
id: `${o}-edit-${l.id}`,
|
|
110
|
+
label: r?.edit ?? "Редактировать",
|
|
110
111
|
onSelect: f,
|
|
111
112
|
iconType: "pencil-simple"
|
|
112
113
|
}
|
|
@@ -114,17 +115,17 @@ function O(e = {}) {
|
|
|
114
115
|
...h ? [
|
|
115
116
|
{ type: "separator" },
|
|
116
117
|
{
|
|
117
|
-
id: `${o}-delete-${
|
|
118
|
-
label:
|
|
118
|
+
id: `${o}-delete-${l.id}`,
|
|
119
|
+
label: r?.delete ?? "Удалить",
|
|
119
120
|
iconType: "trash",
|
|
120
121
|
alert: !0,
|
|
121
122
|
onSelect: h
|
|
122
123
|
}
|
|
123
124
|
] : []
|
|
124
|
-
],
|
|
125
|
+
], m = [
|
|
125
126
|
...A,
|
|
126
127
|
...v ? D : []
|
|
127
|
-
].map((t) =>
|
|
128
|
+
].map((t) => g(t, a)).filter((t) => t !== null), S = b ? b(a) : /* @__PURE__ */ n(
|
|
128
129
|
u,
|
|
129
130
|
{
|
|
130
131
|
type: "button",
|
|
@@ -151,11 +152,11 @@ function O(e = {}) {
|
|
|
151
152
|
$,
|
|
152
153
|
{
|
|
153
154
|
trigger: S,
|
|
154
|
-
items:
|
|
155
|
+
items: m.length > 0 ? m : [
|
|
155
156
|
{
|
|
156
|
-
id: `${o}-empty-${
|
|
157
|
+
id: `${o}-empty-${l.id}`,
|
|
157
158
|
type: "item",
|
|
158
|
-
label:
|
|
159
|
+
label: r?.empty ?? "Нет действий",
|
|
159
160
|
readOnly: !0
|
|
160
161
|
}
|
|
161
162
|
],
|
|
@@ -168,6 +169,6 @@ function O(e = {}) {
|
|
|
168
169
|
});
|
|
169
170
|
}
|
|
170
171
|
export {
|
|
171
|
-
|
|
172
|
+
K as createDataTableRowActionsColumn
|
|
172
173
|
};
|
|
173
174
|
//# sourceMappingURL=components-data-table-data-table-row-actions-column.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"components-data-table-data-table-row-actions-column.js","sources":["../src/components/data-table/data-table-row-actions-column.tsx"],"sourcesContent":["import type { ColumnDef, Row } from \"@tanstack/react-table\";\nimport type { IconName } from \"phosphor-strokes-icons/by-name\";\nimport type { ReactNode } from \"react\";\n\nimport { Button } from \"@/components/ui/button\";\nimport {\n ConfigurableDropdownMenu,\n type DropdownMenuConfigNode,\n} from \"@/components/ui/dropdown-menu\";\nimport { Icon } from \"@/components/ui/icon\";\nimport { cn } from \"@/lib/utils\";\n\nimport { createDataTableActionsColumn } from \"./data-table-actions-column\";\n\ntype DataTableRowActionContext<TData> = {\n row: Row<TData>;\n data: TData;\n};\n\ntype DataTableRowActionBase = {\n hidden?: boolean;\n id?: string;\n};\n\ntype DataTableRowActionLabel = DataTableRowActionBase & {\n label: string;\n type: \"label\";\n};\n\ntype DataTableRowActionSeparator = DataTableRowActionBase & {\n type: \"separator\";\n};\n\ntype DataTableRowActionItem<TData> = DataTableRowActionBase & {\n type?: \"item\";\n label: string;\n icon?: ReactNode;\n iconType?: IconName;\n shortcut?: string;\n disabled?: boolean;\n readOnly?: boolean;\n alert?: boolean;\n children?: DataTableRowActionNode<TData>[];\n onSelect?: (ctx: DataTableRowActionContext<TData>) => void;\n};\n\ntype DataTableRowActionNode<TData> =\n | DataTableRowActionItem<TData>\n | DataTableRowActionLabel\n | DataTableRowActionSeparator;\n\ntype DataTableRowActionsColumnOptions<TData> = {\n id?: string;\n header?: ColumnDef<TData>[\"header\"];\n align?: \"start\" | \"center\" | \"end\";\n editingRowId?: string | null;\n trigger?: (ctx: DataTableRowActionContext<TData>) => ReactNode;\n actions?:\n | DataTableRowActionNode<TData>[]\n | ((ctx: DataTableRowActionContext<TData>) => DataTableRowActionNode<TData>[]);\n onStartEdit?: (ctx: DataTableRowActionContext<TData>) => void;\n onSaveEdit?: (ctx: DataTableRowActionContext<TData>) => void;\n onCancelEdit?: (ctx: DataTableRowActionContext<TData>) => void;\n onDelete?: (ctx: DataTableRowActionContext<TData>) => void;\n includeDefaultActions?: boolean;\n labels?: {\n cancelAriaLabel?: string;\n delete?: string;\n edit?: string;\n empty?: string;\n saveAriaLabel?: string;\n };\n};\n\nfunction mapRowActionNode<TData>(\n item: DataTableRowActionNode<TData>,\n ctx: DataTableRowActionContext<TData>,\n): DropdownMenuConfigNode | null {\n if (item.hidden) {\n return null;\n }\n\n if (item.type === \"separator\") {\n return {\n id: item.id,\n type: \"separator\",\n };\n }\n\n if (item.type === \"label\") {\n return {\n id: item.id,\n type: \"label\",\n label: item.label,\n };\n }\n\n const children = item.children\n ?.map((child) => mapRowActionNode(child, ctx))\n .filter((child): child is DropdownMenuConfigNode => child !== null);\n\n return {\n id: item.id,\n type: \"item\",\n label: item.label,\n disabled: item.disabled,\n readOnly: item.readOnly,\n alert: item.alert,\n icon: item.icon,\n iconType: item.iconType,\n shortcut: item.shortcut,\n children,\n onSelect: item.onSelect ? () => item.onSelect?.(ctx) : undefined,\n };\n}\n\nexport function createDataTableRowActionsColumn<TData>(\n options: DataTableRowActionsColumnOptions<TData> = {},\n): ColumnDef<TData> {\n const {\n id = \"actions\",\n header,\n align = \"end\",\n editingRowId,\n trigger,\n actions,\n onStartEdit,\n onSaveEdit,\n onCancelEdit,\n onDelete,\n labels,\n includeDefaultActions = true,\n } = options;\n\n return createDataTableActionsColumn<TData>({\n id,\n header,\n renderCell: ({ row, data }) => {\n const ctx = { row, data };\n const isEditingRow = editingRowId === row.id;\n\n if (isEditingRow && (onSaveEdit || onCancelEdit)) {\n return (\n <div\n className=\"flex flex-col items-center gap-6\"\n onClick={(event) => event.stopPropagation()}\n onKeyDown={(event) => event.stopPropagation()}\n role=\"presentation\"\n >\n {onSaveEdit ? (\n <Button\n type=\"button\"\n variant=\"circleGhost\"\n size=\"icon-md\"\n aria-label={labels?.saveAriaLabel ?? \"Сохранить изменения\"}\n onClick={() => onSaveEdit(ctx)}\n >\n <Icon\n type=\"check-circle\"\n className=\"text-success-text\"\n aria-hidden\n />\n </Button>\n ) : null}\n {onCancelEdit ? (\n <Button\n type=\"button\"\n variant=\"circleGhost\"\n size=\"icon-md\"\n aria-label={labels?.cancelAriaLabel ?? \"Отменить редактирование\"}\n onClick={() => onCancelEdit(ctx)}\n >\n <Icon\n type=\"x-circle\"\n className=\"text-error-text\"\n aria-hidden\n />\n </Button>\n ) : null}\n </div>\n );\n }\n\n const resolvedActions =\n typeof actions === \"function\" ? actions(ctx) : (actions ?? []);\n const defaultActions: DataTableRowActionNode<TData>[] = [\n ...(onStartEdit\n ? [\n {\n id: `${id}-edit-${row.id}`,\n label: labels?.edit ?? \"Редактировать\",\n onSelect: onStartEdit,\n iconType: \"pencil-simple\",\n } satisfies DataTableRowActionItem<TData>,\n ]\n : []),\n ...(onDelete\n ? [\n { type: \"separator\" } satisfies DataTableRowActionSeparator,\n {\n id: `${id}-delete-${row.id}`,\n label: labels?.delete ?? \"Удалить\",\n iconType: \"trash\",\n alert: true,\n onSelect: onDelete,\n } satisfies DataTableRowActionItem<TData>,\n ]\n : []),\n ];\n\n const menuItems = [\n ...resolvedActions,\n ...(includeDefaultActions ? defaultActions : []),\n ]\n .map((item) => mapRowActionNode(item, ctx))\n .filter((item): item is DropdownMenuConfigNode => item !== null);\n\n const resolvedTrigger = trigger ? (\n trigger(ctx)\n ) : (\n <Button\n type=\"button\"\n variant=\"circleGhost\"\n size=\"icon-xs\"\n aria-label=\"Открыть действия строки\"\n >\n <Icon\n type=\"dots-three\"\n aria-hidden\n />\n </Button>\n );\n\n return (\n <div\n className={cn(\"flex justify-end\")}\n onClick={(event) => event.stopPropagation()}\n onKeyDown={(event) => event.stopPropagation()}\n role=\"presentation\"\n >\n <ConfigurableDropdownMenu\n trigger={resolvedTrigger}\n items={\n menuItems.length > 0\n ? menuItems\n : [\n {\n id: `${id}-empty-${row.id}`,\n type: \"item\",\n label: labels?.empty ?? \"Нет действий\",\n readOnly: true,\n },\n ]\n }\n contentProps={{ align }}\n />\n </div>\n );\n },\n });\n}\n\nexport type {\n DataTableRowActionContext,\n DataTableRowActionItem,\n DataTableRowActionLabel,\n DataTableRowActionNode,\n DataTableRowActionSeparator,\n DataTableRowActionsColumnOptions,\n};\n"],"names":["mapRowActionNode","item","ctx","children","child","createDataTableRowActionsColumn","options","id","header","align","editingRowId","trigger","actions","onStartEdit","onSaveEdit","onCancelEdit","onDelete","labels","includeDefaultActions","createDataTableActionsColumn","row","data","jsxs","event","jsx","Button","Icon","resolvedActions","defaultActions","menuItems","resolvedTrigger","cn","ConfigurableDropdownMenu"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"components-data-table-data-table-row-actions-column.js","sources":["../src/components/data-table/data-table-row-actions-column.tsx"],"sourcesContent":["import type { ColumnDef, Row } from \"@tanstack/react-table\";\nimport type { ReactNode } from \"react\";\n\nimport { Button } from \"@/components/ui/button\";\nimport {\n ConfigurableDropdownMenu,\n type DropdownMenuConfigNode,\n} from \"@/components/ui/dropdown-menu\";\nimport { Icon } from \"@/components/ui/icon\";\nimport type { IconType } from \"@/components/ui/icon\";\nimport { cn } from \"@/lib/utils\";\n\nimport { createDataTableActionsColumn } from \"./data-table-actions-column\";\n\ntype DataTableRowActionContext<TData> = {\n row: Row<TData>;\n data: TData;\n};\n\ntype DataTableRowActionBase = {\n hidden?: boolean;\n id?: string;\n};\n\ntype DataTableRowActionLabel = DataTableRowActionBase & {\n label: string;\n type: \"label\";\n};\n\ntype DataTableRowActionSeparator = DataTableRowActionBase & {\n type: \"separator\";\n};\n\ntype DataTableRowActionItem<TData> = DataTableRowActionBase & {\n type?: \"item\";\n label: string;\n icon?: ReactNode;\n iconType?: IconType;\n shortcut?: string;\n disabled?: boolean;\n readOnly?: boolean;\n alert?: boolean;\n children?: DataTableRowActionNode<TData>[];\n onSelect?: (ctx: DataTableRowActionContext<TData>) => void;\n};\n\ntype DataTableRowActionNode<TData> =\n | DataTableRowActionItem<TData>\n | DataTableRowActionLabel\n | DataTableRowActionSeparator;\n\ntype DataTableRowActionsColumnOptions<TData> = {\n id?: string;\n header?: ColumnDef<TData>[\"header\"];\n align?: \"start\" | \"center\" | \"end\";\n editingRowId?: string | null;\n trigger?: (ctx: DataTableRowActionContext<TData>) => ReactNode;\n actions?:\n | DataTableRowActionNode<TData>[]\n | ((ctx: DataTableRowActionContext<TData>) => DataTableRowActionNode<TData>[]);\n onStartEdit?: (ctx: DataTableRowActionContext<TData>) => void;\n onSaveEdit?: (ctx: DataTableRowActionContext<TData>) => void;\n onCancelEdit?: (ctx: DataTableRowActionContext<TData>) => void;\n onDelete?: (ctx: DataTableRowActionContext<TData>) => void;\n includeDefaultActions?: boolean;\n labels?: {\n cancelAriaLabel?: string;\n delete?: string;\n edit?: string;\n empty?: string;\n saveAriaLabel?: string;\n };\n};\n\nfunction mapRowActionNode<TData>(\n item: DataTableRowActionNode<TData>,\n ctx: DataTableRowActionContext<TData>,\n): DropdownMenuConfigNode | null {\n if (item.hidden) {\n return null;\n }\n\n if (item.type === \"separator\") {\n return {\n id: item.id,\n type: \"separator\",\n };\n }\n\n if (item.type === \"label\") {\n return {\n id: item.id,\n type: \"label\",\n label: item.label,\n };\n }\n\n const children = item.children\n ?.map((child) => mapRowActionNode(child, ctx))\n .filter((child): child is DropdownMenuConfigNode => child !== null);\n\n return {\n id: item.id,\n type: \"item\",\n label: item.label,\n disabled: item.disabled,\n readOnly: item.readOnly,\n alert: item.alert,\n icon: item.icon,\n iconType: item.iconType,\n shortcut: item.shortcut,\n children,\n onSelect: item.onSelect ? () => item.onSelect?.(ctx) : undefined,\n };\n}\n\nexport function createDataTableRowActionsColumn<TData>(\n options: DataTableRowActionsColumnOptions<TData> = {},\n): ColumnDef<TData> {\n const {\n id = \"actions\",\n header,\n align = \"end\",\n editingRowId,\n trigger,\n actions,\n onStartEdit,\n onSaveEdit,\n onCancelEdit,\n onDelete,\n labels,\n includeDefaultActions = true,\n } = options;\n\n return createDataTableActionsColumn<TData>({\n id,\n header,\n renderCell: ({ row, data }) => {\n const ctx = { row, data };\n const isEditingRow = editingRowId === row.id;\n\n if (isEditingRow && (onSaveEdit || onCancelEdit)) {\n return (\n <div\n className=\"flex flex-col items-center gap-6\"\n onClick={(event) => event.stopPropagation()}\n onKeyDown={(event) => event.stopPropagation()}\n role=\"presentation\"\n >\n {onSaveEdit ? (\n <Button\n type=\"button\"\n variant=\"circleGhost\"\n size=\"icon-md\"\n aria-label={labels?.saveAriaLabel ?? \"Сохранить изменения\"}\n onClick={() => onSaveEdit(ctx)}\n >\n <Icon\n type=\"check-circle\"\n className=\"text-success-text\"\n aria-hidden\n />\n </Button>\n ) : null}\n {onCancelEdit ? (\n <Button\n type=\"button\"\n variant=\"circleGhost\"\n size=\"icon-md\"\n aria-label={labels?.cancelAriaLabel ?? \"Отменить редактирование\"}\n onClick={() => onCancelEdit(ctx)}\n >\n <Icon\n type=\"x-circle\"\n className=\"text-error-text\"\n aria-hidden\n />\n </Button>\n ) : null}\n </div>\n );\n }\n\n const resolvedActions =\n typeof actions === \"function\" ? actions(ctx) : (actions ?? []);\n const defaultActions: DataTableRowActionNode<TData>[] = [\n ...(onStartEdit\n ? [\n {\n id: `${id}-edit-${row.id}`,\n label: labels?.edit ?? \"Редактировать\",\n onSelect: onStartEdit,\n iconType: \"pencil-simple\",\n } satisfies DataTableRowActionItem<TData>,\n ]\n : []),\n ...(onDelete\n ? [\n { type: \"separator\" } satisfies DataTableRowActionSeparator,\n {\n id: `${id}-delete-${row.id}`,\n label: labels?.delete ?? \"Удалить\",\n iconType: \"trash\",\n alert: true,\n onSelect: onDelete,\n } satisfies DataTableRowActionItem<TData>,\n ]\n : []),\n ];\n\n const menuItems = [\n ...resolvedActions,\n ...(includeDefaultActions ? defaultActions : []),\n ]\n .map((item) => mapRowActionNode(item, ctx))\n .filter((item): item is DropdownMenuConfigNode => item !== null);\n\n const resolvedTrigger = trigger ? (\n trigger(ctx)\n ) : (\n <Button\n type=\"button\"\n variant=\"circleGhost\"\n size=\"icon-xs\"\n aria-label=\"Открыть действия строки\"\n >\n <Icon\n type=\"dots-three\"\n aria-hidden\n />\n </Button>\n );\n\n return (\n <div\n className={cn(\"flex justify-end\")}\n onClick={(event) => event.stopPropagation()}\n onKeyDown={(event) => event.stopPropagation()}\n role=\"presentation\"\n >\n <ConfigurableDropdownMenu\n trigger={resolvedTrigger}\n items={\n menuItems.length > 0\n ? menuItems\n : [\n {\n id: `${id}-empty-${row.id}`,\n type: \"item\",\n label: labels?.empty ?? \"Нет действий\",\n readOnly: true,\n },\n ]\n }\n contentProps={{ align }}\n />\n </div>\n );\n },\n });\n}\n\nexport type {\n DataTableRowActionContext,\n DataTableRowActionItem,\n DataTableRowActionLabel,\n DataTableRowActionNode,\n DataTableRowActionSeparator,\n DataTableRowActionsColumnOptions,\n};\n"],"names":["mapRowActionNode","item","ctx","children","child","createDataTableRowActionsColumn","options","id","header","align","editingRowId","trigger","actions","onStartEdit","onSaveEdit","onCancelEdit","onDelete","labels","includeDefaultActions","createDataTableActionsColumn","row","data","jsxs","event","jsx","Button","Icon","resolvedActions","defaultActions","menuItems","resolvedTrigger","cn","ConfigurableDropdownMenu"],"mappings":"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"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const s=require("react/jsx-runtime"),p=require("./lib-utils.cjs"),A=require("react"),
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const s=require("react/jsx-runtime"),p=require("./lib-utils.cjs"),A=require("react"),K=require("./index-DJD-8LQA.cjs"),V=require("phosphor-strokes-icons/icons/Plus"),H=require("phosphor-strokes-icons/icons/SpinnerGap"),j=require("./components-icons-stroke-icon.cjs"),J=require("phosphor-strokes-icons/icons/X"),M=require("./components-ui-typography-typography.cjs");require("./components-ui-typography-typography.styles.cjs");const Q=["B","KB","MB","GB","TB"],x=1024,W=5*x*x,Y=5,ee=["all"],te=800,re={image:{"image/*":[".jpg",".jpeg",".png",".webp"]},pdf:{"application/pdf":[".pdf"]},doc:{"application/msword":[".doc"],"application/vnd.openxmlformats-officedocument.wordprocessingml.document":[".docx"]},excel:{"application/vnd.ms-excel":[".xls"],"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":[".xlsx"]},text:{"text/plain":[".txt"]},all:{}},se=e=>{if(!e)return"0 B";const t=Math.floor(Math.log(e)/Math.log(x));return`${(e/Math.pow(x,t)).toFixed(2)} ${Q[t]}`},v=e=>`${e.name}:${e.size}`,oe=e=>e.reduce((t,o)=>({...t,...re[o]}),{}),ne=(e,t)=>{const o=e.filter(n=>n.status==="uploaded"),c=e.filter(n=>n.status==="error"),a=Math.max(0,t-o.length);return[...o,...c.slice(0,a)]},S=(e,t,o)=>({url:URL.createObjectURL(e),name:e.name,size:se(e.size),addedAt:new Date().toISOString(),status:t,error:o}),ce=e=>e==="file-too-large"?"Файл слишком большой":"Неподдерживаемый формат",le=(e,t,o)=>{const c=new Set(o.map(v)),a=new Set(t.map(v));return e.filter(n=>{if(n.status!=="error")return!0;const g=v(n);return!c.has(g)&&!a.has(g)})},ie=e=>{const t=e.name.split(".").pop()?.toLowerCase();return t?["jpg","jpeg","png","webp"].includes(t)?"image":t==="pdf"?"pdf":["doc","docx"].includes(t)?"doc":["xls","xlsx"].includes(t)?"excel":t==="txt"?"text":"other":"other"},ae=({value:e=[],onChange:t,multiple:o=!1,maxFiles:c=Y,disabled:a=!1,className:n,maxSize:g=W,variant:h="grid",accepts:U=ee,icon:q,title:w,text:F,showFiles:L=!0,isErrorText:$=!1})=>{const[b,I]=A.useState(!1),[_,E]=A.useState(null),m=e,y=m.filter(r=>r.status==="uploaded").length,N=(r,l)=>{E(null);const u=Math.max(0,c-y),f=r.slice(0,u),X=r.slice(u),d=[...l.map(i=>S(i.file,"error",ce(i.errors[0]?.code))),...X.map(i=>S(i,"error",`Максимальное количество файлов: ${c}`))];d.length&&E(d[0].error||"Ошибка загрузки"),!(!f.length&&!d.length)&&(I(!0),setTimeout(()=>{const i=f.map(Z=>S(Z,"uploaded")),G=le(m,i,d),T=o?ne([...G,...i,...d],c):[...i,...d].slice(0,1);t?.(T.length?T:[]),I(!1)},te))},{getRootProps:D,getInputProps:B,isDragActive:C}=K.useDropzone({onDrop:N,accept:oe(U),maxSize:g,multiple:o&&c>1,disabled:a||b}),P=r=>()=>{const l=m.filter((u,f)=>f!==r);t?.(l.length?l:[])},R=m.map((r,l)=>({file:r,index:l})).filter(({file:r})=>r.status==="uploaded"),k=y>=c,z=q??V.Plus,O={grid:"grid-cols-2 sm:grid-cols-3 md:grid-cols-4",list:"grid-cols-1",compact:"grid-cols-2 sm:grid-cols-3"};return s.jsxs("div",{className:p.cn("w-full space-y-4",n?.container),children:[s.jsxs("div",{className:p.cn("grid h-full w-full gap-4",h==="list"?"grid-cols-1":O[h]),children:[L&&R.map(({file:r,index:l})=>{const u=ie(r);return s.jsxs("div",{className:`group bg-primary-bg relative aspect-square h-full w-full
|
|
2
2
|
overflow-hidden rounded-lg`,children:[u==="image"?s.jsx("img",{src:r.url,className:"h-full w-full object-cover"}):s.jsx("div",{className:`flex h-full w-full items-center justify-center bg-gray-100
|
|
3
3
|
text-sm font-semibold`,children:r.name.split(".").pop()?.toUpperCase()}),s.jsx("div",{className:`bg-primary-inverse-bg/50 text-primary-bg absolute inset-0
|
|
4
4
|
flex items-center justify-center opacity-0 transition-opacity
|
|
5
|
-
hover:opacity-100`,children:s.jsx(j.
|
|
5
|
+
hover:opacity-100`,children:s.jsx(j.StrokeIcon,{onClick:P(l),icon:J.X})})]},`${r.url}-${r.addedAt}-${l}`)}),!k&&s.jsxs("div",{...D(),className:p.cn(`relative flex cursor-pointer flex-col items-center justify-center
|
|
6
6
|
rounded-lg border-2 border-dashed border-gray-300 bg-gray-50
|
|
7
|
-
transition-colors hover:bg-gray-100`,C&&"border-primary bg-primary/5",(a||
|
|
7
|
+
transition-colors hover:bg-gray-100`,C&&"border-primary bg-primary/5",(a||b)&&"cursor-not-allowed opacity-50",h==="list"?"min-h-37.5":"aspect-square",n?.blockAdd),children:[s.jsx("input",{...B()}),b?s.jsx(j.StrokeIcon,{icon:H.SpinnerGap,className:"text-sub-label-text h-8 w-8 animate-spin"}):s.jsxs("div",{className:"flex flex-col items-center space-y-2 p-4 text-center",children:[s.jsx(j.StrokeIcon,{icon:z,className:p.cn("text-sub-label-text h-8 w-8",n?.icon)}),s.jsx(M.Typography,{className:p.cn("text-sub-label-text",n?.title),children:o?`${w||"Добавить"} (${y}/${c})`:w||"Добавить"}),F&&s.jsx(M.Typography,{className:p.cn("text-sub-label-text",n?.text),children:F})]})]})]}),!$&&_&&s.jsx("div",{className:"rounded-lg bg-red-50 p-3 text-sm text-red-600",children:_})]})};exports.FilesUploader=ae;
|
|
8
8
|
//# sourceMappingURL=components-files-uploader-files-uploader.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"components-files-uploader-files-uploader.cjs","sources":["../src/components/files-uploader/files-uploader.tsx"],"sourcesContent":["import { cn } from \"@/lib/utils\";\nimport { useState } from \"react\";\nimport { type FileRejection, useDropzone } from \"react-dropzone\";\nimport { Icon, type IconProps } from \"../ui/icon\";\nimport { Typography } from \"../ui/typography\";\n\ntype Variant = \"grid\" | \"list\" | \"compact\";\ntype AcceptType = \"image\" | \"pdf\" | \"doc\" | \"excel\" | \"text\" | \"all\";\n\nexport type UploadedFileData = {\n url: string;\n name: string;\n size: string;\n addedAt: string;\n status: \"uploaded\" | \"error\";\n error?: string;\n};\n\nexport type FilesUploaderValue = UploadedFileData[] | [];\n\nexport type PropsFilesUploader = {\n value?: FilesUploaderValue;\n onChange?: (value: FilesUploaderValue) => void;\n multiple?: boolean;\n maxFiles?: number;\n disabled?: boolean;\n isErrorText?: boolean;\n className?: {\n container?: string;\n blockAdd?: string;\n title?: string;\n text?: string;\n icon?: string;\n };\n maxSize?: number;\n variant?: Variant;\n accepts?: AcceptType[];\n icon?: IconProps;\n title?: string;\n text?: string;\n showFiles?: boolean;\n};\n\nconst FILE_SIZE_UNITS = [\"B\", \"KB\", \"MB\", \"GB\", \"TB\"];\nconst FILE_SIZE_KB = 1024;\n\nconst DEFAULT_MAX_SIZE = 5 * FILE_SIZE_KB * FILE_SIZE_KB;\nconst DEFAULT_MAX_FILES = 5;\nconst DEFAULT_ACCEPT: AcceptType[] = [\"all\"];\nconst DEFAULT_TIMEOUT = 800;\n\nconst ACCEPT_MAP: Record<AcceptType, Record<string, string[]>> = {\n image: { \"image/*\": [\".jpg\", \".jpeg\", \".png\", \".webp\"] },\n pdf: { \"application/pdf\": [\".pdf\"] },\n doc: {\n \"application/msword\": [\".doc\"],\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\": [\".docx\"],\n },\n excel: {\n \"application/vnd.ms-excel\": [\".xls\"],\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\": [\".xlsx\"],\n },\n text: { \"text/plain\": [\".txt\"] },\n all: {},\n};\n\nconst formatFileSize = (bytes: number) => {\n if (!bytes) return \"0 B\";\n const i = Math.floor(Math.log(bytes) / Math.log(FILE_SIZE_KB));\n return `${(bytes / Math.pow(FILE_SIZE_KB, i)).toFixed(2)} ${FILE_SIZE_UNITS[i]}`;\n};\n\nconst getFileIdentity = (file: Pick<UploadedFileData, \"name\" | \"size\">) =>\n `${file.name}:${file.size}`;\n\nconst fileAcceptMap = (accepts: AcceptType[]) =>\n accepts.reduce((acc, t) => ({ ...acc, ...ACCEPT_MAP[t] }), {});\n\nconst limitFilesForValue = (\n nextFiles: UploadedFileData[],\n maxFiles: number,\n): UploadedFileData[] => {\n const uploadedFiles = nextFiles.filter((file) => file.status === \"uploaded\");\n const errorFiles = nextFiles.filter((file) => file.status === \"error\");\n const availableErrorSlots = Math.max(0, maxFiles - uploadedFiles.length);\n\n return [...uploadedFiles, ...errorFiles.slice(0, availableErrorSlots)];\n};\n\nconst mapFile = (\n file: File,\n status: UploadedFileData[\"status\"],\n error?: string,\n): UploadedFileData => ({\n url: URL.createObjectURL(file),\n name: file.name,\n size: formatFileSize(file.size),\n addedAt: new Date().toISOString(),\n status,\n error,\n});\n\nconst getRejectedError = (code?: string) =>\n code === \"file-too-large\" ? \"Файл слишком большой\" : \"Неподдерживаемый формат\";\n\nconst replaceDuplicateErrors = (\n currentFiles: UploadedFileData[],\n newFiles: UploadedFileData[],\n rejectedFiles: UploadedFileData[],\n) => {\n const rejectedFileIds = new Set(rejectedFiles.map(getFileIdentity));\n const acceptedFileIds = new Set(newFiles.map(getFileIdentity));\n\n return currentFiles.filter((existingFile) => {\n if (existingFile.status !== \"error\") return true;\n const id = getFileIdentity(existingFile);\n return !rejectedFileIds.has(id) && !acceptedFileIds.has(id);\n });\n};\n\nconst getFileType = (file: UploadedFileData) => {\n const ext = file.name.split(\".\").pop()?.toLowerCase();\n\n if (!ext) return \"other\";\n if ([\"jpg\", \"jpeg\", \"png\", \"webp\"].includes(ext)) return \"image\";\n if (ext === \"pdf\") return \"pdf\";\n if ([\"doc\", \"docx\"].includes(ext)) return \"doc\";\n if ([\"xls\", \"xlsx\"].includes(ext)) return \"excel\";\n if (ext === \"txt\") return \"text\";\n\n return \"other\";\n};\n\nexport const FilesUploader = ({\n value = [],\n onChange,\n multiple = false,\n maxFiles = DEFAULT_MAX_FILES,\n disabled = false,\n className,\n maxSize = DEFAULT_MAX_SIZE,\n variant = \"grid\",\n accepts = DEFAULT_ACCEPT,\n icon,\n title,\n text,\n showFiles = true,\n isErrorText = false,\n}: PropsFilesUploader) => {\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const files = value;\n const uploadedCount = files.filter((file) => file.status === \"uploaded\").length;\n\n const onDrop = (acceptedFiles: File[], rejectedFiles: FileRejection[]) => {\n setError(null);\n const remainingUploadSlots = Math.max(0, maxFiles - uploadedCount);\n const acceptedFilesToUpload = acceptedFiles.slice(0, remainingUploadSlots);\n const overflowAcceptedFiles = acceptedFiles.slice(remainingUploadSlots);\n\n const rejectedMapped = [\n ...rejectedFiles.map((rejection) =>\n mapFile(rejection.file, \"error\", getRejectedError(rejection.errors[0]?.code)),\n ),\n ...overflowAcceptedFiles.map((file) =>\n mapFile(file, \"error\", `Максимальное количество файлов: ${maxFiles}`),\n ),\n ];\n\n if (rejectedMapped.length) {\n setError(rejectedMapped[0].error || \"Ошибка загрузки\");\n }\n\n if (!acceptedFilesToUpload.length && !rejectedMapped.length) return;\n\n setLoading(true);\n\n setTimeout(() => {\n const newFiles = acceptedFilesToUpload.map((file) => mapFile(file, \"uploaded\"));\n const nextBaseFiles = replaceDuplicateErrors(files, newFiles, rejectedMapped);\n const nextFiles = multiple\n ? limitFilesForValue([...nextBaseFiles, ...newFiles, ...rejectedMapped], maxFiles)\n : [...newFiles, ...rejectedMapped].slice(0, 1);\n\n onChange?.(nextFiles.length ? nextFiles : []);\n setLoading(false);\n }, DEFAULT_TIMEOUT);\n };\n\n const { getRootProps, getInputProps, isDragActive } = useDropzone({\n onDrop,\n accept: fileAcceptMap(accepts),\n maxSize,\n multiple: multiple && maxFiles > 1,\n disabled: disabled || loading,\n });\n\n const removeFile = (index: number) => () => {\n const updated = files.filter((_, i) => i !== index);\n onChange?.(updated.length ? updated : []);\n };\n\n const uploadedFiles = files\n .map((file, index) => ({ file, index }))\n .filter(({ file }) => file.status === \"uploaded\");\n\n const isMaxFilesReached = uploadedCount >= maxFiles;\n\n const gridClasses = {\n grid: \"grid-cols-2 sm:grid-cols-3 md:grid-cols-4\",\n list: \"grid-cols-1\",\n compact: \"grid-cols-2 sm:grid-cols-3\",\n };\n\n return (\n <div className={cn(\"w-full space-y-4\", className?.container)}>\n <div\n className={cn(\n \"grid h-full w-full gap-4\",\n variant === \"list\" ? \"grid-cols-1\" : gridClasses[variant],\n )}\n >\n {showFiles &&\n uploadedFiles.map(({ file, index }) => {\n const type = getFileType(file);\n\n return (\n <div\n key={`${file.url}-${file.addedAt}-${index}`}\n className=\"group bg-primary-bg relative aspect-square h-full w-full\n overflow-hidden rounded-lg\"\n >\n {type === \"image\" ? (\n <img\n src={file.url}\n className=\"h-full w-full object-cover\"\n />\n ) : (\n <div\n className=\"flex h-full w-full items-center justify-center bg-gray-100\n text-sm font-semibold\"\n >\n {file.name.split(\".\").pop()?.toUpperCase()}\n </div>\n )}\n\n <div\n className=\"bg-primary-inverse-bg/50 text-primary-bg absolute inset-0\n flex items-center justify-center opacity-0 transition-opacity\n hover:opacity-100\"\n >\n <Icon\n onClick={removeFile(index)}\n type={\"x\"}\n />\n </div>\n </div>\n );\n })}\n\n {!isMaxFilesReached && (\n <div\n {...getRootProps()}\n className={cn(\n `relative flex cursor-pointer flex-col items-center justify-center\n rounded-lg border-2 border-dashed border-gray-300 bg-gray-50\n transition-colors hover:bg-gray-100`,\n isDragActive && \"border-primary bg-primary/5\",\n (disabled || loading) && \"cursor-not-allowed opacity-50\",\n variant === \"list\" ? \"min-h-37.5\" : \"aspect-square\",\n className?.blockAdd,\n )}\n >\n <input {...getInputProps()} />\n\n {loading ? (\n <Icon\n type=\"spinner-gap\"\n className=\"text-sub-label-text h-8 w-8 animate-spin\"\n />\n ) : (\n <div className=\"flex flex-col items-center space-y-2 p-4 text-center\">\n <Icon\n type={icon?.type ?? \"plus\"}\n className={cn(\"text-sub-label-text h-8 w-8\", className?.icon)}\n />\n\n <Typography className={cn(\"text-sub-label-text\", className?.title)}>\n {multiple\n ? `${title || \"Добавить\"} (${uploadedCount}/${maxFiles})`\n : title || \"Добавить\"}\n </Typography>\n\n {text && (\n <Typography className={cn(\"text-sub-label-text\", className?.text)}>\n {text}\n </Typography>\n )}\n </div>\n )}\n </div>\n )}\n </div>\n\n {!isErrorText && error && (\n <div className=\"rounded-lg bg-red-50 p-3 text-sm text-red-600\">{error}</div>\n )}\n </div>\n );\n};\n"],"names":["FILE_SIZE_UNITS","FILE_SIZE_KB","DEFAULT_MAX_SIZE","DEFAULT_MAX_FILES","DEFAULT_ACCEPT","DEFAULT_TIMEOUT","ACCEPT_MAP","formatFileSize","bytes","i","getFileIdentity","file","fileAcceptMap","accepts","acc","t","limitFilesForValue","nextFiles","maxFiles","uploadedFiles","errorFiles","availableErrorSlots","mapFile","status","error","getRejectedError","code","replaceDuplicateErrors","currentFiles","newFiles","rejectedFiles","rejectedFileIds","acceptedFileIds","existingFile","id","getFileType","ext","FilesUploader","value","onChange","multiple","disabled","className","maxSize","variant","icon","title","text","showFiles","isErrorText","loading","setLoading","useState","setError","files","uploadedCount","onDrop","acceptedFiles","remainingUploadSlots","acceptedFilesToUpload","overflowAcceptedFiles","rejectedMapped","rejection","nextBaseFiles","getRootProps","getInputProps","isDragActive","useDropzone","removeFile","index","updated","_","isMaxFilesReached","gridClasses","cn","jsxs","type","jsx","Icon","Typography"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"components-files-uploader-files-uploader.cjs","sources":["../src/components/files-uploader/files-uploader.tsx"],"sourcesContent":["import { cn } from \"@/lib/utils\";\nimport { useState } from \"react\";\nimport { type FileRejection, useDropzone } from \"react-dropzone\";\nimport { Plus } from \"@/components/icons/Plus\";\nimport { SpinnerGap } from \"@/components/icons/SpinnerGap\";\nimport { StrokeIcon, type StrokeIconComponent } from \"@/components/icons/stroke-icon\";\nimport { X } from \"@/components/icons/X\";\nimport { Typography } from \"../ui/typography\";\n\ntype Variant = \"grid\" | \"list\" | \"compact\";\ntype AcceptType = \"image\" | \"pdf\" | \"doc\" | \"excel\" | \"text\" | \"all\";\n\nexport type UploadedFileData = {\n url: string;\n name: string;\n size: string;\n addedAt: string;\n status: \"uploaded\" | \"error\";\n error?: string;\n};\n\nexport type FilesUploaderValue = UploadedFileData[] | [];\n\nexport type PropsFilesUploader = {\n value?: FilesUploaderValue;\n onChange?: (value: FilesUploaderValue) => void;\n multiple?: boolean;\n maxFiles?: number;\n disabled?: boolean;\n isErrorText?: boolean;\n className?: {\n container?: string;\n blockAdd?: string;\n title?: string;\n text?: string;\n icon?: string;\n };\n maxSize?: number;\n variant?: Variant;\n accepts?: AcceptType[];\n icon?: StrokeIconComponent;\n title?: string;\n text?: string;\n showFiles?: boolean;\n};\n\nconst FILE_SIZE_UNITS = [\"B\", \"KB\", \"MB\", \"GB\", \"TB\"];\nconst FILE_SIZE_KB = 1024;\n\nconst DEFAULT_MAX_SIZE = 5 * FILE_SIZE_KB * FILE_SIZE_KB;\nconst DEFAULT_MAX_FILES = 5;\nconst DEFAULT_ACCEPT: AcceptType[] = [\"all\"];\nconst DEFAULT_TIMEOUT = 800;\n\nconst ACCEPT_MAP: Record<AcceptType, Record<string, string[]>> = {\n image: { \"image/*\": [\".jpg\", \".jpeg\", \".png\", \".webp\"] },\n pdf: { \"application/pdf\": [\".pdf\"] },\n doc: {\n \"application/msword\": [\".doc\"],\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\": [\".docx\"],\n },\n excel: {\n \"application/vnd.ms-excel\": [\".xls\"],\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\": [\".xlsx\"],\n },\n text: { \"text/plain\": [\".txt\"] },\n all: {},\n};\n\nconst formatFileSize = (bytes: number) => {\n if (!bytes) return \"0 B\";\n const i = Math.floor(Math.log(bytes) / Math.log(FILE_SIZE_KB));\n return `${(bytes / Math.pow(FILE_SIZE_KB, i)).toFixed(2)} ${FILE_SIZE_UNITS[i]}`;\n};\n\nconst getFileIdentity = (file: Pick<UploadedFileData, \"name\" | \"size\">) =>\n `${file.name}:${file.size}`;\n\nconst fileAcceptMap = (accepts: AcceptType[]) =>\n accepts.reduce((acc, t) => ({ ...acc, ...ACCEPT_MAP[t] }), {});\n\nconst limitFilesForValue = (\n nextFiles: UploadedFileData[],\n maxFiles: number,\n): UploadedFileData[] => {\n const uploadedFiles = nextFiles.filter((file) => file.status === \"uploaded\");\n const errorFiles = nextFiles.filter((file) => file.status === \"error\");\n const availableErrorSlots = Math.max(0, maxFiles - uploadedFiles.length);\n\n return [...uploadedFiles, ...errorFiles.slice(0, availableErrorSlots)];\n};\n\nconst mapFile = (\n file: File,\n status: UploadedFileData[\"status\"],\n error?: string,\n): UploadedFileData => ({\n url: URL.createObjectURL(file),\n name: file.name,\n size: formatFileSize(file.size),\n addedAt: new Date().toISOString(),\n status,\n error,\n});\n\nconst getRejectedError = (code?: string) =>\n code === \"file-too-large\" ? \"Файл слишком большой\" : \"Неподдерживаемый формат\";\n\nconst replaceDuplicateErrors = (\n currentFiles: UploadedFileData[],\n newFiles: UploadedFileData[],\n rejectedFiles: UploadedFileData[],\n) => {\n const rejectedFileIds = new Set(rejectedFiles.map(getFileIdentity));\n const acceptedFileIds = new Set(newFiles.map(getFileIdentity));\n\n return currentFiles.filter((existingFile) => {\n if (existingFile.status !== \"error\") return true;\n const id = getFileIdentity(existingFile);\n return !rejectedFileIds.has(id) && !acceptedFileIds.has(id);\n });\n};\n\nconst getFileType = (file: UploadedFileData) => {\n const ext = file.name.split(\".\").pop()?.toLowerCase();\n\n if (!ext) return \"other\";\n if ([\"jpg\", \"jpeg\", \"png\", \"webp\"].includes(ext)) return \"image\";\n if (ext === \"pdf\") return \"pdf\";\n if ([\"doc\", \"docx\"].includes(ext)) return \"doc\";\n if ([\"xls\", \"xlsx\"].includes(ext)) return \"excel\";\n if (ext === \"txt\") return \"text\";\n\n return \"other\";\n};\n\nexport const FilesUploader = ({\n value = [],\n onChange,\n multiple = false,\n maxFiles = DEFAULT_MAX_FILES,\n disabled = false,\n className,\n maxSize = DEFAULT_MAX_SIZE,\n variant = \"grid\",\n accepts = DEFAULT_ACCEPT,\n icon,\n title,\n text,\n showFiles = true,\n isErrorText = false,\n}: PropsFilesUploader) => {\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const files = value;\n const uploadedCount = files.filter((file) => file.status === \"uploaded\").length;\n\n const onDrop = (acceptedFiles: File[], rejectedFiles: FileRejection[]) => {\n setError(null);\n const remainingUploadSlots = Math.max(0, maxFiles - uploadedCount);\n const acceptedFilesToUpload = acceptedFiles.slice(0, remainingUploadSlots);\n const overflowAcceptedFiles = acceptedFiles.slice(remainingUploadSlots);\n\n const rejectedMapped = [\n ...rejectedFiles.map((rejection) =>\n mapFile(rejection.file, \"error\", getRejectedError(rejection.errors[0]?.code)),\n ),\n ...overflowAcceptedFiles.map((file) =>\n mapFile(file, \"error\", `Максимальное количество файлов: ${maxFiles}`),\n ),\n ];\n\n if (rejectedMapped.length) {\n setError(rejectedMapped[0].error || \"Ошибка загрузки\");\n }\n\n if (!acceptedFilesToUpload.length && !rejectedMapped.length) return;\n\n setLoading(true);\n\n setTimeout(() => {\n const newFiles = acceptedFilesToUpload.map((file) => mapFile(file, \"uploaded\"));\n const nextBaseFiles = replaceDuplicateErrors(files, newFiles, rejectedMapped);\n const nextFiles = multiple\n ? limitFilesForValue([...nextBaseFiles, ...newFiles, ...rejectedMapped], maxFiles)\n : [...newFiles, ...rejectedMapped].slice(0, 1);\n\n onChange?.(nextFiles.length ? nextFiles : []);\n setLoading(false);\n }, DEFAULT_TIMEOUT);\n };\n\n const { getRootProps, getInputProps, isDragActive } = useDropzone({\n onDrop,\n accept: fileAcceptMap(accepts),\n maxSize,\n multiple: multiple && maxFiles > 1,\n disabled: disabled || loading,\n });\n\n const removeFile = (index: number) => () => {\n const updated = files.filter((_, i) => i !== index);\n onChange?.(updated.length ? updated : []);\n };\n\n const uploadedFiles = files\n .map((file, index) => ({ file, index }))\n .filter(({ file }) => file.status === \"uploaded\");\n\n const isMaxFilesReached = uploadedCount >= maxFiles;\n const uploadIcon = icon ?? Plus;\n\n const gridClasses = {\n grid: \"grid-cols-2 sm:grid-cols-3 md:grid-cols-4\",\n list: \"grid-cols-1\",\n compact: \"grid-cols-2 sm:grid-cols-3\",\n };\n\n return (\n <div className={cn(\"w-full space-y-4\", className?.container)}>\n <div\n className={cn(\n \"grid h-full w-full gap-4\",\n variant === \"list\" ? \"grid-cols-1\" : gridClasses[variant],\n )}\n >\n {showFiles &&\n uploadedFiles.map(({ file, index }) => {\n const type = getFileType(file);\n\n return (\n <div\n key={`${file.url}-${file.addedAt}-${index}`}\n className=\"group bg-primary-bg relative aspect-square h-full w-full\n overflow-hidden rounded-lg\"\n >\n {type === \"image\" ? (\n <img\n src={file.url}\n className=\"h-full w-full object-cover\"\n />\n ) : (\n <div\n className=\"flex h-full w-full items-center justify-center bg-gray-100\n text-sm font-semibold\"\n >\n {file.name.split(\".\").pop()?.toUpperCase()}\n </div>\n )}\n\n <div\n className=\"bg-primary-inverse-bg/50 text-primary-bg absolute inset-0\n flex items-center justify-center opacity-0 transition-opacity\n hover:opacity-100\"\n >\n <StrokeIcon\n onClick={removeFile(index)}\n icon={X}\n />\n </div>\n </div>\n );\n })}\n\n {!isMaxFilesReached && (\n <div\n {...getRootProps()}\n className={cn(\n `relative flex cursor-pointer flex-col items-center justify-center\n rounded-lg border-2 border-dashed border-gray-300 bg-gray-50\n transition-colors hover:bg-gray-100`,\n isDragActive && \"border-primary bg-primary/5\",\n (disabled || loading) && \"cursor-not-allowed opacity-50\",\n variant === \"list\" ? \"min-h-37.5\" : \"aspect-square\",\n className?.blockAdd,\n )}\n >\n <input {...getInputProps()} />\n\n {loading ? (\n <StrokeIcon\n icon={SpinnerGap}\n className=\"text-sub-label-text h-8 w-8 animate-spin\"\n />\n ) : (\n <div className=\"flex flex-col items-center space-y-2 p-4 text-center\">\n <StrokeIcon\n icon={uploadIcon}\n className={cn(\"text-sub-label-text h-8 w-8\", className?.icon)}\n />\n\n <Typography className={cn(\"text-sub-label-text\", className?.title)}>\n {multiple\n ? `${title || \"Добавить\"} (${uploadedCount}/${maxFiles})`\n : title || \"Добавить\"}\n </Typography>\n\n {text && (\n <Typography className={cn(\"text-sub-label-text\", className?.text)}>\n {text}\n </Typography>\n )}\n </div>\n )}\n </div>\n )}\n </div>\n\n {!isErrorText && error && (\n <div className=\"rounded-lg bg-red-50 p-3 text-sm text-red-600\">{error}</div>\n )}\n </div>\n );\n};\n"],"names":["FILE_SIZE_UNITS","FILE_SIZE_KB","DEFAULT_MAX_SIZE","DEFAULT_MAX_FILES","DEFAULT_ACCEPT","DEFAULT_TIMEOUT","ACCEPT_MAP","formatFileSize","bytes","i","getFileIdentity","file","fileAcceptMap","accepts","acc","t","limitFilesForValue","nextFiles","maxFiles","uploadedFiles","errorFiles","availableErrorSlots","mapFile","status","error","getRejectedError","code","replaceDuplicateErrors","currentFiles","newFiles","rejectedFiles","rejectedFileIds","acceptedFileIds","existingFile","id","getFileType","ext","FilesUploader","value","onChange","multiple","disabled","className","maxSize","variant","icon","title","text","showFiles","isErrorText","loading","setLoading","useState","setError","files","uploadedCount","onDrop","acceptedFiles","remainingUploadSlots","acceptedFilesToUpload","overflowAcceptedFiles","rejectedMapped","rejection","nextBaseFiles","getRootProps","getInputProps","isDragActive","useDropzone","removeFile","index","updated","_","isMaxFilesReached","uploadIcon","Plus","gridClasses","cn","jsxs","type","jsx","StrokeIcon","X","SpinnerGap","Typography"],"mappings":"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"}
|
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
import { jsxs as m, jsx as n } from "react/jsx-runtime";
|
|
2
2
|
import { cn as p } from "./lib-utils.js";
|
|
3
3
|
import { useState as U } from "react";
|
|
4
|
-
import { u as
|
|
5
|
-
import {
|
|
4
|
+
import { u as V } from "./index-CVlBIwtP.js";
|
|
5
|
+
import { Plus as H } from "phosphor-strokes-icons/icons/Plus";
|
|
6
|
+
import { SpinnerGap as J } from "phosphor-strokes-icons/icons/SpinnerGap";
|
|
7
|
+
import { StrokeIcon as w } from "./components-icons-stroke-icon.js";
|
|
8
|
+
import { X as Q } from "phosphor-strokes-icons/icons/X";
|
|
6
9
|
import { Typography as _ } from "./components-ui-typography-typography.js";
|
|
7
10
|
import "./components-ui-typography-typography.styles.js";
|
|
8
|
-
const
|
|
11
|
+
const W = ["B", "KB", "MB", "GB", "TB"], x = 1024, Y = 5 * x * x, ee = 5, te = ["all"], re = 800, oe = {
|
|
9
12
|
image: { "image/*": [".jpg", ".jpeg", ".png", ".webp"] },
|
|
10
13
|
pdf: { "application/pdf": [".pdf"] },
|
|
11
14
|
doc: {
|
|
@@ -18,70 +21,70 @@ const V = ["B", "KB", "MB", "GB", "TB"], x = 1024, H = 5 * x * x, J = 5, Q = ["a
|
|
|
18
21
|
},
|
|
19
22
|
text: { "text/plain": [".txt"] },
|
|
20
23
|
all: {}
|
|
21
|
-
},
|
|
24
|
+
}, se = (e) => {
|
|
22
25
|
if (!e) return "0 B";
|
|
23
26
|
const t = Math.floor(Math.log(e) / Math.log(x));
|
|
24
|
-
return `${(e / Math.pow(x, t)).toFixed(2)} ${
|
|
25
|
-
}, F = (e) => `${e.name}:${e.size}`,
|
|
27
|
+
return `${(e / Math.pow(x, t)).toFixed(2)} ${W[t]}`;
|
|
28
|
+
}, F = (e) => `${e.name}:${e.size}`, le = (e) => e.reduce((t, o) => ({ ...t, ...oe[o] }), {}), ne = (e, t) => {
|
|
26
29
|
const o = e.filter((s) => s.status === "uploaded"), l = e.filter((s) => s.status === "error"), a = Math.max(0, t - o.length);
|
|
27
30
|
return [...o, ...l.slice(0, a)];
|
|
28
31
|
}, E = (e, t, o) => ({
|
|
29
32
|
url: URL.createObjectURL(e),
|
|
30
33
|
name: e.name,
|
|
31
|
-
size:
|
|
34
|
+
size: se(e.size),
|
|
32
35
|
addedAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
33
36
|
status: t,
|
|
34
37
|
error: o
|
|
35
|
-
}),
|
|
38
|
+
}), ce = (e) => e === "file-too-large" ? "Файл слишком большой" : "Неподдерживаемый формат", ie = (e, t, o) => {
|
|
36
39
|
const l = new Set(o.map(F)), a = new Set(t.map(F));
|
|
37
40
|
return e.filter((s) => {
|
|
38
41
|
if (s.status !== "error") return !0;
|
|
39
|
-
const
|
|
40
|
-
return !l.has(
|
|
42
|
+
const f = F(s);
|
|
43
|
+
return !l.has(f) && !a.has(f);
|
|
41
44
|
});
|
|
42
|
-
},
|
|
45
|
+
}, ae = (e) => {
|
|
43
46
|
const t = e.name.split(".").pop()?.toLowerCase();
|
|
44
47
|
return t ? ["jpg", "jpeg", "png", "webp"].includes(t) ? "image" : t === "pdf" ? "pdf" : ["doc", "docx"].includes(t) ? "doc" : ["xls", "xlsx"].includes(t) ? "excel" : t === "txt" ? "text" : "other" : "other";
|
|
45
|
-
},
|
|
48
|
+
}, ve = ({
|
|
46
49
|
value: e = [],
|
|
47
50
|
onChange: t,
|
|
48
51
|
multiple: o = !1,
|
|
49
|
-
maxFiles: l =
|
|
52
|
+
maxFiles: l = ee,
|
|
50
53
|
disabled: a = !1,
|
|
51
54
|
className: s,
|
|
52
|
-
maxSize:
|
|
55
|
+
maxSize: f = Y,
|
|
53
56
|
variant: b = "grid",
|
|
54
|
-
accepts: L =
|
|
57
|
+
accepts: L = te,
|
|
55
58
|
icon: $,
|
|
56
59
|
title: A,
|
|
57
60
|
text: I,
|
|
58
61
|
showFiles: N = !0,
|
|
59
62
|
isErrorText: D = !1
|
|
60
63
|
}) => {
|
|
61
|
-
const [y,
|
|
62
|
-
|
|
64
|
+
const [y, S] = U(!1), [M, T] = U(null), g = e, v = g.filter((r) => r.status === "uploaded").length, B = (r, c) => {
|
|
65
|
+
T(null);
|
|
63
66
|
const u = Math.max(0, l - v), h = r.slice(0, u), q = r.slice(u), d = [
|
|
64
67
|
...c.map(
|
|
65
|
-
(i) => E(i.file, "error",
|
|
68
|
+
(i) => E(i.file, "error", ce(i.errors[0]?.code))
|
|
66
69
|
),
|
|
67
70
|
...q.map(
|
|
68
71
|
(i) => E(i, "error", `Максимальное количество файлов: ${l}`)
|
|
69
72
|
)
|
|
70
73
|
];
|
|
71
|
-
d.length &&
|
|
72
|
-
const i = h.map((
|
|
73
|
-
t?.(
|
|
74
|
-
},
|
|
75
|
-
}, { getRootProps: C, getInputProps:
|
|
74
|
+
d.length && T(d[0].error || "Ошибка загрузки"), !(!h.length && !d.length) && (S(!0), setTimeout(() => {
|
|
75
|
+
const i = h.map((K) => E(K, "uploaded")), G = ie(g, i, d), j = o ? ne([...G, ...i, ...d], l) : [...i, ...d].slice(0, 1);
|
|
76
|
+
t?.(j.length ? j : []), S(!1);
|
|
77
|
+
}, re));
|
|
78
|
+
}, { getRootProps: C, getInputProps: P, isDragActive: z } = V({
|
|
76
79
|
onDrop: B,
|
|
77
|
-
accept:
|
|
78
|
-
maxSize:
|
|
80
|
+
accept: le(L),
|
|
81
|
+
maxSize: f,
|
|
79
82
|
multiple: o && l > 1,
|
|
80
83
|
disabled: a || y
|
|
81
84
|
}), R = (r) => () => {
|
|
82
|
-
const c =
|
|
85
|
+
const c = g.filter((u, h) => h !== r);
|
|
83
86
|
t?.(c.length ? c : []);
|
|
84
|
-
},
|
|
87
|
+
}, k = g.map((r, c) => ({ file: r, index: c })).filter(({ file: r }) => r.status === "uploaded"), O = v >= l, X = $ ?? H, Z = {
|
|
85
88
|
grid: "grid-cols-2 sm:grid-cols-3 md:grid-cols-4",
|
|
86
89
|
list: "grid-cols-1",
|
|
87
90
|
compact: "grid-cols-2 sm:grid-cols-3"
|
|
@@ -92,11 +95,11 @@ const V = ["B", "KB", "MB", "GB", "TB"], x = 1024, H = 5 * x * x, J = 5, Q = ["a
|
|
|
92
95
|
{
|
|
93
96
|
className: p(
|
|
94
97
|
"grid h-full w-full gap-4",
|
|
95
|
-
b === "list" ? "grid-cols-1" :
|
|
98
|
+
b === "list" ? "grid-cols-1" : Z[b]
|
|
96
99
|
),
|
|
97
100
|
children: [
|
|
98
|
-
N &&
|
|
99
|
-
const u =
|
|
101
|
+
N && k.map(({ file: r, index: c }) => {
|
|
102
|
+
const u = ae(r);
|
|
100
103
|
return /* @__PURE__ */ m(
|
|
101
104
|
"div",
|
|
102
105
|
{
|
|
@@ -127,7 +130,7 @@ const V = ["B", "KB", "MB", "GB", "TB"], x = 1024, H = 5 * x * x, J = 5, Q = ["a
|
|
|
127
130
|
w,
|
|
128
131
|
{
|
|
129
132
|
onClick: R(c),
|
|
130
|
-
|
|
133
|
+
icon: Q
|
|
131
134
|
}
|
|
132
135
|
)
|
|
133
136
|
}
|
|
@@ -137,7 +140,7 @@ const V = ["B", "KB", "MB", "GB", "TB"], x = 1024, H = 5 * x * x, J = 5, Q = ["a
|
|
|
137
140
|
`${r.url}-${r.addedAt}-${c}`
|
|
138
141
|
);
|
|
139
142
|
}),
|
|
140
|
-
!
|
|
143
|
+
!O && /* @__PURE__ */ m(
|
|
141
144
|
"div",
|
|
142
145
|
{
|
|
143
146
|
...C(),
|
|
@@ -145,24 +148,24 @@ const V = ["B", "KB", "MB", "GB", "TB"], x = 1024, H = 5 * x * x, J = 5, Q = ["a
|
|
|
145
148
|
`relative flex cursor-pointer flex-col items-center justify-center
|
|
146
149
|
rounded-lg border-2 border-dashed border-gray-300 bg-gray-50
|
|
147
150
|
transition-colors hover:bg-gray-100`,
|
|
148
|
-
|
|
151
|
+
z && "border-primary bg-primary/5",
|
|
149
152
|
(a || y) && "cursor-not-allowed opacity-50",
|
|
150
153
|
b === "list" ? "min-h-37.5" : "aspect-square",
|
|
151
154
|
s?.blockAdd
|
|
152
155
|
),
|
|
153
156
|
children: [
|
|
154
|
-
/* @__PURE__ */ n("input", { ...
|
|
157
|
+
/* @__PURE__ */ n("input", { ...P() }),
|
|
155
158
|
y ? /* @__PURE__ */ n(
|
|
156
159
|
w,
|
|
157
160
|
{
|
|
158
|
-
|
|
161
|
+
icon: J,
|
|
159
162
|
className: "text-sub-label-text h-8 w-8 animate-spin"
|
|
160
163
|
}
|
|
161
164
|
) : /* @__PURE__ */ m("div", { className: "flex flex-col items-center space-y-2 p-4 text-center", children: [
|
|
162
165
|
/* @__PURE__ */ n(
|
|
163
166
|
w,
|
|
164
167
|
{
|
|
165
|
-
|
|
168
|
+
icon: X,
|
|
166
169
|
className: p("text-sub-label-text h-8 w-8", s?.icon)
|
|
167
170
|
}
|
|
168
171
|
),
|
|
@@ -175,10 +178,10 @@ const V = ["B", "KB", "MB", "GB", "TB"], x = 1024, H = 5 * x * x, J = 5, Q = ["a
|
|
|
175
178
|
]
|
|
176
179
|
}
|
|
177
180
|
),
|
|
178
|
-
!D &&
|
|
181
|
+
!D && M && /* @__PURE__ */ n("div", { className: "rounded-lg bg-red-50 p-3 text-sm text-red-600", children: M })
|
|
179
182
|
] });
|
|
180
183
|
};
|
|
181
184
|
export {
|
|
182
|
-
|
|
185
|
+
ve as FilesUploader
|
|
183
186
|
};
|
|
184
187
|
//# sourceMappingURL=components-files-uploader-files-uploader.js.map
|