diff --git a/src/frontend/components/ErrorDataTable.tsx b/src/frontend/components/ErrorDataTable.tsx
index d543e93..ae52464 100644
--- a/src/frontend/components/ErrorDataTable.tsx
+++ b/src/frontend/components/ErrorDataTable.tsx
@@ -149,8 +149,7 @@ export function ErrorDataTable() {
}
styles={{
- header: { padding: '24px', borderBottom: '1px solid rgba(255,255,255,0.1)' },
- content: { background: 'rgba(15, 23, 42, 0.95)', backdropFilter: 'blur(12px)' }
+ header: { padding: '24px', borderBottom: '1px solid var(--mantine-color-default-border)' },
}}
>
{selectedError && (
@@ -175,11 +174,9 @@ export function ErrorDataTable() {
STACK TRACE
-
-
- {selectedError.stackTrace}
-
-
+
+ {selectedError.stackTrace}
+
diff --git a/src/frontend/components/SummaryCard.tsx b/src/frontend/components/SummaryCard.tsx
index e1238dc..fadcd1c 100644
--- a/src/frontend/components/SummaryCard.tsx
+++ b/src/frontend/components/SummaryCard.tsx
@@ -16,6 +16,8 @@ interface SummaryCardProps {
label: string
}
isError?: boolean
+ onClick?: () => void
+ children?: React.ReactNode
}
export function SummaryCard({
@@ -25,7 +27,9 @@ export function SummaryCard({
color = 'brand-blue',
trend,
progress,
- isError
+ isError,
+ onClick,
+ children
}: SummaryCardProps) {
const scheme = useComputedColorScheme('light', { getInitialValueInEffect: true })
@@ -35,6 +39,8 @@ export function SummaryCard({
padding="xl"
radius="2xl"
className="glass"
+ onClick={onClick}
+ style={{ cursor: onClick ? 'pointer' : 'default' }}
styles={(theme) => ({
root: {
backgroundColor: isError && Number(value) > 0
@@ -95,6 +101,8 @@ export function SummaryCard({
/>
)}
+
+ {children}
)
}
diff --git a/src/frontend/routes/apps.$appId.errors.tsx b/src/frontend/routes/apps.$appId.errors.tsx
index 45c4ec6..071ef1b 100644
--- a/src/frontend/routes/apps.$appId.errors.tsx
+++ b/src/frontend/routes/apps.$appId.errors.tsx
@@ -106,7 +106,7 @@ function AppErrorsPage() {
@@ -153,11 +153,9 @@ function AppErrorsPage() {
STACK TRACE
-
-
- {error.stackTrace}
-
-
+
+ {error.stackTrace}
+
diff --git a/src/frontend/routes/apps.$appId.index.tsx b/src/frontend/routes/apps.$appId.index.tsx
index 47f7525..4112379 100644
--- a/src/frontend/routes/apps.$appId.index.tsx
+++ b/src/frontend/routes/apps.$appId.index.tsx
@@ -7,9 +7,16 @@ import {
SimpleGrid,
Stack,
Text,
- Title
+ Title,
+ Modal,
+ Button,
+ TextInput,
+ Switch,
+ Badge,
+ Textarea
} from '@mantine/core'
-import { createFileRoute, useParams } from '@tanstack/react-router'
+import { useDisclosure } from '@mantine/hooks'
+import { createFileRoute, useParams, useNavigate } from '@tanstack/react-router'
import {
TbActivity,
TbAlertTriangle,
@@ -24,10 +31,28 @@ export const Route = createFileRoute('/apps/$appId/')({
function AppOverviewPage() {
const { appId } = useParams({ from: '/apps/$appId/' })
+ const navigate = useNavigate()
const isDesaPlus = appId === 'desa-plus'
+ const [versionModalOpened, { open: openVersionModal, close: closeVersionModal }] = useDisclosure(false)
return (
-
+ <>
+
+
+
+
+
+
+
+
+
+
+
{/* 🔝 HEADER SECTION */}
{/* */}
@@ -67,7 +92,19 @@ function AppOverviewPage() {
value="v1.2.0"
icon={TbVersions}
color="brand-blue"
- />
+ onClick={openVersionModal}
+ >
+
+
+ Min. Version
+ v1.0.0
+
+
+ Maintenance
+ False
+
+
+
+ onClick={() => navigate({ to: `/apps/${appId}/villages` })}
+ >
+
+ Nonactive Villages
+ 24
+
+
+ >
)
}
diff --git a/src/frontend/routes/apps.$appId.products.tsx b/src/frontend/routes/apps.$appId.products.tsx
index 1e8628e..917c3fb 100644
--- a/src/frontend/routes/apps.$appId.products.tsx
+++ b/src/frontend/routes/apps.$appId.products.tsx
@@ -53,7 +53,7 @@ function ProductsPage() {
{mockProducts.map((product) => (
-
+
@@ -90,7 +90,7 @@ function ProductsPage() {
/>
-
+
diff --git a/src/index.css b/src/index.css
index 6b5e2f4..798a67d 100644
--- a/src/index.css
+++ b/src/index.css
@@ -1,5 +1,5 @@
@import '@mantine/core/styles.css';
-
+@import '@mantine/charts/styles.css';
:root {
--font-inter: 'Inter', system-ui, -apple-system, sans-serif;