import { ClassesViewParentID, NestedClassID } from '../../commonStateTypes/classesView/nestedClassID'; import { COABalancesFilter } from '../../commonStateTypes/coaBalance/coaBalancesFilter'; import { ID } from '../../commonStateTypes/common'; import { ReportID } from '../../commonStateTypes/viewAndReport/viewAndReport'; import { AccountState } from '../account/accountState'; import { ClassReport } from './classSelectorTypes'; import { Class, ClassState } from './classState'; /** * Minimal class shape consumed by filter dropdowns. Only the identity and * the display label are needed — payload size and prop-type breadth are * kept small so consumers can't accidentally rely on `Class` fields that * the projection does not carry. */ export interface ClassFilterOption { classId: ID; className: string; } export declare function getClassesByIds(classState: ClassState, id: { classIds: ID[]; reportId: ReportID; classesViewParentId?: ClassesViewParentID; }): Class[]; export declare function getClassById(classState: ClassState, id: { classId: ID; reportId: ReportID; classesViewParentId?: ClassesViewParentID; }): Class | undefined; export declare function getClassReport(classState: ClassState, accountState: AccountState, id: { nestedClassId: NestedClassID; reportId: ReportID; classesViewParentId?: ClassesViewParentID; }, filter: COABalancesFilter): ClassReport | undefined; /** * Returns all classes currently in state (single pass over classesByKey). * Use for dropdowns that need class names; map to { classId, className } as needed. */ export declare function getAllClasses(classState: ClassState): Class[]; /** * Memoised projection of `getAllClasses` to the `{classId, className}` shape * expected by filter dropdowns. Consumers should prefer this over inlining a * `getAllClasses(...).map(...)` inside `useSelector`: the inline map allocates * a fresh array on every Redux dispatch, breaking `useSelector`'s * reference-equality optimisation and triggering re-renders on every state * change unrelated to class data. * * Two cleanups happen here, intentionally inside the selector so every * consumer benefits uniformly: * 1. **Drop entries with a blank `className`.** Soft-deleted classes can * retain their classId in state while the human name is blanked, which * would otherwise render as an empty row in the filter dropdown. * 2. **Dedupe by `classId`.** `classesByKey` is keyed by * `${classId}-${reportId}` (see `getClassKey`), so a class loaded under * multiple report contexts appears as multiple entries from * `Object.values(classesByKey)`. The first non-blank entry per * `classId` wins. */ export declare const getClassFilterOptions: (classState: ClassState) => ClassFilterOption[];