summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPhil Hughes <me@iamphill.com>2018-06-01 21:09:24 +0100
committerPhil Hughes <me@iamphill.com>2018-06-06 11:19:03 +0100
commit03820e9b03fb25c94263231aaee30fec0b6468f4 (patch)
tree45cc6ecad9d55be25b62c53deb2f43c3d070c63b
parent0b278a93f96ca4dd760c069e42d5485460d7b738 (diff)
downloadgitlab-ce-03820e9b03fb25c94263231aaee30fec0b6468f4.tar.gz
fetch both created & assigned
show badges for both [ci skip]
-rw-r--r--app/assets/javascripts/ide/components/ide_side_bar.vue34
-rw-r--r--app/assets/javascripts/ide/components/merge_requests/dropdown.vue61
-rw-r--r--app/assets/javascripts/ide/components/merge_requests/list.vue44
-rw-r--r--app/assets/javascripts/ide/stores/actions/merge_request.js4
-rw-r--r--app/assets/javascripts/ide/stores/modules/merge_requests/actions.js27
-rw-r--r--app/assets/javascripts/ide/stores/modules/merge_requests/constants.js4
-rw-r--r--app/assets/javascripts/ide/stores/modules/merge_requests/getters.js4
-rw-r--r--app/assets/javascripts/ide/stores/modules/merge_requests/index.js2
-rw-r--r--app/assets/javascripts/ide/stores/modules/merge_requests/mutation_types.js2
-rw-r--r--app/assets/javascripts/ide/stores/modules/merge_requests/mutations.js21
-rw-r--r--app/assets/javascripts/ide/stores/modules/merge_requests/state.js13
-rw-r--r--app/assets/javascripts/vue_shared/components/tabs/tab.vue3
-rw-r--r--app/assets/javascripts/vue_shared/components/tabs/tabs.js2
13 files changed, 128 insertions, 93 deletions
diff --git a/app/assets/javascripts/ide/components/ide_side_bar.vue b/app/assets/javascripts/ide/components/ide_side_bar.vue
index e99305d0bc0..631c995b59e 100644
--- a/app/assets/javascripts/ide/components/ide_side_bar.vue
+++ b/app/assets/javascripts/ide/components/ide_side_bar.vue
@@ -38,6 +38,7 @@ export default {
data() {
return {
showTooltip: false,
+ showMergeRequestsDropdown: false,
};
},
computed: {
@@ -67,6 +68,23 @@ export default {
this.showTooltip = this.$refs.branchId.scrollWidth > this.$refs.branchId.offsetWidth;
});
},
+ showMergeRequestsDropdown() {
+ if (this.showMergeRequestsDropdown) {
+ document.addEventListener('click', this.hideMergeRequestDropdown);
+ } else {
+ document.removeEventListener('click', this.hideMergeRequestDropdown);
+ }
+ },
+ },
+ methods: {
+ hideMergeRequestDropdown(e) {
+ if (this.$refs.mergeRequestDropdown.contains(e.target)) return;
+
+ this.showMergeRequestsDropdown = false;
+ },
+ toggleMergeRequestDropdown() {
+ this.showMergeRequestsDropdown = !this.showMergeRequestsDropdown;
+ },
},
};
</script>
@@ -91,12 +109,17 @@ export default {
</div>
</template>
<template v-else>
- <div class="context-header ide-context-header dropdown">
+ <div
+ class="context-header ide-context-header dropdown"
+ :class="{
+ show: showMergeRequestsDropdown
+ }"
+ ref="mergeRequestDropdown"
+ >
<a
href="#"
role="button"
- @click.prevent
- data-toggle="dropdown"
+ @click.prevent="toggleMergeRequestDropdown"
>
<div
v-if="currentProject.avatar_url"
@@ -148,7 +171,10 @@ export default {
name="chevron-down"
/>
</a>
- <merge-request-dropdown />
+ <merge-request-dropdown
+ v-if="showMergeRequestsDropdown"
+ @hide="toggleMergeRequestDropdown"
+ />
</div>
<div class="multi-file-commit-panel-inner-scroll">
<component
diff --git a/app/assets/javascripts/ide/components/merge_requests/dropdown.vue b/app/assets/javascripts/ide/components/merge_requests/dropdown.vue
index 1bcd550c713..86186b48854 100644
--- a/app/assets/javascripts/ide/components/merge_requests/dropdown.vue
+++ b/app/assets/javascripts/ide/components/merge_requests/dropdown.vue
@@ -1,9 +1,8 @@
<script>
-import { mapActions, mapState } from 'vuex';
+import { mapGetters, mapState } from 'vuex';
import Tabs from '../../../vue_shared/components/tabs/tabs';
import Tab from '../../../vue_shared/components/tabs/tab.vue';
import List from './list.vue';
-import { scopes } from '../../stores/modules/merge_requests/constants';
export default {
components: {
@@ -11,28 +10,16 @@ export default {
Tab,
List,
},
- data() {
- return {
- activeTabIndex: 0,
- };
- },
computed: {
- ...mapState('mergeRequests', ['isLoading', 'mergeRequests']),
+ ...mapGetters('mergeRequests', ['assignedData', 'createdData']),
...mapState(['currentMergeRequestId']),
- tabScope() {
- return this.activeTabIndex === 0 ? scopes.createdByMe : scopes.assignedToMe;
+ createdMergeRequestLength() {
+ return this.createdData.mergeRequests.length;
},
},
- mounted() {
- this.fetchMergeRequests();
- },
methods: {
- ...mapActions('mergeRequests', ['fetchMergeRequests', 'setScope']),
- updateActiveTab(index) {
- this.activeTabIndex = index;
-
- this.setScope(this.tabScope);
- this.fetchMergeRequests();
+ hideDropdown() {
+ this.$emit('hide');
},
},
};
@@ -40,31 +27,33 @@ export default {
<template>
<div class="dropdown-menu ide-merge-requests-dropdown">
- <tabs
- stop-propagation
- @changed="updateActiveTab"
- >
- <tab
- :title="__('Created by me')"
- active
- >
+ <tabs stop-propagation>
+ <tab active>
+ <template slot="title">
+ {{ __('Created by me') }}
+ <span class="badge badge-pill">
+ {{ createdMergeRequestLength }}
+ </span>
+ </template>
<list
- v-if="activeTabIndex === 0"
- :is-loading="isLoading"
- :items="mergeRequests"
+ type="created"
:current-id="currentMergeRequestId"
:empty-text="__('You have not created any merge requests')"
- @search="fetchMergeRequests"
+ @hide="hideDropdown"
/>
</tab>
- <tab :title="__('Assigned to me')">
+ <tab>
+ <template slot="title">
+ {{ __('Assigned to me') }}
+ <span class="badge badge-pill">
+ {{ assignedData.mergeRequests.length }}
+ </span>
+ </template>
<list
- v-if="activeTabIndex === 1"
- :is-loading="isLoading"
- :items="mergeRequests"
+ type="assigned"
:current-id="currentMergeRequestId"
:empty-text="__('You do not have any assigned merge requests')"
- @search="fetchMergeRequests"
+ @hide="hideDropdown"
/>
</tab>
</tabs>
diff --git a/app/assets/javascripts/ide/components/merge_requests/list.vue b/app/assets/javascripts/ide/components/merge_requests/list.vue
index 0d81da12246..829fe219603 100644
--- a/app/assets/javascripts/ide/components/merge_requests/list.vue
+++ b/app/assets/javascripts/ide/components/merge_requests/list.vue
@@ -1,4 +1,5 @@
<script>
+import { mapActions, mapGetters } from 'vuex';
import _ from 'underscore';
import LoadingIcon from '../../../vue_shared/components/loading_icon.vue';
import Item from './item.vue';
@@ -9,12 +10,8 @@ export default {
Item,
},
props: {
- isLoading: {
- type: Boolean,
- required: true,
- },
- items: {
- type: Array,
+ type: {
+ type: String,
required: true,
},
currentId: {
@@ -32,24 +29,41 @@ export default {
};
},
computed: {
+ ...mapGetters('mergeRequests', ['getData']),
+ data() {
+ return this.getData(this.type);
+ },
+ isLoading() {
+ return this.data.isLoading;
+ },
+ mergeRequests() {
+ return this.data.mergeRequests;
+ },
hasMergeRequests() {
- return this.items.length !== 0;
+ return this.mergeRequests.length !== 0;
},
hasNoSearchResults() {
return this.search !== '' && !this.hasMergeRequests;
},
},
- watch: {
- isLoading() {
- this.focusSearch();
- },
+ mounted() {
+ this.loadMergeRequests();
},
methods: {
+ ...mapActions('mergeRequests', ['fetchMergeRequests']),
+ ...mapActions(['closeAllFiles']),
+ loadMergeRequests() {
+ this.fetchMergeRequests({ type: this.type, search: this.search });
+ },
viewMergeRequest(item) {
- this.$router.push(`/project/${item.projectPathWithNamespace}/merge_requests/${item.iid}`);
+ return this.closeAllFiles()
+ .then(() => {
+ this.$emit('hide');
+ this.$router.push(`/project/${item.projectPathWithNamespace}/merge_requests/${item.iid}`);
+ });
},
searchMergeRequests: _.debounce(function debounceSearch() {
- this.$emit('search', this.search);
+ this.loadMergeRequests();
}, 250),
focusSearch() {
if (!this.isLoading) {
@@ -88,7 +102,7 @@ export default {
<ul class="mb-3">
<template v-if="hasMergeRequests">
<li
- v-for="item in items"
+ v-for="item in mergeRequests"
:key="item.id"
>
<item
@@ -103,7 +117,7 @@ export default {
class="ide-merge-requests-empty d-flex align-items-center justify-content-center"
>
<template v-if="hasNoSearchResults">
- No merge requests found
+ {{ __('No merge requests found') }}
</template>
<template v-else>
{{ emptyText }}
diff --git a/app/assets/javascripts/ide/stores/actions/merge_request.js b/app/assets/javascripts/ide/stores/actions/merge_request.js
index 5ec9bd661bb..edb20ff96fc 100644
--- a/app/assets/javascripts/ide/stores/actions/merge_request.js
+++ b/app/assets/javascripts/ide/stores/actions/merge_request.js
@@ -17,9 +17,7 @@ export const getMergeRequestData = (
mergeRequestId,
mergeRequest: data,
});
- if (!state.currentMergeRequestId) {
- commit(types.SET_CURRENT_MERGE_REQUEST, mergeRequestId);
- }
+ commit(types.SET_CURRENT_MERGE_REQUEST, mergeRequestId);
resolve(data);
})
.catch(() => {
diff --git a/app/assets/javascripts/ide/stores/modules/merge_requests/actions.js b/app/assets/javascripts/ide/stores/modules/merge_requests/actions.js
index 2b32c0c0b55..83b5b93d3a8 100644
--- a/app/assets/javascripts/ide/stores/modules/merge_requests/actions.js
+++ b/app/assets/javascripts/ide/stores/modules/merge_requests/actions.js
@@ -1,27 +1,28 @@
import { __ } from '../../../../locale';
import Api from '../../../../api';
import flash from '../../../../flash';
+import { scopes } from './constants';
import * as types from './mutation_types';
-export const requestMergeRequests = ({ commit }) => commit(types.REQUEST_MERGE_REQUESTS);
-export const receiveMergeRequestsError = ({ commit }) => {
+export const requestMergeRequests = ({ commit }, type) =>
+ commit(types.REQUEST_MERGE_REQUESTS, type);
+export const receiveMergeRequestsError = ({ commit }, type) => {
flash(__('Error loading merge requests.'));
- commit(types.RECEIVE_MERGE_REQUESTS_ERROR);
+ commit(types.RECEIVE_MERGE_REQUESTS_ERROR, type);
};
-export const receiveMergeRequestsSuccess = ({ commit }, data) =>
- commit(types.RECEIVE_MERGE_REQUESTS_SUCCESS, data);
+export const receiveMergeRequestsSuccess = ({ commit }, { type, data }) =>
+ commit(types.RECEIVE_MERGE_REQUESTS_SUCCESS, { type, data });
-export const fetchMergeRequests = ({ dispatch, state: { scope, state } }, search = '') => {
- dispatch('requestMergeRequests');
- dispatch('resetMergeRequests');
+export const fetchMergeRequests = ({ dispatch, state: { state } }, { type, search = '' }) => {
+ const scope = scopes[type];
+ dispatch('requestMergeRequests', type);
+ dispatch('resetMergeRequests', type);
Api.mergeRequests({ scope, state, search })
- .then(({ data }) => dispatch('receiveMergeRequestsSuccess', data))
- .catch(() => dispatch('receiveMergeRequestsError'));
+ .then(({ data }) => dispatch('receiveMergeRequestsSuccess', { type, data }))
+ .catch(() => dispatch('receiveMergeRequestsError', type));
};
-export const resetMergeRequests = ({ commit }) => commit(types.RESET_MERGE_REQUESTS);
-
-export const setScope = ({ commit }, scope) => commit(types.SET_SCOPE, scope);
+export const resetMergeRequests = ({ commit }, type) => commit(types.RESET_MERGE_REQUESTS, type);
export default () => {};
diff --git a/app/assets/javascripts/ide/stores/modules/merge_requests/constants.js b/app/assets/javascripts/ide/stores/modules/merge_requests/constants.js
index 64b7763f257..a7085c7d04c 100644
--- a/app/assets/javascripts/ide/stores/modules/merge_requests/constants.js
+++ b/app/assets/javascripts/ide/stores/modules/merge_requests/constants.js
@@ -1,6 +1,6 @@
export const scopes = {
- assignedToMe: 'assigned-to-me',
- createdByMe: 'created-by-me',
+ assigned: 'assigned-to-me',
+ created: 'created-by-me',
};
export const states = {
diff --git a/app/assets/javascripts/ide/stores/modules/merge_requests/getters.js b/app/assets/javascripts/ide/stores/modules/merge_requests/getters.js
new file mode 100644
index 00000000000..8e2b234be8d
--- /dev/null
+++ b/app/assets/javascripts/ide/stores/modules/merge_requests/getters.js
@@ -0,0 +1,4 @@
+export const getData = state => type => state[type];
+
+export const assignedData = state => state.assigned;
+export const createdData = state => state.created;
diff --git a/app/assets/javascripts/ide/stores/modules/merge_requests/index.js b/app/assets/javascripts/ide/stores/modules/merge_requests/index.js
index 04e7e0f08f1..2e6dfb420f4 100644
--- a/app/assets/javascripts/ide/stores/modules/merge_requests/index.js
+++ b/app/assets/javascripts/ide/stores/modules/merge_requests/index.js
@@ -1,5 +1,6 @@
import state from './state';
import * as actions from './actions';
+import * as getters from './getters';
import mutations from './mutations';
export default {
@@ -7,4 +8,5 @@ export default {
state: state(),
actions,
mutations,
+ getters,
};
diff --git a/app/assets/javascripts/ide/stores/modules/merge_requests/mutation_types.js b/app/assets/javascripts/ide/stores/modules/merge_requests/mutation_types.js
index 6d163491209..0badddcbae7 100644
--- a/app/assets/javascripts/ide/stores/modules/merge_requests/mutation_types.js
+++ b/app/assets/javascripts/ide/stores/modules/merge_requests/mutation_types.js
@@ -3,5 +3,3 @@ export const RECEIVE_MERGE_REQUESTS_ERROR = 'RECEIVE_MERGE_REQUESTS_ERROR';
export const RECEIVE_MERGE_REQUESTS_SUCCESS = 'RECEIVE_MERGE_REQUESTS_SUCCESS';
export const RESET_MERGE_REQUESTS = 'RESET_MERGE_REQUESTS';
-
-export const SET_SCOPE = 'SET_SCOPE';
diff --git a/app/assets/javascripts/ide/stores/modules/merge_requests/mutations.js b/app/assets/javascripts/ide/stores/modules/merge_requests/mutations.js
index 5c0c502b0d1..971da0806bd 100644
--- a/app/assets/javascripts/ide/stores/modules/merge_requests/mutations.js
+++ b/app/assets/javascripts/ide/stores/modules/merge_requests/mutations.js
@@ -2,15 +2,15 @@
import * as types from './mutation_types';
export default {
- [types.REQUEST_MERGE_REQUESTS](state) {
- state.isLoading = true;
+ [types.REQUEST_MERGE_REQUESTS](state, type) {
+ state[type].isLoading = true;
},
- [types.RECEIVE_MERGE_REQUESTS_ERROR](state) {
- state.isLoading = false;
+ [types.RECEIVE_MERGE_REQUESTS_ERROR](state, type) {
+ state[type].isLoading = false;
},
- [types.RECEIVE_MERGE_REQUESTS_SUCCESS](state, data) {
- state.isLoading = false;
- state.mergeRequests = data.map(mergeRequest => ({
+ [types.RECEIVE_MERGE_REQUESTS_SUCCESS](state, { type, data }) {
+ state[type].isLoading = false;
+ state[type].mergeRequests = data.map(mergeRequest => ({
id: mergeRequest.id,
iid: mergeRequest.iid,
title: mergeRequest.title,
@@ -20,10 +20,7 @@ export default {
.replace(`/merge_requests/${mergeRequest.iid}`, ''),
}));
},
- [types.RESET_MERGE_REQUESTS](state) {
- state.mergeRequests = [];
- },
- [types.SET_SCOPE](state, scope) {
- state.scope = scope;
+ [types.RESET_MERGE_REQUESTS](state, type) {
+ state[type].mergeRequests = [];
},
};
diff --git a/app/assets/javascripts/ide/stores/modules/merge_requests/state.js b/app/assets/javascripts/ide/stores/modules/merge_requests/state.js
index 64ca24b1af6..57eb6b04283 100644
--- a/app/assets/javascripts/ide/stores/modules/merge_requests/state.js
+++ b/app/assets/javascripts/ide/stores/modules/merge_requests/state.js
@@ -1,8 +1,13 @@
-import { scopes, states } from './constants';
+import { states } from './constants';
export default () => ({
- isLoading: false,
- mergeRequests: [],
- scope: scopes.createdByMe,
+ created: {
+ isLoading: false,
+ mergeRequests: [],
+ },
+ assigned: {
+ isLoading: false,
+ mergeRequests: [],
+ },
state: states.opened,
});
diff --git a/app/assets/javascripts/vue_shared/components/tabs/tab.vue b/app/assets/javascripts/vue_shared/components/tabs/tab.vue
index 2a35d6bc151..0ec7a0199fe 100644
--- a/app/assets/javascripts/vue_shared/components/tabs/tab.vue
+++ b/app/assets/javascripts/vue_shared/components/tabs/tab.vue
@@ -26,6 +26,9 @@ export default {
created() {
this.isTab = true;
},
+ updated() {
+ this.$parent.$forceUpdate();
+ },
};
</script>
diff --git a/app/assets/javascripts/vue_shared/components/tabs/tabs.js b/app/assets/javascripts/vue_shared/components/tabs/tabs.js
index 8497c3e851f..4b2996f76d5 100644
--- a/app/assets/javascripts/vue_shared/components/tabs/tabs.js
+++ b/app/assets/javascripts/vue_shared/components/tabs/tabs.js
@@ -29,8 +29,6 @@ export default {
this.tabs[index].localActive = true;
this.currentIndex = index;
-
- this.$emit('changed', this.currentIndex);
},
},
render(h) {