payload 3.80.0-internal.cdd7ef7 → 3.80.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/elements/Nav.d.ts +0 -13
- package/dist/admin/elements/Nav.d.ts.map +1 -1
- package/dist/admin/elements/Nav.js.map +1 -1
- package/dist/admin/functions/index.d.ts +38 -1
- package/dist/admin/functions/index.d.ts.map +1 -1
- package/dist/admin/functions/index.js.map +1 -1
- package/dist/admin/types.d.ts +4 -5
- package/dist/admin/types.d.ts.map +1 -1
- package/dist/admin/types.js.map +1 -1
- package/dist/admin/views/folderList.d.ts +56 -0
- package/dist/admin/views/folderList.d.ts.map +1 -0
- package/dist/admin/views/folderList.js +3 -0
- package/dist/admin/views/folderList.js.map +1 -0
- package/dist/admin/views/index.d.ts +3 -1
- package/dist/admin/views/index.d.ts.map +1 -1
- package/dist/admin/views/index.js.map +1 -1
- package/dist/admin/views/list.d.ts +2 -43
- package/dist/admin/views/list.d.ts.map +1 -1
- package/dist/admin/views/list.js.map +1 -1
- package/dist/bin/generateImportMap/iterateCollections.d.ts.map +1 -1
- package/dist/bin/generateImportMap/iterateCollections.js +0 -1
- package/dist/bin/generateImportMap/iterateCollections.js.map +1 -1
- package/dist/bin/generateImportMap/iterateConfig.d.ts.map +1 -1
- package/dist/bin/generateImportMap/iterateConfig.js +0 -7
- package/dist/bin/generateImportMap/iterateConfig.js.map +1 -1
- package/dist/collections/config/client.d.ts +1 -3
- package/dist/collections/config/client.d.ts.map +1 -1
- package/dist/collections/config/client.js +0 -11
- package/dist/collections/config/client.js.map +1 -1
- package/dist/collections/config/defaults.js +1 -1
- package/dist/collections/config/defaults.js.map +1 -1
- package/dist/collections/config/sanitize.d.ts.map +1 -1
- package/dist/collections/config/sanitize.js +7 -3
- package/dist/collections/config/sanitize.js.map +1 -1
- package/dist/collections/config/types.d.ts +7 -29
- package/dist/collections/config/types.d.ts.map +1 -1
- package/dist/collections/config/types.js.map +1 -1
- package/dist/collections/operations/create.js +17 -17
- package/dist/collections/operations/create.js.map +1 -1
- package/dist/collections/operations/findByID.js +3 -3
- package/dist/collections/operations/findByID.js.map +1 -1
- package/dist/collections/operations/update.js +1 -1
- package/dist/collections/operations/update.js.map +1 -1
- package/dist/collections/operations/utilities/update.d.ts.map +1 -1
- package/dist/collections/operations/utilities/update.js +6 -6
- package/dist/collections/operations/utilities/update.js.map +1 -1
- package/dist/config/client.d.ts.map +1 -1
- package/dist/config/client.js +10 -0
- package/dist/config/client.js.map +1 -1
- package/dist/config/defaults.d.ts.map +1 -1
- package/dist/config/defaults.js +15 -0
- package/dist/config/defaults.js.map +1 -1
- package/dist/config/sanitize.d.ts.map +1 -1
- package/dist/config/sanitize.js +26 -3
- package/dist/config/sanitize.js.map +1 -1
- package/dist/config/types.d.ts +12 -26
- package/dist/config/types.d.ts.map +1 -1
- package/dist/config/types.js.map +1 -1
- package/dist/exports/shared.d.ts +3 -2
- package/dist/exports/shared.d.ts.map +1 -1
- package/dist/exports/shared.js +2 -1
- package/dist/exports/shared.js.map +1 -1
- package/dist/fields/baseFields/slug/index.d.ts +7 -0
- package/dist/fields/baseFields/slug/index.d.ts.map +1 -1
- package/dist/fields/baseFields/slug/index.js +2 -2
- package/dist/fields/baseFields/slug/index.js.map +1 -1
- package/dist/fields/config/sanitize.d.ts.map +1 -1
- package/dist/fields/config/sanitize.js +0 -4
- package/dist/fields/config/sanitize.js.map +1 -1
- package/dist/fields/config/sanitizeJoinField.d.ts.map +1 -1
- package/dist/fields/config/sanitizeJoinField.js +0 -3
- package/dist/fields/config/sanitizeJoinField.js.map +1 -1
- package/dist/folders/addFolderCollection.d.ts +10 -0
- package/dist/folders/addFolderCollection.d.ts.map +1 -0
- package/dist/folders/addFolderCollection.js +26 -0
- package/dist/folders/addFolderCollection.js.map +1 -0
- package/dist/folders/addFolderFieldToCollection.d.ts +8 -0
- package/dist/folders/addFolderFieldToCollection.d.ts.map +1 -0
- package/dist/folders/addFolderFieldToCollection.js +20 -0
- package/dist/folders/addFolderFieldToCollection.js.map +1 -0
- package/dist/folders/buildFolderField.d.ts +8 -0
- package/dist/folders/buildFolderField.d.ts.map +1 -0
- package/dist/folders/buildFolderField.js +87 -0
- package/dist/folders/buildFolderField.js.map +1 -0
- package/dist/folders/constants.d.ts +3 -0
- package/dist/folders/constants.d.ts.map +1 -0
- package/dist/folders/constants.js +4 -0
- package/dist/folders/constants.js.map +1 -0
- package/dist/folders/createFolderCollection.d.ts +11 -0
- package/dist/folders/createFolderCollection.d.ts.map +1 -0
- package/dist/folders/createFolderCollection.js +115 -0
- package/dist/folders/createFolderCollection.js.map +1 -0
- package/dist/folders/hooks/deleteSubfoldersAfterDelete.d.ts +8 -0
- package/dist/folders/hooks/deleteSubfoldersAfterDelete.d.ts.map +1 -0
- package/dist/folders/hooks/deleteSubfoldersAfterDelete.js +15 -0
- package/dist/folders/hooks/deleteSubfoldersAfterDelete.js.map +1 -0
- package/dist/folders/hooks/dissasociateAfterDelete.d.ts +8 -0
- package/dist/folders/hooks/dissasociateAfterDelete.d.ts.map +1 -0
- package/dist/folders/hooks/dissasociateAfterDelete.js +20 -0
- package/dist/folders/hooks/dissasociateAfterDelete.js.map +1 -0
- package/dist/folders/hooks/ensureSafeCollectionsChange.d.ts +5 -0
- package/dist/folders/hooks/ensureSafeCollectionsChange.d.ts.map +1 -0
- package/dist/folders/hooks/ensureSafeCollectionsChange.js +107 -0
- package/dist/folders/hooks/ensureSafeCollectionsChange.js.map +1 -0
- package/dist/folders/hooks/reparentChildFolder.d.ts +24 -0
- package/dist/folders/hooks/reparentChildFolder.d.ts.map +1 -0
- package/dist/folders/hooks/reparentChildFolder.js +72 -0
- package/dist/folders/hooks/reparentChildFolder.js.map +1 -0
- package/dist/folders/types.d.ts +118 -0
- package/dist/folders/types.d.ts.map +1 -0
- package/dist/folders/types.js +3 -0
- package/dist/folders/types.js.map +1 -0
- package/dist/folders/utils/buildFolderWhereConstraints.d.ts +13 -0
- package/dist/folders/utils/buildFolderWhereConstraints.d.ts.map +1 -0
- package/dist/folders/utils/buildFolderWhereConstraints.js +45 -0
- package/dist/folders/utils/buildFolderWhereConstraints.js.map +1 -0
- package/dist/folders/utils/formatFolderOrDocumentItem.d.ts +12 -0
- package/dist/folders/utils/formatFolderOrDocumentItem.d.ts.map +1 -0
- package/dist/folders/utils/formatFolderOrDocumentItem.js +30 -0
- package/dist/folders/utils/formatFolderOrDocumentItem.js.map +1 -0
- package/dist/folders/utils/getFolderBreadcrumbs.d.ts +14 -0
- package/dist/folders/utils/getFolderBreadcrumbs.d.ts.map +1 -0
- package/dist/folders/utils/getFolderBreadcrumbs.js +45 -0
- package/dist/folders/utils/getFolderBreadcrumbs.js.map +1 -0
- package/dist/folders/utils/getFolderData.d.ts +33 -0
- package/dist/folders/utils/getFolderData.d.ts.map +1 -0
- package/dist/folders/utils/getFolderData.js +88 -0
- package/dist/folders/utils/getFolderData.js.map +1 -0
- package/dist/folders/utils/getFoldersAndDocumentsFromJoin.d.ts +24 -0
- package/dist/folders/utils/getFoldersAndDocumentsFromJoin.d.ts.map +1 -0
- package/dist/folders/utils/getFoldersAndDocumentsFromJoin.js +66 -0
- package/dist/folders/utils/getFoldersAndDocumentsFromJoin.js.map +1 -0
- package/dist/folders/utils/getOrphanedDocs.d.ts +15 -0
- package/dist/folders/utils/getOrphanedDocs.d.ts.map +1 -0
- package/dist/folders/utils/getOrphanedDocs.js +40 -0
- package/dist/folders/utils/getOrphanedDocs.js.map +1 -0
- package/dist/globals/config/types.d.ts +0 -4
- package/dist/globals/config/types.d.ts.map +1 -1
- package/dist/globals/config/types.js.map +1 -1
- package/dist/globals/operations/update.d.ts.map +1 -1
- package/dist/globals/operations/update.js +2 -1
- package/dist/globals/operations/update.js.map +1 -1
- package/dist/index.bundled.d.ts +288 -577
- package/dist/index.d.ts +9 -23
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -13
- package/dist/index.js.map +1 -1
- package/dist/preferences/keys.d.ts +4 -8
- package/dist/preferences/keys.d.ts.map +1 -1
- package/dist/preferences/keys.js +4 -7
- package/dist/preferences/keys.js.map +1 -1
- package/dist/types/index.d.ts +0 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js.map +1 -1
- package/dist/utilities/addDataAndFileToRequest.d.ts.map +1 -1
- package/dist/utilities/addDataAndFileToRequest.js +7 -1
- package/dist/utilities/addDataAndFileToRequest.js.map +1 -1
- package/dist/utilities/extractID.js +1 -1
- package/dist/utilities/extractID.js.map +1 -1
- package/dist/utilities/formatAdminURL.d.ts +2 -13
- package/dist/utilities/formatAdminURL.d.ts.map +1 -1
- package/dist/utilities/formatAdminURL.js.map +1 -1
- package/dist/versions/saveVersion.d.ts +1 -0
- package/dist/versions/saveVersion.d.ts.map +1 -1
- package/dist/versions/saveVersion.js +16 -66
- package/dist/versions/saveVersion.js.map +1 -1
- package/dist/versions/updateLatestVersion.d.ts +24 -0
- package/dist/versions/updateLatestVersion.d.ts.map +1 -0
- package/dist/versions/updateLatestVersion.js +64 -0
- package/dist/versions/updateLatestVersion.js.map +1 -0
- package/package.json +4 -4
- package/dist/admin/views/hierarchyList.d.ts +0 -9
- package/dist/admin/views/hierarchyList.d.ts.map +0 -1
- package/dist/admin/views/hierarchyList.js +0 -3
- package/dist/admin/views/hierarchyList.js.map +0 -1
- package/dist/hierarchy/addHierarchyToCollection.d.ts +0 -8
- package/dist/hierarchy/addHierarchyToCollection.d.ts.map +0 -1
- package/dist/hierarchy/addHierarchyToCollection.js +0 -62
- package/dist/hierarchy/addHierarchyToCollection.js.map +0 -1
- package/dist/hierarchy/buildParentField.d.ts +0 -11
- package/dist/hierarchy/buildParentField.d.ts.map +0 -1
- package/dist/hierarchy/buildParentField.js +0 -42
- package/dist/hierarchy/buildParentField.js.map +0 -1
- package/dist/hierarchy/constants.d.ts +0 -15
- package/dist/hierarchy/constants.d.ts.map +0 -1
- package/dist/hierarchy/constants.js +0 -11
- package/dist/hierarchy/constants.js.map +0 -1
- package/dist/hierarchy/createFolderField.d.ts +0 -39
- package/dist/hierarchy/createFolderField.d.ts.map +0 -1
- package/dist/hierarchy/createFolderField.js +0 -54
- package/dist/hierarchy/createFolderField.js.map +0 -1
- package/dist/hierarchy/createFoldersCollection.d.ts +0 -57
- package/dist/hierarchy/createFoldersCollection.d.ts.map +0 -1
- package/dist/hierarchy/createFoldersCollection.js +0 -63
- package/dist/hierarchy/createFoldersCollection.js.map +0 -1
- package/dist/hierarchy/createTagField.d.ts +0 -44
- package/dist/hierarchy/createTagField.d.ts.map +0 -1
- package/dist/hierarchy/createTagField.js +0 -48
- package/dist/hierarchy/createTagField.js.map +0 -1
- package/dist/hierarchy/createTagsCollection.d.ts +0 -54
- package/dist/hierarchy/createTagsCollection.d.ts.map +0 -1
- package/dist/hierarchy/createTagsCollection.js +0 -56
- package/dist/hierarchy/createTagsCollection.js.map +0 -1
- package/dist/hierarchy/getInitialTreeData.d.ts +0 -27
- package/dist/hierarchy/getInitialTreeData.d.ts.map +0 -1
- package/dist/hierarchy/getInitialTreeData.js +0 -125
- package/dist/hierarchy/getInitialTreeData.js.map +0 -1
- package/dist/hierarchy/hooks/collectionAfterDelete.d.ts +0 -14
- package/dist/hierarchy/hooks/collectionAfterDelete.d.ts.map +0 -1
- package/dist/hierarchy/hooks/collectionAfterDelete.js +0 -21
- package/dist/hierarchy/hooks/collectionAfterDelete.js.map +0 -1
- package/dist/hierarchy/hooks/collectionAfterRead.d.ts +0 -27
- package/dist/hierarchy/hooks/collectionAfterRead.d.ts.map +0 -1
- package/dist/hierarchy/hooks/collectionAfterRead.js +0 -64
- package/dist/hierarchy/hooks/collectionAfterRead.js.map +0 -1
- package/dist/hierarchy/hooks/collectionBeforeChange.d.ts +0 -19
- package/dist/hierarchy/hooks/collectionBeforeChange.d.ts.map +0 -1
- package/dist/hierarchy/hooks/collectionBeforeChange.js +0 -90
- package/dist/hierarchy/hooks/collectionBeforeChange.js.map +0 -1
- package/dist/hierarchy/hooks/collectionBeforeDelete.d.ts +0 -15
- package/dist/hierarchy/hooks/collectionBeforeDelete.d.ts.map +0 -1
- package/dist/hierarchy/hooks/collectionBeforeDelete.js +0 -20
- package/dist/hierarchy/hooks/collectionBeforeDelete.js.map +0 -1
- package/dist/hierarchy/hooks/ensureSafeCollectionsChange.d.ts +0 -8
- package/dist/hierarchy/hooks/ensureSafeCollectionsChange.d.ts.map +0 -1
- package/dist/hierarchy/hooks/ensureSafeCollectionsChange.js +0 -108
- package/dist/hierarchy/hooks/ensureSafeCollectionsChange.js.map +0 -1
- package/dist/hierarchy/injectHierarchyButton.d.ts +0 -14
- package/dist/hierarchy/injectHierarchyButton.d.ts.map +0 -1
- package/dist/hierarchy/injectHierarchyButton.js +0 -37
- package/dist/hierarchy/injectHierarchyButton.js.map +0 -1
- package/dist/hierarchy/resolveHierarchyCollections.d.ts +0 -23
- package/dist/hierarchy/resolveHierarchyCollections.d.ts.map +0 -1
- package/dist/hierarchy/resolveHierarchyCollections.js +0 -312
- package/dist/hierarchy/resolveHierarchyCollections.js.map +0 -1
- package/dist/hierarchy/sanitizeHierarchyCollection.d.ts +0 -14
- package/dist/hierarchy/sanitizeHierarchyCollection.d.ts.map +0 -1
- package/dist/hierarchy/sanitizeHierarchyCollection.js +0 -112
- package/dist/hierarchy/sanitizeHierarchyCollection.js.map +0 -1
- package/dist/hierarchy/types.d.ts +0 -137
- package/dist/hierarchy/types.d.ts.map +0 -1
- package/dist/hierarchy/types.js +0 -6
- package/dist/hierarchy/types.js.map +0 -1
- package/dist/hierarchy/utils/buildLocalizedHierarchyPaths.d.ts +0 -71
- package/dist/hierarchy/utils/buildLocalizedHierarchyPaths.d.ts.map +0 -1
- package/dist/hierarchy/utils/buildLocalizedHierarchyPaths.js +0 -65
- package/dist/hierarchy/utils/buildLocalizedHierarchyPaths.js.map +0 -1
- package/dist/hierarchy/utils/computePaths.d.ts +0 -31
- package/dist/hierarchy/utils/computePaths.d.ts.map +0 -1
- package/dist/hierarchy/utils/computePaths.js +0 -371
- package/dist/hierarchy/utils/computePaths.js.map +0 -1
- package/dist/hierarchy/utils/findUseAsTitle.d.ts +0 -6
- package/dist/hierarchy/utils/findUseAsTitle.d.ts.map +0 -1
- package/dist/hierarchy/utils/findUseAsTitle.js +0 -72
- package/dist/hierarchy/utils/findUseAsTitle.js.map +0 -1
- package/dist/hierarchy/utils/getAncestors.d.ts +0 -34
- package/dist/hierarchy/utils/getAncestors.d.ts.map +0 -1
- package/dist/hierarchy/utils/getAncestors.js +0 -94
- package/dist/hierarchy/utils/getAncestors.js.map +0 -1
- package/dist/hierarchy/utils/getLocalizedValue.d.ts +0 -30
- package/dist/hierarchy/utils/getLocalizedValue.d.ts.map +0 -1
- package/dist/hierarchy/utils/getLocalizedValue.js +0 -46
- package/dist/hierarchy/utils/getLocalizedValue.js.map +0 -1
- package/dist/hierarchy/utils/getLocalizedValue.spec.js +0 -250
- package/dist/hierarchy/utils/getLocalizedValue.spec.js.map +0 -1
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export const deleteSubfoldersBeforeDelete = ({ folderFieldName, folderSlug })=>{
|
|
2
|
+
return async ({ id, req })=>{
|
|
3
|
+
await req.payload.delete({
|
|
4
|
+
collection: folderSlug,
|
|
5
|
+
req,
|
|
6
|
+
where: {
|
|
7
|
+
[folderFieldName]: {
|
|
8
|
+
equals: id
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
});
|
|
12
|
+
};
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
//# sourceMappingURL=deleteSubfoldersAfterDelete.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/folders/hooks/deleteSubfoldersAfterDelete.ts"],"sourcesContent":["import type { CollectionBeforeDeleteHook } from '../../index.js'\n\ntype Args = {\n folderFieldName: string\n folderSlug: string\n}\nexport const deleteSubfoldersBeforeDelete = ({\n folderFieldName,\n folderSlug,\n}: Args): CollectionBeforeDeleteHook => {\n return async ({ id, req }) => {\n await req.payload.delete({\n collection: folderSlug,\n req,\n where: {\n [folderFieldName]: {\n equals: id,\n },\n },\n })\n }\n}\n"],"names":["deleteSubfoldersBeforeDelete","folderFieldName","folderSlug","id","req","payload","delete","collection","where","equals"],"mappings":"AAMA,OAAO,MAAMA,+BAA+B,CAAC,EAC3CC,eAAe,EACfC,UAAU,EACL;IACL,OAAO,OAAO,EAAEC,EAAE,EAAEC,GAAG,EAAE;QACvB,MAAMA,IAAIC,OAAO,CAACC,MAAM,CAAC;YACvBC,YAAYL;YACZE;YACAI,OAAO;gBACL,CAACP,gBAAgB,EAAE;oBACjBQ,QAAQN;gBACV;YACF;QACF;IACF;AACF,EAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { CollectionAfterDeleteHook } from '../../index.js';
|
|
2
|
+
type Args = {
|
|
3
|
+
collectionSlugs: string[];
|
|
4
|
+
folderFieldName: string;
|
|
5
|
+
};
|
|
6
|
+
export declare const dissasociateAfterDelete: ({ collectionSlugs, folderFieldName, }: Args) => CollectionAfterDeleteHook;
|
|
7
|
+
export {};
|
|
8
|
+
//# sourceMappingURL=dissasociateAfterDelete.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dissasociateAfterDelete.d.ts","sourceRoot":"","sources":["../../../src/folders/hooks/dissasociateAfterDelete.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,gBAAgB,CAAA;AAE/D,KAAK,IAAI,GAAG;IACV,eAAe,EAAE,MAAM,EAAE,CAAA;IACzB,eAAe,EAAE,MAAM,CAAA;CACxB,CAAA;AACD,eAAO,MAAM,uBAAuB,0CAGjC,IAAI,KAAG,yBAiBT,CAAA"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export const dissasociateAfterDelete = ({ collectionSlugs, folderFieldName })=>{
|
|
2
|
+
return async ({ id, req })=>{
|
|
3
|
+
for (const collectionSlug of collectionSlugs){
|
|
4
|
+
await req.payload.update({
|
|
5
|
+
collection: collectionSlug,
|
|
6
|
+
data: {
|
|
7
|
+
[folderFieldName]: null
|
|
8
|
+
},
|
|
9
|
+
req,
|
|
10
|
+
where: {
|
|
11
|
+
[folderFieldName]: {
|
|
12
|
+
equals: id
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
//# sourceMappingURL=dissasociateAfterDelete.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/folders/hooks/dissasociateAfterDelete.ts"],"sourcesContent":["import type { CollectionAfterDeleteHook } from '../../index.js'\n\ntype Args = {\n collectionSlugs: string[]\n folderFieldName: string\n}\nexport const dissasociateAfterDelete = ({\n collectionSlugs,\n folderFieldName,\n}: Args): CollectionAfterDeleteHook => {\n return async ({ id, req }) => {\n for (const collectionSlug of collectionSlugs) {\n await req.payload.update({\n collection: collectionSlug,\n data: {\n [folderFieldName]: null,\n },\n req,\n where: {\n [folderFieldName]: {\n equals: id,\n },\n },\n })\n }\n }\n}\n"],"names":["dissasociateAfterDelete","collectionSlugs","folderFieldName","id","req","collectionSlug","payload","update","collection","data","where","equals"],"mappings":"AAMA,OAAO,MAAMA,0BAA0B,CAAC,EACtCC,eAAe,EACfC,eAAe,EACV;IACL,OAAO,OAAO,EAAEC,EAAE,EAAEC,GAAG,EAAE;QACvB,KAAK,MAAMC,kBAAkBJ,gBAAiB;YAC5C,MAAMG,IAAIE,OAAO,CAACC,MAAM,CAAC;gBACvBC,YAAYH;gBACZI,MAAM;oBACJ,CAACP,gBAAgB,EAAE;gBACrB;gBACAE;gBACAM,OAAO;oBACL,CAACR,gBAAgB,EAAE;wBACjBS,QAAQR;oBACV;gBACF;YACF;QACF;IACF;AACF,EAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { type CollectionBeforeValidateHook, type CollectionSlug } from '../../index.js';
|
|
2
|
+
export declare const ensureSafeCollectionsChange: ({ foldersSlug }: {
|
|
3
|
+
foldersSlug: CollectionSlug;
|
|
4
|
+
}) => CollectionBeforeValidateHook;
|
|
5
|
+
//# sourceMappingURL=ensureSafeCollectionsChange.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ensureSafeCollectionsChange.d.ts","sourceRoot":"","sources":["../../../src/folders/hooks/ensureSafeCollectionsChange.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,4BAA4B,EAAE,KAAK,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAIjG,eAAO,MAAM,2BAA2B,oBACpB;IAAE,WAAW,EAAE,cAAc,CAAA;CAAE,KAAG,4BA0InD,CAAA"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { APIError } from '../../index.js';
|
|
2
|
+
import { extractID } from '../../utilities/extractID.js';
|
|
3
|
+
import { getTranslatedLabel } from '../../utilities/getTranslatedLabel.js';
|
|
4
|
+
export const ensureSafeCollectionsChange = ({ foldersSlug })=>async ({ data, originalDoc, req })=>{
|
|
5
|
+
const currentFolderID = extractID(originalDoc || {});
|
|
6
|
+
const parentFolderID = extractID(data?.folder || originalDoc?.folder || {});
|
|
7
|
+
if (Array.isArray(data?.folderType) && data.folderType.length > 0) {
|
|
8
|
+
const folderType = data.folderType;
|
|
9
|
+
const currentlyAssignedCollections = Array.isArray(originalDoc?.folderType) && originalDoc.folderType.length > 0 ? originalDoc.folderType : undefined;
|
|
10
|
+
/**
|
|
11
|
+
* Check if the assigned collections have changed.
|
|
12
|
+
* example:
|
|
13
|
+
* - originalAssignedCollections: ['posts', 'pages']
|
|
14
|
+
* - folderType: ['posts']
|
|
15
|
+
*
|
|
16
|
+
* The user is narrowing the types of documents that can be associated with this folder.
|
|
17
|
+
* If the user is only expanding the types of documents that can be associated with this folder,
|
|
18
|
+
* we do not need to do anything.
|
|
19
|
+
*/ const newCollections = currentlyAssignedCollections ? currentlyAssignedCollections.filter((c)=>!folderType.includes(c)) : folderType;
|
|
20
|
+
if (newCollections && newCollections.length > 0) {
|
|
21
|
+
let hasDependentDocuments = false;
|
|
22
|
+
if (typeof currentFolderID === 'string' || typeof currentFolderID === 'number') {
|
|
23
|
+
const childDocumentsResult = await req.payload.findByID({
|
|
24
|
+
id: currentFolderID,
|
|
25
|
+
collection: foldersSlug,
|
|
26
|
+
joins: {
|
|
27
|
+
documentsAndFolders: {
|
|
28
|
+
limit: 100_000_000,
|
|
29
|
+
where: {
|
|
30
|
+
or: [
|
|
31
|
+
{
|
|
32
|
+
relationTo: {
|
|
33
|
+
in: newCollections
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
]
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
},
|
|
40
|
+
overrideAccess: true,
|
|
41
|
+
req
|
|
42
|
+
});
|
|
43
|
+
hasDependentDocuments = childDocumentsResult.documentsAndFolders.docs.length > 0;
|
|
44
|
+
}
|
|
45
|
+
// matches folders that are directly related to the removed collections
|
|
46
|
+
let hasDependentFolders = false;
|
|
47
|
+
if (!hasDependentDocuments && (typeof currentFolderID === 'string' || typeof currentFolderID === 'number')) {
|
|
48
|
+
const childFoldersResult = await req.payload.find({
|
|
49
|
+
collection: foldersSlug,
|
|
50
|
+
limit: 1,
|
|
51
|
+
req,
|
|
52
|
+
where: {
|
|
53
|
+
and: [
|
|
54
|
+
{
|
|
55
|
+
folderType: {
|
|
56
|
+
in: newCollections
|
|
57
|
+
}
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
folder: {
|
|
61
|
+
equals: currentFolderID
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
]
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
hasDependentFolders = childFoldersResult.totalDocs > 0;
|
|
68
|
+
}
|
|
69
|
+
if (hasDependentDocuments || hasDependentFolders) {
|
|
70
|
+
const translatedLabels = newCollections.map((collectionSlug)=>{
|
|
71
|
+
if (req.payload.collections[collectionSlug]?.config.labels.singular) {
|
|
72
|
+
return getTranslatedLabel(req.payload.collections[collectionSlug]?.config.labels.plural, req.i18n);
|
|
73
|
+
}
|
|
74
|
+
return collectionSlug;
|
|
75
|
+
});
|
|
76
|
+
throw new APIError(`The folder "${data.name || originalDoc.name}" contains ${hasDependentDocuments ? 'documents' : 'folders'} that still belong to the following collections: ${translatedLabels.join(', ')}`, 400);
|
|
77
|
+
}
|
|
78
|
+
return data;
|
|
79
|
+
}
|
|
80
|
+
} else if ((data?.folderType === null || Array.isArray(data?.folderType) && data?.folderType.length === 0) && parentFolderID) {
|
|
81
|
+
// attempting to set the folderType to catch-all, so we need to ensure that the parent allows this
|
|
82
|
+
let parentFolder;
|
|
83
|
+
if (typeof parentFolderID === 'string' || typeof parentFolderID === 'number') {
|
|
84
|
+
try {
|
|
85
|
+
parentFolder = await req.payload.findByID({
|
|
86
|
+
id: parentFolderID,
|
|
87
|
+
collection: foldersSlug,
|
|
88
|
+
overrideAccess: true,
|
|
89
|
+
req,
|
|
90
|
+
select: {
|
|
91
|
+
name: true,
|
|
92
|
+
folderType: true
|
|
93
|
+
},
|
|
94
|
+
user: req.user
|
|
95
|
+
});
|
|
96
|
+
} catch (_) {
|
|
97
|
+
// parent folder does not exist
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
if (parentFolder && parentFolder?.folderType && Array.isArray(parentFolder.folderType) && parentFolder.folderType.length > 0) {
|
|
101
|
+
throw new APIError(`The folder "${data?.name || originalDoc.name}" must have folder-type set since its parent folder ${parentFolder?.name ? `"${parentFolder?.name}" ` : ''}has a folder-type set.`, 400);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
return data;
|
|
105
|
+
};
|
|
106
|
+
|
|
107
|
+
//# sourceMappingURL=ensureSafeCollectionsChange.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/folders/hooks/ensureSafeCollectionsChange.ts"],"sourcesContent":["import { APIError, type CollectionBeforeValidateHook, type CollectionSlug } from '../../index.js'\nimport { extractID } from '../../utilities/extractID.js'\nimport { getTranslatedLabel } from '../../utilities/getTranslatedLabel.js'\n\nexport const ensureSafeCollectionsChange =\n ({ foldersSlug }: { foldersSlug: CollectionSlug }): CollectionBeforeValidateHook =>\n async ({ data, originalDoc, req }) => {\n const currentFolderID = extractID(originalDoc || {})\n const parentFolderID = extractID(data?.folder || originalDoc?.folder || {})\n if (Array.isArray(data?.folderType) && data.folderType.length > 0) {\n const folderType = data.folderType as string[]\n const currentlyAssignedCollections: string[] | undefined =\n Array.isArray(originalDoc?.folderType) && originalDoc.folderType.length > 0\n ? originalDoc.folderType\n : undefined\n /**\n * Check if the assigned collections have changed.\n * example:\n * - originalAssignedCollections: ['posts', 'pages']\n * - folderType: ['posts']\n *\n * The user is narrowing the types of documents that can be associated with this folder.\n * If the user is only expanding the types of documents that can be associated with this folder,\n * we do not need to do anything.\n */\n const newCollections = currentlyAssignedCollections\n ? // user is narrowing the current scope of the folder\n currentlyAssignedCollections.filter((c) => !folderType.includes(c))\n : // user is adding a scope to the folder\n folderType\n\n if (newCollections && newCollections.length > 0) {\n let hasDependentDocuments = false\n if (typeof currentFolderID === 'string' || typeof currentFolderID === 'number') {\n const childDocumentsResult = await req.payload.findByID({\n id: currentFolderID,\n collection: foldersSlug,\n joins: {\n documentsAndFolders: {\n limit: 100_000_000,\n where: {\n or: [\n {\n relationTo: {\n in: newCollections,\n },\n },\n ],\n },\n },\n },\n overrideAccess: true,\n req,\n })\n\n hasDependentDocuments = childDocumentsResult.documentsAndFolders.docs.length > 0\n }\n\n // matches folders that are directly related to the removed collections\n let hasDependentFolders = false\n if (\n !hasDependentDocuments &&\n (typeof currentFolderID === 'string' || typeof currentFolderID === 'number')\n ) {\n const childFoldersResult = await req.payload.find({\n collection: foldersSlug,\n limit: 1,\n req,\n where: {\n and: [\n {\n folderType: {\n in: newCollections,\n },\n },\n {\n folder: {\n equals: currentFolderID,\n },\n },\n ],\n },\n })\n hasDependentFolders = childFoldersResult.totalDocs > 0\n }\n\n if (hasDependentDocuments || hasDependentFolders) {\n const translatedLabels = newCollections.map((collectionSlug) => {\n if (req.payload.collections[collectionSlug]?.config.labels.singular) {\n return getTranslatedLabel(\n req.payload.collections[collectionSlug]?.config.labels.plural,\n req.i18n,\n )\n }\n return collectionSlug\n })\n\n throw new APIError(\n `The folder \"${data.name || originalDoc.name}\" contains ${hasDependentDocuments ? 'documents' : 'folders'} that still belong to the following collections: ${translatedLabels.join(', ')}`,\n 400,\n )\n }\n return data\n }\n } else if (\n (data?.folderType === null ||\n (Array.isArray(data?.folderType) && data?.folderType.length === 0)) &&\n parentFolderID\n ) {\n // attempting to set the folderType to catch-all, so we need to ensure that the parent allows this\n let parentFolder\n if (typeof parentFolderID === 'string' || typeof parentFolderID === 'number') {\n try {\n parentFolder = await req.payload.findByID({\n id: parentFolderID,\n collection: foldersSlug,\n overrideAccess: true,\n req,\n select: {\n name: true,\n folderType: true,\n },\n user: req.user,\n })\n } catch (_) {\n // parent folder does not exist\n }\n }\n\n if (\n parentFolder &&\n parentFolder?.folderType &&\n Array.isArray(parentFolder.folderType) &&\n parentFolder.folderType.length > 0\n ) {\n throw new APIError(\n `The folder \"${data?.name || originalDoc.name}\" must have folder-type set since its parent folder ${parentFolder?.name ? `\"${parentFolder?.name}\" ` : ''}has a folder-type set.`,\n 400,\n )\n }\n }\n\n return data\n }\n"],"names":["APIError","extractID","getTranslatedLabel","ensureSafeCollectionsChange","foldersSlug","data","originalDoc","req","currentFolderID","parentFolderID","folder","Array","isArray","folderType","length","currentlyAssignedCollections","undefined","newCollections","filter","c","includes","hasDependentDocuments","childDocumentsResult","payload","findByID","id","collection","joins","documentsAndFolders","limit","where","or","relationTo","in","overrideAccess","docs","hasDependentFolders","childFoldersResult","find","and","equals","totalDocs","translatedLabels","map","collectionSlug","collections","config","labels","singular","plural","i18n","name","join","parentFolder","select","user","_"],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { CollectionAfterChangeHook } from '../../index.js';
|
|
2
|
+
/**
|
|
3
|
+
* If a parent is moved into a child folder, we need to re-parent the child
|
|
4
|
+
*
|
|
5
|
+
* @example
|
|
6
|
+
*
|
|
7
|
+
* ```ts
|
|
8
|
+
→ F1
|
|
9
|
+
→ F2
|
|
10
|
+
→ F2A
|
|
11
|
+
→ F3
|
|
12
|
+
|
|
13
|
+
Moving F1 → F2A becomes:
|
|
14
|
+
|
|
15
|
+
→ F2A
|
|
16
|
+
→ F1
|
|
17
|
+
→ F2
|
|
18
|
+
→ F3
|
|
19
|
+
```
|
|
20
|
+
*/
|
|
21
|
+
export declare const reparentChildFolder: ({ folderFieldName, }: {
|
|
22
|
+
folderFieldName: string;
|
|
23
|
+
}) => CollectionAfterChangeHook;
|
|
24
|
+
//# sourceMappingURL=reparentChildFolder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reparentChildFolder.d.ts","sourceRoot":"","sources":["../../../src/folders/hooks/reparentChildFolder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,yBAAyB,EAAW,MAAM,gBAAgB,CAAA;AAmDxE;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,mBAAmB,yBAE7B;IACD,eAAe,EAAE,MAAM,CAAA;CACxB,KAAG,yBAkCH,CAAA"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { extractID } from '../../utilities/extractID.js';
|
|
2
|
+
/**
|
|
3
|
+
* Determines if a child folder belongs to a parent folder by
|
|
4
|
+
* recursively checking upwards through the folder hierarchy.
|
|
5
|
+
*/ async function isChildOfFolder({ folderCollectionSlug, folderFieldName, folderID, parentIDToFind, payload }) {
|
|
6
|
+
const parentFolder = await payload.findByID({
|
|
7
|
+
id: folderID,
|
|
8
|
+
collection: folderCollectionSlug
|
|
9
|
+
});
|
|
10
|
+
const parentFolderID = parentFolder[folderFieldName] ? extractID(parentFolder[folderFieldName]) : undefined;
|
|
11
|
+
if (!parentFolderID) {
|
|
12
|
+
// made it to the root
|
|
13
|
+
return false;
|
|
14
|
+
}
|
|
15
|
+
if (parentFolderID === parentIDToFind) {
|
|
16
|
+
// found match, would be cyclic
|
|
17
|
+
return true;
|
|
18
|
+
}
|
|
19
|
+
return isChildOfFolder({
|
|
20
|
+
folderCollectionSlug,
|
|
21
|
+
folderFieldName,
|
|
22
|
+
folderID: parentFolderID,
|
|
23
|
+
parentIDToFind,
|
|
24
|
+
payload
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* If a parent is moved into a child folder, we need to re-parent the child
|
|
29
|
+
*
|
|
30
|
+
* @example
|
|
31
|
+
*
|
|
32
|
+
* ```ts
|
|
33
|
+
→ F1
|
|
34
|
+
→ F2
|
|
35
|
+
→ F2A
|
|
36
|
+
→ F3
|
|
37
|
+
|
|
38
|
+
Moving F1 → F2A becomes:
|
|
39
|
+
|
|
40
|
+
→ F2A
|
|
41
|
+
→ F1
|
|
42
|
+
→ F2
|
|
43
|
+
→ F3
|
|
44
|
+
```
|
|
45
|
+
*/ export const reparentChildFolder = ({ folderFieldName })=>{
|
|
46
|
+
return async ({ doc, previousDoc, req })=>{
|
|
47
|
+
if (previousDoc[folderFieldName] !== doc[folderFieldName] && doc[folderFieldName] && req.payload.config.folders) {
|
|
48
|
+
const newParentFolderID = extractID(doc[folderFieldName]);
|
|
49
|
+
const isMovingToChild = newParentFolderID ? await isChildOfFolder({
|
|
50
|
+
folderCollectionSlug: req.payload.config.folders.slug,
|
|
51
|
+
folderFieldName,
|
|
52
|
+
folderID: newParentFolderID,
|
|
53
|
+
parentIDToFind: doc.id,
|
|
54
|
+
payload: req.payload
|
|
55
|
+
}) : false;
|
|
56
|
+
if (isMovingToChild) {
|
|
57
|
+
// if the folder was moved into a child folder, the child folder needs
|
|
58
|
+
// to be re-parented with the parent of the folder that was moved
|
|
59
|
+
await req.payload.update({
|
|
60
|
+
id: newParentFolderID,
|
|
61
|
+
collection: req.payload.config.folders.slug,
|
|
62
|
+
data: {
|
|
63
|
+
[folderFieldName]: previousDoc[folderFieldName] ? extractID(previousDoc[folderFieldName]) : null
|
|
64
|
+
},
|
|
65
|
+
req
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
};
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
//# sourceMappingURL=reparentChildFolder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/folders/hooks/reparentChildFolder.ts"],"sourcesContent":["import type { CollectionAfterChangeHook, Payload } from '../../index.js'\n\nimport { extractID } from '../../utilities/extractID.js'\n\ntype Args = {\n folderCollectionSlug: string\n folderFieldName: string\n folderID: number | string\n parentIDToFind: number | string\n payload: Payload\n}\n\n/**\n * Determines if a child folder belongs to a parent folder by\n * recursively checking upwards through the folder hierarchy.\n */\nasync function isChildOfFolder({\n folderCollectionSlug,\n folderFieldName,\n folderID,\n parentIDToFind,\n payload,\n}: Args): Promise<boolean> {\n const parentFolder = await payload.findByID({\n id: folderID,\n collection: folderCollectionSlug,\n })\n\n const parentFolderID = parentFolder[folderFieldName]\n ? extractID(parentFolder[folderFieldName])\n : undefined\n\n if (!parentFolderID) {\n // made it to the root\n return false\n }\n\n if (parentFolderID === parentIDToFind) {\n // found match, would be cyclic\n return true\n }\n\n return isChildOfFolder({\n folderCollectionSlug,\n folderFieldName,\n folderID: parentFolderID,\n parentIDToFind,\n payload,\n })\n}\n\n/**\n * If a parent is moved into a child folder, we need to re-parent the child\n * \n * @example\n * \n * ```ts\n → F1\n → F2\n → F2A\n → F3\n\n Moving F1 → F2A becomes:\n\n → F2A\n → F1\n → F2\n → F3\n ```\n */\nexport const reparentChildFolder = ({\n folderFieldName,\n}: {\n folderFieldName: string\n}): CollectionAfterChangeHook => {\n return async ({ doc, previousDoc, req }) => {\n if (\n previousDoc[folderFieldName] !== doc[folderFieldName] &&\n doc[folderFieldName] &&\n req.payload.config.folders\n ) {\n const newParentFolderID = extractID(doc[folderFieldName])\n const isMovingToChild = newParentFolderID\n ? await isChildOfFolder({\n folderCollectionSlug: req.payload.config.folders.slug,\n folderFieldName,\n folderID: newParentFolderID,\n parentIDToFind: doc.id,\n payload: req.payload,\n })\n : false\n\n if (isMovingToChild) {\n // if the folder was moved into a child folder, the child folder needs\n // to be re-parented with the parent of the folder that was moved\n await req.payload.update({\n id: newParentFolderID,\n collection: req.payload.config.folders.slug,\n data: {\n [folderFieldName]: previousDoc[folderFieldName]\n ? extractID(previousDoc[folderFieldName])\n : null,\n },\n req,\n })\n }\n }\n }\n}\n"],"names":["extractID","isChildOfFolder","folderCollectionSlug","folderFieldName","folderID","parentIDToFind","payload","parentFolder","findByID","id","collection","parentFolderID","undefined","reparentChildFolder","doc","previousDoc","req","config","folders","newParentFolderID","isMovingToChild","slug","update","data"],"mappings":"AAEA,SAASA,SAAS,QAAQ,+BAA8B;AAUxD;;;CAGC,GACD,eAAeC,gBAAgB,EAC7BC,oBAAoB,EACpBC,eAAe,EACfC,QAAQ,EACRC,cAAc,EACdC,OAAO,EACF;IACL,MAAMC,eAAe,MAAMD,QAAQE,QAAQ,CAAC;QAC1CC,IAAIL;QACJM,YAAYR;IACd;IAEA,MAAMS,iBAAiBJ,YAAY,CAACJ,gBAAgB,GAChDH,UAAUO,YAAY,CAACJ,gBAAgB,IACvCS;IAEJ,IAAI,CAACD,gBAAgB;QACnB,sBAAsB;QACtB,OAAO;IACT;IAEA,IAAIA,mBAAmBN,gBAAgB;QACrC,+BAA+B;QAC/B,OAAO;IACT;IAEA,OAAOJ,gBAAgB;QACrBC;QACAC;QACAC,UAAUO;QACVN;QACAC;IACF;AACF;AAEA;;;;;;;;;;;;;;;;;;CAkBC,GACD,OAAO,MAAMO,sBAAsB,CAAC,EAClCV,eAAe,EAGhB;IACC,OAAO,OAAO,EAAEW,GAAG,EAAEC,WAAW,EAAEC,GAAG,EAAE;QACrC,IACED,WAAW,CAACZ,gBAAgB,KAAKW,GAAG,CAACX,gBAAgB,IACrDW,GAAG,CAACX,gBAAgB,IACpBa,IAAIV,OAAO,CAACW,MAAM,CAACC,OAAO,EAC1B;YACA,MAAMC,oBAAoBnB,UAAUc,GAAG,CAACX,gBAAgB;YACxD,MAAMiB,kBAAkBD,oBACpB,MAAMlB,gBAAgB;gBACpBC,sBAAsBc,IAAIV,OAAO,CAACW,MAAM,CAACC,OAAO,CAACG,IAAI;gBACrDlB;gBACAC,UAAUe;gBACVd,gBAAgBS,IAAIL,EAAE;gBACtBH,SAASU,IAAIV,OAAO;YACtB,KACA;YAEJ,IAAIc,iBAAiB;gBACnB,sEAAsE;gBACtE,iEAAiE;gBACjE,MAAMJ,IAAIV,OAAO,CAACgB,MAAM,CAAC;oBACvBb,IAAIU;oBACJT,YAAYM,IAAIV,OAAO,CAACW,MAAM,CAACC,OAAO,CAACG,IAAI;oBAC3CE,MAAM;wBACJ,CAACpB,gBAAgB,EAAEY,WAAW,CAACZ,gBAAgB,GAC3CH,UAAUe,WAAW,CAACZ,gBAAgB,IACtC;oBACN;oBACAa;gBACF;YACF;QACF;IACF;AACF,EAAC"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import type { CollectionConfig, TypeWithID } from '../collections/config/types.js';
|
|
2
|
+
import type { CollectionSlug, SanitizedCollectionConfig } from '../index.js';
|
|
3
|
+
import type { Document } from '../types/index.js';
|
|
4
|
+
export type FolderInterface = {
|
|
5
|
+
documentsAndFolders?: {
|
|
6
|
+
docs: {
|
|
7
|
+
relationTo: CollectionSlug;
|
|
8
|
+
value: Document;
|
|
9
|
+
}[];
|
|
10
|
+
};
|
|
11
|
+
folder?: FolderInterface | (number | string | undefined);
|
|
12
|
+
folderType: CollectionSlug[];
|
|
13
|
+
name: string;
|
|
14
|
+
} & TypeWithID;
|
|
15
|
+
export type FolderBreadcrumb = {
|
|
16
|
+
folderType?: CollectionSlug[];
|
|
17
|
+
id: null | number | string;
|
|
18
|
+
name: string;
|
|
19
|
+
};
|
|
20
|
+
export type Subfolder = {
|
|
21
|
+
fileCount: number;
|
|
22
|
+
hasSubfolders: boolean;
|
|
23
|
+
id: number | string;
|
|
24
|
+
name: string;
|
|
25
|
+
subfolderCount: number;
|
|
26
|
+
};
|
|
27
|
+
export type FolderEnabledColection = {
|
|
28
|
+
admin: {
|
|
29
|
+
custom: {
|
|
30
|
+
folderCollectionSlug: CollectionSlug;
|
|
31
|
+
};
|
|
32
|
+
};
|
|
33
|
+
slug: CollectionSlug;
|
|
34
|
+
} & SanitizedCollectionConfig;
|
|
35
|
+
/**
|
|
36
|
+
* `${relationTo}-${id}` is used as a key for the item
|
|
37
|
+
*/
|
|
38
|
+
export type FolderDocumentItemKey = `${string}-${number | string}`;
|
|
39
|
+
/**
|
|
40
|
+
* Needed for document card view for upload enabled collections
|
|
41
|
+
*/
|
|
42
|
+
type DocumentMediaData = {
|
|
43
|
+
filename?: string;
|
|
44
|
+
mimeType?: string;
|
|
45
|
+
url?: string;
|
|
46
|
+
};
|
|
47
|
+
/**
|
|
48
|
+
* A generic structure for a folder or document item.
|
|
49
|
+
*/
|
|
50
|
+
export type FolderOrDocument = {
|
|
51
|
+
itemKey: FolderDocumentItemKey;
|
|
52
|
+
relationTo: CollectionSlug;
|
|
53
|
+
value: {
|
|
54
|
+
_folderOrDocumentTitle: string;
|
|
55
|
+
createdAt?: string;
|
|
56
|
+
folderID?: number | string;
|
|
57
|
+
folderType: CollectionSlug[];
|
|
58
|
+
id: number | string;
|
|
59
|
+
updatedAt?: string;
|
|
60
|
+
} & DocumentMediaData;
|
|
61
|
+
};
|
|
62
|
+
export type GetFolderDataResult = {
|
|
63
|
+
breadcrumbs: FolderBreadcrumb[] | null;
|
|
64
|
+
documents: FolderOrDocument[];
|
|
65
|
+
folderAssignedCollections: CollectionSlug[] | undefined;
|
|
66
|
+
subfolders: FolderOrDocument[];
|
|
67
|
+
};
|
|
68
|
+
export type RootFoldersConfiguration = {
|
|
69
|
+
/**
|
|
70
|
+
* If true, the browse by folder view will be enabled
|
|
71
|
+
*
|
|
72
|
+
* @default true
|
|
73
|
+
*/
|
|
74
|
+
browseByFolder?: boolean;
|
|
75
|
+
/**
|
|
76
|
+
* An array of functions to be ran when the folder collection is initialized
|
|
77
|
+
* This allows plugins to modify the collection configuration
|
|
78
|
+
*/
|
|
79
|
+
collectionOverrides?: (({ collection, }: {
|
|
80
|
+
collection: Omit<CollectionConfig, 'trash'>;
|
|
81
|
+
}) => Omit<CollectionConfig, 'trash'> | Promise<Omit<CollectionConfig, 'trash'>>)[];
|
|
82
|
+
/**
|
|
83
|
+
* If true, you can scope folders to specific collections.
|
|
84
|
+
*
|
|
85
|
+
* @default true
|
|
86
|
+
*/
|
|
87
|
+
collectionSpecific?: boolean;
|
|
88
|
+
/**
|
|
89
|
+
* Ability to view hidden fields and collections related to folders
|
|
90
|
+
*
|
|
91
|
+
* @default false
|
|
92
|
+
*/
|
|
93
|
+
debug?: boolean;
|
|
94
|
+
/**
|
|
95
|
+
* The Folder field name
|
|
96
|
+
*
|
|
97
|
+
* @default "folder"
|
|
98
|
+
*/
|
|
99
|
+
fieldName?: string;
|
|
100
|
+
/**
|
|
101
|
+
* Slug for the folder collection
|
|
102
|
+
*
|
|
103
|
+
* @default "payload-folders"
|
|
104
|
+
*/
|
|
105
|
+
slug?: string;
|
|
106
|
+
};
|
|
107
|
+
export type CollectionFoldersConfiguration = {
|
|
108
|
+
/**
|
|
109
|
+
* If true, the collection will be included in the browse by folder view
|
|
110
|
+
*
|
|
111
|
+
* @default true
|
|
112
|
+
*/
|
|
113
|
+
browseByFolder?: boolean;
|
|
114
|
+
};
|
|
115
|
+
type BaseFolderSortKeys = 'createdAt' | 'name' | 'updatedAt';
|
|
116
|
+
export type FolderSortKeys = `-${BaseFolderSortKeys}` | BaseFolderSortKeys;
|
|
117
|
+
export {};
|
|
118
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/folders/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/folders/types.ts"],"sourcesContent":["import type { CollectionConfig, TypeWithID } from '../collections/config/types.js'\nimport type { CollectionSlug, SanitizedCollectionConfig } from '../index.js'\nimport type { Document } from '../types/index.js'\n\nexport type FolderInterface = {\n documentsAndFolders?: {\n docs: {\n relationTo: CollectionSlug\n value: Document\n }[]\n }\n folder?: FolderInterface | (number | string | undefined)\n folderType: CollectionSlug[]\n name: string\n} & TypeWithID\n\nexport type FolderBreadcrumb = {\n folderType?: CollectionSlug[]\n id: null | number | string\n name: string\n}\n\nexport type Subfolder = {\n fileCount: number\n hasSubfolders: boolean\n id: number | string\n name: string\n subfolderCount: number\n}\n\nexport type FolderEnabledColection = {\n admin: {\n custom: {\n folderCollectionSlug: CollectionSlug\n }\n }\n slug: CollectionSlug\n} & SanitizedCollectionConfig\n\n/**\n * `${relationTo}-${id}` is used as a key for the item\n */\nexport type FolderDocumentItemKey = `${string}-${number | string}`\n\n/**\n * Needed for document card view for upload enabled collections\n */\ntype DocumentMediaData = {\n filename?: string\n mimeType?: string\n url?: string\n}\n/**\n * A generic structure for a folder or document item.\n */\nexport type FolderOrDocument = {\n itemKey: FolderDocumentItemKey\n relationTo: CollectionSlug\n value: {\n _folderOrDocumentTitle: string\n createdAt?: string\n folderID?: number | string\n folderType: CollectionSlug[]\n id: number | string\n updatedAt?: string\n } & DocumentMediaData\n}\n\nexport type GetFolderDataResult = {\n breadcrumbs: FolderBreadcrumb[] | null\n documents: FolderOrDocument[]\n folderAssignedCollections: CollectionSlug[] | undefined\n subfolders: FolderOrDocument[]\n}\n\nexport type RootFoldersConfiguration = {\n /**\n * If true, the browse by folder view will be enabled\n *\n * @default true\n */\n browseByFolder?: boolean\n /**\n * An array of functions to be ran when the folder collection is initialized\n * This allows plugins to modify the collection configuration\n */\n collectionOverrides?: (({\n collection,\n }: {\n collection: Omit<CollectionConfig, 'trash'>\n }) => Omit<CollectionConfig, 'trash'> | Promise<Omit<CollectionConfig, 'trash'>>)[]\n /**\n * If true, you can scope folders to specific collections.\n *\n * @default true\n */\n collectionSpecific?: boolean\n /**\n * Ability to view hidden fields and collections related to folders\n *\n * @default false\n */\n debug?: boolean\n /**\n * The Folder field name\n *\n * @default \"folder\"\n */\n fieldName?: string\n /**\n * Slug for the folder collection\n *\n * @default \"payload-folders\"\n */\n slug?: string\n}\n\nexport type CollectionFoldersConfiguration = {\n /**\n * If true, the collection will be included in the browse by folder view\n *\n * @default true\n */\n browseByFolder?: boolean\n}\n\ntype BaseFolderSortKeys = 'createdAt' | 'name' | 'updatedAt'\n\nexport type FolderSortKeys = `-${BaseFolderSortKeys}` | BaseFolderSortKeys\n"],"names":[],"mappings":"AAgIA,WAA0E"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { SanitizedCollectionConfig } from '../../collections/config/types.js';
|
|
2
|
+
import type { PayloadRequest, Where } from '../../types/index.js';
|
|
3
|
+
type Args = {
|
|
4
|
+
collectionConfig: SanitizedCollectionConfig;
|
|
5
|
+
folderID?: number | string;
|
|
6
|
+
localeCode?: string;
|
|
7
|
+
req: PayloadRequest;
|
|
8
|
+
search?: string;
|
|
9
|
+
sort?: string;
|
|
10
|
+
};
|
|
11
|
+
export declare function buildFolderWhereConstraints({ collectionConfig, folderID, localeCode, req, search, sort, }: Args): Promise<undefined | Where>;
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=buildFolderWhereConstraints.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"buildFolderWhereConstraints.d.ts","sourceRoot":"","sources":["../../../src/folders/utils/buildFolderWhereConstraints.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,mCAAmC,CAAA;AAClF,OAAO,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAA;AAKjE,KAAK,IAAI,GAAG;IACV,gBAAgB,EAAE,yBAAyB,CAAA;IAC3C,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,GAAG,EAAE,cAAc,CAAA;IACnB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,CAAA;CACd,CAAA;AACD,wBAAsB,2BAA2B,CAAC,EAChD,gBAAgB,EAChB,QAAQ,EACR,UAAU,EACV,GAAG,EACH,MAAW,EACX,IAAI,GACL,EAAE,IAAI,GAAG,OAAO,CAAC,SAAS,GAAG,KAAK,CAAC,CAoDnC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { combineWhereConstraints } from '../../utilities/combineWhereConstraints.js';
|
|
2
|
+
import { mergeListSearchAndWhere } from '../../utilities/mergeListSearchAndWhere.js';
|
|
3
|
+
export async function buildFolderWhereConstraints({ collectionConfig, folderID, localeCode, req, search = '', sort }) {
|
|
4
|
+
const constraints = [
|
|
5
|
+
mergeListSearchAndWhere({
|
|
6
|
+
collectionConfig,
|
|
7
|
+
search
|
|
8
|
+
})
|
|
9
|
+
];
|
|
10
|
+
const baseFilterConstraint = await (collectionConfig.admin?.baseFilter ?? collectionConfig.admin?.baseListFilter)?.({
|
|
11
|
+
limit: 0,
|
|
12
|
+
locale: localeCode,
|
|
13
|
+
page: 1,
|
|
14
|
+
req,
|
|
15
|
+
sort: sort || (typeof collectionConfig.defaultSort === 'string' ? collectionConfig.defaultSort : 'id')
|
|
16
|
+
});
|
|
17
|
+
if (baseFilterConstraint) {
|
|
18
|
+
constraints.push(baseFilterConstraint);
|
|
19
|
+
}
|
|
20
|
+
if (folderID) {
|
|
21
|
+
// build folder join where constraints
|
|
22
|
+
constraints.push({
|
|
23
|
+
relationTo: {
|
|
24
|
+
equals: collectionConfig.slug
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
// join queries need to omit trashed documents
|
|
28
|
+
if (collectionConfig.trash) {
|
|
29
|
+
constraints.push({
|
|
30
|
+
deletedAt: {
|
|
31
|
+
exists: false
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
const filteredConstraints = constraints.filter(Boolean);
|
|
37
|
+
if (filteredConstraints.length > 1) {
|
|
38
|
+
return combineWhereConstraints(filteredConstraints);
|
|
39
|
+
} else if (filteredConstraints.length === 1) {
|
|
40
|
+
return filteredConstraints[0];
|
|
41
|
+
}
|
|
42
|
+
return undefined;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
//# sourceMappingURL=buildFolderWhereConstraints.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/folders/utils/buildFolderWhereConstraints.ts"],"sourcesContent":["import type { SanitizedCollectionConfig } from '../../collections/config/types.js'\nimport type { PayloadRequest, Where } from '../../types/index.js'\n\nimport { combineWhereConstraints } from '../../utilities/combineWhereConstraints.js'\nimport { mergeListSearchAndWhere } from '../../utilities/mergeListSearchAndWhere.js'\n\ntype Args = {\n collectionConfig: SanitizedCollectionConfig\n folderID?: number | string\n localeCode?: string\n req: PayloadRequest\n search?: string\n sort?: string\n}\nexport async function buildFolderWhereConstraints({\n collectionConfig,\n folderID,\n localeCode,\n req,\n search = '',\n sort,\n}: Args): Promise<undefined | Where> {\n const constraints: Where[] = [\n mergeListSearchAndWhere({\n collectionConfig,\n search,\n // where // cannot have where since fields in folders and collection will differ\n }),\n ]\n\n const baseFilterConstraint = await (\n collectionConfig.admin?.baseFilter ?? collectionConfig.admin?.baseListFilter\n )?.({\n limit: 0,\n locale: localeCode,\n page: 1,\n req,\n sort:\n sort ||\n (typeof collectionConfig.defaultSort === 'string' ? collectionConfig.defaultSort : 'id'),\n })\n\n if (baseFilterConstraint) {\n constraints.push(baseFilterConstraint)\n }\n\n if (folderID) {\n // build folder join where constraints\n constraints.push({\n relationTo: {\n equals: collectionConfig.slug,\n },\n })\n\n // join queries need to omit trashed documents\n if (collectionConfig.trash) {\n constraints.push({\n deletedAt: {\n exists: false,\n },\n })\n }\n }\n\n const filteredConstraints = constraints.filter(Boolean)\n\n if (filteredConstraints.length > 1) {\n return combineWhereConstraints(filteredConstraints)\n } else if (filteredConstraints.length === 1) {\n return filteredConstraints[0]\n }\n\n return undefined\n}\n"],"names":["combineWhereConstraints","mergeListSearchAndWhere","buildFolderWhereConstraints","collectionConfig","folderID","localeCode","req","search","sort","constraints","baseFilterConstraint","admin","baseFilter","baseListFilter","limit","locale","page","defaultSort","push","relationTo","equals","slug","trash","deletedAt","exists","filteredConstraints","filter","Boolean","length","undefined"],"mappings":"AAGA,SAASA,uBAAuB,QAAQ,6CAA4C;AACpF,SAASC,uBAAuB,QAAQ,6CAA4C;AAUpF,OAAO,eAAeC,4BAA4B,EAChDC,gBAAgB,EAChBC,QAAQ,EACRC,UAAU,EACVC,GAAG,EACHC,SAAS,EAAE,EACXC,IAAI,EACC;IACL,MAAMC,cAAuB;QAC3BR,wBAAwB;YACtBE;YACAI;QAEF;KACD;IAED,MAAMG,uBAAuB,MAC3BP,CAAAA,iBAAiBQ,KAAK,EAAEC,cAAcT,iBAAiBQ,KAAK,EAAEE,cAAa,IACzE;QACFC,OAAO;QACPC,QAAQV;QACRW,MAAM;QACNV;QACAE,MACEA,QACC,CAAA,OAAOL,iBAAiBc,WAAW,KAAK,WAAWd,iBAAiBc,WAAW,GAAG,IAAG;IAC1F;IAEA,IAAIP,sBAAsB;QACxBD,YAAYS,IAAI,CAACR;IACnB;IAEA,IAAIN,UAAU;QACZ,sCAAsC;QACtCK,YAAYS,IAAI,CAAC;YACfC,YAAY;gBACVC,QAAQjB,iBAAiBkB,IAAI;YAC/B;QACF;QAEA,8CAA8C;QAC9C,IAAIlB,iBAAiBmB,KAAK,EAAE;YAC1Bb,YAAYS,IAAI,CAAC;gBACfK,WAAW;oBACTC,QAAQ;gBACV;YACF;QACF;IACF;IAEA,MAAMC,sBAAsBhB,YAAYiB,MAAM,CAACC;IAE/C,IAAIF,oBAAoBG,MAAM,GAAG,GAAG;QAClC,OAAO5B,wBAAwByB;IACjC,OAAO,IAAIA,oBAAoBG,MAAM,KAAK,GAAG;QAC3C,OAAOH,mBAAmB,CAAC,EAAE;IAC/B;IAEA,OAAOI;AACT"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { CollectionSlug, Document } from '../../index.js';
|
|
2
|
+
import type { FolderOrDocument } from '../types.js';
|
|
3
|
+
type Args = {
|
|
4
|
+
folderFieldName: string;
|
|
5
|
+
isUpload: boolean;
|
|
6
|
+
relationTo: CollectionSlug;
|
|
7
|
+
useAsTitle?: string;
|
|
8
|
+
value: Document;
|
|
9
|
+
};
|
|
10
|
+
export declare function formatFolderOrDocumentItem({ folderFieldName, isUpload, relationTo, useAsTitle, value, }: Args): FolderOrDocument;
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=formatFolderOrDocumentItem.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formatFolderOrDocumentItem.d.ts","sourceRoot":"","sources":["../../../src/folders/utils/formatFolderOrDocumentItem.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAC9D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAKnD,KAAK,IAAI,GAAG;IACV,eAAe,EAAE,MAAM,CAAA;IACvB,QAAQ,EAAE,OAAO,CAAA;IACjB,UAAU,EAAE,cAAc,CAAA;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,KAAK,EAAE,QAAQ,CAAA;CAChB,CAAA;AACD,wBAAgB,0BAA0B,CAAC,EACzC,eAAe,EACf,QAAQ,EACR,UAAU,EACV,UAAU,EACV,KAAK,GACN,EAAE,IAAI,GAAG,gBAAgB,CA+BzB"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { isImage } from '../../uploads/isImage.js';
|
|
2
|
+
import { getBestFitFromSizes } from '../../utilities/getBestFitFromSizes.js';
|
|
3
|
+
export function formatFolderOrDocumentItem({ folderFieldName, isUpload, relationTo, useAsTitle, value }) {
|
|
4
|
+
const itemValue = {
|
|
5
|
+
id: value?.id,
|
|
6
|
+
_folderOrDocumentTitle: String(useAsTitle && value?.[useAsTitle] || value['id']),
|
|
7
|
+
createdAt: value?.createdAt,
|
|
8
|
+
folderID: value?.[folderFieldName],
|
|
9
|
+
folderType: value?.folderType || [],
|
|
10
|
+
updatedAt: value?.updatedAt
|
|
11
|
+
};
|
|
12
|
+
if (isUpload) {
|
|
13
|
+
itemValue.filename = value.filename;
|
|
14
|
+
itemValue.mimeType = value.mimeType;
|
|
15
|
+
itemValue.url = value.thumbnailURL || (isImage(value.mimeType) ? getBestFitFromSizes({
|
|
16
|
+
sizes: value.sizes,
|
|
17
|
+
targetSizeMax: 520,
|
|
18
|
+
targetSizeMin: 300,
|
|
19
|
+
url: value.url,
|
|
20
|
+
width: value.width
|
|
21
|
+
}) : undefined);
|
|
22
|
+
}
|
|
23
|
+
return {
|
|
24
|
+
itemKey: `${relationTo}-${value.id}`,
|
|
25
|
+
relationTo,
|
|
26
|
+
value: itemValue
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
//# sourceMappingURL=formatFolderOrDocumentItem.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/folders/utils/formatFolderOrDocumentItem.ts"],"sourcesContent":["import type { CollectionSlug, Document } from '../../index.js'\nimport type { FolderOrDocument } from '../types.js'\n\nimport { isImage } from '../../uploads/isImage.js'\nimport { getBestFitFromSizes } from '../../utilities/getBestFitFromSizes.js'\n\ntype Args = {\n folderFieldName: string\n isUpload: boolean\n relationTo: CollectionSlug\n useAsTitle?: string\n value: Document\n}\nexport function formatFolderOrDocumentItem({\n folderFieldName,\n isUpload,\n relationTo,\n useAsTitle,\n value,\n}: Args): FolderOrDocument {\n const itemValue: FolderOrDocument['value'] = {\n id: value?.id,\n _folderOrDocumentTitle: String((useAsTitle && value?.[useAsTitle]) || value['id']),\n createdAt: value?.createdAt,\n folderID: value?.[folderFieldName],\n folderType: value?.folderType || [],\n updatedAt: value?.updatedAt,\n }\n\n if (isUpload) {\n itemValue.filename = value.filename\n itemValue.mimeType = value.mimeType\n itemValue.url =\n value.thumbnailURL ||\n (isImage(value.mimeType)\n ? getBestFitFromSizes({\n sizes: value.sizes,\n targetSizeMax: 520,\n targetSizeMin: 300,\n url: value.url,\n width: value.width,\n })\n : undefined)\n }\n\n return {\n itemKey: `${relationTo}-${value.id}`,\n relationTo,\n value: itemValue,\n }\n}\n"],"names":["isImage","getBestFitFromSizes","formatFolderOrDocumentItem","folderFieldName","isUpload","relationTo","useAsTitle","value","itemValue","id","_folderOrDocumentTitle","String","createdAt","folderID","folderType","updatedAt","filename","mimeType","url","thumbnailURL","sizes","targetSizeMax","targetSizeMin","width","undefined","itemKey"],"mappings":"AAGA,SAASA,OAAO,QAAQ,2BAA0B;AAClD,SAASC,mBAAmB,QAAQ,yCAAwC;AAS5E,OAAO,SAASC,2BAA2B,EACzCC,eAAe,EACfC,QAAQ,EACRC,UAAU,EACVC,UAAU,EACVC,KAAK,EACA;IACL,MAAMC,YAAuC;QAC3CC,IAAIF,OAAOE;QACXC,wBAAwBC,OAAO,AAACL,cAAcC,OAAO,CAACD,WAAW,IAAKC,KAAK,CAAC,KAAK;QACjFK,WAAWL,OAAOK;QAClBC,UAAUN,OAAO,CAACJ,gBAAgB;QAClCW,YAAYP,OAAOO,cAAc,EAAE;QACnCC,WAAWR,OAAOQ;IACpB;IAEA,IAAIX,UAAU;QACZI,UAAUQ,QAAQ,GAAGT,MAAMS,QAAQ;QACnCR,UAAUS,QAAQ,GAAGV,MAAMU,QAAQ;QACnCT,UAAUU,GAAG,GACXX,MAAMY,YAAY,IACjBnB,CAAAA,QAAQO,MAAMU,QAAQ,IACnBhB,oBAAoB;YAClBmB,OAAOb,MAAMa,KAAK;YAClBC,eAAe;YACfC,eAAe;YACfJ,KAAKX,MAAMW,GAAG;YACdK,OAAOhB,MAAMgB,KAAK;QACpB,KACAC,SAAQ;IAChB;IAEA,OAAO;QACLC,SAAS,GAAGpB,WAAW,CAAC,EAAEE,MAAME,EAAE,EAAE;QACpCJ;QACAE,OAAOC;IACT;AACF"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { PayloadRequest } from '../../types/index.js';
|
|
2
|
+
import type { FolderBreadcrumb } from '../types.js';
|
|
3
|
+
type GetFolderBreadcrumbsArgs = {
|
|
4
|
+
breadcrumbs?: FolderBreadcrumb[];
|
|
5
|
+
folderID?: number | string;
|
|
6
|
+
req: PayloadRequest;
|
|
7
|
+
};
|
|
8
|
+
/**
|
|
9
|
+
* Builds breadcrumbs up from child folder
|
|
10
|
+
* all the way up to root folder
|
|
11
|
+
*/
|
|
12
|
+
export declare const getFolderBreadcrumbs: ({ breadcrumbs, folderID, req, }: GetFolderBreadcrumbsArgs) => Promise<FolderBreadcrumb[] | null>;
|
|
13
|
+
export {};
|
|
14
|
+
//# sourceMappingURL=getFolderBreadcrumbs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getFolderBreadcrumbs.d.ts","sourceRoot":"","sources":["../../../src/folders/utils/getFolderBreadcrumbs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAY,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACpE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAEnD,KAAK,wBAAwB,GAAG;IAC9B,WAAW,CAAC,EAAE,gBAAgB,EAAE,CAAA;IAChC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IAC1B,GAAG,EAAE,cAAc,CAAA;CACpB,CAAA;AACD;;;GAGG;AACH,eAAO,MAAM,oBAAoB,oCAI9B,wBAAwB,KAAG,OAAO,CAAC,gBAAgB,EAAE,GAAG,IAAI,CA8C9D,CAAA"}
|