diff --git a/src/components/sites/doExerciseSite/afterEditorPanel/afterEditorPanelView.tsx b/src/components/sites/doExerciseSite/afterEditorPanel/afterEditorPanelView.tsx index 91bc8d9f6ea15fa1c9d04940d3cdeb030c5c6e15..e050a38f5d3f3f82a602ff78e5bbc11cac2cf39c 100644 --- a/src/components/sites/doExerciseSite/afterEditorPanel/afterEditorPanelView.tsx +++ b/src/components/sites/doExerciseSite/afterEditorPanel/afterEditorPanelView.tsx @@ -9,7 +9,7 @@ import {returntypeof} from 'react-redux-typescript'; import {RootState} from "../../../../state/reducers"; import MultiTabCodeEditorWrapper from '../../../codeEditors/multiTabCodeEditorWrapper' import { - closeTabChangeAfterEditor, + closeTabChangeAfterEditor, onCreateFileAfterDoEditor, openTabChangeAfterEditor, setAfterEditor_hasFileChangedMap, setAfterEditor_hasUnsavedChanges, @@ -73,6 +73,7 @@ const mapDispatchToProps = (dispatch: Dispatch) => bindActionCreators({ setAfterEditor_renamingFileNameDoEditor, setAfterSolutionFiles, + onCreateFileAfterDoEditor, setSolutionFiles_AndRefreshEditor, }, dispatch) @@ -164,13 +165,8 @@ class afterEditorPanelView extends React.Component<Props, any> { isContentVisibleForUser: true, } - // this.props.setAfterSolutionFiles( - // [...this.props.afterSolution.solutionFiles, newFile] - // ) - - this.props.setSolutionFiles_AndRefreshEditor([...this.props.afterSolution.solutionFiles, newFile], - this.props.setAfterSolutionFiles - ) + //this also shows the new file + this.props.onCreateFileAfterDoEditor(newFile, this.props.afterSolution.solutionFiles, this.props.selectedTabIdDoEditor) }} diff --git a/src/components/sites/doExerciseSite/editorPanel/editorPanelView.tsx b/src/components/sites/doExerciseSite/editorPanel/editorPanelView.tsx index 245a3d380e00942bd7480277445f0604ae1509f0..90fa7a48c9c281467722b6d3057e3ac3d36ffed3 100644 --- a/src/components/sites/doExerciseSite/editorPanel/editorPanelView.tsx +++ b/src/components/sites/doExerciseSite/editorPanel/editorPanelView.tsx @@ -9,7 +9,7 @@ import {returntypeof} from 'react-redux-typescript'; import {RootState} from "../../../../state/reducers"; import MultiTabCodeEditorWrapper from '../../../codeEditors/multiTabCodeEditorWrapper' import { - closeTabChangeDoEditor, + closeTabChangeDoEditor, onCreateFileDoEditor, openTabChangeDoEditor, setHasFileChangedMapDoEditor, setHasUnsavedChanges, @@ -99,6 +99,7 @@ const mapDispatchToProps = (dispatch: Dispatch) => bindActionCreators({ setHasFileChangedMapDoEditor, setSolutionFiles_AndRefreshEditor, + onCreateFileDoEditor, }, dispatch) @@ -190,11 +191,8 @@ class editorPanelView extends React.Component<Props, any> { isContentVisibleForUser: true, } - this.props.setSolutionFiles_AndRefreshEditor([...this.props.solution.solutionFiles, newFile], - this.props.setSolutionFiles, - ) - - //this.props.setSolutionFiles_CreateFile([...this.props.solution.solutionFiles, newFile]) + //this also shows the new file + this.props.onCreateFileDoEditor(newFile, this.props.solution.solutionFiles, this.props.selectedTabIdDoEditor) }} diff --git a/src/constants.ts b/src/constants.ts index dfcac1b4c7bb9c6cd2358a98996424fa2253f942..e9158939a3edc9be05abd7d504b9cc5c8adf472c 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -13,7 +13,7 @@ import Logger from './helpers/logger' * y - breaking changes / new features * z - fixes, small changes */ -export const versionString = '2.10.4' +export const versionString = '2.10.5' export const supportMail = 'yapex@informatik.uni-halle.de' diff --git a/src/helpers/editorHelper.ts b/src/helpers/editorHelper.ts index b56873dbb114dce6fd558387b43bdb235160e2ee..c40aa52fd1d8bda5925857b8eae168a728af7da8 100644 --- a/src/helpers/editorHelper.ts +++ b/src/helpers/editorHelper.ts @@ -17,6 +17,8 @@ import {getI18n, KnownLangs} from "../../i18n/i18nRoot"; import {EditorWrapperTab} from "../components/codeEditors/aceEditors/aceEditorsStorageHelper"; import {defaultEditorMode} from '../constants' import {PLangFullBase} from '../types/pLangs' +import {openTabChangeCodeTemplate} from '../state/actions/exerciseEditorSite/dialogs/changeCodeTemplateDialog/changeCodeTemplateDialogActions' +import {openTabChangeDoEditor} from '../state/actions/doExerciseSite/editorActions/doEditorActions' /** @@ -1069,7 +1071,7 @@ function _userIsAllowedToSolveExercisePreview(preview: ExercisePreviewsFrontendE * so that we get always a valid editor state (with undo, selection...) * * - * if you wan't to call these funcs on your own see type MultiTabEditorState for usage + * if you want to call these funcs on your own see type MultiTabEditorState for usage * * @param {ReadonlyArray<SolutionFileDoExerciseFullBase>} solutionFiles * @param {(files: ReadonlyArray<SolutionFileDoExerciseFullBase>) => void} setSolutionFilesAction diff --git a/src/state/actions/doExerciseSite/editorActions/afterEditorActions.ts b/src/state/actions/doExerciseSite/editorActions/afterEditorActions.ts index eab7bafdcc5a7c067da65e5367f8bf896abf9c81..10944eebcddae23eee6758d33ca8f7a5c07cf61d 100644 --- a/src/state/actions/doExerciseSite/editorActions/afterEditorActions.ts +++ b/src/state/actions/doExerciseSite/editorActions/afterEditorActions.ts @@ -3,16 +3,22 @@ */ import { SET_afterEditor_hasFileChangedMapAction, - SET_afterEditor_hasUnsavedChangesAction, SET_afterEditor_isFileExplorerDisplayedDoEditorAction, + SET_afterEditor_hasUnsavedChangesAction, + SET_afterEditor_isFileExplorerDisplayedDoEditorAction, SET_afterEditor_isRenamingFileDoEditorAction, - SET_afterEditor_newFileNameDoEditorAction, SET_afterEditor_renamingFileIdDoEditorAction, + SET_afterEditor_newFileNameDoEditorAction, + SET_afterEditor_renamingFileIdDoEditorAction, SET_afterEditor_renamingFileNameDoEditorAction, SET_afterEditor_selectedTabIdDoEditorAction } from "../../../reducers/doExerciseSite/editorReducers/afterEditorReducer"; -import {changeTabVisibility, HasFileChangedMap} from "../../../../helpers/editorHelper"; +import { + changeTabVisibility, + HasFileChangedMap, + setSolutionFiles_AndRefreshEditor +} from "../../../../helpers/editorHelper"; import {ActionType} from "../../../reducers/doExerciseSite/doExerciseSiteActionTypes"; import {SolutionFileDoExerciseFullBase} from "../../../../types/exerciseSolution"; -import {MultiActions} from "../../types"; +import {AwaitActions, MultiActions} from "../../types"; import {setAfterSolutionFiles} from "../doExerciseSiteActions"; export function setAfterEditor_hasUnsavedChanges(hasUnsavedChanges: boolean): SET_afterEditor_hasUnsavedChangesAction { @@ -38,6 +44,30 @@ export function setAfterEditor_hasFileChangedMap(hasFileChangedMap: HasFileChang } +/** + * + * @param newFile + * @param solutionFiles + * @param selectedEditorTabId the currently (old) selected tab id + */ +export function onCreateFileAfterDoEditor(newFile: SolutionFileDoExerciseFullBase, + solutionFiles: ReadonlyArray<SolutionFileDoExerciseFullBase>, + selectedEditorTabId: number): AwaitActions { + return async (dispatch) => { + + const newSolutionFiles: ReadonlyArray<SolutionFileDoExerciseFullBase> = [...solutionFiles, newFile] + + await dispatch(setSolutionFiles_AndRefreshEditor( + newSolutionFiles, + setAfterSolutionFiles, + ) + ) + + //open the new file + dispatch(openTabChangeAfterEditor(newFile, newSolutionFiles, selectedEditorTabId)) + } +} + /** * the file * @param {SolutionFileDoExerciseFullBase} file the file (won't be used to change something) @@ -98,4 +128,4 @@ export function setAfterEditor_renamingFileNameDoEditor(renamingFileNameDoEditor type: ActionType.SET_afterEditor_renamingFileNameDoEditor, renamingFileNameDoEditor } -} \ No newline at end of file +} diff --git a/src/state/actions/doExerciseSite/editorActions/doEditorActions.ts b/src/state/actions/doExerciseSite/editorActions/doEditorActions.ts index bbf6cc890941532f8b423294f1249a4dcf4d816d..23ca6251731a3d8c0b64d6289beb52bbca561d96 100644 --- a/src/state/actions/doExerciseSite/editorActions/doEditorActions.ts +++ b/src/state/actions/doExerciseSite/editorActions/doEditorActions.ts @@ -3,16 +3,23 @@ */ import { SET_hasFileChangedMapAction, - SET_isFileExplorerDisplayedDoEditorAction, SET_isRenamingFileDoEditorAction, SET_newFileNameDoEditorAction, - SET_renamingFileIdDoEditorAction, SET_renamingFileNameDoEditorAction, + SET_hasUnsavedChangesAction, + SET_isFileExplorerDisplayedDoEditorAction, + SET_isRenamingFileDoEditorAction, + SET_newFileNameDoEditorAction, + SET_renamingFileIdDoEditorAction, + SET_renamingFileNameDoEditorAction, SET_selectedTabIdDoEditorAction } from "../../../reducers/doExerciseSite/editorReducers/doEditorReducer"; import {ActionType} from "../../../reducers/doExerciseSite/doExerciseSiteActionTypes"; -import {changeTabVisibility, HasFileChangedMap} from "../../../../helpers/editorHelper"; -import {MultiActions} from "../../types"; +import { + changeTabVisibility, + HasFileChangedMap, + setSolutionFiles_AndRefreshEditor +} from "../../../../helpers/editorHelper"; +import {AwaitActions, MultiActions} from "../../types"; import {SolutionFileDoExerciseFullBase} from "../../../../types/exerciseSolution"; import {setSolutionFiles} from "../doExerciseSiteActions"; -import {SET_hasUnsavedChangesAction} from "../../../reducers/doExerciseSite/editorReducers/doEditorReducer"; export function setHasUnsavedChanges(hasUnsavedChanges: boolean): SET_hasUnsavedChangesAction { @@ -37,6 +44,29 @@ export function setHasFileChangedMapDoEditor(hasFileChangedMap: HasFileChangedMa } } +/** + * + * @param newFile + * @param solutionFiles + * @param selectedEditorTabId the currently (old) selected tab id + */ +export function onCreateFileDoEditor(newFile: SolutionFileDoExerciseFullBase, + solutionFiles: ReadonlyArray<SolutionFileDoExerciseFullBase>, + selectedEditorTabId: number): AwaitActions { + return async (dispatch) => { + + const newSolutionFiles: ReadonlyArray<SolutionFileDoExerciseFullBase> = [...solutionFiles, newFile] + + await dispatch(setSolutionFiles_AndRefreshEditor( + newSolutionFiles, + setSolutionFiles, + ) + ) + + //open the new file + dispatch(openTabChangeDoEditor(newFile, newSolutionFiles, selectedEditorTabId)) + } +} /** * changes the visibility of a tab @@ -98,4 +128,4 @@ export function setRenamingFileNameDoEditor(renamingFileNameDoEditor: string): S type: ActionType.SET_renamingFileNameDoEditor, renamingFileNameDoEditor } -} \ No newline at end of file +} diff --git a/src/state/actions/exerciseEditorSite/dialogs/changeCodeTemplateDialog/changeCodeTemplateActions.ts b/src/state/actions/exerciseEditorSite/dialogs/changeCodeTemplateDialog/changeCodeTemplateActions.ts index 8d4860f66965eadfc01d57746f6e76844b945630..708e1deda7cb93397b7de44da6f482fd12dd4f04 100644 --- a/src/state/actions/exerciseEditorSite/dialogs/changeCodeTemplateDialog/changeCodeTemplateActions.ts +++ b/src/state/actions/exerciseEditorSite/dialogs/changeCodeTemplateDialog/changeCodeTemplateActions.ts @@ -36,6 +36,12 @@ export function setMainFileId(mainFileId: number): SET_mainFileIdAction { } } +/** + * + * @param newFile + * @param templateFiles + * @param selectedEditorTabId the currently (old) selected tab id + */ export function onCreateTemplateFile(newFile: ExerciseCodeTemplateFileFullBase, templateFiles: ReadonlyArray<ExerciseCodeTemplateFileFullBase>, selectedEditorTabId: number): AwaitActions { return async (dispatch) => { diff --git a/src/state/actions/exerciseEditorSite/dialogs/changeCodeTemplateDialog/changeCodeTemplateDialogActions.ts b/src/state/actions/exerciseEditorSite/dialogs/changeCodeTemplateDialog/changeCodeTemplateDialogActions.ts index aafcf84bc902906b1c8caa7c579dc2be2e80c8fe..5cfa6629852006204d4a79007de0743ac434b306 100644 --- a/src/state/actions/exerciseEditorSite/dialogs/changeCodeTemplateDialog/changeCodeTemplateDialogActions.ts +++ b/src/state/actions/exerciseEditorSite/dialogs/changeCodeTemplateDialog/changeCodeTemplateDialogActions.ts @@ -103,54 +103,6 @@ export function changeTabVisibilityChangeCodeTemplate(targetFile: ExerciseCodeTe selectedFileId: number): MultiActions { return changeTabVisibility(targetFile, isDisplayed, templateFiles, selectedFileId, setTemplateFiles, setSelectedEditorTabIdChangeCodeTemplate) - //TODO remove - // return dispatch => { - // - // //this would do nothing and it's a bug when we execute this because this would hide the file - // if (isDisplayed === true && targetFile.id === selectedFileId) return - // - // // noinspection TsLint - // let currDisplayIndex = 1 - // // noinspection TsLint - // let currNotDisplayedIndex = -1 - // - // const newTempFiles = templateFiles.map(file => { - // return file.id === targetFile.id - // ? { - // ...file, - // displayIndex: isDisplayed ? currDisplayIndex++ : currNotDisplayedIndex-- - // } - // : { - // ...file, - // displayIndex: (file.displayIndex >= 0) ? currDisplayIndex++ : currNotDisplayedIndex-- - // } - // }) - // - // dispatch(setTemplateFiles(newTempFiles)) - // - // //set new selected tab if necessary - // - // if (targetFile.id === selectedFileId) { - // //now selected the next file... or nothing - // - // const visibleFiles = newTempFiles.filter(p => p.displayIndex >= 0) - // - // if (visibleFiles.length === 0) { - // //no files is left open... - // dispatch(setSelectedEditorTabIdChangeCodeTemplate(-1)) - // } else { - // - // const visibleFile = getMaxEntity(visibleFiles, p => p.displayIndex) - // - // dispatch(setSelectedEditorTabIdChangeCodeTemplate(visibleFile.id)) - // } - // } else if (targetFile.id !== selectedFileId && isDisplayed === true) { - // - // //we clicked a file that is not the current active file ... make it the active file - // dispatch(setSelectedEditorTabIdChangeCodeTemplate(targetFile.id)) - // - // } - // } }