0
0
Fork 1
Spiegel von https://github.com/paviliondev/discourse-custom-wizard.git synchronisiert 2024-11-10 04:12:53 +01:00

Add user field options as dropdown option

Dieser Commit ist enthalten in:
Angus McLeod 2020-04-19 21:02:14 +10:00
Ursprung 1a5c66bf20
Commit d194a8313a
9 geänderte Dateien mit 69 neuen und 36 gelöschten Zeilen

Datei anzeigen

@ -62,7 +62,8 @@ export default Component.extend({
if (this.isDropdown) { if (this.isDropdown) {
options.wizardFieldSelection = 'key,value'; options.wizardFieldSelection = 'key,value';
options.inputTypes = 'association'; options.userFieldOptionsSelection = 'output';
options.inputTypes = 'association,assignment';
options.pairConnector = 'association'; options.pairConnector = 'association';
options.keyPlaceholder = 'admin.wizard.key'; options.keyPlaceholder = 'admin.wizard.key';
options.valuePlaceholder = 'admin.wizard.value'; options.valuePlaceholder = 'admin.wizard.value';

Datei anzeigen

@ -2,33 +2,37 @@ import { alias, or, gt } from "@ember/object/computed";
import { computed } from "@ember/object"; import { computed } from "@ember/object";
import { default as discourseComputed, observes, on } from "discourse-common/utils/decorators"; import { default as discourseComputed, observes, on } from "discourse-common/utils/decorators";
import { getOwner } from 'discourse-common/lib/get-owner'; import { getOwner } from 'discourse-common/lib/get-owner';
import { defaultSelectionType, selectionTypes } from '../lib/wizard-mapper'; import { defaultSelectionType, selectionTypes } from '../lib/wizard-mapper';
import { snakeCase } from '../lib/wizard'; import { snakeCase, generateName, userProperties } from '../lib/wizard';
import Component from "@ember/component"; import Component from "@ember/component";
import { bind, later } from "@ember/runloop"; import { bind, later } from "@ember/runloop";
export default Component.extend({ export default Component.extend({
classNameBindings: [':mapper-selector', 'activeType'], classNameBindings: [':mapper-selector', 'activeType'],
groups: alias('site.groups'),
categories: alias('site.categories'),
showText: computed('activeType', function() { return this.showInput('text') }), showText: computed('activeType', function() { return this.showInput('text') }),
showWizardField: computed('activeType', function() { return this.showInput('wizardField') }), showWizardField: computed('activeType', function() { return this.showInput('wizardField') }),
showUserField: computed('activeType', function() { return this.showInput('userField') }), showUserField: computed('activeType', function() { return this.showInput('userField') }),
showUserFieldOptions: computed('activeType', function() { return this.showInput('userFieldOptions') }),
showCategory: computed('activeType', function() { return this.showInput('category') }), showCategory: computed('activeType', function() { return this.showInput('category') }),
showTag: computed('activeType', function() { return this.showInput('tag') }), showTag: computed('activeType', function() { return this.showInput('tag') }),
showGroup: computed('activeType', function() { return this.showInput('group') }), showGroup: computed('activeType', function() { return this.showInput('group') }),
showUser: computed('activeType', function() { return this.showInput('user') }), showUser: computed('activeType', function() { return this.showInput('user') }),
showList: computed('activeType', function() { return this.showInput('list') }), showList: computed('activeType', function() { return this.showInput('list') }),
showComboBox: or('showWizardField', 'showUserField'),
showMultiSelect: or('showCategory', 'showGroup'),
textEnabled: computed('options.textSelection', 'inputType', function() { return this.optionEnabled('textSelection') }), textEnabled: computed('options.textSelection', 'inputType', function() { return this.optionEnabled('textSelection') }),
wizardFieldEnabled: computed('options.wizardFieldSelection', 'inputType', function() { return this.optionEnabled('wizardFieldSelection') }), wizardFieldEnabled: computed('options.wizardFieldSelection', 'inputType', function() { return this.optionEnabled('wizardFieldSelection') }),
userFieldEnabled: computed('options.userFieldSelection', 'inputType', function() { return this.optionEnabled('userFieldSelection') }), userFieldEnabled: computed('options.userFieldSelection', 'inputType', function() { return this.optionEnabled('userFieldSelection') }),
userFieldOptionsEnabled: computed('options.userFieldOptionsSelection', 'inputType', function() { return this.optionEnabled('userFieldOptionsSelection') }),
categoryEnabled: computed('options.categorySelection', 'inputType', function() { return this.optionEnabled('categorySelection') }), categoryEnabled: computed('options.categorySelection', 'inputType', function() { return this.optionEnabled('categorySelection') }),
tagEnabled: computed('options.tagSelection', 'inputType', function() { return this.optionEnabled('tagSelection') }), tagEnabled: computed('options.tagSelection', 'inputType', function() { return this.optionEnabled('tagSelection') }),
groupEnabled: computed('options.groupSelection', 'inputType', function() { return this.optionEnabled('groupSelection') }), groupEnabled: computed('options.groupSelection', 'inputType', function() { return this.optionEnabled('groupSelection') }),
userEnabled: computed('options.userSelection', 'inputType', function() { return this.optionEnabled('userSelection') }), userEnabled: computed('options.userSelection', 'inputType', function() { return this.optionEnabled('userSelection') }),
listEnabled: computed('options.listSelection', 'inputType', function() { return this.optionEnabled('listSelection') }), listEnabled: computed('options.listSelection', 'inputType', function() { return this.optionEnabled('listSelection') }),
groups: alias('site.groups'),
categories: alias('site.categories'),
showComboBox: or('showWizardField', 'showUserField', 'showUserFieldOptions'),
showMultiSelect: or('showCategory', 'showGroup'),
hasTypes: gt('selectorTypes.length', 1), hasTypes: gt('selectorTypes.length', 1),
showTypes: false, showTypes: false,
@ -81,21 +85,35 @@ export default Component.extend({
@discourseComputed('activeType') @discourseComputed('activeType')
comboBoxContent(activeType) { comboBoxContent(activeType) {
const controller = getOwner(this).lookup('controller:admin-wizards-wizard-show'); const controller = getOwner(this).lookup('controller:admin-wizards-wizard-show');
let content = controller[`${activeType}s`]; const wizardFields = controller.wizardFields;
const userFields = controller.userFields;
// you can't select the current field in the field context let content;
if (activeType === 'wizardField' && this.options.context === 'field') {
content = content.filter(field => field.id !== controller.currentField.id); if (activeType === 'wizardField') {
content = wizardFields;
if (this.options.context === 'field') {
content = content.filter(field => field.id !== controller.currentField.id);
}
} }
// updating certain user fields via the profile update action is not supported if (activeType ===' userField') {
if (activeType === 'userField' && content = userProperties.map((f) => ({
this.options.context === 'action' && id: f,
this.inputType === 'association' && name: generateName(f)
this.selectorType === 'key') { })).concat((userFields || []));
const excludedFields = ['username','email', 'trust_level']; if (this.options.context === 'action' &&
content = content.filter(userField => excludedFields.indexOf(userField.id) === -1); this.inputType === 'association' &&
this.selectorType === 'key') {
const excludedFields = ['username','email', 'trust_level'];
content = content.filter(userField => excludedFields.indexOf(userField.id) === -1);
}
}
if (activeType === 'userFieldOptions') {
content = userFields;
} }
return content; return content;
@ -139,7 +157,7 @@ export default Component.extend({
const option = options[type]; const option = options[type];
if (option === true) return true; if (option === true) return true;
if (typeof option !== 'string') return false; if (typeof option !== 'string') return false;
return option.split(',').filter(option => { return option.split(',').filter(option => {
return [this.selectorType, this.inputType].indexOf(option) !== -1; return [this.selectorType, this.inputType].indexOf(option) !== -1;
}).length; }).length;

Datei anzeigen

@ -36,7 +36,7 @@ export default Component.extend({
}, },
@discourseComputed() @discourseComputed()
userFieldList() { userPropertyList() {
return userProperties.map((f) => ` u{${f}}`); return userProperties.map((f) => ` u{${f}}`);
}, },

Datei anzeigen

@ -79,6 +79,7 @@ const selectionTypes = [
'list', 'list',
'wizardField', 'wizardField',
'userField', 'userField',
'userFieldOptions',
'group', 'group',
'category', 'category',
'tag', 'tag',

Datei anzeigen

@ -1,5 +1,4 @@
import DiscourseRoute from "discourse/routes/discourse"; import DiscourseRoute from "discourse/routes/discourse";
import { userProperties, generateName } from '../lib/wizard';
import { buildFieldTypes } from '../lib/wizard-schema'; import { buildFieldTypes } from '../lib/wizard-schema';
import { set } from "@ember/object"; import { set } from "@ember/object";
import { all } from "rsvp"; import { all } from "rsvp";
@ -44,12 +43,7 @@ export default DiscourseRoute.extend({
result.content.map((f) => ({ result.content.map((f) => ({
id: `user_field_${f.id}`, id: `user_field_${f.id}`,
name: f.name name: f.name
})).concat( }))
userProperties.map((f) => ({
id: f,
name: generateName(f)
}))
)
); );
} }
}); });

Datei anzeigen

@ -18,8 +18,8 @@
{{#if showPopover}} {{#if showPopover}}
<div class="wizard-editor-gutter-popover"> <div class="wizard-editor-gutter-popover">
<label> <label>
{{i18n 'admin.wizard.action.post_builder.user_fields'}} {{i18n 'admin.wizard.action.post_builder.user_properties'}}
{{userFieldList}} {{userPropertyList}}
</label> </label>
{{#if hasWizardFields}} {{#if hasWizardFields}}

Datei anzeigen

@ -83,6 +83,7 @@ en:
text: "text" text: "text"
wizard_field: "wizard field" wizard_field: "wizard field"
user_field: "user field" user_field: "user field"
user_field_options: "user field options"
user: "user" user: "user"
category: "category" category: "category"
tag: "tag" tag: "tag"
@ -94,6 +95,7 @@ en:
property: "Select property" property: "Select property"
wizard_field: "Select field" wizard_field: "Select field"
user_field: "Select field" user_field: "Select field"
user_field_options: "Select field"
user: "Select user" user: "Select user"
category: "Select category" category: "Select category"
tag: "Select tag" tag: "Select tag"
@ -182,9 +184,9 @@ en:
post_builder: post_builder:
checkbox: "Post Builder" checkbox: "Post Builder"
label: "Builder" label: "Builder"
user_fields: "User Fields: " user_properties: "User Properties"
wizard_fields: "Wizard Fields: " wizard_fields: "Wizard Fields"
placeholder: "Insert wizard fields using the field_id in w{}. Insert user fields using field key in u{}." placeholder: "Insert wizard fields using the field_id in w{}. Insert user properties using property in u{}."
add_to_group: add_to_group:
label: "Add to Group" label: "Add to Group"
route_to: route_to:

Datei anzeigen

@ -256,7 +256,7 @@ class CustomWizard::Builder
with_type: true with_type: true
} }
).perform ).perform
if content.present? if content.present?
if content[:type] == 'association' if content[:type] == 'association'
content[:result] = content[:result].map do |item| content[:result] = content[:result].map do |item|
@ -267,6 +267,15 @@ class CustomWizard::Builder
end end
end end
if content[:type] == 'assignment' && field_template['type'] === 'dropdown'
content[:result] = content[:result].map do |item|
{
id: item,
name: item
}
end
end
params[:content] = content[:result] params[:content] = content[:result]
end end
end end

Datei anzeigen

@ -37,7 +37,7 @@ class CustomWizard::Mapper
output_type = input['output_type'] output_type = input['output_type']
result = build_result(map_field(output, output_type), input_type) result = build_result(map_field(output, output_type), input_type)
if multiple if multiple
perform_result.push(result) perform_result.push(result)
else else
@ -169,7 +169,7 @@ class CustomWizard::Mapper
end end
def map_user_field(value) def map_user_field(value)
if value.include?('user_field_') if value.include?(User::USER_FIELD_PREFIX)
UserCustomField.where(user_id: user.id, name: value).pluck(:value).first UserCustomField.where(user_id: user.id, name: value).pluck(:value).first
elsif PROFILE_FIELDS.include?(value) elsif PROFILE_FIELDS.include?(value)
UserProfile.find_by(user_id: user.id).send(value) UserProfile.find_by(user_id: user.id).send(value)
@ -178,6 +178,14 @@ class CustomWizard::Mapper
end end
end end
def map_user_field_options(value)
if value.include?(User::USER_FIELD_PREFIX)
if field = UserField.find(value.split('_').last)
field.user_field_options.map(&:value)
end
end
end
def interpolate(string, opts={ user: true, wizard: true, value: true }) def interpolate(string, opts={ user: true, wizard: true, value: true })
return string if string.blank? return string if string.blank?