@payloadcms/plugin-multi-tenant 3.54.0-internal.bdc84f3 → 3.55.0-canary.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.
@@ -37,7 +37,7 @@ export const TenantField = (args)=>{
37
37
  setEntityType,
38
38
  entityType
39
39
  ]);
40
- if (options.length > 1) {
40
+ if (options.length > 1 && !args.field.admin?.hidden && !args.field.hidden) {
41
41
  return /*#__PURE__*/ _jsxs(_Fragment, {
42
42
  children: [
43
43
  /*#__PURE__*/ _jsx("div", {
@@ -50,7 +50,7 @@ export const TenantField = (args)=>{
50
50
  ...args.field,
51
51
  required: true
52
52
  },
53
- readOnly: args.readOnly || args.unique
53
+ readOnly: args.readOnly || args.field.admin?.readOnly || args.unique
54
54
  })
55
55
  })
56
56
  }),
@@ -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) {\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.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","div","className","field","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, 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 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/TenantSelector/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAE1C,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAA;AAI7D,KAAK,KAAK,GAAG;IACX,YAAY,EAAE,MAAM,EAAE,CAAA;IACtB,KAAK,EAAE,uBAAuB,CAAC,qBAAqB,CAAC,CAAA;CACtD,GAAG,WAAW,CAAA;AACf,eAAO,MAAM,cAAc,UAAW,KAAK,gCAW1C,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/TenantSelector/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAE1C,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAA;AAI7D,KAAK,KAAK,GAAG;IACX,YAAY,EAAE,MAAM,EAAE,CAAA;IACtB,KAAK,EAAE,uBAAuB,CAAC,qBAAqB,CAAC,CAAA;CACtD,GAAG,WAAW,CAAA;AACf,eAAO,MAAM,cAAc,UAAW,KAAK,gCAI1C,CAAA"}
@@ -1,10 +1,8 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { TenantSelectorClient } from './index.client.js';
3
3
  export const TenantSelector = (props)=>{
4
- const { enabledSlugs, label, params, viewType } = props;
5
- const enabled = Boolean(params?.segments && Array.isArray(params.segments) && params.segments[0] === 'collections' && params.segments[1] && enabledSlugs.includes(params.segments[1]));
4
+ const { label, viewType } = props;
6
5
  return /*#__PURE__*/ _jsx(TenantSelectorClient, {
7
- disabled: !enabled,
8
6
  label: label,
9
7
  viewType: viewType
10
8
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/TenantSelector/index.tsx"],"sourcesContent":["import type { ServerProps } from 'payload'\n\nimport type { MultiTenantPluginConfig } from '../../types.js'\n\nimport { TenantSelectorClient } from './index.client.js'\n\ntype Props = {\n enabledSlugs: string[]\n label: MultiTenantPluginConfig['tenantSelectorLabel']\n} & ServerProps\nexport const TenantSelector = (props: Props) => {\n const { enabledSlugs, label, params, viewType } = props\n const enabled = Boolean(\n params?.segments &&\n Array.isArray(params.segments) &&\n params.segments[0] === 'collections' &&\n params.segments[1] &&\n enabledSlugs.includes(params.segments[1]),\n )\n\n return <TenantSelectorClient disabled={!enabled} label={label} viewType={viewType} />\n}\n"],"names":["TenantSelectorClient","TenantSelector","props","enabledSlugs","label","params","viewType","enabled","Boolean","segments","Array","isArray","includes","disabled"],"mappings":";AAIA,SAASA,oBAAoB,QAAQ,oBAAmB;AAMxD,OAAO,MAAMC,iBAAiB,CAACC;IAC7B,MAAM,EAAEC,YAAY,EAAEC,KAAK,EAAEC,MAAM,EAAEC,QAAQ,EAAE,GAAGJ;IAClD,MAAMK,UAAUC,QACdH,QAAQI,YACNC,MAAMC,OAAO,CAACN,OAAOI,QAAQ,KAC7BJ,OAAOI,QAAQ,CAAC,EAAE,KAAK,iBACvBJ,OAAOI,QAAQ,CAAC,EAAE,IAClBN,aAAaS,QAAQ,CAACP,OAAOI,QAAQ,CAAC,EAAE;IAG5C,qBAAO,KAACT;QAAqBa,UAAU,CAACN;QAASH,OAAOA;QAAOE,UAAUA;;AAC3E,EAAC"}
1
+ {"version":3,"sources":["../../../src/components/TenantSelector/index.tsx"],"sourcesContent":["import type { ServerProps } from 'payload'\n\nimport type { MultiTenantPluginConfig } from '../../types.js'\n\nimport { TenantSelectorClient } from './index.client.js'\n\ntype Props = {\n enabledSlugs: string[]\n label: MultiTenantPluginConfig['tenantSelectorLabel']\n} & ServerProps\nexport const TenantSelector = (props: Props) => {\n const { label, viewType } = props\n\n return <TenantSelectorClient label={label} viewType={viewType} />\n}\n"],"names":["TenantSelectorClient","TenantSelector","props","label","viewType"],"mappings":";AAIA,SAASA,oBAAoB,QAAQ,oBAAmB;AAMxD,OAAO,MAAMC,iBAAiB,CAACC;IAC7B,MAAM,EAAEC,KAAK,EAAEC,QAAQ,EAAE,GAAGF;IAE5B,qBAAO,KAACF;QAAqBG,OAAOA;QAAOC,UAAUA;;AACvD,EAAC"}
@@ -1,2 +1,3 @@
1
+ export { tenantField } from '../fields/tenantField/index.js';
1
2
  export { tenantsArrayField } from '../fields/tenantsArrayField/index.js';
2
3
  //# sourceMappingURL=fields.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"fields.d.ts","sourceRoot":"","sources":["../../src/exports/fields.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,sCAAsC,CAAA"}
1
+ {"version":3,"file":"fields.d.ts","sourceRoot":"","sources":["../../src/exports/fields.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAA;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,sCAAsC,CAAA"}
@@ -1,3 +1,4 @@
1
+ export { tenantField } from '../fields/tenantField/index.js';
1
2
  export { tenantsArrayField } from '../fields/tenantsArrayField/index.js';
2
3
 
3
4
  //# sourceMappingURL=fields.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/exports/fields.ts"],"sourcesContent":["export { tenantsArrayField } from '../fields/tenantsArrayField/index.js'\n"],"names":["tenantsArrayField"],"mappings":"AAAA,SAASA,iBAAiB,QAAQ,uCAAsC"}
1
+ {"version":3,"sources":["../../src/exports/fields.ts"],"sourcesContent":["export { tenantField } from '../fields/tenantField/index.js'\nexport { tenantsArrayField } from '../fields/tenantsArrayField/index.js'\n"],"names":["tenantField","tenantsArrayField"],"mappings":"AAAA,SAASA,WAAW,QAAQ,iCAAgC;AAC5D,SAASC,iBAAiB,QAAQ,uCAAsC"}
@@ -1,3 +1,4 @@
1
+ export { defaults } from '../defaults.js';
1
2
  export { filterDocumentsByTenants as getTenantListFilter } from '../filters/filterDocumentsByTenants.js';
2
3
  export { getGlobalViewRedirect } from '../utilities/getGlobalViewRedirect.js';
3
4
  export { getTenantAccess } from '../utilities/getTenantAccess.js';
@@ -1 +1 @@
1
- {"version":3,"file":"utilities.d.ts","sourceRoot":"","sources":["../../src/exports/utilities.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,IAAI,mBAAmB,EAAE,MAAM,wCAAwC,CAAA;AACxG,OAAO,EAAE,qBAAqB,EAAE,MAAM,uCAAuC,CAAA;AAC7E,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAA;AACjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAA;AACzE,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAA"}
1
+ {"version":3,"file":"utilities.d.ts","sourceRoot":"","sources":["../../src/exports/utilities.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,EAAE,wBAAwB,IAAI,mBAAmB,EAAE,MAAM,wCAAwC,CAAA;AACxG,OAAO,EAAE,qBAAqB,EAAE,MAAM,uCAAuC,CAAA;AAC7E,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAA;AACjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAA;AACzE,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAA"}
@@ -1,3 +1,4 @@
1
+ export { defaults } from '../defaults.js';
1
2
  export { filterDocumentsByTenants as getTenantListFilter } from '../filters/filterDocumentsByTenants.js';
2
3
  export { getGlobalViewRedirect } from '../utilities/getGlobalViewRedirect.js';
3
4
  export { getTenantAccess } from '../utilities/getTenantAccess.js';
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/exports/utilities.ts"],"sourcesContent":["export { filterDocumentsByTenants as getTenantListFilter } from '../filters/filterDocumentsByTenants.js'\nexport { getGlobalViewRedirect } from '../utilities/getGlobalViewRedirect.js'\nexport { getTenantAccess } from '../utilities/getTenantAccess.js'\nexport { getTenantFromCookie } from '../utilities/getTenantFromCookie.js'\nexport { getUserTenantIDs } from '../utilities/getUserTenantIDs.js'\n"],"names":["filterDocumentsByTenants","getTenantListFilter","getGlobalViewRedirect","getTenantAccess","getTenantFromCookie","getUserTenantIDs"],"mappings":"AAAA,SAASA,4BAA4BC,mBAAmB,QAAQ,yCAAwC;AACxG,SAASC,qBAAqB,QAAQ,wCAAuC;AAC7E,SAASC,eAAe,QAAQ,kCAAiC;AACjE,SAASC,mBAAmB,QAAQ,sCAAqC;AACzE,SAASC,gBAAgB,QAAQ,mCAAkC"}
1
+ {"version":3,"sources":["../../src/exports/utilities.ts"],"sourcesContent":["export { defaults } from '../defaults.js'\nexport { filterDocumentsByTenants as getTenantListFilter } from '../filters/filterDocumentsByTenants.js'\nexport { getGlobalViewRedirect } from '../utilities/getGlobalViewRedirect.js'\nexport { getTenantAccess } from '../utilities/getTenantAccess.js'\nexport { getTenantFromCookie } from '../utilities/getTenantFromCookie.js'\nexport { getUserTenantIDs } from '../utilities/getUserTenantIDs.js'\n"],"names":["defaults","filterDocumentsByTenants","getTenantListFilter","getGlobalViewRedirect","getTenantAccess","getTenantFromCookie","getUserTenantIDs"],"mappings":"AAAA,SAASA,QAAQ,QAAQ,iBAAgB;AACzC,SAASC,4BAA4BC,mBAAmB,QAAQ,yCAAwC;AACxG,SAASC,qBAAqB,QAAQ,wCAAuC;AAC7E,SAASC,eAAe,QAAQ,kCAAiC;AACjE,SAASC,mBAAmB,QAAQ,sCAAqC;AACzE,SAASC,gBAAgB,QAAQ,mCAAkC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAoB,MAAM,EAAE,MAAM,SAAS,CAAA;AAKvD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAA;AAazD,eAAO,MAAM,iBAAiB,GAC3B,UAAU,gBAAgB,uBAAuB,CAAC,UAAU,CAAC,sBAC7C,MAAM,KAAG,MAodzB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAoB,MAAM,EAAE,MAAM,SAAS,CAAA;AAKvD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAA;AAazD,eAAO,MAAM,iBAAiB,GAC3B,UAAU,gBAAgB,uBAAuB,CAAC,UAAU,CAAC,sBAC7C,MAAM,KAAG,MAkezB,CAAA"}
package/dist/index.js CHANGED
@@ -103,6 +103,8 @@ export const multiTenantPlugin = (pluginConfig)=>(incomingConfig)=>{
103
103
  [],
104
104
  []
105
105
  ]);
106
+ // used to track and not duplicate filterOptions on referenced blocks
107
+ const blockReferencesWithFilters = [];
106
108
  // used to validate enabled collection slugs
107
109
  const multiTenantCollectionsFound = [];
108
110
  /**
@@ -112,24 +114,37 @@ export const multiTenantPlugin = (pluginConfig)=>(incomingConfig)=>{
112
114
  */ const foldersSlug = incomingConfig.folders ? incomingConfig.folders.slug || 'payload-folders' : 'payload-folders';
113
115
  if (collectionSlugs.includes(foldersSlug)) {
114
116
  multiTenantCollectionsFound.push(foldersSlug);
115
- const overrides = pluginConfig.collections[foldersSlug]?.tenantFieldOverrides ? pluginConfig.collections[foldersSlug]?.tenantFieldOverrides : pluginConfig.tenantField || {};
116
117
  incomingConfig.folders = incomingConfig.folders || {};
117
118
  incomingConfig.folders.collectionOverrides = incomingConfig.folders.collectionOverrides || [];
118
119
  incomingConfig.folders.collectionOverrides.push(({ collection })=>{
119
120
  /**
120
- * Add tenant field to enabled collections
121
- */ const folderTenantField = tenantField({
122
- ...pluginConfig?.tenantField || {},
123
- name: tenantFieldName,
124
- debug: pluginConfig.debug,
125
- overrides,
121
+ * Add filter options to all relationship fields
122
+ */ addFilterOptionsToFields({
123
+ blockReferencesWithFilters,
124
+ config: incomingConfig,
125
+ fields: collection.fields,
126
+ tenantEnabledCollectionSlugs: collectionSlugs,
127
+ tenantEnabledGlobalSlugs: globalCollectionSlugs,
128
+ tenantFieldName,
126
129
  tenantsArrayFieldName,
127
130
  tenantsArrayTenantFieldName,
128
- tenantsCollectionSlug,
129
- unique: false
131
+ tenantsCollectionSlug
130
132
  });
131
- collection.fields.unshift(folderTenantField);
132
- if (pluginConfig.collections[foldersSlug]?.useBaseListFilter !== false) {
133
+ if (pluginConfig.collections[foldersSlug]?.customTenantField !== true) {
134
+ /**
135
+ * Add tenant field to enabled collections
136
+ */ collection.fields.unshift(tenantField({
137
+ name: tenantFieldName,
138
+ debug: pluginConfig.debug,
139
+ overrides: pluginConfig.collections[collection.slug]?.tenantFieldOverrides ? pluginConfig.collections[collection.slug]?.tenantFieldOverrides : pluginConfig.tenantField || {},
140
+ tenantsArrayFieldName,
141
+ tenantsArrayTenantFieldName,
142
+ tenantsCollectionSlug,
143
+ unique: false
144
+ }));
145
+ }
146
+ const { useBaseFilter, useBaseListFilter } = pluginConfig.collections[collection.slug] || {};
147
+ if (useBaseFilter ?? useBaseListFilter ?? true) {
133
148
  /**
134
149
  * Add list filter to enabled collections
135
150
  * - filters results by selected tenant
@@ -247,8 +262,9 @@ export const multiTenantPlugin = (pluginConfig)=>(incomingConfig)=>{
247
262
  collection.disableDuplicate = true;
248
263
  }
249
264
  /**
250
- * Modify enabled collections
265
+ * Add filter options to all relationship fields
251
266
  */ addFilterOptionsToFields({
267
+ blockReferencesWithFilters,
252
268
  config: incomingConfig,
253
269
  fields: collection.fields,
254
270
  tenantEnabledCollectionSlugs: collectionSlugs,
@@ -258,29 +274,27 @@ export const multiTenantPlugin = (pluginConfig)=>(incomingConfig)=>{
258
274
  tenantsArrayTenantFieldName,
259
275
  tenantsCollectionSlug
260
276
  });
261
- const overrides = pluginConfig.collections[collection.slug]?.tenantFieldOverrides ? pluginConfig.collections[collection.slug]?.tenantFieldOverrides : pluginConfig.tenantField || {};
262
- /**
263
- * Add tenant field to enabled collections
264
- */ collection.fields.splice(0, 0, tenantField({
265
- name: tenantFieldName,
266
- debug: pluginConfig.debug,
267
- overrides,
268
- tenantsArrayFieldName,
269
- tenantsArrayTenantFieldName,
270
- tenantsCollectionSlug,
271
- unique: isGlobal
272
- }));
277
+ if (pluginConfig.collections[collection.slug]?.customTenantField !== true) {
278
+ /**
279
+ * Add tenant field to enabled collections
280
+ */ collection.fields.unshift(tenantField({
281
+ name: tenantFieldName,
282
+ debug: pluginConfig.debug,
283
+ overrides: pluginConfig.collections[collection.slug]?.tenantFieldOverrides ? pluginConfig.collections[collection.slug]?.tenantFieldOverrides : pluginConfig.tenantField || {},
284
+ tenantsArrayFieldName,
285
+ tenantsArrayTenantFieldName,
286
+ tenantsCollectionSlug,
287
+ unique: isGlobal
288
+ }));
289
+ }
273
290
  const { useBaseFilter, useBaseListFilter } = pluginConfig.collections[collection.slug] || {};
274
291
  if (useBaseFilter ?? useBaseListFilter ?? true) {
275
292
  /**
276
293
  * Add list filter to enabled collections
277
294
  * - filters results by selected tenant
278
- */ if (!collection.admin) {
279
- collection.admin = {};
280
- }
281
- const baseFilter = collection.admin?.baseFilter ?? collection.admin?.baseListFilter;
295
+ */ collection.admin = collection.admin || {};
282
296
  collection.admin.baseFilter = combineFilters({
283
- baseFilter,
297
+ baseFilter: collection.admin?.baseFilter ?? collection.admin?.baseListFilter,
284
298
  customFilter: (args)=>filterDocumentsByTenants({
285
299
  filterFieldName: tenantFieldName,
286
300
  req: args.req,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import type { AcceptedLanguages } from '@payloadcms/translations'\nimport type { CollectionConfig, Config } from 'payload'\n\nimport chalk from 'chalk'\n\nimport type { PluginDefaultTranslationsObject } from './translations/types.js'\nimport type { MultiTenantPluginConfig } from './types.js'\n\nimport { defaults } from './defaults.js'\nimport { getTenantOptionsEndpoint } from './endpoints/getTenantOptionsEndpoint.js'\nimport { tenantField } from './fields/tenantField/index.js'\nimport { tenantsArrayField } from './fields/tenantsArrayField/index.js'\nimport { filterDocumentsByTenants } from './filters/filterDocumentsByTenants.js'\nimport { addTenantCleanup } from './hooks/afterTenantDelete.js'\nimport { translations } from './translations/index.js'\nimport { addCollectionAccess } from './utilities/addCollectionAccess.js'\nimport { addFilterOptionsToFields } from './utilities/addFilterOptionsToFields.js'\nimport { combineFilters } from './utilities/combineFilters.js'\n\nexport const multiTenantPlugin =\n <ConfigType>(pluginConfig: MultiTenantPluginConfig<ConfigType>) =>\n (incomingConfig: Config): Config => {\n if (pluginConfig.enabled === false) {\n return incomingConfig\n }\n\n /**\n * Set defaults\n */\n const userHasAccessToAllTenants: Required<\n MultiTenantPluginConfig<ConfigType>\n >['userHasAccessToAllTenants'] =\n typeof pluginConfig.userHasAccessToAllTenants === 'function'\n ? pluginConfig.userHasAccessToAllTenants\n : () => false\n const tenantsCollectionSlug = (pluginConfig.tenantsSlug =\n pluginConfig.tenantsSlug || defaults.tenantCollectionSlug)\n const tenantFieldName = pluginConfig?.tenantField?.name || defaults.tenantFieldName\n const tenantsArrayFieldName =\n pluginConfig?.tenantsArrayField?.arrayFieldName || defaults.tenantsArrayFieldName\n const tenantsArrayTenantFieldName =\n pluginConfig?.tenantsArrayField?.arrayTenantFieldName || defaults.tenantsArrayTenantFieldName\n const basePath = pluginConfig.basePath || defaults.basePath\n\n /**\n * Add defaults for admin properties\n */\n if (!incomingConfig.admin) {\n incomingConfig.admin = {}\n }\n if (!incomingConfig.admin?.components) {\n incomingConfig.admin.components = {\n actions: [],\n beforeNavLinks: [],\n providers: [],\n }\n }\n if (!incomingConfig.admin.components?.providers) {\n incomingConfig.admin.components.providers = []\n }\n if (!incomingConfig.admin.components?.actions) {\n incomingConfig.admin.components.actions = []\n }\n if (!incomingConfig.admin.components?.beforeNavLinks) {\n incomingConfig.admin.components.beforeNavLinks = []\n }\n if (!incomingConfig.collections) {\n incomingConfig.collections = []\n }\n\n /**\n * Add tenants array field to users collection\n */\n const adminUsersCollection = incomingConfig.collections.find(({ slug, auth }) => {\n if (incomingConfig.admin?.user) {\n return slug === incomingConfig.admin.user\n } else if (auth) {\n return true\n }\n })\n\n if (!adminUsersCollection) {\n throw Error('An auth enabled collection was not found')\n }\n\n /**\n * Add tenants array field to users collection\n */\n if (pluginConfig?.tenantsArrayField?.includeDefaultField !== false) {\n adminUsersCollection.fields.push(\n tenantsArrayField({\n ...(pluginConfig?.tenantsArrayField || {}),\n tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n tenantsCollectionSlug,\n }),\n )\n }\n\n addCollectionAccess({\n adminUsersSlug: adminUsersCollection.slug,\n collection: adminUsersCollection,\n fieldName: `${tenantsArrayFieldName}.${tenantsArrayTenantFieldName}`,\n tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n userHasAccessToAllTenants,\n })\n\n if (pluginConfig.useUsersTenantFilter !== false) {\n if (!adminUsersCollection.admin) {\n adminUsersCollection.admin = {}\n }\n\n const baseFilter =\n adminUsersCollection.admin?.baseFilter ?? adminUsersCollection.admin?.baseListFilter\n adminUsersCollection.admin.baseFilter = combineFilters({\n baseFilter,\n customFilter: (args) =>\n filterDocumentsByTenants({\n filterFieldName: `${tenantsArrayFieldName}.${tenantsArrayTenantFieldName}`,\n req: args.req,\n tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n tenantsCollectionSlug,\n }),\n })\n }\n\n let tenantCollection: CollectionConfig | undefined\n\n const [collectionSlugs, globalCollectionSlugs] = Object.keys(pluginConfig.collections).reduce<\n [string[], string[]]\n >(\n (acc, slug) => {\n if (pluginConfig?.collections?.[slug]?.isGlobal) {\n acc[1].push(slug)\n } else {\n acc[0].push(slug)\n }\n\n return acc\n },\n [[], []],\n )\n\n // used to validate enabled collection slugs\n const multiTenantCollectionsFound: string[] = []\n\n /**\n * The folders collection is added AFTER the plugin is initialized\n * so if they added the folder slug to the plugin collections,\n * we can assume that they have folders enabled\n */\n const foldersSlug = incomingConfig.folders\n ? incomingConfig.folders.slug || 'payload-folders'\n : 'payload-folders'\n\n if (collectionSlugs.includes(foldersSlug)) {\n multiTenantCollectionsFound.push(foldersSlug)\n const overrides = pluginConfig.collections[foldersSlug]?.tenantFieldOverrides\n ? pluginConfig.collections[foldersSlug]?.tenantFieldOverrides\n : pluginConfig.tenantField || {}\n incomingConfig.folders = incomingConfig.folders || {}\n incomingConfig.folders.collectionOverrides = incomingConfig.folders.collectionOverrides || []\n incomingConfig.folders.collectionOverrides.push(({ collection }) => {\n /**\n * Add tenant field to enabled collections\n */\n const folderTenantField = tenantField({\n ...(pluginConfig?.tenantField || {}),\n name: tenantFieldName,\n debug: pluginConfig.debug,\n overrides,\n tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n tenantsCollectionSlug,\n unique: false,\n })\n collection.fields.unshift(folderTenantField)\n\n if (pluginConfig.collections[foldersSlug]?.useBaseListFilter !== false) {\n /**\n * Add list filter to enabled collections\n * - filters results by selected tenant\n */\n collection.admin = collection.admin || {}\n collection.admin.baseFilter = combineFilters({\n baseFilter: collection.admin?.baseFilter ?? collection.admin?.baseListFilter,\n customFilter: (args) =>\n filterDocumentsByTenants({\n filterFieldName: tenantFieldName,\n req: args.req,\n tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n tenantsCollectionSlug,\n }),\n })\n }\n\n if (pluginConfig.collections[foldersSlug]?.useTenantAccess !== false) {\n /**\n * Add access control constraint to tenant enabled folders collection\n */\n addCollectionAccess({\n adminUsersSlug: adminUsersCollection.slug,\n collection,\n fieldName: tenantFieldName,\n tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n userHasAccessToAllTenants,\n })\n }\n\n return collection\n })\n }\n\n /**\n * Modify collections\n */\n incomingConfig.collections.forEach((collection) => {\n /**\n * Modify tenants collection\n */\n if (collection.slug === tenantsCollectionSlug) {\n tenantCollection = collection\n\n if (pluginConfig.useTenantsCollectionAccess !== false) {\n /**\n * Add access control constraint to tenants collection\n * - constrains access a users assigned tenants\n */\n addCollectionAccess({\n adminUsersSlug: adminUsersCollection.slug,\n collection,\n fieldName: 'id',\n tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n userHasAccessToAllTenants,\n })\n }\n\n if (pluginConfig.useTenantsListFilter !== false) {\n /**\n * Add list filter to tenants collection\n * - filter by selected tenant\n */\n if (!collection.admin) {\n collection.admin = {}\n }\n\n const baseFilter = collection.admin?.baseFilter ?? collection.admin?.baseListFilter\n collection.admin.baseFilter = combineFilters({\n baseFilter,\n customFilter: (args) =>\n filterDocumentsByTenants({\n filterFieldName: 'id',\n req: args.req,\n tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n tenantsCollectionSlug,\n }),\n })\n }\n\n if (pluginConfig.cleanupAfterTenantDelete !== false) {\n /**\n * Add cleanup logic when tenant is deleted\n * - delete documents related to tenant\n * - remove tenant from users\n */\n addTenantCleanup({\n collection,\n enabledSlugs: [...collectionSlugs, ...globalCollectionSlugs],\n tenantFieldName,\n tenantsCollectionSlug,\n usersSlug: adminUsersCollection.slug,\n usersTenantsArrayFieldName: tenantsArrayFieldName,\n usersTenantsArrayTenantFieldName: tenantsArrayTenantFieldName,\n })\n }\n\n /**\n * Add custom tenant field that watches and dispatches updates to the selector\n */\n collection.fields.push({\n name: '_watchTenant',\n type: 'ui',\n admin: {\n components: {\n Field: {\n path: '@payloadcms/plugin-multi-tenant/client#WatchTenantCollection',\n },\n },\n },\n })\n\n collection.endpoints = [\n ...(collection.endpoints || []),\n getTenantOptionsEndpoint<ConfigType>({\n tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n tenantsCollectionSlug,\n useAsTitle: tenantCollection.admin?.useAsTitle || 'id',\n userHasAccessToAllTenants,\n }),\n ]\n } else if (pluginConfig.collections?.[collection.slug]) {\n multiTenantCollectionsFound.push(collection.slug)\n const isGlobal = Boolean(pluginConfig.collections[collection.slug]?.isGlobal)\n\n if (isGlobal) {\n collection.disableDuplicate = true\n }\n\n /**\n * Modify enabled collections\n */\n addFilterOptionsToFields({\n config: incomingConfig,\n fields: collection.fields,\n tenantEnabledCollectionSlugs: collectionSlugs,\n tenantEnabledGlobalSlugs: globalCollectionSlugs,\n tenantFieldName,\n tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n tenantsCollectionSlug,\n })\n\n const overrides = pluginConfig.collections[collection.slug]?.tenantFieldOverrides\n ? pluginConfig.collections[collection.slug]?.tenantFieldOverrides\n : pluginConfig.tenantField || {}\n\n /**\n * Add tenant field to enabled collections\n */\n collection.fields.splice(\n 0,\n 0,\n tenantField({\n name: tenantFieldName,\n debug: pluginConfig.debug,\n overrides,\n tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n tenantsCollectionSlug,\n unique: isGlobal,\n }),\n )\n\n const { useBaseFilter, useBaseListFilter } = pluginConfig.collections[collection.slug] || {}\n\n if (useBaseFilter ?? useBaseListFilter ?? true) {\n /**\n * Add list filter to enabled collections\n * - filters results by selected tenant\n */\n if (!collection.admin) {\n collection.admin = {}\n }\n\n const baseFilter = collection.admin?.baseFilter ?? collection.admin?.baseListFilter\n collection.admin.baseFilter = combineFilters({\n baseFilter,\n customFilter: (args) =>\n filterDocumentsByTenants({\n filterFieldName: tenantFieldName,\n req: args.req,\n tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n tenantsCollectionSlug,\n }),\n })\n }\n\n if (pluginConfig.collections[collection.slug]?.useTenantAccess !== false) {\n /**\n * Add access control constraint to tenant enabled collection\n */\n addCollectionAccess({\n adminUsersSlug: adminUsersCollection.slug,\n collection,\n fieldName: tenantFieldName,\n tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n userHasAccessToAllTenants,\n })\n }\n }\n })\n\n if (!tenantCollection) {\n throw new Error(`Tenants collection not found with slug: ${tenantsCollectionSlug}`)\n }\n\n if (\n multiTenantCollectionsFound.length !==\n collectionSlugs.length + globalCollectionSlugs.length\n ) {\n const missingSlugs = [...collectionSlugs, ...globalCollectionSlugs].filter(\n (slug) => !multiTenantCollectionsFound.includes(slug),\n )\n // eslint-disable-next-line no-console\n console.error(\n chalk.yellow.bold('WARNING (plugin-multi-tenant)'),\n 'missing collections',\n missingSlugs,\n 'try placing the multi-tenant plugin after other plugins.',\n )\n }\n\n /**\n * Add TenantSelectionProvider to admin providers\n */\n incomingConfig.admin.components.providers.push({\n clientProps: {\n tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n tenantsCollectionSlug: tenantCollection.slug,\n useAsTitle: tenantCollection.admin?.useAsTitle || 'id',\n userHasAccessToAllTenants,\n },\n path: '@payloadcms/plugin-multi-tenant/rsc#TenantSelectionProvider',\n })\n\n /**\n * Add global redirect action\n */\n if (globalCollectionSlugs.length) {\n incomingConfig.admin.components.actions.push({\n path: '@payloadcms/plugin-multi-tenant/rsc#GlobalViewRedirect',\n serverProps: {\n basePath,\n globalSlugs: globalCollectionSlugs,\n tenantFieldName,\n tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n tenantsCollectionSlug,\n useAsTitle: tenantCollection.admin?.useAsTitle || 'id',\n userHasAccessToAllTenants,\n },\n })\n }\n\n /**\n * Add tenant selector to admin UI\n */\n incomingConfig.admin.components.beforeNavLinks.push({\n clientProps: {\n enabledSlugs: [\n ...collectionSlugs,\n ...globalCollectionSlugs,\n adminUsersCollection.slug,\n tenantCollection.slug,\n ],\n label: pluginConfig.tenantSelectorLabel || undefined,\n },\n path: '@payloadcms/plugin-multi-tenant/rsc#TenantSelector',\n })\n\n /**\n * Merge plugin translations\n */\n if (!incomingConfig.i18n) {\n incomingConfig.i18n = {}\n }\n Object.entries(translations).forEach(([locale, pluginI18nObject]) => {\n const typedLocale = locale as AcceptedLanguages\n if (!incomingConfig.i18n!.translations) {\n incomingConfig.i18n!.translations = {}\n }\n if (!(typedLocale in incomingConfig.i18n!.translations)) {\n incomingConfig.i18n!.translations[typedLocale] = {}\n }\n if (!('plugin-multi-tenant' in incomingConfig.i18n!.translations[typedLocale]!)) {\n ;(incomingConfig.i18n!.translations[typedLocale] as PluginDefaultTranslationsObject)[\n 'plugin-multi-tenant'\n ] = {} as PluginDefaultTranslationsObject['plugin-multi-tenant']\n }\n\n ;(incomingConfig.i18n!.translations[typedLocale] as PluginDefaultTranslationsObject)[\n 'plugin-multi-tenant'\n ] = {\n ...pluginI18nObject.translations['plugin-multi-tenant'],\n ...(pluginConfig.i18n?.translations?.[typedLocale] || {}),\n }\n })\n\n return incomingConfig\n }\n"],"names":["chalk","defaults","getTenantOptionsEndpoint","tenantField","tenantsArrayField","filterDocumentsByTenants","addTenantCleanup","translations","addCollectionAccess","addFilterOptionsToFields","combineFilters","multiTenantPlugin","pluginConfig","incomingConfig","enabled","userHasAccessToAllTenants","tenantsCollectionSlug","tenantsSlug","tenantCollectionSlug","tenantFieldName","name","tenantsArrayFieldName","arrayFieldName","tenantsArrayTenantFieldName","arrayTenantFieldName","basePath","admin","components","actions","beforeNavLinks","providers","collections","adminUsersCollection","find","slug","auth","user","Error","includeDefaultField","fields","push","adminUsersSlug","collection","fieldName","useUsersTenantFilter","baseFilter","baseListFilter","customFilter","args","filterFieldName","req","tenantCollection","collectionSlugs","globalCollectionSlugs","Object","keys","reduce","acc","isGlobal","multiTenantCollectionsFound","foldersSlug","folders","includes","overrides","tenantFieldOverrides","collectionOverrides","folderTenantField","debug","unique","unshift","useBaseListFilter","useTenantAccess","forEach","useTenantsCollectionAccess","useTenantsListFilter","cleanupAfterTenantDelete","enabledSlugs","usersSlug","usersTenantsArrayFieldName","usersTenantsArrayTenantFieldName","type","Field","path","endpoints","useAsTitle","Boolean","disableDuplicate","config","tenantEnabledCollectionSlugs","tenantEnabledGlobalSlugs","splice","useBaseFilter","length","missingSlugs","filter","console","error","yellow","bold","clientProps","serverProps","globalSlugs","label","tenantSelectorLabel","undefined","i18n","entries","locale","pluginI18nObject","typedLocale"],"mappings":"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"}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import type { AcceptedLanguages } from '@payloadcms/translations'\nimport type { CollectionConfig, Config } from 'payload'\n\nimport chalk from 'chalk'\n\nimport type { PluginDefaultTranslationsObject } from './translations/types.js'\nimport type { MultiTenantPluginConfig } from './types.js'\n\nimport { defaults } from './defaults.js'\nimport { getTenantOptionsEndpoint } from './endpoints/getTenantOptionsEndpoint.js'\nimport { tenantField } from './fields/tenantField/index.js'\nimport { tenantsArrayField } from './fields/tenantsArrayField/index.js'\nimport { filterDocumentsByTenants } from './filters/filterDocumentsByTenants.js'\nimport { addTenantCleanup } from './hooks/afterTenantDelete.js'\nimport { translations } from './translations/index.js'\nimport { addCollectionAccess } from './utilities/addCollectionAccess.js'\nimport { addFilterOptionsToFields } from './utilities/addFilterOptionsToFields.js'\nimport { combineFilters } from './utilities/combineFilters.js'\n\nexport const multiTenantPlugin =\n <ConfigType>(pluginConfig: MultiTenantPluginConfig<ConfigType>) =>\n (incomingConfig: Config): Config => {\n if (pluginConfig.enabled === false) {\n return incomingConfig\n }\n\n /**\n * Set defaults\n */\n const userHasAccessToAllTenants: Required<\n MultiTenantPluginConfig<ConfigType>\n >['userHasAccessToAllTenants'] =\n typeof pluginConfig.userHasAccessToAllTenants === 'function'\n ? pluginConfig.userHasAccessToAllTenants\n : () => false\n const tenantsCollectionSlug = (pluginConfig.tenantsSlug =\n pluginConfig.tenantsSlug || defaults.tenantCollectionSlug)\n const tenantFieldName = pluginConfig?.tenantField?.name || defaults.tenantFieldName\n const tenantsArrayFieldName =\n pluginConfig?.tenantsArrayField?.arrayFieldName || defaults.tenantsArrayFieldName\n const tenantsArrayTenantFieldName =\n pluginConfig?.tenantsArrayField?.arrayTenantFieldName || defaults.tenantsArrayTenantFieldName\n const basePath = pluginConfig.basePath || defaults.basePath\n\n /**\n * Add defaults for admin properties\n */\n if (!incomingConfig.admin) {\n incomingConfig.admin = {}\n }\n if (!incomingConfig.admin?.components) {\n incomingConfig.admin.components = {\n actions: [],\n beforeNavLinks: [],\n providers: [],\n }\n }\n if (!incomingConfig.admin.components?.providers) {\n incomingConfig.admin.components.providers = []\n }\n if (!incomingConfig.admin.components?.actions) {\n incomingConfig.admin.components.actions = []\n }\n if (!incomingConfig.admin.components?.beforeNavLinks) {\n incomingConfig.admin.components.beforeNavLinks = []\n }\n if (!incomingConfig.collections) {\n incomingConfig.collections = []\n }\n\n /**\n * Add tenants array field to users collection\n */\n const adminUsersCollection = incomingConfig.collections.find(({ slug, auth }) => {\n if (incomingConfig.admin?.user) {\n return slug === incomingConfig.admin.user\n } else if (auth) {\n return true\n }\n })\n\n if (!adminUsersCollection) {\n throw Error('An auth enabled collection was not found')\n }\n\n /**\n * Add tenants array field to users collection\n */\n if (pluginConfig?.tenantsArrayField?.includeDefaultField !== false) {\n adminUsersCollection.fields.push(\n tenantsArrayField({\n ...(pluginConfig?.tenantsArrayField || {}),\n tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n tenantsCollectionSlug,\n }),\n )\n }\n\n addCollectionAccess({\n adminUsersSlug: adminUsersCollection.slug,\n collection: adminUsersCollection,\n fieldName: `${tenantsArrayFieldName}.${tenantsArrayTenantFieldName}`,\n tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n userHasAccessToAllTenants,\n })\n\n if (pluginConfig.useUsersTenantFilter !== false) {\n if (!adminUsersCollection.admin) {\n adminUsersCollection.admin = {}\n }\n\n const baseFilter =\n adminUsersCollection.admin?.baseFilter ?? adminUsersCollection.admin?.baseListFilter\n adminUsersCollection.admin.baseFilter = combineFilters({\n baseFilter,\n customFilter: (args) =>\n filterDocumentsByTenants({\n filterFieldName: `${tenantsArrayFieldName}.${tenantsArrayTenantFieldName}`,\n req: args.req,\n tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n tenantsCollectionSlug,\n }),\n })\n }\n\n let tenantCollection: CollectionConfig | undefined\n\n const [collectionSlugs, globalCollectionSlugs] = Object.keys(pluginConfig.collections).reduce<\n [string[], string[]]\n >(\n (acc, slug) => {\n if (pluginConfig?.collections?.[slug]?.isGlobal) {\n acc[1].push(slug)\n } else {\n acc[0].push(slug)\n }\n\n return acc\n },\n [[], []],\n )\n\n // used to track and not duplicate filterOptions on referenced blocks\n const blockReferencesWithFilters: string[] = []\n\n // used to validate enabled collection slugs\n const multiTenantCollectionsFound: string[] = []\n\n /**\n * The folders collection is added AFTER the plugin is initialized\n * so if they added the folder slug to the plugin collections,\n * we can assume that they have folders enabled\n */\n const foldersSlug = incomingConfig.folders\n ? incomingConfig.folders.slug || 'payload-folders'\n : 'payload-folders'\n\n if (collectionSlugs.includes(foldersSlug)) {\n multiTenantCollectionsFound.push(foldersSlug)\n incomingConfig.folders = incomingConfig.folders || {}\n incomingConfig.folders.collectionOverrides = incomingConfig.folders.collectionOverrides || []\n incomingConfig.folders.collectionOverrides.push(({ collection }) => {\n /**\n * Add filter options to all relationship fields\n */\n addFilterOptionsToFields({\n blockReferencesWithFilters,\n config: incomingConfig,\n fields: collection.fields,\n tenantEnabledCollectionSlugs: collectionSlugs,\n tenantEnabledGlobalSlugs: globalCollectionSlugs,\n tenantFieldName,\n tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n tenantsCollectionSlug,\n })\n\n if (pluginConfig.collections[foldersSlug]?.customTenantField !== true) {\n /**\n * Add tenant field to enabled collections\n */\n collection.fields.unshift(\n tenantField({\n name: tenantFieldName,\n debug: pluginConfig.debug,\n overrides: pluginConfig.collections[collection.slug]?.tenantFieldOverrides\n ? pluginConfig.collections[collection.slug]?.tenantFieldOverrides\n : pluginConfig.tenantField || {},\n tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n tenantsCollectionSlug,\n unique: false,\n }),\n )\n }\n\n const { useBaseFilter, useBaseListFilter } = pluginConfig.collections[collection.slug] || {}\n if (useBaseFilter ?? useBaseListFilter ?? true) {\n /**\n * Add list filter to enabled collections\n * - filters results by selected tenant\n */\n collection.admin = collection.admin || {}\n collection.admin.baseFilter = combineFilters({\n baseFilter: collection.admin?.baseFilter ?? collection.admin?.baseListFilter,\n customFilter: (args) =>\n filterDocumentsByTenants({\n filterFieldName: tenantFieldName,\n req: args.req,\n tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n tenantsCollectionSlug,\n }),\n })\n }\n\n if (pluginConfig.collections[foldersSlug]?.useTenantAccess !== false) {\n /**\n * Add access control constraint to tenant enabled folders collection\n */\n addCollectionAccess({\n adminUsersSlug: adminUsersCollection.slug,\n collection,\n fieldName: tenantFieldName,\n tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n userHasAccessToAllTenants,\n })\n }\n\n return collection\n })\n }\n\n /**\n * Modify collections\n */\n incomingConfig.collections.forEach((collection) => {\n /**\n * Modify tenants collection\n */\n if (collection.slug === tenantsCollectionSlug) {\n tenantCollection = collection\n\n if (pluginConfig.useTenantsCollectionAccess !== false) {\n /**\n * Add access control constraint to tenants collection\n * - constrains access a users assigned tenants\n */\n addCollectionAccess({\n adminUsersSlug: adminUsersCollection.slug,\n collection,\n fieldName: 'id',\n tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n userHasAccessToAllTenants,\n })\n }\n\n if (pluginConfig.useTenantsListFilter !== false) {\n /**\n * Add list filter to tenants collection\n * - filter by selected tenant\n */\n if (!collection.admin) {\n collection.admin = {}\n }\n\n const baseFilter = collection.admin?.baseFilter ?? collection.admin?.baseListFilter\n collection.admin.baseFilter = combineFilters({\n baseFilter,\n customFilter: (args) =>\n filterDocumentsByTenants({\n filterFieldName: 'id',\n req: args.req,\n tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n tenantsCollectionSlug,\n }),\n })\n }\n\n if (pluginConfig.cleanupAfterTenantDelete !== false) {\n /**\n * Add cleanup logic when tenant is deleted\n * - delete documents related to tenant\n * - remove tenant from users\n */\n addTenantCleanup({\n collection,\n enabledSlugs: [...collectionSlugs, ...globalCollectionSlugs],\n tenantFieldName,\n tenantsCollectionSlug,\n usersSlug: adminUsersCollection.slug,\n usersTenantsArrayFieldName: tenantsArrayFieldName,\n usersTenantsArrayTenantFieldName: tenantsArrayTenantFieldName,\n })\n }\n\n /**\n * Add custom tenant field that watches and dispatches updates to the selector\n */\n collection.fields.push({\n name: '_watchTenant',\n type: 'ui',\n admin: {\n components: {\n Field: {\n path: '@payloadcms/plugin-multi-tenant/client#WatchTenantCollection',\n },\n },\n },\n })\n\n collection.endpoints = [\n ...(collection.endpoints || []),\n getTenantOptionsEndpoint<ConfigType>({\n tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n tenantsCollectionSlug,\n useAsTitle: tenantCollection.admin?.useAsTitle || 'id',\n userHasAccessToAllTenants,\n }),\n ]\n } else if (pluginConfig.collections?.[collection.slug]) {\n multiTenantCollectionsFound.push(collection.slug)\n const isGlobal = Boolean(pluginConfig.collections[collection.slug]?.isGlobal)\n\n if (isGlobal) {\n collection.disableDuplicate = true\n }\n\n /**\n * Add filter options to all relationship fields\n */\n addFilterOptionsToFields({\n blockReferencesWithFilters,\n config: incomingConfig,\n fields: collection.fields,\n tenantEnabledCollectionSlugs: collectionSlugs,\n tenantEnabledGlobalSlugs: globalCollectionSlugs,\n tenantFieldName,\n tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n tenantsCollectionSlug,\n })\n\n if (pluginConfig.collections[collection.slug]?.customTenantField !== true) {\n /**\n * Add tenant field to enabled collections\n */\n collection.fields.unshift(\n tenantField({\n name: tenantFieldName,\n debug: pluginConfig.debug,\n overrides: pluginConfig.collections[collection.slug]?.tenantFieldOverrides\n ? pluginConfig.collections[collection.slug]?.tenantFieldOverrides\n : pluginConfig.tenantField || {},\n tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n tenantsCollectionSlug,\n unique: isGlobal,\n }),\n )\n }\n\n const { useBaseFilter, useBaseListFilter } = pluginConfig.collections[collection.slug] || {}\n if (useBaseFilter ?? useBaseListFilter ?? true) {\n /**\n * Add list filter to enabled collections\n * - filters results by selected tenant\n */\n collection.admin = collection.admin || {}\n collection.admin.baseFilter = combineFilters({\n baseFilter: collection.admin?.baseFilter ?? collection.admin?.baseListFilter,\n customFilter: (args) =>\n filterDocumentsByTenants({\n filterFieldName: tenantFieldName,\n req: args.req,\n tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n tenantsCollectionSlug,\n }),\n })\n }\n\n if (pluginConfig.collections[collection.slug]?.useTenantAccess !== false) {\n /**\n * Add access control constraint to tenant enabled collection\n */\n addCollectionAccess({\n adminUsersSlug: adminUsersCollection.slug,\n collection,\n fieldName: tenantFieldName,\n tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n userHasAccessToAllTenants,\n })\n }\n }\n })\n\n if (!tenantCollection) {\n throw new Error(`Tenants collection not found with slug: ${tenantsCollectionSlug}`)\n }\n\n if (\n multiTenantCollectionsFound.length !==\n collectionSlugs.length + globalCollectionSlugs.length\n ) {\n const missingSlugs = [...collectionSlugs, ...globalCollectionSlugs].filter(\n (slug) => !multiTenantCollectionsFound.includes(slug),\n )\n // eslint-disable-next-line no-console\n console.error(\n chalk.yellow.bold('WARNING (plugin-multi-tenant)'),\n 'missing collections',\n missingSlugs,\n 'try placing the multi-tenant plugin after other plugins.',\n )\n }\n\n /**\n * Add TenantSelectionProvider to admin providers\n */\n incomingConfig.admin.components.providers.push({\n clientProps: {\n tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n tenantsCollectionSlug: tenantCollection.slug,\n useAsTitle: tenantCollection.admin?.useAsTitle || 'id',\n userHasAccessToAllTenants,\n },\n path: '@payloadcms/plugin-multi-tenant/rsc#TenantSelectionProvider',\n })\n\n /**\n * Add global redirect action\n */\n if (globalCollectionSlugs.length) {\n incomingConfig.admin.components.actions.push({\n path: '@payloadcms/plugin-multi-tenant/rsc#GlobalViewRedirect',\n serverProps: {\n basePath,\n globalSlugs: globalCollectionSlugs,\n tenantFieldName,\n tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n tenantsCollectionSlug,\n useAsTitle: tenantCollection.admin?.useAsTitle || 'id',\n userHasAccessToAllTenants,\n },\n })\n }\n\n /**\n * Add tenant selector to admin UI\n */\n incomingConfig.admin.components.beforeNavLinks.push({\n clientProps: {\n enabledSlugs: [\n ...collectionSlugs,\n ...globalCollectionSlugs,\n adminUsersCollection.slug,\n tenantCollection.slug,\n ],\n label: pluginConfig.tenantSelectorLabel || undefined,\n },\n path: '@payloadcms/plugin-multi-tenant/rsc#TenantSelector',\n })\n\n /**\n * Merge plugin translations\n */\n if (!incomingConfig.i18n) {\n incomingConfig.i18n = {}\n }\n Object.entries(translations).forEach(([locale, pluginI18nObject]) => {\n const typedLocale = locale as AcceptedLanguages\n if (!incomingConfig.i18n!.translations) {\n incomingConfig.i18n!.translations = {}\n }\n if (!(typedLocale in incomingConfig.i18n!.translations)) {\n incomingConfig.i18n!.translations[typedLocale] = {}\n }\n if (!('plugin-multi-tenant' in incomingConfig.i18n!.translations[typedLocale]!)) {\n ;(incomingConfig.i18n!.translations[typedLocale] as PluginDefaultTranslationsObject)[\n 'plugin-multi-tenant'\n ] = {} as PluginDefaultTranslationsObject['plugin-multi-tenant']\n }\n\n ;(incomingConfig.i18n!.translations[typedLocale] as PluginDefaultTranslationsObject)[\n 'plugin-multi-tenant'\n ] = {\n ...pluginI18nObject.translations['plugin-multi-tenant'],\n ...(pluginConfig.i18n?.translations?.[typedLocale] || {}),\n }\n })\n\n return incomingConfig\n }\n"],"names":["chalk","defaults","getTenantOptionsEndpoint","tenantField","tenantsArrayField","filterDocumentsByTenants","addTenantCleanup","translations","addCollectionAccess","addFilterOptionsToFields","combineFilters","multiTenantPlugin","pluginConfig","incomingConfig","enabled","userHasAccessToAllTenants","tenantsCollectionSlug","tenantsSlug","tenantCollectionSlug","tenantFieldName","name","tenantsArrayFieldName","arrayFieldName","tenantsArrayTenantFieldName","arrayTenantFieldName","basePath","admin","components","actions","beforeNavLinks","providers","collections","adminUsersCollection","find","slug","auth","user","Error","includeDefaultField","fields","push","adminUsersSlug","collection","fieldName","useUsersTenantFilter","baseFilter","baseListFilter","customFilter","args","filterFieldName","req","tenantCollection","collectionSlugs","globalCollectionSlugs","Object","keys","reduce","acc","isGlobal","blockReferencesWithFilters","multiTenantCollectionsFound","foldersSlug","folders","includes","collectionOverrides","config","tenantEnabledCollectionSlugs","tenantEnabledGlobalSlugs","customTenantField","unshift","debug","overrides","tenantFieldOverrides","unique","useBaseFilter","useBaseListFilter","useTenantAccess","forEach","useTenantsCollectionAccess","useTenantsListFilter","cleanupAfterTenantDelete","enabledSlugs","usersSlug","usersTenantsArrayFieldName","usersTenantsArrayTenantFieldName","type","Field","path","endpoints","useAsTitle","Boolean","disableDuplicate","length","missingSlugs","filter","console","error","yellow","bold","clientProps","serverProps","globalSlugs","label","tenantSelectorLabel","undefined","i18n","entries","locale","pluginI18nObject","typedLocale"],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -22,6 +22,11 @@ export type MultiTenantPluginConfig<ConfigTypes = unknown> = {
22
22
  */
23
23
  collections: {
24
24
  [key in CollectionSlug]?: {
25
+ /**
26
+ * Opt out of adding the tenant field and place
27
+ * it manually using the `tenantField` export from the plugin
28
+ */
29
+ customTenantField?: boolean;
25
30
  /**
26
31
  * Set to `true` if you want the collection to behave as a global
27
32
  *
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/types.ts"],"sourcesContent":["import type { AcceptedLanguages } from '@payloadcms/translations'\nimport type {\n ArrayField,\n CollectionSlug,\n Field,\n RelationshipField,\n SingleRelationshipField,\n TypedUser,\n} from 'payload'\n\nexport type MultiTenantPluginConfig<ConfigTypes = unknown> = {\n /**\n * Base path for your application\n *\n * https://nextjs.org/docs/app/api-reference/config/next-config-js/basePath\n *\n * @default undefined\n */\n basePath?: string\n /**\n * After a tenant is deleted, the plugin will attempt to clean up related documents\n * - removing documents with the tenant ID\n * - removing the tenant from users\n *\n * @default true\n */\n cleanupAfterTenantDelete?: boolean\n /**\n * Automatically\n */\n collections: {\n [key in CollectionSlug]?: {\n /**\n * Set to `true` if you want the collection to behave as a global\n *\n * @default false\n */\n isGlobal?: boolean\n /**\n * Overrides for the tenant field, will override the entire tenantField configuration\n */\n tenantFieldOverrides?: CollectionTenantFieldConfigOverrides\n /**\n * Set to `false` if you want to manually apply the baseListFilter\n * Set to `false` if you want to manually apply the baseFilter\n *\n * @default true\n */\n useBaseFilter?: boolean\n /**\n * @deprecated Use `useBaseFilter` instead. If both are defined,\n * `useBaseFilter` will take precedence. This property remains only\n * for backward compatibility and may be removed in a future version.\n *\n * Originally, `baseListFilter` was intended to filter only the List View\n * in the admin panel. However, base filtering is often required in other areas\n * such as internal link relationships in the Lexical editor.\n *\n * @default true\n */\n useBaseListFilter?: boolean\n /**\n * Set to `false` if you want to handle collection access manually without the multi-tenant constraints applied\n *\n * @default true\n */\n useTenantAccess?: boolean\n }\n }\n /**\n * Enables debug mode\n * - Makes the tenant field visible in the admin UI within applicable collections\n *\n * @default false\n */\n debug?: boolean\n /**\n * Enables the multi-tenant plugin\n *\n * @default true\n */\n enabled?: boolean\n /**\n * Localization for the plugin\n */\n i18n?: {\n translations: {\n [key in AcceptedLanguages]?: {\n /**\n * @default 'You are about to change ownership from <0>{{fromTenant}}</0> to <0>{{toTenant}}</0>'\n */\n 'confirm-modal-tenant-switch--body'?: string\n /**\n * `tenantLabel` defaults to the value of the `nav-tenantSelector-label` translation\n *\n * @default 'Confirm {{tenantLabel}} change'\n */\n 'confirm-modal-tenant-switch--heading'?: string\n /**\n * @default 'Assigned Tenant'\n */\n 'field-assignedTenant-label'?: string\n /**\n * @default 'Tenant'\n */\n 'nav-tenantSelector-label'?: string\n }\n }\n }\n /**\n * Field configuration for the field added to all tenant enabled collections\n */\n tenantField?: RootTenantFieldConfigOverrides\n /**\n * Field configuration for the field added to the users collection\n *\n * If `includeDefaultField` is `false`, you must include the field on your users collection manually\n * This is useful if you want to customize the field or place the field in a specific location\n */\n tenantsArrayField?:\n | {\n /**\n * Access configuration for the array field\n */\n arrayFieldAccess?: ArrayField['access']\n /**\n * Name of the array field\n *\n * @default 'tenants'\n */\n arrayFieldName?: string\n /**\n * Name of the tenant field\n *\n * @default 'tenant'\n */\n arrayTenantFieldName?: string\n /**\n * When `includeDefaultField` is `true`, the field will be added to the users collection automatically\n */\n includeDefaultField?: true\n /**\n * Additional fields to include on the tenants array field\n */\n rowFields?: Field[]\n /**\n * Access configuration for the tenant field\n */\n tenantFieldAccess?: RelationshipField['access']\n }\n | {\n arrayFieldAccess?: never\n arrayFieldName?: string\n arrayTenantFieldName?: string\n /**\n * When `includeDefaultField` is `false`, you must include the field on your users collection manually\n */\n includeDefaultField?: false\n rowFields?: never\n tenantFieldAccess?: never\n }\n /**\n * Customize tenant selector label\n *\n * Either a string or an object where the keys are i18n codes and the values are the string labels\n *\n * @deprecated Use `i18n.translations` instead.\n */\n tenantSelectorLabel?:\n | Partial<{\n [key in AcceptedLanguages]?: string\n }>\n | string\n /**\n * The slug for the tenant collection\n *\n * @default 'tenants'\n */\n tenantsSlug?: string\n /**\n * Function that determines if a user has access to _all_ tenants\n *\n * Useful for super-admin type users\n */\n userHasAccessToAllTenants?: (\n user: ConfigTypes extends { user: unknown } ? ConfigTypes['user'] : TypedUser,\n ) => boolean\n /**\n * Opt out of adding access constraints to the tenants collection\n */\n useTenantsCollectionAccess?: boolean\n /**\n * Opt out including the baseListFilter to filter tenants by selected tenant\n */\n useTenantsListFilter?: boolean\n /**\n * Opt out including the baseListFilter to filter users by selected tenant\n */\n useUsersTenantFilter?: boolean\n}\n\nexport type RootTenantFieldConfigOverrides = Partial<\n Omit<\n SingleRelationshipField,\n | '_sanitized'\n | 'hasMany'\n | 'hidden'\n | 'index'\n | 'localized'\n | 'max'\n | 'maxRows'\n | 'min'\n | 'minRows'\n | 'relationTo'\n | 'required'\n | 'type'\n | 'unique'\n | 'virtual'\n >\n>\n\nexport type CollectionTenantFieldConfigOverrides = Partial<\n Omit<RootTenantFieldConfigOverrides, 'name'>\n>\n\nexport type Tenant<IDType = number | string> = {\n id: IDType\n name: string\n}\n\nexport type UserWithTenantsField = {\n tenants?:\n | {\n tenant: number | string | Tenant\n }[]\n | null\n} & TypedUser\n"],"names":[],"mappings":"AAsOA,WAMa"}
1
+ {"version":3,"sources":["../src/types.ts"],"sourcesContent":["import type { AcceptedLanguages } from '@payloadcms/translations'\nimport type {\n ArrayField,\n CollectionSlug,\n Field,\n RelationshipField,\n SingleRelationshipField,\n TypedUser,\n} from 'payload'\n\nexport type MultiTenantPluginConfig<ConfigTypes = unknown> = {\n /**\n * Base path for your application\n *\n * https://nextjs.org/docs/app/api-reference/config/next-config-js/basePath\n *\n * @default undefined\n */\n basePath?: string\n /**\n * After a tenant is deleted, the plugin will attempt to clean up related documents\n * - removing documents with the tenant ID\n * - removing the tenant from users\n *\n * @default true\n */\n cleanupAfterTenantDelete?: boolean\n /**\n * Automatically\n */\n collections: {\n [key in CollectionSlug]?: {\n /**\n * Opt out of adding the tenant field and place\n * it manually using the `tenantField` export from the plugin\n */\n customTenantField?: boolean\n /**\n * Set to `true` if you want the collection to behave as a global\n *\n * @default false\n */\n isGlobal?: boolean\n /**\n * Overrides for the tenant field, will override the entire tenantField configuration\n */\n tenantFieldOverrides?: CollectionTenantFieldConfigOverrides\n /**\n * Set to `false` if you want to manually apply the baseListFilter\n * Set to `false` if you want to manually apply the baseFilter\n *\n * @default true\n */\n useBaseFilter?: boolean\n /**\n * @deprecated Use `useBaseFilter` instead. If both are defined,\n * `useBaseFilter` will take precedence. This property remains only\n * for backward compatibility and may be removed in a future version.\n *\n * Originally, `baseListFilter` was intended to filter only the List View\n * in the admin panel. However, base filtering is often required in other areas\n * such as internal link relationships in the Lexical editor.\n *\n * @default true\n */\n useBaseListFilter?: boolean\n /**\n * Set to `false` if you want to handle collection access manually without the multi-tenant constraints applied\n *\n * @default true\n */\n useTenantAccess?: boolean\n }\n }\n /**\n * Enables debug mode\n * - Makes the tenant field visible in the admin UI within applicable collections\n *\n * @default false\n */\n debug?: boolean\n /**\n * Enables the multi-tenant plugin\n *\n * @default true\n */\n enabled?: boolean\n /**\n * Localization for the plugin\n */\n i18n?: {\n translations: {\n [key in AcceptedLanguages]?: {\n /**\n * @default 'You are about to change ownership from <0>{{fromTenant}}</0> to <0>{{toTenant}}</0>'\n */\n 'confirm-modal-tenant-switch--body'?: string\n /**\n * `tenantLabel` defaults to the value of the `nav-tenantSelector-label` translation\n *\n * @default 'Confirm {{tenantLabel}} change'\n */\n 'confirm-modal-tenant-switch--heading'?: string\n /**\n * @default 'Assigned Tenant'\n */\n 'field-assignedTenant-label'?: string\n /**\n * @default 'Tenant'\n */\n 'nav-tenantSelector-label'?: string\n }\n }\n }\n /**\n * Field configuration for the field added to all tenant enabled collections\n */\n tenantField?: RootTenantFieldConfigOverrides\n /**\n * Field configuration for the field added to the users collection\n *\n * If `includeDefaultField` is `false`, you must include the field on your users collection manually\n * This is useful if you want to customize the field or place the field in a specific location\n */\n tenantsArrayField?:\n | {\n /**\n * Access configuration for the array field\n */\n arrayFieldAccess?: ArrayField['access']\n /**\n * Name of the array field\n *\n * @default 'tenants'\n */\n arrayFieldName?: string\n /**\n * Name of the tenant field\n *\n * @default 'tenant'\n */\n arrayTenantFieldName?: string\n /**\n * When `includeDefaultField` is `true`, the field will be added to the users collection automatically\n */\n includeDefaultField?: true\n /**\n * Additional fields to include on the tenants array field\n */\n rowFields?: Field[]\n /**\n * Access configuration for the tenant field\n */\n tenantFieldAccess?: RelationshipField['access']\n }\n | {\n arrayFieldAccess?: never\n arrayFieldName?: string\n arrayTenantFieldName?: string\n /**\n * When `includeDefaultField` is `false`, you must include the field on your users collection manually\n */\n includeDefaultField?: false\n rowFields?: never\n tenantFieldAccess?: never\n }\n /**\n * Customize tenant selector label\n *\n * Either a string or an object where the keys are i18n codes and the values are the string labels\n *\n * @deprecated Use `i18n.translations` instead.\n */\n tenantSelectorLabel?:\n | Partial<{\n [key in AcceptedLanguages]?: string\n }>\n | string\n /**\n * The slug for the tenant collection\n *\n * @default 'tenants'\n */\n tenantsSlug?: string\n /**\n * Function that determines if a user has access to _all_ tenants\n *\n * Useful for super-admin type users\n */\n userHasAccessToAllTenants?: (\n user: ConfigTypes extends { user: unknown } ? ConfigTypes['user'] : TypedUser,\n ) => boolean\n /**\n * Opt out of adding access constraints to the tenants collection\n */\n useTenantsCollectionAccess?: boolean\n /**\n * Opt out including the baseListFilter to filter tenants by selected tenant\n */\n useTenantsListFilter?: boolean\n /**\n * Opt out including the baseListFilter to filter users by selected tenant\n */\n useUsersTenantFilter?: boolean\n}\n\nexport type RootTenantFieldConfigOverrides = Partial<\n Omit<\n SingleRelationshipField,\n | '_sanitized'\n | 'hasMany'\n | 'hidden'\n | 'index'\n | 'localized'\n | 'max'\n | 'maxRows'\n | 'min'\n | 'minRows'\n | 'relationTo'\n | 'required'\n | 'type'\n | 'unique'\n | 'virtual'\n >\n>\n\nexport type CollectionTenantFieldConfigOverrides = Partial<\n Omit<RootTenantFieldConfigOverrides, 'name'>\n>\n\nexport type Tenant<IDType = number | string> = {\n id: IDType\n name: string\n}\n\nexport type UserWithTenantsField = {\n tenants?:\n | {\n tenant: number | string | Tenant\n }[]\n | null\n} & TypedUser\n"],"names":[],"mappings":"AA2OA,WAMa"}
@@ -1,5 +1,6 @@
1
1
  import type { Config, Field, SanitizedConfig } from 'payload';
2
2
  type AddFilterOptionsToFieldsArgs = {
3
+ blockReferencesWithFilters: string[];
3
4
  config: Config | SanitizedConfig;
4
5
  fields: Field[];
5
6
  tenantEnabledCollectionSlugs: string[];
@@ -9,6 +10,6 @@ type AddFilterOptionsToFieldsArgs = {
9
10
  tenantsArrayTenantFieldName: string;
10
11
  tenantsCollectionSlug: string;
11
12
  };
12
- export declare function addFilterOptionsToFields({ config, fields, tenantEnabledCollectionSlugs, tenantEnabledGlobalSlugs, tenantFieldName, tenantsArrayFieldName, tenantsArrayTenantFieldName, tenantsCollectionSlug, }: AddFilterOptionsToFieldsArgs): void;
13
+ export declare function addFilterOptionsToFields({ blockReferencesWithFilters, config, fields, tenantEnabledCollectionSlugs, tenantEnabledGlobalSlugs, tenantFieldName, tenantsArrayFieldName, tenantsArrayTenantFieldName, tenantsCollectionSlug, }: AddFilterOptionsToFieldsArgs): void;
13
14
  export {};
14
15
  //# sourceMappingURL=addFilterOptionsToFields.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"addFilterOptionsToFields.d.ts","sourceRoot":"","sources":["../../src/utilities/addFilterOptionsToFields.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,KAAK,EAAqB,eAAe,EAAE,MAAM,SAAS,CAAA;AAKhF,KAAK,4BAA4B,GAAG;IAClC,MAAM,EAAE,MAAM,GAAG,eAAe,CAAA;IAChC,MAAM,EAAE,KAAK,EAAE,CAAA;IACf,4BAA4B,EAAE,MAAM,EAAE,CAAA;IACtC,wBAAwB,EAAE,MAAM,EAAE,CAAA;IAClC,eAAe,EAAE,MAAM,CAAA;IACvB,qBAAqB,EAAE,MAAM,CAAA;IAC7B,2BAA2B,EAAE,MAAM,CAAA;IACnC,qBAAqB,EAAE,MAAM,CAAA;CAC9B,CAAA;AAED,wBAAgB,wBAAwB,CAAC,EACvC,MAAM,EACN,MAAM,EACN,4BAA4B,EAC5B,wBAAwB,EACxB,eAAe,EACf,qBAAsD,EACtD,2BAAkE,EAClE,qBAAqB,GACtB,EAAE,4BAA4B,QAoG9B"}
1
+ {"version":3,"file":"addFilterOptionsToFields.d.ts","sourceRoot":"","sources":["../../src/utilities/addFilterOptionsToFields.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAS,MAAM,EAAE,KAAK,EAAqB,eAAe,EAAE,MAAM,SAAS,CAAA;AAKvF,KAAK,4BAA4B,GAAG;IAClC,0BAA0B,EAAE,MAAM,EAAE,CAAA;IACpC,MAAM,EAAE,MAAM,GAAG,eAAe,CAAA;IAChC,MAAM,EAAE,KAAK,EAAE,CAAA;IACf,4BAA4B,EAAE,MAAM,EAAE,CAAA;IACtC,wBAAwB,EAAE,MAAM,EAAE,CAAA;IAClC,eAAe,EAAE,MAAM,CAAA;IACvB,qBAAqB,EAAE,MAAM,CAAA;IAC7B,2BAA2B,EAAE,MAAM,CAAA;IACnC,qBAAqB,EAAE,MAAM,CAAA;CAC9B,CAAA;AAED,wBAAgB,wBAAwB,CAAC,EACvC,0BAA0B,EAC1B,MAAM,EACN,MAAM,EACN,4BAA4B,EAC5B,wBAAwB,EACxB,eAAe,EACf,qBAAsD,EACtD,2BAAkE,EAClE,qBAAqB,GACtB,EAAE,4BAA4B,QA6G9B"}
@@ -1,6 +1,6 @@
1
1
  import { defaults } from '../defaults.js';
2
2
  import { filterDocumentsByTenants } from '../filters/filterDocumentsByTenants.js';
3
- export function addFilterOptionsToFields({ config, fields, tenantEnabledCollectionSlugs, tenantEnabledGlobalSlugs, tenantFieldName, tenantsArrayFieldName = defaults.tenantsArrayFieldName, tenantsArrayTenantFieldName = defaults.tenantsArrayTenantFieldName, tenantsCollectionSlug }) {
3
+ export function addFilterOptionsToFields({ blockReferencesWithFilters, config, fields, tenantEnabledCollectionSlugs, tenantEnabledGlobalSlugs, tenantFieldName, tenantsArrayFieldName = defaults.tenantsArrayFieldName, tenantsArrayTenantFieldName = defaults.tenantsArrayTenantFieldName, tenantsCollectionSlug }) {
4
4
  fields.forEach((field)=>{
5
5
  if (field.type === 'relationship') {
6
6
  /**
@@ -40,6 +40,7 @@ export function addFilterOptionsToFields({ config, fields, tenantEnabledCollecti
40
40
  }
41
41
  if (field.type === 'row' || field.type === 'array' || field.type === 'collapsible' || field.type === 'group') {
42
42
  addFilterOptionsToFields({
43
+ blockReferencesWithFilters,
43
44
  config,
44
45
  fields: field.fields,
45
46
  tenantEnabledCollectionSlugs,
@@ -53,9 +54,19 @@ export function addFilterOptionsToFields({ config, fields, tenantEnabledCollecti
53
54
  if (field.type === 'blocks') {
54
55
  ;
55
56
  (field.blockReferences ?? field.blocks).forEach((_block)=>{
56
- const block = typeof _block === 'string' ? config?.blocks?.find((b)=>b.slug === _block) : _block;
57
+ let block;
58
+ if (typeof _block === 'string') {
59
+ if (blockReferencesWithFilters.includes(_block)) {
60
+ return;
61
+ }
62
+ block = config?.blocks?.find((b)=>b.slug === _block);
63
+ blockReferencesWithFilters.push(_block);
64
+ } else {
65
+ block = _block;
66
+ }
57
67
  if (block?.fields) {
58
68
  addFilterOptionsToFields({
69
+ blockReferencesWithFilters,
59
70
  config,
60
71
  fields: block.fields,
61
72
  tenantEnabledCollectionSlugs,
@@ -71,6 +82,7 @@ export function addFilterOptionsToFields({ config, fields, tenantEnabledCollecti
71
82
  if (field.type === 'tabs') {
72
83
  field.tabs.forEach((tab)=>{
73
84
  addFilterOptionsToFields({
85
+ blockReferencesWithFilters,
74
86
  config,
75
87
  fields: tab.fields,
76
88
  tenantEnabledCollectionSlugs,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utilities/addFilterOptionsToFields.ts"],"sourcesContent":["import type { Config, Field, RelationshipField, SanitizedConfig } from 'payload'\n\nimport { defaults } from '../defaults.js'\nimport { filterDocumentsByTenants } from '../filters/filterDocumentsByTenants.js'\n\ntype AddFilterOptionsToFieldsArgs = {\n config: Config | SanitizedConfig\n fields: Field[]\n tenantEnabledCollectionSlugs: string[]\n tenantEnabledGlobalSlugs: string[]\n tenantFieldName: string\n tenantsArrayFieldName: string\n tenantsArrayTenantFieldName: string\n tenantsCollectionSlug: string\n}\n\nexport function addFilterOptionsToFields({\n config,\n fields,\n tenantEnabledCollectionSlugs,\n tenantEnabledGlobalSlugs,\n tenantFieldName,\n tenantsArrayFieldName = defaults.tenantsArrayFieldName,\n tenantsArrayTenantFieldName = defaults.tenantsArrayTenantFieldName,\n tenantsCollectionSlug,\n}: AddFilterOptionsToFieldsArgs) {\n fields.forEach((field) => {\n if (field.type === 'relationship') {\n /**\n * Adjusts relationship fields to filter by tenant\n * and ensures relationTo cannot be a tenant global collection\n */\n if (typeof field.relationTo === 'string') {\n if (tenantEnabledGlobalSlugs.includes(field.relationTo)) {\n throw new Error(\n `The collection ${field.relationTo} is a global collection and cannot be related to a tenant enabled collection.`,\n )\n }\n if (tenantEnabledCollectionSlugs.includes(field.relationTo)) {\n addFilter({\n field,\n tenantEnabledCollectionSlugs,\n tenantFieldName,\n tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n tenantsCollectionSlug,\n })\n }\n } else {\n field.relationTo.map((relationTo) => {\n if (tenantEnabledGlobalSlugs.includes(relationTo)) {\n throw new Error(\n `The collection ${relationTo} is a global collection and cannot be related to a tenant enabled collection.`,\n )\n }\n if (tenantEnabledCollectionSlugs.includes(relationTo)) {\n addFilter({\n field,\n tenantEnabledCollectionSlugs,\n tenantFieldName,\n tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n tenantsCollectionSlug,\n })\n }\n })\n }\n }\n\n if (\n field.type === 'row' ||\n field.type === 'array' ||\n field.type === 'collapsible' ||\n field.type === 'group'\n ) {\n addFilterOptionsToFields({\n config,\n fields: field.fields,\n tenantEnabledCollectionSlugs,\n tenantEnabledGlobalSlugs,\n tenantFieldName,\n tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n tenantsCollectionSlug,\n })\n }\n\n if (field.type === 'blocks') {\n ;(field.blockReferences ?? field.blocks).forEach((_block) => {\n const block =\n typeof _block === 'string'\n ? // TODO: iterate over blocks mapped to block slug in v4, or pass through payload.blocks\n config?.blocks?.find((b) => b.slug === _block)\n : _block\n\n if (block?.fields) {\n addFilterOptionsToFields({\n config,\n fields: block.fields,\n tenantEnabledCollectionSlugs,\n tenantEnabledGlobalSlugs,\n tenantFieldName,\n tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n tenantsCollectionSlug,\n })\n }\n })\n }\n\n if (field.type === 'tabs') {\n field.tabs.forEach((tab) => {\n addFilterOptionsToFields({\n config,\n fields: tab.fields,\n tenantEnabledCollectionSlugs,\n tenantEnabledGlobalSlugs,\n tenantFieldName,\n tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n tenantsCollectionSlug,\n })\n })\n }\n })\n}\n\ntype AddFilterArgs = {\n field: RelationshipField\n tenantEnabledCollectionSlugs: string[]\n tenantFieldName: string\n tenantsArrayFieldName: string\n tenantsArrayTenantFieldName: string\n tenantsCollectionSlug: string\n}\nfunction addFilter({\n field,\n tenantEnabledCollectionSlugs,\n tenantFieldName,\n tenantsArrayFieldName = defaults.tenantsArrayFieldName,\n tenantsArrayTenantFieldName = defaults.tenantsArrayTenantFieldName,\n tenantsCollectionSlug,\n}: AddFilterArgs) {\n // User specified filter\n const originalFilter = field.filterOptions\n field.filterOptions = async (args) => {\n const originalFilterResult =\n typeof originalFilter === 'function' ? await originalFilter(args) : (originalFilter ?? true)\n\n // If the relationTo is not a tenant enabled collection, return early\n if (args.relationTo && !tenantEnabledCollectionSlugs.includes(args.relationTo)) {\n return originalFilterResult\n }\n\n // If the original filtr returns false, return early\n if (originalFilterResult === false) {\n return false\n }\n\n // Custom tenant filter\n const tenantFilterResults = filterDocumentsByTenants({\n filterFieldName: tenantFieldName,\n req: args.req,\n tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n tenantsCollectionSlug,\n })\n\n // If the tenant filter returns null, meaning no tenant filter, just use the original filter\n if (tenantFilterResults === null) {\n return originalFilterResult\n }\n\n // If the original filter returns true, just use the tenant filter\n if (originalFilterResult === true) {\n return tenantFilterResults\n }\n\n return {\n and: [originalFilterResult, tenantFilterResults],\n }\n }\n}\n"],"names":["defaults","filterDocumentsByTenants","addFilterOptionsToFields","config","fields","tenantEnabledCollectionSlugs","tenantEnabledGlobalSlugs","tenantFieldName","tenantsArrayFieldName","tenantsArrayTenantFieldName","tenantsCollectionSlug","forEach","field","type","relationTo","includes","Error","addFilter","map","blockReferences","blocks","_block","block","find","b","slug","tabs","tab","originalFilter","filterOptions","args","originalFilterResult","tenantFilterResults","filterFieldName","req","and"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/utilities/addFilterOptionsToFields.ts"],"sourcesContent":["import type { Block, Config, Field, RelationshipField, SanitizedConfig } from 'payload'\n\nimport { defaults } from '../defaults.js'\nimport { filterDocumentsByTenants } from '../filters/filterDocumentsByTenants.js'\n\ntype AddFilterOptionsToFieldsArgs = {\n blockReferencesWithFilters: string[]\n config: Config | SanitizedConfig\n fields: Field[]\n tenantEnabledCollectionSlugs: string[]\n tenantEnabledGlobalSlugs: string[]\n tenantFieldName: string\n tenantsArrayFieldName: string\n tenantsArrayTenantFieldName: string\n tenantsCollectionSlug: string\n}\n\nexport function addFilterOptionsToFields({\n blockReferencesWithFilters,\n config,\n fields,\n tenantEnabledCollectionSlugs,\n tenantEnabledGlobalSlugs,\n tenantFieldName,\n tenantsArrayFieldName = defaults.tenantsArrayFieldName,\n tenantsArrayTenantFieldName = defaults.tenantsArrayTenantFieldName,\n tenantsCollectionSlug,\n}: AddFilterOptionsToFieldsArgs) {\n fields.forEach((field) => {\n if (field.type === 'relationship') {\n /**\n * Adjusts relationship fields to filter by tenant\n * and ensures relationTo cannot be a tenant global collection\n */\n if (typeof field.relationTo === 'string') {\n if (tenantEnabledGlobalSlugs.includes(field.relationTo)) {\n throw new Error(\n `The collection ${field.relationTo} is a global collection and cannot be related to a tenant enabled collection.`,\n )\n }\n if (tenantEnabledCollectionSlugs.includes(field.relationTo)) {\n addFilter({\n field,\n tenantEnabledCollectionSlugs,\n tenantFieldName,\n tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n tenantsCollectionSlug,\n })\n }\n } else {\n field.relationTo.map((relationTo) => {\n if (tenantEnabledGlobalSlugs.includes(relationTo)) {\n throw new Error(\n `The collection ${relationTo} is a global collection and cannot be related to a tenant enabled collection.`,\n )\n }\n if (tenantEnabledCollectionSlugs.includes(relationTo)) {\n addFilter({\n field,\n tenantEnabledCollectionSlugs,\n tenantFieldName,\n tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n tenantsCollectionSlug,\n })\n }\n })\n }\n }\n\n if (\n field.type === 'row' ||\n field.type === 'array' ||\n field.type === 'collapsible' ||\n field.type === 'group'\n ) {\n addFilterOptionsToFields({\n blockReferencesWithFilters,\n config,\n fields: field.fields,\n tenantEnabledCollectionSlugs,\n tenantEnabledGlobalSlugs,\n tenantFieldName,\n tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n tenantsCollectionSlug,\n })\n }\n\n if (field.type === 'blocks') {\n ;(field.blockReferences ?? field.blocks).forEach((_block) => {\n let block: Block | undefined\n\n if (typeof _block === 'string') {\n if (blockReferencesWithFilters.includes(_block)) {\n return\n }\n block = config?.blocks?.find((b) => b.slug === _block)\n blockReferencesWithFilters.push(_block)\n } else {\n block = _block\n }\n\n if (block?.fields) {\n addFilterOptionsToFields({\n blockReferencesWithFilters,\n config,\n fields: block.fields,\n tenantEnabledCollectionSlugs,\n tenantEnabledGlobalSlugs,\n tenantFieldName,\n tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n tenantsCollectionSlug,\n })\n }\n })\n }\n\n if (field.type === 'tabs') {\n field.tabs.forEach((tab) => {\n addFilterOptionsToFields({\n blockReferencesWithFilters,\n config,\n fields: tab.fields,\n tenantEnabledCollectionSlugs,\n tenantEnabledGlobalSlugs,\n tenantFieldName,\n tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n tenantsCollectionSlug,\n })\n })\n }\n })\n}\n\ntype AddFilterArgs = {\n field: RelationshipField\n tenantEnabledCollectionSlugs: string[]\n tenantFieldName: string\n tenantsArrayFieldName: string\n tenantsArrayTenantFieldName: string\n tenantsCollectionSlug: string\n}\nfunction addFilter({\n field,\n tenantEnabledCollectionSlugs,\n tenantFieldName,\n tenantsArrayFieldName = defaults.tenantsArrayFieldName,\n tenantsArrayTenantFieldName = defaults.tenantsArrayTenantFieldName,\n tenantsCollectionSlug,\n}: AddFilterArgs) {\n // User specified filter\n const originalFilter = field.filterOptions\n field.filterOptions = async (args) => {\n const originalFilterResult =\n typeof originalFilter === 'function' ? await originalFilter(args) : (originalFilter ?? true)\n\n // If the relationTo is not a tenant enabled collection, return early\n if (args.relationTo && !tenantEnabledCollectionSlugs.includes(args.relationTo)) {\n return originalFilterResult\n }\n\n // If the original filtr returns false, return early\n if (originalFilterResult === false) {\n return false\n }\n\n // Custom tenant filter\n const tenantFilterResults = filterDocumentsByTenants({\n filterFieldName: tenantFieldName,\n req: args.req,\n tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n tenantsCollectionSlug,\n })\n\n // If the tenant filter returns null, meaning no tenant filter, just use the original filter\n if (tenantFilterResults === null) {\n return originalFilterResult\n }\n\n // If the original filter returns true, just use the tenant filter\n if (originalFilterResult === true) {\n return tenantFilterResults\n }\n\n return {\n and: [originalFilterResult, tenantFilterResults],\n }\n }\n}\n"],"names":["defaults","filterDocumentsByTenants","addFilterOptionsToFields","blockReferencesWithFilters","config","fields","tenantEnabledCollectionSlugs","tenantEnabledGlobalSlugs","tenantFieldName","tenantsArrayFieldName","tenantsArrayTenantFieldName","tenantsCollectionSlug","forEach","field","type","relationTo","includes","Error","addFilter","map","blockReferences","blocks","_block","block","find","b","slug","push","tabs","tab","originalFilter","filterOptions","args","originalFilterResult","tenantFilterResults","filterFieldName","req","and"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@payloadcms/plugin-multi-tenant",
3
- "version": "3.54.0-internal.bdc84f3",
3
+ "version": "3.55.0-canary.0",
4
4
  "description": "Multi Tenant plugin for Payload",
5
5
  "keywords": [
6
6
  "payload",
@@ -80,15 +80,15 @@
80
80
  "types.d.ts"
81
81
  ],
82
82
  "devDependencies": {
83
- "@payloadcms/translations": "3.54.0-internal.bdc84f3",
84
- "@payloadcms/ui": "3.54.0-internal.bdc84f3",
85
- "payload": "3.54.0-internal.bdc84f3",
86
- "@payloadcms/eslint-config": "3.28.0"
83
+ "@payloadcms/eslint-config": "3.28.0",
84
+ "@payloadcms/translations": "3.55.0-canary.0",
85
+ "@payloadcms/ui": "3.55.0-canary.0",
86
+ "payload": "3.55.0-canary.0"
87
87
  },
88
88
  "peerDependencies": {
89
89
  "next": "^15.2.3",
90
- "@payloadcms/ui": "3.54.0-internal.bdc84f3",
91
- "payload": "3.54.0-internal.bdc84f3"
90
+ "@payloadcms/ui": "3.55.0-canary.0",
91
+ "payload": "3.55.0-canary.0"
92
92
  },
93
93
  "homepage:": "https://payloadcms.com",
94
94
  "scripts": {