Assessor_2.0/src/app/app-state.ts

67 lines
2.0 KiB
TypeScript

import type { ImportedDataset } from '../domain/dataset';
import type { Review } from '../domain/review';
import type { DynamicFacetFilters } from '../features/search-filter/dynamic-facets';
export type ViewMode = 'records' | 'columns' | 'table' | 'raw';
export type ThemeMode = 'dark' | 'light' | 'system';
export type BackendStatus = 'checking' | 'connected' | 'unavailable';
export interface AppState {
dataset: ImportedDataset | null;
activeSheetId: string;
view: ViewMode;
search: string;
sortColumn: string;
sortDirection: 'asc' | 'desc';
titleColumn: string;
statusFilter: string;
facetFilters: DynamicFacetFilters;
pathFindingIds: string[];
actionOnly: boolean;
selectedRecordId: string;
reviews: Record<string, Review>;
projectId: string;
status: string;
theme: ThemeMode;
delimiter: string;
sidebarCollapsed: boolean;
backendStatus: BackendStatus;
}
export type SavedViewState = Pick<AppState,
'activeSheetId' | 'view' | 'search' | 'sortColumn' | 'sortDirection' |
'titleColumn' | 'statusFilter' | 'facetFilters' | 'pathFindingIds' | 'actionOnly' | 'selectedRecordId'
>;
export function applySavedViewState(current: AppState, savedView: SavedViewState): AppState {
if (!current.dataset?.sheets.some(sheet => sheet.id === savedView.activeSheetId)) return current;
const facetFilters = Object.fromEntries(Object.entries(savedView.facetFilters).map(([id, filter]) => [
id,
{ ...filter, ...(filter.values ? { values: [...filter.values] } : {}) }
]));
return { ...current, ...savedView, facetFilters, pathFindingIds: [...savedView.pathFindingIds] };
}
export const initialAppState: AppState = {
dataset: null,
activeSheetId: '',
view: 'columns',
search: '',
sortColumn: 'all',
sortDirection: 'desc',
titleColumn: '',
statusFilter: 'deviation',
facetFilters: {},
pathFindingIds: [],
actionOnly: false,
selectedRecordId: '',
reviews: {},
projectId: '',
status: 'Ready',
theme: 'dark',
delimiter: 'auto',
sidebarCollapsed: false,
backendStatus: 'checking'
};