@payloadcms/plugin-multi-tenant 3.25.0-canary.f62445f → 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.
- package/dist/components/TenantSelector/index.d.ts +2 -1
- package/dist/components/TenantSelector/index.d.ts.map +1 -1
- package/dist/components/TenantSelector/index.js +4 -3
- package/dist/components/TenantSelector/index.js.map +1 -1
- package/dist/defaults.d.ts +1 -0
- package/dist/defaults.d.ts.map +1 -1
- package/dist/defaults.js +2 -1
- package/dist/defaults.js.map +1 -1
- package/dist/exports/client.d.ts +1 -0
- package/dist/exports/client.d.ts.map +1 -1
- package/dist/exports/client.js +1 -0
- package/dist/exports/client.js.map +1 -1
- package/dist/exports/utilities.d.ts +1 -1
- package/dist/exports/utilities.d.ts.map +1 -1
- package/dist/exports/utilities.js +1 -1
- package/dist/exports/utilities.js.map +1 -1
- package/dist/hooks/afterTenantDelete.d.ts.map +1 -1
- package/dist/hooks/afterTenantDelete.js +5 -1
- package/dist/hooks/afterTenantDelete.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +79 -5
- package/dist/index.js.map +1 -1
- package/dist/list-filters/filterDocumentsBySelectedTenant.d.ts +9 -0
- package/dist/list-filters/filterDocumentsBySelectedTenant.d.ts.map +1 -0
- package/dist/{utilities/getTenantListFilter.js → list-filters/filterDocumentsBySelectedTenant.js} +4 -4
- package/dist/list-filters/filterDocumentsBySelectedTenant.js.map +1 -0
- package/dist/list-filters/filterTenantsBySelectedTenant.d.ts +8 -0
- package/dist/list-filters/filterTenantsBySelectedTenant.d.ts.map +1 -0
- package/dist/list-filters/filterTenantsBySelectedTenant.js +20 -0
- package/dist/list-filters/filterTenantsBySelectedTenant.js.map +1 -0
- package/dist/list-filters/filterUsersBySelectedTenant.d.ts +13 -0
- package/dist/list-filters/filterUsersBySelectedTenant.d.ts.map +1 -0
- package/dist/list-filters/filterUsersBySelectedTenant.js +24 -0
- package/dist/list-filters/filterUsersBySelectedTenant.js.map +1 -0
- package/dist/providers/TenantSelectionProvider/index.client.d.ts +17 -0
- package/dist/providers/TenantSelectionProvider/index.client.d.ts.map +1 -1
- package/dist/providers/TenantSelectionProvider/index.client.js.map +1 -1
- package/dist/types.d.ts +17 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/utilities/addCollectionAccess.d.ts +3 -1
- package/dist/utilities/addCollectionAccess.d.ts.map +1 -1
- package/dist/utilities/addCollectionAccess.js +5 -1
- package/dist/utilities/addCollectionAccess.js.map +1 -1
- package/dist/utilities/combineListFilters.d.ts +13 -0
- package/dist/utilities/combineListFilters.d.ts.map +1 -0
- package/dist/utilities/{withTenantListFilter.js → combineListFilters.js} +5 -10
- package/dist/utilities/combineListFilters.js.map +1 -0
- package/dist/utilities/getGlobalViewRedirect.d.ts.map +1 -1
- package/dist/utilities/getGlobalViewRedirect.js +1 -0
- package/dist/utilities/getGlobalViewRedirect.js.map +1 -1
- package/dist/utilities/getTenantAccess.d.ts +3 -1
- package/dist/utilities/getTenantAccess.d.ts.map +1 -1
- package/dist/utilities/getTenantAccess.js +6 -2
- package/dist/utilities/getTenantAccess.js.map +1 -1
- package/dist/utilities/getUserTenantIDs.d.ts +4 -1
- package/dist/utilities/getUserTenantIDs.d.ts.map +1 -1
- package/dist/utilities/getUserTenantIDs.js +6 -4
- package/dist/utilities/getUserTenantIDs.js.map +1 -1
- package/dist/utilities/withTenantAccess.d.ts +6 -2
- package/dist/utilities/withTenantAccess.d.ts.map +1 -1
- package/dist/utilities/withTenantAccess.js +19 -3
- package/dist/utilities/withTenantAccess.js.map +1 -1
- package/package.json +6 -5
- package/dist/utilities/getTenantListFilter.d.ts +0 -9
- package/dist/utilities/getTenantListFilter.d.ts.map +0 -1
- package/dist/utilities/getTenantListFilter.js.map +0 -1
- package/dist/utilities/withTenantListFilter.d.ts +0 -14
- package/dist/utilities/withTenantListFilter.d.ts.map +0 -1
- 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;
|
|
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:
|
|
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'\
|
|
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"}
|
package/dist/defaults.d.ts
CHANGED
package/dist/defaults.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../src/defaults.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,QAAQ
|
|
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
|
package/dist/defaults.js.map
CHANGED
|
@@ -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;
|
|
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"}
|
package/dist/exports/client.d.ts
CHANGED
|
@@ -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"}
|
package/dist/exports/client.js
CHANGED
|
@@ -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,
|
|
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 {
|
|
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,
|
|
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
|
-
|
|
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
|
|
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"}
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
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 {
|
|
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
|
-
*
|
|
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 =
|
|
213
|
+
collection.admin.baseListFilter = combineListFilters({
|
|
148
214
|
baseListFilter: collection.admin?.baseListFilter,
|
|
149
|
-
|
|
150
|
-
|
|
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":"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"}
|
|
@@ -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"}
|
package/dist/{utilities/getTenantListFilter.js → list-filters/filterDocumentsBySelectedTenant.js}
RENAMED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { SELECT_ALL } from '../constants.js';
|
|
2
|
-
import { getCollectionIDType } from '
|
|
3
|
-
import { getTenantFromCookie } from '
|
|
4
|
-
export const
|
|
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=
|
|
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;
|