@strapi/content-type-builder 5.54.0 → 5.55.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 (208) hide show
  1. package/dist/admin/components/AIChat/hooks/useAIFetch.js +6 -2
  2. package/dist/admin/components/AIChat/hooks/useAIFetch.js.map +1 -1
  3. package/dist/admin/components/AIChat/hooks/useAIFetch.mjs +7 -3
  4. package/dist/admin/components/AIChat/hooks/useAIFetch.mjs.map +1 -1
  5. package/dist/admin/components/AIChat/hooks/usePrefetchAIToken.js +20 -0
  6. package/dist/admin/components/AIChat/hooks/usePrefetchAIToken.js.map +1 -0
  7. package/dist/admin/components/AIChat/hooks/usePrefetchAIToken.mjs +18 -0
  8. package/dist/admin/components/AIChat/hooks/usePrefetchAIToken.mjs.map +1 -0
  9. package/dist/admin/components/ContentTypeBuilderNav/ContentTypeBuilderNav.js +83 -59
  10. package/dist/admin/components/ContentTypeBuilderNav/ContentTypeBuilderNav.js.map +1 -1
  11. package/dist/admin/components/ContentTypeBuilderNav/ContentTypeBuilderNav.mjs +86 -62
  12. package/dist/admin/components/ContentTypeBuilderNav/ContentTypeBuilderNav.mjs.map +1 -1
  13. package/dist/admin/components/ContentTypeBuilderNav/components/FolderNav/DeleteFolderDialog.js +112 -0
  14. package/dist/admin/components/ContentTypeBuilderNav/components/FolderNav/DeleteFolderDialog.js.map +1 -0
  15. package/dist/admin/components/ContentTypeBuilderNav/components/FolderNav/DeleteFolderDialog.mjs +110 -0
  16. package/dist/admin/components/ContentTypeBuilderNav/components/FolderNav/DeleteFolderDialog.mjs.map +1 -0
  17. package/dist/admin/components/ContentTypeBuilderNav/components/FolderNav/FolderNameField.js +159 -0
  18. package/dist/admin/components/ContentTypeBuilderNav/components/FolderNav/FolderNameField.js.map +1 -0
  19. package/dist/admin/components/ContentTypeBuilderNav/components/FolderNav/FolderNameField.mjs +157 -0
  20. package/dist/admin/components/ContentTypeBuilderNav/components/FolderNav/FolderNameField.mjs.map +1 -0
  21. package/dist/admin/components/ContentTypeBuilderNav/components/FolderNav/FolderNavSection.js +311 -0
  22. package/dist/admin/components/ContentTypeBuilderNav/components/FolderNav/FolderNavSection.js.map +1 -0
  23. package/dist/admin/components/ContentTypeBuilderNav/components/FolderNav/FolderNavSection.mjs +309 -0
  24. package/dist/admin/components/ContentTypeBuilderNav/components/FolderNav/FolderNavSection.mjs.map +1 -0
  25. package/dist/admin/components/ContentTypeBuilderNav/components/FolderNav/SortableTreeRow.js +379 -0
  26. package/dist/admin/components/ContentTypeBuilderNav/components/FolderNav/SortableTreeRow.js.map +1 -0
  27. package/dist/admin/components/ContentTypeBuilderNav/components/FolderNav/SortableTreeRow.mjs +376 -0
  28. package/dist/admin/components/ContentTypeBuilderNav/components/FolderNav/SortableTreeRow.mjs.map +1 -0
  29. package/dist/admin/components/ContentTypeBuilderNav/hooks/useContentTypeBuilderMenu.js +172 -0
  30. package/dist/admin/components/ContentTypeBuilderNav/hooks/useContentTypeBuilderMenu.js.map +1 -0
  31. package/dist/admin/components/ContentTypeBuilderNav/hooks/useContentTypeBuilderMenu.mjs +166 -0
  32. package/dist/admin/components/ContentTypeBuilderNav/hooks/useContentTypeBuilderMenu.mjs.map +1 -0
  33. package/dist/admin/components/ContentTypeBuilderNav/hooks/useFolderActions.js +62 -0
  34. package/dist/admin/components/ContentTypeBuilderNav/hooks/useFolderActions.js.map +1 -0
  35. package/dist/admin/components/ContentTypeBuilderNav/hooks/useFolderActions.mjs +60 -0
  36. package/dist/admin/components/ContentTypeBuilderNav/hooks/useFolderActions.mjs.map +1 -0
  37. package/dist/admin/components/ContentTypeBuilderNav/hooks/useSortableTree.js +145 -0
  38. package/dist/admin/components/ContentTypeBuilderNav/hooks/useSortableTree.js.map +1 -0
  39. package/dist/admin/components/ContentTypeBuilderNav/hooks/useSortableTree.mjs +143 -0
  40. package/dist/admin/components/ContentTypeBuilderNav/hooks/useSortableTree.mjs.map +1 -0
  41. package/dist/admin/components/ContentTypeBuilderNav/lib/buildFolderTree.js +176 -0
  42. package/dist/admin/components/ContentTypeBuilderNav/lib/buildFolderTree.js.map +1 -0
  43. package/dist/admin/components/ContentTypeBuilderNav/lib/buildFolderTree.mjs +169 -0
  44. package/dist/admin/components/ContentTypeBuilderNav/lib/buildFolderTree.mjs.map +1 -0
  45. package/dist/admin/components/ContentTypeBuilderNav/lib/dropProjection.js +277 -0
  46. package/dist/admin/components/ContentTypeBuilderNav/lib/dropProjection.js.map +1 -0
  47. package/dist/admin/components/ContentTypeBuilderNav/lib/dropProjection.mjs +273 -0
  48. package/dist/admin/components/ContentTypeBuilderNav/lib/dropProjection.mjs.map +1 -0
  49. package/dist/admin/components/ContentTypeBuilderNav/lib/flatModel.js +62 -0
  50. package/dist/admin/components/ContentTypeBuilderNav/lib/flatModel.js.map +1 -0
  51. package/dist/admin/components/ContentTypeBuilderNav/lib/flatModel.mjs +58 -0
  52. package/dist/admin/components/ContentTypeBuilderNav/lib/flatModel.mjs.map +1 -0
  53. package/dist/admin/components/DataManager/DataManagerContext.js.map +1 -1
  54. package/dist/admin/components/DataManager/DataManagerContext.mjs.map +1 -1
  55. package/dist/admin/components/DataManager/DataManagerProvider.js +70 -8
  56. package/dist/admin/components/DataManager/DataManagerProvider.js.map +1 -1
  57. package/dist/admin/components/DataManager/DataManagerProvider.mjs +70 -8
  58. package/dist/admin/components/DataManager/DataManagerProvider.mjs.map +1 -1
  59. package/dist/admin/components/DataManager/reducer.js +411 -33
  60. package/dist/admin/components/DataManager/reducer.js.map +1 -1
  61. package/dist/admin/components/DataManager/reducer.mjs +411 -33
  62. package/dist/admin/components/DataManager/reducer.mjs.map +1 -1
  63. package/dist/admin/components/DataManager/utils/cleanData.js +11 -2
  64. package/dist/admin/components/DataManager/utils/cleanData.js.map +1 -1
  65. package/dist/admin/components/DataManager/utils/cleanData.mjs +11 -2
  66. package/dist/admin/components/DataManager/utils/cleanData.mjs.map +1 -1
  67. package/dist/admin/components/DataManager/utils/contentStructure.js +150 -0
  68. package/dist/admin/components/DataManager/utils/contentStructure.js.map +1 -0
  69. package/dist/admin/components/DataManager/utils/contentStructure.mjs +133 -0
  70. package/dist/admin/components/DataManager/utils/contentStructure.mjs.map +1 -0
  71. package/dist/admin/components/FolderSelect.js +200 -0
  72. package/dist/admin/components/FolderSelect.js.map +1 -0
  73. package/dist/admin/components/FolderSelect.mjs +198 -0
  74. package/dist/admin/components/FolderSelect.mjs.map +1 -0
  75. package/dist/admin/components/FormModal/FormModal.js +23 -2
  76. package/dist/admin/components/FormModal/FormModal.js.map +1 -1
  77. package/dist/admin/components/FormModal/FormModal.mjs +23 -2
  78. package/dist/admin/components/FormModal/FormModal.mjs.map +1 -1
  79. package/dist/admin/components/FormModal/contentType/contentTypeForm.js +15 -18
  80. package/dist/admin/components/FormModal/contentType/contentTypeForm.js.map +1 -1
  81. package/dist/admin/components/FormModal/contentType/contentTypeForm.mjs +15 -18
  82. package/dist/admin/components/FormModal/contentType/contentTypeForm.mjs.map +1 -1
  83. package/dist/admin/components/FormModal/reducer.js +6 -0
  84. package/dist/admin/components/FormModal/reducer.js.map +1 -1
  85. package/dist/admin/components/FormModal/reducer.mjs +6 -0
  86. package/dist/admin/components/FormModal/reducer.mjs.map +1 -1
  87. package/dist/admin/pages/App/index.js +2 -5
  88. package/dist/admin/pages/App/index.js.map +1 -1
  89. package/dist/admin/pages/App/index.mjs +2 -5
  90. package/dist/admin/pages/App/index.mjs.map +1 -1
  91. package/dist/admin/src/components/AIChat/hooks/usePrefetchAIToken.d.ts +1 -0
  92. package/dist/admin/src/components/ContentTypeBuilderNav/components/FolderNav/DeleteFolderDialog.d.ts +16 -0
  93. package/dist/admin/src/components/ContentTypeBuilderNav/components/FolderNav/FolderNameField.d.ts +12 -0
  94. package/dist/admin/src/components/ContentTypeBuilderNav/components/FolderNav/FolderNavSection.d.ts +14 -0
  95. package/dist/admin/src/components/ContentTypeBuilderNav/components/FolderNav/SortableTreeRow.d.ts +38 -0
  96. package/dist/admin/src/components/ContentTypeBuilderNav/{useContentTypeBuilderMenu.d.ts → hooks/useContentTypeBuilderMenu.d.ts} +17 -7
  97. package/dist/admin/src/components/ContentTypeBuilderNav/hooks/useFolderActions.d.ts +42 -0
  98. package/dist/admin/src/components/ContentTypeBuilderNav/hooks/useSortableTree.d.ts +53 -0
  99. package/dist/admin/src/components/ContentTypeBuilderNav/lib/buildFolderTree.d.ts +42 -0
  100. package/dist/admin/src/components/ContentTypeBuilderNav/lib/dropProjection.d.ts +58 -0
  101. package/dist/admin/src/components/ContentTypeBuilderNav/lib/flatModel.d.ts +18 -0
  102. package/dist/admin/src/components/DataManager/DataManagerContext.d.ts +41 -0
  103. package/dist/admin/src/components/DataManager/reducer.d.ts +105 -1
  104. package/dist/admin/src/components/DataManager/utils/cleanData.d.ts +5 -1
  105. package/dist/admin/src/components/DataManager/utils/contentStructure.d.ts +68 -0
  106. package/dist/admin/src/components/FolderSelect.d.ts +18 -0
  107. package/dist/admin/src/components/FormModal/contentType/contentTypeForm.d.ts +0 -21
  108. package/dist/admin/src/components/FormModal/forms/forms.d.ts +0 -10
  109. package/dist/admin/src/components/FormModal/reducer.d.ts +7 -0
  110. package/dist/admin/src/utils/folderTelemetry.d.ts +5 -0
  111. package/dist/admin/translations/en.json.js +23 -0
  112. package/dist/admin/translations/en.json.js.map +1 -1
  113. package/dist/admin/translations/en.json.mjs +23 -0
  114. package/dist/admin/translations/en.json.mjs.map +1 -1
  115. package/dist/admin/utils/folderTelemetry.js +19 -0
  116. package/dist/admin/utils/folderTelemetry.js.map +1 -0
  117. package/dist/admin/utils/folderTelemetry.mjs +16 -0
  118. package/dist/admin/utils/folderTelemetry.mjs.map +1 -0
  119. package/dist/server/controllers/schema.js +1 -1
  120. package/dist/server/controllers/schema.js.map +1 -1
  121. package/dist/server/controllers/schema.mjs +1 -1
  122. package/dist/server/controllers/schema.mjs.map +1 -1
  123. package/dist/server/controllers/validation/common.js +3 -0
  124. package/dist/server/controllers/validation/common.js.map +1 -1
  125. package/dist/server/controllers/validation/common.mjs +3 -1
  126. package/dist/server/controllers/validation/common.mjs.map +1 -1
  127. package/dist/server/controllers/validation/content-structure.js +177 -0
  128. package/dist/server/controllers/validation/content-structure.js.map +1 -0
  129. package/dist/server/controllers/validation/content-structure.mjs +173 -0
  130. package/dist/server/controllers/validation/content-structure.mjs.map +1 -0
  131. package/dist/server/controllers/validation/schema.js +3 -1
  132. package/dist/server/controllers/validation/schema.js.map +1 -1
  133. package/dist/server/controllers/validation/schema.mjs +3 -1
  134. package/dist/server/controllers/validation/schema.mjs.map +1 -1
  135. package/dist/server/register.js +1 -1
  136. package/dist/server/register.js.map +1 -1
  137. package/dist/server/register.mjs +1 -1
  138. package/dist/server/register.mjs.map +1 -1
  139. package/dist/server/routes/content-api.js +4 -4
  140. package/dist/server/routes/content-api.js.map +1 -1
  141. package/dist/server/routes/content-api.mjs +4 -4
  142. package/dist/server/routes/content-api.mjs.map +1 -1
  143. package/dist/server/services/api-handler.js +37 -4
  144. package/dist/server/services/api-handler.js.map +1 -1
  145. package/dist/server/services/api-handler.mjs +36 -5
  146. package/dist/server/services/api-handler.mjs.map +1 -1
  147. package/dist/server/services/content-structure.js +174 -0
  148. package/dist/server/services/content-structure.js.map +1 -0
  149. package/dist/server/services/content-structure.mjs +172 -0
  150. package/dist/server/services/content-structure.mjs.map +1 -0
  151. package/dist/server/services/content-types.js +196 -44
  152. package/dist/server/services/content-types.js.map +1 -1
  153. package/dist/server/services/content-types.mjs +195 -45
  154. package/dist/server/services/content-types.mjs.map +1 -1
  155. package/dist/server/services/index.js +3 -1
  156. package/dist/server/services/index.js.map +1 -1
  157. package/dist/server/services/index.mjs +3 -1
  158. package/dist/server/services/index.mjs.map +1 -1
  159. package/dist/server/services/schema-builder/index.js +4 -2
  160. package/dist/server/services/schema-builder/index.js.map +1 -1
  161. package/dist/server/services/schema-builder/index.mjs +4 -2
  162. package/dist/server/services/schema-builder/index.mjs.map +1 -1
  163. package/dist/server/services/schema-builder/schema-handler.js +16 -16
  164. package/dist/server/services/schema-builder/schema-handler.js.map +1 -1
  165. package/dist/server/services/schema-builder/schema-handler.mjs +16 -16
  166. package/dist/server/services/schema-builder/schema-handler.mjs.map +1 -1
  167. package/dist/server/services/schema-mutation.js +46 -0
  168. package/dist/server/services/schema-mutation.js.map +1 -0
  169. package/dist/server/services/schema-mutation.mjs +43 -0
  170. package/dist/server/services/schema-mutation.mjs.map +1 -0
  171. package/dist/server/services/schema.js +134 -79
  172. package/dist/server/services/schema.js.map +1 -1
  173. package/dist/server/services/schema.mjs +135 -80
  174. package/dist/server/services/schema.mjs.map +1 -1
  175. package/dist/server/src/controllers/schema.d.ts.map +1 -1
  176. package/dist/server/src/controllers/validation/common.d.ts +1 -0
  177. package/dist/server/src/controllers/validation/common.d.ts.map +1 -1
  178. package/dist/server/src/controllers/validation/content-structure.d.ts +56 -0
  179. package/dist/server/src/controllers/validation/content-structure.d.ts.map +1 -0
  180. package/dist/server/src/controllers/validation/schema.d.ts +35 -0
  181. package/dist/server/src/controllers/validation/schema.d.ts.map +1 -1
  182. package/dist/server/src/index.d.ts +3 -0
  183. package/dist/server/src/index.d.ts.map +1 -1
  184. package/dist/server/src/routes/content-api.d.ts.map +1 -1
  185. package/dist/server/src/services/api-handler.d.ts +13 -1
  186. package/dist/server/src/services/api-handler.d.ts.map +1 -1
  187. package/dist/server/src/services/content-structure.d.ts +37 -0
  188. package/dist/server/src/services/content-structure.d.ts.map +1 -0
  189. package/dist/server/src/services/content-types.d.ts +4 -0
  190. package/dist/server/src/services/content-types.d.ts.map +1 -1
  191. package/dist/server/src/services/index.d.ts +4 -0
  192. package/dist/server/src/services/index.d.ts.map +1 -1
  193. package/dist/server/src/services/schema-builder/index.d.ts +3 -1
  194. package/dist/server/src/services/schema-builder/index.d.ts.map +1 -1
  195. package/dist/server/src/services/schema-builder/schema-handler.d.ts.map +1 -1
  196. package/dist/server/src/services/schema-mutation.d.ts +26 -0
  197. package/dist/server/src/services/schema-mutation.d.ts.map +1 -0
  198. package/dist/server/src/services/schema.d.ts +1 -0
  199. package/dist/server/src/services/schema.d.ts.map +1 -1
  200. package/dist/server/src/utils/index.d.ts +2 -0
  201. package/dist/server/src/utils/index.d.ts.map +1 -1
  202. package/dist/server/utils/index.js.map +1 -1
  203. package/dist/server/utils/index.mjs.map +1 -1
  204. package/package.json +6 -6
  205. package/dist/admin/components/ContentTypeBuilderNav/useContentTypeBuilderMenu.js +0 -157
  206. package/dist/admin/components/ContentTypeBuilderNav/useContentTypeBuilderMenu.js.map +0 -1
  207. package/dist/admin/components/ContentTypeBuilderNav/useContentTypeBuilderMenu.mjs +0 -151
  208. package/dist/admin/components/ContentTypeBuilderNav/useContentTypeBuilderMenu.mjs.map +0 -1
@@ -0,0 +1,198 @@
1
+ import { jsx, jsxs } from 'react/jsx-runtime';
2
+ import { useMemo } from 'react';
3
+ import { ComboboxOption, Field, Combobox } from '@strapi/design-system';
4
+ import { useIntl } from 'react-intl';
5
+ import { useDataManager } from './DataManager/useDataManager.mjs';
6
+ import { sectionKeyForKind, findSiblingFolderByName } from './DataManager/utils/contentStructure.mjs';
7
+ import { useFormModalNavigation } from './FormModalNavigation/useFormModalNavigation.mjs';
8
+
9
+ /**
10
+ * Flatten a section's (flat) folder groups into a list of full folder path strings.
11
+ */ const buildFolderOptions = (groups)=>{
12
+ const groupById = new Map(groups.map((group)=>[
13
+ group.id,
14
+ group
15
+ ]));
16
+ const childGroupIds = new Set();
17
+ for (const group of groups){
18
+ for (const child of group.children){
19
+ if (child.type === 'group') {
20
+ childGroupIds.add(child.id);
21
+ }
22
+ }
23
+ }
24
+ const options = [];
25
+ const walk = (group, ancestors)=>{
26
+ const path = [
27
+ ...ancestors,
28
+ group.name
29
+ ];
30
+ options.push({
31
+ id: group.id,
32
+ label: path.join(' / ')
33
+ });
34
+ for (const child of group.children){
35
+ if (child.type !== 'group') {
36
+ continue;
37
+ }
38
+ const subGroup = groupById.get(child.id);
39
+ if (subGroup) {
40
+ walk(subGroup, path);
41
+ }
42
+ }
43
+ };
44
+ groups.filter((group)=>{
45
+ return !childGroupIds.has(group.id);
46
+ }).forEach((root)=>{
47
+ return walk(root, []);
48
+ });
49
+ return options;
50
+ };
51
+ const FolderSelect = ({ error = null, modifiedData, placeholder, isCreating, intlLabel, targetUid, onChange, value, name })=>{
52
+ const { kind: modalKind } = useFormModalNavigation();
53
+ const { contentStructure } = useDataManager();
54
+ const { formatMessage } = useIntl();
55
+ const kind = modifiedData?.kind ?? modalKind ?? 'collectionType';
56
+ const section = sectionKeyForKind(kind);
57
+ const groups = contentStructure.sections[section].groups;
58
+ const folderOptions = useMemo(()=>{
59
+ return buildFolderOptions(groups);
60
+ }, [
61
+ groups
62
+ ]);
63
+ const knownFolderIds = useMemo(()=>{
64
+ return new Set(folderOptions.map((option)=>option.id));
65
+ }, [
66
+ folderOptions
67
+ ]);
68
+ const currentFolderId = useMemo(()=>{
69
+ if (isCreating || !targetUid) {
70
+ return null;
71
+ }
72
+ const owner = groups.find((group)=>{
73
+ return group.children.some((child)=>{
74
+ return child.type === 'contentType' && child.uid === targetUid;
75
+ });
76
+ });
77
+ return owner?.id ?? null;
78
+ }, [
79
+ groups,
80
+ isCreating,
81
+ targetUid
82
+ ]);
83
+ const change = (next)=>{
84
+ onChange({
85
+ target: {
86
+ name,
87
+ value: next,
88
+ type: 'content-type-folder-select'
89
+ }
90
+ });
91
+ };
92
+ const changeToFolderId = (id)=>{
93
+ change(id === currentFolderId ? undefined : {
94
+ targetGroupId: id
95
+ });
96
+ };
97
+ const selectTypedName = (typed)=>{
98
+ const trimmed = typed.trim();
99
+ if (!trimmed) {
100
+ return;
101
+ }
102
+ const existing = findSiblingFolderByName(groups, null, trimmed);
103
+ if (existing) {
104
+ changeToFolderId(existing.id);
105
+ return;
106
+ }
107
+ change({
108
+ newFolderName: trimmed
109
+ });
110
+ };
111
+ const selectedValue = (()=>{
112
+ if (value === undefined) {
113
+ return currentFolderId ?? '';
114
+ }
115
+ if ('newFolderName' in value) {
116
+ return value.newFolderName;
117
+ }
118
+ return value.targetGroupId ?? '';
119
+ })();
120
+ const selectedLabel = (()=>{
121
+ if (value && 'newFolderName' in value) {
122
+ return value.newFolderName;
123
+ }
124
+ return folderOptions.find(({ id })=>id === selectedValue)?.label ?? '';
125
+ })();
126
+ const handleChange = (nextValue)=>{
127
+ if (!nextValue) {
128
+ return;
129
+ }
130
+ if (knownFolderIds.has(nextValue)) {
131
+ changeToFolderId(nextValue);
132
+ return;
133
+ }
134
+ selectTypedName(nextValue);
135
+ };
136
+ const handleCreateOption = (nextValue)=>{
137
+ if (!nextValue) {
138
+ return;
139
+ }
140
+ selectTypedName(nextValue);
141
+ };
142
+ const handleClear = ()=>{
143
+ // In edit an explicit clear ungroups the content type. In create it just returns the field to its "no folder" default.
144
+ change(isCreating ? undefined : {
145
+ targetGroupId: null
146
+ });
147
+ };
148
+ const errorMessage = error ? formatMessage({
149
+ id: error,
150
+ defaultMessage: error
151
+ }) : '';
152
+ const placeholderText = placeholder ? formatMessage(placeholder) : undefined;
153
+ const label = formatMessage(intlLabel);
154
+ const comboboxOptions = useMemo(()=>{
155
+ const options = [];
156
+ for (const option of folderOptions){
157
+ options.push(/*#__PURE__*/ jsx(ComboboxOption, {
158
+ value: option.id,
159
+ children: option.label
160
+ }, option.id));
161
+ }
162
+ // A new folder name typed into the combobox doesn't exist as a group yet, so we append it as its own option value.
163
+ if (selectedValue && !knownFolderIds.has(selectedValue)) {
164
+ options.push(/*#__PURE__*/ jsx(ComboboxOption, {
165
+ value: selectedValue,
166
+ children: selectedValue
167
+ }, `new:${selectedValue}`));
168
+ }
169
+ return options;
170
+ }, [
171
+ folderOptions,
172
+ knownFolderIds,
173
+ selectedValue
174
+ ]);
175
+ return /*#__PURE__*/ jsxs(Field.Root, {
176
+ error: errorMessage,
177
+ name: name,
178
+ children: [
179
+ /*#__PURE__*/ jsx(Field.Label, {
180
+ children: label
181
+ }),
182
+ /*#__PURE__*/ jsx(Combobox, {
183
+ defaultTextValue: selectedLabel || undefined,
184
+ onCreateOption: handleCreateOption,
185
+ value: selectedValue || undefined,
186
+ placeholder: placeholderText,
187
+ onChange: handleChange,
188
+ onClear: handleClear,
189
+ creatable: true,
190
+ children: comboboxOptions
191
+ }, section),
192
+ /*#__PURE__*/ jsx(Field.Error, {})
193
+ ]
194
+ });
195
+ };
196
+
197
+ export { FolderSelect };
198
+ //# sourceMappingURL=FolderSelect.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FolderSelect.mjs","sources":["../../../admin/src/components/FolderSelect.tsx"],"sourcesContent":["import { ReactNode, useMemo } from 'react';\n\nimport { Combobox, ComboboxOption, Field } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\n\nimport { useDataManager } from './DataManager/useDataManager';\nimport { findSiblingFolderByName, sectionKeyForKind } from './DataManager/utils/contentStructure';\nimport { useFormModalNavigation } from './FormModalNavigation/useFormModalNavigation';\n\nimport type { FormChangeHandler, IntlLabel } from '../types';\nimport type { ContentStructureGroup, FolderSelection } from './DataManager/utils/contentStructure';\nimport type { Struct } from '@strapi/types';\n\ninterface FolderSelectProps {\n onChange: FormChangeHandler<FolderSelection | undefined, 'content-type-folder-select'>;\n modifiedData?: { kind?: Struct.ContentTypeKind };\n value?: FolderSelection;\n placeholder?: IntlLabel;\n error?: string | null;\n isCreating?: boolean;\n intlLabel: IntlLabel;\n targetUid?: string;\n name: string;\n}\n\ntype FolderOption = { id: string; label: string };\n\n/**\n * Flatten a section's (flat) folder groups into a list of full folder path strings.\n */\nconst buildFolderOptions = (groups: ContentStructureGroup[]): FolderOption[] => {\n const groupById = new Map(groups.map((group) => [group.id, group]));\n\n const childGroupIds = new Set<string>();\n\n for (const group of groups) {\n for (const child of group.children) {\n if (child.type === 'group') {\n childGroupIds.add(child.id);\n }\n }\n }\n\n const options: FolderOption[] = [];\n\n const walk = (group: ContentStructureGroup, ancestors: string[]) => {\n const path = [...ancestors, group.name];\n options.push({ id: group.id, label: path.join(' / ') });\n\n for (const child of group.children) {\n if (child.type !== 'group') {\n continue;\n }\n\n const subGroup = groupById.get(child.id);\n\n if (subGroup) {\n walk(subGroup, path);\n }\n }\n };\n\n groups\n .filter((group) => {\n return !childGroupIds.has(group.id);\n })\n .forEach((root) => {\n return walk(root, []);\n });\n\n return options;\n};\n\nexport const FolderSelect = ({\n error = null,\n modifiedData,\n placeholder,\n isCreating,\n intlLabel,\n targetUid,\n onChange,\n value,\n name,\n}: FolderSelectProps) => {\n const { kind: modalKind } = useFormModalNavigation();\n const { contentStructure } = useDataManager();\n const { formatMessage } = useIntl();\n\n const kind = (modifiedData?.kind ?? modalKind ?? 'collectionType') as Struct.ContentTypeKind;\n const section = sectionKeyForKind(kind);\n const groups = contentStructure.sections[section].groups;\n\n const folderOptions = useMemo(() => {\n return buildFolderOptions(groups);\n }, [groups]);\n const knownFolderIds = useMemo(() => {\n return new Set(folderOptions.map((option) => option.id));\n }, [folderOptions]);\n\n const currentFolderId = useMemo(() => {\n if (isCreating || !targetUid) {\n return null;\n }\n\n const owner = groups.find((group) => {\n return group.children.some((child) => {\n return child.type === 'contentType' && child.uid === targetUid;\n });\n });\n\n return owner?.id ?? null;\n }, [groups, isCreating, targetUid]);\n\n const change = (next: FolderSelection | undefined) => {\n onChange({ target: { name, value: next, type: 'content-type-folder-select' } });\n };\n\n const changeToFolderId = (id: string) => {\n change(id === currentFolderId ? undefined : { targetGroupId: id });\n };\n\n const selectTypedName = (typed: string) => {\n const trimmed = typed.trim();\n\n if (!trimmed) {\n return;\n }\n\n const existing = findSiblingFolderByName(groups, null, trimmed);\n\n if (existing) {\n changeToFolderId(existing.id);\n return;\n }\n\n change({ newFolderName: trimmed });\n };\n\n const selectedValue = (() => {\n if (value === undefined) {\n return currentFolderId ?? '';\n }\n\n if ('newFolderName' in value) {\n return value.newFolderName;\n }\n\n return value.targetGroupId ?? '';\n })();\n\n const selectedLabel = (() => {\n if (value && 'newFolderName' in value) {\n return value.newFolderName;\n }\n return folderOptions.find(({ id }) => id === selectedValue)?.label ?? '';\n })();\n\n const handleChange = (nextValue?: string) => {\n if (!nextValue) {\n return;\n }\n\n if (knownFolderIds.has(nextValue)) {\n changeToFolderId(nextValue);\n return;\n }\n\n selectTypedName(nextValue);\n };\n\n const handleCreateOption = (nextValue?: string) => {\n if (!nextValue) {\n return;\n }\n\n selectTypedName(nextValue);\n };\n\n const handleClear = () => {\n // In edit an explicit clear ungroups the content type. In create it just returns the field to its \"no folder\" default.\n change(isCreating ? undefined : { targetGroupId: null });\n };\n\n const errorMessage = error ? formatMessage({ id: error, defaultMessage: error }) : '';\n const placeholderText = placeholder ? formatMessage(placeholder) : undefined;\n const label = formatMessage(intlLabel);\n\n const comboboxOptions = useMemo(() => {\n const options: ReactNode[] = [];\n\n for (const option of folderOptions) {\n options.push(\n <ComboboxOption key={option.id} value={option.id}>\n {option.label}\n </ComboboxOption>\n );\n }\n\n // A new folder name typed into the combobox doesn't exist as a group yet, so we append it as its own option value.\n if (selectedValue && !knownFolderIds.has(selectedValue)) {\n options.push(\n <ComboboxOption key={`new:${selectedValue}`} value={selectedValue}>\n {selectedValue}\n </ComboboxOption>\n );\n }\n\n return options;\n }, [folderOptions, knownFolderIds, selectedValue]);\n\n return (\n <Field.Root error={errorMessage} name={name}>\n <Field.Label>{label}</Field.Label>\n <Combobox\n key={section} // This forces the input to regenerate its defaultTextValue when the kind changes.\n defaultTextValue={selectedLabel || undefined}\n onCreateOption={handleCreateOption}\n value={selectedValue || undefined}\n placeholder={placeholderText}\n onChange={handleChange}\n onClear={handleClear}\n creatable\n >\n {comboboxOptions}\n </Combobox>\n <Field.Error />\n </Field.Root>\n );\n};\n"],"names":["buildFolderOptions","groups","groupById","Map","map","group","id","childGroupIds","Set","child","children","type","add","options","walk","ancestors","path","name","push","label","join","subGroup","get","filter","has","forEach","root","FolderSelect","error","modifiedData","placeholder","isCreating","intlLabel","targetUid","onChange","value","kind","modalKind","useFormModalNavigation","contentStructure","useDataManager","formatMessage","useIntl","section","sectionKeyForKind","sections","folderOptions","useMemo","knownFolderIds","option","currentFolderId","owner","find","some","uid","change","next","target","changeToFolderId","undefined","targetGroupId","selectTypedName","typed","trimmed","trim","existing","findSiblingFolderByName","newFolderName","selectedValue","selectedLabel","handleChange","nextValue","handleCreateOption","handleClear","errorMessage","defaultMessage","placeholderText","comboboxOptions","_jsx","ComboboxOption","_jsxs","Field","Root","Label","Combobox","defaultTextValue","onCreateOption","onClear","creatable","Error"],"mappings":"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"}
@@ -18,6 +18,7 @@ var getTrad = require('../../utils/getTrad.js');
18
18
  var isAllowedContentTypesForRelations = require('../../utils/isAllowedContentTypesForRelations.js');
19
19
  var conditions = require('../../utils/conditions.js');
20
20
  var findAttribute = require('../../utils/findAttribute.js');
21
+ var folderTelemetry = require('../../utils/folderTelemetry.js');
21
22
  var getYupInnerErrors = require('../../utils/getYupInnerErrors.js');
22
23
  var AllowedTypesSelect = require('../AllowedTypesSelect.js');
23
24
  var AttributeOptions = require('../AttributeOptions/AttributeOptions.js');
@@ -30,6 +31,7 @@ var useCTBTracking = require('../CTBSession/useCTBTracking.js');
30
31
  var CustomRadioGroup = require('../CustomRadioGroup/CustomRadioGroup.js');
31
32
  var useDataManager = require('../DataManager/useDataManager.js');
32
33
  var DraftAndPublishToggle = require('../DraftAndPublishToggle.js');
34
+ var FolderSelect = require('../FolderSelect.js');
33
35
  var FormModalEndActions = require('../FormModalEndActions.js');
34
36
  var FormModalHeader = require('../FormModalHeader.js');
35
37
  var useFormModalNavigation = require('../FormModalNavigation/useFormModalNavigation.js');
@@ -418,6 +420,20 @@ const FormModal = ()=>{
418
420
  }));
419
421
  sendButtonAddMoreFieldEvent(shouldContinue);
420
422
  const ctTargetUid = targetUid;
423
+ const folderSelection = modifiedData.folder;
424
+ const trackFolderAssignment = ()=>{
425
+ if (!folderSelection) {
426
+ return;
427
+ }
428
+ if ('newFolderName' in folderSelection) {
429
+ trackUsage(folderTelemetry.DID_ACT_ON_FOLDERS, {
430
+ operation: folderTelemetry.folderTelemetryOperation('create')
431
+ });
432
+ }
433
+ trackUsage(folderTelemetry.DID_ACT_ON_FOLDERS, {
434
+ operation: folderTelemetry.folderTelemetryOperation('assign')
435
+ });
436
+ };
421
437
  if (isCreatingContentType) {
422
438
  // Create the content type schema
423
439
  if (isCreating) {
@@ -430,8 +446,10 @@ const FormModal = ()=>{
430
446
  singularName: toStringValue(modifiedData.singularName),
431
447
  pluralName: toStringValue(modifiedData.pluralName)
432
448
  },
433
- uid
449
+ uid,
450
+ folder: folderSelection
434
451
  });
452
+ trackFolderAssignment();
435
453
  // Redirect the user to the created content type
436
454
  navigate({
437
455
  pathname: `/plugins/${pluginId.pluginId}/content-types/${uid}`
@@ -450,8 +468,10 @@ const FormModal = ()=>{
450
468
  kind: toContentTypeKind(modifiedData.kind),
451
469
  draftAndPublish: toBooleanValue(modifiedData.draftAndPublish),
452
470
  pluginOptions: toRecordValue(modifiedData.pluginOptions)
453
- }
471
+ },
472
+ folder: folderSelection
454
473
  });
474
+ trackFolderAssignment();
455
475
  } else {
456
476
  toggleNotification({
457
477
  type: 'danger',
@@ -837,6 +857,7 @@ const FormModal = ()=>{
837
857
  'checkbox-with-number-field': CheckboxWithNumberField.CheckboxWithNumberField,
838
858
  'icon-picker': IconPicker.IconPicker,
839
859
  'content-type-radio-group': ContentTypeRadioGroup.ContentTypeRadioGroup,
860
+ 'content-type-folder-select': FolderSelect.FolderSelect,
840
861
  'radio-group': CustomRadioGroup.CustomRadioGroup,
841
862
  relation: Relation.Relation,
842
863
  'select-category': SelectCategory.SelectCategory,