@payloadcms/ui 3.49.0-canary.8 → 3.49.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (158) hide show
  1. package/dist/elements/DeleteDocument/index.d.ts.map +1 -1
  2. package/dist/elements/DeleteDocument/index.js +65 -47
  3. package/dist/elements/DeleteDocument/index.js.map +1 -1
  4. package/dist/elements/DeleteDocument/index.scss +10 -0
  5. package/dist/elements/DeleteMany/index.d.ts +6 -2
  6. package/dist/elements/DeleteMany/index.d.ts.map +1 -1
  7. package/dist/elements/DeleteMany/index.js +153 -51
  8. package/dist/elements/DeleteMany/index.js.map +1 -1
  9. package/dist/elements/DeleteMany/index.scss +13 -0
  10. package/dist/elements/DocumentControls/index.d.ts +3 -0
  11. package/dist/elements/DocumentControls/index.d.ts.map +1 -1
  12. package/dist/elements/DocumentControls/index.js +24 -5
  13. package/dist/elements/DocumentControls/index.js.map +1 -1
  14. package/dist/elements/DocumentDrawer/DrawerContent.d.ts.map +1 -1
  15. package/dist/elements/DocumentDrawer/DrawerContent.js +4 -2
  16. package/dist/elements/DocumentDrawer/DrawerContent.js.map +1 -1
  17. package/dist/elements/DocumentDrawer/Provider.d.ts +4 -0
  18. package/dist/elements/DocumentDrawer/Provider.d.ts.map +1 -1
  19. package/dist/elements/DocumentDrawer/Provider.js.map +1 -1
  20. package/dist/elements/DocumentDrawer/types.d.ts +1 -0
  21. package/dist/elements/DocumentDrawer/types.d.ts.map +1 -1
  22. package/dist/elements/DocumentDrawer/types.js.map +1 -1
  23. package/dist/elements/DocumentFields/index.d.ts +1 -0
  24. package/dist/elements/DocumentFields/index.d.ts.map +1 -1
  25. package/dist/elements/DocumentFields/index.js +3 -1
  26. package/dist/elements/DocumentFields/index.js.map +1 -1
  27. package/dist/elements/FolderView/Cell/index.client.d.ts +3 -2
  28. package/dist/elements/FolderView/Cell/index.client.d.ts.map +1 -1
  29. package/dist/elements/FolderView/Cell/index.client.js +3 -1
  30. package/dist/elements/FolderView/Cell/index.client.js.map +1 -1
  31. package/dist/elements/FolderView/Cell/index.server.d.ts.map +1 -1
  32. package/dist/elements/FolderView/Cell/index.server.js +2 -1
  33. package/dist/elements/FolderView/Cell/index.server.js.map +1 -1
  34. package/dist/elements/ListHeader/TitleActions/ListEmptyTrashButton.d.ts +7 -0
  35. package/dist/elements/ListHeader/TitleActions/ListEmptyTrashButton.d.ts.map +1 -0
  36. package/dist/elements/ListHeader/TitleActions/ListEmptyTrashButton.js +164 -0
  37. package/dist/elements/ListHeader/TitleActions/ListEmptyTrashButton.js.map +1 -0
  38. package/dist/elements/ListHeader/TitleActions/index.d.ts +1 -0
  39. package/dist/elements/ListHeader/TitleActions/index.d.ts.map +1 -1
  40. package/dist/elements/ListHeader/TitleActions/index.js +1 -0
  41. package/dist/elements/ListHeader/TitleActions/index.js.map +1 -1
  42. package/dist/elements/ListHeaderTabs/ByFolderPill.d.ts +10 -0
  43. package/dist/elements/ListHeaderTabs/ByFolderPill.d.ts.map +1 -0
  44. package/dist/elements/ListHeaderTabs/ByFolderPill.js +70 -0
  45. package/dist/elements/ListHeaderTabs/ByFolderPill.js.map +1 -0
  46. package/dist/elements/ListHeaderTabs/DefaultListPill.d.ts +9 -0
  47. package/dist/elements/ListHeaderTabs/DefaultListPill.d.ts.map +1 -0
  48. package/dist/elements/ListHeaderTabs/DefaultListPill.js +68 -0
  49. package/dist/elements/ListHeaderTabs/DefaultListPill.js.map +1 -0
  50. package/dist/elements/ListHeaderTabs/TrashPill.d.ts +6 -0
  51. package/dist/elements/ListHeaderTabs/TrashPill.d.ts.map +1 -0
  52. package/dist/elements/ListHeaderTabs/TrashPill.js +53 -0
  53. package/dist/elements/ListHeaderTabs/TrashPill.js.map +1 -0
  54. package/dist/elements/{ListFolderPills → ListHeaderTabs}/index.scss +1 -2
  55. package/dist/elements/ListSelection/index.scss +1 -1
  56. package/dist/elements/PermanentlyDeleteButton/index.d.ts +14 -0
  57. package/dist/elements/PermanentlyDeleteButton/index.d.ts.map +1 -0
  58. package/dist/elements/PermanentlyDeleteButton/index.js +147 -0
  59. package/dist/elements/PermanentlyDeleteButton/index.js.map +1 -0
  60. package/dist/elements/RestoreButton/index.d.ts +15 -0
  61. package/dist/elements/RestoreButton/index.d.ts.map +1 -0
  62. package/dist/elements/RestoreButton/index.js +171 -0
  63. package/dist/elements/RestoreButton/index.js.map +1 -0
  64. package/dist/elements/RestoreButton/index.scss +25 -0
  65. package/dist/elements/RestoreMany/index.d.ts +9 -0
  66. package/dist/elements/RestoreMany/index.d.ts.map +1 -0
  67. package/dist/elements/RestoreMany/index.js +193 -0
  68. package/dist/elements/RestoreMany/index.js.map +1 -0
  69. package/dist/elements/RestoreMany/index.scss +25 -0
  70. package/dist/elements/Status/index.d.ts.map +1 -1
  71. package/dist/elements/Status/index.js +6 -4
  72. package/dist/elements/Status/index.js.map +1 -1
  73. package/dist/elements/Table/DefaultCell/index.d.ts.map +1 -1
  74. package/dist/elements/Table/DefaultCell/index.js +10 -8
  75. package/dist/elements/Table/DefaultCell/index.js.map +1 -1
  76. package/dist/elements/TrashBanner/index.d.ts +4 -0
  77. package/dist/elements/TrashBanner/index.d.ts.map +1 -0
  78. package/dist/elements/TrashBanner/index.js +37 -0
  79. package/dist/elements/TrashBanner/index.js.map +1 -0
  80. package/dist/elements/TrashBanner/index.scss +20 -0
  81. package/dist/exports/client/index.js +24 -22
  82. package/dist/exports/client/index.js.map +4 -4
  83. package/dist/fields/Checkbox/Input.d.ts.map +1 -1
  84. package/dist/fields/Checkbox/Input.js +2 -0
  85. package/dist/fields/Checkbox/Input.js.map +1 -1
  86. package/dist/forms/fieldSchemasToFormState/addFieldStatePromise.d.ts +1 -0
  87. package/dist/forms/fieldSchemasToFormState/addFieldStatePromise.d.ts.map +1 -1
  88. package/dist/forms/fieldSchemasToFormState/addFieldStatePromise.js +7 -0
  89. package/dist/forms/fieldSchemasToFormState/addFieldStatePromise.js.map +1 -1
  90. package/dist/forms/fieldSchemasToFormState/index.d.ts +2 -1
  91. package/dist/forms/fieldSchemasToFormState/index.d.ts.map +1 -1
  92. package/dist/forms/fieldSchemasToFormState/index.js +2 -0
  93. package/dist/forms/fieldSchemasToFormState/index.js.map +1 -1
  94. package/dist/forms/fieldSchemasToFormState/iterateFields.d.ts +2 -1
  95. package/dist/forms/fieldSchemasToFormState/iterateFields.d.ts.map +1 -1
  96. package/dist/forms/fieldSchemasToFormState/iterateFields.js +2 -0
  97. package/dist/forms/fieldSchemasToFormState/iterateFields.js.map +1 -1
  98. package/dist/forms/fieldSchemasToFormState/renderField.d.ts.map +1 -1
  99. package/dist/forms/fieldSchemasToFormState/renderField.js +2 -1
  100. package/dist/forms/fieldSchemasToFormState/renderField.js.map +1 -1
  101. package/dist/forms/fieldSchemasToFormState/types.d.ts +1 -0
  102. package/dist/forms/fieldSchemasToFormState/types.d.ts.map +1 -1
  103. package/dist/forms/fieldSchemasToFormState/types.js.map +1 -1
  104. package/dist/icons/Trash/index.d.ts +6 -0
  105. package/dist/icons/Trash/index.d.ts.map +1 -0
  106. package/dist/icons/Trash/index.js +22 -0
  107. package/dist/icons/Trash/index.js.map +1 -0
  108. package/dist/icons/Trash/index.scss +6 -0
  109. package/dist/providers/DocumentInfo/types.d.ts +2 -0
  110. package/dist/providers/DocumentInfo/types.d.ts.map +1 -1
  111. package/dist/providers/DocumentInfo/types.js.map +1 -1
  112. package/dist/providers/ServerFunctions/index.d.ts +1 -0
  113. package/dist/providers/ServerFunctions/index.d.ts.map +1 -1
  114. package/dist/providers/ServerFunctions/index.js.map +1 -1
  115. package/dist/providers/TableColumns/buildColumnState/index.d.ts +2 -1
  116. package/dist/providers/TableColumns/buildColumnState/index.d.ts.map +1 -1
  117. package/dist/providers/TableColumns/buildColumnState/index.js +4 -2
  118. package/dist/providers/TableColumns/buildColumnState/index.js.map +1 -1
  119. package/dist/providers/TableColumns/buildColumnState/renderCell.d.ts +3 -2
  120. package/dist/providers/TableColumns/buildColumnState/renderCell.d.ts.map +1 -1
  121. package/dist/providers/TableColumns/buildColumnState/renderCell.js +4 -2
  122. package/dist/providers/TableColumns/buildColumnState/renderCell.js.map +1 -1
  123. package/dist/styles.css +1 -1
  124. package/dist/utilities/buildFormState.d.ts.map +1 -1
  125. package/dist/utilities/buildFormState.js +2 -0
  126. package/dist/utilities/buildFormState.js.map +1 -1
  127. package/dist/utilities/renderTable.d.ts +3 -2
  128. package/dist/utilities/renderTable.d.ts.map +1 -1
  129. package/dist/utilities/renderTable.js +4 -2
  130. package/dist/utilities/renderTable.js.map +1 -1
  131. package/dist/views/CollectionFolder/index.d.ts.map +1 -1
  132. package/dist/views/CollectionFolder/index.js +15 -5
  133. package/dist/views/CollectionFolder/index.js.map +1 -1
  134. package/dist/views/Edit/Auth/index.js +5 -4
  135. package/dist/views/Edit/Auth/index.js.map +1 -1
  136. package/dist/views/Edit/SetDocumentStepNav/index.d.ts +1 -0
  137. package/dist/views/Edit/SetDocumentStepNav/index.d.ts.map +1 -1
  138. package/dist/views/Edit/SetDocumentStepNav/index.js +26 -15
  139. package/dist/views/Edit/SetDocumentStepNav/index.js.map +1 -1
  140. package/dist/views/Edit/index.d.ts.map +1 -1
  141. package/dist/views/Edit/index.js +11 -3
  142. package/dist/views/Edit/index.js.map +1 -1
  143. package/dist/views/List/ListHeader/index.d.ts +4 -2
  144. package/dist/views/List/ListHeader/index.d.ts.map +1 -1
  145. package/dist/views/List/ListHeader/index.js +24 -9
  146. package/dist/views/List/ListHeader/index.js.map +1 -1
  147. package/dist/views/List/ListSelection/index.d.ts +2 -1
  148. package/dist/views/List/ListSelection/index.d.ts.map +1 -1
  149. package/dist/views/List/ListSelection/index.js +26 -17
  150. package/dist/views/List/ListSelection/index.js.map +1 -1
  151. package/dist/views/List/index.d.ts.map +1 -1
  152. package/dist/views/List/index.js +28 -9
  153. package/dist/views/List/index.js.map +1 -1
  154. package/package.json +5 -5
  155. package/dist/elements/ListFolderPills/index.d.ts +0 -10
  156. package/dist/elements/ListFolderPills/index.d.ts.map +0 -1
  157. package/dist/elements/ListFolderPills/index.js +0 -97
  158. package/dist/elements/ListFolderPills/index.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TrashPill.js","names":["c","_c","formatAdminURL","useConfig","useTranslation","Button","TrashPill","t0","$","collectionConfig","viewType","t","config","trash","t1","t2","t3","slug","t4","routes","admin","serverURL","_jsx","buttonStyle","disabled","el","id","to","adminRoute","path","children"],"sources":["../../../src/elements/ListHeaderTabs/TrashPill.tsx"],"sourcesContent":["'use client'\n\nimport type { ClientCollectionConfig, ViewTypes } from 'payload'\n\nimport { formatAdminURL } from 'payload/shared'\n\nimport { useConfig } from '../../providers/Config/index.js'\nimport { useTranslation } from '../../providers/Translation/index.js'\nimport { Button } from '../Button/index.js'\n\nexport function TrashPill({\n collectionConfig,\n viewType,\n}: {\n collectionConfig: ClientCollectionConfig\n readonly viewType: ViewTypes\n}) {\n const { t } = useTranslation()\n const { config } = useConfig()\n\n if (!collectionConfig.trash) {\n return null\n }\n\n return (\n <Button\n buttonStyle=\"tab\"\n disabled={viewType === 'trash'}\n el={viewType === 'list' || viewType === 'folders' ? 'link' : 'div'}\n id=\"trash-view-pill\"\n key=\"trash-view-pill\"\n to={formatAdminURL({\n adminRoute: config.routes.admin,\n path: `/collections/${collectionConfig.slug}/trash`,\n serverURL: config.serverURL,\n })}\n >\n {t('general:trash')}\n </Button>\n )\n}\n"],"mappings":"AAAA;;AAAA,SAAAA,CAAA,IAAAC,EAAA;;AAIA,SAASC,cAAc,QAAQ;AAE/B,SAASC,SAAS,QAAQ;AAC1B,SAASC,cAAc,QAAQ;AAC/B,SAASC,MAAM,QAAQ;AAEvB,OAAO,SAAAC,UAAAC,EAAA;EAAA,MAAAC,CAAA,GAAAP,EAAA;EAAmB;IAAAQ,gBAAA;IAAAC;EAAA,IAAAH,EAMzB;EACC;IAAAI;EAAA,IAAcP,cAAA;EACd;IAAAQ;EAAA,IAAmBT,SAAA;EAAA,KAEdM,gBAAA,CAAAI,KAAA;IAAA;EAAA;EAOS,MAAAC,EAAA,GAAAJ,QAAA,KAAa;EACnB,MAAAK,EAAA,GAAAL,QAAA,KAAa,UAAUA,QAAA,KAAa,YAAY,SAAS;EAKrD,MAAAM,EAAA,mBAAgBP,gBAAA,CAAAQ,IAAA,QAA6B;EAAA,IAAAC,EAAA;EAAA,IAAAV,CAAA,QAAAI,MAAA,CAAAO,MAAA,CAAAC,KAAA,IAAAZ,CAAA,QAAAI,MAAA,CAAAS,SAAA,IAAAb,CAAA,QAAAG,CAAA,IAAAH,CAAA,QAAAM,EAAA,IAAAN,CAAA,QAAAO,EAAA,IAAAP,CAAA,QAAAQ,EAAA;IARvDE,EAAA,GAAAI,IAAA,CAAAjB,MAAA;MAAAkB,WAAA,EACc;MAAAC,QAAA,EACFV,EAAa;MAAAW,EAAA,EACnBV,EAAyD;MAAAW,EAAA,EAC1D;MAAAC,EAAA,EAECzB,cAAA;QAAA0B,UAAA,EACUhB,MAAA,CAAAO,MAAA,CAAAC,KAAA;QAAAS,IAAA,EACNb,EAA6C;QAAAK,SAAA,EACxCT,MAAA,CAAAS;MAAA,CACb;MAAAS,QAAA,EAECnB,CAAA,CAAE;IAAA,GAPC;IAAAH,CAAA,MAAAI,MAAA,CAAAO,MAAA,CAAAC,KAAA;IAAAZ,CAAA,MAAAI,MAAA,CAAAS,SAAA;IAAAb,CAAA,MAAAG,CAAA;IAAAH,CAAA,MAAAM,EAAA;IAAAN,CAAA,MAAAO,EAAA;IAAAP,CAAA,MAAAQ,EAAA;IAAAR,CAAA,MAAAU,EAAA;EAAA;IAAAA,EAAA,GAAAV,CAAA;EAAA;EAAA,OALNU,EAKM;AAAA","ignoreList":[]}
@@ -1,7 +1,6 @@
1
1
  @layer payload-default {
2
- .list-folder-pills {
2
+ .list-pills {
3
3
  display: flex;
4
4
  gap: calc(var(--base) * 0.5);
5
- margin-left: calc(var(--base) * 0.5);
6
5
  }
7
6
  }
@@ -10,7 +10,7 @@
10
10
 
11
11
  &__actions {
12
12
  display: flex;
13
- gap: calc(var(--base) * 0.3);
13
+ gap: calc(var(--base) * 0.5);
14
14
  }
15
15
 
16
16
  &__button {
@@ -0,0 +1,14 @@
1
+ import type { SanitizedCollectionConfig } from 'payload';
2
+ import React from 'react';
3
+ import type { DocumentDrawerContextType } from '../DocumentDrawer/Provider.js';
4
+ export type Props = {
5
+ readonly buttonId?: string;
6
+ readonly collectionSlug: SanitizedCollectionConfig['slug'];
7
+ readonly id?: string;
8
+ readonly onDelete?: DocumentDrawerContextType['onDelete'];
9
+ readonly redirectAfterDelete?: boolean;
10
+ readonly singularLabel: SanitizedCollectionConfig['labels']['singular'];
11
+ readonly title?: string;
12
+ };
13
+ export declare const PermanentlyDeleteButton: React.FC<Props>;
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/elements/PermanentlyDeleteButton/index.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,SAAS,CAAA;AAOxD,OAAO,KAAgC,MAAM,OAAO,CAAA;AAGpD,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,+BAA+B,CAAA;AAW9E,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;CACxB,CAAA;AAED,eAAO,MAAM,uBAAuB,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,CA0InD,CAAA"}
@@ -0,0 +1,147 @@
1
+ 'use client';
2
+
3
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
4
+ import { useModal } from '@faceless-ui/modal';
5
+ import { getTranslation } from '@payloadcms/translations';
6
+ import { useRouter } from 'next/navigation.js';
7
+ import { formatAdminURL } from 'payload/shared';
8
+ import * as qs from 'qs-esm';
9
+ import React, { Fragment, useCallback } from 'react';
10
+ import { toast } from 'sonner';
11
+ import { useConfig } from '../../providers/Config/index.js';
12
+ import { useDocumentTitle } from '../../providers/DocumentTitle/index.js';
13
+ import { useRouteTransition } from '../../providers/RouteTransition/index.js';
14
+ import { useTranslation } from '../../providers/Translation/index.js';
15
+ import { requests } from '../../utilities/api.js';
16
+ import { Button } from '../Button/index.js';
17
+ import { ConfirmationModal } from '../ConfirmationModal/index.js';
18
+ import { Translation } from '../Translation/index.js';
19
+ export const PermanentlyDeleteButton = props => {
20
+ const {
21
+ id,
22
+ buttonId,
23
+ collectionSlug,
24
+ onDelete,
25
+ redirectAfterDelete = true,
26
+ singularLabel,
27
+ title: titleFromProps
28
+ } = props;
29
+ const {
30
+ config: {
31
+ routes: {
32
+ admin: adminRoute,
33
+ api
34
+ },
35
+ serverURL
36
+ },
37
+ getEntityConfig
38
+ } = useConfig();
39
+ const collectionConfig = getEntityConfig({
40
+ collectionSlug
41
+ });
42
+ const router = useRouter();
43
+ const {
44
+ i18n,
45
+ t
46
+ } = useTranslation();
47
+ const {
48
+ title
49
+ } = useDocumentTitle();
50
+ const {
51
+ startRouteTransition
52
+ } = useRouteTransition();
53
+ const {
54
+ openModal
55
+ } = useModal();
56
+ const modalSlug = `perma-delete-${id}`;
57
+ const addDefaultError = useCallback(() => {
58
+ toast.error(t('error:deletingTitle', {
59
+ title
60
+ }));
61
+ }, [t, title]);
62
+ const handleDelete = useCallback(async () => {
63
+ try {
64
+ const url = `${serverURL}${api}/${collectionSlug}?${qs.stringify({
65
+ trash: true,
66
+ where: {
67
+ and: [{
68
+ id: {
69
+ equals: id
70
+ }
71
+ }, {
72
+ deletedAt: {
73
+ exists: true
74
+ }
75
+ }]
76
+ }
77
+ })}`;
78
+ const res = await requests.delete(url, {
79
+ headers: {
80
+ 'Accept-Language': i18n.language,
81
+ 'Content-Type': 'application/json'
82
+ }
83
+ });
84
+ const json = await res.json();
85
+ if (res.status < 400) {
86
+ toast.success(t('general:titleDeleted', {
87
+ label: getTranslation(singularLabel, i18n),
88
+ title
89
+ }) || json.message);
90
+ if (redirectAfterDelete) {
91
+ return startRouteTransition(() => router.push(formatAdminURL({
92
+ adminRoute,
93
+ path: `/collections/${collectionSlug}/trash`
94
+ })));
95
+ }
96
+ if (typeof onDelete === 'function') {
97
+ await onDelete({
98
+ id,
99
+ collectionConfig
100
+ });
101
+ }
102
+ return;
103
+ }
104
+ if (json.errors) {
105
+ json.errors.forEach(error => toast.error(error.message));
106
+ } else {
107
+ addDefaultError();
108
+ }
109
+ } catch (_err) {
110
+ addDefaultError();
111
+ }
112
+ }, [serverURL, api, collectionSlug, id, t, singularLabel, addDefaultError, i18n, title, router, adminRoute, redirectAfterDelete, onDelete, collectionConfig, startRouteTransition]);
113
+ if (id) {
114
+ return /*#__PURE__*/_jsxs(Fragment, {
115
+ children: [/*#__PURE__*/_jsx(Button, {
116
+ buttonStyle: "secondary",
117
+ id: buttonId,
118
+ onClick: () => {
119
+ openModal(modalSlug);
120
+ },
121
+ children: t('general:permanentlyDelete')
122
+ }), /*#__PURE__*/_jsx(ConfirmationModal, {
123
+ body: /*#__PURE__*/_jsx(Translation, {
124
+ elements: {
125
+ '1': ({
126
+ children
127
+ }) => /*#__PURE__*/_jsx("strong", {
128
+ children: children
129
+ })
130
+ },
131
+ i18nKey: "general:aboutToPermanentlyDelete",
132
+ t: t,
133
+ variables: {
134
+ label: getTranslation(singularLabel, i18n),
135
+ title: titleFromProps || title || id
136
+ }
137
+ }),
138
+ confirmingLabel: t('general:deleting'),
139
+ heading: t('general:confirmDeletion'),
140
+ modalSlug: modalSlug,
141
+ onConfirm: handleDelete
142
+ })]
143
+ });
144
+ }
145
+ return null;
146
+ };
147
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":["useModal","getTranslation","useRouter","formatAdminURL","qs","React","Fragment","useCallback","toast","useConfig","useDocumentTitle","useRouteTransition","useTranslation","requests","Button","ConfirmationModal","Translation","PermanentlyDeleteButton","props","id","buttonId","collectionSlug","onDelete","redirectAfterDelete","singularLabel","title","titleFromProps","config","routes","admin","adminRoute","api","serverURL","getEntityConfig","collectionConfig","router","i18n","t","startRouteTransition","openModal","modalSlug","addDefaultError","error","handleDelete","url","stringify","trash","where","and","equals","deletedAt","exists","res","delete","headers","language","json","status","success","label","message","push","path","errors","forEach","_err","_jsxs","_jsx","buttonStyle","onClick","body","elements","1","children","i18nKey","variables","confirmingLabel","heading","onConfirm"],"sources":["../../../src/elements/PermanentlyDeleteButton/index.tsx"],"sourcesContent":["'use client'\n\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 * as qs from 'qs-esm'\nimport React, { Fragment, useCallback } from 'react'\nimport { toast } from 'sonner'\n\nimport type { DocumentDrawerContextType } from '../DocumentDrawer/Provider.js'\n\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 { Button } from '../Button/index.js'\nimport { ConfirmationModal } from '../ConfirmationModal/index.js'\nimport { Translation } from '../Translation/index.js'\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}\n\nexport const PermanentlyDeleteButton: 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 serverURL,\n },\n getEntityConfig,\n } = useConfig()\n\n const collectionConfig = getEntityConfig({ collectionSlug })\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 = `perma-delete-${id}`\n\n const addDefaultError = useCallback(() => {\n toast.error(t('error:deletingTitle', { title }))\n }, [t, title])\n\n const handleDelete = useCallback(async () => {\n try {\n const url = `${serverURL}${api}/${collectionSlug}?${qs.stringify({\n trash: true,\n where: {\n and: [{ id: { equals: id } }, { deletedAt: { exists: true } }],\n },\n })}`\n\n const res = await requests.delete(url, {\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('general:titleDeleted', {\n label: getTranslation(singularLabel, i18n),\n title,\n }) || json.message,\n )\n\n if (redirectAfterDelete) {\n return startRouteTransition(() =>\n router.push(\n formatAdminURL({\n adminRoute,\n path: `/collections/${collectionSlug}/trash`,\n }),\n ),\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 } catch (_err) {\n addDefaultError()\n }\n }, [\n serverURL,\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 <Button\n buttonStyle=\"secondary\"\n id={buttonId}\n onClick={() => {\n openModal(modalSlug)\n }}\n >\n {t('general:permanentlyDelete')}\n </Button>\n <ConfirmationModal\n body={\n <Translation\n elements={{\n '1': ({ children }) => <strong>{children}</strong>,\n }}\n i18nKey=\"general:aboutToPermanentlyDelete\"\n t={t}\n variables={{\n label: getTranslation(singularLabel, i18n),\n title: titleFromProps || title || id,\n }}\n />\n }\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":[]}
@@ -0,0 +1,15 @@
1
+ import type { SanitizedCollectionConfig } from 'payload';
2
+ import React from 'react';
3
+ import type { DocumentDrawerContextType } from '../DocumentDrawer/Provider.js';
4
+ import './index.scss';
5
+ export type Props = {
6
+ readonly buttonId?: string;
7
+ readonly collectionSlug: SanitizedCollectionConfig['slug'];
8
+ readonly id?: string;
9
+ readonly onRestore?: DocumentDrawerContextType['onRestore'];
10
+ readonly redirectAfterRestore?: boolean;
11
+ readonly singularLabel: SanitizedCollectionConfig['labels']['singular'];
12
+ readonly title?: string;
13
+ };
14
+ export declare const RestoreButton: React.FC<Props>;
15
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/elements/RestoreButton/index.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,SAAS,CAAA;AAOxD,OAAO,KAA0C,MAAM,OAAO,CAAA;AAG9D,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,+BAA+B,CAAA;AAW9E,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,SAAS,CAAC,EAAE,yBAAyB,CAAC,WAAW,CAAC,CAAA;IAC3D,QAAQ,CAAC,oBAAoB,CAAC,EAAE,OAAO,CAAA;IACvC,QAAQ,CAAC,aAAa,EAAE,yBAAyB,CAAC,QAAQ,CAAC,CAAC,UAAU,CAAC,CAAA;IACvE,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CACxB,CAAA;AAED,eAAO,MAAM,aAAa,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,CA0KzC,CAAA"}
@@ -0,0 +1,171 @@
1
+ 'use client';
2
+
3
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
4
+ import { useModal } from '@faceless-ui/modal';
5
+ import { getTranslation } from '@payloadcms/translations';
6
+ import { useRouter } from 'next/navigation.js';
7
+ import { formatAdminURL } from 'payload/shared';
8
+ import * as qs from 'qs-esm';
9
+ import React, { Fragment, useCallback, useState } from 'react';
10
+ import { toast } from 'sonner';
11
+ import { CheckboxInput } from '../../fields/Checkbox/Input.js';
12
+ import { useConfig } from '../../providers/Config/index.js';
13
+ import { useDocumentTitle } from '../../providers/DocumentTitle/index.js';
14
+ import { useRouteTransition } from '../../providers/RouteTransition/index.js';
15
+ import { useTranslation } from '../../providers/Translation/index.js';
16
+ import { requests } from '../../utilities/api.js';
17
+ import { Button } from '../Button/index.js';
18
+ import { ConfirmationModal } from '../ConfirmationModal/index.js';
19
+ import { Translation } from '../Translation/index.js';
20
+ import './index.scss';
21
+ const baseClass = 'restore-button';
22
+ export const RestoreButton = props => {
23
+ const {
24
+ id,
25
+ buttonId,
26
+ collectionSlug,
27
+ onRestore,
28
+ redirectAfterRestore = true,
29
+ singularLabel,
30
+ title: titleFromProps
31
+ } = props;
32
+ const {
33
+ config: {
34
+ routes: {
35
+ admin: adminRoute,
36
+ api
37
+ },
38
+ serverURL
39
+ },
40
+ getEntityConfig
41
+ } = useConfig();
42
+ const collectionConfig = getEntityConfig({
43
+ collectionSlug
44
+ });
45
+ const router = useRouter();
46
+ const {
47
+ i18n,
48
+ t
49
+ } = useTranslation();
50
+ const {
51
+ title
52
+ } = useDocumentTitle();
53
+ const {
54
+ startRouteTransition
55
+ } = useRouteTransition();
56
+ const {
57
+ openModal
58
+ } = useModal();
59
+ const modalSlug = `restore-${id}`;
60
+ const [restoreAsPublished, setRestoreAsPublished] = useState(false);
61
+ const addDefaultError = useCallback(() => {
62
+ toast.error(t('error:restoringTitle', {
63
+ title
64
+ }));
65
+ }, [t, title]);
66
+ const handleRestore = useCallback(async () => {
67
+ try {
68
+ const url = `${serverURL}${api}/${collectionSlug}?${qs.stringify({
69
+ trash: true,
70
+ where: {
71
+ and: [{
72
+ id: {
73
+ equals: id
74
+ }
75
+ }, {
76
+ deletedAt: {
77
+ exists: true
78
+ }
79
+ }]
80
+ }
81
+ })}`;
82
+ const body = {
83
+ deletedAt: null
84
+ };
85
+ // Only include _status if drafts are enabled
86
+ if (collectionConfig?.versions?.drafts) {
87
+ body._status = restoreAsPublished ? 'published' : 'draft';
88
+ }
89
+ const res = await requests.patch(url, {
90
+ body: JSON.stringify(body),
91
+ headers: {
92
+ 'Accept-Language': i18n.language,
93
+ 'Content-Type': 'application/json'
94
+ }
95
+ });
96
+ const json = await res.json();
97
+ if (res.status < 400) {
98
+ toast.success(t('general:titleRestored', {
99
+ label: getTranslation(singularLabel, i18n),
100
+ title
101
+ }) || json.message);
102
+ if (redirectAfterRestore) {
103
+ return startRouteTransition(() => router.push(formatAdminURL({
104
+ adminRoute,
105
+ path: `/collections/${collectionSlug}/${id}`
106
+ })));
107
+ }
108
+ if (typeof onRestore === 'function') {
109
+ await onRestore({
110
+ id,
111
+ collectionConfig
112
+ });
113
+ }
114
+ return;
115
+ }
116
+ if (json.errors) {
117
+ json.errors.forEach(error => toast.error(error.message));
118
+ } else {
119
+ addDefaultError();
120
+ }
121
+ } catch (_err) {
122
+ addDefaultError();
123
+ }
124
+ }, [serverURL, api, collectionSlug, id, t, singularLabel, addDefaultError, i18n, title, router, adminRoute, redirectAfterRestore, onRestore, collectionConfig, startRouteTransition, restoreAsPublished]);
125
+ if (id) {
126
+ return /*#__PURE__*/_jsxs(Fragment, {
127
+ children: [/*#__PURE__*/_jsx(Button, {
128
+ buttonStyle: "primary",
129
+ id: buttonId,
130
+ onClick: () => {
131
+ openModal(modalSlug);
132
+ },
133
+ children: t('general:restore')
134
+ }, buttonId), /*#__PURE__*/_jsx(ConfirmationModal, {
135
+ body: /*#__PURE__*/_jsxs(Fragment, {
136
+ children: [/*#__PURE__*/_jsx(Translation, {
137
+ elements: {
138
+ '1': ({
139
+ children
140
+ }) => /*#__PURE__*/_jsx("strong", {
141
+ children: children
142
+ })
143
+ },
144
+ i18nKey: collectionConfig?.versions?.drafts ? 'general:aboutToRestoreAsDraft' : 'general:aboutToRestore',
145
+ t: t,
146
+ variables: {
147
+ label: getTranslation(singularLabel, i18n),
148
+ title: titleFromProps || title || id
149
+ }
150
+ }), collectionConfig?.versions?.drafts && /*#__PURE__*/_jsx("div", {
151
+ className: `${baseClass}__checkbox`,
152
+ children: /*#__PURE__*/_jsx(CheckboxInput, {
153
+ checked: restoreAsPublished,
154
+ id: "restore-as-published",
155
+ label: t('general:restoreAsPublished'),
156
+ name: "restore-as-published",
157
+ onToggle: e => setRestoreAsPublished(e.target.checked)
158
+ })
159
+ })]
160
+ }),
161
+ className: baseClass,
162
+ confirmingLabel: t('general:restoring'),
163
+ heading: t('general:confirmRestoration'),
164
+ modalSlug: modalSlug,
165
+ onConfirm: handleRestore
166
+ })]
167
+ });
168
+ }
169
+ return null;
170
+ };
171
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":["useModal","getTranslation","useRouter","formatAdminURL","qs","React","Fragment","useCallback","useState","toast","CheckboxInput","useConfig","useDocumentTitle","useRouteTransition","useTranslation","requests","Button","ConfirmationModal","Translation","baseClass","RestoreButton","props","id","buttonId","collectionSlug","onRestore","redirectAfterRestore","singularLabel","title","titleFromProps","config","routes","admin","adminRoute","api","serverURL","getEntityConfig","collectionConfig","router","i18n","t","startRouteTransition","openModal","modalSlug","restoreAsPublished","setRestoreAsPublished","addDefaultError","error","handleRestore","url","stringify","trash","where","and","equals","deletedAt","exists","body","versions","drafts","_status","res","patch","JSON","headers","language","json","status","success","label","message","push","path","errors","forEach","_err","_jsxs","_jsx","buttonStyle","onClick","elements","1","children","i18nKey","variables","className","checked","name","onToggle","e","target","confirmingLabel","heading","onConfirm"],"sources":["../../../src/elements/RestoreButton/index.tsx"],"sourcesContent":["'use client'\n\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 * as qs from 'qs-esm'\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 { 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 { Button } from '../Button/index.js'\nimport { ConfirmationModal } from '../ConfirmationModal/index.js'\nimport { Translation } from '../Translation/index.js'\nimport './index.scss'\n\nconst baseClass = 'restore-button'\n\nexport type Props = {\n readonly buttonId?: string\n readonly collectionSlug: SanitizedCollectionConfig['slug']\n readonly id?: string\n readonly onRestore?: DocumentDrawerContextType['onRestore']\n readonly redirectAfterRestore?: boolean\n readonly singularLabel: SanitizedCollectionConfig['labels']['singular']\n readonly title?: string\n}\n\nexport const RestoreButton: React.FC<Props> = (props) => {\n const {\n id,\n buttonId,\n collectionSlug,\n onRestore,\n redirectAfterRestore = true,\n singularLabel,\n title: titleFromProps,\n } = props\n\n const {\n config: {\n routes: { admin: adminRoute, api },\n serverURL,\n },\n getEntityConfig,\n } = useConfig()\n\n const collectionConfig = getEntityConfig({ collectionSlug })\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 = `restore-${id}`\n\n const [restoreAsPublished, setRestoreAsPublished] = useState(false)\n\n const addDefaultError = useCallback(() => {\n toast.error(t('error:restoringTitle', { title }))\n }, [t, title])\n\n const handleRestore = useCallback(async () => {\n try {\n const url = `${serverURL}${api}/${collectionSlug}?${qs.stringify({\n trash: true,\n where: {\n and: [{ id: { equals: id } }, { deletedAt: { exists: true } }],\n },\n })}`\n\n const body: Record<string, unknown> = {\n deletedAt: null,\n }\n\n // Only include _status if drafts are enabled\n if (collectionConfig?.versions?.drafts) {\n body._status = restoreAsPublished ? 'published' : 'draft'\n }\n\n const res = await requests.patch(url, {\n body: JSON.stringify(body),\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('general:titleRestored', {\n label: getTranslation(singularLabel, i18n),\n title,\n }) || json.message,\n )\n\n if (redirectAfterRestore) {\n return startRouteTransition(() =>\n router.push(\n formatAdminURL({\n adminRoute,\n path: `/collections/${collectionSlug}/${id}`,\n }),\n ),\n )\n }\n\n if (typeof onRestore === 'function') {\n await onRestore({ 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 } catch (_err) {\n addDefaultError()\n }\n }, [\n serverURL,\n api,\n collectionSlug,\n id,\n t,\n singularLabel,\n addDefaultError,\n i18n,\n title,\n router,\n adminRoute,\n redirectAfterRestore,\n onRestore,\n collectionConfig,\n startRouteTransition,\n restoreAsPublished,\n ])\n\n if (id) {\n return (\n <Fragment>\n <Button\n buttonStyle=\"primary\"\n id={buttonId}\n key={buttonId}\n onClick={() => {\n openModal(modalSlug)\n }}\n >\n {t('general:restore')}\n </Button>\n <ConfirmationModal\n body={\n <Fragment>\n <Translation\n elements={{\n '1': ({ children }) => <strong>{children}</strong>,\n }}\n i18nKey={\n collectionConfig?.versions?.drafts\n ? 'general:aboutToRestoreAsDraft'\n : 'general:aboutToRestore'\n }\n t={t}\n variables={{\n label: getTranslation(singularLabel, i18n),\n title: titleFromProps || title || id,\n }}\n />\n {collectionConfig?.versions?.drafts && (\n <div className={`${baseClass}__checkbox`}>\n <CheckboxInput\n checked={restoreAsPublished}\n id=\"restore-as-published\"\n label={t('general:restoreAsPublished')}\n name=\"restore-as-published\"\n onToggle={(e) => setRestoreAsPublished(e.target.checked)}\n />\n </div>\n )}\n </Fragment>\n }\n className={baseClass}\n confirmingLabel={t('general:restoring')}\n heading={t('general:confirmRestoration')}\n modalSlug={modalSlug}\n onConfirm={handleRestore}\n />\n </Fragment>\n )\n }\n\n return null\n}\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,25 @@
1
+ @import '../../scss/styles.scss';
2
+
3
+ @layer payload-default {
4
+ .restore-button {
5
+ @include blur-bg;
6
+ display: flex;
7
+ align-items: center;
8
+ justify-content: center;
9
+ height: 100%;
10
+
11
+ &__toggle {
12
+ @extend %btn-reset;
13
+ }
14
+
15
+ &__checkbox {
16
+ padding: calc(var(--base) * 0.5) 0;
17
+
18
+ .checkbox-input {
19
+ label {
20
+ padding-bottom: 0;
21
+ }
22
+ }
23
+ }
24
+ }
25
+ }
@@ -0,0 +1,9 @@
1
+ import type { ClientCollectionConfig, ViewTypes } from 'payload';
2
+ import React from 'react';
3
+ import './index.scss';
4
+ export type Props = {
5
+ collection: ClientCollectionConfig;
6
+ viewType?: ViewTypes;
7
+ };
8
+ export declare const RestoreMany: React.FC<Props>;
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/elements/RestoreMany/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,sBAAsB,EAAE,SAAS,EAAS,MAAM,SAAS,CAAA;AAOvE,OAAO,KAAK,MAAM,OAAO,CAAA;AAczB,OAAO,cAAc,CAAA;AAMrB,MAAM,MAAM,KAAK,GAAG;IAClB,UAAU,EAAE,sBAAsB,CAAA;IAClC,QAAQ,CAAC,EAAE,SAAS,CAAA;CACrB,CAAA;AAED,eAAO,MAAM,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,CA+KvC,CAAA"}
@@ -0,0 +1,193 @@
1
+ 'use client';
2
+
3
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
4
+ import { useModal } from '@faceless-ui/modal';
5
+ import { getTranslation } from '@payloadcms/translations';
6
+ import { useRouter, useSearchParams } from 'next/navigation.js';
7
+ import { mergeListSearchAndWhere } from 'payload/shared';
8
+ import * as qs from 'qs-esm';
9
+ import React from 'react';
10
+ import { toast } from 'sonner';
11
+ import { CheckboxInput } from '../../fields/Checkbox/Input.js';
12
+ import { useAuth } from '../../providers/Auth/index.js';
13
+ import { useConfig } from '../../providers/Config/index.js';
14
+ import { useLocale } from '../../providers/Locale/index.js';
15
+ import { useRouteCache } from '../../providers/RouteCache/index.js';
16
+ import { SelectAllStatus, useSelection } from '../../providers/Selection/index.js';
17
+ import { useTranslation } from '../../providers/Translation/index.js';
18
+ import { requests } from '../../utilities/api.js';
19
+ import { parseSearchParams } from '../../utilities/parseSearchParams.js';
20
+ import { ConfirmationModal } from '../ConfirmationModal/index.js';
21
+ import { ListSelectionButton } from '../ListSelection/index.js';
22
+ import './index.scss';
23
+ const confirmManyRestoreDrawerSlug = `confirm-restore-many-docs`;
24
+ const baseClass = 'restore-many';
25
+ export const RestoreMany = props => {
26
+ const {
27
+ collection: {
28
+ slug
29
+ } = {},
30
+ viewType
31
+ } = props;
32
+ const {
33
+ permissions
34
+ } = useAuth();
35
+ const {
36
+ config: {
37
+ collections,
38
+ routes,
39
+ serverURL
40
+ }
41
+ } = useConfig();
42
+ const {
43
+ code: locale
44
+ } = useLocale();
45
+ const router = useRouter();
46
+ const {
47
+ clearRouteCache
48
+ } = useRouteCache();
49
+ const searchParams = useSearchParams();
50
+ const {
51
+ count,
52
+ getSelectedIds,
53
+ selectAll,
54
+ toggleAll
55
+ } = useSelection();
56
+ const {
57
+ openModal
58
+ } = useModal();
59
+ const {
60
+ i18n,
61
+ t
62
+ } = useTranslation();
63
+ const [restoreAsPublished, setRestoreAsPublished] = React.useState(false);
64
+ const collectionPermissions = permissions?.collections?.[slug];
65
+ const hasUpdatePermission = collectionPermissions?.update;
66
+ if (selectAll === SelectAllStatus.None || !hasUpdatePermission || viewType !== 'trash') {
67
+ return null;
68
+ }
69
+ const selectingAll = selectAll === SelectAllStatus.AllAvailable;
70
+ const selectedIDs = !selectingAll ? getSelectedIds() : [];
71
+ const baseWhere = parseSearchParams(searchParams)?.where;
72
+ const finalWhere = {
73
+ and: [...(Array.isArray(baseWhere?.and) ? baseWhere.and : baseWhere ? [baseWhere] : []), {
74
+ deletedAt: {
75
+ exists: true
76
+ }
77
+ }]
78
+ };
79
+ const handleRestore = async () => {
80
+ const collectionConfig = collections.find(c => c.slug === slug);
81
+ if (!collectionConfig) {
82
+ return;
83
+ }
84
+ let whereConstraint;
85
+ if (selectingAll) {
86
+ whereConstraint = finalWhere;
87
+ } else {
88
+ whereConstraint = {
89
+ and: [{
90
+ id: {
91
+ in: selectedIDs
92
+ }
93
+ }, {
94
+ deletedAt: {
95
+ exists: true
96
+ }
97
+ }]
98
+ };
99
+ }
100
+ const url = `${serverURL}${routes.api}/${slug}${qs.stringify({
101
+ limit: 0,
102
+ locale,
103
+ trash: true,
104
+ where: mergeListSearchAndWhere({
105
+ collectionConfig,
106
+ search: parseSearchParams(searchParams)?.search,
107
+ where: whereConstraint
108
+ })
109
+ }, {
110
+ addQueryPrefix: true
111
+ })}`;
112
+ const body = {
113
+ deletedAt: null
114
+ };
115
+ // Only include _status if drafts are enabled
116
+ if (collectionConfig?.versions?.drafts) {
117
+ body._status = restoreAsPublished ? 'published' : 'draft';
118
+ }
119
+ const restoreManyResponse = await requests.patch(url, {
120
+ body: JSON.stringify(body),
121
+ headers: {
122
+ 'Accept-Language': i18n.language,
123
+ 'Content-Type': 'application/json'
124
+ }
125
+ });
126
+ try {
127
+ const {
128
+ plural,
129
+ singular
130
+ } = collectionConfig.labels;
131
+ const json = await restoreManyResponse.json();
132
+ const restoredDocs = json?.docs?.length || 0;
133
+ const successLabel = restoredDocs > 1 ? plural : singular;
134
+ if (restoreManyResponse.status < 400 || restoredDocs > 0) {
135
+ toast.success(t('general:restoredCountSuccessfully', {
136
+ count: restoredDocs,
137
+ label: getTranslation(successLabel, i18n)
138
+ }));
139
+ }
140
+ if (json?.errors?.length > 0) {
141
+ toast.error(json.message, {
142
+ description: json.errors.map(e => e.message).join('\n')
143
+ });
144
+ }
145
+ } catch (err) {
146
+ toast.error(t('error:unknown'));
147
+ }
148
+ toggleAll();
149
+ router.replace(qs.stringify({
150
+ ...parseSearchParams(searchParams),
151
+ page: selectingAll ? '1' : undefined
152
+ }, {
153
+ addQueryPrefix: true
154
+ }));
155
+ clearRouteCache();
156
+ };
157
+ const collectionConfig_0 = collections.find(({
158
+ slug: s
159
+ }) => s === slug);
160
+ const labelString = getTranslation(count === 1 ? collectionConfig_0.labels.singular : collectionConfig_0.labels.plural, i18n);
161
+ return /*#__PURE__*/_jsxs(React.Fragment, {
162
+ children: [/*#__PURE__*/_jsx(ListSelectionButton, {
163
+ "aria-label": t('general:restore'),
164
+ className: "restore-documents__toggle",
165
+ onClick: () => {
166
+ openModal(confirmManyRestoreDrawerSlug);
167
+ },
168
+ children: t('general:restore')
169
+ }), /*#__PURE__*/_jsx(ConfirmationModal, {
170
+ body: /*#__PURE__*/_jsxs(React.Fragment, {
171
+ children: [t(collectionConfig_0?.versions?.drafts ? 'general:aboutToRestoreAsDraftCount' : 'general:aboutToRestoreCount', {
172
+ count,
173
+ label: labelString
174
+ }), collectionConfig_0?.versions?.drafts && /*#__PURE__*/_jsx("div", {
175
+ className: `${baseClass}__checkbox`,
176
+ children: /*#__PURE__*/_jsx(CheckboxInput, {
177
+ checked: restoreAsPublished,
178
+ id: "restore-as-published-many",
179
+ label: t('general:restoreAsPublished'),
180
+ name: "restore-as-published-many",
181
+ onToggle: e_0 => setRestoreAsPublished(e_0.target.checked)
182
+ })
183
+ })]
184
+ }),
185
+ className: baseClass,
186
+ confirmingLabel: t('general:restoring'),
187
+ heading: t('general:confirmRestoration'),
188
+ modalSlug: confirmManyRestoreDrawerSlug,
189
+ onConfirm: handleRestore
190
+ })]
191
+ });
192
+ };
193
+ //# sourceMappingURL=index.js.map