upd: tampilan

This commit is contained in:
2026-04-04 10:04:10 +08:00
parent 416c623bec
commit a245225aca
6 changed files with 69 additions and 22 deletions

View File

@@ -149,8 +149,7 @@ export function ErrorDataTable() {
</Group> </Group>
} }
styles={{ styles={{
header: { padding: '24px', borderBottom: '1px solid rgba(255,255,255,0.1)' }, header: { padding: '24px', borderBottom: '1px solid var(--mantine-color-default-border)' },
content: { background: 'rgba(15, 23, 42, 0.95)', backdropFilter: 'blur(12px)' }
}} }}
> >
{selectedError && ( {selectedError && (
@@ -175,11 +174,9 @@ export function ErrorDataTable() {
<Box> <Box>
<Text size="xs" fw={700} c="dimmed" mb="sm">STACK TRACE</Text> <Text size="xs" fw={700} c="dimmed" mb="sm">STACK TRACE</Text>
<Paper p="md" radius="md" bg="dark.8" style={{ border: '1px solid rgba(255,255,255,0.1)' }}> <Code block color="red" style={{ whiteSpace: 'pre-wrap', lineHeight: 1.6, border: '1px solid var(--mantine-color-default-border)' }}>
<Code block color="red" bg="transparent" style={{ whiteSpace: 'pre-wrap', lineHeight: 1.6 }}> {selectedError.stackTrace}
{selectedError.stackTrace} </Code>
</Code>
</Paper>
</Box> </Box>
<Group justify="flex-end" mt="xl"> <Group justify="flex-end" mt="xl">

View File

@@ -16,6 +16,8 @@ interface SummaryCardProps {
label: string label: string
} }
isError?: boolean isError?: boolean
onClick?: () => void
children?: React.ReactNode
} }
export function SummaryCard({ export function SummaryCard({
@@ -25,7 +27,9 @@ export function SummaryCard({
color = 'brand-blue', color = 'brand-blue',
trend, trend,
progress, progress,
isError isError,
onClick,
children
}: SummaryCardProps) { }: SummaryCardProps) {
const scheme = useComputedColorScheme('light', { getInitialValueInEffect: true }) const scheme = useComputedColorScheme('light', { getInitialValueInEffect: true })
@@ -35,6 +39,8 @@ export function SummaryCard({
padding="xl" padding="xl"
radius="2xl" radius="2xl"
className="glass" className="glass"
onClick={onClick}
style={{ cursor: onClick ? 'pointer' : 'default' }}
styles={(theme) => ({ styles={(theme) => ({
root: { root: {
backgroundColor: isError && Number(value) > 0 backgroundColor: isError && Number(value) > 0
@@ -95,6 +101,8 @@ export function SummaryCard({
/> />
</Box> </Box>
)} )}
{children}
</Card> </Card>
) )
} }

View File

@@ -106,7 +106,7 @@ function AppErrorsPage() {
<Accordion.Item <Accordion.Item
key={error.id} key={error.id}
value={error.id.toString()} value={error.id.toString()}
style={{ border: '1px solid rgba(255,255,255,0.05)', background: 'rgba(255,255,255,0.02)', marginBottom: '12px' }} style={{ border: '1px solid var(--mantine-color-default-border)', background: 'var(--mantine-color-default)', marginBottom: '12px' }}
> >
<Accordion.Control> <Accordion.Control>
<Group wrap="nowrap"> <Group wrap="nowrap">
@@ -153,11 +153,9 @@ function AppErrorsPage() {
<Box> <Box>
<Text size="xs" fw={700} c="dimmed" mb={4}>STACK TRACE</Text> <Text size="xs" fw={700} c="dimmed" mb={4}>STACK TRACE</Text>
<Paper p="sm" radius="md" bg="dark.8" style={{ border: '1px solid rgba(255,255,255,0.1)' }}> <Code block color="red" style={{ fontFamily: 'monospace', whiteSpace: 'pre-wrap', fontSize: '11px', border: '1px solid var(--mantine-color-default-border)' }}>
<Code block color="red" bg="transparent" style={{ fontFamily: 'monospace', whiteSpace: 'pre-wrap', fontSize: '11px' }}> {error.stackTrace}
{error.stackTrace} </Code>
</Code>
</Paper>
</Box> </Box>
<Group justify="flex-end" pt="sm"> <Group justify="flex-end" pt="sm">

View File

@@ -7,9 +7,16 @@ import {
SimpleGrid, SimpleGrid,
Stack, Stack,
Text, Text,
Title Title,
Modal,
Button,
TextInput,
Switch,
Badge,
Textarea
} from '@mantine/core' } from '@mantine/core'
import { createFileRoute, useParams } from '@tanstack/react-router' import { useDisclosure } from '@mantine/hooks'
import { createFileRoute, useParams, useNavigate } from '@tanstack/react-router'
import { import {
TbActivity, TbActivity,
TbAlertTriangle, TbAlertTriangle,
@@ -24,10 +31,28 @@ export const Route = createFileRoute('/apps/$appId/')({
function AppOverviewPage() { function AppOverviewPage() {
const { appId } = useParams({ from: '/apps/$appId/' }) const { appId } = useParams({ from: '/apps/$appId/' })
const navigate = useNavigate()
const isDesaPlus = appId === 'desa-plus' const isDesaPlus = appId === 'desa-plus'
const [versionModalOpened, { open: openVersionModal, close: closeVersionModal }] = useDisclosure(false)
return ( return (
<Stack gap="xl"> <>
<Modal opened={versionModalOpened} onClose={closeVersionModal} title="Update Version Information" radius="md">
<Stack gap="md">
<TextInput label="Active Version" defaultValue="v1.2.0" />
<TextInput label="Minimum Version" defaultValue="v1.0.0" />
<Textarea
label="Update Message"
placeholder="Enter release notes or update message..."
minRows={3}
autosize
/>
<Switch label="Maintenance Mode" description="Enable to put the app in maintenance mode for users." />
<Button fullWidth onClick={closeVersionModal}>Save Changes</Button>
</Stack>
</Modal>
<Stack gap="xl">
{/* 🔝 HEADER SECTION */} {/* 🔝 HEADER SECTION */}
{/* <Paper withBorder p="lg" radius="2xl" className="glass"> */} {/* <Paper withBorder p="lg" radius="2xl" className="glass"> */}
<Group justify="space-between"> <Group justify="space-between">
@@ -67,7 +92,19 @@ function AppOverviewPage() {
value="v1.2.0" value="v1.2.0"
icon={TbVersions} icon={TbVersions}
color="brand-blue" color="brand-blue"
/> onClick={openVersionModal}
>
<Group justify="space-between" mt="md">
<Stack gap={0}>
<Text size="xs" c="dimmed">Min. Version</Text>
<Text size="sm" fw={600}>v1.0.0</Text>
</Stack>
<Stack gap={0} align="flex-end">
<Text size="xs" c="dimmed">Maintenance</Text>
<Badge size="sm" color="gray" variant="light">False</Badge>
</Stack>
</Group>
</SummaryCard>
<SummaryCard <SummaryCard
title="Total Activity Today" title="Total Activity Today"
value="3,842" value="3,842"
@@ -80,7 +117,13 @@ function AppOverviewPage() {
value="138" value="138"
icon={TbBuildingCommunity} icon={TbBuildingCommunity}
color="indigo" color="indigo"
/> onClick={() => navigate({ to: `/apps/${appId}/villages` })}
>
<Group justify="space-between" mt="md">
<Text size="xs" c="dimmed">Nonactive Villages</Text>
<Badge size="sm" color="red" variant="light">24</Badge>
</Group>
</SummaryCard>
<SummaryCard <SummaryCard
title="Errors Today" title="Errors Today"
value="12" value="12"
@@ -100,5 +143,6 @@ function AppOverviewPage() {
{/* 🐞 4. LATEST ERROR REPORTS */} {/* 🐞 4. LATEST ERROR REPORTS */}
<ErrorDataTable /> <ErrorDataTable />
</Stack> </Stack>
</>
) )
} }

View File

@@ -53,7 +53,7 @@ function ProductsPage() {
{mockProducts.map((product) => ( {mockProducts.map((product) => (
<Card key={product.id} withBorder radius="2xl" p="md" className="glass h-full"> <Card key={product.id} withBorder radius="2xl" p="md" className="glass h-full">
<Card.Section> <Card.Section>
<Box h={160} style={{ background: 'rgba(255,255,255,0.03)', display: 'flex', alignItems: 'center', justifyContent: 'center' }}> <Box h={160} style={{ background: 'var(--mantine-color-default-hover)', display: 'flex', alignItems: 'center', justifyContent: 'center' }}>
<ThemeIcon variant="light" size={60} radius="xl" color="brand-blue"> <ThemeIcon variant="light" size={60} radius="xl" color="brand-blue">
<TbArchive size={34} /> <TbArchive size={34} />
</ThemeIcon> </ThemeIcon>
@@ -90,7 +90,7 @@ function ProductsPage() {
/> />
</Box> </Box>
<Group justify="flex-end" mt="md" pt="sm" style={{ borderTop: '1px solid rgba(255,255,255,0.05)' }}> <Group justify="flex-end" mt="md" pt="sm" style={{ borderTop: '1px solid var(--mantine-color-default-border)' }}>
<Tooltip label="Edit Product"> <Tooltip label="Edit Product">
<ActionIcon variant="light" size="sm" color="blue"> <ActionIcon variant="light" size="sm" color="blue">
<TbPencil size={14} /> <TbPencil size={14} />

View File

@@ -1,5 +1,5 @@
@import '@mantine/core/styles.css'; @import '@mantine/core/styles.css';
@import '@mantine/charts/styles.css';
:root { :root {
--font-inter: 'Inter', system-ui, -apple-system, sans-serif; --font-inter: 'Inter', system-ui, -apple-system, sans-serif;