diff options
author | Jose Ivan Vargas <jvargas@gitlab.com> | 2018-03-01 16:09:25 -0600 |
---|---|---|
committer | Jose Ivan Vargas <jvargas@gitlab.com> | 2018-03-06 16:32:26 -0600 |
commit | a16547e5c2d42bfe7af025556e90f0f895a97f59 (patch) | |
tree | 093a4c25545f78454fda80c681570e264aab143b | |
parent | f42397d19a735de2e5ae38725270614826ec05da (diff) | |
download | gitlab-ce-jivl-new-modal-project-labels-milestones.tar.gz |
used respond_to formats for persisting flash messages insteadjivl-new-modal-project-labels-milestones
14 files changed, 36 insertions, 96 deletions
diff --git a/app/assets/javascripts/lib/utils/flash_queue.js b/app/assets/javascripts/lib/utils/flash_queue.js deleted file mode 100644 index f77afddbae3..00000000000 --- a/app/assets/javascripts/lib/utils/flash_queue.js +++ /dev/null @@ -1,46 +0,0 @@ -import _ from 'underscore'; -import createFlash from '~/flash'; -import AccessorUtilities from '~/lib/utils/accessor'; - -const FLASH_QUEUE_KEY = 'flash-key'; - -export function popFlashMessage() { - const page = $('body').attr('data-page'); - let savedFlashMessages; - let returnVal = false; - - if (!page) { - return returnVal; - } - - if (AccessorUtilities.isLocalStorageAccessSafe()) { - savedFlashMessages = JSON.parse(window.localStorage.getItem(FLASH_QUEUE_KEY)); - const queuedMessage = _.findWhere(savedFlashMessages, { bodyData: page }); - if (queuedMessage) { - const queuedMessageIndex = _.findIndex(savedFlashMessages, { bodyData: page }); - createFlash(queuedMessage.message, queuedMessage.type); - savedFlashMessages.splice(queuedMessageIndex, 1); - window.localStorage.setItem(FLASH_QUEUE_KEY, JSON.stringify(savedFlashMessages)); - } - returnVal = true; - } - - return returnVal; -} - -export function saveFlashMessage(bodyData, message, type) { - let savedFlashMessages; - - if (AccessorUtilities.isLocalStorageAccessSafe()) { - savedFlashMessages = JSON.parse(window.localStorage.getItem(FLASH_QUEUE_KEY)); - if (!savedFlashMessages) { - savedFlashMessages = []; - } - savedFlashMessages.push({ - bodyData, - message, - type, - }); - window.localStorage.setItem(FLASH_QUEUE_KEY, JSON.stringify(savedFlashMessages)); - } -} diff --git a/app/assets/javascripts/main.js b/app/assets/javascripts/main.js index f76e2ae47a0..659dc9eaa1f 100644 --- a/app/assets/javascripts/main.js +++ b/app/assets/javascripts/main.js @@ -33,7 +33,6 @@ import './milestone_select'; import './projects_dropdown'; import './render_gfm'; import initBreadcrumbs from './breadcrumb'; -import { popFlashMessage } from './lib/utils/flash_queue'; import initDispatcher from './dispatcher'; @@ -263,5 +262,4 @@ document.addEventListener('DOMContentLoaded', () => { } initDispatcher(); - popFlashMessage(); }); diff --git a/app/assets/javascripts/pages/milestones/shared/components/promote_milestone_modal.vue b/app/assets/javascripts/pages/milestones/shared/components/promote_milestone_modal.vue index af85c3915df..22248418c41 100644 --- a/app/assets/javascripts/pages/milestones/shared/components/promote_milestone_modal.vue +++ b/app/assets/javascripts/pages/milestones/shared/components/promote_milestone_modal.vue @@ -1,10 +1,9 @@ <script> import axios from '~/lib/utils/axios_utils'; import createFlash from '~/flash'; - import { saveFlashMessage } from '~/lib/utils/flash_queue'; import GlModal from '~/vue_shared/components/gl_modal.vue'; - import { redirectTo } from '~/lib/utils/url_utility'; import { s__, sprintf } from '~/locale'; + import { visitUrl } from '~/lib/utils/url_utility'; import eventHub from '../event_hub'; export default { @@ -27,20 +26,17 @@ }, text() { return s__(`Milestones|Promoting this milestone will make it available for all projects inside the group. - Existing project milestones with the same name will be merged. + Existing project milestones with the same title will be merged. This action cannot be reversed.`); }, }, methods: { onSubmit() { eventHub.$emit('promoteMilestoneModal.requestStarted', this.url); - return axios.post(this.url) + return axios.post(this.url, { params: { format: 'json' } }) .then((response) => { eventHub.$emit('promoteMilestoneModal.requestFinished', { milestoneUrl: this.url, successful: true }); - const responseURL = new URL(response.request.responseURL); - const bodyData = responseURL.searchParams.get('body_data'); - saveFlashMessage(bodyData, `${this.milestoneTitle} promoted to group milestone`, 'notice'); - redirectTo(`${responseURL.protocol}//${responseURL.host}${responseURL.pathname}`); + visitUrl(response.data.url); }) .catch((error) => { eventHub.$emit('promoteMilestoneModal.requestFinished', { milestoneUrl: this.url, successful: false }); diff --git a/app/assets/javascripts/pages/projects/labels/components/promote_label_modal.vue b/app/assets/javascripts/pages/projects/labels/components/promote_label_modal.vue index a6388d886e2..54695dfeb99 100644 --- a/app/assets/javascripts/pages/projects/labels/components/promote_label_modal.vue +++ b/app/assets/javascripts/pages/projects/labels/components/promote_label_modal.vue @@ -1,10 +1,9 @@ <script> import axios from '~/lib/utils/axios_utils'; - import { saveFlashMessage } from '~/lib/utils/flash_queue'; import createFlash from '~/flash'; import GlModal from '~/vue_shared/components/gl_modal.vue'; - import { redirectTo } from '~/lib/utils/url_utility'; import { s__, sprintf } from '~/locale'; + import { visitUrl } from '~/lib/utils/url_utility'; import eventHub from '../event_hub'; export default { @@ -32,7 +31,7 @@ computed: { text() { return s__(`Milestones|Promoting this label will make it available for all projects inside the group. - Existing project labels with the same name will be merged. This action cannot be reversed.`); + Existing project labels with the same title will be merged. This action cannot be reversed.`); }, title() { const label = `<span @@ -48,13 +47,10 @@ methods: { onSubmit() { eventHub.$emit('promoteLabelModal.requestStarted', this.url); - return axios.post(this.url) + return axios.post(this.url, { params: { format: 'json' } }) .then((response) => { eventHub.$emit('promoteLabelModal.requestFinished', { labelUrl: this.url, successful: true }); - const responseURL = new URL(response.request.responseURL); - const bodyData = responseURL.searchParams.get('body_data'); - saveFlashMessage(bodyData, `${this.labelTitle} promoted to group label`, 'notice'); - redirectTo(`${responseURL.protocol}//${responseURL.host}${responseURL.pathname}`); + visitUrl(response.data.url); }) .catch((error) => { eventHub.$emit('promoteLabelModal.requestFinished', { labelUrl: this.url, successful: false }); diff --git a/app/controllers/projects/labels_controller.rb b/app/controllers/projects/labels_controller.rb index a9fc890b28c..99790b8e7e8 100644 --- a/app/controllers/projects/labels_controller.rb +++ b/app/controllers/projects/labels_controller.rb @@ -1,6 +1,5 @@ class Projects::LabelsController < Projects::ApplicationController include ToggleSubscriptionAction - include FlashHelper before_action :check_issuables_available! before_action :label, only: [:edit, :update, :destroy, :promote] @@ -113,11 +112,14 @@ class Projects::LabelsController < Projects::ApplicationController begin return render_404 unless promote_service.execute(@label) + flash[:notice] = "#{@label.title} promoted to group label." respond_to do |format| format.html do - redirect_to(project_labels_path(@project, body_data: get_body_data_page(project_labels_path(@project))), status: 303) + redirect_to(project_labels_path(@project), status: 303) + end + format.json do + render json: { url: project_labels_path(@project) } end - format.js end rescue ActiveRecord::RecordInvalid => e Gitlab::AppLogger.error "Failed to promote label \"#{@label.title}\" to group label" diff --git a/app/controllers/projects/milestones_controller.rb b/app/controllers/projects/milestones_controller.rb index 9a4e99c39e9..ff93147d00f 100644 --- a/app/controllers/projects/milestones_controller.rb +++ b/app/controllers/projects/milestones_controller.rb @@ -1,6 +1,5 @@ class Projects::MilestonesController < Projects::ApplicationController include MilestoneActions - include FlashHelper before_action :check_issuables_available! before_action :milestone, only: [:edit, :update, :destroy, :show, :merge_requests, :participants, :labels, :promote] @@ -72,7 +71,16 @@ class Projects::MilestonesController < Projects::ApplicationController def promote Milestones::PromoteService.new(project, current_user).execute(milestone) - redirect_to project_milestones_path(project, body_data: get_body_data_page(project_milestones_path(project))), status: 303 + + flash[:notice] = "#{milestone.title} promoted to group milestone" + respond_to do |format| + format.html do + redirect_to project_milestones_path(project) + end + format.json do + render json: { url: project_milestones_path(project) } + end + end rescue Milestones::PromoteService::PromoteMilestoneError => error redirect_to milestone, alert: error.message end diff --git a/app/helpers/flash_helper.rb b/app/helpers/flash_helper.rb deleted file mode 100644 index 26572d4f206..00000000000 --- a/app/helpers/flash_helper.rb +++ /dev/null @@ -1,8 +0,0 @@ -module FlashHelper - def get_body_data_page(path) - return unless path.empty? == false - - path_controller = Rails.application.routes.recognize_path(path) - [path_controller[:controller].split('/'), path_controller[:action]].compact.join(':') - end -end diff --git a/app/views/projects/milestones/show.html.haml b/app/views/projects/milestones/show.html.haml index baf9dd465c0..b423888c875 100644 --- a/app/views/projects/milestones/show.html.haml +++ b/app/views/projects/milestones/show.html.haml @@ -32,7 +32,8 @@ milestone_title: @milestone.title, url: promote_project_milestone_path(@milestone.project, @milestone), container: 'body' }, - disabled: true } + disabled: true, + type: 'button' } = _('Promote') #promote-milestone-modal diff --git a/app/views/shared/_label.html.haml b/app/views/shared/_label.html.haml index b49be4a4376..5afbc78df53 100644 --- a/app/views/shared/_label.html.haml +++ b/app/views/shared/_label.html.haml @@ -48,15 +48,16 @@ .pull-right.hidden-xs.hidden-sm - if label.is_a?(ProjectLabel) && label.project.group && can?(current_user, :admin_label, label.project.group) - %a.js-promote-project-label-button.btn.btn-transparent.btn-action.has-tooltip{ title: _('Promote to Group Label'), + %button.js-promote-project-label-button.btn.btn-transparent.btn-action.has-tooltip{ title: _('Promote to Group Label'), + disabled: true, + type: 'button', data: { url: promote_project_label_path(label.project, label), label_title: label.title, label_color: label.color, label_text_color: label.text_color, target: '#promote-label-modal', container: 'body', - toggle: 'modal' }, - disabled: true } + toggle: 'modal' } } = sprite_icon('level-up') - if can?(current_user, :admin_label, label) = link_to edit_label_path(label), title: "Edit", class: 'btn btn-transparent btn-action', data: {toggle: "tooltip"} do diff --git a/app/views/shared/milestones/_milestone.html.haml b/app/views/shared/milestones/_milestone.html.haml index 7a23f79d8c5..fe814cbc561 100644 --- a/app/views/shared/milestones/_milestone.html.haml +++ b/app/views/shared/milestones/_milestone.html.haml @@ -51,13 +51,14 @@ \ - if @project.group - %a.js-promote-project-milestone-button.btn.btn-xs.btn-grouped.has-tooltip{ title: _('Promote to Group Milestone'), + %button.js-promote-project-milestone-button.btn.btn-xs.btn-grouped.has-tooltip{ title: _('Promote to Group Milestone'), + disabled: true, + type: 'button', data: { url: promote_project_milestone_path(milestone.project, milestone), milestone_title: milestone.title, target: '#promote-milestone-modal', container: 'body', - toggle: 'modal' }, - disabled: true } + toggle: 'modal' } } = _('Promote') = link_to 'Close Milestone', project_milestone_path(@project, milestone, milestone: {state_event: :close }), method: :put, remote: true, class: "btn btn-xs btn-close btn-grouped" diff --git a/spec/controllers/projects/labels_controller_spec.rb b/spec/controllers/projects/labels_controller_spec.rb index 0cba8486e79..452d7e23983 100644 --- a/spec/controllers/projects/labels_controller_spec.rb +++ b/spec/controllers/projects/labels_controller_spec.rb @@ -133,7 +133,7 @@ describe Projects::LabelsController do it 'gives access' do post :promote, namespace_id: project.namespace.to_param, project_id: project, id: label_1.to_param - expect(response.location).to include(namespace_project_labels_path) + expect(response).to redirect_to(namespace_project_labels_path) end it 'promotes the label' do diff --git a/spec/controllers/projects/milestones_controller_spec.rb b/spec/controllers/projects/milestones_controller_spec.rb index f44e77ab88d..306094f7ffb 100644 --- a/spec/controllers/projects/milestones_controller_spec.rb +++ b/spec/controllers/projects/milestones_controller_spec.rb @@ -98,7 +98,8 @@ describe Projects::MilestonesController do it 'shows group milestone' do post :promote, namespace_id: project.namespace.id, project_id: project.id, id: milestone.iid - expect(response.location).to include(project_milestones_path(project)) + expect(flash[:notice]).to eq("#{milestone.title} promoted to group milestone") + expect(response).to redirect_to(project_milestones_path(project)) end end diff --git a/spec/javascripts/pages/labels/components/promote_label_modal_spec.js b/spec/javascripts/pages/labels/components/promote_label_modal_spec.js index e68c957e135..ba2e07f02f7 100644 --- a/spec/javascripts/pages/labels/components/promote_label_modal_spec.js +++ b/spec/javascripts/pages/labels/components/promote_label_modal_spec.js @@ -2,7 +2,6 @@ import Vue from 'vue'; import promoteLabelModal from '~/pages/projects/labels/components/promote_label_modal.vue'; import eventHub from '~/pages/projects/labels/event_hub'; import axios from '~/lib/utils/axios_utils'; -import * as urlUtility from '~/lib/utils/url_utility'; import mountComponent from '../../../helpers/vue_mount_component_helper'; describe('Promote label modal', () => { @@ -59,11 +58,9 @@ describe('Promote label modal', () => { }, }); }); - const redirectSpy = spyOn(urlUtility, 'redirectTo'); vm.onSubmit() .then(() => { - expect(redirectSpy).toHaveBeenCalledWith(responseURL); expect(eventHub.$emit).toHaveBeenCalledWith('promoteLabelModal.requestFinished', { labelUrl: labelMockData.url, successful: true }); }) .then(done) @@ -78,12 +75,10 @@ describe('Promote label modal', () => { expect(eventHub.$emit).toHaveBeenCalledWith('promoteLabelModal.requestStarted', labelMockData.url); return Promise.reject(dummyError); }); - const redirectSpy = spyOn(urlUtility, 'redirectTo'); vm.onSubmit() .catch((error) => { expect(error).toBe(dummyError); - expect(redirectSpy).not.toHaveBeenCalled(); expect(eventHub.$emit).toHaveBeenCalledWith('promoteLabelModal.requestFinished', { labelUrl: labelMockData.url, successful: false }); }) .then(done) diff --git a/spec/javascripts/pages/milestones/shared/components/promote_milestone_modal_spec.js b/spec/javascripts/pages/milestones/shared/components/promote_milestone_modal_spec.js index d0ec4df7232..bf044fe8fb5 100644 --- a/spec/javascripts/pages/milestones/shared/components/promote_milestone_modal_spec.js +++ b/spec/javascripts/pages/milestones/shared/components/promote_milestone_modal_spec.js @@ -2,7 +2,6 @@ import Vue from 'vue'; import promoteMilestoneModal from '~/pages/milestones/shared/components/promote_milestone_modal.vue'; import eventHub from '~/pages/milestones/shared/event_hub'; import axios from '~/lib/utils/axios_utils'; -import * as urlUtility from '~/lib/utils/url_utility'; import mountComponent from '../../../../helpers/vue_mount_component_helper'; describe('Promote milestone modal', () => { @@ -54,11 +53,9 @@ describe('Promote milestone modal', () => { }, }); }); - const redirectSpy = spyOn(urlUtility, 'redirectTo'); vm.onSubmit() .then(() => { - expect(redirectSpy).toHaveBeenCalledWith(responseURL); expect(eventHub.$emit).toHaveBeenCalledWith('promoteMilestoneModal.requestFinished', { milestoneUrl: milestoneMockData.url, successful: true }); }) .then(done) @@ -73,12 +70,10 @@ describe('Promote milestone modal', () => { expect(eventHub.$emit).toHaveBeenCalledWith('promoteMilestoneModal.requestStarted', milestoneMockData.url); return Promise.reject(dummyError); }); - const redirectSpy = spyOn(urlUtility, 'redirectTo'); vm.onSubmit() .catch((error) => { expect(error).toBe(dummyError); - expect(redirectSpy).not.toHaveBeenCalled(); expect(eventHub.$emit).toHaveBeenCalledWith('promoteMilestoneModal.requestFinished', { milestoneUrl: milestoneMockData.url, successful: false }); }) .then(done) |