@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,123 +1,124 @@
1
1
  import { memo as e, useCallback as t } from "react";
2
- import { jsx as n, jsxs as r } from "react/jsx-runtime";
2
+ import { useI18n as n } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
3
+ import { jsx as r, jsxs as i } from "react/jsx-runtime";
3
4
  //#region src/bigconsole/components/widgets/list/ListConfig.tsx
4
- var i = e(function({ config: e, onChange: i }) {
5
- let a = t((t, n) => {
6
- i({
5
+ var a = e(function({ config: e, onChange: a }) {
6
+ let { t: o } = n(), s = t((t, n) => {
7
+ a({
7
8
  ...e,
8
9
  [t]: n
9
10
  });
10
- }, [e, i]);
11
- return /* @__PURE__ */ r("div", {
11
+ }, [e, a]);
12
+ return /* @__PURE__ */ i("div", {
12
13
  className: "space-y-4",
13
14
  children: [
14
- /* @__PURE__ */ r("div", { children: [
15
- /* @__PURE__ */ n("label", {
15
+ /* @__PURE__ */ i("div", { children: [
16
+ /* @__PURE__ */ r("label", {
16
17
  className: "block text-sm font-medium text-text-primary mb-1",
17
- children: "Maximum Items to Display"
18
+ children: o("bigconsole.widget.config.list.maxItems.label", "Maximum Items to Display")
18
19
  }),
19
- /* @__PURE__ */ n("input", {
20
+ /* @__PURE__ */ r("input", {
20
21
  type: "number",
21
22
  value: e.maxItems ?? "",
22
- onChange: (e) => a("maxItems", e.target.value ? Number(e.target.value) : void 0),
23
+ onChange: (e) => s("maxItems", e.target.value ? Number(e.target.value) : void 0),
23
24
  min: 1,
24
- placeholder: "No limit",
25
+ placeholder: o("bigconsole.widget.config.list.maxItems.placeholder", "No limit"),
25
26
  className: "\n w-full px-3 py-2\n text-sm text-text-primary\n bg-bg-surface\n border border-border-default\n rounded-md\n focus:outline-none focus:ring-2 focus:ring-action-primary-bg\n "
26
27
  }),
27
- /* @__PURE__ */ n("p", {
28
+ /* @__PURE__ */ r("p", {
28
29
  className: "text-xs text-text-secondary mt-1",
29
- children: "Leave empty to show all items"
30
+ children: o("bigconsole.widget.config.list.maxItems.help", "Leave empty to show all items")
30
31
  })
31
32
  ] }),
32
- /* @__PURE__ */ r("div", { children: [/* @__PURE__ */ n("label", {
33
+ /* @__PURE__ */ i("div", { children: [/* @__PURE__ */ r("label", {
33
34
  className: "block text-sm font-medium text-text-primary mb-1",
34
- children: "Title Field"
35
- }), /* @__PURE__ */ n("input", {
35
+ children: o("bigconsole.widget.config.list.titleField.label", "Title Field")
36
+ }), /* @__PURE__ */ r("input", {
36
37
  type: "text",
37
38
  value: e.titleField || "",
38
- onChange: (e) => a("titleField", e.target.value),
39
- placeholder: "e.g., name, title",
39
+ onChange: (e) => s("titleField", e.target.value),
40
+ placeholder: o("bigconsole.widget.config.list.titleField.placeholder", "e.g., name, title"),
40
41
  className: "\n w-full px-3 py-2\n text-sm text-text-primary\n bg-bg-surface\n border border-border-default\n rounded-md\n focus:outline-none focus:ring-2 focus:ring-action-primary-bg\n "
41
42
  })] }),
42
- /* @__PURE__ */ r("div", { children: [/* @__PURE__ */ n("label", {
43
+ /* @__PURE__ */ i("div", { children: [/* @__PURE__ */ r("label", {
43
44
  className: "block text-sm font-medium text-text-primary mb-1",
44
- children: "Subtitle Field"
45
- }), /* @__PURE__ */ n("input", {
45
+ children: o("bigconsole.widget.config.list.subtitleField.label", "Subtitle Field")
46
+ }), /* @__PURE__ */ r("input", {
46
47
  type: "text",
47
48
  value: e.subtitleField || "",
48
- onChange: (e) => a("subtitleField", e.target.value),
49
- placeholder: "e.g., description, email",
49
+ onChange: (e) => s("subtitleField", e.target.value),
50
+ placeholder: o("bigconsole.widget.config.list.subtitleField.placeholder", "e.g., description, email"),
50
51
  className: "\n w-full px-3 py-2\n text-sm text-text-primary\n bg-bg-surface\n border border-border-default\n rounded-md\n focus:outline-none focus:ring-2 focus:ring-action-primary-bg\n "
51
52
  })] }),
52
- /* @__PURE__ */ r("div", { children: [/* @__PURE__ */ n("label", {
53
+ /* @__PURE__ */ i("div", { children: [/* @__PURE__ */ r("label", {
53
54
  className: "block text-sm font-medium text-text-primary mb-1",
54
- children: "Value Field (right side)"
55
- }), /* @__PURE__ */ n("input", {
55
+ children: o("bigconsole.widget.config.list.valueField.label", "Value Field (right side)")
56
+ }), /* @__PURE__ */ r("input", {
56
57
  type: "text",
57
58
  value: e.valueField || "",
58
- onChange: (e) => a("valueField", e.target.value),
59
- placeholder: "e.g., amount, count",
59
+ onChange: (e) => s("valueField", e.target.value),
60
+ placeholder: o("bigconsole.widget.config.list.valueField.placeholder", "e.g., amount, count"),
60
61
  className: "\n w-full px-3 py-2\n text-sm text-text-primary\n bg-bg-surface\n border border-border-default\n rounded-md\n focus:outline-none focus:ring-2 focus:ring-action-primary-bg\n "
61
62
  })] }),
62
- /* @__PURE__ */ r("div", { children: [/* @__PURE__ */ n("label", {
63
+ /* @__PURE__ */ i("div", { children: [/* @__PURE__ */ r("label", {
63
64
  className: "block text-sm font-medium text-text-primary mb-1",
64
- children: "Badge Field"
65
- }), /* @__PURE__ */ n("input", {
65
+ children: o("bigconsole.widget.config.list.badgeField.label", "Badge Field")
66
+ }), /* @__PURE__ */ r("input", {
66
67
  type: "text",
67
68
  value: e.badgeField || "",
68
- onChange: (e) => a("badgeField", e.target.value),
69
- placeholder: "e.g., status, type",
69
+ onChange: (e) => s("badgeField", e.target.value),
70
+ placeholder: o("bigconsole.widget.config.list.badgeField.placeholder", "e.g., status, type"),
70
71
  className: "\n w-full px-3 py-2\n text-sm text-text-primary\n bg-bg-surface\n border border-border-default\n rounded-md\n focus:outline-none focus:ring-2 focus:ring-action-primary-bg\n "
71
72
  })] }),
72
- /* @__PURE__ */ r("div", {
73
+ /* @__PURE__ */ i("div", {
73
74
  className: "space-y-3",
74
75
  children: [
75
- /* @__PURE__ */ r("label", {
76
+ /* @__PURE__ */ i("label", {
76
77
  className: "flex items-center gap-3",
77
- children: [/* @__PURE__ */ n("input", {
78
+ children: [/* @__PURE__ */ r("input", {
78
79
  type: "checkbox",
79
80
  checked: e.showCount !== !1,
80
- onChange: (e) => a("showCount", e.target.checked),
81
+ onChange: (e) => s("showCount", e.target.checked),
81
82
  className: "\n w-4 h-4\n text-action-primary-bg\n bg-bg-surface\n border-border-default\n rounded\n focus:ring-action-primary-bg\n "
82
- }), /* @__PURE__ */ n("span", {
83
+ }), /* @__PURE__ */ r("span", {
83
84
  className: "text-sm text-text-primary",
84
- children: "Show item count"
85
+ children: o("bigconsole.widget.config.list.showCount", "Show item count")
85
86
  })]
86
87
  }),
87
- /* @__PURE__ */ r("label", {
88
+ /* @__PURE__ */ i("label", {
88
89
  className: "flex items-center gap-3",
89
- children: [/* @__PURE__ */ n("input", {
90
+ children: [/* @__PURE__ */ r("input", {
90
91
  type: "checkbox",
91
92
  checked: e.showSearch === !0,
92
- onChange: (e) => a("showSearch", e.target.checked),
93
+ onChange: (e) => s("showSearch", e.target.checked),
93
94
  className: "\n w-4 h-4\n text-action-primary-bg\n bg-bg-surface\n border-border-default\n rounded\n focus:ring-action-primary-bg\n "
94
- }), /* @__PURE__ */ n("span", {
95
+ }), /* @__PURE__ */ r("span", {
95
96
  className: "text-sm text-text-primary",
96
- children: "Show search box"
97
+ children: o("bigconsole.widget.config.list.showSearch", "Show search box")
97
98
  })]
98
99
  }),
99
- /* @__PURE__ */ r("label", {
100
+ /* @__PURE__ */ i("label", {
100
101
  className: "flex items-center gap-3",
101
- children: [/* @__PURE__ */ n("input", {
102
+ children: [/* @__PURE__ */ r("input", {
102
103
  type: "checkbox",
103
104
  checked: e.showViewAll !== !1,
104
- onChange: (e) => a("showViewAll", e.target.checked),
105
+ onChange: (e) => s("showViewAll", e.target.checked),
105
106
  className: "\n w-4 h-4\n text-action-primary-bg\n bg-bg-surface\n border-border-default\n rounded\n focus:ring-action-primary-bg\n "
106
- }), /* @__PURE__ */ n("span", {
107
+ }), /* @__PURE__ */ r("span", {
107
108
  className: "text-sm text-text-primary",
108
- children: "Show \"View All\" link when truncated"
109
+ children: o("bigconsole.widget.config.list.showViewAll", "Show \"View All\" link when truncated")
109
110
  })]
110
111
  }),
111
- /* @__PURE__ */ r("label", {
112
+ /* @__PURE__ */ i("label", {
112
113
  className: "flex items-center gap-3",
113
- children: [/* @__PURE__ */ n("input", {
114
+ children: [/* @__PURE__ */ r("input", {
114
115
  type: "checkbox",
115
116
  checked: e.showIcon === !0,
116
- onChange: (e) => a("showIcon", e.target.checked),
117
+ onChange: (e) => s("showIcon", e.target.checked),
117
118
  className: "\n w-4 h-4\n text-action-primary-bg\n bg-bg-surface\n border-border-default\n rounded\n focus:ring-action-primary-bg\n "
118
- }), /* @__PURE__ */ n("span", {
119
+ }), /* @__PURE__ */ r("span", {
119
120
  className: "text-sm text-text-primary",
120
- children: "Show item icons"
121
+ children: o("bigconsole.widget.config.list.showIcon", "Show item icons")
121
122
  })]
122
123
  })
123
124
  ]
@@ -126,6 +127,6 @@ var i = e(function({ config: e, onChange: i }) {
126
127
  });
127
128
  });
128
129
  //#endregion
129
- export { i as default };
130
+ export { a as default };
130
131
 
131
132
  //# sourceMappingURL=ListConfig.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ListConfig.js","names":[],"sources":["../../../../../src/bigconsole/components/widgets/list/ListConfig.tsx"],"sourcesContent":["/**\n * ListConfig Component\n *\n * Configuration panel for List widgets.\n */\n\nimport { type FC, memo, useCallback } from 'react';\nimport type { ListConfig as ConfigType } from '../../../types';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface ListConfigProps {\n /** Current configuration */\n config: ConfigType;\n /** Callback when config changes */\n onChange: (config: ConfigType) => void;\n}\n\n// ============================================================================\n// Component\n// ============================================================================\n\nexport const ListConfig: FC<ListConfigProps> = memo(function ListConfig({ config, onChange }) {\n const handleChange = useCallback(\n <K extends keyof ConfigType>(key: K, value: ConfigType[K]) => {\n onChange({ ...config, [key]: value });\n },\n [config, onChange]\n );\n\n return (\n <div className=\"space-y-4\">\n {/* Max Items */}\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1\">Maximum Items to Display</label>\n <input\n type=\"number\"\n value={config.maxItems ?? ''}\n onChange={(e) => handleChange('maxItems', e.target.value ? Number(e.target.value) : undefined)}\n min={1}\n placeholder=\"No limit\"\n className=\"\n w-full px-3 py-2\n text-sm text-text-primary\n bg-bg-surface\n border border-border-default\n rounded-md\n focus:outline-none focus:ring-2 focus:ring-action-primary-bg\n \"\n />\n <p className=\"text-xs text-text-secondary mt-1\">Leave empty to show all items</p>\n </div>\n\n {/* Title Field */}\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1\">Title Field</label>\n <input\n type=\"text\"\n value={config.titleField || ''}\n onChange={(e) => handleChange('titleField', e.target.value)}\n placeholder=\"e.g., name, title\"\n className=\"\n w-full px-3 py-2\n text-sm text-text-primary\n bg-bg-surface\n border border-border-default\n rounded-md\n focus:outline-none focus:ring-2 focus:ring-action-primary-bg\n \"\n />\n </div>\n\n {/* Subtitle Field */}\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1\">Subtitle Field</label>\n <input\n type=\"text\"\n value={config.subtitleField || ''}\n onChange={(e) => handleChange('subtitleField', e.target.value)}\n placeholder=\"e.g., description, email\"\n className=\"\n w-full px-3 py-2\n text-sm text-text-primary\n bg-bg-surface\n border border-border-default\n rounded-md\n focus:outline-none focus:ring-2 focus:ring-action-primary-bg\n \"\n />\n </div>\n\n {/* Value Field */}\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1\">Value Field (right side)</label>\n <input\n type=\"text\"\n value={config.valueField || ''}\n onChange={(e) => handleChange('valueField', e.target.value)}\n placeholder=\"e.g., amount, count\"\n className=\"\n w-full px-3 py-2\n text-sm text-text-primary\n bg-bg-surface\n border border-border-default\n rounded-md\n focus:outline-none focus:ring-2 focus:ring-action-primary-bg\n \"\n />\n </div>\n\n {/* Badge Field */}\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1\">Badge Field</label>\n <input\n type=\"text\"\n value={config.badgeField || ''}\n onChange={(e) => handleChange('badgeField', e.target.value)}\n placeholder=\"e.g., status, type\"\n className=\"\n w-full px-3 py-2\n text-sm text-text-primary\n bg-bg-surface\n border border-border-default\n rounded-md\n focus:outline-none focus:ring-2 focus:ring-action-primary-bg\n \"\n />\n </div>\n\n {/* Toggle Options */}\n <div className=\"space-y-3\">\n <label className=\"flex items-center gap-3\">\n <input\n type=\"checkbox\"\n checked={config.showCount !== false}\n onChange={(e) => handleChange('showCount', e.target.checked)}\n className=\"\n w-4 h-4\n text-action-primary-bg\n bg-bg-surface\n border-border-default\n rounded\n focus:ring-action-primary-bg\n \"\n />\n <span className=\"text-sm text-text-primary\">Show item count</span>\n </label>\n\n <label className=\"flex items-center gap-3\">\n <input\n type=\"checkbox\"\n checked={config.showSearch === true}\n onChange={(e) => handleChange('showSearch', e.target.checked)}\n className=\"\n w-4 h-4\n text-action-primary-bg\n bg-bg-surface\n border-border-default\n rounded\n focus:ring-action-primary-bg\n \"\n />\n <span className=\"text-sm text-text-primary\">Show search box</span>\n </label>\n\n <label className=\"flex items-center gap-3\">\n <input\n type=\"checkbox\"\n checked={config.showViewAll !== false}\n onChange={(e) => handleChange('showViewAll', e.target.checked)}\n className=\"\n w-4 h-4\n text-action-primary-bg\n bg-bg-surface\n border-border-default\n rounded\n focus:ring-action-primary-bg\n \"\n />\n <span className=\"text-sm text-text-primary\">Show &quot;View All&quot; link when truncated</span>\n </label>\n\n <label className=\"flex items-center gap-3\">\n <input\n type=\"checkbox\"\n checked={config.showIcon === true}\n onChange={(e) => handleChange('showIcon', e.target.checked)}\n className=\"\n w-4 h-4\n text-action-primary-bg\n bg-bg-surface\n border-border-default\n rounded\n focus:ring-action-primary-bg\n \"\n />\n <span className=\"text-sm text-text-primary\">Show item icons</span>\n </label>\n </div>\n </div>\n );\n});\n\nexport default ListConfig;\n"],"mappings":"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"}
1
+ {"version":3,"file":"ListConfig.js","names":[],"sources":["../../../../../src/bigconsole/components/widgets/list/ListConfig.tsx"],"sourcesContent":["/**\n * ListConfig Component\n *\n * Configuration panel for List widgets.\n */\n\nimport { type FC, memo, useCallback } from 'react';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport type { ListConfig as ConfigType } from '../../../types';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface ListConfigProps {\n /** Current configuration */\n config: ConfigType;\n /** Callback when config changes */\n onChange: (config: ConfigType) => void;\n}\n\n// ============================================================================\n// Component\n// ============================================================================\n\nexport const ListConfig: FC<ListConfigProps> = memo(function ListConfig({ config, onChange }) {\n const { t } = useI18n();\n const handleChange = useCallback(\n <K extends keyof ConfigType>(key: K, value: ConfigType[K]) => {\n onChange({ ...config, [key]: value });\n },\n [config, onChange]\n );\n\n return (\n <div className=\"space-y-4\">\n {/* Max Items */}\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1\">\n {t('bigconsole.widget.config.list.maxItems.label', 'Maximum Items to Display')}\n </label>\n <input\n type=\"number\"\n value={config.maxItems ?? ''}\n onChange={(e) => handleChange('maxItems', e.target.value ? Number(e.target.value) : undefined)}\n min={1}\n placeholder={t('bigconsole.widget.config.list.maxItems.placeholder', 'No limit')}\n className=\"\n w-full px-3 py-2\n text-sm text-text-primary\n bg-bg-surface\n border border-border-default\n rounded-md\n focus:outline-none focus:ring-2 focus:ring-action-primary-bg\n \"\n />\n <p className=\"text-xs text-text-secondary mt-1\">\n {t('bigconsole.widget.config.list.maxItems.help', 'Leave empty to show all items')}\n </p>\n </div>\n\n {/* Title Field */}\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1\">\n {t('bigconsole.widget.config.list.titleField.label', 'Title Field')}\n </label>\n <input\n type=\"text\"\n value={config.titleField || ''}\n onChange={(e) => handleChange('titleField', e.target.value)}\n placeholder={t('bigconsole.widget.config.list.titleField.placeholder', 'e.g., name, title')}\n className=\"\n w-full px-3 py-2\n text-sm text-text-primary\n bg-bg-surface\n border border-border-default\n rounded-md\n focus:outline-none focus:ring-2 focus:ring-action-primary-bg\n \"\n />\n </div>\n\n {/* Subtitle Field */}\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1\">\n {t('bigconsole.widget.config.list.subtitleField.label', 'Subtitle Field')}\n </label>\n <input\n type=\"text\"\n value={config.subtitleField || ''}\n onChange={(e) => handleChange('subtitleField', e.target.value)}\n placeholder={t('bigconsole.widget.config.list.subtitleField.placeholder', 'e.g., description, email')}\n className=\"\n w-full px-3 py-2\n text-sm text-text-primary\n bg-bg-surface\n border border-border-default\n rounded-md\n focus:outline-none focus:ring-2 focus:ring-action-primary-bg\n \"\n />\n </div>\n\n {/* Value Field */}\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1\">\n {t('bigconsole.widget.config.list.valueField.label', 'Value Field (right side)')}\n </label>\n <input\n type=\"text\"\n value={config.valueField || ''}\n onChange={(e) => handleChange('valueField', e.target.value)}\n placeholder={t('bigconsole.widget.config.list.valueField.placeholder', 'e.g., amount, count')}\n className=\"\n w-full px-3 py-2\n text-sm text-text-primary\n bg-bg-surface\n border border-border-default\n rounded-md\n focus:outline-none focus:ring-2 focus:ring-action-primary-bg\n \"\n />\n </div>\n\n {/* Badge Field */}\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1\">\n {t('bigconsole.widget.config.list.badgeField.label', 'Badge Field')}\n </label>\n <input\n type=\"text\"\n value={config.badgeField || ''}\n onChange={(e) => handleChange('badgeField', e.target.value)}\n placeholder={t('bigconsole.widget.config.list.badgeField.placeholder', 'e.g., status, type')}\n className=\"\n w-full px-3 py-2\n text-sm text-text-primary\n bg-bg-surface\n border border-border-default\n rounded-md\n focus:outline-none focus:ring-2 focus:ring-action-primary-bg\n \"\n />\n </div>\n\n {/* Toggle Options */}\n <div className=\"space-y-3\">\n <label className=\"flex items-center gap-3\">\n <input\n type=\"checkbox\"\n checked={config.showCount !== false}\n onChange={(e) => handleChange('showCount', e.target.checked)}\n className=\"\n w-4 h-4\n text-action-primary-bg\n bg-bg-surface\n border-border-default\n rounded\n focus:ring-action-primary-bg\n \"\n />\n <span className=\"text-sm text-text-primary\">\n {t('bigconsole.widget.config.list.showCount', 'Show item count')}\n </span>\n </label>\n\n <label className=\"flex items-center gap-3\">\n <input\n type=\"checkbox\"\n checked={config.showSearch === true}\n onChange={(e) => handleChange('showSearch', e.target.checked)}\n className=\"\n w-4 h-4\n text-action-primary-bg\n bg-bg-surface\n border-border-default\n rounded\n focus:ring-action-primary-bg\n \"\n />\n <span className=\"text-sm text-text-primary\">\n {t('bigconsole.widget.config.list.showSearch', 'Show search box')}\n </span>\n </label>\n\n <label className=\"flex items-center gap-3\">\n <input\n type=\"checkbox\"\n checked={config.showViewAll !== false}\n onChange={(e) => handleChange('showViewAll', e.target.checked)}\n className=\"\n w-4 h-4\n text-action-primary-bg\n bg-bg-surface\n border-border-default\n rounded\n focus:ring-action-primary-bg\n \"\n />\n <span className=\"text-sm text-text-primary\">\n {t('bigconsole.widget.config.list.showViewAll', 'Show \"View All\" link when truncated')}\n </span>\n </label>\n\n <label className=\"flex items-center gap-3\">\n <input\n type=\"checkbox\"\n checked={config.showIcon === true}\n onChange={(e) => handleChange('showIcon', e.target.checked)}\n className=\"\n w-4 h-4\n text-action-primary-bg\n bg-bg-surface\n border-border-default\n rounded\n focus:ring-action-primary-bg\n \"\n />\n <span className=\"text-sm text-text-primary\">\n {t('bigconsole.widget.config.list.showIcon', 'Show item icons')}\n </span>\n </label>\n </div>\n </div>\n );\n});\n\nexport default ListConfig;\n"],"mappings":"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"}
@@ -1,150 +1,151 @@
1
1
  import { memo as e, useCallback as t } from "react";
2
- import { jsx as n, jsxs as r } from "react/jsx-runtime";
2
+ import { useI18n as n } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
3
+ import { jsx as r, jsxs as i } from "react/jsx-runtime";
3
4
  //#region src/bigconsole/components/widgets/metric-card/MetricCardConfig.tsx
4
- var i = e(function({ config: e, onChange: i }) {
5
- let a = t((t, n) => {
6
- i({
5
+ var a = e(function({ config: e, onChange: a }) {
6
+ let { t: o } = n(), s = t((t, n) => {
7
+ a({
7
8
  ...e,
8
9
  [t]: n
9
10
  });
10
- }, [e, i]);
11
- return /* @__PURE__ */ r("div", {
11
+ }, [e, a]);
12
+ return /* @__PURE__ */ i("div", {
12
13
  className: "space-y-4",
13
14
  children: [
14
- /* @__PURE__ */ r("div", { children: [
15
- /* @__PURE__ */ n("label", {
15
+ /* @__PURE__ */ i("div", { children: [
16
+ /* @__PURE__ */ r("label", {
16
17
  className: "block text-sm font-medium text-text-primary mb-1",
17
- children: "Value Field"
18
+ children: o("bigconsole.widget.config.metricCard.valueField.label", "Value Field")
18
19
  }),
19
- /* @__PURE__ */ n("input", {
20
+ /* @__PURE__ */ r("input", {
20
21
  type: "text",
21
22
  value: e.valueField || "",
22
- onChange: (e) => a("valueField", e.target.value),
23
- placeholder: "e.g., totalSales, value, amount",
23
+ onChange: (e) => s("valueField", e.target.value),
24
+ placeholder: o("bigconsole.widget.config.metricCard.valueField.placeholder", "e.g., totalSales, value, amount"),
24
25
  className: "\n w-full px-3 py-2\n text-sm text-text-primary\n bg-bg-surface\n border border-border-default\n rounded-md\n focus:outline-none focus:ring-2 focus:ring-action-primary-bg\n "
25
26
  }),
26
- /* @__PURE__ */ n("p", {
27
+ /* @__PURE__ */ r("p", {
27
28
  className: "text-xs text-text-secondary mt-1",
28
- children: "Field name to extract from data (leave empty for auto-detect)"
29
+ children: o("bigconsole.widget.config.metricCard.valueField.help", "Field name to extract from data (leave empty for auto-detect)")
29
30
  })
30
31
  ] }),
31
- /* @__PURE__ */ r("div", { children: [/* @__PURE__ */ n("label", {
32
+ /* @__PURE__ */ i("div", { children: [/* @__PURE__ */ r("label", {
32
33
  className: "block text-sm font-medium text-text-primary mb-1",
33
- children: "Subtitle"
34
- }), /* @__PURE__ */ n("input", {
34
+ children: o("bigconsole.widget.config.metricCard.subtitle.label", "Subtitle")
35
+ }), /* @__PURE__ */ r("input", {
35
36
  type: "text",
36
37
  value: e.subtitle || "",
37
- onChange: (e) => a("subtitle", e.target.value),
38
- placeholder: "e.g., Total Revenue",
38
+ onChange: (e) => s("subtitle", e.target.value),
39
+ placeholder: o("bigconsole.widget.config.metricCard.subtitle.placeholder", "e.g., Total Revenue"),
39
40
  className: "\n w-full px-3 py-2\n text-sm text-text-primary\n bg-bg-surface\n border border-border-default\n rounded-md\n focus:outline-none focus:ring-2 focus:ring-action-primary-bg\n "
40
41
  })] }),
41
- /* @__PURE__ */ r("div", { children: [/* @__PURE__ */ n("label", {
42
+ /* @__PURE__ */ i("div", { children: [/* @__PURE__ */ r("label", {
42
43
  className: "block text-sm font-medium text-text-primary mb-1",
43
- children: "Value Format"
44
- }), /* @__PURE__ */ r("select", {
44
+ children: o("bigconsole.widget.config.metricCard.format.label", "Value Format")
45
+ }), /* @__PURE__ */ i("select", {
45
46
  value: e.format || "number",
46
- onChange: (e) => a("format", e.target.value),
47
+ onChange: (e) => s("format", e.target.value),
47
48
  className: "\n w-full px-3 py-2\n text-sm text-text-primary\n bg-bg-surface\n border border-border-default\n rounded-md\n focus:outline-none focus:ring-2 focus:ring-action-primary-bg\n ",
48
49
  children: [
49
- /* @__PURE__ */ n("option", {
50
+ /* @__PURE__ */ r("option", {
50
51
  value: "number",
51
- children: "Number"
52
+ children: o("bigconsole.widget.config.metricCard.format.number", "Number")
52
53
  }),
53
- /* @__PURE__ */ n("option", {
54
+ /* @__PURE__ */ r("option", {
54
55
  value: "currency",
55
- children: "Currency"
56
+ children: o("bigconsole.widget.config.metricCard.format.currency", "Currency")
56
57
  }),
57
- /* @__PURE__ */ n("option", {
58
+ /* @__PURE__ */ r("option", {
58
59
  value: "percentage",
59
- children: "Percentage"
60
+ children: o("bigconsole.widget.config.metricCard.format.percentage", "Percentage")
60
61
  }),
61
- /* @__PURE__ */ n("option", {
62
+ /* @__PURE__ */ r("option", {
62
63
  value: "compact",
63
- children: "Compact (1K, 1M)"
64
+ children: o("bigconsole.widget.config.metricCard.format.compact", "Compact (1K, 1M)")
64
65
  })
65
66
  ]
66
67
  })] }),
67
- /* @__PURE__ */ r("div", {
68
+ /* @__PURE__ */ i("div", {
68
69
  className: "grid grid-cols-2 gap-3",
69
- children: [/* @__PURE__ */ r("div", { children: [/* @__PURE__ */ n("label", {
70
+ children: [/* @__PURE__ */ i("div", { children: [/* @__PURE__ */ r("label", {
70
71
  className: "block text-sm font-medium text-text-primary mb-1",
71
- children: "Prefix"
72
- }), /* @__PURE__ */ n("input", {
72
+ children: o("bigconsole.widget.config.metricCard.prefix.label", "Prefix")
73
+ }), /* @__PURE__ */ r("input", {
73
74
  type: "text",
74
75
  value: e.prefix || "",
75
- onChange: (e) => a("prefix", e.target.value),
76
- placeholder: "e.g., $",
76
+ onChange: (e) => s("prefix", e.target.value),
77
+ placeholder: o("bigconsole.widget.config.metricCard.prefix.placeholder", "e.g., $"),
77
78
  className: "\n w-full px-3 py-2\n text-sm text-text-primary\n bg-bg-surface\n border border-border-default\n rounded-md\n focus:outline-none focus:ring-2 focus:ring-action-primary-bg\n "
78
- })] }), /* @__PURE__ */ r("div", { children: [/* @__PURE__ */ n("label", {
79
+ })] }), /* @__PURE__ */ i("div", { children: [/* @__PURE__ */ r("label", {
79
80
  className: "block text-sm font-medium text-text-primary mb-1",
80
- children: "Suffix"
81
- }), /* @__PURE__ */ n("input", {
81
+ children: o("bigconsole.widget.config.metricCard.suffix.label", "Suffix")
82
+ }), /* @__PURE__ */ r("input", {
82
83
  type: "text",
83
84
  value: e.suffix || "",
84
- onChange: (e) => a("suffix", e.target.value),
85
- placeholder: "e.g., users",
85
+ onChange: (e) => s("suffix", e.target.value),
86
+ placeholder: o("bigconsole.widget.config.metricCard.suffix.placeholder", "e.g., users"),
86
87
  className: "\n w-full px-3 py-2\n text-sm text-text-primary\n bg-bg-surface\n border border-border-default\n rounded-md\n focus:outline-none focus:ring-2 focus:ring-action-primary-bg\n "
87
88
  })] })]
88
89
  }),
89
- /* @__PURE__ */ r("div", { children: [/* @__PURE__ */ n("label", {
90
+ /* @__PURE__ */ i("div", { children: [/* @__PURE__ */ r("label", {
90
91
  className: "block text-sm font-medium text-text-primary mb-1",
91
- children: "Comparison Label"
92
- }), /* @__PURE__ */ n("input", {
92
+ children: o("bigconsole.widget.config.metricCard.comparisonLabel.label", "Comparison Label")
93
+ }), /* @__PURE__ */ r("input", {
93
94
  type: "text",
94
95
  value: e.comparisonLabel || "",
95
- onChange: (e) => a("comparisonLabel", e.target.value),
96
- placeholder: "e.g., vs last week",
96
+ onChange: (e) => s("comparisonLabel", e.target.value),
97
+ placeholder: o("bigconsole.widget.config.metricCard.comparisonLabel.placeholder", "e.g., vs last week"),
97
98
  className: "\n w-full px-3 py-2\n text-sm text-text-primary\n bg-bg-surface\n border border-border-default\n rounded-md\n focus:outline-none focus:ring-2 focus:ring-action-primary-bg\n "
98
99
  })] }),
99
- /* @__PURE__ */ r("div", {
100
+ /* @__PURE__ */ i("div", {
100
101
  className: "space-y-3",
101
102
  children: [
102
- /* @__PURE__ */ r("label", {
103
+ /* @__PURE__ */ i("label", {
103
104
  className: "flex items-center gap-3",
104
- children: [/* @__PURE__ */ n("input", {
105
+ children: [/* @__PURE__ */ r("input", {
105
106
  type: "checkbox",
106
107
  checked: e.showTrend !== !1,
107
- onChange: (e) => a("showTrend", e.target.checked),
108
+ onChange: (e) => s("showTrend", e.target.checked),
108
109
  className: "\n w-4 h-4\n text-action-primary-bg\n bg-bg-surface\n border-border-default\n rounded\n focus:ring-action-primary-bg\n "
109
- }), /* @__PURE__ */ n("span", {
110
+ }), /* @__PURE__ */ r("span", {
110
111
  className: "text-sm text-text-primary",
111
- children: "Show trend indicator"
112
+ children: o("bigconsole.widget.config.metricCard.showTrend", "Show trend indicator")
112
113
  })]
113
114
  }),
114
- /* @__PURE__ */ r("label", {
115
+ /* @__PURE__ */ i("label", {
115
116
  className: "flex items-center gap-3",
116
- children: [/* @__PURE__ */ n("input", {
117
+ children: [/* @__PURE__ */ r("input", {
117
118
  type: "checkbox",
118
119
  checked: e.showComparison !== !1,
119
- onChange: (e) => a("showComparison", e.target.checked),
120
+ onChange: (e) => s("showComparison", e.target.checked),
120
121
  className: "\n w-4 h-4\n text-action-primary-bg\n bg-bg-surface\n border-border-default\n rounded\n focus:ring-action-primary-bg\n "
121
- }), /* @__PURE__ */ n("span", {
122
+ }), /* @__PURE__ */ r("span", {
122
123
  className: "text-sm text-text-primary",
123
- children: "Show comparison badge"
124
+ children: o("bigconsole.widget.config.metricCard.showComparison", "Show comparison badge")
124
125
  })]
125
126
  }),
126
- /* @__PURE__ */ r("label", {
127
+ /* @__PURE__ */ i("label", {
127
128
  className: "flex items-center gap-3",
128
- children: [/* @__PURE__ */ n("input", {
129
+ children: [/* @__PURE__ */ r("input", {
129
130
  type: "checkbox",
130
131
  checked: e.showSparkline !== !1,
131
- onChange: (e) => a("showSparkline", e.target.checked),
132
+ onChange: (e) => s("showSparkline", e.target.checked),
132
133
  className: "\n w-4 h-4\n text-action-primary-bg\n bg-bg-surface\n border-border-default\n rounded\n focus:ring-action-primary-bg\n "
133
- }), /* @__PURE__ */ n("span", {
134
+ }), /* @__PURE__ */ r("span", {
134
135
  className: "text-sm text-text-primary",
135
- children: "Show sparkline chart"
136
+ children: o("bigconsole.widget.config.metricCard.showSparkline", "Show sparkline chart")
136
137
  })]
137
138
  }),
138
- /* @__PURE__ */ r("label", {
139
+ /* @__PURE__ */ i("label", {
139
140
  className: "flex items-center gap-3",
140
- children: [/* @__PURE__ */ n("input", {
141
+ children: [/* @__PURE__ */ r("input", {
141
142
  type: "checkbox",
142
143
  checked: e.positiveIsGood !== !1,
143
- onChange: (e) => a("positiveIsGood", e.target.checked),
144
+ onChange: (e) => s("positiveIsGood", e.target.checked),
144
145
  className: "\n w-4 h-4\n text-action-primary-bg\n bg-bg-surface\n border-border-default\n rounded\n focus:ring-action-primary-bg\n "
145
- }), /* @__PURE__ */ n("span", {
146
+ }), /* @__PURE__ */ r("span", {
146
147
  className: "text-sm text-text-primary",
147
- children: "Positive change is good"
148
+ children: o("bigconsole.widget.config.metricCard.positiveIsGood", "Positive change is good")
148
149
  })]
149
150
  })
150
151
  ]
@@ -153,6 +154,6 @@ var i = e(function({ config: e, onChange: i }) {
153
154
  });
154
155
  });
155
156
  //#endregion
156
- export { i as default };
157
+ export { a as default };
157
158
 
158
159
  //# sourceMappingURL=MetricCardConfig.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"MetricCardConfig.js","names":[],"sources":["../../../../../src/bigconsole/components/widgets/metric-card/MetricCardConfig.tsx"],"sourcesContent":["/**\n * MetricCardConfig Component\n *\n * Configuration panel for MetricCard widgets.\n */\n\nimport { type FC, memo, useCallback } from 'react';\nimport type { MetricCardConfig as ConfigType } from '../../../types';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface MetricCardConfigProps {\n /** Current configuration */\n config: ConfigType;\n /** Callback when config changes */\n onChange: (config: ConfigType) => void;\n}\n\n// ============================================================================\n// Component\n// ============================================================================\n\nexport const MetricCardConfig: FC<MetricCardConfigProps> = memo(function MetricCardConfig({ config, onChange }) {\n const handleChange = useCallback(\n <K extends keyof ConfigType>(key: K, value: ConfigType[K]) => {\n onChange({ ...config, [key]: value });\n },\n [config, onChange]\n );\n\n return (\n <div className=\"space-y-4\">\n {/* Value Field */}\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1\">Value Field</label>\n <input\n type=\"text\"\n value={((config as unknown as Record<string, unknown>).valueField as string) || ''}\n onChange={(e) => handleChange('valueField' as keyof ConfigType, e.target.value as never)}\n placeholder=\"e.g., totalSales, value, amount\"\n className=\"\n w-full px-3 py-2\n text-sm text-text-primary\n bg-bg-surface\n border border-border-default\n rounded-md\n focus:outline-none focus:ring-2 focus:ring-action-primary-bg\n \"\n />\n <p className=\"text-xs text-text-secondary mt-1\">\n Field name to extract from data (leave empty for auto-detect)\n </p>\n </div>\n\n {/* Subtitle */}\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1\">Subtitle</label>\n <input\n type=\"text\"\n value={config.subtitle || ''}\n onChange={(e) => handleChange('subtitle', e.target.value)}\n placeholder=\"e.g., Total Revenue\"\n className=\"\n w-full px-3 py-2\n text-sm text-text-primary\n bg-bg-surface\n border border-border-default\n rounded-md\n focus:outline-none focus:ring-2 focus:ring-action-primary-bg\n \"\n />\n </div>\n\n {/* Format */}\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1\">Value Format</label>\n <select\n value={config.format || 'number'}\n onChange={(e) => handleChange('format', e.target.value as ConfigType['format'])}\n className=\"\n w-full px-3 py-2\n text-sm text-text-primary\n bg-bg-surface\n border border-border-default\n rounded-md\n focus:outline-none focus:ring-2 focus:ring-action-primary-bg\n \"\n >\n <option value=\"number\">Number</option>\n <option value=\"currency\">Currency</option>\n <option value=\"percentage\">Percentage</option>\n <option value=\"compact\">Compact (1K, 1M)</option>\n </select>\n </div>\n\n {/* Prefix & Suffix */}\n <div className=\"grid grid-cols-2 gap-3\">\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1\">Prefix</label>\n <input\n type=\"text\"\n value={config.prefix || ''}\n onChange={(e) => handleChange('prefix', e.target.value)}\n placeholder=\"e.g., $\"\n className=\"\n w-full px-3 py-2\n text-sm text-text-primary\n bg-bg-surface\n border border-border-default\n rounded-md\n focus:outline-none focus:ring-2 focus:ring-action-primary-bg\n \"\n />\n </div>\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1\">Suffix</label>\n <input\n type=\"text\"\n value={config.suffix || ''}\n onChange={(e) => handleChange('suffix', e.target.value)}\n placeholder=\"e.g., users\"\n className=\"\n w-full px-3 py-2\n text-sm text-text-primary\n bg-bg-surface\n border border-border-default\n rounded-md\n focus:outline-none focus:ring-2 focus:ring-action-primary-bg\n \"\n />\n </div>\n </div>\n\n {/* Comparison Label */}\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1\">Comparison Label</label>\n <input\n type=\"text\"\n value={config.comparisonLabel || ''}\n onChange={(e) => handleChange('comparisonLabel', e.target.value)}\n placeholder=\"e.g., vs last week\"\n className=\"\n w-full px-3 py-2\n text-sm text-text-primary\n bg-bg-surface\n border border-border-default\n rounded-md\n focus:outline-none focus:ring-2 focus:ring-action-primary-bg\n \"\n />\n </div>\n\n {/* Toggle Options */}\n <div className=\"space-y-3\">\n <label className=\"flex items-center gap-3\">\n <input\n type=\"checkbox\"\n checked={config.showTrend !== false}\n onChange={(e) => handleChange('showTrend', e.target.checked)}\n className=\"\n w-4 h-4\n text-action-primary-bg\n bg-bg-surface\n border-border-default\n rounded\n focus:ring-action-primary-bg\n \"\n />\n <span className=\"text-sm text-text-primary\">Show trend indicator</span>\n </label>\n\n <label className=\"flex items-center gap-3\">\n <input\n type=\"checkbox\"\n checked={config.showComparison !== false}\n onChange={(e) => handleChange('showComparison', e.target.checked)}\n className=\"\n w-4 h-4\n text-action-primary-bg\n bg-bg-surface\n border-border-default\n rounded\n focus:ring-action-primary-bg\n \"\n />\n <span className=\"text-sm text-text-primary\">Show comparison badge</span>\n </label>\n\n <label className=\"flex items-center gap-3\">\n <input\n type=\"checkbox\"\n checked={config.showSparkline !== false}\n onChange={(e) => handleChange('showSparkline', e.target.checked)}\n className=\"\n w-4 h-4\n text-action-primary-bg\n bg-bg-surface\n border-border-default\n rounded\n focus:ring-action-primary-bg\n \"\n />\n <span className=\"text-sm text-text-primary\">Show sparkline chart</span>\n </label>\n\n <label className=\"flex items-center gap-3\">\n <input\n type=\"checkbox\"\n checked={config.positiveIsGood !== false}\n onChange={(e) => handleChange('positiveIsGood', e.target.checked)}\n className=\"\n w-4 h-4\n text-action-primary-bg\n bg-bg-surface\n border-border-default\n rounded\n focus:ring-action-primary-bg\n \"\n />\n <span className=\"text-sm text-text-primary\">Positive change is good</span>\n </label>\n </div>\n </div>\n );\n});\n\nexport default MetricCardConfig;\n"],"mappings":"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"}
1
+ {"version":3,"file":"MetricCardConfig.js","names":[],"sources":["../../../../../src/bigconsole/components/widgets/metric-card/MetricCardConfig.tsx"],"sourcesContent":["/**\n * MetricCardConfig Component\n *\n * Configuration panel for MetricCard widgets.\n */\n\nimport { type FC, memo, useCallback } from 'react';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport type { MetricCardConfig as ConfigType } from '../../../types';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface MetricCardConfigProps {\n /** Current configuration */\n config: ConfigType;\n /** Callback when config changes */\n onChange: (config: ConfigType) => void;\n}\n\n// ============================================================================\n// Component\n// ============================================================================\n\nexport const MetricCardConfig: FC<MetricCardConfigProps> = memo(function MetricCardConfig({ config, onChange }) {\n const { t } = useI18n();\n const handleChange = useCallback(\n <K extends keyof ConfigType>(key: K, value: ConfigType[K]) => {\n onChange({ ...config, [key]: value });\n },\n [config, onChange]\n );\n\n return (\n <div className=\"space-y-4\">\n {/* Value Field */}\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1\">\n {t('bigconsole.widget.config.metricCard.valueField.label', 'Value Field')}\n </label>\n <input\n type=\"text\"\n value={((config as unknown as Record<string, unknown>).valueField as string) || ''}\n onChange={(e) => handleChange('valueField' as keyof ConfigType, e.target.value as never)}\n placeholder={t(\n 'bigconsole.widget.config.metricCard.valueField.placeholder',\n 'e.g., totalSales, value, amount'\n )}\n className=\"\n w-full px-3 py-2\n text-sm text-text-primary\n bg-bg-surface\n border border-border-default\n rounded-md\n focus:outline-none focus:ring-2 focus:ring-action-primary-bg\n \"\n />\n <p className=\"text-xs text-text-secondary mt-1\">\n {t(\n 'bigconsole.widget.config.metricCard.valueField.help',\n 'Field name to extract from data (leave empty for auto-detect)'\n )}\n </p>\n </div>\n\n {/* Subtitle */}\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1\">\n {t('bigconsole.widget.config.metricCard.subtitle.label', 'Subtitle')}\n </label>\n <input\n type=\"text\"\n value={config.subtitle || ''}\n onChange={(e) => handleChange('subtitle', e.target.value)}\n placeholder={t('bigconsole.widget.config.metricCard.subtitle.placeholder', 'e.g., Total Revenue')}\n className=\"\n w-full px-3 py-2\n text-sm text-text-primary\n bg-bg-surface\n border border-border-default\n rounded-md\n focus:outline-none focus:ring-2 focus:ring-action-primary-bg\n \"\n />\n </div>\n\n {/* Format */}\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1\">\n {t('bigconsole.widget.config.metricCard.format.label', 'Value Format')}\n </label>\n <select\n value={config.format || 'number'}\n onChange={(e) => handleChange('format', e.target.value as ConfigType['format'])}\n className=\"\n w-full px-3 py-2\n text-sm text-text-primary\n bg-bg-surface\n border border-border-default\n rounded-md\n focus:outline-none focus:ring-2 focus:ring-action-primary-bg\n \"\n >\n <option value=\"number\">{t('bigconsole.widget.config.metricCard.format.number', 'Number')}</option>\n <option value=\"currency\">{t('bigconsole.widget.config.metricCard.format.currency', 'Currency')}</option>\n <option value=\"percentage\">{t('bigconsole.widget.config.metricCard.format.percentage', 'Percentage')}</option>\n <option value=\"compact\">{t('bigconsole.widget.config.metricCard.format.compact', 'Compact (1K, 1M)')}</option>\n </select>\n </div>\n\n {/* Prefix & Suffix */}\n <div className=\"grid grid-cols-2 gap-3\">\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1\">\n {t('bigconsole.widget.config.metricCard.prefix.label', 'Prefix')}\n </label>\n <input\n type=\"text\"\n value={config.prefix || ''}\n onChange={(e) => handleChange('prefix', e.target.value)}\n placeholder={t('bigconsole.widget.config.metricCard.prefix.placeholder', 'e.g., $')}\n className=\"\n w-full px-3 py-2\n text-sm text-text-primary\n bg-bg-surface\n border border-border-default\n rounded-md\n focus:outline-none focus:ring-2 focus:ring-action-primary-bg\n \"\n />\n </div>\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1\">\n {t('bigconsole.widget.config.metricCard.suffix.label', 'Suffix')}\n </label>\n <input\n type=\"text\"\n value={config.suffix || ''}\n onChange={(e) => handleChange('suffix', e.target.value)}\n placeholder={t('bigconsole.widget.config.metricCard.suffix.placeholder', 'e.g., users')}\n className=\"\n w-full px-3 py-2\n text-sm text-text-primary\n bg-bg-surface\n border border-border-default\n rounded-md\n focus:outline-none focus:ring-2 focus:ring-action-primary-bg\n \"\n />\n </div>\n </div>\n\n {/* Comparison Label */}\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1\">\n {t('bigconsole.widget.config.metricCard.comparisonLabel.label', 'Comparison Label')}\n </label>\n <input\n type=\"text\"\n value={config.comparisonLabel || ''}\n onChange={(e) => handleChange('comparisonLabel', e.target.value)}\n placeholder={t('bigconsole.widget.config.metricCard.comparisonLabel.placeholder', 'e.g., vs last week')}\n className=\"\n w-full px-3 py-2\n text-sm text-text-primary\n bg-bg-surface\n border border-border-default\n rounded-md\n focus:outline-none focus:ring-2 focus:ring-action-primary-bg\n \"\n />\n </div>\n\n {/* Toggle Options */}\n <div className=\"space-y-3\">\n <label className=\"flex items-center gap-3\">\n <input\n type=\"checkbox\"\n checked={config.showTrend !== false}\n onChange={(e) => handleChange('showTrend', e.target.checked)}\n className=\"\n w-4 h-4\n text-action-primary-bg\n bg-bg-surface\n border-border-default\n rounded\n focus:ring-action-primary-bg\n \"\n />\n <span className=\"text-sm text-text-primary\">\n {t('bigconsole.widget.config.metricCard.showTrend', 'Show trend indicator')}\n </span>\n </label>\n\n <label className=\"flex items-center gap-3\">\n <input\n type=\"checkbox\"\n checked={config.showComparison !== false}\n onChange={(e) => handleChange('showComparison', e.target.checked)}\n className=\"\n w-4 h-4\n text-action-primary-bg\n bg-bg-surface\n border-border-default\n rounded\n focus:ring-action-primary-bg\n \"\n />\n <span className=\"text-sm text-text-primary\">\n {t('bigconsole.widget.config.metricCard.showComparison', 'Show comparison badge')}\n </span>\n </label>\n\n <label className=\"flex items-center gap-3\">\n <input\n type=\"checkbox\"\n checked={config.showSparkline !== false}\n onChange={(e) => handleChange('showSparkline', e.target.checked)}\n className=\"\n w-4 h-4\n text-action-primary-bg\n bg-bg-surface\n border-border-default\n rounded\n focus:ring-action-primary-bg\n \"\n />\n <span className=\"text-sm text-text-primary\">\n {t('bigconsole.widget.config.metricCard.showSparkline', 'Show sparkline chart')}\n </span>\n </label>\n\n <label className=\"flex items-center gap-3\">\n <input\n type=\"checkbox\"\n checked={config.positiveIsGood !== false}\n onChange={(e) => handleChange('positiveIsGood', e.target.checked)}\n className=\"\n w-4 h-4\n text-action-primary-bg\n bg-bg-surface\n border-border-default\n rounded\n focus:ring-action-primary-bg\n \"\n />\n <span className=\"text-sm text-text-primary\">\n {t('bigconsole.widget.config.metricCard.positiveIsGood', 'Positive change is good')}\n </span>\n </label>\n </div>\n </div>\n );\n});\n\nexport default MetricCardConfig;\n"],"mappings":"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"}