Commit ad5809ec authored by Winnie Hellmann's avatar Winnie Hellmann Committed by Paul Slaughter

Remove vue resource from sidebar service

Fixes https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/32400
parent 7ed69a1d
...@@ -67,18 +67,14 @@ export default { ...@@ -67,18 +67,14 @@ export default {
saveAssignees() { saveAssignees() {
this.loading = true; this.loading = true;
function setLoadingFalse() {
this.loading = false;
}
this.mediator this.mediator
.saveAssignees(this.field) .saveAssignees(this.field)
.then(setLoadingFalse.bind(this))
.then(() => { .then(() => {
this.loading = false;
refreshUserMergeRequestCounts(); refreshUserMergeRequestCounts();
}) })
.catch(() => { .catch(() => {
setLoadingFalse(); this.loading = false;
return new Flash(__('Error occurred when saving assignees')); return new Flash(__('Error occurred when saving assignees'));
}); });
}, },
......
import Vue from 'vue'; import axios from '~/lib/utils/axios_utils';
import VueResource from 'vue-resource';
Vue.use(VueResource);
export default class SidebarService { export default class SidebarService {
constructor(endpointMap) { constructor(endpointMap) {
...@@ -18,23 +15,15 @@ export default class SidebarService { ...@@ -18,23 +15,15 @@ export default class SidebarService {
} }
get() { get() {
return Vue.http.get(this.endpoint); return axios.get(this.endpoint);
} }
update(key, data) { update(key, data) {
return Vue.http.put( return axios.put(this.endpoint, { [key]: data });
this.endpoint,
{
[key]: data,
},
{
emulateJSON: true,
},
);
} }
getProjectsAutocomplete(searchTerm) { getProjectsAutocomplete(searchTerm) {
return Vue.http.get(this.projectsAutocompleteEndpoint, { return axios.get(this.projectsAutocompleteEndpoint, {
params: { params: {
search: searchTerm, search: searchTerm,
}, },
...@@ -42,11 +31,11 @@ export default class SidebarService { ...@@ -42,11 +31,11 @@ export default class SidebarService {
} }
toggleSubscription() { toggleSubscription() {
return Vue.http.post(this.toggleSubscriptionEndpoint); return axios.post(this.toggleSubscriptionEndpoint);
} }
moveIssue(moveToProjectId) { moveIssue(moveToProjectId) {
return Vue.http.post(this.moveIssueEndpoint, { return axios.post(this.moveIssueEndpoint, {
move_to_project_id: moveToProjectId, move_to_project_id: moveToProjectId,
}); });
} }
......
...@@ -32,7 +32,10 @@ export default class SidebarMediator { ...@@ -32,7 +32,10 @@ export default class SidebarMediator {
// If there are no ids, that means we have to unassign (which is id = 0) // If there are no ids, that means we have to unassign (which is id = 0)
// And it only accepts an array, hence [0] // And it only accepts an array, hence [0]
return this.service.update(field, selected.length === 0 ? [0] : selected); const assignees = selected.length === 0 ? [0] : selected;
const data = { assignee_ids: assignees };
return this.service.update(field, data);
} }
setMoveToProjectId(projectId) { setMoveToProjectId(projectId) {
...@@ -42,8 +45,7 @@ export default class SidebarMediator { ...@@ -42,8 +45,7 @@ export default class SidebarMediator {
fetch() { fetch() {
return this.service return this.service
.get() .get()
.then(response => response.json()) .then(({ data }) => {
.then(data => {
this.processFetchedData(data); this.processFetchedData(data);
}) })
.catch(() => new Flash(__('Error occurred when fetching sidebar data'))); .catch(() => new Flash(__('Error occurred when fetching sidebar data')));
...@@ -71,20 +73,14 @@ export default class SidebarMediator { ...@@ -71,20 +73,14 @@ export default class SidebarMediator {
} }
fetchAutocompleteProjects(searchTerm) { fetchAutocompleteProjects(searchTerm) {
return this.service return this.service.getProjectsAutocomplete(searchTerm).then(({ data }) => {
.getProjectsAutocomplete(searchTerm)
.then(response => response.json())
.then(data => {
this.store.setAutocompleteProjects(data); this.store.setAutocompleteProjects(data);
return this.store.autocompleteProjects; return this.store.autocompleteProjects;
}); });
} }
moveIssue() { moveIssue() {
return this.service return this.service.moveIssue(this.store.moveToProjectId).then(({ data }) => {
.moveIssue(this.store.moveToProjectId)
.then(response => response.json())
.then(data => {
if (window.location.pathname !== data.web_url) { if (window.location.pathname !== data.web_url) {
visitUrl(data.web_url); visitUrl(data.web_url);
} }
......
- issuable_type = issuable_sidebar[:type] - issuable_type = issuable_sidebar[:type]
- signed_in = !!issuable_sidebar.dig(:current_user, :id) - signed_in = !!issuable_sidebar.dig(:current_user, :id)
#js-vue-sidebar-assignees{ data: { field: "#{issuable_type}[assignee_ids]", signed_in: signed_in } } #js-vue-sidebar-assignees{ data: { field: "#{issuable_type}", signed_in: signed_in } }
.title.hide-collapsed .title.hide-collapsed
= _('Assignee') = _('Assignee')
= icon('spinner spin') = icon('spinner spin')
......
---
title: Remove vue resource from sidebar service
merge_request: 32400
author: Lee Tickett
type: other
...@@ -16,9 +16,8 @@ export default class SidebarMediator extends CESidebarMediator { ...@@ -16,9 +16,8 @@ export default class SidebarMediator extends CESidebarMediator {
updateWeight(newWeight) { updateWeight(newWeight) {
this.store.setLoadingState('weight', true); this.store.setLoadingState('weight', true);
return this.service return this.service
.update('issue[weight]', newWeight) .update('issue', { weight: newWeight })
.then(res => res.json()) .then(({ data }) => {
.then(data => {
this.store.setWeight(data.weight); this.store.setWeight(data.weight);
this.store.setLoadingState('weight', false); this.store.setLoadingState('weight', false);
}) })
......
import Vue from 'vue';
import _ from 'underscore';
import SidebarMediator from 'ee/sidebar/sidebar_mediator'; import SidebarMediator from 'ee/sidebar/sidebar_mediator';
import CESidebarMediator from '~/sidebar/sidebar_mediator'; import CESidebarMediator from '~/sidebar/sidebar_mediator';
import CESidebarStore from '~/sidebar/stores/sidebar_store'; import CESidebarStore from '~/sidebar/stores/sidebar_store';
import SidebarService from '~/sidebar/services/sidebar_service'; import SidebarService from '~/sidebar/services/sidebar_service';
import Mock from './ee_mock_data'; import Mock from './ee_mock_data';
describe('EE Sidebar mediator', function() { describe('EE Sidebar mediator', () => {
let mediator;
beforeEach(() => { beforeEach(() => {
Vue.http.interceptors.push(Mock.sidebarMockInterceptor); mediator = new SidebarMediator(Mock.mediator);
this.mediator = new SidebarMediator(Mock.mediator);
}); });
afterEach(() => { afterEach(() => {
SidebarService.singleton = null; SidebarService.singleton = null;
CESidebarStore.singleton = null; CESidebarStore.singleton = null;
CESidebarMediator.singleton = null; CESidebarMediator.singleton = null;
Vue.http.interceptors = _.without(Vue.http.interceptors, Mock.sidebarMockInterceptor);
}); });
it('processes fetched data', () => { it('processes fetched data', () => {
const mockData = const mockData =
Mock.responseMap.GET['/gitlab-org/gitlab-shell/issues/5.json?serializer=sidebar']; Mock.responseMap.GET['/gitlab-org/gitlab-shell/issues/5.json?serializer=sidebar'];
this.mediator.processFetchedData(mockData); mediator.processFetchedData(mockData);
expect(this.mediator.store.weight).toEqual(mockData.weight); expect(mediator.store.weight).toEqual(mockData.weight);
}); });
}); });
...@@ -210,14 +210,4 @@ const mockData = { ...@@ -210,14 +210,4 @@ const mockData = {
}, },
}; };
mockData.sidebarMockInterceptor = function(request, next) {
const body = this.responseMap[request.method.toUpperCase()][request.url];
next(
request.respondWith(JSON.stringify(body), {
status: 200,
}),
);
}.bind(mockData);
export default mockData; export default mockData;
import _ from 'underscore';
import Vue from 'vue'; import Vue from 'vue';
import SidebarAssignees from '~/sidebar/components/assignees/sidebar_assignees.vue'; import SidebarAssignees from '~/sidebar/components/assignees/sidebar_assignees.vue';
import SidebarMediator from '~/sidebar/sidebar_mediator'; import SidebarMediator from '~/sidebar/sidebar_mediator';
...@@ -14,8 +13,6 @@ describe('sidebar assignees', () => { ...@@ -14,8 +13,6 @@ describe('sidebar assignees', () => {
preloadFixtures('issues/open-issue.html'); preloadFixtures('issues/open-issue.html');
beforeEach(() => { beforeEach(() => {
Vue.http.interceptors.push(Mock.sidebarMockInterceptor);
loadFixtures('issues/open-issue.html'); loadFixtures('issues/open-issue.html');
mediator = new SidebarMediator(Mock.mediator); mediator = new SidebarMediator(Mock.mediator);
...@@ -38,7 +35,6 @@ describe('sidebar assignees', () => { ...@@ -38,7 +35,6 @@ describe('sidebar assignees', () => {
SidebarService.singleton = null; SidebarService.singleton = null;
SidebarStore.singleton = null; SidebarStore.singleton = null;
SidebarMediator.singleton = null; SidebarMediator.singleton = null;
Vue.http.interceptors = _.without(Vue.http.interceptors, Mock.sidebarMockInterceptor);
}); });
it('calls the mediator when saves the assignees', () => { it('calls the mediator when saves the assignees', () => {
......
import _ from 'underscore'; import MockAdapter from 'axios-mock-adapter';
import Vue from 'vue'; import axios from '~/lib/utils/axios_utils';
import SidebarMediator from '~/sidebar/sidebar_mediator'; import SidebarMediator from '~/sidebar/sidebar_mediator';
import SidebarStore from '~/sidebar/stores/sidebar_store'; import SidebarStore from '~/sidebar/stores/sidebar_store';
import SidebarService from '~/sidebar/services/sidebar_service'; import SidebarService from '~/sidebar/services/sidebar_service';
import Mock from './mock_data'; import Mock from './mock_data';
const { mediator: mediatorMockData } = Mock;
describe('Sidebar mediator', function() { describe('Sidebar mediator', function() {
let mock;
beforeEach(() => { beforeEach(() => {
Vue.http.interceptors.push(Mock.sidebarMockInterceptor); mock = new MockAdapter(axios);
this.mediator = new SidebarMediator(Mock.mediator);
this.mediator = new SidebarMediator(mediatorMockData);
}); });
afterEach(() => { afterEach(() => {
SidebarService.singleton = null; SidebarService.singleton = null;
SidebarStore.singleton = null; SidebarStore.singleton = null;
SidebarMediator.singleton = null; SidebarMediator.singleton = null;
Vue.http.interceptors = _.without(Vue.http.interceptors, Mock.sidebarMockInterceptor); mock.restore();
}); });
it('assigns yourself ', () => { it('assigns yourself ', () => {
this.mediator.assignYourself(); this.mediator.assignYourself();
expect(this.mediator.store.currentUser).toEqual(Mock.mediator.currentUser); expect(this.mediator.store.currentUser).toEqual(mediatorMockData.currentUser);
expect(this.mediator.store.assignees[0]).toEqual(Mock.mediator.currentUser); expect(this.mediator.store.assignees[0]).toEqual(mediatorMockData.currentUser);
}); });
it('saves assignees', done => { it('saves assignees', done => {
mock.onPut(mediatorMockData.endpoint).reply(200, {});
this.mediator this.mediator
.saveAssignees('issue[assignee_ids]') .saveAssignees('issue[assignee_ids]')
.then(resp => { .then(resp => {
...@@ -36,8 +42,8 @@ describe('Sidebar mediator', function() { ...@@ -36,8 +42,8 @@ describe('Sidebar mediator', function() {
}); });
it('fetches the data', done => { it('fetches the data', done => {
const mockData = const mockData = Mock.responseMap.GET[mediatorMockData.endpoint];
Mock.responseMap.GET['/gitlab-org/gitlab-shell/issues/5.json?serializer=sidebar_extras']; mock.onGet(mediatorMockData.endpoint).reply(200, mockData);
spyOn(this.mediator, 'processFetchedData').and.callThrough(); spyOn(this.mediator, 'processFetchedData').and.callThrough();
this.mediator this.mediator
...@@ -50,8 +56,7 @@ describe('Sidebar mediator', function() { ...@@ -50,8 +56,7 @@ describe('Sidebar mediator', function() {
}); });
it('processes fetched data', () => { it('processes fetched data', () => {
const mockData = const mockData = Mock.responseMap.GET[mediatorMockData.endpoint];
Mock.responseMap.GET['/gitlab-org/gitlab-shell/issues/5.json?serializer=sidebar_extras'];
this.mediator.processFetchedData(mockData); this.mediator.processFetchedData(mockData);
expect(this.mediator.store.assignees).toEqual(mockData.assignees); expect(this.mediator.store.assignees).toEqual(mockData.assignees);
...@@ -74,6 +79,7 @@ describe('Sidebar mediator', function() { ...@@ -74,6 +79,7 @@ describe('Sidebar mediator', function() {
it('fetches autocomplete projects', done => { it('fetches autocomplete projects', done => {
const searchTerm = 'foo'; const searchTerm = 'foo';
mock.onGet(mediatorMockData.projectsAutocompleteEndpoint).reply(200, {});
spyOn(this.mediator.service, 'getProjectsAutocomplete').and.callThrough(); spyOn(this.mediator.service, 'getProjectsAutocomplete').and.callThrough();
spyOn(this.mediator.store, 'setAutocompleteProjects').and.callThrough(); spyOn(this.mediator.store, 'setAutocompleteProjects').and.callThrough();
...@@ -88,7 +94,9 @@ describe('Sidebar mediator', function() { ...@@ -88,7 +94,9 @@ describe('Sidebar mediator', function() {
}); });
it('moves issue', done => { it('moves issue', done => {
const mockData = Mock.responseMap.POST[mediatorMockData.moveIssueEndpoint];
const moveToProjectId = 7; const moveToProjectId = 7;
mock.onPost(mediatorMockData.moveIssueEndpoint).reply(200, mockData);
this.mediator.store.setMoveToProjectId(moveToProjectId); this.mediator.store.setMoveToProjectId(moveToProjectId);
spyOn(this.mediator.service, 'moveIssue').and.callThrough(); spyOn(this.mediator.service, 'moveIssue').and.callThrough();
const visitUrl = spyOnDependency(SidebarMediator, 'visitUrl'); const visitUrl = spyOnDependency(SidebarMediator, 'visitUrl');
...@@ -97,7 +105,7 @@ describe('Sidebar mediator', function() { ...@@ -97,7 +105,7 @@ describe('Sidebar mediator', function() {
.moveIssue() .moveIssue()
.then(() => { .then(() => {
expect(this.mediator.service.moveIssue).toHaveBeenCalledWith(moveToProjectId); expect(this.mediator.service.moveIssue).toHaveBeenCalledWith(moveToProjectId);
expect(visitUrl).toHaveBeenCalledWith('/root/some-project/issues/5'); expect(visitUrl).toHaveBeenCalledWith(mockData.web_url);
}) })
.then(done) .then(done)
.catch(done.fail); .catch(done.fail);
...@@ -105,6 +113,7 @@ describe('Sidebar mediator', function() { ...@@ -105,6 +113,7 @@ describe('Sidebar mediator', function() {
it('toggle subscription', done => { it('toggle subscription', done => {
this.mediator.store.setSubscribedState(false); this.mediator.store.setSubscribedState(false);
mock.onPost(mediatorMockData.toggleSubscriptionEndpoint).reply(200, {});
spyOn(this.mediator.service, 'toggleSubscription').and.callThrough(); spyOn(this.mediator.service, 'toggleSubscription').and.callThrough();
this.mediator this.mediator
......
import $ from 'jquery'; import $ from 'jquery';
import _ from 'underscore'; import MockAdapter from 'axios-mock-adapter';
import Vue from 'vue'; import axios from '~/lib/utils/axios_utils';
import SidebarMediator from '~/sidebar/sidebar_mediator'; import SidebarMediator from '~/sidebar/sidebar_mediator';
import SidebarStore from '~/sidebar/stores/sidebar_store'; import SidebarStore from '~/sidebar/stores/sidebar_store';
import SidebarService from '~/sidebar/services/sidebar_service'; import SidebarService from '~/sidebar/services/sidebar_service';
...@@ -8,8 +8,12 @@ import SidebarMoveIssue from '~/sidebar/lib/sidebar_move_issue'; ...@@ -8,8 +8,12 @@ import SidebarMoveIssue from '~/sidebar/lib/sidebar_move_issue';
import Mock from './mock_data'; import Mock from './mock_data';
describe('SidebarMoveIssue', function() { describe('SidebarMoveIssue', function() {
let mock;
beforeEach(() => { beforeEach(() => {
Vue.http.interceptors.push(Mock.sidebarMockInterceptor); mock = new MockAdapter(axios);
const mockData = Mock.responseMap.GET['/autocomplete/projects?project_id=15'];
mock.onGet('/autocomplete/projects?project_id=15').reply(200, mockData);
this.mediator = new SidebarMediator(Mock.mediator); this.mediator = new SidebarMediator(Mock.mediator);
this.$content = $(` this.$content = $(`
<div class="dropdown"> <div class="dropdown">
...@@ -37,8 +41,7 @@ describe('SidebarMoveIssue', function() { ...@@ -37,8 +41,7 @@ describe('SidebarMoveIssue', function() {
SidebarMediator.singleton = null; SidebarMediator.singleton = null;
this.sidebarMoveIssue.destroy(); this.sidebarMoveIssue.destroy();
mock.restore();
Vue.http.interceptors = _.without(Vue.http.interceptors, Mock.sidebarMockInterceptor);
}); });
describe('init', () => { describe('init', () => {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment