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/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/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/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..c857753d 100644 --- a/assets/javascripts/wizard/routes/custom-index.js.es6 +++ b/assets/javascripts/wizard/routes/custom-index.js.es6 @@ -16,8 +16,13 @@ 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'); + const name = model.get('name'); controller.setProperties({ + requiresLogin: !user, + user, + name, 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/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/assets/javascripts/wizard/templates/custom.index.hbs b/assets/javascripts/wizard/templates/custom.index.hbs index 8c1a48ae..f6ac1df5 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' name=name) wizardId=wizardId}} + {{else}} + {{#if notPermitted}} + {{wizard-no-access text=(i18n 'wizard.not_permitted' name=name level=minTrust) wizardId=wizardId}} + {{else}} + {{#if completed}} + {{wizard-no-access text=(i18n 'wizard.completed' name=name) wizardId=wizardId}} + {{/if}} + {{/if}} {{/if}} {{/if}} 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 { diff --git a/config/locales/client.en.yml b/config/locales/client.en.yml index 653be688..84e5bd06 100644 --- a/config/locales/client.en.yml +++ b/config/locales/client.en.yml @@ -177,10 +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 the {{name}} 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 ad4ef53a..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 @@ -227,7 +229,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 +252,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 @@ -309,6 +319,7 @@ class CustomWizard::Builder end end else + value = [value] if key === 'tags' params[key.to_sym] = value end end 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 4a24afd3..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 + 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 @@ -123,12 +127,16 @@ end def include_required? object.respond_to?(:required) end + + def user + object.user + end 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