@burdenoff/microfe-bigconsole 2026.805.2 → 2026.805.3
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/bigconsole/components/builder/inspector/DataBindingSection.js +109 -113
- package/dist/bigconsole/components/builder/inspector/DataBindingSection.js.map +1 -1
- package/dist/bigconsole/components/dashboard/CreateDashboardDialog.js +115 -113
- package/dist/bigconsole/components/dashboard/CreateDashboardDialog.js.map +1 -1
- package/dist/bigconsole/components/dashboard/DashboardCanvas.js +71 -62
- package/dist/bigconsole/components/dashboard/DashboardCanvas.js.map +1 -1
- package/dist/bigconsole/components/dashboard/DashboardToolbar.js +90 -89
- package/dist/bigconsole/components/dashboard/DashboardToolbar.js.map +1 -1
- package/dist/bigconsole/components/dashboard/DrilldownBreadcrumb.js +56 -54
- package/dist/bigconsole/components/dashboard/DrilldownBreadcrumb.js.map +1 -1
- package/dist/bigconsole/components/dashboard/GlobalFiltersBar/FilterChip.js +126 -125
- package/dist/bigconsole/components/dashboard/GlobalFiltersBar/FilterChip.js.map +1 -1
- package/dist/bigconsole/components/dashboard/GlobalFiltersBar/FilterEditor.js +151 -150
- package/dist/bigconsole/components/dashboard/GlobalFiltersBar/FilterEditor.js.map +1 -1
- package/dist/bigconsole/components/dashboard/GlobalFiltersBar/FilterPresetSelector.js +77 -76
- package/dist/bigconsole/components/dashboard/GlobalFiltersBar/FilterPresetSelector.js.map +1 -1
- package/dist/bigconsole/components/dashboard/GlobalFiltersBar/GlobalFiltersBar.js +97 -96
- package/dist/bigconsole/components/dashboard/GlobalFiltersBar/GlobalFiltersBar.js.map +1 -1
- package/dist/bigconsole/components/dashboard/ImportDashboardDialog.js +172 -191
- package/dist/bigconsole/components/dashboard/ImportDashboardDialog.js.map +1 -1
- package/dist/bigconsole/components/dashboard/PublishToStoreDialog.js +75 -83
- package/dist/bigconsole/components/dashboard/PublishToStoreDialog.js.map +1 -1
- package/dist/bigconsole/components/dashboard/SavedViewsDropdown/SavedViewsDropdown.js +151 -154
- package/dist/bigconsole/components/dashboard/SavedViewsDropdown/SavedViewsDropdown.js.map +1 -1
- package/dist/bigconsole/components/dashboard/ShareDialog/EmbedTab.js +181 -190
- package/dist/bigconsole/components/dashboard/ShareDialog/EmbedTab.js.map +1 -1
- package/dist/bigconsole/components/dashboard/TemplatePicker/TemplatePicker.js +1 -0
- package/dist/bigconsole/components/dashboard/WidgetPalette.js +110 -108
- package/dist/bigconsole/components/dashboard/WidgetPalette.js.map +1 -1
- package/dist/bigconsole/components/datasink/CacheTTLSelector.js +102 -103
- package/dist/bigconsole/components/datasink/CacheTTLSelector.js.map +1 -1
- package/dist/bigconsole/components/datasink/DataSinkDeleteDialog.js +36 -41
- package/dist/bigconsole/components/datasink/DataSinkDeleteDialog.js.map +1 -1
- package/dist/bigconsole/components/datasink/DataSinkRefreshDialog.js +38 -37
- package/dist/bigconsole/components/datasink/DataSinkRefreshDialog.js.map +1 -1
- package/dist/bigconsole/components/datasink/ImportDataGuideDialog.js +113 -117
- package/dist/bigconsole/components/datasink/ImportDataGuideDialog.js.map +1 -1
- package/dist/bigconsole/components/datasink/ImportDataSinkDialog.js +182 -197
- package/dist/bigconsole/components/datasink/ImportDataSinkDialog.js.map +1 -1
- package/dist/bigconsole/components/datasink/RefreshTypeSelector.js +166 -168
- package/dist/bigconsole/components/datasink/RefreshTypeSelector.js.map +1 -1
- package/dist/bigconsole/components/parser/DataSinkSelector.js +87 -86
- package/dist/bigconsole/components/parser/DataSinkSelector.js.map +1 -1
- package/dist/bigconsole/components/parser/ImportParserDialog.js +196 -211
- package/dist/bigconsole/components/parser/ImportParserDialog.js.map +1 -1
- package/dist/bigconsole/components/parser/ParserSelector.js +130 -128
- package/dist/bigconsole/components/parser/ParserSelector.js.map +1 -1
- package/dist/bigconsole/components/preview/AiPreviewMiniPanel.js +66 -63
- package/dist/bigconsole/components/preview/AiPreviewMiniPanel.js.map +1 -1
- package/dist/bigconsole/components/preview/AiPreviewPanel.js +95 -91
- package/dist/bigconsole/components/preview/AiPreviewPanel.js.map +1 -1
- package/dist/bigconsole/components/widgets/ActionConfigDialog.js +222 -215
- package/dist/bigconsole/components/widgets/ActionConfigDialog.js.map +1 -1
- package/dist/bigconsole/components/widgets/DrilldownConfigPanel.js +149 -145
- package/dist/bigconsole/components/widgets/DrilldownConfigPanel.js.map +1 -1
- package/dist/bigconsole/components/widgets/PropertiesPanel.js +504 -470
- package/dist/bigconsole/components/widgets/PropertiesPanel.js.map +1 -1
- package/dist/bigconsole/components/widgets/calendar/CalendarWidget.js +44 -47
- package/dist/bigconsole/components/widgets/calendar/CalendarWidget.js.map +1 -1
- package/dist/bigconsole/components/widgets/chart/ChartConfig.js +143 -142
- package/dist/bigconsole/components/widgets/chart/ChartConfig.js.map +1 -1
- package/dist/bigconsole/components/widgets/comments/WidgetComments.js +101 -88
- package/dist/bigconsole/components/widgets/comments/WidgetComments.js.map +1 -1
- package/dist/bigconsole/components/widgets/event-logs/EventLogViewer.js +135 -134
- package/dist/bigconsole/components/widgets/event-logs/EventLogViewer.js.map +1 -1
- package/dist/bigconsole/components/widgets/form/FormWidget.js +167 -159
- package/dist/bigconsole/components/widgets/form/FormWidget.js.map +1 -1
- package/dist/bigconsole/components/widgets/gauge/GaugeConfig.js +69 -68
- package/dist/bigconsole/components/widgets/gauge/GaugeConfig.js.map +1 -1
- package/dist/bigconsole/components/widgets/heatmap/HeatmapConfig.js +64 -72
- package/dist/bigconsole/components/widgets/heatmap/HeatmapConfig.js.map +1 -1
- package/dist/bigconsole/components/widgets/kanban/KanbanWidget.js +60 -59
- package/dist/bigconsole/components/widgets/kanban/KanbanWidget.js.map +1 -1
- package/dist/bigconsole/components/widgets/list/ListConfig.js +57 -56
- package/dist/bigconsole/components/widgets/list/ListConfig.js.map +1 -1
- package/dist/bigconsole/components/widgets/metric-card/MetricCardConfig.js +70 -69
- package/dist/bigconsole/components/widgets/metric-card/MetricCardConfig.js.map +1 -1
- package/dist/bigconsole/components/widgets/metric-card/SparklineChart.js +35 -34
- package/dist/bigconsole/components/widgets/metric-card/SparklineChart.js.map +1 -1
- package/dist/bigconsole/components/widgets/metric-card/TrendIndicator.js +20 -19
- package/dist/bigconsole/components/widgets/metric-card/TrendIndicator.js.map +1 -1
- package/dist/bigconsole/components/widgets/pivot-table/PivotTableWidget.js +178 -177
- package/dist/bigconsole/components/widgets/pivot-table/PivotTableWidget.js.map +1 -1
- package/dist/bigconsole/components/widgets/progress/ProgressConfig.js +76 -75
- package/dist/bigconsole/components/widgets/progress/ProgressConfig.js.map +1 -1
- package/dist/bigconsole/components/widgets/table/TableConfig.js +183 -168
- package/dist/bigconsole/components/widgets/table/TableConfig.js.map +1 -1
- package/dist/bigconsole/components/widgets/webhook-config/WebhookConfigPanel.js +187 -180
- package/dist/bigconsole/components/widgets/webhook-config/WebhookConfigPanel.js.map +1 -1
- package/dist/bigconsole/customWidget/CustomWidgetBuilderSheet.js +40 -38
- package/dist/bigconsole/customWidget/CustomWidgetBuilderSheet.js.map +1 -1
- package/dist/bigconsole/customWidget/CustomWidgetProposalPanel.js +150 -148
- package/dist/bigconsole/customWidget/CustomWidgetProposalPanel.js.map +1 -1
- package/dist/bigconsole/pages/DashboardBuilderPage.js +181 -176
- package/dist/bigconsole/pages/DashboardBuilderPage.js.map +1 -1
- package/dist/bigconsole/pages/DashboardViewPage.js +196 -192
- package/dist/bigconsole/pages/DashboardViewPage.js.map +1 -1
- package/dist/bigconsole/pages/DashboardsPage.js +223 -219
- package/dist/bigconsole/pages/DashboardsPage.js.map +1 -1
- package/dist/bigconsole/pages/DataParsersPage.js +167 -170
- package/dist/bigconsole/pages/DataParsersPage.js.map +1 -1
- package/dist/bigconsole/pages/DataSinkBuilderPage.js +204 -189
- package/dist/bigconsole/pages/DataSinkBuilderPage.js.map +1 -1
- package/dist/bigconsole/pages/DataSinkViewPage.js +175 -169
- package/dist/bigconsole/pages/DataSinkViewPage.js.map +1 -1
- package/dist/bigconsole/pages/DataSourcesPage.js +8 -7
- package/dist/bigconsole/pages/DataSourcesPage.js.map +1 -1
- package/dist/bigconsole/pages/InsightsPage.js +238 -208
- package/dist/bigconsole/pages/InsightsPage.js.map +1 -1
- package/dist/bigconsole/pages/ParserBuilderPage.js +464 -412
- package/dist/bigconsole/pages/ParserBuilderPage.js.map +1 -1
- package/dist/bigconsole/pages/ParserViewPage.js +92 -90
- package/dist/bigconsole/pages/ParserViewPage.js.map +1 -1
- package/dist/bigconsole/pages/PipelineBuilderPage.js +221 -194
- package/dist/bigconsole/pages/PipelineBuilderPage.js.map +1 -1
- package/dist/bigconsole/pages/PipelineViewPage.js +181 -184
- package/dist/bigconsole/pages/PipelineViewPage.js.map +1 -1
- package/dist/bigconsole/pages/PipelinesPage.js +128 -127
- package/dist/bigconsole/pages/PipelinesPage.js.map +1 -1
- package/dist/bigconsole/pages/SettingsPage.js +177 -172
- package/dist/bigconsole/pages/SettingsPage.js.map +1 -1
- package/dist/bigconsole/pages/WidgetDemoPage.js +121 -83
- package/dist/bigconsole/pages/WidgetDemoPage.js.map +1 -1
- package/dist/bigconsole/pages/WorkflowViewPage.js +199 -193
- package/dist/bigconsole/pages/WorkflowViewPage.js.map +1 -1
- package/dist/bigconsole/pages/WorkflowsPage.js +129 -128
- package/dist/bigconsole/pages/WorkflowsPage.js.map +1 -1
- package/dist/bigconsole/renderers/adapters/AdaptiveCardRenderer.js +111 -109
- package/dist/bigconsole/renderers/adapters/AdaptiveCardRenderer.js.map +1 -1
- package/dist/bigconsole/renderers/adapters/BlockKitRenderer.js +127 -126
- package/dist/bigconsole/renderers/adapters/BlockKitRenderer.js.map +1 -1
- package/dist/bigconsole/renderers/adapters/CustomRenderer.js +103 -103
- package/dist/bigconsole/renderers/adapters/CustomRenderer.js.map +1 -1
- package/package.json +2 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FilterEditor.js","names":[],"sources":["../../../../../src/bigconsole/components/dashboard/GlobalFiltersBar/FilterEditor.tsx"],"sourcesContent":["/**\n * FilterEditor Component\n *\n * Modal for creating/editing global filters.\n */\n\nimport React, { useState, useEffect } from 'react';\nimport type { GlobalFilter, FilterType } from '../../../hooks';\n\n// Dynamic colors that respect dark mode\nconst getColors = (isDark: boolean) => ({\n bgPrimary: isDark ? '#1f2937' : '#ffffff',\n bgSecondary: isDark ? '#374151' : '#f9fafb',\n textPrimary: isDark ? '#f9fafb' : '#111827',\n textSecondary: isDark ? '#9ca3af' : '#6b7280',\n borderDefault: isDark ? '#4b5563' : '#e5e7eb',\n actionPrimaryBg: '#6366f1',\n actionPrimaryBgSubtle: isDark ? '#312e81' : '#eef2ff',\n actionPrimaryFg: '#ffffff',\n bgTertiary: isDark ? '#4b5563' : '#f3f4f6',\n textTertiary: isDark ? '#6b7280' : '#9ca3af',\n statusErrorText: '#dc2626',\n backdropBg: 'rgba(0, 0, 0, 0.5)',\n});\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface FilterEditorProps {\n filter: GlobalFilter | null;\n onSave: (data: {\n name: string;\n type: FilterType;\n config: Record<string, unknown>;\n defaultValue?: unknown;\n isRequired?: boolean;\n }) => void;\n onClose: () => void;\n}\n\n/**\n * Filter types as per spec (03-graphql-contract.md)\n * Spec values: date_range, category, custom, numeric_range, text_search\n */\nconst FILTER_TYPES: { value: FilterType; label: string; description: string }[] = [\n { value: 'CATEGORY', label: 'Category', description: 'Selection from predefined categories' },\n { value: 'DATE_RANGE', label: 'Date Range', description: 'Start and end date selection' },\n { value: 'NUMERIC_RANGE', label: 'Numeric Range', description: 'Min and max number values' },\n { value: 'TEXT_SEARCH', label: 'Text Search', description: 'Free text search input' },\n { value: 'CUSTOM', label: 'Custom', description: 'Custom filter configuration' },\n];\n\n// ============================================================================\n// Component\n// ============================================================================\n\nexport function FilterEditor({ filter, onSave, onClose }: FilterEditorProps) {\n const [name, setName] = useState(filter?.name || '');\n const [type, setType] = useState<FilterType>(filter?.type || 'CATEGORY');\n const [isRequired, setIsRequired] = useState(filter?.isRequired || false);\n const [options, setOptions] = useState<{ value: string; label: string }[]>(\n (filter?.config?.options as { value: string; label: string }[] | undefined) || [{ value: '', label: '' }]\n );\n const [placeholder, setPlaceholder] = useState((filter?.config?.placeholder as string) || '');\n const [isDarkMode, setIsDarkMode] = useState(false);\n\n // Detect dark mode\n useEffect(() => {\n const checkDarkMode = () => {\n setIsDarkMode(document.documentElement.classList.contains('dark'));\n };\n checkDarkMode();\n\n // Watch for theme changes\n const observer = new MutationObserver(checkDarkMode);\n observer.observe(document.documentElement, { attributes: true, attributeFilter: ['class'] });\n return () => observer.disconnect();\n }, []);\n\n const COLORS = getColors(isDarkMode);\n const isEditing = !!filter;\n\n const handleAddOption = () => {\n setOptions([...options, { value: '', label: '' }]);\n };\n\n const handleRemoveOption = (index: number) => {\n setOptions(options.filter((_, i) => i !== index));\n };\n\n const handleOptionChange = (index: number, field: 'value' | 'label', value: string) => {\n setOptions(options.map((opt, i) => (i === index ? { ...opt, [field]: value } : opt)));\n };\n\n const handleSave = () => {\n const config: Record<string, unknown> = {};\n\n // CATEGORY type uses options for selection\n if (type === 'CATEGORY') {\n config.options = options.filter((opt) => opt.value && opt.label);\n }\n\n if (placeholder) {\n config.placeholder = placeholder;\n }\n\n onSave({\n name,\n type,\n config,\n isRequired,\n });\n };\n\n const isValid = name.trim() !== '' && (type !== 'CATEGORY' || options.some((opt) => opt.value && opt.label));\n\n return (\n <div\n style={{\n position: 'fixed',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n width: '100vw',\n height: '100vh',\n backgroundColor: COLORS.backdropBg,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n zIndex: 10000,\n isolation: 'isolate',\n }}\n onClick={onClose}\n >\n <div\n style={{\n width: '480px',\n maxWidth: '90vw',\n maxHeight: '80vh',\n backgroundColor: COLORS.bgPrimary,\n borderRadius: '8px',\n boxShadow: '0 8px 32px rgba(0, 0, 0, 0.3)',\n overflow: 'hidden',\n position: 'relative',\n }}\n onClick={(e) => e.stopPropagation()}\n >\n {/* Header */}\n <div\n style={{\n padding: '16px 20px',\n borderBottom: `1px solid ${COLORS.borderDefault}`,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n backgroundColor: COLORS.bgPrimary,\n }}\n >\n <h3 style={{ margin: 0, fontSize: '16px', fontWeight: 600, color: COLORS.textPrimary }}>\n {isEditing ? 'Edit Filter' : 'Add Filter'}\n </h3>\n <button\n onClick={onClose}\n style={{\n background: 'none',\n border: 'none',\n fontSize: '20px',\n cursor: 'pointer',\n color: COLORS.textSecondary,\n lineHeight: 1,\n }}\n >\n ×\n </button>\n </div>\n\n {/* Content */}\n <div\n style={{\n padding: '20px',\n overflowY: 'auto',\n maxHeight: 'calc(80vh - 130px)',\n backgroundColor: COLORS.bgPrimary,\n }}\n >\n {/* Filter Name */}\n <div style={{ marginBottom: '16px' }}>\n <label\n style={{\n display: 'block',\n marginBottom: '6px',\n fontSize: '13px',\n fontWeight: 500,\n color: COLORS.textPrimary,\n }}\n >\n Filter Name *\n </label>\n <input\n type=\"text\"\n value={name}\n onChange={(e) => setName(e.target.value)}\n placeholder=\"e.g., Status, Date Range, Category\"\n style={{\n width: '100%',\n padding: '10px 12px',\n border: `1px solid ${COLORS.borderDefault}`,\n borderRadius: '6px',\n fontSize: '14px',\n boxSizing: 'border-box',\n backgroundColor: COLORS.bgPrimary,\n color: COLORS.textPrimary,\n }}\n />\n </div>\n\n {/* Filter Type */}\n {!isEditing && (\n <div style={{ marginBottom: '16px' }}>\n <label\n style={{\n display: 'block',\n marginBottom: '8px',\n fontSize: '13px',\n fontWeight: 500,\n color: COLORS.textPrimary,\n }}\n >\n Filter Type *\n </label>\n <div style={{ display: 'grid', gridTemplateColumns: 'repeat(2, 1fr)', gap: '10px' }}>\n {FILTER_TYPES.map((ft) => (\n <button\n key={ft.value}\n onClick={() => setType(ft.value)}\n type=\"button\"\n style={{\n padding: '12px',\n textAlign: 'left',\n backgroundColor: type === ft.value ? COLORS.actionPrimaryBgSubtle : COLORS.bgSecondary,\n border: `2px solid ${type === ft.value ? COLORS.actionPrimaryBg : COLORS.borderDefault}`,\n borderRadius: '6px',\n cursor: 'pointer',\n transition: 'all 0.2s ease',\n minHeight: '60px',\n }}\n >\n <div style={{ fontWeight: 500, fontSize: '13px', color: COLORS.textPrimary }}>{ft.label}</div>\n <div\n style={{\n fontSize: '11px',\n color: COLORS.textSecondary,\n marginTop: '4px',\n lineHeight: '1.3',\n }}\n >\n {ft.description}\n </div>\n </button>\n ))}\n </div>\n </div>\n )}\n\n {/* Options (for CATEGORY type) */}\n {type === 'CATEGORY' && (\n <div style={{ marginBottom: '16px' }}>\n <label\n style={{\n display: 'block',\n marginBottom: '8px',\n fontSize: '13px',\n fontWeight: 500,\n color: COLORS.textPrimary,\n }}\n >\n Options\n </label>\n <div style={{ display: 'flex', flexDirection: 'column', gap: '8px' }}>\n {options.map((opt, index) => (\n <div key={index} style={{ display: 'flex', gap: '8px', alignItems: 'center' }}>\n <input\n type=\"text\"\n value={opt.value}\n onChange={(e) => handleOptionChange(index, 'value', e.target.value)}\n placeholder=\"Value\"\n style={{\n flex: 1,\n padding: '8px 10px',\n border: `1px solid ${COLORS.borderDefault}`,\n borderRadius: '4px',\n fontSize: '13px',\n boxSizing: 'border-box',\n backgroundColor: COLORS.bgPrimary,\n color: COLORS.textPrimary,\n }}\n />\n <input\n type=\"text\"\n value={opt.label}\n onChange={(e) => handleOptionChange(index, 'label', e.target.value)}\n placeholder=\"Label\"\n style={{\n flex: 1,\n padding: '8px 10px',\n border: `1px solid ${COLORS.borderDefault}`,\n borderRadius: '4px',\n fontSize: '13px',\n boxSizing: 'border-box',\n backgroundColor: COLORS.bgPrimary,\n color: COLORS.textPrimary,\n }}\n />\n {options.length > 1 && (\n <button\n type=\"button\"\n onClick={() => handleRemoveOption(index)}\n style={{\n padding: '6px 10px',\n backgroundColor: 'transparent',\n border: `1px solid ${COLORS.statusErrorText}`,\n borderRadius: '4px',\n cursor: 'pointer',\n color: COLORS.statusErrorText,\n fontSize: '12px',\n }}\n >\n Remove\n </button>\n )}\n </div>\n ))}\n <button\n type=\"button\"\n onClick={handleAddOption}\n style={{\n padding: '8px',\n backgroundColor: 'transparent',\n border: `1px dashed ${COLORS.borderDefault}`,\n borderRadius: '4px',\n cursor: 'pointer',\n color: COLORS.textSecondary,\n fontSize: '12px',\n }}\n >\n + Add Option\n </button>\n </div>\n </div>\n )}\n\n {/* Placeholder */}\n {(type === 'TEXT_SEARCH' || type === 'CATEGORY') && (\n <div style={{ marginBottom: '16px' }}>\n <label\n style={{\n display: 'block',\n marginBottom: '8px',\n fontSize: '13px',\n fontWeight: 500,\n color: COLORS.textPrimary,\n }}\n >\n Placeholder Text\n </label>\n <input\n type=\"text\"\n value={placeholder}\n onChange={(e) => setPlaceholder(e.target.value)}\n placeholder=\"e.g., Select an option...\"\n style={{\n width: '100%',\n padding: '10px 12px',\n border: `1px solid ${COLORS.borderDefault}`,\n borderRadius: '6px',\n fontSize: '14px',\n boxSizing: 'border-box',\n backgroundColor: COLORS.bgPrimary,\n color: COLORS.textPrimary,\n }}\n />\n </div>\n )}\n\n {/* Required Toggle */}\n <div style={{ marginBottom: '16px' }}>\n <label\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n cursor: 'pointer',\n }}\n >\n <input\n type=\"checkbox\"\n checked={isRequired}\n onChange={(e) => setIsRequired(e.target.checked)}\n style={{ width: '16px', height: '16px' }}\n />\n <span style={{ fontSize: '13px', color: COLORS.textPrimary }}>Required filter (must have a value)</span>\n </label>\n </div>\n </div>\n\n {/* Footer */}\n <div\n style={{\n padding: '16px 20px',\n borderTop: `1px solid ${COLORS.borderDefault}`,\n display: 'flex',\n justifyContent: 'flex-end',\n gap: '12px',\n backgroundColor: COLORS.bgPrimary,\n }}\n >\n <button\n type=\"button\"\n onClick={onClose}\n style={{\n padding: '10px 20px',\n backgroundColor: COLORS.bgPrimary,\n border: `1px solid ${COLORS.borderDefault}`,\n borderRadius: '6px',\n cursor: 'pointer',\n fontSize: '14px',\n color: COLORS.textSecondary,\n }}\n >\n Cancel\n </button>\n <button\n type=\"button\"\n onClick={handleSave}\n disabled={!isValid}\n style={{\n padding: '10px 20px',\n backgroundColor: isValid ? COLORS.actionPrimaryBg : COLORS.bgTertiary,\n color: isValid ? COLORS.actionPrimaryFg : COLORS.textTertiary,\n border: 'none',\n borderRadius: '6px',\n cursor: isValid ? 'pointer' : 'not-allowed',\n fontSize: '14px',\n fontWeight: 500,\n }}\n >\n {isEditing ? 'Save Changes' : 'Add Filter'}\n </button>\n </div>\n </div>\n </div>\n );\n}\n\nexport default FilterEditor;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"FilterEditor.js","names":[],"sources":["../../../../../src/bigconsole/components/dashboard/GlobalFiltersBar/FilterEditor.tsx"],"sourcesContent":["/**\n * FilterEditor Component\n *\n * Modal for creating/editing global filters.\n */\n\nimport React, { useState, useEffect, useMemo } from 'react';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport type { GlobalFilter, FilterType } from '../../../hooks';\n\n// Dynamic colors that respect dark mode\nconst getColors = (isDark: boolean) => ({\n bgPrimary: isDark ? '#1f2937' : '#ffffff',\n bgSecondary: isDark ? '#374151' : '#f9fafb',\n textPrimary: isDark ? '#f9fafb' : '#111827',\n textSecondary: isDark ? '#9ca3af' : '#6b7280',\n borderDefault: isDark ? '#4b5563' : '#e5e7eb',\n actionPrimaryBg: '#6366f1',\n actionPrimaryBgSubtle: isDark ? '#312e81' : '#eef2ff',\n actionPrimaryFg: '#ffffff',\n bgTertiary: isDark ? '#4b5563' : '#f3f4f6',\n textTertiary: isDark ? '#6b7280' : '#9ca3af',\n statusErrorText: '#dc2626',\n backdropBg: 'rgba(0, 0, 0, 0.5)',\n});\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface FilterEditorProps {\n filter: GlobalFilter | null;\n onSave: (data: {\n name: string;\n type: FilterType;\n config: Record<string, unknown>;\n defaultValue?: unknown;\n isRequired?: boolean;\n }) => void;\n onClose: () => void;\n}\n\n// ============================================================================\n// Component\n// ============================================================================\n\nexport function FilterEditor({ filter, onSave, onClose }: FilterEditorProps) {\n const { t } = useI18n();\n const [name, setName] = useState(filter?.name || '');\n const [type, setType] = useState<FilterType>(filter?.type || 'CATEGORY');\n const [isRequired, setIsRequired] = useState(filter?.isRequired || false);\n const [options, setOptions] = useState<{ value: string; label: string }[]>(\n (filter?.config?.options as { value: string; label: string }[] | undefined) || [{ value: '', label: '' }]\n );\n const [placeholder, setPlaceholder] = useState((filter?.config?.placeholder as string) || '');\n const [isDarkMode, setIsDarkMode] = useState(false);\n\n // Detect dark mode\n useEffect(() => {\n const checkDarkMode = () => {\n setIsDarkMode(document.documentElement.classList.contains('dark'));\n };\n checkDarkMode();\n\n // Watch for theme changes\n const observer = new MutationObserver(checkDarkMode);\n observer.observe(document.documentElement, { attributes: true, attributeFilter: ['class'] });\n return () => observer.disconnect();\n }, []);\n\n const COLORS = getColors(isDarkMode);\n const isEditing = !!filter;\n\n /**\n * Filter types as per spec (03-graphql-contract.md)\n * Spec values: date_range, category, custom, numeric_range, text_search\n */\n const FILTER_TYPES = useMemo<{ value: FilterType; label: string; description: string }[]>(\n () => [\n {\n value: 'CATEGORY',\n label: t('bigconsole.filters.editor.type.category.label', 'Category'),\n description: t('bigconsole.filters.editor.type.category.description', 'Selection from predefined categories'),\n },\n {\n value: 'DATE_RANGE',\n label: t('bigconsole.filters.editor.type.dateRange.label', 'Date Range'),\n description: t('bigconsole.filters.editor.type.dateRange.description', 'Start and end date selection'),\n },\n {\n value: 'NUMERIC_RANGE',\n label: t('bigconsole.filters.editor.type.numericRange.label', 'Numeric Range'),\n description: t('bigconsole.filters.editor.type.numericRange.description', 'Min and max number values'),\n },\n {\n value: 'TEXT_SEARCH',\n label: t('bigconsole.filters.editor.type.textSearch.label', 'Text Search'),\n description: t('bigconsole.filters.editor.type.textSearch.description', 'Free text search input'),\n },\n {\n value: 'CUSTOM',\n label: t('bigconsole.filters.editor.type.custom.label', 'Custom'),\n description: t('bigconsole.filters.editor.type.custom.description', 'Custom filter configuration'),\n },\n ],\n [t]\n );\n\n const handleAddOption = () => {\n setOptions([...options, { value: '', label: '' }]);\n };\n\n const handleRemoveOption = (index: number) => {\n setOptions(options.filter((_, i) => i !== index));\n };\n\n const handleOptionChange = (index: number, field: 'value' | 'label', value: string) => {\n setOptions(options.map((opt, i) => (i === index ? { ...opt, [field]: value } : opt)));\n };\n\n const handleSave = () => {\n const config: Record<string, unknown> = {};\n\n // CATEGORY type uses options for selection\n if (type === 'CATEGORY') {\n config.options = options.filter((opt) => opt.value && opt.label);\n }\n\n if (placeholder) {\n config.placeholder = placeholder;\n }\n\n onSave({\n name,\n type,\n config,\n isRequired,\n });\n };\n\n const isValid = name.trim() !== '' && (type !== 'CATEGORY' || options.some((opt) => opt.value && opt.label));\n\n return (\n <div\n style={{\n position: 'fixed',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n width: '100vw',\n height: '100vh',\n backgroundColor: COLORS.backdropBg,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n zIndex: 10000,\n isolation: 'isolate',\n }}\n onClick={onClose}\n >\n <div\n style={{\n width: '480px',\n maxWidth: '90vw',\n maxHeight: '80vh',\n backgroundColor: COLORS.bgPrimary,\n borderRadius: '8px',\n boxShadow: '0 8px 32px rgba(0, 0, 0, 0.3)',\n overflow: 'hidden',\n position: 'relative',\n }}\n onClick={(e) => e.stopPropagation()}\n >\n {/* Header */}\n <div\n style={{\n padding: '16px 20px',\n borderBottom: `1px solid ${COLORS.borderDefault}`,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n backgroundColor: COLORS.bgPrimary,\n }}\n >\n <h3 style={{ margin: 0, fontSize: '16px', fontWeight: 600, color: COLORS.textPrimary }}>\n {isEditing\n ? t('bigconsole.filters.editor.title.edit', 'Edit Filter')\n : t('bigconsole.filters.editor.title.add', 'Add Filter')}\n </h3>\n <button\n onClick={onClose}\n style={{\n background: 'none',\n border: 'none',\n fontSize: '20px',\n cursor: 'pointer',\n color: COLORS.textSecondary,\n lineHeight: 1,\n }}\n >\n ×\n </button>\n </div>\n\n {/* Content */}\n <div\n style={{\n padding: '20px',\n overflowY: 'auto',\n maxHeight: 'calc(80vh - 130px)',\n backgroundColor: COLORS.bgPrimary,\n }}\n >\n {/* Filter Name */}\n <div style={{ marginBottom: '16px' }}>\n <label\n style={{\n display: 'block',\n marginBottom: '6px',\n fontSize: '13px',\n fontWeight: 500,\n color: COLORS.textPrimary,\n }}\n >\n {t('bigconsole.filters.editor.field.name.label', 'Filter Name *')}\n </label>\n <input\n type=\"text\"\n value={name}\n onChange={(e) => setName(e.target.value)}\n placeholder={t('bigconsole.filters.editor.field.name.placeholder', 'e.g., Status, Date Range, Category')}\n style={{\n width: '100%',\n padding: '10px 12px',\n border: `1px solid ${COLORS.borderDefault}`,\n borderRadius: '6px',\n fontSize: '14px',\n boxSizing: 'border-box',\n backgroundColor: COLORS.bgPrimary,\n color: COLORS.textPrimary,\n }}\n />\n </div>\n\n {/* Filter Type */}\n {!isEditing && (\n <div style={{ marginBottom: '16px' }}>\n <label\n style={{\n display: 'block',\n marginBottom: '8px',\n fontSize: '13px',\n fontWeight: 500,\n color: COLORS.textPrimary,\n }}\n >\n {t('bigconsole.filters.editor.field.type.label', 'Filter Type *')}\n </label>\n <div style={{ display: 'grid', gridTemplateColumns: 'repeat(2, 1fr)', gap: '10px' }}>\n {FILTER_TYPES.map((ft) => (\n <button\n key={ft.value}\n onClick={() => setType(ft.value)}\n type=\"button\"\n style={{\n padding: '12px',\n textAlign: 'left',\n backgroundColor: type === ft.value ? COLORS.actionPrimaryBgSubtle : COLORS.bgSecondary,\n border: `2px solid ${type === ft.value ? COLORS.actionPrimaryBg : COLORS.borderDefault}`,\n borderRadius: '6px',\n cursor: 'pointer',\n transition: 'all 0.2s ease',\n minHeight: '60px',\n }}\n >\n <div style={{ fontWeight: 500, fontSize: '13px', color: COLORS.textPrimary }}>{ft.label}</div>\n <div\n style={{\n fontSize: '11px',\n color: COLORS.textSecondary,\n marginTop: '4px',\n lineHeight: '1.3',\n }}\n >\n {ft.description}\n </div>\n </button>\n ))}\n </div>\n </div>\n )}\n\n {/* Options (for CATEGORY type) */}\n {type === 'CATEGORY' && (\n <div style={{ marginBottom: '16px' }}>\n <label\n style={{\n display: 'block',\n marginBottom: '8px',\n fontSize: '13px',\n fontWeight: 500,\n color: COLORS.textPrimary,\n }}\n >\n {t('bigconsole.filters.editor.field.options.label', 'Options')}\n </label>\n <div style={{ display: 'flex', flexDirection: 'column', gap: '8px' }}>\n {options.map((opt, index) => (\n <div key={index} style={{ display: 'flex', gap: '8px', alignItems: 'center' }}>\n <input\n type=\"text\"\n value={opt.value}\n onChange={(e) => handleOptionChange(index, 'value', e.target.value)}\n placeholder={t('bigconsole.filters.editor.field.options.valuePlaceholder', 'Value')}\n style={{\n flex: 1,\n padding: '8px 10px',\n border: `1px solid ${COLORS.borderDefault}`,\n borderRadius: '4px',\n fontSize: '13px',\n boxSizing: 'border-box',\n backgroundColor: COLORS.bgPrimary,\n color: COLORS.textPrimary,\n }}\n />\n <input\n type=\"text\"\n value={opt.label}\n onChange={(e) => handleOptionChange(index, 'label', e.target.value)}\n placeholder={t('bigconsole.filters.editor.field.options.labelPlaceholder', 'Label')}\n style={{\n flex: 1,\n padding: '8px 10px',\n border: `1px solid ${COLORS.borderDefault}`,\n borderRadius: '4px',\n fontSize: '13px',\n boxSizing: 'border-box',\n backgroundColor: COLORS.bgPrimary,\n color: COLORS.textPrimary,\n }}\n />\n {options.length > 1 && (\n <button\n type=\"button\"\n onClick={() => handleRemoveOption(index)}\n style={{\n padding: '6px 10px',\n backgroundColor: 'transparent',\n border: `1px solid ${COLORS.statusErrorText}`,\n borderRadius: '4px',\n cursor: 'pointer',\n color: COLORS.statusErrorText,\n fontSize: '12px',\n }}\n >\n {t('bigconsole.filters.editor.field.options.remove', 'Remove')}\n </button>\n )}\n </div>\n ))}\n <button\n type=\"button\"\n onClick={handleAddOption}\n style={{\n padding: '8px',\n backgroundColor: 'transparent',\n border: `1px dashed ${COLORS.borderDefault}`,\n borderRadius: '4px',\n cursor: 'pointer',\n color: COLORS.textSecondary,\n fontSize: '12px',\n }}\n >\n {t('bigconsole.filters.editor.field.options.add', '+ Add Option')}\n </button>\n </div>\n </div>\n )}\n\n {/* Placeholder */}\n {(type === 'TEXT_SEARCH' || type === 'CATEGORY') && (\n <div style={{ marginBottom: '16px' }}>\n <label\n style={{\n display: 'block',\n marginBottom: '8px',\n fontSize: '13px',\n fontWeight: 500,\n color: COLORS.textPrimary,\n }}\n >\n {t('bigconsole.filters.editor.field.placeholder.label', 'Placeholder Text')}\n </label>\n <input\n type=\"text\"\n value={placeholder}\n onChange={(e) => setPlaceholder(e.target.value)}\n placeholder={t('bigconsole.filters.editor.field.placeholder.placeholder', 'e.g., Select an option...')}\n style={{\n width: '100%',\n padding: '10px 12px',\n border: `1px solid ${COLORS.borderDefault}`,\n borderRadius: '6px',\n fontSize: '14px',\n boxSizing: 'border-box',\n backgroundColor: COLORS.bgPrimary,\n color: COLORS.textPrimary,\n }}\n />\n </div>\n )}\n\n {/* Required Toggle */}\n <div style={{ marginBottom: '16px' }}>\n <label\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n cursor: 'pointer',\n }}\n >\n <input\n type=\"checkbox\"\n checked={isRequired}\n onChange={(e) => setIsRequired(e.target.checked)}\n style={{ width: '16px', height: '16px' }}\n />\n <span style={{ fontSize: '13px', color: COLORS.textPrimary }}>\n {t('bigconsole.filters.editor.field.required.label', 'Required filter (must have a value)')}\n </span>\n </label>\n </div>\n </div>\n\n {/* Footer */}\n <div\n style={{\n padding: '16px 20px',\n borderTop: `1px solid ${COLORS.borderDefault}`,\n display: 'flex',\n justifyContent: 'flex-end',\n gap: '12px',\n backgroundColor: COLORS.bgPrimary,\n }}\n >\n <button\n type=\"button\"\n onClick={onClose}\n style={{\n padding: '10px 20px',\n backgroundColor: COLORS.bgPrimary,\n border: `1px solid ${COLORS.borderDefault}`,\n borderRadius: '6px',\n cursor: 'pointer',\n fontSize: '14px',\n color: COLORS.textSecondary,\n }}\n >\n {t('bigconsole.filters.editor.action.cancel', 'Cancel')}\n </button>\n <button\n type=\"button\"\n onClick={handleSave}\n disabled={!isValid}\n style={{\n padding: '10px 20px',\n backgroundColor: isValid ? COLORS.actionPrimaryBg : COLORS.bgTertiary,\n color: isValid ? COLORS.actionPrimaryFg : COLORS.textTertiary,\n border: 'none',\n borderRadius: '6px',\n cursor: isValid ? 'pointer' : 'not-allowed',\n fontSize: '14px',\n fontWeight: 500,\n }}\n >\n {isEditing\n ? t('bigconsole.filters.editor.action.saveChanges', 'Save Changes')\n : t('bigconsole.filters.editor.action.add', 'Add Filter')}\n </button>\n </div>\n </div>\n </div>\n );\n}\n\nexport default FilterEditor;\n"],"mappings":";;;;AAWA,IAAM,KAAa,OAAqB;CACtC,WAAW,IAAS,YAAY;CAChC,aAAa,IAAS,YAAY;CAClC,aAAa,IAAS,YAAY;CAClC,eAAe,IAAS,YAAY;CACpC,eAAe,IAAS,YAAY;CACpC,iBAAiB;CACjB,uBAAuB,IAAS,YAAY;CAC5C,iBAAiB;CACjB,YAAY,IAAS,YAAY;CACjC,cAAc,IAAS,YAAY;CACnC,iBAAiB;CACjB,YAAY;CACb;AAsBD,SAAgB,EAAa,EAAE,WAAQ,WAAQ,cAA8B;CAC3E,IAAM,EAAE,SAAM,GAAS,EACjB,CAAC,GAAM,KAAW,EAAS,GAAQ,QAAQ,GAAG,EAC9C,CAAC,GAAM,KAAW,EAAqB,GAAQ,QAAQ,WAAW,EAClE,CAAC,GAAY,KAAiB,EAAS,GAAQ,cAAc,GAAM,EACnE,CAAC,GAAS,KAAc,EAC3B,GAAQ,QAAQ,WAA8D,CAAC;EAAE,OAAO;EAAI,OAAO;EAAI,CAAC,CAC1G,EACK,CAAC,GAAa,KAAkB,EAAU,GAAQ,QAAQ,eAA0B,GAAG,EACvF,CAAC,GAAY,KAAiB,EAAS,GAAM;AAGnD,SAAgB;EACd,IAAM,UAAsB;AAC1B,KAAc,SAAS,gBAAgB,UAAU,SAAS,OAAO,CAAC;;AAEpE,KAAe;EAGf,IAAM,IAAW,IAAI,iBAAiB,EAAc;AAEpD,SADA,EAAS,QAAQ,SAAS,iBAAiB;GAAE,YAAY;GAAM,iBAAiB,CAAC,QAAQ;GAAE,CAAC,QAC/E,EAAS,YAAY;IACjC,EAAE,CAAC;CAEN,IAAM,IAAS,EAAU,EAAW,EAC9B,IAAY,CAAC,CAAC,GAMd,IAAe,QACb;EACJ;GACE,OAAO;GACP,OAAO,EAAE,iDAAiD,WAAW;GACrE,aAAa,EAAE,uDAAuD,uCAAuC;GAC9G;EACD;GACE,OAAO;GACP,OAAO,EAAE,kDAAkD,aAAa;GACxE,aAAa,EAAE,wDAAwD,+BAA+B;GACvG;EACD;GACE,OAAO;GACP,OAAO,EAAE,qDAAqD,gBAAgB;GAC9E,aAAa,EAAE,2DAA2D,4BAA4B;GACvG;EACD;GACE,OAAO;GACP,OAAO,EAAE,mDAAmD,cAAc;GAC1E,aAAa,EAAE,yDAAyD,yBAAyB;GAClG;EACD;GACE,OAAO;GACP,OAAO,EAAE,+CAA+C,SAAS;GACjE,aAAa,EAAE,qDAAqD,8BAA8B;GACnG;EACF,EACD,CAAC,EAAE,CACJ,EAEK,UAAwB;AAC5B,IAAW,CAAC,GAAG,GAAS;GAAE,OAAO;GAAI,OAAO;GAAI,CAAC,CAAC;IAG9C,KAAsB,MAAkB;AAC5C,IAAW,EAAQ,QAAQ,GAAG,MAAM,MAAM,EAAM,CAAC;IAG7C,KAAsB,GAAe,GAA0B,MAAkB;AACrF,IAAW,EAAQ,KAAK,GAAK,MAAO,MAAM,IAAQ;GAAE,GAAG;IAAM,IAAQ;GAAO,GAAG,EAAK,CAAC;IAGjF,UAAmB;EACvB,IAAM,IAAkC,EAAE;AAW1C,EARI,MAAS,eACX,EAAO,UAAU,EAAQ,QAAQ,MAAQ,EAAI,SAAS,EAAI,MAAM,GAG9D,MACF,EAAO,cAAc,IAGvB,EAAO;GACL;GACA;GACA;GACA;GACD,CAAC;IAGE,IAAU,EAAK,MAAM,KAAK,OAAO,MAAS,cAAc,EAAQ,MAAM,MAAQ,EAAI,SAAS,EAAI,MAAM;AAE3G,QACE,kBAAC,OAAD;EACE,OAAO;GACL,UAAU;GACV,KAAK;GACL,MAAM;GACN,OAAO;GACP,QAAQ;GACR,OAAO;GACP,QAAQ;GACR,iBAAiB,EAAO;GACxB,SAAS;GACT,YAAY;GACZ,gBAAgB;GAChB,QAAQ;GACR,WAAW;GACZ;EACD,SAAS;YAET,kBAAC,OAAD;GACE,OAAO;IACL,OAAO;IACP,UAAU;IACV,WAAW;IACX,iBAAiB,EAAO;IACxB,cAAc;IACd,WAAW;IACX,UAAU;IACV,UAAU;IACX;GACD,UAAU,MAAM,EAAE,iBAAiB;aAXrC;IAcE,kBAAC,OAAD;KACE,OAAO;MACL,SAAS;MACT,cAAc,aAAa,EAAO;MAClC,SAAS;MACT,YAAY;MACZ,gBAAgB;MAChB,iBAAiB,EAAO;MACzB;eARH,CAUE,kBAAC,MAAD;MAAI,OAAO;OAAE,QAAQ;OAAG,UAAU;OAAQ,YAAY;OAAK,OAAO,EAAO;OAAa;gBACnF,IACG,EAAE,wCAAwC,cAAc,GACxD,EAAE,uCAAuC,aAAa;MACvD,CAAA,EACL,kBAAC,UAAD;MACE,SAAS;MACT,OAAO;OACL,YAAY;OACZ,QAAQ;OACR,UAAU;OACV,QAAQ;OACR,OAAO,EAAO;OACd,YAAY;OACb;gBACF;MAEQ,CAAA,CACL;;IAGN,kBAAC,OAAD;KACE,OAAO;MACL,SAAS;MACT,WAAW;MACX,WAAW;MACX,iBAAiB,EAAO;MACzB;eANH;MASE,kBAAC,OAAD;OAAK,OAAO,EAAE,cAAc,QAAQ;iBAApC,CACE,kBAAC,SAAD;QACE,OAAO;SACL,SAAS;SACT,cAAc;SACd,UAAU;SACV,YAAY;SACZ,OAAO,EAAO;SACf;kBAEA,EAAE,8CAA8C,gBAAgB;QAC3D,CAAA,EACR,kBAAC,SAAD;QACE,MAAK;QACL,OAAO;QACP,WAAW,MAAM,EAAQ,EAAE,OAAO,MAAM;QACxC,aAAa,EAAE,oDAAoD,qCAAqC;QACxG,OAAO;SACL,OAAO;SACP,SAAS;SACT,QAAQ,aAAa,EAAO;SAC5B,cAAc;SACd,UAAU;SACV,WAAW;SACX,iBAAiB,EAAO;SACxB,OAAO,EAAO;SACf;QACD,CAAA,CACE;;MAGL,CAAC,KACA,kBAAC,OAAD;OAAK,OAAO,EAAE,cAAc,QAAQ;iBAApC,CACE,kBAAC,SAAD;QACE,OAAO;SACL,SAAS;SACT,cAAc;SACd,UAAU;SACV,YAAY;SACZ,OAAO,EAAO;SACf;kBAEA,EAAE,8CAA8C,gBAAgB;QAC3D,CAAA,EACR,kBAAC,OAAD;QAAK,OAAO;SAAE,SAAS;SAAQ,qBAAqB;SAAkB,KAAK;SAAQ;kBAChF,EAAa,KAAK,MACjB,kBAAC,UAAD;SAEE,eAAe,EAAQ,EAAG,MAAM;SAChC,MAAK;SACL,OAAO;UACL,SAAS;UACT,WAAW;UACX,iBAAiB,MAAS,EAAG,QAAQ,EAAO,wBAAwB,EAAO;UAC3E,QAAQ,aAAa,MAAS,EAAG,QAAQ,EAAO,kBAAkB,EAAO;UACzE,cAAc;UACd,QAAQ;UACR,YAAY;UACZ,WAAW;UACZ;mBAbH,CAeE,kBAAC,OAAD;UAAK,OAAO;WAAE,YAAY;WAAK,UAAU;WAAQ,OAAO,EAAO;WAAa;oBAAG,EAAG;UAAY,CAAA,EAC9F,kBAAC,OAAD;UACE,OAAO;WACL,UAAU;WACV,OAAO,EAAO;WACd,WAAW;WACX,YAAY;WACb;oBAEA,EAAG;UACA,CAAA,CACC;WAzBF,EAAG,MAyBD,CACT;QACE,CAAA,CACF;;MAIP,MAAS,cACR,kBAAC,OAAD;OAAK,OAAO,EAAE,cAAc,QAAQ;iBAApC,CACE,kBAAC,SAAD;QACE,OAAO;SACL,SAAS;SACT,cAAc;SACd,UAAU;SACV,YAAY;SACZ,OAAO,EAAO;SACf;kBAEA,EAAE,iDAAiD,UAAU;QACxD,CAAA,EACR,kBAAC,OAAD;QAAK,OAAO;SAAE,SAAS;SAAQ,eAAe;SAAU,KAAK;SAAO;kBAApE,CACG,EAAQ,KAAK,GAAK,MACjB,kBAAC,OAAD;SAAiB,OAAO;UAAE,SAAS;UAAQ,KAAK;UAAO,YAAY;UAAU;mBAA7E;UACE,kBAAC,SAAD;WACE,MAAK;WACL,OAAO,EAAI;WACX,WAAW,MAAM,EAAmB,GAAO,SAAS,EAAE,OAAO,MAAM;WACnE,aAAa,EAAE,4DAA4D,QAAQ;WACnF,OAAO;YACL,MAAM;YACN,SAAS;YACT,QAAQ,aAAa,EAAO;YAC5B,cAAc;YACd,UAAU;YACV,WAAW;YACX,iBAAiB,EAAO;YACxB,OAAO,EAAO;YACf;WACD,CAAA;UACF,kBAAC,SAAD;WACE,MAAK;WACL,OAAO,EAAI;WACX,WAAW,MAAM,EAAmB,GAAO,SAAS,EAAE,OAAO,MAAM;WACnE,aAAa,EAAE,4DAA4D,QAAQ;WACnF,OAAO;YACL,MAAM;YACN,SAAS;YACT,QAAQ,aAAa,EAAO;YAC5B,cAAc;YACd,UAAU;YACV,WAAW;YACX,iBAAiB,EAAO;YACxB,OAAO,EAAO;YACf;WACD,CAAA;UACD,EAAQ,SAAS,KAChB,kBAAC,UAAD;WACE,MAAK;WACL,eAAe,EAAmB,EAAM;WACxC,OAAO;YACL,SAAS;YACT,iBAAiB;YACjB,QAAQ,aAAa,EAAO;YAC5B,cAAc;YACd,QAAQ;YACR,OAAO,EAAO;YACd,UAAU;YACX;qBAEA,EAAE,kDAAkD,SAAS;WACvD,CAAA;UAEP;WAlDI,EAkDJ,CACN,EACF,kBAAC,UAAD;SACE,MAAK;SACL,SAAS;SACT,OAAO;UACL,SAAS;UACT,iBAAiB;UACjB,QAAQ,cAAc,EAAO;UAC7B,cAAc;UACd,QAAQ;UACR,OAAO,EAAO;UACd,UAAU;UACX;mBAEA,EAAE,+CAA+C,eAAe;SAC1D,CAAA,CACL;UACF;;OAIN,MAAS,iBAAiB,MAAS,eACnC,kBAAC,OAAD;OAAK,OAAO,EAAE,cAAc,QAAQ;iBAApC,CACE,kBAAC,SAAD;QACE,OAAO;SACL,SAAS;SACT,cAAc;SACd,UAAU;SACV,YAAY;SACZ,OAAO,EAAO;SACf;kBAEA,EAAE,qDAAqD,mBAAmB;QACrE,CAAA,EACR,kBAAC,SAAD;QACE,MAAK;QACL,OAAO;QACP,WAAW,MAAM,EAAe,EAAE,OAAO,MAAM;QAC/C,aAAa,EAAE,2DAA2D,4BAA4B;QACtG,OAAO;SACL,OAAO;SACP,SAAS;SACT,QAAQ,aAAa,EAAO;SAC5B,cAAc;SACd,UAAU;SACV,WAAW;SACX,iBAAiB,EAAO;SACxB,OAAO,EAAO;SACf;QACD,CAAA,CACE;;MAIR,kBAAC,OAAD;OAAK,OAAO,EAAE,cAAc,QAAQ;iBAClC,kBAAC,SAAD;QACE,OAAO;SACL,SAAS;SACT,YAAY;SACZ,KAAK;SACL,QAAQ;SACT;kBANH,CAQE,kBAAC,SAAD;SACE,MAAK;SACL,SAAS;SACT,WAAW,MAAM,EAAc,EAAE,OAAO,QAAQ;SAChD,OAAO;UAAE,OAAO;UAAQ,QAAQ;UAAQ;SACxC,CAAA,EACF,kBAAC,QAAD;SAAM,OAAO;UAAE,UAAU;UAAQ,OAAO,EAAO;UAAa;mBACzD,EAAE,kDAAkD,sCAAsC;SACtF,CAAA,CACD;;OACJ,CAAA;MACF;;IAGN,kBAAC,OAAD;KACE,OAAO;MACL,SAAS;MACT,WAAW,aAAa,EAAO;MAC/B,SAAS;MACT,gBAAgB;MAChB,KAAK;MACL,iBAAiB,EAAO;MACzB;eARH,CAUE,kBAAC,UAAD;MACE,MAAK;MACL,SAAS;MACT,OAAO;OACL,SAAS;OACT,iBAAiB,EAAO;OACxB,QAAQ,aAAa,EAAO;OAC5B,cAAc;OACd,QAAQ;OACR,UAAU;OACV,OAAO,EAAO;OACf;gBAEA,EAAE,2CAA2C,SAAS;MAChD,CAAA,EACT,kBAAC,UAAD;MACE,MAAK;MACL,SAAS;MACT,UAAU,CAAC;MACX,OAAO;OACL,SAAS;OACT,iBAAiB,IAAU,EAAO,kBAAkB,EAAO;OAC3D,OAAO,IAAU,EAAO,kBAAkB,EAAO;OACjD,QAAQ;OACR,cAAc;OACd,QAAQ,IAAU,YAAY;OAC9B,UAAU;OACV,YAAY;OACb;gBAEA,IACG,EAAE,gDAAgD,eAAe,GACjE,EAAE,wCAAwC,aAAa;MACpD,CAAA,CACL;;IACF;;EACF,CAAA"}
|
|
@@ -1,52 +1,53 @@
|
|
|
1
1
|
import { SEMANTIC_COLORS as e } from "../../../utils/semanticTokens.js";
|
|
2
2
|
import { useEffect as t, useRef as n, useState as r } from "react";
|
|
3
|
-
import {
|
|
3
|
+
import { useI18n as i } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
|
|
4
|
+
import { jsx as a, jsxs as o } from "react/jsx-runtime";
|
|
4
5
|
//#region src/bigconsole/components/dashboard/GlobalFiltersBar/FilterPresetSelector.tsx
|
|
5
|
-
function
|
|
6
|
-
let
|
|
6
|
+
function s({ presets: s, activePresetId: c, onApplyPreset: l, onSavePreset: u, onDeletePreset: d, disabled: f = !1 }) {
|
|
7
|
+
let { t: p } = i(), [m, h] = r(!1), [g, _] = r(!1), [v, y] = r(""), [b, x] = r(""), S = n(null), C = s.find((e) => e.id === c);
|
|
7
8
|
t(() => {
|
|
8
9
|
function e(e) {
|
|
9
|
-
|
|
10
|
+
S.current && !S.current.contains(e.target) && (h(!1), _(!1));
|
|
10
11
|
}
|
|
11
12
|
return document.addEventListener("mousedown", e), () => document.removeEventListener("mousedown", e);
|
|
12
13
|
}, []);
|
|
13
|
-
let
|
|
14
|
-
|
|
15
|
-
},
|
|
16
|
-
e.stopPropagation(), window.confirm("Are you sure you want to delete this preset?") &&
|
|
14
|
+
let w = () => {
|
|
15
|
+
v.trim() && (u(v.trim(), b.trim() || void 0), y(""), x(""), _(!1), h(!1));
|
|
16
|
+
}, T = (e, t) => {
|
|
17
|
+
e.stopPropagation(), window.confirm(p("bigconsole.filters.presets.deleteConfirm", "Are you sure you want to delete this preset?")) && d(t);
|
|
17
18
|
};
|
|
18
|
-
return /* @__PURE__ */
|
|
19
|
-
ref:
|
|
19
|
+
return /* @__PURE__ */ o("div", {
|
|
20
|
+
ref: S,
|
|
20
21
|
style: {
|
|
21
22
|
position: "relative",
|
|
22
23
|
display: "inline-block"
|
|
23
24
|
},
|
|
24
|
-
children: [/* @__PURE__ */
|
|
25
|
-
onClick: () => !
|
|
26
|
-
disabled:
|
|
25
|
+
children: [/* @__PURE__ */ o("button", {
|
|
26
|
+
onClick: () => !f && h(!m),
|
|
27
|
+
disabled: f,
|
|
27
28
|
style: {
|
|
28
29
|
display: "flex",
|
|
29
30
|
alignItems: "center",
|
|
30
31
|
gap: "8px",
|
|
31
32
|
padding: "8px 14px",
|
|
32
|
-
backgroundColor:
|
|
33
|
-
border: `1px solid ${
|
|
33
|
+
backgroundColor: C ? e.statusSuccessBgSubtle : e.bgPrimary,
|
|
34
|
+
border: `1px solid ${C ? e.statusSuccessBg : e.borderDefault}`,
|
|
34
35
|
borderRadius: "6px",
|
|
35
|
-
cursor:
|
|
36
|
+
cursor: f ? "not-allowed" : "pointer",
|
|
36
37
|
fontSize: "13px",
|
|
37
|
-
color:
|
|
38
|
+
color: C ? e.statusSuccessText : e.textSecondary,
|
|
38
39
|
fontWeight: 500,
|
|
39
|
-
opacity:
|
|
40
|
+
opacity: f ? .6 : 1,
|
|
40
41
|
minWidth: "140px",
|
|
41
42
|
justifyContent: "space-between"
|
|
42
43
|
},
|
|
43
|
-
children: [/* @__PURE__ */
|
|
44
|
+
children: [/* @__PURE__ */ o("span", {
|
|
44
45
|
style: {
|
|
45
46
|
display: "flex",
|
|
46
47
|
alignItems: "center",
|
|
47
48
|
gap: "6px"
|
|
48
49
|
},
|
|
49
|
-
children: [/* @__PURE__ */
|
|
50
|
+
children: [/* @__PURE__ */ o("svg", {
|
|
50
51
|
width: "14",
|
|
51
52
|
height: "14",
|
|
52
53
|
viewBox: "0 0 24 24",
|
|
@@ -54,12 +55,12 @@ function o({ presets: o, activePresetId: s, onApplyPreset: c, onSavePreset: l, o
|
|
|
54
55
|
stroke: "currentColor",
|
|
55
56
|
strokeWidth: "2",
|
|
56
57
|
children: [
|
|
57
|
-
/* @__PURE__ */
|
|
58
|
-
/* @__PURE__ */
|
|
59
|
-
/* @__PURE__ */
|
|
58
|
+
/* @__PURE__ */ a("path", { d: "M19 21H5a2 2 0 01-2-2V5a2 2 0 012-2h11l5 5v11a2 2 0 01-2 2z" }),
|
|
59
|
+
/* @__PURE__ */ a("polyline", { points: "17,21 17,13 7,13 7,21" }),
|
|
60
|
+
/* @__PURE__ */ a("polyline", { points: "7,3 7,8 15,8" })
|
|
60
61
|
]
|
|
61
|
-
}),
|
|
62
|
-
}), /* @__PURE__ */
|
|
62
|
+
}), C ? C.name : p("bigconsole.filters.presets.buttonLabel", "Presets")]
|
|
63
|
+
}), /* @__PURE__ */ a("svg", {
|
|
63
64
|
width: "12",
|
|
64
65
|
height: "12",
|
|
65
66
|
viewBox: "0 0 24 24",
|
|
@@ -67,12 +68,12 @@ function o({ presets: o, activePresetId: s, onApplyPreset: c, onSavePreset: l, o
|
|
|
67
68
|
stroke: "currentColor",
|
|
68
69
|
strokeWidth: "2",
|
|
69
70
|
style: {
|
|
70
|
-
transform:
|
|
71
|
+
transform: m ? "rotate(180deg)" : "rotate(0deg)",
|
|
71
72
|
transition: "transform 0.2s ease"
|
|
72
73
|
},
|
|
73
|
-
children: /* @__PURE__ */
|
|
74
|
+
children: /* @__PURE__ */ a("polyline", { points: "6,9 12,15 18,9" })
|
|
74
75
|
})]
|
|
75
|
-
}),
|
|
76
|
+
}), m && /* @__PURE__ */ o("div", {
|
|
76
77
|
style: {
|
|
77
78
|
position: "absolute",
|
|
78
79
|
top: "100%",
|
|
@@ -87,7 +88,7 @@ function o({ presets: o, activePresetId: s, onApplyPreset: c, onSavePreset: l, o
|
|
|
87
88
|
overflow: "hidden"
|
|
88
89
|
},
|
|
89
90
|
children: [
|
|
90
|
-
/* @__PURE__ */
|
|
91
|
+
/* @__PURE__ */ o("div", {
|
|
91
92
|
style: {
|
|
92
93
|
padding: "12px 16px",
|
|
93
94
|
borderBottom: `1px solid ${e.borderDefault}`,
|
|
@@ -96,15 +97,15 @@ function o({ presets: o, activePresetId: s, onApplyPreset: c, onSavePreset: l, o
|
|
|
96
97
|
justifyContent: "space-between",
|
|
97
98
|
alignItems: "center"
|
|
98
99
|
},
|
|
99
|
-
children: [/* @__PURE__ */
|
|
100
|
+
children: [/* @__PURE__ */ a("span", {
|
|
100
101
|
style: {
|
|
101
102
|
fontWeight: 600,
|
|
102
103
|
fontSize: "13px",
|
|
103
104
|
color: e.textPrimary
|
|
104
105
|
},
|
|
105
|
-
children: "Filter Presets"
|
|
106
|
-
}), /* @__PURE__ */
|
|
107
|
-
onClick: () =>
|
|
106
|
+
children: p("bigconsole.filters.presets.header", "Filter Presets")
|
|
107
|
+
}), /* @__PURE__ */ a("button", {
|
|
108
|
+
onClick: () => _(!0),
|
|
108
109
|
style: {
|
|
109
110
|
padding: "4px 10px",
|
|
110
111
|
fontSize: "12px",
|
|
@@ -115,21 +116,21 @@ function o({ presets: o, activePresetId: s, onApplyPreset: c, onSavePreset: l, o
|
|
|
115
116
|
cursor: "pointer",
|
|
116
117
|
fontWeight: 500
|
|
117
118
|
},
|
|
118
|
-
children: "+ Save Current"
|
|
119
|
+
children: p("bigconsole.filters.presets.saveCurrent", "+ Save Current")
|
|
119
120
|
})]
|
|
120
121
|
}),
|
|
121
|
-
|
|
122
|
+
g && /* @__PURE__ */ o("div", {
|
|
122
123
|
style: {
|
|
123
124
|
padding: "12px 16px",
|
|
124
125
|
borderBottom: `1px solid ${e.borderDefault}`,
|
|
125
126
|
backgroundColor: e.bgSecondary
|
|
126
127
|
},
|
|
127
128
|
children: [
|
|
128
|
-
/* @__PURE__ */
|
|
129
|
+
/* @__PURE__ */ a("input", {
|
|
129
130
|
type: "text",
|
|
130
|
-
value:
|
|
131
|
-
onChange: (e) =>
|
|
132
|
-
placeholder: "Preset name...",
|
|
131
|
+
value: v,
|
|
132
|
+
onChange: (e) => y(e.target.value),
|
|
133
|
+
placeholder: p("bigconsole.filters.presets.namePlaceholder", "Preset name..."),
|
|
133
134
|
autoFocus: !0,
|
|
134
135
|
style: {
|
|
135
136
|
width: "100%",
|
|
@@ -143,11 +144,11 @@ function o({ presets: o, activePresetId: s, onApplyPreset: c, onSavePreset: l, o
|
|
|
143
144
|
color: e.textPrimary
|
|
144
145
|
}
|
|
145
146
|
}),
|
|
146
|
-
/* @__PURE__ */
|
|
147
|
+
/* @__PURE__ */ a("input", {
|
|
147
148
|
type: "text",
|
|
148
|
-
value:
|
|
149
|
-
onChange: (e) =>
|
|
150
|
-
placeholder: "Description (optional)...",
|
|
149
|
+
value: b,
|
|
150
|
+
onChange: (e) => x(e.target.value),
|
|
151
|
+
placeholder: p("bigconsole.filters.presets.descriptionPlaceholder", "Description (optional)..."),
|
|
151
152
|
style: {
|
|
152
153
|
width: "100%",
|
|
153
154
|
padding: "8px 10px",
|
|
@@ -160,15 +161,15 @@ function o({ presets: o, activePresetId: s, onApplyPreset: c, onSavePreset: l, o
|
|
|
160
161
|
color: e.textPrimary
|
|
161
162
|
}
|
|
162
163
|
}),
|
|
163
|
-
/* @__PURE__ */
|
|
164
|
+
/* @__PURE__ */ o("div", {
|
|
164
165
|
style: {
|
|
165
166
|
display: "flex",
|
|
166
167
|
gap: "8px",
|
|
167
168
|
justifyContent: "flex-end"
|
|
168
169
|
},
|
|
169
|
-
children: [/* @__PURE__ */
|
|
170
|
+
children: [/* @__PURE__ */ a("button", {
|
|
170
171
|
onClick: () => {
|
|
171
|
-
|
|
172
|
+
_(!1), y(""), x("");
|
|
172
173
|
},
|
|
173
174
|
style: {
|
|
174
175
|
padding: "6px 12px",
|
|
@@ -179,33 +180,33 @@ function o({ presets: o, activePresetId: s, onApplyPreset: c, onSavePreset: l, o
|
|
|
179
180
|
cursor: "pointer",
|
|
180
181
|
color: e.textSecondary
|
|
181
182
|
},
|
|
182
|
-
children: "Cancel"
|
|
183
|
-
}), /* @__PURE__ */
|
|
184
|
-
onClick:
|
|
185
|
-
disabled: !
|
|
183
|
+
children: p("bigconsole.filters.presets.cancel", "Cancel")
|
|
184
|
+
}), /* @__PURE__ */ a("button", {
|
|
185
|
+
onClick: w,
|
|
186
|
+
disabled: !v.trim(),
|
|
186
187
|
style: {
|
|
187
188
|
padding: "6px 12px",
|
|
188
189
|
fontSize: "12px",
|
|
189
|
-
backgroundColor:
|
|
190
|
-
color:
|
|
190
|
+
backgroundColor: v.trim() ? e.statusSuccessBg : e.bgTertiary,
|
|
191
|
+
color: v.trim() ? e.actionPrimaryFg : e.textTertiary,
|
|
191
192
|
border: "none",
|
|
192
193
|
borderRadius: "4px",
|
|
193
|
-
cursor:
|
|
194
|
+
cursor: v.trim() ? "pointer" : "not-allowed",
|
|
194
195
|
fontWeight: 500
|
|
195
196
|
},
|
|
196
|
-
children: "Save"
|
|
197
|
+
children: p("bigconsole.filters.presets.save", "Save")
|
|
197
198
|
})]
|
|
198
199
|
})
|
|
199
200
|
]
|
|
200
201
|
}),
|
|
201
|
-
/* @__PURE__ */
|
|
202
|
+
/* @__PURE__ */ o("div", {
|
|
202
203
|
style: {
|
|
203
204
|
maxHeight: "300px",
|
|
204
205
|
overflowY: "auto"
|
|
205
206
|
},
|
|
206
|
-
children: [
|
|
207
|
+
children: [s.map((t) => /* @__PURE__ */ o("div", {
|
|
207
208
|
onClick: () => {
|
|
208
|
-
|
|
209
|
+
l(t.id), h(!1);
|
|
209
210
|
},
|
|
210
211
|
style: {
|
|
211
212
|
padding: "10px 16px",
|
|
@@ -213,20 +214,20 @@ function o({ presets: o, activePresetId: s, onApplyPreset: c, onSavePreset: l, o
|
|
|
213
214
|
display: "flex",
|
|
214
215
|
alignItems: "center",
|
|
215
216
|
justifyContent: "space-between",
|
|
216
|
-
backgroundColor:
|
|
217
|
-
borderLeft:
|
|
217
|
+
backgroundColor: c === t.id ? e.actionPrimaryBgSubtle : "transparent",
|
|
218
|
+
borderLeft: c === t.id ? `3px solid ${e.actionPrimaryBg}` : "3px solid transparent",
|
|
218
219
|
transition: "background-color 0.15s ease"
|
|
219
220
|
},
|
|
220
221
|
onMouseEnter: (n) => {
|
|
221
|
-
|
|
222
|
+
c !== t.id && (n.currentTarget.style.backgroundColor = e.bgSecondary);
|
|
222
223
|
},
|
|
223
224
|
onMouseLeave: (e) => {
|
|
224
|
-
|
|
225
|
+
c !== t.id && (e.currentTarget.style.backgroundColor = "transparent");
|
|
225
226
|
},
|
|
226
227
|
children: [
|
|
227
|
-
/* @__PURE__ */
|
|
228
|
+
/* @__PURE__ */ o("div", {
|
|
228
229
|
style: { flex: 1 },
|
|
229
|
-
children: [/* @__PURE__ */
|
|
230
|
+
children: [/* @__PURE__ */ o("div", {
|
|
230
231
|
style: {
|
|
231
232
|
fontSize: "13px",
|
|
232
233
|
fontWeight: 500,
|
|
@@ -235,7 +236,7 @@ function o({ presets: o, activePresetId: s, onApplyPreset: c, onSavePreset: l, o
|
|
|
235
236
|
alignItems: "center",
|
|
236
237
|
gap: "6px"
|
|
237
238
|
},
|
|
238
|
-
children: [t.name, t.isDefault && /* @__PURE__ */
|
|
239
|
+
children: [t.name, t.isDefault && /* @__PURE__ */ a("span", {
|
|
239
240
|
style: {
|
|
240
241
|
fontSize: "10px",
|
|
241
242
|
padding: "2px 6px",
|
|
@@ -243,9 +244,9 @@ function o({ presets: o, activePresetId: s, onApplyPreset: c, onSavePreset: l, o
|
|
|
243
244
|
borderRadius: "4px",
|
|
244
245
|
color: e.textSecondary
|
|
245
246
|
},
|
|
246
|
-
children: "Default"
|
|
247
|
+
children: p("bigconsole.filters.presets.defaultBadge", "Default")
|
|
247
248
|
})]
|
|
248
|
-
}), t.description && /* @__PURE__ */
|
|
249
|
+
}), t.description && /* @__PURE__ */ a("div", {
|
|
249
250
|
style: {
|
|
250
251
|
fontSize: "11px",
|
|
251
252
|
color: e.textTertiary,
|
|
@@ -254,8 +255,8 @@ function o({ presets: o, activePresetId: s, onApplyPreset: c, onSavePreset: l, o
|
|
|
254
255
|
children: t.description
|
|
255
256
|
})]
|
|
256
257
|
}),
|
|
257
|
-
!t.isDefault && !t.id.startsWith("preset-last") && !t.id.startsWith("preset-this") && /* @__PURE__ */
|
|
258
|
-
onClick: (e) =>
|
|
258
|
+
!t.isDefault && !t.id.startsWith("preset-last") && !t.id.startsWith("preset-this") && /* @__PURE__ */ a("button", {
|
|
259
|
+
onClick: (e) => T(e, t.id),
|
|
259
260
|
style: {
|
|
260
261
|
padding: "4px",
|
|
261
262
|
backgroundColor: "transparent",
|
|
@@ -273,18 +274,18 @@ function o({ presets: o, activePresetId: s, onApplyPreset: c, onSavePreset: l, o
|
|
|
273
274
|
onMouseLeave: (t) => {
|
|
274
275
|
t.currentTarget.style.backgroundColor = "transparent", t.currentTarget.style.color = e.textTertiary;
|
|
275
276
|
},
|
|
276
|
-
title: "Delete preset",
|
|
277
|
-
children: /* @__PURE__ */
|
|
277
|
+
title: p("bigconsole.filters.presets.deletePresetTitle", "Delete preset"),
|
|
278
|
+
children: /* @__PURE__ */ o("svg", {
|
|
278
279
|
width: "14",
|
|
279
280
|
height: "14",
|
|
280
281
|
viewBox: "0 0 24 24",
|
|
281
282
|
fill: "none",
|
|
282
283
|
stroke: "currentColor",
|
|
283
284
|
strokeWidth: "2",
|
|
284
|
-
children: [/* @__PURE__ */
|
|
285
|
+
children: [/* @__PURE__ */ a("polyline", { points: "3,6 5,6 21,6" }), /* @__PURE__ */ a("path", { d: "M19,6v14a2,2,0,01-2,2H7a2,2,0,01-2-2V6m3,0V4a2,2,0,012-2h4a2,2,0,012,2v2" })]
|
|
285
286
|
})
|
|
286
287
|
}),
|
|
287
|
-
|
|
288
|
+
c === t.id && /* @__PURE__ */ a("svg", {
|
|
288
289
|
width: "16",
|
|
289
290
|
height: "16",
|
|
290
291
|
viewBox: "0 0 24 24",
|
|
@@ -292,17 +293,17 @@ function o({ presets: o, activePresetId: s, onApplyPreset: c, onSavePreset: l, o
|
|
|
292
293
|
stroke: e.actionPrimaryBg,
|
|
293
294
|
strokeWidth: "3",
|
|
294
295
|
style: { marginLeft: "8px" },
|
|
295
|
-
children: /* @__PURE__ */
|
|
296
|
+
children: /* @__PURE__ */ a("polyline", { points: "20,6 9,17 4,12" })
|
|
296
297
|
})
|
|
297
298
|
]
|
|
298
|
-
}, t.id)),
|
|
299
|
+
}, t.id)), s.length === 0 && /* @__PURE__ */ a("div", {
|
|
299
300
|
style: {
|
|
300
301
|
padding: "20px 16px",
|
|
301
302
|
textAlign: "center",
|
|
302
303
|
color: e.textTertiary,
|
|
303
304
|
fontSize: "13px"
|
|
304
305
|
},
|
|
305
|
-
children: "No presets saved yet"
|
|
306
|
+
children: p("bigconsole.filters.presets.emptyState", "No presets saved yet")
|
|
306
307
|
})]
|
|
307
308
|
})
|
|
308
309
|
]
|
|
@@ -310,6 +311,6 @@ function o({ presets: o, activePresetId: s, onApplyPreset: c, onSavePreset: l, o
|
|
|
310
311
|
});
|
|
311
312
|
}
|
|
312
313
|
//#endregion
|
|
313
|
-
export {
|
|
314
|
+
export { s as default };
|
|
314
315
|
|
|
315
316
|
//# sourceMappingURL=FilterPresetSelector.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FilterPresetSelector.js","names":[],"sources":["../../../../../src/bigconsole/components/dashboard/GlobalFiltersBar/FilterPresetSelector.tsx"],"sourcesContent":["/**\n * FilterPresetSelector Component\n *\n * Dropdown to select, save, and manage filter presets.\n */\n\nimport React, { useState, useRef, useEffect } from 'react';\nimport type { FilterPreset } from '../../../hooks/useFilterPresets';\nimport { SEMANTIC_COLORS } from '../../../utils/semanticTokens';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface FilterPresetSelectorProps {\n presets: FilterPreset[];\n activePresetId: string | null;\n onApplyPreset: (presetId: string) => void;\n onSavePreset: (name: string, description?: string) => void;\n onDeletePreset: (presetId: string) => void;\n disabled?: boolean;\n}\n\n// ============================================================================\n// Component\n// ============================================================================\n\nexport function FilterPresetSelector({\n presets,\n activePresetId,\n onApplyPreset,\n onSavePreset,\n onDeletePreset,\n disabled = false,\n}: FilterPresetSelectorProps) {\n const [isOpen, setIsOpen] = useState(false);\n const [showSaveDialog, setShowSaveDialog] = useState(false);\n const [newPresetName, setNewPresetName] = useState('');\n const [newPresetDescription, setNewPresetDescription] = useState('');\n const dropdownRef = useRef<HTMLDivElement>(null);\n\n const activePreset = presets.find((p) => p.id === activePresetId);\n\n // Close dropdown when clicking outside\n useEffect(() => {\n function handleClickOutside(event: MouseEvent) {\n if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) {\n setIsOpen(false);\n setShowSaveDialog(false);\n }\n }\n\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, []);\n\n const handleSavePreset = () => {\n if (newPresetName.trim()) {\n onSavePreset(newPresetName.trim(), newPresetDescription.trim() || undefined);\n setNewPresetName('');\n setNewPresetDescription('');\n setShowSaveDialog(false);\n setIsOpen(false);\n }\n };\n\n const handleDeletePreset = (e: React.MouseEvent, presetId: string) => {\n e.stopPropagation();\n if (window.confirm('Are you sure you want to delete this preset?')) {\n onDeletePreset(presetId);\n }\n };\n\n return (\n <div ref={dropdownRef} style={{ position: 'relative', display: 'inline-block' }}>\n {/* Preset Button */}\n <button\n onClick={() => !disabled && setIsOpen(!isOpen)}\n disabled={disabled}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n padding: '8px 14px',\n backgroundColor: activePreset ? SEMANTIC_COLORS.statusSuccessBgSubtle : SEMANTIC_COLORS.bgPrimary,\n border: `1px solid ${activePreset ? SEMANTIC_COLORS.statusSuccessBg : SEMANTIC_COLORS.borderDefault}`,\n borderRadius: '6px',\n cursor: disabled ? 'not-allowed' : 'pointer',\n fontSize: '13px',\n color: activePreset ? SEMANTIC_COLORS.statusSuccessText : SEMANTIC_COLORS.textSecondary,\n fontWeight: 500,\n opacity: disabled ? 0.6 : 1,\n minWidth: '140px',\n justifyContent: 'space-between',\n }}\n >\n <span style={{ display: 'flex', alignItems: 'center', gap: '6px' }}>\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <path d=\"M19 21H5a2 2 0 01-2-2V5a2 2 0 012-2h11l5 5v11a2 2 0 01-2 2z\" />\n <polyline points=\"17,21 17,13 7,13 7,21\" />\n <polyline points=\"7,3 7,8 15,8\" />\n </svg>\n {activePreset ? activePreset.name : 'Presets'}\n </span>\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n style={{\n transform: isOpen ? 'rotate(180deg)' : 'rotate(0deg)',\n transition: 'transform 0.2s ease',\n }}\n >\n <polyline points=\"6,9 12,15 18,9\" />\n </svg>\n </button>\n\n {/* Dropdown Menu */}\n {isOpen && (\n <div\n style={{\n position: 'absolute',\n top: '100%',\n left: 0,\n marginTop: '4px',\n minWidth: '280px',\n backgroundColor: SEMANTIC_COLORS.bgPrimary,\n border: `1px solid ${SEMANTIC_COLORS.borderDefault}`,\n borderRadius: '8px',\n boxShadow: '0 4px 16px rgba(0,0,0,0.15)',\n zIndex: 100000,\n overflow: 'hidden',\n }}\n >\n {/* Header */}\n <div\n style={{\n padding: '12px 16px',\n borderBottom: `1px solid ${SEMANTIC_COLORS.borderDefault}`,\n backgroundColor: SEMANTIC_COLORS.bgSecondary,\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n }}\n >\n <span style={{ fontWeight: 600, fontSize: '13px', color: SEMANTIC_COLORS.textPrimary }}>\n Filter Presets\n </span>\n <button\n onClick={() => setShowSaveDialog(true)}\n style={{\n padding: '4px 10px',\n fontSize: '12px',\n backgroundColor: SEMANTIC_COLORS.actionPrimaryBg,\n color: SEMANTIC_COLORS.actionPrimaryFg,\n border: 'none',\n borderRadius: '4px',\n cursor: 'pointer',\n fontWeight: 500,\n }}\n >\n + Save Current\n </button>\n </div>\n\n {/* Save Dialog */}\n {showSaveDialog && (\n <div\n style={{\n padding: '12px 16px',\n borderBottom: `1px solid ${SEMANTIC_COLORS.borderDefault}`,\n backgroundColor: SEMANTIC_COLORS.bgSecondary,\n }}\n >\n <input\n type=\"text\"\n value={newPresetName}\n onChange={(e) => setNewPresetName(e.target.value)}\n placeholder=\"Preset name...\"\n autoFocus\n style={{\n width: '100%',\n padding: '8px 10px',\n border: `1px solid ${SEMANTIC_COLORS.borderDefault}`,\n borderRadius: '4px',\n fontSize: '13px',\n marginBottom: '8px',\n boxSizing: 'border-box',\n backgroundColor: SEMANTIC_COLORS.bgPrimary,\n color: SEMANTIC_COLORS.textPrimary,\n }}\n />\n <input\n type=\"text\"\n value={newPresetDescription}\n onChange={(e) => setNewPresetDescription(e.target.value)}\n placeholder=\"Description (optional)...\"\n style={{\n width: '100%',\n padding: '8px 10px',\n border: `1px solid ${SEMANTIC_COLORS.borderDefault}`,\n borderRadius: '4px',\n fontSize: '13px',\n marginBottom: '8px',\n boxSizing: 'border-box',\n backgroundColor: SEMANTIC_COLORS.bgPrimary,\n color: SEMANTIC_COLORS.textPrimary,\n }}\n />\n <div style={{ display: 'flex', gap: '8px', justifyContent: 'flex-end' }}>\n <button\n onClick={() => {\n setShowSaveDialog(false);\n setNewPresetName('');\n setNewPresetDescription('');\n }}\n style={{\n padding: '6px 12px',\n fontSize: '12px',\n backgroundColor: SEMANTIC_COLORS.bgPrimary,\n border: `1px solid ${SEMANTIC_COLORS.borderDefault}`,\n borderRadius: '4px',\n cursor: 'pointer',\n color: SEMANTIC_COLORS.textSecondary,\n }}\n >\n Cancel\n </button>\n <button\n onClick={handleSavePreset}\n disabled={!newPresetName.trim()}\n style={{\n padding: '6px 12px',\n fontSize: '12px',\n backgroundColor: newPresetName.trim()\n ? SEMANTIC_COLORS.statusSuccessBg\n : SEMANTIC_COLORS.bgTertiary,\n color: newPresetName.trim() ? SEMANTIC_COLORS.actionPrimaryFg : SEMANTIC_COLORS.textTertiary,\n border: 'none',\n borderRadius: '4px',\n cursor: newPresetName.trim() ? 'pointer' : 'not-allowed',\n fontWeight: 500,\n }}\n >\n Save\n </button>\n </div>\n </div>\n )}\n\n {/* Preset List */}\n <div style={{ maxHeight: '300px', overflowY: 'auto' }}>\n {presets.map((preset) => (\n <div\n key={preset.id}\n onClick={() => {\n onApplyPreset(preset.id);\n setIsOpen(false);\n }}\n style={{\n padding: '10px 16px',\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n backgroundColor: activePresetId === preset.id ? SEMANTIC_COLORS.actionPrimaryBgSubtle : 'transparent',\n borderLeft:\n activePresetId === preset.id\n ? `3px solid ${SEMANTIC_COLORS.actionPrimaryBg}`\n : '3px solid transparent',\n transition: 'background-color 0.15s ease',\n }}\n onMouseEnter={(e) => {\n if (activePresetId !== preset.id) {\n e.currentTarget.style.backgroundColor = SEMANTIC_COLORS.bgSecondary;\n }\n }}\n onMouseLeave={(e) => {\n if (activePresetId !== preset.id) {\n e.currentTarget.style.backgroundColor = 'transparent';\n }\n }}\n >\n <div style={{ flex: 1 }}>\n <div\n style={{\n fontSize: '13px',\n fontWeight: 500,\n color: SEMANTIC_COLORS.textPrimary,\n display: 'flex',\n alignItems: 'center',\n gap: '6px',\n }}\n >\n {preset.name}\n {preset.isDefault && (\n <span\n style={{\n fontSize: '10px',\n padding: '2px 6px',\n backgroundColor: SEMANTIC_COLORS.bgTertiary,\n borderRadius: '4px',\n color: SEMANTIC_COLORS.textSecondary,\n }}\n >\n Default\n </span>\n )}\n </div>\n {preset.description && (\n <div style={{ fontSize: '11px', color: SEMANTIC_COLORS.textTertiary, marginTop: '2px' }}>\n {preset.description}\n </div>\n )}\n </div>\n\n {/* Delete button (not for default or system presets) */}\n {!preset.isDefault && !preset.id.startsWith('preset-last') && !preset.id.startsWith('preset-this') && (\n <button\n onClick={(e) => handleDeletePreset(e, preset.id)}\n style={{\n padding: '4px',\n backgroundColor: 'transparent',\n border: 'none',\n cursor: 'pointer',\n color: SEMANTIC_COLORS.textTertiary,\n borderRadius: '4px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = SEMANTIC_COLORS.statusErrorBgSubtle;\n e.currentTarget.style.color = SEMANTIC_COLORS.statusErrorText;\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = 'transparent';\n e.currentTarget.style.color = SEMANTIC_COLORS.textTertiary;\n }}\n title=\"Delete preset\"\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <polyline points=\"3,6 5,6 21,6\" />\n <path d=\"M19,6v14a2,2,0,01-2,2H7a2,2,0,01-2-2V6m3,0V4a2,2,0,012-2h4a2,2,0,012,2v2\" />\n </svg>\n </button>\n )}\n\n {/* Checkmark for active preset */}\n {activePresetId === preset.id && (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke={SEMANTIC_COLORS.actionPrimaryBg}\n strokeWidth=\"3\"\n style={{ marginLeft: '8px' }}\n >\n <polyline points=\"20,6 9,17 4,12\" />\n </svg>\n )}\n </div>\n ))}\n\n {presets.length === 0 && (\n <div\n style={{\n padding: '20px 16px',\n textAlign: 'center',\n color: SEMANTIC_COLORS.textTertiary,\n fontSize: '13px',\n }}\n >\n No presets saved yet\n </div>\n )}\n </div>\n </div>\n )}\n </div>\n );\n}\n\nexport default FilterPresetSelector;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"FilterPresetSelector.js","names":[],"sources":["../../../../../src/bigconsole/components/dashboard/GlobalFiltersBar/FilterPresetSelector.tsx"],"sourcesContent":["/**\n * FilterPresetSelector Component\n *\n * Dropdown to select, save, and manage filter presets.\n */\n\nimport React, { useState, useRef, useEffect } from 'react';\nimport type { FilterPreset } from '../../../hooks/useFilterPresets';\nimport { SEMANTIC_COLORS } from '../../../utils/semanticTokens';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface FilterPresetSelectorProps {\n presets: FilterPreset[];\n activePresetId: string | null;\n onApplyPreset: (presetId: string) => void;\n onSavePreset: (name: string, description?: string) => void;\n onDeletePreset: (presetId: string) => void;\n disabled?: boolean;\n}\n\n// ============================================================================\n// Component\n// ============================================================================\n\nexport function FilterPresetSelector({\n presets,\n activePresetId,\n onApplyPreset,\n onSavePreset,\n onDeletePreset,\n disabled = false,\n}: FilterPresetSelectorProps) {\n const { t } = useI18n();\n const [isOpen, setIsOpen] = useState(false);\n const [showSaveDialog, setShowSaveDialog] = useState(false);\n const [newPresetName, setNewPresetName] = useState('');\n const [newPresetDescription, setNewPresetDescription] = useState('');\n const dropdownRef = useRef<HTMLDivElement>(null);\n\n const activePreset = presets.find((p) => p.id === activePresetId);\n\n // Close dropdown when clicking outside\n useEffect(() => {\n function handleClickOutside(event: MouseEvent) {\n if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) {\n setIsOpen(false);\n setShowSaveDialog(false);\n }\n }\n\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, []);\n\n const handleSavePreset = () => {\n if (newPresetName.trim()) {\n onSavePreset(newPresetName.trim(), newPresetDescription.trim() || undefined);\n setNewPresetName('');\n setNewPresetDescription('');\n setShowSaveDialog(false);\n setIsOpen(false);\n }\n };\n\n const handleDeletePreset = (e: React.MouseEvent, presetId: string) => {\n e.stopPropagation();\n if (window.confirm(t('bigconsole.filters.presets.deleteConfirm', 'Are you sure you want to delete this preset?'))) {\n onDeletePreset(presetId);\n }\n };\n\n return (\n <div ref={dropdownRef} style={{ position: 'relative', display: 'inline-block' }}>\n {/* Preset Button */}\n <button\n onClick={() => !disabled && setIsOpen(!isOpen)}\n disabled={disabled}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n padding: '8px 14px',\n backgroundColor: activePreset ? SEMANTIC_COLORS.statusSuccessBgSubtle : SEMANTIC_COLORS.bgPrimary,\n border: `1px solid ${activePreset ? SEMANTIC_COLORS.statusSuccessBg : SEMANTIC_COLORS.borderDefault}`,\n borderRadius: '6px',\n cursor: disabled ? 'not-allowed' : 'pointer',\n fontSize: '13px',\n color: activePreset ? SEMANTIC_COLORS.statusSuccessText : SEMANTIC_COLORS.textSecondary,\n fontWeight: 500,\n opacity: disabled ? 0.6 : 1,\n minWidth: '140px',\n justifyContent: 'space-between',\n }}\n >\n <span style={{ display: 'flex', alignItems: 'center', gap: '6px' }}>\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <path d=\"M19 21H5a2 2 0 01-2-2V5a2 2 0 012-2h11l5 5v11a2 2 0 01-2 2z\" />\n <polyline points=\"17,21 17,13 7,13 7,21\" />\n <polyline points=\"7,3 7,8 15,8\" />\n </svg>\n {activePreset ? activePreset.name : t('bigconsole.filters.presets.buttonLabel', 'Presets')}\n </span>\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n style={{\n transform: isOpen ? 'rotate(180deg)' : 'rotate(0deg)',\n transition: 'transform 0.2s ease',\n }}\n >\n <polyline points=\"6,9 12,15 18,9\" />\n </svg>\n </button>\n\n {/* Dropdown Menu */}\n {isOpen && (\n <div\n style={{\n position: 'absolute',\n top: '100%',\n left: 0,\n marginTop: '4px',\n minWidth: '280px',\n backgroundColor: SEMANTIC_COLORS.bgPrimary,\n border: `1px solid ${SEMANTIC_COLORS.borderDefault}`,\n borderRadius: '8px',\n boxShadow: '0 4px 16px rgba(0,0,0,0.15)',\n zIndex: 100000,\n overflow: 'hidden',\n }}\n >\n {/* Header */}\n <div\n style={{\n padding: '12px 16px',\n borderBottom: `1px solid ${SEMANTIC_COLORS.borderDefault}`,\n backgroundColor: SEMANTIC_COLORS.bgSecondary,\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n }}\n >\n <span style={{ fontWeight: 600, fontSize: '13px', color: SEMANTIC_COLORS.textPrimary }}>\n {t('bigconsole.filters.presets.header', 'Filter Presets')}\n </span>\n <button\n onClick={() => setShowSaveDialog(true)}\n style={{\n padding: '4px 10px',\n fontSize: '12px',\n backgroundColor: SEMANTIC_COLORS.actionPrimaryBg,\n color: SEMANTIC_COLORS.actionPrimaryFg,\n border: 'none',\n borderRadius: '4px',\n cursor: 'pointer',\n fontWeight: 500,\n }}\n >\n {t('bigconsole.filters.presets.saveCurrent', '+ Save Current')}\n </button>\n </div>\n\n {/* Save Dialog */}\n {showSaveDialog && (\n <div\n style={{\n padding: '12px 16px',\n borderBottom: `1px solid ${SEMANTIC_COLORS.borderDefault}`,\n backgroundColor: SEMANTIC_COLORS.bgSecondary,\n }}\n >\n <input\n type=\"text\"\n value={newPresetName}\n onChange={(e) => setNewPresetName(e.target.value)}\n placeholder={t('bigconsole.filters.presets.namePlaceholder', 'Preset name...')}\n autoFocus\n style={{\n width: '100%',\n padding: '8px 10px',\n border: `1px solid ${SEMANTIC_COLORS.borderDefault}`,\n borderRadius: '4px',\n fontSize: '13px',\n marginBottom: '8px',\n boxSizing: 'border-box',\n backgroundColor: SEMANTIC_COLORS.bgPrimary,\n color: SEMANTIC_COLORS.textPrimary,\n }}\n />\n <input\n type=\"text\"\n value={newPresetDescription}\n onChange={(e) => setNewPresetDescription(e.target.value)}\n placeholder={t('bigconsole.filters.presets.descriptionPlaceholder', 'Description (optional)...')}\n style={{\n width: '100%',\n padding: '8px 10px',\n border: `1px solid ${SEMANTIC_COLORS.borderDefault}`,\n borderRadius: '4px',\n fontSize: '13px',\n marginBottom: '8px',\n boxSizing: 'border-box',\n backgroundColor: SEMANTIC_COLORS.bgPrimary,\n color: SEMANTIC_COLORS.textPrimary,\n }}\n />\n <div style={{ display: 'flex', gap: '8px', justifyContent: 'flex-end' }}>\n <button\n onClick={() => {\n setShowSaveDialog(false);\n setNewPresetName('');\n setNewPresetDescription('');\n }}\n style={{\n padding: '6px 12px',\n fontSize: '12px',\n backgroundColor: SEMANTIC_COLORS.bgPrimary,\n border: `1px solid ${SEMANTIC_COLORS.borderDefault}`,\n borderRadius: '4px',\n cursor: 'pointer',\n color: SEMANTIC_COLORS.textSecondary,\n }}\n >\n {t('bigconsole.filters.presets.cancel', 'Cancel')}\n </button>\n <button\n onClick={handleSavePreset}\n disabled={!newPresetName.trim()}\n style={{\n padding: '6px 12px',\n fontSize: '12px',\n backgroundColor: newPresetName.trim()\n ? SEMANTIC_COLORS.statusSuccessBg\n : SEMANTIC_COLORS.bgTertiary,\n color: newPresetName.trim() ? SEMANTIC_COLORS.actionPrimaryFg : SEMANTIC_COLORS.textTertiary,\n border: 'none',\n borderRadius: '4px',\n cursor: newPresetName.trim() ? 'pointer' : 'not-allowed',\n fontWeight: 500,\n }}\n >\n {t('bigconsole.filters.presets.save', 'Save')}\n </button>\n </div>\n </div>\n )}\n\n {/* Preset List */}\n <div style={{ maxHeight: '300px', overflowY: 'auto' }}>\n {presets.map((preset) => (\n <div\n key={preset.id}\n onClick={() => {\n onApplyPreset(preset.id);\n setIsOpen(false);\n }}\n style={{\n padding: '10px 16px',\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n backgroundColor: activePresetId === preset.id ? SEMANTIC_COLORS.actionPrimaryBgSubtle : 'transparent',\n borderLeft:\n activePresetId === preset.id\n ? `3px solid ${SEMANTIC_COLORS.actionPrimaryBg}`\n : '3px solid transparent',\n transition: 'background-color 0.15s ease',\n }}\n onMouseEnter={(e) => {\n if (activePresetId !== preset.id) {\n e.currentTarget.style.backgroundColor = SEMANTIC_COLORS.bgSecondary;\n }\n }}\n onMouseLeave={(e) => {\n if (activePresetId !== preset.id) {\n e.currentTarget.style.backgroundColor = 'transparent';\n }\n }}\n >\n <div style={{ flex: 1 }}>\n <div\n style={{\n fontSize: '13px',\n fontWeight: 500,\n color: SEMANTIC_COLORS.textPrimary,\n display: 'flex',\n alignItems: 'center',\n gap: '6px',\n }}\n >\n {preset.name}\n {preset.isDefault && (\n <span\n style={{\n fontSize: '10px',\n padding: '2px 6px',\n backgroundColor: SEMANTIC_COLORS.bgTertiary,\n borderRadius: '4px',\n color: SEMANTIC_COLORS.textSecondary,\n }}\n >\n {t('bigconsole.filters.presets.defaultBadge', 'Default')}\n </span>\n )}\n </div>\n {preset.description && (\n <div style={{ fontSize: '11px', color: SEMANTIC_COLORS.textTertiary, marginTop: '2px' }}>\n {preset.description}\n </div>\n )}\n </div>\n\n {/* Delete button (not for default or system presets) */}\n {!preset.isDefault && !preset.id.startsWith('preset-last') && !preset.id.startsWith('preset-this') && (\n <button\n onClick={(e) => handleDeletePreset(e, preset.id)}\n style={{\n padding: '4px',\n backgroundColor: 'transparent',\n border: 'none',\n cursor: 'pointer',\n color: SEMANTIC_COLORS.textTertiary,\n borderRadius: '4px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = SEMANTIC_COLORS.statusErrorBgSubtle;\n e.currentTarget.style.color = SEMANTIC_COLORS.statusErrorText;\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = 'transparent';\n e.currentTarget.style.color = SEMANTIC_COLORS.textTertiary;\n }}\n title={t('bigconsole.filters.presets.deletePresetTitle', 'Delete preset')}\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <polyline points=\"3,6 5,6 21,6\" />\n <path d=\"M19,6v14a2,2,0,01-2,2H7a2,2,0,01-2-2V6m3,0V4a2,2,0,012-2h4a2,2,0,012,2v2\" />\n </svg>\n </button>\n )}\n\n {/* Checkmark for active preset */}\n {activePresetId === preset.id && (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke={SEMANTIC_COLORS.actionPrimaryBg}\n strokeWidth=\"3\"\n style={{ marginLeft: '8px' }}\n >\n <polyline points=\"20,6 9,17 4,12\" />\n </svg>\n )}\n </div>\n ))}\n\n {presets.length === 0 && (\n <div\n style={{\n padding: '20px 16px',\n textAlign: 'center',\n color: SEMANTIC_COLORS.textTertiary,\n fontSize: '13px',\n }}\n >\n {t('bigconsole.filters.presets.emptyState', 'No presets saved yet')}\n </div>\n )}\n </div>\n </div>\n )}\n </div>\n );\n}\n\nexport default FilterPresetSelector;\n"],"mappings":"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"}
|