deserialize method

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

Deserializes the FML template elements, attributes and children

Implementation

@override
void deserialize(XmlElement xml)
{
  // 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');

  // get fields
  fields.addAll(getFields(children));

  // 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 = GPS.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
  fields.forEach((field)
  {
    if (field.dirtyObservable != null) field.dirtyObservable!.registerListener(onDirtyListener);
  });

  // add dirty listener to each sub-form
  forms.forEach((form)
  {
    Observable? property = form.dirtyObservable;
    if (property != null) property.registerListener(onDirtyListener);
  });
}