@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.
- package/dist/exports/client/index.js +7 -7
- package/dist/exports/client/index.js.map +4 -4
- package/dist/fields/Relationship/index.d.ts.map +1 -1
- package/dist/fields/Relationship/index.js +20 -15
- package/dist/fields/Relationship/index.js.map +1 -1
- package/dist/fields/Relationship/optionsReducer.d.ts.map +1 -1
- package/dist/fields/Relationship/optionsReducer.js +14 -1
- package/dist/fields/Relationship/optionsReducer.js.map +1 -1
- package/dist/fields/Relationship/types.d.ts +3 -1
- package/dist/fields/Relationship/types.d.ts.map +1 -1
- package/dist/fields/Relationship/types.js.map +1 -1
- package/dist/hooks/useIgnoredEffect.d.ts +17 -0
- package/dist/hooks/useIgnoredEffect.d.ts.map +1 -0
- package/dist/hooks/useIgnoredEffect.js +28 -0
- package/dist/hooks/useIgnoredEffect.js.map +1 -0
- package/package.json +5 -5
|
@@ -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;
|
|
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 =
|
|
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 =
|
|
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,
|
|
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
|
-
|
|
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
|
-
}, [
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
460
|
+
setMenuIsOpen(false);
|
|
458
461
|
},
|
|
459
462
|
onMenuOpen: () => {
|
|
460
|
-
|
|
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,
|
|
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
|
-
|
|
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","
|
|
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;
|
|
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":"
|
|
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.
|
|
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.
|
|
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
|
-
"
|
|
131
|
-
"
|
|
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.
|
|
137
|
+
"payload": "3.0.0-beta.99"
|
|
138
138
|
},
|
|
139
139
|
"engines": {
|
|
140
140
|
"node": "^18.20.2 || >=20.9.0"
|