@payloadcms/plugin-multi-tenant 3.53.0 → 3.54.0-canary.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/utilities/getGlobalViewRedirect.d.ts +1 -1
- package/dist/utilities/getGlobalViewRedirect.d.ts.map +1 -1
- package/dist/utilities/getGlobalViewRedirect.js +89 -32
- package/dist/utilities/getGlobalViewRedirect.js.map +1 -1
- package/dist/utilities/getTenantOptions.js +2 -2
- package/dist/utilities/getTenantOptions.js.map +1 -1
- package/package.json +6 -6
|
@@ -15,6 +15,6 @@ type Args = {
|
|
|
15
15
|
userHasAccessToAllTenants: Required<MultiTenantPluginConfig<any>>['userHasAccessToAllTenants'];
|
|
16
16
|
view: ViewTypes;
|
|
17
17
|
};
|
|
18
|
-
export declare function getGlobalViewRedirect({ slug, basePath, docID, headers, payload, tenantFieldName, tenantsArrayFieldName, tenantsArrayTenantFieldName, tenantsCollectionSlug, useAsTitle, user, userHasAccessToAllTenants, view, }: Args): Promise<string | void>;
|
|
18
|
+
export declare function getGlobalViewRedirect({ slug: collectionSlug, basePath, docID, headers, payload, tenantFieldName, tenantsArrayFieldName, tenantsArrayTenantFieldName, tenantsCollectionSlug, useAsTitle, user, userHasAccessToAllTenants, view, }: Args): Promise<string | void>;
|
|
19
19
|
export {};
|
|
20
20
|
//# sourceMappingURL=getGlobalViewRedirect.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getGlobalViewRedirect.d.ts","sourceRoot":"","sources":["../../src/utilities/getGlobalViewRedirect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAK5D,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAA;AAM1D,KAAK,IAAI,GAAG;IACV,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IACvB,OAAO,EAAE,OAAO,CAAA;IAChB,OAAO,EAAE,OAAO,CAAA;IAChB,IAAI,EAAE,MAAM,CAAA;IACZ,eAAe,EAAE,MAAM,CAAA;IACvB,qBAAqB,EAAE,MAAM,CAAA;IAC7B,2BAA2B,EAAE,MAAM,CAAA;IACnC,qBAAqB,EAAE,MAAM,CAAA;IAC7B,UAAU,EAAE,MAAM,CAAA;IAClB,IAAI,CAAC,EAAE,SAAS,CAAA;IAChB,yBAAyB,EAAE,QAAQ,CAAC,uBAAuB,CAAC,GAAG,CAAC,CAAC,CAAC,2BAA2B,CAAC,CAAA;IAC9F,IAAI,EAAE,SAAS,CAAA;CAChB,CAAA;AACD,wBAAsB,qBAAqB,CAAC,EAC1C,IAAI,
|
|
1
|
+
{"version":3,"file":"getGlobalViewRedirect.d.ts","sourceRoot":"","sources":["../../src/utilities/getGlobalViewRedirect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAK5D,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAA;AAM1D,KAAK,IAAI,GAAG;IACV,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IACvB,OAAO,EAAE,OAAO,CAAA;IAChB,OAAO,EAAE,OAAO,CAAA;IAChB,IAAI,EAAE,MAAM,CAAA;IACZ,eAAe,EAAE,MAAM,CAAA;IACvB,qBAAqB,EAAE,MAAM,CAAA;IAC7B,2BAA2B,EAAE,MAAM,CAAA;IACnC,qBAAqB,EAAE,MAAM,CAAA;IAC7B,UAAU,EAAE,MAAM,CAAA;IAClB,IAAI,CAAC,EAAE,SAAS,CAAA;IAChB,yBAAyB,EAAE,QAAQ,CAAC,uBAAuB,CAAC,GAAG,CAAC,CAAC,CAAC,2BAA2B,CAAC,CAAA;IAC9F,IAAI,EAAE,SAAS,CAAA;CAChB,CAAA;AACD,wBAAsB,qBAAqB,CAAC,EAC1C,IAAI,EAAE,cAAc,EACpB,QAAQ,EACR,KAAK,EACL,OAAO,EACP,OAAO,EACP,eAAe,EACf,qBAAqB,EACrB,2BAA2B,EAC3B,qBAAqB,EACrB,UAAU,EACV,IAAI,EACJ,yBAAyB,EACzB,IAAI,GACL,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAqG/B"}
|
|
@@ -3,7 +3,7 @@ import { formatAdminURL } from 'payload/shared';
|
|
|
3
3
|
import { getCollectionIDType } from './getCollectionIDType.js';
|
|
4
4
|
import { getTenantFromCookie } from './getTenantFromCookie.js';
|
|
5
5
|
import { getTenantOptions } from './getTenantOptions.js';
|
|
6
|
-
export async function getGlobalViewRedirect({ slug, basePath, docID, headers, payload, tenantFieldName, tenantsArrayFieldName, tenantsArrayTenantFieldName, tenantsCollectionSlug, useAsTitle, user, userHasAccessToAllTenants, view }) {
|
|
6
|
+
export async function getGlobalViewRedirect({ slug: collectionSlug, basePath, docID, headers, payload, tenantFieldName, tenantsArrayFieldName, tenantsArrayTenantFieldName, tenantsCollectionSlug, useAsTitle, user, userHasAccessToAllTenants, view }) {
|
|
7
7
|
const idType = getCollectionIDType({
|
|
8
8
|
collectionSlug: tenantsCollectionSlug,
|
|
9
9
|
payload
|
|
@@ -25,40 +25,65 @@ export async function getGlobalViewRedirect({ slug, basePath, docID, headers, pa
|
|
|
25
25
|
});
|
|
26
26
|
tenant = tenantOptions[0]?.value || null;
|
|
27
27
|
}
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
28
|
+
if (tenant) {
|
|
29
|
+
try {
|
|
30
|
+
const globalTenantDocQuery = await payload.find({
|
|
31
|
+
collection: collectionSlug,
|
|
32
|
+
depth: 0,
|
|
33
|
+
limit: 1,
|
|
34
|
+
pagination: false,
|
|
35
|
+
select: {
|
|
36
|
+
id: true
|
|
37
|
+
},
|
|
38
|
+
where: {
|
|
39
|
+
[tenantFieldName]: {
|
|
40
|
+
equals: tenant
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
const globalTenantDocID = globalTenantDocQuery?.docs?.[0]?.id;
|
|
45
|
+
if (view === 'document') {
|
|
46
|
+
// global tenant document edit view
|
|
47
|
+
if (globalTenantDocID && docID !== globalTenantDocID) {
|
|
48
|
+
// tenant document already exists but does not match current route docID
|
|
49
|
+
// redirect to matching tenant docID from query
|
|
50
|
+
redirectRoute = `/collections/${collectionSlug}/${globalTenantDocID}`;
|
|
51
|
+
} else if (docID && !globalTenantDocID) {
|
|
52
|
+
// a docID was found in the route but no global document with this tenant exists
|
|
53
|
+
// so we need to generate a redirect to the create route
|
|
54
|
+
redirectRoute = await generateCreateRedirect({
|
|
55
|
+
collectionSlug,
|
|
56
|
+
payload,
|
|
57
|
+
tenantID: tenant
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
} else if (view === 'list') {
|
|
61
|
+
// global tenant document list view
|
|
62
|
+
if (globalTenantDocID) {
|
|
63
|
+
// tenant document exists, redirect from list view to the document edit view
|
|
64
|
+
redirectRoute = `/collections/${collectionSlug}/${globalTenantDocID}`;
|
|
65
|
+
} else {
|
|
66
|
+
// no matching document was found for the current tenant
|
|
67
|
+
// so we need to generate a redirect to the create route
|
|
68
|
+
redirectRoute = await generateCreateRedirect({
|
|
69
|
+
collectionSlug,
|
|
70
|
+
payload,
|
|
71
|
+
tenantID: tenant
|
|
72
|
+
});
|
|
39
73
|
}
|
|
40
74
|
}
|
|
41
|
-
})
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
if (docID && !tenantDocID) {
|
|
45
|
-
// viewing a document with an id but does not match the selected tenant, redirect to create route
|
|
46
|
-
redirectRoute = `/collections/${slug}/create`;
|
|
47
|
-
} else if (tenantDocID && docID !== tenantDocID) {
|
|
48
|
-
// tenant document already exists but does not match current route doc ID, redirect to matching tenant doc
|
|
49
|
-
redirectRoute = `/collections/${slug}/${tenantDocID}`;
|
|
50
|
-
}
|
|
51
|
-
} else if (view === 'list') {
|
|
52
|
-
if (tenantDocID) {
|
|
53
|
-
// tenant document exists, redirect to edit view
|
|
54
|
-
redirectRoute = `/collections/${slug}/${tenantDocID}`;
|
|
55
|
-
} else {
|
|
56
|
-
// tenant document does not exist, redirect to create route
|
|
57
|
-
redirectRoute = `/collections/${slug}/create`;
|
|
58
|
-
}
|
|
75
|
+
} catch (e) {
|
|
76
|
+
const prefix = `${e && typeof e === 'object' && 'message' in e && typeof e.message === 'string' ? `${e.message} - ` : ''}`;
|
|
77
|
+
payload.logger.error(e, `${prefix}Multi Tenant Redirect Error`);
|
|
59
78
|
}
|
|
60
|
-
}
|
|
61
|
-
|
|
79
|
+
} else {
|
|
80
|
+
// no tenants were found, redirect to the admin view
|
|
81
|
+
return formatAdminURL({
|
|
82
|
+
adminRoute: payload.config.routes.admin,
|
|
83
|
+
basePath,
|
|
84
|
+
path: '',
|
|
85
|
+
serverURL: payload.config.serverURL
|
|
86
|
+
});
|
|
62
87
|
}
|
|
63
88
|
if (redirectRoute) {
|
|
64
89
|
return formatAdminURL({
|
|
@@ -68,7 +93,39 @@ export async function getGlobalViewRedirect({ slug, basePath, docID, headers, pa
|
|
|
68
93
|
serverURL: payload.config.serverURL
|
|
69
94
|
});
|
|
70
95
|
}
|
|
96
|
+
// no redirect is needed
|
|
97
|
+
// the current route is valid
|
|
71
98
|
return undefined;
|
|
72
99
|
}
|
|
100
|
+
/**
|
|
101
|
+
* Generate a redirect URL for creating a new document in a multi-tenant collection.
|
|
102
|
+
*
|
|
103
|
+
* If autosave is enabled on the collection, we need to create the document and then redirect to it.
|
|
104
|
+
* Otherwise we can redirect to the default create route.
|
|
105
|
+
*/ async function generateCreateRedirect({ collectionSlug, payload, tenantID }) {
|
|
106
|
+
const collection = payload.collections[collectionSlug];
|
|
107
|
+
if (collection?.config.versions?.drafts && typeof collection.config.versions.drafts === 'object' && collection.config.versions.drafts.autosave) {
|
|
108
|
+
// Autosave is enabled, create a document first
|
|
109
|
+
try {
|
|
110
|
+
const doc = await payload.create({
|
|
111
|
+
collection: collectionSlug,
|
|
112
|
+
data: {
|
|
113
|
+
tenant: tenantID
|
|
114
|
+
},
|
|
115
|
+
depth: 0,
|
|
116
|
+
draft: true,
|
|
117
|
+
select: {
|
|
118
|
+
id: true
|
|
119
|
+
}
|
|
120
|
+
});
|
|
121
|
+
return `/collections/${collectionSlug}/${doc.id}`;
|
|
122
|
+
} catch (error) {
|
|
123
|
+
payload.logger.error(error, `Error creating autosave global multi tenant document for ${collectionSlug}`);
|
|
124
|
+
}
|
|
125
|
+
return '/';
|
|
126
|
+
}
|
|
127
|
+
// Autosave is not enabled, redirect to default create route
|
|
128
|
+
return `/collections/${collectionSlug}/create`;
|
|
129
|
+
}
|
|
73
130
|
|
|
74
131
|
//# sourceMappingURL=getGlobalViewRedirect.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utilities/getGlobalViewRedirect.ts"],"sourcesContent":["import type { Payload, TypedUser, ViewTypes } from 'payload'\n\nimport { unauthorized } from 'next/navigation.js'\nimport { formatAdminURL } from 'payload/shared'\n\nimport type { MultiTenantPluginConfig } from '../types.js'\n\nimport { getCollectionIDType } from './getCollectionIDType.js'\nimport { getTenantFromCookie } from './getTenantFromCookie.js'\nimport { getTenantOptions } from './getTenantOptions.js'\n\ntype Args = {\n basePath?: string\n docID?: number | string\n headers: Headers\n payload: Payload\n slug: string\n tenantFieldName: string\n tenantsArrayFieldName: string\n tenantsArrayTenantFieldName: string\n tenantsCollectionSlug: string\n useAsTitle: string\n user?: TypedUser\n userHasAccessToAllTenants: Required<MultiTenantPluginConfig<any>>['userHasAccessToAllTenants']\n view: ViewTypes\n}\nexport async function getGlobalViewRedirect({\n slug,\n basePath,\n docID,\n headers,\n payload,\n tenantFieldName,\n tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n tenantsCollectionSlug,\n useAsTitle,\n user,\n userHasAccessToAllTenants,\n view,\n}: Args): Promise<string | void> {\n const idType = getCollectionIDType({\n collectionSlug: tenantsCollectionSlug,\n payload,\n })\n let tenant = getTenantFromCookie(headers, idType)\n let redirectRoute: `/${string}` | void = undefined\n\n if (!user) {\n return unauthorized()\n }\n\n if (!tenant) {\n const tenantOptions = await getTenantOptions({\n payload,\n tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n tenantsCollectionSlug,\n useAsTitle,\n user,\n userHasAccessToAllTenants,\n })\n\n tenant = tenantOptions[0]?.value || null\n }\n\n
|
|
1
|
+
{"version":3,"sources":["../../src/utilities/getGlobalViewRedirect.ts"],"sourcesContent":["import type { Payload, TypedUser, ViewTypes } from 'payload'\n\nimport { unauthorized } from 'next/navigation.js'\nimport { formatAdminURL } from 'payload/shared'\n\nimport type { MultiTenantPluginConfig } from '../types.js'\n\nimport { getCollectionIDType } from './getCollectionIDType.js'\nimport { getTenantFromCookie } from './getTenantFromCookie.js'\nimport { getTenantOptions } from './getTenantOptions.js'\n\ntype Args = {\n basePath?: string\n docID?: number | string\n headers: Headers\n payload: Payload\n slug: string\n tenantFieldName: string\n tenantsArrayFieldName: string\n tenantsArrayTenantFieldName: string\n tenantsCollectionSlug: string\n useAsTitle: string\n user?: TypedUser\n userHasAccessToAllTenants: Required<MultiTenantPluginConfig<any>>['userHasAccessToAllTenants']\n view: ViewTypes\n}\nexport async function getGlobalViewRedirect({\n slug: collectionSlug,\n basePath,\n docID,\n headers,\n payload,\n tenantFieldName,\n tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n tenantsCollectionSlug,\n useAsTitle,\n user,\n userHasAccessToAllTenants,\n view,\n}: Args): Promise<string | void> {\n const idType = getCollectionIDType({\n collectionSlug: tenantsCollectionSlug,\n payload,\n })\n let tenant = getTenantFromCookie(headers, idType)\n let redirectRoute: `/${string}` | void = undefined\n\n if (!user) {\n return unauthorized()\n }\n\n if (!tenant) {\n const tenantOptions = await getTenantOptions({\n payload,\n tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n tenantsCollectionSlug,\n useAsTitle,\n user,\n userHasAccessToAllTenants,\n })\n\n tenant = tenantOptions[0]?.value || null\n }\n\n if (tenant) {\n try {\n const globalTenantDocQuery = await payload.find({\n collection: collectionSlug,\n depth: 0,\n limit: 1,\n pagination: false,\n select: {\n id: true,\n },\n where: {\n [tenantFieldName]: {\n equals: tenant,\n },\n },\n })\n\n const globalTenantDocID = globalTenantDocQuery?.docs?.[0]?.id\n\n if (view === 'document') {\n // global tenant document edit view\n if (globalTenantDocID && docID !== globalTenantDocID) {\n // tenant document already exists but does not match current route docID\n // redirect to matching tenant docID from query\n redirectRoute = `/collections/${collectionSlug}/${globalTenantDocID}`\n } else if (docID && !globalTenantDocID) {\n // a docID was found in the route but no global document with this tenant exists\n // so we need to generate a redirect to the create route\n redirectRoute = await generateCreateRedirect({\n collectionSlug,\n payload,\n tenantID: tenant,\n })\n }\n } else if (view === 'list') {\n // global tenant document list view\n if (globalTenantDocID) {\n // tenant document exists, redirect from list view to the document edit view\n redirectRoute = `/collections/${collectionSlug}/${globalTenantDocID}`\n } else {\n // no matching document was found for the current tenant\n // so we need to generate a redirect to the create route\n redirectRoute = await generateCreateRedirect({\n collectionSlug,\n payload,\n tenantID: tenant,\n })\n }\n }\n } catch (e: unknown) {\n const prefix = `${e && typeof e === 'object' && 'message' in e && typeof e.message === 'string' ? `${e.message} - ` : ''}`\n payload.logger.error(e, `${prefix}Multi Tenant Redirect Error`)\n }\n } else {\n // no tenants were found, redirect to the admin view\n return formatAdminURL({\n adminRoute: payload.config.routes.admin,\n basePath,\n path: '',\n serverURL: payload.config.serverURL,\n })\n }\n\n if (redirectRoute) {\n return formatAdminURL({\n adminRoute: payload.config.routes.admin,\n basePath,\n path: redirectRoute,\n serverURL: payload.config.serverURL,\n })\n }\n\n // no redirect is needed\n // the current route is valid\n return undefined\n}\n\ntype GenerateCreateArgs = {\n collectionSlug: string\n payload: Payload\n tenantID: number | string\n}\n/**\n * Generate a redirect URL for creating a new document in a multi-tenant collection.\n *\n * If autosave is enabled on the collection, we need to create the document and then redirect to it.\n * Otherwise we can redirect to the default create route.\n */\nasync function generateCreateRedirect({\n collectionSlug,\n payload,\n tenantID,\n}: GenerateCreateArgs): Promise<`/${string}` | undefined> {\n const collection = payload.collections[collectionSlug]\n if (\n collection?.config.versions?.drafts &&\n typeof collection.config.versions.drafts === 'object' &&\n collection.config.versions.drafts.autosave\n ) {\n // Autosave is enabled, create a document first\n try {\n const doc = await payload.create({\n collection: collectionSlug,\n data: {\n tenant: tenantID,\n },\n depth: 0,\n draft: true,\n select: {\n id: true,\n },\n })\n return `/collections/${collectionSlug}/${doc.id}`\n } catch (error) {\n payload.logger.error(\n error,\n `Error creating autosave global multi tenant document for ${collectionSlug}`,\n )\n }\n\n return '/'\n }\n\n // Autosave is not enabled, redirect to default create route\n return `/collections/${collectionSlug}/create`\n}\n"],"names":["unauthorized","formatAdminURL","getCollectionIDType","getTenantFromCookie","getTenantOptions","getGlobalViewRedirect","slug","collectionSlug","basePath","docID","headers","payload","tenantFieldName","tenantsArrayFieldName","tenantsArrayTenantFieldName","tenantsCollectionSlug","useAsTitle","user","userHasAccessToAllTenants","view","idType","tenant","redirectRoute","undefined","tenantOptions","value","globalTenantDocQuery","find","collection","depth","limit","pagination","select","id","where","equals","globalTenantDocID","docs","generateCreateRedirect","tenantID","e","prefix","message","logger","error","adminRoute","config","routes","admin","path","serverURL","collections","versions","drafts","autosave","doc","create","data","draft"],"mappings":"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"}
|
|
@@ -13,9 +13,9 @@ export const getTenantOptions = async ({ payload, tenantsArrayFieldName, tenants
|
|
|
13
13
|
overrideAccess: false,
|
|
14
14
|
select: {
|
|
15
15
|
[useAsTitle]: true,
|
|
16
|
-
...isOrderable
|
|
16
|
+
...isOrderable && {
|
|
17
17
|
_order: true
|
|
18
|
-
}
|
|
18
|
+
}
|
|
19
19
|
},
|
|
20
20
|
sort: isOrderable ? '_order' : useAsTitle,
|
|
21
21
|
user
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utilities/getTenantOptions.ts"],"sourcesContent":["import type { OptionObject, Payload, TypedUser } from 'payload'\n\nimport type { MultiTenantPluginConfig } from '../types.js'\n\nexport const getTenantOptions = async ({\n payload,\n tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n tenantsCollectionSlug,\n useAsTitle,\n user,\n userHasAccessToAllTenants,\n}: {\n payload: Payload\n tenantsArrayFieldName: string\n tenantsArrayTenantFieldName: string\n tenantsCollectionSlug: string\n useAsTitle: string\n user: TypedUser\n userHasAccessToAllTenants: Required<MultiTenantPluginConfig<any>>['userHasAccessToAllTenants']\n}): Promise<OptionObject[]> => {\n let tenantOptions: OptionObject[] = []\n\n if (!user) {\n return tenantOptions\n }\n\n if (userHasAccessToAllTenants(user)) {\n // If the user has access to all tenants get them from the DB\n const isOrderable = payload.collections[tenantsCollectionSlug]?.config?.orderable || false\n const tenants = await payload.find({\n collection: tenantsCollectionSlug,\n depth: 0,\n limit: 0,\n overrideAccess: false,\n select: {\n [useAsTitle]: true,\n ...(isOrderable
|
|
1
|
+
{"version":3,"sources":["../../src/utilities/getTenantOptions.ts"],"sourcesContent":["import type { OptionObject, Payload, TypedUser } from 'payload'\n\nimport type { MultiTenantPluginConfig } from '../types.js'\n\nexport const getTenantOptions = async ({\n payload,\n tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n tenantsCollectionSlug,\n useAsTitle,\n user,\n userHasAccessToAllTenants,\n}: {\n payload: Payload\n tenantsArrayFieldName: string\n tenantsArrayTenantFieldName: string\n tenantsCollectionSlug: string\n useAsTitle: string\n user: TypedUser\n userHasAccessToAllTenants: Required<MultiTenantPluginConfig<any>>['userHasAccessToAllTenants']\n}): Promise<OptionObject[]> => {\n let tenantOptions: OptionObject[] = []\n\n if (!user) {\n return tenantOptions\n }\n\n if (userHasAccessToAllTenants(user)) {\n // If the user has access to all tenants get them from the DB\n const isOrderable = payload.collections[tenantsCollectionSlug]?.config?.orderable || false\n const tenants = await payload.find({\n collection: tenantsCollectionSlug,\n depth: 0,\n limit: 0,\n overrideAccess: false,\n select: {\n [useAsTitle]: true,\n ...(isOrderable && { _order: true }),\n },\n sort: isOrderable ? '_order' : useAsTitle,\n user,\n })\n\n tenantOptions = tenants.docs.map((doc) => ({\n label: String(doc[useAsTitle as 'id']), // useAsTitle is dynamic but the type thinks we are only selecting `id` | `_order`\n value: doc.id as string,\n }))\n } else {\n const tenantsToPopulate: (number | string)[] = []\n\n // i.e. users.tenants\n ;((user[tenantsArrayFieldName] as { [key: string]: any }[]) || []).map((tenantRow) => {\n const tenantField = tenantRow[tenantsArrayTenantFieldName] // tenants.tenant\n if (typeof tenantField === 'string' || typeof tenantField === 'number') {\n tenantsToPopulate.push(tenantField)\n } else if (tenantField && typeof tenantField === 'object') {\n tenantOptions.push({\n label: String(tenantField[useAsTitle]),\n value: tenantField.id,\n })\n }\n })\n\n if (tenantsToPopulate.length > 0) {\n const populatedTenants = await payload.find({\n collection: tenantsCollectionSlug,\n depth: 0,\n limit: 0,\n overrideAccess: false,\n user,\n where: {\n id: {\n in: tenantsToPopulate,\n },\n },\n })\n\n tenantOptions = populatedTenants.docs.map((doc) => ({\n label: String(doc[useAsTitle]),\n value: doc.id as string,\n }))\n }\n }\n\n return tenantOptions\n}\n"],"names":["getTenantOptions","payload","tenantsArrayFieldName","tenantsArrayTenantFieldName","tenantsCollectionSlug","useAsTitle","user","userHasAccessToAllTenants","tenantOptions","isOrderable","collections","config","orderable","tenants","find","collection","depth","limit","overrideAccess","select","_order","sort","docs","map","doc","label","String","value","id","tenantsToPopulate","tenantRow","tenantField","push","length","populatedTenants","where","in"],"mappings":"AAIA,OAAO,MAAMA,mBAAmB,OAAO,EACrCC,OAAO,EACPC,qBAAqB,EACrBC,2BAA2B,EAC3BC,qBAAqB,EACrBC,UAAU,EACVC,IAAI,EACJC,yBAAyB,EAS1B;IACC,IAAIC,gBAAgC,EAAE;IAEtC,IAAI,CAACF,MAAM;QACT,OAAOE;IACT;IAEA,IAAID,0BAA0BD,OAAO;QACnC,6DAA6D;QAC7D,MAAMG,cAAcR,QAAQS,WAAW,CAACN,sBAAsB,EAAEO,QAAQC,aAAa;QACrF,MAAMC,UAAU,MAAMZ,QAAQa,IAAI,CAAC;YACjCC,YAAYX;YACZY,OAAO;YACPC,OAAO;YACPC,gBAAgB;YAChBC,QAAQ;gBACN,CAACd,WAAW,EAAE;gBACd,GAAII,eAAe;oBAAEW,QAAQ;gBAAK,CAAC;YACrC;YACAC,MAAMZ,cAAc,WAAWJ;YAC/BC;QACF;QAEAE,gBAAgBK,QAAQS,IAAI,CAACC,GAAG,CAAC,CAACC,MAAS,CAAA;gBACzCC,OAAOC,OAAOF,GAAG,CAACnB,WAAmB;gBACrCsB,OAAOH,IAAII,EAAE;YACf,CAAA;IACF,OAAO;QACL,MAAMC,oBAAyC,EAAE;QAG/C,CAAA,AAACvB,IAAI,CAACJ,sBAAsB,IAAiC,EAAE,AAAD,EAAGqB,GAAG,CAAC,CAACO;YACtE,MAAMC,cAAcD,SAAS,CAAC3B,4BAA4B,CAAC,iBAAiB;;YAC5E,IAAI,OAAO4B,gBAAgB,YAAY,OAAOA,gBAAgB,UAAU;gBACtEF,kBAAkBG,IAAI,CAACD;YACzB,OAAO,IAAIA,eAAe,OAAOA,gBAAgB,UAAU;gBACzDvB,cAAcwB,IAAI,CAAC;oBACjBP,OAAOC,OAAOK,WAAW,CAAC1B,WAAW;oBACrCsB,OAAOI,YAAYH,EAAE;gBACvB;YACF;QACF;QAEA,IAAIC,kBAAkBI,MAAM,GAAG,GAAG;YAChC,MAAMC,mBAAmB,MAAMjC,QAAQa,IAAI,CAAC;gBAC1CC,YAAYX;gBACZY,OAAO;gBACPC,OAAO;gBACPC,gBAAgB;gBAChBZ;gBACA6B,OAAO;oBACLP,IAAI;wBACFQ,IAAIP;oBACN;gBACF;YACF;YAEArB,gBAAgB0B,iBAAiBZ,IAAI,CAACC,GAAG,CAAC,CAACC,MAAS,CAAA;oBAClDC,OAAOC,OAAOF,GAAG,CAACnB,WAAW;oBAC7BsB,OAAOH,IAAII,EAAE;gBACf,CAAA;QACF;IACF;IAEA,OAAOpB;AACT,EAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@payloadcms/plugin-multi-tenant",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.54.0-canary.1",
|
|
4
4
|
"description": "Multi Tenant plugin for Payload",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"payload",
|
|
@@ -81,14 +81,14 @@
|
|
|
81
81
|
],
|
|
82
82
|
"devDependencies": {
|
|
83
83
|
"@payloadcms/eslint-config": "3.28.0",
|
|
84
|
-
"@payloadcms/translations": "3.
|
|
85
|
-
"@payloadcms/ui": "3.
|
|
86
|
-
"payload": "3.
|
|
84
|
+
"@payloadcms/translations": "3.54.0-canary.1",
|
|
85
|
+
"@payloadcms/ui": "3.54.0-canary.1",
|
|
86
|
+
"payload": "3.54.0-canary.1"
|
|
87
87
|
},
|
|
88
88
|
"peerDependencies": {
|
|
89
89
|
"next": "^15.2.3",
|
|
90
|
-
"@payloadcms/ui": "3.
|
|
91
|
-
"payload": "3.
|
|
90
|
+
"@payloadcms/ui": "3.54.0-canary.1",
|
|
91
|
+
"payload": "3.54.0-canary.1"
|
|
92
92
|
},
|
|
93
93
|
"homepage:": "https://payloadcms.com",
|
|
94
94
|
"scripts": {
|