Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix(course, course_activity) add ID to course #81

Merged
merged 3 commits into from
Nov 12, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions src/api/course-activities/course-activities.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,10 +35,10 @@ export default class CourseActivityService extends BaseService {
protected static readonly endpoint = '/courses';

public static async getCourseActivities(
abbr: TPureCourse[E_COURSE_ENTITY_KEYS.ABBR],
id: TPureCourse[E_COURSE_ENTITY_KEYS.ID],
): Promise<Array<TApiCourseActivity>> {
return await Api.instance.get<Array<TApiCourseActivity>>(
`${this.endpoint}/${abbr}/activities`,
`${this.endpoint}/${id}/activities`,
);
}

Expand Down
19 changes: 11 additions & 8 deletions src/api/course/course.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,15 @@ import { E_COURSE_ENTITY_KEYS, TPureCourse } from './types';

export type TCourseCreateData = Omit<
TPureCourse,
| E_COURSE_ENTITY_KEYS.ABBR
| E_COURSE_ENTITY_KEYS.ANNOTATION
| E_COURSE_ENTITY_KEYS.CREDITS
| E_COURSE_ENTITY_KEYS.GUARANTOR
| E_COURSE_ENTITY_KEYS.ID
| E_COURSE_ENTITY_KEYS.TEACHERS
> & {
[E_COURSE_ENTITY_KEYS.CREDITS]: number;
[E_COURSE_ENTITY_KEYS.ABBR]: string;
[E_COURSE_ENTITY_KEYS.ANNOTATION]?: string;
[E_COURSE_ENTITY_KEYS.GUARANTOR]: string;
[E_COURSE_ENTITY_KEYS.TEACHERS]?: Array<string>;
Expand All @@ -22,12 +25,12 @@ export type TCourseCreateMutationVariables = {
};

export type TCourseUpdateMutationVariables = {
[E_COURSE_ENTITY_KEYS.ABBR]: TPureCourse[E_COURSE_ENTITY_KEYS.ABBR];
[E_COURSE_ENTITY_KEYS.ID]: TPureCourse[E_COURSE_ENTITY_KEYS.ID];
data: TCourseUpdateData;
};

export type TCourseDeleteMutationVariables = {
[E_COURSE_ENTITY_KEYS.ABBR]: TPureCourse[E_COURSE_ENTITY_KEYS.ABBR];
[E_COURSE_ENTITY_KEYS.ID]: TPureCourse[E_COURSE_ENTITY_KEYS.ID];
};

export default class CourseService extends BaseService {
Expand All @@ -38,9 +41,9 @@ export default class CourseService extends BaseService {
}

public static async getCourse(
abbr: TPureCourse[E_COURSE_ENTITY_KEYS.ABBR],
id: TPureCourse[E_COURSE_ENTITY_KEYS.ID],
): Promise<TPureCourse> {
return await Api.instance.get<TPureCourse>(`${this.endpoint}/${abbr}`);
return await Api.instance.get<TPureCourse>(`${this.endpoint}/${id}`);
}

public static async createCourse(
Expand All @@ -53,18 +56,18 @@ export default class CourseService extends BaseService {
}

public static async updateCourse(
abbr: TPureCourse[E_COURSE_ENTITY_KEYS.ABBR],
id: TPureCourse[E_COURSE_ENTITY_KEYS.ID],
data: TCourseUpdateData,
): Promise<TPureCourse> {
return await Api.instance.put<TCourseUpdateData, TPureCourse>(
`${this.endpoint}/${abbr}`,
`${this.endpoint}/${id}`,
data,
);
}

public static async deleteCourse(
abbr: TPureCourse[E_COURSE_ENTITY_KEYS.ABBR],
id: TPureCourse[E_COURSE_ENTITY_KEYS.ID],
): Promise<void> {
await Api.instance.delete<void>(`${this.endpoint}/${abbr}`);
await Api.instance.delete<void>(`${this.endpoint}/${id}`);
}
}
2 changes: 2 additions & 0 deletions src/api/course/types.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { TApiUser } from '../user/types';

export enum E_COURSE_ENTITY_KEYS {
ID = 'id',
ABBR = 'abbr',
NAME = 'name',
CREDITS = 'credits',
Expand All @@ -10,6 +11,7 @@ export enum E_COURSE_ENTITY_KEYS {
}

export type TPureCourse = {
[E_COURSE_ENTITY_KEYS.ID]: string;
[E_COURSE_ENTITY_KEYS.ABBR]: string;
[E_COURSE_ENTITY_KEYS.NAME]: string;
[E_COURSE_ENTITY_KEYS.CREDITS]: number;
Expand Down
8 changes: 4 additions & 4 deletions src/components/course-activity/data-table/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,12 @@ import { useCourseActivityModalHandlers } from '../../../utils/hooks/course-acti
import { useCourseActivityPermissions } from '../../../utils/hooks/course-activities/useCourseActivityPermissions';

export const CourseActivityTable = (): JSX.Element => {
const { abbr } = useParams<'abbr'>();
const { id } = useParams<'id'>();
const navigate = useNavigate();

if (isUndefined(abbr)) navigate('/courses');
if (isUndefined(id)) navigate('/courses');

const useQueryFn = useCourseActivities.bind(this, abbr);
const useQueryFn = useCourseActivities.bind(this, id);

const gridColumns: Array<GridColDef<TApiCourseActivity>> = [
{
Expand Down Expand Up @@ -51,7 +51,7 @@ export const CourseActivityTable = (): JSX.Element => {
modalInitial={{
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
[E_COURSE_ACTIVITY_ENTITY_KEYS.COURSE]: abbr ?? '',
[E_COURSE_ACTIVITY_ENTITY_KEYS.COURSE]: id ?? '',
}}
permissionsFunction={useCourseActivityPermissions}
mutationsFunction={useCourseActivityMutations}
Expand Down
10 changes: 5 additions & 5 deletions src/components/courses/course-info/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -29,16 +29,16 @@ import { useCoursePermissions } from '../../../utils/hooks/course/useCoursePermi
import { CourseActivityTable } from '../../course-activity/data-table';

export const CourseInfo = (): JSX.Element => {
const { abbr } = useParams<'abbr'>();
const { id } = useParams<'id'>();
const navigate = useNavigate();

if (isUndefined(abbr)) navigate('/courses');
if (isUndefined(id)) navigate('/courses');

const { onOpen: openCourseFormModal, onClose: closeFormModal } = useModal(
E_MODALS.COURSE_FORM,
);

const { data, isLoading, error, refetch } = useCourse(abbr);
const { data, isLoading, error, refetch } = useCourse(id);

const { canUpdate, canDelete } = useCoursePermissions(data ?? undefined);

Expand All @@ -62,11 +62,11 @@ export const CourseInfo = (): JSX.Element => {
};

const handleDeleteClick = () => {
if (!data || !abbr) return;
if (!data || !id) return;

deleteMutation.mutate(
{
[E_COURSE_ENTITY_KEYS.ABBR]: abbr,
[E_COURSE_ENTITY_KEYS.ID]: id,
},
{
onSuccess: async () => {
Expand Down
7 changes: 6 additions & 1 deletion src/components/courses/data-table/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,11 @@ import { useCourses } from '../../../utils/hooks/course/useCourses';

export const CoursesDataTable = (): JSX.Element => {
const gridColumns: Array<GridColDef<TPureCourse>> = [
{
field: E_COURSE_ENTITY_KEYS.ID,
headerName: 'ID',
hideable: true,
},
{
field: E_COURSE_ENTITY_KEYS.ABBR,
headerName: 'Abbreviation',
Expand Down Expand Up @@ -68,7 +73,7 @@ export const CoursesDataTable = (): JSX.Element => {
return (
<GenericDataGrid
modalKey={E_MODALS.COURSE_FORM}
primaryKey={E_COURSE_ENTITY_KEYS.ABBR}
primaryKey={E_COURSE_ENTITY_KEYS.ID}
columns={gridColumns}
actions={['open-in-tab', 'duplicate', 'edit', 'delete']}
caption={'Course'}
Expand Down
8 changes: 4 additions & 4 deletions src/store/modals/reducer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -64,9 +64,9 @@ export type TModalMetaMap = {
| {
mode: E_MODAL_MODE.UPDATE;
initialData: Partial<TPureCourse> & {
[E_COURSE_ENTITY_KEYS.ABBR]: TPureCourse[E_COURSE_ENTITY_KEYS.ABBR];
[E_COURSE_ENTITY_KEYS.ID]: TPureCourse[E_COURSE_ENTITY_KEYS.ID];
};
onSuccess(abbr: string, data: TCourseCreateData): void;
onSuccess(id: string, data: TCourseCreateData): void;
};
[E_MODALS.CLASS_FORM]:
| {
Expand All @@ -85,15 +85,15 @@ export type TModalMetaMap = {
| {
mode: E_MODAL_MODE.CREATE;
initialData: Partial<TApiCourseActivity> & {
[E_COURSE_ACTIVITY_ENTITY_KEYS.COURSE]: TPureCourse[E_COURSE_ENTITY_KEYS.ABBR];
[E_COURSE_ACTIVITY_ENTITY_KEYS.COURSE]: TPureCourse[E_COURSE_ENTITY_KEYS.ID];
};
onSuccess(data: TCourseActivityCreateData): void;
}
| {
mode: E_MODAL_MODE.UPDATE;
initialData: Partial<TApiCourseActivity> & {
[E_COURSE_ACTIVITY_ENTITY_KEYS.ID]: TApiCourseActivity[E_COURSE_ACTIVITY_ENTITY_KEYS.ID];
[E_COURSE_ACTIVITY_ENTITY_KEYS.COURSE]: TPureCourse[E_COURSE_ENTITY_KEYS.ABBR];
[E_COURSE_ACTIVITY_ENTITY_KEYS.COURSE]: TPureCourse[E_COURSE_ENTITY_KEYS.ID];
};
onSuccess(
id: TApiCourseActivity[E_COURSE_ACTIVITY_ENTITY_KEYS.ID],
Expand Down
7 changes: 3 additions & 4 deletions src/utils/hooks/class/useClass.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import { E_CLASS_ENTITY_KEYS, TClass } from '../../../api/class/types';
import ClassService from '../../../api/class/class.service';

export const useClass = (
abbr: TClass[E_CLASS_ENTITY_KEYS.ABBR] | undefined,
id: TClass[E_CLASS_ENTITY_KEYS.ID] | undefined,
options?: Omit<
UseQueryOptions<
TClass | null,
Expand All @@ -20,9 +20,8 @@ export const useClass = (
> & { initialData?(): undefined },
): UseQueryResult<TClass | null, TApiError> => {
return useQuery(
['class', abbr ?? null],
async (): Promise<TClass | null> =>
abbr ? ClassService.getClass(abbr) : null,
['class', id ?? null],
async (): Promise<TClass | null> => (id ? ClassService.getClass(id) : null),
options,
);
};
6 changes: 3 additions & 3 deletions src/utils/hooks/course-activities/useCourseActivities.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import CourseActivityService from '../../../api/course-activities/course-activit
import { TApiCourseActivity } from '../../../api/course-activities/types';

export const useCourseActivities = (
abbr: TPureCourse[E_COURSE_ENTITY_KEYS.ABBR] | undefined,
id: TPureCourse[E_COURSE_ENTITY_KEYS.ID] | undefined,
options?: Omit<
UseQueryOptions<
Array<TApiCourseActivity>,
Expand All @@ -21,9 +21,9 @@ export const useCourseActivities = (
> & { initialData?(): undefined },
): UseQueryResult<Array<TApiCourseActivity>, TApiError> => {
return useQuery(
['course-activities - ', abbr ?? '__EMPTY'],
['course-activities - ', id ?? '__EMPTY'],
async (): Promise<Array<TApiCourseActivity>> =>
abbr ? CourseActivityService.getCourseActivities(abbr) : [],
id ? CourseActivityService.getCourseActivities(id) : [],
options,
);
};
6 changes: 3 additions & 3 deletions src/utils/hooks/course/useCourse.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import { E_COURSE_ENTITY_KEYS, TPureCourse } from '../../../api/course/types';
import CourseService from '../../../api/course/course.service';

export const useCourse = (
abbr: TPureCourse[E_COURSE_ENTITY_KEYS.ABBR] | undefined,
id: TPureCourse[E_COURSE_ENTITY_KEYS.ID] | undefined,
options?: Omit<
UseQueryOptions<
TPureCourse | null,
Expand All @@ -20,9 +20,9 @@ export const useCourse = (
> & { initialData?(): undefined },
): UseQueryResult<TPureCourse | null, TApiError> => {
return useQuery(
['course', abbr ?? null],
['course', id ?? null],
async (): Promise<TPureCourse | null> =>
abbr ? CourseService.getCourse(abbr) : null,
id ? CourseService.getCourse(id) : null,
options,
);
};
8 changes: 4 additions & 4 deletions src/utils/hooks/course/useCourseModalHandlers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ export type TUseCourseModalHandlersParams = Partial<
export type TUseCourseModalHandlers = {
handleCreateSuccess(createData: TCourseCreateData): void;
handleUpdateSuccess(
abbr: TPureCourse[E_COURSE_ENTITY_KEYS.ABBR],
id: TPureCourse[E_COURSE_ENTITY_KEYS.ID],
updateData: TCourseUpdateData,
): void;
};
Expand All @@ -26,7 +26,6 @@ export const useCourseModalHandlers = ({
if (!createMutation) return;

const pureData = pick(createData, [
E_COURSE_ENTITY_KEYS.ABBR,
E_COURSE_ENTITY_KEYS.NAME,
E_COURSE_ENTITY_KEYS.CREDITS,
E_COURSE_ENTITY_KEYS.GUARANTOR,
Expand All @@ -35,6 +34,7 @@ export const useCourseModalHandlers = ({
createMutation.mutate({
data: {
...pureData,
[E_COURSE_ENTITY_KEYS.ABBR]: createData[E_COURSE_ENTITY_KEYS.ABBR],
...(createData[E_COURSE_ENTITY_KEYS.ANNOTATION] && {
[E_COURSE_ENTITY_KEYS.ANNOTATION]:
createData[E_COURSE_ENTITY_KEYS.ANNOTATION],
Expand All @@ -48,7 +48,7 @@ export const useCourseModalHandlers = ({
};

const handleUpdateSuccess = (
abbr: TPureCourse[E_COURSE_ENTITY_KEYS.ABBR],
id: TPureCourse[E_COURSE_ENTITY_KEYS.ID],
updateData: TCourseUpdateData,
) => {
if (!updateMutation) return;
Expand All @@ -61,7 +61,7 @@ export const useCourseModalHandlers = ({
]);

updateMutation.mutate({
abbr,
id,
data: {
...pureData,
...(updateData[E_COURSE_ENTITY_KEYS.ANNOTATION] && {
Expand Down
8 changes: 4 additions & 4 deletions src/utils/hooks/course/useCourseMutations.ts
Original file line number Diff line number Diff line change
Expand Up @@ -61,10 +61,10 @@ export const useCourseMutations = ({
TCourseUpdateMutationVariables
>({
mutationFn: async ({
[E_COURSE_ENTITY_KEYS.ABBR]: abbr,
[E_COURSE_ENTITY_KEYS.ID]: id,
data: updateData,
}: TCourseUpdateMutationVariables) =>
CourseService.updateCourse(abbr, updateData),
CourseService.updateCourse(id, updateData),
onSuccess: async () => {
await refetch();
closeFormModal();
Expand All @@ -84,8 +84,8 @@ export const useCourseMutations = ({
TCourseDeleteMutationVariables
>({
mutationFn: async ({
[E_COURSE_ENTITY_KEYS.ABBR]: abbr,
}: TCourseDeleteMutationVariables) => CourseService.deleteCourse(abbr),
[E_COURSE_ENTITY_KEYS.ID]: id,
}: TCourseDeleteMutationVariables) => CourseService.deleteCourse(id),
onSuccess: async () => {
await refetch();

Expand Down
12 changes: 8 additions & 4 deletions src/utils/modal/modals/course-form.modal.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,9 @@ export type TCourseFormModalProps = TCommonModalProps &

export type TCourseFormModalData = Omit<
TCourseCreateData,
E_COURSE_ENTITY_KEYS.CREDITS | E_COURSE_ENTITY_KEYS.TEACHERS
| E_COURSE_ENTITY_KEYS.CREDITS
| E_COURSE_ENTITY_KEYS.ID
| E_COURSE_ENTITY_KEYS.TEACHERS
> & {
[E_COURSE_ENTITY_KEYS.CREDITS]: string;
[E_COURSE_ENTITY_KEYS.TEACHERS]: Array<TApiUser>;
Expand All @@ -62,14 +64,15 @@ const CourseFormModal = ({
});

useEffect(() => {
if (initialData)
if (initialData) {
setData((prev) => ({
...prev,
...mapValues(
omit(initialData, [
E_COURSE_ENTITY_KEYS.CREDITS,
E_COURSE_ENTITY_KEYS.GUARANTOR,
E_COURSE_ENTITY_KEYS.TEACHERS,
E_COURSE_ENTITY_KEYS.ID,
]),
toString,
),
Expand All @@ -87,6 +90,7 @@ const CourseFormModal = ({
initialData[E_COURSE_ENTITY_KEYS.TEACHERS],
}),
}));
}
}, [initialData]);

const isSaveDisabled = useMemo(() => {
Expand Down Expand Up @@ -166,9 +170,9 @@ const CourseFormModal = ({
}

if (mode === E_MODAL_MODE.UPDATE) {
const abbr = initialData[E_COURSE_ENTITY_KEYS.ABBR];
const id = initialData[E_COURSE_ENTITY_KEYS.ID];

onSuccess(abbr, {
onSuccess(id, {
...data,
[E_COURSE_ENTITY_KEYS.CREDITS]: parseInt(
data[E_COURSE_ENTITY_KEYS.CREDITS],
Expand Down
2 changes: 1 addition & 1 deletion src/utils/router/routes.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ export const appRoutes: Array<TAppRoute> = [
element: <CoursesDataTable />,
},
{
path: '/courses/:abbr',
path: '/courses/:id',
label: 'Course info',
roles: [...courseManageRoles, E_ROLE.SCHEDULER, E_ROLE.STUDENT],
showInNav: false,
Expand Down