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