@payloadcms/ui 3.0.0-beta.47 → 3.0.0-beta.48

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 (93) hide show
  1. package/dist/elements/DocumentControls/index.d.ts.map +1 -1
  2. package/dist/elements/DocumentControls/index.js +28 -21
  3. package/dist/elements/DocumentControls/index.js.map +1 -1
  4. package/dist/elements/ListDrawer/DrawerContent.d.ts.map +1 -1
  5. package/dist/elements/ListDrawer/DrawerContent.js +1 -1
  6. package/dist/elements/ListDrawer/DrawerContent.js.map +1 -1
  7. package/dist/elements/ReactSelect/index.d.ts +1 -1
  8. package/dist/elements/ReactSelect/index.d.ts.map +1 -1
  9. package/dist/elements/ReactSelect/index.js.map +1 -1
  10. package/dist/elements/ReactSelect/types.d.ts +4 -4
  11. package/dist/elements/ReactSelect/types.d.ts.map +1 -1
  12. package/dist/elements/ReactSelect/types.js.map +1 -1
  13. package/dist/elements/SortComplex/index.d.ts.map +1 -1
  14. package/dist/elements/SortComplex/index.js.map +1 -1
  15. package/dist/elements/TableColumns/index.d.ts +0 -2
  16. package/dist/elements/TableColumns/index.d.ts.map +1 -1
  17. package/dist/elements/TableColumns/index.js +83 -85
  18. package/dist/elements/TableColumns/index.js.map +1 -1
  19. package/dist/elements/WhereBuilder/Condition/Relationship/index.js +3 -3
  20. package/dist/elements/WhereBuilder/Condition/Relationship/index.js.map +1 -1
  21. package/dist/elements/WhereBuilder/Condition/index.d.ts +2 -1
  22. package/dist/elements/WhereBuilder/Condition/index.d.ts.map +1 -1
  23. package/dist/elements/WhereBuilder/Condition/index.js.map +1 -1
  24. package/dist/elements/WhereBuilder/index.d.ts.map +1 -1
  25. package/dist/elements/WhereBuilder/index.js.map +1 -1
  26. package/dist/fields/Array/index.js +2 -2
  27. package/dist/fields/Array/index.js.map +1 -1
  28. package/dist/fields/Blocks/index.js +1 -1
  29. package/dist/fields/Blocks/index.js.map +1 -1
  30. package/dist/fields/Checkbox/index.js +1 -1
  31. package/dist/fields/Checkbox/index.js.map +1 -1
  32. package/dist/fields/Code/index.js +1 -1
  33. package/dist/fields/Code/index.js.map +1 -1
  34. package/dist/fields/Collapsible/index.js +1 -1
  35. package/dist/fields/Collapsible/index.js.map +1 -1
  36. package/dist/fields/DateTime/index.d.ts +1 -1
  37. package/dist/fields/DateTime/index.d.ts.map +1 -1
  38. package/dist/fields/DateTime/index.js +1 -1
  39. package/dist/fields/DateTime/index.js.map +1 -1
  40. package/dist/fields/Email/index.d.ts.map +1 -1
  41. package/dist/fields/Email/index.js +1 -1
  42. package/dist/fields/Email/index.js.map +1 -1
  43. package/dist/fields/JSON/index.d.ts +1 -1
  44. package/dist/fields/JSON/index.d.ts.map +1 -1
  45. package/dist/fields/JSON/index.js +1 -1
  46. package/dist/fields/JSON/index.js.map +1 -1
  47. package/dist/fields/Number/index.js +1 -1
  48. package/dist/fields/Number/index.js.map +1 -1
  49. package/dist/fields/Point/index.js +1 -1
  50. package/dist/fields/Point/index.js.map +1 -1
  51. package/dist/fields/RadioGroup/index.js +1 -1
  52. package/dist/fields/RadioGroup/index.js.map +1 -1
  53. package/dist/fields/Relationship/index.js +4 -4
  54. package/dist/fields/Relationship/index.js.map +1 -1
  55. package/dist/fields/Select/Input.d.ts +3 -1
  56. package/dist/fields/Select/Input.d.ts.map +1 -1
  57. package/dist/fields/Select/Input.js.map +1 -1
  58. package/dist/fields/Select/index.d.ts +1 -1
  59. package/dist/fields/Select/index.d.ts.map +1 -1
  60. package/dist/fields/Select/index.js +4 -6
  61. package/dist/fields/Select/index.js.map +1 -1
  62. package/dist/fields/Tabs/index.js +1 -1
  63. package/dist/fields/Tabs/index.js.map +1 -1
  64. package/dist/fields/Text/Input.d.ts.map +1 -1
  65. package/dist/fields/Text/Input.js.map +1 -1
  66. package/dist/fields/Text/index.js +1 -1
  67. package/dist/fields/Text/index.js.map +1 -1
  68. package/dist/fields/Text/types.d.ts +9 -4
  69. package/dist/fields/Text/types.d.ts.map +1 -1
  70. package/dist/fields/Text/types.js.map +1 -1
  71. package/dist/fields/Textarea/index.js +1 -1
  72. package/dist/fields/Textarea/index.js.map +1 -1
  73. package/dist/fields/Upload/index.js +1 -1
  74. package/dist/fields/Upload/index.js.map +1 -1
  75. package/dist/forms/FieldError/index.js +1 -1
  76. package/dist/forms/FieldError/index.js.map +1 -1
  77. package/dist/forms/FieldPropsProvider/index.js +4 -4
  78. package/dist/forms/FieldPropsProvider/index.js.map +1 -1
  79. package/dist/forms/Form/index.js +1 -1
  80. package/dist/forms/Form/index.js.map +1 -1
  81. package/dist/forms/Form/types.d.ts +1 -1
  82. package/dist/forms/Form/types.d.ts.map +1 -1
  83. package/dist/forms/Form/types.js.map +1 -1
  84. package/dist/forms/withCondition/index.js +1 -1
  85. package/dist/forms/withCondition/index.js.map +1 -1
  86. package/dist/providers/ComponentMap/buildComponentMap/fields.d.ts.map +1 -1
  87. package/dist/providers/ComponentMap/buildComponentMap/fields.js +2 -1
  88. package/dist/providers/ComponentMap/buildComponentMap/fields.js.map +1 -1
  89. package/package.json +4 -4
  90. package/dist/elements/TableColumns/columnReducer.d.ts +0 -24
  91. package/dist/elements/TableColumns/columnReducer.d.ts.map +0 -1
  92. package/dist/elements/TableColumns/columnReducer.js +0 -59
  93. package/dist/elements/TableColumns/columnReducer.js.map +0 -1
@@ -1,11 +1,10 @@
1
1
  'use client';
2
2
  import { jsx as _jsx } from "react/jsx-runtime";
3
- import React, { createContext, useCallback, useContext, useEffect, useReducer, useRef, useState } from 'react';
3
+ import React, { createContext, useCallback, useContext, useState } from 'react';
4
4
  import { useComponentMap } from '../../providers/ComponentMap/index.js';
5
5
  import { useConfig } from '../../providers/Config/index.js';
6
6
  import { usePreferences } from '../../providers/Preferences/index.js';
7
7
  import { buildColumnState } from './buildColumnState.js';
8
- import { columnReducer } from './columnReducer.js';
9
8
  import { filterFields } from './filterFields.js';
10
9
  import { getInitialColumns } from './getInitialColumns.js';
11
10
  export const TableColumnContext = /*#__PURE__*/ createContext({});
@@ -16,43 +15,103 @@ export const TableColumnsProvider = ({ cellProps, children, collectionSlug, enab
16
15
  const { fieldMap } = componentMap.collections[collectionSlug];
17
16
  const collectionConfig = config.collections.find((collectionConfig)=>collectionConfig.slug === collectionSlug);
18
17
  const { admin: { defaultColumns, useAsTitle } } = collectionConfig;
19
- const prevCollection = useRef(collectionSlug);
20
- const hasInitialized = useRef(false);
18
+ const prevCollection = React.useRef(collectionSlug);
21
19
  const { getPreference, setPreference } = usePreferences();
22
20
  const [initialColumns] = useState(()=>getInitialColumns(filterFields(fieldMap), useAsTitle, defaultColumns));
23
- const [tableColumns, dispatchTableColumns] = useReducer(columnReducer, {}, ()=>{
24
- return buildColumnState({
21
+ const [tableColumns, setTableColumns] = React.useState(()=>buildColumnState({
25
22
  cellProps,
26
23
  columnPreferences: listPreferences?.columns,
27
24
  columns: initialColumns,
28
25
  enableRowSelections,
29
26
  fieldMap,
30
27
  useAsTitle
28
+ }));
29
+ const updateColumnPreferences = React.useCallback((newColumns)=>{
30
+ const columns = newColumns.map((c)=>({
31
+ accessor: c?.accessor,
32
+ active: c?.active
33
+ }));
34
+ void setPreference(preferenceKey, {
35
+ columns
36
+ }, true);
37
+ }, [
38
+ preferenceKey,
39
+ setPreference
40
+ ]);
41
+ const reassignLinkColumn = (columns)=>{
42
+ let foundFirstActive = false;
43
+ const newColumns = columns.map((col)=>{
44
+ const linkColumn = col.active && !foundFirstActive && col.accessor !== '_select';
45
+ if (linkColumn) foundFirstActive = true;
46
+ return {
47
+ ...col,
48
+ cellProps: {
49
+ ...col.cellProps,
50
+ link: linkColumn
51
+ }
52
+ };
31
53
  });
32
- });
33
- // /////////////////////////////////////
34
- // Get preferences on collection change
35
- // /////////////////////////////////////
36
- useEffect(()=>{
54
+ return newColumns;
55
+ };
56
+ const moveColumn = useCallback((args)=>{
57
+ const { fromIndex, toIndex } = args;
58
+ const withMovedColumn = [
59
+ ...tableColumns
60
+ ];
61
+ const [columnToMove] = withMovedColumn.splice(fromIndex, 1);
62
+ withMovedColumn.splice(toIndex, 0, columnToMove);
63
+ const newColumns = reassignLinkColumn(withMovedColumn);
64
+ setTableColumns(newColumns);
65
+ updateColumnPreferences(newColumns);
66
+ }, [
67
+ tableColumns,
68
+ updateColumnPreferences
69
+ ]);
70
+ const toggleColumn = useCallback((column)=>{
71
+ const toggledColumns = tableColumns.map((col)=>{
72
+ return {
73
+ ...col,
74
+ active: col?.name === column ? !col.active : col.active
75
+ };
76
+ });
77
+ const newColumns = reassignLinkColumn(toggledColumns);
78
+ setTableColumns(newColumns);
79
+ updateColumnPreferences(newColumns);
80
+ }, [
81
+ tableColumns,
82
+ updateColumnPreferences
83
+ ]);
84
+ const setActiveColumns = React.useCallback((activeColumnAccessors)=>{
85
+ const activeColumns = tableColumns.map((col)=>{
86
+ return {
87
+ ...col,
88
+ active: activeColumnAccessors.includes(col.accessor)
89
+ };
90
+ });
91
+ const newColumns = reassignLinkColumn(activeColumns);
92
+ updateColumnPreferences(newColumns);
93
+ }, [
94
+ tableColumns,
95
+ updateColumnPreferences
96
+ ]);
97
+ // //////////////////////////////////////////////
98
+ // Get preferences on collection change (drawers)
99
+ // //////////////////////////////////////////////
100
+ React.useEffect(()=>{
37
101
  const sync = async ()=>{
38
102
  const collectionHasChanged = prevCollection.current !== collectionSlug;
39
103
  if (collectionHasChanged || !listPreferences) {
40
104
  const currentPreferences = await getPreference(preferenceKey);
41
105
  prevCollection.current = collectionSlug;
42
106
  if (currentPreferences?.columns) {
43
- dispatchTableColumns({
44
- type: 'set',
45
- payload: {
46
- columns: buildColumnState({
47
- cellProps,
48
- columnPreferences: currentPreferences?.columns,
49
- columns: initialColumns,
50
- enableRowSelections: true,
51
- fieldMap,
52
- useAsTitle
53
- })
54
- }
55
- });
107
+ setTableColumns(buildColumnState({
108
+ cellProps,
109
+ columnPreferences: currentPreferences?.columns,
110
+ columns: initialColumns,
111
+ enableRowSelections: true,
112
+ fieldMap,
113
+ useAsTitle
114
+ }));
56
115
  }
57
116
  }
58
117
  };
@@ -68,70 +127,9 @@ export const TableColumnsProvider = ({ cellProps, children, collectionSlug, enab
68
127
  listPreferences,
69
128
  initialColumns
70
129
  ]);
71
- // /////////////////////////////////////
72
- // Set preferences on column change
73
- // /////////////////////////////////////
74
- useEffect(()=>{
75
- if (!hasInitialized.current) {
76
- hasInitialized.current = true;
77
- return;
78
- }
79
- const columns = tableColumns.map((c)=>({
80
- accessor: c?.accessor,
81
- active: c?.active
82
- }));
83
- void setPreference(preferenceKey, {
84
- columns
85
- }, true);
86
- }, [
87
- tableColumns,
88
- preferenceKey,
89
- setPreference
90
- ]);
91
- const setActiveColumns = useCallback((columns)=>{
92
- // dispatchTableColumns({
93
- // type: 'set',
94
- // payload: {
95
- // // onSelect,
96
- // cellProps,
97
- // collection: { ...collectionConfig, fields: formatFields(collectionConfig) },
98
- // columns: columns.map((column) => ({
99
- // accessor: column,
100
- // active: true,
101
- // })),
102
- // i18n,
103
- // },
104
- // })
105
- }, [
106
- collectionConfig,
107
- cellProps
108
- ]);
109
- const moveColumn = useCallback((args)=>{
110
- const { fromIndex, toIndex } = args;
111
- dispatchTableColumns({
112
- type: 'move',
113
- payload: {
114
- fromIndex,
115
- toIndex
116
- }
117
- });
118
- }, [
119
- dispatchTableColumns
120
- ]);
121
- const toggleColumn = useCallback((column)=>{
122
- dispatchTableColumns({
123
- type: 'toggle',
124
- payload: {
125
- column
126
- }
127
- });
128
- }, [
129
- dispatchTableColumns
130
- ]);
131
130
  return /*#__PURE__*/ _jsx(TableColumnContext.Provider, {
132
131
  value: {
133
132
  columns: tableColumns,
134
- dispatchTableColumns,
135
133
  moveColumn,
136
134
  setActiveColumns,
137
135
  toggleColumn
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/elements/TableColumns/index.tsx"],"sourcesContent":["'use client'\nimport type { SanitizedCollectionConfig } from 'payload/types'\nimport type { CellComponentProps } from 'payload/types'\n\nimport React, {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useReducer,\n useRef,\n useState,\n} from 'react'\n\nimport type { ColumnPreferences } from '../../providers/ListInfo/index.js'\nimport type { Column } from '../Table/index.js'\nimport type { Action } from './columnReducer.js'\n\nimport { useComponentMap } from '../../providers/ComponentMap/index.js'\nimport { useConfig } from '../../providers/Config/index.js'\nimport { usePreferences } from '../../providers/Preferences/index.js'\nimport { buildColumnState } from './buildColumnState.js'\nimport { columnReducer } from './columnReducer.js'\nimport { filterFields } from './filterFields.js'\nimport { getInitialColumns } from './getInitialColumns.js'\n\nexport interface ITableColumns {\n columns: Column[]\n dispatchTableColumns: React.Dispatch<Action>\n moveColumn: (args: { fromIndex: number; toIndex: number }) => void\n setActiveColumns: (columns: string[]) => void\n toggleColumn: (column: string) => void\n}\n\nexport const TableColumnContext = createContext<ITableColumns>({} as ITableColumns)\n\nexport const useTableColumns = (): ITableColumns => useContext(TableColumnContext)\n\nexport type ListPreferences = {\n columns: ColumnPreferences\n}\n\ntype Props = {\n cellProps?: Partial<CellComponentProps>[]\n children: React.ReactNode\n collectionSlug: string\n enableRowSelections?: boolean\n listPreferences?: ListPreferences\n preferenceKey: string\n}\n\nexport const TableColumnsProvider: React.FC<Props> = ({\n cellProps,\n children,\n collectionSlug,\n enableRowSelections = false,\n listPreferences,\n preferenceKey,\n}) => {\n const config = useConfig()\n\n const { componentMap } = useComponentMap()\n\n const { fieldMap } = componentMap.collections[collectionSlug]\n\n const collectionConfig = config.collections.find(\n (collectionConfig) => collectionConfig.slug === collectionSlug,\n )\n\n const {\n admin: { defaultColumns, useAsTitle },\n } = collectionConfig\n\n const prevCollection = useRef<SanitizedCollectionConfig['slug']>(collectionSlug)\n const hasInitialized = useRef(false)\n const { getPreference, setPreference } = usePreferences()\n\n const [initialColumns] = useState<ColumnPreferences>(() =>\n getInitialColumns(filterFields(fieldMap), useAsTitle, defaultColumns),\n )\n\n const [tableColumns, dispatchTableColumns] = useReducer(columnReducer, {}, () => {\n return buildColumnState({\n cellProps,\n columnPreferences: listPreferences?.columns,\n columns: initialColumns,\n enableRowSelections,\n fieldMap,\n useAsTitle,\n })\n })\n\n // /////////////////////////////////////\n // Get preferences on collection change\n // /////////////////////////////////////\n\n useEffect(() => {\n const sync = async () => {\n const collectionHasChanged = prevCollection.current !== collectionSlug\n\n if (collectionHasChanged || !listPreferences) {\n const currentPreferences = await getPreference<{\n columns: ColumnPreferences\n }>(preferenceKey)\n prevCollection.current = collectionSlug\n\n if (currentPreferences?.columns) {\n dispatchTableColumns({\n type: 'set',\n payload: {\n columns: buildColumnState({\n cellProps,\n columnPreferences: currentPreferences?.columns,\n columns: initialColumns,\n enableRowSelections: true,\n fieldMap,\n useAsTitle,\n }),\n },\n })\n }\n }\n }\n\n void sync()\n }, [\n preferenceKey,\n getPreference,\n collectionSlug,\n fieldMap,\n cellProps,\n defaultColumns,\n useAsTitle,\n listPreferences,\n initialColumns,\n ])\n\n // /////////////////////////////////////\n // Set preferences on column change\n // /////////////////////////////////////\n\n useEffect(() => {\n if (!hasInitialized.current) {\n hasInitialized.current = true\n return\n }\n\n const columns = tableColumns.map((c) => ({\n accessor: c?.accessor,\n active: c?.active,\n }))\n\n void setPreference(preferenceKey, { columns }, true)\n }, [tableColumns, preferenceKey, setPreference])\n\n const setActiveColumns = useCallback(\n (columns: string[]) => {\n // dispatchTableColumns({\n // type: 'set',\n // payload: {\n // // onSelect,\n // cellProps,\n // collection: { ...collectionConfig, fields: formatFields(collectionConfig) },\n // columns: columns.map((column) => ({\n // accessor: column,\n // active: true,\n // })),\n // i18n,\n // },\n // })\n },\n [collectionConfig, cellProps],\n )\n\n const moveColumn = useCallback(\n (args: { fromIndex: number; toIndex: number }) => {\n const { fromIndex, toIndex } = args\n\n dispatchTableColumns({\n type: 'move',\n payload: {\n fromIndex,\n toIndex,\n },\n })\n },\n [dispatchTableColumns],\n )\n\n const toggleColumn = useCallback(\n (column: string) => {\n dispatchTableColumns({\n type: 'toggle',\n payload: {\n column,\n },\n })\n },\n [dispatchTableColumns],\n )\n\n return (\n <TableColumnContext.Provider\n value={{\n columns: tableColumns,\n dispatchTableColumns,\n moveColumn,\n setActiveColumns,\n toggleColumn,\n }}\n >\n {children}\n </TableColumnContext.Provider>\n )\n}\n"],"names":["React","createContext","useCallback","useContext","useEffect","useReducer","useRef","useState","useComponentMap","useConfig","usePreferences","buildColumnState","columnReducer","filterFields","getInitialColumns","TableColumnContext","useTableColumns","TableColumnsProvider","cellProps","children","collectionSlug","enableRowSelections","listPreferences","preferenceKey","config","componentMap","fieldMap","collections","collectionConfig","find","slug","admin","defaultColumns","useAsTitle","prevCollection","hasInitialized","getPreference","setPreference","initialColumns","tableColumns","dispatchTableColumns","columnPreferences","columns","sync","collectionHasChanged","current","currentPreferences","type","payload","map","c","accessor","active","setActiveColumns","moveColumn","args","fromIndex","toIndex","toggleColumn","column","Provider","value"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"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"}
1
+ {"version":3,"sources":["../../../src/elements/TableColumns/index.tsx"],"sourcesContent":["'use client'\nimport type { CellComponentProps, SanitizedCollectionConfig } from 'payload/types'\n\nimport React, { createContext, useCallback, useContext, useState } from 'react'\n\nimport type { ColumnPreferences } from '../../providers/ListInfo/index.js'\nimport type { Column } from '../Table/index.js'\n\nimport { useComponentMap } from '../../providers/ComponentMap/index.js'\nimport { useConfig } from '../../providers/Config/index.js'\nimport { usePreferences } from '../../providers/Preferences/index.js'\nimport { buildColumnState } from './buildColumnState.js'\nimport { filterFields } from './filterFields.js'\nimport { getInitialColumns } from './getInitialColumns.js'\n\nexport interface ITableColumns {\n columns: Column[]\n moveColumn: (args: { fromIndex: number; toIndex: number }) => void\n setActiveColumns: (columns: string[]) => void\n toggleColumn: (column: string) => void\n}\n\nexport const TableColumnContext = createContext<ITableColumns>({} as ITableColumns)\n\nexport const useTableColumns = (): ITableColumns => useContext(TableColumnContext)\n\nexport type ListPreferences = {\n columns: ColumnPreferences\n}\n\ntype Props = {\n cellProps?: Partial<CellComponentProps>[]\n children: React.ReactNode\n collectionSlug: string\n enableRowSelections?: boolean\n listPreferences?: ListPreferences\n preferenceKey: string\n}\n\nexport const TableColumnsProvider: React.FC<Props> = ({\n cellProps,\n children,\n collectionSlug,\n enableRowSelections = false,\n listPreferences,\n preferenceKey,\n}) => {\n const config = useConfig()\n\n const { componentMap } = useComponentMap()\n\n const { fieldMap } = componentMap.collections[collectionSlug]\n\n const collectionConfig = config.collections.find(\n (collectionConfig) => collectionConfig.slug === collectionSlug,\n )\n\n const {\n admin: { defaultColumns, useAsTitle },\n } = collectionConfig\n\n const prevCollection = React.useRef<SanitizedCollectionConfig['slug']>(collectionSlug)\n const { getPreference, setPreference } = usePreferences()\n\n const [initialColumns] = useState<ColumnPreferences>(() =>\n getInitialColumns(filterFields(fieldMap), useAsTitle, defaultColumns),\n )\n\n const [tableColumns, setTableColumns] = React.useState(() =>\n buildColumnState({\n cellProps,\n columnPreferences: listPreferences?.columns,\n columns: initialColumns,\n enableRowSelections,\n fieldMap,\n useAsTitle,\n }),\n )\n\n const updateColumnPreferences = React.useCallback(\n (newColumns: Column[]) => {\n const columns = newColumns.map((c) => ({\n accessor: c?.accessor,\n active: c?.active,\n }))\n\n void setPreference(preferenceKey, { columns }, true)\n },\n [preferenceKey, setPreference],\n )\n\n const reassignLinkColumn = (columns: Column[]): Column[] => {\n let foundFirstActive = false\n const newColumns = columns.map((col) => {\n const linkColumn = col.active && !foundFirstActive && col.accessor !== '_select'\n if (linkColumn) foundFirstActive = true\n\n return {\n ...col,\n cellProps: {\n ...col.cellProps,\n link: linkColumn,\n },\n }\n })\n\n return newColumns\n }\n\n const moveColumn = useCallback(\n (args: { fromIndex: number; toIndex: number }) => {\n const { fromIndex, toIndex } = args\n\n const withMovedColumn = [...tableColumns]\n const [columnToMove] = withMovedColumn.splice(fromIndex, 1)\n withMovedColumn.splice(toIndex, 0, columnToMove)\n\n const newColumns = reassignLinkColumn(withMovedColumn)\n setTableColumns(newColumns)\n updateColumnPreferences(newColumns)\n },\n [tableColumns, updateColumnPreferences],\n )\n\n const toggleColumn = useCallback(\n (column: string) => {\n const toggledColumns = tableColumns.map((col) => {\n return {\n ...col,\n active: col?.name === column ? !col.active : col.active,\n }\n })\n\n const newColumns = reassignLinkColumn(toggledColumns)\n setTableColumns(newColumns)\n updateColumnPreferences(newColumns)\n },\n [tableColumns, updateColumnPreferences],\n )\n\n const setActiveColumns = React.useCallback(\n (activeColumnAccessors) => {\n const activeColumns = tableColumns.map((col) => {\n return {\n ...col,\n active: activeColumnAccessors.includes(col.accessor),\n }\n })\n\n const newColumns = reassignLinkColumn(activeColumns)\n updateColumnPreferences(newColumns)\n },\n [tableColumns, updateColumnPreferences],\n )\n\n // //////////////////////////////////////////////\n // Get preferences on collection change (drawers)\n // //////////////////////////////////////////////\n\n React.useEffect(() => {\n const sync = async () => {\n const collectionHasChanged = prevCollection.current !== collectionSlug\n\n if (collectionHasChanged || !listPreferences) {\n const currentPreferences = await getPreference<{\n columns: ColumnPreferences\n }>(preferenceKey)\n prevCollection.current = collectionSlug\n\n if (currentPreferences?.columns) {\n setTableColumns(\n buildColumnState({\n cellProps,\n columnPreferences: currentPreferences?.columns,\n columns: initialColumns,\n enableRowSelections: true,\n fieldMap,\n useAsTitle,\n }),\n )\n }\n }\n }\n\n void sync()\n }, [\n preferenceKey,\n getPreference,\n collectionSlug,\n fieldMap,\n cellProps,\n defaultColumns,\n useAsTitle,\n listPreferences,\n initialColumns,\n ])\n\n return (\n <TableColumnContext.Provider\n value={{\n columns: tableColumns,\n moveColumn,\n setActiveColumns,\n toggleColumn,\n }}\n >\n {children}\n </TableColumnContext.Provider>\n )\n}\n"],"names":["React","createContext","useCallback","useContext","useState","useComponentMap","useConfig","usePreferences","buildColumnState","filterFields","getInitialColumns","TableColumnContext","useTableColumns","TableColumnsProvider","cellProps","children","collectionSlug","enableRowSelections","listPreferences","preferenceKey","config","componentMap","fieldMap","collections","collectionConfig","find","slug","admin","defaultColumns","useAsTitle","prevCollection","useRef","getPreference","setPreference","initialColumns","tableColumns","setTableColumns","columnPreferences","columns","updateColumnPreferences","newColumns","map","c","accessor","active","reassignLinkColumn","foundFirstActive","col","linkColumn","link","moveColumn","args","fromIndex","toIndex","withMovedColumn","columnToMove","splice","toggleColumn","column","toggledColumns","name","setActiveColumns","activeColumnAccessors","activeColumns","includes","useEffect","sync","collectionHasChanged","current","currentPreferences","Provider","value"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"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"}
@@ -287,7 +287,7 @@ export const RelationshipField = (props)=>{
287
287
  onChange(null);
288
288
  return;
289
289
  }
290
- if (hasMany) {
290
+ if (hasMany && Array.isArray(selected)) {
291
291
  onChange(selected ? selected.map((option)=>{
292
292
  if (hasMultipleRelations) {
293
293
  return {
@@ -297,12 +297,12 @@ export const RelationshipField = (props)=>{
297
297
  }
298
298
  return option?.value;
299
299
  }) : null);
300
- } else if (hasMultipleRelations) {
300
+ } else if (hasMultipleRelations && !Array.isArray(selected)) {
301
301
  onChange({
302
302
  relationTo: selected?.relationTo,
303
303
  value: selected?.value
304
304
  });
305
- } else {
305
+ } else if (!Array.isArray(selected)) {
306
306
  onChange(selected?.value);
307
307
  }
308
308
  },
@@ -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'\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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"}
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 && Array.isArray(selected)) {\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 && !Array.isArray(selected)) {\n onChange({\n relationTo: selected?.relationTo,\n value: selected?.value,\n })\n } else if (!Array.isArray(selected)) {\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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"}
@@ -11,7 +11,7 @@ export type Props = {
11
11
  fieldName: string;
12
12
  fields: FieldCondition[];
13
13
  initialValue: string;
14
- operator: string;
14
+ operator: Operator;
15
15
  orIndex: number;
16
16
  removeCondition: ({ andIndex, orIndex }: {
17
17
  andIndex: number;
@@ -25,6 +25,7 @@ export type Props = {
25
25
  value: string;
26
26
  }) => void;
27
27
  };
28
+ import type { Operator } from 'payload/types';
28
29
  import './index.scss';
29
30
  export declare const Condition: React.FC<Props>;
30
31
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/elements/WhereBuilder/Condition/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAA8B,MAAM,OAAO,CAAA;AAElD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAEjD,MAAM,MAAM,KAAK,GAAG;IAClB,YAAY,EAAE,CAAC,EACb,QAAQ,EACR,SAAS,EACT,OAAO,EACP,QAAQ,GACT,EAAE;QACD,QAAQ,EAAE,MAAM,CAAA;QAChB,SAAS,EAAE,MAAM,CAAA;QACjB,OAAO,EAAE,MAAM,CAAA;QACf,QAAQ,EAAE,KAAK,GAAG,IAAI,CAAA;KACvB,KAAK,IAAI,CAAA;IACV,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,EAAE,cAAc,EAAE,CAAA;IACxB,YAAY,EAAE,MAAM,CAAA;IACpB,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;IACf,eAAe,EAAE,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAA;IACvF,eAAe,EAAE,CAAC,EAChB,QAAQ,EACR,SAAS,EACT,QAAQ,EACR,OAAO,EACP,KAAK,GACN,EAAE;QACD,QAAQ,EAAE,MAAM,CAAA;QAChB,SAAS,EAAE,MAAM,CAAA;QACjB,QAAQ,EAAE,MAAM,CAAA;QAChB,OAAO,EAAE,MAAM,CAAA;QACf,KAAK,EAAE,MAAM,CAAA;KACd,KAAK,IAAI,CAAA;CACX,CAAA;AAWD,OAAO,cAAc,CAAA;AAarB,eAAO,MAAM,SAAS,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,CAgJrC,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/elements/WhereBuilder/Condition/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAA8B,MAAM,OAAO,CAAA;AAElD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAEjD,MAAM,MAAM,KAAK,GAAG;IAClB,YAAY,EAAE,CAAC,EACb,QAAQ,EACR,SAAS,EACT,OAAO,EACP,QAAQ,GACT,EAAE;QACD,QAAQ,EAAE,MAAM,CAAA;QAChB,SAAS,EAAE,MAAM,CAAA;QACjB,OAAO,EAAE,MAAM,CAAA;QACf,QAAQ,EAAE,KAAK,GAAG,IAAI,CAAA;KACvB,KAAK,IAAI,CAAA;IACV,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,EAAE,cAAc,EAAE,CAAA;IACxB,YAAY,EAAE,MAAM,CAAA;IACpB,QAAQ,EAAE,QAAQ,CAAA;IAClB,OAAO,EAAE,MAAM,CAAA;IACf,eAAe,EAAE,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAA;IACvF,eAAe,EAAE,CAAC,EAChB,QAAQ,EACR,SAAS,EACT,QAAQ,EACR,OAAO,EACP,KAAK,GACN,EAAE;QACD,QAAQ,EAAE,MAAM,CAAA;QAChB,SAAS,EAAE,MAAM,CAAA;QACjB,QAAQ,EAAE,MAAM,CAAA;QAChB,OAAO,EAAE,MAAM,CAAA;QACf,KAAK,EAAE,MAAM,CAAA;KACd,KAAK,IAAI,CAAA;CACX,CAAA;AAED,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAa7C,OAAO,cAAc,CAAA;AAarB,eAAO,MAAM,SAAS,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,CAgJrC,CAAA"}
@@ -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 || 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
+ {"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: Operator\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 type { Operator } from 'payload/types'\n\nimport type { Option } from '../../ReactSelect/index.js'\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>(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: Option) => {\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: Option<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,CA4NpD,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/elements/WhereBuilder/index.tsx"],"names":[],"mappings":"AAIA,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"}
@@ -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(\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
+ {"version":3,"sources":["../../../src/elements/WhereBuilder/index.tsx"],"sourcesContent":["'use client'\nimport type { Operator } from 'payload/types'\n\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] as Operator) || 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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"}
@@ -76,7 +76,7 @@ export const _ArrayField = (props)=>{
76
76
  const { path: pathFromContext } = useFieldProps();
77
77
  const { errorPaths, formInitializing, formProcessing, path, rows = [], schemaPath, showError, valid, value } = useField({
78
78
  hasRows: true,
79
- path: pathFromContext || pathFromProps || name,
79
+ path: pathFromContext ?? pathFromProps ?? name,
80
80
  validate: memoizedValidate
81
81
  });
82
82
  const disabled = readOnlyFromProps || readOnlyFromContext || formProcessing || formInitializing;
@@ -287,7 +287,7 @@ export const _ArrayField = (props)=>{
287
287
  type: "error",
288
288
  children: t('validation:requiresAtLeast', {
289
289
  count: minRows,
290
- label: getTranslation(minRows > 1 ? labels.plural : labels.singular, i18n) || t(minRows > 1 ? 'general:row' : 'general:rows')
290
+ label: getTranslation(minRows > 1 ? labels.plural : labels.singular, i18n) || t(minRows > 1 ? 'general:rows' : 'general:row')
291
291
  })
292
292
  })
293
293
  ]