CI / changes (push) Successful in 9s
CI / commitlint (push) Has been skipped
CI / openapi (push) Has been skipped
CI / web (push) Successful in 50s
CI / go (push) Has been skipped
CI / bird2 (push) Has been skipped
CI / release (push) Successful in 4m21s
Refactored multiple components to utilize the new DataGridCard for better organization and presentation of data. Updated the FirewallPage and Monitoring components to enhance loading states and error handling using QueryState. Added success and error notifications for firewall rule creation, improving user feedback. This update streamlines the user experience and ensures a more consistent interface across the application.
116 lines
3.2 KiB
TypeScript
116 lines
3.2 KiB
TypeScript
import type { ReactNode } from 'react'
|
|
import type { Table } from '@tanstack/react-table'
|
|
|
|
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@evobgp/ui/components/card'
|
|
|
|
import { DataGridToolbar } from '@/components/data-grid-toolbar'
|
|
import { DataGridPagination } from '@/components/reui/data-grid/data-grid-pagination'
|
|
import { DataGrid, DataGridContainer } from '@/components/reui/data-grid/data-grid'
|
|
import { DataGridTable } from '@/components/reui/data-grid/data-grid-table'
|
|
import {
|
|
DATA_GRID_PAGINATION_RU,
|
|
DATA_GRID_TABLE_LAYOUT,
|
|
} from '@/lib/data-grid-defaults'
|
|
|
|
interface DataGridShellProps<TData extends object> {
|
|
table: Table<TData>
|
|
recordCount: number
|
|
isLoading?: boolean
|
|
emptyMessage?: ReactNode
|
|
showPagination?: boolean
|
|
tableLayout?: typeof DATA_GRID_TABLE_LAYOUT
|
|
className?: string
|
|
onRowClick?: (row: TData) => void
|
|
}
|
|
|
|
export function DataGridShell<TData extends object>({
|
|
table,
|
|
recordCount,
|
|
isLoading = false,
|
|
emptyMessage,
|
|
showPagination = true,
|
|
tableLayout = DATA_GRID_TABLE_LAYOUT,
|
|
className,
|
|
onRowClick,
|
|
}: DataGridShellProps<TData>) {
|
|
return (
|
|
<DataGrid
|
|
table={table}
|
|
recordCount={recordCount}
|
|
isLoading={isLoading}
|
|
emptyMessage={emptyMessage}
|
|
tableLayout={tableLayout}
|
|
className={className}
|
|
onRowClick={onRowClick}
|
|
>
|
|
<DataGridContainer>
|
|
<DataGridTable />
|
|
</DataGridContainer>
|
|
{showPagination ? (
|
|
<div className="border-t px-4 py-3">
|
|
<DataGridPagination {...DATA_GRID_PAGINATION_RU} />
|
|
</div>
|
|
) : null}
|
|
</DataGrid>
|
|
)
|
|
}
|
|
|
|
interface DataGridCardProps {
|
|
title?: string
|
|
description?: string
|
|
actions?: ReactNode
|
|
children: ReactNode
|
|
className?: string
|
|
}
|
|
|
|
export function DataGridCard({ title, description, actions, children, className }: DataGridCardProps) {
|
|
const hasHeader = Boolean(title || description || actions)
|
|
return (
|
|
<Card className={className ?? 'gap-0'}>
|
|
{hasHeader ? (
|
|
<CardHeader className="flex flex-row items-center justify-between border-b py-3">
|
|
<div className="flex flex-col gap-0.5">
|
|
{title ? <CardTitle className="text-base">{title}</CardTitle> : null}
|
|
{description ? <CardDescription>{description}</CardDescription> : null}
|
|
</div>
|
|
{actions ? <div className="flex shrink-0 items-center gap-2">{actions}</div> : null}
|
|
</CardHeader>
|
|
) : null}
|
|
<CardContent className="p-0">{children}</CardContent>
|
|
</Card>
|
|
)
|
|
}
|
|
|
|
interface DataGridSectionProps<TData extends object> extends DataGridShellProps<TData> {
|
|
searchValue: string
|
|
onSearchChange: (value: string) => void
|
|
searchPlaceholder?: string
|
|
toolbarFilters?: ReactNode
|
|
toolbarActions?: ReactNode
|
|
beforeGrid?: ReactNode
|
|
}
|
|
|
|
export function DataGridSection<TData extends object>({
|
|
searchValue,
|
|
onSearchChange,
|
|
searchPlaceholder,
|
|
toolbarFilters,
|
|
toolbarActions,
|
|
beforeGrid,
|
|
...shellProps
|
|
}: DataGridSectionProps<TData>) {
|
|
return (
|
|
<>
|
|
<DataGridToolbar
|
|
searchValue={searchValue}
|
|
onSearchChange={onSearchChange}
|
|
searchPlaceholder={searchPlaceholder}
|
|
filters={toolbarFilters}
|
|
actions={toolbarActions}
|
|
/>
|
|
{beforeGrid}
|
|
<DataGridShell {...shellProps} />
|
|
</>
|
|
)
|
|
}
|