@payloadcms/plugin-multi-tenant 3.57.0-internal.266049e → 3.57.0-internal.36ffe2b
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/TenantField/index.client.d.ts +1 -1
- package/dist/components/TenantField/index.client.d.ts.map +1 -1
- package/dist/components/TenantField/index.client.js +110 -135
- package/dist/components/TenantField/index.client.js.map +1 -1
- package/dist/components/TenantField/index.scss +0 -4
- package/dist/exports/client.d.ts +0 -1
- package/dist/exports/client.d.ts.map +1 -1
- package/dist/exports/client.js +0 -1
- package/dist/exports/client.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -9
- package/dist/index.js.map +1 -1
- package/dist/translations/index.d.ts.map +1 -1
- package/dist/translations/index.js +0 -2
- package/dist/translations/index.js.map +1 -1
- package/dist/translations/languages/ar.d.ts.map +1 -1
- package/dist/translations/languages/ar.js +2 -2
- package/dist/translations/languages/ar.js.map +1 -1
- package/dist/translations/languages/az.d.ts.map +1 -1
- package/dist/translations/languages/az.js +2 -2
- package/dist/translations/languages/az.js.map +1 -1
- package/dist/translations/languages/bg.d.ts.map +1 -1
- package/dist/translations/languages/bg.js +2 -2
- package/dist/translations/languages/bg.js.map +1 -1
- package/dist/translations/languages/bnBd.d.ts.map +1 -1
- package/dist/translations/languages/bnBd.js +4 -4
- package/dist/translations/languages/bnBd.js.map +1 -1
- package/dist/translations/languages/bnIn.d.ts.map +1 -1
- package/dist/translations/languages/bnIn.js +3 -3
- package/dist/translations/languages/bnIn.js.map +1 -1
- package/dist/translations/languages/ca.d.ts.map +1 -1
- package/dist/translations/languages/ca.js +2 -2
- package/dist/translations/languages/ca.js.map +1 -1
- package/dist/translations/languages/cs.d.ts.map +1 -1
- package/dist/translations/languages/cs.js +2 -2
- package/dist/translations/languages/cs.js.map +1 -1
- package/dist/translations/languages/da.d.ts.map +1 -1
- package/dist/translations/languages/da.js +2 -2
- package/dist/translations/languages/da.js.map +1 -1
- package/dist/translations/languages/de.d.ts.map +1 -1
- package/dist/translations/languages/de.js +2 -2
- package/dist/translations/languages/de.js.map +1 -1
- package/dist/translations/languages/en.d.ts +2 -2
- package/dist/translations/languages/en.d.ts.map +1 -1
- package/dist/translations/languages/en.js +3 -3
- package/dist/translations/languages/en.js.map +1 -1
- package/dist/translations/languages/es.d.ts.map +1 -1
- package/dist/translations/languages/es.js +2 -2
- package/dist/translations/languages/es.js.map +1 -1
- package/dist/translations/languages/et.d.ts.map +1 -1
- package/dist/translations/languages/et.js +2 -2
- package/dist/translations/languages/et.js.map +1 -1
- package/dist/translations/languages/fa.d.ts.map +1 -1
- package/dist/translations/languages/fa.js +2 -2
- package/dist/translations/languages/fa.js.map +1 -1
- package/dist/translations/languages/fr.d.ts.map +1 -1
- package/dist/translations/languages/fr.js +2 -2
- package/dist/translations/languages/fr.js.map +1 -1
- package/dist/translations/languages/he.d.ts.map +1 -1
- package/dist/translations/languages/he.js +2 -2
- package/dist/translations/languages/he.js.map +1 -1
- package/dist/translations/languages/hr.d.ts.map +1 -1
- package/dist/translations/languages/hr.js +2 -2
- package/dist/translations/languages/hr.js.map +1 -1
- package/dist/translations/languages/hu.d.ts.map +1 -1
- package/dist/translations/languages/hu.js +2 -2
- package/dist/translations/languages/hu.js.map +1 -1
- package/dist/translations/languages/hy.d.ts.map +1 -1
- package/dist/translations/languages/hy.js +2 -2
- package/dist/translations/languages/hy.js.map +1 -1
- package/dist/translations/languages/id.d.ts.map +1 -1
- package/dist/translations/languages/id.js +3 -3
- package/dist/translations/languages/id.js.map +1 -1
- package/dist/translations/languages/it.d.ts.map +1 -1
- package/dist/translations/languages/it.js +2 -2
- package/dist/translations/languages/it.js.map +1 -1
- package/dist/translations/languages/ja.d.ts.map +1 -1
- package/dist/translations/languages/ja.js +2 -2
- package/dist/translations/languages/ja.js.map +1 -1
- package/dist/translations/languages/ko.d.ts.map +1 -1
- package/dist/translations/languages/ko.js +2 -2
- package/dist/translations/languages/ko.js.map +1 -1
- package/dist/translations/languages/lt.d.ts.map +1 -1
- package/dist/translations/languages/lt.js +2 -2
- package/dist/translations/languages/lt.js.map +1 -1
- package/dist/translations/languages/lv.d.ts.map +1 -1
- package/dist/translations/languages/lv.js +4 -4
- package/dist/translations/languages/lv.js.map +1 -1
- package/dist/translations/languages/my.d.ts.map +1 -1
- package/dist/translations/languages/my.js +2 -2
- package/dist/translations/languages/my.js.map +1 -1
- package/dist/translations/languages/nb.d.ts.map +1 -1
- package/dist/translations/languages/nb.js +4 -4
- package/dist/translations/languages/nb.js.map +1 -1
- package/dist/translations/languages/nl.d.ts.map +1 -1
- package/dist/translations/languages/nl.js +2 -2
- package/dist/translations/languages/nl.js.map +1 -1
- package/dist/translations/languages/pl.d.ts.map +1 -1
- package/dist/translations/languages/pl.js +2 -2
- package/dist/translations/languages/pl.js.map +1 -1
- package/dist/translations/languages/pt.d.ts.map +1 -1
- package/dist/translations/languages/pt.js +2 -2
- package/dist/translations/languages/pt.js.map +1 -1
- package/dist/translations/languages/ro.d.ts.map +1 -1
- package/dist/translations/languages/ro.js +2 -2
- package/dist/translations/languages/ro.js.map +1 -1
- package/dist/translations/languages/rs.d.ts.map +1 -1
- package/dist/translations/languages/rs.js +2 -2
- package/dist/translations/languages/rs.js.map +1 -1
- package/dist/translations/languages/rsLatin.d.ts.map +1 -1
- package/dist/translations/languages/rsLatin.js +2 -2
- package/dist/translations/languages/rsLatin.js.map +1 -1
- package/dist/translations/languages/ru.d.ts.map +1 -1
- package/dist/translations/languages/ru.js +2 -2
- package/dist/translations/languages/ru.js.map +1 -1
- package/dist/translations/languages/sk.d.ts.map +1 -1
- package/dist/translations/languages/sk.js +2 -2
- package/dist/translations/languages/sk.js.map +1 -1
- package/dist/translations/languages/sl.d.ts.map +1 -1
- package/dist/translations/languages/sl.js +2 -2
- package/dist/translations/languages/sl.js.map +1 -1
- package/dist/translations/languages/sv.d.ts.map +1 -1
- package/dist/translations/languages/sv.js +2 -2
- package/dist/translations/languages/sv.js.map +1 -1
- package/dist/translations/languages/th.d.ts.map +1 -1
- package/dist/translations/languages/th.js +2 -2
- package/dist/translations/languages/th.js.map +1 -1
- package/dist/translations/languages/tr.d.ts.map +1 -1
- package/dist/translations/languages/tr.js +2 -2
- package/dist/translations/languages/tr.js.map +1 -1
- package/dist/translations/languages/uk.d.ts.map +1 -1
- package/dist/translations/languages/uk.js +2 -2
- package/dist/translations/languages/uk.js.map +1 -1
- package/dist/translations/languages/vi.d.ts.map +1 -1
- package/dist/translations/languages/vi.js +2 -2
- package/dist/translations/languages/vi.js.map +1 -1
- package/dist/translations/languages/zh.d.ts.map +1 -1
- package/dist/translations/languages/zh.js +2 -2
- package/dist/translations/languages/zh.js.map +1 -1
- package/dist/translations/languages/zhTw.d.ts.map +1 -1
- package/dist/translations/languages/zhTw.js +2 -2
- package/dist/translations/languages/zhTw.js.map +1 -1
- package/dist/translations/types.d.ts +2 -2
- package/dist/translations/types.d.ts.map +1 -1
- package/dist/translations/types.js.map +1 -1
- package/dist/types.d.ts +6 -12
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +6 -6
- package/dist/components/AssignTenantFieldModal/index.client.d.ts +0 -12
- package/dist/components/AssignTenantFieldModal/index.client.d.ts.map +0 -1
- package/dist/components/AssignTenantFieldModal/index.client.js +0 -133
- package/dist/components/AssignTenantFieldModal/index.client.js.map +0 -1
- package/dist/components/AssignTenantFieldModal/index.scss +0 -78
- package/dist/translations/languages/is.d.ts +0 -4
- package/dist/translations/languages/is.d.ts.map +0 -1
- package/dist/translations/languages/is.js +0 -14
- package/dist/translations/languages/is.js.map +0 -1
- package/dist/translations/languages/ta.d.ts +0 -4
- package/dist/translations/languages/ta.d.ts.map +0 -1
- package/dist/translations/languages/ta.js +0 -14
- package/dist/translations/languages/ta.js.map +0 -1
|
@@ -5,6 +5,6 @@ type Props = {
|
|
|
5
5
|
debug?: boolean;
|
|
6
6
|
unique?: boolean;
|
|
7
7
|
} & RelationshipFieldClientProps;
|
|
8
|
-
export declare const TenantField: (
|
|
8
|
+
export declare const TenantField: (args: Props) => React.JSX.Element | null;
|
|
9
9
|
export {};
|
|
10
10
|
//# sourceMappingURL=index.client.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.client.d.ts","sourceRoot":"","sources":["../../../src/components/TenantField/index.client.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,4BAA4B,
|
|
1
|
+
{"version":3,"file":"index.client.d.ts","sourceRoot":"","sources":["../../../src/components/TenantField/index.client.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,4BAA4B,EAAe,MAAM,SAAS,CAAA;AAaxE,OAAO,KAAK,MAAM,OAAO,CAAA;AAOzB,OAAO,cAAc,CAAA;AAKrB,KAAK,KAAK,GAAG;IACX,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,MAAM,CAAC,EAAE,OAAO,CAAA;CACjB,GAAG,4BAA4B,CAAA;AAEhC,eAAO,MAAM,WAAW,SAAU,KAAK,6BAgDtC,CAAA"}
|
|
@@ -1,85 +1,21 @@
|
|
|
1
1
|
'use client';
|
|
2
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
-
import {
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
|
+
import { getTranslation } from '@payloadcms/translations';
|
|
4
|
+
import { ConfirmationModal, RelationshipField, Translation, useField, useForm, useFormModified, useModal, useTranslation } from '@payloadcms/ui';
|
|
4
5
|
import React from 'react';
|
|
5
|
-
import { useTenantSelection } from '../../providers/TenantSelectionProvider/index.client.js';
|
|
6
|
-
import { AssignTenantFieldModal, assignTenantModalSlug } from '../AssignTenantFieldModal/index.client.js';
|
|
7
6
|
import './index.scss';
|
|
7
|
+
import { useTenantSelection } from '../../providers/TenantSelectionProvider/index.client.js';
|
|
8
8
|
const baseClass = 'tenantField';
|
|
9
|
-
export const TenantField = (
|
|
9
|
+
export const TenantField = (args)=>{
|
|
10
10
|
const { entityType, options, selectedTenantID, setEntityType, setTenant } = useTenantSelection();
|
|
11
|
-
const {
|
|
12
|
-
const modified = useFormModified();
|
|
13
|
-
const { isValid: isFormValid, setModified } = useForm();
|
|
14
|
-
const { id: docID } = useDocumentInfo();
|
|
15
|
-
const { openModal } = useModal();
|
|
16
|
-
const isConfirmingRef = React.useRef(false);
|
|
17
|
-
const prevModified = React.useRef(modified);
|
|
18
|
-
const prevValue = React.useRef(value);
|
|
19
|
-
const showField = options.length > 1 && !fieldArgs.field.admin?.hidden && !fieldArgs.field.hidden || debug;
|
|
20
|
-
const onConfirm = React.useCallback(()=>{
|
|
21
|
-
isConfirmingRef.current = true;
|
|
22
|
-
}, []);
|
|
23
|
-
const afterModalOpen = React.useCallback(()=>{
|
|
24
|
-
prevModified.current = modified;
|
|
25
|
-
prevValue.current = value;
|
|
26
|
-
}, [
|
|
27
|
-
modified,
|
|
28
|
-
value
|
|
29
|
-
]);
|
|
30
|
-
const afterModalClose = React.useCallback(()=>{
|
|
31
|
-
let didChange = true;
|
|
32
|
-
if (isConfirmingRef.current) {
|
|
33
|
-
// did the values actually change?
|
|
34
|
-
if (fieldArgs.field.hasMany) {
|
|
35
|
-
const prev = prevValue.current || [];
|
|
36
|
-
const newValue = value || [];
|
|
37
|
-
if (prev.length !== newValue.length) {
|
|
38
|
-
didChange = true;
|
|
39
|
-
} else {
|
|
40
|
-
const allMatch = newValue.every((val)=>prev.includes(val));
|
|
41
|
-
if (allMatch) {
|
|
42
|
-
didChange = false;
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
} else if (value === prevValue.current) {
|
|
46
|
-
didChange = false;
|
|
47
|
-
}
|
|
48
|
-
if (didChange) {
|
|
49
|
-
prevModified.current = true;
|
|
50
|
-
prevValue.current = value;
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
setValue(prevValue.current, true);
|
|
54
|
-
setModified(prevModified.current);
|
|
55
|
-
isConfirmingRef.current = false;
|
|
56
|
-
}, [
|
|
57
|
-
setValue,
|
|
58
|
-
setModified,
|
|
59
|
-
value,
|
|
60
|
-
fieldArgs.field.hasMany
|
|
61
|
-
]);
|
|
11
|
+
const { value } = useField();
|
|
62
12
|
React.useEffect(()=>{
|
|
63
13
|
if (!entityType) {
|
|
64
|
-
setEntityType(unique ? 'global' : 'document');
|
|
14
|
+
setEntityType(args.unique ? 'global' : 'document');
|
|
65
15
|
} else {
|
|
66
16
|
// unique documents are controlled from the global TenantSelector
|
|
67
|
-
if (!unique && value) {
|
|
68
|
-
if (
|
|
69
|
-
if (value.length) {
|
|
70
|
-
if (!selectedTenantID) {
|
|
71
|
-
setTenant({
|
|
72
|
-
id: value[0],
|
|
73
|
-
refresh: false
|
|
74
|
-
});
|
|
75
|
-
} else if (!value.includes(selectedTenantID)) {
|
|
76
|
-
setTenant({
|
|
77
|
-
id: value[0],
|
|
78
|
-
refresh: false
|
|
79
|
-
});
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
} else if (selectedTenantID !== value) {
|
|
17
|
+
if (!args.unique && value) {
|
|
18
|
+
if (!selectedTenantID || value !== selectedTenantID) {
|
|
83
19
|
setTenant({
|
|
84
20
|
id: value,
|
|
85
21
|
refresh: false
|
|
@@ -93,7 +29,7 @@ export const TenantField = ({ debug, unique, ...fieldArgs })=>{
|
|
|
93
29
|
}
|
|
94
30
|
};
|
|
95
31
|
}, [
|
|
96
|
-
unique,
|
|
32
|
+
args.unique,
|
|
97
33
|
options,
|
|
98
34
|
selectedTenantID,
|
|
99
35
|
setTenant,
|
|
@@ -101,74 +37,113 @@ export const TenantField = ({ debug, unique, ...fieldArgs })=>{
|
|
|
101
37
|
setEntityType,
|
|
102
38
|
entityType
|
|
103
39
|
]);
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
40
|
+
if (options.length > 1 && !args.field.admin?.hidden && !args.field.hidden) {
|
|
41
|
+
return /*#__PURE__*/ _jsxs(_Fragment, {
|
|
42
|
+
children: [
|
|
43
|
+
/*#__PURE__*/ _jsx("div", {
|
|
44
|
+
className: baseClass,
|
|
45
|
+
children: /*#__PURE__*/ _jsx("div", {
|
|
46
|
+
className: `${baseClass}__wrapper`,
|
|
47
|
+
children: /*#__PURE__*/ _jsx(RelationshipField, {
|
|
48
|
+
...args,
|
|
49
|
+
field: {
|
|
50
|
+
...args.field,
|
|
51
|
+
required: true
|
|
52
|
+
},
|
|
53
|
+
readOnly: args.readOnly || args.field.admin?.readOnly || args.unique
|
|
54
|
+
})
|
|
55
|
+
})
|
|
56
|
+
}),
|
|
57
|
+
args.unique ? /*#__PURE__*/ _jsx(SyncFormModified, {}) : /*#__PURE__*/ _jsx(ConfirmTenantChange, {
|
|
58
|
+
fieldLabel: args.field.label,
|
|
59
|
+
fieldPath: args.path
|
|
60
|
+
})
|
|
61
|
+
]
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
return null;
|
|
65
|
+
};
|
|
66
|
+
const confirmSwitchTenantSlug = 'confirm-switch-tenant';
|
|
67
|
+
const ConfirmTenantChange = ({ fieldLabel, fieldPath })=>{
|
|
68
|
+
const { options, selectedTenantID, setTenant } = useTenantSelection();
|
|
69
|
+
const { setValue: setTenantFormValue, value: tenantFormValue } = useField({
|
|
70
|
+
path: fieldPath
|
|
71
|
+
});
|
|
72
|
+
const { setModified } = useForm();
|
|
73
|
+
const modified = useFormModified();
|
|
74
|
+
const { i18n, t } = useTranslation();
|
|
75
|
+
const { isModalOpen, openModal } = useModal();
|
|
76
|
+
const prevTenantValueRef = React.useRef(tenantFormValue || null);
|
|
77
|
+
const [tenantToConfirm, setTenantToConfirm] = React.useState(tenantFormValue || null);
|
|
78
|
+
const fromTenantOption = React.useMemo(()=>{
|
|
79
|
+
if (tenantFormValue) {
|
|
80
|
+
return options.find((option)=>option.value === tenantFormValue);
|
|
107
81
|
}
|
|
108
|
-
|
|
109
|
-
|
|
82
|
+
return undefined;
|
|
83
|
+
}, [
|
|
84
|
+
options,
|
|
85
|
+
tenantFormValue
|
|
86
|
+
]);
|
|
87
|
+
const toTenantOption = React.useMemo(()=>{
|
|
88
|
+
if (tenantToConfirm) {
|
|
89
|
+
return options.find((option)=>option.value === tenantToConfirm);
|
|
110
90
|
}
|
|
91
|
+
return undefined;
|
|
111
92
|
}, [
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
93
|
+
options,
|
|
94
|
+
tenantToConfirm
|
|
95
|
+
]);
|
|
96
|
+
const modalIsOpen = isModalOpen(confirmSwitchTenantSlug);
|
|
97
|
+
const testRef = React.useRef(false);
|
|
98
|
+
React.useEffect(()=>{
|
|
99
|
+
// the form value changed
|
|
100
|
+
if (!modalIsOpen && tenantFormValue && prevTenantValueRef.current && tenantFormValue !== prevTenantValueRef.current) {
|
|
101
|
+
// revert the form value change temporarily
|
|
102
|
+
setTenantFormValue(prevTenantValueRef.current, true);
|
|
103
|
+
// save the tenant to confirm in modal
|
|
104
|
+
setTenantToConfirm(tenantFormValue);
|
|
105
|
+
// open confirmation modal
|
|
106
|
+
openModal(confirmSwitchTenantSlug);
|
|
107
|
+
}
|
|
108
|
+
}, [
|
|
109
|
+
tenantFormValue,
|
|
110
|
+
setTenantFormValue,
|
|
115
111
|
openModal,
|
|
116
|
-
|
|
117
|
-
docID,
|
|
112
|
+
setTenant,
|
|
118
113
|
selectedTenantID,
|
|
119
|
-
|
|
114
|
+
modalIsOpen,
|
|
115
|
+
modified
|
|
120
116
|
]);
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
117
|
+
return /*#__PURE__*/ _jsx(ConfirmationModal, {
|
|
118
|
+
body: /*#__PURE__*/ _jsx(Translation, {
|
|
119
|
+
elements: {
|
|
120
|
+
0: ({ children })=>{
|
|
121
|
+
return /*#__PURE__*/ _jsx("b", {
|
|
122
|
+
children: children
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
},
|
|
126
|
+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
127
|
+
// @ts-expect-error
|
|
128
|
+
i18nKey: "plugin-multi-tenant:confirm-modal-tenant-switch--body",
|
|
129
|
+
t: t,
|
|
130
|
+
variables: {
|
|
131
|
+
fromTenant: fromTenantOption?.label,
|
|
132
|
+
toTenant: toTenantOption?.label
|
|
133
|
+
}
|
|
134
|
+
}),
|
|
135
|
+
heading: t('plugin-multi-tenant:confirm-modal-tenant-switch--heading', {
|
|
136
|
+
tenantLabel: fieldLabel ? getTranslation(fieldLabel, i18n) : t('plugin-multi-tenant:nav-tenantSelector-label')
|
|
137
|
+
}),
|
|
138
|
+
modalSlug: confirmSwitchTenantSlug,
|
|
139
|
+
onCancel: ()=>{
|
|
140
|
+
setModified(testRef.current);
|
|
141
|
+
},
|
|
142
|
+
onConfirm: ()=>{
|
|
143
|
+
// set the form value to the tenant to confirm
|
|
144
|
+
prevTenantValueRef.current = tenantToConfirm;
|
|
145
|
+
setTenantFormValue(tenantToConfirm);
|
|
145
146
|
}
|
|
146
|
-
return /*#__PURE__*/ _jsx(SyncFormModified, {});
|
|
147
|
-
}
|
|
148
|
-
return null;
|
|
149
|
-
};
|
|
150
|
-
const TenantFieldInModal = ({ debug, fieldArgs, unique })=>{
|
|
151
|
-
return /*#__PURE__*/ _jsx("div", {
|
|
152
|
-
className: baseClass,
|
|
153
|
-
children: /*#__PURE__*/ _jsxs("div", {
|
|
154
|
-
className: `${baseClass}__wrapper`,
|
|
155
|
-
children: [
|
|
156
|
-
debug && /*#__PURE__*/ _jsx(Pill, {
|
|
157
|
-
className: `${baseClass}__debug-pill`,
|
|
158
|
-
pillStyle: "success",
|
|
159
|
-
size: "small",
|
|
160
|
-
children: "Multi-Tenant Debug Enabled"
|
|
161
|
-
}),
|
|
162
|
-
/*#__PURE__*/ _jsx(RelationshipField, {
|
|
163
|
-
...fieldArgs,
|
|
164
|
-
field: {
|
|
165
|
-
...fieldArgs.field,
|
|
166
|
-
required: true
|
|
167
|
-
},
|
|
168
|
-
readOnly: fieldArgs.readOnly || fieldArgs.field.admin?.readOnly || unique
|
|
169
|
-
})
|
|
170
|
-
]
|
|
171
|
-
})
|
|
172
147
|
});
|
|
173
148
|
};
|
|
174
149
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/TenantField/index.client.tsx"],"sourcesContent":["'use client'\n\nimport type { RelationshipFieldClientProps } from 'payload'\n\nimport {\n
|
|
1
|
+
{"version":3,"sources":["../../../src/components/TenantField/index.client.tsx"],"sourcesContent":["'use client'\n\nimport type { RelationshipFieldClientProps, StaticLabel } from 'payload'\n\nimport { getTranslation } from '@payloadcms/translations'\nimport {\n ConfirmationModal,\n RelationshipField,\n Translation,\n useField,\n useForm,\n useFormModified,\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 './index.scss'\nimport { useTenantSelection } from '../../providers/TenantSelectionProvider/index.client.js'\n\nconst baseClass = 'tenantField'\n\ntype Props = {\n debug?: boolean\n unique?: boolean\n} & RelationshipFieldClientProps\n\nexport const TenantField = (args: Props) => {\n const { entityType, options, selectedTenantID, setEntityType, setTenant } = useTenantSelection()\n const { value } = useField<number | string>()\n\n React.useEffect(() => {\n if (!entityType) {\n setEntityType(args.unique ? 'global' : 'document')\n } else {\n // unique documents are controlled from the global TenantSelector\n if (!args.unique && value) {\n if (!selectedTenantID || value !== selectedTenantID) {\n setTenant({ id: value, refresh: false })\n }\n }\n }\n\n return () => {\n if (entityType) {\n setEntityType(undefined)\n }\n }\n }, [args.unique, options, selectedTenantID, setTenant, value, setEntityType, entityType])\n\n if (options.length > 1 && !args.field.admin?.hidden && !args.field.hidden) {\n return (\n <>\n <div className={baseClass}>\n <div className={`${baseClass}__wrapper`}>\n <RelationshipField\n {...args}\n field={{\n ...args.field,\n required: true,\n }}\n readOnly={args.readOnly || args.field.admin?.readOnly || args.unique}\n />\n </div>\n </div>\n {args.unique ? (\n <SyncFormModified />\n ) : (\n <ConfirmTenantChange fieldLabel={args.field.label} fieldPath={args.path} />\n )}\n </>\n )\n }\n\n return null\n}\n\nconst confirmSwitchTenantSlug = 'confirm-switch-tenant'\n\nconst ConfirmTenantChange = ({\n fieldLabel,\n fieldPath,\n}: {\n fieldLabel?: StaticLabel\n fieldPath: string\n}) => {\n const { options, selectedTenantID, setTenant } = useTenantSelection()\n const { setValue: setTenantFormValue, value: tenantFormValue } = useField<null | number | string>(\n { path: fieldPath },\n )\n const { setModified } = useForm()\n const modified = useFormModified()\n const { i18n, t } = useTranslation<\n PluginMultiTenantTranslations,\n PluginMultiTenantTranslationKeys\n >()\n const { isModalOpen, openModal } = useModal()\n\n const prevTenantValueRef = React.useRef<null | number | string>(tenantFormValue || null)\n const [tenantToConfirm, setTenantToConfirm] = React.useState<null | number | string>(\n tenantFormValue || null,\n )\n\n const fromTenantOption = React.useMemo(() => {\n if (tenantFormValue) {\n return options.find((option) => option.value === tenantFormValue)\n }\n return undefined\n }, [options, tenantFormValue])\n\n const toTenantOption = React.useMemo(() => {\n if (tenantToConfirm) {\n return options.find((option) => option.value === tenantToConfirm)\n }\n return undefined\n }, [options, tenantToConfirm])\n\n const modalIsOpen = isModalOpen(confirmSwitchTenantSlug)\n const testRef = React.useRef<boolean>(false)\n\n React.useEffect(() => {\n // the form value changed\n if (\n !modalIsOpen &&\n tenantFormValue &&\n prevTenantValueRef.current &&\n tenantFormValue !== prevTenantValueRef.current\n ) {\n // revert the form value change temporarily\n setTenantFormValue(prevTenantValueRef.current, true)\n // save the tenant to confirm in modal\n setTenantToConfirm(tenantFormValue)\n // open confirmation modal\n openModal(confirmSwitchTenantSlug)\n }\n }, [\n tenantFormValue,\n setTenantFormValue,\n openModal,\n setTenant,\n selectedTenantID,\n modalIsOpen,\n modified,\n ])\n\n return (\n <ConfirmationModal\n body={\n <Translation\n elements={{\n 0: ({ children }) => {\n return <b>{children}</b>\n },\n }}\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-expect-error\n i18nKey=\"plugin-multi-tenant:confirm-modal-tenant-switch--body\"\n t={t}\n variables={{\n fromTenant: fromTenantOption?.label,\n toTenant: toTenantOption?.label,\n }}\n />\n }\n heading={t('plugin-multi-tenant:confirm-modal-tenant-switch--heading', {\n tenantLabel: fieldLabel\n ? getTranslation(fieldLabel, i18n)\n : t('plugin-multi-tenant:nav-tenantSelector-label'),\n })}\n modalSlug={confirmSwitchTenantSlug}\n onCancel={() => {\n setModified(testRef.current)\n }}\n onConfirm={() => {\n // set the form value to the tenant to confirm\n prevTenantValueRef.current = tenantToConfirm\n setTenantFormValue(tenantToConfirm)\n }}\n />\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":["getTranslation","ConfirmationModal","RelationshipField","Translation","useField","useForm","useFormModified","useModal","useTranslation","React","useTenantSelection","baseClass","TenantField","args","entityType","options","selectedTenantID","setEntityType","setTenant","value","useEffect","unique","id","refresh","undefined","length","field","admin","hidden","div","className","required","readOnly","SyncFormModified","ConfirmTenantChange","fieldLabel","label","fieldPath","path","confirmSwitchTenantSlug","setValue","setTenantFormValue","tenantFormValue","setModified","modified","i18n","t","isModalOpen","openModal","prevTenantValueRef","useRef","tenantToConfirm","setTenantToConfirm","useState","fromTenantOption","useMemo","find","option","toTenantOption","modalIsOpen","testRef","current","body","elements","children","b","i18nKey","variables","fromTenant","toTenant","heading","tenantLabel","modalSlug","onCancel","onConfirm"],"mappings":"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"}
|
package/dist/exports/client.d.ts
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
export { AssignTenantFieldTrigger } from '../components/AssignTenantFieldModal/index.client.js';
|
|
2
1
|
export { TenantField } from '../components/TenantField/index.client.js';
|
|
3
2
|
export { WatchTenantCollection } from '../components/WatchTenantCollection/index.js';
|
|
4
3
|
export { useTenantSelection } from '../providers/TenantSelectionProvider/index.client.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/exports/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
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,qBAAqB,EAAE,MAAM,8CAA8C,CAAA;AACpF,OAAO,EAAE,kBAAkB,EAAE,MAAM,sDAAsD,CAAA"}
|
package/dist/exports/client.js
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
export { AssignTenantFieldTrigger } from '../components/AssignTenantFieldModal/index.client.js';
|
|
2
1
|
export { TenantField } from '../components/TenantField/index.client.js';
|
|
3
2
|
export { WatchTenantCollection } from '../components/WatchTenantCollection/index.js';
|
|
4
3
|
export { useTenantSelection } from '../providers/TenantSelectionProvider/index.client.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/exports/client.ts"],"sourcesContent":["export {
|
|
1
|
+
{"version":3,"sources":["../../src/exports/client.ts"],"sourcesContent":["export { TenantField } from '../components/TenantField/index.client.js'\nexport { WatchTenantCollection } from '../components/WatchTenantCollection/index.js'\nexport { useTenantSelection } from '../providers/TenantSelectionProvider/index.client.js'\n"],"names":["TenantField","WatchTenantCollection","useTenantSelection"],"mappings":"AAAA,SAASA,WAAW,QAAQ,4CAA2C;AACvE,SAASC,qBAAqB,QAAQ,+CAA8C;AACpF,SAASC,kBAAkB,QAAQ,uDAAsD"}
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAoB,MAAM,EAAE,MAAM,SAAS,CAAA;AAKvD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAA;AAazD,eAAO,MAAM,iBAAiB,GAC3B,UAAU,gBAAgB,uBAAuB,CAAC,UAAU,CAAC,sBAC7C,MAAM,KAAG,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAoB,MAAM,EAAE,MAAM,SAAS,CAAA;AAKvD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAA;AAazD,eAAO,MAAM,iBAAiB,GAC3B,UAAU,gBAAgB,uBAAuB,CAAC,UAAU,CAAC,sBAC7C,MAAM,KAAG,MA0ezB,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -267,15 +267,6 @@ export const multiTenantPlugin = (pluginConfig)=>(incomingConfig)=>{
|
|
|
267
267
|
if (isGlobal) {
|
|
268
268
|
collection.disableDuplicate = true;
|
|
269
269
|
}
|
|
270
|
-
if (!pluginConfig.debug && !isGlobal) {
|
|
271
|
-
collection.admin ??= {};
|
|
272
|
-
collection.admin.components ??= {};
|
|
273
|
-
collection.admin.components.edit ??= {};
|
|
274
|
-
collection.admin.components.edit.editMenuItems ??= [];
|
|
275
|
-
collection.admin.components.edit.editMenuItems.push({
|
|
276
|
-
path: '@payloadcms/plugin-multi-tenant/client#AssignTenantFieldTrigger'
|
|
277
|
-
});
|
|
278
|
-
}
|
|
279
270
|
/**
|
|
280
271
|
* Add filter options to all relationship fields
|
|
281
272
|
*/ addFilterOptionsToFields({
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import type { AcceptedLanguages } from '@payloadcms/translations'\nimport type { CollectionConfig, Config } from 'payload'\n\nimport chalk from 'chalk'\n\nimport type { PluginDefaultTranslationsObject } from './translations/types.js'\nimport type { MultiTenantPluginConfig } from './types.js'\n\nimport { defaults } from './defaults.js'\nimport { getTenantOptionsEndpoint } from './endpoints/getTenantOptionsEndpoint.js'\nimport { tenantField } from './fields/tenantField/index.js'\nimport { tenantsArrayField } from './fields/tenantsArrayField/index.js'\nimport { filterDocumentsByTenants } from './filters/filterDocumentsByTenants.js'\nimport { addTenantCleanup } from './hooks/afterTenantDelete.js'\nimport { translations } from './translations/index.js'\nimport { addCollectionAccess } from './utilities/addCollectionAccess.js'\nimport { addFilterOptionsToFields } from './utilities/addFilterOptionsToFields.js'\nimport { combineFilters } from './utilities/combineFilters.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 const basePath = pluginConfig.basePath || defaults.basePath\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 adminUsersSlug: adminUsersCollection.slug,\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 const baseFilter =\n adminUsersCollection.admin?.baseFilter ?? adminUsersCollection.admin?.baseListFilter\n adminUsersCollection.admin.baseFilter = combineFilters({\n baseFilter,\n customFilter: (args) =>\n filterDocumentsByTenants<ConfigType>({\n filterFieldName: `${tenantsArrayFieldName}.${tenantsArrayTenantFieldName}`,\n req: args.req,\n tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n tenantsCollectionSlug,\n userHasAccessToAllTenants,\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 // used to track and not duplicate filterOptions on referenced blocks\n const blockReferencesWithFilters: string[] = []\n\n // used to validate enabled collection slugs\n const multiTenantCollectionsFound: string[] = []\n\n /**\n * The folders collection is added AFTER the plugin is initialized\n * so if they added the folder slug to the plugin collections,\n * we can assume that they have folders enabled\n */\n const foldersSlug = incomingConfig.folders\n ? incomingConfig.folders.slug || 'payload-folders'\n : 'payload-folders'\n\n if (collectionSlugs.includes(foldersSlug)) {\n multiTenantCollectionsFound.push(foldersSlug)\n incomingConfig.folders = incomingConfig.folders || {}\n incomingConfig.folders.collectionOverrides = incomingConfig.folders.collectionOverrides || []\n incomingConfig.folders.collectionOverrides.push(({ collection }) => {\n /**\n * Add filter options to all relationship fields\n */\n addFilterOptionsToFields({\n blockReferencesWithFilters,\n config: incomingConfig,\n fields: collection.fields,\n tenantEnabledCollectionSlugs: collectionSlugs,\n tenantEnabledGlobalSlugs: globalCollectionSlugs,\n tenantFieldName,\n tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n tenantsCollectionSlug,\n userHasAccessToAllTenants,\n })\n\n if (pluginConfig.collections[foldersSlug]?.customTenantField !== true) {\n /**\n * Add tenant field to enabled collections\n */\n collection.fields.unshift(\n tenantField({\n name: tenantFieldName,\n debug: pluginConfig.debug,\n overrides: pluginConfig.collections[collection.slug]?.tenantFieldOverrides\n ? pluginConfig.collections[collection.slug]?.tenantFieldOverrides\n : pluginConfig.tenantField || {},\n tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n tenantsCollectionSlug,\n unique: false,\n }),\n )\n }\n\n const { useBaseFilter, useBaseListFilter } = pluginConfig.collections[collection.slug] || {}\n if (useBaseFilter ?? useBaseListFilter ?? true) {\n /**\n * Add list filter to enabled collections\n * - filters results by selected tenant\n */\n collection.admin = collection.admin || {}\n collection.admin.baseFilter = combineFilters({\n baseFilter: collection.admin?.baseFilter ?? collection.admin?.baseListFilter,\n customFilter: (args) =>\n filterDocumentsByTenants<ConfigType>({\n filterFieldName: tenantFieldName,\n req: args.req,\n tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n tenantsCollectionSlug,\n userHasAccessToAllTenants,\n }),\n })\n }\n\n if (pluginConfig.collections[foldersSlug]?.useTenantAccess !== false) {\n /**\n * Add access control constraint to tenant enabled folders collection\n */\n addCollectionAccess({\n adminUsersSlug: adminUsersCollection.slug,\n collection,\n fieldName: tenantFieldName,\n tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n userHasAccessToAllTenants,\n })\n }\n\n return collection\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 adminUsersSlug: adminUsersCollection.slug,\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 const baseFilter = collection.admin?.baseFilter ?? collection.admin?.baseListFilter\n collection.admin.baseFilter = combineFilters({\n baseFilter,\n customFilter: (args) =>\n filterDocumentsByTenants({\n filterFieldName: 'id',\n req: args.req,\n tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n tenantsCollectionSlug,\n userHasAccessToAllTenants,\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\n /**\n * Add custom tenant field that watches and dispatches updates to the selector\n */\n collection.fields.push({\n name: '_watchTenant',\n type: 'ui',\n admin: {\n components: {\n Field: {\n path: '@payloadcms/plugin-multi-tenant/client#WatchTenantCollection',\n },\n },\n disableBulkEdit: true,\n disableListColumn: true,\n },\n })\n\n collection.endpoints = [\n ...(collection.endpoints || []),\n getTenantOptionsEndpoint({\n tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n tenantsCollectionSlug,\n useAsTitle: tenantCollection.admin?.useAsTitle || 'id',\n userHasAccessToAllTenants,\n }),\n ]\n } else if (pluginConfig.collections?.[collection.slug]) {\n multiTenantCollectionsFound.push(collection.slug)\n const isGlobal = Boolean(pluginConfig.collections[collection.slug]?.isGlobal)\n\n if (isGlobal) {\n collection.disableDuplicate = true\n }\n\n if (!pluginConfig.debug && !isGlobal) {\n collection.admin ??= {}\n collection.admin.components ??= {}\n collection.admin.components.edit ??= {}\n collection.admin.components.edit.editMenuItems ??= []\n collection.admin.components.edit.editMenuItems.push({\n path: '@payloadcms/plugin-multi-tenant/client#AssignTenantFieldTrigger',\n })\n }\n\n /**\n * Add filter options to all relationship fields\n */\n addFilterOptionsToFields({\n blockReferencesWithFilters,\n config: incomingConfig,\n fields: collection.fields,\n tenantEnabledCollectionSlugs: collectionSlugs,\n tenantEnabledGlobalSlugs: globalCollectionSlugs,\n tenantFieldName,\n tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n tenantsCollectionSlug,\n userHasAccessToAllTenants,\n })\n\n if (pluginConfig.collections[collection.slug]?.customTenantField !== true) {\n /**\n * Add tenant field to enabled collections\n */\n collection.fields.unshift(\n tenantField({\n name: tenantFieldName,\n debug: pluginConfig.debug,\n overrides: pluginConfig.collections[collection.slug]?.tenantFieldOverrides\n ? pluginConfig.collections[collection.slug]?.tenantFieldOverrides\n : pluginConfig.tenantField || {},\n tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n tenantsCollectionSlug,\n unique: isGlobal,\n }),\n )\n }\n\n const { useBaseFilter, useBaseListFilter } = pluginConfig.collections[collection.slug] || {}\n if (useBaseFilter ?? useBaseListFilter ?? true) {\n /**\n * Add list filter to enabled collections\n * - filters results by selected tenant\n */\n collection.admin = collection.admin || {}\n collection.admin.baseFilter = combineFilters({\n baseFilter: collection.admin?.baseFilter ?? collection.admin?.baseListFilter,\n customFilter: (args) =>\n filterDocumentsByTenants({\n filterFieldName: tenantFieldName,\n req: args.req,\n tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n tenantsCollectionSlug,\n userHasAccessToAllTenants,\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 adminUsersSlug: adminUsersCollection.slug,\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 if (\n multiTenantCollectionsFound.length !==\n collectionSlugs.length + globalCollectionSlugs.length\n ) {\n const missingSlugs = [...collectionSlugs, ...globalCollectionSlugs].filter(\n (slug) => !multiTenantCollectionsFound.includes(slug),\n )\n // eslint-disable-next-line no-console\n console.error(\n chalk.yellow.bold('WARNING (plugin-multi-tenant)'),\n 'missing collections',\n missingSlugs,\n 'try placing the multi-tenant plugin after other plugins.',\n )\n }\n\n /**\n * Add TenantSelectionProvider to admin providers\n */\n incomingConfig.admin.components.providers.push({\n clientProps: {\n tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n tenantsCollectionSlug: tenantCollection.slug,\n useAsTitle: tenantCollection.admin?.useAsTitle || 'id',\n userHasAccessToAllTenants,\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 basePath,\n globalSlugs: globalCollectionSlugs,\n tenantFieldName,\n tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n tenantsCollectionSlug,\n useAsTitle: tenantCollection.admin?.useAsTitle || 'id',\n userHasAccessToAllTenants,\n },\n })\n }\n\n /**\n * Add tenant selector to admin UI\n */\n incomingConfig.admin.components.beforeNavLinks.push({\n clientProps: {\n enabledSlugs: [\n ...collectionSlugs,\n ...globalCollectionSlugs,\n adminUsersCollection.slug,\n tenantCollection.slug,\n ],\n label: pluginConfig.tenantSelectorLabel || undefined,\n },\n path: '@payloadcms/plugin-multi-tenant/rsc#TenantSelector',\n })\n\n /**\n * Merge plugin translations\n */\n if (!incomingConfig.i18n) {\n incomingConfig.i18n = {}\n }\n Object.entries(translations).forEach(([locale, pluginI18nObject]) => {\n const typedLocale = locale as AcceptedLanguages\n if (!incomingConfig.i18n!.translations) {\n incomingConfig.i18n!.translations = {}\n }\n if (!(typedLocale in incomingConfig.i18n!.translations)) {\n incomingConfig.i18n!.translations[typedLocale] = {}\n }\n if (!('plugin-multi-tenant' in incomingConfig.i18n!.translations[typedLocale]!)) {\n ;(incomingConfig.i18n!.translations[typedLocale] as PluginDefaultTranslationsObject)[\n 'plugin-multi-tenant'\n ] = {} as PluginDefaultTranslationsObject['plugin-multi-tenant']\n }\n\n ;(incomingConfig.i18n!.translations[typedLocale] as PluginDefaultTranslationsObject)[\n 'plugin-multi-tenant'\n ] = {\n ...pluginI18nObject.translations['plugin-multi-tenant'],\n ...(pluginConfig.i18n?.translations?.[typedLocale] || {}),\n }\n })\n\n return incomingConfig\n }\n"],"names":["chalk","defaults","getTenantOptionsEndpoint","tenantField","tenantsArrayField","filterDocumentsByTenants","addTenantCleanup","translations","addCollectionAccess","addFilterOptionsToFields","combineFilters","multiTenantPlugin","pluginConfig","incomingConfig","enabled","userHasAccessToAllTenants","tenantsCollectionSlug","tenantsSlug","tenantCollectionSlug","tenantFieldName","name","tenantsArrayFieldName","arrayFieldName","tenantsArrayTenantFieldName","arrayTenantFieldName","basePath","admin","components","actions","beforeNavLinks","providers","collections","adminUsersCollection","find","slug","auth","user","Error","includeDefaultField","fields","push","adminUsersSlug","collection","fieldName","useUsersTenantFilter","baseFilter","baseListFilter","customFilter","args","filterFieldName","req","tenantCollection","collectionSlugs","globalCollectionSlugs","Object","keys","reduce","acc","isGlobal","blockReferencesWithFilters","multiTenantCollectionsFound","foldersSlug","folders","includes","collectionOverrides","config","tenantEnabledCollectionSlugs","tenantEnabledGlobalSlugs","customTenantField","unshift","debug","overrides","tenantFieldOverrides","unique","useBaseFilter","useBaseListFilter","useTenantAccess","forEach","useTenantsCollectionAccess","useTenantsListFilter","cleanupAfterTenantDelete","enabledSlugs","usersSlug","usersTenantsArrayFieldName","usersTenantsArrayTenantFieldName","type","Field","path","disableBulkEdit","disableListColumn","endpoints","useAsTitle","Boolean","disableDuplicate","edit","editMenuItems","length","missingSlugs","filter","console","error","yellow","bold","clientProps","serverProps","globalSlugs","label","tenantSelectorLabel","undefined","i18n","entries","locale","pluginI18nObject","typedLocale"],"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 chalk from 'chalk'\n\nimport type { PluginDefaultTranslationsObject } from './translations/types.js'\nimport type { MultiTenantPluginConfig } from './types.js'\n\nimport { defaults } from './defaults.js'\nimport { getTenantOptionsEndpoint } from './endpoints/getTenantOptionsEndpoint.js'\nimport { tenantField } from './fields/tenantField/index.js'\nimport { tenantsArrayField } from './fields/tenantsArrayField/index.js'\nimport { filterDocumentsByTenants } from './filters/filterDocumentsByTenants.js'\nimport { addTenantCleanup } from './hooks/afterTenantDelete.js'\nimport { translations } from './translations/index.js'\nimport { addCollectionAccess } from './utilities/addCollectionAccess.js'\nimport { addFilterOptionsToFields } from './utilities/addFilterOptionsToFields.js'\nimport { combineFilters } from './utilities/combineFilters.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 const basePath = pluginConfig.basePath || defaults.basePath\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 adminUsersSlug: adminUsersCollection.slug,\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 const baseFilter =\n adminUsersCollection.admin?.baseFilter ?? adminUsersCollection.admin?.baseListFilter\n adminUsersCollection.admin.baseFilter = combineFilters({\n baseFilter,\n customFilter: (args) =>\n filterDocumentsByTenants<ConfigType>({\n filterFieldName: `${tenantsArrayFieldName}.${tenantsArrayTenantFieldName}`,\n req: args.req,\n tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n tenantsCollectionSlug,\n userHasAccessToAllTenants,\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 // used to track and not duplicate filterOptions on referenced blocks\n const blockReferencesWithFilters: string[] = []\n\n // used to validate enabled collection slugs\n const multiTenantCollectionsFound: string[] = []\n\n /**\n * The folders collection is added AFTER the plugin is initialized\n * so if they added the folder slug to the plugin collections,\n * we can assume that they have folders enabled\n */\n const foldersSlug = incomingConfig.folders\n ? incomingConfig.folders.slug || 'payload-folders'\n : 'payload-folders'\n\n if (collectionSlugs.includes(foldersSlug)) {\n multiTenantCollectionsFound.push(foldersSlug)\n incomingConfig.folders = incomingConfig.folders || {}\n incomingConfig.folders.collectionOverrides = incomingConfig.folders.collectionOverrides || []\n incomingConfig.folders.collectionOverrides.push(({ collection }) => {\n /**\n * Add filter options to all relationship fields\n */\n addFilterOptionsToFields({\n blockReferencesWithFilters,\n config: incomingConfig,\n fields: collection.fields,\n tenantEnabledCollectionSlugs: collectionSlugs,\n tenantEnabledGlobalSlugs: globalCollectionSlugs,\n tenantFieldName,\n tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n tenantsCollectionSlug,\n userHasAccessToAllTenants,\n })\n\n if (pluginConfig.collections[foldersSlug]?.customTenantField !== true) {\n /**\n * Add tenant field to enabled collections\n */\n collection.fields.unshift(\n tenantField({\n name: tenantFieldName,\n debug: pluginConfig.debug,\n overrides: pluginConfig.collections[collection.slug]?.tenantFieldOverrides\n ? pluginConfig.collections[collection.slug]?.tenantFieldOverrides\n : pluginConfig.tenantField || {},\n tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n tenantsCollectionSlug,\n unique: false,\n }),\n )\n }\n\n const { useBaseFilter, useBaseListFilter } = pluginConfig.collections[collection.slug] || {}\n if (useBaseFilter ?? useBaseListFilter ?? true) {\n /**\n * Add list filter to enabled collections\n * - filters results by selected tenant\n */\n collection.admin = collection.admin || {}\n collection.admin.baseFilter = combineFilters({\n baseFilter: collection.admin?.baseFilter ?? collection.admin?.baseListFilter,\n customFilter: (args) =>\n filterDocumentsByTenants<ConfigType>({\n filterFieldName: tenantFieldName,\n req: args.req,\n tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n tenantsCollectionSlug,\n userHasAccessToAllTenants,\n }),\n })\n }\n\n if (pluginConfig.collections[foldersSlug]?.useTenantAccess !== false) {\n /**\n * Add access control constraint to tenant enabled folders collection\n */\n addCollectionAccess({\n adminUsersSlug: adminUsersCollection.slug,\n collection,\n fieldName: tenantFieldName,\n tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n userHasAccessToAllTenants,\n })\n }\n\n return collection\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 adminUsersSlug: adminUsersCollection.slug,\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 const baseFilter = collection.admin?.baseFilter ?? collection.admin?.baseListFilter\n collection.admin.baseFilter = combineFilters({\n baseFilter,\n customFilter: (args) =>\n filterDocumentsByTenants({\n filterFieldName: 'id',\n req: args.req,\n tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n tenantsCollectionSlug,\n userHasAccessToAllTenants,\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\n /**\n * Add custom tenant field that watches and dispatches updates to the selector\n */\n collection.fields.push({\n name: '_watchTenant',\n type: 'ui',\n admin: {\n components: {\n Field: {\n path: '@payloadcms/plugin-multi-tenant/client#WatchTenantCollection',\n },\n },\n disableBulkEdit: true,\n disableListColumn: true,\n },\n })\n\n collection.endpoints = [\n ...(collection.endpoints || []),\n getTenantOptionsEndpoint({\n tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n tenantsCollectionSlug,\n useAsTitle: tenantCollection.admin?.useAsTitle || 'id',\n userHasAccessToAllTenants,\n }),\n ]\n } else if (pluginConfig.collections?.[collection.slug]) {\n multiTenantCollectionsFound.push(collection.slug)\n const isGlobal = Boolean(pluginConfig.collections[collection.slug]?.isGlobal)\n\n if (isGlobal) {\n collection.disableDuplicate = true\n }\n\n /**\n * Add filter options to all relationship fields\n */\n addFilterOptionsToFields({\n blockReferencesWithFilters,\n config: incomingConfig,\n fields: collection.fields,\n tenantEnabledCollectionSlugs: collectionSlugs,\n tenantEnabledGlobalSlugs: globalCollectionSlugs,\n tenantFieldName,\n tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n tenantsCollectionSlug,\n userHasAccessToAllTenants,\n })\n\n if (pluginConfig.collections[collection.slug]?.customTenantField !== true) {\n /**\n * Add tenant field to enabled collections\n */\n collection.fields.unshift(\n tenantField({\n name: tenantFieldName,\n debug: pluginConfig.debug,\n overrides: pluginConfig.collections[collection.slug]?.tenantFieldOverrides\n ? pluginConfig.collections[collection.slug]?.tenantFieldOverrides\n : pluginConfig.tenantField || {},\n tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n tenantsCollectionSlug,\n unique: isGlobal,\n }),\n )\n }\n\n const { useBaseFilter, useBaseListFilter } = pluginConfig.collections[collection.slug] || {}\n if (useBaseFilter ?? useBaseListFilter ?? true) {\n /**\n * Add list filter to enabled collections\n * - filters results by selected tenant\n */\n collection.admin = collection.admin || {}\n collection.admin.baseFilter = combineFilters({\n baseFilter: collection.admin?.baseFilter ?? collection.admin?.baseListFilter,\n customFilter: (args) =>\n filterDocumentsByTenants({\n filterFieldName: tenantFieldName,\n req: args.req,\n tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n tenantsCollectionSlug,\n userHasAccessToAllTenants,\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 adminUsersSlug: adminUsersCollection.slug,\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 if (\n multiTenantCollectionsFound.length !==\n collectionSlugs.length + globalCollectionSlugs.length\n ) {\n const missingSlugs = [...collectionSlugs, ...globalCollectionSlugs].filter(\n (slug) => !multiTenantCollectionsFound.includes(slug),\n )\n // eslint-disable-next-line no-console\n console.error(\n chalk.yellow.bold('WARNING (plugin-multi-tenant)'),\n 'missing collections',\n missingSlugs,\n 'try placing the multi-tenant plugin after other plugins.',\n )\n }\n\n /**\n * Add TenantSelectionProvider to admin providers\n */\n incomingConfig.admin.components.providers.push({\n clientProps: {\n tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n tenantsCollectionSlug: tenantCollection.slug,\n useAsTitle: tenantCollection.admin?.useAsTitle || 'id',\n userHasAccessToAllTenants,\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 basePath,\n globalSlugs: globalCollectionSlugs,\n tenantFieldName,\n tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n tenantsCollectionSlug,\n useAsTitle: tenantCollection.admin?.useAsTitle || 'id',\n userHasAccessToAllTenants,\n },\n })\n }\n\n /**\n * Add tenant selector to admin UI\n */\n incomingConfig.admin.components.beforeNavLinks.push({\n clientProps: {\n enabledSlugs: [\n ...collectionSlugs,\n ...globalCollectionSlugs,\n adminUsersCollection.slug,\n tenantCollection.slug,\n ],\n label: pluginConfig.tenantSelectorLabel || undefined,\n },\n path: '@payloadcms/plugin-multi-tenant/rsc#TenantSelector',\n })\n\n /**\n * Merge plugin translations\n */\n if (!incomingConfig.i18n) {\n incomingConfig.i18n = {}\n }\n Object.entries(translations).forEach(([locale, pluginI18nObject]) => {\n const typedLocale = locale as AcceptedLanguages\n if (!incomingConfig.i18n!.translations) {\n incomingConfig.i18n!.translations = {}\n }\n if (!(typedLocale in incomingConfig.i18n!.translations)) {\n incomingConfig.i18n!.translations[typedLocale] = {}\n }\n if (!('plugin-multi-tenant' in incomingConfig.i18n!.translations[typedLocale]!)) {\n ;(incomingConfig.i18n!.translations[typedLocale] as PluginDefaultTranslationsObject)[\n 'plugin-multi-tenant'\n ] = {} as PluginDefaultTranslationsObject['plugin-multi-tenant']\n }\n\n ;(incomingConfig.i18n!.translations[typedLocale] as PluginDefaultTranslationsObject)[\n 'plugin-multi-tenant'\n ] = {\n ...pluginI18nObject.translations['plugin-multi-tenant'],\n ...(pluginConfig.i18n?.translations?.[typedLocale] || {}),\n }\n })\n\n return incomingConfig\n }\n"],"names":["chalk","defaults","getTenantOptionsEndpoint","tenantField","tenantsArrayField","filterDocumentsByTenants","addTenantCleanup","translations","addCollectionAccess","addFilterOptionsToFields","combineFilters","multiTenantPlugin","pluginConfig","incomingConfig","enabled","userHasAccessToAllTenants","tenantsCollectionSlug","tenantsSlug","tenantCollectionSlug","tenantFieldName","name","tenantsArrayFieldName","arrayFieldName","tenantsArrayTenantFieldName","arrayTenantFieldName","basePath","admin","components","actions","beforeNavLinks","providers","collections","adminUsersCollection","find","slug","auth","user","Error","includeDefaultField","fields","push","adminUsersSlug","collection","fieldName","useUsersTenantFilter","baseFilter","baseListFilter","customFilter","args","filterFieldName","req","tenantCollection","collectionSlugs","globalCollectionSlugs","Object","keys","reduce","acc","isGlobal","blockReferencesWithFilters","multiTenantCollectionsFound","foldersSlug","folders","includes","collectionOverrides","config","tenantEnabledCollectionSlugs","tenantEnabledGlobalSlugs","customTenantField","unshift","debug","overrides","tenantFieldOverrides","unique","useBaseFilter","useBaseListFilter","useTenantAccess","forEach","useTenantsCollectionAccess","useTenantsListFilter","cleanupAfterTenantDelete","enabledSlugs","usersSlug","usersTenantsArrayFieldName","usersTenantsArrayTenantFieldName","type","Field","path","disableBulkEdit","disableListColumn","endpoints","useAsTitle","Boolean","disableDuplicate","length","missingSlugs","filter","console","error","yellow","bold","clientProps","serverProps","globalSlugs","label","tenantSelectorLabel","undefined","i18n","entries","locale","pluginI18nObject","typedLocale"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/translations/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,yBAAyB,EACzB,kBAAkB,EAClB,kBAAkB,EACnB,MAAM,0BAA0B,CAAA;AAEjC,OAAO,KAAK,EAAE,+BAA+B,EAAE,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/translations/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,yBAAyB,EACzB,kBAAkB,EAClB,kBAAkB,EACnB,MAAM,0BAA0B,CAAA;AAEjC,OAAO,KAAK,EAAE,+BAA+B,EAAE,MAAM,YAAY,CAAA;AAyCjE,eAAO,MAAM,YAAY,EAuCpB,kBAAkB,CAAC,+BAA+B,CAAC,CAAA;AAExD,MAAM,MAAM,6BAA6B,GAAG,yBAAyB,CAAA;AAErE,MAAM,MAAM,gCAAgC,GAAG,kBAAkB,CAAC,6BAA6B,CAAC,CAAA"}
|
|
@@ -30,7 +30,6 @@ import { ru } from './languages/ru.js';
|
|
|
30
30
|
import { sk } from './languages/sk.js';
|
|
31
31
|
import { sl } from './languages/sl.js';
|
|
32
32
|
import { sv } from './languages/sv.js';
|
|
33
|
-
import { ta } from './languages/ta.js';
|
|
34
33
|
import { th } from './languages/th.js';
|
|
35
34
|
import { tr } from './languages/tr.js';
|
|
36
35
|
import { uk } from './languages/uk.js';
|
|
@@ -70,7 +69,6 @@ export const translations = {
|
|
|
70
69
|
sk,
|
|
71
70
|
sl,
|
|
72
71
|
sv,
|
|
73
|
-
ta,
|
|
74
72
|
th,
|
|
75
73
|
tr,
|
|
76
74
|
uk,
|