deserialize method
Deserializes the FML template elements, attributes and children
Implementation
@override
void deserialize(XmlElement? xml) {
if (xml == null) return;
// deserialize
super.deserialize(xml);
// properties
status = Xml.get(node: xml, tag: 'status');
autosave = Xml.get(node: xml, tag: 'autosave');
mandatory = Xml.get(node: xml, tag: 'mandatory');
post = Xml.get(node: xml, tag: 'post');
geocode = Xml.get(node: xml, tag: 'geocode');
postbrokers = Xml.attribute(node: xml, tag: 'post') ?? Xml.attribute(node: xml, tag: 'postbroker');
// events
onComplete = Xml.get(node: xml, tag: 'oncomplete');
onSave = Xml.get(node: xml, tag: 'onsave');
onValidate = Xml.get(node: xml, tag: 'onvalidate');
onInvalid = Xml.get(node: xml, tag: 'oninvalid');
// get fields
setFormFields();
// fill all empty fields with the datasource if specified
var datasource = Xml.attribute(node: xml, tag: 'data');
if (datasource != null) {
IDataSource? source = scope?.getDataSource(datasource);
if (source != null) source.register(this);
}
// get forms
forms.addAll(getForms(children));
// get all answers
var nodes = xml.findElements("ANSWER", namespace: "*");
// clear answers
for (XmlElement node in nodes) {
String? id = Xml.get(node: node, tag: 'id');
IFormField? field = getField(id);
if (field != null) {
dynamic value = field.value;
if (value is List) {
field.value.clear();
} else {
field.value = null;
}
}
}
// apply answers
for (XmlElement node in nodes) {
String? answer = Xml.getText(node);
String? id = Xml.get(node: node, tag: 'id');
IFormField field = getField(id)!;
dynamic value = field.value;
if (value is List) {
field.value.add(answer);
} else {
field.value = answer;
}
/// GeoCode for each [iFormField] which is set on answer
field.geocode = Payload(
latitude: toDouble(Xml.attribute(node: node, tag: 'latitude')),
longitude: toDouble(Xml.attribute(node: node, tag: 'longitude')),
altitude: toDouble(Xml.attribute(node: node, tag: 'altitude')),
epoch: toInt(Xml.attribute(node: node, tag: 'epoch')));
}
// mark form clean
clean = true;
// add dirty listener to each field
for (var field in formFields) {
field.registerDirtyListener(onDirtyListener);
}
// add dirty listener to each sub-form
for (var form in forms) {
Observable? property = form.dirtyObservable;
if (property != null) property.registerListener(onDirtyListener);
}
}