diff --git a/assets/javascripts/discourse/components/wizard-custom-action.js.es6 b/assets/javascripts/discourse/components/wizard-custom-action.js.es6 index 196bf328..c661db3e 100644 --- a/assets/javascripts/discourse/components/wizard-custom-action.js.es6 +++ b/assets/javascripts/discourse/components/wizard-custom-action.js.es6 @@ -20,6 +20,8 @@ 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'), + createGroup: equal('action.type', 'create_group'), apiEmpty: empty('action.api'), groupPropertyTypes: selectKitContent(['id', 'name']), hasAdvanced: or('hasCustomFields', 'routeTo'), diff --git a/assets/javascripts/discourse/components/wizard-custom-field.js.es6 b/assets/javascripts/discourse/components/wizard-custom-field.js.es6 index 9251f433..bd44fde0 100644 --- a/assets/javascripts/discourse/components/wizard-custom-field.js.es6 +++ b/assets/javascripts/discourse/components/wizard-custom-field.js.es6 @@ -17,7 +17,7 @@ export default Component.extend(UndoChanges, { isText: equal('field.type', 'text'), isTextarea: equal('field.type', 'textarea'), isUrl: equal('field.type', 'url'), - showPrefill: or('isCategory', 'isTag', 'isGroup', 'isDropdown'), + showPrefill: or('isText', 'isCategory', 'isTag', 'isGroup', 'isDropdown'), showContent: or('isCategory', 'isTag', 'isGroup', 'isDropdown'), showLimit: or('isCategory', 'isTag'), showMinLength: or('isText', 'isTextarea', 'isUrl', 'isComposer'), diff --git a/assets/javascripts/discourse/lib/wizard-schema.js.es6 b/assets/javascripts/discourse/lib/wizard-schema.js.es6 index 1b480471..4a3d26ef 100644 --- a/assets/javascripts/discourse/lib/wizard-schema.js.es6 +++ b/assets/javascripts/discourse/lib/wizard-schema.js.es6 @@ -157,6 +157,27 @@ 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 + }, + create_group: { + name: null, + full_name: null, + title: null, + bio_raw: null, + owner_usernames: null, + usernames: null, + grant_trust_level: null, + mentionable_level: null, + messageable_level: null, + visibility_level: null, + members_visibility_level: null } }, mapped: [ @@ -170,7 +191,22 @@ const action = { 'group', 'url', 'categories', - 'mute_remainder' + 'mute_remainder', + 'name', + 'slug', + 'color', + 'text_color', + 'parent_category_id', + 'permissions', + 'full_name', + 'bio_raw', + 'owner_usernames', + 'usernames', + 'grant_trust_level', + 'mentionable_level', + 'messageable_level', + 'visibility_level', + 'members_visibility_level' ], 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..6aa2eb49 100644 --- a/assets/javascripts/discourse/templates/components/wizard-custom-action.hbs +++ b/assets/javascripts/discourse/templates/components/wizard-custom-action.hbs @@ -340,6 +340,328 @@ {{/if}} +{{#if createGroup}} +
+
+ +
+ +
+ {{wizard-mapper + inputs=action.name + property='name' + onUpdate=(action 'mappedFieldUpdated') + options=(hash + textSelection=true + wizardFieldSelection=true + userFieldSelection=true + context='action' + )}} +
+
+
+
+ +
+ +
+ {{wizard-mapper + inputs=action.full_name + property='full_name' + onUpdate=(action 'mappedFieldUpdated') + options=(hash + textSelection=true + wizardFieldSelection=true + userFieldSelection=true + context='action' + )}} +
+
+
+
+ +
+ +
+ {{wizard-mapper + inputs=action.title + property='title' + onUpdate=(action 'mappedFieldUpdated') + options=(hash + textSelection=true + wizardFieldSelection=true + userFieldSelection=true + context='action' + )}} +
+
+
+
+ +
+ +
+ {{wizard-mapper + inputs=action.bio_raw + property='bio_raw' + onUpdate=(action 'mappedFieldUpdated') + options=(hash + textSelection=true + wizardFieldSelection=true + userFieldSelection=true + context='action' + )}} +
+
+
+
+ +
+ +
+ {{wizard-mapper + inputs=action.owner_usernames + property='owner_usernames' + onUpdate=(action 'mappedFieldUpdated') + options=(hash + textSelection=true + wizardFieldSelection=true + userFieldSelection=true + userSelection='output' + context='action' + )}} +
+
+
+
+ +
+ +
+ {{wizard-mapper + inputs=action.usernames + property='usernames' + onUpdate=(action 'mappedFieldUpdated') + options=(hash + textSelection=true + wizardFieldSelection=true + userFieldSelection=true + userSelection='output' + context='action' + )}} +
+
+
+
+ +
+ +
+ {{wizard-mapper + inputs=action.grant_trust_level + property='grant_trust_level' + onUpdate=(action 'mappedFieldUpdated') + options=(hash + textSelection=true + wizardFieldSelection=true + userFieldSelection=true + context='action' + )}} +
+
+
+
+ +
+ +
+ {{wizard-mapper + inputs=action.mentionable_level + property='mentionable_level' + onUpdate=(action 'mappedFieldUpdated') + options=(hash + textSelection=true + wizardFieldSelection=true + userFieldSelection=true + context='action' + )}} +
+
+
+
+ +
+ +
+ {{wizard-mapper + inputs=action.messageable_level + property='messageable_level' + onUpdate=(action 'mappedFieldUpdated') + options=(hash + textSelection=true + wizardFieldSelection=true + userFieldSelection=true + context='action' + )}} +
+
+
+
+ +
+ +
+ {{wizard-mapper + inputs=action.visibility_level + property='visibility_level' + onUpdate=(action 'mappedFieldUpdated') + options=(hash + textSelection=true + wizardFieldSelection=true + userFieldSelection=true + context='action' + )}} +
+
+
+
+ +
+ +
+ {{wizard-mapper + inputs=action.members_visibility_level + property='members_visibility_level' + onUpdate=(action 'mappedFieldUpdated') + options=(hash + textSelection=true + wizardFieldSelection=true + userFieldSelection=true + context='action' + )}} +
+
+{{/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..07f3f67b 100644 --- a/config/locales/client.en.yml +++ b/config/locales/client.en.yml @@ -241,6 +241,27 @@ 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 + create_group: + label: Create Group + name: Name + full_name: Full Name + title: Title + bio_raw: About + owner_usernames: Owners + usernames: Members + grant_trust_level: Automatic Trust Level + mentionable_level: Mentionable Level + messageable_level: Messageable Level + visibility_level: Visibility Level + members_visibility_level: Members Visibility Level submissions: nav_label: "Submissions" diff --git a/controllers/custom_wizard/admin/wizard.rb b/controllers/custom_wizard/admin/wizard.rb index dcf6fa00..f095e39a 100644 --- a/controllers/custom_wizard/admin/wizard.rb +++ b/controllers/custom_wizard/admin/wizard.rb @@ -130,7 +130,23 @@ 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, + full_name: mapped_params, + title: mapped_params, + bio_raw: mapped_params, + usernames: mapped_params, + owner_usernames: mapped_params, + grant_trust_level: mapped_params, + mentionable_level: mapped_params, + messageable_level: mapped_params, + visibility_level: mapped_params, + members_visibility_level: mapped_params ] ) end diff --git a/lib/custom_wizard/action.rb b/lib/custom_wizard/action.rb index a33a244f..45bdbd35 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,42 @@ class CustomWizard::Action log_info("route: #{route_to}") end + def create_group + guardian.ensure_can_create!(Group) + + group = + begin + Group.new(new_group_params) + rescue ArgumentError => e + raise Discourse::InvalidParameters, "Invalid group params" + end + + if group.save + 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) + + 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 +388,97 @@ class CustomWizard::Action add_custom_fields(params) end + def new_group_params + params = {} + + %w( + name + full_name + title + bio_raw + owner_usernames + usernames + mentionable_level + messageable_level + visibility_level + members_visibility_level + grant_trust_level + ).each do |attr| + input = action[attr] + + if attr === "name" && input.blank? + raise ArgumentError.new + end + + if attr === "full_name" && input.blank? + input = action["name"] + end + + if input.present? + value = CustomWizard::Mapper.new( + inputs: input, + data: data, + user: user + ).perform + + value = value.parameterize(separator: '_') if attr === "name" + value = value.to_i if attr.include?("_level") + + params[attr.to_sym] = value + 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? + value = CustomWizard::Mapper.new( + inputs: action[attr], + data: data, + user: user + ).perform + + if attr === "parent_category_id" && value.is_a?(Array) + value = value[0] + end + + if attr === "permissions" && value.is_a?(Array) + permissions = value + value = {} + + permissions.each do |p| + k = p[:key] + v = p[:value].to_i + + if k.is_a?(Array) + group = Group.find_by(id: k[0]) + k = group.name + else + k = k.parameterize(separator: '_') + end + + value[k] = v + end + end + + params[attr.to_sym] = value + end + end + + add_custom_fields(params) + end + def creates_post? [:create_topic, :send_message].include?(action['type'].to_sym) end diff --git a/lib/custom_wizard/field.rb b/lib/custom_wizard/field.rb index dff610ce..9e7fe5bb 100644 --- a/lib/custom_wizard/field.rb +++ b/lib/custom_wizard/field.rb @@ -2,10 +2,12 @@ class CustomWizard::Field def self.types @types ||= { text: { - min_length: nil + min_length: nil, + prefill: nil }, textarea: { - min_length: nil + min_length: nil, + prefill: nil }, composer: { min_length: nil