From 748a2f2b542fed2cb8ab7d1792cb874ce7423a61 Mon Sep 17 00:00:00 2001 From: Phil Hughes Date: Wed, 11 Apr 2018 17:12:01 +0100 Subject: [PATCH 01/23] Added fuzzy file finder to web IDE Closes #44841 --- .../ide/components/file_finder/index.vue | 100 ++++++++++++++++++ .../ide/components/file_finder/item.vue | 36 +++++++ app/assets/javascripts/ide/components/ide.vue | 13 ++- app/assets/javascripts/ide/stores/getters.js | 3 + app/assets/javascripts/ide/stores/state.js | 1 + package.json | 1 + yarn.lock | 4 + 7 files changed, 157 insertions(+), 1 deletion(-) create mode 100644 app/assets/javascripts/ide/components/file_finder/index.vue create mode 100644 app/assets/javascripts/ide/components/file_finder/item.vue diff --git a/app/assets/javascripts/ide/components/file_finder/index.vue b/app/assets/javascripts/ide/components/file_finder/index.vue new file mode 100644 index 00000000000..ebcd6f7592b --- /dev/null +++ b/app/assets/javascripts/ide/components/file_finder/index.vue @@ -0,0 +1,100 @@ + + + + + diff --git a/app/assets/javascripts/ide/components/file_finder/item.vue b/app/assets/javascripts/ide/components/file_finder/item.vue new file mode 100644 index 00000000000..482bfb96d93 --- /dev/null +++ b/app/assets/javascripts/ide/components/file_finder/item.vue @@ -0,0 +1,36 @@ + + + diff --git a/app/assets/javascripts/ide/components/ide.vue b/app/assets/javascripts/ide/components/ide.vue index 1c237c0ec97..8489639e3b0 100644 --- a/app/assets/javascripts/ide/components/ide.vue +++ b/app/assets/javascripts/ide/components/ide.vue @@ -5,6 +5,7 @@ import ideContextbar from './ide_context_bar.vue'; import repoTabs from './repo_tabs.vue'; import ideStatusBar from './ide_status_bar.vue'; import repoEditor from './repo_editor.vue'; +import FindFile from './file_finder/index.vue'; export default { components: { @@ -13,6 +14,7 @@ export default { repoTabs, ideStatusBar, repoEditor, + FindFile, }, props: { emptyStateSvgPath: { @@ -29,7 +31,13 @@ export default { }, }, computed: { - ...mapState(['changedFiles', 'openFiles', 'viewer', 'currentMergeRequestId']), + ...mapState([ + 'changedFiles', + 'openFiles', + 'viewer', + 'currentMergeRequestId', + 'fileFindVisible', + ]), ...mapGetters(['activeFile', 'hasChanges']), }, mounted() { @@ -50,6 +58,9 @@ export default {
+
export const hasChanges = state => !!state.changedFiles.length; export const hasMergeRequest = state => !!state.currentMergeRequestId; + +export const allBlobs = state => + Object.keys(state.entries).reduce((acc, key) => acc.concat(state.entries[key]), []); diff --git a/app/assets/javascripts/ide/stores/state.js b/app/assets/javascripts/ide/stores/state.js index e5cc8814000..e976884ae1f 100644 --- a/app/assets/javascripts/ide/stores/state.js +++ b/app/assets/javascripts/ide/stores/state.js @@ -17,4 +17,5 @@ export default () => ({ entries: {}, viewer: 'editor', delayViewerUpdated: false, + fileFindVisible: true, }); diff --git a/package.json b/package.json index 45bea12fd9b..6f92600cfa5 100644 --- a/package.json +++ b/package.json @@ -88,6 +88,7 @@ "vue-resource": "^1.3.5", "vue-router": "^3.0.1", "vue-template-compiler": "^2.5.13", + "vue-virtual-scroll-list": "^1.2.5", "vuex": "^3.0.1", "webpack": "^3.11.0", "webpack-bundle-analyzer": "^2.10.0", diff --git a/yarn.lock b/yarn.lock index 55a86a9a577..1718a56bac4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8683,6 +8683,10 @@ vue-template-es2015-compiler@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.6.0.tgz#dc42697133302ce3017524356a6c61b7b69b4a18" +vue-virtual-scroll-list@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/vue-virtual-scroll-list/-/vue-virtual-scroll-list-1.2.5.tgz#bcbd010f7cdb035eba8958ebf807c6214d9a167a" + vue@^2.5.13: version "2.5.13" resolved "https://registry.yarnpkg.com/vue/-/vue-2.5.13.tgz#95bd31e20efcf7a7f39239c9aa6787ce8cf578e1" -- 2.18.1 From d32eaee20e75ca2e90397182dce59ee263f5c249 Mon Sep 17 00:00:00 2001 From: Phil Hughes Date: Thu, 12 Apr 2018 09:43:46 +0100 Subject: [PATCH 02/23] correctly show the dropdown with `t` keypress added arrow key navigation in the dropdown enter & click open the file highlight occurrences of the searched text in the drppdown item fixed some performance issues when rendering limit the dropdown items to a maximum of 20 - this may change to more depending on other performance changes --- .../ide/components/file_finder/index.vue | 167 ++++++++++++------ .../ide/components/file_finder/item.vue | 50 +++++- app/assets/javascripts/ide/components/ide.vue | 13 +- app/assets/javascripts/ide/stores/actions.js | 3 + app/assets/javascripts/ide/stores/getters.js | 10 +- .../javascripts/ide/stores/mutation_types.js | 2 + .../javascripts/ide/stores/mutations.js | 5 + app/assets/javascripts/ide/stores/state.js | 2 +- app/assets/stylesheets/pages/repo.scss | 1 + 9 files changed, 194 insertions(+), 59 deletions(-) diff --git a/app/assets/javascripts/ide/components/file_finder/index.vue b/app/assets/javascripts/ide/components/file_finder/index.vue index ebcd6f7592b..d1902557fe8 100644 --- a/app/assets/javascripts/ide/components/file_finder/index.vue +++ b/app/assets/javascripts/ide/components/file_finder/index.vue @@ -1,8 +1,11 @@ diff --git a/app/assets/javascripts/ide/components/ide.vue b/app/assets/javascripts/ide/components/ide.vue index 8489639e3b0..065edd81d2c 100644 --- a/app/assets/javascripts/ide/components/ide.vue +++ b/app/assets/javascripts/ide/components/ide.vue @@ -1,5 +1,6 @@ @@ -59,7 +68,7 @@ export default { class="ide-view" >
{ commit(types.UPDATE_DELAY_VIEWER_CHANGE, delay); }; +export const toggleFileFinder = ({ commit }, fileFindVisible) => + commit(types.TOGGLE_FILE_FINDER, fileFindVisible); + export * from './actions/tree'; export * from './actions/file'; export * from './actions/project'; diff --git a/app/assets/javascripts/ide/stores/getters.js b/app/assets/javascripts/ide/stores/getters.js index 6776be3b77c..07f7e73d8e9 100644 --- a/app/assets/javascripts/ide/stores/getters.js +++ b/app/assets/javascripts/ide/stores/getters.js @@ -37,4 +37,12 @@ export const hasChanges = state => !!state.changedFiles.length; export const hasMergeRequest = state => !!state.currentMergeRequestId; export const allBlobs = state => - Object.keys(state.entries).reduce((acc, key) => acc.concat(state.entries[key]), []); + Object.keys(state.entries).reduce((acc, key) => { + const entry = state.entries[key]; + + if (entry.type === 'blob') { + acc.push(entry); + } + + return acc; + }, []); diff --git a/app/assets/javascripts/ide/stores/mutation_types.js b/app/assets/javascripts/ide/stores/mutation_types.js index e3f504e5ab0..d64908ea971 100644 --- a/app/assets/javascripts/ide/stores/mutation_types.js +++ b/app/assets/javascripts/ide/stores/mutation_types.js @@ -53,3 +53,5 @@ export const UPDATE_DELAY_VIEWER_CHANGE = 'UPDATE_DELAY_VIEWER_CHANGE'; export const ADD_PENDING_TAB = 'ADD_PENDING_TAB'; export const REMOVE_PENDING_TAB = 'REMOVE_PENDING_TAB'; + +export const TOGGLE_FILE_FINDER = 'SHOW_FILE_FINDER'; diff --git a/app/assets/javascripts/ide/stores/mutations.js b/app/assets/javascripts/ide/stores/mutations.js index 5e5eb831662..4510ef64262 100644 --- a/app/assets/javascripts/ide/stores/mutations.js +++ b/app/assets/javascripts/ide/stores/mutations.js @@ -95,6 +95,11 @@ export default { delayViewerUpdated, }); }, + [types.TOGGLE_FILE_FINDER](state, fileFindVisible) { + Object.assign(state, { + fileFindVisible, + }); + }, ...projectMutations, ...mergeRequestMutation, ...fileMutations, diff --git a/app/assets/javascripts/ide/stores/state.js b/app/assets/javascripts/ide/stores/state.js index e976884ae1f..3694ad953fa 100644 --- a/app/assets/javascripts/ide/stores/state.js +++ b/app/assets/javascripts/ide/stores/state.js @@ -17,5 +17,5 @@ export default () => ({ entries: {}, viewer: 'editor', delayViewerUpdated: false, - fileFindVisible: true, + fileFindVisible: false, }); diff --git a/app/assets/stylesheets/pages/repo.scss b/app/assets/stylesheets/pages/repo.scss index 5f46e69a56d..340bba7ef4c 100644 --- a/app/assets/stylesheets/pages/repo.scss +++ b/app/assets/stylesheets/pages/repo.scss @@ -17,6 +17,7 @@ } .ide-view { + position: relative; display: flex; height: calc(100vh - #{$header-height}); margin-top: 0; -- 2.18.1 From ba4dde7c41f0d3dcba12481c4ff0171044c9dc1c Mon Sep 17 00:00:00 2001 From: Phil Hughes Date: Thu, 12 Apr 2018 10:36:10 +0100 Subject: [PATCH 03/23] small performance improvement by caching the computed prop fixed eslint there are still some performance issues with larger lists. Need to investigate whether this is a Vue issue or a fuzzaldrin issue --- .../ide/components/file_finder/index.vue | 13 ++++++++----- .../javascripts/ide/components/file_finder/item.vue | 4 ++-- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/app/assets/javascripts/ide/components/file_finder/index.vue b/app/assets/javascripts/ide/components/file_finder/index.vue index d1902557fe8..3e7cf69dbda 100644 --- a/app/assets/javascripts/ide/components/file_finder/index.vue +++ b/app/assets/javascripts/ide/components/file_finder/index.vue @@ -31,13 +31,16 @@ export default { maxResults: MAX_RESULTS, }); }, + filteredBlobsLength() { + return this.filteredBlobs.length; + }, listShowCount() { - if (!this.filteredBlobs.length) return 1; + if (!this.filteredBlobsLength) return 1; - return this.filteredBlobs.length > 5 ? 5 : this.filteredBlobs.length; + return this.filteredBlobsLength > 5 ? 5 : this.filteredBlobsLength; }, listHeight() { - return this.filteredBlobs.length ? 55 : 33; + return this.filteredBlobsLength ? 55 : 33; }, }, watch: { @@ -62,7 +65,7 @@ export default { case 40: // DOWN e.preventDefault(); - if (this.focusedIndex < this.filteredBlobs.length - 1) this.focusedIndex += 1; + if (this.focusedIndex < this.filteredBlobsLength - 1) this.focusedIndex += 1; break; default: break; @@ -117,7 +120,7 @@ export default { :start="focusedIndex" wtag="ul" > -