@payloadcms/plugin-multi-tenant 3.25.0-canary.fd53f68 → 3.25.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/dist/components/TenantSelector/index.d.ts +2 -1
  2. package/dist/components/TenantSelector/index.d.ts.map +1 -1
  3. package/dist/components/TenantSelector/index.js +4 -3
  4. package/dist/components/TenantSelector/index.js.map +1 -1
  5. package/dist/defaults.d.ts +1 -0
  6. package/dist/defaults.d.ts.map +1 -1
  7. package/dist/defaults.js +2 -1
  8. package/dist/defaults.js.map +1 -1
  9. package/dist/exports/client.d.ts +1 -0
  10. package/dist/exports/client.d.ts.map +1 -1
  11. package/dist/exports/client.js +1 -0
  12. package/dist/exports/client.js.map +1 -1
  13. package/dist/exports/utilities.d.ts +1 -1
  14. package/dist/exports/utilities.d.ts.map +1 -1
  15. package/dist/exports/utilities.js +1 -1
  16. package/dist/exports/utilities.js.map +1 -1
  17. package/dist/hooks/afterTenantDelete.d.ts.map +1 -1
  18. package/dist/hooks/afterTenantDelete.js +5 -1
  19. package/dist/hooks/afterTenantDelete.js.map +1 -1
  20. package/dist/index.d.ts.map +1 -1
  21. package/dist/index.js +79 -5
  22. package/dist/index.js.map +1 -1
  23. package/dist/list-filters/filterDocumentsBySelectedTenant.d.ts +9 -0
  24. package/dist/list-filters/filterDocumentsBySelectedTenant.d.ts.map +1 -0
  25. package/dist/{utilities/getTenantListFilter.js → list-filters/filterDocumentsBySelectedTenant.js} +4 -4
  26. package/dist/list-filters/filterDocumentsBySelectedTenant.js.map +1 -0
  27. package/dist/list-filters/filterTenantsBySelectedTenant.d.ts +8 -0
  28. package/dist/list-filters/filterTenantsBySelectedTenant.d.ts.map +1 -0
  29. package/dist/list-filters/filterTenantsBySelectedTenant.js +20 -0
  30. package/dist/list-filters/filterTenantsBySelectedTenant.js.map +1 -0
  31. package/dist/list-filters/filterUsersBySelectedTenant.d.ts +13 -0
  32. package/dist/list-filters/filterUsersBySelectedTenant.d.ts.map +1 -0
  33. package/dist/list-filters/filterUsersBySelectedTenant.js +24 -0
  34. package/dist/list-filters/filterUsersBySelectedTenant.js.map +1 -0
  35. package/dist/providers/TenantSelectionProvider/index.client.d.ts +17 -0
  36. package/dist/providers/TenantSelectionProvider/index.client.d.ts.map +1 -1
  37. package/dist/providers/TenantSelectionProvider/index.client.js.map +1 -1
  38. package/dist/types.d.ts +17 -0
  39. package/dist/types.d.ts.map +1 -1
  40. package/dist/types.js.map +1 -1
  41. package/dist/utilities/addCollectionAccess.d.ts +3 -1
  42. package/dist/utilities/addCollectionAccess.d.ts.map +1 -1
  43. package/dist/utilities/addCollectionAccess.js +5 -1
  44. package/dist/utilities/addCollectionAccess.js.map +1 -1
  45. package/dist/utilities/combineListFilters.d.ts +13 -0
  46. package/dist/utilities/combineListFilters.d.ts.map +1 -0
  47. package/dist/utilities/{withTenantListFilter.js → combineListFilters.js} +5 -10
  48. package/dist/utilities/combineListFilters.js.map +1 -0
  49. package/dist/utilities/getGlobalViewRedirect.d.ts.map +1 -1
  50. package/dist/utilities/getGlobalViewRedirect.js +1 -0
  51. package/dist/utilities/getGlobalViewRedirect.js.map +1 -1
  52. package/dist/utilities/getTenantAccess.d.ts +3 -1
  53. package/dist/utilities/getTenantAccess.d.ts.map +1 -1
  54. package/dist/utilities/getTenantAccess.js +6 -2
  55. package/dist/utilities/getTenantAccess.js.map +1 -1
  56. package/dist/utilities/getUserTenantIDs.d.ts +4 -1
  57. package/dist/utilities/getUserTenantIDs.d.ts.map +1 -1
  58. package/dist/utilities/getUserTenantIDs.js +6 -4
  59. package/dist/utilities/getUserTenantIDs.js.map +1 -1
  60. package/dist/utilities/withTenantAccess.d.ts +6 -2
  61. package/dist/utilities/withTenantAccess.d.ts.map +1 -1
  62. package/dist/utilities/withTenantAccess.js +19 -3
  63. package/dist/utilities/withTenantAccess.js.map +1 -1
  64. package/package.json +6 -5
  65. package/dist/utilities/getTenantListFilter.d.ts +0 -9
  66. package/dist/utilities/getTenantListFilter.d.ts.map +0 -1
  67. package/dist/utilities/getTenantListFilter.js.map +0 -1
  68. package/dist/utilities/withTenantListFilter.d.ts +0 -14
  69. package/dist/utilities/withTenantListFilter.d.ts.map +0 -1
  70. package/dist/utilities/withTenantListFilter.js.map +0 -1
@@ -1,7 +1,8 @@
1
1
  import type { ViewTypes } from 'payload';
2
2
  import './index.scss';
3
3
  import React from 'react';
4
- export declare const TenantSelector: ({ viewType }: {
4
+ export declare const TenantSelector: ({ label, viewType }: {
5
+ label: string;
5
6
  viewType?: ViewTypes;
6
7
  }) => React.JSX.Element | null;
7
8
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/TenantSelector/index.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAIxC,OAAO,cAAc,CAAA;AAErB,OAAO,KAAK,MAAM,OAAO,CAAA;AAKzB,eAAO,MAAM,cAAc,iBAAkB;IAAE,QAAQ,CAAC,EAAE,SAAS,CAAA;CAAE,6BAqCpE,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/TenantSelector/index.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAExC,OAAO,cAAc,CAAA;AAGrB,OAAO,KAAK,MAAM,OAAO,CAAA;AAKzB,eAAO,MAAM,cAAc,wBAAyB;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,SAAS,CAAA;CAAE,6BAsC1F,CAAA"}
@@ -1,12 +1,13 @@
1
1
  'use client';
2
2
  import { jsx as _jsx } from "react/jsx-runtime";
3
- import { SelectInput } from '@payloadcms/ui';
4
3
  import './index.scss';
4
+ import { SelectInput, useTranslation } from '@payloadcms/ui';
5
5
  import React from 'react';
6
6
  import { SELECT_ALL } from '../../constants.js';
7
7
  import { useTenantSelection } from '../../providers/TenantSelectionProvider/index.client.js';
8
- export const TenantSelector = ({ viewType })=>{
8
+ export const TenantSelector = ({ label, viewType })=>{
9
9
  const { options, selectedTenantID, setTenant } = useTenantSelection();
10
+ const { t } = useTranslation();
10
11
  const handleChange = React.useCallback((option)=>{
11
12
  if (option && 'value' in option) {
12
13
  setTenant({
@@ -29,7 +30,7 @@ export const TenantSelector = ({ viewType })=>{
29
30
  className: "tenant-selector",
30
31
  children: /*#__PURE__*/ _jsx(SelectInput, {
31
32
  isClearable: viewType === 'list',
32
- label: "Tenant",
33
+ label: t(label),
33
34
  name: "setTenant",
34
35
  onChange: handleChange,
35
36
  options: options,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/TenantSelector/index.tsx"],"sourcesContent":["'use client'\nimport type { ReactSelectOption } from '@payloadcms/ui'\nimport type { ViewTypes } from 'payload'\n\nimport { SelectInput } from '@payloadcms/ui'\n\nimport './index.scss'\n\nimport React from 'react'\n\nimport { SELECT_ALL } from '../../constants.js'\nimport { useTenantSelection } from '../../providers/TenantSelectionProvider/index.client.js'\n\nexport const TenantSelector = ({ viewType }: { viewType?: ViewTypes }) => {\n const { options, selectedTenantID, setTenant } = useTenantSelection()\n\n const handleChange = React.useCallback(\n (option: ReactSelectOption | ReactSelectOption[]) => {\n if (option && 'value' in option) {\n setTenant({ id: option.value as string, refresh: true })\n } else {\n setTenant({ id: undefined, refresh: true })\n }\n },\n [setTenant],\n )\n\n if (options.length <= 1) {\n return null\n }\n\n return (\n <div className=\"tenant-selector\">\n <SelectInput\n isClearable={viewType === 'list'}\n label=\"Tenant\"\n name=\"setTenant\"\n onChange={handleChange}\n options={options}\n path=\"setTenant\"\n value={\n selectedTenantID\n ? selectedTenantID === SELECT_ALL\n ? undefined\n : (selectedTenantID as string)\n : undefined\n }\n />\n </div>\n )\n}\n"],"names":["SelectInput","React","SELECT_ALL","useTenantSelection","TenantSelector","viewType","options","selectedTenantID","setTenant","handleChange","useCallback","option","id","value","refresh","undefined","length","div","className","isClearable","label","name","onChange","path"],"mappings":"AAAA;;AAIA,SAASA,WAAW,QAAQ,iBAAgB;AAE5C,OAAO,eAAc;AAErB,OAAOC,WAAW,QAAO;AAEzB,SAASC,UAAU,QAAQ,qBAAoB;AAC/C,SAASC,kBAAkB,QAAQ,0DAAyD;AAE5F,OAAO,MAAMC,iBAAiB,CAAC,EAAEC,QAAQ,EAA4B;IACnE,MAAM,EAAEC,OAAO,EAAEC,gBAAgB,EAAEC,SAAS,EAAE,GAAGL;IAEjD,MAAMM,eAAeR,MAAMS,WAAW,CACpC,CAACC;QACC,IAAIA,UAAU,WAAWA,QAAQ;YAC/BH,UAAU;gBAAEI,IAAID,OAAOE,KAAK;gBAAYC,SAAS;YAAK;QACxD,OAAO;YACLN,UAAU;gBAAEI,IAAIG;gBAAWD,SAAS;YAAK;QAC3C;IACF,GACA;QAACN;KAAU;IAGb,IAAIF,QAAQU,MAAM,IAAI,GAAG;QACvB,OAAO;IACT;IAEA,qBACE,KAACC;QAAIC,WAAU;kBACb,cAAA,KAAClB;YACCmB,aAAad,aAAa;YAC1Be,OAAM;YACNC,MAAK;YACLC,UAAUb;YACVH,SAASA;YACTiB,MAAK;YACLV,OACEN,mBACIA,qBAAqBL,aACnBa,YACCR,mBACHQ;;;AAKd,EAAC"}
1
+ {"version":3,"sources":["../../../src/components/TenantSelector/index.tsx"],"sourcesContent":["'use client'\nimport type { ReactSelectOption } from '@payloadcms/ui'\nimport type { ViewTypes } from 'payload'\n\nimport './index.scss'\n\nimport { SelectInput, useTranslation } from '@payloadcms/ui'\nimport React from 'react'\n\nimport { SELECT_ALL } from '../../constants.js'\nimport { useTenantSelection } from '../../providers/TenantSelectionProvider/index.client.js'\n\nexport const TenantSelector = ({ label, viewType }: { label: string; viewType?: ViewTypes }) => {\n const { options, selectedTenantID, setTenant } = useTenantSelection()\n const { t } = useTranslation()\n\n const handleChange = React.useCallback(\n (option: ReactSelectOption | ReactSelectOption[]) => {\n if (option && 'value' in option) {\n setTenant({ id: option.value as string, refresh: true })\n } else {\n setTenant({ id: undefined, refresh: true })\n }\n },\n [setTenant],\n )\n\n if (options.length <= 1) {\n return null\n }\n\n return (\n <div className=\"tenant-selector\">\n <SelectInput\n isClearable={viewType === 'list'}\n label={t(label as any)}\n name=\"setTenant\"\n onChange={handleChange}\n options={options}\n path=\"setTenant\"\n value={\n selectedTenantID\n ? selectedTenantID === SELECT_ALL\n ? undefined\n : (selectedTenantID as string)\n : undefined\n }\n />\n </div>\n )\n}\n"],"names":["SelectInput","useTranslation","React","SELECT_ALL","useTenantSelection","TenantSelector","label","viewType","options","selectedTenantID","setTenant","t","handleChange","useCallback","option","id","value","refresh","undefined","length","div","className","isClearable","name","onChange","path"],"mappings":"AAAA;;AAIA,OAAO,eAAc;AAErB,SAASA,WAAW,EAAEC,cAAc,QAAQ,iBAAgB;AAC5D,OAAOC,WAAW,QAAO;AAEzB,SAASC,UAAU,QAAQ,qBAAoB;AAC/C,SAASC,kBAAkB,QAAQ,0DAAyD;AAE5F,OAAO,MAAMC,iBAAiB,CAAC,EAAEC,KAAK,EAAEC,QAAQ,EAA2C;IACzF,MAAM,EAAEC,OAAO,EAAEC,gBAAgB,EAAEC,SAAS,EAAE,GAAGN;IACjD,MAAM,EAAEO,CAAC,EAAE,GAAGV;IAEd,MAAMW,eAAeV,MAAMW,WAAW,CACpC,CAACC;QACC,IAAIA,UAAU,WAAWA,QAAQ;YAC/BJ,UAAU;gBAAEK,IAAID,OAAOE,KAAK;gBAAYC,SAAS;YAAK;QACxD,OAAO;YACLP,UAAU;gBAAEK,IAAIG;gBAAWD,SAAS;YAAK;QAC3C;IACF,GACA;QAACP;KAAU;IAGb,IAAIF,QAAQW,MAAM,IAAI,GAAG;QACvB,OAAO;IACT;IAEA,qBACE,KAACC;QAAIC,WAAU;kBACb,cAAA,KAACrB;YACCsB,aAAaf,aAAa;YAC1BD,OAAOK,EAAEL;YACTiB,MAAK;YACLC,UAAUZ;YACVJ,SAASA;YACTiB,MAAK;YACLT,OACEP,mBACIA,qBAAqBN,aACnBe,YACCT,mBACHS;;;AAKd,EAAC"}
@@ -3,5 +3,6 @@ export declare const defaults: {
3
3
  tenantFieldName: string;
4
4
  tenantsArrayFieldName: string;
5
5
  tenantsArrayTenantFieldName: string;
6
+ tenantSelectorLabel: string;
6
7
  };
7
8
  //# sourceMappingURL=defaults.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../src/defaults.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,QAAQ;;;;;CAKpB,CAAA"}
1
+ {"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../src/defaults.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,QAAQ;;;;;;CAMpB,CAAA"}
package/dist/defaults.js CHANGED
@@ -2,7 +2,8 @@ export const defaults = {
2
2
  tenantCollectionSlug: 'tenants',
3
3
  tenantFieldName: 'tenant',
4
4
  tenantsArrayFieldName: 'tenants',
5
- tenantsArrayTenantFieldName: 'tenant'
5
+ tenantsArrayTenantFieldName: 'tenant',
6
+ tenantSelectorLabel: 'Tenant'
6
7
  };
7
8
 
8
9
  //# sourceMappingURL=defaults.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/defaults.ts"],"sourcesContent":["export const defaults = {\n tenantCollectionSlug: 'tenants',\n tenantFieldName: 'tenant',\n tenantsArrayFieldName: 'tenants',\n tenantsArrayTenantFieldName: 'tenant',\n}\n"],"names":["defaults","tenantCollectionSlug","tenantFieldName","tenantsArrayFieldName","tenantsArrayTenantFieldName"],"mappings":"AAAA,OAAO,MAAMA,WAAW;IACtBC,sBAAsB;IACtBC,iBAAiB;IACjBC,uBAAuB;IACvBC,6BAA6B;AAC/B,EAAC"}
1
+ {"version":3,"sources":["../src/defaults.ts"],"sourcesContent":["export const defaults = {\n tenantCollectionSlug: 'tenants',\n tenantFieldName: 'tenant',\n tenantsArrayFieldName: 'tenants',\n tenantsArrayTenantFieldName: 'tenant',\n tenantSelectorLabel: 'Tenant',\n}\n"],"names":["defaults","tenantCollectionSlug","tenantFieldName","tenantsArrayFieldName","tenantsArrayTenantFieldName","tenantSelectorLabel"],"mappings":"AAAA,OAAO,MAAMA,WAAW;IACtBC,sBAAsB;IACtBC,iBAAiB;IACjBC,uBAAuB;IACvBC,6BAA6B;IAC7BC,qBAAqB;AACvB,EAAC"}
@@ -1,3 +1,4 @@
1
1
  export { TenantField } from '../components/TenantField/index.client.js';
2
2
  export { TenantSelector } from '../components/TenantSelector/index.js';
3
+ export { useTenantSelection } from '../providers/TenantSelectionProvider/index.client.js';
3
4
  //# sourceMappingURL=client.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/exports/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,2CAA2C,CAAA;AACvE,OAAO,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAA"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/exports/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,2CAA2C,CAAA;AACvE,OAAO,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAA;AACtE,OAAO,EAAE,kBAAkB,EAAE,MAAM,sDAAsD,CAAA"}
@@ -1,4 +1,5 @@
1
1
  export { TenantField } from '../components/TenantField/index.client.js';
2
2
  export { TenantSelector } from '../components/TenantSelector/index.js';
3
+ export { useTenantSelection } from '../providers/TenantSelectionProvider/index.client.js';
3
4
 
4
5
  //# sourceMappingURL=client.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/exports/client.ts"],"sourcesContent":["export { TenantField } from '../components/TenantField/index.client.js'\nexport { TenantSelector } from '../components/TenantSelector/index.js'\n"],"names":["TenantField","TenantSelector"],"mappings":"AAAA,SAASA,WAAW,QAAQ,4CAA2C;AACvE,SAASC,cAAc,QAAQ,wCAAuC"}
1
+ {"version":3,"sources":["../../src/exports/client.ts"],"sourcesContent":["export { TenantField } from '../components/TenantField/index.client.js'\nexport { TenantSelector } from '../components/TenantSelector/index.js'\nexport { useTenantSelection } from '../providers/TenantSelectionProvider/index.client.js'\n"],"names":["TenantField","TenantSelector","useTenantSelection"],"mappings":"AAAA,SAASA,WAAW,QAAQ,4CAA2C;AACvE,SAASC,cAAc,QAAQ,wCAAuC;AACtE,SAASC,kBAAkB,QAAQ,uDAAsD"}
@@ -1,6 +1,6 @@
1
+ export { filterDocumentsBySelectedTenant as getTenantListFilter } from '../list-filters/filterDocumentsBySelectedTenant.js';
1
2
  export { getGlobalViewRedirect } from '../utilities/getGlobalViewRedirect.js';
2
3
  export { getTenantAccess } from '../utilities/getTenantAccess.js';
3
4
  export { getTenantFromCookie } from '../utilities/getTenantFromCookie.js';
4
- export { getTenantListFilter } from '../utilities/getTenantListFilter.js';
5
5
  export { getUserTenantIDs } from '../utilities/getUserTenantIDs.js';
6
6
  //# sourceMappingURL=utilities.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"utilities.d.ts","sourceRoot":"","sources":["../../src/exports/utilities.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,uCAAuC,CAAA;AAC7E,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAA;AACjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAA;AACzE,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAA;AACzE,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAA"}
1
+ {"version":3,"file":"utilities.d.ts","sourceRoot":"","sources":["../../src/exports/utilities.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,+BAA+B,IAAI,mBAAmB,EAAE,MAAM,oDAAoD,CAAA;AAC3H,OAAO,EAAE,qBAAqB,EAAE,MAAM,uCAAuC,CAAA;AAC7E,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAA;AACjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAA;AACzE,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAA"}
@@ -1,7 +1,7 @@
1
+ export { filterDocumentsBySelectedTenant as getTenantListFilter } from '../list-filters/filterDocumentsBySelectedTenant.js';
1
2
  export { getGlobalViewRedirect } from '../utilities/getGlobalViewRedirect.js';
2
3
  export { getTenantAccess } from '../utilities/getTenantAccess.js';
3
4
  export { getTenantFromCookie } from '../utilities/getTenantFromCookie.js';
4
- export { getTenantListFilter } from '../utilities/getTenantListFilter.js';
5
5
  export { getUserTenantIDs } from '../utilities/getUserTenantIDs.js';
6
6
 
7
7
  //# sourceMappingURL=utilities.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/exports/utilities.ts"],"sourcesContent":["export { getGlobalViewRedirect } from '../utilities/getGlobalViewRedirect.js'\nexport { getTenantAccess } from '../utilities/getTenantAccess.js'\nexport { getTenantFromCookie } from '../utilities/getTenantFromCookie.js'\nexport { getTenantListFilter } from '../utilities/getTenantListFilter.js'\nexport { getUserTenantIDs } from '../utilities/getUserTenantIDs.js'\n"],"names":["getGlobalViewRedirect","getTenantAccess","getTenantFromCookie","getTenantListFilter","getUserTenantIDs"],"mappings":"AAAA,SAASA,qBAAqB,QAAQ,wCAAuC;AAC7E,SAASC,eAAe,QAAQ,kCAAiC;AACjE,SAASC,mBAAmB,QAAQ,sCAAqC;AACzE,SAASC,mBAAmB,QAAQ,sCAAqC;AACzE,SAASC,gBAAgB,QAAQ,mCAAkC"}
1
+ {"version":3,"sources":["../../src/exports/utilities.ts"],"sourcesContent":["export { filterDocumentsBySelectedTenant as getTenantListFilter } from '../list-filters/filterDocumentsBySelectedTenant.js'\nexport { getGlobalViewRedirect } from '../utilities/getGlobalViewRedirect.js'\nexport { getTenantAccess } from '../utilities/getTenantAccess.js'\nexport { getTenantFromCookie } from '../utilities/getTenantFromCookie.js'\nexport { getUserTenantIDs } from '../utilities/getUserTenantIDs.js'\n"],"names":["filterDocumentsBySelectedTenant","getTenantListFilter","getGlobalViewRedirect","getTenantAccess","getTenantFromCookie","getUserTenantIDs"],"mappings":"AAAA,SAASA,mCAAmCC,mBAAmB,QAAQ,qDAAoD;AAC3H,SAASC,qBAAqB,QAAQ,wCAAuC;AAC7E,SAASC,eAAe,QAAQ,kCAAiC;AACjE,SAASC,mBAAmB,QAAQ,sCAAqC;AACzE,SAASC,gBAAgB,QAAQ,mCAAkC"}
@@ -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;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;IACjB,0BAA0B,EAAE,MAAM,CAAA;IAClC,gCAAgC,EAAE,MAAM,CAAA;CACzC,CAAA;AACD;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,mJAQ1B,IAAI,SAiBN,CAAA;AAED,eAAO,MAAM,iBAAiB,uIAQzB,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC,KAAG,yBAgE7B,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;IACjB,0BAA0B,EAAE,MAAM,CAAA;IAClC,gCAAgC,EAAE,MAAM,CAAA;CACzC,CAAA;AACD;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,mJAQ1B,IAAI,SAiBN,CAAA;AAED,eAAO,MAAM,iBAAiB,uIAQzB,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC,KAAG,yBAsE7B,CAAA"}
@@ -66,7 +66,11 @@ export const afterTenantDelete = ({ enabledSlugs, tenantFieldName, tenantsCollec
66
66
  id: user.id,
67
67
  collection: usersSlug,
68
68
  data: {
69
- tenants: (user.tenants || []).filter(({ tenant: tenantID })=>tenantID !== id)
69
+ [usersTenantsArrayFieldName]: (user[usersTenantsArrayFieldName] || []).filter((row)=>{
70
+ if (row[usersTenantsArrayTenantFieldName]) {
71
+ return row[usersTenantsArrayTenantFieldName] !== id;
72
+ }
73
+ })
70
74
  }
71
75
  }));
72
76
  });
@@ -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 { 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 usersTenantsArrayFieldName: string\n usersTenantsArrayTenantFieldName: 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 usersTenantsArrayFieldName,\n usersTenantsArrayTenantFieldName,\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 usersTenantsArrayFieldName,\n usersTenantsArrayTenantFieldName,\n }),\n )\n}\n\nexport const afterTenantDelete =\n ({\n enabledSlugs,\n tenantFieldName,\n tenantsCollectionSlug,\n usersSlug,\n usersTenantsArrayFieldName,\n usersTenantsArrayTenantFieldName,\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 [`${usersTenantsArrayFieldName}.${usersTenantsArrayTenantFieldName}`]: {\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","usersTenantsArrayFieldName","usersTenantsArrayTenantFieldName","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;AAWzE;;;;CAIC,GACD,OAAO,MAAMC,mBAAmB,CAAC,EAC/BC,UAAU,EACVC,YAAY,EACZC,eAAe,EACfC,qBAAqB,EACrBC,SAAS,EACTC,0BAA0B,EAC1BC,gCAAgC,EAC3B;IACL,IAAI,CAACN,WAAWO,KAAK,EAAE;QACrBP,WAAWO,KAAK,GAAG,CAAC;IACtB;IACA,IAAI,CAACP,WAAWO,KAAK,EAAEC,aAAa;QAClCR,WAAWO,KAAK,CAACC,WAAW,GAAG,EAAE;IACnC;IACAR,WAAWO,KAAK,CAACC,WAAW,CAACC,IAAI,CAC/BC,kBAAkB;QAChBT;QACAC;QACAC;QACAC;QACAC;QACAC;IACF;AAEJ,EAAC;AAED,OAAO,MAAMI,oBACX,CAAC,EACCT,YAAY,EACZC,eAAe,EACfC,qBAAqB,EACrBC,SAAS,EACTC,0BAA0B,EAC1BC,gCAAgC,EACP,GAC3B,OAAO,EAAEK,EAAE,EAAEC,GAAG,EAAE;QAChB,MAAMC,SAAShB,oBAAoB;YACjCiB,gBAAgBX;YAChBY,SAASH,IAAIG,OAAO;QACtB;QACA,MAAMC,wBAAwBlB,oBAAoBc,IAAIK,OAAO,EAAEJ;QAC/D,IAAIG,0BAA0BL,IAAI;YAChC,MAAMO,aAAa,IAAIC,QAAQ;gBAC7B,cAAcxB,eAAuB;oBACnCyB,MAAM;oBACNC,SAAS,IAAIC,KAAKA,KAAKC,GAAG,KAAK;oBAC/BC,MAAM;oBACNC,sBAAsB;oBACtBC,OAAO;gBACT;YACF;YAEAd,IAAIe,eAAe,GAAGf,IAAIe,eAAe,GACrC/B,aAAagB,IAAIe,eAAe,EAAET,cAClCA;QACN;QACA,MAAMU,kBAAyC,EAAE;QACjD3B,aAAa4B,OAAO,CAAC,CAACC;YACpBF,gBAAgBnB,IAAI,CAClBG,IAAIG,OAAO,CAACgB,MAAM,CAAC;gBACjB/B,YAAY8B;gBACZE,OAAO;oBACL,CAAC9B,gBAAgB,EAAE;wBACjB+B,QAAQtB;oBACV;gBACF;YACF;QAEJ;QAEA,IAAI;YACF,MAAMuB,kBAAmB,MAAMtB,IAAIG,OAAO,CAACoB,IAAI,CAAC;gBAC9CnC,YAAYI;gBACZgC,OAAO;gBACPC,OAAO;gBACPL,OAAO;oBACL,CAAC,GAAG3B,2BAA2B,CAAC,EAAEC,kCAAkC,CAAC,EAAE;wBACrE2B,QAAQtB;oBACV;gBACF;YACF;YAEAuB,iBAAiBI,MAAMT,QAAQ,CAACU;gBAC9BX,gBAAgBnB,IAAI,CAClBG,IAAIG,OAAO,CAACyB,MAAM,CAAC;oBACjB7B,IAAI4B,KAAK5B,EAAE;oBACXX,YAAYI;oBACZqC,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 usersTenantsArrayFieldName: string\n usersTenantsArrayTenantFieldName: 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 usersTenantsArrayFieldName,\n usersTenantsArrayTenantFieldName,\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 usersTenantsArrayFieldName,\n usersTenantsArrayTenantFieldName,\n }),\n )\n}\n\nexport const afterTenantDelete =\n ({\n enabledSlugs,\n tenantFieldName,\n tenantsCollectionSlug,\n usersSlug,\n usersTenantsArrayFieldName,\n usersTenantsArrayTenantFieldName,\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 [`${usersTenantsArrayFieldName}.${usersTenantsArrayTenantFieldName}`]: {\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 [usersTenantsArrayFieldName]: (user[usersTenantsArrayFieldName] || []).filter(\n (row: Record<string, string>) => {\n if (row[usersTenantsArrayTenantFieldName]) {\n return row[usersTenantsArrayTenantFieldName] !== id\n }\n },\n ),\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","usersTenantsArrayFieldName","usersTenantsArrayTenantFieldName","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","filter","row","e","console","error","Promise","all"],"mappings":"AAOA,SAASA,cAAc,EAAEC,YAAY,QAAQ,UAAS;AAItD,SAASC,mBAAmB,QAAQ,sCAAqC;AACzE,SAASC,mBAAmB,QAAQ,sCAAqC;AAWzE;;;;CAIC,GACD,OAAO,MAAMC,mBAAmB,CAAC,EAC/BC,UAAU,EACVC,YAAY,EACZC,eAAe,EACfC,qBAAqB,EACrBC,SAAS,EACTC,0BAA0B,EAC1BC,gCAAgC,EAC3B;IACL,IAAI,CAACN,WAAWO,KAAK,EAAE;QACrBP,WAAWO,KAAK,GAAG,CAAC;IACtB;IACA,IAAI,CAACP,WAAWO,KAAK,EAAEC,aAAa;QAClCR,WAAWO,KAAK,CAACC,WAAW,GAAG,EAAE;IACnC;IACAR,WAAWO,KAAK,CAACC,WAAW,CAACC,IAAI,CAC/BC,kBAAkB;QAChBT;QACAC;QACAC;QACAC;QACAC;QACAC;IACF;AAEJ,EAAC;AAED,OAAO,MAAMI,oBACX,CAAC,EACCT,YAAY,EACZC,eAAe,EACfC,qBAAqB,EACrBC,SAAS,EACTC,0BAA0B,EAC1BC,gCAAgC,EACP,GAC3B,OAAO,EAAEK,EAAE,EAAEC,GAAG,EAAE;QAChB,MAAMC,SAAShB,oBAAoB;YACjCiB,gBAAgBX;YAChBY,SAASH,IAAIG,OAAO;QACtB;QACA,MAAMC,wBAAwBlB,oBAAoBc,IAAIK,OAAO,EAAEJ;QAC/D,IAAIG,0BAA0BL,IAAI;YAChC,MAAMO,aAAa,IAAIC,QAAQ;gBAC7B,cAAcxB,eAAuB;oBACnCyB,MAAM;oBACNC,SAAS,IAAIC,KAAKA,KAAKC,GAAG,KAAK;oBAC/BC,MAAM;oBACNC,sBAAsB;oBACtBC,OAAO;gBACT;YACF;YAEAd,IAAIe,eAAe,GAAGf,IAAIe,eAAe,GACrC/B,aAAagB,IAAIe,eAAe,EAAET,cAClCA;QACN;QACA,MAAMU,kBAAyC,EAAE;QACjD3B,aAAa4B,OAAO,CAAC,CAACC;YACpBF,gBAAgBnB,IAAI,CAClBG,IAAIG,OAAO,CAACgB,MAAM,CAAC;gBACjB/B,YAAY8B;gBACZE,OAAO;oBACL,CAAC9B,gBAAgB,EAAE;wBACjB+B,QAAQtB;oBACV;gBACF;YACF;QAEJ;QAEA,IAAI;YACF,MAAMuB,kBAAmB,MAAMtB,IAAIG,OAAO,CAACoB,IAAI,CAAC;gBAC9CnC,YAAYI;gBACZgC,OAAO;gBACPC,OAAO;gBACPL,OAAO;oBACL,CAAC,GAAG3B,2BAA2B,CAAC,EAAEC,kCAAkC,CAAC,EAAE;wBACrE2B,QAAQtB;oBACV;gBACF;YACF;YAEAuB,iBAAiBI,MAAMT,QAAQ,CAACU;gBAC9BX,gBAAgBnB,IAAI,CAClBG,IAAIG,OAAO,CAACyB,MAAM,CAAC;oBACjB7B,IAAI4B,KAAK5B,EAAE;oBACXX,YAAYI;oBACZqC,MAAM;wBACJ,CAACpC,2BAA2B,EAAE,AAACkC,CAAAA,IAAI,CAAClC,2BAA2B,IAAI,EAAE,AAAD,EAAGqC,MAAM,CAC3E,CAACC;4BACC,IAAIA,GAAG,CAACrC,iCAAiC,EAAE;gCACzC,OAAOqC,GAAG,CAACrC,iCAAiC,KAAKK;4BACnD;wBACF;oBAEJ;gBACF;YAEJ;QACF,EAAE,OAAOiC,GAAG;YACVC,QAAQC,KAAK,CAAC,sCAAsCF;QACtD;QAEA,MAAMG,QAAQC,GAAG,CAACpB;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;AAUzD,eAAO,MAAM,iBAAiB,GAC3B,UAAU,gBAAgB,uBAAuB,CAAC,UAAU,CAAC,sBAC7C,MAAM,KAAG,MA6OzB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAoB,MAAM,EAAE,MAAM,SAAS,CAAA;AAEvD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAA;AAazD,eAAO,MAAM,iBAAiB,GAC3B,UAAU,gBAAgB,uBAAuB,CAAC,UAAU,CAAC,sBAC7C,MAAM,KAAG,MA+TzB,CAAA"}
package/dist/index.js CHANGED
@@ -2,9 +2,12 @@ import { defaults } from './defaults.js';
2
2
  import { tenantField } from './fields/tenantField/index.js';
3
3
  import { tenantsArrayField } from './fields/tenantsArrayField/index.js';
4
4
  import { addTenantCleanup } from './hooks/afterTenantDelete.js';
5
+ import { filterDocumentsBySelectedTenant } from './list-filters/filterDocumentsBySelectedTenant.js';
6
+ import { filterTenantsBySelectedTenant } from './list-filters/filterTenantsBySelectedTenant.js';
7
+ import { filterUsersBySelectedTenant } from './list-filters/filterUsersBySelectedTenant.js';
5
8
  import { addCollectionAccess } from './utilities/addCollectionAccess.js';
6
9
  import { addFilterOptionsToFields } from './utilities/addFilterOptionsToFields.js';
7
- import { withTenantListFilter } from './utilities/withTenantListFilter.js';
10
+ import { combineListFilters } from './utilities/combineListFilters.js';
8
11
  export const multiTenantPlugin = (pluginConfig)=>(incomingConfig)=>{
9
12
  if (pluginConfig.enabled === false) {
10
13
  return incomingConfig;
@@ -16,6 +19,7 @@ export const multiTenantPlugin = (pluginConfig)=>(incomingConfig)=>{
16
19
  const tenantFieldName = pluginConfig?.tenantField?.name || defaults.tenantFieldName;
17
20
  const tenantsArrayFieldName = pluginConfig?.tenantsArrayField?.arrayFieldName || defaults.tenantsArrayFieldName;
18
21
  const tenantsArrayTenantFieldName = pluginConfig?.tenantsArrayField?.arrayTenantFieldName || defaults.tenantsArrayTenantFieldName;
22
+ let tenantSelectorLabel = pluginConfig.tenantSelectorLabel || defaults.tenantSelectorLabel;
19
23
  /**
20
24
  * Add defaults for admin properties
21
25
  */ if (!incomingConfig.admin) {
@@ -41,6 +45,34 @@ export const multiTenantPlugin = (pluginConfig)=>(incomingConfig)=>{
41
45
  incomingConfig.collections = [];
42
46
  }
43
47
  /**
48
+ * Add tenant selector localized labels
49
+ */ if (pluginConfig.tenantSelectorLabel && typeof pluginConfig.tenantSelectorLabel === 'object') {
50
+ if (!incomingConfig.i18n) {
51
+ incomingConfig.i18n = {};
52
+ }
53
+ Object.entries(pluginConfig.tenantSelectorLabel).forEach(([_locale, label])=>{
54
+ const locale = _locale;
55
+ if (!incomingConfig.i18n) {
56
+ incomingConfig.i18n = {};
57
+ }
58
+ if (!incomingConfig.i18n.translations) {
59
+ incomingConfig.i18n.translations = {};
60
+ }
61
+ if (!incomingConfig.i18n.translations[locale]) {
62
+ incomingConfig.i18n.translations[locale] = {};
63
+ }
64
+ if (!('multiTenant' in incomingConfig.i18n.translations[locale])) {
65
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
66
+ // @ts-expect-error
67
+ incomingConfig.i18n.translations[locale].multiTenant = {};
68
+ }
69
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
70
+ // @ts-expect-error
71
+ incomingConfig.i18n.translations[locale].multiTenant.selectorLabel = label;
72
+ tenantSelectorLabel = 'multiTenant:selectorLabel';
73
+ });
74
+ }
75
+ /**
44
76
  * Add tenants array field to users collection
45
77
  */ const adminUsersCollection = incomingConfig.collections.find(({ slug, auth })=>{
46
78
  if (incomingConfig.admin?.user) {
@@ -65,8 +97,24 @@ export const multiTenantPlugin = (pluginConfig)=>(incomingConfig)=>{
65
97
  addCollectionAccess({
66
98
  collection: adminUsersCollection,
67
99
  fieldName: `${tenantsArrayFieldName}.${tenantsArrayTenantFieldName}`,
100
+ tenantsArrayFieldName,
101
+ tenantsArrayTenantFieldName,
68
102
  userHasAccessToAllTenants
69
103
  });
104
+ if (pluginConfig.useUsersTenantFilter !== false) {
105
+ if (!adminUsersCollection.admin) {
106
+ adminUsersCollection.admin = {};
107
+ }
108
+ adminUsersCollection.admin.baseListFilter = combineListFilters({
109
+ baseListFilter: adminUsersCollection.admin?.baseListFilter,
110
+ customFilter: (args)=>filterUsersBySelectedTenant({
111
+ req: args.req,
112
+ tenantsArrayFieldName,
113
+ tenantsArrayTenantFieldName,
114
+ tenantsCollectionSlug
115
+ })
116
+ });
117
+ }
70
118
  let tenantCollection;
71
119
  const [collectionSlugs, globalCollectionSlugs] = Object.keys(pluginConfig.collections).reduce((acc, slug)=>{
72
120
  if (pluginConfig?.collections?.[slug]?.isGlobal) {
@@ -93,9 +141,26 @@ export const multiTenantPlugin = (pluginConfig)=>(incomingConfig)=>{
93
141
  */ addCollectionAccess({
94
142
  collection,
95
143
  fieldName: 'id',
144
+ tenantsArrayFieldName,
145
+ tenantsArrayTenantFieldName,
96
146
  userHasAccessToAllTenants
97
147
  });
98
148
  }
149
+ if (pluginConfig.useTenantsListFilter !== false) {
150
+ /**
151
+ * Add list filter to tenants collection
152
+ * - filter by selected tenant
153
+ */ if (!collection.admin) {
154
+ collection.admin = {};
155
+ }
156
+ collection.admin.baseListFilter = combineListFilters({
157
+ baseListFilter: collection.admin?.baseListFilter,
158
+ customFilter: (args)=>filterTenantsBySelectedTenant({
159
+ req: args.req,
160
+ tenantsCollectionSlug
161
+ })
162
+ });
163
+ }
99
164
  if (pluginConfig.cleanupAfterTenantDelete !== false) {
100
165
  /**
101
166
  * Add cleanup logic when tenant is deleted
@@ -140,14 +205,18 @@ export const multiTenantPlugin = (pluginConfig)=>(incomingConfig)=>{
140
205
  }));
141
206
  if (pluginConfig.collections[collection.slug]?.useBaseListFilter !== false) {
142
207
  /**
143
- * Collection baseListFilter with selected tenant constraint (if selected)
208
+ * Add list filter to enabled collections
209
+ * - filters results by selected tenant
144
210
  */ if (!collection.admin) {
145
211
  collection.admin = {};
146
212
  }
147
- collection.admin.baseListFilter = withTenantListFilter({
213
+ collection.admin.baseListFilter = combineListFilters({
148
214
  baseListFilter: collection.admin?.baseListFilter,
149
- tenantFieldName,
150
- tenantsCollectionSlug
215
+ customFilter: (args)=>filterDocumentsBySelectedTenant({
216
+ req: args.req,
217
+ tenantFieldName,
218
+ tenantsCollectionSlug
219
+ })
151
220
  });
152
221
  }
153
222
  if (pluginConfig.collections[collection.slug]?.useTenantAccess !== false) {
@@ -156,6 +225,8 @@ export const multiTenantPlugin = (pluginConfig)=>(incomingConfig)=>{
156
225
  */ addCollectionAccess({
157
226
  collection,
158
227
  fieldName: tenantFieldName,
228
+ tenantsArrayFieldName,
229
+ tenantsArrayTenantFieldName,
159
230
  userHasAccessToAllTenants
160
231
  });
161
232
  }
@@ -189,6 +260,9 @@ export const multiTenantPlugin = (pluginConfig)=>(incomingConfig)=>{
189
260
  /**
190
261
  * Add tenant selector to admin UI
191
262
  */ incomingConfig.admin.components.beforeNavLinks.push({
263
+ clientProps: {
264
+ label: tenantSelectorLabel
265
+ },
192
266
  path: '@payloadcms/plugin-multi-tenant/client#TenantSelector'
193
267
  });
194
268
  return incomingConfig;
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 { defaults } from './defaults.js'\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\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 const tenantsArrayFieldName =\n pluginConfig?.tenantsArrayField?.arrayFieldName || defaults.tenantsArrayFieldName\n const tenantsArrayTenantFieldName =\n pluginConfig?.tenantsArrayField?.arrayTenantFieldName || defaults.tenantsArrayTenantFieldName\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 tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n tenantsCollectionSlug,\n }),\n )\n }\n\n addCollectionAccess({\n collection: adminUsersCollection,\n fieldName: `${tenantsArrayFieldName}.${tenantsArrayTenantFieldName}`,\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 if (pluginConfig.useTenantsCollectionAccess !== false) {\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\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 usersTenantsArrayFieldName: tenantsArrayFieldName,\n usersTenantsArrayTenantFieldName: tenantsArrayTenantFieldName,\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 config: incomingConfig,\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":["defaults","tenantField","tenantsArrayField","addTenantCleanup","addCollectionAccess","addFilterOptionsToFields","withTenantListFilter","multiTenantPlugin","pluginConfig","incomingConfig","enabled","userHasAccessToAllTenants","tenantsCollectionSlug","tenantsSlug","tenantCollectionSlug","tenantFieldName","name","tenantsArrayFieldName","arrayFieldName","tenantsArrayTenantFieldName","arrayTenantFieldName","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","useTenantsCollectionAccess","cleanupAfterTenantDelete","enabledSlugs","usersSlug","usersTenantsArrayFieldName","usersTenantsArrayTenantFieldName","Boolean","disableDuplicate","config","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 { AcceptedLanguages } from '@payloadcms/translations'\nimport type { CollectionConfig, Config } from 'payload'\n\nimport type { MultiTenantPluginConfig } from './types.js'\n\nimport { defaults } from './defaults.js'\nimport { tenantField } from './fields/tenantField/index.js'\nimport { tenantsArrayField } from './fields/tenantsArrayField/index.js'\nimport { addTenantCleanup } from './hooks/afterTenantDelete.js'\nimport { filterDocumentsBySelectedTenant } from './list-filters/filterDocumentsBySelectedTenant.js'\nimport { filterTenantsBySelectedTenant } from './list-filters/filterTenantsBySelectedTenant.js'\nimport { filterUsersBySelectedTenant } from './list-filters/filterUsersBySelectedTenant.js'\nimport { addCollectionAccess } from './utilities/addCollectionAccess.js'\nimport { addFilterOptionsToFields } from './utilities/addFilterOptionsToFields.js'\nimport { combineListFilters } from './utilities/combineListFilters.js'\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 const tenantsArrayFieldName =\n pluginConfig?.tenantsArrayField?.arrayFieldName || defaults.tenantsArrayFieldName\n const tenantsArrayTenantFieldName =\n pluginConfig?.tenantsArrayField?.arrayTenantFieldName || defaults.tenantsArrayTenantFieldName\n let tenantSelectorLabel = pluginConfig.tenantSelectorLabel || defaults.tenantSelectorLabel\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 tenant selector localized labels\n */\n if (pluginConfig.tenantSelectorLabel && typeof pluginConfig.tenantSelectorLabel === 'object') {\n if (!incomingConfig.i18n) {\n incomingConfig.i18n = {}\n }\n Object.entries(pluginConfig.tenantSelectorLabel).forEach(([_locale, label]) => {\n const locale = _locale as AcceptedLanguages\n if (!incomingConfig.i18n) {\n incomingConfig.i18n = {}\n }\n if (!incomingConfig.i18n.translations) {\n incomingConfig.i18n.translations = {}\n }\n if (!incomingConfig.i18n.translations[locale]) {\n incomingConfig.i18n.translations[locale] = {}\n }\n if (!('multiTenant' in incomingConfig.i18n.translations[locale])) {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-expect-error\n incomingConfig.i18n.translations[locale].multiTenant = {}\n }\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-expect-error\n incomingConfig.i18n.translations[locale].multiTenant.selectorLabel = label\n tenantSelectorLabel = 'multiTenant:selectorLabel'\n })\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 tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n tenantsCollectionSlug,\n }),\n )\n }\n\n addCollectionAccess({\n collection: adminUsersCollection,\n fieldName: `${tenantsArrayFieldName}.${tenantsArrayTenantFieldName}`,\n tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n userHasAccessToAllTenants,\n })\n\n if (pluginConfig.useUsersTenantFilter !== false) {\n if (!adminUsersCollection.admin) {\n adminUsersCollection.admin = {}\n }\n\n adminUsersCollection.admin.baseListFilter = combineListFilters({\n baseListFilter: adminUsersCollection.admin?.baseListFilter,\n customFilter: (args) =>\n filterUsersBySelectedTenant({\n req: args.req,\n tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n tenantsCollectionSlug,\n }),\n })\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 if (pluginConfig.useTenantsCollectionAccess !== false) {\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 tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n userHasAccessToAllTenants,\n })\n }\n\n if (pluginConfig.useTenantsListFilter !== false) {\n /**\n * Add list filter to tenants collection\n * - filter by selected tenant\n */\n if (!collection.admin) {\n collection.admin = {}\n }\n\n collection.admin.baseListFilter = combineListFilters({\n baseListFilter: collection.admin?.baseListFilter,\n customFilter: (args) =>\n filterTenantsBySelectedTenant({\n req: args.req,\n tenantsCollectionSlug,\n }),\n })\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 usersTenantsArrayFieldName: tenantsArrayFieldName,\n usersTenantsArrayTenantFieldName: tenantsArrayTenantFieldName,\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 config: incomingConfig,\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 * Add list filter to enabled collections\n * - filters results by selected tenant\n */\n if (!collection.admin) {\n collection.admin = {}\n }\n\n collection.admin.baseListFilter = combineListFilters({\n baseListFilter: collection.admin?.baseListFilter,\n customFilter: (args) =>\n filterDocumentsBySelectedTenant({\n req: args.req,\n tenantFieldName,\n tenantsCollectionSlug,\n }),\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 tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\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 clientProps: {\n label: tenantSelectorLabel,\n },\n path: '@payloadcms/plugin-multi-tenant/client#TenantSelector',\n })\n\n return incomingConfig\n }\n"],"names":["defaults","tenantField","tenantsArrayField","addTenantCleanup","filterDocumentsBySelectedTenant","filterTenantsBySelectedTenant","filterUsersBySelectedTenant","addCollectionAccess","addFilterOptionsToFields","combineListFilters","multiTenantPlugin","pluginConfig","incomingConfig","enabled","userHasAccessToAllTenants","tenantsCollectionSlug","tenantsSlug","tenantCollectionSlug","tenantFieldName","name","tenantsArrayFieldName","arrayFieldName","tenantsArrayTenantFieldName","arrayTenantFieldName","tenantSelectorLabel","admin","components","actions","beforeNavLinks","providers","collections","i18n","Object","entries","forEach","_locale","label","locale","translations","multiTenant","selectorLabel","adminUsersCollection","find","slug","auth","user","Error","includeDefaultField","fields","push","collection","fieldName","useUsersTenantFilter","baseListFilter","customFilter","args","req","tenantCollection","collectionSlugs","globalCollectionSlugs","keys","reduce","acc","isGlobal","useTenantsCollectionAccess","useTenantsListFilter","cleanupAfterTenantDelete","enabledSlugs","usersSlug","usersTenantsArrayFieldName","usersTenantsArrayTenantFieldName","Boolean","disableDuplicate","config","tenantEnabledCollectionSlugs","tenantEnabledGlobalSlugs","splice","debug","unique","useBaseListFilter","useTenantAccess","clientProps","useAsTitle","path","length","serverProps","globalSlugs"],"mappings":"AAKA,SAASA,QAAQ,QAAQ,gBAAe;AACxC,SAASC,WAAW,QAAQ,gCAA+B;AAC3D,SAASC,iBAAiB,QAAQ,sCAAqC;AACvE,SAASC,gBAAgB,QAAQ,+BAA8B;AAC/D,SAASC,+BAA+B,QAAQ,oDAAmD;AACnG,SAASC,6BAA6B,QAAQ,kDAAiD;AAC/F,SAASC,2BAA2B,QAAQ,gDAA+C;AAC3F,SAASC,mBAAmB,QAAQ,qCAAoC;AACxE,SAASC,wBAAwB,QAAQ,0CAAyC;AAClF,SAASC,kBAAkB,QAAQ,oCAAmC;AAEtE,OAAO,MAAMC,oBACX,CAAaC,eACb,CAACC;QACC,IAAID,aAAaE,OAAO,KAAK,OAAO;YAClC,OAAOD;QACT;QAEA;;KAEC,GACD,MAAME,4BAGJ,OAAOH,aAAaG,yBAAyB,KAAK,aAC9CH,aAAaG,yBAAyB,GACtC,IAAM;QACZ,MAAMC,wBAAyBJ,aAAaK,WAAW,GACrDL,aAAaK,WAAW,IAAIhB,SAASiB,oBAAoB;QAC3D,MAAMC,kBAAkBP,cAAcV,aAAakB,QAAQnB,SAASkB,eAAe;QACnF,MAAME,wBACJT,cAAcT,mBAAmBmB,kBAAkBrB,SAASoB,qBAAqB;QACnF,MAAME,8BACJX,cAAcT,mBAAmBqB,wBAAwBvB,SAASsB,2BAA2B;QAC/F,IAAIE,sBAAsBb,aAAaa,mBAAmB,IAAIxB,SAASwB,mBAAmB;QAE1F;;KAEC,GACD,IAAI,CAACZ,eAAea,KAAK,EAAE;YACzBb,eAAea,KAAK,GAAG,CAAC;QAC1B;QACA,IAAI,CAACb,eAAea,KAAK,EAAEC,YAAY;YACrCd,eAAea,KAAK,CAACC,UAAU,GAAG;gBAChCC,SAAS,EAAE;gBACXC,gBAAgB,EAAE;gBAClBC,WAAW,EAAE;YACf;QACF;QACA,IAAI,CAACjB,eAAea,KAAK,CAACC,UAAU,EAAEG,WAAW;YAC/CjB,eAAea,KAAK,CAACC,UAAU,CAACG,SAAS,GAAG,EAAE;QAChD;QACA,IAAI,CAACjB,eAAea,KAAK,CAACC,UAAU,EAAEC,SAAS;YAC7Cf,eAAea,KAAK,CAACC,UAAU,CAACC,OAAO,GAAG,EAAE;QAC9C;QACA,IAAI,CAACf,eAAea,KAAK,CAACC,UAAU,EAAEE,gBAAgB;YACpDhB,eAAea,KAAK,CAACC,UAAU,CAACE,cAAc,GAAG,EAAE;QACrD;QACA,IAAI,CAAChB,eAAekB,WAAW,EAAE;YAC/BlB,eAAekB,WAAW,GAAG,EAAE;QACjC;QAEA;;KAEC,GACD,IAAInB,aAAaa,mBAAmB,IAAI,OAAOb,aAAaa,mBAAmB,KAAK,UAAU;YAC5F,IAAI,CAACZ,eAAemB,IAAI,EAAE;gBACxBnB,eAAemB,IAAI,GAAG,CAAC;YACzB;YACAC,OAAOC,OAAO,CAACtB,aAAaa,mBAAmB,EAAEU,OAAO,CAAC,CAAC,CAACC,SAASC,MAAM;gBACxE,MAAMC,SAASF;gBACf,IAAI,CAACvB,eAAemB,IAAI,EAAE;oBACxBnB,eAAemB,IAAI,GAAG,CAAC;gBACzB;gBACA,IAAI,CAACnB,eAAemB,IAAI,CAACO,YAAY,EAAE;oBACrC1B,eAAemB,IAAI,CAACO,YAAY,GAAG,CAAC;gBACtC;gBACA,IAAI,CAAC1B,eAAemB,IAAI,CAACO,YAAY,CAACD,OAAO,EAAE;oBAC7CzB,eAAemB,IAAI,CAACO,YAAY,CAACD,OAAO,GAAG,CAAC;gBAC9C;gBACA,IAAI,CAAE,CAAA,iBAAiBzB,eAAemB,IAAI,CAACO,YAAY,CAACD,OAAO,AAAD,GAAI;oBAChE,6DAA6D;oBAC7D,mBAAmB;oBACnBzB,eAAemB,IAAI,CAACO,YAAY,CAACD,OAAO,CAACE,WAAW,GAAG,CAAC;gBAC1D;gBACA,6DAA6D;gBAC7D,mBAAmB;gBACnB3B,eAAemB,IAAI,CAACO,YAAY,CAACD,OAAO,CAACE,WAAW,CAACC,aAAa,GAAGJ;gBACrEZ,sBAAsB;YACxB;QACF;QAEA;;KAEC,GACD,MAAMiB,uBAAuB7B,eAAekB,WAAW,CAACY,IAAI,CAAC,CAAC,EAAEC,IAAI,EAAEC,IAAI,EAAE;YAC1E,IAAIhC,eAAea,KAAK,EAAEoB,MAAM;gBAC9B,OAAOF,SAAS/B,eAAea,KAAK,CAACoB,IAAI;YAC3C,OAAO,IAAID,MAAM;gBACf,OAAO;YACT;QACF;QAEA,IAAI,CAACH,sBAAsB;YACzB,MAAMK,MAAM;QACd;QAEA;;KAEC,GACD,IAAInC,cAAcT,mBAAmB6C,wBAAwB,OAAO;YAClEN,qBAAqBO,MAAM,CAACC,IAAI,CAC9B/C,kBAAkB;gBAChB,GAAIS,cAAcT,qBAAqB,CAAC,CAAC;gBACzCkB;gBACAE;gBACAP;YACF;QAEJ;QAEAR,oBAAoB;YAClB2C,YAAYT;YACZU,WAAW,GAAG/B,sBAAsB,CAAC,EAAEE,6BAA6B;YACpEF;YACAE;YACAR;QACF;QAEA,IAAIH,aAAayC,oBAAoB,KAAK,OAAO;YAC/C,IAAI,CAACX,qBAAqBhB,KAAK,EAAE;gBAC/BgB,qBAAqBhB,KAAK,GAAG,CAAC;YAChC;YAEAgB,qBAAqBhB,KAAK,CAAC4B,cAAc,GAAG5C,mBAAmB;gBAC7D4C,gBAAgBZ,qBAAqBhB,KAAK,EAAE4B;gBAC5CC,cAAc,CAACC,OACbjD,4BAA4B;wBAC1BkD,KAAKD,KAAKC,GAAG;wBACbpC;wBACAE;wBACAP;oBACF;YACJ;QACF;QAEA,IAAI0C;QAEJ,MAAM,CAACC,iBAAiBC,sBAAsB,GAAG3B,OAAO4B,IAAI,CAACjD,aAAamB,WAAW,EAAE+B,MAAM,CAG3F,CAACC,KAAKnB;YACJ,IAAIhC,cAAcmB,aAAa,CAACa,KAAK,EAAEoB,UAAU;gBAC/CD,GAAG,CAAC,EAAE,CAACb,IAAI,CAACN;YACd,OAAO;gBACLmB,GAAG,CAAC,EAAE,CAACb,IAAI,CAACN;YACd;YAEA,OAAOmB;QACT,GACA;YAAC,EAAE;YAAE,EAAE;SAAC;QAGV;;KAEC,GACDlD,eAAekB,WAAW,CAACI,OAAO,CAAC,CAACgB;YAClC;;OAEC,GACD,IAAIA,WAAWP,IAAI,KAAK5B,uBAAuB;gBAC7C0C,mBAAmBP;gBAEnB,IAAIvC,aAAaqD,0BAA0B,KAAK,OAAO;oBACrD;;;WAGC,GACDzD,oBAAoB;wBAClB2C;wBACAC,WAAW;wBACX/B;wBACAE;wBACAR;oBACF;gBACF;gBAEA,IAAIH,aAAasD,oBAAoB,KAAK,OAAO;oBAC/C;;;WAGC,GACD,IAAI,CAACf,WAAWzB,KAAK,EAAE;wBACrByB,WAAWzB,KAAK,GAAG,CAAC;oBACtB;oBAEAyB,WAAWzB,KAAK,CAAC4B,cAAc,GAAG5C,mBAAmB;wBACnD4C,gBAAgBH,WAAWzB,KAAK,EAAE4B;wBAClCC,cAAc,CAACC,OACblD,8BAA8B;gCAC5BmD,KAAKD,KAAKC,GAAG;gCACbzC;4BACF;oBACJ;gBACF;gBAEA,IAAIJ,aAAauD,wBAAwB,KAAK,OAAO;oBACnD;;;;WAIC,GACD/D,iBAAiB;wBACf+C;wBACAiB,cAAc;+BAAIT;+BAAoBC;yBAAsB;wBAC5DzC;wBACAH;wBACAqD,WAAW3B,qBAAqBE,IAAI;wBACpC0B,4BAA4BjD;wBAC5BkD,kCAAkChD;oBACpC;gBACF;YACF,OAAO,IAAIX,aAAamB,WAAW,EAAE,CAACoB,WAAWP,IAAI,CAAC,EAAE;gBACtD,MAAMoB,WAAWQ,QAAQ5D,aAAamB,WAAW,CAACoB,WAAWP,IAAI,CAAC,EAAEoB;gBAEpE,IAAIA,UAAU;oBACZb,WAAWsB,gBAAgB,GAAG;gBAChC;gBAEA;;SAEC,GACDhE,yBAAyB;oBACvBiE,QAAQ7D;oBACRoC,QAAQE,WAAWF,MAAM;oBACzB0B,8BAA8BhB;oBAC9BiB,0BAA0BhB;oBAC1BzC;oBACAH;gBACF;gBAEA;;SAEC,GACDmC,WAAWF,MAAM,CAAC4B,MAAM,CACtB,GACA,GACA3E,YAAY;oBACV,GAAIU,cAAcV,eAAe,CAAC,CAAC;oBACnCkB,MAAMD;oBACN2D,OAAOlE,aAAakE,KAAK;oBACzB9D;oBACA+D,QAAQf;gBACV;gBAGF,IAAIpD,aAAamB,WAAW,CAACoB,WAAWP,IAAI,CAAC,EAAEoC,sBAAsB,OAAO;oBAC1E;;;WAGC,GACD,IAAI,CAAC7B,WAAWzB,KAAK,EAAE;wBACrByB,WAAWzB,KAAK,GAAG,CAAC;oBACtB;oBAEAyB,WAAWzB,KAAK,CAAC4B,cAAc,GAAG5C,mBAAmB;wBACnD4C,gBAAgBH,WAAWzB,KAAK,EAAE4B;wBAClCC,cAAc,CAACC,OACbnD,gCAAgC;gCAC9BoD,KAAKD,KAAKC,GAAG;gCACbtC;gCACAH;4BACF;oBACJ;gBACF;gBAEA,IAAIJ,aAAamB,WAAW,CAACoB,WAAWP,IAAI,CAAC,EAAEqC,oBAAoB,OAAO;oBACxE;;WAEC,GACDzE,oBAAoB;wBAClB2C;wBACAC,WAAWjC;wBACXE;wBACAE;wBACAR;oBACF;gBACF;YACF;QACF;QAEA,IAAI,CAAC2C,kBAAkB;YACrB,MAAM,IAAIX,MAAM,CAAC,wCAAwC,EAAE/B,uBAAuB;QACpF;QAEA;;KAEC,GACDH,eAAea,KAAK,CAACC,UAAU,CAACG,SAAS,CAACoB,IAAI,CAAC;YAC7CgC,aAAa;gBACXlE,uBAAuB0C,iBAAiBd,IAAI;gBAC5CuC,YAAYzB,iBAAiBhC,KAAK,EAAEyD,cAAc;YACpD;YACAC,MAAM;QACR;QAEA;;KAEC,GACD,IAAIxB,sBAAsByB,MAAM,EAAE;YAChCxE,eAAea,KAAK,CAACC,UAAU,CAACC,OAAO,CAACsB,IAAI,CAAC;gBAC3CkC,MAAM;gBACNE,aAAa;oBACXC,aAAa3B;oBACbzC;oBACAH;oBACAmE,YAAYzB,iBAAiBhC,KAAK,EAAEyD,cAAc;gBACpD;YACF;QACF;QAEA;;KAEC,GACDtE,eAAea,KAAK,CAACC,UAAU,CAACE,cAAc,CAACqB,IAAI,CAAC;YAClDgC,aAAa;gBACX7C,OAAOZ;YACT;YACA2D,MAAM;QACR;QAEA,OAAOvE;IACT,EAAC"}
@@ -0,0 +1,9 @@
1
+ import type { PayloadRequest, Where } from 'payload';
2
+ type Args = {
3
+ req: PayloadRequest;
4
+ tenantFieldName: string;
5
+ tenantsCollectionSlug: string;
6
+ };
7
+ export declare const filterDocumentsBySelectedTenant: ({ req, tenantFieldName, tenantsCollectionSlug, }: Args) => null | Where;
8
+ export {};
9
+ //# sourceMappingURL=filterDocumentsBySelectedTenant.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filterDocumentsBySelectedTenant.d.ts","sourceRoot":"","sources":["../../src/list-filters/filterDocumentsBySelectedTenant.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,+BAA+B,qDAIzC,IAAI,KAAG,IAAI,GAAG,KAgBhB,CAAA"}
@@ -1,7 +1,7 @@
1
1
  import { SELECT_ALL } from '../constants.js';
2
- import { getCollectionIDType } from './getCollectionIDType.js';
3
- import { getTenantFromCookie } from './getTenantFromCookie.js';
4
- export const getTenantListFilter = ({ req, tenantFieldName, tenantsCollectionSlug })=>{
2
+ import { getCollectionIDType } from '../utilities/getCollectionIDType.js';
3
+ import { getTenantFromCookie } from '../utilities/getTenantFromCookie.js';
4
+ export const filterDocumentsBySelectedTenant = ({ req, tenantFieldName, tenantsCollectionSlug })=>{
5
5
  const idType = getCollectionIDType({
6
6
  collectionSlug: tenantsCollectionSlug,
7
7
  payload: req.payload
@@ -17,4 +17,4 @@ export const getTenantListFilter = ({ req, tenantFieldName, tenantsCollectionSlu
17
17
  };
18
18
  };
19
19
 
20
- //# sourceMappingURL=getTenantListFilter.js.map
20
+ //# sourceMappingURL=filterDocumentsBySelectedTenant.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/list-filters/filterDocumentsBySelectedTenant.ts"],"sourcesContent":["import type { PayloadRequest, Where } from 'payload'\n\nimport { SELECT_ALL } from '../constants.js'\nimport { getCollectionIDType } from '../utilities/getCollectionIDType.js'\nimport { getTenantFromCookie } from '../utilities/getTenantFromCookie.js'\n\ntype Args = {\n req: PayloadRequest\n tenantFieldName: string\n tenantsCollectionSlug: string\n}\nexport const filterDocumentsBySelectedTenant = ({\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","filterDocumentsBySelectedTenant","req","tenantFieldName","tenantsCollectionSlug","idType","collectionSlug","payload","selectedTenant","headers","equals"],"mappings":"AAEA,SAASA,UAAU,QAAQ,kBAAiB;AAC5C,SAASC,mBAAmB,QAAQ,sCAAqC;AACzE,SAASC,mBAAmB,QAAQ,sCAAqC;AAOzE,OAAO,MAAMC,kCAAkC,CAAC,EAC9CC,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"}
@@ -0,0 +1,8 @@
1
+ import type { PayloadRequest, Where } from 'payload';
2
+ type Args = {
3
+ req: PayloadRequest;
4
+ tenantsCollectionSlug: string;
5
+ };
6
+ export declare const filterTenantsBySelectedTenant: ({ req, tenantsCollectionSlug, }: Args) => null | Where;
7
+ export {};
8
+ //# sourceMappingURL=filterTenantsBySelectedTenant.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filterTenantsBySelectedTenant.d.ts","sourceRoot":"","sources":["../../src/list-filters/filterTenantsBySelectedTenant.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAMpD,KAAK,IAAI,GAAG;IACV,GAAG,EAAE,cAAc,CAAA;IACnB,qBAAqB,EAAE,MAAM,CAAA;CAC9B,CAAA;AACD,eAAO,MAAM,6BAA6B,oCAGvC,IAAI,KAAG,IAAI,GAAG,KAgBhB,CAAA"}
@@ -0,0 +1,20 @@
1
+ import { SELECT_ALL } from '../constants.js';
2
+ import { getCollectionIDType } from '../utilities/getCollectionIDType.js';
3
+ import { getTenantFromCookie } from '../utilities/getTenantFromCookie.js';
4
+ export const filterTenantsBySelectedTenant = ({ req, tenantsCollectionSlug })=>{
5
+ const idType = getCollectionIDType({
6
+ collectionSlug: tenantsCollectionSlug,
7
+ payload: req.payload
8
+ });
9
+ const selectedTenant = getTenantFromCookie(req.headers, idType);
10
+ if (selectedTenant === SELECT_ALL) {
11
+ return {};
12
+ }
13
+ return {
14
+ id: {
15
+ equals: selectedTenant
16
+ }
17
+ };
18
+ };
19
+
20
+ //# sourceMappingURL=filterTenantsBySelectedTenant.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/list-filters/filterTenantsBySelectedTenant.ts"],"sourcesContent":["import type { PayloadRequest, Where } from 'payload'\n\nimport { SELECT_ALL } from '../constants.js'\nimport { getCollectionIDType } from '../utilities/getCollectionIDType.js'\nimport { getTenantFromCookie } from '../utilities/getTenantFromCookie.js'\n\ntype Args = {\n req: PayloadRequest\n tenantsCollectionSlug: string\n}\nexport const filterTenantsBySelectedTenant = ({\n req,\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 id: {\n equals: selectedTenant,\n },\n }\n}\n"],"names":["SELECT_ALL","getCollectionIDType","getTenantFromCookie","filterTenantsBySelectedTenant","req","tenantsCollectionSlug","idType","collectionSlug","payload","selectedTenant","headers","id","equals"],"mappings":"AAEA,SAASA,UAAU,QAAQ,kBAAiB;AAC5C,SAASC,mBAAmB,QAAQ,sCAAqC;AACzE,SAASC,mBAAmB,QAAQ,sCAAqC;AAMzE,OAAO,MAAMC,gCAAgC,CAAC,EAC5CC,GAAG,EACHC,qBAAqB,EAChB;IACL,MAAMC,SAASL,oBAAoB;QACjCM,gBAAgBF;QAChBG,SAASJ,IAAII,OAAO;IACtB;IACA,MAAMC,iBAAiBP,oBAAoBE,IAAIM,OAAO,EAAEJ;IAExD,IAAIG,mBAAmBT,YAAY;QACjC,OAAO,CAAC;IACV;IAEA,OAAO;QACLW,IAAI;YACFC,QAAQH;QACV;IACF;AACF,EAAC"}
@@ -0,0 +1,13 @@
1
+ import type { PayloadRequest, Where } from 'payload';
2
+ type Args = {
3
+ req: PayloadRequest;
4
+ tenantsArrayFieldName: string;
5
+ tenantsArrayTenantFieldName: string;
6
+ tenantsCollectionSlug: string;
7
+ };
8
+ /**
9
+ * Filter the list of users by the selected tenant
10
+ */
11
+ export declare const filterUsersBySelectedTenant: ({ req, tenantsArrayFieldName, tenantsArrayTenantFieldName, tenantsCollectionSlug, }: Args) => null | Where;
12
+ export {};
13
+ //# sourceMappingURL=filterUsersBySelectedTenant.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filterUsersBySelectedTenant.d.ts","sourceRoot":"","sources":["../../src/list-filters/filterUsersBySelectedTenant.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAMpD,KAAK,IAAI,GAAG;IACV,GAAG,EAAE,cAAc,CAAA;IACnB,qBAAqB,EAAE,MAAM,CAAA;IAC7B,2BAA2B,EAAE,MAAM,CAAA;IACnC,qBAAqB,EAAE,MAAM,CAAA;CAC9B,CAAA;AACD;;GAEG;AACH,eAAO,MAAM,2BAA2B,wFAKrC,IAAI,KAAG,IAAI,GAAG,KAgBhB,CAAA"}
@@ -0,0 +1,24 @@
1
+ import { SELECT_ALL } from '../constants.js';
2
+ import { getCollectionIDType } from '../utilities/getCollectionIDType.js';
3
+ import { getTenantFromCookie } from '../utilities/getTenantFromCookie.js';
4
+ /**
5
+ * Filter the list of users by the selected tenant
6
+ */ export const filterUsersBySelectedTenant = ({ req, tenantsArrayFieldName, tenantsArrayTenantFieldName, tenantsCollectionSlug })=>{
7
+ const idType = getCollectionIDType({
8
+ collectionSlug: tenantsCollectionSlug,
9
+ payload: req.payload
10
+ });
11
+ const selectedTenant = getTenantFromCookie(req.headers, idType);
12
+ if (selectedTenant === SELECT_ALL) {
13
+ return {};
14
+ }
15
+ return {
16
+ [`${tenantsArrayFieldName}.${tenantsArrayTenantFieldName}`]: {
17
+ in: [
18
+ selectedTenant
19
+ ]
20
+ }
21
+ };
22
+ };
23
+
24
+ //# sourceMappingURL=filterUsersBySelectedTenant.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/list-filters/filterUsersBySelectedTenant.ts"],"sourcesContent":["import type { PayloadRequest, Where } from 'payload'\n\nimport { SELECT_ALL } from '../constants.js'\nimport { getCollectionIDType } from '../utilities/getCollectionIDType.js'\nimport { getTenantFromCookie } from '../utilities/getTenantFromCookie.js'\n\ntype Args = {\n req: PayloadRequest\n tenantsArrayFieldName: string\n tenantsArrayTenantFieldName: string\n tenantsCollectionSlug: string\n}\n/**\n * Filter the list of users by the selected tenant\n */\nexport const filterUsersBySelectedTenant = ({\n req,\n tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\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 [`${tenantsArrayFieldName}.${tenantsArrayTenantFieldName}`]: {\n in: [selectedTenant],\n },\n }\n}\n"],"names":["SELECT_ALL","getCollectionIDType","getTenantFromCookie","filterUsersBySelectedTenant","req","tenantsArrayFieldName","tenantsArrayTenantFieldName","tenantsCollectionSlug","idType","collectionSlug","payload","selectedTenant","headers","in"],"mappings":"AAEA,SAASA,UAAU,QAAQ,kBAAiB;AAC5C,SAASC,mBAAmB,QAAQ,sCAAqC;AACzE,SAASC,mBAAmB,QAAQ,sCAAqC;AAQzE;;CAEC,GACD,OAAO,MAAMC,8BAA8B,CAAC,EAC1CC,GAAG,EACHC,qBAAqB,EACrBC,2BAA2B,EAC3BC,qBAAqB,EAChB;IACL,MAAMC,SAASP,oBAAoB;QACjCQ,gBAAgBF;QAChBG,SAASN,IAAIM,OAAO;IACtB;IACA,MAAMC,iBAAiBT,oBAAoBE,IAAIQ,OAAO,EAAEJ;IAExD,IAAIG,mBAAmBX,YAAY;QACjC,OAAO,CAAC;IACV;IAEA,OAAO;QACL,CAAC,GAAGK,sBAAsB,CAAC,EAAEC,6BAA6B,CAAC,EAAE;YAC3DO,IAAI;gBAACF;aAAe;QACtB;IACF;AACF,EAAC"}
@@ -1,9 +1,26 @@
1
1
  import type { OptionObject } from 'payload';
2
2
  import React from 'react';
3
3
  type ContextType = {
4
+ /**
5
+ * Array of options to select from
6
+ */
4
7
  options: OptionObject[];
8
+ /**
9
+ * The currently selected tenant ID
10
+ */
5
11
  selectedTenantID: number | string | undefined;
12
+ /**
13
+ * Prevents a refresh when the tenant is changed
14
+ *
15
+ * If not switching tenants while viewing a "global", set to true
16
+ */
6
17
  setPreventRefreshOnChange: React.Dispatch<React.SetStateAction<boolean>>;
18
+ /**
19
+ * Sets the selected tenant ID
20
+ *
21
+ * @param args.id - The ID of the tenant to select
22
+ * @param args.refresh - Whether to refresh the page after changing the tenant
23
+ */
7
24
  setTenant: (args: {
8
25
  id: number | string | undefined;
9
26
  refresh?: boolean;