@kineticdata/react
Version:
A React library for the Kinetic Platform
196 lines (191 loc) • 7.38 kB
JavaScript
;
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';