deserialize method

  1. @override
void deserialize(
  1. XmlElement? xml
)
override

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);
  }
}