diff --git a/frontend/src/containers/WorkProgram/Prerequisites/Prerequisites.styles.ts b/frontend/src/containers/WorkProgram/Prerequisites/Prerequisites.styles.ts index 2cc708fac..f91ee1145 100644 --- a/frontend/src/containers/WorkProgram/Prerequisites/Prerequisites.styles.ts +++ b/frontend/src/containers/WorkProgram/Prerequisites/Prerequisites.styles.ts @@ -8,7 +8,6 @@ export default (theme: Theme) => createStyles({ }, addIcon: { marginTop: '10px', - marginLeft: 'auto', flex: 'none', marginBottom: '20px', }, @@ -38,5 +37,11 @@ export default (theme: Theme) => createStyles({ color: '#fff', display: 'flex', padding: '10px' + }, + buttonsWrapper: { + display: 'flex', + alignItems: 'center', + justifyContent: 'flex-end', + gap: '10px' } -}); \ No newline at end of file +}); diff --git a/frontend/src/containers/WorkProgram/Prerequisites/Prerequisites.tsx b/frontend/src/containers/WorkProgram/Prerequisites/Prerequisites.tsx index 7b2dea7ef..ac7af6d3f 100644 --- a/frontend/src/containers/WorkProgram/Prerequisites/Prerequisites.tsx +++ b/frontend/src/containers/WorkProgram/Prerequisites/Prerequisites.tsx @@ -17,6 +17,7 @@ import {fields, PrerequisiteFields} from "../enum"; import {TrainingEntitiesFields} from "../../TrainingEntities/enum"; import CreateModal from "./CreateModal"; +import RecommendationModal from "./RecommendationModal"; import {PrerequisiteType} from "../types"; import connect from './Prerequisites.connect'; @@ -27,6 +28,10 @@ class Prerequisites extends React.PureComponent { this.props.actions.openDialog({dialogType: fields.ADD_NEW_PREREQUISITES, data: {}}); }; + getRecommendations = () => { + this.props.actions.openDialog({dialogType: fields.GET_RECOMMENDATIONS, data: {}}); + }; + handleClickDelete = (id: number) => () => { this.props.actions.deletePrerequisite(id); }; @@ -37,7 +42,7 @@ class Prerequisites extends React.PureComponent { render() { const {classes, prerequisitesList, isCanEdit} = this.props; - + return (
@@ -81,15 +86,25 @@ class Prerequisites extends React.PureComponent { {isCanEdit && - +
+ + +
} {isCanEdit && } + {isCanEdit && }
); } diff --git a/frontend/src/containers/WorkProgram/Prerequisites/RecommendationModal/RecommendationModal.connect.ts b/frontend/src/containers/WorkProgram/Prerequisites/RecommendationModal/RecommendationModal.connect.ts new file mode 100644 index 000000000..af4649755 --- /dev/null +++ b/frontend/src/containers/WorkProgram/Prerequisites/RecommendationModal/RecommendationModal.connect.ts @@ -0,0 +1,28 @@ +import {Dispatch} from "react"; +import {connect} from 'react-redux'; +import {bindActionCreators} from "redux"; + +import {rootState} from "../../../../store/reducers"; + +import actions from "../../actions"; +import {isOpenDialog, getRecommendations} from '../../getters'; +import {WorkProgramActions} from "../../types"; +import {fields} from "../../enum"; + +import {TrainingEntitiesActions} from '../../../TrainingEntities/types'; +import {SubjectAreaActions} from '../../../SubjectArea/types'; + +const mapStateToProps = (state: rootState) => { + return { + isOpen: isOpenDialog(state, fields.GET_RECOMMENDATIONS), + recommendations: getRecommendations(state), + }; +}; + +const mapDispatchToProps = (dispatch: Dispatch) => ({ + // @ts-ignore + actions: bindActionCreators(actions, dispatch), +}); + +// @ts-ignore +export default connect(mapStateToProps, mapDispatchToProps); diff --git a/frontend/src/containers/WorkProgram/Prerequisites/RecommendationModal/RecommendationModal.styles.ts b/frontend/src/containers/WorkProgram/Prerequisites/RecommendationModal/RecommendationModal.styles.ts new file mode 100644 index 000000000..f78c38df5 --- /dev/null +++ b/frontend/src/containers/WorkProgram/Prerequisites/RecommendationModal/RecommendationModal.styles.ts @@ -0,0 +1,33 @@ +import {createStyles, Theme} from "@material-ui/core"; + +export default (theme: Theme) => createStyles({ + actions: { + padding: '15px 24px 20px' + }, + dialog: { + padding: 20, + }, + dialogTitle: { + display: 'flex', + alignItems: 'center' + }, + radioGroup: { + display: 'flex', + flexDirection: 'row', + marginBottom: '30px', + width: '550px' + }, + marginBottom30: { + marginBottom: '30px' + }, + link: { + marginRight: 'auto', + textDecoration: 'none', + color: theme.palette.primary.main, + }, + recommendations: { + display: 'flex', + flexWrap: 'wrap', + gap: '10px', + }, +}); diff --git a/frontend/src/containers/WorkProgram/Prerequisites/RecommendationModal/RecommendationModal.tsx b/frontend/src/containers/WorkProgram/Prerequisites/RecommendationModal/RecommendationModal.tsx new file mode 100644 index 000000000..4ba33373c --- /dev/null +++ b/frontend/src/containers/WorkProgram/Prerequisites/RecommendationModal/RecommendationModal.tsx @@ -0,0 +1,133 @@ +import React from 'react'; +import {shallowEqual} from "recompose"; + +import {RecommendationModalProps} from './types'; + +import Dialog from '@material-ui/core/Dialog'; +import DialogActions from '@material-ui/core/DialogActions'; +import DialogContent from '@material-ui/core/DialogContent'; +import DialogTitle from '@material-ui/core/DialogTitle'; +import Button from '@material-ui/core/Button'; +import Tooltip from "@material-ui/core/Tooltip"; +import withStyles from '@material-ui/core/styles/withStyles'; + +import HelpOutlineIcon from '@material-ui/icons/HelpOutline'; + +import {fields} from '../../enum'; + +import connect from './RecommendationModal.connect'; +import styles from './RecommendationModal.styles'; +import {Chip, Typography} from "@material-ui/core"; + +class RecommendationModal extends React.PureComponent { + state = { + selectedItems: [] as number[] + }; + + componentDidUpdate(prevProps: Readonly, prevState: Readonly<{}>, snapshot?: any) { + const {isOpen} = this.props; + + if (!shallowEqual(isOpen, prevProps.isOpen)){ + this.props.actions.getRecommendedPrerequisites(); + } + } + + handleClose = () => { + this.setState(() => ({ + selectedItems: [] + })); + this.props.actions.closeDialog(fields.GET_RECOMMENDATIONS); + }; + + handleSave = () => { + const {selectedItems} = this.state; + selectedItems.forEach((id) => { + this.props.actions.addPrerequisite({ + id: null, + masterylevel: '1', + item: { + id + } + }) + }); + this.handleClose(); + }; + + selectItem = (item: {id: number}) => { + const {selectedItems} = this.state; + + if (selectedItems.includes(item.id)) { + this.setState(() => ({ + selectedItems: this.state.selectedItems.filter((it) => it !== item.id) + })); + } else { + this.setState(() => ({ + selectedItems: [...this.state.selectedItems, item.id] + })); + } + }; + + render() { + const {isOpen, classes, recommendations} = this.props; + const {selectedItems} = this.state; + const disableButton = selectedItems.length === 0; + + const recommendationsContent = recommendations.length === 0 ? + Для вас пока нет рекомендаций. Они появятся позже на основе созданных вами РПД + : ( +
+ { + recommendations.map(({item}) => this.selectItem(item)} + label={item.name} + />) + } +
+ ); + + return ( + + +
+ Рекомендации пререквизитов + + Пререквизит - объект, отражающий конкретное знание из конкретной области + (далее "учебная сущность"), которое должно быть у студента перед началом изучения курса. + + } + > + + +
+
+ + {recommendationsContent} + + + + + +
+ ); + } +} + +export default connect(withStyles(styles)(RecommendationModal)); diff --git a/frontend/src/containers/WorkProgram/Prerequisites/RecommendationModal/index.ts b/frontend/src/containers/WorkProgram/Prerequisites/RecommendationModal/index.ts new file mode 100644 index 000000000..b534ef237 --- /dev/null +++ b/frontend/src/containers/WorkProgram/Prerequisites/RecommendationModal/index.ts @@ -0,0 +1 @@ +export {default} from './RecommendationModal'; diff --git a/frontend/src/containers/WorkProgram/Prerequisites/RecommendationModal/types.d.ts b/frontend/src/containers/WorkProgram/Prerequisites/RecommendationModal/types.d.ts new file mode 100644 index 000000000..2416d1f45 --- /dev/null +++ b/frontend/src/containers/WorkProgram/Prerequisites/RecommendationModal/types.d.ts @@ -0,0 +1,24 @@ +import {WithStyles} from "@material-ui/core"; +import {WorkProgramActions} from '../../types'; + +import styles from "./CreateModal.styles"; + +type RecommendationItem = { + id: number; + item: { + id: number; + name: string; + domain: { + id: number; + name: string; + }; + value: number; + } +} + +export interface RecommendationModalProps extends WithStyles { + actions: WorkProgramActions; + isOpen: boolean; + handleClose: Function; + recommendations: RecommendationItem[]; +} diff --git a/frontend/src/containers/WorkProgram/Results/RecommendationModal/RecommendationModal.connect.ts b/frontend/src/containers/WorkProgram/Results/RecommendationModal/RecommendationModal.connect.ts new file mode 100644 index 000000000..af4649755 --- /dev/null +++ b/frontend/src/containers/WorkProgram/Results/RecommendationModal/RecommendationModal.connect.ts @@ -0,0 +1,28 @@ +import {Dispatch} from "react"; +import {connect} from 'react-redux'; +import {bindActionCreators} from "redux"; + +import {rootState} from "../../../../store/reducers"; + +import actions from "../../actions"; +import {isOpenDialog, getRecommendations} from '../../getters'; +import {WorkProgramActions} from "../../types"; +import {fields} from "../../enum"; + +import {TrainingEntitiesActions} from '../../../TrainingEntities/types'; +import {SubjectAreaActions} from '../../../SubjectArea/types'; + +const mapStateToProps = (state: rootState) => { + return { + isOpen: isOpenDialog(state, fields.GET_RECOMMENDATIONS), + recommendations: getRecommendations(state), + }; +}; + +const mapDispatchToProps = (dispatch: Dispatch) => ({ + // @ts-ignore + actions: bindActionCreators(actions, dispatch), +}); + +// @ts-ignore +export default connect(mapStateToProps, mapDispatchToProps); diff --git a/frontend/src/containers/WorkProgram/Results/RecommendationModal/RecommendationModal.styles.ts b/frontend/src/containers/WorkProgram/Results/RecommendationModal/RecommendationModal.styles.ts new file mode 100644 index 000000000..f78c38df5 --- /dev/null +++ b/frontend/src/containers/WorkProgram/Results/RecommendationModal/RecommendationModal.styles.ts @@ -0,0 +1,33 @@ +import {createStyles, Theme} from "@material-ui/core"; + +export default (theme: Theme) => createStyles({ + actions: { + padding: '15px 24px 20px' + }, + dialog: { + padding: 20, + }, + dialogTitle: { + display: 'flex', + alignItems: 'center' + }, + radioGroup: { + display: 'flex', + flexDirection: 'row', + marginBottom: '30px', + width: '550px' + }, + marginBottom30: { + marginBottom: '30px' + }, + link: { + marginRight: 'auto', + textDecoration: 'none', + color: theme.palette.primary.main, + }, + recommendations: { + display: 'flex', + flexWrap: 'wrap', + gap: '10px', + }, +}); diff --git a/frontend/src/containers/WorkProgram/Results/RecommendationModal/RecommendationModal.tsx b/frontend/src/containers/WorkProgram/Results/RecommendationModal/RecommendationModal.tsx new file mode 100644 index 000000000..30debfe04 --- /dev/null +++ b/frontend/src/containers/WorkProgram/Results/RecommendationModal/RecommendationModal.tsx @@ -0,0 +1,134 @@ +import React from 'react'; +import {shallowEqual} from "recompose"; + +import {RecommendationModalProps} from './types'; + +import Dialog from '@material-ui/core/Dialog'; +import DialogActions from '@material-ui/core/DialogActions'; +import DialogContent from '@material-ui/core/DialogContent'; +import DialogTitle from '@material-ui/core/DialogTitle'; +import Button from '@material-ui/core/Button'; +import Tooltip from "@material-ui/core/Tooltip"; +import withStyles from '@material-ui/core/styles/withStyles'; + +import HelpOutlineIcon from '@material-ui/icons/HelpOutline'; + +import {fields} from '../../enum'; + +import connect from './RecommendationModal.connect'; +import styles from './RecommendationModal.styles'; +import {Chip, Typography} from "@material-ui/core"; + +class RecommendationModal extends React.PureComponent { + state = { + selectedItems: [] as number[] + }; + + componentDidUpdate(prevProps: Readonly, prevState: Readonly<{}>, snapshot?: any) { + const {isOpen} = this.props; + + if (!shallowEqual(isOpen, prevProps.isOpen)){ + this.props.actions.getRecommendedPrerequisites(); + } + } + + handleClose = () => { + this.setState(() => ({ + selectedItems: [] + })); + this.props.actions.closeDialog(fields.GET_RECOMMENDATIONS); + }; + + handleSave = () => { + const {selectedItems} = this.state; + selectedItems.forEach((id) => { + this.props.actions.addResult({ + id: null, + evaluation_tool: [], + masterylevel: '1', + item: { + id + } + }) + }); + this.handleClose(); + }; + + selectItem = (item: {id: number}) => { + const {selectedItems} = this.state; + + if (selectedItems.includes(item.id)) { + this.setState(() => ({ + selectedItems: this.state.selectedItems.filter((it) => it !== item.id) + })); + } else { + this.setState(() => ({ + selectedItems: [...this.state.selectedItems, item.id] + })); + } + }; + + render() { + const {isOpen, classes, recommendations} = this.props; + const {selectedItems} = this.state; + const disableButton = selectedItems.length === 0; + + const recommendationsContent = recommendations.length === 0 ? + Для вас пока нет рекомендаций. Заполните больше разделов в текущей РПД. + : ( +
+ { + recommendations.map(({item}) => this.selectItem(item)} + label={item.name} + />) + } +
+ ); + + return ( + + +
+ Рекомендации результатов + + Результат обучения - объект, отражающий конкретное знание из конкретной области + (далее "учебная сущность"), которым студент обладает после окончания курса. + + } + > + + +
+
+ + {recommendationsContent} + + + + + +
+ ); + } +} + +export default connect(withStyles(styles)(RecommendationModal)); diff --git a/frontend/src/containers/WorkProgram/Results/RecommendationModal/index.ts b/frontend/src/containers/WorkProgram/Results/RecommendationModal/index.ts new file mode 100644 index 000000000..b534ef237 --- /dev/null +++ b/frontend/src/containers/WorkProgram/Results/RecommendationModal/index.ts @@ -0,0 +1 @@ +export {default} from './RecommendationModal'; diff --git a/frontend/src/containers/WorkProgram/Results/RecommendationModal/types.d.ts b/frontend/src/containers/WorkProgram/Results/RecommendationModal/types.d.ts new file mode 100644 index 000000000..2416d1f45 --- /dev/null +++ b/frontend/src/containers/WorkProgram/Results/RecommendationModal/types.d.ts @@ -0,0 +1,24 @@ +import {WithStyles} from "@material-ui/core"; +import {WorkProgramActions} from '../../types'; + +import styles from "./CreateModal.styles"; + +type RecommendationItem = { + id: number; + item: { + id: number; + name: string; + domain: { + id: number; + name: string; + }; + value: number; + } +} + +export interface RecommendationModalProps extends WithStyles { + actions: WorkProgramActions; + isOpen: boolean; + handleClose: Function; + recommendations: RecommendationItem[]; +} diff --git a/frontend/src/containers/WorkProgram/Results/Results.styles.ts b/frontend/src/containers/WorkProgram/Results/Results.styles.ts index 88d74fa99..54e37642e 100644 --- a/frontend/src/containers/WorkProgram/Results/Results.styles.ts +++ b/frontend/src/containers/WorkProgram/Results/Results.styles.ts @@ -8,7 +8,6 @@ export default (theme: Theme) => createStyles({ }, addIcon: { marginTop: '10px', - marginLeft: 'auto', flex: 'none', marginBottom: '20px', }, @@ -54,4 +53,10 @@ export default (theme: Theme) => createStyles({ marginBottom: 5, marginTop: 5 }, -}); \ No newline at end of file + buttonsWrapper: { + display: 'flex', + alignItems: 'center', + justifyContent: 'flex-end', + gap: '10px' + } +}); diff --git a/frontend/src/containers/WorkProgram/Results/Results.tsx b/frontend/src/containers/WorkProgram/Results/Results.tsx index c7f205e40..f5442d0d9 100644 --- a/frontend/src/containers/WorkProgram/Results/Results.tsx +++ b/frontend/src/containers/WorkProgram/Results/Results.tsx @@ -18,6 +18,7 @@ import {EvaluationToolFields, fields, ResultsFields} from "../enum"; import {TrainingEntitiesFields} from "../../TrainingEntities/enum"; import CreateModal from "./CreateModal"; +import RecommendationModal from "./RecommendationModal"; import {ResultsType} from "../types"; import connect from './Results.connect'; @@ -28,6 +29,10 @@ class Results extends React.PureComponent { this.props.actions.openDialog({dialogType: fields.ADD_NEW_RESULT, data: {}}); }; + getRecommendations = () => { + this.props.actions.openDialog({dialogType: fields.GET_RECOMMENDATIONS, data: {}}); + }; + handleClickDelete = (id: number) => () => { this.props.actions.deleteResult(id); }; @@ -38,7 +43,7 @@ class Results extends React.PureComponent { render() { const {classes, resultsList, isCanEdit} = this.props; - + return (
@@ -94,15 +99,25 @@ class Results extends React.PureComponent { {isCanEdit && - +
+ + +
} {isCanEdit && } + {isCanEdit && }
); } diff --git a/frontend/src/containers/WorkProgram/actions.ts b/frontend/src/containers/WorkProgram/actions.ts index 5c373aaa8..252117097 100644 --- a/frontend/src/containers/WorkProgram/actions.ts +++ b/frontend/src/containers/WorkProgram/actions.ts @@ -68,6 +68,11 @@ const updateZUN = createAction('WORK_PROGRAM_UPDATE_ZUN'); const pageDown = createAction('WORK_PROGRAM_PAGE_DOWN'); +const getRecommendedPrerequisites = createAction('GET_RECOMMENDED_PREREQUISITES'); +const getRecommendedOutcomes = createAction('GET_RECOMMENDED_OUTCOMES'); + +const setRecommendedPrerequisites = createAction('SET_RECOMMENDED_PREREQUISITES'); + const actions: WorkProgramActions = { saveZUN, deleteZUN, @@ -135,6 +140,10 @@ const actions: WorkProgramActions = { deleteLiterature, addLiterature, -} + + getRecommendedOutcomes, + getRecommendedPrerequisites, + setRecommendedPrerequisites, +}; export default actions; diff --git a/frontend/src/containers/WorkProgram/enum.ts b/frontend/src/containers/WorkProgram/enum.ts index e6ff258dc..7595cd638 100644 --- a/frontend/src/containers/WorkProgram/enum.ts +++ b/frontend/src/containers/WorkProgram/enum.ts @@ -20,6 +20,7 @@ export enum fields { ADD_NEW_MATERIAL_TO_TOPIC = 'ADD_NEW_MATERIAL_TO_TOPIC', ADD_NEW_LITERATURE = 'ADD_NEW_LITERATURE', ADD_NEW_PREREQUISITES = 'ADD_NEW_PREREQUISITES', + GET_RECOMMENDATIONS = 'GET_RECOMMENDATIONS', CREATE_NEW_EVALUATION_TOOLS = 'CREATE_NEW_EVALUATION_TOOLS', SHOW_EVALUATION_TOOLS_DESCRIPTION = 'SHOW_EVALUATION_TOOLS_DESCRIPTION', ADD_NEW_RESULT = 'ADD_NEW_RESULT', @@ -28,6 +29,8 @@ export enum fields { CREATE_NEW_INTERMEDIATE_CERTIFICATION = 'CREATE_NEW_INTERMEDIATE_CERTIFICATION', SHOW_INTERMEDIATE_CERTIFICATION_DESCRIPTION = 'SHOW_INTERMEDIATE_CERTIFICATION_DESCRIPTION', + + RECOMMENDATIONS = 'RECOMMENDATIONS', } export enum WorkProgramGeneralFields { @@ -150,6 +153,8 @@ export enum fetchingTypes { GET_COMMENTS = 'GET_COMMENTS', CREATE_COMMENT = 'CREATE_COMMENT', + + GET_RECOMMENDED_PREREQUISITES = 'GET_RECOMMENDED_PREREQUISITES', } export enum PrerequisiteFields { diff --git a/frontend/src/containers/WorkProgram/getters.ts b/frontend/src/containers/WorkProgram/getters.ts index 6bc4e74c7..a04ceb2ef 100644 --- a/frontend/src/containers/WorkProgram/getters.ts +++ b/frontend/src/containers/WorkProgram/getters.ts @@ -81,4 +81,8 @@ export const getPlanQualifications = (state: rootState) => { return plans.map((p: any) => get(p, path, '')); } return []; -} \ No newline at end of file +}; + +export const getRecommendations = (state: rootState) => { + return get(getStateData(state), fields.RECOMMENDATIONS, []); +}; diff --git a/frontend/src/containers/WorkProgram/logics.ts b/frontend/src/containers/WorkProgram/logics.ts index fe4e2e0ca..522a5e17a 100644 --- a/frontend/src/containers/WorkProgram/logics.ts +++ b/frontend/src/containers/WorkProgram/logics.ts @@ -24,6 +24,8 @@ import commentsLogics from './logics/comments.logics'; import zunsLogics from './logics/zuns.logics'; import {appRouter} from "../../service/router-service"; +import {getUserData} from "../../layout/getters"; +import {useSelector} from "react-redux"; const service = new Service(); @@ -266,6 +268,30 @@ const approveWorkProgram = createLogic({ } }); +const getRecommendedPrerequisites = createLogic({ + type: workProgramActions.getRecommendedPrerequisites.type, + latest: true, + process({getState, action}: any, dispatch, done) { + const state = getState(); + const userData = getUserData(state); + const {id} = userData; + + dispatch(actions.fetchingTrue({destination: fetchingTypes.GET_RECOMMENDED_PREREQUISITES})); + service.getRecommendedPrerequisites(id) + .then((data) => { + dispatch(workProgramActions.setRecommendedPrerequisites(data)); + dispatch(actions.fetchingSuccess()); + }) + .catch((err) => { + dispatch(actions.fetchingFailed(err)); + }) + .then(() => { + dispatch(actions.fetchingFalse({destination: fetchingTypes.GET_RECOMMENDED_PREREQUISITES})); + return done(); + }); + } +}); + export default [ ...sectionLogics, ...topicLogics, @@ -285,4 +311,5 @@ export default [ sendToIsu, approveWorkProgram, sendWorkProgramToArchive, + getRecommendedPrerequisites, ]; diff --git a/frontend/src/containers/WorkProgram/reducer.ts b/frontend/src/containers/WorkProgram/reducer.ts index 6290f3385..9d0f83114 100644 --- a/frontend/src/containers/WorkProgram/reducer.ts +++ b/frontend/src/containers/WorkProgram/reducer.ts @@ -88,6 +88,11 @@ const closeDialog = (state: workProgramState, {payload}: any): workProgramState } }); +const setRecommendedPrerequisites = (state: workProgramState, {payload}: any): workProgramState => ({ + ...state, + [fields.RECOMMENDATIONS]: payload.data.results +}); + const pageDown = (): workProgramState => initialState; export const reducer = createReducer(initialState, { @@ -105,4 +110,6 @@ export const reducer = createReducer(initialState, { [actions.setWorkProgramEvaluationTool.type]: setWorkProgramEvaluationTool, [actions.setIntermediateCertification.type]: setIntermediateCertification, [actions.pageDown.type]: pageDown, -}); \ No newline at end of file + + [actions.setRecommendedPrerequisites.type]: setRecommendedPrerequisites, +}); diff --git a/frontend/src/containers/WorkProgram/service.ts b/frontend/src/containers/WorkProgram/service.ts index 8f29fa1a9..135c85c0c 100644 --- a/frontend/src/containers/WorkProgram/service.ts +++ b/frontend/src/containers/WorkProgram/service.ts @@ -356,6 +356,10 @@ class WorkProgramService extends AnalyticsService{ getDownloadFileLink({ wpId, directionId, planId, year }: any) { return `${appConfigService.getApiBasePath()}/api/export/docx/${wpId}/${directionId}/${planId}/${year}` } + + getRecommendedPrerequisites(userId: number) { + return this.get(`/api/recommendation_of_prerequisites/${userId}`); + } } -export default WorkProgramService; \ No newline at end of file +export default WorkProgramService; diff --git a/frontend/src/containers/WorkProgram/types.d.ts b/frontend/src/containers/WorkProgram/types.d.ts index ca89c27c0..c82310117 100644 --- a/frontend/src/containers/WorkProgram/types.d.ts +++ b/frontend/src/containers/WorkProgram/types.d.ts @@ -13,6 +13,7 @@ import {CourseType} from "../Courses/types"; import {TrainingEntitityType} from "../TrainingEntities/types"; import {FolderActions, FolderType} from "../Profile/Folders/types"; import {CommentType} from "../../components/Comments/types"; +import {RecommendationItem} from "./Prerequisites/RecommendationModal/types"; export interface WorkProgramActions { @@ -81,6 +82,10 @@ export interface WorkProgramActions { addTopicMaterial: any; updateTopicMaterial: any; deleteTopicMaterial: any; + + getRecommendedPrerequisites: any; + getRecommendedOutcomes: any; + setRecommendedPrerequisites: any; } export interface workProgramState { @@ -92,6 +97,7 @@ export interface workProgramState { [fields.WORK_PROGRAM_RESULTS]: Array; [fields.DIALOGS]: {}; [fields.WORK_PROGRAM_COMMENTS]: Array; //todo: change type + [fields.RECOMMENDATIONS]: RecommendationItem[]; } export type WorkProgramGeneralType = { @@ -212,4 +218,4 @@ export type WorkProgramStatusType = WorkProgramStatusEnum.EXPERTISE | WorkProgramStatusEnum.APPROVE | WorkProgramStatusEnum.ARCHIVE -; \ No newline at end of file +;