Spiegel von
https://github.com/paviliondev/discourse-custom-wizard.git
synchronisiert 2024-11-25 18:50:27 +01:00
wip
Dieser Commit ist enthalten in:
Ursprung
66bd90a56e
Commit
3bb16f1fb5
29 geänderte Dateien mit 811 neuen und 775 gelöschten Zeilen
|
@ -49,14 +49,14 @@ export default Ember.Component.extend({
|
||||||
|
|
||||||
@observes('action.custom_category_wizard_field')
|
@observes('action.custom_category_wizard_field')
|
||||||
toggleCustomCategoryUserField() {
|
toggleCustomCategoryUserField() {
|
||||||
const wizard = this.get('action.custom_category_wizard_field');
|
if (this.action.custom_category_wizard_field)
|
||||||
if (wizard) this.set('action.custom_category_user_field', false);
|
this.set('action.custom_category_user_field', false);
|
||||||
},
|
},
|
||||||
|
|
||||||
@observes('action.custom_category_user_field')
|
@observes('action.custom_category_user_field')
|
||||||
toggleCustomCategoryWizardField() {
|
toggleCustomCategoryWizardField() {
|
||||||
const user = this.get('action.custom_category_user_field');
|
if (this.action.custom_category_user_field)
|
||||||
if (user) this.set('action.custom_category_wizard_field', false);
|
this.set('action.custom_category_wizard_field', false);
|
||||||
},
|
},
|
||||||
|
|
||||||
@computed('wizard.apis')
|
@computed('wizard.apis')
|
||||||
|
|
|
@ -14,6 +14,8 @@ export default Ember.Component.extend({
|
||||||
choicesTranslation: equal('field.choices_type', 'translation'),
|
choicesTranslation: equal('field.choices_type', 'translation'),
|
||||||
choicesCustom: equal('field.choices_type', 'custom'),
|
choicesCustom: equal('field.choices_type', 'custom'),
|
||||||
categoryPropertyTypes: generateSelectKitContent(['id', 'slug']),
|
categoryPropertyTypes: generateSelectKitContent(['id', 'slug']),
|
||||||
|
prefillEnabled: or('isCategory', 'isTag', 'isGroup'),
|
||||||
|
contentEnabled: or('isCategory', 'isTag', 'isGroup'),
|
||||||
|
|
||||||
@computed('field.type')
|
@computed('field.type')
|
||||||
isInput: (type) => type === 'text' || type === 'textarea' || type === 'url',
|
isInput: (type) => type === 'text' || type === 'textarea' || type === 'url',
|
||||||
|
@ -24,45 +26,40 @@ export default Ember.Component.extend({
|
||||||
@on('didInsertElement')
|
@on('didInsertElement')
|
||||||
@observes('isUpload')
|
@observes('isUpload')
|
||||||
setupFileType() {
|
setupFileType() {
|
||||||
if (this.get('isUpload') && !this.get('field.file_types')) {
|
if (this.isUpload && !this.field.file_types) {
|
||||||
this.set('field.file_types', '.jpg,.png');
|
this.set('field.file_types', '.jpg,.png');
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
@computed('isCategory', 'isGroup', 'isTag')
|
@computed('field.type')
|
||||||
prefillOptions(isCategory, isGroup, isTag) {
|
prefillOptions(fieldType) {
|
||||||
|
if (!this.prefillEnabled) return {};
|
||||||
|
|
||||||
let options = {
|
let options = {
|
||||||
hasOutput: true,
|
hasOutput: true,
|
||||||
enableConnectors: true,
|
textSelection: 'key,value',
|
||||||
wizardFieldSelection: true,
|
wizardSelection: true,
|
||||||
userFieldSelection: true
|
userSelection: 'key,value'
|
||||||
}
|
|
||||||
|
|
||||||
if (isCategory || isGroup || isTag) {
|
|
||||||
options.userFieldSelection = 'key,value';
|
|
||||||
options[`${this.field.type}Selection`] = 'output';
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
options[`${fieldType}Selection`] = 'output';
|
||||||
|
options[`outputDefaultSelection`] = fieldType;
|
||||||
|
|
||||||
return options;
|
return options;
|
||||||
},
|
},
|
||||||
|
|
||||||
prefillEnabled: or('isCategory', 'isTag', 'isGroup'),
|
|
||||||
contentEnabled: or('isCategory', 'isTag', 'isGroup'),
|
|
||||||
|
|
||||||
@computed('field.type')
|
@computed('field.type')
|
||||||
contentOptions(fieldType) {
|
contentOptions(fieldType) {
|
||||||
if (!this.contentEnabled) return {};
|
if (!this.contentEnabled) return {};
|
||||||
|
|
||||||
let options = {
|
let options = {
|
||||||
hasOutput: true,
|
hasOutput: true,
|
||||||
enableConnectors: true,
|
wizardSelection: 'key,value',
|
||||||
wizardFieldSelection: 'key,value',
|
userSelection: 'key,value',
|
||||||
userFieldSelection: 'key,value',
|
textSelection: 'key,value'
|
||||||
textDisabled: 'output'
|
|
||||||
}
|
}
|
||||||
|
|
||||||
options[`${this.field.type}Selection`] = 'output';
|
options[`${fieldType}Selection`] = 'output';
|
||||||
options[`${this.field.type}AllowMultiple`] = true;
|
|
||||||
|
|
||||||
return options;
|
return options;
|
||||||
},
|
},
|
||||||
|
|
|
@ -1,14 +0,0 @@
|
||||||
import { connectors } from '../lib/custom-wizard';
|
|
||||||
import { gt, or, alias } from "@ember/object/computed";
|
|
||||||
import { computed, observes} from "@ember/object";
|
|
||||||
|
|
||||||
export default Ember.Component.extend({
|
|
||||||
classNameBindings: [':input-pair', 'hasConnector::no-connector'],
|
|
||||||
connectors: connectors,
|
|
||||||
hasConnector: or('options.enableConnectors', 'connectorKey'),
|
|
||||||
firstPair: gt('pair.index', 0),
|
|
||||||
showRemove: alias('firstPair'),
|
|
||||||
showJoin: computed('pair.pairCount', function() {
|
|
||||||
return this.pair.index < (this.pair.pairCount - 1);
|
|
||||||
})
|
|
||||||
})
|
|
|
@ -1,77 +0,0 @@
|
||||||
import {
|
|
||||||
newPair,
|
|
||||||
generateSelectKitContent,
|
|
||||||
defaultInputType
|
|
||||||
} from '../lib/custom-wizard';
|
|
||||||
import {
|
|
||||||
default as discourseComputed,
|
|
||||||
on
|
|
||||||
} from 'discourse-common/utils/decorators';
|
|
||||||
import { computed, set } from "@ember/object";
|
|
||||||
import { alias } from "@ember/object/computed";
|
|
||||||
|
|
||||||
export default Ember.Component.extend({
|
|
||||||
classNameBindings: [':custom-input', 'type'],
|
|
||||||
inputType: alias('input.type'),
|
|
||||||
outputConnector: computed('inputTypes', function() {
|
|
||||||
const key = this.outputConnectorKey || `admin.wizard.input.${this.type}.output`;
|
|
||||||
return I18n.t(key).toLowerCase();
|
|
||||||
}),
|
|
||||||
|
|
||||||
@on('init')
|
|
||||||
setDefaults() {
|
|
||||||
if (!this.type) this.set('type', defaultInputType(this.options));
|
|
||||||
},
|
|
||||||
|
|
||||||
@discourseComputed('options.allowedInputs')
|
|
||||||
allowedInputs(option) {
|
|
||||||
return option || 'conditional,assignment';
|
|
||||||
},
|
|
||||||
|
|
||||||
@discourseComputed('allowedInputs')
|
|
||||||
inputTypes(allowedInputs) {
|
|
||||||
return allowedInputs.split(',').map((type) => {
|
|
||||||
return {
|
|
||||||
id: type,
|
|
||||||
name: I18n.t(`admin.wizard.input.${type}.prefix`)
|
|
||||||
}
|
|
||||||
});
|
|
||||||
},
|
|
||||||
|
|
||||||
@discourseComputed('options.hasOutput', 'input.type')
|
|
||||||
hasPairs(hasOutput, inputType) {
|
|
||||||
return !hasOutput || inputType === 'conditional';
|
|
||||||
},
|
|
||||||
|
|
||||||
@discourseComputed('input.type')
|
|
||||||
hasOutputConnector(inputType) {
|
|
||||||
return inputType === 'conditional';
|
|
||||||
},
|
|
||||||
|
|
||||||
actions: {
|
|
||||||
addPair() {
|
|
||||||
const pairs = this.get('input.pairs');
|
|
||||||
|
|
||||||
const pairCount = pairs.length + 1;
|
|
||||||
pairs.forEach(p => (set(p, 'pairCount', pairCount)));
|
|
||||||
|
|
||||||
pairs.pushObject(
|
|
||||||
newPair(Object.assign(
|
|
||||||
{},
|
|
||||||
this.options,
|
|
||||||
{
|
|
||||||
index: pairs.length,
|
|
||||||
pairCount,
|
|
||||||
}
|
|
||||||
))
|
|
||||||
);
|
|
||||||
},
|
|
||||||
|
|
||||||
removePair(pair) {
|
|
||||||
const pairs = this.get('input.pairs');
|
|
||||||
const pairCount = pairs.length - 1;
|
|
||||||
pairs.forEach(p => (set(p, 'pairCount', pairCount)));
|
|
||||||
pairs.removeObject(pair);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
|
@ -32,41 +32,17 @@ export default Ember.Component.extend({
|
||||||
|
|
||||||
actions.forEach(a => {
|
actions.forEach(a => {
|
||||||
if (a.type === 'route_to' && a.code) {
|
if (a.type === 'route_to' && a.code) {
|
||||||
content.push(Ember.Object.create({
|
content.push(
|
||||||
id: a.code,
|
Ember.Object.create({
|
||||||
label: "code (Route To)"
|
id: a.code,
|
||||||
}));
|
label: "code (Route To)"
|
||||||
|
})
|
||||||
|
);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
return content;
|
return content;
|
||||||
},
|
},
|
||||||
|
|
||||||
@computed('step.id', 'wizard.save_submissions')
|
|
||||||
wizardFields(currentStepId, saveSubmissions) {
|
|
||||||
const allSteps = this.get('wizard.steps');
|
|
||||||
let steps = allSteps;
|
|
||||||
let fields = [];
|
|
||||||
|
|
||||||
if (!saveSubmissions) {
|
|
||||||
steps = [allSteps.findBy('id', currentStepId)];
|
|
||||||
}
|
|
||||||
|
|
||||||
steps.forEach((s) => {
|
|
||||||
if (s.fields && s.fields.length > 0) {
|
|
||||||
let stepFields = s.fields.map((f) => {
|
|
||||||
return Ember.Object.create({
|
|
||||||
id: f.id,
|
|
||||||
label: `${f.id} (${s.id})`,
|
|
||||||
type: f.type
|
|
||||||
});
|
|
||||||
});
|
|
||||||
fields.push(...stepFields);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
return fields;
|
|
||||||
},
|
|
||||||
|
|
||||||
actions: {
|
actions: {
|
||||||
bannerUploadDone(upload) {
|
bannerUploadDone(upload) {
|
||||||
|
|
|
@ -1,24 +0,0 @@
|
||||||
import { getOwner } from 'discourse-common/lib/get-owner';
|
|
||||||
import { on } from 'discourse-common/utils/decorators';
|
|
||||||
import { newInput } from '../lib/custom-wizard';
|
|
||||||
import { default as discourseComputed } from 'discourse-common/utils/decorators';
|
|
||||||
|
|
||||||
export default Ember.Component.extend({
|
|
||||||
classNames: 'field-mapper',
|
|
||||||
|
|
||||||
@discourseComputed('inputs.[]', 'options.singular')
|
|
||||||
canAdd(inputs, singular) {
|
|
||||||
return !singular || !inputs || inputs.length < 1;
|
|
||||||
},
|
|
||||||
|
|
||||||
actions: {
|
|
||||||
add() {
|
|
||||||
if (!this.get('inputs')) this.set('inputs', Ember.A());
|
|
||||||
this.get('inputs').pushObject(newInput(this.options));
|
|
||||||
},
|
|
||||||
|
|
||||||
remove(input) {
|
|
||||||
this.get('inputs').removeObject(input);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
|
@ -22,7 +22,7 @@ export default Ember.Component.extend({
|
||||||
},
|
},
|
||||||
|
|
||||||
updateItemOrder(itemId, newIndex) {
|
updateItemOrder(itemId, newIndex) {
|
||||||
const items = this.get('items');
|
const items = this.items;
|
||||||
const item = items.findBy('id', itemId);
|
const item = items.findBy('id', itemId);
|
||||||
items.removeObject(item);
|
items.removeObject(item);
|
||||||
items.insertAt(newIndex, item);
|
items.insertAt(newIndex, item);
|
||||||
|
@ -38,13 +38,13 @@ export default Ember.Component.extend({
|
||||||
|
|
||||||
return items.map((item) => {
|
return items.map((item) => {
|
||||||
if (item) {
|
if (item) {
|
||||||
const id = item.get('id');
|
const id = item.id;
|
||||||
const type = this.get('type');
|
const type = this.type;
|
||||||
const label = type === 'action' ? id : (item.get('label') || item.get('title') || id);
|
const label = type === 'action' ? id : (item.label || item.title || id);
|
||||||
let link = { id, label };
|
let link = { id, label };
|
||||||
|
|
||||||
let classes = 'btn';
|
let classes = 'btn';
|
||||||
if (current && item.get('id') === current.get('id')) {
|
if (current && item.id === current.id) {
|
||||||
classes += ' btn-primary';
|
classes += ' btn-primary';
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -57,8 +57,8 @@ export default Ember.Component.extend({
|
||||||
|
|
||||||
actions: {
|
actions: {
|
||||||
add() {
|
add() {
|
||||||
const items = this.get('items');
|
const items = this.items;
|
||||||
const type = this.get('type');
|
const type = this.type;
|
||||||
const newId = `${type}_${items.length + 1}`;
|
const newId = `${type}_${items.length + 1}`;
|
||||||
let params = { id: newId, isNew: true };
|
let params = { id: newId, isNew: true };
|
||||||
|
|
||||||
|
@ -73,12 +73,11 @@ export default Ember.Component.extend({
|
||||||
},
|
},
|
||||||
|
|
||||||
change(itemId) {
|
change(itemId) {
|
||||||
const items = this.get('items');
|
this.set('current', this.items.findBy('id', itemId));
|
||||||
this.set('current', items.findBy('id', itemId));
|
|
||||||
},
|
},
|
||||||
|
|
||||||
remove(itemId) {
|
remove(itemId) {
|
||||||
const items = this.get('items');
|
const items = this.items;
|
||||||
items.removeObject(items.findBy('id', itemId));
|
items.removeObject(items.findBy('id', itemId));
|
||||||
this.set('current', items[items.length - 1]);
|
this.set('current', items[items.length - 1]);
|
||||||
}
|
}
|
||||||
|
|
48
assets/javascripts/discourse/components/wizard-mapper-input.js.es6
Normale Datei
48
assets/javascripts/discourse/components/wizard-mapper-input.js.es6
Normale Datei
|
@ -0,0 +1,48 @@
|
||||||
|
import { computed, set } from "@ember/object";
|
||||||
|
import { alias, equal } from "@ember/object/computed";
|
||||||
|
import {
|
||||||
|
newPair,
|
||||||
|
connectorContent,
|
||||||
|
inputTypesContent
|
||||||
|
} from '../lib/custom-wizard';
|
||||||
|
|
||||||
|
export default Ember.Component.extend({
|
||||||
|
classNameBindings: [':mapper-input', 'type'],
|
||||||
|
inputType: alias('input.type'),
|
||||||
|
isConditional: equal('inputType', 'conditional'),
|
||||||
|
hasOutput: alias('options.hasOutput'),
|
||||||
|
hasPairs: computed('hasOutput', 'isConditional', function() { return !this.hasOutput || this.isConditional; }),
|
||||||
|
connectors: computed(function() { return connectorContent('output', this.input.type, this.options) }),
|
||||||
|
inputTypes: computed(function() { return inputTypesContent(this.options) }),
|
||||||
|
|
||||||
|
actions: {
|
||||||
|
addPair() {
|
||||||
|
const pairs = this.input.pairs;
|
||||||
|
const pairCount = pairs.length + 1;
|
||||||
|
|
||||||
|
pairs.forEach(p => (set(p, 'pairCount', pairCount)));
|
||||||
|
|
||||||
|
pairs.pushObject(
|
||||||
|
newPair(
|
||||||
|
this.input.type,
|
||||||
|
Object.assign(
|
||||||
|
{},
|
||||||
|
this.options,
|
||||||
|
{
|
||||||
|
index: pairs.length,
|
||||||
|
pairCount,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
},
|
||||||
|
|
||||||
|
removePair(pair) {
|
||||||
|
const pairs = this.input.pairs;
|
||||||
|
const pairCount = pairs.length - 1;
|
||||||
|
|
||||||
|
pairs.forEach(p => (set(p, 'pairCount', pairCount)));
|
||||||
|
pairs.removeObject(pair);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
15
assets/javascripts/discourse/components/wizard-mapper-pair.js.es6
Normale Datei
15
assets/javascripts/discourse/components/wizard-mapper-pair.js.es6
Normale Datei
|
@ -0,0 +1,15 @@
|
||||||
|
import { connectorContent } from '../lib/custom-wizard';
|
||||||
|
import { gt, or, alias } from "@ember/object/computed";
|
||||||
|
import { computed, observes } from "@ember/object";
|
||||||
|
|
||||||
|
export default Ember.Component.extend({
|
||||||
|
classNameBindings: [':mapper-pair', 'hasConnector::no-connector'],
|
||||||
|
firstPair: gt('pair.index', 0),
|
||||||
|
showRemove: alias('firstPair'),
|
||||||
|
showJoin: computed('pair.pairCount', function() {
|
||||||
|
return this.pair.index < (this.pair.pairCount - 1);
|
||||||
|
}),
|
||||||
|
connectors: computed(function() {
|
||||||
|
return connectorContent('pair', this.inputType, this.options);
|
||||||
|
})
|
||||||
|
});
|
|
@ -1,15 +1,14 @@
|
||||||
import { alias, equal } from "@ember/object/computed";
|
import { alias } from "@ember/object/computed";
|
||||||
import { computed } from "@ember/object";
|
import { computed } from "@ember/object";
|
||||||
import {
|
import {
|
||||||
default as discourseComputed,
|
default as discourseComputed,
|
||||||
observes,
|
observes,
|
||||||
on
|
|
||||||
} from "discourse-common/utils/decorators";
|
} from "discourse-common/utils/decorators";
|
||||||
import { defaultSelectionType } from '../lib/custom-wizard';
|
import { defaultSelectionType } from '../lib/custom-wizard';
|
||||||
import { getOwner } from 'discourse-common/lib/get-owner';
|
import { getOwner } from 'discourse-common/lib/get-owner';
|
||||||
|
|
||||||
export default Ember.Component.extend({
|
export default Ember.Component.extend({
|
||||||
classNames: 'input-selector',
|
classNames: 'mapper-selector',
|
||||||
groups: alias('site.groups'),
|
groups: alias('site.groups'),
|
||||||
categories: computed(function() {
|
categories: computed(function() {
|
||||||
return this.site.categories.map(c => ({ id: c.id, name: c.name }));
|
return this.site.categories.map(c => ({ id: c.id, name: c.name }));
|
||||||
|
@ -18,7 +17,13 @@ export default Ember.Component.extend({
|
||||||
@discourseComputed
|
@discourseComputed
|
||||||
userFields() {
|
userFields() {
|
||||||
const controller = getOwner(this).lookup('controller:admin-wizard');
|
const controller = getOwner(this).lookup('controller:admin-wizard');
|
||||||
return controller.get('model.userFields');
|
return controller.model.userFields;
|
||||||
|
},
|
||||||
|
|
||||||
|
@discourseComputed
|
||||||
|
wizardFields() {
|
||||||
|
const controller = getOwner(this).lookup('controller:admin-wizard');
|
||||||
|
return controller.wizardFields;
|
||||||
},
|
},
|
||||||
|
|
||||||
@observes('options.@each')
|
@observes('options.@each')
|
||||||
|
@ -36,12 +41,11 @@ export default Ember.Component.extend({
|
||||||
return customPlaceholder || 'admin.wizard.text';
|
return customPlaceholder || 'admin.wizard.text';
|
||||||
},
|
},
|
||||||
|
|
||||||
showText: equal('activeType', 'text'),
|
|
||||||
|
|
||||||
showInput(type) {
|
showInput(type) {
|
||||||
return this.activeType === type && this[`${type}Enabled`] && !this[`${type}Disabled`];
|
return this.activeType === type && this[`${type}Enabled`];
|
||||||
},
|
},
|
||||||
|
|
||||||
|
showText: computed('activeType', function() { return this.showInput('text') }),
|
||||||
showWizard: computed('activeType', function() { return this.showInput('wizard') }),
|
showWizard: computed('activeType', function() { return this.showInput('wizard') }),
|
||||||
showUser: computed('activeType', function() { return this.showInput('user') }),
|
showUser: computed('activeType', function() { return this.showInput('user') }),
|
||||||
showCategory: computed('activeType', function() { return this.showInput('category') }),
|
showCategory: computed('activeType', function() { return this.showInput('category') }),
|
||||||
|
@ -61,9 +65,9 @@ export default Ember.Component.extend({
|
||||||
return option.split(',').filter(o => types.indexOf(o) !== -1).length
|
return option.split(',').filter(o => types.indexOf(o) !== -1).length
|
||||||
},
|
},
|
||||||
|
|
||||||
textDisabled: computed('options.textDisabled', 'inputType', function() { return this.optionEnabled('textDisabled') }),
|
textEnabled: computed('options.textSelection', 'inputType', function() { return this.optionEnabled('textSelection') }),
|
||||||
wizardEnabled: computed('options.wizardFieldSelection', 'inputType', function() { return this.optionEnabled('wizardFieldSelection') }),
|
wizardEnabled: computed('options.wizardSelection', 'inputType', function() { return this.optionEnabled('wizardSelection') }),
|
||||||
userEnabled: computed('options.userFieldSelection', 'inputType', function() { return this.optionEnabled('userFieldSelection') }),
|
userEnabled: computed('options.userSelection', 'inputType', function() { return this.optionEnabled('userSelection') }),
|
||||||
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') }),
|
43
assets/javascripts/discourse/components/wizard-mapper.js.es6
Normale Datei
43
assets/javascripts/discourse/components/wizard-mapper.js.es6
Normale Datei
|
@ -0,0 +1,43 @@
|
||||||
|
import { getOwner } from 'discourse-common/lib/get-owner';
|
||||||
|
import { on } from 'discourse-common/utils/decorators';
|
||||||
|
import { newInput } from '../lib/custom-wizard';
|
||||||
|
import { default as discourseComputed } from 'discourse-common/utils/decorators';
|
||||||
|
|
||||||
|
export default Ember.Component.extend({
|
||||||
|
classNames: 'wizard-mapper',
|
||||||
|
|
||||||
|
@discourseComputed('inputs.[]', 'options.singular')
|
||||||
|
canAdd(inputs, singular) {
|
||||||
|
return !singular || !inputs || inputs.length < 1;
|
||||||
|
},
|
||||||
|
|
||||||
|
@discourseComputed('options')
|
||||||
|
inputOptions(options) {
|
||||||
|
return {
|
||||||
|
hasOutput: options.hasOutput || false,
|
||||||
|
inputTypes: options.inputTypes || null,
|
||||||
|
pairConnector: options.pairConnector || null,
|
||||||
|
outputConnector: options.outputConnector || null,
|
||||||
|
textSelection: options.textSelection || true,
|
||||||
|
wizardSelection: options.wizardSelection || false,
|
||||||
|
userSelection: options.userSelection || false,
|
||||||
|
categorySelection: options.categorySelection || false,
|
||||||
|
tagSelection: options.tagSelection || false,
|
||||||
|
groupSelection: options.groupSelection || false,
|
||||||
|
keyDefaultSelection: options.keyDefaultSelection || null,
|
||||||
|
valueDefaultSelection: options.valueDefaultSelection || null,
|
||||||
|
outputDefaultSelection: options.outputDefaultSelection || null
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
actions: {
|
||||||
|
add() {
|
||||||
|
if (!this.get('inputs')) this.set('inputs', Ember.A());
|
||||||
|
this.get('inputs').pushObject(newInput(this.inputOptions));
|
||||||
|
},
|
||||||
|
|
||||||
|
remove(input) {
|
||||||
|
this.get('inputs').removeObject(input);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
|
@ -1,4 +1,4 @@
|
||||||
import { default as computed, observes } from 'discourse-common/utils/decorators';
|
import { default as discourseComputed, observes } from 'discourse-common/utils/decorators';
|
||||||
import { notEmpty } from "@ember/object/computed";
|
import { notEmpty } from "@ember/object/computed";
|
||||||
import showModal from 'discourse/lib/show-modal';
|
import showModal from 'discourse/lib/show-modal';
|
||||||
import { generateId } from '../lib/custom-wizard';
|
import { generateId } from '../lib/custom-wizard';
|
||||||
|
@ -7,24 +7,49 @@ import { dasherize } from "@ember/string";
|
||||||
export default Ember.Controller.extend({
|
export default Ember.Controller.extend({
|
||||||
hasName: notEmpty('model.name'),
|
hasName: notEmpty('model.name'),
|
||||||
|
|
||||||
@computed('model.id')
|
@observes('model.name')
|
||||||
|
setId() {
|
||||||
|
if (!this.model.existingId) this.set('model.id', generateId(this.model.name));
|
||||||
|
},
|
||||||
|
|
||||||
|
@discourseComputed('model.id')
|
||||||
wizardUrl(wizardId) {
|
wizardUrl(wizardId) {
|
||||||
return window.location.origin + '/w/' + dasherize(wizardId);
|
return window.location.origin + '/w/' + dasherize(wizardId);
|
||||||
},
|
},
|
||||||
|
|
||||||
@observes('model.name')
|
|
||||||
setId() {
|
|
||||||
if (!this.model.existingId) {
|
|
||||||
this.set('model.id', generateId(this.model.name));
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
@computed('model.after_time_scheduled')
|
@discourseComputed('model.after_time_scheduled')
|
||||||
nextSessionScheduledLabel(scheduled) {
|
nextSessionScheduledLabel(scheduled) {
|
||||||
return scheduled ?
|
return scheduled ?
|
||||||
moment(scheduled).format('MMMM Do, HH:mm') :
|
moment(scheduled).format('MMMM Do, HH:mm') :
|
||||||
I18n.t('admin.wizard.after_time_time_label');
|
I18n.t('admin.wizard.after_time_time_label');
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@discourseComputed('currentStep.id', 'model.save_submissions', 'model.steps.@each.fields[]')
|
||||||
|
wizardFields(currentStepId, saveSubmissions) {
|
||||||
|
const allSteps = this.get('model.steps');
|
||||||
|
let steps = allSteps;
|
||||||
|
let fields = [];
|
||||||
|
|
||||||
|
if (!saveSubmissions) {
|
||||||
|
steps = [allSteps.findBy('id', currentStepId)];
|
||||||
|
}
|
||||||
|
|
||||||
|
steps.forEach((s) => {
|
||||||
|
if (s.fields && s.fields.length > 0) {
|
||||||
|
let stepFields = s.fields.map((f) => {
|
||||||
|
return Ember.Object.create({
|
||||||
|
id: f.id,
|
||||||
|
label: `${f.id} (${s.id})`,
|
||||||
|
type: f.type
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
fields.push(...stepFields);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return fields;
|
||||||
|
},
|
||||||
|
|
||||||
actions: {
|
actions: {
|
||||||
save() {
|
save() {
|
||||||
|
|
|
@ -8,6 +8,12 @@ function generateName(id) {
|
||||||
.replace(/(^\w|\b\w)/g, (m) => m.toUpperCase())
|
.replace(/(^\w|\b\w)/g, (m) => m.toUpperCase())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function generateId(name) {
|
||||||
|
return name.replace(/[^\w ]/g, '')
|
||||||
|
.replace(/ /g,"_")
|
||||||
|
.toLowerCase();
|
||||||
|
}
|
||||||
|
|
||||||
const profileFields = [
|
const profileFields = [
|
||||||
'name',
|
'name',
|
||||||
'username',
|
'username',
|
||||||
|
@ -21,25 +27,6 @@ const profileFields = [
|
||||||
'trust_level'
|
'trust_level'
|
||||||
];
|
];
|
||||||
|
|
||||||
const connectors = [
|
|
||||||
{
|
|
||||||
id: 'eq',
|
|
||||||
name: '='
|
|
||||||
},{
|
|
||||||
id: 'gt',
|
|
||||||
name: '>'
|
|
||||||
},{
|
|
||||||
id: 'lt',
|
|
||||||
name: '<'
|
|
||||||
},{
|
|
||||||
id: 'gte',
|
|
||||||
name: '>='
|
|
||||||
},{
|
|
||||||
id: 'lte',
|
|
||||||
name: '<='
|
|
||||||
}
|
|
||||||
]
|
|
||||||
|
|
||||||
const actionTypes = [
|
const actionTypes = [
|
||||||
'create_topic',
|
'create_topic',
|
||||||
'update_profile',
|
'update_profile',
|
||||||
|
@ -52,62 +39,130 @@ const actionTypes = [
|
||||||
'open_composer'
|
'open_composer'
|
||||||
];
|
];
|
||||||
|
|
||||||
const selectionTypes = [
|
// Inputs
|
||||||
'text',
|
|
||||||
'wizardField',
|
|
||||||
'userField',
|
|
||||||
'group',
|
|
||||||
'category',
|
|
||||||
'tag'
|
|
||||||
]
|
|
||||||
|
|
||||||
const inputTypes = [
|
const selectableInputTypes = [
|
||||||
'pair',
|
|
||||||
'conditional',
|
'conditional',
|
||||||
'assignment'
|
'assignment'
|
||||||
]
|
]
|
||||||
|
|
||||||
function defaultInputType(options = {}) {
|
function defaultInputType(options = {}) {
|
||||||
if (!options.hasOutput) return 'pair';
|
if (!options.hasOutput) return 'pair';
|
||||||
const allowedInputs = options.allowedInputs;
|
if (!options.inputTypes) return selectableInputTypes[0];
|
||||||
if (!allowedInputs) return 'conditional';
|
return options.inputTypes.split(',')[0];
|
||||||
return allowedInputs.split(',')[0];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function mapInputTypes(types) {
|
||||||
|
return types.map(function(type) {
|
||||||
|
return {
|
||||||
|
id: type,
|
||||||
|
name: I18n.t(`admin.wizard.input.${type}.name`)
|
||||||
|
};
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function inputTypesContent(options = {}) {
|
||||||
|
return options.inputTypes ?
|
||||||
|
mapInputTypes(options.inputTypes.split(',')) :
|
||||||
|
mapInputTypes(selectableInputTypes);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Connectors
|
||||||
|
|
||||||
|
const connectors = {
|
||||||
|
output: [
|
||||||
|
'then',
|
||||||
|
'set',
|
||||||
|
],
|
||||||
|
pair: [
|
||||||
|
'equal',
|
||||||
|
'greater',
|
||||||
|
'less',
|
||||||
|
'greater_or_equal',
|
||||||
|
'less_or_equal'
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
function connectorItem(connector) {
|
||||||
|
return {
|
||||||
|
id: connector,
|
||||||
|
name: I18n.t(`admin.wizard.connector.${connector}`)
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function defaultConnector(connectorType, inputType, opts = {}) {
|
||||||
|
if (opts[`${connectorType}Connector`]) return opts[`${connectorType}Connector`];
|
||||||
|
if (inputType === 'assignment') return 'set';
|
||||||
|
return connectorType === 'output' ? 'then' : 'equal';
|
||||||
|
}
|
||||||
|
|
||||||
|
function connectorContent(connectorType, inputType, opts) {
|
||||||
|
let connector = opts[`${connectorType}Connector`] || defaultConnector(connectorType, inputType, opts);
|
||||||
|
if (connector) return [connectorItem(connector)];
|
||||||
|
|
||||||
|
return connectors[connectorType].map(function(connector) {
|
||||||
|
return connectorItem(connector);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Selectors
|
||||||
|
|
||||||
|
const selectionTypes = [
|
||||||
|
'text',
|
||||||
|
'wizard',
|
||||||
|
'user',
|
||||||
|
'group',
|
||||||
|
'category',
|
||||||
|
'tag'
|
||||||
|
]
|
||||||
|
|
||||||
function defaultSelectionType(inputType, options = {}) {
|
function defaultSelectionType(inputType, options = {}) {
|
||||||
if (options[`${inputType}DefaultType`]) {
|
if (options[`${inputType}DefaultSelection`]) {
|
||||||
return options[`${inputType}DefaultType`];
|
return options[`${inputType}DefaultSelection`];
|
||||||
}
|
}
|
||||||
|
|
||||||
const textDisabled = options.textDisabled;
|
|
||||||
let type = 'text';
|
|
||||||
|
|
||||||
if (textDisabled === true ||
|
|
||||||
((typeof textDisabled == 'string') && textDisabled.indexOf(inputType) > -1)) {
|
|
||||||
|
|
||||||
for (let t of selectionTypes) {
|
let type = selectionTypes[0];
|
||||||
let inputTypes = options[`${t}Selection`];
|
|
||||||
|
for (let t of selectionTypes) {
|
||||||
if (inputTypes === true ||
|
let inputTypes = options[`${t}Selection`];
|
||||||
((typeof inputTypes == 'string') && inputTypes.indexOf(inputType) > -1)) {
|
|
||||||
|
if (inputTypes === true ||
|
||||||
type = t;
|
((typeof inputTypes === 'string') &&
|
||||||
break;
|
inputTypes.split(',').indexOf(inputType) > -1)) {
|
||||||
}
|
type = t;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return type;
|
return type;
|
||||||
}
|
}
|
||||||
|
|
||||||
function newInput(options = {}) {
|
// items
|
||||||
|
|
||||||
|
function newPair(inputType, options = {}) {
|
||||||
let params = {
|
let params = {
|
||||||
type: defaultInputType(options),
|
index: options.index,
|
||||||
|
pairCount: options.pairCount,
|
||||||
|
key: '',
|
||||||
|
key_type: defaultSelectionType('key', options),
|
||||||
|
value: '',
|
||||||
|
value_type: defaultSelectionType('value', options),
|
||||||
|
connector: defaultConnector('pair', inputType, options)
|
||||||
|
}
|
||||||
|
|
||||||
|
return Ember.Object.create(params);
|
||||||
|
}
|
||||||
|
|
||||||
|
function newInput(options = {}) {
|
||||||
|
const inputType = defaultInputType(options);
|
||||||
|
|
||||||
|
let params = {
|
||||||
|
type: inputType,
|
||||||
pairs: Ember.A(
|
pairs: Ember.A(
|
||||||
[
|
[
|
||||||
newPair(
|
newPair(
|
||||||
Object.assign(
|
inputType,
|
||||||
{},
|
Object.assign({},
|
||||||
options,
|
options,
|
||||||
{ index: 0, pairCount: 1 }
|
{ index: 0, pairCount: 1 }
|
||||||
)
|
)
|
||||||
|
@ -118,30 +173,13 @@ function newInput(options = {}) {
|
||||||
|
|
||||||
if (options.hasOutput) {
|
if (options.hasOutput) {
|
||||||
params['output_type'] = defaultSelectionType('output', options);
|
params['output_type'] = defaultSelectionType('output', options);
|
||||||
|
params['connector'] = defaultConnector('output', inputType, options);
|
||||||
}
|
}
|
||||||
|
|
||||||
return Ember.Object.create(params);
|
return Ember.Object.create(params);
|
||||||
}
|
}
|
||||||
|
|
||||||
function newPair(options = {}) {
|
//
|
||||||
let params = {
|
|
||||||
index: options.index,
|
|
||||||
pairCount: options.pairCount,
|
|
||||||
key: '',
|
|
||||||
key_type: defaultSelectionType('key', options),
|
|
||||||
value: '',
|
|
||||||
value_type: defaultSelectionType('value', options),
|
|
||||||
connector: 'eq'
|
|
||||||
}
|
|
||||||
|
|
||||||
return Ember.Object.create(params);
|
|
||||||
}
|
|
||||||
|
|
||||||
function generateId(name) {
|
|
||||||
return name.replace(/[^\w ]/g, '')
|
|
||||||
.replace(/ /g,"_")
|
|
||||||
.toLowerCase();
|
|
||||||
}
|
|
||||||
|
|
||||||
export {
|
export {
|
||||||
generateSelectKitContent,
|
generateSelectKitContent,
|
||||||
|
@ -150,7 +188,8 @@ export {
|
||||||
generateName,
|
generateName,
|
||||||
defaultInputType,
|
defaultInputType,
|
||||||
defaultSelectionType,
|
defaultSelectionType,
|
||||||
connectors,
|
connectorContent,
|
||||||
|
inputTypesContent,
|
||||||
newInput,
|
newInput,
|
||||||
newPair,
|
newPair,
|
||||||
generateId
|
generateId
|
||||||
|
|
|
@ -1,28 +1,18 @@
|
||||||
<div class="admin-wizard settings">
|
<div class="admin-wizard settings">
|
||||||
|
|
||||||
<div class="wizard-header large">
|
<div class="wizard-header large">
|
||||||
<span>{{model.name}}</span>
|
{{input
|
||||||
|
name="name"
|
||||||
|
value=model.name
|
||||||
|
placeholderKey="admin.wizard.name_placeholder"}}
|
||||||
|
|
||||||
{{#if model.name}}
|
<div class="wizard-url">
|
||||||
<div class="wizard-url">
|
{{#if model.name}}
|
||||||
<a href="{{wizardUrl}}" target="_blank">{{wizardUrl}}</a>
|
<a href="{{wizardUrl}}" target="_blank">{{wizardUrl}}</a>
|
||||||
</div>
|
{{/if}}
|
||||||
{{/if}}
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="wizard-basic-details">
|
<div class="wizard-basic-details">
|
||||||
<div class="setting">
|
|
||||||
<div class="setting-label">
|
|
||||||
<label>{{i18n 'admin.wizard.name'}}</label>
|
|
||||||
</div>
|
|
||||||
<div class="setting-value">
|
|
||||||
{{input
|
|
||||||
name="name"
|
|
||||||
value=model.name
|
|
||||||
placeholderKey="admin.wizard.name_placeholder"}}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="setting">
|
<div class="setting">
|
||||||
<div class="setting-label">
|
<div class="setting-label">
|
||||||
<label>{{i18n 'admin.wizard.background'}}</label>
|
<label>{{i18n 'admin.wizard.background'}}</label>
|
||||||
|
@ -31,7 +21,8 @@
|
||||||
{{input
|
{{input
|
||||||
name="background"
|
name="background"
|
||||||
value=model.background
|
value=model.background
|
||||||
placeholderKey="admin.wizard.background_placeholder"}}
|
placeholderKey="admin.wizard.background_placeholder"
|
||||||
|
class="medium"}}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@ -137,14 +128,14 @@
|
||||||
<label>{{i18n 'admin.wizard.permitted'}}</label>
|
<label>{{i18n 'admin.wizard.permitted'}}</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="setting-value">
|
<div class="setting-value">
|
||||||
{{wizard-field-mapper
|
{{wizard-mapper
|
||||||
inputs=model.permitted
|
inputs=model.permitted
|
||||||
options=(hash
|
options=(hash
|
||||||
|
singular=true
|
||||||
|
inputTypes='assignment'
|
||||||
hasOutput=true
|
hasOutput=true
|
||||||
groupSelection='output'
|
groupSelection='output'
|
||||||
textDisabled='output'
|
textSelection='key,value'
|
||||||
allowedInputs='assignment'
|
|
||||||
singular=true
|
|
||||||
)}}
|
)}}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -153,10 +144,10 @@
|
||||||
{{wizard-links type="step" current=currentStep items=model.steps}}
|
{{wizard-links type="step" current=currentStep items=model.steps}}
|
||||||
|
|
||||||
{{#if currentStep}}
|
{{#if currentStep}}
|
||||||
{{wizard-custom-step step=currentStep wizard=model}}
|
{{wizard-custom-step step=currentStep wizard=model wizardFields=wizardFields}}
|
||||||
{{/if}}
|
{{/if}}
|
||||||
|
|
||||||
<div class='buttons'>
|
<div class='admin-wizard-buttons'>
|
||||||
<button {{action "save"}} disabled={{disableSave}} class='btn btn-primary'>
|
<button {{action "save"}} disabled={{disableSave}} class='btn btn-primary'>
|
||||||
{{i18n 'admin.wizard.save'}}
|
{{i18n 'admin.wizard.save'}}
|
||||||
</button>
|
</button>
|
||||||
|
|
|
@ -21,13 +21,12 @@
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="setting-value">
|
<div class="setting-value">
|
||||||
{{wizard-field-mapper
|
{{wizard-mapper
|
||||||
inputs=action.title
|
inputs=action.title
|
||||||
wizardFields=wizardFields
|
|
||||||
options=(hash
|
options=(hash
|
||||||
hasOutput=true
|
hasOutput=true
|
||||||
wizardFieldSelection=true
|
wizardSelection=true
|
||||||
userFieldSelection='key,value'
|
userSelection='key,value'
|
||||||
)}}
|
)}}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -77,14 +76,13 @@
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="setting-value">
|
<div class="setting-value">
|
||||||
{{wizard-field-mapper
|
{{wizard-mapper
|
||||||
inputs=action.category
|
inputs=action.category
|
||||||
wizardFields=wizardFields
|
|
||||||
options=(hash
|
options=(hash
|
||||||
hasOutput=true
|
hasOutput=true
|
||||||
categorySelection='output'
|
categorySelection='output'
|
||||||
wizardFieldSelection=true
|
wizardSelection=true
|
||||||
userFieldSelection='key,value'
|
userSelection='key,value'
|
||||||
)}}
|
)}}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -95,14 +93,13 @@
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="setting-value">
|
<div class="setting-value">
|
||||||
{{wizard-field-mapper
|
{{wizard-mapper
|
||||||
inputs=action.tags
|
inputs=action.tags
|
||||||
wizardFields=wizardFields
|
|
||||||
options=(hash
|
options=(hash
|
||||||
hasOutput=true
|
hasOutput=true
|
||||||
tagSelection='output'
|
tagSelection='output'
|
||||||
wizardFieldSelection=true
|
wizardSelection=true
|
||||||
userFieldSelection='key,value'
|
userSelection='key,value'
|
||||||
)}}
|
)}}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -130,15 +127,16 @@
|
||||||
<label>{{i18n 'admin.wizard.action.custom_fields.label'}}</label>
|
<label>{{i18n 'admin.wizard.action.custom_fields.label'}}</label>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{{wizard-field-mapper
|
<div class="setting-value">
|
||||||
inputs=action.custom_fields
|
{{wizard-mapper
|
||||||
wizardFields=wizardFields
|
inputs=action.custom_fields
|
||||||
connectorKey='admin.wizard.action.custom_fields.connector'
|
keyPlaceholder='admin.wizard.action.custom_fields.key'
|
||||||
keyPlaceholder='admin.wizard.action.custom_fields.key'
|
options=(hash
|
||||||
options=(hash
|
pairConnector='set'
|
||||||
wizardFieldSelection='value'
|
wizardSelection='value'
|
||||||
userFieldSelection='value'
|
userSelection='value'
|
||||||
)}}
|
)}}
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
|
|
||||||
|
@ -149,14 +147,12 @@
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="setting-value">
|
<div class="setting-value">
|
||||||
{{wizard-field-mapper
|
{{wizard-mapper
|
||||||
inputs=action.required
|
inputs=action.required
|
||||||
wizardFields=wizardFields
|
|
||||||
options=(hash
|
options=(hash
|
||||||
textDisabled='key'
|
textSelection='value'
|
||||||
enableConnectors=true
|
wizardSelection=true
|
||||||
wizardFieldSelection=true
|
userSelection=true
|
||||||
userFieldSelection=true
|
|
||||||
groupSelection=true
|
groupSelection=true
|
||||||
)}}
|
)}}
|
||||||
</div>
|
</div>
|
||||||
|
@ -168,14 +164,13 @@
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="setting-value">
|
<div class="setting-value">
|
||||||
{{wizard-field-mapper
|
{{wizard-mapper
|
||||||
inputs=action.recipient
|
inputs=action.recipient
|
||||||
wizardFields=wizardFields
|
|
||||||
options=(hash
|
options=(hash
|
||||||
textDisabled='key'
|
|
||||||
hasOutput=true
|
hasOutput=true
|
||||||
wizardFieldSelection=true
|
textSelection='value,output'
|
||||||
userFieldSelection=true
|
wizardSelection=true
|
||||||
|
userSelection=true
|
||||||
groupSelection='key,value'
|
groupSelection='key,value'
|
||||||
)}}
|
)}}
|
||||||
</div>
|
</div>
|
||||||
|
@ -188,15 +183,14 @@
|
||||||
<label>{{i18n 'admin.wizard.action.update_profile.label'}}</label>
|
<label>{{i18n 'admin.wizard.action.update_profile.label'}}</label>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{{wizard-field-mapper
|
{{wizard-mapper
|
||||||
inputs=action.profile_updates
|
inputs=action.profile_updates
|
||||||
wizardFields=wizardFields
|
|
||||||
connectorKey='admin.wizard.action.update_profile.connector'
|
|
||||||
keyPlaceholder='admin.wizard.action.update_profile.key'
|
keyPlaceholder='admin.wizard.action.update_profile.key'
|
||||||
options=(hash
|
options=(hash
|
||||||
keyDefaultType='user'
|
pairConnector='set'
|
||||||
userFieldSelection='key'
|
userSelection='key'
|
||||||
wizardFieldSelection='value'
|
wizardSelection='value'
|
||||||
|
keyDefaultSelection='user'
|
||||||
)}}
|
)}}
|
||||||
</div>
|
</div>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
|
@ -259,17 +253,15 @@
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="setting-value">
|
<div class="setting-value">
|
||||||
{{wizard-field-mapper
|
{{wizard-mapper
|
||||||
inputs=action.group
|
inputs=action.group
|
||||||
wizardFields=wizardFields
|
|
||||||
outputConnectorKey='admin.wizard.action.add_to_group.output_connector'
|
|
||||||
options=(hash
|
options=(hash
|
||||||
hasOutput=true
|
hasOutput=true
|
||||||
enableConnectors=true
|
textSelection='value,output'
|
||||||
textDisabled='key'
|
wizardSelection='key,value,assignment'
|
||||||
wizardFieldSelection='key,value,assignment'
|
userSelection='key,value,assignment'
|
||||||
userFieldSelection='key,value,assignment'
|
|
||||||
groupSelection='value,output'
|
groupSelection='value,output'
|
||||||
|
outputDefaultSelection='group'
|
||||||
)}}
|
)}}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -103,9 +103,7 @@
|
||||||
<div class="wizard-header small">
|
<div class="wizard-header small">
|
||||||
{{i18n 'admin.wizard.field.choices_custom'}}
|
{{i18n 'admin.wizard.field.choices_custom'}}
|
||||||
</div>
|
</div>
|
||||||
{{wizard-field-mapper
|
{{wizard-mapper inputs=field.choices}}
|
||||||
inputs=field.choices
|
|
||||||
wizardFields=wizardFields}}
|
|
||||||
{{/if}}
|
{{/if}}
|
||||||
|
|
||||||
<div class="wizard-header small">
|
<div class="wizard-header small">
|
||||||
|
@ -164,10 +162,7 @@
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="setting-value">
|
<div class="setting-value">
|
||||||
{{wizard-field-mapper
|
{{wizard-mapper inputs=field.prefill options=prefillOptions}}
|
||||||
inputs=field.prefill
|
|
||||||
wizardFields=wizardFields
|
|
||||||
options=prefillOptions}}
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
|
@ -179,10 +174,7 @@
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="setting-value">
|
<div class="setting-value">
|
||||||
{{wizard-field-mapper
|
{{wizard-mapper inputs=field.content options=contentOptions}}
|
||||||
inputs=field.content
|
|
||||||
wizardFields=wizardFields
|
|
||||||
options=contentOptions}}
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
|
|
|
@ -1,46 +0,0 @@
|
||||||
<div class="key input-block">
|
|
||||||
{{wizard-custom-input-selector
|
|
||||||
selectorType='key'
|
|
||||||
inputType=inputType
|
|
||||||
wizardFields=wizardFields
|
|
||||||
value=pair.key
|
|
||||||
activeType=pair.key_type
|
|
||||||
customPlaceholder=keyPlaceholder
|
|
||||||
options=options}}
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{{#if hasConnector}}
|
|
||||||
<div class="connector">
|
|
||||||
{{#if options.enableConnectors}}
|
|
||||||
{{combo-box
|
|
||||||
value=pair.connector
|
|
||||||
content=connectors
|
|
||||||
onChange=(action (mut pair.connector))}}
|
|
||||||
{{/if}}
|
|
||||||
|
|
||||||
{{#if connectorKey}}
|
|
||||||
<span class="key-connector">
|
|
||||||
{{i18n connectorKey}}
|
|
||||||
</span>
|
|
||||||
{{/if}}
|
|
||||||
</div>
|
|
||||||
{{/if}}
|
|
||||||
|
|
||||||
<div class="value input-block">
|
|
||||||
{{wizard-custom-input-selector
|
|
||||||
selectorType='value'
|
|
||||||
inputType=inputType
|
|
||||||
wizardFields=wizardFields
|
|
||||||
value=pair.value
|
|
||||||
activeType=pair.value_type
|
|
||||||
customPlaceholder=valuePlaceholder
|
|
||||||
options=options}}
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{{#if showJoin}}
|
|
||||||
<span class="join-pair">&</span>
|
|
||||||
{{/if}}
|
|
||||||
|
|
||||||
{{#if showRemove}}
|
|
||||||
<a {{action removePair pair}} class="remove-pair">{{d-icon 'minus'}}</a>
|
|
||||||
{{/if}}
|
|
|
@ -51,14 +51,13 @@
|
||||||
<label>{{i18n 'admin.wizard.step.required_data.label'}}</label>
|
<label>{{i18n 'admin.wizard.step.required_data.label'}}</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="setting-value">
|
<div class="setting-value">
|
||||||
{{wizard-field-mapper
|
{{wizard-mapper
|
||||||
inputs=step.required_data
|
inputs=step.required_data
|
||||||
wizardFields=wizardFields
|
|
||||||
keyPlaceholder="admin.wizard.submission_key"
|
keyPlaceholder="admin.wizard.submission_key"
|
||||||
options=(hash
|
options=(hash
|
||||||
enableConnectors=true
|
pairConnector='equal'
|
||||||
wizardFieldSelection='value'
|
wizardSelection='value'
|
||||||
userFieldSelection='value'
|
userSelection='value'
|
||||||
)}}
|
)}}
|
||||||
{{#if step.required_data}}
|
{{#if step.required_data}}
|
||||||
<div class="required-data-message">
|
<div class="required-data-message">
|
||||||
|
@ -76,12 +75,13 @@
|
||||||
<label>{{i18n 'admin.wizard.step.permitted_params.label'}}</label>
|
<label>{{i18n 'admin.wizard.step.permitted_params.label'}}</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="setting-value">
|
<div class="setting-value">
|
||||||
{{wizard-field-mapper
|
{{wizard-mapper
|
||||||
inputs=step.permitted_params
|
inputs=step.permitted_params
|
||||||
wizardFields=wizardFields
|
|
||||||
keyPlaceholder='admin.wizard.param_key'
|
keyPlaceholder='admin.wizard.param_key'
|
||||||
valuePlaceholder='admin.wizard.submission_key'
|
valuePlaceholder='admin.wizard.submission_key'
|
||||||
connectorKey='admin.wizard.step.permitted_params.connector'}}
|
options=(hash
|
||||||
|
pairConnector='set'
|
||||||
|
)}}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
{{#if options.hasOutput}}
|
{{#if hasOutput}}
|
||||||
<div class="connector prefix">
|
<div class="mapper-connector mapper-block">
|
||||||
{{combo-box
|
{{combo-box
|
||||||
value=input.type
|
value=input.type
|
||||||
content=inputTypes
|
content=inputTypes
|
||||||
|
@ -8,20 +8,19 @@
|
||||||
{{/if}}
|
{{/if}}
|
||||||
|
|
||||||
{{#if hasPairs}}
|
{{#if hasPairs}}
|
||||||
<div class="input-pairs">
|
<div class="mapper-pairs mapper-block">
|
||||||
{{#each input.pairs as |pair|}}
|
{{#each input.pairs as |pair|}}
|
||||||
{{wizard-custom-input-pair
|
{{wizard-mapper-pair
|
||||||
pair=pair
|
pair=pair
|
||||||
last=pair.last
|
last=pair.last
|
||||||
inputType=inputType
|
inputType=inputType
|
||||||
keyPlaceholder=keyPlaceholder
|
keyPlaceholder=keyPlaceholder
|
||||||
valuePlaceholder=valuePlaceholder
|
valuePlaceholder=valuePlaceholder
|
||||||
connectorKey=connectorKey
|
|
||||||
wizardFields=wizardFields
|
|
||||||
options=options
|
options=options
|
||||||
removePair=(action 'removePair')}}
|
removePair=(action 'removePair')}}
|
||||||
{{/each}}
|
{{/each}}
|
||||||
{{#if options.hasOutput}}
|
|
||||||
|
{{#if hasOutput}}
|
||||||
<a {{action 'addPair'}} class="add-pair">
|
<a {{action 'addPair'}} class="add-pair">
|
||||||
{{d-icon 'plus'}}
|
{{d-icon 'plus'}}
|
||||||
</a>
|
</a>
|
||||||
|
@ -29,20 +28,20 @@
|
||||||
</div>
|
</div>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
|
|
||||||
{{#if options.hasOutput}}
|
{{#if hasOutput}}
|
||||||
{{#if hasOutputConnector}}
|
{{#if hasPairs}}
|
||||||
<div class="connector">
|
<div class="mapper-connector mapper-block">
|
||||||
<span class="output-connector">
|
{{combo-box
|
||||||
{{outputConnector}}
|
value=input.connector
|
||||||
</span>
|
content=connectors
|
||||||
|
onChange=(action (mut input.connector))}}
|
||||||
</div>
|
</div>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
|
|
||||||
<div class="output input-block">
|
<div class="output mapper-block">
|
||||||
{{wizard-custom-input-selector
|
{{wizard-mapper-selector
|
||||||
selectorType='output'
|
selectorType='output'
|
||||||
inputType=inputType
|
inputType=inputType
|
||||||
wizardFields=wizardFields
|
|
||||||
value=input.output
|
value=input.output
|
||||||
activeType=input.output_type
|
activeType=input.output_type
|
||||||
customPlaceholder=outputPlaceholder
|
customPlaceholder=outputPlaceholder
|
|
@ -0,0 +1,34 @@
|
||||||
|
<div class="key mapper-block">
|
||||||
|
{{wizard-mapper-selector
|
||||||
|
selectorType='key'
|
||||||
|
inputType=inputType
|
||||||
|
value=pair.key
|
||||||
|
activeType=pair.key_type
|
||||||
|
customPlaceholder=keyPlaceholder
|
||||||
|
options=options}}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="mapper-connector mapper-block">
|
||||||
|
{{combo-box
|
||||||
|
value=pair.connector
|
||||||
|
content=connectors
|
||||||
|
onChange=(action (mut pair.connector))}}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="value mapper-block">
|
||||||
|
{{wizard-mapper-selector
|
||||||
|
selectorType='value'
|
||||||
|
inputType=inputType
|
||||||
|
value=pair.value
|
||||||
|
activeType=pair.value_type
|
||||||
|
customPlaceholder=valuePlaceholder
|
||||||
|
options=options}}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{{#if showJoin}}
|
||||||
|
<span class="join-pair">&</span>
|
||||||
|
{{/if}}
|
||||||
|
|
||||||
|
{{#if showRemove}}
|
||||||
|
<a {{action removePair pair}} class="remove-pair">{{d-icon 'minus'}}</a>
|
||||||
|
{{/if}}
|
|
@ -1,10 +1,10 @@
|
||||||
<div class="type-selector">
|
<div class="type-selector">
|
||||||
{{#unless textDisabled}}
|
{{#if textEnabled}}
|
||||||
{{input-type-toggle
|
{{input-type-toggle
|
||||||
activeType=activeType
|
activeType=activeType
|
||||||
type='text'
|
type='text'
|
||||||
toggle=(action 'toggleType')}}
|
toggle=(action 'toggleType')}}
|
||||||
{{/unless}}
|
{{/if}}
|
||||||
|
|
||||||
{{#if wizardEnabled}}
|
{{#if wizardEnabled}}
|
||||||
{{input-type-toggle
|
{{input-type-toggle
|
|
@ -1,17 +1,14 @@
|
||||||
{{#each inputs as |input|}}
|
{{#each inputs as |input|}}
|
||||||
{{wizard-custom-input
|
{{wizard-mapper-input
|
||||||
input=input
|
input=input
|
||||||
wizardFields=wizardFields
|
|
||||||
keyPlaceholder=keyPlaceholder
|
keyPlaceholder=keyPlaceholder
|
||||||
valuePlaceholder=valuePlaceholder
|
valuePlaceholder=valuePlaceholder
|
||||||
connectorKey=connectorKey
|
options=inputOptions
|
||||||
outputConnectorKey=outputConnectorKey
|
|
||||||
options=options
|
|
||||||
remove=(action 'remove')}}
|
remove=(action 'remove')}}
|
||||||
{{/each}}
|
{{/each}}
|
||||||
|
|
||||||
{{#if canAdd}}
|
{{#if canAdd}}
|
||||||
<span class="add-custom-input">
|
<span class="add-mapper-input">
|
||||||
{{d-button action='add' label='admin.wizard.add' icon='plus'}}
|
{{d-button action='add' label='admin.wizard.add' icon='plus'}}
|
||||||
</span>
|
</span>
|
||||||
{{/if}}
|
{{/if}}
|
|
@ -1,3 +1,7 @@
|
||||||
|
@import 'wizard-mapper';
|
||||||
|
@import 'wizard-transfer';
|
||||||
|
@import 'wizard-api';
|
||||||
|
|
||||||
$setting-background: dark-light-diff($primary, $secondary, 96%, -65%);
|
$setting-background: dark-light-diff($primary, $secondary, 96%, -65%);
|
||||||
|
|
||||||
.wizard-list {
|
.wizard-list {
|
||||||
|
@ -32,8 +36,18 @@ $setting-background: dark-light-diff($primary, $secondary, 96%, -65%);
|
||||||
@extend .wizard-settings-group;
|
@extend .wizard-settings-group;
|
||||||
}
|
}
|
||||||
|
|
||||||
.wizard-basic-details {
|
.admin-wizard.settings .wizard-basic-details {
|
||||||
margin-bottom: 30px;
|
justify-content: initial;
|
||||||
|
|
||||||
|
.setting {
|
||||||
|
width: auto;
|
||||||
|
margin-right: 20px;
|
||||||
|
|
||||||
|
.setting-label {
|
||||||
|
width: initial;
|
||||||
|
min-width: initial;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.new-wizard {
|
.new-wizard {
|
||||||
|
@ -47,6 +61,10 @@ $setting-background: dark-light-diff($primary, $secondary, 96%, -65%);
|
||||||
font-size: 1.5em;
|
font-size: 1.5em;
|
||||||
min-height: 31px;
|
min-height: 31px;
|
||||||
margin-bottom: 30px;
|
margin-bottom: 30px;
|
||||||
|
|
||||||
|
input {
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
&.medium {
|
&.medium {
|
||||||
|
@ -70,6 +88,10 @@ $setting-background: dark-light-diff($primary, $secondary, 96%, -65%);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.admin-wizard-buttons {
|
||||||
|
margin-top: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
.content-list + .content {
|
.content-list + .content {
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
}
|
}
|
||||||
|
@ -84,14 +106,6 @@ $setting-background: dark-light-diff($primary, $secondary, 96%, -65%);
|
||||||
width: 48%;
|
width: 48%;
|
||||||
margin-bottom: 30px;
|
margin-bottom: 30px;
|
||||||
padding-bottom: 0;
|
padding-bottom: 0;
|
||||||
|
|
||||||
&:last-of-type {
|
|
||||||
margin-bottom: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
&.field-mapper-setting {
|
|
||||||
margin-top: 5px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.setting-label {
|
.setting-label {
|
||||||
width: 80px;
|
width: 80px;
|
||||||
|
@ -120,6 +134,7 @@ $setting-background: dark-light-diff($primary, $secondary, 96%, -65%);
|
||||||
input[type="text"], textarea {
|
input[type="text"], textarea {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
|
margin-bottom: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
input[disabled] {
|
input[disabled] {
|
||||||
|
@ -131,9 +146,14 @@ $setting-background: dark-light-diff($primary, $secondary, 96%, -65%);
|
||||||
width: 70px;
|
width: 70px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
input.medium {
|
||||||
|
width: 200px;
|
||||||
|
}
|
||||||
|
|
||||||
.uploaded-image-preview {
|
.uploaded-image-preview {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
max-height: 100px;
|
max-height: 100px;
|
||||||
|
margin-bottom: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.image-upload-controls {
|
.image-upload-controls {
|
||||||
|
@ -152,10 +172,6 @@ $setting-background: dark-light-diff($primary, $secondary, 96%, -65%);
|
||||||
float: left;
|
float: left;
|
||||||
margin: 5px 7px 0 0;
|
margin: 5px 7px 0 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
span {
|
|
||||||
overflow: hidden;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
&.full, &.full-inline {
|
&.full, &.full-inline {
|
||||||
|
@ -201,6 +217,10 @@ $setting-background: dark-light-diff($primary, $secondary, 96%, -65%);
|
||||||
margin-top: 5px;
|
margin-top: 5px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.wizard-custom-action > [class~='setting']:last-of-type {
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
|
|
||||||
.select-box-kit-header {
|
.select-box-kit-header {
|
||||||
height: initial;
|
height: initial;
|
||||||
|
@ -224,20 +244,6 @@ $setting-background: dark-light-diff($primary, $secondary, 96%, -65%);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.field-mapper {
|
|
||||||
width: 100%;
|
|
||||||
|
|
||||||
.multi-select {
|
|
||||||
.multi-select-header, input {
|
|
||||||
min-height: 25px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.choices .choice {
|
|
||||||
height: 24px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.btn-after-time {
|
.btn-after-time {
|
||||||
margin-top: 7px;
|
margin-top: 7px;
|
||||||
}
|
}
|
||||||
|
@ -301,7 +307,7 @@ $setting-background: dark-light-diff($primary, $secondary, 96%, -65%);
|
||||||
}
|
}
|
||||||
|
|
||||||
.wizard-links {
|
.wizard-links {
|
||||||
margin-bottom: 20px;
|
margin: 20px 0;
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
|
|
||||||
|
@ -344,124 +350,6 @@ $setting-background: dark-light-diff($primary, $secondary, 96%, -65%);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
[class~='custom-input'] {
|
|
||||||
display: inline-flex;
|
|
||||||
align-items: flex-start;
|
|
||||||
position: relative;
|
|
||||||
padding-bottom: 30px;
|
|
||||||
|
|
||||||
&:last-of-type {
|
|
||||||
padding-bottom: 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.input-selector {
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.type-selector {
|
|
||||||
position: absolute;
|
|
||||||
top: -22px;
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.type-selector a {
|
|
||||||
color: $primary;
|
|
||||||
margin-right: 4px;
|
|
||||||
|
|
||||||
&.active {
|
|
||||||
color: $tertiary;
|
|
||||||
text-decoration: underline;
|
|
||||||
}
|
|
||||||
|
|
||||||
&:last-of-type {
|
|
||||||
margin-right: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.input-pairs {
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
align-items: center;
|
|
||||||
position: relative;
|
|
||||||
|
|
||||||
.add-pair {
|
|
||||||
margin-top: 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.remove-pair {
|
|
||||||
position: absolute;
|
|
||||||
top: 25px;
|
|
||||||
right: -25px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.join-pair {
|
|
||||||
position: absolute;
|
|
||||||
bottom: -25px;
|
|
||||||
left: 50%;
|
|
||||||
transform: translateX(-50%);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.input-pair {
|
|
||||||
display: flex;
|
|
||||||
align-items: flex-end;
|
|
||||||
position: relative;
|
|
||||||
|
|
||||||
&:not(:first-of-type) {
|
|
||||||
margin-top: 20px;
|
|
||||||
}
|
|
||||||
|
|
||||||
&.no-connector div.input-block:not(:last-of-type) {
|
|
||||||
margin-right: 10px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.d-icon {
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
input {
|
|
||||||
margin: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
input[disabled] {
|
|
||||||
background-color: $primary-low;
|
|
||||||
border-color: #ddd;
|
|
||||||
}
|
|
||||||
|
|
||||||
.input-block, .select-kit, input {
|
|
||||||
width: 160px;
|
|
||||||
min-width: 160px;
|
|
||||||
}
|
|
||||||
|
|
||||||
a.remove-input {
|
|
||||||
position: absolute;
|
|
||||||
right: -25px;
|
|
||||||
top: 5px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.connector {
|
|
||||||
margin: 0 10px;
|
|
||||||
|
|
||||||
&.prefix {
|
|
||||||
margin-left: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.select-kit {
|
|
||||||
min-width: 50px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.key-connector {
|
|
||||||
padding-bottom: 5px;
|
|
||||||
display: inline-block;
|
|
||||||
}
|
|
||||||
|
|
||||||
.output-connector {
|
|
||||||
white-space: nowrap;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.required-data-message {
|
.required-data-message {
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
margin-top: 20px;
|
margin-top: 20px;
|
||||||
|
@ -469,6 +357,10 @@ $setting-background: dark-light-diff($primary, $secondary, 96%, -65%);
|
||||||
.label {
|
.label {
|
||||||
margin-bottom: 5px;
|
margin-bottom: 5px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
input {
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.admin-contents .wizard-submissions {
|
.admin-contents .wizard-submissions {
|
||||||
|
@ -574,186 +466,7 @@ $setting-background: dark-light-diff($primary, $secondary, 96%, -65%);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
.wizard-step-contents {
|
.wizard-step-contents {
|
||||||
height: unset !important;
|
height: unset !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
.admin-wizards-api {
|
|
||||||
margin-bottom: 40px;
|
|
||||||
|
|
||||||
.content-list {
|
|
||||||
margin-right: 20px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.new-api {
|
|
||||||
margin-top: 20px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.metadata .title input {
|
|
||||||
width: 400px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.buttons {
|
|
||||||
text-align: right;
|
|
||||||
vertical-align: middle;
|
|
||||||
|
|
||||||
> .d-icon, > .spinner {
|
|
||||||
margin-right: 7px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.error {
|
|
||||||
margin-top: 10px;
|
|
||||||
color: $danger;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.wizard-api-header {
|
|
||||||
&.page {
|
|
||||||
margin-bottom: 20px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.buttons {
|
|
||||||
float: right;
|
|
||||||
}
|
|
||||||
|
|
||||||
.wizard-header {
|
|
||||||
overflow: hidden;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.wizard-api-authentication {
|
|
||||||
display: flex;
|
|
||||||
background-color: $primary-very-low;
|
|
||||||
padding: 20px;
|
|
||||||
margin-bottom: 20px;
|
|
||||||
|
|
||||||
.settings {
|
|
||||||
width: 50%;
|
|
||||||
max-width: 50%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.redirect-uri .controls {
|
|
||||||
word-break: break-all;
|
|
||||||
}
|
|
||||||
|
|
||||||
.auth-type .select-kit {
|
|
||||||
min-width: 210px;
|
|
||||||
width: 210px;
|
|
||||||
margin-bottom: 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.status {
|
|
||||||
border-left: 1px solid $primary;
|
|
||||||
margin-left: 20px;
|
|
||||||
padding-left: 20px;
|
|
||||||
width: 50%;
|
|
||||||
max-width: 50%;
|
|
||||||
|
|
||||||
.wizard-header {
|
|
||||||
overflow: hidden;
|
|
||||||
}
|
|
||||||
|
|
||||||
.authorization {
|
|
||||||
float: right;
|
|
||||||
}
|
|
||||||
|
|
||||||
.control-group {
|
|
||||||
margin-bottom: 15px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.wizard-api-endpoints {
|
|
||||||
background-color: $primary-very-low;
|
|
||||||
padding: 20px;
|
|
||||||
margin-bottom: 20px;
|
|
||||||
|
|
||||||
.endpoint-list {
|
|
||||||
margin-top: 20px;
|
|
||||||
|
|
||||||
ul {
|
|
||||||
margin: 0;
|
|
||||||
list-style: none;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.endpoint {
|
|
||||||
margin-top: 20px;
|
|
||||||
|
|
||||||
.top, .bottom {
|
|
||||||
display: flex;
|
|
||||||
}
|
|
||||||
|
|
||||||
.top {
|
|
||||||
margin-bottom: 15px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.combo-box {
|
|
||||||
margin-right: 10px;
|
|
||||||
width: 210px;
|
|
||||||
}
|
|
||||||
|
|
||||||
input {
|
|
||||||
margin: 0;
|
|
||||||
margin-right: 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.endpoint-url {
|
|
||||||
flex: 1 1 auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
.remove-endpoint {
|
|
||||||
margin-left: auto;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.wizard-api-log {
|
|
||||||
background-color: #f8f8f8;
|
|
||||||
padding: 20px;
|
|
||||||
margin-bottom: 20px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.wizard-step-contents{
|
|
||||||
height: unset !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Tansfer tab
|
|
||||||
|
|
||||||
.admin-wizards-transfer .admin-container .container {
|
|
||||||
padding-top: 20px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#file-url {
|
|
||||||
display: block;
|
|
||||||
margin-bottom: 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.wizard-list-select {
|
|
||||||
list-style-type: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.wizard-action-buttons {
|
|
||||||
flex-direction: column;
|
|
||||||
}
|
|
||||||
|
|
||||||
.import-message {
|
|
||||||
margin: 10px 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.import-logs {
|
|
||||||
margin-top: 20px;
|
|
||||||
|
|
||||||
.title {
|
|
||||||
font-weight: 800;
|
|
||||||
margin-bottom: 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
ul {
|
|
||||||
list-style: none;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
140
assets/stylesheets/common/wizard-api.scss
Normale Datei
140
assets/stylesheets/common/wizard-api.scss
Normale Datei
|
@ -0,0 +1,140 @@
|
||||||
|
.admin-wizards-api {
|
||||||
|
margin-bottom: 40px;
|
||||||
|
|
||||||
|
.content-list {
|
||||||
|
margin-right: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.new-api {
|
||||||
|
margin-top: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.metadata .title input {
|
||||||
|
width: 400px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.buttons {
|
||||||
|
text-align: right;
|
||||||
|
vertical-align: middle;
|
||||||
|
|
||||||
|
> .d-icon, > .spinner {
|
||||||
|
margin-right: 7px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.error {
|
||||||
|
margin-top: 10px;
|
||||||
|
color: $danger;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.wizard-api-header {
|
||||||
|
&.page {
|
||||||
|
margin-bottom: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.buttons {
|
||||||
|
float: right;
|
||||||
|
}
|
||||||
|
|
||||||
|
.wizard-header {
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.wizard-api-authentication {
|
||||||
|
display: flex;
|
||||||
|
background-color: $primary-very-low;
|
||||||
|
padding: 20px;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
|
||||||
|
.settings {
|
||||||
|
width: 50%;
|
||||||
|
max-width: 50%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.redirect-uri .controls {
|
||||||
|
word-break: break-all;
|
||||||
|
}
|
||||||
|
|
||||||
|
.auth-type .select-kit {
|
||||||
|
min-width: 210px;
|
||||||
|
width: 210px;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.status {
|
||||||
|
border-left: 1px solid $primary;
|
||||||
|
margin-left: 20px;
|
||||||
|
padding-left: 20px;
|
||||||
|
width: 50%;
|
||||||
|
max-width: 50%;
|
||||||
|
|
||||||
|
.wizard-header {
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
.authorization {
|
||||||
|
float: right;
|
||||||
|
}
|
||||||
|
|
||||||
|
.control-group {
|
||||||
|
margin-bottom: 15px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.wizard-api-endpoints {
|
||||||
|
background-color: $primary-very-low;
|
||||||
|
padding: 20px;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
|
||||||
|
.endpoint-list {
|
||||||
|
margin-top: 20px;
|
||||||
|
|
||||||
|
ul {
|
||||||
|
margin: 0;
|
||||||
|
list-style: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.endpoint {
|
||||||
|
margin-top: 20px;
|
||||||
|
|
||||||
|
.top, .bottom {
|
||||||
|
display: flex;
|
||||||
|
}
|
||||||
|
|
||||||
|
.top {
|
||||||
|
margin-bottom: 15px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.combo-box {
|
||||||
|
margin-right: 10px;
|
||||||
|
width: 210px;
|
||||||
|
}
|
||||||
|
|
||||||
|
input {
|
||||||
|
margin: 0;
|
||||||
|
margin-right: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.endpoint-url {
|
||||||
|
flex: 1 1 auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.remove-endpoint {
|
||||||
|
margin-left: auto;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.wizard-api-log {
|
||||||
|
background-color: #f8f8f8;
|
||||||
|
padding: 20px;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.wizard-step-contents{
|
||||||
|
height: unset !important;
|
||||||
|
}
|
143
assets/stylesheets/common/wizard-mapper.scss
Normale Datei
143
assets/stylesheets/common/wizard-mapper.scss
Normale Datei
|
@ -0,0 +1,143 @@
|
||||||
|
.wizard-mapper {
|
||||||
|
width: 100%;
|
||||||
|
|
||||||
|
.select-kit {
|
||||||
|
min-width: initial;
|
||||||
|
width: initial;
|
||||||
|
|
||||||
|
.select-kit-header {
|
||||||
|
min-height: 30px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.choices .choice {
|
||||||
|
height: 24px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
div.mapper-block:not(:last-of-type) {
|
||||||
|
margin-right: 10px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[class~='mapper-input'] {
|
||||||
|
display: flex;
|
||||||
|
align-items: flex-start;
|
||||||
|
width: min-content;
|
||||||
|
position: relative;
|
||||||
|
padding-bottom: 30px;
|
||||||
|
|
||||||
|
&:last-of-type {
|
||||||
|
padding-bottom: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.d-icon {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
input {
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
input[disabled] {
|
||||||
|
background-color: $primary-low;
|
||||||
|
border-color: #ddd;
|
||||||
|
}
|
||||||
|
|
||||||
|
a.remove-input {
|
||||||
|
position: absolute;
|
||||||
|
right: -25px;
|
||||||
|
top: 5px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.add-mapper-input {
|
||||||
|
display: block;
|
||||||
|
|
||||||
|
.btn {
|
||||||
|
background-color: $secondary;
|
||||||
|
border: 1px solid $primary-medium;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.mapper-input + .add-mapper-input {
|
||||||
|
padding-top: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.mapper-connector {
|
||||||
|
width: auto;
|
||||||
|
min-width: 40px;
|
||||||
|
|
||||||
|
.select-kit .select-kit-header {
|
||||||
|
padding: 0 0.5em;
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
|
||||||
|
.caret-icon {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.mapper-selector {
|
||||||
|
width: 100%;
|
||||||
|
max-width: 160px;
|
||||||
|
min-width: 160px;
|
||||||
|
|
||||||
|
input, .select-kit {
|
||||||
|
width: 160px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.type-selector {
|
||||||
|
position: absolute;
|
||||||
|
top: -22px;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.type-selector a {
|
||||||
|
color: $primary;
|
||||||
|
margin-right: 4px;
|
||||||
|
|
||||||
|
&.active {
|
||||||
|
color: $tertiary;
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:last-of-type {
|
||||||
|
margin-right: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.mapper-pairs {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: center;
|
||||||
|
position: relative;
|
||||||
|
|
||||||
|
.add-pair {
|
||||||
|
margin-top: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.remove-pair {
|
||||||
|
position: absolute;
|
||||||
|
top: 5px;
|
||||||
|
right: -25px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.join-pair {
|
||||||
|
position: absolute;
|
||||||
|
bottom: -25px;
|
||||||
|
left: 50%;
|
||||||
|
transform: translateX(-50%);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.mapper-pair {
|
||||||
|
display: flex;
|
||||||
|
align-items: flex-end;
|
||||||
|
position: relative;
|
||||||
|
|
||||||
|
&:not(:first-of-type) {
|
||||||
|
margin-top: 30px;
|
||||||
|
}
|
||||||
|
}
|
33
assets/stylesheets/common/wizard-transfer.scss
Normale Datei
33
assets/stylesheets/common/wizard-transfer.scss
Normale Datei
|
@ -0,0 +1,33 @@
|
||||||
|
.admin-wizards-transfer .admin-container .container {
|
||||||
|
padding-top: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#file-url {
|
||||||
|
display: block;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.wizard-list-select {
|
||||||
|
list-style-type: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.wizard-action-buttons {
|
||||||
|
flex-direction: column;
|
||||||
|
}
|
||||||
|
|
||||||
|
.import-message {
|
||||||
|
margin: 10px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.import-logs {
|
||||||
|
margin-top: 20px;
|
||||||
|
|
||||||
|
.title {
|
||||||
|
font-weight: 800;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
ul {
|
||||||
|
list-style: none;
|
||||||
|
}
|
||||||
|
}
|
|
@ -12,9 +12,9 @@ en:
|
||||||
custom_label: "Custom"
|
custom_label: "Custom"
|
||||||
submissions_label: "Submissions"
|
submissions_label: "Submissions"
|
||||||
name: "Name"
|
name: "Name"
|
||||||
name_placeholder: "name of the wizard"
|
name_placeholder: "name"
|
||||||
background: "Background"
|
background: "Background"
|
||||||
background_placeholder: "background: css"
|
background_placeholder: "#hex"
|
||||||
save_submissions: "Save"
|
save_submissions: "Save"
|
||||||
save_submissions_label: "Save wizard submissions."
|
save_submissions_label: "Save wizard submissions."
|
||||||
multiple_submissions: "Multiple"
|
multiple_submissions: "Multiple"
|
||||||
|
@ -22,7 +22,7 @@ en:
|
||||||
after_signup: "Signup"
|
after_signup: "Signup"
|
||||||
after_signup_label: "Users directed to wizard after signup."
|
after_signup_label: "Users directed to wizard after signup."
|
||||||
after_time: "Time"
|
after_time: "Time"
|
||||||
after_time_label: "Users directed to wizard after start time."
|
after_time_label: "Users directed to wizard after start time:"
|
||||||
after_time_time_label: "Start Time"
|
after_time_time_label: "Start Time"
|
||||||
after_time_modal:
|
after_time_modal:
|
||||||
title: "Wizard Start Time"
|
title: "Wizard Start Time"
|
||||||
|
@ -69,10 +69,10 @@ en:
|
||||||
|
|
||||||
input:
|
input:
|
||||||
conditional:
|
conditional:
|
||||||
prefix: 'if'
|
name: 'if'
|
||||||
output: 'then'
|
output: 'then'
|
||||||
assignment:
|
assignment:
|
||||||
prefix: 'set'
|
name: 'set'
|
||||||
|
|
||||||
error:
|
error:
|
||||||
name_required: "Wizards must have a name."
|
name_required: "Wizards must have a name."
|
||||||
|
@ -96,7 +96,6 @@ en:
|
||||||
not_permitted_message: "Message shown when required data not present"
|
not_permitted_message: "Message shown when required data not present"
|
||||||
permitted_params:
|
permitted_params:
|
||||||
label: "Params"
|
label: "Params"
|
||||||
connector: "save as"
|
|
||||||
|
|
||||||
field:
|
field:
|
||||||
type: "Choose a type"
|
type: "Choose a type"
|
||||||
|
@ -126,6 +125,15 @@ en:
|
||||||
prefill: "Prefill"
|
prefill: "Prefill"
|
||||||
content: "Content"
|
content: "Content"
|
||||||
|
|
||||||
|
connector:
|
||||||
|
then: "then"
|
||||||
|
set: "set"
|
||||||
|
equal: '='
|
||||||
|
greater: '>'
|
||||||
|
less: '<'
|
||||||
|
greater_or_equal: '>='
|
||||||
|
less_or_equal: '<='
|
||||||
|
|
||||||
action:
|
action:
|
||||||
header: "Actions"
|
header: "Actions"
|
||||||
include: "Include Fields"
|
include: "Include Fields"
|
||||||
|
@ -135,9 +143,8 @@ en:
|
||||||
interpolate_fields: "Insert wizard fields using the field_id in w{}. Insert user fields using field key in u{}."
|
interpolate_fields: "Insert wizard fields using the field_id in w{}. Insert user fields using field key in u{}."
|
||||||
|
|
||||||
custom_fields:
|
custom_fields:
|
||||||
label: "Custom Fields"
|
label: "Custom"
|
||||||
key: "field"
|
key: "field"
|
||||||
connector: "set"
|
|
||||||
skip_redirect:
|
skip_redirect:
|
||||||
label: "Redirect"
|
label: "Redirect"
|
||||||
description: "Don't redirect the user to this {{type}} after the wizard completes"
|
description: "Don't redirect the user to this {{type}} after the wizard completes"
|
||||||
|
@ -149,9 +156,8 @@ en:
|
||||||
category: "Category"
|
category: "Category"
|
||||||
tags: "Tags"
|
tags: "Tags"
|
||||||
update_profile:
|
update_profile:
|
||||||
label: "Update Profile"
|
label: "Fields"
|
||||||
key: "field"
|
key: "field"
|
||||||
connector: "set"
|
|
||||||
post_builder:
|
post_builder:
|
||||||
checkbox: "Post Builder"
|
checkbox: "Post Builder"
|
||||||
label: "Builder"
|
label: "Builder"
|
||||||
|
@ -160,7 +166,6 @@ en:
|
||||||
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 fields using field key in u{}."
|
||||||
add_to_group:
|
add_to_group:
|
||||||
label: "Add to Group"
|
label: "Add to Group"
|
||||||
output_connector: "add to"
|
|
||||||
route_to:
|
route_to:
|
||||||
label: "Route To"
|
label: "Route To"
|
||||||
url: "Url"
|
url: "Url"
|
||||||
|
|
|
@ -3,7 +3,13 @@ class CustomWizard::Mapper
|
||||||
|
|
||||||
USER_FIELDS = ['name', 'username', 'email', 'date_of_birth', 'title', 'locale', 'trust_level']
|
USER_FIELDS = ['name', 'username', 'email', 'date_of_birth', 'title', 'locale', 'trust_level']
|
||||||
PROFILE_FIELDS = ['location', 'website', 'bio_raw']
|
PROFILE_FIELDS = ['location', 'website', 'bio_raw']
|
||||||
OPERATORS = { 'eq': '==', 'gt': '>', 'lt': '<', 'gte': '>=', 'lte': '<=' }
|
OPERATORS = {
|
||||||
|
equal: '=',
|
||||||
|
greater: '>',
|
||||||
|
less: '<',
|
||||||
|
greater_or_equal: '>=',
|
||||||
|
less_or_equal: '<='
|
||||||
|
}
|
||||||
|
|
||||||
def initialize(params)
|
def initialize(params)
|
||||||
@inputs = params[:inputs] || {}
|
@inputs = params[:inputs] || {}
|
||||||
|
@ -47,14 +53,19 @@ class CustomWizard::Mapper
|
||||||
pairs.each do |pair|
|
pairs.each do |pair|
|
||||||
key = map_field(pair['key'], pair['key_type'])
|
key = map_field(pair['key'], pair['key_type'])
|
||||||
value = map_field(pair['value'], pair['value_type'])
|
value = map_field(pair['value'], pair['value_type'])
|
||||||
failed = true unless key.public_send(operator(pair['connector']), value)
|
|
||||||
|
begin
|
||||||
|
failed = true unless key.public_send(operator(pair['connector']), value)
|
||||||
|
rescue => e
|
||||||
|
byebug
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
!failed
|
!failed
|
||||||
end
|
end
|
||||||
|
|
||||||
def operator(connector)
|
def operator(connector)
|
||||||
OPERATORS[connector] || '=='
|
OPERATORS[connector.to_sym] || '=='
|
||||||
end
|
end
|
||||||
|
|
||||||
def map_field(value, type)
|
def map_field(value, type)
|
||||||
|
|
|
@ -4,7 +4,8 @@
|
||||||
# authors: Angus McLeod
|
# authors: Angus McLeod
|
||||||
# url: https://github.com/angusmcleod/discourse-custom-wizard
|
# url: https://github.com/angusmcleod/discourse-custom-wizard
|
||||||
|
|
||||||
register_asset 'stylesheets/wizard_custom_admin.scss'
|
register_asset 'stylesheets/common/wizard-admin.scss'
|
||||||
|
register_asset 'stylesheets/common/wizard-mapper.scss'
|
||||||
register_asset 'lib/jquery.timepicker.min.js'
|
register_asset 'lib/jquery.timepicker.min.js'
|
||||||
register_asset 'lib/jquery.timepicker.scss'
|
register_asset 'lib/jquery.timepicker.scss'
|
||||||
|
|
||||||
|
|
Laden …
In neuem Issue referenzieren