@payloadcms/ui 3.77.0 → 3.78.0-canary.1
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/DeleteDocument/index.d.ts.map +1 -1
- package/dist/elements/DeleteDocument/index.js +16 -5
- package/dist/elements/DeleteDocument/index.js.map +1 -1
- package/dist/elements/DeleteMany/index.d.ts +21 -1
- package/dist/elements/DeleteMany/index.d.ts.map +1 -1
- package/dist/elements/DeleteMany/index.js +25 -11
- package/dist/elements/DeleteMany/index.js.map +1 -1
- package/dist/elements/DocumentControls/index.d.ts.map +1 -1
- package/dist/elements/DocumentControls/index.js +8 -2
- package/dist/elements/DocumentControls/index.js.map +1 -1
- package/dist/exports/client/index.js +12 -12
- package/dist/exports/client/index.js.map +4 -4
- package/dist/providers/DocumentInfo/types.d.ts +7 -0
- package/dist/providers/DocumentInfo/types.d.ts.map +1 -1
- package/dist/providers/DocumentInfo/types.js.map +1 -1
- package/dist/utilities/shouldPermanentlyDelete.d.ts +13 -0
- package/dist/utilities/shouldPermanentlyDelete.d.ts.map +1 -0
- package/dist/utilities/shouldPermanentlyDelete.js +11 -0
- package/dist/utilities/shouldPermanentlyDelete.js.map +1 -0
- package/dist/views/CollectionFolder/ListSelection/index.d.ts.map +1 -1
- package/dist/views/CollectionFolder/ListSelection/index.js +1 -0
- package/dist/views/CollectionFolder/ListSelection/index.js.map +1 -1
- package/dist/views/List/ListHeader/index.d.ts +1 -0
- package/dist/views/List/ListHeader/index.d.ts.map +1 -1
- package/dist/views/List/ListHeader/index.js +3 -0
- package/dist/views/List/ListHeader/index.js.map +1 -1
- package/dist/views/List/ListSelection/index.d.ts +2 -0
- package/dist/views/List/ListSelection/index.d.ts.map +1 -1
- package/dist/views/List/ListSelection/index.js +22 -16
- package/dist/views/List/ListSelection/index.js.map +1 -1
- package/dist/views/List/index.d.ts.map +1 -1
- package/dist/views/List/index.js +2 -0
- package/dist/views/List/index.js.map +1 -1
- package/package.json +4 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/elements/DeleteDocument/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,SAAS,CAAA;AAMxD,OAAO,KAA0C,MAAM,OAAO,CAAA;AAG9D,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,+BAA+B,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/elements/DeleteDocument/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,SAAS,CAAA;AAMxD,OAAO,KAA0C,MAAM,OAAO,CAAA;AAG9D,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,+BAA+B,CAAA;AAc9E,OAAO,cAAc,CAAA;AAIrB,MAAM,MAAM,KAAK,GAAG;IAClB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,cAAc,EAAE,yBAAyB,CAAC,MAAM,CAAC,CAAA;IAC1D,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,QAAQ,CAAC,EAAE,yBAAyB,CAAC,UAAU,CAAC,CAAA;IACzD,QAAQ,CAAC,mBAAmB,CAAC,EAAE,OAAO,CAAA;IACtC,QAAQ,CAAC,aAAa,EAAE,yBAAyB,CAAC,QAAQ,CAAC,CAAC,UAAU,CAAC,CAAA;IACvE,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,UAAU,EAAE,yBAAyB,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAA;CACtE,CAAA;AAED,eAAO,MAAM,cAAc,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,CA8K1C,CAAA"}
|
|
@@ -10,10 +10,12 @@ import { toast } from 'sonner';
|
|
|
10
10
|
import { CheckboxInput } from '../../fields/Checkbox/Input.js';
|
|
11
11
|
import { useForm } from '../../forms/Form/context.js';
|
|
12
12
|
import { useConfig } from '../../providers/Config/index.js';
|
|
13
|
+
import { useDocumentInfo } from '../../providers/DocumentInfo/index.js';
|
|
13
14
|
import { useDocumentTitle } from '../../providers/DocumentTitle/index.js';
|
|
14
15
|
import { useRouteTransition } from '../../providers/RouteTransition/index.js';
|
|
15
16
|
import { useTranslation } from '../../providers/Translation/index.js';
|
|
16
17
|
import { requests } from '../../utilities/api.js';
|
|
18
|
+
import { shouldPermanentlyDelete } from '../../utilities/shouldPermanentlyDelete.js';
|
|
17
19
|
import { ConfirmationModal } from '../ConfirmationModal/index.js';
|
|
18
20
|
import { PopupList } from '../Popup/index.js';
|
|
19
21
|
import { Translation } from '../Translation/index.js';
|
|
@@ -41,6 +43,10 @@ export const DeleteDocument = props => {
|
|
|
41
43
|
const collectionConfig = getEntityConfig({
|
|
42
44
|
collectionSlug
|
|
43
45
|
});
|
|
46
|
+
const {
|
|
47
|
+
hasDeletePermission,
|
|
48
|
+
hasTrashPermission
|
|
49
|
+
} = useDocumentInfo();
|
|
44
50
|
const {
|
|
45
51
|
setModified
|
|
46
52
|
} = useForm();
|
|
@@ -67,12 +73,17 @@ export const DeleteDocument = props => {
|
|
|
67
73
|
}, [t, title]);
|
|
68
74
|
const handleDelete = useCallback(async () => {
|
|
69
75
|
setModified(false);
|
|
76
|
+
const permanentlyDelete = shouldPermanentlyDelete({
|
|
77
|
+
deletePermanently,
|
|
78
|
+
hasDeletePermission,
|
|
79
|
+
hasTrashPermission
|
|
80
|
+
});
|
|
70
81
|
try {
|
|
71
82
|
const url = formatAdminURL({
|
|
72
83
|
apiRoute: api,
|
|
73
84
|
path: `/${collectionSlug}/${id}`
|
|
74
85
|
});
|
|
75
|
-
const res =
|
|
86
|
+
const res = permanentlyDelete ? await requests.delete(url, {
|
|
76
87
|
headers: {
|
|
77
88
|
'Accept-Language': i18n.language,
|
|
78
89
|
'Content-Type': 'application/json'
|
|
@@ -88,7 +99,7 @@ export const DeleteDocument = props => {
|
|
|
88
99
|
});
|
|
89
100
|
const json = await res.json();
|
|
90
101
|
if (res.status < 400) {
|
|
91
|
-
toast.success(t(
|
|
102
|
+
toast.success(t(permanentlyDelete ? 'general:titleDeleted' : 'general:titleTrashed', {
|
|
92
103
|
label: getTranslation(singularLabel, i18n),
|
|
93
104
|
title
|
|
94
105
|
}) || json.message);
|
|
@@ -115,7 +126,7 @@ export const DeleteDocument = props => {
|
|
|
115
126
|
} catch (_err) {
|
|
116
127
|
return addDefaultError();
|
|
117
128
|
}
|
|
118
|
-
}, [deletePermanently, setModified, api, collectionSlug, id, t, singularLabel, addDefaultError, i18n, title, router, adminRoute, redirectAfterDelete, onDelete, collectionConfig, startRouteTransition]);
|
|
129
|
+
}, [deletePermanently, setModified, hasDeletePermission, hasTrashPermission, api, collectionSlug, id, t, singularLabel, addDefaultError, i18n, title, router, adminRoute, redirectAfterDelete, onDelete, collectionConfig, startRouteTransition]);
|
|
119
130
|
if (id) {
|
|
120
131
|
return /*#__PURE__*/_jsxs(Fragment, {
|
|
121
132
|
children: [/*#__PURE__*/_jsx(PopupList.Button, {
|
|
@@ -134,13 +145,13 @@ export const DeleteDocument = props => {
|
|
|
134
145
|
children: children
|
|
135
146
|
})
|
|
136
147
|
},
|
|
137
|
-
i18nKey: collectionConfig.trash ? 'general:aboutToTrash' : 'general:aboutToDelete',
|
|
148
|
+
i18nKey: collectionConfig.trash && hasTrashPermission ? 'general:aboutToTrash' : 'general:aboutToDelete',
|
|
138
149
|
t: t,
|
|
139
150
|
variables: {
|
|
140
151
|
label: getTranslation(singularLabel, i18n),
|
|
141
152
|
title: titleFromProps || title || id
|
|
142
153
|
}
|
|
143
|
-
}), collectionConfig.trash && /*#__PURE__*/_jsx("div", {
|
|
154
|
+
}), collectionConfig.trash && hasTrashPermission && hasDeletePermission && /*#__PURE__*/_jsx("div", {
|
|
144
155
|
className: `${baseClass}__checkbox`,
|
|
145
156
|
children: /*#__PURE__*/_jsx(CheckboxInput, {
|
|
146
157
|
checked: deletePermanently,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["useModal","getTranslation","useRouter","formatAdminURL","React","Fragment","useCallback","useState","toast","CheckboxInput","useForm","useConfig","useDocumentTitle","useRouteTransition","useTranslation","requests","ConfirmationModal","PopupList","Translation","baseClass","DeleteDocument","props","id","buttonId","collectionSlug","onDelete","redirectAfterDelete","singularLabel","title","titleFromProps","config","routes","admin","adminRoute","api","getEntityConfig","collectionConfig","setModified","router","i18n","t","startRouteTransition","openModal","modalSlug","deletePermanently","setDeletePermanently","addDefaultError","error","handleDelete","url","apiRoute","path","res","trash","delete","headers","language","patch","body","JSON","stringify","deletedAt","Date","toISOString","json","status","success","label","message","push","errors","forEach","_err","_jsxs","_jsx","Button","onClick","elements","1","children","i18nKey","variables","className","checked","name","onToggle","e","target","confirmingLabel","heading","onConfirm"],"sources":["../../../src/elements/DeleteDocument/index.tsx"],"sourcesContent":["'use client'\nimport type { SanitizedCollectionConfig } from 'payload'\n\nimport { useModal } from '@faceless-ui/modal'\nimport { getTranslation } from '@payloadcms/translations'\nimport { useRouter } from 'next/navigation.js'\nimport { formatAdminURL } from 'payload/shared'\nimport React, { Fragment, useCallback, useState } from 'react'\nimport { toast } from 'sonner'\n\nimport type { DocumentDrawerContextType } from '../DocumentDrawer/Provider.js'\n\nimport { CheckboxInput } from '../../fields/Checkbox/Input.js'\nimport { useForm } from '../../forms/Form/context.js'\nimport { useConfig } from '../../providers/Config/index.js'\nimport { useDocumentTitle } from '../../providers/DocumentTitle/index.js'\nimport { useRouteTransition } from '../../providers/RouteTransition/index.js'\nimport { useTranslation } from '../../providers/Translation/index.js'\nimport { requests } from '../../utilities/api.js'\nimport { ConfirmationModal } from '../ConfirmationModal/index.js'\nimport { PopupList } from '../Popup/index.js'\nimport { Translation } from '../Translation/index.js'\nimport './index.scss'\n\nconst baseClass = 'delete-document'\n\nexport type Props = {\n readonly buttonId?: string\n readonly collectionSlug: SanitizedCollectionConfig['slug']\n readonly id?: string\n readonly onDelete?: DocumentDrawerContextType['onDelete']\n readonly redirectAfterDelete?: boolean\n readonly singularLabel: SanitizedCollectionConfig['labels']['singular']\n readonly title?: string\n readonly useAsTitle: SanitizedCollectionConfig['admin']['useAsTitle']\n}\n\nexport const DeleteDocument: React.FC<Props> = (props) => {\n const {\n id,\n buttonId,\n collectionSlug,\n onDelete,\n redirectAfterDelete = true,\n singularLabel,\n title: titleFromProps,\n } = props\n\n const {\n config: {\n routes: { admin: adminRoute, api },\n },\n getEntityConfig,\n } = useConfig()\n\n const collectionConfig = getEntityConfig({ collectionSlug })\n\n const { setModified } = useForm()\n const router = useRouter()\n const { i18n, t } = useTranslation()\n const { title } = useDocumentTitle()\n const { startRouteTransition } = useRouteTransition()\n const { openModal } = useModal()\n\n const modalSlug = `delete-${id}`\n\n const [deletePermanently, setDeletePermanently] = useState(false)\n\n const addDefaultError = useCallback(() => {\n toast.error(t('error:deletingTitle', { title }))\n }, [t, title])\n\n const handleDelete = useCallback(async () => {\n setModified(false)\n\n try {\n const url = formatAdminURL({\n apiRoute: api,\n path: `/${collectionSlug}/${id}`,\n })\n const res =\n deletePermanently || !collectionConfig.trash\n ? await requests.delete(url, {\n headers: {\n 'Accept-Language': i18n.language,\n 'Content-Type': 'application/json',\n },\n })\n : await requests.patch(url, {\n body: JSON.stringify({\n deletedAt: new Date().toISOString(),\n }),\n headers: {\n 'Accept-Language': i18n.language,\n 'Content-Type': 'application/json',\n },\n })\n\n const json = await res.json()\n\n if (res.status < 400) {\n toast.success(\n t(\n deletePermanently || !collectionConfig.trash\n ? 'general:titleDeleted'\n : 'general:titleTrashed',\n {\n label: getTranslation(singularLabel, i18n),\n title,\n },\n ) || json.message,\n )\n\n if (redirectAfterDelete) {\n return startRouteTransition(() =>\n router.push(formatAdminURL({ adminRoute, path: `/collections/${collectionSlug}` })),\n )\n }\n\n if (typeof onDelete === 'function') {\n await onDelete({ id, collectionConfig })\n }\n\n return\n }\n\n if (json.errors) {\n json.errors.forEach((error) => toast.error(error.message))\n } else {\n addDefaultError()\n }\n\n return\n } catch (_err) {\n return addDefaultError()\n }\n }, [\n deletePermanently,\n setModified,\n\n api,\n collectionSlug,\n id,\n t,\n singularLabel,\n addDefaultError,\n i18n,\n title,\n router,\n adminRoute,\n redirectAfterDelete,\n onDelete,\n collectionConfig,\n startRouteTransition,\n ])\n\n if (id) {\n return (\n <Fragment>\n <PopupList.Button\n id={buttonId}\n onClick={() => {\n openModal(modalSlug)\n }}\n >\n {t('general:delete')}\n </PopupList.Button>\n <ConfirmationModal\n body={\n <Fragment>\n <Translation\n elements={{\n '1': ({ children }) => <strong>{children}</strong>,\n }}\n i18nKey={collectionConfig.trash ? 'general:aboutToTrash' : 'general:aboutToDelete'}\n t={t}\n variables={{\n label: getTranslation(singularLabel, i18n),\n title: titleFromProps || title || id,\n }}\n />\n {collectionConfig.trash && (\n <div className={`${baseClass}__checkbox`}>\n <CheckboxInput\n checked={deletePermanently}\n id=\"delete-forever\"\n label={t('general:deletePermanently')}\n name=\"delete-forever\"\n onToggle={(e) => setDeletePermanently(e.target.checked)}\n />\n </div>\n )}\n </Fragment>\n }\n className={baseClass}\n confirmingLabel={t('general:deleting')}\n heading={t('general:confirmDeletion')}\n modalSlug={modalSlug}\n onConfirm={handleDelete}\n />\n </Fragment>\n )\n }\n\n return null\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"index.js","names":["useModal","getTranslation","useRouter","formatAdminURL","React","Fragment","useCallback","useState","toast","CheckboxInput","useForm","useConfig","useDocumentInfo","useDocumentTitle","useRouteTransition","useTranslation","requests","shouldPermanentlyDelete","ConfirmationModal","PopupList","Translation","baseClass","DeleteDocument","props","id","buttonId","collectionSlug","onDelete","redirectAfterDelete","singularLabel","title","titleFromProps","config","routes","admin","adminRoute","api","getEntityConfig","collectionConfig","hasDeletePermission","hasTrashPermission","setModified","router","i18n","t","startRouteTransition","openModal","modalSlug","deletePermanently","setDeletePermanently","addDefaultError","error","handleDelete","permanentlyDelete","url","apiRoute","path","res","delete","headers","language","patch","body","JSON","stringify","deletedAt","Date","toISOString","json","status","success","label","message","push","errors","forEach","_err","_jsxs","_jsx","Button","onClick","elements","1","children","i18nKey","trash","variables","className","checked","name","onToggle","e","target","confirmingLabel","heading","onConfirm"],"sources":["../../../src/elements/DeleteDocument/index.tsx"],"sourcesContent":["'use client'\nimport type { SanitizedCollectionConfig } from 'payload'\n\nimport { useModal } from '@faceless-ui/modal'\nimport { getTranslation } from '@payloadcms/translations'\nimport { useRouter } from 'next/navigation.js'\nimport { formatAdminURL } from 'payload/shared'\nimport React, { Fragment, useCallback, useState } from 'react'\nimport { toast } from 'sonner'\n\nimport type { DocumentDrawerContextType } from '../DocumentDrawer/Provider.js'\n\nimport { CheckboxInput } from '../../fields/Checkbox/Input.js'\nimport { useForm } from '../../forms/Form/context.js'\nimport { useConfig } from '../../providers/Config/index.js'\nimport { useDocumentInfo } from '../../providers/DocumentInfo/index.js'\nimport { useDocumentTitle } from '../../providers/DocumentTitle/index.js'\nimport { useRouteTransition } from '../../providers/RouteTransition/index.js'\nimport { useTranslation } from '../../providers/Translation/index.js'\nimport { requests } from '../../utilities/api.js'\nimport { shouldPermanentlyDelete } from '../../utilities/shouldPermanentlyDelete.js'\nimport { ConfirmationModal } from '../ConfirmationModal/index.js'\nimport { PopupList } from '../Popup/index.js'\nimport { Translation } from '../Translation/index.js'\nimport './index.scss'\n\nconst baseClass = 'delete-document'\n\nexport type Props = {\n readonly buttonId?: string\n readonly collectionSlug: SanitizedCollectionConfig['slug']\n readonly id?: string\n readonly onDelete?: DocumentDrawerContextType['onDelete']\n readonly redirectAfterDelete?: boolean\n readonly singularLabel: SanitizedCollectionConfig['labels']['singular']\n readonly title?: string\n readonly useAsTitle: SanitizedCollectionConfig['admin']['useAsTitle']\n}\n\nexport const DeleteDocument: React.FC<Props> = (props) => {\n const {\n id,\n buttonId,\n collectionSlug,\n onDelete,\n redirectAfterDelete = true,\n singularLabel,\n title: titleFromProps,\n } = props\n\n const {\n config: {\n routes: { admin: adminRoute, api },\n },\n getEntityConfig,\n } = useConfig()\n\n const collectionConfig = getEntityConfig({ collectionSlug })\n\n const { hasDeletePermission, hasTrashPermission } = useDocumentInfo()\n const { setModified } = useForm()\n const router = useRouter()\n const { i18n, t } = useTranslation()\n const { title } = useDocumentTitle()\n const { startRouteTransition } = useRouteTransition()\n const { openModal } = useModal()\n\n const modalSlug = `delete-${id}`\n\n const [deletePermanently, setDeletePermanently] = useState(false)\n\n const addDefaultError = useCallback(() => {\n toast.error(t('error:deletingTitle', { title }))\n }, [t, title])\n\n const handleDelete = useCallback(async () => {\n setModified(false)\n\n const permanentlyDelete = shouldPermanentlyDelete({\n deletePermanently,\n hasDeletePermission,\n hasTrashPermission,\n })\n\n try {\n const url = formatAdminURL({\n apiRoute: api,\n path: `/${collectionSlug}/${id}`,\n })\n const res = permanentlyDelete\n ? await requests.delete(url, {\n headers: {\n 'Accept-Language': i18n.language,\n 'Content-Type': 'application/json',\n },\n })\n : await requests.patch(url, {\n body: JSON.stringify({\n deletedAt: new Date().toISOString(),\n }),\n headers: {\n 'Accept-Language': i18n.language,\n 'Content-Type': 'application/json',\n },\n })\n\n const json = await res.json()\n\n if (res.status < 400) {\n toast.success(\n t(permanentlyDelete ? 'general:titleDeleted' : 'general:titleTrashed', {\n label: getTranslation(singularLabel, i18n),\n title,\n }) || json.message,\n )\n\n if (redirectAfterDelete) {\n return startRouteTransition(() =>\n router.push(formatAdminURL({ adminRoute, path: `/collections/${collectionSlug}` })),\n )\n }\n\n if (typeof onDelete === 'function') {\n await onDelete({ id, collectionConfig })\n }\n\n return\n }\n\n if (json.errors) {\n json.errors.forEach((error) => toast.error(error.message))\n } else {\n addDefaultError()\n }\n\n return\n } catch (_err) {\n return addDefaultError()\n }\n }, [\n deletePermanently,\n setModified,\n hasDeletePermission,\n hasTrashPermission,\n api,\n collectionSlug,\n id,\n t,\n singularLabel,\n addDefaultError,\n i18n,\n title,\n router,\n adminRoute,\n redirectAfterDelete,\n onDelete,\n collectionConfig,\n startRouteTransition,\n ])\n\n if (id) {\n return (\n <Fragment>\n <PopupList.Button\n id={buttonId}\n onClick={() => {\n openModal(modalSlug)\n }}\n >\n {t('general:delete')}\n </PopupList.Button>\n <ConfirmationModal\n body={\n <Fragment>\n <Translation\n elements={{\n '1': ({ children }) => <strong>{children}</strong>,\n }}\n i18nKey={\n collectionConfig.trash && hasTrashPermission\n ? 'general:aboutToTrash'\n : 'general:aboutToDelete'\n }\n t={t}\n variables={{\n label: getTranslation(singularLabel, i18n),\n title: titleFromProps || title || id,\n }}\n />\n {collectionConfig.trash && hasTrashPermission && hasDeletePermission && (\n <div className={`${baseClass}__checkbox`}>\n <CheckboxInput\n checked={deletePermanently}\n id=\"delete-forever\"\n label={t('general:deletePermanently')}\n name=\"delete-forever\"\n onToggle={(e) => setDeletePermanently(e.target.checked)}\n />\n </div>\n )}\n </Fragment>\n }\n className={baseClass}\n confirmingLabel={t('general:deleting')}\n heading={t('general:confirmDeletion')}\n modalSlug={modalSlug}\n onConfirm={handleDelete}\n />\n </Fragment>\n )\n }\n\n return null\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -3,6 +3,16 @@ import React from 'react';
|
|
|
3
3
|
import './index.scss';
|
|
4
4
|
export type Props = {
|
|
5
5
|
collection: ClientCollectionConfig;
|
|
6
|
+
/**
|
|
7
|
+
* Whether the user has permission to permanently delete documents.
|
|
8
|
+
* If provided, uses this instead of reading from auth context.
|
|
9
|
+
*/
|
|
10
|
+
hasDeletePermission?: boolean;
|
|
11
|
+
/**
|
|
12
|
+
* Whether the user has permission to trash (soft delete) documents.
|
|
13
|
+
* If provided, uses this instead of reading from auth context.
|
|
14
|
+
*/
|
|
15
|
+
hasTrashPermission?: boolean;
|
|
6
16
|
/**
|
|
7
17
|
* When multiple DeleteMany components are rendered on the page, this will differentiate them.
|
|
8
18
|
*/
|
|
@@ -27,6 +37,16 @@ type DeleteMany_v4Props = {
|
|
|
27
37
|
* A callback function to be called after the delete request is completed.
|
|
28
38
|
*/
|
|
29
39
|
afterDelete?: (result: AfterDeleteResult) => void;
|
|
40
|
+
/**
|
|
41
|
+
* Whether the user has permission to permanently delete documents.
|
|
42
|
+
* When false, the "delete permanently" checkbox will be hidden.
|
|
43
|
+
*/
|
|
44
|
+
hasDeletePermission?: boolean;
|
|
45
|
+
/**
|
|
46
|
+
* Whether the user has permission to trash (soft delete) documents.
|
|
47
|
+
* When false and hasDeletePermission is true, only permanent delete is available.
|
|
48
|
+
*/
|
|
49
|
+
hasTrashPermission?: boolean;
|
|
30
50
|
/**
|
|
31
51
|
* When multiple DeleteMany components are rendered on the page, this will differentiate them.
|
|
32
52
|
*/
|
|
@@ -67,6 +87,6 @@ type DeleteMany_v4Props = {
|
|
|
67
87
|
*
|
|
68
88
|
* If you are deleting monomorphic documents, shape your `selections` to match the polymorphic structure.
|
|
69
89
|
*/
|
|
70
|
-
export declare function DeleteMany_v4({ afterDelete, modalPrefix, search, selections, trash, viewType, where, }: DeleteMany_v4Props): React.JSX.Element;
|
|
90
|
+
export declare function DeleteMany_v4({ afterDelete, hasDeletePermission, hasTrashPermission, modalPrefix, search, selections, trash, viewType, where, }: DeleteMany_v4Props): React.JSX.Element;
|
|
71
91
|
export {};
|
|
72
92
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/elements/DeleteMany/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,sBAAsB,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAOvE,OAAO,KAAK,MAAM,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/elements/DeleteMany/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,sBAAsB,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAOvE,OAAO,KAAK,MAAM,OAAO,CAAA;AAgBzB,OAAO,cAAc,CAAA;AAErB,MAAM,MAAM,KAAK,GAAG;IAClB,UAAU,EAAE,sBAAsB,CAAA;IAClC;;;OAGG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAA;IAC7B;;;OAGG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAA;IAC5B;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,QAAQ,CAAC,EAAE,SAAS,CAAA;CACrB,CAAA;AAED,eAAO,MAAM,UAAU,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,CAoFtC,CAAA;AAED,KAAK,iBAAiB,GAAG;IACvB,CAAC,UAAU,EAAE,MAAM,GAAG;QACpB,YAAY,EAAE,MAAM,CAAA;QACpB,MAAM,EAAE,OAAO,EAAE,CAAA;QACjB,GAAG,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAA;QACxB,UAAU,EAAE,MAAM,CAAA;KACnB,CAAA;CACF,CAAA;AACD,KAAK,kBAAkB,GAAG;IACxB;;OAEG;IACH,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,iBAAiB,KAAK,IAAI,CAAA;IACjD;;;OAGG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAA;IAC7B;;;OAGG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAA;IAC5B;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB;;;;;OAKG;IACH,MAAM,CAAC,EAAE,MAAM,CAAA;IACf;;;;;OAKG;IACH,UAAU,EAAE;QACV,CAAC,UAAU,EAAE,MAAM,GAAG;YACpB,GAAG,CAAC,EAAE,OAAO,CAAA;YACb,GAAG,CAAC,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAA;YACzB,UAAU,CAAC,EAAE,MAAM,CAAA;SACpB,CAAA;KACF,CAAA;IACD,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,QAAQ,CAAC,EAAE,SAAS,CAAA;IACpB;;;;;;OAMG;IACH,KAAK,CAAC,EAAE,KAAK,CAAA;CACd,CAAA;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,EAC5B,WAAW,EACX,mBAA2B,EAC3B,kBAA0B,EAC1B,WAAW,EACX,MAAM,EACN,UAAU,EACV,KAAK,EACL,QAAQ,EACR,KAAK,GACN,EAAE,kBAAkB,qBA8QpB"}
|
|
@@ -18,6 +18,7 @@ import { SelectAllStatus, useSelection } from '../../providers/Selection/index.j
|
|
|
18
18
|
import { useTranslation } from '../../providers/Translation/index.js';
|
|
19
19
|
import { requests } from '../../utilities/api.js';
|
|
20
20
|
import { parseSearchParams } from '../../utilities/parseSearchParams.js';
|
|
21
|
+
import { shouldPermanentlyDelete } from '../../utilities/shouldPermanentlyDelete.js';
|
|
21
22
|
import { ConfirmationModal } from '../ConfirmationModal/index.js';
|
|
22
23
|
import { ListSelectionButton } from '../ListSelection/index.js';
|
|
23
24
|
import { Translation } from '../Translation/index.js';
|
|
@@ -29,6 +30,8 @@ export const DeleteMany = props => {
|
|
|
29
30
|
} = props;
|
|
30
31
|
const {
|
|
31
32
|
collection: t0,
|
|
33
|
+
hasDeletePermission: hasDeletePermissionFromProps,
|
|
34
|
+
hasTrashPermission: hasTrashPermissionFromProps,
|
|
32
35
|
modalPrefix
|
|
33
36
|
} = props;
|
|
34
37
|
const {
|
|
@@ -50,10 +53,13 @@ export const DeleteMany = props => {
|
|
|
50
53
|
clearRouteCache
|
|
51
54
|
} = useRouteCache();
|
|
52
55
|
const collectionPermissions = permissions?.collections?.[slug];
|
|
53
|
-
const hasDeletePermission = collectionPermissions?.delete;
|
|
56
|
+
const hasDeletePermission = hasDeletePermissionFromProps !== undefined ? hasDeletePermissionFromProps : Boolean(collectionPermissions?.delete);
|
|
57
|
+
const hasTrashPermission = hasTrashPermissionFromProps !== undefined ? hasTrashPermissionFromProps : hasDeletePermission;
|
|
54
58
|
const selectingAll = selectAll === SelectAllStatus.AllAvailable;
|
|
55
59
|
const ids = selectingAll ? [] : selectedIDs;
|
|
56
|
-
|
|
60
|
+
const isTrashView = viewType === "trash";
|
|
61
|
+
const canShowDeleteButton = isTrashView ? hasDeletePermission : hasDeletePermission || hasTrashPermission;
|
|
62
|
+
if (selectAll === SelectAllStatus.None || !canShowDeleteButton) {
|
|
57
63
|
return null;
|
|
58
64
|
}
|
|
59
65
|
const baseWhere = parseSearchParams(searchParams)?.where;
|
|
@@ -88,6 +94,8 @@ export const DeleteMany = props => {
|
|
|
88
94
|
return _jsx(React.Fragment, {
|
|
89
95
|
children: _jsx(DeleteMany_v4, {
|
|
90
96
|
afterDelete: t1,
|
|
97
|
+
hasDeletePermission,
|
|
98
|
+
hasTrashPermission,
|
|
91
99
|
modalPrefix,
|
|
92
100
|
search: parseSearchParams(searchParams)?.search,
|
|
93
101
|
selections: {
|
|
@@ -110,6 +118,8 @@ export const DeleteMany = props => {
|
|
|
110
118
|
*/
|
|
111
119
|
export function DeleteMany_v4({
|
|
112
120
|
afterDelete,
|
|
121
|
+
hasDeletePermission = false,
|
|
122
|
+
hasTrashPermission = false,
|
|
113
123
|
modalPrefix,
|
|
114
124
|
search,
|
|
115
125
|
selections,
|
|
@@ -125,8 +135,7 @@ export function DeleteMany_v4({
|
|
|
125
135
|
collections,
|
|
126
136
|
routes: {
|
|
127
137
|
api
|
|
128
|
-
}
|
|
129
|
-
serverURL
|
|
138
|
+
}
|
|
130
139
|
}
|
|
131
140
|
} = useConfig();
|
|
132
141
|
const {
|
|
@@ -211,7 +220,13 @@ export function DeleteMany_v4({
|
|
|
211
220
|
addQueryPrefix: true
|
|
212
221
|
})}`
|
|
213
222
|
});
|
|
214
|
-
const
|
|
223
|
+
const permanentlyDelete = shouldPermanentlyDelete({
|
|
224
|
+
deletePermanently,
|
|
225
|
+
hasDeletePermission,
|
|
226
|
+
hasTrashPermission: Boolean(collectionConfig.trash) && hasTrashPermission,
|
|
227
|
+
isTrashView: viewType === 'trash'
|
|
228
|
+
});
|
|
229
|
+
const deleteManyResponse = permanentlyDelete ? await requests.delete(url, {
|
|
215
230
|
headers: {
|
|
216
231
|
'Accept-Language': i18n.language,
|
|
217
232
|
'Content-Type': 'application/json'
|
|
@@ -234,11 +249,10 @@ export function DeleteMany_v4({
|
|
|
234
249
|
const deletedDocs = json?.docs.length || 0;
|
|
235
250
|
const successLabel = deletedDocs > 1 ? plural : singular;
|
|
236
251
|
if (deleteManyResponse.status < 400 || deletedDocs > 0) {
|
|
237
|
-
const wasTrashed = collectionConfig.trash && !deletePermanently && viewType !== 'trash';
|
|
238
252
|
let successKey;
|
|
239
|
-
if (
|
|
253
|
+
if (!permanentlyDelete) {
|
|
240
254
|
successKey = 'general:trashedCountSuccessfully';
|
|
241
|
-
} else if (viewType === 'trash' || deletePermanently) {
|
|
255
|
+
} else if (viewType === 'trash' || hasDeletePermission && deletePermanently) {
|
|
242
256
|
successKey = 'general:permanentlyDeletedCountSuccessfully';
|
|
243
257
|
} else {
|
|
244
258
|
successKey = 'general:deletedCountSuccessfully';
|
|
@@ -279,7 +293,7 @@ export function DeleteMany_v4({
|
|
|
279
293
|
if (typeof afterDelete === 'function') {
|
|
280
294
|
afterDelete(result);
|
|
281
295
|
}
|
|
282
|
-
}, [selections, afterDelete, collections, deletePermanently, locale, search,
|
|
296
|
+
}, [selections, afterDelete, collections, deletePermanently, hasDeletePermission, hasTrashPermission, locale, search, api, i18n, viewType, where, t]);
|
|
283
297
|
const {
|
|
284
298
|
label: labelString,
|
|
285
299
|
labelCount: labelCount_0
|
|
@@ -319,7 +333,7 @@ export function DeleteMany_v4({
|
|
|
319
333
|
}), /*#__PURE__*/_jsx(ConfirmationModal, {
|
|
320
334
|
body: /*#__PURE__*/_jsxs(React.Fragment, {
|
|
321
335
|
children: [/*#__PURE__*/_jsx("p", {
|
|
322
|
-
children: trash ? viewType === 'trash' ? /*#__PURE__*/_jsx(Translation, {
|
|
336
|
+
children: trash && hasTrashPermission ? viewType === 'trash' ? /*#__PURE__*/_jsx(Translation, {
|
|
323
337
|
elements: {
|
|
324
338
|
'0': ({
|
|
325
339
|
children
|
|
@@ -345,7 +359,7 @@ export function DeleteMany_v4({
|
|
|
345
359
|
count: labelCount_0,
|
|
346
360
|
label: labelString
|
|
347
361
|
})
|
|
348
|
-
}), trash && viewType !== 'trash' && /*#__PURE__*/_jsx("div", {
|
|
362
|
+
}), trash && hasTrashPermission && hasDeletePermission && viewType !== 'trash' && /*#__PURE__*/_jsx("div", {
|
|
349
363
|
className: "delete-documents__checkbox",
|
|
350
364
|
children: /*#__PURE__*/_jsx(CheckboxInput, {
|
|
351
365
|
checked: deletePermanently,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["c","_c","useModal","getTranslation","useRouter","useSearchParams","formatAdminURL","mergeListSearchAndWhere","qs","React","toast","CheckboxInput","useAuth","useConfig","useLocale","useRouteCache","SelectAllStatus","useSelection","useTranslation","requests","parseSearchParams","ConfirmationModal","ListSelectionButton","Translation","DeleteMany","props","$","viewType","collection","t0","modalPrefix","slug","trash","undefined","permissions","count","selectAll","selectedIDs","toggleAll","router","searchParams","clearRouteCache","collectionPermissions","collections","hasDeletePermission","delete","selectingAll","AllAvailable","ids","None","baseWhere","where","finalWhere","and","Array","isArray","deletedAt","exists","t1","replace","stringify","page","addQueryPrefix","_jsx","Fragment","children","DeleteMany_v4","afterDelete","search","selections","all","totalCount","length","t","config","routes","api","serverURL","code","locale","i18n","openModal","deletePermanently","setDeletePermanently","useState","confirmManyDeleteDrawerSlug","handleDelete","useCallback","deletingOneCollection","Object","keys","result","relationTo","entries","collectionConfig","find","whereConstraint","id","not_equals","in","url","apiRoute","path","limit","select","deleteManyResponse","headers","language","patch","body","JSON","Date","toISOString","plural","singular","labels","json","deletedDocs","docs","successLabel","status","wasTrashed","successKey","success","label","errors","error","message","description","map","join","deletedCount","doc","totalDocs","_err","labelString","labelCount","reduce","acc","key","value","index","array","collectionLabel","newLabel","_jsxs","className","onClick","elements","0","1","i18nKey","variables","checked","name","onToggle","e","target","confirmingLabel","heading","modalSlug","onConfirm"],"sources":["../../../src/elements/DeleteMany/index.tsx"],"sourcesContent":["'use client'\nimport type { ClientCollectionConfig, ViewTypes, Where } from 'payload'\n\nimport { useModal } from '@faceless-ui/modal'\nimport { getTranslation } from '@payloadcms/translations'\nimport { useRouter, useSearchParams } from 'next/navigation.js'\nimport { formatAdminURL, mergeListSearchAndWhere } from 'payload/shared'\nimport * as qs from 'qs-esm'\nimport React from 'react'\nimport { toast } from 'sonner'\n\nimport { CheckboxInput } from '../../fields/Checkbox/Input.js'\nimport { useAuth } from '../../providers/Auth/index.js'\nimport { useConfig } from '../../providers/Config/index.js'\nimport { useLocale } from '../../providers/Locale/index.js'\nimport { useRouteCache } from '../../providers/RouteCache/index.js'\nimport { SelectAllStatus, useSelection } from '../../providers/Selection/index.js'\nimport { useTranslation } from '../../providers/Translation/index.js'\nimport { requests } from '../../utilities/api.js'\nimport { parseSearchParams } from '../../utilities/parseSearchParams.js'\nimport { ConfirmationModal } from '../ConfirmationModal/index.js'\nimport { ListSelectionButton } from '../ListSelection/index.js'\nimport { Translation } from '../Translation/index.js'\nimport './index.scss'\n\nexport type Props = {\n collection: ClientCollectionConfig\n /**\n * When multiple DeleteMany components are rendered on the page, this will differentiate them.\n */\n modalPrefix?: string\n /**\n * When multiple PublishMany components are rendered on the page, this will differentiate them.\n */\n title?: string\n viewType?: ViewTypes\n}\n\nexport const DeleteMany: React.FC<Props> = (props) => {\n const { viewType } = props\n const { collection: { slug, trash } = {}, modalPrefix } = props\n\n const { permissions } = useAuth()\n const { count, selectAll, selectedIDs, toggleAll } = useSelection()\n const router = useRouter()\n const searchParams = useSearchParams()\n const { clearRouteCache } = useRouteCache()\n\n const collectionPermissions = permissions?.collections?.[slug]\n const hasDeletePermission = collectionPermissions?.delete\n\n const selectingAll = selectAll === SelectAllStatus.AllAvailable\n\n const ids = selectingAll ? [] : selectedIDs\n\n if (selectAll === SelectAllStatus.None || !hasDeletePermission) {\n return null\n }\n\n const baseWhere = parseSearchParams(searchParams)?.where as Where\n\n const finalWhere =\n viewType === 'trash'\n ? {\n and: [\n ...(Array.isArray(baseWhere?.and) ? baseWhere.and : baseWhere ? [baseWhere] : []),\n { deletedAt: { exists: true } },\n ],\n }\n : baseWhere\n\n return (\n <React.Fragment>\n <DeleteMany_v4\n afterDelete={() => {\n toggleAll()\n\n router.replace(\n qs.stringify(\n {\n ...parseSearchParams(searchParams),\n page: selectAll ? '1' : undefined,\n },\n { addQueryPrefix: true },\n ),\n )\n\n clearRouteCache()\n }}\n modalPrefix={modalPrefix}\n search={parseSearchParams(searchParams)?.search as string}\n selections={{\n [slug]: {\n all: selectAll === SelectAllStatus.AllAvailable,\n ids,\n totalCount: selectingAll ? count : ids.length,\n },\n }}\n trash={trash}\n viewType={viewType}\n where={finalWhere}\n />\n </React.Fragment>\n )\n}\n\ntype AfterDeleteResult = {\n [relationTo: string]: {\n deletedCount: number\n errors: unknown[]\n ids: (number | string)[]\n totalCount: number\n }\n}\ntype DeleteMany_v4Props = {\n /**\n * A callback function to be called after the delete request is completed.\n */\n afterDelete?: (result: AfterDeleteResult) => void\n /**\n * When multiple DeleteMany components are rendered on the page, this will differentiate them.\n */\n modalPrefix?: string\n /**\n * Optionally pass a search string to filter the documents to be deleted.\n *\n * This is intentionally passed as a prop so modals could pass in their own\n * search string that may not be stored in the URL.\n */\n search?: string\n /**\n * An object containing the relationTo as the key and an object with the following properties:\n * - all: boolean\n * - totalCount: number\n * - ids: (string | number)[]\n */\n selections: {\n [relationTo: string]: {\n all?: boolean\n ids?: (number | string)[]\n totalCount?: number\n }\n }\n trash?: boolean\n viewType?: ViewTypes\n /**\n * Optionally pass a where clause to filter the documents to be deleted.\n * This will be ignored if multiple relations are selected.\n *\n * This is intentionally passed as a prop so modals could pass in their own\n * where clause that may not be stored in the URL.\n */\n where?: Where\n}\n\n/**\n * Handles polymorphic document delete operations.\n *\n * If you are deleting monomorphic documents, shape your `selections` to match the polymorphic structure.\n */\nexport function DeleteMany_v4({\n afterDelete,\n modalPrefix,\n search,\n selections,\n trash,\n viewType,\n where,\n}: DeleteMany_v4Props) {\n const { t } = useTranslation()\n\n const {\n config: {\n collections,\n routes: { api },\n serverURL,\n },\n } = useConfig()\n\n const { code: locale } = useLocale()\n const { i18n } = useTranslation()\n const { openModal } = useModal()\n\n const [deletePermanently, setDeletePermanently] = React.useState(false)\n const confirmManyDeleteDrawerSlug = `${modalPrefix ? `${modalPrefix}-` : ''}confirm-delete-many-docs`\n\n const handleDelete = React.useCallback(async () => {\n const deletingOneCollection = Object.keys(selections).length === 1\n const result: AfterDeleteResult = {}\n\n for (const [relationTo, { all, ids = [] }] of Object.entries(selections)) {\n const collectionConfig = collections.find(({ slug }) => slug === relationTo)\n\n if (collectionConfig) {\n let whereConstraint: Where\n\n if (all) {\n // selecting all documents with optional where filter\n if (deletingOneCollection && where) {\n whereConstraint =\n viewType === 'trash'\n ? {\n and: [\n ...(Array.isArray(where.and) ? where.and : [where]),\n { deletedAt: { exists: true } },\n ],\n }\n : where\n } else {\n whereConstraint =\n viewType === 'trash'\n ? {\n and: [{ id: { not_equals: '' } }, { deletedAt: { exists: true } }],\n }\n : {\n id: { not_equals: '' },\n }\n }\n } else {\n // selecting specific documents\n whereConstraint = {\n and: [\n { id: { in: ids } },\n ...(viewType === 'trash' ? [{ deletedAt: { exists: true } }] : []),\n ],\n }\n }\n\n const url = formatAdminURL({\n apiRoute: api,\n path: `/${relationTo}${qs.stringify(\n {\n limit: 0,\n locale,\n select: {},\n where: mergeListSearchAndWhere({\n collectionConfig,\n search,\n where: whereConstraint,\n }),\n ...(viewType === 'trash' ? { trash: true } : {}),\n },\n { addQueryPrefix: true },\n )}`,\n })\n\n const deleteManyResponse =\n viewType === 'trash' || deletePermanently || !collectionConfig.trash\n ? await requests.delete(url, {\n headers: {\n 'Accept-Language': i18n.language,\n 'Content-Type': 'application/json',\n },\n })\n : await requests.patch(url, {\n body: JSON.stringify({\n deletedAt: new Date().toISOString(),\n }),\n headers: {\n 'Accept-Language': i18n.language,\n 'Content-Type': 'application/json',\n },\n })\n\n try {\n const { plural, singular } = collectionConfig.labels\n const json = await deleteManyResponse.json()\n\n const deletedDocs = json?.docs.length || 0\n const successLabel = deletedDocs > 1 ? plural : singular\n\n if (deleteManyResponse.status < 400 || deletedDocs > 0) {\n const wasTrashed = collectionConfig.trash && !deletePermanently && viewType !== 'trash'\n\n let successKey:\n | 'general:deletedCountSuccessfully'\n | 'general:permanentlyDeletedCountSuccessfully'\n | 'general:trashedCountSuccessfully'\n\n if (wasTrashed) {\n successKey = 'general:trashedCountSuccessfully'\n } else if (viewType === 'trash' || deletePermanently) {\n successKey = 'general:permanentlyDeletedCountSuccessfully'\n } else {\n successKey = 'general:deletedCountSuccessfully'\n }\n\n toast.success(\n t(successKey, {\n count: deletedDocs,\n label: getTranslation(successLabel, i18n),\n }),\n )\n }\n\n if (json?.errors.length > 0) {\n toast.error(json.message, {\n description: json.errors.map((error) => error.message).join('\\n'),\n })\n }\n\n result[relationTo] = {\n deletedCount: deletedDocs,\n errors: json?.errors || null,\n ids: json?.docs.map((doc) => doc.id) || [],\n totalCount: json.totalDocs,\n }\n\n if (deleteManyResponse.status > 400 && json?.errors.length === 0) {\n toast.error(t('error:unknown'))\n result[relationTo].errors = [t('error:unknown')]\n }\n\n continue\n } catch (_err) {\n toast.error(t('error:unknown'))\n result[relationTo] = {\n deletedCount: 0,\n errors: [_err],\n ids: [],\n totalCount: 0,\n }\n continue\n }\n }\n }\n\n if (typeof afterDelete === 'function') {\n afterDelete(result)\n }\n }, [\n selections,\n afterDelete,\n collections,\n deletePermanently,\n locale,\n search,\n serverURL,\n api,\n i18n,\n viewType,\n where,\n t,\n ])\n\n const { label: labelString, labelCount } = Object.entries(selections).reduce(\n (acc, [key, value], index, array) => {\n const collectionConfig = collections.find(({ slug }) => slug === key)\n if (collectionConfig) {\n const labelCount = acc.labelCount === undefined ? value.totalCount : acc.labelCount\n const collectionLabel = `${acc.labelCount !== undefined ? `${value.totalCount} ` : ''}${getTranslation(\n value.totalCount > 1 ? collectionConfig.labels.plural : collectionConfig.labels.singular,\n i18n,\n )}`\n\n let newLabel\n\n if (index === array.length - 1 && index !== 0) {\n newLabel = `${acc.label} and ${collectionLabel}`\n } else if (index > 0) {\n newLabel = `${acc.label}, ${collectionLabel}`\n } else {\n newLabel = collectionLabel\n }\n\n return {\n label: newLabel,\n labelCount,\n }\n }\n return acc\n },\n {\n label: '',\n labelCount: undefined,\n },\n )\n\n return (\n <React.Fragment>\n <ListSelectionButton\n aria-label={t('general:delete')}\n className=\"delete-documents__toggle\"\n onClick={() => {\n openModal(confirmManyDeleteDrawerSlug)\n }}\n >\n {t('general:delete')}\n </ListSelectionButton>\n <ConfirmationModal\n body={\n <React.Fragment>\n <p>\n {trash ? (\n viewType === 'trash' ? (\n <Translation\n elements={{\n '0': ({ children }) => <strong>{children}</strong>,\n '1': ({ children }) => <strong>{children}</strong>,\n }}\n i18nKey=\"general:aboutToPermanentlyDeleteTrash\"\n t={t}\n variables={{\n count: labelCount ?? 0,\n label: labelString,\n }}\n />\n ) : (\n t('general:aboutToTrashCount', { count: labelCount, label: labelString })\n )\n ) : (\n t('general:aboutToDeleteCount', { count: labelCount, label: labelString })\n )}\n </p>\n {trash && viewType !== 'trash' && (\n <div className=\"delete-documents__checkbox\">\n <CheckboxInput\n checked={deletePermanently}\n id=\"delete-forever\"\n label={t('general:deletePermanently')}\n name=\"delete-forever\"\n onToggle={(e) => setDeletePermanently(e.target.checked)}\n />\n </div>\n )}\n </React.Fragment>\n }\n confirmingLabel={t('general:deleting')}\n heading={t('general:confirmDeletion')}\n modalSlug={confirmManyDeleteDrawerSlug}\n onConfirm={handleDelete}\n />\n </React.Fragment>\n )\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"index.js","names":["c","_c","useModal","getTranslation","useRouter","useSearchParams","formatAdminURL","mergeListSearchAndWhere","qs","React","toast","CheckboxInput","useAuth","useConfig","useLocale","useRouteCache","SelectAllStatus","useSelection","useTranslation","requests","parseSearchParams","shouldPermanentlyDelete","ConfirmationModal","ListSelectionButton","Translation","DeleteMany","props","$","viewType","collection","t0","hasDeletePermission","hasDeletePermissionFromProps","hasTrashPermission","hasTrashPermissionFromProps","modalPrefix","slug","trash","undefined","permissions","count","selectAll","selectedIDs","toggleAll","router","searchParams","clearRouteCache","collectionPermissions","collections","Boolean","delete","selectingAll","AllAvailable","ids","isTrashView","canShowDeleteButton","None","baseWhere","where","finalWhere","and","Array","isArray","deletedAt","exists","t1","replace","stringify","page","addQueryPrefix","_jsx","Fragment","children","DeleteMany_v4","afterDelete","search","selections","all","totalCount","length","t","config","routes","api","code","locale","i18n","openModal","deletePermanently","setDeletePermanently","useState","confirmManyDeleteDrawerSlug","handleDelete","useCallback","deletingOneCollection","Object","keys","result","relationTo","entries","collectionConfig","find","whereConstraint","id","not_equals","in","url","apiRoute","path","limit","select","permanentlyDelete","deleteManyResponse","headers","language","patch","body","JSON","Date","toISOString","plural","singular","labels","json","deletedDocs","docs","successLabel","status","successKey","success","label","errors","error","message","description","map","join","deletedCount","doc","totalDocs","_err","labelString","labelCount","reduce","acc","key","value","index","array","collectionLabel","newLabel","_jsxs","className","onClick","elements","0","1","i18nKey","variables","checked","name","onToggle","e","target","confirmingLabel","heading","modalSlug","onConfirm"],"sources":["../../../src/elements/DeleteMany/index.tsx"],"sourcesContent":["'use client'\nimport type { ClientCollectionConfig, ViewTypes, Where } from 'payload'\n\nimport { useModal } from '@faceless-ui/modal'\nimport { getTranslation } from '@payloadcms/translations'\nimport { useRouter, useSearchParams } from 'next/navigation.js'\nimport { formatAdminURL, mergeListSearchAndWhere } from 'payload/shared'\nimport * as qs from 'qs-esm'\nimport React from 'react'\nimport { toast } from 'sonner'\n\nimport { CheckboxInput } from '../../fields/Checkbox/Input.js'\nimport { useAuth } from '../../providers/Auth/index.js'\nimport { useConfig } from '../../providers/Config/index.js'\nimport { useLocale } from '../../providers/Locale/index.js'\nimport { useRouteCache } from '../../providers/RouteCache/index.js'\nimport { SelectAllStatus, useSelection } from '../../providers/Selection/index.js'\nimport { useTranslation } from '../../providers/Translation/index.js'\nimport { requests } from '../../utilities/api.js'\nimport { parseSearchParams } from '../../utilities/parseSearchParams.js'\nimport { shouldPermanentlyDelete } from '../../utilities/shouldPermanentlyDelete.js'\nimport { ConfirmationModal } from '../ConfirmationModal/index.js'\nimport { ListSelectionButton } from '../ListSelection/index.js'\nimport { Translation } from '../Translation/index.js'\nimport './index.scss'\n\nexport type Props = {\n collection: ClientCollectionConfig\n /**\n * Whether the user has permission to permanently delete documents.\n * If provided, uses this instead of reading from auth context.\n */\n hasDeletePermission?: boolean\n /**\n * Whether the user has permission to trash (soft delete) documents.\n * If provided, uses this instead of reading from auth context.\n */\n hasTrashPermission?: boolean\n /**\n * When multiple DeleteMany components are rendered on the page, this will differentiate them.\n */\n modalPrefix?: string\n /**\n * When multiple PublishMany components are rendered on the page, this will differentiate them.\n */\n title?: string\n viewType?: ViewTypes\n}\n\nexport const DeleteMany: React.FC<Props> = (props) => {\n const { viewType } = props\n const {\n collection: { slug, trash } = {},\n hasDeletePermission: hasDeletePermissionFromProps,\n hasTrashPermission: hasTrashPermissionFromProps,\n modalPrefix,\n } = props\n\n const { permissions } = useAuth()\n const { count, selectAll, selectedIDs, toggleAll } = useSelection()\n const router = useRouter()\n const searchParams = useSearchParams()\n const { clearRouteCache } = useRouteCache()\n\n const collectionPermissions = permissions?.collections?.[slug]\n\n const hasDeletePermission =\n hasDeletePermissionFromProps !== undefined\n ? hasDeletePermissionFromProps\n : Boolean(collectionPermissions?.delete)\n const hasTrashPermission =\n hasTrashPermissionFromProps !== undefined ? hasTrashPermissionFromProps : hasDeletePermission\n\n const selectingAll = selectAll === SelectAllStatus.AllAvailable\n\n const ids = selectingAll ? [] : selectedIDs\n\n const isTrashView = viewType === 'trash'\n const canShowDeleteButton = isTrashView\n ? hasDeletePermission\n : hasDeletePermission || hasTrashPermission\n\n if (selectAll === SelectAllStatus.None || !canShowDeleteButton) {\n return null\n }\n\n const baseWhere = parseSearchParams(searchParams)?.where as Where\n\n const finalWhere =\n viewType === 'trash'\n ? {\n and: [\n ...(Array.isArray(baseWhere?.and) ? baseWhere.and : baseWhere ? [baseWhere] : []),\n { deletedAt: { exists: true } },\n ],\n }\n : baseWhere\n\n return (\n <React.Fragment>\n <DeleteMany_v4\n afterDelete={() => {\n toggleAll()\n\n router.replace(\n qs.stringify(\n {\n ...parseSearchParams(searchParams),\n page: selectAll ? '1' : undefined,\n },\n { addQueryPrefix: true },\n ),\n )\n\n clearRouteCache()\n }}\n hasDeletePermission={hasDeletePermission}\n hasTrashPermission={hasTrashPermission}\n modalPrefix={modalPrefix}\n search={parseSearchParams(searchParams)?.search as string}\n selections={{\n [slug]: {\n all: selectAll === SelectAllStatus.AllAvailable,\n ids,\n totalCount: selectingAll ? count : ids.length,\n },\n }}\n trash={trash}\n viewType={viewType}\n where={finalWhere}\n />\n </React.Fragment>\n )\n}\n\ntype AfterDeleteResult = {\n [relationTo: string]: {\n deletedCount: number\n errors: unknown[]\n ids: (number | string)[]\n totalCount: number\n }\n}\ntype DeleteMany_v4Props = {\n /**\n * A callback function to be called after the delete request is completed.\n */\n afterDelete?: (result: AfterDeleteResult) => void\n /**\n * Whether the user has permission to permanently delete documents.\n * When false, the \"delete permanently\" checkbox will be hidden.\n */\n hasDeletePermission?: boolean\n /**\n * Whether the user has permission to trash (soft delete) documents.\n * When false and hasDeletePermission is true, only permanent delete is available.\n */\n hasTrashPermission?: boolean\n /**\n * When multiple DeleteMany components are rendered on the page, this will differentiate them.\n */\n modalPrefix?: string\n /**\n * Optionally pass a search string to filter the documents to be deleted.\n *\n * This is intentionally passed as a prop so modals could pass in their own\n * search string that may not be stored in the URL.\n */\n search?: string\n /**\n * An object containing the relationTo as the key and an object with the following properties:\n * - all: boolean\n * - totalCount: number\n * - ids: (string | number)[]\n */\n selections: {\n [relationTo: string]: {\n all?: boolean\n ids?: (number | string)[]\n totalCount?: number\n }\n }\n trash?: boolean\n viewType?: ViewTypes\n /**\n * Optionally pass a where clause to filter the documents to be deleted.\n * This will be ignored if multiple relations are selected.\n *\n * This is intentionally passed as a prop so modals could pass in their own\n * where clause that may not be stored in the URL.\n */\n where?: Where\n}\n\n/**\n * Handles polymorphic document delete operations.\n *\n * If you are deleting monomorphic documents, shape your `selections` to match the polymorphic structure.\n */\nexport function DeleteMany_v4({\n afterDelete,\n hasDeletePermission = false,\n hasTrashPermission = false,\n modalPrefix,\n search,\n selections,\n trash,\n viewType,\n where,\n}: DeleteMany_v4Props) {\n const { t } = useTranslation()\n\n const {\n config: {\n collections,\n routes: { api },\n },\n } = useConfig()\n\n const { code: locale } = useLocale()\n const { i18n } = useTranslation()\n const { openModal } = useModal()\n\n const [deletePermanently, setDeletePermanently] = React.useState(false)\n const confirmManyDeleteDrawerSlug = `${modalPrefix ? `${modalPrefix}-` : ''}confirm-delete-many-docs`\n\n const handleDelete = React.useCallback(async () => {\n const deletingOneCollection = Object.keys(selections).length === 1\n const result: AfterDeleteResult = {}\n\n for (const [relationTo, { all, ids = [] }] of Object.entries(selections)) {\n const collectionConfig = collections.find(({ slug }) => slug === relationTo)\n\n if (collectionConfig) {\n let whereConstraint: Where\n\n if (all) {\n // selecting all documents with optional where filter\n if (deletingOneCollection && where) {\n whereConstraint =\n viewType === 'trash'\n ? {\n and: [\n ...(Array.isArray(where.and) ? where.and : [where]),\n { deletedAt: { exists: true } },\n ],\n }\n : where\n } else {\n whereConstraint =\n viewType === 'trash'\n ? {\n and: [{ id: { not_equals: '' } }, { deletedAt: { exists: true } }],\n }\n : {\n id: { not_equals: '' },\n }\n }\n } else {\n // selecting specific documents\n whereConstraint = {\n and: [\n { id: { in: ids } },\n ...(viewType === 'trash' ? [{ deletedAt: { exists: true } }] : []),\n ],\n }\n }\n\n const url = formatAdminURL({\n apiRoute: api,\n path: `/${relationTo}${qs.stringify(\n {\n limit: 0,\n locale,\n select: {},\n where: mergeListSearchAndWhere({\n collectionConfig,\n search,\n where: whereConstraint,\n }),\n ...(viewType === 'trash' ? { trash: true } : {}),\n },\n { addQueryPrefix: true },\n )}`,\n })\n\n const permanentlyDelete = shouldPermanentlyDelete({\n deletePermanently,\n hasDeletePermission,\n hasTrashPermission: Boolean(collectionConfig.trash) && hasTrashPermission,\n isTrashView: viewType === 'trash',\n })\n\n const deleteManyResponse = permanentlyDelete\n ? await requests.delete(url, {\n headers: {\n 'Accept-Language': i18n.language,\n 'Content-Type': 'application/json',\n },\n })\n : await requests.patch(url, {\n body: JSON.stringify({\n deletedAt: new Date().toISOString(),\n }),\n headers: {\n 'Accept-Language': i18n.language,\n 'Content-Type': 'application/json',\n },\n })\n\n try {\n const { plural, singular } = collectionConfig.labels\n const json = await deleteManyResponse.json()\n\n const deletedDocs = json?.docs.length || 0\n const successLabel = deletedDocs > 1 ? plural : singular\n\n if (deleteManyResponse.status < 400 || deletedDocs > 0) {\n let successKey:\n | 'general:deletedCountSuccessfully'\n | 'general:permanentlyDeletedCountSuccessfully'\n | 'general:trashedCountSuccessfully'\n\n if (!permanentlyDelete) {\n successKey = 'general:trashedCountSuccessfully'\n } else if (viewType === 'trash' || (hasDeletePermission && deletePermanently)) {\n successKey = 'general:permanentlyDeletedCountSuccessfully'\n } else {\n successKey = 'general:deletedCountSuccessfully'\n }\n\n toast.success(\n t(successKey, {\n count: deletedDocs,\n label: getTranslation(successLabel, i18n),\n }),\n )\n }\n\n if (json?.errors.length > 0) {\n toast.error(json.message, {\n description: json.errors.map((error) => error.message).join('\\n'),\n })\n }\n\n result[relationTo] = {\n deletedCount: deletedDocs,\n errors: json?.errors || null,\n ids: json?.docs.map((doc) => doc.id) || [],\n totalCount: json.totalDocs,\n }\n\n if (deleteManyResponse.status > 400 && json?.errors.length === 0) {\n toast.error(t('error:unknown'))\n result[relationTo].errors = [t('error:unknown')]\n }\n\n continue\n } catch (_err) {\n toast.error(t('error:unknown'))\n result[relationTo] = {\n deletedCount: 0,\n errors: [_err],\n ids: [],\n totalCount: 0,\n }\n continue\n }\n }\n }\n\n if (typeof afterDelete === 'function') {\n afterDelete(result)\n }\n }, [\n selections,\n afterDelete,\n collections,\n deletePermanently,\n hasDeletePermission,\n hasTrashPermission,\n locale,\n search,\n api,\n i18n,\n viewType,\n where,\n t,\n ])\n\n const { label: labelString, labelCount } = Object.entries(selections).reduce(\n (acc, [key, value], index, array) => {\n const collectionConfig = collections.find(({ slug }) => slug === key)\n if (collectionConfig) {\n const labelCount = acc.labelCount === undefined ? value.totalCount : acc.labelCount\n const collectionLabel = `${acc.labelCount !== undefined ? `${value.totalCount} ` : ''}${getTranslation(\n value.totalCount > 1 ? collectionConfig.labels.plural : collectionConfig.labels.singular,\n i18n,\n )}`\n\n let newLabel\n\n if (index === array.length - 1 && index !== 0) {\n newLabel = `${acc.label} and ${collectionLabel}`\n } else if (index > 0) {\n newLabel = `${acc.label}, ${collectionLabel}`\n } else {\n newLabel = collectionLabel\n }\n\n return {\n label: newLabel,\n labelCount,\n }\n }\n return acc\n },\n {\n label: '',\n labelCount: undefined,\n },\n )\n\n return (\n <React.Fragment>\n <ListSelectionButton\n aria-label={t('general:delete')}\n className=\"delete-documents__toggle\"\n onClick={() => {\n openModal(confirmManyDeleteDrawerSlug)\n }}\n >\n {t('general:delete')}\n </ListSelectionButton>\n <ConfirmationModal\n body={\n <React.Fragment>\n <p>\n {trash && hasTrashPermission ? (\n viewType === 'trash' ? (\n <Translation\n elements={{\n '0': ({ children }) => <strong>{children}</strong>,\n '1': ({ children }) => <strong>{children}</strong>,\n }}\n i18nKey=\"general:aboutToPermanentlyDeleteTrash\"\n t={t}\n variables={{\n count: labelCount ?? 0,\n label: labelString,\n }}\n />\n ) : (\n t('general:aboutToTrashCount', { count: labelCount, label: labelString })\n )\n ) : (\n t('general:aboutToDeleteCount', { count: labelCount, label: labelString })\n )}\n </p>\n {trash && hasTrashPermission && hasDeletePermission && viewType !== 'trash' && (\n <div className=\"delete-documents__checkbox\">\n <CheckboxInput\n checked={deletePermanently}\n id=\"delete-forever\"\n label={t('general:deletePermanently')}\n name=\"delete-forever\"\n onToggle={(e) => setDeletePermanently(e.target.checked)}\n />\n </div>\n )}\n </React.Fragment>\n }\n confirmingLabel={t('general:deleting')}\n heading={t('general:confirmDeletion')}\n modalSlug={confirmManyDeleteDrawerSlug}\n onConfirm={handleDelete}\n />\n </React.Fragment>\n )\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/elements/DocumentControls/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,UAAU,EACV,IAAI,EACJ,yBAAyB,EACzB,6BAA6B,EAC7B,yBAAyB,EAC1B,MAAM,SAAS,CAAA;AAIhB,OAAO,KAA8B,MAAM,OAAO,CAAA;AAElD,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,+BAA+B,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/elements/DocumentControls/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,UAAU,EACV,IAAI,EACJ,yBAAyB,EACzB,6BAA6B,EAC7B,yBAAyB,EAC1B,MAAM,SAAS,CAAA;AAIhB,OAAO,KAA8B,MAAM,OAAO,CAAA;AAElD,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,+BAA+B,CAAA;AAyB9E,OAAO,cAAc,CAAA;AAOrB,eAAO,MAAM,gBAAgB,EAAE,KAAK,CAAC,EAAE,CAAC;IACtC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,sBAAsB,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IACjD,QAAQ,CAAC,gBAAgB,CAAC,EAAE;QAC1B,QAAQ,CAAC,aAAa,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;QACxC,QAAQ,CAAC,aAAa,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;QACxC,QAAQ,CAAC,UAAU,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;QACrC,QAAQ,CAAC,eAAe,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;QAC1C,QAAQ,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;QACjC,QAAQ,CAAC,eAAe,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;KAC3C,CAAA;IACD,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,CAAA;IACpB,QAAQ,CAAC,cAAc,CAAC,EAAE,OAAO,CAAA;IACjC,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAA;IAChC,QAAQ,CAAC,aAAa,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IACxC,QAAQ,CAAC,oBAAoB,CAAC,EAAE,OAAO,CAAA;IACvC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,OAAO,CAAA;IACpC,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IAC7B,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAA;IAChC,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAA;IAC5B,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAA;IAC7B,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAA;IAC5B,QAAQ,CAAC,QAAQ,CAAC,EAAE,yBAAyB,CAAC,UAAU,CAAC,CAAA;IACzD,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,IAAI,CAAA;IAEvC,QAAQ,CAAC,WAAW,CAAC,EAAE,yBAAyB,CAAC,aAAa,CAAC,CAAA;IAC/D,QAAQ,CAAC,SAAS,CAAC,EAAE,yBAAyB,CAAC,WAAW,CAAC,CAAA;IAC3D,QAAQ,CAAC,MAAM,CAAC,EAAE,yBAAyB,CAAC,QAAQ,CAAC,CAAA;IACrD,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,IAAI,CAAA;IAChC,QAAQ,CAAC,WAAW,EAAE,IAAI,GAAG,6BAA6B,GAAG,yBAAyB,CAAA;IACtF,QAAQ,CAAC,uBAAuB,CAAC,EAAE,OAAO,CAAA;IAC1C,QAAQ,CAAC,mBAAmB,CAAC,EAAE,OAAO,CAAA;IACtC,QAAQ,CAAC,sBAAsB,CAAC,EAAE,OAAO,CAAA;IACzC,QAAQ,CAAC,oBAAoB,CAAC,EAAE,OAAO,CAAA;IACvC,QAAQ,CAAC,IAAI,EAAE,yBAAyB,CAAC,MAAM,CAAC,CAAA;IAChD,QAAQ,CAAC,IAAI,CAAC,EAAE,UAAU,CAAA;CAC3B,CAqVA,CAAA"}
|
|
@@ -7,6 +7,7 @@ import { formatAdminURL, hasAutosaveEnabled, hasDraftsEnabled } from 'payload/sh
|
|
|
7
7
|
import React, { Fragment, useEffect } from 'react';
|
|
8
8
|
import { useFormInitializing, useFormProcessing } from '../../forms/Form/context.js';
|
|
9
9
|
import { useConfig } from '../../providers/Config/index.js';
|
|
10
|
+
import { useDocumentInfo } from '../../providers/DocumentInfo/index.js';
|
|
10
11
|
import { useEditDepth } from '../../providers/EditDepth/index.js';
|
|
11
12
|
import { useLivePreviewContext } from '../../providers/LivePreview/context.js';
|
|
12
13
|
import { useTranslation } from '../../providers/Translation/index.js';
|
|
@@ -86,6 +87,10 @@ export const DocumentControls = props => {
|
|
|
86
87
|
const {
|
|
87
88
|
isLivePreviewEnabled
|
|
88
89
|
} = useLivePreviewContext();
|
|
90
|
+
const {
|
|
91
|
+
hasDeletePermission: docHasDeletePermission,
|
|
92
|
+
hasTrashPermission: docHasTrashPermission
|
|
93
|
+
} = useDocumentInfo();
|
|
89
94
|
const {
|
|
90
95
|
admin: t1,
|
|
91
96
|
localization,
|
|
@@ -132,7 +137,8 @@ export const DocumentControls = props => {
|
|
|
132
137
|
}
|
|
133
138
|
useEffect(t3, t4);
|
|
134
139
|
const hasCreatePermission = permissions && "create" in permissions && permissions.create;
|
|
135
|
-
const
|
|
140
|
+
const collectionDeletePermission = permissions && "delete" in permissions && permissions.delete;
|
|
141
|
+
const hasDeletePermission = collectionConfig?.trash ? docHasTrashPermission || docHasDeletePermission : collectionDeletePermission;
|
|
136
142
|
const showDotMenu = Boolean(collectionConfig && id && !disableActions && (hasCreatePermission || hasDeletePermission));
|
|
137
143
|
const unsavedDraftWithValidations = !id && collectionConfig?.versions?.drafts && collectionConfig.versions?.drafts.validate;
|
|
138
144
|
const globalHasDraftsEnabled = hasDraftsEnabled(globalConfig);
|
|
@@ -229,7 +235,7 @@ export const DocumentControls = props => {
|
|
|
229
235
|
CustomComponent: CustomSaveButton,
|
|
230
236
|
Fallback: _jsx(SaveButton, {})
|
|
231
237
|
})
|
|
232
|
-
}),
|
|
238
|
+
}), docHasDeletePermission && isTrashed && _jsx(PermanentlyDeleteButton, {
|
|
233
239
|
buttonId: "action-permanently-delete",
|
|
234
240
|
collectionSlug: collectionConfig?.slug,
|
|
235
241
|
id: id.toString(),
|