@strapi/upload 5.35.0 → 5.36.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 (130) hide show
  1. package/dist/admin/future/App.js +8 -20
  2. package/dist/admin/future/App.js.map +1 -1
  3. package/dist/admin/future/App.mjs +8 -20
  4. package/dist/admin/future/App.mjs.map +1 -1
  5. package/dist/admin/future/components/UploadProgressDialog.js +494 -0
  6. package/dist/admin/future/components/UploadProgressDialog.js.map +1 -0
  7. package/dist/admin/future/components/UploadProgressDialog.mjs +473 -0
  8. package/dist/admin/future/components/UploadProgressDialog.mjs.map +1 -0
  9. package/dist/admin/future/enums.js +12 -0
  10. package/dist/admin/future/enums.js.map +1 -0
  11. package/dist/admin/future/enums.mjs +10 -0
  12. package/dist/admin/future/enums.mjs.map +1 -0
  13. package/dist/admin/future/pages/Assets/AssetsPage.js +311 -0
  14. package/dist/admin/future/pages/Assets/AssetsPage.js.map +1 -0
  15. package/dist/admin/future/pages/Assets/AssetsPage.mjs +290 -0
  16. package/dist/admin/future/pages/Assets/AssetsPage.mjs.map +1 -0
  17. package/dist/admin/future/pages/Assets/components/AssetsGrid.js +164 -0
  18. package/dist/admin/future/pages/Assets/components/AssetsGrid.js.map +1 -0
  19. package/dist/admin/future/pages/Assets/components/AssetsGrid.mjs +162 -0
  20. package/dist/admin/future/pages/Assets/components/AssetsGrid.mjs.map +1 -0
  21. package/dist/admin/future/pages/Assets/components/AssetsTable.js +198 -0
  22. package/dist/admin/future/pages/Assets/components/AssetsTable.js.map +1 -0
  23. package/dist/admin/future/pages/Assets/components/AssetsTable.mjs +196 -0
  24. package/dist/admin/future/pages/Assets/components/AssetsTable.mjs.map +1 -0
  25. package/dist/admin/future/pages/Assets/components/DropZone/UploadDropZone.js +127 -0
  26. package/dist/admin/future/pages/Assets/components/DropZone/UploadDropZone.js.map +1 -0
  27. package/dist/admin/future/pages/Assets/components/DropZone/UploadDropZone.mjs +105 -0
  28. package/dist/admin/future/pages/Assets/components/DropZone/UploadDropZone.mjs.map +1 -0
  29. package/dist/admin/future/pages/Assets/components/DropZone/UploadDropZoneContext.js +107 -0
  30. package/dist/admin/future/pages/Assets/components/DropZone/UploadDropZoneContext.js.map +1 -0
  31. package/dist/admin/future/pages/Assets/components/DropZone/UploadDropZoneContext.mjs +104 -0
  32. package/dist/admin/future/pages/Assets/components/DropZone/UploadDropZoneContext.mjs.map +1 -0
  33. package/dist/admin/future/pages/Assets/constants.js +54 -0
  34. package/dist/admin/future/pages/Assets/constants.js.map +1 -0
  35. package/dist/admin/future/pages/Assets/constants.mjs +50 -0
  36. package/dist/admin/future/pages/Assets/constants.mjs.map +1 -0
  37. package/dist/admin/future/pages/Assets/hooks/useInfiniteAssets.js +77 -0
  38. package/dist/admin/future/pages/Assets/hooks/useInfiniteAssets.js.map +1 -0
  39. package/dist/admin/future/pages/Assets/hooks/useInfiniteAssets.mjs +74 -0
  40. package/dist/admin/future/pages/Assets/hooks/useInfiniteAssets.mjs.map +1 -0
  41. package/dist/admin/future/services/api.js +419 -9
  42. package/dist/admin/future/services/api.js.map +1 -1
  43. package/dist/admin/future/services/api.mjs +417 -9
  44. package/dist/admin/future/services/api.mjs.map +1 -1
  45. package/dist/admin/future/services/assets.js +37 -0
  46. package/dist/admin/future/services/assets.js.map +1 -0
  47. package/dist/admin/future/services/assets.mjs +35 -0
  48. package/dist/admin/future/services/assets.mjs.map +1 -0
  49. package/dist/admin/future/store/hooks.js +10 -0
  50. package/dist/admin/future/store/hooks.js.map +1 -0
  51. package/dist/admin/future/store/hooks.mjs +7 -0
  52. package/dist/admin/future/store/hooks.mjs.map +1 -0
  53. package/dist/admin/future/store/uploadProgress.js +156 -0
  54. package/dist/admin/future/store/uploadProgress.js.map +1 -0
  55. package/dist/admin/future/store/uploadProgress.mjs +143 -0
  56. package/dist/admin/future/store/uploadProgress.mjs.map +1 -0
  57. package/dist/admin/future/utils/files.js +23 -0
  58. package/dist/admin/future/utils/files.js.map +1 -0
  59. package/dist/admin/future/utils/files.mjs +19 -0
  60. package/dist/admin/future/utils/files.mjs.map +1 -0
  61. package/dist/admin/future/utils/getAssetIcon.js +28 -0
  62. package/dist/admin/future/utils/getAssetIcon.js.map +1 -0
  63. package/dist/admin/future/utils/getAssetIcon.mjs +26 -0
  64. package/dist/admin/future/utils/getAssetIcon.mjs.map +1 -0
  65. package/dist/admin/index.js +11 -0
  66. package/dist/admin/index.js.map +1 -1
  67. package/dist/admin/index.mjs +11 -0
  68. package/dist/admin/index.mjs.map +1 -1
  69. package/dist/admin/package.json.js +11 -9
  70. package/dist/admin/package.json.js.map +1 -1
  71. package/dist/admin/package.json.mjs +11 -9
  72. package/dist/admin/package.json.mjs.map +1 -1
  73. package/dist/admin/src/future/components/UploadProgressDialog.d.ts +1 -0
  74. package/dist/admin/src/future/enums.d.ts +6 -0
  75. package/dist/admin/src/future/pages/Assets/AssetsPage.d.ts +1 -0
  76. package/dist/admin/src/future/pages/Assets/components/AssetsGrid.d.ts +6 -0
  77. package/dist/admin/src/future/pages/Assets/components/AssetsTable.d.ts +6 -0
  78. package/dist/admin/src/future/pages/Assets/components/DropZone/UploadDropZone.d.ts +9 -0
  79. package/dist/admin/src/future/pages/Assets/components/DropZone/UploadDropZoneContext.d.ts +11 -0
  80. package/dist/admin/src/future/pages/Assets/constants.d.ts +17 -0
  81. package/dist/admin/src/future/pages/Assets/hooks/useInfiniteAssets.d.ts +17 -0
  82. package/dist/admin/src/future/services/api.d.ts +21 -3
  83. package/dist/admin/src/future/services/assets.d.ts +13 -0
  84. package/dist/admin/src/future/store/hooks.d.ts +6 -0
  85. package/dist/admin/src/future/store/uploadProgress.d.ts +46 -0
  86. package/dist/admin/src/future/utils/files.d.ts +3 -0
  87. package/dist/admin/src/future/utils/getAssetIcon.d.ts +12 -0
  88. package/dist/admin/translations/en.json.js +25 -0
  89. package/dist/admin/translations/en.json.js.map +1 -1
  90. package/dist/admin/translations/en.json.mjs +25 -0
  91. package/dist/admin/translations/en.json.mjs.map +1 -1
  92. package/dist/server/controllers/admin-upload.js +151 -2
  93. package/dist/server/controllers/admin-upload.js.map +1 -1
  94. package/dist/server/controllers/admin-upload.mjs +151 -2
  95. package/dist/server/controllers/admin-upload.mjs.map +1 -1
  96. package/dist/server/controllers/content-api.js +8 -2
  97. package/dist/server/controllers/content-api.js.map +1 -1
  98. package/dist/server/controllers/content-api.mjs +9 -3
  99. package/dist/server/controllers/content-api.mjs.map +1 -1
  100. package/dist/server/routes/admin.js +10 -0
  101. package/dist/server/routes/admin.js.map +1 -1
  102. package/dist/server/routes/admin.mjs +10 -0
  103. package/dist/server/routes/admin.mjs.map +1 -1
  104. package/dist/server/src/controllers/admin-upload.d.ts +12 -0
  105. package/dist/server/src/controllers/admin-upload.d.ts.map +1 -1
  106. package/dist/server/src/controllers/content-api.d.ts.map +1 -1
  107. package/dist/server/src/controllers/index.d.ts +1 -0
  108. package/dist/server/src/controllers/index.d.ts.map +1 -1
  109. package/dist/server/src/index.d.ts +1 -0
  110. package/dist/server/src/index.d.ts.map +1 -1
  111. package/dist/server/src/routes/admin.d.ts.map +1 -1
  112. package/dist/server/src/utils/mime-validation.d.ts +5 -0
  113. package/dist/server/src/utils/mime-validation.d.ts.map +1 -1
  114. package/dist/server/utils/mime-validation.js +7 -4
  115. package/dist/server/utils/mime-validation.js.map +1 -1
  116. package/dist/server/utils/mime-validation.mjs +7 -4
  117. package/dist/server/utils/mime-validation.mjs.map +1 -1
  118. package/dist/shared/contracts/files.d.ts +52 -0
  119. package/dist/shared/contracts/files.d.ts.map +1 -0
  120. package/package.json +11 -9
  121. package/dist/admin/future/pages/AIGenerationPage.js +0 -24
  122. package/dist/admin/future/pages/AIGenerationPage.js.map +0 -1
  123. package/dist/admin/future/pages/AIGenerationPage.mjs +0 -22
  124. package/dist/admin/future/pages/AIGenerationPage.mjs.map +0 -1
  125. package/dist/admin/future/pages/MediaLibraryPage.js +0 -119
  126. package/dist/admin/future/pages/MediaLibraryPage.js.map +0 -1
  127. package/dist/admin/future/pages/MediaLibraryPage.mjs +0 -98
  128. package/dist/admin/future/pages/MediaLibraryPage.mjs.map +0 -1
  129. package/dist/admin/src/future/pages/AIGenerationPage.d.ts +0 -1
  130. package/dist/admin/src/future/pages/MediaLibraryPage.d.ts +0 -1
@@ -0,0 +1,104 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import { useState, useRef, useEffect, useCallback, createContext, useContext } from 'react';
3
+ import { Box } from '@strapi/design-system';
4
+ import { styled } from 'styled-components';
5
+
6
+ /* -------------------------------------------------------------------------------------------------
7
+ * Context
8
+ * -----------------------------------------------------------------------------------------------*/ const UploadDropZoneContext = /*#__PURE__*/ createContext(null);
9
+ /* -------------------------------------------------------------------------------------------------
10
+ * Components
11
+ * -----------------------------------------------------------------------------------------------*/ const DropZoneWrapper = styled(Box)`
12
+ position: relative;
13
+ display: flex;
14
+ flex-direction: column;
15
+ min-height: 100%;
16
+ `;
17
+ const UploadDropZoneProvider = ({ children, onDrop })=>{
18
+ const [isDragging, setIsDragging] = useState(false);
19
+ const dragCounterRef = useRef(0);
20
+ const contextValue = {
21
+ isDragging
22
+ };
23
+ useEffect(()=>{
24
+ const handleDragEnd = ()=>{
25
+ setIsDragging(false);
26
+ dragCounterRef.current = 0;
27
+ };
28
+ // Handle drag leaving the entire document/window
29
+ const handleDocumentDragLeave = (e)=>{
30
+ // When relatedTarget is null, we're leaving the document entirely
31
+ if (!e.relatedTarget) {
32
+ setIsDragging(false);
33
+ dragCounterRef.current = 0;
34
+ }
35
+ };
36
+ document.addEventListener('dragend', handleDragEnd);
37
+ document.addEventListener('dragleave', handleDocumentDragLeave);
38
+ return ()=>{
39
+ document.removeEventListener('dragend', handleDragEnd);
40
+ document.removeEventListener('dragleave', handleDocumentDragLeave);
41
+ };
42
+ }, []);
43
+ const handleDragEnter = useCallback((e)=>{
44
+ e.preventDefault();
45
+ e.stopPropagation();
46
+ dragCounterRef.current += 1;
47
+ if (e.dataTransfer.types.includes('Files')) {
48
+ setIsDragging(true);
49
+ }
50
+ }, []);
51
+ const handleDragLeave = useCallback((e)=>{
52
+ e.preventDefault();
53
+ e.stopPropagation();
54
+ dragCounterRef.current -= 1;
55
+ // Only set dragging to false if we've left the dropzone completely
56
+ // (counter reaches 0 or negative)
57
+ if (dragCounterRef.current <= 0) {
58
+ setIsDragging(false);
59
+ dragCounterRef.current = 0;
60
+ }
61
+ }, []);
62
+ const handleDragOver = useCallback((e)=>{
63
+ e.preventDefault();
64
+ e.stopPropagation();
65
+ e.dataTransfer.dropEffect = 'copy';
66
+ }, []);
67
+ const handleDrop = useCallback((e)=>{
68
+ e.preventDefault();
69
+ e.stopPropagation();
70
+ setIsDragging(false);
71
+ dragCounterRef.current = 0;
72
+ const { files } = e.dataTransfer;
73
+ if (files?.length && onDrop) {
74
+ onDrop(Array.from(files));
75
+ }
76
+ }, [
77
+ onDrop
78
+ ]);
79
+ return /*#__PURE__*/ jsx(UploadDropZoneContext.Provider, {
80
+ value: contextValue,
81
+ children: /*#__PURE__*/ jsx(DropZoneWrapper, {
82
+ "data-testid": "assets-dropzone",
83
+ onDragEnter: handleDragEnter,
84
+ onDragLeave: handleDragLeave,
85
+ onDragOver: handleDragOver,
86
+ onDrop: handleDrop,
87
+ children: children
88
+ })
89
+ });
90
+ };
91
+ /* -------------------------------------------------------------------------------------------------
92
+ * Hook
93
+ * -----------------------------------------------------------------------------------------------*/ const useUploadDropZone = ()=>{
94
+ const context = useContext(UploadDropZoneContext);
95
+ if (!context) {
96
+ throw new Error('useUploadDropZone must be used within UploadDropZone');
97
+ }
98
+ return {
99
+ isDragging: context.isDragging
100
+ };
101
+ };
102
+
103
+ export { UploadDropZoneProvider, useUploadDropZone };
104
+ //# sourceMappingURL=UploadDropZoneContext.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UploadDropZoneContext.mjs","sources":["../../../../../../../admin/src/future/pages/Assets/components/DropZone/UploadDropZoneContext.tsx"],"sourcesContent":["import {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useRef,\n useState,\n type DragEvent,\n type ReactNode,\n} from 'react';\n\nimport { Box } from '@strapi/design-system';\nimport { styled } from 'styled-components';\n\n/* -------------------------------------------------------------------------------------------------\n * Types\n * -----------------------------------------------------------------------------------------------*/\n\ntype DropHandler = (files: File[]) => void | Promise<void>;\n\ninterface UploadDropZoneContextValue {\n isDragging: boolean;\n}\n\n/* -------------------------------------------------------------------------------------------------\n * Context\n * -----------------------------------------------------------------------------------------------*/\n\nconst UploadDropZoneContext = createContext<UploadDropZoneContextValue | null>(null);\n\n/* -------------------------------------------------------------------------------------------------\n * Components\n * -----------------------------------------------------------------------------------------------*/\n\nconst DropZoneWrapper = styled(Box)`\n position: relative;\n display: flex;\n flex-direction: column;\n min-height: 100%;\n`;\n\n/* -------------------------------------------------------------------------------------------------\n * Provider\n * -----------------------------------------------------------------------------------------------*/\n\ninterface UploadDropZoneProps {\n children: ReactNode;\n onDrop?: DropHandler;\n}\n\nexport const UploadDropZoneProvider = ({ children, onDrop }: UploadDropZoneProps) => {\n const [isDragging, setIsDragging] = useState(false);\n const dragCounterRef = useRef(0);\n\n const contextValue: UploadDropZoneContextValue = {\n isDragging,\n };\n\n useEffect(() => {\n const handleDragEnd = () => {\n setIsDragging(false);\n dragCounterRef.current = 0;\n };\n\n // Handle drag leaving the entire document/window\n const handleDocumentDragLeave = (e: globalThis.DragEvent) => {\n // When relatedTarget is null, we're leaving the document entirely\n if (!e.relatedTarget) {\n setIsDragging(false);\n dragCounterRef.current = 0;\n }\n };\n\n document.addEventListener('dragend', handleDragEnd);\n document.addEventListener('dragleave', handleDocumentDragLeave);\n\n return () => {\n document.removeEventListener('dragend', handleDragEnd);\n document.removeEventListener('dragleave', handleDocumentDragLeave);\n };\n }, []);\n\n const handleDragEnter = useCallback((e: DragEvent<HTMLElement>) => {\n e.preventDefault();\n e.stopPropagation();\n\n dragCounterRef.current += 1;\n\n if (e.dataTransfer.types.includes('Files')) {\n setIsDragging(true);\n }\n }, []);\n\n const handleDragLeave = useCallback((e: DragEvent<HTMLElement>) => {\n e.preventDefault();\n e.stopPropagation();\n\n dragCounterRef.current -= 1;\n\n // Only set dragging to false if we've left the dropzone completely\n // (counter reaches 0 or negative)\n if (dragCounterRef.current <= 0) {\n setIsDragging(false);\n dragCounterRef.current = 0;\n }\n }, []);\n\n const handleDragOver = useCallback((e: DragEvent<HTMLElement>) => {\n e.preventDefault();\n e.stopPropagation();\n e.dataTransfer.dropEffect = 'copy';\n }, []);\n\n const handleDrop = useCallback(\n (e: DragEvent<HTMLElement>) => {\n e.preventDefault();\n e.stopPropagation();\n setIsDragging(false);\n dragCounterRef.current = 0;\n\n const { files } = e.dataTransfer;\n if (files?.length && onDrop) {\n onDrop(Array.from(files));\n }\n },\n [onDrop]\n );\n\n return (\n <UploadDropZoneContext.Provider value={contextValue}>\n <DropZoneWrapper\n data-testid=\"assets-dropzone\"\n onDragEnter={handleDragEnter}\n onDragLeave={handleDragLeave}\n onDragOver={handleDragOver}\n onDrop={handleDrop}\n >\n {children}\n </DropZoneWrapper>\n </UploadDropZoneContext.Provider>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Hook\n * -----------------------------------------------------------------------------------------------*/\n\nexport const useUploadDropZone = () => {\n const context = useContext(UploadDropZoneContext);\n\n if (!context) {\n throw new Error('useUploadDropZone must be used within UploadDropZone');\n }\n\n return {\n isDragging: context.isDragging,\n };\n};\n"],"names":["UploadDropZoneContext","createContext","DropZoneWrapper","styled","Box","UploadDropZoneProvider","children","onDrop","isDragging","setIsDragging","useState","dragCounterRef","useRef","contextValue","useEffect","handleDragEnd","current","handleDocumentDragLeave","e","relatedTarget","document","addEventListener","removeEventListener","handleDragEnter","useCallback","preventDefault","stopPropagation","dataTransfer","types","includes","handleDragLeave","handleDragOver","dropEffect","handleDrop","files","length","Array","from","_jsx","Provider","value","data-testid","onDragEnter","onDragLeave","onDragOver","useUploadDropZone","context","useContext","Error"],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ 'use strict';
2
+
3
+ var translations = require('../../utils/translations.js');
4
+
5
+ const localStorageKeys = {
6
+ view: `STRAPI_UPLOAD_LIBRARY_VIEW`
7
+ };
8
+ const viewOptions = {
9
+ GRID: 0,
10
+ TABLE: 1
11
+ };
12
+ const TABLE_HEADERS = [
13
+ {
14
+ name: 'name',
15
+ label: {
16
+ id: translations.getTranslationKey('list.table.header.name'),
17
+ defaultMessage: 'name'
18
+ }
19
+ },
20
+ {
21
+ name: 'createdAt',
22
+ label: {
23
+ id: translations.getTranslationKey('list.table.header.creationDate'),
24
+ defaultMessage: 'creation date'
25
+ }
26
+ },
27
+ {
28
+ name: 'updatedAt',
29
+ label: {
30
+ id: translations.getTranslationKey('list.table.header.lastModified'),
31
+ defaultMessage: 'last modified'
32
+ }
33
+ },
34
+ {
35
+ name: 'size',
36
+ label: {
37
+ id: translations.getTranslationKey('list.table.header.size'),
38
+ defaultMessage: 'size'
39
+ }
40
+ },
41
+ {
42
+ name: 'actions',
43
+ label: {
44
+ id: translations.getTranslationKey('list.table.header.actions'),
45
+ defaultMessage: 'actions'
46
+ },
47
+ isVisuallyHidden: true
48
+ }
49
+ ];
50
+
51
+ exports.TABLE_HEADERS = TABLE_HEADERS;
52
+ exports.localStorageKeys = localStorageKeys;
53
+ exports.viewOptions = viewOptions;
54
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sources":["../../../../../admin/src/future/pages/Assets/constants.ts"],"sourcesContent":["import { getTranslationKey } from '../../utils/translations';\n\nexport const localStorageKeys = {\n view: `STRAPI_UPLOAD_LIBRARY_VIEW`,\n};\n\nexport const viewOptions = {\n GRID: 0,\n TABLE: 1,\n};\n\ninterface TableHeader {\n name: string;\n label: { id: string; defaultMessage: string };\n isVisuallyHidden?: boolean;\n}\n\nexport const TABLE_HEADERS: TableHeader[] = [\n {\n name: 'name',\n label: { id: getTranslationKey('list.table.header.name'), defaultMessage: 'name' },\n },\n {\n name: 'createdAt',\n label: {\n id: getTranslationKey('list.table.header.creationDate'),\n defaultMessage: 'creation date',\n },\n },\n {\n name: 'updatedAt',\n label: {\n id: getTranslationKey('list.table.header.lastModified'),\n defaultMessage: 'last modified',\n },\n },\n {\n name: 'size',\n label: { id: getTranslationKey('list.table.header.size'), defaultMessage: 'size' },\n },\n {\n name: 'actions',\n label: { id: getTranslationKey('list.table.header.actions'), defaultMessage: 'actions' },\n isVisuallyHidden: true,\n },\n];\n"],"names":["localStorageKeys","view","viewOptions","GRID","TABLE","TABLE_HEADERS","name","label","id","getTranslationKey","defaultMessage","isVisuallyHidden"],"mappings":";;;;MAEaA,gBAAmB,GAAA;IAC9BC,IAAM,EAAA,CAAC,0BAA0B;AACnC;MAEaC,WAAc,GAAA;IACzBC,IAAM,EAAA,CAAA;IACNC,KAAO,EAAA;AACT;MAQaC,aAA+B,GAAA;AAC1C,IAAA;QACEC,IAAM,EAAA,MAAA;QACNC,KAAO,EAAA;AAAEC,YAAAA,EAAAA,EAAIC,8BAAkB,CAAA,wBAAA,CAAA;YAA2BC,cAAgB,EAAA;AAAO;AACnF,KAAA;AACA,IAAA;QACEJ,IAAM,EAAA,WAAA;QACNC,KAAO,EAAA;AACLC,YAAAA,EAAAA,EAAIC,8BAAkB,CAAA,gCAAA,CAAA;YACtBC,cAAgB,EAAA;AAClB;AACF,KAAA;AACA,IAAA;QACEJ,IAAM,EAAA,WAAA;QACNC,KAAO,EAAA;AACLC,YAAAA,EAAAA,EAAIC,8BAAkB,CAAA,gCAAA,CAAA;YACtBC,cAAgB,EAAA;AAClB;AACF,KAAA;AACA,IAAA;QACEJ,IAAM,EAAA,MAAA;QACNC,KAAO,EAAA;AAAEC,YAAAA,EAAAA,EAAIC,8BAAkB,CAAA,wBAAA,CAAA;YAA2BC,cAAgB,EAAA;AAAO;AACnF,KAAA;AACA,IAAA;QACEJ,IAAM,EAAA,SAAA;QACNC,KAAO,EAAA;AAAEC,YAAAA,EAAAA,EAAIC,8BAAkB,CAAA,2BAAA,CAAA;YAA8BC,cAAgB,EAAA;AAAU,SAAA;QACvFC,gBAAkB,EAAA;AACpB;;;;;;;"}
@@ -0,0 +1,50 @@
1
+ import { getTranslationKey } from '../../utils/translations.mjs';
2
+
3
+ const localStorageKeys = {
4
+ view: `STRAPI_UPLOAD_LIBRARY_VIEW`
5
+ };
6
+ const viewOptions = {
7
+ GRID: 0,
8
+ TABLE: 1
9
+ };
10
+ const TABLE_HEADERS = [
11
+ {
12
+ name: 'name',
13
+ label: {
14
+ id: getTranslationKey('list.table.header.name'),
15
+ defaultMessage: 'name'
16
+ }
17
+ },
18
+ {
19
+ name: 'createdAt',
20
+ label: {
21
+ id: getTranslationKey('list.table.header.creationDate'),
22
+ defaultMessage: 'creation date'
23
+ }
24
+ },
25
+ {
26
+ name: 'updatedAt',
27
+ label: {
28
+ id: getTranslationKey('list.table.header.lastModified'),
29
+ defaultMessage: 'last modified'
30
+ }
31
+ },
32
+ {
33
+ name: 'size',
34
+ label: {
35
+ id: getTranslationKey('list.table.header.size'),
36
+ defaultMessage: 'size'
37
+ }
38
+ },
39
+ {
40
+ name: 'actions',
41
+ label: {
42
+ id: getTranslationKey('list.table.header.actions'),
43
+ defaultMessage: 'actions'
44
+ },
45
+ isVisuallyHidden: true
46
+ }
47
+ ];
48
+
49
+ export { TABLE_HEADERS, localStorageKeys, viewOptions };
50
+ //# sourceMappingURL=constants.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.mjs","sources":["../../../../../admin/src/future/pages/Assets/constants.ts"],"sourcesContent":["import { getTranslationKey } from '../../utils/translations';\n\nexport const localStorageKeys = {\n view: `STRAPI_UPLOAD_LIBRARY_VIEW`,\n};\n\nexport const viewOptions = {\n GRID: 0,\n TABLE: 1,\n};\n\ninterface TableHeader {\n name: string;\n label: { id: string; defaultMessage: string };\n isVisuallyHidden?: boolean;\n}\n\nexport const TABLE_HEADERS: TableHeader[] = [\n {\n name: 'name',\n label: { id: getTranslationKey('list.table.header.name'), defaultMessage: 'name' },\n },\n {\n name: 'createdAt',\n label: {\n id: getTranslationKey('list.table.header.creationDate'),\n defaultMessage: 'creation date',\n },\n },\n {\n name: 'updatedAt',\n label: {\n id: getTranslationKey('list.table.header.lastModified'),\n defaultMessage: 'last modified',\n },\n },\n {\n name: 'size',\n label: { id: getTranslationKey('list.table.header.size'), defaultMessage: 'size' },\n },\n {\n name: 'actions',\n label: { id: getTranslationKey('list.table.header.actions'), defaultMessage: 'actions' },\n isVisuallyHidden: true,\n },\n];\n"],"names":["localStorageKeys","view","viewOptions","GRID","TABLE","TABLE_HEADERS","name","label","id","getTranslationKey","defaultMessage","isVisuallyHidden"],"mappings":";;MAEaA,gBAAmB,GAAA;IAC9BC,IAAM,EAAA,CAAC,0BAA0B;AACnC;MAEaC,WAAc,GAAA;IACzBC,IAAM,EAAA,CAAA;IACNC,KAAO,EAAA;AACT;MAQaC,aAA+B,GAAA;AAC1C,IAAA;QACEC,IAAM,EAAA,MAAA;QACNC,KAAO,EAAA;AAAEC,YAAAA,EAAAA,EAAIC,iBAAkB,CAAA,wBAAA,CAAA;YAA2BC,cAAgB,EAAA;AAAO;AACnF,KAAA;AACA,IAAA;QACEJ,IAAM,EAAA,WAAA;QACNC,KAAO,EAAA;AACLC,YAAAA,EAAAA,EAAIC,iBAAkB,CAAA,gCAAA,CAAA;YACtBC,cAAgB,EAAA;AAClB;AACF,KAAA;AACA,IAAA;QACEJ,IAAM,EAAA,WAAA;QACNC,KAAO,EAAA;AACLC,YAAAA,EAAAA,EAAIC,iBAAkB,CAAA,gCAAA,CAAA;YACtBC,cAAgB,EAAA;AAClB;AACF,KAAA;AACA,IAAA;QACEJ,IAAM,EAAA,MAAA;QACNC,KAAO,EAAA;AAAEC,YAAAA,EAAAA,EAAIC,iBAAkB,CAAA,wBAAA,CAAA;YAA2BC,cAAgB,EAAA;AAAO;AACnF,KAAA;AACA,IAAA;QACEJ,IAAM,EAAA,SAAA;QACNC,KAAO,EAAA;AAAEC,YAAAA,EAAAA,EAAIC,iBAAkB,CAAA,2BAAA,CAAA;YAA8BC,cAAgB,EAAA;AAAU,SAAA;QACvFC,gBAAkB,EAAA;AACpB;;;;;"}
@@ -0,0 +1,77 @@
1
+ 'use strict';
2
+
3
+ var React = require('react');
4
+ var assets = require('../../../services/assets.js');
5
+
6
+ const PAGE_SIZE = 20;
7
+ const useInfiniteAssets = ({ folder = null, sort } = {})=>{
8
+ const [page, setPage] = React.useState(1);
9
+ const lastResultsRef = React.useRef([]);
10
+ const isMountRef = React.useRef(true);
11
+ const { currentData: data, isLoading, isFetching, error } = assets.useGetAssetsQuery({
12
+ folder,
13
+ page,
14
+ pageSize: PAGE_SIZE,
15
+ sort
16
+ });
17
+ const pagination = data?.pagination;
18
+ // Accumulate pages. When cache is invalidated the current page is refetched
19
+ // detect this and reset to avoid a gap in the results.
20
+ const assets$1 = React.useMemo(()=>{
21
+ if (!data) {
22
+ return lastResultsRef.current;
23
+ }
24
+ const currentPageResults = data.results;
25
+ if (page === 1) {
26
+ lastResultsRef.current = currentPageResults;
27
+ } else {
28
+ // If accumulated length doesn't match expectation, cache was cleared
29
+ const expectedPrior = (page - 1) * PAGE_SIZE;
30
+ if (lastResultsRef.current.length < expectedPrior - PAGE_SIZE) {
31
+ return lastResultsRef.current;
32
+ }
33
+ // Only append if these aren't already accumulated
34
+ if (lastResultsRef.current.length < page * PAGE_SIZE) {
35
+ lastResultsRef.current = [
36
+ ...lastResultsRef.current,
37
+ ...currentPageResults
38
+ ];
39
+ }
40
+ }
41
+ return lastResultsRef.current;
42
+ }, [
43
+ data,
44
+ page
45
+ ]);
46
+ // Reset on filter/sort change — skip the initial mount since the memo
47
+ // already handles page 1 correctly
48
+ React.useEffect(()=>{
49
+ if (isMountRef.current) {
50
+ isMountRef.current = false;
51
+ return;
52
+ }
53
+ setPage(1);
54
+ lastResultsRef.current = [];
55
+ }, [
56
+ folder,
57
+ sort
58
+ ]);
59
+ const hasNextPage = pagination ? page < pagination.pageCount : false;
60
+ const isFetchingMore = isFetching && page > 1;
61
+ const fetchNextPage = React.useCallback(()=>{
62
+ setPage((prev)=>prev + 1);
63
+ }, []);
64
+ return {
65
+ assets: assets$1,
66
+ pagination,
67
+ isLoading,
68
+ isFetchingMore,
69
+ hasNextPage,
70
+ fetchNextPage,
71
+ error
72
+ };
73
+ };
74
+
75
+ exports.PAGE_SIZE = PAGE_SIZE;
76
+ exports.useInfiniteAssets = useInfiniteAssets;
77
+ //# sourceMappingURL=useInfiniteAssets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useInfiniteAssets.js","sources":["../../../../../../admin/src/future/pages/Assets/hooks/useInfiniteAssets.ts"],"sourcesContent":["import { useState, useCallback, useMemo, useEffect, useRef } from 'react';\n\nimport { useGetAssetsQuery } from '../../../services/assets';\n\nimport type { File } from '../../../../../../shared/contracts/files';\n\nconst PAGE_SIZE = 20;\n\ninterface UseInfiniteAssetsOptions {\n folder?: number | null;\n sort?: string;\n}\n\nconst useInfiniteAssets = ({ folder = null, sort }: UseInfiniteAssetsOptions = {}) => {\n const [page, setPage] = useState(1);\n const lastResultsRef = useRef<File[]>([]);\n const isMountRef = useRef(true);\n\n const {\n currentData: data,\n isLoading,\n isFetching,\n error,\n } = useGetAssetsQuery({\n folder,\n page,\n pageSize: PAGE_SIZE,\n sort,\n });\n\n const pagination = data?.pagination;\n\n // Accumulate pages. When cache is invalidated the current page is refetched\n // detect this and reset to avoid a gap in the results.\n const assets = useMemo(() => {\n if (!data) {\n return lastResultsRef.current;\n }\n\n const currentPageResults = data.results;\n\n if (page === 1) {\n lastResultsRef.current = currentPageResults;\n } else {\n // If accumulated length doesn't match expectation, cache was cleared\n const expectedPrior = (page - 1) * PAGE_SIZE;\n if (lastResultsRef.current.length < expectedPrior - PAGE_SIZE) {\n return lastResultsRef.current;\n }\n\n // Only append if these aren't already accumulated\n if (lastResultsRef.current.length < page * PAGE_SIZE) {\n lastResultsRef.current = [...lastResultsRef.current, ...currentPageResults];\n }\n }\n\n return lastResultsRef.current;\n }, [data, page]);\n\n // Reset on filter/sort change — skip the initial mount since the memo\n // already handles page 1 correctly\n useEffect(() => {\n if (isMountRef.current) {\n isMountRef.current = false;\n\n return;\n }\n setPage(1);\n lastResultsRef.current = [];\n }, [folder, sort]);\n\n const hasNextPage = pagination ? page < pagination.pageCount : false;\n const isFetchingMore = isFetching && page > 1;\n\n const fetchNextPage = useCallback(() => {\n setPage((prev) => prev + 1);\n }, []);\n\n return { assets, pagination, isLoading, isFetchingMore, hasNextPage, fetchNextPage, error };\n};\n\nexport { useInfiniteAssets };\nexport { PAGE_SIZE };\n"],"names":["PAGE_SIZE","useInfiniteAssets","folder","sort","page","setPage","useState","lastResultsRef","useRef","isMountRef","currentData","data","isLoading","isFetching","error","useGetAssetsQuery","pageSize","pagination","assets","useMemo","current","currentPageResults","results","expectedPrior","length","useEffect","hasNextPage","pageCount","isFetchingMore","fetchNextPage","useCallback","prev"],"mappings":";;;;;AAMA,MAAMA,SAAY,GAAA;AAOZC,MAAAA,iBAAAA,GAAoB,CAAC,EAAEC,MAAS,GAAA,IAAI,EAAEC,IAAI,EAA4B,GAAG,EAAE,GAAA;AAC/E,IAAA,MAAM,CAACC,IAAAA,EAAMC,OAAQ,CAAA,GAAGC,cAAS,CAAA,CAAA,CAAA;IACjC,MAAMC,cAAAA,GAAiBC,aAAe,EAAE,CAAA;AACxC,IAAA,MAAMC,aAAaD,YAAO,CAAA,IAAA,CAAA;IAE1B,MAAM,EACJE,WAAaC,EAAAA,IAAI,EACjBC,SAAS,EACTC,UAAU,EACVC,KAAK,EACN,GAAGC,wBAAkB,CAAA;AACpBb,QAAAA,MAAAA;AACAE,QAAAA,IAAAA;QACAY,QAAUhB,EAAAA,SAAAA;AACVG,QAAAA;AACF,KAAA,CAAA;AAEA,IAAA,MAAMc,aAAaN,IAAMM,EAAAA,UAAAA;;;AAIzB,IAAA,MAAMC,WAASC,aAAQ,CAAA,IAAA;AACrB,QAAA,IAAI,CAACR,IAAM,EAAA;AACT,YAAA,OAAOJ,eAAea,OAAO;AAC/B;QAEA,MAAMC,kBAAAA,GAAqBV,KAAKW,OAAO;AAEvC,QAAA,IAAIlB,SAAS,CAAG,EAAA;AACdG,YAAAA,cAAAA,CAAea,OAAO,GAAGC,kBAAAA;SACpB,MAAA;;AAEL,YAAA,MAAME,aAAgB,GAACnB,CAAAA,IAAAA,GAAO,CAAA,IAAKJ,SAAAA;AACnC,YAAA,IAAIO,eAAea,OAAO,CAACI,MAAM,GAAGD,gBAAgBvB,SAAW,EAAA;AAC7D,gBAAA,OAAOO,eAAea,OAAO;AAC/B;;AAGA,YAAA,IAAIb,eAAea,OAAO,CAACI,MAAM,GAAGpB,OAAOJ,SAAW,EAAA;AACpDO,gBAAAA,cAAAA,CAAea,OAAO,GAAG;AAAIb,oBAAAA,GAAAA,cAAAA,CAAea,OAAO;AAAKC,oBAAAA,GAAAA;AAAmB,iBAAA;AAC7E;AACF;AAEA,QAAA,OAAOd,eAAea,OAAO;KAC5B,EAAA;AAACT,QAAAA,IAAAA;AAAMP,QAAAA;AAAK,KAAA,CAAA;;;IAIfqB,eAAU,CAAA,IAAA;QACR,IAAIhB,UAAAA,CAAWW,OAAO,EAAE;AACtBX,YAAAA,UAAAA,CAAWW,OAAO,GAAG,KAAA;AAErB,YAAA;AACF;QACAf,OAAQ,CAAA,CAAA,CAAA;QACRE,cAAea,CAAAA,OAAO,GAAG,EAAE;KAC1B,EAAA;AAAClB,QAAAA,MAAAA;AAAQC,QAAAA;AAAK,KAAA,CAAA;AAEjB,IAAA,MAAMuB,WAAcT,GAAAA,UAAAA,GAAab,IAAOa,GAAAA,UAAAA,CAAWU,SAAS,GAAG,KAAA;IAC/D,MAAMC,cAAAA,GAAiBf,cAAcT,IAAO,GAAA,CAAA;AAE5C,IAAA,MAAMyB,gBAAgBC,iBAAY,CAAA,IAAA;QAChCzB,OAAQ,CAAA,CAAC0B,OAASA,IAAO,GAAA,CAAA,CAAA;AAC3B,KAAA,EAAG,EAAE,CAAA;IAEL,OAAO;AAAEb,gBAAAA,QAAAA;AAAQD,QAAAA,UAAAA;AAAYL,QAAAA,SAAAA;AAAWgB,QAAAA,cAAAA;AAAgBF,QAAAA,WAAAA;AAAaG,QAAAA,aAAAA;AAAef,QAAAA;AAAM,KAAA;AAC5F;;;;;"}
@@ -0,0 +1,74 @@
1
+ import { useState, useRef, useMemo, useEffect, useCallback } from 'react';
2
+ import { useGetAssetsQuery } from '../../../services/assets.mjs';
3
+
4
+ const PAGE_SIZE = 20;
5
+ const useInfiniteAssets = ({ folder = null, sort } = {})=>{
6
+ const [page, setPage] = useState(1);
7
+ const lastResultsRef = useRef([]);
8
+ const isMountRef = useRef(true);
9
+ const { currentData: data, isLoading, isFetching, error } = useGetAssetsQuery({
10
+ folder,
11
+ page,
12
+ pageSize: PAGE_SIZE,
13
+ sort
14
+ });
15
+ const pagination = data?.pagination;
16
+ // Accumulate pages. When cache is invalidated the current page is refetched
17
+ // detect this and reset to avoid a gap in the results.
18
+ const assets = useMemo(()=>{
19
+ if (!data) {
20
+ return lastResultsRef.current;
21
+ }
22
+ const currentPageResults = data.results;
23
+ if (page === 1) {
24
+ lastResultsRef.current = currentPageResults;
25
+ } else {
26
+ // If accumulated length doesn't match expectation, cache was cleared
27
+ const expectedPrior = (page - 1) * PAGE_SIZE;
28
+ if (lastResultsRef.current.length < expectedPrior - PAGE_SIZE) {
29
+ return lastResultsRef.current;
30
+ }
31
+ // Only append if these aren't already accumulated
32
+ if (lastResultsRef.current.length < page * PAGE_SIZE) {
33
+ lastResultsRef.current = [
34
+ ...lastResultsRef.current,
35
+ ...currentPageResults
36
+ ];
37
+ }
38
+ }
39
+ return lastResultsRef.current;
40
+ }, [
41
+ data,
42
+ page
43
+ ]);
44
+ // Reset on filter/sort change — skip the initial mount since the memo
45
+ // already handles page 1 correctly
46
+ useEffect(()=>{
47
+ if (isMountRef.current) {
48
+ isMountRef.current = false;
49
+ return;
50
+ }
51
+ setPage(1);
52
+ lastResultsRef.current = [];
53
+ }, [
54
+ folder,
55
+ sort
56
+ ]);
57
+ const hasNextPage = pagination ? page < pagination.pageCount : false;
58
+ const isFetchingMore = isFetching && page > 1;
59
+ const fetchNextPage = useCallback(()=>{
60
+ setPage((prev)=>prev + 1);
61
+ }, []);
62
+ return {
63
+ assets,
64
+ pagination,
65
+ isLoading,
66
+ isFetchingMore,
67
+ hasNextPage,
68
+ fetchNextPage,
69
+ error
70
+ };
71
+ };
72
+
73
+ export { PAGE_SIZE, useInfiniteAssets };
74
+ //# sourceMappingURL=useInfiniteAssets.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useInfiniteAssets.mjs","sources":["../../../../../../admin/src/future/pages/Assets/hooks/useInfiniteAssets.ts"],"sourcesContent":["import { useState, useCallback, useMemo, useEffect, useRef } from 'react';\n\nimport { useGetAssetsQuery } from '../../../services/assets';\n\nimport type { File } from '../../../../../../shared/contracts/files';\n\nconst PAGE_SIZE = 20;\n\ninterface UseInfiniteAssetsOptions {\n folder?: number | null;\n sort?: string;\n}\n\nconst useInfiniteAssets = ({ folder = null, sort }: UseInfiniteAssetsOptions = {}) => {\n const [page, setPage] = useState(1);\n const lastResultsRef = useRef<File[]>([]);\n const isMountRef = useRef(true);\n\n const {\n currentData: data,\n isLoading,\n isFetching,\n error,\n } = useGetAssetsQuery({\n folder,\n page,\n pageSize: PAGE_SIZE,\n sort,\n });\n\n const pagination = data?.pagination;\n\n // Accumulate pages. When cache is invalidated the current page is refetched\n // detect this and reset to avoid a gap in the results.\n const assets = useMemo(() => {\n if (!data) {\n return lastResultsRef.current;\n }\n\n const currentPageResults = data.results;\n\n if (page === 1) {\n lastResultsRef.current = currentPageResults;\n } else {\n // If accumulated length doesn't match expectation, cache was cleared\n const expectedPrior = (page - 1) * PAGE_SIZE;\n if (lastResultsRef.current.length < expectedPrior - PAGE_SIZE) {\n return lastResultsRef.current;\n }\n\n // Only append if these aren't already accumulated\n if (lastResultsRef.current.length < page * PAGE_SIZE) {\n lastResultsRef.current = [...lastResultsRef.current, ...currentPageResults];\n }\n }\n\n return lastResultsRef.current;\n }, [data, page]);\n\n // Reset on filter/sort change — skip the initial mount since the memo\n // already handles page 1 correctly\n useEffect(() => {\n if (isMountRef.current) {\n isMountRef.current = false;\n\n return;\n }\n setPage(1);\n lastResultsRef.current = [];\n }, [folder, sort]);\n\n const hasNextPage = pagination ? page < pagination.pageCount : false;\n const isFetchingMore = isFetching && page > 1;\n\n const fetchNextPage = useCallback(() => {\n setPage((prev) => prev + 1);\n }, []);\n\n return { assets, pagination, isLoading, isFetchingMore, hasNextPage, fetchNextPage, error };\n};\n\nexport { useInfiniteAssets };\nexport { PAGE_SIZE };\n"],"names":["PAGE_SIZE","useInfiniteAssets","folder","sort","page","setPage","useState","lastResultsRef","useRef","isMountRef","currentData","data","isLoading","isFetching","error","useGetAssetsQuery","pageSize","pagination","assets","useMemo","current","currentPageResults","results","expectedPrior","length","useEffect","hasNextPage","pageCount","isFetchingMore","fetchNextPage","useCallback","prev"],"mappings":";;;AAMA,MAAMA,SAAY,GAAA;AAOZC,MAAAA,iBAAAA,GAAoB,CAAC,EAAEC,MAAS,GAAA,IAAI,EAAEC,IAAI,EAA4B,GAAG,EAAE,GAAA;AAC/E,IAAA,MAAM,CAACC,IAAAA,EAAMC,OAAQ,CAAA,GAAGC,QAAS,CAAA,CAAA,CAAA;IACjC,MAAMC,cAAAA,GAAiBC,OAAe,EAAE,CAAA;AACxC,IAAA,MAAMC,aAAaD,MAAO,CAAA,IAAA,CAAA;IAE1B,MAAM,EACJE,WAAaC,EAAAA,IAAI,EACjBC,SAAS,EACTC,UAAU,EACVC,KAAK,EACN,GAAGC,iBAAkB,CAAA;AACpBb,QAAAA,MAAAA;AACAE,QAAAA,IAAAA;QACAY,QAAUhB,EAAAA,SAAAA;AACVG,QAAAA;AACF,KAAA,CAAA;AAEA,IAAA,MAAMc,aAAaN,IAAMM,EAAAA,UAAAA;;;AAIzB,IAAA,MAAMC,SAASC,OAAQ,CAAA,IAAA;AACrB,QAAA,IAAI,CAACR,IAAM,EAAA;AACT,YAAA,OAAOJ,eAAea,OAAO;AAC/B;QAEA,MAAMC,kBAAAA,GAAqBV,KAAKW,OAAO;AAEvC,QAAA,IAAIlB,SAAS,CAAG,EAAA;AACdG,YAAAA,cAAAA,CAAea,OAAO,GAAGC,kBAAAA;SACpB,MAAA;;AAEL,YAAA,MAAME,aAAgB,GAACnB,CAAAA,IAAAA,GAAO,CAAA,IAAKJ,SAAAA;AACnC,YAAA,IAAIO,eAAea,OAAO,CAACI,MAAM,GAAGD,gBAAgBvB,SAAW,EAAA;AAC7D,gBAAA,OAAOO,eAAea,OAAO;AAC/B;;AAGA,YAAA,IAAIb,eAAea,OAAO,CAACI,MAAM,GAAGpB,OAAOJ,SAAW,EAAA;AACpDO,gBAAAA,cAAAA,CAAea,OAAO,GAAG;AAAIb,oBAAAA,GAAAA,cAAAA,CAAea,OAAO;AAAKC,oBAAAA,GAAAA;AAAmB,iBAAA;AAC7E;AACF;AAEA,QAAA,OAAOd,eAAea,OAAO;KAC5B,EAAA;AAACT,QAAAA,IAAAA;AAAMP,QAAAA;AAAK,KAAA,CAAA;;;IAIfqB,SAAU,CAAA,IAAA;QACR,IAAIhB,UAAAA,CAAWW,OAAO,EAAE;AACtBX,YAAAA,UAAAA,CAAWW,OAAO,GAAG,KAAA;AAErB,YAAA;AACF;QACAf,OAAQ,CAAA,CAAA,CAAA;QACRE,cAAea,CAAAA,OAAO,GAAG,EAAE;KAC1B,EAAA;AAAClB,QAAAA,MAAAA;AAAQC,QAAAA;AAAK,KAAA,CAAA;AAEjB,IAAA,MAAMuB,WAAcT,GAAAA,UAAAA,GAAab,IAAOa,GAAAA,UAAAA,CAAWU,SAAS,GAAG,KAAA;IAC/D,MAAMC,cAAAA,GAAiBf,cAAcT,IAAO,GAAA,CAAA;AAE5C,IAAA,MAAMyB,gBAAgBC,WAAY,CAAA,IAAA;QAChCzB,OAAQ,CAAA,CAAC0B,OAASA,IAAO,GAAA,CAAA,CAAA;AAC3B,KAAA,EAAG,EAAE,CAAA;IAEL,OAAO;AAAEb,QAAAA,MAAAA;AAAQD,QAAAA,UAAAA;AAAYL,QAAAA,SAAAA;AAAWgB,QAAAA,cAAAA;AAAgBF,QAAAA,WAAAA;AAAaG,QAAAA,aAAAA;AAAef,QAAAA;AAAM,KAAA;AAC5F;;;;"}