@primershop/strapi-plugin-status-manager 0.0.15 → 0.0.17

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 (133) hide show
  1. package/dist/_chunks/HomePage-CYpSKXVE.mjs +2116 -0
  2. package/dist/_chunks/HomePage-CYpSKXVE.mjs.map +1 -0
  3. package/dist/_chunks/HomePage-D9xj2-y8.js +2116 -0
  4. package/dist/_chunks/HomePage-D9xj2-y8.js.map +1 -0
  5. package/dist/_chunks/index-BXToWkDF.js +228 -0
  6. package/dist/_chunks/index-BXToWkDF.js.map +1 -0
  7. package/dist/_chunks/index-CzxwE0pe.mjs +227 -0
  8. package/dist/_chunks/index-CzxwE0pe.mjs.map +1 -0
  9. package/dist/admin/index.js +3 -48
  10. package/dist/admin/index.js.map +1 -1
  11. package/dist/admin/index.mjs +3 -45
  12. package/dist/admin/index.mjs.map +1 -1
  13. package/dist/server/index.js +646 -18
  14. package/dist/server/index.js.map +1 -1
  15. package/dist/server/index.mjs +648 -17
  16. package/dist/server/index.mjs.map +1 -1
  17. package/package.json +9 -5
  18. package/dist/admin/components/Initializer.js +0 -17
  19. package/dist/admin/components/Initializer.js.map +0 -1
  20. package/dist/admin/components/Initializer.mjs +0 -15
  21. package/dist/admin/components/Initializer.mjs.map +0 -1
  22. package/dist/admin/components/PluginIcon.js +0 -9
  23. package/dist/admin/components/PluginIcon.js.map +0 -1
  24. package/dist/admin/components/PluginIcon.mjs +0 -7
  25. package/dist/admin/components/PluginIcon.mjs.map +0 -1
  26. package/dist/admin/components/ProductStatusField.js +0 -104
  27. package/dist/admin/components/ProductStatusField.js.map +0 -1
  28. package/dist/admin/components/ProductStatusField.mjs +0 -102
  29. package/dist/admin/components/ProductStatusField.mjs.map +0 -1
  30. package/dist/admin/components/StatusManager.js +0 -367
  31. package/dist/admin/components/StatusManager.js.map +0 -1
  32. package/dist/admin/components/StatusManager.mjs +0 -365
  33. package/dist/admin/components/StatusManager.mjs.map +0 -1
  34. package/dist/admin/listView/StatusFilter.js +0 -76
  35. package/dist/admin/listView/StatusFilter.js.map +0 -1
  36. package/dist/admin/listView/StatusFilter.mjs +0 -74
  37. package/dist/admin/listView/StatusFilter.mjs.map +0 -1
  38. package/dist/admin/listView/add-status-column-hook.js +0 -34
  39. package/dist/admin/listView/add-status-column-hook.js.map +0 -1
  40. package/dist/admin/listView/add-status-column-hook.mjs +0 -32
  41. package/dist/admin/listView/add-status-column-hook.mjs.map +0 -1
  42. package/dist/admin/listView/status-cell.js +0 -28
  43. package/dist/admin/listView/status-cell.js.map +0 -1
  44. package/dist/admin/listView/status-cell.mjs +0 -26
  45. package/dist/admin/listView/status-cell.mjs.map +0 -1
  46. package/dist/admin/pages/HomePage.js +0 -55
  47. package/dist/admin/pages/HomePage.js.map +0 -1
  48. package/dist/admin/pages/HomePage.mjs +0 -53
  49. package/dist/admin/pages/HomePage.mjs.map +0 -1
  50. package/dist/admin/permissions.js +0 -16
  51. package/dist/admin/permissions.js.map +0 -1
  52. package/dist/admin/permissions.mjs +0 -14
  53. package/dist/admin/permissions.mjs.map +0 -1
  54. package/dist/admin/pluginId.js +0 -6
  55. package/dist/admin/pluginId.js.map +0 -1
  56. package/dist/admin/pluginId.mjs +0 -4
  57. package/dist/admin/pluginId.mjs.map +0 -1
  58. package/dist/server/bootstrap.js +0 -35
  59. package/dist/server/bootstrap.js.map +0 -1
  60. package/dist/server/bootstrap.mjs +0 -33
  61. package/dist/server/bootstrap.mjs.map +0 -1
  62. package/dist/server/content-types/index.js +0 -16
  63. package/dist/server/content-types/index.js.map +0 -1
  64. package/dist/server/content-types/index.mjs +0 -14
  65. package/dist/server/content-types/index.mjs.map +0 -1
  66. package/dist/server/content-types/status-link.js +0 -43
  67. package/dist/server/content-types/status-link.js.map +0 -1
  68. package/dist/server/content-types/status-link.mjs +0 -41
  69. package/dist/server/content-types/status-link.mjs.map +0 -1
  70. package/dist/server/content-types/status.js +0 -50
  71. package/dist/server/content-types/status.js.map +0 -1
  72. package/dist/server/content-types/status.mjs +0 -48
  73. package/dist/server/content-types/status.mjs.map +0 -1
  74. package/dist/server/controllers/content.js +0 -33
  75. package/dist/server/controllers/content.js.map +0 -1
  76. package/dist/server/controllers/content.mjs +0 -31
  77. package/dist/server/controllers/content.mjs.map +0 -1
  78. package/dist/server/controllers/index.js +0 -12
  79. package/dist/server/controllers/index.js.map +0 -1
  80. package/dist/server/controllers/index.mjs +0 -10
  81. package/dist/server/controllers/index.mjs.map +0 -1
  82. package/dist/server/controllers/status.js +0 -106
  83. package/dist/server/controllers/status.js.map +0 -1
  84. package/dist/server/controllers/status.mjs +0 -104
  85. package/dist/server/controllers/status.mjs.map +0 -1
  86. package/dist/server/middlewares/add-status-field.js +0 -48
  87. package/dist/server/middlewares/add-status-field.js.map +0 -1
  88. package/dist/server/middlewares/add-status-field.mjs +0 -46
  89. package/dist/server/middlewares/add-status-field.mjs.map +0 -1
  90. package/dist/server/middlewares/filter-by-status.js +0 -42
  91. package/dist/server/middlewares/filter-by-status.js.map +0 -1
  92. package/dist/server/middlewares/filter-by-status.mjs +0 -40
  93. package/dist/server/middlewares/filter-by-status.mjs.map +0 -1
  94. package/dist/server/middlewares/filter-published.js +0 -35
  95. package/dist/server/middlewares/filter-published.js.map +0 -1
  96. package/dist/server/middlewares/filter-published.mjs +0 -33
  97. package/dist/server/middlewares/filter-published.mjs.map +0 -1
  98. package/dist/server/permissions.js +0 -51
  99. package/dist/server/permissions.js.map +0 -1
  100. package/dist/server/permissions.mjs +0 -49
  101. package/dist/server/permissions.mjs.map +0 -1
  102. package/dist/server/pluginId.js +0 -6
  103. package/dist/server/pluginId.js.map +0 -1
  104. package/dist/server/pluginId.mjs +0 -4
  105. package/dist/server/pluginId.mjs.map +0 -1
  106. package/dist/server/register.js +0 -20
  107. package/dist/server/register.js.map +0 -1
  108. package/dist/server/register.mjs +0 -18
  109. package/dist/server/register.mjs.map +0 -1
  110. package/dist/server/routes/content-management.js +0 -41
  111. package/dist/server/routes/content-management.js.map +0 -1
  112. package/dist/server/routes/content-management.mjs +0 -39
  113. package/dist/server/routes/content-management.mjs.map +0 -1
  114. package/dist/server/routes/index.js +0 -17
  115. package/dist/server/routes/index.js.map +0 -1
  116. package/dist/server/routes/index.mjs +0 -15
  117. package/dist/server/routes/index.mjs.map +0 -1
  118. package/dist/server/routes/status-management.js +0 -122
  119. package/dist/server/routes/status-management.js.map +0 -1
  120. package/dist/server/routes/status-management.mjs +0 -120
  121. package/dist/server/routes/status-management.mjs.map +0 -1
  122. package/dist/server/services/index.js +0 -12
  123. package/dist/server/services/index.js.map +0 -1
  124. package/dist/server/services/index.mjs +0 -10
  125. package/dist/server/services/index.mjs.map +0 -1
  126. package/dist/server/services/status-link.js +0 -38
  127. package/dist/server/services/status-link.js.map +0 -1
  128. package/dist/server/services/status-link.mjs +0 -36
  129. package/dist/server/services/status-link.mjs.map +0 -1
  130. package/dist/server/services/status.js +0 -110
  131. package/dist/server/services/status.js.map +0 -1
  132. package/dist/server/services/status.mjs +0 -108
  133. package/dist/server/services/status.mjs.map +0 -1
@@ -1,367 +0,0 @@
1
- 'use strict';
2
-
3
- var jsxRuntime = require('react/jsx-runtime');
4
- var React = require('react');
5
- var combine = require('@atlaskit/pragmatic-drag-and-drop/combine');
6
- var adapter = require('@atlaskit/pragmatic-drag-and-drop/element/adapter');
7
- var pointerOutsideOfPreview = require('@atlaskit/pragmatic-drag-and-drop/element/pointer-outside-of-preview');
8
- var setCustomNativeDragPreview = require('@atlaskit/pragmatic-drag-and-drop/element/set-custom-native-drag-preview');
9
- var reorder = require('@atlaskit/pragmatic-drag-and-drop/reorder');
10
- var closestEdge = require('@atlaskit/pragmatic-drag-and-drop-hitbox/closest-edge');
11
- var designSystem = require('@strapi/design-system');
12
- var icons = require('@strapi/icons');
13
- var admin = require('@strapi/strapi/admin');
14
-
15
- const StatusManager = ()=>{
16
- const [statuses, setStatuses] = React.useState([]);
17
- const [newStatus, setNewStatus] = React.useState("");
18
- const [statusToDelete, setStatusToDelete] = React.useState(null);
19
- const [replacementStatus, setReplacementStatus] = React.useState("");
20
- const { get, post, put } = admin.useFetchClient();
21
- const [instanceId] = React.useState(()=>Symbol("instance-id"));
22
- // Fetch statuses
23
- React.useEffect(()=>{
24
- const loadStatuses = async ()=>{
25
- const { data } = await get("primershop-status-manager/statuses");
26
- setStatuses(data);
27
- };
28
- loadStatuses();
29
- }, [
30
- get
31
- ]);
32
- // Validate input (Latin characters only)
33
- const validateInput = (value)=>/^[a-zA-Z\s]+$/.test(value);
34
- // Add new status
35
- const addStatus = async ()=>{
36
- if (!newStatus || !validateInput(newStatus)) return alert("Only Latin characters allowed!");
37
- try {
38
- const { data } = await post("primershop-status-manager/status", {
39
- name: newStatus,
40
- published: false
41
- });
42
- setStatuses([
43
- ...statuses,
44
- data
45
- ]);
46
- setNewStatus("");
47
- } catch (error) {
48
- console.error("Error creating status:", error);
49
- }
50
- };
51
- const reorderItem = React.useCallback(async ({ startIndex, indexOfTarget, closestEdgeOfTarget })=>{
52
- // Calculate the final index based on the target position and edge
53
- let finishIndex = indexOfTarget;
54
- if (closestEdgeOfTarget === "bottom") {
55
- finishIndex = indexOfTarget + 1;
56
- }
57
- // If moving an item down, we need to adjust for the removed item
58
- if (startIndex < finishIndex) {
59
- finishIndex--;
60
- }
61
- if (finishIndex === startIndex) {
62
- return;
63
- }
64
- const reordered = reorder.reorder({
65
- list: statuses,
66
- startIndex,
67
- finishIndex
68
- });
69
- // Send new order to API
70
- const orderedIds = reordered.map((status, index)=>({
71
- documentId: status.documentId,
72
- order: index
73
- }));
74
- await put("/primershop-status-manager/statuses/reorder", {
75
- statuses: orderedIds
76
- });
77
- setStatuses(reordered);
78
- }, [
79
- statuses,
80
- put
81
- ]);
82
- // Setup drag and drop
83
- React.useEffect(()=>{
84
- const statusElements = document.querySelectorAll("[data-status-id]");
85
- const cleanupFunctions = [];
86
- statusElements.forEach((element)=>{
87
- const statusId = element.getAttribute("data-status-id");
88
- const index = statuses.findIndex((s)=>s.documentId === statusId);
89
- const dragHandle = element.querySelector("[data-drag-handle]");
90
- if (!dragHandle) return;
91
- // Setup draggable
92
- const draggableCleanup = adapter.draggable({
93
- element: dragHandle,
94
- getInitialData: ()=>({
95
- statusId,
96
- index,
97
- instanceId
98
- }),
99
- onGenerateDragPreview ({ nativeSetDragImage }) {
100
- setCustomNativeDragPreview.setCustomNativeDragPreview({
101
- nativeSetDragImage,
102
- getOffset: pointerOutsideOfPreview.pointerOutsideOfPreview({
103
- x: "16px",
104
- y: "8px"
105
- }),
106
- render ({ container }) {
107
- const preview = document.createElement("div");
108
- preview.style.padding = "8px 16px";
109
- preview.style.backgroundColor = "#fff";
110
- preview.style.border = "1px solid #ccc";
111
- preview.style.borderRadius = "4px";
112
- preview.style.boxShadow = "0 2px 4px rgba(0,0,0,0.1)";
113
- const statusNameElement = element.querySelector("[data-status-name]");
114
- preview.textContent = statusNameElement?.textContent || "";
115
- container.appendChild(preview);
116
- return ()=>container.removeChild(preview);
117
- }
118
- });
119
- }
120
- });
121
- // Setup drop target
122
- const dropTargetCleanup = adapter.dropTargetForElements({
123
- element: element,
124
- canDrop: ({ source })=>source.data.instanceId === instanceId,
125
- getData ({ input }) {
126
- return closestEdge.attachClosestEdge({
127
- statusId,
128
- index,
129
- instanceId
130
- }, {
131
- element,
132
- input,
133
- allowedEdges: [
134
- "top",
135
- "bottom"
136
- ]
137
- });
138
- },
139
- onDrag ({ source, self }) {
140
- const isSource = source.element === dragHandle;
141
- if (isSource) return;
142
- const closestEdge$1 = closestEdge.extractClosestEdge(self.data);
143
- const sourceIndex = Number(source.data.index);
144
- const isItemBeforeSource = index === sourceIndex - 1;
145
- const isItemAfterSource = index === sourceIndex + 1;
146
- const isDropIndicatorHidden = isItemBeforeSource && closestEdge$1 === "bottom" || isItemAfterSource && closestEdge$1 === "top";
147
- if (isDropIndicatorHidden) return;
148
- // Add visual feedback for drop target
149
- element.style.background = `linear-gradient(${closestEdge$1 === "top" ? 180 : 0}deg, rgba(136,131,214,0.4) 0%, rgba(255,255,255,0) 50%)`;
150
- },
151
- onDragLeave () {
152
- element.style.background = "";
153
- },
154
- onDrop ({ source, self }) {
155
- element.style.background = "";
156
- const sourceData = source.data;
157
- const targetData = self.data;
158
- const indexOfTarget = statuses.findIndex((s)=>s.documentId === targetData.statusId);
159
- if (indexOfTarget < 0) return;
160
- const closestEdgeOfTarget = closestEdge.extractClosestEdge(targetData);
161
- reorderItem({
162
- startIndex: sourceData.index,
163
- indexOfTarget,
164
- closestEdgeOfTarget
165
- });
166
- }
167
- });
168
- // Combine cleanup functions
169
- const combinedCleanup = combine.combine(draggableCleanup, dropTargetCleanup);
170
- cleanupFunctions.push(combinedCleanup);
171
- });
172
- // Monitor for drops
173
- const monitorCleanup = adapter.monitorForElements({
174
- canMonitor: ({ source })=>source.data.instanceId === instanceId,
175
- onDrop ({ location, source }) {
176
- const target = location.current.dropTargets[0];
177
- if (!target) return;
178
- const sourceData = source.data;
179
- const targetData = target.data;
180
- const indexOfTarget = statuses.findIndex((s)=>s.documentId === targetData.statusId);
181
- if (indexOfTarget < 0) return;
182
- const closestEdgeOfTarget = closestEdge.extractClosestEdge(targetData);
183
- reorderItem({
184
- startIndex: sourceData.index,
185
- indexOfTarget,
186
- closestEdgeOfTarget
187
- });
188
- }
189
- });
190
- // Cleanup function
191
- return ()=>{
192
- cleanupFunctions.forEach((cleanup)=>cleanup());
193
- monitorCleanup();
194
- };
195
- }, [
196
- statuses,
197
- reorderItem,
198
- instanceId
199
- ]);
200
- // Open delete dialog
201
- const confirmDelete = (status)=>{
202
- setStatusToDelete(status);
203
- };
204
- // Delete status and replace with selected one
205
- const deleteStatus = async ()=>{
206
- if (!replacementStatus) return alert("Select a replacement status!");
207
- const replacementStatusObj = statuses.find((s)=>s.name === replacementStatus);
208
- if (!replacementStatusObj) return alert("Replacement status not found!");
209
- try {
210
- await put("/primershop-status-manager/statuses/delete", {
211
- statusId: statusToDelete?.documentId,
212
- replacementId: replacementStatusObj.documentId
213
- });
214
- // Remove the deleted status from the list
215
- setStatuses(statuses.filter((s)=>s.documentId !== statusToDelete?.documentId));
216
- setStatusToDelete(null);
217
- setReplacementStatus("");
218
- } catch (error) {
219
- console.error("Error deleting status:", error);
220
- }
221
- };
222
- // Toggle publish status
223
- const togglePublish = async (id, published)=>{
224
- try {
225
- await put(`/primershop-status-manager/statuses/${id}`, {
226
- published: !published
227
- });
228
- setStatuses(statuses.map((s)=>s.documentId === id ? {
229
- ...s,
230
- published: !published
231
- } : s));
232
- } catch (error) {
233
- console.error("Error toggling publish status:", error);
234
- }
235
- };
236
- return /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Box, {
237
- padding: 4,
238
- children: [
239
- /*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
240
- variant: "beta",
241
- children: "Status Manager"
242
- }),
243
- /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Flex, {
244
- marginTop: 4,
245
- gap: 2,
246
- children: [
247
- /*#__PURE__*/ jsxRuntime.jsx(designSystem.TextInput, {
248
- placeholder: "Enter a status...",
249
- value: newStatus,
250
- onChange: (e)=>setNewStatus(e.target.value)
251
- }),
252
- /*#__PURE__*/ jsxRuntime.jsx(designSystem.Button, {
253
- onClick: addStatus,
254
- startIcon: /*#__PURE__*/ jsxRuntime.jsx(icons.Plus, {}),
255
- children: "Add Status"
256
- })
257
- ]
258
- }),
259
- /*#__PURE__*/ jsxRuntime.jsx(designSystem.Box, {
260
- marginTop: 4,
261
- children: statuses.map((status)=>/*#__PURE__*/ jsxRuntime.jsxs(designSystem.Flex, {
262
- "data-status-id": status.documentId,
263
- alignItems: "center",
264
- gap: 2,
265
- marginBottom: 2,
266
- paddingBottom: 2,
267
- style: {
268
- borderBottom: `1px solid gray`,
269
- minWidth: 300,
270
- userSelect: "none",
271
- touchAction: "none"
272
- },
273
- children: [
274
- /*#__PURE__*/ jsxRuntime.jsx(designSystem.Box, {
275
- "data-drag-handle": true,
276
- style: {
277
- cursor: "grab",
278
- padding: "4px",
279
- display: "flex",
280
- alignItems: "center"
281
- },
282
- children: /*#__PURE__*/ jsxRuntime.jsx(icons.Drag, {})
283
- }, `dragHandle-${status.documentId}`),
284
- /*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
285
- variant: "sigma",
286
- style: {
287
- display: "inline-block",
288
- marginRight: "auto"
289
- },
290
- "data-status-name": true,
291
- children: status.name
292
- }),
293
- /*#__PURE__*/ jsxRuntime.jsx(designSystem.Button, {
294
- variant: status.published ? "success-light" : "secondary",
295
- onClick: ()=>togglePublish(status.documentId, status.published),
296
- children: status.published ? "Published" : "Unpublished"
297
- }),
298
- /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Dialog.Root, {
299
- onOpenChange: ()=>confirmDelete(status),
300
- children: [
301
- /*#__PURE__*/ jsxRuntime.jsx(designSystem.Dialog.Trigger, {
302
- children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Button, {
303
- variant: "tertiary",
304
- startIcon: /*#__PURE__*/ jsxRuntime.jsx(icons.Trash, {}),
305
- children: "Delete"
306
- })
307
- }),
308
- /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Dialog.Content, {
309
- children: [
310
- /*#__PURE__*/ jsxRuntime.jsx(designSystem.Dialog.Header, {
311
- children: "Delete status"
312
- }),
313
- statuses.length > 1 && statusToDelete && /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Dialog.Body, {
314
- children: [
315
- /*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
316
- children: "Choose a replacement status before deleting:"
317
- }),
318
- /*#__PURE__*/ jsxRuntime.jsx(designSystem.SingleSelect, {
319
- onChange: (value)=>setReplacementStatus(value),
320
- placeholder: "Select replacement",
321
- children: statuses.filter((s)=>s.documentId !== statusToDelete.documentId).map((s)=>/*#__PURE__*/ jsxRuntime.jsx(designSystem.SingleSelectOption, {
322
- value: s.name,
323
- children: s.name
324
- }, `statusChoice-${s.documentId}`))
325
- }),
326
- replacementStatus && /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Typography, {
327
- children: [
328
- "Replacing ",
329
- statusToDelete.name,
330
- " with ",
331
- replacementStatus
332
- ]
333
- })
334
- ]
335
- }),
336
- /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Dialog.Footer, {
337
- children: [
338
- /*#__PURE__*/ jsxRuntime.jsx(designSystem.Dialog.Cancel, {
339
- children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Button, {
340
- fullWidth: true,
341
- variant: "tertiary",
342
- children: "Cancel"
343
- })
344
- }),
345
- /*#__PURE__*/ jsxRuntime.jsx(designSystem.Dialog.Action, {
346
- children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Button, {
347
- fullWidth: true,
348
- variant: "danger-light",
349
- onClick: deleteStatus,
350
- children: "Yes, delete"
351
- })
352
- })
353
- ]
354
- })
355
- ]
356
- })
357
- ]
358
- })
359
- ]
360
- }, `status-${status.documentId}`))
361
- }, statuses.length)
362
- ]
363
- });
364
- };
365
-
366
- exports.StatusManager = StatusManager;
367
- //# sourceMappingURL=StatusManager.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"StatusManager.js","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":"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"}