0
0
Fork 1
Spiegel von https://github.com/paviliondev/discourse-custom-wizard.git synchronisiert 2024-11-10 12:22:54 +01:00
discourse-custom-wizard/assets/javascripts/discourse/lib/wizard-json.js.es6

180 Zeilen
4 KiB
Text

import { listProperties, camelCase, snakeCase } from '../lib/wizard';
import wizardSchema from '../lib/wizard-schema';
2020-04-01 14:16:26 +02:00
import EmberObject from '@ember/object';
2020-04-05 03:37:09 +02:00
import { A } from "@ember/array";
2020-04-01 12:58:30 +02:00
function present(val) {
2020-04-01 14:16:26 +02:00
if (val === null || val === undefined) {
return false;
} else if (typeof val === 'object') {
return Object.keys(val).length !== 0;
} else if (typeof val === 'string' || val.constructor === Array) {
return val && val.length;
} else {
return false;
}
2020-04-01 12:58:30 +02:00
}
function mapped(property, type) {
return wizardSchema[type].mapped.indexOf(property) > -1;
2020-04-01 12:58:30 +02:00
}
2020-04-06 10:36:38 +02:00
function castCase(property, value) {
2020-04-02 10:21:03 +02:00
return property.indexOf('_type') > -1 ? camelCase(value) : value;
}
2020-04-15 07:41:27 +02:00
function buildProperty(json, property, type) {
let value = json[property];
if (mapped(property, type) &&
present(value) &&
value.constructor === Array) {
2020-04-06 10:36:38 +02:00
2020-04-15 07:41:27 +02:00
let inputs = [];
value.forEach(inputJson => {
2020-04-06 10:36:38 +02:00
let input = {}
2020-04-01 12:58:30 +02:00
2020-04-06 10:36:38 +02:00
Object.keys(inputJson).forEach(inputKey => {
if (inputKey === 'pairs') {
let pairs = [];
let pairCount = inputJson.pairs.length;
inputJson.pairs.forEach(pairJson => {
let pair = {};
2020-04-02 07:21:57 +02:00
2020-04-06 10:36:38 +02:00
Object.keys(pairJson).forEach(pairKey => {
pair[pairKey] = castCase(pairKey, pairJson[pairKey]);
2020-04-02 07:21:57 +02:00
});
2020-04-06 10:36:38 +02:00
pair.pairCount = pairCount;
pairs.push(
EmberObject.create(pair)
);
});
input.pairs = pairs;
} else {
input[inputKey] = castCase(inputKey, inputJson[inputKey]);
}
2020-04-02 07:21:57 +02:00
});
2020-04-01 12:58:30 +02:00
2020-04-06 10:36:38 +02:00
inputs.push(
EmberObject.create(input)
);
});
return A(inputs);
} else {
2020-04-15 07:41:27 +02:00
return value;
2020-04-06 10:36:38 +02:00
}
}
function buildObject(json, type) {
2020-04-10 09:57:49 +02:00
let props = {
2020-04-06 10:36:38 +02:00
isNew: false
}
Object.keys(json).forEach(prop => {
2020-04-10 09:57:49 +02:00
props[prop] = buildProperty(json, prop, type)
2020-04-01 12:58:30 +02:00
});
2020-04-20 11:41:13 +02:00
2020-04-10 09:57:49 +02:00
return EmberObject.create(props);
2020-04-01 12:58:30 +02:00
}
2020-04-10 09:57:49 +02:00
function buildObjectArray(json, type) {
let array = A();
if (present(json)) {
json.forEach((objJson) => {
let object = buildObject(objJson, type);
if (hasAdvancedProperties(object, type)) {
object.set('showAdvanced', true);
}
array.pushObject(object);
});
}
return array;
2020-04-02 07:21:57 +02:00
}
2020-04-10 09:57:49 +02:00
function buildBasicProperties(json, type, props) {
listProperties(type).forEach((p) => {
props[p] = buildProperty(json, p, type);
if (hasAdvancedProperties(json, type)) {
2020-04-15 10:58:10 +02:00
props.showAdvanced = true;
2020-04-10 09:57:49 +02:00
}
});
return props;
2020-04-02 07:21:57 +02:00
}
2020-04-10 09:57:49 +02:00
function hasAdvancedProperties(object, type) {
return Object.keys(object).some(p => {
return wizardSchema[type].advanced.indexOf(p) > -1 && present(object[p]);
2020-04-02 11:29:22 +02:00
});
2020-04-02 07:21:57 +02:00
}
2020-04-10 09:57:49 +02:00
/// to be removed: necessary due to action array being moved from step to wizard
2020-04-08 09:59:54 +02:00
function actionPatch(json) {
let actions = json.actions || [];
json.steps.forEach(step => {
if (step.actions && step.actions.length) {
step.actions.forEach(action => {
action.run_after = 'wizard_completion';
actions.push(action);
});
}
});
json.actions = actions;
return json;
}
///
2020-04-01 14:16:26 +02:00
function buildProperties(json) {
2020-04-01 12:58:30 +02:00
let props = {
2020-04-11 08:22:12 +02:00
steps: A(),
actions: A()
2020-04-01 12:58:30 +02:00
};
2020-04-14 07:46:06 +02:00
2020-04-01 12:58:30 +02:00
if (present(json)) {
props.existingId = true;
2020-04-10 09:57:49 +02:00
props = buildBasicProperties(json, 'wizard', props);
2020-04-08 09:59:54 +02:00
2020-04-01 12:58:30 +02:00
if (present(json.steps)) {
2020-04-01 14:16:26 +02:00
json.steps.forEach((stepJson) => {
2020-04-10 09:57:49 +02:00
let stepProps = {
2020-04-01 14:16:26 +02:00
isNew: false
};
2020-04-08 09:59:54 +02:00
2020-04-10 09:57:49 +02:00
stepProps = buildBasicProperties(stepJson, 'step', stepProps);
stepProps.fields = buildObjectArray(stepJson.fields, 'field');
2020-04-08 04:52:07 +02:00
2020-04-10 09:57:49 +02:00
props.steps.pushObject(EmberObject.create(stepProps));
2020-04-08 04:52:07 +02:00
});
2020-04-10 09:57:49 +02:00
};
json = actionPatch(json); // to be removed - see above
2020-04-20 11:41:13 +02:00
2020-04-10 09:57:49 +02:00
props.actions = buildObjectArray(json.actions, 'action');
2020-04-01 12:58:30 +02:00
} else {
2020-04-10 09:57:49 +02:00
listProperties('wizard').forEach(prop => {
props[prop] = wizardSchema.wizard.basic[prop];
2020-04-10 09:57:49 +02:00
});
2020-04-01 12:58:30 +02:00
}
2020-04-08 09:59:54 +02:00
2020-04-01 12:58:30 +02:00
return props;
2020-04-01 14:16:26 +02:00
}
export {
2020-04-08 09:59:54 +02:00
buildProperties,
present,
mapped
2020-04-01 12:58:30 +02:00
}