@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
@@ -7,84 +7,85 @@ import i from "./FilterChip.js";
7
7
  import a from "./FilterEditor.js";
8
8
  import o from "./FilterPresetSelector.js";
9
9
  import { useCallback as s, useEffect as c, useState as l } from "react";
10
+ import { useI18n as ee } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
10
11
  import { jsx as u, jsxs as d } from "react/jsx-runtime";
11
12
  //#region src/bigconsole/components/dashboard/GlobalFiltersBar/GlobalFiltersBar.tsx
12
- function f({ dashboardId: f, onFilterChange: p, collapsible: ee = !0, className: m = "", enableUrlSync: h = !0, enablePresets: g = !0 }) {
13
- let { filters: _, activeValues: v, loading: y, fetchFilters: b, createFilter: x, updateFilter: S, deleteFilter: C, setFilterValue: w, resetFilters: T } = e(), { getShareableUrl: E, clearUrlParams: D } = t({
14
- enabled: h,
13
+ function f({ dashboardId: f, onFilterChange: p, collapsible: m = !0, className: h = "", enableUrlSync: g = !0, enablePresets: _ = !0 }) {
14
+ let { t: v } = ee(), { filters: y, activeValues: b, loading: x, fetchFilters: S, createFilter: C, updateFilter: w, deleteFilter: T, setFilterValue: E, resetFilters: D } = e(), { getShareableUrl: O, clearUrlParams: k } = t({
15
+ enabled: g,
15
16
  paramPrefix: "filter_",
16
17
  debounceMs: 300
17
- }), { presets: O, activePresetId: k, loadPresets: A, applyPreset: j, saveCurrentAsPreset: M, deletePreset: N, clearActivePreset: P } = n(f), [F, I] = l(!1), [L, R] = l(!1), [z, B] = l(null), [V, H] = l(!1);
18
+ }), { presets: A, activePresetId: j, loadPresets: M, applyPreset: N, saveCurrentAsPreset: P, deletePreset: F, clearActivePreset: I } = n(f), [L, R] = l(!1), [z, B] = l(!1), [V, H] = l(null), [U, W] = l(!1);
18
19
  c(() => {
19
- f && (b(f), g && A(f));
20
+ f && (S(f), _ && M(f));
20
21
  }, [
21
22
  f,
22
- b,
23
- A,
24
- g
23
+ S,
24
+ M,
25
+ _
25
26
  ]), c(() => {
26
- p && p(v);
27
- }, [v, p]), c(() => {
28
- if (k && Object.keys(v).length > 0) {
29
- let e = O.find((e) => e.id === k);
30
- e && JSON.stringify(e.values) !== JSON.stringify(v) && P();
27
+ p && p(b);
28
+ }, [b, p]), c(() => {
29
+ if (j && Object.keys(b).length > 0) {
30
+ let e = A.find((e) => e.id === j);
31
+ e && JSON.stringify(e.values) !== JSON.stringify(b) && I();
31
32
  }
32
33
  }, [
33
- v,
34
- k,
35
- O,
36
- P
34
+ b,
35
+ j,
36
+ A,
37
+ I
37
38
  ]);
38
- let U = s((e, t) => {
39
- w(e, t);
40
- }, [w]), W = s(() => {
41
- B(null), R(!0);
42
- }, []), G = s((e) => {
43
- B(e), R(!0);
44
- }, []), K = s(async (e) => {
45
- z ? await S({
46
- id: z.id,
39
+ let G = s((e, t) => {
40
+ E(e, t);
41
+ }, [E]), K = s(() => {
42
+ H(null), B(!0);
43
+ }, []), q = s((e) => {
44
+ H(e), B(!0);
45
+ }, []), J = s(async (e) => {
46
+ V ? await w({
47
+ id: V.id,
47
48
  name: e.name,
48
49
  config: e.config,
49
50
  defaultValue: e.defaultValue,
50
51
  isRequired: e.isRequired
51
- }) : await x({
52
+ }) : await C({
52
53
  dashboardId: f,
53
54
  name: e.name,
54
55
  type: e.type,
55
56
  config: e.config,
56
57
  defaultValue: e.defaultValue,
57
58
  isRequired: e.isRequired
58
- }), R(!1), B(null);
59
+ }), B(!1), H(null);
59
60
  }, [
60
61
  f,
61
- z,
62
- x,
63
- S
64
- ]), q = s(async (e) => {
65
- await C(e);
66
- }, [C]), J = s(() => {
67
- T(), D(), P();
62
+ V,
63
+ C,
64
+ w
65
+ ]), Y = s(async (e) => {
66
+ await T(e);
67
+ }, [T]), X = s(() => {
68
+ D(), k(), I();
68
69
  }, [
69
- T,
70
70
  D,
71
- P
72
- ]), Y = s(async () => {
73
- let e = E();
71
+ k,
72
+ I
73
+ ]), Z = s(async () => {
74
+ let e = O();
74
75
  try {
75
- await navigator.clipboard.writeText(e), H(!0), setTimeout(() => H(!1), 2e3);
76
+ await navigator.clipboard.writeText(e), W(!0), setTimeout(() => W(!1), 2e3);
76
77
  } catch {}
77
- }, [E]), X = s((e) => {
78
- j(e);
79
- }, [j]), Z = s((e, t) => {
80
- M(e, t);
81
- }, [M]), Q = s((e) => {
78
+ }, [O]), Q = s((e) => {
82
79
  N(e);
83
- }, [N]), te = s(() => {
84
- I((e) => !e);
85
- }, []), $ = Object.keys(v).filter((e) => v[e] !== void 0 && v[e] !== null && v[e] !== "").length;
86
- return y && _.length === 0 ? /* @__PURE__ */ d("div", {
87
- className: m,
80
+ }, [N]), te = s((e, t) => {
81
+ P(e, t);
82
+ }, [P]), ne = s((e) => {
83
+ F(e);
84
+ }, [F]), re = s(() => {
85
+ R((e) => !e);
86
+ }, []), $ = Object.keys(b).filter((e) => b[e] !== void 0 && b[e] !== null && b[e] !== "").length;
87
+ return x && y.length === 0 ? /* @__PURE__ */ d("div", {
88
+ className: h,
88
89
  style: {
89
90
  display: "flex",
90
91
  alignItems: "center",
@@ -105,10 +106,10 @@ function f({ dashboardId: f, onFilterChange: p, collapsible: ee = !0, className:
105
106
  color: r.textSecondary,
106
107
  fontSize: "14px"
107
108
  },
108
- children: "Loading filters..."
109
+ children: v("bigconsole.filters.bar.loading", "Loading filters...")
109
110
  })]
110
- }) : _.length === 0 ? /* @__PURE__ */ d("div", {
111
- className: m,
111
+ }) : y.length === 0 ? /* @__PURE__ */ d("div", {
112
+ className: h,
112
113
  style: {
113
114
  display: "flex",
114
115
  alignItems: "center",
@@ -130,17 +131,17 @@ function f({ dashboardId: f, onFilterChange: p, collapsible: ee = !0, className:
130
131
  fontSize: "14px",
131
132
  color: r.textPrimary
132
133
  },
133
- children: "Filters"
134
+ children: v("bigconsole.filters.bar.title", "Filters")
134
135
  }), /* @__PURE__ */ u("span", {
135
136
  style: {
136
137
  color: r.textTertiary,
137
138
  fontSize: "13px"
138
139
  },
139
- children: "No filters configured"
140
+ children: v("bigconsole.filters.bar.noFiltersConfigured", "No filters configured")
140
141
  })]
141
142
  }),
142
143
  /* @__PURE__ */ u("button", {
143
- onClick: W,
144
+ onClick: K,
144
145
  style: {
145
146
  padding: "6px 14px",
146
147
  fontSize: "13px",
@@ -152,18 +153,18 @@ function f({ dashboardId: f, onFilterChange: p, collapsible: ee = !0, className:
152
153
  fontWeight: 500,
153
154
  boxShadow: "0 2px 4px rgba(99, 102, 241, 0.3)"
154
155
  },
155
- children: "+ Add Filter"
156
+ children: v("bigconsole.filters.bar.addFilter", "+ Add Filter")
156
157
  }),
157
- L && /* @__PURE__ */ u(a, {
158
- filter: z,
159
- onSave: K,
158
+ z && /* @__PURE__ */ u(a, {
159
+ filter: V,
160
+ onSave: J,
160
161
  onClose: () => {
161
- R(!1), B(null);
162
+ B(!1), H(null);
162
163
  }
163
164
  })
164
165
  ]
165
166
  }) : /* @__PURE__ */ d("div", {
166
- className: m,
167
+ className: h,
167
168
  style: {
168
169
  display: "flex",
169
170
  flexDirection: "column",
@@ -178,7 +179,7 @@ function f({ dashboardId: f, onFilterChange: p, collapsible: ee = !0, className:
178
179
  alignItems: "center",
179
180
  justifyContent: "space-between",
180
181
  padding: "10px 16px",
181
- borderBottom: F ? "none" : `1px solid ${r.borderDefault}`,
182
+ borderBottom: L ? "none" : `1px solid ${r.borderDefault}`,
182
183
  backgroundColor: r.bgSecondary
183
184
  },
184
185
  children: [/* @__PURE__ */ d("div", {
@@ -194,7 +195,7 @@ function f({ dashboardId: f, onFilterChange: p, collapsible: ee = !0, className:
194
195
  fontSize: "14px",
195
196
  color: r.textPrimary
196
197
  },
197
- children: "Filters"
198
+ children: v("bigconsole.filters.bar.title", "Filters")
198
199
  }),
199
200
  /* @__PURE__ */ u("span", {
200
201
  style: {
@@ -205,9 +206,9 @@ function f({ dashboardId: f, onFilterChange: p, collapsible: ee = !0, className:
205
206
  borderRadius: "12px",
206
207
  fontWeight: 500
207
208
  },
208
- children: _.length
209
+ children: y.length
209
210
  }),
210
- $ > 0 && /* @__PURE__ */ d("span", {
211
+ $ > 0 && /* @__PURE__ */ u("span", {
211
212
  style: {
212
213
  fontSize: "11px",
213
214
  color: r.statusSuccessText,
@@ -216,7 +217,7 @@ function f({ dashboardId: f, onFilterChange: p, collapsible: ee = !0, className:
216
217
  borderRadius: "12px",
217
218
  fontWeight: 500
218
219
  },
219
- children: [$, " active"]
220
+ children: v("bigconsole.filters.bar.activeCount", "{{count}} active", { count: $ ?? "" })
220
221
  })
221
222
  ]
222
223
  }), /* @__PURE__ */ d("div", {
@@ -226,18 +227,18 @@ function f({ dashboardId: f, onFilterChange: p, collapsible: ee = !0, className:
226
227
  gap: "10px"
227
228
  },
228
229
  children: [
229
- g && /* @__PURE__ */ u(o, {
230
- presets: O,
231
- activePresetId: k,
232
- onApplyPreset: X,
233
- onSavePreset: Z,
234
- onDeletePreset: Q
230
+ _ && /* @__PURE__ */ u(o, {
231
+ presets: A,
232
+ activePresetId: j,
233
+ onApplyPreset: Q,
234
+ onSavePreset: te,
235
+ onDeletePreset: ne
235
236
  }),
236
- h && $ > 0 && /* @__PURE__ */ d("div", {
237
+ g && $ > 0 && /* @__PURE__ */ d("div", {
237
238
  style: { position: "relative" },
238
239
  children: [/* @__PURE__ */ d("button", {
239
- onClick: Y,
240
- title: "Copy shareable URL with filters",
240
+ onClick: Z,
241
+ title: v("bigconsole.filters.bar.shareUrlTitle", "Copy shareable URL with filters"),
241
242
  style: {
242
243
  display: "flex",
243
244
  alignItems: "center",
@@ -268,8 +269,8 @@ function f({ dashboardId: f, onFilterChange: p, collapsible: ee = !0, className:
268
269
  y2: "15"
269
270
  })
270
271
  ]
271
- }), "Share"]
272
- }), V && /* @__PURE__ */ u("div", {
272
+ }), v("bigconsole.filters.bar.share", "Share")]
273
+ }), U && /* @__PURE__ */ u("div", {
273
274
  style: {
274
275
  position: "absolute",
275
276
  top: "100%",
@@ -284,11 +285,11 @@ function f({ dashboardId: f, onFilterChange: p, collapsible: ee = !0, className:
284
285
  whiteSpace: "nowrap",
285
286
  zIndex: 100001
286
287
  },
287
- children: "URL copied!"
288
+ children: v("bigconsole.filters.bar.urlCopied", "URL copied!")
288
289
  })]
289
290
  }),
290
291
  $ > 0 && /* @__PURE__ */ u("button", {
291
- onClick: J,
292
+ onClick: X,
292
293
  style: {
293
294
  padding: "8px 12px",
294
295
  fontSize: "13px",
@@ -298,10 +299,10 @@ function f({ dashboardId: f, onFilterChange: p, collapsible: ee = !0, className:
298
299
  cursor: "pointer",
299
300
  fontWeight: 500
300
301
  },
301
- children: "Reset all"
302
+ children: v("bigconsole.filters.bar.resetAll", "Reset all")
302
303
  }),
303
304
  /* @__PURE__ */ u("button", {
304
- onClick: W,
305
+ onClick: K,
305
306
  style: {
306
307
  padding: "8px 14px",
307
308
  fontSize: "13px",
@@ -313,10 +314,10 @@ function f({ dashboardId: f, onFilterChange: p, collapsible: ee = !0, className:
313
314
  fontWeight: 500,
314
315
  boxShadow: "0 2px 4px rgba(99, 102, 241, 0.3)"
315
316
  },
316
- children: "+ Add Filter"
317
+ children: v("bigconsole.filters.bar.addFilter", "+ Add Filter")
317
318
  }),
318
- ee && /* @__PURE__ */ u("button", {
319
- onClick: te,
319
+ m && /* @__PURE__ */ u("button", {
320
+ onClick: re,
320
321
  style: {
321
322
  padding: "8px 12px",
322
323
  fontSize: "13px",
@@ -326,12 +327,12 @@ function f({ dashboardId: f, onFilterChange: p, collapsible: ee = !0, className:
326
327
  borderRadius: "6px",
327
328
  cursor: "pointer"
328
329
  },
329
- children: F ? "▼ Expand" : "▲ Collapse"
330
+ children: L ? v("bigconsole.filters.bar.expand", "▼ Expand") : v("bigconsole.filters.bar.collapse", "▲ Collapse")
330
331
  })
331
332
  ]
332
333
  })]
333
334
  }),
334
- !F && /* @__PURE__ */ u("div", {
335
+ !L && /* @__PURE__ */ u("div", {
335
336
  style: {
336
337
  display: "flex",
337
338
  flexWrap: "wrap",
@@ -341,19 +342,19 @@ function f({ dashboardId: f, onFilterChange: p, collapsible: ee = !0, className:
341
342
  backgroundColor: r.bgPrimary,
342
343
  position: "relative"
343
344
  },
344
- children: _.map((e) => /* @__PURE__ */ u(i, {
345
+ children: y.map((e) => /* @__PURE__ */ u(i, {
345
346
  filter: e,
346
- value: v[e.id],
347
- onChange: (t) => U(e.id, t),
348
- onEdit: () => G(e),
349
- onDelete: () => q(e.id)
347
+ value: b[e.id],
348
+ onChange: (t) => G(e.id, t),
349
+ onEdit: () => q(e),
350
+ onDelete: () => Y(e.id)
350
351
  }, e.id))
351
352
  }),
352
- L && /* @__PURE__ */ u(a, {
353
- filter: z,
354
- onSave: K,
353
+ z && /* @__PURE__ */ u(a, {
354
+ filter: V,
355
+ onSave: J,
355
356
  onClose: () => {
356
- R(!1), B(null);
357
+ B(!1), H(null);
357
358
  }
358
359
  })
359
360
  ]
@@ -1 +1 @@
1
- {"version":3,"file":"GlobalFiltersBar.js","names":[],"sources":["../../../../../src/bigconsole/components/dashboard/GlobalFiltersBar/GlobalFiltersBar.tsx"],"sourcesContent":["/**\n * GlobalFiltersBar Component\n *\n * Displays and manages global dashboard filters.\n * v2.0: Added URL persistence and filter presets support.\n */\n\nimport React, { useState, useEffect, useCallback } from 'react';\nimport {\n useGlobalFilters,\n useFilterUrlSync,\n useFilterPresets,\n type GlobalFilter,\n type FilterType,\n} from '../../../hooks';\nimport { FilterChip } from './FilterChip';\nimport { FilterEditor } from './FilterEditor';\nimport { FilterPresetSelector } from './FilterPresetSelector';\nimport { SEMANTIC_COLORS } from '../../../utils/semanticTokens';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface GlobalFiltersBarProps {\n dashboardId: string;\n onFilterChange?: (values: Record<string, unknown>) => void;\n collapsible?: boolean;\n className?: string;\n /** Enable URL sync for shareable filtered views */\n enableUrlSync?: boolean;\n /** Enable filter presets */\n enablePresets?: boolean;\n}\n\n// ============================================================================\n// Component\n// ============================================================================\n\nexport function GlobalFiltersBar({\n dashboardId,\n onFilterChange,\n collapsible = true,\n className = '',\n enableUrlSync = true,\n enablePresets = true,\n}: GlobalFiltersBarProps) {\n const {\n filters,\n activeValues,\n loading,\n fetchFilters,\n createFilter,\n updateFilter,\n deleteFilter,\n setFilterValue,\n resetFilters,\n } = useGlobalFilters();\n\n // URL Sync hook\n const { getShareableUrl, clearUrlParams } = useFilterUrlSync({\n enabled: enableUrlSync,\n paramPrefix: 'filter_',\n debounceMs: 300,\n });\n\n // Filter Presets hook\n const {\n presets,\n activePresetId,\n loadPresets,\n applyPreset,\n saveCurrentAsPreset,\n deletePreset: removePreset,\n clearActivePreset,\n } = useFilterPresets(dashboardId);\n\n const [isCollapsed, setIsCollapsed] = useState(false);\n const [isEditorOpen, setIsEditorOpen] = useState(false);\n const [editingFilter, setEditingFilter] = useState<GlobalFilter | null>(null);\n const [showShareTooltip, setShowShareTooltip] = useState(false);\n\n // Fetch filters on mount\n useEffect(() => {\n if (dashboardId) {\n fetchFilters(dashboardId);\n if (enablePresets) {\n loadPresets(dashboardId);\n }\n }\n }, [dashboardId, fetchFilters, loadPresets, enablePresets]);\n\n // Notify parent of filter changes\n useEffect(() => {\n if (onFilterChange) {\n onFilterChange(activeValues);\n }\n }, [activeValues, onFilterChange]);\n\n // Clear active preset when filter values change manually\n useEffect(() => {\n if (activePresetId && Object.keys(activeValues).length > 0) {\n // Check if current values differ from active preset\n const preset = presets.find((p) => p.id === activePresetId);\n if (preset) {\n const presetStr = JSON.stringify(preset.values);\n const currentStr = JSON.stringify(activeValues);\n if (presetStr !== currentStr) {\n clearActivePreset();\n }\n }\n }\n }, [activeValues, activePresetId, presets, clearActivePreset]);\n\n // Handle filter value change\n const handleFilterChange = useCallback(\n (filterId: string, value: unknown) => {\n setFilterValue(filterId, value);\n },\n [setFilterValue]\n );\n\n // Handle add new filter\n const handleAddFilter = useCallback(() => {\n setEditingFilter(null);\n setIsEditorOpen(true);\n }, []);\n\n // Handle edit filter\n const handleEditFilter = useCallback((filter: GlobalFilter) => {\n setEditingFilter(filter);\n setIsEditorOpen(true);\n }, []);\n\n // Handle save filter\n const handleSaveFilter = useCallback(\n async (data: {\n name: string;\n type: FilterType;\n config: Record<string, unknown>;\n defaultValue?: unknown;\n isRequired?: boolean;\n }) => {\n if (editingFilter) {\n await updateFilter({\n id: editingFilter.id,\n name: data.name,\n config: data.config,\n defaultValue: data.defaultValue,\n isRequired: data.isRequired,\n });\n } else {\n await createFilter({\n dashboardId,\n name: data.name,\n type: data.type,\n config: data.config,\n defaultValue: data.defaultValue,\n isRequired: data.isRequired,\n });\n }\n setIsEditorOpen(false);\n setEditingFilter(null);\n },\n [dashboardId, editingFilter, createFilter, updateFilter]\n );\n\n // Handle delete filter\n const handleDeleteFilter = useCallback(\n async (filterId: string) => {\n await deleteFilter(filterId);\n },\n [deleteFilter]\n );\n\n // Handle reset all filters\n const handleResetAll = useCallback(() => {\n resetFilters();\n clearUrlParams();\n clearActivePreset();\n }, [resetFilters, clearUrlParams, clearActivePreset]);\n\n // Handle copy shareable URL\n const handleCopyShareableUrl = useCallback(async () => {\n const url = getShareableUrl();\n try {\n await navigator.clipboard.writeText(url);\n setShowShareTooltip(true);\n setTimeout(() => setShowShareTooltip(false), 2000);\n } catch {\n // Failed to copy URL to clipboard\n }\n }, [getShareableUrl]);\n\n // Handle apply preset\n const handleApplyPreset = useCallback(\n (presetId: string) => {\n applyPreset(presetId);\n },\n [applyPreset]\n );\n\n // Handle save current as preset\n const handleSavePreset = useCallback(\n (name: string, description?: string) => {\n saveCurrentAsPreset(name, description);\n },\n [saveCurrentAsPreset]\n );\n\n // Handle delete preset\n const handleDeletePreset = useCallback(\n (presetId: string) => {\n removePreset(presetId);\n },\n [removePreset]\n );\n\n // Toggle collapse\n const toggleCollapse = useCallback(() => {\n setIsCollapsed((prev) => !prev);\n }, []);\n\n // Count active filters\n const activeFilterCount = Object.keys(activeValues).filter(\n (key) => activeValues[key] !== undefined && activeValues[key] !== null && activeValues[key] !== ''\n ).length;\n\n if (loading && filters.length === 0) {\n return (\n <div\n className={className}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '10px',\n padding: '12px 16px',\n backgroundColor: SEMANTIC_COLORS.bgPrimary,\n borderBottom: `1px solid ${SEMANTIC_COLORS.borderDefault}`,\n }}\n >\n <div\n style={{\n width: '16px',\n height: '16px',\n border: `2px solid ${SEMANTIC_COLORS.actionPrimaryBg}`,\n borderTopColor: 'transparent',\n borderRadius: '50%',\n animation: 'spin 1s linear infinite',\n }}\n />\n <span style={{ color: SEMANTIC_COLORS.textSecondary, fontSize: '14px' }}>Loading filters...</span>\n </div>\n );\n }\n\n // Show empty state with \"Add Filter\" button when no filters exist\n if (filters.length === 0) {\n return (\n <div\n className={className}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: '12px 16px',\n backgroundColor: SEMANTIC_COLORS.bgPrimary,\n borderBottom: `1px solid ${SEMANTIC_COLORS.borderDefault}`,\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', gap: '10px' }}>\n <span style={{ fontWeight: 600, fontSize: '14px', color: SEMANTIC_COLORS.textPrimary }}>Filters</span>\n <span style={{ color: SEMANTIC_COLORS.textTertiary, fontSize: '13px' }}>No filters configured</span>\n </div>\n <button\n onClick={handleAddFilter}\n style={{\n padding: '6px 14px',\n fontSize: '13px',\n color: SEMANTIC_COLORS.actionPrimaryFg,\n backgroundColor: SEMANTIC_COLORS.actionPrimaryBg,\n border: 'none',\n borderRadius: '6px',\n cursor: 'pointer',\n fontWeight: 500,\n boxShadow: '0 2px 4px rgba(99, 102, 241, 0.3)',\n }}\n >\n + Add Filter\n </button>\n\n {/* Filter Editor Modal */}\n {isEditorOpen && (\n <FilterEditor\n filter={editingFilter}\n onSave={handleSaveFilter}\n onClose={() => {\n setIsEditorOpen(false);\n setEditingFilter(null);\n }}\n />\n )}\n </div>\n );\n }\n\n return (\n <div\n className={className}\n style={{\n display: 'flex',\n flexDirection: 'column',\n backgroundColor: SEMANTIC_COLORS.bgPrimary,\n borderBottom: `1px solid ${SEMANTIC_COLORS.borderDefault}`,\n boxShadow: '0 2px 4px rgba(0,0,0,0.05)',\n }}\n >\n {/* Header */}\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: '10px 16px',\n borderBottom: isCollapsed ? 'none' : `1px solid ${SEMANTIC_COLORS.borderDefault}`,\n backgroundColor: SEMANTIC_COLORS.bgSecondary,\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', gap: '10px' }}>\n <span style={{ fontWeight: 600, fontSize: '14px', color: SEMANTIC_COLORS.textPrimary }}>Filters</span>\n <span\n style={{\n fontSize: '12px',\n color: SEMANTIC_COLORS.actionPrimaryFg,\n backgroundColor: SEMANTIC_COLORS.actionPrimaryBg,\n padding: '2px 8px',\n borderRadius: '12px',\n fontWeight: 500,\n }}\n >\n {filters.length}\n </span>\n {activeFilterCount > 0 && (\n <span\n style={{\n fontSize: '11px',\n color: SEMANTIC_COLORS.statusSuccessText,\n backgroundColor: SEMANTIC_COLORS.statusSuccessBgSubtle,\n padding: '2px 8px',\n borderRadius: '12px',\n fontWeight: 500,\n }}\n >\n {activeFilterCount} active\n </span>\n )}\n </div>\n\n <div style={{ display: 'flex', alignItems: 'center', gap: '10px' }}>\n {/* Filter Presets Selector */}\n {enablePresets && (\n <FilterPresetSelector\n presets={presets}\n activePresetId={activePresetId}\n onApplyPreset={handleApplyPreset}\n onSavePreset={handleSavePreset}\n onDeletePreset={handleDeletePreset}\n />\n )}\n\n {/* Share URL Button */}\n {enableUrlSync && activeFilterCount > 0 && (\n <div style={{ position: 'relative' }}>\n <button\n onClick={handleCopyShareableUrl}\n title=\"Copy shareable URL with filters\"\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '6px',\n padding: '8px 12px',\n fontSize: '13px',\n color: SEMANTIC_COLORS.textSecondary,\n backgroundColor: SEMANTIC_COLORS.bgPrimary,\n border: `1px solid ${SEMANTIC_COLORS.borderDefault}`,\n borderRadius: '6px',\n cursor: 'pointer',\n fontWeight: 500,\n }}\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <path d=\"M4 12v8a2 2 0 002 2h12a2 2 0 002-2v-8\" />\n <polyline points=\"16,6 12,2 8,6\" />\n <line x1=\"12\" y1=\"2\" x2=\"12\" y2=\"15\" />\n </svg>\n Share\n </button>\n {showShareTooltip && (\n <div\n style={{\n position: 'absolute',\n top: '100%',\n left: '50%',\n transform: 'translateX(-50%)',\n marginTop: '4px',\n padding: '6px 12px',\n backgroundColor: SEMANTIC_COLORS.textPrimary,\n color: SEMANTIC_COLORS.bgPrimary,\n fontSize: '12px',\n borderRadius: '4px',\n whiteSpace: 'nowrap',\n zIndex: 100001,\n }}\n >\n URL copied!\n </div>\n )}\n </div>\n )}\n\n {/* Reset Button */}\n {activeFilterCount > 0 && (\n <button\n onClick={handleResetAll}\n style={{\n padding: '8px 12px',\n fontSize: '13px',\n color: SEMANTIC_COLORS.statusErrorText,\n backgroundColor: 'transparent',\n border: 'none',\n cursor: 'pointer',\n fontWeight: 500,\n }}\n >\n Reset all\n </button>\n )}\n\n {/* Add Filter Button */}\n <button\n onClick={handleAddFilter}\n style={{\n padding: '8px 14px',\n fontSize: '13px',\n color: SEMANTIC_COLORS.actionPrimaryFg,\n backgroundColor: SEMANTIC_COLORS.actionPrimaryBg,\n border: 'none',\n borderRadius: '6px',\n cursor: 'pointer',\n fontWeight: 500,\n boxShadow: '0 2px 4px rgba(99, 102, 241, 0.3)',\n }}\n >\n + Add Filter\n </button>\n\n {/* Collapse Button */}\n {collapsible && (\n <button\n onClick={toggleCollapse}\n style={{\n padding: '8px 12px',\n fontSize: '13px',\n color: SEMANTIC_COLORS.textSecondary,\n backgroundColor: 'transparent',\n border: `1px solid ${SEMANTIC_COLORS.borderDefault}`,\n borderRadius: '6px',\n cursor: 'pointer',\n }}\n >\n {isCollapsed ? '▼ Expand' : '▲ Collapse'}\n </button>\n )}\n </div>\n </div>\n\n {/* Filters List */}\n {!isCollapsed && (\n <div\n style={{\n display: 'flex',\n flexWrap: 'wrap',\n gap: '10px',\n padding: '12px 16px',\n overflow: 'visible',\n backgroundColor: SEMANTIC_COLORS.bgPrimary,\n position: 'relative',\n }}\n >\n {filters.map((filter) => (\n <FilterChip\n key={filter.id}\n filter={filter}\n value={activeValues[filter.id]}\n onChange={(value) => handleFilterChange(filter.id, value)}\n onEdit={() => handleEditFilter(filter)}\n onDelete={() => handleDeleteFilter(filter.id)}\n />\n ))}\n </div>\n )}\n\n {/* Filter Editor Modal */}\n {isEditorOpen && (\n <FilterEditor\n filter={editingFilter}\n onSave={handleSaveFilter}\n onClose={() => {\n setIsEditorOpen(false);\n setEditingFilter(null);\n }}\n />\n )}\n </div>\n );\n}\n\nexport default GlobalFiltersBar;\n"],"mappings":"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"}
1
+ {"version":3,"file":"GlobalFiltersBar.js","names":[],"sources":["../../../../../src/bigconsole/components/dashboard/GlobalFiltersBar/GlobalFiltersBar.tsx"],"sourcesContent":["/**\n * GlobalFiltersBar Component\n *\n * Displays and manages global dashboard filters.\n * v2.0: Added URL persistence and filter presets support.\n */\n\nimport React, { useState, useEffect, useCallback } from 'react';\nimport {\n useGlobalFilters,\n useFilterUrlSync,\n useFilterPresets,\n type GlobalFilter,\n type FilterType,\n} from '../../../hooks';\nimport { FilterChip } from './FilterChip';\nimport { FilterEditor } from './FilterEditor';\nimport { FilterPresetSelector } from './FilterPresetSelector';\nimport { SEMANTIC_COLORS } from '../../../utils/semanticTokens';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface GlobalFiltersBarProps {\n dashboardId: string;\n onFilterChange?: (values: Record<string, unknown>) => void;\n collapsible?: boolean;\n className?: string;\n /** Enable URL sync for shareable filtered views */\n enableUrlSync?: boolean;\n /** Enable filter presets */\n enablePresets?: boolean;\n}\n\n// ============================================================================\n// Component\n// ============================================================================\n\nexport function GlobalFiltersBar({\n dashboardId,\n onFilterChange,\n collapsible = true,\n className = '',\n enableUrlSync = true,\n enablePresets = true,\n}: GlobalFiltersBarProps) {\n const { t } = useI18n();\n const {\n filters,\n activeValues,\n loading,\n fetchFilters,\n createFilter,\n updateFilter,\n deleteFilter,\n setFilterValue,\n resetFilters,\n } = useGlobalFilters();\n\n // URL Sync hook\n const { getShareableUrl, clearUrlParams } = useFilterUrlSync({\n enabled: enableUrlSync,\n paramPrefix: 'filter_',\n debounceMs: 300,\n });\n\n // Filter Presets hook\n const {\n presets,\n activePresetId,\n loadPresets,\n applyPreset,\n saveCurrentAsPreset,\n deletePreset: removePreset,\n clearActivePreset,\n } = useFilterPresets(dashboardId);\n\n const [isCollapsed, setIsCollapsed] = useState(false);\n const [isEditorOpen, setIsEditorOpen] = useState(false);\n const [editingFilter, setEditingFilter] = useState<GlobalFilter | null>(null);\n const [showShareTooltip, setShowShareTooltip] = useState(false);\n\n // Fetch filters on mount\n useEffect(() => {\n if (dashboardId) {\n fetchFilters(dashboardId);\n if (enablePresets) {\n loadPresets(dashboardId);\n }\n }\n }, [dashboardId, fetchFilters, loadPresets, enablePresets]);\n\n // Notify parent of filter changes\n useEffect(() => {\n if (onFilterChange) {\n onFilterChange(activeValues);\n }\n }, [activeValues, onFilterChange]);\n\n // Clear active preset when filter values change manually\n useEffect(() => {\n if (activePresetId && Object.keys(activeValues).length > 0) {\n // Check if current values differ from active preset\n const preset = presets.find((p) => p.id === activePresetId);\n if (preset) {\n const presetStr = JSON.stringify(preset.values);\n const currentStr = JSON.stringify(activeValues);\n if (presetStr !== currentStr) {\n clearActivePreset();\n }\n }\n }\n }, [activeValues, activePresetId, presets, clearActivePreset]);\n\n // Handle filter value change\n const handleFilterChange = useCallback(\n (filterId: string, value: unknown) => {\n setFilterValue(filterId, value);\n },\n [setFilterValue]\n );\n\n // Handle add new filter\n const handleAddFilter = useCallback(() => {\n setEditingFilter(null);\n setIsEditorOpen(true);\n }, []);\n\n // Handle edit filter\n const handleEditFilter = useCallback((filter: GlobalFilter) => {\n setEditingFilter(filter);\n setIsEditorOpen(true);\n }, []);\n\n // Handle save filter\n const handleSaveFilter = useCallback(\n async (data: {\n name: string;\n type: FilterType;\n config: Record<string, unknown>;\n defaultValue?: unknown;\n isRequired?: boolean;\n }) => {\n if (editingFilter) {\n await updateFilter({\n id: editingFilter.id,\n name: data.name,\n config: data.config,\n defaultValue: data.defaultValue,\n isRequired: data.isRequired,\n });\n } else {\n await createFilter({\n dashboardId,\n name: data.name,\n type: data.type,\n config: data.config,\n defaultValue: data.defaultValue,\n isRequired: data.isRequired,\n });\n }\n setIsEditorOpen(false);\n setEditingFilter(null);\n },\n [dashboardId, editingFilter, createFilter, updateFilter]\n );\n\n // Handle delete filter\n const handleDeleteFilter = useCallback(\n async (filterId: string) => {\n await deleteFilter(filterId);\n },\n [deleteFilter]\n );\n\n // Handle reset all filters\n const handleResetAll = useCallback(() => {\n resetFilters();\n clearUrlParams();\n clearActivePreset();\n }, [resetFilters, clearUrlParams, clearActivePreset]);\n\n // Handle copy shareable URL\n const handleCopyShareableUrl = useCallback(async () => {\n const url = getShareableUrl();\n try {\n await navigator.clipboard.writeText(url);\n setShowShareTooltip(true);\n setTimeout(() => setShowShareTooltip(false), 2000);\n } catch {\n // Failed to copy URL to clipboard\n }\n }, [getShareableUrl]);\n\n // Handle apply preset\n const handleApplyPreset = useCallback(\n (presetId: string) => {\n applyPreset(presetId);\n },\n [applyPreset]\n );\n\n // Handle save current as preset\n const handleSavePreset = useCallback(\n (name: string, description?: string) => {\n saveCurrentAsPreset(name, description);\n },\n [saveCurrentAsPreset]\n );\n\n // Handle delete preset\n const handleDeletePreset = useCallback(\n (presetId: string) => {\n removePreset(presetId);\n },\n [removePreset]\n );\n\n // Toggle collapse\n const toggleCollapse = useCallback(() => {\n setIsCollapsed((prev) => !prev);\n }, []);\n\n // Count active filters\n const activeFilterCount = Object.keys(activeValues).filter(\n (key) => activeValues[key] !== undefined && activeValues[key] !== null && activeValues[key] !== ''\n ).length;\n\n if (loading && filters.length === 0) {\n return (\n <div\n className={className}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '10px',\n padding: '12px 16px',\n backgroundColor: SEMANTIC_COLORS.bgPrimary,\n borderBottom: `1px solid ${SEMANTIC_COLORS.borderDefault}`,\n }}\n >\n <div\n style={{\n width: '16px',\n height: '16px',\n border: `2px solid ${SEMANTIC_COLORS.actionPrimaryBg}`,\n borderTopColor: 'transparent',\n borderRadius: '50%',\n animation: 'spin 1s linear infinite',\n }}\n />\n <span style={{ color: SEMANTIC_COLORS.textSecondary, fontSize: '14px' }}>\n {t('bigconsole.filters.bar.loading', 'Loading filters...')}\n </span>\n </div>\n );\n }\n\n // Show empty state with \"Add Filter\" button when no filters exist\n if (filters.length === 0) {\n return (\n <div\n className={className}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: '12px 16px',\n backgroundColor: SEMANTIC_COLORS.bgPrimary,\n borderBottom: `1px solid ${SEMANTIC_COLORS.borderDefault}`,\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', gap: '10px' }}>\n <span style={{ fontWeight: 600, fontSize: '14px', color: SEMANTIC_COLORS.textPrimary }}>\n {t('bigconsole.filters.bar.title', 'Filters')}\n </span>\n <span style={{ color: SEMANTIC_COLORS.textTertiary, fontSize: '13px' }}>\n {t('bigconsole.filters.bar.noFiltersConfigured', 'No filters configured')}\n </span>\n </div>\n <button\n onClick={handleAddFilter}\n style={{\n padding: '6px 14px',\n fontSize: '13px',\n color: SEMANTIC_COLORS.actionPrimaryFg,\n backgroundColor: SEMANTIC_COLORS.actionPrimaryBg,\n border: 'none',\n borderRadius: '6px',\n cursor: 'pointer',\n fontWeight: 500,\n boxShadow: '0 2px 4px rgba(99, 102, 241, 0.3)',\n }}\n >\n {t('bigconsole.filters.bar.addFilter', '+ Add Filter')}\n </button>\n\n {/* Filter Editor Modal */}\n {isEditorOpen && (\n <FilterEditor\n filter={editingFilter}\n onSave={handleSaveFilter}\n onClose={() => {\n setIsEditorOpen(false);\n setEditingFilter(null);\n }}\n />\n )}\n </div>\n );\n }\n\n return (\n <div\n className={className}\n style={{\n display: 'flex',\n flexDirection: 'column',\n backgroundColor: SEMANTIC_COLORS.bgPrimary,\n borderBottom: `1px solid ${SEMANTIC_COLORS.borderDefault}`,\n boxShadow: '0 2px 4px rgba(0,0,0,0.05)',\n }}\n >\n {/* Header */}\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: '10px 16px',\n borderBottom: isCollapsed ? 'none' : `1px solid ${SEMANTIC_COLORS.borderDefault}`,\n backgroundColor: SEMANTIC_COLORS.bgSecondary,\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', gap: '10px' }}>\n <span style={{ fontWeight: 600, fontSize: '14px', color: SEMANTIC_COLORS.textPrimary }}>\n {t('bigconsole.filters.bar.title', 'Filters')}\n </span>\n <span\n style={{\n fontSize: '12px',\n color: SEMANTIC_COLORS.actionPrimaryFg,\n backgroundColor: SEMANTIC_COLORS.actionPrimaryBg,\n padding: '2px 8px',\n borderRadius: '12px',\n fontWeight: 500,\n }}\n >\n {filters.length}\n </span>\n {activeFilterCount > 0 && (\n <span\n style={{\n fontSize: '11px',\n color: SEMANTIC_COLORS.statusSuccessText,\n backgroundColor: SEMANTIC_COLORS.statusSuccessBgSubtle,\n padding: '2px 8px',\n borderRadius: '12px',\n fontWeight: 500,\n }}\n >\n {t('bigconsole.filters.bar.activeCount', '{{count}} active', {\n count: activeFilterCount ?? '',\n })}\n </span>\n )}\n </div>\n\n <div style={{ display: 'flex', alignItems: 'center', gap: '10px' }}>\n {/* Filter Presets Selector */}\n {enablePresets && (\n <FilterPresetSelector\n presets={presets}\n activePresetId={activePresetId}\n onApplyPreset={handleApplyPreset}\n onSavePreset={handleSavePreset}\n onDeletePreset={handleDeletePreset}\n />\n )}\n\n {/* Share URL Button */}\n {enableUrlSync && activeFilterCount > 0 && (\n <div style={{ position: 'relative' }}>\n <button\n onClick={handleCopyShareableUrl}\n title={t('bigconsole.filters.bar.shareUrlTitle', 'Copy shareable URL with filters')}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '6px',\n padding: '8px 12px',\n fontSize: '13px',\n color: SEMANTIC_COLORS.textSecondary,\n backgroundColor: SEMANTIC_COLORS.bgPrimary,\n border: `1px solid ${SEMANTIC_COLORS.borderDefault}`,\n borderRadius: '6px',\n cursor: 'pointer',\n fontWeight: 500,\n }}\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <path d=\"M4 12v8a2 2 0 002 2h12a2 2 0 002-2v-8\" />\n <polyline points=\"16,6 12,2 8,6\" />\n <line x1=\"12\" y1=\"2\" x2=\"12\" y2=\"15\" />\n </svg>\n {t('bigconsole.filters.bar.share', 'Share')}\n </button>\n {showShareTooltip && (\n <div\n style={{\n position: 'absolute',\n top: '100%',\n left: '50%',\n transform: 'translateX(-50%)',\n marginTop: '4px',\n padding: '6px 12px',\n backgroundColor: SEMANTIC_COLORS.textPrimary,\n color: SEMANTIC_COLORS.bgPrimary,\n fontSize: '12px',\n borderRadius: '4px',\n whiteSpace: 'nowrap',\n zIndex: 100001,\n }}\n >\n {t('bigconsole.filters.bar.urlCopied', 'URL copied!')}\n </div>\n )}\n </div>\n )}\n\n {/* Reset Button */}\n {activeFilterCount > 0 && (\n <button\n onClick={handleResetAll}\n style={{\n padding: '8px 12px',\n fontSize: '13px',\n color: SEMANTIC_COLORS.statusErrorText,\n backgroundColor: 'transparent',\n border: 'none',\n cursor: 'pointer',\n fontWeight: 500,\n }}\n >\n {t('bigconsole.filters.bar.resetAll', 'Reset all')}\n </button>\n )}\n\n {/* Add Filter Button */}\n <button\n onClick={handleAddFilter}\n style={{\n padding: '8px 14px',\n fontSize: '13px',\n color: SEMANTIC_COLORS.actionPrimaryFg,\n backgroundColor: SEMANTIC_COLORS.actionPrimaryBg,\n border: 'none',\n borderRadius: '6px',\n cursor: 'pointer',\n fontWeight: 500,\n boxShadow: '0 2px 4px rgba(99, 102, 241, 0.3)',\n }}\n >\n {t('bigconsole.filters.bar.addFilter', '+ Add Filter')}\n </button>\n\n {/* Collapse Button */}\n {collapsible && (\n <button\n onClick={toggleCollapse}\n style={{\n padding: '8px 12px',\n fontSize: '13px',\n color: SEMANTIC_COLORS.textSecondary,\n backgroundColor: 'transparent',\n border: `1px solid ${SEMANTIC_COLORS.borderDefault}`,\n borderRadius: '6px',\n cursor: 'pointer',\n }}\n >\n {isCollapsed\n ? t('bigconsole.filters.bar.expand', '▼ Expand')\n : t('bigconsole.filters.bar.collapse', '▲ Collapse')}\n </button>\n )}\n </div>\n </div>\n\n {/* Filters List */}\n {!isCollapsed && (\n <div\n style={{\n display: 'flex',\n flexWrap: 'wrap',\n gap: '10px',\n padding: '12px 16px',\n overflow: 'visible',\n backgroundColor: SEMANTIC_COLORS.bgPrimary,\n position: 'relative',\n }}\n >\n {filters.map((filter) => (\n <FilterChip\n key={filter.id}\n filter={filter}\n value={activeValues[filter.id]}\n onChange={(value) => handleFilterChange(filter.id, value)}\n onEdit={() => handleEditFilter(filter)}\n onDelete={() => handleDeleteFilter(filter.id)}\n />\n ))}\n </div>\n )}\n\n {/* Filter Editor Modal */}\n {isEditorOpen && (\n <FilterEditor\n filter={editingFilter}\n onSave={handleSaveFilter}\n onClose={() => {\n setIsEditorOpen(false);\n setEditingFilter(null);\n }}\n />\n )}\n </div>\n );\n}\n\nexport default GlobalFiltersBar;\n"],"mappings":"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"}