diff options
author | Phil Hughes <me@iamphill.com> | 2019-04-05 13:41:03 +0000 |
---|---|---|
committer | Phil Hughes <me@iamphill.com> | 2019-04-05 13:41:03 +0000 |
commit | 9fb1dfa870372b0c95ae7c15cb82ff59472565d6 (patch) | |
tree | c2beb4dae02ebe69f2a98e6d76e9015cf9e100ec /app | |
parent | 8c28813866db46e697a4702e752c2dfc884e304e (diff) | |
parent | 5e0423ebc55089978291d0823574c8498994c3b9 (diff) | |
download | gitlab-ce-9fb1dfa870372b0c95ae7c15cb82ff59472565d6.tar.gz |
Merge branch '57668-create-file-from-url' into 'master'
Resolve "Support creating new file from URL in the Web IDE"
Closes #57668
See merge request gitlab-org/gitlab-ce!26622
Diffstat (limited to 'app')
-rw-r--r-- | app/assets/javascripts/ide/stores/actions/project.js | 5 | ||||
-rw-r--r-- | app/assets/javascripts/ide/stores/mutations/tree.js | 14 | ||||
-rw-r--r-- | app/assets/javascripts/ide/stores/utils.js | 28 |
3 files changed, 43 insertions, 4 deletions
diff --git a/app/assets/javascripts/ide/stores/actions/project.js b/app/assets/javascripts/ide/stores/actions/project.js index 06ed5c0b572..4b10d148ebf 100644 --- a/app/assets/javascripts/ide/stores/actions/project.js +++ b/app/assets/javascripts/ide/stores/actions/project.js @@ -147,6 +147,11 @@ export const openBranch = ({ dispatch, state }, { projectId, branchId, basePath if (treeEntry) { dispatch('handleTreeEntryAction', treeEntry); + } else { + dispatch('createTempEntry', { + name: path, + type: 'blob', + }); } } }) diff --git a/app/assets/javascripts/ide/stores/mutations/tree.js b/app/assets/javascripts/ide/stores/mutations/tree.js index eac7441ee54..359943b4ab7 100644 --- a/app/assets/javascripts/ide/stores/mutations/tree.js +++ b/app/assets/javascripts/ide/stores/mutations/tree.js @@ -1,5 +1,5 @@ import * as types from '../mutation_types'; -import { sortTree } from '../utils'; +import { sortTree, mergeTrees } from '../utils'; export default { [types.TOGGLE_TREE_OPEN](state, path) { @@ -23,9 +23,15 @@ export default { }); }, [types.SET_DIRECTORY_DATA](state, { data, treePath }) { - Object.assign(state.trees[treePath], { - tree: data, - }); + const selectedTree = state.trees[treePath]; + + // If we opened files while loading the tree, we need to merge them + // Otherwise, simply overwrite the tree + const tree = !selectedTree.tree.length + ? data + : selectedTree.loading && mergeTrees(selectedTree.tree, data); + + Object.assign(selectedTree, { tree }); }, [types.SET_LAST_COMMIT_URL](state, { tree = state, url }) { Object.assign(tree, { diff --git a/app/assets/javascripts/ide/stores/utils.js b/app/assets/javascripts/ide/stores/utils.js index 0b2a18e9c8a..3ab8f3f11be 100644 --- a/app/assets/javascripts/ide/stores/utils.js +++ b/app/assets/javascripts/ide/stores/utils.js @@ -170,3 +170,31 @@ export const filePathMatches = (filePath, path) => filePath.indexOf(`${path}/`) export const getChangesCountForFiles = (files, path) => files.filter(f => filePathMatches(f.path, path)).length; + +export const mergeTrees = (fromTree, toTree) => { + if (!fromTree || !fromTree.length) { + return toTree; + } + + const recurseTree = (n, t) => { + if (!n) { + return t; + } + const existingTreeNode = t.find(el => el.path === n.path); + + if (existingTreeNode && n.tree.length > 0) { + existingTreeNode.opened = true; + recurseTree(n.tree[0], existingTreeNode.tree); + } else if (!existingTreeNode) { + const sorted = sortTree(t.concat(n)); + t.splice(0, t.length + 1, ...sorted); + } + return t; + }; + + for (let i = 0, l = fromTree.length; i < l; i += 1) { + recurseTree(fromTree[i], toTree); + } + + return toTree; +}; |