@payloadcms/plugin-multi-tenant 4.0.0-internal.d28e9fb → 4.0.0-internal.dee5eab

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 (71) hide show
  1. package/LICENSE.md +1 -1
  2. package/dist/components/AssignTenantFieldModal/index.client.d.ts +2 -3
  3. package/dist/components/AssignTenantFieldModal/index.client.d.ts.map +1 -1
  4. package/dist/components/AssignTenantFieldModal/index.client.js +26 -81
  5. package/dist/components/AssignTenantFieldModal/index.client.js.map +1 -1
  6. package/dist/components/GlobalViewRedirect/index.d.ts +1 -1
  7. package/dist/components/GlobalViewRedirect/index.d.ts.map +1 -1
  8. package/dist/components/GlobalViewRedirect/index.js +6 -4
  9. package/dist/components/GlobalViewRedirect/index.js.map +1 -1
  10. package/dist/components/TenantField/index.client.d.ts +1 -1
  11. package/dist/components/TenantField/index.client.d.ts.map +1 -1
  12. package/dist/components/TenantField/index.client.js +85 -75
  13. package/dist/components/TenantField/index.client.js.map +1 -1
  14. package/dist/components/TenantField/index.css +44 -0
  15. package/dist/components/TenantSelector/index.client.d.ts +2 -2
  16. package/dist/components/TenantSelector/index.client.d.ts.map +1 -1
  17. package/dist/components/TenantSelector/index.client.js +4 -2
  18. package/dist/components/TenantSelector/index.client.js.map +1 -1
  19. package/dist/components/TenantSelector/index.css +13 -0
  20. package/dist/defaults.d.ts.map +1 -1
  21. package/dist/endpoints/getTenantOptionsEndpoint.d.ts +2 -2
  22. package/dist/endpoints/getTenantOptionsEndpoint.d.ts.map +1 -1
  23. package/dist/endpoints/getTenantOptionsEndpoint.js.map +1 -1
  24. package/dist/filters/filterDocumentsByTenants.d.ts +3 -3
  25. package/dist/filters/filterDocumentsByTenants.d.ts.map +1 -1
  26. package/dist/filters/filterDocumentsByTenants.js.map +1 -1
  27. package/dist/hooks/afterTenantDelete.d.ts +1 -1
  28. package/dist/hooks/afterTenantDelete.d.ts.map +1 -1
  29. package/dist/hooks/afterTenantDelete.js +4 -1
  30. package/dist/hooks/afterTenantDelete.js.map +1 -1
  31. package/dist/index.d.ts +1 -2
  32. package/dist/index.d.ts.map +1 -1
  33. package/dist/index.js +6 -2
  34. package/dist/index.js.map +1 -1
  35. package/dist/providers/TenantSelectionProvider/index.client.d.ts.map +1 -1
  36. package/dist/providers/TenantSelectionProvider/index.client.js +32 -3
  37. package/dist/providers/TenantSelectionProvider/index.client.js.map +1 -1
  38. package/dist/providers/TenantSelectionProvider/index.d.ts +6 -5
  39. package/dist/providers/TenantSelectionProvider/index.d.ts.map +1 -1
  40. package/dist/providers/TenantSelectionProvider/index.js +5 -3
  41. package/dist/providers/TenantSelectionProvider/index.js.map +1 -1
  42. package/dist/translations/languages/en.d.ts.map +1 -1
  43. package/dist/types.d.ts +5 -6
  44. package/dist/types.d.ts.map +1 -1
  45. package/dist/types.js.map +1 -1
  46. package/dist/utilities/addCollectionAccess.d.ts +4 -4
  47. package/dist/utilities/addCollectionAccess.d.ts.map +1 -1
  48. package/dist/utilities/addCollectionAccess.js.map +1 -1
  49. package/dist/utilities/addFilterOptionsToFields.d.ts +3 -3
  50. package/dist/utilities/addFilterOptionsToFields.d.ts.map +1 -1
  51. package/dist/utilities/addFilterOptionsToFields.js +6 -9
  52. package/dist/utilities/addFilterOptionsToFields.js.map +1 -1
  53. package/dist/utilities/generateCookie.d.ts.map +1 -1
  54. package/dist/utilities/getCollectionIDType.d.ts +1 -1
  55. package/dist/utilities/getGlobalViewRedirect.d.ts +5 -4
  56. package/dist/utilities/getGlobalViewRedirect.d.ts.map +1 -1
  57. package/dist/utilities/getGlobalViewRedirect.js +2 -3
  58. package/dist/utilities/getGlobalViewRedirect.js.map +1 -1
  59. package/dist/utilities/getTenantOptions.d.ts +3 -3
  60. package/dist/utilities/getTenantOptions.d.ts.map +1 -1
  61. package/dist/utilities/getTenantOptions.js.map +1 -1
  62. package/dist/utilities/getUserTenantIDs.js +2 -1
  63. package/dist/utilities/getUserTenantIDs.js.map +1 -1
  64. package/dist/utilities/miniChalk.d.ts.map +1 -1
  65. package/dist/utilities/withTenantAccess.d.ts +4 -4
  66. package/dist/utilities/withTenantAccess.d.ts.map +1 -1
  67. package/dist/utilities/withTenantAccess.js.map +1 -1
  68. package/package.json +6 -6
  69. package/dist/components/AssignTenantFieldModal/index.scss +0 -78
  70. package/dist/components/TenantField/index.scss +0 -52
  71. package/dist/components/TenantSelector/index.scss +0 -4
package/LICENSE.md CHANGED
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2018-2024 Payload CMS, Inc. <info@payloadcms.com>
3
+ Copyright (c) 2018-2026 Payload CMS, LLC <info@payloadcms.com>
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining
6
6
  a copy of this software and associated documentation files (the
@@ -1,10 +1,9 @@
1
1
  import React from 'react';
2
- import './index.scss';
3
2
  export declare const assignTenantModalSlug = "assign-tenant-field-modal";
4
3
  export declare const AssignTenantFieldTrigger: React.FC;
5
4
  export declare const AssignTenantFieldModal: React.FC<{
6
- afterModalClose: () => void;
7
- afterModalOpen: () => void;
5
+ afterModalClose?: () => void;
6
+ afterModalOpen?: () => void;
8
7
  children: React.ReactNode;
9
8
  onCancel?: () => void;
10
9
  onConfirm?: () => void;
@@ -1 +1 @@
1
- {"version":3,"file":"index.client.d.ts","sourceRoot":"","sources":["../../../src/components/AssignTenantFieldModal/index.client.tsx"],"names":[],"mappings":"AAiBA,OAAO,KAAK,MAAM,OAAO,CAAA;AAQzB,OAAO,cAAc,CAAA;AAErB,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,CAiFA,CAAA"}
1
+ {"version":3,"file":"index.client.d.ts","sourceRoot":"","sources":["../../../src/components/AssignTenantFieldModal/index.client.tsx"],"names":[],"mappings":"AAoBA,OAAO,KAAK,MAAM,OAAO,CAAA;AASzB,eAAO,MAAM,qBAAqB,8BAA8B,CAAA;AAEhE,eAAO,MAAM,wBAAwB,EAAE,KAAK,CAAC,EAc5C,CAAA;AAED,eAAO,MAAM,sBAAsB,EAAE,KAAK,CAAC,EAAE,CAAC;IAC5C,eAAe,CAAC,EAAE,MAAM,IAAI,CAAA;IAC5B,cAAc,CAAC,EAAE,MAAM,IAAI,CAAA;IAC3B,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;IACzB,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAA;IACrB,SAAS,CAAC,EAAE,MAAM,IAAI,CAAA;CACvB,CAuCA,CAAA"}
@@ -1,13 +1,10 @@
1
1
  'use client';
2
- import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import { getTranslation } from '@payloadcms/translations';
4
- import { Button, Modal, Pill, PopupList, useConfig, useDocumentInfo, useDocumentTitle, useModal, useTranslation } from '@payloadcms/ui';
5
- import { drawerZBase, useDrawerDepth } from '@payloadcms/ui/elements/Drawer';
4
+ import { DialogBody, DialogCancel, DialogConfirm, DialogFooter, DialogHeader, DialogModal, Pill, PopupList, useConfig, useDocumentInfo, useDocumentTitle, useModal, useTranslation } from '@payloadcms/ui';
6
5
  import React from 'react';
7
6
  import { useTenantSelection } from '../../providers/TenantSelectionProvider/index.client.js';
8
- import './index.scss';
9
7
  export const assignTenantModalSlug = 'assign-tenant-field-modal';
10
- const baseClass = 'assign-tenant-field-modal';
11
8
  export const AssignTenantFieldTrigger = ()=>{
12
9
  const { openModal } = useModal();
13
10
  const { t } = useTranslation();
@@ -15,15 +12,12 @@ export const AssignTenantFieldTrigger = ()=>{
15
12
  if (options.length <= 1) {
16
13
  return null;
17
14
  }
18
- return /*#__PURE__*/ _jsx(_Fragment, {
19
- children: /*#__PURE__*/ _jsx(PopupList.Button, {
20
- onClick: ()=>openModal(assignTenantModalSlug),
21
- children: t('plugin-multi-tenant:assign-tenant-button-label')
22
- })
15
+ return /*#__PURE__*/ _jsx(PopupList.Button, {
16
+ onClick: ()=>openModal(assignTenantModalSlug),
17
+ children: t('plugin-multi-tenant:assign-tenant-button-label')
23
18
  });
24
19
  };
25
20
  export const AssignTenantFieldModal = ({ afterModalClose, afterModalOpen, children, onCancel, onConfirm })=>{
26
- const editDepth = useDrawerDepth();
27
21
  const { i18n, t } = useTranslation();
28
22
  const { collectionSlug } = useDocumentInfo();
29
23
  const { title } = useDocumentTitle();
@@ -31,97 +25,48 @@ export const AssignTenantFieldModal = ({ afterModalClose, afterModalOpen, childr
31
25
  const collectionConfig = getEntityConfig({
32
26
  collectionSlug
33
27
  });
34
- const { closeModal, isModalOpen: isModalOpenFn } = useModal();
28
+ const { isModalOpen: isModalOpenFn } = useModal();
35
29
  const isModalOpen = isModalOpenFn(assignTenantModalSlug);
36
30
  const wasModalOpenRef = React.useRef(isModalOpen);
37
- const onModalConfirm = React.useCallback(()=>{
38
- if (typeof onConfirm === 'function') {
39
- onConfirm();
40
- }
41
- closeModal(assignTenantModalSlug);
42
- }, [
43
- onConfirm,
44
- closeModal
45
- ]);
46
- const onModalCancel = React.useCallback(()=>{
47
- if (typeof onCancel === 'function') {
48
- onCancel();
49
- }
50
- closeModal(assignTenantModalSlug);
51
- }, [
52
- onCancel,
53
- closeModal
54
- ]);
55
31
  React.useEffect(()=>{
56
32
  if (wasModalOpenRef.current && !isModalOpen) {
57
- // modal was open, and now is closed
58
- if (typeof afterModalClose === 'function') {
59
- afterModalClose();
60
- }
33
+ afterModalClose?.();
61
34
  }
62
35
  if (!wasModalOpenRef.current && isModalOpen) {
63
- // modal was closed, and now is open
64
- if (typeof afterModalOpen === 'function') {
65
- afterModalOpen();
66
- }
36
+ afterModalOpen?.();
67
37
  }
68
38
  wasModalOpenRef.current = isModalOpen;
69
39
  }, [
70
40
  isModalOpen,
71
- onCancel,
72
41
  afterModalClose,
73
42
  afterModalOpen
74
43
  ]);
75
44
  if (!collectionConfig) {
76
45
  return null;
77
46
  }
78
- return /*#__PURE__*/ _jsxs(Modal, {
79
- className: baseClass,
47
+ return /*#__PURE__*/ _jsxs(DialogModal, {
48
+ size: "medium",
80
49
  slug: assignTenantModalSlug,
81
- style: {
82
- zIndex: drawerZBase + editDepth
83
- },
84
50
  children: [
85
- /*#__PURE__*/ _jsx("div", {
86
- className: `${baseClass}__bg`
51
+ /*#__PURE__*/ _jsx(DialogHeader, {
52
+ title: t('plugin-multi-tenant:assign-tenant-modal-title', {
53
+ title
54
+ }),
55
+ children: /*#__PURE__*/ _jsx(Pill, {
56
+ size: "small",
57
+ children: getTranslation(collectionConfig.labels.singular, i18n)
58
+ })
87
59
  }),
88
- /*#__PURE__*/ _jsxs("div", {
89
- className: `${baseClass}__wrapper`,
60
+ /*#__PURE__*/ _jsx(DialogBody, {
61
+ children: children
62
+ }),
63
+ /*#__PURE__*/ _jsxs(DialogFooter, {
90
64
  children: [
91
- /*#__PURE__*/ _jsxs("div", {
92
- className: `${baseClass}__header`,
93
- children: [
94
- /*#__PURE__*/ _jsx("h3", {
95
- children: t('plugin-multi-tenant:assign-tenant-modal-title', {
96
- title
97
- })
98
- }),
99
- /*#__PURE__*/ _jsx(Pill, {
100
- className: `${baseClass}__collection-pill`,
101
- size: "small",
102
- children: getTranslation(collectionConfig.labels.singular, i18n)
103
- })
104
- ]
105
- }),
106
- /*#__PURE__*/ _jsx("div", {
107
- className: `${baseClass}__content`,
108
- children: children
65
+ /*#__PURE__*/ _jsx(DialogCancel, {
66
+ onClick: onCancel
109
67
  }),
110
- /*#__PURE__*/ _jsxs("div", {
111
- className: `${baseClass}__actions`,
112
- children: [
113
- /*#__PURE__*/ _jsx(Button, {
114
- buttonStyle: "secondary",
115
- margin: false,
116
- onClick: onModalCancel,
117
- children: t('general:cancel')
118
- }),
119
- /*#__PURE__*/ _jsx(Button, {
120
- margin: false,
121
- onClick: onModalConfirm,
122
- children: t('general:confirm')
123
- })
124
- ]
68
+ /*#__PURE__*/ _jsx(DialogConfirm, {
69
+ onClick: ()=>onConfirm?.()
125
70
  })
126
71
  ]
127
72
  })
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/AssignTenantFieldModal/index.client.tsx"],"sourcesContent":["'use client'\n\nimport type { ClientCollectionConfig } from 'payload'\n\nimport { getTranslation } from '@payloadcms/translations'\nimport {\n 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 { useTenantSelection } from '../../providers/TenantSelectionProvider/index.client.js'\nimport './index.scss'\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 { i18n, t } = useTranslation<\n PluginMultiTenantTranslations,\n PluginMultiTenantTranslationKeys\n >()\n const { collectionSlug } = useDocumentInfo()\n const { title } = useDocumentTitle()\n const { getEntityConfig } = useConfig()\n const collectionConfig = getEntityConfig({ collectionSlug }) as ClientCollectionConfig\n const { 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 {getTranslation(collectionConfig.labels.singular, i18n)}\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":["getTranslation","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","i18n","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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"}
1
+ {"version":3,"sources":["../../../src/components/AssignTenantFieldModal/index.client.tsx"],"sourcesContent":["'use client'\n\nimport type { ClientCollectionConfig } from 'payload'\n\nimport { getTranslation } from '@payloadcms/translations'\nimport {\n DialogBody,\n DialogCancel,\n DialogConfirm,\n DialogFooter,\n DialogHeader,\n DialogModal,\n Pill,\n PopupList,\n useConfig,\n useDocumentInfo,\n useDocumentTitle,\n useModal,\n useTranslation,\n} from '@payloadcms/ui'\nimport React from 'react'\n\nimport type {\n PluginMultiTenantTranslationKeys,\n PluginMultiTenantTranslations,\n} from '../../translations/index.js'\n\nimport { useTenantSelection } from '../../providers/TenantSelectionProvider/index.client.js'\n\nexport const assignTenantModalSlug = 'assign-tenant-field-modal'\n\nexport const AssignTenantFieldTrigger: React.FC = () => {\n const { openModal } = useModal()\n const { t } = useTranslation<PluginMultiTenantTranslations, PluginMultiTenantTranslationKeys>()\n const { options } = useTenantSelection()\n\n if (options.length <= 1) {\n return null\n }\n\n return (\n <PopupList.Button onClick={() => openModal(assignTenantModalSlug)}>\n {t('plugin-multi-tenant:assign-tenant-button-label')}\n </PopupList.Button>\n )\n}\n\nexport const AssignTenantFieldModal: React.FC<{\n afterModalClose?: () => void\n afterModalOpen?: () => void\n children: React.ReactNode\n onCancel?: () => void\n onConfirm?: () => void\n}> = ({ afterModalClose, afterModalOpen, children, onCancel, onConfirm }) => {\n const { i18n, t } = useTranslation<\n PluginMultiTenantTranslations,\n PluginMultiTenantTranslationKeys\n >()\n const { collectionSlug } = useDocumentInfo()\n const { title } = useDocumentTitle()\n const { getEntityConfig } = useConfig()\n const collectionConfig = getEntityConfig({ collectionSlug }) as ClientCollectionConfig\n const { isModalOpen: isModalOpenFn } = useModal()\n const isModalOpen = isModalOpenFn(assignTenantModalSlug)\n const wasModalOpenRef = React.useRef<boolean>(isModalOpen)\n\n React.useEffect(() => {\n if (wasModalOpenRef.current && !isModalOpen) {\n afterModalClose?.()\n }\n if (!wasModalOpenRef.current && isModalOpen) {\n afterModalOpen?.()\n }\n wasModalOpenRef.current = isModalOpen\n }, [isModalOpen, afterModalClose, afterModalOpen])\n\n if (!collectionConfig) {\n return null\n }\n\n return (\n <DialogModal size=\"medium\" slug={assignTenantModalSlug}>\n <DialogHeader title={t('plugin-multi-tenant:assign-tenant-modal-title', { title })}>\n <Pill size=\"small\">{getTranslation(collectionConfig.labels.singular, i18n)}</Pill>\n </DialogHeader>\n <DialogBody>{children}</DialogBody>\n <DialogFooter>\n <DialogCancel onClick={onCancel} />\n <DialogConfirm onClick={() => onConfirm?.()} />\n </DialogFooter>\n </DialogModal>\n )\n}\n"],"names":["getTranslation","DialogBody","DialogCancel","DialogConfirm","DialogFooter","DialogHeader","DialogModal","Pill","PopupList","useConfig","useDocumentInfo","useDocumentTitle","useModal","useTranslation","React","useTenantSelection","assignTenantModalSlug","AssignTenantFieldTrigger","openModal","t","options","length","Button","onClick","AssignTenantFieldModal","afterModalClose","afterModalOpen","children","onCancel","onConfirm","i18n","collectionSlug","title","getEntityConfig","collectionConfig","isModalOpen","isModalOpenFn","wasModalOpenRef","useRef","useEffect","current","size","slug","labels","singular"],"mappings":"AAAA;;AAIA,SAASA,cAAc,QAAQ,2BAA0B;AACzD,SACEC,UAAU,EACVC,YAAY,EACZC,aAAa,EACbC,YAAY,EACZC,YAAY,EACZC,WAAW,EACXC,IAAI,EACJC,SAAS,EACTC,SAAS,EACTC,eAAe,EACfC,gBAAgB,EAChBC,QAAQ,EACRC,cAAc,QACT,iBAAgB;AACvB,OAAOC,WAAW,QAAO;AAOzB,SAASC,kBAAkB,QAAQ,0DAAyD;AAE5F,OAAO,MAAMC,wBAAwB,4BAA2B;AAEhE,OAAO,MAAMC,2BAAqC;IAChD,MAAM,EAAEC,SAAS,EAAE,GAAGN;IACtB,MAAM,EAAEO,CAAC,EAAE,GAAGN;IACd,MAAM,EAAEO,OAAO,EAAE,GAAGL;IAEpB,IAAIK,QAAQC,MAAM,IAAI,GAAG;QACvB,OAAO;IACT;IAEA,qBACE,KAACb,UAAUc,MAAM;QAACC,SAAS,IAAML,UAAUF;kBACxCG,EAAE;;AAGT,EAAC;AAED,OAAO,MAAMK,yBAMR,CAAC,EAAEC,eAAe,EAAEC,cAAc,EAAEC,QAAQ,EAAEC,QAAQ,EAAEC,SAAS,EAAE;IACtE,MAAM,EAAEC,IAAI,EAAEX,CAAC,EAAE,GAAGN;IAIpB,MAAM,EAAEkB,cAAc,EAAE,GAAGrB;IAC3B,MAAM,EAAEsB,KAAK,EAAE,GAAGrB;IAClB,MAAM,EAAEsB,eAAe,EAAE,GAAGxB;IAC5B,MAAMyB,mBAAmBD,gBAAgB;QAAEF;IAAe;IAC1D,MAAM,EAAEI,aAAaC,aAAa,EAAE,GAAGxB;IACvC,MAAMuB,cAAcC,cAAcpB;IAClC,MAAMqB,kBAAkBvB,MAAMwB,MAAM,CAAUH;IAE9CrB,MAAMyB,SAAS,CAAC;QACd,IAAIF,gBAAgBG,OAAO,IAAI,CAACL,aAAa;YAC3CV;QACF;QACA,IAAI,CAACY,gBAAgBG,OAAO,IAAIL,aAAa;YAC3CT;QACF;QACAW,gBAAgBG,OAAO,GAAGL;IAC5B,GAAG;QAACA;QAAaV;QAAiBC;KAAe;IAEjD,IAAI,CAACQ,kBAAkB;QACrB,OAAO;IACT;IAEA,qBACE,MAAC5B;QAAYmC,MAAK;QAASC,MAAM1B;;0BAC/B,KAACX;gBAAa2B,OAAOb,EAAE,iDAAiD;oBAAEa;gBAAM;0BAC9E,cAAA,KAACzB;oBAAKkC,MAAK;8BAASzC,eAAekC,iBAAiBS,MAAM,CAACC,QAAQ,EAAEd;;;0BAEvE,KAAC7B;0BAAY0B;;0BACb,MAACvB;;kCACC,KAACF;wBAAaqB,SAASK;;kCACvB,KAACzB;wBAAcoB,SAAS,IAAMM;;;;;;AAItC,EAAC"}
@@ -9,7 +9,7 @@ type Args = {
9
9
  tenantFieldName: string;
10
10
  tenantsCollectionSlug: string;
11
11
  useAsTitle: string;
12
- userHasAccessToAllTenants: Required<MultiTenantPluginConfig<any>>['userHasAccessToAllTenants'];
12
+ userHasAccessToAllTenants: Required<MultiTenantPluginConfig>['userHasAccessToAllTenants'];
13
13
  viewType: ViewTypes;
14
14
  } & ServerProps;
15
15
  export declare const GlobalViewRedirect: (args: Args) => Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/GlobalViewRedirect/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAKrE,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAA;AAI7D,KAAK,IAAI,GAAG;IACV,cAAc,EAAE,cAAc,CAAA;IAC9B,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IACvB,WAAW,EAAE,MAAM,EAAE,CAAA;IACrB,oBAAoB,EAAE,MAAM,CAAA;IAC5B,0BAA0B,EAAE,MAAM,CAAA;IAClC,eAAe,EAAE,MAAM,CAAA;IACvB,qBAAqB,EAAE,MAAM,CAAA;IAC7B,UAAU,EAAE,MAAM,CAAA;IAClB,yBAAyB,EAAE,QAAQ,CAAC,uBAAuB,CAAC,GAAG,CAAC,CAAC,CAAC,2BAA2B,CAAC,CAAA;IAC9F,QAAQ,EAAE,SAAS,CAAA;CACpB,GAAG,WAAW,CAAA;AAEf,eAAO,MAAM,kBAAkB,SAAgB,IAAI,kBAuBlD,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/GlobalViewRedirect/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAErE,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAA;AAI7D,KAAK,IAAI,GAAG;IACV,cAAc,EAAE,cAAc,CAAA;IAC9B,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IACvB,WAAW,EAAE,MAAM,EAAE,CAAA;IACrB,oBAAoB,EAAE,MAAM,CAAA;IAC5B,0BAA0B,EAAE,MAAM,CAAA;IAClC,eAAe,EAAE,MAAM,CAAA;IACvB,qBAAqB,EAAE,MAAM,CAAA;IAC7B,UAAU,EAAE,MAAM,CAAA;IAClB,yBAAyB,EAAE,QAAQ,CAAC,uBAAuB,CAAC,CAAC,2BAA2B,CAAC,CAAA;IACzF,QAAQ,EAAE,SAAS,CAAA;CACpB,GAAG,WAAW,CAAA;AAEf,eAAO,MAAM,kBAAkB,SAAgB,IAAI,kBA6BlD,CAAA"}
@@ -1,15 +1,17 @@
1
- import { headers as getHeaders } from 'next/headers.js';
2
- import { redirect } from 'next/navigation.js';
3
1
  import { getGlobalViewRedirect } from '../../utilities/getGlobalViewRedirect.js';
4
2
  export const GlobalViewRedirect = async (args)=>{
5
3
  const collectionSlug = args?.collectionSlug;
6
4
  if (collectionSlug && args.globalSlugs?.includes(collectionSlug)) {
7
- const headers = await getHeaders();
5
+ if (!args.server) {
6
+ throw new Error('GlobalViewRedirect requires `server` in ServerProps. Ensure your framework adapter (e.g. @payloadcms/next) populates ServerProps.server.');
7
+ }
8
+ const headers = await args.server.getHeaders();
8
9
  const redirectRoute = await getGlobalViewRedirect({
9
10
  slug: collectionSlug,
10
11
  docID: args.docID,
11
12
  headers,
12
13
  payload: args.payload,
14
+ server: args.server,
13
15
  tenantFieldName: args.tenantFieldName,
14
16
  tenantsArrayFieldName: args.tenantArrayFieldName,
15
17
  tenantsArrayTenantFieldName: args.tenantArrayTenantFieldName,
@@ -20,7 +22,7 @@ export const GlobalViewRedirect = async (args)=>{
20
22
  view: args.viewType
21
23
  });
22
24
  if (redirectRoute) {
23
- redirect(redirectRoute);
25
+ args.server.redirect(redirectRoute);
24
26
  }
25
27
  }
26
28
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/GlobalViewRedirect/index.ts"],"sourcesContent":["import type { CollectionSlug, ServerProps, ViewTypes } from 'payload'\n\nimport { headers as getHeaders } from 'next/headers.js'\nimport { redirect } from 'next/navigation.js'\n\nimport type { MultiTenantPluginConfig } from '../../types.js'\n\nimport { getGlobalViewRedirect } from '../../utilities/getGlobalViewRedirect.js'\n\ntype Args = {\n collectionSlug: CollectionSlug\n docID?: number | string\n globalSlugs: string[]\n tenantArrayFieldName: string\n tenantArrayTenantFieldName: string\n tenantFieldName: string\n tenantsCollectionSlug: string\n useAsTitle: string\n userHasAccessToAllTenants: Required<MultiTenantPluginConfig<any>>['userHasAccessToAllTenants']\n viewType: ViewTypes\n} & ServerProps\n\nexport const GlobalViewRedirect = async (args: Args) => {\n const collectionSlug = args?.collectionSlug\n if (collectionSlug && args.globalSlugs?.includes(collectionSlug)) {\n const headers = await getHeaders()\n const redirectRoute = await getGlobalViewRedirect({\n slug: collectionSlug,\n docID: args.docID,\n headers,\n payload: args.payload,\n tenantFieldName: args.tenantFieldName,\n tenantsArrayFieldName: args.tenantArrayFieldName,\n tenantsArrayTenantFieldName: args.tenantArrayTenantFieldName,\n tenantsCollectionSlug: args.tenantsCollectionSlug,\n useAsTitle: args.useAsTitle,\n user: args.user,\n userHasAccessToAllTenants: args.userHasAccessToAllTenants,\n view: args.viewType,\n })\n\n if (redirectRoute) {\n redirect(redirectRoute)\n }\n }\n}\n"],"names":["headers","getHeaders","redirect","getGlobalViewRedirect","GlobalViewRedirect","args","collectionSlug","globalSlugs","includes","redirectRoute","slug","docID","payload","tenantFieldName","tenantsArrayFieldName","tenantArrayFieldName","tenantsArrayTenantFieldName","tenantArrayTenantFieldName","tenantsCollectionSlug","useAsTitle","user","userHasAccessToAllTenants","view","viewType"],"mappings":"AAEA,SAASA,WAAWC,UAAU,QAAQ,kBAAiB;AACvD,SAASC,QAAQ,QAAQ,qBAAoB;AAI7C,SAASC,qBAAqB,QAAQ,2CAA0C;AAehF,OAAO,MAAMC,qBAAqB,OAAOC;IACvC,MAAMC,iBAAiBD,MAAMC;IAC7B,IAAIA,kBAAkBD,KAAKE,WAAW,EAAEC,SAASF,iBAAiB;QAChE,MAAMN,UAAU,MAAMC;QACtB,MAAMQ,gBAAgB,MAAMN,sBAAsB;YAChDO,MAAMJ;YACNK,OAAON,KAAKM,KAAK;YACjBX;YACAY,SAASP,KAAKO,OAAO;YACrBC,iBAAiBR,KAAKQ,eAAe;YACrCC,uBAAuBT,KAAKU,oBAAoB;YAChDC,6BAA6BX,KAAKY,0BAA0B;YAC5DC,uBAAuBb,KAAKa,qBAAqB;YACjDC,YAAYd,KAAKc,UAAU;YAC3BC,MAAMf,KAAKe,IAAI;YACfC,2BAA2BhB,KAAKgB,yBAAyB;YACzDC,MAAMjB,KAAKkB,QAAQ;QACrB;QAEA,IAAId,eAAe;YACjBP,SAASO;QACX;IACF;AACF,EAAC"}
1
+ {"version":3,"sources":["../../../src/components/GlobalViewRedirect/index.ts"],"sourcesContent":["import type { CollectionSlug, ServerProps, ViewTypes } from 'payload'\n\nimport type { MultiTenantPluginConfig } from '../../types.js'\n\nimport { getGlobalViewRedirect } from '../../utilities/getGlobalViewRedirect.js'\n\ntype Args = {\n collectionSlug: CollectionSlug\n docID?: number | string\n globalSlugs: string[]\n tenantArrayFieldName: string\n tenantArrayTenantFieldName: string\n tenantFieldName: string\n tenantsCollectionSlug: string\n useAsTitle: string\n userHasAccessToAllTenants: Required<MultiTenantPluginConfig>['userHasAccessToAllTenants']\n viewType: ViewTypes\n} & ServerProps\n\nexport const GlobalViewRedirect = async (args: Args) => {\n const collectionSlug = args?.collectionSlug\n if (collectionSlug && args.globalSlugs?.includes(collectionSlug)) {\n if (!args.server) {\n throw new Error(\n 'GlobalViewRedirect requires `server` in ServerProps. Ensure your framework adapter (e.g. @payloadcms/next) populates ServerProps.server.',\n )\n }\n const headers = await args.server.getHeaders()\n const redirectRoute = await getGlobalViewRedirect({\n slug: collectionSlug,\n docID: args.docID,\n headers,\n payload: args.payload,\n server: args.server,\n tenantFieldName: args.tenantFieldName,\n tenantsArrayFieldName: args.tenantArrayFieldName,\n tenantsArrayTenantFieldName: args.tenantArrayTenantFieldName,\n tenantsCollectionSlug: args.tenantsCollectionSlug,\n useAsTitle: args.useAsTitle,\n user: args.user,\n userHasAccessToAllTenants: args.userHasAccessToAllTenants,\n view: args.viewType,\n })\n\n if (redirectRoute) {\n args.server.redirect(redirectRoute)\n }\n }\n}\n"],"names":["getGlobalViewRedirect","GlobalViewRedirect","args","collectionSlug","globalSlugs","includes","server","Error","headers","getHeaders","redirectRoute","slug","docID","payload","tenantFieldName","tenantsArrayFieldName","tenantArrayFieldName","tenantsArrayTenantFieldName","tenantArrayTenantFieldName","tenantsCollectionSlug","useAsTitle","user","userHasAccessToAllTenants","view","viewType","redirect"],"mappings":"AAIA,SAASA,qBAAqB,QAAQ,2CAA0C;AAehF,OAAO,MAAMC,qBAAqB,OAAOC;IACvC,MAAMC,iBAAiBD,MAAMC;IAC7B,IAAIA,kBAAkBD,KAAKE,WAAW,EAAEC,SAASF,iBAAiB;QAChE,IAAI,CAACD,KAAKI,MAAM,EAAE;YAChB,MAAM,IAAIC,MACR;QAEJ;QACA,MAAMC,UAAU,MAAMN,KAAKI,MAAM,CAACG,UAAU;QAC5C,MAAMC,gBAAgB,MAAMV,sBAAsB;YAChDW,MAAMR;YACNS,OAAOV,KAAKU,KAAK;YACjBJ;YACAK,SAASX,KAAKW,OAAO;YACrBP,QAAQJ,KAAKI,MAAM;YACnBQ,iBAAiBZ,KAAKY,eAAe;YACrCC,uBAAuBb,KAAKc,oBAAoB;YAChDC,6BAA6Bf,KAAKgB,0BAA0B;YAC5DC,uBAAuBjB,KAAKiB,qBAAqB;YACjDC,YAAYlB,KAAKkB,UAAU;YAC3BC,MAAMnB,KAAKmB,IAAI;YACfC,2BAA2BpB,KAAKoB,yBAAyB;YACzDC,MAAMrB,KAAKsB,QAAQ;QACrB;QAEA,IAAId,eAAe;YACjBR,KAAKI,MAAM,CAACmB,QAAQ,CAACf;QACvB;IACF;AACF,EAAC"}
@@ -1,6 +1,6 @@
1
1
  import type { RelationshipFieldClientProps } from 'payload';
2
2
  import React from 'react';
3
- import './index.scss';
3
+ import './index.css';
4
4
  type Props = {
5
5
  debug?: boolean;
6
6
  unique?: boolean;
@@ -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;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,6BA6HjE,CAAA"}
1
+ {"version":3,"file":"index.client.d.ts","sourceRoot":"","sources":["../../../src/components/TenantField/index.client.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,SAAS,CAAA;AAa3D,OAAO,KAAK,MAAM,OAAO,CAAA;AASzB,OAAO,aAAa,CAAA;AAIpB,KAAK,KAAK,GAAG;IACX,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,MAAM,CAAC,EAAE,OAAO,CAAA;CACjB,GAAG,4BAA4B,CAAA;AAEhC,eAAO,MAAM,WAAW,oCAAqC,KAAK,6BAoIjE,CAAA"}
@@ -1,91 +1,90 @@
1
1
  'use client';
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
- import { Pill, RelationshipField, useDocumentInfo, useField, useForm, useFormModified, useModal } from '@payloadcms/ui';
3
+ import { FieldContext, FieldPathContext, Pill, RelationshipField, useDocumentInfo, useField, useForm, useFormModified, useModal } from '@payloadcms/ui';
4
4
  import React from 'react';
5
5
  import { useTenantSelection } from '../../providers/TenantSelectionProvider/index.client.js';
6
6
  import { AssignTenantFieldModal, assignTenantModalSlug } from '../AssignTenantFieldModal/index.client.js';
7
- import './index.scss';
7
+ import './index.css';
8
8
  const baseClass = 'tenantField';
9
9
  export const TenantField = ({ debug, unique, ...fieldArgs })=>{
10
10
  const { entityType, options, selectedTenantID, setEntityType, setTenant } = useTenantSelection();
11
- const { setValue, showError, value } = useField();
12
- const modified = useFormModified();
13
- const { isValid: isFormValid, setModified } = useForm();
11
+ const tenantField = useField();
12
+ const { setValue, showError, value } = tenantField;
13
+ const { isValid: isFormValid } = useForm();
14
14
  const { id: docID, collectionSlug } = useDocumentInfo();
15
15
  const { isModalOpen, openModal } = useModal();
16
16
  const isEditManyModalOpen = collectionSlug ? isModalOpen(`edit-${collectionSlug}`) || isModalOpen(`edit-${collectionSlug}-bulk-uploads`) : false;
17
- const isConfirmingRef = React.useRef(false);
18
- const prevModified = React.useRef(modified);
19
- const prevValue = React.useRef(value);
20
- const showField = options.length > 1 && !fieldArgs.field.admin?.hidden && !fieldArgs.field.hidden || debug;
21
- const onConfirm = React.useCallback(()=>{
22
- isConfirmingRef.current = true;
23
- }, []);
24
- const afterModalOpen = React.useCallback(()=>{
25
- prevModified.current = modified;
26
- prevValue.current = value;
27
- }, [
28
- modified,
29
- value
17
+ const [modalValue, setModalValue] = React.useState(value);
18
+ const localTenantField = React.useMemo(()=>({
19
+ ...tenantField,
20
+ initialValue: modalValue,
21
+ setValue: (nextValue)=>{
22
+ setModalValue(nextValue);
23
+ },
24
+ value: modalValue
25
+ }), [
26
+ modalValue,
27
+ tenantField
30
28
  ]);
31
- const afterModalClose = React.useCallback(()=>{
32
- let didChange = true;
33
- if (isConfirmingRef.current) {
34
- // did the values actually change?
35
- if (fieldArgs.field.hasMany) {
36
- const prev = prevValue.current || [];
37
- const newValue = value || [];
38
- if (prev.length !== newValue.length) {
39
- didChange = true;
40
- } else {
41
- const allMatch = newValue.every((val)=>prev.includes(val));
42
- if (allMatch) {
43
- didChange = false;
44
- }
45
- }
46
- } else if (value === prevValue.current) {
47
- didChange = false;
29
+ const showField = options.length > 1 && !fieldArgs.field.admin?.hidden && !fieldArgs.field.hidden || debug;
30
+ function getTenantIDToSelect({ selectedTenantID, value }) {
31
+ if (Array.isArray(value)) {
32
+ if (!value.length) {
33
+ return undefined;
48
34
  }
49
- if (didChange) {
50
- prevModified.current = true;
51
- prevValue.current = value;
35
+ if (!selectedTenantID || !value.includes(selectedTenantID)) {
36
+ return value[0];
52
37
  }
38
+ return undefined;
39
+ }
40
+ if (value && selectedTenantID !== value) {
41
+ return value;
42
+ }
43
+ return undefined;
44
+ }
45
+ const syncTenantSelectionFromValue = React.useCallback((tenantValue)=>{
46
+ const tenantID = getTenantIDToSelect({
47
+ selectedTenantID,
48
+ value: tenantValue
49
+ });
50
+ if (tenantID) {
51
+ setTenant({
52
+ id: tenantID,
53
+ refresh: false
54
+ });
55
+ }
56
+ }, [
57
+ selectedTenantID,
58
+ setTenant
59
+ ]);
60
+ const onConfirm = React.useCallback(()=>{
61
+ if (hasTenantValueChanged({
62
+ hasMany: fieldArgs.field.hasMany,
63
+ modalValue,
64
+ value
65
+ })) {
66
+ setValue(modalValue);
67
+ syncTenantSelectionFromValue(modalValue);
53
68
  }
54
- setValue(prevValue.current, true);
55
- setModified(prevModified.current);
56
- isConfirmingRef.current = false;
57
69
  }, [
70
+ fieldArgs.field.hasMany,
71
+ modalValue,
58
72
  setValue,
59
- setModified,
60
- value,
61
- fieldArgs.field.hasMany
73
+ syncTenantSelectionFromValue,
74
+ value
75
+ ]);
76
+ const afterModalOpen = React.useCallback(()=>{
77
+ setModalValue(value);
78
+ }, [
79
+ value
62
80
  ]);
63
81
  React.useEffect(()=>{
64
82
  if (!entityType) {
65
83
  setEntityType(unique ? 'global' : 'document');
66
84
  } else {
67
85
  // unique documents are controlled from the global TenantSelector
68
- if (!unique && value) {
69
- if (Array.isArray(value)) {
70
- if (value.length) {
71
- if (!selectedTenantID) {
72
- setTenant({
73
- id: value[0],
74
- refresh: false
75
- });
76
- } else if (!value.includes(selectedTenantID)) {
77
- setTenant({
78
- id: value[0],
79
- refresh: false
80
- });
81
- }
82
- }
83
- } else if (selectedTenantID !== value) {
84
- setTenant({
85
- id: value,
86
- refresh: false
87
- });
88
- }
86
+ if (!unique) {
87
+ syncTenantSelectionFromValue(value);
89
88
  }
90
89
  }
91
90
  return ()=>{
@@ -94,13 +93,11 @@ export const TenantField = ({ debug, unique, ...fieldArgs })=>{
94
93
  }
95
94
  };
96
95
  }, [
97
- unique,
98
- options,
99
- selectedTenantID,
100
- setTenant,
101
- value,
96
+ entityType,
102
97
  setEntityType,
103
- entityType
98
+ syncTenantSelectionFromValue,
99
+ unique,
100
+ value
104
101
  ]);
105
102
  React.useEffect(()=>{
106
103
  if (unique || debug || isEditManyModalOpen) {
@@ -131,12 +128,17 @@ export const TenantField = ({ debug, unique, ...fieldArgs })=>{
131
128
  }
132
129
  if (!unique) {
133
130
  /** Editing a non-global tenant document */ return /*#__PURE__*/ _jsx(AssignTenantFieldModal, {
134
- afterModalClose: afterModalClose,
135
131
  afterModalOpen: afterModalOpen,
136
132
  onConfirm: onConfirm,
137
- children: /*#__PURE__*/ _jsx(TenantRelationshipField, {
138
- fieldArgs: fieldArgs,
139
- unique: unique
133
+ children: /*#__PURE__*/ _jsx(FieldPathContext, {
134
+ value: tenantField.path,
135
+ children: /*#__PURE__*/ _jsx(FieldContext, {
136
+ value: localTenantField,
137
+ children: /*#__PURE__*/ _jsx(TenantRelationshipField, {
138
+ fieldArgs: fieldArgs,
139
+ unique: unique
140
+ })
141
+ })
140
142
  })
141
143
  });
142
144
  }
@@ -144,6 +146,14 @@ export const TenantField = ({ debug, unique, ...fieldArgs })=>{
144
146
  }
145
147
  return null;
146
148
  };
149
+ const hasTenantValueChanged = ({ hasMany, modalValue, value })=>{
150
+ if (hasMany) {
151
+ const currentValue = value || [];
152
+ const nextValue = modalValue || [];
153
+ return currentValue.length !== nextValue.length || nextValue.some((nextValueItem)=>!currentValue.includes(nextValueItem));
154
+ }
155
+ return value !== modalValue;
156
+ };
147
157
  const TenantRelationshipField = ({ debug, fieldArgs, unique })=>{
148
158
  return /*#__PURE__*/ _jsx("div", {
149
159
  className: baseClass,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/TenantField/index.client.tsx"],"sourcesContent":["'use client'\n\nimport type { RelationshipFieldClientProps } from 'payload'\n\nimport {\n Pill,\n RelationshipField,\n useDocumentInfo,\n useField,\n useForm,\n useFormModified,\n useModal,\n} from '@payloadcms/ui'\nimport React from 'react'\n\nimport { useTenantSelection } from '../../providers/TenantSelectionProvider/index.client.js'\nimport {\n AssignTenantFieldModal,\n assignTenantModalSlug,\n} from '../AssignTenantFieldModal/index.client.js'\nimport './index.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, collectionSlug } = useDocumentInfo()\n const { isModalOpen, openModal } = useModal()\n const isEditManyModalOpen = collectionSlug\n ? isModalOpen(`edit-${collectionSlug}`) || isModalOpen(`edit-${collectionSlug}-bulk-uploads`)\n : false\n const isConfirmingRef = React.useRef<boolean>(false)\n const prevModified = React.useRef(modified)\n const prevValue = React.useRef<typeof value>(value)\n const showField =\n (options.length > 1 && !fieldArgs.field.admin?.hidden && !fieldArgs.field.hidden) || debug\n\n const onConfirm = React.useCallback(() => {\n isConfirmingRef.current = true\n }, [])\n\n const afterModalOpen = React.useCallback(() => {\n prevModified.current = modified\n prevValue.current = value\n }, [modified, value])\n\n const afterModalClose = React.useCallback(() => {\n let didChange = true\n if (isConfirmingRef.current) {\n // did the values actually change?\n if (fieldArgs.field.hasMany) {\n const prev = (prevValue.current || []) as (number | string)[]\n const newValue = (value || []) as (number | string)[]\n if (prev.length !== newValue.length) {\n didChange = true\n } else {\n const allMatch = newValue.every((val) => prev.includes(val))\n if (allMatch) {\n didChange = false\n }\n }\n } else if (value === prevValue.current) {\n didChange = false\n }\n\n if (didChange) {\n prevModified.current = true\n prevValue.current = value\n }\n }\n\n setValue(prevValue.current, true)\n setModified(prevModified.current)\n\n isConfirmingRef.current = false\n }, [setValue, setModified, value, fieldArgs.field.hasMany])\n\n React.useEffect(() => {\n if (!entityType) {\n setEntityType(unique ? 'global' : 'document')\n } else {\n // unique documents are controlled from the global TenantSelector\n if (!unique && value) {\n if (Array.isArray(value)) {\n if (value.length) {\n if (!selectedTenantID) {\n setTenant({ id: value[0], refresh: false })\n } else if (!value.includes(selectedTenantID)) {\n setTenant({ id: value[0], refresh: false })\n }\n }\n } else if (selectedTenantID !== value) {\n setTenant({ id: value, refresh: false })\n }\n }\n }\n\n return () => {\n if (entityType) {\n setEntityType(undefined)\n }\n }\n }, [unique, options, selectedTenantID, setTenant, value, setEntityType, entityType])\n\n React.useEffect(() => {\n if (unique || debug || isEditManyModalOpen) {\n return\n }\n if (showField && ((!isFormValid && showError) || (!value && !selectedTenantID))) {\n openModal(assignTenantModalSlug)\n }\n }, [\n debug,\n isEditManyModalOpen,\n isFormValid,\n showError,\n showField,\n openModal,\n value,\n docID,\n selectedTenantID,\n unique,\n ])\n\n if (showField) {\n if (debug || isEditManyModalOpen) {\n return <TenantRelationshipField debug={debug} fieldArgs={fieldArgs} unique={unique} />\n }\n\n if (!unique) {\n /** Editing a non-global tenant document */\n return (\n <AssignTenantFieldModal\n afterModalClose={afterModalClose}\n afterModalOpen={afterModalOpen}\n onConfirm={onConfirm}\n >\n <TenantRelationshipField fieldArgs={fieldArgs} unique={unique} />\n </AssignTenantFieldModal>\n )\n }\n\n return <SyncFormModified />\n }\n\n return null\n}\n\nconst TenantRelationshipField: React.FC<{\n debug?: boolean\n fieldArgs: RelationshipFieldClientProps\n unique?: boolean\n}> = ({ debug, fieldArgs, unique }) => {\n return (\n <div className={baseClass}>\n <div className={`${baseClass}__wrapper`}>\n {debug && (\n <Pill className={`${baseClass}__debug-pill`} pillStyle=\"success\" size=\"small\">\n Multi-Tenant Debug Enabled\n </Pill>\n )}\n <RelationshipField\n {...fieldArgs}\n field={{\n ...fieldArgs.field,\n required: true,\n }}\n readOnly={fieldArgs.readOnly || fieldArgs.field.admin?.readOnly || unique}\n />\n </div>\n </div>\n )\n}\n\n/**\n * Tells the global selector when the form has been modified\n * so it can display the \"Leave without saving\" confirmation modal\n * if modified and attempting to change the tenant\n */\nconst SyncFormModified = () => {\n const modified = useFormModified()\n const { setModified } = useTenantSelection()\n\n React.useEffect(() => {\n setModified(modified)\n }, [modified, setModified])\n\n return null\n}\n"],"names":["Pill","RelationshipField","useDocumentInfo","useField","useForm","useFormModified","useModal","React","useTenantSelection","AssignTenantFieldModal","assignTenantModalSlug","baseClass","TenantField","debug","unique","fieldArgs","entityType","options","selectedTenantID","setEntityType","setTenant","setValue","showError","value","modified","isValid","isFormValid","setModified","id","docID","collectionSlug","isModalOpen","openModal","isEditManyModalOpen","isConfirmingRef","useRef","prevModified","prevValue","showField","length","field","admin","hidden","onConfirm","useCallback","current","afterModalOpen","afterModalClose","didChange","hasMany","prev","newValue","allMatch","every","val","includes","useEffect","Array","isArray","refresh","undefined","TenantRelationshipField","SyncFormModified","div","className","pillStyle","size","required","readOnly"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/components/TenantField/index.client.tsx"],"sourcesContent":["'use client'\n\nimport type { FieldType } from '@payloadcms/ui'\nimport type { RelationshipFieldClientProps } from 'payload'\n\nimport {\n FieldContext,\n FieldPathContext,\n Pill,\n RelationshipField,\n useDocumentInfo,\n useField,\n useForm,\n useFormModified,\n useModal,\n} from '@payloadcms/ui'\nimport React from 'react'\n\nimport type { TenantValue } from '../../types.js'\n\nimport { useTenantSelection } from '../../providers/TenantSelectionProvider/index.client.js'\nimport {\n AssignTenantFieldModal,\n assignTenantModalSlug,\n} from '../AssignTenantFieldModal/index.client.js'\nimport './index.css'\n\nconst baseClass = 'tenantField'\n\ntype Props = {\n debug?: boolean\n unique?: boolean\n} & RelationshipFieldClientProps\n\nexport const TenantField = ({ debug, unique, ...fieldArgs }: Props) => {\n const { entityType, options, selectedTenantID, setEntityType, setTenant } = useTenantSelection()\n const tenantField = useField<TenantValue>()\n const { setValue, showError, value } = tenantField\n const { isValid: isFormValid } = useForm()\n const { id: docID, collectionSlug } = useDocumentInfo()\n const { isModalOpen, openModal } = useModal()\n const isEditManyModalOpen = collectionSlug\n ? isModalOpen(`edit-${collectionSlug}`) || isModalOpen(`edit-${collectionSlug}-bulk-uploads`)\n : false\n const [modalValue, setModalValue] = React.useState<TenantValue | undefined>(value)\n const localTenantField = React.useMemo<FieldType<TenantValue>>(\n () => ({\n ...tenantField,\n initialValue: modalValue,\n setValue: (nextValue) => {\n setModalValue(nextValue as TenantValue | undefined)\n },\n value: modalValue as TenantValue,\n }),\n [modalValue, tenantField],\n )\n const showField =\n (options.length > 1 && !fieldArgs.field.admin?.hidden && !fieldArgs.field.hidden) || debug\n\n function getTenantIDToSelect({\n selectedTenantID,\n value,\n }: {\n selectedTenantID: number | string | undefined\n value: TenantValue | undefined\n }): number | string | undefined {\n if (Array.isArray(value)) {\n if (!value.length) {\n return undefined\n }\n\n if (!selectedTenantID || !value.includes(selectedTenantID)) {\n return value[0]\n }\n\n return undefined\n }\n\n if (value && selectedTenantID !== value) {\n return value\n }\n\n return undefined\n }\n\n const syncTenantSelectionFromValue = React.useCallback(\n (tenantValue: TenantValue | undefined) => {\n const tenantID = getTenantIDToSelect({ selectedTenantID, value: tenantValue })\n\n if (tenantID) {\n setTenant({ id: tenantID, refresh: false })\n }\n },\n [selectedTenantID, setTenant],\n )\n\n const onConfirm = React.useCallback(() => {\n if (hasTenantValueChanged({ hasMany: fieldArgs.field.hasMany, modalValue, value })) {\n setValue(modalValue)\n syncTenantSelectionFromValue(modalValue)\n }\n }, [fieldArgs.field.hasMany, modalValue, setValue, syncTenantSelectionFromValue, value])\n\n const afterModalOpen = React.useCallback(() => {\n setModalValue(value)\n }, [value])\n\n React.useEffect(() => {\n if (!entityType) {\n setEntityType(unique ? 'global' : 'document')\n } else {\n // unique documents are controlled from the global TenantSelector\n if (!unique) {\n syncTenantSelectionFromValue(value)\n }\n }\n\n return () => {\n if (entityType) {\n setEntityType(undefined)\n }\n }\n }, [entityType, setEntityType, syncTenantSelectionFromValue, unique, value])\n\n React.useEffect(() => {\n if (unique || debug || isEditManyModalOpen) {\n return\n }\n if (showField && ((!isFormValid && showError) || (!value && !selectedTenantID))) {\n openModal(assignTenantModalSlug)\n }\n }, [\n debug,\n isEditManyModalOpen,\n isFormValid,\n showError,\n showField,\n openModal,\n value,\n docID,\n selectedTenantID,\n unique,\n ])\n\n if (showField) {\n if (debug || isEditManyModalOpen) {\n return <TenantRelationshipField debug={debug} fieldArgs={fieldArgs} unique={unique} />\n }\n\n if (!unique) {\n /** Editing a non-global tenant document */\n return (\n <AssignTenantFieldModal afterModalOpen={afterModalOpen} onConfirm={onConfirm}>\n <FieldPathContext value={tenantField.path}>\n <FieldContext value={localTenantField}>\n <TenantRelationshipField fieldArgs={fieldArgs} unique={unique} />\n </FieldContext>\n </FieldPathContext>\n </AssignTenantFieldModal>\n )\n }\n\n return <SyncFormModified />\n }\n\n return null\n}\n\nconst hasTenantValueChanged = ({\n hasMany,\n modalValue,\n value,\n}: {\n hasMany?: boolean\n modalValue: TenantValue | undefined\n value: TenantValue | undefined\n}): boolean => {\n if (hasMany) {\n const currentValue = (value || []) as (number | string)[]\n const nextValue = (modalValue || []) as (number | string)[]\n\n return (\n currentValue.length !== nextValue.length ||\n nextValue.some((nextValueItem) => !currentValue.includes(nextValueItem))\n )\n }\n\n return value !== modalValue\n}\n\nconst TenantRelationshipField: React.FC<{\n debug?: boolean\n fieldArgs: RelationshipFieldClientProps\n unique?: boolean\n}> = ({ debug, fieldArgs, unique }) => {\n return (\n <div className={baseClass}>\n <div className={`${baseClass}__wrapper`}>\n {debug && (\n <Pill className={`${baseClass}__debug-pill`} pillStyle=\"success\" size=\"small\">\n Multi-Tenant Debug Enabled\n </Pill>\n )}\n <RelationshipField\n {...fieldArgs}\n field={{\n ...fieldArgs.field,\n required: true,\n }}\n readOnly={fieldArgs.readOnly || fieldArgs.field.admin?.readOnly || unique}\n />\n </div>\n </div>\n )\n}\n\n/**\n * Tells the global selector when the form has been modified\n * so it can display the \"Leave without saving\" confirmation modal\n * if modified and attempting to change the tenant\n */\nconst SyncFormModified = () => {\n const modified = useFormModified()\n const { setModified } = useTenantSelection()\n\n React.useEffect(() => {\n setModified(modified)\n }, [modified, setModified])\n\n return null\n}\n"],"names":["FieldContext","FieldPathContext","Pill","RelationshipField","useDocumentInfo","useField","useForm","useFormModified","useModal","React","useTenantSelection","AssignTenantFieldModal","assignTenantModalSlug","baseClass","TenantField","debug","unique","fieldArgs","entityType","options","selectedTenantID","setEntityType","setTenant","tenantField","setValue","showError","value","isValid","isFormValid","id","docID","collectionSlug","isModalOpen","openModal","isEditManyModalOpen","modalValue","setModalValue","useState","localTenantField","useMemo","initialValue","nextValue","showField","length","field","admin","hidden","getTenantIDToSelect","Array","isArray","undefined","includes","syncTenantSelectionFromValue","useCallback","tenantValue","tenantID","refresh","onConfirm","hasTenantValueChanged","hasMany","afterModalOpen","useEffect","TenantRelationshipField","path","SyncFormModified","currentValue","some","nextValueItem","div","className","pillStyle","size","required","readOnly","modified","setModified"],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ @layer payload-default {
2
+ .document-fields__sidebar-fields .render-fields .tenantField,
3
+ .document-fields__main .render-fields .tenantField {
4
+ width: calc(100% + var(--gutter-h) * 2);
5
+ margin-left: calc(-1 * var(--gutter-h));
6
+ border-bottom: var(--stroke-width-small) solid var(--color-border);
7
+ padding-top: var(--spacer-3);
8
+ padding-bottom: var(--spacer-4);
9
+ }
10
+
11
+ .document-fields__sidebar-fields .render-fields .tenantField__wrapper,
12
+ .document-fields__main .render-fields .tenantField__wrapper {
13
+ padding-left: var(--gutter-h);
14
+ padding-right: var(--gutter-h);
15
+ }
16
+
17
+ [dir='rtl'] .document-fields__sidebar-fields .render-fields .tenantField,
18
+ [dir='rtl'] .document-fields__main .render-fields .tenantField {
19
+ margin-left: 0;
20
+ margin-right: calc(-1 * var(--gutter-h));
21
+ }
22
+
23
+ .document-fields__sidebar-fields .render-fields .tenantField:not(:first-child),
24
+ .document-fields__main .render-fields .tenantField:not(:first-child) {
25
+ border-top: var(--stroke-width-small) solid var(--color-border);
26
+ margin-top: var(--spacer-4);
27
+ }
28
+
29
+ .document-fields__sidebar-fields .render-fields .tenantField:not(:last-child),
30
+ .document-fields__main .render-fields .tenantField:not(:last-child) {
31
+ margin-bottom: var(--spacing-field);
32
+ }
33
+
34
+ .document-fields__sidebar-fields .render-fields .tenantField:first-child,
35
+ .document-fields__main .render-fields .tenantField:first-child {
36
+ margin-top: calc(-1 * var(--spacer-4));
37
+ padding-top: var(--spacer-4);
38
+ }
39
+
40
+ .document-fields__sidebar-fields .render-fields .tenantField__debug-pill,
41
+ .document-fields__main .render-fields .tenantField__debug-pill {
42
+ margin-bottom: var(--spacer-2);
43
+ }
44
+ }
@@ -1,10 +1,10 @@
1
1
  import type { ViewTypes } from 'payload';
2
2
  import React from 'react';
3
3
  import type { MultiTenantPluginConfig } from '../../types.js';
4
- import './index.scss';
4
+ import './index.css';
5
5
  export declare const TenantSelectorClient: ({ disabled: disabledFromProps, label, viewType, }: {
6
6
  disabled?: boolean;
7
- label?: MultiTenantPluginConfig["tenantSelectorLabel"];
7
+ label?: MultiTenantPluginConfig['tenantSelectorLabel'];
8
8
  viewType?: ViewTypes;
9
9
  }) => React.JSX.Element | null;
10
10
  //# sourceMappingURL=index.client.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.client.d.ts","sourceRoot":"","sources":["../../../src/components/TenantSelector/index.client.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAIxC,OAAO,KAAK,MAAM,OAAO,CAAA;AAMzB,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAA;AAG7D,OAAO,cAAc,CAAA;AAIrB,eAAO,MAAM,oBAAoB,sDAI9B;IACD,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,KAAK,CAAC,EAAE,uBAAuB,CAAC,qBAAqB,CAAC,CAAA;IACtD,QAAQ,CAAC,EAAE,SAAS,CAAA;CACrB,6BAgFA,CAAA"}
1
+ {"version":3,"file":"index.client.d.ts","sourceRoot":"","sources":["../../../src/components/TenantSelector/index.client.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAIxC,OAAO,KAAK,MAAM,OAAO,CAAA;AAMzB,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAA;AAG7D,OAAO,aAAa,CAAA;AAMpB,eAAO,MAAM,oBAAoB,sDAI9B;IACD,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,KAAK,CAAC,EAAE,uBAAuB,CAAC,qBAAqB,CAAC,CAAA;IACtD,QAAQ,CAAC,EAAE,SAAS,CAAA;CACrB,6BAiFA,CAAA"}