import { listProperties, camelCase, snakeCase } from '../lib/wizard'; import wizardSchema from '../lib/wizard-schema'; import EmberObject from '@ember/object'; import { A } from "@ember/array"; function present(val) { 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; } } function mapped(property, type) { return wizardSchema[type].mapped.indexOf(property) > -1; } function castCase(property, value) { return property.indexOf('_type') > -1 ? camelCase(value) : value; } function buildProperty(json, property, type) { let value = json[property]; if (mapped(property, type) && present(value) && value.constructor === Array) { let inputs = []; value.forEach(inputJson => { let input = {} Object.keys(inputJson).forEach(inputKey => { if (inputKey === 'pairs') { let pairs = []; let pairCount = inputJson.pairs.length; inputJson.pairs.forEach(pairJson => { let pair = {}; Object.keys(pairJson).forEach(pairKey => { pair[pairKey] = castCase(pairKey, pairJson[pairKey]); }); pair.pairCount = pairCount; pairs.push( EmberObject.create(pair) ); }); input.pairs = pairs; } else { input[inputKey] = castCase(inputKey, inputJson[inputKey]); } }); inputs.push( EmberObject.create(input) ); }); return A(inputs); } else { return value; } } function buildObject(json, type) { let props = { isNew: false } Object.keys(json).forEach(prop => { props[prop] = buildProperty(json, prop, type) }); return EmberObject.create(props); } 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; } function buildBasicProperties(json, type, props) { listProperties(type).forEach((p) => { props[p] = buildProperty(json, p, type); if (hasAdvancedProperties(json, type)) { props.showAdvanced = true; } }); return props; } function hasAdvancedProperties(object, type) { return Object.keys(object).some(p => { return wizardSchema[type].advanced.indexOf(p) > -1 && present(object[p]); }); } /// to be removed: necessary due to action array being moved from step to wizard 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; } /// function buildProperties(json) { let props = { steps: A(), actions: A() }; if (present(json)) { props.existingId = true; props = buildBasicProperties(json, 'wizard', props); if (present(json.steps)) { json.steps.forEach((stepJson) => { let stepProps = { isNew: false }; stepProps = buildBasicProperties(stepJson, 'step', stepProps); stepProps.fields = buildObjectArray(stepJson.fields, 'field'); props.steps.pushObject(EmberObject.create(stepProps)); }); }; json = actionPatch(json); // to be removed - see above props.actions = buildObjectArray(json.actions, 'action'); } else { listProperties('wizard').forEach(prop => { props[prop] = wizardSchema.wizard.basic[prop]; }); } return props; } export { buildProperties, present, mapped }