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