mirror of
https://gh.wpcy.net/https://github.com/discourse/discourse.git
synced 2026-06-18 20:40:03 +08:00
This node allows to display a modal to a specific user and react to the answer of the user. It requires the user to be actually on the discourse site. <img width="2089" height="876" alt="Screenshot 2026-06-17 at 11 31 28" src="https://github.com/user-attachments/assets/abc40762-eb8e-445e-80b6-1a24bc3c54ea" /> <img width="281" height="237" alt="Screenshot 2026-06-17 at 11 31 21" src="https://github.com/user-attachments/assets/481a9cfa-9d6b-40a9-a593-458a99d9f50a" />
109 lines
3.7 KiB
Ruby
Vendored
109 lines
3.7 KiB
Ruby
Vendored
# frozen_string_literal: true
|
|
|
|
# name: discourse-workflows
|
|
# about: Workflow automation system for Discourse
|
|
# meta_topic_id: 402418
|
|
# version: 0.1
|
|
# authors: Discourse
|
|
# url: https://github.com/discourse/discourse-workflows
|
|
|
|
enabled_site_setting :discourse_workflows_enabled
|
|
|
|
module ::DiscourseWorkflows
|
|
PLUGIN_NAME = "discourse-workflows"
|
|
TEMPLATES_PATH = File.expand_path("config/templates", __dir__)
|
|
end
|
|
|
|
require_relative "lib/discourse_workflows/engine"
|
|
require_relative "lib/discourse_workflows/plugin_node_registration"
|
|
|
|
register_asset "stylesheets/common/index.scss"
|
|
register_svg_icon "bolt"
|
|
register_svg_icon "arrows-split-up-and-left"
|
|
register_svg_icon "list"
|
|
register_svg_icon "arrow-rotate-right"
|
|
register_svg_icon "arrows-turn-to-dots"
|
|
register_svg_icon "globe"
|
|
register_svg_icon "table"
|
|
register_svg_icon "table-cells"
|
|
register_svg_icon "expand"
|
|
register_svg_icon "magnifying-glass-minus"
|
|
register_svg_icon "magnifying-glass-plus"
|
|
register_svg_icon "user-check"
|
|
register_svg_icon "calendar-days"
|
|
register_svg_icon "rectangle-list"
|
|
register_svg_icon "trash-can"
|
|
register_svg_icon "broom"
|
|
register_svg_icon "arrow-pointer"
|
|
register_svg_icon "note-sticky"
|
|
register_svg_icon "palette"
|
|
register_svg_icon "reply"
|
|
register_svg_icon "triangle-exclamation"
|
|
register_svg_icon "clock"
|
|
register_svg_icon "comments"
|
|
register_svg_icon "pause"
|
|
register_svg_icon "window-maximize"
|
|
register_svg_icon "user-plus"
|
|
register_svg_icon "grip-vertical"
|
|
register_svg_icon "arrow-down-a-z"
|
|
|
|
add_admin_route "discourse_workflows.admin.title", "discourse-workflows", use_new_show_route: true
|
|
|
|
DiscoursePluginRegistry.define_filtered_register(:discourse_workflows_nodes)
|
|
DiscoursePluginRegistry.define_filtered_register(:discourse_workflows_credential_types)
|
|
|
|
after_initialize do
|
|
Rails.application.config.filter_parameters += %i[signature]
|
|
|
|
add_to_class(:guardian, :can_manage_workflows?) { is_admin? }
|
|
|
|
nodes_dir = File.join(File.dirname(__FILE__), "lib/discourse_workflows/nodes")
|
|
Dir.glob(File.join(nodes_dir, "**/*.rb")).each { |f| Rails.autoloaders.main.load_file(f) }
|
|
|
|
DiscourseWorkflows::NodeType.registered_nodes.each do |node_class|
|
|
DiscoursePluginRegistry.register_discourse_workflows_node(node_class, self)
|
|
|
|
next unless node_class.respond_to?(:event_name) && node_class.event_name
|
|
on(node_class.event_name) do |*args|
|
|
DiscourseWorkflows::EventListener.handle(node_class, *args)
|
|
end
|
|
end
|
|
|
|
DiscourseWorkflows.node_registration_ready = true
|
|
DiscourseWorkflows.flush_plugin_node_registrations!
|
|
DiscourseWorkflows::Registry.reset_indexes!
|
|
|
|
DiscoursePluginRegistry.register_discourse_workflows_credential_type(
|
|
DiscourseWorkflows::CredentialTypes::BasicAuth,
|
|
self,
|
|
)
|
|
DiscoursePluginRegistry.register_discourse_workflows_credential_type(
|
|
DiscourseWorkflows::CredentialTypes::BearerToken,
|
|
self,
|
|
)
|
|
DiscoursePluginRegistry.register_discourse_workflows_credential_type(
|
|
DiscourseWorkflows::CredentialTypes::HeaderAuth,
|
|
self,
|
|
)
|
|
|
|
add_to_serializer :site,
|
|
:topic_admin_button_workflows,
|
|
include_condition: -> { scope.is_admin? } do
|
|
DiscourseWorkflows::WorkflowDependency.cached_topic_admin_buttons
|
|
end
|
|
|
|
add_to_serializer :current_user,
|
|
:discourse_workflows_user_modal_last_id,
|
|
include_condition: -> do
|
|
DiscourseWorkflows::WorkflowDependency.cached_user_modals?
|
|
end do
|
|
MessageBus.last_id(DiscourseWorkflows::Nodes::Modal::V1.user_channel(object.id))
|
|
end
|
|
|
|
on(:site_setting_changed) do |name, old_value, new_value|
|
|
next if name != :discourse_workflows_enabled
|
|
next unless new_value && !old_value
|
|
|
|
DiscourseWorkflows::PluginEnableHandler.handle!
|
|
end
|
|
end
|