@payloadcms/plugin-multi-tenant 4.0.0-internal.cea8867 → 4.0.0-internal.d21c039
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/AssignTenantFieldModal/index.client.d.ts +2 -2
- package/dist/components/AssignTenantFieldModal/index.client.d.ts.map +1 -1
- package/dist/components/AssignTenantFieldModal/index.client.js.map +1 -1
- package/dist/components/TenantField/index.client.d.ts.map +1 -1
- package/dist/components/TenantField/index.client.js +84 -74
- package/dist/components/TenantField/index.client.js.map +1 -1
- package/dist/fields/tenantField/index.d.ts +4 -2
- package/dist/fields/tenantField/index.d.ts.map +1 -1
- package/dist/fields/tenantField/index.js +36 -9
- package/dist/fields/tenantField/index.js.map +1 -1
- package/dist/hooks/enforceTenantMembership.d.ts +15 -0
- package/dist/hooks/enforceTenantMembership.d.ts.map +1 -0
- package/dist/hooks/enforceTenantMembership.js +39 -0
- package/dist/hooks/enforceTenantMembership.js.map +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +26 -4
- package/dist/index.js.map +1 -1
- package/dist/providers/TenantSelectionProvider/index.client.d.ts.map +1 -1
- package/dist/providers/TenantSelectionProvider/index.client.js +22 -24
- package/dist/providers/TenantSelectionProvider/index.client.js.map +1 -1
- package/dist/types.d.ts +1 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/utilities/addCollectionAccess.d.ts +6 -8
- package/dist/utilities/addCollectionAccess.d.ts.map +1 -1
- package/dist/utilities/addCollectionAccess.js +91 -20
- package/dist/utilities/addCollectionAccess.js.map +1 -1
- package/dist/utilities/getTenantIDsFromValue.d.ts +2 -0
- package/dist/utilities/getTenantIDsFromValue.d.ts.map +1 -0
- package/dist/utilities/getTenantIDsFromValue.js +14 -0
- package/dist/utilities/getTenantIDsFromValue.js.map +1 -0
- package/dist/utilities/getUserTenantIDs.d.ts.map +1 -1
- package/dist/utilities/getUserTenantIDs.js +3 -2
- package/dist/utilities/getUserTenantIDs.js.map +1 -1
- package/dist/utilities/isValidTenantAssignment.d.ts +13 -0
- package/dist/utilities/isValidTenantAssignment.d.ts.map +1 -0
- package/dist/utilities/isValidTenantAssignment.js +28 -0
- package/dist/utilities/isValidTenantAssignment.js.map +1 -0
- package/dist/utilities/shouldRefreshTenantSelection.d.ts +5 -0
- package/dist/utilities/shouldRefreshTenantSelection.d.ts.map +1 -0
- package/dist/utilities/shouldRefreshTenantSelection.js +3 -0
- package/dist/utilities/shouldRefreshTenantSelection.js.map +1 -0
- package/package.json +7 -8
- package/dist/utilities/combineWhereConstraints.d.ts +0 -3
- package/dist/utilities/combineWhereConstraints.d.ts.map +0 -1
- package/dist/utilities/combineWhereConstraints.js +0 -19
- package/dist/utilities/combineWhereConstraints.js.map +0 -1
- package/dist/utilities/withTenantAccess.d.ts +0 -16
- package/dist/utilities/withTenantAccess.d.ts.map +0 -1
- package/dist/utilities/withTenantAccess.js +0 -76
- package/dist/utilities/withTenantAccess.js.map +0 -1
|
@@ -2,8 +2,8 @@ import React from 'react';
|
|
|
2
2
|
export declare const assignTenantModalSlug = "assign-tenant-field-modal";
|
|
3
3
|
export declare const AssignTenantFieldTrigger: React.FC;
|
|
4
4
|
export declare const AssignTenantFieldModal: React.FC<{
|
|
5
|
-
afterModalClose
|
|
6
|
-
afterModalOpen
|
|
5
|
+
afterModalClose?: () => void;
|
|
6
|
+
afterModalOpen?: () => void;
|
|
7
7
|
children: React.ReactNode;
|
|
8
8
|
onCancel?: () => void;
|
|
9
9
|
onConfirm?: () => void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.client.d.ts","sourceRoot":"","sources":["../../../src/components/AssignTenantFieldModal/index.client.tsx"],"names":[],"mappings":"AAoBA,OAAO,KAAK,MAAM,OAAO,CAAA;AASzB,eAAO,MAAM,qBAAqB,8BAA8B,CAAA;AAEhE,eAAO,MAAM,wBAAwB,EAAE,KAAK,CAAC,EAc5C,CAAA;AAED,eAAO,MAAM,sBAAsB,EAAE,KAAK,CAAC,EAAE,CAAC;IAC5C,eAAe,EAAE,MAAM,IAAI,CAAA;
|
|
1
|
+
{"version":3,"file":"index.client.d.ts","sourceRoot":"","sources":["../../../src/components/AssignTenantFieldModal/index.client.tsx"],"names":[],"mappings":"AAoBA,OAAO,KAAK,MAAM,OAAO,CAAA;AASzB,eAAO,MAAM,qBAAqB,8BAA8B,CAAA;AAEhE,eAAO,MAAM,wBAAwB,EAAE,KAAK,CAAC,EAc5C,CAAA;AAED,eAAO,MAAM,sBAAsB,EAAE,KAAK,CAAC,EAAE,CAAC;IAC5C,eAAe,CAAC,EAAE,MAAM,IAAI,CAAA;IAC5B,cAAc,CAAC,EAAE,MAAM,IAAI,CAAA;IAC3B,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;IACzB,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAA;IACrB,SAAS,CAAC,EAAE,MAAM,IAAI,CAAA;CACvB,CAuCA,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/AssignTenantFieldModal/index.client.tsx"],"sourcesContent":["'use client'\n\nimport type { ClientCollectionConfig } from 'payload'\n\nimport { getTranslation } from '@payloadcms/translations'\nimport {\n DialogBody,\n DialogCancel,\n DialogConfirm,\n DialogFooter,\n DialogHeader,\n DialogModal,\n Pill,\n PopupList,\n useConfig,\n useDocumentInfo,\n useDocumentTitle,\n useModal,\n useTranslation,\n} from '@payloadcms/ui'\nimport React from 'react'\n\nimport type {\n PluginMultiTenantTranslationKeys,\n PluginMultiTenantTranslations,\n} from '../../translations/index.js'\n\nimport { useTenantSelection } from '../../providers/TenantSelectionProvider/index.client.js'\n\nexport const assignTenantModalSlug = 'assign-tenant-field-modal'\n\nexport const AssignTenantFieldTrigger: React.FC = () => {\n const { openModal } = useModal()\n const { t } = useTranslation<PluginMultiTenantTranslations, PluginMultiTenantTranslationKeys>()\n const { options } = useTenantSelection()\n\n if (options.length <= 1) {\n return null\n }\n\n return (\n <PopupList.Button onClick={() => openModal(assignTenantModalSlug)}>\n {t('plugin-multi-tenant:assign-tenant-button-label')}\n </PopupList.Button>\n )\n}\n\nexport const AssignTenantFieldModal: React.FC<{\n afterModalClose
|
|
1
|
+
{"version":3,"sources":["../../../src/components/AssignTenantFieldModal/index.client.tsx"],"sourcesContent":["'use client'\n\nimport type { ClientCollectionConfig } from 'payload'\n\nimport { getTranslation } from '@payloadcms/translations'\nimport {\n DialogBody,\n DialogCancel,\n DialogConfirm,\n DialogFooter,\n DialogHeader,\n DialogModal,\n Pill,\n PopupList,\n useConfig,\n useDocumentInfo,\n useDocumentTitle,\n useModal,\n useTranslation,\n} from '@payloadcms/ui'\nimport React from 'react'\n\nimport type {\n PluginMultiTenantTranslationKeys,\n PluginMultiTenantTranslations,\n} from '../../translations/index.js'\n\nimport { useTenantSelection } from '../../providers/TenantSelectionProvider/index.client.js'\n\nexport const assignTenantModalSlug = 'assign-tenant-field-modal'\n\nexport const AssignTenantFieldTrigger: React.FC = () => {\n const { openModal } = useModal()\n const { t } = useTranslation<PluginMultiTenantTranslations, PluginMultiTenantTranslationKeys>()\n const { options } = useTenantSelection()\n\n if (options.length <= 1) {\n return null\n }\n\n return (\n <PopupList.Button onClick={() => openModal(assignTenantModalSlug)}>\n {t('plugin-multi-tenant:assign-tenant-button-label')}\n </PopupList.Button>\n )\n}\n\nexport const AssignTenantFieldModal: React.FC<{\n afterModalClose?: () => void\n afterModalOpen?: () => void\n children: React.ReactNode\n onCancel?: () => void\n onConfirm?: () => void\n}> = ({ afterModalClose, afterModalOpen, children, onCancel, onConfirm }) => {\n const { i18n, t } = useTranslation<\n PluginMultiTenantTranslations,\n PluginMultiTenantTranslationKeys\n >()\n const { collectionSlug } = useDocumentInfo()\n const { title } = useDocumentTitle()\n const { getEntityConfig } = useConfig()\n const collectionConfig = getEntityConfig({ collectionSlug }) as ClientCollectionConfig\n const { isModalOpen: isModalOpenFn } = useModal()\n const isModalOpen = isModalOpenFn(assignTenantModalSlug)\n const wasModalOpenRef = React.useRef<boolean>(isModalOpen)\n\n React.useEffect(() => {\n if (wasModalOpenRef.current && !isModalOpen) {\n afterModalClose?.()\n }\n if (!wasModalOpenRef.current && isModalOpen) {\n afterModalOpen?.()\n }\n wasModalOpenRef.current = isModalOpen\n }, [isModalOpen, afterModalClose, afterModalOpen])\n\n if (!collectionConfig) {\n return null\n }\n\n return (\n <DialogModal size=\"medium\" slug={assignTenantModalSlug}>\n <DialogHeader title={t('plugin-multi-tenant:assign-tenant-modal-title', { title })}>\n <Pill size=\"small\">{getTranslation(collectionConfig.labels.singular, i18n)}</Pill>\n </DialogHeader>\n <DialogBody>{children}</DialogBody>\n <DialogFooter>\n <DialogCancel onClick={onCancel} />\n <DialogConfirm onClick={() => onConfirm?.()} />\n </DialogFooter>\n </DialogModal>\n )\n}\n"],"names":["getTranslation","DialogBody","DialogCancel","DialogConfirm","DialogFooter","DialogHeader","DialogModal","Pill","PopupList","useConfig","useDocumentInfo","useDocumentTitle","useModal","useTranslation","React","useTenantSelection","assignTenantModalSlug","AssignTenantFieldTrigger","openModal","t","options","length","Button","onClick","AssignTenantFieldModal","afterModalClose","afterModalOpen","children","onCancel","onConfirm","i18n","collectionSlug","title","getEntityConfig","collectionConfig","isModalOpen","isModalOpenFn","wasModalOpenRef","useRef","useEffect","current","size","slug","labels","singular"],"mappings":"AAAA;;AAIA,SAASA,cAAc,QAAQ,2BAA0B;AACzD,SACEC,UAAU,EACVC,YAAY,EACZC,aAAa,EACbC,YAAY,EACZC,YAAY,EACZC,WAAW,EACXC,IAAI,EACJC,SAAS,EACTC,SAAS,EACTC,eAAe,EACfC,gBAAgB,EAChBC,QAAQ,EACRC,cAAc,QACT,iBAAgB;AACvB,OAAOC,WAAW,QAAO;AAOzB,SAASC,kBAAkB,QAAQ,0DAAyD;AAE5F,OAAO,MAAMC,wBAAwB,4BAA2B;AAEhE,OAAO,MAAMC,2BAAqC;IAChD,MAAM,EAAEC,SAAS,EAAE,GAAGN;IACtB,MAAM,EAAEO,CAAC,EAAE,GAAGN;IACd,MAAM,EAAEO,OAAO,EAAE,GAAGL;IAEpB,IAAIK,QAAQC,MAAM,IAAI,GAAG;QACvB,OAAO;IACT;IAEA,qBACE,KAACb,UAAUc,MAAM;QAACC,SAAS,IAAML,UAAUF;kBACxCG,EAAE;;AAGT,EAAC;AAED,OAAO,MAAMK,yBAMR,CAAC,EAAEC,eAAe,EAAEC,cAAc,EAAEC,QAAQ,EAAEC,QAAQ,EAAEC,SAAS,EAAE;IACtE,MAAM,EAAEC,IAAI,EAAEX,CAAC,EAAE,GAAGN;IAIpB,MAAM,EAAEkB,cAAc,EAAE,GAAGrB;IAC3B,MAAM,EAAEsB,KAAK,EAAE,GAAGrB;IAClB,MAAM,EAAEsB,eAAe,EAAE,GAAGxB;IAC5B,MAAMyB,mBAAmBD,gBAAgB;QAAEF;IAAe;IAC1D,MAAM,EAAEI,aAAaC,aAAa,EAAE,GAAGxB;IACvC,MAAMuB,cAAcC,cAAcpB;IAClC,MAAMqB,kBAAkBvB,MAAMwB,MAAM,CAAUH;IAE9CrB,MAAMyB,SAAS,CAAC;QACd,IAAIF,gBAAgBG,OAAO,IAAI,CAACL,aAAa;YAC3CV;QACF;QACA,IAAI,CAACY,gBAAgBG,OAAO,IAAIL,aAAa;YAC3CT;QACF;QACAW,gBAAgBG,OAAO,GAAGL;IAC5B,GAAG;QAACA;QAAaV;QAAiBC;KAAe;IAEjD,IAAI,CAACQ,kBAAkB;QACrB,OAAO;IACT;IAEA,qBACE,MAAC5B;QAAYmC,MAAK;QAASC,MAAM1B;;0BAC/B,KAACX;gBAAa2B,OAAOb,EAAE,iDAAiD;oBAAEa;gBAAM;0BAC9E,cAAA,KAACzB;oBAAKkC,MAAK;8BAASzC,eAAekC,iBAAiBS,MAAM,CAACC,QAAQ,EAAEd;;;0BAEvE,KAAC7B;0BAAY0B;;0BACb,MAACvB;;kCACC,KAACF;wBAAaqB,SAASK;;kCACvB,KAACzB;wBAAcoB,SAAS,IAAMM;;;;;;AAItC,EAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.client.d.ts","sourceRoot":"","sources":["../../../src/components/TenantField/index.client.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.client.d.ts","sourceRoot":"","sources":["../../../src/components/TenantField/index.client.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,SAAS,CAAA;AAa3D,OAAO,KAAK,MAAM,OAAO,CAAA;AASzB,OAAO,aAAa,CAAA;AAIpB,KAAK,KAAK,GAAG;IACX,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,MAAM,CAAC,EAAE,OAAO,CAAA;CACjB,GAAG,4BAA4B,CAAA;AAEhC,eAAO,MAAM,WAAW,oCAAqC,KAAK,6BAoIjE,CAAA"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
-
import { Pill, RelationshipField, useDocumentInfo, useField, useForm, useFormModified, useModal } from '@payloadcms/ui';
|
|
3
|
+
import { FieldContext, FieldPathContext, Pill, RelationshipField, useDocumentInfo, useField, useForm, useFormModified, useModal } from '@payloadcms/ui';
|
|
4
4
|
import React from 'react';
|
|
5
5
|
import { useTenantSelection } from '../../providers/TenantSelectionProvider/index.client.js';
|
|
6
6
|
import { AssignTenantFieldModal, assignTenantModalSlug } from '../AssignTenantFieldModal/index.client.js';
|
|
@@ -8,84 +8,83 @@ import './index.css';
|
|
|
8
8
|
const baseClass = 'tenantField';
|
|
9
9
|
export const TenantField = ({ debug, unique, ...fieldArgs })=>{
|
|
10
10
|
const { entityType, options, selectedTenantID, setEntityType, setTenant } = useTenantSelection();
|
|
11
|
-
const
|
|
12
|
-
const
|
|
13
|
-
const { isValid: isFormValid
|
|
11
|
+
const tenantField = useField();
|
|
12
|
+
const { setValue, showError, value } = tenantField;
|
|
13
|
+
const { isValid: isFormValid } = useForm();
|
|
14
14
|
const { id: docID, collectionSlug } = useDocumentInfo();
|
|
15
15
|
const { isModalOpen, openModal } = useModal();
|
|
16
16
|
const isEditManyModalOpen = collectionSlug ? isModalOpen(`edit-${collectionSlug}`) || isModalOpen(`edit-${collectionSlug}-bulk-uploads`) : false;
|
|
17
|
-
const
|
|
18
|
-
const
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
modified,
|
|
29
|
-
value
|
|
17
|
+
const [modalValue, setModalValue] = React.useState(value);
|
|
18
|
+
const localTenantField = React.useMemo(()=>({
|
|
19
|
+
...tenantField,
|
|
20
|
+
initialValue: modalValue,
|
|
21
|
+
setValue: (nextValue)=>{
|
|
22
|
+
setModalValue(nextValue);
|
|
23
|
+
},
|
|
24
|
+
value: modalValue
|
|
25
|
+
}), [
|
|
26
|
+
modalValue,
|
|
27
|
+
tenantField
|
|
30
28
|
]);
|
|
31
|
-
const
|
|
32
|
-
|
|
33
|
-
if (
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
const prev = prevValue.current || [];
|
|
37
|
-
const newValue = value || [];
|
|
38
|
-
if (prev.length !== newValue.length) {
|
|
39
|
-
didChange = true;
|
|
40
|
-
} else {
|
|
41
|
-
const allMatch = newValue.every((val)=>prev.includes(val));
|
|
42
|
-
if (allMatch) {
|
|
43
|
-
didChange = false;
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
} else if (value === prevValue.current) {
|
|
47
|
-
didChange = false;
|
|
29
|
+
const showField = options.length > 1 && !fieldArgs.field.admin?.hidden && !fieldArgs.field.hidden || debug;
|
|
30
|
+
function getTenantIDToSelect({ selectedTenantID, value }) {
|
|
31
|
+
if (Array.isArray(value)) {
|
|
32
|
+
if (!value.length) {
|
|
33
|
+
return undefined;
|
|
48
34
|
}
|
|
49
|
-
if (
|
|
50
|
-
|
|
51
|
-
prevValue.current = value;
|
|
35
|
+
if (!selectedTenantID || !value.includes(selectedTenantID)) {
|
|
36
|
+
return value[0];
|
|
52
37
|
}
|
|
38
|
+
return undefined;
|
|
39
|
+
}
|
|
40
|
+
if (value && selectedTenantID !== value) {
|
|
41
|
+
return value;
|
|
42
|
+
}
|
|
43
|
+
return undefined;
|
|
44
|
+
}
|
|
45
|
+
const syncTenantSelectionFromValue = React.useCallback((tenantValue)=>{
|
|
46
|
+
const tenantID = getTenantIDToSelect({
|
|
47
|
+
selectedTenantID,
|
|
48
|
+
value: tenantValue
|
|
49
|
+
});
|
|
50
|
+
if (tenantID) {
|
|
51
|
+
setTenant({
|
|
52
|
+
id: tenantID,
|
|
53
|
+
refresh: false
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
}, [
|
|
57
|
+
selectedTenantID,
|
|
58
|
+
setTenant
|
|
59
|
+
]);
|
|
60
|
+
const onConfirm = React.useCallback(()=>{
|
|
61
|
+
if (hasTenantValueChanged({
|
|
62
|
+
hasMany: fieldArgs.field.hasMany,
|
|
63
|
+
modalValue,
|
|
64
|
+
value
|
|
65
|
+
})) {
|
|
66
|
+
setValue(modalValue);
|
|
67
|
+
syncTenantSelectionFromValue(modalValue);
|
|
53
68
|
}
|
|
54
|
-
setValue(prevValue.current, true);
|
|
55
|
-
setModified(prevModified.current);
|
|
56
|
-
isConfirmingRef.current = false;
|
|
57
69
|
}, [
|
|
70
|
+
fieldArgs.field.hasMany,
|
|
71
|
+
modalValue,
|
|
58
72
|
setValue,
|
|
59
|
-
|
|
60
|
-
value
|
|
61
|
-
|
|
73
|
+
syncTenantSelectionFromValue,
|
|
74
|
+
value
|
|
75
|
+
]);
|
|
76
|
+
const afterModalOpen = React.useCallback(()=>{
|
|
77
|
+
setModalValue(value);
|
|
78
|
+
}, [
|
|
79
|
+
value
|
|
62
80
|
]);
|
|
63
81
|
React.useEffect(()=>{
|
|
64
82
|
if (!entityType) {
|
|
65
83
|
setEntityType(unique ? 'global' : 'document');
|
|
66
84
|
} else {
|
|
67
85
|
// unique documents are controlled from the global TenantSelector
|
|
68
|
-
if (!unique
|
|
69
|
-
|
|
70
|
-
if (value.length) {
|
|
71
|
-
if (!selectedTenantID) {
|
|
72
|
-
setTenant({
|
|
73
|
-
id: value[0],
|
|
74
|
-
refresh: false
|
|
75
|
-
});
|
|
76
|
-
} else if (!value.includes(selectedTenantID)) {
|
|
77
|
-
setTenant({
|
|
78
|
-
id: value[0],
|
|
79
|
-
refresh: false
|
|
80
|
-
});
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
} else if (selectedTenantID !== value) {
|
|
84
|
-
setTenant({
|
|
85
|
-
id: value,
|
|
86
|
-
refresh: false
|
|
87
|
-
});
|
|
88
|
-
}
|
|
86
|
+
if (!unique) {
|
|
87
|
+
syncTenantSelectionFromValue(value);
|
|
89
88
|
}
|
|
90
89
|
}
|
|
91
90
|
return ()=>{
|
|
@@ -94,13 +93,11 @@ export const TenantField = ({ debug, unique, ...fieldArgs })=>{
|
|
|
94
93
|
}
|
|
95
94
|
};
|
|
96
95
|
}, [
|
|
97
|
-
|
|
98
|
-
options,
|
|
99
|
-
selectedTenantID,
|
|
100
|
-
setTenant,
|
|
101
|
-
value,
|
|
96
|
+
entityType,
|
|
102
97
|
setEntityType,
|
|
103
|
-
|
|
98
|
+
syncTenantSelectionFromValue,
|
|
99
|
+
unique,
|
|
100
|
+
value
|
|
104
101
|
]);
|
|
105
102
|
React.useEffect(()=>{
|
|
106
103
|
if (unique || debug || isEditManyModalOpen) {
|
|
@@ -131,12 +128,17 @@ export const TenantField = ({ debug, unique, ...fieldArgs })=>{
|
|
|
131
128
|
}
|
|
132
129
|
if (!unique) {
|
|
133
130
|
/** Editing a non-global tenant document */ return /*#__PURE__*/ _jsx(AssignTenantFieldModal, {
|
|
134
|
-
afterModalClose: afterModalClose,
|
|
135
131
|
afterModalOpen: afterModalOpen,
|
|
136
132
|
onConfirm: onConfirm,
|
|
137
|
-
children: /*#__PURE__*/ _jsx(
|
|
138
|
-
|
|
139
|
-
|
|
133
|
+
children: /*#__PURE__*/ _jsx(FieldPathContext, {
|
|
134
|
+
value: tenantField.path,
|
|
135
|
+
children: /*#__PURE__*/ _jsx(FieldContext, {
|
|
136
|
+
value: localTenantField,
|
|
137
|
+
children: /*#__PURE__*/ _jsx(TenantRelationshipField, {
|
|
138
|
+
fieldArgs: fieldArgs,
|
|
139
|
+
unique: unique
|
|
140
|
+
})
|
|
141
|
+
})
|
|
140
142
|
})
|
|
141
143
|
});
|
|
142
144
|
}
|
|
@@ -144,6 +146,14 @@ export const TenantField = ({ debug, unique, ...fieldArgs })=>{
|
|
|
144
146
|
}
|
|
145
147
|
return null;
|
|
146
148
|
};
|
|
149
|
+
const hasTenantValueChanged = ({ hasMany, modalValue, value })=>{
|
|
150
|
+
if (hasMany) {
|
|
151
|
+
const currentValue = value || [];
|
|
152
|
+
const nextValue = modalValue || [];
|
|
153
|
+
return currentValue.length !== nextValue.length || nextValue.some((nextValueItem)=>!currentValue.includes(nextValueItem));
|
|
154
|
+
}
|
|
155
|
+
return value !== modalValue;
|
|
156
|
+
};
|
|
147
157
|
const TenantRelationshipField = ({ debug, fieldArgs, unique })=>{
|
|
148
158
|
return /*#__PURE__*/ _jsx("div", {
|
|
149
159
|
className: baseClass,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/TenantField/index.client.tsx"],"sourcesContent":["'use client'\n\nimport type { RelationshipFieldClientProps } from 'payload'\n\nimport {\n Pill,\n RelationshipField,\n useDocumentInfo,\n useField,\n useForm,\n useFormModified,\n useModal,\n} from '@payloadcms/ui'\nimport React from 'react'\n\nimport { useTenantSelection } from '../../providers/TenantSelectionProvider/index.client.js'\nimport {\n AssignTenantFieldModal,\n assignTenantModalSlug,\n} from '../AssignTenantFieldModal/index.client.js'\nimport './index.css'\n\nconst baseClass = 'tenantField'\n\ntype Props = {\n debug?: boolean\n unique?: boolean\n} & RelationshipFieldClientProps\n\nexport const TenantField = ({ debug, unique, ...fieldArgs }: Props) => {\n const { entityType, options, selectedTenantID, setEntityType, setTenant } = useTenantSelection()\n const { setValue, showError, value } = useField<(number | string)[] | (number | string)>()\n const modified = useFormModified()\n const { isValid: isFormValid, setModified } = useForm()\n const { id: docID, collectionSlug } = useDocumentInfo()\n const { isModalOpen, openModal } = useModal()\n const isEditManyModalOpen = collectionSlug\n ? isModalOpen(`edit-${collectionSlug}`) || isModalOpen(`edit-${collectionSlug}-bulk-uploads`)\n : false\n const isConfirmingRef = React.useRef<boolean>(false)\n const prevModified = React.useRef(modified)\n const prevValue = React.useRef<typeof value>(value)\n const showField =\n (options.length > 1 && !fieldArgs.field.admin?.hidden && !fieldArgs.field.hidden) || debug\n\n const onConfirm = React.useCallback(() => {\n isConfirmingRef.current = true\n }, [])\n\n const afterModalOpen = React.useCallback(() => {\n prevModified.current = modified\n prevValue.current = value\n }, [modified, value])\n\n const afterModalClose = React.useCallback(() => {\n let didChange = true\n if (isConfirmingRef.current) {\n // did the values actually change?\n if (fieldArgs.field.hasMany) {\n const prev = (prevValue.current || []) as (number | string)[]\n const newValue = (value || []) as (number | string)[]\n if (prev.length !== newValue.length) {\n didChange = true\n } else {\n const allMatch = newValue.every((val) => prev.includes(val))\n if (allMatch) {\n didChange = false\n }\n }\n } else if (value === prevValue.current) {\n didChange = false\n }\n\n if (didChange) {\n prevModified.current = true\n prevValue.current = value\n }\n }\n\n setValue(prevValue.current, true)\n setModified(prevModified.current)\n\n isConfirmingRef.current = false\n }, [setValue, setModified, value, fieldArgs.field.hasMany])\n\n React.useEffect(() => {\n if (!entityType) {\n setEntityType(unique ? 'global' : 'document')\n } else {\n // unique documents are controlled from the global TenantSelector\n if (!unique && value) {\n if (Array.isArray(value)) {\n if (value.length) {\n if (!selectedTenantID) {\n setTenant({ id: value[0], refresh: false })\n } else if (!value.includes(selectedTenantID)) {\n setTenant({ id: value[0], refresh: false })\n }\n }\n } else if (selectedTenantID !== value) {\n setTenant({ id: value, refresh: false })\n }\n }\n }\n\n return () => {\n if (entityType) {\n setEntityType(undefined)\n }\n }\n }, [unique, options, selectedTenantID, setTenant, value, setEntityType, entityType])\n\n React.useEffect(() => {\n if (unique || debug || isEditManyModalOpen) {\n return\n }\n if (showField && ((!isFormValid && showError) || (!value && !selectedTenantID))) {\n openModal(assignTenantModalSlug)\n }\n }, [\n debug,\n isEditManyModalOpen,\n isFormValid,\n showError,\n showField,\n openModal,\n value,\n docID,\n selectedTenantID,\n unique,\n ])\n\n if (showField) {\n if (debug || isEditManyModalOpen) {\n return <TenantRelationshipField debug={debug} fieldArgs={fieldArgs} unique={unique} />\n }\n\n if (!unique) {\n /** Editing a non-global tenant document */\n return (\n <AssignTenantFieldModal\n afterModalClose={afterModalClose}\n afterModalOpen={afterModalOpen}\n onConfirm={onConfirm}\n >\n <TenantRelationshipField fieldArgs={fieldArgs} unique={unique} />\n </AssignTenantFieldModal>\n )\n }\n\n return <SyncFormModified />\n }\n\n return null\n}\n\nconst TenantRelationshipField: React.FC<{\n debug?: boolean\n fieldArgs: RelationshipFieldClientProps\n unique?: boolean\n}> = ({ debug, fieldArgs, unique }) => {\n return (\n <div className={baseClass}>\n <div className={`${baseClass}__wrapper`}>\n {debug && (\n <Pill className={`${baseClass}__debug-pill`} pillStyle=\"success\" size=\"small\">\n Multi-Tenant Debug Enabled\n </Pill>\n )}\n <RelationshipField\n {...fieldArgs}\n field={{\n ...fieldArgs.field,\n required: true,\n }}\n readOnly={fieldArgs.readOnly || fieldArgs.field.admin?.readOnly || unique}\n />\n </div>\n </div>\n )\n}\n\n/**\n * Tells the global selector when the form has been modified\n * so it can display the \"Leave without saving\" confirmation modal\n * if modified and attempting to change the tenant\n */\nconst SyncFormModified = () => {\n const modified = useFormModified()\n const { setModified } = useTenantSelection()\n\n React.useEffect(() => {\n setModified(modified)\n }, [modified, setModified])\n\n return null\n}\n"],"names":["Pill","RelationshipField","useDocumentInfo","useField","useForm","useFormModified","useModal","React","useTenantSelection","AssignTenantFieldModal","assignTenantModalSlug","baseClass","TenantField","debug","unique","fieldArgs","entityType","options","selectedTenantID","setEntityType","setTenant","setValue","showError","value","modified","isValid","isFormValid","setModified","id","docID","collectionSlug","isModalOpen","openModal","isEditManyModalOpen","isConfirmingRef","useRef","prevModified","prevValue","showField","length","field","admin","hidden","onConfirm","useCallback","current","afterModalOpen","afterModalClose","didChange","hasMany","prev","newValue","allMatch","every","val","includes","useEffect","Array","isArray","refresh","undefined","TenantRelationshipField","SyncFormModified","div","className","pillStyle","size","required","readOnly"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/components/TenantField/index.client.tsx"],"sourcesContent":["'use client'\n\nimport type { FieldType } from '@payloadcms/ui'\nimport type { RelationshipFieldClientProps } from 'payload'\n\nimport {\n FieldContext,\n FieldPathContext,\n Pill,\n RelationshipField,\n useDocumentInfo,\n useField,\n useForm,\n useFormModified,\n useModal,\n} from '@payloadcms/ui'\nimport React from 'react'\n\nimport type { TenantValue } from '../../types.js'\n\nimport { useTenantSelection } from '../../providers/TenantSelectionProvider/index.client.js'\nimport {\n AssignTenantFieldModal,\n assignTenantModalSlug,\n} from '../AssignTenantFieldModal/index.client.js'\nimport './index.css'\n\nconst baseClass = 'tenantField'\n\ntype Props = {\n debug?: boolean\n unique?: boolean\n} & RelationshipFieldClientProps\n\nexport const TenantField = ({ debug, unique, ...fieldArgs }: Props) => {\n const { entityType, options, selectedTenantID, setEntityType, setTenant } = useTenantSelection()\n const tenantField = useField<TenantValue>()\n const { setValue, showError, value } = tenantField\n const { isValid: isFormValid } = useForm()\n const { id: docID, collectionSlug } = useDocumentInfo()\n const { isModalOpen, openModal } = useModal()\n const isEditManyModalOpen = collectionSlug\n ? isModalOpen(`edit-${collectionSlug}`) || isModalOpen(`edit-${collectionSlug}-bulk-uploads`)\n : false\n const [modalValue, setModalValue] = React.useState<TenantValue | undefined>(value)\n const localTenantField = React.useMemo<FieldType<TenantValue>>(\n () => ({\n ...tenantField,\n initialValue: modalValue,\n setValue: (nextValue) => {\n setModalValue(nextValue as TenantValue | undefined)\n },\n value: modalValue as TenantValue,\n }),\n [modalValue, tenantField],\n )\n const showField =\n (options.length > 1 && !fieldArgs.field.admin?.hidden && !fieldArgs.field.hidden) || debug\n\n function getTenantIDToSelect({\n selectedTenantID,\n value,\n }: {\n selectedTenantID: number | string | undefined\n value: TenantValue | undefined\n }): number | string | undefined {\n if (Array.isArray(value)) {\n if (!value.length) {\n return undefined\n }\n\n if (!selectedTenantID || !value.includes(selectedTenantID)) {\n return value[0]\n }\n\n return undefined\n }\n\n if (value && selectedTenantID !== value) {\n return value\n }\n\n return undefined\n }\n\n const syncTenantSelectionFromValue = React.useCallback(\n (tenantValue: TenantValue | undefined) => {\n const tenantID = getTenantIDToSelect({ selectedTenantID, value: tenantValue })\n\n if (tenantID) {\n setTenant({ id: tenantID, refresh: false })\n }\n },\n [selectedTenantID, setTenant],\n )\n\n const onConfirm = React.useCallback(() => {\n if (hasTenantValueChanged({ hasMany: fieldArgs.field.hasMany, modalValue, value })) {\n setValue(modalValue)\n syncTenantSelectionFromValue(modalValue)\n }\n }, [fieldArgs.field.hasMany, modalValue, setValue, syncTenantSelectionFromValue, value])\n\n const afterModalOpen = React.useCallback(() => {\n setModalValue(value)\n }, [value])\n\n React.useEffect(() => {\n if (!entityType) {\n setEntityType(unique ? 'global' : 'document')\n } else {\n // unique documents are controlled from the global TenantSelector\n if (!unique) {\n syncTenantSelectionFromValue(value)\n }\n }\n\n return () => {\n if (entityType) {\n setEntityType(undefined)\n }\n }\n }, [entityType, setEntityType, syncTenantSelectionFromValue, unique, value])\n\n React.useEffect(() => {\n if (unique || debug || isEditManyModalOpen) {\n return\n }\n if (showField && ((!isFormValid && showError) || (!value && !selectedTenantID))) {\n openModal(assignTenantModalSlug)\n }\n }, [\n debug,\n isEditManyModalOpen,\n isFormValid,\n showError,\n showField,\n openModal,\n value,\n docID,\n selectedTenantID,\n unique,\n ])\n\n if (showField) {\n if (debug || isEditManyModalOpen) {\n return <TenantRelationshipField debug={debug} fieldArgs={fieldArgs} unique={unique} />\n }\n\n if (!unique) {\n /** Editing a non-global tenant document */\n return (\n <AssignTenantFieldModal afterModalOpen={afterModalOpen} onConfirm={onConfirm}>\n <FieldPathContext value={tenantField.path}>\n <FieldContext value={localTenantField}>\n <TenantRelationshipField fieldArgs={fieldArgs} unique={unique} />\n </FieldContext>\n </FieldPathContext>\n </AssignTenantFieldModal>\n )\n }\n\n return <SyncFormModified />\n }\n\n return null\n}\n\nconst hasTenantValueChanged = ({\n hasMany,\n modalValue,\n value,\n}: {\n hasMany?: boolean\n modalValue: TenantValue | undefined\n value: TenantValue | undefined\n}): boolean => {\n if (hasMany) {\n const currentValue = (value || []) as (number | string)[]\n const nextValue = (modalValue || []) as (number | string)[]\n\n return (\n currentValue.length !== nextValue.length ||\n nextValue.some((nextValueItem) => !currentValue.includes(nextValueItem))\n )\n }\n\n return value !== modalValue\n}\n\nconst TenantRelationshipField: React.FC<{\n debug?: boolean\n fieldArgs: RelationshipFieldClientProps\n unique?: boolean\n}> = ({ debug, fieldArgs, unique }) => {\n return (\n <div className={baseClass}>\n <div className={`${baseClass}__wrapper`}>\n {debug && (\n <Pill className={`${baseClass}__debug-pill`} pillStyle=\"success\" size=\"small\">\n Multi-Tenant Debug Enabled\n </Pill>\n )}\n <RelationshipField\n {...fieldArgs}\n field={{\n ...fieldArgs.field,\n required: true,\n }}\n readOnly={fieldArgs.readOnly || fieldArgs.field.admin?.readOnly || unique}\n />\n </div>\n </div>\n )\n}\n\n/**\n * Tells the global selector when the form has been modified\n * so it can display the \"Leave without saving\" confirmation modal\n * if modified and attempting to change the tenant\n */\nconst SyncFormModified = () => {\n const modified = useFormModified()\n const { setModified } = useTenantSelection()\n\n React.useEffect(() => {\n setModified(modified)\n }, [modified, setModified])\n\n return null\n}\n"],"names":["FieldContext","FieldPathContext","Pill","RelationshipField","useDocumentInfo","useField","useForm","useFormModified","useModal","React","useTenantSelection","AssignTenantFieldModal","assignTenantModalSlug","baseClass","TenantField","debug","unique","fieldArgs","entityType","options","selectedTenantID","setEntityType","setTenant","tenantField","setValue","showError","value","isValid","isFormValid","id","docID","collectionSlug","isModalOpen","openModal","isEditManyModalOpen","modalValue","setModalValue","useState","localTenantField","useMemo","initialValue","nextValue","showField","length","field","admin","hidden","getTenantIDToSelect","Array","isArray","undefined","includes","syncTenantSelectionFromValue","useCallback","tenantValue","tenantID","refresh","onConfirm","hasTenantValueChanged","hasMany","afterModalOpen","useEffect","TenantRelationshipField","path","SyncFormModified","currentValue","some","nextValueItem","div","className","pillStyle","size","required","readOnly","modified","setModified"],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { SingleRelationshipField } from 'payload';
|
|
2
|
-
import type { RootTenantFieldConfigOverrides } from '../../types.js';
|
|
2
|
+
import type { MultiTenantPluginConfig, RootTenantFieldConfigOverrides } from '../../types.js';
|
|
3
3
|
type Args = {
|
|
4
|
+
adminUsersSlug?: string;
|
|
4
5
|
debug?: boolean;
|
|
5
6
|
isAutosaveEnabled?: boolean;
|
|
6
7
|
name: string;
|
|
@@ -9,7 +10,8 @@ type Args = {
|
|
|
9
10
|
tenantsArrayTenantFieldName: string;
|
|
10
11
|
tenantsCollectionSlug: string;
|
|
11
12
|
unique: boolean;
|
|
13
|
+
userHasAccessToAllTenants?: MultiTenantPluginConfig['userHasAccessToAllTenants'];
|
|
12
14
|
};
|
|
13
|
-
export declare const tenantField: ({ name, debug, isAutosaveEnabled, overrides: _overrides, tenantsArrayFieldName, tenantsArrayTenantFieldName, tenantsCollectionSlug, unique, }: Args) => SingleRelationshipField;
|
|
15
|
+
export declare const tenantField: ({ name, adminUsersSlug, debug, isAutosaveEnabled, overrides: _overrides, tenantsArrayFieldName, tenantsArrayTenantFieldName, tenantsCollectionSlug, unique, userHasAccessToAllTenants, }: Args) => SingleRelationshipField;
|
|
14
16
|
export {};
|
|
15
17
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/fields/tenantField/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAA+B,uBAAuB,EAAE,MAAM,SAAS,CAAA;AAEnF,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,gBAAgB,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/fields/tenantField/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAA+B,uBAAuB,EAAE,MAAM,SAAS,CAAA;AAEnF,OAAO,KAAK,EAAE,uBAAuB,EAAE,8BAA8B,EAAE,MAAM,gBAAgB,CAAA;AAsD7F,KAAK,IAAI,GAAG;IACV,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,CAAC,EAAE,8BAA8B,CAAA;IAC1C,qBAAqB,EAAE,MAAM,CAAA;IAC7B,2BAA2B,EAAE,MAAM,CAAA;IACnC,qBAAqB,EAAE,MAAM,CAAA;IAC7B,MAAM,EAAE,OAAO,CAAA;IACf,yBAAyB,CAAC,EAAE,uBAAuB,CAAC,2BAA2B,CAAC,CAAA;CACjF,CAAA;AACD,eAAO,MAAM,WAAW,6LAWrB,IAAI,KAAG,uBAmHT,CAAA"}
|
|
@@ -2,9 +2,10 @@ import { defaults } from '../../defaults.js';
|
|
|
2
2
|
import { getCollectionIDType } from '../../utilities/getCollectionIDType.js';
|
|
3
3
|
import { getTenantFromCookie } from '../../utilities/getTenantFromCookie.js';
|
|
4
4
|
import { getUserTenantIDs } from '../../utilities/getUserTenantIDs.js';
|
|
5
|
-
|
|
5
|
+
import { isValidTenantAssignment } from '../../utilities/isValidTenantAssignment.js';
|
|
6
|
+
const fieldValidation = ({ tenantsArrayFieldName, tenantsArrayTenantFieldName, userHasAccessToAllTenants, validateFunction })=>async (value, options)=>{
|
|
6
7
|
if (validateFunction) {
|
|
7
|
-
const result = validateFunction(value, options);
|
|
8
|
+
const result = await validateFunction(value, options);
|
|
8
9
|
if (result !== true) {
|
|
9
10
|
return result;
|
|
10
11
|
}
|
|
@@ -18,15 +19,31 @@ const fieldValidation = (validateFunction)=>(value, options)=>{
|
|
|
18
19
|
return options.req.t('validation:required');
|
|
19
20
|
}
|
|
20
21
|
}
|
|
21
|
-
|
|
22
|
+
if (isValidTenantAssignment({
|
|
23
|
+
previousValue: options.previousValue,
|
|
24
|
+
req: options.req,
|
|
25
|
+
tenantsArrayFieldName,
|
|
26
|
+
tenantsArrayTenantFieldName,
|
|
27
|
+
userHasAccessToAllTenants,
|
|
28
|
+
value
|
|
29
|
+
})) {
|
|
30
|
+
return true;
|
|
31
|
+
}
|
|
32
|
+
return options.req.t('validation:invalidSelection');
|
|
22
33
|
};
|
|
23
|
-
export const tenantField = ({ name = defaults.tenantFieldName, debug, isAutosaveEnabled, overrides: _overrides = {}, tenantsArrayFieldName = defaults.tenantsArrayFieldName, tenantsArrayTenantFieldName = defaults.tenantsArrayTenantFieldName, tenantsCollectionSlug = defaults.tenantCollectionSlug, unique })=>{
|
|
34
|
+
export const tenantField = ({ name = defaults.tenantFieldName, adminUsersSlug, debug, isAutosaveEnabled, overrides: _overrides = {}, tenantsArrayFieldName = defaults.tenantsArrayFieldName, tenantsArrayTenantFieldName = defaults.tenantsArrayTenantFieldName, tenantsCollectionSlug = defaults.tenantCollectionSlug, unique, userHasAccessToAllTenants })=>{
|
|
24
35
|
const { hasMany = false, validate, ...overrides } = _overrides || {};
|
|
25
36
|
return {
|
|
26
37
|
...overrides || {},
|
|
27
38
|
name,
|
|
28
39
|
type: 'relationship',
|
|
29
|
-
access:
|
|
40
|
+
access: {
|
|
41
|
+
...adminUsersSlug ? {
|
|
42
|
+
create: ({ req })=>Boolean(req.user && req.user.collection === adminUsersSlug),
|
|
43
|
+
update: ({ req })=>Boolean(req.user && req.user.collection === adminUsersSlug)
|
|
44
|
+
} : {},
|
|
45
|
+
...overrides.access || {}
|
|
46
|
+
},
|
|
30
47
|
admin: {
|
|
31
48
|
allowCreate: false,
|
|
32
49
|
allowEdit: false,
|
|
@@ -57,7 +74,7 @@ export const tenantField = ({ name = defaults.tenantFieldName, debug, isAutosave
|
|
|
57
74
|
});
|
|
58
75
|
const tenantFromCookie = getTenantFromCookie(req.headers, idType);
|
|
59
76
|
if (tenantFromCookie) {
|
|
60
|
-
const
|
|
77
|
+
const { totalDocs } = await req.payload.count({
|
|
61
78
|
collection: tenantsCollectionSlug,
|
|
62
79
|
overrideAccess: false,
|
|
63
80
|
req,
|
|
@@ -70,7 +87,7 @@ export const tenantField = ({ name = defaults.tenantFieldName, debug, isAutosave
|
|
|
70
87
|
}
|
|
71
88
|
}
|
|
72
89
|
});
|
|
73
|
-
return
|
|
90
|
+
return totalDocs > 0 ? tenantFromCookie : null;
|
|
74
91
|
}
|
|
75
92
|
if (req.user && isAutosaveEnabled) {
|
|
76
93
|
const userTenants = getUserTenantIDs(req.user, {
|
|
@@ -103,11 +120,21 @@ export const tenantField = ({ name = defaults.tenantFieldName, debug, isAutosave
|
|
|
103
120
|
...hasMany ? {
|
|
104
121
|
hasMany: true,
|
|
105
122
|
// TODO: V4 - replace validation with required: true
|
|
106
|
-
validate: fieldValidation(
|
|
123
|
+
validate: fieldValidation({
|
|
124
|
+
tenantsArrayFieldName,
|
|
125
|
+
tenantsArrayTenantFieldName,
|
|
126
|
+
userHasAccessToAllTenants,
|
|
127
|
+
validateFunction: validate
|
|
128
|
+
})
|
|
107
129
|
} : {
|
|
108
130
|
hasMany: false,
|
|
109
131
|
// TODO: V4 - replace validation with required: true
|
|
110
|
-
validate: fieldValidation(
|
|
132
|
+
validate: fieldValidation({
|
|
133
|
+
tenantsArrayFieldName,
|
|
134
|
+
tenantsArrayTenantFieldName,
|
|
135
|
+
userHasAccessToAllTenants,
|
|
136
|
+
validateFunction: validate
|
|
137
|
+
})
|
|
111
138
|
},
|
|
112
139
|
// @ts-expect-error translations are not typed for this plugin
|
|
113
140
|
label: overrides.label || (({ t })=>t('plugin-multi-tenant:field-assignedTenant-label'))
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/fields/tenantField/index.ts"],"sourcesContent":["import type { RelationshipFieldValidation, SingleRelationshipField } from 'payload'\n\nimport type { RootTenantFieldConfigOverrides } from '../../types.js'\n\nimport { defaults } from '../../defaults.js'\nimport { getCollectionIDType } from '../../utilities/getCollectionIDType.js'\nimport { getTenantFromCookie } from '../../utilities/getTenantFromCookie.js'\nimport { getUserTenantIDs } from '../../utilities/getUserTenantIDs.js'\n\nconst fieldValidation =\n (validateFunction?: RelationshipFieldValidation): RelationshipFieldValidation =>\n (value, options) => {\n if (validateFunction) {\n const result = validateFunction(value, options)\n if (result !== true) {\n return result\n }\n }\n\n if (options.hasMany) {\n if (!value || (Array.isArray(value) && value.length === 0)) {\n return options.req.t('validation:required')\n }\n } else {\n if (!value) {\n return options.req.t('validation:required')\n }\n }\n\n return true\n }\n\ntype Args = {\n debug?: boolean\n isAutosaveEnabled?: boolean\n name: string\n overrides?: RootTenantFieldConfigOverrides\n tenantsArrayFieldName: string\n tenantsArrayTenantFieldName: string\n tenantsCollectionSlug: string\n unique: boolean\n}\nexport const tenantField = ({\n name = defaults.tenantFieldName,\n debug,\n isAutosaveEnabled,\n overrides: _overrides = {},\n tenantsArrayFieldName = defaults.tenantsArrayFieldName,\n tenantsArrayTenantFieldName = defaults.tenantsArrayTenantFieldName,\n tenantsCollectionSlug = defaults.tenantCollectionSlug,\n unique,\n}: Args): SingleRelationshipField => {\n const { hasMany = false, validate, ...overrides } = _overrides || {}\n return {\n ...(overrides || {}),\n name,\n type: 'relationship',\n access: overrides.access || {},\n admin: {\n allowCreate: false,\n allowEdit: false,\n disabled: { column: true, filter: true, groupBy: true },\n position: 'sidebar',\n ...(overrides.admin || {}),\n components: {\n ...(overrides.admin?.components || {}),\n Field: {\n path: '@payloadcms/plugin-multi-tenant/client#TenantField',\n ...(typeof overrides.admin?.components?.Field !== 'string'\n ? overrides.admin?.components?.Field || {}\n : {}),\n clientProps: {\n ...(typeof overrides.admin?.components?.Field !== 'string'\n ? (overrides.admin?.components?.Field || {})?.clientProps\n : {}),\n debug,\n unique,\n },\n },\n },\n },\n defaultValue:\n overrides.defaultValue ||\n (async ({ req }) => {\n const idType = getCollectionIDType({\n collectionSlug: tenantsCollectionSlug,\n payload: req.payload,\n })\n const tenantFromCookie = getTenantFromCookie(req.headers, idType)\n if (tenantFromCookie) {\n const isValidTenant = await req.payload.count({\n collection: tenantsCollectionSlug,\n overrideAccess: false,\n req,\n user: req.user,\n where: {\n id: {\n in: [tenantFromCookie],\n },\n },\n })\n return isValidTenant ? tenantFromCookie : null\n }\n if (req.user && isAutosaveEnabled) {\n const userTenants = getUserTenantIDs(req.user, {\n tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n })\n if (userTenants.length > 0) {\n return userTenants[0]\n }\n }\n return null\n }),\n filterOptions:\n overrides.filterOptions ||\n (({ req }) => {\n const userAssignedTenants = getUserTenantIDs(req.user, {\n tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n })\n if (userAssignedTenants.length > 0) {\n return {\n id: {\n in: userAssignedTenants,\n },\n }\n }\n\n return true\n }),\n index: true,\n relationTo: tenantsCollectionSlug,\n unique,\n ...(hasMany\n ? {\n hasMany: true,\n // TODO: V4 - replace validation with required: true\n validate: fieldValidation(validate as RelationshipFieldValidation),\n }\n : {\n hasMany: false,\n // TODO: V4 - replace validation with required: true\n validate: fieldValidation(validate as RelationshipFieldValidation),\n }),\n // @ts-expect-error translations are not typed for this plugin\n label: overrides.label || (({ t }) => t('plugin-multi-tenant:field-assignedTenant-label')),\n }\n}\n"],"names":["defaults","getCollectionIDType","getTenantFromCookie","getUserTenantIDs","fieldValidation","validateFunction","value","options","result","hasMany","Array","isArray","length","req","t","tenantField","name","tenantFieldName","debug","isAutosaveEnabled","overrides","_overrides","tenantsArrayFieldName","tenantsArrayTenantFieldName","tenantsCollectionSlug","tenantCollectionSlug","unique","validate","type","access","admin","allowCreate","allowEdit","disabled","column","filter","groupBy","position","components","Field","path","clientProps","defaultValue","idType","collectionSlug","payload","tenantFromCookie","headers","isValidTenant","count","collection","overrideAccess","user","where","id","in","userTenants","filterOptions","userAssignedTenants","index","relationTo","label"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/fields/tenantField/index.ts"],"sourcesContent":["import type { RelationshipFieldValidation, SingleRelationshipField } from 'payload'\n\nimport type { MultiTenantPluginConfig, RootTenantFieldConfigOverrides } from '../../types.js'\n\nimport { defaults } from '../../defaults.js'\nimport { getCollectionIDType } from '../../utilities/getCollectionIDType.js'\nimport { getTenantFromCookie } from '../../utilities/getTenantFromCookie.js'\nimport { getUserTenantIDs } from '../../utilities/getUserTenantIDs.js'\nimport { isValidTenantAssignment } from '../../utilities/isValidTenantAssignment.js'\n\nconst fieldValidation =\n ({\n tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n userHasAccessToAllTenants,\n validateFunction,\n }: {\n tenantsArrayFieldName: string\n tenantsArrayTenantFieldName: string\n userHasAccessToAllTenants?: MultiTenantPluginConfig['userHasAccessToAllTenants']\n validateFunction?: RelationshipFieldValidation\n }): RelationshipFieldValidation =>\n async (value, options) => {\n if (validateFunction) {\n const result = await validateFunction(value, options)\n if (result !== true) {\n return result\n }\n }\n\n if (options.hasMany) {\n if (!value || (Array.isArray(value) && value.length === 0)) {\n return options.req.t('validation:required')\n }\n } else {\n if (!value) {\n return options.req.t('validation:required')\n }\n }\n\n if (\n isValidTenantAssignment({\n previousValue: options.previousValue,\n req: options.req,\n tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n userHasAccessToAllTenants,\n value,\n })\n ) {\n return true\n }\n\n return options.req.t('validation:invalidSelection')\n }\n\ntype Args = {\n adminUsersSlug?: string\n debug?: boolean\n isAutosaveEnabled?: boolean\n name: string\n overrides?: RootTenantFieldConfigOverrides\n tenantsArrayFieldName: string\n tenantsArrayTenantFieldName: string\n tenantsCollectionSlug: string\n unique: boolean\n userHasAccessToAllTenants?: MultiTenantPluginConfig['userHasAccessToAllTenants']\n}\nexport const tenantField = ({\n name = defaults.tenantFieldName,\n adminUsersSlug,\n debug,\n isAutosaveEnabled,\n overrides: _overrides = {},\n tenantsArrayFieldName = defaults.tenantsArrayFieldName,\n tenantsArrayTenantFieldName = defaults.tenantsArrayTenantFieldName,\n tenantsCollectionSlug = defaults.tenantCollectionSlug,\n unique,\n userHasAccessToAllTenants,\n}: Args): SingleRelationshipField => {\n const { hasMany = false, validate, ...overrides } = _overrides || {}\n return {\n ...(overrides || {}),\n name,\n type: 'relationship',\n access: {\n ...(adminUsersSlug\n ? {\n create: ({ req }) => Boolean(req.user && req.user.collection === adminUsersSlug),\n update: ({ req }) => Boolean(req.user && req.user.collection === adminUsersSlug),\n }\n : {}),\n ...(overrides.access || {}),\n },\n admin: {\n allowCreate: false,\n allowEdit: false,\n disabled: { column: true, filter: true, groupBy: true },\n position: 'sidebar',\n ...(overrides.admin || {}),\n components: {\n ...(overrides.admin?.components || {}),\n Field: {\n path: '@payloadcms/plugin-multi-tenant/client#TenantField',\n ...(typeof overrides.admin?.components?.Field !== 'string'\n ? overrides.admin?.components?.Field || {}\n : {}),\n clientProps: {\n ...(typeof overrides.admin?.components?.Field !== 'string'\n ? (overrides.admin?.components?.Field || {})?.clientProps\n : {}),\n debug,\n unique,\n },\n },\n },\n },\n defaultValue:\n overrides.defaultValue ||\n (async ({ req }) => {\n const idType = getCollectionIDType({\n collectionSlug: tenantsCollectionSlug,\n payload: req.payload,\n })\n const tenantFromCookie = getTenantFromCookie(req.headers, idType)\n if (tenantFromCookie) {\n const { totalDocs } = await req.payload.count({\n collection: tenantsCollectionSlug,\n overrideAccess: false,\n req,\n user: req.user,\n where: {\n id: {\n in: [tenantFromCookie],\n },\n },\n })\n return totalDocs > 0 ? tenantFromCookie : null\n }\n if (req.user && isAutosaveEnabled) {\n const userTenants = getUserTenantIDs(req.user, {\n tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n })\n if (userTenants.length > 0) {\n return userTenants[0]\n }\n }\n return null\n }),\n filterOptions:\n overrides.filterOptions ||\n (({ req }) => {\n const userAssignedTenants = getUserTenantIDs(req.user, {\n tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n })\n if (userAssignedTenants.length > 0) {\n return {\n id: {\n in: userAssignedTenants,\n },\n }\n }\n\n return true\n }),\n index: true,\n relationTo: tenantsCollectionSlug,\n unique,\n ...(hasMany\n ? {\n hasMany: true,\n // TODO: V4 - replace validation with required: true\n validate: fieldValidation({\n tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n userHasAccessToAllTenants,\n validateFunction: validate as RelationshipFieldValidation,\n }),\n }\n : {\n hasMany: false,\n // TODO: V4 - replace validation with required: true\n validate: fieldValidation({\n tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n userHasAccessToAllTenants,\n validateFunction: validate as RelationshipFieldValidation,\n }),\n }),\n // @ts-expect-error translations are not typed for this plugin\n label: overrides.label || (({ t }) => t('plugin-multi-tenant:field-assignedTenant-label')),\n }\n}\n"],"names":["defaults","getCollectionIDType","getTenantFromCookie","getUserTenantIDs","isValidTenantAssignment","fieldValidation","tenantsArrayFieldName","tenantsArrayTenantFieldName","userHasAccessToAllTenants","validateFunction","value","options","result","hasMany","Array","isArray","length","req","t","previousValue","tenantField","name","tenantFieldName","adminUsersSlug","debug","isAutosaveEnabled","overrides","_overrides","tenantsCollectionSlug","tenantCollectionSlug","unique","validate","type","access","create","Boolean","user","collection","update","admin","allowCreate","allowEdit","disabled","column","filter","groupBy","position","components","Field","path","clientProps","defaultValue","idType","collectionSlug","payload","tenantFromCookie","headers","totalDocs","count","overrideAccess","where","id","in","userTenants","filterOptions","userAssignedTenants","index","relationTo","label"],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { CollectionBeforeValidateHook, CollectionConfig } from 'payload';
|
|
2
|
+
import type { MultiTenantPluginConfig } from '../types.js';
|
|
3
|
+
type Args = {
|
|
4
|
+
collection: CollectionConfig;
|
|
5
|
+
tenantFieldName: string;
|
|
6
|
+
tenantsArrayFieldName: string;
|
|
7
|
+
tenantsArrayTenantFieldName: string;
|
|
8
|
+
userHasAccessToAllTenants: Required<MultiTenantPluginConfig>['userHasAccessToAllTenants'];
|
|
9
|
+
};
|
|
10
|
+
export declare const addCollectionBeforeValidateHook: ({ collection, tenantFieldName, tenantsArrayFieldName, tenantsArrayTenantFieldName, userHasAccessToAllTenants, }: Args) => void;
|
|
11
|
+
export declare const enforceTenantMembership: ({ collectionSlug, tenantFieldName, tenantsArrayFieldName, tenantsArrayTenantFieldName, userHasAccessToAllTenants, }: {
|
|
12
|
+
collectionSlug: string;
|
|
13
|
+
} & Omit<Args, 'collection'>) => CollectionBeforeValidateHook;
|
|
14
|
+
export {};
|
|
15
|
+
//# sourceMappingURL=enforceTenantMembership.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"enforceTenantMembership.d.ts","sourceRoot":"","sources":["../../src/hooks/enforceTenantMembership.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,4BAA4B,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAA;AAI7E,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAA;AAI1D,KAAK,IAAI,GAAG;IACV,UAAU,EAAE,gBAAgB,CAAA;IAC5B,eAAe,EAAE,MAAM,CAAA;IACvB,qBAAqB,EAAE,MAAM,CAAA;IAC7B,2BAA2B,EAAE,MAAM,CAAA;IACnC,yBAAyB,EAAE,QAAQ,CAAC,uBAAuB,CAAC,CAAC,2BAA2B,CAAC,CAAA;CAC1F,CAAA;AAED,eAAO,MAAM,+BAA+B,oHAMzC,IAAI,SAYN,CAAA;AAED,eAAO,MAAM,uBAAuB,wHAO/B;IAAE,cAAc,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC,KAAG,4BA0B1D,CAAA"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { ValidationError } from 'payload';
|
|
2
|
+
import { isValidTenantAssignment } from '../utilities/isValidTenantAssignment.js';
|
|
3
|
+
export const addCollectionBeforeValidateHook = ({ collection, tenantFieldName, tenantsArrayFieldName, tenantsArrayTenantFieldName, userHasAccessToAllTenants })=>{
|
|
4
|
+
collection.hooks ??= {};
|
|
5
|
+
collection.hooks.beforeValidate ??= [];
|
|
6
|
+
collection.hooks.beforeValidate.push(enforceTenantMembership({
|
|
7
|
+
collectionSlug: collection.slug,
|
|
8
|
+
tenantFieldName,
|
|
9
|
+
tenantsArrayFieldName,
|
|
10
|
+
tenantsArrayTenantFieldName,
|
|
11
|
+
userHasAccessToAllTenants
|
|
12
|
+
}));
|
|
13
|
+
};
|
|
14
|
+
export const enforceTenantMembership = ({ collectionSlug, tenantFieldName, tenantsArrayFieldName, tenantsArrayTenantFieldName, userHasAccessToAllTenants })=>({ data, originalDoc, req })=>{
|
|
15
|
+
if (!data || !(tenantFieldName in data)) {
|
|
16
|
+
return data;
|
|
17
|
+
}
|
|
18
|
+
if (!isValidTenantAssignment({
|
|
19
|
+
previousValue: originalDoc?.[tenantFieldName],
|
|
20
|
+
req,
|
|
21
|
+
tenantsArrayFieldName,
|
|
22
|
+
tenantsArrayTenantFieldName,
|
|
23
|
+
userHasAccessToAllTenants,
|
|
24
|
+
value: data[tenantFieldName]
|
|
25
|
+
})) {
|
|
26
|
+
throw new ValidationError({
|
|
27
|
+
collection: collectionSlug,
|
|
28
|
+
errors: [
|
|
29
|
+
{
|
|
30
|
+
message: req.t('validation:invalidSelection'),
|
|
31
|
+
path: tenantFieldName
|
|
32
|
+
}
|
|
33
|
+
]
|
|
34
|
+
}, req.t);
|
|
35
|
+
}
|
|
36
|
+
return data;
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
//# sourceMappingURL=enforceTenantMembership.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/hooks/enforceTenantMembership.ts"],"sourcesContent":["import type { CollectionBeforeValidateHook, CollectionConfig } from 'payload'\n\nimport { ValidationError } from 'payload'\n\nimport type { MultiTenantPluginConfig } from '../types.js'\n\nimport { isValidTenantAssignment } from '../utilities/isValidTenantAssignment.js'\n\ntype Args = {\n collection: CollectionConfig\n tenantFieldName: string\n tenantsArrayFieldName: string\n tenantsArrayTenantFieldName: string\n userHasAccessToAllTenants: Required<MultiTenantPluginConfig>['userHasAccessToAllTenants']\n}\n\nexport const addCollectionBeforeValidateHook = ({\n collection,\n tenantFieldName,\n tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n userHasAccessToAllTenants,\n}: Args) => {\n collection.hooks ??= {}\n collection.hooks.beforeValidate ??= []\n collection.hooks.beforeValidate.push(\n enforceTenantMembership({\n collectionSlug: collection.slug,\n tenantFieldName,\n tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n userHasAccessToAllTenants,\n }),\n )\n}\n\nexport const enforceTenantMembership =\n ({\n collectionSlug,\n tenantFieldName,\n tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n userHasAccessToAllTenants,\n }: { collectionSlug: string } & Omit<Args, 'collection'>): CollectionBeforeValidateHook =>\n ({ data, originalDoc, req }) => {\n if (!data || !(tenantFieldName in data)) {\n return data\n }\n\n if (\n !isValidTenantAssignment({\n previousValue: originalDoc?.[tenantFieldName],\n req,\n tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n userHasAccessToAllTenants,\n value: (data as Record<string, unknown>)[tenantFieldName],\n })\n ) {\n throw new ValidationError(\n {\n collection: collectionSlug,\n errors: [{ message: req.t('validation:invalidSelection'), path: tenantFieldName }],\n },\n req.t,\n )\n }\n\n return data\n }\n"],"names":["ValidationError","isValidTenantAssignment","addCollectionBeforeValidateHook","collection","tenantFieldName","tenantsArrayFieldName","tenantsArrayTenantFieldName","userHasAccessToAllTenants","hooks","beforeValidate","push","enforceTenantMembership","collectionSlug","slug","data","originalDoc","req","previousValue","value","errors","message","t","path"],"mappings":"AAEA,SAASA,eAAe,QAAQ,UAAS;AAIzC,SAASC,uBAAuB,QAAQ,0CAAyC;AAUjF,OAAO,MAAMC,kCAAkC,CAAC,EAC9CC,UAAU,EACVC,eAAe,EACfC,qBAAqB,EACrBC,2BAA2B,EAC3BC,yBAAyB,EACpB;IACLJ,WAAWK,KAAK,KAAK,CAAC;IACtBL,WAAWK,KAAK,CAACC,cAAc,KAAK,EAAE;IACtCN,WAAWK,KAAK,CAACC,cAAc,CAACC,IAAI,CAClCC,wBAAwB;QACtBC,gBAAgBT,WAAWU,IAAI;QAC/BT;QACAC;QACAC;QACAC;IACF;AAEJ,EAAC;AAED,OAAO,MAAMI,0BACX,CAAC,EACCC,cAAc,EACdR,eAAe,EACfC,qBAAqB,EACrBC,2BAA2B,EAC3BC,yBAAyB,EAC6B,GACxD,CAAC,EAAEO,IAAI,EAAEC,WAAW,EAAEC,GAAG,EAAE;QACzB,IAAI,CAACF,QAAQ,CAAEV,CAAAA,mBAAmBU,IAAG,GAAI;YACvC,OAAOA;QACT;QAEA,IACE,CAACb,wBAAwB;YACvBgB,eAAeF,aAAa,CAACX,gBAAgB;YAC7CY;YACAX;YACAC;YACAC;YACAW,OAAO,AAACJ,IAAgC,CAACV,gBAAgB;QAC3D,IACA;YACA,MAAM,IAAIJ,gBACR;gBACEG,YAAYS;gBACZO,QAAQ;oBAAC;wBAAEC,SAASJ,IAAIK,CAAC,CAAC;wBAAgCC,MAAMlB;oBAAgB;iBAAE;YACpF,GACAY,IAAIK,CAAC;QAET;QAEA,OAAOP;IACT,EAAC"}
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAA;AAezD,eAAO,MAAM,iBAAiB,gEA6b5B,CAAA"}
|