@payloadcms/plugin-multi-tenant 3.54.0-canary.0 → 3.54.0-internal.84621da

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.
@@ -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,EACJ,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,CA6E/B"}
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
- try {
29
- const { docs } = await payload.find({
30
- collection: slug,
31
- depth: 0,
32
- limit: 1,
33
- overrideAccess: false,
34
- pagination: false,
35
- user,
36
- where: {
37
- [tenantFieldName]: {
38
- equals: tenant
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
- const tenantDocID = docs?.[0]?.id;
43
- if (view === 'document') {
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
- } catch (e) {
61
- payload.logger.error(e, `${typeof e === 'object' && e && 'message' in e ? `e?.message - ` : ''}Multi Tenant Redirect Error`);
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 try {\n const { docs } = await payload.find({\n collection: slug,\n depth: 0,\n limit: 1,\n overrideAccess: false,\n pagination: false,\n user,\n where: {\n [tenantFieldName]: {\n equals: tenant,\n },\n },\n })\n\n const tenantDocID = docs?.[0]?.id\n\n if (view === 'document') {\n if (docID && !tenantDocID) {\n // viewing a document with an id but does not match the selected tenant, redirect to create route\n redirectRoute = `/collections/${slug}/create`\n } else if (tenantDocID && docID !== tenantDocID) {\n // tenant document already exists but does not match current route doc ID, redirect to matching tenant doc\n redirectRoute = `/collections/${slug}/${tenantDocID}`\n }\n } else if (view === 'list') {\n if (tenantDocID) {\n // tenant document exists, redirect to edit view\n redirectRoute = `/collections/${slug}/${tenantDocID}`\n } else {\n // tenant document does not exist, redirect to create route\n redirectRoute = `/collections/${slug}/create`\n }\n }\n } catch (e: unknown) {\n payload.logger.error(\n e,\n `${typeof e === 'object' && e && 'message' in e ? `e?.message - ` : ''}Multi Tenant Redirect Error`,\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 return undefined\n}\n"],"names":["unauthorized","formatAdminURL","getCollectionIDType","getTenantFromCookie","getTenantOptions","getGlobalViewRedirect","slug","basePath","docID","headers","payload","tenantFieldName","tenantsArrayFieldName","tenantsArrayTenantFieldName","tenantsCollectionSlug","useAsTitle","user","userHasAccessToAllTenants","view","idType","collectionSlug","tenant","redirectRoute","undefined","tenantOptions","value","docs","find","collection","depth","limit","overrideAccess","pagination","where","equals","tenantDocID","id","e","logger","error","adminRoute","config","routes","admin","path","serverURL"],"mappings":"AAEA,SAASA,YAAY,QAAQ,qBAAoB;AACjD,SAASC,cAAc,QAAQ,iBAAgB;AAI/C,SAASC,mBAAmB,QAAQ,2BAA0B;AAC9D,SAASC,mBAAmB,QAAQ,2BAA0B;AAC9D,SAASC,gBAAgB,QAAQ,wBAAuB;AAiBxD,OAAO,eAAeC,sBAAsB,EAC1CC,IAAI,EACJC,QAAQ,EACRC,KAAK,EACLC,OAAO,EACPC,OAAO,EACPC,eAAe,EACfC,qBAAqB,EACrBC,2BAA2B,EAC3BC,qBAAqB,EACrBC,UAAU,EACVC,IAAI,EACJC,yBAAyB,EACzBC,IAAI,EACC;IACL,MAAMC,SAASjB,oBAAoB;QACjCkB,gBAAgBN;QAChBJ;IACF;IACA,IAAIW,SAASlB,oBAAoBM,SAASU;IAC1C,IAAIG,gBAAqCC;IAEzC,IAAI,CAACP,MAAM;QACT,OAAOhB;IACT;IAEA,IAAI,CAACqB,QAAQ;QACX,MAAMG,gBAAgB,MAAMpB,iBAAiB;YAC3CM;YACAE;YACAC;YACAC;YACAC;YACAC;YACAC;QACF;QAEAI,SAASG,aAAa,CAAC,EAAE,EAAEC,SAAS;IACtC;IAEA,IAAI;QACF,MAAM,EAAEC,IAAI,EAAE,GAAG,MAAMhB,QAAQiB,IAAI,CAAC;YAClCC,YAAYtB;YACZuB,OAAO;YACPC,OAAO;YACPC,gBAAgB;YAChBC,YAAY;YACZhB;YACAiB,OAAO;gBACL,CAACtB,gBAAgB,EAAE;oBACjBuB,QAAQb;gBACV;YACF;QACF;QAEA,MAAMc,cAAcT,MAAM,CAAC,EAAE,EAAEU;QAE/B,IAAIlB,SAAS,YAAY;YACvB,IAAIV,SAAS,CAAC2B,aAAa;gBACzB,iGAAiG;gBACjGb,gBAAgB,CAAC,aAAa,EAAEhB,KAAK,OAAO,CAAC;YAC/C,OAAO,IAAI6B,eAAe3B,UAAU2B,aAAa;gBAC/C,0GAA0G;gBAC1Gb,gBAAgB,CAAC,aAAa,EAAEhB,KAAK,CAAC,EAAE6B,aAAa;YACvD;QACF,OAAO,IAAIjB,SAAS,QAAQ;YAC1B,IAAIiB,aAAa;gBACf,gDAAgD;gBAChDb,gBAAgB,CAAC,aAAa,EAAEhB,KAAK,CAAC,EAAE6B,aAAa;YACvD,OAAO;gBACL,2DAA2D;gBAC3Db,gBAAgB,CAAC,aAAa,EAAEhB,KAAK,OAAO,CAAC;YAC/C;QACF;IACF,EAAE,OAAO+B,GAAY;QACnB3B,QAAQ4B,MAAM,CAACC,KAAK,CAClBF,GACA,GAAG,OAAOA,MAAM,YAAYA,KAAK,aAAaA,IAAI,CAAC,aAAa,CAAC,GAAG,GAAG,2BAA2B,CAAC;IAEvG;IAEA,IAAIf,eAAe;QACjB,OAAOrB,eAAe;YACpBuC,YAAY9B,QAAQ+B,MAAM,CAACC,MAAM,CAACC,KAAK;YACvCpC;YACAqC,MAAMtB;YACNuB,WAAWnC,QAAQ+B,MAAM,CAACI,SAAS;QACrC;IACF;IAEA,OAAOtB;AACT"}
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 ? { _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,cAAc;oBAAEW,QAAQ;gBAAK,IAAI,CAAC,CAAC;YACzC;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"}
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.54.0-canary.0",
3
+ "version": "3.54.0-internal.84621da",
4
4
  "description": "Multi Tenant plugin for Payload",
5
5
  "keywords": [
6
6
  "payload",
@@ -80,15 +80,15 @@
80
80
  "types.d.ts"
81
81
  ],
82
82
  "devDependencies": {
83
+ "@payloadcms/translations": "3.54.0-internal.84621da",
83
84
  "@payloadcms/eslint-config": "3.28.0",
84
- "@payloadcms/ui": "3.54.0-canary.0",
85
- "@payloadcms/translations": "3.54.0-canary.0",
86
- "payload": "3.54.0-canary.0"
85
+ "@payloadcms/ui": "3.54.0-internal.84621da",
86
+ "payload": "3.54.0-internal.84621da"
87
87
  },
88
88
  "peerDependencies": {
89
89
  "next": "^15.2.3",
90
- "@payloadcms/ui": "3.54.0-canary.0",
91
- "payload": "3.54.0-canary.0"
90
+ "@payloadcms/ui": "3.54.0-internal.84621da",
91
+ "payload": "3.54.0-internal.84621da"
92
92
  },
93
93
  "homepage:": "https://payloadcms.com",
94
94
  "scripts": {