@payloadcms/plugin-multi-tenant 3.19.0 → 3.20.0-canary.0e01b65

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.
Files changed (56) hide show
  1. package/dist/components/GlobalViewRedirect/index.d.ts +2 -0
  2. package/dist/components/GlobalViewRedirect/index.d.ts.map +1 -1
  3. package/dist/components/GlobalViewRedirect/index.js +3 -0
  4. package/dist/components/GlobalViewRedirect/index.js.map +1 -1
  5. package/dist/fields/tenantField/index.d.ts.map +1 -1
  6. package/dist/fields/tenantField/index.js +7 -1
  7. package/dist/fields/tenantField/index.js.map +1 -1
  8. package/dist/fields/tenantsArrayField/index.d.ts +1 -0
  9. package/dist/fields/tenantsArrayField/index.d.ts.map +1 -1
  10. package/dist/fields/tenantsArrayField/index.js +1 -1
  11. package/dist/fields/tenantsArrayField/index.js.map +1 -1
  12. package/dist/hooks/afterTenantDelete.d.ts +3 -2
  13. package/dist/hooks/afterTenantDelete.d.ts.map +1 -1
  14. package/dist/hooks/afterTenantDelete.js +9 -3
  15. package/dist/hooks/afterTenantDelete.js.map +1 -1
  16. package/dist/index.d.ts.map +1 -1
  17. package/dist/index.js +22 -5
  18. package/dist/index.js.map +1 -1
  19. package/dist/providers/TenantSelectionProvider/index.client.d.ts +3 -2
  20. package/dist/providers/TenantSelectionProvider/index.client.d.ts.map +1 -1
  21. package/dist/providers/TenantSelectionProvider/index.client.js +41 -8
  22. package/dist/providers/TenantSelectionProvider/index.client.js.map +1 -1
  23. package/dist/providers/TenantSelectionProvider/index.d.ts.map +1 -1
  24. package/dist/providers/TenantSelectionProvider/index.js +19 -9
  25. package/dist/providers/TenantSelectionProvider/index.js.map +1 -1
  26. package/dist/queries/findTenantOptions.d.ts +11 -0
  27. package/dist/queries/findTenantOptions.d.ts.map +1 -0
  28. package/dist/queries/findTenantOptions.js +15 -0
  29. package/dist/queries/findTenantOptions.js.map +1 -0
  30. package/dist/utilities/addCollectionAccess.d.ts +1 -0
  31. package/dist/utilities/addCollectionAccess.d.ts.map +1 -1
  32. package/dist/utilities/addCollectionAccess.js +1 -0
  33. package/dist/utilities/addCollectionAccess.js.map +1 -1
  34. package/dist/utilities/addFilterOptionsToFields.d.ts +3 -1
  35. package/dist/utilities/addFilterOptionsToFields.d.ts.map +1 -1
  36. package/dist/utilities/addFilterOptionsToFields.js +35 -10
  37. package/dist/utilities/addFilterOptionsToFields.js.map +1 -1
  38. package/dist/utilities/getCollectionIDType.d.ts +8 -0
  39. package/dist/utilities/getCollectionIDType.d.ts.map +1 -0
  40. package/dist/utilities/getCollectionIDType.js +5 -0
  41. package/dist/utilities/getCollectionIDType.js.map +1 -0
  42. package/dist/utilities/getGlobalViewRedirect.d.ts +5 -2
  43. package/dist/utilities/getGlobalViewRedirect.d.ts.map +1 -1
  44. package/dist/utilities/getGlobalViewRedirect.js +48 -32
  45. package/dist/utilities/getGlobalViewRedirect.js.map +1 -1
  46. package/dist/utilities/getTenantFromCookie.js +1 -1
  47. package/dist/utilities/getTenantFromCookie.js.map +1 -1
  48. package/dist/utilities/getTenantListFilter.d.ts +2 -1
  49. package/dist/utilities/getTenantListFilter.d.ts.map +1 -1
  50. package/dist/utilities/getTenantListFilter.js +7 -2
  51. package/dist/utilities/getTenantListFilter.js.map +1 -1
  52. package/dist/utilities/withTenantListFilter.d.ts +2 -1
  53. package/dist/utilities/withTenantListFilter.d.ts.map +1 -1
  54. package/dist/utilities/withTenantListFilter.js +3 -2
  55. package/dist/utilities/withTenantListFilter.js.map +1 -1
  56. package/package.json +5 -5
@@ -7,6 +7,7 @@ type Args<ConfigType> = {
7
7
  };
8
8
  /**
9
9
  * Adds tenant access constraint to collection
10
+ * - constrains access a users assigned tenants
10
11
  */
11
12
  export declare const addCollectionAccess: <ConfigType>({ collection, fieldName, userHasAccessToAllTenants, }: Args<ConfigType>) => void;
12
13
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"addCollectionAccess.d.ts","sourceRoot":"","sources":["../../src/utilities/addCollectionAccess.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAU,gBAAgB,EAAE,MAAM,SAAS,CAAA;AAEvD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAA;AAiB1D,KAAK,IAAI,CAAC,UAAU,IAAI;IACtB,UAAU,EAAE,gBAAgB,CAAA;IAC5B,SAAS,EAAE,MAAM,CAAA;IACjB,yBAAyB,EAAE,QAAQ,CACjC,uBAAuB,CAAC,UAAU,CAAC,CACpC,CAAC,2BAA2B,CAAC,CAAA;CAC/B,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,mBAAmB,GAAI,UAAU,yDAI3C,IAAI,CAAC,UAAU,CAAC,KAAG,IAkBrB,CAAA"}
1
+ {"version":3,"file":"addCollectionAccess.d.ts","sourceRoot":"","sources":["../../src/utilities/addCollectionAccess.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAU,gBAAgB,EAAE,MAAM,SAAS,CAAA;AAEvD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAA;AAiB1D,KAAK,IAAI,CAAC,UAAU,IAAI;IACtB,UAAU,EAAE,gBAAgB,CAAA;IAC5B,SAAS,EAAE,MAAM,CAAA;IACjB,yBAAyB,EAAE,QAAQ,CACjC,uBAAuB,CAAC,UAAU,CAAC,CACpC,CAAC,2BAA2B,CAAC,CAAA;CAC/B,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,mBAAmB,GAAI,UAAU,yDAI3C,IAAI,CAAC,UAAU,CAAC,KAAG,IAkBrB,CAAA"}
@@ -9,6 +9,7 @@ const collectionAccessKeys = [
9
9
  ];
10
10
  /**
11
11
  * Adds tenant access constraint to collection
12
+ * - constrains access a users assigned tenants
12
13
  */ export const addCollectionAccess = ({ collection, fieldName, userHasAccessToAllTenants })=>{
13
14
  if (!collection?.access) {
14
15
  collection.access = {};
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utilities/addCollectionAccess.ts"],"sourcesContent":["import type { Access, CollectionConfig } from 'payload'\n\nimport type { MultiTenantPluginConfig } from '../types.js'\n\nimport { withTenantAccess } from './withTenantAccess.js'\n\ntype AllAccessKeys<T extends readonly string[]> = T[number] extends keyof Omit<\n Required<CollectionConfig>['access'],\n 'admin'\n>\n ? keyof Omit<Required<CollectionConfig>['access'], 'admin'> extends T[number]\n ? T\n : never\n : never\n\nconst collectionAccessKeys: AllAccessKeys<\n ['create', 'read', 'update', 'delete', 'readVersions', 'unlock']\n> = ['create', 'read', 'update', 'delete', 'readVersions', 'unlock'] as const\n\ntype Args<ConfigType> = {\n collection: CollectionConfig\n fieldName: string\n userHasAccessToAllTenants: Required<\n MultiTenantPluginConfig<ConfigType>\n >['userHasAccessToAllTenants']\n}\n\n/**\n * Adds tenant access constraint to collection\n */\nexport const addCollectionAccess = <ConfigType>({\n collection,\n fieldName,\n userHasAccessToAllTenants,\n}: Args<ConfigType>): void => {\n if (!collection?.access) {\n collection.access = {}\n }\n collectionAccessKeys.reduce<{\n [key in (typeof collectionAccessKeys)[number]]?: Access\n }>((acc, key) => {\n if (!collection.access) {\n return acc\n }\n collection.access[key] = withTenantAccess<ConfigType>({\n accessFunction: collection.access?.[key],\n fieldName,\n userHasAccessToAllTenants,\n })\n\n return acc\n }, {})\n}\n"],"names":["withTenantAccess","collectionAccessKeys","addCollectionAccess","collection","fieldName","userHasAccessToAllTenants","access","reduce","acc","key","accessFunction"],"mappings":"AAIA,SAASA,gBAAgB,QAAQ,wBAAuB;AAWxD,MAAMC,uBAEF;IAAC;IAAU;IAAQ;IAAU;IAAU;IAAgB;CAAS;AAUpE;;CAEC,GACD,OAAO,MAAMC,sBAAsB,CAAa,EAC9CC,UAAU,EACVC,SAAS,EACTC,yBAAyB,EACR;IACjB,IAAI,CAACF,YAAYG,QAAQ;QACvBH,WAAWG,MAAM,GAAG,CAAC;IACvB;IACAL,qBAAqBM,MAAM,CAExB,CAACC,KAAKC;QACP,IAAI,CAACN,WAAWG,MAAM,EAAE;YACtB,OAAOE;QACT;QACAL,WAAWG,MAAM,CAACG,IAAI,GAAGT,iBAA6B;YACpDU,gBAAgBP,WAAWG,MAAM,EAAE,CAACG,IAAI;YACxCL;YACAC;QACF;QAEA,OAAOG;IACT,GAAG,CAAC;AACN,EAAC"}
1
+ {"version":3,"sources":["../../src/utilities/addCollectionAccess.ts"],"sourcesContent":["import type { Access, CollectionConfig } from 'payload'\n\nimport type { MultiTenantPluginConfig } from '../types.js'\n\nimport { withTenantAccess } from './withTenantAccess.js'\n\ntype AllAccessKeys<T extends readonly string[]> = T[number] extends keyof Omit<\n Required<CollectionConfig>['access'],\n 'admin'\n>\n ? keyof Omit<Required<CollectionConfig>['access'], 'admin'> extends T[number]\n ? T\n : never\n : never\n\nconst collectionAccessKeys: AllAccessKeys<\n ['create', 'read', 'update', 'delete', 'readVersions', 'unlock']\n> = ['create', 'read', 'update', 'delete', 'readVersions', 'unlock'] as const\n\ntype Args<ConfigType> = {\n collection: CollectionConfig\n fieldName: string\n userHasAccessToAllTenants: Required<\n MultiTenantPluginConfig<ConfigType>\n >['userHasAccessToAllTenants']\n}\n\n/**\n * Adds tenant access constraint to collection\n * - constrains access a users assigned tenants\n */\nexport const addCollectionAccess = <ConfigType>({\n collection,\n fieldName,\n userHasAccessToAllTenants,\n}: Args<ConfigType>): void => {\n if (!collection?.access) {\n collection.access = {}\n }\n collectionAccessKeys.reduce<{\n [key in (typeof collectionAccessKeys)[number]]?: Access\n }>((acc, key) => {\n if (!collection.access) {\n return acc\n }\n collection.access[key] = withTenantAccess<ConfigType>({\n accessFunction: collection.access?.[key],\n fieldName,\n userHasAccessToAllTenants,\n })\n\n return acc\n }, {})\n}\n"],"names":["withTenantAccess","collectionAccessKeys","addCollectionAccess","collection","fieldName","userHasAccessToAllTenants","access","reduce","acc","key","accessFunction"],"mappings":"AAIA,SAASA,gBAAgB,QAAQ,wBAAuB;AAWxD,MAAMC,uBAEF;IAAC;IAAU;IAAQ;IAAU;IAAU;IAAgB;CAAS;AAUpE;;;CAGC,GACD,OAAO,MAAMC,sBAAsB,CAAa,EAC9CC,UAAU,EACVC,SAAS,EACTC,yBAAyB,EACR;IACjB,IAAI,CAACF,YAAYG,QAAQ;QACvBH,WAAWG,MAAM,GAAG,CAAC;IACvB;IACAL,qBAAqBM,MAAM,CAExB,CAACC,KAAKC;QACP,IAAI,CAACN,WAAWG,MAAM,EAAE;YACtB,OAAOE;QACT;QACAL,WAAWG,MAAM,CAACG,IAAI,GAAGT,iBAA6B;YACpDU,gBAAgBP,WAAWG,MAAM,EAAE,CAACG,IAAI;YACxCL;YACAC;QACF;QAEA,OAAOG;IACT,GAAG,CAAC;AACN,EAAC"}
@@ -3,7 +3,9 @@ type AddFilterOptionsToFieldsArgs = {
3
3
  fields: Field[];
4
4
  tenantEnabledCollectionSlugs: string[];
5
5
  tenantEnabledGlobalSlugs: string[];
6
+ tenantFieldName: string;
7
+ tenantsCollectionSlug: string;
6
8
  };
7
- export declare function addFilterOptionsToFields({ fields, tenantEnabledCollectionSlugs, tenantEnabledGlobalSlugs, }: AddFilterOptionsToFieldsArgs): void;
9
+ export declare function addFilterOptionsToFields({ fields, tenantEnabledCollectionSlugs, tenantEnabledGlobalSlugs, tenantFieldName, tenantsCollectionSlug, }: AddFilterOptionsToFieldsArgs): void;
8
10
  export {};
9
11
  //# sourceMappingURL=addFilterOptionsToFields.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"addFilterOptionsToFields.d.ts","sourceRoot":"","sources":["../../src/utilities/addFilterOptionsToFields.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAyC,MAAM,SAAS,CAAA;AAI3E,KAAK,4BAA4B,GAAG;IAClC,MAAM,EAAE,KAAK,EAAE,CAAA;IACf,4BAA4B,EAAE,MAAM,EAAE,CAAA;IACtC,wBAAwB,EAAE,MAAM,EAAE,CAAA;CACnC,CAAA;AAED,wBAAgB,wBAAwB,CAAC,EACvC,MAAM,EACN,4BAA4B,EAC5B,wBAAwB,GACzB,EAAE,4BAA4B,QA+D9B"}
1
+ {"version":3,"file":"addFilterOptionsToFields.d.ts","sourceRoot":"","sources":["../../src/utilities/addFilterOptionsToFields.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAyC,MAAM,SAAS,CAAA;AAK3E,KAAK,4BAA4B,GAAG;IAClC,MAAM,EAAE,KAAK,EAAE,CAAA;IACf,4BAA4B,EAAE,MAAM,EAAE,CAAA;IACtC,wBAAwB,EAAE,MAAM,EAAE,CAAA;IAClC,eAAe,EAAE,MAAM,CAAA;IACvB,qBAAqB,EAAE,MAAM,CAAA;CAC9B,CAAA;AAED,wBAAgB,wBAAwB,CAAC,EACvC,MAAM,EACN,4BAA4B,EAC5B,wBAAwB,EACxB,eAAe,EACf,qBAAqB,GACtB,EAAE,4BAA4B,QA0E9B"}
@@ -1,5 +1,6 @@
1
+ import { getCollectionIDType } from './getCollectionIDType.js';
1
2
  import { getTenantFromCookie } from './getTenantFromCookie.js';
2
- export function addFilterOptionsToFields({ fields, tenantEnabledCollectionSlugs, tenantEnabledGlobalSlugs }) {
3
+ export function addFilterOptionsToFields({ fields, tenantEnabledCollectionSlugs, tenantEnabledGlobalSlugs, tenantFieldName, tenantsCollectionSlug }) {
3
4
  fields.forEach((field)=>{
4
5
  if (field.type === 'relationship') {
5
6
  /**
@@ -10,7 +11,12 @@ export function addFilterOptionsToFields({ fields, tenantEnabledCollectionSlugs,
10
11
  throw new Error(`The collection ${field.relationTo} is a global collection and cannot be related to a tenant enabled collection.`);
11
12
  }
12
13
  if (tenantEnabledCollectionSlugs.includes(field.relationTo)) {
13
- addFilter(field, tenantEnabledCollectionSlugs);
14
+ addFilter({
15
+ field,
16
+ tenantEnabledCollectionSlugs,
17
+ tenantFieldName,
18
+ tenantsCollectionSlug
19
+ });
14
20
  }
15
21
  } else {
16
22
  field.relationTo.map((relationTo)=>{
@@ -18,7 +24,12 @@ export function addFilterOptionsToFields({ fields, tenantEnabledCollectionSlugs,
18
24
  throw new Error(`The collection ${relationTo} is a global collection and cannot be related to a tenant enabled collection.`);
19
25
  }
20
26
  if (tenantEnabledCollectionSlugs.includes(relationTo)) {
21
- addFilter(field, tenantEnabledCollectionSlugs);
27
+ addFilter({
28
+ field,
29
+ tenantEnabledCollectionSlugs,
30
+ tenantFieldName,
31
+ tenantsCollectionSlug
32
+ });
22
33
  }
23
34
  });
24
35
  }
@@ -27,7 +38,9 @@ export function addFilterOptionsToFields({ fields, tenantEnabledCollectionSlugs,
27
38
  addFilterOptionsToFields({
28
39
  fields: field.fields,
29
40
  tenantEnabledCollectionSlugs,
30
- tenantEnabledGlobalSlugs
41
+ tenantEnabledGlobalSlugs,
42
+ tenantFieldName,
43
+ tenantsCollectionSlug
31
44
  });
32
45
  }
33
46
  if (field.type === 'blocks') {
@@ -35,7 +48,9 @@ export function addFilterOptionsToFields({ fields, tenantEnabledCollectionSlugs,
35
48
  addFilterOptionsToFields({
36
49
  fields: block.fields,
37
50
  tenantEnabledCollectionSlugs,
38
- tenantEnabledGlobalSlugs
51
+ tenantEnabledGlobalSlugs,
52
+ tenantFieldName,
53
+ tenantsCollectionSlug
39
54
  });
40
55
  });
41
56
  }
@@ -44,13 +59,15 @@ export function addFilterOptionsToFields({ fields, tenantEnabledCollectionSlugs,
44
59
  addFilterOptionsToFields({
45
60
  fields: tab.fields,
46
61
  tenantEnabledCollectionSlugs,
47
- tenantEnabledGlobalSlugs
62
+ tenantEnabledGlobalSlugs,
63
+ tenantFieldName,
64
+ tenantsCollectionSlug
48
65
  });
49
66
  });
50
67
  }
51
68
  });
52
69
  }
53
- function addFilter(field, tenantEnabledCollectionSlugs) {
70
+ function addFilter({ field, tenantEnabledCollectionSlugs, tenantFieldName, tenantsCollectionSlug }) {
54
71
  // User specified filter
55
72
  const originalFilter = field.filterOptions;
56
73
  field.filterOptions = async (args)=>{
@@ -64,7 +81,11 @@ function addFilter(field, tenantEnabledCollectionSlugs) {
64
81
  return false;
65
82
  }
66
83
  // Custom tenant filter
67
- const tenantFilterResults = filterOptionsByTenant(args);
84
+ const tenantFilterResults = filterOptionsByTenant({
85
+ ...args,
86
+ tenantFieldName,
87
+ tenantsCollectionSlug
88
+ });
68
89
  // If the tenant filter returns true, just use the original filter
69
90
  if (tenantFilterResults === true) {
70
91
  return originalFilterResult;
@@ -81,8 +102,12 @@ function addFilter(field, tenantEnabledCollectionSlugs) {
81
102
  };
82
103
  };
83
104
  }
84
- const filterOptionsByTenant = ({ req, tenantFieldName = 'tenant' })=>{
85
- const selectedTenant = getTenantFromCookie(req.headers, req.payload.db.defaultIDType);
105
+ const filterOptionsByTenant = ({ req, tenantFieldName = 'tenant', tenantsCollectionSlug })=>{
106
+ const idType = getCollectionIDType({
107
+ collectionSlug: tenantsCollectionSlug,
108
+ payload: req.payload
109
+ });
110
+ const selectedTenant = getTenantFromCookie(req.headers, idType);
86
111
  if (!selectedTenant) {
87
112
  return true;
88
113
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utilities/addFilterOptionsToFields.ts"],"sourcesContent":["import type { Field, FilterOptionsProps, RelationshipField } from 'payload'\n\nimport { getTenantFromCookie } from './getTenantFromCookie.js'\n\ntype AddFilterOptionsToFieldsArgs = {\n fields: Field[]\n tenantEnabledCollectionSlugs: string[]\n tenantEnabledGlobalSlugs: string[]\n}\n\nexport function addFilterOptionsToFields({\n fields,\n tenantEnabledCollectionSlugs,\n tenantEnabledGlobalSlugs,\n}: AddFilterOptionsToFieldsArgs) {\n fields.forEach((field) => {\n if (field.type === 'relationship') {\n /**\n * Adjusts relationship fields to filter by tenant\n * and ensures relationTo cannot be a tenant global collection\n */\n if (typeof field.relationTo === 'string') {\n if (tenantEnabledGlobalSlugs.includes(field.relationTo)) {\n throw new Error(\n `The collection ${field.relationTo} is a global collection and cannot be related to a tenant enabled collection.`,\n )\n }\n if (tenantEnabledCollectionSlugs.includes(field.relationTo)) {\n addFilter(field, tenantEnabledCollectionSlugs)\n }\n } else {\n field.relationTo.map((relationTo) => {\n if (tenantEnabledGlobalSlugs.includes(relationTo)) {\n throw new Error(\n `The collection ${relationTo} is a global collection and cannot be related to a tenant enabled collection.`,\n )\n }\n if (tenantEnabledCollectionSlugs.includes(relationTo)) {\n addFilter(field, tenantEnabledCollectionSlugs)\n }\n })\n }\n }\n\n if (\n field.type === 'row' ||\n field.type === 'array' ||\n field.type === 'collapsible' ||\n field.type === 'group'\n ) {\n addFilterOptionsToFields({\n fields: field.fields,\n tenantEnabledCollectionSlugs,\n tenantEnabledGlobalSlugs,\n })\n }\n\n if (field.type === 'blocks') {\n field.blocks.forEach((block) => {\n addFilterOptionsToFields({\n fields: block.fields,\n tenantEnabledCollectionSlugs,\n tenantEnabledGlobalSlugs,\n })\n })\n }\n\n if (field.type === 'tabs') {\n field.tabs.forEach((tab) => {\n addFilterOptionsToFields({\n fields: tab.fields,\n tenantEnabledCollectionSlugs,\n tenantEnabledGlobalSlugs,\n })\n })\n }\n })\n}\n\nfunction addFilter(field: RelationshipField, tenantEnabledCollectionSlugs: string[]) {\n // User specified filter\n const originalFilter = field.filterOptions\n field.filterOptions = async (args) => {\n const originalFilterResult =\n typeof originalFilter === 'function' ? await originalFilter(args) : (originalFilter ?? true)\n\n // If the relationTo is not a tenant enabled collection, return early\n if (args.relationTo && !tenantEnabledCollectionSlugs.includes(args.relationTo)) {\n return originalFilterResult\n }\n\n // If the original filtr returns false, return early\n if (originalFilterResult === false) {\n return false\n }\n\n // Custom tenant filter\n const tenantFilterResults = filterOptionsByTenant(args)\n\n // If the tenant filter returns true, just use the original filter\n if (tenantFilterResults === true) {\n return originalFilterResult\n }\n\n // If the original filter returns true, just use the tenant filter\n if (originalFilterResult === true) {\n return tenantFilterResults\n }\n\n return {\n and: [originalFilterResult, tenantFilterResults],\n }\n }\n}\n\ntype Args = {\n tenantFieldName?: string\n} & FilterOptionsProps\nconst filterOptionsByTenant = ({ req, tenantFieldName = 'tenant' }: Args) => {\n const selectedTenant = getTenantFromCookie(req.headers, req.payload.db.defaultIDType)\n if (!selectedTenant) {\n return true\n }\n\n return {\n or: [\n // ie a related collection that doesn't have a tenant field\n {\n [tenantFieldName]: {\n exists: false,\n },\n },\n // related collections that have a tenant field\n {\n [tenantFieldName]: {\n equals: selectedTenant,\n },\n },\n ],\n }\n}\n"],"names":["getTenantFromCookie","addFilterOptionsToFields","fields","tenantEnabledCollectionSlugs","tenantEnabledGlobalSlugs","forEach","field","type","relationTo","includes","Error","addFilter","map","blocks","block","tabs","tab","originalFilter","filterOptions","args","originalFilterResult","tenantFilterResults","filterOptionsByTenant","and","req","tenantFieldName","selectedTenant","headers","payload","db","defaultIDType","or","exists","equals"],"mappings":"AAEA,SAASA,mBAAmB,QAAQ,2BAA0B;AAQ9D,OAAO,SAASC,yBAAyB,EACvCC,MAAM,EACNC,4BAA4B,EAC5BC,wBAAwB,EACK;IAC7BF,OAAOG,OAAO,CAAC,CAACC;QACd,IAAIA,MAAMC,IAAI,KAAK,gBAAgB;YACjC;;;OAGC,GACD,IAAI,OAAOD,MAAME,UAAU,KAAK,UAAU;gBACxC,IAAIJ,yBAAyBK,QAAQ,CAACH,MAAME,UAAU,GAAG;oBACvD,MAAM,IAAIE,MACR,CAAC,eAAe,EAAEJ,MAAME,UAAU,CAAC,6EAA6E,CAAC;gBAErH;gBACA,IAAIL,6BAA6BM,QAAQ,CAACH,MAAME,UAAU,GAAG;oBAC3DG,UAAUL,OAAOH;gBACnB;YACF,OAAO;gBACLG,MAAME,UAAU,CAACI,GAAG,CAAC,CAACJ;oBACpB,IAAIJ,yBAAyBK,QAAQ,CAACD,aAAa;wBACjD,MAAM,IAAIE,MACR,CAAC,eAAe,EAAEF,WAAW,6EAA6E,CAAC;oBAE/G;oBACA,IAAIL,6BAA6BM,QAAQ,CAACD,aAAa;wBACrDG,UAAUL,OAAOH;oBACnB;gBACF;YACF;QACF;QAEA,IACEG,MAAMC,IAAI,KAAK,SACfD,MAAMC,IAAI,KAAK,WACfD,MAAMC,IAAI,KAAK,iBACfD,MAAMC,IAAI,KAAK,SACf;YACAN,yBAAyB;gBACvBC,QAAQI,MAAMJ,MAAM;gBACpBC;gBACAC;YACF;QACF;QAEA,IAAIE,MAAMC,IAAI,KAAK,UAAU;YAC3BD,MAAMO,MAAM,CAACR,OAAO,CAAC,CAACS;gBACpBb,yBAAyB;oBACvBC,QAAQY,MAAMZ,MAAM;oBACpBC;oBACAC;gBACF;YACF;QACF;QAEA,IAAIE,MAAMC,IAAI,KAAK,QAAQ;YACzBD,MAAMS,IAAI,CAACV,OAAO,CAAC,CAACW;gBAClBf,yBAAyB;oBACvBC,QAAQc,IAAId,MAAM;oBAClBC;oBACAC;gBACF;YACF;QACF;IACF;AACF;AAEA,SAASO,UAAUL,KAAwB,EAAEH,4BAAsC;IACjF,wBAAwB;IACxB,MAAMc,iBAAiBX,MAAMY,aAAa;IAC1CZ,MAAMY,aAAa,GAAG,OAAOC;QAC3B,MAAMC,uBACJ,OAAOH,mBAAmB,aAAa,MAAMA,eAAeE,QAASF,kBAAkB;QAEzF,qEAAqE;QACrE,IAAIE,KAAKX,UAAU,IAAI,CAACL,6BAA6BM,QAAQ,CAACU,KAAKX,UAAU,GAAG;YAC9E,OAAOY;QACT;QAEA,oDAAoD;QACpD,IAAIA,yBAAyB,OAAO;YAClC,OAAO;QACT;QAEA,uBAAuB;QACvB,MAAMC,sBAAsBC,sBAAsBH;QAElD,kEAAkE;QAClE,IAAIE,wBAAwB,MAAM;YAChC,OAAOD;QACT;QAEA,kEAAkE;QAClE,IAAIA,yBAAyB,MAAM;YACjC,OAAOC;QACT;QAEA,OAAO;YACLE,KAAK;gBAACH;gBAAsBC;aAAoB;QAClD;IACF;AACF;AAKA,MAAMC,wBAAwB,CAAC,EAAEE,GAAG,EAAEC,kBAAkB,QAAQ,EAAQ;IACtE,MAAMC,iBAAiB1B,oBAAoBwB,IAAIG,OAAO,EAAEH,IAAII,OAAO,CAACC,EAAE,CAACC,aAAa;IACpF,IAAI,CAACJ,gBAAgB;QACnB,OAAO;IACT;IAEA,OAAO;QACLK,IAAI;YACF,2DAA2D;YAC3D;gBACE,CAACN,gBAAgB,EAAE;oBACjBO,QAAQ;gBACV;YACF;YACA,+CAA+C;YAC/C;gBACE,CAACP,gBAAgB,EAAE;oBACjBQ,QAAQP;gBACV;YACF;SACD;IACH;AACF"}
1
+ {"version":3,"sources":["../../src/utilities/addFilterOptionsToFields.ts"],"sourcesContent":["import type { Field, FilterOptionsProps, RelationshipField } from 'payload'\n\nimport { getCollectionIDType } from './getCollectionIDType.js'\nimport { getTenantFromCookie } from './getTenantFromCookie.js'\n\ntype AddFilterOptionsToFieldsArgs = {\n fields: Field[]\n tenantEnabledCollectionSlugs: string[]\n tenantEnabledGlobalSlugs: string[]\n tenantFieldName: string\n tenantsCollectionSlug: string\n}\n\nexport function addFilterOptionsToFields({\n fields,\n tenantEnabledCollectionSlugs,\n tenantEnabledGlobalSlugs,\n tenantFieldName,\n tenantsCollectionSlug,\n}: AddFilterOptionsToFieldsArgs) {\n fields.forEach((field) => {\n if (field.type === 'relationship') {\n /**\n * Adjusts relationship fields to filter by tenant\n * and ensures relationTo cannot be a tenant global collection\n */\n if (typeof field.relationTo === 'string') {\n if (tenantEnabledGlobalSlugs.includes(field.relationTo)) {\n throw new Error(\n `The collection ${field.relationTo} is a global collection and cannot be related to a tenant enabled collection.`,\n )\n }\n if (tenantEnabledCollectionSlugs.includes(field.relationTo)) {\n addFilter({ field, tenantEnabledCollectionSlugs, tenantFieldName, tenantsCollectionSlug })\n }\n } else {\n field.relationTo.map((relationTo) => {\n if (tenantEnabledGlobalSlugs.includes(relationTo)) {\n throw new Error(\n `The collection ${relationTo} is a global collection and cannot be related to a tenant enabled collection.`,\n )\n }\n if (tenantEnabledCollectionSlugs.includes(relationTo)) {\n addFilter({\n field,\n tenantEnabledCollectionSlugs,\n tenantFieldName,\n tenantsCollectionSlug,\n })\n }\n })\n }\n }\n\n if (\n field.type === 'row' ||\n field.type === 'array' ||\n field.type === 'collapsible' ||\n field.type === 'group'\n ) {\n addFilterOptionsToFields({\n fields: field.fields,\n tenantEnabledCollectionSlugs,\n tenantEnabledGlobalSlugs,\n tenantFieldName,\n tenantsCollectionSlug,\n })\n }\n\n if (field.type === 'blocks') {\n field.blocks.forEach((block) => {\n addFilterOptionsToFields({\n fields: block.fields,\n tenantEnabledCollectionSlugs,\n tenantEnabledGlobalSlugs,\n tenantFieldName,\n tenantsCollectionSlug,\n })\n })\n }\n\n if (field.type === 'tabs') {\n field.tabs.forEach((tab) => {\n addFilterOptionsToFields({\n fields: tab.fields,\n tenantEnabledCollectionSlugs,\n tenantEnabledGlobalSlugs,\n tenantFieldName,\n tenantsCollectionSlug,\n })\n })\n }\n })\n}\n\ntype AddFilterArgs = {\n field: RelationshipField\n tenantEnabledCollectionSlugs: string[]\n tenantFieldName: string\n tenantsCollectionSlug: string\n}\nfunction addFilter({\n field,\n tenantEnabledCollectionSlugs,\n tenantFieldName,\n tenantsCollectionSlug,\n}: AddFilterArgs) {\n // User specified filter\n const originalFilter = field.filterOptions\n field.filterOptions = async (args) => {\n const originalFilterResult =\n typeof originalFilter === 'function' ? await originalFilter(args) : (originalFilter ?? true)\n\n // If the relationTo is not a tenant enabled collection, return early\n if (args.relationTo && !tenantEnabledCollectionSlugs.includes(args.relationTo)) {\n return originalFilterResult\n }\n\n // If the original filtr returns false, return early\n if (originalFilterResult === false) {\n return false\n }\n\n // Custom tenant filter\n const tenantFilterResults = filterOptionsByTenant({\n ...args,\n tenantFieldName,\n tenantsCollectionSlug,\n })\n\n // If the tenant filter returns true, just use the original filter\n if (tenantFilterResults === true) {\n return originalFilterResult\n }\n\n // If the original filter returns true, just use the tenant filter\n if (originalFilterResult === true) {\n return tenantFilterResults\n }\n\n return {\n and: [originalFilterResult, tenantFilterResults],\n }\n }\n}\n\ntype Args = {\n tenantFieldName?: string\n tenantsCollectionSlug: string\n} & FilterOptionsProps\nconst filterOptionsByTenant = ({\n req,\n tenantFieldName = 'tenant',\n tenantsCollectionSlug,\n}: Args) => {\n const idType = getCollectionIDType({\n collectionSlug: tenantsCollectionSlug,\n payload: req.payload,\n })\n const selectedTenant = getTenantFromCookie(req.headers, idType)\n if (!selectedTenant) {\n return true\n }\n\n return {\n or: [\n // ie a related collection that doesn't have a tenant field\n {\n [tenantFieldName]: {\n exists: false,\n },\n },\n // related collections that have a tenant field\n {\n [tenantFieldName]: {\n equals: selectedTenant,\n },\n },\n ],\n }\n}\n"],"names":["getCollectionIDType","getTenantFromCookie","addFilterOptionsToFields","fields","tenantEnabledCollectionSlugs","tenantEnabledGlobalSlugs","tenantFieldName","tenantsCollectionSlug","forEach","field","type","relationTo","includes","Error","addFilter","map","blocks","block","tabs","tab","originalFilter","filterOptions","args","originalFilterResult","tenantFilterResults","filterOptionsByTenant","and","req","idType","collectionSlug","payload","selectedTenant","headers","or","exists","equals"],"mappings":"AAEA,SAASA,mBAAmB,QAAQ,2BAA0B;AAC9D,SAASC,mBAAmB,QAAQ,2BAA0B;AAU9D,OAAO,SAASC,yBAAyB,EACvCC,MAAM,EACNC,4BAA4B,EAC5BC,wBAAwB,EACxBC,eAAe,EACfC,qBAAqB,EACQ;IAC7BJ,OAAOK,OAAO,CAAC,CAACC;QACd,IAAIA,MAAMC,IAAI,KAAK,gBAAgB;YACjC;;;OAGC,GACD,IAAI,OAAOD,MAAME,UAAU,KAAK,UAAU;gBACxC,IAAIN,yBAAyBO,QAAQ,CAACH,MAAME,UAAU,GAAG;oBACvD,MAAM,IAAIE,MACR,CAAC,eAAe,EAAEJ,MAAME,UAAU,CAAC,6EAA6E,CAAC;gBAErH;gBACA,IAAIP,6BAA6BQ,QAAQ,CAACH,MAAME,UAAU,GAAG;oBAC3DG,UAAU;wBAAEL;wBAAOL;wBAA8BE;wBAAiBC;oBAAsB;gBAC1F;YACF,OAAO;gBACLE,MAAME,UAAU,CAACI,GAAG,CAAC,CAACJ;oBACpB,IAAIN,yBAAyBO,QAAQ,CAACD,aAAa;wBACjD,MAAM,IAAIE,MACR,CAAC,eAAe,EAAEF,WAAW,6EAA6E,CAAC;oBAE/G;oBACA,IAAIP,6BAA6BQ,QAAQ,CAACD,aAAa;wBACrDG,UAAU;4BACRL;4BACAL;4BACAE;4BACAC;wBACF;oBACF;gBACF;YACF;QACF;QAEA,IACEE,MAAMC,IAAI,KAAK,SACfD,MAAMC,IAAI,KAAK,WACfD,MAAMC,IAAI,KAAK,iBACfD,MAAMC,IAAI,KAAK,SACf;YACAR,yBAAyB;gBACvBC,QAAQM,MAAMN,MAAM;gBACpBC;gBACAC;gBACAC;gBACAC;YACF;QACF;QAEA,IAAIE,MAAMC,IAAI,KAAK,UAAU;YAC3BD,MAAMO,MAAM,CAACR,OAAO,CAAC,CAACS;gBACpBf,yBAAyB;oBACvBC,QAAQc,MAAMd,MAAM;oBACpBC;oBACAC;oBACAC;oBACAC;gBACF;YACF;QACF;QAEA,IAAIE,MAAMC,IAAI,KAAK,QAAQ;YACzBD,MAAMS,IAAI,CAACV,OAAO,CAAC,CAACW;gBAClBjB,yBAAyB;oBACvBC,QAAQgB,IAAIhB,MAAM;oBAClBC;oBACAC;oBACAC;oBACAC;gBACF;YACF;QACF;IACF;AACF;AAQA,SAASO,UAAU,EACjBL,KAAK,EACLL,4BAA4B,EAC5BE,eAAe,EACfC,qBAAqB,EACP;IACd,wBAAwB;IACxB,MAAMa,iBAAiBX,MAAMY,aAAa;IAC1CZ,MAAMY,aAAa,GAAG,OAAOC;QAC3B,MAAMC,uBACJ,OAAOH,mBAAmB,aAAa,MAAMA,eAAeE,QAASF,kBAAkB;QAEzF,qEAAqE;QACrE,IAAIE,KAAKX,UAAU,IAAI,CAACP,6BAA6BQ,QAAQ,CAACU,KAAKX,UAAU,GAAG;YAC9E,OAAOY;QACT;QAEA,oDAAoD;QACpD,IAAIA,yBAAyB,OAAO;YAClC,OAAO;QACT;QAEA,uBAAuB;QACvB,MAAMC,sBAAsBC,sBAAsB;YAChD,GAAGH,IAAI;YACPhB;YACAC;QACF;QAEA,kEAAkE;QAClE,IAAIiB,wBAAwB,MAAM;YAChC,OAAOD;QACT;QAEA,kEAAkE;QAClE,IAAIA,yBAAyB,MAAM;YACjC,OAAOC;QACT;QAEA,OAAO;YACLE,KAAK;gBAACH;gBAAsBC;aAAoB;QAClD;IACF;AACF;AAMA,MAAMC,wBAAwB,CAAC,EAC7BE,GAAG,EACHrB,kBAAkB,QAAQ,EAC1BC,qBAAqB,EAChB;IACL,MAAMqB,SAAS5B,oBAAoB;QACjC6B,gBAAgBtB;QAChBuB,SAASH,IAAIG,OAAO;IACtB;IACA,MAAMC,iBAAiB9B,oBAAoB0B,IAAIK,OAAO,EAAEJ;IACxD,IAAI,CAACG,gBAAgB;QACnB,OAAO;IACT;IAEA,OAAO;QACLE,IAAI;YACF,2DAA2D;YAC3D;gBACE,CAAC3B,gBAAgB,EAAE;oBACjB4B,QAAQ;gBACV;YACF;YACA,+CAA+C;YAC/C;gBACE,CAAC5B,gBAAgB,EAAE;oBACjB6B,QAAQJ;gBACV;YACF;SACD;IACH;AACF"}
@@ -0,0 +1,8 @@
1
+ import type { CollectionSlug, Payload } from 'payload';
2
+ type Args = {
3
+ collectionSlug: CollectionSlug;
4
+ payload: Payload;
5
+ };
6
+ export declare const getCollectionIDType: ({ collectionSlug, payload }: Args) => "number" | "text";
7
+ export {};
8
+ //# sourceMappingURL=getCollectionIDType.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getCollectionIDType.d.ts","sourceRoot":"","sources":["../../src/utilities/getCollectionIDType.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAEtD,KAAK,IAAI,GAAG;IACV,cAAc,EAAE,cAAc,CAAA;IAC9B,OAAO,EAAE,OAAO,CAAA;CACjB,CAAA;AACD,eAAO,MAAM,mBAAmB,gCAAiC,IAAI,KAAG,QAAQ,GAAG,MAElF,CAAA"}
@@ -0,0 +1,5 @@
1
+ export const getCollectionIDType = ({ collectionSlug, payload })=>{
2
+ return payload.collections[collectionSlug]?.customIDType ?? payload.db.defaultIDType;
3
+ };
4
+
5
+ //# sourceMappingURL=getCollectionIDType.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utilities/getCollectionIDType.ts"],"sourcesContent":["import type { CollectionSlug, Payload } from 'payload'\n\ntype Args = {\n collectionSlug: CollectionSlug\n payload: Payload\n}\nexport const getCollectionIDType = ({ collectionSlug, payload }: Args): 'number' | 'text' => {\n return payload.collections[collectionSlug]?.customIDType ?? payload.db.defaultIDType\n}\n"],"names":["getCollectionIDType","collectionSlug","payload","collections","customIDType","db","defaultIDType"],"mappings":"AAMA,OAAO,MAAMA,sBAAsB,CAAC,EAAEC,cAAc,EAAEC,OAAO,EAAQ;IACnE,OAAOA,QAAQC,WAAW,CAACF,eAAe,EAAEG,gBAAgBF,QAAQG,EAAE,CAACC,aAAa;AACtF,EAAC"}
@@ -1,12 +1,15 @@
1
- import type { Payload, ViewTypes } from 'payload';
1
+ import type { Payload, User, ViewTypes } from 'payload';
2
2
  type Args = {
3
3
  docID?: number | string;
4
4
  headers: Headers;
5
5
  payload: Payload;
6
6
  slug: string;
7
7
  tenantFieldName: string;
8
+ tenantsCollectionSlug: string;
9
+ useAsTitle: string;
10
+ user?: User;
8
11
  view: ViewTypes;
9
12
  };
10
- export declare function getGlobalViewRedirect({ slug, docID, headers, payload, tenantFieldName, view, }: Args): Promise<string | void>;
13
+ export declare function getGlobalViewRedirect({ slug, docID, headers, payload, tenantFieldName, tenantsCollectionSlug, useAsTitle, user, view, }: Args): Promise<string | void>;
11
14
  export {};
12
15
  //# 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,MAAM,SAAS,CAAA;AAKjD,KAAK,IAAI,GAAG;IACV,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,IAAI,EAAE,SAAS,CAAA;CAChB,CAAA;AACD,wBAAsB,qBAAqB,CAAC,EAC1C,IAAI,EACJ,KAAK,EACL,OAAO,EACP,OAAO,EACP,eAAe,EACf,IAAI,GACL,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA+C/B"}
1
+ {"version":3,"file":"getGlobalViewRedirect.d.ts","sourceRoot":"","sources":["../../src/utilities/getGlobalViewRedirect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAOvD,KAAK,IAAI,GAAG;IACV,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,UAAU,EAAE,MAAM,CAAA;IAClB,IAAI,CAAC,EAAE,IAAI,CAAA;IACX,IAAI,EAAE,SAAS,CAAA;CAChB,CAAA;AACD,wBAAsB,qBAAqB,CAAC,EAC1C,IAAI,EACJ,KAAK,EACL,OAAO,EACP,OAAO,EACP,eAAe,EACf,qBAAqB,EACrB,UAAU,EACV,IAAI,EACJ,IAAI,GACL,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA4D/B"}
@@ -1,41 +1,57 @@
1
1
  import { SELECT_ALL } from '../constants.js';
2
+ import { findTenantOptions } from '../queries/findTenantOptions.js';
3
+ import { getCollectionIDType } from './getCollectionIDType.js';
2
4
  import { getTenantFromCookie } from './getTenantFromCookie.js';
3
- export async function getGlobalViewRedirect({ slug, docID, headers, payload, tenantFieldName, view }) {
4
- const tenant = getTenantFromCookie(headers, payload.db.defaultIDType);
5
+ export async function getGlobalViewRedirect({ slug, docID, headers, payload, tenantFieldName, tenantsCollectionSlug, useAsTitle, user, view }) {
6
+ const idType = getCollectionIDType({
7
+ collectionSlug: tenantsCollectionSlug,
8
+ payload
9
+ });
10
+ let tenant = getTenantFromCookie(headers, idType);
5
11
  let redirectRoute;
6
- if (tenant) {
7
- try {
8
- const { docs } = await payload.find({
9
- collection: slug,
10
- depth: 0,
11
- limit: 1,
12
- where: tenant === SELECT_ALL ? {} : {
13
- [tenantFieldName]: {
14
- equals: tenant
15
- }
16
- }
17
- });
18
- const tenantDocID = docs?.[0]?.id;
19
- if (view === 'document') {
20
- if (docID && !tenantDocID) {
21
- // viewing a document with an id but does not match the selected tenant, redirect to create route
22
- redirectRoute = `${payload.config.routes.admin}/collections/${slug}/create`;
23
- } else if (tenantDocID && docID !== tenantDocID) {
24
- // tenant document already exists but does not match current route doc ID, redirect to matching tenant doc
25
- redirectRoute = `${payload.config.routes.admin}/collections/${slug}/${tenantDocID}`;
26
- }
27
- } else if (view === 'list') {
28
- if (tenantDocID) {
29
- // tenant document exists, redirect to edit view
30
- redirectRoute = `${payload.config.routes.admin}/collections/${slug}/${tenantDocID}`;
31
- } else {
32
- // tenant document does not exist, redirect to create route
33
- redirectRoute = `${payload.config.routes.admin}/collections/${slug}/create`;
12
+ if (!tenant || tenant === SELECT_ALL) {
13
+ const tenantsQuery = await findTenantOptions({
14
+ limit: 1,
15
+ payload,
16
+ tenantsCollectionSlug,
17
+ useAsTitle,
18
+ user
19
+ });
20
+ tenant = tenantsQuery.docs[0]?.id || null;
21
+ }
22
+ try {
23
+ const { docs } = await payload.find({
24
+ collection: slug,
25
+ depth: 0,
26
+ limit: 1,
27
+ overrideAccess: false,
28
+ user,
29
+ where: {
30
+ [tenantFieldName]: {
31
+ equals: tenant
34
32
  }
35
33
  }
36
- } catch (e) {
37
- payload.logger.error(e, `${typeof e === 'object' && e && 'message' in e ? `e?.message - ` : ''}Multi Tenant Redirect Error`);
34
+ });
35
+ const tenantDocID = docs?.[0]?.id;
36
+ if (view === 'document') {
37
+ if (docID && !tenantDocID) {
38
+ // viewing a document with an id but does not match the selected tenant, redirect to create route
39
+ redirectRoute = `${payload.config.routes.admin}/collections/${slug}/create`;
40
+ } else if (tenantDocID && docID !== tenantDocID) {
41
+ // tenant document already exists but does not match current route doc ID, redirect to matching tenant doc
42
+ redirectRoute = `${payload.config.routes.admin}/collections/${slug}/${tenantDocID}`;
43
+ }
44
+ } else if (view === 'list') {
45
+ if (tenantDocID) {
46
+ // tenant document exists, redirect to edit view
47
+ redirectRoute = `${payload.config.routes.admin}/collections/${slug}/${tenantDocID}`;
48
+ } else {
49
+ // tenant document does not exist, redirect to create route
50
+ redirectRoute = `${payload.config.routes.admin}/collections/${slug}/create`;
51
+ }
38
52
  }
53
+ } catch (e) {
54
+ payload.logger.error(e, `${typeof e === 'object' && e && 'message' in e ? `e?.message - ` : ''}Multi Tenant Redirect Error`);
39
55
  }
40
56
  return redirectRoute;
41
57
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utilities/getGlobalViewRedirect.ts"],"sourcesContent":["import type { Payload, ViewTypes } from 'payload'\n\nimport { SELECT_ALL } from '../constants.js'\nimport { getTenantFromCookie } from './getTenantFromCookie.js'\n\ntype Args = {\n docID?: number | string\n headers: Headers\n payload: Payload\n slug: string\n tenantFieldName: string\n view: ViewTypes\n}\nexport async function getGlobalViewRedirect({\n slug,\n docID,\n headers,\n payload,\n tenantFieldName,\n view,\n}: Args): Promise<string | void> {\n const tenant = getTenantFromCookie(headers, payload.db.defaultIDType)\n let redirectRoute\n\n if (tenant) {\n try {\n const { docs } = await payload.find({\n collection: slug,\n depth: 0,\n limit: 1,\n where:\n tenant === SELECT_ALL\n ? {}\n : {\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 = `${payload.config.routes.admin}/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 = `${payload.config.routes.admin}/collections/${slug}/${tenantDocID}`\n }\n } else if (view === 'list') {\n if (tenantDocID) {\n // tenant document exists, redirect to edit view\n redirectRoute = `${payload.config.routes.admin}/collections/${slug}/${tenantDocID}`\n } else {\n // tenant document does not exist, redirect to create route\n redirectRoute = `${payload.config.routes.admin}/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 return redirectRoute\n}\n"],"names":["SELECT_ALL","getTenantFromCookie","getGlobalViewRedirect","slug","docID","headers","payload","tenantFieldName","view","tenant","db","defaultIDType","redirectRoute","docs","find","collection","depth","limit","where","equals","tenantDocID","id","config","routes","admin","e","logger","error"],"mappings":"AAEA,SAASA,UAAU,QAAQ,kBAAiB;AAC5C,SAASC,mBAAmB,QAAQ,2BAA0B;AAU9D,OAAO,eAAeC,sBAAsB,EAC1CC,IAAI,EACJC,KAAK,EACLC,OAAO,EACPC,OAAO,EACPC,eAAe,EACfC,IAAI,EACC;IACL,MAAMC,SAASR,oBAAoBI,SAASC,QAAQI,EAAE,CAACC,aAAa;IACpE,IAAIC;IAEJ,IAAIH,QAAQ;QACV,IAAI;YACF,MAAM,EAAEI,IAAI,EAAE,GAAG,MAAMP,QAAQQ,IAAI,CAAC;gBAClCC,YAAYZ;gBACZa,OAAO;gBACPC,OAAO;gBACPC,OACET,WAAWT,aACP,CAAC,IACD;oBACE,CAACO,gBAAgB,EAAE;wBACjBY,QAAQV;oBACV;gBACF;YACR;YAEA,MAAMW,cAAcP,MAAM,CAAC,EAAE,EAAEQ;YAE/B,IAAIb,SAAS,YAAY;gBACvB,IAAIJ,SAAS,CAACgB,aAAa;oBACzB,iGAAiG;oBACjGR,gBAAgB,GAAGN,QAAQgB,MAAM,CAACC,MAAM,CAACC,KAAK,CAAC,aAAa,EAAErB,KAAK,OAAO,CAAC;gBAC7E,OAAO,IAAIiB,eAAehB,UAAUgB,aAAa;oBAC/C,0GAA0G;oBAC1GR,gBAAgB,GAAGN,QAAQgB,MAAM,CAACC,MAAM,CAACC,KAAK,CAAC,aAAa,EAAErB,KAAK,CAAC,EAAEiB,aAAa;gBACrF;YACF,OAAO,IAAIZ,SAAS,QAAQ;gBAC1B,IAAIY,aAAa;oBACf,gDAAgD;oBAChDR,gBAAgB,GAAGN,QAAQgB,MAAM,CAACC,MAAM,CAACC,KAAK,CAAC,aAAa,EAAErB,KAAK,CAAC,EAAEiB,aAAa;gBACrF,OAAO;oBACL,2DAA2D;oBAC3DR,gBAAgB,GAAGN,QAAQgB,MAAM,CAACC,MAAM,CAACC,KAAK,CAAC,aAAa,EAAErB,KAAK,OAAO,CAAC;gBAC7E;YACF;QACF,EAAE,OAAOsB,GAAY;YACnBnB,QAAQoB,MAAM,CAACC,KAAK,CAClBF,GACA,GAAG,OAAOA,MAAM,YAAYA,KAAK,aAAaA,IAAI,CAAC,aAAa,CAAC,GAAG,GAAG,2BAA2B,CAAC;QAEvG;IACF;IACA,OAAOb;AACT"}
1
+ {"version":3,"sources":["../../src/utilities/getGlobalViewRedirect.ts"],"sourcesContent":["import type { Payload, User, ViewTypes } from 'payload'\n\nimport { SELECT_ALL } from '../constants.js'\nimport { findTenantOptions } from '../queries/findTenantOptions.js'\nimport { getCollectionIDType } from './getCollectionIDType.js'\nimport { getTenantFromCookie } from './getTenantFromCookie.js'\n\ntype Args = {\n docID?: number | string\n headers: Headers\n payload: Payload\n slug: string\n tenantFieldName: string\n tenantsCollectionSlug: string\n useAsTitle: string\n user?: User\n view: ViewTypes\n}\nexport async function getGlobalViewRedirect({\n slug,\n docID,\n headers,\n payload,\n tenantFieldName,\n tenantsCollectionSlug,\n useAsTitle,\n user,\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\n\n if (!tenant || tenant === SELECT_ALL) {\n const tenantsQuery = await findTenantOptions({\n limit: 1,\n payload,\n tenantsCollectionSlug,\n useAsTitle,\n user,\n })\n\n tenant = tenantsQuery.docs[0]?.id || null\n }\n\n try {\n const { docs } = await payload.find({\n collection: slug,\n depth: 0,\n limit: 1,\n overrideAccess: 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 = `${payload.config.routes.admin}/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 = `${payload.config.routes.admin}/collections/${slug}/${tenantDocID}`\n }\n } else if (view === 'list') {\n if (tenantDocID) {\n // tenant document exists, redirect to edit view\n redirectRoute = `${payload.config.routes.admin}/collections/${slug}/${tenantDocID}`\n } else {\n // tenant document does not exist, redirect to create route\n redirectRoute = `${payload.config.routes.admin}/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 return redirectRoute\n}\n"],"names":["SELECT_ALL","findTenantOptions","getCollectionIDType","getTenantFromCookie","getGlobalViewRedirect","slug","docID","headers","payload","tenantFieldName","tenantsCollectionSlug","useAsTitle","user","view","idType","collectionSlug","tenant","redirectRoute","tenantsQuery","limit","docs","id","find","collection","depth","overrideAccess","where","equals","tenantDocID","config","routes","admin","e","logger","error"],"mappings":"AAEA,SAASA,UAAU,QAAQ,kBAAiB;AAC5C,SAASC,iBAAiB,QAAQ,kCAAiC;AACnE,SAASC,mBAAmB,QAAQ,2BAA0B;AAC9D,SAASC,mBAAmB,QAAQ,2BAA0B;AAa9D,OAAO,eAAeC,sBAAsB,EAC1CC,IAAI,EACJC,KAAK,EACLC,OAAO,EACPC,OAAO,EACPC,eAAe,EACfC,qBAAqB,EACrBC,UAAU,EACVC,IAAI,EACJC,IAAI,EACC;IACL,MAAMC,SAASZ,oBAAoB;QACjCa,gBAAgBL;QAChBF;IACF;IACA,IAAIQ,SAASb,oBAAoBI,SAASO;IAC1C,IAAIG;IAEJ,IAAI,CAACD,UAAUA,WAAWhB,YAAY;QACpC,MAAMkB,eAAe,MAAMjB,kBAAkB;YAC3CkB,OAAO;YACPX;YACAE;YACAC;YACAC;QACF;QAEAI,SAASE,aAAaE,IAAI,CAAC,EAAE,EAAEC,MAAM;IACvC;IAEA,IAAI;QACF,MAAM,EAAED,IAAI,EAAE,GAAG,MAAMZ,QAAQc,IAAI,CAAC;YAClCC,YAAYlB;YACZmB,OAAO;YACPL,OAAO;YACPM,gBAAgB;YAChBb;YACAc,OAAO;gBACL,CAACjB,gBAAgB,EAAE;oBACjBkB,QAAQX;gBACV;YACF;QACF;QAEA,MAAMY,cAAcR,MAAM,CAAC,EAAE,EAAEC;QAE/B,IAAIR,SAAS,YAAY;YACvB,IAAIP,SAAS,CAACsB,aAAa;gBACzB,iGAAiG;gBACjGX,gBAAgB,GAAGT,QAAQqB,MAAM,CAACC,MAAM,CAACC,KAAK,CAAC,aAAa,EAAE1B,KAAK,OAAO,CAAC;YAC7E,OAAO,IAAIuB,eAAetB,UAAUsB,aAAa;gBAC/C,0GAA0G;gBAC1GX,gBAAgB,GAAGT,QAAQqB,MAAM,CAACC,MAAM,CAACC,KAAK,CAAC,aAAa,EAAE1B,KAAK,CAAC,EAAEuB,aAAa;YACrF;QACF,OAAO,IAAIf,SAAS,QAAQ;YAC1B,IAAIe,aAAa;gBACf,gDAAgD;gBAChDX,gBAAgB,GAAGT,QAAQqB,MAAM,CAACC,MAAM,CAACC,KAAK,CAAC,aAAa,EAAE1B,KAAK,CAAC,EAAEuB,aAAa;YACrF,OAAO;gBACL,2DAA2D;gBAC3DX,gBAAgB,GAAGT,QAAQqB,MAAM,CAACC,MAAM,CAACC,KAAK,CAAC,aAAa,EAAE1B,KAAK,OAAO,CAAC;YAC7E;QACF;IACF,EAAE,OAAO2B,GAAY;QACnBxB,QAAQyB,MAAM,CAACC,KAAK,CAClBF,GACA,GAAG,OAAOA,MAAM,YAAYA,KAAK,aAAaA,IAAI,CAAC,aAAa,CAAC,GAAG,GAAG,2BAA2B,CAAC;IAEvG;IACA,OAAOf;AACT"}
@@ -8,7 +8,7 @@ import { parseCookies } from 'payload';
8
8
  */ export function getTenantFromCookie(headers, idType) {
9
9
  const cookies = parseCookies(headers);
10
10
  const selectedTenant = cookies.get('payload-tenant') || null;
11
- return selectedTenant ? idType === 'number' ? parseInt(selectedTenant) : selectedTenant : null;
11
+ return selectedTenant ? idType === 'number' ? parseFloat(selectedTenant) : selectedTenant : null;
12
12
  }
13
13
 
14
14
  //# sourceMappingURL=getTenantFromCookie.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utilities/getTenantFromCookie.ts"],"sourcesContent":["import { parseCookies } from 'payload'\n\n/**\n * A function that takes request headers and an idType and returns the current tenant ID from the cookie\n *\n * @param headers Headers, usually derived from req.headers or next/headers\n * @param idType can be 'number' | 'text', usually derived from payload.db.defaultIDType\n * @returns string | number | null\n */\nexport function getTenantFromCookie(\n headers: Headers,\n idType: 'number' | 'text',\n): null | number | string {\n const cookies = parseCookies(headers)\n const selectedTenant = cookies.get('payload-tenant') || null\n return selectedTenant ? (idType === 'number' ? parseInt(selectedTenant) : selectedTenant) : null\n}\n"],"names":["parseCookies","getTenantFromCookie","headers","idType","cookies","selectedTenant","get","parseInt"],"mappings":"AAAA,SAASA,YAAY,QAAQ,UAAS;AAEtC;;;;;;CAMC,GACD,OAAO,SAASC,oBACdC,OAAgB,EAChBC,MAAyB;IAEzB,MAAMC,UAAUJ,aAAaE;IAC7B,MAAMG,iBAAiBD,QAAQE,GAAG,CAAC,qBAAqB;IACxD,OAAOD,iBAAkBF,WAAW,WAAWI,SAASF,kBAAkBA,iBAAkB;AAC9F"}
1
+ {"version":3,"sources":["../../src/utilities/getTenantFromCookie.ts"],"sourcesContent":["import { parseCookies } from 'payload'\n\n/**\n * A function that takes request headers and an idType and returns the current tenant ID from the cookie\n *\n * @param headers Headers, usually derived from req.headers or next/headers\n * @param idType can be 'number' | 'text', usually derived from payload.db.defaultIDType\n * @returns string | number | null\n */\nexport function getTenantFromCookie(\n headers: Headers,\n idType: 'number' | 'text',\n): null | number | string {\n const cookies = parseCookies(headers)\n const selectedTenant = cookies.get('payload-tenant') || null\n return selectedTenant ? (idType === 'number' ? parseFloat(selectedTenant) : selectedTenant) : null\n}\n"],"names":["parseCookies","getTenantFromCookie","headers","idType","cookies","selectedTenant","get","parseFloat"],"mappings":"AAAA,SAASA,YAAY,QAAQ,UAAS;AAEtC;;;;;;CAMC,GACD,OAAO,SAASC,oBACdC,OAAgB,EAChBC,MAAyB;IAEzB,MAAMC,UAAUJ,aAAaE;IAC7B,MAAMG,iBAAiBD,QAAQE,GAAG,CAAC,qBAAqB;IACxD,OAAOD,iBAAkBF,WAAW,WAAWI,WAAWF,kBAAkBA,iBAAkB;AAChG"}
@@ -2,7 +2,8 @@ import type { PayloadRequest, Where } from 'payload';
2
2
  type Args = {
3
3
  req: PayloadRequest;
4
4
  tenantFieldName: string;
5
+ tenantsCollectionSlug: string;
5
6
  };
6
- export declare const getTenantListFilter: ({ req, tenantFieldName }: Args) => null | Where;
7
+ export declare const getTenantListFilter: ({ req, tenantFieldName, tenantsCollectionSlug, }: Args) => null | Where;
7
8
  export {};
8
9
  //# sourceMappingURL=getTenantListFilter.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"getTenantListFilter.d.ts","sourceRoot":"","sources":["../../src/utilities/getTenantListFilter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAKpD,KAAK,IAAI,GAAG;IACV,GAAG,EAAE,cAAc,CAAA;IACnB,eAAe,EAAE,MAAM,CAAA;CACxB,CAAA;AACD,eAAO,MAAM,mBAAmB,6BAA8B,IAAI,KAAG,IAAI,GAAG,KAY3E,CAAA"}
1
+ {"version":3,"file":"getTenantListFilter.d.ts","sourceRoot":"","sources":["../../src/utilities/getTenantListFilter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAMpD,KAAK,IAAI,GAAG;IACV,GAAG,EAAE,cAAc,CAAA;IACnB,eAAe,EAAE,MAAM,CAAA;IACvB,qBAAqB,EAAE,MAAM,CAAA;CAC9B,CAAA;AACD,eAAO,MAAM,mBAAmB,qDAI7B,IAAI,KAAG,IAAI,GAAG,KAgBhB,CAAA"}
@@ -1,7 +1,12 @@
1
1
  import { SELECT_ALL } from '../constants.js';
2
+ import { getCollectionIDType } from './getCollectionIDType.js';
2
3
  import { getTenantFromCookie } from './getTenantFromCookie.js';
3
- export const getTenantListFilter = ({ req, tenantFieldName })=>{
4
- const selectedTenant = getTenantFromCookie(req.headers, req.payload.db.defaultIDType);
4
+ export const getTenantListFilter = ({ req, tenantFieldName, tenantsCollectionSlug })=>{
5
+ const idType = getCollectionIDType({
6
+ collectionSlug: tenantsCollectionSlug,
7
+ payload: req.payload
8
+ });
9
+ const selectedTenant = getTenantFromCookie(req.headers, idType);
5
10
  if (selectedTenant === SELECT_ALL) {
6
11
  return {};
7
12
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utilities/getTenantListFilter.ts"],"sourcesContent":["import type { PayloadRequest, Where } from 'payload'\n\nimport { SELECT_ALL } from '../constants.js'\nimport { getTenantFromCookie } from './getTenantFromCookie.js'\n\ntype Args = {\n req: PayloadRequest\n tenantFieldName: string\n}\nexport const getTenantListFilter = ({ req, tenantFieldName }: Args): null | Where => {\n const selectedTenant = getTenantFromCookie(req.headers, req.payload.db.defaultIDType)\n\n if (selectedTenant === SELECT_ALL) {\n return {}\n }\n\n return {\n [tenantFieldName]: {\n equals: selectedTenant,\n },\n }\n}\n"],"names":["SELECT_ALL","getTenantFromCookie","getTenantListFilter","req","tenantFieldName","selectedTenant","headers","payload","db","defaultIDType","equals"],"mappings":"AAEA,SAASA,UAAU,QAAQ,kBAAiB;AAC5C,SAASC,mBAAmB,QAAQ,2BAA0B;AAM9D,OAAO,MAAMC,sBAAsB,CAAC,EAAEC,GAAG,EAAEC,eAAe,EAAQ;IAChE,MAAMC,iBAAiBJ,oBAAoBE,IAAIG,OAAO,EAAEH,IAAII,OAAO,CAACC,EAAE,CAACC,aAAa;IAEpF,IAAIJ,mBAAmBL,YAAY;QACjC,OAAO,CAAC;IACV;IAEA,OAAO;QACL,CAACI,gBAAgB,EAAE;YACjBM,QAAQL;QACV;IACF;AACF,EAAC"}
1
+ {"version":3,"sources":["../../src/utilities/getTenantListFilter.ts"],"sourcesContent":["import type { PayloadRequest, Where } from 'payload'\n\nimport { SELECT_ALL } from '../constants.js'\nimport { getCollectionIDType } from './getCollectionIDType.js'\nimport { getTenantFromCookie } from './getTenantFromCookie.js'\n\ntype Args = {\n req: PayloadRequest\n tenantFieldName: string\n tenantsCollectionSlug: string\n}\nexport const getTenantListFilter = ({\n req,\n tenantFieldName,\n tenantsCollectionSlug,\n}: Args): null | Where => {\n const idType = getCollectionIDType({\n collectionSlug: tenantsCollectionSlug,\n payload: req.payload,\n })\n const selectedTenant = getTenantFromCookie(req.headers, idType)\n\n if (selectedTenant === SELECT_ALL) {\n return {}\n }\n\n return {\n [tenantFieldName]: {\n equals: selectedTenant,\n },\n }\n}\n"],"names":["SELECT_ALL","getCollectionIDType","getTenantFromCookie","getTenantListFilter","req","tenantFieldName","tenantsCollectionSlug","idType","collectionSlug","payload","selectedTenant","headers","equals"],"mappings":"AAEA,SAASA,UAAU,QAAQ,kBAAiB;AAC5C,SAASC,mBAAmB,QAAQ,2BAA0B;AAC9D,SAASC,mBAAmB,QAAQ,2BAA0B;AAO9D,OAAO,MAAMC,sBAAsB,CAAC,EAClCC,GAAG,EACHC,eAAe,EACfC,qBAAqB,EAChB;IACL,MAAMC,SAASN,oBAAoB;QACjCO,gBAAgBF;QAChBG,SAASL,IAAIK,OAAO;IACtB;IACA,MAAMC,iBAAiBR,oBAAoBE,IAAIO,OAAO,EAAEJ;IAExD,IAAIG,mBAAmBV,YAAY;QACjC,OAAO,CAAC;IACV;IAEA,OAAO;QACL,CAACK,gBAAgB,EAAE;YACjBO,QAAQF;QACV;IACF;AACF,EAAC"}
@@ -2,12 +2,13 @@ import type { BaseListFilter } from 'payload';
2
2
  type Args = {
3
3
  baseListFilter?: BaseListFilter;
4
4
  tenantFieldName: string;
5
+ tenantsCollectionSlug: string;
5
6
  };
6
7
  /**
7
8
  * Combines a base list filter with a tenant list filter
8
9
  *
9
10
  * Combines where constraints inside of an AND operator
10
11
  */
11
- export declare const withTenantListFilter: ({ baseListFilter, tenantFieldName }: Args) => BaseListFilter;
12
+ export declare const withTenantListFilter: ({ baseListFilter, tenantFieldName, tenantsCollectionSlug }: Args) => BaseListFilter;
12
13
  export {};
13
14
  //# sourceMappingURL=withTenantListFilter.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"withTenantListFilter.d.ts","sourceRoot":"","sources":["../../src/utilities/withTenantListFilter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAS,MAAM,SAAS,CAAA;AAIpD,KAAK,IAAI,GAAG;IACV,cAAc,CAAC,EAAE,cAAc,CAAA;IAC/B,eAAe,EAAE,MAAM,CAAA;CACxB,CAAA;AACD;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,wCACO,IAAI,KAAG,cAiC5C,CAAA"}
1
+ {"version":3,"file":"withTenantListFilter.d.ts","sourceRoot":"","sources":["../../src/utilities/withTenantListFilter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAS,MAAM,SAAS,CAAA;AAIpD,KAAK,IAAI,GAAG;IACV,cAAc,CAAC,EAAE,cAAc,CAAA;IAC/B,eAAe,EAAE,MAAM,CAAA;IACvB,qBAAqB,EAAE,MAAM,CAAA;CAC9B,CAAA;AACD;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,+DAC8B,IAAI,KAAG,cAkCnE,CAAA"}
@@ -3,7 +3,7 @@ import { getTenantListFilter } from './getTenantListFilter.js';
3
3
  * Combines a base list filter with a tenant list filter
4
4
  *
5
5
  * Combines where constraints inside of an AND operator
6
- */ export const withTenantListFilter = ({ baseListFilter, tenantFieldName })=>async (args)=>{
6
+ */ export const withTenantListFilter = ({ baseListFilter, tenantFieldName, tenantsCollectionSlug })=>async (args)=>{
7
7
  const filterConstraints = [];
8
8
  if (typeof baseListFilter === 'function') {
9
9
  const baseListFilterResult = await baseListFilter(args);
@@ -13,7 +13,8 @@ import { getTenantListFilter } from './getTenantListFilter.js';
13
13
  }
14
14
  const tenantListFilter = getTenantListFilter({
15
15
  req: args.req,
16
- tenantFieldName
16
+ tenantFieldName,
17
+ tenantsCollectionSlug
17
18
  });
18
19
  if (tenantListFilter) {
19
20
  filterConstraints.push(tenantListFilter);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utilities/withTenantListFilter.ts"],"sourcesContent":["import type { BaseListFilter, Where } from 'payload'\n\nimport { getTenantListFilter } from './getTenantListFilter.js'\n\ntype Args = {\n baseListFilter?: BaseListFilter\n tenantFieldName: string\n}\n/**\n * Combines a base list filter with a tenant list filter\n *\n * Combines where constraints inside of an AND operator\n */\nexport const withTenantListFilter =\n ({ baseListFilter, tenantFieldName }: Args): BaseListFilter =>\n async (args) => {\n const filterConstraints = []\n\n if (typeof baseListFilter === 'function') {\n const baseListFilterResult = await baseListFilter(args)\n\n if (baseListFilterResult) {\n filterConstraints.push(baseListFilterResult)\n }\n }\n\n const tenantListFilter = getTenantListFilter({\n req: args.req,\n tenantFieldName,\n })\n\n if (tenantListFilter) {\n filterConstraints.push(tenantListFilter)\n }\n\n if (filterConstraints.length) {\n const combinedWhere: Where = { and: [] }\n filterConstraints.forEach((constraint) => {\n if (combinedWhere.and && constraint && typeof constraint === 'object') {\n combinedWhere.and.push(constraint)\n }\n })\n return combinedWhere\n }\n\n // Access control will take it from here\n return null\n }\n"],"names":["getTenantListFilter","withTenantListFilter","baseListFilter","tenantFieldName","args","filterConstraints","baseListFilterResult","push","tenantListFilter","req","length","combinedWhere","and","forEach","constraint"],"mappings":"AAEA,SAASA,mBAAmB,QAAQ,2BAA0B;AAM9D;;;;CAIC,GACD,OAAO,MAAMC,uBACX,CAAC,EAAEC,cAAc,EAAEC,eAAe,EAAQ,GAC1C,OAAOC;QACL,MAAMC,oBAAoB,EAAE;QAE5B,IAAI,OAAOH,mBAAmB,YAAY;YACxC,MAAMI,uBAAuB,MAAMJ,eAAeE;YAElD,IAAIE,sBAAsB;gBACxBD,kBAAkBE,IAAI,CAACD;YACzB;QACF;QAEA,MAAME,mBAAmBR,oBAAoB;YAC3CS,KAAKL,KAAKK,GAAG;YACbN;QACF;QAEA,IAAIK,kBAAkB;YACpBH,kBAAkBE,IAAI,CAACC;QACzB;QAEA,IAAIH,kBAAkBK,MAAM,EAAE;YAC5B,MAAMC,gBAAuB;gBAAEC,KAAK,EAAE;YAAC;YACvCP,kBAAkBQ,OAAO,CAAC,CAACC;gBACzB,IAAIH,cAAcC,GAAG,IAAIE,cAAc,OAAOA,eAAe,UAAU;oBACrEH,cAAcC,GAAG,CAACL,IAAI,CAACO;gBACzB;YACF;YACA,OAAOH;QACT;QAEA,wCAAwC;QACxC,OAAO;IACT,EAAC"}
1
+ {"version":3,"sources":["../../src/utilities/withTenantListFilter.ts"],"sourcesContent":["import type { BaseListFilter, Where } from 'payload'\n\nimport { getTenantListFilter } from './getTenantListFilter.js'\n\ntype Args = {\n baseListFilter?: BaseListFilter\n tenantFieldName: string\n tenantsCollectionSlug: string\n}\n/**\n * Combines a base list filter with a tenant list filter\n *\n * Combines where constraints inside of an AND operator\n */\nexport const withTenantListFilter =\n ({ baseListFilter, tenantFieldName, tenantsCollectionSlug }: Args): BaseListFilter =>\n async (args) => {\n const filterConstraints = []\n\n if (typeof baseListFilter === 'function') {\n const baseListFilterResult = await baseListFilter(args)\n\n if (baseListFilterResult) {\n filterConstraints.push(baseListFilterResult)\n }\n }\n\n const tenantListFilter = getTenantListFilter({\n req: args.req,\n tenantFieldName,\n tenantsCollectionSlug,\n })\n\n if (tenantListFilter) {\n filterConstraints.push(tenantListFilter)\n }\n\n if (filterConstraints.length) {\n const combinedWhere: Where = { and: [] }\n filterConstraints.forEach((constraint) => {\n if (combinedWhere.and && constraint && typeof constraint === 'object') {\n combinedWhere.and.push(constraint)\n }\n })\n return combinedWhere\n }\n\n // Access control will take it from here\n return null\n }\n"],"names":["getTenantListFilter","withTenantListFilter","baseListFilter","tenantFieldName","tenantsCollectionSlug","args","filterConstraints","baseListFilterResult","push","tenantListFilter","req","length","combinedWhere","and","forEach","constraint"],"mappings":"AAEA,SAASA,mBAAmB,QAAQ,2BAA0B;AAO9D;;;;CAIC,GACD,OAAO,MAAMC,uBACX,CAAC,EAAEC,cAAc,EAAEC,eAAe,EAAEC,qBAAqB,EAAQ,GACjE,OAAOC;QACL,MAAMC,oBAAoB,EAAE;QAE5B,IAAI,OAAOJ,mBAAmB,YAAY;YACxC,MAAMK,uBAAuB,MAAML,eAAeG;YAElD,IAAIE,sBAAsB;gBACxBD,kBAAkBE,IAAI,CAACD;YACzB;QACF;QAEA,MAAME,mBAAmBT,oBAAoB;YAC3CU,KAAKL,KAAKK,GAAG;YACbP;YACAC;QACF;QAEA,IAAIK,kBAAkB;YACpBH,kBAAkBE,IAAI,CAACC;QACzB;QAEA,IAAIH,kBAAkBK,MAAM,EAAE;YAC5B,MAAMC,gBAAuB;gBAAEC,KAAK,EAAE;YAAC;YACvCP,kBAAkBQ,OAAO,CAAC,CAACC;gBACzB,IAAIH,cAAcC,GAAG,IAAIE,cAAc,OAAOA,eAAe,UAAU;oBACrEH,cAAcC,GAAG,CAACL,IAAI,CAACO;gBACzB;YACF;YACA,OAAOH;QACT;QAEA,wCAAwC;QACxC,OAAO;IACT,EAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@payloadcms/plugin-multi-tenant",
3
- "version": "3.19.0",
3
+ "version": "3.20.0-canary.0e01b65",
4
4
  "description": "Multi Tenant plugin for Payload",
5
5
  "keywords": [
6
6
  "payload",
@@ -67,13 +67,13 @@
67
67
  ],
68
68
  "devDependencies": {
69
69
  "@payloadcms/eslint-config": "3.9.0",
70
- "@payloadcms/ui": "3.19.0",
71
- "payload": "3.19.0"
70
+ "@payloadcms/ui": "3.20.0-canary.0e01b65",
71
+ "payload": "3.20.0-canary.0e01b65"
72
72
  },
73
73
  "peerDependencies": {
74
74
  "next": "^15.0.3",
75
- "@payloadcms/ui": "3.19.0",
76
- "payload": "3.19.0"
75
+ "@payloadcms/ui": "3.20.0-canary.0e01b65",
76
+ "payload": "3.20.0-canary.0e01b65"
77
77
  },
78
78
  "homepage:": "https://payloadcms.com",
79
79
  "scripts": {