summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJose Ivan Vargas <jvargas@gitlab.com>2018-02-27 16:11:09 -0600
committerJose Ivan Vargas <jvargas@gitlab.com>2018-03-01 16:10:04 -0600
commitf42397d19a735de2e5ae38725270614826ec05da (patch)
tree36286a97975b687eac5dd12f3f9c369125d3189b
parent84e01b3e7a521c66077245a62247bd47a3731ddb (diff)
downloadgitlab-ce-f42397d19a735de2e5ae38725270614826ec05da.tar.gz
Add persistent flash messages
-rw-r--r--app/assets/javascripts/lib/utils/flash_queue.js46
-rw-r--r--app/assets/javascripts/main.js2
-rw-r--r--app/assets/javascripts/pages/milestones/shared/components/promote_milestone_modal.vue6
-rw-r--r--app/assets/javascripts/pages/projects/labels/components/promote_label_modal.vue6
-rw-r--r--app/controllers/projects/labels_controller.rb3
-rw-r--r--app/controllers/projects/milestones_controller.rb5
-rw-r--r--app/helpers/flash_helper.rb8
-rw-r--r--spec/controllers/projects/labels_controller_spec.rb2
-rw-r--r--spec/controllers/projects/milestones_controller_spec.rb4
9 files changed, 73 insertions, 9 deletions
diff --git a/app/assets/javascripts/lib/utils/flash_queue.js b/app/assets/javascripts/lib/utils/flash_queue.js
new file mode 100644
index 00000000000..f77afddbae3
--- /dev/null
+++ b/app/assets/javascripts/lib/utils/flash_queue.js
@@ -0,0 +1,46 @@
+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 659dc9eaa1f..f76e2ae47a0 100644
--- a/app/assets/javascripts/main.js
+++ b/app/assets/javascripts/main.js
@@ -33,6 +33,7 @@ import './milestone_select';
import './projects_dropdown';
import './render_gfm';
import initBreadcrumbs from './breadcrumb';
+import { popFlashMessage } from './lib/utils/flash_queue';
import initDispatcher from './dispatcher';
@@ -262,4 +263,5 @@ 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 eb49a5780bd..af85c3915df 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,6 +1,7 @@
<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';
@@ -36,7 +37,10 @@
return axios.post(this.url)
.then((response) => {
eventHub.$emit('promoteMilestoneModal.requestFinished', { milestoneUrl: this.url, successful: true });
- redirectTo(response.request.responseURL);
+ 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}`);
})
.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 a48784f08a4..a6388d886e2 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,5 +1,6 @@
<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';
@@ -50,7 +51,10 @@
return axios.post(this.url)
.then((response) => {
eventHub.$emit('promoteLabelModal.requestFinished', { labelUrl: this.url, successful: true });
- redirectTo(response.request.responseURL);
+ 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}`);
})
.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 439c11b0bf3..a9fc890b28c 100644
--- a/app/controllers/projects/labels_controller.rb
+++ b/app/controllers/projects/labels_controller.rb
@@ -1,5 +1,6 @@
class Projects::LabelsController < Projects::ApplicationController
include ToggleSubscriptionAction
+ include FlashHelper
before_action :check_issuables_available!
before_action :label, only: [:edit, :update, :destroy, :promote]
@@ -114,7 +115,7 @@ class Projects::LabelsController < Projects::ApplicationController
respond_to do |format|
format.html do
- redirect_to(project_labels_path(@project), status: 303)
+ redirect_to(project_labels_path(@project, body_data: get_body_data_page(project_labels_path(@project))), status: 303)
end
format.js
end
diff --git a/app/controllers/projects/milestones_controller.rb b/app/controllers/projects/milestones_controller.rb
index 4fd36eb8cec..9a4e99c39e9 100644
--- a/app/controllers/projects/milestones_controller.rb
+++ b/app/controllers/projects/milestones_controller.rb
@@ -1,5 +1,6 @@
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]
@@ -70,8 +71,8 @@ class Projects::MilestonesController < Projects::ApplicationController
end
def promote
- promoted_milestone = Milestones::PromoteService.new(project, current_user).execute(milestone)
- redirect_to group_milestone_path(project.group, promoted_milestone.iid), status: 303
+ 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
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
new file mode 100644
index 00000000000..26572d4f206
--- /dev/null
+++ b/app/helpers/flash_helper.rb
@@ -0,0 +1,8 @@
+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/spec/controllers/projects/labels_controller_spec.rb b/spec/controllers/projects/labels_controller_spec.rb
index 452d7e23983..0cba8486e79 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).to redirect_to(namespace_project_labels_path)
+ expect(response.location).to include(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 c7d98eef39f..f44e77ab88d 100644
--- a/spec/controllers/projects/milestones_controller_spec.rb
+++ b/spec/controllers/projects/milestones_controller_spec.rb
@@ -98,9 +98,7 @@ describe Projects::MilestonesController do
it 'shows group milestone' do
post :promote, namespace_id: project.namespace.id, project_id: project.id, id: milestone.iid
- group_milestone = assigns(:milestone)
-
- expect(response).to redirect_to(group_milestone_path(project.group, group_milestone.iid))
+ expect(response.location).to include(project_milestones_path(project))
end
end