@payloadcms/ui 3.0.0-beta.37 → 3.0.0-beta.39

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (176) hide show
  1. package/dist/elements/DocumentFields/index.d.ts.map +1 -1
  2. package/dist/elements/DocumentFields/index.js +2 -0
  3. package/dist/elements/DocumentFields/index.js.map +1 -1
  4. package/dist/elements/DocumentHeader/Tabs/Tab/index.scss +3 -1
  5. package/dist/elements/DocumentHeader/Tabs/tabs/VersionsPill/index.d.ts.map +1 -1
  6. package/dist/elements/DocumentHeader/Tabs/tabs/VersionsPill/index.js +14 -8
  7. package/dist/elements/DocumentHeader/Tabs/tabs/VersionsPill/index.js.map +1 -1
  8. package/dist/elements/ReactSelect/Input/index.d.ts +5 -0
  9. package/dist/elements/ReactSelect/Input/index.d.ts.map +1 -0
  10. package/dist/elements/ReactSelect/Input/index.js +17 -0
  11. package/dist/elements/ReactSelect/Input/index.js.map +1 -0
  12. package/dist/elements/ReactSelect/MultiValue/index.d.ts.map +1 -1
  13. package/dist/elements/ReactSelect/MultiValue/index.js +7 -5
  14. package/dist/elements/ReactSelect/MultiValue/index.js.map +1 -1
  15. package/dist/elements/ReactSelect/index.d.ts.map +1 -1
  16. package/dist/elements/ReactSelect/index.js +17 -1
  17. package/dist/elements/ReactSelect/index.js.map +1 -1
  18. package/dist/elements/RenderTitle/index.d.ts.map +1 -1
  19. package/dist/elements/RenderTitle/index.js +12 -7
  20. package/dist/elements/RenderTitle/index.js.map +1 -1
  21. package/dist/elements/Table/DefaultCell/fields/Relationship/index.js +1 -1
  22. package/dist/elements/Table/DefaultCell/fields/Relationship/index.js.map +1 -1
  23. package/dist/elements/WhereBuilder/Condition/Relationship/index.d.ts.map +1 -1
  24. package/dist/elements/WhereBuilder/Condition/Relationship/index.js +104 -72
  25. package/dist/elements/WhereBuilder/Condition/Relationship/index.js.map +1 -1
  26. package/dist/elements/WhereBuilder/Condition/index.js +3 -3
  27. package/dist/elements/WhereBuilder/Condition/index.js.map +1 -1
  28. package/dist/elements/WhereBuilder/index.d.ts.map +1 -1
  29. package/dist/elements/WhereBuilder/index.js +49 -49
  30. package/dist/elements/WhereBuilder/index.js.map +1 -1
  31. package/dist/fields/Array/index.d.ts.map +1 -1
  32. package/dist/fields/Array/index.js +6 -6
  33. package/dist/fields/Array/index.js.map +1 -1
  34. package/dist/fields/Blocks/index.d.ts.map +1 -1
  35. package/dist/fields/Blocks/index.js +6 -6
  36. package/dist/fields/Blocks/index.js.map +1 -1
  37. package/dist/fields/Checkbox/index.d.ts.map +1 -1
  38. package/dist/fields/Checkbox/index.js +6 -6
  39. package/dist/fields/Checkbox/index.js.map +1 -1
  40. package/dist/fields/Code/index.d.ts.map +1 -1
  41. package/dist/fields/Code/index.js +5 -5
  42. package/dist/fields/Code/index.js.map +1 -1
  43. package/dist/fields/Collapsible/index.d.ts.map +1 -1
  44. package/dist/fields/Collapsible/index.js +5 -2
  45. package/dist/fields/Collapsible/index.js.map +1 -1
  46. package/dist/fields/DateTime/index.js +5 -5
  47. package/dist/fields/DateTime/index.js.map +1 -1
  48. package/dist/fields/Email/index.d.ts.map +1 -1
  49. package/dist/fields/Email/index.js +4 -4
  50. package/dist/fields/Email/index.js.map +1 -1
  51. package/dist/fields/Group/index.d.ts.map +1 -1
  52. package/dist/fields/Group/index.js +5 -3
  53. package/dist/fields/Group/index.js.map +1 -1
  54. package/dist/fields/JSON/index.d.ts.map +1 -1
  55. package/dist/fields/JSON/index.js +7 -7
  56. package/dist/fields/JSON/index.js.map +1 -1
  57. package/dist/fields/Number/index.d.ts.map +1 -1
  58. package/dist/fields/Number/index.js +7 -7
  59. package/dist/fields/Number/index.js.map +1 -1
  60. package/dist/fields/Password/index.d.ts.map +1 -1
  61. package/dist/fields/Password/index.js +6 -4
  62. package/dist/fields/Password/index.js.map +1 -1
  63. package/dist/fields/RadioGroup/index.d.ts.map +1 -1
  64. package/dist/fields/RadioGroup/index.js +5 -5
  65. package/dist/fields/RadioGroup/index.js.map +1 -1
  66. package/dist/fields/Relationship/findOptionsByValue.js +1 -1
  67. package/dist/fields/Relationship/findOptionsByValue.js.map +1 -1
  68. package/dist/fields/Relationship/index.d.ts.map +1 -1
  69. package/dist/fields/Relationship/index.js +2 -4
  70. package/dist/fields/Relationship/index.js.map +1 -1
  71. package/dist/fields/Select/index.d.ts.map +1 -1
  72. package/dist/fields/Select/index.js +5 -5
  73. package/dist/fields/Select/index.js.map +1 -1
  74. package/dist/fields/Tabs/index.d.ts.map +1 -1
  75. package/dist/fields/Tabs/index.js.map +1 -1
  76. package/dist/fields/Text/index.d.ts.map +1 -1
  77. package/dist/fields/Text/index.js +5 -5
  78. package/dist/fields/Text/index.js.map +1 -1
  79. package/dist/fields/Textarea/index.d.ts.map +1 -1
  80. package/dist/fields/Textarea/index.js +3 -3
  81. package/dist/fields/Textarea/index.js.map +1 -1
  82. package/dist/fields/Upload/index.d.ts.map +1 -1
  83. package/dist/fields/Upload/index.js +3 -3
  84. package/dist/fields/Upload/index.js.map +1 -1
  85. package/dist/forms/FieldPropsProvider/index.d.ts +1 -0
  86. package/dist/forms/FieldPropsProvider/index.d.ts.map +1 -1
  87. package/dist/forms/FieldPropsProvider/index.js.map +1 -1
  88. package/dist/forms/Form/context.d.ts +3 -1
  89. package/dist/forms/Form/context.d.ts.map +1 -1
  90. package/dist/forms/Form/context.js +3 -1
  91. package/dist/forms/Form/context.js.map +1 -1
  92. package/dist/forms/Form/getSiblingData.d.ts.map +1 -1
  93. package/dist/forms/Form/getSiblingData.js +1 -0
  94. package/dist/forms/Form/getSiblingData.js.map +1 -1
  95. package/dist/forms/Form/index.d.ts.map +1 -1
  96. package/dist/forms/Form/index.js +28 -11
  97. package/dist/forms/Form/index.js.map +1 -1
  98. package/dist/forms/Form/initContextState.d.ts.map +1 -1
  99. package/dist/forms/Form/initContextState.js +1 -0
  100. package/dist/forms/Form/initContextState.js.map +1 -1
  101. package/dist/forms/Form/types.d.ts +2 -0
  102. package/dist/forms/Form/types.d.ts.map +1 -1
  103. package/dist/forms/Form/types.js.map +1 -1
  104. package/dist/forms/RenderFields/index.d.ts.map +1 -1
  105. package/dist/forms/RenderFields/index.js +6 -2
  106. package/dist/forms/RenderFields/index.js.map +1 -1
  107. package/dist/forms/RenderFields/types.d.ts +8 -1
  108. package/dist/forms/RenderFields/types.d.ts.map +1 -1
  109. package/dist/forms/RenderFields/types.js.map +1 -1
  110. package/dist/forms/Submit/index.d.ts.map +1 -1
  111. package/dist/forms/Submit/index.js +3 -2
  112. package/dist/forms/Submit/index.js.map +1 -1
  113. package/dist/forms/buildStateFromSchema/calculateDefaultValues/index.d.ts +5 -3
  114. package/dist/forms/buildStateFromSchema/calculateDefaultValues/index.d.ts.map +1 -1
  115. package/dist/forms/buildStateFromSchema/calculateDefaultValues/index.js +4 -3
  116. package/dist/forms/buildStateFromSchema/calculateDefaultValues/index.js.map +1 -1
  117. package/dist/forms/buildStateFromSchema/calculateDefaultValues/iterateFields.d.ts +5 -3
  118. package/dist/forms/buildStateFromSchema/calculateDefaultValues/iterateFields.d.ts.map +1 -1
  119. package/dist/forms/buildStateFromSchema/calculateDefaultValues/iterateFields.js +4 -3
  120. package/dist/forms/buildStateFromSchema/calculateDefaultValues/iterateFields.js.map +1 -1
  121. package/dist/forms/buildStateFromSchema/calculateDefaultValues/promise.d.ts +5 -3
  122. package/dist/forms/buildStateFromSchema/calculateDefaultValues/promise.d.ts.map +1 -1
  123. package/dist/forms/buildStateFromSchema/calculateDefaultValues/promise.js +21 -15
  124. package/dist/forms/buildStateFromSchema/calculateDefaultValues/promise.js.map +1 -1
  125. package/dist/forms/buildStateFromSchema/index.d.ts.map +1 -1
  126. package/dist/forms/buildStateFromSchema/index.js +3 -2
  127. package/dist/forms/buildStateFromSchema/index.js.map +1 -1
  128. package/dist/forms/useField/index.d.ts.map +1 -1
  129. package/dist/forms/useField/index.js +5 -2
  130. package/dist/forms/useField/index.js.map +1 -1
  131. package/dist/forms/useField/types.d.ts +1 -0
  132. package/dist/forms/useField/types.d.ts.map +1 -1
  133. package/dist/forms/useField/types.js.map +1 -1
  134. package/dist/icons/Plus/index.d.ts.map +1 -1
  135. package/dist/icons/Plus/index.js +1 -0
  136. package/dist/icons/Plus/index.js.map +1 -1
  137. package/dist/icons/Plus/index.scss +0 -3
  138. package/dist/providers/ComponentMap/buildComponentMap/fields.d.ts.map +1 -1
  139. package/dist/providers/ComponentMap/buildComponentMap/fields.js +1 -0
  140. package/dist/providers/ComponentMap/buildComponentMap/fields.js.map +1 -1
  141. package/dist/providers/DocumentInfo/index.d.ts.map +1 -1
  142. package/dist/providers/DocumentInfo/index.js +67 -53
  143. package/dist/providers/DocumentInfo/index.js.map +1 -1
  144. package/dist/providers/DocumentInfo/types.d.ts +4 -0
  145. package/dist/providers/DocumentInfo/types.d.ts.map +1 -1
  146. package/dist/providers/DocumentInfo/types.js.map +1 -1
  147. package/dist/providers/Root/index.d.ts +1 -2
  148. package/dist/providers/Root/index.d.ts.map +1 -1
  149. package/dist/providers/Root/index.js.map +1 -1
  150. package/dist/providers/Translation/index.d.ts +1 -5
  151. package/dist/providers/Translation/index.d.ts.map +1 -1
  152. package/dist/providers/Translation/index.js.map +1 -1
  153. package/dist/utilities/buildFieldSchemaMap/index.d.ts +8 -0
  154. package/dist/utilities/buildFieldSchemaMap/index.d.ts.map +1 -0
  155. package/dist/utilities/buildFieldSchemaMap/index.js +29 -0
  156. package/dist/utilities/buildFieldSchemaMap/index.js.map +1 -0
  157. package/dist/utilities/buildFieldSchemaMap/traverseFields.d.ts +14 -0
  158. package/dist/utilities/buildFieldSchemaMap/traverseFields.d.ts.map +1 -0
  159. package/dist/utilities/buildFieldSchemaMap/traverseFields.js +75 -0
  160. package/dist/utilities/buildFieldSchemaMap/traverseFields.js.map +1 -0
  161. package/dist/utilities/buildFieldSchemaMap/types.d.ts +3 -0
  162. package/dist/utilities/buildFieldSchemaMap/types.d.ts.map +1 -0
  163. package/dist/utilities/buildFieldSchemaMap/types.js +3 -0
  164. package/dist/utilities/buildFieldSchemaMap/types.js.map +1 -0
  165. package/dist/utilities/buildFormState.d.ts +7 -0
  166. package/dist/utilities/buildFormState.d.ts.map +1 -0
  167. package/dist/utilities/buildFormState.js +162 -0
  168. package/dist/utilities/buildFormState.js.map +1 -0
  169. package/dist/utilities/getFormState.d.ts +1 -0
  170. package/dist/utilities/getFormState.d.ts.map +1 -1
  171. package/dist/utilities/getFormState.js +5 -2
  172. package/dist/utilities/getFormState.js.map +1 -1
  173. package/dist/utilities/reduceFieldsToValues.d.ts.map +1 -1
  174. package/dist/utilities/reduceFieldsToValues.js +1 -0
  175. package/dist/utilities/reduceFieldsToValues.js.map +1 -1
  176. package/package.json +5 -5
@@ -1,5 +1,6 @@
1
1
  'use client';
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import QueryString from 'qs';
3
4
  import React, { useCallback, useEffect, useReducer, useState } from 'react';
4
5
  import { useDebounce } from '../../../../hooks/useDebounce.js';
5
6
  import { useConfig } from '../../../../providers/Config/index.js';
@@ -13,13 +14,23 @@ export const RelationshipField = (props)=>{
13
14
  const { collections, routes: { api }, serverURL } = useConfig();
14
15
  const hasMultipleRelations = Array.isArray(relationTo);
15
16
  const [options, dispatchOptions] = useReducer(optionsReducer, []);
16
- const [lastFullyLoadedRelation, setLastFullyLoadedRelation] = useState(-1);
17
- const [lastLoadedPage, setLastLoadedPage] = useState(1);
18
17
  const [search, setSearch] = useState('');
19
18
  const [errorLoading, setErrorLoading] = useState('');
20
19
  const [hasLoadedFirstOptions, setHasLoadedFirstOptions] = useState(false);
21
20
  const debouncedSearch = useDebounce(search, 300);
22
21
  const { i18n, t } = useTranslation();
22
+ const relationSlugs = hasMultipleRelations ? relationTo : [
23
+ relationTo
24
+ ];
25
+ const initialRelationMap = ()=>{
26
+ const map = new Map();
27
+ relationSlugs.forEach((relation)=>{
28
+ map.set(relation, 1);
29
+ });
30
+ return map;
31
+ };
32
+ const nextPageByRelationshipRef = React.useRef(initialRelationMap());
33
+ const partiallyLoadedRelationshipSlugs = React.useRef(relationSlugs);
23
34
  const addOptions = useCallback((data, relation)=>{
24
35
  const collection = collections.find((coll)=>coll.slug === relation);
25
36
  dispatchOptions({
@@ -35,58 +46,78 @@ export const RelationshipField = (props)=>{
35
46
  hasMultipleRelations,
36
47
  i18n
37
48
  ]);
38
- const getResults = useCallback(async ({ lastFullyLoadedRelation: lastFullyLoadedRelationArg, lastLoadedPage: lastLoadedPageArg, search: searchArg })=>{
39
- let lastLoadedPageToUse = typeof lastLoadedPageArg !== 'undefined' ? lastLoadedPageArg : 1;
40
- const lastFullyLoadedRelationToUse = typeof lastFullyLoadedRelationArg !== 'undefined' ? lastFullyLoadedRelationArg : -1;
41
- const relations = Array.isArray(relationTo) ? relationTo : [
42
- relationTo
43
- ];
44
- const relationsToFetch = lastFullyLoadedRelationToUse === -1 ? relations : relations.slice(lastFullyLoadedRelationToUse + 1);
45
- let resultsFetched = 0;
46
- if (!errorLoading) {
47
- relationsToFetch.reduce(async (priorRelation, relation)=>{
48
- await priorRelation;
49
- if (resultsFetched < 10) {
50
- const collection = collections.find((coll)=>coll.slug === relation);
51
- const fieldToSearch = collection?.admin?.useAsTitle || 'id';
52
- const searchParam = searchArg ? `&where[${fieldToSearch}][like]=${searchArg}` : '';
53
- const response = await fetch(`${serverURL}${api}/${relation}?limit=${maxResultsPerRequest}&page=${lastLoadedPageToUse}&depth=0${searchParam}`, {
54
- credentials: 'include',
55
- headers: {
56
- 'Accept-Language': i18n.language
57
- }
58
- });
59
- if (response.ok) {
60
- const data = await response.json();
61
- if (data.docs.length > 0) {
62
- resultsFetched += data.docs.length;
63
- addOptions(data, relation);
64
- setLastLoadedPage(data.page);
65
- if (!data.nextPage) {
66
- setLastFullyLoadedRelation(relations.indexOf(relation));
67
- // If there are more relations to search, need to reset lastLoadedPage to 1
68
- // both locally within function and state
69
- if (relations.indexOf(relation) + 1 < relations.length) {
70
- lastLoadedPageToUse = 1;
71
- }
49
+ const loadRelationOptions = React.useCallback(async ({ abortController, relationSlug })=>{
50
+ const collection = collections.find((coll)=>coll.slug === relationSlug);
51
+ const fieldToSearch = collection?.admin?.useAsTitle || 'id';
52
+ const pageIndex = nextPageByRelationshipRef.current.get(relationSlug);
53
+ if (partiallyLoadedRelationshipSlugs.current.includes(relationSlug)) {
54
+ const query = {
55
+ depth: 0,
56
+ limit: maxResultsPerRequest,
57
+ page: pageIndex,
58
+ where: {
59
+ and: []
60
+ }
61
+ };
62
+ if (debouncedSearch) {
63
+ query.where.and.push({
64
+ [fieldToSearch]: {
65
+ like: debouncedSearch
66
+ }
67
+ });
68
+ }
69
+ try {
70
+ const response = await fetch(`${serverURL}${api}/${relationSlug}${QueryString.stringify(query, {
71
+ addQueryPrefix: true
72
+ })}`, {
73
+ credentials: 'include',
74
+ headers: {
75
+ 'Accept-Language': i18n.language
76
+ },
77
+ signal: abortController.signal
78
+ });
79
+ if (response.ok) {
80
+ const data = await response.json();
81
+ if (data.docs.length > 0) {
82
+ addOptions(data, relationSlug);
83
+ if (!debouncedSearch) {
84
+ if (data.nextPage) {
85
+ nextPageByRelationshipRef.current.set(relationSlug, data.nextPage);
86
+ } else {
87
+ partiallyLoadedRelationshipSlugs.current = partiallyLoadedRelationshipSlugs.current.filter((partiallyLoadedRelation)=>partiallyLoadedRelation !== relationSlug);
72
88
  }
73
89
  }
74
- } else {
75
- setErrorLoading(t('error:unspecific'));
76
90
  }
91
+ } else {
92
+ setErrorLoading(t('error:unspecific'));
93
+ }
94
+ } catch (e) {
95
+ if (!abortController.signal.aborted) {
96
+ console.error(e);
77
97
  }
78
- }, Promise.resolve());
98
+ }
79
99
  }
100
+ setHasLoadedFirstOptions(true);
80
101
  }, [
81
- i18n,
82
- relationTo,
83
- errorLoading,
102
+ addOptions,
103
+ api,
84
104
  collections,
105
+ debouncedSearch,
106
+ i18n.language,
85
107
  serverURL,
86
- api,
87
- addOptions,
88
108
  t
89
109
  ]);
110
+ const loadMoreOptions = React.useCallback(()=>{
111
+ if (partiallyLoadedRelationshipSlugs.current.length > 0) {
112
+ const abortController = new AbortController();
113
+ loadRelationOptions({
114
+ abortController,
115
+ relationSlug: partiallyLoadedRelationshipSlugs.current[0]
116
+ });
117
+ }
118
+ }, [
119
+ loadRelationOptions
120
+ ]);
90
121
  const findOptionsByValue = useCallback(()=>{
91
122
  if (value) {
92
123
  if (hasMany) {
@@ -174,31 +205,37 @@ export const RelationshipField = (props)=>{
174
205
  serverURL,
175
206
  t
176
207
  ]);
177
- // ///////////////////////////
178
- // Get results when search input changes
179
- // ///////////////////////////
180
- useEffect(()=>{
181
- dispatchOptions({
182
- type: 'CLEAR',
183
- i18n,
184
- required: true
185
- });
186
- setHasLoadedFirstOptions(true);
187
- setLastLoadedPage(1);
188
- setLastFullyLoadedRelation(-1);
189
- getResults({
190
- search: debouncedSearch
208
+ /**
209
+ * 1. Trigger initial relationship options fetch
210
+ * 2. When search changes, loadRelationOptions will
211
+ * fire off again
212
+ */ useEffect(()=>{
213
+ const relations = Array.isArray(relationTo) ? relationTo : [
214
+ relationTo
215
+ ];
216
+ const abortControllers = [];
217
+ relations.forEach((relation)=>{
218
+ const abortController = new AbortController();
219
+ loadRelationOptions({
220
+ abortController,
221
+ relationSlug: relation
222
+ });
223
+ abortControllers.push(abortController);
191
224
  });
225
+ return ()=>{
226
+ abortControllers.forEach((controller)=>{
227
+ if (controller.signal) controller.abort();
228
+ });
229
+ };
192
230
  }, [
193
- getResults,
194
- debouncedSearch,
195
- relationTo,
196
- i18n
231
+ i18n,
232
+ loadRelationOptions,
233
+ relationTo
197
234
  ]);
198
- // ///////////////////////////
199
- // Format options once first options have been retrieved
200
- // ///////////////////////////
201
- useEffect(()=>{
235
+ /**
236
+ * Load any options that were not returned
237
+ * in the first 10 of each relation fetch
238
+ */ useEffect(()=>{
202
239
  if (value && hasLoadedFirstOptions) {
203
240
  if (hasMany) {
204
241
  const matchedOptions = findOptionsByValue();
@@ -270,12 +307,7 @@ export const RelationshipField = (props)=>{
270
307
  }
271
308
  },
272
309
  onInputChange: handleInputChange,
273
- onMenuScrollToBottom: ()=>{
274
- getResults({
275
- lastFullyLoadedRelation,
276
- lastLoadedPage: lastLoadedPage + 1
277
- });
278
- },
310
+ onMenuScrollToBottom: loadMoreOptions,
279
311
  options: options,
280
312
  placeholder: t('general:selectValue'),
281
313
  value: valueToRender
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/elements/WhereBuilder/Condition/Relationship/index.tsx"],"sourcesContent":["'use client'\n/* eslint-disable @typescript-eslint/no-floating-promises */\nimport type { PaginatedDocs } from 'payload/database'\n\nimport React, { useCallback, useEffect, useReducer, useState } from 'react'\n\nimport type { Option } from '../../../ReactSelect/types.js'\nimport type { GetResults, Props, ValueWithRelation } from './types.js'\n\nimport { useDebounce } from '../../../../hooks/useDebounce.js'\nimport { useConfig } from '../../../../providers/Config/index.js'\nimport { useTranslation } from '../../../../providers/Translation/index.js'\nimport { ReactSelect } from '../../../ReactSelect/index.js'\nimport './index.scss'\nimport optionsReducer from './optionsReducer.js'\n\nconst baseClass = 'condition-value-relationship'\n\nconst maxResultsPerRequest = 10\n\nexport const RelationshipField: React.FC<Props> = (props) => {\n const { admin: { isSortable } = {}, disabled, hasMany, onChange, relationTo, value } = props\n\n const {\n collections,\n routes: { api },\n serverURL,\n } = useConfig()\n\n const hasMultipleRelations = Array.isArray(relationTo)\n const [options, dispatchOptions] = useReducer(optionsReducer, [])\n const [lastFullyLoadedRelation, setLastFullyLoadedRelation] = useState(-1)\n const [lastLoadedPage, setLastLoadedPage] = useState(1)\n const [search, setSearch] = useState('')\n const [errorLoading, setErrorLoading] = useState('')\n const [hasLoadedFirstOptions, setHasLoadedFirstOptions] = useState(false)\n const debouncedSearch = useDebounce(search, 300)\n const { i18n, t } = useTranslation()\n\n const addOptions = useCallback(\n (data, relation) => {\n const collection = collections.find((coll) => coll.slug === relation)\n dispatchOptions({ type: 'ADD', collection, data, hasMultipleRelations, i18n, relation })\n },\n [collections, hasMultipleRelations, i18n],\n )\n\n const getResults = useCallback<GetResults>(\n async ({\n lastFullyLoadedRelation: lastFullyLoadedRelationArg,\n lastLoadedPage: lastLoadedPageArg,\n search: searchArg,\n // eslint-disable-next-line @typescript-eslint/require-await\n }) => {\n let lastLoadedPageToUse = typeof lastLoadedPageArg !== 'undefined' ? lastLoadedPageArg : 1\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\n if (!errorLoading) {\n relationsToFetch.reduce(async (priorRelation, relation) => {\n await priorRelation\n\n if (resultsFetched < 10) {\n const collection = collections.find((coll) => coll.slug === relation)\n const fieldToSearch = collection?.admin?.useAsTitle || 'id'\n const searchParam = searchArg ? `&where[${fieldToSearch}][like]=${searchArg}` : ''\n\n const response = await fetch(\n `${serverURL}${api}/${relation}?limit=${maxResultsPerRequest}&page=${lastLoadedPageToUse}&depth=0${searchParam}`,\n {\n credentials: 'include',\n headers: {\n 'Accept-Language': i18n.language,\n },\n },\n )\n\n if (response.ok) {\n const data: PaginatedDocs = await response.json()\n if (data.docs.length > 0) {\n resultsFetched += data.docs.length\n addOptions(data, relation)\n setLastLoadedPage(data.page)\n\n if (!data.nextPage) {\n setLastFullyLoadedRelation(relations.indexOf(relation))\n\n // If there are more relations to search, need to reset lastLoadedPage to 1\n // both locally within function and state\n if (relations.indexOf(relation) + 1 < relations.length) {\n lastLoadedPageToUse = 1\n }\n }\n }\n } else {\n setErrorLoading(t('error:unspecific'))\n }\n }\n }, Promise.resolve())\n }\n },\n [i18n, relationTo, errorLoading, collections, serverURL, api, addOptions, t],\n )\n\n const findOptionsByValue = useCallback((): Option | Option[] => {\n if (value) {\n if (hasMany) {\n if (Array.isArray(value)) {\n return value.map((val) => {\n if (hasMultipleRelations) {\n let matchedOption: Option\n\n options.forEach((opt) => {\n if (opt.options) {\n opt.options.some((subOpt) => {\n if (subOpt?.value === val.value) {\n matchedOption = subOpt\n return true\n }\n\n return false\n })\n }\n })\n\n return matchedOption\n }\n\n return options.find((opt) => opt.value === val)\n })\n }\n\n return undefined\n }\n\n if (hasMultipleRelations) {\n let matchedOption: Option\n\n const valueWithRelation = value as ValueWithRelation\n\n options.forEach((opt) => {\n if (opt?.options) {\n opt.options.some((subOpt) => {\n if (subOpt?.value === valueWithRelation.value) {\n matchedOption = subOpt\n return true\n }\n return false\n })\n }\n })\n\n return matchedOption\n }\n\n return options.find((opt) => opt.value === value)\n }\n\n return undefined\n }, [hasMany, hasMultipleRelations, value, options])\n\n const handleInputChange = useCallback(\n (newSearch) => {\n if (search !== newSearch) {\n setSearch(newSearch)\n }\n },\n [search],\n )\n\n const addOptionByID = useCallback(\n async (id, relation) => {\n if (!errorLoading && id !== 'null' && id && relation) {\n const response = await fetch(`${serverURL}${api}/${relation}/${id}?depth=0`, {\n credentials: 'include',\n headers: {\n 'Accept-Language': i18n.language,\n },\n })\n\n if (response.ok) {\n const data = await response.json()\n addOptions({ docs: [data] }, relation)\n } else {\n // eslint-disable-next-line no-console\n console.error(t('error:loadingDocument', { id }))\n }\n }\n },\n [i18n, addOptions, api, errorLoading, serverURL, t],\n )\n\n // ///////////////////////////\n // Get results when search input changes\n // ///////////////////////////\n\n useEffect(() => {\n dispatchOptions({\n type: 'CLEAR',\n i18n,\n required: true,\n })\n\n setHasLoadedFirstOptions(true)\n setLastLoadedPage(1)\n setLastFullyLoadedRelation(-1)\n getResults({ search: debouncedSearch })\n }, [getResults, debouncedSearch, relationTo, i18n])\n\n // ///////////////////////////\n // Format options once first options have been retrieved\n // ///////////////////////////\n\n useEffect(() => {\n if (value && hasLoadedFirstOptions) {\n if (hasMany) {\n const matchedOptions = findOptionsByValue()\n\n ;((matchedOptions as Option[]) || []).forEach((option, i) => {\n if (!option) {\n if (hasMultipleRelations) {\n addOptionByID(value[i].value, value[i].relationTo)\n } else {\n addOptionByID(value[i], relationTo)\n }\n }\n })\n } else {\n const matchedOption = findOptionsByValue()\n\n if (!matchedOption) {\n if (hasMultipleRelations) {\n const valueWithRelation = value as ValueWithRelation\n addOptionByID(valueWithRelation.value, valueWithRelation.relationTo)\n } else {\n addOptionByID(value, relationTo)\n }\n }\n }\n }\n }, [\n addOptionByID,\n findOptionsByValue,\n hasMany,\n hasMultipleRelations,\n relationTo,\n value,\n hasLoadedFirstOptions,\n ])\n\n const classes = ['field-type', baseClass, errorLoading && 'error-loading']\n .filter(Boolean)\n .join(' ')\n\n const valueToRender = (findOptionsByValue() || value) as Option\n\n return (\n <div className={classes}>\n {!errorLoading && (\n <ReactSelect\n disabled={disabled}\n isMulti={hasMany}\n isSortable={isSortable}\n onChange={(selected) => {\n if (!selected) {\n onChange(null)\n return\n }\n if (hasMany) {\n onChange(\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) {\n onChange({\n relationTo: selected?.relationTo,\n value: selected?.value,\n })\n } else {\n onChange(selected?.value)\n }\n }}\n onInputChange={handleInputChange}\n onMenuScrollToBottom={() => {\n getResults({ lastFullyLoadedRelation, lastLoadedPage: lastLoadedPage + 1 })\n }}\n options={options}\n placeholder={t('general:selectValue')}\n value={valueToRender}\n />\n )}\n {errorLoading && <div className={`${baseClass}__error-loading`}>{errorLoading}</div>}\n </div>\n )\n}\n"],"names":["React","useCallback","useEffect","useReducer","useState","useDebounce","useConfig","useTranslation","ReactSelect","optionsReducer","baseClass","maxResultsPerRequest","RelationshipField","props","admin","isSortable","disabled","hasMany","onChange","relationTo","value","collections","routes","api","serverURL","hasMultipleRelations","Array","isArray","options","dispatchOptions","lastFullyLoadedRelation","setLastFullyLoadedRelation","lastLoadedPage","setLastLoadedPage","search","setSearch","errorLoading","setErrorLoading","hasLoadedFirstOptions","setHasLoadedFirstOptions","debouncedSearch","i18n","t","addOptions","data","relation","collection","find","coll","slug","type","getResults","lastFullyLoadedRelationArg","lastLoadedPageArg","searchArg","lastLoadedPageToUse","lastFullyLoadedRelationToUse","relations","relationsToFetch","slice","resultsFetched","reduce","priorRelation","fieldToSearch","useAsTitle","searchParam","response","fetch","credentials","headers","language","ok","json","docs","length","page","nextPage","indexOf","Promise","resolve","findOptionsByValue","map","val","matchedOption","forEach","opt","some","subOpt","undefined","valueWithRelation","handleInputChange","newSearch","addOptionByID","id","console","error","required","matchedOptions","option","i","classes","filter","Boolean","join","valueToRender","div","className","isMulti","selected","onInputChange","onMenuScrollToBottom","placeholder"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"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"}
1
+ {"version":3,"sources":["../../../../../src/elements/WhereBuilder/Condition/Relationship/index.tsx"],"sourcesContent":["'use client'\n/* eslint-disable @typescript-eslint/no-floating-promises */\nimport type { PaginatedDocs } from 'payload/database'\nimport type { Where } from 'payload/types'\n\nimport QueryString from 'qs'\nimport React, { useCallback, useEffect, useReducer, useState } from 'react'\n\nimport type { Option } from '../../../ReactSelect/types.js'\nimport type { Props, ValueWithRelation } from './types.js'\n\nimport { useDebounce } from '../../../../hooks/useDebounce.js'\nimport { useConfig } from '../../../../providers/Config/index.js'\nimport { useTranslation } from '../../../../providers/Translation/index.js'\nimport { ReactSelect } from '../../../ReactSelect/index.js'\nimport './index.scss'\nimport optionsReducer from './optionsReducer.js'\n\nconst baseClass = 'condition-value-relationship'\n\nconst maxResultsPerRequest = 10\n\nexport const RelationshipField: React.FC<Props> = (props) => {\n const { admin: { isSortable } = {}, disabled, hasMany, onChange, relationTo, value } = props\n\n const {\n collections,\n routes: { api },\n serverURL,\n } = useConfig()\n\n const hasMultipleRelations = Array.isArray(relationTo)\n const [options, dispatchOptions] = useReducer(optionsReducer, [])\n const [search, setSearch] = useState('')\n const [errorLoading, setErrorLoading] = useState('')\n const [hasLoadedFirstOptions, setHasLoadedFirstOptions] = useState(false)\n const debouncedSearch = useDebounce(search, 300)\n const { i18n, t } = useTranslation()\n const relationSlugs = hasMultipleRelations ? relationTo : [relationTo]\n const initialRelationMap = () => {\n const map: Map<string, number> = new Map()\n relationSlugs.forEach((relation) => {\n map.set(relation, 1)\n })\n return map\n }\n const nextPageByRelationshipRef = React.useRef<Map<string, number>>(initialRelationMap())\n const partiallyLoadedRelationshipSlugs = React.useRef<string[]>(relationSlugs)\n\n const addOptions = useCallback(\n (data, relation) => {\n const collection = collections.find((coll) => coll.slug === relation)\n dispatchOptions({ type: 'ADD', collection, data, hasMultipleRelations, i18n, relation })\n },\n [collections, hasMultipleRelations, i18n],\n )\n\n const loadRelationOptions = React.useCallback(\n async ({\n abortController,\n relationSlug,\n }: {\n abortController: AbortController\n relationSlug: string\n }) => {\n const collection = collections.find((coll) => coll.slug === relationSlug)\n const fieldToSearch = collection?.admin?.useAsTitle || 'id'\n const pageIndex = nextPageByRelationshipRef.current.get(relationSlug)\n\n if (partiallyLoadedRelationshipSlugs.current.includes(relationSlug)) {\n const query: {\n depth?: number\n limit?: number\n page?: number\n where: Where\n } = {\n depth: 0,\n limit: maxResultsPerRequest,\n page: pageIndex,\n where: {\n and: [],\n },\n }\n\n if (debouncedSearch) {\n query.where.and.push({\n [fieldToSearch]: {\n like: debouncedSearch,\n },\n })\n }\n\n try {\n const response = await fetch(\n `${serverURL}${api}/${relationSlug}${QueryString.stringify(query, { addQueryPrefix: true })}`,\n {\n credentials: 'include',\n headers: {\n 'Accept-Language': i18n.language,\n },\n signal: abortController.signal,\n },\n )\n\n if (response.ok) {\n const data: PaginatedDocs = await response.json()\n if (data.docs.length > 0) {\n addOptions(data, relationSlug)\n\n if (!debouncedSearch) {\n if (data.nextPage) {\n nextPageByRelationshipRef.current.set(relationSlug, data.nextPage)\n } else {\n partiallyLoadedRelationshipSlugs.current =\n partiallyLoadedRelationshipSlugs.current.filter(\n (partiallyLoadedRelation) => partiallyLoadedRelation !== relationSlug,\n )\n }\n }\n }\n } else {\n setErrorLoading(t('error:unspecific'))\n }\n } catch (e) {\n if (!abortController.signal.aborted) {\n console.error(e)\n }\n }\n }\n\n setHasLoadedFirstOptions(true)\n },\n [addOptions, api, collections, debouncedSearch, i18n.language, serverURL, t],\n )\n\n const loadMoreOptions = React.useCallback(() => {\n if (partiallyLoadedRelationshipSlugs.current.length > 0) {\n const abortController = new AbortController()\n loadRelationOptions({\n abortController,\n relationSlug: partiallyLoadedRelationshipSlugs.current[0],\n })\n }\n }, [loadRelationOptions])\n\n const findOptionsByValue = useCallback((): Option | Option[] => {\n if (value) {\n if (hasMany) {\n if (Array.isArray(value)) {\n return value.map((val) => {\n if (hasMultipleRelations) {\n let matchedOption: Option\n\n options.forEach((opt) => {\n if (opt.options) {\n opt.options.some((subOpt) => {\n if (subOpt?.value === val.value) {\n matchedOption = subOpt\n return true\n }\n\n return false\n })\n }\n })\n\n return matchedOption\n }\n\n return options.find((opt) => opt.value === val)\n })\n }\n\n return undefined\n }\n\n if (hasMultipleRelations) {\n let matchedOption: Option\n\n const valueWithRelation = value as ValueWithRelation\n\n options.forEach((opt) => {\n if (opt?.options) {\n opt.options.some((subOpt) => {\n if (subOpt?.value === valueWithRelation.value) {\n matchedOption = subOpt\n return true\n }\n return false\n })\n }\n })\n\n return matchedOption\n }\n\n return options.find((opt) => opt.value === value)\n }\n\n return undefined\n }, [hasMany, hasMultipleRelations, value, options])\n\n const handleInputChange = useCallback(\n (newSearch) => {\n if (search !== newSearch) {\n setSearch(newSearch)\n }\n },\n [search],\n )\n\n const addOptionByID = useCallback(\n async (id, relation) => {\n if (!errorLoading && id !== 'null' && id && relation) {\n const response = await fetch(`${serverURL}${api}/${relation}/${id}?depth=0`, {\n credentials: 'include',\n headers: {\n 'Accept-Language': i18n.language,\n },\n })\n\n if (response.ok) {\n const data = await response.json()\n addOptions({ docs: [data] }, relation)\n } else {\n // eslint-disable-next-line no-console\n console.error(t('error:loadingDocument', { id }))\n }\n }\n },\n [i18n, addOptions, api, errorLoading, serverURL, t],\n )\n\n /**\n * 1. Trigger initial relationship options fetch\n * 2. When search changes, loadRelationOptions will\n * fire off again\n */\n useEffect(() => {\n const relations = Array.isArray(relationTo) ? relationTo : [relationTo]\n const abortControllers: AbortController[] = []\n relations.forEach((relation) => {\n const abortController = new AbortController()\n loadRelationOptions({\n abortController,\n relationSlug: relation,\n })\n abortControllers.push(abortController)\n })\n\n return () => {\n abortControllers.forEach((controller) => {\n if (controller.signal) controller.abort()\n })\n }\n }, [i18n, loadRelationOptions, relationTo])\n\n /**\n * Load any options that were not returned\n * in the first 10 of each relation fetch\n */\n useEffect(() => {\n if (value && hasLoadedFirstOptions) {\n if (hasMany) {\n const matchedOptions = findOptionsByValue()\n\n ;((matchedOptions as Option[]) || []).forEach((option, i) => {\n if (!option) {\n if (hasMultipleRelations) {\n addOptionByID(value[i].value, value[i].relationTo)\n } else {\n addOptionByID(value[i], relationTo)\n }\n }\n })\n } else {\n const matchedOption = findOptionsByValue()\n\n if (!matchedOption) {\n if (hasMultipleRelations) {\n const valueWithRelation = value as ValueWithRelation\n addOptionByID(valueWithRelation.value, valueWithRelation.relationTo)\n } else {\n addOptionByID(value, relationTo)\n }\n }\n }\n }\n }, [\n addOptionByID,\n findOptionsByValue,\n hasMany,\n hasMultipleRelations,\n relationTo,\n value,\n hasLoadedFirstOptions,\n ])\n\n const classes = ['field-type', baseClass, errorLoading && 'error-loading']\n .filter(Boolean)\n .join(' ')\n\n const valueToRender = (findOptionsByValue() || value) as Option\n\n return (\n <div className={classes}>\n {!errorLoading && (\n <ReactSelect\n disabled={disabled}\n isMulti={hasMany}\n isSortable={isSortable}\n onChange={(selected) => {\n if (!selected) {\n onChange(null)\n return\n }\n if (hasMany) {\n onChange(\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) {\n onChange({\n relationTo: selected?.relationTo,\n value: selected?.value,\n })\n } else {\n onChange(selected?.value)\n }\n }}\n onInputChange={handleInputChange}\n onMenuScrollToBottom={loadMoreOptions}\n options={options}\n placeholder={t('general:selectValue')}\n value={valueToRender}\n />\n )}\n {errorLoading && <div className={`${baseClass}__error-loading`}>{errorLoading}</div>}\n </div>\n )\n}\n"],"names":["QueryString","React","useCallback","useEffect","useReducer","useState","useDebounce","useConfig","useTranslation","ReactSelect","optionsReducer","baseClass","maxResultsPerRequest","RelationshipField","props","admin","isSortable","disabled","hasMany","onChange","relationTo","value","collections","routes","api","serverURL","hasMultipleRelations","Array","isArray","options","dispatchOptions","search","setSearch","errorLoading","setErrorLoading","hasLoadedFirstOptions","setHasLoadedFirstOptions","debouncedSearch","i18n","t","relationSlugs","initialRelationMap","map","Map","forEach","relation","set","nextPageByRelationshipRef","useRef","partiallyLoadedRelationshipSlugs","addOptions","data","collection","find","coll","slug","type","loadRelationOptions","abortController","relationSlug","fieldToSearch","useAsTitle","pageIndex","current","get","includes","query","depth","limit","page","where","and","push","like","response","fetch","stringify","addQueryPrefix","credentials","headers","language","signal","ok","json","docs","length","nextPage","filter","partiallyLoadedRelation","e","aborted","console","error","loadMoreOptions","AbortController","findOptionsByValue","val","matchedOption","opt","some","subOpt","undefined","valueWithRelation","handleInputChange","newSearch","addOptionByID","id","relations","abortControllers","controller","abort","matchedOptions","option","i","classes","Boolean","join","valueToRender","div","className","isMulti","selected","onInputChange","onMenuScrollToBottom","placeholder"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"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"}
@@ -26,7 +26,7 @@ export const Condition = (props)=>{
26
26
  const debouncedValue = useDebounce(internalQueryValue, 300);
27
27
  useEffect(()=>{
28
28
  // This is to trigger changes when the debounced value changes
29
- if (internalField.value && internalOperatorOption && ![
29
+ if ((internalField?.value || typeof internalField?.value === 'number') && internalOperatorOption && ![
30
30
  null,
31
31
  undefined
32
32
  ].includes(debouncedValue)) {
@@ -78,13 +78,13 @@ export const Condition = (props)=>{
78
78
  setInternalQueryValue(undefined);
79
79
  },
80
80
  options: fields,
81
- value: fields.find((field)=>internalField.value === field.value) || fields[0]
81
+ value: fields.find((field)=>internalField?.value === field.value) || fields[0]
82
82
  })
83
83
  }),
84
84
  /*#__PURE__*/ _jsx("div", {
85
85
  className: `${baseClass}__operator`,
86
86
  children: /*#__PURE__*/ _jsx(ReactSelect, {
87
- disabled: !internalField.value,
87
+ disabled: !internalField?.value && typeof internalField?.value !== 'number',
88
88
  isClearable: false,
89
89
  onChange: (operator)=>{
90
90
  setInternalOperatorOption(operator.value);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/elements/WhereBuilder/Condition/index.tsx"],"sourcesContent":["'use client'\nimport React, { useEffect, useState } from 'react'\n\nimport type { FieldCondition } from '../types.js'\n\nexport type Props = {\n addCondition: ({\n andIndex,\n fieldName,\n orIndex,\n relation,\n }: {\n andIndex: number\n fieldName: string\n orIndex: number\n relation: 'and' | 'or'\n }) => void\n andIndex: number\n fieldName: string\n fields: FieldCondition[]\n initialValue: string\n operator: string\n orIndex: number\n removeCondition: ({ andIndex, orIndex }: { andIndex: number; orIndex: number }) => void\n updateCondition: ({\n andIndex,\n fieldName,\n operator,\n orIndex,\n value,\n }: {\n andIndex: number\n fieldName: string\n operator: string\n orIndex: number\n value: string\n }) => void\n}\n\nimport { RenderCustomClientComponent } from '../../../elements/RenderCustomClientComponent/index.js'\nimport { useDebounce } from '../../../hooks/useDebounce.js'\nimport { Button } from '../../Button/index.js'\nimport { ReactSelect } from '../../ReactSelect/index.js'\nimport { DateField } from './Date/index.js'\nimport { NumberField } from './Number/index.js'\nimport { RelationshipField } from './Relationship/index.js'\nimport { Select } from './Select/index.js'\nimport Text from './Text/index.js'\nimport './index.scss'\n\ntype ComponentType = 'Date' | 'Number' | 'Relationship' | 'Select' | 'Text'\nconst valueFields: Record<ComponentType, React.FC> = {\n Date: DateField,\n Number: NumberField,\n Relationship: RelationshipField,\n Select,\n Text,\n}\n\nconst baseClass = 'condition'\n\nexport const Condition: React.FC<Props> = (props) => {\n const {\n addCondition,\n andIndex,\n fieldName,\n fields,\n initialValue,\n operator,\n orIndex,\n removeCondition,\n updateCondition,\n } = props\n const [internalField, setInternalField] = useState<FieldCondition>(() =>\n fields.find((field) => fieldName === field.value),\n )\n const [internalOperatorOption, setInternalOperatorOption] = useState(operator)\n const [internalQueryValue, setInternalQueryValue] = useState<string>(initialValue)\n\n const debouncedValue = useDebounce(internalQueryValue, 300)\n\n useEffect(() => {\n // This is to trigger changes when the debounced value changes\n if (\n internalField.value &&\n internalOperatorOption &&\n ![null, undefined].includes(debouncedValue)\n ) {\n updateCondition({\n andIndex,\n fieldName: internalField.value,\n operator: internalOperatorOption,\n orIndex,\n value: debouncedValue,\n })\n }\n }, [\n debouncedValue,\n andIndex,\n internalField?.value,\n internalOperatorOption,\n orIndex,\n updateCondition,\n operator,\n ])\n\n const booleanSelect =\n ['exists'].includes(internalOperatorOption) || internalField?.props?.type === 'checkbox'\n const ValueComponent = booleanSelect\n ? Select\n : valueFields[internalField?.component] || valueFields.Text\n\n let valueOptions\n if (booleanSelect) {\n valueOptions = ['true', 'false']\n } else if (internalField?.props && 'options' in internalField.props) {\n valueOptions = internalField.props.options\n }\n\n return (\n <div className={baseClass}>\n <div className={`${baseClass}__wrap`}>\n <div className={`${baseClass}__inputs`}>\n <div className={`${baseClass}__field`}>\n <ReactSelect\n isClearable={false}\n onChange={(field) => {\n setInternalField(fields.find((f) => f.value === field.value))\n setInternalOperatorOption(undefined)\n setInternalQueryValue(undefined)\n }}\n options={fields}\n value={fields.find((field) => internalField.value === field.value) || fields[0]}\n />\n </div>\n <div className={`${baseClass}__operator`}>\n <ReactSelect\n disabled={!internalField.value}\n isClearable={false}\n onChange={(operator) => {\n setInternalOperatorOption(operator.value)\n }}\n options={internalField?.operators}\n value={\n internalField?.operators.find(\n (operator) => internalOperatorOption === operator.value,\n ) || null\n }\n />\n </div>\n <div className={`${baseClass}__value`}>\n <RenderCustomClientComponent\n CustomComponent={internalField?.props?.admin?.components?.Filter}\n DefaultComponent={ValueComponent}\n componentProps={{\n ...internalField?.props,\n disabled: !internalOperatorOption,\n onChange: setInternalQueryValue,\n operator: internalOperatorOption,\n options: valueOptions,\n relationTo:\n internalField?.props?.type === 'relationship' &&\n 'cellProps' in internalField.props &&\n typeof internalField.props.cellProps === 'object' &&\n 'relationTo' in internalField.props.cellProps\n ? internalField.props.cellProps?.relationTo\n : undefined,\n value: internalQueryValue ?? '',\n }}\n />\n </div>\n </div>\n <div className={`${baseClass}__actions`}>\n <Button\n buttonStyle=\"icon-label\"\n className={`${baseClass}__actions-remove`}\n icon=\"x\"\n iconStyle=\"with-border\"\n onClick={() =>\n removeCondition({\n andIndex,\n orIndex,\n })\n }\n round\n />\n <Button\n buttonStyle=\"icon-label\"\n className={`${baseClass}__actions-add`}\n icon=\"plus\"\n iconStyle=\"with-border\"\n onClick={() =>\n addCondition({\n andIndex: andIndex + 1,\n fieldName: fields[0].value,\n orIndex,\n relation: 'and',\n })\n }\n round\n />\n </div>\n </div>\n </div>\n )\n}\n"],"names":["React","useEffect","useState","RenderCustomClientComponent","useDebounce","Button","ReactSelect","DateField","NumberField","RelationshipField","Select","Text","valueFields","Date","Number","Relationship","baseClass","Condition","props","addCondition","andIndex","fieldName","fields","initialValue","operator","orIndex","removeCondition","updateCondition","internalField","setInternalField","find","field","value","internalOperatorOption","setInternalOperatorOption","internalQueryValue","setInternalQueryValue","debouncedValue","undefined","includes","booleanSelect","type","ValueComponent","component","valueOptions","options","div","className","isClearable","onChange","f","disabled","operators","CustomComponent","admin","components","Filter","DefaultComponent","componentProps","relationTo","cellProps","buttonStyle","icon","iconStyle","onClick","round","relation"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"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"}
1
+ {"version":3,"sources":["../../../../src/elements/WhereBuilder/Condition/index.tsx"],"sourcesContent":["'use client'\nimport React, { useEffect, useState } from 'react'\n\nimport type { FieldCondition } from '../types.js'\n\nexport type Props = {\n addCondition: ({\n andIndex,\n fieldName,\n orIndex,\n relation,\n }: {\n andIndex: number\n fieldName: string\n orIndex: number\n relation: 'and' | 'or'\n }) => void\n andIndex: number\n fieldName: string\n fields: FieldCondition[]\n initialValue: string\n operator: string\n orIndex: number\n removeCondition: ({ andIndex, orIndex }: { andIndex: number; orIndex: number }) => void\n updateCondition: ({\n andIndex,\n fieldName,\n operator,\n orIndex,\n value,\n }: {\n andIndex: number\n fieldName: string\n operator: string\n orIndex: number\n value: string\n }) => void\n}\n\nimport { RenderCustomClientComponent } from '../../../elements/RenderCustomClientComponent/index.js'\nimport { useDebounce } from '../../../hooks/useDebounce.js'\nimport { Button } from '../../Button/index.js'\nimport { ReactSelect } from '../../ReactSelect/index.js'\nimport { DateField } from './Date/index.js'\nimport { NumberField } from './Number/index.js'\nimport { RelationshipField } from './Relationship/index.js'\nimport { Select } from './Select/index.js'\nimport Text from './Text/index.js'\nimport './index.scss'\n\ntype ComponentType = 'Date' | 'Number' | 'Relationship' | 'Select' | 'Text'\nconst valueFields: Record<ComponentType, React.FC> = {\n Date: DateField,\n Number: NumberField,\n Relationship: RelationshipField,\n Select,\n Text,\n}\n\nconst baseClass = 'condition'\n\nexport const Condition: React.FC<Props> = (props) => {\n const {\n addCondition,\n andIndex,\n fieldName,\n fields,\n initialValue,\n operator,\n orIndex,\n removeCondition,\n updateCondition,\n } = props\n const [internalField, setInternalField] = useState<FieldCondition>(() =>\n fields.find((field) => fieldName === field.value),\n )\n const [internalOperatorOption, setInternalOperatorOption] = useState(operator)\n const [internalQueryValue, setInternalQueryValue] = useState<string>(initialValue)\n\n const debouncedValue = useDebounce(internalQueryValue, 300)\n\n useEffect(() => {\n // This is to trigger changes when the debounced value changes\n if (\n (internalField?.value || typeof internalField?.value === 'number') &&\n internalOperatorOption &&\n ![null, undefined].includes(debouncedValue)\n ) {\n updateCondition({\n andIndex,\n fieldName: internalField.value,\n operator: internalOperatorOption,\n orIndex,\n value: debouncedValue,\n })\n }\n }, [\n debouncedValue,\n andIndex,\n internalField?.value,\n internalOperatorOption,\n orIndex,\n updateCondition,\n operator,\n ])\n\n const booleanSelect =\n ['exists'].includes(internalOperatorOption) || internalField?.props?.type === 'checkbox'\n const ValueComponent = booleanSelect\n ? Select\n : valueFields[internalField?.component] || valueFields.Text\n\n let valueOptions\n if (booleanSelect) {\n valueOptions = ['true', 'false']\n } else if (internalField?.props && 'options' in internalField.props) {\n valueOptions = internalField.props.options\n }\n\n return (\n <div className={baseClass}>\n <div className={`${baseClass}__wrap`}>\n <div className={`${baseClass}__inputs`}>\n <div className={`${baseClass}__field`}>\n <ReactSelect\n isClearable={false}\n onChange={(field) => {\n setInternalField(fields.find((f) => f.value === field.value))\n setInternalOperatorOption(undefined)\n setInternalQueryValue(undefined)\n }}\n options={fields}\n value={fields.find((field) => internalField?.value === field.value) || fields[0]}\n />\n </div>\n <div className={`${baseClass}__operator`}>\n <ReactSelect\n disabled={!internalField?.value && typeof internalField?.value !== 'number'}\n isClearable={false}\n onChange={(operator) => {\n setInternalOperatorOption(operator.value)\n }}\n options={internalField?.operators}\n value={\n internalField?.operators.find(\n (operator) => internalOperatorOption === operator.value,\n ) || null\n }\n />\n </div>\n <div className={`${baseClass}__value`}>\n <RenderCustomClientComponent\n CustomComponent={internalField?.props?.admin?.components?.Filter}\n DefaultComponent={ValueComponent}\n componentProps={{\n ...internalField?.props,\n disabled: !internalOperatorOption,\n onChange: setInternalQueryValue,\n operator: internalOperatorOption,\n options: valueOptions,\n relationTo:\n internalField?.props?.type === 'relationship' &&\n 'cellProps' in internalField.props &&\n typeof internalField.props.cellProps === 'object' &&\n 'relationTo' in internalField.props.cellProps\n ? internalField.props.cellProps?.relationTo\n : undefined,\n value: internalQueryValue ?? '',\n }}\n />\n </div>\n </div>\n <div className={`${baseClass}__actions`}>\n <Button\n buttonStyle=\"icon-label\"\n className={`${baseClass}__actions-remove`}\n icon=\"x\"\n iconStyle=\"with-border\"\n onClick={() =>\n removeCondition({\n andIndex,\n orIndex,\n })\n }\n round\n />\n <Button\n buttonStyle=\"icon-label\"\n className={`${baseClass}__actions-add`}\n icon=\"plus\"\n iconStyle=\"with-border\"\n onClick={() =>\n addCondition({\n andIndex: andIndex + 1,\n fieldName: fields[0].value,\n orIndex,\n relation: 'and',\n })\n }\n round\n />\n </div>\n </div>\n </div>\n )\n}\n"],"names":["React","useEffect","useState","RenderCustomClientComponent","useDebounce","Button","ReactSelect","DateField","NumberField","RelationshipField","Select","Text","valueFields","Date","Number","Relationship","baseClass","Condition","props","addCondition","andIndex","fieldName","fields","initialValue","operator","orIndex","removeCondition","updateCondition","internalField","setInternalField","find","field","value","internalOperatorOption","setInternalOperatorOption","internalQueryValue","setInternalQueryValue","debouncedValue","undefined","includes","booleanSelect","type","ValueComponent","component","valueOptions","options","div","className","isClearable","onChange","f","disabled","operators","CustomComponent","admin","components","Filter","DefaultComponent","componentProps","relationTo","cellProps","buttonStyle","icon","iconStyle","onClick","round","relation"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/elements/WhereBuilder/index.tsx"],"names":[],"mappings":"AAEA,OAAO,KAA8B,MAAM,OAAO,CAAA;AAElD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAQnD,OAAO,cAAc,CAAA;AAOrB,OAAO,EAAE,iBAAiB,EAAE,CAAA;AAE5B;;;GAGG;AACH,eAAO,MAAM,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC,iBAAiB,CA6NpD,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/elements/WhereBuilder/index.tsx"],"names":[],"mappings":"AAEA,OAAO,KAA8B,MAAM,OAAO,CAAA;AAElD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAQnD,OAAO,cAAc,CAAA;AAOrB,OAAO,EAAE,iBAAiB,EAAE,CAAA;AAE5B;;;GAGG;AACH,eAAO,MAAM,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC,iBAAiB,CA4NpD,CAAA"}
@@ -71,63 +71,63 @@ const baseClass = 'where-builder';
71
71
  return [];
72
72
  });
73
73
  const addCondition = React.useCallback(({ andIndex, fieldName, orIndex, relation })=>{
74
- setConditions((prevConditions)=>{
75
- const newConditions = [
76
- ...prevConditions
77
- ];
78
- if (relation === 'and') {
79
- newConditions[orIndex].and.splice(andIndex, 0, {
80
- [fieldName]: {}
81
- });
82
- } else {
83
- newConditions.push({
84
- and: [
85
- {
86
- [fieldName]: {}
87
- }
88
- ]
89
- });
90
- }
91
- return newConditions;
92
- });
93
- }, []);
94
- const updateCondition = React.useCallback(({ andIndex, fieldName: fieldNameArg, operator: operatorArg, orIndex, value: valueArg })=>{
95
- setConditions((prevConditions)=>{
96
- const newConditions = [
97
- ...prevConditions
98
- ];
99
- if (typeof newConditions[orIndex].and[andIndex] === 'object') {
100
- const fieldName = fieldNameArg;
101
- const operator = operatorArg;
102
- const value = valueArg ?? (operator ? newConditions[orIndex].and[andIndex][operator] : '');
103
- if (fieldName && operator && ![
74
+ const newConditions = [
75
+ ...conditions
76
+ ];
77
+ if (relation === 'and') {
78
+ newConditions[orIndex].and.splice(andIndex, 0, {
79
+ [fieldName]: {}
80
+ });
81
+ } else {
82
+ newConditions.push({
83
+ and: [
84
+ {
85
+ [fieldName]: {}
86
+ }
87
+ ]
88
+ });
89
+ }
90
+ setConditions(newConditions);
91
+ }, [
92
+ conditions
93
+ ]);
94
+ const updateCondition = React.useCallback(({ andIndex, fieldName, operator, orIndex, value: valueArg })=>{
95
+ const existingRowCondition = conditions[orIndex].and[andIndex];
96
+ if (typeof existingRowCondition === 'object' && fieldName && operator) {
97
+ const value = valueArg ?? (operator ? existingRowCondition[operator] : '');
98
+ const newRowCondition = {
99
+ [fieldName]: operator ? {
100
+ [operator]: value
101
+ } : {}
102
+ };
103
+ if (JSON.stringify(existingRowCondition) !== JSON.stringify(newRowCondition)) {
104
+ conditions[orIndex].and[andIndex] = newRowCondition;
105
+ setConditions(conditions);
106
+ if (![
104
107
  null,
105
108
  undefined
106
109
  ].includes(value)) {
107
- newConditions[orIndex].and[andIndex] = {
108
- [fieldName]: operator ? {
109
- [operator]: value
110
- } : {}
111
- };
110
+ // only update query when field/operator/value are filled out
112
111
  setShouldUpdateQuery(true);
113
112
  }
114
113
  }
115
- return newConditions;
116
- });
117
- }, []);
114
+ }
115
+ }, [
116
+ conditions
117
+ ]);
118
118
  const removeCondition = React.useCallback(({ andIndex, orIndex })=>{
119
- setConditions((prevConditions)=>{
120
- const newConditions = [
121
- ...prevConditions
122
- ];
123
- newConditions[orIndex].and.splice(andIndex, 1);
124
- if (newConditions[orIndex].and.length === 0) {
125
- newConditions.splice(orIndex, 1);
126
- }
127
- return newConditions;
128
- });
119
+ const newConditions = [
120
+ ...conditions
121
+ ];
122
+ newConditions[orIndex].and.splice(andIndex, 1);
123
+ if (newConditions[orIndex].and.length === 0) {
124
+ newConditions.splice(orIndex, 1);
125
+ }
126
+ setConditions(newConditions);
129
127
  setShouldUpdateQuery(true);
130
- }, []);
128
+ }, [
129
+ conditions
130
+ ]);
131
131
  React.useEffect(()=>{
132
132
  if (shouldUpdateQuery) {
133
133
  handleWhereChange({
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/elements/WhereBuilder/index.tsx"],"sourcesContent":["'use client'\nimport { getTranslation } from '@payloadcms/translations'\nimport React, { useEffect, useState } from 'react'\n\nimport type { WhereBuilderProps } from './types.js'\n\nimport { useListQuery } from '../../providers/ListQuery/index.js'\nimport { useSearchParams } from '../../providers/SearchParams/index.js'\nimport { useTranslation } from '../../providers/Translation/index.js'\nimport { Button } from '../Button/index.js'\nimport { useTableColumns } from '../TableColumns/index.js'\nimport { Condition } from './Condition/index.js'\nimport './index.scss'\nimport { reduceFieldMap } from './reduceFieldMap.js'\nimport { transformWhereQuery } from './transformWhereQuery.js'\nimport validateWhereQuery from './validateWhereQuery.js'\n\nconst baseClass = 'where-builder'\n\nexport { WhereBuilderProps }\n\n/**\n * The WhereBuilder component is used to render the filter controls for a collection's list view.\n * It is part of the {@link ListControls} component which is used to render the controls (search, filter, where).\n */\nexport const WhereBuilder: React.FC<WhereBuilderProps> = (props) => {\n const { collectionPluralLabel } = props\n const { i18n, t } = useTranslation()\n const { columns } = useTableColumns()\n\n const [reducedFields, setReducedColumns] = useState(() => reduceFieldMap(columns, i18n))\n\n useEffect(() => {\n setReducedColumns(reduceFieldMap(columns, i18n))\n }, [columns, i18n])\n\n const { searchParams } = useSearchParams()\n const { handleWhereChange } = useListQuery()\n const [shouldUpdateQuery, setShouldUpdateQuery] = React.useState(false)\n\n // This handles initializing the where conditions from the search query (URL). That way, if you pass in\n // query params to the URL, the where conditions will be initialized from those and displayed in the UI.\n // Example: /admin/collections/posts?where[or][0][and][0][text][equals]=example%20post\n /*\n stored conditions look like this:\n [\n _or_ & _and_ queries have the same shape:\n {\n and: [{\n category: {\n equals: 'category-a'\n }\n }]\n },\n\n {\n and:[{\n category: {\n equals: 'category-b'\n },\n text: {\n not_equals: 'oranges'\n },\n }]\n }\n ]\n */\n\n const [conditions, setConditions] = React.useState(() => {\n const whereFromSearch = searchParams.where\n if (whereFromSearch) {\n if (validateWhereQuery(whereFromSearch)) {\n return whereFromSearch.or\n }\n\n // Transform the where query to be in the right format. This will transform something simple like [text][equals]=example%20post to the right format\n const transformedWhere = transformWhereQuery(whereFromSearch)\n\n if (validateWhereQuery(transformedWhere)) {\n return transformedWhere.or\n }\n\n console.warn(`Invalid where query in URL: ${JSON.stringify(whereFromSearch)}`)\n }\n\n return []\n })\n\n const addCondition = React.useCallback(({ andIndex, fieldName, orIndex, relation }) => {\n setConditions((prevConditions) => {\n const newConditions = [...prevConditions]\n if (relation === 'and') {\n newConditions[orIndex].and.splice(andIndex, 0, { [fieldName]: {} })\n } else {\n newConditions.push({\n and: [\n {\n [fieldName]: {},\n },\n ],\n })\n }\n\n return newConditions\n })\n }, [])\n\n const updateCondition = React.useCallback(\n ({ andIndex, fieldName: fieldNameArg, operator: operatorArg, orIndex, value: valueArg }) => {\n setConditions((prevConditions) => {\n const newConditions = [...prevConditions]\n if (typeof newConditions[orIndex].and[andIndex] === 'object') {\n const fieldName = fieldNameArg\n const operator = operatorArg\n const value = valueArg ?? (operator ? newConditions[orIndex].and[andIndex][operator] : '')\n\n if (fieldName && operator && ![null, undefined].includes(value)) {\n newConditions[orIndex].and[andIndex] = {\n [fieldName]: operator ? { [operator]: value } : {},\n }\n setShouldUpdateQuery(true)\n }\n }\n\n return newConditions\n })\n },\n [],\n )\n\n const removeCondition = React.useCallback(({ andIndex, orIndex }) => {\n setConditions((prevConditions) => {\n const newConditions = [...prevConditions]\n newConditions[orIndex].and.splice(andIndex, 1)\n if (newConditions[orIndex].and.length === 0) {\n newConditions.splice(orIndex, 1)\n }\n\n return newConditions\n })\n setShouldUpdateQuery(true)\n }, [])\n\n React.useEffect(() => {\n if (shouldUpdateQuery) {\n handleWhereChange({ or: conditions })\n setShouldUpdateQuery(false)\n }\n }, [conditions, handleWhereChange, shouldUpdateQuery])\n\n return (\n <div className={baseClass}>\n {conditions.length > 0 && (\n <React.Fragment>\n <div className={`${baseClass}__label`}>\n {t('general:filterWhere', { label: getTranslation(collectionPluralLabel, i18n) })}\n </div>\n <ul className={`${baseClass}__or-filters`}>\n {conditions.map((or, orIndex) => {\n const compoundOrKey = `${orIndex}_${Array.isArray(or?.and) ? or.and.length : ''}`\n\n return (\n <li key={compoundOrKey}>\n {orIndex !== 0 && <div className={`${baseClass}__label`}>{t('general:or')}</div>}\n <ul className={`${baseClass}__and-filters`}>\n {Array.isArray(or?.and) &&\n or.and.map((_, andIndex) => {\n const initialFieldName = Object.keys(conditions[orIndex].and[andIndex])[0]\n const initialOperator =\n Object.keys(\n conditions[orIndex].and[andIndex]?.[initialFieldName] || {},\n )?.[0] || undefined\n const initialValue =\n conditions[orIndex].and[andIndex]?.[initialFieldName]?.[\n initialOperator\n ] || ''\n\n return (\n <li key={andIndex}>\n {andIndex !== 0 && (\n <div className={`${baseClass}__label`}>{t('general:and')}</div>\n )}\n <Condition\n addCondition={addCondition}\n andIndex={andIndex}\n fieldName={initialFieldName}\n fields={reducedFields}\n initialValue={initialValue}\n operator={initialOperator}\n orIndex={orIndex}\n removeCondition={removeCondition}\n updateCondition={updateCondition}\n />\n </li>\n )\n })}\n </ul>\n </li>\n )\n })}\n </ul>\n <Button\n buttonStyle=\"icon-label\"\n className={`${baseClass}__add-or`}\n icon=\"plus\"\n iconPosition=\"left\"\n iconStyle=\"with-border\"\n onClick={() => {\n addCondition({\n andIndex: 0,\n fieldName: reducedFields[0].value,\n orIndex: conditions.length,\n relation: 'or',\n })\n }}\n >\n {t('general:or')}\n </Button>\n </React.Fragment>\n )}\n {conditions.length === 0 && (\n <div className={`${baseClass}__no-filters`}>\n <div className={`${baseClass}__label`}>{t('general:noFiltersSet')}</div>\n <Button\n buttonStyle=\"icon-label\"\n className={`${baseClass}__add-first-filter`}\n icon=\"plus\"\n iconPosition=\"left\"\n iconStyle=\"with-border\"\n onClick={() => {\n if (reducedFields.length > 0) {\n addCondition({\n andIndex: 0,\n fieldName: reducedFields[0].value,\n orIndex: conditions.length,\n relation: 'or',\n })\n }\n }}\n >\n {t('general:addFilter')}\n </Button>\n </div>\n )}\n </div>\n )\n}\n"],"names":["getTranslation","React","useEffect","useState","useListQuery","useSearchParams","useTranslation","Button","useTableColumns","Condition","reduceFieldMap","transformWhereQuery","validateWhereQuery","baseClass","WhereBuilder","props","collectionPluralLabel","i18n","t","columns","reducedFields","setReducedColumns","searchParams","handleWhereChange","shouldUpdateQuery","setShouldUpdateQuery","conditions","setConditions","whereFromSearch","where","or","transformedWhere","console","warn","JSON","stringify","addCondition","useCallback","andIndex","fieldName","orIndex","relation","prevConditions","newConditions","and","splice","push","updateCondition","fieldNameArg","operator","operatorArg","value","valueArg","undefined","includes","removeCondition","length","div","className","Fragment","label","ul","map","compoundOrKey","Array","isArray","li","_","initialFieldName","Object","keys","initialOperator","initialValue","fields","buttonStyle","icon","iconPosition","iconStyle","onClick"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"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"}
1
+ {"version":3,"sources":["../../../src/elements/WhereBuilder/index.tsx"],"sourcesContent":["'use client'\nimport { getTranslation } from '@payloadcms/translations'\nimport React, { useEffect, useState } from 'react'\n\nimport type { WhereBuilderProps } from './types.js'\n\nimport { useListQuery } from '../../providers/ListQuery/index.js'\nimport { useSearchParams } from '../../providers/SearchParams/index.js'\nimport { useTranslation } from '../../providers/Translation/index.js'\nimport { Button } from '../Button/index.js'\nimport { useTableColumns } from '../TableColumns/index.js'\nimport { Condition } from './Condition/index.js'\nimport './index.scss'\nimport { reduceFieldMap } from './reduceFieldMap.js'\nimport { transformWhereQuery } from './transformWhereQuery.js'\nimport validateWhereQuery from './validateWhereQuery.js'\n\nconst baseClass = 'where-builder'\n\nexport { WhereBuilderProps }\n\n/**\n * The WhereBuilder component is used to render the filter controls for a collection's list view.\n * It is part of the {@link ListControls} component which is used to render the controls (search, filter, where).\n */\nexport const WhereBuilder: React.FC<WhereBuilderProps> = (props) => {\n const { collectionPluralLabel } = props\n const { i18n, t } = useTranslation()\n const { columns } = useTableColumns()\n\n const [reducedFields, setReducedColumns] = useState(() => reduceFieldMap(columns, i18n))\n\n useEffect(() => {\n setReducedColumns(reduceFieldMap(columns, i18n))\n }, [columns, i18n])\n\n const { searchParams } = useSearchParams()\n const { handleWhereChange } = useListQuery()\n const [shouldUpdateQuery, setShouldUpdateQuery] = React.useState(false)\n\n // This handles initializing the where conditions from the search query (URL). That way, if you pass in\n // query params to the URL, the where conditions will be initialized from those and displayed in the UI.\n // Example: /admin/collections/posts?where[or][0][and][0][text][equals]=example%20post\n /*\n stored conditions look like this:\n [\n _or_ & _and_ queries have the same shape:\n {\n and: [{\n category: {\n equals: 'category-a'\n }\n }]\n },\n\n {\n and:[{\n category: {\n equals: 'category-b'\n },\n text: {\n not_equals: 'oranges'\n },\n }]\n }\n ]\n */\n\n const [conditions, setConditions] = React.useState(() => {\n const whereFromSearch = searchParams.where\n if (whereFromSearch) {\n if (validateWhereQuery(whereFromSearch)) {\n return whereFromSearch.or\n }\n\n // Transform the where query to be in the right format. This will transform something simple like [text][equals]=example%20post to the right format\n const transformedWhere = transformWhereQuery(whereFromSearch)\n\n if (validateWhereQuery(transformedWhere)) {\n return transformedWhere.or\n }\n\n console.warn(`Invalid where query in URL: ${JSON.stringify(whereFromSearch)}`)\n }\n\n return []\n })\n\n const addCondition = React.useCallback(\n ({ andIndex, fieldName, orIndex, relation }) => {\n const newConditions = [...conditions]\n if (relation === 'and') {\n newConditions[orIndex].and.splice(andIndex, 0, { [fieldName]: {} })\n } else {\n newConditions.push({\n and: [\n {\n [fieldName]: {},\n },\n ],\n })\n }\n setConditions(newConditions)\n },\n [conditions],\n )\n\n const updateCondition = React.useCallback(\n ({ andIndex, fieldName, operator, orIndex, value: valueArg }) => {\n const existingRowCondition = conditions[orIndex].and[andIndex]\n if (typeof existingRowCondition === 'object' && fieldName && operator) {\n const value = valueArg ?? (operator ? existingRowCondition[operator] : '')\n const newRowCondition = {\n [fieldName]: operator ? { [operator]: value } : {},\n }\n\n if (JSON.stringify(existingRowCondition) !== JSON.stringify(newRowCondition)) {\n conditions[orIndex].and[andIndex] = newRowCondition\n setConditions(conditions)\n if (![null, undefined].includes(value)) {\n // only update query when field/operator/value are filled out\n setShouldUpdateQuery(true)\n }\n }\n }\n },\n [conditions],\n )\n\n const removeCondition = React.useCallback(\n ({ andIndex, orIndex }) => {\n const newConditions = [...conditions]\n newConditions[orIndex].and.splice(andIndex, 1)\n if (newConditions[orIndex].and.length === 0) {\n newConditions.splice(orIndex, 1)\n }\n setConditions(newConditions)\n setShouldUpdateQuery(true)\n },\n [conditions],\n )\n\n React.useEffect(() => {\n if (shouldUpdateQuery) {\n handleWhereChange({ or: conditions })\n setShouldUpdateQuery(false)\n }\n }, [conditions, handleWhereChange, shouldUpdateQuery])\n\n return (\n <div className={baseClass}>\n {conditions.length > 0 && (\n <React.Fragment>\n <div className={`${baseClass}__label`}>\n {t('general:filterWhere', { label: getTranslation(collectionPluralLabel, i18n) })}\n </div>\n <ul className={`${baseClass}__or-filters`}>\n {conditions.map((or, orIndex) => {\n const compoundOrKey = `${orIndex}_${Array.isArray(or?.and) ? or.and.length : ''}`\n\n return (\n <li key={compoundOrKey}>\n {orIndex !== 0 && <div className={`${baseClass}__label`}>{t('general:or')}</div>}\n <ul className={`${baseClass}__and-filters`}>\n {Array.isArray(or?.and) &&\n or.and.map((_, andIndex) => {\n const initialFieldName = Object.keys(conditions[orIndex].and[andIndex])[0]\n const initialOperator =\n Object.keys(\n conditions[orIndex].and[andIndex]?.[initialFieldName] || {},\n )?.[0] || undefined\n const initialValue =\n conditions[orIndex].and[andIndex]?.[initialFieldName]?.[\n initialOperator\n ] || ''\n\n return (\n <li key={andIndex}>\n {andIndex !== 0 && (\n <div className={`${baseClass}__label`}>{t('general:and')}</div>\n )}\n <Condition\n addCondition={addCondition}\n andIndex={andIndex}\n fieldName={initialFieldName}\n fields={reducedFields}\n initialValue={initialValue}\n operator={initialOperator}\n orIndex={orIndex}\n removeCondition={removeCondition}\n updateCondition={updateCondition}\n />\n </li>\n )\n })}\n </ul>\n </li>\n )\n })}\n </ul>\n <Button\n buttonStyle=\"icon-label\"\n className={`${baseClass}__add-or`}\n icon=\"plus\"\n iconPosition=\"left\"\n iconStyle=\"with-border\"\n onClick={() => {\n addCondition({\n andIndex: 0,\n fieldName: reducedFields[0].value,\n orIndex: conditions.length,\n relation: 'or',\n })\n }}\n >\n {t('general:or')}\n </Button>\n </React.Fragment>\n )}\n {conditions.length === 0 && (\n <div className={`${baseClass}__no-filters`}>\n <div className={`${baseClass}__label`}>{t('general:noFiltersSet')}</div>\n <Button\n buttonStyle=\"icon-label\"\n className={`${baseClass}__add-first-filter`}\n icon=\"plus\"\n iconPosition=\"left\"\n iconStyle=\"with-border\"\n onClick={() => {\n if (reducedFields.length > 0) {\n addCondition({\n andIndex: 0,\n fieldName: reducedFields[0].value,\n orIndex: conditions.length,\n relation: 'or',\n })\n }\n }}\n >\n {t('general:addFilter')}\n </Button>\n </div>\n )}\n </div>\n )\n}\n"],"names":["getTranslation","React","useEffect","useState","useListQuery","useSearchParams","useTranslation","Button","useTableColumns","Condition","reduceFieldMap","transformWhereQuery","validateWhereQuery","baseClass","WhereBuilder","props","collectionPluralLabel","i18n","t","columns","reducedFields","setReducedColumns","searchParams","handleWhereChange","shouldUpdateQuery","setShouldUpdateQuery","conditions","setConditions","whereFromSearch","where","or","transformedWhere","console","warn","JSON","stringify","addCondition","useCallback","andIndex","fieldName","orIndex","relation","newConditions","and","splice","push","updateCondition","operator","value","valueArg","existingRowCondition","newRowCondition","undefined","includes","removeCondition","length","div","className","Fragment","label","ul","map","compoundOrKey","Array","isArray","li","_","initialFieldName","Object","keys","initialOperator","initialValue","fields","buttonStyle","icon","iconPosition","iconStyle","onClick"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/fields/Array/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AACpD,OAAO,KAAK,EAAE,UAAU,IAAI,cAAc,EAAE,MAAM,eAAe,CAAA;AAGjE,OAAO,KAAsB,MAAM,OAAO,CAAA;AAE1C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yDAAyD,CAAA;AACvF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAsBvD,OAAO,cAAc,CAAA;AAIrB,MAAM,MAAM,eAAe,GAAG,aAAa,GAAG;IAC5C,cAAc,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IAChC,QAAQ,EAAE,QAAQ,CAAA;IAClB,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,MAAM,CAAC,EAAE,cAAc,CAAC,QAAQ,CAAC,CAAA;IACjC,OAAO,CAAC,EAAE,cAAc,CAAC,SAAS,CAAC,CAAA;IACnC,OAAO,CAAC,EAAE,cAAc,CAAC,SAAS,CAAC,CAAA;IACnC,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,WAAW,EAAE,gBAAgB,CAAA;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAA;CACf,CAAA;AAED,eAAO,MAAM,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC,eAAe,CAoRjD,CAAA;AAED,eAAO,MAAM,UAAU,2BAA6B,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/fields/Array/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AACpD,OAAO,KAAK,EAAE,UAAU,IAAI,cAAc,EAAE,MAAM,eAAe,CAAA;AAGjE,OAAO,KAAsB,MAAM,OAAO,CAAA;AAE1C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yDAAyD,CAAA;AACvF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAsBvD,OAAO,cAAc,CAAA;AAIrB,MAAM,MAAM,eAAe,GAAG,aAAa,GAAG;IAC5C,cAAc,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IAChC,QAAQ,EAAE,QAAQ,CAAA;IAClB,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,MAAM,CAAC,EAAE,cAAc,CAAC,QAAQ,CAAC,CAAA;IACjC,OAAO,CAAC,EAAE,cAAc,CAAC,SAAS,CAAC,CAAA;IACnC,OAAO,CAAC,EAAE,cAAc,CAAC,SAAS,CAAC,CAAA;IACnC,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,WAAW,EAAE,gBAAgB,CAAA;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAA;CACf,CAAA;AAED,eAAO,MAAM,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC,eAAe,CAuRjD,CAAA;AAED,eAAO,MAAM,UAAU,2BAA6B,CAAA"}