@strapi/content-type-builder 5.53.0 → 5.55.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 (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 +19 -17
  164. package/dist/server/services/schema-builder/schema-handler.js.map +1 -1
  165. package/dist/server/services/schema-builder/schema-handler.mjs +19 -17
  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 +8 -8
  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,376 @@
1
+ import { jsx, jsxs } from 'react/jsx-runtime';
2
+ import { useRef } from 'react';
3
+ import { useSortable } from '@dnd-kit/sortable';
4
+ import { Flex, Box, Menu, VisuallyHidden, Typography } from '@strapi/design-system';
5
+ import { More, Pencil, Trash, ChevronDown } from '@strapi/icons';
6
+ import { useIntl } from 'react-intl';
7
+ import { NavLink } from 'react-router-dom';
8
+ import { styled, css } from 'styled-components';
9
+ import { getTrad } from '../../../../utils/getTrad.mjs';
10
+ import { Status } from '../../../Status.mjs';
11
+ import { FolderNameField } from './FolderNameField.mjs';
12
+
13
+ /**
14
+ * The drop-position indicator is absolutely positioned so that it does not displace
15
+ * a row and cause cyclical layout shifts.
16
+ * It is justified to the right edge of the row and its width is based on the
17
+ * depth of the destination it indicates.
18
+ */ const DropIndicator = styled.span`
19
+ position: absolute;
20
+ left: ${({ theme, $indentDepth })=>`calc(${$indentDepth} * ${theme.spaces[6]})`};
21
+ right: 0;
22
+ ${({ $edge })=>$edge === 'top' ? 'top: 0;' : 'bottom: 0;'}
23
+ transform: ${({ $edge })=>$edge === 'top' ? 'translateY(-1px)' : 'translateY(1px)'};
24
+
25
+ height: 2px;
26
+ background-color: ${({ theme })=>theme.colors.primary600};
27
+ border-radius: 2px;
28
+ pointer-events: none;
29
+ z-index: 2;
30
+
31
+ &::before {
32
+ content: '';
33
+
34
+ position: absolute;
35
+ top: 50%;
36
+ left: 0;
37
+ width: 6px;
38
+ height: 6px;
39
+ border-radius: 50%;
40
+ background-color: ${({ theme })=>theme.colors.primary600};
41
+ transform: translate(-50%, -50%);
42
+ }
43
+ `;
44
+ const MenuTrigger = styled(Menu.Trigger)`
45
+ display: flex;
46
+ align-items: center;
47
+ justify-content: center;
48
+ width: 16px;
49
+ height: 16px;
50
+ padding: 0;
51
+
52
+ position: relative;
53
+ z-index: 1;
54
+ `;
55
+ const Row = styled(Flex)`
56
+ position: relative;
57
+ border-radius: ${({ theme })=>theme.borderRadius};
58
+
59
+ padding-right: ${({ theme })=>theme.spaces[3]};
60
+ padding-block: ${({ theme })=>theme.spaces[2]};
61
+ padding-left: ${({ theme })=>theme.spaces[3]};
62
+ padding-left: ${({ theme, $depth })=>`calc(${$depth} * ${theme.spaces[6]} + ${theme.spaces[3]})`};
63
+
64
+ background-color: ${({ $dropTarget, theme })=>$dropTarget ? theme.colors.primary100 : 'transparent'};
65
+ outline: ${({ $dropTarget, theme })=>$dropTarget ? `1px solid ${theme.colors.primary600}` : 'none'};
66
+ outline-offset: -1px;
67
+
68
+ ${MenuTrigger} {
69
+ opacity: 0;
70
+ transition: opacity 0.1s ease-out;
71
+ }
72
+
73
+ /*
74
+ * This selects for the opened Radix popover menu so that the hover state doesn't disappear while it is open.
75
+ */
76
+ &:hover,
77
+ &:has([data-state='open']) {
78
+ background-color: ${({ $dropTarget, theme })=>$dropTarget ? theme.colors.primary100 : theme.colors.neutral100};
79
+ }
80
+
81
+ &:hover ${MenuTrigger}, &:focus-within ${MenuTrigger}, &:has([data-state='open']) ${MenuTrigger} {
82
+ opacity: 1;
83
+ }
84
+
85
+ ${({ $dragging })=>$dragging && css`
86
+ & > *:not(${DropIndicator}) {
87
+ opacity: 0.4;
88
+ }
89
+ `}
90
+ `;
91
+ const GrabArea = styled.button`
92
+ display: flex;
93
+ align-items: center;
94
+ flex: 1;
95
+ min-width: 0;
96
+ gap: ${({ theme })=>theme.spaces[2]};
97
+
98
+ height: 100%;
99
+ padding: 0;
100
+ border: none;
101
+ background: transparent;
102
+ text-align: left;
103
+ cursor: pointer;
104
+
105
+ /* The interactive area must be larger than the contents-driven hit area. */
106
+ &::before {
107
+ content: '';
108
+ position: absolute;
109
+ inset: 0;
110
+ }
111
+
112
+ &:focus-visible {
113
+ outline-offset: -2px;
114
+ }
115
+ `;
116
+ const ContentTypeLink = styled(NavLink)`
117
+ display: flex;
118
+ align-items: center;
119
+ flex: 1;
120
+ min-width: 0;
121
+ gap: ${({ theme })=>theme.spaces[2]};
122
+
123
+ height: 100%;
124
+ text-decoration: none;
125
+ color: ${({ theme })=>theme.colors.neutral800};
126
+
127
+ &.active {
128
+ color: ${({ theme })=>theme.colors.primary700};
129
+ font-weight: 500;
130
+ }
131
+
132
+ /* The interactive area must be larger than the contents-driven hit area. */
133
+ &::before {
134
+ content: '';
135
+ position: absolute;
136
+ inset: 0;
137
+ }
138
+
139
+ &:focus-visible {
140
+ outline-offset: -2px;
141
+ }
142
+ `;
143
+ const Glyph = styled.span`
144
+ display: inline-flex;
145
+ align-items: center;
146
+ justify-content: center;
147
+ flex: 0 0 16px;
148
+ `;
149
+ const Bullet = styled(Glyph)`
150
+ &::before {
151
+ content: '';
152
+ width: 4px;
153
+ height: 4px;
154
+ border-radius: 50%;
155
+ background-color: currentColor;
156
+ }
157
+ `;
158
+ const Label = styled(Typography)`
159
+ flex: 1;
160
+ min-width: 0;
161
+ overflow: hidden;
162
+ text-overflow: ellipsis;
163
+ white-space: nowrap;
164
+ `;
165
+ const SortableTreeRow = ({ item, handlers })=>{
166
+ const { formatMessage } = useIntl();
167
+ const renameSelectedRef = useRef(false); // Tracks when the "rename" option is clicked in the popover so Radix's default "restore focus to menu trigger on menu close" behavior doesn't compete with our desired focus on the inline input.
168
+ const { listeners, setNodeRef, isDragging } = useSortable({
169
+ animateLayoutChanges: ()=>false,
170
+ disabled: !handlers.canEdit,
171
+ id: item.id
172
+ });
173
+ const dragListeners = handlers.canEdit ? listeners : undefined;
174
+ const depth = item.depth;
175
+ const node = item.node;
176
+ const canToggle = Boolean(handlers.canToggle);
177
+ const dropLine = handlers.dropLine && handlers.dropLine.anchorId === item.id ? handlers.dropLine : null;
178
+ if (node.type === 'folder' && handlers.canEdit && handlers.editingId === node.id) {
179
+ const validateFolderName = (name)=>{
180
+ return handlers.validateFolderName({
181
+ name,
182
+ parentId: node.parentId,
183
+ excludeId: node.id
184
+ });
185
+ };
186
+ const onFolderNameSubmit = (name)=>{
187
+ if (name === node.name) {
188
+ handlers.onCancelRename();
189
+ return;
190
+ }
191
+ handlers.onSubmitRename(node.id, name);
192
+ };
193
+ return /*#__PURE__*/ jsx("div", {
194
+ ref: setNodeRef,
195
+ children: /*#__PURE__*/ jsx(FolderNameField, {
196
+ onCancel: handlers.onCancelRename,
197
+ onSubmit: onFolderNameSubmit,
198
+ validate: validateFolderName,
199
+ defaultValue: node.name,
200
+ depth: item.depth
201
+ })
202
+ });
203
+ }
204
+ const trailingContents = /*#__PURE__*/ jsxs(Flex, {
205
+ gap: 1,
206
+ alignItems: "center",
207
+ onPointerDown: (e)=>{
208
+ // Prevent propagation when the interactive elements container is clicked as not to compete with the row's drag detection.
209
+ e.stopPropagation();
210
+ },
211
+ children: [
212
+ node.type === 'contentType' && /*#__PURE__*/ jsx(Box, {
213
+ tag: "span",
214
+ textAlign: "center",
215
+ width: "24px",
216
+ children: /*#__PURE__*/ jsx(Status, {
217
+ status: node.status
218
+ })
219
+ }),
220
+ node.type === 'folder' && handlers.canEdit && /*#__PURE__*/ jsxs(Menu.Root, {
221
+ children: [
222
+ /*#__PURE__*/ jsx(MenuTrigger, {
223
+ variant: "ghost",
224
+ endIcon: null,
225
+ size: "S",
226
+ "aria-label": formatMessage({
227
+ id: getTrad('nav.folder.actions-label'),
228
+ defaultMessage: 'Actions for {name}'
229
+ }, {
230
+ name: node.name
231
+ }),
232
+ children: /*#__PURE__*/ jsx(More, {
233
+ "aria-hidden": true,
234
+ focusable: false
235
+ })
236
+ }),
237
+ /*#__PURE__*/ jsxs(Menu.Content, {
238
+ zIndex: 2,
239
+ onCloseAutoFocus: (event)=>{
240
+ if (renameSelectedRef.current) {
241
+ event.preventDefault();
242
+ }
243
+ renameSelectedRef.current = false;
244
+ },
245
+ children: [
246
+ /*#__PURE__*/ jsx(Menu.Item, {
247
+ onSelect: ()=>{
248
+ renameSelectedRef.current = true;
249
+ handlers.onBeginRename(node.id);
250
+ },
251
+ startIcon: /*#__PURE__*/ jsx(Pencil, {}),
252
+ children: formatMessage({
253
+ id: getTrad('nav.folder.rename'),
254
+ defaultMessage: 'Rename'
255
+ })
256
+ }),
257
+ /*#__PURE__*/ jsx(Menu.Separator, {}),
258
+ /*#__PURE__*/ jsx(Menu.Item, {
259
+ onSelect: ()=>handlers.onDeleteFolder(node),
260
+ startIcon: /*#__PURE__*/ jsx(Trash, {}),
261
+ variant: "danger",
262
+ children: formatMessage({
263
+ id: getTrad('nav.folder.delete'),
264
+ defaultMessage: 'Delete folder'
265
+ })
266
+ }),
267
+ node.children.length > 0 && /*#__PURE__*/ jsx(Menu.Item, {
268
+ onSelect: ()=>handlers.onDeleteFolderAndContent(node),
269
+ startIcon: /*#__PURE__*/ jsx(Trash, {}),
270
+ children: formatMessage({
271
+ id: getTrad('nav.folder.delete-with-content'),
272
+ defaultMessage: 'Delete folder and contents'
273
+ })
274
+ })
275
+ ]
276
+ })
277
+ ]
278
+ })
279
+ ]
280
+ });
281
+ return /*#__PURE__*/ jsxs(Row, {
282
+ ref: setNodeRef,
283
+ ...dragListeners,
284
+ alignItems: "center",
285
+ $dropTarget: handlers.dropTargetId === item.id,
286
+ $dragging: isDragging,
287
+ $depth: depth,
288
+ children: [
289
+ node.type === 'folder' ? /*#__PURE__*/ jsxs(GrabArea, {
290
+ "aria-expanded": canToggle ? !handlers.isCollapsed(node.id) : undefined,
291
+ onClick: canToggle ? ()=>handlers.onToggle(node.id) : undefined,
292
+ style: canToggle ? undefined : {
293
+ cursor: 'default'
294
+ },
295
+ type: canToggle ? 'button' : undefined,
296
+ as: canToggle ? 'button' : 'span',
297
+ children: [
298
+ /*#__PURE__*/ jsx(Glyph, {
299
+ "aria-hidden": true,
300
+ children: /*#__PURE__*/ jsx(ChevronDown, {
301
+ fill: "neutral500",
302
+ style: {
303
+ transform: handlers.isCollapsed(node.id) ? 'rotate(-90deg)' : 'none',
304
+ transition: 'transform 0.2s'
305
+ }
306
+ })
307
+ }),
308
+ /*#__PURE__*/ jsx(Label, {
309
+ tag: "span",
310
+ textColor: "neutral800",
311
+ fontWeight: "semiBold",
312
+ children: node.name
313
+ })
314
+ ]
315
+ }) : /*#__PURE__*/ jsxs(ContentTypeLink, {
316
+ to: node.to,
317
+ draggable: false,
318
+ children: [
319
+ /*#__PURE__*/ jsx(Bullet, {
320
+ "aria-hidden": true
321
+ }),
322
+ /*#__PURE__*/ jsx(Label, {
323
+ tag: "span",
324
+ children: node.title
325
+ })
326
+ ]
327
+ }),
328
+ trailingContents,
329
+ dropLine && /*#__PURE__*/ jsx(DropIndicator, {
330
+ $indentDepth: dropLine.depth,
331
+ $edge: dropLine.edge,
332
+ "aria-hidden": true
333
+ })
334
+ ]
335
+ });
336
+ };
337
+ /**
338
+ * This is rendered in place of the actual row when it is being dragged.
339
+ */ const RowOverlay = ({ item })=>{
340
+ const { formatMessage } = useIntl();
341
+ const node = item.node;
342
+ const name = node.type === 'folder' ? node.name : node.title;
343
+ return /*#__PURE__*/ jsxs(Row, {
344
+ style: {
345
+ cursor: 'grabbing'
346
+ },
347
+ background: "neutral0",
348
+ shadow: "filterShadow",
349
+ alignItems: "center",
350
+ $depth: 0,
351
+ children: [
352
+ /*#__PURE__*/ jsx(Glyph, {
353
+ "aria-hidden": true,
354
+ children: node.type === 'folder' ? /*#__PURE__*/ jsx(ChevronDown, {
355
+ fill: "neutral500"
356
+ }) : /*#__PURE__*/ jsx(Bullet, {})
357
+ }),
358
+ /*#__PURE__*/ jsx(Label, {
359
+ tag: "span",
360
+ fontWeight: node.type === 'folder' ? 'semiBold' : 'regular',
361
+ children: node.type === 'folder' ? node.name : node.title
362
+ }),
363
+ /*#__PURE__*/ jsx(VisuallyHidden, {
364
+ children: formatMessage({
365
+ id: getTrad('nav.folder.dragging'),
366
+ defaultMessage: 'Dragging {name}'
367
+ }, {
368
+ name
369
+ })
370
+ })
371
+ ]
372
+ });
373
+ };
374
+
375
+ export { RowOverlay, SortableTreeRow };
376
+ //# sourceMappingURL=SortableTreeRow.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SortableTreeRow.mjs","sources":["../../../../../../admin/src/components/ContentTypeBuilderNav/components/FolderNav/SortableTreeRow.tsx"],"sourcesContent":["import { useRef } from 'react';\n\nimport { useSortable } from '@dnd-kit/sortable';\nimport { Box, Flex, Menu, Typography, VisuallyHidden } from '@strapi/design-system';\nimport { ChevronDown, More, Pencil, Trash } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { NavLink } from 'react-router-dom';\nimport { css, styled } from 'styled-components';\n\nimport { getTrad } from '../../../../utils/getTrad';\nimport { Status } from '../../../Status';\n\nimport { FolderNameField } from './FolderNameField';\n\nimport type { SectionKey } from '../../../DataManager/utils/contentStructure';\nimport type { FolderNode } from '../../lib/buildFolderTree';\nimport type { FlatItem } from '../../lib/flatModel';\n\n/**\n * The drop-position indicator is absolutely positioned so that it does not displace\n * a row and cause cyclical layout shifts.\n * It is justified to the right edge of the row and its width is based on the\n * depth of the destination it indicates.\n */\nconst DropIndicator = styled.span<{ $edge: 'top' | 'bottom'; $indentDepth: number }>`\n position: absolute;\n left: ${({ theme, $indentDepth }) => `calc(${$indentDepth} * ${theme.spaces[6]})`};\n right: 0;\n ${({ $edge }) => ($edge === 'top' ? 'top: 0;' : 'bottom: 0;')}\n transform: ${({ $edge }) => ($edge === 'top' ? 'translateY(-1px)' : 'translateY(1px)')};\n\n height: 2px;\n background-color: ${({ theme }) => theme.colors.primary600};\n border-radius: 2px;\n pointer-events: none;\n z-index: 2;\n\n &::before {\n content: '';\n\n position: absolute;\n top: 50%;\n left: 0;\n width: 6px;\n height: 6px;\n border-radius: 50%;\n background-color: ${({ theme }) => theme.colors.primary600};\n transform: translate(-50%, -50%);\n }\n`;\n\nconst MenuTrigger = styled(Menu.Trigger)`\n display: flex;\n align-items: center;\n justify-content: center;\n width: 16px;\n height: 16px;\n padding: 0;\n\n position: relative;\n z-index: 1;\n`;\n\nconst Row = styled(Flex)<{ $depth: number; $dropTarget?: boolean; $dragging?: boolean }>`\n position: relative;\n border-radius: ${({ theme }) => theme.borderRadius};\n\n padding-right: ${({ theme }) => theme.spaces[3]};\n padding-block: ${({ theme }) => theme.spaces[2]};\n padding-left: ${({ theme }) => theme.spaces[3]};\n padding-left: ${({ theme, $depth }) =>\n `calc(${$depth} * ${theme.spaces[6]} + ${theme.spaces[3]})`};\n\n background-color: ${({ $dropTarget, theme }) =>\n $dropTarget ? theme.colors.primary100 : 'transparent'};\n outline: ${({ $dropTarget, theme }) =>\n $dropTarget ? `1px solid ${theme.colors.primary600}` : 'none'};\n outline-offset: -1px;\n\n ${MenuTrigger} {\n opacity: 0;\n transition: opacity 0.1s ease-out;\n }\n\n /*\n * This selects for the opened Radix popover menu so that the hover state doesn't disappear while it is open.\n */\n &:hover,\n &:has([data-state='open']) {\n background-color: ${({ $dropTarget, theme }) =>\n $dropTarget ? theme.colors.primary100 : theme.colors.neutral100};\n }\n\n &:hover ${MenuTrigger}, &:focus-within ${MenuTrigger}, &:has([data-state='open']) ${MenuTrigger} {\n opacity: 1;\n }\n\n ${({ $dragging }) =>\n $dragging &&\n css`\n & > *:not(${DropIndicator}) {\n opacity: 0.4;\n }\n `}\n`;\n\nconst GrabArea = styled.button`\n display: flex;\n align-items: center;\n flex: 1;\n min-width: 0;\n gap: ${({ theme }) => theme.spaces[2]};\n\n height: 100%;\n padding: 0;\n border: none;\n background: transparent;\n text-align: left;\n cursor: pointer;\n\n /* The interactive area must be larger than the contents-driven hit area. */\n &::before {\n content: '';\n position: absolute;\n inset: 0;\n }\n\n &:focus-visible {\n outline-offset: -2px;\n }\n`;\n\nconst ContentTypeLink = styled(NavLink)`\n display: flex;\n align-items: center;\n flex: 1;\n min-width: 0;\n gap: ${({ theme }) => theme.spaces[2]};\n\n height: 100%;\n text-decoration: none;\n color: ${({ theme }) => theme.colors.neutral800};\n\n &.active {\n color: ${({ theme }) => theme.colors.primary700};\n font-weight: 500;\n }\n\n /* The interactive area must be larger than the contents-driven hit area. */\n &::before {\n content: '';\n position: absolute;\n inset: 0;\n }\n\n &:focus-visible {\n outline-offset: -2px;\n }\n`;\n\nconst Glyph = styled.span`\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex: 0 0 16px;\n`;\n\nconst Bullet = styled(Glyph)`\n &::before {\n content: '';\n width: 4px;\n height: 4px;\n border-radius: 50%;\n background-color: currentColor;\n }\n`;\n\nconst Label = styled(Typography)`\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n`;\n\nexport interface TreeHandlers {\n section: SectionKey;\n canEdit: boolean;\n /** Whether a folder can be collapsed / uncollapsed. */\n canToggle?: boolean;\n editingId: string | null;\n isCollapsed: (id: string) => boolean;\n onToggle: (id: string) => void;\n onBeginRename: (id: string) => void;\n onSubmitRename: (id: string, name: string) => void;\n onCancelRename: () => void;\n onDeleteFolder: (node: FolderNode) => void;\n onDeleteFolderAndContent: (node: FolderNode) => void;\n validateFolderName: (params: {\n name: string;\n parentId: string | null;\n excludeId?: string;\n }) => string | undefined;\n dropTargetId: string | null;\n dropLine: { anchorId: string; edge: 'top' | 'bottom'; depth: number } | null;\n}\n\nexport const SortableTreeRow = ({ item, handlers }: { item: FlatItem; handlers: TreeHandlers }) => {\n const { formatMessage } = useIntl();\n\n const renameSelectedRef = useRef(false); // Tracks when the \"rename\" option is clicked in the popover so Radix's default \"restore focus to menu trigger on menu close\" behavior doesn't compete with our desired focus on the inline input.\n\n const { listeners, setNodeRef, isDragging } = useSortable({\n animateLayoutChanges: () => false,\n disabled: !handlers.canEdit,\n id: item.id,\n });\n\n const dragListeners = handlers.canEdit ? listeners : undefined;\n\n const depth = item.depth;\n const node = item.node;\n\n const canToggle = Boolean(handlers.canToggle);\n\n const dropLine =\n handlers.dropLine && handlers.dropLine.anchorId === item.id ? handlers.dropLine : null;\n\n if (node.type === 'folder' && handlers.canEdit && handlers.editingId === node.id) {\n const validateFolderName = (name: string) => {\n return handlers.validateFolderName({ name, parentId: node.parentId, excludeId: node.id });\n };\n\n const onFolderNameSubmit = (name: string) => {\n if (name === node.name) {\n handlers.onCancelRename();\n return;\n }\n\n handlers.onSubmitRename(node.id, name);\n };\n\n return (\n <div ref={setNodeRef}>\n <FolderNameField\n onCancel={handlers.onCancelRename}\n onSubmit={onFolderNameSubmit}\n validate={validateFolderName}\n defaultValue={node.name}\n depth={item.depth}\n />\n </div>\n );\n }\n\n const trailingContents = (\n <Flex\n gap={1}\n alignItems=\"center\"\n onPointerDown={(e) => {\n // Prevent propagation when the interactive elements container is clicked as not to compete with the row's drag detection.\n e.stopPropagation();\n }}\n >\n {node.type === 'contentType' && (\n <Box tag=\"span\" textAlign=\"center\" width=\"24px\">\n <Status status={node.status} />\n </Box>\n )}\n {node.type === 'folder' && handlers.canEdit && (\n <Menu.Root>\n <MenuTrigger\n variant=\"ghost\"\n endIcon={null}\n size=\"S\"\n aria-label={formatMessage(\n { id: getTrad('nav.folder.actions-label'), defaultMessage: 'Actions for {name}' },\n { name: node.name }\n )}\n >\n <More aria-hidden focusable={false} />\n </MenuTrigger>\n <Menu.Content\n zIndex={2}\n onCloseAutoFocus={(event) => {\n if (renameSelectedRef.current) {\n event.preventDefault();\n }\n\n renameSelectedRef.current = false;\n }}\n >\n <Menu.Item\n onSelect={() => {\n renameSelectedRef.current = true;\n handlers.onBeginRename(node.id);\n }}\n startIcon={<Pencil />}\n >\n {formatMessage({ id: getTrad('nav.folder.rename'), defaultMessage: 'Rename' })}\n </Menu.Item>\n\n <Menu.Separator />\n <Menu.Item\n onSelect={() => handlers.onDeleteFolder(node)}\n startIcon={<Trash />}\n variant=\"danger\"\n >\n {formatMessage({ id: getTrad('nav.folder.delete'), defaultMessage: 'Delete folder' })}\n </Menu.Item>\n\n {node.children.length > 0 && (\n <Menu.Item\n onSelect={() => handlers.onDeleteFolderAndContent(node)}\n startIcon={<Trash />}\n >\n {formatMessage({\n id: getTrad('nav.folder.delete-with-content'),\n defaultMessage: 'Delete folder and contents',\n })}\n </Menu.Item>\n )}\n </Menu.Content>\n </Menu.Root>\n )}\n </Flex>\n );\n\n return (\n <Row\n ref={setNodeRef}\n {...dragListeners}\n alignItems=\"center\"\n $dropTarget={handlers.dropTargetId === item.id}\n $dragging={isDragging}\n $depth={depth}\n >\n {node.type === 'folder' ? (\n <GrabArea\n aria-expanded={canToggle ? !handlers.isCollapsed(node.id) : undefined}\n onClick={canToggle ? () => handlers.onToggle(node.id) : undefined}\n style={canToggle ? undefined : { cursor: 'default' }}\n type={canToggle ? 'button' : undefined}\n as={canToggle ? 'button' : 'span'}\n >\n <Glyph aria-hidden>\n <ChevronDown\n fill=\"neutral500\"\n style={{\n transform: handlers.isCollapsed(node.id) ? 'rotate(-90deg)' : 'none',\n transition: 'transform 0.2s',\n }}\n />\n </Glyph>\n <Label tag=\"span\" textColor=\"neutral800\" fontWeight=\"semiBold\">\n {node.name}\n </Label>\n </GrabArea>\n ) : (\n <ContentTypeLink to={node.to} draggable={false}>\n <Bullet aria-hidden />\n <Label tag=\"span\">{node.title}</Label>\n </ContentTypeLink>\n )}\n {trailingContents}\n {dropLine && (\n <DropIndicator $indentDepth={dropLine.depth} $edge={dropLine.edge} aria-hidden />\n )}\n </Row>\n );\n};\n\n/**\n * This is rendered in place of the actual row when it is being dragged.\n */\nexport const RowOverlay = ({ item }: { item: FlatItem }) => {\n const { formatMessage } = useIntl();\n const node = item.node;\n const name = node.type === 'folder' ? node.name : node.title;\n\n return (\n <Row\n style={{ cursor: 'grabbing' }}\n background=\"neutral0\"\n shadow=\"filterShadow\"\n alignItems=\"center\"\n $depth={0}\n >\n <Glyph aria-hidden>\n {node.type === 'folder' ? <ChevronDown fill=\"neutral500\" /> : <Bullet />}\n </Glyph>\n <Label tag=\"span\" fontWeight={node.type === 'folder' ? 'semiBold' : 'regular'}>\n {node.type === 'folder' ? node.name : node.title}\n </Label>\n <VisuallyHidden>\n {formatMessage(\n { id: getTrad('nav.folder.dragging'), defaultMessage: 'Dragging {name}' },\n { name }\n )}\n </VisuallyHidden>\n </Row>\n );\n};\n"],"names":["DropIndicator","styled","span","theme","$indentDepth","spaces","$edge","colors","primary600","MenuTrigger","Menu","Trigger","Row","Flex","borderRadius","$depth","$dropTarget","primary100","neutral100","$dragging","css","GrabArea","button","ContentTypeLink","NavLink","neutral800","primary700","Glyph","Bullet","Label","Typography","SortableTreeRow","item","handlers","formatMessage","useIntl","renameSelectedRef","useRef","listeners","setNodeRef","isDragging","useSortable","animateLayoutChanges","disabled","canEdit","id","dragListeners","undefined","depth","node","canToggle","Boolean","dropLine","anchorId","type","editingId","validateFolderName","name","parentId","excludeId","onFolderNameSubmit","onCancelRename","onSubmitRename","_jsx","div","ref","FolderNameField","onCancel","onSubmit","validate","defaultValue","trailingContents","_jsxs","gap","alignItems","onPointerDown","e","stopPropagation","Box","tag","textAlign","width","Status","status","Root","variant","endIcon","size","aria-label","getTrad","defaultMessage","More","aria-hidden","focusable","Content","zIndex","onCloseAutoFocus","event","current","preventDefault","Item","onSelect","onBeginRename","startIcon","Pencil","Separator","onDeleteFolder","Trash","children","length","onDeleteFolderAndContent","dropTargetId","aria-expanded","isCollapsed","onClick","onToggle","style","cursor","as","ChevronDown","fill","transform","transition","textColor","fontWeight","to","draggable","title","edge","RowOverlay","background","shadow","VisuallyHidden"],"mappings":"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"}
@@ -0,0 +1,172 @@
1
+ 'use strict';
2
+
3
+ var React = require('react');
4
+ var designSystem = require('@strapi/design-system');
5
+ var upperFirst = require('lodash/upperFirst');
6
+ var reactIntl = require('react-intl');
7
+ var pluginId = require('../../../pluginId.js');
8
+ var getTrad = require('../../../utils/getTrad.js');
9
+ require('react/jsx-runtime');
10
+ require('../../CTBSession/sessionContext.js');
11
+ var useCTBTracking = require('../../CTBSession/useCTBTracking.js');
12
+ var useDataManager = require('../../DataManager/useDataManager.js');
13
+ var useFormModalNavigation = require('../../FormModalNavigation/useFormModalNavigation.js');
14
+
15
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
16
+
17
+ var upperFirst__default = /*#__PURE__*/_interopDefault(upperFirst);
18
+
19
+ function useContentTypeBuilderMenu() {
20
+ const { componentsGroupedByCategory, isInDevelopmentMode, sortedContentTypesList } = useDataManager.useDataManager();
21
+ const { onOpenModalCreateSchema } = useFormModalNavigation.useFormModalNavigation();
22
+ const { locale, formatMessage } = reactIntl.useIntl();
23
+ const { trackUsage } = useCTBTracking.useCTBTracking();
24
+ const [searchValue, setSearchValue] = React.useState('');
25
+ const { contains } = designSystem.useFilter(locale, {
26
+ sensitivity: 'base'
27
+ });
28
+ const formatter = designSystem.useCollator(locale, {
29
+ sensitivity: 'base'
30
+ });
31
+ const handleClickOpenModalCreateCollectionType = ()=>{
32
+ trackUsage(`willCreateContentType`);
33
+ onOpenModalCreateSchema({
34
+ forTarget: 'contentType',
35
+ modalType: 'contentType',
36
+ kind: 'collectionType',
37
+ actionType: 'create'
38
+ });
39
+ };
40
+ const handleClickOpenModalCreateSingleType = ()=>{
41
+ trackUsage(`willCreateSingleType`);
42
+ onOpenModalCreateSchema({
43
+ forTarget: 'contentType',
44
+ modalType: 'contentType',
45
+ actionType: 'create',
46
+ kind: 'singleType'
47
+ });
48
+ };
49
+ const handleClickOpenModalCreateComponent = ()=>{
50
+ trackUsage('willCreateComponent');
51
+ onOpenModalCreateSchema({
52
+ modalType: 'component',
53
+ kind: 'collectionType',
54
+ forTarget: 'component',
55
+ actionType: 'create'
56
+ });
57
+ };
58
+ const sortByTitle = (a, b)=>{
59
+ return formatter.compare(a.title, b.title);
60
+ };
61
+ const componentsData = Object.entries(componentsGroupedByCategory).map(([category, components])=>{
62
+ const categoryLinks = components.map((component)=>({
63
+ to: `/plugins/${pluginId.pluginId}/component-categories/${category}/${component.uid}`,
64
+ title: component.info.displayName,
65
+ status: component.status,
66
+ name: component.uid
67
+ })).sort(sortByTitle);
68
+ return {
69
+ title: upperFirst__default.default(category),
70
+ links: categoryLinks,
71
+ name: category
72
+ };
73
+ }).sort(sortByTitle);
74
+ const displayedContentTypes = sortedContentTypesList.filter((obj)=>obj.visible).map((info)=>({
75
+ status: info.status,
76
+ title: info.title,
77
+ kind: info.kind,
78
+ name: info.name,
79
+ to: info.to
80
+ }));
81
+ const toContentTypeLink = (contentType)=>({
82
+ status: contentType.status,
83
+ title: contentType.title,
84
+ uid: contentType.name,
85
+ to: contentType.to
86
+ });
87
+ const folderSections = [
88
+ {
89
+ section: 'collectionTypes',
90
+ sectionId: 'models',
91
+ title: formatMessage({
92
+ id: getTrad.getTrad('menu.section.models.name'),
93
+ defaultMessage: 'Collection Types'
94
+ }),
95
+ links: displayedContentTypes.filter((contentType)=>contentType.kind === 'collectionType').map(toContentTypeLink),
96
+ createTypeLabel: formatMessage({
97
+ id: getTrad.getTrad('nav.action.new-collection-type'),
98
+ defaultMessage: 'New Collection-Type'
99
+ }),
100
+ onCreateContentType: handleClickOpenModalCreateCollectionType
101
+ },
102
+ {
103
+ section: 'singleTypes',
104
+ sectionId: 'singleTypes',
105
+ title: formatMessage({
106
+ id: getTrad.getTrad('menu.section.single-types.name'),
107
+ defaultMessage: 'Single Types'
108
+ }),
109
+ links: displayedContentTypes.filter((contentType)=>contentType.kind === 'singleType').map(toContentTypeLink),
110
+ createTypeLabel: formatMessage({
111
+ id: getTrad.getTrad('nav.action.new-single-type'),
112
+ defaultMessage: 'New Single-Type'
113
+ }),
114
+ onCreateContentType: handleClickOpenModalCreateSingleType
115
+ }
116
+ ];
117
+ const flatSections = [
118
+ {
119
+ name: 'components',
120
+ title: {
121
+ id: `${getTrad.getTrad('menu.section.components.name')}`,
122
+ defaultMessage: 'Components'
123
+ },
124
+ customLink: isInDevelopmentMode ? {
125
+ id: `${getTrad.getTrad('button.component.create')}`,
126
+ defaultMessage: 'Create a new component',
127
+ onClick: handleClickOpenModalCreateComponent
128
+ } : undefined,
129
+ links: componentsData
130
+ }
131
+ ].map((section)=>{
132
+ const hasChild = section.links.some((l)=>'links' in l && Array.isArray(l.links));
133
+ if (hasChild) {
134
+ let filteredLinksCount = 0;
135
+ const links = section.links.reduce((acc, link)=>{
136
+ const filteredLinks = 'links' in link ? link.links.filter((link)=>contains(link.title, searchValue)) : [];
137
+ if (filteredLinks.length === 0) {
138
+ return acc;
139
+ }
140
+ filteredLinksCount += filteredLinks.length;
141
+ acc.push({
142
+ ...link,
143
+ links: filteredLinks.sort(sortByTitle)
144
+ });
145
+ return acc;
146
+ }, []);
147
+ return {
148
+ ...section,
149
+ linksCount: filteredLinksCount,
150
+ links: links
151
+ };
152
+ }
153
+ const filteredLinks = section.links.filter((link)=>contains(link.title, searchValue)).sort(sortByTitle);
154
+ return {
155
+ ...section,
156
+ linksCount: filteredLinks.length,
157
+ links: filteredLinks
158
+ };
159
+ });
160
+ return {
161
+ folderSections,
162
+ flatSections,
163
+ search: {
164
+ clear: ()=>setSearchValue(''),
165
+ onChange: setSearchValue,
166
+ value: searchValue
167
+ }
168
+ };
169
+ }
170
+
171
+ exports.useContentTypeBuilderMenu = useContentTypeBuilderMenu;
172
+ //# sourceMappingURL=useContentTypeBuilderMenu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useContentTypeBuilderMenu.js","sources":["../../../../../admin/src/components/ContentTypeBuilderNav/hooks/useContentTypeBuilderMenu.ts"],"sourcesContent":["import { useState } from 'react';\n\nimport { useCollator, useFilter } from '@strapi/design-system';\nimport upperFirst from 'lodash/upperFirst';\nimport { useIntl } from 'react-intl';\n\nimport { pluginId } from '../../../pluginId';\nimport { getTrad } from '../../../utils/getTrad';\nimport { useCTBTracking } from '../../CTBSession/ctbSession';\nimport { useDataManager } from '../../DataManager/useDataManager';\nimport { useFormModalNavigation } from '../../FormModalNavigation/useFormModalNavigation';\n\nimport type { Status } from '../../../types';\nimport type { SectionKey } from '../../DataManager/utils/contentStructure';\nimport type { ContentTypeLink } from '../lib/buildFolderTree';\n\nexport type FolderMenuSection = {\n onCreateContentType: () => void;\n links: ContentTypeLink[];\n createTypeLabel: string;\n section: SectionKey;\n sectionId: string;\n title: string;\n};\n\ntype Link = {\n name: string;\n to: string;\n status: Status;\n title: string;\n};\n\ntype SubSection = {\n name: string;\n title: string;\n links: Link[];\n};\n\nexport type FlatMenuSection = {\n name: string;\n title: {\n id: string;\n defaultMessage: string;\n };\n customLink?: {\n id: string;\n defaultMessage: string;\n onClick: () => void;\n };\n links: Array<SubSection | Link>;\n linksCount?: number;\n};\n\nexport function useContentTypeBuilderMenu() {\n const { componentsGroupedByCategory, isInDevelopmentMode, sortedContentTypesList } =\n useDataManager();\n const { onOpenModalCreateSchema } = useFormModalNavigation();\n const { locale, formatMessage } = useIntl();\n const { trackUsage } = useCTBTracking();\n\n const [searchValue, setSearchValue] = useState('');\n\n const { contains } = useFilter(locale, {\n sensitivity: 'base',\n });\n\n const formatter = useCollator(locale, {\n sensitivity: 'base',\n });\n\n const handleClickOpenModalCreateCollectionType = () => {\n trackUsage(`willCreateContentType`);\n\n onOpenModalCreateSchema({\n forTarget: 'contentType',\n modalType: 'contentType',\n kind: 'collectionType',\n actionType: 'create',\n });\n };\n\n const handleClickOpenModalCreateSingleType = () => {\n trackUsage(`willCreateSingleType`);\n\n onOpenModalCreateSchema({\n forTarget: 'contentType',\n modalType: 'contentType',\n actionType: 'create',\n kind: 'singleType',\n });\n };\n\n const handleClickOpenModalCreateComponent = () => {\n trackUsage('willCreateComponent');\n\n onOpenModalCreateSchema({\n modalType: 'component',\n kind: 'collectionType',\n forTarget: 'component',\n actionType: 'create',\n });\n };\n\n const sortByTitle = (a: { title: string }, b: { title: string }) => {\n return formatter.compare(a.title, b.title);\n };\n\n const componentsData = Object.entries(componentsGroupedByCategory)\n .map(([category, components]) => {\n const categoryLinks = components\n .map((component) => ({\n to: `/plugins/${pluginId}/component-categories/${category}/${component.uid}`,\n title: component.info.displayName,\n status: component.status,\n name: component.uid,\n }))\n .sort(sortByTitle);\n\n return {\n title: upperFirst(category),\n links: categoryLinks,\n name: category,\n };\n })\n .sort(sortByTitle);\n\n const displayedContentTypes = sortedContentTypesList\n .filter((obj) => obj.visible)\n .map((info) => ({\n status: info.status,\n title: info.title,\n kind: info.kind,\n name: info.name,\n to: info.to,\n }));\n\n const toContentTypeLink = (\n contentType: (typeof displayedContentTypes)[number]\n ): ContentTypeLink => ({\n status: contentType.status,\n title: contentType.title,\n uid: contentType.name,\n to: contentType.to,\n });\n\n const folderSections: FolderMenuSection[] = [\n {\n section: 'collectionTypes',\n sectionId: 'models',\n title: formatMessage({\n id: getTrad('menu.section.models.name'),\n defaultMessage: 'Collection Types',\n }),\n links: displayedContentTypes\n .filter((contentType) => contentType.kind === 'collectionType')\n .map(toContentTypeLink),\n createTypeLabel: formatMessage({\n id: getTrad('nav.action.new-collection-type'),\n defaultMessage: 'New Collection-Type',\n }),\n onCreateContentType: handleClickOpenModalCreateCollectionType,\n },\n {\n section: 'singleTypes',\n sectionId: 'singleTypes',\n title: formatMessage({\n id: getTrad('menu.section.single-types.name'),\n defaultMessage: 'Single Types',\n }),\n links: displayedContentTypes\n .filter((contentType) => contentType.kind === 'singleType')\n .map(toContentTypeLink),\n createTypeLabel: formatMessage({\n id: getTrad('nav.action.new-single-type'),\n defaultMessage: 'New Single-Type',\n }),\n onCreateContentType: handleClickOpenModalCreateSingleType,\n },\n ];\n\n const flatSections: FlatMenuSection[] = [\n {\n name: 'components',\n title: {\n id: `${getTrad('menu.section.components.name')}`,\n defaultMessage: 'Components',\n },\n customLink: isInDevelopmentMode\n ? {\n id: `${getTrad('button.component.create')}`,\n defaultMessage: 'Create a new component',\n onClick: handleClickOpenModalCreateComponent,\n }\n : undefined,\n links: componentsData,\n },\n ].map((section) => {\n const hasChild = section.links.some((l) => 'links' in l && Array.isArray(l.links));\n\n if (hasChild) {\n let filteredLinksCount = 0;\n\n const links = section.links.reduce((acc, link) => {\n const filteredLinks =\n 'links' in link ? link.links.filter((link) => contains(link.title, searchValue)) : [];\n\n if (filteredLinks.length === 0) {\n return acc;\n }\n\n filteredLinksCount += filteredLinks.length;\n\n acc.push({\n ...link,\n links: filteredLinks.sort(sortByTitle),\n });\n\n return acc;\n }, [] as SubSection[]);\n\n return {\n ...section,\n linksCount: filteredLinksCount,\n links: links,\n };\n }\n\n const filteredLinks = section.links\n .filter((link) => contains(link.title, searchValue))\n .sort(sortByTitle);\n\n return {\n ...section,\n linksCount: filteredLinks.length,\n links: filteredLinks,\n };\n });\n\n return {\n folderSections,\n flatSections,\n search: {\n clear: () => setSearchValue(''),\n onChange: setSearchValue,\n value: searchValue,\n },\n };\n}\n"],"names":["useContentTypeBuilderMenu","componentsGroupedByCategory","isInDevelopmentMode","sortedContentTypesList","useDataManager","onOpenModalCreateSchema","useFormModalNavigation","locale","formatMessage","useIntl","trackUsage","useCTBTracking","searchValue","setSearchValue","useState","contains","useFilter","sensitivity","formatter","useCollator","handleClickOpenModalCreateCollectionType","forTarget","modalType","kind","actionType","handleClickOpenModalCreateSingleType","handleClickOpenModalCreateComponent","sortByTitle","a","b","compare","title","componentsData","Object","entries","map","category","components","categoryLinks","component","to","pluginId","uid","info","displayName","status","name","sort","upperFirst","links","displayedContentTypes","filter","obj","visible","toContentTypeLink","contentType","folderSections","section","sectionId","id","getTrad","defaultMessage","createTypeLabel","onCreateContentType","flatSections","customLink","onClick","undefined","hasChild","some","l","Array","isArray","filteredLinksCount","reduce","acc","link","filteredLinks","length","push","linksCount","search","clear","onChange","value"],"mappings":"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"}