dartrosa_entities 0.1.1 copy "dartrosa_entities: ^0.1.1" to clipboard
dartrosa_entities: ^0.1.1 copied to clipboard

ODK entities for DartRosa: entity forms, entity lists as secondary instances, offline entity updates and storage. A port of Collect's entities module.

example/example.dart

// Copyright 2026 The DartRosa Authors
// SPDX-License-Identifier: Apache-2.0

// An entity form: the local `people` list is a secondary instance, and
// finalizing creates a new person in it.
import 'package:dartrosa/dartrosa.dart';
import 'package:dartrosa_entities/dartrosa_entities.dart';

const xform = '''
<h:html xmlns="http://www.w3.org/2002/xforms"
    xmlns:h="http://www.w3.org/1999/xhtml"
    xmlns:jr="http://openrosa.org/javarosa"
    xmlns:entities="http://www.opendatakit.org/xforms/entities">
  <h:head>
    <h:title>Add person</h:title>
    <model entities:entities-version="2024.1.0">
      <instance>
        <data id="add-person">
          <name/>
          <count/>
          <meta>
            <entity dataset="people" create="1" id=""><label/></entity>
          </meta>
        </data>
      </instance>
      <instance id="people" src="jr://file-csv/people.csv"/>
      <bind nodeset="/data/name" type="string" entities:saveto="full_name"/>
      <bind nodeset="/data/count" type="string"
          calculate="count(instance('people')/root/item)"/>
      <bind nodeset="/data/meta/entity/@id" type="string"/>
      <bind nodeset="/data/meta/entity/label" type="string"
          calculate="/data/name"/>
      <setvalue event="odk-instance-first-load"
          ref="/data/meta/entity/@id" value="uuid()"/>
    </model>
  </h:head>
  <h:body>
    <input ref="/data/name"><label>Name</label></input>
  </h:body>
</h:html>
''';

Future<void> main() async {
  final repository = InMemEntitiesRepository()
    ..save('people', [
      NewEntity('a1', 'Shiv', properties: const [('full_name', 'Shiv Roy')]),
    ]);
  final config = withEntities(
    const DartRosaConfig(),
    entitiesRepository: () => repository,
  );

  final definition = await FormDefinition.parse(xform, config: config);
  final session = definition.createSession();
  final name = session.root.children.whereType<QuestionNode>().first;
  session.answer(name.index, const StringValue('Kendall Roy'));

  if (session.finalize() is FinalizeSuccess) {
    for (final entity in formEntities(session)!.entities) {
      _log('${entity.action.name} ${entity.label} ${entity.properties}');
    }
    saveFormEntities(session, repository);
    _log('people: ${repository.getCount('people')}'); // 2
  }
}

// ignore: avoid_print
void _log(Object? message) => print(message);
0
likes
160
points
385
downloads

Documentation

API reference

Publisher

verified publishersudhi.in

Weekly Downloads

ODK entities for DartRosa: entity forms, entity lists as secondary instances, offline entity updates and storage. A port of Collect's entities module.

Homepage
Repository (GitHub)
View/report issues
Contributing

Topics

#odk #xforms #form #data-collection #offline

License

Apache-2.0 (license)

Dependencies

collection, dartrosa, dartrosa_external_data, meta

More

Packages that depend on dartrosa_entities