From ad0d4f3b10f75ed97f9e5e6755be5b8b8d82b258 Mon Sep 17 00:00:00 2001 From: sh1l0n Date: Wed, 26 Apr 2023 14:36:18 +0200 Subject: [PATCH 01/12] updated all dependencies --- example/lib/about_page.dart | 2 +- example/lib/disclaimer_page.dart | 2 +- example/lib/exhibit_page.dart | 2 +- example/lib/main.dart | 31 +- example/lib/observation_page.dart | 5 +- example/pubspec.lock | 380 +++++++++++------- example/pubspec.yaml | 22 +- faiabench/lib/fhir_resource_editor.dart | 28 +- faiabench/lib/main.dart | 2 +- faiabench/pubspec.yaml | 29 +- .../lib/restful/src/smart_login_button.dart | 3 +- .../lib/restful/src/sync_indicator.dart | 2 +- faiadashu_online/pubspec.yaml | 14 +- .../item/answer/src/coding_answer_filler.dart | 8 +- .../answer/src/numerical_answer_filler.dart | 8 +- .../view/item/src/total_score_item.dart | 4 +- .../view/src/broken_questionnaire_item.dart | 11 +- .../view/src/narrative_drawer.dart | 2 +- .../view/src/narrative_page.dart | 4 +- .../view/src/narrative_tile.dart | 4 +- .../src/questionnaire_complete_button.dart | 3 +- .../view/src/questionnaire_filler.dart | 7 +- .../questionnaire_filler_progress_bar.dart | 4 +- .../src/questionnaire_information_tile.dart | 5 +- .../src/questionnaire_loading_indicator.dart | 7 +- .../view/src/questionnaire_scroller_page.dart | 4 +- .../view/src/questionnaire_stepper.dart | 7 +- .../view/src/questionnaire_stepper_page.dart | 16 +- .../view/src/questionnaire_theme.dart | 6 +- lib/questionnaires/view/src/webview_html.dart | 15 +- lib/questionnaires/view/src/webview_io.dart | 13 +- lib/questionnaires/view/src/xhtml.dart | 2 +- pubspec.yaml | 18 +- 33 files changed, 359 insertions(+), 311 deletions(-) diff --git a/example/lib/about_page.dart b/example/lib/about_page.dart index 45f8ef9b..0ae3f6d3 100644 --- a/example/lib/about_page.dart +++ b/example/lib/about_page.dart @@ -21,7 +21,7 @@ class AboutPage extends ExhibitPage {

I love the sound of it.

私はその音が大好きです。

''', - defaultTextStyle: Theme.of(context).textTheme.bodyText1, + defaultTextStyle: Theme.of(context).textTheme.bodyLarge, ), ); } diff --git a/example/lib/disclaimer_page.dart b/example/lib/disclaimer_page.dart index efba2cd5..a930e34c 100644 --- a/example/lib/disclaimer_page.dart +++ b/example/lib/disclaimer_page.dart @@ -3,7 +3,7 @@ import 'package:flutter/material.dart'; import 'exhibit_page.dart'; class DisclaimerPage extends ExhibitPage { - const DisclaimerPage({Key? key}) : super(key: key); + const DisclaimerPage({super.key}); @override Widget buildExhibit(BuildContext context) { diff --git a/example/lib/exhibit_page.dart b/example/lib/exhibit_page.dart index c52c4d26..a1166318 100644 --- a/example/lib/exhibit_page.dart +++ b/example/lib/exhibit_page.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; abstract class ExhibitPage extends StatelessWidget { - const ExhibitPage({Key? key}) : super(key: key); + const ExhibitPage({super.key}); String get title; diff --git a/example/lib/main.dart b/example/lib/main.dart index 1b0c333e..a8e9e112 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -44,7 +44,7 @@ void main() { } class MyApp extends StatelessWidget { - const MyApp({Key? key}) : super(key: key); + const MyApp({super.key}); @override Widget build(BuildContext context) { @@ -71,7 +71,7 @@ class MyApp extends StatelessWidget { } class HomePage extends StatefulWidget { - const HomePage({Key? key}) : super(key: key); + const HomePage({super.key}); @override // ignore: library_private_types_in_public_api @@ -123,7 +123,6 @@ class _HomePageState extends State { clientId: '4564f6f7-335f-43d3-8867-a0f4e6f901d6', redirectUri: FhirUri('com.legentix.faiagallery://callback'), ); - } @override @@ -134,7 +133,9 @@ class _HomePageState extends State { /// Schedules repaint after login / logout. void _onLoginChanged() { - _logger.debug('_onLoginChanged: ${questionnaireResponseStorage.smartClient.isLoggedIn()}'); + _logger.debug( + '_onLoginChanged: ${questionnaireResponseStorage.smartClient.isLoggedIn()}', + ); setState(() { // Rebuild }); @@ -171,7 +172,7 @@ class _HomePageState extends State { title, style: Theme.of(context) .textTheme - .headline6 + .titleLarge ?.copyWith(fontWeight: FontWeight.bold), ), Text(subtitle) @@ -206,7 +207,10 @@ class _HomePageState extends State { ), ), actions: [ - SmartLoginButton(questionnaireResponseStorage.smartClient, onLoginChanged: _onLoginChanged) + SmartLoginButton( + questionnaireResponseStorage.smartClient, + onLoginChanged: _onLoginChanged, + ) ], ), body: SafeArea( @@ -225,7 +229,8 @@ class _HomePageState extends State { launchContext: launchContext, questionnairePath: 'assets/instruments/beverage_ig.json', saveResponseFunction: questionnaireResponseStorage.saveToMemory, - restoreResponseFunction: questionnaireResponseStorage.restoreFromMemory, + restoreResponseFunction: + questionnaireResponseStorage.restoreFromMemory, uploadResponseFunction: uploadResponseFunction, questionnaireModelDefaults: QuestionnaireModelDefaults( prefixBuilder: (fim) { @@ -369,7 +374,8 @@ class _HomePageState extends State { launchContext: launchContext, questionnairePath: 'assets/instruments/bluebook.json', saveResponseFunction: questionnaireResponseStorage.saveToMemory, - restoreResponseFunction: questionnaireResponseStorage.restoreFromMemory, + restoreResponseFunction: + questionnaireResponseStorage.restoreFromMemory, uploadResponseFunction: uploadResponseFunction, ), _launchQuestionnaire( @@ -398,7 +404,8 @@ class _HomePageState extends State { launchContext: launchContext, questionnairePath: 'assets/instruments/argonaut_sampler.json', saveResponseFunction: questionnaireResponseStorage.saveToMemory, - restoreResponseFunction: questionnaireResponseStorage.restoreFromMemory, + restoreResponseFunction: + questionnaireResponseStorage.restoreFromMemory, uploadResponseFunction: uploadResponseFunction, ), QuestionnaireLaunchTile( @@ -412,7 +419,8 @@ class _HomePageState extends State { launchContext: launchContext, questionnairePath: 'assets/instruments/argonaut_sampler.json', saveResponseFunction: questionnaireResponseStorage.saveToMemory, - restoreResponseFunction: questionnaireResponseStorage.restoreFromMemory, + restoreResponseFunction: + questionnaireResponseStorage.restoreFromMemory, uploadResponseFunction: uploadResponseFunction, ), QuestionnaireLaunchTile( @@ -426,7 +434,8 @@ class _HomePageState extends State { launchContext: launchContext, questionnairePath: 'assets/instruments/argonaut_sampler.json', saveResponseFunction: questionnaireResponseStorage.saveToMemory, - restoreResponseFunction: questionnaireResponseStorage.restoreFromMemory, + restoreResponseFunction: + questionnaireResponseStorage.restoreFromMemory, uploadResponseFunction: uploadResponseFunction, ), _headline( diff --git a/example/lib/observation_page.dart b/example/lib/observation_page.dart index c103a23d..535e4cf6 100644 --- a/example/lib/observation_page.dart +++ b/example/lib/observation_page.dart @@ -4,7 +4,7 @@ import 'package:fhir/r4.dart'; import 'package:flutter/material.dart'; class ObservationPage extends ExhibitPage { - ObservationPage({Key? key}) : super(key: key); + ObservationPage({super.key}); final bpObservation = Observation( effectiveDateTime: FhirDateTime(DateTime.now()), @@ -124,7 +124,8 @@ class ObservationPage extends ExhibitPage { valueStyle: Theme.of(context).textTheme.headline4, codeStyle: Theme.of(context).textTheme.subtitle2, dateTimeStyle: Theme.of(context).textTheme.caption, - locale: const Locale.fromSubtags(languageCode: 'ar', countryCode: 'BH'), + locale: + const Locale.fromSubtags(languageCode: 'ar', countryCode: 'BH'), ), ], ); diff --git a/example/pubspec.lock b/example/pubspec.lock index d6462bd3..fd61879d 100644 --- a/example/pubspec.lock +++ b/example/pubspec.lock @@ -5,49 +5,56 @@ packages: dependency: transitive description: name: args - url: "https://pub.dartlang.org" + sha256: "4cab82a83ffef80b262ddedf47a0a8e56ee6fbf7fe21e6e768b02792034dd440" + url: "https://pub.dev" source: hosted - version: "2.3.1" + version: "2.4.0" async: dependency: transitive description: name: async - url: "https://pub.dartlang.org" + sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c" + url: "https://pub.dev" source: hosted - version: "2.9.0" - characters: + version: "2.11.0" + boolean_selector: dependency: transitive description: - name: characters - url: "https://pub.dartlang.org" + name: boolean_selector + sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" + url: "https://pub.dev" source: hosted - version: "1.2.0" - charcode: + version: "2.1.1" + characters: dependency: transitive description: - name: charcode - url: "https://pub.dartlang.org" + name: characters + sha256: e6a326c8af69605aec75ed6c187d06b349707a27fbff8222ca9cc2cff167975c + url: "https://pub.dev" source: hosted - version: "1.3.1" + version: "1.2.1" clock: dependency: transitive description: name: clock - url: "https://pub.dartlang.org" + sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf + url: "https://pub.dev" source: hosted - version: "1.1.0" + version: "1.1.1" collection: dependency: "direct main" description: name: collection - url: "https://pub.dartlang.org" + sha256: cfc915e6923fe5ce6e153b0723c753045de46de1b4d63771530504004a45fae0 + url: "https://pub.dev" source: hosted - version: "1.16.0" + version: "1.17.0" crypto: dependency: transitive description: name: crypto - url: "https://pub.dartlang.org" + sha256: aa274aa7774f8964e4f4f38cc994db7b6158dd36e9187aaceaddc994b35c6c67 + url: "https://pub.dev" source: hosted version: "3.0.2" faiadashu: @@ -68,51 +75,58 @@ packages: dependency: transitive description: name: ffi - url: "https://pub.dartlang.org" + sha256: a38574032c5f1dd06c4aee541789906c12ccaab8ba01446e800d9c5b79c4a978 + url: "https://pub.dev" source: hosted - version: "2.0.0" + version: "2.0.1" fhir: dependency: "direct main" description: name: fhir - url: "https://pub.dartlang.org" + sha256: d255189e3314e6b67654d8cba448460d019532eff654191f374b8709bc4185bd + url: "https://pub.dev" source: hosted version: "0.8.0" fhir_at_rest: dependency: transitive description: name: fhir_at_rest - url: "https://pub.dartlang.org" + sha256: "3b6915b9d95c48fa6369c12fdc9430d51f4644a3d48c76caad9c51126d39ed75" + url: "https://pub.dev" source: hosted - version: "0.8.3" + version: "0.8.4" fhir_auth: dependency: "direct main" description: name: fhir_auth - url: "https://pub.dartlang.org" + sha256: "5081e5fba81812c7d47768be5b096dbb9787cdd59a742e2272700687d6ac067c" + url: "https://pub.dev" source: hosted version: "0.8.0" fhir_path: dependency: transitive description: name: fhir_path - url: "https://pub.dartlang.org" + sha256: eef12419e4e62feb51176b6c5f4038980cb0140eb79ec67f92dd000e2d589cda + url: "https://pub.dev" source: hosted version: "0.8.0" fhir_yaml: dependency: transitive description: name: fhir_yaml - url: "https://pub.dartlang.org" + sha256: "59aad5ead24d602142aa2e5745596fe7ef1472496ef29ea3ce3283f3c917c964" + url: "https://pub.dev" source: hosted version: "0.8.0" file: dependency: transitive description: name: file - url: "https://pub.dartlang.org" + sha256: "1b92bec4fc2a72f59a8e15af5f52cd441e4a7860b49499d69dfa817af20e925d" + url: "https://pub.dev" source: hosted - version: "6.1.2" + version: "6.1.4" flutter: dependency: "direct main" description: flutter @@ -127,9 +141,10 @@ packages: dependency: transitive description: name: flutter_web_auth - url: "https://pub.dartlang.org" + sha256: "8c364d8157b299c95f062bbd7bf428bb80c272d7ed3b8f0e6c7028e037e82c76" + url: "https://pub.dev" source: hosted - version: "0.4.1" + version: "0.4.3" flutter_web_plugins: dependency: transitive description: flutter @@ -139,247 +154,274 @@ packages: dependency: transitive description: name: freezed_annotation - url: "https://pub.dartlang.org" + sha256: aeac15850ef1b38ee368d4c53ba9a847e900bb2c53a4db3f6881cbb3cb684338 + url: "https://pub.dev" source: hosted - version: "2.0.3" + version: "2.2.0" google_fonts: dependency: "direct main" description: name: google_fonts - url: "https://pub.dartlang.org" + sha256: e70521755a6b08c6bde14ddae27dff5bf21010033888fc61da6c595f8a9f58c1 + url: "https://pub.dev" source: hosted version: "2.3.3" google_sign_in: dependency: transitive description: name: google_sign_in - url: "https://pub.dartlang.org" + sha256: "821f354c053d51a2d417b02d42532a19a6ea8057d2f9ebb8863c07d81c98aaf9" + url: "https://pub.dev" source: hosted - version: "5.3.2" + version: "5.4.4" google_sign_in_android: dependency: transitive description: name: google_sign_in_android - url: "https://pub.dartlang.org" + sha256: "8e46e791f54ce83c05dcc41430bba943c3aafc49b9b867c4d10b395968398b4a" + url: "https://pub.dev" source: hosted - version: "5.2.8" + version: "6.1.11" google_sign_in_ios: dependency: transitive description: name: google_sign_in_ios - url: "https://pub.dartlang.org" + sha256: "2e1df687b17f7fddcaf9a0c7f994d0d19b5d41e8ce1d943013befd0a0ae67403" + url: "https://pub.dev" source: hosted - version: "5.3.1" + version: "5.6.1" google_sign_in_platform_interface: dependency: transitive description: name: google_sign_in_platform_interface - url: "https://pub.dartlang.org" + sha256: "95a9e0a8701b5485f2ca330fd1fc6f918f5ce088042ce1019c5e389d8574ae4c" + url: "https://pub.dev" source: hosted - version: "2.1.3" + version: "2.4.0" google_sign_in_web: dependency: transitive description: name: google_sign_in_web - url: "https://pub.dartlang.org" + sha256: "75cc41ebc53b1756320ee14d9c3018ad3e6cea298147dbcd86e9d0c8d6720b40" + url: "https://pub.dev" source: hosted - version: "0.10.1+2" + version: "0.10.2+1" html_unescape: dependency: transitive description: name: html_unescape - url: "https://pub.dartlang.org" + sha256: "15362d7a18f19d7b742ef8dcb811f5fd2a2df98db9f80ea393c075189e0b61e3" + url: "https://pub.dev" source: hosted version: "2.0.0" http: dependency: transitive description: name: http - url: "https://pub.dartlang.org" + sha256: "6aa2946395183537c8b880962d935877325d6a09a2867c3970c05c0fed6ac482" + url: "https://pub.dev" source: hosted - version: "0.13.4" + version: "0.13.5" http_parser: dependency: transitive description: name: http_parser - url: "https://pub.dartlang.org" + sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b" + url: "https://pub.dev" source: hosted - version: "4.0.1" + version: "4.0.2" intl: dependency: "direct main" description: name: intl - url: "https://pub.dartlang.org" + sha256: "910f85bce16fb5c6f614e117efa303e85a1731bb0081edf3604a2ae6e9a3cc91" + url: "https://pub.dev" source: hosted version: "0.17.0" js: dependency: transitive description: name: js - url: "https://pub.dartlang.org" + sha256: "5528c2f391ededb7775ec1daa69e65a2d61276f7552de2b5f7b8d34ee9fd4ab7" + url: "https://pub.dev" source: hosted - version: "0.6.4" + version: "0.6.5" json_annotation: dependency: transitive description: name: json_annotation - url: "https://pub.dartlang.org" + sha256: c33da08e136c3df0190bd5bbe51ae1df4a7d96e7954d1d7249fea2968a72d317 + url: "https://pub.dev" source: hosted - version: "4.5.0" + version: "4.8.0" lint: dependency: "direct dev" description: name: lint - url: "https://pub.dartlang.org" + sha256: "3e9343b1cededcfb1e8b40d0dbd3592b7a1c6c0121545663a991433390c2bc97" + url: "https://pub.dev" source: hosted - version: "1.8.2" + version: "2.0.1" logging: dependency: "direct main" description: name: logging - url: "https://pub.dartlang.org" + sha256: "04094f2eb032cbb06c6f6e8d3607edcfcb0455e2bb6cbc010cb01171dcb64e6d" + url: "https://pub.dev" source: hosted - version: "1.0.2" + version: "1.1.1" markdown: dependency: transitive description: name: markdown - url: "https://pub.dartlang.org" + sha256: d95a9d12954aafc97f984ca29baaa7690ed4d9ec4140a23ad40580bcdb6c87f5 + url: "https://pub.dev" source: hosted - version: "5.0.0" + version: "7.0.2" matcher: dependency: transitive description: name: matcher - url: "https://pub.dartlang.org" + sha256: "6501fbd55da300384b768785b83e5ce66991266cec21af89ab9ae7f5ce1c4cbb" + url: "https://pub.dev" source: hosted - version: "0.12.11" + version: "0.12.15" material_color_utilities: dependency: transitive description: name: material_color_utilities - url: "https://pub.dartlang.org" + sha256: d92141dc6fe1dad30722f9aa826c7fbc896d021d792f80678280601aff8cf724 + url: "https://pub.dev" source: hosted - version: "0.1.4" + version: "0.2.0" meta: dependency: transitive description: name: meta - url: "https://pub.dartlang.org" + sha256: "6c268b42ed578a53088d834796959e4a1814b5e9e164f147f580a386e5decf42" + url: "https://pub.dev" source: hosted - version: "1.7.0" + version: "1.8.0" oauth2: dependency: transitive description: name: oauth2 - url: "https://pub.dartlang.org" + sha256: "1e8376c222651904caf7785fd2fa01b1e2be608c94bec842a94e116deca88f13" + url: "https://pub.dev" source: hosted - version: "2.0.0" + version: "2.0.1" path: dependency: transitive description: name: path - url: "https://pub.dartlang.org" + sha256: db9d4f58c908a4ba5953fcee2ae317c94889433e5024c27ce74a37f94267945b + url: "https://pub.dev" source: hosted - version: "1.8.1" + version: "1.8.2" path_provider: dependency: transitive description: name: path_provider - url: "https://pub.dartlang.org" + sha256: c7edf82217d4b2952b2129a61d3ad60f1075b9299e629e149a8d2e39c2e6aad4 + url: "https://pub.dev" source: hosted - version: "2.0.10" + version: "2.0.14" path_provider_android: dependency: transitive description: name: path_provider_android - url: "https://pub.dartlang.org" + sha256: da97262be945a72270513700a92b39dd2f4a54dad55d061687e2e37a6390366a + url: "https://pub.dev" source: hosted - version: "2.0.14" - path_provider_ios: + version: "2.0.25" + path_provider_foundation: dependency: transitive description: - name: path_provider_ios - url: "https://pub.dartlang.org" + name: path_provider_foundation + sha256: ad4c4d011830462633f03eb34445a45345673dfd4faf1ab0b4735fbd93b19183 + url: "https://pub.dev" source: hosted - version: "2.0.9" + version: "2.2.2" path_provider_linux: dependency: transitive description: name: path_provider_linux - url: "https://pub.dartlang.org" + sha256: "2ae08f2216225427e64ad224a24354221c2c7907e448e6e0e8b57b1eb9f10ad1" + url: "https://pub.dev" source: hosted - version: "2.1.7" - path_provider_macos: - dependency: transitive - description: - name: path_provider_macos - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.6" + version: "2.1.10" path_provider_platform_interface: dependency: transitive description: name: path_provider_platform_interface - url: "https://pub.dartlang.org" + sha256: "57585299a729335f1298b43245842678cb9f43a6310351b18fb577d6e33165ec" + url: "https://pub.dev" source: hosted - version: "2.0.4" + version: "2.0.6" path_provider_windows: dependency: transitive description: name: path_provider_windows - url: "https://pub.dartlang.org" + sha256: d3f80b32e83ec208ac95253e0cd4d298e104fbc63cb29c5c69edaed43b0c69d6 + url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.1.6" petitparser: dependency: transitive description: name: petitparser - url: "https://pub.dartlang.org" + sha256: "49392a45ced973e8d94a85fdb21293fbb40ba805fc49f2965101ae748a3683b4" + url: "https://pub.dev" source: hosted - version: "5.0.0" + version: "5.1.0" platform: dependency: transitive description: name: platform - url: "https://pub.dartlang.org" + sha256: "4a451831508d7d6ca779f7ac6e212b4023dd5a7d08a27a63da33756410e32b76" + url: "https://pub.dev" source: hosted version: "3.1.0" plugin_platform_interface: dependency: transitive description: name: plugin_platform_interface - url: "https://pub.dartlang.org" + sha256: "6a2128648c854906c53fa8e33986fc0247a1116122f9534dd20e3ab9e16a32bc" + url: "https://pub.dev" source: hosted - version: "2.1.2" + version: "2.1.4" process: dependency: transitive description: name: process - url: "https://pub.dartlang.org" + sha256: "53fd8db9cec1d37b0574e12f07520d582019cb6c44abf5479a01505099a34a09" + url: "https://pub.dev" source: hosted version: "4.2.4" quiver: dependency: transitive description: name: quiver - url: "https://pub.dartlang.org" + sha256: b1c1ac5ce6688d77f65f3375a9abb9319b3cb32486bdc7a1e0fdf004d7ba4e47 + url: "https://pub.dev" source: hosted - version: "3.1.0" + version: "3.2.1" scrollable_positioned_list: dependency: transitive description: name: scrollable_positioned_list - url: "https://pub.dartlang.org" + sha256: ca7fcaa743db712d4f7b1580526f494d0093c77a721a65705ee51fbeac7a2bd3 + url: "https://pub.dev" source: hosted - version: "0.3.2" + version: "0.3.5" simple_html_css: dependency: "direct main" description: name: simple_html_css - url: "https://pub.dartlang.org" + sha256: af730b15c0b37c97a14b6aeceabe68128855c4630dc500030f3c3e176e8fc57f + url: "https://pub.dev" source: hosted - version: "3.0.1+1" + version: "4.0.0" sky_engine: dependency: transitive description: flutter @@ -389,170 +431,210 @@ packages: dependency: transitive description: name: source_span - url: "https://pub.dartlang.org" + sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c" + url: "https://pub.dev" source: hosted - version: "1.9.0" + version: "1.10.0" stack_trace: dependency: transitive description: name: stack_trace - url: "https://pub.dartlang.org" + sha256: c3c7d8edb15bee7f0f74debd4b9c5f3c2ea86766fe4178eb2a18eb30a0bdaed5 + url: "https://pub.dev" source: hosted - version: "1.10.0" + version: "1.11.0" + stream_channel: + dependency: transitive + description: + name: stream_channel + sha256: "83615bee9045c1d322bbbd1ba209b7a749c2cbcdcb3fdd1df8eb488b3279c1c8" + url: "https://pub.dev" + source: hosted + version: "2.1.1" string_scanner: dependency: transitive description: name: string_scanner - url: "https://pub.dartlang.org" + sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" + url: "https://pub.dev" source: hosted - version: "1.1.1" + version: "1.2.0" term_glyph: dependency: transitive description: name: term_glyph - url: "https://pub.dartlang.org" + sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 + url: "https://pub.dev" source: hosted - version: "1.2.0" + version: "1.2.1" + test_api: + dependency: transitive + description: + name: test_api + sha256: daadc9baabec998b062c9091525aa95786508b1c48e9c30f1f891b8bf6ff2e64 + url: "https://pub.dev" + source: hosted + version: "0.5.2" typed_data: dependency: transitive description: name: typed_data - url: "https://pub.dartlang.org" + sha256: "26f87ade979c47a150c9eaab93ccd2bebe70a27dc0b4b29517f2904f04eb11a5" + url: "https://pub.dev" source: hosted version: "1.3.1" url_launcher: dependency: transitive description: name: url_launcher - url: "https://pub.dartlang.org" + sha256: "75f2846facd11168d007529d6cd8fcb2b750186bea046af9711f10b907e1587e" + url: "https://pub.dev" source: hosted - version: "6.1.2" + version: "6.1.10" url_launcher_android: dependency: transitive description: name: url_launcher_android - url: "https://pub.dartlang.org" + sha256: a52628068d282d01a07cd86e6ba99e497aa45ce8c91159015b2416907d78e411 + url: "https://pub.dev" source: hosted - version: "6.0.17" + version: "6.0.27" url_launcher_ios: dependency: transitive description: name: url_launcher_ios - url: "https://pub.dartlang.org" + sha256: "9af7ea73259886b92199f9e42c116072f05ff9bea2dcb339ab935dfc957392c2" + url: "https://pub.dev" source: hosted - version: "6.0.17" + version: "6.1.4" url_launcher_linux: dependency: transitive description: name: url_launcher_linux - url: "https://pub.dartlang.org" + sha256: "206fb8334a700ef7754d6a9ed119e7349bc830448098f21a69bf1b4ed038cabc" + url: "https://pub.dev" source: hosted - version: "3.0.1" + version: "3.0.4" url_launcher_macos: dependency: transitive description: name: url_launcher_macos - url: "https://pub.dartlang.org" + sha256: "91ee3e75ea9dadf38036200c5d3743518f4a5eb77a8d13fda1ee5764373f185e" + url: "https://pub.dev" source: hosted - version: "3.0.1" + version: "3.0.5" url_launcher_platform_interface: dependency: transitive description: name: url_launcher_platform_interface - url: "https://pub.dartlang.org" + sha256: "6c9ca697a5ae218ce56cece69d46128169a58aa8653c1b01d26fcd4aad8c4370" + url: "https://pub.dev" source: hosted - version: "2.0.5" + version: "2.1.2" url_launcher_web: dependency: transitive description: name: url_launcher_web - url: "https://pub.dartlang.org" + sha256: "81fe91b6c4f84f222d186a9d23c73157dc4c8e1c71489c4d08be1ad3b228f1aa" + url: "https://pub.dev" source: hosted - version: "2.0.11" + version: "2.0.16" url_launcher_windows: dependency: transitive description: name: url_launcher_windows - url: "https://pub.dartlang.org" + sha256: a83ba3607a507758669cfafb03f9de09bf6e6280c14d9b9cb18f013e406dcacd + url: "https://pub.dev" source: hosted - version: "3.0.1" + version: "3.0.5" uuid: dependency: transitive description: name: uuid - url: "https://pub.dartlang.org" + sha256: "648e103079f7c64a36dc7d39369cabb358d377078a051d6ae2ad3aa539519313" + url: "https://pub.dev" source: hosted - version: "3.0.6" + version: "3.0.7" vector_math: dependency: transitive description: name: vector_math - url: "https://pub.dartlang.org" + sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" + url: "https://pub.dev" source: hosted - version: "2.1.2" + version: "2.1.4" webview_flutter: dependency: transitive description: name: webview_flutter - url: "https://pub.dartlang.org" + sha256: "1a37bdbaaf5fbe09ad8579ab09ecfd473284ce482f900b5aea27cf834386a567" + url: "https://pub.dev" source: hosted - version: "3.0.4" + version: "4.2.0" webview_flutter_android: dependency: transitive description: name: webview_flutter_android - url: "https://pub.dartlang.org" + sha256: "134ed5d36127b6f5865e86a82174886eae0b983dacd8df14b0448371debde755" + url: "https://pub.dev" source: hosted - version: "2.8.9" + version: "3.6.0" webview_flutter_platform_interface: dependency: transitive description: name: webview_flutter_platform_interface - url: "https://pub.dartlang.org" + sha256: "78715dc442b7849dbde74e92bb67de1cecf5addf95531c5fb474e72f5fe9a507" + url: "https://pub.dev" source: hosted - version: "1.9.1" + version: "2.3.0" webview_flutter_web: dependency: transitive description: name: webview_flutter_web - url: "https://pub.dartlang.org" + sha256: "78494dd1be4b5b3070140cbdcc138b9736aa4619f00643f909da6d54f0ffc141" + url: "https://pub.dev" source: hosted - version: "0.1.0+3" + version: "0.2.2+1" webview_flutter_wkwebview: dependency: transitive description: name: webview_flutter_wkwebview - url: "https://pub.dartlang.org" + sha256: c94d242d8cbe1012c06ba7ac790c46d6e6b68723b7d34f8c74ed19f68d166f49 + url: "https://pub.dev" source: hosted - version: "2.8.1" + version: "3.4.0" win32: dependency: transitive description: name: win32 - url: "https://pub.dartlang.org" + sha256: dd8f9344bc305ae2923e3d11a2a911d9a4e2c7dd6fe0ed10626d63211a69676e + url: "https://pub.dev" source: hosted - version: "2.7.0" + version: "4.1.3" xdg_directories: dependency: transitive description: name: xdg_directories - url: "https://pub.dartlang.org" + sha256: ee1505df1426458f7f60aac270645098d318a8b4766d85fde75f76f2e21807d1 + url: "https://pub.dev" source: hosted - version: "0.2.0+1" + version: "1.0.0" xml: dependency: transitive description: name: xml - url: "https://pub.dartlang.org" + sha256: "979ee37d622dec6365e2efa4d906c37470995871fe9ae080d967e192d88286b5" + url: "https://pub.dev" source: hosted - version: "5.4.1" + version: "6.2.2" yaml: dependency: transitive description: name: yaml - url: "https://pub.dartlang.org" + sha256: "23812a9b125b48d4007117254bca50abb6c712352927eece9e155207b1db2370" + url: "https://pub.dev" source: hosted version: "3.1.1" sdks: - dart: ">=2.17.0 <3.0.0" - flutter: ">=3.0.0" + dart: ">=2.19.0 <3.0.0" + flutter: ">=3.3.0" diff --git a/example/pubspec.yaml b/example/pubspec.yaml index bbb21772..5bcaead4 100644 --- a/example/pubspec.yaml +++ b/example/pubspec.yaml @@ -2,42 +2,28 @@ name: faiadashu_example description: Gallery app for Faiadashu™ environment: - sdk: '>=2.17.0 <3.0.0' + sdk: '>=2.18.4 <3.0.0' flutter: '>=3.0.0' dependencies: - collection: ^1.16.0 - + collection: ^1.17.0 faiadashu: path: .. - faiadashu_online: path: ../faiadashu_online - fhir: ^0.8.0 -# fhir: -# path: /Users/tilo/Projects/fhir/fhir - fhir_auth: ^0.8.0 -# fhir_auth: -# path: ../../fhir/fhir_auth - flutter: sdk: flutter flutter_localizations: sdk: flutter - google_fonts: ^2.1.1 - intl: ^0.17.0 - logging: ^1.0.2 - - simple_html_css: ^3.0.1+1 + simple_html_css: ^4.0.0 dev_dependencies: - lint: ^1.8.2 - + lint: ^2.0.1 flutter: uses-material-design: true diff --git a/faiabench/lib/fhir_resource_editor.dart b/faiabench/lib/fhir_resource_editor.dart index fc39e1b2..1b631b63 100644 --- a/faiabench/lib/fhir_resource_editor.dart +++ b/faiabench/lib/fhir_resource_editor.dart @@ -6,8 +6,6 @@ import 'package:faiabench/fhir_resource_notifier.dart'; import 'package:fhir_path/fhir_path.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; -import 'package:flutter_highlight/themes/github.dart'; -import 'package:flutter_highlight/themes/monokai-sublime.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:highlight/languages/javascript.dart'; import 'package:highlight/languages/json.dart'; @@ -29,8 +27,8 @@ class FhirResourceEditor extends ConsumerStatefulWidget { this.showFhirPath = true, this.fhirPathOutputMinLines = 3, this.fhirPathOutputMaxLines = 3, - Key? key, - }) : super(key: key); + super.key, + }); @override // ignore: library_private_types_in_public_api @@ -45,11 +43,12 @@ class _FhirResourceEditorState extends ConsumerState { bool _fhirPathVisible = false; - void _fhirPathChanged(String newPath) { + void _fhirPathChanged() { + final newPath = _fhirPathController?.text ?? ''; setState(() { try { final jsonContext = - jsonDecode(_codeController!.rawText) as Map; + jsonDecode(_codeController!.text) as Map; final pathResult = walkFhirPath(context: jsonContext, pathExpression: newPath); const encoder = JsonEncoder.withIndent(' '); @@ -69,26 +68,24 @@ class _FhirResourceEditorState extends ConsumerState { _codeController = CodeController( text: '', language: json, - theme: monokaiSublimeTheme, ); _fhirPathController = CodeController( text: '', language: javascript, - theme: githubTheme, - onChange: _fhirPathChanged, ); + _fhirPathController?.addListener(_fhirPathChanged); _fhirPathOutputController = CodeController( text: '', language: json, - theme: githubTheme, ); } @override void dispose() { _codeController?.dispose(); + _fhirPathController?.removeListener(_fhirPathChanged); _fhirPathController?.dispose(); _fhirPathOutputController?.dispose(); _scrollController?.dispose(); @@ -126,9 +123,9 @@ class _FhirResourceEditorState extends ConsumerState { height: 120, child: Stack( children: [ - Container( + const ColoredBox( color: Colors.black54, - child: const SizedBox.expand(), + child: SizedBox.expand(), ), Column( mainAxisSize: MainAxisSize.min, @@ -155,7 +152,7 @@ class _FhirResourceEditorState extends ConsumerState { onPressed: () async { await Clipboard.setData( ClipboardData( - text: codeController.rawText.trim(), + text: codeController.text.trim(), ), ); @@ -218,7 +215,7 @@ class _FhirResourceEditorState extends ConsumerState { if (widget.showSubmitButton) IconButton( onPressed: () { - final rawText = codeController.rawText.trim(); + final rawText = codeController.text.trim(); final fhirResource = (rawText.isNotEmpty) ? FhirResource.fromJsonString(rawText) @@ -227,7 +224,8 @@ class _FhirResourceEditorState extends ConsumerState { if (fhirResource.hasError) { ScaffoldMessenger.of(context).showSnackBar( SnackBar( - backgroundColor: Theme.of(context).errorColor, + backgroundColor: + Theme.of(context).colorScheme.error, content: Text(fhirResource.errorMessage!), ), ); diff --git a/faiabench/lib/main.dart b/faiabench/lib/main.dart index 7eb88149..27c1b9fb 100644 --- a/faiabench/lib/main.dart +++ b/faiabench/lib/main.dart @@ -129,7 +129,7 @@ class MyApp extends StatelessWidget { } class HomePage extends ConsumerStatefulWidget { - const HomePage({Key? key}) : super(key: key); + const HomePage({super.key}); @override // ignore: library_private_types_in_public_api diff --git a/faiabench/pubspec.yaml b/faiabench/pubspec.yaml index ef6a11d4..b6034e86 100644 --- a/faiabench/pubspec.yaml +++ b/faiabench/pubspec.yaml @@ -18,47 +18,30 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev version: 1.1.0 environment: - sdk: '>=2.17.0 <3.0.0' + sdk: '>=2.18.4 <3.0.0' flutter: '>=3.0.0' dependencies: - code_text_field: ^1.0.2 - - collection: ^1.16.0 - + code_text_field: ^1.1.0 + collection: ^1.17.0 faiadashu: path: .. - fhir: ^0.8.0 - fhir_path: ^0.8.0 -# fhir_path: -# path: ../../fhir/fhir_path - flutter: sdk: flutter - flutter_highlight: ^0.7.0 - flutter_localizations: sdk: flutter - - flutter_riverpod: ^1.0.1 - + flutter_riverpod: ^2.3.0 highlight: ^0.7.0 - intl: ^0.17.0 - logging: ^1.0.1 - multi_split_view: ^2.0.0 - - simple_html_css: ^3.0.1+1 - - + simple_html_css: ^4.0.0 dev_dependencies: - lint: ^1.8.2 + lint: ^2.0.1 flutter: uses-material-design: true diff --git a/faiadashu_online/lib/restful/src/smart_login_button.dart b/faiadashu_online/lib/restful/src/smart_login_button.dart index 74cb8af3..fb73c8b1 100644 --- a/faiadashu_online/lib/restful/src/smart_login_button.dart +++ b/faiadashu_online/lib/restful/src/smart_login_button.dart @@ -9,8 +9,7 @@ class SmartLoginButton extends StatefulWidget { final SmartFhirClient client; final VoidCallback? onLoginChanged; - const SmartLoginButton(this.client, {this.onLoginChanged, Key? key}) - : super(key: key); + const SmartLoginButton(this.client, {this.onLoginChanged, super.key}); @override // ignore: library_private_types_in_public_api diff --git a/faiadashu_online/lib/restful/src/sync_indicator.dart b/faiadashu_online/lib/restful/src/sync_indicator.dart index aadd4584..df1224e1 100644 --- a/faiadashu_online/lib/restful/src/sync_indicator.dart +++ b/faiadashu_online/lib/restful/src/sync_indicator.dart @@ -6,7 +6,7 @@ import 'package:flutter/material.dart'; class SyncIndicator extends StatefulWidget { final Color? color; - const SyncIndicator({this.color, Key? key}) : super(key: key); + const SyncIndicator({this.color, super.key}); @override // ignore: library_private_types_in_public_api diff --git a/faiadashu_online/pubspec.yaml b/faiadashu_online/pubspec.yaml index 083ff27a..dc71e9a3 100644 --- a/faiadashu_online/pubspec.yaml +++ b/faiadashu_online/pubspec.yaml @@ -11,32 +11,24 @@ repository: https://github.com/tiloc/faiadashu issue_tracker: https://github.com/tiloc/faiadashu/issues environment: - sdk: '>=2.16.0 <3.0.0' + sdk: '>=2.18.4 <3.0.0' flutter: '>=2.10.0' dependencies: faiadashu: path: .. - fhir: ^0.8.0 - - fhir_at_rest: ^0.8.3 - + fhir_at_rest: ^0.8.0 fhir_auth: ^0.8.0 -# fhir_auth: -# path: ../../fhir/fhir_auth - flutter: sdk: flutter logging: ^1.0.2 - url_launcher: ^6.0.20 dev_dependencies: flutter_test: sdk: flutter - - lint: ^1.8.2 + lint: ^2.0.1 # For information on the generic Dart part of this file, see the # following page: https://dart.dev/tools/pub/pubspec diff --git a/lib/questionnaires/view/item/answer/src/coding_answer_filler.dart b/lib/questionnaires/view/item/answer/src/coding_answer_filler.dart index 9acec3a1..dec0d7f7 100644 --- a/lib/questionnaires/view/item/answer/src/coding_answer_filler.dart +++ b/lib/questionnaires/view/item/answer/src/coding_answer_filler.dart @@ -56,8 +56,8 @@ class _CodingInputControl extends AnswerInputControl { errorText ?? '', style: Theme.of(context) .textTheme - .caption - ?.copyWith(color: Theme.of(context).errorColor), + .bodySmall + ?.copyWith(color: Theme.of(context).colorScheme.error), ), ), ], @@ -123,8 +123,8 @@ class _StyledOption extends StatefulWidget { const _StyledOption( this.answerModel, this.optionModel, { - Key? key, - }) : super(key: key); + super.key, + }); @override _StyledOptionState createState() => _StyledOptionState(); diff --git a/lib/questionnaires/view/item/answer/src/numerical_answer_filler.dart b/lib/questionnaires/view/item/answer/src/numerical_answer_filler.dart index 39a04da5..90058434 100644 --- a/lib/questionnaires/view/item/answer/src/numerical_answer_filler.dart +++ b/lib/questionnaires/view/item/answer/src/numerical_answer_filler.dart @@ -133,14 +133,14 @@ class _SliderInputControl extends AnswerInputControl { Xhtml.fromRenderingString( context, lowerSliderLabel, - defaultTextStyle: Theme.of(context).textTheme.button, + defaultTextStyle: Theme.of(context).textTheme.labelLarge, ), const Expanded(child: SizedBox()), if (upperSliderLabel != null) Xhtml.fromRenderingString( context, upperSliderLabel, - defaultTextStyle: Theme.of(context).textTheme.button, + defaultTextStyle: Theme.of(context).textTheme.labelLarge, ), const SizedBox(width: 8.0), ], @@ -209,7 +209,7 @@ class _NumberFieldInputControl errorStyle: (itemModel .isCalculated) // Force display of error text on calculated item ? TextStyle( - color: Theme.of(context).errorColor, + color: Theme.of(context).colorScheme.error, ) : null, hintText: answerModel.entryFormat, @@ -271,7 +271,7 @@ class _UnitDropDown extends AnswerInputControl { width: unitWidth, child: Text( answerModel.unitChoices.first.localizedDisplay(locale), - style: Theme.of(context).textTheme.subtitle1, + style: Theme.of(context).textTheme.bodyMedium, ), ) : Container( diff --git a/lib/questionnaires/view/item/src/total_score_item.dart b/lib/questionnaires/view/item/src/total_score_item.dart index b110dcd6..77cf4936 100644 --- a/lib/questionnaires/view/item/src/total_score_item.dart +++ b/lib/questionnaires/view/item/src/total_score_item.dart @@ -107,14 +107,14 @@ class _TotalScoreItemState extends State { const SizedBox(height: 32), Text( FDashLocalizations.of(context).aggregationTotalScoreTitle, - style: Theme.of(context).textTheme.headline3, + style: Theme.of(context).textTheme.displaySmall, ), AnimatedSwitcher( duration: const Duration(milliseconds: 200), child: Text( scoreText, key: ValueKey(scoreText), - style: Theme.of(context).textTheme.headline1, + style: Theme.of(context).textTheme.displayLarge, ), ), AnimatedSwitcher( diff --git a/lib/questionnaires/view/src/broken_questionnaire_item.dart b/lib/questionnaires/view/src/broken_questionnaire_item.dart index cac14289..50d2510c 100644 --- a/lib/questionnaires/view/src/broken_questionnaire_item.dart +++ b/lib/questionnaires/view/src/broken_questionnaire_item.dart @@ -15,12 +15,12 @@ class BrokenQuestionnaireItem extends StatelessWidget { this.message, this.element, this.cause, { - Key? key, - }) : super(key: key); + super.key, + }); /// Construct the item from an exception. /// Special support for [QuestionnaireFormatException]. - BrokenQuestionnaireItem.fromException(Object exception, {Key? key}) + BrokenQuestionnaireItem.fromException(Object exception, {super.key}) : message = (exception is QuestionnaireFormatException) ? exception.message : exception.toString(), @@ -29,13 +29,12 @@ class BrokenQuestionnaireItem extends StatelessWidget { : null, cause = (exception is QuestionnaireFormatException) ? exception.cause - : null, - super(key: key); + : null; @override Widget build(BuildContext context) { return Card( - color: Theme.of(context).errorColor, + color: Theme.of(context).colorScheme.error, child: Container( padding: const EdgeInsets.all(8), child: Column( diff --git a/lib/questionnaires/view/src/narrative_drawer.dart b/lib/questionnaires/view/src/narrative_drawer.dart index 30cc0038..7a651fc6 100644 --- a/lib/questionnaires/view/src/narrative_drawer.dart +++ b/lib/questionnaires/view/src/narrative_drawer.dart @@ -55,7 +55,7 @@ class _NarrativeDrawerState extends State { !_drawerMode ? FDashLocalizations.of(context).narrativePageTitle : 'FHIR R4 JSON', - style: Theme.of(context).textTheme.headline5, + style: Theme.of(context).textTheme.headlineSmall, ), secondary: IconButton( icon: const Icon(Icons.copy), diff --git a/lib/questionnaires/view/src/narrative_page.dart b/lib/questionnaires/view/src/narrative_page.dart index 6ab948af..c10fc545 100644 --- a/lib/questionnaires/view/src/narrative_page.dart +++ b/lib/questionnaires/view/src/narrative_page.dart @@ -15,8 +15,8 @@ class NarrativePage extends StatelessWidget { const NarrativePage({ this.questionnaireResponseModel, this.narrative, - Key? key, - }) : super(key: key); + super.key, + }); @override Widget build(BuildContext context) { diff --git a/lib/questionnaires/view/src/narrative_tile.dart b/lib/questionnaires/view/src/narrative_tile.dart index 9979cc2c..51ae96a8 100644 --- a/lib/questionnaires/view/src/narrative_tile.dart +++ b/lib/questionnaires/view/src/narrative_tile.dart @@ -22,8 +22,8 @@ class NarrativeTile extends StatefulWidget { const NarrativeTile({ this.questionnaireResponseModel, this.narrative, - Key? key, - }) : super(key: key); + super.key, + }); @override State createState() => _NarrativeTileState(); diff --git a/lib/questionnaires/view/src/questionnaire_complete_button.dart b/lib/questionnaires/view/src/questionnaire_complete_button.dart index 3c3f0366..a460da52 100644 --- a/lib/questionnaires/view/src/questionnaire_complete_button.dart +++ b/lib/questionnaires/view/src/questionnaire_complete_button.dart @@ -11,8 +11,7 @@ import 'package:flutter/material.dart'; class QuestionnaireCompleteButton extends StatefulWidget { final VoidCallback? onCompleted; - const QuestionnaireCompleteButton({this.onCompleted, Key? key}) - : super(key: key); + const QuestionnaireCompleteButton({this.onCompleted, super.key}); @override // ignore: library_private_types_in_public_api diff --git a/lib/questionnaires/view/src/questionnaire_filler.dart b/lib/questionnaires/view/src/questionnaire_filler.dart index 82bc0973..ebf4f768 100644 --- a/lib/questionnaires/view/src/questionnaire_filler.dart +++ b/lib/questionnaires/view/src/questionnaire_filler.dart @@ -35,7 +35,7 @@ class QuestionnaireResponseFiller extends StatefulWidget { ); const QuestionnaireResponseFiller({ - Key? key, + super.key, required this.locale, required this.builder, required this.fhirResourceProvider, @@ -45,7 +45,7 @@ class QuestionnaireResponseFiller extends StatefulWidget { this.onLinkTap, this.questionnaireTheme = const QuestionnaireThemeData(), this.questionnaireModelDefaults = const QuestionnaireModelDefaults(), - }) : super(key: key); + }); static QuestionnaireFillerData of(BuildContext context) { final result = @@ -205,7 +205,6 @@ class QuestionnaireFillerData extends InheritedWidget { QuestionnaireFillerData._( this.questionnaireResponseModel, { - Key? key, required this.locale, this.onDataAvailable, this.onLinkTap, @@ -217,7 +216,7 @@ class QuestionnaireFillerData extends InheritedWidget { questionnaireResponseModel.orderedFillerItemModels().length, null, ), - super(key: key, child: Builder(builder: builder)) { + super(child: Builder(builder: builder)) { _logger.trace('constructor _'); onDataAvailable?.call(questionnaireResponseModel); } diff --git a/lib/questionnaires/view/src/questionnaire_filler_progress_bar.dart b/lib/questionnaires/view/src/questionnaire_filler_progress_bar.dart index 91f31161..824910d5 100644 --- a/lib/questionnaires/view/src/questionnaire_filler_progress_bar.dart +++ b/lib/questionnaires/view/src/questionnaire_filler_progress_bar.dart @@ -13,8 +13,8 @@ class QuestionnaireFillerProgressBar extends StatelessWidget { this.height = defaultHeight, this.answeredColor, this.unansweredColor, - Key? key, - }) : super(key: key); + super.key, + }); @override Widget build(BuildContext context) { diff --git a/lib/questionnaires/view/src/questionnaire_information_tile.dart b/lib/questionnaires/view/src/questionnaire_information_tile.dart index bbaa6661..5bfd5a7d 100644 --- a/lib/questionnaires/view/src/questionnaire_information_tile.dart +++ b/lib/questionnaires/view/src/questionnaire_information_tile.dart @@ -8,12 +8,11 @@ import 'package:flutter/material.dart'; /// Contains information such as title and publisher. class QuestionnaireInformationTile extends StatelessWidget { final Questionnaire questionnaire; - const QuestionnaireInformationTile(this.questionnaire, {Key? key}) - : super(key: key); + const QuestionnaireInformationTile(this.questionnaire, {super.key}); @override Widget build(BuildContext context) { - final defaultTextStyle = Theme.of(context).textTheme.subtitle1; + final defaultTextStyle = Theme.of(context).textTheme.titleMedium; return Column( children: [ diff --git a/lib/questionnaires/view/src/questionnaire_loading_indicator.dart b/lib/questionnaires/view/src/questionnaire_loading_indicator.dart index 90fea7a1..d1e4ffc7 100644 --- a/lib/questionnaires/view/src/questionnaire_loading_indicator.dart +++ b/lib/questionnaires/view/src/questionnaire_loading_indicator.dart @@ -10,13 +10,12 @@ class QuestionnaireLoadingIndicator extends StatelessWidget { QuestionnaireLoadingIndicator( AsyncSnapshot snapshot, { - Key? key, + super.key, }) : state = snapshot.connectionState, hasError = snapshot.hasError, detail = (snapshot.hasData) ? snapshot.data?.questionnaireModel.title - : snapshot.error, - super(key: key); + : snapshot.error; @override Widget build(BuildContext context) { @@ -47,7 +46,7 @@ class QuestionnaireLoadingIndicator extends StatelessWidget { if (detail != null) Text( detail.toString(), - style: Theme.of(context).textTheme.subtitle1, + style: Theme.of(context).textTheme.titleMedium, ), ], ), diff --git a/lib/questionnaires/view/src/questionnaire_scroller_page.dart b/lib/questionnaires/view/src/questionnaire_scroller_page.dart index c3cd388c..7ce0d7b4 100644 --- a/lib/questionnaires/view/src/questionnaire_scroller_page.dart +++ b/lib/questionnaires/view/src/questionnaire_scroller_page.dart @@ -24,8 +24,8 @@ class QuestionnaireScrollerPage extends StatelessWidget { this.aggregators, this.onLinkTap, this.questionnaireModelDefaults = const QuestionnaireModelDefaults(), - Key? key, - }) : super(key: key); + super.key, + }); @override Widget build(BuildContext context) { diff --git a/lib/questionnaires/view/src/questionnaire_stepper.dart b/lib/questionnaires/view/src/questionnaire_stepper.dart index 6e1a70a1..d192ac47 100644 --- a/lib/questionnaires/view/src/questionnaire_stepper.dart +++ b/lib/questionnaires/view/src/questionnaire_stepper.dart @@ -18,8 +18,8 @@ class QuestionnaireStepper extends StatefulWidget { required this.fhirResourceProvider, required this.launchContext, this.questionnaireModelDefaults = const QuestionnaireModelDefaults(), - Key? key, - }) : super(key: key); + super.key, + }); @override State createState() => QuestionnaireStepperState(); @@ -88,7 +88,8 @@ class QuestionnaireStepperState extends State { FDashLocalizations.of(context) .aggregationScore(scoreString), key: ValueKey(scoreString), - style: Theme.of(context).textTheme.headline4, + style: + Theme.of(context).textTheme.headlineMedium, ), ); }, diff --git a/lib/questionnaires/view/src/questionnaire_stepper_page.dart b/lib/questionnaires/view/src/questionnaire_stepper_page.dart index 2107bb7e..790139f0 100644 --- a/lib/questionnaires/view/src/questionnaire_stepper_page.dart +++ b/lib/questionnaires/view/src/questionnaire_stepper_page.dart @@ -8,19 +8,13 @@ import 'package:flutter/material.dart'; /// see [QuestionnaireScrollerPage] class QuestionnaireStepperPage extends QuestionnaireStepper { const QuestionnaireStepperPage({ - Locale? locale, - required FhirResourceProvider fhirResourceProvider, - required LaunchContext launchContext, - QuestionnaireModelDefaults questionnaireModelDefaults = - const QuestionnaireModelDefaults(), - Key? key, + super.locale, + required super.fhirResourceProvider, + required super.launchContext, + super.questionnaireModelDefaults, + super.key, }) : super( - locale: locale, scaffoldBuilder: const DefaultQuestionnairePageScaffoldBuilder(), - fhirResourceProvider: fhirResourceProvider, - launchContext: launchContext, - questionnaireModelDefaults: questionnaireModelDefaults, - key: key, ); @override diff --git a/lib/questionnaires/view/src/questionnaire_theme.dart b/lib/questionnaires/view/src/questionnaire_theme.dart index d6c5967c..ae8a7c18 100644 --- a/lib/questionnaires/view/src/questionnaire_theme.dart +++ b/lib/questionnaires/view/src/questionnaire_theme.dart @@ -17,9 +17,9 @@ class QuestionnaireTheme extends InheritedWidget { const QuestionnaireTheme({ required this.data, - required Widget child, - Key? key, - }) : super(key: key, child: child); + required super.child, + super.key, + }); static QuestionnaireThemeData of(BuildContext context) { final inheritedTheme = diff --git a/lib/questionnaires/view/src/webview_html.dart b/lib/questionnaires/view/src/webview_html.dart index c660f595..ce2ee66b 100644 --- a/lib/questionnaires/view/src/webview_html.dart +++ b/lib/questionnaires/view/src/webview_html.dart @@ -12,22 +12,25 @@ Widget createWebView(String xhtml, {Key? key}) => _FullHtmlViewer( class _FullHtmlViewer extends StatelessWidget { final String xhtml; - const _FullHtmlViewer(this.xhtml, {Key? key}) : super(key: key); + const _FullHtmlViewer(this.xhtml, {super.key}); @override Widget build(BuildContext context) { - // required while web support is in preview - WebView.platform = WebWebViewPlatform(); - final dataUrl = Uri.dataFromString( xhtml, mimeType: 'text/html', encoding: Encoding.getByName('utf-8'), ).toString(); + ; + return SizedBox.expand( - child: WebView( - initialUrl: dataUrl, + child: WebViewWidget( + controller: WebViewController.fromPlatformCreationParams( + const PlatformWebViewControllerCreationParams(), + )..loadRequest( + Uri.parse(dataUrl), + ), ), ); } diff --git a/lib/questionnaires/view/src/webview_io.dart b/lib/questionnaires/view/src/webview_io.dart index 138b4d35..ed9436de 100644 --- a/lib/questionnaires/view/src/webview_io.dart +++ b/lib/questionnaires/view/src/webview_io.dart @@ -19,7 +19,7 @@ Widget createWebView(String xhtml, {Key? key}) => class _FullHtmlViewer extends StatelessWidget { final String xhtml; - const _FullHtmlViewer(this.xhtml, {Key? key}) : super(key: key); + const _FullHtmlViewer(this.xhtml, {super.key}); @override Widget build(BuildContext context) { @@ -30,8 +30,11 @@ class _FullHtmlViewer extends StatelessWidget { ).toString(); return SizedBox.expand( - child: WebView( - initialUrl: dataUrl, + child: WebViewWidget( + controller: WebViewController() + ..loadRequest( + Uri.parse(dataUrl), + ), ), ); } @@ -40,7 +43,7 @@ class _FullHtmlViewer extends StatelessWidget { class _SimpleHtmlViewer extends StatelessWidget { final String xhtml; - const _SimpleHtmlViewer(this.xhtml, {Key? key}) : super(key: key); + const _SimpleHtmlViewer(this.xhtml, {super.key}); @override Widget build(BuildContext context) { @@ -49,7 +52,7 @@ class _SimpleHtmlViewer extends StatelessWidget { child: HTML.toRichText( context, xhtml, - defaultTextStyle: Theme.of(context).textTheme.bodyText2, + defaultTextStyle: Theme.of(context).textTheme.bodyMedium, ), ), ); diff --git a/lib/questionnaires/view/src/xhtml.dart b/lib/questionnaires/view/src/xhtml.dart index 037a9192..9a3c91da 100644 --- a/lib/questionnaires/view/src/xhtml.dart +++ b/lib/questionnaires/view/src/xhtml.dart @@ -124,7 +124,7 @@ class Xhtml extends StatelessWidget { context, xhtml, defaultTextStyle: - defaultTextStyle ?? Theme.of(context).textTheme.bodyText2, + defaultTextStyle ?? Theme.of(context).textTheme.bodyMedium, ), ), ); diff --git a/pubspec.yaml b/pubspec.yaml index 71e172a6..c623fd0f 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -20,11 +20,11 @@ repository: https://github.com/tiloc/faiadashu issue_tracker: https://github.com/tiloc/faiadashu/issues environment: - sdk: '>=2.17.0 <3.0.0' + sdk: '>=2.18.4 <3.0.0' flutter: '>=3.0.0' dependencies: - collection: ^1.16.0 + collection: ^1.17.0 fhir: ^0.8.0 fhir_path: ^0.8.0 # fhir: @@ -37,20 +37,22 @@ dependencies: sdk: flutter intl: ^0.17.0 logging: ^1.0.2 - markdown: ^5.0.0 + markdown: ^7.0.0 meta: ^1.7.0 scrollable_positioned_list: ^0.3.2 - simple_html_css: ^3.0.1+1 - webview_flutter: ^3.0.4 - webview_flutter_web: ^0.1.0+3 + simple_html_css: ^4.0.0 + webview_flutter: ^4.0.0 + webview_flutter_platform_interface: ^2.0.0 + webview_flutter_web: ^0.2.0 + dev_dependencies: - dart_code_metrics: ^4.15.0 + dart_code_metrics: ^5.0.0 flutter_test: sdk: flutter - lint: ^1.8.2 + lint: ^2.0.1 # For information on the generic Dart part of this file, see the # following page: https://dart.dev/tools/pub/pubspec From 627011ecb845a5f97ebc64068e7f59a8429977d3 Mon Sep 17 00:00:00 2001 From: sh1l0n Date: Wed, 26 Apr 2023 15:11:17 +0200 Subject: [PATCH 02/12] Clean up all warnings except FIXME --- analysis_options.yaml | 1 - example/lib/about_page.dart | 2 +- example/lib/cherry_blossom_theme.dart | 108 +++++++++--------- example/lib/observation_page.dart | 18 +-- example/lib/primitive_page.dart | 22 ++-- example/lib/questionnaire_launch_tile.dart | 34 +++--- .../lib/questionnaire_response_storage.dart | 57 ++++----- example/lib/value_set_provider.dart | 32 +++--- faiabench/analysis_options.yaml | 1 - faiabench/lib/about_page.dart | 4 +- faiabench/lib/disclaimer_page.dart | 2 +- faiabench/lib/exhibit_page.dart | 2 +- faiabench/lib/json_tree.dart | 2 +- faiabench/lib/main.dart | 2 +- .../lib/questionnaire_scroller_panel.dart | 4 +- .../lib/restful/src/server_uploader.dart | 33 +++--- .../lib/restful/src/sync_indicator.dart | 4 +- lib/fhir_types/src/base64_image.dart | 6 +- lib/fhir_types/src/codeable_concept_text.dart | 4 +- lib/fhir_types/src/date_time_picker.dart | 7 +- lib/fhir_types/src/date_time_text.dart | 4 +- lib/fhir_types/src/fhir_types_extensions.dart | 6 +- lib/fhir_types/src/resource_json_tree.dart | 73 +++++------- lib/l10n/src/fdash_localizations_ar.dart | 2 +- lib/l10n/src/fdash_localizations_de.dart | 2 +- lib/l10n/src/fdash_localizations_en.dart | 2 +- lib/l10n/src/fdash_localizations_es.dart | 2 +- lib/l10n/src/fdash_localizations_ja.dart | 2 +- .../src/observation_value_view.dart | 2 +- .../model/aggregation/src/aggregator.dart | 2 +- .../src/fhirpath_expression_evaluator.dart | 2 +- .../model/src/questionnaire_model.dart | 2 +- .../answer/src/boolean_answer_filler.dart | 15 +-- .../item/answer/src/coding_answer_filler.dart | 89 +++++---------- .../answer/src/datetime_answer_filler.dart | 11 +- .../view/item/answer/src/null_dash_text.dart | 6 +- .../answer/src/numerical_answer_filler.dart | 31 ++--- .../item/answer/src/string_answer_filler.dart | 15 +-- .../view/item/src/display_item.dart | 8 +- .../view/item/src/group_item.dart | 15 +-- .../view/item/src/item_media_image.dart | 2 +- .../src/question_response_item_filler.dart | 5 +- .../item/src/questionnaire_item_filler.dart | 5 +- .../src/questionnaire_item_filler_title.dart | 20 ++-- .../view/item/src/total_score_item.dart | 6 +- .../view/src/broken_questionnaire_item.dart | 4 +- .../view/src/narrative_drawer.dart | 2 +- ...uestionnaire_filler_circular_progress.dart | 4 +- .../view/src/questionnaire_scroller.dart | 4 +- .../view/src/questionnaire_stepper_page.dart | 1 - lib/questionnaires/view/src/webview_html.dart | 3 - 51 files changed, 312 insertions(+), 380 deletions(-) diff --git a/analysis_options.yaml b/analysis_options.yaml index 2cd897da..7294a00d 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -32,6 +32,5 @@ dart_code_metrics: - prefer-trailing-comma - prefer-conditional-expressions - no-equal-then-else - - no-magic-number - prefer-single-widget-per-file: ignore-private-widgets: true diff --git a/example/lib/about_page.dart b/example/lib/about_page.dart index 0ae3f6d3..4f09c34a 100644 --- a/example/lib/about_page.dart +++ b/example/lib/about_page.dart @@ -4,7 +4,7 @@ import 'package:simple_html_css/simple_html_css.dart'; import 'exhibit_page.dart'; class AboutPage extends ExhibitPage { - const AboutPage({Key? key}) : super(key: key); + const AboutPage({super.key}); @override Widget buildExhibit(BuildContext context) { diff --git a/example/lib/cherry_blossom_theme.dart b/example/lib/cherry_blossom_theme.dart index 732baa8d..98042fb3 100644 --- a/example/lib/cherry_blossom_theme.dart +++ b/example/lib/cherry_blossom_theme.dart @@ -9,22 +9,22 @@ class CherryBlossomScaffoldBuilder extends QuestionnairePageScaffoldBuilder { @override Widget build( - BuildContext context, { - required void Function(void Function() p1) setStateCallback, - required Widget child, - }) { + BuildContext context, { + required void Function(void Function() p1) setStateCallback, + required Widget child, + }) { return Theme( data: ThemeData.light().copyWith( scrollbarTheme: ThemeData.light().scrollbarTheme.copyWith( - thumbVisibility: MaterialStateProperty.all(true), - thumbColor: MaterialStateProperty.all( - const Color(0xFF5C1349), - ), - ), + thumbVisibility: MaterialStateProperty.all(true), + thumbColor: MaterialStateProperty.all( + const Color(0xFF5C1349), + ), + ), textTheme: GoogleFonts.ralewayTextTheme(), iconTheme: ThemeData.light().iconTheme.copyWith( - color: const Color(0xFF5C1349), - ), + color: const Color(0xFF5C1349), + ), elevatedButtonTheme: ElevatedButtonThemeData( style: ButtonStyle( textStyle: MaterialStateProperty.all( @@ -41,52 +41,52 @@ class CherryBlossomScaffoldBuilder extends QuestionnairePageScaffoldBuilder { ), ), checkboxTheme: ThemeData.light().checkboxTheme.copyWith( - fillColor: MaterialStateProperty.all( - const Color(0xFFE30425), - ), - ), - radioTheme: ThemeData.light().radioTheme.copyWith( - fillColor: MaterialStateProperty.all( - const Color(0xFFE30425), - ), - ), - sliderTheme: ThemeData.light().sliderTheme.copyWith( - thumbColor: const Color(0xFFE30425), - activeTrackColor: const Color(0xFFE30425), - inactiveTrackColor: const Color(0x60E30425), - ), - inputDecorationTheme: ThemeData.light().inputDecorationTheme.copyWith( - enabledBorder: const OutlineInputBorder( - borderSide: BorderSide( - width: 2.0, - color: Color.fromRGBO(0, 0, 0, 0.12), - ), - ), - disabledBorder: const OutlineInputBorder( - borderSide: BorderSide( - width: 0, - color: Color.fromRGBO(0, 0, 0, 0.0), + fillColor: MaterialStateProperty.all( + const Color(0xFFE30425), + ), ), - ), - focusedErrorBorder: OutlineInputBorder( - borderSide: BorderSide( - width: 2.0, - color: ThemeData.light().errorColor, + radioTheme: ThemeData.light().radioTheme.copyWith( + fillColor: MaterialStateProperty.all( + const Color(0xFFE30425), + ), ), - ), - errorBorder: OutlineInputBorder( - borderSide: BorderSide( - width: 2.0, - color: ThemeData.light().errorColor.withOpacity(0.12), + sliderTheme: ThemeData.light().sliderTheme.copyWith( + thumbColor: const Color(0xFFE30425), + activeTrackColor: const Color(0xFFE30425), + inactiveTrackColor: const Color(0x60E30425), ), - ), - focusedBorder: const OutlineInputBorder( - borderSide: BorderSide( - width: 2.0, - color: Color.fromRGBO(0, 0, 0, 0.54), + inputDecorationTheme: ThemeData.light().inputDecorationTheme.copyWith( + enabledBorder: const OutlineInputBorder( + borderSide: BorderSide( + width: 2.0, + color: Color.fromRGBO(0, 0, 0, 0.12), + ), + ), + disabledBorder: const OutlineInputBorder( + borderSide: BorderSide( + width: 0, + color: Color.fromRGBO(0, 0, 0, 0.0), + ), + ), + focusedErrorBorder: OutlineInputBorder( + borderSide: BorderSide( + width: 2.0, + color: ThemeData.light().colorScheme.error, + ), + ), + errorBorder: OutlineInputBorder( + borderSide: BorderSide( + width: 2.0, + color: ThemeData.light().colorScheme.error.withOpacity(0.12), + ), + ), + focusedBorder: const OutlineInputBorder( + borderSide: BorderSide( + width: 2.0, + color: Color.fromRGBO(0, 0, 0, 0.54), + ), + ), ), - ), - ), ), // Make it always light // We have to take care of SafeArea ourselves child: SafeArea( @@ -101,7 +101,7 @@ class CherryBlossomScaffoldBuilder extends QuestionnairePageScaffoldBuilder { padding: const EdgeInsets.symmetric(vertical: 8), child: Text( '🦄🌸🦄🌸🦄🌸🦄', - style: Theme.of(context).textTheme.headline4, + style: Theme.of(context).textTheme.headlineMedium, ), ), Expanded( diff --git a/example/lib/observation_page.dart b/example/lib/observation_page.dart index 535e4cf6..6b3c1bb0 100644 --- a/example/lib/observation_page.dart +++ b/example/lib/observation_page.dart @@ -103,27 +103,27 @@ class ObservationPage extends ExhibitPage { children: [ ObservationView( bpObservation, - valueStyle: Theme.of(context).textTheme.headline4, - codeStyle: Theme.of(context).textTheme.subtitle2, - dateTimeStyle: Theme.of(context).textTheme.caption, + valueStyle: Theme.of(context).textTheme.headlineMedium, + codeStyle: Theme.of(context).textTheme.titleSmall, + dateTimeStyle: Theme.of(context).textTheme.bodySmall, ), const SizedBox( height: 16, ), ObservationView( bpObservationWHR, - valueStyle: Theme.of(context).textTheme.headline4, - codeStyle: Theme.of(context).textTheme.subtitle2, - dateTimeStyle: Theme.of(context).textTheme.caption, + valueStyle: Theme.of(context).textTheme.headlineMedium, + codeStyle: Theme.of(context).textTheme.titleSmall, + dateTimeStyle: Theme.of(context).textTheme.bodySmall, ), const SizedBox( height: 16, ), ObservationView( bpObservationWHR, - valueStyle: Theme.of(context).textTheme.headline4, - codeStyle: Theme.of(context).textTheme.subtitle2, - dateTimeStyle: Theme.of(context).textTheme.caption, + valueStyle: Theme.of(context).textTheme.headlineMedium, + codeStyle: Theme.of(context).textTheme.titleSmall, + dateTimeStyle: Theme.of(context).textTheme.bodySmall, locale: const Locale.fromSubtags(languageCode: 'ar', countryCode: 'BH'), ), diff --git a/example/lib/primitive_page.dart b/example/lib/primitive_page.dart index d267357e..a9abb538 100644 --- a/example/lib/primitive_page.dart +++ b/example/lib/primitive_page.dart @@ -5,37 +5,41 @@ import 'package:flutter/material.dart'; import 'exhibit_page.dart'; class PrimitivePage extends ExhibitPage { - const PrimitivePage({Key? key}) : super(key: key); + const PrimitivePage({super.key}); @override Widget buildExhibit(BuildContext context) { return Column( children: [ - Text('Default locale', style: Theme.of(context).textTheme.headline6), + Text('Default locale', style: Theme.of(context).textTheme.titleLarge), FhirDateTimeText(FhirDateTime('2002-02-05')), FhirDateTimeText(FhirDateTime('2010-02-05 14:02')), FhirDateTimeText(FhirDateTime('2010-02')), const Spacer(), - Text('Germany', style: Theme.of(context).textTheme.headline6), + Text('Germany', style: Theme.of(context).textTheme.titleLarge), FhirDateTimeText( FhirDateTime('2010-02-05 14:02'), - locale: const Locale.fromSubtags(languageCode: 'de', countryCode: 'DE'), + locale: + const Locale.fromSubtags(languageCode: 'de', countryCode: 'DE'), ), const Spacer(), - Text('Japan', style: Theme.of(context).textTheme.headline6), + Text('Japan', style: Theme.of(context).textTheme.titleLarge), FhirDateTimeText( FhirDateTime('2010-02'), - locale: const Locale.fromSubtags(languageCode: 'ja', countryCode: 'JP'), + locale: + const Locale.fromSubtags(languageCode: 'ja', countryCode: 'JP'), ), FhirDateTimeText( FhirDateTime('2010-02-05 14:02'), - locale: const Locale.fromSubtags(languageCode: 'ja', countryCode: 'JP'), + locale: + const Locale.fromSubtags(languageCode: 'ja', countryCode: 'JP'), ), const Spacer(), - Text('Bahrain', style: Theme.of(context).textTheme.headline6), + Text('Bahrain', style: Theme.of(context).textTheme.titleLarge), FhirDateTimeText( FhirDateTime('2010-02-05 14:02'), - locale: const Locale.fromSubtags(languageCode: 'ar', countryCode: 'BH'), + locale: + const Locale.fromSubtags(languageCode: 'ar', countryCode: 'BH'), ), ], ); diff --git a/example/lib/questionnaire_launch_tile.dart b/example/lib/questionnaire_launch_tile.dart index d8f04e96..257e8c59 100644 --- a/example/lib/questionnaire_launch_tile.dart +++ b/example/lib/questionnaire_launch_tile.dart @@ -15,11 +15,17 @@ class QuestionnaireLaunchTile extends StatefulWidget { final Locale? locale; final FhirResourceProvider fhirResourceProvider; final LaunchContext launchContext; - final void Function(String questionnairePath, QuestionnaireResponse? questionnaireResponse) - saveResponseFunction; - final void Function(BuildContext context, String questionnairePath, QuestionnaireResponse? questionnaireResponse)? - uploadResponseFunction; - final QuestionnaireResponse? Function(String questionnairePath) restoreResponseFunction; + final void Function( + String questionnairePath, + QuestionnaireResponse? questionnaireResponse, + ) saveResponseFunction; + final void Function( + BuildContext context, + String questionnairePath, + QuestionnaireResponse? questionnaireResponse, + )? uploadResponseFunction; + final QuestionnaireResponse? Function(String questionnairePath) + restoreResponseFunction; final QuestionnaireModelDefaults questionnaireModelDefaults; @@ -34,8 +40,8 @@ class QuestionnaireLaunchTile extends StatefulWidget { this.uploadResponseFunction, required this.restoreResponseFunction, this.questionnaireModelDefaults = const QuestionnaireModelDefaults(), - Key? key, - }) : super(key: key); + super.key, + }); @override // ignore: library_private_types_in_public_api @@ -89,13 +95,13 @@ class _QuestionnaireLaunchTileState extends State { var countString = ''; if (snapshot.hasData) { // FIXME: Sometimes these stats are not being shown. Handle snapshot error. - final _questionnaireResponseModel = snapshot.data!; - final _numberCompleted = - _questionnaireResponseModel.count((rim) => rim.isAnswered); - final _totalNumber = - _questionnaireResponseModel.count((rim) => rim.isAnswerable); - countString = 'Completed: $_numberCompleted / $_totalNumber ' - '(${_percentPattern.format(_numberCompleted / _totalNumber)})'; + final questionnaireResponseModel = snapshot.data!; + final numberCompleted = + questionnaireResponseModel.count((rim) => rim.isAnswered); + final totalNumber = + questionnaireResponseModel.count((rim) => rim.isAnswerable); + countString = 'Completed: $numberCompleted / $totalNumber ' + '(${_percentPattern.format(numberCompleted / totalNumber)})'; } return (widget.subtitle != null) diff --git a/example/lib/questionnaire_response_storage.dart b/example/lib/questionnaire_response_storage.dart index 65718c44..524fd497 100644 --- a/example/lib/questionnaire_response_storage.dart +++ b/example/lib/questionnaire_response_storage.dart @@ -21,28 +21,31 @@ class QuestionnaireResponseStorage { final SmartFhirClient smartClient; - QuestionnaireResponseStorage({required this.fhirUri, required this.clientId, required this.redirectUri}) : - smartClient = SmartFhirClient( - fhirUri: fhirUri, - clientId: clientId, - redirectUri: redirectUri, - scopes: Scopes( - clinicalScopes: [ - ClinicalScope( - Role.patient, - R4ResourceType.Patient, - Interaction.any, - ), - ClinicalScope( - Role.patient, - R4ResourceType.QuestionnaireResponse, - Interaction.any, - ), - ], - openid: true, - offlineAccess: true, - ).scopesList(), - ); + QuestionnaireResponseStorage( + {required this.fhirUri, + required this.clientId, + required this.redirectUri}) + : smartClient = SmartFhirClient( + fhirUri: fhirUri, + clientId: clientId, + redirectUri: redirectUri, + scopes: Scopes( + clinicalScopes: [ + ClinicalScope( + Role.patient, + R4ResourceType.Patient, + Interaction.any, + ), + ClinicalScope( + Role.patient, + R4ResourceType.QuestionnaireResponse, + Interaction.any, + ), + ], + openid: true, + offlineAccess: true, + ).scopesList(), + ); final Map _savedResponses = {}; @@ -66,17 +69,17 @@ class QuestionnaireResponseStorage { // Upload of QuestionnaireResponse to server (plus saves in-memory). Future uploadToServer( - BuildContext context, - String questionnairePath, - QuestionnaireResponse? questionnaireResponse, - ) async { + BuildContext context, + String questionnairePath, + QuestionnaireResponse? questionnaireResponse, + ) async { if (questionnaireResponse == null) { return null; } try { // Upload will also save locally. final updatedQuestionnaireResponse = - await createOrUpdateQuestionnaireResponse( + await createOrUpdateQuestionnaireResponse( smartClient, questionnaireResponse, ); diff --git a/example/lib/value_set_provider.dart b/example/lib/value_set_provider.dart index 5e769315..ffb4e220 100644 --- a/example/lib/value_set_provider.dart +++ b/example/lib/value_set_provider.dart @@ -9,36 +9,36 @@ import 'package:faiadashu/resource_provider/resource_provider.dart'; // This mechanism allows to add them from other sources. final valueSetProvider = AssetResourceProvider.fromMap({ 'http://hl7.org/fhir/ValueSet/administrative-gender': - 'assets/valuesets/fhir_valueset_administrative_gender.json', + 'assets/valuesets/fhir_valueset_administrative_gender.json', 'http://hl7.org/fhir/administrative-gender': - 'assets/codesystems/fhir_codesystem_administrative_gender.json', + 'assets/codesystems/fhir_codesystem_administrative_gender.json', 'http://hl7.org/fhir/ValueSet/ucum-bodyweight': - 'assets/valuesets/ucum_bodyweight.json', + 'assets/valuesets/ucum_bodyweight.json', 'http://hl7.org/fhir/ValueSet/iso3166-1-2': - 'assets/valuesets/fhir_valueset_iso3166_1_2.json', + 'assets/valuesets/fhir_valueset_iso3166_1_2.json', 'http://openhie.github.io/covid-19/ValueSet/WhoCrValueSetYesNoUnk': - 'assets/valuesets/who_cr_valueset_yes_no_unknown.json', + 'assets/valuesets/who_cr_valueset_yes_no_unknown.json', 'http://openhie.github.io/covid-19/ValueSet/WhoCrValueSetSexAtBirth': - 'assets/valuesets/who_cr_valueset_sex_at_birth.json', + 'assets/valuesets/who_cr_valueset_sex_at_birth.json', 'http://openhie.github.io/covid-19/ValueSet/WhoCrValueSetAgeUnits': - 'assets/valuesets/who_cr_valueset_age_units.json', + 'assets/valuesets/who_cr_valueset_age_units.json', 'http://loinc.org/vs/LL715-4': 'assets/valuesets/loinc_ll715_4.json', 'http://openhie.github.io/covid-19/ValueSet/WhoCrValueSetPregnancyTrimester': - 'assets/valuesets/who_cr_valueset_pregnancy_trimester.json', + 'assets/valuesets/who_cr_valueset_pregnancy_trimester.json', 'http://openhie.github.io/covid-19/ValueSet/WhoCrValueSetAdmin1': - 'assets/valuesets/who_cr_valueset_admin_1.json', + 'assets/valuesets/who_cr_valueset_admin_1.json', 'http://openhie.github.io/covid-19/ValueSet/WhoCrValueSetPatientOutcome': - 'assets/valuesets/who_cr_valueset_patient_outcome.json', + 'assets/valuesets/who_cr_valueset_patient_outcome.json', 'http://openhie.github.io/covid-19/ValueSet/WhoCrValueSetTestResult': - 'assets/valuesets/who_cr_valueset_test_result.json', + 'assets/valuesets/who_cr_valueset_test_result.json', 'http://openhie.github.io/covid-19/CodeSystem/WhoCrCodeSystemPatientOutcome': - 'assets/codesystems/who_cr_codesystem_patient_outcome.json', + 'assets/codesystems/who_cr_codesystem_patient_outcome.json', 'http://openhie.github.io/covid-19/CodeSystem/WhoCrCodeSystemPregnancyTrimester': - 'assets/codesystems/who_cr_codesystem_pregnancy_trimester.json', + 'assets/codesystems/who_cr_codesystem_pregnancy_trimester.json', 'http://openhie.github.io/covid-19/CodeSystem/WhoCrCodeSystemQuestionnaireChoice': - 'assets/codesystems/who_cr_codesystem_questionnaire_choice.json', + 'assets/codesystems/who_cr_codesystem_questionnaire_choice.json', 'http://openhie.github.io/covid-19/CodeSystem/WhoCrCodeSystemReasonForTesting': - 'assets/codesystems/who_cr_codesystem_reason_for_testing.json', + 'assets/codesystems/who_cr_codesystem_reason_for_testing.json', 'http://openhie.github.io/covid-19/CodeSystem/WhoCrCodeSystemComorbidity': - 'assets/codesystems/who_cr_codesystem_comorbidity.json', + 'assets/codesystems/who_cr_codesystem_comorbidity.json', }); diff --git a/faiabench/analysis_options.yaml b/faiabench/analysis_options.yaml index 4bfe580e..f7bb6f7d 100644 --- a/faiabench/analysis_options.yaml +++ b/faiabench/analysis_options.yaml @@ -28,7 +28,6 @@ dart_code_metrics: - prefer-trailing-comma - prefer-conditional-expressions - no-equal-then-else - - no-magic-number - prefer-single-widget-per-file: ignore-private-widgets: true anti-patterns: diff --git a/faiabench/lib/about_page.dart b/faiabench/lib/about_page.dart index 438b8967..baeea61a 100644 --- a/faiabench/lib/about_page.dart +++ b/faiabench/lib/about_page.dart @@ -3,7 +3,7 @@ import 'package:flutter/material.dart'; import 'package:simple_html_css/simple_html_css.dart'; class AboutPage extends ExhibitPage { - const AboutPage({Key? key}) : super(key: key); + const AboutPage({super.key}); @override Widget buildExhibit(BuildContext context) { @@ -20,7 +20,7 @@ class AboutPage extends ExhibitPage {

I love the sound of it.

私はその音が大好きです。

''', - defaultTextStyle: Theme.of(context).textTheme.bodyText1, + defaultTextStyle: Theme.of(context).textTheme.bodyLarge, ), ); } diff --git a/faiabench/lib/disclaimer_page.dart b/faiabench/lib/disclaimer_page.dart index b3ad29bb..961a6110 100644 --- a/faiabench/lib/disclaimer_page.dart +++ b/faiabench/lib/disclaimer_page.dart @@ -2,7 +2,7 @@ import 'package:faiabench/exhibit_page.dart'; import 'package:flutter/material.dart'; class DisclaimerPage extends ExhibitPage { - const DisclaimerPage({Key? key}) : super(key: key); + const DisclaimerPage({super.key}); @override Widget buildExhibit(BuildContext context) { diff --git a/faiabench/lib/exhibit_page.dart b/faiabench/lib/exhibit_page.dart index c52c4d26..a1166318 100644 --- a/faiabench/lib/exhibit_page.dart +++ b/faiabench/lib/exhibit_page.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; abstract class ExhibitPage extends StatelessWidget { - const ExhibitPage({Key? key}) : super(key: key); + const ExhibitPage({super.key}); String get title; diff --git a/faiabench/lib/json_tree.dart b/faiabench/lib/json_tree.dart index 6a7c67f7..2ea63a27 100644 --- a/faiabench/lib/json_tree.dart +++ b/faiabench/lib/json_tree.dart @@ -5,7 +5,7 @@ import 'package:flutter/material.dart'; class JsonTree extends StatefulWidget { final Resource resource; - const JsonTree(this.resource, {Key? key}) : super(key: key); + const JsonTree(this.resource, {super.key}); @override // ignore: library_private_types_in_public_api diff --git a/faiabench/lib/main.dart b/faiabench/lib/main.dart index 27c1b9fb..cf85cc68 100644 --- a/faiabench/lib/main.dart +++ b/faiabench/lib/main.dart @@ -108,7 +108,7 @@ final splitViewThemeData = MultiSplitViewThemeData( ); class MyApp extends StatelessWidget { - const MyApp({Key? key}) : super(key: key); + const MyApp({super.key}); @override Widget build(BuildContext context) { diff --git a/faiabench/lib/questionnaire_scroller_panel.dart b/faiabench/lib/questionnaire_scroller_panel.dart index 1f45fc8c..bb318290 100644 --- a/faiabench/lib/questionnaire_scroller_panel.dart +++ b/faiabench/lib/questionnaire_scroller_panel.dart @@ -19,8 +19,8 @@ class QuestionnaireScrollerPanel extends ConsumerStatefulWidget { this.questionnaireResponse, this.launchContext, this.fillerOutputProvider, { - Key? key, - }) : super(key: key); + super.key, + }); @override // ignore: library_private_types_in_public_api diff --git a/faiadashu_online/lib/restful/src/server_uploader.dart b/faiadashu_online/lib/restful/src/server_uploader.dart index f32bfd13..4cbf731a 100644 --- a/faiadashu_online/lib/restful/src/server_uploader.dart +++ b/faiadashu_online/lib/restful/src/server_uploader.dart @@ -3,7 +3,6 @@ import 'package:fhir/r4.dart'; import 'package:fhir_at_rest/r4.dart'; import 'package:fhir_auth/r4.dart'; - /// Creates or updates a [QuestionnaireResponse] on the server. /// /// Returns the [QuestionnaireResponse] with the server-side [Id]. @@ -11,38 +10,42 @@ Future createOrUpdateQuestionnaireResponse( FhirClient client, QuestionnaireResponse questionnaireResponse, ) async { - final _logger = Logger.tag('server_uploader'); + final logger = Logger.tag('server_uploader'); final baseUri = ArgumentError.checkNotNull(client.fhirUri.value); - _logger.debug( + logger.debug( '${questionnaireResponse.resourceTypeString} to be uploaded:\n${questionnaireResponse.toJson()}', ); // Select whether update or create scenario applies - final serverRequest = questionnaireResponse.id == null ? FhirRequest.create( - base: baseUri, - resource: questionnaireResponse, - client: client, - ) : FhirRequest.update( - base: baseUri, - resource: questionnaireResponse, - client: client, - ); + final serverRequest = questionnaireResponse.id == null + ? FhirRequest.create( + base: baseUri, + resource: questionnaireResponse, + client: client, + ) + : FhirRequest.update( + base: baseUri, + resource: questionnaireResponse, + client: client, + ); try { final serverResponse = await serverRequest.request(); - _logger.debug('Response from server:\n${serverResponse.toJson()}'); + logger.debug('Response from server:\n${serverResponse.toJson()}'); if (serverResponse is QuestionnaireResponse) { return serverResponse; } else if (serverResponse is OperationOutcome) { throw serverResponse; } else { - throw Exception('Unexpected response from server:\n${serverResponse.toJson()}'); + throw Exception( + 'Unexpected response from server:\n${serverResponse.toJson()}', + ); } } catch (e) { - _logger.warn('Upload failed', error: e); + logger.warn('Upload failed', error: e); rethrow; } } diff --git a/faiadashu_online/lib/restful/src/sync_indicator.dart b/faiadashu_online/lib/restful/src/sync_indicator.dart index df1224e1..fa18ee03 100644 --- a/faiadashu_online/lib/restful/src/sync_indicator.dart +++ b/faiadashu_online/lib/restful/src/sync_indicator.dart @@ -38,10 +38,10 @@ class _SyncIndicatorState extends State return AnimatedBuilder( key: _ingKey, animation: _animationController, - builder: (BuildContext context, Widget? _widget) { + builder: (BuildContext context, Widget? widget) { return Transform.rotate( angle: _animationController.value * 2 * pi, - child: _widget, + child: widget, ); }, child: Icon(Icons.sync, color: widget.color), diff --git a/lib/fhir_types/src/base64_image.dart b/lib/fhir_types/src/base64_image.dart index 9056bb3a..3b724f68 100644 --- a/lib/fhir_types/src/base64_image.dart +++ b/lib/fhir_types/src/base64_image.dart @@ -17,8 +17,8 @@ class Base64Image extends StatefulWidget { this.semanticLabel, this.width, this.height, - Key? key, - }) : super(key: key); + super.key, + }); @override State createState() => _Base64ImageState(); @@ -38,7 +38,7 @@ class _Base64ImageState extends State { height: widget.height, semanticLabel: widget.semanticLabel, key: (key != null && key is ValueKey) - ? ValueKey('${key.value.toString()}-img') + ? ValueKey('${key.value}-img') : null, ); } diff --git a/lib/fhir_types/src/codeable_concept_text.dart b/lib/fhir_types/src/codeable_concept_text.dart index 495a72a1..2df4db24 100644 --- a/lib/fhir_types/src/codeable_concept_text.dart +++ b/lib/fhir_types/src/codeable_concept_text.dart @@ -11,8 +11,8 @@ class CodeableConceptText extends StatelessWidget { this.codeableConcept, { this.style, this.locale, - Key? key, - }) : super(key: key); + super.key, + }); @override Widget build(BuildContext context) { diff --git a/lib/fhir_types/src/date_time_picker.dart b/lib/fhir_types/src/date_time_picker.dart index 0713e4e5..582629d4 100644 --- a/lib/fhir_types/src/date_time_picker.dart +++ b/lib/fhir_types/src/date_time_picker.dart @@ -30,8 +30,8 @@ class FhirDateTimePicker extends StatefulWidget { this.locale, this.focusNode, this.enabled = true, - Key? key, - }) : super(key: key); + super.key, + }); @override // ignore: library_private_types_in_public_api @@ -76,7 +76,8 @@ class _FhirDateTimePickerState extends State { dateTime = date.toLocal(); } - if (widget.pickerType == FhirDateTime || widget.pickerType == Time) { + if (mounted && + (widget.pickerType == FhirDateTime || widget.pickerType == Time)) { final time = await showTimePicker( initialTime: TimeOfDay.fromDateTime(_dateTimeValue?.value ?? DateTime.now()), diff --git a/lib/fhir_types/src/date_time_text.dart b/lib/fhir_types/src/date_time_text.dart index 703c471a..39aea8a8 100644 --- a/lib/fhir_types/src/date_time_text.dart +++ b/lib/fhir_types/src/date_time_text.dart @@ -14,8 +14,8 @@ class FhirDateTimeText extends StatelessWidget { this.style, this.defaultText = '', this.locale, - Key? key, - }) : super(key: key); + super.key, + }); @override Widget build(BuildContext context) { diff --git a/lib/fhir_types/src/fhir_types_extensions.dart b/lib/fhir_types/src/fhir_types_extensions.dart index 43a35ba2..26a14bcd 100644 --- a/lib/fhir_types/src/fhir_types_extensions.dart +++ b/lib/fhir_types/src/fhir_types_extensions.dart @@ -191,9 +191,9 @@ extension FDashCodeableConceptExtension on CodeableConcept { bool containsCoding(String? system, String code) { return coding?.firstWhereOrNull( - (_coding) => - (_coding.code?.toString() == code) && - (_coding.system?.toString() == system), + (coding) => + (coding.code?.toString() == code) && + (coding.system?.toString() == system), ) != null; } diff --git a/lib/fhir_types/src/resource_json_tree.dart b/lib/fhir_types/src/resource_json_tree.dart index c9dff9f4..db5dbe77 100644 --- a/lib/fhir_types/src/resource_json_tree.dart +++ b/lib/fhir_types/src/resource_json_tree.dart @@ -11,8 +11,8 @@ class ResourceJsonTree extends StatefulWidget { const ResourceJsonTree( this.resourceRoot, { this.autoExpandLevel = defaultAutoExpandLevel, - Key? key, - }) : super(key: key); + super.key, + }); final dynamic resourceRoot; final int autoExpandLevel; @@ -83,8 +83,8 @@ abstract class _JsonNode extends StatefulWidget { this.nodeValue, this.leftOffset, this.expandedDepth, { - Key? key, - }) : super(key: key); + super.key, + }); final ResourceJsonTree root; final _JsonNode? parent; @@ -114,22 +114,13 @@ abstract class _JsonNodeState extends State { class _JsonViewerMapNode extends _JsonNode> { const _JsonViewerMapNode( - ResourceJsonTree root, - _JsonNode? parent, - String nodeName, - Map nodeValue, - double leftOffset, - int expandedDepth, { - Key? key, - }) : super( - root, - parent, - nodeName, - nodeValue, - leftOffset, - expandedDepth, - key: key, - ); + super.root, + super.parent, + super.nodeName, + super.nodeValue, + super.leftOffset, + super.expandedDepth, + ); @override State createState() => _MapNodeState(); @@ -159,7 +150,7 @@ class _MapNodeState extends _JsonNodeState<_JsonViewerMapNode> { ), Text( widget.nodeName, - style: Theme.of(context).textTheme.bodyText1, + style: Theme.of(context).textTheme.bodyLarge, ), ], ), @@ -185,22 +176,13 @@ class _MapNodeState extends _JsonNodeState<_JsonViewerMapNode> { /// Display a list of JSON entries class _JsonViewerListNode extends _JsonNode> { const _JsonViewerListNode( - ResourceJsonTree root, - _JsonNode? parent, - String nodeName, - List nodeValue, - double leftOffset, - int expandedDepth, { - Key? key, - }) : super( - root, - parent, - nodeName, - nodeValue, - leftOffset, - expandedDepth, - key: key, - ); + super.root, + super.parent, + super.nodeName, + super.nodeValue, + super.leftOffset, + super.expandedDepth, + ); @override State createState() => _JsonViewerListNodeState(); @@ -235,16 +217,16 @@ class _JsonViewerListNodeState extends _JsonNodeState<_JsonViewerListNode> { ), Text( widget.nodeName, - style: Theme.of(context).textTheme.bodyText1, + style: Theme.of(context).textTheme.bodyLarge, ), Text( ' ($count)', style: (count > 0) ? TextStyle( - color: themeData.textTheme.bodyText1?.color + color: themeData.textTheme.bodyLarge?.color ?.withOpacity(variant600Opacity), ) - : TextStyle(color: themeData.errorColor), + : TextStyle(color: themeData.colorScheme.error), ), ], ), @@ -271,22 +253,21 @@ class _JsonViewerGenericNode extends StatelessWidget { final String nodeName; final dynamic nodeValue; - const _JsonViewerGenericNode(this.nodeName, this.nodeValue, {Key? key}) - : super(key: key); + const _JsonViewerGenericNode(this.nodeName, this.nodeValue); @override Widget build(BuildContext context) { final themeData = Theme.of(context); - var color = themeData.textTheme.bodyText1?.color; + var color = themeData.textTheme.bodyLarge?.color; if (nodeValue == null) { - color = themeData.errorColor; + color = themeData.colorScheme.error; } else { switch (nodeValue.runtimeType) { case bool: color = (nodeValue as bool) ? themeData.colorScheme.secondary - : themeData.errorColor; + : themeData.colorScheme.error; break; case int: color = themeData.colorScheme.secondary; @@ -309,7 +290,7 @@ class _JsonViewerGenericNode extends StatelessWidget { Text( nodeName, style: TextStyle( - color: themeData.textTheme.bodyText1?.color + color: themeData.textTheme.bodyLarge?.color ?.withOpacity(variant600Opacity), ), ), diff --git a/lib/l10n/src/fdash_localizations_ar.dart b/lib/l10n/src/fdash_localizations_ar.dart index 1513054f..1c846275 100644 --- a/lib/l10n/src/fdash_localizations_ar.dart +++ b/lib/l10n/src/fdash_localizations_ar.dart @@ -5,7 +5,7 @@ import 'fdash_localizations.g.dart'; /// The translations for Arabic (`ar`). class FDashLocalizationsAr extends FDashLocalizations { - FDashLocalizationsAr([String locale = 'ar']) : super(locale); + FDashLocalizationsAr([super.locale = 'ar']); @override String get validatorRequiredItem => 'هذا السؤال يحتاج إلى أن يكتمل.'; diff --git a/lib/l10n/src/fdash_localizations_de.dart b/lib/l10n/src/fdash_localizations_de.dart index 1e9dbfa7..85db47c8 100644 --- a/lib/l10n/src/fdash_localizations_de.dart +++ b/lib/l10n/src/fdash_localizations_de.dart @@ -5,7 +5,7 @@ import 'fdash_localizations.g.dart'; /// The translations for German (`de`). class FDashLocalizationsDe extends FDashLocalizations { - FDashLocalizationsDe([String locale = 'de']) : super(locale); + FDashLocalizationsDe([super.locale = 'de']); @override String get validatorRequiredItem => 'Füllen sie dieses Pflichtfeld aus.'; diff --git a/lib/l10n/src/fdash_localizations_en.dart b/lib/l10n/src/fdash_localizations_en.dart index 6b206240..ade2f302 100644 --- a/lib/l10n/src/fdash_localizations_en.dart +++ b/lib/l10n/src/fdash_localizations_en.dart @@ -5,7 +5,7 @@ import 'fdash_localizations.g.dart'; /// The translations for English (`en`). class FDashLocalizationsEn extends FDashLocalizations { - FDashLocalizationsEn([String locale = 'en']) : super(locale); + FDashLocalizationsEn([super.locale = 'en']); @override String get validatorRequiredItem => 'This question needs to be completed.'; diff --git a/lib/l10n/src/fdash_localizations_es.dart b/lib/l10n/src/fdash_localizations_es.dart index 517a0ded..23bf6bd0 100644 --- a/lib/l10n/src/fdash_localizations_es.dart +++ b/lib/l10n/src/fdash_localizations_es.dart @@ -5,7 +5,7 @@ import 'fdash_localizations.g.dart'; /// The translations for Spanish Castilian (`es`). class FDashLocalizationsEs extends FDashLocalizations { - FDashLocalizationsEs([String locale = 'es']) : super(locale); + FDashLocalizationsEs([super.locale = 'es']); @override String get validatorRequiredItem => 'Esta pregunta debe ser completada.'; diff --git a/lib/l10n/src/fdash_localizations_ja.dart b/lib/l10n/src/fdash_localizations_ja.dart index 0167b69a..f41b3774 100644 --- a/lib/l10n/src/fdash_localizations_ja.dart +++ b/lib/l10n/src/fdash_localizations_ja.dart @@ -5,7 +5,7 @@ import 'fdash_localizations.g.dart'; /// The translations for Japanese (`ja`). class FDashLocalizationsJa extends FDashLocalizations { - FDashLocalizationsJa([String locale = 'ja']) : super(locale); + FDashLocalizationsJa([super.locale = 'ja']); @override String get validatorRequiredItem => 'この質問は完了する必要があります。'; diff --git a/lib/observations/src/observation_value_view.dart b/lib/observations/src/observation_value_view.dart index e634b783..2116baad 100644 --- a/lib/observations/src/observation_value_view.dart +++ b/lib/observations/src/observation_value_view.dart @@ -82,7 +82,7 @@ class ObservationValueView extends StatelessWidget { unknownValueText, style: valueStyle?.copyWith( fontWeight: FontWeight.bold, - color: Theme.of(context).errorColor, + color: Theme.of(context).colorScheme.error, ), ); } diff --git a/lib/questionnaires/model/aggregation/src/aggregator.dart b/lib/questionnaires/model/aggregation/src/aggregator.dart index ac756372..52013db5 100644 --- a/lib/questionnaires/model/aggregation/src/aggregator.dart +++ b/lib/questionnaires/model/aggregation/src/aggregator.dart @@ -12,7 +12,7 @@ abstract class Aggregator extends ValueNotifier { /// [autoAggregate] specifies whether it should attach listeners to the /// questionnaire and aggregate when the questionnaire changes. - Aggregator(T initialValue, {this.autoAggregate = true}) : super(initialValue); + Aggregator(super.initialValue, {this.autoAggregate = true}); // ignore: use_setters_to_change_properties /// Initialize the aggregator. diff --git a/lib/questionnaires/model/expression/src/fhirpath_expression_evaluator.dart b/lib/questionnaires/model/expression/src/fhirpath_expression_evaluator.dart index 3c2392b8..4b5a3cb9 100644 --- a/lib/questionnaires/model/expression/src/fhirpath_expression_evaluator.dart +++ b/lib/questionnaires/model/expression/src/fhirpath_expression_evaluator.dart @@ -31,7 +31,7 @@ class FhirPathExpressionEvaluator extends FhirExpressionEvaluator { ) { if (fhirPathExpression.language != ExpressionLanguage.text_fhirpath) { throw ArgumentError( - '$name has wrong language: ${fhirPathExpression.language.toString()}', + '$name has wrong language: ${fhirPathExpression.language}', ); } diff --git a/lib/questionnaires/model/src/questionnaire_model.dart b/lib/questionnaires/model/src/questionnaire_model.dart index 448ef1ea..5fc311a3 100644 --- a/lib/questionnaires/model/src/questionnaire_model.dart +++ b/lib/questionnaires/model/src/questionnaire_model.dart @@ -260,7 +260,7 @@ class QuestionnaireModel { final codeSystem = getResource(valueSetInclude.system.toString()) as CodeSystem; _logger.debug( - 'Processing included CodeSystem ${codeSystem.url.toString()}', + 'Processing included CodeSystem ${codeSystem.url}', ); if (codeSystem.concept != null) { for (final concept in codeSystem.concept!) { diff --git a/lib/questionnaires/view/item/answer/src/boolean_answer_filler.dart b/lib/questionnaires/view/item/answer/src/boolean_answer_filler.dart index 98070deb..8c7bc7ec 100644 --- a/lib/questionnaires/view/item/answer/src/boolean_answer_filler.dart +++ b/lib/questionnaires/view/item/answer/src/boolean_answer_filler.dart @@ -30,12 +30,9 @@ class _BooleanItemState extends QuestionnaireAnswerFillerState { const _BooleanInputControl( - BooleanAnswerModel answerModel, { - FocusNode? focusNode, - }) : super( - answerModel, - focusNode: focusNode, - ); + super.answerModel, { + super.focusNode, + }); @override Widget build(BuildContext context) { @@ -51,7 +48,7 @@ class _BooleanInputControl extends AnswerInputControl { ? answerModel.value?.value : (answerModel.value?.value != null), activeColor: (answerModel.displayErrorText != null) - ? Theme.of(context).errorColor + ? Theme.of(context).colorScheme.error : null, tristate: answerModel.isTriState, onChanged: (answerModel.isControlEnabled) @@ -70,8 +67,8 @@ class _BooleanInputControl extends AnswerInputControl { answerModel.displayErrorText!, style: Theme.of(context) .textTheme - .caption! - .copyWith(color: Theme.of(context).errorColor), + .bodySmall! + .copyWith(color: Theme.of(context).colorScheme.error), ), ], ); diff --git a/lib/questionnaires/view/item/answer/src/coding_answer_filler.dart b/lib/questionnaires/view/item/answer/src/coding_answer_filler.dart index dec0d7f7..b2f9c4d0 100644 --- a/lib/questionnaires/view/item/answer/src/coding_answer_filler.dart +++ b/lib/questionnaires/view/item/answer/src/coding_answer_filler.dart @@ -32,14 +32,9 @@ class _CodingAnswerState extends QuestionnaireAnswerFillerState { const _CodingInputControl( - CodingAnswerModel answerModel, { - Key? key, - FocusNode? focusNode, - }) : super( - answerModel, - key: key, - focusNode: focusNode, - ); + super.answerModel, { + super.focusNode, + }); @override Widget build(BuildContext context) { @@ -122,9 +117,8 @@ class _StyledOption extends StatefulWidget { const _StyledOption( this.answerModel, - this.optionModel, { - super.key, - }); + this.optionModel, + ); @override _StyledOptionState createState() => _StyledOptionState(); @@ -190,8 +184,7 @@ class _CheckboxChoice extends StatelessWidget { final CodingAnswerOptionModel answerOption; final CodingAnswerModel answerModel; - const _CheckboxChoice(this.answerModel, this.answerOption, {Key? key}) - : super(key: key); + const _CheckboxChoice(this.answerModel, this.answerOption); @override Widget build(BuildContext context) { @@ -225,7 +218,7 @@ class _CheckboxChoice extends StatelessWidget { class _NullRadioChoice extends StatelessWidget { final CodingAnswerModel answerModel; - const _NullRadioChoice(this.answerModel, {Key? key}) : super(key: key); + const _NullRadioChoice(this.answerModel); @override Widget build(BuildContext context) { @@ -249,8 +242,7 @@ class _RadioChoice extends StatelessWidget { final CodingAnswerOptionModel answerOption; final CodingAnswerModel answerModel; - const _RadioChoice(this.answerModel, this.answerOption, {Key? key}) - : super(key: key); + const _RadioChoice(this.answerModel, this.answerOption); @override Widget build(BuildContext context) { @@ -280,14 +272,9 @@ class _RadioChoice extends StatelessWidget { class _CodingDropdown extends AnswerInputControl { const _CodingDropdown( - CodingAnswerModel answerModel, { - Key? key, - FocusNode? focusNode, - }) : super( - answerModel, - key: key, - focusNode: focusNode, - ); + super.answerModel, { + super.focusNode, + }); @override Widget build(BuildContext context) { @@ -336,15 +323,10 @@ class _CodingDropdown extends AnswerInputControl { class _VerticalCodingChoices extends AnswerInputControl { const _VerticalCodingChoices( - CodingAnswerModel answerModel, + super.answerModel, this.choices, { - Key? key, - FocusNode? focusNode, - }) : super( - answerModel, - key: key, - focusNode: focusNode, - ); + super.focusNode, + }); final List choices; @@ -371,14 +353,9 @@ class _CodingChoices extends AnswerInputControl { late final List _choices; _CodingChoices( - CodingAnswerModel answerModel, { - Key? key, - FocusNode? focusNode, - }) : super( - answerModel, - focusNode: focusNode, - key: key, - ) { + super.answerModel, { + super.focusNode, + }) { _choices = _createChoices(); } @@ -431,15 +408,10 @@ class _CodingChoices extends AnswerInputControl { class _HorizontalCodingChoices extends AnswerInputControl { const _HorizontalCodingChoices( - CodingAnswerModel answerModel, + super.answerModel, this.choices, { - Key? key, - FocusNode? focusNode, - }) : super( - answerModel, - focusNode: focusNode, - key: key, - ); + super.focusNode, + }); final List choices; @@ -476,8 +448,7 @@ class _CodingChoiceDecorator extends StatelessWidget { this.answerModel, { this.focusNode, this.child, - Key? key, - }) : super(key: key); + }); @override Widget build(BuildContext context) { @@ -512,14 +483,9 @@ class _CodingChoiceDecorator extends StatelessWidget { class _CodingAutoComplete extends AnswerInputControl { const _CodingAutoComplete( - CodingAnswerModel answerModel, { - Key? key, - FocusNode? focusNode, - }) : super( - answerModel, - key: key, - focusNode: focusNode, - ); + super.answerModel, { + super.focusNode, + }); Widget _fieldViewBuilder( BuildContext context, @@ -579,7 +545,7 @@ class _CodingAutoComplete extends AnswerInputControl { class _OpenStringInputControl extends StatefulWidget { final CodingAnswerModel answerModel; - const _OpenStringInputControl(this.answerModel, {Key? key}) : super(key: key); + const _OpenStringInputControl(this.answerModel); @override _OpenStringInputControlState createState() => _OpenStringInputControlState(); @@ -606,7 +572,7 @@ class _OpenStringInputControlState extends State<_OpenStringInputControl> { answerModel.openLabel, defaultTextStyle: Theme.of(context) .textTheme - .bodyText2 + .bodyMedium ?.copyWith(fontWeight: FontWeight.w500), ), const SizedBox( @@ -638,12 +604,11 @@ class _OpenStringInputControlState extends State<_OpenStringInputControl> { class _FDashAutocompleteField extends StatelessWidget { const _FDashAutocompleteField({ - Key? key, required this.answerModel, required this.focusNode, required this.textEditingController, required this.onFieldSubmitted, - }) : super(key: key); + }); final AnswerModel answerModel; diff --git a/lib/questionnaires/view/item/answer/src/datetime_answer_filler.dart b/lib/questionnaires/view/item/answer/src/datetime_answer_filler.dart index 364d889c..f4f1336a 100644 --- a/lib/questionnaires/view/item/answer/src/datetime_answer_filler.dart +++ b/lib/questionnaires/view/item/answer/src/datetime_answer_filler.dart @@ -32,12 +32,9 @@ class _DateTimeAnswerState extends QuestionnaireAnswerFillerState { const _DateTimeInputControl( - DateTimeAnswerModel answerModel, { - FocusNode? focusNode, - }) : super( - answerModel, - focusNode: focusNode, - ); + super.answerModel, { + super.focusNode, + }); @override Widget build(BuildContext context) { @@ -70,7 +67,7 @@ class _DateTimeInputControl extends AnswerInputControl { errorStyle: (itemModel .isCalculated) // Force display of error text on calculated item ? TextStyle( - color: Theme.of(context).errorColor, + color: Theme.of(context).colorScheme.error, ) : null, ), diff --git a/lib/questionnaires/view/item/answer/src/null_dash_text.dart b/lib/questionnaires/view/item/answer/src/null_dash_text.dart index 3001e2c7..b926ba89 100644 --- a/lib/questionnaires/view/item/answer/src/null_dash_text.dart +++ b/lib/questionnaires/view/item/answer/src/null_dash_text.dart @@ -2,17 +2,17 @@ import 'package:faiadashu/questionnaires/view/view.dart' show variant600Opacity; import 'package:flutter/material.dart'; class NullDashText extends StatelessWidget { - const NullDashText({Key? key}) : super(key: key); + const NullDashText({super.key}); @override Widget build(BuildContext context) { return Text( ' ', - style: Theme.of(context).textTheme.bodyText2?.copyWith( + style: Theme.of(context).textTheme.bodyMedium?.copyWith( decoration: TextDecoration.lineThrough, color: Theme.of(context) .textTheme - .bodyText2! + .bodyMedium! .color! .withOpacity(variant600Opacity), ), diff --git a/lib/questionnaires/view/item/answer/src/numerical_answer_filler.dart b/lib/questionnaires/view/item/answer/src/numerical_answer_filler.dart index 90058434..11226431 100644 --- a/lib/questionnaires/view/item/answer/src/numerical_answer_filler.dart +++ b/lib/questionnaires/view/item/answer/src/numerical_answer_filler.dart @@ -66,15 +66,10 @@ class _SliderInputControl extends AnswerInputControl { final ValueNotifier sliderValueDuringChange; const _SliderInputControl( - NumericalAnswerModel answerModel, { + super.answerModel, { required this.sliderValueDuringChange, - FocusNode? focusNode, - Key? key, - }) : super( - answerModel, - focusNode: focusNode, - key: key, - ); + super.focusNode, + }); @override Widget build(BuildContext context) { @@ -157,17 +152,11 @@ class _NumberFieldInputControl final TextInputFormatter numberInputFormatter; _NumberFieldInputControl( - NumericalAnswerModel answerModel, { + super.answerModel, { required this.editingController, - FocusNode? focusNode, - Key? key, - }) : numberInputFormatter = - NumericalTextInputFormatter(answerModel.numberFormat), - super( - answerModel, - focusNode: focusNode, - key: key, - ); + super.focusNode, + }) : numberInputFormatter = + NumericalTextInputFormatter(answerModel.numberFormat); @override Widget build(BuildContext context) { @@ -217,7 +206,7 @@ class _NumberFieldInputControl ? Icon( Icons.calculate, color: (answerModel.displayErrorText != null) - ? Theme.of(context).errorColor + ? Theme.of(context).colorScheme.error : null, ) : null, @@ -257,8 +246,8 @@ class _NumberFieldInputControl class _UnitDropDown extends AnswerInputControl { const _UnitDropDown( - NumericalAnswerModel answerModel, - ) : super(answerModel); + super.answerModel, + ); @override Widget build(BuildContext context) { diff --git a/lib/questionnaires/view/item/answer/src/string_answer_filler.dart b/lib/questionnaires/view/item/answer/src/string_answer_filler.dart index 5ec459e9..027dadfd 100644 --- a/lib/questionnaires/view/item/answer/src/string_answer_filler.dart +++ b/lib/questionnaires/view/item/answer/src/string_answer_filler.dart @@ -47,15 +47,10 @@ class _StringAnswerInputControl extends AnswerInputControl { final TextEditingController editingController; const _StringAnswerInputControl( - StringAnswerModel answerModel, { + super.answerModel, { required this.editingController, - FocusNode? focusNode, - Key? key, - }) : super( - answerModel, - focusNode: focusNode, - key: key, - ); + super.focusNode, + }); @override Widget build(BuildContext context) { @@ -104,7 +99,7 @@ class _StringAnswerInputControl extends AnswerInputControl { errorStyle: (itemModel .isCalculated) // Force display of error text on calculated item ? TextStyle( - color: Theme.of(context).errorColor, + color: Theme.of(context).colorScheme.error, ) : null, hintText: answerModel.entryFormat, @@ -112,7 +107,7 @@ class _StringAnswerInputControl extends AnswerInputControl { ? Icon( Icons.calculate, color: (answerModel.displayErrorText != null) - ? Theme.of(context).errorColor + ? Theme.of(context).colorScheme.error : null, ) : null, diff --git a/lib/questionnaires/view/item/src/display_item.dart b/lib/questionnaires/view/item/src/display_item.dart index 001b5a8f..27ed2fe0 100644 --- a/lib/questionnaires/view/item/src/display_item.dart +++ b/lib/questionnaires/view/item/src/display_item.dart @@ -5,10 +5,10 @@ import 'package:flutter/material.dart'; /// A view for filler items of type "display". class DisplayItem extends QuestionnaireItemFiller { DisplayItem( - QuestionnaireFillerData questionnaireFiller, - FillerItemModel fillerItem, { - Key? key, - }) : super(questionnaireFiller, fillerItem, key: key); + super.questionnaireFiller, + super.fillerItem, { + super.key, + }); @override State createState() => _DisplayItemState(); } diff --git a/lib/questionnaires/view/item/src/group_item.dart b/lib/questionnaires/view/item/src/group_item.dart index c8d742ab..2ce95ad0 100644 --- a/lib/questionnaires/view/item/src/group_item.dart +++ b/lib/questionnaires/view/item/src/group_item.dart @@ -5,10 +5,10 @@ import 'package:flutter/material.dart'; /// A view for filler items of type "group". class GroupItem extends ResponseItemFiller { GroupItem( - QuestionnaireFillerData questionnaireFiller, - ResponseItemModel responseItemModel, { - Key? key, - }) : super(questionnaireFiller, responseItemModel, key: key); + super.questionnaireFiller, + super.responseItemModel, { + super.key, + }); @override State createState() => _GroupItemState(); @@ -43,9 +43,10 @@ class _GroupItemState extends ResponseItemFillerState { padding: const EdgeInsets.only(top: 4.0), child: Text( errorText, - style: Theme.of(context).textTheme.subtitle1!.copyWith( - color: Theme.of(context).errorColor, - ), + style: + Theme.of(context).textTheme.titleMedium!.copyWith( + color: Theme.of(context).colorScheme.error, + ), ), ), ], diff --git a/lib/questionnaires/view/item/src/item_media_image.dart b/lib/questionnaires/view/item/src/item_media_image.dart index ef8ff91e..0f001476 100644 --- a/lib/questionnaires/view/item/src/item_media_image.dart +++ b/lib/questionnaires/view/item/src/item_media_image.dart @@ -11,7 +11,7 @@ class ItemMediaImage extends StatelessWidget { final Widget itemImageWidget; - const ItemMediaImage._(this.itemImageWidget, {Key? key}) : super(key: key); + const ItemMediaImage._(this.itemImageWidget); static Widget? fromItemMedia( ItemMediaModel? itemMediaModel, { diff --git a/lib/questionnaires/view/item/src/question_response_item_filler.dart b/lib/questionnaires/view/item/src/question_response_item_filler.dart index 800c30d8..6bd26f10 100644 --- a/lib/questionnaires/view/item/src/question_response_item_filler.dart +++ b/lib/questionnaires/view/item/src/question_response_item_filler.dart @@ -146,9 +146,8 @@ class _HorizontalAnswerFillers extends StatefulWidget { const _HorizontalAnswerFillers( this.questionResponseItemModel, - this.questionnaireTheme, { - Key? key, - }) : super(key: key); + this.questionnaireTheme, + ); @override _HorizontalAnswerFillersState createState() => diff --git a/lib/questionnaires/view/item/src/questionnaire_item_filler.dart b/lib/questionnaires/view/item/src/questionnaire_item_filler.dart index 9b6a6a49..65a5b042 100644 --- a/lib/questionnaires/view/item/src/questionnaire_item_filler.dart +++ b/lib/questionnaires/view/item/src/questionnaire_item_filler.dart @@ -10,9 +10,8 @@ abstract class QuestionnaireItemFiller extends StatefulWidget { QuestionnaireItemFiller( QuestionnaireFillerData questionnaireFiller, this.fillerItemModel, { - Key? key, - }) : questionnaireTheme = questionnaireFiller.questionnaireTheme, - super(key: key); + super.key, + }) : questionnaireTheme = questionnaireFiller.questionnaireTheme; } abstract class QuestionnaireItemFillerState diff --git a/lib/questionnaires/view/item/src/questionnaire_item_filler_title.dart b/lib/questionnaires/view/item/src/questionnaire_item_filler_title.dart index 3706db2b..ede10506 100644 --- a/lib/questionnaires/view/item/src/questionnaire_item_filler_title.dart +++ b/lib/questionnaires/view/item/src/questionnaire_item_filler_title.dart @@ -15,8 +15,8 @@ class QuestionnaireItemFillerTitle extends StatelessWidget { this.leading, this.help, required this.semanticsLabel, - Key? key, - }) : super(key: key); + super.key, + }); static Widget? fromFillerItem({ required FillerItemModel fillerItem, @@ -91,7 +91,7 @@ class QuestionnaireItemFillerTitle extends StatelessWidget { HTML.toTextSpan( context, htmlTitleText, - defaultTextStyle: Theme.of(context).textTheme.bodyText2, + defaultTextStyle: Theme.of(context).textTheme.bodyMedium, ), ], ), @@ -132,7 +132,7 @@ class QuestionnaireItemFillerTitle extends StatelessWidget { class _QuestionnaireItemFillerHelp extends StatefulWidget { final QuestionnaireItemModel ql; - const _QuestionnaireItemFillerHelp(this.ql, {Key? key}) : super(key: key); + const _QuestionnaireItemFillerHelp(this.ql, {super.key}); @override State createState() => _QuestionnaireItemFillerHelpState(); @@ -163,7 +163,7 @@ class _QuestionnaireItemFillerHelpState content: Xhtml.fromRenderingString( context, questionnaireItemModel.text ?? RenderingString.nullText, - defaultTextStyle: Theme.of(context).textTheme.bodyText2, + defaultTextStyle: Theme.of(context).textTheme.bodyMedium, ), actions: [ OutlinedButton( @@ -185,8 +185,7 @@ class _QuestionnaireItemFillerSupportLink extends StatelessWidget { static final _logger = Logger(_QuestionnaireItemFillerSupportLink); final Uri supportLink; - const _QuestionnaireItemFillerSupportLink(this.supportLink, {Key? key}) - : super(key: key); + const _QuestionnaireItemFillerSupportLink(this.supportLink, {super.key}); @override Widget build(BuildContext context) { @@ -194,7 +193,7 @@ class _QuestionnaireItemFillerSupportLink extends StatelessWidget { mouseCursor: SystemMouseCursors.help, icon: const Icon(Icons.help), onPressed: () { - _logger.debug("supportLink '${supportLink.toString()}'"); + _logger.debug("supportLink '$supportLink'"); QuestionnaireResponseFiller.of(context) .onLinkTap ?.call(context, supportLink); @@ -205,9 +204,8 @@ class _QuestionnaireItemFillerSupportLink extends StatelessWidget { class _QuestionnaireItemFillerTitleLeading extends StatelessWidget { final Widget _leadingWidget; - const _QuestionnaireItemFillerTitleLeading._(Widget leadingWidget, {Key? key}) - : _leadingWidget = leadingWidget, - super(key: key); + const _QuestionnaireItemFillerTitleLeading._(Widget leadingWidget) + : _leadingWidget = leadingWidget; static Widget? fromFillerItem( FillerItemModel fillerItemModel, { diff --git a/lib/questionnaires/view/item/src/total_score_item.dart b/lib/questionnaires/view/item/src/total_score_item.dart index 77cf4936..2d49cafc 100644 --- a/lib/questionnaires/view/item/src/total_score_item.dart +++ b/lib/questionnaires/view/item/src/total_score_item.dart @@ -12,9 +12,9 @@ import 'package:simple_html_css/simple_html_css.dart'; /// sundhed.dk questionnaire-feedback extension. class TotalScoreItem extends QuestionnaireAnswerFiller { TotalScoreItem( - AnswerModel answerModel, { - Key? key, - }) : super(answerModel, key: key); + super.answerModel, { + super.key, + }); @override State createState() => _TotalScoreItemState(); } diff --git a/lib/questionnaires/view/src/broken_questionnaire_item.dart b/lib/questionnaires/view/src/broken_questionnaire_item.dart index 50d2510c..8ff89eb9 100644 --- a/lib/questionnaires/view/src/broken_questionnaire_item.dart +++ b/lib/questionnaires/view/src/broken_questionnaire_item.dart @@ -43,13 +43,13 @@ class BrokenQuestionnaireItem extends StatelessWidget { if (cause != null) SelectableText( cause.toString(), - style: Theme.of(context).textTheme.headline6?.copyWith( + style: Theme.of(context).textTheme.titleLarge?.copyWith( color: Theme.of(context).cardColor, ), ), SelectableText( message, - style: Theme.of(context).textTheme.subtitle1?.copyWith( + style: Theme.of(context).textTheme.titleMedium?.copyWith( color: Colors.yellow, ), ), diff --git a/lib/questionnaires/view/src/narrative_drawer.dart b/lib/questionnaires/view/src/narrative_drawer.dart index 7a651fc6..8c0f6aeb 100644 --- a/lib/questionnaires/view/src/narrative_drawer.dart +++ b/lib/questionnaires/view/src/narrative_drawer.dart @@ -9,7 +9,7 @@ import 'package:flutter/services.dart'; /// "Drawer" which contains the narrative for a questionnaire. /// To be used with the drawer or endDrawer parameter of a [Scaffold]. class NarrativeDrawer extends StatefulWidget { - const NarrativeDrawer({Key? key}) : super(key: key); + const NarrativeDrawer({super.key}); @override State createState() => _NarrativeDrawerState(); diff --git a/lib/questionnaires/view/src/questionnaire_filler_circular_progress.dart b/lib/questionnaires/view/src/questionnaire_filler_circular_progress.dart index dcb206f9..da6dfc3a 100644 --- a/lib/questionnaires/view/src/questionnaire_filler_circular_progress.dart +++ b/lib/questionnaires/view/src/questionnaire_filler_circular_progress.dart @@ -14,8 +14,8 @@ class QuestionnaireFillerCircularProgress extends StatelessWidget { const QuestionnaireFillerCircularProgress({ this.radius = defaultRadius, - Key? key, - }) : super(key: key); + super.key, + }); @override Widget build(BuildContext context) { diff --git a/lib/questionnaires/view/src/questionnaire_scroller.dart b/lib/questionnaires/view/src/questionnaire_scroller.dart index 9f214105..564512a5 100644 --- a/lib/questionnaires/view/src/questionnaire_scroller.dart +++ b/lib/questionnaires/view/src/questionnaire_scroller.dart @@ -46,8 +46,8 @@ class QuestionnaireScroller extends StatefulWidget { this.onLinkTap, this.questionnaireModelDefaults = const QuestionnaireModelDefaults(), this.onQuestionnaireResponseChanged, - Key? key, - }) : super(key: key); + super.key, + }); @override State createState() { diff --git a/lib/questionnaires/view/src/questionnaire_stepper_page.dart b/lib/questionnaires/view/src/questionnaire_stepper_page.dart index 790139f0..79d23acc 100644 --- a/lib/questionnaires/view/src/questionnaire_stepper_page.dart +++ b/lib/questionnaires/view/src/questionnaire_stepper_page.dart @@ -1,5 +1,4 @@ import 'package:faiadashu/questionnaires/questionnaires.dart'; -import 'package:faiadashu/resource_provider/resource_provider.dart'; import 'package:flutter/material.dart'; /// A page, incl. a [Scaffold], that presents a questionnaire in the style of a wizard. diff --git a/lib/questionnaires/view/src/webview_html.dart b/lib/questionnaires/view/src/webview_html.dart index ce2ee66b..89b422ba 100644 --- a/lib/questionnaires/view/src/webview_html.dart +++ b/lib/questionnaires/view/src/webview_html.dart @@ -2,7 +2,6 @@ import 'dart:convert'; import 'package:flutter/material.dart'; import 'package:webview_flutter/webview_flutter.dart'; -import 'package:webview_flutter_web/webview_flutter_web.dart'; Widget createWebView(String xhtml, {Key? key}) => _FullHtmlViewer( xhtml, @@ -22,8 +21,6 @@ class _FullHtmlViewer extends StatelessWidget { encoding: Encoding.getByName('utf-8'), ).toString(); - ; - return SizedBox.expand( child: WebViewWidget( controller: WebViewController.fromPlatformCreationParams( From 765977bff77f97d6f2070542e6eb15a4d38798f4 Mon Sep 17 00:00:00 2001 From: sh1l0n Date: Mon, 15 May 2023 12:25:12 +0200 Subject: [PATCH 03/12] Updated FHIR to 0.9.0 --- example/lib/questionnaire_launch_tile.dart | 3 +- .../lib/questionnaire_response_storage.dart | 10 ++-- example/pubspec.lock | 60 +++++++++++++------ example/pubspec.yaml | 4 +- faiabench/lib/main.dart | 34 ++++++----- faiabench/pubspec.yaml | 4 +- .../src/restful_resource_provider.dart | 2 +- faiadashu_online/pubspec.yaml | 6 +- .../questionnaire_response_aggregator.dart | 16 +++-- .../src/fhir_expression_evaluator.dart | 1 + .../item/answer/src/coding_answer_model.dart | 2 +- .../answer/src/datetime_answer_model.dart | 7 +-- .../answer/src/numerical_answer_model.dart | 19 +++--- .../item/answer/src/string_answer_model.dart | 8 +-- .../model/item/src/filler_item_model.dart | 43 +++++++------ .../model/item/src/question_item_model.dart | 56 ++++++++--------- .../model/src/questionnaire_item_model.dart | 12 ++-- .../src/questionnaire_response_model.dart | 18 +++--- .../answer/src/datetime_answer_filler.dart | 14 ++--- .../answer/src/numerical_answer_filler.dart | 2 +- .../item/answer/src/string_answer_filler.dart | 3 +- .../src/question_response_item_filler.dart | 13 ++-- .../src/questionnaire_complete_button.dart | 23 +++---- pubspec.yaml | 4 +- 24 files changed, 194 insertions(+), 170 deletions(-) diff --git a/example/lib/questionnaire_launch_tile.dart b/example/lib/questionnaire_launch_tile.dart index 257e8c59..a23a8230 100644 --- a/example/lib/questionnaire_launch_tile.dart +++ b/example/lib/questionnaire_launch_tile.dart @@ -179,8 +179,7 @@ class _QuestionnaireLaunchTileState extends State { QuestionnaireResponseFiller.of(context) .aggregator() .aggregate( - responseStatus: - QuestionnaireResponseStatus.completed, + responseStatus: Code('completed'), ), ); ScaffoldMessenger.of(context).showSnackBar( diff --git a/example/lib/questionnaire_response_storage.dart b/example/lib/questionnaire_response_storage.dart index 524fd497..7c32ed88 100644 --- a/example/lib/questionnaire_response_storage.dart +++ b/example/lib/questionnaire_response_storage.dart @@ -21,11 +21,11 @@ class QuestionnaireResponseStorage { final SmartFhirClient smartClient; - QuestionnaireResponseStorage( - {required this.fhirUri, - required this.clientId, - required this.redirectUri}) - : smartClient = SmartFhirClient( + QuestionnaireResponseStorage({ + required this.fhirUri, + required this.clientId, + required this.redirectUri, + }) : smartClient = SmartFhirClient( fhirUri: fhirUri, clientId: clientId, redirectUri: redirectUri, diff --git a/example/pubspec.lock b/example/pubspec.lock index fd61879d..2b435d04 100644 --- a/example/pubspec.lock +++ b/example/pubspec.lock @@ -1,6 +1,14 @@ # Generated by pub # See https://dart.dev/tools/pub/glossary#lockfile packages: + antlr4: + dependency: transitive + description: + name: antlr4 + sha256: aeb591332cd6a32d298389df1ab41f2ce7b117da98c58eae35785ed44ee0abb3 + url: "https://pub.dev" + source: hosted + version: "4.12.0" args: dependency: transitive description: @@ -83,42 +91,34 @@ packages: dependency: "direct main" description: name: fhir - sha256: d255189e3314e6b67654d8cba448460d019532eff654191f374b8709bc4185bd + sha256: "852c533fd5f29b31692af9264df7bddd23e1103e14db0c42c1693b343b6cbe44" url: "https://pub.dev" source: hosted - version: "0.8.0" + version: "0.9.5" fhir_at_rest: dependency: transitive description: name: fhir_at_rest - sha256: "3b6915b9d95c48fa6369c12fdc9430d51f4644a3d48c76caad9c51126d39ed75" + sha256: e62645e6e619df5a5b66c480d5e8872dd87f0e748965e80739363fb7ec62e5cf url: "https://pub.dev" source: hosted - version: "0.8.4" + version: "0.9.5" fhir_auth: dependency: "direct main" description: name: fhir_auth - sha256: "5081e5fba81812c7d47768be5b096dbb9787cdd59a742e2272700687d6ac067c" + sha256: "3d6e8af3cc17c38ac5ab36e2e2ecc1f0ba93af30eb2390ab2c0fad0eadd8d754" url: "https://pub.dev" source: hosted - version: "0.8.0" + version: "0.9.4" fhir_path: dependency: transitive description: name: fhir_path - sha256: eef12419e4e62feb51176b6c5f4038980cb0140eb79ec67f92dd000e2d589cda + sha256: fbee92d92a59e94a0412b96b43b3123b8941ed2a2a975064f924b7aa6304a9c1 url: "https://pub.dev" source: hosted - version: "0.8.0" - fhir_yaml: - dependency: transitive - description: - name: fhir_yaml - sha256: "59aad5ead24d602142aa2e5745596fe7ef1472496ef29ea3ce3283f3c917c964" - url: "https://pub.dev" - source: hosted - version: "0.8.0" + version: "0.9.6" file: dependency: transitive description: @@ -141,10 +141,10 @@ packages: dependency: transitive description: name: flutter_web_auth - sha256: "8c364d8157b299c95f062bbd7bf428bb80c272d7ed3b8f0e6c7028e037e82c76" + sha256: a69fa8f43b9e4d86ac72176bf747b735e7b977dd7cf215076d95b87cb05affdd url: "https://pub.dev" source: hosted - version: "0.4.3" + version: "0.5.0" flutter_web_plugins: dependency: transitive description: flutter @@ -254,6 +254,14 @@ packages: url: "https://pub.dev" source: hosted version: "4.8.0" + jwt_decoder: + dependency: transitive + description: + name: jwt_decoder + sha256: "54774aebf83f2923b99e6416b4ea915d47af3bde56884eb622de85feabbc559f" + url: "https://pub.dev" + source: hosted + version: "2.0.1" lint: dependency: "direct dev" description: @@ -483,6 +491,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.3.1" + units_converter: + dependency: transitive + description: + name: units_converter + sha256: aa702e706f88e1b02e40954df13aa079920210b3ab68047b20822b78fff37ed9 + url: "https://pub.dev" + source: hosted + version: "2.1.0" url_launcher: dependency: transitive description: @@ -627,6 +643,14 @@ packages: url: "https://pub.dev" source: hosted version: "6.2.2" + xml2json: + dependency: transitive + description: + name: xml2json + sha256: c8cb35b83cce879c2ea86951fd257f4e765b0030a0298b35cf94f2b3d0f32095 + url: "https://pub.dev" + source: hosted + version: "5.3.6" yaml: dependency: transitive description: diff --git a/example/pubspec.yaml b/example/pubspec.yaml index 5bcaead4..6ff0ca16 100644 --- a/example/pubspec.yaml +++ b/example/pubspec.yaml @@ -11,8 +11,8 @@ dependencies: path: .. faiadashu_online: path: ../faiadashu_online - fhir: ^0.8.0 - fhir_auth: ^0.8.0 + fhir: ^0.9.0 + fhir_auth: ^0.9.0 flutter: sdk: flutter flutter_localizations: diff --git a/faiabench/lib/main.dart b/faiabench/lib/main.dart index cf85cc68..3b886f04 100644 --- a/faiabench/lib/main.dart +++ b/faiabench/lib/main.dart @@ -20,23 +20,28 @@ import 'filler_inputs.dart'; final questionnaireProvider = StateNotifierProvider>( - (ref) { - return FhirResourceNotifier('assets/initial/bluebook-questionnaire.json'); -}); + (ref) { + return FhirResourceNotifier( + 'assets/initial/bluebook-questionnaire.json', + ); + }, +); final populateQuestionnaireResponseProvider = StateNotifierProvider>( - (ref) { - return FhirResourceNotifier( - 'assets/initial/bluebook-questionnaire-response.json', - ); -}); + (ref) { + return FhirResourceNotifier( + 'assets/initial/bluebook-questionnaire-response.json', + ); + }, +); final launchContextProvider = StateNotifierProvider>( - (ref) { - return FhirResourceNotifier('assets/initial/launch-context.json'); -}); + (ref) { + return FhirResourceNotifier('assets/initial/launch-context.json'); + }, +); final fillerInputsProvider = Provider((ref) { final questionnaire = ref.watch(questionnaireProvider).value; @@ -65,9 +70,10 @@ final fillerInputsProvider = Provider((ref) { final fillerOutputProvider = StateNotifierProvider>( - (ref) { - return FhirResourceNotifier(null); -}); + (ref) { + return FhirResourceNotifier(null); + }, +); void main() { WidgetsFlutterBinding.ensureInitialized(); diff --git a/faiabench/pubspec.yaml b/faiabench/pubspec.yaml index b6034e86..97db7e3d 100644 --- a/faiabench/pubspec.yaml +++ b/faiabench/pubspec.yaml @@ -26,8 +26,8 @@ dependencies: collection: ^1.17.0 faiadashu: path: .. - fhir: ^0.8.0 - fhir_path: ^0.8.0 + fhir: ^0.9.0 + fhir_path: ^0.9.0 flutter: sdk: flutter flutter_highlight: ^0.7.0 diff --git a/faiadashu_online/lib/resource_provider/src/restful_resource_provider.dart b/faiadashu_online/lib/resource_provider/src/restful_resource_provider.dart index a28f6da0..1a3f5ec7 100644 --- a/faiadashu_online/lib/resource_provider/src/restful_resource_provider.dart +++ b/faiadashu_online/lib/resource_provider/src/restful_resource_provider.dart @@ -9,7 +9,7 @@ class RestfulResourceProvider extends FhirResourceProvider { late final Resource? resource; final String uri; final R4ResourceType resourceType; - final Id id; + final String id; FhirClient client; RestfulResourceProvider( diff --git a/faiadashu_online/pubspec.yaml b/faiadashu_online/pubspec.yaml index dc71e9a3..53639c79 100644 --- a/faiadashu_online/pubspec.yaml +++ b/faiadashu_online/pubspec.yaml @@ -17,9 +17,9 @@ environment: dependencies: faiadashu: path: .. - fhir: ^0.8.0 - fhir_at_rest: ^0.8.0 - fhir_auth: ^0.8.0 + fhir: ^0.9.0 + fhir_at_rest: ^0.9.0 + fhir_auth: ^0.9.0 flutter: sdk: flutter logging: ^1.0.2 diff --git a/lib/questionnaires/model/aggregation/src/questionnaire_response_aggregator.dart b/lib/questionnaires/model/aggregation/src/questionnaire_response_aggregator.dart index a5af7688..97bdda62 100644 --- a/lib/questionnaires/model/aggregation/src/questionnaire_response_aggregator.dart +++ b/lib/questionnaires/model/aggregation/src/questionnaire_response_aggregator.dart @@ -18,11 +18,10 @@ class QuestionnaireResponseAggregator QuestionnaireResponseItem? _fromQuestionItem( QuestionItemModel itemModel, - QuestionnaireResponseStatus responseStatus, + Code responseStatus, Map responseItemRegistry, ) { - if (responseStatus == QuestionnaireResponseStatus.completed && - !itemModel.isEnabled) { + if (responseStatus.value == 'completed' && !itemModel.isEnabled) { return null; } @@ -89,11 +88,10 @@ class QuestionnaireResponseAggregator QuestionnaireResponseItem? _fromGroupItem( GroupItemModel itemModel, - QuestionnaireResponseStatus responseStatus, + Code responseStatus, Map responseItemRegistry, ) { - if (responseStatus == QuestionnaireResponseStatus.completed && - !itemModel.isEnabled) { + if (responseStatus.value == 'completed' && !itemModel.isEnabled) { return null; } @@ -118,7 +116,7 @@ class QuestionnaireResponseAggregator List? _fromResponseItems( ResponseNode? parentNode, - QuestionnaireResponseStatus responseStatus, + Code responseStatus, Map responseItemRegistry, ) { final responseItems = []; @@ -154,7 +152,7 @@ class QuestionnaireResponseAggregator @override QuestionnaireResponse? aggregate({ - QuestionnaireResponseStatus? responseStatus, + Code? responseStatus, bool notifyListeners = false, bool containPatient = false, }) { @@ -173,7 +171,7 @@ class QuestionnaireResponseAggregator } Map aggregateResponseItems({ - QuestionnaireResponseStatus? responseStatus, + Code? responseStatus, bool notifyListeners = false, bool containPatient = false, bool generateNarrative = true, diff --git a/lib/questionnaires/model/expression/src/fhir_expression_evaluator.dart b/lib/questionnaires/model/expression/src/fhir_expression_evaluator.dart index 53672063..a34b2379 100644 --- a/lib/questionnaires/model/expression/src/fhir_expression_evaluator.dart +++ b/lib/questionnaires/model/expression/src/fhir_expression_evaluator.dart @@ -38,6 +38,7 @@ abstract class FhirExpressionEvaluator extends ExpressionEvaluator { ); case ExpressionLanguage.text_cql: case ExpressionLanguage.unknown: + default: throw UnsupportedError( 'Expressions of type ${fhirExpression.language} are unsupported.', ); diff --git a/lib/questionnaires/model/item/answer/src/coding_answer_model.dart b/lib/questionnaires/model/item/answer/src/coding_answer_model.dart index b38e86e0..6fecbed6 100644 --- a/lib/questionnaires/model/item/answer/src/coding_answer_model.dart +++ b/lib/questionnaires/model/item/answer/src/coding_answer_model.dart @@ -152,7 +152,7 @@ class CodingAnswerModel extends AnswerModel { bool get isCheckbox => qi.isItemControl('check-box'); - bool get isOptionsOrString => qi.type == QuestionnaireItemType.open_choice; + bool get isOptionsOrString => qi.type.value == 'open_choice'; RenderingString get openLabel => RenderingString.fromText( qi.extension_ diff --git a/lib/questionnaires/model/item/answer/src/datetime_answer_model.dart b/lib/questionnaires/model/item/answer/src/datetime_answer_model.dart index 5991cfeb..485c6673 100644 --- a/lib/questionnaires/model/item/answer/src/datetime_answer_model.dart +++ b/lib/questionnaires/model/item/answer/src/datetime_answer_model.dart @@ -5,7 +5,6 @@ import 'package:fhir/r4.dart' show Date, FhirDateTime, - QuestionnaireItemType, QuestionnaireResponseAnswer, QuestionnaireResponseItem, Time; @@ -30,17 +29,17 @@ class DateTimeAnswerModel extends AnswerModel { return null; } - if (itemType == QuestionnaireItemType.date) { + if (itemType.value == 'date') { return QuestionnaireResponseAnswer( valueDate: Date(value!.value), item: items, ); - } else if (itemType == QuestionnaireItemType.datetime) { + } else if (itemType.value == 'datetime') { return QuestionnaireResponseAnswer( valueDateTime: value, item: items, ); - } else if (itemType == QuestionnaireItemType.time) { + } else if (itemType.value == 'time') { return QuestionnaireResponseAnswer( valueTime: Time( value!.value!.toIso8601String().substring('yyyy-MM-ddT'.length), diff --git a/lib/questionnaires/model/item/answer/src/numerical_answer_model.dart b/lib/questionnaires/model/item/answer/src/numerical_answer_model.dart index e29c212e..3c6cb26e 100644 --- a/lib/questionnaires/model/item/answer/src/numerical_answer_model.dart +++ b/lib/questionnaires/model/item/answer/src/numerical_answer_model.dart @@ -106,12 +106,12 @@ class NumericalAnswerModel extends AnswerModel { } // TODO: Evaluate max length - switch (qi.type) { - case QuestionnaireItemType.integer: + switch (qi.type.value) { + case 'integer': _maxDecimal = 0; break; - case QuestionnaireItemType.decimal: - case QuestionnaireItemType.quantity: + case 'decimal': + case 'quantity': // TODO: Evaluate special extensions for quantities _maxDecimal = qi.extension_ ?.extensionOrNull( @@ -279,8 +279,8 @@ class NumericalAnswerModel extends AnswerModel { return null; } - switch (qi.type) { - case QuestionnaireItemType.decimal: + switch (qi.type.value) { + case 'decimal': return (value!.value != null) ? QuestionnaireResponseAnswer( valueDecimal: value!.value, @@ -288,13 +288,13 @@ class NumericalAnswerModel extends AnswerModel { item: items, ) : null; - case QuestionnaireItemType.quantity: + case 'quantity': return QuestionnaireResponseAnswer( valueQuantity: value, extension_: value!.extension_, item: items, ); - case QuestionnaireItemType.integer: + case 'integer': return (value!.value != null) ? QuestionnaireResponseAnswer( valueInteger: Integer(value!.value!.value!.round()), @@ -321,8 +321,7 @@ class NumericalAnswerModel extends AnswerModel { system: unitCoding?.system, code: unitCoding?.code, extension_: (unitCoding != null && - (qi.type == QuestionnaireItemType.decimal || - qi.type == QuestionnaireItemType.integer)) + (qi.type.value == 'decimal' || qi.type.value == 'integer')) ? [ FhirExtension( url: FhirUri( diff --git a/lib/questionnaires/model/item/answer/src/string_answer_model.dart b/lib/questionnaires/model/item/answer/src/string_answer_model.dart index d8b11ab0..6a31cce7 100644 --- a/lib/questionnaires/model/item/answer/src/string_answer_model.dart +++ b/lib/questionnaires/model/item/answer/src/string_answer_model.dart @@ -42,9 +42,9 @@ class StringAnswerModel extends AnswerModel { ?.valueCode ?.value; - keyboard = (qi.type == QuestionnaireItemType.text) + keyboard = (qi.type.value == 'text') ? StringAnswerKeyboard.multiline - : (qi.type == QuestionnaireItemType.url) + : (qi.type.value == 'url') ? StringAnswerKeyboard.url : (keyboardExtension == 'email') ? StringAnswerKeyboard.email @@ -81,7 +81,7 @@ class StringAnswerModel extends AnswerModel { return lookupFDashLocalizations(locale).validatorMaxLength(maxLength!); } - if (qi.type == QuestionnaireItemType.url) { + if (qi.type.value == 'url') { if (!_urlRegExp.hasMatch(inputValue)) { return lookupFDashLocalizations(locale).validatorUrl; } @@ -116,7 +116,7 @@ class StringAnswerModel extends AnswerModel { : null; return (value != null && value.isNotEmpty) - ? (qi.type != QuestionnaireItemType.url) + ? (qi.type.value != 'url') ? QuestionnaireResponseAnswer( valueString: value, extension_: dataAbsentReasonExtension, diff --git a/lib/questionnaires/model/item/src/filler_item_model.dart b/lib/questionnaires/model/item/src/filler_item_model.dart index 8286b3f5..69ab5cf7 100644 --- a/lib/questionnaires/model/item/src/filler_item_model.dart +++ b/lib/questionnaires/model/item/src/filler_item_model.dart @@ -277,18 +277,18 @@ abstract class FillerItemModel extends ResponseNode { } enableWhenTrigger.incrementAllConditionCount(); - switch (qew.operator_) { - case QuestionnaireEnableWhenOperator.exists: + switch (qew.operator_?.value) { + case 'exists': _evaluateExistsOperator(qew, enableWhenTrigger); break; - case QuestionnaireEnableWhenOperator.eq: - case QuestionnaireEnableWhenOperator.ne: + case 'eq': + case 'ne': _evaluateEqualityOperator(questionLinkId, qew, enableWhenTrigger); break; - case QuestionnaireEnableWhenOperator.lt: - case QuestionnaireEnableWhenOperator.gt: - case QuestionnaireEnableWhenOperator.ge: - case QuestionnaireEnableWhenOperator.le: + case 'lt': + case 'gt': + case 'ge': + case 'le': _evaluateComparisonOperator(questionLinkId, qew, enableWhenTrigger); break; default: @@ -300,19 +300,19 @@ abstract class FillerItemModel extends ResponseNode { }); // TODO: Optimization: 'any' could stop evaluation after first trigger. - switch (questionnaireItem.enableBehavior) { - case QuestionnaireItemEnableBehavior.any: + switch (questionnaireItem.enableBehavior?.value) { + case 'any': case null: if (!enableWhenTrigger.anyTriggered) { _nextGenerationDisableWithDescendants(); } break; - case QuestionnaireItemEnableBehavior.all: + case 'all': if (!enableWhenTrigger.allTriggered) { _nextGenerationDisableWithDescendants(); } break; - case QuestionnaireItemEnableBehavior.unknown: + case 'unknown': throw QuestionnaireFormatException( 'enableWhen with unknown enableBehavior: ${questionnaireItem.enableBehavior}', questionnaireItem, @@ -359,23 +359,23 @@ abstract class FillerItemModel extends ResponseNode { ); } - switch (qew.operator_) { - case QuestionnaireEnableWhenOperator.gt: + switch (qew.operator_?.value) { + case 'gt': if (answerValue > comparisonValue) { enableWhenTrigger.trigger(); } break; - case QuestionnaireEnableWhenOperator.ge: + case 'ge': if (answerValue >= comparisonValue) { enableWhenTrigger.trigger(); } break; - case QuestionnaireEnableWhenOperator.lt: + case 'lt': if (answerValue < comparisonValue) { enableWhenTrigger.trigger(); } break; - case QuestionnaireEnableWhenOperator.le: + case 'le': if (answerValue >= comparisonValue) { enableWhenTrigger.trigger(); } @@ -423,7 +423,7 @@ abstract class FillerItemModel extends ResponseNode { if (firstAnswer == null) { // null equals nothing - if (qew.operator_ == QuestionnaireEnableWhenOperator.ne) { + if (qew.operator_?.value == 'ne') { enableWhenTrigger.trigger(); } } else if (firstAnswer is CodingAnswerModel) { @@ -431,14 +431,14 @@ abstract class FillerItemModel extends ResponseNode { _fimLogger.debug( 'enableWhen: ${firstAnswer.value} == ${qew.answerCoding}', ); - if (qew.operator_ == QuestionnaireEnableWhenOperator.eq) { + if (qew.operator_?.value == 'eq') { enableWhenTrigger.trigger(); } } else { _fimLogger.debug( 'enableWhen: ${firstAnswer.value} != ${qew.answerCoding}', ); - if (qew.operator_ == QuestionnaireEnableWhenOperator.ne) { + if (qew.operator_?.value == 'ne') { enableWhenTrigger.trigger(); } } @@ -541,8 +541,7 @@ abstract class FillerItemModel extends ResponseNode { DisplayVisibility _calculateDisplayVisibility() { DisplayVisibility resultVisibility = DisplayVisibility.shown; - if (questionnaireResponseModel.responseStatus == - QuestionnaireResponseStatus.completed) { + if (questionnaireResponseModel.responseStatus.value == 'completed') { resultVisibility = _maxVisibility(resultVisibility, DisplayVisibility.protected); } diff --git a/lib/questionnaires/model/item/src/question_item_model.dart b/lib/questionnaires/model/item/src/question_item_model.dart index 66bdc2d7..e9d54287 100644 --- a/lib/questionnaires/model/item/src/question_item_model.dart +++ b/lib/questionnaires/model/item/src/question_item_model.dart @@ -276,38 +276,38 @@ class QuestionItemModel extends ResponseItemModel { /// Creates a new [AnswerModel] of the type for this question. AnswerModel _createAnswerModel() { - final AnswerModel? answerModel; + late AnswerModel answerModel; - switch (questionnaireItemModel.questionnaireItem.type) { - case QuestionnaireItemType.choice: - case QuestionnaireItemType.open_choice: + switch (questionnaireItemModel.questionnaireItem.type.value) { + case 'choice': + case 'open_choice': answerModel = CodingAnswerModel(this); break; - case QuestionnaireItemType.quantity: - case QuestionnaireItemType.decimal: - case QuestionnaireItemType.integer: + case 'quantity': + case 'decimal': + case 'integer': answerModel = NumericalAnswerModel(this); break; - case QuestionnaireItemType.string: - case QuestionnaireItemType.text: - case QuestionnaireItemType.url: + case 'string': + case 'text': + case 'url': answerModel = StringAnswerModel(this); break; - case QuestionnaireItemType.date: - case QuestionnaireItemType.datetime: - case QuestionnaireItemType.time: + case 'date': + case 'datetime': + case 'time': answerModel = DateTimeAnswerModel(this); break; - case QuestionnaireItemType.boolean: + case 'boolean': answerModel = BooleanAnswerModel(this); break; - case QuestionnaireItemType.display: + case 'display': throw UnsupportedError("Items of type 'display' do not have answers."); - case QuestionnaireItemType.group: + case 'group': throw UnsupportedError("Items of type 'group' do not have answers."); - case QuestionnaireItemType.attachment: - case QuestionnaireItemType.unknown: - case QuestionnaireItemType.reference: + case 'attachment': + case 'unknown': + case 'reference': // Throwing an exception here would lead to breakage of filler. answerModel = UnsupportedAnswerModel(this); } @@ -329,29 +329,29 @@ class QuestionItemModel extends ResponseItemModel { if (initialValues != null) { final initialValue = initialValues.first; - switch (questionnaireItem.type) { - case QuestionnaireItemType.integer: + switch (questionnaireItem.type.value) { + case 'integer': firstAnswerModel .populateFromExpression(initialValue.valueInteger?.value); break; - case QuestionnaireItemType.decimal: + case 'decimal': firstAnswerModel .populateFromExpression(initialValue.valueDecimal?.value); break; - case QuestionnaireItemType.string: + case 'string': firstAnswerModel.populateFromExpression(initialValue.valueString); break; - case QuestionnaireItemType.date: + case 'date': firstAnswerModel.populateFromExpression(initialValue.valueDate); break; - case QuestionnaireItemType.datetime: + case 'datetime': firstAnswerModel.populateFromExpression(initialValue.valueDateTime); break; - case QuestionnaireItemType.boolean: + case 'boolean': firstAnswerModel.populateFromExpression(initialValue.valueBoolean); break; - case QuestionnaireItemType.choice: - case QuestionnaireItemType.open_choice: + case 'choice': + case 'open_choice': final initialCodings = initialValues .where((qiv) => qiv.valueCoding != null) .map((qiv) => qiv.valueCoding!); diff --git a/lib/questionnaires/model/src/questionnaire_item_model.dart b/lib/questionnaires/model/src/questionnaire_item_model.dart index 267ec680..d6cbec39 100644 --- a/lib/questionnaires/model/src/questionnaire_item_model.dart +++ b/lib/questionnaires/model/src/questionnaire_item_model.dart @@ -134,8 +134,8 @@ class QuestionnaireItemModel with Diagnosticable { bool get isTotalScore { // Checking for read-only is relevant, // as there are also input fields (e.g. pain score) with unit {score}. - return (questionnaireItem.type == QuestionnaireItemType.quantity || - questionnaireItem.type == QuestionnaireItemType.decimal) && + return (questionnaireItem.type == Code('quantity') || + questionnaireItem.type == Code('decimal')) && ((questionnaireItem.readOnly == Boolean(true) && questionnaireItem.computableUnit?.display == '{score}') || questionnaireItem.extension_ @@ -180,15 +180,15 @@ class QuestionnaireItemModel with Diagnosticable { /// Is this itemModel unable to hold a value? bool get isStatic => isGroup || isDisplay; - bool get isGroup => questionnaireItem.type == QuestionnaireItemType.group; + bool get isGroup => questionnaireItem.type == Code('group'); - bool get isDisplay => questionnaireItem.type == QuestionnaireItemType.display; + bool get isDisplay => questionnaireItem.type == Code('display'); bool get isQuestion => !isDisplay && !isGroup; bool get isCodingType { - return questionnaireItem.type == QuestionnaireItemType.choice || - questionnaireItem.type == QuestionnaireItemType.open_choice; + return questionnaireItem.type == Code('choice') || + questionnaireItem.type == Code('open_choice'); } /// Is this item not changeable by end-users? diff --git a/lib/questionnaires/model/src/questionnaire_response_model.dart b/lib/questionnaires/model/src/questionnaire_response_model.dart index f35a2320..081aee10 100644 --- a/lib/questionnaires/model/src/questionnaire_response_model.dart +++ b/lib/questionnaires/model/src/questionnaire_response_model.dart @@ -446,7 +446,7 @@ class QuestionnaireResponseModel { QuestionnaireResponse? createQuestionnaireResponseForFhirPath() { _cachedQuestionnaireResponse ??= aggregator().aggregateResponseItems( - responseStatus: QuestionnaireResponseStatus.completed, + responseStatus: Code('completed'), generateNarrative: false, ); @@ -457,19 +457,18 @@ class QuestionnaireResponseModel { /// Returns a number that indicates whether the model has changed. int get generation => _generation; - final responseStatusNotifier = ValueNotifier( - QuestionnaireResponseStatus.in_progress, + final responseStatusNotifier = ValueNotifier( + Code('in_progress'), ); - QuestionnaireResponseStatus get responseStatus => - responseStatusNotifier.value; + Code get responseStatus => responseStatusNotifier.value; - set responseStatus(QuestionnaireResponseStatus newStatus) { + set responseStatus(Code newStatus) { responseStatusNotifier.value = newStatus; } - Id? _id; - Id? get id => _id; + String? _id; + String? get id => _id; void _populateItems( ResponseNode? parentNode, @@ -599,8 +598,7 @@ class QuestionnaireResponseModel { questionnaireResponseItems, ); - responseStatus = - questionnaireResponse.status ?? QuestionnaireResponseStatus.in_progress; + responseStatus = questionnaireResponse.status ?? Code('in_progress'); } void _updateCalculations() { diff --git a/lib/questionnaires/view/item/answer/src/datetime_answer_filler.dart b/lib/questionnaires/view/item/answer/src/datetime_answer_filler.dart index f4f1336a..f907a61b 100644 --- a/lib/questionnaires/view/item/answer/src/datetime_answer_filler.dart +++ b/lib/questionnaires/view/item/answer/src/datetime_answer_filler.dart @@ -1,7 +1,6 @@ import 'package:faiadashu/fhir_types/fhir_types.dart'; import 'package:faiadashu/questionnaires/questionnaires.dart'; -import 'package:fhir/r4.dart' - show Date, FhirDateTime, QuestionnaireItemType, Time; +import 'package:fhir/r4.dart' show Date, FhirDateTime, Time; import 'package:flutter/material.dart'; class DateTimeAnswerFiller extends QuestionnaireAnswerFiller { @@ -40,15 +39,14 @@ class _DateTimeInputControl extends AnswerInputControl { Widget build(BuildContext context) { final itemType = qi.type; - final initialDate = - (itemType != QuestionnaireItemType.time) ? answerModel.value : null; + final initialDate = (itemType.value != 'time') ? answerModel.value : null; final pickerType = ArgumentError.checkNotNull( const { - QuestionnaireItemType.date: Date, - QuestionnaireItemType.datetime: FhirDateTime, - QuestionnaireItemType.time: Time, - }[itemType], + 'date': Date, + 'datetime': FhirDateTime, + 'time': Time, + }[itemType.value], ); return Container( diff --git a/lib/questionnaires/view/item/answer/src/numerical_answer_filler.dart b/lib/questionnaires/view/item/answer/src/numerical_answer_filler.dart index 11226431..d7d84b0b 100644 --- a/lib/questionnaires/view/item/answer/src/numerical_answer_filler.dart +++ b/lib/questionnaires/view/item/answer/src/numerical_answer_filler.dart @@ -283,7 +283,7 @@ class _UnitDropDown extends AnswerInputControl { value: answerModel.keyForUnitChoice(value), child: Text(value.localizedDisplay(locale)), ); - }).toList(), + }), ], ), ), diff --git a/lib/questionnaires/view/item/answer/src/string_answer_filler.dart b/lib/questionnaires/view/item/answer/src/string_answer_filler.dart index 027dadfd..c56ca788 100644 --- a/lib/questionnaires/view/item/answer/src/string_answer_filler.dart +++ b/lib/questionnaires/view/item/answer/src/string_answer_filler.dart @@ -1,5 +1,4 @@ import 'package:faiadashu/questionnaires/questionnaires.dart'; -import 'package:fhir/r4.dart'; import 'package:flutter/material.dart'; class StringAnswerFiller extends QuestionnaireAnswerFiller { @@ -91,7 +90,7 @@ class _StringAnswerInputControl extends AnswerInputControl { enabled: answerModel.isControlEnabled, keyboardType: keyboardType, controller: editingController, - maxLines: (qi.type == QuestionnaireItemType.text) + maxLines: (qi.type.value == 'text') ? QuestionnaireTheme.of(context).maxLinesForTextItem : 1, decoration: InputDecoration( diff --git a/lib/questionnaires/view/item/src/question_response_item_filler.dart b/lib/questionnaires/view/item/src/question_response_item_filler.dart index 6bd26f10..32587eb0 100644 --- a/lib/questionnaires/view/item/src/question_response_item_filler.dart +++ b/lib/questionnaires/view/item/src/question_response_item_filler.dart @@ -209,9 +209,12 @@ class _HorizontalAnswerFillersState extends State<_HorizontalAnswerFillers> { context, answerFiller, hasMoreThanOneAnswer && - widget.questionResponseItemModel - .questionnaireResponseModel.responseStatus == - QuestionnaireResponseStatus.in_progress + widget + .questionResponseItemModel + .questionnaireResponseModel + .responseStatus + .value == + 'in_progress' ? () { _removeAnswerFiller(answerFiller); } @@ -238,8 +241,8 @@ class _HorizontalAnswerFillersState extends State<_HorizontalAnswerFillers> { ...decoratedAnswerFillers, if (isRepeating && widget.questionResponseItemModel.questionnaireResponseModel - .responseStatus == - QuestionnaireResponseStatus.in_progress) + .responseStatus.value == + 'in_progress') widget.questionnaireTheme.buildAddRepetition( context, widget.questionResponseItemModel, diff --git a/lib/questionnaires/view/src/questionnaire_complete_button.dart b/lib/questionnaires/view/src/questionnaire_complete_button.dart index a460da52..649d109d 100644 --- a/lib/questionnaires/view/src/questionnaire_complete_button.dart +++ b/lib/questionnaires/view/src/questionnaire_complete_button.dart @@ -1,7 +1,7 @@ import 'package:faiadashu/l10n/l10n.dart'; import 'package:faiadashu/questionnaires/questionnaires.dart' show QuestionnaireResponseFiller; -import 'package:fhir/r4/r4.dart' show QuestionnaireResponseStatus; +import 'package:fhir/primitive_types/code.dart'; import 'package:flutter/material.dart'; /// A button to complete a questionnaire. @@ -29,7 +29,7 @@ class _QuestionnaireCompleteButtonState final qrm = qf.questionnaireResponseModel; final currentResponseStatus = qrm.responseStatus; - if (currentResponseStatus != QuestionnaireResponseStatus.completed) { + if (currentResponseStatus.value != 'completed') { final incompleteItems = qrm.validate(notifyListeners: true); qrm.invalidityNotifier.value = incompleteItems; @@ -38,29 +38,30 @@ class _QuestionnaireCompleteButtonState } } - final newResponseStatus = - (currentResponseStatus == QuestionnaireResponseStatus.completed) - ? QuestionnaireResponseStatus.in_progress - : QuestionnaireResponseStatus.completed; + final newResponseStatus = (currentResponseStatus.value == 'completed') + ? Code('in_progress') + : Code('completed'); setState(() { qrm.responseStatus = newResponseStatus; }); - if (newResponseStatus == QuestionnaireResponseStatus.completed) { + if (newResponseStatus.value == 'completed') { widget.onCompleted?.call(); } }, icon: (QuestionnaireResponseFiller.of(context) .questionnaireResponseModel - .responseStatus != - QuestionnaireResponseStatus.completed) + .responseStatus + .value != + 'completed') ? const Icon(Icons.check_circle) : const Icon(Icons.edit), label: (QuestionnaireResponseFiller.of(context) .questionnaireResponseModel - .responseStatus != - QuestionnaireResponseStatus.completed) + .responseStatus + .value != + 'completed') ? Text( FDashLocalizations.of(context) .responseStatusToCompleteButtonLabel, diff --git a/pubspec.yaml b/pubspec.yaml index c623fd0f..d238aa80 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -25,8 +25,8 @@ environment: dependencies: collection: ^1.17.0 - fhir: ^0.8.0 - fhir_path: ^0.8.0 + fhir: ^0.9.0 + fhir_path: ^0.9.0 # fhir: # path: /Users/tilo/Projects/fhir/fhir # fhir_path: From 3c6e70e204509d1c162334183d3a605bcf17bc3d Mon Sep 17 00:00:00 2001 From: sh1l0n Date: Mon, 15 May 2023 12:27:25 +0200 Subject: [PATCH 04/12] trivial --- example/lib/main.dart | 4 ++-- example/lib/questionnaire_response_storage.dart | 12 ++++++------ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/example/lib/main.dart b/example/lib/main.dart index a8e9e112..27668f7b 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -89,7 +89,7 @@ class _HomePageState extends State { // Patient ID matches a patient on Meld Sandbox server. final sandboxPatient = Patient( - id: Id('smart-880378'), + id: 'smart-880378', name: [ HumanName( given: ['Amy', 'R'], @@ -98,7 +98,7 @@ class _HomePageState extends State { ) ], birthDate: Date('1999-12-08'), - gender: PatientGender.female, + gender: Code('female'), ); late final LaunchContext launchContext; diff --git a/example/lib/questionnaire_response_storage.dart b/example/lib/questionnaire_response_storage.dart index 7c32ed88..26061090 100644 --- a/example/lib/questionnaire_response_storage.dart +++ b/example/lib/questionnaire_response_storage.dart @@ -32,14 +32,14 @@ class QuestionnaireResponseStorage { scopes: Scopes( clinicalScopes: [ ClinicalScope( - Role.patient, - R4ResourceType.Patient, - Interaction.any, + role: Role.patient, + interaction: Interaction.any, + resourceType: R4ResourceType.Patient, ), ClinicalScope( - Role.patient, - R4ResourceType.QuestionnaireResponse, - Interaction.any, + role: Role.patient, + resourceType: R4ResourceType.QuestionnaireResponse, + interaction: Interaction.any, ), ], openid: true, From 493cf3e112880b93ca09f988a7118479234994ad Mon Sep 17 00:00:00 2001 From: Nazar Lytvyn Date: Tue, 16 May 2023 22:24:48 +0300 Subject: [PATCH 05/12] Flutter 3.10.0 support --- example/pubspec.lock | 34 +++++++++---------- example/pubspec.yaml | 4 +-- faiabench/pubspec.yaml | 2 +- .../view/src/narrative_drawer.dart | 2 +- pubspec.yaml | 2 +- 5 files changed, 22 insertions(+), 22 deletions(-) diff --git a/example/pubspec.lock b/example/pubspec.lock index 2b435d04..51b25ae5 100644 --- a/example/pubspec.lock +++ b/example/pubspec.lock @@ -37,10 +37,10 @@ packages: dependency: transitive description: name: characters - sha256: e6a326c8af69605aec75ed6c187d06b349707a27fbff8222ca9cc2cff167975c + sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605" url: "https://pub.dev" source: hosted - version: "1.2.1" + version: "1.3.0" clock: dependency: transitive description: @@ -53,10 +53,10 @@ packages: dependency: "direct main" description: name: collection - sha256: cfc915e6923fe5ce6e153b0723c753045de46de1b4d63771530504004a45fae0 + sha256: f092b211a4319e98e5ff58223576de6c2803db36221657b46c82574721240687 url: "https://pub.dev" source: hosted - version: "1.17.0" + version: "1.17.2" crypto: dependency: transitive description: @@ -162,10 +162,10 @@ packages: dependency: "direct main" description: name: google_fonts - sha256: e70521755a6b08c6bde14ddae27dff5bf21010033888fc61da6c595f8a9f58c1 + sha256: "6b6f10f0ce3c42f6552d1c70d2c28d764cf22bb487f50f66cca31dcd5194f4d6" url: "https://pub.dev" source: hosted - version: "2.3.3" + version: "4.0.4" google_sign_in: dependency: transitive description: @@ -234,18 +234,18 @@ packages: dependency: "direct main" description: name: intl - sha256: "910f85bce16fb5c6f614e117efa303e85a1731bb0081edf3604a2ae6e9a3cc91" + sha256: "3bc132a9dbce73a7e4a21a17d06e1878839ffbf975568bc875c60537824b0c4d" url: "https://pub.dev" source: hosted - version: "0.17.0" + version: "0.18.1" js: dependency: transitive description: name: js - sha256: "5528c2f391ededb7775ec1daa69e65a2d61276f7552de2b5f7b8d34ee9fd4ab7" + sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3 url: "https://pub.dev" source: hosted - version: "0.6.5" + version: "0.6.7" json_annotation: dependency: transitive description: @@ -266,10 +266,10 @@ packages: dependency: "direct dev" description: name: lint - sha256: "3e9343b1cededcfb1e8b40d0dbd3592b7a1c6c0121545663a991433390c2bc97" + sha256: f4bd4dbaa39f4ae8836f2d1275f2f32bc68b3a8cce0a0735dd1f7a601f06682a url: "https://pub.dev" source: hosted - version: "2.0.1" + version: "2.1.2" logging: dependency: "direct main" description: @@ -306,10 +306,10 @@ packages: dependency: transitive description: name: meta - sha256: "6c268b42ed578a53088d834796959e4a1814b5e9e164f147f580a386e5decf42" + sha256: "3c74dbf8763d36539f114c799d8a2d87343b5067e9d796ca22b5eb8437090ee3" url: "https://pub.dev" source: hosted - version: "1.8.0" + version: "1.9.1" oauth2: dependency: transitive description: @@ -322,10 +322,10 @@ packages: dependency: transitive description: name: path - sha256: db9d4f58c908a4ba5953fcee2ae317c94889433e5024c27ce74a37f94267945b + sha256: "8829d8a55c13fc0e37127c29fedf290c102f4e40ae94ada574091fe0ff96c917" url: "https://pub.dev" source: hosted - version: "1.8.2" + version: "1.8.3" path_provider: dependency: transitive description: @@ -660,5 +660,5 @@ packages: source: hosted version: "3.1.1" sdks: - dart: ">=2.19.0 <3.0.0" + dart: ">=3.0.0 <4.0.0" flutter: ">=3.3.0" diff --git a/example/pubspec.yaml b/example/pubspec.yaml index 6ff0ca16..3b6e3df3 100644 --- a/example/pubspec.yaml +++ b/example/pubspec.yaml @@ -17,8 +17,8 @@ dependencies: sdk: flutter flutter_localizations: sdk: flutter - google_fonts: ^2.1.1 - intl: ^0.17.0 + google_fonts: ^4.0.4 + intl: ^0.18.1 logging: ^1.0.2 simple_html_css: ^4.0.0 diff --git a/faiabench/pubspec.yaml b/faiabench/pubspec.yaml index 97db7e3d..e449ed8d 100644 --- a/faiabench/pubspec.yaml +++ b/faiabench/pubspec.yaml @@ -35,7 +35,7 @@ dependencies: sdk: flutter flutter_riverpod: ^2.3.0 highlight: ^0.7.0 - intl: ^0.17.0 + intl: ^0.18.1 logging: ^1.0.1 multi_split_view: ^2.0.0 simple_html_css: ^4.0.0 diff --git a/lib/questionnaires/view/src/narrative_drawer.dart b/lib/questionnaires/view/src/narrative_drawer.dart index 8c0f6aeb..c62423d6 100644 --- a/lib/questionnaires/view/src/narrative_drawer.dart +++ b/lib/questionnaires/view/src/narrative_drawer.dart @@ -73,7 +73,7 @@ class _NarrativeDrawerState extends State { : QuestionnaireResponseFiller.of(context) .aggregator() .aggregate() - ?.div, + ?.div ?? '', ), ).then((_) { ScaffoldMessenger.of(context).showSnackBar( diff --git a/pubspec.yaml b/pubspec.yaml index d238aa80..30b3133e 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -35,7 +35,7 @@ dependencies: sdk: flutter flutter_localizations: sdk: flutter - intl: ^0.17.0 + intl: ^0.18.1 logging: ^1.0.2 markdown: ^7.0.0 meta: ^1.7.0 From 81ed2cb9deacc1b775960411f24bb4f08b0277dc Mon Sep 17 00:00:00 2001 From: Nazar Lytvyn Date: Wed, 17 May 2023 00:13:44 +0300 Subject: [PATCH 06/12] Fhir 0.10.0 support --- lib/coding/src/data_absent_reasons.dart | 16 ++++++------- lib/fhir_types/src/date_time_picker.dart | 10 ++++---- lib/fhir_types/src/fhir_types_extensions.dart | 12 ++++++---- .../questionnaire_response_aggregator.dart | 22 ++++++++--------- .../src/total_score_aggregator.dart | 8 +++---- .../src/fhir_expression_evaluator.dart | 12 +++++----- .../src/fhirpath_expression_evaluator.dart | 4 ++-- .../item/answer/src/boolean_answer_model.dart | 16 ++++++------- .../src/coding_answer_option_model.dart | 8 +++---- .../answer/src/datetime_answer_model.dart | 8 +++---- .../answer/src/numerical_answer_model.dart | 19 +++++++-------- .../model/item/src/question_item_model.dart | 8 +++---- .../model/item/src/response_item_model.dart | 4 ++-- .../model/item/src/usage_mode.dart | 12 +++++----- .../model/src/questionnaire_item_model.dart | 24 +++++++++---------- .../src/questionnaire_model_defaults.dart | 2 +- .../src/questionnaire_response_model.dart | 14 +++++------ .../model/src/rendering_string.dart | 2 +- .../model/src/variable_model.dart | 2 +- .../answer/src/boolean_answer_filler.dart | 6 ++--- .../answer/src/datetime_answer_filler.dart | 6 ++--- .../answer/src/numerical_answer_filler.dart | 4 ++-- .../src/question_response_item_filler.dart | 2 +- .../view/item/src/total_score_item.dart | 2 +- .../src/questionnaire_complete_button.dart | 4 ++-- .../view/src/questionnaire_stepper.dart | 4 ++-- pubspec.yaml | 4 ++-- 27 files changed, 118 insertions(+), 117 deletions(-) diff --git a/lib/coding/src/data_absent_reasons.dart b/lib/coding/src/data_absent_reasons.dart index df216a4b..ffc5933c 100644 --- a/lib/coding/src/data_absent_reasons.dart +++ b/lib/coding/src/data_absent_reasons.dart @@ -14,7 +14,7 @@ final dataAbsentReasonMasked = Coding( system: dataAbsentReasonSystem, ); -const dataAbsentReasonMaskedCode = Code.asConst('masked'); +const dataAbsentReasonMaskedCode = FhirCode.asConst('masked'); /// This information has not been sought (e.g., patient was not asked) final dataAbsentReasonNotAsked = Coding( @@ -23,7 +23,7 @@ final dataAbsentReasonNotAsked = Coding( system: dataAbsentReasonSystem, ); -const dataAbsentReasonNotAskedCode = Code.asConst('not-asked'); +const dataAbsentReasonNotAskedCode = FhirCode.asConst('not-asked'); /// Information was sought but not found (e.g., patient was asked but didn't know) final dataAbsentReasonAskedButUnknown = Coding( @@ -32,7 +32,7 @@ final dataAbsentReasonAskedButUnknown = Coding( system: dataAbsentReasonSystem, ); -const dataAbsentReasonAskedButUnknownCode = Code.asConst('asked-unknown'); +const dataAbsentReasonAskedButUnknownCode = FhirCode.asConst('asked-unknown'); /// The source was asked but declined to answer. final dataAbsentReasonAskedButDeclined = Coding( @@ -41,7 +41,7 @@ final dataAbsentReasonAskedButDeclined = Coding( system: dataAbsentReasonSystem, ); -const dataAbsentReasonAskedButDeclinedCode = Code.asConst('asked-declined'); +const dataAbsentReasonAskedButDeclinedCode = FhirCode.asConst('asked-declined'); /// Information is not available at this time but it is expected that it will be available later. final dataAbsentReasonTemporarilyUnknown = Coding( @@ -50,11 +50,11 @@ final dataAbsentReasonTemporarilyUnknown = Coding( system: dataAbsentReasonSystem, ); -const dataAbsentReasonTempUnknownCode = Code.asConst('temp-unknown'); +const dataAbsentReasonTempUnknownCode = FhirCode.asConst('temp-unknown'); -const dataAbsentReasonAsTextCode = Code.asConst('as-text'); +const dataAbsentReasonAsTextCode = FhirCode.asConst('as-text'); -const dataAbsentReasonErrorCode = Code.asConst('error'); +const dataAbsentReasonErrorCode = FhirCode.asConst('error'); // Some system or workflow process error means that the information is not available. final dataAbsentReasonError = Coding( @@ -75,7 +75,7 @@ final dataAbsentReasonAsText = Coding( ); extension DataAbsentReasonExtension on List { - Code? get dataAbsentReason { + FhirCode? get dataAbsentReason { return extensionOrNull(dataAbsentReasonExtensionUrl)?.valueCode; } } diff --git a/lib/fhir_types/src/date_time_picker.dart b/lib/fhir_types/src/date_time_picker.dart index 582629d4..cad1bc61 100644 --- a/lib/fhir_types/src/date_time_picker.dart +++ b/lib/fhir_types/src/date_time_picker.dart @@ -61,7 +61,7 @@ class _FhirDateTimePickerState extends State { Future _showPicker(Locale locale) async { DateTime dateTime = DateTime(1970); - if (widget.pickerType != Time) { + if (widget.pickerType != FhirTime) { final date = await showDatePicker( initialDate: _dateTimeValue?.value ?? DateTime.now(), firstDate: widget.firstDate, @@ -77,7 +77,7 @@ class _FhirDateTimePickerState extends State { } if (mounted && - (widget.pickerType == FhirDateTime || widget.pickerType == Time)) { + (widget.pickerType == FhirDateTime || widget.pickerType == FhirTime)) { final time = await showTimePicker( initialTime: TimeOfDay.fromDateTime(_dateTimeValue?.value ?? DateTime.now()), @@ -106,12 +106,12 @@ class _FhirDateTimePickerState extends State { final fhirDateTime = FhirDateTime.fromDateTime( dateTime, - (widget.pickerType == Date) + (widget.pickerType == FhirDate) ? DateTimePrecision.YYYYMMDD : DateTimePrecision.FULL, ); setState(() { - _dateTimeFieldController.text = (widget.pickerType == Time) + _dateTimeFieldController.text = (widget.pickerType == FhirTime) ? DateFormat.jm(locale.toString()).format(dateTime) : fhirDateTime.format(locale); }); @@ -137,7 +137,7 @@ class _FhirDateTimePickerState extends State { enabled: widget.enabled, textAlignVertical: TextAlignVertical.center, decoration: widget.decoration?.copyWith( - prefixIcon: (widget.pickerType == Time) + prefixIcon: (widget.pickerType == FhirTime) ? const Icon(Icons.access_time) : const Icon(Icons.calendar_today_outlined), ), diff --git a/lib/fhir_types/src/fhir_types_extensions.dart b/lib/fhir_types/src/fhir_types_extensions.dart index 26a14bcd..23cff13c 100644 --- a/lib/fhir_types/src/fhir_types_extensions.dart +++ b/lib/fhir_types/src/fhir_types_extensions.dart @@ -5,7 +5,7 @@ import 'package:faiadashu/logging/logging.dart'; import 'package:fhir/r4.dart'; import 'package:intl/intl.dart'; -extension FDashTimeExtension on Time { +extension FDashTimeExtension on FhirTime { String format(Locale locale, {String defaultText = ''}) { final localeCode = locale.toString(); if (!isValid) { @@ -17,7 +17,7 @@ extension FDashTimeExtension on Time { } } -extension FDashDateExtension on Date { +extension FDashDateExtension on FhirDate { String format(Locale locale, {String defaultText = ''}) { final localeCode = locale.toString(); final DateFormat dateFormat; @@ -73,8 +73,8 @@ extension FDashDateTimeExtension on FhirDateTime { } } -extension FDashDecimalExtension on Decimal { - static final _logger = Logger(Decimal); +extension FDashDecimalExtension on FhirDecimal { + static final _logger = Logger(FhirDecimal); String format(Locale locale) { if (!isValid) { @@ -212,6 +212,10 @@ extension FDashPatientExtension on Patient { } } +extension ResoureExtension on Resource { + String? get id => fhirId; +} + /// Access to [FhirExtension]s from a List. /// /// Mimics a [Map] with String?/FhirUri as the key and FhirExtension as value. diff --git a/lib/questionnaires/model/aggregation/src/questionnaire_response_aggregator.dart b/lib/questionnaires/model/aggregation/src/questionnaire_response_aggregator.dart index 97bdda62..659cee88 100644 --- a/lib/questionnaires/model/aggregation/src/questionnaire_response_aggregator.dart +++ b/lib/questionnaires/model/aggregation/src/questionnaire_response_aggregator.dart @@ -18,7 +18,7 @@ class QuestionnaireResponseAggregator QuestionnaireResponseItem? _fromQuestionItem( QuestionItemModel itemModel, - Code responseStatus, + FhirCode responseStatus, Map responseItemRegistry, ) { if (responseStatus.value == 'completed' && !itemModel.isEnabled) { @@ -88,7 +88,7 @@ class QuestionnaireResponseAggregator QuestionnaireResponseItem? _fromGroupItem( GroupItemModel itemModel, - Code responseStatus, + FhirCode responseStatus, Map responseItemRegistry, ) { if (responseStatus.value == 'completed' && !itemModel.isEnabled) { @@ -116,7 +116,7 @@ class QuestionnaireResponseAggregator List? _fromResponseItems( ResponseNode? parentNode, - Code responseStatus, + FhirCode responseStatus, Map responseItemRegistry, ) { final responseItems = []; @@ -152,7 +152,7 @@ class QuestionnaireResponseAggregator @override QuestionnaireResponse? aggregate({ - Code? responseStatus, + FhirCode? responseStatus, bool notifyListeners = false, bool containPatient = false, }) { @@ -171,7 +171,7 @@ class QuestionnaireResponseAggregator } Map aggregateResponseItems({ - Code? responseStatus, + FhirCode? responseStatus, bool notifyListeners = false, bool containPatient = false, bool generateNarrative = true, @@ -195,7 +195,7 @@ class QuestionnaireResponseAggregator final questionnaireVersion = questionnaireResponseModel.questionnaireModel.questionnaire.version; final questionnaireCanonical = (questionnaireUrl != null) - ? Canonical( + ? FhirCanonical( "$questionnaireUrl${(questionnaireVersion != null) ? '|$questionnaireVersion' : ''}", ) : null; @@ -225,17 +225,17 @@ class QuestionnaireResponseAggregator } final profiles = [ - Canonical( + FhirCanonical( 'http://hl7.org/fhir/4.0/StructureDefinition/QuestionnaireResponse', ), if (isValidSdc) - Canonical( + FhirCanonical( 'http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaireresponse', ), ]; final meta = (profiles.isNotEmpty) - ? Meta(profile: profiles.isNotEmpty ? profiles : null) + ? FhirMeta(profile: profiles.isNotEmpty ? profiles : null) : null; final narrative = generateNarrative @@ -245,7 +245,7 @@ class QuestionnaireResponseAggregator : NarrativeAggregator.emptyNarrative; final questionnaireResponse = QuestionnaireResponse( - id: questionnaireResponseId, + fhirId: questionnaireResponseId, status: responseStatus, meta: meta, contained: (contained.isNotEmpty) ? contained : null, @@ -253,7 +253,7 @@ class QuestionnaireResponseAggregator item: responseItems, authored: FhirDateTime(DateTime.now()), text: (narrative?.status == NarrativeStatus.empty) ? null : narrative, - language: Code(locale.toLanguageTag()), + language: FhirCode(locale.toLanguageTag()), subject: subjectReference, questionnaireElement: (questionnaireTitle != null) ? Element( diff --git a/lib/questionnaires/model/aggregation/src/total_score_aggregator.dart b/lib/questionnaires/model/aggregation/src/total_score_aggregator.dart index 313929e2..2910ec6d 100644 --- a/lib/questionnaires/model/aggregation/src/total_score_aggregator.dart +++ b/lib/questionnaires/model/aggregation/src/total_score_aggregator.dart @@ -12,12 +12,12 @@ import 'package:fhir/r4.dart'; /// Can deal with incomplete questionnaires. /// /// Will return 0 when no score field exists on the questionnaire. -class TotalScoreAggregator extends Aggregator { +class TotalScoreAggregator extends Aggregator { static final _logger = Logger(TotalScoreAggregator); late final QuestionItemModel? totalScoreItem; TotalScoreAggregator({bool autoAggregate = true}) - : super(Decimal(0), autoAggregate: autoAggregate); + : super(FhirDecimal(0), autoAggregate: autoAggregate); @override void init(QuestionnaireResponseModel questionnaireResponseModel) { @@ -41,7 +41,7 @@ class TotalScoreAggregator extends Aggregator { } @override - Decimal? aggregate({bool notifyListeners = false}) { + FhirDecimal? aggregate({bool notifyListeners = false}) { final totalScoreItem = this.totalScoreItem; if (totalScoreItem == null) { return null; @@ -56,7 +56,7 @@ class TotalScoreAggregator extends Aggregator { ); _logger.debug('sum: $sum'); - final result = Decimal(sum); + final result = FhirDecimal(sum); if (notifyListeners) { value = result; } diff --git a/lib/questionnaires/model/expression/src/fhir_expression_evaluator.dart b/lib/questionnaires/model/expression/src/fhir_expression_evaluator.dart index a34b2379..27a1f7ad 100644 --- a/lib/questionnaires/model/expression/src/fhir_expression_evaluator.dart +++ b/lib/questionnaires/model/expression/src/fhir_expression_evaluator.dart @@ -4,7 +4,7 @@ import 'package:fhir/r4/resource/resource.dart'; abstract class FhirExpressionEvaluator extends ExpressionEvaluator { FhirExpressionEvaluator( - Expression fhirExpression, + FhirExpression fhirExpression, Iterable upstreamExpressions, { String? debugLabel, }) : super( @@ -16,13 +16,13 @@ abstract class FhirExpressionEvaluator extends ExpressionEvaluator { factory FhirExpressionEvaluator.fromExpression( Resource? Function()? resourceBuilder, - Expression fhirExpression, + FhirExpression fhirExpression, Iterable upstreamExpressions, { Map? Function()? jsonBuilder, String? debugLabel, }) { switch (ArgumentError.checkNotNull(fhirExpression.language)) { - case ExpressionLanguage.text_fhirpath: + case FhirExpressionLanguage.text_fhirpath: return FhirPathExpressionEvaluator( resourceBuilder, fhirExpression, @@ -30,14 +30,14 @@ abstract class FhirExpressionEvaluator extends ExpressionEvaluator { jsonBuilder: jsonBuilder, debugLabel: debugLabel, ); - case ExpressionLanguage.application_x_fhir_query: + case FhirExpressionLanguage.application_x_fhir_query: return FhirQueryExpressionEvaluator( fhirExpression, upstreamExpressions, debugLabel: debugLabel, ); - case ExpressionLanguage.text_cql: - case ExpressionLanguage.unknown: + case FhirExpressionLanguage.text_cql: + case FhirExpressionLanguage.unknown: default: throw UnsupportedError( 'Expressions of type ${fhirExpression.language} are unsupported.', diff --git a/lib/questionnaires/model/expression/src/fhirpath_expression_evaluator.dart b/lib/questionnaires/model/expression/src/fhirpath_expression_evaluator.dart index 4b5a3cb9..4e18b391 100644 --- a/lib/questionnaires/model/expression/src/fhirpath_expression_evaluator.dart +++ b/lib/questionnaires/model/expression/src/fhirpath_expression_evaluator.dart @@ -19,7 +19,7 @@ class FhirPathExpressionEvaluator extends FhirExpressionEvaluator { FhirPathExpressionEvaluator( this.resourceBuilder, - Expression fhirPathExpression, + FhirExpression fhirPathExpression, Iterable upstreamExpressions, { this.jsonBuilder, String? debugLabel, @@ -29,7 +29,7 @@ class FhirPathExpressionEvaluator extends FhirExpressionEvaluator { upstreamExpressions, debugLabel: debugLabel, ) { - if (fhirPathExpression.language != ExpressionLanguage.text_fhirpath) { + if (fhirPathExpression.language != FhirExpressionLanguage.text_fhirpath) { throw ArgumentError( '$name has wrong language: ${fhirPathExpression.language}', ); diff --git a/lib/questionnaires/model/item/answer/src/boolean_answer_model.dart b/lib/questionnaires/model/item/answer/src/boolean_answer_model.dart index 076a379c..c4874a62 100644 --- a/lib/questionnaires/model/item/answer/src/boolean_answer_model.dart +++ b/lib/questionnaires/model/item/answer/src/boolean_answer_model.dart @@ -1,7 +1,7 @@ import 'package:faiadashu/questionnaires/model/model.dart'; import 'package:fhir/r4.dart'; -class BooleanAnswerModel extends AnswerModel { +class BooleanAnswerModel extends AnswerModel { BooleanAnswerModel(super.responseModel); @override @@ -16,19 +16,19 @@ class BooleanAnswerModel extends AnswerModel { RenderingString get display => (value == null) ? RenderingString.nullText : RenderingString.fromText( - (value == Boolean(true)) ? '[X]' : '[ ]', - xhtmlText: (value == Boolean(true)) + (value == FhirBoolean(true)) ? '[X]' : '[ ]', + xhtmlText: (value == FhirBoolean(true)) ? '[X]' : '[ ]', ); @override - String? validateInput(Boolean? inValue) { + String? validateInput(FhirBoolean? inValue) { return null; } @override - String? validateValue(Boolean? inputValue) { + String? validateValue(FhirBoolean? inputValue) { return null; } @@ -46,13 +46,13 @@ class BooleanAnswerModel extends AnswerModel { return; } - if (evaluationResult is Boolean) { + if (evaluationResult is FhirBoolean) { value = evaluationResult; } else if (evaluationResult is bool) { - value = Boolean(evaluationResult); + value = FhirBoolean(evaluationResult); } else { // Non-empty, non-booleans are true - value = Boolean(true); + value = FhirBoolean(true); } } diff --git a/lib/questionnaires/model/item/answer/src/coding_answer_option_model.dart b/lib/questionnaires/model/item/answer/src/coding_answer_option_model.dart index e1caa725..5f5234e3 100644 --- a/lib/questionnaires/model/item/answer/src/coding_answer_option_model.dart +++ b/lib/questionnaires/model/item/answer/src/coding_answer_option_model.dart @@ -23,7 +23,7 @@ class CodingAnswerOptionModel { bool get hasMedia => itemMedia != null; - final Decimal? fhirOrdinalValue; + final FhirDecimal? fhirOrdinalValue; final RenderingString? optionPrefix; final bool isExclusive; @@ -226,11 +226,11 @@ class CodingAnswerOptionModel { return coding != null ? coding.copyWith( extension_: (codingExtensions.isNotEmpty) ? codingExtensions : null, - userSelected: Boolean(true), + userSelected: FhirBoolean(true), ) : Coding( display: forDisplay, - userSelected: Boolean(true), + userSelected: FhirBoolean(true), ); } @@ -276,7 +276,7 @@ class CodingAnswerOptionModel { choiceColumnExt.extension_ ?.extensionOrNull('forDisplay') ?.valueBoolean == - Boolean(true), + FhirBoolean(true), ); final forDisplayPath = diff --git a/lib/questionnaires/model/item/answer/src/datetime_answer_model.dart b/lib/questionnaires/model/item/answer/src/datetime_answer_model.dart index 485c6673..1e338da8 100644 --- a/lib/questionnaires/model/item/answer/src/datetime_answer_model.dart +++ b/lib/questionnaires/model/item/answer/src/datetime_answer_model.dart @@ -3,11 +3,11 @@ import 'package:faiadashu/l10n/l10n.dart'; import 'package:faiadashu/questionnaires/model/model.dart'; import 'package:fhir/r4.dart' show - Date, + FhirDate, FhirDateTime, QuestionnaireResponseAnswer, QuestionnaireResponseItem, - Time; + FhirTime; class DateTimeAnswerModel extends AnswerModel { DateTimeAnswerModel(super.responseModel); @@ -31,7 +31,7 @@ class DateTimeAnswerModel extends AnswerModel { if (itemType.value == 'date') { return QuestionnaireResponseAnswer( - valueDate: Date(value!.value), + valueDate: FhirDate(value!.value), item: items, ); } else if (itemType.value == 'datetime') { @@ -41,7 +41,7 @@ class DateTimeAnswerModel extends AnswerModel { ); } else if (itemType.value == 'time') { return QuestionnaireResponseAnswer( - valueTime: Time( + valueTime: FhirTime( value!.value!.toIso8601String().substring('yyyy-MM-ddT'.length), ), item: items, diff --git a/lib/questionnaires/model/item/answer/src/numerical_answer_model.dart b/lib/questionnaires/model/item/answer/src/numerical_answer_model.dart index 3c6cb26e..0275fe30 100644 --- a/lib/questionnaires/model/item/answer/src/numerical_answer_model.dart +++ b/lib/questionnaires/model/item/answer/src/numerical_answer_model.dart @@ -177,9 +177,6 @@ class NumericalAnswerModel extends AnswerModel { try { number = numberFormat.parse(inputValue); } catch (_) { - // Ignore FormatException, number remains nan. - } - if (number == double.nan) { return lookupFDashLocalizations(locale).validatorNan; } @@ -202,11 +199,11 @@ class NumericalAnswerModel extends AnswerModel { if (number > _maxValue) { return lookupFDashLocalizations(locale) - .validatorMaxValue(Decimal(_maxValue).format(locale)); + .validatorMaxValue(FhirDecimal(_maxValue).format(locale)); } if (number < _minValue) { return lookupFDashLocalizations(locale) - .validatorMinValue(Decimal(_minValue).format(locale)); + .validatorMinValue(FhirDecimal(_minValue).format(locale)); } return null; @@ -236,7 +233,7 @@ class NumericalAnswerModel extends AnswerModel { /// /// * Updates the numerical value based on a [Decimal] /// * Keeps the unit - Quantity? copyWithValue(Decimal? newValue) { + Quantity? copyWithValue(FhirDecimal? newValue) { return (value != null) ? value!.copyWith(value: newValue) : Quantity(value: newValue); @@ -261,11 +258,11 @@ class NumericalAnswerModel extends AnswerModel { ? value?.copyWith(value: null) : value == null ? Quantity( - value: Decimal(numberFormat.parse(textInput)), + value: FhirDecimal(numberFormat.parse(textInput)), extension_: dataAbsentReasonExtension, ) : value!.copyWith( - value: Decimal(numberFormat.parse(textInput)), + value: FhirDecimal(numberFormat.parse(textInput)), extension_: dataAbsentReasonExtension, ); } @@ -297,7 +294,7 @@ class NumericalAnswerModel extends AnswerModel { case 'integer': return (value!.value != null) ? QuestionnaireResponseAnswer( - valueInteger: Integer(value!.value!.value!.round()), + valueInteger: FhirInteger(value!.value!.value!.round()), extension_: value!.extension_, item: items, ) @@ -313,7 +310,7 @@ class NumericalAnswerModel extends AnswerModel { Quantity? _valueFromNumber(dynamic inputNumber) { final unitCoding = qi.computableUnit; - final quantityValue = Decimal(inputNumber); + final quantityValue = FhirDecimal(inputNumber); return Quantity( value: quantityValue, @@ -352,7 +349,7 @@ class NumericalAnswerModel extends AnswerModel { ? Quantity(value: answer.valueDecimal) : (answer.valueInteger != null && answer.valueInteger!.isValid) ? Quantity( - value: Decimal(answer.valueInteger), + value: FhirDecimal(answer.valueInteger), ) : null); } diff --git a/lib/questionnaires/model/item/src/question_item_model.dart b/lib/questionnaires/model/item/src/question_item_model.dart index e9d54287..f5e73785 100644 --- a/lib/questionnaires/model/item/src/question_item_model.dart +++ b/lib/questionnaires/model/item/src/question_item_model.dart @@ -15,14 +15,14 @@ import 'package:fhir_path/fhir_path.dart'; class QuestionItemModel extends ResponseItemModel { static final _qimLogger = Logger(QuestionItemModel); - Code? _dataAbsentReason; + FhirCode? _dataAbsentReason; /// Reason why this response is empty. /// /// see [DataAbsentReason] - Code? get dataAbsentReason => _dataAbsentReason; + FhirCode? get dataAbsentReason => _dataAbsentReason; - set dataAbsentReason(Code? newDataAbsentReason) { + set dataAbsentReason(FhirCode? newDataAbsentReason) { if (_dataAbsentReason != newDataAbsentReason) { _dataAbsentReason = newDataAbsentReason; nextGeneration( @@ -148,7 +148,7 @@ class QuestionItemModel extends ResponseItemModel { /// Returns a [Decimal] value which can be added to a score. /// /// Returns null if not applicable (either question unanswered, or wrong type) - Decimal? get ordinalValue { + FhirDecimal? get ordinalValue { final answerModel = firstAnswerModel; return answerModel.isNotEmpty && diff --git a/lib/questionnaires/model/item/src/response_item_model.dart b/lib/questionnaires/model/item/src/response_item_model.dart index b48ead2e..eb12a98b 100644 --- a/lib/questionnaires/model/item/src/response_item_model.dart +++ b/lib/questionnaires/model/item/src/response_item_model.dart @@ -22,9 +22,9 @@ abstract class ResponseItemModel extends FillerItemModel { ? FhirPathExpressionEvaluator( () => questionnaireResponseModel .createQuestionnaireResponseForFhirPath(), - Expression( + FhirExpression( expression: constraintExpression, - language: ExpressionLanguage.text_fhirpath, + language: FhirExpressionLanguage.text_fhirpath, ), [ ...itemWithPredecessorsExpressionEvaluators, diff --git a/lib/questionnaires/model/item/src/usage_mode.dart b/lib/questionnaires/model/item/src/usage_mode.dart index ccd77710..826fab46 100644 --- a/lib/questionnaires/model/item/src/usage_mode.dart +++ b/lib/questionnaires/model/item/src/usage_mode.dart @@ -14,7 +14,7 @@ final usageModeCaptureDisplay = Coding( system: usageModeSystem, ); -const usageModeCaptureDisplayCode = Code.asConst('capture-display'); +const usageModeCaptureDisplayCode = FhirCode.asConst('capture-display'); /// Render the item only when capturing data. final usageModeCapture = Coding( @@ -23,7 +23,7 @@ final usageModeCapture = Coding( system: usageModeSystem, ); -const usageModeCaptureCode = Code.asConst('capture'); +const usageModeCaptureCode = FhirCode.asConst('capture'); /// Render the item only when displaying data. final usageModeDisplay = Coding( @@ -32,7 +32,7 @@ final usageModeDisplay = Coding( system: usageModeSystem, ); -const usageModeDisplayCode = Code.asConst('display'); +const usageModeDisplayCode = FhirCode.asConst('display'); /// Render the item only when displaying a completed form and the item has been answered (or has child items that have been answered). final usageModeDisplayNonEmpty = Coding( @@ -41,7 +41,7 @@ final usageModeDisplayNonEmpty = Coding( system: usageModeSystem, ); -const usageModeDisplayNonEmptyCode = Code.asConst('display-non-empty'); +const usageModeDisplayNonEmptyCode = FhirCode.asConst('display-non-empty'); /// Render the item when capturing data or when displaying a completed form and the item has been answered (or has child items that have been answered). final usageModeCaptureDisplayNonEmpty = Coding( @@ -51,10 +51,10 @@ final usageModeCaptureDisplayNonEmpty = Coding( ); const usageModeCaptureDisplayNonEmptyCode = - Code.asConst('capture-display-non-empty'); + FhirCode.asConst('capture-display-non-empty'); extension UsageModeExtension on List { - Code? get usageMode { + FhirCode? get usageMode { return extensionOrNull(usageModeExtensionUrl)?.valueCode; } } diff --git a/lib/questionnaires/model/src/questionnaire_item_model.dart b/lib/questionnaires/model/src/questionnaire_item_model.dart index d6cbec39..94bf8060 100644 --- a/lib/questionnaires/model/src/questionnaire_item_model.dart +++ b/lib/questionnaires/model/src/questionnaire_item_model.dart @@ -95,9 +95,9 @@ class QuestionnaireItemModel with Diagnosticable { /// This will not return `true` for repeating `choice` or `open-choice` items, /// as these are multiple choice, rather than truly repeating. bool get isRepeating => - questionnaireItem.repeats == Boolean(true) && !isCodingType; + questionnaireItem.repeats == FhirBoolean(true) && !isCodingType; - bool get isRequired => questionnaireItem.required_ == Boolean(true); + bool get isRequired => questionnaireItem.required_ == FhirBoolean(true); bool get hasConstraint => constraintExpression != null; @@ -134,9 +134,9 @@ class QuestionnaireItemModel with Diagnosticable { bool get isTotalScore { // Checking for read-only is relevant, // as there are also input fields (e.g. pain score) with unit {score}. - return (questionnaireItem.type == Code('quantity') || - questionnaireItem.type == Code('decimal')) && - ((questionnaireItem.readOnly == Boolean(true) && + return (questionnaireItem.type == FhirCode('quantity') || + questionnaireItem.type == FhirCode('decimal')) && + ((questionnaireItem.readOnly == FhirBoolean(true) && questionnaireItem.computableUnit?.display == '{score}') || questionnaireItem.extension_ ?.firstWhereOrNull( @@ -153,7 +153,7 @@ class QuestionnaireItemModel with Diagnosticable { static const String calculatedExpressionExtensionUrl = 'http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-calculatedExpression'; - Expression? get calculatedExpression { + FhirExpression? get calculatedExpression { return questionnaireItem.extension_ ?.firstWhereOrNull( (ext) => @@ -180,15 +180,15 @@ class QuestionnaireItemModel with Diagnosticable { /// Is this itemModel unable to hold a value? bool get isStatic => isGroup || isDisplay; - bool get isGroup => questionnaireItem.type == Code('group'); + bool get isGroup => questionnaireItem.type == FhirCode('group'); - bool get isDisplay => questionnaireItem.type == Code('display'); + bool get isDisplay => questionnaireItem.type == FhirCode('display'); bool get isQuestion => !isDisplay && !isGroup; bool get isCodingType { - return questionnaireItem.type == Code('choice') || - questionnaireItem.type == Code('open_choice'); + return questionnaireItem.type == FhirCode('choice') || + questionnaireItem.type == FhirCode('open_choice'); } /// Is this item not changeable by end-users? @@ -197,7 +197,7 @@ class QuestionnaireItemModel with Diagnosticable { /// This does not consider the completion status of the questionnaire. bool get isReadOnly { return isStatic || - questionnaireItem.readOnly == Boolean(true) || + questionnaireItem.readOnly == FhirBoolean(true) || isHidden || isCalculated; } @@ -316,7 +316,7 @@ class QuestionnaireItemModel with Diagnosticable { ); /// Returns the `usageMode` for the item, or the default. - Code get usageMode { + FhirCode get usageMode { return questionnaireItem.extension_?.usageMode ?? questionnaireModel.questionnaireModelDefaults.usageMode; } diff --git a/lib/questionnaires/model/src/questionnaire_model_defaults.dart b/lib/questionnaires/model/src/questionnaire_model_defaults.dart index 4395d87e..11208eea 100644 --- a/lib/questionnaires/model/src/questionnaire_model_defaults.dart +++ b/lib/questionnaires/model/src/questionnaire_model_defaults.dart @@ -13,7 +13,7 @@ class QuestionnaireModelDefaults { static const defaultSliderMaxValue = 100.0; final double sliderMaxValue; - final Code usageMode; + final FhirCode usageMode; final RenderingString? Function(FillerItemModel)? prefixBuilder; diff --git a/lib/questionnaires/model/src/questionnaire_response_model.dart b/lib/questionnaires/model/src/questionnaire_response_model.dart index 081aee10..e0236349 100644 --- a/lib/questionnaires/model/src/questionnaire_response_model.dart +++ b/lib/questionnaires/model/src/questionnaire_response_model.dart @@ -446,7 +446,7 @@ class QuestionnaireResponseModel { QuestionnaireResponse? createQuestionnaireResponseForFhirPath() { _cachedQuestionnaireResponse ??= aggregator().aggregateResponseItems( - responseStatus: Code('completed'), + responseStatus: FhirCode('completed'), generateNarrative: false, ); @@ -457,13 +457,13 @@ class QuestionnaireResponseModel { /// Returns a number that indicates whether the model has changed. int get generation => _generation; - final responseStatusNotifier = ValueNotifier( - Code('in_progress'), + final responseStatusNotifier = ValueNotifier( + FhirCode('in_progress'), ); - Code get responseStatus => responseStatusNotifier.value; + FhirCode get responseStatus => responseStatusNotifier.value; - set responseStatus(Code newStatus) { + set responseStatus(FhirCode newStatus) { responseStatusNotifier.value = newStatus; } @@ -581,7 +581,7 @@ class QuestionnaireResponseModel { return; } - _id = questionnaireResponse.id; + _id = questionnaireResponse.fhirId; final questionnaireResponseItems = questionnaireResponse.item; @@ -598,7 +598,7 @@ class QuestionnaireResponseModel { questionnaireResponseItems, ); - responseStatus = questionnaireResponse.status ?? Code('in_progress'); + responseStatus = questionnaireResponse.status ?? FhirCode('in_progress'); } void _updateCalculations() { diff --git a/lib/questionnaires/model/src/rendering_string.dart b/lib/questionnaires/model/src/rendering_string.dart index 7a05287b..f3fc1569 100644 --- a/lib/questionnaires/model/src/rendering_string.dart +++ b/lib/questionnaires/model/src/rendering_string.dart @@ -31,7 +31,7 @@ class RenderingString with Diagnosticable { final String? renderingXhtml; /// The unaltered rendering-markdown extension - final Markdown? renderingMarkdown; + final FhirMarkdown? renderingMarkdown; /// Construct an [RenderingString] from the provided attributes. /// diff --git a/lib/questionnaires/model/src/variable_model.dart b/lib/questionnaires/model/src/variable_model.dart index 1e2e8938..75148b13 100644 --- a/lib/questionnaires/model/src/variable_model.dart +++ b/lib/questionnaires/model/src/variable_model.dart @@ -1,4 +1,4 @@ -import 'package:fhir/primitive_types/fhir_uri.dart'; +import 'package:fhir/primitive_types/uri.dart'; /// See: http://hl7.org/fhir/StructureDefinition/variable final variableExtensionUrl = diff --git a/lib/questionnaires/view/item/answer/src/boolean_answer_filler.dart b/lib/questionnaires/view/item/answer/src/boolean_answer_filler.dart index 8c7bc7ec..934a0d93 100644 --- a/lib/questionnaires/view/item/answer/src/boolean_answer_filler.dart +++ b/lib/questionnaires/view/item/answer/src/boolean_answer_filler.dart @@ -11,7 +11,7 @@ class BooleanAnswerFiller extends QuestionnaireAnswerFiller { State createState() => _BooleanItemState(); } -class _BooleanItemState extends QuestionnaireAnswerFillerState { _BooleanItemState(); @@ -55,9 +55,9 @@ class _BooleanInputControl extends AnswerInputControl { ? (newValue) { focusNode?.requestFocus(); answerModel.value = answerModel.isTriState - ? ((newValue != null) ? Boolean(newValue) : null) + ? ((newValue != null) ? FhirBoolean(newValue) : null) : (newValue ?? false) - ? Boolean(true) + ? FhirBoolean(true) : null; } : null, diff --git a/lib/questionnaires/view/item/answer/src/datetime_answer_filler.dart b/lib/questionnaires/view/item/answer/src/datetime_answer_filler.dart index f907a61b..853add59 100644 --- a/lib/questionnaires/view/item/answer/src/datetime_answer_filler.dart +++ b/lib/questionnaires/view/item/answer/src/datetime_answer_filler.dart @@ -1,6 +1,6 @@ import 'package:faiadashu/fhir_types/fhir_types.dart'; import 'package:faiadashu/questionnaires/questionnaires.dart'; -import 'package:fhir/r4.dart' show Date, FhirDateTime, Time; +import 'package:fhir/r4.dart' show FhirDate, FhirDateTime, FhirTime; import 'package:flutter/material.dart'; class DateTimeAnswerFiller extends QuestionnaireAnswerFiller { @@ -43,9 +43,9 @@ class _DateTimeInputControl extends AnswerInputControl { final pickerType = ArgumentError.checkNotNull( const { - 'date': Date, + 'date': FhirDate, 'datetime': FhirDateTime, - 'time': Time, + 'time': FhirTime, }[itemType.value], ); diff --git a/lib/questionnaires/view/item/answer/src/numerical_answer_filler.dart b/lib/questionnaires/view/item/answer/src/numerical_answer_filler.dart index d7d84b0b..a9c8d7a7 100644 --- a/lib/questionnaires/view/item/answer/src/numerical_answer_filler.dart +++ b/lib/questionnaires/view/item/answer/src/numerical_answer_filler.dart @@ -91,7 +91,7 @@ class _SliderInputControl extends AnswerInputControl { max: answerModel.maxValue, divisions: answerModel.sliderDivisions, value: sliderValueDuringChange.value, - label: Decimal(sliderValueDuringChange.value).format(locale), + label: FhirDecimal(sliderValueDuringChange.value).format(locale), // Changes are only propagated to the model at change-end time. // onChange would cause very high-frequency storm of model updates onChanged: answerModel.isControlEnabled @@ -103,7 +103,7 @@ class _SliderInputControl extends AnswerInputControl { ? (sliderValue) { sliderValueDuringChange.value = sliderValue; answerModel.value = - answerModel.copyWithValue(Decimal(sliderValue)); + answerModel.copyWithValue(FhirDecimal(sliderValue)); } : null, onChangeStart: (_) { diff --git a/lib/questionnaires/view/item/src/question_response_item_filler.dart b/lib/questionnaires/view/item/src/question_response_item_filler.dart index 32587eb0..03d8a939 100644 --- a/lib/questionnaires/view/item/src/question_response_item_filler.dart +++ b/lib/questionnaires/view/item/src/question_response_item_filler.dart @@ -52,7 +52,7 @@ class QuestionResponseItemFillerState super.dispose(); } - void _setDataAbsentReason(Code? dataAbsentReason) { + void _setDataAbsentReason(FhirCode? dataAbsentReason) { if (mounted) { setState(() { questionResponseItemModel.dataAbsentReason = dataAbsentReason; diff --git a/lib/questionnaires/view/item/src/total_score_item.dart b/lib/questionnaires/view/item/src/total_score_item.dart index 2d49cafc..954c6227 100644 --- a/lib/questionnaires/view/item/src/total_score_item.dart +++ b/lib/questionnaires/view/item/src/total_score_item.dart @@ -22,7 +22,7 @@ class TotalScoreItem extends QuestionnaireAnswerFiller { class _TotalScoreItemState extends State { static final _logger = Logger(_TotalScoreItemState); - Decimal? calcResult; + FhirDecimal? calcResult; _TotalScoreItemState(); diff --git a/lib/questionnaires/view/src/questionnaire_complete_button.dart b/lib/questionnaires/view/src/questionnaire_complete_button.dart index 649d109d..fe013a34 100644 --- a/lib/questionnaires/view/src/questionnaire_complete_button.dart +++ b/lib/questionnaires/view/src/questionnaire_complete_button.dart @@ -39,8 +39,8 @@ class _QuestionnaireCompleteButtonState } final newResponseStatus = (currentResponseStatus.value == 'completed') - ? Code('in_progress') - : Code('completed'); + ? FhirCode('in_progress') + : FhirCode('completed'); setState(() { qrm.responseStatus = newResponseStatus; diff --git a/lib/questionnaires/view/src/questionnaire_stepper.dart b/lib/questionnaires/view/src/questionnaire_stepper.dart index d192ac47..afe5d766 100644 --- a/lib/questionnaires/view/src/questionnaire_stepper.dart +++ b/lib/questionnaires/view/src/questionnaire_stepper.dart @@ -74,10 +74,10 @@ class QuestionnaireStepperState extends State { Expanded( child: Column( children: [ - ValueListenableBuilder( + ValueListenableBuilder( builder: ( BuildContext context, - Decimal value, + FhirDecimal value, Widget? child, ) { final scoreString = value.value!.round().toString(); diff --git a/pubspec.yaml b/pubspec.yaml index 30b3133e..d304c44b 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -25,8 +25,8 @@ environment: dependencies: collection: ^1.17.0 - fhir: ^0.9.0 - fhir_path: ^0.9.0 + fhir: ^0.10.0 + fhir_path: ^0.10.0 # fhir: # path: /Users/tilo/Projects/fhir/fhir # fhir_path: From f3d577b2e8eab2451a526c2f3b0474ccdc896f5d Mon Sep 17 00:00:00 2001 From: Nazar Lytvyn Date: Wed, 17 May 2023 00:31:12 +0300 Subject: [PATCH 07/12] Example for Fhir 0.10.0 without faiadashu_online, fhir_auth --- example/lib/main.dart | 14 +- example/lib/observation_page.dart | 24 +- example/lib/primitive_page.dart | 2 +- example/lib/questionnaire_launch_tile.dart | 9 +- .../lib/questionnaire_response_storage.dart | 68 +----- example/pubspec.lock | 231 +----------------- example/pubspec.yaml | 5 +- 7 files changed, 38 insertions(+), 315 deletions(-) diff --git a/example/lib/main.dart b/example/lib/main.dart index 27668f7b..8aa6756e 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -11,7 +11,6 @@ import 'package:faiadashu_example/primitive_page.dart'; import 'package:faiadashu_example/questionnaire_launch_tile.dart'; import 'package:faiadashu_example/questionnaire_response_storage.dart'; import 'package:faiadashu_example/value_set_provider.dart'; -import 'package:faiadashu_online/restful/restful.dart'; import 'package:fhir/r4.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; @@ -89,7 +88,7 @@ class _HomePageState extends State { // Patient ID matches a patient on Meld Sandbox server. final sandboxPatient = Patient( - id: 'smart-880378', + fhirId: 'smart-880378', name: [ HumanName( given: ['Amy', 'R'], @@ -97,8 +96,8 @@ class _HomePageState extends State { use: HumanNameUse.official, ) ], - birthDate: Date('1999-12-08'), - gender: Code('female'), + birthDate: FhirDate('1999-12-08'), + gender: FhirCode('female'), ); late final LaunchContext launchContext; @@ -206,12 +205,6 @@ class _HomePageState extends State { ), ), ), - actions: [ - SmartLoginButton( - questionnaireResponseStorage.smartClient, - onLoginChanged: _onLoginChanged, - ) - ], ), body: SafeArea( child: Scrollbar( @@ -260,7 +253,6 @@ class _HomePageState extends State { builder: (context) => QuestionnaireScroller( scaffoldBuilder: const CherryBlossomScaffoldBuilder(), fhirResourceProvider: RegistryFhirResourceProvider([ - resourceBundleProvider, AssetResourceProvider.singleton( questionnaireResourceUri, 'assets/instruments/sdc_demo.json', diff --git a/example/lib/observation_page.dart b/example/lib/observation_page.dart index 6b3c1bb0..e57e22d9 100644 --- a/example/lib/observation_page.dart +++ b/example/lib/observation_page.dart @@ -12,7 +12,7 @@ class ObservationPage extends ExhibitPage { coding: [ Coding( system: FhirUri('http://loinc.org'), - code: Code('55284-4'), + code: FhirCode('55284-4'), display: 'BP sys/dias', ) ], @@ -23,24 +23,24 @@ class ObservationPage extends ExhibitPage { coding: [ Coding( system: FhirUri('http://loinc.org'), - code: Code('8480-6'), + code: FhirCode('8480-6'), display: 'BP sys', ) ], ), - valueQuantity: Quantity(value: Decimal(140.0), unit: 'mmHg'), + valueQuantity: Quantity(value: FhirDecimal(140.0), unit: 'mmHg'), ), ObservationComponent( code: CodeableConcept( coding: [ Coding( system: FhirUri('http://loinc.org'), - code: Code('8462-4'), + code: FhirCode('8462-4'), display: 'BP dias', ) ], ), - valueQuantity: Quantity(value: Decimal(87.0), unit: 'mmHg'), + valueQuantity: Quantity(value: FhirDecimal(87.0), unit: 'mmHg'), ), ], ); @@ -51,7 +51,7 @@ class ObservationPage extends ExhibitPage { coding: [ Coding( system: FhirUri('http://example.org'), - code: Code('BPHR'), + code: FhirCode('BPHR'), display: 'BP sys/dias + HR', ) ], @@ -62,36 +62,36 @@ class ObservationPage extends ExhibitPage { coding: [ Coding( system: FhirUri('http://loinc.org'), - code: Code('8480-6'), + code: FhirCode('8480-6'), display: 'BP sys', ) ], ), - valueQuantity: Quantity(value: Decimal(140.0), unit: 'mmHg'), + valueQuantity: Quantity(value: FhirDecimal(140.0), unit: 'mmHg'), ), ObservationComponent( code: CodeableConcept( coding: [ Coding( system: FhirUri('http://loinc.org'), - code: Code('8462-4'), + code: FhirCode('8462-4'), display: 'BP dias', ) ], ), - valueQuantity: Quantity(value: Decimal(87.3), unit: 'mmHg'), + valueQuantity: Quantity(value: FhirDecimal(87.3), unit: 'mmHg'), ), ObservationComponent( code: CodeableConcept( coding: [ Coding( system: FhirUri('http://loinc.org'), - code: Code('8867-4'), + code: FhirCode('8867-4'), display: 'Heart rate', ) ], ), - valueQuantity: Quantity(value: Decimal(68.0), unit: '/min'), + valueQuantity: Quantity(value: FhirDecimal(68.0), unit: '/min'), ), ], ); diff --git a/example/lib/primitive_page.dart b/example/lib/primitive_page.dart index a9abb538..cb763090 100644 --- a/example/lib/primitive_page.dart +++ b/example/lib/primitive_page.dart @@ -1,5 +1,5 @@ import 'package:faiadashu/fhir_types/fhir_types.dart'; -import 'package:fhir/primitive_types/fhir_date_time.dart'; +import 'package:fhir/r4.dart'; import 'package:flutter/material.dart'; import 'exhibit_page.dart'; diff --git a/example/lib/questionnaire_launch_tile.dart b/example/lib/questionnaire_launch_tile.dart index a23a8230..b5901a8e 100644 --- a/example/lib/questionnaire_launch_tile.dart +++ b/example/lib/questionnaire_launch_tile.dart @@ -1,8 +1,6 @@ import 'package:faiadashu/l10n/l10n.dart'; import 'package:faiadashu/questionnaires/questionnaires.dart'; import 'package:faiadashu/resource_provider/resource_provider.dart'; -import 'package:faiadashu_online/restful/restful.dart'; -import 'package:faiadashu_online/url_launch/src/url_launcher.dart'; import 'package:fhir/r4.dart'; import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; @@ -156,8 +154,6 @@ class _QuestionnaireLaunchTileState extends State { widget.fhirResourceProvider, ]), launchContext: widget.launchContext, - // Callback for supportLink - onLinkTap: launchLink, persistentFooterButtons: [ Builder( builder: (context) => const QuestionnaireCompleteButton(), @@ -179,7 +175,7 @@ class _QuestionnaireLaunchTileState extends State { QuestionnaireResponseFiller.of(context) .aggregator() .aggregate( - responseStatus: Code('completed'), + responseStatus: FhirCode('completed'), ), ); ScaffoldMessenger.of(context).showSnackBar( @@ -191,9 +187,6 @@ class _QuestionnaireLaunchTileState extends State { FDashLocalizations.of(context) .handlingUploading, ), - SyncIndicator( - color: Theme.of(context).colorScheme.primary, - ) ], ), ), diff --git a/example/lib/questionnaire_response_storage.dart b/example/lib/questionnaire_response_storage.dart index 26061090..5aa5142a 100644 --- a/example/lib/questionnaire_response_storage.dart +++ b/example/lib/questionnaire_response_storage.dart @@ -1,13 +1,15 @@ import 'dart:async'; import 'package:faiadashu/logging/logging.dart' as fdashlog; -import 'package:faiadashu_online/restful/restful.dart'; import 'package:fhir/r4.dart'; -import 'package:fhir_auth/fhir_client/smart_fhir_client.dart'; -import 'package:fhir_auth/scopes/r4/clinical_scope.dart'; -import 'package:fhir_auth/scopes/r4/scopes.dart'; import 'package:flutter/material.dart'; +class SmartFhirClient { + Future logout() async {} + + int isLoggedIn() => 0; +} + /// A very simplistic implementation of persistence in-memory and on a server. /// In-Memory contents will disappear when the app is stopped. /// @@ -25,27 +27,7 @@ class QuestionnaireResponseStorage { required this.fhirUri, required this.clientId, required this.redirectUri, - }) : smartClient = SmartFhirClient( - fhirUri: fhirUri, - clientId: clientId, - redirectUri: redirectUri, - scopes: Scopes( - clinicalScopes: [ - ClinicalScope( - role: Role.patient, - interaction: Interaction.any, - resourceType: R4ResourceType.Patient, - ), - ClinicalScope( - role: Role.patient, - resourceType: R4ResourceType.QuestionnaireResponse, - interaction: Interaction.any, - ), - ], - openid: true, - offlineAccess: true, - ).scopesList(), - ); + }) : smartClient = SmartFhirClient(); final Map _savedResponses = {}; @@ -73,41 +55,7 @@ class QuestionnaireResponseStorage { String questionnairePath, QuestionnaireResponse? questionnaireResponse, ) async { - if (questionnaireResponse == null) { - return null; - } - try { - // Upload will also save locally. - final updatedQuestionnaireResponse = - await createOrUpdateQuestionnaireResponse( - smartClient, - questionnaireResponse, - ); - _savedResponses[questionnairePath] = updatedQuestionnaireResponse; - - return updatedQuestionnaireResponse; - } catch (e) { - // Upload failed, but we are saving the QR locally - _savedResponses[questionnairePath] = questionnaireResponse; - await showDialog( - context: context, - builder: (context) => AlertDialog( - title: const Text('Upload failed'), - content: Text(e.toString()), - scrollable: true, - actions: [ - TextButton( - child: const Text('Dismiss'), - onPressed: () { - Navigator.of(context).pop(); - }, - ), - ], - ), - ); - - return questionnaireResponse; - } + return null; } void dispose() { diff --git a/example/pubspec.lock b/example/pubspec.lock index 51b25ae5..14aac7f5 100644 --- a/example/pubspec.lock +++ b/example/pubspec.lock @@ -1,14 +1,6 @@ # Generated by pub # See https://dart.dev/tools/pub/glossary#lockfile packages: - antlr4: - dependency: transitive - description: - name: antlr4 - sha256: aeb591332cd6a32d298389df1ab41f2ce7b117da98c58eae35785ed44ee0abb3 - url: "https://pub.dev" - source: hosted - version: "4.12.0" args: dependency: transitive description: @@ -25,14 +17,6 @@ packages: url: "https://pub.dev" source: hosted version: "2.11.0" - boolean_selector: - dependency: transitive - description: - name: boolean_selector - sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" - url: "https://pub.dev" - source: hosted - version: "2.1.1" characters: dependency: transitive description: @@ -72,13 +56,6 @@ packages: relative: true source: path version: "0.8.0" - faiadashu_online: - dependency: "direct main" - description: - path: "../faiadashu_online" - relative: true - source: path - version: "0.8.0" ffi: dependency: transitive description: @@ -91,34 +68,18 @@ packages: dependency: "direct main" description: name: fhir - sha256: "852c533fd5f29b31692af9264df7bddd23e1103e14db0c42c1693b343b6cbe44" - url: "https://pub.dev" - source: hosted - version: "0.9.5" - fhir_at_rest: - dependency: transitive - description: - name: fhir_at_rest - sha256: e62645e6e619df5a5b66c480d5e8872dd87f0e748965e80739363fb7ec62e5cf - url: "https://pub.dev" - source: hosted - version: "0.9.5" - fhir_auth: - dependency: "direct main" - description: - name: fhir_auth - sha256: "3d6e8af3cc17c38ac5ab36e2e2ecc1f0ba93af30eb2390ab2c0fad0eadd8d754" + sha256: "723019952463deec3e2d96bde386ef25f5c006e0c07db68be5706a583e0070c1" url: "https://pub.dev" source: hosted - version: "0.9.4" + version: "0.10.0" fhir_path: dependency: transitive description: name: fhir_path - sha256: fbee92d92a59e94a0412b96b43b3123b8941ed2a2a975064f924b7aa6304a9c1 + sha256: a9b671630d8a1ad44b03bfdeb46611ba80044fdf2c1d147423df602ee57728d1 url: "https://pub.dev" source: hosted - version: "0.9.6" + version: "0.10.0" file: dependency: transitive description: @@ -137,14 +98,6 @@ packages: description: flutter source: sdk version: "0.0.0" - flutter_web_auth: - dependency: transitive - description: - name: flutter_web_auth - sha256: a69fa8f43b9e4d86ac72176bf747b735e7b977dd7cf215076d95b87cb05affdd - url: "https://pub.dev" - source: hosted - version: "0.5.0" flutter_web_plugins: dependency: transitive description: flutter @@ -166,46 +119,6 @@ packages: url: "https://pub.dev" source: hosted version: "4.0.4" - google_sign_in: - dependency: transitive - description: - name: google_sign_in - sha256: "821f354c053d51a2d417b02d42532a19a6ea8057d2f9ebb8863c07d81c98aaf9" - url: "https://pub.dev" - source: hosted - version: "5.4.4" - google_sign_in_android: - dependency: transitive - description: - name: google_sign_in_android - sha256: "8e46e791f54ce83c05dcc41430bba943c3aafc49b9b867c4d10b395968398b4a" - url: "https://pub.dev" - source: hosted - version: "6.1.11" - google_sign_in_ios: - dependency: transitive - description: - name: google_sign_in_ios - sha256: "2e1df687b17f7fddcaf9a0c7f994d0d19b5d41e8ce1d943013befd0a0ae67403" - url: "https://pub.dev" - source: hosted - version: "5.6.1" - google_sign_in_platform_interface: - dependency: transitive - description: - name: google_sign_in_platform_interface - sha256: "95a9e0a8701b5485f2ca330fd1fc6f918f5ce088042ce1019c5e389d8574ae4c" - url: "https://pub.dev" - source: hosted - version: "2.4.0" - google_sign_in_web: - dependency: transitive - description: - name: google_sign_in_web - sha256: "75cc41ebc53b1756320ee14d9c3018ad3e6cea298147dbcd86e9d0c8d6720b40" - url: "https://pub.dev" - source: hosted - version: "0.10.2+1" html_unescape: dependency: transitive description: @@ -218,10 +131,10 @@ packages: dependency: transitive description: name: http - sha256: "6aa2946395183537c8b880962d935877325d6a09a2867c3970c05c0fed6ac482" + sha256: "5895291c13fa8a3bd82e76d5627f69e0d85ca6a30dcac95c4ea19a5d555879c2" url: "https://pub.dev" source: hosted - version: "0.13.5" + version: "0.13.6" http_parser: dependency: transitive description: @@ -250,18 +163,10 @@ packages: dependency: transitive description: name: json_annotation - sha256: c33da08e136c3df0190bd5bbe51ae1df4a7d96e7954d1d7249fea2968a72d317 + sha256: b10a7b2ff83d83c777edba3c6a0f97045ddadd56c944e1a23a3fdf43a1bf4467 url: "https://pub.dev" source: hosted - version: "4.8.0" - jwt_decoder: - dependency: transitive - description: - name: jwt_decoder - sha256: "54774aebf83f2923b99e6416b4ea915d47af3bde56884eb622de85feabbc559f" - url: "https://pub.dev" - source: hosted - version: "2.0.1" + version: "4.8.1" lint: dependency: "direct dev" description: @@ -282,18 +187,10 @@ packages: dependency: transitive description: name: markdown - sha256: d95a9d12954aafc97f984ca29baaa7690ed4d9ec4140a23ad40580bcdb6c87f5 - url: "https://pub.dev" - source: hosted - version: "7.0.2" - matcher: - dependency: transitive - description: - name: matcher - sha256: "6501fbd55da300384b768785b83e5ce66991266cec21af89ab9ae7f5ce1c4cbb" + sha256: "8e332924094383133cee218b676871f42db2514f1f6ac617b6cf6152a7faab8e" url: "https://pub.dev" source: hosted - version: "0.12.15" + version: "7.1.0" material_color_utilities: dependency: transitive description: @@ -310,14 +207,6 @@ packages: url: "https://pub.dev" source: hosted version: "1.9.1" - oauth2: - dependency: transitive - description: - name: oauth2 - sha256: "1e8376c222651904caf7785fd2fa01b1e2be608c94bec842a94e116deca88f13" - url: "https://pub.dev" - source: hosted - version: "2.0.1" path: dependency: transitive description: @@ -406,14 +295,6 @@ packages: url: "https://pub.dev" source: hosted version: "4.2.4" - quiver: - dependency: transitive - description: - name: quiver - sha256: b1c1ac5ce6688d77f65f3375a9abb9319b3cb32486bdc7a1e0fdf004d7ba4e47 - url: "https://pub.dev" - source: hosted - version: "3.2.1" scrollable_positioned_list: dependency: transitive description: @@ -443,22 +324,6 @@ packages: url: "https://pub.dev" source: hosted version: "1.10.0" - stack_trace: - dependency: transitive - description: - name: stack_trace - sha256: c3c7d8edb15bee7f0f74debd4b9c5f3c2ea86766fe4178eb2a18eb30a0bdaed5 - url: "https://pub.dev" - source: hosted - version: "1.11.0" - stream_channel: - dependency: transitive - description: - name: stream_channel - sha256: "83615bee9045c1d322bbbd1ba209b7a749c2cbcdcb3fdd1df8eb488b3279c1c8" - url: "https://pub.dev" - source: hosted - version: "2.1.1" string_scanner: dependency: transitive description: @@ -475,14 +340,6 @@ packages: url: "https://pub.dev" source: hosted version: "1.2.1" - test_api: - dependency: transitive - description: - name: test_api - sha256: daadc9baabec998b062c9091525aa95786508b1c48e9c30f1f891b8bf6ff2e64 - url: "https://pub.dev" - source: hosted - version: "0.5.2" typed_data: dependency: transitive description: @@ -499,70 +356,6 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.0" - url_launcher: - dependency: transitive - description: - name: url_launcher - sha256: "75f2846facd11168d007529d6cd8fcb2b750186bea046af9711f10b907e1587e" - url: "https://pub.dev" - source: hosted - version: "6.1.10" - url_launcher_android: - dependency: transitive - description: - name: url_launcher_android - sha256: a52628068d282d01a07cd86e6ba99e497aa45ce8c91159015b2416907d78e411 - url: "https://pub.dev" - source: hosted - version: "6.0.27" - url_launcher_ios: - dependency: transitive - description: - name: url_launcher_ios - sha256: "9af7ea73259886b92199f9e42c116072f05ff9bea2dcb339ab935dfc957392c2" - url: "https://pub.dev" - source: hosted - version: "6.1.4" - url_launcher_linux: - dependency: transitive - description: - name: url_launcher_linux - sha256: "206fb8334a700ef7754d6a9ed119e7349bc830448098f21a69bf1b4ed038cabc" - url: "https://pub.dev" - source: hosted - version: "3.0.4" - url_launcher_macos: - dependency: transitive - description: - name: url_launcher_macos - sha256: "91ee3e75ea9dadf38036200c5d3743518f4a5eb77a8d13fda1ee5764373f185e" - url: "https://pub.dev" - source: hosted - version: "3.0.5" - url_launcher_platform_interface: - dependency: transitive - description: - name: url_launcher_platform_interface - sha256: "6c9ca697a5ae218ce56cece69d46128169a58aa8653c1b01d26fcd4aad8c4370" - url: "https://pub.dev" - source: hosted - version: "2.1.2" - url_launcher_web: - dependency: transitive - description: - name: url_launcher_web - sha256: "81fe91b6c4f84f222d186a9d23c73157dc4c8e1c71489c4d08be1ad3b228f1aa" - url: "https://pub.dev" - source: hosted - version: "2.0.16" - url_launcher_windows: - dependency: transitive - description: - name: url_launcher_windows - sha256: a83ba3607a507758669cfafb03f9de09bf6e6280c14d9b9cb18f013e406dcacd - url: "https://pub.dev" - source: hosted - version: "3.0.5" uuid: dependency: transitive description: @@ -655,10 +448,10 @@ packages: dependency: transitive description: name: yaml - sha256: "23812a9b125b48d4007117254bca50abb6c712352927eece9e155207b1db2370" + sha256: "75769501ea3489fca56601ff33454fe45507ea3bfb014161abc3b43ae25989d5" url: "https://pub.dev" source: hosted - version: "3.1.1" + version: "3.1.2" sdks: dart: ">=3.0.0 <4.0.0" flutter: ">=3.3.0" diff --git a/example/pubspec.yaml b/example/pubspec.yaml index 3b6e3df3..09220eb7 100644 --- a/example/pubspec.yaml +++ b/example/pubspec.yaml @@ -9,10 +9,7 @@ dependencies: collection: ^1.17.0 faiadashu: path: .. - faiadashu_online: - path: ../faiadashu_online - fhir: ^0.9.0 - fhir_auth: ^0.9.0 + fhir: ^0.10.0 flutter: sdk: flutter flutter_localizations: From 9379960dcd436fc2f698f70524983c83df5a9f3c Mon Sep 17 00:00:00 2001 From: Nazar Lytvyn Date: Wed, 24 May 2023 13:26:53 +0300 Subject: [PATCH 08/12] Fhir 0.11.0 support --- example/pubspec.lock | 28 ++++++++++++++-------------- example/pubspec.yaml | 4 ++-- faiabench/pubspec.yaml | 2 +- pubspec.yaml | 6 +++--- 4 files changed, 20 insertions(+), 20 deletions(-) diff --git a/example/pubspec.lock b/example/pubspec.lock index 14aac7f5..98e8ae42 100644 --- a/example/pubspec.lock +++ b/example/pubspec.lock @@ -37,10 +37,10 @@ packages: dependency: "direct main" description: name: collection - sha256: f092b211a4319e98e5ff58223576de6c2803db36221657b46c82574721240687 + sha256: "4a07be6cb69c84d677a6c3096fcf960cc3285a8330b4603e0d463d15d9bd934c" url: "https://pub.dev" source: hosted - version: "1.17.2" + version: "1.17.1" crypto: dependency: transitive description: @@ -68,18 +68,18 @@ packages: dependency: "direct main" description: name: fhir - sha256: "723019952463deec3e2d96bde386ef25f5c006e0c07db68be5706a583e0070c1" + sha256: "9ec0effb3c42925f054d0a7b89e84a225dbcb882a7bde44707ce52252da292a9" url: "https://pub.dev" source: hosted - version: "0.10.0" + version: "0.11.0" fhir_path: dependency: transitive description: name: fhir_path - sha256: a9b671630d8a1ad44b03bfdeb46611ba80044fdf2c1d147423df602ee57728d1 + sha256: "4ec5d166afd7210f38c34ab8a647b34028e9a87fcc697d9533bf2f56663d9df0" url: "https://pub.dev" source: hosted - version: "0.10.0" + version: "0.11.0" file: dependency: transitive description: @@ -147,10 +147,10 @@ packages: dependency: "direct main" description: name: intl - sha256: "3bc132a9dbce73a7e4a21a17d06e1878839ffbf975568bc875c60537824b0c4d" + sha256: a3715e3bc90294e971cb7dc063fbf3cd9ee0ebf8604ffeafabd9e6f16abbdbe6 url: "https://pub.dev" source: hosted - version: "0.18.1" + version: "0.18.0" js: dependency: transitive description: @@ -267,10 +267,10 @@ packages: dependency: transitive description: name: petitparser - sha256: "49392a45ced973e8d94a85fdb21293fbb40ba805fc49f2965101ae748a3683b4" + sha256: cb3798bef7fc021ac45b308f4b51208a152792445cce0448c9a4ba5879dd8750 url: "https://pub.dev" source: hosted - version: "5.1.0" + version: "5.4.0" platform: dependency: transitive description: @@ -432,18 +432,18 @@ packages: dependency: transitive description: name: xml - sha256: "979ee37d622dec6365e2efa4d906c37470995871fe9ae080d967e192d88286b5" + sha256: "5bc72e1e45e941d825fd7468b9b4cc3b9327942649aeb6fc5cdbf135f0a86e84" url: "https://pub.dev" source: hosted - version: "6.2.2" + version: "6.3.0" xml2json: dependency: transitive description: name: xml2json - sha256: c8cb35b83cce879c2ea86951fd257f4e765b0030a0298b35cf94f2b3d0f32095 + sha256: c39bf22898b4458ccca91d5087ba86ebda078f0e2291bd73de80372a37d83e52 url: "https://pub.dev" source: hosted - version: "5.3.6" + version: "6.0.0" yaml: dependency: transitive description: diff --git a/example/pubspec.yaml b/example/pubspec.yaml index 09220eb7..cd120b44 100644 --- a/example/pubspec.yaml +++ b/example/pubspec.yaml @@ -9,13 +9,13 @@ dependencies: collection: ^1.17.0 faiadashu: path: .. - fhir: ^0.10.0 + fhir: ^0.11.0 flutter: sdk: flutter flutter_localizations: sdk: flutter google_fonts: ^4.0.4 - intl: ^0.18.1 + intl: ^0.18.0 logging: ^1.0.2 simple_html_css: ^4.0.0 diff --git a/faiabench/pubspec.yaml b/faiabench/pubspec.yaml index e449ed8d..077224f5 100644 --- a/faiabench/pubspec.yaml +++ b/faiabench/pubspec.yaml @@ -35,7 +35,7 @@ dependencies: sdk: flutter flutter_riverpod: ^2.3.0 highlight: ^0.7.0 - intl: ^0.18.1 + intl: ^0.18.0 logging: ^1.0.1 multi_split_view: ^2.0.0 simple_html_css: ^4.0.0 diff --git a/pubspec.yaml b/pubspec.yaml index d304c44b..1c1d4504 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -25,8 +25,8 @@ environment: dependencies: collection: ^1.17.0 - fhir: ^0.10.0 - fhir_path: ^0.10.0 + fhir: ^0.11.0 + fhir_path: ^0.11.0 # fhir: # path: /Users/tilo/Projects/fhir/fhir # fhir_path: @@ -35,7 +35,7 @@ dependencies: sdk: flutter flutter_localizations: sdk: flutter - intl: ^0.18.1 + intl: ^0.18.0 logging: ^1.0.2 markdown: ^7.0.0 meta: ^1.7.0 From 8c2eda60af2724144c72a9c723ac58926f0a7527 Mon Sep 17 00:00:00 2001 From: Nazar Lytvyn Date: Wed, 24 May 2023 14:24:17 +0300 Subject: [PATCH 09/12] v0.9.0-alpha.1 --- CHANGELOG.md | 9 +++++++++ faiadashu_online/pubspec.yaml | 2 +- pubspec.yaml | 2 +- 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 54461c36..28a66682 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,12 @@ +## 0.9.0-alpha.1 +**[Breaking]** This alpha release is beginning to use Flutter 3.10.0 and fhir 0.11.0. + +### Faiadashu +* Flutter 3.10.0 and fhir 0.11.0 support + +### Faiadashu Online +* Temporary disabled while fhir_auth has not support fhir 0.11.0. + ## 0.8.1 **[Breaking]** This release is beginning to make use of features in Flutter 3.0. It does not work with Flutter 2.*x*. diff --git a/faiadashu_online/pubspec.yaml b/faiadashu_online/pubspec.yaml index 53639c79..f0688423 100644 --- a/faiadashu_online/pubspec.yaml +++ b/faiadashu_online/pubspec.yaml @@ -5,7 +5,7 @@ description: Faiadashu Online - Functionalities for faiadashu that connect to FH # pub.dev using `pub publish`. This is preferred for private packages. publish_to: none -version: 0.8.0 +version: 0.9.0-alpha.1 homepage: https://tiloc.github.io/faiadashu/ repository: https://github.com/tiloc/faiadashu issue_tracker: https://github.com/tiloc/faiadashu/issues diff --git a/pubspec.yaml b/pubspec.yaml index 1c1d4504..5282b1d0 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -14,7 +14,7 @@ description: Faiadashu FHIRDash - Build beautiful healthcare apps fast — use t # In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion. # Read more about iOS versioning at # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html -version: 0.8.0 +version: 0.9.0-alpha.1 homepage: https://tiloc.github.io/faiadashu/ repository: https://github.com/tiloc/faiadashu issue_tracker: https://github.com/tiloc/faiadashu/issues From 347bf1a129718a59395e3394f3b13c41f765a118 Mon Sep 17 00:00:00 2001 From: Nazar Lytvyn Date: Thu, 25 May 2023 20:12:38 +0300 Subject: [PATCH 10/12] Added displaying units in numeric answer input v0.9.0-dev.1 --- CHANGELOG.md | 4 ++++ faiadashu_online/pubspec.yaml | 2 +- .../view/item/answer/src/numerical_answer_filler.dart | 5 +++++ pubspec.yaml | 2 +- 4 files changed, 11 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 28a66682..22c3243e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.9.0-dev.1 +### Faiadashu +* Added displaying units in numeric answer input + ## 0.9.0-alpha.1 **[Breaking]** This alpha release is beginning to use Flutter 3.10.0 and fhir 0.11.0. diff --git a/faiadashu_online/pubspec.yaml b/faiadashu_online/pubspec.yaml index f0688423..a0fbbd74 100644 --- a/faiadashu_online/pubspec.yaml +++ b/faiadashu_online/pubspec.yaml @@ -5,7 +5,7 @@ description: Faiadashu Online - Functionalities for faiadashu that connect to FH # pub.dev using `pub publish`. This is preferred for private packages. publish_to: none -version: 0.9.0-alpha.1 +version: 0.9.0-dev.1 homepage: https://tiloc.github.io/faiadashu/ repository: https://github.com/tiloc/faiadashu issue_tracker: https://github.com/tiloc/faiadashu/issues diff --git a/lib/questionnaires/view/item/answer/src/numerical_answer_filler.dart b/lib/questionnaires/view/item/answer/src/numerical_answer_filler.dart index a9c8d7a7..6d2312c3 100644 --- a/lib/questionnaires/view/item/answer/src/numerical_answer_filler.dart +++ b/lib/questionnaires/view/item/answer/src/numerical_answer_filler.dart @@ -179,6 +179,8 @@ class _NumberFieldInputControl final theme = QuestionnaireTheme.of(context); + final displayUnits = answerModel.qi.computableUnit?.display; + return Container( padding: const EdgeInsets.only(top: 8, bottom: 8), child: SizedBox( @@ -218,6 +220,9 @@ class _NumberFieldInputControl ), ) : null, + suffix: displayUnits != null + ? Text(' $displayUnits') + : null, ), inputFormatters: [numberInputFormatter], keyboardType: TextInputType.numberWithOptions( diff --git a/pubspec.yaml b/pubspec.yaml index 5282b1d0..1e894f47 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -14,7 +14,7 @@ description: Faiadashu FHIRDash - Build beautiful healthcare apps fast — use t # In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion. # Read more about iOS versioning at # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html -version: 0.9.0-alpha.1 +version: 0.9.0-dev.1 homepage: https://tiloc.github.io/faiadashu/ repository: https://github.com/tiloc/faiadashu issue_tracker: https://github.com/tiloc/faiadashu/issues From 8711dbb84d11ae05e5a7d910d3e1b326d4f951be Mon Sep 17 00:00:00 2001 From: Nazar Lytvyn Date: Fri, 26 May 2023 13:25:21 +0300 Subject: [PATCH 11/12] Added questionnaire-unitOption extension support to numeric answers --- CHANGELOG.md | 1 + example/pubspec.lock | 2 +- .../item/answer/src/numerical_answer_model.dart | 12 ++++++++++++ 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 22c3243e..bcd18d6f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ ## 0.9.0-dev.1 ### Faiadashu * Added displaying units in numeric answer input +* Added questionnaire-unitOption extension support to make ability choose quantity units in numeric answers ## 0.9.0-alpha.1 **[Breaking]** This alpha release is beginning to use Flutter 3.10.0 and fhir 0.11.0. diff --git a/example/pubspec.lock b/example/pubspec.lock index 98e8ae42..64d426ca 100644 --- a/example/pubspec.lock +++ b/example/pubspec.lock @@ -55,7 +55,7 @@ packages: path: ".." relative: true source: path - version: "0.8.0" + version: "0.9.0-dev.1" ffi: dependency: transitive description: diff --git a/lib/questionnaires/model/item/answer/src/numerical_answer_model.dart b/lib/questionnaires/model/item/answer/src/numerical_answer_model.dart index 0275fe30..10224112 100644 --- a/lib/questionnaires/model/item/answer/src/numerical_answer_model.dart +++ b/lib/questionnaires/model/item/answer/src/numerical_answer_model.dart @@ -158,6 +158,18 @@ class NumericalAnswerModel extends AnswerModel { }, context: qi.linkId, ); + } else { + final unitOptionUri = FhirUri( + 'http://hl7.org/fhir/StructureDefinition/questionnaire-unitOption', + ); + qi.extension_ + ?.where((e) => e.url == unitOptionUri) + .map((e) => e.valueCoding) + .forEach((coding) { + if (coding != null) { + _units[keyForUnitChoice(coding)] = coding; + } + }); } } From 96fc1523a1846d9acabad54aeba42a46440421bd Mon Sep 17 00:00:00 2001 From: Nazar Lytvyn Date: Fri, 26 May 2023 16:27:38 +0300 Subject: [PATCH 12/12] Fixed drop down style for numeric answer input --- CHANGELOG.md | 1 + .../answer/src/numerical_answer_filler.dart | 21 ++++++++++--------- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bcd18d6f..e27cd0cb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ ### Faiadashu * Added displaying units in numeric answer input * Added questionnaire-unitOption extension support to make ability choose quantity units in numeric answers +* Fixed drop down style for numeric answer input ## 0.9.0-alpha.1 **[Breaking]** This alpha release is beginning to use Flutter 3.10.0 and fhir 0.11.0. diff --git a/lib/questionnaires/view/item/answer/src/numerical_answer_filler.dart b/lib/questionnaires/view/item/answer/src/numerical_answer_filler.dart index 6d2312c3..48cd397d 100644 --- a/lib/questionnaires/view/item/answer/src/numerical_answer_filler.dart +++ b/lib/questionnaires/view/item/answer/src/numerical_answer_filler.dart @@ -179,7 +179,10 @@ class _NumberFieldInputControl final theme = QuestionnaireTheme.of(context); - final displayUnits = answerModel.qi.computableUnit?.display; + final displayUnit = answerModel.hasSingleUnitChoice + ? answerModel.unitChoices.first + : answerModel.qi.computableUnit; + final suffixText = displayUnit?.localizedDisplay(locale); return Container( padding: const EdgeInsets.only(top: 8, bottom: 8), @@ -212,7 +215,8 @@ class _NumberFieldInputControl : null, ) : null, - suffixIcon: (answerModel.hasUnitChoices) + suffixIcon: (answerModel.hasUnitChoices && + !answerModel.hasSingleUnitChoice) ? SizedBox( height: 16, child: _UnitDropDown( @@ -220,9 +224,10 @@ class _NumberFieldInputControl ), ) : null, - suffix: displayUnits != null - ? Text(' $displayUnits') - : null, + suffixText: suffixText != null ? ' $suffixText' : null, + suffixStyle: Theme.of(context).textTheme.bodyMedium?.copyWith( + height: 1, + ), ), inputFormatters: [numberInputFormatter], keyboardType: TextInputType.numberWithOptions( @@ -256,21 +261,17 @@ class _UnitDropDown extends AnswerInputControl { @override Widget build(BuildContext context) { - const unitWidth = 96.0; - return answerModel.hasSingleUnitChoice ? Container( alignment: Alignment.topLeft, padding: const EdgeInsets.only(left: 8, top: 10), - width: unitWidth, child: Text( answerModel.unitChoices.first.localizedDisplay(locale), style: Theme.of(context).textTheme.bodyMedium, ), ) : Container( - padding: const EdgeInsets.only(left: 8), - width: unitWidth, + padding: const EdgeInsets.symmetric(horizontal: 8), child: DropdownButtonHideUnderline( child: DropdownButton( value: answerModel.keyOfUnit,