From 8f64d7794087fa32e43eef5d6e02e2d857342144 Mon Sep 17 00:00:00 2001 From: Angus McLeod Date: Mon, 3 Jun 2019 17:51:45 +1000 Subject: [PATCH 1/6] Add special formatting for tags in Create Topic Topic Fields --- lib/builder.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/builder.rb b/lib/builder.rb index ad4ef53a..10c76810 100644 --- a/lib/builder.rb +++ b/lib/builder.rb @@ -309,6 +309,7 @@ class CustomWizard::Builder end end else + value = [value] if key === 'tags' params[key.to_sym] = value end end From 7d04ffbde56121a65351cf14548d3a6d3e01696a Mon Sep 17 00:00:00 2001 From: Angus McLeod Date: Mon, 3 Jun 2019 18:18:31 +1000 Subject: [PATCH 2/6] set min-height and allow resize for composer --- assets/stylesheets/wizard/wizard_composer.scss | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/assets/stylesheets/wizard/wizard_composer.scss b/assets/stylesheets/wizard/wizard_composer.scss index 14b115ce..fa8c8a62 100644 --- a/assets/stylesheets/wizard/wizard_composer.scss +++ b/assets/stylesheets/wizard/wizard_composer.scss @@ -157,7 +157,12 @@ //// .d-editor { - max-height: 250px; + min-height: 200px; + + .d-editor-input { + resize: vertical; + flex: initial; + } } .d-editor-modal.hidden { From 620f30368e1ed1d4b79d0353dbee7a5ac2efb2a7 Mon Sep 17 00:00:00 2001 From: Angus McLeod Date: Tue, 11 Jun 2019 17:19:46 +1000 Subject: [PATCH 3/6] bugfix min length --- lib/builder.rb | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/lib/builder.rb b/lib/builder.rb index 10c76810..13434d28 100644 --- a/lib/builder.rb +++ b/lib/builder.rb @@ -227,7 +227,11 @@ class CustomWizard::Builder def validate_field(field, updater, step_template) value = updater.fields[field['id']] - min_length = field['min_length'] + min_length = false + + if is_text_type(field) + min_length = field['min_length'] + end if min_length && value.is_a?(String) && value.strip.length < min_length.to_i label = field['label'] || I18n.t("#{field['key']}.label") @@ -246,6 +250,10 @@ class CustomWizard::Builder end end + def is_text_type(field) + ['text', 'textarea'].include? field['type'] + end + def standardise_boolean(value) !!HasCustomFields::Helpers::CUSTOM_FIELD_TRUE.include?(value) end From 92fb880502e63c017c824db5590bed22b8bba4b6 Mon Sep 17 00:00:00 2001 From: Angus McLeod Date: Wed, 19 Jun 2019 12:32:03 +0800 Subject: [PATCH 4/6] Cook step titles --- assets/javascripts/wizard/initializers/custom.js.es6 | 4 ++++ .../javascripts/wizard/templates/components/wizard-step.hbs | 2 +- lib/wizard_edits.rb | 4 ++-- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/assets/javascripts/wizard/initializers/custom.js.es6 b/assets/javascripts/wizard/initializers/custom.js.es6 index c426514e..225f1f0f 100644 --- a/assets/javascripts/wizard/initializers/custom.js.es6 +++ b/assets/javascripts/wizard/initializers/custom.js.es6 @@ -71,6 +71,10 @@ export default { return index === 0 && !required; }.property('step.index', 'wizard.required'), + cookedTitle: function() { + return cook(this.get('step.title')); + }.property('step.title'), + cookedDescription: function() { return cook(this.get('step.description')); }.property('step.description'), diff --git a/assets/javascripts/wizard/templates/components/wizard-step.hbs b/assets/javascripts/wizard/templates/components/wizard-step.hbs index 41cc336a..ae793060 100644 --- a/assets/javascripts/wizard/templates/components/wizard-step.hbs +++ b/assets/javascripts/wizard/templates/components/wizard-step.hbs @@ -1,6 +1,6 @@
{{#if step.title}} -

{{step.title}}

+

{{cookedTitle}}

{{/if}} {{#if step.description}} diff --git a/lib/wizard_edits.rb b/lib/wizard_edits.rb index 4a24afd3..9ca52331 100644 --- a/lib/wizard_edits.rb +++ b/lib/wizard_edits.rb @@ -127,8 +127,8 @@ end ::WizardStepSerializer.class_eval do def title - return object.title if object.title - I18n.t("#{object.key || i18n_key}.title", default: '') + return PrettyText.cook(object.title) if object.title + PrettyText.cook(I18n.t("#{object.key || i18n_key}.title", default: '')) end def description From aa7dd168277a80df74f7a01021c4e599735f843a Mon Sep 17 00:00:00 2001 From: Angus McLeod Date: Wed, 19 Jun 2019 13:23:10 +0800 Subject: [PATCH 5/6] Handle guests on wizard routes --- .../wizard/controllers/custom.js.es6 | 2 +- .../javascripts/wizard/models/custom.js.es6 | 1 - .../wizard/routes/custom-index.js.es6 | 3 +++ .../javascripts/wizard/routes/custom.js.es6 | 2 +- .../wizard/templates/custom.index.hbs | 19 ++++++++------ config/locales/client.en.yml | 1 + controllers/wizard.rb | 25 ++++++++++--------- lib/builder.rb | 8 +++--- lib/wizard.rb | 10 ++++++-- lib/wizard_edits.rb | 6 ++++- 10 files changed, 49 insertions(+), 28 deletions(-) diff --git a/assets/javascripts/wizard/controllers/custom.js.es6 b/assets/javascripts/wizard/controllers/custom.js.es6 index 9e89a0b0..fc2eb947 100644 --- a/assets/javascripts/wizard/controllers/custom.js.es6 +++ b/assets/javascripts/wizard/controllers/custom.js.es6 @@ -1,3 +1,3 @@ export default Ember.Controller.extend({ queryParams: ['reset'] -}) +}); diff --git a/assets/javascripts/wizard/models/custom.js.es6 b/assets/javascripts/wizard/models/custom.js.es6 index 90bd8985..089d12c8 100644 --- a/assets/javascripts/wizard/models/custom.js.es6 +++ b/assets/javascripts/wizard/models/custom.js.es6 @@ -37,7 +37,6 @@ export function findCustomWizard(wizardId, opts = {}) { return ajax({ url, cache: false, dataType: 'json' }).then(result => { const wizard = result.wizard; - if (!wizard) return null; if (!wizard.completed) { diff --git a/assets/javascripts/wizard/routes/custom-index.js.es6 b/assets/javascripts/wizard/routes/custom-index.js.es6 index 5e7a2914..5e90807d 100644 --- a/assets/javascripts/wizard/routes/custom-index.js.es6 +++ b/assets/javascripts/wizard/routes/custom-index.js.es6 @@ -16,8 +16,11 @@ export default Ember.Route.extend({ const permitted = model.get('permitted'); const minTrust = model.get('min_trust'); const wizardId = model.get('id'); + const user = model.get('user'); controller.setProperties({ + requiresLogin: !user, + user, completed, notPermitted: !permitted, minTrust, diff --git a/assets/javascripts/wizard/routes/custom.js.es6 b/assets/javascripts/wizard/routes/custom.js.es6 index dcdfbcb7..0fd8e627 100644 --- a/assets/javascripts/wizard/routes/custom.js.es6 +++ b/assets/javascripts/wizard/routes/custom.js.es6 @@ -6,7 +6,7 @@ import { ajax } from 'wizard/lib/ajax'; export default Ember.Route.extend({ model(params) { let opts = {}; - if (params.reset == 'true') opts['reset'] = true; + if (params.reset === 'true') opts['reset'] = true; return findCustomWizard(params.wizard_id, opts); }, diff --git a/assets/javascripts/wizard/templates/custom.index.hbs b/assets/javascripts/wizard/templates/custom.index.hbs index 8c1a48ae..7bcf6f2f 100644 --- a/assets/javascripts/wizard/templates/custom.index.hbs +++ b/assets/javascripts/wizard/templates/custom.index.hbs @@ -1,10 +1,15 @@ -{{#if completed}} - {{wizard-no-access text=(i18n 'wizard.completed') wizardId=wizardId}} +{{#if noWizard}} + {{wizard-no-access text=(i18n 'wizard.none') wizardId=wizardId}} {{else}} - {{#if notPermitted}} - {{wizard-no-access text=(i18n 'wizard.not_permitted' level=minTrust) wizardId=wizardId}} - {{/if}} - {{#if noWizard}} - {{wizard-no-access text=(i18n 'wizard.none') wizardId=wizardId}} + {{#if requiresLogin}} + {{wizard-no-access text=(i18n 'wizard.requires_login' level=minTrust) wizardId=wizardId}} + {{else}} + {{#if notPermitted}} + {{wizard-no-access text=(i18n 'wizard.not_permitted' level=minTrust) wizardId=wizardId}} + {{else}} + {{#if completed}} + {{wizard-no-access text=(i18n 'wizard.completed') wizardId=wizardId}} + {{/if}} + {{/if}} {{/if}} {{/if}} diff --git a/config/locales/client.en.yml b/config/locales/client.en.yml index 653be688..2897ffa9 100644 --- a/config/locales/client.en.yml +++ b/config/locales/client.en.yml @@ -181,6 +181,7 @@ en: not_permitted: "You need to be trust level {{level}} or higher to access this wizard." none: "There is no wizard here." return_to_site: "Return to {{siteName}}" + requires_login: "You need to be logged in to access this wizard." wizard_composer: show_preview: "Preview Post" diff --git a/controllers/wizard.rb b/controllers/wizard.rb index 3235209c..e9e08637 100644 --- a/controllers/wizard.rb +++ b/controllers/wizard.rb @@ -2,7 +2,6 @@ class CustomWizard::WizardController < ::ApplicationController prepend_view_path(Rails.root.join('plugins', 'discourse-custom-wizard', 'views')) layout 'wizard' - requires_login helper_method :wizard_page_title helper_method :theme_ids @@ -22,7 +21,6 @@ class CustomWizard::WizardController < ::ApplicationController respond_to do |format| format.json do builder = CustomWizard::Builder.new(current_user, params[:wizard_id].underscore) - builder_opts = {} builder_opts[:reset] = params[:reset] if params[:reset] @@ -52,19 +50,22 @@ class CustomWizard::WizardController < ::ApplicationController end result = success_json - submission = Array.wrap(PluginStore.get("#{wizard_id}_submissions", user.id)).last - if submission && submission['redirect_to'] - result.merge!(redirect_to: submission['redirect_to']) - end + if user + submission = Array.wrap(PluginStore.get("#{wizard_id}_submissions", user.id)).last - if submission && !wizard.save_submissions - PluginStore.remove("#{wizard_id}_submissions", user.id) - end + if submission && submission['redirect_to'] + result.merge!(redirect_to: submission['redirect_to']) + end - if user.custom_fields['redirect_to_wizard'] === wizard_id - user.custom_fields.delete('redirect_to_wizard') - user.save_custom_fields(true) + if submission && !wizard.save_submissions + PluginStore.remove("#{wizard_id}_submissions", user.id) + end + + if user.custom_fields['redirect_to_wizard'] === wizard_id + user.custom_fields.delete('redirect_to_wizard') + user.save_custom_fields(true) + end end render json: result diff --git a/lib/builder.rb b/lib/builder.rb index 13434d28..0e5c4fb1 100644 --- a/lib/builder.rb +++ b/lib/builder.rb @@ -2,14 +2,16 @@ class CustomWizard::Builder attr_accessor :wizard, :updater, :submissions - def initialize(user, wizard_id) + def initialize(user=nil, wizard_id) data = PluginStore.get('custom_wizard', wizard_id) - return if data.blank? @steps = data['steps'] @wizard = CustomWizard::Wizard.new(user, data) - @submissions = Array.wrap(PluginStore.get("#{wizard_id}_submissions", user.id)) + + if user + @submissions = Array.wrap(PluginStore.get("#{wizard_id}_submissions", user.id)) + end end def self.sorted_handlers diff --git a/lib/wizard.rb b/lib/wizard.rb index e98b933a..b47d68f1 100644 --- a/lib/wizard.rb +++ b/lib/wizard.rb @@ -18,7 +18,7 @@ class CustomWizard::Wizard :required, :prompt_completion - def initialize(user, attrs = {}) + def initialize(user=nil, attrs = {}) @steps = [] @user = user @first_step = nil @@ -54,6 +54,8 @@ class CustomWizard::Wizard end def start + return nil if !@user + if unfinished? && last_completed_step = ::UserHistory.where( acting_user_id: @user.id, action: ::UserHistory.actions[:custom_wizard_step], @@ -76,6 +78,8 @@ class CustomWizard::Wizard end def unfinished? + return nil if !@user + most_recent = ::UserHistory.where( acting_user_id: @user.id, action: ::UserHistory.actions[:custom_wizard_step], @@ -94,6 +98,8 @@ class CustomWizard::Wizard end def completed? + return nil if !@user + steps = CustomWizard::Wizard.step_ids(@id) history = ::UserHistory.where( @@ -112,7 +118,7 @@ class CustomWizard::Wizard end def permitted? - user.staff? || user.trust_level.to_i >= min_trust.to_i + user && (user.staff? || user.trust_level.to_i >= min_trust.to_i) end def reset diff --git a/lib/wizard_edits.rb b/lib/wizard_edits.rb index 9ca52331..c93ac214 100644 --- a/lib/wizard_edits.rb +++ b/lib/wizard_edits.rb @@ -64,7 +64,7 @@ class ::Wizard::Step end ::WizardSerializer.class_eval do - attributes :id, :background, :completed, :required, :min_trust, :permitted + attributes :id, :background, :completed, :required, :min_trust, :permitted, :user def id object.id @@ -123,6 +123,10 @@ end def include_required? object.respond_to?(:required) end + + def user + object.user + end end ::WizardStepSerializer.class_eval do From 20f605b89957bab7d6944687e79184c0ebd8fde4 Mon Sep 17 00:00:00 2001 From: Angus McLeod Date: Wed, 19 Jun 2019 13:39:39 +0800 Subject: [PATCH 6/6] Use wizard name in no access messages --- .../javascripts/wizard/components/wizard-no-access.js.es6 | 2 +- assets/javascripts/wizard/routes/custom-index.js.es6 | 2 ++ assets/javascripts/wizard/templates/custom.index.hbs | 6 +++--- config/locales/client.en.yml | 6 +++--- lib/wizard_edits.rb | 6 +++++- 5 files changed, 14 insertions(+), 8 deletions(-) diff --git a/assets/javascripts/wizard/components/wizard-no-access.js.es6 b/assets/javascripts/wizard/components/wizard-no-access.js.es6 index 83fcc7da..0b222ec1 100644 --- a/assets/javascripts/wizard/components/wizard-no-access.js.es6 +++ b/assets/javascripts/wizard/components/wizard-no-access.js.es6 @@ -10,4 +10,4 @@ export default Ember.Component.extend({ CustomWizard.skip(this.get('wizardId')); } } -}) +}); diff --git a/assets/javascripts/wizard/routes/custom-index.js.es6 b/assets/javascripts/wizard/routes/custom-index.js.es6 index 5e90807d..c857753d 100644 --- a/assets/javascripts/wizard/routes/custom-index.js.es6 +++ b/assets/javascripts/wizard/routes/custom-index.js.es6 @@ -17,10 +17,12 @@ export default Ember.Route.extend({ const minTrust = model.get('min_trust'); const wizardId = model.get('id'); const user = model.get('user'); + const name = model.get('name'); controller.setProperties({ requiresLogin: !user, user, + name, completed, notPermitted: !permitted, minTrust, diff --git a/assets/javascripts/wizard/templates/custom.index.hbs b/assets/javascripts/wizard/templates/custom.index.hbs index 7bcf6f2f..f6ac1df5 100644 --- a/assets/javascripts/wizard/templates/custom.index.hbs +++ b/assets/javascripts/wizard/templates/custom.index.hbs @@ -2,13 +2,13 @@ {{wizard-no-access text=(i18n 'wizard.none') wizardId=wizardId}} {{else}} {{#if requiresLogin}} - {{wizard-no-access text=(i18n 'wizard.requires_login' level=minTrust) wizardId=wizardId}} + {{wizard-no-access text=(i18n 'wizard.requires_login' name=name) wizardId=wizardId}} {{else}} {{#if notPermitted}} - {{wizard-no-access text=(i18n 'wizard.not_permitted' level=minTrust) wizardId=wizardId}} + {{wizard-no-access text=(i18n 'wizard.not_permitted' name=name level=minTrust) wizardId=wizardId}} {{else}} {{#if completed}} - {{wizard-no-access text=(i18n 'wizard.completed') wizardId=wizardId}} + {{wizard-no-access text=(i18n 'wizard.completed' name=name) wizardId=wizardId}} {{/if}} {{/if}} {{/if}} diff --git a/config/locales/client.en.yml b/config/locales/client.en.yml index 2897ffa9..84e5bd06 100644 --- a/config/locales/client.en.yml +++ b/config/locales/client.en.yml @@ -177,11 +177,11 @@ en: filter_placeholder: "Search..." wizard: - completed: "You have completed this wizard." - not_permitted: "You need to be trust level {{level}} or higher to access this wizard." + completed: "You have completed the {{name}} wizard." + not_permitted: "You need to be trust level {{level}} or higher to access the {{name}} wizard." none: "There is no wizard here." return_to_site: "Return to {{siteName}}" - requires_login: "You need to be logged in to access this wizard." + requires_login: "You need to be logged in to access the {{name}} wizard." wizard_composer: show_preview: "Preview Post" diff --git a/lib/wizard_edits.rb b/lib/wizard_edits.rb index c93ac214..ad4f8ef7 100644 --- a/lib/wizard_edits.rb +++ b/lib/wizard_edits.rb @@ -64,7 +64,7 @@ class ::Wizard::Step end ::WizardSerializer.class_eval do - attributes :id, :background, :completed, :required, :min_trust, :permitted, :user + attributes :id, :name, :background, :completed, :required, :min_trust, :permitted, :user def id object.id @@ -74,6 +74,10 @@ end object.respond_to?(:id) end + def name + object.name + end + def background object.background end