@mattisvensson/strapi-plugin-webatlas 0.4.2 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. package/dist/_chunks/EmptyBox-BM4IscSk.mjs +1 -0
  2. package/dist/_chunks/EmptyBox-BM4IscSk.mjs.map +1 -0
  3. package/dist/_chunks/EmptyBox-T8t29l25.js +1 -0
  4. package/dist/_chunks/EmptyBox-T8t29l25.js.map +1 -0
  5. package/dist/_chunks/FullLoader-Cmsf8xS6.js +1 -0
  6. package/dist/_chunks/FullLoader-Cmsf8xS6.js.map +1 -0
  7. package/dist/_chunks/FullLoader-CrPED_dY.mjs +1 -0
  8. package/dist/_chunks/FullLoader-CrPED_dY.mjs.map +1 -0
  9. package/dist/_chunks/{de-Dn24NwJf.mjs → de-BkirTac9.mjs} +4 -1
  10. package/dist/_chunks/de-BkirTac9.mjs.map +1 -0
  11. package/dist/_chunks/{de-RiCps8UH.js → de-D8LMOTFI.js} +4 -1
  12. package/dist/_chunks/de-D8LMOTFI.js.map +1 -0
  13. package/dist/_chunks/{en-JLW5S3ZC.js → en-BdfmJUs8.js} +4 -1
  14. package/dist/_chunks/en-BdfmJUs8.js.map +1 -0
  15. package/dist/_chunks/{en-D9Lxaugc.mjs → en-DYbDta3m.mjs} +4 -1
  16. package/dist/_chunks/en-DYbDta3m.mjs.map +1 -0
  17. package/dist/_chunks/index-BAN8PGGJ.js +282 -0
  18. package/dist/_chunks/index-BAN8PGGJ.js.map +1 -0
  19. package/dist/_chunks/{index-Clikpy91.js → index-BOvKFOKk.js} +1663 -649
  20. package/dist/_chunks/{index-CiY-8z8F.js → index-BfgRvDzx.js} +1 -1
  21. package/dist/_chunks/index-BxnHHgGC.js +12163 -0
  22. package/dist/_chunks/index-BxnHHgGC.js.map +1 -0
  23. package/dist/_chunks/index-C5ejmUpN.mjs +12163 -0
  24. package/dist/_chunks/index-C5ejmUpN.mjs.map +1 -0
  25. package/dist/_chunks/index-CEt9P4TS.mjs +127 -0
  26. package/dist/_chunks/index-CEt9P4TS.mjs.map +1 -0
  27. package/dist/_chunks/{index-IHvD3566.js → index-CJNR2c7_.js} +1 -1
  28. package/dist/_chunks/{index-CSYue_D0.js → index-CJtLrSxU.js} +6 -6
  29. package/dist/_chunks/{index-B4pe6Yuh.mjs → index-CNfpGKSw.mjs} +1664 -650
  30. package/dist/_chunks/index-Ciae_OgQ.js +4177 -0
  31. package/dist/_chunks/index-Ciae_OgQ.js.map +1 -0
  32. package/dist/_chunks/{index-CtJ_9-RB.mjs → index-Ctq2vsD5.mjs} +6 -6
  33. package/dist/_chunks/index-CuJP8Fy7.mjs +4161 -0
  34. package/dist/_chunks/index-CuJP8Fy7.mjs.map +1 -0
  35. package/dist/_chunks/index-D4tWVnt1.js +127 -0
  36. package/dist/_chunks/index-D4tWVnt1.js.map +1 -0
  37. package/dist/_chunks/{index-CVj7qbwh.mjs → index-DTz7wDR7.mjs} +1 -1
  38. package/dist/_chunks/index-DtFIVZxq.mjs +282 -0
  39. package/dist/_chunks/index-DtFIVZxq.mjs.map +1 -0
  40. package/dist/_chunks/{index-9db80XRS.mjs → index-LAGFB7iO.mjs} +1 -1
  41. package/dist/admin/index.js +2 -1
  42. package/dist/admin/index.js.map +1 -0
  43. package/dist/admin/index.mjs +2 -1
  44. package/dist/admin/index.mjs.map +1 -0
  45. package/dist/admin/src/hooks/useApi.d.ts +1 -1
  46. package/dist/admin/src/pages/Navigation/Page.d.ts +2 -0
  47. package/dist/admin/src/pages/Navigation/index.d.ts +2 -2
  48. package/dist/server/index.js +13 -1
  49. package/dist/server/index.js.map +1 -0
  50. package/dist/server/index.mjs +13 -1
  51. package/dist/server/index.mjs.map +1 -0
  52. package/dist/server/src/index.d.ts +1 -1
  53. package/dist/server/src/services/admin.d.ts +1 -1
  54. package/dist/server/src/services/index.d.ts +1 -1
  55. package/package.json +1 -1
@@ -10,3 +10,4 @@ function EmptyBox({ msg }) {
10
10
  export {
11
11
  EmptyBox as E
12
12
  };
13
+ //# sourceMappingURL=EmptyBox-BM4IscSk.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EmptyBox-BM4IscSk.mjs","sources":["../../admin/src/components/UI/EmptyBox.tsx"],"sourcesContent":["import { EmptyDocuments } from '@strapi/icons/symbols';\nimport { Box, Typography } from '@strapi/design-system';\n\ntype EmptyNavProps = {\n msg: string;\n}\n\nexport default function EmptyBox ({ msg }: EmptyNavProps) {\n\n return (\n <>\n <EmptyDocuments width=\"10rem\" height=\"6rem\"/>\n <Box padding={4}>\n <Typography variant=\"beta\" textColor=\"neutral600\">{msg}</Typography>\n </Box>\n </>\n )\n}"],"names":[],"mappings":";;;AAOwB,SAAA,SAAU,EAAE,OAAsB;AAExD,SAEI,qBAAA,UAAA,EAAA,UAAA;AAAA,IAAA,oBAAC,gBAAe,EAAA,OAAM,SAAQ,QAAO,QAAM;AAAA,IAC3C,oBAAC,KAAI,EAAA,SAAS,GACZ,UAAA,oBAAC,YAAW,EAAA,SAAQ,QAAO,WAAU,cAAc,UAAA,IAAA,CAAI,EACzD,CAAA;AAAA,EAAA,GACF;AAEJ;"}
@@ -9,3 +9,4 @@ function EmptyBox({ msg }) {
9
9
  ] });
10
10
  }
11
11
  exports.EmptyBox = EmptyBox;
12
+ //# sourceMappingURL=EmptyBox-T8t29l25.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EmptyBox-T8t29l25.js","sources":["../../admin/src/components/UI/EmptyBox.tsx"],"sourcesContent":["import { EmptyDocuments } from '@strapi/icons/symbols';\nimport { Box, Typography } from '@strapi/design-system';\n\ntype EmptyNavProps = {\n msg: string;\n}\n\nexport default function EmptyBox ({ msg }: EmptyNavProps) {\n\n return (\n <>\n <EmptyDocuments width=\"10rem\" height=\"6rem\"/>\n <Box padding={4}>\n <Typography variant=\"beta\" textColor=\"neutral600\">{msg}</Typography>\n </Box>\n </>\n )\n}"],"names":["jsxs","Fragment","jsx","EmptyDocuments","Box","Typography"],"mappings":";;;;AAOwB,SAAA,SAAU,EAAE,OAAsB;AAExD,SAEIA,2BAAA,KAAAC,qBAAA,EAAA,UAAA;AAAA,IAAAC,2BAAA,IAACC,QAAe,gBAAA,EAAA,OAAM,SAAQ,QAAO,QAAM;AAAA,IAC3CD,2BAAA,IAACE,aAAI,KAAA,EAAA,SAAS,GACZ,UAAAF,2BAAAA,IAACG,aAAAA,YAAW,EAAA,SAAQ,QAAO,WAAU,cAAc,UAAA,IAAA,CAAI,EACzD,CAAA;AAAA,EAAA,GACF;AAEJ;;"}
@@ -9,3 +9,4 @@ function FullLoader({ height }) {
9
9
  }
10
10
  exports.Center = Center;
11
11
  exports.FullLoader = FullLoader;
12
+ //# sourceMappingURL=FullLoader-Cmsf8xS6.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FullLoader-Cmsf8xS6.js","sources":["../../admin/src/components/UI/Center.tsx","../../admin/src/components/UI/FullLoader.tsx"],"sourcesContent":["import { Flex } from '@strapi/design-system';\n\nexport default function Center({ height = 400, children }: { height?: number, children: React.ReactNode }) {\n\n return (\n <Flex direction=\"column\" minHeight={`${height}px`} justifyContent=\"center\">\n {children}\n </Flex>\n )\n}","import { Loader, Box } from '@strapi/design-system';\nimport Center from './Center';\n\nexport default function FullLoader({ height }: { height?: number }) {\n return (\n <Center height={height}>\n <Loader>Loading...</Loader>\n </Center>\n );\n}"],"names":["jsx","Flex","Loader"],"mappings":";;;AAEA,SAAwB,OAAO,EAAE,SAAS,KAAK,YAA4D;AAGvG,SAAAA,2BAAA,IAACC,aAAK,MAAA,EAAA,WAAU,UAAS,WAAW,GAAG,MAAM,MAAM,gBAAe,UAC/D,SACH,CAAA;AAEJ;ACNwB,SAAA,WAAW,EAAE,UAA+B;AAClE,wCACG,QAAO,EAAA,QACN,UAACD,+BAAAE,aAAAA,QAAA,EAAO,wBAAU,EACpB,CAAA;AAEJ;;;"}
@@ -10,3 +10,4 @@ export {
10
10
  Center as C,
11
11
  FullLoader as F
12
12
  };
13
+ //# sourceMappingURL=FullLoader-CrPED_dY.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FullLoader-CrPED_dY.mjs","sources":["../../admin/src/components/UI/Center.tsx","../../admin/src/components/UI/FullLoader.tsx"],"sourcesContent":["import { Flex } from '@strapi/design-system';\n\nexport default function Center({ height = 400, children }: { height?: number, children: React.ReactNode }) {\n\n return (\n <Flex direction=\"column\" minHeight={`${height}px`} justifyContent=\"center\">\n {children}\n </Flex>\n )\n}","import { Loader, Box } from '@strapi/design-system';\nimport Center from './Center';\n\nexport default function FullLoader({ height }: { height?: number }) {\n return (\n <Center height={height}>\n <Loader>Loading...</Loader>\n </Center>\n );\n}"],"names":[],"mappings":";;AAEA,SAAwB,OAAO,EAAE,SAAS,KAAK,YAA4D;AAGvG,SAAA,oBAAC,MAAK,EAAA,WAAU,UAAS,WAAW,GAAG,MAAM,MAAM,gBAAe,UAC/D,SACH,CAAA;AAEJ;ACNwB,SAAA,WAAW,EAAE,UAA+B;AAClE,6BACG,QAAO,EAAA,QACN,UAAC,oBAAA,QAAA,EAAO,wBAAU,EACpB,CAAA;AAEJ;"}
@@ -107,8 +107,11 @@ const de = {
107
107
  "webatlas.notification.routes.fetchFailed": "Routen konnten nicht abgerufen werden",
108
108
  "webatlas.notification.navigation.saveNavigationFailed": "Fehler beim Aktualisieren des Navigationselements",
109
109
  "webatlas.notification.navigation.navigationSaved": "Navigation erfolgreich aktualisiert",
110
- "webatlas.notification.navigation.fetchFailed": "Fehler beim Abrufen der Navigationen"
110
+ "webatlas.notification.navigation.fetchFailed": "Fehler beim Abrufen der Navigationen",
111
+ "webatlas.notification.navigation.notFound": "Navigation nicht gefunden. Zur Navigation weitergeleitet",
112
+ "webatlas.notification.navigation.creationFailed": "Erstellung der Navigation fehlgeschlagen"
111
113
  };
112
114
  export {
113
115
  de as default
114
116
  };
117
+ //# sourceMappingURL=de-BkirTac9.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"de-BkirTac9.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -109,6 +109,9 @@ const de = {
109
109
  "webatlas.notification.routes.fetchFailed": "Routen konnten nicht abgerufen werden",
110
110
  "webatlas.notification.navigation.saveNavigationFailed": "Fehler beim Aktualisieren des Navigationselements",
111
111
  "webatlas.notification.navigation.navigationSaved": "Navigation erfolgreich aktualisiert",
112
- "webatlas.notification.navigation.fetchFailed": "Fehler beim Abrufen der Navigationen"
112
+ "webatlas.notification.navigation.fetchFailed": "Fehler beim Abrufen der Navigationen",
113
+ "webatlas.notification.navigation.notFound": "Navigation nicht gefunden. Zur Navigation weitergeleitet",
114
+ "webatlas.notification.navigation.creationFailed": "Erstellung der Navigation fehlgeschlagen"
113
115
  };
114
116
  exports.default = de;
117
+ //# sourceMappingURL=de-D8LMOTFI.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"de-D8LMOTFI.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -109,6 +109,9 @@ const en = {
109
109
  "webatlas.notification.routes.fetchFailed": "Failed to fetch routes",
110
110
  "webatlas.notification.navigation.saveNavigationFailed": "Error updating navigation item",
111
111
  "webatlas.notification.navigation.navigationSaved": "Navigation updated successfully",
112
- "webatlas.notification.navigation.fetchFailed": "Failed to fetch navigations"
112
+ "webatlas.notification.navigation.fetchFailed": "Failed to fetch navigations",
113
+ "webatlas.notification.navigation.notFound": "Navigation not found. Redirected to navigation",
114
+ "webatlas.notification.navigation.creationFailed": "Creation of navigation failed"
113
115
  };
114
116
  exports.default = en;
117
+ //# sourceMappingURL=en-BdfmJUs8.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"en-BdfmJUs8.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -107,8 +107,11 @@ const en = {
107
107
  "webatlas.notification.routes.fetchFailed": "Failed to fetch routes",
108
108
  "webatlas.notification.navigation.saveNavigationFailed": "Error updating navigation item",
109
109
  "webatlas.notification.navigation.navigationSaved": "Navigation updated successfully",
110
- "webatlas.notification.navigation.fetchFailed": "Failed to fetch navigations"
110
+ "webatlas.notification.navigation.fetchFailed": "Failed to fetch navigations",
111
+ "webatlas.notification.navigation.notFound": "Navigation not found. Redirected to navigation",
112
+ "webatlas.notification.navigation.creationFailed": "Creation of navigation failed"
111
113
  };
112
114
  export {
113
115
  en as default
114
116
  };
117
+ //# sourceMappingURL=en-DYbDta3m.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"en-DYbDta3m.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -0,0 +1,282 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const jsxRuntime = require("react/jsx-runtime");
4
+ const React = require("react");
5
+ const designSystem = require("@strapi/design-system");
6
+ const admin = require("@strapi/strapi/admin");
7
+ const index = require("./index-Ciae_OgQ.js");
8
+ const reactIntl = require("react-intl");
9
+ require("@strapi/icons/symbols");
10
+ const FullLoader = require("./FullLoader-Cmsf8xS6.js");
11
+ function PageWrapper({
12
+ settingsState,
13
+ initialState,
14
+ save,
15
+ isSaving,
16
+ children
17
+ }) {
18
+ const { formatMessage } = reactIntl.useIntl();
19
+ return /* @__PURE__ */ jsxRuntime.jsxs(admin.Page.Main, { children: [
20
+ /* @__PURE__ */ jsxRuntime.jsx(
21
+ admin.Layouts.Header,
22
+ {
23
+ title: index.PLUGIN_NAME,
24
+ subtitle: formatMessage({
25
+ id: index.getTranslation("settings.page.subtitle"),
26
+ defaultMessage: "Settings"
27
+ }),
28
+ primaryAction: settingsState && initialState && save && /* @__PURE__ */ jsxRuntime.jsx(
29
+ designSystem.Button,
30
+ {
31
+ type: "submit",
32
+ onClick: () => save(),
33
+ loading: isSaving,
34
+ disabled: JSON.stringify(settingsState) === JSON.stringify(initialState) || settingsState.selectedContentTypes.find((cta) => !cta.default) !== void 0 || isSaving,
35
+ children: formatMessage({
36
+ id: index.getTranslation("save"),
37
+ defaultMessage: "Save"
38
+ })
39
+ }
40
+ )
41
+ }
42
+ ),
43
+ /* @__PURE__ */ jsxRuntime.jsx(admin.Layouts.Content, { children: /* @__PURE__ */ jsxRuntime.jsx(
44
+ designSystem.Box,
45
+ {
46
+ background: "neutral0",
47
+ borderColor: "neutral150",
48
+ hasRadius: true,
49
+ paddingBottom: 4,
50
+ paddingLeft: 4,
51
+ paddingRight: 4,
52
+ paddingTop: 6,
53
+ shadow: "tableShadow",
54
+ children
55
+ }
56
+ ) })
57
+ ] });
58
+ }
59
+ function ContentTypeAccordion({
60
+ contentType,
61
+ contentTypeSettings,
62
+ dispatch
63
+ }) {
64
+ const { formatMessage } = reactIntl.useIntl();
65
+ if (!contentType) return null;
66
+ return /* @__PURE__ */ jsxRuntime.jsx(
67
+ designSystem.Box,
68
+ {
69
+ borderColor: !contentTypeSettings.default && "danger500",
70
+ children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Accordion.Item, { value: contentType.uid, size: "S", children: [
71
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Accordion.Header, { children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Accordion.Trigger, { children: contentType?.info.displayName }) }),
72
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Accordion.Content, { children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Box, { padding: 3, children: [
73
+ /* @__PURE__ */ jsxRuntime.jsxs(
74
+ designSystem.Field.Root,
75
+ {
76
+ name: "selectedContentTypes",
77
+ hint: formatMessage({
78
+ id: index.getTranslation("settings.page.defaultField.hint"),
79
+ defaultMessage: 'The selected field from the content type will be used to generate the URL alias. Use a field that is unique and descriptive, such as a "title" or "name".'
80
+ }),
81
+ error: !contentTypeSettings.default && formatMessage({
82
+ id: index.getTranslation("settings.page.defaultField.error"),
83
+ defaultMessage: "Please select a default field"
84
+ }),
85
+ required: true,
86
+ children: [
87
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Field.Label, { children: formatMessage({
88
+ id: index.getTranslation("settings.page.defaultField"),
89
+ defaultMessage: "Default URL Alias field"
90
+ }) }),
91
+ /* @__PURE__ */ jsxRuntime.jsx(
92
+ designSystem.SingleSelect,
93
+ {
94
+ name: `defaultField-${contentType.uid}`,
95
+ onClear: () => dispatch({ type: "SET_DEFAULT_FIELD", payload: { ctUid: contentType.uid, field: "" } }),
96
+ value: contentTypeSettings?.default || "",
97
+ onChange: (value) => dispatch({ type: "SET_DEFAULT_FIELD", payload: { ctUid: contentType.uid, field: value } }),
98
+ children: Object.entries(contentType.attributes).map(([key], index2) => {
99
+ if (key === "id" || key === "documentId" || key === "createdAt" || key === "updatedAt" || key === "createdBy" || key === "updatedBy" || key === "webatlas_path" || key === "webatlas_override") return null;
100
+ return /* @__PURE__ */ jsxRuntime.jsx(designSystem.SingleSelectOption, { value: key, children: key }, index2);
101
+ })
102
+ }
103
+ ),
104
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Field.Hint, {})
105
+ ]
106
+ }
107
+ ),
108
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Box, { paddingTop: 4, children: /* @__PURE__ */ jsxRuntime.jsxs(
109
+ designSystem.Field.Root,
110
+ {
111
+ name: "urlAliasPattern",
112
+ hint: formatMessage({
113
+ id: index.getTranslation("settings.page.urlAliasPattern.hint"),
114
+ defaultMessage: 'The pattern to prepend to the generated URL alias. For example, if you enter "blog" and the value of default field is "My First Post", the generated URL alias will be "blog/my-first-post". Leave empty for no prefix.'
115
+ }),
116
+ children: [
117
+ /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Field.Label, { children: [
118
+ formatMessage({
119
+ id: index.getTranslation("settings.page.urlAliasPattern"),
120
+ defaultMessage: "URL Alias Pattern"
121
+ }),
122
+ /* @__PURE__ */ jsxRuntime.jsx(index.Tooltip, { description: formatMessage({
123
+ id: index.getTranslation("settings.page.urlAliasPattern.tooltip"),
124
+ defaultMessage: "Leading and trailing slashes will be removed. Spaces will be replaced with hyphens. Special characters will be encoded."
125
+ }) })
126
+ ] }),
127
+ /* @__PURE__ */ jsxRuntime.jsx(
128
+ designSystem.Field.Input,
129
+ {
130
+ value: contentTypeSettings.pattern,
131
+ onChange: (e) => dispatch({ type: "SET_PATTERN", payload: { ctUid: contentType.uid, pattern: e.target.value } }),
132
+ disabled: !contentTypeSettings.default,
133
+ type: "text",
134
+ placeholder: formatMessage({
135
+ id: index.getTranslation("settings.page.urlAliasPattern.placeholder"),
136
+ defaultMessage: "e.g. blog"
137
+ })
138
+ }
139
+ ),
140
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Field.Hint, {})
141
+ ]
142
+ }
143
+ ) })
144
+ ] }) })
145
+ ] }, contentType.uid)
146
+ },
147
+ contentType.uid
148
+ );
149
+ }
150
+ function reducer(settingsState, action) {
151
+ let updatedContentTypes;
152
+ switch (action.type) {
153
+ case "SET_SELECTED_CONTENT_TYPES":
154
+ updatedContentTypes = action.payload.map((ct) => {
155
+ return settingsState.selectedContentTypes.find((cta) => cta.uid === ct.uid) || ct;
156
+ });
157
+ return { ...settingsState, selectedContentTypes: updatedContentTypes };
158
+ case "SET_DEFAULT_FIELD":
159
+ updatedContentTypes = settingsState.selectedContentTypes.map(
160
+ (ct) => ct.uid === action.payload.ctUid ? { ...ct, default: action.payload.field } : ct
161
+ );
162
+ return { ...settingsState, selectedContentTypes: updatedContentTypes };
163
+ case "SET_PATTERN":
164
+ updatedContentTypes = settingsState.selectedContentTypes.map(
165
+ (ct) => ct.uid === action.payload.ctUid ? { ...ct, pattern: index.transformToUrl(action.payload.pattern) } : ct
166
+ );
167
+ return { ...settingsState, selectedContentTypes: updatedContentTypes };
168
+ default:
169
+ throw new Error();
170
+ }
171
+ }
172
+ const Settings = () => {
173
+ const { config, setConfig, loading, fetchError } = index.usePluginConfig();
174
+ const [settingsState, dispatch] = React.useReducer(reducer, config || { selectedContentTypes: [] });
175
+ const { contentTypes: allContentTypesData } = index.useAllContentTypes();
176
+ const allContentTypes = allContentTypesData?.filter((ct) => ct.pluginOptions?.webatlas?.active === true);
177
+ const [initialState, setInitialState] = React.useState(config || { selectedContentTypes: [] });
178
+ const { toggleNotification } = admin.useNotification();
179
+ const { formatMessage } = reactIntl.useIntl();
180
+ const [isSaving, setIsSaving] = React.useState(false);
181
+ React.useEffect(() => {
182
+ setInitialState(config || { selectedContentTypes: [] });
183
+ }, [config]);
184
+ React.useEffect(() => {
185
+ if (!config) return;
186
+ dispatch({ type: "SET_SELECTED_CONTENT_TYPES", payload: config.selectedContentTypes });
187
+ }, [config]);
188
+ React.useEffect(() => {
189
+ if (fetchError) {
190
+ toggleNotification({
191
+ type: "danger",
192
+ message: formatMessage({
193
+ id: index.getTranslation("notification.error"),
194
+ defaultMessage: "An error occurred"
195
+ }) + ": " + fetchError
196
+ });
197
+ }
198
+ }, [fetchError, toggleNotification, formatMessage]);
199
+ async function save() {
200
+ if (!settingsState || settingsState.selectedContentTypes.find((cta) => !cta.default) !== void 0) return;
201
+ setIsSaving(true);
202
+ try {
203
+ await setConfig(settingsState);
204
+ setInitialState(settingsState);
205
+ toggleNotification({
206
+ type: "success",
207
+ message: formatMessage({
208
+ id: index.getTranslation("notification.settings.saved"),
209
+ defaultMessage: "Settings saved successfully"
210
+ })
211
+ });
212
+ setIsSaving(false);
213
+ } catch (err) {
214
+ setIsSaving(false);
215
+ toggleNotification({
216
+ type: "danger",
217
+ message: formatMessage({
218
+ id: index.getTranslation("notification.error"),
219
+ defaultMessage: "An error occurred"
220
+ }) + ": " + err
221
+ });
222
+ console.error(err);
223
+ }
224
+ }
225
+ if (loading) {
226
+ return /* @__PURE__ */ jsxRuntime.jsx(PageWrapper, { children: /* @__PURE__ */ jsxRuntime.jsx(FullLoader.FullLoader, { height: 200 }) });
227
+ }
228
+ return /* @__PURE__ */ jsxRuntime.jsxs(PageWrapper, { settingsState, initialState, save, isSaving, children: [
229
+ /* @__PURE__ */ jsxRuntime.jsxs(
230
+ designSystem.Field.Root,
231
+ {
232
+ name: "selectedContentTypes",
233
+ hint: formatMessage({
234
+ id: index.getTranslation("settings.page.enabledContentTypes.hint"),
235
+ defaultMessage: "Select the content types for which you want to enable URL aliases"
236
+ }),
237
+ children: [
238
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Field.Label, { children: formatMessage({
239
+ id: index.getTranslation("settings.page.enabledContentTypes"),
240
+ defaultMessage: "Enabled Content Types"
241
+ }) }),
242
+ /* @__PURE__ */ jsxRuntime.jsx(
243
+ designSystem.MultiSelect,
244
+ {
245
+ placeholder: formatMessage({
246
+ id: index.getTranslation("settings.page.enabledContentTypes.placeholder"),
247
+ defaultMessage: "Select content types..."
248
+ }),
249
+ onClear: () => dispatch({ type: "SET_SELECTED_CONTENT_TYPES", payload: [] }),
250
+ value: [...settingsState.selectedContentTypes.map((ct) => ct.uid)],
251
+ onChange: (value) => dispatch({
252
+ type: "SET_SELECTED_CONTENT_TYPES",
253
+ payload: value.map((v) => ({
254
+ uid: v,
255
+ default: "",
256
+ pattern: ""
257
+ }))
258
+ }),
259
+ withTags: true,
260
+ children: allContentTypes && allContentTypes.map(
261
+ (item) => /* @__PURE__ */ jsxRuntime.jsx(designSystem.MultiSelectOption, { value: item.uid, children: item.info.displayName }, item.uid)
262
+ )
263
+ }
264
+ ),
265
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Field.Hint, {})
266
+ ]
267
+ }
268
+ ),
269
+ settingsState.selectedContentTypes && settingsState.selectedContentTypes.length > 0 && /* @__PURE__ */ jsxRuntime.jsx(designSystem.Box, { paddingTop: 4, children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Field.Root, { name: "selectedContentTypesAccordion", children: [
270
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Field.Label, { children: formatMessage({
271
+ id: index.getTranslation("settings.page.contentTypeSettings"),
272
+ defaultMessage: "Content Type settings"
273
+ }) }),
274
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Accordion.Root, { children: settingsState.selectedContentTypes?.map((contentTypeSettings) => {
275
+ const ct = allContentTypes?.find((item) => item.uid === contentTypeSettings.uid);
276
+ return /* @__PURE__ */ jsxRuntime.jsx(ContentTypeAccordion, { contentType: ct, contentTypeSettings, dispatch }, contentTypeSettings.uid);
277
+ }) })
278
+ ] }) })
279
+ ] });
280
+ };
281
+ exports.default = Settings;
282
+ //# sourceMappingURL=index-BAN8PGGJ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-BAN8PGGJ.js","sources":["../../admin/src/pages/Settings/PageWrapper.tsx","../../admin/src/pages/Settings/ContentTypeAccordion.tsx","../../admin/src/pages/Settings/index.tsx"],"sourcesContent":["import { Button, Box } from '@strapi/design-system';\nimport { Page, Layouts} from '@strapi/strapi/admin'\nimport { PLUGIN_NAME } from '../../../../pluginId';\nimport { getTranslation } from '../../utils';\nimport { useIntl } from 'react-intl';\nimport type { ConfigContentType } from '../../../../types';\n\nexport default function PageWrapper({ \n settingsState, \n initialState, \n save, \n isSaving,\n children\n}: { \n settingsState?: any, \n initialState?: any, \n save?: () => void, \n isSaving?: boolean,\n children: React.ReactNode \n}) {\n\n const { formatMessage } = useIntl();\n \n return (\n <Page.Main>\n <Layouts.Header\n title={PLUGIN_NAME}\n subtitle={formatMessage({\n id: getTranslation('settings.page.subtitle'),\n defaultMessage: 'Settings',\n })}\n primaryAction={ settingsState && initialState && save &&\n <Button\n type=\"submit\"\n onClick={() => save()}\n loading={isSaving}\n disabled={\n JSON.stringify(settingsState) === JSON.stringify(initialState)\n || settingsState.selectedContentTypes.find((cta: ConfigContentType) => !cta.default) !== undefined\n || isSaving\n }\n >\n {formatMessage({\n id: getTranslation('save'),\n defaultMessage: 'Save',\n })}\n </Button>\n }\n />\n <Layouts.Content>\n <Box\n background='neutral0'\n borderColor=\"neutral150\"\n hasRadius\n paddingBottom={4}\n paddingLeft={4}\n paddingRight={4}\n paddingTop={6}\n shadow=\"tableShadow\"\n >\n {children}\n </Box>\n </Layouts.Content>\n </Page.Main>\n )\n}","import { SingleSelect, SingleSelectOption } from '@strapi/design-system';\nimport Tooltip from '../../components/Tooltip'\nimport { Box, Accordion, Field } from '@strapi/design-system';\nimport { getTranslation } from '../../utils';\nimport { useIntl } from 'react-intl';\nimport type { ContentType, ConfigContentType } from '../../../../types';\n\nexport default function ContentTypeAccordion({ \n contentType,\n contentTypeSettings,\n dispatch\n}: { \n contentType: ContentType | undefined, \n contentTypeSettings: ConfigContentType, \n dispatch: React.Dispatch<any>\n}) {\n \n const { formatMessage } = useIntl();\n\n if (!contentType) return null\n\n return (\n <Box\n borderColor={!contentTypeSettings.default && 'danger500'}\n key={contentType.uid}\n >\n <Accordion.Item key={contentType.uid} value={contentType.uid} size=\"S\">\n <Accordion.Header>\n <Accordion.Trigger>\n {contentType?.info.displayName}\n </Accordion.Trigger>\n </Accordion.Header>\n <Accordion.Content>\n <Box padding={3}>\n <Field.Root\n name=\"selectedContentTypes\"\n hint={formatMessage({\n id: getTranslation('settings.page.defaultField.hint'),\n defaultMessage: 'The selected field from the content type will be used to generate the URL alias. Use a field that is unique and descriptive, such as a \"title\" or \"name\".',\n })}\n error={!contentTypeSettings.default && formatMessage({\n id: getTranslation('settings.page.defaultField.error'),\n defaultMessage: 'Please select a default field',\n })}\n required\n >\n <Field.Label>\n {formatMessage({\n id: getTranslation('settings.page.defaultField'),\n defaultMessage: 'Default URL Alias field',\n })}\n </Field.Label>\n <SingleSelect\n name={`defaultField-${contentType.uid}`}\n onClear={() => dispatch({ type: 'SET_DEFAULT_FIELD', payload: { ctUid: contentType.uid, field: '' } })}\n value={contentTypeSettings?.default || ''}\n onChange={(value: string) => dispatch({ type: 'SET_DEFAULT_FIELD', payload: { ctUid: contentType.uid, field: value } })}\n >\n {Object.entries(contentType.attributes).map(([key], index) => {\n if (\n key === 'id' || \n key === 'documentId' ||\n key === 'createdAt' || \n key === 'updatedAt' || \n key === 'createdBy' || \n key === 'updatedBy' ||\n key === 'webatlas_path' ||\n key === 'webatlas_override'\n ) return null\n return <SingleSelectOption key={index} value={key}>{key}</SingleSelectOption>\n })}\n </SingleSelect>\n <Field.Hint/>\n </Field.Root>\n <Box paddingTop={4}>\n <Field.Root\n name=\"urlAliasPattern\"\n hint={formatMessage({\n id: getTranslation('settings.page.urlAliasPattern.hint'),\n defaultMessage: 'The pattern to prepend to the generated URL alias. For example, if you enter \"blog\" and the value of default field is \"My First Post\", the generated URL alias will be \"blog/my-first-post\". Leave empty for no prefix.',\n })}\n >\n <Field.Label>\n {formatMessage({\n id: getTranslation('settings.page.urlAliasPattern'),\n defaultMessage: 'URL Alias Pattern',\n })}\n <Tooltip description={formatMessage({\n id: getTranslation('settings.page.urlAliasPattern.tooltip'),\n defaultMessage: 'Leading and trailing slashes will be removed. Spaces will be replaced with hyphens. Special characters will be encoded.',\n })} />\n </Field.Label>\n <Field.Input\n value={contentTypeSettings.pattern}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => dispatch({ type: 'SET_PATTERN', payload: { ctUid: contentType.uid, pattern: e.target.value } })}\n disabled={!contentTypeSettings.default}\n type=\"text\"\n placeholder={formatMessage({\n id: getTranslation('settings.page.urlAliasPattern.placeholder'),\n defaultMessage: 'e.g. blog',\n })}\n />\n <Field.Hint />\n </Field.Root>\n </Box>\n </Box>\n </Accordion.Content>\n </Accordion.Item>\n </Box>\n \n )\n}","/*\n *\n * Settings\n * This file contains the settings page for the Webatlas plugin in Strapi.\n * It allows users to configure which content types are enabled for URL aliases and navigations,\n * as well as setting default fields and the URL alias patterns for each content type. \n *\n*/\n\nimport { useEffect, useState, useReducer } from 'react';\nimport { Box, Accordion, Field } from '@strapi/design-system';\nimport { useNotification } from '@strapi/strapi/admin'\nimport { MultiSelect, MultiSelectOption } from '@strapi/design-system';\nimport usePluginConfig from '../../hooks/usePluginConfig';\nimport type { ContentType, ConfigContentType, PluginConfig } from '../../../../types';\nimport transformToUrl from '../../../../utils/transformToUrl';\nimport useAllContentTypes from '../../hooks/useAllContentTypes';\nimport { getTranslation } from '../../utils';\nimport { useIntl } from 'react-intl';\nimport { FullLoader } from '../../components/UI';\nimport PageWrapper from './PageWrapper';\nimport ContentTypeAccordion from './ContentTypeAccordion';\n\ntype Action =\n | { type: 'SET_SELECTED_CONTENT_TYPES'; payload: ConfigContentType[] }\n | { type: 'SET_DEFAULT_FIELD'; payload: { ctUid: string; field: string } }\n | { type: 'SET_PATTERN'; payload: { ctUid: string; pattern: string } }\n\nfunction reducer(settingsState: PluginConfig, action: Action): PluginConfig {\n let updatedContentTypes\n switch (action.type) {\n case 'SET_SELECTED_CONTENT_TYPES':\n updatedContentTypes = action.payload.map(ct => {\n return settingsState.selectedContentTypes.find((cta: ConfigContentType) => cta.uid === ct.uid) || ct\n })\n return { ...settingsState, selectedContentTypes: updatedContentTypes };\n case 'SET_DEFAULT_FIELD':\n updatedContentTypes = settingsState.selectedContentTypes.map(ct =>\n ct.uid === action.payload.ctUid ? { ...ct, default: action.payload.field } : ct\n );\n return { ...settingsState, selectedContentTypes: updatedContentTypes };\n case 'SET_PATTERN':\n updatedContentTypes = settingsState.selectedContentTypes.map(ct =>\n ct.uid === action.payload.ctUid ? { ...ct, pattern: transformToUrl(action.payload.pattern) } : ct\n );\n return { ...settingsState, selectedContentTypes: updatedContentTypes };\n default:\n throw new Error();\n }\n}\n\nconst Settings = () => {\n const { config, setConfig, loading, fetchError } = usePluginConfig();\n const [settingsState, dispatch] = useReducer(reducer, config || { selectedContentTypes: [] });\n const { contentTypes: allContentTypesData } = useAllContentTypes();\n const allContentTypes = allContentTypesData?.filter((ct: ContentType) => ct.pluginOptions?.webatlas?.active === true);\n const [initialState, setInitialState] = useState(config || { selectedContentTypes: [] })\n const { toggleNotification } = useNotification();\n const { formatMessage } = useIntl();\n const [isSaving, setIsSaving] = useState(false);\n\n useEffect(() => {\n setInitialState(config || { selectedContentTypes: [] })\n }, [config]);\n\n useEffect(() => {\n if (!config) return;\n dispatch({ type: 'SET_SELECTED_CONTENT_TYPES', payload: config.selectedContentTypes });\n }, [config]);\n \n useEffect(() => {\n if (fetchError) {\n toggleNotification({\n type: 'danger',\n message: formatMessage({\n id: getTranslation('notification.error'),\n defaultMessage: 'An error occurred',\n }) + ': ' + fetchError,\n });\n }\n }, [fetchError, toggleNotification, formatMessage]);\n\n async function save() {\n if (\n !settingsState \n || settingsState.selectedContentTypes.find((cta: ConfigContentType) => !cta.default) !== undefined\n ) return\n\n setIsSaving(true);\n try {\n await setConfig(settingsState)\n setInitialState(settingsState)\n\n toggleNotification({\n type: 'success',\n message: formatMessage({\n id: getTranslation('notification.settings.saved'),\n defaultMessage: 'Settings saved successfully',\n }),\n });\n setIsSaving(false);\n } catch (err) {\n setIsSaving(false);\n toggleNotification({\n type: 'danger',\n message: formatMessage({\n id: getTranslation('notification.error'),\n defaultMessage: 'An error occurred',\n }) + ': ' + err,\n });\n console.error(err);\n }\n }\n\n if (loading) {\n return <PageWrapper>\n <FullLoader height={200} />\n </PageWrapper>\n }\n\n return (\n <PageWrapper settingsState={settingsState} initialState={initialState} save={save} isSaving={isSaving}>\n <Field.Root\n name=\"selectedContentTypes\"\n hint={formatMessage({\n id: getTranslation('settings.page.enabledContentTypes.hint'),\n defaultMessage: 'Select the content types for which you want to enable URL aliases',\n })}\n >\n <Field.Label>\n {formatMessage({\n id: getTranslation('settings.page.enabledContentTypes'),\n defaultMessage: 'Enabled Content Types',\n })}\n </Field.Label>\n <MultiSelect\n placeholder={formatMessage({\n id: getTranslation('settings.page.enabledContentTypes.placeholder'),\n defaultMessage: 'Select content types...',\n })}\n onClear={() => dispatch({ type: 'SET_SELECTED_CONTENT_TYPES', payload: [] })}\n value={[...settingsState.selectedContentTypes.map((ct: ConfigContentType) => ct.uid)]}\n onChange={(value: string[]) =>\n dispatch({\n type: 'SET_SELECTED_CONTENT_TYPES',\n payload: value.map(v => ({\n uid: v,\n default: '',\n pattern: '',\n })),\n })\n }\n withTags\n >\n {allContentTypes && allContentTypes.map(item => \n <MultiSelectOption key={item.uid} value={item.uid}>{item.info.displayName}</MultiSelectOption>\n )}\n </MultiSelect>\n <Field.Hint/>\n </Field.Root>\n {settingsState.selectedContentTypes && settingsState.selectedContentTypes.length > 0 && \n <Box paddingTop={4}>\n <Field.Root name=\"selectedContentTypesAccordion\">\n <Field.Label>\n {formatMessage({\n id: getTranslation('settings.page.contentTypeSettings'),\n defaultMessage: 'Content Type settings',\n })}\n </Field.Label>\n <Accordion.Root>\n {settingsState.selectedContentTypes?.map((contentTypeSettings: ConfigContentType) => {\n const ct: ContentType | undefined = allContentTypes?.find((item) => item.uid === contentTypeSettings.uid)\n return <ContentTypeAccordion key={contentTypeSettings.uid} contentType={ct} contentTypeSettings={contentTypeSettings} dispatch={dispatch} />\n })}\n </Accordion.Root>\n </Field.Root>\n </Box>\n }\n </PageWrapper>\n );\n};\n\nexport default Settings;\n"],"names":["useIntl","jsxs","Page","jsx","Layouts","PLUGIN_NAME","getTranslation","Button","Box","Accordion","Field","SingleSelect","index","SingleSelectOption","Tooltip","transformToUrl","usePluginConfig","useReducer","useAllContentTypes","useState","useNotification","useEffect","FullLoader","MultiSelect","MultiSelectOption"],"mappings":"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"}