@mattisvensson/strapi-plugin-webatlas 0.8.0 → 0.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (76) hide show
  1. package/dist/_chunks/FullLoader-Cmsf8xS6.js +12 -0
  2. package/dist/_chunks/FullLoader-Cmsf8xS6.js.map +1 -0
  3. package/dist/_chunks/FullLoader-CrPED_dY.mjs +1 -0
  4. package/dist/_chunks/FullLoader-CrPED_dY.mjs.map +1 -0
  5. package/dist/_chunks/PageWrapper-Bp9vGwpG.js +54 -0
  6. package/dist/_chunks/PageWrapper-BvOY7VCN.mjs +55 -0
  7. package/dist/_chunks/PageWrapper-BzDrMm2d.js +55 -0
  8. package/dist/_chunks/PageWrapper-BzDrMm2d.js.map +1 -0
  9. package/dist/_chunks/{PageWrapper-B6nLPFak.mjs → PageWrapper-oLhcg9BA.mjs} +2 -1
  10. package/dist/_chunks/PageWrapper-oLhcg9BA.mjs.map +1 -0
  11. package/dist/_chunks/de-CDBoUBzw.js +124 -0
  12. package/dist/_chunks/de-CDBoUBzw.js.map +1 -0
  13. package/dist/_chunks/{de-C1QgkRoj.mjs → de-Dt80IqMG.mjs} +2 -0
  14. package/dist/_chunks/de-Dt80IqMG.mjs.map +1 -0
  15. package/dist/_chunks/{en--8p5hbLP.mjs → en-BHxDiueo.mjs} +2 -0
  16. package/dist/_chunks/en-BHxDiueo.mjs.map +1 -0
  17. package/dist/_chunks/en-DfvURaup.js +124 -0
  18. package/dist/_chunks/en-DfvURaup.js.map +1 -0
  19. package/dist/_chunks/index--oj1eNcM.js +247 -0
  20. package/dist/_chunks/index--oj1eNcM.js.map +1 -0
  21. package/dist/_chunks/{index-VcxUbdMO.mjs → index-BBn1ZvsE.mjs} +2 -2
  22. package/dist/_chunks/index-BCPgfhBx.js +124 -0
  23. package/dist/_chunks/index-BCPgfhBx.js.map +1 -0
  24. package/dist/_chunks/index-BKdvSgDB.js +246 -0
  25. package/dist/_chunks/index-CAged_xE.mjs +247 -0
  26. package/dist/_chunks/index-CAged_xE.mjs.map +1 -0
  27. package/dist/_chunks/index-CHRBu9Xy.mjs +124 -0
  28. package/dist/_chunks/index-CHRBu9Xy.mjs.map +1 -0
  29. package/dist/_chunks/{index-DSPh-fHL.mjs → index-CTA8agp7.mjs} +7 -7
  30. package/dist/_chunks/{index-Z3qq1ab8.mjs → index-CUlRMqGG.mjs} +26 -29
  31. package/dist/_chunks/index-CbW6k4FH.js +4205 -0
  32. package/dist/_chunks/index-CbW6k4FH.js.map +1 -0
  33. package/dist/_chunks/index-CtFERXkl.js +253 -0
  34. package/dist/_chunks/index-CtFERXkl.js.map +1 -0
  35. package/dist/_chunks/index-D29zBs5w.mjs +12228 -0
  36. package/dist/_chunks/index-D29zBs5w.mjs.map +1 -0
  37. package/dist/_chunks/index-D72CZ5b7.js +123 -0
  38. package/dist/_chunks/{index-7rox7tGX.mjs → index-DJBXRNlE.mjs} +3 -2
  39. package/dist/_chunks/index-DJBXRNlE.mjs.map +1 -0
  40. package/dist/_chunks/index-DMpiX4hP.mjs +4189 -0
  41. package/dist/_chunks/index-DMpiX4hP.mjs.map +1 -0
  42. package/dist/_chunks/index-DTPDMxs_.js +12227 -0
  43. package/dist/_chunks/index-DUgh4AJb.js +252 -0
  44. package/dist/_chunks/index-Dxn0NT06.js +4204 -0
  45. package/dist/_chunks/index-Nx4IRYIK.mjs +252 -0
  46. package/dist/_chunks/{index-DGSjLYNl.mjs → index-Rfm9O167.mjs} +1 -1
  47. package/dist/_chunks/index-YzPuPn68.js +12228 -0
  48. package/dist/_chunks/index-YzPuPn68.js.map +1 -0
  49. package/dist/admin/index.js +5 -0
  50. package/dist/admin/index.js.map +1 -0
  51. package/dist/admin/index.mjs +2 -1
  52. package/dist/admin/index.mjs.map +1 -0
  53. package/dist/admin/src/components/modals/NavEdit.d.ts +1 -1
  54. package/dist/admin/src/components/modals/fields/Visibility.d.ts +5 -0
  55. package/dist/admin/src/components/modals/fields/index.d.ts +2 -0
  56. package/dist/server/index.js +12 -3
  57. package/dist/server/index.js.map +1 -0
  58. package/dist/server/index.mjs +12 -3
  59. package/dist/server/index.mjs.map +1 -0
  60. package/package.json +1 -1
  61. package/dist/_chunks/PageWrapper-BMzPDWn4.js +0 -0
  62. package/dist/_chunks/PageWrapper-BMzPDWn4.js.map +0 -0
  63. package/dist/_chunks/de-DYxCPOdb.js +0 -0
  64. package/dist/_chunks/de-DYxCPOdb.js.map +0 -0
  65. package/dist/_chunks/en-Be-athEA.js +0 -0
  66. package/dist/_chunks/en-Be-athEA.js.map +0 -0
  67. package/dist/_chunks/index-Bu-uQ9jA.js +0 -0
  68. package/dist/_chunks/index-Bu-uQ9jA.js.map +0 -0
  69. package/dist/_chunks/index-C53yDU_z.js +0 -0
  70. package/dist/_chunks/index-C53yDU_z.js.map +0 -0
  71. package/dist/_chunks/index-CAz59RSr.js +0 -0
  72. package/dist/_chunks/index-CAz59RSr.js.map +0 -0
  73. package/dist/_chunks/index-DKfUSLPc.js +0 -0
  74. package/dist/_chunks/index-DKfUSLPc.js.map +0 -0
  75. package/dist/_chunks/index-DPMhcaxW.js +0 -0
  76. package/dist/_chunks/index-DPMhcaxW.js.map +0 -0
@@ -0,0 +1,252 @@
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-Dxn0NT06.js");
8
+ const reactIntl = require("react-intl");
9
+ require("@strapi/icons/symbols");
10
+ const FullLoader = require("./FullLoader-Cmsf8xS6.js");
11
+ const PageWrapper = require("./PageWrapper-Bp9vGwpG.js");
12
+ function ContentTypeAccordion({
13
+ contentType,
14
+ contentTypeSettings,
15
+ dispatch
16
+ }) {
17
+ const { formatMessage } = reactIntl.useIntl();
18
+ if (!contentType) return null;
19
+ return /* @__PURE__ */ jsxRuntime.jsx(
20
+ designSystem.Box,
21
+ {
22
+ borderColor: !contentTypeSettings.default && "danger500",
23
+ children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Accordion.Item, { value: contentType.uid, size: "S", children: [
24
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Accordion.Header, { children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Accordion.Trigger, { children: contentType?.info.displayName }) }),
25
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Accordion.Content, { children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Box, { padding: 3, children: [
26
+ /* @__PURE__ */ jsxRuntime.jsxs(
27
+ designSystem.Field.Root,
28
+ {
29
+ name: "selectedContentTypes",
30
+ hint: formatMessage({
31
+ id: index.getTranslation("settings.page.defaultField.hint"),
32
+ 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".'
33
+ }),
34
+ error: !contentTypeSettings.default && formatMessage({
35
+ id: index.getTranslation("settings.page.defaultField.error"),
36
+ defaultMessage: "Please select a default field"
37
+ }),
38
+ required: true,
39
+ children: [
40
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Field.Label, { children: formatMessage({
41
+ id: index.getTranslation("settings.page.defaultField"),
42
+ defaultMessage: "Default URL Alias field"
43
+ }) }),
44
+ /* @__PURE__ */ jsxRuntime.jsx(
45
+ designSystem.SingleSelect,
46
+ {
47
+ name: `defaultField-${contentType.uid}`,
48
+ onClear: () => dispatch({ type: "SET_DEFAULT_FIELD", payload: { ctUid: contentType.uid, field: "" } }),
49
+ value: contentTypeSettings?.default || "",
50
+ onChange: (value) => dispatch({ type: "SET_DEFAULT_FIELD", payload: { ctUid: contentType.uid, field: value } }),
51
+ children: Object.entries(contentType.attributes).map(([key], index2) => {
52
+ if (key === "id" || key === "documentId" || key === "createdAt" || key === "updatedAt" || key === "createdBy" || key === "updatedBy" || key === "webatlas_path" || key === "webatlas_override") return null;
53
+ return /* @__PURE__ */ jsxRuntime.jsx(designSystem.SingleSelectOption, { value: key, children: key }, index2);
54
+ })
55
+ }
56
+ ),
57
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Field.Hint, {})
58
+ ]
59
+ }
60
+ ),
61
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Box, { paddingTop: 4, children: /* @__PURE__ */ jsxRuntime.jsxs(
62
+ designSystem.Field.Root,
63
+ {
64
+ name: "urlAliasPattern",
65
+ hint: formatMessage({
66
+ id: index.getTranslation("settings.page.urlAliasPattern.hint"),
67
+ 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.'
68
+ }),
69
+ children: [
70
+ /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Field.Label, { children: [
71
+ formatMessage({
72
+ id: index.getTranslation("settings.page.urlAliasPattern"),
73
+ defaultMessage: "URL Alias Pattern"
74
+ }),
75
+ /* @__PURE__ */ jsxRuntime.jsx(index.Tooltip, { description: formatMessage({
76
+ id: index.getTranslation("settings.page.urlAliasPattern.tooltip"),
77
+ defaultMessage: "Leading and trailing slashes will be removed. Spaces will be replaced with hyphens. Special characters will be encoded."
78
+ }) })
79
+ ] }),
80
+ /* @__PURE__ */ jsxRuntime.jsx(
81
+ designSystem.Field.Input,
82
+ {
83
+ value: contentTypeSettings.pattern,
84
+ onChange: (e) => dispatch({ type: "SET_PATTERN", payload: { ctUid: contentType.uid, pattern: e.target.value } }),
85
+ disabled: !contentTypeSettings.default,
86
+ type: "text",
87
+ placeholder: formatMessage({
88
+ id: index.getTranslation("settings.page.urlAliasPattern.placeholder"),
89
+ defaultMessage: "e.g. blog"
90
+ })
91
+ }
92
+ ),
93
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Field.Hint, {})
94
+ ]
95
+ }
96
+ ) })
97
+ ] }) })
98
+ ] }, contentType.uid)
99
+ },
100
+ contentType.uid
101
+ );
102
+ }
103
+ function reducer(newConfig, action) {
104
+ let updatedContentTypes;
105
+ switch (action.type) {
106
+ case "SET_SELECTED_CONTENT_TYPES":
107
+ if (!newConfig) return null;
108
+ updatedContentTypes = action.payload.map((ct) => {
109
+ return newConfig?.selectedContentTypes.find((cta) => cta.uid === ct.uid) || ct;
110
+ });
111
+ return { ...newConfig, selectedContentTypes: updatedContentTypes || [] };
112
+ case "SET_DEFAULT_FIELD":
113
+ if (!newConfig) return null;
114
+ updatedContentTypes = newConfig?.selectedContentTypes.map(
115
+ (ct) => ct.uid === action.payload.ctUid ? { ...ct, default: action.payload.field } : ct
116
+ );
117
+ return { ...newConfig, selectedContentTypes: updatedContentTypes || [] };
118
+ case "SET_PATTERN":
119
+ if (!newConfig) return null;
120
+ updatedContentTypes = newConfig?.selectedContentTypes.map(
121
+ (ct) => ct.uid === action.payload.ctUid ? { ...ct, pattern: index.transformToUrl(action.payload.pattern) } : ct
122
+ );
123
+ return { ...newConfig, selectedContentTypes: updatedContentTypes || [] };
124
+ case "SET_CONFIG":
125
+ return action.payload;
126
+ default:
127
+ throw new Error();
128
+ }
129
+ }
130
+ const Settings = () => {
131
+ const { config: fetchedConfig, setConfig, loading, fetchError } = index.usePluginConfig();
132
+ const [config, dispatch] = React.useReducer(reducer, fetchedConfig);
133
+ const { contentTypes: allContentTypesData } = index.useAllContentTypes();
134
+ const allContentTypes = allContentTypesData?.filter((ct) => ct.pluginOptions?.webatlas?.active === true);
135
+ const { toggleNotification } = admin.useNotification();
136
+ const { formatMessage } = reactIntl.useIntl();
137
+ const [isSaving, setIsSaving] = React.useState(false);
138
+ const initialConfig = React.useRef(fetchedConfig);
139
+ React.useEffect(() => {
140
+ initialConfig.current = fetchedConfig;
141
+ if (fetchedConfig)
142
+ dispatch({ type: "SET_CONFIG", payload: fetchedConfig });
143
+ }, [fetchedConfig]);
144
+ React.useEffect(() => {
145
+ if (fetchError) {
146
+ toggleNotification({
147
+ type: "danger",
148
+ message: formatMessage({
149
+ id: index.getTranslation("notification.error"),
150
+ defaultMessage: "An error occurred"
151
+ }) + ": " + fetchError
152
+ });
153
+ }
154
+ }, [fetchError, toggleNotification, formatMessage]);
155
+ async function save() {
156
+ if (!config || config.selectedContentTypes.find((cta) => !cta.default) !== void 0) return;
157
+ setIsSaving(true);
158
+ try {
159
+ await setConfig({ selectedContentTypes: config.selectedContentTypes });
160
+ initialConfig.current = config;
161
+ toggleNotification({
162
+ type: "success",
163
+ message: formatMessage({
164
+ id: index.getTranslation("notification.settings.saved"),
165
+ defaultMessage: "Settings saved successfully"
166
+ })
167
+ });
168
+ setIsSaving(false);
169
+ } catch (err) {
170
+ setIsSaving(false);
171
+ toggleNotification({
172
+ type: "danger",
173
+ message: formatMessage({
174
+ id: index.getTranslation("notification.error"),
175
+ defaultMessage: "An error occurred"
176
+ }) + ": " + err
177
+ });
178
+ console.error(err);
179
+ }
180
+ }
181
+ if (loading) {
182
+ return /* @__PURE__ */ jsxRuntime.jsx(
183
+ PageWrapper.PageWrapper,
184
+ {
185
+ isSaving,
186
+ disabledCondition: true,
187
+ children: /* @__PURE__ */ jsxRuntime.jsx(FullLoader.FullLoader, { height: 200 })
188
+ }
189
+ );
190
+ }
191
+ return /* @__PURE__ */ jsxRuntime.jsxs(
192
+ PageWrapper.PageWrapper,
193
+ {
194
+ save,
195
+ isSaving,
196
+ disabledCondition: JSON.stringify(config) === JSON.stringify(initialConfig.current),
197
+ children: [
198
+ /* @__PURE__ */ jsxRuntime.jsxs(
199
+ designSystem.Field.Root,
200
+ {
201
+ name: "selectedContentTypes",
202
+ hint: formatMessage({
203
+ id: index.getTranslation("settings.page.enabledContentTypes.hint"),
204
+ defaultMessage: "Select the content types for which you want to enable URL aliases"
205
+ }),
206
+ children: [
207
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Field.Label, { children: formatMessage({
208
+ id: index.getTranslation("settings.page.enabledContentTypes"),
209
+ defaultMessage: "Enabled Content Types"
210
+ }) }),
211
+ /* @__PURE__ */ jsxRuntime.jsx(
212
+ designSystem.MultiSelect,
213
+ {
214
+ placeholder: formatMessage({
215
+ id: index.getTranslation("settings.page.enabledContentTypes.placeholder"),
216
+ defaultMessage: "Select content types..."
217
+ }),
218
+ onClear: () => dispatch({ type: "SET_SELECTED_CONTENT_TYPES", payload: [] }),
219
+ value: [...config?.selectedContentTypes.map((ct) => ct.uid) || []],
220
+ onChange: (value) => dispatch({
221
+ type: "SET_SELECTED_CONTENT_TYPES",
222
+ payload: value.map((v) => ({
223
+ uid: v,
224
+ default: "",
225
+ pattern: ""
226
+ }))
227
+ }),
228
+ withTags: true,
229
+ children: allContentTypes && allContentTypes.map(
230
+ (item) => /* @__PURE__ */ jsxRuntime.jsx(designSystem.MultiSelectOption, { value: item.uid, children: item.info.displayName }, item.uid)
231
+ )
232
+ }
233
+ ),
234
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Field.Hint, {})
235
+ ]
236
+ }
237
+ ),
238
+ config?.selectedContentTypes && config.selectedContentTypes.length > 0 && /* @__PURE__ */ jsxRuntime.jsx(designSystem.Box, { paddingTop: 4, children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Field.Root, { name: "selectedContentTypesAccordion", children: [
239
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Field.Label, { children: formatMessage({
240
+ id: index.getTranslation("settings.page.contentTypeSettings"),
241
+ defaultMessage: "Content Type settings"
242
+ }) }),
243
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Accordion.Root, { children: config.selectedContentTypes?.map((contentTypeSettings) => {
244
+ const ct = allContentTypes?.find((item) => item.uid === contentTypeSettings.uid);
245
+ return /* @__PURE__ */ jsxRuntime.jsx(ContentTypeAccordion, { contentType: ct, contentTypeSettings, dispatch }, contentTypeSettings.uid);
246
+ }) })
247
+ ] }) })
248
+ ]
249
+ }
250
+ );
251
+ };
252
+ exports.default = Settings;