@strapi/upload 5.36.0 → 5.37.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/admin/future/App.js +5 -12
- package/dist/admin/future/App.js.map +1 -1
- package/dist/admin/future/App.mjs +5 -12
- package/dist/admin/future/App.mjs.map +1 -1
- package/dist/admin/future/components/UploadProgressDialog.js +494 -0
- package/dist/admin/future/components/UploadProgressDialog.js.map +1 -0
- package/dist/admin/future/components/UploadProgressDialog.mjs +473 -0
- package/dist/admin/future/components/UploadProgressDialog.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/AssetsPage.js +183 -181
- package/dist/admin/future/pages/Assets/AssetsPage.js.map +1 -1
- package/dist/admin/future/pages/Assets/AssetsPage.mjs +190 -188
- package/dist/admin/future/pages/Assets/AssetsPage.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/AssetsGrid.js +95 -13
- package/dist/admin/future/pages/Assets/components/AssetsGrid.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/AssetsGrid.mjs +97 -15
- package/dist/admin/future/pages/Assets/components/AssetsGrid.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/AssetsTable.js +99 -6
- package/dist/admin/future/pages/Assets/components/AssetsTable.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/AssetsTable.mjs +100 -7
- package/dist/admin/future/pages/Assets/components/AssetsTable.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/DropZone/UploadDropZone.js +127 -0
- package/dist/admin/future/pages/Assets/components/DropZone/UploadDropZone.js.map +1 -0
- package/dist/admin/future/pages/Assets/components/DropZone/UploadDropZone.mjs +105 -0
- package/dist/admin/future/pages/Assets/components/DropZone/UploadDropZone.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/hooks/useFolderInfo.js +50 -0
- package/dist/admin/future/pages/Assets/hooks/useFolderInfo.js.map +1 -0
- package/dist/admin/future/pages/Assets/hooks/useFolderInfo.mjs +48 -0
- package/dist/admin/future/pages/Assets/hooks/useFolderInfo.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/hooks/useFolderNavigation.js +20 -0
- package/dist/admin/future/pages/Assets/hooks/useFolderNavigation.js.map +1 -0
- package/dist/admin/future/pages/Assets/hooks/useFolderNavigation.mjs +18 -0
- package/dist/admin/future/pages/Assets/hooks/useFolderNavigation.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/hooks/useInfiniteAssets.js +77 -0
- package/dist/admin/future/pages/Assets/hooks/useInfiniteAssets.js.map +1 -0
- package/dist/admin/future/pages/Assets/hooks/useInfiniteAssets.mjs +74 -0
- package/dist/admin/future/pages/Assets/hooks/useInfiniteAssets.mjs.map +1 -0
- package/dist/admin/future/services/api.js +419 -9
- package/dist/admin/future/services/api.js.map +1 -1
- package/dist/admin/future/services/api.mjs +417 -9
- package/dist/admin/future/services/api.mjs.map +1 -1
- package/dist/admin/future/services/assets.js +32 -3
- package/dist/admin/future/services/assets.js.map +1 -1
- package/dist/admin/future/services/assets.mjs +32 -3
- package/dist/admin/future/services/assets.mjs.map +1 -1
- package/dist/admin/future/services/folders.js +101 -0
- package/dist/admin/future/services/folders.js.map +1 -0
- package/dist/admin/future/services/folders.mjs +98 -0
- package/dist/admin/future/services/folders.mjs.map +1 -0
- package/dist/admin/future/store/hooks.js +10 -0
- package/dist/admin/future/store/hooks.js.map +1 -0
- package/dist/admin/future/store/hooks.mjs +7 -0
- package/dist/admin/future/store/hooks.mjs.map +1 -0
- package/dist/admin/future/store/uploadProgress.js +156 -0
- package/dist/admin/future/store/uploadProgress.js.map +1 -0
- package/dist/admin/future/store/uploadProgress.mjs +143 -0
- package/dist/admin/future/store/uploadProgress.mjs.map +1 -0
- package/dist/admin/index.js +11 -0
- package/dist/admin/index.js.map +1 -1
- package/dist/admin/index.mjs +11 -0
- package/dist/admin/index.mjs.map +1 -1
- package/dist/admin/package.json.js +11 -10
- package/dist/admin/package.json.js.map +1 -1
- package/dist/admin/package.json.mjs +11 -10
- package/dist/admin/package.json.mjs.map +1 -1
- package/dist/admin/src/future/components/UploadProgressDialog.d.ts +1 -0
- package/dist/admin/src/future/pages/Assets/components/AssetsGrid.d.ts +3 -1
- package/dist/admin/src/future/pages/Assets/components/AssetsTable.d.ts +3 -1
- package/dist/admin/src/future/pages/Assets/components/DropZone/UploadDropZone.d.ts +10 -0
- package/dist/admin/src/future/pages/Assets/hooks/useFolderInfo.d.ts +5 -0
- package/dist/admin/src/future/pages/Assets/hooks/useFolderNavigation.d.ts +5 -0
- package/dist/admin/src/future/pages/Assets/hooks/useInfiniteAssets.d.ts +17 -0
- package/dist/admin/src/future/services/api.d.ts +21 -3
- package/dist/admin/src/future/services/folders.d.ts +16 -0
- package/dist/admin/src/future/store/hooks.d.ts +6 -0
- package/dist/admin/src/future/store/uploadProgress.d.ts +46 -0
- package/dist/admin/translations/en.json.js +24 -0
- package/dist/admin/translations/en.json.js.map +1 -1
- package/dist/admin/translations/en.json.mjs +24 -0
- package/dist/admin/translations/en.json.mjs.map +1 -1
- package/dist/server/controllers/admin-upload.js +151 -2
- package/dist/server/controllers/admin-upload.js.map +1 -1
- package/dist/server/controllers/admin-upload.mjs +151 -2
- package/dist/server/controllers/admin-upload.mjs.map +1 -1
- package/dist/server/controllers/content-api.js +14 -6
- package/dist/server/controllers/content-api.js.map +1 -1
- package/dist/server/controllers/content-api.mjs +15 -7
- package/dist/server/controllers/content-api.mjs.map +1 -1
- package/dist/server/routes/admin.js +10 -0
- package/dist/server/routes/admin.js.map +1 -1
- package/dist/server/routes/admin.mjs +10 -0
- package/dist/server/routes/admin.mjs.map +1 -1
- package/dist/server/src/controllers/admin-upload.d.ts +12 -0
- package/dist/server/src/controllers/admin-upload.d.ts.map +1 -1
- package/dist/server/src/controllers/content-api.d.ts.map +1 -1
- package/dist/server/src/controllers/index.d.ts +1 -0
- package/dist/server/src/controllers/index.d.ts.map +1 -1
- package/dist/server/src/index.d.ts +1 -0
- package/dist/server/src/index.d.ts.map +1 -1
- package/dist/server/src/routes/admin.d.ts.map +1 -1
- package/dist/server/src/utils/mime-validation.d.ts +5 -0
- package/dist/server/src/utils/mime-validation.d.ts.map +1 -1
- package/dist/server/utils/mime-validation.js +7 -4
- package/dist/server/utils/mime-validation.js.map +1 -1
- package/dist/server/utils/mime-validation.mjs +7 -4
- package/dist/server/utils/mime-validation.mjs.map +1 -1
- package/dist/shared/contracts/files.d.ts +52 -0
- package/dist/shared/contracts/files.d.ts.map +1 -0
- package/dist/shared/contracts/folders.d.ts +2 -0
- package/package.json +11 -10
- package/dist/admin/future/pages/AIGenerationPage.js +0 -24
- package/dist/admin/future/pages/AIGenerationPage.js.map +0 -1
- package/dist/admin/future/pages/AIGenerationPage.mjs +0 -22
- package/dist/admin/future/pages/AIGenerationPage.mjs.map +0 -1
- package/dist/admin/future/pages/Assets/components/DropZone/DropZoneWithOverlay.js +0 -33
- package/dist/admin/future/pages/Assets/components/DropZone/DropZoneWithOverlay.js.map +0 -1
- package/dist/admin/future/pages/Assets/components/DropZone/DropZoneWithOverlay.mjs +0 -31
- package/dist/admin/future/pages/Assets/components/DropZone/DropZoneWithOverlay.mjs.map +0 -1
- package/dist/admin/src/future/pages/AIGenerationPage.d.ts +0 -1
- package/dist/admin/src/future/pages/Assets/components/DropZone/DropZoneWithOverlay.d.ts +0 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"assets.js","sources":["../../../../admin/src/future/services/assets.ts"],"sourcesContent":["import { uploadApi } from './api';\n\nimport type { GetFiles, File, Pagination } from '../../../../shared/contracts/files';\n\ninterface GetAssetsParams {\n page?: number;\n pageSize?: number;\n folder?: number | null;\n sort?: string;\n}\n\ninterface GetAssetsResponse {\n results: File[];\n pagination: Pagination;\n}\n\nconst assetsApi = uploadApi.injectEndpoints({\n endpoints: (builder) => ({\n getAssets: builder.query<GetAssetsResponse, GetAssetsParams | void>({\n query: (params = {}) => ({\n url: '/upload/files',\n
|
|
1
|
+
{"version":3,"file":"assets.js","sources":["../../../../admin/src/future/services/assets.ts"],"sourcesContent":["import { uploadApi } from './api';\n\nimport type { GetFiles, File, Pagination } from '../../../../shared/contracts/files';\n\ninterface GetAssetsParams {\n page?: number;\n pageSize?: number;\n folder?: number | null;\n sort?: string;\n}\n\ninterface GetAssetsResponse {\n results: File[];\n pagination: Pagination;\n}\n\nconst assetsApi = uploadApi.injectEndpoints({\n endpoints: (builder) => ({\n getAssets: builder.query<GetAssetsResponse, GetAssetsParams | void>({\n query: (params = {}) => {\n const { folder, ...rest } = params as GetAssetsParams;\n\n const queryParams: Record<string, unknown> = { ...rest };\n\n if (folder != null) {\n queryParams['filters'] = {\n $and: [{ folder: { id: folder } }],\n };\n } else {\n queryParams['filters'] = {\n $and: [{ folder: { id: { $null: true } } }],\n };\n }\n\n return {\n url: '/upload/files',\n method: 'GET',\n config: { params: queryParams },\n };\n },\n transformResponse: (response: GetFiles.Response['data']) => response,\n providesTags: (result) =>\n result\n ? [\n ...result.results.map(({ id }) => ({ type: 'Asset' as const, id })),\n { type: 'Asset', id: 'LIST' },\n ]\n : [{ type: 'Asset', id: 'LIST' }],\n }),\n }),\n});\n\nexport const { useGetAssetsQuery } = assetsApi;\n"],"names":["assetsApi","uploadApi","injectEndpoints","endpoints","builder","getAssets","query","params","folder","rest","queryParams","$and","id","$null","url","method","config","transformResponse","response","providesTags","result","results","map","type","useGetAssetsQuery"],"mappings":";;;;AAgBA,MAAMA,SAAAA,GAAYC,aAAUC,CAAAA,eAAe,CAAC;IAC1CC,SAAW,EAAA,CAACC,WAAa;YACvBC,SAAWD,EAAAA,OAAAA,CAAQE,KAAK,CAA4C;gBAClEA,KAAO,EAAA,CAACC,MAAS,GAAA,EAAE,GAAA;AACjB,oBAAA,MAAM,EAAEC,MAAM,EAAE,GAAGC,MAAM,GAAGF,MAAAA;AAE5B,oBAAA,MAAMG,WAAuC,GAAA;AAAE,wBAAA,GAAGD;AAAK,qBAAA;AAEvD,oBAAA,IAAID,UAAU,IAAM,EAAA;wBAClBE,WAAW,CAAC,UAAU,GAAG;4BACvBC,IAAM,EAAA;AAAC,gCAAA;oCAAEH,MAAQ,EAAA;wCAAEI,EAAIJ,EAAAA;AAAO;AAAE;AAAE;AACpC,yBAAA;qBACK,MAAA;wBACLE,WAAW,CAAC,UAAU,GAAG;4BACvBC,IAAM,EAAA;AAAC,gCAAA;oCAAEH,MAAQ,EAAA;wCAAEI,EAAI,EAAA;4CAAEC,KAAO,EAAA;AAAK;AAAE;AAAE;AAAE;AAC7C,yBAAA;AACF;oBAEA,OAAO;wBACLC,GAAK,EAAA,eAAA;wBACLC,MAAQ,EAAA,KAAA;wBACRC,MAAQ,EAAA;4BAAET,MAAQG,EAAAA;AAAY;AAChC,qBAAA;AACF,iBAAA;AACAO,gBAAAA,iBAAAA,EAAmB,CAACC,QAAwCA,GAAAA,QAAAA;gBAC5DC,YAAc,EAAA,CAACC,SACbA,MACI,GAAA;2BACKA,MAAOC,CAAAA,OAAO,CAACC,GAAG,CAAC,CAAC,EAAEV,EAAE,EAAE,IAAM;gCAAEW,IAAM,EAAA,OAAA;AAAkBX,gCAAAA;6BAAG,CAAA,CAAA;AAChE,wBAAA;4BAAEW,IAAM,EAAA,OAAA;4BAASX,EAAI,EAAA;AAAO;qBAC7B,GACD;AAAC,wBAAA;4BAAEW,IAAM,EAAA,OAAA;4BAASX,EAAI,EAAA;AAAO;AAAE;AACvC,aAAA;SACF;AACF,CAAA,CAAA;AAEa,MAAA,EAAEY,iBAAiB,EAAE,GAAGxB;;;;"}
|
|
@@ -3,13 +3,42 @@ import { uploadApi } from './api.mjs';
|
|
|
3
3
|
const assetsApi = uploadApi.injectEndpoints({
|
|
4
4
|
endpoints: (builder)=>({
|
|
5
5
|
getAssets: builder.query({
|
|
6
|
-
query: (params = {})=>
|
|
6
|
+
query: (params = {})=>{
|
|
7
|
+
const { folder, ...rest } = params;
|
|
8
|
+
const queryParams = {
|
|
9
|
+
...rest
|
|
10
|
+
};
|
|
11
|
+
if (folder != null) {
|
|
12
|
+
queryParams['filters'] = {
|
|
13
|
+
$and: [
|
|
14
|
+
{
|
|
15
|
+
folder: {
|
|
16
|
+
id: folder
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
]
|
|
20
|
+
};
|
|
21
|
+
} else {
|
|
22
|
+
queryParams['filters'] = {
|
|
23
|
+
$and: [
|
|
24
|
+
{
|
|
25
|
+
folder: {
|
|
26
|
+
id: {
|
|
27
|
+
$null: true
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
]
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
return {
|
|
7
35
|
url: '/upload/files',
|
|
8
36
|
method: 'GET',
|
|
9
37
|
config: {
|
|
10
|
-
params
|
|
38
|
+
params: queryParams
|
|
11
39
|
}
|
|
12
|
-
}
|
|
40
|
+
};
|
|
41
|
+
},
|
|
13
42
|
transformResponse: (response)=>response,
|
|
14
43
|
providesTags: (result)=>result ? [
|
|
15
44
|
...result.results.map(({ id })=>({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"assets.mjs","sources":["../../../../admin/src/future/services/assets.ts"],"sourcesContent":["import { uploadApi } from './api';\n\nimport type { GetFiles, File, Pagination } from '../../../../shared/contracts/files';\n\ninterface GetAssetsParams {\n page?: number;\n pageSize?: number;\n folder?: number | null;\n sort?: string;\n}\n\ninterface GetAssetsResponse {\n results: File[];\n pagination: Pagination;\n}\n\nconst assetsApi = uploadApi.injectEndpoints({\n endpoints: (builder) => ({\n getAssets: builder.query<GetAssetsResponse, GetAssetsParams | void>({\n query: (params = {}) => ({\n url: '/upload/files',\n
|
|
1
|
+
{"version":3,"file":"assets.mjs","sources":["../../../../admin/src/future/services/assets.ts"],"sourcesContent":["import { uploadApi } from './api';\n\nimport type { GetFiles, File, Pagination } from '../../../../shared/contracts/files';\n\ninterface GetAssetsParams {\n page?: number;\n pageSize?: number;\n folder?: number | null;\n sort?: string;\n}\n\ninterface GetAssetsResponse {\n results: File[];\n pagination: Pagination;\n}\n\nconst assetsApi = uploadApi.injectEndpoints({\n endpoints: (builder) => ({\n getAssets: builder.query<GetAssetsResponse, GetAssetsParams | void>({\n query: (params = {}) => {\n const { folder, ...rest } = params as GetAssetsParams;\n\n const queryParams: Record<string, unknown> = { ...rest };\n\n if (folder != null) {\n queryParams['filters'] = {\n $and: [{ folder: { id: folder } }],\n };\n } else {\n queryParams['filters'] = {\n $and: [{ folder: { id: { $null: true } } }],\n };\n }\n\n return {\n url: '/upload/files',\n method: 'GET',\n config: { params: queryParams },\n };\n },\n transformResponse: (response: GetFiles.Response['data']) => response,\n providesTags: (result) =>\n result\n ? [\n ...result.results.map(({ id }) => ({ type: 'Asset' as const, id })),\n { type: 'Asset', id: 'LIST' },\n ]\n : [{ type: 'Asset', id: 'LIST' }],\n }),\n }),\n});\n\nexport const { useGetAssetsQuery } = assetsApi;\n"],"names":["assetsApi","uploadApi","injectEndpoints","endpoints","builder","getAssets","query","params","folder","rest","queryParams","$and","id","$null","url","method","config","transformResponse","response","providesTags","result","results","map","type","useGetAssetsQuery"],"mappings":";;AAgBA,MAAMA,SAAAA,GAAYC,SAAUC,CAAAA,eAAe,CAAC;IAC1CC,SAAW,EAAA,CAACC,WAAa;YACvBC,SAAWD,EAAAA,OAAAA,CAAQE,KAAK,CAA4C;gBAClEA,KAAO,EAAA,CAACC,MAAS,GAAA,EAAE,GAAA;AACjB,oBAAA,MAAM,EAAEC,MAAM,EAAE,GAAGC,MAAM,GAAGF,MAAAA;AAE5B,oBAAA,MAAMG,WAAuC,GAAA;AAAE,wBAAA,GAAGD;AAAK,qBAAA;AAEvD,oBAAA,IAAID,UAAU,IAAM,EAAA;wBAClBE,WAAW,CAAC,UAAU,GAAG;4BACvBC,IAAM,EAAA;AAAC,gCAAA;oCAAEH,MAAQ,EAAA;wCAAEI,EAAIJ,EAAAA;AAAO;AAAE;AAAE;AACpC,yBAAA;qBACK,MAAA;wBACLE,WAAW,CAAC,UAAU,GAAG;4BACvBC,IAAM,EAAA;AAAC,gCAAA;oCAAEH,MAAQ,EAAA;wCAAEI,EAAI,EAAA;4CAAEC,KAAO,EAAA;AAAK;AAAE;AAAE;AAAE;AAC7C,yBAAA;AACF;oBAEA,OAAO;wBACLC,GAAK,EAAA,eAAA;wBACLC,MAAQ,EAAA,KAAA;wBACRC,MAAQ,EAAA;4BAAET,MAAQG,EAAAA;AAAY;AAChC,qBAAA;AACF,iBAAA;AACAO,gBAAAA,iBAAAA,EAAmB,CAACC,QAAwCA,GAAAA,QAAAA;gBAC5DC,YAAc,EAAA,CAACC,SACbA,MACI,GAAA;2BACKA,MAAOC,CAAAA,OAAO,CAACC,GAAG,CAAC,CAAC,EAAEV,EAAE,EAAE,IAAM;gCAAEW,IAAM,EAAA,OAAA;AAAkBX,gCAAAA;6BAAG,CAAA,CAAA;AAChE,wBAAA;4BAAEW,IAAM,EAAA,OAAA;4BAASX,EAAI,EAAA;AAAO;qBAC7B,GACD;AAAC,wBAAA;4BAAEW,IAAM,EAAA,OAAA;4BAASX,EAAI,EAAA;AAAO;AAAE;AACvC,aAAA;SACF;AACF,CAAA,CAAA;AAEa,MAAA,EAAEY,iBAAiB,EAAE,GAAGxB;;;;"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var api = require('./api.js');
|
|
4
|
+
|
|
5
|
+
const foldersApi = api.uploadApi.injectEndpoints({
|
|
6
|
+
endpoints: (builder)=>({
|
|
7
|
+
getFolders: builder.query({
|
|
8
|
+
query: (params = {})=>{
|
|
9
|
+
const { parentId } = params;
|
|
10
|
+
const queryParams = {};
|
|
11
|
+
if (parentId != null) {
|
|
12
|
+
queryParams['filters'] = {
|
|
13
|
+
$and: [
|
|
14
|
+
{
|
|
15
|
+
parent: {
|
|
16
|
+
id: parentId
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
]
|
|
20
|
+
};
|
|
21
|
+
} else {
|
|
22
|
+
queryParams['filters'] = {
|
|
23
|
+
$and: [
|
|
24
|
+
{
|
|
25
|
+
parent: {
|
|
26
|
+
id: {
|
|
27
|
+
$null: true
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
]
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
return {
|
|
35
|
+
url: '/upload/folders',
|
|
36
|
+
method: 'GET',
|
|
37
|
+
config: {
|
|
38
|
+
params: queryParams
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
},
|
|
42
|
+
transformResponse: (response)=>// TODO dont want this cast
|
|
43
|
+
response.data,
|
|
44
|
+
providesTags: (results)=>{
|
|
45
|
+
if (results) {
|
|
46
|
+
return [
|
|
47
|
+
...results.map(({ id })=>({
|
|
48
|
+
type: 'Folder',
|
|
49
|
+
id
|
|
50
|
+
})),
|
|
51
|
+
{
|
|
52
|
+
type: 'Folder',
|
|
53
|
+
id: 'LIST'
|
|
54
|
+
}
|
|
55
|
+
];
|
|
56
|
+
}
|
|
57
|
+
return [
|
|
58
|
+
{
|
|
59
|
+
type: 'Folder',
|
|
60
|
+
id: 'LIST'
|
|
61
|
+
}
|
|
62
|
+
];
|
|
63
|
+
}
|
|
64
|
+
}),
|
|
65
|
+
getFolder: builder.query({
|
|
66
|
+
query: ({ id })=>({
|
|
67
|
+
url: `/upload/folders/${id}`,
|
|
68
|
+
method: 'GET',
|
|
69
|
+
config: {
|
|
70
|
+
params: {
|
|
71
|
+
populate: {
|
|
72
|
+
parent: {
|
|
73
|
+
populate: {
|
|
74
|
+
parent: '*'
|
|
75
|
+
}
|
|
76
|
+
},
|
|
77
|
+
children: {
|
|
78
|
+
count: true
|
|
79
|
+
},
|
|
80
|
+
files: {
|
|
81
|
+
count: true
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}),
|
|
87
|
+
transformResponse: (response)=>response.data,
|
|
88
|
+
providesTags: (_result, _error, { id })=>[
|
|
89
|
+
{
|
|
90
|
+
type: 'Folder',
|
|
91
|
+
id
|
|
92
|
+
}
|
|
93
|
+
]
|
|
94
|
+
})
|
|
95
|
+
})
|
|
96
|
+
});
|
|
97
|
+
const { useGetFoldersQuery, useGetFolderQuery } = foldersApi;
|
|
98
|
+
|
|
99
|
+
exports.useGetFolderQuery = useGetFolderQuery;
|
|
100
|
+
exports.useGetFoldersQuery = useGetFoldersQuery;
|
|
101
|
+
//# sourceMappingURL=folders.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"folders.js","sources":["../../../../admin/src/future/services/folders.ts"],"sourcesContent":["import { uploadApi } from './api';\n\nimport type { Folder, GetFolder, GetFolders } from '../../../../shared/contracts/folders';\n\nexport type FolderWithCounts = Omit<Folder, 'children' | 'files'> & {\n children?: { count: number };\n files?: { count: number };\n};\n\ninterface GetFoldersParams {\n parentId?: number | null;\n}\n\nconst foldersApi = uploadApi.injectEndpoints({\n endpoints: (builder) => ({\n getFolders: builder.query<Folder[], GetFoldersParams | void>({\n query: (params = {}) => {\n const { parentId } = params as GetFoldersParams;\n\n const queryParams: Record<string, unknown> = {};\n\n if (parentId != null) {\n queryParams['filters'] = {\n $and: [{ parent: { id: parentId } }],\n };\n } else {\n queryParams['filters'] = {\n $and: [{ parent: { id: { $null: true } } }],\n };\n }\n\n return {\n url: '/upload/folders',\n method: 'GET',\n config: { params: queryParams },\n };\n },\n transformResponse: (response: GetFolders.Response['data']) =>\n // TODO dont want this cast\n (response as any).data,\n providesTags: (results) => {\n if (results) {\n return [\n ...results.map(({ id }) => ({ type: 'Folder' as const, id })),\n { type: 'Folder', id: 'LIST' },\n ];\n }\n return [{ type: 'Folder', id: 'LIST' }];\n },\n }),\n getFolder: builder.query<FolderWithCounts, { id: number }>({\n query: ({ id }) => ({\n url: `/upload/folders/${id}`,\n method: 'GET',\n config: {\n params: {\n populate: {\n parent: {\n populate: {\n parent: '*',\n },\n },\n children: { count: true },\n files: { count: true },\n },\n },\n },\n }),\n transformResponse: (response: GetFolder.Response) =>\n response.data as unknown as FolderWithCounts,\n providesTags: (_result, _error, { id }) => [{ type: 'Folder', id }],\n }),\n }),\n});\n\nexport const { useGetFoldersQuery, useGetFolderQuery } = foldersApi;\n"],"names":["foldersApi","uploadApi","injectEndpoints","endpoints","builder","getFolders","query","params","parentId","queryParams","$and","parent","id","$null","url","method","config","transformResponse","response","data","providesTags","results","map","type","getFolder","populate","children","count","files","_result","_error","useGetFoldersQuery","useGetFolderQuery"],"mappings":";;;;AAaA,MAAMA,UAAAA,GAAaC,aAAUC,CAAAA,eAAe,CAAC;IAC3CC,SAAW,EAAA,CAACC,WAAa;YACvBC,UAAYD,EAAAA,OAAAA,CAAQE,KAAK,CAAoC;gBAC3DA,KAAO,EAAA,CAACC,MAAS,GAAA,EAAE,GAAA;oBACjB,MAAM,EAAEC,QAAQ,EAAE,GAAGD,MAAAA;AAErB,oBAAA,MAAME,cAAuC,EAAC;AAE9C,oBAAA,IAAID,YAAY,IAAM,EAAA;wBACpBC,WAAW,CAAC,UAAU,GAAG;4BACvBC,IAAM,EAAA;AAAC,gCAAA;oCAAEC,MAAQ,EAAA;wCAAEC,EAAIJ,EAAAA;AAAS;AAAE;AAAE;AACtC,yBAAA;qBACK,MAAA;wBACLC,WAAW,CAAC,UAAU,GAAG;4BACvBC,IAAM,EAAA;AAAC,gCAAA;oCAAEC,MAAQ,EAAA;wCAAEC,EAAI,EAAA;4CAAEC,KAAO,EAAA;AAAK;AAAE;AAAE;AAAE;AAC7C,yBAAA;AACF;oBAEA,OAAO;wBACLC,GAAK,EAAA,iBAAA;wBACLC,MAAQ,EAAA,KAAA;wBACRC,MAAQ,EAAA;4BAAET,MAAQE,EAAAA;AAAY;AAChC,qBAAA;AACF,iBAAA;gBACAQ,iBAAmB,EAAA,CAACC,QAElB;AAACA,oBAAAA,QAAAA,CAAiBC,IAAI;AACxBC,gBAAAA,YAAAA,EAAc,CAACC,OAAAA,GAAAA;AACb,oBAAA,IAAIA,OAAS,EAAA;wBACX,OAAO;AACFA,4BAAAA,GAAAA,OAAAA,CAAQC,GAAG,CAAC,CAAC,EAAEV,EAAE,EAAE,IAAM;oCAAEW,IAAM,EAAA,QAAA;AAAmBX,oCAAAA;iCAAG,CAAA,CAAA;AAC1D,4BAAA;gCAAEW,IAAM,EAAA,QAAA;gCAAUX,EAAI,EAAA;AAAO;AAC9B,yBAAA;AACH;oBACA,OAAO;AAAC,wBAAA;4BAAEW,IAAM,EAAA,QAAA;4BAAUX,EAAI,EAAA;AAAO;AAAE,qBAAA;AACzC;AACF,aAAA,CAAA;YACAY,SAAWpB,EAAAA,OAAAA,CAAQE,KAAK,CAAmC;AACzDA,gBAAAA,KAAAA,EAAO,CAAC,EAAEM,EAAE,EAAE,IAAM;wBAClBE,GAAK,EAAA,CAAC,gBAAgB,EAAEF,EAAI,CAAA,CAAA;wBAC5BG,MAAQ,EAAA,KAAA;wBACRC,MAAQ,EAAA;4BACNT,MAAQ,EAAA;gCACNkB,QAAU,EAAA;oCACRd,MAAQ,EAAA;wCACNc,QAAU,EAAA;4CACRd,MAAQ,EAAA;AACV;AACF,qCAAA;oCACAe,QAAU,EAAA;wCAAEC,KAAO,EAAA;AAAK,qCAAA;oCACxBC,KAAO,EAAA;wCAAED,KAAO,EAAA;AAAK;AACvB;AACF;AACF;qBACF,CAAA;gBACAV,iBAAmB,EAAA,CAACC,QAClBA,GAAAA,QAAAA,CAASC,IAAI;AACfC,gBAAAA,YAAAA,EAAc,CAACS,OAASC,EAAAA,MAAAA,EAAQ,EAAElB,EAAE,EAAE,GAAK;AAAC,wBAAA;4BAAEW,IAAM,EAAA,QAAA;AAAUX,4BAAAA;AAAG;AAAE;AACrE,aAAA;SACF;AACF,CAAA,CAAA;MAEa,EAAEmB,kBAAkB,EAAEC,iBAAiB,EAAE,GAAGhC;;;;;"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { uploadApi } from './api.mjs';
|
|
2
|
+
|
|
3
|
+
const foldersApi = uploadApi.injectEndpoints({
|
|
4
|
+
endpoints: (builder)=>({
|
|
5
|
+
getFolders: builder.query({
|
|
6
|
+
query: (params = {})=>{
|
|
7
|
+
const { parentId } = params;
|
|
8
|
+
const queryParams = {};
|
|
9
|
+
if (parentId != null) {
|
|
10
|
+
queryParams['filters'] = {
|
|
11
|
+
$and: [
|
|
12
|
+
{
|
|
13
|
+
parent: {
|
|
14
|
+
id: parentId
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
]
|
|
18
|
+
};
|
|
19
|
+
} else {
|
|
20
|
+
queryParams['filters'] = {
|
|
21
|
+
$and: [
|
|
22
|
+
{
|
|
23
|
+
parent: {
|
|
24
|
+
id: {
|
|
25
|
+
$null: true
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
]
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
return {
|
|
33
|
+
url: '/upload/folders',
|
|
34
|
+
method: 'GET',
|
|
35
|
+
config: {
|
|
36
|
+
params: queryParams
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
},
|
|
40
|
+
transformResponse: (response)=>// TODO dont want this cast
|
|
41
|
+
response.data,
|
|
42
|
+
providesTags: (results)=>{
|
|
43
|
+
if (results) {
|
|
44
|
+
return [
|
|
45
|
+
...results.map(({ id })=>({
|
|
46
|
+
type: 'Folder',
|
|
47
|
+
id
|
|
48
|
+
})),
|
|
49
|
+
{
|
|
50
|
+
type: 'Folder',
|
|
51
|
+
id: 'LIST'
|
|
52
|
+
}
|
|
53
|
+
];
|
|
54
|
+
}
|
|
55
|
+
return [
|
|
56
|
+
{
|
|
57
|
+
type: 'Folder',
|
|
58
|
+
id: 'LIST'
|
|
59
|
+
}
|
|
60
|
+
];
|
|
61
|
+
}
|
|
62
|
+
}),
|
|
63
|
+
getFolder: builder.query({
|
|
64
|
+
query: ({ id })=>({
|
|
65
|
+
url: `/upload/folders/${id}`,
|
|
66
|
+
method: 'GET',
|
|
67
|
+
config: {
|
|
68
|
+
params: {
|
|
69
|
+
populate: {
|
|
70
|
+
parent: {
|
|
71
|
+
populate: {
|
|
72
|
+
parent: '*'
|
|
73
|
+
}
|
|
74
|
+
},
|
|
75
|
+
children: {
|
|
76
|
+
count: true
|
|
77
|
+
},
|
|
78
|
+
files: {
|
|
79
|
+
count: true
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}),
|
|
85
|
+
transformResponse: (response)=>response.data,
|
|
86
|
+
providesTags: (_result, _error, { id })=>[
|
|
87
|
+
{
|
|
88
|
+
type: 'Folder',
|
|
89
|
+
id
|
|
90
|
+
}
|
|
91
|
+
]
|
|
92
|
+
})
|
|
93
|
+
})
|
|
94
|
+
});
|
|
95
|
+
const { useGetFoldersQuery, useGetFolderQuery } = foldersApi;
|
|
96
|
+
|
|
97
|
+
export { useGetFolderQuery, useGetFoldersQuery };
|
|
98
|
+
//# sourceMappingURL=folders.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"folders.mjs","sources":["../../../../admin/src/future/services/folders.ts"],"sourcesContent":["import { uploadApi } from './api';\n\nimport type { Folder, GetFolder, GetFolders } from '../../../../shared/contracts/folders';\n\nexport type FolderWithCounts = Omit<Folder, 'children' | 'files'> & {\n children?: { count: number };\n files?: { count: number };\n};\n\ninterface GetFoldersParams {\n parentId?: number | null;\n}\n\nconst foldersApi = uploadApi.injectEndpoints({\n endpoints: (builder) => ({\n getFolders: builder.query<Folder[], GetFoldersParams | void>({\n query: (params = {}) => {\n const { parentId } = params as GetFoldersParams;\n\n const queryParams: Record<string, unknown> = {};\n\n if (parentId != null) {\n queryParams['filters'] = {\n $and: [{ parent: { id: parentId } }],\n };\n } else {\n queryParams['filters'] = {\n $and: [{ parent: { id: { $null: true } } }],\n };\n }\n\n return {\n url: '/upload/folders',\n method: 'GET',\n config: { params: queryParams },\n };\n },\n transformResponse: (response: GetFolders.Response['data']) =>\n // TODO dont want this cast\n (response as any).data,\n providesTags: (results) => {\n if (results) {\n return [\n ...results.map(({ id }) => ({ type: 'Folder' as const, id })),\n { type: 'Folder', id: 'LIST' },\n ];\n }\n return [{ type: 'Folder', id: 'LIST' }];\n },\n }),\n getFolder: builder.query<FolderWithCounts, { id: number }>({\n query: ({ id }) => ({\n url: `/upload/folders/${id}`,\n method: 'GET',\n config: {\n params: {\n populate: {\n parent: {\n populate: {\n parent: '*',\n },\n },\n children: { count: true },\n files: { count: true },\n },\n },\n },\n }),\n transformResponse: (response: GetFolder.Response) =>\n response.data as unknown as FolderWithCounts,\n providesTags: (_result, _error, { id }) => [{ type: 'Folder', id }],\n }),\n }),\n});\n\nexport const { useGetFoldersQuery, useGetFolderQuery } = foldersApi;\n"],"names":["foldersApi","uploadApi","injectEndpoints","endpoints","builder","getFolders","query","params","parentId","queryParams","$and","parent","id","$null","url","method","config","transformResponse","response","data","providesTags","results","map","type","getFolder","populate","children","count","files","_result","_error","useGetFoldersQuery","useGetFolderQuery"],"mappings":";;AAaA,MAAMA,UAAAA,GAAaC,SAAUC,CAAAA,eAAe,CAAC;IAC3CC,SAAW,EAAA,CAACC,WAAa;YACvBC,UAAYD,EAAAA,OAAAA,CAAQE,KAAK,CAAoC;gBAC3DA,KAAO,EAAA,CAACC,MAAS,GAAA,EAAE,GAAA;oBACjB,MAAM,EAAEC,QAAQ,EAAE,GAAGD,MAAAA;AAErB,oBAAA,MAAME,cAAuC,EAAC;AAE9C,oBAAA,IAAID,YAAY,IAAM,EAAA;wBACpBC,WAAW,CAAC,UAAU,GAAG;4BACvBC,IAAM,EAAA;AAAC,gCAAA;oCAAEC,MAAQ,EAAA;wCAAEC,EAAIJ,EAAAA;AAAS;AAAE;AAAE;AACtC,yBAAA;qBACK,MAAA;wBACLC,WAAW,CAAC,UAAU,GAAG;4BACvBC,IAAM,EAAA;AAAC,gCAAA;oCAAEC,MAAQ,EAAA;wCAAEC,EAAI,EAAA;4CAAEC,KAAO,EAAA;AAAK;AAAE;AAAE;AAAE;AAC7C,yBAAA;AACF;oBAEA,OAAO;wBACLC,GAAK,EAAA,iBAAA;wBACLC,MAAQ,EAAA,KAAA;wBACRC,MAAQ,EAAA;4BAAET,MAAQE,EAAAA;AAAY;AAChC,qBAAA;AACF,iBAAA;gBACAQ,iBAAmB,EAAA,CAACC,QAElB;AAACA,oBAAAA,QAAAA,CAAiBC,IAAI;AACxBC,gBAAAA,YAAAA,EAAc,CAACC,OAAAA,GAAAA;AACb,oBAAA,IAAIA,OAAS,EAAA;wBACX,OAAO;AACFA,4BAAAA,GAAAA,OAAAA,CAAQC,GAAG,CAAC,CAAC,EAAEV,EAAE,EAAE,IAAM;oCAAEW,IAAM,EAAA,QAAA;AAAmBX,oCAAAA;iCAAG,CAAA,CAAA;AAC1D,4BAAA;gCAAEW,IAAM,EAAA,QAAA;gCAAUX,EAAI,EAAA;AAAO;AAC9B,yBAAA;AACH;oBACA,OAAO;AAAC,wBAAA;4BAAEW,IAAM,EAAA,QAAA;4BAAUX,EAAI,EAAA;AAAO;AAAE,qBAAA;AACzC;AACF,aAAA,CAAA;YACAY,SAAWpB,EAAAA,OAAAA,CAAQE,KAAK,CAAmC;AACzDA,gBAAAA,KAAAA,EAAO,CAAC,EAAEM,EAAE,EAAE,IAAM;wBAClBE,GAAK,EAAA,CAAC,gBAAgB,EAAEF,EAAI,CAAA,CAAA;wBAC5BG,MAAQ,EAAA,KAAA;wBACRC,MAAQ,EAAA;4BACNT,MAAQ,EAAA;gCACNkB,QAAU,EAAA;oCACRd,MAAQ,EAAA;wCACNc,QAAU,EAAA;4CACRd,MAAQ,EAAA;AACV;AACF,qCAAA;oCACAe,QAAU,EAAA;wCAAEC,KAAO,EAAA;AAAK,qCAAA;oCACxBC,KAAO,EAAA;wCAAED,KAAO,EAAA;AAAK;AACvB;AACF;AACF;qBACF,CAAA;gBACAV,iBAAmB,EAAA,CAACC,QAClBA,GAAAA,QAAAA,CAASC,IAAI;AACfC,gBAAAA,YAAAA,EAAc,CAACS,OAASC,EAAAA,MAAAA,EAAQ,EAAElB,EAAE,EAAE,GAAK;AAAC,wBAAA;4BAAEW,IAAM,EAAA,QAAA;AAAUX,4BAAAA;AAAG;AAAE;AACrE,aAAA;SACF;AACF,CAAA,CAAA;MAEa,EAAEmB,kBAAkB,EAAEC,iBAAiB,EAAE,GAAGhC;;;;"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var reactRedux = require('react-redux');
|
|
4
|
+
|
|
5
|
+
const useTypedDispatch = reactRedux.useDispatch;
|
|
6
|
+
const useTypedSelector = reactRedux.useSelector;
|
|
7
|
+
|
|
8
|
+
exports.useTypedDispatch = useTypedDispatch;
|
|
9
|
+
exports.useTypedSelector = useTypedSelector;
|
|
10
|
+
//# sourceMappingURL=hooks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hooks.js","sources":["../../../../admin/src/future/store/hooks.ts"],"sourcesContent":["import { Dispatch } from '@reduxjs/toolkit';\nimport { TypedUseSelectorHook, useDispatch, useSelector } from 'react-redux';\n\nimport type { RootState } from './uploadProgress';\n\nconst useTypedDispatch: () => Dispatch = useDispatch;\nconst useTypedSelector: TypedUseSelectorHook<RootState> = useSelector;\n\nexport { useTypedSelector, useTypedDispatch };\n"],"names":["useTypedDispatch","useDispatch","useTypedSelector","useSelector"],"mappings":";;;;AAKA,MAAMA,gBAAmCC,GAAAA;AACzC,MAAMC,gBAAoDC,GAAAA;;;;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hooks.mjs","sources":["../../../../admin/src/future/store/hooks.ts"],"sourcesContent":["import { Dispatch } from '@reduxjs/toolkit';\nimport { TypedUseSelectorHook, useDispatch, useSelector } from 'react-redux';\n\nimport type { RootState } from './uploadProgress';\n\nconst useTypedDispatch: () => Dispatch = useDispatch;\nconst useTypedSelector: TypedUseSelectorHook<RootState> = useSelector;\n\nexport { useTypedSelector, useTypedDispatch };\n"],"names":["useTypedDispatch","useDispatch","useTypedSelector","useSelector"],"mappings":";;AAKA,MAAMA,gBAAmCC,GAAAA;AACzC,MAAMC,gBAAoDC,GAAAA;;;;"}
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var toolkit = require('@reduxjs/toolkit');
|
|
4
|
+
|
|
5
|
+
const initialState = {
|
|
6
|
+
isVisible: false,
|
|
7
|
+
isMinimized: false,
|
|
8
|
+
progress: 0,
|
|
9
|
+
totalFiles: 0,
|
|
10
|
+
files: [],
|
|
11
|
+
errors: [],
|
|
12
|
+
uploadId: 0
|
|
13
|
+
};
|
|
14
|
+
const computeProgress = (files)=>{
|
|
15
|
+
if (files.length === 0) return 0;
|
|
16
|
+
const totalSize = files.reduce((sum, f)=>sum + f.size, 0);
|
|
17
|
+
if (totalSize === 0) {
|
|
18
|
+
// Fallback to count-based if sizes are unknown
|
|
19
|
+
const completed = files.filter((f)=>f.status === 'complete' || f.status === 'error' || f.status === 'cancelled').length;
|
|
20
|
+
return Math.round(completed / files.length * 100);
|
|
21
|
+
}
|
|
22
|
+
const completedSize = files.filter((f)=>f.status === 'complete' || f.status === 'error' || f.status === 'cancelled').reduce((sum, f)=>sum + f.size, 0);
|
|
23
|
+
return Math.round(completedSize / totalSize * 100);
|
|
24
|
+
};
|
|
25
|
+
const uploadProgressSlice = toolkit.createSlice({
|
|
26
|
+
name: 'uploadProgress',
|
|
27
|
+
initialState,
|
|
28
|
+
reducers: {
|
|
29
|
+
openUploadProgress (state, action) {
|
|
30
|
+
state.isVisible = true;
|
|
31
|
+
state.isMinimized = false;
|
|
32
|
+
state.progress = 0;
|
|
33
|
+
state.totalFiles = action.payload.totalFiles;
|
|
34
|
+
state.files = action.payload.fileNames.map((name, index)=>({
|
|
35
|
+
name,
|
|
36
|
+
index,
|
|
37
|
+
status: 'pending',
|
|
38
|
+
size: action.payload.fileSizes[index] || 0
|
|
39
|
+
}));
|
|
40
|
+
state.errors = [];
|
|
41
|
+
state.uploadId += 1;
|
|
42
|
+
},
|
|
43
|
+
setFileUploading (state, action) {
|
|
44
|
+
const { index } = action.payload;
|
|
45
|
+
if (state.files[index]) {
|
|
46
|
+
state.files[index].status = 'uploading';
|
|
47
|
+
}
|
|
48
|
+
},
|
|
49
|
+
setFileComplete (state, action) {
|
|
50
|
+
const { index, file } = action.payload;
|
|
51
|
+
if (state.files[index]) {
|
|
52
|
+
state.files[index].status = 'complete';
|
|
53
|
+
state.files[index].file = file;
|
|
54
|
+
}
|
|
55
|
+
state.progress = computeProgress(state.files);
|
|
56
|
+
},
|
|
57
|
+
setFileError (state, action) {
|
|
58
|
+
const { index, name, message } = action.payload;
|
|
59
|
+
if (state.files[index]) {
|
|
60
|
+
state.files[index].status = 'error';
|
|
61
|
+
state.files[index].error = message;
|
|
62
|
+
}
|
|
63
|
+
state.errors = [
|
|
64
|
+
...state.errors,
|
|
65
|
+
{
|
|
66
|
+
name,
|
|
67
|
+
message
|
|
68
|
+
}
|
|
69
|
+
];
|
|
70
|
+
state.progress = computeProgress(state.files);
|
|
71
|
+
},
|
|
72
|
+
updateProgress (state, action) {
|
|
73
|
+
state.progress = action.payload;
|
|
74
|
+
},
|
|
75
|
+
addUploadErrors (state, action) {
|
|
76
|
+
state.errors = [
|
|
77
|
+
...state.errors,
|
|
78
|
+
...action.payload
|
|
79
|
+
];
|
|
80
|
+
},
|
|
81
|
+
closeUploadProgress (state) {
|
|
82
|
+
state.isVisible = false;
|
|
83
|
+
state.isMinimized = false;
|
|
84
|
+
state.progress = 0;
|
|
85
|
+
state.totalFiles = 0;
|
|
86
|
+
state.files = [];
|
|
87
|
+
state.errors = [];
|
|
88
|
+
},
|
|
89
|
+
toggleMinimize (state) {
|
|
90
|
+
state.isMinimized = !state.isMinimized;
|
|
91
|
+
},
|
|
92
|
+
cancelUpload (state) {
|
|
93
|
+
// Mark all pending and uploading files as cancelled
|
|
94
|
+
state.files = state.files.map((file)=>{
|
|
95
|
+
if (file.status === 'pending' || file.status === 'uploading') {
|
|
96
|
+
return {
|
|
97
|
+
...file,
|
|
98
|
+
status: 'cancelled'
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
return file;
|
|
102
|
+
});
|
|
103
|
+
state.progress = computeProgress(state.files);
|
|
104
|
+
},
|
|
105
|
+
setUploadFailed (state, action) {
|
|
106
|
+
// Mark all pending and uploading files as errored when a catastrophic failure occurs
|
|
107
|
+
state.files = state.files.map((file)=>{
|
|
108
|
+
if (file.status === 'pending' || file.status === 'uploading') {
|
|
109
|
+
return {
|
|
110
|
+
...file,
|
|
111
|
+
status: 'error',
|
|
112
|
+
error: action.payload.message
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
return file;
|
|
116
|
+
});
|
|
117
|
+
state.progress = 100;
|
|
118
|
+
state.errors = [
|
|
119
|
+
...state.errors,
|
|
120
|
+
{
|
|
121
|
+
name: 'Upload Error',
|
|
122
|
+
message: action.payload.message
|
|
123
|
+
}
|
|
124
|
+
];
|
|
125
|
+
},
|
|
126
|
+
retryCancelledFiles (state) {
|
|
127
|
+
// Reset all cancelled files back to pending for retry
|
|
128
|
+
state.files = state.files.map((file)=>{
|
|
129
|
+
if (file.status === 'cancelled') {
|
|
130
|
+
return {
|
|
131
|
+
...file,
|
|
132
|
+
status: 'pending'
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
return file;
|
|
136
|
+
});
|
|
137
|
+
state.progress = computeProgress(state.files);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
});
|
|
141
|
+
const { openUploadProgress, setFileUploading, setFileComplete, setFileError, updateProgress, addUploadErrors, closeUploadProgress, toggleMinimize, cancelUpload, setUploadFailed, retryCancelledFiles } = uploadProgressSlice.actions;
|
|
142
|
+
const uploadProgressReducer = uploadProgressSlice.reducer;
|
|
143
|
+
|
|
144
|
+
exports.addUploadErrors = addUploadErrors;
|
|
145
|
+
exports.cancelUpload = cancelUpload;
|
|
146
|
+
exports.closeUploadProgress = closeUploadProgress;
|
|
147
|
+
exports.openUploadProgress = openUploadProgress;
|
|
148
|
+
exports.retryCancelledFiles = retryCancelledFiles;
|
|
149
|
+
exports.setFileComplete = setFileComplete;
|
|
150
|
+
exports.setFileError = setFileError;
|
|
151
|
+
exports.setFileUploading = setFileUploading;
|
|
152
|
+
exports.setUploadFailed = setUploadFailed;
|
|
153
|
+
exports.toggleMinimize = toggleMinimize;
|
|
154
|
+
exports.updateProgress = updateProgress;
|
|
155
|
+
exports.uploadProgressReducer = uploadProgressReducer;
|
|
156
|
+
//# sourceMappingURL=uploadProgress.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uploadProgress.js","sources":["../../../../admin/src/future/store/uploadProgress.ts"],"sourcesContent":["import { createSlice, type PayloadAction } from '@reduxjs/toolkit';\n\nimport type { File } from '../../../../shared/contracts/files';\n\nexport interface FileUploadError {\n name: string;\n message: string;\n}\n\nexport type FileProgressStatus = 'pending' | 'uploading' | 'complete' | 'error' | 'cancelled';\n\nexport interface FileProgress {\n name: string;\n index: number;\n status: FileProgressStatus;\n size: number;\n file?: File;\n error?: string;\n}\n\nexport interface UploadProgressState {\n isVisible: boolean;\n isMinimized: boolean;\n progress: number;\n totalFiles: number;\n files: FileProgress[];\n errors: FileUploadError[];\n uploadId: number;\n}\n\nexport interface RootState {\n uploadProgress: UploadProgressState;\n}\n\nconst initialState: UploadProgressState = {\n isVisible: false,\n isMinimized: false,\n progress: 0,\n totalFiles: 0,\n files: [],\n errors: [],\n uploadId: 0,\n};\n\nconst computeProgress = (files: FileProgress[]): number => {\n if (files.length === 0) return 0;\n const totalSize = files.reduce((sum, f) => sum + f.size, 0);\n if (totalSize === 0) {\n // Fallback to count-based if sizes are unknown\n const completed = files.filter(\n (f) => f.status === 'complete' || f.status === 'error' || f.status === 'cancelled'\n ).length;\n return Math.round((completed / files.length) * 100);\n }\n const completedSize = files\n .filter((f) => f.status === 'complete' || f.status === 'error' || f.status === 'cancelled')\n .reduce((sum, f) => sum + f.size, 0);\n return Math.round((completedSize / totalSize) * 100);\n};\n\nconst uploadProgressSlice = createSlice({\n name: 'uploadProgress',\n initialState,\n reducers: {\n openUploadProgress(\n state,\n action: PayloadAction<{ totalFiles: number; fileNames: string[]; fileSizes: number[] }>\n ) {\n state.isVisible = true;\n state.isMinimized = false;\n state.progress = 0;\n state.totalFiles = action.payload.totalFiles;\n state.files = action.payload.fileNames.map((name, index) => ({\n name,\n index,\n status: 'pending' as FileProgressStatus,\n size: action.payload.fileSizes[index] || 0,\n }));\n state.errors = [];\n state.uploadId += 1;\n },\n setFileUploading(\n state,\n action: PayloadAction<{ name: string; index: number; total: number; size: number }>\n ) {\n const { index } = action.payload;\n if (state.files[index]) {\n state.files[index].status = 'uploading';\n }\n },\n setFileComplete(state, action: PayloadAction<{ index: number; file: File }>) {\n const { index, file } = action.payload;\n if (state.files[index]) {\n state.files[index].status = 'complete';\n state.files[index].file = file;\n }\n state.progress = computeProgress(state.files);\n },\n setFileError(state, action: PayloadAction<{ index: number; name: string; message: string }>) {\n const { index, name, message } = action.payload;\n if (state.files[index]) {\n state.files[index].status = 'error';\n state.files[index].error = message;\n }\n state.errors = [...state.errors, { name, message }];\n state.progress = computeProgress(state.files);\n },\n updateProgress(state, action: PayloadAction<number>) {\n state.progress = action.payload;\n },\n addUploadErrors(state, action: PayloadAction<FileUploadError[]>) {\n state.errors = [...state.errors, ...action.payload];\n },\n closeUploadProgress(state) {\n state.isVisible = false;\n state.isMinimized = false;\n state.progress = 0;\n state.totalFiles = 0;\n state.files = [];\n state.errors = [];\n },\n toggleMinimize(state) {\n state.isMinimized = !state.isMinimized;\n },\n cancelUpload(state) {\n // Mark all pending and uploading files as cancelled\n state.files = state.files.map((file) => {\n if (file.status === 'pending' || file.status === 'uploading') {\n return { ...file, status: 'cancelled' as FileProgressStatus };\n }\n return file;\n });\n state.progress = computeProgress(state.files);\n },\n setUploadFailed(state, action: PayloadAction<{ message: string }>) {\n // Mark all pending and uploading files as errored when a catastrophic failure occurs\n state.files = state.files.map((file) => {\n if (file.status === 'pending' || file.status === 'uploading') {\n return {\n ...file,\n status: 'error' as FileProgressStatus,\n error: action.payload.message,\n };\n }\n return file;\n });\n state.progress = 100;\n state.errors = [...state.errors, { name: 'Upload Error', message: action.payload.message }];\n },\n retryCancelledFiles(state) {\n // Reset all cancelled files back to pending for retry\n state.files = state.files.map((file) => {\n if (file.status === 'cancelled') {\n return {\n ...file,\n status: 'pending' as FileProgressStatus,\n };\n }\n return file;\n });\n state.progress = computeProgress(state.files);\n },\n },\n});\n\nexport const {\n openUploadProgress,\n setFileUploading,\n setFileComplete,\n setFileError,\n updateProgress,\n addUploadErrors,\n closeUploadProgress,\n toggleMinimize,\n cancelUpload,\n setUploadFailed,\n retryCancelledFiles,\n} = uploadProgressSlice.actions;\n\nexport const uploadProgressReducer = uploadProgressSlice.reducer;\n"],"names":["initialState","isVisible","isMinimized","progress","totalFiles","files","errors","uploadId","computeProgress","length","totalSize","reduce","sum","f","size","completed","filter","status","Math","round","completedSize","uploadProgressSlice","createSlice","name","reducers","openUploadProgress","state","action","payload","fileNames","map","index","fileSizes","setFileUploading","setFileComplete","file","setFileError","message","error","updateProgress","addUploadErrors","closeUploadProgress","toggleMinimize","cancelUpload","setUploadFailed","retryCancelledFiles","actions","uploadProgressReducer","reducer"],"mappings":"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"}
|