@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
@@ -4,6 +4,8 @@ type Args = {
4
4
  docID?: number | string;
5
5
  globalSlugs: string[];
6
6
  tenantFieldName: string;
7
+ tenantsCollectionSlug: string;
8
+ useAsTitle: string;
7
9
  viewType: ViewTypes;
8
10
  } & ServerProps;
9
11
  export declare const GlobalViewRedirect: (args: Args) => Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/GlobalViewRedirect/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAOrE,KAAK,IAAI,GAAG;IACV,cAAc,EAAE,cAAc,CAAA;IAC9B,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IACvB,WAAW,EAAE,MAAM,EAAE,CAAA;IACrB,eAAe,EAAE,MAAM,CAAA;IACvB,QAAQ,EAAE,SAAS,CAAA;CACpB,GAAG,WAAW,CAAA;AAEf,eAAO,MAAM,kBAAkB,SAAgB,IAAI,kBAkBlD,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/GlobalViewRedirect/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAOrE,KAAK,IAAI,GAAG;IACV,cAAc,EAAE,cAAc,CAAA;IAC9B,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IACvB,WAAW,EAAE,MAAM,EAAE,CAAA;IACrB,eAAe,EAAE,MAAM,CAAA;IACvB,qBAAqB,EAAE,MAAM,CAAA;IAC7B,UAAU,EAAE,MAAM,CAAA;IAClB,QAAQ,EAAE,SAAS,CAAA;CACpB,GAAG,WAAW,CAAA;AAEf,eAAO,MAAM,kBAAkB,SAAgB,IAAI,kBAoBlD,CAAA"}
@@ -11,6 +11,9 @@ export const GlobalViewRedirect = async (args)=>{
11
11
  headers,
12
12
  payload: args.payload,
13
13
  tenantFieldName: args.tenantFieldName,
14
+ tenantsCollectionSlug: args.tenantsCollectionSlug,
15
+ useAsTitle: args.useAsTitle,
16
+ user: args.user,
14
17
  view: args.viewType
15
18
  });
16
19
  if (redirectRoute) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/GlobalViewRedirect/index.ts"],"sourcesContent":["import type { CollectionSlug, ServerProps, ViewTypes } from 'payload'\n\nimport { headers as getHeaders } from 'next/headers.js'\nimport { redirect } from 'next/navigation.js'\n\nimport { getGlobalViewRedirect } from '../../utilities/getGlobalViewRedirect.js'\n\ntype Args = {\n collectionSlug: CollectionSlug\n docID?: number | string\n globalSlugs: string[]\n tenantFieldName: string\n viewType: ViewTypes\n} & ServerProps\n\nexport const GlobalViewRedirect = async (args: Args) => {\n const collectionSlug = args?.collectionSlug\n\n if (collectionSlug && args.globalSlugs?.includes(collectionSlug)) {\n const headers = await getHeaders()\n const redirectRoute = await getGlobalViewRedirect({\n slug: collectionSlug,\n docID: args.docID,\n headers,\n payload: args.payload,\n tenantFieldName: args.tenantFieldName,\n view: args.viewType,\n })\n\n if (redirectRoute) {\n redirect(redirectRoute)\n }\n }\n}\n"],"names":["headers","getHeaders","redirect","getGlobalViewRedirect","GlobalViewRedirect","args","collectionSlug","globalSlugs","includes","redirectRoute","slug","docID","payload","tenantFieldName","view","viewType"],"mappings":"AAEA,SAASA,WAAWC,UAAU,QAAQ,kBAAiB;AACvD,SAASC,QAAQ,QAAQ,qBAAoB;AAE7C,SAASC,qBAAqB,QAAQ,2CAA0C;AAUhF,OAAO,MAAMC,qBAAqB,OAAOC;IACvC,MAAMC,iBAAiBD,MAAMC;IAE7B,IAAIA,kBAAkBD,KAAKE,WAAW,EAAEC,SAASF,iBAAiB;QAChE,MAAMN,UAAU,MAAMC;QACtB,MAAMQ,gBAAgB,MAAMN,sBAAsB;YAChDO,MAAMJ;YACNK,OAAON,KAAKM,KAAK;YACjBX;YACAY,SAASP,KAAKO,OAAO;YACrBC,iBAAiBR,KAAKQ,eAAe;YACrCC,MAAMT,KAAKU,QAAQ;QACrB;QAEA,IAAIN,eAAe;YACjBP,SAASO;QACX;IACF;AACF,EAAC"}
1
+ {"version":3,"sources":["../../../src/components/GlobalViewRedirect/index.ts"],"sourcesContent":["import type { CollectionSlug, ServerProps, ViewTypes } from 'payload'\n\nimport { headers as getHeaders } from 'next/headers.js'\nimport { redirect } from 'next/navigation.js'\n\nimport { getGlobalViewRedirect } from '../../utilities/getGlobalViewRedirect.js'\n\ntype Args = {\n collectionSlug: CollectionSlug\n docID?: number | string\n globalSlugs: string[]\n tenantFieldName: string\n tenantsCollectionSlug: string\n useAsTitle: string\n viewType: ViewTypes\n} & ServerProps\n\nexport const GlobalViewRedirect = async (args: Args) => {\n const collectionSlug = args?.collectionSlug\n if (collectionSlug && args.globalSlugs?.includes(collectionSlug)) {\n const headers = await getHeaders()\n const redirectRoute = await getGlobalViewRedirect({\n slug: collectionSlug,\n docID: args.docID,\n headers,\n payload: args.payload,\n tenantFieldName: args.tenantFieldName,\n tenantsCollectionSlug: args.tenantsCollectionSlug,\n useAsTitle: args.useAsTitle,\n user: args.user,\n view: args.viewType,\n })\n\n if (redirectRoute) {\n redirect(redirectRoute)\n }\n }\n}\n"],"names":["headers","getHeaders","redirect","getGlobalViewRedirect","GlobalViewRedirect","args","collectionSlug","globalSlugs","includes","redirectRoute","slug","docID","payload","tenantFieldName","tenantsCollectionSlug","useAsTitle","user","view","viewType"],"mappings":"AAEA,SAASA,WAAWC,UAAU,QAAQ,kBAAiB;AACvD,SAASC,QAAQ,QAAQ,qBAAoB;AAE7C,SAASC,qBAAqB,QAAQ,2CAA0C;AAYhF,OAAO,MAAMC,qBAAqB,OAAOC;IACvC,MAAMC,iBAAiBD,MAAMC;IAC7B,IAAIA,kBAAkBD,KAAKE,WAAW,EAAEC,SAASF,iBAAiB;QAChE,MAAMN,UAAU,MAAMC;QACtB,MAAMQ,gBAAgB,MAAMN,sBAAsB;YAChDO,MAAMJ;YACNK,OAAON,KAAKM,KAAK;YACjBX;YACAY,SAASP,KAAKO,OAAO;YACrBC,iBAAiBR,KAAKQ,eAAe;YACrCC,uBAAuBT,KAAKS,qBAAqB;YACjDC,YAAYV,KAAKU,UAAU;YAC3BC,MAAMX,KAAKW,IAAI;YACfC,MAAMZ,KAAKa,QAAQ;QACrB;QAEA,IAAIT,eAAe;YACjBP,SAASO;QACX;IACF;AACF,EAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/fields/tenantField/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,SAAS,CAAA;AAKhD,KAAK,IAAI,GAAG;IACV,MAAM,CAAC,EAAE,iBAAiB,CAAC,QAAQ,CAAC,CAAA;IACpC,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,IAAI,EAAE,MAAM,CAAA;IACZ,qBAAqB,EAAE,MAAM,CAAA;IAC7B,MAAM,EAAE,OAAO,CAAA;CAChB,CAAA;AACD,eAAO,MAAM,WAAW,4DAMrB,IAAI,KAAG,iBAqCR,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/fields/tenantField/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,SAAS,CAAA;AAMhD,KAAK,IAAI,GAAG;IACV,MAAM,CAAC,EAAE,iBAAiB,CAAC,QAAQ,CAAC,CAAA;IACpC,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,IAAI,EAAE,MAAM,CAAA;IACZ,qBAAqB,EAAE,MAAM,CAAA;IAC7B,MAAM,EAAE,OAAO,CAAA;CAChB,CAAA;AACD,eAAO,MAAM,WAAW,4DAMrB,IAAI,KAAG,iBA2CR,CAAA"}
@@ -1,4 +1,5 @@
1
1
  import { APIError } from 'payload';
2
+ import { getCollectionIDType } from '../../utilities/getCollectionIDType.js';
2
3
  import { getTenantFromCookie } from '../../utilities/getTenantFromCookie.js';
3
4
  export const tenantField = ({ name, access = undefined, debug, tenantsCollectionSlug, unique })=>({
4
5
  name,
@@ -23,13 +24,18 @@ export const tenantField = ({ name, access = undefined, debug, tenantsCollection
23
24
  hooks: {
24
25
  beforeChange: [
25
26
  ({ req, value })=>{
27
+ const idType = getCollectionIDType({
28
+ collectionSlug: tenantsCollectionSlug,
29
+ payload: req.payload
30
+ });
26
31
  if (!value) {
27
- const tenantFromCookie = getTenantFromCookie(req.headers, req.payload.db.defaultIDType);
32
+ const tenantFromCookie = getTenantFromCookie(req.headers, idType);
28
33
  if (tenantFromCookie) {
29
34
  return tenantFromCookie;
30
35
  }
31
36
  throw new APIError('You must select a tenant', 400, null, true);
32
37
  }
38
+ return idType === 'number' ? parseFloat(value) : value;
33
39
  }
34
40
  ]
35
41
  },
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/fields/tenantField/index.ts"],"sourcesContent":["import { type RelationshipField } from 'payload'\nimport { APIError } from 'payload'\n\nimport { getTenantFromCookie } from '../../utilities/getTenantFromCookie.js'\n\ntype Args = {\n access?: RelationshipField['access']\n debug?: boolean\n name: string\n tenantsCollectionSlug: string\n unique: boolean\n}\nexport const tenantField = ({\n name,\n access = undefined,\n debug,\n tenantsCollectionSlug,\n unique,\n}: Args): RelationshipField => ({\n name,\n type: 'relationship',\n access,\n admin: {\n allowCreate: false,\n allowEdit: false,\n components: {\n Field: {\n clientProps: {\n debug,\n unique,\n },\n path: '@payloadcms/plugin-multi-tenant/client#TenantField',\n },\n },\n disableListColumn: true,\n disableListFilter: true,\n },\n hasMany: false,\n hooks: {\n beforeChange: [\n ({ req, value }) => {\n if (!value) {\n const tenantFromCookie = getTenantFromCookie(req.headers, req.payload.db.defaultIDType)\n if (tenantFromCookie) {\n return tenantFromCookie\n }\n throw new APIError('You must select a tenant', 400, null, true)\n }\n },\n ],\n },\n index: true,\n label: 'Assigned Tenant',\n relationTo: tenantsCollectionSlug,\n unique,\n})\n"],"names":["APIError","getTenantFromCookie","tenantField","name","access","undefined","debug","tenantsCollectionSlug","unique","type","admin","allowCreate","allowEdit","components","Field","clientProps","path","disableListColumn","disableListFilter","hasMany","hooks","beforeChange","req","value","tenantFromCookie","headers","payload","db","defaultIDType","index","label","relationTo"],"mappings":"AACA,SAASA,QAAQ,QAAQ,UAAS;AAElC,SAASC,mBAAmB,QAAQ,yCAAwC;AAS5E,OAAO,MAAMC,cAAc,CAAC,EAC1BC,IAAI,EACJC,SAASC,SAAS,EAClBC,KAAK,EACLC,qBAAqB,EACrBC,MAAM,EACD,GAAyB,CAAA;QAC9BL;QACAM,MAAM;QACNL;QACAM,OAAO;YACLC,aAAa;YACbC,WAAW;YACXC,YAAY;gBACVC,OAAO;oBACLC,aAAa;wBACXT;wBACAE;oBACF;oBACAQ,MAAM;gBACR;YACF;YACAC,mBAAmB;YACnBC,mBAAmB;QACrB;QACAC,SAAS;QACTC,OAAO;YACLC,cAAc;gBACZ,CAAC,EAAEC,GAAG,EAAEC,KAAK,EAAE;oBACb,IAAI,CAACA,OAAO;wBACV,MAAMC,mBAAmBvB,oBAAoBqB,IAAIG,OAAO,EAAEH,IAAII,OAAO,CAACC,EAAE,CAACC,aAAa;wBACtF,IAAIJ,kBAAkB;4BACpB,OAAOA;wBACT;wBACA,MAAM,IAAIxB,SAAS,4BAA4B,KAAK,MAAM;oBAC5D;gBACF;aACD;QACH;QACA6B,OAAO;QACPC,OAAO;QACPC,YAAYxB;QACZC;IACF,CAAA,EAAE"}
1
+ {"version":3,"sources":["../../../src/fields/tenantField/index.ts"],"sourcesContent":["import { type RelationshipField } from 'payload'\nimport { APIError } from 'payload'\n\nimport { getCollectionIDType } from '../../utilities/getCollectionIDType.js'\nimport { getTenantFromCookie } from '../../utilities/getTenantFromCookie.js'\n\ntype Args = {\n access?: RelationshipField['access']\n debug?: boolean\n name: string\n tenantsCollectionSlug: string\n unique: boolean\n}\nexport const tenantField = ({\n name,\n access = undefined,\n debug,\n tenantsCollectionSlug,\n unique,\n}: Args): RelationshipField => ({\n name,\n type: 'relationship',\n access,\n admin: {\n allowCreate: false,\n allowEdit: false,\n components: {\n Field: {\n clientProps: {\n debug,\n unique,\n },\n path: '@payloadcms/plugin-multi-tenant/client#TenantField',\n },\n },\n disableListColumn: true,\n disableListFilter: true,\n },\n hasMany: false,\n hooks: {\n beforeChange: [\n ({ req, value }) => {\n const idType = getCollectionIDType({\n collectionSlug: tenantsCollectionSlug,\n payload: req.payload,\n })\n if (!value) {\n const tenantFromCookie = getTenantFromCookie(req.headers, idType)\n if (tenantFromCookie) {\n return tenantFromCookie\n }\n throw new APIError('You must select a tenant', 400, null, true)\n }\n\n return idType === 'number' ? parseFloat(value) : value\n },\n ],\n },\n index: true,\n label: 'Assigned Tenant',\n relationTo: tenantsCollectionSlug,\n unique,\n})\n"],"names":["APIError","getCollectionIDType","getTenantFromCookie","tenantField","name","access","undefined","debug","tenantsCollectionSlug","unique","type","admin","allowCreate","allowEdit","components","Field","clientProps","path","disableListColumn","disableListFilter","hasMany","hooks","beforeChange","req","value","idType","collectionSlug","payload","tenantFromCookie","headers","parseFloat","index","label","relationTo"],"mappings":"AACA,SAASA,QAAQ,QAAQ,UAAS;AAElC,SAASC,mBAAmB,QAAQ,yCAAwC;AAC5E,SAASC,mBAAmB,QAAQ,yCAAwC;AAS5E,OAAO,MAAMC,cAAc,CAAC,EAC1BC,IAAI,EACJC,SAASC,SAAS,EAClBC,KAAK,EACLC,qBAAqB,EACrBC,MAAM,EACD,GAAyB,CAAA;QAC9BL;QACAM,MAAM;QACNL;QACAM,OAAO;YACLC,aAAa;YACbC,WAAW;YACXC,YAAY;gBACVC,OAAO;oBACLC,aAAa;wBACXT;wBACAE;oBACF;oBACAQ,MAAM;gBACR;YACF;YACAC,mBAAmB;YACnBC,mBAAmB;QACrB;QACAC,SAAS;QACTC,OAAO;YACLC,cAAc;gBACZ,CAAC,EAAEC,GAAG,EAAEC,KAAK,EAAE;oBACb,MAAMC,SAASxB,oBAAoB;wBACjCyB,gBAAgBlB;wBAChBmB,SAASJ,IAAII,OAAO;oBACtB;oBACA,IAAI,CAACH,OAAO;wBACV,MAAMI,mBAAmB1B,oBAAoBqB,IAAIM,OAAO,EAAEJ;wBAC1D,IAAIG,kBAAkB;4BACpB,OAAOA;wBACT;wBACA,MAAM,IAAI5B,SAAS,4BAA4B,KAAK,MAAM;oBAC5D;oBAEA,OAAOyB,WAAW,WAAWK,WAAWN,SAASA;gBACnD;aACD;QACH;QACAO,OAAO;QACPC,OAAO;QACPC,YAAYzB;QACZC;IACF,CAAA,EAAE"}
@@ -3,5 +3,6 @@ export declare const tenantsArrayField: (args: {
3
3
  arrayFieldAccess?: ArrayField["access"];
4
4
  rowFields?: ArrayField["fields"];
5
5
  tenantFieldAccess?: RelationshipField["access"];
6
+ tenantsCollectionSlug: string;
6
7
  }) => ArrayField;
7
8
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/fields/tenantsArrayField/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAA;AAE5D,eAAO,MAAM,iBAAiB,SAAU;IACtC,gBAAgB,CAAC,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAA;IACvC,SAAS,CAAC,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAA;IAChC,iBAAiB,CAAC,EAAE,iBAAiB,CAAC,QAAQ,CAAC,CAAA;CAChD,KAAG,UAiBF,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/fields/tenantsArrayField/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAA;AAE5D,eAAO,MAAM,iBAAiB,SAAU;IACtC,gBAAgB,CAAC,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAA;IACvC,SAAS,CAAC,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAA;IAChC,iBAAiB,CAAC,EAAE,iBAAiB,CAAC,QAAQ,CAAC,CAAA;IAC/C,qBAAqB,EAAE,MAAM,CAAA;CAC9B,KAAG,UAiBF,CAAA"}
@@ -8,7 +8,7 @@ export const tenantsArrayField = (args)=>({
8
8
  type: 'relationship',
9
9
  access: args.tenantFieldAccess,
10
10
  index: true,
11
- relationTo: 'tenants',
11
+ relationTo: args.tenantsCollectionSlug,
12
12
  required: true,
13
13
  saveToJWT: true
14
14
  },
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/fields/tenantsArrayField/index.ts"],"sourcesContent":["import type { ArrayField, RelationshipField } from 'payload'\n\nexport const tenantsArrayField = (args: {\n arrayFieldAccess?: ArrayField['access']\n rowFields?: ArrayField['fields']\n tenantFieldAccess?: RelationshipField['access']\n}): ArrayField => ({\n name: 'tenants',\n type: 'array',\n access: args?.arrayFieldAccess,\n fields: [\n {\n name: 'tenant',\n type: 'relationship',\n access: args.tenantFieldAccess,\n index: true,\n relationTo: 'tenants',\n required: true,\n saveToJWT: true,\n },\n ...(args?.rowFields || []),\n ],\n saveToJWT: true,\n})\n"],"names":["tenantsArrayField","args","name","type","access","arrayFieldAccess","fields","tenantFieldAccess","index","relationTo","required","saveToJWT","rowFields"],"mappings":"AAEA,OAAO,MAAMA,oBAAoB,CAACC,OAIf,CAAA;QACjBC,MAAM;QACNC,MAAM;QACNC,QAAQH,MAAMI;QACdC,QAAQ;YACN;gBACEJ,MAAM;gBACNC,MAAM;gBACNC,QAAQH,KAAKM,iBAAiB;gBAC9BC,OAAO;gBACPC,YAAY;gBACZC,UAAU;gBACVC,WAAW;YACb;eACIV,MAAMW,aAAa,EAAE;SAC1B;QACDD,WAAW;IACb,CAAA,EAAE"}
1
+ {"version":3,"sources":["../../../src/fields/tenantsArrayField/index.ts"],"sourcesContent":["import type { ArrayField, RelationshipField } from 'payload'\n\nexport const tenantsArrayField = (args: {\n arrayFieldAccess?: ArrayField['access']\n rowFields?: ArrayField['fields']\n tenantFieldAccess?: RelationshipField['access']\n tenantsCollectionSlug: string\n}): ArrayField => ({\n name: 'tenants',\n type: 'array',\n access: args?.arrayFieldAccess,\n fields: [\n {\n name: 'tenant',\n type: 'relationship',\n access: args.tenantFieldAccess,\n index: true,\n relationTo: args.tenantsCollectionSlug,\n required: true,\n saveToJWT: true,\n },\n ...(args?.rowFields || []),\n ],\n saveToJWT: true,\n})\n"],"names":["tenantsArrayField","args","name","type","access","arrayFieldAccess","fields","tenantFieldAccess","index","relationTo","tenantsCollectionSlug","required","saveToJWT","rowFields"],"mappings":"AAEA,OAAO,MAAMA,oBAAoB,CAACC,OAKf,CAAA;QACjBC,MAAM;QACNC,MAAM;QACNC,QAAQH,MAAMI;QACdC,QAAQ;YACN;gBACEJ,MAAM;gBACNC,MAAM;gBACNC,QAAQH,KAAKM,iBAAiB;gBAC9BC,OAAO;gBACPC,YAAYR,KAAKS,qBAAqB;gBACtCC,UAAU;gBACVC,WAAW;YACb;eACIX,MAAMY,aAAa,EAAE;SAC1B;QACDD,WAAW;IACb,CAAA,EAAE"}
@@ -3,6 +3,7 @@ type Args = {
3
3
  collection: CollectionConfig;
4
4
  enabledSlugs: string[];
5
5
  tenantFieldName: string;
6
+ tenantsCollectionSlug: string;
6
7
  usersSlug: string;
7
8
  };
8
9
  /**
@@ -10,7 +11,7 @@ type Args = {
10
11
  * - delete documents related to tenant
11
12
  * - remove tenant from users
12
13
  */
13
- export declare const addTenantCleanup: ({ collection, enabledSlugs, tenantFieldName, usersSlug, }: Args) => void;
14
- export declare const afterTenantDelete: ({ enabledSlugs, tenantFieldName, usersSlug, }: Omit<Args, "collection">) => CollectionAfterDeleteHook;
14
+ export declare const addTenantCleanup: ({ collection, enabledSlugs, tenantFieldName, tenantsCollectionSlug, usersSlug, }: Args) => void;
15
+ export declare const afterTenantDelete: ({ enabledSlugs, tenantFieldName, tenantsCollectionSlug, usersSlug, }: Omit<Args, "collection">) => CollectionAfterDeleteHook;
15
16
  export {};
16
17
  //# sourceMappingURL=afterTenantDelete.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"afterTenantDelete.d.ts","sourceRoot":"","sources":["../../src/hooks/afterTenantDelete.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,yBAAyB,EACzB,gBAAgB,EAGjB,MAAM,SAAS,CAAA;AAQhB,KAAK,IAAI,GAAG;IACV,UAAU,EAAE,gBAAgB,CAAA;IAC5B,YAAY,EAAE,MAAM,EAAE,CAAA;IACtB,eAAe,EAAE,MAAM,CAAA;IACvB,SAAS,EAAE,MAAM,CAAA;CAClB,CAAA;AACD;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,8DAK1B,IAAI,SAcN,CAAA;AAED,eAAO,MAAM,iBAAiB,kDAKzB,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC,KAAG,yBA4D7B,CAAA"}
1
+ {"version":3,"file":"afterTenantDelete.d.ts","sourceRoot":"","sources":["../../src/hooks/afterTenantDelete.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,yBAAyB,EACzB,gBAAgB,EAGjB,MAAM,SAAS,CAAA;AAShB,KAAK,IAAI,GAAG;IACV,UAAU,EAAE,gBAAgB,CAAA;IAC5B,YAAY,EAAE,MAAM,EAAE,CAAA;IACtB,eAAe,EAAE,MAAM,CAAA;IACvB,qBAAqB,EAAE,MAAM,CAAA;IAC7B,SAAS,EAAE,MAAM,CAAA;CAClB,CAAA;AACD;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,qFAM1B,IAAI,SAeN,CAAA;AAED,eAAO,MAAM,iBAAiB,yEAMzB,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC,KAAG,yBAgE7B,CAAA"}
@@ -1,10 +1,11 @@
1
1
  import { generateCookie, mergeHeaders } from 'payload';
2
+ import { getCollectionIDType } from '../utilities/getCollectionIDType.js';
2
3
  import { getTenantFromCookie } from '../utilities/getTenantFromCookie.js';
3
4
  /**
4
5
  * Add cleanup logic when tenant is deleted
5
6
  * - delete documents related to tenant
6
7
  * - remove tenant from users
7
- */ export const addTenantCleanup = ({ collection, enabledSlugs, tenantFieldName, usersSlug })=>{
8
+ */ export const addTenantCleanup = ({ collection, enabledSlugs, tenantFieldName, tenantsCollectionSlug, usersSlug })=>{
8
9
  if (!collection.hooks) {
9
10
  collection.hooks = {};
10
11
  }
@@ -14,11 +15,16 @@ import { getTenantFromCookie } from '../utilities/getTenantFromCookie.js';
14
15
  collection.hooks.afterDelete.push(afterTenantDelete({
15
16
  enabledSlugs,
16
17
  tenantFieldName,
18
+ tenantsCollectionSlug,
17
19
  usersSlug
18
20
  }));
19
21
  };
20
- export const afterTenantDelete = ({ enabledSlugs, tenantFieldName, usersSlug })=>async ({ id, req })=>{
21
- const currentTenantCookieID = getTenantFromCookie(req.headers, req.payload.db.defaultIDType);
22
+ export const afterTenantDelete = ({ enabledSlugs, tenantFieldName, tenantsCollectionSlug, usersSlug })=>async ({ id, req })=>{
23
+ const idType = getCollectionIDType({
24
+ collectionSlug: tenantsCollectionSlug,
25
+ payload: req.payload
26
+ });
27
+ const currentTenantCookieID = getTenantFromCookie(req.headers, idType);
22
28
  if (currentTenantCookieID === id) {
23
29
  const newHeaders = new Headers({
24
30
  'Set-Cookie': generateCookie({
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/hooks/afterTenantDelete.ts"],"sourcesContent":["import type {\n CollectionAfterDeleteHook,\n CollectionConfig,\n JsonObject,\n PaginatedDocs,\n} from 'payload'\n\nimport { generateCookie, mergeHeaders } from 'payload'\n\nimport type { UserWithTenantsField } from '../types.js'\n\nimport { getTenantFromCookie } from '../utilities/getTenantFromCookie.js'\n\ntype Args = {\n collection: CollectionConfig\n enabledSlugs: string[]\n tenantFieldName: string\n usersSlug: string\n}\n/**\n * Add cleanup logic when tenant is deleted\n * - delete documents related to tenant\n * - remove tenant from users\n */\nexport const addTenantCleanup = ({\n collection,\n enabledSlugs,\n tenantFieldName,\n usersSlug,\n}: Args) => {\n if (!collection.hooks) {\n collection.hooks = {}\n }\n if (!collection.hooks?.afterDelete) {\n collection.hooks.afterDelete = []\n }\n collection.hooks.afterDelete.push(\n afterTenantDelete({\n enabledSlugs,\n tenantFieldName,\n usersSlug,\n }),\n )\n}\n\nexport const afterTenantDelete =\n ({\n enabledSlugs,\n tenantFieldName,\n usersSlug,\n }: Omit<Args, 'collection'>): CollectionAfterDeleteHook =>\n async ({ id, req }) => {\n const currentTenantCookieID = getTenantFromCookie(req.headers, req.payload.db.defaultIDType)\n if (currentTenantCookieID === id) {\n const newHeaders = new Headers({\n 'Set-Cookie': generateCookie<string>({\n name: 'payload-tenant',\n expires: new Date(Date.now() - 1000),\n path: '/',\n returnCookieAsObject: false,\n value: '',\n }),\n })\n\n req.responseHeaders = req.responseHeaders\n ? mergeHeaders(req.responseHeaders, newHeaders)\n : newHeaders\n }\n const cleanupPromises: Promise<JsonObject>[] = []\n enabledSlugs.forEach((slug) => {\n cleanupPromises.push(\n req.payload.delete({\n collection: slug,\n where: {\n [tenantFieldName]: {\n equals: id,\n },\n },\n }),\n )\n })\n\n try {\n const usersWithTenant = (await req.payload.find({\n collection: usersSlug,\n depth: 0,\n limit: 0,\n where: {\n 'tenants.tenant': {\n equals: id,\n },\n },\n })) as PaginatedDocs<UserWithTenantsField>\n\n usersWithTenant?.docs?.forEach((user) => {\n cleanupPromises.push(\n req.payload.update({\n id: user.id,\n collection: usersSlug,\n data: {\n tenants: (user.tenants || []).filter(({ tenant: tenantID }) => tenantID !== id),\n },\n }),\n )\n })\n } catch (e) {\n console.error('Error deleting tenants from users:', e)\n }\n\n await Promise.all(cleanupPromises)\n }\n"],"names":["generateCookie","mergeHeaders","getTenantFromCookie","addTenantCleanup","collection","enabledSlugs","tenantFieldName","usersSlug","hooks","afterDelete","push","afterTenantDelete","id","req","currentTenantCookieID","headers","payload","db","defaultIDType","newHeaders","Headers","name","expires","Date","now","path","returnCookieAsObject","value","responseHeaders","cleanupPromises","forEach","slug","delete","where","equals","usersWithTenant","find","depth","limit","docs","user","update","data","tenants","filter","tenant","tenantID","e","console","error","Promise","all"],"mappings":"AAOA,SAASA,cAAc,EAAEC,YAAY,QAAQ,UAAS;AAItD,SAASC,mBAAmB,QAAQ,sCAAqC;AAQzE;;;;CAIC,GACD,OAAO,MAAMC,mBAAmB,CAAC,EAC/BC,UAAU,EACVC,YAAY,EACZC,eAAe,EACfC,SAAS,EACJ;IACL,IAAI,CAACH,WAAWI,KAAK,EAAE;QACrBJ,WAAWI,KAAK,GAAG,CAAC;IACtB;IACA,IAAI,CAACJ,WAAWI,KAAK,EAAEC,aAAa;QAClCL,WAAWI,KAAK,CAACC,WAAW,GAAG,EAAE;IACnC;IACAL,WAAWI,KAAK,CAACC,WAAW,CAACC,IAAI,CAC/BC,kBAAkB;QAChBN;QACAC;QACAC;IACF;AAEJ,EAAC;AAED,OAAO,MAAMI,oBACX,CAAC,EACCN,YAAY,EACZC,eAAe,EACfC,SAAS,EACgB,GAC3B,OAAO,EAAEK,EAAE,EAAEC,GAAG,EAAE;QAChB,MAAMC,wBAAwBZ,oBAAoBW,IAAIE,OAAO,EAAEF,IAAIG,OAAO,CAACC,EAAE,CAACC,aAAa;QAC3F,IAAIJ,0BAA0BF,IAAI;YAChC,MAAMO,aAAa,IAAIC,QAAQ;gBAC7B,cAAcpB,eAAuB;oBACnCqB,MAAM;oBACNC,SAAS,IAAIC,KAAKA,KAAKC,GAAG,KAAK;oBAC/BC,MAAM;oBACNC,sBAAsB;oBACtBC,OAAO;gBACT;YACF;YAEAd,IAAIe,eAAe,GAAGf,IAAIe,eAAe,GACrC3B,aAAaY,IAAIe,eAAe,EAAET,cAClCA;QACN;QACA,MAAMU,kBAAyC,EAAE;QACjDxB,aAAayB,OAAO,CAAC,CAACC;YACpBF,gBAAgBnB,IAAI,CAClBG,IAAIG,OAAO,CAACgB,MAAM,CAAC;gBACjB5B,YAAY2B;gBACZE,OAAO;oBACL,CAAC3B,gBAAgB,EAAE;wBACjB4B,QAAQtB;oBACV;gBACF;YACF;QAEJ;QAEA,IAAI;YACF,MAAMuB,kBAAmB,MAAMtB,IAAIG,OAAO,CAACoB,IAAI,CAAC;gBAC9ChC,YAAYG;gBACZ8B,OAAO;gBACPC,OAAO;gBACPL,OAAO;oBACL,kBAAkB;wBAChBC,QAAQtB;oBACV;gBACF;YACF;YAEAuB,iBAAiBI,MAAMT,QAAQ,CAACU;gBAC9BX,gBAAgBnB,IAAI,CAClBG,IAAIG,OAAO,CAACyB,MAAM,CAAC;oBACjB7B,IAAI4B,KAAK5B,EAAE;oBACXR,YAAYG;oBACZmC,MAAM;wBACJC,SAAS,AAACH,CAAAA,KAAKG,OAAO,IAAI,EAAE,AAAD,EAAGC,MAAM,CAAC,CAAC,EAAEC,QAAQC,QAAQ,EAAE,GAAKA,aAAalC;oBAC9E;gBACF;YAEJ;QACF,EAAE,OAAOmC,GAAG;YACVC,QAAQC,KAAK,CAAC,sCAAsCF;QACtD;QAEA,MAAMG,QAAQC,GAAG,CAACtB;IACpB,EAAC"}
1
+ {"version":3,"sources":["../../src/hooks/afterTenantDelete.ts"],"sourcesContent":["import type {\n CollectionAfterDeleteHook,\n CollectionConfig,\n JsonObject,\n PaginatedDocs,\n} from 'payload'\n\nimport { generateCookie, mergeHeaders } from 'payload'\n\nimport type { UserWithTenantsField } from '../types.js'\n\nimport { getCollectionIDType } from '../utilities/getCollectionIDType.js'\nimport { getTenantFromCookie } from '../utilities/getTenantFromCookie.js'\n\ntype Args = {\n collection: CollectionConfig\n enabledSlugs: string[]\n tenantFieldName: string\n tenantsCollectionSlug: string\n usersSlug: string\n}\n/**\n * Add cleanup logic when tenant is deleted\n * - delete documents related to tenant\n * - remove tenant from users\n */\nexport const addTenantCleanup = ({\n collection,\n enabledSlugs,\n tenantFieldName,\n tenantsCollectionSlug,\n usersSlug,\n}: Args) => {\n if (!collection.hooks) {\n collection.hooks = {}\n }\n if (!collection.hooks?.afterDelete) {\n collection.hooks.afterDelete = []\n }\n collection.hooks.afterDelete.push(\n afterTenantDelete({\n enabledSlugs,\n tenantFieldName,\n tenantsCollectionSlug,\n usersSlug,\n }),\n )\n}\n\nexport const afterTenantDelete =\n ({\n enabledSlugs,\n tenantFieldName,\n tenantsCollectionSlug,\n usersSlug,\n }: Omit<Args, 'collection'>): CollectionAfterDeleteHook =>\n async ({ id, req }) => {\n const idType = getCollectionIDType({\n collectionSlug: tenantsCollectionSlug,\n payload: req.payload,\n })\n const currentTenantCookieID = getTenantFromCookie(req.headers, idType)\n if (currentTenantCookieID === id) {\n const newHeaders = new Headers({\n 'Set-Cookie': generateCookie<string>({\n name: 'payload-tenant',\n expires: new Date(Date.now() - 1000),\n path: '/',\n returnCookieAsObject: false,\n value: '',\n }),\n })\n\n req.responseHeaders = req.responseHeaders\n ? mergeHeaders(req.responseHeaders, newHeaders)\n : newHeaders\n }\n const cleanupPromises: Promise<JsonObject>[] = []\n enabledSlugs.forEach((slug) => {\n cleanupPromises.push(\n req.payload.delete({\n collection: slug,\n where: {\n [tenantFieldName]: {\n equals: id,\n },\n },\n }),\n )\n })\n\n try {\n const usersWithTenant = (await req.payload.find({\n collection: usersSlug,\n depth: 0,\n limit: 0,\n where: {\n 'tenants.tenant': {\n equals: id,\n },\n },\n })) as PaginatedDocs<UserWithTenantsField>\n\n usersWithTenant?.docs?.forEach((user) => {\n cleanupPromises.push(\n req.payload.update({\n id: user.id,\n collection: usersSlug,\n data: {\n tenants: (user.tenants || []).filter(({ tenant: tenantID }) => tenantID !== id),\n },\n }),\n )\n })\n } catch (e) {\n console.error('Error deleting tenants from users:', e)\n }\n\n await Promise.all(cleanupPromises)\n }\n"],"names":["generateCookie","mergeHeaders","getCollectionIDType","getTenantFromCookie","addTenantCleanup","collection","enabledSlugs","tenantFieldName","tenantsCollectionSlug","usersSlug","hooks","afterDelete","push","afterTenantDelete","id","req","idType","collectionSlug","payload","currentTenantCookieID","headers","newHeaders","Headers","name","expires","Date","now","path","returnCookieAsObject","value","responseHeaders","cleanupPromises","forEach","slug","delete","where","equals","usersWithTenant","find","depth","limit","docs","user","update","data","tenants","filter","tenant","tenantID","e","console","error","Promise","all"],"mappings":"AAOA,SAASA,cAAc,EAAEC,YAAY,QAAQ,UAAS;AAItD,SAASC,mBAAmB,QAAQ,sCAAqC;AACzE,SAASC,mBAAmB,QAAQ,sCAAqC;AASzE;;;;CAIC,GACD,OAAO,MAAMC,mBAAmB,CAAC,EAC/BC,UAAU,EACVC,YAAY,EACZC,eAAe,EACfC,qBAAqB,EACrBC,SAAS,EACJ;IACL,IAAI,CAACJ,WAAWK,KAAK,EAAE;QACrBL,WAAWK,KAAK,GAAG,CAAC;IACtB;IACA,IAAI,CAACL,WAAWK,KAAK,EAAEC,aAAa;QAClCN,WAAWK,KAAK,CAACC,WAAW,GAAG,EAAE;IACnC;IACAN,WAAWK,KAAK,CAACC,WAAW,CAACC,IAAI,CAC/BC,kBAAkB;QAChBP;QACAC;QACAC;QACAC;IACF;AAEJ,EAAC;AAED,OAAO,MAAMI,oBACX,CAAC,EACCP,YAAY,EACZC,eAAe,EACfC,qBAAqB,EACrBC,SAAS,EACgB,GAC3B,OAAO,EAAEK,EAAE,EAAEC,GAAG,EAAE;QAChB,MAAMC,SAASd,oBAAoB;YACjCe,gBAAgBT;YAChBU,SAASH,IAAIG,OAAO;QACtB;QACA,MAAMC,wBAAwBhB,oBAAoBY,IAAIK,OAAO,EAAEJ;QAC/D,IAAIG,0BAA0BL,IAAI;YAChC,MAAMO,aAAa,IAAIC,QAAQ;gBAC7B,cAActB,eAAuB;oBACnCuB,MAAM;oBACNC,SAAS,IAAIC,KAAKA,KAAKC,GAAG,KAAK;oBAC/BC,MAAM;oBACNC,sBAAsB;oBACtBC,OAAO;gBACT;YACF;YAEAd,IAAIe,eAAe,GAAGf,IAAIe,eAAe,GACrC7B,aAAac,IAAIe,eAAe,EAAET,cAClCA;QACN;QACA,MAAMU,kBAAyC,EAAE;QACjDzB,aAAa0B,OAAO,CAAC,CAACC;YACpBF,gBAAgBnB,IAAI,CAClBG,IAAIG,OAAO,CAACgB,MAAM,CAAC;gBACjB7B,YAAY4B;gBACZE,OAAO;oBACL,CAAC5B,gBAAgB,EAAE;wBACjB6B,QAAQtB;oBACV;gBACF;YACF;QAEJ;QAEA,IAAI;YACF,MAAMuB,kBAAmB,MAAMtB,IAAIG,OAAO,CAACoB,IAAI,CAAC;gBAC9CjC,YAAYI;gBACZ8B,OAAO;gBACPC,OAAO;gBACPL,OAAO;oBACL,kBAAkB;wBAChBC,QAAQtB;oBACV;gBACF;YACF;YAEAuB,iBAAiBI,MAAMT,QAAQ,CAACU;gBAC9BX,gBAAgBnB,IAAI,CAClBG,IAAIG,OAAO,CAACyB,MAAM,CAAC;oBACjB7B,IAAI4B,KAAK5B,EAAE;oBACXT,YAAYI;oBACZmC,MAAM;wBACJC,SAAS,AAACH,CAAAA,KAAKG,OAAO,IAAI,EAAE,AAAD,EAAGC,MAAM,CAAC,CAAC,EAAEC,QAAQC,QAAQ,EAAE,GAAKA,aAAalC;oBAC9E;gBACF;YAEJ;QACF,EAAE,OAAOmC,GAAG;YACVC,QAAQC,KAAK,CAAC,sCAAsCF;QACtD;QAEA,MAAMG,QAAQC,GAAG,CAACtB;IACpB,EAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAoB,MAAM,EAAE,MAAM,SAAS,CAAA;AAEvD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAA;AAezD,eAAO,MAAM,iBAAiB,GAC3B,UAAU,gBAAgB,uBAAuB,CAAC,UAAU,CAAC,sBAC7C,MAAM,KAAG,MA6MzB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAoB,MAAM,EAAE,MAAM,SAAS,CAAA;AAEvD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAA;AAezD,eAAO,MAAM,iBAAiB,GAC3B,UAAU,gBAAgB,uBAAuB,CAAC,UAAU,CAAC,sBAC7C,MAAM,KAAG,MAkOzB,CAAA"}
package/dist/index.js CHANGED
@@ -57,8 +57,16 @@ export const multiTenantPlugin = (pluginConfig)=>(incomingConfig)=>{
57
57
  /**
58
58
  * Add tenants array field to users collection
59
59
  */ if (pluginConfig?.tenantsArrayField?.includeDefaultField !== false) {
60
- adminUsersCollection.fields.push(tenantsArrayField(pluginConfig?.tenantsArrayField || {}));
60
+ adminUsersCollection.fields.push(tenantsArrayField({
61
+ ...pluginConfig?.tenantsArrayField || {},
62
+ tenantsCollectionSlug
63
+ }));
61
64
  }
65
+ addCollectionAccess({
66
+ collection: adminUsersCollection,
67
+ fieldName: 'tenants.tenant',
68
+ userHasAccessToAllTenants
69
+ });
62
70
  let tenantCollection;
63
71
  const [collectionSlugs, globalCollectionSlugs] = Object.keys(pluginConfig.collections).reduce((acc, slug)=>{
64
72
  if (pluginConfig?.collections?.[slug]?.isGlobal) {
@@ -78,7 +86,10 @@ export const multiTenantPlugin = (pluginConfig)=>(incomingConfig)=>{
78
86
  * Modify tenants collection
79
87
  */ if (collection.slug === tenantsCollectionSlug) {
80
88
  tenantCollection = collection;
81
- addCollectionAccess({
89
+ /**
90
+ * Add access control constraint to tenants collection
91
+ * - constrains access a users assigned tenants
92
+ */ addCollectionAccess({
82
93
  collection,
83
94
  fieldName: 'id',
84
95
  userHasAccessToAllTenants
@@ -95,6 +106,7 @@ export const multiTenantPlugin = (pluginConfig)=>(incomingConfig)=>{
95
106
  ...globalCollectionSlugs
96
107
  ],
97
108
  tenantFieldName,
109
+ tenantsCollectionSlug,
98
110
  usersSlug: adminUsersCollection.slug
99
111
  });
100
112
  }
@@ -108,7 +120,9 @@ export const multiTenantPlugin = (pluginConfig)=>(incomingConfig)=>{
108
120
  */ addFilterOptionsToFields({
109
121
  fields: collection.fields,
110
122
  tenantEnabledCollectionSlugs: collectionSlugs,
111
- tenantEnabledGlobalSlugs: globalCollectionSlugs
123
+ tenantEnabledGlobalSlugs: globalCollectionSlugs,
124
+ tenantFieldName,
125
+ tenantsCollectionSlug
112
126
  });
113
127
  /**
114
128
  * Add tenant field to enabled collections
@@ -127,7 +141,8 @@ export const multiTenantPlugin = (pluginConfig)=>(incomingConfig)=>{
127
141
  }
128
142
  collection.admin.baseListFilter = withTenantListFilter({
129
143
  baseListFilter: collection.admin?.baseListFilter,
130
- tenantFieldName
144
+ tenantFieldName,
145
+ tenantsCollectionSlug
131
146
  });
132
147
  }
133
148
  if (pluginConfig.collections[collection.slug]?.useTenantAccess !== false) {
@@ -160,7 +175,9 @@ export const multiTenantPlugin = (pluginConfig)=>(incomingConfig)=>{
160
175
  path: '@payloadcms/plugin-multi-tenant/rsc#GlobalViewRedirect',
161
176
  serverProps: {
162
177
  globalSlugs: globalCollectionSlugs,
163
- tenantFieldName
178
+ tenantFieldName,
179
+ tenantsCollectionSlug,
180
+ useAsTitle: tenantCollection.admin?.useAsTitle || 'id'
164
181
  }
165
182
  });
166
183
  }
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import type { CollectionConfig, Config } from 'payload'\n\nimport type { MultiTenantPluginConfig } from './types.js'\n\nimport { tenantField } from './fields/tenantField/index.js'\nimport { tenantsArrayField } from './fields/tenantsArrayField/index.js'\nimport { addTenantCleanup } from './hooks/afterTenantDelete.js'\nimport { addCollectionAccess } from './utilities/addCollectionAccess.js'\nimport { addFilterOptionsToFields } from './utilities/addFilterOptionsToFields.js'\nimport { withTenantListFilter } from './utilities/withTenantListFilter.js'\n\nconst defaults = {\n tenantCollectionSlug: 'tenants',\n tenantFieldName: 'tenant',\n userTenantsArrayFieldName: 'tenants',\n}\n\nexport const multiTenantPlugin =\n <ConfigType>(pluginConfig: MultiTenantPluginConfig<ConfigType>) =>\n (incomingConfig: Config): Config => {\n if (pluginConfig.enabled === false) {\n return incomingConfig\n }\n\n /**\n * Set defaults\n */\n const userHasAccessToAllTenants: Required<\n MultiTenantPluginConfig<ConfigType>\n >['userHasAccessToAllTenants'] =\n typeof pluginConfig.userHasAccessToAllTenants === 'function'\n ? pluginConfig.userHasAccessToAllTenants\n : () => false\n const tenantsCollectionSlug = (pluginConfig.tenantsSlug =\n pluginConfig.tenantsSlug || defaults.tenantCollectionSlug)\n const tenantFieldName = pluginConfig?.tenantField?.name || defaults.tenantFieldName\n\n /**\n * Add defaults for admin properties\n */\n if (!incomingConfig.admin) {\n incomingConfig.admin = {}\n }\n if (!incomingConfig.admin?.components) {\n incomingConfig.admin.components = {\n actions: [],\n beforeNavLinks: [],\n providers: [],\n }\n }\n if (!incomingConfig.admin.components?.providers) {\n incomingConfig.admin.components.providers = []\n }\n if (!incomingConfig.admin.components?.actions) {\n incomingConfig.admin.components.actions = []\n }\n if (!incomingConfig.admin.components?.beforeNavLinks) {\n incomingConfig.admin.components.beforeNavLinks = []\n }\n if (!incomingConfig.collections) {\n incomingConfig.collections = []\n }\n\n /**\n * Add tenants array field to users collection\n */\n const adminUsersCollection = incomingConfig.collections.find(({ slug, auth }) => {\n if (incomingConfig.admin?.user) {\n return slug === incomingConfig.admin.user\n } else if (auth) {\n return true\n }\n })\n\n if (!adminUsersCollection) {\n throw Error('An auth enabled collection was not found')\n }\n\n /**\n * Add tenants array field to users collection\n */\n if (pluginConfig?.tenantsArrayField?.includeDefaultField !== false) {\n adminUsersCollection.fields.push(tenantsArrayField(pluginConfig?.tenantsArrayField || {}))\n }\n\n let tenantCollection: CollectionConfig | undefined\n\n const [collectionSlugs, globalCollectionSlugs] = Object.keys(pluginConfig.collections).reduce<\n [string[], string[]]\n >(\n (acc, slug) => {\n if (pluginConfig?.collections?.[slug]?.isGlobal) {\n acc[1].push(slug)\n } else {\n acc[0].push(slug)\n }\n\n return acc\n },\n [[], []],\n )\n\n /**\n * Modify collections\n */\n incomingConfig.collections.forEach((collection) => {\n /**\n * Modify tenants collection\n */\n if (collection.slug === tenantsCollectionSlug) {\n tenantCollection = collection\n\n addCollectionAccess({\n collection,\n fieldName: 'id',\n userHasAccessToAllTenants,\n })\n\n if (pluginConfig.cleanupAfterTenantDelete !== false) {\n /**\n * Add cleanup logic when tenant is deleted\n * - delete documents related to tenant\n * - remove tenant from users\n */\n addTenantCleanup({\n collection,\n enabledSlugs: [...collectionSlugs, ...globalCollectionSlugs],\n tenantFieldName,\n usersSlug: adminUsersCollection.slug,\n })\n }\n } else if (pluginConfig.collections?.[collection.slug]) {\n const isGlobal = Boolean(pluginConfig.collections[collection.slug]?.isGlobal)\n\n if (isGlobal) {\n collection.disableDuplicate = true\n }\n\n /**\n * Modify enabled collections\n */\n addFilterOptionsToFields({\n fields: collection.fields,\n tenantEnabledCollectionSlugs: collectionSlugs,\n tenantEnabledGlobalSlugs: globalCollectionSlugs,\n })\n\n /**\n * Add tenant field to enabled collections\n */\n collection.fields.splice(\n 0,\n 0,\n tenantField({\n ...(pluginConfig?.tenantField || {}),\n name: tenantFieldName,\n debug: pluginConfig.debug,\n tenantsCollectionSlug,\n unique: isGlobal,\n }),\n )\n\n if (pluginConfig.collections[collection.slug]?.useBaseListFilter !== false) {\n /**\n * Collection baseListFilter with selected tenant constraint (if selected)\n */\n if (!collection.admin) {\n collection.admin = {}\n }\n collection.admin.baseListFilter = withTenantListFilter({\n baseListFilter: collection.admin?.baseListFilter,\n tenantFieldName,\n })\n }\n\n if (pluginConfig.collections[collection.slug]?.useTenantAccess !== false) {\n /**\n * Add access control constraint to tenant enabled collection\n */\n addCollectionAccess({\n collection,\n fieldName: tenantFieldName,\n userHasAccessToAllTenants,\n })\n }\n }\n })\n\n if (!tenantCollection) {\n throw new Error(`Tenants collection not found with slug: ${tenantsCollectionSlug}`)\n }\n\n /**\n * Add TenantSelectionProvider to admin providers\n */\n incomingConfig.admin.components.providers.push({\n clientProps: {\n tenantsCollectionSlug: tenantCollection.slug,\n useAsTitle: tenantCollection.admin?.useAsTitle || 'id',\n },\n path: '@payloadcms/plugin-multi-tenant/rsc#TenantSelectionProvider',\n })\n\n /**\n * Add global redirect action\n */\n if (globalCollectionSlugs.length) {\n incomingConfig.admin.components.actions.push({\n path: '@payloadcms/plugin-multi-tenant/rsc#GlobalViewRedirect',\n serverProps: {\n globalSlugs: globalCollectionSlugs,\n tenantFieldName,\n },\n })\n }\n\n /**\n * Add tenant selector to admin UI\n */\n incomingConfig.admin.components.beforeNavLinks.push({\n path: '@payloadcms/plugin-multi-tenant/client#TenantSelector',\n })\n\n return incomingConfig\n }\n"],"names":["tenantField","tenantsArrayField","addTenantCleanup","addCollectionAccess","addFilterOptionsToFields","withTenantListFilter","defaults","tenantCollectionSlug","tenantFieldName","userTenantsArrayFieldName","multiTenantPlugin","pluginConfig","incomingConfig","enabled","userHasAccessToAllTenants","tenantsCollectionSlug","tenantsSlug","name","admin","components","actions","beforeNavLinks","providers","collections","adminUsersCollection","find","slug","auth","user","Error","includeDefaultField","fields","push","tenantCollection","collectionSlugs","globalCollectionSlugs","Object","keys","reduce","acc","isGlobal","forEach","collection","fieldName","cleanupAfterTenantDelete","enabledSlugs","usersSlug","Boolean","disableDuplicate","tenantEnabledCollectionSlugs","tenantEnabledGlobalSlugs","splice","debug","unique","useBaseListFilter","baseListFilter","useTenantAccess","clientProps","useAsTitle","path","length","serverProps","globalSlugs"],"mappings":"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"}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import type { CollectionConfig, Config } from 'payload'\n\nimport type { MultiTenantPluginConfig } from './types.js'\n\nimport { tenantField } from './fields/tenantField/index.js'\nimport { tenantsArrayField } from './fields/tenantsArrayField/index.js'\nimport { addTenantCleanup } from './hooks/afterTenantDelete.js'\nimport { addCollectionAccess } from './utilities/addCollectionAccess.js'\nimport { addFilterOptionsToFields } from './utilities/addFilterOptionsToFields.js'\nimport { withTenantListFilter } from './utilities/withTenantListFilter.js'\n\nconst defaults = {\n tenantCollectionSlug: 'tenants',\n tenantFieldName: 'tenant',\n userTenantsArrayFieldName: 'tenants',\n}\n\nexport const multiTenantPlugin =\n <ConfigType>(pluginConfig: MultiTenantPluginConfig<ConfigType>) =>\n (incomingConfig: Config): Config => {\n if (pluginConfig.enabled === false) {\n return incomingConfig\n }\n\n /**\n * Set defaults\n */\n const userHasAccessToAllTenants: Required<\n MultiTenantPluginConfig<ConfigType>\n >['userHasAccessToAllTenants'] =\n typeof pluginConfig.userHasAccessToAllTenants === 'function'\n ? pluginConfig.userHasAccessToAllTenants\n : () => false\n const tenantsCollectionSlug = (pluginConfig.tenantsSlug =\n pluginConfig.tenantsSlug || defaults.tenantCollectionSlug)\n const tenantFieldName = pluginConfig?.tenantField?.name || defaults.tenantFieldName\n\n /**\n * Add defaults for admin properties\n */\n if (!incomingConfig.admin) {\n incomingConfig.admin = {}\n }\n if (!incomingConfig.admin?.components) {\n incomingConfig.admin.components = {\n actions: [],\n beforeNavLinks: [],\n providers: [],\n }\n }\n if (!incomingConfig.admin.components?.providers) {\n incomingConfig.admin.components.providers = []\n }\n if (!incomingConfig.admin.components?.actions) {\n incomingConfig.admin.components.actions = []\n }\n if (!incomingConfig.admin.components?.beforeNavLinks) {\n incomingConfig.admin.components.beforeNavLinks = []\n }\n if (!incomingConfig.collections) {\n incomingConfig.collections = []\n }\n\n /**\n * Add tenants array field to users collection\n */\n const adminUsersCollection = incomingConfig.collections.find(({ slug, auth }) => {\n if (incomingConfig.admin?.user) {\n return slug === incomingConfig.admin.user\n } else if (auth) {\n return true\n }\n })\n\n if (!adminUsersCollection) {\n throw Error('An auth enabled collection was not found')\n }\n\n /**\n * Add tenants array field to users collection\n */\n if (pluginConfig?.tenantsArrayField?.includeDefaultField !== false) {\n adminUsersCollection.fields.push(\n tenantsArrayField({\n ...(pluginConfig?.tenantsArrayField || {}),\n tenantsCollectionSlug,\n }),\n )\n }\n\n addCollectionAccess({\n collection: adminUsersCollection,\n fieldName: 'tenants.tenant',\n userHasAccessToAllTenants,\n })\n\n let tenantCollection: CollectionConfig | undefined\n\n const [collectionSlugs, globalCollectionSlugs] = Object.keys(pluginConfig.collections).reduce<\n [string[], string[]]\n >(\n (acc, slug) => {\n if (pluginConfig?.collections?.[slug]?.isGlobal) {\n acc[1].push(slug)\n } else {\n acc[0].push(slug)\n }\n\n return acc\n },\n [[], []],\n )\n\n /**\n * Modify collections\n */\n incomingConfig.collections.forEach((collection) => {\n /**\n * Modify tenants collection\n */\n if (collection.slug === tenantsCollectionSlug) {\n tenantCollection = collection\n\n /**\n * Add access control constraint to tenants collection\n * - constrains access a users assigned tenants\n */\n addCollectionAccess({\n collection,\n fieldName: 'id',\n userHasAccessToAllTenants,\n })\n\n if (pluginConfig.cleanupAfterTenantDelete !== false) {\n /**\n * Add cleanup logic when tenant is deleted\n * - delete documents related to tenant\n * - remove tenant from users\n */\n addTenantCleanup({\n collection,\n enabledSlugs: [...collectionSlugs, ...globalCollectionSlugs],\n tenantFieldName,\n tenantsCollectionSlug,\n usersSlug: adminUsersCollection.slug,\n })\n }\n } else if (pluginConfig.collections?.[collection.slug]) {\n const isGlobal = Boolean(pluginConfig.collections[collection.slug]?.isGlobal)\n\n if (isGlobal) {\n collection.disableDuplicate = true\n }\n\n /**\n * Modify enabled collections\n */\n addFilterOptionsToFields({\n fields: collection.fields,\n tenantEnabledCollectionSlugs: collectionSlugs,\n tenantEnabledGlobalSlugs: globalCollectionSlugs,\n tenantFieldName,\n tenantsCollectionSlug,\n })\n\n /**\n * Add tenant field to enabled collections\n */\n collection.fields.splice(\n 0,\n 0,\n tenantField({\n ...(pluginConfig?.tenantField || {}),\n name: tenantFieldName,\n debug: pluginConfig.debug,\n tenantsCollectionSlug,\n unique: isGlobal,\n }),\n )\n\n if (pluginConfig.collections[collection.slug]?.useBaseListFilter !== false) {\n /**\n * Collection baseListFilter with selected tenant constraint (if selected)\n */\n if (!collection.admin) {\n collection.admin = {}\n }\n collection.admin.baseListFilter = withTenantListFilter({\n baseListFilter: collection.admin?.baseListFilter,\n tenantFieldName,\n tenantsCollectionSlug,\n })\n }\n\n if (pluginConfig.collections[collection.slug]?.useTenantAccess !== false) {\n /**\n * Add access control constraint to tenant enabled collection\n */\n addCollectionAccess({\n collection,\n fieldName: tenantFieldName,\n userHasAccessToAllTenants,\n })\n }\n }\n })\n\n if (!tenantCollection) {\n throw new Error(`Tenants collection not found with slug: ${tenantsCollectionSlug}`)\n }\n\n /**\n * Add TenantSelectionProvider to admin providers\n */\n incomingConfig.admin.components.providers.push({\n clientProps: {\n tenantsCollectionSlug: tenantCollection.slug,\n useAsTitle: tenantCollection.admin?.useAsTitle || 'id',\n },\n path: '@payloadcms/plugin-multi-tenant/rsc#TenantSelectionProvider',\n })\n\n /**\n * Add global redirect action\n */\n if (globalCollectionSlugs.length) {\n incomingConfig.admin.components.actions.push({\n path: '@payloadcms/plugin-multi-tenant/rsc#GlobalViewRedirect',\n serverProps: {\n globalSlugs: globalCollectionSlugs,\n tenantFieldName,\n tenantsCollectionSlug,\n useAsTitle: tenantCollection.admin?.useAsTitle || 'id',\n },\n })\n }\n\n /**\n * Add tenant selector to admin UI\n */\n incomingConfig.admin.components.beforeNavLinks.push({\n path: '@payloadcms/plugin-multi-tenant/client#TenantSelector',\n })\n\n return incomingConfig\n }\n"],"names":["tenantField","tenantsArrayField","addTenantCleanup","addCollectionAccess","addFilterOptionsToFields","withTenantListFilter","defaults","tenantCollectionSlug","tenantFieldName","userTenantsArrayFieldName","multiTenantPlugin","pluginConfig","incomingConfig","enabled","userHasAccessToAllTenants","tenantsCollectionSlug","tenantsSlug","name","admin","components","actions","beforeNavLinks","providers","collections","adminUsersCollection","find","slug","auth","user","Error","includeDefaultField","fields","push","collection","fieldName","tenantCollection","collectionSlugs","globalCollectionSlugs","Object","keys","reduce","acc","isGlobal","forEach","cleanupAfterTenantDelete","enabledSlugs","usersSlug","Boolean","disableDuplicate","tenantEnabledCollectionSlugs","tenantEnabledGlobalSlugs","splice","debug","unique","useBaseListFilter","baseListFilter","useTenantAccess","clientProps","useAsTitle","path","length","serverProps","globalSlugs"],"mappings":"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"}
@@ -9,9 +9,10 @@ type ContextType = {
9
9
  refresh?: boolean;
10
10
  }) => void;
11
11
  };
12
- export declare const TenantSelectionProviderClient: ({ children, initialValue, tenantOptions, }: {
12
+ export declare const TenantSelectionProviderClient: ({ children, initialValue, tenantCookie, tenantOptions, }: {
13
13
  children: React.ReactNode;
14
- initialValue?: string;
14
+ initialValue?: number | string;
15
+ tenantCookie?: string;
15
16
  tenantOptions: OptionObject[];
16
17
  }) => React.JSX.Element;
17
18
  export declare const useTenantSelection: () => ContextType;
@@ -1 +1 @@
1
- {"version":3,"file":"index.client.d.ts","sourceRoot":"","sources":["../../../src/providers/TenantSelectionProvider/index.client.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAI3C,OAAO,KAAwB,MAAM,OAAO,CAAA;AAI5C,KAAK,WAAW,GAAG;IACjB,OAAO,EAAE,YAAY,EAAE,CAAA;IACvB,gBAAgB,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAA;IAC7C,yBAAyB,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAA;IACxE,SAAS,EAAE,CAAC,IAAI,EAAE;QAAE,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,KAAK,IAAI,CAAA;CAClF,CAAA;AASD,eAAO,MAAM,6BAA6B,+CAIvC;IACD,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;IACzB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,aAAa,EAAE,YAAY,EAAE,CAAA;CAC9B,sBAsEA,CAAA;AAED,eAAO,MAAM,kBAAkB,mBAAkC,CAAA"}
1
+ {"version":3,"file":"index.client.d.ts","sourceRoot":"","sources":["../../../src/providers/TenantSelectionProvider/index.client.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAI3C,OAAO,KAAwB,MAAM,OAAO,CAAA;AAI5C,KAAK,WAAW,GAAG;IACjB,OAAO,EAAE,YAAY,EAAE,CAAA;IACvB,gBAAgB,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAA;IAC7C,yBAAyB,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAA;IACxE,SAAS,EAAE,CAAC,IAAI,EAAE;QAAE,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,KAAK,IAAI,CAAA;CAClF,CAAA;AASD,eAAO,MAAM,6BAA6B,6DAKvC;IACD,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;IACzB,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IAC9B,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,aAAa,EAAE,YAAY,EAAE,CAAA;CAC9B,sBA8FA,CAAA;AAED,eAAO,MAAM,kBAAkB,mBAAkC,CAAA"}
@@ -10,8 +10,8 @@ const Context = /*#__PURE__*/ createContext({
10
10
  setPreventRefreshOnChange: ()=>null,
11
11
  setTenant: ()=>null
12
12
  });
13
- export const TenantSelectionProviderClient = ({ children, initialValue, tenantOptions })=>{
14
- const [selectedTenantID, setSelectedTenantID] = React.useState(initialValue || SELECT_ALL);
13
+ export const TenantSelectionProviderClient = ({ children, initialValue, tenantCookie, tenantOptions })=>{
14
+ const [selectedTenantID, setSelectedTenantID] = React.useState(initialValue);
15
15
  const [preventRefreshOnChange, setPreventRefreshOnChange] = React.useState(false);
16
16
  const { user } = useAuth();
17
17
  const userID = React.useMemo(()=>user?.id, [
@@ -26,10 +26,18 @@ export const TenantSelectionProviderClient = ({ children, initialValue, tenantOp
26
26
  const expires = '; expires=Fri, 31 Dec 9999 23:59:59 GMT';
27
27
  document.cookie = 'payload-tenant=' + (value || '') + expires + '; path=/';
28
28
  }, []);
29
+ const deleteCookie = React.useCallback(()=>{
30
+ document.cookie = 'payload-tenant=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/';
31
+ }, []);
29
32
  const setTenant = React.useCallback(({ id, refresh })=>{
30
33
  if (id === undefined) {
31
- setSelectedTenantID(SELECT_ALL);
32
- setCookie(SELECT_ALL);
34
+ if (tenantOptions.length > 1) {
35
+ setSelectedTenantID(SELECT_ALL);
36
+ setCookie(SELECT_ALL);
37
+ } else {
38
+ setSelectedTenantID(tenantOptions[0]?.value);
39
+ setCookie(String(tenantOptions[0]?.value));
40
+ }
33
41
  } else {
34
42
  setSelectedTenantID(id);
35
43
  setCookie(String(id));
@@ -41,7 +49,8 @@ export const TenantSelectionProviderClient = ({ children, initialValue, tenantOp
41
49
  setSelectedTenantID,
42
50
  setCookie,
43
51
  router,
44
- preventRefreshOnChange
52
+ preventRefreshOnChange,
53
+ tenantOptions
45
54
  ]);
46
55
  React.useEffect(()=>{
47
56
  if (selectedTenantID && selectedTenantID !== SELECT_ALL && !tenantOptions.find((option)=>option.value === selectedTenantID)) {
@@ -58,15 +67,39 @@ export const TenantSelectionProviderClient = ({ children, initialValue, tenantOp
58
67
  }
59
68
  }
60
69
  }, [
61
- initialValue,
70
+ tenantCookie,
62
71
  setTenant,
63
72
  selectedTenantID,
64
- tenantOptions
73
+ tenantOptions,
74
+ initialValue,
75
+ setCookie
65
76
  ]);
66
77
  React.useEffect(()=>{
67
- router.refresh();
78
+ if (userID && !tenantCookie) {
79
+ // User is logged in, but does not have a tenant cookie, set it
80
+ setSelectedTenantID(initialValue);
81
+ setCookie(String(initialValue));
82
+ }
83
+ }, [
84
+ userID,
85
+ tenantCookie,
86
+ initialValue,
87
+ setCookie,
88
+ router
89
+ ]);
90
+ React.useEffect(()=>{
91
+ if (!userID && tenantCookie) {
92
+ // User is not logged in, but has a tenant cookie, delete it
93
+ deleteCookie();
94
+ setSelectedTenantID(undefined);
95
+ } else if (userID) {
96
+ // User changed, refresh
97
+ router.refresh();
98
+ }
68
99
  }, [
69
100
  userID,
101
+ tenantCookie,
102
+ deleteCookie,
70
103
  router
71
104
  ]);
72
105
  return /*#__PURE__*/ _jsx("span", {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/providers/TenantSelectionProvider/index.client.tsx"],"sourcesContent":["'use client'\n\nimport type { OptionObject } from 'payload'\n\nimport { useAuth } from '@payloadcms/ui'\nimport { useRouter } from 'next/navigation.js'\nimport React, { createContext } from 'react'\n\nimport { SELECT_ALL } from '../../constants.js'\n\ntype ContextType = {\n options: OptionObject[]\n selectedTenantID: number | string | undefined\n setPreventRefreshOnChange: React.Dispatch<React.SetStateAction<boolean>>\n setTenant: (args: { id: number | string | undefined; refresh?: boolean }) => void\n}\n\nconst Context = createContext<ContextType>({\n options: [],\n selectedTenantID: undefined,\n setPreventRefreshOnChange: () => null,\n setTenant: () => null,\n})\n\nexport const TenantSelectionProviderClient = ({\n children,\n initialValue,\n tenantOptions,\n}: {\n children: React.ReactNode\n initialValue?: string\n tenantOptions: OptionObject[]\n}) => {\n const [selectedTenantID, setSelectedTenantID] = React.useState<number | string>(\n initialValue || SELECT_ALL,\n )\n const [preventRefreshOnChange, setPreventRefreshOnChange] = React.useState(false)\n const { user } = useAuth()\n const userID = React.useMemo(() => user?.id, [user?.id])\n const selectedTenantLabel = React.useMemo(\n () => tenantOptions.find((option) => option.value === selectedTenantID)?.label,\n [selectedTenantID, tenantOptions],\n )\n\n const router = useRouter()\n\n const setCookie = React.useCallback((value?: string) => {\n const expires = '; expires=Fri, 31 Dec 9999 23:59:59 GMT'\n document.cookie = 'payload-tenant=' + (value || '') + expires + '; path=/'\n }, [])\n\n const setTenant = React.useCallback<ContextType['setTenant']>(\n ({ id, refresh }) => {\n if (id === undefined) {\n setSelectedTenantID(SELECT_ALL)\n setCookie(SELECT_ALL)\n } else {\n setSelectedTenantID(id)\n setCookie(String(id))\n }\n if (!preventRefreshOnChange && refresh) {\n router.refresh()\n }\n },\n [setSelectedTenantID, setCookie, router, preventRefreshOnChange],\n )\n\n React.useEffect(() => {\n if (\n selectedTenantID &&\n selectedTenantID !== SELECT_ALL &&\n !tenantOptions.find((option) => option.value === selectedTenantID)\n ) {\n if (tenantOptions?.[0]?.value) {\n setTenant({ id: tenantOptions[0].value, refresh: true })\n } else {\n setTenant({ id: undefined, refresh: true })\n }\n }\n }, [initialValue, setTenant, selectedTenantID, tenantOptions])\n\n React.useEffect(() => {\n router.refresh()\n }, [userID, router])\n\n return (\n <span\n data-selected-tenant-id={selectedTenantID}\n data-selected-tenant-title={selectedTenantLabel}\n >\n <Context.Provider\n value={{\n options: tenantOptions,\n selectedTenantID,\n setPreventRefreshOnChange,\n setTenant,\n }}\n >\n {children}\n </Context.Provider>\n </span>\n )\n}\n\nexport const useTenantSelection = () => React.useContext(Context)\n"],"names":["useAuth","useRouter","React","createContext","SELECT_ALL","Context","options","selectedTenantID","undefined","setPreventRefreshOnChange","setTenant","TenantSelectionProviderClient","children","initialValue","tenantOptions","setSelectedTenantID","useState","preventRefreshOnChange","user","userID","useMemo","id","selectedTenantLabel","find","option","value","label","router","setCookie","useCallback","expires","document","cookie","refresh","String","useEffect","span","data-selected-tenant-id","data-selected-tenant-title","Provider","useTenantSelection","useContext"],"mappings":"AAAA;;AAIA,SAASA,OAAO,QAAQ,iBAAgB;AACxC,SAASC,SAAS,QAAQ,qBAAoB;AAC9C,OAAOC,SAASC,aAAa,QAAQ,QAAO;AAE5C,SAASC,UAAU,QAAQ,qBAAoB;AAS/C,MAAMC,wBAAUF,cAA2B;IACzCG,SAAS,EAAE;IACXC,kBAAkBC;IAClBC,2BAA2B,IAAM;IACjCC,WAAW,IAAM;AACnB;AAEA,OAAO,MAAMC,gCAAgC,CAAC,EAC5CC,QAAQ,EACRC,YAAY,EACZC,aAAa,EAKd;IACC,MAAM,CAACP,kBAAkBQ,oBAAoB,GAAGb,MAAMc,QAAQ,CAC5DH,gBAAgBT;IAElB,MAAM,CAACa,wBAAwBR,0BAA0B,GAAGP,MAAMc,QAAQ,CAAC;IAC3E,MAAM,EAAEE,IAAI,EAAE,GAAGlB;IACjB,MAAMmB,SAASjB,MAAMkB,OAAO,CAAC,IAAMF,MAAMG,IAAI;QAACH,MAAMG;KAAG;IACvD,MAAMC,sBAAsBpB,MAAMkB,OAAO,CACvC,IAAMN,cAAcS,IAAI,CAAC,CAACC,SAAWA,OAAOC,KAAK,KAAKlB,mBAAmBmB,OACzE;QAACnB;QAAkBO;KAAc;IAGnC,MAAMa,SAAS1B;IAEf,MAAM2B,YAAY1B,MAAM2B,WAAW,CAAC,CAACJ;QACnC,MAAMK,UAAU;QAChBC,SAASC,MAAM,GAAG,oBAAqBP,CAAAA,SAAS,EAAC,IAAKK,UAAU;IAClE,GAAG,EAAE;IAEL,MAAMpB,YAAYR,MAAM2B,WAAW,CACjC,CAAC,EAAER,EAAE,EAAEY,OAAO,EAAE;QACd,IAAIZ,OAAOb,WAAW;YACpBO,oBAAoBX;YACpBwB,UAAUxB;QACZ,OAAO;YACLW,oBAAoBM;YACpBO,UAAUM,OAAOb;QACnB;QACA,IAAI,CAACJ,0BAA0BgB,SAAS;YACtCN,OAAOM,OAAO;QAChB;IACF,GACA;QAAClB;QAAqBa;QAAWD;QAAQV;KAAuB;IAGlEf,MAAMiC,SAAS,CAAC;QACd,IACE5B,oBACAA,qBAAqBH,cACrB,CAACU,cAAcS,IAAI,CAAC,CAACC,SAAWA,OAAOC,KAAK,KAAKlB,mBACjD;YACA,IAAIO,eAAe,CAAC,EAAE,EAAEW,OAAO;gBAC7Bf,UAAU;oBAAEW,IAAIP,aAAa,CAAC,EAAE,CAACW,KAAK;oBAAEQ,SAAS;gBAAK;YACxD,OAAO;gBACLvB,UAAU;oBAAEW,IAAIb;oBAAWyB,SAAS;gBAAK;YAC3C;QACF;IACF,GAAG;QAACpB;QAAcH;QAAWH;QAAkBO;KAAc;IAE7DZ,MAAMiC,SAAS,CAAC;QACdR,OAAOM,OAAO;IAChB,GAAG;QAACd;QAAQQ;KAAO;IAEnB,qBACE,KAACS;QACCC,2BAAyB9B;QACzB+B,8BAA4BhB;kBAE5B,cAAA,KAACjB,QAAQkC,QAAQ;YACfd,OAAO;gBACLnB,SAASQ;gBACTP;gBACAE;gBACAC;YACF;sBAECE;;;AAIT,EAAC;AAED,OAAO,MAAM4B,qBAAqB,IAAMtC,MAAMuC,UAAU,CAACpC,SAAQ"}
1
+ {"version":3,"sources":["../../../src/providers/TenantSelectionProvider/index.client.tsx"],"sourcesContent":["'use client'\n\nimport type { OptionObject } from 'payload'\n\nimport { useAuth } from '@payloadcms/ui'\nimport { useRouter } from 'next/navigation.js'\nimport React, { createContext } from 'react'\n\nimport { SELECT_ALL } from '../../constants.js'\n\ntype ContextType = {\n options: OptionObject[]\n selectedTenantID: number | string | undefined\n setPreventRefreshOnChange: React.Dispatch<React.SetStateAction<boolean>>\n setTenant: (args: { id: number | string | undefined; refresh?: boolean }) => void\n}\n\nconst Context = createContext<ContextType>({\n options: [],\n selectedTenantID: undefined,\n setPreventRefreshOnChange: () => null,\n setTenant: () => null,\n})\n\nexport const TenantSelectionProviderClient = ({\n children,\n initialValue,\n tenantCookie,\n tenantOptions,\n}: {\n children: React.ReactNode\n initialValue?: number | string\n tenantCookie?: string\n tenantOptions: OptionObject[]\n}) => {\n const [selectedTenantID, setSelectedTenantID] = React.useState<number | string | undefined>(\n initialValue,\n )\n const [preventRefreshOnChange, setPreventRefreshOnChange] = React.useState(false)\n const { user } = useAuth()\n const userID = React.useMemo(() => user?.id, [user?.id])\n const selectedTenantLabel = React.useMemo(\n () => tenantOptions.find((option) => option.value === selectedTenantID)?.label,\n [selectedTenantID, tenantOptions],\n )\n\n const router = useRouter()\n\n const setCookie = React.useCallback((value?: string) => {\n const expires = '; expires=Fri, 31 Dec 9999 23:59:59 GMT'\n document.cookie = 'payload-tenant=' + (value || '') + expires + '; path=/'\n }, [])\n\n const deleteCookie = React.useCallback(() => {\n document.cookie = 'payload-tenant=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/'\n }, [])\n\n const setTenant = React.useCallback<ContextType['setTenant']>(\n ({ id, refresh }) => {\n if (id === undefined) {\n if (tenantOptions.length > 1) {\n setSelectedTenantID(SELECT_ALL)\n setCookie(SELECT_ALL)\n } else {\n setSelectedTenantID(tenantOptions[0]?.value)\n setCookie(String(tenantOptions[0]?.value))\n }\n } else {\n setSelectedTenantID(id)\n setCookie(String(id))\n }\n if (!preventRefreshOnChange && refresh) {\n router.refresh()\n }\n },\n [setSelectedTenantID, setCookie, router, preventRefreshOnChange, tenantOptions],\n )\n\n React.useEffect(() => {\n if (\n selectedTenantID &&\n selectedTenantID !== SELECT_ALL &&\n !tenantOptions.find((option) => option.value === selectedTenantID)\n ) {\n if (tenantOptions?.[0]?.value) {\n setTenant({ id: tenantOptions[0].value, refresh: true })\n } else {\n setTenant({ id: undefined, refresh: true })\n }\n }\n }, [tenantCookie, setTenant, selectedTenantID, tenantOptions, initialValue, setCookie])\n\n React.useEffect(() => {\n if (userID && !tenantCookie) {\n // User is logged in, but does not have a tenant cookie, set it\n setSelectedTenantID(initialValue)\n setCookie(String(initialValue))\n }\n }, [userID, tenantCookie, initialValue, setCookie, router])\n\n React.useEffect(() => {\n if (!userID && tenantCookie) {\n // User is not logged in, but has a tenant cookie, delete it\n deleteCookie()\n setSelectedTenantID(undefined)\n } else if (userID) {\n // User changed, refresh\n router.refresh()\n }\n }, [userID, tenantCookie, deleteCookie, router])\n\n return (\n <span\n data-selected-tenant-id={selectedTenantID}\n data-selected-tenant-title={selectedTenantLabel}\n >\n <Context.Provider\n value={{\n options: tenantOptions,\n selectedTenantID,\n setPreventRefreshOnChange,\n setTenant,\n }}\n >\n {children}\n </Context.Provider>\n </span>\n )\n}\n\nexport const useTenantSelection = () => React.useContext(Context)\n"],"names":["useAuth","useRouter","React","createContext","SELECT_ALL","Context","options","selectedTenantID","undefined","setPreventRefreshOnChange","setTenant","TenantSelectionProviderClient","children","initialValue","tenantCookie","tenantOptions","setSelectedTenantID","useState","preventRefreshOnChange","user","userID","useMemo","id","selectedTenantLabel","find","option","value","label","router","setCookie","useCallback","expires","document","cookie","deleteCookie","refresh","length","String","useEffect","span","data-selected-tenant-id","data-selected-tenant-title","Provider","useTenantSelection","useContext"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/providers/TenantSelectionProvider/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAgB,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAA;AAM1D,KAAK,IAAI,GAAG;IACV,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;IACzB,OAAO,EAAE,OAAO,CAAA;IAChB,qBAAqB,EAAE,MAAM,CAAA;IAC7B,UAAU,EAAE,MAAM,CAAA;IAClB,IAAI,EAAE,IAAI,CAAA;CACX,CAAA;AAED,eAAO,MAAM,uBAAuB,oEAMjC,IAAI,yCA6BN,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/providers/TenantSelectionProvider/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAgB,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAA;AAQ1D,KAAK,IAAI,GAAG;IACV,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;IACzB,OAAO,EAAE,OAAO,CAAA;IAChB,qBAAqB,EAAE,MAAM,CAAA;IAC7B,UAAU,EAAE,MAAM,CAAA;IAClB,IAAI,EAAE,IAAI,CAAA;CACX,CAAA;AAED,eAAO,MAAM,uBAAuB,oEAMjC,IAAI,yCA0CN,CAAA"}
@@ -1,18 +1,19 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { cookies as getCookies } from 'next/headers.js';
3
+ import { SELECT_ALL } from '../../constants.js';
4
+ import { findTenantOptions } from '../../queries/findTenantOptions.js';
3
5
  import { TenantSelectionProviderClient } from './index.client.js';
4
6
  export const TenantSelectionProvider = async ({ children, payload, tenantsCollectionSlug, useAsTitle, user })=>{
5
7
  let tenantOptions = [];
6
8
  try {
7
- const { docs: userTenants } = await payload.find({
8
- collection: tenantsCollectionSlug,
9
- depth: 0,
10
- limit: 1000,
11
- overrideAccess: false,
12
- sort: useAsTitle,
9
+ const { docs } = await findTenantOptions({
10
+ limit: 0,
11
+ payload,
12
+ tenantsCollectionSlug,
13
+ useAsTitle,
13
14
  user
14
15
  });
15
- tenantOptions = userTenants.map((doc)=>({
16
+ tenantOptions = docs.map((doc)=>({
16
17
  label: String(doc[useAsTitle]),
17
18
  value: String(doc.id)
18
19
  }));
@@ -20,9 +21,18 @@ export const TenantSelectionProvider = async ({ children, payload, tenantsCollec
20
21
  // user likely does not have access
21
22
  }
22
23
  const cookies = await getCookies();
23
- const tenantCookie = cookies.get('payload-tenant')?.value;
24
+ let tenantCookie = cookies.get('payload-tenant')?.value;
25
+ let initialValue = undefined;
26
+ const isValidTenantCookie = tenantOptions.length > 1 && tenantCookie === SELECT_ALL || tenantOptions.some((option)=>option.value === tenantCookie);
27
+ if (isValidTenantCookie) {
28
+ initialValue = tenantCookie;
29
+ } else {
30
+ tenantCookie = undefined;
31
+ initialValue = tenantOptions.length > 1 ? SELECT_ALL : tenantOptions[0]?.value;
32
+ }
24
33
  return /*#__PURE__*/ _jsx(TenantSelectionProviderClient, {
25
- initialValue: tenantCookie,
34
+ initialValue: initialValue,
35
+ tenantCookie: tenantCookie,
26
36
  tenantOptions: tenantOptions,
27
37
  children: children
28
38
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/providers/TenantSelectionProvider/index.tsx"],"sourcesContent":["import type { OptionObject, Payload, User } from 'payload'\n\nimport { cookies as getCookies } from 'next/headers.js'\n\nimport { TenantSelectionProviderClient } from './index.client.js'\n\ntype Args = {\n children: React.ReactNode\n payload: Payload\n tenantsCollectionSlug: string\n useAsTitle: string\n user: User\n}\n\nexport const TenantSelectionProvider = async ({\n children,\n payload,\n tenantsCollectionSlug,\n useAsTitle,\n user,\n}: Args) => {\n let tenantOptions: OptionObject[] = []\n\n try {\n const { docs: userTenants } = await payload.find({\n collection: tenantsCollectionSlug,\n depth: 0,\n limit: 1000,\n overrideAccess: false,\n sort: useAsTitle,\n user,\n })\n\n tenantOptions = userTenants.map((doc) => ({\n label: String(doc[useAsTitle]),\n value: String(doc.id),\n }))\n } catch (_) {\n // user likely does not have access\n }\n\n const cookies = await getCookies()\n const tenantCookie = cookies.get('payload-tenant')?.value\n\n return (\n <TenantSelectionProviderClient initialValue={tenantCookie} tenantOptions={tenantOptions}>\n {children}\n </TenantSelectionProviderClient>\n )\n}\n"],"names":["cookies","getCookies","TenantSelectionProviderClient","TenantSelectionProvider","children","payload","tenantsCollectionSlug","useAsTitle","user","tenantOptions","docs","userTenants","find","collection","depth","limit","overrideAccess","sort","map","doc","label","String","value","id","_","tenantCookie","get","initialValue"],"mappings":";AAEA,SAASA,WAAWC,UAAU,QAAQ,kBAAiB;AAEvD,SAASC,6BAA6B,QAAQ,oBAAmB;AAUjE,OAAO,MAAMC,0BAA0B,OAAO,EAC5CC,QAAQ,EACRC,OAAO,EACPC,qBAAqB,EACrBC,UAAU,EACVC,IAAI,EACC;IACL,IAAIC,gBAAgC,EAAE;IAEtC,IAAI;QACF,MAAM,EAAEC,MAAMC,WAAW,EAAE,GAAG,MAAMN,QAAQO,IAAI,CAAC;YAC/CC,YAAYP;YACZQ,OAAO;YACPC,OAAO;YACPC,gBAAgB;YAChBC,MAAMV;YACNC;QACF;QAEAC,gBAAgBE,YAAYO,GAAG,CAAC,CAACC,MAAS,CAAA;gBACxCC,OAAOC,OAAOF,GAAG,CAACZ,WAAW;gBAC7Be,OAAOD,OAAOF,IAAII,EAAE;YACtB,CAAA;IACF,EAAE,OAAOC,GAAG;IACV,mCAAmC;IACrC;IAEA,MAAMxB,UAAU,MAAMC;IACtB,MAAMwB,eAAezB,QAAQ0B,GAAG,CAAC,mBAAmBJ;IAEpD,qBACE,KAACpB;QAA8ByB,cAAcF;QAAchB,eAAeA;kBACvEL;;AAGP,EAAC"}
1
+ {"version":3,"sources":["../../../src/providers/TenantSelectionProvider/index.tsx"],"sourcesContent":["import type { OptionObject, Payload, User } from 'payload'\n\nimport { cookies as getCookies } from 'next/headers.js'\n\nimport { SELECT_ALL } from '../../constants.js'\nimport { findTenantOptions } from '../../queries/findTenantOptions.js'\nimport { TenantSelectionProviderClient } from './index.client.js'\n\ntype Args = {\n children: React.ReactNode\n payload: Payload\n tenantsCollectionSlug: string\n useAsTitle: string\n user: User\n}\n\nexport const TenantSelectionProvider = async ({\n children,\n payload,\n tenantsCollectionSlug,\n useAsTitle,\n user,\n}: Args) => {\n let tenantOptions: OptionObject[] = []\n\n try {\n const { docs } = await findTenantOptions({\n limit: 0,\n payload,\n tenantsCollectionSlug,\n useAsTitle,\n user,\n })\n tenantOptions = docs.map((doc) => ({\n label: String(doc[useAsTitle]),\n value: String(doc.id),\n }))\n } catch (_) {\n // user likely does not have access\n }\n\n const cookies = await getCookies()\n let tenantCookie = cookies.get('payload-tenant')?.value\n let initialValue = undefined\n const isValidTenantCookie =\n (tenantOptions.length > 1 && tenantCookie === SELECT_ALL) ||\n tenantOptions.some((option) => option.value === tenantCookie)\n\n if (isValidTenantCookie) {\n initialValue = tenantCookie\n } else {\n tenantCookie = undefined\n initialValue = tenantOptions.length > 1 ? SELECT_ALL : tenantOptions[0]?.value\n }\n\n return (\n <TenantSelectionProviderClient\n initialValue={initialValue}\n tenantCookie={tenantCookie}\n tenantOptions={tenantOptions}\n >\n {children}\n </TenantSelectionProviderClient>\n )\n}\n"],"names":["cookies","getCookies","SELECT_ALL","findTenantOptions","TenantSelectionProviderClient","TenantSelectionProvider","children","payload","tenantsCollectionSlug","useAsTitle","user","tenantOptions","docs","limit","map","doc","label","String","value","id","_","tenantCookie","get","initialValue","undefined","isValidTenantCookie","length","some","option"],"mappings":";AAEA,SAASA,WAAWC,UAAU,QAAQ,kBAAiB;AAEvD,SAASC,UAAU,QAAQ,qBAAoB;AAC/C,SAASC,iBAAiB,QAAQ,qCAAoC;AACtE,SAASC,6BAA6B,QAAQ,oBAAmB;AAUjE,OAAO,MAAMC,0BAA0B,OAAO,EAC5CC,QAAQ,EACRC,OAAO,EACPC,qBAAqB,EACrBC,UAAU,EACVC,IAAI,EACC;IACL,IAAIC,gBAAgC,EAAE;IAEtC,IAAI;QACF,MAAM,EAAEC,IAAI,EAAE,GAAG,MAAMT,kBAAkB;YACvCU,OAAO;YACPN;YACAC;YACAC;YACAC;QACF;QACAC,gBAAgBC,KAAKE,GAAG,CAAC,CAACC,MAAS,CAAA;gBACjCC,OAAOC,OAAOF,GAAG,CAACN,WAAW;gBAC7BS,OAAOD,OAAOF,IAAII,EAAE;YACtB,CAAA;IACF,EAAE,OAAOC,GAAG;IACV,mCAAmC;IACrC;IAEA,MAAMpB,UAAU,MAAMC;IACtB,IAAIoB,eAAerB,QAAQsB,GAAG,CAAC,mBAAmBJ;IAClD,IAAIK,eAAeC;IACnB,MAAMC,sBACJ,AAACd,cAAce,MAAM,GAAG,KAAKL,iBAAiBnB,cAC9CS,cAAcgB,IAAI,CAAC,CAACC,SAAWA,OAAOV,KAAK,KAAKG;IAElD,IAAII,qBAAqB;QACvBF,eAAeF;IACjB,OAAO;QACLA,eAAeG;QACfD,eAAeZ,cAAce,MAAM,GAAG,IAAIxB,aAAaS,aAAa,CAAC,EAAE,EAAEO;IAC3E;IAEA,qBACE,KAACd;QACCmB,cAAcA;QACdF,cAAcA;QACdV,eAAeA;kBAEdL;;AAGP,EAAC"}
@@ -0,0 +1,11 @@
1
+ import type { PaginatedDocs, Payload, User } from 'payload';
2
+ type Args = {
3
+ limit: number;
4
+ payload: Payload;
5
+ tenantsCollectionSlug: string;
6
+ useAsTitle: string;
7
+ user?: User;
8
+ };
9
+ export declare const findTenantOptions: ({ limit, payload, tenantsCollectionSlug, useAsTitle, user, }: Args) => Promise<PaginatedDocs>;
10
+ export {};
11
+ //# sourceMappingURL=findTenantOptions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"findTenantOptions.d.ts","sourceRoot":"","sources":["../../src/queries/findTenantOptions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAA;AAE3D,KAAK,IAAI,GAAG;IACV,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,OAAO,CAAA;IAChB,qBAAqB,EAAE,MAAM,CAAA;IAC7B,UAAU,EAAE,MAAM,CAAA;IAClB,IAAI,CAAC,EAAE,IAAI,CAAA;CACZ,CAAA;AACD,eAAO,MAAM,iBAAiB,iEAM3B,IAAI,KAAG,OAAO,CAAC,aAAa,CAY9B,CAAA"}
@@ -0,0 +1,15 @@
1
+ export const findTenantOptions = async ({ limit, payload, tenantsCollectionSlug, useAsTitle, user })=>{
2
+ return payload.find({
3
+ collection: tenantsCollectionSlug,
4
+ depth: 0,
5
+ limit,
6
+ overrideAccess: false,
7
+ select: {
8
+ [useAsTitle]: true
9
+ },
10
+ sort: useAsTitle,
11
+ user
12
+ });
13
+ };
14
+
15
+ //# sourceMappingURL=findTenantOptions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/queries/findTenantOptions.ts"],"sourcesContent":["import type { PaginatedDocs, Payload, User } from 'payload'\n\ntype Args = {\n limit: number\n payload: Payload\n tenantsCollectionSlug: string\n useAsTitle: string\n user?: User\n}\nexport const findTenantOptions = async ({\n limit,\n payload,\n tenantsCollectionSlug,\n useAsTitle,\n user,\n}: Args): Promise<PaginatedDocs> => {\n return payload.find({\n collection: tenantsCollectionSlug,\n depth: 0,\n limit,\n overrideAccess: false,\n select: {\n [useAsTitle]: true,\n },\n sort: useAsTitle,\n user,\n })\n}\n"],"names":["findTenantOptions","limit","payload","tenantsCollectionSlug","useAsTitle","user","find","collection","depth","overrideAccess","select","sort"],"mappings":"AASA,OAAO,MAAMA,oBAAoB,OAAO,EACtCC,KAAK,EACLC,OAAO,EACPC,qBAAqB,EACrBC,UAAU,EACVC,IAAI,EACC;IACL,OAAOH,QAAQI,IAAI,CAAC;QAClBC,YAAYJ;QACZK,OAAO;QACPP;QACAQ,gBAAgB;QAChBC,QAAQ;YACN,CAACN,WAAW,EAAE;QAChB;QACAO,MAAMP;QACNC;IACF;AACF,EAAC"}