All checks were successful
Deploy HiHala Dashboard / deploy (push) Successful in 6s
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>
169 lines
3.1 KiB
TypeScript
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;
|