Files
hihala-dashboard/src/types/index.ts
fahed db2617f37d
All checks were successful
Deploy HiHala Dashboard / deploy (push) Successful in 6s
Support both link columns and plain foreign key columns
Production NocoDB uses DistrictId/MuseumId columns instead of
nc_epk____ link columns. Code now checks both column names.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 18:03:07 +03:00

169 lines
3.1 KiB
TypeScript

// Data types for HiHala Dashboard
export interface MuseumRecord {
date: string;
museum_code: string;
museum_name: string;
district: string;
visits: number;
tickets: number;
revenue_gross: number;
revenue_net: number;
revenue_incl_tax: number; // Legacy field
year: string;
quarter: string;
}
export interface Metrics {
revenue: number;
visitors: number;
tickets: number;
avgRevPerVisitor: number;
}
export interface Filters {
year: string;
district: string;
museum: string;
quarter: string;
}
export interface DateRangeFilters {
district: string;
museum: string;
}
export interface CacheStatus {
available: boolean;
timestamp: string | null;
age: number | null;
rows: number;
isStale?: boolean;
}
export interface CacheResult {
data: MuseumRecord[];
isStale: boolean;
timestamp: number;
}
export interface FetchResult {
data: MuseumRecord[];
fromCache: boolean;
cacheTimestamp?: number;
}
export interface GroupedData {
revenue: number;
visitors: number;
tickets: number;
}
export interface DistrictMuseumMap {
[district: string]: string[];
}
export interface UmrahData {
[year: number]: {
[quarter: number]: number | null;
};
}
// Chart data types
export interface ChartDataset {
label?: string;
data: number[];
backgroundColor?: string | string[];
borderColor?: string;
borderWidth?: number;
borderRadius?: number;
tension?: number;
fill?: boolean;
pointRadius?: number;
pointHoverRadius?: number;
pointBackgroundColor?: string;
pointBorderColor?: string;
pointBorderWidth?: number;
yAxisID?: string;
order?: number;
datalabels?: object;
}
export interface ChartData {
labels: string[];
datasets: ChartDataset[];
}
// Component props
export interface DashboardProps {
data: MuseumRecord[];
showDataLabels: boolean;
setShowDataLabels: (value: boolean) => void;
includeVAT: boolean;
setIncludeVAT: (value: boolean) => void;
}
export interface ComparisonProps {
data: MuseumRecord[];
showDataLabels: boolean;
setShowDataLabels: (value: boolean) => void;
includeVAT: boolean;
setIncludeVAT: (value: boolean) => void;
}
export interface SlidesProps {
data: MuseumRecord[];
}
// Quarterly table row
export interface QuarterlyRow {
q: number;
rev24: number;
rev25: number;
revChg: number;
vis24: number;
vis25: number;
visChg: number;
cap24: number | null;
cap25: number | null;
}
// Metric card for comparison
export interface MetricCardData {
title: string;
prev: number | null;
curr: number | null;
change: number | null;
isCurrency?: boolean;
isPercent?: boolean;
pendingMessage?: string;
}
// NocoDB raw types
export interface NocoDBDistrict {
Id: number;
Name: string;
}
export interface NocoDBMuseum {
Id: number;
Code: string;
Name: string;
DistrictId?: number;
'nc_epk____Districts_id'?: number;
}
export interface NocoDBDailyStat {
Id: number;
Date: string;
Visits: number;
Tickets: number;
GrossRevenue: number;
NetRevenue: number;
MuseumId?: number;
'nc_epk____Museums_id'?: number;
}
// Translation function type
export type TranslateFunction = (key: string) => string;