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