@primershop/strapi-plugin-status-manager 0.0.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.
Files changed (153) hide show
  1. package/README.md +52 -0
  2. package/dist/admin/components/Initializer.js +17 -0
  3. package/dist/admin/components/Initializer.js.map +1 -0
  4. package/dist/admin/components/Initializer.mjs +15 -0
  5. package/dist/admin/components/Initializer.mjs.map +1 -0
  6. package/dist/admin/components/PluginIcon.js +9 -0
  7. package/dist/admin/components/PluginIcon.js.map +1 -0
  8. package/dist/admin/components/PluginIcon.mjs +7 -0
  9. package/dist/admin/components/PluginIcon.mjs.map +1 -0
  10. package/dist/admin/components/ProductStatusField.js +104 -0
  11. package/dist/admin/components/ProductStatusField.js.map +1 -0
  12. package/dist/admin/components/ProductStatusField.mjs +102 -0
  13. package/dist/admin/components/ProductStatusField.mjs.map +1 -0
  14. package/dist/admin/components/StatusManager.js +367 -0
  15. package/dist/admin/components/StatusManager.js.map +1 -0
  16. package/dist/admin/components/StatusManager.mjs +365 -0
  17. package/dist/admin/components/StatusManager.mjs.map +1 -0
  18. package/dist/admin/index.js +46 -0
  19. package/dist/admin/index.js.map +1 -0
  20. package/dist/admin/index.mjs +44 -0
  21. package/dist/admin/index.mjs.map +1 -0
  22. package/dist/admin/listView/StatusFilter.js +76 -0
  23. package/dist/admin/listView/StatusFilter.js.map +1 -0
  24. package/dist/admin/listView/StatusFilter.mjs +74 -0
  25. package/dist/admin/listView/StatusFilter.mjs.map +1 -0
  26. package/dist/admin/listView/add-status-column-hook.js +34 -0
  27. package/dist/admin/listView/add-status-column-hook.js.map +1 -0
  28. package/dist/admin/listView/add-status-column-hook.mjs +32 -0
  29. package/dist/admin/listView/add-status-column-hook.mjs.map +1 -0
  30. package/dist/admin/listView/status-cell.js +28 -0
  31. package/dist/admin/listView/status-cell.js.map +1 -0
  32. package/dist/admin/listView/status-cell.mjs +26 -0
  33. package/dist/admin/listView/status-cell.mjs.map +1 -0
  34. package/dist/admin/pages/HomePage.js +51 -0
  35. package/dist/admin/pages/HomePage.js.map +1 -0
  36. package/dist/admin/pages/HomePage.mjs +49 -0
  37. package/dist/admin/pages/HomePage.mjs.map +1 -0
  38. package/dist/admin/pluginId.js +6 -0
  39. package/dist/admin/pluginId.js.map +1 -0
  40. package/dist/admin/pluginId.mjs +4 -0
  41. package/dist/admin/pluginId.mjs.map +1 -0
  42. package/dist/admin/src/components/Initializer.js +13 -0
  43. package/dist/admin/src/components/PluginIcon.js +4 -0
  44. package/dist/admin/src/components/ProductStatusField.js +64 -0
  45. package/dist/admin/src/components/StatusManager.js +239 -0
  46. package/dist/admin/src/index.js +43 -0
  47. package/dist/admin/src/listView/StatusFilter.js +47 -0
  48. package/dist/admin/src/listView/add-status-column-hook.js +18 -0
  49. package/dist/admin/src/listView/status-cell.js +18 -0
  50. package/dist/admin/src/pages/HomePage.js +18 -0
  51. package/dist/admin/src/pluginId.js +1 -0
  52. package/dist/server/bootstrap.js +29 -0
  53. package/dist/server/bootstrap.js.map +1 -0
  54. package/dist/server/bootstrap.mjs +27 -0
  55. package/dist/server/bootstrap.mjs.map +1 -0
  56. package/dist/server/content-types/index.js +16 -0
  57. package/dist/server/content-types/index.js.map +1 -0
  58. package/dist/server/content-types/index.mjs +14 -0
  59. package/dist/server/content-types/index.mjs.map +1 -0
  60. package/dist/server/content-types/status-link.js +43 -0
  61. package/dist/server/content-types/status-link.js.map +1 -0
  62. package/dist/server/content-types/status-link.mjs +41 -0
  63. package/dist/server/content-types/status-link.mjs.map +1 -0
  64. package/dist/server/content-types/status.js +50 -0
  65. package/dist/server/content-types/status.js.map +1 -0
  66. package/dist/server/content-types/status.mjs +48 -0
  67. package/dist/server/content-types/status.mjs.map +1 -0
  68. package/dist/server/controllers/content.js +33 -0
  69. package/dist/server/controllers/content.js.map +1 -0
  70. package/dist/server/controllers/content.mjs +31 -0
  71. package/dist/server/controllers/content.mjs.map +1 -0
  72. package/dist/server/controllers/index.js +12 -0
  73. package/dist/server/controllers/index.js.map +1 -0
  74. package/dist/server/controllers/index.mjs +10 -0
  75. package/dist/server/controllers/index.mjs.map +1 -0
  76. package/dist/server/controllers/status.js +106 -0
  77. package/dist/server/controllers/status.js.map +1 -0
  78. package/dist/server/controllers/status.mjs +104 -0
  79. package/dist/server/controllers/status.mjs.map +1 -0
  80. package/dist/server/index.js +23 -0
  81. package/dist/server/index.js.map +1 -0
  82. package/dist/server/index.mjs +21 -0
  83. package/dist/server/index.mjs.map +1 -0
  84. package/dist/server/middlewares/add-status-field.js +48 -0
  85. package/dist/server/middlewares/add-status-field.js.map +1 -0
  86. package/dist/server/middlewares/add-status-field.mjs +46 -0
  87. package/dist/server/middlewares/add-status-field.mjs.map +1 -0
  88. package/dist/server/middlewares/filter-by-status.js +42 -0
  89. package/dist/server/middlewares/filter-by-status.js.map +1 -0
  90. package/dist/server/middlewares/filter-by-status.mjs +40 -0
  91. package/dist/server/middlewares/filter-by-status.mjs.map +1 -0
  92. package/dist/server/middlewares/filter-published.js +35 -0
  93. package/dist/server/middlewares/filter-published.js.map +1 -0
  94. package/dist/server/middlewares/filter-published.mjs +33 -0
  95. package/dist/server/middlewares/filter-published.mjs.map +1 -0
  96. package/dist/server/permissions.js +46 -0
  97. package/dist/server/permissions.js.map +1 -0
  98. package/dist/server/permissions.mjs +44 -0
  99. package/dist/server/permissions.mjs.map +1 -0
  100. package/dist/server/pluginId.js +6 -0
  101. package/dist/server/pluginId.js.map +1 -0
  102. package/dist/server/pluginId.mjs +4 -0
  103. package/dist/server/pluginId.mjs.map +1 -0
  104. package/dist/server/register.js +27 -0
  105. package/dist/server/register.js.map +1 -0
  106. package/dist/server/register.mjs +25 -0
  107. package/dist/server/register.mjs.map +1 -0
  108. package/dist/server/routes/content-management.js +41 -0
  109. package/dist/server/routes/content-management.js.map +1 -0
  110. package/dist/server/routes/content-management.mjs +39 -0
  111. package/dist/server/routes/content-management.mjs.map +1 -0
  112. package/dist/server/routes/index.js +17 -0
  113. package/dist/server/routes/index.js.map +1 -0
  114. package/dist/server/routes/index.mjs +15 -0
  115. package/dist/server/routes/index.mjs.map +1 -0
  116. package/dist/server/routes/status-management.js +122 -0
  117. package/dist/server/routes/status-management.js.map +1 -0
  118. package/dist/server/routes/status-management.mjs +120 -0
  119. package/dist/server/routes/status-management.mjs.map +1 -0
  120. package/dist/server/services/index.js +12 -0
  121. package/dist/server/services/index.js.map +1 -0
  122. package/dist/server/services/index.mjs +10 -0
  123. package/dist/server/services/index.mjs.map +1 -0
  124. package/dist/server/services/status-link.js +38 -0
  125. package/dist/server/services/status-link.js.map +1 -0
  126. package/dist/server/services/status-link.mjs +36 -0
  127. package/dist/server/services/status-link.mjs.map +1 -0
  128. package/dist/server/services/status.js +110 -0
  129. package/dist/server/services/status.js.map +1 -0
  130. package/dist/server/services/status.mjs +108 -0
  131. package/dist/server/services/status.mjs.map +1 -0
  132. package/dist/server/src/bootstrap.js +32 -0
  133. package/dist/server/src/config/dev.js +13 -0
  134. package/dist/server/src/content-types/index.js +15 -0
  135. package/dist/server/src/content-types/status-link.js +40 -0
  136. package/dist/server/src/content-types/status.js +47 -0
  137. package/dist/server/src/controllers/content.js +44 -0
  138. package/dist/server/src/controllers/index.js +9 -0
  139. package/dist/server/src/controllers/status.js +106 -0
  140. package/dist/server/src/index.js +23 -0
  141. package/dist/server/src/middlewares/add-status-field.js +51 -0
  142. package/dist/server/src/middlewares/filter-by-status.js +44 -0
  143. package/dist/server/src/middlewares/filter-published.js +31 -0
  144. package/dist/server/src/permissions.js +41 -0
  145. package/dist/server/src/pluginId.js +4 -0
  146. package/dist/server/src/register.js +28 -0
  147. package/dist/server/src/routes/content-management.js +34 -0
  148. package/dist/server/src/routes/index.js +15 -0
  149. package/dist/server/src/routes/status-management.js +109 -0
  150. package/dist/server/src/services/index.js +9 -0
  151. package/dist/server/src/services/status-link.js +33 -0
  152. package/dist/server/src/services/status.js +96 -0
  153. package/package.json +104 -0
@@ -0,0 +1,365 @@
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
2
+ import { useState, useEffect, useCallback } from 'react';
3
+ import { combine } from '@atlaskit/pragmatic-drag-and-drop/combine';
4
+ import { draggable, dropTargetForElements, monitorForElements } from '@atlaskit/pragmatic-drag-and-drop/element/adapter';
5
+ import { pointerOutsideOfPreview } from '@atlaskit/pragmatic-drag-and-drop/element/pointer-outside-of-preview';
6
+ import { setCustomNativeDragPreview } from '@atlaskit/pragmatic-drag-and-drop/element/set-custom-native-drag-preview';
7
+ import { reorder } from '@atlaskit/pragmatic-drag-and-drop/reorder';
8
+ import { extractClosestEdge, attachClosestEdge } from '@atlaskit/pragmatic-drag-and-drop-hitbox/closest-edge';
9
+ import { Box, Typography, Flex, TextInput, Button, Dialog, SingleSelect, SingleSelectOption } from '@strapi/design-system';
10
+ import { Plus, Drag, Trash } from '@strapi/icons';
11
+ import { useFetchClient } from '@strapi/strapi/admin';
12
+
13
+ const StatusManager = ()=>{
14
+ const [statuses, setStatuses] = useState([]);
15
+ const [newStatus, setNewStatus] = useState("");
16
+ const [statusToDelete, setStatusToDelete] = useState(null);
17
+ const [replacementStatus, setReplacementStatus] = useState("");
18
+ const { get, post, put } = useFetchClient();
19
+ const [instanceId] = useState(()=>Symbol("instance-id"));
20
+ // Fetch statuses
21
+ useEffect(()=>{
22
+ const loadStatuses = async ()=>{
23
+ const { data } = await get("primershop-status-manager/statuses");
24
+ setStatuses(data);
25
+ };
26
+ loadStatuses();
27
+ }, [
28
+ get
29
+ ]);
30
+ // Validate input (Latin characters only)
31
+ const validateInput = (value)=>/^[a-zA-Z\s]+$/.test(value);
32
+ // Add new status
33
+ const addStatus = async ()=>{
34
+ if (!newStatus || !validateInput(newStatus)) return alert("Only Latin characters allowed!");
35
+ try {
36
+ const { data } = await post("primershop-status-manager/status", {
37
+ name: newStatus,
38
+ published: false
39
+ });
40
+ setStatuses([
41
+ ...statuses,
42
+ data
43
+ ]);
44
+ setNewStatus("");
45
+ } catch (error) {
46
+ console.error("Error creating status:", error);
47
+ }
48
+ };
49
+ const reorderItem = useCallback(async ({ startIndex, indexOfTarget, closestEdgeOfTarget })=>{
50
+ // Calculate the final index based on the target position and edge
51
+ let finishIndex = indexOfTarget;
52
+ if (closestEdgeOfTarget === "bottom") {
53
+ finishIndex = indexOfTarget + 1;
54
+ }
55
+ // If moving an item down, we need to adjust for the removed item
56
+ if (startIndex < finishIndex) {
57
+ finishIndex--;
58
+ }
59
+ if (finishIndex === startIndex) {
60
+ return;
61
+ }
62
+ const reordered = reorder({
63
+ list: statuses,
64
+ startIndex,
65
+ finishIndex
66
+ });
67
+ // Send new order to API
68
+ const orderedIds = reordered.map((status, index)=>({
69
+ documentId: status.documentId,
70
+ order: index
71
+ }));
72
+ await put("/primershop-status-manager/statuses/reorder", {
73
+ statuses: orderedIds
74
+ });
75
+ setStatuses(reordered);
76
+ }, [
77
+ statuses,
78
+ put
79
+ ]);
80
+ // Setup drag and drop
81
+ useEffect(()=>{
82
+ const statusElements = document.querySelectorAll("[data-status-id]");
83
+ const cleanupFunctions = [];
84
+ statusElements.forEach((element)=>{
85
+ const statusId = element.getAttribute("data-status-id");
86
+ const index = statuses.findIndex((s)=>s.documentId === statusId);
87
+ const dragHandle = element.querySelector("[data-drag-handle]");
88
+ if (!dragHandle) return;
89
+ // Setup draggable
90
+ const draggableCleanup = draggable({
91
+ element: dragHandle,
92
+ getInitialData: ()=>({
93
+ statusId,
94
+ index,
95
+ instanceId
96
+ }),
97
+ onGenerateDragPreview ({ nativeSetDragImage }) {
98
+ setCustomNativeDragPreview({
99
+ nativeSetDragImage,
100
+ getOffset: pointerOutsideOfPreview({
101
+ x: "16px",
102
+ y: "8px"
103
+ }),
104
+ render ({ container }) {
105
+ const preview = document.createElement("div");
106
+ preview.style.padding = "8px 16px";
107
+ preview.style.backgroundColor = "#fff";
108
+ preview.style.border = "1px solid #ccc";
109
+ preview.style.borderRadius = "4px";
110
+ preview.style.boxShadow = "0 2px 4px rgba(0,0,0,0.1)";
111
+ const statusNameElement = element.querySelector("[data-status-name]");
112
+ preview.textContent = statusNameElement?.textContent || "";
113
+ container.appendChild(preview);
114
+ return ()=>container.removeChild(preview);
115
+ }
116
+ });
117
+ }
118
+ });
119
+ // Setup drop target
120
+ const dropTargetCleanup = dropTargetForElements({
121
+ element: element,
122
+ canDrop: ({ source })=>source.data.instanceId === instanceId,
123
+ getData ({ input }) {
124
+ return attachClosestEdge({
125
+ statusId,
126
+ index,
127
+ instanceId
128
+ }, {
129
+ element,
130
+ input,
131
+ allowedEdges: [
132
+ "top",
133
+ "bottom"
134
+ ]
135
+ });
136
+ },
137
+ onDrag ({ source, self }) {
138
+ const isSource = source.element === dragHandle;
139
+ if (isSource) return;
140
+ const closestEdge = extractClosestEdge(self.data);
141
+ const sourceIndex = Number(source.data.index);
142
+ const isItemBeforeSource = index === sourceIndex - 1;
143
+ const isItemAfterSource = index === sourceIndex + 1;
144
+ const isDropIndicatorHidden = isItemBeforeSource && closestEdge === "bottom" || isItemAfterSource && closestEdge === "top";
145
+ if (isDropIndicatorHidden) return;
146
+ // Add visual feedback for drop target
147
+ element.style.background = `linear-gradient(${closestEdge === "top" ? 180 : 0}deg, rgba(136,131,214,0.4) 0%, rgba(255,255,255,0) 50%)`;
148
+ },
149
+ onDragLeave () {
150
+ element.style.background = "";
151
+ },
152
+ onDrop ({ source, self }) {
153
+ element.style.background = "";
154
+ const sourceData = source.data;
155
+ const targetData = self.data;
156
+ const indexOfTarget = statuses.findIndex((s)=>s.documentId === targetData.statusId);
157
+ if (indexOfTarget < 0) return;
158
+ const closestEdgeOfTarget = extractClosestEdge(targetData);
159
+ reorderItem({
160
+ startIndex: sourceData.index,
161
+ indexOfTarget,
162
+ closestEdgeOfTarget
163
+ });
164
+ }
165
+ });
166
+ // Combine cleanup functions
167
+ const combinedCleanup = combine(draggableCleanup, dropTargetCleanup);
168
+ cleanupFunctions.push(combinedCleanup);
169
+ });
170
+ // Monitor for drops
171
+ const monitorCleanup = monitorForElements({
172
+ canMonitor: ({ source })=>source.data.instanceId === instanceId,
173
+ onDrop ({ location, source }) {
174
+ const target = location.current.dropTargets[0];
175
+ if (!target) return;
176
+ const sourceData = source.data;
177
+ const targetData = target.data;
178
+ const indexOfTarget = statuses.findIndex((s)=>s.documentId === targetData.statusId);
179
+ if (indexOfTarget < 0) return;
180
+ const closestEdgeOfTarget = extractClosestEdge(targetData);
181
+ reorderItem({
182
+ startIndex: sourceData.index,
183
+ indexOfTarget,
184
+ closestEdgeOfTarget
185
+ });
186
+ }
187
+ });
188
+ // Cleanup function
189
+ return ()=>{
190
+ cleanupFunctions.forEach((cleanup)=>cleanup());
191
+ monitorCleanup();
192
+ };
193
+ }, [
194
+ statuses,
195
+ reorderItem,
196
+ instanceId
197
+ ]);
198
+ // Open delete dialog
199
+ const confirmDelete = (status)=>{
200
+ setStatusToDelete(status);
201
+ };
202
+ // Delete status and replace with selected one
203
+ const deleteStatus = async ()=>{
204
+ if (!replacementStatus) return alert("Select a replacement status!");
205
+ const replacementStatusObj = statuses.find((s)=>s.name === replacementStatus);
206
+ if (!replacementStatusObj) return alert("Replacement status not found!");
207
+ try {
208
+ await put("/primershop-status-manager/statuses/delete", {
209
+ statusId: statusToDelete?.documentId,
210
+ replacementId: replacementStatusObj.documentId
211
+ });
212
+ // Remove the deleted status from the list
213
+ setStatuses(statuses.filter((s)=>s.documentId !== statusToDelete?.documentId));
214
+ setStatusToDelete(null);
215
+ setReplacementStatus("");
216
+ } catch (error) {
217
+ console.error("Error deleting status:", error);
218
+ }
219
+ };
220
+ // Toggle publish status
221
+ const togglePublish = async (id, published)=>{
222
+ try {
223
+ await put(`/primershop-status-manager/statuses/${id}`, {
224
+ published: !published
225
+ });
226
+ setStatuses(statuses.map((s)=>s.documentId === id ? {
227
+ ...s,
228
+ published: !published
229
+ } : s));
230
+ } catch (error) {
231
+ console.error("Error toggling publish status:", error);
232
+ }
233
+ };
234
+ return /*#__PURE__*/ jsxs(Box, {
235
+ padding: 4,
236
+ children: [
237
+ /*#__PURE__*/ jsx(Typography, {
238
+ variant: "beta",
239
+ children: "Status Manager"
240
+ }),
241
+ /*#__PURE__*/ jsxs(Flex, {
242
+ marginTop: 4,
243
+ gap: 2,
244
+ children: [
245
+ /*#__PURE__*/ jsx(TextInput, {
246
+ placeholder: "Enter a status...",
247
+ value: newStatus,
248
+ onChange: (e)=>setNewStatus(e.target.value)
249
+ }),
250
+ /*#__PURE__*/ jsx(Button, {
251
+ onClick: addStatus,
252
+ startIcon: /*#__PURE__*/ jsx(Plus, {}),
253
+ children: "Add Status"
254
+ })
255
+ ]
256
+ }),
257
+ /*#__PURE__*/ jsx(Box, {
258
+ marginTop: 4,
259
+ children: statuses.map((status)=>/*#__PURE__*/ jsxs(Flex, {
260
+ "data-status-id": status.documentId,
261
+ alignItems: "center",
262
+ gap: 2,
263
+ marginBottom: 2,
264
+ paddingBottom: 2,
265
+ style: {
266
+ borderBottom: `1px solid gray`,
267
+ minWidth: 300,
268
+ userSelect: "none",
269
+ touchAction: "none"
270
+ },
271
+ children: [
272
+ /*#__PURE__*/ jsx(Box, {
273
+ "data-drag-handle": true,
274
+ style: {
275
+ cursor: "grab",
276
+ padding: "4px",
277
+ display: "flex",
278
+ alignItems: "center"
279
+ },
280
+ children: /*#__PURE__*/ jsx(Drag, {})
281
+ }, `dragHandle-${status.documentId}`),
282
+ /*#__PURE__*/ jsx(Typography, {
283
+ variant: "sigma",
284
+ style: {
285
+ display: "inline-block",
286
+ marginRight: "auto"
287
+ },
288
+ "data-status-name": true,
289
+ children: status.name
290
+ }),
291
+ /*#__PURE__*/ jsx(Button, {
292
+ variant: status.published ? "success-light" : "secondary",
293
+ onClick: ()=>togglePublish(status.documentId, status.published),
294
+ children: status.published ? "Published" : "Unpublished"
295
+ }),
296
+ /*#__PURE__*/ jsxs(Dialog.Root, {
297
+ onOpenChange: ()=>confirmDelete(status),
298
+ children: [
299
+ /*#__PURE__*/ jsx(Dialog.Trigger, {
300
+ children: /*#__PURE__*/ jsx(Button, {
301
+ variant: "tertiary",
302
+ startIcon: /*#__PURE__*/ jsx(Trash, {}),
303
+ children: "Delete"
304
+ })
305
+ }),
306
+ /*#__PURE__*/ jsxs(Dialog.Content, {
307
+ children: [
308
+ /*#__PURE__*/ jsx(Dialog.Header, {
309
+ children: "Delete status"
310
+ }),
311
+ statuses.length > 1 && statusToDelete && /*#__PURE__*/ jsxs(Dialog.Body, {
312
+ children: [
313
+ /*#__PURE__*/ jsx(Typography, {
314
+ children: "Choose a replacement status before deleting:"
315
+ }),
316
+ /*#__PURE__*/ jsx(SingleSelect, {
317
+ onChange: (value)=>setReplacementStatus(value),
318
+ placeholder: "Select replacement",
319
+ children: statuses.filter((s)=>s.documentId !== statusToDelete.documentId).map((s)=>/*#__PURE__*/ jsx(SingleSelectOption, {
320
+ value: s.name,
321
+ children: s.name
322
+ }, `statusChoice-${s.documentId}`))
323
+ }),
324
+ replacementStatus && /*#__PURE__*/ jsxs(Typography, {
325
+ children: [
326
+ "Replacing ",
327
+ statusToDelete.name,
328
+ " with ",
329
+ replacementStatus
330
+ ]
331
+ })
332
+ ]
333
+ }),
334
+ /*#__PURE__*/ jsxs(Dialog.Footer, {
335
+ children: [
336
+ /*#__PURE__*/ jsx(Dialog.Cancel, {
337
+ children: /*#__PURE__*/ jsx(Button, {
338
+ fullWidth: true,
339
+ variant: "tertiary",
340
+ children: "Cancel"
341
+ })
342
+ }),
343
+ /*#__PURE__*/ jsx(Dialog.Action, {
344
+ children: /*#__PURE__*/ jsx(Button, {
345
+ fullWidth: true,
346
+ variant: "danger-light",
347
+ onClick: deleteStatus,
348
+ children: "Yes, delete"
349
+ })
350
+ })
351
+ ]
352
+ })
353
+ ]
354
+ })
355
+ ]
356
+ })
357
+ ]
358
+ }, `status-${status.documentId}`))
359
+ }, statuses.length)
360
+ ]
361
+ });
362
+ };
363
+
364
+ export { StatusManager };
365
+ //# sourceMappingURL=StatusManager.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StatusManager.mjs","sources":["../../../admin/src/components/StatusManager.tsx"],"sourcesContent":["import React, { useState, useEffect, useCallback } from \"react\";\r\n\r\nimport { combine } from \"@atlaskit/pragmatic-drag-and-drop/combine\";\r\nimport {\r\n draggable,\r\n dropTargetForElements,\r\n monitorForElements,\r\n} from \"@atlaskit/pragmatic-drag-and-drop/element/adapter\";\r\nimport { pointerOutsideOfPreview } from \"@atlaskit/pragmatic-drag-and-drop/element/pointer-outside-of-preview\";\r\nimport { setCustomNativeDragPreview } from \"@atlaskit/pragmatic-drag-and-drop/element/set-custom-native-drag-preview\";\r\nimport { reorder } from \"@atlaskit/pragmatic-drag-and-drop/reorder\";\r\nimport {\r\n attachClosestEdge,\r\n extractClosestEdge,\r\n} from \"@atlaskit/pragmatic-drag-and-drop-hitbox/closest-edge\";\r\nimport {\r\n TextInput,\r\n Button,\r\n Flex,\r\n Typography,\r\n Box,\r\n Dialog,\r\n SingleSelect,\r\n SingleSelectOption,\r\n} from \"@strapi/design-system\";\r\nimport { Plus, Trash, Drag } from \"@strapi/icons\";\r\nimport { useFetchClient } from \"@strapi/strapi/admin\";\r\n\r\ninterface Status {\r\n documentId: string;\r\n name: string;\r\n published: boolean;\r\n}\r\n\r\ninterface ReorderParams {\r\n startIndex: number;\r\n indexOfTarget: number;\r\n closestEdgeOfTarget: string;\r\n}\r\n\r\nconst StatusManager = () => {\r\n const [statuses, setStatuses] = useState<Status[]>([]);\r\n const [newStatus, setNewStatus] = useState(\"\");\r\n const [statusToDelete, setStatusToDelete] = useState<Status | null>(null);\r\n const [replacementStatus, setReplacementStatus] = useState(\"\");\r\n const { get, post, put } = useFetchClient();\r\n const [instanceId] = useState(() => Symbol(\"instance-id\"));\r\n\r\n // Fetch statuses\r\n useEffect(() => {\r\n const loadStatuses = async () => {\r\n const { data } = await get(\"primershop-status-manager/statuses\");\r\n setStatuses(data);\r\n };\r\n loadStatuses();\r\n }, [get]);\r\n\r\n // Validate input (Latin characters only)\r\n const validateInput = (value: string): boolean => /^[a-zA-Z\\s]+$/.test(value);\r\n\r\n // Add new status\r\n const addStatus = async () => {\r\n if (!newStatus || !validateInput(newStatus))\r\n return alert(\"Only Latin characters allowed!\");\r\n try {\r\n const { data } = await post(\"primershop-status-manager/status\", {\r\n name: newStatus,\r\n published: false,\r\n });\r\n setStatuses([...statuses, data]);\r\n setNewStatus(\"\");\r\n } catch (error) {\r\n console.error(\"Error creating status:\", error);\r\n }\r\n };\r\n\r\n const reorderItem = useCallback(\r\n async ({\r\n startIndex,\r\n indexOfTarget,\r\n closestEdgeOfTarget,\r\n }: ReorderParams) => {\r\n // Calculate the final index based on the target position and edge\r\n let finishIndex = indexOfTarget;\r\n if (closestEdgeOfTarget === \"bottom\") {\r\n finishIndex = indexOfTarget + 1;\r\n }\r\n\r\n // If moving an item down, we need to adjust for the removed item\r\n if (startIndex < finishIndex) {\r\n finishIndex--;\r\n }\r\n\r\n if (finishIndex === startIndex) {\r\n return;\r\n }\r\n\r\n const reordered = reorder({\r\n list: statuses,\r\n startIndex,\r\n finishIndex,\r\n });\r\n // Send new order to API\r\n const orderedIds = reordered.map((status, index) => ({\r\n documentId: status.documentId,\r\n order: index,\r\n }));\r\n\r\n await put(\"/primershop-status-manager/statuses/reorder\", {\r\n statuses: orderedIds,\r\n });\r\n setStatuses(reordered);\r\n },\r\n [statuses, put]\r\n );\r\n\r\n // Setup drag and drop\r\n useEffect(() => {\r\n const statusElements = document.querySelectorAll(\"[data-status-id]\");\r\n const cleanupFunctions: (() => void)[] = [];\r\n\r\n statusElements.forEach((element) => {\r\n const statusId = element.getAttribute(\"data-status-id\");\r\n const index = statuses.findIndex((s) => s.documentId === statusId);\r\n const dragHandle = element.querySelector(\"[data-drag-handle]\");\r\n\r\n if (!dragHandle) return;\r\n\r\n // Setup draggable\r\n const draggableCleanup = draggable({\r\n element: dragHandle as HTMLElement,\r\n getInitialData: () => ({\r\n statusId,\r\n index,\r\n instanceId,\r\n }),\r\n onGenerateDragPreview({ nativeSetDragImage }) {\r\n setCustomNativeDragPreview({\r\n nativeSetDragImage,\r\n getOffset: pointerOutsideOfPreview({\r\n x: \"16px\",\r\n y: \"8px\",\r\n }),\r\n render({ container }) {\r\n const preview = document.createElement(\"div\");\r\n preview.style.padding = \"8px 16px\";\r\n preview.style.backgroundColor = \"#fff\";\r\n preview.style.border = \"1px solid #ccc\";\r\n preview.style.borderRadius = \"4px\";\r\n preview.style.boxShadow = \"0 2px 4px rgba(0,0,0,0.1)\";\r\n const statusNameElement =\r\n element.querySelector(\"[data-status-name]\");\r\n preview.textContent = statusNameElement?.textContent || \"\";\r\n container.appendChild(preview);\r\n return () => container.removeChild(preview);\r\n },\r\n });\r\n },\r\n });\r\n\r\n // Setup drop target\r\n const dropTargetCleanup = dropTargetForElements({\r\n element: element as HTMLElement,\r\n canDrop: ({ source }) => source.data.instanceId === instanceId,\r\n getData({ input }) {\r\n return attachClosestEdge(\r\n { statusId, index, instanceId },\r\n {\r\n element,\r\n input,\r\n allowedEdges: [\"top\", \"bottom\"],\r\n }\r\n );\r\n },\r\n onDrag({ source, self }) {\r\n const isSource = source.element === dragHandle;\r\n if (isSource) return;\r\n\r\n const closestEdge = extractClosestEdge(self.data);\r\n const sourceIndex = Number(source.data.index);\r\n\r\n const isItemBeforeSource = index === sourceIndex - 1;\r\n const isItemAfterSource = index === sourceIndex + 1;\r\n\r\n const isDropIndicatorHidden =\r\n (isItemBeforeSource && closestEdge === \"bottom\") ||\r\n (isItemAfterSource && closestEdge === \"top\");\r\n\r\n if (isDropIndicatorHidden) return;\r\n\r\n // Add visual feedback for drop target\r\n (element as HTMLElement).style.background =\r\n `linear-gradient(${closestEdge === \"top\" ? 180 : 0}deg, rgba(136,131,214,0.4) 0%, rgba(255,255,255,0) 50%)`;\r\n },\r\n onDragLeave() {\r\n (element as HTMLElement).style.background = \"\";\r\n },\r\n onDrop({ source, self }) {\r\n (element as HTMLElement).style.background = \"\";\r\n\r\n const sourceData = source.data;\r\n const targetData = self.data;\r\n const indexOfTarget = statuses.findIndex(\r\n (s) => s.documentId === targetData.statusId\r\n );\r\n if (indexOfTarget < 0) return;\r\n\r\n const closestEdgeOfTarget = extractClosestEdge(targetData);\r\n\r\n reorderItem({\r\n startIndex: sourceData.index as number,\r\n indexOfTarget,\r\n closestEdgeOfTarget,\r\n });\r\n },\r\n });\r\n\r\n // Combine cleanup functions\r\n const combinedCleanup = combine(draggableCleanup, dropTargetCleanup);\r\n cleanupFunctions.push(combinedCleanup);\r\n });\r\n\r\n // Monitor for drops\r\n const monitorCleanup = monitorForElements({\r\n canMonitor: ({ source }) => source.data.instanceId === instanceId,\r\n onDrop({ location, source }) {\r\n const target = location.current.dropTargets[0];\r\n if (!target) return;\r\n\r\n const sourceData = source.data;\r\n const targetData = target.data;\r\n\r\n const indexOfTarget = statuses.findIndex(\r\n (s) => s.documentId === targetData.statusId\r\n );\r\n if (indexOfTarget < 0) return;\r\n\r\n const closestEdgeOfTarget = extractClosestEdge(targetData);\r\n\r\n reorderItem({\r\n startIndex: sourceData.index as number,\r\n indexOfTarget,\r\n closestEdgeOfTarget,\r\n });\r\n },\r\n });\r\n\r\n // Cleanup function\r\n return () => {\r\n cleanupFunctions.forEach((cleanup) => cleanup());\r\n monitorCleanup();\r\n };\r\n }, [statuses, reorderItem, instanceId]);\r\n\r\n // Open delete dialog\r\n const confirmDelete = (status: Status) => {\r\n setStatusToDelete(status);\r\n };\r\n\r\n // Delete status and replace with selected one\r\n const deleteStatus = async () => {\r\n if (!replacementStatus) return alert(\"Select a replacement status!\");\r\n\r\n const replacementStatusObj = statuses.find(\r\n (s) => s.name === replacementStatus\r\n );\r\n if (!replacementStatusObj) return alert(\"Replacement status not found!\");\r\n\r\n try {\r\n await put(\"/primershop-status-manager/statuses/delete\", {\r\n statusId: statusToDelete?.documentId,\r\n replacementId: replacementStatusObj.documentId,\r\n });\r\n\r\n // Remove the deleted status from the list\r\n setStatuses(\r\n statuses.filter((s) => s.documentId !== statusToDelete?.documentId)\r\n );\r\n setStatusToDelete(null);\r\n setReplacementStatus(\"\");\r\n } catch (error) {\r\n console.error(\"Error deleting status:\", error);\r\n }\r\n };\r\n\r\n // Toggle publish status\r\n const togglePublish = async (id: string, published: boolean) => {\r\n try {\r\n await put(`/primershop-status-manager/statuses/${id}`, {\r\n published: !published,\r\n });\r\n setStatuses(\r\n statuses.map((s) =>\r\n s.documentId === id ? { ...s, published: !published } : s\r\n )\r\n );\r\n } catch (error) {\r\n console.error(\"Error toggling publish status:\", error);\r\n }\r\n };\r\n\r\n return (\r\n <Box padding={4}>\r\n <Typography variant=\"beta\">Status Manager</Typography>\r\n\r\n {/* Input Field */}\r\n <Flex marginTop={4} gap={2}>\r\n <TextInput\r\n placeholder=\"Enter a status...\"\r\n value={newStatus}\r\n onChange={(e) => setNewStatus(e.target.value)}\r\n />\r\n <Button onClick={addStatus} startIcon={<Plus />}>\r\n Add Status\r\n </Button>\r\n </Flex>\r\n\r\n {/* Status List */}\r\n <Box key={statuses.length} marginTop={4}>\r\n {statuses.map((status) => (\r\n <Flex\r\n key={`status-${status.documentId}`}\r\n data-status-id={status.documentId}\r\n alignItems=\"center\"\r\n gap={2}\r\n marginBottom={2}\r\n paddingBottom={2}\r\n style={{\r\n borderBottom: `1px solid gray`,\r\n minWidth: 300,\r\n userSelect: \"none\",\r\n touchAction: \"none\",\r\n }}\r\n >\r\n <Box\r\n key={`dragHandle-${status.documentId}`}\r\n data-drag-handle\r\n style={{\r\n cursor: \"grab\",\r\n padding: \"4px\",\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n }}\r\n >\r\n <Drag />\r\n </Box>\r\n <Typography\r\n variant=\"sigma\"\r\n style={{ display: \"inline-block\", marginRight: \"auto\" }}\r\n data-status-name\r\n >\r\n {status.name}\r\n </Typography>\r\n <Button\r\n variant={status.published ? \"success-light\" : \"secondary\"}\r\n onClick={() => togglePublish(status.documentId, status.published)}\r\n >\r\n {status.published ? \"Published\" : \"Unpublished\"}\r\n </Button>\r\n <Dialog.Root onOpenChange={() => confirmDelete(status)}>\r\n <Dialog.Trigger>\r\n <Button variant=\"tertiary\" startIcon={<Trash />}>\r\n Delete\r\n </Button>\r\n </Dialog.Trigger>\r\n <Dialog.Content>\r\n <Dialog.Header>Delete status</Dialog.Header>\r\n {statuses.length > 1 && statusToDelete && (\r\n <Dialog.Body>\r\n <Typography>\r\n Choose a replacement status before deleting:\r\n </Typography>\r\n <SingleSelect\r\n onChange={(value) =>\r\n setReplacementStatus(value as string)\r\n }\r\n placeholder=\"Select replacement\"\r\n >\r\n {statuses\r\n .filter(\r\n (s) => s.documentId !== statusToDelete.documentId\r\n )\r\n .map((s) => (\r\n <SingleSelectOption\r\n key={`statusChoice-${s.documentId}`}\r\n value={s.name}\r\n >\r\n {s.name}\r\n </SingleSelectOption>\r\n ))}\r\n </SingleSelect>\r\n {replacementStatus && (\r\n <Typography>\r\n Replacing {statusToDelete.name} with {replacementStatus}\r\n </Typography>\r\n )}\r\n </Dialog.Body>\r\n )}\r\n <Dialog.Footer>\r\n <Dialog.Cancel>\r\n <Button fullWidth variant=\"tertiary\">\r\n Cancel\r\n </Button>\r\n </Dialog.Cancel>\r\n <Dialog.Action>\r\n <Button\r\n fullWidth\r\n variant=\"danger-light\"\r\n onClick={deleteStatus}\r\n >\r\n Yes, delete\r\n </Button>\r\n </Dialog.Action>\r\n </Dialog.Footer>\r\n </Dialog.Content>\r\n </Dialog.Root>\r\n </Flex>\r\n ))}\r\n </Box>\r\n </Box>\r\n );\r\n};\r\n\r\nexport { StatusManager };\r\n"],"names":["StatusManager","statuses","setStatuses","useState","newStatus","setNewStatus","statusToDelete","setStatusToDelete","replacementStatus","setReplacementStatus","get","post","put","useFetchClient","instanceId","Symbol","useEffect","loadStatuses","data","validateInput","value","test","addStatus","alert","name","published","error","console","reorderItem","useCallback","startIndex","indexOfTarget","closestEdgeOfTarget","finishIndex","reordered","reorder","list","orderedIds","map","status","index","documentId","order","statusElements","document","querySelectorAll","cleanupFunctions","forEach","element","statusId","getAttribute","findIndex","s","dragHandle","querySelector","draggableCleanup","draggable","getInitialData","onGenerateDragPreview","nativeSetDragImage","setCustomNativeDragPreview","getOffset","pointerOutsideOfPreview","x","y","render","container","preview","createElement","style","padding","backgroundColor","border","borderRadius","boxShadow","statusNameElement","textContent","appendChild","removeChild","dropTargetCleanup","dropTargetForElements","canDrop","source","getData","input","attachClosestEdge","allowedEdges","onDrag","self","isSource","closestEdge","extractClosestEdge","sourceIndex","Number","isItemBeforeSource","isItemAfterSource","isDropIndicatorHidden","background","onDragLeave","onDrop","sourceData","targetData","combinedCleanup","combine","push","monitorCleanup","monitorForElements","canMonitor","location","target","current","dropTargets","cleanup","confirmDelete","deleteStatus","replacementStatusObj","find","replacementId","filter","togglePublish","id","_jsxs","Box","_jsx","Typography","variant","Flex","marginTop","gap","TextInput","placeholder","onChange","e","Button","onClick","startIcon","Plus","data-status-id","alignItems","marginBottom","paddingBottom","borderBottom","minWidth","userSelect","touchAction","data-drag-handle","cursor","display","Drag","marginRight","data-status-name","Dialog","Root","onOpenChange","Trigger","Trash","Content","Header","length","Body","SingleSelect","SingleSelectOption","Footer","Cancel","fullWidth","Action"],"mappings":";;;;;;;;;;;;AAwCA,MAAMA,aAAAA,GAAgB,IAAA;AACpB,IAAA,MAAM,CAACC,QAAAA,EAAUC,WAAAA,CAAY,GAAGC,SAAmB,EAAE,CAAA;AACrD,IAAA,MAAM,CAACC,SAAAA,EAAWC,YAAAA,CAAa,GAAGF,QAAAA,CAAS,EAAA,CAAA;AAC3C,IAAA,MAAM,CAACG,cAAAA,EAAgBC,iBAAAA,CAAkB,GAAGJ,QAAAA,CAAwB,IAAA,CAAA;AACpE,IAAA,MAAM,CAACK,iBAAAA,EAAmBC,oBAAAA,CAAqB,GAAGN,QAAAA,CAAS,EAAA,CAAA;AAC3D,IAAA,MAAM,EAAEO,GAAG,EAAEC,IAAI,EAAEC,GAAG,EAAE,GAAGC,cAAAA,EAAAA;AAC3B,IAAA,MAAM,CAACC,UAAAA,CAAW,GAAGX,QAAAA,CAAS,IAAMY,MAAAA,CAAO,aAAA,CAAA,CAAA;;IAG3CC,SAAAA,CAAU,IAAA;AACR,QAAA,MAAMC,YAAAA,GAAe,UAAA;AACnB,YAAA,MAAM,EAAEC,IAAI,EAAE,GAAG,MAAMR,GAAAA,CAAI,oCAAA,CAAA;YAC3BR,WAAAA,CAAYgB,IAAAA,CAAAA;AACd,QAAA,CAAA;AACAD,QAAAA,YAAAA,EAAAA;IACF,CAAA,EAAG;AAACP,QAAAA;AAAI,KAAA,CAAA;;AAGR,IAAA,MAAMS,aAAAA,GAAgB,CAACC,KAAAA,GAA2B,eAAA,CAAgBC,IAAI,CAACD,KAAAA,CAAAA;;AAGvE,IAAA,MAAME,SAAAA,GAAY,UAAA;AAChB,QAAA,IAAI,CAAClB,SAAAA,IAAa,CAACe,aAAAA,CAAcf,SAAAA,CAAAA,EAC/B,OAAOmB,KAAAA,CAAM,gCAAA,CAAA;QACf,IAAI;AACF,YAAA,MAAM,EAAEL,IAAI,EAAE,GAAG,MAAMP,KAAK,kCAAA,EAAoC;gBAC9Da,IAAAA,EAAMpB,SAAAA;gBACNqB,SAAAA,EAAW;AACb,aAAA,CAAA;YACAvB,WAAAA,CAAY;AAAID,gBAAAA,GAAAA,QAAAA;AAAUiB,gBAAAA;AAAK,aAAA,CAAA;YAC/Bb,YAAAA,CAAa,EAAA,CAAA;AACf,QAAA,CAAA,CAAE,OAAOqB,KAAAA,EAAO;YACdC,OAAAA,CAAQD,KAAK,CAAC,wBAAA,EAA0BA,KAAAA,CAAAA;AAC1C,QAAA;AACF,IAAA,CAAA;IAEA,MAAME,WAAAA,GAAcC,YAClB,OAAO,EACLC,UAAU,EACVC,aAAa,EACbC,mBAAmB,EACL,GAAA;;AAEd,QAAA,IAAIC,WAAAA,GAAcF,aAAAA;AAClB,QAAA,IAAIC,wBAAwB,QAAA,EAAU;AACpCC,YAAAA,WAAAA,GAAcF,aAAAA,GAAgB,CAAA;AAChC,QAAA;;AAGA,QAAA,IAAID,aAAaG,WAAAA,EAAa;AAC5BA,YAAAA,WAAAA,EAAAA;AACF,QAAA;AAEA,QAAA,IAAIA,gBAAgBH,UAAAA,EAAY;AAC9B,YAAA;AACF,QAAA;AAEA,QAAA,MAAMI,YAAYC,OAAAA,CAAQ;YACxBC,IAAAA,EAAMnC,QAAAA;AACN6B,YAAAA,UAAAA;AACAG,YAAAA;AACF,SAAA,CAAA;;AAEA,QAAA,MAAMI,aAAaH,SAAAA,CAAUI,GAAG,CAAC,CAACC,MAAAA,EAAQC,SAAW;AACnDC,gBAAAA,UAAAA,EAAYF,OAAOE,UAAU;gBAC7BC,KAAAA,EAAOF;aACT,CAAA,CAAA;AAEA,QAAA,MAAM5B,IAAI,6CAAA,EAA+C;YACvDX,QAAAA,EAAUoC;AACZ,SAAA,CAAA;QACAnC,WAAAA,CAAYgC,SAAAA,CAAAA;IACd,CAAA,EACA;AAACjC,QAAAA,QAAAA;AAAUW,QAAAA;AAAI,KAAA,CAAA;;IAIjBI,SAAAA,CAAU,IAAA;QACR,MAAM2B,cAAAA,GAAiBC,QAAAA,CAASC,gBAAgB,CAAC,kBAAA,CAAA;AACjD,QAAA,MAAMC,mBAAmC,EAAE;QAE3CH,cAAAA,CAAeI,OAAO,CAAC,CAACC,OAAAA,GAAAA;YACtB,MAAMC,QAAAA,GAAWD,OAAAA,CAAQE,YAAY,CAAC,gBAAA,CAAA;YACtC,MAAMV,KAAAA,GAAQvC,SAASkD,SAAS,CAAC,CAACC,CAAAA,GAAMA,CAAAA,CAAEX,UAAU,KAAKQ,QAAAA,CAAAA;YACzD,MAAMI,UAAAA,GAAaL,OAAAA,CAAQM,aAAa,CAAC,oBAAA,CAAA;AAEzC,YAAA,IAAI,CAACD,UAAAA,EAAY;;AAGjB,YAAA,MAAME,mBAAmBC,SAAAA,CAAU;gBACjCR,OAAAA,EAASK,UAAAA;AACTI,gBAAAA,cAAAA,EAAgB,KAAO;AACrBR,wBAAAA,QAAAA;AACAT,wBAAAA,KAAAA;AACA1B,wBAAAA;qBACF,CAAA;gBACA4C,qBAAAA,CAAAA,CAAsB,EAAEC,kBAAkB,EAAE,EAAA;oBAC1CC,0BAAAA,CAA2B;AACzBD,wBAAAA,kBAAAA;AACAE,wBAAAA,SAAAA,EAAWC,uBAAAA,CAAwB;4BACjCC,CAAAA,EAAG,MAAA;4BACHC,CAAAA,EAAG;AACL,yBAAA,CAAA;wBACAC,MAAAA,CAAAA,CAAO,EAAEC,SAAS,EAAE,EAAA;4BAClB,MAAMC,OAAAA,GAAUvB,QAAAA,CAASwB,aAAa,CAAC,KAAA,CAAA;4BACvCD,OAAAA,CAAQE,KAAK,CAACC,OAAO,GAAG,UAAA;4BACxBH,OAAAA,CAAQE,KAAK,CAACE,eAAe,GAAG,MAAA;4BAChCJ,OAAAA,CAAQE,KAAK,CAACG,MAAM,GAAG,gBAAA;4BACvBL,OAAAA,CAAQE,KAAK,CAACI,YAAY,GAAG,KAAA;4BAC7BN,OAAAA,CAAQE,KAAK,CAACK,SAAS,GAAG,2BAAA;4BAC1B,MAAMC,iBAAAA,GACJ3B,OAAAA,CAAQM,aAAa,CAAC,oBAAA,CAAA;4BACxBa,OAAAA,CAAQS,WAAW,GAAGD,iBAAAA,EAAmBC,WAAAA,IAAe,EAAA;AACxDV,4BAAAA,SAAAA,CAAUW,WAAW,CAACV,OAAAA,CAAAA;4BACtB,OAAO,IAAMD,SAAAA,CAAUY,WAAW,CAACX,OAAAA,CAAAA;AACrC,wBAAA;AACF,qBAAA,CAAA;AACF,gBAAA;AACF,aAAA,CAAA;;AAGA,YAAA,MAAMY,oBAAoBC,qBAAAA,CAAsB;gBAC9ChC,OAAAA,EAASA,OAAAA;gBACTiC,OAAAA,EAAS,CAAC,EAAEC,MAAM,EAAE,GAAKA,MAAAA,CAAOhE,IAAI,CAACJ,UAAU,KAAKA,UAAAA;gBACpDqE,OAAAA,CAAAA,CAAQ,EAAEC,KAAK,EAAE,EAAA;AACf,oBAAA,OAAOC,iBAAAA,CACL;AAAEpC,wBAAAA,QAAAA;AAAUT,wBAAAA,KAAAA;AAAO1B,wBAAAA;qBAAW,EAC9B;AACEkC,wBAAAA,OAAAA;AACAoC,wBAAAA,KAAAA;wBACAE,YAAAA,EAAc;AAAC,4BAAA,KAAA;AAAO,4BAAA;AAAS;AACjC,qBAAA,CAAA;AAEJ,gBAAA,CAAA;AACAC,gBAAAA,MAAAA,CAAAA,CAAO,EAAEL,MAAM,EAAEM,IAAI,EAAE,EAAA;oBACrB,MAAMC,QAAAA,GAAWP,MAAAA,CAAOlC,OAAO,KAAKK,UAAAA;AACpC,oBAAA,IAAIoC,QAAAA,EAAU;oBAEd,MAAMC,WAAAA,GAAcC,kBAAAA,CAAmBH,IAAAA,CAAKtE,IAAI,CAAA;AAChD,oBAAA,MAAM0E,WAAAA,GAAcC,MAAAA,CAAOX,MAAAA,CAAOhE,IAAI,CAACsB,KAAK,CAAA;oBAE5C,MAAMsD,kBAAAA,GAAqBtD,UAAUoD,WAAAA,GAAc,CAAA;oBACnD,MAAMG,iBAAAA,GAAoBvD,UAAUoD,WAAAA,GAAc,CAAA;AAElD,oBAAA,MAAMI,wBACJ,kBAACF,IAAsBJ,WAAAA,KAAgB,QAAA,IACtCK,qBAAqBL,WAAAA,KAAgB,KAAA;AAExC,oBAAA,IAAIM,qBAAAA,EAAuB;;AAG1BhD,oBAAAA,OAAAA,CAAwBqB,KAAK,CAAC4B,UAAU,GACvC,CAAC,gBAAgB,EAAEP,WAAAA,KAAgB,KAAA,GAAQ,GAAA,GAAM,CAAA,CAAE,uDAAuD,CAAC;AAC/G,gBAAA,CAAA;AACAQ,gBAAAA,WAAAA,CAAAA,GAAAA;oBACGlD,OAAAA,CAAwBqB,KAAK,CAAC4B,UAAU,GAAG,EAAA;AAC9C,gBAAA,CAAA;AACAE,gBAAAA,MAAAA,CAAAA,CAAO,EAAEjB,MAAM,EAAEM,IAAI,EAAE,EAAA;oBACpBxC,OAAAA,CAAwBqB,KAAK,CAAC4B,UAAU,GAAG,EAAA;oBAE5C,MAAMG,UAAAA,GAAalB,OAAOhE,IAAI;oBAC9B,MAAMmF,UAAAA,GAAab,KAAKtE,IAAI;oBAC5B,MAAMa,aAAAA,GAAgB9B,QAAAA,CAASkD,SAAS,CACtC,CAACC,IAAMA,CAAAA,CAAEX,UAAU,KAAK4D,UAAAA,CAAWpD,QAAQ,CAAA;AAE7C,oBAAA,IAAIlB,gBAAgB,CAAA,EAAG;AAEvB,oBAAA,MAAMC,sBAAsB2D,kBAAAA,CAAmBU,UAAAA,CAAAA;oBAE/CzE,WAAAA,CAAY;AACVE,wBAAAA,UAAAA,EAAYsE,WAAW5D,KAAK;AAC5BT,wBAAAA,aAAAA;AACAC,wBAAAA;AACF,qBAAA,CAAA;AACF,gBAAA;AACF,aAAA,CAAA;;YAGA,MAAMsE,eAAAA,GAAkBC,QAAQhD,gBAAAA,EAAkBwB,iBAAAA,CAAAA;AAClDjC,YAAAA,gBAAAA,CAAiB0D,IAAI,CAACF,eAAAA,CAAAA;AACxB,QAAA,CAAA,CAAA;;AAGA,QAAA,MAAMG,iBAAiBC,kBAAAA,CAAmB;YACxCC,UAAAA,EAAY,CAAC,EAAEzB,MAAM,EAAE,GAAKA,MAAAA,CAAOhE,IAAI,CAACJ,UAAU,KAAKA,UAAAA;AACvDqF,YAAAA,MAAAA,CAAAA,CAAO,EAAES,QAAQ,EAAE1B,MAAM,EAAE,EAAA;AACzB,gBAAA,MAAM2B,SAASD,QAAAA,CAASE,OAAO,CAACC,WAAW,CAAC,CAAA,CAAE;AAC9C,gBAAA,IAAI,CAACF,MAAAA,EAAQ;gBAEb,MAAMT,UAAAA,GAAalB,OAAOhE,IAAI;gBAC9B,MAAMmF,UAAAA,GAAaQ,OAAO3F,IAAI;gBAE9B,MAAMa,aAAAA,GAAgB9B,QAAAA,CAASkD,SAAS,CACtC,CAACC,IAAMA,CAAAA,CAAEX,UAAU,KAAK4D,UAAAA,CAAWpD,QAAQ,CAAA;AAE7C,gBAAA,IAAIlB,gBAAgB,CAAA,EAAG;AAEvB,gBAAA,MAAMC,sBAAsB2D,kBAAAA,CAAmBU,UAAAA,CAAAA;gBAE/CzE,WAAAA,CAAY;AACVE,oBAAAA,UAAAA,EAAYsE,WAAW5D,KAAK;AAC5BT,oBAAAA,aAAAA;AACAC,oBAAAA;AACF,iBAAA,CAAA;AACF,YAAA;AACF,SAAA,CAAA;;QAGA,OAAO,IAAA;YACLc,gBAAAA,CAAiBC,OAAO,CAAC,CAACiE,OAAAA,GAAYA,OAAAA,EAAAA,CAAAA;AACtCP,YAAAA,cAAAA,EAAAA;AACF,QAAA,CAAA;IACF,CAAA,EAAG;AAACxG,QAAAA,QAAAA;AAAU2B,QAAAA,WAAAA;AAAad,QAAAA;AAAW,KAAA,CAAA;;AAGtC,IAAA,MAAMmG,gBAAgB,CAAC1E,MAAAA,GAAAA;QACrBhC,iBAAAA,CAAkBgC,MAAAA,CAAAA;AACpB,IAAA,CAAA;;AAGA,IAAA,MAAM2E,YAAAA,GAAe,UAAA;QACnB,IAAI,CAAC1G,iBAAAA,EAAmB,OAAOe,KAAAA,CAAM,8BAAA,CAAA;QAErC,MAAM4F,oBAAAA,GAAuBlH,SAASmH,IAAI,CACxC,CAAChE,CAAAA,GAAMA,CAAAA,CAAE5B,IAAI,KAAKhB,iBAAAA,CAAAA;QAEpB,IAAI,CAAC2G,oBAAAA,EAAsB,OAAO5F,KAAAA,CAAM,+BAAA,CAAA;QAExC,IAAI;AACF,YAAA,MAAMX,IAAI,4CAAA,EAA8C;AACtDqC,gBAAAA,QAAAA,EAAU3C,cAAAA,EAAgBmC,UAAAA;AAC1B4E,gBAAAA,aAAAA,EAAeF,qBAAqB1E;AACtC,aAAA,CAAA;;YAGAvC,WAAAA,CACED,QAAAA,CAASqH,MAAM,CAAC,CAAClE,IAAMA,CAAAA,CAAEX,UAAU,KAAKnC,cAAAA,EAAgBmC,UAAAA,CAAAA,CAAAA;YAE1DlC,iBAAAA,CAAkB,IAAA,CAAA;YAClBE,oBAAAA,CAAqB,EAAA,CAAA;AACvB,QAAA,CAAA,CAAE,OAAOiB,KAAAA,EAAO;YACdC,OAAAA,CAAQD,KAAK,CAAC,wBAAA,EAA0BA,KAAAA,CAAAA;AAC1C,QAAA;AACF,IAAA,CAAA;;IAGA,MAAM6F,aAAAA,GAAgB,OAAOC,EAAAA,EAAY/F,SAAAA,GAAAA;QACvC,IAAI;AACF,YAAA,MAAMb,GAAAA,CAAI,CAAC,oCAAoC,EAAE4G,IAAI,EAAE;AACrD/F,gBAAAA,SAAAA,EAAW,CAACA;AACd,aAAA,CAAA;YACAvB,WAAAA,CACED,QAAAA,CAASqC,GAAG,CAAC,CAACc,IACZA,CAAAA,CAAEX,UAAU,KAAK+E,EAAAA,GAAK;AAAE,oBAAA,GAAGpE,CAAC;AAAE3B,oBAAAA,SAAAA,EAAW,CAACA;iBAAU,GAAI2B,CAAAA,CAAAA,CAAAA;AAG9D,QAAA,CAAA,CAAE,OAAO1B,KAAAA,EAAO;YACdC,OAAAA,CAAQD,KAAK,CAAC,gCAAA,EAAkCA,KAAAA,CAAAA;AAClD,QAAA;AACF,IAAA,CAAA;AAEA,IAAA,qBACE+F,IAAA,CAACC,GAAAA,EAAAA;QAAIpD,OAAAA,EAAS,CAAA;;0BACZqD,GAAA,CAACC,UAAAA,EAAAA;gBAAWC,OAAAA,EAAQ,MAAA;AAAO,gBAAA,QAAA,EAAA;;0BAG3BJ,IAAA,CAACK,IAAAA,EAAAA;gBAAKC,SAAAA,EAAW,CAAA;gBAAGC,GAAAA,EAAK,CAAA;;kCACvBL,GAAA,CAACM,SAAAA,EAAAA;wBACCC,WAAAA,EAAY,mBAAA;wBACZ9G,KAAAA,EAAOhB,SAAAA;AACP+H,wBAAAA,QAAAA,EAAU,CAACC,CAAAA,GAAM/H,YAAAA,CAAa+H,CAAAA,CAAEvB,MAAM,CAACzF,KAAK;;kCAE9CuG,GAAA,CAACU,MAAAA,EAAAA;wBAAOC,OAAAA,EAAShH,SAAAA;AAAWiH,wBAAAA,SAAAA,gBAAWZ,GAAA,CAACa,IAAAA,EAAAA,EAAAA,CAAAA;AAAS,wBAAA,QAAA,EAAA;;;;0BAMnDb,GAAA,CAACD,GAAAA,EAAAA;gBAA0BK,SAAAA,EAAW,CAAA;AACnC9H,gBAAAA,QAAAA,EAAAA,QAAAA,CAASqC,GAAG,CAAC,CAACC,MAAAA,iBACbkF,IAAA,CAACK,IAAAA,EAAAA;AAECW,wBAAAA,gBAAAA,EAAgBlG,OAAOE,UAAU;wBACjCiG,UAAAA,EAAW,QAAA;wBACXV,GAAAA,EAAK,CAAA;wBACLW,YAAAA,EAAc,CAAA;wBACdC,aAAAA,EAAe,CAAA;wBACfvE,KAAAA,EAAO;4BACLwE,YAAAA,EAAc,CAAC,cAAc,CAAC;4BAC9BC,QAAAA,EAAU,GAAA;4BACVC,UAAAA,EAAY,MAAA;4BACZC,WAAAA,EAAa;AACf,yBAAA;;0CAEArB,GAAA,CAACD,GAAAA,EAAAA;gCAECuB,kBAAgB,EAAA,IAAA;gCAChB5E,KAAAA,EAAO;oCACL6E,MAAAA,EAAQ,MAAA;oCACR5E,OAAAA,EAAS,KAAA;oCACT6E,OAAAA,EAAS,MAAA;oCACTT,UAAAA,EAAY;AACd,iCAAA;AAEA,gCAAA,QAAA,gBAAAf,GAAA,CAACyB,IAAAA,EAAAA,EAAAA;AATI,6BAAA,EAAA,CAAC,WAAW,EAAE7G,MAAAA,CAAOE,UAAU,CAAA,CAAE,CAAA;0CAWxCkF,GAAA,CAACC,UAAAA,EAAAA;gCACCC,OAAAA,EAAQ,OAAA;gCACRxD,KAAAA,EAAO;oCAAE8E,OAAAA,EAAS,cAAA;oCAAgBE,WAAAA,EAAa;AAAO,iCAAA;gCACtDC,kBAAgB,EAAA,IAAA;AAEf/G,gCAAAA,QAAAA,EAAAA,MAAAA,CAAOf;;0CAEVmG,GAAA,CAACU,MAAAA,EAAAA;gCACCR,OAAAA,EAAStF,MAAAA,CAAOd,SAAS,GAAG,eAAA,GAAkB,WAAA;AAC9C6G,gCAAAA,OAAAA,EAAS,IAAMf,aAAAA,CAAchF,MAAAA,CAAOE,UAAU,EAAEF,OAAOd,SAAS,CAAA;0CAE/Dc,MAAAA,CAAOd,SAAS,GAAG,WAAA,GAAc;;AAEpC,0CAAAgG,IAAA,CAAC8B,OAAOC,IAAI,EAAA;AAACC,gCAAAA,YAAAA,EAAc,IAAMxC,aAAAA,CAAc1E,MAAAA,CAAAA;;AAC7C,kDAAAoF,GAAA,CAAC4B,OAAOG,OAAO,EAAA;AACb,wCAAA,QAAA,gBAAA/B,GAAA,CAACU,MAAAA,EAAAA;4CAAOR,OAAAA,EAAQ,UAAA;AAAWU,4CAAAA,SAAAA,gBAAWZ,GAAA,CAACgC,KAAAA,EAAAA,EAAAA,CAAAA;AAAU,4CAAA,QAAA,EAAA;;;AAInD,kDAAAlC,IAAA,CAAC8B,OAAOK,OAAO,EAAA;;AACb,0DAAAjC,GAAA,CAAC4B,OAAOM,MAAM,EAAA;AAAC,gDAAA,QAAA,EAAA;;AACd5J,4CAAAA,QAAAA,CAAS6J,MAAM,GAAG,CAAA,IAAKxJ,cAAAA,kBACtBmH,IAAA,CAAC8B,OAAOQ,IAAI,EAAA;;kEACVpC,GAAA,CAACC,UAAAA,EAAAA;AAAW,wDAAA,QAAA,EAAA;;kEAGZD,GAAA,CAACqC,YAAAA,EAAAA;wDACC7B,QAAAA,EAAU,CAAC/G,QACTX,oBAAAA,CAAqBW,KAAAA,CAAAA;wDAEvB8G,WAAAA,EAAY,oBAAA;AAEXjI,wDAAAA,QAAAA,EAAAA,QAAAA,CACEqH,MAAM,CACL,CAAClE,CAAAA,GAAMA,EAAEX,UAAU,KAAKnC,cAAAA,CAAemC,UAAU,CAAA,CAElDH,GAAG,CAAC,CAACc,kBACJuE,GAAA,CAACsC,kBAAAA,EAAAA;AAEC7I,gEAAAA,KAAAA,EAAOgC,EAAE5B,IAAI;AAEZ4B,gEAAAA,QAAAA,EAAAA,CAAAA,CAAE5B;AAHE,6DAAA,EAAA,CAAC,aAAa,EAAE4B,CAAAA,CAAEX,UAAU,CAAA,CAAE,CAAA;;AAO1CjC,oDAAAA,iBAAAA,kBACCiH,IAAA,CAACG,UAAAA,EAAAA;;AAAW,4DAAA,YAAA;AACCtH,4DAAAA,cAAAA,CAAekB,IAAI;AAAC,4DAAA,QAAA;AAAOhB,4DAAAA;;;;;AAK9C,0DAAAiH,IAAA,CAAC8B,OAAOW,MAAM,EAAA;;AACZ,kEAAAvC,GAAA,CAAC4B,OAAOY,MAAM,EAAA;AACZ,wDAAA,QAAA,gBAAAxC,GAAA,CAACU,MAAAA,EAAAA;4DAAO+B,SAAS,EAAA,IAAA;4DAACvC,OAAAA,EAAQ,UAAA;AAAW,4DAAA,QAAA,EAAA;;;AAIvC,kEAAAF,GAAA,CAAC4B,OAAOc,MAAM,EAAA;AACZ,wDAAA,QAAA,gBAAA1C,GAAA,CAACU,MAAAA,EAAAA;4DACC+B,SAAS,EAAA,IAAA;4DACTvC,OAAAA,EAAQ,cAAA;4DACRS,OAAAA,EAASpB,YAAAA;AACV,4DAAA,QAAA,EAAA;;;;;;;;;;AAxFJ,qBAAA,EAAA,CAAC,OAAO,EAAE3E,MAAAA,CAAOE,UAAU,CAAA,CAAE,CAAA;AAH9BxC,aAAAA,EAAAA,QAAAA,CAAS6J,MAAM;;;AAuG/B;;;;"}
@@ -0,0 +1,46 @@
1
+ 'use strict';
2
+
3
+ var Initializer = require('./components/Initializer.js');
4
+ var PluginIcon = require('./components/PluginIcon.js');
5
+ var ProductStatusField = require('./components/ProductStatusField.js');
6
+ var pluginId = require('./pluginId.js');
7
+ var addStatusColumnHook = require('./listView/add-status-column-hook.js');
8
+ var StatusFilter = require('./listView/StatusFilter.js');
9
+
10
+ const plugin = {
11
+ register (app) {
12
+ app.registerPlugin({
13
+ id: pluginId.PLUGIN_ID,
14
+ initializer: Initializer.Initializer,
15
+ isReady: true,
16
+ name: pluginId.PLUGIN_ID
17
+ });
18
+ app.addMenuLink({
19
+ to: `plugins/${pluginId.PLUGIN_ID}`,
20
+ icon: PluginIcon.PluginIcon,
21
+ intlLabel: {
22
+ id: `${pluginId.PLUGIN_ID}.plugin.name`,
23
+ defaultMessage: "Status manager"
24
+ },
25
+ permissions: [],
26
+ Component: ()=>Promise.resolve().then(function () { return require('./pages/HomePage.js'); }).then((module)=>({
27
+ default: module.HomePage
28
+ }))
29
+ });
30
+ },
31
+ bootstrap (app) {
32
+ app.getPlugin("content-manager").injectComponent("editView", "right-links", {
33
+ name: "Status",
34
+ Component: ProductStatusField.ProductStatusField
35
+ });
36
+ app.registerHook('Admin/CM/pages/ListView/inject-column-in-table', addStatusColumnHook.addStatusColumnHook);
37
+ const contentManager = app.getPlugin('content-manager');
38
+ contentManager.injectComponent('listView', 'actions', {
39
+ name: 'status-filter',
40
+ Component: StatusFilter.StatusFilter
41
+ });
42
+ }
43
+ };
44
+
45
+ module.exports = plugin;
46
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../admin/src/index.ts"],"sourcesContent":["import { Initializer } from \"./components/Initializer\";\r\nimport { PluginIcon } from \"./components/PluginIcon\";\r\nimport { ProductStatusField } from \"./components/ProductStatusField\";\r\nimport { PLUGIN_ID } from \"./pluginId\";\r\nimport { addStatusColumnHook } from \"./listView/add-status-column-hook\";\r\n\r\nimport type { StrapiApp } from \"@strapi/admin/strapi-admin\";\r\nimport { StatusFilter } from \"./listView/StatusFilter\";\r\n\r\nconst plugin = {\r\n register(app: StrapiApp) {\r\n app.registerPlugin({\r\n id: PLUGIN_ID,\r\n initializer: Initializer,\r\n isReady: true,\r\n name: PLUGIN_ID,\r\n });\r\n\r\n app.addMenuLink({\r\n to: `plugins/${PLUGIN_ID}`,\r\n icon: PluginIcon,\r\n intlLabel: {\r\n id: `${PLUGIN_ID}.plugin.name`,\r\n defaultMessage: \"Status manager\",\r\n },\r\n permissions: [],\r\n Component: () =>\r\n import(\"./pages/HomePage\").then((module) => ({\r\n default: module.HomePage,\r\n })),\r\n });\r\n },\r\n bootstrap(app: StrapiApp) {\r\n app\r\n .getPlugin(\"content-manager\")\r\n .injectComponent(\"editView\", \"right-links\", {\r\n name: \"Status\",\r\n Component: ProductStatusField,\r\n });\r\n\r\n app.registerHook('Admin/CM/pages/ListView/inject-column-in-table', addStatusColumnHook);\r\n\r\n const contentManager = app.getPlugin('content-manager');\r\n contentManager.injectComponent('listView', 'actions', {\r\n name: 'status-filter',\r\n Component: StatusFilter,\r\n });\r\n },\r\n};\r\n\r\nexport default plugin;\r\n"],"names":["plugin","register","app","registerPlugin","id","PLUGIN_ID","initializer","Initializer","isReady","name","addMenuLink","to","icon","PluginIcon","intlLabel","defaultMessage","permissions","Component","then","module","default","HomePage","bootstrap","getPlugin","injectComponent","ProductStatusField","registerHook","addStatusColumnHook","contentManager","StatusFilter"],"mappings":";;;;;;;;;AASA,MAAMA,MAAAA,GAAS;AACbC,IAAAA,QAAAA,CAAAA,CAASC,GAAc,EAAA;AACrBA,QAAAA,GAAAA,CAAIC,cAAc,CAAC;YACjBC,EAAAA,EAAIC,kBAAAA;YACJC,WAAAA,EAAaC,uBAAAA;YACbC,OAAAA,EAAS,IAAA;YACTC,IAAAA,EAAMJ;AACR,SAAA,CAAA;AAEAH,QAAAA,GAAAA,CAAIQ,WAAW,CAAC;YACdC,EAAAA,EAAI,CAAC,QAAQ,EAAEN,kBAAAA,CAAAA,CAAW;YAC1BO,IAAAA,EAAMC,qBAAAA;YACNC,SAAAA,EAAW;gBACTV,EAAAA,EAAI,CAAA,EAAGC,kBAAAA,CAAU,YAAY,CAAC;gBAC9BU,cAAAA,EAAgB;AAClB,aAAA;AACAC,YAAAA,WAAAA,EAAa,EAAE;YACfC,SAAAA,EAAW,IACT,oDAAO,qBAAA,KAAA,CAAoBC,IAAI,CAAC,CAACC,UAAY;AAC3CC,wBAAAA,OAAAA,EAASD,OAAOE;qBAClB,CAAA;AACJ,SAAA,CAAA;AACF,IAAA,CAAA;AACAC,IAAAA,SAAAA,CAAAA,CAAUpB,GAAc,EAAA;AACtBA,QAAAA,GAAAA,CACGqB,SAAS,CAAC,iBAAA,CAAA,CACVC,eAAe,CAAC,YAAY,aAAA,EAAe;YAC1Cf,IAAAA,EAAM,QAAA;YACNQ,SAAAA,EAAWQ;AACb,SAAA,CAAA;QAEFvB,GAAAA,CAAIwB,YAAY,CAAC,gDAAA,EAAkDC,uCAAAA,CAAAA;QAEnE,MAAMC,cAAAA,GAAiB1B,GAAAA,CAAIqB,SAAS,CAAC,iBAAA,CAAA;QACrCK,cAAAA,CAAeJ,eAAe,CAAC,UAAA,EAAY,SAAA,EAAW;YACpDf,IAAAA,EAAM,eAAA;YACNQ,SAAAA,EAAWY;AACb,SAAA,CAAA;AACF,IAAA;AACF;;;;"}
@@ -0,0 +1,44 @@
1
+ import { Initializer } from './components/Initializer.mjs';
2
+ import { PluginIcon } from './components/PluginIcon.mjs';
3
+ import { ProductStatusField } from './components/ProductStatusField.mjs';
4
+ import { PLUGIN_ID } from './pluginId.mjs';
5
+ import { addStatusColumnHook } from './listView/add-status-column-hook.mjs';
6
+ import { StatusFilter } from './listView/StatusFilter.mjs';
7
+
8
+ const plugin = {
9
+ register (app) {
10
+ app.registerPlugin({
11
+ id: PLUGIN_ID,
12
+ initializer: Initializer,
13
+ isReady: true,
14
+ name: PLUGIN_ID
15
+ });
16
+ app.addMenuLink({
17
+ to: `plugins/${PLUGIN_ID}`,
18
+ icon: PluginIcon,
19
+ intlLabel: {
20
+ id: `${PLUGIN_ID}.plugin.name`,
21
+ defaultMessage: "Status manager"
22
+ },
23
+ permissions: [],
24
+ Component: ()=>import('./pages/HomePage.mjs').then((module)=>({
25
+ default: module.HomePage
26
+ }))
27
+ });
28
+ },
29
+ bootstrap (app) {
30
+ app.getPlugin("content-manager").injectComponent("editView", "right-links", {
31
+ name: "Status",
32
+ Component: ProductStatusField
33
+ });
34
+ app.registerHook('Admin/CM/pages/ListView/inject-column-in-table', addStatusColumnHook);
35
+ const contentManager = app.getPlugin('content-manager');
36
+ contentManager.injectComponent('listView', 'actions', {
37
+ name: 'status-filter',
38
+ Component: StatusFilter
39
+ });
40
+ }
41
+ };
42
+
43
+ export { plugin as default };
44
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","sources":["../../admin/src/index.ts"],"sourcesContent":["import { Initializer } from \"./components/Initializer\";\r\nimport { PluginIcon } from \"./components/PluginIcon\";\r\nimport { ProductStatusField } from \"./components/ProductStatusField\";\r\nimport { PLUGIN_ID } from \"./pluginId\";\r\nimport { addStatusColumnHook } from \"./listView/add-status-column-hook\";\r\n\r\nimport type { StrapiApp } from \"@strapi/admin/strapi-admin\";\r\nimport { StatusFilter } from \"./listView/StatusFilter\";\r\n\r\nconst plugin = {\r\n register(app: StrapiApp) {\r\n app.registerPlugin({\r\n id: PLUGIN_ID,\r\n initializer: Initializer,\r\n isReady: true,\r\n name: PLUGIN_ID,\r\n });\r\n\r\n app.addMenuLink({\r\n to: `plugins/${PLUGIN_ID}`,\r\n icon: PluginIcon,\r\n intlLabel: {\r\n id: `${PLUGIN_ID}.plugin.name`,\r\n defaultMessage: \"Status manager\",\r\n },\r\n permissions: [],\r\n Component: () =>\r\n import(\"./pages/HomePage\").then((module) => ({\r\n default: module.HomePage,\r\n })),\r\n });\r\n },\r\n bootstrap(app: StrapiApp) {\r\n app\r\n .getPlugin(\"content-manager\")\r\n .injectComponent(\"editView\", \"right-links\", {\r\n name: \"Status\",\r\n Component: ProductStatusField,\r\n });\r\n\r\n app.registerHook('Admin/CM/pages/ListView/inject-column-in-table', addStatusColumnHook);\r\n\r\n const contentManager = app.getPlugin('content-manager');\r\n contentManager.injectComponent('listView', 'actions', {\r\n name: 'status-filter',\r\n Component: StatusFilter,\r\n });\r\n },\r\n};\r\n\r\nexport default plugin;\r\n"],"names":["plugin","register","app","registerPlugin","id","PLUGIN_ID","initializer","Initializer","isReady","name","addMenuLink","to","icon","PluginIcon","intlLabel","defaultMessage","permissions","Component","then","module","default","HomePage","bootstrap","getPlugin","injectComponent","ProductStatusField","registerHook","addStatusColumnHook","contentManager","StatusFilter"],"mappings":";;;;;;;AASA,MAAMA,MAAAA,GAAS;AACbC,IAAAA,QAAAA,CAAAA,CAASC,GAAc,EAAA;AACrBA,QAAAA,GAAAA,CAAIC,cAAc,CAAC;YACjBC,EAAAA,EAAIC,SAAAA;YACJC,WAAAA,EAAaC,WAAAA;YACbC,OAAAA,EAAS,IAAA;YACTC,IAAAA,EAAMJ;AACR,SAAA,CAAA;AAEAH,QAAAA,GAAAA,CAAIQ,WAAW,CAAC;YACdC,EAAAA,EAAI,CAAC,QAAQ,EAAEN,SAAAA,CAAAA,CAAW;YAC1BO,IAAAA,EAAMC,UAAAA;YACNC,SAAAA,EAAW;gBACTV,EAAAA,EAAI,CAAA,EAAGC,SAAAA,CAAU,YAAY,CAAC;gBAC9BU,cAAAA,EAAgB;AAClB,aAAA;AACAC,YAAAA,WAAAA,EAAa,EAAE;YACfC,SAAAA,EAAW,IACT,OAAO,sBAAA,CAAA,CAAoBC,IAAI,CAAC,CAACC,UAAY;AAC3CC,wBAAAA,OAAAA,EAASD,OAAOE;qBAClB,CAAA;AACJ,SAAA,CAAA;AACF,IAAA,CAAA;AACAC,IAAAA,SAAAA,CAAAA,CAAUpB,GAAc,EAAA;AACtBA,QAAAA,GAAAA,CACGqB,SAAS,CAAC,iBAAA,CAAA,CACVC,eAAe,CAAC,YAAY,aAAA,EAAe;YAC1Cf,IAAAA,EAAM,QAAA;YACNQ,SAAAA,EAAWQ;AACb,SAAA,CAAA;QAEFvB,GAAAA,CAAIwB,YAAY,CAAC,gDAAA,EAAkDC,mBAAAA,CAAAA;QAEnE,MAAMC,cAAAA,GAAiB1B,GAAAA,CAAIqB,SAAS,CAAC,iBAAA,CAAA;QACrCK,cAAAA,CAAeJ,eAAe,CAAC,UAAA,EAAY,SAAA,EAAW;YACpDf,IAAAA,EAAM,eAAA;YACNQ,SAAAA,EAAWY;AACb,SAAA,CAAA;AACF,IAAA;AACF;;;;"}
@@ -0,0 +1,76 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+ var React = require('react');
5
+ var designSystem = require('@strapi/design-system');
6
+ var admin = require('@strapi/strapi/admin');
7
+
8
+ const StatusFilter = ()=>{
9
+ const { contentType } = admin.unstable_useContentManagerContext();
10
+ const [statuses, setStatuses] = React.useState([]);
11
+ const [selected, setSelected] = React.useState("");
12
+ const { get } = admin.useFetchClient();
13
+ const [{ query }, setQuery] = admin.useQueryParams();
14
+ const handleStatusChange = React.useCallback((name)=>{
15
+ setQuery({
16
+ page: 1,
17
+ plugins: {
18
+ ...query.plugins,
19
+ "primershop-status-manager": {
20
+ statusName: name.toLowerCase()
21
+ }
22
+ }
23
+ }, "push", true);
24
+ }, [
25
+ query.plugins,
26
+ setQuery
27
+ ]);
28
+ React.useEffect(()=>{
29
+ const selectedStatusName = query.plugins?.["primershop-status-manager"]?.statusName;
30
+ if (!selectedStatusName) return;
31
+ const status = statuses.find((status)=>status.name.toLowerCase() === selectedStatusName);
32
+ if (status) {
33
+ setSelected(status.name);
34
+ }
35
+ }, [
36
+ query,
37
+ statuses
38
+ ]);
39
+ React.useEffect(()=>{
40
+ async function fetchStatuses() {
41
+ try {
42
+ const { data } = await get("primershop-status-manager/statuses");
43
+ const allStatusesObject = {
44
+ documentId: "all",
45
+ name: "All"
46
+ };
47
+ setStatuses([
48
+ allStatusesObject,
49
+ ...data
50
+ ]);
51
+ } catch (error) {
52
+ console.error("Error fetching statuses:", error);
53
+ }
54
+ }
55
+ fetchStatuses();
56
+ }, [
57
+ get
58
+ ]);
59
+ return /*#__PURE__*/ jsxRuntime.jsx(designSystem.Flex, {
60
+ direction: "column",
61
+ justifyContent: "center",
62
+ children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.SingleSelect, {
63
+ size: "S",
64
+ placeholder: `${contentType?.info.displayName} status`,
65
+ value: selected,
66
+ onChange: handleStatusChange,
67
+ children: statuses.map((status)=>/*#__PURE__*/ jsxRuntime.jsx(designSystem.SingleSelectOption, {
68
+ value: status.name,
69
+ children: status.name
70
+ }, status.documentId))
71
+ })
72
+ });
73
+ };
74
+
75
+ exports.StatusFilter = StatusFilter;
76
+ //# sourceMappingURL=StatusFilter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StatusFilter.js","sources":["../../../admin/src/listView/StatusFilter.tsx"],"sourcesContent":["import { useCallback, useEffect, useState } from \"react\";\r\n\r\nimport { SingleSelect, SingleSelectOption, Flex } from \"@strapi/design-system\";\r\nimport {\r\n useFetchClient,\r\n unstable_useContentManagerContext as useContentManagerContext,\r\n useQueryParams,\r\n} from \"@strapi/strapi/admin\";\r\ninterface Status {\r\n documentId: string;\r\n name: string;\r\n}\r\n\r\nconst StatusFilter = () => {\r\n const { contentType } = useContentManagerContext();\r\n const [statuses, setStatuses] = useState<Status[]>([]);\r\n const [selected, setSelected] = useState<string | undefined>(\"\");\r\n const { get } = useFetchClient();\r\n const [{ query }, setQuery] = useQueryParams<{\r\n page: number;\r\n plugins: { \"primershop-status-manager\": { statusName: string } };\r\n }>();\r\n\r\n const handleStatusChange = useCallback(\r\n (name: string) => {\r\n setQuery(\r\n {\r\n page: 1,\r\n plugins: {\r\n ...query.plugins,\r\n \"primershop-status-manager\": { statusName: name.toLowerCase() },\r\n },\r\n },\r\n \"push\",\r\n true\r\n );\r\n },\r\n\r\n [query.plugins, setQuery]\r\n );\r\n\r\n useEffect(() => {\r\n const selectedStatusName =\r\n query.plugins?.[\"primershop-status-manager\"]?.statusName;\r\n if (!selectedStatusName) return;\r\n const status = statuses.find(\r\n (status) => status.name.toLowerCase() === selectedStatusName\r\n );\r\n if (status) {\r\n setSelected(status.name);\r\n }\r\n }, [query, statuses]);\r\n\r\n useEffect(() => {\r\n async function fetchStatuses() {\r\n try {\r\n const { data } = await get(\"primershop-status-manager/statuses\");\r\n const allStatusesObject = {\r\n documentId: \"all\",\r\n name: \"All\",\r\n };\r\n setStatuses([allStatusesObject, ...data]);\r\n } catch (error) {\r\n console.error(\"Error fetching statuses:\", error);\r\n }\r\n }\r\n fetchStatuses();\r\n }, [get]);\r\n\r\n return (\r\n <Flex direction=\"column\" justifyContent=\"center\">\r\n <SingleSelect\r\n size=\"S\"\r\n placeholder={`${contentType?.info.displayName} status`}\r\n value={selected}\r\n onChange={handleStatusChange}\r\n >\r\n {statuses.map((status) => (\r\n <SingleSelectOption key={status.documentId} value={status.name}>\r\n {status.name}\r\n </SingleSelectOption>\r\n ))}\r\n </SingleSelect>\r\n </Flex>\r\n );\r\n};\r\n\r\nexport { StatusFilter };\r\n"],"names":["StatusFilter","contentType","useContentManagerContext","statuses","setStatuses","useState","selected","setSelected","get","useFetchClient","query","setQuery","useQueryParams","handleStatusChange","useCallback","name","page","plugins","statusName","toLowerCase","useEffect","selectedStatusName","status","find","fetchStatuses","data","allStatusesObject","documentId","error","console","_jsx","Flex","direction","justifyContent","SingleSelect","size","placeholder","info","displayName","value","onChange","map","SingleSelectOption"],"mappings":";;;;;;;AAaA,MAAMA,YAAAA,GAAe,IAAA;IACnB,MAAM,EAAEC,WAAW,EAAE,GAAGC,uCAAAA,EAAAA;AACxB,IAAA,MAAM,CAACC,QAAAA,EAAUC,WAAAA,CAAY,GAAGC,eAAmB,EAAE,CAAA;AACrD,IAAA,MAAM,CAACC,QAAAA,EAAUC,WAAAA,CAAY,GAAGF,cAAAA,CAA6B,EAAA,CAAA;IAC7D,MAAM,EAAEG,GAAG,EAAE,GAAGC,oBAAAA,EAAAA;AAChB,IAAA,MAAM,CAAC,EAAEC,KAAK,EAAE,EAAEC,SAAS,GAAGC,oBAAAA,EAAAA;IAK9B,MAAMC,kBAAAA,GAAqBC,kBACzB,CAACC,IAAAA,GAAAA;QACCJ,QAAAA,CACE;YACEK,IAAAA,EAAM,CAAA;YACNC,OAAAA,EAAS;AACP,gBAAA,GAAGP,MAAMO,OAAO;gBAChB,2BAAA,EAA6B;AAAEC,oBAAAA,UAAAA,EAAYH,KAAKI,WAAW;AAAG;AAChE;AACF,SAAA,EACA,MAAA,EACA,IAAA,CAAA;IAEJ,CAAA,EAEA;AAACT,QAAAA,KAAAA,CAAMO,OAAO;AAAEN,QAAAA;AAAS,KAAA,CAAA;IAG3BS,eAAAA,CAAU,IAAA;AACR,QAAA,MAAMC,qBACJX,KAAAA,CAAMO,OAAO,GAAG,4BAA4B,EAAEC,UAAAA;AAChD,QAAA,IAAI,CAACG,kBAAAA,EAAoB;QACzB,MAAMC,MAAAA,GAASnB,QAAAA,CAASoB,IAAI,CAC1B,CAACD,SAAWA,MAAAA,CAAOP,IAAI,CAACI,WAAW,EAAA,KAAOE,kBAAAA,CAAAA;AAE5C,QAAA,IAAIC,MAAAA,EAAQ;AACVf,YAAAA,WAAAA,CAAYe,OAAOP,IAAI,CAAA;AACzB,QAAA;IACF,CAAA,EAAG;AAACL,QAAAA,KAAAA;AAAOP,QAAAA;AAAS,KAAA,CAAA;IAEpBiB,eAAAA,CAAU,IAAA;QACR,eAAeI,aAAAA,GAAAA;YACb,IAAI;AACF,gBAAA,MAAM,EAAEC,IAAI,EAAE,GAAG,MAAMjB,GAAAA,CAAI,oCAAA,CAAA;AAC3B,gBAAA,MAAMkB,iBAAAA,GAAoB;oBACxBC,UAAAA,EAAY,KAAA;oBACZZ,IAAAA,EAAM;AACR,iBAAA;gBACAX,WAAAA,CAAY;AAACsB,oBAAAA,iBAAAA;AAAsBD,oBAAAA,GAAAA;AAAK,iBAAA,CAAA;AAC1C,YAAA,CAAA,CAAE,OAAOG,KAAAA,EAAO;gBACdC,OAAAA,CAAQD,KAAK,CAAC,0BAAA,EAA4BA,KAAAA,CAAAA;AAC5C,YAAA;AACF,QAAA;AACAJ,QAAAA,aAAAA,EAAAA;IACF,CAAA,EAAG;AAAChB,QAAAA;AAAI,KAAA,CAAA;AAER,IAAA,qBACEsB,cAAA,CAACC,iBAAAA,EAAAA;QAAKC,SAAAA,EAAU,QAAA;QAASC,cAAAA,EAAe,QAAA;AACtC,QAAA,QAAA,gBAAAH,cAAA,CAACI,yBAAAA,EAAAA;YACCC,IAAAA,EAAK,GAAA;AACLC,YAAAA,WAAAA,EAAa,CAAA,EAAGnC,WAAAA,EAAaoC,IAAAA,CAAKC,WAAAA,CAAY,OAAO,CAAC;YACtDC,KAAAA,EAAOjC,QAAAA;YACPkC,QAAAA,EAAU3B,kBAAAA;AAETV,YAAAA,QAAAA,EAAAA,QAAAA,CAASsC,GAAG,CAAC,CAACnB,MAAAA,iBACbQ,cAAA,CAACY,+BAAAA,EAAAA;AAA2CH,oBAAAA,KAAAA,EAAOjB,OAAOP,IAAI;AAC3DO,oBAAAA,QAAAA,EAAAA,MAAAA,CAAOP;AADeO,iBAAAA,EAAAA,MAAAA,CAAOK,UAAU,CAAA;;;AAOpD;;;;"}