Skip to content
Snippets Groups Projects
selectors.ts 3.63 KiB
Newer Older
import { createSelector } from '@ngrx/store';
Isaac Evavold's avatar
Isaac Evavold committed
import { GlobalState } from '@app/core/state';
Isaac Evavold's avatar
Isaac Evavold committed
import { PlannedTerm } from '@app/core/models/planned-term';
import { DegreePlannerState } from './state';
Isaac Evavold's avatar
Isaac Evavold committed
import { parseTermCode } from '../shared/utils';
import { YearMapping, Year } from '@app/core/models/year';
Isaac Evavold's avatar
Isaac Evavold committed
export const getDegreePlannerState = ({ degreePlanner }: GlobalState) => {
jvanboxtel@wisc.edu's avatar
jvanboxtel@wisc.edu committed
  return degreePlanner;
Isaac Evavold's avatar
Isaac Evavold committed
export const hasLoadedDegreePlan = createSelector(
  getDegreePlannerState,
  state => state.visibleDegreePlan !== undefined,
);

Isaac Evavold's avatar
Isaac Evavold committed
export const selectVisibleDegreePlan = createSelector(
  (state: GlobalState) => state.degreePlanner,
  state => state.visibleDegreePlan,
Isaac Evavold's avatar
Isaac Evavold committed
export const selectAllDegreePlans = createSelector(
  (state: GlobalState) => state.degreePlanner,
jvanboxtel@wisc.edu's avatar
jvanboxtel@wisc.edu committed
  state => state.allDegreePlans,
Isaac Evavold's avatar
Isaac Evavold committed
export const getSavedForLaterCourses = createSelector(
  (state: GlobalState) => state.degreePlanner,
  state => state.savedForLaterCourses,
Isaac Evavold's avatar
Isaac Evavold committed
export const getSubjects = createSelector(
  (state: GlobalState) => state.degreePlanner,
  state => state.subjects,
Isaac Evavold's avatar
Isaac Evavold committed
export const selectSubjects = getSubjects;
Isaac Evavold's avatar
Isaac Evavold committed
export const getActiveTerms = createSelector(
  (state: GlobalState) => state.degreePlanner,
  state => state.activeTermCodes,
Isaac Evavold's avatar
Isaac Evavold committed
export const selectActiveTermCodes = getActiveTerms;
Isaac Evavold's avatar
Isaac Evavold committed
export const selectAllVisibleYears = createSelector(
  (state: GlobalState) => state.degreePlanner,
  state => state.visibleYears,
Scott Berg's avatar
Scott Berg committed
);

Isaac Evavold's avatar
Isaac Evavold committed
export const selectYearExpandedState = createSelector(
  (state: GlobalState, params: { yearCode: string }): Year | undefined => {
    return state.degreePlanner.visibleYears[params.yearCode];
  },
  year => {
    if (year) {
      return year.isExpanded;
    } else {
      return false;
    }
Scott Berg's avatar
Scott Berg committed
  },
);

Isaac Evavold's avatar
Isaac Evavold committed
export const selectVisibleTerm = createSelector(
  (state: GlobalState) => state.degreePlanner.visibleYears,
  (years: YearMapping, params: { termCode: string }) => {
    const { yearCode, termName } = parseTermCode(params.termCode);
    const year = years[yearCode] as Year | undefined;
    if (year) {
      return year[termName];
    } else {
      return undefined;
    }
Scott Berg's avatar
Scott Berg committed
  },
);

Scott Berg's avatar
Scott Berg committed
export const getSubjectDescriptions = createSelector(
  getDegreePlannerState,
  (state: DegreePlannerState) => {
    return state.subjectDescriptions;
  },
);

export const isCourseSearchOpen = createSelector(
  getDegreePlannerState,
  (state: DegreePlannerState) => {
    return state.search.visible;
  },
);

export const getSelectedSearchTerm = createSelector(
  getDegreePlannerState,
  (state: DegreePlannerState) => {
    return state.search.selectedTerm;
  },
);

export const getActiveSelectedSearchTerm = createSelector(
  getDegreePlannerState,
  (state: DegreePlannerState) => {
    const { selectedTerm } = state.search;
    return state.activeTermCodes.includes(selectedTerm) ? selectedTerm : '0000';
export const isCurrentTerm = (termCode: string) =>
  createSelector(
    getDegreePlannerState,
    (state: DegreePlannerState) => {
      const currentTermCode = state.activeTermCodes[0];

      return termCode === currentTermCode;
    },
  );

jvanboxtel@wisc.edu's avatar
jvanboxtel@wisc.edu committed
  createSelector(
    getDegreePlannerState,
    (state: DegreePlannerState) => {
      const currentTermCode = state.activeTermCodes[0];

      return termCode < currentTermCode;
jvanboxtel@wisc.edu's avatar
jvanboxtel@wisc.edu committed
    },
  );
export const isLoadingPlan = createSelector(
  getDegreePlannerState,
  (state: DegreePlannerState) => state.isLoadingPlan,
);
Isaac Evavold's avatar
Isaac Evavold committed
const getTermForCode = (termCode: string, terms: PlannedTerm[]) => {
  const foundTerm = terms.find(term => term.termCode === termCode);

  if (foundTerm !== undefined) {
    return foundTerm;
  }

  return { termCode, courses: [] };