From 11bf892bcc2adbf7b354715000e36982c84894f6 Mon Sep 17 00:00:00 2001 From: Angus McLeod Date: Thu, 9 Jul 2020 12:19:36 +1000 Subject: [PATCH] Add Create Category action and Create Group serverside --- .../components/wizard-custom-action.js.es6 | 1 + .../discourse/lib/wizard-schema.js.es6 | 16 ++- .../components/wizard-custom-action.hbs | 119 ++++++++++++++++++ assets/stylesheets/common/wizard-admin.scss | 4 - config/locales/client.en.yml | 8 ++ controllers/custom_wizard/admin/wizard.rb | 8 +- lib/custom_wizard/action.rb | 102 +++++++++++++++ 7 files changed, 252 insertions(+), 6 deletions(-) diff --git a/assets/javascripts/discourse/components/wizard-custom-action.js.es6 b/assets/javascripts/discourse/components/wizard-custom-action.js.es6 index 196bf328..af80d30c 100644 --- a/assets/javascripts/discourse/components/wizard-custom-action.js.es6 +++ b/assets/javascripts/discourse/components/wizard-custom-action.js.es6 @@ -20,6 +20,7 @@ export default Component.extend(UndoChanges, { sendToApi: equal('action.type', 'send_to_api'), addToGroup: equal('action.type', 'add_to_group'), routeTo: equal('action.type', 'route_to'), + createCategory: equal('action.type', 'create_category'), apiEmpty: empty('action.api'), groupPropertyTypes: selectKitContent(['id', 'name']), hasAdvanced: or('hasCustomFields', 'routeTo'), diff --git a/assets/javascripts/discourse/lib/wizard-schema.js.es6 b/assets/javascripts/discourse/lib/wizard-schema.js.es6 index 1b480471..b21142d2 100644 --- a/assets/javascripts/discourse/lib/wizard-schema.js.es6 +++ b/assets/javascripts/discourse/lib/wizard-schema.js.es6 @@ -157,6 +157,14 @@ const action = { route_to: { url: null, code: null + }, + create_category: { + name: null, + slug: null, + color: null, + text_color: "FFFFFF", + parent_category_id: null, + permissions: null } }, mapped: [ @@ -170,7 +178,13 @@ const action = { 'group', 'url', 'categories', - 'mute_remainder' + 'mute_remainder', + 'name', + 'slug', + 'color', + 'text_color', + 'parent_category_id', + 'permittions' ], advanced: [ 'code', diff --git a/assets/javascripts/discourse/templates/components/wizard-custom-action.hbs b/assets/javascripts/discourse/templates/components/wizard-custom-action.hbs index c52f6cd1..3f69f8f1 100644 --- a/assets/javascripts/discourse/templates/components/wizard-custom-action.hbs +++ b/assets/javascripts/discourse/templates/components/wizard-custom-action.hbs @@ -340,6 +340,125 @@ {{/if}} +{{#if createCategory}} +
+
+ +
+ +
+ {{wizard-mapper + inputs=action.name + property='name' + onUpdate=(action 'mappedFieldUpdated') + options=(hash + textSelection='key,value' + wizardFieldSelection=true + userFieldSelection='key,value' + context='action' + )}} +
+
+ +
+
+ +
+ +
+ {{wizard-mapper + inputs=action.slug + property='slug' + onUpdate=(action 'mappedFieldUpdated') + options=(hash + textSelection=true + wizardFieldSelection=true + userFieldSelection='key,value' + context='action' + )}} +
+
+ +
+
+ +
+ +
+ {{wizard-mapper + inputs=action.color + property='color' + onUpdate=(action 'mappedFieldUpdated') + options=(hash + textSelection=true + wizardFieldSelection=true + userFieldSelection='key,value' + context='action' + )}} +
+
+ +
+
+ +
+ +
+ {{wizard-mapper + inputs=action.text_color + property='text_color' + onUpdate=(action 'mappedFieldUpdated') + options=(hash + textSelection=true + wizardFieldSelection=true + userFieldSelection='key,value' + context='action' + )}} +
+
+ +
+
+ +
+ +
+ {{wizard-mapper + inputs=action.parent_category_id + property='parent_category_id' + onUpdate=(action 'mappedFieldUpdated') + options=(hash + textSelection='key,value' + wizardFieldSelection=true + userFieldSelection='key,value' + categorySelection='output' + context='action' + )}} +
+
+ +
+
+ +
+ +
+ {{wizard-mapper + inputs=action.permissions + property='permissions' + onUpdate=(action 'mappedFieldUpdated') + options=(hash + inputTypes='association' + textSelection=true + wizardFieldSelection=true + userFieldSelection=true + groupSelection='key' + context='action' + )}} +
+
+{{/if}} + {{#if showAdvanced}} {{wizard-advanced-toggle showAdvanced=action.showAdvanced}} diff --git a/assets/stylesheets/common/wizard-admin.scss b/assets/stylesheets/common/wizard-admin.scss index 5eacc613..6d26e13b 100644 --- a/assets/stylesheets/common/wizard-admin.scss +++ b/assets/stylesheets/common/wizard-admin.scss @@ -35,10 +35,6 @@ & + div { margin-top: 30px; - - &+ div.setting { - margin-top: 30px; - } } } diff --git a/config/locales/client.en.yml b/config/locales/client.en.yml index 5d58200f..ed522795 100644 --- a/config/locales/client.en.yml +++ b/config/locales/client.en.yml @@ -241,6 +241,14 @@ en: select_an_endpoint: "Select an endpoint" body: "Body" body_placeholder: "JSON" + create_category: + label: "Create Category" + name: Name + slug: Slug + color: Color + text_color: Text color + parent_category: Parent Category + permissions: Permissions submissions: nav_label: "Submissions" diff --git a/controllers/custom_wizard/admin/wizard.rb b/controllers/custom_wizard/admin/wizard.rb index dcf6fa00..865821ad 100644 --- a/controllers/custom_wizard/admin/wizard.rb +++ b/controllers/custom_wizard/admin/wizard.rb @@ -130,7 +130,13 @@ class CustomWizard::AdminWizardController < CustomWizard::AdminController mute_remainder: mapped_params, profile_updates: mapped_params, group: mapped_params, - url: mapped_params + url: mapped_params, + name: mapped_params, + slug: mapped_params, + color: mapped_params, + text_color: mapped_params, + parent_category_id: mapped_params, + permissions: mapped_params ] ) end diff --git a/lib/custom_wizard/action.rb b/lib/custom_wizard/action.rb index a33a244f..26346741 100644 --- a/lib/custom_wizard/action.rb +++ b/lib/custom_wizard/action.rb @@ -2,12 +2,14 @@ class CustomWizard::Action attr_accessor :data, :action, :user, + :guardian, :result def initialize(params) @wizard = params[:wizard] @action = params[:action] @user = params[:user] + @guardian = Guardian.new(@user) @data = params[:data] @log = [] @result = CustomWizard::ActionResult.new @@ -274,6 +276,44 @@ class CustomWizard::Action log_info("route: #{route_to}") end + def create_group + guardian.ensure_can_create!(Group) + + group = + begin + Group.new(new_group_params.merge(user: user)) + rescue ArgumentError => e + raise Discourse::InvalidParameters, "Invalid group params" + end + + if group.update(new_group_params) + GroupActionLogger.new(user, group).log_change_group_settings + log_success("Group created", group.name) + else + log_error("Group creation failed") + end + end + + def create_category + guardian.ensure_can_create!(Category) + + byebug + + category = + begin + Category.new(new_category_params.merge(user: user)) + rescue ArgumentError => e + raise Discourse::InvalidParameters, "Invalid category params" + end + + if category.save + StaffActionLogger.new(user).log_category_creation(category) + log_success("Category created", category.name) + else + log_error("Category creation failed") + end + end + private def action_category @@ -350,6 +390,68 @@ class CustomWizard::Action add_custom_fields(params) end + def new_group_params + params = {} + + %w( + name + full_name + title + mentionable_level + messageable_level + visibility_level + members_visibility_level + grant_trust_level + ).each do |attr| + if action["group_#{attr}"].present? + params[attr.to_sym] = CustomWizard::Mapper.new( + inputs: action["group_#{attr}"], + data: data, + user: user + ).perform + end + end + + add_custom_fields(params) + end + + def new_category_params + params = {} + + %w( + name + slug + color + text_color + parent_category_id + permissions + ).each do |attr| + if action[attr].present? + params[attr.to_sym] = CustomWizard::Mapper.new( + inputs: action[attr], + data: data, + user: user + ).perform + end + end + + if params[:parent_category_id].present? + params[:parent_category_id] = params[:parent_category_id][0] + end + + if params[:permissions].present? + permissions = {} + params[:permissions].each do |p| + if group = Group.find_by(id: p[:key][0]) + permissions[group.name] = p[:value].to_i + end + end + params[:permissions] = permissions + end + + add_custom_fields(params) + end + def creates_post? [:create_topic, :send_message].include?(action['type'].to_sym) end