From 11953055fd9924a5dff77a24e4375bd79ceb4be9 Mon Sep 17 00:00:00 2001 From: Angus McLeod Date: Wed, 1 Nov 2017 17:50:03 +0800 Subject: [PATCH] various --- .../discourse/models/custom-wizard.js.es6 | 2 +- .../routes/admin-wizard-submissions.js.es6 | 32 ++++++++++--------- controllers/admin.rb | 19 ++++++++--- ...n_wizard.rb => clear_after_time_wizard.rb} | 2 +- ...ion_wizard.rb => set_after_time_wizard.rb} | 2 +- lib/builder.rb | 20 ++++++++---- plugin.rb | 2 +- 7 files changed, 49 insertions(+), 30 deletions(-) rename jobs/{clear_next_session_wizard.rb => clear_after_time_wizard.rb} (87%) rename jobs/{set_next_session_wizard.rb => set_after_time_wizard.rb} (91%) diff --git a/assets/javascripts/discourse/models/custom-wizard.js.es6 b/assets/javascripts/discourse/models/custom-wizard.js.es6 index 6d9c0656..29fc3847 100644 --- a/assets/javascripts/discourse/models/custom-wizard.js.es6 +++ b/assets/javascripts/discourse/models/custom-wizard.js.es6 @@ -24,7 +24,7 @@ const CustomWizard = Discourse.Model.extend({ if (value) wizard[p] = value; }); - if (wizard['after_time'] && wizard['after_time_scheduled']) { + if (wizard['after_time'] && !wizard['after_time_scheduled']) { return reject({ error: 'after_time_need_time' }); }; diff --git a/assets/javascripts/discourse/routes/admin-wizard-submissions.js.es6 b/assets/javascripts/discourse/routes/admin-wizard-submissions.js.es6 index 59ee7fe0..bff8011f 100644 --- a/assets/javascripts/discourse/routes/admin-wizard-submissions.js.es6 +++ b/assets/javascripts/discourse/routes/admin-wizard-submissions.js.es6 @@ -2,26 +2,28 @@ import CustomWizard from '../models/custom-wizard'; export default Discourse.Route.extend({ model(params) { - return Ember.RSVP.hash({ - submissions: CustomWizard.submissions(params.wizard_id), - wizard: this.modelFor('admin-wizards-submissions').findBy('id', params.wizard_id) - }); + return CustomWizard.submissions(params.wizard_id); }, setupController(controller, model) { - let fields = ['user']; - - model.wizard.steps.forEach((s) => { - if (s.fields) { - s.fields.forEach((f) => { - fields.push(f.id); - }); - }; + let fields = []; + model.forEach((s) => { + Object.keys(s).forEach((k) => { + if (fields.indexOf(k) < 0) { + fields.push(k); + } + }); }); - controller.setProperties({ - submissions: model.submissions, - fields + let submissions = []; + model.forEach((s) => { + let submission = {}; + fields.forEach((f) => { + submission[f] = s[f]; + }); + submissions.push(submission); }); + + controller.setProperties({ submissions, fields }); } }); diff --git a/controllers/admin.rb b/controllers/admin.rb index 8e953e00..7acf2881 100644 --- a/controllers/admin.rb +++ b/controllers/admin.rb @@ -75,14 +75,18 @@ class CustomWizard::AdminController < ::ApplicationController return render json: { error: error } if error - existing = PluginStore.get('custom_wizard', params[:id]) + existing = PluginStore.get('custom_wizard', wizard['id']) || {} + new_time = existing['after_time_scheduled'] ? + after_time_scheduled != Time.parse(existing['after_time_scheduled']).utc : + true - if wizard['after_time'] && after_time_scheduled != Time.parse(existing['after_time_scheduled']).utc + if wizard['after_time'] && new_time Jobs.cancel_scheduled_job(:set_after_time_wizard) Jobs.enqueue_at(after_time_scheduled, :set_after_time_wizard, wizard_id: wizard['id']) end if existing['after_time'] && !wizard['after_time'] + Jobs.cancel_scheduled_job(:set_after_time_wizard) Jobs.enqueue(:clear_after_time_wizard, wizard_id: wizard['id']) end @@ -97,6 +101,7 @@ class CustomWizard::AdminController < ::ApplicationController wizard = PluginStore.get('custom_wizard', params[:id]) if wizard['after_time'] + Jobs.cancel_scheduled_job(:set_after_time_wizard) Jobs.enqueue(:clear_after_time_wizard, wizard_id: wizard['id']) end @@ -124,10 +129,14 @@ class CustomWizard::AdminController < ::ApplicationController def submissions params.require(:wizard_id) - rows = PluginStoreRow.where(plugin_name: "#{params[:wizard_id]}_submissions").order(:id) + rows = PluginStoreRow.where(plugin_name: "#{params[:wizard_id]}_submissions").order('id DESC') - submissions = [*rows].map { |r| ::JSON.parse(r.value) }.flatten + all_submissions = [*rows].map do |r| + submissions = ::JSON.parse(r.value) + username = User.find(r.key).username + submissions.map { |s| { username: username }.merge!(s) } + end.flatten - render json: success_json.merge(submissions: submissions) + render json: success_json.merge(submissions: all_submissions) end end diff --git a/jobs/clear_next_session_wizard.rb b/jobs/clear_after_time_wizard.rb similarity index 87% rename from jobs/clear_next_session_wizard.rb rename to jobs/clear_after_time_wizard.rb index 7de0d8c7..4b53e5b9 100644 --- a/jobs/clear_next_session_wizard.rb +++ b/jobs/clear_after_time_wizard.rb @@ -1,5 +1,5 @@ module Jobs - class ClearNextSessionWizard < Jobs::Base + class ClearAfterTimeWizard < Jobs::Base sidekiq_options queue: 'critical' def execute(args) diff --git a/jobs/set_next_session_wizard.rb b/jobs/set_after_time_wizard.rb similarity index 91% rename from jobs/set_next_session_wizard.rb rename to jobs/set_after_time_wizard.rb index 22c5f9a7..c911d32d 100644 --- a/jobs/set_next_session_wizard.rb +++ b/jobs/set_after_time_wizard.rb @@ -1,5 +1,5 @@ module Jobs - class SetNextSessionWizard < Jobs::Base + class SetAfterTimeWizard < Jobs::Base def execute(args) if PluginStoreRow.exists?(plugin_name: 'custom_wizard', key: args[:wizard_id]) user_ids = [] diff --git a/lib/builder.rb b/lib/builder.rb index 842c682f..1e785e81 100644 --- a/lib/builder.rb +++ b/lib/builder.rb @@ -103,6 +103,7 @@ class CustomWizard::Builder submission = @submissions.last || {} step_input = updater.fields || {} user = @wizard.user + final_step = updater.step.next.nil? if s['fields'] && s['fields'].length s['fields'].each do |f| @@ -225,10 +226,6 @@ class CustomWizard::Builder end end - if updater.errors.empty? - updater.result = { redirect_to: data['redirect_to'] } - end - if @wizard.save_submissions && updater.errors.empty? if step_input step_input.each do |key, value| @@ -236,6 +233,10 @@ class CustomWizard::Builder end end + if final_step + data['submitted_at'] = Time.now.iso8601 + end + if data.present? @submissions.pop(1) if @wizard.unfinished? @submissions.push(data) @@ -244,14 +245,21 @@ class CustomWizard::Builder end # Ensure there is no submission left over after the user has completed a wizard with save_submissions off - if !@wizard.save_submissions && updater.step.next.nil? + if !@wizard.save_submissions && final_step PluginStore.remove("#{@wizard.id}_submissions", @wizard.user.id) end - if @wizard.after_time && updater.step.next.nil? + if @wizard.after_time && final_step @wizard.user.custom_fields.delete('redirect_to_wizard'); @wizard.user.save_custom_fields(true) end + + if updater.errors.empty? + # If the user will be redirected to a new wizard send them there straight away + user_redirect = user.custom_fields['redirect_to_wizard'] + redirect_to = user_redirect ? "/w/#{user_redirect}" : data['redirect_to'] + updater.result = { redirect_to: redirect_to } if redirect_to + end end end end diff --git a/plugin.rb b/plugin.rb index 5f1481ce..374f41c6 100644 --- a/plugin.rb +++ b/plugin.rb @@ -98,7 +98,7 @@ after_initialize do def redirect_to_wizard_if_required @wizard_id ||= current_user.custom_fields['redirect_to_wizard'] - if @wizard_id && request.original_url !~ /w/ && request.original_url !~ /admin/ + if @wizard_id && request.referer !~ /w/ && request.referer !~ /admin/ redirect_to "/w/#{@wizard_id}" end end