@hed-hog/core 0.0.299 → 0.0.300

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 (112) hide show
  1. package/dist/dashboard/dashboard/dashboard.controller.d.ts +6 -0
  2. package/dist/dashboard/dashboard/dashboard.controller.d.ts.map +1 -1
  3. package/dist/dashboard/dashboard/dashboard.service.d.ts +6 -0
  4. package/dist/dashboard/dashboard/dashboard.service.d.ts.map +1 -1
  5. package/dist/dashboard/dashboard-component/dashboard-component.controller.d.ts +2 -1
  6. package/dist/dashboard/dashboard-component/dashboard-component.controller.d.ts.map +1 -1
  7. package/dist/dashboard/dashboard-component/dashboard-component.controller.js +6 -3
  8. package/dist/dashboard/dashboard-component/dashboard-component.controller.js.map +1 -1
  9. package/dist/dashboard/dashboard-component/dashboard-component.service.d.ts +7 -1
  10. package/dist/dashboard/dashboard-component/dashboard-component.service.d.ts.map +1 -1
  11. package/dist/dashboard/dashboard-component/dashboard-component.service.js +76 -33
  12. package/dist/dashboard/dashboard-component/dashboard-component.service.js.map +1 -1
  13. package/dist/dashboard/dashboard-core/dashboard-core.controller.d.ts +65 -0
  14. package/dist/dashboard/dashboard-core/dashboard-core.controller.d.ts.map +1 -1
  15. package/dist/dashboard/dashboard-core/dashboard-core.controller.js +111 -0
  16. package/dist/dashboard/dashboard-core/dashboard-core.controller.js.map +1 -1
  17. package/dist/dashboard/dashboard-core/dashboard-core.service.d.ts +69 -0
  18. package/dist/dashboard/dashboard-core/dashboard-core.service.d.ts.map +1 -1
  19. package/dist/dashboard/dashboard-core/dashboard-core.service.js +526 -19
  20. package/dist/dashboard/dashboard-core/dashboard-core.service.js.map +1 -1
  21. package/dist/dashboard/dashboard-item/dashboard-item.controller.d.ts +2 -0
  22. package/dist/dashboard/dashboard-item/dashboard-item.controller.d.ts.map +1 -1
  23. package/dist/dashboard/dashboard-item/dashboard-item.service.d.ts +2 -0
  24. package/dist/dashboard/dashboard-item/dashboard-item.service.d.ts.map +1 -1
  25. package/dist/dashboard/dashboard-role/dashboard-role.controller.d.ts +2 -0
  26. package/dist/dashboard/dashboard-role/dashboard-role.controller.d.ts.map +1 -1
  27. package/dist/dashboard/dashboard-role/dashboard-role.service.d.ts +2 -0
  28. package/dist/dashboard/dashboard-role/dashboard-role.service.d.ts.map +1 -1
  29. package/hedhog/data/dashboard.yaml +12 -6
  30. package/hedhog/data/dashboard_component_role.yaml +66 -0
  31. package/hedhog/data/dashboard_role.yaml +2 -8
  32. package/hedhog/data/route.yaml +72 -0
  33. package/hedhog/frontend/app/dashboard/[slug]/dashboard-content.tsx.ejs +333 -128
  34. package/hedhog/frontend/app/dashboard/[slug]/widget-renderer.tsx.ejs +277 -53
  35. package/hedhog/frontend/app/dashboard/components/add-widget-selector-dialog.tsx.ejs +179 -231
  36. package/hedhog/frontend/app/dashboard/components/draggable-grid.tsx.ejs +64 -18
  37. package/hedhog/frontend/app/dashboard/dashboard-home-tabs.tsx.ejs +1389 -0
  38. package/hedhog/frontend/app/dashboard/dashboard.css.ejs +37 -0
  39. package/hedhog/frontend/app/dashboard/management/page.tsx.ejs +1 -1
  40. package/hedhog/frontend/app/dashboard/management/tabs/components-tab.tsx.ejs +6 -6
  41. package/hedhog/frontend/app/dashboard/management/tabs/dashboards-tab.tsx.ejs +8 -8
  42. package/hedhog/frontend/app/dashboard/management/tabs/items-tab.tsx.ejs +3 -3
  43. package/hedhog/frontend/app/dashboard/page.tsx.ejs +3 -25
  44. package/hedhog/frontend/messages/en.json +112 -2
  45. package/hedhog/frontend/messages/pt.json +111 -1
  46. package/hedhog/frontend/widgets/account-security.tsx.ejs +1 -1
  47. package/hedhog/frontend/widgets/active-users-card.tsx.ejs +2 -2
  48. package/hedhog/frontend/widgets/activity-timeline.tsx.ejs +1 -1
  49. package/hedhog/frontend/widgets/email-notifications.tsx.ejs +1 -1
  50. package/hedhog/frontend/widgets/locale-config.tsx.ejs +1 -1
  51. package/hedhog/frontend/widgets/login-history-chart.tsx.ejs +1 -1
  52. package/hedhog/frontend/widgets/mail-config.tsx.ejs +1 -1
  53. package/hedhog/frontend/widgets/mail-sent-card.tsx.ejs +2 -2
  54. package/hedhog/frontend/widgets/mail-sent-chart.tsx.ejs +1 -1
  55. package/hedhog/frontend/widgets/menus-card.tsx.ejs +2 -2
  56. package/hedhog/frontend/widgets/oauth-config.tsx.ejs +1 -1
  57. package/hedhog/frontend/widgets/permissions-card.tsx.ejs +2 -2
  58. package/hedhog/frontend/widgets/permissions-chart.tsx.ejs +1 -1
  59. package/hedhog/frontend/widgets/profile-card.tsx.ejs +1 -1
  60. package/hedhog/frontend/widgets/routes-card.tsx.ejs +2 -2
  61. package/hedhog/frontend/widgets/session-activity-chart.tsx.ejs +1 -1
  62. package/hedhog/frontend/widgets/sessions-today-card.tsx.ejs +2 -2
  63. package/hedhog/frontend/widgets/stat-access-level.tsx.ejs +1 -1
  64. package/hedhog/frontend/widgets/stat-actions-today.tsx.ejs +1 -1
  65. package/hedhog/frontend/widgets/stat-consecutive-days.tsx.ejs +1 -1
  66. package/hedhog/frontend/widgets/stat-online-time.tsx.ejs +1 -1
  67. package/hedhog/frontend/widgets/storage-config.tsx.ejs +1 -1
  68. package/hedhog/frontend/widgets/theme-config.tsx.ejs +1 -1
  69. package/hedhog/frontend/widgets/user-growth-chart.tsx.ejs +1 -1
  70. package/hedhog/frontend/widgets/user-roles.tsx.ejs +1 -1
  71. package/hedhog/frontend/widgets/user-sessions.tsx.ejs +1 -1
  72. package/hedhog/table/dashboard.yaml +6 -0
  73. package/package.json +5 -5
  74. package/src/dashboard/dashboard-component/dashboard-component.controller.ts +15 -2
  75. package/src/dashboard/dashboard-component/dashboard-component.service.ts +107 -43
  76. package/src/dashboard/dashboard-core/dashboard-core.controller.ts +112 -1
  77. package/src/dashboard/dashboard-core/dashboard-core.service.ts +674 -19
  78. package/hedhog/frontend/app/dashboard/components/widgets/core..gitkeep.ejs +0 -11
  79. package/hedhog/frontend/app/dashboard/components/widgets/core.account-security.tsx.ejs +0 -192
  80. package/hedhog/frontend/app/dashboard/components/widgets/core.active-users-card.tsx.ejs +0 -58
  81. package/hedhog/frontend/app/dashboard/components/widgets/core.activity-timeline.tsx.ejs +0 -223
  82. package/hedhog/frontend/app/dashboard/components/widgets/core.email-notifications.tsx.ejs +0 -226
  83. package/hedhog/frontend/app/dashboard/components/widgets/core.locale-config.tsx.ejs +0 -168
  84. package/hedhog/frontend/app/dashboard/components/widgets/core.login-history-chart.tsx.ejs +0 -115
  85. package/hedhog/frontend/app/dashboard/components/widgets/core.mail-config.tsx.ejs +0 -199
  86. package/hedhog/frontend/app/dashboard/components/widgets/core.mail-sent-card.tsx.ejs +0 -58
  87. package/hedhog/frontend/app/dashboard/components/widgets/core.mail-sent-chart.tsx.ejs +0 -149
  88. package/hedhog/frontend/app/dashboard/components/widgets/core.menus-card.tsx.ejs +0 -58
  89. package/hedhog/frontend/app/dashboard/components/widgets/core.oauth-config.tsx.ejs +0 -175
  90. package/hedhog/frontend/app/dashboard/components/widgets/core.permissions-card.tsx.ejs +0 -61
  91. package/hedhog/frontend/app/dashboard/components/widgets/core.permissions-chart.tsx.ejs +0 -156
  92. package/hedhog/frontend/app/dashboard/components/widgets/core.profile-card.tsx.ejs +0 -186
  93. package/hedhog/frontend/app/dashboard/components/widgets/core.routes-card.tsx.ejs +0 -58
  94. package/hedhog/frontend/app/dashboard/components/widgets/core.session-activity-chart.tsx.ejs +0 -183
  95. package/hedhog/frontend/app/dashboard/components/widgets/core.sessions-today-card.tsx.ejs +0 -62
  96. package/hedhog/frontend/app/dashboard/components/widgets/core.stat-access-level.tsx.ejs +0 -57
  97. package/hedhog/frontend/app/dashboard/components/widgets/core.stat-actions-today.tsx.ejs +0 -57
  98. package/hedhog/frontend/app/dashboard/components/widgets/core.stat-consecutive-days.tsx.ejs +0 -57
  99. package/hedhog/frontend/app/dashboard/components/widgets/core.stat-online-time.tsx.ejs +0 -57
  100. package/hedhog/frontend/app/dashboard/components/widgets/core.storage-config.tsx.ejs +0 -196
  101. package/hedhog/frontend/app/dashboard/components/widgets/core.theme-config.tsx.ejs +0 -213
  102. package/hedhog/frontend/app/dashboard/components/widgets/core.user-growth-chart.tsx.ejs +0 -210
  103. package/hedhog/frontend/app/dashboard/components/widgets/core.user-roles.tsx.ejs +0 -132
  104. package/hedhog/frontend/app/dashboard/components/widgets/core.user-sessions.tsx.ejs +0 -236
  105. package/hedhog/frontend/app/dashboard/components/widgets/finance.alerts.tsx.ejs +0 -108
  106. package/hedhog/frontend/app/dashboard/components/widgets/finance.cash-balance-kpi.tsx.ejs +0 -66
  107. package/hedhog/frontend/app/dashboard/components/widgets/finance.cash-flow-chart.tsx.ejs +0 -122
  108. package/hedhog/frontend/app/dashboard/components/widgets/finance.default-kpi.tsx.ejs +0 -63
  109. package/hedhog/frontend/app/dashboard/components/widgets/finance.payable-30d-kpi.tsx.ejs +0 -73
  110. package/hedhog/frontend/app/dashboard/components/widgets/finance.receivable-30d-kpi.tsx.ejs +0 -73
  111. package/hedhog/frontend/app/dashboard/components/widgets/finance.upcoming-payable.tsx.ejs +0 -123
  112. package/hedhog/frontend/app/dashboard/components/widgets/finance.upcoming-receivable.tsx.ejs +0 -118
@@ -1,226 +0,0 @@
1
- 'use client';
2
-
3
- import {
4
- Card,
5
- CardContent,
6
- CardDescription,
7
- CardHeader,
8
- CardTitle,
9
- } from '@/components/ui/card';
10
- import {
11
- ChartContainer,
12
- ChartTooltip,
13
- ChartTooltipContent,
14
- } from '@/components/ui/chart';
15
- import { useWidgetData } from '@/hooks/use-widget-data';
16
- import type {
17
- AllWidgetsData,
18
- EmailNotificationsData,
19
- } from '@/types/widget-data';
20
- import { Mail, MailCheck, MailWarning, MailX } from 'lucide-react';
21
- import { useTranslations } from 'next-intl';
22
- import { Area, AreaChart, CartesianGrid, XAxis, YAxis } from 'recharts';
23
- import { WidgetWrapper } from '../widget-wrapper';
24
-
25
- const defaultEmailNotificationsData: EmailNotificationsData = {
26
- cards: {
27
- received: 0,
28
- read: 0,
29
- unread: 0,
30
- error: 0,
31
- },
32
- chart: [],
33
- };
34
-
35
- interface EmailNotificationsProps {
36
- widget?: { name?: string };
37
- onRemove?: () => void;
38
- }
39
-
40
- export default function EmailNotifications({
41
- widget,
42
- onRemove,
43
- }: EmailNotificationsProps) {
44
- const t = useTranslations('core.DashboardPage.emailNotifications');
45
-
46
- const chartConfig = {
47
- recebidos: {
48
- label: t('received'),
49
- color: 'hsl(221, 83%, 53%)',
50
- },
51
- lidos: {
52
- label: t('read'),
53
- color: 'hsl(160, 84%, 39%)',
54
- },
55
- };
56
-
57
- const { data, isLoading, isError, isAccessDenied } = useWidgetData<
58
- AllWidgetsData,
59
- EmailNotificationsData
60
- >({
61
- endpoint: '/dashboard-core/widgets/me',
62
- queryKey: 'widget-me',
63
- select: (d) => d.emailNotifications,
64
- });
65
-
66
- const widgetData = data ?? defaultEmailNotificationsData;
67
- const chartData = widgetData.chart.map((point) => ({
68
- date: point.date,
69
- recebidos: point.received ?? 0,
70
- lidos: point.read ?? 0,
71
- }));
72
-
73
- const emailStats = [
74
- {
75
- label: t('received'),
76
- shortLabel: t('receivedShort'),
77
- value: widgetData.cards.received ?? 0,
78
- icon: Mail,
79
- color: 'text-blue-600 dark:text-blue-400',
80
- bg: 'bg-blue-50 dark:bg-blue-950/40',
81
- },
82
- {
83
- label: t('read'),
84
- shortLabel: t('readShort'),
85
- value: widgetData.cards.read ?? 0,
86
- icon: MailCheck,
87
- color: 'text-emerald-600 dark:text-emerald-400',
88
- bg: 'bg-emerald-50 dark:bg-emerald-950/40',
89
- },
90
- {
91
- label: t('unread'),
92
- shortLabel: t('unreadShort'),
93
- value: widgetData.cards.unread ?? 0,
94
- icon: MailWarning,
95
- color: 'text-amber-600 dark:text-amber-400',
96
- bg: 'bg-amber-50 dark:bg-amber-950/40',
97
- },
98
- {
99
- label: t('error'),
100
- shortLabel: t('errorShort'),
101
- value: widgetData.cards.error ?? 0,
102
- icon: MailX,
103
- color: 'text-red-600 dark:text-red-400',
104
- bg: 'bg-red-50 dark:bg-red-950/40',
105
- },
106
- ];
107
-
108
- return (
109
- <WidgetWrapper
110
- isLoading={isLoading}
111
- isError={isError}
112
- isAccessDenied={isAccessDenied}
113
- widgetName={widget?.name ?? t('title')}
114
- onRemove={onRemove}
115
- >
116
- <Card className="flex h-full min-h-0 flex-col overflow-hidden">
117
- <CardHeader className="shrink-0 pb-2">
118
- <div className="flex items-center gap-2">
119
- <Mail className="h-4 w-4 text-rose-600 dark:text-rose-400 sm:h-5 sm:w-5" />
120
- <div>
121
- <CardTitle className="text-sm font-semibold sm:text-base">
122
- {t('title')}
123
- </CardTitle>
124
- <CardDescription className="text-xs sm:text-sm">
125
- {t('description')}
126
- </CardDescription>
127
- </div>
128
- </div>
129
- </CardHeader>
130
- <CardContent className="flex min-h-0 flex-1 flex-col gap-4 overflow-hidden pt-0">
131
- <div className="grid grid-cols-2 gap-1.5 sm:gap-2 md:grid-cols-4">
132
- {emailStats.map((stat) => {
133
- const Icon = stat.icon;
134
- return (
135
- <div
136
- key={stat.label}
137
- className="flex min-w-0 flex-col items-center gap-1 rounded-lg border p-2 text-center transition-colors hover:bg-muted/30 sm:p-2.5"
138
- >
139
- <div
140
- className={`flex h-6 w-6 items-center justify-center rounded-md sm:h-7 sm:w-7 ${stat.bg}`}
141
- >
142
- <Icon
143
- className={`h-3 w-3 sm:h-3.5 sm:w-3.5 ${stat.color}`}
144
- />
145
- </div>
146
- <span className="text-base font-bold text-foreground sm:text-lg">
147
- {stat.value}
148
- </span>
149
- <span className="truncate text-[9px] text-muted-foreground sm:text-[10px]">
150
- <span className="sm:hidden">{stat.shortLabel}</span>
151
- <span className="hidden sm:inline">{stat.label}</span>
152
- </span>
153
- </div>
154
- );
155
- })}
156
- </div>
157
-
158
- <ChartContainer
159
- config={chartConfig}
160
- className="min-h-42.5 w-full flex-1 overflow-hidden sm:min-h-55"
161
- >
162
- <AreaChart data={chartData}>
163
- <CartesianGrid vertical={false} strokeDasharray="3 3" />
164
- <XAxis
165
- dataKey="date"
166
- tickLine={false}
167
- axisLine={false}
168
- fontSize={10}
169
- tickMargin={4}
170
- minTickGap={20}
171
- />
172
- <YAxis
173
- tickLine={false}
174
- axisLine={false}
175
- fontSize={10}
176
- tickMargin={4}
177
- allowDecimals={false}
178
- />
179
- <ChartTooltip content={<ChartTooltipContent />} />
180
- <defs>
181
- <linearGradient id="fillRecebidos" x1="0" y1="0" x2="0" y2="1">
182
- <stop
183
- offset="5%"
184
- stopColor="hsl(221, 83%, 53%)"
185
- stopOpacity={0.2}
186
- />
187
- <stop
188
- offset="95%"
189
- stopColor="hsl(221, 83%, 53%)"
190
- stopOpacity={0}
191
- />
192
- </linearGradient>
193
- <linearGradient id="fillLidos" x1="0" y1="0" x2="0" y2="1">
194
- <stop
195
- offset="5%"
196
- stopColor="hsl(160, 84%, 39%)"
197
- stopOpacity={0.2}
198
- />
199
- <stop
200
- offset="95%"
201
- stopColor="hsl(160, 84%, 39%)"
202
- stopOpacity={0}
203
- />
204
- </linearGradient>
205
- </defs>
206
- <Area
207
- type="monotone"
208
- dataKey="recebidos"
209
- stroke="hsl(221, 83%, 53%)"
210
- fill="url(#fillRecebidos)"
211
- strokeWidth={2}
212
- />
213
- <Area
214
- type="monotone"
215
- dataKey="lidos"
216
- stroke="hsl(160, 84%, 39%)"
217
- fill="url(#fillLidos)"
218
- strokeWidth={2}
219
- />
220
- </AreaChart>
221
- </ChartContainer>
222
- </CardContent>
223
- </Card>
224
- </WidgetWrapper>
225
- );
226
- }
@@ -1,168 +0,0 @@
1
- 'use client';
2
-
3
- import { Badge } from '@/components/ui/badge';
4
- import {
5
- Card,
6
- CardContent,
7
- CardDescription,
8
- CardHeader,
9
- CardTitle,
10
- } from '@/components/ui/card';
11
- import { useWidgetData } from '@/hooks/use-widget-data';
12
- import type {
13
- DashboardCoreConfigOverviewData,
14
- LocaleConfigWidgetData,
15
- } from '@/types/widget-data';
16
- import { Calendar, Clock, Globe, Languages } from 'lucide-react';
17
- import { useTranslations } from 'next-intl';
18
- import { WidgetWrapper } from '../widget-wrapper';
19
-
20
- const defaultLocaleConfigData: LocaleConfigWidgetData = {
21
- status: {
22
- isConfigured: false,
23
- enabledLocaleCount: 0,
24
- disabledLocaleCount: 0,
25
- },
26
- settings: {
27
- dateFormat: null,
28
- timeFormat: null,
29
- timezone: null,
30
- },
31
- locales: [],
32
- };
33
-
34
- interface LocaleConfigProps {
35
- widget?: { name?: string };
36
- onRemove?: () => void;
37
- }
38
-
39
- export default function LocaleConfig({ widget, onRemove }: LocaleConfigProps) {
40
- const t = useTranslations('core.DashboardPage.localeConfig');
41
-
42
- const { data, isLoading, isError, isAccessDenied } = useWidgetData<
43
- DashboardCoreConfigOverviewData,
44
- LocaleConfigWidgetData
45
- >({
46
- endpoint: '/dashboard-core/config/overview',
47
- queryKey: 'dashboard-core-config-overview',
48
- select: (d) => d.localeConfig,
49
- });
50
-
51
- const localeData = data ?? defaultLocaleConfigData;
52
- const enabledLocales = localeData.locales.filter((locale) => locale.enabled);
53
-
54
- return (
55
- <WidgetWrapper
56
- isLoading={isLoading}
57
- isError={isError}
58
- isAccessDenied={isAccessDenied}
59
- widgetName={widget?.name ?? t('title')}
60
- onRemove={onRemove}
61
- >
62
- <Card className="flex h-full min-h-0 flex-col overflow-hidden">
63
- <CardHeader className="shrink-0">
64
- <div className="flex items-center justify-between gap-3">
65
- <div className="flex items-center gap-3">
66
- <div className="flex h-10 w-10 items-center justify-center rounded-lg bg-indigo-50">
67
- <Globe className="h-5 w-5 text-indigo-600" />
68
- </div>
69
- <div>
70
- <CardTitle className="text-base">{t('title')}</CardTitle>
71
- <CardDescription>{t('description')}</CardDescription>
72
- </div>
73
- </div>
74
- <Badge
75
- variant="secondary"
76
- className={
77
- localeData.status.isConfigured
78
- ? 'bg-emerald-50 text-emerald-700'
79
- : 'bg-amber-50 text-amber-700'
80
- }
81
- >
82
- {localeData.status.isConfigured ? t('configured') : t('pending')}
83
- </Badge>
84
- </div>
85
- </CardHeader>
86
- <CardContent className="flex min-h-0 flex-1 flex-col gap-4 overflow-hidden pt-0">
87
- <div className="grid grid-cols-3 gap-2">
88
- <div className="rounded-lg border bg-muted/30 p-3 text-center">
89
- <p className="text-[11px] text-muted-foreground">
90
- {t('enabled')}
91
- </p>
92
- <p className="mt-1 text-lg font-semibold">
93
- {localeData.status.enabledLocaleCount}
94
- </p>
95
- </div>
96
- <div className="rounded-lg border bg-muted/30 p-3 text-center">
97
- <p className="text-[11px] text-muted-foreground">
98
- {t('disabled')}
99
- </p>
100
- <p className="mt-1 text-lg font-semibold">
101
- {localeData.status.disabledLocaleCount}
102
- </p>
103
- </div>
104
- <div className="rounded-lg border bg-muted/30 p-3 text-center">
105
- <p className="text-[11px] text-muted-foreground">{t('total')}</p>
106
- <p className="mt-1 text-lg font-semibold">
107
- {localeData.locales.length}
108
- </p>
109
- </div>
110
- </div>
111
-
112
- <div className="grid gap-2 sm:grid-cols-3">
113
- <div className="rounded-lg border p-3">
114
- <div className="mb-1 flex items-center gap-1.5 text-xs text-muted-foreground">
115
- <Clock className="h-3.5 w-3.5" />
116
- {t('timezone')}
117
- </div>
118
- <p className="truncate font-mono text-xs">
119
- {localeData.settings.timezone || t('notSet')}
120
- </p>
121
- </div>
122
- <div className="rounded-lg border p-3">
123
- <div className="mb-1 flex items-center gap-1.5 text-xs text-muted-foreground">
124
- <Calendar className="h-3.5 w-3.5" />
125
- {t('dateFormat')}
126
- </div>
127
- <p className="font-mono text-xs">
128
- {localeData.settings.dateFormat || t('notSet')}
129
- </p>
130
- </div>
131
- <div className="rounded-lg border p-3">
132
- <div className="mb-1 flex items-center gap-1.5 text-xs text-muted-foreground">
133
- <Clock className="h-3.5 w-3.5" />
134
- {t('timeFormat')}
135
- </div>
136
- <p className="font-mono text-xs">
137
- {localeData.settings.timeFormat || t('notSet')}
138
- </p>
139
- </div>
140
- </div>
141
-
142
- <div className="min-h-0 flex-1 rounded-lg border p-3">
143
- <div className="mb-2 flex items-center gap-2 text-xs text-muted-foreground">
144
- <Languages className="h-3.5 w-3.5" />
145
- <span>{t('enabledLocales')}</span>
146
- </div>
147
- <div className="flex flex-wrap gap-1.5">
148
- {enabledLocales.length > 0 ? (
149
- enabledLocales.map((locale) => (
150
- <Badge key={locale.id} variant="outline" className="gap-1">
151
- <span className="font-mono text-[10px]">{locale.code}</span>
152
- <span className="text-[10px] text-muted-foreground">
153
- {locale.name}
154
- </span>
155
- </Badge>
156
- ))
157
- ) : (
158
- <span className="text-xs text-muted-foreground">
159
- {t('noneEnabled')}
160
- </span>
161
- )}
162
- </div>
163
- </div>
164
- </CardContent>
165
- </Card>
166
- </WidgetWrapper>
167
- );
168
- }
@@ -1,115 +0,0 @@
1
- 'use client';
2
-
3
- import {
4
- Card,
5
- CardContent,
6
- CardDescription,
7
- CardHeader,
8
- CardTitle,
9
- } from '@/components/ui/card';
10
- import {
11
- ChartContainer,
12
- ChartTooltip,
13
- ChartTooltipContent,
14
- } from '@/components/ui/chart';
15
- import { useWidgetData } from '@/hooks/use-widget-data';
16
- import type { AllWidgetsData, LoginDay } from '@/types/widget-data';
17
- import { LogIn } from 'lucide-react';
18
- import { useTranslations } from 'next-intl';
19
- import { Bar, BarChart, CartesianGrid, XAxis, YAxis } from 'recharts';
20
- import { WidgetWrapper } from '../widget-wrapper';
21
-
22
- function LoginChart({ data }: { data: LoginDay[] }) {
23
- const t = useTranslations('core.DashboardPage.loginHistory');
24
-
25
- const chartConfig = {
26
- logins: { label: t('logins'), color: 'hsl(221, 83%, 53%)' },
27
- failed: { label: t('failed'), color: 'hsl(0, 84%, 60%)' },
28
- };
29
-
30
- return (
31
- <Card className="flex h-full min-h-0 flex-col overflow-hidden">
32
- <CardHeader className="shrink-0 pb-2">
33
- <div className="flex items-center gap-2">
34
- <LogIn className="h-4 w-4 text-blue-600 sm:h-5 sm:w-5" />
35
- <div>
36
- <CardTitle className="text-sm font-semibold sm:text-base">
37
- {t('title')}
38
- </CardTitle>
39
- <CardDescription className="text-xs sm:text-sm">
40
- {t('description')}
41
- </CardDescription>
42
- </div>
43
- </div>
44
- </CardHeader>
45
- <CardContent className="flex min-h-0 flex-1 flex-col overflow-hidden pt-0">
46
- <ChartContainer
47
- config={chartConfig}
48
- className="h-full min-h-[140px] w-full flex-1 overflow-hidden sm:min-h-40"
49
- >
50
- <BarChart data={data as any} barGap={2}>
51
- <CartesianGrid vertical={false} strokeDasharray="3 3" />
52
- <XAxis
53
- dataKey="day"
54
- tickLine={false}
55
- axisLine={false}
56
- fontSize={10}
57
- tickMargin={4}
58
- minTickGap={20}
59
- interval="preserveStartEnd"
60
- />
61
- <YAxis
62
- tickLine={false}
63
- axisLine={false}
64
- fontSize={10}
65
- tickMargin={4}
66
- allowDecimals={false}
67
- />
68
- <ChartTooltip content={<ChartTooltipContent />} />
69
- <Bar
70
- dataKey="logins"
71
- fill="hsl(221, 83%, 53%)"
72
- radius={[4, 4, 0, 0]}
73
- />
74
- <Bar
75
- dataKey="failed"
76
- fill="hsl(0, 84%, 60%)"
77
- radius={[4, 4, 0, 0]}
78
- />
79
- </BarChart>
80
- </ChartContainer>
81
- </CardContent>
82
- </Card>
83
- );
84
- }
85
-
86
- interface LoginHistoryChartProps {
87
- widget?: { name?: string };
88
- onRemove?: () => void;
89
- }
90
-
91
- export default function LoginHistoryChart({
92
- widget,
93
- onRemove,
94
- }: LoginHistoryChartProps) {
95
- const { data, isLoading, isError, isAccessDenied } = useWidgetData<
96
- AllWidgetsData,
97
- LoginDay[]
98
- >({
99
- endpoint: '/dashboard-core/widgets/me',
100
- queryKey: 'widget-me',
101
- select: (d) => d.loginHistory,
102
- });
103
-
104
- return (
105
- <WidgetWrapper
106
- isLoading={isLoading}
107
- isError={isError}
108
- isAccessDenied={isAccessDenied}
109
- widgetName={widget?.name ?? 'login-history-chart'}
110
- onRemove={onRemove}
111
- >
112
- {data && <LoginChart data={data} />}
113
- </WidgetWrapper>
114
- );
115
- }