@payloadcms/plugin-multi-tenant 3.57.0-internal.f26caed → 3.57.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (168) hide show
  1. package/dist/components/AssignTenantFieldModal/index.client.d.ts +12 -0
  2. package/dist/components/AssignTenantFieldModal/index.client.d.ts.map +1 -0
  3. package/dist/components/AssignTenantFieldModal/index.client.js +133 -0
  4. package/dist/components/AssignTenantFieldModal/index.client.js.map +1 -0
  5. package/dist/components/AssignTenantFieldModal/index.scss +78 -0
  6. package/dist/components/TenantField/index.client.d.ts +1 -1
  7. package/dist/components/TenantField/index.client.d.ts.map +1 -1
  8. package/dist/components/TenantField/index.client.js +135 -110
  9. package/dist/components/TenantField/index.client.js.map +1 -1
  10. package/dist/components/TenantField/index.scss +4 -0
  11. package/dist/exports/client.d.ts +1 -0
  12. package/dist/exports/client.d.ts.map +1 -1
  13. package/dist/exports/client.js +1 -0
  14. package/dist/exports/client.js.map +1 -1
  15. package/dist/filters/filterDocumentsByTenants.d.ts +6 -1
  16. package/dist/filters/filterDocumentsByTenants.d.ts.map +1 -1
  17. package/dist/filters/filterDocumentsByTenants.js +2 -2
  18. package/dist/filters/filterDocumentsByTenants.js.map +1 -1
  19. package/dist/index.d.ts.map +1 -1
  20. package/dist/index.js +9 -0
  21. package/dist/index.js.map +1 -1
  22. package/dist/translations/index.d.ts.map +1 -1
  23. package/dist/translations/index.js +2 -0
  24. package/dist/translations/index.js.map +1 -1
  25. package/dist/translations/languages/ar.d.ts.map +1 -1
  26. package/dist/translations/languages/ar.js +2 -2
  27. package/dist/translations/languages/ar.js.map +1 -1
  28. package/dist/translations/languages/az.d.ts.map +1 -1
  29. package/dist/translations/languages/az.js +2 -2
  30. package/dist/translations/languages/az.js.map +1 -1
  31. package/dist/translations/languages/bg.d.ts.map +1 -1
  32. package/dist/translations/languages/bg.js +2 -2
  33. package/dist/translations/languages/bg.js.map +1 -1
  34. package/dist/translations/languages/bnBd.d.ts.map +1 -1
  35. package/dist/translations/languages/bnBd.js +4 -4
  36. package/dist/translations/languages/bnBd.js.map +1 -1
  37. package/dist/translations/languages/bnIn.d.ts.map +1 -1
  38. package/dist/translations/languages/bnIn.js +3 -3
  39. package/dist/translations/languages/bnIn.js.map +1 -1
  40. package/dist/translations/languages/ca.d.ts.map +1 -1
  41. package/dist/translations/languages/ca.js +2 -2
  42. package/dist/translations/languages/ca.js.map +1 -1
  43. package/dist/translations/languages/cs.d.ts.map +1 -1
  44. package/dist/translations/languages/cs.js +2 -2
  45. package/dist/translations/languages/cs.js.map +1 -1
  46. package/dist/translations/languages/da.d.ts.map +1 -1
  47. package/dist/translations/languages/da.js +2 -2
  48. package/dist/translations/languages/da.js.map +1 -1
  49. package/dist/translations/languages/de.d.ts.map +1 -1
  50. package/dist/translations/languages/de.js +2 -2
  51. package/dist/translations/languages/de.js.map +1 -1
  52. package/dist/translations/languages/en.d.ts +2 -2
  53. package/dist/translations/languages/en.d.ts.map +1 -1
  54. package/dist/translations/languages/en.js +3 -3
  55. package/dist/translations/languages/en.js.map +1 -1
  56. package/dist/translations/languages/es.d.ts.map +1 -1
  57. package/dist/translations/languages/es.js +2 -2
  58. package/dist/translations/languages/es.js.map +1 -1
  59. package/dist/translations/languages/et.d.ts.map +1 -1
  60. package/dist/translations/languages/et.js +2 -2
  61. package/dist/translations/languages/et.js.map +1 -1
  62. package/dist/translations/languages/fa.d.ts.map +1 -1
  63. package/dist/translations/languages/fa.js +2 -2
  64. package/dist/translations/languages/fa.js.map +1 -1
  65. package/dist/translations/languages/fr.d.ts.map +1 -1
  66. package/dist/translations/languages/fr.js +2 -2
  67. package/dist/translations/languages/fr.js.map +1 -1
  68. package/dist/translations/languages/he.d.ts.map +1 -1
  69. package/dist/translations/languages/he.js +2 -2
  70. package/dist/translations/languages/he.js.map +1 -1
  71. package/dist/translations/languages/hr.d.ts.map +1 -1
  72. package/dist/translations/languages/hr.js +2 -2
  73. package/dist/translations/languages/hr.js.map +1 -1
  74. package/dist/translations/languages/hu.d.ts.map +1 -1
  75. package/dist/translations/languages/hu.js +2 -2
  76. package/dist/translations/languages/hu.js.map +1 -1
  77. package/dist/translations/languages/hy.d.ts.map +1 -1
  78. package/dist/translations/languages/hy.js +2 -2
  79. package/dist/translations/languages/hy.js.map +1 -1
  80. package/dist/translations/languages/id.d.ts.map +1 -1
  81. package/dist/translations/languages/id.js +3 -3
  82. package/dist/translations/languages/id.js.map +1 -1
  83. package/dist/translations/languages/is.d.ts +4 -0
  84. package/dist/translations/languages/is.d.ts.map +1 -0
  85. package/dist/translations/languages/is.js +14 -0
  86. package/dist/translations/languages/is.js.map +1 -0
  87. package/dist/translations/languages/it.d.ts.map +1 -1
  88. package/dist/translations/languages/it.js +2 -2
  89. package/dist/translations/languages/it.js.map +1 -1
  90. package/dist/translations/languages/ja.d.ts.map +1 -1
  91. package/dist/translations/languages/ja.js +2 -2
  92. package/dist/translations/languages/ja.js.map +1 -1
  93. package/dist/translations/languages/ko.d.ts.map +1 -1
  94. package/dist/translations/languages/ko.js +2 -2
  95. package/dist/translations/languages/ko.js.map +1 -1
  96. package/dist/translations/languages/lt.d.ts.map +1 -1
  97. package/dist/translations/languages/lt.js +2 -2
  98. package/dist/translations/languages/lt.js.map +1 -1
  99. package/dist/translations/languages/lv.d.ts.map +1 -1
  100. package/dist/translations/languages/lv.js +4 -4
  101. package/dist/translations/languages/lv.js.map +1 -1
  102. package/dist/translations/languages/my.d.ts.map +1 -1
  103. package/dist/translations/languages/my.js +2 -2
  104. package/dist/translations/languages/my.js.map +1 -1
  105. package/dist/translations/languages/nb.d.ts.map +1 -1
  106. package/dist/translations/languages/nb.js +4 -4
  107. package/dist/translations/languages/nb.js.map +1 -1
  108. package/dist/translations/languages/nl.d.ts.map +1 -1
  109. package/dist/translations/languages/nl.js +2 -2
  110. package/dist/translations/languages/nl.js.map +1 -1
  111. package/dist/translations/languages/pl.d.ts.map +1 -1
  112. package/dist/translations/languages/pl.js +2 -2
  113. package/dist/translations/languages/pl.js.map +1 -1
  114. package/dist/translations/languages/pt.d.ts.map +1 -1
  115. package/dist/translations/languages/pt.js +2 -2
  116. package/dist/translations/languages/pt.js.map +1 -1
  117. package/dist/translations/languages/ro.d.ts.map +1 -1
  118. package/dist/translations/languages/ro.js +2 -2
  119. package/dist/translations/languages/ro.js.map +1 -1
  120. package/dist/translations/languages/rs.d.ts.map +1 -1
  121. package/dist/translations/languages/rs.js +2 -2
  122. package/dist/translations/languages/rs.js.map +1 -1
  123. package/dist/translations/languages/rsLatin.d.ts.map +1 -1
  124. package/dist/translations/languages/rsLatin.js +2 -2
  125. package/dist/translations/languages/rsLatin.js.map +1 -1
  126. package/dist/translations/languages/ru.d.ts.map +1 -1
  127. package/dist/translations/languages/ru.js +2 -2
  128. package/dist/translations/languages/ru.js.map +1 -1
  129. package/dist/translations/languages/sk.d.ts.map +1 -1
  130. package/dist/translations/languages/sk.js +2 -2
  131. package/dist/translations/languages/sk.js.map +1 -1
  132. package/dist/translations/languages/sl.d.ts.map +1 -1
  133. package/dist/translations/languages/sl.js +2 -2
  134. package/dist/translations/languages/sl.js.map +1 -1
  135. package/dist/translations/languages/sv.d.ts.map +1 -1
  136. package/dist/translations/languages/sv.js +2 -2
  137. package/dist/translations/languages/sv.js.map +1 -1
  138. package/dist/translations/languages/ta.d.ts +4 -0
  139. package/dist/translations/languages/ta.d.ts.map +1 -0
  140. package/dist/translations/languages/ta.js +14 -0
  141. package/dist/translations/languages/ta.js.map +1 -0
  142. package/dist/translations/languages/th.d.ts.map +1 -1
  143. package/dist/translations/languages/th.js +2 -2
  144. package/dist/translations/languages/th.js.map +1 -1
  145. package/dist/translations/languages/tr.d.ts.map +1 -1
  146. package/dist/translations/languages/tr.js +2 -2
  147. package/dist/translations/languages/tr.js.map +1 -1
  148. package/dist/translations/languages/uk.d.ts.map +1 -1
  149. package/dist/translations/languages/uk.js +2 -2
  150. package/dist/translations/languages/uk.js.map +1 -1
  151. package/dist/translations/languages/vi.d.ts.map +1 -1
  152. package/dist/translations/languages/vi.js +2 -2
  153. package/dist/translations/languages/vi.js.map +1 -1
  154. package/dist/translations/languages/zh.d.ts.map +1 -1
  155. package/dist/translations/languages/zh.js +2 -2
  156. package/dist/translations/languages/zh.js.map +1 -1
  157. package/dist/translations/languages/zhTw.d.ts.map +1 -1
  158. package/dist/translations/languages/zhTw.js +2 -2
  159. package/dist/translations/languages/zhTw.js.map +1 -1
  160. package/dist/translations/types.d.ts +2 -2
  161. package/dist/translations/types.d.ts.map +1 -1
  162. package/dist/translations/types.js.map +1 -1
  163. package/dist/types.d.ts +12 -6
  164. package/dist/types.d.ts.map +1 -1
  165. package/dist/types.js.map +1 -1
  166. package/dist/utilities/addFilterOptionsToFields.js +1 -0
  167. package/dist/utilities/addFilterOptionsToFields.js.map +1 -1
  168. package/package.json +6 -6
@@ -0,0 +1,12 @@
1
+ import React from 'react';
2
+ import './index.scss';
3
+ export declare const assignTenantModalSlug = "assign-tenant-field-modal";
4
+ export declare const AssignTenantFieldTrigger: React.FC;
5
+ export declare const AssignTenantFieldModal: React.FC<{
6
+ afterModalClose: () => void;
7
+ afterModalOpen: () => void;
8
+ children: React.ReactNode;
9
+ onCancel?: () => void;
10
+ onConfirm?: () => void;
11
+ }>;
12
+ //# sourceMappingURL=index.client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.client.d.ts","sourceRoot":"","sources":["../../../src/components/AssignTenantFieldModal/index.client.tsx"],"names":[],"mappings":"AAgBA,OAAO,KAAK,MAAM,OAAO,CAAA;AAOzB,OAAO,cAAc,CAAA;AAGrB,eAAO,MAAM,qBAAqB,8BAA8B,CAAA;AAGhE,eAAO,MAAM,wBAAwB,EAAE,KAAK,CAAC,EAgB5C,CAAA;AAED,eAAO,MAAM,sBAAsB,EAAE,KAAK,CAAC,EAAE,CAAC;IAC5C,eAAe,EAAE,MAAM,IAAI,CAAA;IAC3B,cAAc,EAAE,MAAM,IAAI,CAAA;IAC1B,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;IACzB,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAA;IACrB,SAAS,CAAC,EAAE,MAAM,IAAI,CAAA;CACvB,CA8EA,CAAA"}
@@ -0,0 +1,133 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
+ import { Button, Modal, Pill, PopupList, useConfig, useDocumentInfo, useDocumentTitle, useModal, useTranslation } from '@payloadcms/ui';
4
+ import { drawerZBase, useDrawerDepth } from '@payloadcms/ui/elements/Drawer';
5
+ import React from 'react';
6
+ import './index.scss';
7
+ import { useTenantSelection } from '../../providers/TenantSelectionProvider/index.client.js';
8
+ export const assignTenantModalSlug = 'assign-tenant-field-modal';
9
+ const baseClass = 'assign-tenant-field-modal';
10
+ export const AssignTenantFieldTrigger = ()=>{
11
+ const { openModal } = useModal();
12
+ const { t } = useTranslation();
13
+ const { options } = useTenantSelection();
14
+ if (options.length <= 1) {
15
+ return null;
16
+ }
17
+ return /*#__PURE__*/ _jsx(_Fragment, {
18
+ children: /*#__PURE__*/ _jsx(PopupList.Button, {
19
+ onClick: ()=>openModal(assignTenantModalSlug),
20
+ children: t('plugin-multi-tenant:assign-tenant-button-label')
21
+ })
22
+ });
23
+ };
24
+ export const AssignTenantFieldModal = ({ afterModalClose, afterModalOpen, children, onCancel, onConfirm })=>{
25
+ const editDepth = useDrawerDepth();
26
+ const { t } = useTranslation();
27
+ const { collectionSlug } = useDocumentInfo();
28
+ const { title } = useDocumentTitle();
29
+ const { getEntityConfig } = useConfig();
30
+ const collectionConfig = getEntityConfig({
31
+ collectionSlug
32
+ });
33
+ const { closeModal, isModalOpen: isModalOpenFn } = useModal();
34
+ const isModalOpen = isModalOpenFn(assignTenantModalSlug);
35
+ const wasModalOpenRef = React.useRef(isModalOpen);
36
+ const onModalConfirm = React.useCallback(()=>{
37
+ if (typeof onConfirm === 'function') {
38
+ onConfirm();
39
+ }
40
+ closeModal(assignTenantModalSlug);
41
+ }, [
42
+ onConfirm,
43
+ closeModal
44
+ ]);
45
+ const onModalCancel = React.useCallback(()=>{
46
+ if (typeof onCancel === 'function') {
47
+ onCancel();
48
+ }
49
+ closeModal(assignTenantModalSlug);
50
+ }, [
51
+ onCancel,
52
+ closeModal
53
+ ]);
54
+ React.useEffect(()=>{
55
+ if (wasModalOpenRef.current && !isModalOpen) {
56
+ // modal was open, and now is closed
57
+ if (typeof afterModalClose === 'function') {
58
+ afterModalClose();
59
+ }
60
+ }
61
+ if (!wasModalOpenRef.current && isModalOpen) {
62
+ // modal was closed, and now is open
63
+ if (typeof afterModalOpen === 'function') {
64
+ afterModalOpen();
65
+ }
66
+ }
67
+ wasModalOpenRef.current = isModalOpen;
68
+ }, [
69
+ isModalOpen,
70
+ onCancel,
71
+ afterModalClose,
72
+ afterModalOpen
73
+ ]);
74
+ if (!collectionConfig) {
75
+ return null;
76
+ }
77
+ return /*#__PURE__*/ _jsxs(Modal, {
78
+ className: baseClass,
79
+ slug: assignTenantModalSlug,
80
+ style: {
81
+ zIndex: drawerZBase + editDepth
82
+ },
83
+ children: [
84
+ /*#__PURE__*/ _jsx("div", {
85
+ className: `${baseClass}__bg`
86
+ }),
87
+ /*#__PURE__*/ _jsxs("div", {
88
+ className: `${baseClass}__wrapper`,
89
+ children: [
90
+ /*#__PURE__*/ _jsxs("div", {
91
+ className: `${baseClass}__header`,
92
+ children: [
93
+ /*#__PURE__*/ _jsx("h3", {
94
+ children: t('plugin-multi-tenant:assign-tenant-modal-title', {
95
+ title
96
+ })
97
+ }),
98
+ /*#__PURE__*/ _jsx(Pill, {
99
+ className: `${baseClass}__collection-pill`,
100
+ size: "small",
101
+ children: /*#__PURE__*/ _jsx(_Fragment, {
102
+ children: collectionConfig.labels.singular
103
+ })
104
+ })
105
+ ]
106
+ }),
107
+ /*#__PURE__*/ _jsx("div", {
108
+ className: `${baseClass}__content`,
109
+ children: children
110
+ }),
111
+ /*#__PURE__*/ _jsxs("div", {
112
+ className: `${baseClass}__actions`,
113
+ children: [
114
+ /*#__PURE__*/ _jsx(Button, {
115
+ buttonStyle: "secondary",
116
+ margin: false,
117
+ onClick: onModalCancel,
118
+ children: t('general:cancel')
119
+ }),
120
+ /*#__PURE__*/ _jsx(Button, {
121
+ margin: false,
122
+ onClick: onModalConfirm,
123
+ children: t('general:confirm')
124
+ })
125
+ ]
126
+ })
127
+ ]
128
+ })
129
+ ]
130
+ });
131
+ };
132
+
133
+ //# sourceMappingURL=index.client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/AssignTenantFieldModal/index.client.tsx"],"sourcesContent":["'use client'\n\nimport type { ClientCollectionConfig } from 'payload'\n\nimport {\n Button,\n Modal,\n Pill,\n PopupList,\n useConfig,\n useDocumentInfo,\n useDocumentTitle,\n useModal,\n useTranslation,\n} from '@payloadcms/ui'\nimport { drawerZBase, useDrawerDepth } from '@payloadcms/ui/elements/Drawer'\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\nexport const assignTenantModalSlug = 'assign-tenant-field-modal'\nconst baseClass = '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 <>\n <PopupList.Button onClick={() => openModal(assignTenantModalSlug)}>\n {t('plugin-multi-tenant:assign-tenant-button-label')}\n </PopupList.Button>\n </>\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 editDepth = useDrawerDepth()\n const { t } = useTranslation<PluginMultiTenantTranslations, PluginMultiTenantTranslationKeys>()\n const { collectionSlug } = useDocumentInfo()\n const { title } = useDocumentTitle()\n const { getEntityConfig } = useConfig()\n const collectionConfig = getEntityConfig({ collectionSlug }) as ClientCollectionConfig\n const { closeModal, isModalOpen: isModalOpenFn } = useModal()\n const isModalOpen = isModalOpenFn(assignTenantModalSlug)\n const wasModalOpenRef = React.useRef<boolean>(isModalOpen)\n\n const onModalConfirm = React.useCallback(() => {\n if (typeof onConfirm === 'function') {\n onConfirm()\n }\n closeModal(assignTenantModalSlug)\n }, [onConfirm, closeModal])\n\n const onModalCancel = React.useCallback(() => {\n if (typeof onCancel === 'function') {\n onCancel()\n }\n closeModal(assignTenantModalSlug)\n }, [onCancel, closeModal])\n\n React.useEffect(() => {\n if (wasModalOpenRef.current && !isModalOpen) {\n // modal was open, and now is closed\n if (typeof afterModalClose === 'function') {\n afterModalClose()\n }\n }\n\n if (!wasModalOpenRef.current && isModalOpen) {\n // modal was closed, and now is open\n if (typeof afterModalOpen === 'function') {\n afterModalOpen()\n }\n }\n wasModalOpenRef.current = isModalOpen\n }, [isModalOpen, onCancel, afterModalClose, afterModalOpen])\n\n if (!collectionConfig) {\n return null\n }\n\n return (\n <Modal\n className={baseClass}\n slug={assignTenantModalSlug}\n style={{\n zIndex: drawerZBase + editDepth,\n }}\n >\n <div className={`${baseClass}__bg`} />\n <div className={`${baseClass}__wrapper`}>\n <div className={`${baseClass}__header`}>\n <h3>\n {t('plugin-multi-tenant:assign-tenant-modal-title', {\n title,\n })}\n </h3>\n <Pill className={`${baseClass}__collection-pill`} size=\"small\">\n <>{collectionConfig.labels.singular}</>\n </Pill>\n </div>\n <div className={`${baseClass}__content`}>{children}</div>\n <div className={`${baseClass}__actions`}>\n <Button buttonStyle=\"secondary\" margin={false} onClick={onModalCancel}>\n {t('general:cancel')}\n </Button>\n <Button margin={false} onClick={onModalConfirm}>\n {t('general:confirm')}\n </Button>\n </div>\n </div>\n </Modal>\n )\n}\n"],"names":["Button","Modal","Pill","PopupList","useConfig","useDocumentInfo","useDocumentTitle","useModal","useTranslation","drawerZBase","useDrawerDepth","React","useTenantSelection","assignTenantModalSlug","baseClass","AssignTenantFieldTrigger","openModal","t","options","length","onClick","AssignTenantFieldModal","afterModalClose","afterModalOpen","children","onCancel","onConfirm","editDepth","collectionSlug","title","getEntityConfig","collectionConfig","closeModal","isModalOpen","isModalOpenFn","wasModalOpenRef","useRef","onModalConfirm","useCallback","onModalCancel","useEffect","current","className","slug","style","zIndex","div","h3","size","labels","singular","buttonStyle","margin"],"mappings":"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"}
@@ -0,0 +1,78 @@
1
+ @layer payload-default {
2
+ .assign-tenant-field-modal {
3
+ pointer-events: none;
4
+ display: flex;
5
+ align-items: center;
6
+ justify-content: center;
7
+ height: 100%;
8
+
9
+ &[open] {
10
+ pointer-events: auto;
11
+
12
+ .assign-tenant-field-modal__wrapper {
13
+ display: flex;
14
+ }
15
+ }
16
+
17
+ &__bg {
18
+ z-index: -1;
19
+
20
+ &:before {
21
+ content: ' ';
22
+ position: absolute;
23
+ top: 0;
24
+ right: 0;
25
+ bottom: 0;
26
+ left: 0;
27
+ background: var(--theme-bg);
28
+ opacity: 0.8;
29
+ }
30
+ }
31
+
32
+ &__wrapper {
33
+ z-index: 1;
34
+ position: relative;
35
+ display: none;
36
+ flex-direction: column;
37
+ max-width: calc(var(--base) * 30);
38
+ min-width: min(500px, calc(100% - (var(--base) * 2)));
39
+ border-radius: var(--style-radius-m);
40
+ border: 1px solid var(--theme-elevation-100);
41
+ background-color: var(--theme-bg);
42
+ justify-content: center;
43
+ }
44
+
45
+ &__header {
46
+ padding: calc(var(--base) * 0.75) var(--base);
47
+ border-bottom: 1px solid var(--theme-elevation-100);
48
+ display: flex;
49
+ flex-direction: row;
50
+ justify-content: space-between;
51
+ gap: calc(var(--base) * 2);
52
+ }
53
+
54
+ &__collection-pill {
55
+ align-self: flex-start;
56
+ flex-shrink: 0;
57
+ }
58
+
59
+ &__content {
60
+ display: flex;
61
+ flex-direction: column;
62
+ gap: calc(var(--base) * 0.5);
63
+ padding: var(--base) var(--base) 0 var(--base);
64
+ }
65
+
66
+ &__controls {
67
+ display: flex;
68
+ gap: calc(var(--base) * 0.5);
69
+ }
70
+
71
+ &__actions {
72
+ display: flex;
73
+ justify-content: flex-end;
74
+ gap: calc(var(--base) * 0.4);
75
+ padding: var(--base);
76
+ }
77
+ }
78
+ }
@@ -5,6 +5,6 @@ type Props = {
5
5
  debug?: boolean;
6
6
  unique?: boolean;
7
7
  } & RelationshipFieldClientProps;
8
- export declare const TenantField: (args: Props) => React.JSX.Element | null;
8
+ export declare const TenantField: ({ debug, unique, ...fieldArgs }: 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,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
+ {"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;AAW3D,OAAO,KAAK,MAAM,OAAO,CAAA;AAOzB,OAAO,cAAc,CAAA;AAIrB,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,6BAwHjE,CAAA"}
@@ -1,21 +1,85 @@
1
1
  'use client';
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';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { Pill, RelationshipField, useDocumentInfo, useField, useForm, useFormModified, useModal } from '@payloadcms/ui';
5
4
  import React from 'react';
6
- import './index.scss';
7
5
  import { useTenantSelection } from '../../providers/TenantSelectionProvider/index.client.js';
6
+ import { AssignTenantFieldModal, assignTenantModalSlug } from '../AssignTenantFieldModal/index.client.js';
7
+ import './index.scss';
8
8
  const baseClass = 'tenantField';
9
- export const TenantField = (args)=>{
9
+ export const TenantField = ({ debug, unique, ...fieldArgs })=>{
10
10
  const { entityType, options, selectedTenantID, setEntityType, setTenant } = useTenantSelection();
11
- const { value } = useField();
11
+ const { setValue, showError, value } = useField();
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
+ ]);
12
62
  React.useEffect(()=>{
13
63
  if (!entityType) {
14
- setEntityType(args.unique ? 'global' : 'document');
64
+ setEntityType(unique ? 'global' : 'document');
15
65
  } else {
16
66
  // unique documents are controlled from the global TenantSelector
17
- if (!args.unique && value) {
18
- if (!selectedTenantID || value !== selectedTenantID) {
67
+ if (!unique && value) {
68
+ if (Array.isArray(value)) {
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) {
19
83
  setTenant({
20
84
  id: value,
21
85
  refresh: false
@@ -29,7 +93,7 @@ export const TenantField = (args)=>{
29
93
  }
30
94
  };
31
95
  }, [
32
- args.unique,
96
+ unique,
33
97
  options,
34
98
  selectedTenantID,
35
99
  setTenant,
@@ -37,113 +101,74 @@ export const TenantField = (args)=>{
37
101
  setEntityType,
38
102
  entityType
39
103
  ]);
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);
81
- }
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);
90
- }
91
- return undefined;
92
- }, [
93
- options,
94
- tenantToConfirm
95
- ]);
96
- const modalIsOpen = isModalOpen(confirmSwitchTenantSlug);
97
- const testRef = React.useRef(false);
98
104
  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);
105
+ if (unique) {
106
+ return;
107
+ }
108
+ if (!isFormValid && showError && showField || !value && !selectedTenantID) {
109
+ openModal(assignTenantModalSlug);
107
110
  }
108
111
  }, [
109
- tenantFormValue,
110
- setTenantFormValue,
112
+ isFormValid,
113
+ showError,
114
+ showField,
111
115
  openModal,
112
- setTenant,
116
+ value,
117
+ docID,
113
118
  selectedTenantID,
114
- modalIsOpen,
115
- modified
119
+ unique
116
120
  ]);
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);
121
+ if (showField) {
122
+ if (debug) {
123
+ return /*#__PURE__*/ _jsx(TenantFieldInModal, {
124
+ debug: debug,
125
+ fieldArgs: fieldArgs,
126
+ unique: unique
127
+ });
128
+ }
129
+ if (!unique) {
130
+ /** Editing a non-global tenant document */ return /*#__PURE__*/ _jsx(AssignTenantFieldModal, {
131
+ afterModalClose: afterModalClose,
132
+ afterModalOpen: afterModalOpen,
133
+ onConfirm: onConfirm,
134
+ children: /*#__PURE__*/ _jsx(TenantFieldInModal, {
135
+ debug: debug,
136
+ fieldArgs: {
137
+ ...fieldArgs,
138
+ field: {
139
+ ...fieldArgs.field
140
+ }
141
+ },
142
+ unique: unique
143
+ })
144
+ });
146
145
  }
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
+ })
147
172
  });
148
173
  };
149
174
  /**
@@ -1 +1 @@
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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"}
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.scss'\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 } = useDocumentInfo()\n const { openModal } = useModal()\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) {\n return\n }\n if ((!isFormValid && showError && showField) || (!value && !selectedTenantID)) {\n openModal(assignTenantModalSlug)\n }\n }, [isFormValid, showError, showField, openModal, value, docID, selectedTenantID, unique])\n\n if (showField) {\n if (debug) {\n return <TenantFieldInModal 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 <TenantFieldInModal\n debug={debug}\n fieldArgs={{\n ...fieldArgs,\n field: {\n ...fieldArgs.field,\n },\n }}\n unique={unique}\n />\n </AssignTenantFieldModal>\n )\n }\n\n return <SyncFormModified />\n }\n\n return null\n}\n\nconst TenantFieldInModal: 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","openModal","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","TenantFieldInModal","SyncFormModified","div","className","pillStyle","size","required","readOnly"],"mappings":"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"}
@@ -43,6 +43,10 @@
43
43
  margin-top: calc(var(--base) * -1.5);
44
44
  padding-top: calc(var(--base) * 1.5);
45
45
  }
46
+
47
+ &__debug-pill {
48
+ margin-bottom: calc(var(--base) * 0.5);
49
+ }
46
50
  }
47
51
  }
48
52
  }
@@ -1,3 +1,4 @@
1
+ export { AssignTenantFieldTrigger } from '../components/AssignTenantFieldModal/index.client.js';
1
2
  export { TenantField } from '../components/TenantField/index.client.js';
2
3
  export { WatchTenantCollection } from '../components/WatchTenantCollection/index.js';
3
4
  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,WAAW,EAAE,MAAM,2CAA2C,CAAA;AACvE,OAAO,EAAE,qBAAqB,EAAE,MAAM,8CAA8C,CAAA;AACpF,OAAO,EAAE,kBAAkB,EAAE,MAAM,sDAAsD,CAAA"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/exports/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,sDAAsD,CAAA;AAC/F,OAAO,EAAE,WAAW,EAAE,MAAM,2CAA2C,CAAA;AACvE,OAAO,EAAE,qBAAqB,EAAE,MAAM,8CAA8C,CAAA;AACpF,OAAO,EAAE,kBAAkB,EAAE,MAAM,sDAAsD,CAAA"}