@primershop/strapi-plugin-status-manager 0.0.7 → 0.0.8

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.
@@ -0,0 +1,279 @@
1
+ import React, { useRef, useEffect, useState, useCallback } from 'react';
2
+ import { jsx, jsxs } from 'react/jsx-runtime';
3
+ import { CheckCircle } from '@strapi/icons';
4
+ import { Flex, Box, Typography, SingleSelect, SingleSelectOption } from '@strapi/design-system';
5
+ import { unstable_useContentManagerContext, useFetchClient, useQueryParams } from '@strapi/strapi/admin';
6
+
7
+ const PLUGIN_ID = "primershop-status-manager";
8
+
9
+ /**
10
+ * @type {import('react').FC<{ setPlugin: (id: string) => void }>}
11
+ */ const Initializer = ({ setPlugin })=>{
12
+ const ref = useRef(setPlugin);
13
+ useEffect(()=>{
14
+ ref.current(PLUGIN_ID);
15
+ }, []);
16
+ return null;
17
+ };
18
+
19
+ const PluginIcon = ()=>/*#__PURE__*/ jsx(CheckCircle, {});
20
+
21
+ const ProductStatusField = ()=>{
22
+ const { contentType, id } = unstable_useContentManagerContext();
23
+ const [statuses, setStatuses] = useState([]);
24
+ const [currentStatus, setCurrentStatus] = useState("");
25
+ const [message, setMessage] = useState("");
26
+ const { get, put } = useFetchClient();
27
+ const handleStatusChange = useCallback(async (newStatus)=>{
28
+ if (!id) {
29
+ setMessage("Save the product first and then change the status");
30
+ return;
31
+ }
32
+ try {
33
+ await put(`primershop-status-manager/content-status`, {
34
+ contentTypeUid: "api::product.product",
35
+ contentDocumentId: id,
36
+ statusId: statuses.find((status)=>status.name === newStatus)?.documentId
37
+ });
38
+ setMessage(`Status updated ${currentStatus ? `from ${currentStatus}` : ""} to ${newStatus}`);
39
+ setCurrentStatus(newStatus || "");
40
+ } catch (error) {
41
+ setMessage("Error updating status");
42
+ console.error("Error updating status:", error);
43
+ }
44
+ }, [
45
+ id,
46
+ statuses,
47
+ currentStatus,
48
+ put
49
+ ]);
50
+ useEffect(()=>{
51
+ async function fetchCurrentStatus() {
52
+ try {
53
+ const { data: productData } = await get(`primershop-status-manager/content-status?contentDocumentId=${id}&contentTypeUid=api::product.product`);
54
+ const status = productData?.status;
55
+ if (status && status.name) return setCurrentStatus(status.name);
56
+ if (statuses.length) return handleStatusChange(statuses[0].name);
57
+ } catch (error) {
58
+ console.error("Error fetching product status:", error);
59
+ }
60
+ }
61
+ if (id && !currentStatus.length) fetchCurrentStatus();
62
+ if (!id && statuses.length) setCurrentStatus(statuses[0].name);
63
+ }, [
64
+ id,
65
+ statuses,
66
+ get
67
+ ]);
68
+ useEffect(()=>{
69
+ async function fetchStatuses() {
70
+ try {
71
+ const { data } = await get("primershop-status-manager/statuses");
72
+ setStatuses(data);
73
+ } catch (error) {
74
+ console.error("Error fetching statuses:", error);
75
+ }
76
+ }
77
+ fetchStatuses();
78
+ }, [
79
+ get
80
+ ]);
81
+ return /*#__PURE__*/ jsxs(Flex, {
82
+ direction: "column",
83
+ justifyContent: "center",
84
+ alignItems: "stretch",
85
+ width: "100%",
86
+ children: [
87
+ /*#__PURE__*/ jsx(Box, {
88
+ padding: 2,
89
+ children: /*#__PURE__*/ jsxs(Typography, {
90
+ variant: "sigma",
91
+ children: [
92
+ contentType?.info.displayName,
93
+ " status"
94
+ ]
95
+ })
96
+ }),
97
+ /*#__PURE__*/ jsx(SingleSelect, {
98
+ placeholder: currentStatus,
99
+ onChange: handleStatusChange,
100
+ children: statuses.map((status)=>/*#__PURE__*/ jsx(SingleSelectOption, {
101
+ value: status.name,
102
+ children: status.name
103
+ }, status.documentId))
104
+ }),
105
+ /*#__PURE__*/ jsx(Box, {
106
+ padding: 2,
107
+ children: /*#__PURE__*/ jsx(Typography, {
108
+ variant: "sigma",
109
+ children: message
110
+ })
111
+ })
112
+ ]
113
+ });
114
+ };
115
+
116
+ const StatusCell = ({ row })=>{
117
+ const [status, setStatus] = useState(null);
118
+ useEffect(()=>{
119
+ setStatus(row.statusField);
120
+ }, [
121
+ row
122
+ ]);
123
+ if (!status) return null;
124
+ return /*#__PURE__*/ jsx("span", {
125
+ style: {
126
+ padding: "4px 8px",
127
+ borderRadius: 4,
128
+ background: status.published ? "#eafbe7" : "#f0f0ff",
129
+ color: status.published ? "#2f6846" : "#271fe0",
130
+ border: `1px solid ${status.published ? "#2f6846" : "#271fe0"}`,
131
+ fontSize: 14
132
+ },
133
+ children: status.name
134
+ });
135
+ };
136
+
137
+ const addStatusColumnHook = ({ displayedHeaders, layout })=>{
138
+ const statusHeader = {
139
+ attribute: {
140
+ type: "custom"
141
+ },
142
+ name: "statusLabel",
143
+ label: {
144
+ id: "primershop-status-manager.status",
145
+ defaultMessage: "Status"
146
+ },
147
+ searchable: false,
148
+ sortable: false,
149
+ cellFormatter: (row)=>{
150
+ return React.createElement(StatusCell, {
151
+ row
152
+ });
153
+ }
154
+ };
155
+ return {
156
+ displayedHeaders: [
157
+ ...displayedHeaders,
158
+ statusHeader
159
+ ],
160
+ layout
161
+ };
162
+ };
163
+
164
+ /**
165
+ * Admin permission actions for use in addMenuLink, Page.Protect, and useRBAC.
166
+ * Action IDs must match uids registered in server bootstrap (registerMany).
167
+ */ const pluginPermissions = {
168
+ accessStatusManager: [
169
+ {
170
+ action: "plugin::primershop-status-manager.main",
171
+ subject: null
172
+ }
173
+ ]
174
+ };
175
+
176
+ const StatusFilter = ()=>{
177
+ const { contentType } = unstable_useContentManagerContext();
178
+ const [statuses, setStatuses] = useState([]);
179
+ const [selected, setSelected] = useState("");
180
+ const { get } = useFetchClient();
181
+ const [{ query }, setQuery] = useQueryParams();
182
+ const handleStatusChange = useCallback((name)=>{
183
+ setQuery({
184
+ page: 1,
185
+ plugins: {
186
+ ...query.plugins,
187
+ "primershop-status-manager": {
188
+ statusName: name.toLowerCase()
189
+ }
190
+ }
191
+ }, "push", true);
192
+ }, [
193
+ query.plugins,
194
+ setQuery
195
+ ]);
196
+ useEffect(()=>{
197
+ const selectedStatusName = query.plugins?.["primershop-status-manager"]?.statusName;
198
+ if (!selectedStatusName) return;
199
+ const status = statuses.find((status)=>status.name.toLowerCase() === selectedStatusName);
200
+ if (status) {
201
+ setSelected(status.name);
202
+ }
203
+ }, [
204
+ query,
205
+ statuses
206
+ ]);
207
+ useEffect(()=>{
208
+ async function fetchStatuses() {
209
+ try {
210
+ const { data } = await get("primershop-status-manager/statuses");
211
+ const allStatusesObject = {
212
+ documentId: "all",
213
+ name: "All"
214
+ };
215
+ setStatuses([
216
+ allStatusesObject,
217
+ ...data
218
+ ]);
219
+ } catch (error) {
220
+ console.error("Error fetching statuses:", error);
221
+ }
222
+ }
223
+ fetchStatuses();
224
+ }, [
225
+ get
226
+ ]);
227
+ return /*#__PURE__*/ jsx(Flex, {
228
+ direction: "column",
229
+ justifyContent: "center",
230
+ children: /*#__PURE__*/ jsx(SingleSelect, {
231
+ size: "S",
232
+ placeholder: `${contentType?.info.displayName} status`,
233
+ value: selected,
234
+ onChange: handleStatusChange,
235
+ children: statuses.map((status)=>/*#__PURE__*/ jsx(SingleSelectOption, {
236
+ value: status.name,
237
+ children: status.name
238
+ }, status.documentId))
239
+ })
240
+ });
241
+ };
242
+
243
+ const plugin = {
244
+ register (app) {
245
+ app.registerPlugin({
246
+ id: PLUGIN_ID,
247
+ initializer: Initializer,
248
+ isReady: true,
249
+ name: PLUGIN_ID
250
+ });
251
+ app.addMenuLink({
252
+ to: `plugins/${PLUGIN_ID}`,
253
+ icon: PluginIcon,
254
+ intlLabel: {
255
+ id: `${PLUGIN_ID}.plugin.name`,
256
+ defaultMessage: "Status manager"
257
+ },
258
+ permissions: pluginPermissions.accessStatusManager,
259
+ Component: ()=>import('./HomePage-C4rwBBWf.mjs').then((module)=>({
260
+ default: module.HomePage
261
+ }))
262
+ });
263
+ },
264
+ bootstrap (app) {
265
+ app.getPlugin("content-manager").injectComponent("editView", "right-links", {
266
+ name: "Status",
267
+ Component: ProductStatusField
268
+ });
269
+ app.registerHook('Admin/CM/pages/ListView/inject-column-in-table', addStatusColumnHook);
270
+ const contentManager = app.getPlugin('content-manager');
271
+ contentManager.injectComponent('listView', 'actions', {
272
+ name: 'status-filter',
273
+ Component: StatusFilter
274
+ });
275
+ }
276
+ };
277
+
278
+ export { plugin as a, pluginPermissions as p };
279
+ //# sourceMappingURL=index-BaesChab.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-BaesChab.mjs","sources":["../../admin/src/pluginId.ts","../../admin/src/components/Initializer.tsx","../../admin/src/components/PluginIcon.tsx","../../admin/src/components/ProductStatusField.tsx","../../admin/src/listView/status-cell.tsx","../../admin/src/listView/add-status-column-hook.ts","../../admin/src/permissions.ts","../../admin/src/listView/StatusFilter.tsx","../../admin/src/index.ts"],"sourcesContent":["export const PLUGIN_ID = \"primershop-status-manager\";\r\n","import { useEffect, useRef } from \"react\";\r\n\r\nimport { PLUGIN_ID } from \"../pluginId\";\r\n\r\n/**\r\n * @type {import('react').FC<{ setPlugin: (id: string) => void }>}\r\n */\r\nconst Initializer = ({ setPlugin }: { setPlugin: (id: string) => void }) => {\r\n const ref = useRef(setPlugin);\r\n\r\n useEffect(() => {\r\n ref.current(PLUGIN_ID);\r\n }, []);\r\n\r\n return null;\r\n};\r\n\r\nexport { Initializer };\r\n","import { CheckCircle } from \"@strapi/icons\";\r\n\r\nconst PluginIcon = () => <CheckCircle />;\r\n\r\nexport { PluginIcon };\r\n","import React, { useEffect, useState, useCallback } from \"react\";\r\n\r\nimport {\r\n SingleSelect,\r\n SingleSelectOption,\r\n Box,\r\n Typography,\r\n Flex,\r\n} from \"@strapi/design-system\";\r\nimport {\r\n useFetchClient,\r\n unstable_useContentManagerContext as useContentManagerContext,\r\n} from \"@strapi/strapi/admin\";\r\n\r\ninterface Status {\r\n documentId: string;\r\n name: string;\r\n}\r\n\r\nconst ProductStatusField = () => {\r\n const { contentType, id } = useContentManagerContext();\r\n const [statuses, setStatuses] = useState<Status[]>([]);\r\n const [currentStatus, setCurrentStatus] = useState(\"\");\r\n const [message, setMessage] = useState(\"\");\r\n const { get, put } = useFetchClient();\r\n\r\n const handleStatusChange = useCallback(\r\n async (newStatus: string) => {\r\n if (!id) {\r\n setMessage(\"Save the product first and then change the status\");\r\n return;\r\n }\r\n try {\r\n await put(`primershop-status-manager/content-status`, {\r\n contentTypeUid: \"api::product.product\",\r\n contentDocumentId: id,\r\n statusId: statuses.find((status) => status.name === newStatus)\r\n ?.documentId,\r\n });\r\n setMessage(\r\n `Status updated ${currentStatus ? `from ${currentStatus}` : \"\"} to ${newStatus}`\r\n );\r\n setCurrentStatus(newStatus || \"\");\r\n } catch (error) {\r\n setMessage(\"Error updating status\");\r\n console.error(\"Error updating status:\", error);\r\n }\r\n },\r\n [id, statuses, currentStatus, put]\r\n );\r\n\r\n useEffect(() => {\r\n async function fetchCurrentStatus() {\r\n try {\r\n const { data: productData } = await get(\r\n `primershop-status-manager/content-status?contentDocumentId=${id}&contentTypeUid=api::product.product`\r\n );\r\n const status = productData?.status;\r\n if (status && status.name) return setCurrentStatus(status.name);\r\n if (statuses.length) return handleStatusChange(statuses[0].name);\r\n } catch (error) {\r\n console.error(\"Error fetching product status:\", error);\r\n }\r\n }\r\n if (id && !currentStatus.length) fetchCurrentStatus();\r\n if (!id && statuses.length) setCurrentStatus(statuses[0].name);\r\n }, [id, statuses, get]);\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 setStatuses(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\r\n direction=\"column\"\r\n justifyContent=\"center\"\r\n alignItems=\"stretch\"\r\n width=\"100%\"\r\n >\r\n <Box padding={2}>\r\n <Typography variant=\"sigma\">\r\n {contentType?.info.displayName} status\r\n </Typography>\r\n </Box>\r\n <SingleSelect placeholder={currentStatus} onChange={handleStatusChange}>\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 <Box padding={2}>\r\n <Typography variant=\"sigma\">{message}</Typography>\r\n </Box>\r\n </Flex>\r\n );\r\n};\r\n\r\nexport { ProductStatusField };\r\n","import { useState, useEffect } from \"react\";\r\n\r\n\r\ntype Status = {\r\n id: number;\r\n name: string;\r\n published: boolean;\r\n order: number;\r\n}\r\n\r\n\r\nexport const StatusCell = ({ row }: { row: any;}) => {\r\n const [status, setStatus] = useState<Status | null>(null);\r\n\r\n useEffect(() => {\r\n setStatus(row.statusField);\r\n }, [row]);\r\n\r\n if (!status) return null;\r\n return (\r\n <span style={{\r\n padding: \"4px 8px\",\r\n borderRadius: 4,\r\n background: status.published ? \"#eafbe7\" : \"#f0f0ff\",\r\n color: status.published ? \"#2f6846\" : \"#271fe0\",\r\n border: `1px solid ${status.published ? \"#2f6846\" : \"#271fe0\"}`,\r\n fontSize: 14,\r\n }}>\r\n {status.name}\r\n </span>\r\n );\r\n};\r\n\r\n\r\n","import { StatusCell } from \"./status-cell\";\r\nimport {\r\n ListFieldLayout,\r\n ListLayout,\r\n} from \"@strapi/content-manager/strapi-admin\";\r\nimport React from \"react\";\r\nimport { AnyDocument } from \"@strapi/types/dist/modules/documents\";\r\n\r\ninterface AddColumnToTableHookArgs {\r\n layout: ListLayout;\r\n displayedHeaders: ListFieldLayout[];\r\n}\r\nexport const addStatusColumnHook = ({\r\n displayedHeaders,\r\n layout,\r\n}: AddColumnToTableHookArgs) => {\r\n const statusHeader = {\r\n attribute: { type: \"custom\" },\r\n name: \"statusLabel\",\r\n label: { id: \"primershop-status-manager.status\", defaultMessage: \"Status\" },\r\n searchable: false,\r\n sortable: false,\r\n cellFormatter: (row: AnyDocument) => {\r\n return React.createElement(StatusCell, { row });\r\n },\r\n };\r\n\r\n return {\r\n displayedHeaders: [...displayedHeaders, statusHeader],\r\n layout,\r\n };\r\n};\r\n","/**\r\n * Admin permission actions for use in addMenuLink, Page.Protect, and useRBAC.\r\n * Action IDs must match uids registered in server bootstrap (registerMany).\r\n */\r\nconst pluginPermissions = {\r\n accessStatusManager: [\r\n {\r\n action: \"plugin::primershop-status-manager.main\",\r\n subject: null,\r\n },\r\n ],\r\n};\r\n\r\nexport default pluginPermissions;\r\n","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","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\nimport pluginPermissions from \"./permissions\";\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: pluginPermissions.accessStatusManager,\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_ID","Initializer","setPlugin","ref","useRef","useEffect","current","PluginIcon","_jsx","CheckCircle","ProductStatusField","contentType","id","useContentManagerContext","statuses","setStatuses","useState","currentStatus","setCurrentStatus","message","setMessage","get","put","useFetchClient","handleStatusChange","useCallback","newStatus","contentTypeUid","contentDocumentId","statusId","find","status","name","documentId","error","console","fetchCurrentStatus","data","productData","length","fetchStatuses","_jsxs","Flex","direction","justifyContent","alignItems","width","Box","padding","Typography","variant","info","displayName","SingleSelect","placeholder","onChange","map","SingleSelectOption","value","StatusCell","row","setStatus","statusField","span","style","borderRadius","background","published","color","border","fontSize","addStatusColumnHook","displayedHeaders","layout","statusHeader","attribute","type","label","defaultMessage","searchable","sortable","cellFormatter","React","createElement","pluginPermissions","accessStatusManager","action","subject","StatusFilter","selected","setSelected","query","setQuery","useQueryParams","page","plugins","statusName","toLowerCase","selectedStatusName","allStatusesObject","size","plugin","register","app","registerPlugin","initializer","isReady","addMenuLink","to","icon","intlLabel","permissions","Component","then","module","default","HomePage","bootstrap","getPlugin","injectComponent","registerHook","contentManager"],"mappings":";;;;;;AAAO,MAAMA,YAAY,2BAAA;;ACIzB;;AAEC,IACD,MAAMC,WAAAA,GAAc,CAAC,EAAEC,SAAS,EAAuC,GAAA;AACrE,IAAA,MAAMC,MAAMC,MAAAA,CAAOF,SAAAA,CAAAA;IAEnBG,SAAAA,CAAU,IAAA;AACRF,QAAAA,GAAAA,CAAIG,OAAO,CAACN,SAAAA,CAAAA;AACd,IAAA,CAAA,EAAG,EAAE,CAAA;IAEL,OAAO,IAAA;AACT,CAAA;;ACbA,MAAMO,UAAAA,GAAa,kBAAMC,GAAA,CAACC,WAAAA,EAAAA,EAAAA,CAAAA;;ACiB1B,MAAMC,kBAAAA,GAAqB,IAAA;AACzB,IAAA,MAAM,EAAEC,WAAW,EAAEC,EAAE,EAAE,GAAGC,iCAAAA,EAAAA;AAC5B,IAAA,MAAM,CAACC,QAAAA,EAAUC,WAAAA,CAAY,GAAGC,SAAmB,EAAE,CAAA;AACrD,IAAA,MAAM,CAACC,aAAAA,EAAeC,gBAAAA,CAAiB,GAAGF,QAAAA,CAAS,EAAA,CAAA;AACnD,IAAA,MAAM,CAACG,OAAAA,EAASC,UAAAA,CAAW,GAAGJ,QAAAA,CAAS,EAAA,CAAA;AACvC,IAAA,MAAM,EAAEK,GAAG,EAAEC,GAAG,EAAE,GAAGC,cAAAA,EAAAA;IAErB,MAAMC,kBAAAA,GAAqBC,YACzB,OAAOC,SAAAA,GAAAA;AACL,QAAA,IAAI,CAACd,EAAAA,EAAI;YACPQ,UAAAA,CAAW,mDAAA,CAAA;AACX,YAAA;AACF,QAAA;QACA,IAAI;AACF,YAAA,MAAME,GAAAA,CAAI,CAAC,wCAAwC,CAAC,EAAE;gBACpDK,cAAAA,EAAgB,sBAAA;gBAChBC,iBAAAA,EAAmBhB,EAAAA;gBACnBiB,QAAAA,EAAUf,QAAAA,CAASgB,IAAI,CAAC,CAACC,SAAWA,MAAAA,CAAOC,IAAI,KAAKN,SAAAA,CAAAA,EAChDO;AACN,aAAA,CAAA;AACAb,YAAAA,UAAAA,CACE,CAAC,eAAe,EAAEH,aAAAA,GAAgB,CAAC,KAAK,EAAEA,aAAAA,CAAAA,CAAe,GAAG,EAAA,CAAG,IAAI,EAAES,SAAAA,CAAAA,CAAW,CAAA;AAElFR,YAAAA,gBAAAA,CAAiBQ,SAAAA,IAAa,EAAA,CAAA;AAChC,QAAA,CAAA,CAAE,OAAOQ,KAAAA,EAAO;YACdd,UAAAA,CAAW,uBAAA,CAAA;YACXe,OAAAA,CAAQD,KAAK,CAAC,wBAAA,EAA0BA,KAAAA,CAAAA;AAC1C,QAAA;IACF,CAAA,EACA;AAACtB,QAAAA,EAAAA;AAAIE,QAAAA,QAAAA;AAAUG,QAAAA,aAAAA;AAAeK,QAAAA;AAAI,KAAA,CAAA;IAGpCjB,SAAAA,CAAU,IAAA;QACR,eAAe+B,kBAAAA,GAAAA;YACb,IAAI;AACF,gBAAA,MAAM,EAAEC,IAAAA,EAAMC,WAAW,EAAE,GAAG,MAAMjB,GAAAA,CAClC,CAAC,2DAA2D,EAAET,EAAAA,CAAG,oCAAoC,CAAC,CAAA;AAExG,gBAAA,MAAMmB,SAASO,WAAAA,EAAaP,MAAAA;AAC5B,gBAAA,IAAIA,UAAUA,MAAAA,CAAOC,IAAI,EAAE,OAAOd,gBAAAA,CAAiBa,OAAOC,IAAI,CAAA;gBAC9D,IAAIlB,QAAAA,CAASyB,MAAM,EAAE,OAAOf,mBAAmBV,QAAQ,CAAC,CAAA,CAAE,CAACkB,IAAI,CAAA;AACjE,YAAA,CAAA,CAAE,OAAOE,KAAAA,EAAO;gBACdC,OAAAA,CAAQD,KAAK,CAAC,gCAAA,EAAkCA,KAAAA,CAAAA;AAClD,YAAA;AACF,QAAA;AACA,QAAA,IAAItB,EAAAA,IAAM,CAACK,aAAAA,CAAcsB,MAAM,EAAEH,kBAAAA,EAAAA;QACjC,IAAI,CAACxB,EAAAA,IAAME,QAAAA,CAASyB,MAAM,EAAErB,iBAAiBJ,QAAQ,CAAC,CAAA,CAAE,CAACkB,IAAI,CAAA;IAC/D,CAAA,EAAG;AAACpB,QAAAA,EAAAA;AAAIE,QAAAA,QAAAA;AAAUO,QAAAA;AAAI,KAAA,CAAA;IAEtBhB,SAAAA,CAAU,IAAA;QACR,eAAemC,aAAAA,GAAAA;YACb,IAAI;AACF,gBAAA,MAAM,EAAEH,IAAI,EAAE,GAAG,MAAMhB,GAAAA,CAAI,oCAAA,CAAA;gBAC3BN,WAAAA,CAAYsB,IAAAA,CAAAA;AACd,YAAA,CAAA,CAAE,OAAOH,KAAAA,EAAO;gBACdC,OAAAA,CAAQD,KAAK,CAAC,0BAAA,EAA4BA,KAAAA,CAAAA;AAC5C,YAAA;AACF,QAAA;AACAM,QAAAA,aAAAA,EAAAA;IACF,CAAA,EAAG;AAACnB,QAAAA;AAAI,KAAA,CAAA;AAER,IAAA,qBACEoB,IAAA,CAACC,IAAAA,EAAAA;QACCC,SAAAA,EAAU,QAAA;QACVC,cAAAA,EAAe,QAAA;QACfC,UAAAA,EAAW,SAAA;QACXC,KAAAA,EAAM,MAAA;;0BAENtC,GAAA,CAACuC,GAAAA,EAAAA;gBAAIC,OAAAA,EAAS,CAAA;AACZ,gBAAA,QAAA,gBAAAP,IAAA,CAACQ,UAAAA,EAAAA;oBAAWC,OAAAA,EAAQ,OAAA;;AACjBvC,wBAAAA,WAAAA,EAAawC,IAAAA,CAAKC,WAAAA;AAAY,wBAAA;;;;0BAGnC5C,GAAA,CAAC6C,YAAAA,EAAAA;gBAAaC,WAAAA,EAAarC,aAAAA;gBAAesC,QAAAA,EAAU/B,kBAAAA;AACjDV,gBAAAA,QAAAA,EAAAA,QAAAA,CAAS0C,GAAG,CAAC,CAACzB,MAAAA,iBACbvB,GAAA,CAACiD,kBAAAA,EAAAA;AAA2CC,wBAAAA,KAAAA,EAAO3B,OAAOC,IAAI;AAC3DD,wBAAAA,QAAAA,EAAAA,MAAAA,CAAOC;AADeD,qBAAAA,EAAAA,MAAAA,CAAOE,UAAU,CAAA;;0BAK9CzB,GAAA,CAACuC,GAAAA,EAAAA;gBAAIC,OAAAA,EAAS,CAAA;AACZ,gBAAA,QAAA,gBAAAxC,GAAA,CAACyC,UAAAA,EAAAA;oBAAWC,OAAAA,EAAQ,OAAA;AAAS/B,oBAAAA,QAAAA,EAAAA;;;;;AAIrC,CAAA;;AC7FO,MAAMwC,UAAAA,GAAa,CAAC,EAAEC,GAAG,EAAgB,GAAA;AAC/C,IAAA,MAAM,CAAC7B,MAAAA,EAAQ8B,SAAAA,CAAU,GAAG7C,QAAAA,CAAwB,IAAA,CAAA;IAEnDX,SAAAA,CAAU,IAAA;AACRwD,QAAAA,SAAAA,CAAUD,IAAIE,WAAW,CAAA;IAC3B,CAAA,EAAG;AAACF,QAAAA;AAAI,KAAA,CAAA;IAER,IAAI,CAAC7B,QAAQ,OAAO,IAAA;AACpB,IAAA,qBACEvB,GAAA,CAACuD,MAAAA,EAAAA;QAAKC,KAAAA,EAAO;YACXhB,OAAAA,EAAS,SAAA;YACTiB,YAAAA,EAAc,CAAA;YACdC,UAAAA,EAAYnC,MAAAA,CAAOoC,SAAS,GAAG,SAAA,GAAY,SAAA;YAC3CC,KAAAA,EAAOrC,MAAAA,CAAOoC,SAAS,GAAG,SAAA,GAAY,SAAA;AACtCE,YAAAA,MAAAA,EAAQ,CAAC,UAAU,EAAEtC,OAAOoC,SAAS,GAAG,YAAY,SAAA,CAAA,CAAW;YAC/DG,QAAAA,EAAU;AACZ,SAAA;AACGvC,QAAAA,QAAAA,EAAAA,MAAAA,CAAOC;;AAGd,CAAA;;ACnBO,MAAMuC,mBAAAA,GAAsB,CAAC,EAClCC,gBAAgB,EAChBC,MAAM,EACmB,GAAA;AACzB,IAAA,MAAMC,YAAAA,GAAe;QACnBC,SAAAA,EAAW;YAAEC,IAAAA,EAAM;AAAS,SAAA;QAC5B5C,IAAAA,EAAM,aAAA;QACN6C,KAAAA,EAAO;YAAEjE,EAAAA,EAAI,kCAAA;YAAoCkE,cAAAA,EAAgB;AAAS,SAAA;QAC1EC,UAAAA,EAAY,KAAA;QACZC,QAAAA,EAAU,KAAA;AACVC,QAAAA,aAAAA,EAAe,CAACrB,GAAAA,GAAAA;YACd,OAAOsB,KAAAA,CAAMC,aAAa,CAACxB,UAAAA,EAAY;AAAEC,gBAAAA;AAAI,aAAA,CAAA;AAC/C,QAAA;AACF,KAAA;IAEA,OAAO;QACLY,gBAAAA,EAAkB;AAAIA,YAAAA,GAAAA,gBAAAA;AAAkBE,YAAAA;AAAa,SAAA;AACrDD,QAAAA;AACF,KAAA;AACF,CAAA;;AC/BA;;;AAGC,UACKW,iBAAAA,GAAoB;IACxBC,mBAAAA,EAAqB;AACnB,QAAA;YACEC,MAAAA,EAAQ,wCAAA;YACRC,OAAAA,EAAS;AACX;AACD;AACH;;ACEA,MAAMC,YAAAA,GAAe,IAAA;IACnB,MAAM,EAAE7E,WAAW,EAAE,GAAGE,iCAAAA,EAAAA;AACxB,IAAA,MAAM,CAACC,QAAAA,EAAUC,WAAAA,CAAY,GAAGC,SAAmB,EAAE,CAAA;AACrD,IAAA,MAAM,CAACyE,QAAAA,EAAUC,WAAAA,CAAY,GAAG1E,QAAAA,CAA6B,EAAA,CAAA;IAC7D,MAAM,EAAEK,GAAG,EAAE,GAAGE,cAAAA,EAAAA;AAChB,IAAA,MAAM,CAAC,EAAEoE,KAAK,EAAE,EAAEC,SAAS,GAAGC,cAAAA,EAAAA;IAK9B,MAAMrE,kBAAAA,GAAqBC,YACzB,CAACO,IAAAA,GAAAA;QACC4D,QAAAA,CACE;YACEE,IAAAA,EAAM,CAAA;YACNC,OAAAA,EAAS;AACP,gBAAA,GAAGJ,MAAMI,OAAO;gBAChB,2BAAA,EAA6B;AAAEC,oBAAAA,UAAAA,EAAYhE,KAAKiE,WAAW;AAAG;AAChE;AACF,SAAA,EACA,MAAA,EACA,IAAA,CAAA;IAEJ,CAAA,EAEA;AAACN,QAAAA,KAAAA,CAAMI,OAAO;AAAEH,QAAAA;AAAS,KAAA,CAAA;IAG3BvF,SAAAA,CAAU,IAAA;AACR,QAAA,MAAM6F,qBACJP,KAAAA,CAAMI,OAAO,GAAG,4BAA4B,EAAEC,UAAAA;AAChD,QAAA,IAAI,CAACE,kBAAAA,EAAoB;QACzB,MAAMnE,MAAAA,GAASjB,QAAAA,CAASgB,IAAI,CAC1B,CAACC,SAAWA,MAAAA,CAAOC,IAAI,CAACiE,WAAW,EAAA,KAAOC,kBAAAA,CAAAA;AAE5C,QAAA,IAAInE,MAAAA,EAAQ;AACV2D,YAAAA,WAAAA,CAAY3D,OAAOC,IAAI,CAAA;AACzB,QAAA;IACF,CAAA,EAAG;AAAC2D,QAAAA,KAAAA;AAAO7E,QAAAA;AAAS,KAAA,CAAA;IAEpBT,SAAAA,CAAU,IAAA;QACR,eAAemC,aAAAA,GAAAA;YACb,IAAI;AACF,gBAAA,MAAM,EAAEH,IAAI,EAAE,GAAG,MAAMhB,GAAAA,CAAI,oCAAA,CAAA;AAC3B,gBAAA,MAAM8E,iBAAAA,GAAoB;oBACxBlE,UAAAA,EAAY,KAAA;oBACZD,IAAAA,EAAM;AACR,iBAAA;gBACAjB,WAAAA,CAAY;AAACoF,oBAAAA,iBAAAA;AAAsB9D,oBAAAA,GAAAA;AAAK,iBAAA,CAAA;AAC1C,YAAA,CAAA,CAAE,OAAOH,KAAAA,EAAO;gBACdC,OAAAA,CAAQD,KAAK,CAAC,0BAAA,EAA4BA,KAAAA,CAAAA;AAC5C,YAAA;AACF,QAAA;AACAM,QAAAA,aAAAA,EAAAA;IACF,CAAA,EAAG;AAACnB,QAAAA;AAAI,KAAA,CAAA;AAER,IAAA,qBACEb,GAAA,CAACkC,IAAAA,EAAAA;QAAKC,SAAAA,EAAU,QAAA;QAASC,cAAAA,EAAe,QAAA;AACtC,QAAA,QAAA,gBAAApC,GAAA,CAAC6C,YAAAA,EAAAA;YACC+C,IAAAA,EAAK,GAAA;AACL9C,YAAAA,WAAAA,EAAa,CAAA,EAAG3C,WAAAA,EAAawC,IAAAA,CAAKC,WAAAA,CAAY,OAAO,CAAC;YACtDM,KAAAA,EAAO+B,QAAAA;YACPlC,QAAAA,EAAU/B,kBAAAA;AAETV,YAAAA,QAAAA,EAAAA,QAAAA,CAAS0C,GAAG,CAAC,CAACzB,MAAAA,iBACbvB,GAAA,CAACiD,kBAAAA,EAAAA;AAA2CC,oBAAAA,KAAAA,EAAO3B,OAAOC,IAAI;AAC3DD,oBAAAA,QAAAA,EAAAA,MAAAA,CAAOC;AADeD,iBAAAA,EAAAA,MAAAA,CAAOE,UAAU,CAAA;;;AAOpD,CAAA;;AC3EA,MAAMoE,MAAAA,GAAS;AACbC,IAAAA,QAAAA,CAAAA,CAASC,GAAc,EAAA;AACrBA,QAAAA,GAAAA,CAAIC,cAAc,CAAC;YACjB5F,EAAAA,EAAIZ,SAAAA;YACJyG,WAAAA,EAAaxG,WAAAA;YACbyG,OAAAA,EAAS,IAAA;YACT1E,IAAAA,EAAMhC;AACR,SAAA,CAAA;AAEAuG,QAAAA,GAAAA,CAAII,WAAW,CAAC;YACdC,EAAAA,EAAI,CAAC,QAAQ,EAAE5G,SAAAA,CAAAA,CAAW;YAC1B6G,IAAAA,EAAMtG,UAAAA;YACNuG,SAAAA,EAAW;gBACTlG,EAAAA,EAAI,CAAA,EAAGZ,SAAAA,CAAU,YAAY,CAAC;gBAC9B8E,cAAAA,EAAgB;AAClB,aAAA;AACAiC,YAAAA,WAAAA,EAAa3B,kBAAkBC,mBAAmB;YAClD2B,SAAAA,EAAW,IACT,OAAO,yBAAA,CAAA,CAAoBC,IAAI,CAAC,CAACC,UAAY;AAC3CC,wBAAAA,OAAAA,EAASD,OAAOE;qBAClB,CAAA;AACJ,SAAA,CAAA;AACF,IAAA,CAAA;AACAC,IAAAA,SAAAA,CAAAA,CAAUd,GAAc,EAAA;AACtBA,QAAAA,GAAAA,CACGe,SAAS,CAAC,iBAAA,CAAA,CACVC,eAAe,CAAC,YAAY,aAAA,EAAe;YAC1CvF,IAAAA,EAAM,QAAA;YACNgF,SAAAA,EAAWtG;AACb,SAAA,CAAA;QAEF6F,GAAAA,CAAIiB,YAAY,CAAC,gDAAA,EAAkDjD,mBAAAA,CAAAA;QAEnE,MAAMkD,cAAAA,GAAiBlB,GAAAA,CAAIe,SAAS,CAAC,iBAAA,CAAA;QACrCG,cAAAA,CAAeF,eAAe,CAAC,UAAA,EAAY,SAAA,EAAW;YACpDvF,IAAAA,EAAM,eAAA;YACNgF,SAAAA,EAAWxB;AACb,SAAA,CAAA;AACF,IAAA;AACF;;;;"}
@@ -0,0 +1,282 @@
1
+ 'use strict';
2
+
3
+ var React = require('react');
4
+ var jsxRuntime = require('react/jsx-runtime');
5
+ var icons = require('@strapi/icons');
6
+ var designSystem = require('@strapi/design-system');
7
+ var admin = require('@strapi/strapi/admin');
8
+
9
+ const PLUGIN_ID = "primershop-status-manager";
10
+
11
+ /**
12
+ * @type {import('react').FC<{ setPlugin: (id: string) => void }>}
13
+ */ const Initializer = ({ setPlugin })=>{
14
+ const ref = React.useRef(setPlugin);
15
+ React.useEffect(()=>{
16
+ ref.current(PLUGIN_ID);
17
+ }, []);
18
+ return null;
19
+ };
20
+
21
+ const PluginIcon = ()=>/*#__PURE__*/ jsxRuntime.jsx(icons.CheckCircle, {});
22
+
23
+ const ProductStatusField = ()=>{
24
+ const { contentType, id } = admin.unstable_useContentManagerContext();
25
+ const [statuses, setStatuses] = React.useState([]);
26
+ const [currentStatus, setCurrentStatus] = React.useState("");
27
+ const [message, setMessage] = React.useState("");
28
+ const { get, put } = admin.useFetchClient();
29
+ const handleStatusChange = React.useCallback(async (newStatus)=>{
30
+ if (!id) {
31
+ setMessage("Save the product first and then change the status");
32
+ return;
33
+ }
34
+ try {
35
+ await put(`primershop-status-manager/content-status`, {
36
+ contentTypeUid: "api::product.product",
37
+ contentDocumentId: id,
38
+ statusId: statuses.find((status)=>status.name === newStatus)?.documentId
39
+ });
40
+ setMessage(`Status updated ${currentStatus ? `from ${currentStatus}` : ""} to ${newStatus}`);
41
+ setCurrentStatus(newStatus || "");
42
+ } catch (error) {
43
+ setMessage("Error updating status");
44
+ console.error("Error updating status:", error);
45
+ }
46
+ }, [
47
+ id,
48
+ statuses,
49
+ currentStatus,
50
+ put
51
+ ]);
52
+ React.useEffect(()=>{
53
+ async function fetchCurrentStatus() {
54
+ try {
55
+ const { data: productData } = await get(`primershop-status-manager/content-status?contentDocumentId=${id}&contentTypeUid=api::product.product`);
56
+ const status = productData?.status;
57
+ if (status && status.name) return setCurrentStatus(status.name);
58
+ if (statuses.length) return handleStatusChange(statuses[0].name);
59
+ } catch (error) {
60
+ console.error("Error fetching product status:", error);
61
+ }
62
+ }
63
+ if (id && !currentStatus.length) fetchCurrentStatus();
64
+ if (!id && statuses.length) setCurrentStatus(statuses[0].name);
65
+ }, [
66
+ id,
67
+ statuses,
68
+ get
69
+ ]);
70
+ React.useEffect(()=>{
71
+ async function fetchStatuses() {
72
+ try {
73
+ const { data } = await get("primershop-status-manager/statuses");
74
+ setStatuses(data);
75
+ } catch (error) {
76
+ console.error("Error fetching statuses:", error);
77
+ }
78
+ }
79
+ fetchStatuses();
80
+ }, [
81
+ get
82
+ ]);
83
+ return /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Flex, {
84
+ direction: "column",
85
+ justifyContent: "center",
86
+ alignItems: "stretch",
87
+ width: "100%",
88
+ children: [
89
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.Box, {
90
+ padding: 2,
91
+ children: /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Typography, {
92
+ variant: "sigma",
93
+ children: [
94
+ contentType?.info.displayName,
95
+ " status"
96
+ ]
97
+ })
98
+ }),
99
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.SingleSelect, {
100
+ placeholder: currentStatus,
101
+ onChange: handleStatusChange,
102
+ children: statuses.map((status)=>/*#__PURE__*/ jsxRuntime.jsx(designSystem.SingleSelectOption, {
103
+ value: status.name,
104
+ children: status.name
105
+ }, status.documentId))
106
+ }),
107
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.Box, {
108
+ padding: 2,
109
+ children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
110
+ variant: "sigma",
111
+ children: message
112
+ })
113
+ })
114
+ ]
115
+ });
116
+ };
117
+
118
+ const StatusCell = ({ row })=>{
119
+ const [status, setStatus] = React.useState(null);
120
+ React.useEffect(()=>{
121
+ setStatus(row.statusField);
122
+ }, [
123
+ row
124
+ ]);
125
+ if (!status) return null;
126
+ return /*#__PURE__*/ jsxRuntime.jsx("span", {
127
+ style: {
128
+ padding: "4px 8px",
129
+ borderRadius: 4,
130
+ background: status.published ? "#eafbe7" : "#f0f0ff",
131
+ color: status.published ? "#2f6846" : "#271fe0",
132
+ border: `1px solid ${status.published ? "#2f6846" : "#271fe0"}`,
133
+ fontSize: 14
134
+ },
135
+ children: status.name
136
+ });
137
+ };
138
+
139
+ const addStatusColumnHook = ({ displayedHeaders, layout })=>{
140
+ const statusHeader = {
141
+ attribute: {
142
+ type: "custom"
143
+ },
144
+ name: "statusLabel",
145
+ label: {
146
+ id: "primershop-status-manager.status",
147
+ defaultMessage: "Status"
148
+ },
149
+ searchable: false,
150
+ sortable: false,
151
+ cellFormatter: (row)=>{
152
+ return React.createElement(StatusCell, {
153
+ row
154
+ });
155
+ }
156
+ };
157
+ return {
158
+ displayedHeaders: [
159
+ ...displayedHeaders,
160
+ statusHeader
161
+ ],
162
+ layout
163
+ };
164
+ };
165
+
166
+ /**
167
+ * Admin permission actions for use in addMenuLink, Page.Protect, and useRBAC.
168
+ * Action IDs must match uids registered in server bootstrap (registerMany).
169
+ */ const pluginPermissions = {
170
+ accessStatusManager: [
171
+ {
172
+ action: "plugin::primershop-status-manager.main",
173
+ subject: null
174
+ }
175
+ ]
176
+ };
177
+
178
+ const StatusFilter = ()=>{
179
+ const { contentType } = admin.unstable_useContentManagerContext();
180
+ const [statuses, setStatuses] = React.useState([]);
181
+ const [selected, setSelected] = React.useState("");
182
+ const { get } = admin.useFetchClient();
183
+ const [{ query }, setQuery] = admin.useQueryParams();
184
+ const handleStatusChange = React.useCallback((name)=>{
185
+ setQuery({
186
+ page: 1,
187
+ plugins: {
188
+ ...query.plugins,
189
+ "primershop-status-manager": {
190
+ statusName: name.toLowerCase()
191
+ }
192
+ }
193
+ }, "push", true);
194
+ }, [
195
+ query.plugins,
196
+ setQuery
197
+ ]);
198
+ React.useEffect(()=>{
199
+ const selectedStatusName = query.plugins?.["primershop-status-manager"]?.statusName;
200
+ if (!selectedStatusName) return;
201
+ const status = statuses.find((status)=>status.name.toLowerCase() === selectedStatusName);
202
+ if (status) {
203
+ setSelected(status.name);
204
+ }
205
+ }, [
206
+ query,
207
+ statuses
208
+ ]);
209
+ React.useEffect(()=>{
210
+ async function fetchStatuses() {
211
+ try {
212
+ const { data } = await get("primershop-status-manager/statuses");
213
+ const allStatusesObject = {
214
+ documentId: "all",
215
+ name: "All"
216
+ };
217
+ setStatuses([
218
+ allStatusesObject,
219
+ ...data
220
+ ]);
221
+ } catch (error) {
222
+ console.error("Error fetching statuses:", error);
223
+ }
224
+ }
225
+ fetchStatuses();
226
+ }, [
227
+ get
228
+ ]);
229
+ return /*#__PURE__*/ jsxRuntime.jsx(designSystem.Flex, {
230
+ direction: "column",
231
+ justifyContent: "center",
232
+ children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.SingleSelect, {
233
+ size: "S",
234
+ placeholder: `${contentType?.info.displayName} status`,
235
+ value: selected,
236
+ onChange: handleStatusChange,
237
+ children: statuses.map((status)=>/*#__PURE__*/ jsxRuntime.jsx(designSystem.SingleSelectOption, {
238
+ value: status.name,
239
+ children: status.name
240
+ }, status.documentId))
241
+ })
242
+ });
243
+ };
244
+
245
+ const plugin = {
246
+ register (app) {
247
+ app.registerPlugin({
248
+ id: PLUGIN_ID,
249
+ initializer: Initializer,
250
+ isReady: true,
251
+ name: PLUGIN_ID
252
+ });
253
+ app.addMenuLink({
254
+ to: `plugins/${PLUGIN_ID}`,
255
+ icon: PluginIcon,
256
+ intlLabel: {
257
+ id: `${PLUGIN_ID}.plugin.name`,
258
+ defaultMessage: "Status manager"
259
+ },
260
+ permissions: pluginPermissions.accessStatusManager,
261
+ Component: ()=>Promise.resolve().then(function () { return require('./HomePage-CgBU0RrT.js'); }).then((module)=>({
262
+ default: module.HomePage
263
+ }))
264
+ });
265
+ },
266
+ bootstrap (app) {
267
+ app.getPlugin("content-manager").injectComponent("editView", "right-links", {
268
+ name: "Status",
269
+ Component: ProductStatusField
270
+ });
271
+ app.registerHook('Admin/CM/pages/ListView/inject-column-in-table', addStatusColumnHook);
272
+ const contentManager = app.getPlugin('content-manager');
273
+ contentManager.injectComponent('listView', 'actions', {
274
+ name: 'status-filter',
275
+ Component: StatusFilter
276
+ });
277
+ }
278
+ };
279
+
280
+ exports.plugin = plugin;
281
+ exports.pluginPermissions = pluginPermissions;
282
+ //# sourceMappingURL=index-C5VrYoqI.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-C5VrYoqI.js","sources":["../../admin/src/pluginId.ts","../../admin/src/components/Initializer.tsx","../../admin/src/components/PluginIcon.tsx","../../admin/src/components/ProductStatusField.tsx","../../admin/src/listView/status-cell.tsx","../../admin/src/listView/add-status-column-hook.ts","../../admin/src/permissions.ts","../../admin/src/listView/StatusFilter.tsx","../../admin/src/index.ts"],"sourcesContent":["export const PLUGIN_ID = \"primershop-status-manager\";\r\n","import { useEffect, useRef } from \"react\";\r\n\r\nimport { PLUGIN_ID } from \"../pluginId\";\r\n\r\n/**\r\n * @type {import('react').FC<{ setPlugin: (id: string) => void }>}\r\n */\r\nconst Initializer = ({ setPlugin }: { setPlugin: (id: string) => void }) => {\r\n const ref = useRef(setPlugin);\r\n\r\n useEffect(() => {\r\n ref.current(PLUGIN_ID);\r\n }, []);\r\n\r\n return null;\r\n};\r\n\r\nexport { Initializer };\r\n","import { CheckCircle } from \"@strapi/icons\";\r\n\r\nconst PluginIcon = () => <CheckCircle />;\r\n\r\nexport { PluginIcon };\r\n","import React, { useEffect, useState, useCallback } from \"react\";\r\n\r\nimport {\r\n SingleSelect,\r\n SingleSelectOption,\r\n Box,\r\n Typography,\r\n Flex,\r\n} from \"@strapi/design-system\";\r\nimport {\r\n useFetchClient,\r\n unstable_useContentManagerContext as useContentManagerContext,\r\n} from \"@strapi/strapi/admin\";\r\n\r\ninterface Status {\r\n documentId: string;\r\n name: string;\r\n}\r\n\r\nconst ProductStatusField = () => {\r\n const { contentType, id } = useContentManagerContext();\r\n const [statuses, setStatuses] = useState<Status[]>([]);\r\n const [currentStatus, setCurrentStatus] = useState(\"\");\r\n const [message, setMessage] = useState(\"\");\r\n const { get, put } = useFetchClient();\r\n\r\n const handleStatusChange = useCallback(\r\n async (newStatus: string) => {\r\n if (!id) {\r\n setMessage(\"Save the product first and then change the status\");\r\n return;\r\n }\r\n try {\r\n await put(`primershop-status-manager/content-status`, {\r\n contentTypeUid: \"api::product.product\",\r\n contentDocumentId: id,\r\n statusId: statuses.find((status) => status.name === newStatus)\r\n ?.documentId,\r\n });\r\n setMessage(\r\n `Status updated ${currentStatus ? `from ${currentStatus}` : \"\"} to ${newStatus}`\r\n );\r\n setCurrentStatus(newStatus || \"\");\r\n } catch (error) {\r\n setMessage(\"Error updating status\");\r\n console.error(\"Error updating status:\", error);\r\n }\r\n },\r\n [id, statuses, currentStatus, put]\r\n );\r\n\r\n useEffect(() => {\r\n async function fetchCurrentStatus() {\r\n try {\r\n const { data: productData } = await get(\r\n `primershop-status-manager/content-status?contentDocumentId=${id}&contentTypeUid=api::product.product`\r\n );\r\n const status = productData?.status;\r\n if (status && status.name) return setCurrentStatus(status.name);\r\n if (statuses.length) return handleStatusChange(statuses[0].name);\r\n } catch (error) {\r\n console.error(\"Error fetching product status:\", error);\r\n }\r\n }\r\n if (id && !currentStatus.length) fetchCurrentStatus();\r\n if (!id && statuses.length) setCurrentStatus(statuses[0].name);\r\n }, [id, statuses, get]);\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 setStatuses(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\r\n direction=\"column\"\r\n justifyContent=\"center\"\r\n alignItems=\"stretch\"\r\n width=\"100%\"\r\n >\r\n <Box padding={2}>\r\n <Typography variant=\"sigma\">\r\n {contentType?.info.displayName} status\r\n </Typography>\r\n </Box>\r\n <SingleSelect placeholder={currentStatus} onChange={handleStatusChange}>\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 <Box padding={2}>\r\n <Typography variant=\"sigma\">{message}</Typography>\r\n </Box>\r\n </Flex>\r\n );\r\n};\r\n\r\nexport { ProductStatusField };\r\n","import { useState, useEffect } from \"react\";\r\n\r\n\r\ntype Status = {\r\n id: number;\r\n name: string;\r\n published: boolean;\r\n order: number;\r\n}\r\n\r\n\r\nexport const StatusCell = ({ row }: { row: any;}) => {\r\n const [status, setStatus] = useState<Status | null>(null);\r\n\r\n useEffect(() => {\r\n setStatus(row.statusField);\r\n }, [row]);\r\n\r\n if (!status) return null;\r\n return (\r\n <span style={{\r\n padding: \"4px 8px\",\r\n borderRadius: 4,\r\n background: status.published ? \"#eafbe7\" : \"#f0f0ff\",\r\n color: status.published ? \"#2f6846\" : \"#271fe0\",\r\n border: `1px solid ${status.published ? \"#2f6846\" : \"#271fe0\"}`,\r\n fontSize: 14,\r\n }}>\r\n {status.name}\r\n </span>\r\n );\r\n};\r\n\r\n\r\n","import { StatusCell } from \"./status-cell\";\r\nimport {\r\n ListFieldLayout,\r\n ListLayout,\r\n} from \"@strapi/content-manager/strapi-admin\";\r\nimport React from \"react\";\r\nimport { AnyDocument } from \"@strapi/types/dist/modules/documents\";\r\n\r\ninterface AddColumnToTableHookArgs {\r\n layout: ListLayout;\r\n displayedHeaders: ListFieldLayout[];\r\n}\r\nexport const addStatusColumnHook = ({\r\n displayedHeaders,\r\n layout,\r\n}: AddColumnToTableHookArgs) => {\r\n const statusHeader = {\r\n attribute: { type: \"custom\" },\r\n name: \"statusLabel\",\r\n label: { id: \"primershop-status-manager.status\", defaultMessage: \"Status\" },\r\n searchable: false,\r\n sortable: false,\r\n cellFormatter: (row: AnyDocument) => {\r\n return React.createElement(StatusCell, { row });\r\n },\r\n };\r\n\r\n return {\r\n displayedHeaders: [...displayedHeaders, statusHeader],\r\n layout,\r\n };\r\n};\r\n","/**\r\n * Admin permission actions for use in addMenuLink, Page.Protect, and useRBAC.\r\n * Action IDs must match uids registered in server bootstrap (registerMany).\r\n */\r\nconst pluginPermissions = {\r\n accessStatusManager: [\r\n {\r\n action: \"plugin::primershop-status-manager.main\",\r\n subject: null,\r\n },\r\n ],\r\n};\r\n\r\nexport default pluginPermissions;\r\n","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","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\nimport pluginPermissions from \"./permissions\";\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: pluginPermissions.accessStatusManager,\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_ID","Initializer","setPlugin","ref","useRef","useEffect","current","PluginIcon","_jsx","CheckCircle","ProductStatusField","contentType","id","useContentManagerContext","statuses","setStatuses","useState","currentStatus","setCurrentStatus","message","setMessage","get","put","useFetchClient","handleStatusChange","useCallback","newStatus","contentTypeUid","contentDocumentId","statusId","find","status","name","documentId","error","console","fetchCurrentStatus","data","productData","length","fetchStatuses","_jsxs","Flex","direction","justifyContent","alignItems","width","Box","padding","Typography","variant","info","displayName","SingleSelect","placeholder","onChange","map","SingleSelectOption","value","StatusCell","row","setStatus","statusField","span","style","borderRadius","background","published","color","border","fontSize","addStatusColumnHook","displayedHeaders","layout","statusHeader","attribute","type","label","defaultMessage","searchable","sortable","cellFormatter","React","createElement","pluginPermissions","accessStatusManager","action","subject","StatusFilter","selected","setSelected","query","setQuery","useQueryParams","page","plugins","statusName","toLowerCase","selectedStatusName","allStatusesObject","size","plugin","register","app","registerPlugin","initializer","isReady","addMenuLink","to","icon","intlLabel","permissions","Component","then","module","default","HomePage","bootstrap","getPlugin","injectComponent","registerHook","contentManager"],"mappings":"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"}