Spiegel von
https://github.com/paviliondev/discourse-custom-wizard.git
synchronisiert 2024-11-10 04:12:53 +01:00
merge main
Dieser Commit ist enthalten in:
Commit
c6c4e31ba9
7 geänderte Dateien mit 67 neuen und 28 gelöschten Zeilen
|
@ -10,7 +10,7 @@ class CustomWizard::SubmissionSerializer < ApplicationSerializer
|
||||||
end
|
end
|
||||||
|
|
||||||
def user
|
def user
|
||||||
::BasicUserSerializer.new(object.wizard.user).as_json
|
::BasicUserSerializer.new(object.wizard.user, root: false).as_json
|
||||||
end
|
end
|
||||||
|
|
||||||
def fields
|
def fields
|
||||||
|
|
|
@ -120,16 +120,23 @@ class CustomWizard::Submission
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.list(wizard, order_by: nil, page: nil)
|
def self.list(wizard, order_by: nil, page: nil)
|
||||||
|
list_actor_id = wizard.actor_id
|
||||||
|
list_user = wizard.user if wizard.user.present?
|
||||||
|
|
||||||
params = { plugin_name: "#{wizard.id}_#{KEY}" }
|
params = { plugin_name: "#{wizard.id}_#{KEY}" }
|
||||||
params[:key] = wizard.actor_id if wizard.actor_id
|
params[:key] = list_actor_id if list_actor_id
|
||||||
|
|
||||||
query = PluginStoreRow.where(params)
|
query = PluginStoreRow.where(params)
|
||||||
result = OpenStruct.new(submissions: [], total: nil)
|
result = OpenStruct.new(submissions: [], total: nil)
|
||||||
|
|
||||||
query.each do |record|
|
query.each do |record|
|
||||||
if (submission_data = ::JSON.parse(record.value)).any?
|
if (submission_data = ::JSON.parse(record.value)).any?
|
||||||
|
submission_user = list_user || User.find_by(id: record.key.to_i)
|
||||||
|
|
||||||
submission_data.each do |data|
|
submission_data.each do |data|
|
||||||
result.submissions.push(new(wizard, data))
|
_wizard = wizard.clone
|
||||||
|
_wizard.user = submission_user if submission_user.present?
|
||||||
|
result.submissions.push(new(_wizard, data))
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -84,7 +84,7 @@ class CustomWizard::TemplateValidator
|
||||||
|
|
||||||
def validate_guests(object, type)
|
def validate_guests(object, type)
|
||||||
guests_permitted = @data[:permitted] && @data[:permitted].any? do |m|
|
guests_permitted = @data[:permitted] && @data[:permitted].any? do |m|
|
||||||
m["output"].include?(CustomWizard::Wizard::GUEST_GROUP_ID)
|
m["output"]&.include?(CustomWizard::Wizard::GUEST_GROUP_ID)
|
||||||
end
|
end
|
||||||
return unless guests_permitted
|
return unless guests_permitted
|
||||||
|
|
||||||
|
|
21
plugin.rb
21
plugin.rb
|
@ -1,15 +1,15 @@
|
||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
# name: discourse-custom-wizard
|
# name: discourse-custom-wizard
|
||||||
# about: Forms for Discourse. Better onboarding, structured posting, data enrichment, automated actions and much more.
|
# about: Forms for Discourse. Better onboarding, structured posting, data enrichment, automated actions and much more.
|
||||||
# version: 2.3.0
|
# version: 2.2.12
|
||||||
# authors: Angus McLeod, Faizaan Gagan, Robert Barrow, Keegan George, Kaitlin Maddever
|
# authors: Angus McLeod, Faizaan Gagan, Robert Barrow, Keegan George, Kaitlin Maddever
|
||||||
# url: https://github.com/paviliondev/discourse-custom-wizard
|
# url: https://github.com/paviliondev/discourse-custom-wizard
|
||||||
# contact_emails: development@pavilion.tech
|
# contact_emails: development@pavilion.tech
|
||||||
# subscription_url: https://coop.pavilion.tech
|
# subscription_url: https://coop.pavilion.tech
|
||||||
|
|
||||||
gem 'liquid', '5.0.1', require: true
|
gem "liquid", "5.0.1", require: true
|
||||||
register_asset 'stylesheets/common/admin.scss'
|
register_asset "stylesheets/common/admin.scss"
|
||||||
register_asset 'stylesheets/common/wizard.scss'
|
register_asset "stylesheets/common/wizard.scss"
|
||||||
|
|
||||||
enabled_site_setting :custom_wizard_enabled
|
enabled_site_setting :custom_wizard_enabled
|
||||||
|
|
||||||
|
@ -111,7 +111,7 @@ after_initialize do
|
||||||
Liquid::Template.register_filter(::CustomWizard::LiquidFilter::FirstNonEmpty)
|
Liquid::Template.register_filter(::CustomWizard::LiquidFilter::FirstNonEmpty)
|
||||||
|
|
||||||
add_to_class(:topic, :wizard_submission_id) do
|
add_to_class(:topic, :wizard_submission_id) do
|
||||||
custom_fields['wizard_submission_id']
|
custom_fields["wizard_submission_id"]
|
||||||
end
|
end
|
||||||
|
|
||||||
add_class_method(:wizard, :user_requires_completion?) do |user|
|
add_class_method(:wizard, :user_requires_completion?) do |user|
|
||||||
|
@ -123,7 +123,6 @@ after_initialize do
|
||||||
if user &&
|
if user &&
|
||||||
user.first_seen_at.blank? &&
|
user.first_seen_at.blank? &&
|
||||||
wizard = CustomWizard::Wizard.after_signup(user)
|
wizard = CustomWizard::Wizard.after_signup(user)
|
||||||
|
|
||||||
if !wizard.completed?
|
if !wizard.completed?
|
||||||
custom_redirect = true
|
custom_redirect = true
|
||||||
CustomWizard::Wizard.set_user_redirect(wizard.id, user)
|
CustomWizard::Wizard.set_user_redirect(wizard.id, user)
|
||||||
|
@ -134,8 +133,8 @@ after_initialize do
|
||||||
end
|
end
|
||||||
|
|
||||||
add_to_class(:user, :redirect_to_wizard) do
|
add_to_class(:user, :redirect_to_wizard) do
|
||||||
if custom_fields['redirect_to_wizard'].present?
|
if custom_fields["redirect_to_wizard"].present?
|
||||||
custom_fields['redirect_to_wizard']
|
custom_fields["redirect_to_wizard"]
|
||||||
else
|
else
|
||||||
nil
|
nil
|
||||||
end
|
end
|
||||||
|
@ -160,10 +159,10 @@ after_initialize do
|
||||||
end
|
end
|
||||||
|
|
||||||
add_to_class(:application_controller, :redirect_to_wizard_if_required) do
|
add_to_class(:application_controller, :redirect_to_wizard_if_required) do
|
||||||
@excluded_routes ||= SiteSetting.wizard_redirect_exclude_paths.split('|') + ['/w/']
|
@excluded_routes ||= SiteSetting.wizard_redirect_exclude_paths.split("|") + ["/w/"]
|
||||||
url = request.referer || request.original_url
|
url = request.referer || request.original_url
|
||||||
excluded_route = @excluded_routes.any? { |str| /#{str}/ =~ url }
|
excluded_route = @excluded_routes.any? { |str| /#{str}/ =~ url }
|
||||||
not_api = request.format === 'text/html'
|
not_api = request.format === "text/html"
|
||||||
|
|
||||||
if not_api && !excluded_route
|
if not_api && !excluded_route
|
||||||
wizard_id = current_user.redirect_to_wizard
|
wizard_id = current_user.redirect_to_wizard
|
||||||
|
@ -203,7 +202,7 @@ after_initialize do
|
||||||
|
|
||||||
full_path = "#{Rails.root}/plugins/discourse-custom-wizard/assets/stylesheets/wizard/wizard_custom.scss"
|
full_path = "#{Rails.root}/plugins/discourse-custom-wizard/assets/stylesheets/wizard/wizard_custom.scss"
|
||||||
if Stylesheet::Importer.respond_to?(:plugin_assets)
|
if Stylesheet::Importer.respond_to?(:plugin_assets)
|
||||||
Stylesheet::Importer.plugin_assets['wizard_custom'] = Set[full_path]
|
Stylesheet::Importer.plugin_assets["wizard_custom"] = Set[full_path]
|
||||||
else
|
else
|
||||||
# legacy method, Discourse 2.7.0.beta5 and below
|
# legacy method, Discourse 2.7.0.beta5 and below
|
||||||
DiscoursePluginRegistry.register_asset(full_path, {}, "wizard_custom")
|
DiscoursePluginRegistry.register_asset(full_path, {}, "wizard_custom")
|
||||||
|
|
|
@ -9,6 +9,7 @@ describe CustomWizard::TemplateValidator do
|
||||||
let(:composer_preview) { get_wizard_fixture("field/composer_preview") }
|
let(:composer_preview) { get_wizard_fixture("field/composer_preview") }
|
||||||
let(:guests_permitted) { get_wizard_fixture("wizard/guests_permitted") }
|
let(:guests_permitted) { get_wizard_fixture("wizard/guests_permitted") }
|
||||||
let(:upload_field) { get_wizard_fixture("field/upload") }
|
let(:upload_field) { get_wizard_fixture("field/upload") }
|
||||||
|
let(:validation_condition) { get_wizard_fixture("condition/validation_condition") }
|
||||||
|
|
||||||
let(:valid_liquid_template) {
|
let(:valid_liquid_template) {
|
||||||
<<-LIQUID.strip
|
<<-LIQUID.strip
|
||||||
|
@ -182,6 +183,13 @@ describe CustomWizard::TemplateValidator do
|
||||||
CustomWizard::TemplateValidator.new(template).perform
|
CustomWizard::TemplateValidator.new(template).perform
|
||||||
).to eq(true)
|
).to eq(true)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
it "validates settings with validation conditions" do
|
||||||
|
template[:permitted] = validation_condition["condition"]
|
||||||
|
expect(
|
||||||
|
CustomWizard::TemplateValidator.new(template).perform
|
||||||
|
).to eq(true)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
context "steps" do
|
context "steps" do
|
||||||
|
|
17
spec/fixtures/condition/validation_condition.json
gevendort
Normale Datei
17
spec/fixtures/condition/validation_condition.json
gevendort
Normale Datei
|
@ -0,0 +1,17 @@
|
||||||
|
{
|
||||||
|
"condition": [
|
||||||
|
{
|
||||||
|
"type": "validation",
|
||||||
|
"pairs": [
|
||||||
|
{
|
||||||
|
"index": 0,
|
||||||
|
"key": "trust_level",
|
||||||
|
"key_type": "user_field",
|
||||||
|
"value": "2",
|
||||||
|
"value_type": "text",
|
||||||
|
"connector": "greater_or_equal"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
|
@ -3,7 +3,8 @@
|
||||||
require_relative '../../plugin_helper'
|
require_relative '../../plugin_helper'
|
||||||
|
|
||||||
describe CustomWizard::SubmissionSerializer do
|
describe CustomWizard::SubmissionSerializer do
|
||||||
fab!(:user) { Fabricate(:user) }
|
fab!(:user1) { Fabricate(:user) }
|
||||||
|
fab!(:user2) { Fabricate(:user) }
|
||||||
|
|
||||||
let(:template_json) {
|
let(:template_json) {
|
||||||
JSON.parse(File.open(
|
JSON.parse(File.open(
|
||||||
|
@ -13,36 +14,43 @@ describe CustomWizard::SubmissionSerializer do
|
||||||
|
|
||||||
before do
|
before do
|
||||||
CustomWizard::Template.save(template_json, skip_jobs: true)
|
CustomWizard::Template.save(template_json, skip_jobs: true)
|
||||||
wizard = CustomWizard::Wizard.create(template_json["id"], user)
|
|
||||||
CustomWizard::Submission.new(wizard,
|
wizard = CustomWizard::Wizard.create(template_json["id"], user1)
|
||||||
step_1_field_1: "I am user submission",
|
CustomWizard::Submission.new(wizard, step_1_field_1: "I am user1 submission", submitted_at: Time.now.iso8601).save
|
||||||
submitted_at: Time.now.iso8601
|
|
||||||
).save
|
wizard = CustomWizard::Wizard.create(template_json["id"], user2)
|
||||||
@list = CustomWizard::Submission.list(wizard, page: 0)
|
CustomWizard::Submission.new(wizard, step_1_field_1: "I am user2 submission", submitted_at: Time.now.iso8601).save
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'should return submission attributes' do
|
it 'should return submission attributes' do
|
||||||
|
wizard = CustomWizard::Wizard.create(template_json["id"])
|
||||||
|
list = CustomWizard::Submission.list(wizard, page: 0)
|
||||||
|
|
||||||
json_array = ActiveModel::ArraySerializer.new(
|
json_array = ActiveModel::ArraySerializer.new(
|
||||||
@list.submissions,
|
list.submissions,
|
||||||
each_serializer: described_class
|
each_serializer: described_class
|
||||||
).as_json
|
).as_json
|
||||||
|
|
||||||
expect(json_array.length).to eq(1)
|
expect(json_array.length).to eq(2)
|
||||||
expect(json_array[0][:id].present?).to eq(true)
|
expect(json_array[0][:id].present?).to eq(true)
|
||||||
expect(json_array[0][:user].present?).to eq(true)
|
|
||||||
expect(json_array[0][:submitted_at].present?).to eq(true)
|
expect(json_array[0][:submitted_at].present?).to eq(true)
|
||||||
|
expect(json_array[0][:user]).to eq(BasicUserSerializer.new(user2, root: false).as_json)
|
||||||
|
expect(json_array[1][:user]).to eq(BasicUserSerializer.new(user1, root: false).as_json)
|
||||||
end
|
end
|
||||||
|
|
||||||
it "should return field values, types and labels" do
|
it "should return field values, types and labels" do
|
||||||
|
wizard = CustomWizard::Wizard.create(template_json["id"])
|
||||||
|
list = CustomWizard::Submission.list(wizard, page: 0)
|
||||||
|
|
||||||
json_array = ActiveModel::ArraySerializer.new(
|
json_array = ActiveModel::ArraySerializer.new(
|
||||||
@list.submissions,
|
list.submissions,
|
||||||
each_serializer: described_class
|
each_serializer: described_class
|
||||||
).as_json
|
).as_json
|
||||||
|
|
||||||
expect(json_array.length).to eq(1)
|
expect(json_array.length).to eq(2)
|
||||||
expect(json_array[0][:fields].as_json).to eq({
|
expect(json_array[0][:fields].as_json).to eq({
|
||||||
"step_1_field_1": {
|
"step_1_field_1": {
|
||||||
"value": "I am user submission",
|
"value": "I am user2 submission",
|
||||||
"type": "text",
|
"type": "text",
|
||||||
"label": "Text"
|
"label": "Text"
|
||||||
}
|
}
|
||||||
|
|
Laden …
In neuem Issue referenzieren