67 lines
2.0 KiB
TypeScript
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'
|
|
};
|