diff options
-rw-r--r-- | app/assets/javascripts/ide/components/ide.vue | 4 | ||||
-rw-r--r-- | app/assets/javascripts/ide/ide_router.js | 16 | ||||
-rw-r--r-- | app/assets/javascripts/ide/stores/actions/file.js | 33 | ||||
-rw-r--r-- | app/assets/javascripts/ide/stores/getters.js | 4 | ||||
-rw-r--r-- | app/assets/javascripts/ide/stores/mutations/file.js | 46 | ||||
-rw-r--r-- | app/assets/javascripts/ide/stores/state.js | 1 |
6 files changed, 50 insertions, 54 deletions
diff --git a/app/assets/javascripts/ide/components/ide.vue b/app/assets/javascripts/ide/components/ide.vue index 8502bbf4157..1581e015c39 100644 --- a/app/assets/javascripts/ide/components/ide.vue +++ b/app/assets/javascripts/ide/components/ide.vue @@ -32,7 +32,7 @@ export default { }, computed: { ...mapState(['changedFiles', 'openFiles', 'viewer']), - ...mapGetters(['activeFile', 'hasChanges', 'tabs']), + ...mapGetters(['activeFile', 'hasChanges']), }, mounted() { const returnValue = 'Are you sure you want to lose unsaved changes?'; @@ -61,7 +61,7 @@ export default { > <repo-tabs :active-file="activeFile" - :files="tabs" + :files="openFiles" :viewer="viewer" :has-changes="hasChanges" /> diff --git a/app/assets/javascripts/ide/ide_router.js b/app/assets/javascripts/ide/ide_router.js index db89c1d44db..25f55ac2f8a 100644 --- a/app/assets/javascripts/ide/ide_router.js +++ b/app/assets/javascripts/ide/ide_router.js @@ -76,11 +76,17 @@ router.beforeEach((to, from, next) => { .then(() => { if (to.params[0]) { const path = - to.params[0].slice(-1) === '/' - ? to.params[0].slice(0, -1) - : to.params[0]; - const treeEntry = store.state.entries[path]; - if (treeEntry) { + to.params[0].slice(-1) === '/' ? to.params[0].slice(0, -1) : to.params[0]; + const treeEntry = Object.keys(store.state.entries).reduce((acc, key) => { + const file = store.state.entries[key]; + if (key === path && !file.pending) { + return file; + } + + return acc; + }, {}); + + if (Object.keys(treeEntry).length) { store.dispatch('handleTreeEntryAction', treeEntry); } } diff --git a/app/assets/javascripts/ide/stores/actions/file.js b/app/assets/javascripts/ide/stores/actions/file.js index 9293c945efa..53d80538228 100644 --- a/app/assets/javascripts/ide/stores/actions/file.js +++ b/app/assets/javascripts/ide/stores/actions/file.js @@ -6,9 +6,9 @@ import * as types from '../mutation_types'; import router from '../../ide_router'; import { setPageTitle } from '../utils'; -export const closeFile = ({ commit, state, getters, dispatch }, file) => { +export const closeFile = ({ commit, state, dispatch }, file) => { const path = file.path; - const indexOfClosedFile = getters.tabs.findIndex(f => f.key === file.key); + const indexOfClosedFile = state.openFiles.findIndex(f => f.key === file.key); const fileWasActive = file.active; if (file.pending) { @@ -18,9 +18,9 @@ export const closeFile = ({ commit, state, getters, dispatch }, file) => { commit(types.SET_FILE_ACTIVE, { path, active: false }); } - if (getters.tabs.length > 0 && fileWasActive) { + if (state.openFiles.length > 0 && fileWasActive) { const nextIndexToOpen = indexOfClosedFile === 0 ? 0 : indexOfClosedFile - 1; - const nextFileToOpen = getters.tabs[nextIndexToOpen]; + const nextFileToOpen = state.openFiles[nextIndexToOpen]; if (nextFileToOpen.pending) { dispatch('updateViewer', 'diff'); @@ -29,7 +29,7 @@ export const closeFile = ({ commit, state, getters, dispatch }, file) => { dispatch('updateDelayViewerUpdated', true); router.push(`/project${nextFileToOpen.url}`); } - } else if (!getters.tabs.length) { + } else if (!state.openFiles.length) { router.push(`/project/${file.projectId}/tree/${file.branchId}/`); } @@ -76,14 +76,7 @@ export const getFileData = ({ state, commit, dispatch }, file) => { }) .catch(() => { commit(types.TOGGLE_LOADING, { entry: file }); - flash( - 'Error loading file data. Please try again.', - 'alert', - document, - null, - false, - true, - ); + flash('Error loading file data. Please try again.', 'alert', document, null, false, true); }); }; @@ -94,14 +87,7 @@ export const getRawFileData = ({ commit, dispatch }, file) => commit(types.SET_FILE_RAW_DATA, { file, raw }); }) .catch(() => - flash( - 'Error loading file content. Please try again.', - 'alert', - document, - null, - false, - true, - ), + flash('Error loading file content. Please try again.', 'alert', document, null, false, true), ); export const changeFileContent = ({ state, commit }, { path, content }) => { @@ -129,10 +115,7 @@ export const setFileEOL = ({ getters, commit }, { eol }) => { } }; -export const setEditorPosition = ( - { getters, commit }, - { editorRow, editorColumn }, -) => { +export const setEditorPosition = ({ getters, commit }, { editorRow, editorColumn }) => { if (getters.activeFile) { commit(types.SET_FILE_POSITION, { file: getters.activeFile, diff --git a/app/assets/javascripts/ide/stores/getters.js b/app/assets/javascripts/ide/stores/getters.js index 28006d3ddf8..a7e43a6dd2f 100644 --- a/app/assets/javascripts/ide/stores/getters.js +++ b/app/assets/javascripts/ide/stores/getters.js @@ -1,6 +1,4 @@ -export const tabs = state => state.openFiles.concat(state.pendingTabs); - -export const activeFile = state => tabs(state).find(file => file.active) || null; +export const activeFile = state => state.openFiles.find(file => file.active) || null; export const addedFiles = state => state.changedFiles.filter(f => f.tempFile); diff --git a/app/assets/javascripts/ide/stores/mutations/file.js b/app/assets/javascripts/ide/stores/mutations/file.js index e49a74ac3ed..87a3bfbcf05 100644 --- a/app/assets/javascripts/ide/stores/mutations/file.js +++ b/app/assets/javascripts/ide/stores/mutations/file.js @@ -6,12 +6,15 @@ export default { active, }); - if (active) { + if (active && !state.entries[path].pending) { Object.assign(state, { - pendingTabs: state.pendingTabs.map(f => ({ - ...f, - active: false, - })), + openFiles: state.openFiles.map(f => { + if (f.pending) { + return Object.assign(f, { active: false }); + } + + return f; + }), }); } }, @@ -23,8 +26,10 @@ export default { if (state.entries[path].opened) { state.openFiles.push(state.entries[path]); } else { + const file = state.entries[path]; + Object.assign(state, { - openFiles: state.openFiles.filter(f => f.path !== path), + openFiles: state.openFiles.filter(f => f.key !== file.key), }); } }, @@ -90,26 +95,31 @@ export default { }); }, [types.ADD_PENDING_TAB](state, file) { - const pendingTab = state.pendingTabs.find(f => f.path === file.path); + const pendingTab = state.openFiles.find(f => f.path === file.path && f.pending); Object.assign(state, { - openFiles: state.openFiles.map(f => - Object.assign(f, { - active: false, - }), - ), + openFiles: state.openFiles.map(f => { + if (!f.pending) { + return Object.assign(f, { active: false }); + } + + return f; + }), }); if (pendingTab) { Object.assign(state, { - pendingTabs: state.pendingTabs.map(tab => ({ - ...tab, - active: !!pendingTab, - })), + openFiles: state.openFiles.map(f => { + if (f.pending && f.path === file.path) { + return Object.assign(f, { active: true }); + } + + return f; + }), }); } else { Object.assign(state, { - pendingTabs: state.pendingTabs.concat({ + openFiles: state.openFiles.concat({ ...file, active: true, pending: true, @@ -120,7 +130,7 @@ export default { }, [types.REMOVE_PENDING_TAB](state, file) { Object.assign(state, { - pendingTabs: state.pendingTabs.filter(f => f.path !== file.path), + openFiles: state.openFiles.filter(f => f.key !== file.key), }); }, }; diff --git a/app/assets/javascripts/ide/stores/state.js b/app/assets/javascripts/ide/stores/state.js index 52a2400ec42..6110f54951c 100644 --- a/app/assets/javascripts/ide/stores/state.js +++ b/app/assets/javascripts/ide/stores/state.js @@ -16,5 +16,4 @@ export default () => ({ entries: {}, viewer: 'editor', delayViewerUpdated: false, - pendingTabs: [], }); |