diff --git a/frontend/components/screen/panels/UnifiedPropertiesPanel.tsx b/frontend/components/screen/panels/UnifiedPropertiesPanel.tsx index 6c77b4f1..49f31679 100644 --- a/frontend/components/screen/panels/UnifiedPropertiesPanel.tsx +++ b/frontend/components/screen/panels/UnifiedPropertiesPanel.tsx @@ -286,7 +286,8 @@ export const UnifiedPropertiesPanel: React.FC = ({ const componentId = selectedComponent.componentType || // โญ section-card ๋“ฑ selectedComponent.componentConfig?.type || - selectedComponent.componentConfig?.id; + selectedComponent.componentConfig?.id || + (selectedComponent.type === "component" ? selectedComponent.id : null); // ๐Ÿ†• ๋…๋ฆฝ ์ปดํฌ๋„ŒํŠธ (table-search-widget ๋“ฑ) if (componentId) { const definition = ComponentRegistry.getComponent(componentId); @@ -318,7 +319,11 @@ export const UnifiedPropertiesPanel: React.FC = ({

{definition.name} ์„ค์ •

- + ); }; @@ -994,6 +999,16 @@ export const UnifiedPropertiesPanel: React.FC = ({ ); } + // ๐Ÿ†• ComponentRegistry์—์„œ ์ „์šฉ ConfigPanel์ด ์žˆ๋Š”์ง€ ๋จผ์ € ํ™•์ธ + const definition = ComponentRegistry.getComponent(componentId); + if (definition?.configPanel) { + // ์ „์šฉ ConfigPanel์ด ์žˆ์œผ๋ฉด renderComponentConfigPanel ํ˜ธ์ถœ + const configPanelContent = renderComponentConfigPanel(); + if (configPanelContent) { + return configPanelContent; + } + } + // ํ˜„์žฌ ์›นํƒ€์ž…์˜ ๊ธฐ๋ณธ ์ž…๋ ฅ ํƒ€์ž… ์ถ”์ถœ const currentBaseInputType = webType ? getBaseInputType(webType as any) : null; diff --git a/frontend/components/screen/table-options/FilterPanel.tsx b/frontend/components/screen/table-options/FilterPanel.tsx index 4688bb18..69395942 100644 --- a/frontend/components/screen/table-options/FilterPanel.tsx +++ b/frontend/components/screen/table-options/FilterPanel.tsx @@ -26,6 +26,7 @@ interface Props { isOpen: boolean; onClose: () => void; onFiltersApplied?: (filters: TableFilter[]) => void; // ํ•„ํ„ฐ ์ ์šฉ ์‹œ ์ฝœ๋ฐฑ + screenId?: number; // ํ™”๋ฉด ID ์ถ”๊ฐ€ } // ํ•„ํ„ฐ ํƒ€์ž…๋ณ„ ์—ฐ์‚ฐ์ž @@ -69,7 +70,7 @@ interface ColumnFilterConfig { selectOptions?: Array<{ label: string; value: string }>; } -export const FilterPanel: React.FC = ({ isOpen, onClose, onFiltersApplied }) => { +export const FilterPanel: React.FC = ({ isOpen, onClose, onFiltersApplied, screenId }) => { const { getTable, selectedTableId } = useTableOptions(); const table = selectedTableId ? getTable(selectedTableId) : undefined; @@ -79,7 +80,10 @@ export const FilterPanel: React.FC = ({ isOpen, onClose, onFiltersApplied // localStorage์—์„œ ์ €์žฅ๋œ ํ•„ํ„ฐ ์„ค์ • ๋ถˆ๋Ÿฌ์˜ค๊ธฐ useEffect(() => { if (table?.columns && table?.tableName) { - const storageKey = `table_filters_${table.tableName}`; + // ํ™”๋ฉด๋ณ„๋กœ ๋…๋ฆฝ์ ์ธ ํ•„ํ„ฐ ์„ค์ • ์ €์žฅ + const storageKey = screenId + ? `table_filters_${table.tableName}_screen_${screenId}` + : `table_filters_${table.tableName}`; const savedFilters = localStorage.getItem(storageKey); let filters: ColumnFilterConfig[]; @@ -192,9 +196,11 @@ export const FilterPanel: React.FC = ({ isOpen, onClose, onFiltersApplied width: cf.width || 200, // ๋„ˆ๋น„ ํฌํ•จ (๊ธฐ๋ณธ 200px) })); - // localStorage์— ์ €์žฅ + // localStorage์— ์ €์žฅ (ํ™”๋ฉด๋ณ„๋กœ ๋…๋ฆฝ์ ) if (table?.tableName) { - const storageKey = `table_filters_${table.tableName}`; + const storageKey = screenId + ? `table_filters_${table.tableName}_screen_${screenId}` + : `table_filters_${table.tableName}`; localStorage.setItem(storageKey, JSON.stringify(columnFilters)); } @@ -216,9 +222,11 @@ export const FilterPanel: React.FC = ({ isOpen, onClose, onFiltersApplied setColumnFilters(clearedFilters); setSelectAll(false); - // localStorage์—์„œ ์ œ๊ฑฐ + // localStorage์—์„œ ์ œ๊ฑฐ (ํ™”๋ฉด๋ณ„๋กœ ๋…๋ฆฝ์ ) if (table?.tableName) { - const storageKey = `table_filters_${table.tableName}`; + const storageKey = screenId + ? `table_filters_${table.tableName}_screen_${screenId}` + : `table_filters_${table.tableName}`; localStorage.removeItem(storageKey); } diff --git a/frontend/lib/registry/components/table-list/TableListComponent.tsx b/frontend/lib/registry/components/table-list/TableListComponent.tsx index 74d81211..24b80975 100644 --- a/frontend/lib/registry/components/table-list/TableListComponent.tsx +++ b/frontend/lib/registry/components/table-list/TableListComponent.tsx @@ -148,7 +148,7 @@ export interface TableListComponentProps { tableName?: string; onRefresh?: () => void; onClose?: () => void; - screenId?: string; + screenId?: number | string; // ํ™”๋ฉด ID (ํ•„ํ„ฐ ์„ค์ • ์ €์žฅ์šฉ) userId?: string; // ์‚ฌ์šฉ์ž ID (์ปฌ๋Ÿผ ์ˆœ์„œ ์ €์žฅ์šฉ) onSelectedRowsChange?: ( selectedRows: any[], @@ -183,6 +183,7 @@ export const TableListComponent: React.FC = ({ refreshKey, tableName, userId, + screenId, // ํ™”๋ฉด ID ์ถ”์ถœ }) => { // ======================================== // ์„ค์ • ๋ฐ ์Šคํƒ€์ผ @@ -1535,17 +1536,21 @@ export const TableListComponent: React.FC = ({ // useEffect ํ›… // ======================================== - // ํ•„ํ„ฐ ์„ค์ • localStorage ํ‚ค ์ƒ์„ฑ + // ํ•„ํ„ฐ ์„ค์ • localStorage ํ‚ค ์ƒ์„ฑ (ํ™”๋ฉด๋ณ„๋กœ ๋…๋ฆฝ์ ) const filterSettingKey = useMemo(() => { if (!tableConfig.selectedTable) return null; - return `tableList_filterSettings_${tableConfig.selectedTable}`; - }, [tableConfig.selectedTable]); + return screenId + ? `tableList_filterSettings_${tableConfig.selectedTable}_screen_${screenId}` + : `tableList_filterSettings_${tableConfig.selectedTable}`; + }, [tableConfig.selectedTable, screenId]); - // ๊ทธ๋ฃน ์„ค์ • localStorage ํ‚ค ์ƒ์„ฑ + // ๊ทธ๋ฃน ์„ค์ • localStorage ํ‚ค ์ƒ์„ฑ (ํ™”๋ฉด๋ณ„๋กœ ๋…๋ฆฝ์ ) const groupSettingKey = useMemo(() => { if (!tableConfig.selectedTable) return null; - return `tableList_groupSettings_${tableConfig.selectedTable}`; - }, [tableConfig.selectedTable]); + return screenId + ? `tableList_groupSettings_${tableConfig.selectedTable}_screen_${screenId}` + : `tableList_groupSettings_${tableConfig.selectedTable}`; + }, [tableConfig.selectedTable, screenId]); // ์ €์žฅ๋œ ํ•„ํ„ฐ ์„ค์ • ๋ถˆ๋Ÿฌ์˜ค๊ธฐ useEffect(() => { diff --git a/frontend/lib/registry/components/table-search-widget/TableSearchWidget.tsx b/frontend/lib/registry/components/table-search-widget/TableSearchWidget.tsx index 01906c21..0416c4b3 100644 --- a/frontend/lib/registry/components/table-search-widget/TableSearchWidget.tsx +++ b/frontend/lib/registry/components/table-search-widget/TableSearchWidget.tsx @@ -12,6 +12,14 @@ import { GroupingPanel } from "@/components/screen/table-options/GroupingPanel"; import { TableFilter } from "@/types/table-options"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; +interface PresetFilter { + id: string; + columnName: string; + columnLabel: string; + filterType: "text" | "number" | "date" | "select"; + width?: number; +} + interface TableSearchWidgetProps { component: { id: string; @@ -25,6 +33,8 @@ interface TableSearchWidgetProps { componentConfig?: { autoSelectFirstTable?: boolean; // ์ฒซ ๋ฒˆ์งธ ํ…Œ์ด๋ธ” ์ž๋™ ์„ ํƒ ์—ฌ๋ถ€ showTableSelector?: boolean; // ํ…Œ์ด๋ธ” ์„ ํƒ ๋“œ๋กญ๋‹ค์šด ํ‘œ์‹œ ์—ฌ๋ถ€ + filterMode?: "dynamic" | "preset"; // ํ•„ํ„ฐ ๋ชจ๋“œ + presetFilters?: PresetFilter[]; // ๊ณ ์ • ํ•„ํ„ฐ ๋ชฉ๋ก }; }; screenId?: number; // ํ™”๋ฉด ID @@ -63,6 +73,8 @@ export function TableSearchWidget({ component, screenId, onHeightChange }: Table const autoSelectFirstTable = component.componentConfig?.autoSelectFirstTable ?? true; const showTableSelector = component.componentConfig?.showTableSelector ?? true; + const filterMode = component.componentConfig?.filterMode ?? "dynamic"; + const presetFilters = component.componentConfig?.presetFilters ?? []; // Map์„ ๋ฐฐ์—ด๋กœ ๋ณ€ํ™˜ const tableList = Array.from(registeredTables.values()); @@ -77,41 +89,58 @@ export function TableSearchWidget({ component, screenId, onHeightChange }: Table } }, [registeredTables, selectedTableId, autoSelectFirstTable, setSelectedTableId]); - // ํ˜„์žฌ ํ…Œ์ด๋ธ”์˜ ์ €์žฅ๋œ ํ•„ํ„ฐ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ + // ํ˜„์žฌ ํ…Œ์ด๋ธ”์˜ ์ €์žฅ๋œ ํ•„ํ„ฐ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ (๋™์  ๋ชจ๋“œ) ๋˜๋Š” ๊ณ ์ • ํ•„ํ„ฐ ์ ์šฉ (๊ณ ์ • ๋ชจ๋“œ) useEffect(() => { - if (currentTable?.tableName) { - const storageKey = `table_filters_${currentTable.tableName}`; - const savedFilters = localStorage.getItem(storageKey); + if (!currentTable?.tableName) return; - if (savedFilters) { - try { - const parsed = JSON.parse(savedFilters) as Array<{ - columnName: string; - columnLabel: string; - inputType: string; - enabled: boolean; - filterType: "text" | "number" | "date" | "select"; - width?: number; - }>; + // ๊ณ ์ • ๋ชจ๋“œ: presetFilters๋ฅผ activeFilters๋กœ ์„ค์ • + if (filterMode === "preset") { + const activeFiltersList: TableFilter[] = presetFilters.map((f) => ({ + columnName: f.columnName, + operator: "contains", + value: "", + filterType: f.filterType, + width: f.width || 200, + })); + setActiveFilters(activeFiltersList); + return; + } - // enabled๋œ ํ•„ํ„ฐ๋“ค๋งŒ activeFilters๋กœ ์„ค์ • - const activeFiltersList: TableFilter[] = parsed - .filter((f) => f.enabled) - .map((f) => ({ - columnName: f.columnName, - operator: "contains", - value: "", - filterType: f.filterType, - width: f.width || 200, // ์ €์žฅ๋œ ๋„ˆ๋น„ ํฌํ•จ - })); + // ๋™์  ๋ชจ๋“œ: ํ™”๋ฉด๋ณ„๋กœ ๋…๋ฆฝ์ ์ธ ํ•„ํ„ฐ ์„ค์ • ๋ถˆ๋Ÿฌ์˜ค๊ธฐ + const storageKey = screenId + ? `table_filters_${currentTable.tableName}_screen_${screenId}` + : `table_filters_${currentTable.tableName}`; + const savedFilters = localStorage.getItem(storageKey); - setActiveFilters(activeFiltersList); - } catch (error) { - console.error("์ €์žฅ๋œ ํ•„ํ„ฐ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ ์‹คํŒจ:", error); - } + if (savedFilters) { + try { + const parsed = JSON.parse(savedFilters) as Array<{ + columnName: string; + columnLabel: string; + inputType: string; + enabled: boolean; + filterType: "text" | "number" | "date" | "select"; + width?: number; + }>; + + // enabled๋œ ํ•„ํ„ฐ๋“ค๋งŒ activeFilters๋กœ ์„ค์ • + const activeFiltersList: TableFilter[] = parsed + .filter((f) => f.enabled) + .map((f) => ({ + columnName: f.columnName, + operator: "contains", + value: "", + filterType: f.filterType, + width: f.width || 200, // ์ €์žฅ๋œ ๋„ˆ๋น„ ํฌํ•จ + })); + + setActiveFilters(activeFiltersList); + } catch (error) { + console.error("์ €์žฅ๋œ ํ•„ํ„ฐ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ ์‹คํŒจ:", error); } } - }, [currentTable?.tableName]); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [currentTable?.tableName, filterMode, screenId, JSON.stringify(presetFilters)]); // select ์˜ต์…˜ ์ดˆ๊ธฐ ๋กœ๋“œ (ํ•œ ๋ฒˆ๋งŒ ์‹คํ–‰, ์ดํ›„ ์œ ์ง€) useEffect(() => { @@ -362,7 +391,7 @@ export function TableSearchWidget({ component, screenId, onHeightChange }: Table {/* ํ•„ํ„ฐ๊ฐ€ ์—†์„ ๋•Œ๋Š” ๋นˆ ๊ณต๊ฐ„ */} {activeFilters.length === 0 &&
} - {/* ์˜ค๋ฅธ์ชฝ: ๋ฐ์ดํ„ฐ ๊ฑด์ˆ˜ + ์„ค์ • ๋ฒ„ํŠผ๋“ค */} + {/* ์˜ค๋ฅธ์ชฝ: ๋ฐ์ดํ„ฐ ๊ฑด์ˆ˜ + ์„ค์ • ๋ฒ„ํŠผ๋“ค (๊ณ ์ • ๋ชจ๋“œ์—์„œ๋Š” ์ˆจ๊น€) */}
{/* ๋ฐ์ดํ„ฐ ๊ฑด์ˆ˜ ํ‘œ์‹œ */} {currentTable?.dataCount !== undefined && ( @@ -371,38 +400,43 @@ export function TableSearchWidget({ component, screenId, onHeightChange }: Table
)} - + {/* ๋™์  ๋ชจ๋“œ์ผ ๋•Œ๋งŒ ์„ค์ • ๋ฒ„ํŠผ๋“ค ํ‘œ์‹œ */} + {filterMode === "dynamic" && ( + <> + - + - + + + )}
{/* ํŒจ๋„๋“ค */} @@ -411,6 +445,7 @@ export function TableSearchWidget({ component, screenId, onHeightChange }: Table isOpen={filterOpen} onClose={() => setFilterOpen(false)} onFiltersApplied={(filters) => setActiveFilters(filters)} + screenId={screenId} /> setGroupingOpen(false)} /> diff --git a/frontend/lib/registry/components/table-search-widget/TableSearchWidgetConfigPanel.tsx b/frontend/lib/registry/components/table-search-widget/TableSearchWidgetConfigPanel.tsx index 646fd3c4..8c4ab6a1 100644 --- a/frontend/lib/registry/components/table-search-widget/TableSearchWidgetConfigPanel.tsx +++ b/frontend/lib/registry/components/table-search-widget/TableSearchWidgetConfigPanel.tsx @@ -3,27 +3,126 @@ import React, { useState, useEffect } from "react"; import { Label } from "@/components/ui/label"; import { Checkbox } from "@/components/ui/checkbox"; +import { RadioGroup, RadioGroupItem } from "@/components/ui/radio-group"; +import { Button } from "@/components/ui/button"; +import { Input } from "@/components/ui/input"; +import { Plus, X } from "lucide-react"; +import { + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue, +} from "@/components/ui/select"; interface TableSearchWidgetConfigPanelProps { - component: any; - onUpdateProperty: (property: string, value: any) => void; + component?: any; // ๋ ˆ๊ฑฐ์‹œ ์ง€์› + config?: any; // ์ƒˆ ์ธํ„ฐํŽ˜์ด์Šค + onUpdateProperty?: (property: string, value: any) => void; // ๋ ˆ๊ฑฐ์‹œ ์ง€์› + onChange?: (newConfig: any) => void; // ์ƒˆ ์ธํ„ฐํŽ˜์ด์Šค + tables?: any[]; // ํ™”๋ฉด์˜ ํ…Œ์ด๋ธ” ์ •๋ณด +} + +interface PresetFilter { + id: string; + columnName: string; + columnLabel: string; + filterType: "text" | "number" | "date" | "select"; + width?: number; } export function TableSearchWidgetConfigPanel({ component, + config, onUpdateProperty, + onChange, + tables = [], }: TableSearchWidgetConfigPanelProps) { + // ๋ ˆ๊ฑฐ์‹œ์™€ ์ƒˆ ์ธํ„ฐํŽ˜์ด์Šค ๋ชจ๋‘ ์ง€์› + const currentConfig = config || component?.componentConfig || {}; + const updateConfig = onChange || ((key: string, value: any) => { + if (onUpdateProperty) { + onUpdateProperty(`componentConfig.${key}`, value); + } + }); + + // ์ฒซ ๋ฒˆ์งธ ํ…Œ์ด๋ธ”์˜ ์ปฌ๋Ÿผ ๋ชฉ๋ก ๊ฐ€์ ธ์˜ค๊ธฐ + const availableColumns = tables.length > 0 && tables[0].columns ? tables[0].columns : []; + + // inputType์—์„œ filterType ์ถ”์ถœ ํ—ฌํผ ํ•จ์ˆ˜ + const getFilterTypeFromInputType = (inputType: string): "text" | "number" | "date" | "select" => { + if (inputType.includes("number") || inputType.includes("decimal") || inputType.includes("integer")) { + return "number"; + } + if (inputType.includes("date") || inputType.includes("time")) { + return "date"; + } + if (inputType.includes("select") || inputType.includes("dropdown") || inputType.includes("code") || inputType.includes("category")) { + return "select"; + } + return "text"; + }; + const [localAutoSelect, setLocalAutoSelect] = useState( - component.componentConfig?.autoSelectFirstTable ?? true + currentConfig.autoSelectFirstTable ?? true ); const [localShowSelector, setLocalShowSelector] = useState( - component.componentConfig?.showTableSelector ?? true + currentConfig.showTableSelector ?? true + ); + const [localFilterMode, setLocalFilterMode] = useState<"dynamic" | "preset">( + currentConfig.filterMode ?? "dynamic" + ); + const [localPresetFilters, setLocalPresetFilters] = useState( + currentConfig.presetFilters ?? [] ); useEffect(() => { - setLocalAutoSelect(component.componentConfig?.autoSelectFirstTable ?? true); - setLocalShowSelector(component.componentConfig?.showTableSelector ?? true); - }, [component.componentConfig]); + setLocalAutoSelect(currentConfig.autoSelectFirstTable ?? true); + setLocalShowSelector(currentConfig.showTableSelector ?? true); + setLocalFilterMode(currentConfig.filterMode ?? "dynamic"); + setLocalPresetFilters(currentConfig.presetFilters ?? []); + }, [currentConfig]); + + // ์„ค์ • ์—…๋ฐ์ดํŠธ ํ—ฌํผ + const handleUpdate = (key: string, value: any) => { + if (onChange) { + // ์ƒˆ ์ธํ„ฐํŽ˜์ด์Šค: ์ „์ฒด config ์—…๋ฐ์ดํŠธ + onChange({ ...currentConfig, [key]: value }); + } else if (onUpdateProperty) { + // ๋ ˆ๊ฑฐ์‹œ: ๊ฐœ๋ณ„ ์†์„ฑ ์—…๋ฐ์ดํŠธ + onUpdateProperty(`componentConfig.${key}`, value); + } + }; + + // ํ•„ํ„ฐ ์ถ”๊ฐ€ + const addFilter = () => { + const newFilter: PresetFilter = { + id: `filter_${Date.now()}`, + columnName: "", + columnLabel: "", + filterType: "text", + width: 200, + }; + const updatedFilters = [...localPresetFilters, newFilter]; + setLocalPresetFilters(updatedFilters); + handleUpdate("presetFilters", updatedFilters); + }; + + // ํ•„ํ„ฐ ์‚ญ์ œ + const removeFilter = (id: string) => { + const updatedFilters = localPresetFilters.filter((f) => f.id !== id); + setLocalPresetFilters(updatedFilters); + handleUpdate("presetFilters", updatedFilters); + }; + + // ํ•„ํ„ฐ ์—…๋ฐ์ดํŠธ + const updateFilter = (id: string, field: keyof PresetFilter, value: any) => { + const updatedFilters = localPresetFilters.map((f) => + f.id === id ? { ...f, [field]: value } : f + ); + setLocalPresetFilters(updatedFilters); + handleUpdate("presetFilters", updatedFilters); + }; return (
@@ -41,7 +140,7 @@ export function TableSearchWidgetConfigPanel({ checked={localAutoSelect} onCheckedChange={(checked) => { setLocalAutoSelect(checked as boolean); - onUpdateProperty("componentConfig.autoSelectFirstTable", checked); + handleUpdate("autoSelectFirstTable", checked); }} />
+ {/* ํ•„ํ„ฐ ๋ชจ๋“œ ์„ ํƒ */} +
+ + { + setLocalFilterMode(value); + handleUpdate("filterMode", value); + }} + > +
+ + +
+
+ + +
+
+
+ + {/* ๊ณ ์ • ๋ชจ๋“œ์ผ ๋•Œ๋งŒ ํ•„ํ„ฐ ์„ค์ • UI ํ‘œ์‹œ */} + {localFilterMode === "preset" && ( +
+
+ + +
+ + {localPresetFilters.length === 0 ? ( +
+ ํ•„ํ„ฐ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ํ•„ํ„ฐ ์ถ”๊ฐ€ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜์„ธ์š”. +
+ ) : ( +
+ {localPresetFilters.map((filter) => ( +
+
+ + +
+ + {/* ์ปฌ๋Ÿผ ์„ ํƒ */} +
+ + {availableColumns.length > 0 ? ( + + ) : ( + updateFilter(filter.id, "columnName", e.target.value)} + placeholder="์˜ˆ: customer_name" + className="h-7 text-xs" + /> + )} + {filter.columnLabel && ( +

+ ํ‘œ์‹œ๋ช…: {filter.columnLabel} +

+ )} +
+ + {/* ํ•„ํ„ฐ ํƒ€์ž… */} +
+ + +
+ + {/* ๋„ˆ๋น„ */} +
+ + updateFilter(filter.id, "width", parseInt(e.target.value))} + placeholder="200" + className="h-7 text-xs" + min={100} + max={500} + /> +
+
+ ))} +
+ )} +
+ )} +

์ฐธ๊ณ ์‚ฌํ•ญ:

  • ํ…Œ์ด๋ธ” ๋ฆฌ์ŠคํŠธ, ๋ถ„ํ•  ํŒจ๋„, ํ”Œ๋กœ์šฐ ์œ„์ ฏ์ด ์ž๋™ ๊ฐ์ง€๋ฉ๋‹ˆ๋‹ค
  • ์—ฌ๋Ÿฌ ํ…Œ์ด๋ธ”์ด ์žˆ์œผ๋ฉด ๋“œ๋กญ๋‹ค์šด์—์„œ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค
  • -
  • ์„ ํƒํ•œ ํ…Œ์ด๋ธ”์˜ ์ปฌ๋Ÿผ ์ •๋ณด๊ฐ€ ์ž๋™์œผ๋กœ ๋กœ๋“œ๋ฉ๋‹ˆ๋‹ค
  • + {localFilterMode === "dynamic" ? ( +
  • ์‚ฌ์šฉ์ž๊ฐ€ ํ•„ํ„ฐ ์„ค์ • ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜์—ฌ ์›ํ•˜๋Š” ํ•„ํ„ฐ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค
  • + ) : ( +
  • ๊ณ ์ • ๋ชจ๋“œ์—์„œ๋Š” ์„ค์ • ๋ฒ„ํŠผ์ด ์ˆจ๊ฒจ์ง€๊ณ  ์ง€์ •๋œ ํ•„ํ„ฐ๋งŒ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค
  • + )}
diff --git a/frontend/lib/registry/components/table-search-widget/TableSearchWidgetRenderer.tsx b/frontend/lib/registry/components/table-search-widget/TableSearchWidgetRenderer.tsx index 6fe47cc7..21e589ef 100644 --- a/frontend/lib/registry/components/table-search-widget/TableSearchWidgetRenderer.tsx +++ b/frontend/lib/registry/components/table-search-widget/TableSearchWidgetRenderer.tsx @@ -2,8 +2,8 @@ import React from "react"; import { TableSearchWidget } from "./TableSearchWidget"; export class TableSearchWidgetRenderer { - static render(component: any) { - return ; + static render(component: any, props?: any) { + return ; } }