123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188 |
- # name: discourse-custom-wizard
- # about: Create custom wizards
- # version: 0.1
- # authors: Angus McLeod
- register_asset 'stylesheets/wizard_custom_admin.scss'
- config = Rails.application.config
- config.assets.paths << Rails.root.join("plugins", "discourse-custom-wizard", "assets", "javascripts")
- config.assets.paths << Rails.root.join("plugins", "discourse-custom-wizard", "assets", "stylesheets", "wizard")
- after_initialize do
- require_dependency "application_controller"
- module ::CustomWizard
- class Engine < ::Rails::Engine
- engine_name "custom_wizard"
- isolate_namespace CustomWizard
- end
- end
- load File.expand_path('../lib/builder.rb', __FILE__)
- load File.expand_path('../lib/field.rb', __FILE__)
- load File.expand_path('../lib/wizard.rb', __FILE__)
- load File.expand_path('../app/controllers/wizard.rb', __FILE__)
- load File.expand_path('../app/controllers/steps.rb', __FILE__)
- load File.expand_path('../app/controllers/admin.rb', __FILE__)
- CustomWizard::Engine.routes.draw do
- get ':wizard_id' => 'wizard#index'
- get ':wizard_id/steps' => 'steps#index'
- get ':wizard_id/steps/:step_id' => 'wizard#index'
- put ':wizard_id/steps/:step_id' => 'steps#update'
- end
- require_dependency 'admin_constraint'
- Discourse::Application.routes.append do
- mount ::CustomWizard::Engine, at: 'w'
- scope module: 'custom_wizard', constraints: AdminConstraint.new do
- get 'admin/wizards' => 'admin#index'
- get 'admin/wizards/field-types' => 'admin#field_types'
- get 'admin/wizards/custom' => 'admin#index'
- get 'admin/wizards/custom/new' => 'admin#index'
- get 'admin/wizards/custom/all' => 'admin#custom_wizards'
- get 'admin/wizards/custom/:wizard_id' => 'admin#find_wizard'
- put 'admin/wizards/custom/save' => 'admin#save'
- delete 'admin/wizards/custom/remove' => 'admin#remove'
- get 'admin/wizards/submissions' => 'admin#index'
- get 'admin/wizards/submissions/all' => 'admin#submissions'
- get 'admin/wizards/submissions/:wizard_id' => 'admin#find_submissions'
- end
- end
- require_dependency 'wizard'
- require_dependency 'wizard/step'
- require_dependency 'wizard/step_updater'
- require_dependency 'wizard/field'
- ::Wizard.class_eval do
- attr_accessor :id, :background, :save_submissions, :multiple_submissions
- def initialize(user, attrs = {})
- @steps = []
- @user = user
- @first_step = nil
- @max_topics_to_require_completion = 15
- @id = attrs[:id] if attrs[:id]
- @save_submissions = attrs[:save_submissions] if attrs[:save_submissions]
- @multiple_submissions = attrs[:multiple_submissions] if attrs[:multiple_submissions]
- @background = attrs[:background] if attrs[:background]
- @custom = attrs[:custom] if attrs[:custom]
- end
- def completed?
- completed_steps?(@steps.map(&:id))
- end
- def completed_steps?(steps)
- steps = [steps].flatten.uniq
- completed = UserHistory.where(
- acting_user_id: @user.id,
- action: UserHistory.actions[:wizard_step]
- ).where(context: steps)
- .distinct.order(:context).pluck(:context)
- steps.sort == completed
- end
- def start
- completed = UserHistory.where(
- acting_user_id: @user.id,
- action: UserHistory.actions[:wizard_step]
- ).where(context: @steps.map(&:id))
- .uniq.pluck(:context)
- # First uncompleted step
- steps = @custom ? @steps : steps_with_fields
- steps.each do |s|
- return s unless completed.include?(s.id)
- end
- @first_step
- end
- end
- ::Wizard::Field.class_eval do
- attr_reader :label, :description, :key, :min_length
- def initialize(attrs)
- attrs = attrs || {}
- @id = attrs[:id]
- @type = attrs[:type]
- @required = !!attrs[:required]
- @label = attrs[:label]
- @description = attrs[:description]
- @key = attrs[:key]
- @min_length = attrs[:min_length]
- @value = attrs[:value]
- @choices = []
- end
- end
- class ::Wizard::Step
- attr_accessor :title, :description, :key
- end
- class ::Wizard::StepUpdater
- attr_accessor :result, :step
- end
- ::WizardSerializer.class_eval do
- attributes :id, :background, :completed
- def id
- object.id
- end
- def background
- object.background
- end
- def completed
- object.completed?
- end
- def include_completed?
- object.completed? && !object.multiple_submissions && !scope.current_user.admin?
- end
- def include_start?
- object.start && include_steps?
- end
- def include_steps?
- !include_completed?
- end
- end
- ::WizardStepSerializer.class_eval do
- def title
- return object.title if object.title
- I18n.t("#{object.key || i18n_key}.title", default: '')
- end
- def description
- return object.description if object.description
- I18n.t("#{object.key || i18n_key}.description", default: '')
- end
- end
- ::WizardFieldSerializer.class_eval do
- def label
- return object.label if object.label
- I18n.t("#{object.key || i18n_key}.label", default: '')
- end
- def description
- return object.description if object.description
- I18n.t("#{object.key || i18n_key}.description", default: '')
- end
- def placeholder
- I18n.t("#{object.key || i18n_key}.placeholder", default: '')
- end
- end
- end
|