From 60ce5155c8e0804b71c55d1492d7812133673fa2 Mon Sep 17 00:00:00 2001 From: Phil Hughes Date: Thu, 19 Oct 2017 16:24:00 +0100 Subject: [PATCH] fixed bug with tabs not switching correctly clears all tmp files after cancelling edit mode --- .../repo/components/new_dropdown/modal.vue | 19 +++++++++++---- .../javascripts/repo/components/repo.vue | 3 +++ .../repo/components/repo_commit_section.vue | 4 +++- .../javascripts/repo/helpers/repo_helper.js | 24 +++++++++++++++++-- .../javascripts/repo/stores/repo_store.js | 14 +++++++---- app/controllers/projects/blob_controller.rb | 1 + .../repo/components/repo_file_buttons_spec.js | 2 +- 7 files changed, 54 insertions(+), 13 deletions(-) diff --git a/app/assets/javascripts/repo/components/new_dropdown/modal.vue b/app/assets/javascripts/repo/components/new_dropdown/modal.vue index ff13b3072bb..6c869580962 100644 --- a/app/assets/javascripts/repo/components/new_dropdown/modal.vue +++ b/app/assets/javascripts/repo/components/new_dropdown/modal.vue @@ -21,13 +21,22 @@ }, methods: { createEntryInStore() { - if (this.entryName === '') return; + const originalPath = RepoStore.path; + let entryName = this.entryName; - const fileName = this.type === 'tree' ? '.gitkeep' : this.entryName; + if (entryName.indexOf(`${RepoStore.path}/`) !== 0) { + RepoStore.path = ''; + } else { + entryName = entryName.replace(`${RepoStore.path}/`, ''); + } + + if (entryName === '') return; + + const fileName = this.type === 'tree' ? '.gitkeep' : entryName; let tree = RepoStore; if (this.type === 'tree') { - const dirNames = this.entryName.split('/'); + const dirNames = entryName.split('/'); dirNames.forEach((dirName) => { if (dirName === '') return; @@ -43,11 +52,13 @@ RepoHelper.setFile(file.entry, file.entry); RepoStore.editMode = true; - RepoStore.toggleBlobView(); + RepoStore.currentBlobView = 'repo-editor'; } } this.toggleModalOpen(); + + RepoStore.path = originalPath; }, toggleModalOpen() { this.$emit('toggle'); diff --git a/app/assets/javascripts/repo/components/repo.vue b/app/assets/javascripts/repo/components/repo.vue index 0a89a9f16cb..cdcd8e15495 100644 --- a/app/assets/javascripts/repo/components/repo.vue +++ b/app/assets/javascripts/repo/components/repo.vue @@ -37,6 +37,9 @@ export default { dialogSubmitted(status) { this.toggleDialogOpen(false); this.dialog.status = status; + + // remove tmp files + Helper.removeAllTmpFiles(); }, toggleBlobView: Store.toggleBlobView, diff --git a/app/assets/javascripts/repo/components/repo_commit_section.vue b/app/assets/javascripts/repo/components/repo_commit_section.vue index e3003fbf477..0d6259a37a8 100644 --- a/app/assets/javascripts/repo/components/repo_commit_section.vue +++ b/app/assets/javascripts/repo/components/repo_commit_section.vue @@ -62,7 +62,6 @@ export default { if (newBranch) { payload.start_branch = this.currentBranch; } - this.submitCommitsLoading = true; Service.commitFiles(payload) .then(() => { this.resetCommitState(); @@ -78,6 +77,8 @@ export default { }, tryCommit(e, skipBranchCheck = false, newBranch = false) { + this.submitCommitsLoading = true; + if (skipBranchCheck) { this.makeCommit(newBranch); } else { @@ -90,6 +91,7 @@ export default { this.makeCommit(newBranch); }) .catch(() => { + this.submitCommitsLoading = false; Flash('An error occurred while committing your changes'); }); } diff --git a/app/assets/javascripts/repo/helpers/repo_helper.js b/app/assets/javascripts/repo/helpers/repo_helper.js index 09573e6e707..c30bd6fa0c1 100644 --- a/app/assets/javascripts/repo/helpers/repo_helper.js +++ b/app/assets/javascripts/repo/helpers/repo_helper.js @@ -62,6 +62,7 @@ const RepoHelper = { }); RepoHelper.updateHistoryEntry(tree.url, title); + Store.path = tree.path; }, setDirectoryToClosed(entry) { @@ -157,7 +158,18 @@ const RepoHelper = { }, serializeRepoEntity(type, entity, level = 0) { - const { id, url, name, icon, last_commit, tree_url, path, tempFile, opened = false } = entity; + const { + id, + url, + name, + icon, + last_commit, + tree_url, + path, + tempFile, + active, + opened, + } = entity; return { id, @@ -172,6 +184,7 @@ const RepoHelper = { files: [], loading: false, opened, + active, // eslint-disable-next-line camelcase lastCommit: last_commit ? { url: `${Store.projectUrl}/commit/${last_commit.id}`, @@ -215,7 +228,7 @@ const RepoHelper = { }, findOpenedFileFromActive() { - return Store.openedFiles.find(openedFile => Store.activeFile.url === openedFile.url); + return Store.openedFiles.find(openedFile => Store.activeFile.id === openedFile.id); }, getFileFromPath(path) { @@ -232,11 +245,13 @@ const RepoHelper = { if (!foundEntry) { foundEntry = RepoHelper.serializeRepoEntity(type, { + id: name, name, path: tree.path ? `${tree.path}/${name}` : name, icon: type === 'tree' ? 'folder' : 'file-text-o', tempFile: true, opened: true, + active: true, }, tree.level !== undefined ? tree.level + 1 : 0); exists = false; @@ -248,6 +263,11 @@ const RepoHelper = { exists, }; }, + + removeAllTmpFiles() { + Store.openedFiles = Store.openedFiles.filter(f => !f.tempFile); + Store.files = Store.files.filter(f => !f.tempFile); + }, }; export default RepoHelper; diff --git a/app/assets/javascripts/repo/stores/repo_store.js b/app/assets/javascripts/repo/stores/repo_store.js index 4978af07067..cdf5b00a817 100644 --- a/app/assets/javascripts/repo/stores/repo_store.js +++ b/app/assets/javascripts/repo/stores/repo_store.js @@ -76,7 +76,7 @@ const RepoStore = { RepoStore.blobRaw = file.base64; } else if (file.newContent || file.plain) { RepoStore.blobRaw = file.newContent || file.plain; - } else if (!file.tempFile) { + } else { Service.getRaw(file) .then((rawResponse) => { RepoStore.blobRaw = rawResponse.data; @@ -84,14 +84,16 @@ const RepoStore = { }).catch(Helper.loadingError); } - if (!file.loading) Helper.updateHistoryEntry(file.url, file.pageTitle || file.name); + if (!file.loading && !file.tempFile) { + Helper.updateHistoryEntry(file.url, file.pageTitle || file.name); + } RepoStore.binary = file.binary; RepoStore.setActiveLine(-1); }, setFileActivity(file, openedFile, i) { const activeFile = openedFile; - activeFile.active = file.url === activeFile.url; + activeFile.active = file.id === activeFile.id; if (activeFile.active) RepoStore.setActiveFile(activeFile, i); @@ -99,7 +101,7 @@ const RepoStore = { }, setActiveFile(activeFile, i) { - RepoStore.activeFile = Object.assign({}, RepoStore.activeFile, activeFile); + RepoStore.activeFile = Object.assign({}, Helper.getDefaultActiveFile(), activeFile); RepoStore.activeFileIndex = i; }, @@ -175,7 +177,7 @@ const RepoStore = { // getters isActiveFile(file) { - return file && file.url === RepoStore.activeFile.url; + return file && file.id === RepoStore.activeFile.id; }, isPreviewView() { @@ -183,4 +185,6 @@ const RepoStore = { }, }; +window.RepoStore = RepoStore; + export default RepoStore; diff --git a/app/controllers/projects/blob_controller.rb b/app/controllers/projects/blob_controller.rb index 183a6f88a6a..770381472c5 100644 --- a/app/controllers/projects/blob_controller.rb +++ b/app/controllers/projects/blob_controller.rb @@ -205,6 +205,7 @@ class Projects::BlobController < Projects::ApplicationController tree_path = path_segments.join('/') render json: json.merge( + id: @blob.id, path: blob.path, name: blob.name, extension: blob.extension, diff --git a/spec/javascripts/repo/components/repo_file_buttons_spec.js b/spec/javascripts/repo/components/repo_file_buttons_spec.js index bc5cb5b8f38..063186be42d 100644 --- a/spec/javascripts/repo/components/repo_file_buttons_spec.js +++ b/spec/javascripts/repo/components/repo_file_buttons_spec.js @@ -2,7 +2,7 @@ import Vue from 'vue'; import repoFileButtons from '~/repo/components/repo_file_buttons.vue'; import RepoStore from '~/repo/stores/repo_store'; -fdescribe('RepoFileButtons', () => { +describe('RepoFileButtons', () => { const activeFile = { extension: 'md', url: 'url',