From d266f16bc346818d76b5d64c795756c2cc099281 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Janis=20Daniel=20Da=CC=88hne?=
 <janis.daehne@informatik.uni-halle.de>
Date: Sat, 6 Feb 2021 12:12:40 +0100
Subject: [PATCH] - fixes issue #160 - new files in do and after do editor are
 now automatically displayed

---
 .../afterEditorPanel/afterEditorPanelView.tsx | 12 ++---
 .../editorPanel/editorPanelView.tsx           | 10 ++--
 src/constants.ts                              |  2 +-
 src/helpers/editorHelper.ts                   |  4 +-
 .../editorActions/afterEditorActions.ts       | 40 ++++++++++++++--
 .../editorActions/doEditorActions.ts          | 42 +++++++++++++---
 .../changeCodeTemplateActions.ts              |  6 +++
 .../changeCodeTemplateDialogActions.ts        | 48 -------------------
 8 files changed, 89 insertions(+), 75 deletions(-)

diff --git a/src/components/sites/doExerciseSite/afterEditorPanel/afterEditorPanelView.tsx b/src/components/sites/doExerciseSite/afterEditorPanel/afterEditorPanelView.tsx
index 91bc8d9f..e050a38f 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 245a3d38..90fa7a48 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 dfcac1b4..e9158939 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 b56873db..c40aa52f 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 eab7bafd..10944eeb 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 bbf6cc89..23ca6251 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 8d4860f6..708e1ded 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 aafcf84b..5cfa6629 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))
-  //
-  //   }
-  // }
 }
 
 
-- 
GitLab