Spiegel von
https://github.com/paviliondev/discourse-custom-wizard.git
synchronisiert 2024-11-22 09:20:29 +01:00
Working wizard creation
Dieser Commit ist enthalten in:
Ursprung
ebd026887c
Commit
a3f9135698
14 geänderte Dateien mit 64 neuen und 55 gelöschten Zeilen
|
@ -1,11 +1,4 @@
|
||||||
import { default as computed } from 'ember-addons/ember-computed-decorators';
|
|
||||||
|
|
||||||
export default Ember.Component.extend({
|
export default Ember.Component.extend({
|
||||||
targets: ['topic', 'profile', 'email', 'badge', 'save'],
|
targets: ['topic', 'profile', 'email', 'badge', 'save'],
|
||||||
isTopic: Ember.computed.equal('targets', 'topic'),
|
isTopic: Ember.computed.equal('targets', 'topic')
|
||||||
|
|
||||||
init() {
|
|
||||||
this._super(...arguments);
|
|
||||||
console.log(this)
|
|
||||||
},
|
|
||||||
});
|
});
|
||||||
|
|
|
@ -4,18 +4,24 @@ export default Ember.Component.extend({
|
||||||
classNames: 'wizard-custom-field',
|
classNames: 'wizard-custom-field',
|
||||||
fieldTypes: ['dropdown', 'image', 'radio', 'text', 'textarea'],
|
fieldTypes: ['dropdown', 'image', 'radio', 'text', 'textarea'],
|
||||||
isDropdown: Ember.computed.equal('field.type', 'dropdown'),
|
isDropdown: Ember.computed.equal('field.type', 'dropdown'),
|
||||||
choices: Ember.A(),
|
|
||||||
|
init() {
|
||||||
|
this._super(...arguments);
|
||||||
|
|
||||||
|
if (!this.get('field.choices')) {
|
||||||
|
this.set('field.choices', Ember.A());
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
@observes('field.label')
|
@observes('field.label')
|
||||||
setFieldId() {
|
setFieldId() {
|
||||||
const label = this.get('field.label');
|
const label = this.get('field.label');
|
||||||
console.log('setting id')
|
|
||||||
this.set('field.id', Ember.String.underscore(label));
|
this.set('field.id', Ember.String.underscore(label));
|
||||||
},
|
},
|
||||||
|
|
||||||
actions: {
|
actions: {
|
||||||
addChoice() {
|
addChoice() {
|
||||||
|
this.get('field.choices').pushObject(Ember.Object.create());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
|
@ -5,13 +5,11 @@ export default Ember.Component.extend({
|
||||||
|
|
||||||
@computed('step.fields.@each.id')
|
@computed('step.fields.@each.id')
|
||||||
allowAddAction(stepFields) {
|
allowAddAction(stepFields) {
|
||||||
console.log(stepFields)
|
|
||||||
return stepFields.get('firstObject.id');
|
return stepFields.get('firstObject.id');
|
||||||
},
|
},
|
||||||
|
|
||||||
actions: {
|
actions: {
|
||||||
addField() {
|
addField() {
|
||||||
console.log('adding field')
|
|
||||||
this.get('step.fields').pushObject(Ember.Object.create());
|
this.get('step.fields').pushObject(Ember.Object.create());
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -19,8 +17,8 @@ export default Ember.Component.extend({
|
||||||
this.get('step.actions').pushObject(Ember.Object.create());
|
this.get('step.actions').pushObject(Ember.Object.create());
|
||||||
},
|
},
|
||||||
|
|
||||||
removeStep() {
|
removeField(field) {
|
||||||
this.sendAction('removeStep', this.get('step.name'));
|
this.get('step.fields').removeObject(field);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
|
@ -7,7 +7,7 @@ export default Ember.Controller.extend({
|
||||||
},
|
},
|
||||||
|
|
||||||
remove() {
|
remove() {
|
||||||
this.get('model').destroy().then(() => {
|
this.get('model').remove().then(() => {
|
||||||
this.transitionToRoute('adminWizardsCustom');
|
this.transitionToRoute('adminWizardsCustom');
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
@ -19,8 +19,8 @@ export default Ember.Controller.extend({
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
removeStep(name) {
|
removeStep(step) {
|
||||||
this.get('model.steps').findBy('name', name);
|
this.get('model.steps').removeObject(step);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
|
@ -1,20 +1,36 @@
|
||||||
import { ajax } from 'discourse/lib/ajax';
|
import { ajax } from 'discourse/lib/ajax';
|
||||||
|
import { default as computed } from 'ember-addons/ember-computed-decorators';
|
||||||
|
|
||||||
const CustomWizard = Discourse.Model.extend({
|
const CustomWizard = Discourse.Model.extend({
|
||||||
steps: Ember.A(),
|
steps: Ember.A(),
|
||||||
|
|
||||||
|
@computed('name')
|
||||||
|
dasherizedName(name) {
|
||||||
|
return Ember.String.dasherize(name);
|
||||||
|
},
|
||||||
|
|
||||||
save() {
|
save() {
|
||||||
const steps = JSON.stringify(this.get('steps').toArray());
|
const wizard = {
|
||||||
return ajax(`/admin/wizards/custom/${this.get('name')}`, {
|
id: this.get('id'),
|
||||||
|
steps: this.get('steps').toArray(),
|
||||||
|
name: this.get('name')
|
||||||
|
};
|
||||||
|
|
||||||
|
return ajax(`/admin/wizards/custom/save`, {
|
||||||
type: 'PUT',
|
type: 'PUT',
|
||||||
data: { steps }
|
data: {
|
||||||
|
wizard: JSON.stringify(wizard)
|
||||||
|
}
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
destroy() {
|
remove() {
|
||||||
return ajax(`/admin/wizards/custom/${this.get('name')}`, {
|
return ajax(`/admin/wizards/custom/remove`, {
|
||||||
type: 'DELETE'
|
type: 'DELETE',
|
||||||
});
|
data: {
|
||||||
|
id: this.get('id')
|
||||||
|
}
|
||||||
|
}).then(() => this.destroy());
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -31,6 +47,7 @@ CustomWizard.reopenClass({
|
||||||
|
|
||||||
steps.forEach((s) => {
|
steps.forEach((s) => {
|
||||||
s.fields = Ember.A(s.fields);
|
s.fields = Ember.A(s.fields);
|
||||||
|
s.fields.forEach((f) => f.choices = Ember.A(f.choices));
|
||||||
s.actions = Ember.A(s.actions);
|
s.actions = Ember.A(s.actions);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
@ -4,14 +4,14 @@ export default Discourse.Route.extend({
|
||||||
model(params) {
|
model(params) {
|
||||||
if (params.name === 'new') {
|
if (params.name === 'new') {
|
||||||
this.set('new', true);
|
this.set('new', true);
|
||||||
return CustomWizard.create();
|
return CustomWizard.create({ name: '', steps: []});
|
||||||
}
|
}
|
||||||
|
|
||||||
this.set('new', false);
|
this.set('new', false);
|
||||||
|
|
||||||
const wizard = this.modelFor('admin-wizards-custom').findBy('name', params.name );
|
const wizard = this.modelFor('admin-wizards-custom').findBy('dasherizedName', params.name );
|
||||||
|
|
||||||
if (!wizard) { return this.transitionTo('adminWizardsCustom.index'); }
|
if (!wizard) return this.transitionTo('adminWizardsCustom.index');
|
||||||
|
|
||||||
return wizard;
|
return wizard;
|
||||||
},
|
},
|
||||||
|
|
|
@ -8,10 +8,11 @@
|
||||||
{{#if model.steps}}
|
{{#if model.steps}}
|
||||||
{{#each model.steps as |s|}}
|
{{#each model.steps as |s|}}
|
||||||
{{wizard-custom-step step=s}}
|
{{wizard-custom-step step=s}}
|
||||||
|
{{d-button action='removeStep' actionParam=s label='admin.wizard.step.remove'}}
|
||||||
{{/each}}
|
{{/each}}
|
||||||
{{/if}}
|
{{/if}}
|
||||||
|
|
||||||
{{d-button action='addStep' label='admin.wizard.add_step'}}
|
{{d-button action='addStep' label='admin.wizard.step.add'}}
|
||||||
|
|
||||||
<div class='buttons'>
|
<div class='buttons'>
|
||||||
<button {{action "save"}} disabled={{disableSave}} class='btn btn-primary'>{{i18n 'admin.wizard.save'}}</button>
|
<button {{action "save"}} disabled={{disableSave}} class='btn btn-primary'>{{i18n 'admin.wizard.save'}}</button>
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
<ul>
|
<ul>
|
||||||
{{#each model as |w|}}
|
{{#each model as |w|}}
|
||||||
<li>
|
<li>
|
||||||
{{#link-to "adminWizard" w.name}}{{w.name}}{{/link-to}}
|
{{#link-to "adminWizard" w.dasherizedName}}{{w.name}}{{/link-to}}
|
||||||
</li>
|
</li>
|
||||||
{{/each}}
|
{{/each}}
|
||||||
</ul>
|
</ul>
|
||||||
|
|
|
@ -14,7 +14,7 @@
|
||||||
{{#if isDropdown}}
|
{{#if isDropdown}}
|
||||||
<span>{{i18n 'admin.wizard.field.choices_label'}}</span>
|
<span>{{i18n 'admin.wizard.field.choices_label'}}</span>
|
||||||
{{#each field.choices as |c|}}
|
{{#each field.choices as |c|}}
|
||||||
{{input type='text' value=c}}
|
{{input type='text' value=c.label}}
|
||||||
{{/each}}
|
{{/each}}
|
||||||
{{d-button action='addChoice' label='admin.wizard.field.add_choice'}}
|
{{d-button action='addChoice' label='admin.wizard.field.add_choice'}}
|
||||||
{{/if}}
|
{{/if}}
|
||||||
|
|
|
@ -15,6 +15,7 @@
|
||||||
|
|
||||||
{{#each step.fields as |f|}}
|
{{#each step.fields as |f|}}
|
||||||
{{wizard-custom-field field=f}}
|
{{wizard-custom-field field=f}}
|
||||||
|
{{d-button action='removeField' actionParam=f label="admin.wizard.field.remove"}}
|
||||||
{{/each}}
|
{{/each}}
|
||||||
|
|
||||||
{{d-button action='addField' label='admin.wizard.step.add_field'}}
|
{{d-button action='addField' label='admin.wizard.step.add_field'}}
|
||||||
|
@ -26,5 +27,3 @@
|
||||||
{{#if allowAddAction}}
|
{{#if allowAddAction}}
|
||||||
{{d-button action='addAction' label='admin.wizard.step.add_action'}}
|
{{d-button action='addAction' label='admin.wizard.step.add_action'}}
|
||||||
{{/if}}
|
{{/if}}
|
||||||
|
|
||||||
{{d-button action='removeStep' label='admin.wizard.remove_step'}}
|
|
||||||
|
|
|
@ -7,8 +7,6 @@ en:
|
||||||
custom_label: "Custom"
|
custom_label: "Custom"
|
||||||
name: "Name"
|
name: "Name"
|
||||||
name_placeholder: "name of the wizard"
|
name_placeholder: "name of the wizard"
|
||||||
add_step: "Add Step"
|
|
||||||
remove_step: "Remove Step"
|
|
||||||
save: "Save Wizard"
|
save: "Save Wizard"
|
||||||
remove: "Delete Wizard"
|
remove: "Delete Wizard"
|
||||||
step:
|
step:
|
||||||
|
@ -18,6 +16,8 @@ en:
|
||||||
banner_placeholder: "This image will appear under the title"
|
banner_placeholder: "This image will appear under the title"
|
||||||
description: "Step Description"
|
description: "Step Description"
|
||||||
description_placeholder: "This will appear underneath the title and / or title"
|
description_placeholder: "This will appear underneath the title and / or title"
|
||||||
|
add: "Add Step"
|
||||||
|
remove: "Remove Step"
|
||||||
add_field: "Add Field"
|
add_field: "Add Field"
|
||||||
add_action: "Add Action"
|
add_action: "Add Action"
|
||||||
field:
|
field:
|
||||||
|
@ -27,5 +27,6 @@ en:
|
||||||
choices_label: "Dropdown Choices"
|
choices_label: "Dropdown Choices"
|
||||||
add_choice: "Add Choice"
|
add_choice: "Add Choice"
|
||||||
required: "Field Required"
|
required: "Field Required"
|
||||||
|
remove: "Remove Field"
|
||||||
action:
|
action:
|
||||||
email: "Email"
|
email: "Email"
|
||||||
|
|
|
@ -7,42 +7,35 @@ class CustomWizard::AdminController < ::ApplicationController
|
||||||
end
|
end
|
||||||
|
|
||||||
def save
|
def save
|
||||||
params.require(:name)
|
params.require(:wizard)
|
||||||
params.permit(:steps)
|
|
||||||
|
|
||||||
wizard = { name: params[:name] }
|
wizard = ::JSON.parse(params[:wizard])
|
||||||
|
|
||||||
wizard['steps'] = params[:steps] if params[:steps]
|
wizard["id"] = SecureRandom.hex(8) if !wizard["id"]
|
||||||
|
|
||||||
key = params[:name].downcase
|
PluginStore.set('custom_wizards', wizard["id"], wizard)
|
||||||
|
|
||||||
PluginStore.set('custom_wizards', key, wizard)
|
|
||||||
|
|
||||||
render json: success_json
|
render json: success_json
|
||||||
end
|
end
|
||||||
|
|
||||||
def remove
|
def remove
|
||||||
params.require(:name)
|
params.require(:id)
|
||||||
|
|
||||||
key = params[:name].downcase
|
PluginStore.remove('custom_wizards', params[:id])
|
||||||
|
|
||||||
PluginStore.remove('custom_wizards', key)
|
|
||||||
|
|
||||||
render json: success_json
|
render json: success_json
|
||||||
end
|
end
|
||||||
|
|
||||||
def find
|
def find
|
||||||
params.require(:name)
|
params.require(:id)
|
||||||
|
|
||||||
key = params[:name].downcase
|
wizard = PluginStore.get('custom_wizards', params[:id])
|
||||||
|
|
||||||
wizard = PluginStore.get('custom_wizards', key)
|
|
||||||
|
|
||||||
render json: success_json.merge(wizard: wizard)
|
render json: success_json.merge(wizard: wizard)
|
||||||
end
|
end
|
||||||
|
|
||||||
def all
|
def all
|
||||||
rows = PluginStoreRow.where(plugin_name: 'custom_wizards')
|
rows = PluginStoreRow.where(plugin_name: 'custom_wizards').order(:id)
|
||||||
|
|
||||||
wizards = rows ? [*rows].map do |r|
|
wizards = rows ? [*rows].map do |r|
|
||||||
CustomWizard::Wizard.new(r.value)
|
CustomWizard::Wizard.new(r.value)
|
||||||
|
|
|
@ -4,7 +4,8 @@ class CustomWizard::Wizard
|
||||||
|
|
||||||
def initialize(data)
|
def initialize(data)
|
||||||
parsed = ::JSON.parse(data)
|
parsed = ::JSON.parse(data)
|
||||||
|
@id = parsed['id']
|
||||||
@name = parsed['name']
|
@name = parsed['name']
|
||||||
@steps = JSON.parse(parsed['steps'])
|
@steps = parsed['steps']
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -18,9 +18,9 @@ after_initialize do
|
||||||
get 'custom' => 'admin#index'
|
get 'custom' => 'admin#index'
|
||||||
get 'custom/new' => 'admin#index'
|
get 'custom/new' => 'admin#index'
|
||||||
get 'custom/all' => "admin#all"
|
get 'custom/all' => "admin#all"
|
||||||
get 'custom/:name' => "admin#find"
|
get 'custom/:id' => "admin#find"
|
||||||
put 'custom/:name' => "admin#save"
|
put 'custom/save' => "admin#save"
|
||||||
delete 'custom/:name' => "admin#remove"
|
delete 'custom/remove' => "admin#remove"
|
||||||
end
|
end
|
||||||
|
|
||||||
require_dependency 'admin_constraint'
|
require_dependency 'admin_constraint'
|
||||||
|
|
Laden …
In neuem Issue referenzieren