@strapi/content-type-builder 5.54.0 → 5.55.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (208) hide show
  1. package/dist/admin/components/AIChat/hooks/useAIFetch.js +6 -2
  2. package/dist/admin/components/AIChat/hooks/useAIFetch.js.map +1 -1
  3. package/dist/admin/components/AIChat/hooks/useAIFetch.mjs +7 -3
  4. package/dist/admin/components/AIChat/hooks/useAIFetch.mjs.map +1 -1
  5. package/dist/admin/components/AIChat/hooks/usePrefetchAIToken.js +20 -0
  6. package/dist/admin/components/AIChat/hooks/usePrefetchAIToken.js.map +1 -0
  7. package/dist/admin/components/AIChat/hooks/usePrefetchAIToken.mjs +18 -0
  8. package/dist/admin/components/AIChat/hooks/usePrefetchAIToken.mjs.map +1 -0
  9. package/dist/admin/components/ContentTypeBuilderNav/ContentTypeBuilderNav.js +83 -59
  10. package/dist/admin/components/ContentTypeBuilderNav/ContentTypeBuilderNav.js.map +1 -1
  11. package/dist/admin/components/ContentTypeBuilderNav/ContentTypeBuilderNav.mjs +86 -62
  12. package/dist/admin/components/ContentTypeBuilderNav/ContentTypeBuilderNav.mjs.map +1 -1
  13. package/dist/admin/components/ContentTypeBuilderNav/components/FolderNav/DeleteFolderDialog.js +112 -0
  14. package/dist/admin/components/ContentTypeBuilderNav/components/FolderNav/DeleteFolderDialog.js.map +1 -0
  15. package/dist/admin/components/ContentTypeBuilderNav/components/FolderNav/DeleteFolderDialog.mjs +110 -0
  16. package/dist/admin/components/ContentTypeBuilderNav/components/FolderNav/DeleteFolderDialog.mjs.map +1 -0
  17. package/dist/admin/components/ContentTypeBuilderNav/components/FolderNav/FolderNameField.js +159 -0
  18. package/dist/admin/components/ContentTypeBuilderNav/components/FolderNav/FolderNameField.js.map +1 -0
  19. package/dist/admin/components/ContentTypeBuilderNav/components/FolderNav/FolderNameField.mjs +157 -0
  20. package/dist/admin/components/ContentTypeBuilderNav/components/FolderNav/FolderNameField.mjs.map +1 -0
  21. package/dist/admin/components/ContentTypeBuilderNav/components/FolderNav/FolderNavSection.js +311 -0
  22. package/dist/admin/components/ContentTypeBuilderNav/components/FolderNav/FolderNavSection.js.map +1 -0
  23. package/dist/admin/components/ContentTypeBuilderNav/components/FolderNav/FolderNavSection.mjs +309 -0
  24. package/dist/admin/components/ContentTypeBuilderNav/components/FolderNav/FolderNavSection.mjs.map +1 -0
  25. package/dist/admin/components/ContentTypeBuilderNav/components/FolderNav/SortableTreeRow.js +379 -0
  26. package/dist/admin/components/ContentTypeBuilderNav/components/FolderNav/SortableTreeRow.js.map +1 -0
  27. package/dist/admin/components/ContentTypeBuilderNav/components/FolderNav/SortableTreeRow.mjs +376 -0
  28. package/dist/admin/components/ContentTypeBuilderNav/components/FolderNav/SortableTreeRow.mjs.map +1 -0
  29. package/dist/admin/components/ContentTypeBuilderNav/hooks/useContentTypeBuilderMenu.js +172 -0
  30. package/dist/admin/components/ContentTypeBuilderNav/hooks/useContentTypeBuilderMenu.js.map +1 -0
  31. package/dist/admin/components/ContentTypeBuilderNav/hooks/useContentTypeBuilderMenu.mjs +166 -0
  32. package/dist/admin/components/ContentTypeBuilderNav/hooks/useContentTypeBuilderMenu.mjs.map +1 -0
  33. package/dist/admin/components/ContentTypeBuilderNav/hooks/useFolderActions.js +62 -0
  34. package/dist/admin/components/ContentTypeBuilderNav/hooks/useFolderActions.js.map +1 -0
  35. package/dist/admin/components/ContentTypeBuilderNav/hooks/useFolderActions.mjs +60 -0
  36. package/dist/admin/components/ContentTypeBuilderNav/hooks/useFolderActions.mjs.map +1 -0
  37. package/dist/admin/components/ContentTypeBuilderNav/hooks/useSortableTree.js +145 -0
  38. package/dist/admin/components/ContentTypeBuilderNav/hooks/useSortableTree.js.map +1 -0
  39. package/dist/admin/components/ContentTypeBuilderNav/hooks/useSortableTree.mjs +143 -0
  40. package/dist/admin/components/ContentTypeBuilderNav/hooks/useSortableTree.mjs.map +1 -0
  41. package/dist/admin/components/ContentTypeBuilderNav/lib/buildFolderTree.js +176 -0
  42. package/dist/admin/components/ContentTypeBuilderNav/lib/buildFolderTree.js.map +1 -0
  43. package/dist/admin/components/ContentTypeBuilderNav/lib/buildFolderTree.mjs +169 -0
  44. package/dist/admin/components/ContentTypeBuilderNav/lib/buildFolderTree.mjs.map +1 -0
  45. package/dist/admin/components/ContentTypeBuilderNav/lib/dropProjection.js +277 -0
  46. package/dist/admin/components/ContentTypeBuilderNav/lib/dropProjection.js.map +1 -0
  47. package/dist/admin/components/ContentTypeBuilderNav/lib/dropProjection.mjs +273 -0
  48. package/dist/admin/components/ContentTypeBuilderNav/lib/dropProjection.mjs.map +1 -0
  49. package/dist/admin/components/ContentTypeBuilderNav/lib/flatModel.js +62 -0
  50. package/dist/admin/components/ContentTypeBuilderNav/lib/flatModel.js.map +1 -0
  51. package/dist/admin/components/ContentTypeBuilderNav/lib/flatModel.mjs +58 -0
  52. package/dist/admin/components/ContentTypeBuilderNav/lib/flatModel.mjs.map +1 -0
  53. package/dist/admin/components/DataManager/DataManagerContext.js.map +1 -1
  54. package/dist/admin/components/DataManager/DataManagerContext.mjs.map +1 -1
  55. package/dist/admin/components/DataManager/DataManagerProvider.js +70 -8
  56. package/dist/admin/components/DataManager/DataManagerProvider.js.map +1 -1
  57. package/dist/admin/components/DataManager/DataManagerProvider.mjs +70 -8
  58. package/dist/admin/components/DataManager/DataManagerProvider.mjs.map +1 -1
  59. package/dist/admin/components/DataManager/reducer.js +411 -33
  60. package/dist/admin/components/DataManager/reducer.js.map +1 -1
  61. package/dist/admin/components/DataManager/reducer.mjs +411 -33
  62. package/dist/admin/components/DataManager/reducer.mjs.map +1 -1
  63. package/dist/admin/components/DataManager/utils/cleanData.js +11 -2
  64. package/dist/admin/components/DataManager/utils/cleanData.js.map +1 -1
  65. package/dist/admin/components/DataManager/utils/cleanData.mjs +11 -2
  66. package/dist/admin/components/DataManager/utils/cleanData.mjs.map +1 -1
  67. package/dist/admin/components/DataManager/utils/contentStructure.js +150 -0
  68. package/dist/admin/components/DataManager/utils/contentStructure.js.map +1 -0
  69. package/dist/admin/components/DataManager/utils/contentStructure.mjs +133 -0
  70. package/dist/admin/components/DataManager/utils/contentStructure.mjs.map +1 -0
  71. package/dist/admin/components/FolderSelect.js +200 -0
  72. package/dist/admin/components/FolderSelect.js.map +1 -0
  73. package/dist/admin/components/FolderSelect.mjs +198 -0
  74. package/dist/admin/components/FolderSelect.mjs.map +1 -0
  75. package/dist/admin/components/FormModal/FormModal.js +23 -2
  76. package/dist/admin/components/FormModal/FormModal.js.map +1 -1
  77. package/dist/admin/components/FormModal/FormModal.mjs +23 -2
  78. package/dist/admin/components/FormModal/FormModal.mjs.map +1 -1
  79. package/dist/admin/components/FormModal/contentType/contentTypeForm.js +15 -18
  80. package/dist/admin/components/FormModal/contentType/contentTypeForm.js.map +1 -1
  81. package/dist/admin/components/FormModal/contentType/contentTypeForm.mjs +15 -18
  82. package/dist/admin/components/FormModal/contentType/contentTypeForm.mjs.map +1 -1
  83. package/dist/admin/components/FormModal/reducer.js +6 -0
  84. package/dist/admin/components/FormModal/reducer.js.map +1 -1
  85. package/dist/admin/components/FormModal/reducer.mjs +6 -0
  86. package/dist/admin/components/FormModal/reducer.mjs.map +1 -1
  87. package/dist/admin/pages/App/index.js +2 -5
  88. package/dist/admin/pages/App/index.js.map +1 -1
  89. package/dist/admin/pages/App/index.mjs +2 -5
  90. package/dist/admin/pages/App/index.mjs.map +1 -1
  91. package/dist/admin/src/components/AIChat/hooks/usePrefetchAIToken.d.ts +1 -0
  92. package/dist/admin/src/components/ContentTypeBuilderNav/components/FolderNav/DeleteFolderDialog.d.ts +16 -0
  93. package/dist/admin/src/components/ContentTypeBuilderNav/components/FolderNav/FolderNameField.d.ts +12 -0
  94. package/dist/admin/src/components/ContentTypeBuilderNav/components/FolderNav/FolderNavSection.d.ts +14 -0
  95. package/dist/admin/src/components/ContentTypeBuilderNav/components/FolderNav/SortableTreeRow.d.ts +38 -0
  96. package/dist/admin/src/components/ContentTypeBuilderNav/{useContentTypeBuilderMenu.d.ts → hooks/useContentTypeBuilderMenu.d.ts} +17 -7
  97. package/dist/admin/src/components/ContentTypeBuilderNav/hooks/useFolderActions.d.ts +42 -0
  98. package/dist/admin/src/components/ContentTypeBuilderNav/hooks/useSortableTree.d.ts +53 -0
  99. package/dist/admin/src/components/ContentTypeBuilderNav/lib/buildFolderTree.d.ts +42 -0
  100. package/dist/admin/src/components/ContentTypeBuilderNav/lib/dropProjection.d.ts +58 -0
  101. package/dist/admin/src/components/ContentTypeBuilderNav/lib/flatModel.d.ts +18 -0
  102. package/dist/admin/src/components/DataManager/DataManagerContext.d.ts +41 -0
  103. package/dist/admin/src/components/DataManager/reducer.d.ts +105 -1
  104. package/dist/admin/src/components/DataManager/utils/cleanData.d.ts +5 -1
  105. package/dist/admin/src/components/DataManager/utils/contentStructure.d.ts +68 -0
  106. package/dist/admin/src/components/FolderSelect.d.ts +18 -0
  107. package/dist/admin/src/components/FormModal/contentType/contentTypeForm.d.ts +0 -21
  108. package/dist/admin/src/components/FormModal/forms/forms.d.ts +0 -10
  109. package/dist/admin/src/components/FormModal/reducer.d.ts +7 -0
  110. package/dist/admin/src/utils/folderTelemetry.d.ts +5 -0
  111. package/dist/admin/translations/en.json.js +23 -0
  112. package/dist/admin/translations/en.json.js.map +1 -1
  113. package/dist/admin/translations/en.json.mjs +23 -0
  114. package/dist/admin/translations/en.json.mjs.map +1 -1
  115. package/dist/admin/utils/folderTelemetry.js +19 -0
  116. package/dist/admin/utils/folderTelemetry.js.map +1 -0
  117. package/dist/admin/utils/folderTelemetry.mjs +16 -0
  118. package/dist/admin/utils/folderTelemetry.mjs.map +1 -0
  119. package/dist/server/controllers/schema.js +1 -1
  120. package/dist/server/controllers/schema.js.map +1 -1
  121. package/dist/server/controllers/schema.mjs +1 -1
  122. package/dist/server/controllers/schema.mjs.map +1 -1
  123. package/dist/server/controllers/validation/common.js +3 -0
  124. package/dist/server/controllers/validation/common.js.map +1 -1
  125. package/dist/server/controllers/validation/common.mjs +3 -1
  126. package/dist/server/controllers/validation/common.mjs.map +1 -1
  127. package/dist/server/controllers/validation/content-structure.js +177 -0
  128. package/dist/server/controllers/validation/content-structure.js.map +1 -0
  129. package/dist/server/controllers/validation/content-structure.mjs +173 -0
  130. package/dist/server/controllers/validation/content-structure.mjs.map +1 -0
  131. package/dist/server/controllers/validation/schema.js +3 -1
  132. package/dist/server/controllers/validation/schema.js.map +1 -1
  133. package/dist/server/controllers/validation/schema.mjs +3 -1
  134. package/dist/server/controllers/validation/schema.mjs.map +1 -1
  135. package/dist/server/register.js +1 -1
  136. package/dist/server/register.js.map +1 -1
  137. package/dist/server/register.mjs +1 -1
  138. package/dist/server/register.mjs.map +1 -1
  139. package/dist/server/routes/content-api.js +4 -4
  140. package/dist/server/routes/content-api.js.map +1 -1
  141. package/dist/server/routes/content-api.mjs +4 -4
  142. package/dist/server/routes/content-api.mjs.map +1 -1
  143. package/dist/server/services/api-handler.js +37 -4
  144. package/dist/server/services/api-handler.js.map +1 -1
  145. package/dist/server/services/api-handler.mjs +36 -5
  146. package/dist/server/services/api-handler.mjs.map +1 -1
  147. package/dist/server/services/content-structure.js +174 -0
  148. package/dist/server/services/content-structure.js.map +1 -0
  149. package/dist/server/services/content-structure.mjs +172 -0
  150. package/dist/server/services/content-structure.mjs.map +1 -0
  151. package/dist/server/services/content-types.js +196 -44
  152. package/dist/server/services/content-types.js.map +1 -1
  153. package/dist/server/services/content-types.mjs +195 -45
  154. package/dist/server/services/content-types.mjs.map +1 -1
  155. package/dist/server/services/index.js +3 -1
  156. package/dist/server/services/index.js.map +1 -1
  157. package/dist/server/services/index.mjs +3 -1
  158. package/dist/server/services/index.mjs.map +1 -1
  159. package/dist/server/services/schema-builder/index.js +4 -2
  160. package/dist/server/services/schema-builder/index.js.map +1 -1
  161. package/dist/server/services/schema-builder/index.mjs +4 -2
  162. package/dist/server/services/schema-builder/index.mjs.map +1 -1
  163. package/dist/server/services/schema-builder/schema-handler.js +16 -16
  164. package/dist/server/services/schema-builder/schema-handler.js.map +1 -1
  165. package/dist/server/services/schema-builder/schema-handler.mjs +16 -16
  166. package/dist/server/services/schema-builder/schema-handler.mjs.map +1 -1
  167. package/dist/server/services/schema-mutation.js +46 -0
  168. package/dist/server/services/schema-mutation.js.map +1 -0
  169. package/dist/server/services/schema-mutation.mjs +43 -0
  170. package/dist/server/services/schema-mutation.mjs.map +1 -0
  171. package/dist/server/services/schema.js +134 -79
  172. package/dist/server/services/schema.js.map +1 -1
  173. package/dist/server/services/schema.mjs +135 -80
  174. package/dist/server/services/schema.mjs.map +1 -1
  175. package/dist/server/src/controllers/schema.d.ts.map +1 -1
  176. package/dist/server/src/controllers/validation/common.d.ts +1 -0
  177. package/dist/server/src/controllers/validation/common.d.ts.map +1 -1
  178. package/dist/server/src/controllers/validation/content-structure.d.ts +56 -0
  179. package/dist/server/src/controllers/validation/content-structure.d.ts.map +1 -0
  180. package/dist/server/src/controllers/validation/schema.d.ts +35 -0
  181. package/dist/server/src/controllers/validation/schema.d.ts.map +1 -1
  182. package/dist/server/src/index.d.ts +3 -0
  183. package/dist/server/src/index.d.ts.map +1 -1
  184. package/dist/server/src/routes/content-api.d.ts.map +1 -1
  185. package/dist/server/src/services/api-handler.d.ts +13 -1
  186. package/dist/server/src/services/api-handler.d.ts.map +1 -1
  187. package/dist/server/src/services/content-structure.d.ts +37 -0
  188. package/dist/server/src/services/content-structure.d.ts.map +1 -0
  189. package/dist/server/src/services/content-types.d.ts +4 -0
  190. package/dist/server/src/services/content-types.d.ts.map +1 -1
  191. package/dist/server/src/services/index.d.ts +4 -0
  192. package/dist/server/src/services/index.d.ts.map +1 -1
  193. package/dist/server/src/services/schema-builder/index.d.ts +3 -1
  194. package/dist/server/src/services/schema-builder/index.d.ts.map +1 -1
  195. package/dist/server/src/services/schema-builder/schema-handler.d.ts.map +1 -1
  196. package/dist/server/src/services/schema-mutation.d.ts +26 -0
  197. package/dist/server/src/services/schema-mutation.d.ts.map +1 -0
  198. package/dist/server/src/services/schema.d.ts +1 -0
  199. package/dist/server/src/services/schema.d.ts.map +1 -1
  200. package/dist/server/src/utils/index.d.ts +2 -0
  201. package/dist/server/src/utils/index.d.ts.map +1 -1
  202. package/dist/server/utils/index.js.map +1 -1
  203. package/dist/server/utils/index.mjs.map +1 -1
  204. package/package.json +6 -6
  205. package/dist/admin/components/ContentTypeBuilderNav/useContentTypeBuilderMenu.js +0 -157
  206. package/dist/admin/components/ContentTypeBuilderNav/useContentTypeBuilderMenu.js.map +0 -1
  207. package/dist/admin/components/ContentTypeBuilderNav/useContentTypeBuilderMenu.mjs +0 -151
  208. package/dist/admin/components/ContentTypeBuilderNav/useContentTypeBuilderMenu.mjs.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FolderNavSection.js","sources":["../../../../../../admin/src/components/ContentTypeBuilderNav/components/FolderNav/FolderNavSection.tsx"],"sourcesContent":["import { useMemo, useState } from 'react';\n\nimport { DndContext, DragOverlay } from '@dnd-kit/core';\nimport { SortableContext } from '@dnd-kit/sortable';\nimport { SubNav } from '@strapi/admin/strapi-admin';\nimport { Box, useCollator, useFilter } from '@strapi/design-system';\nimport { File, Folder } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\n\nimport { getTrad } from '../../../../utils/getTrad';\nimport { useDataManager } from '../../../DataManager/useDataManager';\nimport {\n getDeleteFolderOnlySiblingNameCollisions,\n isFolderNameTakenBySibling,\n} from '../../../DataManager/utils/contentStructure';\nimport { useFolderActions } from '../../hooks/useFolderActions';\nimport { useSortableTree } from '../../hooks/useSortableTree';\nimport {\n buildSectionTree,\n collectSubtreeContentTypeUids,\n countSubtree,\n filterTree,\n} from '../../lib/buildFolderTree';\nimport { flattenSortableTree } from '../../lib/flatModel';\n\nimport { DeleteFolderDialog } from './DeleteFolderDialog';\nimport { FolderNameField } from './FolderNameField';\nimport { RowOverlay, SortableTreeRow } from './SortableTreeRow';\n\nimport type { DeleteFolderMode } from './DeleteFolderDialog';\nimport type { TreeHandlers } from './SortableTreeRow';\nimport type { SectionKey } from '../../../DataManager/utils/contentStructure';\nimport type { ContentTypeLink, FolderNode, FolderTreeNode } from '../../lib/buildFolderTree';\n\nconst countContentTypes = (nodes: FolderTreeNode[]): number => {\n return nodes.reduce((total, node) => {\n if (node.type === 'folder') {\n return total + countContentTypes(node.children);\n }\n\n return total + 1;\n }, 0);\n};\n\ninterface FolderNavSectionProps {\n onCreateContentType: () => void;\n createTypeLabel: string;\n searchValue: string;\n\n /** Guided-tour section id ('models' | 'singleTypes'). */\n sectionId: string;\n section: SectionKey;\n\n title: string;\n links: ContentTypeLink[];\n}\n\nconst EMPTY_COLLAPSED: Set<string> = new Set(); // Empty set to uncollapse all items while searching\n\nexport const FolderNavSection = ({\n onCreateContentType,\n createTypeLabel,\n searchValue,\n sectionId,\n section,\n title,\n links,\n}: FolderNavSectionProps) => {\n const { contentStructure, contentTypes, isInDevelopmentMode } = useDataManager();\n const { formatMessage, locale } = useIntl();\n const actions = useFolderActions();\n\n const [collapsed, setCollapsed] = useState<Set<string>>(new Set());\n const [editingId, setEditingId] = useState<string | null>(null);\n const [isDrafting, setIsDrafting] = useState(false);\n\n const [deleteTarget, setDeleteTarget] = useState<{\n mode: DeleteFolderMode;\n node: FolderNode;\n } | null>(null);\n\n const { contains } = useFilter(locale, { sensitivity: 'base' });\n const formatter = useCollator(locale, { sensitivity: 'base' });\n\n const sectionData = contentStructure.sections[section];\n const searchActive = searchValue.trim().length > 0;\n const canEdit = Boolean(isInDevelopmentMode);\n\n const deletableContentTypeUids = useMemo(() => {\n return new Set(\n Object.values(contentTypes)\n .filter((contentType) => contentType.uid.startsWith('api::') && !contentType.plugin)\n .map((contentType) => contentType.uid)\n );\n }, [contentTypes]);\n\n const tree = useMemo(() => {\n return buildSectionTree(sectionData, links, (a, b) => formatter.compare(a, b));\n }, [sectionData, links, formatter]);\n\n const effectiveCollapsed = searchActive ? EMPTY_COLLAPSED : collapsed;\n\n const visibleTree = useMemo(() => {\n return searchActive ? filterTree(tree, (text) => contains(text, searchValue)) : tree;\n }, [searchActive, tree, contains, searchValue]);\n\n const flatItems = useMemo(() => {\n return flattenSortableTree(visibleTree, effectiveCollapsed);\n }, [visibleTree, effectiveCollapsed]);\n\n // This hook supplies the CTB contentStructure dnd engine.\n const dnd = useSortableTree({\n disabled: !canEdit || searchActive,\n collapsed: effectiveCollapsed,\n items: flatItems,\n canDrop: (activeNode, target) => {\n if (activeNode.type !== 'folder') {\n return true;\n }\n\n const parentId = target.kind === 'nest' ? target.folderId : target.parentId;\n\n if (\n isFolderNameTakenBySibling(sectionData.groups, parentId, activeNode.name, activeNode.id)\n ) {\n return false;\n }\n\n return true;\n },\n onDrop: (activeNode, target) => {\n const parentId = target.kind === 'nest' ? target.folderId : target.parentId;\n const index = target.kind === 'nest' ? 0 : target.index;\n\n if (activeNode.type === 'folder') {\n actions.moveFolder({\n newParentId: parentId,\n id: activeNode.id,\n section,\n index,\n });\n\n return;\n }\n\n actions.assignContentTypeToFolder({\n targetGroupId: parentId,\n uid: activeNode.uid,\n section,\n index,\n });\n },\n onExpandFolder: (folderId) =>\n setCollapsed((prev) => {\n const next = new Set(prev);\n next.delete(folderId);\n return next;\n }),\n });\n\n const confirmDelete = () => {\n if (!deleteTarget) {\n return;\n }\n\n if (deleteTarget.mode === 'withContent') {\n actions.deleteFolderAndContent({\n contentTypeUids: collectSubtreeContentTypeUids(sectionData, deleteTarget.node.id).filter(\n (uid) => deletableContentTypeUids.has(uid)\n ),\n id: deleteTarget.node.id,\n section,\n });\n } else {\n if (\n getDeleteFolderOnlySiblingNameCollisions(sectionData.groups, deleteTarget.node.id).length >\n 0\n ) {\n return;\n }\n\n actions.deleteFolderOnly({ section, id: deleteTarget.node.id });\n }\n\n setDeleteTarget(null);\n };\n\n const validateFolderName = ({\n excludeId,\n parentId,\n name,\n }: {\n excludeId?: string;\n parentId: string | null;\n name: string;\n }): string | undefined => {\n const folderNameTaken = isFolderNameTakenBySibling(\n sectionData.groups,\n parentId,\n name,\n excludeId\n );\n\n if (folderNameTaken) {\n return formatMessage({\n defaultMessage: 'A folder with this name already exists in this location',\n id: getTrad('nav.folder.name.duplicate'),\n });\n }\n\n return undefined;\n };\n\n const handlers: TreeHandlers = {\n dropTargetId: dnd.dropTargetId,\n dropLine: dnd.dropLine,\n validateFolderName,\n editingId,\n section,\n canEdit,\n\n isCollapsed: (id) => {\n return effectiveCollapsed.has(id);\n },\n // Search forces the tree open; a collapse toggle then can't take effect, so don't present one.\n canToggle: !searchActive,\n onToggle: (id) => {\n setCollapsed((prev) => {\n const next = new Set(prev);\n\n if (next.has(id)) {\n next.delete(id);\n } else {\n next.add(id);\n }\n\n return next;\n });\n },\n // Deferred past the closing menu's focus restoration so the inline input isn't blurred (and consequently auto-committed) the instant it mounts.\n onBeginRename: (id) => {\n setTimeout(() => {\n setIsDrafting(false);\n setEditingId(id);\n }, 0);\n },\n onSubmitRename: (id, name) => {\n actions.renameFolder({ section, id, name });\n setEditingId(null);\n },\n onCancelRename: () => {\n setEditingId(null);\n },\n onDeleteFolder: (node) => {\n setDeleteTarget({ node, mode: 'only' });\n },\n onDeleteFolderAndContent: (node) => {\n setDeleteTarget({ node, mode: 'withContent' });\n },\n };\n\n const sectionLink = {\n label: createTypeLabel,\n // The \"New folder\" option mounts the folder name input input and focuses it. Without this flag enabled, closing the menu would restore focus to the menu icon trigger.\n suppressFocusCaptureOnMenuClose: true,\n menu: [\n { label: createTypeLabel, onSelect: onCreateContentType, startIcon: <File /> },\n {\n label: formatMessage({\n id: getTrad('nav.action.new-folder'),\n defaultMessage: 'New folder',\n }),\n onSelect: () => {\n setEditingId(null);\n setTimeout(() => setIsDrafting(true), 0);\n },\n startIcon: <Folder />,\n },\n ],\n };\n\n const rows = (\n // No extra horizontal padding here — the rows sit directly in the section's\n // list so their left edge lines up with the components SubSections.\n <Box key=\"section-rows\">\n {canEdit && isDrafting && (\n <FolderNameField\n depth={0}\n defaultValue={formatMessage({\n id: getTrad('nav.folder.default-name'),\n defaultMessage: 'New folder',\n })}\n validate={(name) => {\n return validateFolderName({ name, parentId: null });\n }}\n onSubmit={(name) => {\n actions.createFolder({ section, name, parentId: null });\n setIsDrafting(false);\n }}\n onCancel={() => {\n setIsDrafting(false);\n }}\n />\n )}\n <DndContext\n collisionDetection={dnd.collisionDetection}\n onDragCancel={dnd.onDragCancel}\n onDragStart={dnd.onDragStart}\n onDragMove={dnd.onDragMove}\n onDragEnd={dnd.onDragEnd}\n sensors={dnd.sensors}\n >\n <SortableContext\n items={dnd.renderedItems.map((item) => item.id)}\n strategy={dnd.sortingStrategy}\n >\n {dnd.renderedItems.map((item) => {\n return <SortableTreeRow key={item.id} item={item} handlers={handlers} />;\n })}\n </SortableContext>\n <DragOverlay dropAnimation={null}>\n {dnd.activeItem ? <RowOverlay item={dnd.activeItem} /> : null}\n </DragOverlay>\n </DndContext>\n </Box>\n );\n\n return (\n <>\n <SubNav.Section\n badgeLabel={countContentTypes(visibleTree).toString()}\n link={canEdit ? sectionLink : undefined}\n sectionId={sectionId}\n label={title}\n >\n {[rows]}\n </SubNav.Section>\n\n {deleteTarget && (\n <DeleteFolderDialog\n counts={{\n ...countSubtree(sectionData, deleteTarget.node.id, deletableContentTypeUids),\n preservedContentTypes: collectSubtreeContentTypeUids(\n sectionData,\n deleteTarget.node.id\n ).filter((uid) => !deletableContentTypeUids.has(uid)).length,\n }}\n conflictingFolderNames={\n deleteTarget.mode === 'only'\n ? getDeleteFolderOnlySiblingNameCollisions(sectionData.groups, deleteTarget.node.id)\n : []\n }\n folderName={deleteTarget.node.name}\n onConfirm={confirmDelete}\n mode={deleteTarget.mode}\n open\n onOpenChange={(open) => {\n if (!open) {\n setDeleteTarget(null);\n }\n }}\n />\n )}\n </>\n );\n};\n"],"names":["countContentTypes","nodes","reduce","total","node","type","children","EMPTY_COLLAPSED","Set","FolderNavSection","onCreateContentType","createTypeLabel","searchValue","sectionId","section","title","links","contentStructure","contentTypes","isInDevelopmentMode","useDataManager","formatMessage","locale","useIntl","actions","useFolderActions","collapsed","setCollapsed","useState","editingId","setEditingId","isDrafting","setIsDrafting","deleteTarget","setDeleteTarget","contains","useFilter","sensitivity","formatter","useCollator","sectionData","sections","searchActive","trim","length","canEdit","Boolean","deletableContentTypeUids","useMemo","Object","values","filter","contentType","uid","startsWith","plugin","map","tree","buildSectionTree","a","b","compare","effectiveCollapsed","visibleTree","filterTree","text","flatItems","flattenSortableTree","dnd","useSortableTree","disabled","items","canDrop","activeNode","target","parentId","kind","folderId","isFolderNameTakenBySibling","groups","name","id","onDrop","index","moveFolder","newParentId","assignContentTypeToFolder","targetGroupId","onExpandFolder","prev","next","delete","confirmDelete","mode","deleteFolderAndContent","contentTypeUids","collectSubtreeContentTypeUids","has","getDeleteFolderOnlySiblingNameCollisions","deleteFolderOnly","validateFolderName","excludeId","folderNameTaken","defaultMessage","getTrad","undefined","handlers","dropTargetId","dropLine","isCollapsed","canToggle","onToggle","add","onBeginRename","setTimeout","onSubmitRename","renameFolder","onCancelRename","onDeleteFolder","onDeleteFolderAndContent","sectionLink","label","suppressFocusCaptureOnMenuClose","menu","onSelect","startIcon","_jsx","File","Folder","rows","_jsxs","Box","FolderNameField","depth","defaultValue","validate","onSubmit","createFolder","onCancel","DndContext","collisionDetection","onDragCancel","onDragStart","onDragMove","onDragEnd","sensors","SortableContext","renderedItems","item","strategy","sortingStrategy","SortableTreeRow","DragOverlay","dropAnimation","activeItem","RowOverlay","_Fragment","SubNav","Section","badgeLabel","toString","link","DeleteFolderDialog","counts","countSubtree","preservedContentTypes","conflictingFolderNames","folderName","onConfirm","open","onOpenChange"],"mappings":"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"}
@@ -0,0 +1,309 @@
1
+ import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
2
+ import { useState, useMemo } from 'react';
3
+ import { DndContext, DragOverlay } from '@dnd-kit/core';
4
+ import { SortableContext } from '@dnd-kit/sortable';
5
+ import { SubNav } from '@strapi/admin/strapi-admin';
6
+ import { useFilter, useCollator, Box } from '@strapi/design-system';
7
+ import { File, Folder } from '@strapi/icons';
8
+ import { useIntl } from 'react-intl';
9
+ import { getTrad } from '../../../../utils/getTrad.mjs';
10
+ import { useDataManager } from '../../../DataManager/useDataManager.mjs';
11
+ import { getDeleteFolderOnlySiblingNameCollisions, isFolderNameTakenBySibling } from '../../../DataManager/utils/contentStructure.mjs';
12
+ import { useFolderActions } from '../../hooks/useFolderActions.mjs';
13
+ import { useSortableTree } from '../../hooks/useSortableTree.mjs';
14
+ import { buildSectionTree, filterTree, collectSubtreeContentTypeUids, countSubtree } from '../../lib/buildFolderTree.mjs';
15
+ import { flattenSortableTree } from '../../lib/flatModel.mjs';
16
+ import { DeleteFolderDialog } from './DeleteFolderDialog.mjs';
17
+ import { FolderNameField } from './FolderNameField.mjs';
18
+ import { SortableTreeRow, RowOverlay } from './SortableTreeRow.mjs';
19
+
20
+ const countContentTypes = (nodes)=>{
21
+ return nodes.reduce((total, node)=>{
22
+ if (node.type === 'folder') {
23
+ return total + countContentTypes(node.children);
24
+ }
25
+ return total + 1;
26
+ }, 0);
27
+ };
28
+ const EMPTY_COLLAPSED = new Set(); // Empty set to uncollapse all items while searching
29
+ const FolderNavSection = ({ onCreateContentType, createTypeLabel, searchValue, sectionId, section, title, links })=>{
30
+ const { contentStructure, contentTypes, isInDevelopmentMode } = useDataManager();
31
+ const { formatMessage, locale } = useIntl();
32
+ const actions = useFolderActions();
33
+ const [collapsed, setCollapsed] = useState(new Set());
34
+ const [editingId, setEditingId] = useState(null);
35
+ const [isDrafting, setIsDrafting] = useState(false);
36
+ const [deleteTarget, setDeleteTarget] = useState(null);
37
+ const { contains } = useFilter(locale, {
38
+ sensitivity: 'base'
39
+ });
40
+ const formatter = useCollator(locale, {
41
+ sensitivity: 'base'
42
+ });
43
+ const sectionData = contentStructure.sections[section];
44
+ const searchActive = searchValue.trim().length > 0;
45
+ const canEdit = Boolean(isInDevelopmentMode);
46
+ const deletableContentTypeUids = useMemo(()=>{
47
+ return new Set(Object.values(contentTypes).filter((contentType)=>contentType.uid.startsWith('api::') && !contentType.plugin).map((contentType)=>contentType.uid));
48
+ }, [
49
+ contentTypes
50
+ ]);
51
+ const tree = useMemo(()=>{
52
+ return buildSectionTree(sectionData, links, (a, b)=>formatter.compare(a, b));
53
+ }, [
54
+ sectionData,
55
+ links,
56
+ formatter
57
+ ]);
58
+ const effectiveCollapsed = searchActive ? EMPTY_COLLAPSED : collapsed;
59
+ const visibleTree = useMemo(()=>{
60
+ return searchActive ? filterTree(tree, (text)=>contains(text, searchValue)) : tree;
61
+ }, [
62
+ searchActive,
63
+ tree,
64
+ contains,
65
+ searchValue
66
+ ]);
67
+ const flatItems = useMemo(()=>{
68
+ return flattenSortableTree(visibleTree, effectiveCollapsed);
69
+ }, [
70
+ visibleTree,
71
+ effectiveCollapsed
72
+ ]);
73
+ // This hook supplies the CTB contentStructure dnd engine.
74
+ const dnd = useSortableTree({
75
+ disabled: !canEdit || searchActive,
76
+ collapsed: effectiveCollapsed,
77
+ items: flatItems,
78
+ canDrop: (activeNode, target)=>{
79
+ if (activeNode.type !== 'folder') {
80
+ return true;
81
+ }
82
+ const parentId = target.kind === 'nest' ? target.folderId : target.parentId;
83
+ if (isFolderNameTakenBySibling(sectionData.groups, parentId, activeNode.name, activeNode.id)) {
84
+ return false;
85
+ }
86
+ return true;
87
+ },
88
+ onDrop: (activeNode, target)=>{
89
+ const parentId = target.kind === 'nest' ? target.folderId : target.parentId;
90
+ const index = target.kind === 'nest' ? 0 : target.index;
91
+ if (activeNode.type === 'folder') {
92
+ actions.moveFolder({
93
+ newParentId: parentId,
94
+ id: activeNode.id,
95
+ section,
96
+ index
97
+ });
98
+ return;
99
+ }
100
+ actions.assignContentTypeToFolder({
101
+ targetGroupId: parentId,
102
+ uid: activeNode.uid,
103
+ section,
104
+ index
105
+ });
106
+ },
107
+ onExpandFolder: (folderId)=>setCollapsed((prev)=>{
108
+ const next = new Set(prev);
109
+ next.delete(folderId);
110
+ return next;
111
+ })
112
+ });
113
+ const confirmDelete = ()=>{
114
+ if (!deleteTarget) {
115
+ return;
116
+ }
117
+ if (deleteTarget.mode === 'withContent') {
118
+ actions.deleteFolderAndContent({
119
+ contentTypeUids: collectSubtreeContentTypeUids(sectionData, deleteTarget.node.id).filter((uid)=>deletableContentTypeUids.has(uid)),
120
+ id: deleteTarget.node.id,
121
+ section
122
+ });
123
+ } else {
124
+ if (getDeleteFolderOnlySiblingNameCollisions(sectionData.groups, deleteTarget.node.id).length > 0) {
125
+ return;
126
+ }
127
+ actions.deleteFolderOnly({
128
+ section,
129
+ id: deleteTarget.node.id
130
+ });
131
+ }
132
+ setDeleteTarget(null);
133
+ };
134
+ const validateFolderName = ({ excludeId, parentId, name })=>{
135
+ const folderNameTaken = isFolderNameTakenBySibling(sectionData.groups, parentId, name, excludeId);
136
+ if (folderNameTaken) {
137
+ return formatMessage({
138
+ defaultMessage: 'A folder with this name already exists in this location',
139
+ id: getTrad('nav.folder.name.duplicate')
140
+ });
141
+ }
142
+ return undefined;
143
+ };
144
+ const handlers = {
145
+ dropTargetId: dnd.dropTargetId,
146
+ dropLine: dnd.dropLine,
147
+ validateFolderName,
148
+ editingId,
149
+ section,
150
+ canEdit,
151
+ isCollapsed: (id)=>{
152
+ return effectiveCollapsed.has(id);
153
+ },
154
+ // Search forces the tree open; a collapse toggle then can't take effect, so don't present one.
155
+ canToggle: !searchActive,
156
+ onToggle: (id)=>{
157
+ setCollapsed((prev)=>{
158
+ const next = new Set(prev);
159
+ if (next.has(id)) {
160
+ next.delete(id);
161
+ } else {
162
+ next.add(id);
163
+ }
164
+ return next;
165
+ });
166
+ },
167
+ // Deferred past the closing menu's focus restoration so the inline input isn't blurred (and consequently auto-committed) the instant it mounts.
168
+ onBeginRename: (id)=>{
169
+ setTimeout(()=>{
170
+ setIsDrafting(false);
171
+ setEditingId(id);
172
+ }, 0);
173
+ },
174
+ onSubmitRename: (id, name)=>{
175
+ actions.renameFolder({
176
+ section,
177
+ id,
178
+ name
179
+ });
180
+ setEditingId(null);
181
+ },
182
+ onCancelRename: ()=>{
183
+ setEditingId(null);
184
+ },
185
+ onDeleteFolder: (node)=>{
186
+ setDeleteTarget({
187
+ node,
188
+ mode: 'only'
189
+ });
190
+ },
191
+ onDeleteFolderAndContent: (node)=>{
192
+ setDeleteTarget({
193
+ node,
194
+ mode: 'withContent'
195
+ });
196
+ }
197
+ };
198
+ const sectionLink = {
199
+ label: createTypeLabel,
200
+ // The "New folder" option mounts the folder name input input and focuses it. Without this flag enabled, closing the menu would restore focus to the menu icon trigger.
201
+ suppressFocusCaptureOnMenuClose: true,
202
+ menu: [
203
+ {
204
+ label: createTypeLabel,
205
+ onSelect: onCreateContentType,
206
+ startIcon: /*#__PURE__*/ jsx(File, {})
207
+ },
208
+ {
209
+ label: formatMessage({
210
+ id: getTrad('nav.action.new-folder'),
211
+ defaultMessage: 'New folder'
212
+ }),
213
+ onSelect: ()=>{
214
+ setEditingId(null);
215
+ setTimeout(()=>setIsDrafting(true), 0);
216
+ },
217
+ startIcon: /*#__PURE__*/ jsx(Folder, {})
218
+ }
219
+ ]
220
+ };
221
+ const rows = // No extra horizontal padding here — the rows sit directly in the section's
222
+ // list so their left edge lines up with the components SubSections.
223
+ /*#__PURE__*/ jsxs(Box, {
224
+ children: [
225
+ canEdit && isDrafting && /*#__PURE__*/ jsx(FolderNameField, {
226
+ depth: 0,
227
+ defaultValue: formatMessage({
228
+ id: getTrad('nav.folder.default-name'),
229
+ defaultMessage: 'New folder'
230
+ }),
231
+ validate: (name)=>{
232
+ return validateFolderName({
233
+ name,
234
+ parentId: null
235
+ });
236
+ },
237
+ onSubmit: (name)=>{
238
+ actions.createFolder({
239
+ section,
240
+ name,
241
+ parentId: null
242
+ });
243
+ setIsDrafting(false);
244
+ },
245
+ onCancel: ()=>{
246
+ setIsDrafting(false);
247
+ }
248
+ }),
249
+ /*#__PURE__*/ jsxs(DndContext, {
250
+ collisionDetection: dnd.collisionDetection,
251
+ onDragCancel: dnd.onDragCancel,
252
+ onDragStart: dnd.onDragStart,
253
+ onDragMove: dnd.onDragMove,
254
+ onDragEnd: dnd.onDragEnd,
255
+ sensors: dnd.sensors,
256
+ children: [
257
+ /*#__PURE__*/ jsx(SortableContext, {
258
+ items: dnd.renderedItems.map((item)=>item.id),
259
+ strategy: dnd.sortingStrategy,
260
+ children: dnd.renderedItems.map((item)=>{
261
+ return /*#__PURE__*/ jsx(SortableTreeRow, {
262
+ item: item,
263
+ handlers: handlers
264
+ }, item.id);
265
+ })
266
+ }),
267
+ /*#__PURE__*/ jsx(DragOverlay, {
268
+ dropAnimation: null,
269
+ children: dnd.activeItem ? /*#__PURE__*/ jsx(RowOverlay, {
270
+ item: dnd.activeItem
271
+ }) : null
272
+ })
273
+ ]
274
+ })
275
+ ]
276
+ }, "section-rows");
277
+ return /*#__PURE__*/ jsxs(Fragment, {
278
+ children: [
279
+ /*#__PURE__*/ jsx(SubNav.Section, {
280
+ badgeLabel: countContentTypes(visibleTree).toString(),
281
+ link: canEdit ? sectionLink : undefined,
282
+ sectionId: sectionId,
283
+ label: title,
284
+ children: [
285
+ rows
286
+ ]
287
+ }),
288
+ deleteTarget && /*#__PURE__*/ jsx(DeleteFolderDialog, {
289
+ counts: {
290
+ ...countSubtree(sectionData, deleteTarget.node.id, deletableContentTypeUids),
291
+ preservedContentTypes: collectSubtreeContentTypeUids(sectionData, deleteTarget.node.id).filter((uid)=>!deletableContentTypeUids.has(uid)).length
292
+ },
293
+ conflictingFolderNames: deleteTarget.mode === 'only' ? getDeleteFolderOnlySiblingNameCollisions(sectionData.groups, deleteTarget.node.id) : [],
294
+ folderName: deleteTarget.node.name,
295
+ onConfirm: confirmDelete,
296
+ mode: deleteTarget.mode,
297
+ open: true,
298
+ onOpenChange: (open)=>{
299
+ if (!open) {
300
+ setDeleteTarget(null);
301
+ }
302
+ }
303
+ })
304
+ ]
305
+ });
306
+ };
307
+
308
+ export { FolderNavSection };
309
+ //# sourceMappingURL=FolderNavSection.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FolderNavSection.mjs","sources":["../../../../../../admin/src/components/ContentTypeBuilderNav/components/FolderNav/FolderNavSection.tsx"],"sourcesContent":["import { useMemo, useState } from 'react';\n\nimport { DndContext, DragOverlay } from '@dnd-kit/core';\nimport { SortableContext } from '@dnd-kit/sortable';\nimport { SubNav } from '@strapi/admin/strapi-admin';\nimport { Box, useCollator, useFilter } from '@strapi/design-system';\nimport { File, Folder } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\n\nimport { getTrad } from '../../../../utils/getTrad';\nimport { useDataManager } from '../../../DataManager/useDataManager';\nimport {\n getDeleteFolderOnlySiblingNameCollisions,\n isFolderNameTakenBySibling,\n} from '../../../DataManager/utils/contentStructure';\nimport { useFolderActions } from '../../hooks/useFolderActions';\nimport { useSortableTree } from '../../hooks/useSortableTree';\nimport {\n buildSectionTree,\n collectSubtreeContentTypeUids,\n countSubtree,\n filterTree,\n} from '../../lib/buildFolderTree';\nimport { flattenSortableTree } from '../../lib/flatModel';\n\nimport { DeleteFolderDialog } from './DeleteFolderDialog';\nimport { FolderNameField } from './FolderNameField';\nimport { RowOverlay, SortableTreeRow } from './SortableTreeRow';\n\nimport type { DeleteFolderMode } from './DeleteFolderDialog';\nimport type { TreeHandlers } from './SortableTreeRow';\nimport type { SectionKey } from '../../../DataManager/utils/contentStructure';\nimport type { ContentTypeLink, FolderNode, FolderTreeNode } from '../../lib/buildFolderTree';\n\nconst countContentTypes = (nodes: FolderTreeNode[]): number => {\n return nodes.reduce((total, node) => {\n if (node.type === 'folder') {\n return total + countContentTypes(node.children);\n }\n\n return total + 1;\n }, 0);\n};\n\ninterface FolderNavSectionProps {\n onCreateContentType: () => void;\n createTypeLabel: string;\n searchValue: string;\n\n /** Guided-tour section id ('models' | 'singleTypes'). */\n sectionId: string;\n section: SectionKey;\n\n title: string;\n links: ContentTypeLink[];\n}\n\nconst EMPTY_COLLAPSED: Set<string> = new Set(); // Empty set to uncollapse all items while searching\n\nexport const FolderNavSection = ({\n onCreateContentType,\n createTypeLabel,\n searchValue,\n sectionId,\n section,\n title,\n links,\n}: FolderNavSectionProps) => {\n const { contentStructure, contentTypes, isInDevelopmentMode } = useDataManager();\n const { formatMessage, locale } = useIntl();\n const actions = useFolderActions();\n\n const [collapsed, setCollapsed] = useState<Set<string>>(new Set());\n const [editingId, setEditingId] = useState<string | null>(null);\n const [isDrafting, setIsDrafting] = useState(false);\n\n const [deleteTarget, setDeleteTarget] = useState<{\n mode: DeleteFolderMode;\n node: FolderNode;\n } | null>(null);\n\n const { contains } = useFilter(locale, { sensitivity: 'base' });\n const formatter = useCollator(locale, { sensitivity: 'base' });\n\n const sectionData = contentStructure.sections[section];\n const searchActive = searchValue.trim().length > 0;\n const canEdit = Boolean(isInDevelopmentMode);\n\n const deletableContentTypeUids = useMemo(() => {\n return new Set(\n Object.values(contentTypes)\n .filter((contentType) => contentType.uid.startsWith('api::') && !contentType.plugin)\n .map((contentType) => contentType.uid)\n );\n }, [contentTypes]);\n\n const tree = useMemo(() => {\n return buildSectionTree(sectionData, links, (a, b) => formatter.compare(a, b));\n }, [sectionData, links, formatter]);\n\n const effectiveCollapsed = searchActive ? EMPTY_COLLAPSED : collapsed;\n\n const visibleTree = useMemo(() => {\n return searchActive ? filterTree(tree, (text) => contains(text, searchValue)) : tree;\n }, [searchActive, tree, contains, searchValue]);\n\n const flatItems = useMemo(() => {\n return flattenSortableTree(visibleTree, effectiveCollapsed);\n }, [visibleTree, effectiveCollapsed]);\n\n // This hook supplies the CTB contentStructure dnd engine.\n const dnd = useSortableTree({\n disabled: !canEdit || searchActive,\n collapsed: effectiveCollapsed,\n items: flatItems,\n canDrop: (activeNode, target) => {\n if (activeNode.type !== 'folder') {\n return true;\n }\n\n const parentId = target.kind === 'nest' ? target.folderId : target.parentId;\n\n if (\n isFolderNameTakenBySibling(sectionData.groups, parentId, activeNode.name, activeNode.id)\n ) {\n return false;\n }\n\n return true;\n },\n onDrop: (activeNode, target) => {\n const parentId = target.kind === 'nest' ? target.folderId : target.parentId;\n const index = target.kind === 'nest' ? 0 : target.index;\n\n if (activeNode.type === 'folder') {\n actions.moveFolder({\n newParentId: parentId,\n id: activeNode.id,\n section,\n index,\n });\n\n return;\n }\n\n actions.assignContentTypeToFolder({\n targetGroupId: parentId,\n uid: activeNode.uid,\n section,\n index,\n });\n },\n onExpandFolder: (folderId) =>\n setCollapsed((prev) => {\n const next = new Set(prev);\n next.delete(folderId);\n return next;\n }),\n });\n\n const confirmDelete = () => {\n if (!deleteTarget) {\n return;\n }\n\n if (deleteTarget.mode === 'withContent') {\n actions.deleteFolderAndContent({\n contentTypeUids: collectSubtreeContentTypeUids(sectionData, deleteTarget.node.id).filter(\n (uid) => deletableContentTypeUids.has(uid)\n ),\n id: deleteTarget.node.id,\n section,\n });\n } else {\n if (\n getDeleteFolderOnlySiblingNameCollisions(sectionData.groups, deleteTarget.node.id).length >\n 0\n ) {\n return;\n }\n\n actions.deleteFolderOnly({ section, id: deleteTarget.node.id });\n }\n\n setDeleteTarget(null);\n };\n\n const validateFolderName = ({\n excludeId,\n parentId,\n name,\n }: {\n excludeId?: string;\n parentId: string | null;\n name: string;\n }): string | undefined => {\n const folderNameTaken = isFolderNameTakenBySibling(\n sectionData.groups,\n parentId,\n name,\n excludeId\n );\n\n if (folderNameTaken) {\n return formatMessage({\n defaultMessage: 'A folder with this name already exists in this location',\n id: getTrad('nav.folder.name.duplicate'),\n });\n }\n\n return undefined;\n };\n\n const handlers: TreeHandlers = {\n dropTargetId: dnd.dropTargetId,\n dropLine: dnd.dropLine,\n validateFolderName,\n editingId,\n section,\n canEdit,\n\n isCollapsed: (id) => {\n return effectiveCollapsed.has(id);\n },\n // Search forces the tree open; a collapse toggle then can't take effect, so don't present one.\n canToggle: !searchActive,\n onToggle: (id) => {\n setCollapsed((prev) => {\n const next = new Set(prev);\n\n if (next.has(id)) {\n next.delete(id);\n } else {\n next.add(id);\n }\n\n return next;\n });\n },\n // Deferred past the closing menu's focus restoration so the inline input isn't blurred (and consequently auto-committed) the instant it mounts.\n onBeginRename: (id) => {\n setTimeout(() => {\n setIsDrafting(false);\n setEditingId(id);\n }, 0);\n },\n onSubmitRename: (id, name) => {\n actions.renameFolder({ section, id, name });\n setEditingId(null);\n },\n onCancelRename: () => {\n setEditingId(null);\n },\n onDeleteFolder: (node) => {\n setDeleteTarget({ node, mode: 'only' });\n },\n onDeleteFolderAndContent: (node) => {\n setDeleteTarget({ node, mode: 'withContent' });\n },\n };\n\n const sectionLink = {\n label: createTypeLabel,\n // The \"New folder\" option mounts the folder name input input and focuses it. Without this flag enabled, closing the menu would restore focus to the menu icon trigger.\n suppressFocusCaptureOnMenuClose: true,\n menu: [\n { label: createTypeLabel, onSelect: onCreateContentType, startIcon: <File /> },\n {\n label: formatMessage({\n id: getTrad('nav.action.new-folder'),\n defaultMessage: 'New folder',\n }),\n onSelect: () => {\n setEditingId(null);\n setTimeout(() => setIsDrafting(true), 0);\n },\n startIcon: <Folder />,\n },\n ],\n };\n\n const rows = (\n // No extra horizontal padding here — the rows sit directly in the section's\n // list so their left edge lines up with the components SubSections.\n <Box key=\"section-rows\">\n {canEdit && isDrafting && (\n <FolderNameField\n depth={0}\n defaultValue={formatMessage({\n id: getTrad('nav.folder.default-name'),\n defaultMessage: 'New folder',\n })}\n validate={(name) => {\n return validateFolderName({ name, parentId: null });\n }}\n onSubmit={(name) => {\n actions.createFolder({ section, name, parentId: null });\n setIsDrafting(false);\n }}\n onCancel={() => {\n setIsDrafting(false);\n }}\n />\n )}\n <DndContext\n collisionDetection={dnd.collisionDetection}\n onDragCancel={dnd.onDragCancel}\n onDragStart={dnd.onDragStart}\n onDragMove={dnd.onDragMove}\n onDragEnd={dnd.onDragEnd}\n sensors={dnd.sensors}\n >\n <SortableContext\n items={dnd.renderedItems.map((item) => item.id)}\n strategy={dnd.sortingStrategy}\n >\n {dnd.renderedItems.map((item) => {\n return <SortableTreeRow key={item.id} item={item} handlers={handlers} />;\n })}\n </SortableContext>\n <DragOverlay dropAnimation={null}>\n {dnd.activeItem ? <RowOverlay item={dnd.activeItem} /> : null}\n </DragOverlay>\n </DndContext>\n </Box>\n );\n\n return (\n <>\n <SubNav.Section\n badgeLabel={countContentTypes(visibleTree).toString()}\n link={canEdit ? sectionLink : undefined}\n sectionId={sectionId}\n label={title}\n >\n {[rows]}\n </SubNav.Section>\n\n {deleteTarget && (\n <DeleteFolderDialog\n counts={{\n ...countSubtree(sectionData, deleteTarget.node.id, deletableContentTypeUids),\n preservedContentTypes: collectSubtreeContentTypeUids(\n sectionData,\n deleteTarget.node.id\n ).filter((uid) => !deletableContentTypeUids.has(uid)).length,\n }}\n conflictingFolderNames={\n deleteTarget.mode === 'only'\n ? getDeleteFolderOnlySiblingNameCollisions(sectionData.groups, deleteTarget.node.id)\n : []\n }\n folderName={deleteTarget.node.name}\n onConfirm={confirmDelete}\n mode={deleteTarget.mode}\n open\n onOpenChange={(open) => {\n if (!open) {\n setDeleteTarget(null);\n }\n }}\n />\n )}\n </>\n );\n};\n"],"names":["countContentTypes","nodes","reduce","total","node","type","children","EMPTY_COLLAPSED","Set","FolderNavSection","onCreateContentType","createTypeLabel","searchValue","sectionId","section","title","links","contentStructure","contentTypes","isInDevelopmentMode","useDataManager","formatMessage","locale","useIntl","actions","useFolderActions","collapsed","setCollapsed","useState","editingId","setEditingId","isDrafting","setIsDrafting","deleteTarget","setDeleteTarget","contains","useFilter","sensitivity","formatter","useCollator","sectionData","sections","searchActive","trim","length","canEdit","Boolean","deletableContentTypeUids","useMemo","Object","values","filter","contentType","uid","startsWith","plugin","map","tree","buildSectionTree","a","b","compare","effectiveCollapsed","visibleTree","filterTree","text","flatItems","flattenSortableTree","dnd","useSortableTree","disabled","items","canDrop","activeNode","target","parentId","kind","folderId","isFolderNameTakenBySibling","groups","name","id","onDrop","index","moveFolder","newParentId","assignContentTypeToFolder","targetGroupId","onExpandFolder","prev","next","delete","confirmDelete","mode","deleteFolderAndContent","contentTypeUids","collectSubtreeContentTypeUids","has","getDeleteFolderOnlySiblingNameCollisions","deleteFolderOnly","validateFolderName","excludeId","folderNameTaken","defaultMessage","getTrad","undefined","handlers","dropTargetId","dropLine","isCollapsed","canToggle","onToggle","add","onBeginRename","setTimeout","onSubmitRename","renameFolder","onCancelRename","onDeleteFolder","onDeleteFolderAndContent","sectionLink","label","suppressFocusCaptureOnMenuClose","menu","onSelect","startIcon","_jsx","File","Folder","rows","_jsxs","Box","FolderNameField","depth","defaultValue","validate","onSubmit","createFolder","onCancel","DndContext","collisionDetection","onDragCancel","onDragStart","onDragMove","onDragEnd","sensors","SortableContext","renderedItems","item","strategy","sortingStrategy","SortableTreeRow","DragOverlay","dropAnimation","activeItem","RowOverlay","_Fragment","SubNav","Section","badgeLabel","toString","link","DeleteFolderDialog","counts","countSubtree","preservedContentTypes","conflictingFolderNames","folderName","onConfirm","open","onOpenChange"],"mappings":";;;;;;;;;;;;;;;;;;;AAkCA,MAAMA,oBAAoB,CAACC,KAAAA,GAAAA;AACzB,IAAA,OAAOA,KAAAA,CAAMC,MAAM,CAAC,CAACC,KAAAA,EAAOC,IAAAA,GAAAA;QAC1B,IAAIA,IAAAA,CAAKC,IAAI,KAAK,QAAA,EAAU;YAC1B,OAAOF,KAAAA,GAAQH,iBAAAA,CAAkBI,IAAAA,CAAKE,QAAQ,CAAA;AAChD,QAAA;AAEA,QAAA,OAAOH,KAAAA,GAAQ,CAAA;IACjB,CAAA,EAAG,CAAA,CAAA;AACL,CAAA;AAeA,MAAMI,eAAAA,GAA+B,IAAIC,GAAAA,EAAAA,CAAAA;MAE5BC,gBAAAA,GAAmB,CAAC,EAC/BC,mBAAmB,EACnBC,eAAe,EACfC,WAAW,EACXC,SAAS,EACTC,OAAO,EACPC,KAAK,EACLC,KAAK,EACiB,GAAA;AACtB,IAAA,MAAM,EAAEC,gBAAgB,EAAEC,YAAY,EAAEC,mBAAmB,EAAE,GAAGC,cAAAA,EAAAA;AAChE,IAAA,MAAM,EAAEC,aAAa,EAAEC,MAAM,EAAE,GAAGC,OAAAA,EAAAA;AAClC,IAAA,MAAMC,OAAAA,GAAUC,gBAAAA,EAAAA;AAEhB,IAAA,MAAM,CAACC,SAAAA,EAAWC,YAAAA,CAAa,GAAGC,SAAsB,IAAIpB,GAAAA,EAAAA,CAAAA;AAC5D,IAAA,MAAM,CAACqB,SAAAA,EAAWC,YAAAA,CAAa,GAAGF,QAAAA,CAAwB,IAAA,CAAA;AAC1D,IAAA,MAAM,CAACG,UAAAA,EAAYC,aAAAA,CAAc,GAAGJ,QAAAA,CAAS,KAAA,CAAA;AAE7C,IAAA,MAAM,CAACK,YAAAA,EAAcC,eAAAA,CAAgB,GAAGN,QAAAA,CAG9B,IAAA,CAAA;AAEV,IAAA,MAAM,EAAEO,QAAQ,EAAE,GAAGC,UAAUd,MAAAA,EAAQ;QAAEe,WAAAA,EAAa;AAAO,KAAA,CAAA;IAC7D,MAAMC,SAAAA,GAAYC,YAAYjB,MAAAA,EAAQ;QAAEe,WAAAA,EAAa;AAAO,KAAA,CAAA;AAE5D,IAAA,MAAMG,WAAAA,GAAcvB,gBAAAA,CAAiBwB,QAAQ,CAAC3B,OAAAA,CAAQ;AACtD,IAAA,MAAM4B,YAAAA,GAAe9B,WAAAA,CAAY+B,IAAI,EAAA,CAAGC,MAAM,GAAG,CAAA;AACjD,IAAA,MAAMC,UAAUC,OAAAA,CAAQ3B,mBAAAA,CAAAA;AAExB,IAAA,MAAM4B,2BAA2BC,OAAAA,CAAQ,IAAA;QACvC,OAAO,IAAIxC,GAAAA,CACTyC,MAAAA,CAAOC,MAAM,CAAChC,cACXiC,MAAM,CAAC,CAACC,WAAAA,GAAgBA,WAAAA,CAAYC,GAAG,CAACC,UAAU,CAAC,OAAA,CAAA,IAAY,CAACF,WAAAA,CAAYG,MAAM,CAAA,CAClFC,GAAG,CAAC,CAACJ,WAAAA,GAAgBA,WAAAA,CAAYC,GAAG,CAAA,CAAA;IAE3C,CAAA,EAAG;AAACnC,QAAAA;AAAa,KAAA,CAAA;AAEjB,IAAA,MAAMuC,OAAOT,OAAAA,CAAQ,IAAA;QACnB,OAAOU,gBAAAA,CAAiBlB,aAAaxB,KAAAA,EAAO,CAAC2C,GAAGC,CAAAA,GAAMtB,SAAAA,CAAUuB,OAAO,CAACF,CAAAA,EAAGC,CAAAA,CAAAA,CAAAA;IAC7E,CAAA,EAAG;AAACpB,QAAAA,WAAAA;AAAaxB,QAAAA,KAAAA;AAAOsB,QAAAA;AAAU,KAAA,CAAA;IAElC,MAAMwB,kBAAAA,GAAqBpB,eAAenC,eAAAA,GAAkBmB,SAAAA;AAE5D,IAAA,MAAMqC,cAAcf,OAAAA,CAAQ,IAAA;AAC1B,QAAA,OAAON,eAAesB,UAAAA,CAAWP,IAAAA,EAAM,CAACQ,IAAAA,GAAS9B,QAAAA,CAAS8B,MAAMrD,WAAAA,CAAAA,CAAAA,GAAgB6C,IAAAA;IAClF,CAAA,EAAG;AAACf,QAAAA,YAAAA;AAAce,QAAAA,IAAAA;AAAMtB,QAAAA,QAAAA;AAAUvB,QAAAA;AAAY,KAAA,CAAA;AAE9C,IAAA,MAAMsD,YAAYlB,OAAAA,CAAQ,IAAA;AACxB,QAAA,OAAOmB,oBAAoBJ,WAAAA,EAAaD,kBAAAA,CAAAA;IAC1C,CAAA,EAAG;AAACC,QAAAA,WAAAA;AAAaD,QAAAA;AAAmB,KAAA,CAAA;;AAGpC,IAAA,MAAMM,MAAMC,eAAAA,CAAgB;AAC1BC,QAAAA,QAAAA,EAAU,CAACzB,OAAAA,IAAWH,YAAAA;QACtBhB,SAAAA,EAAWoC,kBAAAA;QACXS,KAAAA,EAAOL,SAAAA;AACPM,QAAAA,OAAAA,EAAS,CAACC,UAAAA,EAAYC,MAAAA,GAAAA;YACpB,IAAID,UAAAA,CAAWpE,IAAI,KAAK,QAAA,EAAU;gBAChC,OAAO,IAAA;AACT,YAAA;YAEA,MAAMsE,QAAAA,GAAWD,OAAOE,IAAI,KAAK,SAASF,MAAAA,CAAOG,QAAQ,GAAGH,MAAAA,CAAOC,QAAQ;YAE3E,IACEG,0BAAAA,CAA2BtC,WAAAA,CAAYuC,MAAM,EAAEJ,QAAAA,EAAUF,WAAWO,IAAI,EAAEP,UAAAA,CAAWQ,EAAE,CAAA,EACvF;gBACA,OAAO,KAAA;AACT,YAAA;YAEA,OAAO,IAAA;AACT,QAAA,CAAA;AACAC,QAAAA,MAAAA,EAAQ,CAACT,UAAAA,EAAYC,MAAAA,GAAAA;YACnB,MAAMC,QAAAA,GAAWD,OAAOE,IAAI,KAAK,SAASF,MAAAA,CAAOG,QAAQ,GAAGH,MAAAA,CAAOC,QAAQ;AAC3E,YAAA,MAAMQ,QAAQT,MAAAA,CAAOE,IAAI,KAAK,MAAA,GAAS,CAAA,GAAIF,OAAOS,KAAK;YAEvD,IAAIV,UAAAA,CAAWpE,IAAI,KAAK,QAAA,EAAU;AAChCmB,gBAAAA,OAAAA,CAAQ4D,UAAU,CAAC;oBACjBC,WAAAA,EAAaV,QAAAA;AACbM,oBAAAA,EAAAA,EAAIR,WAAWQ,EAAE;AACjBnE,oBAAAA,OAAAA;AACAqE,oBAAAA;AACF,iBAAA,CAAA;AAEA,gBAAA;AACF,YAAA;AAEA3D,YAAAA,OAAAA,CAAQ8D,yBAAyB,CAAC;gBAChCC,aAAAA,EAAeZ,QAAAA;AACftB,gBAAAA,GAAAA,EAAKoB,WAAWpB,GAAG;AACnBvC,gBAAAA,OAAAA;AACAqE,gBAAAA;AACF,aAAA,CAAA;AACF,QAAA,CAAA;QACAK,cAAAA,EAAgB,CAACX,QAAAA,GACflD,YAAAA,CAAa,CAAC8D,IAAAA,GAAAA;gBACZ,MAAMC,IAAAA,GAAO,IAAIlF,GAAAA,CAAIiF,IAAAA,CAAAA;AACrBC,gBAAAA,IAAAA,CAAKC,MAAM,CAACd,QAAAA,CAAAA;gBACZ,OAAOa,IAAAA;AACT,YAAA,CAAA;AACJ,KAAA,CAAA;AAEA,IAAA,MAAME,aAAAA,GAAgB,IAAA;AACpB,QAAA,IAAI,CAAC3D,YAAAA,EAAc;AACjB,YAAA;AACF,QAAA;QAEA,IAAIA,YAAAA,CAAa4D,IAAI,KAAK,aAAA,EAAe;AACvCrE,YAAAA,OAAAA,CAAQsE,sBAAsB,CAAC;AAC7BC,gBAAAA,eAAAA,EAAiBC,6BAAAA,CAA8BxD,WAAAA,EAAaP,YAAAA,CAAa7B,IAAI,CAAC6E,EAAE,CAAA,CAAE9B,MAAM,CACtF,CAACE,GAAAA,GAAQN,wBAAAA,CAAyBkD,GAAG,CAAC5C,GAAAA,CAAAA,CAAAA;gBAExC4B,EAAAA,EAAIhD,YAAAA,CAAa7B,IAAI,CAAC6E,EAAE;AACxBnE,gBAAAA;AACF,aAAA,CAAA;QACF,CAAA,MAAO;YACL,IACEoF,wCAAAA,CAAyC1D,WAAAA,CAAYuC,MAAM,EAAE9C,YAAAA,CAAa7B,IAAI,CAAC6E,EAAE,CAAA,CAAErC,MAAM,GACzF,CAAA,EACA;AACA,gBAAA;AACF,YAAA;AAEApB,YAAAA,OAAAA,CAAQ2E,gBAAgB,CAAC;AAAErF,gBAAAA,OAAAA;gBAASmE,EAAAA,EAAIhD,YAAAA,CAAa7B,IAAI,CAAC6E;AAAG,aAAA,CAAA;AAC/D,QAAA;QAEA/C,eAAAA,CAAgB,IAAA,CAAA;AAClB,IAAA,CAAA;IAEA,MAAMkE,kBAAAA,GAAqB,CAAC,EAC1BC,SAAS,EACT1B,QAAQ,EACRK,IAAI,EAKL,GAAA;AACC,QAAA,MAAMsB,kBAAkBxB,0BAAAA,CACtBtC,WAAAA,CAAYuC,MAAM,EAClBJ,UACAK,IAAAA,EACAqB,SAAAA,CAAAA;AAGF,QAAA,IAAIC,eAAAA,EAAiB;AACnB,YAAA,OAAOjF,aAAAA,CAAc;gBACnBkF,cAAAA,EAAgB,yDAAA;AAChBtB,gBAAAA,EAAAA,EAAIuB,OAAAA,CAAQ,2BAAA;AACd,aAAA,CAAA;AACF,QAAA;QAEA,OAAOC,SAAAA;AACT,IAAA,CAAA;AAEA,IAAA,MAAMC,QAAAA,GAAyB;AAC7BC,QAAAA,YAAAA,EAAcvC,IAAIuC,YAAY;AAC9BC,QAAAA,QAAAA,EAAUxC,IAAIwC,QAAQ;AACtBR,QAAAA,kBAAAA;AACAvE,QAAAA,SAAAA;AACAf,QAAAA,OAAAA;AACA+B,QAAAA,OAAAA;AAEAgE,QAAAA,WAAAA,EAAa,CAAC5B,EAAAA,GAAAA;YACZ,OAAOnB,kBAAAA,CAAmBmC,GAAG,CAAChB,EAAAA,CAAAA;AAChC,QAAA,CAAA;;AAEA6B,QAAAA,SAAAA,EAAW,CAACpE,YAAAA;AACZqE,QAAAA,QAAAA,EAAU,CAAC9B,EAAAA,GAAAA;AACTtD,YAAAA,YAAAA,CAAa,CAAC8D,IAAAA,GAAAA;gBACZ,MAAMC,IAAAA,GAAO,IAAIlF,GAAAA,CAAIiF,IAAAA,CAAAA;gBAErB,IAAIC,IAAAA,CAAKO,GAAG,CAAChB,EAAAA,CAAAA,EAAK;AAChBS,oBAAAA,IAAAA,CAAKC,MAAM,CAACV,EAAAA,CAAAA;gBACd,CAAA,MAAO;AACLS,oBAAAA,IAAAA,CAAKsB,GAAG,CAAC/B,EAAAA,CAAAA;AACX,gBAAA;gBAEA,OAAOS,IAAAA;AACT,YAAA,CAAA,CAAA;AACF,QAAA,CAAA;;AAEAuB,QAAAA,aAAAA,EAAe,CAAChC,EAAAA,GAAAA;YACdiC,UAAAA,CAAW,IAAA;gBACTlF,aAAAA,CAAc,KAAA,CAAA;gBACdF,YAAAA,CAAamD,EAAAA,CAAAA;YACf,CAAA,EAAG,CAAA,CAAA;AACL,QAAA,CAAA;AACAkC,QAAAA,cAAAA,EAAgB,CAAClC,EAAAA,EAAID,IAAAA,GAAAA;AACnBxD,YAAAA,OAAAA,CAAQ4F,YAAY,CAAC;AAAEtG,gBAAAA,OAAAA;AAASmE,gBAAAA,EAAAA;AAAID,gBAAAA;AAAK,aAAA,CAAA;YACzClD,YAAAA,CAAa,IAAA,CAAA;AACf,QAAA,CAAA;QACAuF,cAAAA,EAAgB,IAAA;YACdvF,YAAAA,CAAa,IAAA,CAAA;AACf,QAAA,CAAA;AACAwF,QAAAA,cAAAA,EAAgB,CAAClH,IAAAA,GAAAA;YACf8B,eAAAA,CAAgB;AAAE9B,gBAAAA,IAAAA;gBAAMyF,IAAAA,EAAM;AAAO,aAAA,CAAA;AACvC,QAAA,CAAA;AACA0B,QAAAA,wBAAAA,EAA0B,CAACnH,IAAAA,GAAAA;YACzB8B,eAAAA,CAAgB;AAAE9B,gBAAAA,IAAAA;gBAAMyF,IAAAA,EAAM;AAAc,aAAA,CAAA;AAC9C,QAAA;AACF,KAAA;AAEA,IAAA,MAAM2B,WAAAA,GAAc;QAClBC,KAAAA,EAAO9G,eAAAA;;QAEP+G,+BAAAA,EAAiC,IAAA;QACjCC,IAAAA,EAAM;AACJ,YAAA;gBAAEF,KAAAA,EAAO9G,eAAAA;gBAAiBiH,QAAAA,EAAUlH,mBAAAA;AAAqBmH,gBAAAA,SAAAA,gBAAWC,GAAA,CAACC,IAAAA,EAAAA,EAAAA;AAAQ,aAAA;AAC7E,YAAA;AACEN,gBAAAA,KAAAA,EAAOpG,aAAAA,CAAc;AACnB4D,oBAAAA,EAAAA,EAAIuB,OAAAA,CAAQ,uBAAA,CAAA;oBACZD,cAAAA,EAAgB;AAClB,iBAAA,CAAA;gBACAqB,QAAAA,EAAU,IAAA;oBACR9F,YAAAA,CAAa,IAAA,CAAA;oBACboF,UAAAA,CAAW,IAAMlF,cAAc,IAAA,CAAA,EAAO,CAAA,CAAA;AACxC,gBAAA,CAAA;AACA6F,gBAAAA,SAAAA,gBAAWC,GAAA,CAACE,MAAAA,EAAAA,EAAAA;AACd;AACD;AACH,KAAA;AAEA,IAAA,MAAMC;;kBAGJC,IAAA,CAACC,GAAAA,EAAAA;;AACEtF,YAAAA,OAAAA,IAAWd,4BACV+F,GAAA,CAACM,eAAAA,EAAAA;gBACCC,KAAAA,EAAO,CAAA;AACPC,gBAAAA,YAAAA,EAAcjH,aAAAA,CAAc;AAC1B4D,oBAAAA,EAAAA,EAAIuB,OAAAA,CAAQ,yBAAA,CAAA;oBACZD,cAAAA,EAAgB;AAClB,iBAAA,CAAA;AACAgC,gBAAAA,QAAAA,EAAU,CAACvD,IAAAA,GAAAA;AACT,oBAAA,OAAOoB,kBAAAA,CAAmB;AAAEpB,wBAAAA,IAAAA;wBAAML,QAAAA,EAAU;AAAK,qBAAA,CAAA;AACnD,gBAAA,CAAA;AACA6D,gBAAAA,QAAAA,EAAU,CAACxD,IAAAA,GAAAA;AACTxD,oBAAAA,OAAAA,CAAQiH,YAAY,CAAC;AAAE3H,wBAAAA,OAAAA;AAASkE,wBAAAA,IAAAA;wBAAML,QAAAA,EAAU;AAAK,qBAAA,CAAA;oBACrD3C,aAAAA,CAAc,KAAA,CAAA;AAChB,gBAAA,CAAA;gBACA0G,QAAAA,EAAU,IAAA;oBACR1G,aAAAA,CAAc,KAAA,CAAA;AAChB,gBAAA;;0BAGJkG,IAAA,CAACS,UAAAA,EAAAA;AACCC,gBAAAA,kBAAAA,EAAoBxE,IAAIwE,kBAAkB;AAC1CC,gBAAAA,YAAAA,EAAczE,IAAIyE,YAAY;AAC9BC,gBAAAA,WAAAA,EAAa1E,IAAI0E,WAAW;AAC5BC,gBAAAA,UAAAA,EAAY3E,IAAI2E,UAAU;AAC1BC,gBAAAA,SAAAA,EAAW5E,IAAI4E,SAAS;AACxBC,gBAAAA,OAAAA,EAAS7E,IAAI6E,OAAO;;kCAEpBnB,GAAA,CAACoB,eAAAA,EAAAA;wBACC3E,KAAAA,EAAOH,GAAAA,CAAI+E,aAAa,CAAC3F,GAAG,CAAC,CAAC4F,IAAAA,GAASA,KAAKnE,EAAE,CAAA;AAC9CoE,wBAAAA,QAAAA,EAAUjF,IAAIkF,eAAe;AAE5BlF,wBAAAA,QAAAA,EAAAA,GAAAA,CAAI+E,aAAa,CAAC3F,GAAG,CAAC,CAAC4F,IAAAA,GAAAA;AACtB,4BAAA,qBAAOtB,GAAA,CAACyB,eAAAA,EAAAA;gCAA8BH,IAAAA,EAAMA,IAAAA;gCAAM1C,QAAAA,EAAUA;AAA/B0C,6BAAAA,EAAAA,IAAAA,CAAKnE,EAAE,CAAA;AACtC,wBAAA,CAAA;;kCAEF6C,GAAA,CAAC0B,WAAAA,EAAAA;wBAAYC,aAAAA,EAAe,IAAA;kCACzBrF,GAAAA,CAAIsF,UAAU,iBAAG5B,GAAA,CAAC6B,UAAAA,EAAAA;AAAWP,4BAAAA,IAAAA,EAAMhF,IAAIsF;AAAiB,yBAAA,CAAA,GAAA;;;;;AArCtD,KAAA,EAAA,cAAA,CAAA;IA2CX,qBACExB,IAAA,CAAA0B,QAAA,EAAA;;AACE,0BAAA9B,GAAA,CAAC+B,OAAOC,OAAO,EAAA;gBACbC,UAAAA,EAAY/J,iBAAAA,CAAkB+D,aAAaiG,QAAQ,EAAA;AACnDC,gBAAAA,IAAAA,EAAMpH,UAAU2E,WAAAA,GAAcf,SAAAA;gBAC9B5F,SAAAA,EAAWA,SAAAA;gBACX4G,KAAAA,EAAO1G,KAAAA;AAEN,gBAAA,QAAA,EAAA;AAACkH,oBAAAA;AAAK;;AAGRhG,YAAAA,YAAAA,kBACC6F,GAAA,CAACoC,kBAAAA,EAAAA;gBACCC,MAAAA,EAAQ;AACN,oBAAA,GAAGC,aAAa5H,WAAAA,EAAaP,YAAAA,CAAa7B,IAAI,CAAC6E,EAAE,EAAElC,wBAAAA,CAAyB;AAC5EsH,oBAAAA,qBAAAA,EAAuBrE,8BACrBxD,WAAAA,EACAP,YAAAA,CAAa7B,IAAI,CAAC6E,EAAE,CAAA,CACpB9B,MAAM,CAAC,CAACE,MAAQ,CAACN,wBAAAA,CAAyBkD,GAAG,CAAC5C,MAAMT;AACxD,iBAAA;AACA0H,gBAAAA,sBAAAA,EACErI,YAAAA,CAAa4D,IAAI,KAAK,MAAA,GAClBK,wCAAAA,CAAyC1D,WAAAA,CAAYuC,MAAM,EAAE9C,YAAAA,CAAa7B,IAAI,CAAC6E,EAAE,IACjF,EAAE;gBAERsF,UAAAA,EAAYtI,YAAAA,CAAa7B,IAAI,CAAC4E,IAAI;gBAClCwF,SAAAA,EAAW5E,aAAAA;AACXC,gBAAAA,IAAAA,EAAM5D,aAAa4D,IAAI;gBACvB4E,IAAI,EAAA,IAAA;AACJC,gBAAAA,YAAAA,EAAc,CAACD,IAAAA,GAAAA;AACb,oBAAA,IAAI,CAACA,IAAAA,EAAM;wBACTvI,eAAAA,CAAgB,IAAA,CAAA;AAClB,oBAAA;AACF,gBAAA;;;;AAKV;;;;"}