@payloadcms/ui 3.60.0-internal.c277fd4 → 3.60.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/elements/GroupByBuilder/index.d.ts.map +1 -1
- package/dist/elements/GroupByBuilder/index.js +7 -1
- package/dist/elements/GroupByBuilder/index.js.map +1 -1
- package/dist/elements/Link/index.d.ts +27 -2
- package/dist/elements/Link/index.d.ts.map +1 -1
- package/dist/elements/WhereBuilder/index.d.ts.map +1 -1
- package/dist/elements/WhereBuilder/index.js +8 -1
- package/dist/elements/WhereBuilder/index.js.map +1 -1
- package/dist/exports/client/index.js +12 -12
- package/dist/exports/client/index.js.map +3 -3
- package/dist/providers/TableColumns/buildColumnState/filterFieldsWithPermissions.d.ts +6 -0
- package/dist/providers/TableColumns/buildColumnState/filterFieldsWithPermissions.d.ts.map +1 -0
- package/dist/providers/TableColumns/buildColumnState/filterFieldsWithPermissions.js +56 -0
- package/dist/providers/TableColumns/buildColumnState/filterFieldsWithPermissions.js.map +1 -0
- package/dist/providers/TableColumns/buildColumnState/index.d.ts +2 -1
- package/dist/providers/TableColumns/buildColumnState/index.d.ts.map +1 -1
- package/dist/providers/TableColumns/buildColumnState/index.js +10 -3
- package/dist/providers/TableColumns/buildColumnState/index.js.map +1 -1
- package/dist/utilities/buildTableState.js +7 -2
- package/dist/utilities/buildTableState.js.map +1 -1
- package/dist/utilities/getColumns.d.ts +3 -2
- package/dist/utilities/getColumns.d.ts.map +1 -1
- package/dist/utilities/getColumns.js +11 -4
- package/dist/utilities/getColumns.js.map +1 -1
- package/dist/utilities/reduceFieldsToOptions.d.ts +3 -2
- package/dist/utilities/reduceFieldsToOptions.d.ts.map +1 -1
- package/dist/utilities/reduceFieldsToOptions.js +38 -29
- package/dist/utilities/reduceFieldsToOptions.js.map +1 -1
- package/dist/utilities/renderTable.d.ts +3 -2
- package/dist/utilities/renderTable.d.ts.map +1 -1
- package/dist/utilities/renderTable.js +11 -3
- package/dist/utilities/renderTable.js.map +1 -1
- package/package.json +6 -6
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/elements/GroupByBuilder/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAS,yBAAyB,EAAE,MAAM,SAAS,CAAA;AAE5E,OAAO,cAAc,CAAA;AAErB,OAAO,KAAkB,MAAM,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/elements/GroupByBuilder/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAS,yBAAyB,EAAE,MAAM,SAAS,CAAA;AAE5E,OAAO,cAAc,CAAA;AAErB,OAAO,KAAkB,MAAM,OAAO,CAAA;AAStC,MAAM,MAAM,KAAK,GAAG;IAClB,QAAQ,CAAC,cAAc,EAAE,yBAAyB,CAAC,MAAM,CAAC,CAAA;IAC1D,MAAM,EAAE,WAAW,EAAE,CAAA;CACtB,CAAA;AAyBD,eAAO,MAAM,cAAc,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,CAiH1C,CAAA"}
|
|
@@ -4,6 +4,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
4
4
|
import './index.scss';
|
|
5
5
|
import React, { useMemo } from 'react';
|
|
6
6
|
import { SelectInput } from '../../fields/Select/Input.js';
|
|
7
|
+
import { useAuth } from '../../providers/Auth/index.js';
|
|
7
8
|
import { useListQuery } from '../../providers/ListQuery/index.js';
|
|
8
9
|
import { useTranslation } from '../../providers/Translation/index.js';
|
|
9
10
|
import { reduceFieldsToOptions } from '../../utilities/reduceFieldsToOptions.js';
|
|
@@ -25,10 +26,15 @@ export const GroupByBuilder = ({
|
|
|
25
26
|
i18n,
|
|
26
27
|
t
|
|
27
28
|
} = useTranslation();
|
|
29
|
+
const {
|
|
30
|
+
permissions
|
|
31
|
+
} = useAuth();
|
|
32
|
+
const fieldPermissions = permissions?.collections?.[collectionSlug]?.fields;
|
|
28
33
|
const reducedFields = useMemo(() => reduceFieldsToOptions({
|
|
34
|
+
fieldPermissions,
|
|
29
35
|
fields,
|
|
30
36
|
i18n
|
|
31
|
-
}), [fields, i18n]);
|
|
37
|
+
}), [fields, fieldPermissions, i18n]);
|
|
32
38
|
const {
|
|
33
39
|
query,
|
|
34
40
|
refineListData
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["React","useMemo","SelectInput","useListQuery","useTranslation","reduceFieldsToOptions","ReactSelect","baseClass","supportedFieldTypes","GroupByBuilder","collectionSlug","fields","i18n","t","reducedFields","query","refineListData","groupByFieldName","groupBy","replace","groupByField","find","field","value","_jsxs","className","_jsx","label","id","onClick","type","filterOption","option","inputValue","data","plainTextLabel","toLowerCase","includes","isClearable","isMulti","onChange","v","undefined","page","startsWith","options","filter","admin","disableGroupBy","name","path","readOnly"],"sources":["../../../src/elements/GroupByBuilder/index.tsx"],"sourcesContent":["'use client'\nimport type { ClientField, Field, SanitizedCollectionConfig } from 'payload'\n\nimport './index.scss'\n\nimport React, { useMemo } from 'react'\n\nimport { SelectInput } from '../../fields/Select/Input.js'\nimport { useListQuery } from '../../providers/ListQuery/index.js'\nimport { useTranslation } from '../../providers/Translation/index.js'\nimport { reduceFieldsToOptions } from '../../utilities/reduceFieldsToOptions.js'\nimport { ReactSelect } from '../ReactSelect/index.js'\n\nexport type Props = {\n readonly collectionSlug: SanitizedCollectionConfig['slug']\n fields: ClientField[]\n}\n\nconst baseClass = 'group-by-builder'\n\n/**\n * Note: Some fields are already omitted from the list of fields:\n * - fields with nested field, e.g. `tabs`, `groups`, etc.\n * - fields that don't affect data, i.e. `row`, `collapsible`, `ui`, etc.\n * So we don't technically need to omit them here, but do anyway.\n * But some remaining fields still need an additional check, e.g. `richText`, etc.\n */\nconst supportedFieldTypes: Field['type'][] = [\n 'text',\n 'textarea',\n 'number',\n 'select',\n 'relationship',\n 'date',\n 'checkbox',\n 'radio',\n 'email',\n 'number',\n 'upload',\n]\n\nexport const GroupByBuilder: React.FC<Props> = ({ collectionSlug, fields }) => {\n const { i18n, t } = useTranslation()\n\n const reducedFields = useMemo(()
|
|
1
|
+
{"version":3,"file":"index.js","names":["React","useMemo","SelectInput","useAuth","useListQuery","useTranslation","reduceFieldsToOptions","ReactSelect","baseClass","supportedFieldTypes","GroupByBuilder","collectionSlug","fields","i18n","t","permissions","fieldPermissions","collections","reducedFields","query","refineListData","groupByFieldName","groupBy","replace","groupByField","find","field","value","_jsxs","className","_jsx","label","id","onClick","type","filterOption","option","inputValue","data","plainTextLabel","toLowerCase","includes","isClearable","isMulti","onChange","v","undefined","page","startsWith","options","filter","admin","disableGroupBy","name","path","readOnly"],"sources":["../../../src/elements/GroupByBuilder/index.tsx"],"sourcesContent":["'use client'\nimport type { ClientField, Field, SanitizedCollectionConfig } from 'payload'\n\nimport './index.scss'\n\nimport React, { useMemo } from 'react'\n\nimport { SelectInput } from '../../fields/Select/Input.js'\nimport { useAuth } from '../../providers/Auth/index.js'\nimport { useListQuery } from '../../providers/ListQuery/index.js'\nimport { useTranslation } from '../../providers/Translation/index.js'\nimport { reduceFieldsToOptions } from '../../utilities/reduceFieldsToOptions.js'\nimport { ReactSelect } from '../ReactSelect/index.js'\n\nexport type Props = {\n readonly collectionSlug: SanitizedCollectionConfig['slug']\n fields: ClientField[]\n}\n\nconst baseClass = 'group-by-builder'\n\n/**\n * Note: Some fields are already omitted from the list of fields:\n * - fields with nested field, e.g. `tabs`, `groups`, etc.\n * - fields that don't affect data, i.e. `row`, `collapsible`, `ui`, etc.\n * So we don't technically need to omit them here, but do anyway.\n * But some remaining fields still need an additional check, e.g. `richText`, etc.\n */\nconst supportedFieldTypes: Field['type'][] = [\n 'text',\n 'textarea',\n 'number',\n 'select',\n 'relationship',\n 'date',\n 'checkbox',\n 'radio',\n 'email',\n 'number',\n 'upload',\n]\n\nexport const GroupByBuilder: React.FC<Props> = ({ collectionSlug, fields }) => {\n const { i18n, t } = useTranslation()\n const { permissions } = useAuth()\n\n const fieldPermissions = permissions?.collections?.[collectionSlug]?.fields\n\n const reducedFields = useMemo(\n () =>\n reduceFieldsToOptions({\n fieldPermissions,\n fields,\n i18n,\n }),\n [fields, fieldPermissions, i18n],\n )\n\n const { query, refineListData } = useListQuery()\n\n const groupByFieldName = query.groupBy?.replace(/^-/, '')\n\n const groupByField = reducedFields.find((field) => field.value === groupByFieldName)\n\n return (\n <div className={baseClass}>\n <div className={`${baseClass}__header`}>\n <p>\n {t('general:groupByLabel', {\n label: '',\n })}\n </p>\n {query.groupBy && (\n <button\n className={`${baseClass}__clear-button`}\n id=\"group-by--reset\"\n onClick={async () => {\n await refineListData({\n groupBy: '',\n })\n }}\n type=\"button\"\n >\n {t('general:clear')}\n </button>\n )}\n </div>\n <div className={`${baseClass}__inputs`}>\n <ReactSelect\n filterOption={(option, inputValue) =>\n ((option?.data?.plainTextLabel as string) || option.label)\n .toLowerCase()\n .includes(inputValue.toLowerCase())\n }\n id=\"group-by--field-select\"\n isClearable\n isMulti={false}\n onChange={async (v: { value: string } | null) => {\n const value = v === null ? undefined : v.value\n\n // value is being cleared\n if (v === null) {\n await refineListData({\n groupBy: '',\n page: 1,\n })\n }\n\n await refineListData({\n groupBy: value ? (query.groupBy?.startsWith('-') ? `-${value}` : value) : undefined,\n page: 1,\n })\n }}\n options={reducedFields.filter(\n (field) =>\n !field.field.admin.disableGroupBy &&\n field.value !== 'id' &&\n supportedFieldTypes.includes(field.field.type),\n )}\n value={{\n label: groupByField?.label || t('general:selectValue'),\n value: groupByFieldName || '',\n }}\n />\n <SelectInput\n id=\"group-by--sort\"\n isClearable={false}\n name=\"direction\"\n onChange={async ({ value }: { value: string }) => {\n if (!groupByFieldName) {\n return\n }\n\n await refineListData({\n groupBy: value === 'asc' ? groupByFieldName : `-${groupByFieldName}`,\n page: 1,\n })\n }}\n options={[\n { label: t('general:ascending'), value: 'asc' },\n { label: t('general:descending'), value: 'desc' },\n ]}\n path=\"direction\"\n readOnly={!groupByFieldName}\n value={\n !query.groupBy\n ? 'asc'\n : typeof query.groupBy === 'string'\n ? `${query.groupBy.startsWith('-') ? 'desc' : 'asc'}`\n : ''\n }\n />\n </div>\n </div>\n )\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,6 +1,31 @@
|
|
|
1
|
-
import NextLinkImport from 'next/link.js';
|
|
2
1
|
import React from 'react';
|
|
3
|
-
declare const NextLink: React.ForwardRefExoticComponent<Omit<React.AnchorHTMLAttributes<HTMLAnchorElement>, keyof
|
|
2
|
+
declare const NextLink: React.ForwardRefExoticComponent<Omit<React.AnchorHTMLAttributes<HTMLAnchorElement>, keyof {
|
|
3
|
+
href: string | import("url").UrlObject;
|
|
4
|
+
as?: string | import("url").UrlObject;
|
|
5
|
+
replace?: boolean;
|
|
6
|
+
scroll?: boolean;
|
|
7
|
+
shallow?: boolean;
|
|
8
|
+
passHref?: boolean;
|
|
9
|
+
prefetch?: boolean | null;
|
|
10
|
+
locale?: string | false;
|
|
11
|
+
legacyBehavior?: boolean;
|
|
12
|
+
onMouseEnter?: React.MouseEventHandler<HTMLAnchorElement>;
|
|
13
|
+
onTouchStart?: React.TouchEventHandler<HTMLAnchorElement>;
|
|
14
|
+
onClick?: React.MouseEventHandler<HTMLAnchorElement>;
|
|
15
|
+
}> & {
|
|
16
|
+
href: string | import("url").UrlObject;
|
|
17
|
+
as?: string | import("url").UrlObject;
|
|
18
|
+
replace?: boolean;
|
|
19
|
+
scroll?: boolean;
|
|
20
|
+
shallow?: boolean;
|
|
21
|
+
passHref?: boolean;
|
|
22
|
+
prefetch?: boolean | null;
|
|
23
|
+
locale?: string | false;
|
|
24
|
+
legacyBehavior?: boolean;
|
|
25
|
+
onMouseEnter?: React.MouseEventHandler<HTMLAnchorElement>;
|
|
26
|
+
onTouchStart?: React.TouchEventHandler<HTMLAnchorElement>;
|
|
27
|
+
onClick?: React.MouseEventHandler<HTMLAnchorElement>;
|
|
28
|
+
} & {
|
|
4
29
|
children?: React.ReactNode | undefined;
|
|
5
30
|
} & React.RefAttributes<HTMLAnchorElement>>;
|
|
6
31
|
type Props = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/elements/Link/index.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/elements/Link/index.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,MAAM,OAAO,CAAA;AAKzB,QAAA,MAAM,QAAQ;;;;;;;;;;mBAyEsgD,MAAO,iBAAiB;mBAA+G,MAAO,iBAAiB;cAA0G,MAAO,iBAAiB;;;;;;;;;;;mBAAjS,MAAO,iBAAiB;mBAA+G,MAAO,iBAAiB;cAA0G,MAAO,iBAAiB;;eAAopB,MAAO,SAAS;2CAzEn4E,CAAA;AAgBtF,KAAK,KAAK,GAAG;IACX;;;;OAIG;IACH,cAAc,CAAC,EAAE,OAAO,CAAA;CACzB,GAAG,UAAU,CAAC,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAA;AAElC,eAAO,MAAM,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,CA+ChC,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/elements/WhereBuilder/index.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAkB,MAAM,OAAO,CAAA;AAEtC,OAAO,KAAK,EAAkD,iBAAiB,EAAE,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/elements/WhereBuilder/index.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAkB,MAAM,OAAO,CAAA;AAEtC,OAAO,KAAK,EAAkD,iBAAiB,EAAE,MAAM,YAAY,CAAA;AASnG,OAAO,cAAc,CAAA;AAIrB,OAAO,EAAE,iBAAiB,EAAE,CAAA;AAE5B;;;GAGG;AACH,eAAO,MAAM,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC,iBAAiB,CAkNpD,CAAA"}
|
|
@@ -4,6 +4,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
4
4
|
import { getTranslation } from '@payloadcms/translations';
|
|
5
5
|
import { transformWhereQuery, validateWhereQuery } from 'payload/shared';
|
|
6
6
|
import React, { useMemo } from 'react';
|
|
7
|
+
import { useAuth } from '../../providers/Auth/index.js';
|
|
7
8
|
import { useListQuery } from '../../providers/ListQuery/index.js';
|
|
8
9
|
import { useTranslation } from '../../providers/Translation/index.js';
|
|
9
10
|
import { reduceFieldsToOptions } from '../../utilities/reduceFieldsToOptions.js';
|
|
@@ -19,6 +20,7 @@ const baseClass = 'where-builder';
|
|
|
19
20
|
export const WhereBuilder = props => {
|
|
20
21
|
const {
|
|
21
22
|
collectionPluralLabel,
|
|
23
|
+
collectionSlug,
|
|
22
24
|
fields,
|
|
23
25
|
renderedFilters,
|
|
24
26
|
resolvedFilterOptions
|
|
@@ -27,10 +29,15 @@ export const WhereBuilder = props => {
|
|
|
27
29
|
i18n,
|
|
28
30
|
t
|
|
29
31
|
} = useTranslation();
|
|
32
|
+
const {
|
|
33
|
+
permissions
|
|
34
|
+
} = useAuth();
|
|
35
|
+
const fieldPermissions = permissions?.collections?.[collectionSlug]?.fields;
|
|
30
36
|
const reducedFields = useMemo(() => reduceFieldsToOptions({
|
|
37
|
+
fieldPermissions,
|
|
31
38
|
fields,
|
|
32
39
|
i18n
|
|
33
|
-
}), [fields, i18n]);
|
|
40
|
+
}), [fieldPermissions, fields, i18n]);
|
|
34
41
|
const {
|
|
35
42
|
handleWhereChange,
|
|
36
43
|
query
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["getTranslation","transformWhereQuery","validateWhereQuery","React","useMemo","useListQuery","useTranslation","reduceFieldsToOptions","Button","Condition","fieldTypes","baseClass","WhereBuilder","props","collectionPluralLabel","fields","renderedFilters","resolvedFilterOptions","i18n","t","reducedFields","handleWhereChange","query","conditions","whereFromSearch","where","or","transformedWhere","console","warn","JSON","stringify","addCondition","useCallback","andIndex","field","orIndex","relation","newConditions","defaultOperator","type","operators","value","and","splice","String","undefined","push","updateCondition","operator","incomingOperator","valueArg","existingCondition","defaults","valueChanged","operatorChanged","Object","keys","newRowCondition","removeCondition","length","_jsxs","className","Fragment","_jsx","label","map","compoundOrKey","Array","isArray","_","condition","fieldPath","filterOptions","get","RenderedFilter","buttonStyle","icon","iconPosition","iconStyle","onClick","find","admin","disableListFilter"],"sources":["../../../src/elements/WhereBuilder/index.tsx"],"sourcesContent":["'use client'\nimport type { Operator } from 'payload'\n\nimport { getTranslation } from '@payloadcms/translations'\nimport { transformWhereQuery, validateWhereQuery } from 'payload/shared'\nimport React, { useMemo } from 'react'\n\nimport type { AddCondition, RemoveCondition, UpdateCondition, WhereBuilderProps } from './types.js'\n\nimport { useListQuery } from '../../providers/ListQuery/index.js'\nimport { useTranslation } from '../../providers/Translation/index.js'\nimport { reduceFieldsToOptions } from '../../utilities/reduceFieldsToOptions.js'\nimport { Button } from '../Button/index.js'\nimport { Condition } from './Condition/index.js'\nimport fieldTypes from './field-types.js'\nimport './index.scss'\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, fields, renderedFilters, resolvedFilterOptions } = props\n const { i18n, t } = useTranslation()\n\n const reducedFields = useMemo(() => reduceFieldsToOptions({ fields, i18n }), [fields, i18n])\n\n const { handleWhereChange, query } = useListQuery()\n\n const conditions = useMemo(() => {\n const whereFromSearch = query.where\n\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)}`) // eslint-disable-line no-console\n }\n\n return []\n }, [query.where])\n\n const addCondition: AddCondition = React.useCallback(\n async ({ andIndex, field, orIndex, relation }) => {\n const newConditions = [...conditions]\n\n const defaultOperator = fieldTypes[field.field.type].operators[0].value\n\n if (relation === 'and') {\n newConditions[orIndex].and.splice(andIndex, 0, {\n [String(field.value)]: {\n [defaultOperator]: undefined,\n },\n })\n } else {\n newConditions.push({\n and: [\n {\n [String(field.value)]: {\n [defaultOperator]: undefined,\n },\n },\n ],\n })\n }\n\n await handleWhereChange({ or: newConditions })\n },\n [conditions, handleWhereChange],\n )\n\n const updateCondition: UpdateCondition = React.useCallback(\n async ({ andIndex, field, operator: incomingOperator, orIndex, value: valueArg }) => {\n const existingCondition = conditions[orIndex].and[andIndex]\n\n const defaults = fieldTypes[field.field.type]\n const operator = incomingOperator || defaults.operators[0].value\n\n if (typeof existingCondition === 'object' && field.value) {\n const value = valueArg ?? existingCondition?.[operator]\n\n const valueChanged = value !== existingCondition?.[String(field.value)]?.[String(operator)]\n\n const operatorChanged =\n operator !== Object.keys(existingCondition?.[String(field.value)] || {})?.[0]\n\n if (valueChanged || operatorChanged) {\n const newRowCondition = {\n [String(field.value)]: { [operator]: value },\n }\n\n const newConditions = [...conditions]\n newConditions[orIndex].and[andIndex] = newRowCondition\n\n await handleWhereChange({ or: newConditions })\n }\n }\n },\n [conditions, handleWhereChange],\n )\n\n const removeCondition: RemoveCondition = React.useCallback(\n async ({ andIndex, orIndex }) => {\n const newConditions = [...conditions]\n newConditions[orIndex].and.splice(andIndex, 1)\n\n if (newConditions[orIndex].and.length === 0) {\n newConditions.splice(orIndex, 1)\n }\n\n await handleWhereChange({ or: newConditions })\n },\n [conditions, handleWhereChange],\n )\n\n return (\n <div className={baseClass}>\n {conditions.length > 0 && (\n <React.Fragment>\n <p className={`${baseClass}__label`}>\n {t('general:filterWhere', { label: getTranslation(collectionPluralLabel, i18n) })}\n </p>\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 condition = conditions[orIndex].and[andIndex]\n const fieldPath = Object.keys(condition)[0]\n\n const operator =\n (Object.keys(condition?.[fieldPath] || {})?.[0] as Operator) || undefined\n\n const value = condition?.[fieldPath]?.[operator] || undefined\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 fieldPath={fieldPath}\n filterOptions={resolvedFilterOptions?.get(fieldPath)}\n operator={operator}\n orIndex={orIndex}\n reducedFields={reducedFields}\n removeCondition={removeCondition}\n RenderedFilter={renderedFilters?.get(fieldPath)}\n updateCondition={updateCondition}\n value={value}\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={async () => {\n await addCondition({\n andIndex: 0,\n field: reducedFields.find((field) => !field.field.admin?.disableListFilter),\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={async () => {\n if (reducedFields.length > 0) {\n await addCondition({\n andIndex: 0,\n field: reducedFields.find((field) => !field.field.admin?.disableListFilter),\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"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"index.js","names":["getTranslation","transformWhereQuery","validateWhereQuery","React","useMemo","useAuth","useListQuery","useTranslation","reduceFieldsToOptions","Button","Condition","fieldTypes","baseClass","WhereBuilder","props","collectionPluralLabel","collectionSlug","fields","renderedFilters","resolvedFilterOptions","i18n","t","permissions","fieldPermissions","collections","reducedFields","handleWhereChange","query","conditions","whereFromSearch","where","or","transformedWhere","console","warn","JSON","stringify","addCondition","useCallback","andIndex","field","orIndex","relation","newConditions","defaultOperator","type","operators","value","and","splice","String","undefined","push","updateCondition","operator","incomingOperator","valueArg","existingCondition","defaults","valueChanged","operatorChanged","Object","keys","newRowCondition","removeCondition","length","_jsxs","className","Fragment","_jsx","label","map","compoundOrKey","Array","isArray","_","condition","fieldPath","filterOptions","get","RenderedFilter","buttonStyle","icon","iconPosition","iconStyle","onClick","find","admin","disableListFilter"],"sources":["../../../src/elements/WhereBuilder/index.tsx"],"sourcesContent":["'use client'\nimport type { Operator } from 'payload'\n\nimport { getTranslation } from '@payloadcms/translations'\nimport { transformWhereQuery, validateWhereQuery } from 'payload/shared'\nimport React, { useMemo } from 'react'\n\nimport type { AddCondition, RemoveCondition, UpdateCondition, WhereBuilderProps } from './types.js'\n\nimport { useAuth } from '../../providers/Auth/index.js'\nimport { useListQuery } from '../../providers/ListQuery/index.js'\nimport { useTranslation } from '../../providers/Translation/index.js'\nimport { reduceFieldsToOptions } from '../../utilities/reduceFieldsToOptions.js'\nimport { Button } from '../Button/index.js'\nimport { Condition } from './Condition/index.js'\nimport fieldTypes from './field-types.js'\nimport './index.scss'\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, collectionSlug, fields, renderedFilters, resolvedFilterOptions } =\n props\n const { i18n, t } = useTranslation()\n const { permissions } = useAuth()\n\n const fieldPermissions = permissions?.collections?.[collectionSlug]?.fields\n\n const reducedFields = useMemo(\n () =>\n reduceFieldsToOptions({\n fieldPermissions,\n fields,\n i18n,\n }),\n [fieldPermissions, fields, i18n],\n )\n\n const { handleWhereChange, query } = useListQuery()\n\n const conditions = useMemo(() => {\n const whereFromSearch = query.where\n\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)}`) // eslint-disable-line no-console\n }\n\n return []\n }, [query.where])\n\n const addCondition: AddCondition = React.useCallback(\n async ({ andIndex, field, orIndex, relation }) => {\n const newConditions = [...conditions]\n\n const defaultOperator = fieldTypes[field.field.type].operators[0].value\n\n if (relation === 'and') {\n newConditions[orIndex].and.splice(andIndex, 0, {\n [String(field.value)]: {\n [defaultOperator]: undefined,\n },\n })\n } else {\n newConditions.push({\n and: [\n {\n [String(field.value)]: {\n [defaultOperator]: undefined,\n },\n },\n ],\n })\n }\n\n await handleWhereChange({ or: newConditions })\n },\n [conditions, handleWhereChange],\n )\n\n const updateCondition: UpdateCondition = React.useCallback(\n async ({ andIndex, field, operator: incomingOperator, orIndex, value: valueArg }) => {\n const existingCondition = conditions[orIndex].and[andIndex]\n\n const defaults = fieldTypes[field.field.type]\n const operator = incomingOperator || defaults.operators[0].value\n\n if (typeof existingCondition === 'object' && field.value) {\n const value = valueArg ?? existingCondition?.[operator]\n\n const valueChanged = value !== existingCondition?.[String(field.value)]?.[String(operator)]\n\n const operatorChanged =\n operator !== Object.keys(existingCondition?.[String(field.value)] || {})?.[0]\n\n if (valueChanged || operatorChanged) {\n const newRowCondition = {\n [String(field.value)]: { [operator]: value },\n }\n\n const newConditions = [...conditions]\n newConditions[orIndex].and[andIndex] = newRowCondition\n\n await handleWhereChange({ or: newConditions })\n }\n }\n },\n [conditions, handleWhereChange],\n )\n\n const removeCondition: RemoveCondition = React.useCallback(\n async ({ andIndex, orIndex }) => {\n const newConditions = [...conditions]\n newConditions[orIndex].and.splice(andIndex, 1)\n\n if (newConditions[orIndex].and.length === 0) {\n newConditions.splice(orIndex, 1)\n }\n\n await handleWhereChange({ or: newConditions })\n },\n [conditions, handleWhereChange],\n )\n\n return (\n <div className={baseClass}>\n {conditions.length > 0 && (\n <React.Fragment>\n <p className={`${baseClass}__label`}>\n {t('general:filterWhere', { label: getTranslation(collectionPluralLabel, i18n) })}\n </p>\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 condition = conditions[orIndex].and[andIndex]\n const fieldPath = Object.keys(condition)[0]\n\n const operator =\n (Object.keys(condition?.[fieldPath] || {})?.[0] as Operator) || undefined\n\n const value = condition?.[fieldPath]?.[operator] || undefined\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 fieldPath={fieldPath}\n filterOptions={resolvedFilterOptions?.get(fieldPath)}\n operator={operator}\n orIndex={orIndex}\n reducedFields={reducedFields}\n removeCondition={removeCondition}\n RenderedFilter={renderedFilters?.get(fieldPath)}\n updateCondition={updateCondition}\n value={value}\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={async () => {\n await addCondition({\n andIndex: 0,\n field: reducedFields.find((field) => !field.field.admin?.disableListFilter),\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={async () => {\n if (reducedFields.length > 0) {\n await addCondition({\n andIndex: 0,\n field: reducedFields.find((field) => !field.field.admin?.disableListFilter),\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"],"mappings":"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","ignoreList":[]}
|