@payloadcms/plugin-multi-tenant 0.0.1 → 3.18.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/README.md +130 -95
- package/dist/components/GlobalViewRedirect/index.d.ts +3 -2
- package/dist/components/GlobalViewRedirect/index.d.ts.map +1 -1
- package/dist/components/GlobalViewRedirect/index.js +1 -0
- package/dist/components/GlobalViewRedirect/index.js.map +1 -1
- package/dist/components/TenantField/index.client.d.ts +3 -3
- package/dist/components/TenantField/index.client.d.ts.map +1 -1
- package/dist/components/TenantField/index.client.js +55 -17
- package/dist/components/TenantField/index.client.js.map +1 -1
- package/dist/components/TenantField/index.scss +14 -0
- package/dist/components/TenantSelector/index.d.ts +5 -8
- package/dist/components/TenantSelector/index.d.ts.map +1 -1
- package/dist/components/TenantSelector/index.js +35 -24
- package/dist/components/TenantSelector/index.js.map +1 -1
- package/dist/constants.d.ts +2 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +4 -0
- package/dist/constants.js.map +1 -0
- package/dist/exports/client.d.ts +3 -0
- package/dist/exports/client.d.ts.map +1 -0
- package/dist/exports/client.js +4 -0
- package/dist/exports/client.js.map +1 -0
- package/dist/exports/fields.d.ts +3 -0
- package/dist/exports/fields.d.ts.map +1 -0
- package/dist/exports/fields.js +4 -0
- package/dist/exports/fields.js.map +1 -0
- package/dist/exports/rsc.d.ts +1 -2
- package/dist/exports/rsc.d.ts.map +1 -1
- package/dist/exports/rsc.js +1 -2
- package/dist/exports/rsc.js.map +1 -1
- package/dist/fields/tenantField/index.d.ts +2 -3
- package/dist/fields/tenantField/index.d.ts.map +1 -1
- package/dist/fields/tenantField/index.js +8 -4
- package/dist/fields/tenantField/index.js.map +1 -1
- package/dist/fields/tenantsArrayField/index.d.ts +7 -0
- package/dist/fields/tenantsArrayField/index.d.ts.map +1 -0
- package/dist/fields/{userTenantsArrayField → tenantsArrayField}/index.js +3 -3
- package/dist/fields/tenantsArrayField/index.js.map +1 -0
- package/dist/hooks/afterTenantDelete.d.ts +16 -0
- package/dist/hooks/afterTenantDelete.d.ts.map +1 -0
- package/dist/hooks/afterTenantDelete.js +71 -0
- package/dist/hooks/afterTenantDelete.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +112 -49
- package/dist/index.js.map +1 -1
- package/dist/providers/TenantSelectionProvider/index.client.d.ts +19 -0
- package/dist/providers/TenantSelectionProvider/index.client.d.ts.map +1 -0
- package/dist/providers/TenantSelectionProvider/index.client.js +69 -0
- package/dist/providers/TenantSelectionProvider/index.client.js.map +1 -0
- package/dist/providers/TenantSelectionProvider/index.d.ts +11 -0
- package/dist/providers/TenantSelectionProvider/index.d.ts.map +1 -0
- package/dist/providers/TenantSelectionProvider/index.js +31 -0
- package/dist/providers/TenantSelectionProvider/index.js.map +1 -0
- package/dist/types.d.ts +54 -17
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/utilities/addCollectionAccess.d.ts +13 -0
- package/dist/utilities/addCollectionAccess.d.ts.map +1 -0
- package/dist/utilities/addCollectionAccess.js +29 -0
- package/dist/utilities/addCollectionAccess.js.map +1 -0
- package/dist/utilities/addFilterOptionsToFields.d.ts +9 -0
- package/dist/utilities/addFilterOptionsToFields.d.ts.map +1 -0
- package/dist/utilities/addFilterOptionsToFields.js +107 -0
- package/dist/utilities/addFilterOptionsToFields.js.map +1 -0
- package/dist/utilities/combineWhereConstraints.js +2 -2
- package/dist/utilities/combineWhereConstraints.js.map +1 -1
- package/dist/utilities/getGlobalViewRedirect.d.ts +4 -3
- package/dist/utilities/getGlobalViewRedirect.d.ts.map +1 -1
- package/dist/utilities/getGlobalViewRedirect.js +6 -5
- package/dist/utilities/getGlobalViewRedirect.js.map +1 -1
- package/dist/utilities/getTenantAccess.d.ts +7 -3
- package/dist/utilities/getTenantAccess.d.ts.map +1 -1
- package/dist/utilities/getTenantAccess.js +6 -9
- package/dist/utilities/getTenantAccess.js.map +1 -1
- package/dist/utilities/getTenantFromCookie.d.ts +8 -1
- package/dist/utilities/getTenantFromCookie.d.ts.map +1 -1
- package/dist/utilities/getTenantFromCookie.js +7 -1
- package/dist/utilities/getTenantFromCookie.js.map +1 -1
- package/dist/utilities/getTenantListFilter.d.ts.map +1 -1
- package/dist/utilities/getTenantListFilter.js +8 -8
- package/dist/utilities/getTenantListFilter.js.map +1 -1
- package/dist/utilities/getUserTenantIDs.d.ts +1 -2
- package/dist/utilities/getUserTenantIDs.d.ts.map +1 -1
- package/dist/utilities/getUserTenantIDs.js +2 -6
- package/dist/utilities/getUserTenantIDs.js.map +1 -1
- package/dist/utilities/withTenantAccess.d.ts +4 -3
- package/dist/utilities/withTenantAccess.d.ts.map +1 -1
- package/dist/utilities/withTenantAccess.js +12 -16
- package/dist/utilities/withTenantAccess.js.map +1 -1
- package/dist/utilities/withTenantListFilter.js +1 -1
- package/dist/utilities/withTenantListFilter.js.map +1 -1
- package/package.json +20 -10
- package/dist/components/TenantField/index.d.ts +0 -3
- package/dist/components/TenantField/index.d.ts.map +0 -1
- package/dist/components/TenantField/index.js +0 -33
- package/dist/components/TenantField/index.js.map +0 -1
- package/dist/components/TenantSelector/index.client.d.ts +0 -11
- package/dist/components/TenantSelector/index.client.d.ts.map +0 -1
- package/dist/components/TenantSelector/index.client.js +0 -61
- package/dist/components/TenantSelector/index.client.js.map +0 -1
- package/dist/fields/userTenantsArrayField/index.d.ts +0 -4
- package/dist/fields/userTenantsArrayField/index.d.ts.map +0 -1
- package/dist/fields/userTenantsArrayField/index.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getUserTenantIDs.d.ts","sourceRoot":"","sources":["../../src/utilities/getUserTenantIDs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAU,oBAAoB,EAAE,MAAM,aAAa,CAAA;AAI/D
|
|
1
|
+
{"version":3,"file":"getUserTenantIDs.d.ts","sourceRoot":"","sources":["../../src/utilities/getUserTenantIDs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAU,oBAAoB,EAAE,MAAM,aAAa,CAAA;AAI/D;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,GAAI,MAAM,SAAS,MAAM,GAAG,MAAM,QACvD,IAAI,GAAG,oBAAoB,KAChC,MAAM,EAcR,CAAA"}
|
|
@@ -3,15 +3,11 @@ import { extractID } from './extractID.js';
|
|
|
3
3
|
* Returns array of all tenant IDs assigned to a user
|
|
4
4
|
*
|
|
5
5
|
* @param user - User object with tenants field
|
|
6
|
-
|
|
7
|
-
*/ export const getUserTenantIDs = (user, role)=>{
|
|
6
|
+
*/ export const getUserTenantIDs = (user)=>{
|
|
8
7
|
if (!user) {
|
|
9
8
|
return [];
|
|
10
9
|
}
|
|
11
|
-
return user?.tenants?.reduce((acc, {
|
|
12
|
-
if (role && !roles.includes(role)) {
|
|
13
|
-
return acc;
|
|
14
|
-
}
|
|
10
|
+
return user?.tenants?.reduce((acc, { tenant })=>{
|
|
15
11
|
if (tenant) {
|
|
16
12
|
acc.push(extractID(tenant));
|
|
17
13
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utilities/getUserTenantIDs.ts"],"sourcesContent":["import type { Tenant, UserWithTenantsField } from '../types.js'\n\nimport { extractID } from './extractID.js'\n\n/**\n * Returns array of all tenant IDs assigned to a user\n *\n * @param user - User object with tenants field\n
|
|
1
|
+
{"version":3,"sources":["../../src/utilities/getUserTenantIDs.ts"],"sourcesContent":["import type { Tenant, UserWithTenantsField } from '../types.js'\n\nimport { extractID } from './extractID.js'\n\n/**\n * Returns array of all tenant IDs assigned to a user\n *\n * @param user - User object with tenants field\n */\nexport const getUserTenantIDs = <IDType extends number | string>(\n user: null | UserWithTenantsField,\n): IDType[] => {\n if (!user) {\n return []\n }\n\n return (\n user?.tenants?.reduce<IDType[]>((acc, { tenant }) => {\n if (tenant) {\n acc.push(extractID<IDType>(tenant as Tenant<IDType>))\n }\n\n return acc\n }, []) || []\n )\n}\n"],"names":["extractID","getUserTenantIDs","user","tenants","reduce","acc","tenant","push"],"mappings":"AAEA,SAASA,SAAS,QAAQ,iBAAgB;AAE1C;;;;CAIC,GACD,OAAO,MAAMC,mBAAmB,CAC9BC;IAEA,IAAI,CAACA,MAAM;QACT,OAAO,EAAE;IACX;IAEA,OACEA,MAAMC,SAASC,OAAiB,CAACC,KAAK,EAAEC,MAAM,EAAE;QAC9C,IAAIA,QAAQ;YACVD,IAAIE,IAAI,CAACP,UAAkBM;QAC7B;QAEA,OAAOD;IACT,GAAG,EAAE,KAAK,EAAE;AAEhB,EAAC"}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import type { Access, AccessArgs, AccessResult } from 'payload';
|
|
2
2
|
import type { MultiTenantPluginConfig } from '../types.js';
|
|
3
|
-
type Args = {
|
|
3
|
+
type Args<ConfigType> = {
|
|
4
4
|
accessFunction?: Access;
|
|
5
|
-
|
|
5
|
+
fieldName: string;
|
|
6
|
+
userHasAccessToAllTenants: Required<MultiTenantPluginConfig<ConfigType>>['userHasAccessToAllTenants'];
|
|
6
7
|
};
|
|
7
|
-
export declare const withTenantAccess: ({ accessFunction, userHasAccessToAllTenants }: Args) => (args: AccessArgs) => Promise<AccessResult>;
|
|
8
|
+
export declare const withTenantAccess: <ConfigType>({ accessFunction, fieldName, userHasAccessToAllTenants }: Args<ConfigType>) => (args: AccessArgs) => Promise<AccessResult>;
|
|
8
9
|
export {};
|
|
9
10
|
//# sourceMappingURL=withTenantAccess.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"withTenantAccess.d.ts","sourceRoot":"","sources":["../../src/utilities/withTenantAccess.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,YAAY,
|
|
1
|
+
{"version":3,"file":"withTenantAccess.d.ts","sourceRoot":"","sources":["../../src/utilities/withTenantAccess.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,YAAY,EAAQ,MAAM,SAAS,CAAA;AAErE,OAAO,KAAK,EAAE,uBAAuB,EAAwB,MAAM,aAAa,CAAA;AAKhF,KAAK,IAAI,CAAC,UAAU,IAAI;IACtB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,SAAS,EAAE,MAAM,CAAA;IACjB,yBAAyB,EAAE,QAAQ,CACjC,uBAAuB,CAAC,UAAU,CAAC,CACpC,CAAC,2BAA2B,CAAC,CAAA;CAC/B,CAAA;AACD,eAAO,MAAM,gBAAgB,GAC1B,UAAU,4DAA4D,IAAI,CAAC,UAAU,CAAC,YAC1E,UAAU,KAAG,OAAO,CAAC,YAAY,CA8B7C,CAAA"}
|
|
@@ -1,24 +1,20 @@
|
|
|
1
1
|
import { combineWhereConstraints } from './combineWhereConstraints.js';
|
|
2
2
|
import { getTenantAccess } from './getTenantAccess.js';
|
|
3
|
-
export const withTenantAccess = ({ accessFunction, userHasAccessToAllTenants })=>async (args)=>{
|
|
4
|
-
let accessResult;
|
|
3
|
+
export const withTenantAccess = ({ accessFunction, fieldName, userHasAccessToAllTenants })=>async (args)=>{
|
|
5
4
|
const constraints = [];
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
}
|
|
5
|
+
const accessFn = typeof accessFunction === 'function' ? accessFunction : ({ req })=>Boolean(req.user);
|
|
6
|
+
const accessResult = await accessFn(args);
|
|
7
|
+
if (accessResult === false) {
|
|
8
|
+
return false;
|
|
9
|
+
} else if (accessResult && typeof accessResult === 'object') {
|
|
10
|
+
constraints.push(accessResult);
|
|
13
11
|
}
|
|
14
|
-
if (!userHasAccessToAllTenants(args.req.user)) {
|
|
15
|
-
|
|
12
|
+
if (args.req.user && !userHasAccessToAllTenants(args.req.user)) {
|
|
13
|
+
constraints.push(getTenantAccess({
|
|
14
|
+
fieldName,
|
|
16
15
|
user: args.req.user
|
|
17
|
-
});
|
|
18
|
-
|
|
19
|
-
constraints.push(tenantConstraint);
|
|
20
|
-
return combineWhereConstraints(constraints);
|
|
21
|
-
}
|
|
16
|
+
}));
|
|
17
|
+
return combineWhereConstraints(constraints);
|
|
22
18
|
}
|
|
23
19
|
return accessResult;
|
|
24
20
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utilities/withTenantAccess.ts"],"sourcesContent":["import type { Access, AccessArgs, AccessResult } from 'payload'\n\nimport type { MultiTenantPluginConfig } from '../types.js'\n\nimport { combineWhereConstraints } from './combineWhereConstraints.js'\nimport { getTenantAccess } from './getTenantAccess.js'\n\ntype Args = {\n accessFunction?: Access\n userHasAccessToAllTenants: MultiTenantPluginConfig['userHasAccessToAllTenants']\n}\nexport const withTenantAccess =\n ({ accessFunction, userHasAccessToAllTenants }: Args) =>\n async (args: AccessArgs): Promise<AccessResult> => {\n
|
|
1
|
+
{"version":3,"sources":["../../src/utilities/withTenantAccess.ts"],"sourcesContent":["import type { Access, AccessArgs, AccessResult, User } from 'payload'\n\nimport type { MultiTenantPluginConfig, UserWithTenantsField } from '../types.js'\n\nimport { combineWhereConstraints } from './combineWhereConstraints.js'\nimport { getTenantAccess } from './getTenantAccess.js'\n\ntype Args<ConfigType> = {\n accessFunction?: Access\n fieldName: string\n userHasAccessToAllTenants: Required<\n MultiTenantPluginConfig<ConfigType>\n >['userHasAccessToAllTenants']\n}\nexport const withTenantAccess =\n <ConfigType>({ accessFunction, fieldName, userHasAccessToAllTenants }: Args<ConfigType>) =>\n async (args: AccessArgs): Promise<AccessResult> => {\n const constraints = []\n const accessFn =\n typeof accessFunction === 'function'\n ? accessFunction\n : ({ req }: AccessArgs): AccessResult => Boolean(req.user)\n const accessResult: AccessResult = await accessFn(args)\n\n if (accessResult === false) {\n return false\n } else if (accessResult && typeof accessResult === 'object') {\n constraints.push(accessResult)\n }\n\n if (\n args.req.user &&\n !userHasAccessToAllTenants(\n args.req.user as ConfigType extends { user: User } ? ConfigType['user'] : User,\n )\n ) {\n constraints.push(\n getTenantAccess({\n fieldName,\n user: args.req.user as UserWithTenantsField,\n }),\n )\n return combineWhereConstraints(constraints)\n }\n\n return accessResult\n }\n"],"names":["combineWhereConstraints","getTenantAccess","withTenantAccess","accessFunction","fieldName","userHasAccessToAllTenants","args","constraints","accessFn","req","Boolean","user","accessResult","push"],"mappings":"AAIA,SAASA,uBAAuB,QAAQ,+BAA8B;AACtE,SAASC,eAAe,QAAQ,uBAAsB;AAStD,OAAO,MAAMC,mBACX,CAAa,EAAEC,cAAc,EAAEC,SAAS,EAAEC,yBAAyB,EAAoB,GACvF,OAAOC;QACL,MAAMC,cAAc,EAAE;QACtB,MAAMC,WACJ,OAAOL,mBAAmB,aACtBA,iBACA,CAAC,EAAEM,GAAG,EAAc,GAAmBC,QAAQD,IAAIE,IAAI;QAC7D,MAAMC,eAA6B,MAAMJ,SAASF;QAElD,IAAIM,iBAAiB,OAAO;YAC1B,OAAO;QACT,OAAO,IAAIA,gBAAgB,OAAOA,iBAAiB,UAAU;YAC3DL,YAAYM,IAAI,CAACD;QACnB;QAEA,IACEN,KAAKG,GAAG,CAACE,IAAI,IACb,CAACN,0BACCC,KAAKG,GAAG,CAACE,IAAI,GAEf;YACAJ,YAAYM,IAAI,CACdZ,gBAAgB;gBACdG;gBACAO,MAAML,KAAKG,GAAG,CAACE,IAAI;YACrB;YAEF,OAAOX,wBAAwBO;QACjC;QAEA,OAAOK;IACT,EAAC"}
|
|
@@ -23,7 +23,7 @@ import { getTenantListFilter } from './getTenantListFilter.js';
|
|
|
23
23
|
and: []
|
|
24
24
|
};
|
|
25
25
|
filterConstraints.forEach((constraint)=>{
|
|
26
|
-
if (typeof constraint === 'object') {
|
|
26
|
+
if (combinedWhere.and && constraint && typeof constraint === 'object') {
|
|
27
27
|
combinedWhere.and.push(constraint);
|
|
28
28
|
}
|
|
29
29
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utilities/withTenantListFilter.ts"],"sourcesContent":["import type { BaseListFilter, Where } from 'payload'\n\nimport { getTenantListFilter } from './getTenantListFilter.js'\n\ntype Args = {\n baseListFilter?: BaseListFilter\n tenantFieldName: string\n}\n/**\n * Combines a base list filter with a tenant list filter\n *\n * Combines where constraints inside of an AND operator\n */\nexport const withTenantListFilter =\n ({ baseListFilter, tenantFieldName }: Args): BaseListFilter =>\n async (args) => {\n const filterConstraints = []\n\n if (typeof baseListFilter === 'function') {\n const baseListFilterResult = await baseListFilter(args)\n\n if (baseListFilterResult) {\n filterConstraints.push(baseListFilterResult)\n }\n }\n\n const tenantListFilter = getTenantListFilter({\n req: args.req,\n tenantFieldName,\n })\n\n if (tenantListFilter) {\n filterConstraints.push(tenantListFilter)\n }\n\n if (filterConstraints.length) {\n const combinedWhere: Where = { and: [] }\n filterConstraints.forEach((constraint) => {\n if (typeof constraint === 'object') {\n combinedWhere.and.push(constraint)\n }\n })\n return combinedWhere\n }\n\n // Access control will take it from here\n return null\n }\n"],"names":["getTenantListFilter","withTenantListFilter","baseListFilter","tenantFieldName","args","filterConstraints","baseListFilterResult","push","tenantListFilter","req","length","combinedWhere","and","forEach","constraint"],"mappings":"AAEA,SAASA,mBAAmB,QAAQ,2BAA0B;AAM9D;;;;CAIC,GACD,OAAO,MAAMC,uBACX,CAAC,EAAEC,cAAc,EAAEC,eAAe,EAAQ,GAC1C,OAAOC;QACL,MAAMC,oBAAoB,EAAE;QAE5B,IAAI,OAAOH,mBAAmB,YAAY;YACxC,MAAMI,uBAAuB,MAAMJ,eAAeE;YAElD,IAAIE,sBAAsB;gBACxBD,kBAAkBE,IAAI,CAACD;YACzB;QACF;QAEA,MAAME,mBAAmBR,oBAAoB;YAC3CS,KAAKL,KAAKK,GAAG;YACbN;QACF;QAEA,IAAIK,kBAAkB;YACpBH,kBAAkBE,IAAI,CAACC;QACzB;QAEA,IAAIH,kBAAkBK,MAAM,EAAE;YAC5B,MAAMC,gBAAuB;gBAAEC,KAAK,EAAE;YAAC;YACvCP,kBAAkBQ,OAAO,CAAC,CAACC;gBACzB,
|
|
1
|
+
{"version":3,"sources":["../../src/utilities/withTenantListFilter.ts"],"sourcesContent":["import type { BaseListFilter, Where } from 'payload'\n\nimport { getTenantListFilter } from './getTenantListFilter.js'\n\ntype Args = {\n baseListFilter?: BaseListFilter\n tenantFieldName: string\n}\n/**\n * Combines a base list filter with a tenant list filter\n *\n * Combines where constraints inside of an AND operator\n */\nexport const withTenantListFilter =\n ({ baseListFilter, tenantFieldName }: Args): BaseListFilter =>\n async (args) => {\n const filterConstraints = []\n\n if (typeof baseListFilter === 'function') {\n const baseListFilterResult = await baseListFilter(args)\n\n if (baseListFilterResult) {\n filterConstraints.push(baseListFilterResult)\n }\n }\n\n const tenantListFilter = getTenantListFilter({\n req: args.req,\n tenantFieldName,\n })\n\n if (tenantListFilter) {\n filterConstraints.push(tenantListFilter)\n }\n\n if (filterConstraints.length) {\n const combinedWhere: Where = { and: [] }\n filterConstraints.forEach((constraint) => {\n if (combinedWhere.and && constraint && typeof constraint === 'object') {\n combinedWhere.and.push(constraint)\n }\n })\n return combinedWhere\n }\n\n // Access control will take it from here\n return null\n }\n"],"names":["getTenantListFilter","withTenantListFilter","baseListFilter","tenantFieldName","args","filterConstraints","baseListFilterResult","push","tenantListFilter","req","length","combinedWhere","and","forEach","constraint"],"mappings":"AAEA,SAASA,mBAAmB,QAAQ,2BAA0B;AAM9D;;;;CAIC,GACD,OAAO,MAAMC,uBACX,CAAC,EAAEC,cAAc,EAAEC,eAAe,EAAQ,GAC1C,OAAOC;QACL,MAAMC,oBAAoB,EAAE;QAE5B,IAAI,OAAOH,mBAAmB,YAAY;YACxC,MAAMI,uBAAuB,MAAMJ,eAAeE;YAElD,IAAIE,sBAAsB;gBACxBD,kBAAkBE,IAAI,CAACD;YACzB;QACF;QAEA,MAAME,mBAAmBR,oBAAoB;YAC3CS,KAAKL,KAAKK,GAAG;YACbN;QACF;QAEA,IAAIK,kBAAkB;YACpBH,kBAAkBE,IAAI,CAACC;QACzB;QAEA,IAAIH,kBAAkBK,MAAM,EAAE;YAC5B,MAAMC,gBAAuB;gBAAEC,KAAK,EAAE;YAAC;YACvCP,kBAAkBQ,OAAO,CAAC,CAACC;gBACzB,IAAIH,cAAcC,GAAG,IAAIE,cAAc,OAAOA,eAAe,UAAU;oBACrEH,cAAcC,GAAG,CAACL,IAAI,CAACO;gBACzB;YACF;YACA,OAAOH;QACT;QAEA,wCAAwC;QACxC,OAAO;IACT,EAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@payloadcms/plugin-multi-tenant",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "3.18.0",
|
|
4
4
|
"description": "Multi Tenant plugin for Payload",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"payload",
|
|
@@ -32,6 +32,11 @@
|
|
|
32
32
|
"types": "./dist/index.d.ts",
|
|
33
33
|
"default": "./dist/index.js"
|
|
34
34
|
},
|
|
35
|
+
"./fields": {
|
|
36
|
+
"import": "./dist/exports/fields.js",
|
|
37
|
+
"types": "./dist/exports/fields.d.ts",
|
|
38
|
+
"default": "./dist/exports/fields.js"
|
|
39
|
+
},
|
|
35
40
|
"./types": {
|
|
36
41
|
"import": "./dist/exports/types.js",
|
|
37
42
|
"types": "./dist/exports/types.d.ts",
|
|
@@ -42,10 +47,15 @@
|
|
|
42
47
|
"types": "./dist/exports/rsc.d.ts",
|
|
43
48
|
"default": "./dist/exports/rsc.js"
|
|
44
49
|
},
|
|
45
|
-
"./
|
|
46
|
-
"import": "./dist/exports/
|
|
47
|
-
"types": "./dist/exports/
|
|
48
|
-
"default": "./dist/exports/
|
|
50
|
+
"./client": {
|
|
51
|
+
"import": "./dist/exports/client.js",
|
|
52
|
+
"types": "./dist/exports/client.d.ts",
|
|
53
|
+
"default": "./dist/exports/client.js"
|
|
54
|
+
},
|
|
55
|
+
"./utilities": {
|
|
56
|
+
"import": "./dist/exports/utilities.js",
|
|
57
|
+
"types": "./dist/exports/utilities.d.ts",
|
|
58
|
+
"default": "./dist/exports/utilities.js"
|
|
49
59
|
}
|
|
50
60
|
},
|
|
51
61
|
"main": "./dist/index.js",
|
|
@@ -56,14 +66,14 @@
|
|
|
56
66
|
"types.d.ts"
|
|
57
67
|
],
|
|
58
68
|
"devDependencies": {
|
|
59
|
-
"@payloadcms/
|
|
60
|
-
"
|
|
61
|
-
"
|
|
69
|
+
"@payloadcms/eslint-config": "3.9.0",
|
|
70
|
+
"@payloadcms/ui": "3.18.0",
|
|
71
|
+
"payload": "3.18.0"
|
|
62
72
|
},
|
|
63
73
|
"peerDependencies": {
|
|
64
74
|
"next": "^15.0.3",
|
|
65
|
-
"@payloadcms/ui": "3.
|
|
66
|
-
"payload": "3.
|
|
75
|
+
"@payloadcms/ui": "3.18.0",
|
|
76
|
+
"payload": "3.18.0"
|
|
67
77
|
},
|
|
68
78
|
"homepage:": "https://payloadcms.com",
|
|
69
79
|
"scripts": {
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/TenantField/index.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,OAAO,CAAA;AAazB,eAAO,MAAM,WAAW,EAAE,KAAK,CAAC,EAwC/B,CAAA"}
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
-
import React from 'react';
|
|
3
|
-
import { getTenantFromCookie } from '../../utilities/getTenantFromCookie.js';
|
|
4
|
-
import { getUserTenantIDs } from '../../utilities/getUserTenantIDs.js';
|
|
5
|
-
import { TenantFieldClient } from './index.client.js';
|
|
6
|
-
export const TenantField = async ({ clientField, debug, path, payload, readOnly, req, tenantsCollectionSlug, user })=>{
|
|
7
|
-
let serverValue = getTenantFromCookie(req.headers, payload.db.defaultIDType) || getUserTenantIDs(user)?.[0];
|
|
8
|
-
if (serverValue) {
|
|
9
|
-
try {
|
|
10
|
-
// validate that the tenant exists
|
|
11
|
-
const doc = await payload.findByID({
|
|
12
|
-
id: serverValue,
|
|
13
|
-
collection: tenantsCollectionSlug,
|
|
14
|
-
depth: 0
|
|
15
|
-
});
|
|
16
|
-
if (!doc) {
|
|
17
|
-
serverValue = undefined;
|
|
18
|
-
}
|
|
19
|
-
} catch (_) {
|
|
20
|
-
serverValue = undefined;
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
return /*#__PURE__*/ _jsx(TenantFieldClient, {
|
|
24
|
-
debug: debug,
|
|
25
|
-
field: clientField,
|
|
26
|
-
path: path,
|
|
27
|
-
readOnly: readOnly,
|
|
28
|
-
serverValue: serverValue,
|
|
29
|
-
tenantsCollectionSlug: tenantsCollectionSlug
|
|
30
|
-
});
|
|
31
|
-
};
|
|
32
|
-
|
|
33
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/TenantField/index.tsx"],"sourcesContent":["import type { RelationshipFieldServerProps } from 'payload'\n\nimport React from 'react'\n\nimport type { UserWithTenantsField } from '../../types.js'\n\nimport { getTenantFromCookie } from '../../utilities/getTenantFromCookie.js'\nimport { getUserTenantIDs } from '../../utilities/getUserTenantIDs.js'\nimport { TenantFieldClient } from './index.client.js'\n\ntype Props = {\n debug?: boolean\n tenantsCollectionSlug: string\n} & RelationshipFieldServerProps\n\nexport const TenantField: React.FC = async ({\n clientField,\n debug,\n path,\n payload,\n readOnly,\n req,\n tenantsCollectionSlug,\n user,\n}: Props) => {\n let serverValue: number | string | undefined =\n getTenantFromCookie(req.headers, payload.db.defaultIDType) ||\n getUserTenantIDs(user as UserWithTenantsField)?.[0]\n\n if (serverValue) {\n try {\n // validate that the tenant exists\n const doc = await payload.findByID({\n id: serverValue,\n collection: tenantsCollectionSlug,\n depth: 0,\n })\n if (!doc) {\n serverValue = undefined\n }\n } catch (_) {\n serverValue = undefined\n }\n }\n\n return (\n <TenantFieldClient\n debug={debug}\n field={clientField}\n path={path}\n readOnly={readOnly}\n serverValue={serverValue}\n tenantsCollectionSlug={tenantsCollectionSlug}\n />\n )\n}\n"],"names":["React","getTenantFromCookie","getUserTenantIDs","TenantFieldClient","TenantField","clientField","debug","path","payload","readOnly","req","tenantsCollectionSlug","user","serverValue","headers","db","defaultIDType","doc","findByID","id","collection","depth","undefined","_","field"],"mappings":";AAEA,OAAOA,WAAW,QAAO;AAIzB,SAASC,mBAAmB,QAAQ,yCAAwC;AAC5E,SAASC,gBAAgB,QAAQ,sCAAqC;AACtE,SAASC,iBAAiB,QAAQ,oBAAmB;AAOrD,OAAO,MAAMC,cAAwB,OAAO,EAC1CC,WAAW,EACXC,KAAK,EACLC,IAAI,EACJC,OAAO,EACPC,QAAQ,EACRC,GAAG,EACHC,qBAAqB,EACrBC,IAAI,EACE;IACN,IAAIC,cACFZ,oBAAoBS,IAAII,OAAO,EAAEN,QAAQO,EAAE,CAACC,aAAa,KACzDd,iBAAiBU,OAA+B,CAAC,EAAE;IAErD,IAAIC,aAAa;QACf,IAAI;YACF,kCAAkC;YAClC,MAAMI,MAAM,MAAMT,QAAQU,QAAQ,CAAC;gBACjCC,IAAIN;gBACJO,YAAYT;gBACZU,OAAO;YACT;YACA,IAAI,CAACJ,KAAK;gBACRJ,cAAcS;YAChB;QACF,EAAE,OAAOC,GAAG;YACVV,cAAcS;QAChB;IACF;IAEA,qBACE,KAACnB;QACCG,OAAOA;QACPkB,OAAOnB;QACPE,MAAMA;QACNE,UAAUA;QACVI,aAAaA;QACbF,uBAAuBA;;AAG7B,EAAC"}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
import './index.scss';
|
|
3
|
-
export declare const TenantSelectorClient: ({ cookieToSet, initialValue, options, }: {
|
|
4
|
-
cookieToSet?: string;
|
|
5
|
-
initialValue?: string;
|
|
6
|
-
options: {
|
|
7
|
-
label: string;
|
|
8
|
-
value: string;
|
|
9
|
-
}[];
|
|
10
|
-
}) => React.JSX.Element;
|
|
11
|
-
//# sourceMappingURL=index.client.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.client.d.ts","sourceRoot":"","sources":["../../../src/components/TenantSelector/index.client.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,cAAc,CAAA;AAMrB,eAAO,MAAM,oBAAoB,4CAI9B;IACD,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,OAAO,EAAE;QACP,KAAK,EAAE,MAAM,CAAA;QACb,KAAK,EAAE,MAAM,CAAA;KACd,EAAE,CAAA;CACJ,sBAsDA,CAAA"}
|
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
'use client';
|
|
2
|
-
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
-
import { SelectInput } from '@payloadcms/ui';
|
|
4
|
-
import { useRouter } from 'next/navigation.js';
|
|
5
|
-
import React from 'react';
|
|
6
|
-
import './index.scss';
|
|
7
|
-
function findValue(options, value) {
|
|
8
|
-
return options.find((opt)=>opt.value === value)?.value;
|
|
9
|
-
}
|
|
10
|
-
export const TenantSelectorClient = ({ cookieToSet, initialValue, options })=>{
|
|
11
|
-
const [value, setValue] = React.useState(()=>{
|
|
12
|
-
if (initialValue) {
|
|
13
|
-
return findValue(options, initialValue);
|
|
14
|
-
}
|
|
15
|
-
});
|
|
16
|
-
const router = useRouter();
|
|
17
|
-
const setCookieAndReload = React.useCallback((value)=>{
|
|
18
|
-
const expires = '; expires=Fri, 31 Dec 9999 23:59:59 GMT';
|
|
19
|
-
document.cookie = 'payload-tenant=' + (value || '') + expires + '; path=/';
|
|
20
|
-
setValue(value);
|
|
21
|
-
router.refresh();
|
|
22
|
-
}, [
|
|
23
|
-
router
|
|
24
|
-
]);
|
|
25
|
-
const handleChange = React.useCallback((option)=>{
|
|
26
|
-
if (!option) {
|
|
27
|
-
setCookieAndReload(undefined);
|
|
28
|
-
} else if ('value' in option) {
|
|
29
|
-
setCookieAndReload(option.value);
|
|
30
|
-
}
|
|
31
|
-
}, [
|
|
32
|
-
setCookieAndReload
|
|
33
|
-
]);
|
|
34
|
-
React.useEffect(()=>{
|
|
35
|
-
if (cookieToSet) {
|
|
36
|
-
setCookieAndReload(findValue(options, cookieToSet));
|
|
37
|
-
}
|
|
38
|
-
}, [
|
|
39
|
-
cookieToSet,
|
|
40
|
-
options,
|
|
41
|
-
setCookieAndReload
|
|
42
|
-
]);
|
|
43
|
-
if (options.length <= 1) {
|
|
44
|
-
return null;
|
|
45
|
-
}
|
|
46
|
-
return /*#__PURE__*/ _jsx("div", {
|
|
47
|
-
className: "tenant-selector",
|
|
48
|
-
children: /*#__PURE__*/ _jsx(SelectInput, {
|
|
49
|
-
isClearable: false,
|
|
50
|
-
label: "Select a tenant",
|
|
51
|
-
name: "setTenant",
|
|
52
|
-
onChange: handleChange,
|
|
53
|
-
options: options,
|
|
54
|
-
path: "setTenant",
|
|
55
|
-
readOnly: !value,
|
|
56
|
-
value: value
|
|
57
|
-
})
|
|
58
|
-
});
|
|
59
|
-
};
|
|
60
|
-
|
|
61
|
-
//# sourceMappingURL=index.client.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/TenantSelector/index.client.tsx"],"sourcesContent":["'use client'\nimport type { ReactSelectOption } from '@payloadcms/ui'\n\nimport { SelectInput } from '@payloadcms/ui'\nimport { useRouter } from 'next/navigation.js'\nimport React from 'react'\n\nimport './index.scss'\n\nfunction findValue(options: { label: string; value: string }[], value?: string) {\n return options.find((opt) => opt.value === value)?.value\n}\n\nexport const TenantSelectorClient = ({\n cookieToSet,\n initialValue,\n options,\n}: {\n cookieToSet?: string\n initialValue?: string\n options: {\n label: string\n value: string\n }[]\n}) => {\n const [value, setValue] = React.useState<string | undefined>(() => {\n if (initialValue) {\n return findValue(options, initialValue)\n }\n })\n\n const router = useRouter()\n\n const setCookieAndReload = React.useCallback(\n (value?: string) => {\n const expires = '; expires=Fri, 31 Dec 9999 23:59:59 GMT'\n document.cookie = 'payload-tenant=' + (value || '') + expires + '; path=/'\n setValue(value)\n router.refresh()\n },\n [router],\n )\n\n const handleChange = React.useCallback(\n (option: ReactSelectOption | ReactSelectOption[]) => {\n if (!option) {\n setCookieAndReload(undefined)\n } else if ('value' in option) {\n setCookieAndReload(option.value as string)\n }\n },\n [setCookieAndReload],\n )\n\n React.useEffect(() => {\n if (cookieToSet) {\n setCookieAndReload(findValue(options, cookieToSet))\n }\n }, [cookieToSet, options, setCookieAndReload])\n\n if (options.length <= 1) {\n return null\n }\n\n return (\n <div className=\"tenant-selector\">\n <SelectInput\n isClearable={false}\n label=\"Select a tenant\"\n name=\"setTenant\"\n onChange={handleChange}\n options={options}\n path=\"setTenant\"\n readOnly={!value}\n value={value}\n />\n </div>\n )\n}\n"],"names":["SelectInput","useRouter","React","findValue","options","value","find","opt","TenantSelectorClient","cookieToSet","initialValue","setValue","useState","router","setCookieAndReload","useCallback","expires","document","cookie","refresh","handleChange","option","undefined","useEffect","length","div","className","isClearable","label","name","onChange","path","readOnly"],"mappings":"AAAA;;AAGA,SAASA,WAAW,QAAQ,iBAAgB;AAC5C,SAASC,SAAS,QAAQ,qBAAoB;AAC9C,OAAOC,WAAW,QAAO;AAEzB,OAAO,eAAc;AAErB,SAASC,UAAUC,OAA2C,EAAEC,KAAc;IAC5E,OAAOD,QAAQE,IAAI,CAAC,CAACC,MAAQA,IAAIF,KAAK,KAAKA,QAAQA;AACrD;AAEA,OAAO,MAAMG,uBAAuB,CAAC,EACnCC,WAAW,EACXC,YAAY,EACZN,OAAO,EAQR;IACC,MAAM,CAACC,OAAOM,SAAS,GAAGT,MAAMU,QAAQ,CAAqB;QAC3D,IAAIF,cAAc;YAChB,OAAOP,UAAUC,SAASM;QAC5B;IACF;IAEA,MAAMG,SAASZ;IAEf,MAAMa,qBAAqBZ,MAAMa,WAAW,CAC1C,CAACV;QACC,MAAMW,UAAU;QAChBC,SAASC,MAAM,GAAG,oBAAqBb,CAAAA,SAAS,EAAC,IAAKW,UAAU;QAChEL,SAASN;QACTQ,OAAOM,OAAO;IAChB,GACA;QAACN;KAAO;IAGV,MAAMO,eAAelB,MAAMa,WAAW,CACpC,CAACM;QACC,IAAI,CAACA,QAAQ;YACXP,mBAAmBQ;QACrB,OAAO,IAAI,WAAWD,QAAQ;YAC5BP,mBAAmBO,OAAOhB,KAAK;QACjC;IACF,GACA;QAACS;KAAmB;IAGtBZ,MAAMqB,SAAS,CAAC;QACd,IAAId,aAAa;YACfK,mBAAmBX,UAAUC,SAASK;QACxC;IACF,GAAG;QAACA;QAAaL;QAASU;KAAmB;IAE7C,IAAIV,QAAQoB,MAAM,IAAI,GAAG;QACvB,OAAO;IACT;IAEA,qBACE,KAACC;QAAIC,WAAU;kBACb,cAAA,KAAC1B;YACC2B,aAAa;YACbC,OAAM;YACNC,MAAK;YACLC,UAAUV;YACVhB,SAASA;YACT2B,MAAK;YACLC,UAAU,CAAC3B;YACXA,OAAOA;;;AAIf,EAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/fields/userTenantsArrayField/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAEzC,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAA;AAE7D,eAAO,MAAM,gBAAgB,SACrB,uBAAuB,CAAC,kBAAkB,CAAC,KAChD,UAiBD,CAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/fields/userTenantsArrayField/index.ts"],"sourcesContent":["import type { ArrayField } from 'payload'\n\nimport type { MultiTenantPluginConfig } from '../../types.js'\n\nexport const userTenantsField = (\n args: MultiTenantPluginConfig['userTenantsField'],\n): ArrayField => ({\n name: 'tenants',\n type: 'array',\n access: args?.access,\n fields: [\n {\n name: 'tenant',\n type: 'relationship',\n access: args.access,\n index: true,\n relationTo: 'tenants',\n required: true,\n saveToJWT: true,\n },\n ...(args?.rowFields || []),\n ],\n saveToJWT: true,\n})\n"],"names":["userTenantsField","args","name","type","access","fields","index","relationTo","required","saveToJWT","rowFields"],"mappings":"AAIA,OAAO,MAAMA,mBAAmB,CAC9BC,OACgB,CAAA;QAChBC,MAAM;QACNC,MAAM;QACNC,QAAQH,MAAMG;QACdC,QAAQ;YACN;gBACEH,MAAM;gBACNC,MAAM;gBACNC,QAAQH,KAAKG,MAAM;gBACnBE,OAAO;gBACPC,YAAY;gBACZC,UAAU;gBACVC,WAAW;YACb;eACIR,MAAMS,aAAa,EAAE;SAC1B;QACDD,WAAW;IACb,CAAA,EAAE"}
|