analytica-frontend-lib
Version:
Repositório público dos componentes utilizados nas plataformas da Analytica Ensino
173 lines • 5.84 kB
TypeScript
import type { ActivityFilterOption } from '../types/activitiesHistory';
/**
* Generic user institution data structure
* Matches the structure from GET /user/me endpoint
*/
export interface UserInstitutionData {
school?: {
id: string;
name: string;
};
schoolYear?: {
id: string;
name: string;
};
class?: {
id: string;
name: string;
};
}
/**
* Generic subject teacher topic class structure
*/
export interface SubTeacherTopicClassData {
subject?: {
id: string;
name: string;
};
class?: {
id: string;
name: string;
};
}
/**
* Generic user data structure for filter extraction
* Can be extended by consuming projects
*/
export interface UserFilterSourceData {
userInstitutions?: UserInstitutionData[];
subTeacherTopicClasses?: SubTeacherTopicClassData[];
}
/**
* Extract unique school options from user data
* Uses Map for deduplication to handle multiple institutions with same school
*
* @param userData - User data from /user/me endpoint
* @returns Array of unique schools sorted by name
*
* @example
* ```typescript
* const userData = useUserStore(state => state.data);
* const schools = getSchoolOptionsFromUserData(userData);
* // Returns: [{ id: '1', name: 'Escola A' }, { id: '2', name: 'Escola B' }]
* ```
*/
export declare const getSchoolOptionsFromUserData: (userData: UserFilterSourceData | null | undefined) => ActivityFilterOption[];
/**
* Extract unique subject options from user data
* Uses Map for deduplication
*
* @param userData - User data from /user/me endpoint
* @returns Array of unique subjects sorted by name
*
* @example
* ```typescript
* const userData = useUserStore(state => state.data);
* const subjects = getSubjectOptionsFromUserData(userData);
* // Returns: [{ id: '1', name: 'Matemática' }, { id: '2', name: 'Português' }]
* ```
*/
export declare const getSubjectOptionsFromUserData: (userData: UserFilterSourceData | null | undefined) => ActivityFilterOption[];
/**
* Extract unique school year (série) options from user data
*
* @param userData - User data from /user/me endpoint
* @returns Array of unique school years sorted by name
*/
export declare const getSchoolYearOptionsFromUserData: (userData: UserFilterSourceData | null | undefined) => ActivityFilterOption[];
/**
* Extract unique class (turma) options from user data
* Combines classes from userInstitutions and subTeacherTopicClasses
*
* @param userData - User data from /user/me endpoint
* @returns Array of unique classes sorted by name
*/
export declare const getClassOptionsFromUserData: (userData: UserFilterSourceData | null | undefined) => ActivityFilterOption[];
/**
* Build user filter data object from user data
* Convenience function to create ActivityUserFilterData
*
* @param userData - User data from /user/me endpoint
* @returns Object with schools and subjects arrays
*
* @example
* ```typescript
* const userData = useUserStore(state => state.data);
* const userFilterData = buildUserFilterData(userData);
* // Use with ActivitiesHistory component:
* <ActivitiesHistory userFilterData={userFilterData} ... />
* ```
*/
export declare const buildUserFilterData: (userData: UserFilterSourceData | null | undefined) => {
schools: ActivityFilterOption[];
subjects: ActivityFilterOption[];
};
/**
* Merge two filter option arrays, deduplicating by ID.
* Returns the base array unchanged if extra adds no new items.
*
* @param base - Base filter options array
* @param extra - Additional filter options to merge
* @returns Merged and sorted array of unique filter options
*
* @example
* ```typescript
* const userSubjects = getSubjectOptionsFromUserData(userData);
* const apiSubjects = [{ id: '3', name: 'História' }];
* const allSubjects = mergeFilterOptions(userSubjects, apiSubjects);
* // Returns deduplicated and sorted array
* ```
*/
export declare const mergeFilterOptions: (base: ActivityFilterOption[], extra: ActivityFilterOption[]) => ActivityFilterOption[];
/**
* Generic entity reference with id and name.
* Used internally for structural typing in extractBreakdownFilterOptions.
*/
interface EntityRefLike {
id: string;
name: string;
}
/**
* Structural shape of a single breakdown entry (school/class/schoolYear).
* Matches both ActivityBreakdownItem and ExamBreakdownItem.
*/
interface BreakdownLike {
school?: EntityRefLike | null;
schoolYear?: EntityRefLike | null;
class?: EntityRefLike | null;
}
/**
* Structural shape of a history item that carries subject and breakdown data.
* Matches both ActivityHistoryResponse and ExamHistoryResponse.
*/
interface BreakdownHistoryItem {
subject?: EntityRefLike | null;
breakdown?: BreakdownLike[];
}
/**
* Filter options extracted from a list of history items with breakdown data.
*/
export interface BreakdownFilterOptions {
schools: ActivityFilterOption[];
classes: ActivityFilterOption[];
subjects: ActivityFilterOption[];
schoolYears: ActivityFilterOption[];
}
/**
* Extract unique filter options (schools, classes, subjects, schoolYears)
* from a list of history items that carry subject and breakdown data.
*
* Used by both useActivitiesHistory and useExamsHistory to avoid duplication.
*
* @param items - Array of history items (activities or exams) from the API
* @returns Deduplicated, sorted filter options grouped by dimension
*
* @example
* ```typescript
* const options = extractBreakdownFilterOptions(data.activities);
* // Returns: { schools: [...], classes: [...], subjects: [...], schoolYears: [...] }
* ```
*/
export declare const extractBreakdownFilterOptions: (items: BreakdownHistoryItem[]) => BreakdownFilterOptions;
export {};
//# sourceMappingURL=filterHelpers.d.ts.map