Spiegel von
https://github.com/paviliondev/discourse-custom-wizard.git
synchronisiert 2024-11-22 09:20:29 +01:00
various
Dieser Commit ist enthalten in:
Ursprung
e859e3efa2
Commit
897cc0b60e
11 geänderte Dateien mit 224 neuen und 160 gelöschten Zeilen
|
@ -25,7 +25,9 @@ export default {
|
||||||
ApplicationRoute.reopen({
|
ApplicationRoute.reopen({
|
||||||
redirect() {
|
redirect() {
|
||||||
this.transitionTo('custom');
|
this.transitionTo('custom');
|
||||||
}
|
},
|
||||||
|
|
||||||
|
model() {}
|
||||||
});
|
});
|
||||||
|
|
||||||
WizardStep.reopen({
|
WizardStep.reopen({
|
||||||
|
|
|
@ -39,7 +39,7 @@ class CustomWizard::AdminController < ::ApplicationController
|
||||||
def custom_wizards
|
def custom_wizards
|
||||||
rows = PluginStoreRow.where(plugin_name: 'custom_wizard').order(:id)
|
rows = PluginStoreRow.where(plugin_name: 'custom_wizard').order(:id)
|
||||||
|
|
||||||
wizards = [*rows].map { |r| CustomWizard::Wizard.new(r.value) }
|
wizards = [*rows].map { |r| CustomWizard::Template.new(r.value) }
|
||||||
|
|
||||||
render json: success_json.merge(wizards: wizards)
|
render json: success_json.merge(wizards: wizards)
|
||||||
end
|
end
|
|
@ -4,6 +4,7 @@ class CustomWizard::WizardController < ::ApplicationController
|
||||||
end
|
end
|
||||||
|
|
||||||
def index
|
def index
|
||||||
|
puts "USING PROPER CONTROLLER"
|
||||||
respond_to do |format|
|
respond_to do |format|
|
||||||
format.json do
|
format.json do
|
||||||
wizard = CustomWizard::Builder.new(current_user, params[:wizard_id].underscore).build
|
wizard = CustomWizard::Builder.new(current_user, params[:wizard_id].underscore).build
|
|
@ -4,13 +4,12 @@ class CustomWizard::Builder
|
||||||
|
|
||||||
def initialize(user, wizard_id)
|
def initialize(user, wizard_id)
|
||||||
data = PluginStore.get('custom_wizard', wizard_id)
|
data = PluginStore.get('custom_wizard', wizard_id)
|
||||||
@custom_wizard = CustomWizard::Wizard.new(data)
|
@template = CustomWizard::Template.new(data)
|
||||||
@wizard = Wizard.new(user,
|
@wizard = CustomWizard::Wizard.new(user,
|
||||||
id: wizard_id,
|
id: wizard_id,
|
||||||
save_submissions: data['save_submissions'],
|
save_submissions: data['save_submissions'],
|
||||||
multiple_submissions: data['multiple_submissions'],
|
multiple_submissions: data['multiple_submissions'],
|
||||||
background: data["background"],
|
background: data["background"]
|
||||||
custom: true
|
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -28,9 +27,9 @@ class CustomWizard::Builder
|
||||||
end
|
end
|
||||||
|
|
||||||
def build
|
def build
|
||||||
unless (@wizard.completed? && !@custom_wizard.respond_to?(:multiple_submissions)) ||
|
unless (@wizard.completed? && !@template.respond_to?(:multiple_submissions)) ||
|
||||||
!@custom_wizard.steps
|
!@template.steps
|
||||||
@custom_wizard.steps.each do |s|
|
@template.steps.each do |s|
|
||||||
@wizard.append_step(s['id']) do |step|
|
@wizard.append_step(s['id']) do |step|
|
||||||
step.title = s['title'] if s['title']
|
step.title = s['title'] if s['title']
|
||||||
step.description = s['description'] if s['description']
|
step.description = s['description'] if s['description']
|
||||||
|
@ -180,6 +179,8 @@ class CustomWizard::Builder
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
puts "BUILDER: #{@wizard.respond_to?(:multiple_submissions)}"
|
||||||
|
|
||||||
@wizard
|
@wizard
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
31
lib/step_updater.rb
Normale Datei
31
lib/step_updater.rb
Normale Datei
|
@ -0,0 +1,31 @@
|
||||||
|
class CustomWizard::StepUpdater
|
||||||
|
include ActiveModel::Model
|
||||||
|
|
||||||
|
attr_accessor :refresh_required, :fields, :result, :step
|
||||||
|
|
||||||
|
def initialize(current_user, wizard, step, fields)
|
||||||
|
@current_user = current_user
|
||||||
|
@wizard = wizard
|
||||||
|
@step = step
|
||||||
|
@refresh_required = false
|
||||||
|
@fields = fields
|
||||||
|
end
|
||||||
|
|
||||||
|
def update
|
||||||
|
@step.updater.call(self) if @step.present? && @step.updater.present?
|
||||||
|
|
||||||
|
if success?
|
||||||
|
UserHistory.create(action: UserHistory.actions[:custom_wizard_step],
|
||||||
|
context: @wizard.id,
|
||||||
|
subject: @step.id)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def success?
|
||||||
|
@errors.blank?
|
||||||
|
end
|
||||||
|
|
||||||
|
def refresh_required?
|
||||||
|
@refresh_required
|
||||||
|
end
|
||||||
|
end
|
14
lib/template.rb
Normale Datei
14
lib/template.rb
Normale Datei
|
@ -0,0 +1,14 @@
|
||||||
|
class CustomWizard::Template
|
||||||
|
|
||||||
|
attr_reader :id, :name, :steps, :background, :save_submissions, :multiple_submissions, :custom
|
||||||
|
|
||||||
|
def initialize(data)
|
||||||
|
data = data.is_a?(String) ? ::JSON.parse(data) : data
|
||||||
|
@id = data['id']
|
||||||
|
@name = data['name']
|
||||||
|
@background = data['background']
|
||||||
|
@save_submissions = data['save_submissions']
|
||||||
|
@multiple_submissions = data['multiple_submissions']
|
||||||
|
@steps = data['steps']
|
||||||
|
end
|
||||||
|
end
|
|
@ -1,15 +1,80 @@
|
||||||
|
require_dependency 'wizard/step'
|
||||||
|
require_dependency 'wizard/field'
|
||||||
|
require_dependency 'wizard/step_updater'
|
||||||
|
require_dependency 'wizard/builder'
|
||||||
|
|
||||||
class CustomWizard::Wizard
|
class CustomWizard::Wizard
|
||||||
|
|
||||||
attr_reader :id, :name, :steps, :background, :save_submissions, :multiple_submissions, :custom
|
attr_reader :steps, :user
|
||||||
|
attr_accessor :id, :background, :save_submissions, :multiple_submissions
|
||||||
|
|
||||||
def initialize(data)
|
def initialize(user, attrs = {})
|
||||||
data = data.is_a?(String) ? ::JSON.parse(data) : data
|
@steps = []
|
||||||
@id = data['id']
|
@user = user
|
||||||
@name = data['name']
|
@first_step = nil
|
||||||
@background = data['background']
|
@id = attrs[:id] if attrs[:id]
|
||||||
@save_submissions = data['save_submissions']
|
@save_submissions = attrs[:save_submissions] if attrs[:save_submissions]
|
||||||
@multiple_submissions = data['multiple_submissions']
|
@multiple_submissions = attrs[:multiple_submissions] if attrs[:multiple_submissions]
|
||||||
@steps = data['steps']
|
@background = attrs[:background] if attrs[:background]
|
||||||
@custom = true
|
end
|
||||||
|
|
||||||
|
def create_step(step_name)
|
||||||
|
::Wizard::Step.new(step_name)
|
||||||
|
end
|
||||||
|
|
||||||
|
def append_step(step)
|
||||||
|
step = create_step(step) if step.is_a?(String)
|
||||||
|
|
||||||
|
yield step if block_given?
|
||||||
|
|
||||||
|
last_step = @steps.last
|
||||||
|
|
||||||
|
@steps << step
|
||||||
|
|
||||||
|
# If it's the first step
|
||||||
|
if @steps.size == 1
|
||||||
|
@first_step = step
|
||||||
|
step.index = 0
|
||||||
|
elsif last_step.present?
|
||||||
|
last_step.next = step
|
||||||
|
step.previous = last_step
|
||||||
|
step.index = last_step.index + 1
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def start
|
||||||
|
completed = ::UserHistory.where(
|
||||||
|
acting_user_id: @user.id,
|
||||||
|
action: ::UserHistory.actions[:custom_wizard_step]
|
||||||
|
).where(context: @steps.map(&:id))
|
||||||
|
.uniq.pluck(:context)
|
||||||
|
|
||||||
|
@steps.each do |s|
|
||||||
|
return s unless completed.include?(s.id)
|
||||||
|
end
|
||||||
|
|
||||||
|
@first_step
|
||||||
|
end
|
||||||
|
|
||||||
|
def completed_steps?(steps)
|
||||||
|
steps = [steps].flatten.uniq
|
||||||
|
|
||||||
|
completed = ::UserHistory.where(
|
||||||
|
acting_user_id: @user.id,
|
||||||
|
action: ::UserHistory.actions[:custom_wizard_step]
|
||||||
|
).where(context: steps)
|
||||||
|
.distinct.order(:context).pluck(:context)
|
||||||
|
|
||||||
|
steps.sort == completed
|
||||||
|
end
|
||||||
|
|
||||||
|
def create_updater(step_id, fields)
|
||||||
|
step = @steps.find { |s| s.id == step_id.dasherize }
|
||||||
|
wizard = self
|
||||||
|
CustomWizard::StepUpdater.new(@user, wizard, step, fields)
|
||||||
|
end
|
||||||
|
|
||||||
|
def completed?
|
||||||
|
completed_steps?(@steps.map(&:id))
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
80
lib/wizard_edits.rb
Normale Datei
80
lib/wizard_edits.rb
Normale Datei
|
@ -0,0 +1,80 @@
|
||||||
|
require_dependency 'wizard/field'
|
||||||
|
require_dependency 'wizard/step'
|
||||||
|
|
||||||
|
::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
|
||||||
|
|
||||||
|
::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
|
152
plugin.rb
152
plugin.rb
|
@ -10,6 +10,8 @@ config.assets.paths << Rails.root.join("plugins", "discourse-custom-wizard", "as
|
||||||
config.assets.paths << Rails.root.join("plugins", "discourse-custom-wizard", "assets", "stylesheets", "wizard")
|
config.assets.paths << Rails.root.join("plugins", "discourse-custom-wizard", "assets", "stylesheets", "wizard")
|
||||||
|
|
||||||
after_initialize do
|
after_initialize do
|
||||||
|
UserHistory.actions[:custom_wizard_step] = 100
|
||||||
|
|
||||||
require_dependency "application_controller"
|
require_dependency "application_controller"
|
||||||
module ::CustomWizard
|
module ::CustomWizard
|
||||||
class Engine < ::Rails::Engine
|
class Engine < ::Rails::Engine
|
||||||
|
@ -18,13 +20,6 @@ after_initialize do
|
||||||
end
|
end
|
||||||
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
|
CustomWizard::Engine.routes.draw do
|
||||||
get ':wizard_id' => 'wizard#index'
|
get ':wizard_id' => 'wizard#index'
|
||||||
get ':wizard_id/steps' => 'steps#index'
|
get ':wizard_id/steps' => 'steps#index'
|
||||||
|
@ -51,138 +46,13 @@ after_initialize do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
require_dependency 'wizard'
|
load File.expand_path('../lib/builder.rb', __FILE__)
|
||||||
require_dependency 'wizard/step'
|
load File.expand_path('../lib/field.rb', __FILE__)
|
||||||
require_dependency 'wizard/step_updater'
|
load File.expand_path('../lib/step_updater.rb', __FILE__)
|
||||||
require_dependency 'wizard/field'
|
load File.expand_path('../lib/template.rb', __FILE__)
|
||||||
|
load File.expand_path('../lib/wizard.rb', __FILE__)
|
||||||
::Wizard.class_eval do
|
load File.expand_path('../lib/wizard_edits.rb', __FILE__)
|
||||||
attr_accessor :id, :background, :save_submissions, :multiple_submissions
|
load File.expand_path('../controllers/wizard.rb', __FILE__)
|
||||||
|
load File.expand_path('../controllers/steps.rb', __FILE__)
|
||||||
def initialize(user, attrs = {})
|
load File.expand_path('../controllers/admin.rb', __FILE__)
|
||||||
@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
|
end
|
||||||
|
|
Laden …
In neuem Issue referenzieren