UNPKG

@kineticdata/react

Version:
196 lines (191 loc) 7.38 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault")["default"]; Object.defineProperty(exports, "__esModule", { value: true }); exports.SubmissionForm = void 0; var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/slicedToArray")); var _immutable = require("immutable"); var _apis = require("../../../apis"); var _Form = require("../../form/Form"); var _moment = _interopRequireDefault(require("moment")); var _lodashEs = require("lodash-es"); var dataSources = function dataSources(_ref) { var kappSlug = _ref.kappSlug, formSlug = _ref.formSlug, submissionId = _ref.submissionId; return { submission: { fn: _apis.fetchSubmission, params: submissionId && [{ id: submissionId, include: 'details,values.raw,form,form.fields,form.fields.details,form.pages' }], transform: function transform(result) { return result.submission; } }, form: { fn: _apis.fetchForm, params: kappSlug && formSlug && [{ kappSlug: kappSlug, formSlug: formSlug, include: 'pages' }], transform: function transform(result) { return result.form; } }, pages: { fn: function fn(form) { return form.get('pages'); }, params: function params(_ref2) { var form = _ref2.form, submission = _ref2.submission; return submission ? [submission.get('form')] : form ? [form] : null; } } }; }; var handleSubmit = function handleSubmit(_ref3) { var kappSlug = _ref3.kappSlug, formSlug = _ref3.formSlug, id = _ref3.submissionId; return function (values) { // Remove the new files to upload from the values. var processedValues = values.map(function (value) { return (0, _lodashEs.isArray)(value) || _immutable.List.isList(value) ? value.filter(function (entry) { return !(entry instanceof File); }) : value; }); // Construct a list of files to upload by iterating through the values, // flattening if the value is a List/Array and then filtering to only keep // values that are instances of File, which represent new files to upload. var files = values.entrySeq().flatMap(function (_ref4) { var _ref5 = (0, _slicedToArray2["default"])(_ref4, 2), field = _ref5[0], vals = _ref5[1]; return (0, _lodashEs.isArray)(vals) || _immutable.List.isList(vals) ? (0, _immutable.List)(vals).filter(function (val) { return val instanceof File; }).map(function (file) { return (0, _immutable.Map)({ field: field, file: file }); }) : []; }).toList(); return (0, _apis.saveSubmissionMultipart)({ kappSlug: kappSlug, formSlug: formSlug, id: id, values: processedValues, files: files }).then(function (_ref6) { var submission = _ref6.submission, error = _ref6.error; if (error) { throw error.statusCode === 400 && error.message || 'There was an error saving the submission'; } return submission; }); }; }; var traverseElement = function traverseElement(traverse, iteratee, acc) { var element = traverse.get(0); var elements = traverse.shift(); var childElements = element.get('elements', (0, _immutable.List)()); var result = iteratee(element, acc); // If the current element has child elements make a recursive call. if (childElements.size > 0) { result = traverseElement(childElements, iteratee, result); } if (elements.size > 0) { return traverseElement(elements, iteratee, result); } return result; }; var convertRenderType = function convertRenderType(element) { if (element.get('renderType') === 'dropdown') { return element.get('choicesResourceName') ? 'text' : 'select'; } else if (element.get('renderType') === 'checkbox') { return 'text-multi'; } else if (element.get('renderType') === 'attachment') { if (element.get('allowMultiple')) { return 'file-multi'; } else { return 'file'; } } return element.get('renderType'); }; var getInitialValue = function getInitialValue(submission, element, type) { var fieldKey = element.get('key'); // If value doesn't exist, set a default value based on the renderType var value = ['checkbox', 'attachment'].includes(element.get('renderType')) ? (0, _immutable.getIn)(submission, ['valuesRaw', fieldKey, 'value']) || (0, _immutable.List)() : (0, _immutable.getIn)(submission, ['valuesRaw', fieldKey, 'value']) || ''; // To update a submission with existing submissions we need to grab the // documentId and insert that into the attachment value normally returned with // the submission. if (element.get('renderType') === 'attachment') { var rawValue = JSON.parse((0, _immutable.getIn)(submission, ['valuesRaw', fieldKey, 'rawValue'], null)); value = value.map(function (attachment, i) { return attachment.set('documentId', (0, _immutable.getIn)(rawValue, [i, 'documentId'], null)); }); } return type === 'datetime' && value ? (0, _moment["default"])(value).format('yyyy-MM-DDThh:mm') : type === 'date' && value ? (0, _moment["default"])(value).format('yyyy-MM-DD') : value; }; var serializer = function serializer(element) { return function (_ref7) { var values = _ref7.values; var name = element.get('name'); var type = element.get('renderType'); switch (type) { case 'datetime': return values.get(name) && (0, _moment["default"])(values.get(name)).format(); case 'attachment': // When updating a submission with existing attachment values, there will // be a link property returned from the API that has to be removed from // the payload we are going to submit. return values.get(name).map(function (attachment) { return attachment instanceof File ? attachment : (0, _immutable.remove)(attachment, 'link'); }); default: return values.get(name); } }; }; // If the element uses bridged options then the `choices` value represents the // label/value mapping from and not actual choices. var getChoices = function getChoices(element) { return !!element.get('choicesResourceName') ? (0, _immutable.List)() : element.get('choices'); }; var fields = function fields() { return function (_ref8) { var form = _ref8.form, pages = _ref8.pages, submission = _ref8.submission; if (pages) { var values = traverseElement(pages, function (element, values) { var name = element.get('name'); var type = convertRenderType(element); var initialValue = getInitialValue(submission || {}, element, type); return element.get('type') === 'field' ? values.push({ name: name, label: name, type: type, options: getChoices(element, initialValue), initialValue: initialValue, serialize: serializer(element, type) }) : values; }, (0, _immutable.List)()); return values.toJS(); } }; }; var SubmissionForm = exports.SubmissionForm = (0, _Form.generateForm)({ formOptions: ['kappSlug', 'formSlug', 'submissionId'], dataSources: dataSources, fields: fields, handleSubmit: handleSubmit }); SubmissionForm.displayName = 'SubmissionForm';