@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.
Files changed (134) hide show
  1. package/dist/bigconsole/components/builder/inspector/DataBindingSection.js +109 -113
  2. package/dist/bigconsole/components/builder/inspector/DataBindingSection.js.map +1 -1
  3. package/dist/bigconsole/components/dashboard/CreateDashboardDialog.js +115 -113
  4. package/dist/bigconsole/components/dashboard/CreateDashboardDialog.js.map +1 -1
  5. package/dist/bigconsole/components/dashboard/DashboardCanvas.js +71 -62
  6. package/dist/bigconsole/components/dashboard/DashboardCanvas.js.map +1 -1
  7. package/dist/bigconsole/components/dashboard/DashboardToolbar.js +90 -89
  8. package/dist/bigconsole/components/dashboard/DashboardToolbar.js.map +1 -1
  9. package/dist/bigconsole/components/dashboard/DrilldownBreadcrumb.js +56 -54
  10. package/dist/bigconsole/components/dashboard/DrilldownBreadcrumb.js.map +1 -1
  11. package/dist/bigconsole/components/dashboard/GlobalFiltersBar/FilterChip.js +126 -125
  12. package/dist/bigconsole/components/dashboard/GlobalFiltersBar/FilterChip.js.map +1 -1
  13. package/dist/bigconsole/components/dashboard/GlobalFiltersBar/FilterEditor.js +151 -150
  14. package/dist/bigconsole/components/dashboard/GlobalFiltersBar/FilterEditor.js.map +1 -1
  15. package/dist/bigconsole/components/dashboard/GlobalFiltersBar/FilterPresetSelector.js +77 -76
  16. package/dist/bigconsole/components/dashboard/GlobalFiltersBar/FilterPresetSelector.js.map +1 -1
  17. package/dist/bigconsole/components/dashboard/GlobalFiltersBar/GlobalFiltersBar.js +97 -96
  18. package/dist/bigconsole/components/dashboard/GlobalFiltersBar/GlobalFiltersBar.js.map +1 -1
  19. package/dist/bigconsole/components/dashboard/ImportDashboardDialog.js +172 -191
  20. package/dist/bigconsole/components/dashboard/ImportDashboardDialog.js.map +1 -1
  21. package/dist/bigconsole/components/dashboard/PublishToStoreDialog.js +75 -83
  22. package/dist/bigconsole/components/dashboard/PublishToStoreDialog.js.map +1 -1
  23. package/dist/bigconsole/components/dashboard/SavedViewsDropdown/SavedViewsDropdown.js +151 -154
  24. package/dist/bigconsole/components/dashboard/SavedViewsDropdown/SavedViewsDropdown.js.map +1 -1
  25. package/dist/bigconsole/components/dashboard/ShareDialog/EmbedTab.js +181 -190
  26. package/dist/bigconsole/components/dashboard/ShareDialog/EmbedTab.js.map +1 -1
  27. package/dist/bigconsole/components/dashboard/TemplatePicker/TemplatePicker.js +1 -0
  28. package/dist/bigconsole/components/dashboard/WidgetPalette.js +110 -108
  29. package/dist/bigconsole/components/dashboard/WidgetPalette.js.map +1 -1
  30. package/dist/bigconsole/components/datasink/CacheTTLSelector.js +102 -103
  31. package/dist/bigconsole/components/datasink/CacheTTLSelector.js.map +1 -1
  32. package/dist/bigconsole/components/datasink/DataSinkDeleteDialog.js +36 -41
  33. package/dist/bigconsole/components/datasink/DataSinkDeleteDialog.js.map +1 -1
  34. package/dist/bigconsole/components/datasink/DataSinkRefreshDialog.js +38 -37
  35. package/dist/bigconsole/components/datasink/DataSinkRefreshDialog.js.map +1 -1
  36. package/dist/bigconsole/components/datasink/ImportDataGuideDialog.js +113 -117
  37. package/dist/bigconsole/components/datasink/ImportDataGuideDialog.js.map +1 -1
  38. package/dist/bigconsole/components/datasink/ImportDataSinkDialog.js +182 -197
  39. package/dist/bigconsole/components/datasink/ImportDataSinkDialog.js.map +1 -1
  40. package/dist/bigconsole/components/datasink/RefreshTypeSelector.js +166 -168
  41. package/dist/bigconsole/components/datasink/RefreshTypeSelector.js.map +1 -1
  42. package/dist/bigconsole/components/parser/DataSinkSelector.js +87 -86
  43. package/dist/bigconsole/components/parser/DataSinkSelector.js.map +1 -1
  44. package/dist/bigconsole/components/parser/ImportParserDialog.js +196 -211
  45. package/dist/bigconsole/components/parser/ImportParserDialog.js.map +1 -1
  46. package/dist/bigconsole/components/parser/ParserSelector.js +130 -128
  47. package/dist/bigconsole/components/parser/ParserSelector.js.map +1 -1
  48. package/dist/bigconsole/components/preview/AiPreviewMiniPanel.js +66 -63
  49. package/dist/bigconsole/components/preview/AiPreviewMiniPanel.js.map +1 -1
  50. package/dist/bigconsole/components/preview/AiPreviewPanel.js +95 -91
  51. package/dist/bigconsole/components/preview/AiPreviewPanel.js.map +1 -1
  52. package/dist/bigconsole/components/widgets/ActionConfigDialog.js +222 -215
  53. package/dist/bigconsole/components/widgets/ActionConfigDialog.js.map +1 -1
  54. package/dist/bigconsole/components/widgets/DrilldownConfigPanel.js +149 -145
  55. package/dist/bigconsole/components/widgets/DrilldownConfigPanel.js.map +1 -1
  56. package/dist/bigconsole/components/widgets/PropertiesPanel.js +504 -470
  57. package/dist/bigconsole/components/widgets/PropertiesPanel.js.map +1 -1
  58. package/dist/bigconsole/components/widgets/calendar/CalendarWidget.js +44 -47
  59. package/dist/bigconsole/components/widgets/calendar/CalendarWidget.js.map +1 -1
  60. package/dist/bigconsole/components/widgets/chart/ChartConfig.js +143 -142
  61. package/dist/bigconsole/components/widgets/chart/ChartConfig.js.map +1 -1
  62. package/dist/bigconsole/components/widgets/comments/WidgetComments.js +101 -88
  63. package/dist/bigconsole/components/widgets/comments/WidgetComments.js.map +1 -1
  64. package/dist/bigconsole/components/widgets/event-logs/EventLogViewer.js +135 -134
  65. package/dist/bigconsole/components/widgets/event-logs/EventLogViewer.js.map +1 -1
  66. package/dist/bigconsole/components/widgets/form/FormWidget.js +167 -159
  67. package/dist/bigconsole/components/widgets/form/FormWidget.js.map +1 -1
  68. package/dist/bigconsole/components/widgets/gauge/GaugeConfig.js +69 -68
  69. package/dist/bigconsole/components/widgets/gauge/GaugeConfig.js.map +1 -1
  70. package/dist/bigconsole/components/widgets/heatmap/HeatmapConfig.js +64 -72
  71. package/dist/bigconsole/components/widgets/heatmap/HeatmapConfig.js.map +1 -1
  72. package/dist/bigconsole/components/widgets/kanban/KanbanWidget.js +60 -59
  73. package/dist/bigconsole/components/widgets/kanban/KanbanWidget.js.map +1 -1
  74. package/dist/bigconsole/components/widgets/list/ListConfig.js +57 -56
  75. package/dist/bigconsole/components/widgets/list/ListConfig.js.map +1 -1
  76. package/dist/bigconsole/components/widgets/metric-card/MetricCardConfig.js +70 -69
  77. package/dist/bigconsole/components/widgets/metric-card/MetricCardConfig.js.map +1 -1
  78. package/dist/bigconsole/components/widgets/metric-card/SparklineChart.js +35 -34
  79. package/dist/bigconsole/components/widgets/metric-card/SparklineChart.js.map +1 -1
  80. package/dist/bigconsole/components/widgets/metric-card/TrendIndicator.js +20 -19
  81. package/dist/bigconsole/components/widgets/metric-card/TrendIndicator.js.map +1 -1
  82. package/dist/bigconsole/components/widgets/pivot-table/PivotTableWidget.js +178 -177
  83. package/dist/bigconsole/components/widgets/pivot-table/PivotTableWidget.js.map +1 -1
  84. package/dist/bigconsole/components/widgets/progress/ProgressConfig.js +76 -75
  85. package/dist/bigconsole/components/widgets/progress/ProgressConfig.js.map +1 -1
  86. package/dist/bigconsole/components/widgets/table/TableConfig.js +183 -168
  87. package/dist/bigconsole/components/widgets/table/TableConfig.js.map +1 -1
  88. package/dist/bigconsole/components/widgets/webhook-config/WebhookConfigPanel.js +187 -180
  89. package/dist/bigconsole/components/widgets/webhook-config/WebhookConfigPanel.js.map +1 -1
  90. package/dist/bigconsole/customWidget/CustomWidgetBuilderSheet.js +40 -38
  91. package/dist/bigconsole/customWidget/CustomWidgetBuilderSheet.js.map +1 -1
  92. package/dist/bigconsole/customWidget/CustomWidgetProposalPanel.js +150 -148
  93. package/dist/bigconsole/customWidget/CustomWidgetProposalPanel.js.map +1 -1
  94. package/dist/bigconsole/pages/DashboardBuilderPage.js +181 -176
  95. package/dist/bigconsole/pages/DashboardBuilderPage.js.map +1 -1
  96. package/dist/bigconsole/pages/DashboardViewPage.js +196 -192
  97. package/dist/bigconsole/pages/DashboardViewPage.js.map +1 -1
  98. package/dist/bigconsole/pages/DashboardsPage.js +223 -219
  99. package/dist/bigconsole/pages/DashboardsPage.js.map +1 -1
  100. package/dist/bigconsole/pages/DataParsersPage.js +167 -170
  101. package/dist/bigconsole/pages/DataParsersPage.js.map +1 -1
  102. package/dist/bigconsole/pages/DataSinkBuilderPage.js +204 -189
  103. package/dist/bigconsole/pages/DataSinkBuilderPage.js.map +1 -1
  104. package/dist/bigconsole/pages/DataSinkViewPage.js +175 -169
  105. package/dist/bigconsole/pages/DataSinkViewPage.js.map +1 -1
  106. package/dist/bigconsole/pages/DataSourcesPage.js +8 -7
  107. package/dist/bigconsole/pages/DataSourcesPage.js.map +1 -1
  108. package/dist/bigconsole/pages/InsightsPage.js +238 -208
  109. package/dist/bigconsole/pages/InsightsPage.js.map +1 -1
  110. package/dist/bigconsole/pages/ParserBuilderPage.js +464 -412
  111. package/dist/bigconsole/pages/ParserBuilderPage.js.map +1 -1
  112. package/dist/bigconsole/pages/ParserViewPage.js +92 -90
  113. package/dist/bigconsole/pages/ParserViewPage.js.map +1 -1
  114. package/dist/bigconsole/pages/PipelineBuilderPage.js +221 -194
  115. package/dist/bigconsole/pages/PipelineBuilderPage.js.map +1 -1
  116. package/dist/bigconsole/pages/PipelineViewPage.js +181 -184
  117. package/dist/bigconsole/pages/PipelineViewPage.js.map +1 -1
  118. package/dist/bigconsole/pages/PipelinesPage.js +128 -127
  119. package/dist/bigconsole/pages/PipelinesPage.js.map +1 -1
  120. package/dist/bigconsole/pages/SettingsPage.js +177 -172
  121. package/dist/bigconsole/pages/SettingsPage.js.map +1 -1
  122. package/dist/bigconsole/pages/WidgetDemoPage.js +121 -83
  123. package/dist/bigconsole/pages/WidgetDemoPage.js.map +1 -1
  124. package/dist/bigconsole/pages/WorkflowViewPage.js +199 -193
  125. package/dist/bigconsole/pages/WorkflowViewPage.js.map +1 -1
  126. package/dist/bigconsole/pages/WorkflowsPage.js +129 -128
  127. package/dist/bigconsole/pages/WorkflowsPage.js.map +1 -1
  128. package/dist/bigconsole/renderers/adapters/AdaptiveCardRenderer.js +111 -109
  129. package/dist/bigconsole/renderers/adapters/AdaptiveCardRenderer.js.map +1 -1
  130. package/dist/bigconsole/renderers/adapters/BlockKitRenderer.js +127 -126
  131. package/dist/bigconsole/renderers/adapters/BlockKitRenderer.js.map +1 -1
  132. package/dist/bigconsole/renderers/adapters/CustomRenderer.js +103 -103
  133. package/dist/bigconsole/renderers/adapters/CustomRenderer.js.map +1 -1
  134. 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":"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"}
@@ -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 { jsx as i, jsxs as a } from "react/jsx-runtime";
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 o({ presets: o, activePresetId: s, onApplyPreset: c, onSavePreset: l, onDeletePreset: u, disabled: d = !1 }) {
6
- let [f, p] = r(!1), [m, h] = r(!1), [g, _] = r(""), [v, y] = r(""), b = n(null), x = o.find((e) => e.id === s);
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
- b.current && !b.current.contains(e.target) && (p(!1), h(!1));
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 S = () => {
14
- g.trim() && (l(g.trim(), v.trim() || void 0), _(""), y(""), h(!1), p(!1));
15
- }, C = (e, t) => {
16
- e.stopPropagation(), window.confirm("Are you sure you want to delete this preset?") && u(t);
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__ */ a("div", {
19
- ref: b,
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__ */ a("button", {
25
- onClick: () => !d && p(!f),
26
- disabled: d,
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: x ? e.statusSuccessBgSubtle : e.bgPrimary,
33
- border: `1px solid ${x ? e.statusSuccessBg : e.borderDefault}`,
33
+ backgroundColor: C ? e.statusSuccessBgSubtle : e.bgPrimary,
34
+ border: `1px solid ${C ? e.statusSuccessBg : e.borderDefault}`,
34
35
  borderRadius: "6px",
35
- cursor: d ? "not-allowed" : "pointer",
36
+ cursor: f ? "not-allowed" : "pointer",
36
37
  fontSize: "13px",
37
- color: x ? e.statusSuccessText : e.textSecondary,
38
+ color: C ? e.statusSuccessText : e.textSecondary,
38
39
  fontWeight: 500,
39
- opacity: d ? .6 : 1,
40
+ opacity: f ? .6 : 1,
40
41
  minWidth: "140px",
41
42
  justifyContent: "space-between"
42
43
  },
43
- children: [/* @__PURE__ */ a("span", {
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__ */ a("svg", {
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__ */ i("path", { d: "M19 21H5a2 2 0 01-2-2V5a2 2 0 012-2h11l5 5v11a2 2 0 01-2 2z" }),
58
- /* @__PURE__ */ i("polyline", { points: "17,21 17,13 7,13 7,21" }),
59
- /* @__PURE__ */ i("polyline", { points: "7,3 7,8 15,8" })
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
- }), x ? x.name : "Presets"]
62
- }), /* @__PURE__ */ i("svg", {
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: f ? "rotate(180deg)" : "rotate(0deg)",
71
+ transform: m ? "rotate(180deg)" : "rotate(0deg)",
71
72
  transition: "transform 0.2s ease"
72
73
  },
73
- children: /* @__PURE__ */ i("polyline", { points: "6,9 12,15 18,9" })
74
+ children: /* @__PURE__ */ a("polyline", { points: "6,9 12,15 18,9" })
74
75
  })]
75
- }), f && /* @__PURE__ */ a("div", {
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__ */ a("div", {
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__ */ i("span", {
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__ */ i("button", {
107
- onClick: () => h(!0),
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
- m && /* @__PURE__ */ a("div", {
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__ */ i("input", {
129
+ /* @__PURE__ */ a("input", {
129
130
  type: "text",
130
- value: g,
131
- onChange: (e) => _(e.target.value),
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__ */ i("input", {
147
+ /* @__PURE__ */ a("input", {
147
148
  type: "text",
148
- value: v,
149
- onChange: (e) => y(e.target.value),
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__ */ a("div", {
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__ */ i("button", {
170
+ children: [/* @__PURE__ */ a("button", {
170
171
  onClick: () => {
171
- h(!1), _(""), y("");
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__ */ i("button", {
184
- onClick: S,
185
- disabled: !g.trim(),
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: g.trim() ? e.statusSuccessBg : e.bgTertiary,
190
- color: g.trim() ? e.actionPrimaryFg : e.textTertiary,
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: g.trim() ? "pointer" : "not-allowed",
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__ */ a("div", {
202
+ /* @__PURE__ */ o("div", {
202
203
  style: {
203
204
  maxHeight: "300px",
204
205
  overflowY: "auto"
205
206
  },
206
- children: [o.map((t) => /* @__PURE__ */ a("div", {
207
+ children: [s.map((t) => /* @__PURE__ */ o("div", {
207
208
  onClick: () => {
208
- c(t.id), p(!1);
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: s === t.id ? e.actionPrimaryBgSubtle : "transparent",
217
- borderLeft: s === t.id ? `3px solid ${e.actionPrimaryBg}` : "3px solid transparent",
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
- s !== t.id && (n.currentTarget.style.backgroundColor = e.bgSecondary);
222
+ c !== t.id && (n.currentTarget.style.backgroundColor = e.bgSecondary);
222
223
  },
223
224
  onMouseLeave: (e) => {
224
- s !== t.id && (e.currentTarget.style.backgroundColor = "transparent");
225
+ c !== t.id && (e.currentTarget.style.backgroundColor = "transparent");
225
226
  },
226
227
  children: [
227
- /* @__PURE__ */ a("div", {
228
+ /* @__PURE__ */ o("div", {
228
229
  style: { flex: 1 },
229
- children: [/* @__PURE__ */ a("div", {
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__ */ i("span", {
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__ */ i("div", {
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__ */ i("button", {
258
- onClick: (e) => C(e, t.id),
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__ */ a("svg", {
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__ */ i("polyline", { points: "3,6 5,6 21,6" }), /* @__PURE__ */ i("path", { d: "M19,6v14a2,2,0,01-2,2H7a2,2,0,01-2-2V6m3,0V4a2,2,0,012-2h4a2,2,0,012,2v2" })]
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
- s === t.id && /* @__PURE__ */ i("svg", {
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__ */ i("polyline", { points: "20,6 9,17 4,12" })
296
+ children: /* @__PURE__ */ a("polyline", { points: "20,6 9,17 4,12" })
296
297
  })
297
298
  ]
298
- }, t.id)), o.length === 0 && /* @__PURE__ */ i("div", {
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 { o as default };
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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"}