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');
geocode = Xml.get(node: xml, tag: 'geocode');
oncomplete = Xml.get(node: xml, tag: 'oncomplete');
postbrokers = Xml.attribute(node: xml, tag: 'post');
data = Xml.attribute(node: xml, tag: 'data');
// get fields
fields.addAll(getFields(children));
// fill all empty fields with the datasource if specified
if (data != null) _fillEmptyFields();
// 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) {
///
// Value
///
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: S.toDouble(Xml.attribute(node: node, tag: 'latitude')),
longitude: S.toDouble(Xml.attribute(node: node, tag: 'longitude')),
altitude: S.toDouble(Xml.attribute(node: node, tag: 'altitude')),
epoch: S.toInt(Xml.attribute(node: node, tag: 'epoch')));
}
// mark form clean
clean = true;
// add dirty listener to each field
for (var field in fields) {
if (field.dirtyObservable != null) {
field.dirtyObservable!.registerListener(onDirtyListener);
}
}
// add dirty listener to each sub-form
for (var form in forms) {
Observable? property = form.dirtyObservable;
if (property != null) property.registerListener(onDirtyListener);
}
}