@pattern-stack/frontend-patterns 0.0.4 → 0.0.5

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 (283) hide show
  1. package/dist/frontend-patterns.css +1 -1
  2. package/dist/index.es.js +1917 -2
  3. package/dist/index.es.js.map +1 -1
  4. package/dist/index.js +1916 -1
  5. package/dist/index.js.map +1 -1
  6. package/package.json +6 -3
  7. package/src/App.tsx +11 -1
  8. package/src/atoms/composed/SalesPanel/SalesPanel.tsx +116 -0
  9. package/src/atoms/composed/SalesPanel/index.ts +1 -0
  10. package/src/atoms/composed/SalesPanel/mockSalesData.ts +151 -0
  11. package/src/atoms/composed/index.ts +1 -0
  12. package/src/atoms/types/entity-config.ts +127 -0
  13. package/src/atoms/types/index.ts +2 -1
  14. package/src/atoms/utils/metric-engine.ts +236 -0
  15. package/src/atoms/utils/utils.ts +2 -1
  16. package/src/molecules/layout/DashboardWithSidePanel/DashboardWithSidePanel.tsx +42 -0
  17. package/src/molecules/layout/DashboardWithSidePanel/index.ts +1 -0
  18. package/src/molecules/layout/Sidebar.tsx +10 -2
  19. package/src/molecules/layout/index.ts +1 -0
  20. package/src/organisms/entity/CategoryBreakdownPanel.tsx +427 -0
  21. package/src/organisms/entity/EntityListPanel.tsx +339 -0
  22. package/src/organisms/entity/MetricsOverviewPanel.tsx +236 -0
  23. package/src/organisms/entity/TrendAnalysisPanel.tsx +337 -0
  24. package/src/organisms/entity/index.ts +4 -0
  25. package/src/organisms/index.ts +4 -1
  26. package/src/pages/AdminShowcase/AdminDashboardShowcase.tsx +77 -75
  27. package/src/pages/AdminShowcase/SalesPerformanceDashboard.tsx +158 -0
  28. package/src/pages/AdminShowcase/index.tsx +2 -1
  29. package/src/pages/EntityShowcase/EntityManagementShowcase.tsx +137 -0
  30. package/src/pages/EntityShowcase/EntityPerformanceShowcase.tsx +117 -0
  31. package/src/pages/EntityShowcase/index.ts +2 -0
  32. package/src/pages/EntityTemplateExample.tsx +229 -0
  33. package/src/pages/TestEntityTemplate.tsx +40 -0
  34. package/src/pages/index.ts +2 -1
  35. package/src/templates/entity/EntityManagementTemplate.tsx +430 -0
  36. package/src/templates/entity/EntityPerformanceDashboardTemplate.tsx +277 -0
  37. package/src/templates/entity/configs/financial-config.ts +141 -0
  38. package/src/templates/entity/configs/index.ts +1 -0
  39. package/src/templates/entity/index.ts +3 -0
  40. package/src/templates/financial/FinancialDashboardTemplate.tsx +326 -0
  41. package/src/templates/index.ts +3 -0
  42. package/dist/atoms/composed/Accordion/Accordion.d.ts +0 -20
  43. package/dist/atoms/composed/Accordion/Accordion.d.ts.map +0 -1
  44. package/dist/atoms/composed/Accordion/index.d.ts +0 -2
  45. package/dist/atoms/composed/Accordion/index.d.ts.map +0 -1
  46. package/dist/atoms/composed/Alert/Alert.d.ts +0 -25
  47. package/dist/atoms/composed/Alert/Alert.d.ts.map +0 -1
  48. package/dist/atoms/composed/Alert/index.d.ts +0 -2
  49. package/dist/atoms/composed/Alert/index.d.ts.map +0 -1
  50. package/dist/atoms/composed/Breadcrumb/Breadcrumb.d.ts +0 -17
  51. package/dist/atoms/composed/Breadcrumb/Breadcrumb.d.ts.map +0 -1
  52. package/dist/atoms/composed/Breadcrumb/index.d.ts +0 -2
  53. package/dist/atoms/composed/Breadcrumb/index.d.ts.map +0 -1
  54. package/dist/atoms/composed/Chart/Chart.d.ts +0 -37
  55. package/dist/atoms/composed/Chart/Chart.d.ts.map +0 -1
  56. package/dist/atoms/composed/Chart/index.d.ts +0 -3
  57. package/dist/atoms/composed/Chart/index.d.ts.map +0 -1
  58. package/dist/atoms/composed/ColorSwatch/ColorSwatch.d.ts +0 -19
  59. package/dist/atoms/composed/ColorSwatch/ColorSwatch.d.ts.map +0 -1
  60. package/dist/atoms/composed/ColorSwatch/index.d.ts +0 -2
  61. package/dist/atoms/composed/ColorSwatch/index.d.ts.map +0 -1
  62. package/dist/atoms/composed/DarkModeToggle.d.ts +0 -4
  63. package/dist/atoms/composed/DarkModeToggle.d.ts.map +0 -1
  64. package/dist/atoms/composed/DataBadge/DataBadge.d.ts +0 -13
  65. package/dist/atoms/composed/DataBadge/DataBadge.d.ts.map +0 -1
  66. package/dist/atoms/composed/DataBadge/index.d.ts +0 -2
  67. package/dist/atoms/composed/DataBadge/index.d.ts.map +0 -1
  68. package/dist/atoms/composed/DataTable/DataTable.d.ts +0 -28
  69. package/dist/atoms/composed/DataTable/DataTable.d.ts.map +0 -1
  70. package/dist/atoms/composed/DataTable/TableCellWithTooltip.d.ts +0 -10
  71. package/dist/atoms/composed/DataTable/TableCellWithTooltip.d.ts.map +0 -1
  72. package/dist/atoms/composed/DataTable/index.d.ts +0 -3
  73. package/dist/atoms/composed/DataTable/index.d.ts.map +0 -1
  74. package/dist/atoms/composed/DateTimePicker/DateTimePicker.d.ts +0 -45
  75. package/dist/atoms/composed/DateTimePicker/DateTimePicker.d.ts.map +0 -1
  76. package/dist/atoms/composed/DateTimePicker/index.d.ts +0 -3
  77. package/dist/atoms/composed/DateTimePicker/index.d.ts.map +0 -1
  78. package/dist/atoms/composed/DetailedCard/DetailedCard.d.ts +0 -30
  79. package/dist/atoms/composed/DetailedCard/DetailedCard.d.ts.map +0 -1
  80. package/dist/atoms/composed/DetailedCard/index.d.ts +0 -3
  81. package/dist/atoms/composed/DetailedCard/index.d.ts.map +0 -1
  82. package/dist/atoms/composed/EmptyState/EmptyState.d.ts +0 -18
  83. package/dist/atoms/composed/EmptyState/EmptyState.d.ts.map +0 -1
  84. package/dist/atoms/composed/EmptyState/index.d.ts +0 -2
  85. package/dist/atoms/composed/EmptyState/index.d.ts.map +0 -1
  86. package/dist/atoms/composed/FileUpload/FileUpload.d.ts +0 -46
  87. package/dist/atoms/composed/FileUpload/FileUpload.d.ts.map +0 -1
  88. package/dist/atoms/composed/FileUpload/index.d.ts +0 -3
  89. package/dist/atoms/composed/FileUpload/index.d.ts.map +0 -1
  90. package/dist/atoms/composed/FormField/FormField.d.ts +0 -23
  91. package/dist/atoms/composed/FormField/FormField.d.ts.map +0 -1
  92. package/dist/atoms/composed/FormField/index.d.ts +0 -2
  93. package/dist/atoms/composed/FormField/index.d.ts.map +0 -1
  94. package/dist/atoms/composed/GlobalSearch/GlobalSearch.d.ts +0 -8
  95. package/dist/atoms/composed/GlobalSearch/GlobalSearch.d.ts.map +0 -1
  96. package/dist/atoms/composed/GlobalSearch/index.d.ts +0 -2
  97. package/dist/atoms/composed/GlobalSearch/index.d.ts.map +0 -1
  98. package/dist/atoms/composed/IconBadge/IconBadge.d.ts +0 -16
  99. package/dist/atoms/composed/IconBadge/IconBadge.d.ts.map +0 -1
  100. package/dist/atoms/composed/IconBadge/index.d.ts +0 -3
  101. package/dist/atoms/composed/IconBadge/index.d.ts.map +0 -1
  102. package/dist/atoms/composed/Modal/Modal.d.ts +0 -18
  103. package/dist/atoms/composed/Modal/Modal.d.ts.map +0 -1
  104. package/dist/atoms/composed/Modal/index.d.ts +0 -3
  105. package/dist/atoms/composed/Modal/index.d.ts.map +0 -1
  106. package/dist/atoms/composed/PaletteSwitcher.d.ts +0 -7
  107. package/dist/atoms/composed/PaletteSwitcher.d.ts.map +0 -1
  108. package/dist/atoms/composed/ProgressBar/ProgressBar.d.ts +0 -25
  109. package/dist/atoms/composed/ProgressBar/ProgressBar.d.ts.map +0 -1
  110. package/dist/atoms/composed/ProgressBar/index.d.ts +0 -2
  111. package/dist/atoms/composed/ProgressBar/index.d.ts.map +0 -1
  112. package/dist/atoms/composed/StatCard/StatCard.d.ts +0 -21
  113. package/dist/atoms/composed/StatCard/StatCard.d.ts.map +0 -1
  114. package/dist/atoms/composed/StatCard/index.d.ts +0 -2
  115. package/dist/atoms/composed/StatCard/index.d.ts.map +0 -1
  116. package/dist/atoms/composed/StyleGuide.d.ts +0 -3
  117. package/dist/atoms/composed/StyleGuide.d.ts.map +0 -1
  118. package/dist/atoms/composed/Toast/Toast.d.ts +0 -40
  119. package/dist/atoms/composed/Toast/Toast.d.ts.map +0 -1
  120. package/dist/atoms/composed/Toast/index.d.ts +0 -2
  121. package/dist/atoms/composed/Toast/index.d.ts.map +0 -1
  122. package/dist/atoms/composed/Tooltip/Tooltip.d.ts +0 -16
  123. package/dist/atoms/composed/Tooltip/Tooltip.d.ts.map +0 -1
  124. package/dist/atoms/composed/Tooltip/index.d.ts +0 -2
  125. package/dist/atoms/composed/Tooltip/index.d.ts.map +0 -1
  126. package/dist/atoms/composed/UserAvatar/UserAvatar.d.ts +0 -8
  127. package/dist/atoms/composed/UserAvatar/UserAvatar.d.ts.map +0 -1
  128. package/dist/atoms/composed/UserAvatar/index.d.ts +0 -2
  129. package/dist/atoms/composed/UserAvatar/index.d.ts.map +0 -1
  130. package/dist/atoms/composed/UserMenu/UserMenu.d.ts +0 -8
  131. package/dist/atoms/composed/UserMenu/UserMenu.d.ts.map +0 -1
  132. package/dist/atoms/composed/UserMenu/index.d.ts +0 -2
  133. package/dist/atoms/composed/UserMenu/index.d.ts.map +0 -1
  134. package/dist/atoms/composed/index.d.ts +0 -25
  135. package/dist/atoms/composed/index.d.ts.map +0 -1
  136. package/dist/atoms/hooks/useApi.d.ts +0 -25
  137. package/dist/atoms/hooks/useApi.d.ts.map +0 -1
  138. package/dist/atoms/hooks/useHealth.d.ts +0 -19
  139. package/dist/atoms/hooks/useHealth.d.ts.map +0 -1
  140. package/dist/atoms/index.d.ts +0 -9
  141. package/dist/atoms/index.d.ts.map +0 -1
  142. package/dist/atoms/services/api/client.d.ts +0 -20
  143. package/dist/atoms/services/api/client.d.ts.map +0 -1
  144. package/dist/atoms/services/auth-service.d.ts +0 -24
  145. package/dist/atoms/services/auth-service.d.ts.map +0 -1
  146. package/dist/atoms/services/health.d.ts +0 -7
  147. package/dist/atoms/services/health.d.ts.map +0 -1
  148. package/dist/atoms/services/index.d.ts +0 -4
  149. package/dist/atoms/services/index.d.ts.map +0 -1
  150. package/dist/atoms/shared/config/constants.d.ts +0 -15
  151. package/dist/atoms/shared/config/constants.d.ts.map +0 -1
  152. package/dist/atoms/shared/config/dashboard-sizes.d.ts +0 -83
  153. package/dist/atoms/shared/config/dashboard-sizes.d.ts.map +0 -1
  154. package/dist/atoms/shared/config/environment.d.ts +0 -10
  155. package/dist/atoms/shared/config/environment.d.ts.map +0 -1
  156. package/dist/atoms/shared/index.d.ts +0 -4
  157. package/dist/atoms/shared/index.d.ts.map +0 -1
  158. package/dist/atoms/types/auth.d.ts +0 -56
  159. package/dist/atoms/types/auth.d.ts.map +0 -1
  160. package/dist/atoms/types/generated.d.ts +0 -1469
  161. package/dist/atoms/types/generated.d.ts.map +0 -1
  162. package/dist/atoms/types/index.d.ts +0 -4
  163. package/dist/atoms/types/index.d.ts.map +0 -1
  164. package/dist/atoms/types/loading.d.ts +0 -26
  165. package/dist/atoms/types/loading.d.ts.map +0 -1
  166. package/dist/atoms/ui/Badge.d.ts +0 -10
  167. package/dist/atoms/ui/Badge.d.ts.map +0 -1
  168. package/dist/atoms/ui/ErrorBoundary.d.ts +0 -18
  169. package/dist/atoms/ui/ErrorBoundary.d.ts.map +0 -1
  170. package/dist/atoms/ui/Select.d.ts +0 -28
  171. package/dist/atoms/ui/Select.d.ts.map +0 -1
  172. package/dist/atoms/ui/Switch.d.ts +0 -9
  173. package/dist/atoms/ui/Switch.d.ts.map +0 -1
  174. package/dist/atoms/ui/Tabs.d.ts +0 -30
  175. package/dist/atoms/ui/Tabs.d.ts.map +0 -1
  176. package/dist/atoms/ui/avatar.d.ts +0 -7
  177. package/dist/atoms/ui/avatar.d.ts.map +0 -1
  178. package/dist/atoms/ui/button.d.ts +0 -14
  179. package/dist/atoms/ui/button.d.ts.map +0 -1
  180. package/dist/atoms/ui/card.d.ts +0 -12
  181. package/dist/atoms/ui/card.d.ts.map +0 -1
  182. package/dist/atoms/ui/dropdown-menu.d.ts +0 -28
  183. package/dist/atoms/ui/dropdown-menu.d.ts.map +0 -1
  184. package/dist/atoms/ui/index.d.ts +0 -15
  185. package/dist/atoms/ui/index.d.ts.map +0 -1
  186. package/dist/atoms/ui/input.d.ts +0 -5
  187. package/dist/atoms/ui/input.d.ts.map +0 -1
  188. package/dist/atoms/ui/label.d.ts +0 -6
  189. package/dist/atoms/ui/label.d.ts.map +0 -1
  190. package/dist/atoms/ui/skeleton.d.ts +0 -3
  191. package/dist/atoms/ui/skeleton.d.ts.map +0 -1
  192. package/dist/atoms/ui/spinner.d.ts +0 -14
  193. package/dist/atoms/ui/spinner.d.ts.map +0 -1
  194. package/dist/atoms/ui/table.d.ts +0 -11
  195. package/dist/atoms/ui/table.d.ts.map +0 -1
  196. package/dist/atoms/utils/animations.d.ts +0 -65
  197. package/dist/atoms/utils/animations.d.ts.map +0 -1
  198. package/dist/atoms/utils/tooltip-helpers.d.ts +0 -71
  199. package/dist/atoms/utils/tooltip-helpers.d.ts.map +0 -1
  200. package/dist/atoms/utils/utils.d.ts +0 -4
  201. package/dist/atoms/utils/utils.d.ts.map +0 -1
  202. package/dist/features/auth/components/LoginForm.d.ts +0 -2
  203. package/dist/features/auth/components/LoginForm.d.ts.map +0 -1
  204. package/dist/features/auth/components/LogoutButton.d.ts +0 -2
  205. package/dist/features/auth/components/LogoutButton.d.ts.map +0 -1
  206. package/dist/features/auth/components/ProtectedRoute.d.ts +0 -10
  207. package/dist/features/auth/components/ProtectedRoute.d.ts.map +0 -1
  208. package/dist/features/auth/components/index.d.ts +0 -4
  209. package/dist/features/auth/components/index.d.ts.map +0 -1
  210. package/dist/features/auth/hooks/index.d.ts +0 -3
  211. package/dist/features/auth/hooks/index.d.ts.map +0 -1
  212. package/dist/features/auth/hooks/useAuth.d.ts +0 -10
  213. package/dist/features/auth/hooks/useAuth.d.ts.map +0 -1
  214. package/dist/features/auth/hooks/usePermissions.d.ts +0 -13
  215. package/dist/features/auth/hooks/usePermissions.d.ts.map +0 -1
  216. package/dist/features/auth/index.d.ts +0 -3
  217. package/dist/features/auth/index.d.ts.map +0 -1
  218. package/dist/features/index.d.ts +0 -2
  219. package/dist/features/index.d.ts.map +0 -1
  220. package/dist/index.d.ts +0 -10
  221. package/dist/index.d.ts.map +0 -1
  222. package/dist/molecules/forms/FormGroup.d.ts +0 -17
  223. package/dist/molecules/forms/FormGroup.d.ts.map +0 -1
  224. package/dist/molecules/forms/SearchInput.d.ts +0 -36
  225. package/dist/molecules/forms/SearchInput.d.ts.map +0 -1
  226. package/dist/molecules/forms/index.d.ts +0 -3
  227. package/dist/molecules/forms/index.d.ts.map +0 -1
  228. package/dist/molecules/index.d.ts +0 -4
  229. package/dist/molecules/index.d.ts.map +0 -1
  230. package/dist/molecules/layout/AppHeader/AppHeader.d.ts +0 -7
  231. package/dist/molecules/layout/AppHeader/AppHeader.d.ts.map +0 -1
  232. package/dist/molecules/layout/AppHeader/index.d.ts +0 -2
  233. package/dist/molecules/layout/AppHeader/index.d.ts.map +0 -1
  234. package/dist/molecules/layout/AppLayout.d.ts +0 -2
  235. package/dist/molecules/layout/AppLayout.d.ts.map +0 -1
  236. package/dist/molecules/layout/PageTemplate.d.ts +0 -19
  237. package/dist/molecules/layout/PageTemplate.d.ts.map +0 -1
  238. package/dist/molecules/layout/SectionHeader/SectionHeader.d.ts +0 -24
  239. package/dist/molecules/layout/SectionHeader/SectionHeader.d.ts.map +0 -1
  240. package/dist/molecules/layout/SectionHeader/index.d.ts +0 -2
  241. package/dist/molecules/layout/SectionHeader/index.d.ts.map +0 -1
  242. package/dist/molecules/layout/ShowcaseSection.d.ts +0 -22
  243. package/dist/molecules/layout/ShowcaseSection.d.ts.map +0 -1
  244. package/dist/molecules/layout/Sidebar.d.ts +0 -6
  245. package/dist/molecules/layout/Sidebar.d.ts.map +0 -1
  246. package/dist/molecules/layout/SidebarButton/SidebarButton.d.ts +0 -13
  247. package/dist/molecules/layout/SidebarButton/SidebarButton.d.ts.map +0 -1
  248. package/dist/molecules/layout/SidebarButton/index.d.ts +0 -2
  249. package/dist/molecules/layout/SidebarButton/index.d.ts.map +0 -1
  250. package/dist/molecules/layout/SidebarContext.d.ts +0 -12
  251. package/dist/molecules/layout/SidebarContext.d.ts.map +0 -1
  252. package/dist/molecules/layout/index.d.ts +0 -8
  253. package/dist/molecules/layout/index.d.ts.map +0 -1
  254. package/dist/molecules/navigation/NavMenu.d.ts +0 -20
  255. package/dist/molecules/navigation/NavMenu.d.ts.map +0 -1
  256. package/dist/molecules/navigation/Pagination.d.ts +0 -14
  257. package/dist/molecules/navigation/Pagination.d.ts.map +0 -1
  258. package/dist/molecules/navigation/index.d.ts +0 -3
  259. package/dist/molecules/navigation/index.d.ts.map +0 -1
  260. package/dist/organisms/index.d.ts +0 -2
  261. package/dist/organisms/index.d.ts.map +0 -1
  262. package/dist/organisms/showcase/ComponentShowcasePage.d.ts +0 -3
  263. package/dist/organisms/showcase/ComponentShowcasePage.d.ts.map +0 -1
  264. package/dist/templates/AuthTemplate.d.ts +0 -68
  265. package/dist/templates/AuthTemplate.d.ts.map +0 -1
  266. package/dist/templates/ComponentShowcaseTemplate.d.ts +0 -53
  267. package/dist/templates/ComponentShowcaseTemplate.d.ts.map +0 -1
  268. package/dist/templates/DashboardTemplate.d.ts +0 -62
  269. package/dist/templates/DashboardTemplate.d.ts.map +0 -1
  270. package/dist/templates/DataTemplate.d.ts +0 -78
  271. package/dist/templates/DataTemplate.d.ts.map +0 -1
  272. package/dist/templates/admin/AdminCRUDTemplate.d.ts +0 -105
  273. package/dist/templates/admin/AdminCRUDTemplate.d.ts.map +0 -1
  274. package/dist/templates/admin/AdminDashboardTemplate.d.ts +0 -89
  275. package/dist/templates/admin/AdminDashboardTemplate.d.ts.map +0 -1
  276. package/dist/templates/admin/AdminDetailTemplate.d.ts +0 -132
  277. package/dist/templates/admin/AdminDetailTemplate.d.ts.map +0 -1
  278. package/dist/templates/admin/index.d.ts +0 -4
  279. package/dist/templates/admin/index.d.ts.map +0 -1
  280. package/dist/templates/factory.d.ts +0 -28
  281. package/dist/templates/factory.d.ts.map +0 -1
  282. package/dist/templates/index.d.ts +0 -7
  283. package/dist/templates/index.d.ts.map +0 -1
@@ -0,0 +1,277 @@
1
+ import React from 'react';
2
+ import { AppLayout } from '../../molecules/layout/AppLayout';
3
+ import { PageTemplate } from '../../molecules/layout/PageTemplate';
4
+ import { SectionHeader } from '../../molecules/layout/SectionHeader';
5
+ import {
6
+ MetricsOverviewPanel,
7
+ MetricsOverviewWithInsightsPanel,
8
+ TrendAnalysisPanel,
9
+ CategoryBreakdownPanel
10
+ } from '../../organisms/entity';
11
+ import type { EntityTemplateConfig, EntityData, MetricValue, ActionConfig, MetricConfig } from '../../atoms/types';
12
+ import { cn } from '../../atoms/utils/utils';
13
+
14
+ export interface EntityPerformanceDashboardTemplateProps<T extends EntityData> {
15
+ config: EntityTemplateConfig<T>;
16
+ data: T[];
17
+ previousData?: T[];
18
+ isLoading?: boolean;
19
+ className?: string;
20
+
21
+ // Layout configuration
22
+ layout?: 'standard' | 'compact' | 'detailed';
23
+ showInsights?: boolean;
24
+ showTrends?: boolean;
25
+ showCategories?: boolean;
26
+
27
+ // Extension points - Render Props
28
+ renderCustomActions?: () => React.ReactNode;
29
+ renderAdditionalMetrics?: () => React.ReactNode;
30
+ renderCustomTrendChart?: (config: EntityTemplateConfig<T>, data: T[]) => React.ReactNode;
31
+ renderCustomCategoryView?: (config: EntityTemplateConfig<T>, data: T[]) => React.ReactNode;
32
+
33
+ // Extension points - Slots
34
+ headerSlot?: React.ReactNode;
35
+ footerSlot?: React.ReactNode;
36
+ metricsHeaderSlot?: React.ReactNode;
37
+ metricsFooterSlot?: React.ReactNode;
38
+ trendsHeaderSlot?: React.ReactNode;
39
+ trendsFooterSlot?: React.ReactNode;
40
+ categoriesHeaderSlot?: React.ReactNode;
41
+ categoriesFooterSlot?: React.ReactNode;
42
+
43
+ // Event handlers
44
+ onMetricClick?: (metric: MetricConfig, value: MetricValue) => void;
45
+ onCategoryClick?: (category: unknown) => void;
46
+ onTrendPeriodChange?: (period: string) => void;
47
+ onActionClick?: (action: ActionConfig, context: T[]) => void;
48
+ onRefresh?: () => void;
49
+ onExport?: (type: 'metrics' | 'trends' | 'categories', data: unknown) => void;
50
+ }
51
+
52
+ export const EntityPerformanceDashboardTemplate = <T extends EntityData>({
53
+ config,
54
+ data,
55
+ previousData,
56
+ isLoading = false,
57
+ className,
58
+ layout = 'standard',
59
+ showInsights = true,
60
+ showTrends = true,
61
+ showCategories = true,
62
+ renderCustomActions,
63
+ renderAdditionalMetrics,
64
+ renderCustomTrendChart,
65
+ renderCustomCategoryView,
66
+ headerSlot,
67
+ footerSlot,
68
+ metricsHeaderSlot,
69
+ metricsFooterSlot,
70
+ trendsHeaderSlot,
71
+ trendsFooterSlot,
72
+ categoriesHeaderSlot,
73
+ categoriesFooterSlot,
74
+ onMetricClick,
75
+ onCategoryClick,
76
+ onTrendPeriodChange,
77
+ onExport
78
+ }: EntityPerformanceDashboardTemplateProps<T>) => {
79
+
80
+ const getLayoutClasses = () => {
81
+ switch (layout) {
82
+ case 'compact':
83
+ return 'space-y-4';
84
+ case 'detailed':
85
+ return 'space-y-8';
86
+ case 'standard':
87
+ default:
88
+ return 'space-y-6';
89
+ }
90
+ };
91
+
92
+ const renderPageHeader = () => {
93
+ return (
94
+ <SectionHeader
95
+ title={config.display.title}
96
+ description={config.display.description}
97
+ category={config.display.category}
98
+ actions={renderCustomActions ? renderCustomActions() : undefined}
99
+ />
100
+ );
101
+ };
102
+
103
+ const renderMetricsSection = () => {
104
+ if (!config.metrics.length) return null;
105
+
106
+ const MetricsComponent = showInsights ? MetricsOverviewWithInsightsPanel : MetricsOverviewPanel;
107
+
108
+ return (
109
+ <section className="space-y-4">
110
+ {metricsHeaderSlot}
111
+ <MetricsComponent
112
+ metrics={config.metrics}
113
+ data={data}
114
+ previousData={previousData}
115
+ isLoading={isLoading}
116
+ onMetricClick={onMetricClick}
117
+ category={config.display.category}
118
+ columns={layout === 'compact' ? 2 : layout === 'detailed' ? 4 : 3}
119
+ headerSlot={renderAdditionalMetrics ? renderAdditionalMetrics() : undefined}
120
+ />
121
+ {metricsFooterSlot}
122
+ </section>
123
+ );
124
+ };
125
+
126
+ const renderTrendsSection = () => {
127
+ if (!showTrends || !config.temporal || !config.metrics.length) return null;
128
+
129
+ if (renderCustomTrendChart) {
130
+ const customChart = renderCustomTrendChart(config, data);
131
+ if (customChart) {
132
+ return (
133
+ <section className="space-y-4">
134
+ {trendsHeaderSlot}
135
+ {customChart}
136
+ {trendsFooterSlot}
137
+ </section>
138
+ );
139
+ }
140
+ }
141
+
142
+ return (
143
+ <section className="space-y-4">
144
+ {trendsHeaderSlot}
145
+ <TrendAnalysisPanel
146
+ metrics={config.metrics}
147
+ data={data}
148
+ temporal={config.temporal}
149
+ isLoading={isLoading}
150
+ category={config.display.category}
151
+ enablePeriodSelection={true}
152
+ enableChartTypeSelection={layout === 'detailed'}
153
+ showComparisons={layout !== 'compact'}
154
+ onPeriodChange={onTrendPeriodChange}
155
+ onExport={(chartData, metric) => onExport?.('trends', { chartData, metric })}
156
+ />
157
+ {trendsFooterSlot}
158
+ </section>
159
+ );
160
+ };
161
+
162
+ const renderCategoriesSection = () => {
163
+ if (!showCategories || !config.categories || !data.length) return null;
164
+
165
+ // Find a suitable value field from metrics or use first numeric field
166
+ const valueField = config.metrics.find(m => m.type === 'currency' || m.type === 'count')?.key ||
167
+ Object.keys(data[0]).find(key => typeof data[0][key] === 'number') ||
168
+ 'value';
169
+
170
+ if (renderCustomCategoryView) {
171
+ const customView = renderCustomCategoryView(config, data);
172
+ if (customView) {
173
+ return (
174
+ <section className="space-y-4">
175
+ {categoriesHeaderSlot}
176
+ {customView}
177
+ {categoriesFooterSlot}
178
+ </section>
179
+ );
180
+ }
181
+ }
182
+
183
+ return (
184
+ <section className="space-y-4">
185
+ {categoriesHeaderSlot}
186
+ <CategoryBreakdownPanel
187
+ data={data}
188
+ categoryConfig={config.categories}
189
+ valueField={valueField}
190
+ isLoading={isLoading}
191
+ category={config.display.category}
192
+ title={`${config.display.title} by ${config.categories.defaultGroupBy}`}
193
+ defaultView={layout === 'compact' ? 'list' : 'both'}
194
+ enableDrillDown={config.categories.enableDrillDown}
195
+ onCategoryClick={onCategoryClick}
196
+ onExport={(categoryData) => onExport?.('categories', categoryData)}
197
+ />
198
+ {categoriesFooterSlot}
199
+ </section>
200
+ );
201
+ };
202
+
203
+ const renderLayoutContent = () => {
204
+ const sections = [
205
+ renderMetricsSection(),
206
+ renderTrendsSection(),
207
+ renderCategoriesSection()
208
+ ].filter(Boolean);
209
+
210
+ if (layout === 'detailed' && sections.length > 1) {
211
+ // For detailed layout, use a grid for trends and categories
212
+ const [metricsSection, ...otherSections] = sections;
213
+
214
+ return (
215
+ <div className={getLayoutClasses()}>
216
+ {metricsSection}
217
+
218
+ {otherSections.length > 0 && (
219
+ <div className="grid grid-cols-1 lg:grid-cols-2 gap-6">
220
+ {otherSections}
221
+ </div>
222
+ )}
223
+ </div>
224
+ );
225
+ }
226
+
227
+ return (
228
+ <div className={getLayoutClasses()}>
229
+ {sections}
230
+ </div>
231
+ );
232
+ };
233
+
234
+ return (
235
+ <AppLayout>
236
+ <PageTemplate
237
+ className={cn('container mx-auto px-4 py-6', className)}
238
+ data-component-name="EntityPerformanceDashboardTemplate"
239
+ >
240
+ {headerSlot}
241
+ {renderPageHeader()}
242
+ {renderLayoutContent()}
243
+ {footerSlot}
244
+ </PageTemplate>
245
+ </AppLayout>
246
+ );
247
+ };
248
+
249
+ // Enhanced version with real-time updates
250
+ export interface EntityPerformanceDashboardTemplateWithRealTimeProps<T extends EntityData>
251
+ extends EntityPerformanceDashboardTemplateProps<T> {
252
+ enableRealTime?: boolean;
253
+ refreshInterval?: number;
254
+ onDataUpdate?: (newData: T[]) => void;
255
+ }
256
+
257
+ export const EntityPerformanceDashboardTemplateWithRealTime = <T extends EntityData>({
258
+ enableRealTime = false,
259
+ refreshInterval = 30000, // 30 seconds
260
+ onDataUpdate,
261
+ ...props
262
+ }: EntityPerformanceDashboardTemplateWithRealTimeProps<T>) => {
263
+ React.useEffect(() => {
264
+ if (!enableRealTime) return;
265
+
266
+ const interval = setInterval(() => {
267
+ if (onDataUpdate) {
268
+ // This would typically fetch new data from an API
269
+ onDataUpdate(props.data);
270
+ }
271
+ }, refreshInterval);
272
+
273
+ return () => clearInterval(interval);
274
+ }, [enableRealTime, refreshInterval, onDataUpdate, props.data]);
275
+
276
+ return <EntityPerformanceDashboardTemplate {...props} />;
277
+ };
@@ -0,0 +1,141 @@
1
+ import type { EntityTemplateConfig, EntityData } from '../../../atoms/types';
2
+ import { DollarSign, Target, TrendingUp, Wallet } from 'lucide-react';
3
+
4
+ export interface FinancialTransaction extends EntityData {
5
+ id: string;
6
+ amount: number;
7
+ category: string;
8
+ account: string;
9
+ date: string;
10
+ description: string;
11
+ type: 'income' | 'expense' | 'transfer';
12
+ status: 'completed' | 'pending' | 'failed';
13
+ }
14
+
15
+ export const financialConfig: EntityTemplateConfig<FinancialTransaction> = {
16
+ entityType: 'transactional',
17
+ display: {
18
+ title: 'Financial Dashboard',
19
+ description: 'Personal finance overview and transaction management',
20
+ category: 2 // Green theme for financial success
21
+ },
22
+ metrics: [
23
+ {
24
+ key: 'totalBalance',
25
+ label: 'Total Balance',
26
+ type: 'currency',
27
+ trend: true,
28
+ icon: DollarSign,
29
+ aggregation: 'sum'
30
+ },
31
+ {
32
+ key: 'monthlyIncome',
33
+ label: 'Monthly Income',
34
+ type: 'currency',
35
+ trend: true,
36
+ icon: TrendingUp,
37
+ aggregation: 'sum'
38
+ },
39
+ {
40
+ key: 'monthlyExpenses',
41
+ label: 'Monthly Expenses',
42
+ type: 'currency',
43
+ trend: true,
44
+ icon: Wallet,
45
+ aggregation: 'sum'
46
+ },
47
+ {
48
+ key: 'savingsRate',
49
+ label: 'Savings Rate',
50
+ type: 'percentage',
51
+ target: 20,
52
+ icon: Target
53
+ }
54
+ ],
55
+ temporal: {
56
+ cycles: ['monthly', 'quarterly', 'yearly'],
57
+ defaultCycle: 'monthly',
58
+ enableComparisons: true,
59
+ forecasting: {
60
+ enabled: true,
61
+ periods: 3,
62
+ algorithm: 'seasonal'
63
+ }
64
+ },
65
+ categories: {
66
+ hierarchy: ['account', 'category', 'type'],
67
+ defaultGroupBy: 'category',
68
+ enableDrillDown: true,
69
+ colorCoding: true
70
+ },
71
+ actions: [
72
+ {
73
+ label: 'Add Transaction',
74
+ type: 'primary',
75
+ onClick: ({ data, config }) => {
76
+ console.log('Adding new transaction', { data, config });
77
+ }
78
+ },
79
+ {
80
+ label: 'Generate Report',
81
+ type: 'secondary',
82
+ onClick: ({ selectedItems, data, config }) => {
83
+ console.log('Generating report', { selectedItems, data, config });
84
+ }
85
+ }
86
+ ]
87
+ };
88
+
89
+ // Sample financial data for testing
90
+ export const sampleFinancialData: FinancialTransaction[] = [
91
+ {
92
+ id: '1',
93
+ amount: 5000,
94
+ category: 'Salary',
95
+ account: 'Checking',
96
+ date: '2024-01-15',
97
+ description: 'Monthly salary',
98
+ type: 'income',
99
+ status: 'completed'
100
+ },
101
+ {
102
+ id: '2',
103
+ amount: -1200,
104
+ category: 'Rent',
105
+ account: 'Checking',
106
+ date: '2024-01-01',
107
+ description: 'Monthly rent payment',
108
+ type: 'expense',
109
+ status: 'completed'
110
+ },
111
+ {
112
+ id: '3',
113
+ amount: -300,
114
+ category: 'Groceries',
115
+ account: 'Checking',
116
+ date: '2024-01-10',
117
+ description: 'Weekly groceries',
118
+ type: 'expense',
119
+ status: 'completed'
120
+ },
121
+ {
122
+ id: '4',
123
+ amount: -80,
124
+ category: 'Utilities',
125
+ account: 'Checking',
126
+ date: '2024-01-05',
127
+ description: 'Electric bill',
128
+ type: 'expense',
129
+ status: 'completed'
130
+ },
131
+ {
132
+ id: '5',
133
+ amount: -45,
134
+ category: 'Entertainment',
135
+ account: 'Checking',
136
+ date: '2024-01-12',
137
+ description: 'Movie tickets',
138
+ type: 'expense',
139
+ status: 'completed'
140
+ }
141
+ ];
@@ -0,0 +1 @@
1
+ export * from './financial-config';
@@ -0,0 +1,3 @@
1
+ export * from './EntityPerformanceDashboardTemplate';
2
+ export * from './EntityManagementTemplate';
3
+ export * from './configs';