@payloadcms/ui 4.0.0-internal.c3ac604 → 4.0.0-internal.cc18726
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/elements/AppHeader/index.css +1 -0
- package/dist/elements/AppHeader/index.js +1 -1
- package/dist/elements/AppHeader/index.js.map +1 -1
- package/dist/elements/ArrayAction/index.d.ts +1 -0
- package/dist/elements/ArrayAction/index.d.ts.map +1 -1
- package/dist/elements/ArrayAction/index.js +45 -32
- package/dist/elements/ArrayAction/index.js.map +1 -1
- package/dist/elements/Autosave/index.d.ts.map +1 -1
- package/dist/elements/Autosave/index.js +2 -3
- package/dist/elements/Autosave/index.js.map +1 -1
- package/dist/elements/BulkUpload/AddFilesView/index.css +10 -4
- package/dist/elements/BulkUpload/AddFilesView/index.d.ts.map +1 -1
- package/dist/elements/BulkUpload/AddFilesView/index.js +71 -51
- package/dist/elements/BulkUpload/AddFilesView/index.js.map +1 -1
- package/dist/elements/BulkUpload/FormsManager/index.d.ts.map +1 -1
- package/dist/elements/BulkUpload/FormsManager/index.js +2 -3
- package/dist/elements/BulkUpload/FormsManager/index.js.map +1 -1
- package/dist/elements/Button/index.css +2 -2
- package/dist/elements/Button/index.d.ts.map +1 -1
- package/dist/elements/Button/index.js +2 -0
- package/dist/elements/Button/index.js.map +1 -1
- package/dist/elements/ClipboardAction/mergeFormStateFromClipboard.d.ts +10 -0
- package/dist/elements/ClipboardAction/mergeFormStateFromClipboard.d.ts.map +1 -1
- package/dist/elements/ClipboardAction/mergeFormStateFromClipboard.js +65 -3
- package/dist/elements/ClipboardAction/mergeFormStateFromClipboard.js.map +1 -1
- package/dist/elements/ClipboardAction/mergeFormStateFromClipboard.spec.js +345 -1
- package/dist/elements/ClipboardAction/mergeFormStateFromClipboard.spec.js.map +1 -1
- package/dist/elements/CopyLocaleData/index.d.ts.map +1 -1
- package/dist/elements/CopyLocaleData/index.js +8 -9
- package/dist/elements/CopyLocaleData/index.js.map +1 -1
- package/dist/elements/CopyToClipboard/index.d.ts +1 -0
- package/dist/elements/CopyToClipboard/index.d.ts.map +1 -1
- package/dist/elements/CopyToClipboard/index.js +10 -8
- package/dist/elements/CopyToClipboard/index.js.map +1 -1
- package/dist/elements/DeleteMany/index.d.ts.map +1 -1
- package/dist/elements/DeleteMany/index.js +2 -3
- package/dist/elements/DeleteMany/index.js.map +1 -1
- package/dist/elements/Drawer/index.css +10 -4
- package/dist/elements/Dropzone/index.css +10 -4
- package/dist/elements/DuplicateDocument/SelectLocalesDrawer/index.js +3 -2
- package/dist/elements/DuplicateDocument/SelectLocalesDrawer/index.js.map +1 -1
- package/dist/elements/DuplicateDocument/index.d.ts.map +1 -1
- package/dist/elements/DuplicateDocument/index.js +2 -3
- package/dist/elements/DuplicateDocument/index.js.map +1 -1
- package/dist/elements/EditMany/DrawerContent.d.ts.map +1 -1
- package/dist/elements/EditMany/DrawerContent.js +2 -3
- package/dist/elements/EditMany/DrawerContent.js.map +1 -1
- package/dist/elements/FileManager/FileToolbar/index.d.ts.map +1 -1
- package/dist/elements/FileManager/FileToolbar/index.js +3 -0
- package/dist/elements/FileManager/FileToolbar/index.js.map +1 -1
- package/dist/elements/FileManager/index.css +0 -30
- package/dist/elements/FileManager/index.d.ts.map +1 -1
- package/dist/elements/FileManager/index.js +379 -287
- package/dist/elements/FileManager/index.js.map +1 -1
- package/dist/elements/Hierarchy/MoveMany/index.d.ts.map +1 -1
- package/dist/elements/Hierarchy/MoveMany/index.js +2 -3
- package/dist/elements/Hierarchy/MoveMany/index.js.map +1 -1
- package/dist/elements/Hierarchy/Search/useHierarchySearch.d.ts.map +1 -1
- package/dist/elements/Hierarchy/Search/useHierarchySearch.js +2 -3
- package/dist/elements/Hierarchy/Search/useHierarchySearch.js.map +1 -1
- package/dist/elements/IDLabel/index.css +6 -0
- package/dist/elements/IDLabel/index.d.ts +1 -1
- package/dist/elements/IDLabel/index.d.ts.map +1 -1
- package/dist/elements/IDLabel/index.js +16 -21
- package/dist/elements/IDLabel/index.js.map +1 -1
- package/dist/elements/ListHeader/TitleActions/ListBulkUploadButton.d.ts +1 -7
- package/dist/elements/ListHeader/TitleActions/ListBulkUploadButton.d.ts.map +1 -1
- package/dist/elements/ListHeader/TitleActions/ListBulkUploadButton.js +26 -32
- package/dist/elements/ListHeader/TitleActions/ListBulkUploadButton.js.map +1 -1
- package/dist/elements/ListHeader/TitleActions/ListEmptyTrashButton.d.ts.map +1 -1
- package/dist/elements/ListHeader/TitleActions/ListEmptyTrashButton.js +2 -3
- package/dist/elements/ListHeader/TitleActions/ListEmptyTrashButton.js.map +1 -1
- package/dist/elements/LivePreview/Window/index.js +1 -1
- package/dist/elements/LivePreview/Window/index.js.map +1 -1
- package/dist/elements/Localizer/index.js +1 -1
- package/dist/elements/Localizer/index.js.map +1 -1
- package/dist/elements/Popup/PopupButtonList/index.css +1 -1
- package/dist/elements/Popup/index.js +1 -1
- package/dist/elements/Popup/index.js.map +1 -1
- package/dist/elements/PublishButton/ScheduleDrawer/index.d.ts.map +1 -1
- package/dist/elements/PublishButton/ScheduleDrawer/index.js +9 -31
- package/dist/elements/PublishButton/ScheduleDrawer/index.js.map +1 -1
- package/dist/elements/PublishButton/ScheduleDrawer/types.d.ts +1 -1
- package/dist/elements/PublishButton/ScheduleDrawer/types.d.ts.map +1 -1
- package/dist/elements/PublishButton/ScheduleDrawer/types.js.map +1 -1
- package/dist/elements/PublishButton/index.d.ts.map +1 -1
- package/dist/elements/PublishButton/index.js +5 -6
- package/dist/elements/PublishButton/index.js.map +1 -1
- package/dist/elements/PublishMany/DrawerContent.d.ts.map +1 -1
- package/dist/elements/PublishMany/DrawerContent.js +2 -3
- package/dist/elements/PublishMany/DrawerContent.js.map +1 -1
- package/dist/elements/QueryPresets/QueryPresetBar/index.js +1 -3
- package/dist/elements/QueryPresets/QueryPresetBar/index.js.map +1 -1
- package/dist/elements/RelationshipTable/index.d.ts.map +1 -1
- package/dist/elements/RelationshipTable/index.js +5 -2
- package/dist/elements/RelationshipTable/index.js.map +1 -1
- package/dist/elements/RestoreMany/index.d.ts.map +1 -1
- package/dist/elements/RestoreMany/index.js +2 -3
- package/dist/elements/RestoreMany/index.js.map +1 -1
- package/dist/elements/SaveDraftButton/index.d.ts.map +1 -1
- package/dist/elements/SaveDraftButton/index.js +2 -3
- package/dist/elements/SaveDraftButton/index.js.map +1 -1
- package/dist/elements/SortHeader/index.d.ts.map +1 -1
- package/dist/elements/SortHeader/index.js +29 -26
- package/dist/elements/SortHeader/index.js.map +1 -1
- package/dist/elements/Status/index.d.ts.map +1 -1
- package/dist/elements/Status/index.js +2 -3
- package/dist/elements/Status/index.js.map +1 -1
- package/dist/elements/StepNav/index.css +64 -14
- package/dist/elements/StepNav/index.d.ts.map +1 -1
- package/dist/elements/StepNav/index.js +143 -69
- package/dist/elements/StepNav/index.js.map +1 -1
- package/dist/elements/Table/DefaultCell/index.d.ts.map +1 -1
- package/dist/elements/Table/DefaultCell/index.js +3 -11
- package/dist/elements/Table/DefaultCell/index.js.map +1 -1
- package/dist/elements/Table/OrderableRow.d.ts +3 -1
- package/dist/elements/Table/OrderableRow.d.ts.map +1 -1
- package/dist/elements/Table/OrderableRow.js +17 -1
- package/dist/elements/Table/OrderableRow.js.map +1 -1
- package/dist/elements/Table/OrderableTable.d.ts.map +1 -1
- package/dist/elements/Table/OrderableTable.js +20 -4
- package/dist/elements/Table/OrderableTable.js.map +1 -1
- package/dist/elements/Table/RelationshipProvider/index.d.ts.map +1 -1
- package/dist/elements/Table/RelationshipProvider/index.js +2 -3
- package/dist/elements/Table/RelationshipProvider/index.js.map +1 -1
- package/dist/elements/UnpublishButton/index.d.ts.map +1 -1
- package/dist/elements/UnpublishButton/index.js +3 -4
- package/dist/elements/UnpublishButton/index.js.map +1 -1
- package/dist/elements/UnpublishMany/DrawerContent.d.ts.map +1 -1
- package/dist/elements/UnpublishMany/DrawerContent.js +2 -3
- package/dist/elements/UnpublishMany/DrawerContent.js.map +1 -1
- package/dist/elements/Upload/UploadFromURLModal/index.d.ts +1 -1
- package/dist/elements/Upload/UploadFromURLModal/index.d.ts.map +1 -1
- package/dist/elements/Upload/UploadFromURLModal/index.js.map +1 -1
- package/dist/elements/Upload/index.css +39 -32
- package/dist/elements/Upload/index.d.ts.map +1 -1
- package/dist/elements/Upload/index.js +37 -99
- package/dist/elements/Upload/index.js.map +1 -1
- package/dist/elements/Upload/usePasteFromClipboard.d.ts +14 -0
- package/dist/elements/Upload/usePasteFromClipboard.d.ts.map +1 -0
- package/dist/elements/Upload/usePasteFromClipboard.js +93 -0
- package/dist/elements/Upload/usePasteFromClipboard.js.map +1 -0
- package/dist/elements/Upload/useUploadFromUrl.d.ts +20 -0
- package/dist/elements/Upload/useUploadFromUrl.d.ts.map +1 -0
- package/dist/elements/Upload/useUploadFromUrl.js +201 -0
- package/dist/elements/Upload/useUploadFromUrl.js.map +1 -0
- package/dist/elements/UploadDropzoneContent/index.css +31 -0
- package/dist/elements/UploadDropzoneContent/index.d.ts +17 -0
- package/dist/elements/UploadDropzoneContent/index.d.ts.map +1 -0
- package/dist/elements/UploadDropzoneContent/index.js +62 -0
- package/dist/elements/UploadDropzoneContent/index.js.map +1 -0
- package/dist/elements/WhereBuilder/Condition/Relationship/index.js +1 -1
- package/dist/elements/WhereBuilder/Condition/Relationship/index.js.map +1 -1
- package/dist/elements/WhereBuilder/conditionValue.d.ts +32 -0
- package/dist/elements/WhereBuilder/conditionValue.d.ts.map +1 -0
- package/dist/elements/WhereBuilder/conditionValue.js +32 -0
- package/dist/elements/WhereBuilder/conditionValue.js.map +1 -0
- package/dist/elements/WhereBuilder/conditionValue.spec.js +65 -0
- package/dist/elements/WhereBuilder/conditionValue.spec.js.map +1 -0
- package/dist/elements/WhereBuilder/index.d.ts.map +1 -1
- package/dist/elements/WhereBuilder/index.js +15 -4
- package/dist/elements/WhereBuilder/index.js.map +1 -1
- package/dist/exports/client/index.d.ts +2 -1
- package/dist/exports/client/index.d.ts.map +1 -1
- package/dist/exports/client/index.js +1 -1
- package/dist/exports/client/index.js.map +3 -3
- package/dist/fields/Array/ArrayRow.d.ts +1 -0
- package/dist/fields/Array/ArrayRow.d.ts.map +1 -1
- package/dist/fields/Array/ArrayRow.js +2 -0
- package/dist/fields/Array/ArrayRow.js.map +1 -1
- package/dist/fields/Array/index.d.ts.map +1 -1
- package/dist/fields/Array/index.js +40 -13
- package/dist/fields/Array/index.js.map +1 -1
- package/dist/fields/Blocks/BlockRow.d.ts +1 -0
- package/dist/fields/Blocks/BlockRow.d.ts.map +1 -1
- package/dist/fields/Blocks/BlockRow.js +2 -0
- package/dist/fields/Blocks/BlockRow.js.map +1 -1
- package/dist/fields/Blocks/RowActions.d.ts +1 -0
- package/dist/fields/Blocks/RowActions.d.ts.map +1 -1
- package/dist/fields/Blocks/RowActions.js +22 -19
- package/dist/fields/Blocks/RowActions.js.map +1 -1
- package/dist/fields/Blocks/index.d.ts.map +1 -1
- package/dist/fields/Blocks/index.js +37 -10
- package/dist/fields/Blocks/index.js.map +1 -1
- package/dist/fields/FieldLabel/index.d.ts.map +1 -1
- package/dist/fields/FieldLabel/index.js +4 -5
- package/dist/fields/FieldLabel/index.js.map +1 -1
- package/dist/fields/Relationship/Input.d.ts.map +1 -1
- package/dist/fields/Relationship/Input.js +2 -3
- package/dist/fields/Relationship/Input.js.map +1 -1
- package/dist/fields/Slug/index.d.ts.map +1 -1
- package/dist/fields/Slug/index.js +2 -3
- package/dist/fields/Slug/index.js.map +1 -1
- package/dist/fields/Upload/Input.d.ts.map +1 -1
- package/dist/fields/Upload/Input.js +46 -19
- package/dist/fields/Upload/Input.js.map +1 -1
- package/dist/fields/Upload/Input.spec.js +242 -0
- package/dist/fields/Upload/Input.spec.js.map +1 -0
- package/dist/fields/shared/index.d.ts +1 -1
- package/dist/fields/shared/index.d.ts.map +1 -1
- package/dist/fields/shared/index.js.map +1 -1
- package/dist/forms/Form/index.d.ts.map +1 -1
- package/dist/forms/Form/index.js +6 -4
- package/dist/forms/Form/index.js.map +1 -1
- package/dist/forms/NullifyField/index.d.ts.map +1 -1
- package/dist/forms/NullifyField/index.js +2 -3
- package/dist/forms/NullifyField/index.js.map +1 -1
- package/dist/forms/fieldSchemasToFormState/addFieldStatePromise.d.ts.map +1 -1
- package/dist/forms/fieldSchemasToFormState/addFieldStatePromise.js +1 -0
- package/dist/forms/fieldSchemasToFormState/addFieldStatePromise.js.map +1 -1
- package/dist/hooks/usePayloadAPI.d.ts.map +1 -1
- package/dist/hooks/usePayloadAPI.js +2 -3
- package/dist/hooks/usePayloadAPI.js.map +1 -1
- package/dist/icons/Edit/index.d.ts +0 -1
- package/dist/icons/Edit/index.d.ts.map +1 -1
- package/dist/icons/Edit/index.js +4 -4
- package/dist/icons/Edit/index.js.map +1 -1
- package/dist/providers/Actions/index.d.ts +1 -0
- package/dist/providers/Actions/index.d.ts.map +1 -1
- package/dist/providers/Actions/index.js +43 -11
- package/dist/providers/Actions/index.js.map +1 -1
- package/dist/providers/Auth/AuthSessionDebug/index.css +48 -0
- package/dist/providers/Auth/AuthSessionDebug/index.d.ts +13 -0
- package/dist/providers/Auth/AuthSessionDebug/index.d.ts.map +1 -0
- package/dist/providers/Auth/AuthSessionDebug/index.js +93 -0
- package/dist/providers/Auth/AuthSessionDebug/index.js.map +1 -0
- package/dist/providers/Auth/AuthSessionDebug/utilities.d.ts +21 -0
- package/dist/providers/Auth/AuthSessionDebug/utilities.d.ts.map +1 -0
- package/dist/providers/Auth/AuthSessionDebug/utilities.js +53 -0
- package/dist/providers/Auth/AuthSessionDebug/utilities.js.map +1 -0
- package/dist/providers/Auth/authSessionRequests.d.ts +27 -0
- package/dist/providers/Auth/authSessionRequests.d.ts.map +1 -0
- package/dist/providers/Auth/authSessionRequests.js +119 -0
- package/dist/providers/Auth/authSessionRequests.js.map +1 -0
- package/dist/providers/Auth/authSessionRequests.spec.js +121 -0
- package/dist/providers/Auth/authSessionRequests.spec.js.map +1 -0
- package/dist/providers/Auth/index.d.ts +2 -56
- package/dist/providers/Auth/index.d.ts.map +1 -1
- package/dist/providers/Auth/index.js +283 -135
- package/dist/providers/Auth/index.js.map +1 -1
- package/dist/providers/Auth/sessionActivity.d.ts +23 -0
- package/dist/providers/Auth/sessionActivity.d.ts.map +1 -0
- package/dist/providers/Auth/sessionActivity.js +49 -0
- package/dist/providers/Auth/sessionActivity.js.map +1 -0
- package/dist/providers/Auth/sessionActivity.spec.js +44 -0
- package/dist/providers/Auth/sessionActivity.spec.js.map +1 -0
- package/dist/providers/Auth/sessionTiming.d.ts +11 -0
- package/dist/providers/Auth/sessionTiming.d.ts.map +1 -0
- package/dist/providers/Auth/sessionTiming.js +18 -0
- package/dist/providers/Auth/sessionTiming.js.map +1 -0
- package/dist/providers/Auth/tabSessionSync/index.d.ts +17 -0
- package/dist/providers/Auth/tabSessionSync/index.d.ts.map +1 -0
- package/dist/providers/Auth/tabSessionSync/index.js +263 -0
- package/dist/providers/Auth/tabSessionSync/index.js.map +1 -0
- package/dist/providers/Auth/tabSessionSync/index.spec.js +463 -0
- package/dist/providers/Auth/tabSessionSync/index.spec.js.map +1 -0
- package/dist/providers/Auth/tabSessionSync/types.d.ts +107 -0
- package/dist/providers/Auth/tabSessionSync/types.d.ts.map +1 -0
- package/dist/providers/Auth/tabSessionSync/types.js +6 -0
- package/dist/providers/Auth/tabSessionSync/types.js.map +1 -0
- package/dist/providers/Auth/tabSessionSync/useTabSessionSync.d.ts +11 -0
- package/dist/providers/Auth/tabSessionSync/useTabSessionSync.d.ts.map +1 -0
- package/dist/providers/Auth/tabSessionSync/useTabSessionSync.js +90 -0
- package/dist/providers/Auth/tabSessionSync/useTabSessionSync.js.map +1 -0
- package/dist/providers/Auth/tabSessionSync/utilities.d.ts +26 -0
- package/dist/providers/Auth/tabSessionSync/utilities.d.ts.map +1 -0
- package/dist/providers/Auth/tabSessionSync/utilities.js +159 -0
- package/dist/providers/Auth/tabSessionSync/utilities.js.map +1 -0
- package/dist/providers/Auth/types.d.ts +65 -0
- package/dist/providers/Auth/types.d.ts.map +1 -0
- package/dist/providers/Auth/types.js +2 -0
- package/dist/providers/Auth/types.js.map +1 -0
- package/dist/providers/Auth/useAuthSessionTimers.d.ts +26 -0
- package/dist/providers/Auth/useAuthSessionTimers.d.ts.map +1 -0
- package/dist/providers/Auth/useAuthSessionTimers.js +203 -0
- package/dist/providers/Auth/useAuthSessionTimers.js.map +1 -0
- package/dist/providers/Auth/useAuthSessionTimers.spec.js +311 -0
- package/dist/providers/Auth/useAuthSessionTimers.spec.js.map +1 -0
- package/dist/providers/DocumentInfo/index.d.ts.map +1 -1
- package/dist/providers/DocumentInfo/index.js +2 -3
- package/dist/providers/DocumentInfo/index.js.map +1 -1
- package/dist/providers/FormErrorHandler/index.d.ts +5 -1
- package/dist/providers/FormErrorHandler/index.d.ts.map +1 -1
- package/dist/providers/FormErrorHandler/index.js.map +1 -1
- package/dist/providers/Locale/index.d.ts +1 -5
- package/dist/providers/Locale/index.d.ts.map +1 -1
- package/dist/providers/Locale/index.js +64 -137
- package/dist/providers/Locale/index.js.map +1 -1
- package/dist/providers/Root/index.js +4 -4
- package/dist/providers/Root/index.js.map +1 -1
- package/dist/providers/RouteTransition/ProgressBar/index.js +4 -1
- package/dist/providers/RouteTransition/ProgressBar/index.js.map +1 -1
- package/dist/providers/RouteTransition/ProgressBar/index.spec.js +44 -0
- package/dist/providers/RouteTransition/ProgressBar/index.spec.js.map +1 -0
- package/dist/providers/RouteTransition/index.d.ts +2 -0
- package/dist/providers/RouteTransition/index.d.ts.map +1 -1
- package/dist/providers/RouteTransition/index.js +42 -14
- package/dist/providers/RouteTransition/index.js.map +1 -1
- package/dist/providers/Selection/index.d.ts.map +1 -1
- package/dist/providers/Selection/index.js +2 -3
- package/dist/providers/Selection/index.js.map +1 -1
- package/dist/providers/ServerFunctions/index.d.ts +5 -1
- package/dist/providers/ServerFunctions/index.d.ts.map +1 -1
- package/dist/providers/ServerFunctions/index.js +15 -0
- package/dist/providers/ServerFunctions/index.js.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/templates/Default/index.d.ts +1 -0
- package/dist/templates/Default/index.d.ts.map +1 -1
- package/dist/templates/Default/index.js +2 -0
- package/dist/templates/Default/index.js.map +1 -1
- package/dist/utilities/formatMetadata.d.ts.map +1 -1
- package/dist/utilities/formatMetadata.js +0 -5
- package/dist/utilities/formatMetadata.js.map +1 -1
- package/dist/utilities/getFilesFromClipboard.d.ts +10 -0
- package/dist/utilities/getFilesFromClipboard.d.ts.map +1 -0
- package/dist/utilities/getFilesFromClipboard.js +49 -0
- package/dist/utilities/getFilesFromClipboard.js.map +1 -0
- package/dist/utilities/getHasScheduledPublish.d.ts +2 -3
- package/dist/utilities/getHasScheduledPublish.d.ts.map +1 -1
- package/dist/utilities/getHasScheduledPublish.js +2 -5
- package/dist/utilities/getHasScheduledPublish.js.map +1 -1
- package/dist/utilities/schedulePublishHandler.d.ts +8 -1
- package/dist/utilities/schedulePublishHandler.d.ts.map +1 -1
- package/dist/utilities/schedulePublishHandler.js +68 -4
- package/dist/utilities/schedulePublishHandler.js.map +1 -1
- package/dist/utilities/serverFunctionRegistry.d.ts.map +1 -1
- package/dist/utilities/serverFunctionRegistry.js +2 -1
- package/dist/utilities/serverFunctionRegistry.js.map +1 -1
- package/dist/utilities/slugify.d.ts.map +1 -1
- package/dist/utilities/slugify.js +3 -0
- package/dist/utilities/slugify.js.map +1 -1
- package/dist/views/API/index.client.d.ts.map +1 -1
- package/dist/views/API/index.client.js +2 -3
- package/dist/views/API/index.client.js.map +1 -1
- package/dist/views/Dashboard/Default/ModularDashboard/DashboardStepNav.d.ts.map +1 -1
- package/dist/views/Dashboard/Default/ModularDashboard/DashboardStepNav.js +3 -2
- package/dist/views/Dashboard/Default/ModularDashboard/DashboardStepNav.js.map +1 -1
- package/dist/views/Dashboard/Default/ModularDashboard/WidgetEditControl.d.ts.map +1 -1
- package/dist/views/Dashboard/Default/ModularDashboard/WidgetEditControl.js +7 -7
- package/dist/views/Dashboard/Default/ModularDashboard/WidgetEditControl.js.map +1 -1
- package/dist/views/Dashboard/Default/ModularDashboard/index.client.d.ts.map +1 -1
- package/dist/views/Dashboard/Default/ModularDashboard/index.client.js +104 -66
- package/dist/views/Dashboard/Default/ModularDashboard/index.client.js.map +1 -1
- package/dist/views/Dashboard/Default/ModularDashboard/index.css +33 -140
- package/dist/views/Document/index.d.ts.map +1 -1
- package/dist/views/Document/index.js +1 -2
- package/dist/views/Document/index.js.map +1 -1
- package/dist/views/Edit/SetDocumentTitle/index.d.ts.map +1 -1
- package/dist/views/Edit/SetDocumentTitle/index.js +4 -1
- package/dist/views/Edit/SetDocumentTitle/index.js.map +1 -1
- package/dist/views/Edit/index.d.ts.map +1 -1
- package/dist/views/Edit/index.js +3 -2
- package/dist/views/Edit/index.js.map +1 -1
- package/dist/views/HierarchyList/index.css +1 -1
- package/dist/views/List/ListHeader/index.d.ts +1 -10
- package/dist/views/List/ListHeader/index.d.ts.map +1 -1
- package/dist/views/List/ListHeader/index.js +1 -3
- package/dist/views/List/ListHeader/index.js.map +1 -1
- package/dist/views/List/index.client.d.ts.map +1 -1
- package/dist/views/List/index.client.js +0 -14
- package/dist/views/List/index.client.js.map +1 -1
- package/dist/views/List/index.css +6 -1
- package/dist/views/Root/getCustomCollectionViewByRoute.d.ts.map +1 -1
- package/dist/views/Root/getCustomCollectionViewByRoute.js.map +1 -1
- package/dist/views/Root/getCustomGlobalViewByRoute.d.ts.map +1 -1
- package/dist/views/Root/getCustomGlobalViewByRoute.js.map +1 -1
- package/dist/views/Root/getCustomViewByKey.d.ts.map +1 -1
- package/dist/views/Root/getCustomViewByKey.js.map +1 -1
- package/dist/views/Root/index.d.ts.map +1 -1
- package/dist/views/Root/index.js +1 -0
- package/dist/views/Root/index.js.map +1 -1
- package/dist/views/Version/Default/SetStepNav.d.ts.map +1 -1
- package/dist/views/Version/Default/SetStepNav.js +10 -13
- package/dist/views/Version/Default/SetStepNav.js.map +1 -1
- package/dist/views/Version/Default/index.d.ts.map +1 -1
- package/dist/views/Version/Default/index.js +12 -13
- package/dist/views/Version/Default/index.js.map +1 -1
- package/dist/views/Version/generateVersionViewMetadata.js.map +1 -1
- package/dist/views/Versions/VersionPillLabel/VersionPillLabel.d.ts.map +1 -1
- package/dist/views/Versions/VersionPillLabel/VersionPillLabel.js +2 -3
- package/dist/views/Versions/VersionPillLabel/VersionPillLabel.js.map +1 -1
- package/dist/views/Versions/generateVersionsViewMetadata.js.map +1 -1
- package/package.json +6 -5
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import { c as _c } from "react/compiler-runtime";
|
|
4
|
+
import { useModal } from '@faceless-ui/modal';
|
|
5
|
+
import { formatAdminURL, validateMimeType } from 'payload/shared';
|
|
6
|
+
import { useCallback, useState } from 'react';
|
|
7
|
+
import { toast } from 'sonner';
|
|
8
|
+
import { useConfig } from '../../providers/Config/index.js';
|
|
9
|
+
import { useDocumentInfo } from '../../providers/DocumentInfo/index.js';
|
|
10
|
+
import { useTranslation } from '../../providers/Translation/index.js';
|
|
11
|
+
import { useUploadControls } from '../../providers/UploadControls/index.js';
|
|
12
|
+
import { pasteURLDrawerSlug } from './UploadFromURLModal/index.js';
|
|
13
|
+
const getFileNameFromUrl = ({
|
|
14
|
+
overrideFileName,
|
|
15
|
+
url
|
|
16
|
+
}) => {
|
|
17
|
+
const rawSegment = url.split('/').pop() || '';
|
|
18
|
+
return overrideFileName || decodeURIComponent(rawSegment.split('?')[0]);
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* Shared by the `Upload` and `FileManager` elements to fetch a file from a pasted URL, first
|
|
22
|
+
* attempting a client-side fetch and falling back to a server-side proxy fetch when the
|
|
23
|
+
* collection's `pasteURL.allowList` is configured (needed to work around CORS-restricted URLs).
|
|
24
|
+
*/
|
|
25
|
+
export const useUploadFromUrl = t0 => {
|
|
26
|
+
const $ = _c(28);
|
|
27
|
+
const {
|
|
28
|
+
collectionSlug,
|
|
29
|
+
onFileFetched,
|
|
30
|
+
uploadConfig
|
|
31
|
+
} = t0;
|
|
32
|
+
const {
|
|
33
|
+
config: t1
|
|
34
|
+
} = useConfig();
|
|
35
|
+
const {
|
|
36
|
+
routes: t2
|
|
37
|
+
} = t1;
|
|
38
|
+
const {
|
|
39
|
+
api
|
|
40
|
+
} = t2;
|
|
41
|
+
const {
|
|
42
|
+
closeModal
|
|
43
|
+
} = useModal();
|
|
44
|
+
const {
|
|
45
|
+
id,
|
|
46
|
+
setUploadStatus
|
|
47
|
+
} = useDocumentInfo();
|
|
48
|
+
const {
|
|
49
|
+
t
|
|
50
|
+
} = useTranslation();
|
|
51
|
+
const {
|
|
52
|
+
uploadControlFileName
|
|
53
|
+
} = useUploadControls();
|
|
54
|
+
const [fileUrl, setFileUrl] = useState("");
|
|
55
|
+
let t3;
|
|
56
|
+
if ($[0] !== fileUrl) {
|
|
57
|
+
t3 = fileUrl && URL.canParse(fileUrl);
|
|
58
|
+
$[0] = fileUrl;
|
|
59
|
+
$[1] = t3;
|
|
60
|
+
} else {
|
|
61
|
+
t3 = $[1];
|
|
62
|
+
}
|
|
63
|
+
const isValidUrl = Boolean(t3);
|
|
64
|
+
const useServerSideFetch = typeof uploadConfig?.pasteURL === "object" && uploadConfig.pasteURL.allowList?.length > 0;
|
|
65
|
+
let t4;
|
|
66
|
+
if ($[2] !== closeModal || $[3] !== onFileFetched || $[4] !== setUploadStatus || $[5] !== t || $[6] !== uploadConfig || $[7] !== uploadControlFileName) {
|
|
67
|
+
t4 = t5 => {
|
|
68
|
+
const {
|
|
69
|
+
blob,
|
|
70
|
+
url
|
|
71
|
+
} = t5;
|
|
72
|
+
if (uploadConfig?.mimeTypes?.length && !validateMimeType(blob.type, uploadConfig.mimeTypes)) {
|
|
73
|
+
toast.error(t("error:invalidFileType"));
|
|
74
|
+
setUploadStatus("failed");
|
|
75
|
+
return false;
|
|
76
|
+
}
|
|
77
|
+
const fileName = getFileNameFromUrl({
|
|
78
|
+
overrideFileName: uploadControlFileName,
|
|
79
|
+
url
|
|
80
|
+
});
|
|
81
|
+
onFileFetched(new File([blob], fileName, {
|
|
82
|
+
type: blob.type
|
|
83
|
+
}));
|
|
84
|
+
setUploadStatus("idle");
|
|
85
|
+
closeModal(pasteURLDrawerSlug);
|
|
86
|
+
setFileUrl("");
|
|
87
|
+
return true;
|
|
88
|
+
};
|
|
89
|
+
$[2] = closeModal;
|
|
90
|
+
$[3] = onFileFetched;
|
|
91
|
+
$[4] = setUploadStatus;
|
|
92
|
+
$[5] = t;
|
|
93
|
+
$[6] = uploadConfig;
|
|
94
|
+
$[7] = uploadControlFileName;
|
|
95
|
+
$[8] = t4;
|
|
96
|
+
} else {
|
|
97
|
+
t4 = $[8];
|
|
98
|
+
}
|
|
99
|
+
const acceptFetchedBlob = t4;
|
|
100
|
+
let t5;
|
|
101
|
+
if ($[9] !== acceptFetchedBlob) {
|
|
102
|
+
t5 = async url_0 => {
|
|
103
|
+
const response = await fetch(url_0);
|
|
104
|
+
if (!response.ok) {
|
|
105
|
+
throw new Error(`Fetch failed with status: ${response.status}`);
|
|
106
|
+
}
|
|
107
|
+
const blob_0 = await response.blob();
|
|
108
|
+
return acceptFetchedBlob({
|
|
109
|
+
blob: blob_0,
|
|
110
|
+
url: url_0
|
|
111
|
+
});
|
|
112
|
+
};
|
|
113
|
+
$[9] = acceptFetchedBlob;
|
|
114
|
+
$[10] = t5;
|
|
115
|
+
} else {
|
|
116
|
+
t5 = $[10];
|
|
117
|
+
}
|
|
118
|
+
const fetchFileFromClient = t5;
|
|
119
|
+
let t6;
|
|
120
|
+
if ($[11] !== acceptFetchedBlob || $[12] !== api || $[13] !== collectionSlug || $[14] !== id) {
|
|
121
|
+
t6 = async url_1 => {
|
|
122
|
+
const pasteURL = `/${collectionSlug}/paste-url${id ? `/${id}?` : "?"}src=${encodeURIComponent(url_1)}`;
|
|
123
|
+
const response_0 = await fetch(formatAdminURL({
|
|
124
|
+
apiRoute: api,
|
|
125
|
+
path: pasteURL
|
|
126
|
+
}));
|
|
127
|
+
if (!response_0.ok) {
|
|
128
|
+
throw new Error(`Fetch failed with status: ${response_0.status}`);
|
|
129
|
+
}
|
|
130
|
+
const blob_1 = await response_0.blob();
|
|
131
|
+
return acceptFetchedBlob({
|
|
132
|
+
blob: blob_1,
|
|
133
|
+
url: url_1
|
|
134
|
+
});
|
|
135
|
+
};
|
|
136
|
+
$[11] = acceptFetchedBlob;
|
|
137
|
+
$[12] = api;
|
|
138
|
+
$[13] = collectionSlug;
|
|
139
|
+
$[14] = id;
|
|
140
|
+
$[15] = t6;
|
|
141
|
+
} else {
|
|
142
|
+
t6 = $[15];
|
|
143
|
+
}
|
|
144
|
+
const fetchFileFromServerProxy = t6;
|
|
145
|
+
let t7;
|
|
146
|
+
if ($[16] !== fetchFileFromClient || $[17] !== fetchFileFromServerProxy || $[18] !== fileUrl || $[19] !== setUploadStatus || $[20] !== t || $[21] !== uploadConfig?.pasteURL || $[22] !== useServerSideFetch) {
|
|
147
|
+
t7 = async urlOverride => {
|
|
148
|
+
const urlToFetch = urlOverride ?? fileUrl;
|
|
149
|
+
if (!urlToFetch || !URL.canParse(urlToFetch) || uploadConfig?.pasteURL === false) {
|
|
150
|
+
return false;
|
|
151
|
+
}
|
|
152
|
+
setUploadStatus("uploading");
|
|
153
|
+
;
|
|
154
|
+
try {
|
|
155
|
+
return await fetchFileFromClient(urlToFetch);
|
|
156
|
+
} catch (t8) {
|
|
157
|
+
if (!useServerSideFetch) {
|
|
158
|
+
toast.error(t("error:fileFetchFailed"));
|
|
159
|
+
setUploadStatus("failed");
|
|
160
|
+
return false;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
;
|
|
164
|
+
try {
|
|
165
|
+
return await fetchFileFromServerProxy(urlToFetch);
|
|
166
|
+
} catch (t9) {
|
|
167
|
+
toast.error(t("error:urlNotAllowed"));
|
|
168
|
+
setUploadStatus("failed");
|
|
169
|
+
return false;
|
|
170
|
+
}
|
|
171
|
+
};
|
|
172
|
+
$[16] = fetchFileFromClient;
|
|
173
|
+
$[17] = fetchFileFromServerProxy;
|
|
174
|
+
$[18] = fileUrl;
|
|
175
|
+
$[19] = setUploadStatus;
|
|
176
|
+
$[20] = t;
|
|
177
|
+
$[21] = uploadConfig?.pasteURL;
|
|
178
|
+
$[22] = useServerSideFetch;
|
|
179
|
+
$[23] = t7;
|
|
180
|
+
} else {
|
|
181
|
+
t7 = $[23];
|
|
182
|
+
}
|
|
183
|
+
const handleUrlSubmit = t7;
|
|
184
|
+
let t8;
|
|
185
|
+
if ($[24] !== fileUrl || $[25] !== handleUrlSubmit || $[26] !== isValidUrl) {
|
|
186
|
+
t8 = {
|
|
187
|
+
fileUrl,
|
|
188
|
+
handleUrlSubmit,
|
|
189
|
+
isValidUrl,
|
|
190
|
+
setFileUrl
|
|
191
|
+
};
|
|
192
|
+
$[24] = fileUrl;
|
|
193
|
+
$[25] = handleUrlSubmit;
|
|
194
|
+
$[26] = isValidUrl;
|
|
195
|
+
$[27] = t8;
|
|
196
|
+
} else {
|
|
197
|
+
t8 = $[27];
|
|
198
|
+
}
|
|
199
|
+
return t8;
|
|
200
|
+
};
|
|
201
|
+
//# sourceMappingURL=useUploadFromUrl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useUploadFromUrl.js","names":["c","_c","useModal","formatAdminURL","validateMimeType","useCallback","useState","toast","useConfig","useDocumentInfo","useTranslation","useUploadControls","pasteURLDrawerSlug","getFileNameFromUrl","overrideFileName","url","rawSegment","split","pop","decodeURIComponent","useUploadFromUrl","t0","$","collectionSlug","onFileFetched","uploadConfig","config","t1","routes","t2","api","closeModal","id","setUploadStatus","t","uploadControlFileName","fileUrl","setFileUrl","t3","URL","canParse","isValidUrl","Boolean","useServerSideFetch","pasteURL","allowList","length","t4","t5","blob","mimeTypes","type","error","fileName","File","acceptFetchedBlob","url_0","response","fetch","ok","Error","status","blob_0","fetchFileFromClient","t6","url_1","encodeURIComponent","response_0","apiRoute","path","blob_1","fetchFileFromServerProxy","t7","urlOverride","urlToFetch","t8","t9","handleUrlSubmit"],"sources":["../../../src/elements/Upload/useUploadFromUrl.ts"],"sourcesContent":["'use client'\nimport type { SanitizedCollectionConfig } from 'payload'\n\nimport { useModal } from '@faceless-ui/modal'\nimport { formatAdminURL, validateMimeType } from 'payload/shared'\nimport { useCallback, useState } from 'react'\nimport { toast } from 'sonner'\n\nimport { useConfig } from '../../providers/Config/index.js'\nimport { useDocumentInfo } from '../../providers/DocumentInfo/index.js'\nimport { useTranslation } from '../../providers/Translation/index.js'\nimport { useUploadControls } from '../../providers/UploadControls/index.js'\nimport { pasteURLDrawerSlug } from './UploadFromURLModal/index.js'\n\ntype UseUploadFromUrlArgs = {\n readonly collectionSlug: string\n readonly onFileFetched: (file: File) => void\n readonly uploadConfig: Pick<SanitizedCollectionConfig['upload'], 'mimeTypes' | 'pasteURL'>\n}\n\ntype UseUploadFromUrlResult = {\n readonly fileUrl: string\n readonly handleUrlSubmit: (urlOverride?: string) => Promise<boolean>\n readonly isValidUrl: boolean\n readonly setFileUrl: (url: string) => void\n}\n\nconst getFileNameFromUrl = ({\n overrideFileName,\n url,\n}: {\n overrideFileName: null | string\n url: string\n}): string => {\n const rawSegment = url.split('/').pop() || ''\n return overrideFileName || decodeURIComponent(rawSegment.split('?')[0])\n}\n\n/**\n * Shared by the `Upload` and `FileManager` elements to fetch a file from a pasted URL, first\n * attempting a client-side fetch and falling back to a server-side proxy fetch when the\n * collection's `pasteURL.allowList` is configured (needed to work around CORS-restricted URLs).\n */\nexport const useUploadFromUrl = ({\n collectionSlug,\n onFileFetched,\n uploadConfig,\n}: UseUploadFromUrlArgs): UseUploadFromUrlResult => {\n const {\n config: {\n routes: { api },\n },\n } = useConfig()\n const { closeModal } = useModal()\n const { id, setUploadStatus } = useDocumentInfo()\n const { t } = useTranslation()\n const { uploadControlFileName } = useUploadControls()\n\n const [fileUrl, setFileUrl] = useState('')\n\n const isValidUrl = Boolean(fileUrl && URL.canParse(fileUrl))\n\n const useServerSideFetch =\n typeof uploadConfig?.pasteURL === 'object' && uploadConfig.pasteURL.allowList?.length > 0\n\n const acceptFetchedBlob = useCallback(\n ({ blob, url }: { blob: Blob; url: string }): boolean => {\n if (uploadConfig?.mimeTypes?.length && !validateMimeType(blob.type, uploadConfig.mimeTypes)) {\n toast.error(t('error:invalidFileType'))\n setUploadStatus('failed')\n return false\n }\n\n const fileName = getFileNameFromUrl({ overrideFileName: uploadControlFileName, url })\n onFileFetched(new File([blob], fileName, { type: blob.type }))\n setUploadStatus('idle')\n closeModal(pasteURLDrawerSlug)\n setFileUrl('')\n return true\n },\n [closeModal, onFileFetched, setUploadStatus, t, uploadConfig, uploadControlFileName],\n )\n\n const fetchFileFromClient = useCallback(\n async (url: string): Promise<boolean> => {\n const response = await fetch(url)\n\n if (!response.ok) {\n throw new Error(`Fetch failed with status: ${response.status}`)\n }\n\n const blob = await response.blob()\n return acceptFetchedBlob({ blob, url })\n },\n [acceptFetchedBlob],\n )\n\n const fetchFileFromServerProxy = useCallback(\n async (url: string): Promise<boolean> => {\n const pasteURL: `/${string}` = `/${collectionSlug}/paste-url${id ? `/${id}?` : '?'}src=${encodeURIComponent(url)}`\n const response = await fetch(formatAdminURL({ apiRoute: api, path: pasteURL }))\n\n if (!response.ok) {\n throw new Error(`Fetch failed with status: ${response.status}`)\n }\n\n const blob = await response.blob()\n return acceptFetchedBlob({ blob, url })\n },\n [acceptFetchedBlob, api, collectionSlug, id],\n )\n\n const handleUrlSubmit = useCallback(\n async (urlOverride?: string): Promise<boolean> => {\n const urlToFetch = urlOverride ?? fileUrl\n\n if (!urlToFetch || !URL.canParse(urlToFetch) || uploadConfig?.pasteURL === false) {\n return false\n }\n\n setUploadStatus('uploading')\n\n try {\n return await fetchFileFromClient(urlToFetch)\n } catch (_clientError) {\n if (!useServerSideFetch) {\n toast.error(t('error:fileFetchFailed'))\n setUploadStatus('failed')\n return false\n }\n }\n\n try {\n return await fetchFileFromServerProxy(urlToFetch)\n } catch (_serverError) {\n toast.error(t('error:urlNotAllowed'))\n setUploadStatus('failed')\n return false\n }\n },\n [\n fetchFileFromClient,\n fetchFileFromServerProxy,\n fileUrl,\n setUploadStatus,\n t,\n uploadConfig,\n useServerSideFetch,\n ],\n )\n\n return { fileUrl, handleUrlSubmit, isValidUrl, setFileUrl }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
@layer payload-default {
|
|
2
|
+
.upload-dropzone-content {
|
|
3
|
+
display: flex;
|
|
4
|
+
flex-direction: column;
|
|
5
|
+
align-items: center;
|
|
6
|
+
gap: var(--spacer-2);
|
|
7
|
+
width: 100%;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
.upload-dropzone-content__buttons {
|
|
11
|
+
display: flex;
|
|
12
|
+
gap: var(--spacer-2);
|
|
13
|
+
align-items: center;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
.upload-dropzone-content__or-text {
|
|
17
|
+
color: var(--color-text-tertiary);
|
|
18
|
+
text-transform: lowercase;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
.upload-dropzone-content__drag-text {
|
|
22
|
+
flex-shrink: 0;
|
|
23
|
+
margin: 0;
|
|
24
|
+
text-transform: lowercase;
|
|
25
|
+
color: var(--color-text-tertiary);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
.upload-dropzone-content__hidden-input {
|
|
29
|
+
display: none;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import './index.css';
|
|
3
|
+
export type UploadDropzoneContentProps = {
|
|
4
|
+
readonly acceptMimeTypes?: string;
|
|
5
|
+
readonly className?: string;
|
|
6
|
+
/** Extra controls rendered alongside the select/paste buttons, e.g. the single-upload field's custom `UploadControls`. */
|
|
7
|
+
readonly extraControls?: React.ReactNode;
|
|
8
|
+
/** Allows selecting more than one file at once, used by the bulk upload drawer. */
|
|
9
|
+
readonly multiple?: boolean;
|
|
10
|
+
readonly onFilesSelected: (files: FileList) => void;
|
|
11
|
+
readonly onPasteFromClipboard: () => void;
|
|
12
|
+
/** Additional className kept on the paste button for callers with existing selectors depending on it. */
|
|
13
|
+
readonly pasteButtonClassName?: string;
|
|
14
|
+
readonly pasteTooltip: string;
|
|
15
|
+
};
|
|
16
|
+
export declare function UploadDropzoneContent({ acceptMimeTypes, className, extraControls, multiple, onFilesSelected, onPasteFromClipboard, pasteButtonClassName, pasteTooltip, }: UploadDropzoneContentProps): React.JSX.Element;
|
|
17
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/elements/UploadDropzoneContent/index.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,OAAO,CAAA;AAIzB,OAAO,aAAa,CAAA;AAIpB,MAAM,MAAM,0BAA0B,GAAG;IACvC,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAA;IACjC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;IAC3B,0HAA0H;IAC1H,QAAQ,CAAC,aAAa,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IACxC,mFAAmF;IACnF,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;IAC3B,QAAQ,CAAC,eAAe,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,CAAA;IACnD,QAAQ,CAAC,oBAAoB,EAAE,MAAM,IAAI,CAAA;IACzC,yGAAyG;IACzG,QAAQ,CAAC,oBAAoB,CAAC,EAAE,MAAM,CAAA;IACtC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;CAC9B,CAAA;AAED,wBAAgB,qBAAqB,CAAC,EACpC,eAAe,EACf,SAAS,EACT,aAAa,EACb,QAAQ,EACR,eAAe,EACf,oBAAoB,EACpB,oBAAoB,EACpB,YAAY,GACb,EAAE,0BAA0B,qBA0C5B"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
4
|
+
import React from 'react';
|
|
5
|
+
import { useTranslation } from '../../providers/Translation/index.js';
|
|
6
|
+
import { Button } from '../Button/index.js';
|
|
7
|
+
import './index.css';
|
|
8
|
+
const baseClass = 'upload-dropzone-content';
|
|
9
|
+
export function UploadDropzoneContent({
|
|
10
|
+
acceptMimeTypes,
|
|
11
|
+
className,
|
|
12
|
+
extraControls,
|
|
13
|
+
multiple,
|
|
14
|
+
onFilesSelected,
|
|
15
|
+
onPasteFromClipboard,
|
|
16
|
+
pasteButtonClassName,
|
|
17
|
+
pasteTooltip
|
|
18
|
+
}) {
|
|
19
|
+
const {
|
|
20
|
+
t
|
|
21
|
+
} = useTranslation();
|
|
22
|
+
const inputRef = React.useRef(null);
|
|
23
|
+
return /*#__PURE__*/_jsxs("div", {
|
|
24
|
+
className: [baseClass, className].filter(Boolean).join(' '),
|
|
25
|
+
children: [/*#__PURE__*/_jsxs("div", {
|
|
26
|
+
className: `${baseClass}__buttons`,
|
|
27
|
+
children: [/*#__PURE__*/_jsx(Button, {
|
|
28
|
+
buttonStyle: "secondary",
|
|
29
|
+
onClick: () => inputRef.current?.click(),
|
|
30
|
+
size: "medium",
|
|
31
|
+
children: t('upload:selectFile')
|
|
32
|
+
}), /*#__PURE__*/_jsx("input", {
|
|
33
|
+
accept: acceptMimeTypes,
|
|
34
|
+
"aria-hidden": "true",
|
|
35
|
+
className: `${baseClass}__hidden-input`,
|
|
36
|
+
hidden: true,
|
|
37
|
+
multiple: multiple,
|
|
38
|
+
onChange: e => {
|
|
39
|
+
if (e.target.files && e.target.files.length > 0) {
|
|
40
|
+
onFilesSelected(e.target.files);
|
|
41
|
+
}
|
|
42
|
+
},
|
|
43
|
+
ref: inputRef,
|
|
44
|
+
type: "file"
|
|
45
|
+
}), /*#__PURE__*/_jsx("span", {
|
|
46
|
+
className: `${baseClass}__or-text`,
|
|
47
|
+
children: t('general:or')
|
|
48
|
+
}), /*#__PURE__*/_jsx(Button, {
|
|
49
|
+
buttonStyle: "secondary",
|
|
50
|
+
className: [`${baseClass}__pasteFromClipboard`, pasteButtonClassName].filter(Boolean).join(' '),
|
|
51
|
+
icon: "clipboard",
|
|
52
|
+
onClick: onPasteFromClipboard,
|
|
53
|
+
size: "medium",
|
|
54
|
+
tooltip: pasteTooltip
|
|
55
|
+
}), extraControls]
|
|
56
|
+
}), /*#__PURE__*/_jsxs("p", {
|
|
57
|
+
className: `${baseClass}__drag-text`,
|
|
58
|
+
children: [t('general:or'), " ", t('upload:dragAndDrop')]
|
|
59
|
+
})]
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":["React","useTranslation","Button","baseClass","UploadDropzoneContent","acceptMimeTypes","className","extraControls","multiple","onFilesSelected","onPasteFromClipboard","pasteButtonClassName","pasteTooltip","t","inputRef","useRef","_jsxs","filter","Boolean","join","_jsx","buttonStyle","onClick","current","click","size","accept","hidden","onChange","e","target","files","length","ref","type","icon","tooltip"],"sources":["../../../src/elements/UploadDropzoneContent/index.tsx"],"sourcesContent":["'use client'\n\nimport React from 'react'\n\nimport { useTranslation } from '../../providers/Translation/index.js'\nimport { Button } from '../Button/index.js'\nimport './index.css'\n\nconst baseClass = 'upload-dropzone-content'\n\nexport type UploadDropzoneContentProps = {\n readonly acceptMimeTypes?: string\n readonly className?: string\n /** Extra controls rendered alongside the select/paste buttons, e.g. the single-upload field's custom `UploadControls`. */\n readonly extraControls?: React.ReactNode\n /** Allows selecting more than one file at once, used by the bulk upload drawer. */\n readonly multiple?: boolean\n readonly onFilesSelected: (files: FileList) => void\n readonly onPasteFromClipboard: () => void\n /** Additional className kept on the paste button for callers with existing selectors depending on it. */\n readonly pasteButtonClassName?: string\n readonly pasteTooltip: string\n}\n\nexport function UploadDropzoneContent({\n acceptMimeTypes,\n className,\n extraControls,\n multiple,\n onFilesSelected,\n onPasteFromClipboard,\n pasteButtonClassName,\n pasteTooltip,\n}: UploadDropzoneContentProps) {\n const { t } = useTranslation()\n const inputRef = React.useRef<HTMLInputElement>(null)\n\n return (\n <div className={[baseClass, className].filter(Boolean).join(' ')}>\n <div className={`${baseClass}__buttons`}>\n <Button buttonStyle=\"secondary\" onClick={() => inputRef.current?.click()} size=\"medium\">\n {t('upload:selectFile')}\n </Button>\n <input\n accept={acceptMimeTypes}\n aria-hidden=\"true\"\n className={`${baseClass}__hidden-input`}\n hidden\n multiple={multiple}\n onChange={(e) => {\n if (e.target.files && e.target.files.length > 0) {\n onFilesSelected(e.target.files)\n }\n }}\n ref={inputRef}\n type=\"file\"\n />\n <span className={`${baseClass}__or-text`}>{t('general:or')}</span>\n <Button\n buttonStyle=\"secondary\"\n className={[`${baseClass}__pasteFromClipboard`, pasteButtonClassName]\n .filter(Boolean)\n .join(' ')}\n icon=\"clipboard\"\n onClick={onPasteFromClipboard}\n size=\"medium\"\n tooltip={pasteTooltip}\n />\n {extraControls}\n </div>\n <p className={`${baseClass}__drag-text`}>\n {t('general:or')} {t('upload:dragAndDrop')}\n </p>\n </div>\n )\n}\n"],"mappings":"AAAA;;;AAEA,OAAOA,KAAA,MAAW;AAElB,SAASC,cAAc,QAAQ;AAC/B,SAASC,MAAM,QAAQ;AACvB,OAAO;AAEP,MAAMC,SAAA,GAAY;AAgBlB,OAAO,SAASC,sBAAsB;EACpCC,eAAe;EACfC,SAAS;EACTC,aAAa;EACbC,QAAQ;EACRC,eAAe;EACfC,oBAAoB;EACpBC,oBAAoB;EACpBC;AAAY,CACe;EAC3B,MAAM;IAAEC;EAAC,CAAE,GAAGZ,cAAA;EACd,MAAMa,QAAA,GAAWd,KAAA,CAAMe,MAAM,CAAmB;EAEhD,oBACEC,KAAA,CAAC;IAAIV,SAAA,EAAW,CAACH,SAAA,EAAWG,SAAA,CAAU,CAACW,MAAM,CAACC,OAAA,EAASC,IAAI,CAAC;4BAC1DH,KAAA,CAAC;MAAIV,SAAA,EAAW,GAAGH,SAAA,WAAoB;8BACrCiB,IAAA,CAAClB,MAAA;QAAOmB,WAAA,EAAY;QAAYC,OAAA,EAASA,CAAA,KAAMR,QAAA,CAASS,OAAO,EAAEC,KAAA;QAASC,IAAA,EAAK;kBAC5EZ,CAAA,CAAE;uBAELO,IAAA,CAAC;QACCM,MAAA,EAAQrB,eAAA;QACR,eAAY;QACZC,SAAA,EAAW,GAAGH,SAAA,gBAAyB;QACvCwB,MAAM;QACNnB,QAAA,EAAUA,QAAA;QACVoB,QAAA,EAAWC,CAAA;UACT,IAAIA,CAAA,CAAEC,MAAM,CAACC,KAAK,IAAIF,CAAA,CAAEC,MAAM,CAACC,KAAK,CAACC,MAAM,GAAG,GAAG;YAC/CvB,eAAA,CAAgBoB,CAAA,CAAEC,MAAM,CAACC,KAAK;UAChC;QACF;QACAE,GAAA,EAAKnB,QAAA;QACLoB,IAAA,EAAK;uBAEPd,IAAA,CAAC;QAAKd,SAAA,EAAW,GAAGH,SAAA,WAAoB;kBAAGU,CAAA,CAAE;uBAC7CO,IAAA,CAAClB,MAAA;QACCmB,WAAA,EAAY;QACZf,SAAA,EAAW,CAAC,GAAGH,SAAA,sBAA+B,EAAEQ,oBAAA,CAAqB,CAClEM,MAAM,CAACC,OAAA,EACPC,IAAI,CAAC;QACRgB,IAAA,EAAK;QACLb,OAAA,EAASZ,oBAAA;QACTe,IAAA,EAAK;QACLW,OAAA,EAASxB;UAEVL,aAAA;qBAEHS,KAAA,CAAC;MAAEV,SAAA,EAAW,GAAGH,SAAA,aAAsB;iBACpCU,CAAA,CAAE,eAAc,KAAEA,CAAA,CAAE;;;AAI7B","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["formatAdminURL","qs","React","useCallback","useEffect","useReducer","useState","useDebounce","useEffectEvent","useConfig","useLocale","useTranslation","ReactSelect","optionsReducer","baseClass","maxResultsPerRequest","RelationshipFilter","props","disabled","field","admin","hasMany","relationTo","filterOptions","onChange","operator","value","placeholder","undefined","isSortable","isMultiValue","includes","config","routes","api","getEntityConfig","hasMultipleRelations","Array","isArray","options","dispatchOptions","search","setSearch","debouncedSearch","errorLoading","setErrorLoading","hasLoadedFirstOptions","setHasLoadedFirstOptions","i18n","t","locale","relationSlugs","loadedRelationships","useRef","Map","map","relation","hasLoadedAll","nextPage","addOptions","data","collection","collectionSlug","type","loadOptions","abortController","relationSlug","loadedRelationship","current","get","fieldToSearch","useAsTitle","where","and","query","depth","limit","code","page","select","push","like","response","fetch","apiRoute","path","stringify","addQueryPrefix","credentials","headers","language","signal","ok","json","docs","length","set","e","aborted","console","error","handleScrollToBottom","relationshipToLoad","entries","next","AbortController","findOptionsByValue","val","matchedOption","forEach","opt","some","subOpt","find","valueWithRelation","handleInputChange","input","required","addOptionByID","id","relations","abortControllers","controller","abort","_err","matchedOptions","option","i","classes","filter","Boolean","join","valueToRender","_jsx","className","isMulti","selected","onInputChange","onMenuScrollToBottom"],"sources":["../../../../../src/elements/WhereBuilder/Condition/Relationship/index.tsx"],"sourcesContent":["'use client'\nimport type { PaginatedDocs, Where } from 'payload'\n\nimport { formatAdminURL } from 'payload/shared'\nimport * as qs from 'qs-esm'\nimport React, { useCallback, useEffect, useReducer, useState } from 'react'\n\nimport type { Option } from '../../../ReactSelect/types.js'\nimport type { RelationshipFilterProps as Props, ValueWithRelation } from './types.js'\n\nimport { useDebounce } from '../../../../hooks/useDebounce.js'\nimport { useEffectEvent } from '../../../../hooks/useEffectEvent.js'\nimport { useConfig } from '../../../../providers/Config/index.js'\nimport { useLocale } from '../../../../providers/Locale/index.js'\nimport { useTranslation } from '../../../../providers/Translation/index.js'\nimport { ReactSelect } from '../../../ReactSelect/index.js'\nimport './index.css'\nimport optionsReducer from './optionsReducer.js'\n\nconst baseClass = 'condition-value-relationship'\n\nconst maxResultsPerRequest = 10\n\nexport const RelationshipFilter: React.FC<Props> = (props) => {\n const {\n disabled,\n field: { admin = {}, hasMany, relationTo },\n filterOptions,\n onChange,\n operator,\n value,\n } = props\n\n const placeholder = 'placeholder' in admin ? admin?.placeholder : undefined\n const isSortable = admin?.isSortable\n\n const isMultiValue = hasMany || ['in', 'not_in'].includes(operator)\n\n const {\n config: {\n routes: { api },\n },\n getEntityConfig,\n } = useConfig()\n\n const hasMultipleRelations = Array.isArray(relationTo)\n const [options, dispatchOptions] = useReducer(optionsReducer, [])\n const [search, setSearch] = useState('')\n const debouncedSearch = useDebounce(search, 300)\n const [errorLoading, setErrorLoading] = useState('')\n const [hasLoadedFirstOptions, setHasLoadedFirstOptions] = useState(false)\n const { i18n, t } = useTranslation()\n const locale = useLocale()\n\n const relationSlugs = hasMultipleRelations ? relationTo : [relationTo]\n\n const loadedRelationships = React.useRef<\n Map<\n string,\n {\n hasLoadedAll: boolean\n nextPage: number\n }\n >\n >(\n new Map(\n relationSlugs.map((relation) => [\n relation,\n {\n hasLoadedAll: false,\n nextPage: 1,\n },\n ]),\n ),\n )\n\n const addOptions = useCallback(\n (data, relation) => {\n const collection = getEntityConfig({ collectionSlug: relation })\n dispatchOptions({ type: 'ADD', collection, data, hasMultipleRelations, i18n, relation })\n },\n [hasMultipleRelations, i18n, getEntityConfig],\n )\n\n const loadOptions = useEffectEvent(\n async ({\n abortController,\n relationSlug,\n }: {\n abortController: AbortController\n relationSlug: string\n }) => {\n const loadedRelationship = loadedRelationships.current.get(relationSlug)\n\n if (relationSlug && !loadedRelationship.hasLoadedAll) {\n const collection = getEntityConfig({\n collectionSlug: relationSlug,\n })\n\n const fieldToSearch = collection?.admin?.useAsTitle || 'id'\n\n const where: Where = {\n and: [],\n }\n\n const query = {\n depth: 0,\n limit: maxResultsPerRequest,\n locale: locale.code,\n page: loadedRelationship.nextPage,\n select: {\n [fieldToSearch]: true,\n },\n where,\n }\n\n if (filterOptions && filterOptions?.[relationSlug]) {\n query.where.and.push(filterOptions[relationSlug])\n }\n\n if (debouncedSearch) {\n query.where.and.push({\n [fieldToSearch]: {\n like: debouncedSearch,\n },\n })\n }\n\n try {\n const response = await fetch(\n formatAdminURL({\n apiRoute: api,\n path: `/${relationSlug}${qs.stringify(query, { addQueryPrefix: true })}`,\n }),\n {\n credentials: 'include',\n headers: {\n 'Accept-Language': i18n.language,\n },\n signal: abortController.signal,\n },\n )\n\n if (response.ok) {\n const data: PaginatedDocs = await response.json()\n if (data.docs.length > 0) {\n addOptions(data, relationSlug)\n\n if (data.nextPage) {\n loadedRelationships.current.set(relationSlug, {\n hasLoadedAll: false,\n nextPage: data.nextPage,\n })\n } else {\n loadedRelationships.current.set(relationSlug, {\n hasLoadedAll: true,\n nextPage: null,\n })\n }\n }\n } else {\n setErrorLoading(t('error:unspecific'))\n }\n } catch (e) {\n if (!abortController.signal.aborted) {\n console.error(e) // eslint-disable-line no-console\n }\n }\n }\n\n setHasLoadedFirstOptions(true)\n },\n )\n\n const handleScrollToBottom = React.useCallback(() => {\n const relationshipToLoad = loadedRelationships.current.entries().next().value\n\n if (relationshipToLoad[0] && !relationshipToLoad[1].hasLoadedAll) {\n const abortController = new AbortController()\n\n void loadOptions({\n abortController,\n relationSlug: relationshipToLoad[0],\n })\n }\n }, [])\n\n const findOptionsByValue = useCallback((): Option | Option[] => {\n if (value) {\n if (isMultiValue) {\n if (Array.isArray(value)) {\n return value.map((val) => {\n if (hasMultipleRelations) {\n let matchedOption: Option\n\n options.forEach((opt) => {\n if (opt.options) {\n opt.options.some((subOpt) => {\n if (subOpt?.value == val.value) {\n matchedOption = subOpt\n return true\n }\n\n return false\n })\n }\n })\n\n return matchedOption\n }\n\n return options.find((opt) => opt.value == val)\n })\n }\n\n return undefined\n }\n\n if (hasMultipleRelations) {\n let matchedOption: Option\n\n const valueWithRelation = value as ValueWithRelation\n\n options.forEach((opt) => {\n if (opt?.options) {\n opt.options.some((subOpt) => {\n if (subOpt?.value == valueWithRelation.value) {\n matchedOption = subOpt\n return true\n }\n return false\n })\n }\n })\n\n return matchedOption\n }\n\n return options.find((opt) => opt.value == value)\n }\n\n return undefined\n }, [isMultiValue, hasMultipleRelations, value, options])\n\n const handleInputChange = useCallback(\n (input: string) => {\n if (input !== search) {\n dispatchOptions({ type: 'CLEAR', i18n, required: false })\n\n const relationSlugs = Array.isArray(relationTo) ? relationTo : [relationTo]\n\n loadedRelationships.current = new Map(\n relationSlugs.map((relation) => [\n relation,\n {\n hasLoadedAll: false,\n nextPage: 1,\n },\n ]),\n )\n\n setSearch(input)\n }\n },\n [i18n, relationTo, search],\n )\n\n const addOptionByID = useCallback(\n async (id, relation) => {\n if (!errorLoading && id !== 'null' && id && relation) {\n const response = await fetch(\n formatAdminURL({ apiRoute: api, path: `/${relation}/${id}?depth=0` }),\n {\n credentials: 'include',\n headers: {\n 'Accept-Language': i18n.language,\n },\n },\n )\n\n if (response.ok) {\n const data = await response.json()\n addOptions({ docs: [data] }, relation)\n } else {\n // eslint-disable-next-line no-console\n console.error(t('error:loadingDocument', { id }))\n }\n }\n },\n [i18n, addOptions, api, errorLoading, t],\n )\n\n /**\n * When `relationTo` changes externally, reset the options and reload them from scratch\n * The `loadOptions` dependency is a useEffectEvent which has no dependencies of its own\n * This means we can safely depend on it without it triggering this effect to run\n * This is useful because this effect should _only_ run when `relationTo` changes\n */\n useEffect(() => {\n const relations = Array.isArray(relationTo) ? relationTo : [relationTo]\n\n loadedRelationships.current = new Map(\n relations.map((relation) => [\n relation,\n {\n hasLoadedAll: false,\n nextPage: 1,\n },\n ]),\n )\n\n dispatchOptions({ type: 'CLEAR', i18n, required: false })\n setHasLoadedFirstOptions(false)\n\n const abortControllers: AbortController[] = []\n\n relations.forEach((relation) => {\n const abortController = new AbortController()\n\n void loadOptions({\n abortController,\n relationSlug: relation,\n })\n\n abortControllers.push(abortController)\n })\n\n return () => {\n abortControllers.forEach((controller) => {\n if (controller.signal) {\n try {\n controller.abort()\n } catch (_err) {\n // swallow error\n }\n }\n })\n }\n }, [i18n, relationTo, debouncedSearch, filterOptions])\n\n /**\n * Load any other options that might exist in the value that were not loaded already\n */\n useEffect(() => {\n if (value && hasLoadedFirstOptions) {\n if (isMultiValue) {\n const matchedOptions = findOptionsByValue()\n\n ;((matchedOptions as Option[]) || []).forEach((option, i) => {\n if (!option) {\n if (hasMultipleRelations) {\n void addOptionByID(value[i].value, value[i].relationTo)\n } else {\n void addOptionByID(value[i], relationTo)\n }\n }\n })\n } else {\n const matchedOption = findOptionsByValue()\n\n if (!matchedOption) {\n if (hasMultipleRelations) {\n const valueWithRelation = value as ValueWithRelation\n void addOptionByID(valueWithRelation.value, valueWithRelation.relationTo)\n } else {\n void addOptionByID(value, relationTo)\n }\n }\n }\n }\n }, [\n addOptionByID,\n findOptionsByValue,\n isMultiValue,\n hasMultipleRelations,\n relationTo,\n value,\n hasLoadedFirstOptions,\n ])\n\n const classes = ['field-type', baseClass, errorLoading && 'error-loading']\n .filter(Boolean)\n .join(' ')\n\n const valueToRender = (findOptionsByValue() || value) as Option\n\n return (\n <div className={classes}>\n {errorLoading ? (\n <div className={`${baseClass}__error-loading`}>{errorLoading}</div>\n ) : (\n <ReactSelect\n disabled={disabled}\n isMulti={isMultiValue}\n isSortable={isSortable}\n onChange={(selected) => {\n if (!selected) {\n onChange(null)\n return\n }\n\n if (isMultiValue && Array.isArray(selected)) {\n onChange(\n selected\n ? selected.map((option) => {\n if (hasMultipleRelations) {\n return {\n relationTo: option?.relationTo,\n value: option?.value,\n }\n }\n\n return option?.value\n })\n : null,\n )\n } else if (hasMultipleRelations && !Array.isArray(selected)) {\n onChange({\n relationTo: selected?.relationTo,\n value: selected?.value,\n })\n } else if (!Array.isArray(selected)) {\n onChange(selected?.value)\n }\n }}\n onInputChange={handleInputChange}\n onMenuScrollToBottom={handleScrollToBottom}\n options={options}\n placeholder={placeholder}\n value={valueToRender}\n />\n )}\n </div>\n )\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"index.js","names":["formatAdminURL","qs","React","useCallback","useEffect","useReducer","useState","useDebounce","useEffectEvent","useConfig","useLocale","useTranslation","ReactSelect","optionsReducer","baseClass","maxResultsPerRequest","RelationshipFilter","props","disabled","field","admin","hasMany","relationTo","filterOptions","onChange","operator","value","placeholder","undefined","isSortable","isMultiValue","includes","config","routes","api","getEntityConfig","hasMultipleRelations","Array","isArray","options","dispatchOptions","search","setSearch","debouncedSearch","errorLoading","setErrorLoading","hasLoadedFirstOptions","setHasLoadedFirstOptions","i18n","t","locale","relationSlugs","loadedRelationships","useRef","Map","map","relation","hasLoadedAll","nextPage","addOptions","data","collection","collectionSlug","type","loadOptions","abortController","relationSlug","loadedRelationship","current","get","fieldToSearch","useAsTitle","where","and","query","depth","limit","code","page","select","push","like","response","fetch","apiRoute","path","stringify","addQueryPrefix","credentials","headers","language","signal","ok","json","docs","length","set","e","aborted","console","error","handleScrollToBottom","relationshipToLoad","entries","next","AbortController","findOptionsByValue","val","matchedOption","forEach","opt","some","subOpt","find","valueWithRelation","handleInputChange","input","required","addOptionByID","id","relations","abortControllers","controller","abort","_err","matchedOptions","option","i","classes","filter","Boolean","join","valueToRender","_jsx","className","isMulti","selected","onInputChange","onMenuScrollToBottom"],"sources":["../../../../../src/elements/WhereBuilder/Condition/Relationship/index.tsx"],"sourcesContent":["'use client'\nimport type { PaginatedDocs, Where } from 'payload'\n\nimport { formatAdminURL } from 'payload/shared'\nimport * as qs from 'qs-esm'\nimport React, { useCallback, useEffect, useReducer, useState } from 'react'\n\nimport type { Option } from '../../../ReactSelect/types.js'\nimport type { RelationshipFilterProps as Props, ValueWithRelation } from './types.js'\n\nimport { useDebounce } from '../../../../hooks/useDebounce.js'\nimport { useEffectEvent } from '../../../../hooks/useEffectEvent.js'\nimport { useConfig } from '../../../../providers/Config/index.js'\nimport { useLocale } from '../../../../providers/Locale/index.js'\nimport { useTranslation } from '../../../../providers/Translation/index.js'\nimport { ReactSelect } from '../../../ReactSelect/index.js'\nimport './index.css'\nimport optionsReducer from './optionsReducer.js'\n\nconst baseClass = 'condition-value-relationship'\n\nconst maxResultsPerRequest = 10\n\nexport const RelationshipFilter: React.FC<Props> = (props) => {\n const {\n disabled,\n field: { admin = {}, hasMany, relationTo },\n filterOptions,\n onChange,\n operator,\n value,\n } = props\n\n const placeholder = 'placeholder' in admin ? admin?.placeholder : undefined\n const isSortable = admin?.isSortable\n\n const isMultiValue = hasMany || ['in', 'not_in'].includes(operator)\n\n const {\n config: {\n routes: { api },\n },\n getEntityConfig,\n } = useConfig()\n\n const hasMultipleRelations = Array.isArray(relationTo)\n const [options, dispatchOptions] = useReducer(optionsReducer, [])\n const [search, setSearch] = useState('')\n const debouncedSearch = useDebounce(search, 300)\n const [errorLoading, setErrorLoading] = useState('')\n const [hasLoadedFirstOptions, setHasLoadedFirstOptions] = useState(false)\n const { i18n, t } = useTranslation()\n const locale = useLocale()\n\n const relationSlugs = hasMultipleRelations ? relationTo : [relationTo]\n\n const loadedRelationships = React.useRef<\n Map<\n string,\n {\n hasLoadedAll: boolean\n nextPage: number\n }\n >\n >(\n new Map(\n relationSlugs.map((relation) => [\n relation,\n {\n hasLoadedAll: false,\n nextPage: 1,\n },\n ]),\n ),\n )\n\n const addOptions = useCallback(\n (data, relation) => {\n const collection = getEntityConfig({ collectionSlug: relation })\n dispatchOptions({ type: 'ADD', collection, data, hasMultipleRelations, i18n, relation })\n },\n [hasMultipleRelations, i18n, getEntityConfig],\n )\n\n const loadOptions = useEffectEvent(\n async ({\n abortController,\n relationSlug,\n }: {\n abortController: AbortController\n relationSlug: string\n }) => {\n const loadedRelationship = loadedRelationships.current.get(relationSlug)\n\n if (relationSlug && !loadedRelationship.hasLoadedAll) {\n const collection = getEntityConfig({\n collectionSlug: relationSlug,\n })\n\n const fieldToSearch = collection?.admin?.useAsTitle || 'id'\n\n const where: Where = {\n and: [],\n }\n\n const query = {\n depth: 0,\n limit: maxResultsPerRequest,\n locale: locale?.code,\n page: loadedRelationship.nextPage,\n select: {\n [fieldToSearch]: true,\n },\n where,\n }\n\n if (filterOptions && filterOptions?.[relationSlug]) {\n query.where.and.push(filterOptions[relationSlug])\n }\n\n if (debouncedSearch) {\n query.where.and.push({\n [fieldToSearch]: {\n like: debouncedSearch,\n },\n })\n }\n\n try {\n const response = await fetch(\n formatAdminURL({\n apiRoute: api,\n path: `/${relationSlug}${qs.stringify(query, { addQueryPrefix: true })}`,\n }),\n {\n credentials: 'include',\n headers: {\n 'Accept-Language': i18n.language,\n },\n signal: abortController.signal,\n },\n )\n\n if (response.ok) {\n const data: PaginatedDocs = await response.json()\n if (data.docs.length > 0) {\n addOptions(data, relationSlug)\n\n if (data.nextPage) {\n loadedRelationships.current.set(relationSlug, {\n hasLoadedAll: false,\n nextPage: data.nextPage,\n })\n } else {\n loadedRelationships.current.set(relationSlug, {\n hasLoadedAll: true,\n nextPage: null,\n })\n }\n }\n } else {\n setErrorLoading(t('error:unspecific'))\n }\n } catch (e) {\n if (!abortController.signal.aborted) {\n console.error(e) // eslint-disable-line no-console\n }\n }\n }\n\n setHasLoadedFirstOptions(true)\n },\n )\n\n const handleScrollToBottom = React.useCallback(() => {\n const relationshipToLoad = loadedRelationships.current.entries().next().value\n\n if (relationshipToLoad[0] && !relationshipToLoad[1].hasLoadedAll) {\n const abortController = new AbortController()\n\n void loadOptions({\n abortController,\n relationSlug: relationshipToLoad[0],\n })\n }\n }, [])\n\n const findOptionsByValue = useCallback((): Option | Option[] => {\n if (value) {\n if (isMultiValue) {\n if (Array.isArray(value)) {\n return value.map((val) => {\n if (hasMultipleRelations) {\n let matchedOption: Option\n\n options.forEach((opt) => {\n if (opt.options) {\n opt.options.some((subOpt) => {\n if (subOpt?.value == val.value) {\n matchedOption = subOpt\n return true\n }\n\n return false\n })\n }\n })\n\n return matchedOption\n }\n\n return options.find((opt) => opt.value == val)\n })\n }\n\n return undefined\n }\n\n if (hasMultipleRelations) {\n let matchedOption: Option\n\n const valueWithRelation = value as ValueWithRelation\n\n options.forEach((opt) => {\n if (opt?.options) {\n opt.options.some((subOpt) => {\n if (subOpt?.value == valueWithRelation.value) {\n matchedOption = subOpt\n return true\n }\n return false\n })\n }\n })\n\n return matchedOption\n }\n\n return options.find((opt) => opt.value == value)\n }\n\n return undefined\n }, [isMultiValue, hasMultipleRelations, value, options])\n\n const handleInputChange = useCallback(\n (input: string) => {\n if (input !== search) {\n dispatchOptions({ type: 'CLEAR', i18n, required: false })\n\n const relationSlugs = Array.isArray(relationTo) ? relationTo : [relationTo]\n\n loadedRelationships.current = new Map(\n relationSlugs.map((relation) => [\n relation,\n {\n hasLoadedAll: false,\n nextPage: 1,\n },\n ]),\n )\n\n setSearch(input)\n }\n },\n [i18n, relationTo, search],\n )\n\n const addOptionByID = useCallback(\n async (id, relation) => {\n if (!errorLoading && id !== 'null' && id && relation) {\n const response = await fetch(\n formatAdminURL({ apiRoute: api, path: `/${relation}/${id}?depth=0` }),\n {\n credentials: 'include',\n headers: {\n 'Accept-Language': i18n.language,\n },\n },\n )\n\n if (response.ok) {\n const data = await response.json()\n addOptions({ docs: [data] }, relation)\n } else {\n // eslint-disable-next-line no-console\n console.error(t('error:loadingDocument', { id }))\n }\n }\n },\n [i18n, addOptions, api, errorLoading, t],\n )\n\n /**\n * When `relationTo` changes externally, reset the options and reload them from scratch\n * The `loadOptions` dependency is a useEffectEvent which has no dependencies of its own\n * This means we can safely depend on it without it triggering this effect to run\n * This is useful because this effect should _only_ run when `relationTo` changes\n */\n useEffect(() => {\n const relations = Array.isArray(relationTo) ? relationTo : [relationTo]\n\n loadedRelationships.current = new Map(\n relations.map((relation) => [\n relation,\n {\n hasLoadedAll: false,\n nextPage: 1,\n },\n ]),\n )\n\n dispatchOptions({ type: 'CLEAR', i18n, required: false })\n setHasLoadedFirstOptions(false)\n\n const abortControllers: AbortController[] = []\n\n relations.forEach((relation) => {\n const abortController = new AbortController()\n\n void loadOptions({\n abortController,\n relationSlug: relation,\n })\n\n abortControllers.push(abortController)\n })\n\n return () => {\n abortControllers.forEach((controller) => {\n if (controller.signal) {\n try {\n controller.abort()\n } catch (_err) {\n // swallow error\n }\n }\n })\n }\n }, [i18n, relationTo, debouncedSearch, filterOptions])\n\n /**\n * Load any other options that might exist in the value that were not loaded already\n */\n useEffect(() => {\n if (value && hasLoadedFirstOptions) {\n if (isMultiValue) {\n const matchedOptions = findOptionsByValue()\n\n ;((matchedOptions as Option[]) || []).forEach((option, i) => {\n if (!option) {\n if (hasMultipleRelations) {\n void addOptionByID(value[i].value, value[i].relationTo)\n } else {\n void addOptionByID(value[i], relationTo)\n }\n }\n })\n } else {\n const matchedOption = findOptionsByValue()\n\n if (!matchedOption) {\n if (hasMultipleRelations) {\n const valueWithRelation = value as ValueWithRelation\n void addOptionByID(valueWithRelation.value, valueWithRelation.relationTo)\n } else {\n void addOptionByID(value, relationTo)\n }\n }\n }\n }\n }, [\n addOptionByID,\n findOptionsByValue,\n isMultiValue,\n hasMultipleRelations,\n relationTo,\n value,\n hasLoadedFirstOptions,\n ])\n\n const classes = ['field-type', baseClass, errorLoading && 'error-loading']\n .filter(Boolean)\n .join(' ')\n\n const valueToRender = (findOptionsByValue() || value) as Option\n\n return (\n <div className={classes}>\n {errorLoading ? (\n <div className={`${baseClass}__error-loading`}>{errorLoading}</div>\n ) : (\n <ReactSelect\n disabled={disabled}\n isMulti={isMultiValue}\n isSortable={isSortable}\n onChange={(selected) => {\n if (!selected) {\n onChange(null)\n return\n }\n\n if (isMultiValue && Array.isArray(selected)) {\n onChange(\n selected\n ? selected.map((option) => {\n if (hasMultipleRelations) {\n return {\n relationTo: option?.relationTo,\n value: option?.value,\n }\n }\n\n return option?.value\n })\n : null,\n )\n } else if (hasMultipleRelations && !Array.isArray(selected)) {\n onChange({\n relationTo: selected?.relationTo,\n value: selected?.value,\n })\n } else if (!Array.isArray(selected)) {\n onChange(selected?.value)\n }\n }}\n onInputChange={handleInputChange}\n onMenuScrollToBottom={handleScrollToBottom}\n options={options}\n placeholder={placeholder}\n value={valueToRender}\n />\n )}\n </div>\n )\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { UpdateCondition } from './types.js';
|
|
2
|
+
type UpdateType = Parameters<UpdateCondition>[0]['type'];
|
|
3
|
+
/**
|
|
4
|
+
* A row that holds no value yet. Empty arrives as `''` from the URL, `null` from a cleared
|
|
5
|
+
* select, or `undefined` from a row that was added but never filled in.
|
|
6
|
+
*/
|
|
7
|
+
export declare const isEmptyConditionValue: ({ value }: {
|
|
8
|
+
value: unknown;
|
|
9
|
+
}) => boolean;
|
|
10
|
+
/**
|
|
11
|
+
* The value a row renders with. Only a missing value becomes `undefined`. `0` and `false` are
|
|
12
|
+
* real filter values, so they must survive.
|
|
13
|
+
*/
|
|
14
|
+
export declare const getDisplayedConditionValue: <T>({ value }: {
|
|
15
|
+
value: T;
|
|
16
|
+
}) => T | undefined;
|
|
17
|
+
/**
|
|
18
|
+
* Whether an edit leaves the row unchanged, and so must not be committed.
|
|
19
|
+
*
|
|
20
|
+
* An empty row renders blank and reports `undefined` back up as soon as it mounts. Committing
|
|
21
|
+
* that stores `{ [operator]: undefined }`, which `qs.stringify` drops when the query is written
|
|
22
|
+
* to the URL — so the row is gone on the next parse.
|
|
23
|
+
*
|
|
24
|
+
* Field and operator edits change the row even while it holds no value, so they always commit.
|
|
25
|
+
*/
|
|
26
|
+
export declare const isNoOpConditionValueUpdate: ({ type, incomingValue, storedValue, }: {
|
|
27
|
+
incomingValue: unknown;
|
|
28
|
+
storedValue: unknown;
|
|
29
|
+
type: UpdateType;
|
|
30
|
+
}) => boolean;
|
|
31
|
+
export {};
|
|
32
|
+
//# sourceMappingURL=conditionValue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conditionValue.d.ts","sourceRoot":"","sources":["../../../src/elements/WhereBuilder/conditionValue.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAEjD,KAAK,UAAU,GAAG,UAAU,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAA;AAExD;;;GAGG;AACH,eAAO,MAAM,qBAAqB,cAAe;IAAE,KAAK,EAAE,OAAO,CAAA;CAAE,KAAG,OACf,CAAA;AAEvD;;;GAGG;AACH,eAAO,MAAM,0BAA0B,GAAI,CAAC,aAAa;IAAE,KAAK,EAAE,CAAC,CAAA;CAAE,KAAG,CAAC,GAAG,SACxD,CAAA;AAEpB;;;;;;;;GAQG;AACH,eAAO,MAAM,0BAA0B,0CAIpC;IACD,aAAa,EAAE,OAAO,CAAA;IACtB,WAAW,EAAE,OAAO,CAAA;IACpB,IAAI,EAAE,UAAU,CAAA;CACjB,KAAG,OAG6C,CAAA"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A row that holds no value yet. Empty arrives as `''` from the URL, `null` from a cleared
|
|
3
|
+
* select, or `undefined` from a row that was added but never filled in.
|
|
4
|
+
*/export const isEmptyConditionValue = ({
|
|
5
|
+
value
|
|
6
|
+
}) => value === undefined || value === null || value === '';
|
|
7
|
+
/**
|
|
8
|
+
* The value a row renders with. Only a missing value becomes `undefined`. `0` and `false` are
|
|
9
|
+
* real filter values, so they must survive.
|
|
10
|
+
*/
|
|
11
|
+
export const getDisplayedConditionValue = ({
|
|
12
|
+
value
|
|
13
|
+
}) => value ?? undefined;
|
|
14
|
+
/**
|
|
15
|
+
* Whether an edit leaves the row unchanged, and so must not be committed.
|
|
16
|
+
*
|
|
17
|
+
* An empty row renders blank and reports `undefined` back up as soon as it mounts. Committing
|
|
18
|
+
* that stores `{ [operator]: undefined }`, which `qs.stringify` drops when the query is written
|
|
19
|
+
* to the URL — so the row is gone on the next parse.
|
|
20
|
+
*
|
|
21
|
+
* Field and operator edits change the row even while it holds no value, so they always commit.
|
|
22
|
+
*/
|
|
23
|
+
export const isNoOpConditionValueUpdate = ({
|
|
24
|
+
type,
|
|
25
|
+
incomingValue,
|
|
26
|
+
storedValue
|
|
27
|
+
}) => type === 'value' && isEmptyConditionValue({
|
|
28
|
+
value: storedValue
|
|
29
|
+
}) && isEmptyConditionValue({
|
|
30
|
+
value: incomingValue
|
|
31
|
+
});
|
|
32
|
+
//# sourceMappingURL=conditionValue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conditionValue.js","names":["isEmptyConditionValue","value","undefined","getDisplayedConditionValue","isNoOpConditionValueUpdate","type","incomingValue","storedValue"],"sources":["../../../src/elements/WhereBuilder/conditionValue.ts"],"sourcesContent":["import type { UpdateCondition } from './types.js'\n\ntype UpdateType = Parameters<UpdateCondition>[0]['type']\n\n/**\n * A row that holds no value yet. Empty arrives as `''` from the URL, `null` from a cleared\n * select, or `undefined` from a row that was added but never filled in.\n */\nexport const isEmptyConditionValue = ({ value }: { value: unknown }): boolean =>\n value === undefined || value === null || value === ''\n\n/**\n * The value a row renders with. Only a missing value becomes `undefined`. `0` and `false` are\n * real filter values, so they must survive.\n */\nexport const getDisplayedConditionValue = <T>({ value }: { value: T }): T | undefined =>\n value ?? undefined\n\n/**\n * Whether an edit leaves the row unchanged, and so must not be committed.\n *\n * An empty row renders blank and reports `undefined` back up as soon as it mounts. Committing\n * that stores `{ [operator]: undefined }`, which `qs.stringify` drops when the query is written\n * to the URL — so the row is gone on the next parse.\n *\n * Field and operator edits change the row even while it holds no value, so they always commit.\n */\nexport const isNoOpConditionValueUpdate = ({\n type,\n incomingValue,\n storedValue,\n}: {\n incomingValue: unknown\n storedValue: unknown\n type: UpdateType\n}): boolean =>\n type === 'value' &&\n isEmptyConditionValue({ value: storedValue }) &&\n isEmptyConditionValue({ value: incomingValue })\n"],"mappings":"AAIA;;;GAIA,OAAO,MAAMA,qBAAA,GAAwBA,CAAC;EAAEC;AAAK,CAAsB,KACjEA,KAAA,KAAUC,SAAA,IAAaD,KAAA,KAAU,QAAQA,KAAA,KAAU;AAErD;;;;AAIA,OAAO,MAAME,0BAAA,GAA6BA,CAAI;EAAEF;AAAK,CAAgB,KACnEA,KAAA,IAASC,SAAA;AAEX;;;;;;;;;AASA,OAAO,MAAME,0BAAA,GAA6BA,CAAC;EACzCC,IAAI;EACJC,aAAa;EACbC;AAAW,CAKZ,KACCF,IAAA,KAAS,WACTL,qBAAA,CAAsB;EAAEC,KAAA,EAAOM;AAAY,MAC3CP,qBAAA,CAAsB;EAAEC,KAAA,EAAOK;AAAc","ignoreList":[]}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { getDisplayedConditionValue, isEmptyConditionValue, isNoOpConditionValueUpdate } from './conditionValue.js';
|
|
3
|
+
describe('isEmptyConditionValue', () => {
|
|
4
|
+
it.each([['undefined', undefined], ['null', null], ['an empty string', '']])('should treat %s as empty', (_label, value) => {
|
|
5
|
+
expect(isEmptyConditionValue({
|
|
6
|
+
value
|
|
7
|
+
})).toBe(true);
|
|
8
|
+
});
|
|
9
|
+
it.each([['a string', 'option1'], ['zero', 0], ['false', false]])('should treat %s as a real value', (_label, value) => {
|
|
10
|
+
expect(isEmptyConditionValue({
|
|
11
|
+
value
|
|
12
|
+
})).toBe(false);
|
|
13
|
+
});
|
|
14
|
+
});
|
|
15
|
+
describe('getDisplayedConditionValue', () => {
|
|
16
|
+
it.each([['undefined', undefined], ['null', null]])('should display %s as no value', (_label, value) => {
|
|
17
|
+
expect(getDisplayedConditionValue({
|
|
18
|
+
value
|
|
19
|
+
})).toBeUndefined();
|
|
20
|
+
});
|
|
21
|
+
it.each([['zero', 0], ['false', false], ['an empty string', ''], ['a string', 'option1']])('should display %s as itself', (_label, value) => {
|
|
22
|
+
expect(getDisplayedConditionValue({
|
|
23
|
+
value
|
|
24
|
+
})).toBe(value);
|
|
25
|
+
});
|
|
26
|
+
});
|
|
27
|
+
describe('isNoOpConditionValueUpdate', () => {
|
|
28
|
+
it('should skip the empty value a row reports back for a stored empty string', () => {
|
|
29
|
+
// The row this covers comes from a URL such as `?where[or][0][and][0][field][equals]=`.
|
|
30
|
+
expect(isNoOpConditionValueUpdate({
|
|
31
|
+
incomingValue: undefined,
|
|
32
|
+
storedValue: '',
|
|
33
|
+
type: 'value'
|
|
34
|
+
})).toBe(true);
|
|
35
|
+
});
|
|
36
|
+
it.each([['undefined', 'an empty string', undefined, ''], ['null', 'undefined', null, undefined], ['undefined', 'undefined', undefined, undefined]])('should skip a %s value stored as %s', (_incomingLabel, _storedLabel, incomingValue, storedValue) => {
|
|
37
|
+
expect(isNoOpConditionValueUpdate({
|
|
38
|
+
incomingValue,
|
|
39
|
+
storedValue,
|
|
40
|
+
type: 'value'
|
|
41
|
+
})).toBe(true);
|
|
42
|
+
});
|
|
43
|
+
it('should commit a value typed into an empty row', () => {
|
|
44
|
+
expect(isNoOpConditionValueUpdate({
|
|
45
|
+
incomingValue: 'option1',
|
|
46
|
+
storedValue: '',
|
|
47
|
+
type: 'value'
|
|
48
|
+
})).toBe(false);
|
|
49
|
+
});
|
|
50
|
+
it('should commit a row the user cleared', () => {
|
|
51
|
+
expect(isNoOpConditionValueUpdate({
|
|
52
|
+
incomingValue: undefined,
|
|
53
|
+
storedValue: 'option1',
|
|
54
|
+
type: 'value'
|
|
55
|
+
})).toBe(false);
|
|
56
|
+
});
|
|
57
|
+
it.each([['field'], ['operator']])('should commit a %s edit on a row that holds no value', type => {
|
|
58
|
+
expect(isNoOpConditionValueUpdate({
|
|
59
|
+
incomingValue: undefined,
|
|
60
|
+
storedValue: '',
|
|
61
|
+
type
|
|
62
|
+
})).toBe(false);
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
//# sourceMappingURL=conditionValue.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conditionValue.spec.js","names":["describe","expect","it","getDisplayedConditionValue","isEmptyConditionValue","isNoOpConditionValueUpdate","each","undefined","_label","value","toBe","toBeUndefined","incomingValue","storedValue","type","_incomingLabel","_storedLabel"],"sources":["../../../src/elements/WhereBuilder/conditionValue.spec.ts"],"sourcesContent":["import { describe, expect, it } from 'vitest'\n\nimport {\n getDisplayedConditionValue,\n isEmptyConditionValue,\n isNoOpConditionValueUpdate,\n} from './conditionValue.js'\n\ndescribe('isEmptyConditionValue', () => {\n it.each([\n ['undefined', undefined],\n ['null', null],\n ['an empty string', ''],\n ])('should treat %s as empty', (_label, value) => {\n expect(isEmptyConditionValue({ value })).toBe(true)\n })\n\n it.each([\n ['a string', 'option1'],\n ['zero', 0],\n ['false', false],\n ])('should treat %s as a real value', (_label, value) => {\n expect(isEmptyConditionValue({ value })).toBe(false)\n })\n})\n\ndescribe('getDisplayedConditionValue', () => {\n it.each([\n ['undefined', undefined],\n ['null', null],\n ])('should display %s as no value', (_label, value) => {\n expect(getDisplayedConditionValue({ value })).toBeUndefined()\n })\n\n it.each([\n ['zero', 0],\n ['false', false],\n ['an empty string', ''],\n ['a string', 'option1'],\n ])('should display %s as itself', (_label, value) => {\n expect(getDisplayedConditionValue({ value })).toBe(value)\n })\n})\n\ndescribe('isNoOpConditionValueUpdate', () => {\n it('should skip the empty value a row reports back for a stored empty string', () => {\n // The row this covers comes from a URL such as `?where[or][0][and][0][field][equals]=`.\n expect(\n isNoOpConditionValueUpdate({ incomingValue: undefined, storedValue: '', type: 'value' }),\n ).toBe(true)\n })\n\n it.each([\n ['undefined', 'an empty string', undefined, ''],\n ['null', 'undefined', null, undefined],\n ['undefined', 'undefined', undefined, undefined],\n ])(\n 'should skip a %s value stored as %s',\n (_incomingLabel, _storedLabel, incomingValue, storedValue) => {\n expect(isNoOpConditionValueUpdate({ incomingValue, storedValue, type: 'value' })).toBe(true)\n },\n )\n\n it('should commit a value typed into an empty row', () => {\n expect(\n isNoOpConditionValueUpdate({ incomingValue: 'option1', storedValue: '', type: 'value' }),\n ).toBe(false)\n })\n\n it('should commit a row the user cleared', () => {\n expect(\n isNoOpConditionValueUpdate({\n incomingValue: undefined,\n storedValue: 'option1',\n type: 'value',\n }),\n ).toBe(false)\n })\n\n it.each([['field'], ['operator']] as const)(\n 'should commit a %s edit on a row that holds no value',\n (type) => {\n expect(isNoOpConditionValueUpdate({ incomingValue: undefined, storedValue: '', type })).toBe(\n false,\n )\n },\n )\n})\n"],"mappings":"AAAA,SAASA,QAAQ,EAAEC,MAAM,EAAEC,EAAE,QAAQ;AAErC,SACEC,0BAA0B,EAC1BC,qBAAqB,EACrBC,0BAA0B,QACrB;AAEPL,QAAA,CAAS,yBAAyB;EAChCE,EAAA,CAAGI,IAAI,CAAC,CACN,CAAC,aAAaC,SAAA,CAAU,EACxB,CAAC,QAAQ,KAAK,EACd,CAAC,mBAAmB,GAAG,CACxB,EAAE,4BAA4B,CAACC,MAAA,EAAQC,KAAA;IACtCR,MAAA,CAAOG,qBAAA,CAAsB;MAAEK;IAAM,IAAIC,IAAI,CAAC;EAChD;EAEAR,EAAA,CAAGI,IAAI,CAAC,CACN,CAAC,YAAY,UAAU,EACvB,CAAC,QAAQ,EAAE,EACX,CAAC,SAAS,MAAM,CACjB,EAAE,mCAAmC,CAACE,MAAA,EAAQC,KAAA;IAC7CR,MAAA,CAAOG,qBAAA,CAAsB;MAAEK;IAAM,IAAIC,IAAI,CAAC;EAChD;AACF;AAEAV,QAAA,CAAS,8BAA8B;EACrCE,EAAA,CAAGI,IAAI,CAAC,CACN,CAAC,aAAaC,SAAA,CAAU,EACxB,CAAC,QAAQ,KAAK,CACf,EAAE,iCAAiC,CAACC,MAAA,EAAQC,KAAA;IAC3CR,MAAA,CAAOE,0BAAA,CAA2B;MAAEM;IAAM,IAAIE,aAAa;EAC7D;EAEAT,EAAA,CAAGI,IAAI,CAAC,CACN,CAAC,QAAQ,EAAE,EACX,CAAC,SAAS,MAAM,EAChB,CAAC,mBAAmB,GAAG,EACvB,CAAC,YAAY,UAAU,CACxB,EAAE,+BAA+B,CAACE,MAAA,EAAQC,KAAA;IACzCR,MAAA,CAAOE,0BAAA,CAA2B;MAAEM;IAAM,IAAIC,IAAI,CAACD,KAAA;EACrD;AACF;AAEAT,QAAA,CAAS,8BAA8B;EACrCE,EAAA,CAAG,4EAA4E;IAC7E;IACAD,MAAA,CACEI,0BAAA,CAA2B;MAAEO,aAAA,EAAeL,SAAA;MAAWM,WAAA,EAAa;MAAIC,IAAA,EAAM;IAAQ,IACtFJ,IAAI,CAAC;EACT;EAEAR,EAAA,CAAGI,IAAI,CAAC,CACN,CAAC,aAAa,mBAAmBC,SAAA,EAAW,GAAG,EAC/C,CAAC,QAAQ,aAAa,MAAMA,SAAA,CAAU,EACtC,CAAC,aAAa,aAAaA,SAAA,EAAWA,SAAA,CAAU,CACjD,EACC,uCACA,CAACQ,cAAA,EAAgBC,YAAA,EAAcJ,aAAA,EAAeC,WAAA;IAC5CZ,MAAA,CAAOI,0BAAA,CAA2B;MAAEO,aAAA;MAAeC,WAAA;MAAaC,IAAA,EAAM;IAAQ,IAAIJ,IAAI,CAAC;EACzF;EAGFR,EAAA,CAAG,iDAAiD;IAClDD,MAAA,CACEI,0BAAA,CAA2B;MAAEO,aAAA,EAAe;MAAWC,WAAA,EAAa;MAAIC,IAAA,EAAM;IAAQ,IACtFJ,IAAI,CAAC;EACT;EAEAR,EAAA,CAAG,wCAAwC;IACzCD,MAAA,CACEI,0BAAA,CAA2B;MACzBO,aAAA,EAAeL,SAAA;MACfM,WAAA,EAAa;MACbC,IAAA,EAAM;IACR,IACAJ,IAAI,CAAC;EACT;EAEAR,EAAA,CAAGI,IAAI,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,WAAW,CAAC,EAC/B,wDACCQ,IAAA;IACCb,MAAA,CAAOI,0BAAA,CAA2B;MAAEO,aAAA,EAAeL,SAAA;MAAWM,WAAA,EAAa;MAAIC;IAAK,IAAIJ,IAAI,CAC1F;EAEJ;AAEJ","ignoreList":[]}
|