diff --git a/src/assets/colors.scss b/src/assets/colors.scss
index 9ed2a4ca..b2f20cef 100644
--- a/src/assets/colors.scss
+++ b/src/assets/colors.scss
@@ -1,20 +1,28 @@
-// Color variables
+// Primary
$primary: #007394;
$primary-dark: #003057;
+
+// General
$color-black: #020917;
-$black-80: #333;
$color-white: #fefefe;
$color-gray: #60646d;
-$gray-70: #666666;
-$gray-60: #808080;
-$gray-30: #d3d3d3;
-$gray-20: #dfe1e1;
$color-pink: #ffecf0;
$color-green: #e7f7eb;
$color-yellow: #fafbe5;
$color-purple: #f4e3ee;
-$blue-20: #e4faff;
-
-$hyperlink-color: #17897c;
$color-active-button: #989ba3;
+$hyperlink-color: #17897c;
$bg-main-color: #f3f3f3;
+
+// Gray
+$gray-20: #dfe1e1;
+$gray-30: #d3d3d3;
+$gray-60: #808080;
+$gray-70: #666666;
+
+// Blue
+$blue-20: #e4faff;
+
+// Black
+$black: #000;
+$black-80: #333;
diff --git a/src/assets/global.scss b/src/assets/global.scss
index 82b2647b..71bc795e 100644
--- a/src/assets/global.scss
+++ b/src/assets/global.scss
@@ -1,8 +1,9 @@
@import "assets/colors.scss";
+@import "assets/variables.scss";
.page-content-container {
border: 1px solid $gray-20;
- border-radius: 0.375rem;
+ border-radius: $border-radius-1;
padding: 20px 0;
box-shadow: 0px 3px 12px 0px $gray-30;
background-color: $color-white;
@@ -17,7 +18,7 @@
.filter-container .filters {
border: 1px solid $gray-20;
- border-radius: 0.375rem;
+ border-radius: $border-radius-1;
padding: 1.5rem 1rem;
}
@@ -34,3 +35,7 @@
list-style-type: none;
padding-left: 0;
}
+
+.link {
+ color: $primary !important;
+}
diff --git a/src/assets/variables.scss b/src/assets/variables.scss
index c4975236..32145216 100644
--- a/src/assets/variables.scss
+++ b/src/assets/variables.scss
@@ -2,3 +2,6 @@
$font-family: "Open Sans", sans-serif;
$account-menu-box-shadow: 2px 3px 8px 0 rgba(0, 0, 0, 0.5);
+
+
+$border-radius-1: 0.375rem;
diff --git a/src/features/Classes/data/thunks.js b/src/features/Classes/data/thunks.js
index 0091b763..1cc25b3a 100644
--- a/src/features/Classes/data/thunks.js
+++ b/src/features/Classes/data/thunks.js
@@ -7,12 +7,12 @@ import {
} from 'features/Classes/data/slice';
import { getClassesByInstitution } from 'features/Common/data/api';
-function fetchClassesData(id, currentPage) {
+function fetchClassesData(id, currentPage, courseName = '') {
return async (dispatch) => {
dispatch(fetchClassesDataRequest);
try {
- const response = camelCaseObject(await getClassesByInstitution(id, '', true, '', currentPage));
+ const response = camelCaseObject(await getClassesByInstitution(id, courseName, true, '', currentPage));
dispatch(fetchClassesDataSuccess(response.data));
} catch (error) {
dispatch(fetchClassesDataFailed());
diff --git a/src/features/Courses/CourseDetailTable/__test__/columns.test.jsx b/src/features/Courses/CourseDetailTable/__test__/columns.test.jsx
new file mode 100644
index 00000000..547d067e
--- /dev/null
+++ b/src/features/Courses/CourseDetailTable/__test__/columns.test.jsx
@@ -0,0 +1,148 @@
+import { Provider } from 'react-redux';
+import { initializeStore } from 'store';
+import {
+ fireEvent,
+ render,
+ waitFor,
+} from '@testing-library/react';
+import '@testing-library/jest-dom/extend-expect';
+import { MemoryRouter, Route } from 'react-router-dom';
+
+import { columns } from 'features/Courses/CourseDetailTable/columns';
+
+describe('columns', () => {
+ test('returns an array of columns with correct properties', () => {
+ expect(columns).toBeInstanceOf(Array);
+ expect(columns).toHaveLength(7);
+
+ const [
+ className,
+ instructor,
+ enrollmentStatus,
+ studentsEnrolled,
+ maxStudents,
+ startDate,
+ endDate,
+ ] = columns;
+
+ expect(className).toHaveProperty('Header', 'Class');
+ expect(className).toHaveProperty('accessor', 'className');
+
+ expect(instructor).toHaveProperty('Header', 'Instructor');
+ expect(instructor).toHaveProperty('accessor', 'instructors');
+
+ expect(enrollmentStatus).toHaveProperty('Header', 'Enrollment status');
+ expect(enrollmentStatus).toHaveProperty('accessor', 'numberOfPendingStudents');
+
+ expect(studentsEnrolled).toHaveProperty('Header', 'Students Enrolled');
+ expect(studentsEnrolled).toHaveProperty('accessor', 'numberOfStudents');
+
+ expect(maxStudents).toHaveProperty('Header', 'Max');
+ expect(maxStudents).toHaveProperty('accessor', 'maxStudents');
+
+ expect(startDate).toHaveProperty('Header', 'Start date');
+ expect(startDate).toHaveProperty('accessor', 'startDate');
+
+ expect(endDate).toHaveProperty('Header', 'End date');
+ expect(endDate).toHaveProperty('accessor', 'endDate');
+ });
+
+ test('Should render the title into a span tag', () => {
+ const title = columns[0].Cell({ row: { values: { className: 'Class example' } } });
+ expect(title).toHaveProperty('type', 'span');
+ expect(title.props).toEqual({ className: 'text-truncate', children: 'Class example' });
+ });
+
+ test('Should render the dates', () => {
+ const startDate = columns[5].Cell({ row: { values: { startDate: '2024-02-13T17:42:22Z' } } });
+ expect(startDate).toBe('02/13/24');
+
+ const endDate = columns[5].Cell({ row: { values: { startDate: '2024-04-13T17:42:22Z' } } });
+ expect(endDate).toBe('04/13/24');
+
+ const nullDate = columns[5].Cell({ row: { values: { startDate: null } } });
+ expect(nullDate).toBe('-');
+
+ const nullDate2 = columns[6].Cell({ row: { values: { startDate: null } } });
+ expect(nullDate2).toBe('-');
+ });
+
+ test('Should render the enrollment status', () => {
+ const pendingStudents = { row: { values: { numberOfStudents: 3, numberOfPendingStudents: 1 } } };
+
+ const enrollmentStatus = columns[2].Cell(pendingStudents);
+ expect(enrollmentStatus.props).toEqual({ children: ['Pending (', 1, ')'], light: true, variant: 'warning' });
+
+ const completeStudents = { row: { values: { numberOfStudents: 3, numberOfPendingStudents: 0 } } };
+
+ const enrollmentStatusComplete = columns[2].Cell(completeStudents);
+ expect(enrollmentStatusComplete.props).toEqual({ children: 'Complete', light: true, variant: 'success' });
+ });
+
+ test('Should render the students enrolled', () => {
+ const values = { row: { values: { numberOfStudents: 3, numberOfPendingStudents: 1 } } };
+
+ const studentsEnrolled = columns[3].Cell(values);
+ expect(studentsEnrolled).toHaveProperty('type', 'span');
+ expect(studentsEnrolled.props).toEqual({ children: [3, ' / ', 4] });
+ });
+
+ test('Should render the instructors', () => {
+ const values = {
+ row: {
+ values: { instructors: ['Sam Sepiol'] },
+ original: {
+ classId: 'Demo Course 1',
+ },
+ },
+ };
+
+ const Component = () => columns[1].Cell(values);
+
+ const store = initializeStore();
+ const { container } = render(
+
+
+
+
+
+
+ ,
+ );
+
+ expect(container.querySelector('li').textContent).toBe('Sam Sepiol');
+ });
+
+ test('Should render the assign button if instructor is not present', async () => {
+ const store = initializeStore();
+ const values = {
+ row: {
+ values: { instructors: [] },
+ original: {
+ classId: 'Demo Course 1',
+ },
+ },
+ };
+
+ const ComponentNoInstructor = () => columns[1].Cell(values);
+ const { container, getAllByText } = render(
+
+
+
+
+
+
+ ,
+ );
+
+ const modalButton = container.querySelector('button');
+ expect(modalButton).toBeInTheDocument();
+
+ fireEvent.click(modalButton);
+
+ await waitFor(() => {
+ const title = getAllByText('Assign instructor')[0];
+ expect(title).toBeInTheDocument();
+ });
+ });
+});
diff --git a/src/features/Courses/CourseDetailTable/__test__/index.test.jsx b/src/features/Courses/CourseDetailTable/__test__/index.test.jsx
new file mode 100644
index 00000000..32c0c52c
--- /dev/null
+++ b/src/features/Courses/CourseDetailTable/__test__/index.test.jsx
@@ -0,0 +1,69 @@
+import React from 'react';
+import '@testing-library/jest-dom';
+import { MemoryRouter, Route } from 'react-router-dom';
+import { render, screen } from '@testing-library/react';
+
+import { renderWithProviders } from 'test-utils';
+import CourseDetailTable from 'features/Courses/CourseDetailTable';
+import { columns } from 'features/Courses/CourseDetailTable/columns';
+
+describe('Course Details Table', () => {
+ test('Should render the table without data', () => {
+ render();
+ const emptyTableText = screen.getByText('No classes were found.');
+ expect(emptyTableText).toBeInTheDocument();
+ });
+
+ test('Should render the table with data', () => {
+ const mockStore = {
+ classes: {
+ table: {
+ data: [
+ {
+ masterCourseName: 'Demo MasterCourse 1',
+ className: 'Demo Class 1',
+ startDate: '09/21/24',
+ endDate: null,
+ numberOfStudents: 1,
+ maxStudents: 100,
+ instructors: ['instructor_1'],
+ },
+ {
+ masterCourseName: 'Demo MasterCourse 2',
+ className: 'Demo Class 2',
+ startDate: '09/21/25',
+ endDate: null,
+ numberOfStudents: 2,
+ maxStudents: 200,
+ instructors: ['instructor_2'],
+ },
+ ],
+ count: 2,
+ num_pages: 1,
+ current_page: 1,
+ },
+ },
+ };
+
+ const component = renderWithProviders(
+
+
+
+
+ ,
+ { preloadedState: mockStore },
+ );
+
+ expect(component.container).toHaveTextContent('Class');
+ expect(component.container).toHaveTextContent('Instructor');
+ expect(component.container).toHaveTextContent('Enrollment status');
+ expect(component.container).toHaveTextContent('Students Enrolled');
+ expect(component.container).toHaveTextContent('Max');
+ expect(component.container).toHaveTextContent('Start date');
+ expect(component.container).toHaveTextContent('End date');
+ });
+});
diff --git a/src/features/Courses/CourseDetailTable/columns.jsx b/src/features/Courses/CourseDetailTable/columns.jsx
new file mode 100644
index 00000000..a0c00da4
--- /dev/null
+++ b/src/features/Courses/CourseDetailTable/columns.jsx
@@ -0,0 +1,90 @@
+/* eslint-disable react/prop-types */
+import React, { useState } from 'react';
+import { Badge, Button } from 'react-paragon-topaz';
+import { useDispatch, useSelector } from 'react-redux';
+import { useParams } from 'react-router-dom';
+import { format } from 'date-fns';
+
+import { fetchClassesData } from 'features/Classes/data/thunks';
+import { updateClassSelected } from 'features/Instructors/data/slice';
+import AssignInstructors from 'features/Instructors/AssignInstructors';
+
+const columns = [
+ {
+ Header: 'Class',
+ accessor: 'className',
+ Cell: ({ row }) => ({row.values.className}),
+ },
+ {
+ Header: 'Instructor',
+ accessor: 'instructors',
+ Cell: ({ row }) => {
+ const { classId } = useParams();
+ const [isModalOpen, setIsModalOpen] = useState(false);
+
+ const dispatch = useDispatch();
+ const institution = useSelector((state) => state.main.selectedInstitution);
+
+ const handleOpenModal = () => {
+ dispatch(updateClassSelected(row.original.classId));
+ setIsModalOpen(true);
+ };
+
+ const handleCloseModal = () => {
+ dispatch(fetchClassesData(institution.id, 1, classId));
+ setIsModalOpen(false);
+ };
+
+ if (row.values.instructors?.length > 0) {
+ return (
+
+ {row.values.instructors.map(instructor => - {`${instructor}`}
)}
+
+ );
+ }
+
+ return (
+ <>
+
+
+ >
+ );
+ },
+ },
+ {
+ Header: 'Enrollment status',
+ accessor: 'numberOfPendingStudents',
+ Cell: ({ row }) => {
+ const isEnrollmentComplete = row.values.numberOfPendingStudents === 0;
+
+ return isEnrollmentComplete ? Complete : Pending ({row.values.numberOfPendingStudents});
+ },
+ },
+ {
+ Header: 'Students Enrolled',
+ accessor: 'numberOfStudents',
+ Cell: ({ row }) => ({row.values.numberOfStudents}{' / '}{row.values.numberOfStudents + row.values.numberOfPendingStudents}),
+ },
+ {
+ Header: 'Max',
+ accessor: 'maxStudents',
+ },
+ {
+ Header: 'Start date',
+ accessor: 'startDate',
+ Cell: ({ row }) => (row.values.startDate ? format(row.values.startDate, 'MM/dd/yy') : '-'),
+ },
+ {
+ Header: 'End date',
+ accessor: 'endDate',
+ Cell: ({ row }) => (row.values.endDate ? format(row.values.endDate, 'MM/dd/yy') : '-'),
+ },
+];
+
+export { columns };
diff --git a/src/features/Courses/CourseDetailTable/index.jsx b/src/features/Courses/CourseDetailTable/index.jsx
new file mode 100644
index 00000000..b585bca4
--- /dev/null
+++ b/src/features/Courses/CourseDetailTable/index.jsx
@@ -0,0 +1,37 @@
+import React, { useMemo } from 'react';
+import PropTypes from 'prop-types';
+import { IntlProvider } from 'react-intl';
+import DataTable from '@edx/paragon/dist/DataTable';
+
+import { columns } from 'features/Courses/CourseDetailTable/columns';
+
+const CourseDetailTable = ({ data, count }) => {
+ const COLUMNS = useMemo(() => columns, []);
+
+ return (
+
+
+
+
+
+
+
+ );
+};
+
+CourseDetailTable.propTypes = {
+ data: PropTypes.arrayOf(PropTypes.shape([])),
+ count: PropTypes.number,
+};
+
+CourseDetailTable.defaultProps = {
+ data: [],
+ count: 0,
+};
+
+export default CourseDetailTable;
diff --git a/src/features/Courses/CoursesDetailPage/__test__/index.test.jsx b/src/features/Courses/CoursesDetailPage/__test__/index.test.jsx
new file mode 100644
index 00000000..9e026087
--- /dev/null
+++ b/src/features/Courses/CoursesDetailPage/__test__/index.test.jsx
@@ -0,0 +1,106 @@
+import React from 'react';
+import { waitFor } from '@testing-library/react';
+import { MemoryRouter, Route } from 'react-router-dom';
+import '@testing-library/jest-dom/extend-expect';
+
+import { renderWithProviders } from 'test-utils';
+import CoursesDetailPage from 'features/Courses/CoursesDetailPage';
+
+jest.mock('@edx/frontend-platform/logging', () => ({
+ logError: jest.fn(),
+}));
+
+const mockStore = {
+ main: {
+ selectedInstitution: {
+ id: 1,
+ name: 'Institution 1',
+ shortName: 'Test',
+ active: true,
+ externalId: '',
+ created: '2023-06-22T22:48:56.124907Z',
+ modified: '2023-06-22T22:48:56.124907Z',
+ label: 'Institution 1',
+ value: 1,
+ },
+ },
+ courses: {
+ table: {
+ data: [
+ {
+ masterCourseName: 'Demo Course 1',
+ numberOfClasses: 3,
+ missingClassesForInstructor: 0,
+ numberOfStudents: 3,
+ numberOfPendingStudents: 0,
+ },
+ {
+ masterCourseName: 'Demo Course 2',
+ numberOfClasses: 3,
+ missingClassesForInstructor: 0,
+ numberOfStudents: 3,
+ numberOfPendingStudents: 0,
+ },
+ ],
+ count: 2,
+ num_pages: 1,
+ current_page: 1,
+ },
+ },
+ classes: {
+ table: {
+ data: [
+ {
+ masterCourseName: 'Demo MasterCourse 1',
+ className: 'Demo Class 1',
+ startDate: '09/21/24',
+ endDate: null,
+ numberOfStudents: 1,
+ maxStudents: 100,
+ instructors: ['instructor_1'],
+ },
+ {
+ masterCourseName: 'Demo MasterCourse 2',
+ className: 'Demo Class 2',
+ startDate: '09/21/25',
+ endDate: null,
+ numberOfStudents: 2,
+ maxStudents: 200,
+ instructors: ['instructor_2'],
+ },
+ ],
+ count: 2,
+ num_pages: 1,
+ current_page: 1,
+ },
+ },
+};
+
+describe('CoursesDetailPage', () => {
+ test('Should render the table and the course info', async () => {
+ const component = renderWithProviders(
+
+
+
+
+ ,
+ { preloadedState: mockStore },
+ );
+
+ waitFor(() => {
+ expect(component.container).toHaveTextContent('Demo Course 1 1');
+ expect(component.container).toHaveTextContent('Demo MasterCourse 1');
+ expect(component.container).toHaveTextContent('Demo MasterCourse 2');
+ expect(component.container).toHaveTextContent('Demo Class 1');
+ expect(component.container).toHaveTextContent('Demo Class 2');
+ expect(component.container).toHaveTextContent('09/21/24');
+ expect(component.container).toHaveTextContent('09/21/25');
+ expect(component.container).toHaveTextContent('1');
+ expect(component.container).toHaveTextContent('2');
+ expect(component.container).toHaveTextContent('100');
+ expect(component.container).toHaveTextContent('200');
+ expect(component.container).toHaveTextContent('instructor_1');
+ expect(component.container).toHaveTextContent('instructor_2');
+ });
+ });
+});
diff --git a/src/features/Courses/CoursesDetailPage/index.jsx b/src/features/Courses/CoursesDetailPage/index.jsx
new file mode 100644
index 00000000..644c568b
--- /dev/null
+++ b/src/features/Courses/CoursesDetailPage/index.jsx
@@ -0,0 +1,94 @@
+import React, { useState, useEffect } from 'react';
+import { Link, useParams } from 'react-router-dom';
+import { useDispatch, useSelector } from 'react-redux';
+import { Container, Pagination } from '@edx/paragon';
+
+import { fetchClassesData } from 'features/Classes/data/thunks';
+import { fetchCoursesData } from 'features/Courses/data/thunks';
+import { updateCurrentPage } from 'features/Courses/data/slice';
+import CourseDetailTable from 'features/Courses/CourseDetailTable';
+import { fetchClassesDataSuccess } from 'features/Classes/data/slice';
+import { initialPage } from 'features/constants';
+
+import 'features/Courses/CoursesDetailPage/index.scss';
+
+const CoursesDetailPage = () => {
+ const dispatch = useDispatch();
+ const { classId } = useParams();
+
+ const [currentPage, setCurrentPage] = useState(initialPage);
+
+ const defaultCourseInfo = {
+ numberOfStudents: '-',
+ numberOfPendingStudents: '-',
+ };
+
+ const courseInfo = useSelector((state) => state.courses.table.data)
+ .find((course) => course?.masterCourseName === classId) || defaultCourseInfo;
+ const institution = useSelector((state) => state.main.selectedInstitution);
+ const classes = useSelector((state) => state.classes.table);
+
+ const handlePagination = (targetPage) => {
+ setCurrentPage(targetPage);
+ dispatch(updateCurrentPage(targetPage));
+ };
+
+ useEffect(() => {
+ if (institution.id) {
+ dispatch(fetchClassesData(institution.id, 1, classId));
+ dispatch(fetchCoursesData(institution.id, 1, null));
+ }
+
+ const initialState = {
+ results: [],
+ count: 0,
+ numPages: 0,
+ };
+
+ return () => dispatch(fetchClassesDataSuccess(initialState));
+ }, [dispatch, institution.id, classId]);
+
+ return (
+
+
+
+
+
+
+
{classId}
+
+
+
+
+
Students enrolled
+
+ {courseInfo.numberOfStudents}
+ {' / '}
+ {courseInfo.numberOfStudents + courseInfo.numberOfPendingStudents}
+
+
+
+
+
Classes
+
{classes.count}
+
+
+
+
+
+ {classes.numPages > 1 && (
+
+ )}
+
+ );
+};
+
+export default CoursesDetailPage;
diff --git a/src/features/Courses/CoursesDetailPage/index.scss b/src/features/Courses/CoursesDetailPage/index.scss
new file mode 100644
index 00000000..e7cb99e5
--- /dev/null
+++ b/src/features/Courses/CoursesDetailPage/index.scss
@@ -0,0 +1,48 @@
+@import 'assets/variables.scss';
+@import 'assets/colors.scss';
+
+.card-container {
+ height: 100px;
+ padding: 0 1.5em;
+ padding-left: 2em;
+ padding-right: 4em;
+ background-color: $color-white;
+ border-radius: $border-radius-1;
+ box-shadow: 0px 3px 12px 0px rgba(0, 0, 0, 0.16);
+
+ .title {
+ font-size: 15px;
+ font-weight: 700;
+ color: $gray-70;
+ margin-bottom: 5px;
+ text-transform: uppercase;
+ }
+
+ .value {
+ display: block;
+ width: 100%;
+ color: $black;
+ }
+
+ .separator {
+ width: 2px;
+ height: 50px;
+ background-color: $gray-20;
+ }
+}
+
+.button {
+ height: 36px;
+}
+
+@media screen and (max-width: 576px) {
+ .card-container {
+ padding: 0 1.5em;
+ height: 115px;
+ padding-right: 4em;
+
+ .title {
+ margin-bottom: 5px;
+ }
+ }
+}
diff --git a/src/features/Courses/CoursesTable/_test_/index.test.jsx b/src/features/Courses/CoursesTable/_test_/index.test.jsx
index d54dc2a5..cc956c69 100644
--- a/src/features/Courses/CoursesTable/_test_/index.test.jsx
+++ b/src/features/Courses/CoursesTable/_test_/index.test.jsx
@@ -1,5 +1,6 @@
import React from 'react';
import '@testing-library/jest-dom';
+import { MemoryRouter, Route } from 'react-router-dom';
import { render, screen } from '@testing-library/react';
import CoursesTable from 'features/Courses/CoursesTable';
@@ -12,7 +13,7 @@ describe('Courses Table', () => {
expect(emptyTableText).toBeInTheDocument();
});
- test('renders CoursessTable with data', () => {
+ test('renders CoursesTable with data', () => {
const data = [
{
masterCourseName: 'Demo Course 1',
@@ -31,7 +32,11 @@ describe('Courses Table', () => {
];
const component = render(
- ,
+
+
+
+
+ ,
);
// Check if the table rows are present
diff --git a/src/features/Courses/CoursesTable/columns.jsx b/src/features/Courses/CoursesTable/columns.jsx
index 424fd187..9a3b40f4 100644
--- a/src/features/Courses/CoursesTable/columns.jsx
+++ b/src/features/Courses/CoursesTable/columns.jsx
@@ -1,11 +1,13 @@
/* eslint-disable react/prop-types, no-nested-ternary */
import React from 'react';
+import { Link } from 'react-router-dom';
import { Badge } from 'react-paragon-topaz';
const columns = [
{
Header: 'Courses',
accessor: 'masterCourseName',
+ Cell: ({ row }) => ({row.values.masterCourseName}),
},
{
Header: 'Classes',
diff --git a/src/features/Dashboard/DashboardPage/index.scss b/src/features/Dashboard/DashboardPage/index.scss
index a51d46bd..06a46432 100644
--- a/src/features/Dashboard/DashboardPage/index.scss
+++ b/src/features/Dashboard/DashboardPage/index.scss
@@ -1,4 +1,5 @@
@import "assets/colors.scss";
+@import "assets/variables.scss";
.license-section {
background-color: $color-white;
@@ -12,7 +13,7 @@
.license-section,
.instructor-assign-section {
box-shadow: 0px 3px 12px 0px rgba(0, 0, 0, 0.16);
- border-radius: 0.375rem;
+ border-radius: $border-radius-1;
}
.schedule-section {
diff --git a/src/features/Dashboard/WeeklySchedule/index.scss b/src/features/Dashboard/WeeklySchedule/index.scss
index 572f07ce..c4c918f0 100644
--- a/src/features/Dashboard/WeeklySchedule/index.scss
+++ b/src/features/Dashboard/WeeklySchedule/index.scss
@@ -1,10 +1,11 @@
@import "assets/colors.scss";
+@import "assets/variables.scss";
.header-schedule {
background-color: $primary;
padding: 1rem;
- border-top-right-radius: 0.375rem;
- border-top-left-radius: 0.375rem;
+ border-top-right-radius: $border-radius-1;
+ border-top-left-radius: $border-radius-1;
h3 {
color: $color-white;
@@ -14,7 +15,7 @@
.content-schedule {
box-shadow: 0px 3px 12px 0px rgba(0, 0, 0, 0.16);
- border-radius: 0.375rem;
+ border-radius: $border-radius-1;
.rdrDay:not(.rdrDayPassive) .rdrInRange ~ .rdrDayNumber span,
.rdrDay:not(.rdrDayPassive) .rdrStartEdge ~ .rdrDayNumber span,
@@ -41,7 +42,7 @@
}
.rdrCalendarWrapper {
- border-radius: 0.375rem;
+ border-radius: $border-radius-1;
}
.rdrMonthAndYearPickers select,
@@ -54,7 +55,7 @@
width: 100%;
background: $color-white;
padding: 0.8rem;
- border-radius: 0.375rem;
+ border-radius: $border-radius-1;
border-right: 1px solid $gray-20;
.class-schedule {
diff --git a/src/features/Instructors/AddInstructors/index.jsx b/src/features/Instructors/AddInstructors/index.jsx
index a7ee0b2f..ec757c55 100644
--- a/src/features/Instructors/AddInstructors/index.jsx
+++ b/src/features/Instructors/AddInstructors/index.jsx
@@ -1,4 +1,4 @@
-// This component will be modified according to the new wirefrime
+// This component will be modified according to the new wire frame
import React, { useState } from 'react';
import { useDispatch, useSelector } from 'react-redux';
diff --git a/src/features/Main/index.jsx b/src/features/Main/index.jsx
index b7e6e994..86d9f34d 100644
--- a/src/features/Main/index.jsx
+++ b/src/features/Main/index.jsx
@@ -16,6 +16,7 @@ import DashboardPage from 'features/Dashboard/DashboardPage';
import LicensesPage from 'features/Licenses/LicensesPage';
import ClassesPage from 'features/Classes/ClassesPage';
import { Select } from 'react-paragon-topaz';
+import CoursesDetailPage from 'features/Courses/CoursesDetailPage';
import { fetchInstitutionData } from 'features/Main/data/thunks';
import { updateSelectedInstitution } from 'features/Main/data/slice';
@@ -91,6 +92,9 @@ const Main = () => {
+
+
+
diff --git a/src/features/Students/StudentsMetrics/index.scss b/src/features/Students/StudentsMetrics/index.scss
index e1789063..d0b0dba6 100644
--- a/src/features/Students/StudentsMetrics/index.scss
+++ b/src/features/Students/StudentsMetrics/index.scss
@@ -1,9 +1,10 @@
@import "assets/colors.scss";
+@import "assets/variables.scss";
.container-cards {
border: 1px solid $gray-20;
padding: 2rem;
- border-radius: 0.375rem;
+ border-radius: $border-radius-1;
margin-bottom: 2rem;
box-shadow: 0px 3px 12px 0px rgba(0, 0, 0, 0.16);
background-color: $color-white;
diff --git a/src/features/constants.js b/src/features/constants.js
index d88a9759..3353f177 100644
--- a/src/features/constants.js
+++ b/src/features/constants.js
@@ -27,7 +27,7 @@ export const initialStateService = {
export const initialPage = 1;
/**
- * Constans for time.
+ * Constants for time.
* @readonly
* @number
*/