0
0
Fork 1
Spiegel von https://github.com/paviliondev/discourse-custom-wizard.git synchronisiert 2024-11-30 04:30:29 +01:00
discourse-custom-wizard/plugin.rb

279 Zeilen
9,7 KiB
Ruby

2021-03-11 07:30:15 +01:00
# frozen_string_literal: true
2017-09-23 04:34:07 +02:00
# name: discourse-custom-wizard
2017-10-05 02:36:46 +02:00
# about: Create custom wizards
2022-06-15 09:59:40 +02:00
# version: 1.19.0
2017-09-23 04:34:07 +02:00
# authors: Angus McLeod
2020-11-09 05:14:45 +01:00
# url: https://github.com/paviliondev/discourse-custom-wizard
2021-03-10 10:45:45 +01:00
# contact emails: angus@thepavilion.io
2017-09-23 04:34:07 +02:00
gem 'liquid', '5.0.1', require: true
2022-02-09 08:01:18 +01:00
2020-04-01 07:03:26 +02:00
register_asset 'stylesheets/common/wizard-admin.scss'
register_asset 'stylesheets/common/wizard-mapper.scss'
2017-09-23 04:34:07 +02:00
enabled_site_setting :custom_wizard_enabled
2017-09-25 16:47:40 +02:00
config = Rails.application.config
2019-12-05 09:05:21 +01:00
plugin_asset_path = "#{Rails.root}/plugins/discourse-custom-wizard/assets"
config.assets.paths << "#{plugin_asset_path}/javascripts"
config.assets.paths << "#{plugin_asset_path}/stylesheets/wizard"
2017-09-25 16:47:40 +02:00
2017-11-01 12:47:27 +01:00
if Rails.env.production?
2017-12-03 08:57:54 +01:00
config.assets.precompile += %w{
2019-10-09 01:09:30 +02:00
wizard-custom-guest.js
2019-01-18 01:34:52 +01:00
wizard-custom-start.js
2022-03-16 12:33:34 +01:00
wizard-custom.js
2020-10-02 10:07:16 +02:00
wizard-plugin.js.erb
2019-01-29 01:42:23 +01:00
wizard-raw-templates.js.erb
2017-12-03 08:57:54 +01:00
}
2017-11-01 12:47:27 +01:00
end
2019-02-20 07:27:17 +01:00
if respond_to?(:register_svg_icon)
2020-03-30 01:53:28 +02:00
register_svg_icon "far-calendar"
2019-02-20 07:27:17 +01:00
register_svg_icon "chevron-right"
register_svg_icon "chevron-left"
2020-11-10 01:56:11 +01:00
register_svg_icon "save"
register_svg_icon "arrow-right"
2019-02-20 07:27:17 +01:00
end
2019-01-14 03:03:42 +01:00
class ::Sprockets::DirectiveProcessor
def process_require_tree_discourse_directive(path = ".")
raise CustomWizard::SprocketsEmptyPath, "path cannot be empty" if path == "."
discourse_asset_path = "#{Rails.root}/app/assets/javascripts/"
path = File.expand_path(path, discourse_asset_path)
stat = @environment.stat(path)
if stat && stat.directory?
require_paths(*@environment.stat_sorted_tree_with_dependencies(path))
else
raise CustomWizard::SprocketsFileNotFound, "#{path} not found in discourse core"
end
end
end
2022-06-15 09:57:20 +02:00
## Override necessary due to 'assets/javascripts/wizard', particularly its tests.
def each_globbed_asset
if @path
root_path = "#{File.dirname(@path)}/assets/javascripts/discourse"
Dir.glob(["#{root_path}/**/*"]).sort.each do |f|
f_str = f.to_s
if File.directory?(f)
yield [f, true]
elsif f_str.end_with?(".js.es6") || f_str.end_with?(".hbs") || f_str.end_with?(".hbr")
yield [f, false]
elsif transpile_js && f_str.end_with?(".js")
yield [f, false]
end
end
end
end
2017-09-23 04:34:07 +02:00
after_initialize do
2020-03-30 08:16:03 +02:00
%w[
../lib/custom_wizard/engine.rb
../config/routes.rb
2022-03-12 14:00:07 +01:00
../app/controllers/custom_wizard/admin/admin.rb
../app/controllers/custom_wizard/admin/wizard.rb
../app/controllers/custom_wizard/admin/submissions.rb
../app/controllers/custom_wizard/admin/api.rb
../app/controllers/custom_wizard/admin/logs.rb
../app/controllers/custom_wizard/admin/manager.rb
../app/controllers/custom_wizard/admin/custom_fields.rb
../app/controllers/custom_wizard/wizard.rb
../app/controllers/custom_wizard/steps.rb
../app/controllers/custom_wizard/realtime_validations.rb
../app/jobs/refresh_api_access_token.rb
../app/jobs/set_after_time_wizard.rb
../lib/custom_wizard/validators/template.rb
../lib/custom_wizard/validators/update.rb
../lib/custom_wizard/action_result.rb
2020-04-15 02:46:44 +02:00
../lib/custom_wizard/action.rb
2020-03-30 08:16:03 +02:00
../lib/custom_wizard/builder.rb
../lib/custom_wizard/cache.rb
2020-10-20 07:40:23 +02:00
../lib/custom_wizard/custom_field.rb
2020-03-30 08:16:03 +02:00
../lib/custom_wizard/field.rb
2021-01-27 06:08:26 +01:00
../lib/custom_wizard/realtime_validation.rb
../lib/custom_wizard/realtime_validations/result.rb
../lib/custom_wizard/realtime_validations/similar_topics.rb
2020-03-30 08:16:03 +02:00
../lib/custom_wizard/mapper.rb
2020-04-15 02:46:44 +02:00
../lib/custom_wizard/log.rb
2020-03-30 08:16:03 +02:00
../lib/custom_wizard/step_updater.rb
../lib/custom_wizard/step.rb
../lib/custom_wizard/submission.rb
2020-10-31 08:05:50 +01:00
../lib/custom_wizard/template.rb
2020-03-30 08:16:03 +02:00
../lib/custom_wizard/wizard.rb
../lib/custom_wizard/api/api.rb
../lib/custom_wizard/api/authorization.rb
../lib/custom_wizard/api/endpoint.rb
../lib/custom_wizard/api/log_entry.rb
../lib/custom_wizard/liquid_extensions/first_non_empty.rb
../lib/custom_wizard/exceptions/exceptions.rb
2022-03-12 14:00:07 +01:00
../app/serializers/custom_wizard/api/authorization_serializer.rb
../app/serializers/custom_wizard/api/basic_endpoint_serializer.rb
../app/serializers/custom_wizard/api/endpoint_serializer.rb
../app/serializers/custom_wizard/api/log_serializer.rb
../app/serializers/custom_wizard/api_serializer.rb
../app/serializers/custom_wizard/basic_api_serializer.rb
../app/serializers/custom_wizard/basic_wizard_serializer.rb
../app/serializers/custom_wizard/custom_field_serializer.rb
../app/serializers/custom_wizard/wizard_field_serializer.rb
../app/serializers/custom_wizard/wizard_step_serializer.rb
../app/serializers/custom_wizard/wizard_serializer.rb
../app/serializers/custom_wizard/log_serializer.rb
../app/serializers/custom_wizard/submission_serializer.rb
../app/serializers/custom_wizard/realtime_validation/similar_topics_serializer.rb
../lib/custom_wizard/extensions/extra_locales_controller.rb
../lib/custom_wizard/extensions/invites_controller.rb
../lib/custom_wizard/extensions/guardian.rb
../lib/custom_wizard/extensions/users_controller.rb
../lib/custom_wizard/extensions/tags_controller.rb
../lib/custom_wizard/extensions/custom_field/preloader.rb
../lib/custom_wizard/extensions/custom_field/serializer.rb
../lib/custom_wizard/extensions/custom_field/extension.rb
../lib/custom_wizard/extensions/discourse_tagging.rb
].each do |path|
load File.expand_path(path, __FILE__)
end
2021-03-11 07:30:15 +01:00
Liquid::Template.error_mode = :strict
# preloaded category custom fields
%w[
create_topic_wizard
2021-12-07 09:31:39 +01:00
].each do |custom_field|
Site.preloaded_category_custom_fields << custom_field
end
Liquid::Template.register_filter(::CustomWizard::LiquidFilter::FirstNonEmpty)
2021-10-30 12:37:16 +02:00
add_to_class(:topic, :wizard_submission_id) do
custom_fields['wizard_submission_id']
2021-10-19 05:35:55 +02:00
end
2019-12-05 09:05:21 +01:00
add_class_method(:wizard, :user_requires_completion?) do |user|
wizard_result = self.new(user).requires_completion?
return wizard_result if wizard_result
2019-12-05 09:05:21 +01:00
custom_redirect = false
2019-12-05 09:05:21 +01:00
if user &&
user.first_seen_at.blank? &&
2020-03-30 08:16:03 +02:00
wizard = CustomWizard::Wizard.after_signup(user)
2017-10-15 05:58:22 +02:00
2020-03-30 08:16:03 +02:00
if !wizard.completed?
2019-12-05 09:05:21 +01:00
custom_redirect = true
CustomWizard::Wizard.set_user_redirect(wizard.id, user)
end
end
2019-12-05 09:05:21 +01:00
!!custom_redirect
end
2021-03-11 07:30:15 +01:00
add_to_class(:user, :redirect_to_wizard) do
if custom_fields['redirect_to_wizard'].present?
custom_fields['redirect_to_wizard']
else
nil
end
end
2019-12-05 09:05:21 +01:00
add_to_class(:users_controller, :wizard_path) do
if custom_wizard_redirect = current_user.redirect_to_wizard
2019-12-05 09:05:21 +01:00
"#{Discourse.base_url}/w/#{custom_wizard_redirect.dasherize}"
else
"#{Discourse.base_url}/wizard"
2017-11-01 05:21:14 +01:00
end
end
2019-12-05 09:05:21 +01:00
add_to_serializer(:current_user, :redirect_to_wizard) do
object.redirect_to_wizard
end
2018-01-16 08:13:50 +01:00
2020-03-30 01:53:28 +02:00
on(:user_approved) do |user|
2020-04-19 08:42:44 +02:00
if wizard = CustomWizard::Wizard.after_signup(user)
CustomWizard::Wizard.set_user_redirect(wizard.id, user)
end
end
2021-03-11 07:30:15 +01:00
2020-04-19 08:06:18 +02:00
add_to_class(:application_controller, :redirect_to_wizard_if_required) do
@excluded_routes ||= SiteSetting.wizard_redirect_exclude_paths.split('|') + ['/w/']
url = request.referer || request.original_url
excluded_route = @excluded_routes.any? { |str| /#{str}/ =~ url }
not_api = request.format === 'text/html'
if not_api && !excluded_route
wizard_id = current_user.redirect_to_wizard
if CustomWizard::Template.can_redirect_users?(wizard_id)
if url !~ /\/w\// && url !~ /\/invites\//
CustomWizard::Wizard.set_wizard_redirect(current_user, wizard_id, url)
end
2020-04-19 08:06:18 +02:00
redirect_to "/w/#{wizard_id.dasherize}"
end
end
end
2021-03-11 07:30:15 +01:00
2020-04-19 08:06:18 +02:00
add_to_serializer(:site, :include_wizard_required?) do
scope.is_admin? && Wizard.new(scope.user).requires_completion?
end
2021-03-11 07:30:15 +01:00
2020-04-19 08:06:18 +02:00
add_to_serializer(:site, :complete_custom_wizard) do
if scope.user && requires_completion = CustomWizard::Wizard.prompt_completion(scope.user)
2021-03-11 07:30:15 +01:00
requires_completion.map { |w| { name: w[:name], url: "/w/#{w[:id]}" } }
2020-04-19 08:06:18 +02:00
end
end
add_to_serializer(:site, :include_complete_custom_wizard?) do
complete_custom_wizard.present?
end
2021-03-11 07:30:15 +01:00
2020-04-19 08:06:18 +02:00
add_model_callback(:application_controller, :before_action) do
redirect_to_wizard_if_required if current_user
end
2021-03-11 07:30:15 +01:00
::ExtraLocalesController.prepend ExtraLocalesControllerCustomWizard
::InvitesController.prepend InvitesControllerCustomWizard
::UsersController.prepend CustomWizardUsersController
2021-10-19 05:35:55 +02:00
::Guardian.prepend CustomWizardGuardian
2021-03-11 07:30:15 +01:00
2020-10-31 08:05:50 +01:00
full_path = "#{Rails.root}/plugins/discourse-custom-wizard/assets/stylesheets/wizard/wizard_custom.scss"
if Stylesheet::Importer.respond_to?(:plugin_assets)
Stylesheet::Importer.plugin_assets['wizard_custom'] = Set[full_path]
else
# legacy method, Discourse 2.7.0.beta5 and below
DiscoursePluginRegistry.register_asset(full_path, {}, "wizard_custom")
Stylesheet::Importer.register_import("wizard_custom") do
import_files(DiscoursePluginRegistry.stylesheets["wizard_custom"])
end
2020-10-31 08:05:50 +01:00
end
2021-03-11 07:30:15 +01:00
CustomWizard::CustomField::CLASSES.keys.each do |klass|
class_constant = klass.to_s.classify.constantize
add_model_callback(klass, :after_initialize) do
if CustomWizard::CustomField.enabled?
CustomWizard::CustomField.list_by(:klass, klass.to_s).each do |field|
class_constant.register_custom_field_type(field[:name], field[:type].to_sym)
end
end
end
2021-03-11 07:30:15 +01:00
class_constant.singleton_class.prepend CustomWizardCustomFieldPreloader
class_constant.singleton_class.prepend CustomWizardCustomFieldExtension
end
2021-03-11 07:30:15 +01:00
CustomWizard::CustomField.serializers.each do |serializer_klass|
"#{serializer_klass}_serializer".classify.constantize.prepend CustomWizardCustomFieldSerializer
end
reloadable_patch do |plugin|
::TagsController.prepend CustomWizardTagsController
::DiscourseTagging.singleton_class.prepend CustomWizardDiscourseTagging
end
2018-01-16 08:13:50 +01:00
DiscourseEvent.trigger(:custom_wizard_ready)
2017-09-23 04:34:07 +02:00
end