@@ -15,5 +18,6 @@ function FileCover(props) {
export default FileCover;
FileCover.propTypes = {
+ /** Function to close modals. */
close: PropTypes.func
};
\ No newline at end of file
diff --git a/src/components/customcheckbox/customCheckbox.js b/src/components/customcheckbox/customCheckbox.js
index 99b37fd..47ad5ab 100644
--- a/src/components/customcheckbox/customCheckbox.js
+++ b/src/components/customcheckbox/customCheckbox.js
@@ -2,6 +2,9 @@ import React, { Component } from 'react';
import PropTypes from 'prop-types';
import 'styles/main.scss';
+/**
+ * Component to render custom checkboxes.
+ */
class CustomCheckbox extends Component {
constructor(props) {
super(props);
@@ -14,10 +17,16 @@ class CustomCheckbox extends Component {
this.leave = this.leave.bind(this);
}
+ /**
+ * Highlight checkbox.
+ */
hover() {
this.setState({ hover: true });
}
+ /**
+ * Remove highlight from checkbox.
+ */
leave() {
this.setState({ hover: false });
}
@@ -39,9 +48,14 @@ class CustomCheckbox extends Component {
export default CustomCheckbox;
CustomCheckbox.propTypes = {
+ /** Identifies checked status of checkbox. */
value: PropTypes.bool,
+ /** Identifies the checkbox toggle status. */
handleChange: PropTypes.func,
+ /** Holds border color for checkbox. */
border: PropTypes.string,
+ /** Holds border color for checkbox on hover. */
borderhover: PropTypes.string,
+ /** Holds colour displayed on higlight. */
hover: PropTypes.string
};
diff --git a/src/components/error/error.js b/src/components/error/error.js
index 5ce6336..bd0202f 100644
--- a/src/components/error/error.js
+++ b/src/components/error/error.js
@@ -3,6 +3,9 @@ import PropTypes from 'prop-types';
import { Link } from 'react-router-dom';
import error from 'assets/error.svg';
+/**
+ * 404Page component for Studyportal.
+ */
function Error(props) {
return (
@@ -22,5 +25,6 @@ function Error(props) {
export default Error;
Error.propTypes = {
+ /** Function to close modals. */
close: PropTypes.func
};
diff --git a/src/components/header/header.js b/src/components/header/header.js
index 850241e..3278a0a 100644
--- a/src/components/header/header.js
+++ b/src/components/header/header.js
@@ -12,6 +12,9 @@ const mapStateToProps = state => {
return { user: state };
};
+/**
+ * Header component for Studyportal.
+ */
class Header extends Component {
render() {
return(
@@ -72,12 +75,18 @@ class Header extends Component {
export default connect(mapStateToProps)(Header);
Header.propTypes = {
+ /** Holds status of user-menu popup. */
userMenu: PropTypes.bool,
+ /** Holds status of notifications popup. */
notifications: PropTypes.bool,
+ /** Holds status of search result popup. */
search: PropTypes.bool,
+ /** Function to close modals. */
close: PropTypes.func,
+ /** Function to toggle state of modals. */
handleClick: PropTypes.func,
- handleSeeAll: PropTypes.func,
+ /** Function to toggle see-all modal. */
handleSeeAllClick: PropTypes.func,
+ /** Holds user data which is handled through Redux. */
user: PropTypes.object
};
diff --git a/src/components/header/search.js b/src/components/header/search.js
index b2a8dbd..9db311c 100644
--- a/src/components/header/search.js
+++ b/src/components/header/search.js
@@ -8,6 +8,9 @@ import { getSearchResults } from 'api/searchApi';
import { Link } from 'react-router-dom';
import emoji from 'assets/mdi_sentiment_very_dissatisfied.svg';
+/**
+ * Component to render search.
+ */
class Search extends Component {
constructor(props) {
super(props);
@@ -28,6 +31,11 @@ class Search extends Component {
this.setState({ search:props.search });
}
+ /**
+ * Fetches search result.
+ *
+ * @param {string} query
+ */
getResults(query) {
getSearchResults(query).then((res,err) => {
if(err){
@@ -47,6 +55,11 @@ class Search extends Component {
});
}
+ /**
+ * Toggles search popup when text is typed in search bar.
+ *
+ * @param {object} e
+ */
result(e) {
this.setState({ value: e.target.value });
if (e.target.value !== '') {
@@ -164,10 +177,14 @@ class Search extends Component {
export default Search;
Search.propTypes = {
+ /** Holds status of search popup. */
search: PropTypes.bool,
+ /** Identifies whether search is in homepage. */
home: PropTypes.bool,
+ /** Function to close modals. */
close: PropTypes.func,
+ /** Function to toggle state of modals. */
handleClick: PropTypes.func,
- handleReqClick: PropTypes.func,
+ /** Function to toggle see-all modal. */
handleSeeAllClick: PropTypes.func
};
diff --git a/src/components/header/searchResult.js b/src/components/header/searchResult.js
index e5056bd..6818949 100644
--- a/src/components/header/searchResult.js
+++ b/src/components/header/searchResult.js
@@ -7,6 +7,9 @@ import ppt from 'assets/material_ppt.svg';
import img from 'assets/material_img.svg';
import 'styles/main.scss';
+/**
+ * Component to render files.
+ */
class SearchResult extends Component {
constructor(props) {
super(props);
@@ -53,11 +56,18 @@ class SearchResult extends Component {
export default SearchResult;
SearchResult.propTypes = {
+ /** Holds file name. */
name: PropTypes.string,
+ /** Holds driveid of the file. */
url: PropTypes.string,
+ /** Holds creation date of file. */
date_modified: PropTypes.string,
+ /** Holds course title related to file. */
course_name: PropTypes.string,
+ /** Holds course code related to file. */
course_code: PropTypes.string,
+ /** Holds the type of file. */
file_type: PropTypes.string,
+ /** Holds extension of file. */
ext: PropTypes.string
};
diff --git a/src/components/header/showMoreFiles.js b/src/components/header/showMoreFiles.js
index af18f07..b1d8968 100644
--- a/src/components/header/showMoreFiles.js
+++ b/src/components/header/showMoreFiles.js
@@ -5,6 +5,9 @@ import SearchResult from './searchResult';
import emoji from 'assets/mdi_sentiment_very_dissatisfied.svg';
import close from 'assets/closereq.png';
+/**
+ * Component to render see-all modal.
+ */
class ShowMoreFiles extends Component{
constructor(props){
super(props);
@@ -61,10 +64,16 @@ class ShowMoreFiles extends Component{
export default ShowMoreFiles;
ShowMoreFiles.propTypes = {
+ /** Holds search result files. */
files: PropTypes.array,
+ /** Holds search query string. */
searchquery: PropTypes.string,
+ /** Holds toggle status of see-all. */
showmore: PropTypes.bool,
+ /** Holds file name. */
handleSeeAll: PropTypes.func,
+ /** Function to toggle state of modals. */
handleClick: PropTypes.func,
+ /** Function to close modals. */
close: PropTypes.func
};
diff --git a/src/components/home/header.js b/src/components/home/header.js
index 2d6c40e..4a25f7e 100644
--- a/src/components/home/header.js
+++ b/src/components/home/header.js
@@ -12,6 +12,9 @@ const mapStateToProps = state => {
return { user: state };
};
+/**
+ * Header component for Studyportal homepage.
+ */
class Header extends Component {
render() {
return (
@@ -54,11 +57,18 @@ class Header extends Component {
export default connect(mapStateToProps)(Header);
Header.propTypes = {
+ /** Holds status of search result popup. */
search: PropTypes.bool,
+ /** Function to close modals. */
close: PropTypes.func,
+ /** Holds status of notifications popup. */
notifications: PropTypes.bool,
+ /** Holds status of user-menu popup. */
userMenu: PropTypes.bool,
+ /** Function to toggle state of modals. */
handleClick: PropTypes.func,
+ /** Function to toggle see-all modal. */
handleSeeAllClick: PropTypes.func,
+ /** Holds user data which is handled through Redux. */
user: PropTypes.object
};
diff --git a/src/components/home/subjectCard.js b/src/components/home/subjectCard.js
index f9892f6..f893062 100644
--- a/src/components/home/subjectCard.js
+++ b/src/components/home/subjectCard.js
@@ -1,7 +1,10 @@
-/* eslint-disable react/prop-types */
import React, { Component } from 'react';
+import PropTypes from 'prop-types';
import 'styles/main.scss';
+/**
+ * Component to render subject card.
+ */
class SubjectCard extends Component {
constructor(props) {
super(props);
@@ -12,6 +15,9 @@ class SubjectCard extends Component {
this.togglehover = this.togglehover.bind(this);
}
+ /**
+ * Toggles hover status on subjectcard.
+ */
togglehover() {
this.setState(prevState => ({
hover:!prevState.hover
@@ -31,3 +37,10 @@ class SubjectCard extends Component {
}
export default SubjectCard;
+
+SubjectCard.propTypes = {
+ /** Holds image url of department. */
+ url: PropTypes.string,
+ /** Holds department name. */
+ name: PropTypes.string
+};
diff --git a/src/components/request/request.js b/src/components/request/request.js
index 2f12b38..331a730 100644
--- a/src/components/request/request.js
+++ b/src/components/request/request.js
@@ -10,6 +10,9 @@ import check from 'assets/check.svg';
import 'styles/main.scss';
import { Link } from 'react-router-dom';
+/**
+ * Component to render request modal.
+ */
class Request extends Component {
constructor(props) {
super(props);
@@ -45,16 +48,27 @@ class Request extends Component {
});
}
+ /**
+ * Switches to course request.
+ */
switchToCourse() {
this.setState({ type:'course' });
this.setState({ disable: 0 });
}
+ /**
+ * Switches to file request.
+ */
switchToFile() {
this.setState({ type:'file' });
this.setState({ disableCourse: 0 });
}
+ /**
+ * Activates course select input.
+ *
+ * @param {object} e
+ */
file_active_course(e) {
this.setState({ disable: 1 });
getCourseByDepartment(e.target[e.target.selectedIndex].id).then((res,err) => {
@@ -67,22 +81,41 @@ class Request extends Component {
});
}
+ /**
+ * Activates material select input.
+ *
+ * @param {object} e
+ */
file_active_material(e) {
this.setState({ disable: 2 });
}
+ /**
+ * Activates file name input.
+ */
active_name() {
this.setState({ disable: 3 });
}
+ /**
+ * Activates course name input.
+ */
course_active_course() {
this.setState({ disableCourse: 1 });
}
+ /**
+ * Activates course code input.
+ */
course_active_courseid() {
this.setState({ disableCourse: 2 });
}
+ /**
+ * Requests file through API.
+ *
+ * @param {object} e
+ */
requestFile(e) {
e.preventDefault();
const course = e.target.course[e.target.course.selectedIndex].id;
@@ -98,6 +131,11 @@ class Request extends Component {
}
}
+ /**
+ * Requests course through API.
+ *
+ * @param {object} e
+ */
requestCourse(e) {
e.preventDefault();
const department = e.target.department.value;
@@ -111,12 +149,14 @@ class Request extends Component {
});
}
+ /**
+ * Refreshes request modal.
+ */
refreshRequest() {
//TODO refresh upload
}
render() {
-
if (this.props.request) {
return(
@@ -282,6 +322,8 @@ class Request extends Component {
export default Request;
Request.propTypes = {
+ /** Holds toggle status of request modal. */
request: PropTypes.bool,
+ /** Function to close modals. */
close: PropTypes.func
};
diff --git a/src/components/sidebar/courseHandle.js b/src/components/sidebar/courseHandle.js
index edac6c7..63d069b 100644
--- a/src/components/sidebar/courseHandle.js
+++ b/src/components/sidebar/courseHandle.js
@@ -10,6 +10,9 @@ function mapStateToProps(state) {
return { user: state };
}
+/**
+ * Component to render course in sidebar.
+ */
class CourseHandle extends Component {
constructor(props) {
super(props);
@@ -54,10 +57,16 @@ class CourseHandle extends Component {
}
}
+ /**
+ * Activates associated course.
+ */
activatecourse() {
this.props.handleClick(this.props.name);
}
+ /**
+ * Check if course is registered for user.
+ */
checkMyCourse(props) {
if(props.user.courses.find(o => o.code === props.code) !== undefined)
return true;
diff --git a/src/components/sidebar/sidebar.js b/src/components/sidebar/sidebar.js
index 77f1de9..10f4e0d 100644
--- a/src/components/sidebar/sidebar.js
+++ b/src/components/sidebar/sidebar.js
@@ -14,6 +14,9 @@ const mapStateToProps = state => {
return { user: state };
};
+/**
+ * Sidebar component for Studyportal homepage.
+ */
class Sidebar extends Component {
constructor(props) {
super(props);
@@ -49,11 +52,19 @@ class Sidebar extends Component {
this.setState({ login:nextProps.activity, department: nextProps.department });
}
+ /**
+ * Activates course.
+ */
handleClick(active) {
this.active = active;
this.forceUpdate();
}
+ /**
+ * Fetches course from API.
+ *
+ * @param {object} e
+ */
getCourse(e) {
getCourseByDepartment(e.target[e.target.selectedIndex].id).then((res,err) => {
if(err) {
@@ -65,10 +76,20 @@ class Sidebar extends Component {
});
}
+ /**
+ * Sets selected course into state.
+ *
+ * @param {object} e
+ */
setCourse(e) {
this.setState({ course:e.target[e.target.selectedIndex].id });
}
+ /**
+ * Registers course for the user.
+ *
+ * @param {object} e
+ */
addCourse(e) {
e.preventDefault();
const token = getCookie('token');
@@ -202,13 +223,22 @@ class Sidebar extends Component {
export default connect(mapStateToProps)(Sidebar);
Sidebar.propTypes = {
+ /** Holds currently active course. */
active: PropTypes.string,
+ /** Holds status of activity route. */
activity: PropTypes.string,
+ /** Holds current department title. */
department: PropTypes.string,
+ /** Fetch user details from API. */
getUserDetails: PropTypes.func,
+ /** Holds user login status. */
login: PropTypes.bool,
+ /** Function to close modals. */
close: PropTypes.func,
+ /** Holds user data which is handled through Redux. */
user: PropTypes.object,
+ /** Holds course list displayed. */
courses: PropTypes.array,
+ /** Holds department abbreviation for the current department. */
department_abbr: PropTypes.string
};
diff --git a/src/components/upload/customFileUploader.js b/src/components/upload/customFileUploader.js
index 6c07926..8b0d32f 100644
--- a/src/components/upload/customFileUploader.js
+++ b/src/components/upload/customFileUploader.js
@@ -7,6 +7,9 @@ import small_loader from 'assets/loader_small.svg';
import check from 'assets/check.svg';
import 'styles/main.scss';
+/**
+ * Component to render file uploader.
+ */
class CustomFileUploader extends Component {
constructor(props) {
super(props);
@@ -17,6 +20,11 @@ class CustomFileUploader extends Component {
this.handleRemove = this.handleRemove.bind(this);
}
+ /**
+ * Adds files to upload queue.
+ *
+ * @param {object} e
+ */
addFiles(e) {
const file = e.target.files;
@@ -29,6 +37,11 @@ class CustomFileUploader extends Component {
this.forceUpdate();
}
+ /**
+ * Removes files from upload queue.
+ *
+ * @param {number} index
+ */
handleRemove(index) {
this.files.splice(index,1);
this.props.getFiles(this.files);
@@ -105,11 +118,18 @@ class CustomFileUploader extends Component {
export default CustomFileUploader;
CustomFileUploader.propTypes = {
+ /** Function to get files in upload queue. */
getFiles: PropTypes.func,
+ /** Function to modify upload modal. */
handleUpload: PropTypes.func,
+ /** Holds completed status of ongoing upload. */
uploaded: PropTypes.bool,
+ /** Holds list of ongoing uploads. */
uploadings: PropTypes.array,
+ /** Holds list of uploaded files. */
uploadeds: PropTypes.array,
+ /** Holds disabled status of upload queue. */
disabled: PropTypes.bool,
+ /** Holds running status of ongoing upload. */
uploading: PropTypes.bool
};
diff --git a/src/components/upload/fileUploadContainer.js b/src/components/upload/fileUploadContainer.js
index cfca487..765e32b 100644
--- a/src/components/upload/fileUploadContainer.js
+++ b/src/components/upload/fileUploadContainer.js
@@ -5,6 +5,9 @@ import small_loader from 'assets/small_loader.svg';
import check from 'assets/check.svg';
import 'styles/main.scss';
+/**
+ * Component to render uploading file.
+ */
class FileUploadContainer extends Component {
constructor(props) {
super(props);
@@ -23,10 +26,18 @@ class FileUploadContainer extends Component {
this.setState({ uploading:nextProps.uploading,uploaded:nextProps.uploaded });
}
+ /**
+ * Updates file type for queued file.
+ *
+ * @param {object} e
+ */
updateFileType(e) {
this.props.files[this.props.index].type = e.target.value;
}
+ /**
+ * Removes file from upload queue.
+ */
handleRemove() {
this.props.handleRemove(this.props.index);
}
@@ -60,11 +71,18 @@ class FileUploadContainer extends Component {
export default FileUploadContainer;
FileUploadContainer.propTypes = {
+ /** Holds files in upload queue. */
files: PropTypes.array,
+ /** Holds running status of ongoing upload for current file. */
uploading: PropTypes.bool,
+ /** Holds completed status of ongoing upload for current file. */
uploaded: PropTypes.bool,
+ /** Holds index of current file in upload queue. */
index: PropTypes.number,
+ /** Holds name of file. */
name: PropTypes.string,
+ /** Holds status of select input. */
disabled: PropTypes.bool,
+ /** Function to remove file from upload queue. */
handleRemove: PropTypes.func
};
diff --git a/src/components/upload/upload.js b/src/components/upload/upload.js
index e0e6b3e..9921af7 100644
--- a/src/components/upload/upload.js
+++ b/src/components/upload/upload.js
@@ -8,6 +8,9 @@ import { getCourseByDepartment } from 'api/courseApi';
import { getCookie } from 'utils/handleCookies';
import 'styles/main.scss';
+/**
+ * Component to render upload modal.
+ */
class Upload extends Component {
constructor(props) {
super(props);
@@ -46,6 +49,11 @@ class Upload extends Component {
});
}
+ /**
+ * Activates course select input.
+ *
+ * @param {object} e
+ */
active_course(e) {
this.setState({ disable: 1, department: e.target[e.target.selectedIndex].id });
getCourseByDepartment(e.target[e.target.selectedIndex].id).then((res,err) => {
@@ -58,23 +66,44 @@ class Upload extends Component {
});
}
+ /**
+ * Activates material select input.
+ *
+ * @param {object} e
+ */
active_material(e) {
this.setState({ disable: 2, course: e.target[e.target.selectedIndex].id });
}
+ /**
+ * Closes upload modal.
+ */
toggleUploadModal() {
this.setState({ active:false });
this.props.close();
}
+ /**
+ * Switches to upload queue.
+ */
handleUpload() {
this.setState({ active: true });
}
+ /**
+ * Fetches files list from upload queue.
+ *
+ * @param {array} files
+ */
getFiles(files) {
this.setState({ files });
}
+ /**
+ * Uploads files through API.
+ *
+ * @param {object} e
+ */
async upload(e) {
e.preventDefault();
const token = getCookie('token');
@@ -102,6 +131,9 @@ class Upload extends Component {
}
}
+ /**
+ * Refreshes upload modal.
+ */
refreshUpload() {
//TODO refresh upload
}
@@ -175,6 +207,8 @@ class Upload extends Component {
export default Upload;
Upload.propTypes = {
+ /** Holds toggle status of upload modal. */
upload: PropTypes.bool,
+ /** Function to close modals. */
close: PropTypes.func
-};
\ No newline at end of file
+};
diff --git a/src/pages/department.js b/src/pages/department.js
index 6b74c7a..70f9d9d 100644
--- a/src/pages/department.js
+++ b/src/pages/department.js
@@ -452,9 +452,9 @@ export default connect(mapStateToProps,mapDispatchToProps)(Department);
Department.propTypes = {
/** Holds user data which is handled through Redux. */
user: PropTypes.object,
- /** URL of present location */
+ /** URL of present location. */
location: PropTypes.object,
- /** Sets 404 page */
+ /** Sets 404 page. */
error: PropTypes.bool,
/** Sets user data in Redux. */
setUser: PropTypes.func,