Spiegel von
https://github.com/paviliondev/discourse-custom-wizard.git
synchronisiert 2024-11-26 02:50:28 +01:00
Merge pull request #47 from paviliondev/create_category_and_create_group_actions
Create category and create group actions
Dieser Commit ist enthalten in:
Commit
783af5b5f7
9 geänderte Dateien mit 533 neuen und 9 gelöschten Zeilen
|
@ -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'),
|
||||
|
|
|
@ -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'),
|
||||
|
|
|
@ -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',
|
||||
|
|
|
@ -340,6 +340,328 @@
|
|||
</div>
|
||||
{{/if}}
|
||||
|
||||
{{#if createGroup}}
|
||||
<div class="setting full field-mapper-setting">
|
||||
<div class="setting-label">
|
||||
<label>{{i18n "admin.wizard.action.create_group.name"}}</label>
|
||||
</div>
|
||||
|
||||
<div class="setting-value">
|
||||
{{wizard-mapper
|
||||
inputs=action.name
|
||||
property='name'
|
||||
onUpdate=(action 'mappedFieldUpdated')
|
||||
options=(hash
|
||||
textSelection=true
|
||||
wizardFieldSelection=true
|
||||
userFieldSelection=true
|
||||
context='action'
|
||||
)}}
|
||||
</div>
|
||||
</div>
|
||||
<div class="setting full field-mapper-setting">
|
||||
<div class="setting-label">
|
||||
<label>{{i18n "admin.wizard.action.create_group.full_name"}}</label>
|
||||
</div>
|
||||
|
||||
<div class="setting-value">
|
||||
{{wizard-mapper
|
||||
inputs=action.full_name
|
||||
property='full_name'
|
||||
onUpdate=(action 'mappedFieldUpdated')
|
||||
options=(hash
|
||||
textSelection=true
|
||||
wizardFieldSelection=true
|
||||
userFieldSelection=true
|
||||
context='action'
|
||||
)}}
|
||||
</div>
|
||||
</div>
|
||||
<div class="setting full field-mapper-setting">
|
||||
<div class="setting-label">
|
||||
<label>{{i18n "admin.wizard.action.create_group.title"}}</label>
|
||||
</div>
|
||||
|
||||
<div class="setting-value">
|
||||
{{wizard-mapper
|
||||
inputs=action.title
|
||||
property='title'
|
||||
onUpdate=(action 'mappedFieldUpdated')
|
||||
options=(hash
|
||||
textSelection=true
|
||||
wizardFieldSelection=true
|
||||
userFieldSelection=true
|
||||
context='action'
|
||||
)}}
|
||||
</div>
|
||||
</div>
|
||||
<div class="setting full field-mapper-setting">
|
||||
<div class="setting-label">
|
||||
<label>{{i18n "admin.wizard.action.create_group.bio_raw"}}</label>
|
||||
</div>
|
||||
|
||||
<div class="setting-value">
|
||||
{{wizard-mapper
|
||||
inputs=action.bio_raw
|
||||
property='bio_raw'
|
||||
onUpdate=(action 'mappedFieldUpdated')
|
||||
options=(hash
|
||||
textSelection=true
|
||||
wizardFieldSelection=true
|
||||
userFieldSelection=true
|
||||
context='action'
|
||||
)}}
|
||||
</div>
|
||||
</div>
|
||||
<div class="setting full field-mapper-setting">
|
||||
<div class="setting-label">
|
||||
<label>{{i18n "admin.wizard.action.create_group.owner_usernames"}}</label>
|
||||
</div>
|
||||
|
||||
<div class="setting-value">
|
||||
{{wizard-mapper
|
||||
inputs=action.owner_usernames
|
||||
property='owner_usernames'
|
||||
onUpdate=(action 'mappedFieldUpdated')
|
||||
options=(hash
|
||||
textSelection=true
|
||||
wizardFieldSelection=true
|
||||
userFieldSelection=true
|
||||
userSelection='output'
|
||||
context='action'
|
||||
)}}
|
||||
</div>
|
||||
</div>
|
||||
<div class="setting full field-mapper-setting">
|
||||
<div class="setting-label">
|
||||
<label>{{i18n "admin.wizard.action.create_group.usernames"}}</label>
|
||||
</div>
|
||||
|
||||
<div class="setting-value">
|
||||
{{wizard-mapper
|
||||
inputs=action.usernames
|
||||
property='usernames'
|
||||
onUpdate=(action 'mappedFieldUpdated')
|
||||
options=(hash
|
||||
textSelection=true
|
||||
wizardFieldSelection=true
|
||||
userFieldSelection=true
|
||||
userSelection='output'
|
||||
context='action'
|
||||
)}}
|
||||
</div>
|
||||
</div>
|
||||
<div class="setting full field-mapper-setting">
|
||||
<div class="setting-label">
|
||||
<label>{{i18n "admin.wizard.action.create_group.grant_trust_level"}}</label>
|
||||
</div>
|
||||
|
||||
<div class="setting-value">
|
||||
{{wizard-mapper
|
||||
inputs=action.grant_trust_level
|
||||
property='grant_trust_level'
|
||||
onUpdate=(action 'mappedFieldUpdated')
|
||||
options=(hash
|
||||
textSelection=true
|
||||
wizardFieldSelection=true
|
||||
userFieldSelection=true
|
||||
context='action'
|
||||
)}}
|
||||
</div>
|
||||
</div>
|
||||
<div class="setting full field-mapper-setting">
|
||||
<div class="setting-label">
|
||||
<label>{{i18n "admin.wizard.action.create_group.mentionable_level"}}</label>
|
||||
</div>
|
||||
|
||||
<div class="setting-value">
|
||||
{{wizard-mapper
|
||||
inputs=action.mentionable_level
|
||||
property='mentionable_level'
|
||||
onUpdate=(action 'mappedFieldUpdated')
|
||||
options=(hash
|
||||
textSelection=true
|
||||
wizardFieldSelection=true
|
||||
userFieldSelection=true
|
||||
context='action'
|
||||
)}}
|
||||
</div>
|
||||
</div>
|
||||
<div class="setting full field-mapper-setting">
|
||||
<div class="setting-label">
|
||||
<label>{{i18n "admin.wizard.action.create_group.messageable_level"}}</label>
|
||||
</div>
|
||||
|
||||
<div class="setting-value">
|
||||
{{wizard-mapper
|
||||
inputs=action.messageable_level
|
||||
property='messageable_level'
|
||||
onUpdate=(action 'mappedFieldUpdated')
|
||||
options=(hash
|
||||
textSelection=true
|
||||
wizardFieldSelection=true
|
||||
userFieldSelection=true
|
||||
context='action'
|
||||
)}}
|
||||
</div>
|
||||
</div>
|
||||
<div class="setting full field-mapper-setting">
|
||||
<div class="setting-label">
|
||||
<label>{{i18n "admin.wizard.action.create_group.visibility_level"}}</label>
|
||||
</div>
|
||||
|
||||
<div class="setting-value">
|
||||
{{wizard-mapper
|
||||
inputs=action.visibility_level
|
||||
property='visibility_level'
|
||||
onUpdate=(action 'mappedFieldUpdated')
|
||||
options=(hash
|
||||
textSelection=true
|
||||
wizardFieldSelection=true
|
||||
userFieldSelection=true
|
||||
context='action'
|
||||
)}}
|
||||
</div>
|
||||
</div>
|
||||
<div class="setting full field-mapper-setting">
|
||||
<div class="setting-label">
|
||||
<label>{{i18n "admin.wizard.action.create_group.members_visibility_level"}}</label>
|
||||
</div>
|
||||
|
||||
<div class="setting-value">
|
||||
{{wizard-mapper
|
||||
inputs=action.members_visibility_level
|
||||
property='members_visibility_level'
|
||||
onUpdate=(action 'mappedFieldUpdated')
|
||||
options=(hash
|
||||
textSelection=true
|
||||
wizardFieldSelection=true
|
||||
userFieldSelection=true
|
||||
context='action'
|
||||
)}}
|
||||
</div>
|
||||
</div>
|
||||
{{/if}}
|
||||
|
||||
{{#if createCategory}}
|
||||
<div class="setting full field-mapper-setting">
|
||||
<div class="setting-label">
|
||||
<label>{{i18n "admin.wizard.action.create_category.name"}}</label>
|
||||
</div>
|
||||
|
||||
<div class="setting-value">
|
||||
{{wizard-mapper
|
||||
inputs=action.name
|
||||
property='name'
|
||||
onUpdate=(action 'mappedFieldUpdated')
|
||||
options=(hash
|
||||
textSelection='key,value'
|
||||
wizardFieldSelection=true
|
||||
userFieldSelection='key,value'
|
||||
context='action'
|
||||
)}}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="setting full field-mapper-setting">
|
||||
<div class="setting-label">
|
||||
<label>{{i18n "admin.wizard.action.create_category.slug"}}</label>
|
||||
</div>
|
||||
|
||||
<div class="setting-value">
|
||||
{{wizard-mapper
|
||||
inputs=action.slug
|
||||
property='slug'
|
||||
onUpdate=(action 'mappedFieldUpdated')
|
||||
options=(hash
|
||||
textSelection=true
|
||||
wizardFieldSelection=true
|
||||
userFieldSelection='key,value'
|
||||
context='action'
|
||||
)}}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="setting full field-mapper-setting">
|
||||
<div class="setting-label">
|
||||
<label>{{i18n "admin.wizard.action.create_category.color"}}</label>
|
||||
</div>
|
||||
|
||||
<div class="setting-value">
|
||||
{{wizard-mapper
|
||||
inputs=action.color
|
||||
property='color'
|
||||
onUpdate=(action 'mappedFieldUpdated')
|
||||
options=(hash
|
||||
textSelection=true
|
||||
wizardFieldSelection=true
|
||||
userFieldSelection='key,value'
|
||||
context='action'
|
||||
)}}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="setting full field-mapper-setting">
|
||||
<div class="setting-label">
|
||||
<label>{{i18n "admin.wizard.action.create_category.text_color"}}</label>
|
||||
</div>
|
||||
|
||||
<div class="setting-value">
|
||||
{{wizard-mapper
|
||||
inputs=action.text_color
|
||||
property='text_color'
|
||||
onUpdate=(action 'mappedFieldUpdated')
|
||||
options=(hash
|
||||
textSelection=true
|
||||
wizardFieldSelection=true
|
||||
userFieldSelection='key,value'
|
||||
context='action'
|
||||
)}}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="setting full field-mapper-setting">
|
||||
<div class="setting-label">
|
||||
<label>{{i18n "admin.wizard.action.create_category.parent_category"}}</label>
|
||||
</div>
|
||||
|
||||
<div class="setting-value">
|
||||
{{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'
|
||||
)}}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="setting full field-mapper-setting">
|
||||
<div class="setting-label">
|
||||
<label>{{i18n "admin.wizard.action.create_category.permissions"}}</label>
|
||||
</div>
|
||||
|
||||
<div class="setting-value">
|
||||
{{wizard-mapper
|
||||
inputs=action.permissions
|
||||
property='permissions'
|
||||
onUpdate=(action 'mappedFieldUpdated')
|
||||
options=(hash
|
||||
inputTypes='association'
|
||||
textSelection=true
|
||||
wizardFieldSelection=true
|
||||
userFieldSelection=true
|
||||
groupSelection='key'
|
||||
context='action'
|
||||
)}}
|
||||
</div>
|
||||
</div>
|
||||
{{/if}}
|
||||
|
||||
{{#if showAdvanced}}
|
||||
{{wizard-advanced-toggle showAdvanced=action.showAdvanced}}
|
||||
|
||||
|
|
|
@ -35,10 +35,6 @@
|
|||
|
||||
& + div {
|
||||
margin-top: 30px;
|
||||
|
||||
&+ div.setting {
|
||||
margin-top: 30px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Laden …
In neuem Issue referenzieren