@payloadcms/ui 3.0.0-beta.98 → 3.0.0-beta.99

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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/fields/Relationship/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAiB,sBAAsB,EAAS,MAAM,SAAS,CAAA;AAI3E,OAAO,KAA+D,MAAM,OAAO,CAAA;AAqBnF,OAAO,cAAc,CAAA;AAklBrB,eAAO,MAAM,iBAAiB,kCAA4C,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/fields/Relationship/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAiB,sBAAsB,EAAS,MAAM,SAAS,CAAA;AAI3E,OAAO,KAA+D,MAAM,OAAO,CAAA;AAsBnF,OAAO,cAAc,CAAA;AA0lBrB,eAAO,MAAM,iBAAiB,kCAA4C,CAAA"}
@@ -10,6 +10,7 @@ import { useFieldProps } from '../../forms/FieldPropsProvider/index.js';
10
10
  import { useField } from '../../forms/useField/index.js';
11
11
  import { withCondition } from '../../forms/withCondition/index.js';
12
12
  import { useDebouncedCallback } from '../../hooks/useDebouncedCallback.js';
13
+ import { useIgnoredEffect } from '../../hooks/useIgnoredEffect.js';
13
14
  import { useAuth } from '../../providers/Auth/index.js';
14
15
  import { useConfig } from '../../providers/Config/index.js';
15
16
  import { useLocale } from '../../providers/Locale/index.js';
@@ -75,14 +76,13 @@ const RelationshipFieldComponent = props => {
75
76
  code: locale
76
77
  } = useLocale();
77
78
  const hasMultipleRelations = Array.isArray(relationTo);
78
- const [options, dispatchOptions] = useReducer(optionsReducer, []);
79
79
  const [lastFullyLoadedRelation, setLastFullyLoadedRelation] = useState(-1);
80
80
  const [lastLoadedPage, setLastLoadedPage] = useState({});
81
81
  const [errorLoading, setErrorLoading] = useState('');
82
82
  const [search, setSearch] = useState('');
83
83
  const [isLoading, setIsLoading] = useState(false);
84
84
  const [enableWordBoundarySearch, setEnableWordBoundarySearch] = useState(false);
85
- const menuIsOpen = useRef(false);
85
+ const [menuIsOpen, setMenuIsOpen] = useState(false);
86
86
  const hasLoadedFirstPageRef = useRef(false);
87
87
  const memoizedValidate = useCallback((value, validationOptions) => {
88
88
  if (typeof validate === 'function') {
@@ -109,11 +109,13 @@ const RelationshipFieldComponent = props => {
109
109
  path: pathFromContext ?? pathFromProps ?? name,
110
110
  validate: memoizedValidate
111
111
  });
112
+ const [options, dispatchOptions] = useReducer(optionsReducer, []);
112
113
  const readOnly = readOnlyFromProps || readOnlyFromContext || formInitializing;
113
114
  const valueRef = useRef(value_0);
114
115
  valueRef.current = value_0;
115
116
  const [drawerIsOpen, setDrawerIsOpen] = useState(false);
116
117
  const getResults = useCallback(async ({
118
+ filterOptions: filterOptions_0,
117
119
  lastFullyLoadedRelation: lastFullyLoadedRelationArg,
118
120
  lastLoadedPage: lastLoadedPageArg,
119
121
  onSuccess,
@@ -135,7 +137,7 @@ const RelationshipFieldComponent = props => {
135
137
  });
136
138
  if (!errorLoading) {
137
139
  await relationsToFetch.reduce(async (priorRelation, relation) => {
138
- const relationFilterOption = filterOptions?.[relation];
140
+ const relationFilterOption = filterOptions_0?.[relation];
139
141
  let lastLoadedPageToUse;
140
142
  if (search !== searchArg) {
141
143
  lastLoadedPageToUse = 1;
@@ -237,9 +239,10 @@ const RelationshipFieldComponent = props => {
237
239
  onSuccess();
238
240
  }
239
241
  }
240
- }, [permissions, relationTo, hasMany, errorLoading, search, collections, locale, filterOptions, serverURL, sortOptions, api, i18n, config, t]);
242
+ }, [permissions, relationTo, hasMany, errorLoading, search, collections, locale, serverURL, sortOptions, api, i18n, config, t]);
241
243
  const updateSearch = useDebouncedCallback((searchArg_0, valueArg_0) => {
242
244
  void getResults({
245
+ filterOptions,
243
246
  lastLoadedPage: {},
244
247
  search: searchArg_0,
245
248
  sort: true,
@@ -256,7 +259,7 @@ const RelationshipFieldComponent = props => {
256
259
  // ///////////////////////////////////
257
260
  // Ensure we have an option for each value
258
261
  // ///////////////////////////////////
259
- useEffect(() => {
262
+ useIgnoredEffect(() => {
260
263
  const relationMap_0 = createRelationMap({
261
264
  hasMany,
262
265
  relationTo,
@@ -310,7 +313,7 @@ const RelationshipFieldComponent = props => {
310
313
  }
311
314
  }
312
315
  }, Promise.resolve());
313
- }, [options, value_0, hasMany, errorLoading, collections, hasMultipleRelations, serverURL, api, i18n, relationTo, locale, config]);
316
+ }, [value_0], [options, hasMany, errorLoading, collections, hasMultipleRelations, serverURL, api, i18n, relationTo, locale, config]);
314
317
  // Determine if we should switch to word boundary search
315
318
  useEffect(() => {
316
319
  const relations_0 = Array.isArray(relationTo) ? relationTo : [relationTo];
@@ -323,13 +326,14 @@ const RelationshipFieldComponent = props => {
323
326
  }, [relationTo, collections]);
324
327
  // When (`relationTo` || `filterOptions` || `locale`) changes, reset component
325
328
  // Note - effect should not run on first run
326
- useEffect(() => {
329
+ useIgnoredEffect(() => {
327
330
  // If the menu is open while filterOptions changes
328
331
  // due to latency of getFormState and fast clicking into this field,
329
332
  // re-fetch options
330
- if (hasLoadedFirstPageRef.current && menuIsOpen.current) {
333
+ if (hasLoadedFirstPageRef.current && menuIsOpen) {
331
334
  setIsLoading(true);
332
335
  void getResults({
336
+ filterOptions,
333
337
  lastLoadedPage: {},
334
338
  onSuccess: () => {
335
339
  hasLoadedFirstPageRef.current = true;
@@ -339,15 +343,14 @@ const RelationshipFieldComponent = props => {
339
343
  });
340
344
  }
341
345
  // If the menu is not open, still reset the field state
342
- // because we need to get new options next time the menu
343
- // opens by the user
346
+ // because we need to get new options next time the menu opens
344
347
  dispatchOptions({
345
- type: 'CLEAR'
348
+ type: 'CLEAR',
349
+ exemptValues: valueRef.current
346
350
  });
347
351
  setLastFullyLoadedRelation(-1);
348
352
  setLastLoadedPage({});
349
- hasLoadedFirstPageRef.current = false;
350
- }, [relationTo, filterOptions, locale, menuIsOpen, getResults, valueRef, hasLoadedFirstPageRef, path]);
353
+ }, [relationTo, filterOptions, locale, path, menuIsOpen], [getResults]);
351
354
  const onSave = useCallback(args => {
352
355
  dispatchOptions({
353
356
  type: 'UPDATE',
@@ -454,13 +457,14 @@ const RelationshipFieldComponent = props => {
454
457
  } : undefined,
455
458
  onInputChange: newSearch => handleInputChange(newSearch, value_0),
456
459
  onMenuClose: () => {
457
- menuIsOpen.current = false;
460
+ setMenuIsOpen(false);
458
461
  },
459
462
  onMenuOpen: () => {
460
- menuIsOpen.current = true;
463
+ setMenuIsOpen(true);
461
464
  if (!hasLoadedFirstPageRef.current) {
462
465
  setIsLoading(true);
463
466
  void getResults({
467
+ filterOptions,
464
468
  lastLoadedPage: {},
465
469
  onSuccess: () => {
466
470
  hasLoadedFirstPageRef.current = true;
@@ -472,6 +476,7 @@ const RelationshipFieldComponent = props => {
472
476
  },
473
477
  onMenuScrollToBottom: () => {
474
478
  void getResults({
479
+ filterOptions,
475
480
  lastFullyLoadedRelation,
476
481
  lastLoadedPage,
477
482
  search,
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["wordBoundariesRegex","qs","React","useCallback","useEffect","useReducer","useRef","useState","AddNewRelation","ReactSelect","useFieldProps","useField","withCondition","useDebouncedCallback","useAuth","useConfig","useLocale","useTranslation","FieldDescription","FieldError","FieldLabel","fieldBaseClass","createRelationMap","findOptionsByValue","optionsReducer","MultiValueLabel","SingleValue","maxResultsPerRequest","baseClass","RelationshipFieldComponent","props","descriptionProps","errorProps","field","name","_path","pathFromProps","admin","allowCreate","className","description","isSortable","readOnly","readOnlyFromAdmin","sortOptions","style","width","hasMany","label","relationTo","required","labelProps","readOnlyFromTopLevelProps","validate","readOnlyFromProps","config","collections","routes","api","serverURL","i18n","t","permissions","code","locale","hasMultipleRelations","Array","isArray","options","dispatchOptions","lastFullyLoadedRelation","setLastFullyLoadedRelation","lastLoadedPage","setLastLoadedPage","errorLoading","setErrorLoading","search","setSearch","isLoading","setIsLoading","enableWordBoundarySearch","setEnableWordBoundarySearch","menuIsOpen","hasLoadedFirstPageRef","memoizedValidate","value","validationOptions","path","pathFromContext","readOnlyFromContext","filterOptions","formInitializing","formProcessing","initialValue","setValue","showError","valueRef","current","drawerIsOpen","setDrawerIsOpen","getResults","lastFullyLoadedRelationArg","lastLoadedPageArg","onSuccess","searchArg","sort","valueArg","lastFullyLoadedRelationToUse","relations","relationsToFetch","slice","resultsFetched","relationMap","reduce","priorRelation","relation","relationFilterOption","lastLoadedPageToUse","indexOf","Promise","resolve","collection","find","coll","slug","fieldToSearch","useAsTitle","fieldToSort","defaultSort","query","depth","draft","limit","page","where","and","id","not_in","push","like","response","fetch","body","stringify","credentials","headers","language","method","ok","data","json","prevState","nextPage","docs","length","type","status","ids","updateSearch","handleInputChange","Object","entries","idsToLoad","filter","optionGroup","option","in","isIdOnly","idOnly","onSave","args","collectionConfig","doc","filterOption","item","searchFilter","r","breakApartThreshold","string","indexOfSpace","test","valueToRender","_jsxs","Boolean","join","replace","_jsx","Label","components","CustomError","Error","backspaceRemovesValue","customProps","disableKeyDown","disableMouseDown","disabled","undefined","getOptionValue","isMulti","onChange","selected","map","onInputChange","newSearch","onMenuClose","onMenuOpen","onMenuScrollToBottom","Description","RelationshipField"],"sources":["../../../src/fields/Relationship/index.tsx"],"sourcesContent":["'use client'\nimport type { PaginatedDocs, RelationshipFieldProps, Where } from 'payload'\n\nimport { wordBoundariesRegex } from 'payload/shared'\nimport * as qs from 'qs-esm'\nimport React, { useCallback, useEffect, useReducer, useRef, useState } from 'react'\n\nimport type { DocumentDrawerProps } from '../../elements/DocumentDrawer/types.js'\nimport type { GetResults, Option, Value } from './types.js'\n\nimport { AddNewRelation } from '../../elements/AddNewRelation/index.js'\nimport { ReactSelect } from '../../elements/ReactSelect/index.js'\nimport { useFieldProps } from '../../forms/FieldPropsProvider/index.js'\nimport { useField } from '../../forms/useField/index.js'\nimport { withCondition } from '../../forms/withCondition/index.js'\nimport { useDebouncedCallback } from '../../hooks/useDebouncedCallback.js'\nimport { useAuth } from '../../providers/Auth/index.js'\nimport { useConfig } from '../../providers/Config/index.js'\nimport { useLocale } from '../../providers/Locale/index.js'\nimport { useTranslation } from '../../providers/Translation/index.js'\nimport { FieldDescription } from '../FieldDescription/index.js'\nimport { FieldError } from '../FieldError/index.js'\nimport { FieldLabel } from '../FieldLabel/index.js'\nimport { fieldBaseClass } from '../shared/index.js'\nimport { createRelationMap } from './createRelationMap.js'\nimport { findOptionsByValue } from './findOptionsByValue.js'\nimport './index.scss'\nimport { optionsReducer } from './optionsReducer.js'\nimport { MultiValueLabel } from './select-components/MultiValueLabel/index.js'\nimport { SingleValue } from './select-components/SingleValue/index.js'\n\nconst maxResultsPerRequest = 10\n\nconst baseClass = 'relationship'\n\nconst RelationshipFieldComponent: React.FC<RelationshipFieldProps> = (props) => {\n const {\n descriptionProps,\n errorProps,\n field,\n field: {\n name,\n _path: pathFromProps,\n admin: {\n allowCreate = true,\n className,\n description,\n isSortable = true,\n readOnly: readOnlyFromAdmin,\n sortOptions,\n style,\n width,\n } = {},\n hasMany,\n label,\n relationTo,\n required,\n },\n labelProps,\n readOnly: readOnlyFromTopLevelProps,\n validate,\n } = props\n const readOnlyFromProps = readOnlyFromTopLevelProps || readOnlyFromAdmin\n\n const { config } = useConfig()\n\n const {\n collections,\n routes: { api },\n serverURL,\n } = config\n\n const { i18n, t } = useTranslation()\n const { permissions } = useAuth()\n const { code: locale } = useLocale()\n const hasMultipleRelations = Array.isArray(relationTo)\n const [options, dispatchOptions] = useReducer(optionsReducer, [])\n const [lastFullyLoadedRelation, setLastFullyLoadedRelation] = useState(-1)\n const [lastLoadedPage, setLastLoadedPage] = useState<Record<string, number>>({})\n const [errorLoading, setErrorLoading] = useState('')\n const [search, setSearch] = useState('')\n const [isLoading, setIsLoading] = useState(false)\n const [enableWordBoundarySearch, setEnableWordBoundarySearch] = useState(false)\n const menuIsOpen = useRef(false)\n const hasLoadedFirstPageRef = useRef(false)\n\n const memoizedValidate = useCallback(\n (value, validationOptions) => {\n if (typeof validate === 'function') {\n return validate(value, { ...validationOptions, required })\n }\n },\n [validate, required],\n )\n const { path: pathFromContext, readOnly: readOnlyFromContext } = useFieldProps()\n\n const {\n filterOptions,\n formInitializing,\n formProcessing,\n initialValue,\n path,\n setValue,\n showError,\n value,\n } = useField<Value | Value[]>({\n path: pathFromContext ?? pathFromProps ?? name,\n validate: memoizedValidate,\n })\n\n const readOnly = readOnlyFromProps || readOnlyFromContext || formInitializing\n\n const valueRef = useRef(value)\n valueRef.current = value\n\n const [drawerIsOpen, setDrawerIsOpen] = useState(false)\n\n const getResults: GetResults = useCallback(\n async ({\n lastFullyLoadedRelation: lastFullyLoadedRelationArg,\n lastLoadedPage: lastLoadedPageArg,\n onSuccess,\n search: searchArg,\n sort,\n value: valueArg,\n }) => {\n if (!permissions) {\n return\n }\n const lastFullyLoadedRelationToUse =\n typeof lastFullyLoadedRelationArg !== 'undefined' ? lastFullyLoadedRelationArg : -1\n\n const relations = Array.isArray(relationTo) ? relationTo : [relationTo]\n const relationsToFetch =\n lastFullyLoadedRelationToUse === -1\n ? relations\n : relations.slice(lastFullyLoadedRelationToUse + 1)\n\n let resultsFetched = 0\n const relationMap = createRelationMap({\n hasMany,\n relationTo,\n value: valueArg,\n })\n\n if (!errorLoading) {\n await relationsToFetch.reduce(async (priorRelation, relation) => {\n const relationFilterOption = filterOptions?.[relation]\n\n let lastLoadedPageToUse\n if (search !== searchArg) {\n lastLoadedPageToUse = 1\n } else {\n lastLoadedPageToUse = lastLoadedPageArg[relation] + 1\n }\n await priorRelation\n\n if (relationFilterOption === false) {\n setLastFullyLoadedRelation(relations.indexOf(relation))\n return Promise.resolve()\n }\n\n if (resultsFetched < 10) {\n const collection = collections.find((coll) => coll.slug === relation)\n const fieldToSearch = collection?.admin?.useAsTitle || 'id'\n let fieldToSort = collection?.defaultSort || 'id'\n if (typeof sortOptions === 'string') {\n fieldToSort = sortOptions\n } else if (sortOptions?.[relation]) {\n fieldToSort = sortOptions[relation]\n }\n\n const query: {\n [key: string]: unknown\n where: Where\n } = {\n depth: 0,\n draft: true,\n limit: maxResultsPerRequest,\n locale,\n page: lastLoadedPageToUse,\n sort: fieldToSort,\n where: {\n and: [\n {\n id: {\n not_in: relationMap[relation],\n },\n },\n ],\n },\n }\n\n if (searchArg) {\n query.where.and.push({\n [fieldToSearch]: {\n like: searchArg,\n },\n })\n }\n\n if (relationFilterOption && typeof relationFilterOption !== 'boolean') {\n query.where.and.push(relationFilterOption)\n }\n\n const response = await fetch(`${serverURL}${api}/${relation}`, {\n body: qs.stringify(query),\n credentials: 'include',\n headers: {\n 'Accept-Language': i18n.language,\n 'Content-Type': 'application/x-www-form-urlencoded',\n 'X-HTTP-Method-Override': 'GET',\n },\n method: 'POST',\n })\n\n if (response.ok) {\n const data: PaginatedDocs<unknown> = await response.json()\n setLastLoadedPage((prevState) => {\n return {\n ...prevState,\n [relation]: lastLoadedPageToUse,\n }\n })\n\n if (!data.nextPage) {\n setLastFullyLoadedRelation(relations.indexOf(relation))\n }\n\n if (data.docs.length > 0) {\n resultsFetched += data.docs.length\n\n dispatchOptions({\n type: 'ADD',\n collection,\n // TODO: fix this\n // @ts-expect-error-next-line\n config,\n docs: data.docs,\n i18n,\n sort,\n })\n }\n } else if (response.status === 403) {\n setLastFullyLoadedRelation(relations.indexOf(relation))\n dispatchOptions({\n type: 'ADD',\n collection,\n // TODO: fix this\n // @ts-expect-error-next-line\n config,\n docs: [],\n i18n,\n ids: relationMap[relation],\n sort,\n })\n } else {\n setErrorLoading(t('error:unspecific'))\n }\n }\n }, Promise.resolve())\n\n if (typeof onSuccess === 'function') {\n onSuccess()\n }\n }\n },\n [\n permissions,\n relationTo,\n hasMany,\n errorLoading,\n search,\n collections,\n locale,\n filterOptions,\n serverURL,\n sortOptions,\n api,\n i18n,\n config,\n t,\n ],\n )\n\n const updateSearch = useDebouncedCallback((searchArg: string, valueArg: Value | Value[]) => {\n void getResults({ lastLoadedPage: {}, search: searchArg, sort: true, value: valueArg })\n setSearch(searchArg)\n }, 300)\n\n const handleInputChange = useCallback(\n (searchArg: string, valueArg: Value | Value[]) => {\n if (search !== searchArg) {\n setLastLoadedPage({})\n updateSearch(searchArg, valueArg, searchArg !== '')\n }\n },\n [search, updateSearch],\n )\n\n // ///////////////////////////////////\n // Ensure we have an option for each value\n // ///////////////////////////////////\n\n useEffect(() => {\n const relationMap = createRelationMap({\n hasMany,\n relationTo,\n value,\n })\n\n void Object.entries(relationMap).reduce(async (priorRelation, [relation, ids]) => {\n await priorRelation\n\n const idsToLoad = ids.filter((id) => {\n return !options.find((optionGroup) =>\n optionGroup?.options?.find(\n (option) => option.value === id && option.relationTo === relation,\n ),\n )\n })\n\n if (idsToLoad.length > 0) {\n const query = {\n depth: 0,\n draft: true,\n limit: idsToLoad.length,\n locale,\n where: {\n id: {\n in: idsToLoad,\n },\n },\n }\n\n if (!errorLoading) {\n const response = await fetch(`${serverURL}${api}/${relation}`, {\n body: qs.stringify(query),\n credentials: 'include',\n headers: {\n 'Accept-Language': i18n.language,\n 'Content-Type': 'application/x-www-form-urlencoded',\n 'X-HTTP-Method-Override': 'GET',\n },\n method: 'POST',\n })\n\n const collection = collections.find((coll) => coll.slug === relation)\n let docs = []\n\n if (response.ok) {\n const data = await response.json()\n docs = data.docs\n }\n\n dispatchOptions({\n type: 'ADD',\n collection,\n // TODO: fix this\n // @ts-expect-error-next-line\n config,\n docs,\n i18n,\n ids: idsToLoad,\n sort: true,\n })\n }\n }\n }, Promise.resolve())\n }, [\n options,\n value,\n hasMany,\n errorLoading,\n collections,\n hasMultipleRelations,\n serverURL,\n api,\n i18n,\n relationTo,\n locale,\n config,\n ])\n\n // Determine if we should switch to word boundary search\n useEffect(() => {\n const relations = Array.isArray(relationTo) ? relationTo : [relationTo]\n const isIdOnly = relations.reduce((idOnly, relation) => {\n const collection = collections.find((coll) => coll.slug === relation)\n const fieldToSearch = collection?.admin?.useAsTitle || 'id'\n return fieldToSearch === 'id' && idOnly\n }, true)\n setEnableWordBoundarySearch(!isIdOnly)\n }, [relationTo, collections])\n\n // When (`relationTo` || `filterOptions` || `locale`) changes, reset component\n // Note - effect should not run on first run\n useEffect(() => {\n // If the menu is open while filterOptions changes\n // due to latency of getFormState and fast clicking into this field,\n // re-fetch options\n\n if (hasLoadedFirstPageRef.current && menuIsOpen.current) {\n setIsLoading(true)\n void getResults({\n lastLoadedPage: {},\n onSuccess: () => {\n hasLoadedFirstPageRef.current = true\n setIsLoading(false)\n },\n value: valueRef.current,\n })\n }\n\n // If the menu is not open, still reset the field state\n // because we need to get new options next time the menu\n // opens by the user\n\n dispatchOptions({ type: 'CLEAR' })\n setLastFullyLoadedRelation(-1)\n setLastLoadedPage({})\n hasLoadedFirstPageRef.current = false\n }, [\n relationTo,\n filterOptions,\n locale,\n menuIsOpen,\n getResults,\n valueRef,\n hasLoadedFirstPageRef,\n path,\n ])\n\n const onSave = useCallback<DocumentDrawerProps['onSave']>(\n (args) => {\n dispatchOptions({\n type: 'UPDATE',\n collection: args.collectionConfig,\n // TODO: fix this\n // @ts-expect-error-next-line\n config,\n doc: args.doc,\n i18n,\n })\n },\n [i18n, config],\n )\n\n const filterOption = useCallback((item: Option, searchFilter: string) => {\n if (!searchFilter) {\n return true\n }\n const r = wordBoundariesRegex(searchFilter || '')\n // breaking the labels to search into smaller parts increases performance\n const breakApartThreshold = 250\n let string = item.label\n // strings less than breakApartThreshold length won't be chunked\n while (string.length > breakApartThreshold) {\n // slicing by the next space after the length of the search input prevents slicing the string up by partial words\n const indexOfSpace = string.indexOf(' ', searchFilter.length)\n if (r.test(string.slice(0, indexOfSpace === -1 ? searchFilter.length : indexOfSpace + 1))) {\n return true\n }\n string = string.slice(indexOfSpace === -1 ? searchFilter.length : indexOfSpace + 1)\n }\n return r.test(string.slice(-breakApartThreshold))\n }, [])\n\n const valueToRender = findOptionsByValue({ options, value })\n\n if (!Array.isArray(valueToRender) && valueToRender?.value === 'null') {\n valueToRender.value = null\n }\n\n return (\n <div\n className={[\n fieldBaseClass,\n baseClass,\n className,\n showError && 'error',\n errorLoading && 'error-loading',\n readOnly && `${baseClass}--read-only`,\n !readOnly && allowCreate && `${baseClass}--allow-create`,\n ]\n .filter(Boolean)\n .join(' ')}\n id={`field-${path.replace(/\\./g, '__')}`}\n style={{\n ...style,\n width,\n }}\n >\n <FieldLabel\n field={field}\n Label={field?.admin?.components?.Label}\n label={label}\n required={required}\n {...(labelProps || {})}\n />\n <div className={`${fieldBaseClass}__wrap`}>\n <FieldError\n CustomError={field?.admin?.components?.Error}\n field={field}\n path={path}\n {...(errorProps || {})}\n />\n {!errorLoading && (\n <div className={`${baseClass}__wrap`}>\n <ReactSelect\n backspaceRemovesValue={!drawerIsOpen}\n components={{\n MultiValueLabel,\n SingleValue,\n }}\n customProps={{\n disableKeyDown: drawerIsOpen,\n disableMouseDown: drawerIsOpen,\n onSave,\n setDrawerIsOpen,\n }}\n disabled={readOnly || formProcessing || drawerIsOpen}\n filterOption={enableWordBoundarySearch ? filterOption : undefined}\n getOptionValue={(option) => {\n if (!option) {\n return undefined\n }\n return hasMany && Array.isArray(relationTo)\n ? `${option.relationTo}_${option.value}`\n : option.value\n }}\n isLoading={isLoading}\n isMulti={hasMany}\n isSortable={isSortable}\n onChange={\n !readOnly\n ? (selected) => {\n if (selected === null) {\n setValue(hasMany ? [] : null)\n } else if (hasMany && Array.isArray(selected)) {\n setValue(\n selected\n ? selected.map((option) => {\n if (hasMultipleRelations) {\n return {\n relationTo: option.relationTo,\n value: option.value,\n }\n }\n\n return option.value\n })\n : null,\n )\n } else if (hasMultipleRelations && !Array.isArray(selected)) {\n setValue({\n relationTo: selected.relationTo,\n value: selected.value,\n })\n } else if (!Array.isArray(selected)) {\n setValue(selected.value)\n }\n }\n : undefined\n }\n onInputChange={(newSearch) => handleInputChange(newSearch, value)}\n onMenuClose={() => {\n menuIsOpen.current = false\n }}\n onMenuOpen={() => {\n menuIsOpen.current = true\n\n if (!hasLoadedFirstPageRef.current) {\n setIsLoading(true)\n void getResults({\n lastLoadedPage: {},\n onSuccess: () => {\n hasLoadedFirstPageRef.current = true\n setIsLoading(false)\n },\n value: initialValue,\n })\n }\n }}\n onMenuScrollToBottom={() => {\n void getResults({\n lastFullyLoadedRelation,\n lastLoadedPage,\n search,\n sort: false,\n value: initialValue,\n })\n }}\n options={options}\n showError={showError}\n value={valueToRender ?? null}\n />\n {!readOnly && allowCreate && (\n <AddNewRelation\n hasMany={hasMany}\n path={path}\n relationTo={relationTo}\n setValue={setValue}\n value={value}\n />\n )}\n </div>\n )}\n {errorLoading && <div className={`${baseClass}__error-loading`}>{errorLoading}</div>}\n <FieldDescription\n Description={field?.admin?.components?.Description}\n description={description}\n field={field}\n {...(descriptionProps || {})}\n />\n </div>\n </div>\n )\n}\n\nexport const RelationshipField = withCondition(RelationshipFieldComponent)\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"index.js","names":["wordBoundariesRegex","qs","React","useCallback","useEffect","useReducer","useRef","useState","AddNewRelation","ReactSelect","useFieldProps","useField","withCondition","useDebouncedCallback","useIgnoredEffect","useAuth","useConfig","useLocale","useTranslation","FieldDescription","FieldError","FieldLabel","fieldBaseClass","createRelationMap","findOptionsByValue","optionsReducer","MultiValueLabel","SingleValue","maxResultsPerRequest","baseClass","RelationshipFieldComponent","props","descriptionProps","errorProps","field","name","_path","pathFromProps","admin","allowCreate","className","description","isSortable","readOnly","readOnlyFromAdmin","sortOptions","style","width","hasMany","label","relationTo","required","labelProps","readOnlyFromTopLevelProps","validate","readOnlyFromProps","config","collections","routes","api","serverURL","i18n","t","permissions","code","locale","hasMultipleRelations","Array","isArray","lastFullyLoadedRelation","setLastFullyLoadedRelation","lastLoadedPage","setLastLoadedPage","errorLoading","setErrorLoading","search","setSearch","isLoading","setIsLoading","enableWordBoundarySearch","setEnableWordBoundarySearch","menuIsOpen","setMenuIsOpen","hasLoadedFirstPageRef","memoizedValidate","value","validationOptions","path","pathFromContext","readOnlyFromContext","filterOptions","formInitializing","formProcessing","initialValue","setValue","showError","options","dispatchOptions","valueRef","current","drawerIsOpen","setDrawerIsOpen","getResults","lastFullyLoadedRelationArg","lastLoadedPageArg","onSuccess","searchArg","sort","valueArg","lastFullyLoadedRelationToUse","relations","relationsToFetch","slice","resultsFetched","relationMap","reduce","priorRelation","relation","relationFilterOption","lastLoadedPageToUse","indexOf","Promise","resolve","collection","find","coll","slug","fieldToSearch","useAsTitle","fieldToSort","defaultSort","query","depth","draft","limit","page","where","and","id","not_in","push","like","response","fetch","body","stringify","credentials","headers","language","method","ok","data","json","prevState","nextPage","docs","length","type","status","ids","updateSearch","handleInputChange","Object","entries","idsToLoad","filter","optionGroup","option","in","isIdOnly","idOnly","exemptValues","onSave","args","collectionConfig","doc","filterOption","item","searchFilter","r","breakApartThreshold","string","indexOfSpace","test","valueToRender","_jsxs","Boolean","join","replace","_jsx","Label","components","CustomError","Error","backspaceRemovesValue","customProps","disableKeyDown","disableMouseDown","disabled","undefined","getOptionValue","isMulti","onChange","selected","map","onInputChange","newSearch","onMenuClose","onMenuOpen","onMenuScrollToBottom","Description","RelationshipField"],"sources":["../../../src/fields/Relationship/index.tsx"],"sourcesContent":["'use client'\nimport type { PaginatedDocs, RelationshipFieldProps, Where } from 'payload'\n\nimport { wordBoundariesRegex } from 'payload/shared'\nimport * as qs from 'qs-esm'\nimport React, { useCallback, useEffect, useReducer, useRef, useState } from 'react'\n\nimport type { DocumentDrawerProps } from '../../elements/DocumentDrawer/types.js'\nimport type { GetResults, Option, Value } from './types.js'\n\nimport { AddNewRelation } from '../../elements/AddNewRelation/index.js'\nimport { ReactSelect } from '../../elements/ReactSelect/index.js'\nimport { useFieldProps } from '../../forms/FieldPropsProvider/index.js'\nimport { useField } from '../../forms/useField/index.js'\nimport { withCondition } from '../../forms/withCondition/index.js'\nimport { useDebouncedCallback } from '../../hooks/useDebouncedCallback.js'\nimport { useIgnoredEffect } from '../../hooks/useIgnoredEffect.js'\nimport { useAuth } from '../../providers/Auth/index.js'\nimport { useConfig } from '../../providers/Config/index.js'\nimport { useLocale } from '../../providers/Locale/index.js'\nimport { useTranslation } from '../../providers/Translation/index.js'\nimport { FieldDescription } from '../FieldDescription/index.js'\nimport { FieldError } from '../FieldError/index.js'\nimport { FieldLabel } from '../FieldLabel/index.js'\nimport { fieldBaseClass } from '../shared/index.js'\nimport { createRelationMap } from './createRelationMap.js'\nimport { findOptionsByValue } from './findOptionsByValue.js'\nimport './index.scss'\nimport { optionsReducer } from './optionsReducer.js'\nimport { MultiValueLabel } from './select-components/MultiValueLabel/index.js'\nimport { SingleValue } from './select-components/SingleValue/index.js'\n\nconst maxResultsPerRequest = 10\n\nconst baseClass = 'relationship'\n\nconst RelationshipFieldComponent: React.FC<RelationshipFieldProps> = (props) => {\n const {\n descriptionProps,\n errorProps,\n field,\n field: {\n name,\n _path: pathFromProps,\n admin: {\n allowCreate = true,\n className,\n description,\n isSortable = true,\n readOnly: readOnlyFromAdmin,\n sortOptions,\n style,\n width,\n } = {},\n hasMany,\n label,\n relationTo,\n required,\n },\n labelProps,\n readOnly: readOnlyFromTopLevelProps,\n validate,\n } = props\n const readOnlyFromProps = readOnlyFromTopLevelProps || readOnlyFromAdmin\n\n const { config } = useConfig()\n\n const {\n collections,\n routes: { api },\n serverURL,\n } = config\n\n const { i18n, t } = useTranslation()\n const { permissions } = useAuth()\n const { code: locale } = useLocale()\n const hasMultipleRelations = Array.isArray(relationTo)\n const [lastFullyLoadedRelation, setLastFullyLoadedRelation] = useState(-1)\n const [lastLoadedPage, setLastLoadedPage] = useState<Record<string, number>>({})\n const [errorLoading, setErrorLoading] = useState('')\n const [search, setSearch] = useState('')\n const [isLoading, setIsLoading] = useState(false)\n const [enableWordBoundarySearch, setEnableWordBoundarySearch] = useState(false)\n const [menuIsOpen, setMenuIsOpen] = useState(false)\n const hasLoadedFirstPageRef = useRef(false)\n\n const memoizedValidate = useCallback(\n (value, validationOptions) => {\n if (typeof validate === 'function') {\n return validate(value, { ...validationOptions, required })\n }\n },\n [validate, required],\n )\n const { path: pathFromContext, readOnly: readOnlyFromContext } = useFieldProps()\n\n const {\n filterOptions,\n formInitializing,\n formProcessing,\n initialValue,\n path,\n setValue,\n showError,\n value,\n } = useField<Value | Value[]>({\n path: pathFromContext ?? pathFromProps ?? name,\n validate: memoizedValidate,\n })\n const [options, dispatchOptions] = useReducer(optionsReducer, [])\n\n const readOnly = readOnlyFromProps || readOnlyFromContext || formInitializing\n\n const valueRef = useRef(value)\n valueRef.current = value\n\n const [drawerIsOpen, setDrawerIsOpen] = useState(false)\n\n const getResults: GetResults = useCallback(\n async ({\n filterOptions,\n lastFullyLoadedRelation: lastFullyLoadedRelationArg,\n lastLoadedPage: lastLoadedPageArg,\n onSuccess,\n search: searchArg,\n sort,\n value: valueArg,\n }) => {\n if (!permissions) {\n return\n }\n const lastFullyLoadedRelationToUse =\n typeof lastFullyLoadedRelationArg !== 'undefined' ? lastFullyLoadedRelationArg : -1\n\n const relations = Array.isArray(relationTo) ? relationTo : [relationTo]\n const relationsToFetch =\n lastFullyLoadedRelationToUse === -1\n ? relations\n : relations.slice(lastFullyLoadedRelationToUse + 1)\n\n let resultsFetched = 0\n const relationMap = createRelationMap({\n hasMany,\n relationTo,\n value: valueArg,\n })\n\n if (!errorLoading) {\n await relationsToFetch.reduce(async (priorRelation, relation) => {\n const relationFilterOption = filterOptions?.[relation]\n\n let lastLoadedPageToUse\n if (search !== searchArg) {\n lastLoadedPageToUse = 1\n } else {\n lastLoadedPageToUse = lastLoadedPageArg[relation] + 1\n }\n await priorRelation\n\n if (relationFilterOption === false) {\n setLastFullyLoadedRelation(relations.indexOf(relation))\n return Promise.resolve()\n }\n\n if (resultsFetched < 10) {\n const collection = collections.find((coll) => coll.slug === relation)\n const fieldToSearch = collection?.admin?.useAsTitle || 'id'\n let fieldToSort = collection?.defaultSort || 'id'\n if (typeof sortOptions === 'string') {\n fieldToSort = sortOptions\n } else if (sortOptions?.[relation]) {\n fieldToSort = sortOptions[relation]\n }\n\n const query: {\n [key: string]: unknown\n where: Where\n } = {\n depth: 0,\n draft: true,\n limit: maxResultsPerRequest,\n locale,\n page: lastLoadedPageToUse,\n sort: fieldToSort,\n where: {\n and: [\n {\n id: {\n not_in: relationMap[relation],\n },\n },\n ],\n },\n }\n\n if (searchArg) {\n query.where.and.push({\n [fieldToSearch]: {\n like: searchArg,\n },\n })\n }\n\n if (relationFilterOption && typeof relationFilterOption !== 'boolean') {\n query.where.and.push(relationFilterOption)\n }\n\n const response = await fetch(`${serverURL}${api}/${relation}`, {\n body: qs.stringify(query),\n credentials: 'include',\n headers: {\n 'Accept-Language': i18n.language,\n 'Content-Type': 'application/x-www-form-urlencoded',\n 'X-HTTP-Method-Override': 'GET',\n },\n method: 'POST',\n })\n\n if (response.ok) {\n const data: PaginatedDocs<unknown> = await response.json()\n setLastLoadedPage((prevState) => {\n return {\n ...prevState,\n [relation]: lastLoadedPageToUse,\n }\n })\n\n if (!data.nextPage) {\n setLastFullyLoadedRelation(relations.indexOf(relation))\n }\n\n if (data.docs.length > 0) {\n resultsFetched += data.docs.length\n\n dispatchOptions({\n type: 'ADD',\n collection,\n // TODO: fix this\n // @ts-expect-error-next-line\n config,\n docs: data.docs,\n i18n,\n sort,\n })\n }\n } else if (response.status === 403) {\n setLastFullyLoadedRelation(relations.indexOf(relation))\n dispatchOptions({\n type: 'ADD',\n collection,\n // TODO: fix this\n // @ts-expect-error-next-line\n config,\n docs: [],\n i18n,\n ids: relationMap[relation],\n sort,\n })\n } else {\n setErrorLoading(t('error:unspecific'))\n }\n }\n }, Promise.resolve())\n\n if (typeof onSuccess === 'function') {\n onSuccess()\n }\n }\n },\n [\n permissions,\n relationTo,\n hasMany,\n errorLoading,\n search,\n collections,\n locale,\n serverURL,\n sortOptions,\n api,\n i18n,\n config,\n t,\n ],\n )\n\n const updateSearch = useDebouncedCallback((searchArg: string, valueArg: Value | Value[]) => {\n void getResults({\n filterOptions,\n lastLoadedPage: {},\n search: searchArg,\n sort: true,\n value: valueArg,\n })\n setSearch(searchArg)\n }, 300)\n\n const handleInputChange = useCallback(\n (searchArg: string, valueArg: Value | Value[]) => {\n if (search !== searchArg) {\n setLastLoadedPage({})\n updateSearch(searchArg, valueArg, searchArg !== '')\n }\n },\n [search, updateSearch],\n )\n\n // ///////////////////////////////////\n // Ensure we have an option for each value\n // ///////////////////////////////////\n\n useIgnoredEffect(\n () => {\n const relationMap = createRelationMap({\n hasMany,\n relationTo,\n value,\n })\n\n void Object.entries(relationMap).reduce(async (priorRelation, [relation, ids]) => {\n await priorRelation\n\n const idsToLoad = ids.filter((id) => {\n return !options.find((optionGroup) =>\n optionGroup?.options?.find(\n (option) => option.value === id && option.relationTo === relation,\n ),\n )\n })\n\n if (idsToLoad.length > 0) {\n const query = {\n depth: 0,\n draft: true,\n limit: idsToLoad.length,\n locale,\n where: {\n id: {\n in: idsToLoad,\n },\n },\n }\n\n if (!errorLoading) {\n const response = await fetch(`${serverURL}${api}/${relation}`, {\n body: qs.stringify(query),\n credentials: 'include',\n headers: {\n 'Accept-Language': i18n.language,\n 'Content-Type': 'application/x-www-form-urlencoded',\n 'X-HTTP-Method-Override': 'GET',\n },\n method: 'POST',\n })\n\n const collection = collections.find((coll) => coll.slug === relation)\n let docs = []\n\n if (response.ok) {\n const data = await response.json()\n docs = data.docs\n }\n\n dispatchOptions({\n type: 'ADD',\n collection,\n // TODO: fix this\n // @ts-expect-error-next-line\n config,\n docs,\n i18n,\n ids: idsToLoad,\n sort: true,\n })\n }\n }\n }, Promise.resolve())\n },\n [value],\n [\n options,\n hasMany,\n errorLoading,\n collections,\n hasMultipleRelations,\n serverURL,\n api,\n i18n,\n relationTo,\n locale,\n config,\n ],\n )\n\n // Determine if we should switch to word boundary search\n useEffect(() => {\n const relations = Array.isArray(relationTo) ? relationTo : [relationTo]\n const isIdOnly = relations.reduce((idOnly, relation) => {\n const collection = collections.find((coll) => coll.slug === relation)\n const fieldToSearch = collection?.admin?.useAsTitle || 'id'\n return fieldToSearch === 'id' && idOnly\n }, true)\n setEnableWordBoundarySearch(!isIdOnly)\n }, [relationTo, collections])\n\n // When (`relationTo` || `filterOptions` || `locale`) changes, reset component\n // Note - effect should not run on first run\n useIgnoredEffect(\n \n () => {\n // If the menu is open while filterOptions changes\n // due to latency of getFormState and fast clicking into this field,\n // re-fetch options\n if (hasLoadedFirstPageRef.current && menuIsOpen) {\n setIsLoading(true)\n void getResults({\n filterOptions,\n lastLoadedPage: {},\n onSuccess: () => {\n hasLoadedFirstPageRef.current = true\n setIsLoading(false)\n },\n value: valueRef.current,\n })\n }\n\n // If the menu is not open, still reset the field state\n // because we need to get new options next time the menu opens\n dispatchOptions({\n type: 'CLEAR',\n exemptValues: valueRef.current,\n })\n\n setLastFullyLoadedRelation(-1)\n setLastLoadedPage({})\n },\n [relationTo, filterOptions, locale, path, menuIsOpen],\n [getResults],\n )\n\n const onSave = useCallback<DocumentDrawerProps['onSave']>(\n (args) => {\n dispatchOptions({\n type: 'UPDATE',\n collection: args.collectionConfig,\n // TODO: fix this\n // @ts-expect-error-next-line\n config,\n doc: args.doc,\n i18n,\n })\n },\n [i18n, config],\n )\n\n const filterOption = useCallback((item: Option, searchFilter: string) => {\n if (!searchFilter) {\n return true\n }\n const r = wordBoundariesRegex(searchFilter || '')\n // breaking the labels to search into smaller parts increases performance\n const breakApartThreshold = 250\n let string = item.label\n // strings less than breakApartThreshold length won't be chunked\n while (string.length > breakApartThreshold) {\n // slicing by the next space after the length of the search input prevents slicing the string up by partial words\n const indexOfSpace = string.indexOf(' ', searchFilter.length)\n if (r.test(string.slice(0, indexOfSpace === -1 ? searchFilter.length : indexOfSpace + 1))) {\n return true\n }\n string = string.slice(indexOfSpace === -1 ? searchFilter.length : indexOfSpace + 1)\n }\n return r.test(string.slice(-breakApartThreshold))\n }, [])\n\n const valueToRender = findOptionsByValue({ options, value })\n\n if (!Array.isArray(valueToRender) && valueToRender?.value === 'null') {\n valueToRender.value = null\n }\n\n return (\n <div\n className={[\n fieldBaseClass,\n baseClass,\n className,\n showError && 'error',\n errorLoading && 'error-loading',\n readOnly && `${baseClass}--read-only`,\n !readOnly && allowCreate && `${baseClass}--allow-create`,\n ]\n .filter(Boolean)\n .join(' ')}\n id={`field-${path.replace(/\\./g, '__')}`}\n style={{\n ...style,\n width,\n }}\n >\n <FieldLabel\n field={field}\n Label={field?.admin?.components?.Label}\n label={label}\n required={required}\n {...(labelProps || {})}\n />\n <div className={`${fieldBaseClass}__wrap`}>\n <FieldError\n CustomError={field?.admin?.components?.Error}\n field={field}\n path={path}\n {...(errorProps || {})}\n />\n {!errorLoading && (\n <div className={`${baseClass}__wrap`}>\n <ReactSelect\n backspaceRemovesValue={!drawerIsOpen}\n components={{\n MultiValueLabel,\n SingleValue,\n }}\n customProps={{\n disableKeyDown: drawerIsOpen,\n disableMouseDown: drawerIsOpen,\n onSave,\n setDrawerIsOpen,\n }}\n disabled={readOnly || formProcessing || drawerIsOpen}\n filterOption={enableWordBoundarySearch ? filterOption : undefined}\n getOptionValue={(option) => {\n if (!option) {\n return undefined\n }\n return hasMany && Array.isArray(relationTo)\n ? `${option.relationTo}_${option.value}`\n : option.value\n }}\n isLoading={isLoading}\n isMulti={hasMany}\n isSortable={isSortable}\n onChange={\n !readOnly\n ? (selected) => {\n if (selected === null) {\n setValue(hasMany ? [] : null)\n } else if (hasMany && Array.isArray(selected)) {\n setValue(\n selected\n ? selected.map((option) => {\n if (hasMultipleRelations) {\n return {\n relationTo: option.relationTo,\n value: option.value,\n }\n }\n\n return option.value\n })\n : null,\n )\n } else if (hasMultipleRelations && !Array.isArray(selected)) {\n setValue({\n relationTo: selected.relationTo,\n value: selected.value,\n })\n } else if (!Array.isArray(selected)) {\n setValue(selected.value)\n }\n }\n : undefined\n }\n onInputChange={(newSearch) => handleInputChange(newSearch, value)}\n onMenuClose={() => {\n setMenuIsOpen(false)\n }}\n onMenuOpen={() => {\n setMenuIsOpen(true)\n\n if (!hasLoadedFirstPageRef.current) {\n setIsLoading(true)\n void getResults({\n filterOptions,\n lastLoadedPage: {},\n onSuccess: () => {\n hasLoadedFirstPageRef.current = true\n setIsLoading(false)\n },\n value: initialValue,\n })\n }\n }}\n onMenuScrollToBottom={() => {\n void getResults({\n filterOptions,\n lastFullyLoadedRelation,\n lastLoadedPage,\n search,\n sort: false,\n value: initialValue,\n })\n }}\n options={options}\n showError={showError}\n value={valueToRender ?? null}\n />\n {!readOnly && allowCreate && (\n <AddNewRelation\n hasMany={hasMany}\n path={path}\n relationTo={relationTo}\n setValue={setValue}\n value={value}\n />\n )}\n </div>\n )}\n {errorLoading && <div className={`${baseClass}__error-loading`}>{errorLoading}</div>}\n <FieldDescription\n Description={field?.admin?.components?.Description}\n description={description}\n field={field}\n {...(descriptionProps || {})}\n />\n </div>\n </div>\n )\n}\n\nexport const RelationshipField = withCondition(RelationshipFieldComponent)\n"],"mappings":"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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"optionsReducer.d.ts","sourceRoot":"","sources":["../../../src/fields/Relationship/optionsReducer.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAU,WAAW,EAAE,MAAM,YAAY,CAAA;AAyB7D,eAAO,MAAM,cAAc,UAAW,WAAW,EAAE,UAAU,MAAM,KAAG,WAAW,EAmGhF,CAAA"}
1
+ {"version":3,"file":"optionsReducer.d.ts","sourceRoot":"","sources":["../../../src/fields/Relationship/optionsReducer.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAU,WAAW,EAAE,MAAM,YAAY,CAAA;AAyB7D,eAAO,MAAM,cAAc,UAAW,WAAW,EAAE,UAAU,MAAM,KAAG,WAAW,EAyHhF,CAAA"}
@@ -21,7 +21,20 @@ export const optionsReducer = (state, action) => {
21
21
  switch (action.type) {
22
22
  case 'CLEAR':
23
23
  {
24
- return [];
24
+ const exemptValues = Array.isArray(action.exemptValues) ? action.exemptValues : [action.exemptValues];
25
+ const clearedStateWithExemptValues = state.filter(optionGroup => {
26
+ const clearedOptions = optionGroup.options.filter(option => {
27
+ if (exemptValues) {
28
+ return exemptValues.some(exemptValue => {
29
+ return option.value === (typeof exemptValue === 'object' ? exemptValue.value : exemptValue);
30
+ });
31
+ }
32
+ return false;
33
+ });
34
+ optionGroup.options = clearedOptions;
35
+ return clearedOptions.length > 0;
36
+ });
37
+ return clearedStateWithExemptValues;
25
38
  }
26
39
  case 'UPDATE':
27
40
  {
@@ -1 +1 @@
1
- {"version":3,"file":"optionsReducer.js","names":["getTranslation","formatDocTitle","reduceToIDs","options","reduce","ids","option","id","value","relationTo","sortOptions","sort","a","b","label","localeCompare","optionsReducer","state","action","type","collection","config","doc","i18n","relation","slug","newOptions","docTitle","collectionConfig","data","dateFormat","admin","fallback","t","foundOptionGroup","find","optionGroup","labels","plural","foundOption","docs","loadedIDs","optionsToAddTo","newSubOptions","docSubOptions","filter","item","length","push","forEach","subOptions"],"sources":["../../../src/fields/Relationship/optionsReducer.ts"],"sourcesContent":["'use client'\nimport { getTranslation } from '@payloadcms/translations'\n\nimport type { Action, Option, OptionGroup } from './types.js'\n\nimport { formatDocTitle } from '../../utilities/formatDocTitle.js'\n\nconst reduceToIDs = (options) =>\n options.reduce((ids, option) => {\n if (option.options) {\n return [...ids, ...reduceToIDs(option.options)]\n }\n\n return [...ids, { id: option.value, relationTo: option.relationTo }]\n }, [])\n\nconst sortOptions = (options: Option[]): Option[] =>\n options.sort((a: Option, b: Option) => {\n if (\n typeof a?.label?.localeCompare === 'function' &&\n typeof b?.label?.localeCompare === 'function'\n ) {\n return a.label.localeCompare(b.label)\n }\n\n return 0\n })\n\nexport const optionsReducer = (state: OptionGroup[], action: Action): OptionGroup[] => {\n switch (action.type) {\n case 'CLEAR': {\n return []\n }\n\n case 'UPDATE': {\n const { collection, config, doc, i18n } = action\n const relation = collection.slug\n const newOptions = [...state]\n\n const docTitle = formatDocTitle({\n collectionConfig: collection,\n data: doc,\n dateFormat: config.admin.dateFormat,\n fallback: `${i18n.t('general:untitled')} - ID: ${doc.id}`,\n i18n,\n })\n\n const foundOptionGroup = newOptions.find(\n (optionGroup) => optionGroup.label === collection.labels.plural,\n )\n const foundOption = foundOptionGroup?.options?.find((option) => option.value === doc.id)\n\n if (foundOption) {\n foundOption.label = docTitle\n foundOption.relationTo = relation\n }\n\n return newOptions\n }\n\n case 'ADD': {\n const { collection, config, docs, i18n, ids = [], sort } = action\n const relation = collection.slug\n const loadedIDs = reduceToIDs(state)\n const newOptions = [...state]\n const optionsToAddTo = newOptions.find(\n (optionGroup) => optionGroup.label === collection.labels.plural,\n )\n const newSubOptions = docs.reduce((docSubOptions, doc) => {\n if (\n loadedIDs.filter((item) => item.id === doc.id && item.relationTo === relation).length ===\n 0\n ) {\n loadedIDs.push({ id: doc.id, relationTo: relation })\n\n const docTitle = formatDocTitle({\n collectionConfig: collection,\n data: doc,\n dateFormat: config.admin.dateFormat,\n fallback: `${i18n.t('general:untitled')} - ID: ${doc.id}`,\n i18n,\n })\n\n return [\n ...docSubOptions,\n {\n label: docTitle,\n relationTo: relation,\n value: doc.id,\n },\n ]\n }\n\n return docSubOptions\n }, [])\n\n ids.forEach((id) => {\n if (\n loadedIDs.filter((item) => item.id === id && item.relationTo === relation).length === 0\n ) {\n loadedIDs.push({ id, relationTo: relation })\n newSubOptions.push({\n label: `${i18n.t('general:untitled')} - ID: ${id}`,\n relationTo: relation,\n value: id,\n })\n }\n })\n\n if (optionsToAddTo) {\n const subOptions = [...optionsToAddTo.options, ...newSubOptions]\n\n optionsToAddTo.options = sort ? sortOptions(subOptions) : subOptions\n } else {\n newOptions.push({\n label: getTranslation(collection.labels.plural, i18n),\n options: sort ? sortOptions(newSubOptions) : newSubOptions,\n })\n }\n\n return newOptions\n }\n\n default: {\n return state\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"optionsReducer.js","names":["getTranslation","formatDocTitle","reduceToIDs","options","reduce","ids","option","id","value","relationTo","sortOptions","sort","a","b","label","localeCompare","optionsReducer","state","action","type","exemptValues","Array","isArray","clearedStateWithExemptValues","filter","optionGroup","clearedOptions","some","exemptValue","length","collection","config","doc","i18n","relation","slug","newOptions","docTitle","collectionConfig","data","dateFormat","admin","fallback","t","foundOptionGroup","find","labels","plural","foundOption","docs","loadedIDs","optionsToAddTo","newSubOptions","docSubOptions","item","push","forEach","subOptions"],"sources":["../../../src/fields/Relationship/optionsReducer.ts"],"sourcesContent":["'use client'\nimport { getTranslation } from '@payloadcms/translations'\n\nimport type { Action, Option, OptionGroup } from './types.js'\n\nimport { formatDocTitle } from '../../utilities/formatDocTitle.js'\n\nconst reduceToIDs = (options) =>\n options.reduce((ids, option) => {\n if (option.options) {\n return [...ids, ...reduceToIDs(option.options)]\n }\n\n return [...ids, { id: option.value, relationTo: option.relationTo }]\n }, [])\n\nconst sortOptions = (options: Option[]): Option[] =>\n options.sort((a: Option, b: Option) => {\n if (\n typeof a?.label?.localeCompare === 'function' &&\n typeof b?.label?.localeCompare === 'function'\n ) {\n return a.label.localeCompare(b.label)\n }\n\n return 0\n })\n\nexport const optionsReducer = (state: OptionGroup[], action: Action): OptionGroup[] => {\n switch (action.type) {\n case 'CLEAR': {\n const exemptValues = Array.isArray(action.exemptValues)\n ? action.exemptValues\n : [action.exemptValues]\n\n const clearedStateWithExemptValues = state.filter((optionGroup) => {\n const clearedOptions = optionGroup.options.filter((option) => {\n if (exemptValues) {\n return exemptValues.some((exemptValue) => {\n return (\n option.value === (typeof exemptValue === 'object' ? exemptValue.value : exemptValue)\n )\n })\n }\n\n return false\n })\n\n optionGroup.options = clearedOptions\n\n return clearedOptions.length > 0\n })\n\n return clearedStateWithExemptValues\n }\n\n case 'UPDATE': {\n const { collection, config, doc, i18n } = action\n const relation = collection.slug\n const newOptions = [...state]\n\n const docTitle = formatDocTitle({\n collectionConfig: collection,\n data: doc,\n dateFormat: config.admin.dateFormat,\n fallback: `${i18n.t('general:untitled')} - ID: ${doc.id}`,\n i18n,\n })\n\n const foundOptionGroup = newOptions.find(\n (optionGroup) => optionGroup.label === collection.labels.plural,\n )\n const foundOption = foundOptionGroup?.options?.find((option) => option.value === doc.id)\n\n if (foundOption) {\n foundOption.label = docTitle\n foundOption.relationTo = relation\n }\n\n return newOptions\n }\n\n case 'ADD': {\n const { collection, config, docs, i18n, ids = [], sort } = action\n const relation = collection.slug\n const loadedIDs = reduceToIDs(state)\n const newOptions = [...state]\n const optionsToAddTo = newOptions.find(\n (optionGroup) => optionGroup.label === collection.labels.plural,\n )\n const newSubOptions = docs.reduce((docSubOptions, doc) => {\n if (\n loadedIDs.filter((item) => item.id === doc.id && item.relationTo === relation).length ===\n 0\n ) {\n loadedIDs.push({ id: doc.id, relationTo: relation })\n\n const docTitle = formatDocTitle({\n collectionConfig: collection,\n data: doc,\n dateFormat: config.admin.dateFormat,\n fallback: `${i18n.t('general:untitled')} - ID: ${doc.id}`,\n i18n,\n })\n\n return [\n ...docSubOptions,\n {\n label: docTitle,\n relationTo: relation,\n value: doc.id,\n },\n ]\n }\n\n return docSubOptions\n }, [])\n\n ids.forEach((id) => {\n if (\n loadedIDs.filter((item) => item.id === id && item.relationTo === relation).length === 0\n ) {\n loadedIDs.push({ id, relationTo: relation })\n newSubOptions.push({\n label: `${i18n.t('general:untitled')} - ID: ${id}`,\n relationTo: relation,\n value: id,\n })\n }\n })\n\n if (optionsToAddTo) {\n const subOptions = [...optionsToAddTo.options, ...newSubOptions]\n\n optionsToAddTo.options = sort ? sortOptions(subOptions) : subOptions\n } else {\n newOptions.push({\n label: getTranslation(collection.labels.plural, i18n),\n options: sort ? sortOptions(newSubOptions) : newSubOptions,\n })\n }\n\n return newOptions\n }\n\n default: {\n return state\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1,5 +1,5 @@
1
1
  import type { I18nClient } from '@payloadcms/translations';
2
- import type { ClientCollectionConfig, SanitizedConfig } from 'payload';
2
+ import type { ClientCollectionConfig, FilterOptionsResult, SanitizedConfig } from 'payload';
3
3
  export type Option = {
4
4
  label: string;
5
5
  options?: Option[];
@@ -16,6 +16,7 @@ export type ValueWithRelation = {
16
16
  };
17
17
  export type Value = number | string | ValueWithRelation;
18
18
  type CLEAR = {
19
+ exemptValues?: Value | Value[];
19
20
  type: 'CLEAR';
20
21
  };
21
22
  type UPDATE = {
@@ -36,6 +37,7 @@ type ADD = {
36
37
  };
37
38
  export type Action = ADD | CLEAR | UPDATE;
38
39
  export type GetResults = (args: {
40
+ filterOptions?: FilterOptionsResult;
39
41
  lastFullyLoadedRelation?: number;
40
42
  lastLoadedPage: Record<string, number>;
41
43
  onSuccess?: () => void;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/fields/Relationship/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAA;AAC1D,OAAO,KAAK,EAAE,sBAAsB,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAEtE,MAAM,MAAM,MAAM,GAAG;IACnB,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;IAClB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,KAAK,EAAE,MAAM,GAAG,MAAM,CAAA;CACvB,CAAA;AAED,MAAM,MAAM,WAAW,GAAG;IACxB,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,EAAE,CAAA;CAClB,CAAA;AAED,MAAM,MAAM,iBAAiB,GAAG;IAC9B,UAAU,EAAE,MAAM,CAAA;IAClB,KAAK,EAAE,MAAM,GAAG,MAAM,CAAA;CACvB,CAAA;AAED,MAAM,MAAM,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,iBAAiB,CAAA;AAEvD,KAAK,KAAK,GAAG;IACX,IAAI,EAAE,OAAO,CAAA;CACd,CAAA;AAED,KAAK,MAAM,GAAG;IACZ,UAAU,EAAE,sBAAsB,CAAA;IAClC,MAAM,EAAE,eAAe,CAAA;IACvB,GAAG,EAAE,GAAG,CAAA;IACR,IAAI,EAAE,UAAU,CAAA;IAChB,IAAI,EAAE,QAAQ,CAAA;CACf,CAAA;AAED,KAAK,GAAG,GAAG;IACT,UAAU,EAAE,sBAAsB,CAAA;IAClC,MAAM,EAAE,eAAe,CAAA;IACvB,IAAI,EAAE,GAAG,EAAE,CAAA;IACX,IAAI,EAAE,UAAU,CAAA;IAChB,GAAG,CAAC,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAA;IACzB,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,IAAI,EAAE,KAAK,CAAA;CACZ,CAAA;AAED,MAAM,MAAM,MAAM,GAAG,GAAG,GAAG,KAAK,GAAG,MAAM,CAAA;AAEzC,MAAM,MAAM,UAAU,GAAG,CAAC,IAAI,EAAE;IAC9B,uBAAuB,CAAC,EAAE,MAAM,CAAA;IAChC,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACtC,SAAS,CAAC,EAAE,MAAM,IAAI,CAAA;IACtB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,KAAK,CAAC,EAAE,KAAK,GAAG,KAAK,EAAE,CAAA;CACxB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/fields/Relationship/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAA;AAC1D,OAAO,KAAK,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAE3F,MAAM,MAAM,MAAM,GAAG;IACnB,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;IAClB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,KAAK,EAAE,MAAM,GAAG,MAAM,CAAA;CACvB,CAAA;AAED,MAAM,MAAM,WAAW,GAAG;IACxB,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,EAAE,CAAA;CAClB,CAAA;AAED,MAAM,MAAM,iBAAiB,GAAG;IAC9B,UAAU,EAAE,MAAM,CAAA;IAClB,KAAK,EAAE,MAAM,GAAG,MAAM,CAAA;CACvB,CAAA;AAED,MAAM,MAAM,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,iBAAiB,CAAA;AAEvD,KAAK,KAAK,GAAG;IACX,YAAY,CAAC,EAAE,KAAK,GAAG,KAAK,EAAE,CAAA;IAC9B,IAAI,EAAE,OAAO,CAAA;CACd,CAAA;AAED,KAAK,MAAM,GAAG;IACZ,UAAU,EAAE,sBAAsB,CAAA;IAClC,MAAM,EAAE,eAAe,CAAA;IACvB,GAAG,EAAE,GAAG,CAAA;IACR,IAAI,EAAE,UAAU,CAAA;IAChB,IAAI,EAAE,QAAQ,CAAA;CACf,CAAA;AAED,KAAK,GAAG,GAAG;IACT,UAAU,EAAE,sBAAsB,CAAA;IAClC,MAAM,EAAE,eAAe,CAAA;IACvB,IAAI,EAAE,GAAG,EAAE,CAAA;IACX,IAAI,EAAE,UAAU,CAAA;IAChB,GAAG,CAAC,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAA;IACzB,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,IAAI,EAAE,KAAK,CAAA;CACZ,CAAA;AAED,MAAM,MAAM,MAAM,GAAG,GAAG,GAAG,KAAK,GAAG,MAAM,CAAA;AAEzC,MAAM,MAAM,UAAU,GAAG,CAAC,IAAI,EAAE;IAC9B,aAAa,CAAC,EAAE,mBAAmB,CAAA;IACnC,uBAAuB,CAAC,EAAE,MAAM,CAAA;IAChC,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACtC,SAAS,CAAC,EAAE,MAAM,IAAI,CAAA;IACtB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,KAAK,CAAC,EAAE,KAAK,GAAG,KAAK,EAAE,CAAA;CACxB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","names":[],"sources":["../../../src/fields/Relationship/types.ts"],"sourcesContent":["import type { I18nClient } from '@payloadcms/translations'\nimport type { ClientCollectionConfig, SanitizedConfig } from 'payload'\n\nexport type Option = {\n label: string\n options?: Option[]\n relationTo?: string\n value: number | string\n}\n\nexport type OptionGroup = {\n label: string\n options: Option[]\n}\n\nexport type ValueWithRelation = {\n relationTo: string\n value: number | string\n}\n\nexport type Value = number | string | ValueWithRelation\n\ntype CLEAR = {\n type: 'CLEAR'\n}\n\ntype UPDATE = {\n collection: ClientCollectionConfig\n config: SanitizedConfig\n doc: any\n i18n: I18nClient\n type: 'UPDATE'\n}\n\ntype ADD = {\n collection: ClientCollectionConfig\n config: SanitizedConfig\n docs: any[]\n i18n: I18nClient\n ids?: (number | string)[]\n sort?: boolean\n type: 'ADD'\n}\n\nexport type Action = ADD | CLEAR | UPDATE\n\nexport type GetResults = (args: {\n lastFullyLoadedRelation?: number\n lastLoadedPage: Record<string, number>\n onSuccess?: () => void\n search?: string\n sort?: boolean\n value?: Value | Value[]\n}) => Promise<void>\n"],"mappings":"AA8CA","ignoreList":[]}
1
+ {"version":3,"file":"types.js","names":[],"sources":["../../../src/fields/Relationship/types.ts"],"sourcesContent":["import type { I18nClient } from '@payloadcms/translations'\nimport type { ClientCollectionConfig, FilterOptionsResult, SanitizedConfig } from 'payload'\n\nexport type Option = {\n label: string\n options?: Option[]\n relationTo?: string\n value: number | string\n}\n\nexport type OptionGroup = {\n label: string\n options: Option[]\n}\n\nexport type ValueWithRelation = {\n relationTo: string\n value: number | string\n}\n\nexport type Value = number | string | ValueWithRelation\n\ntype CLEAR = {\n exemptValues?: Value | Value[]\n type: 'CLEAR'\n}\n\ntype UPDATE = {\n collection: ClientCollectionConfig\n config: SanitizedConfig\n doc: any\n i18n: I18nClient\n type: 'UPDATE'\n}\n\ntype ADD = {\n collection: ClientCollectionConfig\n config: SanitizedConfig\n docs: any[]\n i18n: I18nClient\n ids?: (number | string)[]\n sort?: boolean\n type: 'ADD'\n}\n\nexport type Action = ADD | CLEAR | UPDATE\n\nexport type GetResults = (args: {\n filterOptions?: FilterOptionsResult\n lastFullyLoadedRelation?: number\n lastLoadedPage: Record<string, number>\n onSuccess?: () => void\n search?: string\n sort?: boolean\n value?: Value | Value[]\n}) => Promise<void>\n"],"mappings":"AA+CA","ignoreList":[]}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Allows for a `useEffect` hook to be precisely triggered based on whether a only _subset_ of its dependencies have changed, as opposed to all of them. This is useful if you have a list of dependencies that change often, but need to scope your effect's logic to only explicit dependencies within that list.
3
+ * @constructor
4
+ * @param {React.EffectCallback} effect - The effect to run
5
+ * @param {React.DependencyList} deps - Dependencies that should trigger the effect
6
+ * @param {React.DependencyList} ignoredDeps - Dependencies that should _not_ trigger the effect
7
+ * @param {Object} options - Additional options to configure the hook
8
+ * @param {boolean} options.runOnFirstRender - Whether the effect should run on the first render
9
+ * @example
10
+ * useIgnoredEffect(() => {
11
+ * console.log('This will run when `foo` changes, but not when `bar` changes')
12
+ * }, [foo], [bar])
13
+ */
14
+ export declare function useIgnoredEffect(effect: React.EffectCallback, deps: React.DependencyList, ignoredDeps: React.DependencyList, options?: {
15
+ runOnFirstRender?: boolean;
16
+ }): void;
17
+ //# sourceMappingURL=useIgnoredEffect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useIgnoredEffect.d.ts","sourceRoot":"","sources":["../../src/hooks/useIgnoredEffect.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;GAYG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,KAAK,CAAC,cAAc,EAC5B,IAAI,EAAE,KAAK,CAAC,cAAc,EAC1B,WAAW,EAAE,KAAK,CAAC,cAAc,EACjC,OAAO,CAAC,EAAE;IAAE,gBAAgB,CAAC,EAAE,OAAO,CAAA;CAAE,QAoBzC"}
@@ -0,0 +1,28 @@
1
+ import { dequal } from 'dequal/lite';
2
+ import { useEffect, useRef } from 'react';
3
+ /**
4
+ * Allows for a `useEffect` hook to be precisely triggered based on whether a only _subset_ of its dependencies have changed, as opposed to all of them. This is useful if you have a list of dependencies that change often, but need to scope your effect's logic to only explicit dependencies within that list.
5
+ * @constructor
6
+ * @param {React.EffectCallback} effect - The effect to run
7
+ * @param {React.DependencyList} deps - Dependencies that should trigger the effect
8
+ * @param {React.DependencyList} ignoredDeps - Dependencies that should _not_ trigger the effect
9
+ * @param {Object} options - Additional options to configure the hook
10
+ * @param {boolean} options.runOnFirstRender - Whether the effect should run on the first render
11
+ * @example
12
+ * useIgnoredEffect(() => {
13
+ * console.log('This will run when `foo` changes, but not when `bar` changes')
14
+ * }, [foo], [bar])
15
+ */
16
+ export function useIgnoredEffect(effect, deps, ignoredDeps, options) {
17
+ const hasInitialized = useRef(typeof options?.runOnFirstRender !== 'undefined' ? Boolean(!options?.runOnFirstRender) : false);
18
+ const prevDeps = useRef(deps);
19
+ useEffect(() => {
20
+ const depsHaveChanged = deps.some((dep, index) => !ignoredDeps.includes(dep) && !dequal(dep, prevDeps.current[index]));
21
+ if (depsHaveChanged || !hasInitialized.current) {
22
+ effect();
23
+ }
24
+ prevDeps.current = deps;
25
+ hasInitialized.current = true;
26
+ }, deps);
27
+ }
28
+ //# sourceMappingURL=useIgnoredEffect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useIgnoredEffect.js","names":["dequal","useEffect","useRef","useIgnoredEffect","effect","deps","ignoredDeps","options","hasInitialized","runOnFirstRender","Boolean","prevDeps","depsHaveChanged","some","dep","index","includes","current"],"sources":["../../src/hooks/useIgnoredEffect.ts"],"sourcesContent":["import { dequal } from 'dequal/lite'\nimport { useEffect, useRef } from 'react'\n\n/**\n * Allows for a `useEffect` hook to be precisely triggered based on whether a only _subset_ of its dependencies have changed, as opposed to all of them. This is useful if you have a list of dependencies that change often, but need to scope your effect's logic to only explicit dependencies within that list.\n * @constructor\n * @param {React.EffectCallback} effect - The effect to run\n * @param {React.DependencyList} deps - Dependencies that should trigger the effect\n * @param {React.DependencyList} ignoredDeps - Dependencies that should _not_ trigger the effect\n * @param {Object} options - Additional options to configure the hook\n * @param {boolean} options.runOnFirstRender - Whether the effect should run on the first render\n * @example\n * useIgnoredEffect(() => {\n * console.log('This will run when `foo` changes, but not when `bar` changes')\n * }, [foo], [bar])\n */\nexport function useIgnoredEffect(\n effect: React.EffectCallback,\n deps: React.DependencyList,\n ignoredDeps: React.DependencyList,\n options?: { runOnFirstRender?: boolean },\n) {\n const hasInitialized = useRef(\n typeof options?.runOnFirstRender !== 'undefined' ? Boolean(!options?.runOnFirstRender) : false,\n )\n\n const prevDeps = useRef(deps)\n\n useEffect(() => {\n const depsHaveChanged = deps.some(\n (dep, index) => !ignoredDeps.includes(dep) && !dequal(dep, prevDeps.current[index]),\n )\n\n if (depsHaveChanged || !hasInitialized.current) {\n effect()\n }\n\n prevDeps.current = deps\n hasInitialized.current = true\n }, deps)\n}\n"],"mappings":"AAAA,SAASA,MAAM,QAAQ;AACvB,SAASC,SAAS,EAAEC,MAAM,QAAQ;AAElC;;;;;;;;;;;;;AAaA,OAAO,SAASC,iBACdC,MAA4B,EAC5BC,IAA0B,EAC1BC,WAAiC,EACjCC,OAAwC;EAExC,MAAMC,cAAA,GAAiBN,MAAA,CACrB,OAAOK,OAAA,EAASE,gBAAA,KAAqB,cAAcC,OAAA,CAAQ,CAACH,OAAA,EAASE,gBAAA,IAAoB;EAG3F,MAAME,QAAA,GAAWT,MAAA,CAAOG,IAAA;EAExBJ,SAAA,CAAU;IACR,MAAMW,eAAA,GAAkBP,IAAA,CAAKQ,IAAI,CAC/B,CAACC,GAAA,EAAKC,KAAA,KAAU,CAACT,WAAA,CAAYU,QAAQ,CAACF,GAAA,KAAQ,CAACd,MAAA,CAAOc,GAAA,EAAKH,QAAA,CAASM,OAAO,CAACF,KAAA,CAAM;IAGpF,IAAIH,eAAA,IAAmB,CAACJ,cAAA,CAAeS,OAAO,EAAE;MAC9Cb,MAAA;IACF;IAEAO,QAAA,CAASM,OAAO,GAAGZ,IAAA;IACnBG,cAAA,CAAeS,OAAO,GAAG;EAC3B,GAAGZ,IAAA;AACL","ignoreList":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@payloadcms/ui",
3
- "version": "3.0.0-beta.98",
3
+ "version": "3.0.0-beta.99",
4
4
  "homepage": "https://payloadcms.com",
5
5
  "repository": {
6
6
  "type": "git",
@@ -109,7 +109,7 @@
109
109
  "ts-essentials": "7.0.3",
110
110
  "use-context-selector": "2.0.0",
111
111
  "uuid": "10.0.0",
112
- "@payloadcms/translations": "3.0.0-beta.98"
112
+ "@payloadcms/translations": "3.0.0-beta.99"
113
113
  },
114
114
  "devDependencies": {
115
115
  "@babel/cli": "^7.24.5",
@@ -127,14 +127,14 @@
127
127
  "esbuild": "0.23.1",
128
128
  "esbuild-sass-plugin": "3.3.1",
129
129
  "eslint-plugin-react-compiler": "0.0.0-experimental-72f06b2-20240822",
130
- "payload": "3.0.0-beta.98",
131
- "@payloadcms/eslint-config": "3.0.0-beta.97"
130
+ "@payloadcms/eslint-config": "3.0.0-beta.97",
131
+ "payload": "3.0.0-beta.99"
132
132
  },
133
133
  "peerDependencies": {
134
134
  "next": "^15.0.0-canary.104",
135
135
  "react": "^19.0.0 || ^19.0.0-rc-06d0b89e-20240801",
136
136
  "react-dom": "^19.0.0 || ^19.0.0-rc-06d0b89e-20240801",
137
- "payload": "3.0.0-beta.98"
137
+ "payload": "3.0.0-beta.99"
138
138
  },
139
139
  "engines": {
140
140
  "node": "^18.20.2 || >=20.9.0"