@strapi/upload 5.29.0 → 5.30.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/ai/components/AIAssetCard.js +4 -2
- package/dist/admin/ai/components/AIAssetCard.js.map +1 -1
- package/dist/admin/ai/components/AIAssetCard.mjs +4 -2
- package/dist/admin/ai/components/AIAssetCard.mjs.map +1 -1
- package/dist/admin/ai/components/AIUploadModal.js +2 -1
- package/dist/admin/ai/components/AIUploadModal.js.map +1 -1
- package/dist/admin/ai/components/AIUploadModal.mjs +2 -1
- package/dist/admin/ai/components/AIUploadModal.mjs.map +1 -1
- package/dist/admin/components/AssetDialog/BrowseStep/SearchAsset/SearchAsset.js +2 -2
- package/dist/admin/components/AssetDialog/BrowseStep/SearchAsset/SearchAsset.js.map +1 -1
- package/dist/admin/components/AssetDialog/BrowseStep/SearchAsset/SearchAsset.mjs +1 -1
- package/dist/admin/components/AssetDialog/BrowseStep/SearchAsset/SearchAsset.mjs.map +1 -1
- package/dist/admin/components/EditAssetDialog/EditAssetContent.js +8 -5
- package/dist/admin/components/EditAssetDialog/EditAssetContent.js.map +1 -1
- package/dist/admin/components/EditAssetDialog/EditAssetContent.mjs +7 -4
- package/dist/admin/components/EditAssetDialog/EditAssetContent.mjs.map +1 -1
- package/dist/admin/components/EditAssetDialog/PreviewBox/PreviewBox.js +2 -2
- package/dist/admin/components/EditAssetDialog/PreviewBox/PreviewBox.js.map +1 -1
- package/dist/admin/components/EditAssetDialog/PreviewBox/PreviewBox.mjs +1 -1
- package/dist/admin/components/EditAssetDialog/PreviewBox/PreviewBox.mjs.map +1 -1
- package/dist/admin/components/EditAssetDialog/ReplaceMediaButton.js +2 -2
- package/dist/admin/components/EditAssetDialog/ReplaceMediaButton.js.map +1 -1
- package/dist/admin/components/EditAssetDialog/ReplaceMediaButton.mjs +1 -1
- package/dist/admin/components/EditAssetDialog/ReplaceMediaButton.mjs.map +1 -1
- package/dist/admin/components/EditFolderDialog/EditFolderDialog.js +2 -1
- package/dist/admin/components/EditFolderDialog/EditFolderDialog.js.map +1 -1
- package/dist/admin/components/EditFolderDialog/EditFolderDialog.mjs +2 -1
- package/dist/admin/components/EditFolderDialog/EditFolderDialog.mjs.map +1 -1
- package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromComputerForm.js +2 -2
- package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromComputerForm.js.map +1 -1
- package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromComputerForm.mjs +1 -1
- package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromComputerForm.mjs.map +1 -1
- package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromUrlForm.js +2 -2
- package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromUrlForm.js.map +1 -1
- package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromUrlForm.mjs +1 -1
- package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromUrlForm.mjs.map +1 -1
- package/dist/admin/components/UploadAssetDialog/PendingAssetStep/PendingAssetStep.js +2 -2
- package/dist/admin/components/UploadAssetDialog/PendingAssetStep/PendingAssetStep.js.map +1 -1
- package/dist/admin/components/UploadAssetDialog/PendingAssetStep/PendingAssetStep.mjs +1 -1
- package/dist/admin/components/UploadAssetDialog/PendingAssetStep/PendingAssetStep.mjs.map +1 -1
- package/dist/admin/hooks/useConfig.js +2 -1
- package/dist/admin/hooks/useConfig.js.map +1 -1
- package/dist/admin/hooks/useConfig.mjs +2 -1
- package/dist/admin/hooks/useConfig.mjs.map +1 -1
- package/dist/admin/hooks/useModalQueryParams.js +2 -2
- package/dist/admin/hooks/useModalQueryParams.js.map +1 -1
- package/dist/admin/hooks/useModalQueryParams.mjs +1 -1
- package/dist/admin/hooks/useModalQueryParams.mjs.map +1 -1
- package/dist/admin/hooks/useTracking.js +21 -0
- package/dist/admin/hooks/useTracking.js.map +1 -0
- package/dist/admin/hooks/useTracking.mjs +19 -0
- package/dist/admin/hooks/useTracking.mjs.map +1 -0
- package/dist/admin/package.json.js +5 -5
- package/dist/admin/package.json.mjs +5 -5
- package/dist/admin/pages/App/MediaLibrary/components/Filters.js +2 -1
- package/dist/admin/pages/App/MediaLibrary/components/Filters.js.map +1 -1
- package/dist/admin/pages/App/MediaLibrary/components/Filters.mjs +2 -1
- package/dist/admin/pages/App/MediaLibrary/components/Filters.mjs.map +1 -1
- package/dist/admin/src/hooks/useTracking.d.ts +4 -0
- package/dist/server/controllers/admin-folder-file.js +2 -2
- package/dist/server/controllers/admin-folder-file.js.map +1 -1
- package/dist/server/controllers/admin-folder-file.mjs +2 -2
- package/dist/server/controllers/admin-folder-file.mjs.map +1 -1
- package/dist/server/controllers/admin-upload.js +1 -1
- package/dist/server/controllers/admin-upload.js.map +1 -1
- package/dist/server/controllers/admin-upload.mjs +1 -1
- package/dist/server/controllers/admin-upload.mjs.map +1 -1
- package/dist/server/services/metrics.js +11 -1
- package/dist/server/services/metrics.js.map +1 -1
- package/dist/server/services/metrics.mjs +11 -1
- package/dist/server/services/metrics.mjs.map +1 -1
- package/dist/server/services/upload.js +8 -8
- package/dist/server/services/upload.js.map +1 -1
- package/dist/server/services/upload.mjs +8 -8
- package/dist/server/services/upload.mjs.map +1 -1
- package/dist/server/services/weekly-metrics.js +3 -6
- package/dist/server/services/weekly-metrics.js.map +1 -1
- package/dist/server/services/weekly-metrics.mjs +3 -6
- package/dist/server/services/weekly-metrics.mjs.map +1 -1
- package/dist/server/src/index.d.ts +1 -1
- package/dist/server/src/services/index.d.ts +1 -1
- package/dist/server/src/services/metrics.d.ts +1 -0
- package/dist/server/src/services/metrics.d.ts.map +1 -1
- package/dist/server/src/services/upload.d.ts.map +1 -1
- package/dist/server/src/services/weekly-metrics.d.ts +0 -1
- package/dist/server/src/services/weekly-metrics.d.ts.map +1 -1
- package/package.json +5 -5
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useConfig.js","sources":["../../../admin/src/hooks/useConfig.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"useConfig.js","sources":["../../../admin/src/hooks/useConfig.ts"],"sourcesContent":["import { useNotification, useFetchClient } from '@strapi/admin/strapi-admin';\nimport { useIntl } from 'react-intl';\nimport { useMutation, useQuery, UseMutationResult, UseQueryResult } from 'react-query';\n\nimport { GetConfiguration, UpdateConfiguration } from '../../../shared/contracts/configuration';\nimport { pluginId } from '../pluginId';\n\nimport { useTracking } from './useTracking';\n\nconst endpoint = `/${pluginId}/configuration`;\nconst queryKey = [pluginId, 'configuration'];\n\nexport const useConfig = () => {\n const { trackUsage } = useTracking();\n const { formatMessage } = useIntl();\n const { toggleNotification } = useNotification();\n const { get, put } = useFetchClient();\n\n const config: UseQueryResult<\n GetConfiguration.Response['data']['data'] | GetConfiguration.Response['error']\n > = useQuery(\n queryKey,\n async () => {\n const res: GetConfiguration.Response = await get(endpoint);\n\n return res.data.data;\n },\n {\n onError() {\n return toggleNotification({\n type: 'danger',\n message: formatMessage({ id: 'notification.error' }),\n });\n },\n /**\n * We're cementing that we always expect an object to be returned.\n */\n select: (data) => data || {},\n }\n );\n\n const putMutation: UseMutationResult<\n void,\n UpdateConfiguration.Response['error'],\n UpdateConfiguration.Request['body']\n > = useMutation(\n async (body) => {\n await put<UpdateConfiguration.Response>(endpoint, body);\n },\n {\n onSuccess() {\n trackUsage('didEditMediaLibraryConfig');\n config.refetch();\n },\n onError() {\n return toggleNotification({\n type: 'danger',\n message: formatMessage({ id: 'notification.error' }),\n });\n },\n }\n );\n\n return {\n config,\n mutateConfig: putMutation,\n };\n};\n"],"names":["endpoint","pluginId","queryKey","useConfig","trackUsage","useTracking","formatMessage","useIntl","toggleNotification","useNotification","get","put","useFetchClient","config","useQuery","res","data","onError","type","message","id","select","putMutation","useMutation","body","onSuccess","refetch","mutateConfig"],"mappings":";;;;;;;;AASA,MAAMA,WAAW,CAAC,CAAC,EAAEC,iBAAAA,CAAS,cAAc,CAAC;AAC7C,MAAMC,QAAW,GAAA;AAACD,IAAAA,iBAAAA;AAAU,IAAA;AAAgB,CAAA;MAE/BE,SAAY,GAAA,IAAA;IACvB,MAAM,EAAEC,UAAU,EAAE,GAAGC,uBAAAA,EAAAA;IACvB,MAAM,EAAEC,aAAa,EAAE,GAAGC,iBAAAA,EAAAA;IAC1B,MAAM,EAAEC,kBAAkB,EAAE,GAAGC,2BAAAA,EAAAA;AAC/B,IAAA,MAAM,EAAEC,GAAG,EAAEC,GAAG,EAAE,GAAGC,0BAAAA,EAAAA;IAErB,MAAMC,MAAAA,GAEFC,oBACFZ,QACA,EAAA,UAAA;QACE,MAAMa,GAAAA,GAAiC,MAAML,GAAIV,CAAAA,QAAAA,CAAAA;QAEjD,OAAOe,GAAAA,CAAIC,IAAI,CAACA,IAAI;KAEtB,EAAA;AACEC,QAAAA,OAAAA,CAAAA,GAAAA;AACE,YAAA,OAAOT,kBAAmB,CAAA;gBACxBU,IAAM,EAAA,QAAA;AACNC,gBAAAA,OAAAA,EAASb,aAAc,CAAA;oBAAEc,EAAI,EAAA;AAAqB,iBAAA;AACpD,aAAA,CAAA;AACF,SAAA;AACA;;AAEC,UACDC,MAAQ,EAAA,CAACL,IAASA,GAAAA,IAAAA,IAAQ;AAC5B,KAAA,CAAA;IAGF,MAAMM,WAAAA,GAIFC,uBACF,OAAOC,IAAAA,GAAAA;AACL,QAAA,MAAMb,IAAkCX,QAAUwB,EAAAA,IAAAA,CAAAA;KAEpD,EAAA;AACEC,QAAAA,SAAAA,CAAAA,GAAAA;YACErB,UAAW,CAAA,2BAAA,CAAA;AACXS,YAAAA,MAAAA,CAAOa,OAAO,EAAA;AAChB,SAAA;AACAT,QAAAA,OAAAA,CAAAA,GAAAA;AACE,YAAA,OAAOT,kBAAmB,CAAA;gBACxBU,IAAM,EAAA,QAAA;AACNC,gBAAAA,OAAAA,EAASb,aAAc,CAAA;oBAAEc,EAAI,EAAA;AAAqB,iBAAA;AACpD,aAAA,CAAA;AACF;AACF,KAAA,CAAA;IAGF,OAAO;AACLP,QAAAA,MAAAA;QACAc,YAAcL,EAAAA;AAChB,KAAA;AACF;;;;"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { useNotification, useFetchClient } from '@strapi/admin/strapi-admin';
|
|
2
2
|
import { useIntl } from 'react-intl';
|
|
3
3
|
import { useQuery, useMutation } from 'react-query';
|
|
4
4
|
import { pluginId } from '../pluginId.mjs';
|
|
5
|
+
import { useTracking } from './useTracking.mjs';
|
|
5
6
|
|
|
6
7
|
const endpoint = `/${pluginId}/configuration`;
|
|
7
8
|
const queryKey = [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useConfig.mjs","sources":["../../../admin/src/hooks/useConfig.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"useConfig.mjs","sources":["../../../admin/src/hooks/useConfig.ts"],"sourcesContent":["import { useNotification, useFetchClient } from '@strapi/admin/strapi-admin';\nimport { useIntl } from 'react-intl';\nimport { useMutation, useQuery, UseMutationResult, UseQueryResult } from 'react-query';\n\nimport { GetConfiguration, UpdateConfiguration } from '../../../shared/contracts/configuration';\nimport { pluginId } from '../pluginId';\n\nimport { useTracking } from './useTracking';\n\nconst endpoint = `/${pluginId}/configuration`;\nconst queryKey = [pluginId, 'configuration'];\n\nexport const useConfig = () => {\n const { trackUsage } = useTracking();\n const { formatMessage } = useIntl();\n const { toggleNotification } = useNotification();\n const { get, put } = useFetchClient();\n\n const config: UseQueryResult<\n GetConfiguration.Response['data']['data'] | GetConfiguration.Response['error']\n > = useQuery(\n queryKey,\n async () => {\n const res: GetConfiguration.Response = await get(endpoint);\n\n return res.data.data;\n },\n {\n onError() {\n return toggleNotification({\n type: 'danger',\n message: formatMessage({ id: 'notification.error' }),\n });\n },\n /**\n * We're cementing that we always expect an object to be returned.\n */\n select: (data) => data || {},\n }\n );\n\n const putMutation: UseMutationResult<\n void,\n UpdateConfiguration.Response['error'],\n UpdateConfiguration.Request['body']\n > = useMutation(\n async (body) => {\n await put<UpdateConfiguration.Response>(endpoint, body);\n },\n {\n onSuccess() {\n trackUsage('didEditMediaLibraryConfig');\n config.refetch();\n },\n onError() {\n return toggleNotification({\n type: 'danger',\n message: formatMessage({ id: 'notification.error' }),\n });\n },\n }\n );\n\n return {\n config,\n mutateConfig: putMutation,\n };\n};\n"],"names":["endpoint","pluginId","queryKey","useConfig","trackUsage","useTracking","formatMessage","useIntl","toggleNotification","useNotification","get","put","useFetchClient","config","useQuery","res","data","onError","type","message","id","select","putMutation","useMutation","body","onSuccess","refetch","mutateConfig"],"mappings":";;;;;;AASA,MAAMA,WAAW,CAAC,CAAC,EAAEC,QAAAA,CAAS,cAAc,CAAC;AAC7C,MAAMC,QAAW,GAAA;AAACD,IAAAA,QAAAA;AAAU,IAAA;AAAgB,CAAA;MAE/BE,SAAY,GAAA,IAAA;IACvB,MAAM,EAAEC,UAAU,EAAE,GAAGC,WAAAA,EAAAA;IACvB,MAAM,EAAEC,aAAa,EAAE,GAAGC,OAAAA,EAAAA;IAC1B,MAAM,EAAEC,kBAAkB,EAAE,GAAGC,eAAAA,EAAAA;AAC/B,IAAA,MAAM,EAAEC,GAAG,EAAEC,GAAG,EAAE,GAAGC,cAAAA,EAAAA;IAErB,MAAMC,MAAAA,GAEFC,SACFZ,QACA,EAAA,UAAA;QACE,MAAMa,GAAAA,GAAiC,MAAML,GAAIV,CAAAA,QAAAA,CAAAA;QAEjD,OAAOe,GAAAA,CAAIC,IAAI,CAACA,IAAI;KAEtB,EAAA;AACEC,QAAAA,OAAAA,CAAAA,GAAAA;AACE,YAAA,OAAOT,kBAAmB,CAAA;gBACxBU,IAAM,EAAA,QAAA;AACNC,gBAAAA,OAAAA,EAASb,aAAc,CAAA;oBAAEc,EAAI,EAAA;AAAqB,iBAAA;AACpD,aAAA,CAAA;AACF,SAAA;AACA;;AAEC,UACDC,MAAQ,EAAA,CAACL,IAASA,GAAAA,IAAAA,IAAQ;AAC5B,KAAA,CAAA;IAGF,MAAMM,WAAAA,GAIFC,YACF,OAAOC,IAAAA,GAAAA;AACL,QAAA,MAAMb,IAAkCX,QAAUwB,EAAAA,IAAAA,CAAAA;KAEpD,EAAA;AACEC,QAAAA,SAAAA,CAAAA,GAAAA;YACErB,UAAW,CAAA,2BAAA,CAAA;AACXS,YAAAA,MAAAA,CAAOa,OAAO,EAAA;AAChB,SAAA;AACAT,QAAAA,OAAAA,CAAAA,GAAAA;AACE,YAAA,OAAOT,kBAAmB,CAAA;gBACxBU,IAAM,EAAA,QAAA;AACNC,gBAAAA,OAAAA,EAASb,aAAc,CAAA;oBAAEc,EAAI,EAAA;AAAqB,iBAAA;AACpD,aAAA,CAAA;AACF;AACF,KAAA,CAAA;IAGF,OAAO;AACLP,QAAAA,MAAAA;QACAc,YAAcL,EAAAA;AAChB,KAAA;AACF;;;;"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var React = require('react');
|
|
4
|
-
var strapiAdmin = require('@strapi/admin/strapi-admin');
|
|
5
4
|
var qs = require('qs');
|
|
6
5
|
var useConfig = require('./useConfig.js');
|
|
6
|
+
var useTracking = require('./useTracking.js');
|
|
7
7
|
|
|
8
8
|
function _interopNamespaceDefault(e) {
|
|
9
9
|
var n = Object.create(null);
|
|
@@ -25,7 +25,7 @@ function _interopNamespaceDefault(e) {
|
|
|
25
25
|
var React__namespace = /*#__PURE__*/_interopNamespaceDefault(React);
|
|
26
26
|
|
|
27
27
|
const useModalQueryParams = (initialState)=>{
|
|
28
|
-
const { trackUsage } =
|
|
28
|
+
const { trackUsage } = useTracking.useTracking();
|
|
29
29
|
const { config: { data: config } } = useConfig.useConfig();
|
|
30
30
|
const [queryObject, setQueryObject] = React__namespace.useState({
|
|
31
31
|
page: 1,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useModalQueryParams.js","sources":["../../../admin/src/hooks/useModalQueryParams.ts"],"sourcesContent":["import * as React from 'react';\n\nimport {
|
|
1
|
+
{"version":3,"file":"useModalQueryParams.js","sources":["../../../admin/src/hooks/useModalQueryParams.ts"],"sourcesContent":["import * as React from 'react';\n\nimport { stringify } from 'qs';\n\nimport { useConfig } from './useConfig';\nimport { useTracking } from './useTracking';\n\nimport type { Query, FilterCondition } from '../../../shared/contracts/files';\n\nexport const useModalQueryParams = (initialState?: Partial<Query>) => {\n const { trackUsage } = useTracking();\n const {\n config: { data: config },\n } = useConfig();\n\n const [queryObject, setQueryObject] = React.useState<Query>({\n page: 1,\n sort: 'updatedAt:DESC',\n pageSize: 10,\n filters: {\n $and: [],\n },\n ...initialState,\n });\n\n React.useEffect(() => {\n if (config && 'sort' in config && 'pageSize' in config) {\n setQueryObject((prevQuery) => ({\n ...prevQuery,\n sort: config.sort,\n pageSize: config.pageSize,\n }));\n }\n }, [config]);\n\n const handleChangeFilters = (nextFilters: FilterCondition<string>[]) => {\n if (nextFilters) {\n trackUsage('didFilterMediaLibraryElements', {\n location: 'content-manager',\n filter: Object.keys(nextFilters[nextFilters.length - 1])[0],\n });\n setQueryObject((prev) => ({ ...prev, page: 1, filters: { $and: nextFilters } }));\n }\n };\n\n const handleChangePageSize = (pageSize: Query['pageSize']) => {\n setQueryObject((prev) => ({\n ...prev,\n pageSize: typeof pageSize === 'string' ? parseInt(pageSize, 10) : pageSize,\n page: 1,\n }));\n };\n\n const handeChangePage = (page: Query['page']) => {\n setQueryObject((prev) => ({ ...prev, page }));\n };\n\n const handleChangeSort = (sort: Query['sort']) => {\n if (sort) {\n trackUsage('didSortMediaLibraryElements', {\n location: 'content-manager',\n sort,\n });\n setQueryObject((prev) => ({ ...prev, sort }));\n }\n };\n\n const handleChangeSearch = (_q: Query['_q'] | null) => {\n if (_q) {\n setQueryObject((prev) => ({ ...prev, _q, page: 1 }));\n } else {\n const newState: Query = { page: 1 };\n\n Object.keys(queryObject).forEach((key) => {\n if (!['page', '_q'].includes(key)) {\n (newState as Record<string, string | number | undefined>)[key] = (\n queryObject as Record<string, string | number | undefined>\n )[key];\n }\n });\n\n setQueryObject(newState);\n }\n };\n\n const handleChangeFolder = (folder: Query['folder'], folderPath: Query['folderPath']) => {\n setQueryObject((prev) => ({ ...prev, folder: folder ?? null, folderPath }));\n };\n\n return [\n { queryObject, rawQuery: stringify(queryObject, { encode: false }) },\n {\n onChangeFilters: handleChangeFilters,\n onChangeFolder: handleChangeFolder,\n onChangePage: handeChangePage,\n onChangePageSize: handleChangePageSize,\n onChangeSort: handleChangeSort,\n onChangeSearch: handleChangeSearch,\n },\n ];\n};\n"],"names":["useModalQueryParams","initialState","trackUsage","useTracking","config","data","useConfig","queryObject","setQueryObject","React","useState","page","sort","pageSize","filters","$and","useEffect","prevQuery","handleChangeFilters","nextFilters","location","filter","Object","keys","length","prev","handleChangePageSize","parseInt","handeChangePage","handleChangeSort","handleChangeSearch","_q","newState","forEach","key","includes","handleChangeFolder","folder","folderPath","rawQuery","stringify","encode","onChangeFilters","onChangeFolder","onChangePage","onChangePageSize","onChangeSort","onChangeSearch"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
|
-
import { useTracking } from '@strapi/admin/strapi-admin';
|
|
3
2
|
import { stringify } from 'qs';
|
|
4
3
|
import { useConfig } from './useConfig.mjs';
|
|
4
|
+
import { useTracking } from './useTracking.mjs';
|
|
5
5
|
|
|
6
6
|
const useModalQueryParams = (initialState)=>{
|
|
7
7
|
const { trackUsage } = useTracking();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useModalQueryParams.mjs","sources":["../../../admin/src/hooks/useModalQueryParams.ts"],"sourcesContent":["import * as React from 'react';\n\nimport {
|
|
1
|
+
{"version":3,"file":"useModalQueryParams.mjs","sources":["../../../admin/src/hooks/useModalQueryParams.ts"],"sourcesContent":["import * as React from 'react';\n\nimport { stringify } from 'qs';\n\nimport { useConfig } from './useConfig';\nimport { useTracking } from './useTracking';\n\nimport type { Query, FilterCondition } from '../../../shared/contracts/files';\n\nexport const useModalQueryParams = (initialState?: Partial<Query>) => {\n const { trackUsage } = useTracking();\n const {\n config: { data: config },\n } = useConfig();\n\n const [queryObject, setQueryObject] = React.useState<Query>({\n page: 1,\n sort: 'updatedAt:DESC',\n pageSize: 10,\n filters: {\n $and: [],\n },\n ...initialState,\n });\n\n React.useEffect(() => {\n if (config && 'sort' in config && 'pageSize' in config) {\n setQueryObject((prevQuery) => ({\n ...prevQuery,\n sort: config.sort,\n pageSize: config.pageSize,\n }));\n }\n }, [config]);\n\n const handleChangeFilters = (nextFilters: FilterCondition<string>[]) => {\n if (nextFilters) {\n trackUsage('didFilterMediaLibraryElements', {\n location: 'content-manager',\n filter: Object.keys(nextFilters[nextFilters.length - 1])[0],\n });\n setQueryObject((prev) => ({ ...prev, page: 1, filters: { $and: nextFilters } }));\n }\n };\n\n const handleChangePageSize = (pageSize: Query['pageSize']) => {\n setQueryObject((prev) => ({\n ...prev,\n pageSize: typeof pageSize === 'string' ? parseInt(pageSize, 10) : pageSize,\n page: 1,\n }));\n };\n\n const handeChangePage = (page: Query['page']) => {\n setQueryObject((prev) => ({ ...prev, page }));\n };\n\n const handleChangeSort = (sort: Query['sort']) => {\n if (sort) {\n trackUsage('didSortMediaLibraryElements', {\n location: 'content-manager',\n sort,\n });\n setQueryObject((prev) => ({ ...prev, sort }));\n }\n };\n\n const handleChangeSearch = (_q: Query['_q'] | null) => {\n if (_q) {\n setQueryObject((prev) => ({ ...prev, _q, page: 1 }));\n } else {\n const newState: Query = { page: 1 };\n\n Object.keys(queryObject).forEach((key) => {\n if (!['page', '_q'].includes(key)) {\n (newState as Record<string, string | number | undefined>)[key] = (\n queryObject as Record<string, string | number | undefined>\n )[key];\n }\n });\n\n setQueryObject(newState);\n }\n };\n\n const handleChangeFolder = (folder: Query['folder'], folderPath: Query['folderPath']) => {\n setQueryObject((prev) => ({ ...prev, folder: folder ?? null, folderPath }));\n };\n\n return [\n { queryObject, rawQuery: stringify(queryObject, { encode: false }) },\n {\n onChangeFilters: handleChangeFilters,\n onChangeFolder: handleChangeFolder,\n onChangePage: handeChangePage,\n onChangePageSize: handleChangePageSize,\n onChangeSort: handleChangeSort,\n onChangeSearch: handleChangeSearch,\n },\n ];\n};\n"],"names":["useModalQueryParams","initialState","trackUsage","useTracking","config","data","useConfig","queryObject","setQueryObject","React","useState","page","sort","pageSize","filters","$and","useEffect","prevQuery","handleChangeFilters","nextFilters","location","filter","Object","keys","length","prev","handleChangePageSize","parseInt","handeChangePage","handleChangeSort","handleChangeSearch","_q","newState","forEach","key","includes","handleChangeFolder","folder","folderPath","rawQuery","stringify","encode","onChangeFilters","onChangeFolder","onChangePage","onChangePageSize","onChangeSort","onChangeSearch"],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var strapiAdmin = require('@strapi/admin/strapi-admin');
|
|
4
|
+
var useSettings = require('./useSettings.js');
|
|
5
|
+
|
|
6
|
+
const useTracking = ()=>{
|
|
7
|
+
const { trackUsage: trackStrapiUsage } = strapiAdmin.useTracking();
|
|
8
|
+
const { data } = useSettings.useSettings();
|
|
9
|
+
const trackUsage = (event, properties)=>{
|
|
10
|
+
return trackStrapiUsage(event, {
|
|
11
|
+
...properties,
|
|
12
|
+
isAIMediaLibraryConfigured: data?.aiMetadata
|
|
13
|
+
});
|
|
14
|
+
};
|
|
15
|
+
return {
|
|
16
|
+
trackUsage
|
|
17
|
+
};
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
exports.useTracking = useTracking;
|
|
21
|
+
//# sourceMappingURL=useTracking.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useTracking.js","sources":["../../../admin/src/hooks/useTracking.ts"],"sourcesContent":["import { useTracking as useStrapiTracking, TrackingEvent } from '@strapi/admin/strapi-admin';\n\nimport { useSettings } from '../hooks/useSettings';\n\nexport const useTracking = () => {\n const { trackUsage: trackStrapiUsage } = useStrapiTracking();\n const { data } = useSettings();\n\n const trackUsage = <TEvent extends TrackingEvent>(\n event: TEvent['name'],\n properties?: TEvent['properties']\n ) => {\n return trackStrapiUsage(event, {\n ...properties,\n isAIMediaLibraryConfigured: data?.aiMetadata,\n } as TEvent['properties']);\n };\n\n return { trackUsage };\n};\n"],"names":["useTracking","trackUsage","trackStrapiUsage","useStrapiTracking","data","useSettings","event","properties","isAIMediaLibraryConfigured","aiMetadata"],"mappings":";;;;;MAIaA,WAAc,GAAA,IAAA;AACzB,IAAA,MAAM,EAAEC,UAAAA,EAAYC,gBAAgB,EAAE,GAAGC,uBAAAA,EAAAA;IACzC,MAAM,EAAEC,IAAI,EAAE,GAAGC,uBAAAA,EAAAA;IAEjB,MAAMJ,UAAAA,GAAa,CACjBK,KACAC,EAAAA,UAAAA,GAAAA;AAEA,QAAA,OAAOL,iBAAiBI,KAAO,EAAA;AAC7B,YAAA,GAAGC,UAAU;AACbC,YAAAA,0BAAAA,EAA4BJ,IAAMK,EAAAA;AACpC,SAAA,CAAA;AACF,KAAA;IAEA,OAAO;AAAER,QAAAA;AAAW,KAAA;AACtB;;;;"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { useTracking as useTracking$1 } from '@strapi/admin/strapi-admin';
|
|
2
|
+
import { useSettings } from './useSettings.mjs';
|
|
3
|
+
|
|
4
|
+
const useTracking = ()=>{
|
|
5
|
+
const { trackUsage: trackStrapiUsage } = useTracking$1();
|
|
6
|
+
const { data } = useSettings();
|
|
7
|
+
const trackUsage = (event, properties)=>{
|
|
8
|
+
return trackStrapiUsage(event, {
|
|
9
|
+
...properties,
|
|
10
|
+
isAIMediaLibraryConfigured: data?.aiMetadata
|
|
11
|
+
});
|
|
12
|
+
};
|
|
13
|
+
return {
|
|
14
|
+
trackUsage
|
|
15
|
+
};
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
export { useTracking };
|
|
19
|
+
//# sourceMappingURL=useTracking.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useTracking.mjs","sources":["../../../admin/src/hooks/useTracking.ts"],"sourcesContent":["import { useTracking as useStrapiTracking, TrackingEvent } from '@strapi/admin/strapi-admin';\n\nimport { useSettings } from '../hooks/useSettings';\n\nexport const useTracking = () => {\n const { trackUsage: trackStrapiUsage } = useStrapiTracking();\n const { data } = useSettings();\n\n const trackUsage = <TEvent extends TrackingEvent>(\n event: TEvent['name'],\n properties?: TEvent['properties']\n ) => {\n return trackStrapiUsage(event, {\n ...properties,\n isAIMediaLibraryConfigured: data?.aiMetadata,\n } as TEvent['properties']);\n };\n\n return { trackUsage };\n};\n"],"names":["useTracking","trackUsage","trackStrapiUsage","useStrapiTracking","data","useSettings","event","properties","isAIMediaLibraryConfigured","aiMetadata"],"mappings":";;;MAIaA,WAAc,GAAA,IAAA;AACzB,IAAA,MAAM,EAAEC,UAAAA,EAAYC,gBAAgB,EAAE,GAAGC,aAAAA,EAAAA;IACzC,MAAM,EAAEC,IAAI,EAAE,GAAGC,WAAAA,EAAAA;IAEjB,MAAMJ,UAAAA,GAAa,CACjBK,KACAC,EAAAA,UAAAA,GAAAA;AAEA,QAAA,OAAOL,iBAAiBI,KAAO,EAAA;AAC7B,YAAA,GAAGC,UAAU;AACbC,YAAAA,0BAAAA,EAA4BJ,IAAMK,EAAAA;AACpC,SAAA,CAAA;AACF,KAAA;IAEA,OAAO;AAAER,QAAAA;AAAW,KAAA;AACtB;;;;"}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
4
|
|
|
5
5
|
var name = "@strapi/upload";
|
|
6
|
-
var version = "5.
|
|
6
|
+
var version = "5.30.0";
|
|
7
7
|
var description = "Makes it easy to upload images and files to your Strapi Application.";
|
|
8
8
|
var license = "SEE LICENSE IN LICENSE";
|
|
9
9
|
var author = {
|
|
@@ -67,8 +67,8 @@ var dependencies = {
|
|
|
67
67
|
"@reduxjs/toolkit": "1.9.7",
|
|
68
68
|
"@strapi/design-system": "2.0.0-rc.30",
|
|
69
69
|
"@strapi/icons": "2.0.0-rc.30",
|
|
70
|
-
"@strapi/provider-upload-local": "5.
|
|
71
|
-
"@strapi/utils": "5.
|
|
70
|
+
"@strapi/provider-upload-local": "5.30.0",
|
|
71
|
+
"@strapi/utils": "5.30.0",
|
|
72
72
|
"byte-size": "8.1.1",
|
|
73
73
|
cropperjs: "1.6.1",
|
|
74
74
|
"date-fns": "2.30.0",
|
|
@@ -91,8 +91,8 @@ var dependencies = {
|
|
|
91
91
|
zod: "3.25.67"
|
|
92
92
|
};
|
|
93
93
|
var devDependencies = {
|
|
94
|
-
"@strapi/admin": "5.
|
|
95
|
-
"@strapi/types": "5.
|
|
94
|
+
"@strapi/admin": "5.30.0",
|
|
95
|
+
"@strapi/types": "5.30.0",
|
|
96
96
|
"@testing-library/dom": "10.1.0",
|
|
97
97
|
"@testing-library/react": "15.0.7",
|
|
98
98
|
"@testing-library/user-event": "14.5.2",
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
var name = "@strapi/upload";
|
|
2
|
-
var version = "5.
|
|
2
|
+
var version = "5.30.0";
|
|
3
3
|
var description = "Makes it easy to upload images and files to your Strapi Application.";
|
|
4
4
|
var license = "SEE LICENSE IN LICENSE";
|
|
5
5
|
var author = {
|
|
@@ -63,8 +63,8 @@ var dependencies = {
|
|
|
63
63
|
"@reduxjs/toolkit": "1.9.7",
|
|
64
64
|
"@strapi/design-system": "2.0.0-rc.30",
|
|
65
65
|
"@strapi/icons": "2.0.0-rc.30",
|
|
66
|
-
"@strapi/provider-upload-local": "5.
|
|
67
|
-
"@strapi/utils": "5.
|
|
66
|
+
"@strapi/provider-upload-local": "5.30.0",
|
|
67
|
+
"@strapi/utils": "5.30.0",
|
|
68
68
|
"byte-size": "8.1.1",
|
|
69
69
|
cropperjs: "1.6.1",
|
|
70
70
|
"date-fns": "2.30.0",
|
|
@@ -87,8 +87,8 @@ var dependencies = {
|
|
|
87
87
|
zod: "3.25.67"
|
|
88
88
|
};
|
|
89
89
|
var devDependencies = {
|
|
90
|
-
"@strapi/admin": "5.
|
|
91
|
-
"@strapi/types": "5.
|
|
90
|
+
"@strapi/admin": "5.30.0",
|
|
91
|
+
"@strapi/types": "5.30.0",
|
|
92
92
|
"@testing-library/dom": "10.1.0",
|
|
93
93
|
"@testing-library/react": "15.0.7",
|
|
94
94
|
"@testing-library/user-event": "14.5.2",
|
|
@@ -8,6 +8,7 @@ var icons = require('@strapi/icons');
|
|
|
8
8
|
var reactIntl = require('react-intl');
|
|
9
9
|
var FilterList = require('../../../../components/FilterList/FilterList.js');
|
|
10
10
|
var FilterPopover = require('../../../../components/FilterPopover/FilterPopover.js');
|
|
11
|
+
var useTracking = require('../../../../hooks/useTracking.js');
|
|
11
12
|
var displayedFilters = require('../../../../utils/displayedFilters.js');
|
|
12
13
|
require('byte-size');
|
|
13
14
|
require('date-fns');
|
|
@@ -37,7 +38,7 @@ var React__namespace = /*#__PURE__*/_interopNamespaceDefault(React);
|
|
|
37
38
|
const Filters = ()=>{
|
|
38
39
|
const [open, setOpen] = React__namespace.useState(false);
|
|
39
40
|
const { formatMessage } = reactIntl.useIntl();
|
|
40
|
-
const { trackUsage } =
|
|
41
|
+
const { trackUsage } = useTracking.useTracking();
|
|
41
42
|
const [{ query }, setQuery] = strapiAdmin.useQueryParams();
|
|
42
43
|
const filters = query?.filters?.$and || [];
|
|
43
44
|
const handleRemoveFilter = (nextFilters)=>{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Filters.js","sources":["../../../../../../admin/src/pages/App/MediaLibrary/components/Filters.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {
|
|
1
|
+
{"version":3,"file":"Filters.js","sources":["../../../../../../admin/src/pages/App/MediaLibrary/components/Filters.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { useQueryParams } from '@strapi/admin/strapi-admin';\nimport { Button, Popover } from '@strapi/design-system';\nimport { Filter } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\n\nimport { FilterList } from '../../../../components/FilterList/FilterList';\nimport { FilterPopover } from '../../../../components/FilterPopover/FilterPopover';\nimport { useTracking } from '../../../../hooks/useTracking';\nimport { displayedFilters } from '../../../../utils';\n\nimport type { Query } from '../../../../../../shared/contracts/files';\nimport type { FilterListProps } from '../../../../components/FilterList/FilterList';\nimport type { FilterPopoverProps } from '../../../../components/FilterPopover/FilterPopover';\n\nexport const Filters = () => {\n const [open, setOpen] = React.useState(false);\n const { formatMessage } = useIntl();\n const { trackUsage } = useTracking();\n const [{ query }, setQuery] = useQueryParams<Query>();\n const filters = query?.filters?.$and || [];\n\n const handleRemoveFilter: FilterListProps['onRemoveFilter'] = (nextFilters) => {\n setQuery({ filters: { $and: nextFilters }, page: 1 } as Query);\n };\n\n const handleSubmit: FilterPopoverProps['onSubmit'] = (filters) => {\n trackUsage('didFilterMediaLibraryElements', {\n location: 'content-manager',\n filter: Object.keys(filters[filters.length - 1])[0],\n });\n setQuery({ filters: { $and: filters }, page: 1 } as Query);\n };\n\n return (\n <Popover.Root open={open} onOpenChange={setOpen}>\n <Popover.Trigger>\n <Button variant=\"tertiary\" startIcon={<Filter />} size=\"S\">\n {formatMessage({ id: 'app.utils.filters', defaultMessage: 'Filters' })}\n </Button>\n </Popover.Trigger>\n <FilterPopover\n displayedFilters={displayedFilters}\n filters={filters}\n onSubmit={handleSubmit}\n onToggle={setOpen as FilterPopoverProps['onToggle']}\n />\n <FilterList\n appliedFilters={filters as FilterListProps['appliedFilters']}\n filtersSchema={displayedFilters}\n onRemoveFilter={handleRemoveFilter}\n />\n </Popover.Root>\n );\n};\n"],"names":["Filters","open","setOpen","React","useState","formatMessage","useIntl","trackUsage","useTracking","query","setQuery","useQueryParams","filters","$and","handleRemoveFilter","nextFilters","page","handleSubmit","location","filter","Object","keys","length","_jsxs","Popover","Root","onOpenChange","_jsx","Trigger","Button","variant","startIcon","Filter","size","id","defaultMessage","FilterPopover","displayedFilters","onSubmit","onToggle","FilterList","appliedFilters","filtersSchema","onRemoveFilter"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAgBaA,OAAU,GAAA,IAAA;AACrB,IAAA,MAAM,CAACC,IAAMC,EAAAA,OAAAA,CAAQ,GAAGC,gBAAAA,CAAMC,QAAQ,CAAC,KAAA,CAAA;IACvC,MAAM,EAAEC,aAAa,EAAE,GAAGC,iBAAAA,EAAAA;IAC1B,MAAM,EAAEC,UAAU,EAAE,GAAGC,uBAAAA,EAAAA;AACvB,IAAA,MAAM,CAAC,EAAEC,KAAK,EAAE,EAAEC,SAAS,GAAGC,0BAAAA,EAAAA;AAC9B,IAAA,MAAMC,OAAUH,GAAAA,KAAAA,EAAOG,OAASC,EAAAA,IAAAA,IAAQ,EAAE;AAE1C,IAAA,MAAMC,qBAAwD,CAACC,WAAAA,GAAAA;QAC7DL,QAAS,CAAA;YAAEE,OAAS,EAAA;gBAAEC,IAAME,EAAAA;AAAY,aAAA;YAAGC,IAAM,EAAA;AAAE,SAAA,CAAA;AACrD,KAAA;AAEA,IAAA,MAAMC,eAA+C,CAACL,OAAAA,GAAAA;AACpDL,QAAAA,UAAAA,CAAW,+BAAiC,EAAA;YAC1CW,QAAU,EAAA,iBAAA;YACVC,MAAQC,EAAAA,MAAAA,CAAOC,IAAI,CAACT,OAAO,CAACA,OAAQU,CAAAA,MAAM,GAAG,CAAA,CAAE,CAAC,CAAC,CAAE;AACrD,SAAA,CAAA;QACAZ,QAAS,CAAA;YAAEE,OAAS,EAAA;gBAAEC,IAAMD,EAAAA;AAAQ,aAAA;YAAGI,IAAM,EAAA;AAAE,SAAA,CAAA;AACjD,KAAA;IAEA,qBACEO,eAAA,CAACC,qBAAQC,IAAI,EAAA;QAACxB,IAAMA,EAAAA,IAAAA;QAAMyB,YAAcxB,EAAAA,OAAAA;;AACtC,0BAAAyB,cAAA,CAACH,qBAAQI,OAAO,EAAA;AACd,gBAAA,QAAA,gBAAAD,cAACE,CAAAA,mBAAAA,EAAAA;oBAAOC,OAAQ,EAAA,UAAA;AAAWC,oBAAAA,SAAAA,gBAAWJ,cAACK,CAAAA,YAAAA,EAAAA,EAAAA,CAAAA;oBAAWC,IAAK,EAAA,GAAA;8BACpD5B,aAAc,CAAA;wBAAE6B,EAAI,EAAA,mBAAA;wBAAqBC,cAAgB,EAAA;AAAU,qBAAA;;;0BAGxER,cAACS,CAAAA,2BAAAA,EAAAA;gBACCC,gBAAkBA,EAAAA,iCAAAA;gBAClBzB,OAASA,EAAAA,OAAAA;gBACT0B,QAAUrB,EAAAA,YAAAA;gBACVsB,QAAUrC,EAAAA;;0BAEZyB,cAACa,CAAAA,qBAAAA,EAAAA;gBACCC,cAAgB7B,EAAAA,OAAAA;gBAChB8B,aAAeL,EAAAA,iCAAAA;gBACfM,cAAgB7B,EAAAA;;;;AAIxB;;;;"}
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
2
|
import * as React from 'react';
|
|
3
|
-
import {
|
|
3
|
+
import { useQueryParams } from '@strapi/admin/strapi-admin';
|
|
4
4
|
import { Popover, Button } from '@strapi/design-system';
|
|
5
5
|
import { Filter } from '@strapi/icons';
|
|
6
6
|
import { useIntl } from 'react-intl';
|
|
7
7
|
import { FilterList } from '../../../../components/FilterList/FilterList.mjs';
|
|
8
8
|
import { FilterPopover } from '../../../../components/FilterPopover/FilterPopover.mjs';
|
|
9
|
+
import { useTracking } from '../../../../hooks/useTracking.mjs';
|
|
9
10
|
import { displayedFilters } from '../../../../utils/displayedFilters.mjs';
|
|
10
11
|
import 'byte-size';
|
|
11
12
|
import 'date-fns';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Filters.mjs","sources":["../../../../../../admin/src/pages/App/MediaLibrary/components/Filters.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {
|
|
1
|
+
{"version":3,"file":"Filters.mjs","sources":["../../../../../../admin/src/pages/App/MediaLibrary/components/Filters.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { useQueryParams } from '@strapi/admin/strapi-admin';\nimport { Button, Popover } from '@strapi/design-system';\nimport { Filter } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\n\nimport { FilterList } from '../../../../components/FilterList/FilterList';\nimport { FilterPopover } from '../../../../components/FilterPopover/FilterPopover';\nimport { useTracking } from '../../../../hooks/useTracking';\nimport { displayedFilters } from '../../../../utils';\n\nimport type { Query } from '../../../../../../shared/contracts/files';\nimport type { FilterListProps } from '../../../../components/FilterList/FilterList';\nimport type { FilterPopoverProps } from '../../../../components/FilterPopover/FilterPopover';\n\nexport const Filters = () => {\n const [open, setOpen] = React.useState(false);\n const { formatMessage } = useIntl();\n const { trackUsage } = useTracking();\n const [{ query }, setQuery] = useQueryParams<Query>();\n const filters = query?.filters?.$and || [];\n\n const handleRemoveFilter: FilterListProps['onRemoveFilter'] = (nextFilters) => {\n setQuery({ filters: { $and: nextFilters }, page: 1 } as Query);\n };\n\n const handleSubmit: FilterPopoverProps['onSubmit'] = (filters) => {\n trackUsage('didFilterMediaLibraryElements', {\n location: 'content-manager',\n filter: Object.keys(filters[filters.length - 1])[0],\n });\n setQuery({ filters: { $and: filters }, page: 1 } as Query);\n };\n\n return (\n <Popover.Root open={open} onOpenChange={setOpen}>\n <Popover.Trigger>\n <Button variant=\"tertiary\" startIcon={<Filter />} size=\"S\">\n {formatMessage({ id: 'app.utils.filters', defaultMessage: 'Filters' })}\n </Button>\n </Popover.Trigger>\n <FilterPopover\n displayedFilters={displayedFilters}\n filters={filters}\n onSubmit={handleSubmit}\n onToggle={setOpen as FilterPopoverProps['onToggle']}\n />\n <FilterList\n appliedFilters={filters as FilterListProps['appliedFilters']}\n filtersSchema={displayedFilters}\n onRemoveFilter={handleRemoveFilter}\n />\n </Popover.Root>\n );\n};\n"],"names":["Filters","open","setOpen","React","useState","formatMessage","useIntl","trackUsage","useTracking","query","setQuery","useQueryParams","filters","$and","handleRemoveFilter","nextFilters","page","handleSubmit","location","filter","Object","keys","length","_jsxs","Popover","Root","onOpenChange","_jsx","Trigger","Button","variant","startIcon","Filter","size","id","defaultMessage","FilterPopover","displayedFilters","onSubmit","onToggle","FilterList","appliedFilters","filtersSchema","onRemoveFilter"],"mappings":";;;;;;;;;;;;;;;;MAgBaA,OAAU,GAAA,IAAA;AACrB,IAAA,MAAM,CAACC,IAAMC,EAAAA,OAAAA,CAAQ,GAAGC,KAAAA,CAAMC,QAAQ,CAAC,KAAA,CAAA;IACvC,MAAM,EAAEC,aAAa,EAAE,GAAGC,OAAAA,EAAAA;IAC1B,MAAM,EAAEC,UAAU,EAAE,GAAGC,WAAAA,EAAAA;AACvB,IAAA,MAAM,CAAC,EAAEC,KAAK,EAAE,EAAEC,SAAS,GAAGC,cAAAA,EAAAA;AAC9B,IAAA,MAAMC,OAAUH,GAAAA,KAAAA,EAAOG,OAASC,EAAAA,IAAAA,IAAQ,EAAE;AAE1C,IAAA,MAAMC,qBAAwD,CAACC,WAAAA,GAAAA;QAC7DL,QAAS,CAAA;YAAEE,OAAS,EAAA;gBAAEC,IAAME,EAAAA;AAAY,aAAA;YAAGC,IAAM,EAAA;AAAE,SAAA,CAAA;AACrD,KAAA;AAEA,IAAA,MAAMC,eAA+C,CAACL,OAAAA,GAAAA;AACpDL,QAAAA,UAAAA,CAAW,+BAAiC,EAAA;YAC1CW,QAAU,EAAA,iBAAA;YACVC,MAAQC,EAAAA,MAAAA,CAAOC,IAAI,CAACT,OAAO,CAACA,OAAQU,CAAAA,MAAM,GAAG,CAAA,CAAE,CAAC,CAAC,CAAE;AACrD,SAAA,CAAA;QACAZ,QAAS,CAAA;YAAEE,OAAS,EAAA;gBAAEC,IAAMD,EAAAA;AAAQ,aAAA;YAAGI,IAAM,EAAA;AAAE,SAAA,CAAA;AACjD,KAAA;IAEA,qBACEO,IAAA,CAACC,QAAQC,IAAI,EAAA;QAACxB,IAAMA,EAAAA,IAAAA;QAAMyB,YAAcxB,EAAAA,OAAAA;;AACtC,0BAAAyB,GAAA,CAACH,QAAQI,OAAO,EAAA;AACd,gBAAA,QAAA,gBAAAD,GAACE,CAAAA,MAAAA,EAAAA;oBAAOC,OAAQ,EAAA,UAAA;AAAWC,oBAAAA,SAAAA,gBAAWJ,GAACK,CAAAA,MAAAA,EAAAA,EAAAA,CAAAA;oBAAWC,IAAK,EAAA,GAAA;8BACpD5B,aAAc,CAAA;wBAAE6B,EAAI,EAAA,mBAAA;wBAAqBC,cAAgB,EAAA;AAAU,qBAAA;;;0BAGxER,GAACS,CAAAA,aAAAA,EAAAA;gBACCC,gBAAkBA,EAAAA,gBAAAA;gBAClBzB,OAASA,EAAAA,OAAAA;gBACT0B,QAAUrB,EAAAA,YAAAA;gBACVsB,QAAUrC,EAAAA;;0BAEZyB,GAACa,CAAAA,UAAAA,EAAAA;gBACCC,cAAgB7B,EAAAA,OAAAA;gBAChB8B,aAAeL,EAAAA,gBAAAA;gBACfM,cAAgB7B,EAAAA;;;;AAIxB;;;;"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { TrackingEvent } from '@strapi/admin/strapi-admin';
|
|
2
|
+
export declare const useTracking: () => {
|
|
3
|
+
trackUsage: <TEvent extends TrackingEvent>(event: TEvent['name'], properties?: TEvent['properties']) => Promise<import("axios").AxiosResponse<string, any, {}> | null>;
|
|
4
|
+
};
|
|
@@ -24,7 +24,7 @@ var adminFolderFile = {
|
|
|
24
24
|
const deletedFiles = await fileService.deleteByIds(body.fileIds);
|
|
25
25
|
const { folders: deletedFolders, totalFolderNumber, totalFileNumber } = await folderService.deleteByIds(body.folderIds);
|
|
26
26
|
if (deletedFiles.length + deletedFolders.length > 1) {
|
|
27
|
-
|
|
27
|
+
await index.getService('metrics').trackUsage('didBulkDeleteMediaLibraryElements', {
|
|
28
28
|
eventProperties: {
|
|
29
29
|
rootFolderNumber: deletedFolders.length,
|
|
30
30
|
rootAssetNumber: deletedFiles.length,
|
|
@@ -168,7 +168,7 @@ var adminFolderFile = {
|
|
|
168
168
|
}
|
|
169
169
|
}
|
|
170
170
|
});
|
|
171
|
-
|
|
171
|
+
await index.getService('metrics').trackUsage('didBulkMoveMediaLibraryElements', {
|
|
172
172
|
eventProperties: {
|
|
173
173
|
rootFolderNumber: updatedFolders.length,
|
|
174
174
|
rootAssetNumber: updatedFiles.length,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"admin-folder-file.js","sources":["../../../server/src/controllers/admin-folder-file.ts"],"sourcesContent":["import { strings } from '@strapi/utils';\n\nimport type { Context } from 'koa';\n\nimport { getService } from '../utils';\nimport { ACTIONS, FOLDER_MODEL_UID, FILE_MODEL_UID } from '../constants';\nimport {\n validateDeleteManyFoldersFiles,\n validateMoveManyFoldersFiles,\n} from './validation/admin/folder-file';\n\nimport type { File, Folder } from '../types';\n\nexport default {\n async deleteMany(ctx: Context) {\n const { body } = ctx.request;\n const {\n state: { userAbility },\n } = ctx;\n\n const pmFolder = strapi.service('admin::permission').createPermissionsManager({\n ability: ctx.state.userAbility,\n model: FOLDER_MODEL_UID,\n });\n\n const pmFile = strapi.service('admin::permission').createPermissionsManager({\n ability: userAbility,\n action: ACTIONS.read,\n model: FILE_MODEL_UID,\n });\n\n await validateDeleteManyFoldersFiles(body);\n\n const fileService = getService('file');\n const folderService = getService('folder');\n\n const deletedFiles = await fileService.deleteByIds(body.fileIds);\n const {\n folders: deletedFolders,\n totalFolderNumber,\n totalFileNumber,\n } = await folderService.deleteByIds(body.folderIds);\n\n if (deletedFiles.length + deletedFolders.length > 1) {\n strapi.telemetry.send('didBulkDeleteMediaLibraryElements', {\n eventProperties: {\n rootFolderNumber: deletedFolders.length,\n rootAssetNumber: deletedFiles.length,\n totalFolderNumber,\n totalAssetNumber: totalFileNumber + deletedFiles.length,\n },\n });\n }\n\n ctx.body = {\n data: {\n files: await pmFile.sanitizeOutput(deletedFiles),\n folders: await pmFolder.sanitizeOutput(deletedFolders),\n },\n };\n },\n async moveMany(ctx: Context) {\n const { body } = ctx.request;\n const {\n state: { userAbility },\n } = ctx;\n\n const pmFolder = strapi.service('admin::permission').createPermissionsManager({\n ability: ctx.state.userAbility,\n model: FOLDER_MODEL_UID,\n });\n\n const pmFile = strapi.service('admin::permission').createPermissionsManager({\n ability: userAbility,\n action: ACTIONS.read,\n model: FILE_MODEL_UID,\n });\n\n await validateMoveManyFoldersFiles(body);\n const { folderIds = [], fileIds = [], destinationFolderId } = body;\n\n let totalFolderNumber = 0;\n let totalFileNumber = 0;\n\n const trx = await strapi.db.transaction();\n try {\n // fetch folders\n const existingFolders = await strapi.db\n .queryBuilder(FOLDER_MODEL_UID)\n .select(['id', 'pathId', 'path'])\n .where({ id: { $in: folderIds } })\n .transacting(trx.get())\n .forUpdate()\n .execute<Folder[]>();\n\n // fetch files\n const existingFiles = await strapi.db\n .queryBuilder(FILE_MODEL_UID)\n .select(['id'])\n .where({ id: { $in: fileIds } })\n .transacting(trx.get())\n .forUpdate()\n .execute<File[]>();\n\n // fetch destinationFolder path\n let destinationFolderPath = '/';\n if (destinationFolderId !== null) {\n const destinationFolder = await strapi.db\n .queryBuilder(FOLDER_MODEL_UID)\n .select('path')\n .where({ id: destinationFolderId })\n .transacting(trx.get())\n .first()\n .execute<Folder>();\n destinationFolderPath = destinationFolder.path;\n }\n\n const fileTable = strapi.getModel(FILE_MODEL_UID).collectionName;\n const folderTable = strapi.getModel(FOLDER_MODEL_UID).collectionName;\n const folderPathColName =\n // @ts-expect-error - no dynamic typings for the models\n strapi.db.metadata.get(FILE_MODEL_UID).attributes.folderPath.columnName;\n // @ts-expect-error - no dynamic typings for the models\n const pathColName = strapi.db.metadata.get(FOLDER_MODEL_UID).attributes.path.columnName;\n\n if (existingFolders.length > 0) {\n // update folders' parent relation\n // @ts-expect-error - no dynamic typings for the models\n const { joinTable } = strapi.db.metadata.get(FOLDER_MODEL_UID).attributes.parent;\n await strapi.db\n .queryBuilder(joinTable.name)\n .transacting(trx.get())\n .delete()\n .where({ [joinTable.joinColumn.name]: { $in: folderIds } })\n .execute();\n\n if (destinationFolderId !== null) {\n await strapi.db\n .queryBuilder(joinTable.name)\n .transacting(trx.get())\n .insert(\n existingFolders.map((folder) => ({\n [joinTable.inverseJoinColumn.name]: destinationFolderId,\n [joinTable.joinColumn.name]: folder.id,\n }))\n )\n .execute();\n }\n\n for (const existingFolder of existingFolders) {\n let replaceQuery;\n switch (strapi.db.dialect.client) {\n case 'sqlite':\n replaceQuery = '? || SUBSTRING(??, ?)';\n break;\n case 'postgres':\n replaceQuery = 'CONCAT(?::TEXT, SUBSTRING(??, ?::INTEGER))';\n break;\n default:\n replaceQuery = 'CONCAT(?, SUBSTRING(??, ?))';\n }\n\n // update path for folders themselves & folders below\n totalFolderNumber = await strapi.db\n .getConnection(folderTable)\n .transacting(trx.get())\n .where(pathColName, existingFolder.path)\n .orWhere(pathColName, 'like', `${existingFolder.path}/%`)\n .update(\n pathColName,\n strapi.db.connection.raw(replaceQuery, [\n strings.joinBy('/', destinationFolderPath, `${existingFolder.pathId}`),\n pathColName,\n existingFolder.path.length + 1,\n ])\n );\n\n // update path of files below\n totalFileNumber = await strapi.db\n .getConnection(fileTable)\n .transacting(trx.get())\n .where(folderPathColName, existingFolder.path)\n .orWhere(folderPathColName, 'like', `${existingFolder.path}/%`)\n .update(\n folderPathColName,\n strapi.db.connection.raw(replaceQuery, [\n strings.joinBy('/', destinationFolderPath, `${existingFolder.pathId}`),\n folderPathColName,\n existingFolder.path.length + 1,\n ])\n );\n }\n }\n\n if (existingFiles.length > 0) {\n // update files' folder relation (delete + insert; upsert not possible)\n // @ts-expect-error - no dynamic typings for the models\n const fileJoinTable = strapi.db.metadata.get(FILE_MODEL_UID).attributes.folder.joinTable;\n await strapi.db\n .queryBuilder(fileJoinTable.name)\n .transacting(trx.get())\n .delete()\n .where({ [fileJoinTable.joinColumn.name]: { $in: fileIds } })\n .execute();\n\n if (destinationFolderId !== null) {\n await strapi.db\n .queryBuilder(fileJoinTable.name)\n .transacting(trx.get())\n .insert(\n existingFiles.map((file) => ({\n [fileJoinTable.inverseJoinColumn.name]: destinationFolderId,\n [fileJoinTable.joinColumn.name]: file.id,\n }))\n )\n .execute();\n }\n\n // update files main fields (path + updatedBy)\n await strapi.db\n .getConnection(fileTable)\n .transacting(trx.get())\n .whereIn('id', fileIds)\n .update(folderPathColName, destinationFolderPath);\n }\n\n await trx.commit();\n } catch (e) {\n await trx.rollback();\n throw e;\n }\n\n const updatedFolders = await strapi.db.query(FOLDER_MODEL_UID).findMany({\n where: { id: { $in: folderIds } },\n });\n\n const updatedFiles = await strapi.db.query(FILE_MODEL_UID).findMany({\n where: { id: { $in: fileIds } },\n });\n\n strapi.telemetry.send('didBulkMoveMediaLibraryElements', {\n eventProperties: {\n rootFolderNumber: updatedFolders.length,\n rootAssetNumber: updatedFiles.length,\n totalFolderNumber,\n totalAssetNumber: totalFileNumber + updatedFiles.length,\n },\n });\n\n ctx.body = {\n data: {\n files: await pmFile.sanitizeOutput(updatedFiles),\n folders: await pmFolder.sanitizeOutput(updatedFolders),\n },\n };\n },\n};\n"],"names":["deleteMany","ctx","body","request","state","userAbility","pmFolder","strapi","service","createPermissionsManager","ability","model","FOLDER_MODEL_UID","pmFile","action","ACTIONS","read","FILE_MODEL_UID","validateDeleteManyFoldersFiles","fileService","getService","folderService","deletedFiles","deleteByIds","fileIds","folders","deletedFolders","totalFolderNumber","totalFileNumber","folderIds","length","telemetry","send","eventProperties","rootFolderNumber","rootAssetNumber","totalAssetNumber","data","files","sanitizeOutput","moveMany","validateMoveManyFoldersFiles","destinationFolderId","trx","db","transaction","existingFolders","queryBuilder","select","where","id","$in","transacting","get","forUpdate","execute","existingFiles","destinationFolderPath","destinationFolder","first","path","fileTable","getModel","collectionName","folderTable","folderPathColName","metadata","attributes","folderPath","columnName","pathColName","joinTable","parent","name","delete","joinColumn","insert","map","folder","inverseJoinColumn","existingFolder","replaceQuery","dialect","client","getConnection","orWhere","update","connection","raw","strings","joinBy","pathId","fileJoinTable","file","whereIn","commit","e","rollback","updatedFolders","query","findMany","updatedFiles"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"admin-folder-file.js","sources":["../../../server/src/controllers/admin-folder-file.ts"],"sourcesContent":["import { strings } from '@strapi/utils';\n\nimport type { Context } from 'koa';\n\nimport { getService } from '../utils';\nimport { ACTIONS, FOLDER_MODEL_UID, FILE_MODEL_UID } from '../constants';\nimport {\n validateDeleteManyFoldersFiles,\n validateMoveManyFoldersFiles,\n} from './validation/admin/folder-file';\n\nimport type { File, Folder } from '../types';\n\nexport default {\n async deleteMany(ctx: Context) {\n const { body } = ctx.request;\n const {\n state: { userAbility },\n } = ctx;\n\n const pmFolder = strapi.service('admin::permission').createPermissionsManager({\n ability: ctx.state.userAbility,\n model: FOLDER_MODEL_UID,\n });\n\n const pmFile = strapi.service('admin::permission').createPermissionsManager({\n ability: userAbility,\n action: ACTIONS.read,\n model: FILE_MODEL_UID,\n });\n\n await validateDeleteManyFoldersFiles(body);\n\n const fileService = getService('file');\n const folderService = getService('folder');\n\n const deletedFiles = await fileService.deleteByIds(body.fileIds);\n const {\n folders: deletedFolders,\n totalFolderNumber,\n totalFileNumber,\n } = await folderService.deleteByIds(body.folderIds);\n\n if (deletedFiles.length + deletedFolders.length > 1) {\n await getService('metrics').trackUsage('didBulkDeleteMediaLibraryElements', {\n eventProperties: {\n rootFolderNumber: deletedFolders.length,\n rootAssetNumber: deletedFiles.length,\n totalFolderNumber,\n totalAssetNumber: totalFileNumber + deletedFiles.length,\n },\n });\n }\n\n ctx.body = {\n data: {\n files: await pmFile.sanitizeOutput(deletedFiles),\n folders: await pmFolder.sanitizeOutput(deletedFolders),\n },\n };\n },\n async moveMany(ctx: Context) {\n const { body } = ctx.request;\n const {\n state: { userAbility },\n } = ctx;\n\n const pmFolder = strapi.service('admin::permission').createPermissionsManager({\n ability: ctx.state.userAbility,\n model: FOLDER_MODEL_UID,\n });\n\n const pmFile = strapi.service('admin::permission').createPermissionsManager({\n ability: userAbility,\n action: ACTIONS.read,\n model: FILE_MODEL_UID,\n });\n\n await validateMoveManyFoldersFiles(body);\n const { folderIds = [], fileIds = [], destinationFolderId } = body;\n\n let totalFolderNumber = 0;\n let totalFileNumber = 0;\n\n const trx = await strapi.db.transaction();\n try {\n // fetch folders\n const existingFolders = await strapi.db\n .queryBuilder(FOLDER_MODEL_UID)\n .select(['id', 'pathId', 'path'])\n .where({ id: { $in: folderIds } })\n .transacting(trx.get())\n .forUpdate()\n .execute<Folder[]>();\n\n // fetch files\n const existingFiles = await strapi.db\n .queryBuilder(FILE_MODEL_UID)\n .select(['id'])\n .where({ id: { $in: fileIds } })\n .transacting(trx.get())\n .forUpdate()\n .execute<File[]>();\n\n // fetch destinationFolder path\n let destinationFolderPath = '/';\n if (destinationFolderId !== null) {\n const destinationFolder = await strapi.db\n .queryBuilder(FOLDER_MODEL_UID)\n .select('path')\n .where({ id: destinationFolderId })\n .transacting(trx.get())\n .first()\n .execute<Folder>();\n destinationFolderPath = destinationFolder.path;\n }\n\n const fileTable = strapi.getModel(FILE_MODEL_UID).collectionName;\n const folderTable = strapi.getModel(FOLDER_MODEL_UID).collectionName;\n const folderPathColName =\n // @ts-expect-error - no dynamic typings for the models\n strapi.db.metadata.get(FILE_MODEL_UID).attributes.folderPath.columnName;\n // @ts-expect-error - no dynamic typings for the models\n const pathColName = strapi.db.metadata.get(FOLDER_MODEL_UID).attributes.path.columnName;\n\n if (existingFolders.length > 0) {\n // update folders' parent relation\n // @ts-expect-error - no dynamic typings for the models\n const { joinTable } = strapi.db.metadata.get(FOLDER_MODEL_UID).attributes.parent;\n await strapi.db\n .queryBuilder(joinTable.name)\n .transacting(trx.get())\n .delete()\n .where({ [joinTable.joinColumn.name]: { $in: folderIds } })\n .execute();\n\n if (destinationFolderId !== null) {\n await strapi.db\n .queryBuilder(joinTable.name)\n .transacting(trx.get())\n .insert(\n existingFolders.map((folder) => ({\n [joinTable.inverseJoinColumn.name]: destinationFolderId,\n [joinTable.joinColumn.name]: folder.id,\n }))\n )\n .execute();\n }\n\n for (const existingFolder of existingFolders) {\n let replaceQuery;\n switch (strapi.db.dialect.client) {\n case 'sqlite':\n replaceQuery = '? || SUBSTRING(??, ?)';\n break;\n case 'postgres':\n replaceQuery = 'CONCAT(?::TEXT, SUBSTRING(??, ?::INTEGER))';\n break;\n default:\n replaceQuery = 'CONCAT(?, SUBSTRING(??, ?))';\n }\n\n // update path for folders themselves & folders below\n totalFolderNumber = await strapi.db\n .getConnection(folderTable)\n .transacting(trx.get())\n .where(pathColName, existingFolder.path)\n .orWhere(pathColName, 'like', `${existingFolder.path}/%`)\n .update(\n pathColName,\n strapi.db.connection.raw(replaceQuery, [\n strings.joinBy('/', destinationFolderPath, `${existingFolder.pathId}`),\n pathColName,\n existingFolder.path.length + 1,\n ])\n );\n\n // update path of files below\n totalFileNumber = await strapi.db\n .getConnection(fileTable)\n .transacting(trx.get())\n .where(folderPathColName, existingFolder.path)\n .orWhere(folderPathColName, 'like', `${existingFolder.path}/%`)\n .update(\n folderPathColName,\n strapi.db.connection.raw(replaceQuery, [\n strings.joinBy('/', destinationFolderPath, `${existingFolder.pathId}`),\n folderPathColName,\n existingFolder.path.length + 1,\n ])\n );\n }\n }\n\n if (existingFiles.length > 0) {\n // update files' folder relation (delete + insert; upsert not possible)\n // @ts-expect-error - no dynamic typings for the models\n const fileJoinTable = strapi.db.metadata.get(FILE_MODEL_UID).attributes.folder.joinTable;\n await strapi.db\n .queryBuilder(fileJoinTable.name)\n .transacting(trx.get())\n .delete()\n .where({ [fileJoinTable.joinColumn.name]: { $in: fileIds } })\n .execute();\n\n if (destinationFolderId !== null) {\n await strapi.db\n .queryBuilder(fileJoinTable.name)\n .transacting(trx.get())\n .insert(\n existingFiles.map((file) => ({\n [fileJoinTable.inverseJoinColumn.name]: destinationFolderId,\n [fileJoinTable.joinColumn.name]: file.id,\n }))\n )\n .execute();\n }\n\n // update files main fields (path + updatedBy)\n await strapi.db\n .getConnection(fileTable)\n .transacting(trx.get())\n .whereIn('id', fileIds)\n .update(folderPathColName, destinationFolderPath);\n }\n\n await trx.commit();\n } catch (e) {\n await trx.rollback();\n throw e;\n }\n\n const updatedFolders = await strapi.db.query(FOLDER_MODEL_UID).findMany({\n where: { id: { $in: folderIds } },\n });\n\n const updatedFiles = await strapi.db.query(FILE_MODEL_UID).findMany({\n where: { id: { $in: fileIds } },\n });\n\n await getService('metrics').trackUsage('didBulkMoveMediaLibraryElements', {\n eventProperties: {\n rootFolderNumber: updatedFolders.length,\n rootAssetNumber: updatedFiles.length,\n totalFolderNumber,\n totalAssetNumber: totalFileNumber + updatedFiles.length,\n },\n });\n\n ctx.body = {\n data: {\n files: await pmFile.sanitizeOutput(updatedFiles),\n folders: await pmFolder.sanitizeOutput(updatedFolders),\n },\n };\n },\n};\n"],"names":["deleteMany","ctx","body","request","state","userAbility","pmFolder","strapi","service","createPermissionsManager","ability","model","FOLDER_MODEL_UID","pmFile","action","ACTIONS","read","FILE_MODEL_UID","validateDeleteManyFoldersFiles","fileService","getService","folderService","deletedFiles","deleteByIds","fileIds","folders","deletedFolders","totalFolderNumber","totalFileNumber","folderIds","length","trackUsage","eventProperties","rootFolderNumber","rootAssetNumber","totalAssetNumber","data","files","sanitizeOutput","moveMany","validateMoveManyFoldersFiles","destinationFolderId","trx","db","transaction","existingFolders","queryBuilder","select","where","id","$in","transacting","get","forUpdate","execute","existingFiles","destinationFolderPath","destinationFolder","first","path","fileTable","getModel","collectionName","folderTable","folderPathColName","metadata","attributes","folderPath","columnName","pathColName","joinTable","parent","name","delete","joinColumn","insert","map","folder","inverseJoinColumn","existingFolder","replaceQuery","dialect","client","getConnection","orWhere","update","connection","raw","strings","joinBy","pathId","fileJoinTable","file","whereIn","commit","e","rollback","updatedFolders","query","findMany","updatedFiles"],"mappings":";;;;;;;AAaA,sBAAe;AACb,IAAA,MAAMA,YAAWC,GAAY,EAAA;AAC3B,QAAA,MAAM,EAAEC,IAAI,EAAE,GAAGD,IAAIE,OAAO;AAC5B,QAAA,MAAM,EACJC,KAAO,EAAA,EAAEC,WAAW,EAAE,EACvB,GAAGJ,GAAAA;AAEJ,QAAA,MAAMK,WAAWC,MAAOC,CAAAA,OAAO,CAAC,mBAAA,CAAA,CAAqBC,wBAAwB,CAAC;YAC5EC,OAAST,EAAAA,GAAAA,CAAIG,KAAK,CAACC,WAAW;YAC9BM,KAAOC,EAAAA;AACT,SAAA,CAAA;AAEA,QAAA,MAAMC,SAASN,MAAOC,CAAAA,OAAO,CAAC,mBAAA,CAAA,CAAqBC,wBAAwB,CAAC;YAC1EC,OAASL,EAAAA,WAAAA;AACTS,YAAAA,MAAAA,EAAQC,kBAAQC,IAAI;YACpBL,KAAOM,EAAAA;AACT,SAAA,CAAA;AAEA,QAAA,MAAMC,yCAA+BhB,CAAAA,IAAAA,CAAAA;AAErC,QAAA,MAAMiB,cAAcC,gBAAW,CAAA,MAAA,CAAA;AAC/B,QAAA,MAAMC,gBAAgBD,gBAAW,CAAA,QAAA,CAAA;AAEjC,QAAA,MAAME,eAAe,MAAMH,WAAAA,CAAYI,WAAW,CAACrB,KAAKsB,OAAO,CAAA;AAC/D,QAAA,MAAM,EACJC,OAAAA,EAASC,cAAc,EACvBC,iBAAiB,EACjBC,eAAe,EAChB,GAAG,MAAMP,aAAAA,CAAcE,WAAW,CAACrB,KAAK2B,SAAS,CAAA;AAElD,QAAA,IAAIP,aAAaQ,MAAM,GAAGJ,cAAeI,CAAAA,MAAM,GAAG,CAAG,EAAA;AACnD,YAAA,MAAMV,gBAAW,CAAA,SAAA,CAAA,CAAWW,UAAU,CAAC,mCAAqC,EAAA;gBAC1EC,eAAiB,EAAA;AACfC,oBAAAA,gBAAAA,EAAkBP,eAAeI,MAAM;AACvCI,oBAAAA,eAAAA,EAAiBZ,aAAaQ,MAAM;AACpCH,oBAAAA,iBAAAA;oBACAQ,gBAAkBP,EAAAA,eAAAA,GAAkBN,aAAaQ;AACnD;AACF,aAAA,CAAA;AACF;AAEA7B,QAAAA,GAAAA,CAAIC,IAAI,GAAG;YACTkC,IAAM,EAAA;gBACJC,KAAO,EAAA,MAAMxB,MAAOyB,CAAAA,cAAc,CAAChB,YAAAA,CAAAA;gBACnCG,OAAS,EAAA,MAAMnB,QAASgC,CAAAA,cAAc,CAACZ,cAAAA;AACzC;AACF,SAAA;AACF,KAAA;AACA,IAAA,MAAMa,UAAStC,GAAY,EAAA;AACzB,QAAA,MAAM,EAAEC,IAAI,EAAE,GAAGD,IAAIE,OAAO;AAC5B,QAAA,MAAM,EACJC,KAAO,EAAA,EAAEC,WAAW,EAAE,EACvB,GAAGJ,GAAAA;AAEJ,QAAA,MAAMK,WAAWC,MAAOC,CAAAA,OAAO,CAAC,mBAAA,CAAA,CAAqBC,wBAAwB,CAAC;YAC5EC,OAAST,EAAAA,GAAAA,CAAIG,KAAK,CAACC,WAAW;YAC9BM,KAAOC,EAAAA;AACT,SAAA,CAAA;AAEA,QAAA,MAAMC,SAASN,MAAOC,CAAAA,OAAO,CAAC,mBAAA,CAAA,CAAqBC,wBAAwB,CAAC;YAC1EC,OAASL,EAAAA,WAAAA;AACTS,YAAAA,MAAAA,EAAQC,kBAAQC,IAAI;YACpBL,KAAOM,EAAAA;AACT,SAAA,CAAA;AAEA,QAAA,MAAMuB,uCAA6BtC,CAAAA,IAAAA,CAAAA;QACnC,MAAM,EAAE2B,YAAY,EAAE,EAAEL,UAAU,EAAE,EAAEiB,mBAAmB,EAAE,GAAGvC,IAAAA;AAE9D,QAAA,IAAIyB,iBAAoB,GAAA,CAAA;AACxB,QAAA,IAAIC,eAAkB,GAAA,CAAA;AAEtB,QAAA,MAAMc,GAAM,GAAA,MAAMnC,MAAOoC,CAAAA,EAAE,CAACC,WAAW,EAAA;QACvC,IAAI;;YAEF,MAAMC,eAAAA,GAAkB,MAAMtC,MAAOoC,CAAAA,EAAE,CACpCG,YAAY,CAAClC,0BACbmC,CAAAA,CAAAA,MAAM,CAAC;AAAC,gBAAA,IAAA;AAAM,gBAAA,QAAA;AAAU,gBAAA;AAAO,aAAA,CAAA,CAC/BC,KAAK,CAAC;gBAAEC,EAAI,EAAA;oBAAEC,GAAKrB,EAAAA;AAAU;AAAE,aAAA,CAAA,CAC/BsB,WAAW,CAACT,GAAAA,CAAIU,GAAG,EACnBC,CAAAA,CAAAA,SAAS,GACTC,OAAO,EAAA;;YAGV,MAAMC,aAAAA,GAAgB,MAAMhD,MAAOoC,CAAAA,EAAE,CAClCG,YAAY,CAAC7B,wBACb8B,CAAAA,CAAAA,MAAM,CAAC;AAAC,gBAAA;AAAK,aAAA,CAAA,CACbC,KAAK,CAAC;gBAAEC,EAAI,EAAA;oBAAEC,GAAK1B,EAAAA;AAAQ;AAAE,aAAA,CAAA,CAC7B2B,WAAW,CAACT,GAAAA,CAAIU,GAAG,EACnBC,CAAAA,CAAAA,SAAS,GACTC,OAAO,EAAA;;AAGV,YAAA,IAAIE,qBAAwB,GAAA,GAAA;AAC5B,YAAA,IAAIf,wBAAwB,IAAM,EAAA;AAChC,gBAAA,MAAMgB,iBAAoB,GAAA,MAAMlD,MAAOoC,CAAAA,EAAE,CACtCG,YAAY,CAAClC,0BAAAA,CAAAA,CACbmC,MAAM,CAAC,MACPC,CAAAA,CAAAA,KAAK,CAAC;oBAAEC,EAAIR,EAAAA;AAAoB,iBAAA,CAAA,CAChCU,WAAW,CAACT,GAAAA,CAAIU,GAAG,EACnBM,CAAAA,CAAAA,KAAK,GACLJ,OAAO,EAAA;AACVE,gBAAAA,qBAAAA,GAAwBC,kBAAkBE,IAAI;AAChD;AAEA,YAAA,MAAMC,SAAYrD,GAAAA,MAAAA,CAAOsD,QAAQ,CAAC5C,0BAAgB6C,cAAc;AAChE,YAAA,MAAMC,WAAcxD,GAAAA,MAAAA,CAAOsD,QAAQ,CAACjD,4BAAkBkD,cAAc;AACpE,YAAA,MAAME;YAEJzD,MAAOoC,CAAAA,EAAE,CAACsB,QAAQ,CAACb,GAAG,CAACnC,wBAAAA,CAAAA,CAAgBiD,UAAU,CAACC,UAAU,CAACC,UAAU;;AAEzE,YAAA,MAAMC,WAAc9D,GAAAA,MAAAA,CAAOoC,EAAE,CAACsB,QAAQ,CAACb,GAAG,CAACxC,0BAAkBsD,CAAAA,CAAAA,UAAU,CAACP,IAAI,CAACS,UAAU;YAEvF,IAAIvB,eAAAA,CAAgBf,MAAM,GAAG,CAAG,EAAA;;;AAG9B,gBAAA,MAAM,EAAEwC,SAAS,EAAE,GAAG/D,OAAOoC,EAAE,CAACsB,QAAQ,CAACb,GAAG,CAACxC,0BAAkBsD,CAAAA,CAAAA,UAAU,CAACK,MAAM;AAChF,gBAAA,MAAMhE,OAAOoC,EAAE,CACZG,YAAY,CAACwB,UAAUE,IAAI,CAAA,CAC3BrB,WAAW,CAACT,IAAIU,GAAG,EAAA,CAAA,CACnBqB,MAAM,EAAA,CACNzB,KAAK,CAAC;AAAE,oBAAA,CAACsB,SAAUI,CAAAA,UAAU,CAACF,IAAI,GAAG;wBAAEtB,GAAKrB,EAAAA;AAAU;AAAE,iBAAA,CAAA,CACxDyB,OAAO,EAAA;AAEV,gBAAA,IAAIb,wBAAwB,IAAM,EAAA;oBAChC,MAAMlC,MAAAA,CAAOoC,EAAE,CACZG,YAAY,CAACwB,SAAUE,CAAAA,IAAI,EAC3BrB,WAAW,CAACT,IAAIU,GAAG,EAAA,CAAA,CACnBuB,MAAM,CACL9B,eAAAA,CAAgB+B,GAAG,CAAC,CAACC,UAAY;AAC/B,4BAAA,CAACP,SAAUQ,CAAAA,iBAAiB,CAACN,IAAI,GAAG/B,mBAAAA;AACpC,4BAAA,CAAC6B,UAAUI,UAAU,CAACF,IAAI,GAAGK,OAAO5B;AACtC,yBAAA,IAEDK,OAAO,EAAA;AACZ;gBAEA,KAAK,MAAMyB,kBAAkBlC,eAAiB,CAAA;oBAC5C,IAAImC,YAAAA;AACJ,oBAAA,OAAQzE,MAAOoC,CAAAA,EAAE,CAACsC,OAAO,CAACC,MAAM;wBAC9B,KAAK,QAAA;4BACHF,YAAe,GAAA,uBAAA;AACf,4BAAA;wBACF,KAAK,UAAA;4BACHA,YAAe,GAAA,4CAAA;AACf,4BAAA;AACF,wBAAA;4BACEA,YAAe,GAAA,6BAAA;AACnB;;AAGArD,oBAAAA,iBAAAA,GAAoB,MAAMpB,MAAOoC,CAAAA,EAAE,CAChCwC,aAAa,CAACpB,aACdZ,WAAW,CAACT,GAAIU,CAAAA,GAAG,IACnBJ,KAAK,CAACqB,aAAaU,cAAepB,CAAAA,IAAI,EACtCyB,OAAO,CAACf,WAAa,EAAA,MAAA,EAAQ,CAAC,EAAEU,cAAAA,CAAepB,IAAI,CAAC,EAAE,CAAC,CACvD0B,CAAAA,MAAM,CACLhB,WAAAA,EACA9D,OAAOoC,EAAE,CAAC2C,UAAU,CAACC,GAAG,CAACP,YAAc,EAAA;wBACrCQ,aAAQC,CAAAA,MAAM,CAAC,GAAKjC,EAAAA,qBAAAA,EAAuB,CAAC,EAAEuB,cAAAA,CAAeW,MAAM,CAAC,CAAC,CAAA;AACrErB,wBAAAA,WAAAA;wBACAU,cAAepB,CAAAA,IAAI,CAAC7B,MAAM,GAAG;AAC9B,qBAAA,CAAA,CAAA;;AAILF,oBAAAA,eAAAA,GAAkB,MAAMrB,MAAOoC,CAAAA,EAAE,CAC9BwC,aAAa,CAACvB,WACdT,WAAW,CAACT,GAAIU,CAAAA,GAAG,IACnBJ,KAAK,CAACgB,mBAAmBe,cAAepB,CAAAA,IAAI,EAC5CyB,OAAO,CAACpB,iBAAmB,EAAA,MAAA,EAAQ,CAAC,EAAEe,cAAAA,CAAepB,IAAI,CAAC,EAAE,CAAC,CAC7D0B,CAAAA,MAAM,CACLrB,iBAAAA,EACAzD,OAAOoC,EAAE,CAAC2C,UAAU,CAACC,GAAG,CAACP,YAAc,EAAA;wBACrCQ,aAAQC,CAAAA,MAAM,CAAC,GAAKjC,EAAAA,qBAAAA,EAAuB,CAAC,EAAEuB,cAAAA,CAAeW,MAAM,CAAC,CAAC,CAAA;AACrE1B,wBAAAA,iBAAAA;wBACAe,cAAepB,CAAAA,IAAI,CAAC7B,MAAM,GAAG;AAC9B,qBAAA,CAAA,CAAA;AAEP;AACF;YAEA,IAAIyB,aAAAA,CAAczB,MAAM,GAAG,CAAG,EAAA;;;AAG5B,gBAAA,MAAM6D,aAAgBpF,GAAAA,MAAAA,CAAOoC,EAAE,CAACsB,QAAQ,CAACb,GAAG,CAACnC,wBAAgBiD,CAAAA,CAAAA,UAAU,CAACW,MAAM,CAACP,SAAS;AACxF,gBAAA,MAAM/D,OAAOoC,EAAE,CACZG,YAAY,CAAC6C,cAAcnB,IAAI,CAAA,CAC/BrB,WAAW,CAACT,IAAIU,GAAG,EAAA,CAAA,CACnBqB,MAAM,EAAA,CACNzB,KAAK,CAAC;AAAE,oBAAA,CAAC2C,aAAcjB,CAAAA,UAAU,CAACF,IAAI,GAAG;wBAAEtB,GAAK1B,EAAAA;AAAQ;AAAE,iBAAA,CAAA,CAC1D8B,OAAO,EAAA;AAEV,gBAAA,IAAIb,wBAAwB,IAAM,EAAA;oBAChC,MAAMlC,MAAAA,CAAOoC,EAAE,CACZG,YAAY,CAAC6C,aAAcnB,CAAAA,IAAI,EAC/BrB,WAAW,CAACT,IAAIU,GAAG,EAAA,CAAA,CACnBuB,MAAM,CACLpB,aAAAA,CAAcqB,GAAG,CAAC,CAACgB,QAAU;AAC3B,4BAAA,CAACD,aAAcb,CAAAA,iBAAiB,CAACN,IAAI,GAAG/B,mBAAAA;AACxC,4BAAA,CAACkD,cAAcjB,UAAU,CAACF,IAAI,GAAGoB,KAAK3C;AACxC,yBAAA,IAEDK,OAAO,EAAA;AACZ;;AAGA,gBAAA,MAAM/C,OAAOoC,EAAE,CACZwC,aAAa,CAACvB,WACdT,WAAW,CAACT,GAAIU,CAAAA,GAAG,IACnByC,OAAO,CAAC,MAAMrE,OACd6D,CAAAA,CAAAA,MAAM,CAACrB,iBAAmBR,EAAAA,qBAAAA,CAAAA;AAC/B;AAEA,YAAA,MAAMd,IAAIoD,MAAM,EAAA;AAClB,SAAA,CAAE,OAAOC,CAAG,EAAA;AACV,YAAA,MAAMrD,IAAIsD,QAAQ,EAAA;YAClB,MAAMD,CAAAA;AACR;QAEA,MAAME,cAAAA,GAAiB,MAAM1F,MAAOoC,CAAAA,EAAE,CAACuD,KAAK,CAACtF,0BAAkBuF,CAAAA,CAAAA,QAAQ,CAAC;YACtEnD,KAAO,EAAA;gBAAEC,EAAI,EAAA;oBAAEC,GAAKrB,EAAAA;AAAU;AAAE;AAClC,SAAA,CAAA;QAEA,MAAMuE,YAAAA,GAAe,MAAM7F,MAAOoC,CAAAA,EAAE,CAACuD,KAAK,CAACjF,wBAAgBkF,CAAAA,CAAAA,QAAQ,CAAC;YAClEnD,KAAO,EAAA;gBAAEC,EAAI,EAAA;oBAAEC,GAAK1B,EAAAA;AAAQ;AAAE;AAChC,SAAA,CAAA;AAEA,QAAA,MAAMJ,gBAAW,CAAA,SAAA,CAAA,CAAWW,UAAU,CAAC,iCAAmC,EAAA;YACxEC,eAAiB,EAAA;AACfC,gBAAAA,gBAAAA,EAAkBgE,eAAenE,MAAM;AACvCI,gBAAAA,eAAAA,EAAiBkE,aAAatE,MAAM;AACpCH,gBAAAA,iBAAAA;gBACAQ,gBAAkBP,EAAAA,eAAAA,GAAkBwE,aAAatE;AACnD;AACF,SAAA,CAAA;AAEA7B,QAAAA,GAAAA,CAAIC,IAAI,GAAG;YACTkC,IAAM,EAAA;gBACJC,KAAO,EAAA,MAAMxB,MAAOyB,CAAAA,cAAc,CAAC8D,YAAAA,CAAAA;gBACnC3E,OAAS,EAAA,MAAMnB,QAASgC,CAAAA,cAAc,CAAC2D,cAAAA;AACzC;AACF,SAAA;AACF;AACF,CAAE;;;;"}
|
|
@@ -22,7 +22,7 @@ var adminFolderFile = {
|
|
|
22
22
|
const deletedFiles = await fileService.deleteByIds(body.fileIds);
|
|
23
23
|
const { folders: deletedFolders, totalFolderNumber, totalFileNumber } = await folderService.deleteByIds(body.folderIds);
|
|
24
24
|
if (deletedFiles.length + deletedFolders.length > 1) {
|
|
25
|
-
|
|
25
|
+
await getService('metrics').trackUsage('didBulkDeleteMediaLibraryElements', {
|
|
26
26
|
eventProperties: {
|
|
27
27
|
rootFolderNumber: deletedFolders.length,
|
|
28
28
|
rootAssetNumber: deletedFiles.length,
|
|
@@ -166,7 +166,7 @@ var adminFolderFile = {
|
|
|
166
166
|
}
|
|
167
167
|
}
|
|
168
168
|
});
|
|
169
|
-
|
|
169
|
+
await getService('metrics').trackUsage('didBulkMoveMediaLibraryElements', {
|
|
170
170
|
eventProperties: {
|
|
171
171
|
rootFolderNumber: updatedFolders.length,
|
|
172
172
|
rootAssetNumber: updatedFiles.length,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"admin-folder-file.mjs","sources":["../../../server/src/controllers/admin-folder-file.ts"],"sourcesContent":["import { strings } from '@strapi/utils';\n\nimport type { Context } from 'koa';\n\nimport { getService } from '../utils';\nimport { ACTIONS, FOLDER_MODEL_UID, FILE_MODEL_UID } from '../constants';\nimport {\n validateDeleteManyFoldersFiles,\n validateMoveManyFoldersFiles,\n} from './validation/admin/folder-file';\n\nimport type { File, Folder } from '../types';\n\nexport default {\n async deleteMany(ctx: Context) {\n const { body } = ctx.request;\n const {\n state: { userAbility },\n } = ctx;\n\n const pmFolder = strapi.service('admin::permission').createPermissionsManager({\n ability: ctx.state.userAbility,\n model: FOLDER_MODEL_UID,\n });\n\n const pmFile = strapi.service('admin::permission').createPermissionsManager({\n ability: userAbility,\n action: ACTIONS.read,\n model: FILE_MODEL_UID,\n });\n\n await validateDeleteManyFoldersFiles(body);\n\n const fileService = getService('file');\n const folderService = getService('folder');\n\n const deletedFiles = await fileService.deleteByIds(body.fileIds);\n const {\n folders: deletedFolders,\n totalFolderNumber,\n totalFileNumber,\n } = await folderService.deleteByIds(body.folderIds);\n\n if (deletedFiles.length + deletedFolders.length > 1) {\n strapi.telemetry.send('didBulkDeleteMediaLibraryElements', {\n eventProperties: {\n rootFolderNumber: deletedFolders.length,\n rootAssetNumber: deletedFiles.length,\n totalFolderNumber,\n totalAssetNumber: totalFileNumber + deletedFiles.length,\n },\n });\n }\n\n ctx.body = {\n data: {\n files: await pmFile.sanitizeOutput(deletedFiles),\n folders: await pmFolder.sanitizeOutput(deletedFolders),\n },\n };\n },\n async moveMany(ctx: Context) {\n const { body } = ctx.request;\n const {\n state: { userAbility },\n } = ctx;\n\n const pmFolder = strapi.service('admin::permission').createPermissionsManager({\n ability: ctx.state.userAbility,\n model: FOLDER_MODEL_UID,\n });\n\n const pmFile = strapi.service('admin::permission').createPermissionsManager({\n ability: userAbility,\n action: ACTIONS.read,\n model: FILE_MODEL_UID,\n });\n\n await validateMoveManyFoldersFiles(body);\n const { folderIds = [], fileIds = [], destinationFolderId } = body;\n\n let totalFolderNumber = 0;\n let totalFileNumber = 0;\n\n const trx = await strapi.db.transaction();\n try {\n // fetch folders\n const existingFolders = await strapi.db\n .queryBuilder(FOLDER_MODEL_UID)\n .select(['id', 'pathId', 'path'])\n .where({ id: { $in: folderIds } })\n .transacting(trx.get())\n .forUpdate()\n .execute<Folder[]>();\n\n // fetch files\n const existingFiles = await strapi.db\n .queryBuilder(FILE_MODEL_UID)\n .select(['id'])\n .where({ id: { $in: fileIds } })\n .transacting(trx.get())\n .forUpdate()\n .execute<File[]>();\n\n // fetch destinationFolder path\n let destinationFolderPath = '/';\n if (destinationFolderId !== null) {\n const destinationFolder = await strapi.db\n .queryBuilder(FOLDER_MODEL_UID)\n .select('path')\n .where({ id: destinationFolderId })\n .transacting(trx.get())\n .first()\n .execute<Folder>();\n destinationFolderPath = destinationFolder.path;\n }\n\n const fileTable = strapi.getModel(FILE_MODEL_UID).collectionName;\n const folderTable = strapi.getModel(FOLDER_MODEL_UID).collectionName;\n const folderPathColName =\n // @ts-expect-error - no dynamic typings for the models\n strapi.db.metadata.get(FILE_MODEL_UID).attributes.folderPath.columnName;\n // @ts-expect-error - no dynamic typings for the models\n const pathColName = strapi.db.metadata.get(FOLDER_MODEL_UID).attributes.path.columnName;\n\n if (existingFolders.length > 0) {\n // update folders' parent relation\n // @ts-expect-error - no dynamic typings for the models\n const { joinTable } = strapi.db.metadata.get(FOLDER_MODEL_UID).attributes.parent;\n await strapi.db\n .queryBuilder(joinTable.name)\n .transacting(trx.get())\n .delete()\n .where({ [joinTable.joinColumn.name]: { $in: folderIds } })\n .execute();\n\n if (destinationFolderId !== null) {\n await strapi.db\n .queryBuilder(joinTable.name)\n .transacting(trx.get())\n .insert(\n existingFolders.map((folder) => ({\n [joinTable.inverseJoinColumn.name]: destinationFolderId,\n [joinTable.joinColumn.name]: folder.id,\n }))\n )\n .execute();\n }\n\n for (const existingFolder of existingFolders) {\n let replaceQuery;\n switch (strapi.db.dialect.client) {\n case 'sqlite':\n replaceQuery = '? || SUBSTRING(??, ?)';\n break;\n case 'postgres':\n replaceQuery = 'CONCAT(?::TEXT, SUBSTRING(??, ?::INTEGER))';\n break;\n default:\n replaceQuery = 'CONCAT(?, SUBSTRING(??, ?))';\n }\n\n // update path for folders themselves & folders below\n totalFolderNumber = await strapi.db\n .getConnection(folderTable)\n .transacting(trx.get())\n .where(pathColName, existingFolder.path)\n .orWhere(pathColName, 'like', `${existingFolder.path}/%`)\n .update(\n pathColName,\n strapi.db.connection.raw(replaceQuery, [\n strings.joinBy('/', destinationFolderPath, `${existingFolder.pathId}`),\n pathColName,\n existingFolder.path.length + 1,\n ])\n );\n\n // update path of files below\n totalFileNumber = await strapi.db\n .getConnection(fileTable)\n .transacting(trx.get())\n .where(folderPathColName, existingFolder.path)\n .orWhere(folderPathColName, 'like', `${existingFolder.path}/%`)\n .update(\n folderPathColName,\n strapi.db.connection.raw(replaceQuery, [\n strings.joinBy('/', destinationFolderPath, `${existingFolder.pathId}`),\n folderPathColName,\n existingFolder.path.length + 1,\n ])\n );\n }\n }\n\n if (existingFiles.length > 0) {\n // update files' folder relation (delete + insert; upsert not possible)\n // @ts-expect-error - no dynamic typings for the models\n const fileJoinTable = strapi.db.metadata.get(FILE_MODEL_UID).attributes.folder.joinTable;\n await strapi.db\n .queryBuilder(fileJoinTable.name)\n .transacting(trx.get())\n .delete()\n .where({ [fileJoinTable.joinColumn.name]: { $in: fileIds } })\n .execute();\n\n if (destinationFolderId !== null) {\n await strapi.db\n .queryBuilder(fileJoinTable.name)\n .transacting(trx.get())\n .insert(\n existingFiles.map((file) => ({\n [fileJoinTable.inverseJoinColumn.name]: destinationFolderId,\n [fileJoinTable.joinColumn.name]: file.id,\n }))\n )\n .execute();\n }\n\n // update files main fields (path + updatedBy)\n await strapi.db\n .getConnection(fileTable)\n .transacting(trx.get())\n .whereIn('id', fileIds)\n .update(folderPathColName, destinationFolderPath);\n }\n\n await trx.commit();\n } catch (e) {\n await trx.rollback();\n throw e;\n }\n\n const updatedFolders = await strapi.db.query(FOLDER_MODEL_UID).findMany({\n where: { id: { $in: folderIds } },\n });\n\n const updatedFiles = await strapi.db.query(FILE_MODEL_UID).findMany({\n where: { id: { $in: fileIds } },\n });\n\n strapi.telemetry.send('didBulkMoveMediaLibraryElements', {\n eventProperties: {\n rootFolderNumber: updatedFolders.length,\n rootAssetNumber: updatedFiles.length,\n totalFolderNumber,\n totalAssetNumber: totalFileNumber + updatedFiles.length,\n },\n });\n\n ctx.body = {\n data: {\n files: await pmFile.sanitizeOutput(updatedFiles),\n folders: await pmFolder.sanitizeOutput(updatedFolders),\n },\n };\n },\n};\n"],"names":["deleteMany","ctx","body","request","state","userAbility","pmFolder","strapi","service","createPermissionsManager","ability","model","FOLDER_MODEL_UID","pmFile","action","ACTIONS","read","FILE_MODEL_UID","validateDeleteManyFoldersFiles","fileService","getService","folderService","deletedFiles","deleteByIds","fileIds","folders","deletedFolders","totalFolderNumber","totalFileNumber","folderIds","length","telemetry","send","eventProperties","rootFolderNumber","rootAssetNumber","totalAssetNumber","data","files","sanitizeOutput","moveMany","validateMoveManyFoldersFiles","destinationFolderId","trx","db","transaction","existingFolders","queryBuilder","select","where","id","$in","transacting","get","forUpdate","execute","existingFiles","destinationFolderPath","destinationFolder","first","path","fileTable","getModel","collectionName","folderTable","folderPathColName","metadata","attributes","folderPath","columnName","pathColName","joinTable","parent","name","delete","joinColumn","insert","map","folder","inverseJoinColumn","existingFolder","replaceQuery","dialect","client","getConnection","orWhere","update","connection","raw","strings","joinBy","pathId","fileJoinTable","file","whereIn","commit","e","rollback","updatedFolders","query","findMany","updatedFiles"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"admin-folder-file.mjs","sources":["../../../server/src/controllers/admin-folder-file.ts"],"sourcesContent":["import { strings } from '@strapi/utils';\n\nimport type { Context } from 'koa';\n\nimport { getService } from '../utils';\nimport { ACTIONS, FOLDER_MODEL_UID, FILE_MODEL_UID } from '../constants';\nimport {\n validateDeleteManyFoldersFiles,\n validateMoveManyFoldersFiles,\n} from './validation/admin/folder-file';\n\nimport type { File, Folder } from '../types';\n\nexport default {\n async deleteMany(ctx: Context) {\n const { body } = ctx.request;\n const {\n state: { userAbility },\n } = ctx;\n\n const pmFolder = strapi.service('admin::permission').createPermissionsManager({\n ability: ctx.state.userAbility,\n model: FOLDER_MODEL_UID,\n });\n\n const pmFile = strapi.service('admin::permission').createPermissionsManager({\n ability: userAbility,\n action: ACTIONS.read,\n model: FILE_MODEL_UID,\n });\n\n await validateDeleteManyFoldersFiles(body);\n\n const fileService = getService('file');\n const folderService = getService('folder');\n\n const deletedFiles = await fileService.deleteByIds(body.fileIds);\n const {\n folders: deletedFolders,\n totalFolderNumber,\n totalFileNumber,\n } = await folderService.deleteByIds(body.folderIds);\n\n if (deletedFiles.length + deletedFolders.length > 1) {\n await getService('metrics').trackUsage('didBulkDeleteMediaLibraryElements', {\n eventProperties: {\n rootFolderNumber: deletedFolders.length,\n rootAssetNumber: deletedFiles.length,\n totalFolderNumber,\n totalAssetNumber: totalFileNumber + deletedFiles.length,\n },\n });\n }\n\n ctx.body = {\n data: {\n files: await pmFile.sanitizeOutput(deletedFiles),\n folders: await pmFolder.sanitizeOutput(deletedFolders),\n },\n };\n },\n async moveMany(ctx: Context) {\n const { body } = ctx.request;\n const {\n state: { userAbility },\n } = ctx;\n\n const pmFolder = strapi.service('admin::permission').createPermissionsManager({\n ability: ctx.state.userAbility,\n model: FOLDER_MODEL_UID,\n });\n\n const pmFile = strapi.service('admin::permission').createPermissionsManager({\n ability: userAbility,\n action: ACTIONS.read,\n model: FILE_MODEL_UID,\n });\n\n await validateMoveManyFoldersFiles(body);\n const { folderIds = [], fileIds = [], destinationFolderId } = body;\n\n let totalFolderNumber = 0;\n let totalFileNumber = 0;\n\n const trx = await strapi.db.transaction();\n try {\n // fetch folders\n const existingFolders = await strapi.db\n .queryBuilder(FOLDER_MODEL_UID)\n .select(['id', 'pathId', 'path'])\n .where({ id: { $in: folderIds } })\n .transacting(trx.get())\n .forUpdate()\n .execute<Folder[]>();\n\n // fetch files\n const existingFiles = await strapi.db\n .queryBuilder(FILE_MODEL_UID)\n .select(['id'])\n .where({ id: { $in: fileIds } })\n .transacting(trx.get())\n .forUpdate()\n .execute<File[]>();\n\n // fetch destinationFolder path\n let destinationFolderPath = '/';\n if (destinationFolderId !== null) {\n const destinationFolder = await strapi.db\n .queryBuilder(FOLDER_MODEL_UID)\n .select('path')\n .where({ id: destinationFolderId })\n .transacting(trx.get())\n .first()\n .execute<Folder>();\n destinationFolderPath = destinationFolder.path;\n }\n\n const fileTable = strapi.getModel(FILE_MODEL_UID).collectionName;\n const folderTable = strapi.getModel(FOLDER_MODEL_UID).collectionName;\n const folderPathColName =\n // @ts-expect-error - no dynamic typings for the models\n strapi.db.metadata.get(FILE_MODEL_UID).attributes.folderPath.columnName;\n // @ts-expect-error - no dynamic typings for the models\n const pathColName = strapi.db.metadata.get(FOLDER_MODEL_UID).attributes.path.columnName;\n\n if (existingFolders.length > 0) {\n // update folders' parent relation\n // @ts-expect-error - no dynamic typings for the models\n const { joinTable } = strapi.db.metadata.get(FOLDER_MODEL_UID).attributes.parent;\n await strapi.db\n .queryBuilder(joinTable.name)\n .transacting(trx.get())\n .delete()\n .where({ [joinTable.joinColumn.name]: { $in: folderIds } })\n .execute();\n\n if (destinationFolderId !== null) {\n await strapi.db\n .queryBuilder(joinTable.name)\n .transacting(trx.get())\n .insert(\n existingFolders.map((folder) => ({\n [joinTable.inverseJoinColumn.name]: destinationFolderId,\n [joinTable.joinColumn.name]: folder.id,\n }))\n )\n .execute();\n }\n\n for (const existingFolder of existingFolders) {\n let replaceQuery;\n switch (strapi.db.dialect.client) {\n case 'sqlite':\n replaceQuery = '? || SUBSTRING(??, ?)';\n break;\n case 'postgres':\n replaceQuery = 'CONCAT(?::TEXT, SUBSTRING(??, ?::INTEGER))';\n break;\n default:\n replaceQuery = 'CONCAT(?, SUBSTRING(??, ?))';\n }\n\n // update path for folders themselves & folders below\n totalFolderNumber = await strapi.db\n .getConnection(folderTable)\n .transacting(trx.get())\n .where(pathColName, existingFolder.path)\n .orWhere(pathColName, 'like', `${existingFolder.path}/%`)\n .update(\n pathColName,\n strapi.db.connection.raw(replaceQuery, [\n strings.joinBy('/', destinationFolderPath, `${existingFolder.pathId}`),\n pathColName,\n existingFolder.path.length + 1,\n ])\n );\n\n // update path of files below\n totalFileNumber = await strapi.db\n .getConnection(fileTable)\n .transacting(trx.get())\n .where(folderPathColName, existingFolder.path)\n .orWhere(folderPathColName, 'like', `${existingFolder.path}/%`)\n .update(\n folderPathColName,\n strapi.db.connection.raw(replaceQuery, [\n strings.joinBy('/', destinationFolderPath, `${existingFolder.pathId}`),\n folderPathColName,\n existingFolder.path.length + 1,\n ])\n );\n }\n }\n\n if (existingFiles.length > 0) {\n // update files' folder relation (delete + insert; upsert not possible)\n // @ts-expect-error - no dynamic typings for the models\n const fileJoinTable = strapi.db.metadata.get(FILE_MODEL_UID).attributes.folder.joinTable;\n await strapi.db\n .queryBuilder(fileJoinTable.name)\n .transacting(trx.get())\n .delete()\n .where({ [fileJoinTable.joinColumn.name]: { $in: fileIds } })\n .execute();\n\n if (destinationFolderId !== null) {\n await strapi.db\n .queryBuilder(fileJoinTable.name)\n .transacting(trx.get())\n .insert(\n existingFiles.map((file) => ({\n [fileJoinTable.inverseJoinColumn.name]: destinationFolderId,\n [fileJoinTable.joinColumn.name]: file.id,\n }))\n )\n .execute();\n }\n\n // update files main fields (path + updatedBy)\n await strapi.db\n .getConnection(fileTable)\n .transacting(trx.get())\n .whereIn('id', fileIds)\n .update(folderPathColName, destinationFolderPath);\n }\n\n await trx.commit();\n } catch (e) {\n await trx.rollback();\n throw e;\n }\n\n const updatedFolders = await strapi.db.query(FOLDER_MODEL_UID).findMany({\n where: { id: { $in: folderIds } },\n });\n\n const updatedFiles = await strapi.db.query(FILE_MODEL_UID).findMany({\n where: { id: { $in: fileIds } },\n });\n\n await getService('metrics').trackUsage('didBulkMoveMediaLibraryElements', {\n eventProperties: {\n rootFolderNumber: updatedFolders.length,\n rootAssetNumber: updatedFiles.length,\n totalFolderNumber,\n totalAssetNumber: totalFileNumber + updatedFiles.length,\n },\n });\n\n ctx.body = {\n data: {\n files: await pmFile.sanitizeOutput(updatedFiles),\n folders: await pmFolder.sanitizeOutput(updatedFolders),\n },\n };\n },\n};\n"],"names":["deleteMany","ctx","body","request","state","userAbility","pmFolder","strapi","service","createPermissionsManager","ability","model","FOLDER_MODEL_UID","pmFile","action","ACTIONS","read","FILE_MODEL_UID","validateDeleteManyFoldersFiles","fileService","getService","folderService","deletedFiles","deleteByIds","fileIds","folders","deletedFolders","totalFolderNumber","totalFileNumber","folderIds","length","trackUsage","eventProperties","rootFolderNumber","rootAssetNumber","totalAssetNumber","data","files","sanitizeOutput","moveMany","validateMoveManyFoldersFiles","destinationFolderId","trx","db","transaction","existingFolders","queryBuilder","select","where","id","$in","transacting","get","forUpdate","execute","existingFiles","destinationFolderPath","destinationFolder","first","path","fileTable","getModel","collectionName","folderTable","folderPathColName","metadata","attributes","folderPath","columnName","pathColName","joinTable","parent","name","delete","joinColumn","insert","map","folder","inverseJoinColumn","existingFolder","replaceQuery","dialect","client","getConnection","orWhere","update","connection","raw","strings","joinBy","pathId","fileJoinTable","file","whereIn","commit","e","rollback","updatedFolders","query","findMany","updatedFiles"],"mappings":"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"}
|
|
@@ -91,7 +91,7 @@ var adminUpload = {
|
|
|
91
91
|
user
|
|
92
92
|
});
|
|
93
93
|
if (uploadedFiles.some((file)=>file.mime?.startsWith('image/'))) {
|
|
94
|
-
|
|
94
|
+
await index.getService('metrics').trackUsage('didUploadImage');
|
|
95
95
|
}
|
|
96
96
|
const aiMetadataService = index.getService('aiMetadata');
|
|
97
97
|
// AFTER upload - use thumbnail versions for AI processing
|