From 35f84e70e6b634b21095338719c9ac11ce64e7ab Mon Sep 17 00:00:00 2001 From: minlovehua <321512939@qq.com> Date: Tue, 17 Dec 2024 11:05:45 +0800 Subject: [PATCH 1/2] feat(state): support filter by link field --- packages/grid/src/core/types/core.ts | 3 ++ packages/state/src/utils/field/model/index.ts | 3 +- packages/state/src/utils/field/model/link.ts | 28 +++++++++++++++++++ 3 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 packages/state/src/utils/field/model/link.ts diff --git a/packages/grid/src/core/types/core.ts b/packages/grid/src/core/types/core.ts index 04e46f0b..ffb66d46 100644 --- a/packages/grid/src/core/types/core.ts +++ b/packages/grid/src/core/types/core.ts @@ -98,6 +98,8 @@ export enum AITableSelectOptionStyle { export type TextFieldValue = string; +export type LinkFieldValue = { url: string; text: string }; + export type SelectFieldValue = Id[]; // 数字 export type NumberFieldValue = number; @@ -112,6 +114,7 @@ export type RateFieldValue = 1 | 2 | 3 | 4 | 5; export type FieldValue = | TextFieldValue + | LinkFieldValue | SelectFieldValue | NumberFieldValue | DateFieldValue diff --git a/packages/state/src/utils/field/model/index.ts b/packages/state/src/utils/field/model/index.ts index 06f32505..deb3ba15 100644 --- a/packages/state/src/utils/field/model/index.ts +++ b/packages/state/src/utils/field/model/index.ts @@ -5,6 +5,7 @@ import { SelectField } from './select'; import { DateField } from './date'; import { NumberField } from './number'; import { RateField } from './rate'; +import { LinkField } from './link'; export const ViewOperationMap: Record = { [AITableFieldType.text]: new TextField(), @@ -15,7 +16,7 @@ export const ViewOperationMap: Record = { [AITableFieldType.updatedAt]: new DateField(), [AITableFieldType.number]: new NumberField(), [AITableFieldType.rate]: new RateField(), - [AITableFieldType.link]: new TextField(), + [AITableFieldType.link]: new LinkField(), [AITableFieldType.member]: new SelectField(), [AITableFieldType.progress]: new NumberField(), [AITableFieldType.createdBy]: new SelectField(), diff --git a/packages/state/src/utils/field/model/link.ts b/packages/state/src/utils/field/model/link.ts new file mode 100644 index 00000000..f3b1766e --- /dev/null +++ b/packages/state/src/utils/field/model/link.ts @@ -0,0 +1,28 @@ +import { isEmpty } from '../../common'; +import { AITableFilterCondition, AITableFilterOperation } from '../../../types'; +import { Field } from './field'; +import { FieldValue, LinkFieldValue } from '@ai-table/grid'; + +export class LinkField extends Field { + override isMeetFilter(condition: AITableFilterCondition, cellValue: FieldValue) { + const cellTextValue = this.cellValueToString(cellValue); + switch (condition.operation) { + case AITableFilterOperation.empty: + return isEmpty(cellTextValue); + case AITableFilterOperation.exists: + return !isEmpty(cellTextValue); + case AITableFilterOperation.contain: + return !isEmpty(cellTextValue) && this.stringInclude(cellTextValue, condition.value); + default: + return super.isMeetFilter(condition, cellTextValue); + } + } + + override eq(cv1: LinkFieldValue | null, cv2: LinkFieldValue | null): boolean { + return this.cellValueToString(cv1) === this.cellValueToString(cv2); + } + + cellValueToString(cellValue: LinkFieldValue | null): string { + return cellValue?.text || ''; + } +} From 5e5bd64084cf76158bb30495d3480186433a682a Mon Sep 17 00:00:00 2001 From: minlovehua <321512939@qq.com> Date: Tue, 17 Dec 2024 17:41:03 +0800 Subject: [PATCH 2/2] feat(state): support sort by link field --- packages/state/src/utils/field/model/link.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/packages/state/src/utils/field/model/link.ts b/packages/state/src/utils/field/model/link.ts index f3b1766e..0b8a791b 100644 --- a/packages/state/src/utils/field/model/link.ts +++ b/packages/state/src/utils/field/model/link.ts @@ -1,7 +1,7 @@ import { isEmpty } from '../../common'; import { AITableFilterCondition, AITableFilterOperation } from '../../../types'; import { Field } from './field'; -import { FieldValue, LinkFieldValue } from '@ai-table/grid'; +import { AITableField, FieldValue, LinkFieldValue } from '@ai-table/grid'; export class LinkField extends Field { override isMeetFilter(condition: AITableFilterCondition, cellValue: FieldValue) { @@ -22,6 +22,12 @@ export class LinkField extends Field { return this.cellValueToString(cv1) === this.cellValueToString(cv2); } + override compare(cellValue1: FieldValue, cellValue2: FieldValue, field: AITableField): number { + const cellTextValue1 = this.cellValueToString(cellValue1); + const cellTextValue2 = this.cellValueToString(cellValue2); + return super.compare(cellTextValue1, cellTextValue2, field); + } + cellValueToString(cellValue: LinkFieldValue | null): string { return cellValue?.text || ''; }