From 3978a68255a63e7cfe37fe573beeb0825a98b02c Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 13 Jan 2026 18:41:44 +0000 Subject: [PATCH 1/9] Initial plan From 5500938f70e42197b492fe2bd9ce7afa92938d3c Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 13 Jan 2026 18:47:21 +0000 Subject: [PATCH 2/9] Add Airtable-like filter builder component Co-authored-by: huangyiirene <7665279+huangyiirene@users.noreply.github.com> --- .../metadata/FilterBuilder.component.yml | 39 +++ .../src/renderers/complex/filter-builder.tsx | 67 +++++ .../components/src/renderers/complex/index.ts | 1 + packages/components/src/ui/filter-builder.tsx | 231 ++++++++++++++++++ packages/components/src/ui/index.ts | 1 + 5 files changed, 339 insertions(+) create mode 100644 packages/components/metadata/FilterBuilder.component.yml create mode 100644 packages/components/src/renderers/complex/filter-builder.tsx create mode 100644 packages/components/src/ui/filter-builder.tsx diff --git a/packages/components/metadata/FilterBuilder.component.yml b/packages/components/metadata/FilterBuilder.component.yml new file mode 100644 index 000000000..5125c0cf7 --- /dev/null +++ b/packages/components/metadata/FilterBuilder.component.yml @@ -0,0 +1,39 @@ +name: FilterBuilder +label: Filter Builder +description: Airtable-like filter builder for creating complex query conditions +category: complex +version: 1.0.0 +framework: react + +props: + - name: label + type: string + description: Label text displayed above the filter builder + - name: name + type: string + required: true + description: Form field name for the filter value + - name: fields + type: array + required: true + description: Available fields for filtering + schema: + - value: string + - label: string + - type: string + - name: value + type: object + description: Current filter configuration + schema: + - id: string + - logic: enum[and, or] + - conditions: array + +events: + - name: onChange + payload: "{ name: string, value: FilterGroup }" + +features: + dynamic_conditions: true + multiple_operators: true + field_type_aware: true diff --git a/packages/components/src/renderers/complex/filter-builder.tsx b/packages/components/src/renderers/complex/filter-builder.tsx new file mode 100644 index 000000000..0518d2f84 --- /dev/null +++ b/packages/components/src/renderers/complex/filter-builder.tsx @@ -0,0 +1,67 @@ +import { ComponentRegistry } from '@object-ui/core'; +import { FilterBuilder, type FilterGroup } from '@/ui/filter-builder'; + +ComponentRegistry.register('filter-builder', + ({ schema, className, onChange, ...props }) => { + const handleChange = (value: FilterGroup) => { + if (onChange) { + onChange({ + target: { + name: schema.name, + value: value, + }, + }); + } + }; + + return ( +