@strapi/upload 5.50.2 → 5.51.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 (154) hide show
  1. package/dist/admin/future/pages/Assets/AssetsPage.js +201 -137
  2. package/dist/admin/future/pages/Assets/AssetsPage.js.map +1 -1
  3. package/dist/admin/future/pages/Assets/AssetsPage.mjs +202 -138
  4. package/dist/admin/future/pages/Assets/AssetsPage.mjs.map +1 -1
  5. package/dist/admin/future/pages/Assets/components/AssetsGrid.js +161 -30
  6. package/dist/admin/future/pages/Assets/components/AssetsGrid.js.map +1 -1
  7. package/dist/admin/future/pages/Assets/components/AssetsGrid.mjs +163 -32
  8. package/dist/admin/future/pages/Assets/components/AssetsGrid.mjs.map +1 -1
  9. package/dist/admin/future/pages/Assets/components/AssetsTable.js +222 -59
  10. package/dist/admin/future/pages/Assets/components/AssetsTable.js.map +1 -1
  11. package/dist/admin/future/pages/Assets/components/AssetsTable.mjs +223 -60
  12. package/dist/admin/future/pages/Assets/components/AssetsTable.mjs.map +1 -1
  13. package/dist/admin/future/pages/Assets/components/BulkActionsBar.js +252 -0
  14. package/dist/admin/future/pages/Assets/components/BulkActionsBar.js.map +1 -0
  15. package/dist/admin/future/pages/Assets/components/BulkActionsBar.mjs +250 -0
  16. package/dist/admin/future/pages/Assets/components/BulkActionsBar.mjs.map +1 -0
  17. package/dist/admin/future/pages/Assets/components/BulkMoveDialog.js +209 -0
  18. package/dist/admin/future/pages/Assets/components/BulkMoveDialog.js.map +1 -0
  19. package/dist/admin/future/pages/Assets/components/BulkMoveDialog.mjs +207 -0
  20. package/dist/admin/future/pages/Assets/components/BulkMoveDialog.mjs.map +1 -0
  21. package/dist/admin/future/pages/Assets/components/Dnd/AssetsDndProvider.js +111 -36
  22. package/dist/admin/future/pages/Assets/components/Dnd/AssetsDndProvider.js.map +1 -1
  23. package/dist/admin/future/pages/Assets/components/Dnd/AssetsDndProvider.mjs +113 -38
  24. package/dist/admin/future/pages/Assets/components/Dnd/AssetsDndProvider.mjs.map +1 -1
  25. package/dist/admin/future/pages/Assets/components/Dnd/DragOverlayChip.js +120 -13
  26. package/dist/admin/future/pages/Assets/components/Dnd/DragOverlayChip.js.map +1 -1
  27. package/dist/admin/future/pages/Assets/components/Dnd/DragOverlayChip.mjs +120 -13
  28. package/dist/admin/future/pages/Assets/components/Dnd/DragOverlayChip.mjs.map +1 -1
  29. package/dist/admin/future/pages/Assets/components/Dnd/buildDragSet.js +71 -0
  30. package/dist/admin/future/pages/Assets/components/Dnd/buildDragSet.js.map +1 -0
  31. package/dist/admin/future/pages/Assets/components/Dnd/buildDragSet.mjs +69 -0
  32. package/dist/admin/future/pages/Assets/components/Dnd/buildDragSet.mjs.map +1 -0
  33. package/dist/admin/future/pages/Assets/components/Dnd/computeValidDropTargets.js +34 -0
  34. package/dist/admin/future/pages/Assets/components/Dnd/computeValidDropTargets.js.map +1 -0
  35. package/dist/admin/future/pages/Assets/components/Dnd/computeValidDropTargets.mjs +32 -0
  36. package/dist/admin/future/pages/Assets/components/Dnd/computeValidDropTargets.mjs.map +1 -0
  37. package/dist/admin/future/pages/Assets/components/Dnd/dndIds.js +15 -0
  38. package/dist/admin/future/pages/Assets/components/Dnd/dndIds.js.map +1 -1
  39. package/dist/admin/future/pages/Assets/components/Dnd/dndIds.mjs +13 -1
  40. package/dist/admin/future/pages/Assets/components/Dnd/dndIds.mjs.map +1 -1
  41. package/dist/admin/future/pages/Assets/components/Dnd/useAssetDnd.js +19 -25
  42. package/dist/admin/future/pages/Assets/components/Dnd/useAssetDnd.js.map +1 -1
  43. package/dist/admin/future/pages/Assets/components/Dnd/useAssetDnd.mjs +19 -25
  44. package/dist/admin/future/pages/Assets/components/Dnd/useAssetDnd.mjs.map +1 -1
  45. package/dist/admin/future/pages/Assets/components/Dnd/useFolderTreeDroppable.js +35 -0
  46. package/dist/admin/future/pages/Assets/components/Dnd/useFolderTreeDroppable.js.map +1 -0
  47. package/dist/admin/future/pages/Assets/components/Dnd/useFolderTreeDroppable.mjs +33 -0
  48. package/dist/admin/future/pages/Assets/components/Dnd/useFolderTreeDroppable.mjs.map +1 -0
  49. package/dist/admin/future/pages/Assets/components/EmptyState.js +63 -0
  50. package/dist/admin/future/pages/Assets/components/EmptyState.js.map +1 -0
  51. package/dist/admin/future/pages/Assets/components/EmptyState.mjs +61 -0
  52. package/dist/admin/future/pages/Assets/components/EmptyState.mjs.map +1 -0
  53. package/dist/admin/future/pages/Assets/components/FolderTree/FolderTree.js +120 -22
  54. package/dist/admin/future/pages/Assets/components/FolderTree/FolderTree.js.map +1 -1
  55. package/dist/admin/future/pages/Assets/components/FolderTree/FolderTree.mjs +121 -23
  56. package/dist/admin/future/pages/Assets/components/FolderTree/FolderTree.mjs.map +1 -1
  57. package/dist/admin/future/pages/Assets/components/FolderTree/useSpringLoadedExpand.js +22 -0
  58. package/dist/admin/future/pages/Assets/components/FolderTree/useSpringLoadedExpand.js.map +1 -0
  59. package/dist/admin/future/pages/Assets/components/FolderTree/useSpringLoadedExpand.mjs +19 -0
  60. package/dist/admin/future/pages/Assets/components/FolderTree/useSpringLoadedExpand.mjs.map +1 -0
  61. package/dist/admin/future/pages/Assets/components/SortMenu.js +165 -0
  62. package/dist/admin/future/pages/Assets/components/SortMenu.js.map +1 -0
  63. package/dist/admin/future/pages/Assets/components/SortMenu.mjs +163 -0
  64. package/dist/admin/future/pages/Assets/components/SortMenu.mjs.map +1 -0
  65. package/dist/admin/future/pages/Assets/hooks/useAssetSelection.js +59 -0
  66. package/dist/admin/future/pages/Assets/hooks/useAssetSelection.js.map +1 -0
  67. package/dist/admin/future/pages/Assets/hooks/useAssetSelection.mjs +55 -0
  68. package/dist/admin/future/pages/Assets/hooks/useAssetSelection.mjs.map +1 -0
  69. package/dist/admin/future/pages/Assets/hooks/useListSort.js +124 -0
  70. package/dist/admin/future/pages/Assets/hooks/useListSort.js.map +1 -0
  71. package/dist/admin/future/pages/Assets/hooks/useListSort.mjs +120 -0
  72. package/dist/admin/future/pages/Assets/hooks/useListSort.mjs.map +1 -0
  73. package/dist/admin/future/pages/Assets/utils/listQueryKey.js +29 -0
  74. package/dist/admin/future/pages/Assets/utils/listQueryKey.js.map +1 -0
  75. package/dist/admin/future/pages/Assets/utils/listQueryKey.mjs +27 -0
  76. package/dist/admin/future/pages/Assets/utils/listQueryKey.mjs.map +1 -0
  77. package/dist/admin/future/pages/Assets/utils/mergeMixedList.js +84 -0
  78. package/dist/admin/future/pages/Assets/utils/mergeMixedList.js.map +1 -0
  79. package/dist/admin/future/pages/Assets/utils/mergeMixedList.mjs +81 -0
  80. package/dist/admin/future/pages/Assets/utils/mergeMixedList.mjs.map +1 -0
  81. package/dist/admin/future/pages/Assets/utils/selection.js +104 -0
  82. package/dist/admin/future/pages/Assets/utils/selection.js.map +1 -0
  83. package/dist/admin/future/pages/Assets/utils/selection.mjs +94 -0
  84. package/dist/admin/future/pages/Assets/utils/selection.mjs.map +1 -0
  85. package/dist/admin/future/services/assets.js +33 -1
  86. package/dist/admin/future/services/assets.js.map +1 -1
  87. package/dist/admin/future/services/assets.mjs +33 -2
  88. package/dist/admin/future/services/assets.mjs.map +1 -1
  89. package/dist/admin/future/services/folders.js +3 -3
  90. package/dist/admin/future/services/folders.js.map +1 -1
  91. package/dist/admin/future/services/folders.mjs +3 -3
  92. package/dist/admin/future/services/folders.mjs.map +1 -1
  93. package/dist/admin/future/services/uploadFileViaXHR.js +23 -2
  94. package/dist/admin/future/services/uploadFileViaXHR.js.map +1 -1
  95. package/dist/admin/future/services/uploadFileViaXHR.mjs +23 -2
  96. package/dist/admin/future/services/uploadFileViaXHR.mjs.map +1 -1
  97. package/dist/admin/future/utils/buildDragSetFromSelection.js +33 -0
  98. package/dist/admin/future/utils/buildDragSetFromSelection.js.map +1 -0
  99. package/dist/admin/future/utils/buildDragSetFromSelection.mjs +31 -0
  100. package/dist/admin/future/utils/buildDragSetFromSelection.mjs.map +1 -0
  101. package/dist/admin/future/utils/canDropItemOnFolder.js +4 -0
  102. package/dist/admin/future/utils/canDropItemOnFolder.js.map +1 -1
  103. package/dist/admin/future/utils/canDropItemOnFolder.mjs +4 -0
  104. package/dist/admin/future/utils/canDropItemOnFolder.mjs.map +1 -1
  105. package/dist/admin/future/utils/flattenFolderStructure.js +28 -0
  106. package/dist/admin/future/utils/flattenFolderStructure.js.map +1 -0
  107. package/dist/admin/future/utils/flattenFolderStructure.mjs +26 -0
  108. package/dist/admin/future/utils/flattenFolderStructure.mjs.map +1 -0
  109. package/dist/admin/future/utils/formatMoveSuccessMessage.js +19 -0
  110. package/dist/admin/future/utils/formatMoveSuccessMessage.js.map +1 -0
  111. package/dist/admin/future/utils/formatMoveSuccessMessage.mjs +17 -0
  112. package/dist/admin/future/utils/formatMoveSuccessMessage.mjs.map +1 -0
  113. package/dist/admin/future/utils/getFolderLabel.js +31 -0
  114. package/dist/admin/future/utils/getFolderLabel.js.map +1 -0
  115. package/dist/admin/future/utils/getFolderLabel.mjs +29 -0
  116. package/dist/admin/future/utils/getFolderLabel.mjs.map +1 -0
  117. package/dist/admin/hooks/useUpload.js +15 -9
  118. package/dist/admin/hooks/useUpload.js.map +1 -1
  119. package/dist/admin/hooks/useUpload.mjs +17 -11
  120. package/dist/admin/hooks/useUpload.mjs.map +1 -1
  121. package/dist/admin/src/future/pages/Assets/components/AssetsGrid.d.ts +1 -1
  122. package/dist/admin/src/future/pages/Assets/components/AssetsTable.d.ts +7 -1
  123. package/dist/admin/src/future/pages/Assets/components/BulkActionsBar.d.ts +1 -0
  124. package/dist/admin/src/future/pages/Assets/components/BulkMoveDialog.d.ts +13 -0
  125. package/dist/admin/src/future/pages/Assets/components/Dnd/AssetsDndProvider.d.ts +2 -0
  126. package/dist/admin/src/future/pages/Assets/components/Dnd/DragOverlayChip.d.ts +2 -2
  127. package/dist/admin/src/future/pages/Assets/components/Dnd/buildDragSet.d.ts +17 -0
  128. package/dist/admin/src/future/pages/Assets/components/Dnd/computeValidDropTargets.d.ts +7 -0
  129. package/dist/admin/src/future/pages/Assets/components/Dnd/dndIds.d.ts +3 -0
  130. package/dist/admin/src/future/pages/Assets/components/Dnd/useAssetDnd.d.ts +3 -1
  131. package/dist/admin/src/future/pages/Assets/components/Dnd/useFolderTreeDroppable.d.ts +19 -0
  132. package/dist/admin/src/future/pages/Assets/components/EmptyState.d.ts +11 -0
  133. package/dist/admin/src/future/pages/Assets/components/FolderTree/useSpringLoadedExpand.d.ts +6 -0
  134. package/dist/admin/src/future/pages/Assets/components/SortMenu.d.ts +17 -0
  135. package/dist/admin/src/future/pages/Assets/hooks/useAssetSelection.d.ts +39 -0
  136. package/dist/admin/src/future/pages/Assets/hooks/useListSort.d.ts +47 -0
  137. package/dist/admin/src/future/pages/Assets/utils/listQueryKey.d.ts +30 -0
  138. package/dist/admin/src/future/pages/Assets/utils/mergeMixedList.d.ts +40 -0
  139. package/dist/admin/src/future/pages/Assets/utils/selection.d.ts +50 -0
  140. package/dist/admin/src/future/services/assets.d.ts +4 -1
  141. package/dist/admin/src/future/services/folders.d.ts +4 -1
  142. package/dist/admin/src/future/services/uploadFileViaXHR.d.ts +1 -17
  143. package/dist/admin/src/future/types/dnd.d.ts +5 -0
  144. package/dist/admin/src/future/utils/buildDragSetFromSelection.d.ts +11 -0
  145. package/dist/admin/src/future/utils/canDropItemOnFolder.d.ts +1 -1
  146. package/dist/admin/src/future/utils/flattenFolderStructure.d.ts +18 -0
  147. package/dist/admin/src/future/utils/formatMoveSuccessMessage.d.ts +14 -0
  148. package/dist/admin/src/future/utils/getFolderLabel.d.ts +11 -0
  149. package/dist/admin/translations/en.json.js +36 -0
  150. package/dist/admin/translations/en.json.js.map +1 -1
  151. package/dist/admin/translations/en.json.mjs +36 -0
  152. package/dist/admin/translations/en.json.mjs.map +1 -1
  153. package/dist/shared/contracts/folders.d.ts +1 -1
  154. package/package.json +8 -8
@@ -14,16 +14,23 @@ var translations = require('../../utils/translations.js');
14
14
  var AssetDetailsDrawer = require('./components/AssetDetails/AssetDetailsDrawer.js');
15
15
  var AssetsGrid = require('./components/AssetsGrid.js');
16
16
  var AssetsTable = require('./components/AssetsTable.js');
17
+ var BulkActionsBar = require('./components/BulkActionsBar.js');
17
18
  var CreateFolderDialog = require('./components/CreateFolderDialog.js');
18
19
  var AssetsDndProvider = require('./components/Dnd/AssetsDndProvider.js');
19
20
  var UploadDropZone = require('./components/DropZone/UploadDropZone.js');
20
21
  var UploadDropZoneContext = require('./components/DropZone/UploadDropZoneContext.js');
22
+ var EmptyState = require('./components/EmptyState.js');
21
23
  var FolderTree = require('./components/FolderTree/FolderTree.js');
22
24
  var ImportFromUrlDialog = require('./components/ImportFromUrlDialog.js');
25
+ var SortMenu = require('./components/SortMenu.js');
23
26
  var constants = require('./constants.js');
27
+ var useAssetSelection = require('./hooks/useAssetSelection.js');
24
28
  var useFolderInfo = require('./hooks/useFolderInfo.js');
25
29
  var useFolderNavigation = require('./hooks/useFolderNavigation.js');
26
30
  var useInfiniteAssets = require('./hooks/useInfiniteAssets.js');
31
+ var useListSort = require('./hooks/useListSort.js');
32
+ var listQueryKey = require('./utils/listQueryKey.js');
33
+ var mergeMixedList = require('./utils/mergeMixedList.js');
27
34
 
28
35
  function _interopNamespace(e) {
29
36
  if (e && e.__esModule) return e;
@@ -48,16 +55,34 @@ var ToggleGroup__namespace = /*#__PURE__*/_interopNamespace(ToggleGroup);
48
55
  const INTERSECTION_OPTIONS = {
49
56
  threshold: 0.1
50
57
  };
51
- const AssetsView = ({ view, folderId, onAssetItemClick })=>{
58
+ const AssetsView = ({ view, folderId, assetsSort, foldersSort, foldersPosition, onAssetItemClick, onAddAssets })=>{
52
59
  const { formatMessage } = reactIntl.useIntl();
53
60
  const { assets, isLoading: isLoadingAssets, isFetchingMore, hasNextPage, fetchNextPage, error } = useInfiniteAssets.useInfiniteAssets({
54
- folder: folderId
61
+ folder: folderId,
62
+ sort: assetsSort
55
63
  });
56
64
  const { data: folders$1 = [], isLoading: isLoadingFolders } = folders.useGetFoldersQuery({
57
- parentId: folderId
65
+ parentId: folderId,
66
+ sort: foldersSort
58
67
  });
59
68
  const isGridView = view === constants.viewOptions.GRID;
60
69
  const isLoading = isLoadingAssets || isLoadingFolders;
70
+ // "Folders: Mixed with files" — interleave the complete folder list into the
71
+ // loaded asset stream client-side, following the active sort. Table view
72
+ // only: the grid always keeps folders in their own band on top.
73
+ const mixedItems = React.useMemo(()=>foldersPosition === 'mixed' && !isGridView ? mergeMixedList.mergeMixedList({
74
+ folders: folders$1,
75
+ assets,
76
+ sort: assetsSort,
77
+ hasNextPage
78
+ }) : null, [
79
+ foldersPosition,
80
+ isGridView,
81
+ folders$1,
82
+ assets,
83
+ assetsSort,
84
+ hasNextPage
85
+ ]);
61
86
  const loadMoreRef = strapiAdmin.useElementOnScreen(React.useCallback((isVisible)=>{
62
87
  if (isVisible && hasNextPage && !isFetchingMore) {
63
88
  fetchNextPage();
@@ -92,15 +117,8 @@ const AssetsView = ({ view, folderId, onAssetItemClick })=>{
92
117
  });
93
118
  }
94
119
  if (folders$1.length === 0 && assets.length === 0) {
95
- return /*#__PURE__*/ jsxRuntime.jsx(designSystem.Box, {
96
- padding: 8,
97
- children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
98
- textColor: "neutral600",
99
- children: formatMessage({
100
- id: 'app.components.EmptyStateLayout.content-document',
101
- defaultMessage: 'No content found'
102
- })
103
- })
120
+ return /*#__PURE__*/ jsxRuntime.jsx(EmptyState.EmptyState, {
121
+ onAddAssets: onAddAssets
104
122
  });
105
123
  }
106
124
  return /*#__PURE__*/ jsxRuntime.jsxs(jsxRuntime.Fragment, {
@@ -112,6 +130,7 @@ const AssetsView = ({ view, folderId, onAssetItemClick })=>{
112
130
  }) : /*#__PURE__*/ jsxRuntime.jsx(AssetsTable.AssetsTable, {
113
131
  assets: assets,
114
132
  folders: folders$1,
133
+ mixedItems: mixedItems,
115
134
  onAssetItemClick: onAssetItemClick
116
135
  }),
117
136
  /*#__PURE__*/ jsxRuntime.jsx("div", {
@@ -133,32 +152,54 @@ const AssetsView = ({ view, folderId, onAssetItemClick })=>{
133
152
  ]
134
153
  });
135
154
  };
155
+ const ClearSelectionOnChange = ({ listQueryKey })=>{
156
+ const { clear } = useAssetSelection.useAssetSelection();
157
+ React.useEffect(()=>{
158
+ clear();
159
+ }, [
160
+ listQueryKey,
161
+ clear
162
+ ]);
163
+ return null;
164
+ };
136
165
  /* -------------------------------------------------------------------------------------------------
137
166
  * AssetsPage
138
- * -----------------------------------------------------------------------------------------------*/ const StyledToggleGroup = styledComponents.styled(ToggleGroup__namespace.Root)`
167
+ * -----------------------------------------------------------------------------------------------*/ /**
168
+ * Mirrors the design-system Toggle look (grey track, white active segment
169
+ * card) — reproduced locally because the DS component is a labels-only
170
+ * boolean input (no icons) and paints its left segment in danger red. Here
171
+ * both segments use the primary blue when active.
172
+ */ const StyledToggleGroup = styledComponents.styled(ToggleGroup__namespace.Root)`
139
173
  display: flex;
174
+ padding: ${({ theme })=>theme.spaces[1]};
175
+ background: ${({ theme })=>theme.colors.neutral100};
140
176
  border: 1px solid ${({ theme })=>theme.colors.neutral200};
141
177
  border-radius: ${({ theme })=>theme.borderRadius};
142
- overflow: hidden;
143
178
  `;
144
179
  const StyledToggleItem = styledComponents.styled(ToggleGroup__namespace.Item)`
145
180
  display: flex;
181
+ flex: 1 1 50%;
146
182
  align-items: center;
183
+ justify-content: center;
147
184
  gap: ${({ theme })=>theme.spaces[2]};
148
- padding: ${({ theme })=>`${theme.spaces[2]} ${theme.spaces[4]}`};
149
- border: none;
150
- background: ${({ theme })=>theme.colors.neutral0};
151
- color: ${({ theme })=>theme.colors.neutral800};
185
+ padding: 0.6rem ${({ theme })=>theme.spaces[3]};
186
+ border: 1px solid transparent;
187
+ border-radius: ${({ theme })=>theme.borderRadius};
188
+ background: transparent;
189
+ color: ${({ theme })=>theme.colors.neutral600};
152
190
  cursor: pointer;
153
191
  font-size: ${({ theme })=>theme.fontSizes[1]};
154
192
  font-weight: ${({ theme })=>theme.fontWeights.semiBold};
193
+ white-space: nowrap;
155
194
 
156
195
  &:hover {
157
- background: ${({ theme })=>theme.colors.primary100};
196
+ color: ${({ theme })=>theme.colors.neutral700};
158
197
  }
159
198
 
160
199
  &[data-state='on'] {
161
- background: ${({ theme })=>theme.colors.neutral150};
200
+ background: ${({ theme })=>theme.colors.neutral0};
201
+ border-color: ${({ theme })=>theme.colors.neutral200};
202
+ color: ${({ theme })=>theme.colors.primary600};
162
203
  }
163
204
 
164
205
  svg {
@@ -263,119 +304,137 @@ const AssetsPage = ()=>{
263
304
  // Error is already dispatched to store from the API queryFn
264
305
  }
265
306
  };
307
+ const listSort = useListSort.useListSort();
308
+ // The view is deliberately absent: table and grid render the same list, so
309
+ // toggling views keeps the selection.
310
+ const listQueryKey$1 = listQueryKey.getListQueryKey({
311
+ folderId: currentFolderId,
312
+ search: '',
313
+ // Folder position changes the render order too — selection must reset.
314
+ sort: `${listSort.assetsSort};folders=${listSort.foldersPosition}`,
315
+ filter: null
316
+ });
266
317
  return /*#__PURE__*/ jsxRuntime.jsxs(jsxRuntime.Fragment, {
267
318
  children: [
268
319
  /*#__PURE__*/ jsxRuntime.jsx(UploadDropZoneContext.UploadDropZoneProvider, {
269
320
  onDrop: handleDrop,
270
- children: /*#__PURE__*/ jsxRuntime.jsx(AssetsDndProvider.AssetsDndProvider, {
271
- children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Box, {
272
- ref: uploadDropZoneRef,
273
- children: /*#__PURE__*/ jsxRuntime.jsxs(strapiAdmin.Layouts.Root, {
274
- minHeight: "100vh",
275
- background: "neutral0",
276
- sideNav: /*#__PURE__*/ jsxRuntime.jsx(FolderTree.FolderTree, {
277
- currentFolderId: currentFolderId,
278
- onSelectFolder: navigateToFolderId
321
+ children: /*#__PURE__*/ jsxRuntime.jsx(useAssetSelection.AssetSelectionProvider, {
322
+ children: /*#__PURE__*/ jsxRuntime.jsxs(AssetsDndProvider.AssetsDndProvider, {
323
+ children: [
324
+ /*#__PURE__*/ jsxRuntime.jsx(ClearSelectionOnChange, {
325
+ listQueryKey: listQueryKey$1
279
326
  }),
280
- children: [
281
- /*#__PURE__*/ jsxRuntime.jsx(designSystem.VisuallyHidden, {
282
- children: /*#__PURE__*/ jsxRuntime.jsx("input", {
283
- type: "file",
284
- ref: fileInputRef,
285
- onChange: handleFileChange,
286
- multiple: true
287
- })
288
- }),
289
- /*#__PURE__*/ jsxRuntime.jsx(HeaderWrapper, {
290
- children: /*#__PURE__*/ jsxRuntime.jsx(strapiAdmin.Layouts.Header, {
291
- title: pageHeaderTitle,
292
- primaryAction: /*#__PURE__*/ jsxRuntime.jsxs(designSystem.SimpleMenu, {
293
- popoverPlacement: "bottom-end",
294
- variant: "default",
295
- endIcon: /*#__PURE__*/ jsxRuntime.jsx(icons.ChevronDown, {}),
296
- label: formatMessage({
297
- id: translations.getTranslationKey('new'),
298
- defaultMessage: 'New'
299
- }),
300
- children: [
301
- /*#__PURE__*/ jsxRuntime.jsx(designSystem.MenuItem, {
302
- onSelect: ()=>setIsCreateFolderDialogOpen(true),
303
- startIcon: /*#__PURE__*/ jsxRuntime.jsx(icons.Folder, {}),
304
- children: formatMessage({
305
- id: translations.getTranslationKey('folder.create.title'),
306
- defaultMessage: 'New folder'
307
- })
308
- }),
309
- /*#__PURE__*/ jsxRuntime.jsx(designSystem.MenuItem, {
310
- onSelect: handleFileSelect,
311
- startIcon: /*#__PURE__*/ jsxRuntime.jsx(icons.Files, {}),
312
- children: formatMessage({
313
- id: translations.getTranslationKey('import-files'),
314
- defaultMessage: 'Import files'
315
- })
316
- }),
317
- /*#__PURE__*/ jsxRuntime.jsx(designSystem.MenuItem, {
318
- onSelect: ()=>setIsUrlDialogOpen(true),
319
- startIcon: /*#__PURE__*/ jsxRuntime.jsx(icons.Link, {}),
320
- children: formatMessage({
321
- id: translations.getTranslationKey('import-from-url'),
322
- defaultMessage: 'Import from URL'
323
- })
324
- })
325
- ]
327
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.Box, {
328
+ ref: uploadDropZoneRef,
329
+ children: /*#__PURE__*/ jsxRuntime.jsxs(strapiAdmin.Layouts.Root, {
330
+ minHeight: "100vh",
331
+ background: "neutral0",
332
+ sideNav: /*#__PURE__*/ jsxRuntime.jsx(FolderTree.FolderTree, {
333
+ currentFolderId: currentFolderId,
334
+ onSelectFolder: navigateToFolderId
335
+ }),
336
+ children: [
337
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.VisuallyHidden, {
338
+ children: /*#__PURE__*/ jsxRuntime.jsx("input", {
339
+ type: "file",
340
+ ref: fileInputRef,
341
+ onChange: handleFileChange,
342
+ multiple: true
343
+ })
326
344
  }),
327
- subtitle: /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Flex, {
328
- justifyContent: "space-between",
329
- alignItems: "center",
330
- gap: 4,
331
- width: "100%",
332
- children: [
333
- /*#__PURE__*/ jsxRuntime.jsx(designSystem.Flex, {
334
- gap: 4,
335
- alignItems: "center",
336
- children: "TODO: Filters and search"
345
+ /*#__PURE__*/ jsxRuntime.jsx(HeaderWrapper, {
346
+ children: /*#__PURE__*/ jsxRuntime.jsx(strapiAdmin.Layouts.Header, {
347
+ title: pageHeaderTitle,
348
+ primaryAction: /*#__PURE__*/ jsxRuntime.jsxs(designSystem.SimpleMenu, {
349
+ popoverPlacement: "bottom-end",
350
+ variant: "default",
351
+ endIcon: /*#__PURE__*/ jsxRuntime.jsx(icons.ChevronDown, {}),
352
+ label: formatMessage({
353
+ id: translations.getTranslationKey('new'),
354
+ defaultMessage: 'New'
355
+ }),
356
+ children: [
357
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.MenuItem, {
358
+ onSelect: ()=>setIsCreateFolderDialogOpen(true),
359
+ startIcon: /*#__PURE__*/ jsxRuntime.jsx(icons.Folder, {}),
360
+ children: formatMessage({
361
+ id: translations.getTranslationKey('folder.create.title'),
362
+ defaultMessage: 'New folder'
363
+ })
364
+ }),
365
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.MenuItem, {
366
+ onSelect: handleFileSelect,
367
+ startIcon: /*#__PURE__*/ jsxRuntime.jsx(icons.Files, {}),
368
+ children: formatMessage({
369
+ id: translations.getTranslationKey('import-files'),
370
+ defaultMessage: 'Import files'
371
+ })
372
+ }),
373
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.MenuItem, {
374
+ onSelect: ()=>setIsUrlDialogOpen(true),
375
+ startIcon: /*#__PURE__*/ jsxRuntime.jsx(icons.Link, {}),
376
+ children: formatMessage({
377
+ id: translations.getTranslationKey('import-from-url'),
378
+ defaultMessage: 'Import from URL'
379
+ })
380
+ })
381
+ ]
337
382
  }),
338
- /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Flex, {
339
- gap: 4,
383
+ subtitle: /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Flex, {
384
+ justifyContent: "space-between",
340
385
  alignItems: "center",
386
+ gap: 4,
387
+ width: "100%",
341
388
  children: [
342
- /*#__PURE__*/ jsxRuntime.jsx(designSystem.Box, {
343
- children: "TODO: Sort"
389
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.Flex, {
390
+ gap: 4,
391
+ alignItems: "center",
392
+ children: "TODO: Filters and search"
344
393
  }),
345
- /*#__PURE__*/ jsxRuntime.jsxs(StyledToggleGroup, {
346
- type: "single",
347
- value: isGridView ? 'grid' : 'table',
348
- onValueChange: (value)=>value && setView(value === 'grid' ? constants.viewOptions.GRID : constants.viewOptions.TABLE),
349
- "aria-label": formatMessage({
350
- id: translations.getTranslationKey('view.switch.label'),
351
- defaultMessage: 'View options'
352
- }),
394
+ /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Flex, {
395
+ gap: 4,
396
+ alignItems: "stretch",
353
397
  children: [
354
- /*#__PURE__*/ jsxRuntime.jsxs(StyledToggleItem, {
355
- value: "table",
356
- "aria-label": formatMessage({
357
- id: translations.getTranslationKey('view.table'),
358
- defaultMessage: 'Table view'
359
- }),
360
- children: [
361
- /*#__PURE__*/ jsxRuntime.jsx(icons.List, {}),
362
- formatMessage({
363
- id: translations.getTranslationKey('view.table'),
364
- defaultMessage: 'Table view'
365
- })
366
- ]
398
+ /*#__PURE__*/ jsxRuntime.jsx(SortMenu.SortMenu, {
399
+ sort: listSort,
400
+ showFoldersGroup: !isGridView
367
401
  }),
368
- /*#__PURE__*/ jsxRuntime.jsxs(StyledToggleItem, {
369
- value: "grid",
402
+ /*#__PURE__*/ jsxRuntime.jsxs(StyledToggleGroup, {
403
+ type: "single",
404
+ value: isGridView ? 'grid' : 'table',
405
+ onValueChange: (value)=>value && setView(value === 'grid' ? constants.viewOptions.GRID : constants.viewOptions.TABLE),
370
406
  "aria-label": formatMessage({
371
- id: translations.getTranslationKey('view.grid'),
372
- defaultMessage: 'Grid view'
407
+ id: translations.getTranslationKey('view.switch.label'),
408
+ defaultMessage: 'View options'
373
409
  }),
374
410
  children: [
375
- /*#__PURE__*/ jsxRuntime.jsx(icons.GridFour, {}),
376
- formatMessage({
377
- id: translations.getTranslationKey('view.grid'),
378
- defaultMessage: 'Grid view'
411
+ /*#__PURE__*/ jsxRuntime.jsxs(StyledToggleItem, {
412
+ value: "table",
413
+ "aria-label": formatMessage({
414
+ id: translations.getTranslationKey('view.table'),
415
+ defaultMessage: 'Table view'
416
+ }),
417
+ children: [
418
+ /*#__PURE__*/ jsxRuntime.jsx(icons.List, {}),
419
+ formatMessage({
420
+ id: translations.getTranslationKey('view.table'),
421
+ defaultMessage: 'Table view'
422
+ })
423
+ ]
424
+ }),
425
+ /*#__PURE__*/ jsxRuntime.jsxs(StyledToggleItem, {
426
+ value: "grid",
427
+ "aria-label": formatMessage({
428
+ id: translations.getTranslationKey('view.grid'),
429
+ defaultMessage: 'Grid view'
430
+ }),
431
+ children: [
432
+ /*#__PURE__*/ jsxRuntime.jsx(icons.GridFour, {}),
433
+ formatMessage({
434
+ id: translations.getTranslationKey('view.grid'),
435
+ defaultMessage: 'Grid view'
436
+ })
437
+ ]
379
438
  })
380
439
  ]
381
440
  })
@@ -383,27 +442,32 @@ const AssetsPage = ()=>{
383
442
  })
384
443
  ]
385
444
  })
386
- ]
387
- })
388
- })
389
- }),
390
- /*#__PURE__*/ jsxRuntime.jsx(strapiAdmin.Layouts.Content, {
391
- children: /*#__PURE__*/ jsxRuntime.jsxs(UploadDropZone.DropZoneWithOverlay, {
392
- children: [
393
- /*#__PURE__*/ jsxRuntime.jsx(UploadDropZone.DropFilesMessage, {
394
- uploadDropZoneRef: uploadDropZoneRef,
395
- folderName: title
396
- }),
397
- /*#__PURE__*/ jsxRuntime.jsx(AssetsView, {
398
- view: view,
399
- folderId: currentFolderId,
400
- onAssetItemClick: openDetails
401
445
  })
402
- ]
403
- })
446
+ }),
447
+ /*#__PURE__*/ jsxRuntime.jsx(strapiAdmin.Layouts.Content, {
448
+ children: /*#__PURE__*/ jsxRuntime.jsxs(UploadDropZone.DropZoneWithOverlay, {
449
+ children: [
450
+ /*#__PURE__*/ jsxRuntime.jsx(UploadDropZone.DropFilesMessage, {
451
+ uploadDropZoneRef: uploadDropZoneRef,
452
+ folderName: title
453
+ }),
454
+ /*#__PURE__*/ jsxRuntime.jsx(AssetsView, {
455
+ view: view,
456
+ folderId: currentFolderId,
457
+ assetsSort: listSort.assetsSort,
458
+ foldersSort: listSort.foldersSort,
459
+ foldersPosition: listSort.foldersPosition,
460
+ onAssetItemClick: openDetails,
461
+ onAddAssets: handleFileSelect
462
+ })
463
+ ]
464
+ })
465
+ })
466
+ ]
404
467
  })
405
- ]
406
- })
468
+ }),
469
+ /*#__PURE__*/ jsxRuntime.jsx(BulkActionsBar.BulkActionsBar, {})
470
+ ]
407
471
  })
408
472
  })
409
473
  }),
@@ -1 +1 @@
1
- {"version":3,"file":"AssetsPage.js","sources":["../../../../../admin/src/future/pages/Assets/AssetsPage.tsx"],"sourcesContent":["import { useRef, useCallback, useState, useEffect, type ChangeEvent } from 'react';\n\nimport * as ToggleGroup from '@radix-ui/react-toggle-group';\nimport { Layouts, useElementOnScreen, usePersistentState } from '@strapi/admin/strapi-admin';\nimport {\n Box,\n Flex,\n Loader,\n MenuItem,\n SimpleMenu,\n Typography,\n VisuallyHidden,\n} from '@strapi/design-system';\nimport { ChevronDown, Files, Folder, GridFour as GridIcon, Link, List } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { useUploadFromUrlsMutation, useUploadFilesMutation } from '../../services/api';\nimport { useGetFolderQuery, useGetFoldersQuery } from '../../services/folders';\nimport { getTranslationKey } from '../../utils/translations';\n\nimport {\n AssetDetailsDrawer,\n useAssetDetailsParam,\n} from './components/AssetDetails/AssetDetailsDrawer';\nimport { AssetsGrid } from './components/AssetsGrid';\nimport { AssetsTable } from './components/AssetsTable';\nimport { CreateFolderDialog } from './components/CreateFolderDialog';\nimport { AssetsDndProvider } from './components/Dnd/AssetsDndProvider';\nimport { DropFilesMessage, DropZoneWithOverlay } from './components/DropZone/UploadDropZone';\nimport { UploadDropZoneProvider } from './components/DropZone/UploadDropZoneContext';\nimport { FolderTree } from './components/FolderTree/FolderTree';\nimport { ImportFromUrlDialog } from './components/ImportFromUrlDialog';\nimport { localStorageKeys, viewOptions } from './constants';\nimport { useFolderInfo } from './hooks/useFolderInfo';\nimport { useFolderNavigation } from './hooks/useFolderNavigation';\nimport { useInfiniteAssets } from './hooks/useInfiniteAssets';\n\nimport type { UploadFileInfo } from '../../../../../shared/contracts/files';\n\nconst INTERSECTION_OPTIONS: IntersectionObserverInit = { threshold: 0.1 };\n\n/* -------------------------------------------------------------------------------------------------\n * AssetsView\n * -----------------------------------------------------------------------------------------------*/\n\ninterface AssetsViewProps {\n view: number;\n folderId: number | null;\n onAssetItemClick: (assetId: number) => void;\n}\n\nconst AssetsView = ({ view, folderId, onAssetItemClick }: AssetsViewProps) => {\n const { formatMessage } = useIntl();\n const {\n assets,\n isLoading: isLoadingAssets,\n isFetchingMore,\n hasNextPage,\n fetchNextPage,\n error,\n } = useInfiniteAssets({ folder: folderId });\n const { data: folders = [], isLoading: isLoadingFolders } = useGetFoldersQuery({\n parentId: folderId,\n });\n\n const isGridView = view === viewOptions.GRID;\n const isLoading = isLoadingAssets || isLoadingFolders;\n\n const loadMoreRef = useElementOnScreen<HTMLDivElement>(\n useCallback(\n (isVisible) => {\n if (isVisible && hasNextPage && !isFetchingMore) {\n fetchNextPage();\n }\n },\n [hasNextPage, isFetchingMore, fetchNextPage]\n ),\n INTERSECTION_OPTIONS\n );\n\n if (isLoading) {\n return (\n <Flex justifyContent=\"center\" padding={8}>\n <Loader>{formatMessage({ id: 'app.loading', defaultMessage: 'Loading...' })}</Loader>\n </Flex>\n );\n }\n\n if (error) {\n return (\n <Box padding={8}>\n <Typography textColor=\"danger600\">\n {formatMessage({\n id: getTranslationKey('list.assets.error'),\n defaultMessage: 'An error occurred while fetching assets.',\n })}\n </Typography>\n </Box>\n );\n }\n\n if (folders.length === 0 && assets.length === 0) {\n return (\n <Box padding={8}>\n <Typography textColor=\"neutral600\">\n {formatMessage({\n id: 'app.components.EmptyStateLayout.content-document',\n defaultMessage: 'No content found',\n })}\n </Typography>\n </Box>\n );\n }\n return (\n <>\n {isGridView ? (\n <AssetsGrid folders={folders} assets={assets} onAssetItemClick={onAssetItemClick} />\n ) : (\n <AssetsTable assets={assets} folders={folders} onAssetItemClick={onAssetItemClick} />\n )}\n <div ref={loadMoreRef} style={{ height: 1 }} />\n {isFetchingMore && (\n <Flex justifyContent=\"center\" padding={4}>\n <Loader>\n {formatMessage({\n id: getTranslationKey('list.assets.loading-more'),\n defaultMessage: 'Loading more assets...',\n })}\n </Loader>\n </Flex>\n )}\n </>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * AssetsPage\n * -----------------------------------------------------------------------------------------------*/\n\nconst StyledToggleGroup = styled(ToggleGroup.Root)`\n display: flex;\n border: 1px solid ${({ theme }) => theme.colors.neutral200};\n border-radius: ${({ theme }) => theme.borderRadius};\n overflow: hidden;\n`;\n\nconst StyledToggleItem = styled(ToggleGroup.Item)`\n display: flex;\n align-items: center;\n gap: ${({ theme }) => theme.spaces[2]};\n padding: ${({ theme }) => `${theme.spaces[2]} ${theme.spaces[4]}`};\n border: none;\n background: ${({ theme }) => theme.colors.neutral0};\n color: ${({ theme }) => theme.colors.neutral800};\n cursor: pointer;\n font-size: ${({ theme }) => theme.fontSizes[1]};\n font-weight: ${({ theme }) => theme.fontWeights.semiBold};\n\n &:hover {\n background: ${({ theme }) => theme.colors.primary100};\n }\n\n &[data-state='on'] {\n background: ${({ theme }) => theme.colors.neutral150};\n }\n\n svg {\n width: 1.6rem;\n height: 1.6rem;\n }\n`;\n\nconst HeaderWrapper = styled(Box)`\n [data-strapi-header] {\n background: ${({ theme }) => theme.colors.neutral0};\n\n h1 {\n font-size: 1.8rem;\n }\n }\n`;\n\nexport const AssetsPage = () => {\n const { formatMessage } = useIntl();\n const { openDetails } = useAssetDetailsParam();\n\n const { currentFolderId, navigateToFolderId, navigateToRoot } = useFolderNavigation();\n // Deleted or missing folders (404) need a fetch — handled here, not in\n // `useFolderNavigation` (which only strips malformed ?folder= values).\n const { error: currentFolderError } = useGetFolderQuery(\n { id: currentFolderId! },\n { skip: currentFolderId === null }\n );\n\n useEffect(() => {\n if (currentFolderError?.name === 'NotFoundError') {\n navigateToRoot();\n }\n }, [currentFolderError, navigateToRoot]);\n const { title, itemCount } = useFolderInfo(currentFolderId);\n const itemCountLabel = formatMessage(\n {\n id: getTranslationKey('header.content.item-count'),\n defaultMessage: '{count, plural, =1 {# item} other {# items}}',\n },\n { count: itemCount }\n );\n const pageHeaderTitle = title\n ? `${title} (${itemCountLabel})`\n : formatMessage({ id: 'app.loading', defaultMessage: 'Loading...' });\n\n const [isCreateFolderDialogOpen, setIsCreateFolderDialogOpen] = useState(false);\n\n // View state\n const [view, setView] = usePersistentState(localStorageKeys.view, viewOptions.GRID);\n const isGridView = view === viewOptions.GRID;\n\n // Dialog state\n const [isUrlDialogOpen, setIsUrlDialogOpen] = useState(false);\n\n // Refs\n const fileInputRef = useRef<HTMLInputElement>(null);\n const uploadDropZoneRef = useRef<HTMLDivElement>(null);\n\n // Upload handlers\n const [uploadFiles] = useUploadFilesMutation();\n const [uploadFromUrls] = useUploadFromUrlsMutation();\n\n const uploadFilesToFolder = async (files: globalThis.File[], folderId: number | null) => {\n if (files.length === 0) return;\n\n const formData = new FormData();\n const fileInfoArray: UploadFileInfo[] = [];\n\n files.forEach((file) => {\n formData.append('files', file);\n fileInfoArray.push({\n name: file.name,\n caption: null,\n alternativeText: null,\n folder: folderId,\n });\n });\n\n formData.append('fileInfo', JSON.stringify(fileInfoArray));\n try {\n await uploadFiles({ formData, totalFiles: files.length }).unwrap();\n } catch (error) {\n // Error is already dispatched to store from the API queryFn\n }\n };\n\n const handleFileSelect = () => {\n fileInputRef.current?.click();\n };\n\n const handleFileChange = async (e: ChangeEvent<HTMLInputElement>) => {\n const files = e.target.files;\n if (files && files.length > 0) {\n await uploadFilesToFolder(Array.from(files), currentFolderId);\n }\n e.target.value = '';\n };\n\n const handleDrop = async (files: globalThis.File[]) => {\n await uploadFilesToFolder(files, currentFolderId);\n };\n\n const handleUrlUpload = async (urls: string[]) => {\n try {\n await uploadFromUrls({ urls, folderId: currentFolderId }).unwrap();\n } catch (error) {\n // Error is already dispatched to store from the API queryFn\n }\n };\n\n return (\n <>\n <UploadDropZoneProvider onDrop={handleDrop}>\n <AssetsDndProvider>\n <Box ref={uploadDropZoneRef}>\n <Layouts.Root\n minHeight=\"100vh\"\n background=\"neutral0\"\n sideNav={\n <FolderTree currentFolderId={currentFolderId} onSelectFolder={navigateToFolderId} />\n }\n >\n <VisuallyHidden>\n <input type=\"file\" ref={fileInputRef} onChange={handleFileChange} multiple />\n </VisuallyHidden>\n\n <HeaderWrapper>\n <Layouts.Header\n title={pageHeaderTitle}\n primaryAction={\n <SimpleMenu\n popoverPlacement=\"bottom-end\"\n variant=\"default\"\n endIcon={<ChevronDown />}\n label={formatMessage({ id: getTranslationKey('new'), defaultMessage: 'New' })}\n >\n <MenuItem\n onSelect={() => setIsCreateFolderDialogOpen(true)}\n startIcon={<Folder />}\n >\n {formatMessage({\n id: getTranslationKey('folder.create.title'),\n defaultMessage: 'New folder',\n })}\n </MenuItem>\n <MenuItem onSelect={handleFileSelect} startIcon={<Files />}>\n {formatMessage({\n id: getTranslationKey('import-files'),\n defaultMessage: 'Import files',\n })}\n </MenuItem>\n <MenuItem onSelect={() => setIsUrlDialogOpen(true)} startIcon={<Link />}>\n {formatMessage({\n id: getTranslationKey('import-from-url'),\n defaultMessage: 'Import from URL',\n })}\n </MenuItem>\n </SimpleMenu>\n }\n subtitle={\n <Flex justifyContent=\"space-between\" alignItems=\"center\" gap={4} width=\"100%\">\n <Flex gap={4} alignItems=\"center\">\n TODO: Filters and search\n </Flex>\n\n <Flex gap={4} alignItems=\"center\">\n <Box>TODO: Sort</Box>\n <StyledToggleGroup\n type=\"single\"\n value={isGridView ? 'grid' : 'table'}\n onValueChange={(value) =>\n value &&\n setView(value === 'grid' ? viewOptions.GRID : viewOptions.TABLE)\n }\n aria-label={formatMessage({\n id: getTranslationKey('view.switch.label'),\n defaultMessage: 'View options',\n })}\n >\n <StyledToggleItem\n value=\"table\"\n aria-label={formatMessage({\n id: getTranslationKey('view.table'),\n defaultMessage: 'Table view',\n })}\n >\n <List />\n {formatMessage({\n id: getTranslationKey('view.table'),\n defaultMessage: 'Table view',\n })}\n </StyledToggleItem>\n <StyledToggleItem\n value=\"grid\"\n aria-label={formatMessage({\n id: getTranslationKey('view.grid'),\n defaultMessage: 'Grid view',\n })}\n >\n <GridIcon />\n {formatMessage({\n id: getTranslationKey('view.grid'),\n defaultMessage: 'Grid view',\n })}\n </StyledToggleItem>\n </StyledToggleGroup>\n </Flex>\n </Flex>\n }\n />\n </HeaderWrapper>\n\n <Layouts.Content>\n <DropZoneWithOverlay>\n <DropFilesMessage uploadDropZoneRef={uploadDropZoneRef} folderName={title} />\n <AssetsView\n view={view}\n folderId={currentFolderId}\n onAssetItemClick={openDetails}\n />\n </DropZoneWithOverlay>\n </Layouts.Content>\n </Layouts.Root>\n </Box>\n </AssetsDndProvider>\n </UploadDropZoneProvider>\n <CreateFolderDialog\n open={isCreateFolderDialogOpen}\n folderName={title}\n parentFolderId={currentFolderId}\n onClose={() => setIsCreateFolderDialogOpen(false)}\n />\n <ImportFromUrlDialog\n open={isUrlDialogOpen}\n onClose={() => setIsUrlDialogOpen(false)}\n onUpload={handleUrlUpload}\n />\n <AssetDetailsDrawer />\n </>\n );\n};\n"],"names":["INTERSECTION_OPTIONS","threshold","AssetsView","view","folderId","onAssetItemClick","formatMessage","useIntl","assets","isLoading","isLoadingAssets","isFetchingMore","hasNextPage","fetchNextPage","error","useInfiniteAssets","folder","data","folders","isLoadingFolders","useGetFoldersQuery","parentId","isGridView","viewOptions","GRID","loadMoreRef","useElementOnScreen","useCallback","isVisible","_jsx","Flex","justifyContent","padding","Loader","id","defaultMessage","Box","Typography","textColor","getTranslationKey","length","_jsxs","_Fragment","AssetsGrid","AssetsTable","div","ref","style","height","StyledToggleGroup","styled","ToggleGroup","Root","theme","colors","neutral200","borderRadius","StyledToggleItem","Item","spaces","neutral0","neutral800","fontSizes","fontWeights","semiBold","primary100","neutral150","HeaderWrapper","AssetsPage","openDetails","useAssetDetailsParam","currentFolderId","navigateToFolderId","navigateToRoot","useFolderNavigation","currentFolderError","useGetFolderQuery","skip","useEffect","name","title","itemCount","useFolderInfo","itemCountLabel","count","pageHeaderTitle","isCreateFolderDialogOpen","setIsCreateFolderDialogOpen","useState","setView","usePersistentState","localStorageKeys","isUrlDialogOpen","setIsUrlDialogOpen","fileInputRef","useRef","uploadDropZoneRef","uploadFiles","useUploadFilesMutation","uploadFromUrls","useUploadFromUrlsMutation","uploadFilesToFolder","files","formData","FormData","fileInfoArray","forEach","file","append","push","caption","alternativeText","JSON","stringify","totalFiles","unwrap","handleFileSelect","current","click","handleFileChange","e","target","Array","from","value","handleDrop","handleUrlUpload","urls","UploadDropZoneProvider","onDrop","AssetsDndProvider","Layouts","minHeight","background","sideNav","FolderTree","onSelectFolder","VisuallyHidden","input","type","onChange","multiple","Header","primaryAction","SimpleMenu","popoverPlacement","variant","endIcon","ChevronDown","label","MenuItem","onSelect","startIcon","Folder","Files","Link","subtitle","alignItems","gap","width","onValueChange","TABLE","aria-label","List","GridIcon","Content","DropZoneWithOverlay","DropFilesMessage","folderName","CreateFolderDialog","open","parentFolderId","onClose","ImportFromUrlDialog","onUpload","AssetDetailsDrawer"],"mappings":"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"}
1
+ {"version":3,"file":"AssetsPage.js","sources":["../../../../../admin/src/future/pages/Assets/AssetsPage.tsx"],"sourcesContent":["import { useRef, useCallback, useMemo, useState, useEffect, type ChangeEvent } from 'react';\n\nimport * as ToggleGroup from '@radix-ui/react-toggle-group';\nimport { Layouts, useElementOnScreen, usePersistentState } from '@strapi/admin/strapi-admin';\nimport {\n Box,\n Flex,\n Loader,\n MenuItem,\n SimpleMenu,\n Typography,\n VisuallyHidden,\n} from '@strapi/design-system';\nimport { ChevronDown, Files, Folder, GridFour as GridIcon, Link, List } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { useUploadFromUrlsMutation, useUploadFilesMutation } from '../../services/api';\nimport { useGetFolderQuery, useGetFoldersQuery } from '../../services/folders';\nimport { getTranslationKey } from '../../utils/translations';\n\nimport {\n AssetDetailsDrawer,\n useAssetDetailsParam,\n} from './components/AssetDetails/AssetDetailsDrawer';\nimport { AssetsGrid } from './components/AssetsGrid';\nimport { AssetsTable } from './components/AssetsTable';\nimport { BulkActionsBar } from './components/BulkActionsBar';\nimport { CreateFolderDialog } from './components/CreateFolderDialog';\nimport { AssetsDndProvider } from './components/Dnd/AssetsDndProvider';\nimport { DropFilesMessage, DropZoneWithOverlay } from './components/DropZone/UploadDropZone';\nimport { UploadDropZoneProvider } from './components/DropZone/UploadDropZoneContext';\nimport { EmptyState } from './components/EmptyState';\nimport { FolderTree } from './components/FolderTree/FolderTree';\nimport { ImportFromUrlDialog } from './components/ImportFromUrlDialog';\nimport { SortMenu } from './components/SortMenu';\nimport { localStorageKeys, viewOptions } from './constants';\nimport { AssetSelectionProvider, useAssetSelection } from './hooks/useAssetSelection';\nimport { useFolderInfo } from './hooks/useFolderInfo';\nimport { useFolderNavigation } from './hooks/useFolderNavigation';\nimport { useInfiniteAssets } from './hooks/useInfiniteAssets';\nimport { useListSort, type FoldersPosition } from './hooks/useListSort';\nimport { getListQueryKey } from './utils/listQueryKey';\nimport { mergeMixedList } from './utils/mergeMixedList';\n\nimport type { UploadFileInfo } from '../../../../../shared/contracts/files';\n\nconst INTERSECTION_OPTIONS: IntersectionObserverInit = { threshold: 0.1 };\n\n/* -------------------------------------------------------------------------------------------------\n * AssetsView\n * -----------------------------------------------------------------------------------------------*/\n\ninterface AssetsViewProps {\n view: number;\n folderId: number | null;\n assetsSort: string;\n foldersSort: string;\n foldersPosition: FoldersPosition;\n onAssetItemClick: (assetId: number) => void;\n onAddAssets: () => void;\n}\n\nconst AssetsView = ({\n view,\n folderId,\n assetsSort,\n foldersSort,\n foldersPosition,\n onAssetItemClick,\n onAddAssets,\n}: AssetsViewProps) => {\n const { formatMessage } = useIntl();\n const {\n assets,\n isLoading: isLoadingAssets,\n isFetchingMore,\n hasNextPage,\n fetchNextPage,\n error,\n } = useInfiniteAssets({ folder: folderId, sort: assetsSort });\n const { data: folders = [], isLoading: isLoadingFolders } = useGetFoldersQuery({\n parentId: folderId,\n sort: foldersSort,\n });\n\n const isGridView = view === viewOptions.GRID;\n const isLoading = isLoadingAssets || isLoadingFolders;\n\n // \"Folders: Mixed with files\" — interleave the complete folder list into the\n // loaded asset stream client-side, following the active sort. Table view\n // only: the grid always keeps folders in their own band on top.\n const mixedItems = useMemo(\n () =>\n foldersPosition === 'mixed' && !isGridView\n ? mergeMixedList({ folders, assets, sort: assetsSort, hasNextPage })\n : null,\n [foldersPosition, isGridView, folders, assets, assetsSort, hasNextPage]\n );\n\n const loadMoreRef = useElementOnScreen<HTMLDivElement>(\n useCallback(\n (isVisible) => {\n if (isVisible && hasNextPage && !isFetchingMore) {\n fetchNextPage();\n }\n },\n [hasNextPage, isFetchingMore, fetchNextPage]\n ),\n INTERSECTION_OPTIONS\n );\n\n if (isLoading) {\n return (\n <Flex justifyContent=\"center\" padding={8}>\n <Loader>{formatMessage({ id: 'app.loading', defaultMessage: 'Loading...' })}</Loader>\n </Flex>\n );\n }\n\n if (error) {\n return (\n <Box padding={8}>\n <Typography textColor=\"danger600\">\n {formatMessage({\n id: getTranslationKey('list.assets.error'),\n defaultMessage: 'An error occurred while fetching assets.',\n })}\n </Typography>\n </Box>\n );\n }\n\n if (folders.length === 0 && assets.length === 0) {\n return <EmptyState onAddAssets={onAddAssets} />;\n }\n return (\n <>\n {isGridView ? (\n <AssetsGrid folders={folders} assets={assets} onAssetItemClick={onAssetItemClick} />\n ) : (\n <AssetsTable\n assets={assets}\n folders={folders}\n mixedItems={mixedItems}\n onAssetItemClick={onAssetItemClick}\n />\n )}\n <div ref={loadMoreRef} style={{ height: 1 }} />\n {isFetchingMore && (\n <Flex justifyContent=\"center\" padding={4}>\n <Loader>\n {formatMessage({\n id: getTranslationKey('list.assets.loading-more'),\n defaultMessage: 'Loading more assets...',\n })}\n </Loader>\n </Flex>\n )}\n </>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * ClearSelectionOnChange\n *\n * Selection is list-scoped: it resets when the user is looking at a different list.\n * The list fingerprint is getListQueryKey() — folder, search, sort, filter.\n *\n * Hybrid rule: infinite scroll does not change the key (selection persists).\n * Search/sort/filter changes do (selection clears) — same mental model as folder nav.\n * -----------------------------------------------------------------------------------------------*/\n\ninterface ClearSelectionOnChangeProps {\n listQueryKey: string;\n}\n\nconst ClearSelectionOnChange = ({ listQueryKey }: ClearSelectionOnChangeProps) => {\n const { clear } = useAssetSelection();\n\n useEffect(() => {\n clear();\n }, [listQueryKey, clear]);\n\n return null;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * AssetsPage\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * Mirrors the design-system Toggle look (grey track, white active segment\n * card) — reproduced locally because the DS component is a labels-only\n * boolean input (no icons) and paints its left segment in danger red. Here\n * both segments use the primary blue when active.\n */\nconst StyledToggleGroup = styled(ToggleGroup.Root)`\n display: flex;\n padding: ${({ theme }) => theme.spaces[1]};\n background: ${({ theme }) => theme.colors.neutral100};\n border: 1px solid ${({ theme }) => theme.colors.neutral200};\n border-radius: ${({ theme }) => theme.borderRadius};\n`;\n\nconst StyledToggleItem = styled(ToggleGroup.Item)`\n display: flex;\n flex: 1 1 50%;\n align-items: center;\n justify-content: center;\n gap: ${({ theme }) => theme.spaces[2]};\n padding: 0.6rem ${({ theme }) => theme.spaces[3]};\n border: 1px solid transparent;\n border-radius: ${({ theme }) => theme.borderRadius};\n background: transparent;\n color: ${({ theme }) => theme.colors.neutral600};\n cursor: pointer;\n font-size: ${({ theme }) => theme.fontSizes[1]};\n font-weight: ${({ theme }) => theme.fontWeights.semiBold};\n white-space: nowrap;\n\n &:hover {\n color: ${({ theme }) => theme.colors.neutral700};\n }\n\n &[data-state='on'] {\n background: ${({ theme }) => theme.colors.neutral0};\n border-color: ${({ theme }) => theme.colors.neutral200};\n color: ${({ theme }) => theme.colors.primary600};\n }\n\n svg {\n width: 1.6rem;\n height: 1.6rem;\n }\n`;\n\nconst HeaderWrapper = styled(Box)`\n [data-strapi-header] {\n background: ${({ theme }) => theme.colors.neutral0};\n\n h1 {\n font-size: 1.8rem;\n }\n }\n`;\n\nexport const AssetsPage = () => {\n const { formatMessage } = useIntl();\n const { openDetails } = useAssetDetailsParam();\n\n const { currentFolderId, navigateToFolderId, navigateToRoot } = useFolderNavigation();\n // Deleted or missing folders (404) need a fetch — handled here, not in\n // `useFolderNavigation` (which only strips malformed ?folder= values).\n const { error: currentFolderError } = useGetFolderQuery(\n { id: currentFolderId! },\n { skip: currentFolderId === null }\n );\n\n useEffect(() => {\n if (currentFolderError?.name === 'NotFoundError') {\n navigateToRoot();\n }\n }, [currentFolderError, navigateToRoot]);\n const { title, itemCount } = useFolderInfo(currentFolderId);\n const itemCountLabel = formatMessage(\n {\n id: getTranslationKey('header.content.item-count'),\n defaultMessage: '{count, plural, =1 {# item} other {# items}}',\n },\n { count: itemCount }\n );\n const pageHeaderTitle = title\n ? `${title} (${itemCountLabel})`\n : formatMessage({ id: 'app.loading', defaultMessage: 'Loading...' });\n\n const [isCreateFolderDialogOpen, setIsCreateFolderDialogOpen] = useState(false);\n\n // View state\n const [view, setView] = usePersistentState(localStorageKeys.view, viewOptions.GRID);\n const isGridView = view === viewOptions.GRID;\n\n // Dialog state\n const [isUrlDialogOpen, setIsUrlDialogOpen] = useState(false);\n\n // Refs\n const fileInputRef = useRef<HTMLInputElement>(null);\n const uploadDropZoneRef = useRef<HTMLDivElement>(null);\n\n // Upload handlers\n const [uploadFiles] = useUploadFilesMutation();\n const [uploadFromUrls] = useUploadFromUrlsMutation();\n\n const uploadFilesToFolder = async (files: globalThis.File[], folderId: number | null) => {\n if (files.length === 0) return;\n\n const formData = new FormData();\n const fileInfoArray: UploadFileInfo[] = [];\n\n files.forEach((file) => {\n formData.append('files', file);\n fileInfoArray.push({\n name: file.name,\n caption: null,\n alternativeText: null,\n folder: folderId,\n });\n });\n\n formData.append('fileInfo', JSON.stringify(fileInfoArray));\n try {\n await uploadFiles({ formData, totalFiles: files.length }).unwrap();\n } catch (error) {\n // Error is already dispatched to store from the API queryFn\n }\n };\n\n const handleFileSelect = () => {\n fileInputRef.current?.click();\n };\n\n const handleFileChange = async (e: ChangeEvent<HTMLInputElement>) => {\n const files = e.target.files;\n if (files && files.length > 0) {\n await uploadFilesToFolder(Array.from(files), currentFolderId);\n }\n e.target.value = '';\n };\n\n const handleDrop = async (files: globalThis.File[]) => {\n await uploadFilesToFolder(files, currentFolderId);\n };\n\n const handleUrlUpload = async (urls: string[]) => {\n try {\n await uploadFromUrls({ urls, folderId: currentFolderId }).unwrap();\n } catch (error) {\n // Error is already dispatched to store from the API queryFn\n }\n };\n\n const listSort = useListSort();\n\n // The view is deliberately absent: table and grid render the same list, so\n // toggling views keeps the selection.\n const listQueryKey = getListQueryKey({\n folderId: currentFolderId,\n search: '', // TODO: wire when building header search\n // Folder position changes the render order too — selection must reset.\n sort: `${listSort.assetsSort};folders=${listSort.foldersPosition}`,\n filter: null, // TODO: wire when building header filters\n });\n\n return (\n <>\n <UploadDropZoneProvider onDrop={handleDrop}>\n <AssetSelectionProvider>\n <AssetsDndProvider>\n <ClearSelectionOnChange listQueryKey={listQueryKey} />\n <Box ref={uploadDropZoneRef}>\n <Layouts.Root\n minHeight=\"100vh\"\n background=\"neutral0\"\n sideNav={\n <FolderTree\n currentFolderId={currentFolderId}\n onSelectFolder={navigateToFolderId}\n />\n }\n >\n <VisuallyHidden>\n <input type=\"file\" ref={fileInputRef} onChange={handleFileChange} multiple />\n </VisuallyHidden>\n\n <HeaderWrapper>\n <Layouts.Header\n title={pageHeaderTitle}\n primaryAction={\n <SimpleMenu\n popoverPlacement=\"bottom-end\"\n variant=\"default\"\n endIcon={<ChevronDown />}\n label={formatMessage({\n id: getTranslationKey('new'),\n defaultMessage: 'New',\n })}\n >\n <MenuItem\n onSelect={() => setIsCreateFolderDialogOpen(true)}\n startIcon={<Folder />}\n >\n {formatMessage({\n id: getTranslationKey('folder.create.title'),\n defaultMessage: 'New folder',\n })}\n </MenuItem>\n <MenuItem onSelect={handleFileSelect} startIcon={<Files />}>\n {formatMessage({\n id: getTranslationKey('import-files'),\n defaultMessage: 'Import files',\n })}\n </MenuItem>\n <MenuItem onSelect={() => setIsUrlDialogOpen(true)} startIcon={<Link />}>\n {formatMessage({\n id: getTranslationKey('import-from-url'),\n defaultMessage: 'Import from URL',\n })}\n </MenuItem>\n </SimpleMenu>\n }\n subtitle={\n <Flex justifyContent=\"space-between\" alignItems=\"center\" gap={4} width=\"100%\">\n <Flex gap={4} alignItems=\"center\">\n TODO: Filters and search\n </Flex>\n\n <Flex gap={4} alignItems=\"stretch\">\n <SortMenu sort={listSort} showFoldersGroup={!isGridView} />\n <StyledToggleGroup\n type=\"single\"\n value={isGridView ? 'grid' : 'table'}\n onValueChange={(value) =>\n value &&\n setView(value === 'grid' ? viewOptions.GRID : viewOptions.TABLE)\n }\n aria-label={formatMessage({\n id: getTranslationKey('view.switch.label'),\n defaultMessage: 'View options',\n })}\n >\n <StyledToggleItem\n value=\"table\"\n aria-label={formatMessage({\n id: getTranslationKey('view.table'),\n defaultMessage: 'Table view',\n })}\n >\n <List />\n {formatMessage({\n id: getTranslationKey('view.table'),\n defaultMessage: 'Table view',\n })}\n </StyledToggleItem>\n <StyledToggleItem\n value=\"grid\"\n aria-label={formatMessage({\n id: getTranslationKey('view.grid'),\n defaultMessage: 'Grid view',\n })}\n >\n <GridIcon />\n {formatMessage({\n id: getTranslationKey('view.grid'),\n defaultMessage: 'Grid view',\n })}\n </StyledToggleItem>\n </StyledToggleGroup>\n </Flex>\n </Flex>\n }\n />\n </HeaderWrapper>\n\n <Layouts.Content>\n <DropZoneWithOverlay>\n <DropFilesMessage uploadDropZoneRef={uploadDropZoneRef} folderName={title} />\n <AssetsView\n view={view}\n folderId={currentFolderId}\n assetsSort={listSort.assetsSort}\n foldersSort={listSort.foldersSort}\n foldersPosition={listSort.foldersPosition}\n onAssetItemClick={openDetails}\n onAddAssets={handleFileSelect}\n />\n </DropZoneWithOverlay>\n </Layouts.Content>\n </Layouts.Root>\n </Box>\n <BulkActionsBar />\n </AssetsDndProvider>\n </AssetSelectionProvider>\n </UploadDropZoneProvider>\n <CreateFolderDialog\n open={isCreateFolderDialogOpen}\n folderName={title}\n parentFolderId={currentFolderId}\n onClose={() => setIsCreateFolderDialogOpen(false)}\n />\n <ImportFromUrlDialog\n open={isUrlDialogOpen}\n onClose={() => setIsUrlDialogOpen(false)}\n onUpload={handleUrlUpload}\n />\n <AssetDetailsDrawer />\n </>\n );\n};\n"],"names":["INTERSECTION_OPTIONS","threshold","AssetsView","view","folderId","assetsSort","foldersSort","foldersPosition","onAssetItemClick","onAddAssets","formatMessage","useIntl","assets","isLoading","isLoadingAssets","isFetchingMore","hasNextPage","fetchNextPage","error","useInfiniteAssets","folder","sort","data","folders","isLoadingFolders","useGetFoldersQuery","parentId","isGridView","viewOptions","GRID","mixedItems","useMemo","mergeMixedList","loadMoreRef","useElementOnScreen","useCallback","isVisible","_jsx","Flex","justifyContent","padding","Loader","id","defaultMessage","Box","Typography","textColor","getTranslationKey","length","EmptyState","_jsxs","_Fragment","AssetsGrid","AssetsTable","div","ref","style","height","ClearSelectionOnChange","listQueryKey","clear","useAssetSelection","useEffect","StyledToggleGroup","styled","ToggleGroup","Root","theme","spaces","colors","neutral100","neutral200","borderRadius","StyledToggleItem","Item","neutral600","fontSizes","fontWeights","semiBold","neutral700","neutral0","primary600","HeaderWrapper","AssetsPage","openDetails","useAssetDetailsParam","currentFolderId","navigateToFolderId","navigateToRoot","useFolderNavigation","currentFolderError","useGetFolderQuery","skip","name","title","itemCount","useFolderInfo","itemCountLabel","count","pageHeaderTitle","isCreateFolderDialogOpen","setIsCreateFolderDialogOpen","useState","setView","usePersistentState","localStorageKeys","isUrlDialogOpen","setIsUrlDialogOpen","fileInputRef","useRef","uploadDropZoneRef","uploadFiles","useUploadFilesMutation","uploadFromUrls","useUploadFromUrlsMutation","uploadFilesToFolder","files","formData","FormData","fileInfoArray","forEach","file","append","push","caption","alternativeText","JSON","stringify","totalFiles","unwrap","handleFileSelect","current","click","handleFileChange","e","target","Array","from","value","handleDrop","handleUrlUpload","urls","listSort","useListSort","getListQueryKey","search","filter","UploadDropZoneProvider","onDrop","AssetSelectionProvider","AssetsDndProvider","Layouts","minHeight","background","sideNav","FolderTree","onSelectFolder","VisuallyHidden","input","type","onChange","multiple","Header","primaryAction","SimpleMenu","popoverPlacement","variant","endIcon","ChevronDown","label","MenuItem","onSelect","startIcon","Folder","Files","Link","subtitle","alignItems","gap","width","SortMenu","showFoldersGroup","onValueChange","TABLE","aria-label","List","GridIcon","Content","DropZoneWithOverlay","DropFilesMessage","folderName","BulkActionsBar","CreateFolderDialog","open","parentFolderId","onClose","ImportFromUrlDialog","onUpload","AssetDetailsDrawer"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+CA,MAAMA,oBAAAA,GAAiD;IAAEC,SAAAA,EAAW;AAAI,CAAA;AAgBxE,MAAMC,aAAa,CAAC,EAClBC,IAAI,EACJC,QAAQ,EACRC,UAAU,EACVC,WAAW,EACXC,eAAe,EACfC,gBAAgB,EAChBC,WAAW,EACK,GAAA;IAChB,MAAM,EAAEC,aAAa,EAAE,GAAGC,iBAAAA,EAAAA;AAC1B,IAAA,MAAM,EACJC,MAAM,EACNC,SAAAA,EAAWC,eAAe,EAC1BC,cAAc,EACdC,WAAW,EACXC,aAAa,EACbC,KAAK,EACN,GAAGC,mCAAAA,CAAkB;QAAEC,MAAAA,EAAQhB,QAAAA;QAAUiB,IAAAA,EAAMhB;AAAW,KAAA,CAAA;IAC3D,MAAM,EAAEiB,MAAMC,SAAAA,GAAU,EAAE,EAAEV,SAAAA,EAAWW,gBAAgB,EAAE,GAAGC,0BAAAA,CAAmB;QAC7EC,QAAAA,EAAUtB,QAAAA;QACViB,IAAAA,EAAMf;AACR,KAAA,CAAA;IAEA,MAAMqB,UAAAA,GAAaxB,IAAAA,KAASyB,qBAAAA,CAAYC,IAAI;AAC5C,IAAA,MAAMhB,YAAYC,eAAAA,IAAmBU,gBAAAA;;;;AAKrC,IAAA,MAAMM,aAAaC,aAAAA,CACjB,IACExB,oBAAoB,OAAA,IAAW,CAACoB,aAC5BK,6BAAAA,CAAe;AAAET,qBAAAA,SAAAA;AAASX,YAAAA,MAAAA;YAAQS,IAAAA,EAAMhB,UAAAA;AAAYW,YAAAA;AAAY,SAAA,CAAA,GAChE,IAAA,EACN;AAACT,QAAAA,eAAAA;AAAiBoB,QAAAA,UAAAA;AAAYJ,QAAAA,SAAAA;AAASX,QAAAA,MAAAA;AAAQP,QAAAA,UAAAA;AAAYW,QAAAA;AAAY,KAAA,CAAA;IAGzE,MAAMiB,WAAAA,GAAcC,8BAAAA,CAClBC,iBAAAA,CACE,CAACC,SAAAA,GAAAA;QACC,IAAIA,SAAAA,IAAapB,WAAAA,IAAe,CAACD,cAAAA,EAAgB;AAC/CE,YAAAA,aAAAA,EAAAA;AACF,QAAA;IACF,CAAA,EACA;AAACD,QAAAA,WAAAA;AAAaD,QAAAA,cAAAA;AAAgBE,QAAAA;KAAc,CAAA,EAE9CjB,oBAAAA,CAAAA;AAGF,IAAA,IAAIa,SAAAA,EAAW;AACb,QAAA,qBACEwB,cAAA,CAACC,iBAAAA,EAAAA;YAAKC,cAAAA,EAAe,QAAA;YAASC,OAAAA,EAAS,CAAA;AACrC,YAAA,QAAA,gBAAAH,cAAA,CAACI,mBAAAA,EAAAA;0BAAQ/B,aAAAA,CAAc;oBAAEgC,EAAAA,EAAI,aAAA;oBAAeC,cAAAA,EAAgB;AAAa,iBAAA;;;AAG/E,IAAA;AAEA,IAAA,IAAIzB,KAAAA,EAAO;AACT,QAAA,qBACEmB,cAAA,CAACO,gBAAAA,EAAAA;YAAIJ,OAAAA,EAAS,CAAA;AACZ,YAAA,QAAA,gBAAAH,cAAA,CAACQ,uBAAAA,EAAAA;gBAAWC,SAAAA,EAAU,WAAA;0BACnBpC,aAAAA,CAAc;AACbgC,oBAAAA,EAAAA,EAAIK,8BAAAA,CAAkB,mBAAA,CAAA;oBACtBJ,cAAAA,EAAgB;AAClB,iBAAA;;;AAIR,IAAA;AAEA,IAAA,IAAIpB,UAAQyB,MAAM,KAAK,KAAKpC,MAAAA,CAAOoC,MAAM,KAAK,CAAA,EAAG;AAC/C,QAAA,qBAAOX,cAAA,CAACY,qBAAAA,EAAAA;YAAWxC,WAAAA,EAAaA;;AAClC,IAAA;IACA,qBACEyC,eAAA,CAAAC,mBAAA,EAAA;;AACGxB,YAAAA,UAAAA,iBACCU,cAAA,CAACe,qBAAAA,EAAAA;gBAAW7B,OAAAA,EAASA,SAAAA;gBAASX,MAAAA,EAAQA,MAAAA;gBAAQJ,gBAAAA,EAAkBA;+BAEhE6B,cAAA,CAACgB,uBAAAA,EAAAA;gBACCzC,MAAAA,EAAQA,MAAAA;gBACRW,OAAAA,EAASA,SAAAA;gBACTO,UAAAA,EAAYA,UAAAA;gBACZtB,gBAAAA,EAAkBA;;0BAGtB6B,cAAA,CAACiB,KAAAA,EAAAA;gBAAIC,GAAAA,EAAKtB,WAAAA;gBAAauB,KAAAA,EAAO;oBAAEC,MAAAA,EAAQ;AAAE;;AACzC1C,YAAAA,cAAAA,kBACCsB,cAAA,CAACC,iBAAAA,EAAAA;gBAAKC,cAAAA,EAAe,QAAA;gBAASC,OAAAA,EAAS,CAAA;AACrC,gBAAA,QAAA,gBAAAH,cAAA,CAACI,mBAAAA,EAAAA;8BACE/B,aAAAA,CAAc;AACbgC,wBAAAA,EAAAA,EAAIK,8BAAAA,CAAkB,0BAAA,CAAA;wBACtBJ,cAAAA,EAAgB;AAClB,qBAAA;;;;;AAMZ,CAAA;AAgBA,MAAMe,sBAAAA,GAAyB,CAAC,EAAEC,YAAY,EAA+B,GAAA;IAC3E,MAAM,EAAEC,KAAK,EAAE,GAAGC,mCAAAA,EAAAA;IAElBC,eAAAA,CAAU,IAAA;AACRF,QAAAA,KAAAA,EAAAA;IACF,CAAA,EAAG;AAACD,QAAAA,YAAAA;AAAcC,QAAAA;AAAM,KAAA,CAAA;IAExB,OAAO,IAAA;AACT,CAAA;AAEA;;;;;;;AASC,IACD,MAAMG,iBAAAA,GAAoBC,uBAAAA,CAAOC,sBAAAA,CAAYC,IAAI,CAAC;;WAEvC,EAAE,CAAC,EAAEC,KAAK,EAAE,GAAKA,KAAAA,CAAMC,MAAM,CAAC,CAAA,CAAE,CAAC;cAC9B,EAAE,CAAC,EAAED,KAAK,EAAE,GAAKA,KAAAA,CAAME,MAAM,CAACC,UAAU,CAAC;oBACnC,EAAE,CAAC,EAAEH,KAAK,EAAE,GAAKA,KAAAA,CAAME,MAAM,CAACE,UAAU,CAAC;AAC5C,iBAAA,EAAE,CAAC,EAAEJ,KAAK,EAAE,GAAKA,KAAAA,CAAMK,YAAY,CAAC;AACrD,CAAC;AAED,MAAMC,gBAAAA,GAAmBT,uBAAAA,CAAOC,sBAAAA,CAAYS,IAAI,CAAC;;;;;OAK1C,EAAE,CAAC,EAAEP,KAAK,EAAE,GAAKA,KAAAA,CAAMC,MAAM,CAAC,CAAA,CAAE,CAAC;kBACtB,EAAE,CAAC,EAAED,KAAK,EAAE,GAAKA,KAAAA,CAAMC,MAAM,CAAC,CAAA,CAAE,CAAC;;AAElC,iBAAA,EAAE,CAAC,EAAED,KAAK,EAAE,GAAKA,KAAAA,CAAMK,YAAY,CAAC;;SAE5C,EAAE,CAAC,EAAEL,KAAK,EAAE,GAAKA,KAAAA,CAAME,MAAM,CAACM,UAAU,CAAC;;aAErC,EAAE,CAAC,EAAER,KAAK,EAAE,GAAKA,KAAAA,CAAMS,SAAS,CAAC,CAAA,CAAE,CAAC;eAClC,EAAE,CAAC,EAAET,KAAK,EAAE,GAAKA,KAAAA,CAAMU,WAAW,CAACC,QAAQ,CAAC;;;;WAIhD,EAAE,CAAC,EAAEX,KAAK,EAAE,GAAKA,KAAAA,CAAME,MAAM,CAACU,UAAU,CAAC;;;;gBAIpC,EAAE,CAAC,EAAEZ,KAAK,EAAE,GAAKA,KAAAA,CAAME,MAAM,CAACW,QAAQ,CAAC;kBACrC,EAAE,CAAC,EAAEb,KAAK,EAAE,GAAKA,KAAAA,CAAME,MAAM,CAACE,UAAU,CAAC;WAChD,EAAE,CAAC,EAAEJ,KAAK,EAAE,GAAKA,KAAAA,CAAME,MAAM,CAACY,UAAU,CAAC;;;;;;;AAOpD,CAAC;AAED,MAAMC,aAAAA,GAAgBlB,uBAAAA,CAAOpB,gBAAAA,CAAI;;gBAEjB,EAAE,CAAC,EAAEuB,KAAK,EAAE,GAAKA,KAAAA,CAAME,MAAM,CAACW,QAAQ,CAAC;;;;;;AAMvD,CAAC;MAEYG,UAAAA,GAAa,IAAA;IACxB,MAAM,EAAEzE,aAAa,EAAE,GAAGC,iBAAAA,EAAAA;IAC1B,MAAM,EAAEyE,WAAW,EAAE,GAAGC,uCAAAA,EAAAA;AAExB,IAAA,MAAM,EAAEC,eAAe,EAAEC,kBAAkB,EAAEC,cAAc,EAAE,GAAGC,uCAAAA,EAAAA;;;AAGhE,IAAA,MAAM,EAAEvE,KAAAA,EAAOwE,kBAAkB,EAAE,GAAGC,yBAAAA,CACpC;QAAEjD,EAAAA,EAAI4C;KAAiB,EACvB;AAAEM,QAAAA,IAAAA,EAAMN,eAAAA,KAAoB;AAAK,KAAA,CAAA;IAGnCxB,eAAAA,CAAU,IAAA;QACR,IAAI4B,kBAAAA,EAAoBG,SAAS,eAAA,EAAiB;AAChDL,YAAAA,cAAAA,EAAAA;AACF,QAAA;IACF,CAAA,EAAG;AAACE,QAAAA,kBAAAA;AAAoBF,QAAAA;AAAe,KAAA,CAAA;AACvC,IAAA,MAAM,EAAEM,KAAK,EAAEC,SAAS,EAAE,GAAGC,2BAAAA,CAAcV,eAAAA,CAAAA;AAC3C,IAAA,MAAMW,iBAAiBvF,aAAAA,CACrB;AACEgC,QAAAA,EAAAA,EAAIK,8BAAAA,CAAkB,2BAAA,CAAA;QACtBJ,cAAAA,EAAgB;KAClB,EACA;QAAEuD,KAAAA,EAAOH;AAAU,KAAA,CAAA;IAErB,MAAMI,eAAAA,GAAkBL,KAAAA,GACpB,CAAA,EAAGA,KAAAA,CAAM,EAAE,EAAEG,cAAAA,CAAe,CAAC,CAAC,GAC9BvF,aAAAA,CAAc;QAAEgC,EAAAA,EAAI,aAAA;QAAeC,cAAAA,EAAgB;AAAa,KAAA,CAAA;AAEpE,IAAA,MAAM,CAACyD,wBAAAA,EAA0BC,2BAAAA,CAA4B,GAAGC,cAAAA,CAAS,KAAA,CAAA;;IAGzE,MAAM,CAACnG,MAAMoG,OAAAA,CAAQ,GAAGC,+BAAmBC,0BAAAA,CAAiBtG,IAAI,EAAEyB,qBAAAA,CAAYC,IAAI,CAAA;IAClF,MAAMF,UAAAA,GAAaxB,IAAAA,KAASyB,qBAAAA,CAAYC,IAAI;;AAG5C,IAAA,MAAM,CAAC6E,eAAAA,EAAiBC,kBAAAA,CAAmB,GAAGL,cAAAA,CAAS,KAAA,CAAA;;AAGvD,IAAA,MAAMM,eAAeC,YAAAA,CAAyB,IAAA,CAAA;AAC9C,IAAA,MAAMC,oBAAoBD,YAAAA,CAAuB,IAAA,CAAA;;IAGjD,MAAM,CAACE,YAAY,GAAGC,0BAAAA,EAAAA;IACtB,MAAM,CAACC,eAAe,GAAGC,6BAAAA,EAAAA;IAEzB,MAAMC,mBAAAA,GAAsB,OAAOC,KAAAA,EAA0BhH,QAAAA,GAAAA;QAC3D,IAAIgH,KAAAA,CAAMpE,MAAM,KAAK,CAAA,EAAG;AAExB,QAAA,MAAMqE,WAAW,IAAIC,QAAAA,EAAAA;AACrB,QAAA,MAAMC,gBAAkC,EAAE;QAE1CH,KAAAA,CAAMI,OAAO,CAAC,CAACC,IAAAA,GAAAA;YACbJ,QAAAA,CAASK,MAAM,CAAC,OAAA,EAASD,IAAAA,CAAAA;AACzBF,YAAAA,aAAAA,CAAcI,IAAI,CAAC;AACjB9B,gBAAAA,IAAAA,EAAM4B,KAAK5B,IAAI;gBACf+B,OAAAA,EAAS,IAAA;gBACTC,eAAAA,EAAiB,IAAA;gBACjBzG,MAAAA,EAAQhB;AACV,aAAA,CAAA;AACF,QAAA,CAAA,CAAA;AAEAiH,QAAAA,QAAAA,CAASK,MAAM,CAAC,UAAA,EAAYI,IAAAA,CAAKC,SAAS,CAACR,aAAAA,CAAAA,CAAAA;QAC3C,IAAI;AACF,YAAA,MAAMR,WAAAA,CAAY;AAAEM,gBAAAA,QAAAA;AAAUW,gBAAAA,UAAAA,EAAYZ,MAAMpE;AAAO,aAAA,CAAA,CAAGiF,MAAM,EAAA;AAClE,QAAA,CAAA,CAAE,OAAO/G,KAAAA,EAAO;;AAEhB,QAAA;AACF,IAAA,CAAA;AAEA,IAAA,MAAMgH,gBAAAA,GAAmB,IAAA;AACvBtB,QAAAA,YAAAA,CAAauB,OAAO,EAAEC,KAAAA,EAAAA;AACxB,IAAA,CAAA;AAEA,IAAA,MAAMC,mBAAmB,OAAOC,CAAAA,GAAAA;AAC9B,QAAA,MAAMlB,KAAAA,GAAQkB,CAAAA,CAAEC,MAAM,CAACnB,KAAK;AAC5B,QAAA,IAAIA,KAAAA,IAASA,KAAAA,CAAMpE,MAAM,GAAG,CAAA,EAAG;AAC7B,YAAA,MAAMmE,mBAAAA,CAAoBqB,KAAAA,CAAMC,IAAI,CAACrB,KAAAA,CAAAA,EAAQ9B,eAAAA,CAAAA;AAC/C,QAAA;QACAgD,CAAAA,CAAEC,MAAM,CAACG,KAAK,GAAG,EAAA;AACnB,IAAA,CAAA;AAEA,IAAA,MAAMC,aAAa,OAAOvB,KAAAA,GAAAA;AACxB,QAAA,MAAMD,oBAAoBC,KAAAA,EAAO9B,eAAAA,CAAAA;AACnC,IAAA,CAAA;AAEA,IAAA,MAAMsD,kBAAkB,OAAOC,IAAAA,GAAAA;QAC7B,IAAI;AACF,YAAA,MAAM5B,cAAAA,CAAe;AAAE4B,gBAAAA,IAAAA;gBAAMzI,QAAAA,EAAUkF;AAAgB,aAAA,CAAA,CAAG2C,MAAM,EAAA;AAClE,QAAA,CAAA,CAAE,OAAO/G,KAAAA,EAAO;;AAEhB,QAAA;AACF,IAAA,CAAA;AAEA,IAAA,MAAM4H,QAAAA,GAAWC,uBAAAA,EAAAA;;;AAIjB,IAAA,MAAMpF,iBAAeqF,4BAAAA,CAAgB;QACnC5I,QAAAA,EAAUkF,eAAAA;QACV2D,MAAAA,EAAQ,EAAA;;QAER5H,IAAAA,EAAM,CAAA,EAAGyH,SAASzI,UAAU,CAAC,SAAS,EAAEyI,QAAAA,CAASvI,eAAe,CAAA,CAAE;QAClE2I,MAAAA,EAAQ;AACV,KAAA,CAAA;IAEA,qBACEhG,eAAA,CAAAC,mBAAA,EAAA;;0BACEd,cAAA,CAAC8G,4CAAAA,EAAAA;gBAAuBC,MAAAA,EAAQT,UAAAA;AAC9B,gBAAA,QAAA,gBAAAtG,cAAA,CAACgH,wCAAAA,EAAAA;AACC,oBAAA,QAAA,gBAAAnG,eAAA,CAACoG,mCAAAA,EAAAA;;0CACCjH,cAAA,CAACqB,sBAAAA,EAAAA;gCAAuBC,YAAAA,EAAcA;;0CACtCtB,cAAA,CAACO,gBAAAA,EAAAA;gCAAIW,GAAAA,EAAKuD,iBAAAA;wDACR5D,eAAA,CAACqG,oBAAQrF,IAAI,EAAA;oCACXsF,SAAAA,EAAU,OAAA;oCACVC,UAAAA,EAAW,UAAA;AACXC,oCAAAA,OAAAA,gBACErH,cAAA,CAACsH,qBAAAA,EAAAA;wCACCrE,eAAAA,EAAiBA,eAAAA;wCACjBsE,cAAAA,EAAgBrE;;;sDAIpBlD,cAAA,CAACwH,2BAAAA,EAAAA;AACC,4CAAA,QAAA,gBAAAxH,cAAA,CAACyH,OAAAA,EAAAA;gDAAMC,IAAAA,EAAK,MAAA;gDAAOxG,GAAAA,EAAKqD,YAAAA;gDAAcoD,QAAAA,EAAU3B,gBAAAA;gDAAkB4B,QAAQ,EAAA;;;sDAG5E5H,cAAA,CAAC6C,aAAAA,EAAAA;oEACC7C,cAAA,CAACkH,oBAAQW,MAAM,EAAA;gDACbpE,KAAAA,EAAOK,eAAAA;AACPgE,gDAAAA,aAAAA,gBACEjH,eAAA,CAACkH,uBAAAA,EAAAA;oDACCC,gBAAAA,EAAiB,YAAA;oDACjBC,OAAAA,EAAQ,SAAA;AACRC,oDAAAA,OAAAA,gBAASlI,cAAA,CAACmI,iBAAAA,EAAAA,EAAAA,CAAAA;AACVC,oDAAAA,KAAAA,EAAO/J,aAAAA,CAAc;AACnBgC,wDAAAA,EAAAA,EAAIK,8BAAAA,CAAkB,KAAA,CAAA;wDACtBJ,cAAAA,EAAgB;AAClB,qDAAA,CAAA;;sEAEAN,cAAA,CAACqI,qBAAAA,EAAAA;AACCC,4DAAAA,QAAAA,EAAU,IAAMtE,2BAAAA,CAA4B,IAAA,CAAA;AAC5CuE,4DAAAA,SAAAA,gBAAWvI,cAAA,CAACwI,YAAAA,EAAAA,EAAAA,CAAAA;sEAEXnK,aAAAA,CAAc;AACbgC,gEAAAA,EAAAA,EAAIK,8BAAAA,CAAkB,qBAAA,CAAA;gEACtBJ,cAAAA,EAAgB;AAClB,6DAAA;;sEAEFN,cAAA,CAACqI,qBAAAA,EAAAA;4DAASC,QAAAA,EAAUzC,gBAAAA;AAAkB0C,4DAAAA,SAAAA,gBAAWvI,cAAA,CAACyI,WAAAA,EAAAA,EAAAA,CAAAA;sEAC/CpK,aAAAA,CAAc;AACbgC,gEAAAA,EAAAA,EAAIK,8BAAAA,CAAkB,cAAA,CAAA;gEACtBJ,cAAAA,EAAgB;AAClB,6DAAA;;sEAEFN,cAAA,CAACqI,qBAAAA,EAAAA;AAASC,4DAAAA,QAAAA,EAAU,IAAMhE,kBAAAA,CAAmB,IAAA,CAAA;AAAOiE,4DAAAA,SAAAA,gBAAWvI,cAAA,CAAC0I,UAAAA,EAAAA,EAAAA,CAAAA;sEAC7DrK,aAAAA,CAAc;AACbgC,gEAAAA,EAAAA,EAAIK,8BAAAA,CAAkB,iBAAA,CAAA;gEACtBJ,cAAAA,EAAgB;AAClB,6DAAA;;;;AAINqI,gDAAAA,QAAAA,gBACE9H,eAAA,CAACZ,iBAAAA,EAAAA;oDAAKC,cAAAA,EAAe,eAAA;oDAAgB0I,UAAAA,EAAW,QAAA;oDAASC,GAAAA,EAAK,CAAA;oDAAGC,KAAAA,EAAM,MAAA;;sEACrE9I,cAAA,CAACC,iBAAAA,EAAAA;4DAAK4I,GAAAA,EAAK,CAAA;4DAAGD,UAAAA,EAAW,QAAA;AAAS,4DAAA,QAAA,EAAA;;sEAIlC/H,eAAA,CAACZ,iBAAAA,EAAAA;4DAAK4I,GAAAA,EAAK,CAAA;4DAAGD,UAAAA,EAAW,SAAA;;8EACvB5I,cAAA,CAAC+I,iBAAAA,EAAAA;oEAAS/J,IAAAA,EAAMyH,QAAAA;AAAUuC,oEAAAA,gBAAAA,EAAkB,CAAC1J;;8EAC7CuB,eAAA,CAACa,iBAAAA,EAAAA;oEACCgG,IAAAA,EAAK,QAAA;AACLrB,oEAAAA,KAAAA,EAAO/G,aAAa,MAAA,GAAS,OAAA;oEAC7B2J,aAAAA,EAAe,CAAC5C,KAAAA,GACdA,KAAAA,IACAnC,OAAAA,CAAQmC,KAAAA,KAAU,SAAS9G,qBAAAA,CAAYC,IAAI,GAAGD,qBAAAA,CAAY2J,KAAK,CAAA;AAEjEC,oEAAAA,YAAAA,EAAY9K,aAAAA,CAAc;AACxBgC,wEAAAA,EAAAA,EAAIK,8BAAAA,CAAkB,mBAAA,CAAA;wEACtBJ,cAAAA,EAAgB;AAClB,qEAAA,CAAA;;sFAEAO,eAAA,CAACuB,gBAAAA,EAAAA;4EACCiE,KAAAA,EAAM,OAAA;AACN8C,4EAAAA,YAAAA,EAAY9K,aAAAA,CAAc;AACxBgC,gFAAAA,EAAAA,EAAIK,8BAAAA,CAAkB,YAAA,CAAA;gFACtBJ,cAAAA,EAAgB;AAClB,6EAAA,CAAA;;8FAEAN,cAAA,CAACoJ,UAAAA,EAAAA,EAAAA,CAAAA;gFACA/K,aAAAA,CAAc;AACbgC,oFAAAA,EAAAA,EAAIK,8BAAAA,CAAkB,YAAA,CAAA;oFACtBJ,cAAAA,EAAgB;AAClB,iFAAA;;;sFAEFO,eAAA,CAACuB,gBAAAA,EAAAA;4EACCiE,KAAAA,EAAM,MAAA;AACN8C,4EAAAA,YAAAA,EAAY9K,aAAAA,CAAc;AACxBgC,gFAAAA,EAAAA,EAAIK,8BAAAA,CAAkB,WAAA,CAAA;gFACtBJ,cAAAA,EAAgB;AAClB,6EAAA,CAAA;;8FAEAN,cAAA,CAACqJ,cAAAA,EAAAA,EAAAA,CAAAA;gFACAhL,aAAAA,CAAc;AACbgC,oFAAAA,EAAAA,EAAIK,8BAAAA,CAAkB,WAAA,CAAA;oFACtBJ,cAAAA,EAAgB;AAClB,iFAAA;;;;;;;;;;;AASd,sDAAAN,cAAA,CAACkH,oBAAQoC,OAAO,EAAA;AACd,4CAAA,QAAA,gBAAAzI,eAAA,CAAC0I,kCAAAA,EAAAA;;kEACCvJ,cAAA,CAACwJ,+BAAAA,EAAAA;wDAAiB/E,iBAAAA,EAAmBA,iBAAAA;wDAAmBgF,UAAAA,EAAYhG;;kEACpEzD,cAAA,CAACnC,UAAAA,EAAAA;wDACCC,IAAAA,EAAMA,IAAAA;wDACNC,QAAAA,EAAUkF,eAAAA;AACVjF,wDAAAA,UAAAA,EAAYyI,SAASzI,UAAU;AAC/BC,wDAAAA,WAAAA,EAAawI,SAASxI,WAAW;AACjCC,wDAAAA,eAAAA,EAAiBuI,SAASvI,eAAe;wDACzCC,gBAAAA,EAAkB4E,WAAAA;wDAClB3E,WAAAA,EAAayH;;;;;;;;0CAMvB7F,cAAA,CAAC0J,6BAAAA,EAAAA,EAAAA;;;;;0BAIP1J,cAAA,CAAC2J,qCAAAA,EAAAA;gBACCC,IAAAA,EAAM7F,wBAAAA;gBACN0F,UAAAA,EAAYhG,KAAAA;gBACZoG,cAAAA,EAAgB5G,eAAAA;AAChB6G,gBAAAA,OAAAA,EAAS,IAAM9F,2BAAAA,CAA4B,KAAA;;0BAE7ChE,cAAA,CAAC+J,uCAAAA,EAAAA;gBACCH,IAAAA,EAAMvF,eAAAA;AACNyF,gBAAAA,OAAAA,EAAS,IAAMxF,kBAAAA,CAAmB,KAAA,CAAA;gBAClC0F,QAAAA,EAAUzD;;0BAEZvG,cAAA,CAACiK,qCAAAA,EAAAA,EAAAA;;;AAGP;;;;"}