From 246cdba79c650db614d2b4d633d2b9a5bd94f11b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20G=C3=B6cer?= Date: Thu, 18 Apr 2024 18:37:33 +0200 Subject: [PATCH 001/314] feat: implement monitoring section --- .../lib/common_views/standard_table.dart | 4 +- .../participant_details_form_controller.dart | 42 ++++ .../participant_details_form_view.dart | 46 +++++ .../features/monitor/study_monitor_page.dart | 109 +++++++++- .../features/monitor/study_monitor_table.dart | 188 ++++++++++++++++++ designer_v2/lib/localization/app_de.arb | 17 ++ designer_v2/lib/localization/app_en.arb | 17 ++ designer_v2/pubspec.lock | 2 +- designer_v2/pubspec.yaml | 1 + 9 files changed, 417 insertions(+), 9 deletions(-) create mode 100644 designer_v2/lib/features/monitor/participant_details_form_controller.dart create mode 100644 designer_v2/lib/features/monitor/participant_details_form_view.dart create mode 100644 designer_v2/lib/features/monitor/study_monitor_table.dart diff --git a/designer_v2/lib/common_views/standard_table.dart b/designer_v2/lib/common_views/standard_table.dart index 912d93785..9285867d7 100644 --- a/designer_v2/lib/common_views/standard_table.dart +++ b/designer_v2/lib/common_views/standard_table.dart @@ -52,6 +52,7 @@ class StandardTable extends StatefulWidget { this.cellSpacing = 10.0, this.rowSpacing = 9.0, this.minRowHeight = 60.0, + this.headerMaxLines = 1, this.showTableHeader = true, this.tableWrapper, this.leadingWidget, @@ -98,6 +99,7 @@ class StandardTable extends StatefulWidget { final double rowSpacing; final double? minRowHeight; + final int headerMaxLines; final bool showTableHeader; final bool hideLeadingTrailingWhenEmpty; @@ -329,7 +331,7 @@ class _StandardTableState extends State> { Text( columns[i].label, overflow: TextOverflow.visible, - maxLines: 1, + maxLines: widget.headerMaxLines, softWrap: false, style: theme.textTheme.bodySmall!.copyWith( color: theme.colorScheme.onSurface.withOpacity(0.8), diff --git a/designer_v2/lib/features/monitor/participant_details_form_controller.dart b/designer_v2/lib/features/monitor/participant_details_form_controller.dart new file mode 100644 index 000000000..90f8ec706 --- /dev/null +++ b/designer_v2/lib/features/monitor/participant_details_form_controller.dart @@ -0,0 +1,42 @@ +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:reactive_forms/reactive_forms.dart'; +import 'package:studyu_designer_v2/features/forms/form_view_model.dart'; +import 'package:studyu_designer_v2/features/monitor/study_monitor_table.dart'; +import 'package:studyu_designer_v2/localization/app_translation.dart'; + +class ParticipantDetailsFormViewModel extends FormViewModel { + ParticipantDetailsFormViewModel() : super(); + + @override + Map get titles => { + FormMode.create: tr.participant_details_title, + FormMode.readonly: tr.participant_details_title, + }; + + final participantIdControl = FormControl(value: ''); + + final rawDataControl = FormControl(value: ''); + + @override + late final form = FormGroup({ + 'participantId': participantIdControl, + 'rawData': rawDataControl, + }); + + @override + void initControls() {} + + @override + StudyMonitorItem buildFormData() { + throw UnsupportedError("This form is read-only"); + } + + @override + void setControlsFrom(StudyMonitorItem data) { + participantIdControl.value = data.participantId; + rawDataControl.value = data.rawData; + } +} + +final participantDetailsFormViewModelProvider = Provider.autoDispose + .family((ref, item) => ParticipantDetailsFormViewModel()); diff --git a/designer_v2/lib/features/monitor/participant_details_form_view.dart b/designer_v2/lib/features/monitor/participant_details_form_view.dart new file mode 100644 index 000000000..4d30104ef --- /dev/null +++ b/designer_v2/lib/features/monitor/participant_details_form_view.dart @@ -0,0 +1,46 @@ +import 'package:flutter/material.dart'; +import 'package:reactive_forms/reactive_forms.dart'; +import 'package:studyu_designer_v2/common_views/form_consumer_widget.dart'; +import 'package:studyu_designer_v2/common_views/form_table_layout.dart'; +import 'package:studyu_designer_v2/features/monitor/participant_details_form_controller.dart'; +import 'package:studyu_designer_v2/localization/app_translation.dart'; + +class ParticipantDetailsFormView extends FormConsumerWidget { + const ParticipantDetailsFormView({required this.formViewModel, super.key}); + + final ParticipantDetailsFormViewModel formViewModel; + + @override + Widget build(BuildContext context, FormGroup form) { + return Column( + children: [ + FormTableLayout(rows: [ + FormTableRow( + label: tr.monitoring_table_column_participant_id, + labelStyle: const TextStyle(fontWeight: FontWeight.bold), + control: formViewModel.participantIdControl, + input: ReactiveTextField( + formControl: formViewModel.participantIdControl, + readOnly: true, + ), + ), + ]), + const SizedBox(height: 16.0), + Align( + alignment: Alignment.centerLeft, + child: FormLabel( + labelText: tr.participant_details_raw_data, + labelTextStyle: const TextStyle( + fontWeight: FontWeight.bold, + )), + ), + const SizedBox(height: 8.0), + ReactiveTextField( + formControl: formViewModel.rawDataControl, + maxLines: null, + readOnly: true, + ), + ], + ); + } +} diff --git a/designer_v2/lib/features/monitor/study_monitor_page.dart b/designer_v2/lib/features/monitor/study_monitor_page.dart index 4b8a7aee7..83193aa43 100644 --- a/designer_v2/lib/features/monitor/study_monitor_page.dart +++ b/designer_v2/lib/features/monitor/study_monitor_page.dart @@ -1,20 +1,115 @@ import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:studyu_designer_v2/common_views/under_construction.dart'; +import 'package:studyu_core/core.dart'; +import 'package:studyu_designer_v2/common_views/async_value_widget.dart'; +import 'package:studyu_designer_v2/common_views/empty_body.dart'; +import 'package:studyu_designer_v2/common_views/form_buttons.dart'; +import 'package:studyu_designer_v2/common_views/sidesheet/sidesheet_form.dart'; +import 'package:studyu_designer_v2/common_views/utils.dart'; +import 'package:studyu_designer_v2/features/monitor/participant_details_form_controller.dart'; +import 'package:studyu_designer_v2/features/monitor/participant_details_form_view.dart'; +import 'package:studyu_designer_v2/features/monitor/study_monitor_table.dart'; +import 'package:studyu_designer_v2/features/study/study_controller.dart'; import 'package:studyu_designer_v2/features/study/study_page_view.dart'; +import 'package:studyu_designer_v2/localization/app_translation.dart'; class StudyMonitorScreen extends StudyPageWidget { const StudyMonitorScreen(super.studyId, {super.key}); @override Widget build(BuildContext context, WidgetRef ref) { - return Container( - width: double.infinity, - color: Theme.of(context).colorScheme.secondary.withOpacity(0.03), - height: 300, - child: const Center( - child: UnderConstruction(), + final state = ref.watch(studyControllerProvider(studyId)); + return AsyncValueWidget( + value: state.study, + data: (study) { + final studyMonitorItems = StudyMonitorItem.fromStudy(study); + return Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + _monitorSectionHeader(context, study), + const SizedBox(height: 40.0), // spacing between body elements + studyMonitorItems.isNotEmpty + ? StudyMonitorTable( + studyMonitorItems: studyMonitorItems, + onSelectItem: (item) => _onSelectParticipant(context, ref, item), + ) + : EmptyBody( + icon: Icons.person_off_rounded, + title: tr.monitoring_no_participants_title, + description: tr.monitoring_no_participants_description), + ], + ); + }); + } + + Widget _monitorSectionHeader(BuildContext context, Study study) { + // Using study.participants.length because participantCount does not include soft deleted participants + final enrolled = study.participants?.length ?? study.participantCount; + // Active participants are those who were active in the last 3 days + final active = study.activeSubjectCount; + // Ended participants are those with days in study >= study duration + final ended = study.endedCount; + return Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SelectableText(tr.monitoring_participants_title, style: Theme.of(context).textTheme.headlineSmall), + const Spacer(), + Expanded( + child: Row( + children: [ + Expanded( + child: _buildStat(context, tr.monitoring_active, tr.monitoring_active_tooltip, active, enrolled)), + const SizedBox(width: 20.0), + Expanded(child: _buildStat(context, tr.monitoring_ended, tr.monitoring_ended_tooltip, ended, enrolled)), + ], + ), + ), + ], + ); + } + + Widget _buildStat(BuildContext context, String title, String tooltip, int value, int total) { + final theme = Theme.of(context); + return Tooltip( + message: tooltip, + child: Column( + children: [ + Row( + children: [ + Text("$title:"), + const SizedBox(width: 8.0), + Text("$value/$total", style: theme.textTheme.headlineSmall), + ], + ), + SizedBox( + height: 4.0, + child: LinearProgressIndicator( + value: total <= 0 ? 0 : value / total, + backgroundColor: theme.colorScheme.secondary.withOpacity(0.2), + valueColor: AlwaysStoppedAnimation(theme.colorScheme.secondary), + )), + ], + ), + ); + } + + _onSelectParticipant(BuildContext context, WidgetRef ref, StudyMonitorItem item) { + // TODO: refactor to use [RoutingIntent] for sidesheet (so that it can be triggered from controller) + final formViewModel = ref.read(participantDetailsFormViewModelProvider(item)); + formViewModel.setControlsFrom(item); + showFormSideSheet( + context: context, + formViewModel: formViewModel, + formViewBuilder: (formViewModel) => ParticipantDetailsFormView( + formViewModel: formViewModel, ), + actionButtons: [ + retainSizeInAppBar(DismissButton( + text: tr.dialog_close, + onPressed: () => Navigator.maybePop(context), + )) + ], ); } } diff --git a/designer_v2/lib/features/monitor/study_monitor_table.dart b/designer_v2/lib/features/monitor/study_monitor_table.dart new file mode 100644 index 000000000..be7b3ff9e --- /dev/null +++ b/designer_v2/lib/features/monitor/study_monitor_table.dart @@ -0,0 +1,188 @@ +import 'dart:convert'; +import 'dart:math'; + +import 'package:equatable/equatable.dart'; +import 'package:flutter/material.dart'; +import 'package:intl/intl.dart'; +import 'package:studyu_core/core.dart'; +import 'package:studyu_designer_v2/common_views/standard_table.dart'; +import 'package:studyu_designer_v2/localization/app_translation.dart'; + +class StudyMonitorItem extends Equatable { + final String participantId; + final String? inviteCode; + final DateTime enrolledAt; + final DateTime lastActivityAt; + final int currentDayOfStudy; + final int studyDurationInDays; + final int completedInterventions; + final int missedInterventions; + final int completedSurveys; + final int missedSurveys; + final String rawData; + + const StudyMonitorItem({ + required this.participantId, + required this.inviteCode, + required this.enrolledAt, + required this.lastActivityAt, + required this.currentDayOfStudy, + required this.studyDurationInDays, + required this.completedInterventions, + required this.missedInterventions, + required this.completedSurveys, + required this.missedSurveys, + required this.rawData, + }); + + static List fromStudy(Study study) { + final List items = []; + + final participants = study.participants ?? []; + final participantsProgress = study.participantsProgress ?? []; + + participants.sort((a, b) => a.startedAt!.compareTo(b.startedAt!)); // ascending + + for (final participant in participants) { + final progresses = participantsProgress.where((progress) => progress.subjectId == participant.id).toList(); + progresses.sort((b, a) => a.completedAt!.compareTo(b.completedAt!)); // descending + final interventions = participant.selectedInterventionIds; + final lastActivityAt = progresses.isNotEmpty ? progresses.first.completedAt! : participant.startedAt!; + final studyDurationInDays = study.schedule.length; + final currentDayOfStudy = + min(studyDurationInDays, DateTime.now().toUtc().difference(participant.startedAt!).inDays); + final daysInBaseline = study.schedule.includeBaseline ? study.schedule.phaseDuration : 0; + + final totalInterventions = max(0, currentDayOfStudy - daysInBaseline) * interventions.length; + final totalSurveys = currentDayOfStudy * study.observations.length; + + final completedInterventions = progresses.where((p) => p.resultType == "bool").toList(); + final completedSurveys = progresses.where((p) => p.resultType != "bool").toList(); + + final missedInterventions = totalInterventions - completedInterventions.length; + final missedSurveys = totalSurveys - completedSurveys.length; + + final rawDataDict = { + "participant": participant.toJson(), + "interventions": completedInterventions.map((p) => p.toJson()).toList(), + "surveys": completedSurveys.map((p) => p.toJson()).toList(), + }; + + final rawData = const JsonEncoder.withIndent(' ').convert(rawDataDict); + + items.add(StudyMonitorItem( + participantId: participant.id, + inviteCode: participant.inviteCode, + enrolledAt: participant.startedAt!, + lastActivityAt: lastActivityAt, + currentDayOfStudy: currentDayOfStudy, + studyDurationInDays: studyDurationInDays, + completedInterventions: completedInterventions.length, + missedInterventions: missedInterventions, + completedSurveys: completedSurveys.length, + missedSurveys: missedSurveys, + rawData: rawData, + )); + } + + return items; + } + + @override + List get props => [participantId]; +} + +class StudyMonitorTable extends StatelessWidget { + final List studyMonitorItems; + final OnSelectHandler onSelectItem; + + const StudyMonitorTable({required this.studyMonitorItems, required this.onSelectItem, super.key}); + + @override + Widget build(BuildContext context) { + return StandardTable( + items: studyMonitorItems, + columns: [ + StandardTableColumn( + label: tr.monitoring_table_column_participant_id, + columnWidth: const MaxColumnWidth(FixedColumnWidth(150), FlexColumnWidth(1.6))), + StandardTableColumn( + label: tr.monitoring_table_column_invite_code, + columnWidth: const MaxColumnWidth(FixedColumnWidth(200), FlexColumnWidth(1.6))), + StandardTableColumn( + label: tr.monitoring_table_column_enrolled, + columnWidth: const MaxColumnWidth(FixedColumnWidth(150), FlexColumnWidth(1.6))), + StandardTableColumn( + label: tr.monitoring_table_column_last_activity, + columnWidth: const MaxColumnWidth(FixedColumnWidth(150), FlexColumnWidth(1.6))), + StandardTableColumn( + label: tr.monitoring_table_column_day_in_study, + columnWidth: const MaxColumnWidth(FixedColumnWidth(125), FlexColumnWidth(1.6))), + StandardTableColumn( + label: tr.monitoring_table_column_completed_interventions, + columnWidth: const MaxColumnWidth(FixedColumnWidth(125), FlexColumnWidth(1.6))), + StandardTableColumn( + label: tr.monitoring_table_column_completed_surveys, + columnWidth: const MaxColumnWidth(FixedColumnWidth(125), FlexColumnWidth(1.6))), + ], + buildCellsAt: _buildRow, + cellSpacing: 10.0, + rowSpacing: 5.0, + minRowHeight: 30.0, + headerMaxLines: 2, + onSelectItem: onSelectItem, + ); + } + + List _buildRow(BuildContext context, StudyMonitorItem item, int rowIdx, Set states) { + return [ + Tooltip( + message: item.participantId, + child: Text(item.participantId.split("-").first), + ), + Text(item.inviteCode ?? "-"), + Tooltip( + message: _formatTime(item.enrolledAt, true), + child: Text(_formatTime(item.enrolledAt, false)), + ), + Tooltip( + message: _formatTime(item.lastActivityAt, true), + child: Text(_formatTime(item.lastActivityAt, false)), + ), + _buildProgressCell(context, item.currentDayOfStudy, item.studyDurationInDays), + _buildProgressCell(context, item.completedInterventions, item.completedInterventions + item.missedInterventions), + _buildProgressCell(context, item.completedSurveys, item.completedSurveys + item.missedSurveys), + ]; + } + + String _formatTime(DateTime time, bool showTime) { + final localTime = time.toLocal(); + final timeZoneOffsetInHours = localTime.timeZoneOffset.inHours; + final timeZoneString = timeZoneOffsetInHours >= 0 ? "GMT +$timeZoneOffsetInHours" : "GMT $timeZoneOffsetInHours"; + final locale = tr.localeName == "de" ? "de_DE" : "en_US"; + final formattedDate = DateFormat("MMM d, yyyy", locale); + if (!showTime) return formattedDate.format(localTime); + final formattedTime = DateFormat.jm(locale); + return "${formattedDate.format(localTime)}, ${formattedTime.format(localTime)} $timeZoneString"; + } + + Widget _buildProgressCell(BuildContext context, int progress, int total) { + final theme = Theme.of(context); + return Stack( + children: [ + SizedBox.expand( + child: LinearProgressIndicator( + value: total <= 0 ? 0 : progress / total, + backgroundColor: theme.primaryColor.withOpacity(0.7), + valueColor: AlwaysStoppedAnimation(theme.primaryColor), + ), + ), + Align( + alignment: Alignment.center, + child: Text("$progress/$total", + style: TextStyle(color: theme.colorScheme.onPrimary, fontWeight: FontWeight.bold)), + ), + ], + ); + } +} diff --git a/designer_v2/lib/localization/app_de.arb b/designer_v2/lib/localization/app_de.arb index 08dd0bff9..cf780d847 100644 --- a/designer_v2/lib/localization/app_de.arb +++ b/designer_v2/lib/localization/app_de.arb @@ -473,6 +473,23 @@ "action_button_code_new": "Neuer Code", "notification_code_deleted": "Teilnahmecode gelöscht", "notification_code_clipboard": "Code wurde in die Zwischenablage kopiert", + "@__________________STUDYPAGE_MONITOR__________________": {}, + "participant_details_title": "Teilnehmerdetails", + "participant_details_raw_data": "Rohdaten", + "monitoring_no_participants_title": "Es gibt noch keine Teilnehmer in dieser Studie", + "monitoring_no_participants_description": "Sobald Teilnehmer in Ihrer Studie eingeschrieben sind, können Sie hier deren Fortschritt überwachen und ihre Daten einsehen.", + "monitoring_participants_title": "Teilnehmer", + "monitoring_active": "Aktiv", + "monitoring_active_tooltip": "Anzahl der Teilnehmer, die in den letzten 3 Tagen aktiv waren", + "monitoring_ended": "Beendet", + "monitoring_ended_tooltip": "Anzahl der Teilnehmer, die das Ende der Studie erreicht haben", + "monitoring_table_column_participant_id": "Teilnehmer-ID", + "monitoring_table_column_invite_code": "Einladungscode", + "monitoring_table_column_enrolled": "Eingeschrieben", + "monitoring_table_column_last_activity": "Letzte Aktivität", + "monitoring_table_column_day_in_study": "Studientag", + "monitoring_table_column_completed_interventions": "Abgeschlossene\nInterventionen", + "monitoring_table_column_completed_surveys": "Abgeschlossene\nFragebögen", "@__________________STUDYPAGE_ANALYZE__________________": {}, "banner_text_study_analyze_draft": "Solange die Studie noch nicht live ist, basieren die Ergebnisse hier auf dem letzten Testlauf der Studie (siehe Testmodus).\nDie Ergebnisdaten werden automatisch zurückgesetzt sobald die Studie mit echten Teilnehmern startet.", "action_button_study_export": "Daten exportieren", diff --git a/designer_v2/lib/localization/app_en.arb b/designer_v2/lib/localization/app_en.arb index 33e423333..6ee1ae956 100644 --- a/designer_v2/lib/localization/app_en.arb +++ b/designer_v2/lib/localization/app_en.arb @@ -519,6 +519,23 @@ "code_list_empty_description": "Add participants to your study via access codes.", "code_list_header_code": "Code", "action_button_code_new": "New code", + "@__________________STUDYPAGE_MONITOR__________________": {}, + "participant_details_title": "Participant Details", + "participant_details_raw_data": "Raw Data", + "monitoring_no_participants_title": "There are no participants in this study yet", + "monitoring_no_participants_description": "Once participants have enrolled in your study, you can monitor their progress and view their data here.", + "monitoring_participants_title": "Participants", + "monitoring_active": "Active", + "monitoring_active_tooltip": "Number of participants that were active in the last 3 days", + "monitoring_ended": "Ended", + "monitoring_ended_tooltip": "Number of participants who reached the end of the study", + "monitoring_table_column_participant_id": "Participant ID", + "monitoring_table_column_invite_code": "Invite Code", + "monitoring_table_column_enrolled": "Enrolled", + "monitoring_table_column_last_activity": "Last Activity", + "monitoring_table_column_day_in_study": "Day in Study", + "monitoring_table_column_completed_interventions": "Completed\nInterventions", + "monitoring_table_column_completed_surveys": "Completed\nSurveys", "@__________________STUDYPAGE_ANALYZE__________________": {}, "banner_text_study_analyze_draft": "Because this study has not been launched yet, this page is currently based on the data generated during study testing (only the latest test session).\nThe data on this page will be reset once you launch the study with real participants.", "action_button_study_export": "Export data", diff --git a/designer_v2/pubspec.lock b/designer_v2/pubspec.lock index 03c407eaf..848d1fa09 100644 --- a/designer_v2/pubspec.lock +++ b/designer_v2/pubspec.lock @@ -405,7 +405,7 @@ packages: source: sdk version: "0.0.0" intl: - dependency: transitive + dependency: "direct main" description: name: intl sha256: "3bc132a9dbce73a7e4a21a17d06e1878839ffbf975568bc875c60537824b0c4d" diff --git a/designer_v2/pubspec.yaml b/designer_v2/pubspec.yaml index 460b8affe..dfb2ed1d7 100644 --- a/designer_v2/pubspec.yaml +++ b/designer_v2/pubspec.yaml @@ -24,6 +24,7 @@ dependencies: flutter_web_plugins: sdk: flutter go_router: ^13.2.1 + intl: material_color_utilities: material_design_icons_flutter: ^7.0.7296 pointer_interceptor: ^0.10.1 From aedd46d3cb683ee7e720873eddfb4af300f56ce4 Mon Sep 17 00:00:00 2001 From: StudyU Documenter Date: Thu, 18 Apr 2024 16:40:14 +0000 Subject: [PATCH 002/314] docs: update UML documentation --- docs/uml/designer_v2/lib/common_views/uml.svg | 3624 +-- .../designer_v2/lib/features/monitor/uml.svg | 297 +- docs/uml/designer_v2/lib/features/uml.svg | 11386 ++++----- docs/uml/designer_v2/lib/uml.svg | 20514 ++++++++-------- 4 files changed, 18267 insertions(+), 17554 deletions(-) diff --git a/docs/uml/designer_v2/lib/common_views/uml.svg b/docs/uml/designer_v2/lib/common_views/uml.svg index 425f28f48..315b900bc 100644 --- a/docs/uml/designer_v2/lib/common_views/uml.svg +++ b/docs/uml/designer_v2/lib/common_views/uml.svg @@ -1,40 +1,59 @@ - - [<abstract>ISyncIndicatorViewModel + + [AsyncValueWidget | - +isDirty: bool; - +lastSynced: DateTime? - ] - - [SyncIndicator + +value: AsyncValue<T>; + +data: Widget Function(T); + +error: Widget Function(Object, StackTrace?)?; + +loading: Widget Function()?; + +empty: Widget Function()? | - +state: AsyncValue<T>; - +lastSynced: DateTime?; - +isDirty: bool; - +animationDuration: int; - +iconSize: double + +Widget build(); + -Widget _buildDataOrEmptyWidget(); + -Widget _defaultError(); + -Widget _defaultLoad() ] - [SyncIndicator]o-[<abstract>AsyncValue] + [AsyncValueWidget]o-[<abstract>AsyncValue] + [AsyncValueWidget]o-[Widget Function(T)] + [AsyncValueWidget]o-[Widget Function(Object, StackTrace?)?] + [AsyncValueWidget]o-[Widget Function()?] - [EmptyBody + [FormControlLabel | - +icon: IconData?; - +leading: Widget?; - +leadingSpacing: double?; - +title: String?; - +description: String?; - +button: Widget? + +formControl: AbstractControl<dynamic>; + +text: String; + +isClickable: bool; + +textStyle: TextStyle?; + +onClick: void Function(AbstractControl<dynamic>)? | +Widget build() ] - [EmptyBody]o-[IconData] - [EmptyBody]o-[<abstract>Widget] + [FormControlLabel]o-[<abstract>AbstractControl] + [FormControlLabel]o-[TextStyle] + [FormControlLabel]o-[void Function(AbstractControl<dynamic>)?] - [NullHelperDecoration + [ActionPopUpMenuButton + | + +actions: List<ModelAction<dynamic>>; + +triggerIconColor: Color?; + +triggerIconColorHover: Color?; + +triggerIconSize: double; + +disableSplashEffect: bool; + +hideOnEmpty: bool; + +orientation: Axis; + +elevation: double?; + +splashRadius: double?; + +enabled: bool; + +position: PopupMenuPosition + | + +Widget build(); + -Widget _buildPopupMenu() ] - [InputDecoration]<:-[NullHelperDecoration] + [ActionPopUpMenuButton]o-[Color] + [ActionPopUpMenuButton]o-[Axis] + [ActionPopUpMenuButton]o-[PopupMenuPosition] [Search | @@ -54,6 +73,18 @@ [SearchController]o-[void Function(String)] + [FormScaffold + | + +formViewModel: T; + +actions: List<Widget>?; + +body: Widget; + +drawer: Widget?; + +actionsSpacing: double; + +actionsPadding: double + ] + + [FormScaffold]o-[<abstract>Widget] + [ConstrainedWidthFlexible | +minWidth: double; @@ -70,47 +101,6 @@ [ConstrainedWidthFlexible]o-[<abstract>Widget] [ConstrainedWidthFlexible]o-[BoxConstraints] - [AsyncValueWidget - | - +value: AsyncValue<T>; - +data: Widget Function(T); - +error: Widget Function(Object, StackTrace?)?; - +loading: Widget Function()?; - +empty: Widget Function()? - | - +Widget build(); - -Widget _buildDataOrEmptyWidget(); - -Widget _defaultError(); - -Widget _defaultLoad() - ] - - [AsyncValueWidget]o-[<abstract>AsyncValue] - [AsyncValueWidget]o-[Widget Function(T)] - [AsyncValueWidget]o-[Widget Function(Object, StackTrace?)?] - [AsyncValueWidget]o-[Widget Function()?] - - [ActionPopUpMenuButton - | - +actions: List<ModelAction<dynamic>>; - +triggerIconColor: Color?; - +triggerIconColorHover: Color?; - +triggerIconSize: double; - +disableSplashEffect: bool; - +hideOnEmpty: bool; - +orientation: Axis; - +elevation: double?; - +splashRadius: double?; - +enabled: bool; - +position: PopupMenuPosition - | - +Widget build(); - -Widget _buildPopupMenu() - ] - - [ActionPopUpMenuButton]o-[Color] - [ActionPopUpMenuButton]o-[Axis] - [ActionPopUpMenuButton]o-[PopupMenuPosition] - [PrimaryButton | +text: String; @@ -133,36 +123,6 @@ [PrimaryButton]o-[EdgeInsets] [PrimaryButton]o-[Size] - [Hyperlink - | - +text: String; - +url: String?; - +onClick: void Function()?; - +linkColor: Color; - +hoverColor: Color?; - +visitedColor: Color?; - +style: TextStyle?; - +hoverStyle: TextStyle?; - +visitedStyle: TextStyle?; - +icon: IconData?; - +iconSize: double? - ] - - [Hyperlink]o-[void Function()?] - [Hyperlink]o-[Color] - [Hyperlink]o-[TextStyle] - [Hyperlink]o-[IconData] - - [DismissButton - | - +onPressed: void Function()?; - +text: String? - | - +Widget build() - ] - - [DismissButton]o-[void Function()?] - [FormTableRow | +label: String?; @@ -232,83 +192,184 @@ [FormTableRowLayout]o-[FormTableRowLayout] [Enum]<:--[FormTableRowLayout] - [ActionMenuType + [DismissButton | - +index: int; - <static>+values: List<ActionMenuType>; - <static>+inline: ActionMenuType; - <static>+popup: ActionMenuType + +onPressed: void Function()?; + +text: String? + | + +Widget build() ] - [ActionMenuType]o-[ActionMenuType] - [Enum]<:--[ActionMenuType] + [DismissButton]o-[void Function()?] - [ReactiveCustomColorPicker + [Badge + | + +icon: IconData?; + +color: Color?; + +borderRadius: double; + +label: String; + +type: BadgeType; + +padding: EdgeInsets; + +iconSize: double?; + +labelStyle: TextStyle?; + +center: bool + | + +Widget build(); + -Color? _getBackgroundColor(); + -Color _getBorderColor(); + -Color? _getLabelColor() ] - [ReactiveFormField]<:-[ReactiveCustomColorPicker] + [Badge]o-[IconData] + [Badge]o-[Color] + [Badge]o-[BadgeType] + [Badge]o-[EdgeInsets] + [Badge]o-[TextStyle] - [NavbarTab + [BadgeType | - +title: String; - +intent: RoutingIntent?; +index: int; - +enabled: bool + <static>+values: List<BadgeType>; + <static>+filled: BadgeType; + <static>+outlined: BadgeType; + <static>+outlineFill: BadgeType; + <static>+plain: BadgeType ] - [NavbarTab]o-[RoutingIntent] + [BadgeType]o-[BadgeType] + [Enum]<:--[BadgeType] - [TabbedNavbar + [StandardDialog | - +tabs: List<T>; - +selectedTab: T?; - +indicator: BoxDecoration?; - +height: double?; - +disabledBackgroundColor: Color?; - +disabledTooltipText: String?; - +onSelect: void Function(int, T)?; - +labelPadding: EdgeInsets?; - +labelSpacing: double?; - +indicatorSize: TabBarIndicatorSize?; - +isScrollable: bool; + +title: Widget?; + +titleText: String?; + +body: Widget; + +actionButtons: List<Widget>; +backgroundColor: Color?; - +labelColorHover: Color?; - +unselectedLabelColorHover: Color? + +borderRadius: double?; + +width: double?; + +height: double?; + +minWidth: double; + +minHeight: double; + +maxWidth: double?; + +maxHeight: double?; + +padding: EdgeInsets + | + +Widget build() ] - [TabbedNavbar]o-[BoxDecoration] - [TabbedNavbar]o-[Color] - [TabbedNavbar]o-[void Function(int, T)?] - [TabbedNavbar]o-[EdgeInsets] - [TabbedNavbar]o-[TabBarIndicatorSize] + [StandardDialog]o-[<abstract>Widget] + [StandardDialog]o-[Color] + [StandardDialog]o-[EdgeInsets] - [Collapsible + [<abstract>ISyncIndicatorViewModel | - +contentBuilder: Widget Function(BuildContext, bool); - +headerBuilder: Widget Function(BuildContext, bool)?; - +title: String?; - +isCollapsed: bool + +isDirty: bool; + +lastSynced: DateTime? ] - [Collapsible]o-[Widget Function(BuildContext, bool)] - [Collapsible]o-[Widget Function(BuildContext, bool)?] - - [StudyULogo - | - +onTap: void Function()? + [SyncIndicator | - +Widget build() + +state: AsyncValue<T>; + +lastSynced: DateTime?; + +isDirty: bool; + +animationDuration: int; + +iconSize: double ] - [StudyULogo]o-[void Function()?] + [SyncIndicator]o-[<abstract>AsyncValue] - [FormSideSheetTab + [<abstract>IWithBanner | - +formViewBuilder: Widget Function(T) + +Widget? banner() ] - [FormSideSheetTab]o-[Widget Function(T)] - [NavbarTab]<:-[FormSideSheetTab] + [BannerBox + | + +prefixIcon: Widget?; + +body: Widget; + +style: BannerStyle; + +padding: EdgeInsets?; + +noPrefix: bool; + +dismissable: bool; + +isDismissed: bool?; + +onDismissed: dynamic Function()?; + +dismissIconSize: double + ] + + [BannerBox]o-[<abstract>Widget] + [BannerBox]o-[BannerStyle] + [BannerBox]o-[EdgeInsets] + [BannerBox]o-[dynamic Function()?] + + [BannerStyle + | + +index: int; + <static>+values: List<BannerStyle>; + <static>+warning: BannerStyle; + <static>+info: BannerStyle; + <static>+error: BannerStyle + ] + + [BannerStyle]o-[BannerStyle] + [Enum]<:--[BannerStyle] + + [ActionMenuInline + | + +actions: List<ModelAction<dynamic>>; + +iconSize: double?; + +visible: bool; + +splashRadius: double?; + +paddingVertical: double?; + +paddingHorizontal: double? + | + +Widget build() + ] + + [Collapsible + | + +contentBuilder: Widget Function(BuildContext, bool); + +headerBuilder: Widget Function(BuildContext, bool)?; + +title: String?; + +isCollapsed: bool + ] + + [Collapsible]o-[Widget Function(BuildContext, bool)] + [Collapsible]o-[Widget Function(BuildContext, bool)?] + + [NavbarTab + | + +title: String; + +intent: RoutingIntent?; + +index: int; + +enabled: bool + ] + + [NavbarTab]o-[RoutingIntent] + + [TabbedNavbar + | + +tabs: List<T>; + +selectedTab: T?; + +indicator: BoxDecoration?; + +height: double?; + +disabledBackgroundColor: Color?; + +disabledTooltipText: String?; + +onSelect: void Function(int, T)?; + +labelPadding: EdgeInsets?; + +labelSpacing: double?; + +indicatorSize: TabBarIndicatorSize?; + +isScrollable: bool; + +backgroundColor: Color?; + +labelColorHover: Color?; + +unselectedLabelColorHover: Color? + ] + + [TabbedNavbar]o-[BoxDecoration] + [TabbedNavbar]o-[Color] + [TabbedNavbar]o-[void Function(int, T)?] + [TabbedNavbar]o-[EdgeInsets] + [TabbedNavbar]o-[TabBarIndicatorSize] [SidesheetTab | @@ -337,6 +398,49 @@ [Sidesheet]o-[EdgeInsets] [Sidesheet]o-[Widget Function(Widget)?] + [FormSideSheetTab + | + +formViewBuilder: Widget Function(T) + ] + + [FormSideSheetTab]o-[Widget Function(T)] + [NavbarTab]<:-[FormSideSheetTab] + + [HelpIcon + | + +tooltipText: String? + | + +Widget build() + ] + + [EmptyBody + | + +icon: IconData?; + +leading: Widget?; + +leadingSpacing: double?; + +title: String?; + +description: String?; + +button: Widget? + | + +Widget build() + ] + + [EmptyBody]o-[IconData] + [EmptyBody]o-[<abstract>Widget] + + [IndicatorRangeSliderThumbShape + | + +buildContext: BuildContext; + +start: T; + +end: T + | + +Size getPreferredSize(); + +void paint() + ] + + [IndicatorRangeSliderThumbShape]o-[<abstract>BuildContext] + [<abstract>RangeSliderThumbShape]<:-[IndicatorRangeSliderThumbShape] + [MouseEventsRegion | +onTap: void Function()?; @@ -355,140 +459,86 @@ [MouseEventsRegion]o-[void Function(PointerExitEvent)?] [MouseEventsRegion]o-[SystemMouseCursor] - [FormControlLabel + [ReactiveCustomColorPicker + ] + + [ReactiveFormField]<:-[ReactiveCustomColorPicker] + + [TextParagraph | - +formControl: AbstractControl<dynamic>; - +text: String; - +isClickable: bool; - +textStyle: TextStyle?; - +onClick: void Function(AbstractControl<dynamic>)? + +text: String?; + +style: TextStyle?; + +selectable: bool; + +span: List<TextSpan>? | +Widget build() ] - [FormControlLabel]o-[<abstract>AbstractControl] - [FormControlLabel]o-[TextStyle] - [FormControlLabel]o-[void Function(AbstractControl<dynamic>)?] + [TextParagraph]o-[TextStyle] - [<abstract>IWithBanner + [UnderConstruction | - +Widget? banner() + +Widget build() ] - [BannerBox - | - +prefixIcon: Widget?; - +body: Widget; - +style: BannerStyle; - +padding: EdgeInsets?; - +noPrefix: bool; - +dismissable: bool; - +isDismissed: bool?; - +onDismissed: dynamic Function()?; - +dismissIconSize: double + [NullHelperDecoration ] - [BannerBox]o-[<abstract>Widget] - [BannerBox]o-[BannerStyle] - [BannerBox]o-[EdgeInsets] - [BannerBox]o-[dynamic Function()?] + [InputDecoration]<:-[NullHelperDecoration] - [BannerStyle + [ActionMenuType | +index: int; - <static>+values: List<BannerStyle>; - <static>+warning: BannerStyle; - <static>+info: BannerStyle; - <static>+error: BannerStyle + <static>+values: List<ActionMenuType>; + <static>+inline: ActionMenuType; + <static>+popup: ActionMenuType ] - [BannerStyle]o-[BannerStyle] - [Enum]<:--[BannerStyle] + [ActionMenuType]o-[ActionMenuType] + [Enum]<:--[ActionMenuType] - [SecondaryButton + [HtmlStylingBanner | - +text: String; - +icon: IconData?; - +isLoading: bool; - +onPressed: void Function()? + +isDismissed: bool; + +onDismissed: dynamic Function()? | +Widget build() ] - [SecondaryButton]o-[IconData] - [SecondaryButton]o-[void Function()?] + [HtmlStylingBanner]o-[dynamic Function()?] - [IconPack - | - <static>+defaultPack: List<IconOption>; - <static>+material: List<IconOption> + [<abstract>FormConsumerWidget | - <static>+IconOption? resolveIconByName() + +Widget build() ] - [IconOption - | - +name: String; - +icon: IconData?; - +isEmpty: bool; - +props: List<Object?> + [<abstract>FormConsumerRefWidget | - +String toJson(); - <static>+IconOption fromJson() - ] - - [IconOption]o-[IconData] - [<abstract>Equatable]<:-[IconOption] - - [ReactiveIconPicker + +Widget build() ] - [ReactiveFocusableFormField]<:-[ReactiveIconPicker] - - [IconPicker - | - +iconOptions: List<IconOption>; - +selectedOption: IconOption?; - +onSelect: void Function(IconOption)?; - +galleryIconSize: double?; - +selectedIconSize: double?; - +focusNode: FocusNode?; - +isDisabled: bool + [SplashPage | +Widget build() ] - [IconPicker]o-[IconOption] - [IconPicker]o-[void Function(IconOption)?] - [IconPicker]o-[FocusNode] - - [IconPickerField + [ErrorPage | - +iconOptions: List<IconOption>; - +selectedOption: IconOption?; - +selectedIconSize: double?; - +galleryIconSize: double?; - +onSelect: void Function(IconOption)?; - +focusNode: FocusNode?; - +isDisabled: bool + +error: Exception? | +Widget build() ] - [IconPickerField]o-[IconOption] - [IconPickerField]o-[void Function(IconOption)?] - [IconPickerField]o-[FocusNode] + [<abstract>ConsumerWidget]<:-[ErrorPage] - [IconPickerGallery + [StudyULogo | - +iconOptions: List<IconOption>; - +onSelect: void Function(IconOption)?; - +iconSize: double + +onTap: void Function()? | +Widget build() ] - [IconPickerGallery]o-[void Function(IconOption)?] + [StudyULogo]o-[void Function()?] [SingleColumnLayout | @@ -510,71 +560,36 @@ [SingleColumnLayoutType | - +index: int; - <static>+values: List<SingleColumnLayoutType>; - <static>+boundedWide: SingleColumnLayoutType; - <static>+boundedNarrow: SingleColumnLayoutType; - <static>+stretched: SingleColumnLayoutType; - <static>+split: SingleColumnLayoutType - ] - - [SingleColumnLayoutType]o-[SingleColumnLayoutType] - [Enum]<:--[SingleColumnLayoutType] - - [<abstract>FormConsumerWidget - | - +Widget build() - ] - - [<abstract>FormConsumerRefWidget - | - +Widget build() - ] - - [FormScaffold - | - +formViewModel: T; - +actions: List<Widget>?; - +body: Widget; - +drawer: Widget?; - +actionsSpacing: double; - +actionsPadding: double - ] - - [FormScaffold]o-[<abstract>Widget] - - [StandardDialog - | - +title: Widget?; - +titleText: String?; - +body: Widget; - +actionButtons: List<Widget>; - +backgroundColor: Color?; - +borderRadius: double?; - +width: double?; - +height: double?; - +minWidth: double; - +minHeight: double; - +maxWidth: double?; - +maxHeight: double?; - +padding: EdgeInsets - | - +Widget build() + +index: int; + <static>+values: List<SingleColumnLayoutType>; + <static>+boundedWide: SingleColumnLayoutType; + <static>+boundedNarrow: SingleColumnLayoutType; + <static>+stretched: SingleColumnLayoutType; + <static>+split: SingleColumnLayoutType ] - [StandardDialog]o-[<abstract>Widget] - [StandardDialog]o-[Color] - [StandardDialog]o-[EdgeInsets] + [SingleColumnLayoutType]o-[SingleColumnLayoutType] + [Enum]<:--[SingleColumnLayoutType] - [HtmlStylingBanner - | - +isDismissed: bool; - +onDismissed: dynamic Function()? + [Hyperlink | - +Widget build() + +text: String; + +url: String?; + +onClick: void Function()?; + +linkColor: Color; + +hoverColor: Color?; + +visitedColor: Color?; + +style: TextStyle?; + +hoverStyle: TextStyle?; + +visitedStyle: TextStyle?; + +icon: IconData?; + +iconSize: double? ] - [HtmlStylingBanner]o-[dynamic Function()?] + [Hyperlink]o-[void Function()?] + [Hyperlink]o-[Color] + [Hyperlink]o-[TextStyle] + [Hyperlink]o-[IconData] [StandardTableColumn | @@ -605,6 +620,7 @@ +cellSpacing: double; +rowSpacing: double; +minRowHeight: double?; + +headerMaxLines: int; +showTableHeader: bool; +hideLeadingTrailingWhenEmpty: bool; +leadingWidget: Widget?; @@ -637,756 +653,822 @@ [StandardTableStyle]o-[StandardTableStyle] [Enum]<:--[StandardTableStyle] - [TwoColumnLayout - | - <static>+defaultDivider: VerticalDivider; - <static>+defaultContentPadding: EdgeInsets; - <static>+slimContentPadding: EdgeInsets; - +leftWidget: Widget; - +rightWidget: Widget; - +dividerWidget: Widget?; - +headerWidget: Widget?; - +flexLeft: int?; - +flexRight: int?; - +constraintsLeft: BoxConstraints?; - +constraintsRight: BoxConstraints?; - +scrollLeft: bool; - +scrollRight: bool; - +paddingLeft: EdgeInsets?; - +paddingRight: EdgeInsets?; - +backgroundColorLeft: Color?; - +backgroundColorRight: Color?; - +stretchHeight: bool - ] - - [TwoColumnLayout]o-[VerticalDivider] - [TwoColumnLayout]o-[EdgeInsets] - [TwoColumnLayout]o-[<abstract>Widget] - [TwoColumnLayout]o-[BoxConstraints] - [TwoColumnLayout]o-[Color] - - [ActionMenuInline + [IconPack | - +actions: List<ModelAction<dynamic>>; - +iconSize: double?; - +visible: bool; - +splashRadius: double?; - +paddingVertical: double?; - +paddingHorizontal: double? + <static>+defaultPack: List<IconOption>; + <static>+material: List<IconOption> | - +Widget build() + <static>+IconOption? resolveIconByName() ] - [TextParagraph + [IconOption | - +text: String?; - +style: TextStyle?; - +selectable: bool; - +span: List<TextSpan>? + +name: String; + +icon: IconData?; + +isEmpty: bool; + +props: List<Object?> | - +Widget build() + +String toJson(); + <static>+IconOption fromJson() ] - [TextParagraph]o-[TextStyle] + [IconOption]o-[IconData] + [<abstract>Equatable]<:-[IconOption] - [SplashPage - | - +Widget build() + [ReactiveIconPicker ] - [ErrorPage + [ReactiveFocusableFormField]<:-[ReactiveIconPicker] + + [IconPicker | - +error: Exception? + +iconOptions: List<IconOption>; + +selectedOption: IconOption?; + +onSelect: void Function(IconOption)?; + +galleryIconSize: double?; + +selectedIconSize: double?; + +focusNode: FocusNode?; + +isDisabled: bool | +Widget build() ] - [<abstract>ConsumerWidget]<:-[ErrorPage] + [IconPicker]o-[IconOption] + [IconPicker]o-[void Function(IconOption)?] + [IconPicker]o-[FocusNode] - [Badge - | - +icon: IconData?; - +color: Color?; - +borderRadius: double; - +label: String; - +type: BadgeType; - +padding: EdgeInsets; - +iconSize: double?; - +labelStyle: TextStyle?; - +center: bool + [IconPickerField | - +Widget build(); - -Color? _getBackgroundColor(); - -Color _getBorderColor(); - -Color? _getLabelColor() - ] - - [Badge]o-[IconData] - [Badge]o-[Color] - [Badge]o-[BadgeType] - [Badge]o-[EdgeInsets] - [Badge]o-[TextStyle] - - [BadgeType + +iconOptions: List<IconOption>; + +selectedOption: IconOption?; + +selectedIconSize: double?; + +galleryIconSize: double?; + +onSelect: void Function(IconOption)?; + +focusNode: FocusNode?; + +isDisabled: bool | - +index: int; - <static>+values: List<BadgeType>; - <static>+filled: BadgeType; - <static>+outlined: BadgeType; - <static>+outlineFill: BadgeType; - <static>+plain: BadgeType + +Widget build() ] - [BadgeType]o-[BadgeType] - [Enum]<:--[BadgeType] + [IconPickerField]o-[IconOption] + [IconPickerField]o-[void Function(IconOption)?] + [IconPickerField]o-[FocusNode] - [IndicatorRangeSliderThumbShape + [IconPickerGallery | - +buildContext: BuildContext; - +start: T; - +end: T + +iconOptions: List<IconOption>; + +onSelect: void Function(IconOption)?; + +iconSize: double | - +Size getPreferredSize(); - +void paint() + +Widget build() ] - [IndicatorRangeSliderThumbShape]o-[<abstract>BuildContext] - [<abstract>RangeSliderThumbShape]<:-[IndicatorRangeSliderThumbShape] + [IconPickerGallery]o-[void Function(IconOption)?] - [HelpIcon + [SecondaryButton | - +tooltipText: String? + +text: String; + +icon: IconData?; + +isLoading: bool; + +onPressed: void Function()? | +Widget build() ] - [UnderConstruction + [SecondaryButton]o-[IconData] + [SecondaryButton]o-[void Function()?] + + [TwoColumnLayout | - +Widget build() + <static>+defaultDivider: VerticalDivider; + <static>+defaultContentPadding: EdgeInsets; + <static>+slimContentPadding: EdgeInsets; + +leftWidget: Widget; + +rightWidget: Widget; + +dividerWidget: Widget?; + +headerWidget: Widget?; + +flexLeft: int?; + +flexRight: int?; + +constraintsLeft: BoxConstraints?; + +constraintsRight: BoxConstraints?; + +scrollLeft: bool; + +scrollRight: bool; + +paddingLeft: EdgeInsets?; + +paddingRight: EdgeInsets?; + +backgroundColorLeft: Color?; + +backgroundColorRight: Color?; + +stretchHeight: bool ] + [TwoColumnLayout]o-[VerticalDivider] + [TwoColumnLayout]o-[EdgeInsets] + [TwoColumnLayout]o-[<abstract>Widget] + [TwoColumnLayout]o-[BoxConstraints] + [TwoColumnLayout]o-[Color] + - + - + - - + + - + - + - + - + - + - - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - + + - + + - + - + - + - + - - - - + - - + - + - - - - - - - + - + - + - + - + - + - - - + + - + + - + - + - + - + - + - + - + - + - + - + - + - - - + - + - - - + - + - + - + - + + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + - + - + - + - + - + - + - + - + + + - + - - + + + - - + - + - + + + - + - + - + - - - - - + - + - + - + - + - + - + + + - + - + + + - + - + + + + + - + - + + + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + - + + - + - - + + + + + + + - - + - + - + - + - + - + - + - + - + - + - + - + - - - + - + - + - + - + - + - + - + - + - + - + - + - - + + + + + + + + + + + + + AsyncValueWidget + + + + + + +value: AsyncValue<T> + +data: Widget Function(T) + +error: Widget Function(Object, StackTrace?)? + +loading: Widget Function()? + +empty: Widget Function()? + + + + + + +Widget build() + -Widget _buildDataOrEmptyWidget() + -Widget _defaultError() + -Widget _defaultLoad() + + + + + + + + + + + AsyncValue + + + - - - - + + + + + + + Widget Function(T) + + + - - - - - - + + + - - - ISyncIndicatorViewModel + + + Widget Function(Object, StackTrace?)? - - - +isDirty: bool - +lastSynced: DateTime? + + + + + + + + Widget Function()? - - - - + + + + + - - - SyncIndicator + + + FormControlLabel - - - +state: AsyncValue<T> - +lastSynced: DateTime? - +isDirty: bool - +animationDuration: int - +iconSize: double + + + +formControl: AbstractControl<dynamic> + +text: String + +isClickable: bool + +textStyle: TextStyle? + +onClick: void Function(AbstractControl<dynamic>)? + + + + + + +Widget build() - - - + + + - - - AsyncValue + + + AbstractControl - - - - - + + + - - - EmptyBody + + + TextStyle - - - +icon: IconData? - +leading: Widget? - +leadingSpacing: double? - +title: String? - +description: String? - +button: Widget? + + + + + + + + void Function(AbstractControl<dynamic>)? - - - +Widget build() + + + + + + + + + + ActionPopUpMenuButton - - - - + + + +actions: List<ModelAction<dynamic>> + +triggerIconColor: Color? + +triggerIconColorHover: Color? + +triggerIconSize: double + +disableSplashEffect: bool + +hideOnEmpty: bool + +orientation: Axis + +elevation: double? + +splashRadius: double? + +enabled: bool + +position: PopupMenuPosition + + - - - IconData + + + +Widget build() + -Widget _buildPopupMenu() - - - + + + - - - Widget + + + Color - - - + + + - - - NullHelperDecoration + + + Axis - - - + + + - - - InputDecoration + + + PopupMenuPosition - - + + - + Search - + +onQueryChanged: dynamic Function(String) +searchController: SearchController? @@ -1398,9 +1480,9 @@ - + - + dynamic Function(String) @@ -1409,16 +1491,16 @@ - - + + - + SearchController - + +setText: void Function(String) @@ -1427,203 +1509,103 @@ - + - + void Function(String) - - - - - - - - - ConstrainedWidthFlexible - - - - - - +minWidth: double - +maxWidth: double - +flex: int - +flexSum: int - +child: Widget - +outerConstraints: BoxConstraints - - - - - - +Widget build() - -double _getWidth() - - - - - - - - - - - BoxConstraints - - - - - - - - - - - - - AsyncValueWidget - - - - - - +value: AsyncValue<T> - +data: Widget Function(T) - +error: Widget Function(Object, StackTrace?)? - +loading: Widget Function()? - +empty: Widget Function()? - - - - - - +Widget build() - -Widget _buildDataOrEmptyWidget() - -Widget _defaultError() - -Widget _defaultLoad() - - - - - - - - - - - Widget Function(T) - - - - - - - + + + + - - - Widget Function(Object, StackTrace?)? + + + FormScaffold - - - - - - - - Widget Function()? + + + +formViewModel: T + +actions: List<Widget>? + +body: Widget + +drawer: Widget? + +actionsSpacing: double + +actionsPadding: double - - - - - - - - - ActionPopUpMenuButton - - - - - - +actions: List<ModelAction<dynamic>> - +triggerIconColor: Color? - +triggerIconColorHover: Color? - +triggerIconSize: double - +disableSplashEffect: bool - +hideOnEmpty: bool - +orientation: Axis - +elevation: double? - +splashRadius: double? - +enabled: bool - +position: PopupMenuPosition - - + + + - - - +Widget build() - -Widget _buildPopupMenu() + + + Widget - - - + + + + + - - - Color + + + ConstrainedWidthFlexible - - - - + + + +minWidth: double + +maxWidth: double + +flex: int + +flexSum: int + +child: Widget + +outerConstraints: BoxConstraints + + - - - Axis + + + +Widget build() + -double _getWidth() - - - + + + - - - PopupMenuPosition + + + BoxConstraints - - + + - + PrimaryButton - + +text: String +icon: IconData? @@ -1641,11 +1623,22 @@ + + + + + + + IconData + + + + - + - + void Function()? @@ -1654,9 +1647,9 @@ - + - + dynamic Function()? @@ -1665,9 +1658,9 @@ - + - + EdgeInsets @@ -1676,299 +1669,482 @@ - + - + Size - - - - + + + + - - - Hyperlink + + + FormTableRow - - - +text: String - +url: String? - +onClick: void Function()? - +linkColor: Color - +hoverColor: Color? - +visitedColor: Color? - +style: TextStyle? - +hoverStyle: TextStyle? - +visitedStyle: TextStyle? - +icon: IconData? - +iconSize: double? + + + +label: String? + +labelBuilder: Widget Function(BuildContext)? + +labelStyle: TextStyle? + +labelHelpText: String? + +input: Widget + +control: AbstractControl<dynamic>? + +layout: FormTableRowLayout? - - - + + + - - - TextStyle + + + Widget Function(BuildContext)? + + + + + + + + + + + + FormTableRowLayout + + + + + + +index: int + <static>+values: List<FormTableRowLayout> + <static>+vertical: FormTableRowLayout + <static>+horizontal: FormTableRowLayout + + + + + + + + + + + + + FormTableLayout + + + + + + +rows: List<FormTableRow> + +columnWidths: Map<int, TableColumnWidth> + +rowDivider: Widget? + +rowLayout: FormTableRowLayout? + +rowLabelStyle: TextStyle? + + + + + + +Widget build() + + + + + + + + + + + + + FormSectionHeader + + + + + + +title: String + +titleTextStyle: TextStyle? + +helpText: String? + +divider: bool + +helpTextDisabled: bool + + + + + + +Widget build() + + + + + + + + + + + + + FormLabel + + + + + + +labelText: String? + +helpText: String? + +labelTextStyle: TextStyle? + +layout: FormTableRowLayout? + + + + + + +Widget build() + + + + + + + + + + + Enum - - - + + + - + DismissButton - + +onPressed: void Function()? +text: String? - + +Widget build() - - - - + + + + + - - - FormTableRow + + + Badge - - - +label: String? - +labelBuilder: Widget Function(BuildContext)? - +labelStyle: TextStyle? - +labelHelpText: String? - +input: Widget - +control: AbstractControl<dynamic>? - +layout: FormTableRowLayout? + + + +icon: IconData? + +color: Color? + +borderRadius: double + +label: String + +type: BadgeType + +padding: EdgeInsets + +iconSize: double? + +labelStyle: TextStyle? + +center: bool + + + + + + +Widget build() + -Color? _getBackgroundColor() + -Color _getBorderColor() + -Color? _getLabelColor() + + + + + + + + + + + + BadgeType + + + + + + +index: int + <static>+values: List<BadgeType> + <static>+filled: BadgeType + <static>+outlined: BadgeType + <static>+outlineFill: BadgeType + <static>+plain: BadgeType + + + + + + + + + + + + + StandardDialog + + + + + + +title: Widget? + +titleText: String? + +body: Widget + +actionButtons: List<Widget> + +backgroundColor: Color? + +borderRadius: double? + +width: double? + +height: double? + +minWidth: double + +minHeight: double + +maxWidth: double? + +maxHeight: double? + +padding: EdgeInsets + + + + + + +Widget build() - - - + + + + - - - Widget Function(BuildContext)? + + + ISyncIndicatorViewModel - - - - - - - - AbstractControl + + + +isDirty: bool + +lastSynced: DateTime? - - - - + + + + - - - FormTableRowLayout + + + SyncIndicator - - - +index: int - <static>+values: List<FormTableRowLayout> - <static>+vertical: FormTableRowLayout - <static>+horizontal: FormTableRowLayout + + + +state: AsyncValue<T> + +lastSynced: DateTime? + +isDirty: bool + +animationDuration: int + +iconSize: double - - - - - - - - - FormTableLayout - - + + + + - - - +rows: List<FormTableRow> - +columnWidths: Map<int, TableColumnWidth> - +rowDivider: Widget? - +rowLayout: FormTableRowLayout? - +rowLabelStyle: TextStyle? + + + IWithBanner - - - +Widget build() + + + +Widget? banner() - - - - - - - - - FormSectionHeader - - + + + + - - - +title: String - +titleTextStyle: TextStyle? - +helpText: String? - +divider: bool - +helpTextDisabled: bool + + + BannerBox - - - +Widget build() + + + +prefixIcon: Widget? + +body: Widget + +style: BannerStyle + +padding: EdgeInsets? + +noPrefix: bool + +dismissable: bool + +isDismissed: bool? + +onDismissed: dynamic Function()? + +dismissIconSize: double - - - - - + + + + - - - FormLabel + + + BannerStyle - - - +labelText: String? - +helpText: String? - +labelTextStyle: TextStyle? - +layout: FormTableRowLayout? + + + +index: int + <static>+values: List<BannerStyle> + <static>+warning: BannerStyle + <static>+info: BannerStyle + <static>+error: BannerStyle - - - +Widget build() + + + + + + + + + + ActionMenuInline - - - - + + + +actions: List<ModelAction<dynamic>> + +iconSize: double? + +visible: bool + +splashRadius: double? + +paddingVertical: double? + +paddingHorizontal: double? + + - - - Enum + + + +Widget build() - - - - + + + + - - - ActionMenuType + + + Collapsible - - - +index: int - <static>+values: List<ActionMenuType> - <static>+inline: ActionMenuType - <static>+popup: ActionMenuType + + + +contentBuilder: Widget Function(BuildContext, bool) + +headerBuilder: Widget Function(BuildContext, bool)? + +title: String? + +isCollapsed: bool - - - + + + - - - ReactiveCustomColorPicker + + + Widget Function(BuildContext, bool) - - - + + + - - - ReactiveFormField + + + Widget Function(BuildContext, bool)? - - + + - + NavbarTab - + +title: String +intent: RoutingIntent? @@ -1980,9 +2156,9 @@ - + - + RoutingIntent @@ -1991,16 +2167,16 @@ - - + + - + TabbedNavbar - + +tabs: List<T> +selectedTab: T? @@ -2022,9 +2198,9 @@ - + - + BoxDecoration @@ -2033,9 +2209,9 @@ - + - + void Function(int, T)? @@ -2044,181 +2220,218 @@ - + - + TabBarIndicatorSize - - - - + + + + - - - Collapsible + + + SidesheetTab - - - +contentBuilder: Widget Function(BuildContext, bool) - +headerBuilder: Widget Function(BuildContext, bool)? - +title: String? - +isCollapsed: bool + + + +builder: Widget Function(BuildContext) - - - + + + - - - Widget Function(BuildContext, bool) + + + Widget Function(BuildContext) - - - + + + + - - - Widget Function(BuildContext, bool)? + + + Sidesheet + + + + + + <static>+kDefaultWidth: double + +titleText: String + +body: Widget? + +tabs: List<SidesheetTab>? + +actionButtons: List<Widget>? + +width: double? + +withCloseButton: bool + +ignoreAppBar: bool + +collapseSingleTab: bool + +bodyPadding: EdgeInsets? + +wrapContent: Widget Function(Widget)? - - - - - + + + - - - StudyULogo + + + Widget Function(Widget)? - - - +onTap: void Function()? + + + + + + + + + FormSideSheetTab - - - +Widget build() + + + +formViewBuilder: Widget Function(T) - - - - + + + + + + + + + HelpIcon + + + + + + +tooltipText: String? + + + + + + +Widget build() + + + + + + + + + + + + + EmptyBody + + - - - FormSideSheetTab + + + +icon: IconData? + +leading: Widget? + +leadingSpacing: double? + +title: String? + +description: String? + +button: Widget? - - - +formViewBuilder: Widget Function(T) + + + +Widget build() - - - - + + + + + - - - SidesheetTab + + + IndicatorRangeSliderThumbShape - - - +builder: Widget Function(BuildContext) + + + +buildContext: BuildContext + +start: T + +end: T - - - - - - - - Widget Function(BuildContext) + + + +Size getPreferredSize() + +void paint() - - - - - - - - Sidesheet - - + + + - - - <static>+kDefaultWidth: double - +titleText: String - +body: Widget? - +tabs: List<SidesheetTab>? - +actionButtons: List<Widget>? - +width: double? - +withCloseButton: bool - +ignoreAppBar: bool - +collapseSingleTab: bool - +bodyPadding: EdgeInsets? - +wrapContent: Widget Function(Widget)? + + + BuildContext - - - + + + - - - Widget Function(Widget)? + + + RangeSliderThumbShape - - + + - + MouseEventsRegion - + +onTap: void Function()? +onHover: void Function(PointerHoverEvent)? @@ -2234,9 +2447,9 @@ - + - + void Function(PointerHoverEvent)? @@ -2245,9 +2458,9 @@ - + - + void Function(PointerEnterEvent)? @@ -2256,9 +2469,9 @@ - + - + void Function(PointerExitEvent)? @@ -2267,361 +2480,280 @@ - + - + SystemMouseCursor - - - - - - - - - FormControlLabel - - - - - - +formControl: AbstractControl<dynamic> - +text: String - +isClickable: bool - +textStyle: TextStyle? - +onClick: void Function(AbstractControl<dynamic>)? - - + + + - - - +Widget build() + + + ReactiveCustomColorPicker - - - + + + - - - void Function(AbstractControl<dynamic>)? + + + ReactiveFormField - - - - - - - - IWithBanner - - + + + + + - - - +Widget? banner() + + + TextParagraph - - - - - - - - - BannerBox + + + +text: String? + +style: TextStyle? + +selectable: bool + +span: List<TextSpan>? - - - +prefixIcon: Widget? - +body: Widget - +style: BannerStyle - +padding: EdgeInsets? - +noPrefix: bool - +dismissable: bool - +isDismissed: bool? - +onDismissed: dynamic Function()? - +dismissIconSize: double + + + +Widget build() - - - - + + + + - - - BannerStyle + + + UnderConstruction - - - +index: int - <static>+values: List<BannerStyle> - <static>+warning: BannerStyle - <static>+info: BannerStyle - <static>+error: BannerStyle + + + +Widget build() - - - - - - - - - SecondaryButton - - - - - - +text: String - +icon: IconData? - +isLoading: bool - +onPressed: void Function()? - - + + + - - - +Widget build() + + + NullHelperDecoration - - - - - - - - - IconPack - - - - - - <static>+defaultPack: List<IconOption> - <static>+material: List<IconOption> - - + + + - - - <static>+IconOption? resolveIconByName() + + + InputDecoration - - - - - - - - - IconOption - - + + + + - - - +name: String - +icon: IconData? - +isEmpty: bool - +props: List<Object?> + + + ActionMenuType - - - +String toJson() - <static>+IconOption fromJson() + + + +index: int + <static>+values: List<ActionMenuType> + <static>+inline: ActionMenuType + <static>+popup: ActionMenuType - - - + + + + + - - - Equatable + + + HtmlStylingBanner - - - - - - - - ReactiveIconPicker + + + +isDismissed: bool + +onDismissed: dynamic Function()? - - - - - - - - ReactiveFocusableFormField + + + +Widget build() - - - - - - - - - IconPicker - - + + + + - - - +iconOptions: List<IconOption> - +selectedOption: IconOption? - +onSelect: void Function(IconOption)? - +galleryIconSize: double? - +selectedIconSize: double? - +focusNode: FocusNode? - +isDisabled: bool + + + FormConsumerWidget - - - +Widget build() + + + +Widget build() - - - + + + + - - - void Function(IconOption)? + + + FormConsumerRefWidget + + + + + + +Widget build() - - - + + + + - - - FocusNode + + + SplashPage + + + + + + +Widget build() - - - - - + + + + + - - - IconPickerField + + + ErrorPage - - - +iconOptions: List<IconOption> - +selectedOption: IconOption? - +selectedIconSize: double? - +galleryIconSize: double? - +onSelect: void Function(IconOption)? - +focusNode: FocusNode? - +isDisabled: bool + + + +error: Exception? - - - +Widget build() + + + +Widget build() - - - - - + + + - - - IconPickerGallery + + + ConsumerWidget - - - +iconOptions: List<IconOption> - +onSelect: void Function(IconOption)? - +iconSize: double + + + + + + + + + + StudyULogo - - - +Widget build() + + + +onTap: void Function()? + + + + + + +Widget build() - - - + + + - + SingleColumnLayout - + <static>+defaultConstraints: BoxConstraints <static>+defaultConstraintsNarrow: BoxConstraints @@ -2634,7 +2766,7 @@ - + <static>+dynamic fromType() @@ -2643,16 +2775,16 @@ - - + + - + SingleColumnLayoutType - + +index: int <static>+values: List<SingleColumnLayoutType> @@ -2664,140 +2796,46 @@ - - - - - - - - FormConsumerWidget - - - - - - +Widget build() - - - - - - - - - - - - FormConsumerRefWidget - - - - - - +Widget build() - - - - - - - - - - - - FormScaffold - - - - - - +formViewModel: T - +actions: List<Widget>? - +body: Widget - +drawer: Widget? - +actionsSpacing: double - +actionsPadding: double - - - - - - - - - - - - - StandardDialog - - - - - - +title: Widget? - +titleText: String? - +body: Widget - +actionButtons: List<Widget> - +backgroundColor: Color? - +borderRadius: double? - +width: double? - +height: double? - +minWidth: double - +minHeight: double - +maxWidth: double? - +maxHeight: double? - +padding: EdgeInsets - - - - - - +Widget build() - - - - - - - - - - - - - HtmlStylingBanner - - + + + + - - - +isDismissed: bool - +onDismissed: dynamic Function()? + + + Hyperlink - - - +Widget build() + + + +text: String + +url: String? + +onClick: void Function()? + +linkColor: Color + +hoverColor: Color? + +visitedColor: Color? + +style: TextStyle? + +hoverStyle: TextStyle? + +visitedStyle: TextStyle? + +icon: IconData? + +iconSize: double? - - + + - + StandardTableColumn - + +label: String +tooltip: String? @@ -2811,9 +2849,9 @@ - + - + TableColumnWidth @@ -2822,16 +2860,16 @@ - - + + - + StandardTable - + +items: List<T> +inputColumns: List<StandardTableColumn> @@ -2847,24 +2885,25 @@ +cellSpacing: double +rowSpacing: double +minRowHeight: double? - +showTableHeader: bool - +hideLeadingTrailingWhenEmpty: bool - +leadingWidget: Widget? - +trailingWidget: Widget? - +leadingWidgetSpacing: double? - +trailingWidgetSpacing: double? - +emptyWidget: Widget? - +rowStyle: StandardTableStyle - +disableRowInteractions: bool + +headerMaxLines: int + +showTableHeader: bool + +hideLeadingTrailingWhenEmpty: bool + +leadingWidget: Widget? + +trailingWidget: Widget? + +leadingWidgetSpacing: double? + +trailingWidgetSpacing: double? + +emptyWidget: Widget? + +rowStyle: StandardTableStyle + +disableRowInteractions: bool - + - + void Function(T) @@ -2873,9 +2912,9 @@ - + - + List<ModelAction<dynamic>> Function(T, int)? @@ -2884,353 +2923,316 @@ - - - - - int Function(T, T)? - - - - - - - - - - - TableRow Function(BuildContext, List<StandardTableColumn>)? - - - - - - - - - - - - StandardTableStyle - - - - - - +index: int - <static>+values: List<StandardTableStyle> - <static>+plain: StandardTableStyle - <static>+material: StandardTableStyle - - - - - - - - - - - - TwoColumnLayout - - - - - - <static>+defaultDivider: VerticalDivider - <static>+defaultContentPadding: EdgeInsets - <static>+slimContentPadding: EdgeInsets - +leftWidget: Widget - +rightWidget: Widget - +dividerWidget: Widget? - +headerWidget: Widget? - +flexLeft: int? - +flexRight: int? - +constraintsLeft: BoxConstraints? - +constraintsRight: BoxConstraints? - +scrollLeft: bool - +scrollRight: bool - +paddingLeft: EdgeInsets? - +paddingRight: EdgeInsets? - +backgroundColorLeft: Color? - +backgroundColorRight: Color? - +stretchHeight: bool - - - - - - - - - - - VerticalDivider + + + + + int Function(T, T)? - - - - - + + + - - - ActionMenuInline + + + TableRow Function(BuildContext, List<StandardTableColumn>)? - - - +actions: List<ModelAction<dynamic>> - +iconSize: double? - +visible: bool - +splashRadius: double? - +paddingVertical: double? - +paddingHorizontal: double? + + + + + + + + + StandardTableStyle - - - +Widget build() + + + +index: int + <static>+values: List<StandardTableStyle> + <static>+plain: StandardTableStyle + <static>+material: StandardTableStyle - - - - - + + + + + - - - TextParagraph + + + IconPack - - - +text: String? - +style: TextStyle? - +selectable: bool - +span: List<TextSpan>? + + + <static>+defaultPack: List<IconOption> + <static>+material: List<IconOption> - - - +Widget build() + + + <static>+IconOption? resolveIconByName() - - - - + + + + + - - - SplashPage + + + IconOption - - - +Widget build() + + + +name: String + +icon: IconData? + +isEmpty: bool + +props: List<Object?> - - - - - - - - - - ErrorPage + + + +String toJson() + <static>+IconOption fromJson() - - - +error: Exception? + + + + + + + + Equatable - - - +Widget build() + + + + + + + + ReactiveIconPicker - - - + + + - - - ConsumerWidget + + + ReactiveFocusableFormField - - - - - + + + + + - - - Badge + + + IconPicker - - - +icon: IconData? - +color: Color? - +borderRadius: double - +label: String - +type: BadgeType - +padding: EdgeInsets - +iconSize: double? - +labelStyle: TextStyle? - +center: bool + + + +iconOptions: List<IconOption> + +selectedOption: IconOption? + +onSelect: void Function(IconOption)? + +galleryIconSize: double? + +selectedIconSize: double? + +focusNode: FocusNode? + +isDisabled: bool - - - +Widget build() - -Color? _getBackgroundColor() - -Color _getBorderColor() - -Color? _getLabelColor() + + + +Widget build() - - - - + + + - - - BadgeType + + + void Function(IconOption)? - - - +index: int - <static>+values: List<BadgeType> - <static>+filled: BadgeType - <static>+outlined: BadgeType - <static>+outlineFill: BadgeType - <static>+plain: BadgeType + + + + + + + + FocusNode - - - - - + + + + + - - - IndicatorRangeSliderThumbShape + + + IconPickerField - - - +buildContext: BuildContext - +start: T - +end: T + + + +iconOptions: List<IconOption> + +selectedOption: IconOption? + +selectedIconSize: double? + +galleryIconSize: double? + +onSelect: void Function(IconOption)? + +focusNode: FocusNode? + +isDisabled: bool - - - +Size getPreferredSize() - +void paint() + + + +Widget build() - - - + + + + + - - - BuildContext + + + IconPickerGallery - - - - + + + +iconOptions: List<IconOption> + +onSelect: void Function(IconOption)? + +iconSize: double + + - - - RangeSliderThumbShape + + + +Widget build() - - - - - + + + + + - - - HelpIcon + + + SecondaryButton - - - +tooltipText: String? + + + +text: String + +icon: IconData? + +isLoading: bool + +onPressed: void Function()? - - - +Widget build() + + + +Widget build() - - - - + + + + - - - UnderConstruction + + + TwoColumnLayout - - - +Widget build() + + + <static>+defaultDivider: VerticalDivider + <static>+defaultContentPadding: EdgeInsets + <static>+slimContentPadding: EdgeInsets + +leftWidget: Widget + +rightWidget: Widget + +dividerWidget: Widget? + +headerWidget: Widget? + +flexLeft: int? + +flexRight: int? + +constraintsLeft: BoxConstraints? + +constraintsRight: BoxConstraints? + +scrollLeft: bool + +scrollRight: bool + +paddingLeft: EdgeInsets? + +paddingRight: EdgeInsets? + +backgroundColorLeft: Color? + +backgroundColorRight: Color? + +stretchHeight: bool + + + + + + + + + + + VerticalDivider diff --git a/docs/uml/designer_v2/lib/features/monitor/uml.svg b/docs/uml/designer_v2/lib/features/monitor/uml.svg index a3d10873a..598d7fc1a 100644 --- a/docs/uml/designer_v2/lib/features/monitor/uml.svg +++ b/docs/uml/designer_v2/lib/features/monitor/uml.svg @@ -1,50 +1,323 @@ - - [StudyMonitorScreen + + [ParticipantDetailsFormView + | + +formViewModel: ParticipantDetailsFormViewModel | +Widget build() ] + [ParticipantDetailsFormView]o-[ParticipantDetailsFormViewModel] + [<abstract>FormConsumerWidget]<:-[ParticipantDetailsFormView] + + [StudyMonitorScreen + | + +Widget build(); + -Widget _monitorSectionHeader(); + -Widget _buildStat(); + -dynamic _onSelectParticipant() + ] + [<abstract>StudyPageWidget]<:-[StudyMonitorScreen] + [StudyMonitorItem + | + +participantId: String; + +inviteCode: String?; + +enrolledAt: DateTime; + +lastActivityAt: DateTime; + +currentDayOfStudy: int; + +studyDurationInDays: int; + +completedInterventions: int; + +missedInterventions: int; + +completedSurveys: int; + +missedSurveys: int; + +rawData: String; + +props: List<Object?> + | + <static>+List<StudyMonitorItem> fromStudy() + ] + + [<abstract>Equatable]<:-[StudyMonitorItem] + + [StudyMonitorTable + | + +studyMonitorItems: List<StudyMonitorItem>; + +onSelectItem: void Function(StudyMonitorItem) + | + +Widget build(); + -List<Widget> _buildRow(); + -String _formatTime(); + -Widget _buildProgressCell() + ] + + [StudyMonitorTable]o-[void Function(StudyMonitorItem)] + + [ParticipantDetailsFormViewModel + | + +participantIdControl: FormControl<String>; + +rawDataControl: FormControl<String>; + +form: FormGroup; + +titles: Map<FormMode, String> + | + +void initControls(); + +StudyMonitorItem buildFormData(); + +void setControlsFrom() + ] + + [ParticipantDetailsFormViewModel]o-[FormControl] + [ParticipantDetailsFormViewModel]o-[FormGroup] + [<abstract>FormViewModel]<:-[ParticipantDetailsFormViewModel] + - + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ParticipantDetailsFormView + + + + + + +formViewModel: ParticipantDetailsFormViewModel + + + + + + +Widget build() + + + + + + + + + + + + + ParticipantDetailsFormViewModel + + + + + + +participantIdControl: FormControl<String> + +rawDataControl: FormControl<String> + +form: FormGroup + +titles: Map<FormMode, String> + + + + + + +void initControls() + +StudyMonitorItem buildFormData() + +void setControlsFrom() + + + + + + + + + + + FormConsumerWidget + + + + - - + + - + - StudyMonitorScreen + StudyMonitorScreen - + +Widget build() + -Widget _monitorSectionHeader() + -Widget _buildStat() + -dynamic _onSelectParticipant() - + - + StudyPageWidget + + + + + + + + + StudyMonitorItem + + + + + + +participantId: String + +inviteCode: String? + +enrolledAt: DateTime + +lastActivityAt: DateTime + +currentDayOfStudy: int + +studyDurationInDays: int + +completedInterventions: int + +missedInterventions: int + +completedSurveys: int + +missedSurveys: int + +rawData: String + +props: List<Object?> + + + + + + <static>+List<StudyMonitorItem> fromStudy() + + + + + + + + + + + Equatable + + + + + + + + + + + + + StudyMonitorTable + + + + + + +studyMonitorItems: List<StudyMonitorItem> + +onSelectItem: void Function(StudyMonitorItem) + + + + + + +Widget build() + -List<Widget> _buildRow() + -String _formatTime() + -Widget _buildProgressCell() + + + + + + + + + + + void Function(StudyMonitorItem) + + + + + + + + + + + FormControl + + + + + + + + + + + FormGroup + + + + + + + + + + + FormViewModel + + + + diff --git a/docs/uml/designer_v2/lib/features/uml.svg b/docs/uml/designer_v2/lib/features/uml.svg index 9ad270e1a..a6d29463e 100644 --- a/docs/uml/designer_v2/lib/features/uml.svg +++ b/docs/uml/designer_v2/lib/features/uml.svg @@ -1,5 +1,122 @@ - - [SignupForm + + [<abstract>IAppDelegate + | + +dynamic onAppStart() + ] + + [AppController + | + +sharedPreferences: SharedPreferences; + +appDelegates: List<IAppDelegate>; + -_delayedFuture: dynamic; + +isInitialized: dynamic + | + +dynamic onAppStart(); + -dynamic _callDelegates() + ] + + [AppController]o-[SharedPreferences] + + [ParticipantDetailsFormView + | + +formViewModel: ParticipantDetailsFormViewModel + | + +Widget build() + ] + + [ParticipantDetailsFormView]o-[ParticipantDetailsFormViewModel] + [<abstract>FormConsumerWidget]<:-[ParticipantDetailsFormView] + + [StudyMonitorScreen + | + +Widget build(); + -Widget _monitorSectionHeader(); + -Widget _buildStat(); + -dynamic _onSelectParticipant() + ] + + [<abstract>StudyPageWidget]<:-[StudyMonitorScreen] + + [StudyMonitorItem + | + +participantId: String; + +inviteCode: String?; + +enrolledAt: DateTime; + +lastActivityAt: DateTime; + +currentDayOfStudy: int; + +studyDurationInDays: int; + +completedInterventions: int; + +missedInterventions: int; + +completedSurveys: int; + +missedSurveys: int; + +rawData: String; + +props: List<Object?> + | + <static>+List<StudyMonitorItem> fromStudy() + ] + + [<abstract>Equatable]<:-[StudyMonitorItem] + + [StudyMonitorTable + | + +studyMonitorItems: List<StudyMonitorItem>; + +onSelectItem: void Function(StudyMonitorItem) + | + +Widget build(); + -List<Widget> _buildRow(); + -String _formatTime(); + -Widget _buildProgressCell() + ] + + [StudyMonitorTable]o-[void Function(StudyMonitorItem)] + + [ParticipantDetailsFormViewModel + | + +participantIdControl: FormControl<String>; + +rawDataControl: FormControl<String>; + +form: FormGroup; + +titles: Map<FormMode, String> + | + +void initControls(); + +StudyMonitorItem buildFormData(); + +void setControlsFrom() + ] + + [ParticipantDetailsFormViewModel]o-[FormControl] + [ParticipantDetailsFormViewModel]o-[FormGroup] + [<abstract>FormViewModel]<:-[ParticipantDetailsFormViewModel] + + [LoginForm + | + +formKey: AuthFormKey + | + +Widget build() + ] + + [LoginForm]o-[AuthFormKey] + [<abstract>FormConsumerRefWidget]<:-[LoginForm] + + [PasswordRecoveryForm + | + +formKey: AuthFormKey + | + +Widget build() + ] + + [PasswordRecoveryForm]o-[AuthFormKey] + [<abstract>FormConsumerRefWidget]<:-[PasswordRecoveryForm] + + [PasswordForgotForm + | + +formKey: AuthFormKey + | + +Widget build() + ] + + [PasswordForgotForm]o-[AuthFormKey] + [<abstract>FormConsumerRefWidget]<:-[PasswordForgotForm] + + [SignupForm | +formKey: AuthFormKey | @@ -11,6 +128,46 @@ [SignupForm]o-[AuthFormKey] [<abstract>FormConsumerRefWidget]<:-[SignupForm] + [AuthScaffold + | + +body: Widget; + +formKey: AuthFormKey; + +leftContentMinWidth: double; + +leftPanelMinWidth: double; + +leftPanelPadding: EdgeInsets + ] + + [AuthScaffold]o-[<abstract>Widget] + [AuthScaffold]o-[AuthFormKey] + [AuthScaffold]o-[EdgeInsets] + + [EmailTextField + | + +labelText: String; + +hintText: String?; + +formControlName: String?; + +formControl: FormControl<dynamic>? + ] + + [EmailTextField]o-[FormControl] + + [PasswordTextField + | + +labelText: String; + +hintText: String?; + +onSubmitted: dynamic Function(FormControl<dynamic>)?; + +formControlName: String?; + +formControl: FormControl<dynamic>? + ] + + [PasswordTextField]o-[dynamic Function(FormControl<dynamic>)?] + [PasswordTextField]o-[FormControl] + + [StudyUJobsToBeDone + | + +Widget build() + ] + [AuthFormController | +authRepository: IAuthRepository; @@ -76,332 +233,380 @@ [AuthFormKey]o-[AuthFormKey] [Enum]<:--[AuthFormKey] - [PasswordForgotForm - | - +formKey: AuthFormKey + [AppStatus | - +Widget build() + +index: int; + <static>+values: List<AppStatus>; + <static>+initializing: AppStatus; + <static>+initialized: AppStatus ] - [PasswordForgotForm]o-[AuthFormKey] - [<abstract>FormConsumerRefWidget]<:-[PasswordForgotForm] + [AppStatus]o-[AppStatus] + [Enum]<:--[AppStatus] - [EmailTextField + [FormArrayTable | - +labelText: String; - +hintText: String?; - +formControlName: String?; - +formControl: FormControl<dynamic>? + +control: AbstractControl<dynamic>; + +items: List<T>; + +onSelectItem: void Function(T); + +getActionsAt: List<ModelAction<dynamic>> Function(T, int); + +onNewItem: void Function()?; + +rowTitle: String Function(T); + +onNewItemLabel: String; + +sectionTitle: String?; + +sectionDescription: String?; + +emptyIcon: IconData?; + +emptyTitle: String?; + +emptyDescription: String?; + +sectionTitleDivider: bool?; + +rowPrefix: Widget Function(BuildContext, T, int)?; + +rowSuffix: Widget Function(BuildContext, T, int)?; + +leadingWidget: Widget?; + +itemsSectionPadding: EdgeInsets?; + +hideLeadingTrailingWhenEmpty: bool; + <static>+columns: List<StandardTableColumn> + | + +Widget build(); + -List<Widget> _buildRow(); + -Widget _newItemButton() ] - [EmailTextField]o-[FormControl] + [FormArrayTable]o-[<abstract>AbstractControl] + [FormArrayTable]o-[void Function(T)] + [FormArrayTable]o-[List<ModelAction<dynamic>> Function(T, int)] + [FormArrayTable]o-[void Function()?] + [FormArrayTable]o-[String Function(T)] + [FormArrayTable]o-[IconData] + [FormArrayTable]o-[Widget Function(BuildContext, T, int)?] + [FormArrayTable]o-[<abstract>Widget] + [FormArrayTable]o-[EdgeInsets] - [PasswordTextField + [<abstract>ManagedFormViewModel | - +labelText: String; - +hintText: String?; - +onSubmitted: dynamic Function(FormControl<dynamic>)?; - +formControlName: String?; - +formControl: FormControl<dynamic>? + +ManagedFormViewModel<T> createDuplicate() ] - [PasswordTextField]o-[dynamic Function(FormControl<dynamic>)?] - [PasswordTextField]o-[FormControl] + [<abstract>FormViewModel]<:-[<abstract>ManagedFormViewModel] - [PasswordRecoveryForm + [FormViewModelNotFoundException + ] + + [Exception]<:--[FormViewModelNotFoundException] + + [FormViewModelCollection | - +formKey: AuthFormKey + +formViewModels: List<T>; + +formArray: FormArray<dynamic>; + +stagedViewModels: List<T>; + +retrievableViewModels: List<T>; + +formData: List<D> | - +Widget build() + +void add(); + +T remove(); + +T? findWhere(); + +T? removeWhere(); + +bool contains(); + +void stage(); + +T commit(); + +void reset(); + +void read() ] - [PasswordRecoveryForm]o-[AuthFormKey] - [<abstract>FormConsumerRefWidget]<:-[PasswordRecoveryForm] + [FormViewModelCollection]o-[FormArray] - [AuthScaffold + [CustomFormControl | - +body: Widget; - +formKey: AuthFormKey; - +leftContentMinWidth: double; - +leftPanelMinWidth: double; - +leftPanelPadding: EdgeInsets + -_onValueChangedDebouncer: Debouncer?; + -_onStatusChangedDebouncer: Debouncer?; + +onValueChanged: void Function(T?)?; + +onStatusChanged: void Function(ControlStatus)?; + +onStatusChangedDebounceTime: int?; + +onValueChangedDebounceTime: int? + | + +void dispose() ] - [AuthScaffold]o-[<abstract>Widget] - [AuthScaffold]o-[AuthFormKey] - [AuthScaffold]o-[EdgeInsets] + [CustomFormControl]o-[Debouncer] + [CustomFormControl]o-[void Function(T?)?] + [CustomFormControl]o-[void Function(ControlStatus)?] + [FormControl]<:-[CustomFormControl] - [StudyUJobsToBeDone + [UnsavedChangesDialog | +Widget build() ] - [LoginForm + [<abstract>FormValidationSetEnum + ] + + [FormControlValidation | - +formKey: AuthFormKey + +control: AbstractControl<dynamic>; + +validators: List<Validator<dynamic>>; + +asyncValidators: List<AsyncValidator<dynamic>>?; + +validationMessages: Map<String, String Function(Object)> | - +Widget build() + +FormControlValidation merge() ] - [LoginForm]o-[AuthFormKey] - [<abstract>FormConsumerRefWidget]<:-[LoginForm] + [FormControlValidation]o-[<abstract>AbstractControl] - [<abstract>IAppDelegate + [<abstract>IFormData | - +dynamic onAppStart() + +id: String + | + +IFormData copy() ] - [AppController - | - +sharedPreferences: SharedPreferences; - +appDelegates: List<IAppDelegate>; - -_delayedFuture: dynamic; - +isInitialized: dynamic - | - +dynamic onAppStart(); - -dynamic _callDelegates() + [FormInvalidException ] - [AppController]o-[SharedPreferences] + [Exception]<:--[FormInvalidException] - [App + [FormConfigException + | + +message: String? ] - [AppContent - ] + [Exception]<:--[FormConfigException] - [AppStatus + [<abstract>IFormViewModelDelegate | - +index: int; - <static>+values: List<AppStatus>; - <static>+initializing: AppStatus; - <static>+initialized: AppStatus + +dynamic onSave(); + +void onCancel() ] - [AppStatus]o-[AppStatus] - [Enum]<:--[AppStatus] - - [StudyAnalyzeScreen + [<abstract>IFormGroupController | - +Widget? banner(); - +Widget build() + +form: FormGroup ] - [<abstract>StudyPageWidget]<:-[StudyAnalyzeScreen] + [<abstract>IFormGroupController]o-[FormGroup] - [StudyAnalyzeController + [FormControlOption | - +dynamic onExport() + +value: T; + +label: String; + +description: String?; + +props: List<Object?> ] - [StudyBaseController]<:-[StudyAnalyzeController] + [<abstract>Equatable]<:-[FormControlOption] - [StudyParticipationBadge + [<abstract>FormViewModel | - +participation: Participation; - +type: BadgeType; - +showPrefixIcon: bool; - +center: bool + -_formData: T?; + -_formMode: FormMode; + -_validationSet: FormValidationSetEnum?; + +delegate: IFormViewModelDelegate<FormViewModel<dynamic>>?; + +autosave: bool; + -_immediateFormChildrenSubscriptions: List<StreamSubscription<dynamic>>; + -_immediateFormChildrenListenerDebouncer: Debouncer?; + -_autosaveOperation: CancelableOperation<dynamic>?; + -_defaultControlValidators: Map<String, Tuple<List<Validator<dynamic>>, List<AsyncValidator<dynamic>>>>; + +prevFormValue: Map<String, dynamic>?; + <static>-_formKey: String; + +formData: T?; + +formMode: FormMode; + +isReadonly: bool; + +validationSet: FormValidationSetEnum?; + +isDirty: bool; + +title: String; + +isValid: bool; + +titles: Map<FormMode, String>; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> | - +Widget build() + -dynamic _setFormData(); + -dynamic _rememberDefaultControlValidators(); + -Tuple<List<Validator<dynamic>>, List<AsyncValidator<dynamic>>>? _getDefaultValidators(); + -dynamic _disableAllControls(); + -dynamic _formModeUpdated(); + -dynamic _restoreControlsFromFormData(); + +void revalidate(); + -void _applyValidationSet(); + +void read(); + +dynamic save(); + +dynamic cancel(); + +void enableAutosave(); + +void listenToImmediateFormChildren(); + +dynamic markFormGroupChanged(); + +void dispose(); + +void setControlsFrom(); + +T buildFormData(); + +void initControls() ] - [StudyParticipationBadge]o-[Participation] - [StudyParticipationBadge]o-[BadgeType] + [<abstract>FormViewModel]o-[FormMode] + [<abstract>FormViewModel]o-[<abstract>FormValidationSetEnum] + [<abstract>FormViewModel]o-[<abstract>IFormViewModelDelegate] + [<abstract>FormViewModel]o-[Debouncer] + [<abstract>FormViewModel]o-[CancelableOperation] + [<abstract>IFormGroupController]<:--[<abstract>FormViewModel] - [PreviewFrame + [FormMode | - +studyId: String; - +routeArgs: StudyFormRouteArgs?; - +route: String? + +index: int; + <static>+values: List<FormMode>; + <static>+create: FormMode; + <static>+readonly: FormMode; + <static>+edit: FormMode ] - [PreviewFrame]o-[<abstract>StudyFormRouteArgs] + [FormMode]o-[FormMode] + [Enum]<:--[FormMode] - [FrameControlsWidget + [EnrolledBadge | - +onRefresh: void Function()?; - +onOpenNewTab: void Function()?; - +enabled: bool + +enrolledCount: int | +Widget build() ] - [FrameControlsWidget]o-[void Function()?] - [<abstract>ConsumerWidget]<:-[FrameControlsWidget] + [StudyRecruitController + | + +inviteCodeRepository: IInviteCodeRepository; + -_invitesSubscription: StreamSubscription<List<WrappedModel<StudyInvite>>>? + | + -dynamic _subscribeInvites(); + +Intervention? getIntervention(); + +int getParticipantCountForInvite(); + +List<ModelAction<dynamic>> availableActions(); + +List<ModelAction<dynamic>> availableInlineActions(); + +void dispose() + ] - [<abstract>IStudyNavViewModel + [StudyRecruitController]o-[<abstract>IInviteCodeRepository] + [StudyRecruitController]o-[StreamSubscription] + [StudyBaseController]<:-[StudyRecruitController] + [<abstract>IModelActionProvider]<:--[StudyRecruitController] + + [StudyRecruitScreen | - +isEditTabEnabled: bool; - +isTestTabEnabled: bool; - +isRecruitTabEnabled: bool; - +isMonitorTabEnabled: bool; - +isAnalyzeTabEnabled: bool; - +isSettingsEnabled: bool + +Widget build(); + -Widget _inviteCodesSectionHeader(); + -Widget _newInviteCodeButton(); + -dynamic _onSelectInvite() ] - [StudyNav + [<abstract>StudyPageWidget]<:-[StudyRecruitScreen] + + [InviteCodeFormView | - <static>+dynamic tabs(); - <static>+dynamic edit(); - <static>+dynamic test(); - <static>+dynamic recruit(); - <static>+dynamic monitor(); - <static>+dynamic analyze() + +formViewModel: InviteCodeFormViewModel + | + +Widget build(); + -List<FormTableRow> _conditionalInterventionRows() ] - [StudyDesignNav + [InviteCodeFormView]o-[InviteCodeFormViewModel] + [<abstract>FormConsumerWidget]<:-[InviteCodeFormView] + + [StudyInvitesTable | - <static>+dynamic tabs(); - <static>+dynamic info(); - <static>+dynamic enrollment(); - <static>+dynamic interventions(); - <static>+dynamic measurements(); - <static>+dynamic reports() + +invites: List<StudyInvite>; + +onSelect: void Function(StudyInvite); + +getActions: List<ModelAction<dynamic>> Function(StudyInvite); + +getInlineActions: List<ModelAction<dynamic>> Function(StudyInvite); + +getIntervention: Intervention? Function(String); + +getParticipantCountForInvite: int Function(StudyInvite) + | + +Widget build(); + -List<Widget> _buildRow() ] - [StudySettingsFormViewModel + [StudyInvitesTable]o-[void Function(StudyInvite)] + [StudyInvitesTable]o-[List<ModelAction<dynamic>> Function(StudyInvite)] + [StudyInvitesTable]o-[Intervention? Function(String)] + [StudyInvitesTable]o-[int Function(StudyInvite)] + + [InviteCodeFormViewModel | - +study: AsyncValue<Study>; - +studyRepository: IStudyRepository; - <static>+defaultPublishedToRegistry: bool; - <static>+defaultPublishedToRegistryResults: bool; - +isPublishedToRegistryControl: FormControl<bool>; - +isPublishedToRegistryResultsControl: FormControl<bool>; + +study: Study; + +inviteCodeRepository: IInviteCodeRepository; + +codeControl: FormControl<String>; + +codeControlValidationMessages: Map<String, String Function(dynamic)>; + +isPreconfiguredScheduleControl: FormControl<bool>; + +preconfiguredScheduleTypeControl: FormControl<PhaseSequence>; + +interventionAControl: FormControl<String>; + +interventionBControl: FormControl<String>; +form: FormGroup; - +titles: Map<FormMode, String> + +titles: Map<FormMode, String>; + +interventionControlOptions: List<FormControlOption<String>>; + +preconfiguredScheduleTypeOptions: List<FormControlOption<PhaseSequence>>; + +isPreconfiguredSchedule: bool; + +preconfiguredSchedule: List<String>? | + +void initControls(); + -dynamic _uniqueInviteCode(); + +void regenerateCode(); + -String _generateCode(); + +StudyInvite buildFormData(); +void setControlsFrom(); - +Study buildFormData(); - +dynamic keepControlsSynced(); - +dynamic save(); - +dynamic setLaunchDefaults() + +dynamic save() ] - [StudySettingsFormViewModel]o-[<abstract>AsyncValue] - [StudySettingsFormViewModel]o-[<abstract>IStudyRepository] - [StudySettingsFormViewModel]o-[FormControl] - [StudySettingsFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[StudySettingsFormViewModel] + [InviteCodeFormViewModel]o-[Study] + [InviteCodeFormViewModel]o-[<abstract>IInviteCodeRepository] + [InviteCodeFormViewModel]o-[FormControl] + [InviteCodeFormViewModel]o-[FormGroup] + [<abstract>FormViewModel]<:-[InviteCodeFormViewModel] - [StudySettingsDialog + [PublishSuccessDialog | +Widget build() ] - [<abstract>StudyPageWidget]<:-[StudySettingsDialog] + [<abstract>StudyPageWidget]<:-[PublishSuccessDialog] - [StudyTestScreen - | - +previewRoute: String? + [PublishDialog | - +Widget build(); - +Widget? banner(); - +dynamic load(); - +dynamic save(); - +dynamic showHelp() + +Widget build() ] - [<abstract>StudyPageWidget]<:-[StudyTestScreen] + [<abstract>StudyPageWidget]<:-[PublishDialog] - [StudyBaseController - | - +studyId: String; - +studyRepository: IStudyRepository; - +router: GoRouter; - +studySubscription: StreamSubscription<WrappedModel<Study>>? + [PublishConfirmationDialog | - +dynamic subscribeStudy(); - +dynamic onStudySubscriptionUpdate(); - +dynamic onStudySubscriptionError(); - +void dispose() + +Widget build() ] - [StudyBaseController]o-[<abstract>IStudyRepository] - [StudyBaseController]o-[GoRouter] - [StudyBaseController]o-[StreamSubscription] - - [StudyTestController - | - +authRepository: IAuthRepository; - +languageCode: String - ] - - [StudyTestController]o-[<abstract>IAuthRepository] - [StudyBaseController]<:-[StudyTestController] + [<abstract>StudyPageWidget]<:-[PublishConfirmationDialog] - [WebFrame + [FrameControlsWidget | - +previewSrc: String; - +studyId: String + +onRefresh: void Function()?; + +onOpenNewTab: void Function()?; + +enabled: bool | +Widget build() ] - [DisabledFrame - | - +Widget build() - ] + [FrameControlsWidget]o-[void Function()?] + [<abstract>ConsumerWidget]<:-[FrameControlsWidget] - [PhoneContainer - | - <static>+defaultWidth: double; - <static>+defaultHeight: double; - +width: double; - +height: double; - +borderColor: Color; - +borderWidth: double; - +borderRadius: double; - +innerContent: Widget; - +innerContentBackgroundColor: Color? + [<abstract>IStudyStatusBadgeViewModel | - +Widget build() + +studyParticipation: Participation?; + +studyStatus: StudyStatus? ] - [PhoneContainer]o-[Color] - [PhoneContainer]o-[<abstract>Widget] + [<abstract>IStudyStatusBadgeViewModel]o-[Participation] + [<abstract>IStudyStatusBadgeViewModel]o-[StudyStatus] - [MobileFrame + [StudyStatusBadge | - +Widget build() - ] - - [DesktopFrame + +participation: Participation?; + +status: StudyStatus?; + +type: BadgeType; + +showPrefixIcon: bool; + +showTooltip: bool | +Widget build() ] - [<abstract>IStudyAppBarViewModel - | - +isSyncIndicatorVisible: bool; - +isStatusBadgeVisible: bool; - +isPublishVisible: bool - ] - - [<abstract>IStudyStatusBadgeViewModel]<:--[<abstract>IStudyAppBarViewModel] - [<abstract>IStudyNavViewModel]<:--[<abstract>IStudyAppBarViewModel] - - [StudyScaffold - | - +studyId: String; - +tabs: List<NavbarTab>?; - +tabsSubnav: List<NavbarTab>?; - +selectedTab: NavbarTab?; - +selectedTabSubnav: NavbarTab?; - +body: StudyPageWidget; - +drawer: Widget?; - +disableActions: bool; - +actionsSpacing: double; - +actionsPadding: double; - +layoutType: SingleColumnLayoutType?; - +appbarHeight: double; - +appbarSubnavHeight: double - ] - - [StudyScaffold]o-[NavbarTab] - [StudyScaffold]o-[<abstract>StudyPageWidget] - [StudyScaffold]o-[<abstract>Widget] - [StudyScaffold]o-[SingleColumnLayoutType] + [StudyStatusBadge]o-[Participation] + [StudyStatusBadge]o-[StudyStatus] + [StudyStatusBadge]o-[BadgeType] [RouteInformation | @@ -465,50 +670,6 @@ [<abstract>PlatformController]<:-[MobileController] - [<abstract>IStudyStatusBadgeViewModel - | - +studyParticipation: Participation?; - +studyStatus: StudyStatus? - ] - - [<abstract>IStudyStatusBadgeViewModel]o-[Participation] - [<abstract>IStudyStatusBadgeViewModel]o-[StudyStatus] - - [StudyStatusBadge - | - +participation: Participation?; - +status: StudyStatus?; - +type: BadgeType; - +showPrefixIcon: bool; - +showTooltip: bool - | - +Widget build() - ] - - [StudyStatusBadge]o-[Participation] - [StudyStatusBadge]o-[StudyStatus] - [StudyStatusBadge]o-[BadgeType] - - [TestAppRoutes - | - <static>+studyOverview: String; - <static>+eligibility: String; - <static>+intervention: String; - <static>+consent: String; - <static>+journey: String; - <static>+dashboard: String - ] - - [<abstract>StudyPageWidget - | - +studyId: String - | - +Widget? banner() - ] - - [<abstract>ConsumerWidget]<:-[<abstract>StudyPageWidget] - [<abstract>IWithBanner]<:--[<abstract>StudyPageWidget] - [StudyController | +notificationService: INotificationService; @@ -529,1121 +690,1008 @@ [StudyController]o-[StreamSubscription] [StudyBaseController]<:-[StudyController] - [StudyMonitorScreen + [<abstract>IStudyNavViewModel | - +Widget build() + +isEditTabEnabled: bool; + +isTestTabEnabled: bool; + +isRecruitTabEnabled: bool; + +isMonitorTabEnabled: bool; + +isAnalyzeTabEnabled: bool; + +isSettingsEnabled: bool ] - [<abstract>StudyPageWidget]<:-[StudyMonitorScreen] - - [StudiesTableColumnHeader + [StudyNav | - +title: String; - +sortable: bool; - +sortAscending: bool; - +sortingActive: bool; - +onSort: void Function()? + <static>+dynamic tabs(); + <static>+dynamic edit(); + <static>+dynamic test(); + <static>+dynamic recruit(); + <static>+dynamic monitor(); + <static>+dynamic analyze() ] - [StudiesTableColumnHeader]o-[void Function()?] + [StudyDesignNav + | + <static>+dynamic tabs(); + <static>+dynamic info(); + <static>+dynamic enrollment(); + <static>+dynamic interventions(); + <static>+dynamic measurements(); + <static>+dynamic reports() + ] - [DashboardScaffold + [<abstract>StudyPageWidget | - <static>+compactWidthThreshold: double; - +body: Widget + +studyId: String | - +Widget build() + +Widget? banner() ] - [DashboardScaffold]o-[<abstract>Widget] + [<abstract>ConsumerWidget]<:-[<abstract>StudyPageWidget] + [<abstract>IWithBanner]<:--[<abstract>StudyPageWidget] - [StudiesTableColumnSize + [StudyParticipationBadge | - +collapsed: bool; - +flex: int?; - +width: double? + +participation: Participation; + +type: BadgeType; + +showPrefixIcon: bool; + +center: bool | - +Widget createContainer() + +Widget build() ] - [StudiesTable + [StudyParticipationBadge]o-[Participation] + [StudyParticipationBadge]o-[BadgeType] + + [StudyBaseController | - +itemHeight: double; - +itemPadding: double; - +rowSpacing: double; - +columnSpacing: double; - +compactWidthThreshold: double; - +superCompactWidthThreshold: double; - +compactStatTitleThreshold: double; - +studies: List<Study>; - +onSelect: void Function(Study); - +getActions: List<ModelAction<dynamic>> Function(Study); - +emptyWidget: Widget; - +pinnedStudies: Iterable<String>; - +dashboardController: DashboardController + +studyId: String; + +studyRepository: IStudyRepository; + +router: GoRouter; + +studySubscription: StreamSubscription<WrappedModel<Study>>? | - +Widget build(); - -Widget _buildColumnHeader() + +dynamic subscribeStudy(); + +dynamic onStudySubscriptionUpdate(); + +dynamic onStudySubscriptionError(); + +void dispose() ] - [StudiesTable]o-[void Function(Study)] - [StudiesTable]o-[List<ModelAction<dynamic>> Function(Study)] - [StudiesTable]o-[<abstract>Widget] - [StudiesTable]o-[DashboardController] + [StudyBaseController]o-[<abstract>IStudyRepository] + [StudyBaseController]o-[GoRouter] + [StudyBaseController]o-[StreamSubscription] - [StudiesTableColumn + [PreviewFrame | - +index: int; - <static>+values: List<StudiesTableColumn>; - <static>+pin: StudiesTableColumn; - <static>+title: StudiesTableColumn; - <static>+status: StudiesTableColumn; - <static>+participation: StudiesTableColumn; - <static>+createdAt: StudiesTableColumn; - <static>+enrolled: StudiesTableColumn; - <static>+active: StudiesTableColumn; - <static>+completed: StudiesTableColumn; - <static>+action: StudiesTableColumn + +studyId: String; + +routeArgs: StudyFormRouteArgs?; + +route: String? ] - [StudiesTableColumn]o-[StudiesTableColumn] - [Enum]<:--[StudiesTableColumn] + [PreviewFrame]o-[<abstract>StudyFormRouteArgs] - [DashboardScreen + [<abstract>IStudyAppBarViewModel | - +filter: StudiesFilter? + +isSyncIndicatorVisible: bool; + +isStatusBadgeVisible: bool; + +isPublishVisible: bool ] - [DashboardScreen]o-[StudiesFilter] + [<abstract>IStudyStatusBadgeViewModel]<:--[<abstract>IStudyAppBarViewModel] + [<abstract>IStudyNavViewModel]<:--[<abstract>IStudyAppBarViewModel] - [DashboardController + [StudyScaffold | - +studyRepository: IStudyRepository; - +authRepository: IAuthRepository; - +userRepository: IUserRepository; - +router: GoRouter; - -_studiesSubscription: StreamSubscription<List<WrappedModel<Study>>>?; - +searchController: SearchController; - +isSortAscending: bool + +studyId: String; + +tabs: List<NavbarTab>?; + +tabsSubnav: List<NavbarTab>?; + +selectedTab: NavbarTab?; + +selectedTabSubnav: NavbarTab?; + +body: StudyPageWidget; + +drawer: Widget?; + +disableActions: bool; + +actionsSpacing: double; + +actionsPadding: double; + +layoutType: SingleColumnLayoutType?; + +appbarHeight: double; + +appbarSubnavHeight: double + ] + + [StudyScaffold]o-[NavbarTab] + [StudyScaffold]o-[<abstract>StudyPageWidget] + [StudyScaffold]o-[<abstract>Widget] + [StudyScaffold]o-[SingleColumnLayoutType] + + [WebFrame | - -dynamic _subscribeStudies(); - +dynamic setSearchText(); - +dynamic setStudiesFilter(); - +dynamic onSelectStudy(); - +dynamic onClickNewStudy(); - +dynamic pinStudy(); - +dynamic pinOffStudy(); - +void setSorting(); - +void filterStudies(); - +void sortStudies(); - +bool isSortingActiveForColumn(); - +bool isPinned(); - +List<ModelAction<dynamic>> availableActions(); - +void dispose() + +previewSrc: String; + +studyId: String + | + +Widget build() ] - [DashboardController]o-[<abstract>IStudyRepository] - [DashboardController]o-[<abstract>IAuthRepository] - [DashboardController]o-[<abstract>IUserRepository] - [DashboardController]o-[GoRouter] - [DashboardController]o-[StreamSubscription] - [DashboardController]o-[SearchController] - [<abstract>IModelActionProvider]<:--[DashboardController] + [DisabledFrame + | + +Widget build() + ] - [StudiesTableItem + [PhoneContainer | - +study: Study; - +itemHeight: double; - +itemPadding: double; - +rowSpacing: double; - +columnSpacing: double; - +actions: List<ModelAction<dynamic>>; - +columnSizes: List<StudiesTableColumnSize>; - +isPinned: bool; - +onPinnedChanged: void Function(Study, bool)?; - +onTap: void Function(Study)? + <static>+defaultWidth: double; + <static>+defaultHeight: double; + +width: double; + +height: double; + +borderColor: Color; + +borderWidth: double; + +borderRadius: double; + +innerContent: Widget; + +innerContentBackgroundColor: Color? + | + +Widget build() ] - [StudiesTableItem]o-[Study] - [StudiesTableItem]o-[void Function(Study, bool)?] - [StudiesTableItem]o-[void Function(Study)?] + [PhoneContainer]o-[Color] + [PhoneContainer]o-[<abstract>Widget] - [StudiesFilter + [MobileFrame | - +index: int; - <static>+values: List<StudiesFilter> + +Widget build() ] - [Enum]<:--[StudiesFilter] + [DesktopFrame + | + +Widget build() + ] - [FormArrayTable + [StudyTestScreen | - +control: AbstractControl<dynamic>; - +items: List<T>; - +onSelectItem: void Function(T); - +getActionsAt: List<ModelAction<dynamic>> Function(T, int); - +onNewItem: void Function()?; - +rowTitle: String Function(T); - +onNewItemLabel: String; - +sectionTitle: String?; - +sectionDescription: String?; - +emptyIcon: IconData?; - +emptyTitle: String?; - +emptyDescription: String?; - +sectionTitleDivider: bool?; - +rowPrefix: Widget Function(BuildContext, T, int)?; - +rowSuffix: Widget Function(BuildContext, T, int)?; - +leadingWidget: Widget?; - +itemsSectionPadding: EdgeInsets?; - +hideLeadingTrailingWhenEmpty: bool; - <static>+columns: List<StandardTableColumn> + +previewRoute: String? | +Widget build(); - -List<Widget> _buildRow(); - -Widget _newItemButton() + +Widget? banner(); + +dynamic load(); + +dynamic save(); + +dynamic showHelp() ] - [FormArrayTable]o-[<abstract>AbstractControl] - [FormArrayTable]o-[void Function(T)] - [FormArrayTable]o-[List<ModelAction<dynamic>> Function(T, int)] - [FormArrayTable]o-[void Function()?] - [FormArrayTable]o-[String Function(T)] - [FormArrayTable]o-[IconData] - [FormArrayTable]o-[Widget Function(BuildContext, T, int)?] - [FormArrayTable]o-[<abstract>Widget] - [FormArrayTable]o-[EdgeInsets] + [<abstract>StudyPageWidget]<:-[StudyTestScreen] - [CustomFormControl + [StudySettingsFormViewModel | - -_onValueChangedDebouncer: Debouncer?; - -_onStatusChangedDebouncer: Debouncer?; - +onValueChanged: void Function(T?)?; - +onStatusChanged: void Function(ControlStatus)?; - +onStatusChangedDebounceTime: int?; - +onValueChangedDebounceTime: int? + +study: AsyncValue<Study>; + +studyRepository: IStudyRepository; + <static>+defaultPublishedToRegistry: bool; + <static>+defaultPublishedToRegistryResults: bool; + +isPublishedToRegistryControl: FormControl<bool>; + +isPublishedToRegistryResultsControl: FormControl<bool>; + +form: FormGroup; + +titles: Map<FormMode, String> | - +void dispose() + +void setControlsFrom(); + +Study buildFormData(); + +dynamic keepControlsSynced(); + +dynamic save(); + +dynamic setLaunchDefaults() ] - [CustomFormControl]o-[Debouncer] - [CustomFormControl]o-[void Function(T?)?] - [CustomFormControl]o-[void Function(ControlStatus)?] - [FormControl]<:-[CustomFormControl] + [StudySettingsFormViewModel]o-[<abstract>AsyncValue] + [StudySettingsFormViewModel]o-[<abstract>IStudyRepository] + [StudySettingsFormViewModel]o-[FormControl] + [StudySettingsFormViewModel]o-[FormGroup] + [<abstract>FormViewModel]<:-[StudySettingsFormViewModel] - [FormInvalidException + [StudySettingsDialog + | + +Widget build() ] - [Exception]<:--[FormInvalidException] + [<abstract>StudyPageWidget]<:-[StudySettingsDialog] - [FormConfigException + [StudyTestController | - +message: String? + +authRepository: IAuthRepository; + +languageCode: String ] - [Exception]<:--[FormConfigException] + [StudyTestController]o-[<abstract>IAuthRepository] + [StudyBaseController]<:-[StudyTestController] - [<abstract>IFormViewModelDelegate + [TestAppRoutes | - +dynamic onSave(); - +void onCancel() + <static>+studyOverview: String; + <static>+eligibility: String; + <static>+intervention: String; + <static>+consent: String; + <static>+journey: String; + <static>+dashboard: String ] - [<abstract>IFormGroupController + [DrawerEntry | - +form: FormGroup + +localizedTitle: String Function(); + +icon: IconData?; + +localizedHelpText: String Function()?; + +enabled: bool; + +onSelected: void Function(BuildContext, WidgetRef)?; + +autoCloseDrawer: bool; + +title: String; + +helpText: String? + | + +void onClick() ] - [<abstract>IFormGroupController]o-[FormGroup] + [DrawerEntry]o-[String Function()] + [DrawerEntry]o-[IconData] + [DrawerEntry]o-[String Function()?] + [DrawerEntry]o-[void Function(BuildContext, WidgetRef)?] - [FormControlOption + [GoRouterDrawerEntry | - +value: T; - +label: String; - +description: String?; - +props: List<Object?> + +intent: RoutingIntent; + +onNavigated: void Function()? + | + +void onClick() ] - [<abstract>Equatable]<:-[FormControlOption] + [GoRouterDrawerEntry]o-[RoutingIntent] + [GoRouterDrawerEntry]o-[void Function()?] + [DrawerEntry]<:-[GoRouterDrawerEntry] - [<abstract>FormViewModel + [AppDrawer | - -_formData: T?; - -_formMode: FormMode; - -_validationSet: FormValidationSetEnum?; - +delegate: IFormViewModelDelegate<FormViewModel<dynamic>>?; - +autosave: bool; - -_immediateFormChildrenSubscriptions: List<StreamSubscription<dynamic>>; - -_immediateFormChildrenListenerDebouncer: Debouncer?; - -_autosaveOperation: CancelableOperation<dynamic>?; - -_defaultControlValidators: Map<String, Tuple<List<Validator<dynamic>>, List<AsyncValidator<dynamic>>>>; - +prevFormValue: Map<String, dynamic>?; - <static>-_formKey: String; - +formData: T?; - +formMode: FormMode; - +isReadonly: bool; - +validationSet: FormValidationSetEnum?; - +isDirty: bool; - +title: String; - +isValid: bool; - +titles: Map<FormMode, String>; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +width: int; + +autoCloseDrawer: bool; + +leftPaddingEntries: double; + +logoPaddingVertical: double; + +logoPaddingHorizontal: double; + +logoMaxHeight: double; + +logoSectionMinHeight: double; + +logoSectionMaxHeight: double + ] + + [StudyAnalyzeScreen | - -dynamic _setFormData(); - -dynamic _rememberDefaultControlValidators(); - -Tuple<List<Validator<dynamic>>, List<AsyncValidator<dynamic>>>? _getDefaultValidators(); - -dynamic _disableAllControls(); - -dynamic _formModeUpdated(); - -dynamic _restoreControlsFromFormData(); - +void revalidate(); - -void _applyValidationSet(); - +void read(); - +dynamic save(); - +dynamic cancel(); - +void enableAutosave(); - +void listenToImmediateFormChildren(); - +dynamic markFormGroupChanged(); - +void dispose(); - +void setControlsFrom(); - +T buildFormData(); - +void initControls() + +Widget? banner(); + +Widget build() ] - [<abstract>FormViewModel]o-[FormMode] - [<abstract>FormViewModel]o-[<abstract>FormValidationSetEnum] - [<abstract>FormViewModel]o-[<abstract>IFormViewModelDelegate] - [<abstract>FormViewModel]o-[Debouncer] - [<abstract>FormViewModel]o-[CancelableOperation] - [<abstract>IFormGroupController]<:--[<abstract>FormViewModel] + [<abstract>StudyPageWidget]<:-[StudyAnalyzeScreen] - [FormMode + [StudyAnalyzeController | - +index: int; - <static>+values: List<FormMode>; - <static>+create: FormMode; - <static>+readonly: FormMode; - <static>+edit: FormMode + +dynamic onExport() ] - [FormMode]o-[FormMode] - [Enum]<:--[FormMode] + [StudyBaseController]<:-[StudyAnalyzeController] - [<abstract>IFormData - | - +id: String + [StudyDesignInterventionsFormView | - +IFormData copy() + +Widget build() ] - [UnsavedChangesDialog + [<abstract>StudyDesignPageWidget]<:-[StudyDesignInterventionsFormView] + + [InterventionFormView | - +Widget build() + +formViewModel: InterventionFormViewModel ] - [<abstract>FormValidationSetEnum - ] + [InterventionFormView]o-[InterventionFormViewModel] - [FormControlValidation + [InterventionPreview | - +control: AbstractControl<dynamic>; - +validators: List<Validator<dynamic>>; - +asyncValidators: List<AsyncValidator<dynamic>>?; - +validationMessages: Map<String, String Function(Object)> + +routeArgs: InterventionFormRouteArgs | - +FormControlValidation merge() + +Widget build() ] - [FormControlValidation]o-[<abstract>AbstractControl] + [InterventionPreview]o-[InterventionFormRouteArgs] + [<abstract>ConsumerWidget]<:-[InterventionPreview] - [<abstract>ManagedFormViewModel + [StudyScheduleFormView | - +ManagedFormViewModel<T> createDuplicate() + +formViewModel: StudyScheduleControls + | + -FormTableRow _renderCustomSequence(); + +Widget build() ] - [<abstract>FormViewModel]<:-[<abstract>ManagedFormViewModel] + [StudyScheduleFormView]o-[<abstract>StudyScheduleControls] + [<abstract>FormConsumerWidget]<:-[StudyScheduleFormView] - [FormViewModelNotFoundException + [InterventionTaskFormData + | + +taskId: String; + +taskTitle: String; + +taskDescription: String?; + <static>+kDefaultTitle: String; + +id: String + | + +CheckmarkTask toTask(); + +InterventionTaskFormData copy() ] - [Exception]<:--[FormViewModelNotFoundException] + [<abstract>IFormDataWithSchedule]<:-[InterventionTaskFormData] - [FormViewModelCollection + [InterventionsFormViewModel | - +formViewModels: List<T>; - +formArray: FormArray<dynamic>; - +stagedViewModels: List<T>; - +retrievableViewModels: List<T>; - +formData: List<D> + +study: Study; + +router: GoRouter; + +interventionsArray: FormArray<dynamic>; + +interventionsCollection: FormViewModelCollection<InterventionFormViewModel, InterventionFormData>; + +form: FormGroup; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +interventionsRequired: dynamic; + +titles: Map<FormMode, String>; + +canTestStudySchedule: bool | - +void add(); - +T remove(); - +T? findWhere(); - +T? removeWhere(); - +bool contains(); - +void stage(); - +T commit(); - +void reset(); - +void read() + +void setControlsFrom(); + +InterventionsFormData buildFormData(); + +void read(); + +List<ModelAction<dynamic>> availableActions(); + +List<ModelAction<dynamic>> availablePopupActions(); + +List<ModelAction<dynamic>> availableInlineActions(); + +void onSelectItem(); + +void onNewItem(); + +InterventionFormViewModel provide(); + +void onCancel(); + +dynamic onSave(); + +dynamic testStudySchedule() ] - [FormViewModelCollection]o-[FormArray] + [InterventionsFormViewModel]o-[Study] + [InterventionsFormViewModel]o-[GoRouter] + [InterventionsFormViewModel]o-[FormArray] + [InterventionsFormViewModel]o-[FormViewModelCollection] + [InterventionsFormViewModel]o-[FormGroup] + [<abstract>FormViewModel]<:-[InterventionsFormViewModel] + [<abstract>StudyScheduleControls]<:-[InterventionsFormViewModel] + [<abstract>IFormViewModelDelegate]<:--[InterventionsFormViewModel] + [<abstract>IListActionProvider]<:--[InterventionsFormViewModel] + [<abstract>IProviderArgsResolver]<:--[InterventionsFormViewModel] - [DrawerEntry + [InterventionTaskFormViewModel | - +localizedTitle: String Function(); - +icon: IconData?; - +localizedHelpText: String Function()?; - +enabled: bool; - +onSelected: void Function(BuildContext, WidgetRef)?; - +autoCloseDrawer: bool; - +title: String; - +helpText: String? + +taskIdControl: FormControl<String>; + +instanceIdControl: FormControl<String>; + +taskTitleControl: FormControl<String>; + +taskDescriptionControl: FormControl<String>; + +markAsCompletedControl: FormControl<bool>; + +form: FormGroup; + +taskId: String; + +instanceId: String; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +titleRequired: dynamic; + +titles: Map<FormMode, String> | - +void onClick() + +void setControlsFrom(); + +InterventionTaskFormData buildFormData(); + +InterventionTaskFormViewModel createDuplicate() ] - [DrawerEntry]o-[String Function()] - [DrawerEntry]o-[IconData] - [DrawerEntry]o-[String Function()?] - [DrawerEntry]o-[void Function(BuildContext, WidgetRef)?] + [InterventionTaskFormViewModel]o-[FormControl] + [InterventionTaskFormViewModel]o-[FormGroup] + [<abstract>ManagedFormViewModel]<:-[InterventionTaskFormViewModel] + [<abstract>WithScheduleControls]<:-[InterventionTaskFormViewModel] - [GoRouterDrawerEntry + [<abstract>StudyScheduleControls | - +intent: RoutingIntent; - +onNavigated: void Function()? + <static>+defaultScheduleType: PhaseSequence; + <static>+defaultScheduleTypeSequence: String; + <static>+defaultNumCycles: int; + <static>+defaultPeriodLength: int; + +sequenceTypeControl: FormControl<PhaseSequence>; + +sequenceTypeCustomControl: FormControl<String>; + +phaseDurationControl: FormControl<int>; + +numCyclesControl: FormControl<int>; + +includeBaselineControl: FormControl<bool>; + +studyScheduleControls: Map<String, FormControl<Object>>; + <static>+kNumCyclesMin: int; + <static>+kNumCyclesMax: int; + <static>+kPhaseDurationMin: int; + <static>+kPhaseDurationMax: int; + +sequenceTypeControlOptions: List<FormControlOption<PhaseSequence>>; + +studyScheduleValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +numCyclesRange: dynamic; + +phaseDurationRange: dynamic; + +customSequenceRequired: dynamic | - +void onClick() + +void setStudyScheduleControlsFrom(); + +StudyScheduleFormData buildStudyScheduleFormData(); + +bool isSequencingCustom() ] - [GoRouterDrawerEntry]o-[RoutingIntent] - [GoRouterDrawerEntry]o-[void Function()?] - [DrawerEntry]<:-[GoRouterDrawerEntry] + [<abstract>StudyScheduleControls]o-[PhaseSequence] + [<abstract>StudyScheduleControls]o-[FormControl] - [AppDrawer + [InterventionFormData | - +width: int; - +autoCloseDrawer: bool; - +leftPaddingEntries: double; - +logoPaddingVertical: double; - +logoPaddingHorizontal: double; - +logoMaxHeight: double; - +logoSectionMinHeight: double; - +logoSectionMaxHeight: double + +interventionId: String; + +title: String; + +description: String?; + +tasksData: List<InterventionTaskFormData>?; + +iconName: String?; + <static>+kDefaultTitle: String; + +id: String + | + +Intervention toIntervention(); + +InterventionFormData copy() ] - [StudyInvitesTable + [<abstract>IFormData]<:-[InterventionFormData] + + [StudyScheduleFormData | - +invites: List<StudyInvite>; - +onSelect: void Function(StudyInvite); - +getActions: List<ModelAction<dynamic>> Function(StudyInvite); - +getInlineActions: List<ModelAction<dynamic>> Function(StudyInvite); - +getIntervention: Intervention? Function(String); - +getParticipantCountForInvite: int Function(StudyInvite) + +sequenceType: PhaseSequence; + +sequenceTypeCustom: String; + +numCycles: int; + +phaseDuration: int; + +includeBaseline: bool; + +id: String | - +Widget build(); - -List<Widget> _buildRow() + +StudySchedule toStudySchedule(); + +Study apply(); + +StudyScheduleFormData copy() ] - [StudyInvitesTable]o-[void Function(StudyInvite)] - [StudyInvitesTable]o-[List<ModelAction<dynamic>> Function(StudyInvite)] - [StudyInvitesTable]o-[Intervention? Function(String)] - [StudyInvitesTable]o-[int Function(StudyInvite)] + [StudyScheduleFormData]o-[PhaseSequence] + [<abstract>IStudyFormData]<:--[StudyScheduleFormData] - [InviteCodeFormView - | - +formViewModel: InviteCodeFormViewModel + [InterventionTaskFormView | - +Widget build(); - -List<FormTableRow> _conditionalInterventionRows() + +formViewModel: InterventionTaskFormViewModel ] - [InviteCodeFormView]o-[InviteCodeFormViewModel] - [<abstract>FormConsumerWidget]<:-[InviteCodeFormView] + [InterventionTaskFormView]o-[InterventionTaskFormViewModel] - [InviteCodeFormViewModel + [InterventionsFormData | - +study: Study; - +inviteCodeRepository: IInviteCodeRepository; - +codeControl: FormControl<String>; - +codeControlValidationMessages: Map<String, String Function(dynamic)>; - +isPreconfiguredScheduleControl: FormControl<bool>; - +preconfiguredScheduleTypeControl: FormControl<PhaseSequence>; - +interventionAControl: FormControl<String>; - +interventionBControl: FormControl<String>; - +form: FormGroup; - +titles: Map<FormMode, String>; - +interventionControlOptions: List<FormControlOption<String>>; - +preconfiguredScheduleTypeOptions: List<FormControlOption<PhaseSequence>>; - +isPreconfiguredSchedule: bool; - +preconfiguredSchedule: List<String>? + +interventionsData: List<InterventionFormData>; + +studyScheduleData: StudyScheduleFormData; + +id: String | - +void initControls(); - -dynamic _uniqueInviteCode(); - +void regenerateCode(); - -String _generateCode(); - +StudyInvite buildFormData(); - +void setControlsFrom(); - +dynamic save() + +Study apply(); + +InterventionsFormData copy() ] - [InviteCodeFormViewModel]o-[Study] - [InviteCodeFormViewModel]o-[<abstract>IInviteCodeRepository] - [InviteCodeFormViewModel]o-[FormControl] - [InviteCodeFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[InviteCodeFormViewModel] + [InterventionsFormData]o-[StudyScheduleFormData] + [<abstract>IStudyFormData]<:--[InterventionsFormData] - [StudyRecruitController + [InterventionFormViewModel | - +inviteCodeRepository: IInviteCodeRepository; - -_invitesSubscription: StreamSubscription<List<WrappedModel<StudyInvite>>>? + +study: Study; + +interventionIdControl: FormControl<String>; + +interventionTitleControl: FormControl<String>; + +interventionIconControl: FormControl<IconOption>; + +interventionDescriptionControl: FormControl<String>; + +interventionTasksArray: FormArray<dynamic>; + +tasksCollection: FormViewModelCollection<InterventionTaskFormViewModel, InterventionTaskFormData>; + +form: FormGroup; + +interventionId: String; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +titleRequired: dynamic; + +atLeastOneTask: dynamic; + +breadcrumbsTitle: String; + +titles: Map<FormMode, String> | - -dynamic _subscribeInvites(); - +Intervention? getIntervention(); - +int getParticipantCountForInvite(); + +void setControlsFrom(); + +InterventionFormData buildFormData(); +List<ModelAction<dynamic>> availableActions(); + +List<ModelAction<dynamic>> availablePopupActions(); +List<ModelAction<dynamic>> availableInlineActions(); - +void dispose() + +void onSelectItem(); + +void onNewItem(); + +void onCancel(); + +dynamic onSave(); + +InterventionTaskFormViewModel provide(); + +InterventionTaskFormRouteArgs buildNewFormRouteArgs(); + +InterventionTaskFormRouteArgs buildFormRouteArgs(); + +InterventionFormViewModel createDuplicate() ] - [StudyRecruitController]o-[<abstract>IInviteCodeRepository] - [StudyRecruitController]o-[StreamSubscription] - [StudyBaseController]<:-[StudyRecruitController] - [<abstract>IModelActionProvider]<:--[StudyRecruitController] + [InterventionFormViewModel]o-[Study] + [InterventionFormViewModel]o-[FormControl] + [InterventionFormViewModel]o-[FormArray] + [InterventionFormViewModel]o-[FormViewModelCollection] + [InterventionFormViewModel]o-[FormGroup] + [<abstract>ManagedFormViewModel]<:-[InterventionFormViewModel] + [<abstract>IFormViewModelDelegate]<:--[InterventionFormViewModel] + [<abstract>IListActionProvider]<:--[InterventionFormViewModel] + [<abstract>IProviderArgsResolver]<:--[InterventionFormViewModel] - [StudyRecruitScreen + [StudyDesignReportsFormView | +Widget build(); - -Widget _inviteCodesSectionHeader(); - -Widget _newInviteCodeButton(); - -dynamic _onSelectInvite() + -dynamic _showReportItemSidesheetWithArgs() ] - [<abstract>StudyPageWidget]<:-[StudyRecruitScreen] + [<abstract>StudyDesignPageWidget]<:-[StudyDesignReportsFormView] - [EnrolledBadge - | - +enrolledCount: int + [ReportItemFormData | - +Widget build() - ] - - [PublishConfirmationDialog + +isPrimary: bool; + +section: ReportSection; + +id: String | - +Widget build() + <static>+dynamic fromDomainModel(); + +ReportItemFormData copy() ] - [<abstract>StudyPageWidget]<:-[PublishConfirmationDialog] + [ReportItemFormData]o-[<abstract>ReportSection] + [<abstract>IFormData]<:-[ReportItemFormData] - [PublishSuccessDialog + [DataReferenceEditor | - +Widget build() - ] - - [<abstract>StudyPageWidget]<:-[PublishSuccessDialog] - - [PublishDialog + +formControl: FormControl<DataReferenceIdentifier<T>>; + +availableTasks: List<Task>; + +buildReactiveDropdownField: ReactiveDropdownField<dynamic> | - +Widget build() + +FormTableRow buildFormTableRow(); + -List<DropdownMenuItem<DataReferenceIdentifier<dynamic>>> _dataReferenceItems() ] - [<abstract>StudyPageWidget]<:-[PublishDialog] + [DataReferenceEditor]o-[FormControl] + [DataReferenceEditor]o-[ReactiveDropdownField] - [StudyFormScaffold - | - +studyId: String; - +formViewModelBuilder: T Function(WidgetRef); - +formViewBuilder: Widget Function(T) + [TemporalAggregationFormatted | - +Widget build() - ] - - [StudyFormScaffold]o-[T Function(WidgetRef)] - [StudyFormScaffold]o-[Widget Function(T)] - [<abstract>ConsumerWidget]<:-[StudyFormScaffold] - - [StudyFormValidationSet + -_value: TemporalAggregation; + <static>+values: List<TemporalAggregationFormatted>; + +value: TemporalAggregation; + +string: String; + +icon: IconData?; + +hashCode: int | - +index: int; - <static>+values: List<StudyFormValidationSet> + +bool ==(); + +String toString(); + +String toJson(); + <static>+TemporalAggregationFormatted fromJson() ] - [Enum]<:--[StudyFormValidationSet] + [TemporalAggregationFormatted]o-[TemporalAggregation] + [TemporalAggregationFormatted]o-[IconData] - [<abstract>QuestionFormData + [ImprovementDirectionFormatted | - <static>+questionTypeFormDataFactories: Map<SurveyQuestionType, QuestionFormData Function(Question<dynamic>, List<EligibilityCriterion>)>; - +questionId: String; - +questionText: String; - +questionInfoText: String?; - +questionType: SurveyQuestionType; - +responseOptionsValidity: Map<dynamic, bool>; - +responseOptions: List<dynamic>; - +id: String + -_value: ImprovementDirection; + <static>+values: List<ImprovementDirectionFormatted>; + +value: ImprovementDirection; + +string: String; + +icon: IconData?; + +hashCode: int | - +Question<dynamic> toQuestion(); - +EligibilityCriterion toEligibilityCriterion(); - +Answer<dynamic> constructAnswerFor(); - +dynamic setResponseOptionsValidityFrom(); - +QuestionFormData copy() + +bool ==(); + +String toString(); + +String toJson(); + <static>+ImprovementDirectionFormatted fromJson() ] - [<abstract>QuestionFormData]o-[SurveyQuestionType] - [<abstract>IFormData]<:--[<abstract>QuestionFormData] + [ImprovementDirectionFormatted]o-[ImprovementDirection] + [ImprovementDirectionFormatted]o-[IconData] - [ChoiceQuestionFormData - | - +isMultipleChoice: bool; - +answerOptions: List<String>; - +responseOptions: List<String> + [ReportSectionType | - +Question<dynamic> toQuestion(); - +QuestionFormData copy(); - -Choice _buildChoiceForValue(); - +Answer<dynamic> constructAnswerFor() + +index: int; + <static>+values: List<ReportSectionType>; + <static>+average: ReportSectionType; + <static>+linearRegression: ReportSectionType ] - [<abstract>QuestionFormData]<:-[ChoiceQuestionFormData] + [ReportSectionType]o-[ReportSectionType] + [Enum]<:--[ReportSectionType] - [BoolQuestionFormData + [AverageSectionFormView | - <static>+kResponseOptions: Map<String, bool>; - +responseOptions: List<String> + +formViewModel: ReportItemFormViewModel; + +studyId: String; + +reportSectionColumnWidth: Map<int, TableColumnWidth> | - +Question<dynamic> toQuestion(); - +BoolQuestionFormData copy(); - +Answer<dynamic> constructAnswerFor() + +Widget build() ] - [<abstract>QuestionFormData]<:-[BoolQuestionFormData] + [AverageSectionFormView]o-[ReportItemFormViewModel] + [<abstract>ConsumerWidget]<:-[AverageSectionFormView] - [ScaleQuestionFormData + [DataReferenceIdentifier | - +minValue: double; - +maxValue: double; - +minLabel: String?; - +maxLabel: String?; - +midValues: List<double?>; - +midLabels: List<String?>; - +stepSize: double; - +initialValue: double?; - +minColor: Color?; - +maxColor: Color?; - +responseOptions: List<double>; - +midAnnotations: List<Annotation> + +hashCode: int | - +ScaleQuestion toQuestion(); - +QuestionFormData copy(); - +Answer<dynamic> constructAnswerFor() + +bool ==() ] - [ScaleQuestionFormData]o-[Color] - [<abstract>QuestionFormData]<:-[ScaleQuestionFormData] + [DataReference]<:-[DataReferenceIdentifier] - [FreeTextQuestionFormData + [LinearRegressionSectionFormView | - +textLengthRange: List<int>; - +textType: FreeTextQuestionType; - +textTypeExpression: String?; - +responseOptions: List<String> + +formViewModel: ReportItemFormViewModel; + +studyId: String; + +reportSectionColumnWidth: Map<int, TableColumnWidth> | - +Question<dynamic> toQuestion(); - +FreeTextQuestionFormData copy(); - +Answer<dynamic> constructAnswerFor() + +Widget build() ] - [FreeTextQuestionFormData]o-[FreeTextQuestionType] - [<abstract>QuestionFormData]<:-[FreeTextQuestionFormData] + [LinearRegressionSectionFormView]o-[ReportItemFormViewModel] + [<abstract>ConsumerWidget]<:-[LinearRegressionSectionFormView] - [SurveyQuestionFormView + [ReportItemFormViewModel | - +formViewModel: QuestionFormViewModel; - +isHtmlStyleable: bool - ] - - [SurveyQuestionFormView]o-[QuestionFormViewModel] - - [SurveyQuestionType - | - +index: int; - <static>+values: List<SurveyQuestionType>; - <static>+choice: SurveyQuestionType; - <static>+bool: SurveyQuestionType; - <static>+scale: SurveyQuestionType; - <static>+freeText: SurveyQuestionType - ] - - [SurveyQuestionType]o-[SurveyQuestionType] - [Enum]<:--[SurveyQuestionType] - - [<abstract>IScaleQuestionFormViewModel - | - +isMidValuesClearedInfoVisible: bool - ] - - [ScaleQuestionFormView - | - +formViewModel: QuestionFormViewModel - ] - - [ScaleQuestionFormView]o-[QuestionFormViewModel] - - [ChoiceQuestionFormView - | - +formViewModel: QuestionFormViewModel - | - +Widget build() - ] - - [ChoiceQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[ChoiceQuestionFormView] - - [BoolQuestionFormView - | - +formViewModel: QuestionFormViewModel + <static>+defaultSectionType: ReportSectionType; + +sectionIdControl: FormControl<String>; + +sectionTypeControl: FormControl<ReportSectionType>; + +titleControl: FormControl<String>; + +descriptionControl: FormControl<String>; + +sectionControl: FormControl<ReportSection>; + +dataReferenceControl: FormControl<DataReferenceIdentifier<num>>; + +temporalAggregationControl: FormControl<TemporalAggregationFormatted>; + +improvementDirectionControl: FormControl<ImprovementDirectionFormatted>; + +alphaControl: FormControl<double>; + -_controlsBySectionType: Map<ReportSectionType, FormGroup>; + -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + -_validationConfigsBySectionType: Map<ReportSectionType, Map<FormValidationSetEnum, List<FormControlValidation>>>; + +sectionBaseControls: Map<String, AbstractControl<dynamic>>; + +form: FormGroup; + +sectionId: String; + +sectionType: ReportSectionType; + <static>+sectionTypeControlOptions: List<FormControlOption<ReportSectionType>>; + <static>+temporalAggregationControlOptions: List<FormControlOption<TemporalAggregationFormatted>>; + <static>+improvementDirectionControlOptions: List<FormControlOption<ImprovementDirectionFormatted>>; + +titles: Map<FormMode, String>; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +titleRequired: dynamic; + +descriptionRequired: dynamic; + +dataReferenceRequired: dynamic; + +aggregationRequired: dynamic; + +improvementDirectionRequired: dynamic; + +alphaConfidenceRequired: dynamic | - +Widget build() + -List<FormControlValidation> _getValidationConfig(); + +ReportItemFormData buildFormData(); + +ReportItemFormViewModel createDuplicate(); + +dynamic onSectionTypeChanged(); + -void _updateFormControls(); + +void setControlsFrom() ] - [BoolQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[BoolQuestionFormView] + [ReportItemFormViewModel]o-[ReportSectionType] + [ReportItemFormViewModel]o-[FormControl] + [ReportItemFormViewModel]o-[FormGroup] + [<abstract>ManagedFormViewModel]<:-[ReportItemFormViewModel] - [FreeTextQuestionFormView + [ReportItemFormView | - +formViewModel: QuestionFormViewModel; - +generateLabelHelpTextMap: dynamic + +formViewModel: ReportItemFormViewModel; + +studyId: String; + +reportSectionColumnWidth: dynamic; + +sectionTypeBodyBuilder: Widget Function(BuildContext) | +Widget build(); - +Widget disableOnReadonly(); - +Widget generateRow() + -dynamic _buildSectionText(); + -dynamic _buildSectionTypeHeader() ] - [FreeTextQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[FreeTextQuestionFormView] + [ReportItemFormView]o-[ReportItemFormViewModel] + [ReportItemFormView]o-[Widget Function(BuildContext)] - [QuestionFormViewModel + [ReportsFormViewModel | - <static>+defaultQuestionType: SurveyQuestionType; - -_titles: Map<FormMode, String Function()>?; - +questionIdControl: FormControl<String>; - +questionTypeControl: FormControl<SurveyQuestionType>; - +questionTextControl: FormControl<String>; - +questionInfoTextControl: FormControl<String>; - +questionBaseControls: Map<String, AbstractControl<dynamic>>; - +isMultipleChoiceControl: FormControl<bool>; - +choiceResponseOptionsArray: FormArray<dynamic>; - +customOptionsMin: int; - +customOptionsMax: int; - +customOptionsInitial: int; - +boolResponseOptionsArray: FormArray<String>; - <static>+kDefaultScaleMinValue: int; - <static>+kDefaultScaleMaxValue: int; - <static>+kNumMidValueControls: int; - <static>+kMidValueDebounceMilliseconds: int; - +scaleMinValueControl: FormControl<int>; - +scaleMaxValueControl: FormControl<int>; - -_scaleRangeControl: FormControl<int>; - +scaleMinLabelControl: FormControl<String>; - +scaleMaxLabelControl: FormControl<String>; - +scaleMidValueControls: FormArray<int>; - +scaleMidLabelControls: FormArray<String?>; - -_scaleResponseOptionsArray: FormArray<int>; - +scaleMinColorControl: FormControl<SerializableColor>; - +scaleMaxColorControl: FormControl<SerializableColor>; - +prevMidValues: List<int?>?; - +freeTextTypeControl: FormControl<FreeTextQuestionType>; - +customRegexControl: FormControl<String>; - +freeTextResponseOptionsArray: FormArray<dynamic>; - +freeTextLengthMin: AbstractControl<int>; - +freeTextLengthMax: AbstractControl<int>; - +freeTextExampleTextControl: FormControl<String>; - <static>+kDefaultFreeTextMinLength: int; - <static>+kDefaultFreeTextMaxLength: int; - +freeTextLengthControl: FormControl<RangeValues>; - -_controlsByQuestionType: Map<SurveyQuestionType, FormGroup>; - -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - -_validationConfigsByQuestionType: Map<SurveyQuestionType, Map<FormValidationSetEnum, List<FormControlValidation>>>; + +study: Study; + +router: GoRouter; + +reportItemDelegate: ReportFormItemDelegate; + +reportItemArray: FormArray<dynamic>; + +reportItemFormViewModels: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData>; +form: FormGroup; - +questionId: String; - +questionType: SurveyQuestionType; - +questionTypeControlOptions: List<FormControlOption<SurveyQuestionType>>; - +answerOptionsArray: FormArray<dynamic>; - +answerOptionsControls: List<AbstractControl<dynamic>>; - +validAnswerOptions: List<String>; - +boolOptions: List<AbstractControl<String>>; - +scaleMinValue: int; - +scaleMaxValue: int; - +scaleRange: int; - +scaleAllValueControls: List<AbstractControl<int>>; + +reportItemModels: List<ReportItemFormViewModel>; +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +questionTextRequired: dynamic; - +numValidChoiceOptions: dynamic; - +scaleRangeValid: dynamic; +titles: Map<FormMode, String>; - +isAddOptionButtonVisible: bool; - +isMidValuesClearedInfoVisible: bool + +canTestConsent: bool | - +String? scaleMidLabelAt(); - -dynamic _onScaleRangeChanged(); - -dynamic _applyInputFormatters(); - -dynamic _updateScaleMidValueControls(); - -Map<String, dynamic>? _validateFreeText(); - -dynamic _onFreeTextLengthChanged(); - -List<FormControlValidation> _getValidationConfig(); - +dynamic onQuestionTypeChanged(); - +dynamic onResponseOptionsChanged(); - -void _updateFormControls(); - +void initControls(); +void setControlsFrom(); - +QuestionFormData buildFormData(); - +List<ModelAction<dynamic>> availableActions(); - +void onNewItem(); - +void onSelectItem(); - +dynamic save(); - +QuestionFormViewModel createDuplicate() - ] - - [QuestionFormViewModel]o-[SurveyQuestionType] - [QuestionFormViewModel]o-[FormControl] - [QuestionFormViewModel]o-[FormArray] - [QuestionFormViewModel]o-[<abstract>AbstractControl] - [QuestionFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[QuestionFormViewModel] - [<abstract>IListActionProvider]<:--[QuestionFormViewModel] - - [<abstract>WithQuestionnaireControls - | - +questionsArray: FormArray<dynamic>; - +questionFormViewModels: FormViewModelCollection<Q, QuestionFormData>; - +questionnaireControls: Map<String, FormArray<dynamic>>; - +propagateOnSave: bool; - +questionModels: List<Q>; - +questionTitles: Map<FormMode, String Function()> - | - +void setQuestionnaireControlsFrom(); - +QuestionnaireFormData buildQuestionnaireFormData(); + +ReportsFormData buildFormData(); +void read(); + +ReportItemFormRouteArgs buildNewReportItemFormRouteArgs(); + +ReportItemFormRouteArgs buildReportItemFormRouteArgs(); + +dynamic testReport(); +void onCancel(); +dynamic onSave(); - +Q provide(); - +Q provideQuestionFormViewModel() - ] - - [<abstract>WithQuestionnaireControls]o-[FormArray] - [<abstract>WithQuestionnaireControls]o-[FormViewModelCollection] - [<abstract>IFormViewModelDelegate]<:--[<abstract>WithQuestionnaireControls] - [<abstract>IProviderArgsResolver]<:--[<abstract>WithQuestionnaireControls] - - [QuestionnaireFormData - | - +questionsData: List<QuestionFormData>?; - +id: String - | - +StudyUQuestionnaire toQuestionnaire(); - +List<EligibilityCriterion> toEligibilityCriteria(); - +QuestionnaireFormData copy() - ] - - [<abstract>IFormData]<:--[QuestionnaireFormData] - - [<abstract>IFormDataWithSchedule - | - +instanceId: String; - +isTimeLocked: bool; - +timeLockStart: StudyUTimeOfDay?; - +timeLockEnd: StudyUTimeOfDay?; - +hasReminder: bool; - +reminderTime: StudyUTimeOfDay? - | - +Schedule toSchedule() - ] - - [<abstract>IFormDataWithSchedule]o-[StudyUTimeOfDay] - [<abstract>IFormData]<:--[<abstract>IFormDataWithSchedule] - - [ScheduleControls - | - +formViewModel: WithScheduleControls - | - +Widget build(); - -List<FormTableRow> _conditionalTimeRestrictions() - ] - - [ScheduleControls]o-[<abstract>WithScheduleControls] - [<abstract>FormConsumerWidget]<:-[ScheduleControls] - - [<abstract>WithScheduleControls - | - +isTimeRestrictedControl: FormControl<bool>; - +instanceID: FormControl<String>; - +restrictedTimeStartControl: FormControl<Time>; - +restrictedTimeStartPickerControl: FormControl<TimeOfDay>; - +restrictedTimeEndControl: FormControl<Time>; - +restrictedTimeEndPickerControl: FormControl<TimeOfDay>; - +hasReminderControl: FormControl<bool>; - +reminderTimeControl: FormControl<Time>; - +reminderTimePickerControl: FormControl<TimeOfDay>; - -_reminderControlStream: StreamSubscription<dynamic>?; - +scheduleFormControls: Map<String, FormControl<Object>>; - +hasReminder: bool; - +isTimeRestricted: bool; - +timeRestriction: List<Time>? - | - +void setScheduleControlsFrom(); - -dynamic _initReminderControl() + +ReportItemFormViewModel provide() ] - [<abstract>WithScheduleControls]o-[FormControl] - [<abstract>WithScheduleControls]o-[StreamSubscription] + [ReportsFormViewModel]o-[Study] + [ReportsFormViewModel]o-[GoRouter] + [ReportsFormViewModel]o-[ReportFormItemDelegate] + [ReportsFormViewModel]o-[FormArray] + [ReportsFormViewModel]o-[FormViewModelCollection] + [ReportsFormViewModel]o-[FormGroup] + [<abstract>FormViewModel]<:-[ReportsFormViewModel] + [<abstract>IFormViewModelDelegate]<:--[ReportsFormViewModel] + [<abstract>IProviderArgsResolver]<:--[ReportsFormViewModel] - [InterventionFormViewModel + [ReportFormItemDelegate | - +study: Study; - +interventionIdControl: FormControl<String>; - +interventionTitleControl: FormControl<String>; - +interventionIconControl: FormControl<IconOption>; - +interventionDescriptionControl: FormControl<String>; - +interventionTasksArray: FormArray<dynamic>; - +tasksCollection: FormViewModelCollection<InterventionTaskFormViewModel, InterventionTaskFormData>; - +form: FormGroup; - +interventionId: String; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titleRequired: dynamic; - +atLeastOneTask: dynamic; - +breadcrumbsTitle: String; - +titles: Map<FormMode, String> + +formViewModelCollection: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData>; + +owner: ReportsFormViewModel; + +propagateOnSave: bool; + +validationSet: dynamic | - +void setControlsFrom(); - +InterventionFormData buildFormData(); - +List<ModelAction<dynamic>> availableActions(); - +List<ModelAction<dynamic>> availablePopupActions(); - +List<ModelAction<dynamic>> availableInlineActions(); - +void onSelectItem(); - +void onNewItem(); +void onCancel(); +dynamic onSave(); - +InterventionTaskFormViewModel provide(); - +InterventionTaskFormRouteArgs buildNewFormRouteArgs(); - +InterventionTaskFormRouteArgs buildFormRouteArgs(); - +InterventionFormViewModel createDuplicate() + +ReportItemFormViewModel provide(); + +List<ModelAction<dynamic>> availableActions(); + +void onNewItem(); + +void onSelectItem() + ] + + [ReportFormItemDelegate]o-[FormViewModelCollection] + [ReportFormItemDelegate]o-[ReportsFormViewModel] + [<abstract>IFormViewModelDelegate]<:--[ReportFormItemDelegate] + [<abstract>IListActionProvider]<:--[ReportFormItemDelegate] + [<abstract>IProviderArgsResolver]<:--[ReportFormItemDelegate] + + [ReportBadge + | + +status: ReportStatus?; + +type: BadgeType; + +showPrefixIcon: bool; + +showTooltip: bool + | + +Widget build() ] - [InterventionFormViewModel]o-[Study] - [InterventionFormViewModel]o-[FormControl] - [InterventionFormViewModel]o-[FormArray] - [InterventionFormViewModel]o-[FormViewModelCollection] - [InterventionFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[InterventionFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[InterventionFormViewModel] - [<abstract>IListActionProvider]<:--[InterventionFormViewModel] - [<abstract>IProviderArgsResolver]<:--[InterventionFormViewModel] + [ReportBadge]o-[ReportStatus] + [ReportBadge]o-[BadgeType] - [StudyScheduleFormData + [ReportsFormData | - +sequenceType: PhaseSequence; - +sequenceTypeCustom: String; - +numCycles: int; - +phaseDuration: int; - +includeBaseline: bool; + +reportItems: List<ReportItemFormData>; +id: String | - +StudySchedule toStudySchedule(); +Study apply(); - +StudyScheduleFormData copy() + +ReportsFormData copy() ] - [StudyScheduleFormData]o-[PhaseSequence] - [<abstract>IStudyFormData]<:--[StudyScheduleFormData] + [<abstract>IStudyFormData]<:--[ReportsFormData] - [StudyScheduleFormView - | - +formViewModel: StudyScheduleControls + [ReportStatus | - -FormTableRow _renderCustomSequence(); - +Widget build() + +index: int; + <static>+values: List<ReportStatus>; + <static>+primary: ReportStatus; + <static>+secondary: ReportStatus ] - [StudyScheduleFormView]o-[<abstract>StudyScheduleControls] - [<abstract>FormConsumerWidget]<:-[StudyScheduleFormView] + [ReportStatus]o-[ReportStatus] + [Enum]<:--[ReportStatus] - [InterventionTaskFormView + [<abstract>IStudyFormData | - +formViewModel: InterventionTaskFormViewModel + +Study apply() ] - [InterventionTaskFormView]o-[InterventionTaskFormViewModel] + [<abstract>IFormData]<:--[<abstract>IStudyFormData] - [InterventionPreview + [StudyInfoFormViewModel | - +routeArgs: InterventionFormRouteArgs + +study: Study; + +titleControl: FormControl<String>; + +iconControl: FormControl<IconOption>; + +descriptionControl: FormControl<String>; + +organizationControl: FormControl<String>; + +reviewBoardControl: FormControl<String>; + +reviewBoardNumberControl: FormControl<String>; + +researchersControl: FormControl<String>; + +emailControl: FormControl<String>; + +websiteControl: FormControl<String>; + +phoneControl: FormControl<String>; + +additionalInfoControl: FormControl<String>; + +form: FormGroup; + +titles: Map<FormMode, String>; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +titleRequired: dynamic; + +descriptionRequired: dynamic; + +iconRequired: dynamic; + +organizationRequired: dynamic; + +reviewBoardRequired: dynamic; + +reviewBoardNumberRequired: dynamic; + +researchersRequired: dynamic; + +emailRequired: dynamic; + +phoneRequired: dynamic; + +emailFormat: dynamic; + +websiteFormat: dynamic + | + +void setControlsFrom(); + +StudyInfoFormData buildFormData() + ] + + [StudyInfoFormViewModel]o-[Study] + [StudyInfoFormViewModel]o-[FormControl] + [StudyInfoFormViewModel]o-[FormGroup] + [<abstract>FormViewModel]<:-[StudyInfoFormViewModel] + + [StudyDesignInfoFormView | +Widget build() ] - [InterventionPreview]o-[InterventionFormRouteArgs] - [<abstract>ConsumerWidget]<:-[InterventionPreview] + [<abstract>StudyDesignPageWidget]<:-[StudyDesignInfoFormView] - [InterventionsFormData + [StudyInfoFormData | - +interventionsData: List<InterventionFormData>; - +studyScheduleData: StudyScheduleFormData; + +title: String; + +description: String?; + +iconName: String; + +contactInfoFormData: StudyContactInfoFormData; +id: String | +Study apply(); - +InterventionsFormData copy() + +StudyInfoFormData copy() ] - [InterventionsFormData]o-[StudyScheduleFormData] - [<abstract>IStudyFormData]<:--[InterventionsFormData] + [StudyInfoFormData]o-[StudyContactInfoFormData] + [<abstract>IStudyFormData]<:--[StudyInfoFormData] - [InterventionTaskFormData + [StudyContactInfoFormData | - +taskId: String; - +taskTitle: String; - +taskDescription: String?; - <static>+kDefaultTitle: String; + +organization: String?; + +institutionalReviewBoard: String?; + +institutionalReviewBoardNumber: String?; + +researchers: String?; + +email: String?; + +website: String?; + +phone: String?; + +additionalInfo: String?; +id: String | - +CheckmarkTask toTask(); - +InterventionTaskFormData copy() + +Study apply(); + +StudyInfoFormData copy() ] - [<abstract>IFormDataWithSchedule]<:-[InterventionTaskFormData] + [<abstract>IStudyFormData]<:--[StudyContactInfoFormData] - [InterventionFormView + [StudyFormValidationSet | - +formViewModel: InterventionFormViewModel + +index: int; + <static>+values: List<StudyFormValidationSet> ] - [InterventionFormView]o-[InterventionFormViewModel] + [Enum]<:--[StudyFormValidationSet] - [InterventionTaskFormViewModel + [MeasurementsFormData | - +taskIdControl: FormControl<String>; - +instanceIdControl: FormControl<String>; - +taskTitleControl: FormControl<String>; - +taskDescriptionControl: FormControl<String>; - +markAsCompletedControl: FormControl<bool>; - +form: FormGroup; - +taskId: String; - +instanceId: String; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titleRequired: dynamic; - +titles: Map<FormMode, String> + +surveyMeasurements: List<MeasurementSurveyFormData>; + +id: String | - +void setControlsFrom(); - +InterventionTaskFormData buildFormData(); - +InterventionTaskFormViewModel createDuplicate() + +Study apply(); + +MeasurementsFormData copy() ] - [InterventionTaskFormViewModel]o-[FormControl] - [InterventionTaskFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[InterventionTaskFormViewModel] - [<abstract>WithScheduleControls]<:-[InterventionTaskFormViewModel] + [<abstract>IStudyFormData]<:--[MeasurementsFormData] - [StudyDesignInterventionsFormView + [MeasurementSurveyFormView + | + +formViewModel: MeasurementSurveyFormViewModel + ] + + [MeasurementSurveyFormView]o-[MeasurementSurveyFormViewModel] + + [SurveyPreview + | + +routeArgs: MeasurementFormRouteArgs | +Widget build() ] - [<abstract>StudyDesignPageWidget]<:-[StudyDesignInterventionsFormView] + [SurveyPreview]o-[MeasurementFormRouteArgs] + [<abstract>ConsumerWidget]<:-[SurveyPreview] - [InterventionsFormViewModel + [MeasurementSurveyFormData + | + +measurementId: String; + +title: String; + +introText: String?; + +outroText: String?; + +questionnaireFormData: QuestionnaireFormData; + <static>+kDefaultTitle: String; + +id: String + | + +QuestionnaireTask toQuestionnaireTask(); + +MeasurementSurveyFormData copy() + ] + + [MeasurementSurveyFormData]o-[QuestionnaireFormData] + [<abstract>IFormDataWithSchedule]<:-[MeasurementSurveyFormData] + + [MeasurementSurveyFormViewModel | +study: Study; - +router: GoRouter; - +interventionsArray: FormArray<dynamic>; - +interventionsCollection: FormViewModelCollection<InterventionFormViewModel, InterventionFormData>; + +measurementIdControl: FormControl<String>; + +instanceIdControl: FormControl<String>; + +surveyTitleControl: FormControl<String>; + +surveyIntroTextControl: FormControl<String>; + +surveyOutroTextControl: FormControl<String>; +form: FormGroup; + +measurementId: String; + +instanceId: String; +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +interventionsRequired: dynamic; - +titles: Map<FormMode, String>; - +canTestStudySchedule: bool + +titleRequired: dynamic; + +atLeastOneQuestion: dynamic; + +breadcrumbsTitle: String; + +titles: Map<FormMode, String> | +void setControlsFrom(); - +InterventionsFormData buildFormData(); - +void read(); + +MeasurementSurveyFormData buildFormData(); +List<ModelAction<dynamic>> availableActions(); +List<ModelAction<dynamic>> availablePopupActions(); +List<ModelAction<dynamic>> availableInlineActions(); +void onSelectItem(); +void onNewItem(); - +InterventionFormViewModel provide(); - +void onCancel(); - +dynamic onSave(); - +dynamic testStudySchedule() + +SurveyQuestionFormRouteArgs buildNewFormRouteArgs(); + +SurveyQuestionFormRouteArgs buildFormRouteArgs(); + +MeasurementSurveyFormViewModel createDuplicate() ] - [InterventionsFormViewModel]o-[Study] - [InterventionsFormViewModel]o-[GoRouter] - [InterventionsFormViewModel]o-[FormArray] - [InterventionsFormViewModel]o-[FormViewModelCollection] - [InterventionsFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[InterventionsFormViewModel] - [<abstract>StudyScheduleControls]<:-[InterventionsFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[InterventionsFormViewModel] - [<abstract>IListActionProvider]<:--[InterventionsFormViewModel] - [<abstract>IProviderArgsResolver]<:--[InterventionsFormViewModel] - - [InterventionFormData - | - +interventionId: String; - +title: String; - +description: String?; - +tasksData: List<InterventionTaskFormData>?; - +iconName: String?; - <static>+kDefaultTitle: String; - +id: String + [MeasurementSurveyFormViewModel]o-[Study] + [MeasurementSurveyFormViewModel]o-[FormControl] + [MeasurementSurveyFormViewModel]o-[FormGroup] + [<abstract>ManagedFormViewModel]<:-[MeasurementSurveyFormViewModel] + [<abstract>WithQuestionnaireControls]<:-[MeasurementSurveyFormViewModel] + [<abstract>WithScheduleControls]<:-[MeasurementSurveyFormViewModel] + [<abstract>IFormViewModelDelegate]<:--[MeasurementSurveyFormViewModel] + [<abstract>IListActionProvider]<:--[MeasurementSurveyFormViewModel] + [<abstract>IProviderArgsResolver]<:--[MeasurementSurveyFormViewModel] + + [StudyDesignMeasurementsFormView | - +Intervention toIntervention(); - +InterventionFormData copy() + +Widget build() ] - [<abstract>IFormData]<:-[InterventionFormData] + [<abstract>StudyDesignPageWidget]<:-[StudyDesignMeasurementsFormView] - [<abstract>StudyScheduleControls + [MeasurementsFormViewModel | - <static>+defaultScheduleType: PhaseSequence; - <static>+defaultScheduleTypeSequence: String; - <static>+defaultNumCycles: int; - <static>+defaultPeriodLength: int; - +sequenceTypeControl: FormControl<PhaseSequence>; - +sequenceTypeCustomControl: FormControl<String>; - +phaseDurationControl: FormControl<int>; - +numCyclesControl: FormControl<int>; - +includeBaselineControl: FormControl<bool>; - +studyScheduleControls: Map<String, FormControl<Object>>; - <static>+kNumCyclesMin: int; - <static>+kNumCyclesMax: int; - <static>+kPhaseDurationMin: int; - <static>+kPhaseDurationMax: int; - +sequenceTypeControlOptions: List<FormControlOption<PhaseSequence>>; - +studyScheduleValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +numCyclesRange: dynamic; - +phaseDurationRange: dynamic; - +customSequenceRequired: dynamic + +study: Study; + +router: GoRouter; + +measurementsArray: FormArray<dynamic>; + +surveyMeasurementFormViewModels: FormViewModelCollection<MeasurementSurveyFormViewModel, MeasurementSurveyFormData>; + +form: FormGroup; + +measurementViewModels: List<MeasurementSurveyFormViewModel>; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +measurementRequired: dynamic; + +titles: Map<FormMode, String> | - +void setStudyScheduleControlsFrom(); - +StudyScheduleFormData buildStudyScheduleFormData(); - +bool isSequencingCustom() + +void read(); + +void setControlsFrom(); + +MeasurementsFormData buildFormData(); + +List<ModelAction<dynamic>> availableActions(); + +List<ModelAction<dynamic>> availablePopupActions(); + +List<ModelAction<dynamic>> availableInlineActions(); + +void onSelectItem(); + +void onNewItem(); + +MeasurementSurveyFormViewModel provide(); + +void onCancel(); + +dynamic onSave() ] - [<abstract>StudyScheduleControls]o-[PhaseSequence] - [<abstract>StudyScheduleControls]o-[FormControl] + [MeasurementsFormViewModel]o-[Study] + [MeasurementsFormViewModel]o-[GoRouter] + [MeasurementsFormViewModel]o-[FormArray] + [MeasurementsFormViewModel]o-[FormViewModelCollection] + [MeasurementsFormViewModel]o-[FormGroup] + [<abstract>FormViewModel]<:-[MeasurementsFormViewModel] + [<abstract>IFormViewModelDelegate]<:--[MeasurementsFormViewModel] + [<abstract>IListActionProvider]<:--[MeasurementsFormViewModel] + [<abstract>IProviderArgsResolver]<:--[MeasurementsFormViewModel] - [EnrollmentFormData + [StudyFormScaffold | - <static>+kDefaultEnrollmentType: Participation; - +enrollmentType: Participation; - +questionnaireFormData: QuestionnaireFormData; - +consentItemsFormData: List<ConsentItemFormData>?; - +id: String + +studyId: String; + +formViewModelBuilder: T Function(WidgetRef); + +formViewBuilder: Widget Function(T) | - +Study apply(); - +EnrollmentFormData copy() + +Widget build() ] - [EnrollmentFormData]o-[Participation] - [EnrollmentFormData]o-[QuestionnaireFormData] - [<abstract>IStudyFormData]<:--[EnrollmentFormData] + [StudyFormScaffold]o-[T Function(WidgetRef)] + [StudyFormScaffold]o-[Widget Function(T)] + [<abstract>ConsumerWidget]<:-[StudyFormScaffold] [ConsentItemFormViewModel | @@ -1667,12 +1715,14 @@ [ConsentItemFormViewModel]o-[FormGroup] [<abstract>ManagedFormViewModel]<:-[ConsentItemFormViewModel] - [ConsentItemFormView + [StudyDesignEnrollmentFormView | - +formViewModel: ConsentItemFormViewModel + +Widget build(); + -dynamic _showScreenerQuestionSidesheetWithArgs(); + -dynamic _showConsentItemSidesheetWithArgs() ] - [ConsentItemFormView]o-[ConsentItemFormViewModel] + [<abstract>StudyDesignPageWidget]<:-[StudyDesignEnrollmentFormView] [<abstract>IScreenerQuestionLogicFormViewModel | @@ -1692,6 +1742,43 @@ [ScreenerQuestionLogicFormView]o-[ScreenerQuestionFormViewModel] [<abstract>FormConsumerWidget]<:-[ScreenerQuestionLogicFormView] + [ConsentItemFormData + | + +consentId: String; + +title: String; + +description: String; + +iconName: String?; + +id: String + | + +ConsentItem toConsentItem(); + +ConsentItemFormData copy() + ] + + [<abstract>IFormData]<:-[ConsentItemFormData] + + [ConsentItemFormView + | + +formViewModel: ConsentItemFormViewModel + ] + + [ConsentItemFormView]o-[ConsentItemFormViewModel] + + [EnrollmentFormData + | + <static>+kDefaultEnrollmentType: Participation; + +enrollmentType: Participation; + +questionnaireFormData: QuestionnaireFormData; + +consentItemsFormData: List<ConsentItemFormData>?; + +id: String + | + +Study apply(); + +EnrollmentFormData copy() + ] + + [EnrollmentFormData]o-[Participation] + [EnrollmentFormData]o-[QuestionnaireFormData] + [<abstract>IStudyFormData]<:--[EnrollmentFormData] + [ScreenerQuestionFormViewModel | <static>+defaultResponseOptionValidity: bool; @@ -1719,29 +1806,6 @@ [QuestionFormViewModel]<:-[ScreenerQuestionFormViewModel] [<abstract>IScreenerQuestionLogicFormViewModel]<:--[ScreenerQuestionFormViewModel] - [StudyDesignEnrollmentFormView - | - +Widget build(); - -dynamic _showScreenerQuestionSidesheetWithArgs(); - -dynamic _showConsentItemSidesheetWithArgs() - ] - - [<abstract>StudyDesignPageWidget]<:-[StudyDesignEnrollmentFormView] - - [ConsentItemFormData - | - +consentId: String; - +title: String; - +description: String; - +iconName: String?; - +id: String - | - +ConsentItem toConsentItem(); - +ConsentItemFormData copy() - ] - - [<abstract>IFormData]<:-[ConsentItemFormData] - [EnrollmentFormViewModel | +study: Study; @@ -1810,525 +1874,523 @@ [<abstract>IListActionProvider]<:--[EnrollmentFormConsentItemDelegate] [<abstract>IProviderArgsResolver]<:--[EnrollmentFormConsentItemDelegate] - [MeasurementsFormViewModel + [StudyFormViewModel | - +study: Study; + +studyDirtyCopy: Study?; + +studyRepository: IStudyRepository; + +authRepository: IAuthRepository; +router: GoRouter; - +measurementsArray: FormArray<dynamic>; - +surveyMeasurementFormViewModels: FormViewModelCollection<MeasurementSurveyFormViewModel, MeasurementSurveyFormData>; + +studyInfoFormViewModel: StudyInfoFormViewModel; + +enrollmentFormViewModel: EnrollmentFormViewModel; + +measurementsFormViewModel: MeasurementsFormViewModel; + +reportsFormViewModel: ReportsFormViewModel; + +interventionsFormViewModel: InterventionsFormViewModel; +form: FormGroup; - +measurementViewModels: List<MeasurementSurveyFormViewModel>; + +isStudyReadonly: bool; +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +measurementRequired: dynamic; +titles: Map<FormMode, String> | +void read(); +void setControlsFrom(); - +MeasurementsFormData buildFormData(); - +List<ModelAction<dynamic>> availableActions(); - +List<ModelAction<dynamic>> availablePopupActions(); - +List<ModelAction<dynamic>> availableInlineActions(); - +void onSelectItem(); - +void onNewItem(); - +MeasurementSurveyFormViewModel provide(); + +Study buildFormData(); + +void dispose(); +void onCancel(); - +dynamic onSave() + +dynamic onSave(); + -dynamic _applyAndSaveSubform() ] - [MeasurementsFormViewModel]o-[Study] - [MeasurementsFormViewModel]o-[GoRouter] - [MeasurementsFormViewModel]o-[FormArray] - [MeasurementsFormViewModel]o-[FormViewModelCollection] - [MeasurementsFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[MeasurementsFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[MeasurementsFormViewModel] - [<abstract>IListActionProvider]<:--[MeasurementsFormViewModel] - [<abstract>IProviderArgsResolver]<:--[MeasurementsFormViewModel] + [StudyFormViewModel]o-[Study] + [StudyFormViewModel]o-[<abstract>IStudyRepository] + [StudyFormViewModel]o-[<abstract>IAuthRepository] + [StudyFormViewModel]o-[GoRouter] + [StudyFormViewModel]o-[StudyInfoFormViewModel] + [StudyFormViewModel]o-[EnrollmentFormViewModel] + [StudyFormViewModel]o-[MeasurementsFormViewModel] + [StudyFormViewModel]o-[ReportsFormViewModel] + [StudyFormViewModel]o-[InterventionsFormViewModel] + [StudyFormViewModel]o-[FormGroup] + [<abstract>FormViewModel]<:-[StudyFormViewModel] + [<abstract>IFormViewModelDelegate]<:--[StudyFormViewModel] - [MeasurementSurveyFormData + [<abstract>WithQuestionnaireControls | - +measurementId: String; - +title: String; - +introText: String?; - +outroText: String?; - +questionnaireFormData: QuestionnaireFormData; - <static>+kDefaultTitle: String; + +questionsArray: FormArray<dynamic>; + +questionFormViewModels: FormViewModelCollection<Q, QuestionFormData>; + +questionnaireControls: Map<String, FormArray<dynamic>>; + +propagateOnSave: bool; + +questionModels: List<Q>; + +questionTitles: Map<FormMode, String Function()> + | + +void setQuestionnaireControlsFrom(); + +QuestionnaireFormData buildQuestionnaireFormData(); + +void read(); + +void onCancel(); + +dynamic onSave(); + +Q provide(); + +Q provideQuestionFormViewModel() + ] + + [<abstract>WithQuestionnaireControls]o-[FormArray] + [<abstract>WithQuestionnaireControls]o-[FormViewModelCollection] + [<abstract>IFormViewModelDelegate]<:--[<abstract>WithQuestionnaireControls] + [<abstract>IProviderArgsResolver]<:--[<abstract>WithQuestionnaireControls] + + [QuestionnaireFormData + | + +questionsData: List<QuestionFormData>?; +id: String | - +QuestionnaireTask toQuestionnaireTask(); - +MeasurementSurveyFormData copy() + +StudyUQuestionnaire toQuestionnaire(); + +List<EligibilityCriterion> toEligibilityCriteria(); + +QuestionnaireFormData copy() ] - [MeasurementSurveyFormData]o-[QuestionnaireFormData] - [<abstract>IFormDataWithSchedule]<:-[MeasurementSurveyFormData] + [<abstract>IFormData]<:--[QuestionnaireFormData] + + [<abstract>QuestionFormData + | + <static>+questionTypeFormDataFactories: Map<SurveyQuestionType, QuestionFormData Function(Question<dynamic>, List<EligibilityCriterion>)>; + +questionId: String; + +questionText: String; + +questionInfoText: String?; + +questionType: SurveyQuestionType; + +responseOptionsValidity: Map<dynamic, bool>; + +responseOptions: List<dynamic>; + +id: String + | + +Question<dynamic> toQuestion(); + +EligibilityCriterion toEligibilityCriterion(); + +Answer<dynamic> constructAnswerFor(); + +dynamic setResponseOptionsValidityFrom(); + +QuestionFormData copy() + ] - [SurveyPreview + [<abstract>QuestionFormData]o-[SurveyQuestionType] + [<abstract>IFormData]<:--[<abstract>QuestionFormData] + + [ChoiceQuestionFormData | - +routeArgs: MeasurementFormRouteArgs + +isMultipleChoice: bool; + +answerOptions: List<String>; + +responseOptions: List<String> | - +Widget build() + +Question<dynamic> toQuestion(); + +QuestionFormData copy(); + -Choice _buildChoiceForValue(); + +Answer<dynamic> constructAnswerFor() ] - [SurveyPreview]o-[MeasurementFormRouteArgs] - [<abstract>ConsumerWidget]<:-[SurveyPreview] + [<abstract>QuestionFormData]<:-[ChoiceQuestionFormData] - [MeasurementSurveyFormViewModel + [BoolQuestionFormData | - +study: Study; - +measurementIdControl: FormControl<String>; - +instanceIdControl: FormControl<String>; - +surveyTitleControl: FormControl<String>; - +surveyIntroTextControl: FormControl<String>; - +surveyOutroTextControl: FormControl<String>; - +form: FormGroup; - +measurementId: String; - +instanceId: String; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titleRequired: dynamic; - +atLeastOneQuestion: dynamic; - +breadcrumbsTitle: String; - +titles: Map<FormMode, String> + <static>+kResponseOptions: Map<String, bool>; + +responseOptions: List<String> | - +void setControlsFrom(); - +MeasurementSurveyFormData buildFormData(); - +List<ModelAction<dynamic>> availableActions(); - +List<ModelAction<dynamic>> availablePopupActions(); - +List<ModelAction<dynamic>> availableInlineActions(); - +void onSelectItem(); - +void onNewItem(); - +SurveyQuestionFormRouteArgs buildNewFormRouteArgs(); - +SurveyQuestionFormRouteArgs buildFormRouteArgs(); - +MeasurementSurveyFormViewModel createDuplicate() + +Question<dynamic> toQuestion(); + +BoolQuestionFormData copy(); + +Answer<dynamic> constructAnswerFor() ] - [MeasurementSurveyFormViewModel]o-[Study] - [MeasurementSurveyFormViewModel]o-[FormControl] - [MeasurementSurveyFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[MeasurementSurveyFormViewModel] - [<abstract>WithQuestionnaireControls]<:-[MeasurementSurveyFormViewModel] - [<abstract>WithScheduleControls]<:-[MeasurementSurveyFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[MeasurementSurveyFormViewModel] - [<abstract>IListActionProvider]<:--[MeasurementSurveyFormViewModel] - [<abstract>IProviderArgsResolver]<:--[MeasurementSurveyFormViewModel] + [<abstract>QuestionFormData]<:-[BoolQuestionFormData] - [MeasurementSurveyFormView + [ScaleQuestionFormData | - +formViewModel: MeasurementSurveyFormViewModel + +minValue: double; + +maxValue: double; + +minLabel: String?; + +maxLabel: String?; + +midValues: List<double?>; + +midLabels: List<String?>; + +stepSize: double; + +initialValue: double?; + +minColor: Color?; + +maxColor: Color?; + +responseOptions: List<double>; + +midAnnotations: List<Annotation> + | + +ScaleQuestion toQuestion(); + +QuestionFormData copy(); + +Answer<dynamic> constructAnswerFor() ] - [MeasurementSurveyFormView]o-[MeasurementSurveyFormViewModel] + [ScaleQuestionFormData]o-[Color] + [<abstract>QuestionFormData]<:-[ScaleQuestionFormData] - [MeasurementsFormData + [FreeTextQuestionFormData | - +surveyMeasurements: List<MeasurementSurveyFormData>; - +id: String + +textLengthRange: List<int>; + +textType: FreeTextQuestionType; + +textTypeExpression: String?; + +responseOptions: List<String> | - +Study apply(); - +MeasurementsFormData copy() + +Question<dynamic> toQuestion(); + +FreeTextQuestionFormData copy(); + +Answer<dynamic> constructAnswerFor() ] - [<abstract>IStudyFormData]<:--[MeasurementsFormData] + [FreeTextQuestionFormData]o-[FreeTextQuestionType] + [<abstract>QuestionFormData]<:-[FreeTextQuestionFormData] - [StudyDesignMeasurementsFormView + [FreeTextQuestionFormView | - +Widget build() + +formViewModel: QuestionFormViewModel; + +generateLabelHelpTextMap: dynamic + | + +Widget build(); + +Widget disableOnReadonly(); + +Widget generateRow() ] - [<abstract>StudyDesignPageWidget]<:-[StudyDesignMeasurementsFormView] + [FreeTextQuestionFormView]o-[QuestionFormViewModel] + [<abstract>ConsumerWidget]<:-[FreeTextQuestionFormView] - [<abstract>StudyDesignPageWidget + [SurveyQuestionType | - +Widget? banner() + +index: int; + <static>+values: List<SurveyQuestionType>; + <static>+choice: SurveyQuestionType; + <static>+bool: SurveyQuestionType; + <static>+scale: SurveyQuestionType; + <static>+freeText: SurveyQuestionType ] - [<abstract>StudyPageWidget]<:-[<abstract>StudyDesignPageWidget] + [SurveyQuestionType]o-[SurveyQuestionType] + [Enum]<:--[SurveyQuestionType] - [StudyDesignInfoFormView + [<abstract>IScaleQuestionFormViewModel | - +Widget build() + +isMidValuesClearedInfoVisible: bool ] - [<abstract>StudyDesignPageWidget]<:-[StudyDesignInfoFormView] - - [StudyInfoFormData - | - +title: String; - +description: String?; - +iconName: String; - +contactInfoFormData: StudyContactInfoFormData; - +id: String + [ScaleQuestionFormView | - +Study apply(); - +StudyInfoFormData copy() + +formViewModel: QuestionFormViewModel ] - [StudyInfoFormData]o-[StudyContactInfoFormData] - [<abstract>IStudyFormData]<:--[StudyInfoFormData] + [ScaleQuestionFormView]o-[QuestionFormViewModel] - [StudyContactInfoFormData + [ChoiceQuestionFormView | - +organization: String?; - +institutionalReviewBoard: String?; - +institutionalReviewBoardNumber: String?; - +researchers: String?; - +email: String?; - +website: String?; - +phone: String?; - +additionalInfo: String?; - +id: String + +formViewModel: QuestionFormViewModel | - +Study apply(); - +StudyInfoFormData copy() + +Widget build() ] - [<abstract>IStudyFormData]<:--[StudyContactInfoFormData] + [ChoiceQuestionFormView]o-[QuestionFormViewModel] + [<abstract>ConsumerWidget]<:-[ChoiceQuestionFormView] - [StudyInfoFormViewModel + [BoolQuestionFormView | - +study: Study; - +titleControl: FormControl<String>; - +iconControl: FormControl<IconOption>; - +descriptionControl: FormControl<String>; - +organizationControl: FormControl<String>; - +reviewBoardControl: FormControl<String>; - +reviewBoardNumberControl: FormControl<String>; - +researchersControl: FormControl<String>; - +emailControl: FormControl<String>; - +websiteControl: FormControl<String>; - +phoneControl: FormControl<String>; - +additionalInfoControl: FormControl<String>; - +form: FormGroup; - +titles: Map<FormMode, String>; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titleRequired: dynamic; - +descriptionRequired: dynamic; - +iconRequired: dynamic; - +organizationRequired: dynamic; - +reviewBoardRequired: dynamic; - +reviewBoardNumberRequired: dynamic; - +researchersRequired: dynamic; - +emailRequired: dynamic; - +phoneRequired: dynamic; - +emailFormat: dynamic; - +websiteFormat: dynamic + +formViewModel: QuestionFormViewModel | - +void setControlsFrom(); - +StudyInfoFormData buildFormData() + +Widget build() ] - [StudyInfoFormViewModel]o-[Study] - [StudyInfoFormViewModel]o-[FormControl] - [StudyInfoFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[StudyInfoFormViewModel] + [BoolQuestionFormView]o-[QuestionFormViewModel] + [<abstract>ConsumerWidget]<:-[BoolQuestionFormView] - [StudyFormViewModel + [QuestionFormViewModel | - +studyDirtyCopy: Study?; - +studyRepository: IStudyRepository; - +authRepository: IAuthRepository; - +router: GoRouter; - +studyInfoFormViewModel: StudyInfoFormViewModel; - +enrollmentFormViewModel: EnrollmentFormViewModel; - +measurementsFormViewModel: MeasurementsFormViewModel; - +reportsFormViewModel: ReportsFormViewModel; - +interventionsFormViewModel: InterventionsFormViewModel; + <static>+defaultQuestionType: SurveyQuestionType; + -_titles: Map<FormMode, String Function()>?; + +questionIdControl: FormControl<String>; + +questionTypeControl: FormControl<SurveyQuestionType>; + +questionTextControl: FormControl<String>; + +questionInfoTextControl: FormControl<String>; + +questionBaseControls: Map<String, AbstractControl<dynamic>>; + +isMultipleChoiceControl: FormControl<bool>; + +choiceResponseOptionsArray: FormArray<dynamic>; + +customOptionsMin: int; + +customOptionsMax: int; + +customOptionsInitial: int; + +boolResponseOptionsArray: FormArray<String>; + <static>+kDefaultScaleMinValue: int; + <static>+kDefaultScaleMaxValue: int; + <static>+kNumMidValueControls: int; + <static>+kMidValueDebounceMilliseconds: int; + +scaleMinValueControl: FormControl<int>; + +scaleMaxValueControl: FormControl<int>; + -_scaleRangeControl: FormControl<int>; + +scaleMinLabelControl: FormControl<String>; + +scaleMaxLabelControl: FormControl<String>; + +scaleMidValueControls: FormArray<int>; + +scaleMidLabelControls: FormArray<String?>; + -_scaleResponseOptionsArray: FormArray<int>; + +scaleMinColorControl: FormControl<SerializableColor>; + +scaleMaxColorControl: FormControl<SerializableColor>; + +prevMidValues: List<int?>?; + +freeTextTypeControl: FormControl<FreeTextQuestionType>; + +customRegexControl: FormControl<String>; + +freeTextResponseOptionsArray: FormArray<dynamic>; + +freeTextLengthMin: AbstractControl<int>; + +freeTextLengthMax: AbstractControl<int>; + +freeTextExampleTextControl: FormControl<String>; + <static>+kDefaultFreeTextMinLength: int; + <static>+kDefaultFreeTextMaxLength: int; + +freeTextLengthControl: FormControl<RangeValues>; + -_controlsByQuestionType: Map<SurveyQuestionType, FormGroup>; + -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + -_validationConfigsByQuestionType: Map<SurveyQuestionType, Map<FormValidationSetEnum, List<FormControlValidation>>>; +form: FormGroup; - +isStudyReadonly: bool; + +questionId: String; + +questionType: SurveyQuestionType; + +questionTypeControlOptions: List<FormControlOption<SurveyQuestionType>>; + +answerOptionsArray: FormArray<dynamic>; + +answerOptionsControls: List<AbstractControl<dynamic>>; + +validAnswerOptions: List<String>; + +boolOptions: List<AbstractControl<String>>; + +scaleMinValue: int; + +scaleMaxValue: int; + +scaleRange: int; + +scaleAllValueControls: List<AbstractControl<int>>; +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titles: Map<FormMode, String> + +questionTextRequired: dynamic; + +numValidChoiceOptions: dynamic; + +scaleRangeValid: dynamic; + +titles: Map<FormMode, String>; + +isAddOptionButtonVisible: bool; + +isMidValuesClearedInfoVisible: bool | - +void read(); + +String? scaleMidLabelAt(); + -dynamic _onScaleRangeChanged(); + -dynamic _applyInputFormatters(); + -dynamic _updateScaleMidValueControls(); + -Map<String, dynamic>? _validateFreeText(); + -dynamic _onFreeTextLengthChanged(); + -List<FormControlValidation> _getValidationConfig(); + +dynamic onQuestionTypeChanged(); + +dynamic onResponseOptionsChanged(); + -void _updateFormControls(); + +void initControls(); +void setControlsFrom(); - +Study buildFormData(); - +void dispose(); - +void onCancel(); - +dynamic onSave(); - -dynamic _applyAndSaveSubform() + +QuestionFormData buildFormData(); + +List<ModelAction<dynamic>> availableActions(); + +void onNewItem(); + +void onSelectItem(); + +dynamic save(); + +QuestionFormViewModel createDuplicate() ] - [StudyFormViewModel]o-[Study] - [StudyFormViewModel]o-[<abstract>IStudyRepository] - [StudyFormViewModel]o-[<abstract>IAuthRepository] - [StudyFormViewModel]o-[GoRouter] - [StudyFormViewModel]o-[StudyInfoFormViewModel] - [StudyFormViewModel]o-[EnrollmentFormViewModel] - [StudyFormViewModel]o-[MeasurementsFormViewModel] - [StudyFormViewModel]o-[ReportsFormViewModel] - [StudyFormViewModel]o-[InterventionsFormViewModel] - [StudyFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[StudyFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[StudyFormViewModel] + [QuestionFormViewModel]o-[SurveyQuestionType] + [QuestionFormViewModel]o-[FormControl] + [QuestionFormViewModel]o-[FormArray] + [QuestionFormViewModel]o-[<abstract>AbstractControl] + [QuestionFormViewModel]o-[FormGroup] + [<abstract>ManagedFormViewModel]<:-[QuestionFormViewModel] + [<abstract>IListActionProvider]<:--[QuestionFormViewModel] - [<abstract>IStudyFormData + [SurveyQuestionFormView | - +Study apply() + +formViewModel: QuestionFormViewModel; + +isHtmlStyleable: bool ] - [<abstract>IFormData]<:--[<abstract>IStudyFormData] + [SurveyQuestionFormView]o-[QuestionFormViewModel] - [ReportsFormData - | - +reportItems: List<ReportItemFormData>; - +id: String + [<abstract>IFormDataWithSchedule | - +Study apply(); - +ReportsFormData copy() - ] - - [<abstract>IStudyFormData]<:--[ReportsFormData] - - [ReportStatus + +instanceId: String; + +isTimeLocked: bool; + +timeLockStart: StudyUTimeOfDay?; + +timeLockEnd: StudyUTimeOfDay?; + +hasReminder: bool; + +reminderTime: StudyUTimeOfDay? | - +index: int; - <static>+values: List<ReportStatus>; - <static>+primary: ReportStatus; - <static>+secondary: ReportStatus + +Schedule toSchedule() ] - [ReportStatus]o-[ReportStatus] - [Enum]<:--[ReportStatus] + [<abstract>IFormDataWithSchedule]o-[StudyUTimeOfDay] + [<abstract>IFormData]<:--[<abstract>IFormDataWithSchedule] - [ReportItemFormData + [ScheduleControls | - +isPrimary: bool; - +section: ReportSection; - +id: String + +formViewModel: WithScheduleControls | - <static>+dynamic fromDomainModel(); - +ReportItemFormData copy() + +Widget build(); + -List<FormTableRow> _conditionalTimeRestrictions() ] - [ReportItemFormData]o-[<abstract>ReportSection] - [<abstract>IFormData]<:-[ReportItemFormData] + [ScheduleControls]o-[<abstract>WithScheduleControls] + [<abstract>FormConsumerWidget]<:-[ScheduleControls] - [ReportItemFormViewModel + [<abstract>WithScheduleControls | - <static>+defaultSectionType: ReportSectionType; - +sectionIdControl: FormControl<String>; - +sectionTypeControl: FormControl<ReportSectionType>; - +titleControl: FormControl<String>; - +descriptionControl: FormControl<String>; - +sectionControl: FormControl<ReportSection>; - +dataReferenceControl: FormControl<DataReferenceIdentifier<num>>; - +temporalAggregationControl: FormControl<TemporalAggregationFormatted>; - +improvementDirectionControl: FormControl<ImprovementDirectionFormatted>; - +alphaControl: FormControl<double>; - -_controlsBySectionType: Map<ReportSectionType, FormGroup>; - -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - -_validationConfigsBySectionType: Map<ReportSectionType, Map<FormValidationSetEnum, List<FormControlValidation>>>; - +sectionBaseControls: Map<String, AbstractControl<dynamic>>; - +form: FormGroup; - +sectionId: String; - +sectionType: ReportSectionType; - <static>+sectionTypeControlOptions: List<FormControlOption<ReportSectionType>>; - <static>+temporalAggregationControlOptions: List<FormControlOption<TemporalAggregationFormatted>>; - <static>+improvementDirectionControlOptions: List<FormControlOption<ImprovementDirectionFormatted>>; - +titles: Map<FormMode, String>; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titleRequired: dynamic; - +descriptionRequired: dynamic; - +dataReferenceRequired: dynamic; - +aggregationRequired: dynamic; - +improvementDirectionRequired: dynamic; - +alphaConfidenceRequired: dynamic + +isTimeRestrictedControl: FormControl<bool>; + +instanceID: FormControl<String>; + +restrictedTimeStartControl: FormControl<Time>; + +restrictedTimeStartPickerControl: FormControl<TimeOfDay>; + +restrictedTimeEndControl: FormControl<Time>; + +restrictedTimeEndPickerControl: FormControl<TimeOfDay>; + +hasReminderControl: FormControl<bool>; + +reminderTimeControl: FormControl<Time>; + +reminderTimePickerControl: FormControl<TimeOfDay>; + -_reminderControlStream: StreamSubscription<dynamic>?; + +scheduleFormControls: Map<String, FormControl<Object>>; + +hasReminder: bool; + +isTimeRestricted: bool; + +timeRestriction: List<Time>? | - -List<FormControlValidation> _getValidationConfig(); - +ReportItemFormData buildFormData(); - +ReportItemFormViewModel createDuplicate(); - +dynamic onSectionTypeChanged(); - -void _updateFormControls(); - +void setControlsFrom() + +void setScheduleControlsFrom(); + -dynamic _initReminderControl() ] - [ReportItemFormViewModel]o-[ReportSectionType] - [ReportItemFormViewModel]o-[FormControl] - [ReportItemFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[ReportItemFormViewModel] + [<abstract>WithScheduleControls]o-[FormControl] + [<abstract>WithScheduleControls]o-[StreamSubscription] - [LinearRegressionSectionFormView - | - +formViewModel: ReportItemFormViewModel; - +studyId: String; - +reportSectionColumnWidth: Map<int, TableColumnWidth> + [<abstract>StudyDesignPageWidget | - +Widget build() + +Widget? banner() ] - [LinearRegressionSectionFormView]o-[ReportItemFormViewModel] - [<abstract>ConsumerWidget]<:-[LinearRegressionSectionFormView] + [<abstract>StudyPageWidget]<:-[<abstract>StudyDesignPageWidget] - [AverageSectionFormView - | - +formViewModel: ReportItemFormViewModel; - +studyId: String; - +reportSectionColumnWidth: Map<int, TableColumnWidth> + [StudiesTableColumnHeader | - +Widget build() + +title: String; + +sortable: bool; + +sortAscending: bool; + +sortingActive: bool; + +onSort: void Function()? ] - [AverageSectionFormView]o-[ReportItemFormViewModel] - [<abstract>ConsumerWidget]<:-[AverageSectionFormView] + [StudiesTableColumnHeader]o-[void Function()?] - [TemporalAggregationFormatted - | - -_value: TemporalAggregation; - <static>+values: List<TemporalAggregationFormatted>; - +value: TemporalAggregation; - +string: String; - +icon: IconData?; - +hashCode: int + [DashboardScreen | - +bool ==(); - +String toString(); - +String toJson(); - <static>+TemporalAggregationFormatted fromJson() + +filter: StudiesFilter? ] - [TemporalAggregationFormatted]o-[TemporalAggregation] - [TemporalAggregationFormatted]o-[IconData] + [DashboardScreen]o-[StudiesFilter] - [ImprovementDirectionFormatted + [DashboardScaffold | - -_value: ImprovementDirection; - <static>+values: List<ImprovementDirectionFormatted>; - +value: ImprovementDirection; - +string: String; - +icon: IconData?; - +hashCode: int + <static>+compactWidthThreshold: double; + +body: Widget | - +bool ==(); - +String toString(); - +String toJson(); - <static>+ImprovementDirectionFormatted fromJson() + +Widget build() ] - [ImprovementDirectionFormatted]o-[ImprovementDirection] - [ImprovementDirectionFormatted]o-[IconData] + [DashboardScaffold]o-[<abstract>Widget] - [ReportSectionType + [DashboardController | - +index: int; - <static>+values: List<ReportSectionType>; - <static>+average: ReportSectionType; - <static>+linearRegression: ReportSectionType + +studyRepository: IStudyRepository; + +authRepository: IAuthRepository; + +userRepository: IUserRepository; + +router: GoRouter; + -_studiesSubscription: StreamSubscription<List<WrappedModel<Study>>>?; + +searchController: SearchController; + +isSortAscending: bool + | + -dynamic _subscribeStudies(); + +dynamic setSearchText(); + +dynamic setStudiesFilter(); + +dynamic onSelectStudy(); + +dynamic onClickNewStudy(); + +dynamic pinStudy(); + +dynamic pinOffStudy(); + +void setSorting(); + +void filterStudies(); + +void sortStudies(); + +bool isSortingActiveForColumn(); + +bool isPinned(); + +List<ModelAction<dynamic>> availableActions(); + +void dispose() ] - [ReportSectionType]o-[ReportSectionType] - [Enum]<:--[ReportSectionType] + [DashboardController]o-[<abstract>IStudyRepository] + [DashboardController]o-[<abstract>IAuthRepository] + [DashboardController]o-[<abstract>IUserRepository] + [DashboardController]o-[GoRouter] + [DashboardController]o-[StreamSubscription] + [DashboardController]o-[SearchController] + [<abstract>IModelActionProvider]<:--[DashboardController] - [DataReferenceEditor - | - +formControl: FormControl<DataReferenceIdentifier<T>>; - +availableTasks: List<Task>; - +buildReactiveDropdownField: ReactiveDropdownField<dynamic> + [StudiesFilter | - +FormTableRow buildFormTableRow(); - -List<DropdownMenuItem<DataReferenceIdentifier<dynamic>>> _dataReferenceItems() + +index: int; + <static>+values: List<StudiesFilter> ] - [DataReferenceEditor]o-[FormControl] - [DataReferenceEditor]o-[ReactiveDropdownField] + [Enum]<:--[StudiesFilter] - [DataReferenceIdentifier + [StudiesTableColumnSize | - +hashCode: int + +collapsed: bool; + +flex: int?; + +width: double? | - +bool ==() + +Widget createContainer() ] - [DataReference]<:-[DataReferenceIdentifier] - - [ReportItemFormView + [StudiesTable | - +formViewModel: ReportItemFormViewModel; - +studyId: String; - +reportSectionColumnWidth: dynamic; - +sectionTypeBodyBuilder: Widget Function(BuildContext) + +itemHeight: double; + +itemPadding: double; + +rowSpacing: double; + +columnSpacing: double; + +compactWidthThreshold: double; + +superCompactWidthThreshold: double; + +compactStatTitleThreshold: double; + +studies: List<Study>; + +onSelect: void Function(Study); + +getActions: List<ModelAction<dynamic>> Function(Study); + +emptyWidget: Widget; + +pinnedStudies: Iterable<String>; + +dashboardController: DashboardController | +Widget build(); - -dynamic _buildSectionText(); - -dynamic _buildSectionTypeHeader() + -Widget _buildColumnHeader() ] - [ReportItemFormView]o-[ReportItemFormViewModel] - [ReportItemFormView]o-[Widget Function(BuildContext)] + [StudiesTable]o-[void Function(Study)] + [StudiesTable]o-[List<ModelAction<dynamic>> Function(Study)] + [StudiesTable]o-[<abstract>Widget] + [StudiesTable]o-[DashboardController] - [StudyDesignReportsFormView + [StudiesTableColumn | - +Widget build(); - -dynamic _showReportItemSidesheetWithArgs() + +index: int; + <static>+values: List<StudiesTableColumn>; + <static>+pin: StudiesTableColumn; + <static>+title: StudiesTableColumn; + <static>+status: StudiesTableColumn; + <static>+participation: StudiesTableColumn; + <static>+createdAt: StudiesTableColumn; + <static>+enrolled: StudiesTableColumn; + <static>+active: StudiesTableColumn; + <static>+completed: StudiesTableColumn; + <static>+action: StudiesTableColumn ] - [<abstract>StudyDesignPageWidget]<:-[StudyDesignReportsFormView] + [StudiesTableColumn]o-[StudiesTableColumn] + [Enum]<:--[StudiesTableColumn] - [ReportsFormViewModel + [StudiesTableItem | +study: Study; - +router: GoRouter; - +reportItemDelegate: ReportFormItemDelegate; - +reportItemArray: FormArray<dynamic>; - +reportItemFormViewModels: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData>; - +form: FormGroup; - +reportItemModels: List<ReportItemFormViewModel>; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titles: Map<FormMode, String>; - +canTestConsent: bool - | - +void setControlsFrom(); - +ReportsFormData buildFormData(); - +void read(); - +ReportItemFormRouteArgs buildNewReportItemFormRouteArgs(); - +ReportItemFormRouteArgs buildReportItemFormRouteArgs(); - +dynamic testReport(); - +void onCancel(); - +dynamic onSave(); - +ReportItemFormViewModel provide() + +itemHeight: double; + +itemPadding: double; + +rowSpacing: double; + +columnSpacing: double; + +actions: List<ModelAction<dynamic>>; + +columnSizes: List<StudiesTableColumnSize>; + +isPinned: bool; + +onPinnedChanged: void Function(Study, bool)?; + +onTap: void Function(Study)? ] - [ReportsFormViewModel]o-[Study] - [ReportsFormViewModel]o-[GoRouter] - [ReportsFormViewModel]o-[ReportFormItemDelegate] - [ReportsFormViewModel]o-[FormArray] - [ReportsFormViewModel]o-[FormViewModelCollection] - [ReportsFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[ReportsFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[ReportsFormViewModel] - [<abstract>IProviderArgsResolver]<:--[ReportsFormViewModel] + [StudiesTableItem]o-[Study] + [StudiesTableItem]o-[void Function(Study, bool)?] + [StudiesTableItem]o-[void Function(Study)?] - [ReportFormItemDelegate - | - +formViewModelCollection: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData>; - +owner: ReportsFormViewModel; - +propagateOnSave: bool; - +validationSet: dynamic - | - +void onCancel(); - +dynamic onSave(); - +ReportItemFormViewModel provide(); - +List<ModelAction<dynamic>> availableActions(); - +void onNewItem(); - +void onSelectItem() + [App ] - [ReportFormItemDelegate]o-[FormViewModelCollection] - [ReportFormItemDelegate]o-[ReportsFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[ReportFormItemDelegate] - [<abstract>IListActionProvider]<:--[ReportFormItemDelegate] - [<abstract>IProviderArgsResolver]<:--[ReportFormItemDelegate] - - [ReportBadge - | - +status: ReportStatus?; - +type: BadgeType; - +showPrefixIcon: bool; - +showTooltip: bool - | - +Widget build() + [AppContent ] - [ReportBadge]o-[ReportStatus] - [ReportBadge]o-[BadgeType] - [AccountSettingsDialog | +Widget build() @@ -2340,1569 +2402,1748 @@ - + - + - + - - - + - + - + + + + + + + - + - + - + - + - + - + + + - + - + + + - + - + + + - + - - + + + + + - - + + + - + - - + + + + + + + + + + + - - + - + - - - + - + - + - + - + - + - + - + - - - + - + - + - + - + - + - + - + + + + - - - + + - + + + + - + + - + - + - - - - - - + + - + - + - + - + - + - + - + - - - + - + - + - + - + - + - + - + - - - - - - - + - + + + + + + - + + - + - + - + - + - + - - - + - + - + + + - + - + - + - + - - + + - + - + + + - + - + - + - + - + - + - + - + - + - - - + + - - - - - + + - + + + + - + + - + - + - + + + + + + - + + + + - + - + + + - + - - - - + + + - - + - + - + - + - - - - - + - + - + - + - + - + - + - + - + + + + + + + + + - + - + + + - + - + - + - - + + + - - + - + - + - + - + - + - + - + - + - + - + + + + + - + - + - + + + + + - + - - + + - + - + - + - + - - - - + - - + - + - + - + - + - + + + + + + + + - + + - + - + - + - + - + - + - + - + - + - + - + - + + + - + - + - + - + - + - - - - + + + - - - + + + + + + + - - + + + - + - - - + - + - + - + - + - + - + - + - + - + - - + + + + + + + + + + + - - + - + - - + + + + + - - + + + + + - + - - - - + + + - - + - + - + - + - + - + + + + + + + + + + + + + + + + - + + - + - + - + - + + + + + - + - + - + - - - + + + - + + + + - + + - + - + - + + + + - + + - + - + - + - - - + - + - + - + - + - + + + + + + + + + + + + + + - + + + + - + - - - + + + - + - + - + - - - - + + + - - - - - - - - - - + - + - + - + - - - - + + + - - + - + - + - - - - - - + + - + - - - + + + + + - + - - - + + + - + - + - - - - + - - + - + - + + + - + - - - + - + - - - + - + - - - + - + - + - + - + - + - + - + - + - + + + + + + - - + - + - - + + - + - + - + - + - + - + - + - + + + + + + - - + - + - + - - + + - + - - - - - + + - - - + + + - + + - + - + - + - + - + - + + + + + - + - - - + + - - + - + - + - + - + - + - - + + - + - - + + + - - + + + - + - - - + + + - + - + - + - - - + - + + + + + + + - - - - - - - - + - - - + + + - - - + + + - - - - - - - + + + + - + - + - + - + - + - + - + - + - + - - - - + + - + - + - + - + - + - - - - + + - + - + - + - + + + - + - + - - - - + - - + + + + + - + - + + + + + - + - - - + - + - + - + + + + - - - + + - + - - + + - + - - - - - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - + + + + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - - - - - - - - - - - - - - + - - + - + - - - + - + - - - + - + - + - + - + - - - - - - - - - - + - + + - + - - - + + + + - - + - + - - - - - - - - - - - - + + - + - + - + - - + + - + - - - + + - + + + + + + - + - - - + + + - + - + + + - + - + + + - + - - - + + - + + - + - + - + - + + + - + - + + + - + - + - + - + - - - - - - - - - - - - - - + - - + - - - - + - - + - + - - - - - + + + + - + + - + - + - + - - - - - + + - - - + + - + - - - + + + - + - + - + - + + + - + - + - + - + - + - - + + + - - + - + - + - + - - - + - + - + - + - - - + - + + + + + + + + - + + - + - + - + - + - + - + - + - + - + - - - + - - - + + + + - - + - + - + - + - - + + + + + + + + + + IAppDelegate + + + + + + +dynamic onAppStart() + + + - - - + + + + + + + + + AppController + + + + + + +sharedPreferences: SharedPreferences + +appDelegates: List<IAppDelegate> + -_delayedFuture: dynamic + +isInitialized: dynamic + + + + + + +dynamic onAppStart() + -dynamic _callDelegates() + + + - - - + + + + + + + SharedPreferences + + + - - - - + + + + + + + + + ParticipantDetailsFormView + + + + + + +formViewModel: ParticipantDetailsFormViewModel + + + + + + +Widget build() + + + - - - + + + + + + + + + ParticipantDetailsFormViewModel + + + + + + +participantIdControl: FormControl<String> + +rawDataControl: FormControl<String> + +form: FormGroup + +titles: Map<FormMode, String> + + + + + + +void initControls() + +StudyMonitorItem buildFormData() + +void setControlsFrom() + + + - - - - - - - + + + - - - SignupForm + + + FormConsumerWidget - - - +formKey: AuthFormKey + + + + + + + + + StudyMonitorScreen - - - +Widget build() - -dynamic _onClickTermsOfUse() - -dynamic _onClickPrivacyPolicy() + + + +Widget build() + -Widget _monitorSectionHeader() + -Widget _buildStat() + -dynamic _onSelectParticipant() - - - - + + + + + - - - AuthFormKey + + + StudyPageWidget - - - +index: int - <static>+values: List<AuthFormKey> - <static>+login: AuthFormKey - <static>+signup: AuthFormKey - <static>+passwordForgot: AuthFormKey - <static>+passwordRecovery: AuthFormKey - <static>-_loginSubmit: AuthFormKey - <static>-_signupSubmit: AuthFormKey + + + +studyId: String + + + + + + +Widget? banner() - - - + + + + + - - - FormConsumerRefWidget + + + StudyMonitorItem + + + + + + +participantId: String + +inviteCode: String? + +enrolledAt: DateTime + +lastActivityAt: DateTime + +currentDayOfStudy: int + +studyDurationInDays: int + +completedInterventions: int + +missedInterventions: int + +completedSurveys: int + +missedSurveys: int + +rawData: String + +props: List<Object?> + + + + + + <static>+List<StudyMonitorItem> fromStudy() - - - - - + + + - - - AuthFormController + + + Equatable - - - +authRepository: IAuthRepository - +sharedPreferences: SharedPreferences - +notificationService: INotificationService - +router: GoRouter - +emailControl: FormControl<String> - +passwordControl: FormControl<String> - +passwordConfirmationControl: FormControl<String> - +rememberMeControl: FormControl<bool> - +termsOfServiceControl: FormControl<bool> - <static>+authValidationMessages: Map<String, String Function(dynamic)> - +loginForm: FormGroup - +signupForm: FormGroup - +passwordForgotForm: FormGroup - +passwordRecoveryForm: FormGroup - +controlValidatorsByForm: Map<AuthFormKey, Map<FormControl<dynamic>, List<Validator<dynamic>>>> - -_formKey: AuthFormKey - +shouldRemember: bool - +formKey: AuthFormKey - +form: FormGroup + + + + + + + + + + StudyMonitorTable - - - -dynamic _getFormFor() - -dynamic _onChangeFormKey() - +dynamic resetControlsFor() - -dynamic _forceValidationMessages() - +dynamic signUp() - -dynamic _signUp() - +dynamic signIn() - -dynamic _signInWith() - +dynamic signOut() - +dynamic resetPasswordForEmail() - +dynamic sendPasswordResetLink() - +dynamic recoverPassword() - +dynamic updateUser() - -dynamic _readDebugUser() - -void _setRememberMe() - -void _delRememberMe() - -void _initRememberMe() + + + +studyMonitorItems: List<StudyMonitorItem> + +onSelectItem: void Function(StudyMonitorItem) + + + + + + +Widget build() + -List<Widget> _buildRow() + -String _formatTime() + -Widget _buildProgressCell() - - - + + + - - - IAuthRepository + + + void Function(StudyMonitorItem) + + + + + + + + + + + FormControl + + + + + + + + + + + FormGroup + + + + + + + + + + + + + FormViewModel + + + + + + -_formData: T? + -_formMode: FormMode + -_validationSet: FormValidationSetEnum? + +delegate: IFormViewModelDelegate<FormViewModel<dynamic>>? + +autosave: bool + -_immediateFormChildrenSubscriptions: List<StreamSubscription<dynamic>> + -_immediateFormChildrenListenerDebouncer: Debouncer? + -_autosaveOperation: CancelableOperation<dynamic>? + -_defaultControlValidators: Map<String, Tuple<List<Validator<dynamic>>, List<AsyncValidator<dynamic>>>> + +prevFormValue: Map<String, dynamic>? + <static>-_formKey: String + +formData: T? + +formMode: FormMode + +isReadonly: bool + +validationSet: FormValidationSetEnum? + +isDirty: bool + +title: String + +isValid: bool + +titles: Map<FormMode, String> + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + + + + + + -dynamic _setFormData() + -dynamic _rememberDefaultControlValidators() + -Tuple<List<Validator<dynamic>>, List<AsyncValidator<dynamic>>>? _getDefaultValidators() + -dynamic _disableAllControls() + -dynamic _formModeUpdated() + -dynamic _restoreControlsFromFormData() + +void revalidate() + -void _applyValidationSet() + +void read() + +dynamic save() + +dynamic cancel() + +void enableAutosave() + +void listenToImmediateFormChildren() + +dynamic markFormGroupChanged() + +void dispose() + +void setControlsFrom() + +T buildFormData() + +void initControls() - - - + + + + + - - - SharedPreferences + + + LoginForm - - - - + + + +formKey: AuthFormKey + + - - - INotificationService + + + +Widget build() - - - + + + + - - - GoRouter + + + AuthFormKey - - - - - - - - FormControl + + + +index: int + <static>+values: List<AuthFormKey> + <static>+login: AuthFormKey + <static>+signup: AuthFormKey + <static>+passwordForgot: AuthFormKey + <static>+passwordRecovery: AuthFormKey + <static>-_loginSubmit: AuthFormKey + <static>-_signupSubmit: AuthFormKey - - - + + + - - - FormGroup + + + FormConsumerRefWidget - - - - + + + + + - - - IFormGroupController + + + PasswordRecoveryForm - - - +form: FormGroup + + + +formKey: AuthFormKey - - - - - - - - Enum + + + +Widget build() - - - + + + - + PasswordForgotForm - + +formKey: AuthFormKey - + +Widget build() - - - - - - - - EmailTextField - - - - - - +labelText: String - +hintText: String? - +formControlName: String? - +formControl: FormControl<dynamic>? - - - - - - - - - - - - PasswordTextField - - - - - - +labelText: String - +hintText: String? - +onSubmitted: dynamic Function(FormControl<dynamic>)? - +formControlName: String? - +formControl: FormControl<dynamic>? - - - - - - - - - - - dynamic Function(FormControl<dynamic>)? - - - - - - - - - + + + + + - - - PasswordRecoveryForm + + + SignupForm - - - +formKey: AuthFormKey + + + +formKey: AuthFormKey - - - +Widget build() + + + +Widget build() + -dynamic _onClickTermsOfUse() + -dynamic _onClickPrivacyPolicy() - - + + - + AuthScaffold - + +body: Widget +formKey: AuthFormKey @@ -3915,9 +4156,9 @@ - + - + Widget @@ -3926,1916 +4167,1817 @@ - + - + EdgeInsets - - - - - - - - StudyUJobsToBeDone - - - - - - +Widget build() - - - - - - - - - - - - - LoginForm - - - - - - +formKey: AuthFormKey - - - - - - +Widget build() - - - - - - - - - - - - IAppDelegate - - - - - - +dynamic onAppStart() - - - - - - - - - - - - - AppController - - + + + + - - - +sharedPreferences: SharedPreferences - +appDelegates: List<IAppDelegate> - -_delayedFuture: dynamic - +isInitialized: dynamic + + + EmailTextField - - - +dynamic onAppStart() - -dynamic _callDelegates() + + + +labelText: String + +hintText: String? + +formControlName: String? + +formControl: FormControl<dynamic>? - - - + + + + - - - App + + + PasswordTextField - - - - - - - - AppContent + + + +labelText: String + +hintText: String? + +onSubmitted: dynamic Function(FormControl<dynamic>)? + +formControlName: String? + +formControl: FormControl<dynamic>? - - - - - - - - AppStatus - - + + + - - - +index: int - <static>+values: List<AppStatus> - <static>+initializing: AppStatus - <static>+initialized: AppStatus + + + dynamic Function(FormControl<dynamic>)? - - - - + + + + - - - StudyAnalyzeScreen + + + StudyUJobsToBeDone - - - +Widget? banner() - +Widget build() + + + +Widget build() - - - - - + + + + + - - - StudyPageWidget + + + AuthFormController - - - +studyId: String + + + +authRepository: IAuthRepository + +sharedPreferences: SharedPreferences + +notificationService: INotificationService + +router: GoRouter + +emailControl: FormControl<String> + +passwordControl: FormControl<String> + +passwordConfirmationControl: FormControl<String> + +rememberMeControl: FormControl<bool> + +termsOfServiceControl: FormControl<bool> + <static>+authValidationMessages: Map<String, String Function(dynamic)> + +loginForm: FormGroup + +signupForm: FormGroup + +passwordForgotForm: FormGroup + +passwordRecoveryForm: FormGroup + +controlValidatorsByForm: Map<AuthFormKey, Map<FormControl<dynamic>, List<Validator<dynamic>>>> + -_formKey: AuthFormKey + +shouldRemember: bool + +formKey: AuthFormKey + +form: FormGroup - - - +Widget? banner() + + + -dynamic _getFormFor() + -dynamic _onChangeFormKey() + +dynamic resetControlsFor() + -dynamic _forceValidationMessages() + +dynamic signUp() + -dynamic _signUp() + +dynamic signIn() + -dynamic _signInWith() + +dynamic signOut() + +dynamic resetPasswordForEmail() + +dynamic sendPasswordResetLink() + +dynamic recoverPassword() + +dynamic updateUser() + -dynamic _readDebugUser() + -void _setRememberMe() + -void _delRememberMe() + -void _initRememberMe() - - - - + + + - - - StudyAnalyzeController + + + IAuthRepository - - - +dynamic onExport() + + + + + + + + INotificationService - - - - - + + + - - - StudyBaseController + + + GoRouter - - - +studyId: String - +studyRepository: IStudyRepository - +router: GoRouter - +studySubscription: StreamSubscription<WrappedModel<Study>>? + + + + + + + + + IFormGroupController - - - +dynamic subscribeStudy() - +dynamic onStudySubscriptionUpdate() - +dynamic onStudySubscriptionError() - +void dispose() + + + +form: FormGroup - - - - - + + + - - - StudyParticipationBadge + + + Enum - - - +participation: Participation - +type: BadgeType - +showPrefixIcon: bool - +center: bool - - + + + + + - - - +Widget build() + + + AppStatus - - - - - - - - Participation + + + +index: int + <static>+values: List<AppStatus> + <static>+initializing: AppStatus + <static>+initialized: AppStatus - - - + + + + + - - - BadgeType + + + FormArrayTable - - - - - - - - - PreviewFrame + + + +control: AbstractControl<dynamic> + +items: List<T> + +onSelectItem: void Function(T) + +getActionsAt: List<ModelAction<dynamic>> Function(T, int) + +onNewItem: void Function()? + +rowTitle: String Function(T) + +onNewItemLabel: String + +sectionTitle: String? + +sectionDescription: String? + +emptyIcon: IconData? + +emptyTitle: String? + +emptyDescription: String? + +sectionTitleDivider: bool? + +rowPrefix: Widget Function(BuildContext, T, int)? + +rowSuffix: Widget Function(BuildContext, T, int)? + +leadingWidget: Widget? + +itemsSectionPadding: EdgeInsets? + +hideLeadingTrailingWhenEmpty: bool + <static>+columns: List<StandardTableColumn> - - - +studyId: String - +routeArgs: StudyFormRouteArgs? - +route: String? + + + +Widget build() + -List<Widget> _buildRow() + -Widget _newItemButton() - - - + + + - - - StudyFormRouteArgs + + + AbstractControl - - - - - + + + - - - FrameControlsWidget + + + void Function(T) - - - +onRefresh: void Function()? - +onOpenNewTab: void Function()? - +enabled: bool - - + + + + - - - +Widget build() + + + List<ModelAction<dynamic>> Function(T, int) - + - + void Function()? - - - + + + - - - ConsumerWidget + + + String Function(T) - - - - - - - - IStudyNavViewModel - - + + + - - - +isEditTabEnabled: bool - +isTestTabEnabled: bool - +isRecruitTabEnabled: bool - +isMonitorTabEnabled: bool - +isAnalyzeTabEnabled: bool - +isSettingsEnabled: bool + + + IconData - - - - + + + - - - StudyNav + + + Widget Function(BuildContext, T, int)? - - - <static>+dynamic tabs() - <static>+dynamic edit() - <static>+dynamic test() - <static>+dynamic recruit() - <static>+dynamic monitor() - <static>+dynamic analyze() + + + + + + + + + ManagedFormViewModel - - - - - - - - - StudyDesignNav + + + +ManagedFormViewModel<T> createDuplicate() - - - <static>+dynamic tabs() - <static>+dynamic info() - <static>+dynamic enrollment() - <static>+dynamic interventions() - <static>+dynamic measurements() - <static>+dynamic reports() + + + + + + + + FormViewModelNotFoundException - - - - - + + + - - - StudySettingsFormViewModel + + + Exception - - - +study: AsyncValue<Study> - +studyRepository: IStudyRepository - <static>+defaultPublishedToRegistry: bool - <static>+defaultPublishedToRegistryResults: bool - +isPublishedToRegistryControl: FormControl<bool> - +isPublishedToRegistryResultsControl: FormControl<bool> - +form: FormGroup - +titles: Map<FormMode, String> + + + + + + + + + + FormViewModelCollection - - - +void setControlsFrom() - +Study buildFormData() - +dynamic keepControlsSynced() - +dynamic save() - +dynamic setLaunchDefaults() + + + +formViewModels: List<T> + +formArray: FormArray<dynamic> + +stagedViewModels: List<T> + +retrievableViewModels: List<T> + +formData: List<D> - - - - - - - - AsyncValue + + + +void add() + +T remove() + +T? findWhere() + +T? removeWhere() + +bool contains() + +void stage() + +T commit() + +void reset() + +void read() - - - + + + - - - IStudyRepository + + + FormArray - - - - - + + + + + - - - FormViewModel + + + CustomFormControl - - - -_formData: T? - -_formMode: FormMode - -_validationSet: FormValidationSetEnum? - +delegate: IFormViewModelDelegate<FormViewModel<dynamic>>? - +autosave: bool - -_immediateFormChildrenSubscriptions: List<StreamSubscription<dynamic>> - -_immediateFormChildrenListenerDebouncer: Debouncer? - -_autosaveOperation: CancelableOperation<dynamic>? - -_defaultControlValidators: Map<String, Tuple<List<Validator<dynamic>>, List<AsyncValidator<dynamic>>>> - +prevFormValue: Map<String, dynamic>? - <static>-_formKey: String - +formData: T? - +formMode: FormMode - +isReadonly: bool - +validationSet: FormValidationSetEnum? - +isDirty: bool - +title: String - +isValid: bool - +titles: Map<FormMode, String> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + + + -_onValueChangedDebouncer: Debouncer? + -_onStatusChangedDebouncer: Debouncer? + +onValueChanged: void Function(T?)? + +onStatusChanged: void Function(ControlStatus)? + +onStatusChangedDebounceTime: int? + +onValueChangedDebounceTime: int? - - - -dynamic _setFormData() - -dynamic _rememberDefaultControlValidators() - -Tuple<List<Validator<dynamic>>, List<AsyncValidator<dynamic>>>? _getDefaultValidators() - -dynamic _disableAllControls() - -dynamic _formModeUpdated() - -dynamic _restoreControlsFromFormData() - +void revalidate() - -void _applyValidationSet() - +void read() - +dynamic save() - +dynamic cancel() - +void enableAutosave() - +void listenToImmediateFormChildren() - +dynamic markFormGroupChanged() - +void dispose() - +void setControlsFrom() - +T buildFormData() - +void initControls() + + + +void dispose() - - - - + + + - - - StudySettingsDialog + + + Debouncer - - - +Widget build() + + + + + + + + void Function(T?)? - - - - - + + + - - - StudyTestScreen + + + void Function(ControlStatus)? - - - +previewRoute: String? + + + + + + + + + UnsavedChangesDialog - - - +Widget build() - +Widget? banner() - +dynamic load() - +dynamic save() - +dynamic showHelp() + + + +Widget build() - - - + + + - - - StreamSubscription + + + FormValidationSetEnum - - - - + + + + + - - - StudyTestController + + + FormControlValidation - - - +authRepository: IAuthRepository - +languageCode: String + + + +control: AbstractControl<dynamic> + +validators: List<Validator<dynamic>> + +asyncValidators: List<AsyncValidator<dynamic>>? + +validationMessages: Map<String, String Function(Object)> + + + + + + +FormControlValidation merge() - - - - - + + + + + - - - WebFrame + + + IFormData - - - +previewSrc: String - +studyId: String + + + +id: String - - - +Widget build() + + + +IFormData copy() - - - - - - - - DisabledFrame - - + + + - - - +Widget build() + + + FormInvalidException - - - - - + + + + - - - PhoneContainer + + + FormConfigException - - - <static>+defaultWidth: double - <static>+defaultHeight: double - +width: double - +height: double - +borderColor: Color - +borderWidth: double - +borderRadius: double - +innerContent: Widget - +innerContentBackgroundColor: Color? + + + +message: String? - - - +Widget build() + + + + + + + + + IFormViewModelDelegate - - - - - - - - Color + + + +dynamic onSave() + +void onCancel() - - - - + + + + - - - MobileFrame + + + FormControlOption - - - +Widget build() + + + +value: T + +label: String + +description: String? + +props: List<Object?> - - - - + + + + - - - DesktopFrame + + + FormMode - - - +Widget build() + + + +index: int + <static>+values: List<FormMode> + <static>+create: FormMode + <static>+readonly: FormMode + <static>+edit: FormMode - - - - + + + - - - IStudyAppBarViewModel + + + CancelableOperation - - - +isSyncIndicatorVisible: bool - +isStatusBadgeVisible: bool - +isPublishVisible: bool + + + + + + + + + + EnrolledBadge - - - - - - - - - IStudyStatusBadgeViewModel + + + +enrolledCount: int - - - +studyParticipation: Participation? - +studyStatus: StudyStatus? + + + +Widget build() - - - - + + + + + - - - StudyScaffold + + + StudyRecruitController - - - +studyId: String - +tabs: List<NavbarTab>? - +tabsSubnav: List<NavbarTab>? - +selectedTab: NavbarTab? - +selectedTabSubnav: NavbarTab? - +body: StudyPageWidget - +drawer: Widget? - +disableActions: bool - +actionsSpacing: double - +actionsPadding: double - +layoutType: SingleColumnLayoutType? - +appbarHeight: double - +appbarSubnavHeight: double + + + +inviteCodeRepository: IInviteCodeRepository + -_invitesSubscription: StreamSubscription<List<WrappedModel<StudyInvite>>>? + + + + + + -dynamic _subscribeInvites() + +Intervention? getIntervention() + +int getParticipantCountForInvite() + +List<ModelAction<dynamic>> availableActions() + +List<ModelAction<dynamic>> availableInlineActions() + +void dispose() - - - + + + - - - NavbarTab + + + IInviteCodeRepository - - - + + + - - - SingleColumnLayoutType + + + StreamSubscription - - - - - + + + + + - - - RouteInformation + + + StudyBaseController - - - +route: String? - +extra: String? - +cmd: String? - +data: String? + + + +studyId: String + +studyRepository: IStudyRepository + +router: GoRouter + +studySubscription: StreamSubscription<WrappedModel<Study>>? - - - +String toString() + + + +dynamic subscribeStudy() + +dynamic onStudySubscriptionUpdate() + +dynamic onStudySubscriptionError() + +void dispose() - - - - - + + + - - - PlatformController + + + IModelActionProvider - - - +studyId: String - +baseSrc: String - +previewSrc: String - +routeInformation: RouteInformation - +frameWidget: Widget + + + + + + + + + StudyRecruitScreen - - - +void activate() - +void registerViews() - +void generateUrl() - +void navigate() - +void refresh() - +void listen() - +void send() - +void openNewPage() + + + +Widget build() + -Widget _inviteCodesSectionHeader() + -Widget _newInviteCodeButton() + -dynamic _onSelectInvite() - - - - - - - - - WebController - - + + + + + - - - +iFrameElement: IFrameElement + + + InviteCodeFormView - - - +void activate() - +void registerViews() - +void generateUrl() - +void navigate() - +void refresh() - +void openNewPage() - +void listen() - +void send() + + + +formViewModel: InviteCodeFormViewModel - - - - - - - - IFrameElement + + + +Widget build() + -List<FormTableRow> _conditionalInterventionRows() - - - - + + + + + - - - MobileController + + + InviteCodeFormViewModel - - - +void openNewPage() - +void refresh() - +void registerViews() - +void listen() - +void send() - +void navigate() - +void activate() - +void generateUrl() + + + +study: Study + +inviteCodeRepository: IInviteCodeRepository + +codeControl: FormControl<String> + +codeControlValidationMessages: Map<String, String Function(dynamic)> + +isPreconfiguredScheduleControl: FormControl<bool> + +preconfiguredScheduleTypeControl: FormControl<PhaseSequence> + +interventionAControl: FormControl<String> + +interventionBControl: FormControl<String> + +form: FormGroup + +titles: Map<FormMode, String> + +interventionControlOptions: List<FormControlOption<String>> + +preconfiguredScheduleTypeOptions: List<FormControlOption<PhaseSequence>> + +isPreconfiguredSchedule: bool + +preconfiguredSchedule: List<String>? - - - - - - - - StudyStatus + + + +void initControls() + -dynamic _uniqueInviteCode() + +void regenerateCode() + -String _generateCode() + +StudyInvite buildFormData() + +void setControlsFrom() + +dynamic save() - - - - - + + + + + - - - StudyStatusBadge + + + StudyInvitesTable - - - +participation: Participation? - +status: StudyStatus? - +type: BadgeType - +showPrefixIcon: bool - +showTooltip: bool + + + +invites: List<StudyInvite> + +onSelect: void Function(StudyInvite) + +getActions: List<ModelAction<dynamic>> Function(StudyInvite) + +getInlineActions: List<ModelAction<dynamic>> Function(StudyInvite) + +getIntervention: Intervention? Function(String) + +getParticipantCountForInvite: int Function(StudyInvite) - - - +Widget build() + + + +Widget build() + -List<Widget> _buildRow() - - - - + + + - - - TestAppRoutes + + + void Function(StudyInvite) - - - <static>+studyOverview: String - <static>+eligibility: String - <static>+intervention: String - <static>+consent: String - <static>+journey: String - <static>+dashboard: String + + + + + + + + List<ModelAction<dynamic>> Function(StudyInvite) - - - + + + - - - IWithBanner + + + Intervention? Function(String) - - - - - + + + - - - StudyController + + + int Function(StudyInvite) - - - +notificationService: INotificationService - +studyEventsSubscription: StreamSubscription<ModelEvent<Study>>? - +studyActions: List<ModelAction<dynamic>> - - + + + + - - - +dynamic syncStudyStatus() - +dynamic onStudySubscriptionUpdate() - -dynamic _redirectNewToActualStudyID() - +dynamic publishStudy() - +void onChangeStudyParticipation() - +void onAddParticipants() - +void onSettingsPressed() - +void dispose() + + + Study - - - - + + + + - - - StudyMonitorScreen + + + PublishSuccessDialog - - - +Widget build() + + + +Widget build() - - - - + + + + - - - StudiesTableColumnHeader + + + PublishDialog - - - +title: String - +sortable: bool - +sortAscending: bool - +sortingActive: bool - +onSort: void Function()? + + + +Widget build() - - - - - - - - - DashboardScaffold - - + + + + - - - <static>+compactWidthThreshold: double - +body: Widget + + + PublishConfirmationDialog - - - +Widget build() + + + +Widget build() - - - - - + + + + + - - - StudiesTableColumnSize + + + FrameControlsWidget - - - +collapsed: bool - +flex: int? - +width: double? + + + +onRefresh: void Function()? + +onOpenNewTab: void Function()? + +enabled: bool - - - +Widget createContainer() + + + +Widget build() - - - - - + + + - - - StudiesTable + + + ConsumerWidget - - - +itemHeight: double - +itemPadding: double - +rowSpacing: double - +columnSpacing: double - +compactWidthThreshold: double - +superCompactWidthThreshold: double - +compactStatTitleThreshold: double - +studies: List<Study> - +onSelect: void Function(Study) - +getActions: List<ModelAction<dynamic>> Function(Study) - +emptyWidget: Widget - +pinnedStudies: Iterable<String> - +dashboardController: DashboardController + + + + + + + + + IStudyStatusBadgeViewModel - - - +Widget build() - -Widget _buildColumnHeader() + + + +studyParticipation: Participation? + +studyStatus: StudyStatus? - - - + + + - - - void Function(Study) + + + Participation - - - + + + - - - List<ModelAction<dynamic>> Function(Study) + + + StudyStatus - - - - - + + + + + - - - DashboardController + + + StudyStatusBadge - - - +studyRepository: IStudyRepository - +authRepository: IAuthRepository - +userRepository: IUserRepository - +router: GoRouter - -_studiesSubscription: StreamSubscription<List<WrappedModel<Study>>>? - +searchController: SearchController - +isSortAscending: bool + + + +participation: Participation? + +status: StudyStatus? + +type: BadgeType + +showPrefixIcon: bool + +showTooltip: bool - - - -dynamic _subscribeStudies() - +dynamic setSearchText() - +dynamic setStudiesFilter() - +dynamic onSelectStudy() - +dynamic onClickNewStudy() - +dynamic pinStudy() - +dynamic pinOffStudy() - +void setSorting() - +void filterStudies() - +void sortStudies() - +bool isSortingActiveForColumn() - +bool isPinned() - +List<ModelAction<dynamic>> availableActions() - +void dispose() + + + +Widget build() - - - - - - - - StudiesTableColumn - - + + + - - - +index: int - <static>+values: List<StudiesTableColumn> - <static>+pin: StudiesTableColumn - <static>+title: StudiesTableColumn - <static>+status: StudiesTableColumn - <static>+participation: StudiesTableColumn - <static>+createdAt: StudiesTableColumn - <static>+enrolled: StudiesTableColumn - <static>+active: StudiesTableColumn - <static>+completed: StudiesTableColumn - <static>+action: StudiesTableColumn + + + BadgeType - - - - + + + + + - - - DashboardScreen + + + RouteInformation - - - +filter: StudiesFilter? + + + +route: String? + +extra: String? + +cmd: String? + +data: String? + + + + + + +String toString() - - - - + + + + + - - - StudiesFilter + + + PlatformController - - - +index: int - <static>+values: List<StudiesFilter> + + + +studyId: String + +baseSrc: String + +previewSrc: String + +routeInformation: RouteInformation + +frameWidget: Widget + + + + + + +void activate() + +void registerViews() + +void generateUrl() + +void navigate() + +void refresh() + +void listen() + +void send() + +void openNewPage() - - - + + + + + - - - IUserRepository + + + WebController - - - - + + + +iFrameElement: IFrameElement + + - - - SearchController + + + +void activate() + +void registerViews() + +void generateUrl() + +void navigate() + +void refresh() + +void openNewPage() + +void listen() + +void send() - - - + + + - - - IModelActionProvider + + + IFrameElement - - - - + + + + - - - StudiesTableItem + + + MobileController - - - +study: Study - +itemHeight: double - +itemPadding: double - +rowSpacing: double - +columnSpacing: double - +actions: List<ModelAction<dynamic>> - +columnSizes: List<StudiesTableColumnSize> - +isPinned: bool - +onPinnedChanged: void Function(Study, bool)? - +onTap: void Function(Study)? + + + +void openNewPage() + +void refresh() + +void registerViews() + +void listen() + +void send() + +void navigate() + +void activate() + +void generateUrl() - - - + + + + + - - - Study + + + StudyController - - - - + + + +notificationService: INotificationService + +studyEventsSubscription: StreamSubscription<ModelEvent<Study>>? + +studyActions: List<ModelAction<dynamic>> + + - - - void Function(Study, bool)? + + + +dynamic syncStudyStatus() + +dynamic onStudySubscriptionUpdate() + -dynamic _redirectNewToActualStudyID() + +dynamic publishStudy() + +void onChangeStudyParticipation() + +void onAddParticipants() + +void onSettingsPressed() + +void dispose() - - - + + + + - - - void Function(Study)? + + + IStudyNavViewModel - - - - - - - - - - FormArrayTable + + + +isEditTabEnabled: bool + +isTestTabEnabled: bool + +isRecruitTabEnabled: bool + +isMonitorTabEnabled: bool + +isAnalyzeTabEnabled: bool + +isSettingsEnabled: bool - - - +control: AbstractControl<dynamic> - +items: List<T> - +onSelectItem: void Function(T) - +getActionsAt: List<ModelAction<dynamic>> Function(T, int) - +onNewItem: void Function()? - +rowTitle: String Function(T) - +onNewItemLabel: String - +sectionTitle: String? - +sectionDescription: String? - +emptyIcon: IconData? - +emptyTitle: String? - +emptyDescription: String? - +sectionTitleDivider: bool? - +rowPrefix: Widget Function(BuildContext, T, int)? - +rowSuffix: Widget Function(BuildContext, T, int)? - +leadingWidget: Widget? - +itemsSectionPadding: EdgeInsets? - +hideLeadingTrailingWhenEmpty: bool - <static>+columns: List<StandardTableColumn> + + + + + + + + + StudyNav - - - +Widget build() - -List<Widget> _buildRow() - -Widget _newItemButton() + + + <static>+dynamic tabs() + <static>+dynamic edit() + <static>+dynamic test() + <static>+dynamic recruit() + <static>+dynamic monitor() + <static>+dynamic analyze() - - - + + + + - - - AbstractControl + + + StudyDesignNav - - - - - - - - void Function(T) + + + <static>+dynamic tabs() + <static>+dynamic info() + <static>+dynamic enrollment() + <static>+dynamic interventions() + <static>+dynamic measurements() + <static>+dynamic reports() - - - + + + - - - List<ModelAction<dynamic>> Function(T, int) + + + IWithBanner - - - + + + + + - - - String Function(T) + + + StudyParticipationBadge - - - - + + + +participation: Participation + +type: BadgeType + +showPrefixIcon: bool + +center: bool + + - - - IconData + + + +Widget build() - - - - - - - Widget Function(BuildContext, T, int)? + + + + + + + IStudyRepository - - - - - + + + + - - - CustomFormControl + + + PreviewFrame - - - -_onValueChangedDebouncer: Debouncer? - -_onStatusChangedDebouncer: Debouncer? - +onValueChanged: void Function(T?)? - +onStatusChanged: void Function(ControlStatus)? - +onStatusChangedDebounceTime: int? - +onValueChangedDebounceTime: int? + + + +studyId: String + +routeArgs: StudyFormRouteArgs? + +route: String? - - - +void dispose() + + + + + + + + StudyFormRouteArgs - - - + + + + - - - Debouncer + + + IStudyAppBarViewModel - - - - - - - - void Function(T?)? + + + +isSyncIndicatorVisible: bool + +isStatusBadgeVisible: bool + +isPublishVisible: bool - - - + + + + - - - void Function(ControlStatus)? + + + StudyScaffold - - - - - - - - FormInvalidException + + + +studyId: String + +tabs: List<NavbarTab>? + +tabsSubnav: List<NavbarTab>? + +selectedTab: NavbarTab? + +selectedTabSubnav: NavbarTab? + +body: StudyPageWidget + +drawer: Widget? + +disableActions: bool + +actionsSpacing: double + +actionsPadding: double + +layoutType: SingleColumnLayoutType? + +appbarHeight: double + +appbarSubnavHeight: double - - - + + + - - - Exception + + + NavbarTab - - - - + + + - - - FormConfigException + + + SingleColumnLayoutType - - - +message: String? + + + + + + + + + + WebFrame - - - - - - - - - IFormViewModelDelegate + + + +previewSrc: String + +studyId: String - - - +dynamic onSave() - +void onCancel() + + + +Widget build() - - - - + + + + - - - FormControlOption + + + DisabledFrame - - - +value: T - +label: String - +description: String? - +props: List<Object?> + + + +Widget build() - - - + + + + + - - - Equatable + + + PhoneContainer - - - - - - - - - FormMode + + + <static>+defaultWidth: double + <static>+defaultHeight: double + +width: double + +height: double + +borderColor: Color + +borderWidth: double + +borderRadius: double + +innerContent: Widget + +innerContentBackgroundColor: Color? - - - +index: int - <static>+values: List<FormMode> - <static>+create: FormMode - <static>+readonly: FormMode - <static>+edit: FormMode + + + +Widget build() - - - + + + - - - FormValidationSetEnum + + + Color - - - + + + + - - - CancelableOperation + + + MobileFrame - - - - - - - - - - IFormData + + + +Widget build() - - - +id: String + + + + + + + + + DesktopFrame - - - +IFormData copy() + + + +Widget build() - - - - + + + + + - - - UnsavedChangesDialog + + + StudyTestScreen - - - +Widget build() + + + +previewRoute: String? + + + + + + +Widget build() + +Widget? banner() + +dynamic load() + +dynamic save() + +dynamic showHelp() - - - - - + + + + + - - - FormControlValidation + + + StudySettingsFormViewModel - - - +control: AbstractControl<dynamic> - +validators: List<Validator<dynamic>> - +asyncValidators: List<AsyncValidator<dynamic>>? - +validationMessages: Map<String, String Function(Object)> + + + +study: AsyncValue<Study> + +studyRepository: IStudyRepository + <static>+defaultPublishedToRegistry: bool + <static>+defaultPublishedToRegistryResults: bool + +isPublishedToRegistryControl: FormControl<bool> + +isPublishedToRegistryResultsControl: FormControl<bool> + +form: FormGroup + +titles: Map<FormMode, String> - - - +FormControlValidation merge() + + + +void setControlsFrom() + +Study buildFormData() + +dynamic keepControlsSynced() + +dynamic save() + +dynamic setLaunchDefaults() - - - - + + + - - - ManagedFormViewModel + + + AsyncValue - - - +ManagedFormViewModel<T> createDuplicate() + + + + + + + + + StudySettingsDialog - - - - - - - - FormViewModelNotFoundException + + + +Widget build() - - - - - + + + + - - - FormViewModelCollection + + + StudyTestController - - - +formViewModels: List<T> - +formArray: FormArray<dynamic> - +stagedViewModels: List<T> - +retrievableViewModels: List<T> - +formData: List<D> + + + +authRepository: IAuthRepository + +languageCode: String - - - +void add() - +T remove() - +T? findWhere() - +T? removeWhere() - +bool contains() - +void stage() - +T commit() - +void reset() - +void read() + + + + + + + + + TestAppRoutes - - - - - - - - FormArray + + + <static>+studyOverview: String + <static>+eligibility: String + <static>+intervention: String + <static>+consent: String + <static>+journey: String + <static>+dashboard: String - - - + + + - + DrawerEntry - + +localizedTitle: String Function() +icon: IconData? @@ -5848,7 +5990,7 @@ - + +void onClick() @@ -5857,9 +5999,9 @@ - + - + String Function() @@ -5868,9 +6010,9 @@ - + - + String Function()? @@ -5879,9 +6021,9 @@ - + - + void Function(BuildContext, WidgetRef)? @@ -5890,24 +6032,24 @@ - - - + + + - + GoRouterDrawerEntry - + +intent: RoutingIntent +onNavigated: void Function()? - + +void onClick() @@ -5916,9 +6058,9 @@ - + - + RoutingIntent @@ -5927,16 +6069,16 @@ - - + + - + AppDrawer - + +width: int +autoCloseDrawer: bool @@ -5950,1497 +6092,1639 @@ - - - - - + + + + - - - StudyInvitesTable + + + StudyAnalyzeScreen - - - +invites: List<StudyInvite> - +onSelect: void Function(StudyInvite) - +getActions: List<ModelAction<dynamic>> Function(StudyInvite) - +getInlineActions: List<ModelAction<dynamic>> Function(StudyInvite) - +getIntervention: Intervention? Function(String) - +getParticipantCountForInvite: int Function(StudyInvite) + + + +Widget? banner() + +Widget build() - - - +Widget build() - -List<Widget> _buildRow() + + + + + + + + + StudyAnalyzeController + + + + + + +dynamic onExport() - - - + + + + - - - void Function(StudyInvite) + + + StudyDesignInterventionsFormView + + + + + + +Widget build() - - - + + + + - - - List<ModelAction<dynamic>> Function(StudyInvite) + + + StudyDesignPageWidget + + + + + + +Widget? banner() - - - + + + + - - - Intervention? Function(String) + + + InterventionFormView + + + + + + +formViewModel: InterventionFormViewModel - - - + + + + + - - - int Function(StudyInvite) + + + InterventionFormViewModel + + + + + + +study: Study + +interventionIdControl: FormControl<String> + +interventionTitleControl: FormControl<String> + +interventionIconControl: FormControl<IconOption> + +interventionDescriptionControl: FormControl<String> + +interventionTasksArray: FormArray<dynamic> + +tasksCollection: FormViewModelCollection<InterventionTaskFormViewModel, InterventionTaskFormData> + +form: FormGroup + +interventionId: String + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titleRequired: dynamic + +atLeastOneTask: dynamic + +breadcrumbsTitle: String + +titles: Map<FormMode, String> + + + + + + +void setControlsFrom() + +InterventionFormData buildFormData() + +List<ModelAction<dynamic>> availableActions() + +List<ModelAction<dynamic>> availablePopupActions() + +List<ModelAction<dynamic>> availableInlineActions() + +void onSelectItem() + +void onNewItem() + +void onCancel() + +dynamic onSave() + +InterventionTaskFormViewModel provide() + +InterventionTaskFormRouteArgs buildNewFormRouteArgs() + +InterventionTaskFormRouteArgs buildFormRouteArgs() + +InterventionFormViewModel createDuplicate() - - - - - + + + + + - - - InviteCodeFormView + + + InterventionPreview - - - +formViewModel: InviteCodeFormViewModel + + + +routeArgs: InterventionFormRouteArgs - - - +Widget build() - -List<FormTableRow> _conditionalInterventionRows() + + + +Widget build() - - - - - + + + - - - InviteCodeFormViewModel + + + InterventionFormRouteArgs - - - +study: Study - +inviteCodeRepository: IInviteCodeRepository - +codeControl: FormControl<String> - +codeControlValidationMessages: Map<String, String Function(dynamic)> - +isPreconfiguredScheduleControl: FormControl<bool> - +preconfiguredScheduleTypeControl: FormControl<PhaseSequence> - +interventionAControl: FormControl<String> - +interventionBControl: FormControl<String> - +form: FormGroup - +titles: Map<FormMode, String> - +interventionControlOptions: List<FormControlOption<String>> - +preconfiguredScheduleTypeOptions: List<FormControlOption<PhaseSequence>> - +isPreconfiguredSchedule: bool - +preconfiguredSchedule: List<String>? + + + + + + + + + + StudyScheduleFormView + + + + + + +formViewModel: StudyScheduleControls + + + + + + -FormTableRow _renderCustomSequence() + +Widget build() + + + + + + + + + + + + + StudyScheduleControls + + + + + + <static>+defaultScheduleType: PhaseSequence + <static>+defaultScheduleTypeSequence: String + <static>+defaultNumCycles: int + <static>+defaultPeriodLength: int + +sequenceTypeControl: FormControl<PhaseSequence> + +sequenceTypeCustomControl: FormControl<String> + +phaseDurationControl: FormControl<int> + +numCyclesControl: FormControl<int> + +includeBaselineControl: FormControl<bool> + +studyScheduleControls: Map<String, FormControl<Object>> + <static>+kNumCyclesMin: int + <static>+kNumCyclesMax: int + <static>+kPhaseDurationMin: int + <static>+kPhaseDurationMax: int + +sequenceTypeControlOptions: List<FormControlOption<PhaseSequence>> + +studyScheduleValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +numCyclesRange: dynamic + +phaseDurationRange: dynamic + +customSequenceRequired: dynamic - - - +void initControls() - -dynamic _uniqueInviteCode() - +void regenerateCode() - -String _generateCode() - +StudyInvite buildFormData() - +void setControlsFrom() - +dynamic save() + + + +void setStudyScheduleControlsFrom() + +StudyScheduleFormData buildStudyScheduleFormData() + +bool isSequencingCustom() - - - + + + + + - - - FormConsumerWidget + + + InterventionTaskFormData - - - - + + + +taskId: String + +taskTitle: String + +taskDescription: String? + <static>+kDefaultTitle: String + +id: String + + - - - IInviteCodeRepository + + + +CheckmarkTask toTask() + +InterventionTaskFormData copy() - - - - - + + + + + - - - StudyRecruitController + + + IFormDataWithSchedule - - - +inviteCodeRepository: IInviteCodeRepository - -_invitesSubscription: StreamSubscription<List<WrappedModel<StudyInvite>>>? + + + +instanceId: String + +isTimeLocked: bool + +timeLockStart: StudyUTimeOfDay? + +timeLockEnd: StudyUTimeOfDay? + +hasReminder: bool + +reminderTime: StudyUTimeOfDay? - - - -dynamic _subscribeInvites() - +Intervention? getIntervention() - +int getParticipantCountForInvite() - +List<ModelAction<dynamic>> availableActions() - +List<ModelAction<dynamic>> availableInlineActions() - +void dispose() + + + +Schedule toSchedule() - - - - + + + + + - - - StudyRecruitScreen + + + InterventionsFormViewModel - - - +Widget build() - -Widget _inviteCodesSectionHeader() - -Widget _newInviteCodeButton() - -dynamic _onSelectInvite() + + + +study: Study + +router: GoRouter + +interventionsArray: FormArray<dynamic> + +interventionsCollection: FormViewModelCollection<InterventionFormViewModel, InterventionFormData> + +form: FormGroup + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +interventionsRequired: dynamic + +titles: Map<FormMode, String> + +canTestStudySchedule: bool - - - - - - - - - - EnrolledBadge + + + +void setControlsFrom() + +InterventionsFormData buildFormData() + +void read() + +List<ModelAction<dynamic>> availableActions() + +List<ModelAction<dynamic>> availablePopupActions() + +List<ModelAction<dynamic>> availableInlineActions() + +void onSelectItem() + +void onNewItem() + +InterventionFormViewModel provide() + +void onCancel() + +dynamic onSave() + +dynamic testStudySchedule() - - - +enrolledCount: int - - + + + + - - - +Widget build() + + + IListActionProvider - - - - + + + - - - PublishConfirmationDialog + + + IProviderArgsResolver - - - +Widget build() + + + + + + + + + + InterventionTaskFormViewModel - - - - - - - - - PublishSuccessDialog + + + +taskIdControl: FormControl<String> + +instanceIdControl: FormControl<String> + +taskTitleControl: FormControl<String> + +taskDescriptionControl: FormControl<String> + +markAsCompletedControl: FormControl<bool> + +form: FormGroup + +taskId: String + +instanceId: String + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titleRequired: dynamic + +titles: Map<FormMode, String> - - - +Widget build() + + + +void setControlsFrom() + +InterventionTaskFormData buildFormData() + +InterventionTaskFormViewModel createDuplicate() - - - - + + + + + - - - PublishDialog + + + WithScheduleControls - - - +Widget build() + + + +isTimeRestrictedControl: FormControl<bool> + +instanceID: FormControl<String> + +restrictedTimeStartControl: FormControl<Time> + +restrictedTimeStartPickerControl: FormControl<TimeOfDay> + +restrictedTimeEndControl: FormControl<Time> + +restrictedTimeEndPickerControl: FormControl<TimeOfDay> + +hasReminderControl: FormControl<bool> + +reminderTimeControl: FormControl<Time> + +reminderTimePickerControl: FormControl<TimeOfDay> + -_reminderControlStream: StreamSubscription<dynamic>? + +scheduleFormControls: Map<String, FormControl<Object>> + +hasReminder: bool + +isTimeRestricted: bool + +timeRestriction: List<Time>? - - - - - - - - - - StudyFormScaffold + + + +void setScheduleControlsFrom() + -dynamic _initReminderControl() - - - +studyId: String - +formViewModelBuilder: T Function(WidgetRef) - +formViewBuilder: Widget Function(T) - - + + + + - - - +Widget build() + + + PhaseSequence - - - + + + + + - - - T Function(WidgetRef) + + + InterventionFormData - - - - + + + +interventionId: String + +title: String + +description: String? + +tasksData: List<InterventionTaskFormData>? + +iconName: String? + <static>+kDefaultTitle: String + +id: String + + - - - Widget Function(T) + + + +Intervention toIntervention() + +InterventionFormData copy() - - - - + + + + + - - - StudyFormValidationSet + + + StudyScheduleFormData - - - +index: int - <static>+values: List<StudyFormValidationSet> + + + +sequenceType: PhaseSequence + +sequenceTypeCustom: String + +numCycles: int + +phaseDuration: int + +includeBaseline: bool + +id: String - - - - - - - - - - QuestionFormData + + + +StudySchedule toStudySchedule() + +Study apply() + +StudyScheduleFormData copy() - - - <static>+questionTypeFormDataFactories: Map<SurveyQuestionType, QuestionFormData Function(Question<dynamic>, List<EligibilityCriterion>)> - +questionId: String - +questionText: String - +questionInfoText: String? - +questionType: SurveyQuestionType - +responseOptionsValidity: Map<dynamic, bool> - +responseOptions: List<dynamic> - +id: String + + + + + + + + + IStudyFormData - - - +Question<dynamic> toQuestion() - +EligibilityCriterion toEligibilityCriterion() - +Answer<dynamic> constructAnswerFor() - +dynamic setResponseOptionsValidityFrom() - +QuestionFormData copy() + + + +Study apply() - - - - + + + + - - - SurveyQuestionType + + + InterventionTaskFormView - - - +index: int - <static>+values: List<SurveyQuestionType> - <static>+choice: SurveyQuestionType - <static>+bool: SurveyQuestionType - <static>+scale: SurveyQuestionType - <static>+freeText: SurveyQuestionType + + + +formViewModel: InterventionTaskFormViewModel - - - - - + + + + + - - - ChoiceQuestionFormData + + + InterventionsFormData - - - +isMultipleChoice: bool - +answerOptions: List<String> - +responseOptions: List<String> + + + +interventionsData: List<InterventionFormData> + +studyScheduleData: StudyScheduleFormData + +id: String - - - +Question<dynamic> toQuestion() - +QuestionFormData copy() - -Choice _buildChoiceForValue() - +Answer<dynamic> constructAnswerFor() + + + +Study apply() + +InterventionsFormData copy() - - - - - + + + + - - - BoolQuestionFormData + + + StudyDesignReportsFormView - - - <static>+kResponseOptions: Map<String, bool> - +responseOptions: List<String> + + + +Widget build() + -dynamic _showReportItemSidesheetWithArgs() - - - +Question<dynamic> toQuestion() - +BoolQuestionFormData copy() - +Answer<dynamic> constructAnswerFor() + + + + + + + + + + ReportItemFormData - - - - - - - - - - ScaleQuestionFormData + + + +isPrimary: bool + +section: ReportSection + +id: String - - - +minValue: double - +maxValue: double - +minLabel: String? - +maxLabel: String? - +midValues: List<double?> - +midLabels: List<String?> - +stepSize: double - +initialValue: double? - +minColor: Color? - +maxColor: Color? - +responseOptions: List<double> - +midAnnotations: List<Annotation> + + + <static>+dynamic fromDomainModel() + +ReportItemFormData copy() - - - +ScaleQuestion toQuestion() - +QuestionFormData copy() - +Answer<dynamic> constructAnswerFor() + + + + + + + + ReportSection - - - - - + + + + + - - - FreeTextQuestionFormData + + + DataReferenceEditor - - - +textLengthRange: List<int> - +textType: FreeTextQuestionType - +textTypeExpression: String? - +responseOptions: List<String> + + + +formControl: FormControl<DataReferenceIdentifier<T>> + +availableTasks: List<Task> + +buildReactiveDropdownField: ReactiveDropdownField<dynamic> - - - +Question<dynamic> toQuestion() - +FreeTextQuestionFormData copy() - +Answer<dynamic> constructAnswerFor() + + + +FormTableRow buildFormTableRow() + -List<DropdownMenuItem<DataReferenceIdentifier<dynamic>>> _dataReferenceItems() - - - + + + - - - FreeTextQuestionType + + + ReactiveDropdownField - - - - + + + + + - - - SurveyQuestionFormView + + + TemporalAggregationFormatted - - - +formViewModel: QuestionFormViewModel - +isHtmlStyleable: bool + + + -_value: TemporalAggregation + <static>+values: List<TemporalAggregationFormatted> + +value: TemporalAggregation + +string: String + +icon: IconData? + +hashCode: int - - - - - - - - - - QuestionFormViewModel + + + +bool ==() + +String toString() + +String toJson() + <static>+TemporalAggregationFormatted fromJson() - - - <static>+defaultQuestionType: SurveyQuestionType - -_titles: Map<FormMode, String Function()>? - +questionIdControl: FormControl<String> - +questionTypeControl: FormControl<SurveyQuestionType> - +questionTextControl: FormControl<String> - +questionInfoTextControl: FormControl<String> - +questionBaseControls: Map<String, AbstractControl<dynamic>> - +isMultipleChoiceControl: FormControl<bool> - +choiceResponseOptionsArray: FormArray<dynamic> - +customOptionsMin: int - +customOptionsMax: int - +customOptionsInitial: int - +boolResponseOptionsArray: FormArray<String> - <static>+kDefaultScaleMinValue: int - <static>+kDefaultScaleMaxValue: int - <static>+kNumMidValueControls: int - <static>+kMidValueDebounceMilliseconds: int - +scaleMinValueControl: FormControl<int> - +scaleMaxValueControl: FormControl<int> - -_scaleRangeControl: FormControl<int> - +scaleMinLabelControl: FormControl<String> - +scaleMaxLabelControl: FormControl<String> - +scaleMidValueControls: FormArray<int> - +scaleMidLabelControls: FormArray<String?> - -_scaleResponseOptionsArray: FormArray<int> - +scaleMinColorControl: FormControl<SerializableColor> - +scaleMaxColorControl: FormControl<SerializableColor> - +prevMidValues: List<int?>? - +freeTextTypeControl: FormControl<FreeTextQuestionType> - +customRegexControl: FormControl<String> - +freeTextResponseOptionsArray: FormArray<dynamic> - +freeTextLengthMin: AbstractControl<int> - +freeTextLengthMax: AbstractControl<int> - +freeTextExampleTextControl: FormControl<String> - <static>+kDefaultFreeTextMinLength: int - <static>+kDefaultFreeTextMaxLength: int - +freeTextLengthControl: FormControl<RangeValues> - -_controlsByQuestionType: Map<SurveyQuestionType, FormGroup> - -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - -_validationConfigsByQuestionType: Map<SurveyQuestionType, Map<FormValidationSetEnum, List<FormControlValidation>>> - +form: FormGroup - +questionId: String - +questionType: SurveyQuestionType - +questionTypeControlOptions: List<FormControlOption<SurveyQuestionType>> - +answerOptionsArray: FormArray<dynamic> - +answerOptionsControls: List<AbstractControl<dynamic>> - +validAnswerOptions: List<String> - +boolOptions: List<AbstractControl<String>> - +scaleMinValue: int - +scaleMaxValue: int - +scaleRange: int - +scaleAllValueControls: List<AbstractControl<int>> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +questionTextRequired: dynamic - +numValidChoiceOptions: dynamic - +scaleRangeValid: dynamic - +titles: Map<FormMode, String> - +isAddOptionButtonVisible: bool - +isMidValuesClearedInfoVisible: bool + + + + + + + + TemporalAggregation - - - +String? scaleMidLabelAt() - -dynamic _onScaleRangeChanged() - -dynamic _applyInputFormatters() - -dynamic _updateScaleMidValueControls() - -Map<String, dynamic>? _validateFreeText() - -dynamic _onFreeTextLengthChanged() - -List<FormControlValidation> _getValidationConfig() - +dynamic onQuestionTypeChanged() - +dynamic onResponseOptionsChanged() - -void _updateFormControls() - +void initControls() - +void setControlsFrom() - +QuestionFormData buildFormData() - +List<ModelAction<dynamic>> availableActions() - +void onNewItem() - +void onSelectItem() - +dynamic save() - +QuestionFormViewModel createDuplicate() + + + + + + + + + + ImprovementDirectionFormatted - - - - - + + + -_value: ImprovementDirection + <static>+values: List<ImprovementDirectionFormatted> + +value: ImprovementDirection + +string: String + +icon: IconData? + +hashCode: int + + - - - IScaleQuestionFormViewModel + + + +bool ==() + +String toString() + +String toJson() + <static>+ImprovementDirectionFormatted fromJson() - - - +isMidValuesClearedInfoVisible: bool + + + + + + + + ImprovementDirection - - - - + + + + - - - ScaleQuestionFormView + + + ReportSectionType - - - +formViewModel: QuestionFormViewModel + + + +index: int + <static>+values: List<ReportSectionType> + <static>+average: ReportSectionType + <static>+linearRegression: ReportSectionType - - - - - + + + + + - - - ChoiceQuestionFormView + + + AverageSectionFormView - - - +formViewModel: QuestionFormViewModel + + + +formViewModel: ReportItemFormViewModel + +studyId: String + +reportSectionColumnWidth: Map<int, TableColumnWidth> - - - +Widget build() + + + +Widget build() - - - - - + + + + + - - - BoolQuestionFormView + + + ReportItemFormViewModel - - - +formViewModel: QuestionFormViewModel + + + <static>+defaultSectionType: ReportSectionType + +sectionIdControl: FormControl<String> + +sectionTypeControl: FormControl<ReportSectionType> + +titleControl: FormControl<String> + +descriptionControl: FormControl<String> + +sectionControl: FormControl<ReportSection> + +dataReferenceControl: FormControl<DataReferenceIdentifier<num>> + +temporalAggregationControl: FormControl<TemporalAggregationFormatted> + +improvementDirectionControl: FormControl<ImprovementDirectionFormatted> + +alphaControl: FormControl<double> + -_controlsBySectionType: Map<ReportSectionType, FormGroup> + -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + -_validationConfigsBySectionType: Map<ReportSectionType, Map<FormValidationSetEnum, List<FormControlValidation>>> + +sectionBaseControls: Map<String, AbstractControl<dynamic>> + +form: FormGroup + +sectionId: String + +sectionType: ReportSectionType + <static>+sectionTypeControlOptions: List<FormControlOption<ReportSectionType>> + <static>+temporalAggregationControlOptions: List<FormControlOption<TemporalAggregationFormatted>> + <static>+improvementDirectionControlOptions: List<FormControlOption<ImprovementDirectionFormatted>> + +titles: Map<FormMode, String> + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titleRequired: dynamic + +descriptionRequired: dynamic + +dataReferenceRequired: dynamic + +aggregationRequired: dynamic + +improvementDirectionRequired: dynamic + +alphaConfidenceRequired: dynamic - - - +Widget build() + + + -List<FormControlValidation> _getValidationConfig() + +ReportItemFormData buildFormData() + +ReportItemFormViewModel createDuplicate() + +dynamic onSectionTypeChanged() + -void _updateFormControls() + +void setControlsFrom() - - - - - + + + + + - - - FreeTextQuestionFormView + + + DataReferenceIdentifier - - - +formViewModel: QuestionFormViewModel - +generateLabelHelpTextMap: dynamic + + + +hashCode: int - - - +Widget build() - +Widget disableOnReadonly() - +Widget generateRow() + + + +bool ==() - - - + + + - - - IListActionProvider + + + DataReference - - - - - + + + + + - - - WithQuestionnaireControls + + + LinearRegressionSectionFormView - - - +questionsArray: FormArray<dynamic> - +questionFormViewModels: FormViewModelCollection<Q, QuestionFormData> - +questionnaireControls: Map<String, FormArray<dynamic>> - +propagateOnSave: bool - +questionModels: List<Q> - +questionTitles: Map<FormMode, String Function()> + + + +formViewModel: ReportItemFormViewModel + +studyId: String + +reportSectionColumnWidth: Map<int, TableColumnWidth> - - - +void setQuestionnaireControlsFrom() - +QuestionnaireFormData buildQuestionnaireFormData() - +void read() - +void onCancel() - +dynamic onSave() - +Q provide() - +Q provideQuestionFormViewModel() + + + +Widget build() - - - + + + + + - - - IProviderArgsResolver + + + ReportItemFormView + + + + + + +formViewModel: ReportItemFormViewModel + +studyId: String + +reportSectionColumnWidth: dynamic + +sectionTypeBodyBuilder: Widget Function(BuildContext) + + + + + + +Widget build() + -dynamic _buildSectionText() + -dynamic _buildSectionTypeHeader() + + + + + + + + + + + Widget Function(BuildContext) + + + + + + + + + + + + + ReportsFormViewModel + + + + + + +study: Study + +router: GoRouter + +reportItemDelegate: ReportFormItemDelegate + +reportItemArray: FormArray<dynamic> + +reportItemFormViewModels: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData> + +form: FormGroup + +reportItemModels: List<ReportItemFormViewModel> + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titles: Map<FormMode, String> + +canTestConsent: bool + + + + + + +void setControlsFrom() + +ReportsFormData buildFormData() + +void read() + +ReportItemFormRouteArgs buildNewReportItemFormRouteArgs() + +ReportItemFormRouteArgs buildReportItemFormRouteArgs() + +dynamic testReport() + +void onCancel() + +dynamic onSave() + +ReportItemFormViewModel provide() - - - - - + + + + + - - - QuestionnaireFormData + + + ReportFormItemDelegate - - - +questionsData: List<QuestionFormData>? - +id: String + + + +formViewModelCollection: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData> + +owner: ReportsFormViewModel + +propagateOnSave: bool + +validationSet: dynamic - - - +StudyUQuestionnaire toQuestionnaire() - +List<EligibilityCriterion> toEligibilityCriteria() - +QuestionnaireFormData copy() + + + +void onCancel() + +dynamic onSave() + +ReportItemFormViewModel provide() + +List<ModelAction<dynamic>> availableActions() + +void onNewItem() + +void onSelectItem() - - - - - + + + + + - - - IFormDataWithSchedule + + + ReportBadge - - - +instanceId: String - +isTimeLocked: bool - +timeLockStart: StudyUTimeOfDay? - +timeLockEnd: StudyUTimeOfDay? - +hasReminder: bool - +reminderTime: StudyUTimeOfDay? + + + +status: ReportStatus? + +type: BadgeType + +showPrefixIcon: bool + +showTooltip: bool - - - +Schedule toSchedule() + + + +Widget build() - - - + + + + - - - StudyUTimeOfDay + + + ReportStatus + + + + + + +index: int + <static>+values: List<ReportStatus> + <static>+primary: ReportStatus + <static>+secondary: ReportStatus - - - - - + + + + + - - - ScheduleControls + + + ReportsFormData - - - +formViewModel: WithScheduleControls + + + +reportItems: List<ReportItemFormData> + +id: String - - - +Widget build() - -List<FormTableRow> _conditionalTimeRestrictions() + + + +Study apply() + +ReportsFormData copy() - - - - - + + + + + - - - WithScheduleControls + + + StudyInfoFormViewModel - - - +isTimeRestrictedControl: FormControl<bool> - +instanceID: FormControl<String> - +restrictedTimeStartControl: FormControl<Time> - +restrictedTimeStartPickerControl: FormControl<TimeOfDay> - +restrictedTimeEndControl: FormControl<Time> - +restrictedTimeEndPickerControl: FormControl<TimeOfDay> - +hasReminderControl: FormControl<bool> - +reminderTimeControl: FormControl<Time> - +reminderTimePickerControl: FormControl<TimeOfDay> - -_reminderControlStream: StreamSubscription<dynamic>? - +scheduleFormControls: Map<String, FormControl<Object>> - +hasReminder: bool - +isTimeRestricted: bool - +timeRestriction: List<Time>? + + + +study: Study + +titleControl: FormControl<String> + +iconControl: FormControl<IconOption> + +descriptionControl: FormControl<String> + +organizationControl: FormControl<String> + +reviewBoardControl: FormControl<String> + +reviewBoardNumberControl: FormControl<String> + +researchersControl: FormControl<String> + +emailControl: FormControl<String> + +websiteControl: FormControl<String> + +phoneControl: FormControl<String> + +additionalInfoControl: FormControl<String> + +form: FormGroup + +titles: Map<FormMode, String> + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titleRequired: dynamic + +descriptionRequired: dynamic + +iconRequired: dynamic + +organizationRequired: dynamic + +reviewBoardRequired: dynamic + +reviewBoardNumberRequired: dynamic + +researchersRequired: dynamic + +emailRequired: dynamic + +phoneRequired: dynamic + +emailFormat: dynamic + +websiteFormat: dynamic - - - +void setScheduleControlsFrom() - -dynamic _initReminderControl() + + + +void setControlsFrom() + +StudyInfoFormData buildFormData() - - - - - - - - - InterventionFormViewModel - - + + + + - - - +study: Study - +interventionIdControl: FormControl<String> - +interventionTitleControl: FormControl<String> - +interventionIconControl: FormControl<IconOption> - +interventionDescriptionControl: FormControl<String> - +interventionTasksArray: FormArray<dynamic> - +tasksCollection: FormViewModelCollection<InterventionTaskFormViewModel, InterventionTaskFormData> - +form: FormGroup - +interventionId: String - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titleRequired: dynamic - +atLeastOneTask: dynamic - +breadcrumbsTitle: String - +titles: Map<FormMode, String> + + + StudyDesignInfoFormView - - - +void setControlsFrom() - +InterventionFormData buildFormData() - +List<ModelAction<dynamic>> availableActions() - +List<ModelAction<dynamic>> availablePopupActions() - +List<ModelAction<dynamic>> availableInlineActions() - +void onSelectItem() - +void onNewItem() - +void onCancel() - +dynamic onSave() - +InterventionTaskFormViewModel provide() - +InterventionTaskFormRouteArgs buildNewFormRouteArgs() - +InterventionTaskFormRouteArgs buildFormRouteArgs() - +InterventionFormViewModel createDuplicate() + + + +Widget build() - - - - - - - - - StudyScheduleFormData - - + + + + + - - - +sequenceType: PhaseSequence - +sequenceTypeCustom: String - +numCycles: int - +phaseDuration: int - +includeBaseline: bool - +id: String + + + StudyInfoFormData - - - +StudySchedule toStudySchedule() - +Study apply() - +StudyScheduleFormData copy() + + + +title: String + +description: String? + +iconName: String + +contactInfoFormData: StudyContactInfoFormData + +id: String - - - - - - - - PhaseSequence + + + +Study apply() + +StudyInfoFormData copy() - - - - + + + + + - - - IStudyFormData + + + StudyContactInfoFormData - - - +Study apply() + + + +organization: String? + +institutionalReviewBoard: String? + +institutionalReviewBoardNumber: String? + +researchers: String? + +email: String? + +website: String? + +phone: String? + +additionalInfo: String? + +id: String - - - - - - - - - - StudyScheduleFormView + + + +Study apply() + +StudyInfoFormData copy() - - - +formViewModel: StudyScheduleControls + + + + + + + + + StudyFormValidationSet - - - -FormTableRow _renderCustomSequence() - +Widget build() + + + +index: int + <static>+values: List<StudyFormValidationSet> - - - - - + + + + + - - - StudyScheduleControls + + + MeasurementsFormData - - - <static>+defaultScheduleType: PhaseSequence - <static>+defaultScheduleTypeSequence: String - <static>+defaultNumCycles: int - <static>+defaultPeriodLength: int - +sequenceTypeControl: FormControl<PhaseSequence> - +sequenceTypeCustomControl: FormControl<String> - +phaseDurationControl: FormControl<int> - +numCyclesControl: FormControl<int> - +includeBaselineControl: FormControl<bool> - +studyScheduleControls: Map<String, FormControl<Object>> - <static>+kNumCyclesMin: int - <static>+kNumCyclesMax: int - <static>+kPhaseDurationMin: int - <static>+kPhaseDurationMax: int - +sequenceTypeControlOptions: List<FormControlOption<PhaseSequence>> - +studyScheduleValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +numCyclesRange: dynamic - +phaseDurationRange: dynamic - +customSequenceRequired: dynamic + + + +surveyMeasurements: List<MeasurementSurveyFormData> + +id: String - - - +void setStudyScheduleControlsFrom() - +StudyScheduleFormData buildStudyScheduleFormData() - +bool isSequencingCustom() + + + +Study apply() + +MeasurementsFormData copy() - - - - + + + + - - - InterventionTaskFormView + + + MeasurementSurveyFormView - - - +formViewModel: InterventionTaskFormViewModel + + + +formViewModel: MeasurementSurveyFormViewModel - - - - - + + + + + - - - InterventionTaskFormViewModel + + + MeasurementSurveyFormViewModel - - - +taskIdControl: FormControl<String> - +instanceIdControl: FormControl<String> - +taskTitleControl: FormControl<String> - +taskDescriptionControl: FormControl<String> - +markAsCompletedControl: FormControl<bool> - +form: FormGroup - +taskId: String - +instanceId: String - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titleRequired: dynamic - +titles: Map<FormMode, String> + + + +study: Study + +measurementIdControl: FormControl<String> + +instanceIdControl: FormControl<String> + +surveyTitleControl: FormControl<String> + +surveyIntroTextControl: FormControl<String> + +surveyOutroTextControl: FormControl<String> + +form: FormGroup + +measurementId: String + +instanceId: String + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titleRequired: dynamic + +atLeastOneQuestion: dynamic + +breadcrumbsTitle: String + +titles: Map<FormMode, String> - - - +void setControlsFrom() - +InterventionTaskFormData buildFormData() - +InterventionTaskFormViewModel createDuplicate() + + + +void setControlsFrom() + +MeasurementSurveyFormData buildFormData() + +List<ModelAction<dynamic>> availableActions() + +List<ModelAction<dynamic>> availablePopupActions() + +List<ModelAction<dynamic>> availableInlineActions() + +void onSelectItem() + +void onNewItem() + +SurveyQuestionFormRouteArgs buildNewFormRouteArgs() + +SurveyQuestionFormRouteArgs buildFormRouteArgs() + +MeasurementSurveyFormViewModel createDuplicate() - - - - - + + + + + - - - InterventionPreview + + + SurveyPreview - - - +routeArgs: InterventionFormRouteArgs + + + +routeArgs: MeasurementFormRouteArgs - - - +Widget build() + + + +Widget build() - - - + + + - - - InterventionFormRouteArgs + + + MeasurementFormRouteArgs - - - - - + + + + + - - - InterventionsFormData + + + MeasurementSurveyFormData - - - +interventionsData: List<InterventionFormData> - +studyScheduleData: StudyScheduleFormData - +id: String + + + +measurementId: String + +title: String + +introText: String? + +outroText: String? + +questionnaireFormData: QuestionnaireFormData + <static>+kDefaultTitle: String + +id: String - - - +Study apply() - +InterventionsFormData copy() + + + +QuestionnaireTask toQuestionnaireTask() + +MeasurementSurveyFormData copy() - - - - - + + + + + - - - InterventionTaskFormData + + + QuestionnaireFormData - - - +taskId: String - +taskTitle: String - +taskDescription: String? - <static>+kDefaultTitle: String - +id: String + + + +questionsData: List<QuestionFormData>? + +id: String - - - +CheckmarkTask toTask() - +InterventionTaskFormData copy() + + + +StudyUQuestionnaire toQuestionnaire() + +List<EligibilityCriterion> toEligibilityCriteria() + +QuestionnaireFormData copy() - - - - - - - - InterventionFormView - - + + + + + - - - +formViewModel: InterventionFormViewModel + + + WithQuestionnaireControls - - - - - - - - - StudyDesignInterventionsFormView + + + +questionsArray: FormArray<dynamic> + +questionFormViewModels: FormViewModelCollection<Q, QuestionFormData> + +questionnaireControls: Map<String, FormArray<dynamic>> + +propagateOnSave: bool + +questionModels: List<Q> + +questionTitles: Map<FormMode, String Function()> - - - +Widget build() + + + +void setQuestionnaireControlsFrom() + +QuestionnaireFormData buildQuestionnaireFormData() + +void read() + +void onCancel() + +dynamic onSave() + +Q provide() + +Q provideQuestionFormViewModel() - - - - + + + + - - - StudyDesignPageWidget + + + StudyDesignMeasurementsFormView - - - +Widget? banner() + + + +Widget build() - - - - - - - - - InterventionsFormViewModel - - + + + + + - - - +study: Study - +router: GoRouter - +interventionsArray: FormArray<dynamic> - +interventionsCollection: FormViewModelCollection<InterventionFormViewModel, InterventionFormData> - +form: FormGroup - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +interventionsRequired: dynamic - +titles: Map<FormMode, String> - +canTestStudySchedule: bool + + + MeasurementsFormViewModel - - - +void setControlsFrom() - +InterventionsFormData buildFormData() - +void read() - +List<ModelAction<dynamic>> availableActions() - +List<ModelAction<dynamic>> availablePopupActions() - +List<ModelAction<dynamic>> availableInlineActions() - +void onSelectItem() - +void onNewItem() - +InterventionFormViewModel provide() - +void onCancel() - +dynamic onSave() - +dynamic testStudySchedule() + + + +study: Study + +router: GoRouter + +measurementsArray: FormArray<dynamic> + +surveyMeasurementFormViewModels: FormViewModelCollection<MeasurementSurveyFormViewModel, MeasurementSurveyFormData> + +form: FormGroup + +measurementViewModels: List<MeasurementSurveyFormViewModel> + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +measurementRequired: dynamic + +titles: Map<FormMode, String> + + + + + + +void read() + +void setControlsFrom() + +MeasurementsFormData buildFormData() + +List<ModelAction<dynamic>> availableActions() + +List<ModelAction<dynamic>> availablePopupActions() + +List<ModelAction<dynamic>> availableInlineActions() + +void onSelectItem() + +void onNewItem() + +MeasurementSurveyFormViewModel provide() + +void onCancel() + +dynamic onSave() - - - - - + + + + + - - - InterventionFormData + + + StudyFormScaffold - - - +interventionId: String - +title: String - +description: String? - +tasksData: List<InterventionTaskFormData>? - +iconName: String? - <static>+kDefaultTitle: String - +id: String + + + +studyId: String + +formViewModelBuilder: T Function(WidgetRef) + +formViewBuilder: Widget Function(T) - - - +Intervention toIntervention() - +InterventionFormData copy() + + + +Widget build() - - - - - + + + - - - EnrollmentFormData + + + T Function(WidgetRef) - - - <static>+kDefaultEnrollmentType: Participation - +enrollmentType: Participation - +questionnaireFormData: QuestionnaireFormData - +consentItemsFormData: List<ConsentItemFormData>? - +id: String - - + + + + - - - +Study apply() - +EnrollmentFormData copy() + + + Widget Function(T) - - - + + + - + ConsentItemFormViewModel - + +consentIdControl: FormControl<String> +titleControl: FormControl<String> @@ -7455,7 +7739,7 @@ - + +void setControlsFrom() +ConsentItemFormData buildFormData() @@ -7464,36 +7748,38 @@ - - - - + + + + - - - ConsentItemFormView + + + StudyDesignEnrollmentFormView - - - +formViewModel: ConsentItemFormViewModel + + + +Widget build() + -dynamic _showScreenerQuestionSidesheetWithArgs() + -dynamic _showConsentItemSidesheetWithArgs() - - + + - + IScreenerQuestionLogicFormViewModel - + +isDirtyOptionsBannerVisible: bool @@ -7502,1162 +7788,1094 @@ - - - + + + - + ScreenerQuestionLogicFormView - + +formViewModel: ScreenerQuestionFormViewModel - - - - +Widget build() - -dynamic _buildInfoBanner() - -dynamic _buildAnswerOptionsLogicControls() - -List<Widget> _buildOptionLogicRow() - - - - - - - - - - - - - ScreenerQuestionFormViewModel - - - - - - <static>+defaultResponseOptionValidity: bool - +responseOptionsDisabledArray: FormArray<dynamic> - +responseOptionsLogicControls: FormArray<bool> - +responseOptionsLogicDescriptionControls: FormArray<String> - -_questionBaseControls: Map<String, AbstractControl<dynamic>> - +prevResponseOptionControls: List<AbstractControl<dynamic>> - +prevResponseOptionValues: List<dynamic> - +responseOptionsDisabledControls: List<AbstractControl<dynamic>> - +logicControlOptions: List<FormControlOption<bool>> - +questionBaseControls: Map<String, AbstractControl<dynamic>> - +isDirtyOptionsBannerVisible: bool - - - - - - +dynamic onResponseOptionsChanged() - +void setControlsFrom() - +QuestionFormData buildFormData() - -List<FormControl<dynamic>> _copyFormControls() - -AbstractControl<dynamic>? _findAssociatedLogicControlFor() - -AbstractControl<dynamic>? _findAssociatedControlFor() - +ScreenerQuestionFormViewModel createDuplicate() - - - - - - - - - - - - StudyDesignEnrollmentFormView - - - - - - +Widget build() - -dynamic _showScreenerQuestionSidesheetWithArgs() - -dynamic _showConsentItemSidesheetWithArgs() - - - - - - - - - - - - - ConsentItemFormData - - - - - - +consentId: String - +title: String - +description: String - +iconName: String? - +id: String - - - - - - +ConsentItem toConsentItem() - +ConsentItemFormData copy() - - - - - - - - - - - - - EnrollmentFormViewModel - - - - - - +study: Study - +router: GoRouter - +consentItemDelegate: EnrollmentFormConsentItemDelegate - +enrollmentTypeControl: FormControl<Participation> - +consentItemArray: FormArray<dynamic> - +consentItemFormViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData> - +form: FormGroup - +enrollmentTypeControlOptions: List<FormControlOption<Participation>> - +consentItemModels: List<ConsentItemFormViewModel> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titles: Map<FormMode, String> - +canTestScreener: bool - +canTestConsent: bool - +questionTitles: Map<FormMode, String Function()> - - - - - - +void setControlsFrom() - +EnrollmentFormData buildFormData() - +void read() - +List<ModelAction<dynamic>> availableActions() - +List<ModelAction<dynamic>> availablePopupActions() - +List<ModelAction<dynamic>> availableInlineActions() - +void onSelectItem() - +void onNewItem() - +ScreenerQuestionFormRouteArgs buildNewScreenerQuestionFormRouteArgs() - +ScreenerQuestionFormRouteArgs buildScreenerQuestionFormRouteArgs() - +ConsentItemFormRouteArgs buildNewConsentItemFormRouteArgs() - +ConsentItemFormRouteArgs buildConsentItemFormRouteArgs() - +dynamic testScreener() - +dynamic testConsent() - +ScreenerQuestionFormViewModel provideQuestionFormViewModel() - - - - - - - - - - - - - EnrollmentFormConsentItemDelegate - - - - - - +formViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData> - +owner: EnrollmentFormViewModel - +propagateOnSave: bool - +validationSet: dynamic - - - - - - +void onCancel() - +dynamic onSave() - +ConsentItemFormViewModel provide() - +List<ModelAction<dynamic>> availableActions() - +void onNewItem() - +void onSelectItem() + + + + +Widget build() + -dynamic _buildInfoBanner() + -dynamic _buildAnswerOptionsLogicControls() + -List<Widget> _buildOptionLogicRow() - - - - - + + + + + - - - MeasurementsFormViewModel + + + ScreenerQuestionFormViewModel - - - +study: Study - +router: GoRouter - +measurementsArray: FormArray<dynamic> - +surveyMeasurementFormViewModels: FormViewModelCollection<MeasurementSurveyFormViewModel, MeasurementSurveyFormData> - +form: FormGroup - +measurementViewModels: List<MeasurementSurveyFormViewModel> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +measurementRequired: dynamic - +titles: Map<FormMode, String> + + + <static>+defaultResponseOptionValidity: bool + +responseOptionsDisabledArray: FormArray<dynamic> + +responseOptionsLogicControls: FormArray<bool> + +responseOptionsLogicDescriptionControls: FormArray<String> + -_questionBaseControls: Map<String, AbstractControl<dynamic>> + +prevResponseOptionControls: List<AbstractControl<dynamic>> + +prevResponseOptionValues: List<dynamic> + +responseOptionsDisabledControls: List<AbstractControl<dynamic>> + +logicControlOptions: List<FormControlOption<bool>> + +questionBaseControls: Map<String, AbstractControl<dynamic>> + +isDirtyOptionsBannerVisible: bool - - - +void read() - +void setControlsFrom() - +MeasurementsFormData buildFormData() - +List<ModelAction<dynamic>> availableActions() - +List<ModelAction<dynamic>> availablePopupActions() - +List<ModelAction<dynamic>> availableInlineActions() - +void onSelectItem() - +void onNewItem() - +MeasurementSurveyFormViewModel provide() - +void onCancel() - +dynamic onSave() + + + +dynamic onResponseOptionsChanged() + +void setControlsFrom() + +QuestionFormData buildFormData() + -List<FormControl<dynamic>> _copyFormControls() + -AbstractControl<dynamic>? _findAssociatedLogicControlFor() + -AbstractControl<dynamic>? _findAssociatedControlFor() + +ScreenerQuestionFormViewModel createDuplicate() - - - - - + + + + + - - - MeasurementSurveyFormData + + + ConsentItemFormData - - - +measurementId: String - +title: String - +introText: String? - +outroText: String? - +questionnaireFormData: QuestionnaireFormData - <static>+kDefaultTitle: String - +id: String + + + +consentId: String + +title: String + +description: String + +iconName: String? + +id: String - - - +QuestionnaireTask toQuestionnaireTask() - +MeasurementSurveyFormData copy() + + + +ConsentItem toConsentItem() + +ConsentItemFormData copy() - - - - - + + + + - - - SurveyPreview + + + ConsentItemFormView - - - +routeArgs: MeasurementFormRouteArgs + + + +formViewModel: ConsentItemFormViewModel - - - +Widget build() + + + + + + + + + + EnrollmentFormData - - - - + + + <static>+kDefaultEnrollmentType: Participation + +enrollmentType: Participation + +questionnaireFormData: QuestionnaireFormData + +consentItemsFormData: List<ConsentItemFormData>? + +id: String + + - - - MeasurementFormRouteArgs + + + +Study apply() + +EnrollmentFormData copy() - - - - - + + + + + - - - MeasurementSurveyFormViewModel + + + QuestionFormViewModel - - - +study: Study - +measurementIdControl: FormControl<String> - +instanceIdControl: FormControl<String> - +surveyTitleControl: FormControl<String> - +surveyIntroTextControl: FormControl<String> - +surveyOutroTextControl: FormControl<String> - +form: FormGroup - +measurementId: String - +instanceId: String - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titleRequired: dynamic - +atLeastOneQuestion: dynamic - +breadcrumbsTitle: String - +titles: Map<FormMode, String> + + + <static>+defaultQuestionType: SurveyQuestionType + -_titles: Map<FormMode, String Function()>? + +questionIdControl: FormControl<String> + +questionTypeControl: FormControl<SurveyQuestionType> + +questionTextControl: FormControl<String> + +questionInfoTextControl: FormControl<String> + +questionBaseControls: Map<String, AbstractControl<dynamic>> + +isMultipleChoiceControl: FormControl<bool> + +choiceResponseOptionsArray: FormArray<dynamic> + +customOptionsMin: int + +customOptionsMax: int + +customOptionsInitial: int + +boolResponseOptionsArray: FormArray<String> + <static>+kDefaultScaleMinValue: int + <static>+kDefaultScaleMaxValue: int + <static>+kNumMidValueControls: int + <static>+kMidValueDebounceMilliseconds: int + +scaleMinValueControl: FormControl<int> + +scaleMaxValueControl: FormControl<int> + -_scaleRangeControl: FormControl<int> + +scaleMinLabelControl: FormControl<String> + +scaleMaxLabelControl: FormControl<String> + +scaleMidValueControls: FormArray<int> + +scaleMidLabelControls: FormArray<String?> + -_scaleResponseOptionsArray: FormArray<int> + +scaleMinColorControl: FormControl<SerializableColor> + +scaleMaxColorControl: FormControl<SerializableColor> + +prevMidValues: List<int?>? + +freeTextTypeControl: FormControl<FreeTextQuestionType> + +customRegexControl: FormControl<String> + +freeTextResponseOptionsArray: FormArray<dynamic> + +freeTextLengthMin: AbstractControl<int> + +freeTextLengthMax: AbstractControl<int> + +freeTextExampleTextControl: FormControl<String> + <static>+kDefaultFreeTextMinLength: int + <static>+kDefaultFreeTextMaxLength: int + +freeTextLengthControl: FormControl<RangeValues> + -_controlsByQuestionType: Map<SurveyQuestionType, FormGroup> + -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + -_validationConfigsByQuestionType: Map<SurveyQuestionType, Map<FormValidationSetEnum, List<FormControlValidation>>> + +form: FormGroup + +questionId: String + +questionType: SurveyQuestionType + +questionTypeControlOptions: List<FormControlOption<SurveyQuestionType>> + +answerOptionsArray: FormArray<dynamic> + +answerOptionsControls: List<AbstractControl<dynamic>> + +validAnswerOptions: List<String> + +boolOptions: List<AbstractControl<String>> + +scaleMinValue: int + +scaleMaxValue: int + +scaleRange: int + +scaleAllValueControls: List<AbstractControl<int>> + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +questionTextRequired: dynamic + +numValidChoiceOptions: dynamic + +scaleRangeValid: dynamic + +titles: Map<FormMode, String> + +isAddOptionButtonVisible: bool + +isMidValuesClearedInfoVisible: bool - - - +void setControlsFrom() - +MeasurementSurveyFormData buildFormData() - +List<ModelAction<dynamic>> availableActions() - +List<ModelAction<dynamic>> availablePopupActions() - +List<ModelAction<dynamic>> availableInlineActions() - +void onSelectItem() - +void onNewItem() - +SurveyQuestionFormRouteArgs buildNewFormRouteArgs() - +SurveyQuestionFormRouteArgs buildFormRouteArgs() - +MeasurementSurveyFormViewModel createDuplicate() + + + +String? scaleMidLabelAt() + -dynamic _onScaleRangeChanged() + -dynamic _applyInputFormatters() + -dynamic _updateScaleMidValueControls() + -Map<String, dynamic>? _validateFreeText() + -dynamic _onFreeTextLengthChanged() + -List<FormControlValidation> _getValidationConfig() + +dynamic onQuestionTypeChanged() + +dynamic onResponseOptionsChanged() + -void _updateFormControls() + +void initControls() + +void setControlsFrom() + +QuestionFormData buildFormData() + +List<ModelAction<dynamic>> availableActions() + +void onNewItem() + +void onSelectItem() + +dynamic save() + +QuestionFormViewModel createDuplicate() - - - - + + + + + - - - MeasurementSurveyFormView + + + EnrollmentFormViewModel + + + + + + +study: Study + +router: GoRouter + +consentItemDelegate: EnrollmentFormConsentItemDelegate + +enrollmentTypeControl: FormControl<Participation> + +consentItemArray: FormArray<dynamic> + +consentItemFormViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData> + +form: FormGroup + +enrollmentTypeControlOptions: List<FormControlOption<Participation>> + +consentItemModels: List<ConsentItemFormViewModel> + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titles: Map<FormMode, String> + +canTestScreener: bool + +canTestConsent: bool + +questionTitles: Map<FormMode, String Function()> - - - +formViewModel: MeasurementSurveyFormViewModel + + + +void setControlsFrom() + +EnrollmentFormData buildFormData() + +void read() + +List<ModelAction<dynamic>> availableActions() + +List<ModelAction<dynamic>> availablePopupActions() + +List<ModelAction<dynamic>> availableInlineActions() + +void onSelectItem() + +void onNewItem() + +ScreenerQuestionFormRouteArgs buildNewScreenerQuestionFormRouteArgs() + +ScreenerQuestionFormRouteArgs buildScreenerQuestionFormRouteArgs() + +ConsentItemFormRouteArgs buildNewConsentItemFormRouteArgs() + +ConsentItemFormRouteArgs buildConsentItemFormRouteArgs() + +dynamic testScreener() + +dynamic testConsent() + +ScreenerQuestionFormViewModel provideQuestionFormViewModel() - - - - - + + + + + - - - MeasurementsFormData + + + EnrollmentFormConsentItemDelegate - - - +surveyMeasurements: List<MeasurementSurveyFormData> - +id: String + + + +formViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData> + +owner: EnrollmentFormViewModel + +propagateOnSave: bool + +validationSet: dynamic - - - +Study apply() - +MeasurementsFormData copy() + + + +void onCancel() + +dynamic onSave() + +ConsentItemFormViewModel provide() + +List<ModelAction<dynamic>> availableActions() + +void onNewItem() + +void onSelectItem() - - - - + + + + + - - - StudyDesignMeasurementsFormView + + + StudyFormViewModel - - - +Widget build() + + + +studyDirtyCopy: Study? + +studyRepository: IStudyRepository + +authRepository: IAuthRepository + +router: GoRouter + +studyInfoFormViewModel: StudyInfoFormViewModel + +enrollmentFormViewModel: EnrollmentFormViewModel + +measurementsFormViewModel: MeasurementsFormViewModel + +reportsFormViewModel: ReportsFormViewModel + +interventionsFormViewModel: InterventionsFormViewModel + +form: FormGroup + +isStudyReadonly: bool + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titles: Map<FormMode, String> + + + + + + +void read() + +void setControlsFrom() + +Study buildFormData() + +void dispose() + +void onCancel() + +dynamic onSave() + -dynamic _applyAndSaveSubform() - - - - + + + + + - - - StudyDesignInfoFormView + + + QuestionFormData - - - +Widget build() + + + <static>+questionTypeFormDataFactories: Map<SurveyQuestionType, QuestionFormData Function(Question<dynamic>, List<EligibilityCriterion>)> + +questionId: String + +questionText: String + +questionInfoText: String? + +questionType: SurveyQuestionType + +responseOptionsValidity: Map<dynamic, bool> + +responseOptions: List<dynamic> + +id: String - - - - - - - - - - StudyInfoFormData + + + +Question<dynamic> toQuestion() + +EligibilityCriterion toEligibilityCriterion() + +Answer<dynamic> constructAnswerFor() + +dynamic setResponseOptionsValidityFrom() + +QuestionFormData copy() - - - +title: String - +description: String? - +iconName: String - +contactInfoFormData: StudyContactInfoFormData - +id: String + + + + + + + + + SurveyQuestionType - - - +Study apply() - +StudyInfoFormData copy() + + + +index: int + <static>+values: List<SurveyQuestionType> + <static>+choice: SurveyQuestionType + <static>+bool: SurveyQuestionType + <static>+scale: SurveyQuestionType + <static>+freeText: SurveyQuestionType - - - - - + + + + + - - - StudyContactInfoFormData + + + ChoiceQuestionFormData - - - +organization: String? - +institutionalReviewBoard: String? - +institutionalReviewBoardNumber: String? - +researchers: String? - +email: String? - +website: String? - +phone: String? - +additionalInfo: String? - +id: String + + + +isMultipleChoice: bool + +answerOptions: List<String> + +responseOptions: List<String> - - - +Study apply() - +StudyInfoFormData copy() + + + +Question<dynamic> toQuestion() + +QuestionFormData copy() + -Choice _buildChoiceForValue() + +Answer<dynamic> constructAnswerFor() - - - - - + + + + + - - - StudyInfoFormViewModel + + + BoolQuestionFormData - - - +study: Study - +titleControl: FormControl<String> - +iconControl: FormControl<IconOption> - +descriptionControl: FormControl<String> - +organizationControl: FormControl<String> - +reviewBoardControl: FormControl<String> - +reviewBoardNumberControl: FormControl<String> - +researchersControl: FormControl<String> - +emailControl: FormControl<String> - +websiteControl: FormControl<String> - +phoneControl: FormControl<String> - +additionalInfoControl: FormControl<String> - +form: FormGroup - +titles: Map<FormMode, String> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titleRequired: dynamic - +descriptionRequired: dynamic - +iconRequired: dynamic - +organizationRequired: dynamic - +reviewBoardRequired: dynamic - +reviewBoardNumberRequired: dynamic - +researchersRequired: dynamic - +emailRequired: dynamic - +phoneRequired: dynamic - +emailFormat: dynamic - +websiteFormat: dynamic + + + <static>+kResponseOptions: Map<String, bool> + +responseOptions: List<String> - - - +void setControlsFrom() - +StudyInfoFormData buildFormData() + + + +Question<dynamic> toQuestion() + +BoolQuestionFormData copy() + +Answer<dynamic> constructAnswerFor() - - - - - + + + + + - - - StudyFormViewModel + + + ScaleQuestionFormData - - - +studyDirtyCopy: Study? - +studyRepository: IStudyRepository - +authRepository: IAuthRepository - +router: GoRouter - +studyInfoFormViewModel: StudyInfoFormViewModel - +enrollmentFormViewModel: EnrollmentFormViewModel - +measurementsFormViewModel: MeasurementsFormViewModel - +reportsFormViewModel: ReportsFormViewModel - +interventionsFormViewModel: InterventionsFormViewModel - +form: FormGroup - +isStudyReadonly: bool - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titles: Map<FormMode, String> + + + +minValue: double + +maxValue: double + +minLabel: String? + +maxLabel: String? + +midValues: List<double?> + +midLabels: List<String?> + +stepSize: double + +initialValue: double? + +minColor: Color? + +maxColor: Color? + +responseOptions: List<double> + +midAnnotations: List<Annotation> - - - +void read() - +void setControlsFrom() - +Study buildFormData() - +void dispose() - +void onCancel() - +dynamic onSave() - -dynamic _applyAndSaveSubform() + + + +ScaleQuestion toQuestion() + +QuestionFormData copy() + +Answer<dynamic> constructAnswerFor() - - - - - + + + + + - - - ReportsFormViewModel + + + FreeTextQuestionFormData - - - +study: Study - +router: GoRouter - +reportItemDelegate: ReportFormItemDelegate - +reportItemArray: FormArray<dynamic> - +reportItemFormViewModels: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData> - +form: FormGroup - +reportItemModels: List<ReportItemFormViewModel> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titles: Map<FormMode, String> - +canTestConsent: bool + + + +textLengthRange: List<int> + +textType: FreeTextQuestionType + +textTypeExpression: String? + +responseOptions: List<String> - - - +void setControlsFrom() - +ReportsFormData buildFormData() - +void read() - +ReportItemFormRouteArgs buildNewReportItemFormRouteArgs() - +ReportItemFormRouteArgs buildReportItemFormRouteArgs() - +dynamic testReport() - +void onCancel() - +dynamic onSave() - +ReportItemFormViewModel provide() + + + +Question<dynamic> toQuestion() + +FreeTextQuestionFormData copy() + +Answer<dynamic> constructAnswerFor() - - - - - + + + - - - ReportsFormData + + + FreeTextQuestionType - - - +reportItems: List<ReportItemFormData> - +id: String - - + + + + + + - - - +Study apply() - +ReportsFormData copy() + + + FreeTextQuestionFormView - - - - - - - - - ReportStatus + + + +formViewModel: QuestionFormViewModel + +generateLabelHelpTextMap: dynamic - - - +index: int - <static>+values: List<ReportStatus> - <static>+primary: ReportStatus - <static>+secondary: ReportStatus + + + +Widget build() + +Widget disableOnReadonly() + +Widget generateRow() - - - - - + + + + - - - ReportItemFormData + + + IScaleQuestionFormViewModel - - - +isPrimary: bool - +section: ReportSection - +id: String + + + +isMidValuesClearedInfoVisible: bool - - - <static>+dynamic fromDomainModel() - +ReportItemFormData copy() + + + + + + + + + ScaleQuestionFormView - - - - - - - - ReportSection + + + +formViewModel: QuestionFormViewModel - - - - - + + + + + - - - ReportItemFormViewModel + + + ChoiceQuestionFormView - - - <static>+defaultSectionType: ReportSectionType - +sectionIdControl: FormControl<String> - +sectionTypeControl: FormControl<ReportSectionType> - +titleControl: FormControl<String> - +descriptionControl: FormControl<String> - +sectionControl: FormControl<ReportSection> - +dataReferenceControl: FormControl<DataReferenceIdentifier<num>> - +temporalAggregationControl: FormControl<TemporalAggregationFormatted> - +improvementDirectionControl: FormControl<ImprovementDirectionFormatted> - +alphaControl: FormControl<double> - -_controlsBySectionType: Map<ReportSectionType, FormGroup> - -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - -_validationConfigsBySectionType: Map<ReportSectionType, Map<FormValidationSetEnum, List<FormControlValidation>>> - +sectionBaseControls: Map<String, AbstractControl<dynamic>> - +form: FormGroup - +sectionId: String - +sectionType: ReportSectionType - <static>+sectionTypeControlOptions: List<FormControlOption<ReportSectionType>> - <static>+temporalAggregationControlOptions: List<FormControlOption<TemporalAggregationFormatted>> - <static>+improvementDirectionControlOptions: List<FormControlOption<ImprovementDirectionFormatted>> - +titles: Map<FormMode, String> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titleRequired: dynamic - +descriptionRequired: dynamic - +dataReferenceRequired: dynamic - +aggregationRequired: dynamic - +improvementDirectionRequired: dynamic - +alphaConfidenceRequired: dynamic + + + +formViewModel: QuestionFormViewModel - - - -List<FormControlValidation> _getValidationConfig() - +ReportItemFormData buildFormData() - +ReportItemFormViewModel createDuplicate() - +dynamic onSectionTypeChanged() - -void _updateFormControls() - +void setControlsFrom() + + + +Widget build() - - - - + + + + + - - - ReportSectionType + + + BoolQuestionFormView - - - +index: int - <static>+values: List<ReportSectionType> - <static>+average: ReportSectionType - <static>+linearRegression: ReportSectionType + + + +formViewModel: QuestionFormViewModel + + + + + + +Widget build() - - - - - + + + + - - - LinearRegressionSectionFormView + + + SurveyQuestionFormView - - - +formViewModel: ReportItemFormViewModel - +studyId: String - +reportSectionColumnWidth: Map<int, TableColumnWidth> + + + +formViewModel: QuestionFormViewModel + +isHtmlStyleable: bool - - - +Widget build() + + + + + + + + StudyUTimeOfDay - - - - - + + + + + - - - AverageSectionFormView + + + ScheduleControls - - - +formViewModel: ReportItemFormViewModel - +studyId: String - +reportSectionColumnWidth: Map<int, TableColumnWidth> + + + +formViewModel: WithScheduleControls - - - +Widget build() + + + +Widget build() + -List<FormTableRow> _conditionalTimeRestrictions() - - - - - + + + + - - - TemporalAggregationFormatted + + + StudiesTableColumnHeader - - - -_value: TemporalAggregation - <static>+values: List<TemporalAggregationFormatted> - +value: TemporalAggregation - +string: String - +icon: IconData? - +hashCode: int + + + +title: String + +sortable: bool + +sortAscending: bool + +sortingActive: bool + +onSort: void Function()? - - - +bool ==() - +String toString() - +String toJson() - <static>+TemporalAggregationFormatted fromJson() + + + + + + + + + DashboardScreen + + + + + + +filter: StudiesFilter? - - - + + + + - - - TemporalAggregation + + + StudiesFilter + + + + + + +index: int + <static>+values: List<StudiesFilter> - - - - - + + + + + - - - ImprovementDirectionFormatted + + + DashboardScaffold - - - -_value: ImprovementDirection - <static>+values: List<ImprovementDirectionFormatted> - +value: ImprovementDirection - +string: String - +icon: IconData? - +hashCode: int + + + <static>+compactWidthThreshold: double + +body: Widget - - - +bool ==() - +String toString() - +String toJson() - <static>+ImprovementDirectionFormatted fromJson() + + + +Widget build() - - - + + + + + - - - ImprovementDirection + + + DashboardController - - - - - - - - - - DataReferenceEditor + + + +studyRepository: IStudyRepository + +authRepository: IAuthRepository + +userRepository: IUserRepository + +router: GoRouter + -_studiesSubscription: StreamSubscription<List<WrappedModel<Study>>>? + +searchController: SearchController + +isSortAscending: bool - - - +formControl: FormControl<DataReferenceIdentifier<T>> - +availableTasks: List<Task> - +buildReactiveDropdownField: ReactiveDropdownField<dynamic> + + + -dynamic _subscribeStudies() + +dynamic setSearchText() + +dynamic setStudiesFilter() + +dynamic onSelectStudy() + +dynamic onClickNewStudy() + +dynamic pinStudy() + +dynamic pinOffStudy() + +void setSorting() + +void filterStudies() + +void sortStudies() + +bool isSortingActiveForColumn() + +bool isPinned() + +List<ModelAction<dynamic>> availableActions() + +void dispose() - - - +FormTableRow buildFormTableRow() - -List<DropdownMenuItem<DataReferenceIdentifier<dynamic>>> _dataReferenceItems() + + + + + + + + IUserRepository - - - + + + - - - ReactiveDropdownField + + + SearchController - - - - - + + + + + - - - DataReferenceIdentifier + + + StudiesTableColumnSize - - - +hashCode: int + + + +collapsed: bool + +flex: int? + +width: double? - - - +bool ==() + + + +Widget createContainer() - - - + + + + + - - - DataReference + + + StudiesTable - - - - - - - - - - ReportItemFormView + + + +itemHeight: double + +itemPadding: double + +rowSpacing: double + +columnSpacing: double + +compactWidthThreshold: double + +superCompactWidthThreshold: double + +compactStatTitleThreshold: double + +studies: List<Study> + +onSelect: void Function(Study) + +getActions: List<ModelAction<dynamic>> Function(Study) + +emptyWidget: Widget + +pinnedStudies: Iterable<String> + +dashboardController: DashboardController - - - +formViewModel: ReportItemFormViewModel - +studyId: String - +reportSectionColumnWidth: dynamic - +sectionTypeBodyBuilder: Widget Function(BuildContext) + + + +Widget build() + -Widget _buildColumnHeader() - - - +Widget build() - -dynamic _buildSectionText() - -dynamic _buildSectionTypeHeader() + + + + + + + + void Function(Study) - - - + + + - - - Widget Function(BuildContext) + + + List<ModelAction<dynamic>> Function(Study) - - - - + + + + - - - StudyDesignReportsFormView + + + StudiesTableColumn - - - +Widget build() - -dynamic _showReportItemSidesheetWithArgs() + + + +index: int + <static>+values: List<StudiesTableColumn> + <static>+pin: StudiesTableColumn + <static>+title: StudiesTableColumn + <static>+status: StudiesTableColumn + <static>+participation: StudiesTableColumn + <static>+createdAt: StudiesTableColumn + <static>+enrolled: StudiesTableColumn + <static>+active: StudiesTableColumn + <static>+completed: StudiesTableColumn + <static>+action: StudiesTableColumn - - - - - + + + + - - - ReportFormItemDelegate + + + StudiesTableItem - - - +formViewModelCollection: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData> - +owner: ReportsFormViewModel - +propagateOnSave: bool - +validationSet: dynamic + + + +study: Study + +itemHeight: double + +itemPadding: double + +rowSpacing: double + +columnSpacing: double + +actions: List<ModelAction<dynamic>> + +columnSizes: List<StudiesTableColumnSize> + +isPinned: bool + +onPinnedChanged: void Function(Study, bool)? + +onTap: void Function(Study)? - - - +void onCancel() - +dynamic onSave() - +ReportItemFormViewModel provide() - +List<ModelAction<dynamic>> availableActions() - +void onNewItem() - +void onSelectItem() + + + + + + + + void Function(Study, bool)? - - - - - + + + - - - ReportBadge + + + void Function(Study)? - - - +status: ReportStatus? - +type: BadgeType - +showPrefixIcon: bool - +showTooltip: bool + + + + + + + + App - - - +Widget build() + + + + + + + + AppContent - - + + - + AccountSettingsDialog - + +Widget build() diff --git a/docs/uml/designer_v2/lib/uml.svg b/docs/uml/designer_v2/lib/uml.svg index d18e94f75..88247b56d 100644 --- a/docs/uml/designer_v2/lib/uml.svg +++ b/docs/uml/designer_v2/lib/uml.svg @@ -1,4 +1,4 @@ - + [Config | <static>+isDebugMode: bool; @@ -10,203 +10,238 @@ <static>+formAutosaveDebounce: int ] - [RoutingIntents + [<abstract>ResultTypes + ] + + [MeasurementResultTypes | - <static>+root: RoutingIntent; - <static>+studies: RoutingIntent; - <static>+studiesShared: RoutingIntent; - <static>+publicRegistry: RoutingIntent; - <static>+study: RoutingIntent Function(String); - <static>+studyEdit: RoutingIntent Function(String); - <static>+studyEditInfo: RoutingIntent Function(String); - <static>+studyEditEnrollment: RoutingIntent Function(String); - <static>+studyEditInterventions: RoutingIntent Function(String); - <static>+studyEditIntervention: RoutingIntent Function(String, String); - <static>+studyEditMeasurements: RoutingIntent Function(String); - <static>+studyEditReports: RoutingIntent Function(String); - <static>+studyEditMeasurement: RoutingIntent Function(String, String); - <static>+studyTest: RoutingIntent Function(String, {String? appRoute}); - <static>+studyRecruit: RoutingIntent Function(String); - <static>+studyMonitor: RoutingIntent Function(String); - <static>+studyAnalyze: RoutingIntent Function(String); - <static>+studySettings: RoutingIntent Function(String); - <static>+accountSettings: RoutingIntent; - <static>+studyNew: RoutingIntent; - <static>+login: RoutingIntent; - <static>+signup: RoutingIntent; - <static>+passwordForgot: RoutingIntent; - <static>+passwordForgot2: RoutingIntent Function(String); - <static>+passwordRecovery: RoutingIntent; - <static>+error: RoutingIntent Function(Exception) + <static>+questionnaire: String; + <static>+values: List<String> ] - [RoutingIntents]o-[RoutingIntent] - [RoutingIntents]o-[RoutingIntent Function(String)] - [RoutingIntents]o-[RoutingIntent Function(String, String)] - [RoutingIntents]o-[RoutingIntent Function(String, {String? appRoute})] - [RoutingIntents]o-[RoutingIntent Function(Exception)] + [<abstract>ResultTypes]<:-[MeasurementResultTypes] - [RoutingIntent - | - +route: GoRoute; - +params: Map<String, String>; - +queryParams: Map<String, String>; - +dispatch: RoutingIntentDispatch?; - +extra: Object?; - +routeName: String; - +arguments: Map<String, String>; - +props: List<Object?> + [InterventionResultTypes | - -dynamic _validateRoute(); - +bool matches() + <static>+checkmarkTask: String; + <static>+values: List<String> ] - [RoutingIntent]o-[GoRoute] - [RoutingIntent]o-[RoutingIntentDispatch] - [<abstract>Equatable]<:-[RoutingIntent] + [<abstract>ResultTypes]<:-[InterventionResultTypes] - [RoutingIntentDispatch + [StudyExportData | - +index: int; - <static>+values: List<RoutingIntentDispatch>; - <static>+go: RoutingIntentDispatch; - <static>+push: RoutingIntentDispatch + +study: Study; + +measurementsData: List<Map<String, dynamic>>; + +interventionsData: List<Map<String, dynamic>>; + +isEmpty: bool ] - [RoutingIntentDispatch]o-[RoutingIntentDispatch] - [Enum]<:--[RoutingIntentDispatch] + [StudyExportData]o-[Study] - [<abstract>GoRouteParamEnum + [StudyTemplates | - +String toRouteParam(); - +String toShortString() + <static>+kUnnamedStudyTitle: String + | + <static>+Study emptyDraft() ] - [RouterKeys + [StudyActionType | - <static>+studyKey: ValueKey<String>; - <static>+authKey: ValueKey<String> + +index: int; + <static>+values: List<StudyActionType>; + <static>+pin: StudyActionType; + <static>+pinoff: StudyActionType; + <static>+edit: StudyActionType; + <static>+duplicate: StudyActionType; + <static>+duplicateDraft: StudyActionType; + <static>+addCollaborator: StudyActionType; + <static>+export: StudyActionType; + <static>+delete: StudyActionType ] - [RouterKeys]o-[ValueKey] + [StudyActionType]o-[StudyActionType] + [Enum]<:--[StudyActionType] - [RouteParams + [Notifications | - <static>+studiesFilter: String; - <static>+studyId: String; - <static>+measurementId: String; - <static>+interventionId: String; - <static>+testAppRoute: String + <static>+credentialsInvalid: SnackbarIntent; + <static>+userAlreadyRegistered: SnackbarIntent; + <static>+passwordReset: SnackbarIntent; + <static>+passwordResetSuccess: SnackbarIntent; + <static>+studyDeleted: SnackbarIntent; + <static>+inviteCodeDeleted: SnackbarIntent; + <static>+inviteCodeClipped: SnackbarIntent; + <static>+studyDeleteConfirmation: AlertIntent ] - [RouterConf - | - <static>+router: GoRouter; - <static>+routes: List<GoRoute>; - <static>+publicRoutes: List<GoRoute>; - <static>+privateRoutes: List<GoRoute> + [Notifications]o-[SnackbarIntent] + [Notifications]o-[AlertIntent] + + [NotificationDefaultActions | - <static>+GoRoute route() + <static>+cancel: NotificationAction ] - [RouterConf]o-[GoRouter] + [NotificationDefaultActions]o-[NotificationAction] - [<abstract>StudyFormRouteArgs + [<abstract>INotificationService | - +studyId: String + +void showMessage(); + +void show(); + +Stream<NotificationIntent> watchNotifications(); + +void dispose() ] - [<abstract>QuestionFormRouteArgs + [NotificationService | - +questionId: String + -_streamController: BehaviorSubject<NotificationIntent> + | + +Stream<NotificationIntent> watchNotifications(); + +void showMessage(); + +void show(); + +void dispose() ] - [<abstract>StudyFormRouteArgs]<:-[<abstract>QuestionFormRouteArgs] + [NotificationService]o-[BehaviorSubject] + [<abstract>INotificationService]<:--[NotificationService] - [ScreenerQuestionFormRouteArgs + [<abstract>NotificationIntent + | + +message: String?; + +customContent: Widget?; + +icon: IconData?; + +actions: List<NotificationAction>?; + +type: NotificationType + | + +void register() ] - [<abstract>QuestionFormRouteArgs]<:-[ScreenerQuestionFormRouteArgs] + [<abstract>NotificationIntent]o-[<abstract>Widget] + [<abstract>NotificationIntent]o-[IconData] + [<abstract>NotificationIntent]o-[NotificationType] - [ConsentItemFormRouteArgs + [NotificationAction | - +consentId: String + +label: String; + +onSelect: dynamic Function(); + +isDestructive: bool ] - [<abstract>StudyFormRouteArgs]<:-[ConsentItemFormRouteArgs] + [NotificationAction]o-[dynamic Function()] - [MeasurementFormRouteArgs + [SnackbarIntent | - +measurementId: String + +duration: int? ] - [<abstract>StudyFormRouteArgs]<:-[MeasurementFormRouteArgs] + [<abstract>NotificationIntent]<:-[SnackbarIntent] - [SurveyQuestionFormRouteArgs + [AlertIntent | - +questionId: String + +title: String; + +dismissOnAction: bool; + +isDestructive: dynamic ] - [MeasurementFormRouteArgs]<:-[SurveyQuestionFormRouteArgs] - [<abstract>QuestionFormRouteArgs]<:--[SurveyQuestionFormRouteArgs] + [<abstract>NotificationIntent]<:-[AlertIntent] - [InterventionFormRouteArgs + [NotificationType | - +interventionId: String + +index: int; + <static>+values: List<NotificationType>; + <static>+snackbar: NotificationType; + <static>+alert: NotificationType; + <static>+custom: NotificationType ] - [<abstract>StudyFormRouteArgs]<:-[InterventionFormRouteArgs] + [NotificationType]o-[NotificationType] + [Enum]<:--[NotificationType] - [InterventionTaskFormRouteArgs + [<abstract>IClipboardService | - +taskId: String + +dynamic copy() ] - [InterventionFormRouteArgs]<:-[InterventionTaskFormRouteArgs] + [ClipboardService + | + +dynamic copy() + ] - [ReportItemFormRouteArgs + [<abstract>IClipboardService]<:--[ClipboardService] + + [NotificationDispatcher | - +sectionId: String + +child: Widget?; + +snackbarInnerPadding: double; + +snackbarWidth: double?; + +snackbarBehavior: SnackBarBehavior; + +snackbarDefaultDuration: int ] - [<abstract>StudyFormRouteArgs]<:-[ReportItemFormRouteArgs] + [NotificationDispatcher]o-[<abstract>Widget] + [NotificationDispatcher]o-[SnackBarBehavior] - [<abstract>ISyncIndicatorViewModel + [Assets | - +isDirty: bool; - +lastSynced: DateTime? + <static>+logoWide: String ] - [SyncIndicator + [AsyncValueWidget | - +state: AsyncValue<T>; - +lastSynced: DateTime?; - +isDirty: bool; - +animationDuration: int; - +iconSize: double + +value: AsyncValue<T>; + +data: Widget Function(T); + +error: Widget Function(Object, StackTrace?)?; + +loading: Widget Function()?; + +empty: Widget Function()? + | + +Widget build(); + -Widget _buildDataOrEmptyWidget(); + -Widget _defaultError(); + -Widget _defaultLoad() ] - [SyncIndicator]o-[<abstract>AsyncValue] + [AsyncValueWidget]o-[<abstract>AsyncValue] + [AsyncValueWidget]o-[Widget Function(T)] + [AsyncValueWidget]o-[Widget Function(Object, StackTrace?)?] + [AsyncValueWidget]o-[Widget Function()?] - [EmptyBody + [FormControlLabel | - +icon: IconData?; - +leading: Widget?; - +leadingSpacing: double?; - +title: String?; - +description: String?; - +button: Widget? + +formControl: AbstractControl<dynamic>; + +text: String; + +isClickable: bool; + +textStyle: TextStyle?; + +onClick: void Function(AbstractControl<dynamic>)? | +Widget build() ] - [EmptyBody]o-[IconData] - [EmptyBody]o-[<abstract>Widget] - - [NullHelperDecoration + [FormControlLabel]o-[<abstract>AbstractControl] + [FormControlLabel]o-[TextStyle] + [FormControlLabel]o-[void Function(AbstractControl<dynamic>)?] + + [ActionPopUpMenuButton + | + +actions: List<ModelAction<dynamic>>; + +triggerIconColor: Color?; + +triggerIconColorHover: Color?; + +triggerIconSize: double; + +disableSplashEffect: bool; + +hideOnEmpty: bool; + +orientation: Axis; + +elevation: double?; + +splashRadius: double?; + +enabled: bool; + +position: PopupMenuPosition + | + +Widget build(); + -Widget _buildPopupMenu() ] - [InputDecoration]<:-[NullHelperDecoration] + [ActionPopUpMenuButton]o-[Color] + [ActionPopUpMenuButton]o-[Axis] + [ActionPopUpMenuButton]o-[PopupMenuPosition] [Search | @@ -226,6 +261,18 @@ [SearchController]o-[void Function(String)] + [FormScaffold + | + +formViewModel: T; + +actions: List<Widget>?; + +body: Widget; + +drawer: Widget?; + +actionsSpacing: double; + +actionsPadding: double + ] + + [FormScaffold]o-[<abstract>Widget] + [ConstrainedWidthFlexible | +minWidth: double; @@ -242,47 +289,6 @@ [ConstrainedWidthFlexible]o-[<abstract>Widget] [ConstrainedWidthFlexible]o-[BoxConstraints] - [AsyncValueWidget - | - +value: AsyncValue<T>; - +data: Widget Function(T); - +error: Widget Function(Object, StackTrace?)?; - +loading: Widget Function()?; - +empty: Widget Function()? - | - +Widget build(); - -Widget _buildDataOrEmptyWidget(); - -Widget _defaultError(); - -Widget _defaultLoad() - ] - - [AsyncValueWidget]o-[<abstract>AsyncValue] - [AsyncValueWidget]o-[Widget Function(T)] - [AsyncValueWidget]o-[Widget Function(Object, StackTrace?)?] - [AsyncValueWidget]o-[Widget Function()?] - - [ActionPopUpMenuButton - | - +actions: List<ModelAction<dynamic>>; - +triggerIconColor: Color?; - +triggerIconColorHover: Color?; - +triggerIconSize: double; - +disableSplashEffect: bool; - +hideOnEmpty: bool; - +orientation: Axis; - +elevation: double?; - +splashRadius: double?; - +enabled: bool; - +position: PopupMenuPosition - | - +Widget build(); - -Widget _buildPopupMenu() - ] - - [ActionPopUpMenuButton]o-[Color] - [ActionPopUpMenuButton]o-[Axis] - [ActionPopUpMenuButton]o-[PopupMenuPosition] - [PrimaryButton | +text: String; @@ -305,36 +311,6 @@ [PrimaryButton]o-[EdgeInsets] [PrimaryButton]o-[Size] - [Hyperlink - | - +text: String; - +url: String?; - +onClick: void Function()?; - +linkColor: Color; - +hoverColor: Color?; - +visitedColor: Color?; - +style: TextStyle?; - +hoverStyle: TextStyle?; - +visitedStyle: TextStyle?; - +icon: IconData?; - +iconSize: double? - ] - - [Hyperlink]o-[void Function()?] - [Hyperlink]o-[Color] - [Hyperlink]o-[TextStyle] - [Hyperlink]o-[IconData] - - [DismissButton - | - +onPressed: void Function()?; - +text: String? - | - +Widget build() - ] - - [DismissButton]o-[void Function()?] - [FormTableRow | +label: String?; @@ -404,21 +380,150 @@ [FormTableRowLayout]o-[FormTableRowLayout] [Enum]<:--[FormTableRowLayout] - [ActionMenuType + [DismissButton + | + +onPressed: void Function()?; + +text: String? + | + +Widget build() + ] + + [DismissButton]o-[void Function()?] + + [Badge + | + +icon: IconData?; + +color: Color?; + +borderRadius: double; + +label: String; + +type: BadgeType; + +padding: EdgeInsets; + +iconSize: double?; + +labelStyle: TextStyle?; + +center: bool + | + +Widget build(); + -Color? _getBackgroundColor(); + -Color _getBorderColor(); + -Color? _getLabelColor() + ] + + [Badge]o-[IconData] + [Badge]o-[Color] + [Badge]o-[BadgeType] + [Badge]o-[EdgeInsets] + [Badge]o-[TextStyle] + + [BadgeType | +index: int; - <static>+values: List<ActionMenuType>; - <static>+inline: ActionMenuType; - <static>+popup: ActionMenuType + <static>+values: List<BadgeType>; + <static>+filled: BadgeType; + <static>+outlined: BadgeType; + <static>+outlineFill: BadgeType; + <static>+plain: BadgeType ] - [ActionMenuType]o-[ActionMenuType] - [Enum]<:--[ActionMenuType] + [BadgeType]o-[BadgeType] + [Enum]<:--[BadgeType] - [ReactiveCustomColorPicker + [StandardDialog + | + +title: Widget?; + +titleText: String?; + +body: Widget; + +actionButtons: List<Widget>; + +backgroundColor: Color?; + +borderRadius: double?; + +width: double?; + +height: double?; + +minWidth: double; + +minHeight: double; + +maxWidth: double?; + +maxHeight: double?; + +padding: EdgeInsets + | + +Widget build() ] - [ReactiveFormField]<:-[ReactiveCustomColorPicker] + [StandardDialog]o-[<abstract>Widget] + [StandardDialog]o-[Color] + [StandardDialog]o-[EdgeInsets] + + [<abstract>ISyncIndicatorViewModel + | + +isDirty: bool; + +lastSynced: DateTime? + ] + + [SyncIndicator + | + +state: AsyncValue<T>; + +lastSynced: DateTime?; + +isDirty: bool; + +animationDuration: int; + +iconSize: double + ] + + [SyncIndicator]o-[<abstract>AsyncValue] + + [<abstract>IWithBanner + | + +Widget? banner() + ] + + [BannerBox + | + +prefixIcon: Widget?; + +body: Widget; + +style: BannerStyle; + +padding: EdgeInsets?; + +noPrefix: bool; + +dismissable: bool; + +isDismissed: bool?; + +onDismissed: dynamic Function()?; + +dismissIconSize: double + ] + + [BannerBox]o-[<abstract>Widget] + [BannerBox]o-[BannerStyle] + [BannerBox]o-[EdgeInsets] + [BannerBox]o-[dynamic Function()?] + + [BannerStyle + | + +index: int; + <static>+values: List<BannerStyle>; + <static>+warning: BannerStyle; + <static>+info: BannerStyle; + <static>+error: BannerStyle + ] + + [BannerStyle]o-[BannerStyle] + [Enum]<:--[BannerStyle] + + [ActionMenuInline + | + +actions: List<ModelAction<dynamic>>; + +iconSize: double?; + +visible: bool; + +splashRadius: double?; + +paddingVertical: double?; + +paddingHorizontal: double? + | + +Widget build() + ] + + [Collapsible + | + +contentBuilder: Widget Function(BuildContext, bool); + +headerBuilder: Widget Function(BuildContext, bool)?; + +title: String?; + +isCollapsed: bool + ] + + [Collapsible]o-[Widget Function(BuildContext, bool)] + [Collapsible]o-[Widget Function(BuildContext, bool)?] [NavbarTab | @@ -454,35 +559,7 @@ [TabbedNavbar]o-[EdgeInsets] [TabbedNavbar]o-[TabBarIndicatorSize] - [Collapsible - | - +contentBuilder: Widget Function(BuildContext, bool); - +headerBuilder: Widget Function(BuildContext, bool)?; - +title: String?; - +isCollapsed: bool - ] - - [Collapsible]o-[Widget Function(BuildContext, bool)] - [Collapsible]o-[Widget Function(BuildContext, bool)?] - - [StudyULogo - | - +onTap: void Function()? - | - +Widget build() - ] - - [StudyULogo]o-[void Function()?] - - [FormSideSheetTab - | - +formViewBuilder: Widget Function(T) - ] - - [FormSideSheetTab]o-[Widget Function(T)] - [NavbarTab]<:-[FormSideSheetTab] - - [SidesheetTab + [SidesheetTab | +builder: Widget Function(BuildContext) ] @@ -509,6 +586,49 @@ [Sidesheet]o-[EdgeInsets] [Sidesheet]o-[Widget Function(Widget)?] + [FormSideSheetTab + | + +formViewBuilder: Widget Function(T) + ] + + [FormSideSheetTab]o-[Widget Function(T)] + [NavbarTab]<:-[FormSideSheetTab] + + [HelpIcon + | + +tooltipText: String? + | + +Widget build() + ] + + [EmptyBody + | + +icon: IconData?; + +leading: Widget?; + +leadingSpacing: double?; + +title: String?; + +description: String?; + +button: Widget? + | + +Widget build() + ] + + [EmptyBody]o-[IconData] + [EmptyBody]o-[<abstract>Widget] + + [IndicatorRangeSliderThumbShape + | + +buildContext: BuildContext; + +start: T; + +end: T + | + +Size getPreferredSize(); + +void paint() + ] + + [IndicatorRangeSliderThumbShape]o-[<abstract>BuildContext] + [<abstract>RangeSliderThumbShape]<:-[IndicatorRangeSliderThumbShape] + [MouseEventsRegion | +onTap: void Function()?; @@ -527,140 +647,86 @@ [MouseEventsRegion]o-[void Function(PointerExitEvent)?] [MouseEventsRegion]o-[SystemMouseCursor] - [FormControlLabel + [ReactiveCustomColorPicker + ] + + [ReactiveFormField]<:-[ReactiveCustomColorPicker] + + [TextParagraph | - +formControl: AbstractControl<dynamic>; - +text: String; - +isClickable: bool; - +textStyle: TextStyle?; - +onClick: void Function(AbstractControl<dynamic>)? + +text: String?; + +style: TextStyle?; + +selectable: bool; + +span: List<TextSpan>? | +Widget build() ] - [FormControlLabel]o-[<abstract>AbstractControl] - [FormControlLabel]o-[TextStyle] - [FormControlLabel]o-[void Function(AbstractControl<dynamic>)?] + [TextParagraph]o-[TextStyle] - [<abstract>IWithBanner + [UnderConstruction | - +Widget? banner() + +Widget build() ] - [BannerBox - | - +prefixIcon: Widget?; - +body: Widget; - +style: BannerStyle; - +padding: EdgeInsets?; - +noPrefix: bool; - +dismissable: bool; - +isDismissed: bool?; - +onDismissed: dynamic Function()?; - +dismissIconSize: double + [NullHelperDecoration ] - [BannerBox]o-[<abstract>Widget] - [BannerBox]o-[BannerStyle] - [BannerBox]o-[EdgeInsets] - [BannerBox]o-[dynamic Function()?] + [InputDecoration]<:-[NullHelperDecoration] - [BannerStyle + [ActionMenuType | +index: int; - <static>+values: List<BannerStyle>; - <static>+warning: BannerStyle; - <static>+info: BannerStyle; - <static>+error: BannerStyle + <static>+values: List<ActionMenuType>; + <static>+inline: ActionMenuType; + <static>+popup: ActionMenuType ] - [BannerStyle]o-[BannerStyle] - [Enum]<:--[BannerStyle] + [ActionMenuType]o-[ActionMenuType] + [Enum]<:--[ActionMenuType] - [SecondaryButton + [HtmlStylingBanner | - +text: String; - +icon: IconData?; - +isLoading: bool; - +onPressed: void Function()? + +isDismissed: bool; + +onDismissed: dynamic Function()? | +Widget build() ] - [SecondaryButton]o-[IconData] - [SecondaryButton]o-[void Function()?] + [HtmlStylingBanner]o-[dynamic Function()?] - [IconPack - | - <static>+defaultPack: List<IconOption>; - <static>+material: List<IconOption> + [<abstract>FormConsumerWidget | - <static>+IconOption? resolveIconByName() + +Widget build() ] - [IconOption - | - +name: String; - +icon: IconData?; - +isEmpty: bool; - +props: List<Object?> + [<abstract>FormConsumerRefWidget | - +String toJson(); - <static>+IconOption fromJson() - ] - - [IconOption]o-[IconData] - [<abstract>Equatable]<:-[IconOption] - - [ReactiveIconPicker + +Widget build() ] - [ReactiveFocusableFormField]<:-[ReactiveIconPicker] - - [IconPicker - | - +iconOptions: List<IconOption>; - +selectedOption: IconOption?; - +onSelect: void Function(IconOption)?; - +galleryIconSize: double?; - +selectedIconSize: double?; - +focusNode: FocusNode?; - +isDisabled: bool + [SplashPage | +Widget build() ] - [IconPicker]o-[IconOption] - [IconPicker]o-[void Function(IconOption)?] - [IconPicker]o-[FocusNode] - - [IconPickerField + [ErrorPage | - +iconOptions: List<IconOption>; - +selectedOption: IconOption?; - +selectedIconSize: double?; - +galleryIconSize: double?; - +onSelect: void Function(IconOption)?; - +focusNode: FocusNode?; - +isDisabled: bool + +error: Exception? | +Widget build() ] - [IconPickerField]o-[IconOption] - [IconPickerField]o-[void Function(IconOption)?] - [IconPickerField]o-[FocusNode] + [<abstract>ConsumerWidget]<:-[ErrorPage] - [IconPickerGallery + [StudyULogo | - +iconOptions: List<IconOption>; - +onSelect: void Function(IconOption)?; - +iconSize: double + +onTap: void Function()? | +Widget build() ] - [IconPickerGallery]o-[void Function(IconOption)?] + [StudyULogo]o-[void Function()?] [SingleColumnLayout | @@ -693,75 +759,40 @@ [SingleColumnLayoutType]o-[SingleColumnLayoutType] [Enum]<:--[SingleColumnLayoutType] - [<abstract>FormConsumerWidget + [Hyperlink | - +Widget build() + +text: String; + +url: String?; + +onClick: void Function()?; + +linkColor: Color; + +hoverColor: Color?; + +visitedColor: Color?; + +style: TextStyle?; + +hoverStyle: TextStyle?; + +visitedStyle: TextStyle?; + +icon: IconData?; + +iconSize: double? ] - [<abstract>FormConsumerRefWidget - | - +Widget build() - ] + [Hyperlink]o-[void Function()?] + [Hyperlink]o-[Color] + [Hyperlink]o-[TextStyle] + [Hyperlink]o-[IconData] - [FormScaffold + [StandardTableColumn | - +formViewModel: T; - +actions: List<Widget>?; - +body: Widget; - +drawer: Widget?; - +actionsSpacing: double; - +actionsPadding: double + +label: String; + +tooltip: String?; + +columnWidth: TableColumnWidth; + +sortable: bool; + +sortAscending: bool?; + +sortableIcon: Widget? ] - [FormScaffold]o-[<abstract>Widget] + [StandardTableColumn]o-[<abstract>TableColumnWidth] + [StandardTableColumn]o-[<abstract>Widget] - [StandardDialog - | - +title: Widget?; - +titleText: String?; - +body: Widget; - +actionButtons: List<Widget>; - +backgroundColor: Color?; - +borderRadius: double?; - +width: double?; - +height: double?; - +minWidth: double; - +minHeight: double; - +maxWidth: double?; - +maxHeight: double?; - +padding: EdgeInsets - | - +Widget build() - ] - - [StandardDialog]o-[<abstract>Widget] - [StandardDialog]o-[Color] - [StandardDialog]o-[EdgeInsets] - - [HtmlStylingBanner - | - +isDismissed: bool; - +onDismissed: dynamic Function()? - | - +Widget build() - ] - - [HtmlStylingBanner]o-[dynamic Function()?] - - [StandardTableColumn - | - +label: String; - +tooltip: String?; - +columnWidth: TableColumnWidth; - +sortable: bool; - +sortAscending: bool?; - +sortableIcon: Widget? - ] - - [StandardTableColumn]o-[<abstract>TableColumnWidth] - [StandardTableColumn]o-[<abstract>Widget] - - [StandardTable + [StandardTable | +items: List<T>; +inputColumns: List<StandardTableColumn>; @@ -777,6 +808,7 @@ +cellSpacing: double; +rowSpacing: double; +minRowHeight: double?; + +headerMaxLines: int; +showTableHeader: bool; +hideLeadingTrailingWhenEmpty: bool; +leadingWidget: Widget?; @@ -809,6 +841,91 @@ [StandardTableStyle]o-[StandardTableStyle] [Enum]<:--[StandardTableStyle] + [IconPack + | + <static>+defaultPack: List<IconOption>; + <static>+material: List<IconOption> + | + <static>+IconOption? resolveIconByName() + ] + + [IconOption + | + +name: String; + +icon: IconData?; + +isEmpty: bool; + +props: List<Object?> + | + +String toJson(); + <static>+IconOption fromJson() + ] + + [IconOption]o-[IconData] + [<abstract>Equatable]<:-[IconOption] + + [ReactiveIconPicker + ] + + [ReactiveFocusableFormField]<:-[ReactiveIconPicker] + + [IconPicker + | + +iconOptions: List<IconOption>; + +selectedOption: IconOption?; + +onSelect: void Function(IconOption)?; + +galleryIconSize: double?; + +selectedIconSize: double?; + +focusNode: FocusNode?; + +isDisabled: bool + | + +Widget build() + ] + + [IconPicker]o-[IconOption] + [IconPicker]o-[void Function(IconOption)?] + [IconPicker]o-[FocusNode] + + [IconPickerField + | + +iconOptions: List<IconOption>; + +selectedOption: IconOption?; + +selectedIconSize: double?; + +galleryIconSize: double?; + +onSelect: void Function(IconOption)?; + +focusNode: FocusNode?; + +isDisabled: bool + | + +Widget build() + ] + + [IconPickerField]o-[IconOption] + [IconPickerField]o-[void Function(IconOption)?] + [IconPickerField]o-[FocusNode] + + [IconPickerGallery + | + +iconOptions: List<IconOption>; + +onSelect: void Function(IconOption)?; + +iconSize: double + | + +Widget build() + ] + + [IconPickerGallery]o-[void Function(IconOption)?] + + [SecondaryButton + | + +text: String; + +icon: IconData?; + +isLoading: bool; + +onPressed: void Function()? + | + +Widget build() + ] + + [SecondaryButton]o-[IconData] + [SecondaryButton]o-[void Function()?] + [TwoColumnLayout | <static>+defaultDivider: VerticalDivider; @@ -837,906 +954,793 @@ [TwoColumnLayout]o-[BoxConstraints] [TwoColumnLayout]o-[Color] - [ActionMenuInline - | - +actions: List<ModelAction<dynamic>>; - +iconSize: double?; - +visible: bool; - +splashRadius: double?; - +paddingVertical: double?; - +paddingHorizontal: double? + [AppTranslation | - +Widget build() + <static>+dynamic init() ] - [TextParagraph - | - +text: String?; - +style: TextStyle?; - +selectable: bool; - +span: List<TextSpan>? + [<abstract>PlatformLocale | - +Widget build() + +Locale getPlatformLocale() ] - [TextParagraph]o-[TextStyle] - - [SplashPage + [PlatformLocaleWeb | - +Widget build() + +Locale getPlatformLocale() ] - [ErrorPage - | - +error: Exception? + [<abstract>PlatformLocale]<:--[PlatformLocaleWeb] + + [PlatformLocaleMobile | - +Widget build() + +Locale getPlatformLocale() ] - [<abstract>ConsumerWidget]<:-[ErrorPage] + [<abstract>PlatformLocale]<:--[PlatformLocaleMobile] - [Badge - | - +icon: IconData?; - +color: Color?; - +borderRadius: double; - +label: String; - +type: BadgeType; - +padding: EdgeInsets; - +iconSize: double?; - +labelStyle: TextStyle?; - +center: bool + [LanguagePicker | - +Widget build(); - -Color? _getBackgroundColor(); - -Color _getBorderColor(); - -Color? _getLabelColor() + +languagePickerType: LanguagePickerType; + +iconColor: Color?; + +offset: Offset? ] - [Badge]o-[IconData] - [Badge]o-[Color] - [Badge]o-[BadgeType] - [Badge]o-[EdgeInsets] - [Badge]o-[TextStyle] + [LanguagePicker]o-[LanguagePickerType] + [LanguagePicker]o-[Color] + [LanguagePicker]o-[Offset] - [BadgeType + [LanguagePickerType | +index: int; - <static>+values: List<BadgeType>; - <static>+filled: BadgeType; - <static>+outlined: BadgeType; - <static>+outlineFill: BadgeType; - <static>+plain: BadgeType + <static>+values: List<LanguagePickerType>; + <static>+field: LanguagePickerType; + <static>+icon: LanguagePickerType ] - [BadgeType]o-[BadgeType] - [Enum]<:--[BadgeType] + [LanguagePickerType]o-[LanguagePickerType] + [Enum]<:--[LanguagePickerType] - [IndicatorRangeSliderThumbShape + [<abstract>GoRouteParamEnum | - +buildContext: BuildContext; - +start: T; - +end: T + +String toRouteParam(); + +String toShortString() + ] + + [RoutingIntents | - +Size getPreferredSize(); - +void paint() + <static>+root: RoutingIntent; + <static>+studies: RoutingIntent; + <static>+studiesShared: RoutingIntent; + <static>+publicRegistry: RoutingIntent; + <static>+study: RoutingIntent Function(String); + <static>+studyEdit: RoutingIntent Function(String); + <static>+studyEditInfo: RoutingIntent Function(String); + <static>+studyEditEnrollment: RoutingIntent Function(String); + <static>+studyEditInterventions: RoutingIntent Function(String); + <static>+studyEditIntervention: RoutingIntent Function(String, String); + <static>+studyEditMeasurements: RoutingIntent Function(String); + <static>+studyEditReports: RoutingIntent Function(String); + <static>+studyEditMeasurement: RoutingIntent Function(String, String); + <static>+studyTest: RoutingIntent Function(String, {String? appRoute}); + <static>+studyRecruit: RoutingIntent Function(String); + <static>+studyMonitor: RoutingIntent Function(String); + <static>+studyAnalyze: RoutingIntent Function(String); + <static>+studySettings: RoutingIntent Function(String); + <static>+accountSettings: RoutingIntent; + <static>+studyNew: RoutingIntent; + <static>+login: RoutingIntent; + <static>+signup: RoutingIntent; + <static>+passwordForgot: RoutingIntent; + <static>+passwordForgot2: RoutingIntent Function(String); + <static>+passwordRecovery: RoutingIntent; + <static>+error: RoutingIntent Function(Exception) ] - [IndicatorRangeSliderThumbShape]o-[<abstract>BuildContext] - [<abstract>RangeSliderThumbShape]<:-[IndicatorRangeSliderThumbShape] + [RoutingIntents]o-[RoutingIntent] + [RoutingIntents]o-[RoutingIntent Function(String)] + [RoutingIntents]o-[RoutingIntent Function(String, String)] + [RoutingIntents]o-[RoutingIntent Function(String, {String? appRoute})] + [RoutingIntents]o-[RoutingIntent Function(Exception)] - [HelpIcon + [RoutingIntent | - +tooltipText: String? + +route: GoRoute; + +params: Map<String, String>; + +queryParams: Map<String, String>; + +dispatch: RoutingIntentDispatch?; + +extra: Object?; + +routeName: String; + +arguments: Map<String, String>; + +props: List<Object?> | - +Widget build() + -dynamic _validateRoute(); + +bool matches() ] - [UnderConstruction - | - +Widget build() - ] + [RoutingIntent]o-[GoRoute] + [RoutingIntent]o-[RoutingIntentDispatch] + [<abstract>Equatable]<:-[RoutingIntent] - [NotificationDispatcher - | - +child: Widget?; - +snackbarInnerPadding: double; - +snackbarWidth: double?; - +snackbarBehavior: SnackBarBehavior; - +snackbarDefaultDuration: int - ] - - [NotificationDispatcher]o-[<abstract>Widget] - [NotificationDispatcher]o-[SnackBarBehavior] - - [<abstract>NotificationIntent - | - +message: String?; - +customContent: Widget?; - +icon: IconData?; - +actions: List<NotificationAction>?; - +type: NotificationType + [RoutingIntentDispatch | - +void register() + +index: int; + <static>+values: List<RoutingIntentDispatch>; + <static>+go: RoutingIntentDispatch; + <static>+push: RoutingIntentDispatch ] - [<abstract>NotificationIntent]o-[<abstract>Widget] - [<abstract>NotificationIntent]o-[IconData] - [<abstract>NotificationIntent]o-[NotificationType] + [RoutingIntentDispatch]o-[RoutingIntentDispatch] + [Enum]<:--[RoutingIntentDispatch] - [NotificationAction + [RouterKeys | - +label: String; - +onSelect: dynamic Function(); - +isDestructive: bool + <static>+studyKey: ValueKey<String>; + <static>+authKey: ValueKey<String> ] - [NotificationAction]o-[dynamic Function()] + [RouterKeys]o-[ValueKey] - [SnackbarIntent + [RouteParams | - +duration: int? + <static>+studiesFilter: String; + <static>+studyId: String; + <static>+measurementId: String; + <static>+interventionId: String; + <static>+testAppRoute: String ] - [<abstract>NotificationIntent]<:-[SnackbarIntent] - - [AlertIntent + [RouterConf | - +title: String; - +dismissOnAction: bool; - +isDestructive: dynamic - ] - - [<abstract>NotificationIntent]<:-[AlertIntent] - - [NotificationType + <static>+router: GoRouter; + <static>+routes: List<GoRoute>; + <static>+publicRoutes: List<GoRoute>; + <static>+privateRoutes: List<GoRoute> | - +index: int; - <static>+values: List<NotificationType>; - <static>+snackbar: NotificationType; - <static>+alert: NotificationType; - <static>+custom: NotificationType + <static>+GoRoute route() ] - [NotificationType]o-[NotificationType] - [Enum]<:--[NotificationType] + [RouterConf]o-[GoRouter] - [<abstract>INotificationService + [<abstract>StudyFormRouteArgs | - +void showMessage(); - +void show(); - +Stream<NotificationIntent> watchNotifications(); - +void dispose() + +studyId: String ] - [NotificationService - | - -_streamController: BehaviorSubject<NotificationIntent> + [<abstract>QuestionFormRouteArgs | - +Stream<NotificationIntent> watchNotifications(); - +void showMessage(); - +void show(); - +void dispose() + +questionId: String ] - [NotificationService]o-[BehaviorSubject] - [<abstract>INotificationService]<:--[NotificationService] + [<abstract>StudyFormRouteArgs]<:-[<abstract>QuestionFormRouteArgs] - [Notifications - | - <static>+credentialsInvalid: SnackbarIntent; - <static>+userAlreadyRegistered: SnackbarIntent; - <static>+passwordReset: SnackbarIntent; - <static>+passwordResetSuccess: SnackbarIntent; - <static>+studyDeleted: SnackbarIntent; - <static>+inviteCodeDeleted: SnackbarIntent; - <static>+inviteCodeClipped: SnackbarIntent; - <static>+studyDeleteConfirmation: AlertIntent + [ScreenerQuestionFormRouteArgs ] - [Notifications]o-[SnackbarIntent] - [Notifications]o-[AlertIntent] + [<abstract>QuestionFormRouteArgs]<:-[ScreenerQuestionFormRouteArgs] - [NotificationDefaultActions + [ConsentItemFormRouteArgs | - <static>+cancel: NotificationAction + +consentId: String ] - [NotificationDefaultActions]o-[NotificationAction] + [<abstract>StudyFormRouteArgs]<:-[ConsentItemFormRouteArgs] - [<abstract>IClipboardService + [MeasurementFormRouteArgs | - +dynamic copy() + +measurementId: String ] - [ClipboardService + [<abstract>StudyFormRouteArgs]<:-[MeasurementFormRouteArgs] + + [SurveyQuestionFormRouteArgs | - +dynamic copy() + +questionId: String ] - [<abstract>IClipboardService]<:--[ClipboardService] + [MeasurementFormRouteArgs]<:-[SurveyQuestionFormRouteArgs] + [<abstract>QuestionFormRouteArgs]<:--[SurveyQuestionFormRouteArgs] - [Assets + [InterventionFormRouteArgs | - <static>+logoWide: String + +interventionId: String ] - [SignupForm - | - +formKey: AuthFormKey + [<abstract>StudyFormRouteArgs]<:-[InterventionFormRouteArgs] + + [InterventionTaskFormRouteArgs | - +Widget build(); - -dynamic _onClickTermsOfUse(); - -dynamic _onClickPrivacyPolicy() + +taskId: String ] - [SignupForm]o-[AuthFormKey] - [<abstract>FormConsumerRefWidget]<:-[SignupForm] + [InterventionFormRouteArgs]<:-[InterventionTaskFormRouteArgs] - [AuthFormController - | - +authRepository: IAuthRepository; - +sharedPreferences: SharedPreferences; - +notificationService: INotificationService; - +router: GoRouter; - +emailControl: FormControl<String>; - +passwordControl: FormControl<String>; - +passwordConfirmationControl: FormControl<String>; - +rememberMeControl: FormControl<bool>; - +termsOfServiceControl: FormControl<bool>; - <static>+authValidationMessages: Map<String, String Function(dynamic)>; - +loginForm: FormGroup; - +signupForm: FormGroup; - +passwordForgotForm: FormGroup; - +passwordRecoveryForm: FormGroup; - +controlValidatorsByForm: Map<AuthFormKey, Map<FormControl<dynamic>, List<Validator<dynamic>>>>; - -_formKey: AuthFormKey; - +shouldRemember: bool; - +formKey: AuthFormKey; - +form: FormGroup + [ReportItemFormRouteArgs | - -dynamic _getFormFor(); - -dynamic _onChangeFormKey(); - +dynamic resetControlsFor(); - -dynamic _forceValidationMessages(); - +dynamic signUp(); - -dynamic _signUp(); - +dynamic signIn(); - -dynamic _signInWith(); - +dynamic signOut(); - +dynamic resetPasswordForEmail(); - +dynamic sendPasswordResetLink(); - +dynamic recoverPassword(); - +dynamic updateUser(); - -dynamic _readDebugUser(); - -void _setRememberMe(); - -void _delRememberMe(); - -void _initRememberMe() + +sectionId: String ] - [AuthFormController]o-[<abstract>IAuthRepository] - [AuthFormController]o-[SharedPreferences] - [AuthFormController]o-[<abstract>INotificationService] - [AuthFormController]o-[GoRouter] - [AuthFormController]o-[FormControl] - [AuthFormController]o-[FormGroup] - [AuthFormController]o-[AuthFormKey] - [<abstract>IFormGroupController]<:--[AuthFormController] + [<abstract>StudyFormRouteArgs]<:-[ReportItemFormRouteArgs] - [AuthFormKey + [DropdownMenuItemTheme | - +index: int; - <static>+values: List<AuthFormKey>; - <static>+login: AuthFormKey; - <static>+signup: AuthFormKey; - <static>+passwordForgot: AuthFormKey; - <static>+passwordRecovery: AuthFormKey; - <static>-_loginSubmit: AuthFormKey; - <static>-_signupSubmit: AuthFormKey + +iconTheme: IconThemeData? ] - [AuthFormKey]o-[AuthFormKey] - [Enum]<:--[AuthFormKey] + [DropdownMenuItemTheme]o-[IconThemeData] + [<abstract>Diagnosticable]<:-[DropdownMenuItemTheme] - [PasswordForgotForm + [ThemeConfig | - +formKey: AuthFormKey + <static>+kMinContentWidth: double; + <static>+kMaxContentWidth: double; + <static>+kHoverFadeFactor: double; + <static>+kMuteFadeFactor: double | - +Widget build() + <static>+dynamic bodyBackgroundColor(); + <static>+Color modalBarrierColor(); + <static>+Color containerColor(); + <static>+Color colorPickerInitialColor(); + <static>+TextStyle bodyTextMuted(); + <static>+TextStyle bodyTextBackground(); + <static>+double iconSplashRadius(); + <static>+Color sidesheetBackgroundColor(); + <static>+InputDecorationTheme dropdownInputDecorationTheme(); + <static>+DropdownMenuItemTheme dropdownMenuItemTheme() ] - [PasswordForgotForm]o-[AuthFormKey] - [<abstract>FormConsumerRefWidget]<:-[PasswordForgotForm] - - [EmailTextField + [NoAnimationPageTransitionsBuilder | - +labelText: String; - +hintText: String?; - +formControlName: String?; - +formControl: FormControl<dynamic>? + +Widget buildTransitions() ] - [EmailTextField]o-[FormControl] + [<abstract>PageTransitionsBuilder]<:-[NoAnimationPageTransitionsBuilder] - [PasswordTextField + [WebTransitionBuilder | - +labelText: String; - +hintText: String?; - +onSubmitted: dynamic Function(FormControl<dynamic>)?; - +formControlName: String?; - +formControl: FormControl<dynamic>? + +Widget buildTransitions() ] - [PasswordTextField]o-[dynamic Function(FormControl<dynamic>)?] - [PasswordTextField]o-[FormControl] + [<abstract>PageTransitionsBuilder]<:-[WebTransitionBuilder] - [PasswordRecoveryForm - | - +formKey: AuthFormKey + [ThemeSettingChange | - +Widget build() + +settings: ThemeSettings ] - [PasswordRecoveryForm]o-[AuthFormKey] - [<abstract>FormConsumerRefWidget]<:-[PasswordRecoveryForm] + [ThemeSettingChange]o-[ThemeSettings] + [<abstract>Notification]<:-[ThemeSettingChange] - [AuthScaffold + [ThemeProvider | - +body: Widget; - +formKey: AuthFormKey; - +leftContentMinWidth: double; - +leftPanelMinWidth: double; - +leftPanelPadding: EdgeInsets + +settings: ValueNotifier<ThemeSettings>; + +lightDynamic: ColorScheme?; + +darkDynamic: ColorScheme?; + +pageTransitionsTheme: PageTransitionsTheme; + +shapeMedium: ShapeBorder + | + +Color custom(); + +Color blend(); + +Color source(); + +ColorScheme colors(); + +CardTheme cardTheme(); + +ListTileThemeData listTileTheme(); + +AppBarTheme appBarTheme(); + +SnackBarThemeData snackBarThemeData(); + +TabBarTheme tabBarTheme(); + +BottomAppBarTheme bottomAppBarTheme(); + +BottomNavigationBarThemeData bottomNavigationBarTheme(); + +SwitchThemeData switchTheme(); + +InputDecorationTheme inputDecorationTheme(); + +TextTheme textTheme(); + +DividerThemeData dividerTheme(); + +NavigationRailThemeData navigationRailTheme(); + +DrawerThemeData drawerTheme(); + +IconThemeData iconTheme(); + +CheckboxThemeData checkboxTheme(); + +RadioThemeData radioTheme(); + +TooltipThemeData tooltipTheme(); + +ThemeData light(); + +ThemeData dark(); + +ThemeMode themeMode(); + +ThemeData theme(); + <static>+ThemeProvider of(); + +bool updateShouldNotify() ] - [AuthScaffold]o-[<abstract>Widget] - [AuthScaffold]o-[AuthFormKey] - [AuthScaffold]o-[EdgeInsets] + [ThemeProvider]o-[ValueNotifier] + [ThemeProvider]o-[ColorScheme] + [ThemeProvider]o-[PageTransitionsTheme] + [ThemeProvider]o-[<abstract>ShapeBorder] + [<abstract>InheritedWidget]<:-[ThemeProvider] - [StudyUJobsToBeDone + [ThemeSettings | - +Widget build() + +sourceColor: Color; + +themeMode: ThemeMode ] - [LoginForm + [ThemeSettings]o-[Color] + [ThemeSettings]o-[ThemeMode] + + [CustomColor | - +formKey: AuthFormKey + +name: String; + +color: Color; + +blend: bool | - +Widget build() + +Color value() ] - [LoginForm]o-[AuthFormKey] - [<abstract>FormConsumerRefWidget]<:-[LoginForm] - - [<abstract>IAppDelegate - | - +dynamic onAppStart() - ] + [CustomColor]o-[Color] - [AppController + [SuppressedBehaviorSubject | - +sharedPreferences: SharedPreferences; - +appDelegates: List<IAppDelegate>; - -_delayedFuture: dynamic; - +isInitialized: dynamic + +subject: BehaviorSubject<T>; + +didSuppressInitialEvent: bool; + -_controller: StreamController<T> | - +dynamic onAppStart(); - -dynamic _callDelegates() + -StreamController<T> _buildDerivedController(); + +dynamic close() ] - [AppController]o-[SharedPreferences] + [SuppressedBehaviorSubject]o-[BehaviorSubject] + [SuppressedBehaviorSubject]o-[StreamController] - [App + [Time + | + <static>+dynamic fromTimeOfDay(); + +Map<String, dynamic> toJson(); + <static>+Time fromJson() ] - [AppContent - ] + [TimeOfDay]<:-[Time] - [AppStatus + [TimeValueAccessor | - +index: int; - <static>+values: List<AppStatus>; - <static>+initializing: AppStatus; - <static>+initialized: AppStatus + +String modelToViewValue(); + +Time? viewToModelValue(); + -String _addLeadingZeroIfNeeded() ] - [AppStatus]o-[AppStatus] - [Enum]<:--[AppStatus] + [<abstract>ControlValueAccessor]<:-[TimeValueAccessor] - [StudyAnalyzeScreen + [ModelAction | - +Widget? banner(); - +Widget build() + +type: T; + +label: String; + +icon: IconData?; + +onExecute: Function; + +isAvailable: bool; + +isDestructive: bool ] - [<abstract>StudyPageWidget]<:-[StudyAnalyzeScreen] + [ModelAction]o-[IconData] - [StudyAnalyzeController + [<abstract>IModelActionProvider | - +dynamic onExport() + +List<ModelAction<dynamic>> availableActions() ] - [StudyBaseController]<:-[StudyAnalyzeController] - - [StudyParticipationBadge - | - +participation: Participation; - +type: BadgeType; - +showPrefixIcon: bool; - +center: bool + [<abstract>IListActionProvider | - +Widget build() + +void onSelectItem(); + +void onNewItem() ] - [StudyParticipationBadge]o-[Participation] - [StudyParticipationBadge]o-[BadgeType] + [<abstract>IModelActionProvider]<:-[<abstract>IListActionProvider] - [PreviewFrame + [ModelActionType | - +studyId: String; - +routeArgs: StudyFormRouteArgs?; - +route: String? + +index: int; + <static>+values: List<ModelActionType>; + <static>+edit: ModelActionType; + <static>+delete: ModelActionType; + <static>+remove: ModelActionType; + <static>+duplicate: ModelActionType; + <static>+clipboard: ModelActionType; + <static>+primary: ModelActionType ] - [PreviewFrame]o-[<abstract>StudyFormRouteArgs] + [ModelActionType]o-[ModelActionType] + [Enum]<:--[ModelActionType] - [FrameControlsWidget + [OptimisticUpdate | - +onRefresh: void Function()?; - +onOpenNewTab: void Function()?; - +enabled: bool + +applyOptimistic: void Function(); + +apply: dynamic Function(); + +rollback: void Function(); + +onUpdate: void Function()?; + +onError: void Function(Object, StackTrace?)?; + +rethrowErrors: bool; + +runOptimistically: bool; + +completeFutureOptimistically: bool | - +Widget build() + +dynamic execute(); + -void _runUpdateHandlerIfAny() ] - [FrameControlsWidget]o-[void Function()?] - [<abstract>ConsumerWidget]<:-[FrameControlsWidget] + [OptimisticUpdate]o-[void Function()] + [OptimisticUpdate]o-[dynamic Function()] + [OptimisticUpdate]o-[void Function()?] + [OptimisticUpdate]o-[void Function(Object, StackTrace?)?] - [<abstract>IStudyNavViewModel + [<abstract>FileFormatEncoder | - +isEditTabEnabled: bool; - +isTestTabEnabled: bool; - +isRecruitTabEnabled: bool; - +isMonitorTabEnabled: bool; - +isAnalyzeTabEnabled: bool; - +isSettingsEnabled: bool + +dynamic encodeAsync(); + +String encode(); + +dynamic call() ] - [StudyNav + [CSVStringEncoder | - <static>+dynamic tabs(); - <static>+dynamic edit(); - <static>+dynamic test(); - <static>+dynamic recruit(); - <static>+dynamic monitor(); - <static>+dynamic analyze() + +String encode() ] - [StudyDesignNav - | - <static>+dynamic tabs(); - <static>+dynamic info(); - <static>+dynamic enrollment(); - <static>+dynamic interventions(); - <static>+dynamic measurements(); - <static>+dynamic reports() - ] + [<abstract>FileFormatEncoder]<:-[CSVStringEncoder] - [StudySettingsFormViewModel - | - +study: AsyncValue<Study>; - +studyRepository: IStudyRepository; - <static>+defaultPublishedToRegistry: bool; - <static>+defaultPublishedToRegistryResults: bool; - +isPublishedToRegistryControl: FormControl<bool>; - +isPublishedToRegistryResultsControl: FormControl<bool>; - +form: FormGroup; - +titles: Map<FormMode, String> + [JsonStringEncoder | - +void setControlsFrom(); - +Study buildFormData(); - +dynamic keepControlsSynced(); - +dynamic save(); - +dynamic setLaunchDefaults() + +String encode() ] - [StudySettingsFormViewModel]o-[<abstract>AsyncValue] - [StudySettingsFormViewModel]o-[<abstract>IStudyRepository] - [StudySettingsFormViewModel]o-[FormControl] - [StudySettingsFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[StudySettingsFormViewModel] + [<abstract>FileFormatEncoder]<:-[JsonStringEncoder] - [StudySettingsDialog + [<abstract>ExecutionLimiter | - +Widget build() + +milliseconds: int; + <static>-_timer: Timer? + | + +void dispose() ] - [<abstract>StudyPageWidget]<:-[StudySettingsDialog] + [<abstract>ExecutionLimiter]o-[Timer] - [StudyTestScreen + [Debouncer | - +previewRoute: String? + +leading: bool; + +cancelUncompleted: bool; + -_uncompletedFutureOperation: CancelableOperation<dynamic>? | - +Widget build(); - +Widget? banner(); - +dynamic load(); - +dynamic save(); - +dynamic showHelp() + +dynamic call() ] - [<abstract>StudyPageWidget]<:-[StudyTestScreen] + [Debouncer]o-[CancelableOperation] + [<abstract>ExecutionLimiter]<:-[Debouncer] - [StudyBaseController + [Throttler | - +studyId: String; - +studyRepository: IStudyRepository; - +router: GoRouter; - +studySubscription: StreamSubscription<WrappedModel<Study>>? - | - +dynamic subscribeStudy(); - +dynamic onStudySubscriptionUpdate(); - +dynamic onStudySubscriptionError(); - +void dispose() + +dynamic call() ] - [StudyBaseController]o-[<abstract>IStudyRepository] - [StudyBaseController]o-[GoRouter] - [StudyBaseController]o-[StreamSubscription] + [<abstract>ExecutionLimiter]<:-[Throttler] - [StudyTestController + [SerializableColor | - +authRepository: IAuthRepository; - +languageCode: String + +Map<String, dynamic> toJson(); + <static>+SerializableColor fromJson() ] - [StudyTestController]o-[<abstract>IAuthRepository] - [StudyBaseController]<:-[StudyTestController] + [Color]<:-[SerializableColor] - [WebFrame - | - +previewSrc: String; - +studyId: String + [<abstract>IProviderArgsResolver | - +Widget build() + +R provide() ] - [DisabledFrame + [CombinedStreamNotifier | - +Widget build() + -_subscriptions: List<StreamSubscription<dynamic>> + | + +void dispose() ] - [PhoneContainer + [ChangeNotifier]<:-[CombinedStreamNotifier] + + [CountWhereValidator | - <static>+defaultWidth: double; - <static>+defaultHeight: double; - +width: double; - +height: double; - +borderColor: Color; - +borderWidth: double; - +borderRadius: double; - +innerContent: Widget; - +innerContentBackgroundColor: Color? + +predicate: bool Function(T?); + +minCount: int?; + +maxCount: int?; + <static>+kValidationMessageMinCount: String; + <static>+kValidationMessageMaxCount: String | - +Widget build() + +Map<String, dynamic>? validate() ] - [PhoneContainer]o-[Color] - [PhoneContainer]o-[<abstract>Widget] + [CountWhereValidator]o-[bool Function(T?)] + [<abstract>Validator]<:-[CountWhereValidator] - [MobileFrame + [Patterns | - +Widget build() + <static>+timeFormatString: String; + <static>+emailFormatString: String; + <static>+url: String ] - [DesktopFrame + [NumericalRangeFormatter | - +Widget build() - ] - - [<abstract>IStudyAppBarViewModel + +min: int?; + +max: int? | - +isSyncIndicatorVisible: bool; - +isStatusBadgeVisible: bool; - +isPublishVisible: bool + +TextEditingValue formatEditUpdate() ] - [<abstract>IStudyStatusBadgeViewModel]<:--[<abstract>IStudyAppBarViewModel] - [<abstract>IStudyNavViewModel]<:--[<abstract>IStudyAppBarViewModel] + [<abstract>TextInputFormatter]<:-[NumericalRangeFormatter] - [StudyScaffold + [StudySequenceFormatter | - +studyId: String; - +tabs: List<NavbarTab>?; - +tabsSubnav: List<NavbarTab>?; - +selectedTab: NavbarTab?; - +selectedTabSubnav: NavbarTab?; - +body: StudyPageWidget; - +drawer: Widget?; - +disableActions: bool; - +actionsSpacing: double; - +actionsPadding: double; - +layoutType: SingleColumnLayoutType?; - +appbarHeight: double; - +appbarSubnavHeight: double + +TextEditingValue formatEditUpdate() ] - [StudyScaffold]o-[NavbarTab] - [StudyScaffold]o-[<abstract>StudyPageWidget] - [StudyScaffold]o-[<abstract>Widget] - [StudyScaffold]o-[SingleColumnLayoutType] + [<abstract>TextInputFormatter]<:-[StudySequenceFormatter] - [RouteInformation + [Tuple | - +route: String?; - +extra: String?; - +cmd: String?; - +data: String? + +first: T1; + +second: T2; + +props: List<Object?> | - +String toString() + +Map<String, dynamic> toJson(); + <static>+Tuple<dynamic, dynamic> fromJson(); + +Tuple<T1, T2> copy(); + +Tuple<T1, T2> copyWith() ] - [<abstract>PlatformController + [<abstract>Equatable]<:-[Tuple] + + [<abstract>JsonFileLoader | - +studyId: String; - +baseSrc: String; - +previewSrc: String; - +routeInformation: RouteInformation; - +frameWidget: Widget + +jsonAssetsPath: String | - +void activate(); - +void registerViews(); - +void generateUrl(); - +void navigate(); - +void refresh(); - +void listen(); - +void send(); - +void openNewPage() + +dynamic loadJson(); + +dynamic parseJsonMapFromAssets(); + +dynamic parseJsonListFromAssets() ] - [<abstract>PlatformController]o-[RouteInformation] - [<abstract>PlatformController]o-[<abstract>Widget] - - [WebController - | - +iFrameElement: IFrameElement + [<abstract>IAppDelegate | - +void activate(); - +void registerViews(); - +void generateUrl(); - +void navigate(); - +void refresh(); - +void openNewPage(); - +void listen(); - +void send() + +dynamic onAppStart() ] - [WebController]o-[IFrameElement] - [<abstract>PlatformController]<:-[WebController] - - [MobileController + [AppController | - +void openNewPage(); - +void refresh(); - +void registerViews(); - +void listen(); - +void send(); - +void navigate(); - +void activate(); - +void generateUrl() + +sharedPreferences: SharedPreferences; + +appDelegates: List<IAppDelegate>; + -_delayedFuture: dynamic; + +isInitialized: dynamic + | + +dynamic onAppStart(); + -dynamic _callDelegates() ] - [<abstract>PlatformController]<:-[MobileController] + [AppController]o-[SharedPreferences] - [<abstract>IStudyStatusBadgeViewModel + [ParticipantDetailsFormView | - +studyParticipation: Participation?; - +studyStatus: StudyStatus? + +formViewModel: ParticipantDetailsFormViewModel + | + +Widget build() ] - [<abstract>IStudyStatusBadgeViewModel]o-[Participation] - [<abstract>IStudyStatusBadgeViewModel]o-[StudyStatus] + [ParticipantDetailsFormView]o-[ParticipantDetailsFormViewModel] + [<abstract>FormConsumerWidget]<:-[ParticipantDetailsFormView] - [StudyStatusBadge - | - +participation: Participation?; - +status: StudyStatus?; - +type: BadgeType; - +showPrefixIcon: bool; - +showTooltip: bool + [StudyMonitorScreen | - +Widget build() + +Widget build(); + -Widget _monitorSectionHeader(); + -Widget _buildStat(); + -dynamic _onSelectParticipant() ] - [StudyStatusBadge]o-[Participation] - [StudyStatusBadge]o-[StudyStatus] - [StudyStatusBadge]o-[BadgeType] + [<abstract>StudyPageWidget]<:-[StudyMonitorScreen] - [TestAppRoutes + [StudyMonitorItem + | + +participantId: String; + +inviteCode: String?; + +enrolledAt: DateTime; + +lastActivityAt: DateTime; + +currentDayOfStudy: int; + +studyDurationInDays: int; + +completedInterventions: int; + +missedInterventions: int; + +completedSurveys: int; + +missedSurveys: int; + +rawData: String; + +props: List<Object?> | - <static>+studyOverview: String; - <static>+eligibility: String; - <static>+intervention: String; - <static>+consent: String; - <static>+journey: String; - <static>+dashboard: String + <static>+List<StudyMonitorItem> fromStudy() ] - [<abstract>StudyPageWidget + [<abstract>Equatable]<:-[StudyMonitorItem] + + [StudyMonitorTable | - +studyId: String + +studyMonitorItems: List<StudyMonitorItem>; + +onSelectItem: void Function(StudyMonitorItem) | - +Widget? banner() + +Widget build(); + -List<Widget> _buildRow(); + -String _formatTime(); + -Widget _buildProgressCell() ] - [<abstract>ConsumerWidget]<:-[<abstract>StudyPageWidget] - [<abstract>IWithBanner]<:--[<abstract>StudyPageWidget] + [StudyMonitorTable]o-[void Function(StudyMonitorItem)] - [StudyController + [ParticipantDetailsFormViewModel | - +notificationService: INotificationService; - +studyEventsSubscription: StreamSubscription<ModelEvent<Study>>?; - +studyActions: List<ModelAction<dynamic>> + +participantIdControl: FormControl<String>; + +rawDataControl: FormControl<String>; + +form: FormGroup; + +titles: Map<FormMode, String> | - +dynamic syncStudyStatus(); - +dynamic onStudySubscriptionUpdate(); - -dynamic _redirectNewToActualStudyID(); - +dynamic publishStudy(); - +void onChangeStudyParticipation(); - +void onAddParticipants(); - +void onSettingsPressed(); - +void dispose() + +void initControls(); + +StudyMonitorItem buildFormData(); + +void setControlsFrom() ] - [StudyController]o-[<abstract>INotificationService] - [StudyController]o-[StreamSubscription] - [StudyBaseController]<:-[StudyController] + [ParticipantDetailsFormViewModel]o-[FormControl] + [ParticipantDetailsFormViewModel]o-[FormGroup] + [<abstract>FormViewModel]<:-[ParticipantDetailsFormViewModel] - [StudyMonitorScreen + [LoginForm + | + +formKey: AuthFormKey | +Widget build() ] - [<abstract>StudyPageWidget]<:-[StudyMonitorScreen] + [LoginForm]o-[AuthFormKey] + [<abstract>FormConsumerRefWidget]<:-[LoginForm] - [StudiesTableColumnHeader + [PasswordRecoveryForm | - +title: String; - +sortable: bool; - +sortAscending: bool; - +sortingActive: bool; - +onSort: void Function()? + +formKey: AuthFormKey + | + +Widget build() ] - [StudiesTableColumnHeader]o-[void Function()?] + [PasswordRecoveryForm]o-[AuthFormKey] + [<abstract>FormConsumerRefWidget]<:-[PasswordRecoveryForm] - [DashboardScaffold + [PasswordForgotForm | - <static>+compactWidthThreshold: double; - +body: Widget + +formKey: AuthFormKey | +Widget build() ] - [DashboardScaffold]o-[<abstract>Widget] + [PasswordForgotForm]o-[AuthFormKey] + [<abstract>FormConsumerRefWidget]<:-[PasswordForgotForm] - [StudiesTableColumnSize + [SignupForm | - +collapsed: bool; - +flex: int?; - +width: double? + +formKey: AuthFormKey | - +Widget createContainer() + +Widget build(); + -dynamic _onClickTermsOfUse(); + -dynamic _onClickPrivacyPolicy() ] - [StudiesTable - | - +itemHeight: double; - +itemPadding: double; - +rowSpacing: double; - +columnSpacing: double; - +compactWidthThreshold: double; - +superCompactWidthThreshold: double; - +compactStatTitleThreshold: double; - +studies: List<Study>; - +onSelect: void Function(Study); - +getActions: List<ModelAction<dynamic>> Function(Study); - +emptyWidget: Widget; - +pinnedStudies: Iterable<String>; - +dashboardController: DashboardController + [SignupForm]o-[AuthFormKey] + [<abstract>FormConsumerRefWidget]<:-[SignupForm] + + [AuthScaffold | - +Widget build(); - -Widget _buildColumnHeader() + +body: Widget; + +formKey: AuthFormKey; + +leftContentMinWidth: double; + +leftPanelMinWidth: double; + +leftPanelPadding: EdgeInsets ] - [StudiesTable]o-[void Function(Study)] - [StudiesTable]o-[List<ModelAction<dynamic>> Function(Study)] - [StudiesTable]o-[<abstract>Widget] - [StudiesTable]o-[DashboardController] + [AuthScaffold]o-[<abstract>Widget] + [AuthScaffold]o-[AuthFormKey] + [AuthScaffold]o-[EdgeInsets] - [StudiesTableColumn + [EmailTextField | - +index: int; - <static>+values: List<StudiesTableColumn>; - <static>+pin: StudiesTableColumn; - <static>+title: StudiesTableColumn; - <static>+status: StudiesTableColumn; - <static>+participation: StudiesTableColumn; - <static>+createdAt: StudiesTableColumn; - <static>+enrolled: StudiesTableColumn; - <static>+active: StudiesTableColumn; - <static>+completed: StudiesTableColumn; - <static>+action: StudiesTableColumn + +labelText: String; + +hintText: String?; + +formControlName: String?; + +formControl: FormControl<dynamic>? ] - [StudiesTableColumn]o-[StudiesTableColumn] - [Enum]<:--[StudiesTableColumn] + [EmailTextField]o-[FormControl] - [DashboardScreen + [PasswordTextField | - +filter: StudiesFilter? + +labelText: String; + +hintText: String?; + +onSubmitted: dynamic Function(FormControl<dynamic>)?; + +formControlName: String?; + +formControl: FormControl<dynamic>? ] - [DashboardScreen]o-[StudiesFilter] + [PasswordTextField]o-[dynamic Function(FormControl<dynamic>)?] + [PasswordTextField]o-[FormControl] - [DashboardController + [StudyUJobsToBeDone + | + +Widget build() + ] + + [AuthFormController | - +studyRepository: IStudyRepository; +authRepository: IAuthRepository; - +userRepository: IUserRepository; + +sharedPreferences: SharedPreferences; + +notificationService: INotificationService; +router: GoRouter; - -_studiesSubscription: StreamSubscription<List<WrappedModel<Study>>>?; - +searchController: SearchController; - +isSortAscending: bool + +emailControl: FormControl<String>; + +passwordControl: FormControl<String>; + +passwordConfirmationControl: FormControl<String>; + +rememberMeControl: FormControl<bool>; + +termsOfServiceControl: FormControl<bool>; + <static>+authValidationMessages: Map<String, String Function(dynamic)>; + +loginForm: FormGroup; + +signupForm: FormGroup; + +passwordForgotForm: FormGroup; + +passwordRecoveryForm: FormGroup; + +controlValidatorsByForm: Map<AuthFormKey, Map<FormControl<dynamic>, List<Validator<dynamic>>>>; + -_formKey: AuthFormKey; + +shouldRemember: bool; + +formKey: AuthFormKey; + +form: FormGroup | - -dynamic _subscribeStudies(); - +dynamic setSearchText(); - +dynamic setStudiesFilter(); - +dynamic onSelectStudy(); - +dynamic onClickNewStudy(); - +dynamic pinStudy(); - +dynamic pinOffStudy(); - +void setSorting(); - +void filterStudies(); - +void sortStudies(); - +bool isSortingActiveForColumn(); - +bool isPinned(); - +List<ModelAction<dynamic>> availableActions(); - +void dispose() + -dynamic _getFormFor(); + -dynamic _onChangeFormKey(); + +dynamic resetControlsFor(); + -dynamic _forceValidationMessages(); + +dynamic signUp(); + -dynamic _signUp(); + +dynamic signIn(); + -dynamic _signInWith(); + +dynamic signOut(); + +dynamic resetPasswordForEmail(); + +dynamic sendPasswordResetLink(); + +dynamic recoverPassword(); + +dynamic updateUser(); + -dynamic _readDebugUser(); + -void _setRememberMe(); + -void _delRememberMe(); + -void _initRememberMe() ] - [DashboardController]o-[<abstract>IStudyRepository] - [DashboardController]o-[<abstract>IAuthRepository] - [DashboardController]o-[<abstract>IUserRepository] - [DashboardController]o-[GoRouter] - [DashboardController]o-[StreamSubscription] - [DashboardController]o-[SearchController] - [<abstract>IModelActionProvider]<:--[DashboardController] + [AuthFormController]o-[<abstract>IAuthRepository] + [AuthFormController]o-[SharedPreferences] + [AuthFormController]o-[<abstract>INotificationService] + [AuthFormController]o-[GoRouter] + [AuthFormController]o-[FormControl] + [AuthFormController]o-[FormGroup] + [AuthFormController]o-[AuthFormKey] + [<abstract>IFormGroupController]<:--[AuthFormController] - [StudiesTableItem + [AuthFormKey | - +study: Study; - +itemHeight: double; - +itemPadding: double; - +rowSpacing: double; - +columnSpacing: double; - +actions: List<ModelAction<dynamic>>; - +columnSizes: List<StudiesTableColumnSize>; - +isPinned: bool; - +onPinnedChanged: void Function(Study, bool)?; - +onTap: void Function(Study)? + +index: int; + <static>+values: List<AuthFormKey>; + <static>+login: AuthFormKey; + <static>+signup: AuthFormKey; + <static>+passwordForgot: AuthFormKey; + <static>+passwordRecovery: AuthFormKey; + <static>-_loginSubmit: AuthFormKey; + <static>-_signupSubmit: AuthFormKey ] - [StudiesTableItem]o-[Study] - [StudiesTableItem]o-[void Function(Study, bool)?] - [StudiesTableItem]o-[void Function(Study)?] + [AuthFormKey]o-[AuthFormKey] + [Enum]<:--[AuthFormKey] - [StudiesFilter + [AppStatus | +index: int; - <static>+values: List<StudiesFilter> + <static>+values: List<AppStatus>; + <static>+initializing: AppStatus; + <static>+initialized: AppStatus ] - [Enum]<:--[StudiesFilter] + [AppStatus]o-[AppStatus] + [Enum]<:--[AppStatus] [FormArrayTable | @@ -1775,6 +1779,39 @@ [FormArrayTable]o-[<abstract>Widget] [FormArrayTable]o-[EdgeInsets] + [<abstract>ManagedFormViewModel + | + +ManagedFormViewModel<T> createDuplicate() + ] + + [<abstract>FormViewModel]<:-[<abstract>ManagedFormViewModel] + + [FormViewModelNotFoundException + ] + + [Exception]<:--[FormViewModelNotFoundException] + + [FormViewModelCollection + | + +formViewModels: List<T>; + +formArray: FormArray<dynamic>; + +stagedViewModels: List<T>; + +retrievableViewModels: List<T>; + +formData: List<D> + | + +void add(); + +T remove(); + +T? findWhere(); + +T? removeWhere(); + +bool contains(); + +void stage(); + +T commit(); + +void reset(); + +void read() + ] + + [FormViewModelCollection]o-[FormArray] + [CustomFormControl | -_onValueChangedDebouncer: Debouncer?; @@ -1792,6 +1829,33 @@ [CustomFormControl]o-[void Function(ControlStatus)?] [FormControl]<:-[CustomFormControl] + [UnsavedChangesDialog + | + +Widget build() + ] + + [<abstract>FormValidationSetEnum + ] + + [FormControlValidation + | + +control: AbstractControl<dynamic>; + +validators: List<Validator<dynamic>>; + +asyncValidators: List<AsyncValidator<dynamic>>?; + +validationMessages: Map<String, String Function(Object)> + | + +FormControlValidation merge() + ] + + [FormControlValidation]o-[<abstract>AbstractControl] + + [<abstract>IFormData + | + +id: String + | + +IFormData copy() + ] + [FormInvalidException ] @@ -1889,108 +1953,51 @@ [FormMode]o-[FormMode] [Enum]<:--[FormMode] - [<abstract>IFormData - | - +id: String + [EnrolledBadge | - +IFormData copy() - ] - - [UnsavedChangesDialog + +enrolledCount: int | +Widget build() ] - [<abstract>FormValidationSetEnum - ] - - [FormControlValidation - | - +control: AbstractControl<dynamic>; - +validators: List<Validator<dynamic>>; - +asyncValidators: List<AsyncValidator<dynamic>>?; - +validationMessages: Map<String, String Function(Object)> - | - +FormControlValidation merge() - ] - - [FormControlValidation]o-[<abstract>AbstractControl] - - [<abstract>ManagedFormViewModel - | - +ManagedFormViewModel<T> createDuplicate() - ] - - [<abstract>FormViewModel]<:-[<abstract>ManagedFormViewModel] - - [FormViewModelNotFoundException - ] - - [Exception]<:--[FormViewModelNotFoundException] - - [FormViewModelCollection + [StudyRecruitController | - +formViewModels: List<T>; - +formArray: FormArray<dynamic>; - +stagedViewModels: List<T>; - +retrievableViewModels: List<T>; - +formData: List<D> + +inviteCodeRepository: IInviteCodeRepository; + -_invitesSubscription: StreamSubscription<List<WrappedModel<StudyInvite>>>? | - +void add(); - +T remove(); - +T? findWhere(); - +T? removeWhere(); - +bool contains(); - +void stage(); - +T commit(); - +void reset(); - +void read() + -dynamic _subscribeInvites(); + +Intervention? getIntervention(); + +int getParticipantCountForInvite(); + +List<ModelAction<dynamic>> availableActions(); + +List<ModelAction<dynamic>> availableInlineActions(); + +void dispose() ] - [FormViewModelCollection]o-[FormArray] + [StudyRecruitController]o-[<abstract>IInviteCodeRepository] + [StudyRecruitController]o-[StreamSubscription] + [StudyBaseController]<:-[StudyRecruitController] + [<abstract>IModelActionProvider]<:--[StudyRecruitController] - [DrawerEntry - | - +localizedTitle: String Function(); - +icon: IconData?; - +localizedHelpText: String Function()?; - +enabled: bool; - +onSelected: void Function(BuildContext, WidgetRef)?; - +autoCloseDrawer: bool; - +title: String; - +helpText: String? + [StudyRecruitScreen | - +void onClick() + +Widget build(); + -Widget _inviteCodesSectionHeader(); + -Widget _newInviteCodeButton(); + -dynamic _onSelectInvite() ] - [DrawerEntry]o-[String Function()] - [DrawerEntry]o-[IconData] - [DrawerEntry]o-[String Function()?] - [DrawerEntry]o-[void Function(BuildContext, WidgetRef)?] + [<abstract>StudyPageWidget]<:-[StudyRecruitScreen] - [GoRouterDrawerEntry + [InviteCodeFormView | - +intent: RoutingIntent; - +onNavigated: void Function()? + +formViewModel: InviteCodeFormViewModel | - +void onClick() + +Widget build(); + -List<FormTableRow> _conditionalInterventionRows() ] - [GoRouterDrawerEntry]o-[RoutingIntent] - [GoRouterDrawerEntry]o-[void Function()?] - [DrawerEntry]<:-[GoRouterDrawerEntry] - - [AppDrawer - | - +width: int; - +autoCloseDrawer: bool; - +leftPaddingEntries: double; - +logoPaddingVertical: double; - +logoPaddingHorizontal: double; - +logoMaxHeight: double; - +logoSectionMinHeight: double; - +logoSectionMaxHeight: double - ] + [InviteCodeFormView]o-[InviteCodeFormViewModel] + [<abstract>FormConsumerWidget]<:-[InviteCodeFormView] [StudyInvitesTable | @@ -2010,17 +2017,6 @@ [StudyInvitesTable]o-[Intervention? Function(String)] [StudyInvitesTable]o-[int Function(StudyInvite)] - [InviteCodeFormView - | - +formViewModel: InviteCodeFormViewModel - | - +Widget build(); - -List<FormTableRow> _conditionalInterventionRows() - ] - - [InviteCodeFormView]o-[InviteCodeFormViewModel] - [<abstract>FormConsumerWidget]<:-[InviteCodeFormView] - [InviteCodeFormViewModel | +study: Study; @@ -2053,41 +2049,20 @@ [InviteCodeFormViewModel]o-[FormGroup] [<abstract>FormViewModel]<:-[InviteCodeFormViewModel] - [StudyRecruitController - | - +inviteCodeRepository: IInviteCodeRepository; - -_invitesSubscription: StreamSubscription<List<WrappedModel<StudyInvite>>>? - | - -dynamic _subscribeInvites(); - +Intervention? getIntervention(); - +int getParticipantCountForInvite(); - +List<ModelAction<dynamic>> availableActions(); - +List<ModelAction<dynamic>> availableInlineActions(); - +void dispose() - ] - - [StudyRecruitController]o-[<abstract>IInviteCodeRepository] - [StudyRecruitController]o-[StreamSubscription] - [StudyBaseController]<:-[StudyRecruitController] - [<abstract>IModelActionProvider]<:--[StudyRecruitController] - - [StudyRecruitScreen + [PublishSuccessDialog | - +Widget build(); - -Widget _inviteCodesSectionHeader(); - -Widget _newInviteCodeButton(); - -dynamic _onSelectInvite() + +Widget build() ] - [<abstract>StudyPageWidget]<:-[StudyRecruitScreen] + [<abstract>StudyPageWidget]<:-[PublishSuccessDialog] - [EnrolledBadge - | - +enrolledCount: int + [PublishDialog | +Widget build() ] + [<abstract>StudyPageWidget]<:-[PublishDialog] + [PublishConfirmationDialog | +Widget build() @@ -2095,443 +2070,410 @@ [<abstract>StudyPageWidget]<:-[PublishConfirmationDialog] - [PublishSuccessDialog + [FrameControlsWidget + | + +onRefresh: void Function()?; + +onOpenNewTab: void Function()?; + +enabled: bool | +Widget build() ] - [<abstract>StudyPageWidget]<:-[PublishSuccessDialog] + [FrameControlsWidget]o-[void Function()?] + [<abstract>ConsumerWidget]<:-[FrameControlsWidget] - [PublishDialog + [<abstract>IStudyStatusBadgeViewModel | - +Widget build() + +studyParticipation: Participation?; + +studyStatus: StudyStatus? ] - [<abstract>StudyPageWidget]<:-[PublishDialog] + [<abstract>IStudyStatusBadgeViewModel]o-[Participation] + [<abstract>IStudyStatusBadgeViewModel]o-[StudyStatus] - [StudyFormScaffold + [StudyStatusBadge | - +studyId: String; - +formViewModelBuilder: T Function(WidgetRef); - +formViewBuilder: Widget Function(T) + +participation: Participation?; + +status: StudyStatus?; + +type: BadgeType; + +showPrefixIcon: bool; + +showTooltip: bool | +Widget build() ] - [StudyFormScaffold]o-[T Function(WidgetRef)] - [StudyFormScaffold]o-[Widget Function(T)] - [<abstract>ConsumerWidget]<:-[StudyFormScaffold] - - [StudyFormValidationSet - | - +index: int; - <static>+values: List<StudyFormValidationSet> - ] - - [Enum]<:--[StudyFormValidationSet] + [StudyStatusBadge]o-[Participation] + [StudyStatusBadge]o-[StudyStatus] + [StudyStatusBadge]o-[BadgeType] - [<abstract>QuestionFormData + [RouteInformation | - <static>+questionTypeFormDataFactories: Map<SurveyQuestionType, QuestionFormData Function(Question<dynamic>, List<EligibilityCriterion>)>; - +questionId: String; - +questionText: String; - +questionInfoText: String?; - +questionType: SurveyQuestionType; - +responseOptionsValidity: Map<dynamic, bool>; - +responseOptions: List<dynamic>; - +id: String + +route: String?; + +extra: String?; + +cmd: String?; + +data: String? | - +Question<dynamic> toQuestion(); - +EligibilityCriterion toEligibilityCriterion(); - +Answer<dynamic> constructAnswerFor(); - +dynamic setResponseOptionsValidityFrom(); - +QuestionFormData copy() + +String toString() ] - [<abstract>QuestionFormData]o-[SurveyQuestionType] - [<abstract>IFormData]<:--[<abstract>QuestionFormData] - - [ChoiceQuestionFormData + [<abstract>PlatformController | - +isMultipleChoice: bool; - +answerOptions: List<String>; - +responseOptions: List<String> + +studyId: String; + +baseSrc: String; + +previewSrc: String; + +routeInformation: RouteInformation; + +frameWidget: Widget | - +Question<dynamic> toQuestion(); - +QuestionFormData copy(); - -Choice _buildChoiceForValue(); - +Answer<dynamic> constructAnswerFor() + +void activate(); + +void registerViews(); + +void generateUrl(); + +void navigate(); + +void refresh(); + +void listen(); + +void send(); + +void openNewPage() ] - [<abstract>QuestionFormData]<:-[ChoiceQuestionFormData] + [<abstract>PlatformController]o-[RouteInformation] + [<abstract>PlatformController]o-[<abstract>Widget] - [BoolQuestionFormData + [WebController | - <static>+kResponseOptions: Map<String, bool>; - +responseOptions: List<String> + +iFrameElement: IFrameElement | - +Question<dynamic> toQuestion(); - +BoolQuestionFormData copy(); - +Answer<dynamic> constructAnswerFor() + +void activate(); + +void registerViews(); + +void generateUrl(); + +void navigate(); + +void refresh(); + +void openNewPage(); + +void listen(); + +void send() ] - [<abstract>QuestionFormData]<:-[BoolQuestionFormData] + [WebController]o-[IFrameElement] + [<abstract>PlatformController]<:-[WebController] - [ScaleQuestionFormData + [MobileController | - +minValue: double; - +maxValue: double; - +minLabel: String?; - +maxLabel: String?; - +midValues: List<double?>; - +midLabels: List<String?>; - +stepSize: double; - +initialValue: double?; - +minColor: Color?; - +maxColor: Color?; - +responseOptions: List<double>; - +midAnnotations: List<Annotation> + +void openNewPage(); + +void refresh(); + +void registerViews(); + +void listen(); + +void send(); + +void navigate(); + +void activate(); + +void generateUrl() + ] + + [<abstract>PlatformController]<:-[MobileController] + + [StudyController | - +ScaleQuestion toQuestion(); - +QuestionFormData copy(); - +Answer<dynamic> constructAnswerFor() + +notificationService: INotificationService; + +studyEventsSubscription: StreamSubscription<ModelEvent<Study>>?; + +studyActions: List<ModelAction<dynamic>> + | + +dynamic syncStudyStatus(); + +dynamic onStudySubscriptionUpdate(); + -dynamic _redirectNewToActualStudyID(); + +dynamic publishStudy(); + +void onChangeStudyParticipation(); + +void onAddParticipants(); + +void onSettingsPressed(); + +void dispose() ] - [ScaleQuestionFormData]o-[Color] - [<abstract>QuestionFormData]<:-[ScaleQuestionFormData] + [StudyController]o-[<abstract>INotificationService] + [StudyController]o-[StreamSubscription] + [StudyBaseController]<:-[StudyController] - [FreeTextQuestionFormData + [<abstract>IStudyNavViewModel | - +textLengthRange: List<int>; - +textType: FreeTextQuestionType; - +textTypeExpression: String?; - +responseOptions: List<String> + +isEditTabEnabled: bool; + +isTestTabEnabled: bool; + +isRecruitTabEnabled: bool; + +isMonitorTabEnabled: bool; + +isAnalyzeTabEnabled: bool; + +isSettingsEnabled: bool + ] + + [StudyNav | - +Question<dynamic> toQuestion(); - +FreeTextQuestionFormData copy(); - +Answer<dynamic> constructAnswerFor() + <static>+dynamic tabs(); + <static>+dynamic edit(); + <static>+dynamic test(); + <static>+dynamic recruit(); + <static>+dynamic monitor(); + <static>+dynamic analyze() ] - [FreeTextQuestionFormData]o-[FreeTextQuestionType] - [<abstract>QuestionFormData]<:-[FreeTextQuestionFormData] + [StudyDesignNav + | + <static>+dynamic tabs(); + <static>+dynamic info(); + <static>+dynamic enrollment(); + <static>+dynamic interventions(); + <static>+dynamic measurements(); + <static>+dynamic reports() + ] - [SurveyQuestionFormView + [<abstract>StudyPageWidget | - +formViewModel: QuestionFormViewModel; - +isHtmlStyleable: bool + +studyId: String + | + +Widget? banner() ] - [SurveyQuestionFormView]o-[QuestionFormViewModel] + [<abstract>ConsumerWidget]<:-[<abstract>StudyPageWidget] + [<abstract>IWithBanner]<:--[<abstract>StudyPageWidget] - [SurveyQuestionType + [StudyParticipationBadge | - +index: int; - <static>+values: List<SurveyQuestionType>; - <static>+choice: SurveyQuestionType; - <static>+bool: SurveyQuestionType; - <static>+scale: SurveyQuestionType; - <static>+freeText: SurveyQuestionType + +participation: Participation; + +type: BadgeType; + +showPrefixIcon: bool; + +center: bool + | + +Widget build() ] - [SurveyQuestionType]o-[SurveyQuestionType] - [Enum]<:--[SurveyQuestionType] + [StudyParticipationBadge]o-[Participation] + [StudyParticipationBadge]o-[BadgeType] - [<abstract>IScaleQuestionFormViewModel + [StudyBaseController | - +isMidValuesClearedInfoVisible: bool + +studyId: String; + +studyRepository: IStudyRepository; + +router: GoRouter; + +studySubscription: StreamSubscription<WrappedModel<Study>>? + | + +dynamic subscribeStudy(); + +dynamic onStudySubscriptionUpdate(); + +dynamic onStudySubscriptionError(); + +void dispose() ] - [ScaleQuestionFormView + [StudyBaseController]o-[<abstract>IStudyRepository] + [StudyBaseController]o-[GoRouter] + [StudyBaseController]o-[StreamSubscription] + + [PreviewFrame | - +formViewModel: QuestionFormViewModel + +studyId: String; + +routeArgs: StudyFormRouteArgs?; + +route: String? ] - [ScaleQuestionFormView]o-[QuestionFormViewModel] + [PreviewFrame]o-[<abstract>StudyFormRouteArgs] - [ChoiceQuestionFormView + [<abstract>IStudyAppBarViewModel | - +formViewModel: QuestionFormViewModel + +isSyncIndicatorVisible: bool; + +isStatusBadgeVisible: bool; + +isPublishVisible: bool + ] + + [<abstract>IStudyStatusBadgeViewModel]<:--[<abstract>IStudyAppBarViewModel] + [<abstract>IStudyNavViewModel]<:--[<abstract>IStudyAppBarViewModel] + + [StudyScaffold + | + +studyId: String; + +tabs: List<NavbarTab>?; + +tabsSubnav: List<NavbarTab>?; + +selectedTab: NavbarTab?; + +selectedTabSubnav: NavbarTab?; + +body: StudyPageWidget; + +drawer: Widget?; + +disableActions: bool; + +actionsSpacing: double; + +actionsPadding: double; + +layoutType: SingleColumnLayoutType?; + +appbarHeight: double; + +appbarSubnavHeight: double + ] + + [StudyScaffold]o-[NavbarTab] + [StudyScaffold]o-[<abstract>StudyPageWidget] + [StudyScaffold]o-[<abstract>Widget] + [StudyScaffold]o-[SingleColumnLayoutType] + + [WebFrame + | + +previewSrc: String; + +studyId: String | +Widget build() ] - [ChoiceQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[ChoiceQuestionFormView] + [DisabledFrame + | + +Widget build() + ] - [BoolQuestionFormView + [PhoneContainer | - +formViewModel: QuestionFormViewModel + <static>+defaultWidth: double; + <static>+defaultHeight: double; + +width: double; + +height: double; + +borderColor: Color; + +borderWidth: double; + +borderRadius: double; + +innerContent: Widget; + +innerContentBackgroundColor: Color? | +Widget build() ] - [BoolQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[BoolQuestionFormView] + [PhoneContainer]o-[Color] + [PhoneContainer]o-[<abstract>Widget] - [FreeTextQuestionFormView + [MobileFrame | - +formViewModel: QuestionFormViewModel; - +generateLabelHelpTextMap: dynamic + +Widget build() + ] + + [DesktopFrame + | + +Widget build() + ] + + [StudyTestScreen + | + +previewRoute: String? | +Widget build(); - +Widget disableOnReadonly(); - +Widget generateRow() + +Widget? banner(); + +dynamic load(); + +dynamic save(); + +dynamic showHelp() ] - [FreeTextQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[FreeTextQuestionFormView] + [<abstract>StudyPageWidget]<:-[StudyTestScreen] - [QuestionFormViewModel + [StudySettingsFormViewModel | - <static>+defaultQuestionType: SurveyQuestionType; - -_titles: Map<FormMode, String Function()>?; - +questionIdControl: FormControl<String>; - +questionTypeControl: FormControl<SurveyQuestionType>; - +questionTextControl: FormControl<String>; - +questionInfoTextControl: FormControl<String>; - +questionBaseControls: Map<String, AbstractControl<dynamic>>; - +isMultipleChoiceControl: FormControl<bool>; - +choiceResponseOptionsArray: FormArray<dynamic>; - +customOptionsMin: int; - +customOptionsMax: int; - +customOptionsInitial: int; - +boolResponseOptionsArray: FormArray<String>; - <static>+kDefaultScaleMinValue: int; - <static>+kDefaultScaleMaxValue: int; - <static>+kNumMidValueControls: int; - <static>+kMidValueDebounceMilliseconds: int; - +scaleMinValueControl: FormControl<int>; - +scaleMaxValueControl: FormControl<int>; - -_scaleRangeControl: FormControl<int>; - +scaleMinLabelControl: FormControl<String>; - +scaleMaxLabelControl: FormControl<String>; - +scaleMidValueControls: FormArray<int>; - +scaleMidLabelControls: FormArray<String?>; - -_scaleResponseOptionsArray: FormArray<int>; - +scaleMinColorControl: FormControl<SerializableColor>; - +scaleMaxColorControl: FormControl<SerializableColor>; - +prevMidValues: List<int?>?; - +freeTextTypeControl: FormControl<FreeTextQuestionType>; - +customRegexControl: FormControl<String>; - +freeTextResponseOptionsArray: FormArray<dynamic>; - +freeTextLengthMin: AbstractControl<int>; - +freeTextLengthMax: AbstractControl<int>; - +freeTextExampleTextControl: FormControl<String>; - <static>+kDefaultFreeTextMinLength: int; - <static>+kDefaultFreeTextMaxLength: int; - +freeTextLengthControl: FormControl<RangeValues>; - -_controlsByQuestionType: Map<SurveyQuestionType, FormGroup>; - -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - -_validationConfigsByQuestionType: Map<SurveyQuestionType, Map<FormValidationSetEnum, List<FormControlValidation>>>; + +study: AsyncValue<Study>; + +studyRepository: IStudyRepository; + <static>+defaultPublishedToRegistry: bool; + <static>+defaultPublishedToRegistryResults: bool; + +isPublishedToRegistryControl: FormControl<bool>; + +isPublishedToRegistryResultsControl: FormControl<bool>; +form: FormGroup; - +questionId: String; - +questionType: SurveyQuestionType; - +questionTypeControlOptions: List<FormControlOption<SurveyQuestionType>>; - +answerOptionsArray: FormArray<dynamic>; - +answerOptionsControls: List<AbstractControl<dynamic>>; - +validAnswerOptions: List<String>; - +boolOptions: List<AbstractControl<String>>; - +scaleMinValue: int; - +scaleMaxValue: int; - +scaleRange: int; - +scaleAllValueControls: List<AbstractControl<int>>; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +questionTextRequired: dynamic; - +numValidChoiceOptions: dynamic; - +scaleRangeValid: dynamic; - +titles: Map<FormMode, String>; - +isAddOptionButtonVisible: bool; - +isMidValuesClearedInfoVisible: bool + +titles: Map<FormMode, String> | - +String? scaleMidLabelAt(); - -dynamic _onScaleRangeChanged(); - -dynamic _applyInputFormatters(); - -dynamic _updateScaleMidValueControls(); - -Map<String, dynamic>? _validateFreeText(); - -dynamic _onFreeTextLengthChanged(); - -List<FormControlValidation> _getValidationConfig(); - +dynamic onQuestionTypeChanged(); - +dynamic onResponseOptionsChanged(); - -void _updateFormControls(); - +void initControls(); +void setControlsFrom(); - +QuestionFormData buildFormData(); - +List<ModelAction<dynamic>> availableActions(); - +void onNewItem(); - +void onSelectItem(); + +Study buildFormData(); + +dynamic keepControlsSynced(); +dynamic save(); - +QuestionFormViewModel createDuplicate() + +dynamic setLaunchDefaults() ] - [QuestionFormViewModel]o-[SurveyQuestionType] - [QuestionFormViewModel]o-[FormControl] - [QuestionFormViewModel]o-[FormArray] - [QuestionFormViewModel]o-[<abstract>AbstractControl] - [QuestionFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[QuestionFormViewModel] - [<abstract>IListActionProvider]<:--[QuestionFormViewModel] + [StudySettingsFormViewModel]o-[<abstract>AsyncValue] + [StudySettingsFormViewModel]o-[<abstract>IStudyRepository] + [StudySettingsFormViewModel]o-[FormControl] + [StudySettingsFormViewModel]o-[FormGroup] + [<abstract>FormViewModel]<:-[StudySettingsFormViewModel] - [<abstract>WithQuestionnaireControls - | - +questionsArray: FormArray<dynamic>; - +questionFormViewModels: FormViewModelCollection<Q, QuestionFormData>; - +questionnaireControls: Map<String, FormArray<dynamic>>; - +propagateOnSave: bool; - +questionModels: List<Q>; - +questionTitles: Map<FormMode, String Function()> + [StudySettingsDialog | - +void setQuestionnaireControlsFrom(); - +QuestionnaireFormData buildQuestionnaireFormData(); - +void read(); - +void onCancel(); - +dynamic onSave(); - +Q provide(); - +Q provideQuestionFormViewModel() + +Widget build() ] - [<abstract>WithQuestionnaireControls]o-[FormArray] - [<abstract>WithQuestionnaireControls]o-[FormViewModelCollection] - [<abstract>IFormViewModelDelegate]<:--[<abstract>WithQuestionnaireControls] - [<abstract>IProviderArgsResolver]<:--[<abstract>WithQuestionnaireControls] + [<abstract>StudyPageWidget]<:-[StudySettingsDialog] - [QuestionnaireFormData - | - +questionsData: List<QuestionFormData>?; - +id: String + [StudyTestController | - +StudyUQuestionnaire toQuestionnaire(); - +List<EligibilityCriterion> toEligibilityCriteria(); - +QuestionnaireFormData copy() + +authRepository: IAuthRepository; + +languageCode: String ] - [<abstract>IFormData]<:--[QuestionnaireFormData] + [StudyTestController]o-[<abstract>IAuthRepository] + [StudyBaseController]<:-[StudyTestController] - [<abstract>IFormDataWithSchedule - | - +instanceId: String; - +isTimeLocked: bool; - +timeLockStart: StudyUTimeOfDay?; - +timeLockEnd: StudyUTimeOfDay?; - +hasReminder: bool; - +reminderTime: StudyUTimeOfDay? + [TestAppRoutes | - +Schedule toSchedule() + <static>+studyOverview: String; + <static>+eligibility: String; + <static>+intervention: String; + <static>+consent: String; + <static>+journey: String; + <static>+dashboard: String ] - [<abstract>IFormDataWithSchedule]o-[StudyUTimeOfDay] - [<abstract>IFormData]<:--[<abstract>IFormDataWithSchedule] - - [ScheduleControls + [DrawerEntry | - +formViewModel: WithScheduleControls + +localizedTitle: String Function(); + +icon: IconData?; + +localizedHelpText: String Function()?; + +enabled: bool; + +onSelected: void Function(BuildContext, WidgetRef)?; + +autoCloseDrawer: bool; + +title: String; + +helpText: String? | - +Widget build(); - -List<FormTableRow> _conditionalTimeRestrictions() + +void onClick() ] - [ScheduleControls]o-[<abstract>WithScheduleControls] - [<abstract>FormConsumerWidget]<:-[ScheduleControls] + [DrawerEntry]o-[String Function()] + [DrawerEntry]o-[IconData] + [DrawerEntry]o-[String Function()?] + [DrawerEntry]o-[void Function(BuildContext, WidgetRef)?] - [<abstract>WithScheduleControls + [GoRouterDrawerEntry | - +isTimeRestrictedControl: FormControl<bool>; - +instanceID: FormControl<String>; - +restrictedTimeStartControl: FormControl<Time>; - +restrictedTimeStartPickerControl: FormControl<TimeOfDay>; - +restrictedTimeEndControl: FormControl<Time>; - +restrictedTimeEndPickerControl: FormControl<TimeOfDay>; - +hasReminderControl: FormControl<bool>; - +reminderTimeControl: FormControl<Time>; - +reminderTimePickerControl: FormControl<TimeOfDay>; - -_reminderControlStream: StreamSubscription<dynamic>?; - +scheduleFormControls: Map<String, FormControl<Object>>; - +hasReminder: bool; - +isTimeRestricted: bool; - +timeRestriction: List<Time>? + +intent: RoutingIntent; + +onNavigated: void Function()? | - +void setScheduleControlsFrom(); - -dynamic _initReminderControl() + +void onClick() ] - [<abstract>WithScheduleControls]o-[FormControl] - [<abstract>WithScheduleControls]o-[StreamSubscription] + [GoRouterDrawerEntry]o-[RoutingIntent] + [GoRouterDrawerEntry]o-[void Function()?] + [DrawerEntry]<:-[GoRouterDrawerEntry] - [InterventionFormViewModel + [AppDrawer | - +study: Study; - +interventionIdControl: FormControl<String>; - +interventionTitleControl: FormControl<String>; - +interventionIconControl: FormControl<IconOption>; - +interventionDescriptionControl: FormControl<String>; - +interventionTasksArray: FormArray<dynamic>; - +tasksCollection: FormViewModelCollection<InterventionTaskFormViewModel, InterventionTaskFormData>; - +form: FormGroup; - +interventionId: String; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titleRequired: dynamic; - +atLeastOneTask: dynamic; - +breadcrumbsTitle: String; - +titles: Map<FormMode, String> + +width: int; + +autoCloseDrawer: bool; + +leftPaddingEntries: double; + +logoPaddingVertical: double; + +logoPaddingHorizontal: double; + +logoMaxHeight: double; + +logoSectionMinHeight: double; + +logoSectionMaxHeight: double + ] + + [StudyAnalyzeScreen | - +void setControlsFrom(); - +InterventionFormData buildFormData(); - +List<ModelAction<dynamic>> availableActions(); - +List<ModelAction<dynamic>> availablePopupActions(); - +List<ModelAction<dynamic>> availableInlineActions(); - +void onSelectItem(); - +void onNewItem(); - +void onCancel(); - +dynamic onSave(); - +InterventionTaskFormViewModel provide(); - +InterventionTaskFormRouteArgs buildNewFormRouteArgs(); - +InterventionTaskFormRouteArgs buildFormRouteArgs(); - +InterventionFormViewModel createDuplicate() + +Widget? banner(); + +Widget build() ] - [InterventionFormViewModel]o-[Study] - [InterventionFormViewModel]o-[FormControl] - [InterventionFormViewModel]o-[FormArray] - [InterventionFormViewModel]o-[FormViewModelCollection] - [InterventionFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[InterventionFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[InterventionFormViewModel] - [<abstract>IListActionProvider]<:--[InterventionFormViewModel] - [<abstract>IProviderArgsResolver]<:--[InterventionFormViewModel] + [<abstract>StudyPageWidget]<:-[StudyAnalyzeScreen] - [StudyScheduleFormData - | - +sequenceType: PhaseSequence; - +sequenceTypeCustom: String; - +numCycles: int; - +phaseDuration: int; - +includeBaseline: bool; - +id: String + [StudyAnalyzeController | - +StudySchedule toStudySchedule(); - +Study apply(); - +StudyScheduleFormData copy() + +dynamic onExport() ] - [StudyScheduleFormData]o-[PhaseSequence] - [<abstract>IStudyFormData]<:--[StudyScheduleFormData] + [StudyBaseController]<:-[StudyAnalyzeController] - [StudyScheduleFormView - | - +formViewModel: StudyScheduleControls + [StudyDesignInterventionsFormView | - -FormTableRow _renderCustomSequence(); +Widget build() ] - [StudyScheduleFormView]o-[<abstract>StudyScheduleControls] - [<abstract>FormConsumerWidget]<:-[StudyScheduleFormView] + [<abstract>StudyDesignPageWidget]<:-[StudyDesignInterventionsFormView] - [InterventionTaskFormView + [InterventionFormView | - +formViewModel: InterventionTaskFormViewModel + +formViewModel: InterventionFormViewModel ] - [InterventionTaskFormView]o-[InterventionTaskFormViewModel] + [InterventionFormView]o-[InterventionFormViewModel] [InterventionPreview | @@ -2543,18 +2485,16 @@ [InterventionPreview]o-[InterventionFormRouteArgs] [<abstract>ConsumerWidget]<:-[InterventionPreview] - [InterventionsFormData + [StudyScheduleFormView | - +interventionsData: List<InterventionFormData>; - +studyScheduleData: StudyScheduleFormData; - +id: String + +formViewModel: StudyScheduleControls | - +Study apply(); - +InterventionsFormData copy() + -FormTableRow _renderCustomSequence(); + +Widget build() ] - [InterventionsFormData]o-[StudyScheduleFormData] - [<abstract>IStudyFormData]<:--[InterventionsFormData] + [StudyScheduleFormView]o-[<abstract>StudyScheduleControls] + [<abstract>FormConsumerWidget]<:-[StudyScheduleFormView] [InterventionTaskFormData | @@ -2570,45 +2510,7 @@ [<abstract>IFormDataWithSchedule]<:-[InterventionTaskFormData] - [InterventionFormView - | - +formViewModel: InterventionFormViewModel - ] - - [InterventionFormView]o-[InterventionFormViewModel] - - [InterventionTaskFormViewModel - | - +taskIdControl: FormControl<String>; - +instanceIdControl: FormControl<String>; - +taskTitleControl: FormControl<String>; - +taskDescriptionControl: FormControl<String>; - +markAsCompletedControl: FormControl<bool>; - +form: FormGroup; - +taskId: String; - +instanceId: String; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titleRequired: dynamic; - +titles: Map<FormMode, String> - | - +void setControlsFrom(); - +InterventionTaskFormData buildFormData(); - +InterventionTaskFormViewModel createDuplicate() - ] - - [InterventionTaskFormViewModel]o-[FormControl] - [InterventionTaskFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[InterventionTaskFormViewModel] - [<abstract>WithScheduleControls]<:-[InterventionTaskFormViewModel] - - [StudyDesignInterventionsFormView - | - +Widget build() - ] - - [<abstract>StudyDesignPageWidget]<:-[StudyDesignInterventionsFormView] - - [InterventionsFormViewModel + [InterventionsFormViewModel | +study: Study; +router: GoRouter; @@ -2645,21 +2547,29 @@ [<abstract>IListActionProvider]<:--[InterventionsFormViewModel] [<abstract>IProviderArgsResolver]<:--[InterventionsFormViewModel] - [InterventionFormData + [InterventionTaskFormViewModel | - +interventionId: String; - +title: String; - +description: String?; - +tasksData: List<InterventionTaskFormData>?; - +iconName: String?; - <static>+kDefaultTitle: String; - +id: String + +taskIdControl: FormControl<String>; + +instanceIdControl: FormControl<String>; + +taskTitleControl: FormControl<String>; + +taskDescriptionControl: FormControl<String>; + +markAsCompletedControl: FormControl<bool>; + +form: FormGroup; + +taskId: String; + +instanceId: String; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +titleRequired: dynamic; + +titles: Map<FormMode, String> | - +Intervention toIntervention(); - +InterventionFormData copy() + +void setControlsFrom(); + +InterventionTaskFormData buildFormData(); + +InterventionTaskFormViewModel createDuplicate() ] - [<abstract>IFormData]<:-[InterventionFormData] + [InterventionTaskFormViewModel]o-[FormControl] + [InterventionTaskFormViewModel]o-[FormGroup] + [<abstract>ManagedFormViewModel]<:-[InterventionTaskFormViewModel] + [<abstract>WithScheduleControls]<:-[InterventionTaskFormViewModel] [<abstract>StudyScheduleControls | @@ -2691,359 +2601,370 @@ [<abstract>StudyScheduleControls]o-[PhaseSequence] [<abstract>StudyScheduleControls]o-[FormControl] - [EnrollmentFormData + [InterventionFormData | - <static>+kDefaultEnrollmentType: Participation; - +enrollmentType: Participation; - +questionnaireFormData: QuestionnaireFormData; - +consentItemsFormData: List<ConsentItemFormData>?; + +interventionId: String; + +title: String; + +description: String?; + +tasksData: List<InterventionTaskFormData>?; + +iconName: String?; + <static>+kDefaultTitle: String; +id: String | - +Study apply(); - +EnrollmentFormData copy() + +Intervention toIntervention(); + +InterventionFormData copy() ] - [EnrollmentFormData]o-[Participation] - [EnrollmentFormData]o-[QuestionnaireFormData] - [<abstract>IStudyFormData]<:--[EnrollmentFormData] + [<abstract>IFormData]<:-[InterventionFormData] - [ConsentItemFormViewModel + [StudyScheduleFormData | - +consentIdControl: FormControl<String>; - +titleControl: FormControl<String>; - +descriptionControl: FormControl<String>; - +iconControl: FormControl<IconOption>; - +form: FormGroup; - +consentId: String; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titleRequired: dynamic; - +descriptionRequired: dynamic; - +titles: Map<FormMode, String> + +sequenceType: PhaseSequence; + +sequenceTypeCustom: String; + +numCycles: int; + +phaseDuration: int; + +includeBaseline: bool; + +id: String | - +void setControlsFrom(); - +ConsentItemFormData buildFormData(); - +ConsentItemFormViewModel createDuplicate() + +StudySchedule toStudySchedule(); + +Study apply(); + +StudyScheduleFormData copy() ] - [ConsentItemFormViewModel]o-[FormControl] - [ConsentItemFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[ConsentItemFormViewModel] + [StudyScheduleFormData]o-[PhaseSequence] + [<abstract>IStudyFormData]<:--[StudyScheduleFormData] - [ConsentItemFormView + [InterventionTaskFormView | - +formViewModel: ConsentItemFormViewModel + +formViewModel: InterventionTaskFormViewModel ] - [ConsentItemFormView]o-[ConsentItemFormViewModel] - - [<abstract>IScreenerQuestionLogicFormViewModel - | - +isDirtyOptionsBannerVisible: bool - ] + [InterventionTaskFormView]o-[InterventionTaskFormViewModel] - [ScreenerQuestionLogicFormView + [InterventionsFormData | - +formViewModel: ScreenerQuestionFormViewModel + +interventionsData: List<InterventionFormData>; + +studyScheduleData: StudyScheduleFormData; + +id: String | - +Widget build(); - -dynamic _buildInfoBanner(); - -dynamic _buildAnswerOptionsLogicControls(); - -List<Widget> _buildOptionLogicRow() + +Study apply(); + +InterventionsFormData copy() ] - [ScreenerQuestionLogicFormView]o-[ScreenerQuestionFormViewModel] - [<abstract>FormConsumerWidget]<:-[ScreenerQuestionLogicFormView] + [InterventionsFormData]o-[StudyScheduleFormData] + [<abstract>IStudyFormData]<:--[InterventionsFormData] - [ScreenerQuestionFormViewModel + [InterventionFormViewModel | - <static>+defaultResponseOptionValidity: bool; - +responseOptionsDisabledArray: FormArray<dynamic>; - +responseOptionsLogicControls: FormArray<bool>; - +responseOptionsLogicDescriptionControls: FormArray<String>; - -_questionBaseControls: Map<String, AbstractControl<dynamic>>; - +prevResponseOptionControls: List<AbstractControl<dynamic>>; - +prevResponseOptionValues: List<dynamic>; - +responseOptionsDisabledControls: List<AbstractControl<dynamic>>; - +logicControlOptions: List<FormControlOption<bool>>; - +questionBaseControls: Map<String, AbstractControl<dynamic>>; - +isDirtyOptionsBannerVisible: bool + +study: Study; + +interventionIdControl: FormControl<String>; + +interventionTitleControl: FormControl<String>; + +interventionIconControl: FormControl<IconOption>; + +interventionDescriptionControl: FormControl<String>; + +interventionTasksArray: FormArray<dynamic>; + +tasksCollection: FormViewModelCollection<InterventionTaskFormViewModel, InterventionTaskFormData>; + +form: FormGroup; + +interventionId: String; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +titleRequired: dynamic; + +atLeastOneTask: dynamic; + +breadcrumbsTitle: String; + +titles: Map<FormMode, String> | - +dynamic onResponseOptionsChanged(); +void setControlsFrom(); - +QuestionFormData buildFormData(); - -List<FormControl<dynamic>> _copyFormControls(); - -AbstractControl<dynamic>? _findAssociatedLogicControlFor(); - -AbstractControl<dynamic>? _findAssociatedControlFor(); - +ScreenerQuestionFormViewModel createDuplicate() + +InterventionFormData buildFormData(); + +List<ModelAction<dynamic>> availableActions(); + +List<ModelAction<dynamic>> availablePopupActions(); + +List<ModelAction<dynamic>> availableInlineActions(); + +void onSelectItem(); + +void onNewItem(); + +void onCancel(); + +dynamic onSave(); + +InterventionTaskFormViewModel provide(); + +InterventionTaskFormRouteArgs buildNewFormRouteArgs(); + +InterventionTaskFormRouteArgs buildFormRouteArgs(); + +InterventionFormViewModel createDuplicate() ] - [ScreenerQuestionFormViewModel]o-[FormArray] - [QuestionFormViewModel]<:-[ScreenerQuestionFormViewModel] - [<abstract>IScreenerQuestionLogicFormViewModel]<:--[ScreenerQuestionFormViewModel] + [InterventionFormViewModel]o-[Study] + [InterventionFormViewModel]o-[FormControl] + [InterventionFormViewModel]o-[FormArray] + [InterventionFormViewModel]o-[FormViewModelCollection] + [InterventionFormViewModel]o-[FormGroup] + [<abstract>ManagedFormViewModel]<:-[InterventionFormViewModel] + [<abstract>IFormViewModelDelegate]<:--[InterventionFormViewModel] + [<abstract>IListActionProvider]<:--[InterventionFormViewModel] + [<abstract>IProviderArgsResolver]<:--[InterventionFormViewModel] - [StudyDesignEnrollmentFormView + [StudyDesignReportsFormView | +Widget build(); - -dynamic _showScreenerQuestionSidesheetWithArgs(); - -dynamic _showConsentItemSidesheetWithArgs() + -dynamic _showReportItemSidesheetWithArgs() ] - [<abstract>StudyDesignPageWidget]<:-[StudyDesignEnrollmentFormView] + [<abstract>StudyDesignPageWidget]<:-[StudyDesignReportsFormView] - [ConsentItemFormData + [ReportItemFormData | - +consentId: String; - +title: String; - +description: String; - +iconName: String?; + +isPrimary: bool; + +section: ReportSection; +id: String | - +ConsentItem toConsentItem(); - +ConsentItemFormData copy() + <static>+dynamic fromDomainModel(); + +ReportItemFormData copy() ] - [<abstract>IFormData]<:-[ConsentItemFormData] + [ReportItemFormData]o-[<abstract>ReportSection] + [<abstract>IFormData]<:-[ReportItemFormData] - [EnrollmentFormViewModel + [DataReferenceEditor | - +study: Study; - +router: GoRouter; - +consentItemDelegate: EnrollmentFormConsentItemDelegate; - +enrollmentTypeControl: FormControl<Participation>; - +consentItemArray: FormArray<dynamic>; - +consentItemFormViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData>; - +form: FormGroup; - +enrollmentTypeControlOptions: List<FormControlOption<Participation>>; - +consentItemModels: List<ConsentItemFormViewModel>; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titles: Map<FormMode, String>; - +canTestScreener: bool; - +canTestConsent: bool; - +questionTitles: Map<FormMode, String Function()> + +formControl: FormControl<DataReferenceIdentifier<T>>; + +availableTasks: List<Task>; + +buildReactiveDropdownField: ReactiveDropdownField<dynamic> | - +void setControlsFrom(); - +EnrollmentFormData buildFormData(); - +void read(); - +List<ModelAction<dynamic>> availableActions(); - +List<ModelAction<dynamic>> availablePopupActions(); - +List<ModelAction<dynamic>> availableInlineActions(); - +void onSelectItem(); - +void onNewItem(); - +ScreenerQuestionFormRouteArgs buildNewScreenerQuestionFormRouteArgs(); - +ScreenerQuestionFormRouteArgs buildScreenerQuestionFormRouteArgs(); - +ConsentItemFormRouteArgs buildNewConsentItemFormRouteArgs(); - +ConsentItemFormRouteArgs buildConsentItemFormRouteArgs(); - +dynamic testScreener(); - +dynamic testConsent(); - +ScreenerQuestionFormViewModel provideQuestionFormViewModel() - ] + +FormTableRow buildFormTableRow(); + -List<DropdownMenuItem<DataReferenceIdentifier<dynamic>>> _dataReferenceItems() + ] - [EnrollmentFormViewModel]o-[Study] - [EnrollmentFormViewModel]o-[GoRouter] - [EnrollmentFormViewModel]o-[EnrollmentFormConsentItemDelegate] - [EnrollmentFormViewModel]o-[FormControl] - [EnrollmentFormViewModel]o-[FormArray] - [EnrollmentFormViewModel]o-[FormViewModelCollection] - [EnrollmentFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[EnrollmentFormViewModel] - [<abstract>WithQuestionnaireControls]<:-[EnrollmentFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[EnrollmentFormViewModel] - [<abstract>IListActionProvider]<:--[EnrollmentFormViewModel] - [<abstract>IProviderArgsResolver]<:--[EnrollmentFormViewModel] + [DataReferenceEditor]o-[FormControl] + [DataReferenceEditor]o-[ReactiveDropdownField] - [EnrollmentFormConsentItemDelegate + [TemporalAggregationFormatted | - +formViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData>; - +owner: EnrollmentFormViewModel; - +propagateOnSave: bool; - +validationSet: dynamic + -_value: TemporalAggregation; + <static>+values: List<TemporalAggregationFormatted>; + +value: TemporalAggregation; + +string: String; + +icon: IconData?; + +hashCode: int | - +void onCancel(); - +dynamic onSave(); - +ConsentItemFormViewModel provide(); - +List<ModelAction<dynamic>> availableActions(); - +void onNewItem(); - +void onSelectItem() + +bool ==(); + +String toString(); + +String toJson(); + <static>+TemporalAggregationFormatted fromJson() ] - [EnrollmentFormConsentItemDelegate]o-[FormViewModelCollection] - [EnrollmentFormConsentItemDelegate]o-[EnrollmentFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[EnrollmentFormConsentItemDelegate] - [<abstract>IListActionProvider]<:--[EnrollmentFormConsentItemDelegate] - [<abstract>IProviderArgsResolver]<:--[EnrollmentFormConsentItemDelegate] + [TemporalAggregationFormatted]o-[TemporalAggregation] + [TemporalAggregationFormatted]o-[IconData] - [MeasurementsFormViewModel + [ImprovementDirectionFormatted | - +study: Study; - +router: GoRouter; - +measurementsArray: FormArray<dynamic>; - +surveyMeasurementFormViewModels: FormViewModelCollection<MeasurementSurveyFormViewModel, MeasurementSurveyFormData>; - +form: FormGroup; - +measurementViewModels: List<MeasurementSurveyFormViewModel>; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +measurementRequired: dynamic; - +titles: Map<FormMode, String> + -_value: ImprovementDirection; + <static>+values: List<ImprovementDirectionFormatted>; + +value: ImprovementDirection; + +string: String; + +icon: IconData?; + +hashCode: int | - +void read(); - +void setControlsFrom(); - +MeasurementsFormData buildFormData(); - +List<ModelAction<dynamic>> availableActions(); - +List<ModelAction<dynamic>> availablePopupActions(); - +List<ModelAction<dynamic>> availableInlineActions(); - +void onSelectItem(); - +void onNewItem(); - +MeasurementSurveyFormViewModel provide(); - +void onCancel(); - +dynamic onSave() + +bool ==(); + +String toString(); + +String toJson(); + <static>+ImprovementDirectionFormatted fromJson() ] - [MeasurementsFormViewModel]o-[Study] - [MeasurementsFormViewModel]o-[GoRouter] - [MeasurementsFormViewModel]o-[FormArray] - [MeasurementsFormViewModel]o-[FormViewModelCollection] - [MeasurementsFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[MeasurementsFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[MeasurementsFormViewModel] - [<abstract>IListActionProvider]<:--[MeasurementsFormViewModel] - [<abstract>IProviderArgsResolver]<:--[MeasurementsFormViewModel] + [ImprovementDirectionFormatted]o-[ImprovementDirection] + [ImprovementDirectionFormatted]o-[IconData] - [MeasurementSurveyFormData - | - +measurementId: String; - +title: String; - +introText: String?; - +outroText: String?; - +questionnaireFormData: QuestionnaireFormData; - <static>+kDefaultTitle: String; - +id: String + [ReportSectionType | - +QuestionnaireTask toQuestionnaireTask(); - +MeasurementSurveyFormData copy() + +index: int; + <static>+values: List<ReportSectionType>; + <static>+average: ReportSectionType; + <static>+linearRegression: ReportSectionType ] - [MeasurementSurveyFormData]o-[QuestionnaireFormData] - [<abstract>IFormDataWithSchedule]<:-[MeasurementSurveyFormData] + [ReportSectionType]o-[ReportSectionType] + [Enum]<:--[ReportSectionType] - [SurveyPreview + [AverageSectionFormView | - +routeArgs: MeasurementFormRouteArgs + +formViewModel: ReportItemFormViewModel; + +studyId: String; + +reportSectionColumnWidth: Map<int, TableColumnWidth> | +Widget build() ] - [SurveyPreview]o-[MeasurementFormRouteArgs] - [<abstract>ConsumerWidget]<:-[SurveyPreview] + [AverageSectionFormView]o-[ReportItemFormViewModel] + [<abstract>ConsumerWidget]<:-[AverageSectionFormView] - [MeasurementSurveyFormViewModel - | - +study: Study; - +measurementIdControl: FormControl<String>; - +instanceIdControl: FormControl<String>; - +surveyTitleControl: FormControl<String>; - +surveyIntroTextControl: FormControl<String>; - +surveyOutroTextControl: FormControl<String>; - +form: FormGroup; - +measurementId: String; - +instanceId: String; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titleRequired: dynamic; - +atLeastOneQuestion: dynamic; - +breadcrumbsTitle: String; - +titles: Map<FormMode, String> + [DataReferenceIdentifier | - +void setControlsFrom(); - +MeasurementSurveyFormData buildFormData(); - +List<ModelAction<dynamic>> availableActions(); - +List<ModelAction<dynamic>> availablePopupActions(); - +List<ModelAction<dynamic>> availableInlineActions(); - +void onSelectItem(); - +void onNewItem(); - +SurveyQuestionFormRouteArgs buildNewFormRouteArgs(); - +SurveyQuestionFormRouteArgs buildFormRouteArgs(); - +MeasurementSurveyFormViewModel createDuplicate() - ] - - [MeasurementSurveyFormViewModel]o-[Study] - [MeasurementSurveyFormViewModel]o-[FormControl] - [MeasurementSurveyFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[MeasurementSurveyFormViewModel] - [<abstract>WithQuestionnaireControls]<:-[MeasurementSurveyFormViewModel] - [<abstract>WithScheduleControls]<:-[MeasurementSurveyFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[MeasurementSurveyFormViewModel] - [<abstract>IListActionProvider]<:--[MeasurementSurveyFormViewModel] - [<abstract>IProviderArgsResolver]<:--[MeasurementSurveyFormViewModel] - - [MeasurementSurveyFormView + +hashCode: int | - +formViewModel: MeasurementSurveyFormViewModel + +bool ==() ] - [MeasurementSurveyFormView]o-[MeasurementSurveyFormViewModel] + [DataReference]<:-[DataReferenceIdentifier] - [MeasurementsFormData - | - +surveyMeasurements: List<MeasurementSurveyFormData>; - +id: String + [LinearRegressionSectionFormView | - +Study apply(); - +MeasurementsFormData copy() - ] - - [<abstract>IStudyFormData]<:--[MeasurementsFormData] - - [StudyDesignMeasurementsFormView + +formViewModel: ReportItemFormViewModel; + +studyId: String; + +reportSectionColumnWidth: Map<int, TableColumnWidth> | +Widget build() ] - [<abstract>StudyDesignPageWidget]<:-[StudyDesignMeasurementsFormView] + [LinearRegressionSectionFormView]o-[ReportItemFormViewModel] + [<abstract>ConsumerWidget]<:-[LinearRegressionSectionFormView] - [<abstract>StudyDesignPageWidget + [ReportItemFormViewModel | - +Widget? banner() - ] - - [<abstract>StudyPageWidget]<:-[<abstract>StudyDesignPageWidget] - - [StudyDesignInfoFormView + <static>+defaultSectionType: ReportSectionType; + +sectionIdControl: FormControl<String>; + +sectionTypeControl: FormControl<ReportSectionType>; + +titleControl: FormControl<String>; + +descriptionControl: FormControl<String>; + +sectionControl: FormControl<ReportSection>; + +dataReferenceControl: FormControl<DataReferenceIdentifier<num>>; + +temporalAggregationControl: FormControl<TemporalAggregationFormatted>; + +improvementDirectionControl: FormControl<ImprovementDirectionFormatted>; + +alphaControl: FormControl<double>; + -_controlsBySectionType: Map<ReportSectionType, FormGroup>; + -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + -_validationConfigsBySectionType: Map<ReportSectionType, Map<FormValidationSetEnum, List<FormControlValidation>>>; + +sectionBaseControls: Map<String, AbstractControl<dynamic>>; + +form: FormGroup; + +sectionId: String; + +sectionType: ReportSectionType; + <static>+sectionTypeControlOptions: List<FormControlOption<ReportSectionType>>; + <static>+temporalAggregationControlOptions: List<FormControlOption<TemporalAggregationFormatted>>; + <static>+improvementDirectionControlOptions: List<FormControlOption<ImprovementDirectionFormatted>>; + +titles: Map<FormMode, String>; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +titleRequired: dynamic; + +descriptionRequired: dynamic; + +dataReferenceRequired: dynamic; + +aggregationRequired: dynamic; + +improvementDirectionRequired: dynamic; + +alphaConfidenceRequired: dynamic | - +Widget build() + -List<FormControlValidation> _getValidationConfig(); + +ReportItemFormData buildFormData(); + +ReportItemFormViewModel createDuplicate(); + +dynamic onSectionTypeChanged(); + -void _updateFormControls(); + +void setControlsFrom() ] - [<abstract>StudyDesignPageWidget]<:-[StudyDesignInfoFormView] + [ReportItemFormViewModel]o-[ReportSectionType] + [ReportItemFormViewModel]o-[FormControl] + [ReportItemFormViewModel]o-[FormGroup] + [<abstract>ManagedFormViewModel]<:-[ReportItemFormViewModel] - [StudyInfoFormData + [ReportItemFormView | - +title: String; - +description: String?; - +iconName: String; - +contactInfoFormData: StudyContactInfoFormData; - +id: String + +formViewModel: ReportItemFormViewModel; + +studyId: String; + +reportSectionColumnWidth: dynamic; + +sectionTypeBodyBuilder: Widget Function(BuildContext) | - +Study apply(); - +StudyInfoFormData copy() + +Widget build(); + -dynamic _buildSectionText(); + -dynamic _buildSectionTypeHeader() ] - [StudyInfoFormData]o-[StudyContactInfoFormData] - [<abstract>IStudyFormData]<:--[StudyInfoFormData] + [ReportItemFormView]o-[ReportItemFormViewModel] + [ReportItemFormView]o-[Widget Function(BuildContext)] - [StudyContactInfoFormData + [ReportsFormViewModel | - +organization: String?; - +institutionalReviewBoard: String?; - +institutionalReviewBoardNumber: String?; - +researchers: String?; - +email: String?; - +website: String?; - +phone: String?; - +additionalInfo: String?; + +study: Study; + +router: GoRouter; + +reportItemDelegate: ReportFormItemDelegate; + +reportItemArray: FormArray<dynamic>; + +reportItemFormViewModels: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData>; + +form: FormGroup; + +reportItemModels: List<ReportItemFormViewModel>; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +titles: Map<FormMode, String>; + +canTestConsent: bool + | + +void setControlsFrom(); + +ReportsFormData buildFormData(); + +void read(); + +ReportItemFormRouteArgs buildNewReportItemFormRouteArgs(); + +ReportItemFormRouteArgs buildReportItemFormRouteArgs(); + +dynamic testReport(); + +void onCancel(); + +dynamic onSave(); + +ReportItemFormViewModel provide() + ] + + [ReportsFormViewModel]o-[Study] + [ReportsFormViewModel]o-[GoRouter] + [ReportsFormViewModel]o-[ReportFormItemDelegate] + [ReportsFormViewModel]o-[FormArray] + [ReportsFormViewModel]o-[FormViewModelCollection] + [ReportsFormViewModel]o-[FormGroup] + [<abstract>FormViewModel]<:-[ReportsFormViewModel] + [<abstract>IFormViewModelDelegate]<:--[ReportsFormViewModel] + [<abstract>IProviderArgsResolver]<:--[ReportsFormViewModel] + + [ReportFormItemDelegate + | + +formViewModelCollection: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData>; + +owner: ReportsFormViewModel; + +propagateOnSave: bool; + +validationSet: dynamic + | + +void onCancel(); + +dynamic onSave(); + +ReportItemFormViewModel provide(); + +List<ModelAction<dynamic>> availableActions(); + +void onNewItem(); + +void onSelectItem() + ] + + [ReportFormItemDelegate]o-[FormViewModelCollection] + [ReportFormItemDelegate]o-[ReportsFormViewModel] + [<abstract>IFormViewModelDelegate]<:--[ReportFormItemDelegate] + [<abstract>IListActionProvider]<:--[ReportFormItemDelegate] + [<abstract>IProviderArgsResolver]<:--[ReportFormItemDelegate] + + [ReportBadge + | + +status: ReportStatus?; + +type: BadgeType; + +showPrefixIcon: bool; + +showTooltip: bool + | + +Widget build() + ] + + [ReportBadge]o-[ReportStatus] + [ReportBadge]o-[BadgeType] + + [ReportsFormData + | + +reportItems: List<ReportItemFormData>; +id: String | +Study apply(); - +StudyInfoFormData copy() + +ReportsFormData copy() ] - [<abstract>IStudyFormData]<:--[StudyContactInfoFormData] + [<abstract>IStudyFormData]<:--[ReportsFormData] + + [ReportStatus + | + +index: int; + <static>+values: List<ReportStatus>; + <static>+primary: ReportStatus; + <static>+secondary: ReportStatus + ] + + [ReportStatus]o-[ReportStatus] + [Enum]<:--[ReportStatus] + + [<abstract>IStudyFormData + | + +Study apply() + ] + + [<abstract>IFormData]<:--[<abstract>IStudyFormData] [StudyInfoFormViewModel | @@ -3083,611 +3004,898 @@ [StudyInfoFormViewModel]o-[FormGroup] [<abstract>FormViewModel]<:-[StudyInfoFormViewModel] - [StudyFormViewModel - | - +studyDirtyCopy: Study?; - +studyRepository: IStudyRepository; - +authRepository: IAuthRepository; - +router: GoRouter; - +studyInfoFormViewModel: StudyInfoFormViewModel; - +enrollmentFormViewModel: EnrollmentFormViewModel; - +measurementsFormViewModel: MeasurementsFormViewModel; - +reportsFormViewModel: ReportsFormViewModel; - +interventionsFormViewModel: InterventionsFormViewModel; - +form: FormGroup; - +isStudyReadonly: bool; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titles: Map<FormMode, String> + [StudyDesignInfoFormView | - +void read(); - +void setControlsFrom(); - +Study buildFormData(); - +void dispose(); - +void onCancel(); - +dynamic onSave(); - -dynamic _applyAndSaveSubform() + +Widget build() ] - [StudyFormViewModel]o-[Study] - [StudyFormViewModel]o-[<abstract>IStudyRepository] - [StudyFormViewModel]o-[<abstract>IAuthRepository] - [StudyFormViewModel]o-[GoRouter] - [StudyFormViewModel]o-[StudyInfoFormViewModel] - [StudyFormViewModel]o-[EnrollmentFormViewModel] - [StudyFormViewModel]o-[MeasurementsFormViewModel] - [StudyFormViewModel]o-[ReportsFormViewModel] - [StudyFormViewModel]o-[InterventionsFormViewModel] - [StudyFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[StudyFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[StudyFormViewModel] + [<abstract>StudyDesignPageWidget]<:-[StudyDesignInfoFormView] - [<abstract>IStudyFormData + [StudyInfoFormData | - +Study apply() + +title: String; + +description: String?; + +iconName: String; + +contactInfoFormData: StudyContactInfoFormData; + +id: String + | + +Study apply(); + +StudyInfoFormData copy() ] - [<abstract>IFormData]<:--[<abstract>IStudyFormData] + [StudyInfoFormData]o-[StudyContactInfoFormData] + [<abstract>IStudyFormData]<:--[StudyInfoFormData] - [ReportsFormData + [StudyContactInfoFormData | - +reportItems: List<ReportItemFormData>; + +organization: String?; + +institutionalReviewBoard: String?; + +institutionalReviewBoardNumber: String?; + +researchers: String?; + +email: String?; + +website: String?; + +phone: String?; + +additionalInfo: String?; +id: String | +Study apply(); - +ReportsFormData copy() + +StudyInfoFormData copy() ] - [<abstract>IStudyFormData]<:--[ReportsFormData] + [<abstract>IStudyFormData]<:--[StudyContactInfoFormData] - [ReportStatus + [StudyFormValidationSet | +index: int; - <static>+values: List<ReportStatus>; - <static>+primary: ReportStatus; - <static>+secondary: ReportStatus + <static>+values: List<StudyFormValidationSet> ] - [ReportStatus]o-[ReportStatus] - [Enum]<:--[ReportStatus] + [Enum]<:--[StudyFormValidationSet] - [ReportItemFormData + [MeasurementsFormData | - +isPrimary: bool; - +section: ReportSection; + +surveyMeasurements: List<MeasurementSurveyFormData>; +id: String | - <static>+dynamic fromDomainModel(); - +ReportItemFormData copy() + +Study apply(); + +MeasurementsFormData copy() ] - [ReportItemFormData]o-[<abstract>ReportSection] - [<abstract>IFormData]<:-[ReportItemFormData] + [<abstract>IStudyFormData]<:--[MeasurementsFormData] - [ReportItemFormViewModel - | - <static>+defaultSectionType: ReportSectionType; - +sectionIdControl: FormControl<String>; - +sectionTypeControl: FormControl<ReportSectionType>; - +titleControl: FormControl<String>; - +descriptionControl: FormControl<String>; - +sectionControl: FormControl<ReportSection>; - +dataReferenceControl: FormControl<DataReferenceIdentifier<num>>; - +temporalAggregationControl: FormControl<TemporalAggregationFormatted>; - +improvementDirectionControl: FormControl<ImprovementDirectionFormatted>; - +alphaControl: FormControl<double>; - -_controlsBySectionType: Map<ReportSectionType, FormGroup>; - -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - -_validationConfigsBySectionType: Map<ReportSectionType, Map<FormValidationSetEnum, List<FormControlValidation>>>; - +sectionBaseControls: Map<String, AbstractControl<dynamic>>; - +form: FormGroup; - +sectionId: String; - +sectionType: ReportSectionType; - <static>+sectionTypeControlOptions: List<FormControlOption<ReportSectionType>>; - <static>+temporalAggregationControlOptions: List<FormControlOption<TemporalAggregationFormatted>>; - <static>+improvementDirectionControlOptions: List<FormControlOption<ImprovementDirectionFormatted>>; - +titles: Map<FormMode, String>; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titleRequired: dynamic; - +descriptionRequired: dynamic; - +dataReferenceRequired: dynamic; - +aggregationRequired: dynamic; - +improvementDirectionRequired: dynamic; - +alphaConfidenceRequired: dynamic + [MeasurementSurveyFormView | - -List<FormControlValidation> _getValidationConfig(); - +ReportItemFormData buildFormData(); - +ReportItemFormViewModel createDuplicate(); - +dynamic onSectionTypeChanged(); - -void _updateFormControls(); - +void setControlsFrom() + +formViewModel: MeasurementSurveyFormViewModel ] - [ReportItemFormViewModel]o-[ReportSectionType] - [ReportItemFormViewModel]o-[FormControl] - [ReportItemFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[ReportItemFormViewModel] + [MeasurementSurveyFormView]o-[MeasurementSurveyFormViewModel] - [LinearRegressionSectionFormView + [SurveyPreview | - +formViewModel: ReportItemFormViewModel; - +studyId: String; - +reportSectionColumnWidth: Map<int, TableColumnWidth> + +routeArgs: MeasurementFormRouteArgs | +Widget build() ] - [LinearRegressionSectionFormView]o-[ReportItemFormViewModel] - [<abstract>ConsumerWidget]<:-[LinearRegressionSectionFormView] + [SurveyPreview]o-[MeasurementFormRouteArgs] + [<abstract>ConsumerWidget]<:-[SurveyPreview] - [AverageSectionFormView + [MeasurementSurveyFormData | - +formViewModel: ReportItemFormViewModel; - +studyId: String; - +reportSectionColumnWidth: Map<int, TableColumnWidth> + +measurementId: String; + +title: String; + +introText: String?; + +outroText: String?; + +questionnaireFormData: QuestionnaireFormData; + <static>+kDefaultTitle: String; + +id: String | - +Widget build() + +QuestionnaireTask toQuestionnaireTask(); + +MeasurementSurveyFormData copy() ] - [AverageSectionFormView]o-[ReportItemFormViewModel] - [<abstract>ConsumerWidget]<:-[AverageSectionFormView] + [MeasurementSurveyFormData]o-[QuestionnaireFormData] + [<abstract>IFormDataWithSchedule]<:-[MeasurementSurveyFormData] - [TemporalAggregationFormatted + [MeasurementSurveyFormViewModel | - -_value: TemporalAggregation; - <static>+values: List<TemporalAggregationFormatted>; - +value: TemporalAggregation; - +string: String; - +icon: IconData?; - +hashCode: int - | - +bool ==(); - +String toString(); - +String toJson(); - <static>+TemporalAggregationFormatted fromJson() - ] - - [TemporalAggregationFormatted]o-[TemporalAggregation] - [TemporalAggregationFormatted]o-[IconData] - - [ImprovementDirectionFormatted - | - -_value: ImprovementDirection; - <static>+values: List<ImprovementDirectionFormatted>; - +value: ImprovementDirection; - +string: String; - +icon: IconData?; - +hashCode: int + +study: Study; + +measurementIdControl: FormControl<String>; + +instanceIdControl: FormControl<String>; + +surveyTitleControl: FormControl<String>; + +surveyIntroTextControl: FormControl<String>; + +surveyOutroTextControl: FormControl<String>; + +form: FormGroup; + +measurementId: String; + +instanceId: String; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +titleRequired: dynamic; + +atLeastOneQuestion: dynamic; + +breadcrumbsTitle: String; + +titles: Map<FormMode, String> | - +bool ==(); - +String toString(); - +String toJson(); - <static>+ImprovementDirectionFormatted fromJson() + +void setControlsFrom(); + +MeasurementSurveyFormData buildFormData(); + +List<ModelAction<dynamic>> availableActions(); + +List<ModelAction<dynamic>> availablePopupActions(); + +List<ModelAction<dynamic>> availableInlineActions(); + +void onSelectItem(); + +void onNewItem(); + +SurveyQuestionFormRouteArgs buildNewFormRouteArgs(); + +SurveyQuestionFormRouteArgs buildFormRouteArgs(); + +MeasurementSurveyFormViewModel createDuplicate() ] - [ImprovementDirectionFormatted]o-[ImprovementDirection] - [ImprovementDirectionFormatted]o-[IconData] + [MeasurementSurveyFormViewModel]o-[Study] + [MeasurementSurveyFormViewModel]o-[FormControl] + [MeasurementSurveyFormViewModel]o-[FormGroup] + [<abstract>ManagedFormViewModel]<:-[MeasurementSurveyFormViewModel] + [<abstract>WithQuestionnaireControls]<:-[MeasurementSurveyFormViewModel] + [<abstract>WithScheduleControls]<:-[MeasurementSurveyFormViewModel] + [<abstract>IFormViewModelDelegate]<:--[MeasurementSurveyFormViewModel] + [<abstract>IListActionProvider]<:--[MeasurementSurveyFormViewModel] + [<abstract>IProviderArgsResolver]<:--[MeasurementSurveyFormViewModel] - [ReportSectionType + [StudyDesignMeasurementsFormView | - +index: int; - <static>+values: List<ReportSectionType>; - <static>+average: ReportSectionType; - <static>+linearRegression: ReportSectionType + +Widget build() ] - [ReportSectionType]o-[ReportSectionType] - [Enum]<:--[ReportSectionType] + [<abstract>StudyDesignPageWidget]<:-[StudyDesignMeasurementsFormView] - [DataReferenceEditor + [MeasurementsFormViewModel | - +formControl: FormControl<DataReferenceIdentifier<T>>; - +availableTasks: List<Task>; - +buildReactiveDropdownField: ReactiveDropdownField<dynamic> + +study: Study; + +router: GoRouter; + +measurementsArray: FormArray<dynamic>; + +surveyMeasurementFormViewModels: FormViewModelCollection<MeasurementSurveyFormViewModel, MeasurementSurveyFormData>; + +form: FormGroup; + +measurementViewModels: List<MeasurementSurveyFormViewModel>; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +measurementRequired: dynamic; + +titles: Map<FormMode, String> | - +FormTableRow buildFormTableRow(); - -List<DropdownMenuItem<DataReferenceIdentifier<dynamic>>> _dataReferenceItems() + +void read(); + +void setControlsFrom(); + +MeasurementsFormData buildFormData(); + +List<ModelAction<dynamic>> availableActions(); + +List<ModelAction<dynamic>> availablePopupActions(); + +List<ModelAction<dynamic>> availableInlineActions(); + +void onSelectItem(); + +void onNewItem(); + +MeasurementSurveyFormViewModel provide(); + +void onCancel(); + +dynamic onSave() ] - [DataReferenceEditor]o-[FormControl] - [DataReferenceEditor]o-[ReactiveDropdownField] + [MeasurementsFormViewModel]o-[Study] + [MeasurementsFormViewModel]o-[GoRouter] + [MeasurementsFormViewModel]o-[FormArray] + [MeasurementsFormViewModel]o-[FormViewModelCollection] + [MeasurementsFormViewModel]o-[FormGroup] + [<abstract>FormViewModel]<:-[MeasurementsFormViewModel] + [<abstract>IFormViewModelDelegate]<:--[MeasurementsFormViewModel] + [<abstract>IListActionProvider]<:--[MeasurementsFormViewModel] + [<abstract>IProviderArgsResolver]<:--[MeasurementsFormViewModel] - [DataReferenceIdentifier + [StudyFormScaffold | - +hashCode: int + +studyId: String; + +formViewModelBuilder: T Function(WidgetRef); + +formViewBuilder: Widget Function(T) | - +bool ==() + +Widget build() ] - [DataReference]<:-[DataReferenceIdentifier] + [StudyFormScaffold]o-[T Function(WidgetRef)] + [StudyFormScaffold]o-[Widget Function(T)] + [<abstract>ConsumerWidget]<:-[StudyFormScaffold] - [ReportItemFormView + [ConsentItemFormViewModel | - +formViewModel: ReportItemFormViewModel; - +studyId: String; - +reportSectionColumnWidth: dynamic; - +sectionTypeBodyBuilder: Widget Function(BuildContext) + +consentIdControl: FormControl<String>; + +titleControl: FormControl<String>; + +descriptionControl: FormControl<String>; + +iconControl: FormControl<IconOption>; + +form: FormGroup; + +consentId: String; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +titleRequired: dynamic; + +descriptionRequired: dynamic; + +titles: Map<FormMode, String> | - +Widget build(); - -dynamic _buildSectionText(); - -dynamic _buildSectionTypeHeader() + +void setControlsFrom(); + +ConsentItemFormData buildFormData(); + +ConsentItemFormViewModel createDuplicate() ] - [ReportItemFormView]o-[ReportItemFormViewModel] - [ReportItemFormView]o-[Widget Function(BuildContext)] + [ConsentItemFormViewModel]o-[FormControl] + [ConsentItemFormViewModel]o-[FormGroup] + [<abstract>ManagedFormViewModel]<:-[ConsentItemFormViewModel] - [StudyDesignReportsFormView + [StudyDesignEnrollmentFormView | +Widget build(); - -dynamic _showReportItemSidesheetWithArgs() + -dynamic _showScreenerQuestionSidesheetWithArgs(); + -dynamic _showConsentItemSidesheetWithArgs() ] - [<abstract>StudyDesignPageWidget]<:-[StudyDesignReportsFormView] + [<abstract>StudyDesignPageWidget]<:-[StudyDesignEnrollmentFormView] - [ReportsFormViewModel - | - +study: Study; - +router: GoRouter; - +reportItemDelegate: ReportFormItemDelegate; - +reportItemArray: FormArray<dynamic>; - +reportItemFormViewModels: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData>; - +form: FormGroup; - +reportItemModels: List<ReportItemFormViewModel>; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titles: Map<FormMode, String>; - +canTestConsent: bool + [<abstract>IScreenerQuestionLogicFormViewModel | - +void setControlsFrom(); - +ReportsFormData buildFormData(); - +void read(); - +ReportItemFormRouteArgs buildNewReportItemFormRouteArgs(); - +ReportItemFormRouteArgs buildReportItemFormRouteArgs(); - +dynamic testReport(); - +void onCancel(); - +dynamic onSave(); - +ReportItemFormViewModel provide() + +isDirtyOptionsBannerVisible: bool ] - [ReportsFormViewModel]o-[Study] - [ReportsFormViewModel]o-[GoRouter] - [ReportsFormViewModel]o-[ReportFormItemDelegate] - [ReportsFormViewModel]o-[FormArray] - [ReportsFormViewModel]o-[FormViewModelCollection] - [ReportsFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[ReportsFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[ReportsFormViewModel] - [<abstract>IProviderArgsResolver]<:--[ReportsFormViewModel] - - [ReportFormItemDelegate + [ScreenerQuestionLogicFormView | - +formViewModelCollection: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData>; - +owner: ReportsFormViewModel; - +propagateOnSave: bool; - +validationSet: dynamic + +formViewModel: ScreenerQuestionFormViewModel | - +void onCancel(); - +dynamic onSave(); - +ReportItemFormViewModel provide(); - +List<ModelAction<dynamic>> availableActions(); - +void onNewItem(); - +void onSelectItem() + +Widget build(); + -dynamic _buildInfoBanner(); + -dynamic _buildAnswerOptionsLogicControls(); + -List<Widget> _buildOptionLogicRow() ] - [ReportFormItemDelegate]o-[FormViewModelCollection] - [ReportFormItemDelegate]o-[ReportsFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[ReportFormItemDelegate] - [<abstract>IListActionProvider]<:--[ReportFormItemDelegate] - [<abstract>IProviderArgsResolver]<:--[ReportFormItemDelegate] + [ScreenerQuestionLogicFormView]o-[ScreenerQuestionFormViewModel] + [<abstract>FormConsumerWidget]<:-[ScreenerQuestionLogicFormView] - [ReportBadge + [ConsentItemFormData | - +status: ReportStatus?; - +type: BadgeType; - +showPrefixIcon: bool; - +showTooltip: bool + +consentId: String; + +title: String; + +description: String; + +iconName: String?; + +id: String | - +Widget build() + +ConsentItem toConsentItem(); + +ConsentItemFormData copy() ] - [ReportBadge]o-[ReportStatus] - [ReportBadge]o-[BadgeType] + [<abstract>IFormData]<:-[ConsentItemFormData] - [AccountSettingsDialog + [ConsentItemFormView | - +Widget build() + +formViewModel: ConsentItemFormViewModel ] - [<abstract>ConsumerWidget]<:-[AccountSettingsDialog] - - [<abstract>IAppRepository - | - +dynamic fetchAppConfig(); - +void dispose() - ] + [ConsentItemFormView]o-[ConsentItemFormViewModel] - [AppRepository + [EnrollmentFormData | - +apiClient: StudyUApi + <static>+kDefaultEnrollmentType: Participation; + +enrollmentType: Participation; + +questionnaireFormData: QuestionnaireFormData; + +consentItemsFormData: List<ConsentItemFormData>?; + +id: String | - +dynamic fetchAppConfig(); - +void dispose() + +Study apply(); + +EnrollmentFormData copy() ] - [AppRepository]o-[<abstract>StudyUApi] - [<abstract>IAppRepository]<:--[AppRepository] + [EnrollmentFormData]o-[Participation] + [EnrollmentFormData]o-[QuestionnaireFormData] + [<abstract>IStudyFormData]<:--[EnrollmentFormData] - [<abstract>IAuthRepository + [ScreenerQuestionFormViewModel | - +allowPasswordReset: bool; - +currentUser: User?; - +isLoggedIn: bool; - +session: Session?; - +serializedSession: String? + <static>+defaultResponseOptionValidity: bool; + +responseOptionsDisabledArray: FormArray<dynamic>; + +responseOptionsLogicControls: FormArray<bool>; + +responseOptionsLogicDescriptionControls: FormArray<String>; + -_questionBaseControls: Map<String, AbstractControl<dynamic>>; + +prevResponseOptionControls: List<AbstractControl<dynamic>>; + +prevResponseOptionValues: List<dynamic>; + +responseOptionsDisabledControls: List<AbstractControl<dynamic>>; + +logicControlOptions: List<FormControlOption<bool>>; + +questionBaseControls: Map<String, AbstractControl<dynamic>>; + +isDirtyOptionsBannerVisible: bool | - +dynamic signUp(); - +dynamic signInWith(); - +dynamic signOut(); - +dynamic resetPasswordForEmail(); - +dynamic updateUser(); - +void dispose() + +dynamic onResponseOptionsChanged(); + +void setControlsFrom(); + +QuestionFormData buildFormData(); + -List<FormControl<dynamic>> _copyFormControls(); + -AbstractControl<dynamic>? _findAssociatedLogicControlFor(); + -AbstractControl<dynamic>? _findAssociatedControlFor(); + +ScreenerQuestionFormViewModel createDuplicate() ] - [<abstract>IAuthRepository]o-[User] - [<abstract>IAuthRepository]o-[Session] - [<abstract>IAppDelegate]<:-[<abstract>IAuthRepository] + [ScreenerQuestionFormViewModel]o-[FormArray] + [QuestionFormViewModel]<:-[ScreenerQuestionFormViewModel] + [<abstract>IScreenerQuestionLogicFormViewModel]<:--[ScreenerQuestionFormViewModel] - [AuthRepository + [EnrollmentFormViewModel | - +supabaseClient: SupabaseClient; - +sharedPreferences: SharedPreferences; - +allowPasswordReset: bool; - +authClient: GoTrueClient; - +session: Session?; - +serializedSession: String?; - +currentUser: User?; - +isLoggedIn: bool + +study: Study; + +router: GoRouter; + +consentItemDelegate: EnrollmentFormConsentItemDelegate; + +enrollmentTypeControl: FormControl<Participation>; + +consentItemArray: FormArray<dynamic>; + +consentItemFormViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData>; + +form: FormGroup; + +enrollmentTypeControlOptions: List<FormControlOption<Participation>>; + +consentItemModels: List<ConsentItemFormViewModel>; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +titles: Map<FormMode, String>; + +canTestScreener: bool; + +canTestConsent: bool; + +questionTitles: Map<FormMode, String Function()> | - -void _registerAuthListener(); - +dynamic signUp(); - +dynamic signInWith(); - +dynamic signOut(); - +dynamic resetPasswordForEmail(); - +dynamic updateUser(); + +void setControlsFrom(); + +EnrollmentFormData buildFormData(); + +void read(); + +List<ModelAction<dynamic>> availableActions(); + +List<ModelAction<dynamic>> availablePopupActions(); + +List<ModelAction<dynamic>> availableInlineActions(); + +void onSelectItem(); + +void onNewItem(); + +ScreenerQuestionFormRouteArgs buildNewScreenerQuestionFormRouteArgs(); + +ScreenerQuestionFormRouteArgs buildScreenerQuestionFormRouteArgs(); + +ConsentItemFormRouteArgs buildNewConsentItemFormRouteArgs(); + +ConsentItemFormRouteArgs buildConsentItemFormRouteArgs(); + +dynamic testScreener(); + +dynamic testConsent(); + +ScreenerQuestionFormViewModel provideQuestionFormViewModel() + ] + + [EnrollmentFormViewModel]o-[Study] + [EnrollmentFormViewModel]o-[GoRouter] + [EnrollmentFormViewModel]o-[EnrollmentFormConsentItemDelegate] + [EnrollmentFormViewModel]o-[FormControl] + [EnrollmentFormViewModel]o-[FormArray] + [EnrollmentFormViewModel]o-[FormViewModelCollection] + [EnrollmentFormViewModel]o-[FormGroup] + [<abstract>FormViewModel]<:-[EnrollmentFormViewModel] + [<abstract>WithQuestionnaireControls]<:-[EnrollmentFormViewModel] + [<abstract>IFormViewModelDelegate]<:--[EnrollmentFormViewModel] + [<abstract>IListActionProvider]<:--[EnrollmentFormViewModel] + [<abstract>IProviderArgsResolver]<:--[EnrollmentFormViewModel] + + [EnrollmentFormConsentItemDelegate + | + +formViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData>; + +owner: EnrollmentFormViewModel; + +propagateOnSave: bool; + +validationSet: dynamic + | + +void onCancel(); + +dynamic onSave(); + +ConsentItemFormViewModel provide(); + +List<ModelAction<dynamic>> availableActions(); + +void onNewItem(); + +void onSelectItem() + ] + + [EnrollmentFormConsentItemDelegate]o-[FormViewModelCollection] + [EnrollmentFormConsentItemDelegate]o-[EnrollmentFormViewModel] + [<abstract>IFormViewModelDelegate]<:--[EnrollmentFormConsentItemDelegate] + [<abstract>IListActionProvider]<:--[EnrollmentFormConsentItemDelegate] + [<abstract>IProviderArgsResolver]<:--[EnrollmentFormConsentItemDelegate] + + [StudyFormViewModel + | + +studyDirtyCopy: Study?; + +studyRepository: IStudyRepository; + +authRepository: IAuthRepository; + +router: GoRouter; + +studyInfoFormViewModel: StudyInfoFormViewModel; + +enrollmentFormViewModel: EnrollmentFormViewModel; + +measurementsFormViewModel: MeasurementsFormViewModel; + +reportsFormViewModel: ReportsFormViewModel; + +interventionsFormViewModel: InterventionsFormViewModel; + +form: FormGroup; + +isStudyReadonly: bool; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +titles: Map<FormMode, String> + | + +void read(); + +void setControlsFrom(); + +Study buildFormData(); +void dispose(); - +dynamic onAppStart() + +void onCancel(); + +dynamic onSave(); + -dynamic _applyAndSaveSubform() ] - [AuthRepository]o-[SupabaseClient] - [AuthRepository]o-[SharedPreferences] - [AuthRepository]o-[GoTrueClient] - [AuthRepository]o-[Session] - [AuthRepository]o-[User] - [<abstract>IAuthRepository]<:--[AuthRepository] + [StudyFormViewModel]o-[Study] + [StudyFormViewModel]o-[<abstract>IStudyRepository] + [StudyFormViewModel]o-[<abstract>IAuthRepository] + [StudyFormViewModel]o-[GoRouter] + [StudyFormViewModel]o-[StudyInfoFormViewModel] + [StudyFormViewModel]o-[EnrollmentFormViewModel] + [StudyFormViewModel]o-[MeasurementsFormViewModel] + [StudyFormViewModel]o-[ReportsFormViewModel] + [StudyFormViewModel]o-[InterventionsFormViewModel] + [StudyFormViewModel]o-[FormGroup] + [<abstract>FormViewModel]<:-[StudyFormViewModel] + [<abstract>IFormViewModelDelegate]<:--[StudyFormViewModel] - [StudyLaunched + [<abstract>WithQuestionnaireControls + | + +questionsArray: FormArray<dynamic>; + +questionFormViewModels: FormViewModelCollection<Q, QuestionFormData>; + +questionnaireControls: Map<String, FormArray<dynamic>>; + +propagateOnSave: bool; + +questionModels: List<Q>; + +questionTitles: Map<FormMode, String Function()> + | + +void setQuestionnaireControlsFrom(); + +QuestionnaireFormData buildQuestionnaireFormData(); + +void read(); + +void onCancel(); + +dynamic onSave(); + +Q provide(); + +Q provideQuestionFormViewModel() ] - [<abstract>ModelEvent]<:-[StudyLaunched] + [<abstract>WithQuestionnaireControls]o-[FormArray] + [<abstract>WithQuestionnaireControls]o-[FormViewModelCollection] + [<abstract>IFormViewModelDelegate]<:--[<abstract>WithQuestionnaireControls] + [<abstract>IProviderArgsResolver]<:--[<abstract>WithQuestionnaireControls] - [<abstract>StudyUApi + [QuestionnaireFormData | - +dynamic saveStudy(); - +dynamic fetchStudy(); - +dynamic getUserStudies(); - +dynamic deleteStudy(); - +dynamic saveStudyInvite(); - +dynamic fetchStudyInvite(); - +dynamic deleteStudyInvite(); - +dynamic deleteParticipants(); - +dynamic fetchAppConfig(); - +dynamic fetchUser(); - +dynamic saveUser() + +questionsData: List<QuestionFormData>?; + +id: String + | + +StudyUQuestionnaire toQuestionnaire(); + +List<EligibilityCriterion> toEligibilityCriteria(); + +QuestionnaireFormData copy() ] - [APIException + [<abstract>IFormData]<:--[QuestionnaireFormData] + + [<abstract>QuestionFormData + | + <static>+questionTypeFormDataFactories: Map<SurveyQuestionType, QuestionFormData Function(Question<dynamic>, List<EligibilityCriterion>)>; + +questionId: String; + +questionText: String; + +questionInfoText: String?; + +questionType: SurveyQuestionType; + +responseOptionsValidity: Map<dynamic, bool>; + +responseOptions: List<dynamic>; + +id: String + | + +Question<dynamic> toQuestion(); + +EligibilityCriterion toEligibilityCriterion(); + +Answer<dynamic> constructAnswerFor(); + +dynamic setResponseOptionsValidityFrom(); + +QuestionFormData copy() ] - [Exception]<:--[APIException] + [<abstract>QuestionFormData]o-[SurveyQuestionType] + [<abstract>IFormData]<:--[<abstract>QuestionFormData] - [StudyNotFoundException + [ChoiceQuestionFormData + | + +isMultipleChoice: bool; + +answerOptions: List<String>; + +responseOptions: List<String> + | + +Question<dynamic> toQuestion(); + +QuestionFormData copy(); + -Choice _buildChoiceForValue(); + +Answer<dynamic> constructAnswerFor() ] - [APIException]<:-[StudyNotFoundException] + [<abstract>QuestionFormData]<:-[ChoiceQuestionFormData] - [MeasurementNotFoundException + [BoolQuestionFormData + | + <static>+kResponseOptions: Map<String, bool>; + +responseOptions: List<String> + | + +Question<dynamic> toQuestion(); + +BoolQuestionFormData copy(); + +Answer<dynamic> constructAnswerFor() ] - [APIException]<:-[MeasurementNotFoundException] + [<abstract>QuestionFormData]<:-[BoolQuestionFormData] - [QuestionNotFoundException + [ScaleQuestionFormData + | + +minValue: double; + +maxValue: double; + +minLabel: String?; + +maxLabel: String?; + +midValues: List<double?>; + +midLabels: List<String?>; + +stepSize: double; + +initialValue: double?; + +minColor: Color?; + +maxColor: Color?; + +responseOptions: List<double>; + +midAnnotations: List<Annotation> + | + +ScaleQuestion toQuestion(); + +QuestionFormData copy(); + +Answer<dynamic> constructAnswerFor() ] - [APIException]<:-[QuestionNotFoundException] + [ScaleQuestionFormData]o-[Color] + [<abstract>QuestionFormData]<:-[ScaleQuestionFormData] - [ConsentItemNotFoundException + [FreeTextQuestionFormData + | + +textLengthRange: List<int>; + +textType: FreeTextQuestionType; + +textTypeExpression: String?; + +responseOptions: List<String> + | + +Question<dynamic> toQuestion(); + +FreeTextQuestionFormData copy(); + +Answer<dynamic> constructAnswerFor() ] - [APIException]<:-[ConsentItemNotFoundException] + [FreeTextQuestionFormData]o-[FreeTextQuestionType] + [<abstract>QuestionFormData]<:-[FreeTextQuestionFormData] - [InterventionNotFoundException + [FreeTextQuestionFormView + | + +formViewModel: QuestionFormViewModel; + +generateLabelHelpTextMap: dynamic + | + +Widget build(); + +Widget disableOnReadonly(); + +Widget generateRow() ] - [APIException]<:-[InterventionNotFoundException] + [FreeTextQuestionFormView]o-[QuestionFormViewModel] + [<abstract>ConsumerWidget]<:-[FreeTextQuestionFormView] - [InterventionTaskNotFoundException + [SurveyQuestionType + | + +index: int; + <static>+values: List<SurveyQuestionType>; + <static>+choice: SurveyQuestionType; + <static>+bool: SurveyQuestionType; + <static>+scale: SurveyQuestionType; + <static>+freeText: SurveyQuestionType + ] + + [SurveyQuestionType]o-[SurveyQuestionType] + [Enum]<:--[SurveyQuestionType] + + [<abstract>IScaleQuestionFormViewModel + | + +isMidValuesClearedInfoVisible: bool + ] + + [ScaleQuestionFormView + | + +formViewModel: QuestionFormViewModel + ] + + [ScaleQuestionFormView]o-[QuestionFormViewModel] + + [ChoiceQuestionFormView + | + +formViewModel: QuestionFormViewModel + | + +Widget build() + ] + + [ChoiceQuestionFormView]o-[QuestionFormViewModel] + [<abstract>ConsumerWidget]<:-[ChoiceQuestionFormView] + + [BoolQuestionFormView + | + +formViewModel: QuestionFormViewModel + | + +Widget build() + ] + + [BoolQuestionFormView]o-[QuestionFormViewModel] + [<abstract>ConsumerWidget]<:-[BoolQuestionFormView] + + [QuestionFormViewModel + | + <static>+defaultQuestionType: SurveyQuestionType; + -_titles: Map<FormMode, String Function()>?; + +questionIdControl: FormControl<String>; + +questionTypeControl: FormControl<SurveyQuestionType>; + +questionTextControl: FormControl<String>; + +questionInfoTextControl: FormControl<String>; + +questionBaseControls: Map<String, AbstractControl<dynamic>>; + +isMultipleChoiceControl: FormControl<bool>; + +choiceResponseOptionsArray: FormArray<dynamic>; + +customOptionsMin: int; + +customOptionsMax: int; + +customOptionsInitial: int; + +boolResponseOptionsArray: FormArray<String>; + <static>+kDefaultScaleMinValue: int; + <static>+kDefaultScaleMaxValue: int; + <static>+kNumMidValueControls: int; + <static>+kMidValueDebounceMilliseconds: int; + +scaleMinValueControl: FormControl<int>; + +scaleMaxValueControl: FormControl<int>; + -_scaleRangeControl: FormControl<int>; + +scaleMinLabelControl: FormControl<String>; + +scaleMaxLabelControl: FormControl<String>; + +scaleMidValueControls: FormArray<int>; + +scaleMidLabelControls: FormArray<String?>; + -_scaleResponseOptionsArray: FormArray<int>; + +scaleMinColorControl: FormControl<SerializableColor>; + +scaleMaxColorControl: FormControl<SerializableColor>; + +prevMidValues: List<int?>?; + +freeTextTypeControl: FormControl<FreeTextQuestionType>; + +customRegexControl: FormControl<String>; + +freeTextResponseOptionsArray: FormArray<dynamic>; + +freeTextLengthMin: AbstractControl<int>; + +freeTextLengthMax: AbstractControl<int>; + +freeTextExampleTextControl: FormControl<String>; + <static>+kDefaultFreeTextMinLength: int; + <static>+kDefaultFreeTextMaxLength: int; + +freeTextLengthControl: FormControl<RangeValues>; + -_controlsByQuestionType: Map<SurveyQuestionType, FormGroup>; + -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + -_validationConfigsByQuestionType: Map<SurveyQuestionType, Map<FormValidationSetEnum, List<FormControlValidation>>>; + +form: FormGroup; + +questionId: String; + +questionType: SurveyQuestionType; + +questionTypeControlOptions: List<FormControlOption<SurveyQuestionType>>; + +answerOptionsArray: FormArray<dynamic>; + +answerOptionsControls: List<AbstractControl<dynamic>>; + +validAnswerOptions: List<String>; + +boolOptions: List<AbstractControl<String>>; + +scaleMinValue: int; + +scaleMaxValue: int; + +scaleRange: int; + +scaleAllValueControls: List<AbstractControl<int>>; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +questionTextRequired: dynamic; + +numValidChoiceOptions: dynamic; + +scaleRangeValid: dynamic; + +titles: Map<FormMode, String>; + +isAddOptionButtonVisible: bool; + +isMidValuesClearedInfoVisible: bool + | + +String? scaleMidLabelAt(); + -dynamic _onScaleRangeChanged(); + -dynamic _applyInputFormatters(); + -dynamic _updateScaleMidValueControls(); + -Map<String, dynamic>? _validateFreeText(); + -dynamic _onFreeTextLengthChanged(); + -List<FormControlValidation> _getValidationConfig(); + +dynamic onQuestionTypeChanged(); + +dynamic onResponseOptionsChanged(); + -void _updateFormControls(); + +void initControls(); + +void setControlsFrom(); + +QuestionFormData buildFormData(); + +List<ModelAction<dynamic>> availableActions(); + +void onNewItem(); + +void onSelectItem(); + +dynamic save(); + +QuestionFormViewModel createDuplicate() + ] + + [QuestionFormViewModel]o-[SurveyQuestionType] + [QuestionFormViewModel]o-[FormControl] + [QuestionFormViewModel]o-[FormArray] + [QuestionFormViewModel]o-[<abstract>AbstractControl] + [QuestionFormViewModel]o-[FormGroup] + [<abstract>ManagedFormViewModel]<:-[QuestionFormViewModel] + [<abstract>IListActionProvider]<:--[QuestionFormViewModel] + + [SurveyQuestionFormView + | + +formViewModel: QuestionFormViewModel; + +isHtmlStyleable: bool + ] + + [SurveyQuestionFormView]o-[QuestionFormViewModel] + + [<abstract>IFormDataWithSchedule + | + +instanceId: String; + +isTimeLocked: bool; + +timeLockStart: StudyUTimeOfDay?; + +timeLockEnd: StudyUTimeOfDay?; + +hasReminder: bool; + +reminderTime: StudyUTimeOfDay? + | + +Schedule toSchedule() ] - [APIException]<:-[InterventionTaskNotFoundException] + [<abstract>IFormDataWithSchedule]o-[StudyUTimeOfDay] + [<abstract>IFormData]<:--[<abstract>IFormDataWithSchedule] - [ReportNotFoundException + [ScheduleControls + | + +formViewModel: WithScheduleControls + | + +Widget build(); + -List<FormTableRow> _conditionalTimeRestrictions() ] - [APIException]<:-[ReportNotFoundException] + [ScheduleControls]o-[<abstract>WithScheduleControls] + [<abstract>FormConsumerWidget]<:-[ScheduleControls] - [ReportSectionNotFoundException + [<abstract>WithScheduleControls + | + +isTimeRestrictedControl: FormControl<bool>; + +instanceID: FormControl<String>; + +restrictedTimeStartControl: FormControl<Time>; + +restrictedTimeStartPickerControl: FormControl<TimeOfDay>; + +restrictedTimeEndControl: FormControl<Time>; + +restrictedTimeEndPickerControl: FormControl<TimeOfDay>; + +hasReminderControl: FormControl<bool>; + +reminderTimeControl: FormControl<Time>; + +reminderTimePickerControl: FormControl<TimeOfDay>; + -_reminderControlStream: StreamSubscription<dynamic>?; + +scheduleFormControls: Map<String, FormControl<Object>>; + +hasReminder: bool; + +isTimeRestricted: bool; + +timeRestriction: List<Time>? + | + +void setScheduleControlsFrom(); + -dynamic _initReminderControl() ] - [APIException]<:-[ReportSectionNotFoundException] + [<abstract>WithScheduleControls]o-[FormControl] + [<abstract>WithScheduleControls]o-[StreamSubscription] - [StudyInviteNotFoundException + [<abstract>StudyDesignPageWidget + | + +Widget? banner() ] - [APIException]<:-[StudyInviteNotFoundException] + [<abstract>StudyPageWidget]<:-[<abstract>StudyDesignPageWidget] - [UserNotFoundException + [StudiesTableColumnHeader + | + +title: String; + +sortable: bool; + +sortAscending: bool; + +sortingActive: bool; + +onSort: void Function()? ] - [APIException]<:-[UserNotFoundException] + [StudiesTableColumnHeader]o-[void Function()?] - [StudyUApiClient - | - +supabaseClient: SupabaseClient; - <static>+studyColumns: List<String>; - <static>+studyWithParticipantActivityColumns: List<String>; - +testDelayMilliseconds: int + [DashboardScreen | - +dynamic deleteParticipants(); - +dynamic getUserStudies(); - +dynamic fetchStudy(); - +dynamic deleteStudy(); - +dynamic saveStudy(); - +dynamic fetchStudyInvite(); - +dynamic saveStudyInvite(); - +dynamic deleteStudyInvite(); - +dynamic fetchAppConfig(); - +dynamic fetchUser(); - +dynamic saveUser(); - -dynamic _awaitGuarded(); - -dynamic _apiException(); - -dynamic _testDelay() + +filter: StudiesFilter? ] - [StudyUApiClient]o-[SupabaseClient] - [<abstract>SupabaseClientDependant]<:-[StudyUApiClient] - [<abstract>SupabaseQueryMixin]<:-[StudyUApiClient] - [<abstract>StudyUApi]<:--[StudyUApiClient] + [DashboardScreen]o-[StudiesFilter] - [WrappedModel + [DashboardScaffold | - -_model: T; - +asyncValue: AsyncValue<T>; - +isLocalOnly: bool; - +isDirty: bool; - +isDeleted: bool; - +lastSaved: DateTime?; - +lastFetched: DateTime?; - +lastUpdated: DateTime?; - +model: T + <static>+compactWidthThreshold: double; + +body: Widget | - +dynamic markWithError(); - +dynamic markAsLoading(); - +dynamic markAsFetched(); - +dynamic markAsSaved() - ] - - [WrappedModel]o-[<abstract>AsyncValue] - - [ModelRepositoryException + +Widget build() ] - [Exception]<:--[ModelRepositoryException] + [DashboardScaffold]o-[<abstract>Widget] - [ModelNotFoundException + [DashboardController + | + +studyRepository: IStudyRepository; + +authRepository: IAuthRepository; + +userRepository: IUserRepository; + +router: GoRouter; + -_studiesSubscription: StreamSubscription<List<WrappedModel<Study>>>?; + +searchController: SearchController; + +isSortAscending: bool + | + -dynamic _subscribeStudies(); + +dynamic setSearchText(); + +dynamic setStudiesFilter(); + +dynamic onSelectStudy(); + +dynamic onClickNewStudy(); + +dynamic pinStudy(); + +dynamic pinOffStudy(); + +void setSorting(); + +void filterStudies(); + +void sortStudies(); + +bool isSortingActiveForColumn(); + +bool isPinned(); + +List<ModelAction<dynamic>> availableActions(); + +void dispose() ] - [ModelRepositoryException]<:--[ModelNotFoundException] + [DashboardController]o-[<abstract>IStudyRepository] + [DashboardController]o-[<abstract>IAuthRepository] + [DashboardController]o-[<abstract>IUserRepository] + [DashboardController]o-[GoRouter] + [DashboardController]o-[StreamSubscription] + [DashboardController]o-[SearchController] + [<abstract>IModelActionProvider]<:--[DashboardController] - [<abstract>IModelRepository + [StudiesFilter | - +String getKey(); - +WrappedModel<T>? get(); - +dynamic fetchAll(); - +dynamic fetch(); - +dynamic save(); - +dynamic delete(); - +dynamic duplicateAndSave(); - +dynamic duplicateAndSaveFromRemote(); - +Stream<WrappedModel<T>> watch(); - +Stream<List<WrappedModel<T>>> watchAll(); - +Stream<ModelEvent<T>> watchChanges(); - +Stream<ModelEvent<T>> watchAllChanges(); - +dynamic ensurePersisted(); - +void dispose() + +index: int; + <static>+values: List<StudiesFilter> ] - [<abstract>IModelActionProvider]<:--[<abstract>IModelRepository] + [Enum]<:--[StudiesFilter] - [<abstract>IModelRepositoryDelegate + [StudiesTableColumnSize | - +dynamic fetchAll(); - +dynamic fetch(); - +dynamic save(); - +dynamic delete(); - +T createNewInstance(); - +T createDuplicate(); - +dynamic onError() + +collapsed: bool; + +flex: int?; + +width: double? + | + +Widget createContainer() ] - [<abstract>ModelRepository + [StudiesTable | - +delegate: IModelRepositoryDelegate<T>; - -_allModelsStreamController: BehaviorSubject<List<WrappedModel<T>>>; - -_allModelEventsStreamController: BehaviorSubject<ModelEvent<T>>; - +modelStreamControllers: Map<String, BehaviorSubject<WrappedModel<T>>>; - +modelEventsStreamControllers: Map<String, BehaviorSubject<ModelEvent<T>>>; - -_allModels: Map<String, WrappedModel<T>> + +itemHeight: double; + +itemPadding: double; + +rowSpacing: double; + +columnSpacing: double; + +compactWidthThreshold: double; + +superCompactWidthThreshold: double; + +compactStatTitleThreshold: double; + +studies: List<Study>; + +onSelect: void Function(Study); + +getActions: List<ModelAction<dynamic>> Function(Study); + +emptyWidget: Widget; + +pinnedStudies: Iterable<String>; + +dashboardController: DashboardController | - +WrappedModel<T>? get(); - +dynamic fetchAll(); - +dynamic fetch(); - +dynamic save(); - +dynamic delete(); - +dynamic duplicateAndSave(); - +dynamic duplicateAndSaveFromRemote(); - +Stream<List<WrappedModel<T>>> watchAll(); - +Stream<WrappedModel<T>> watch(); - +Stream<ModelEvent<T>> watchAllChanges(); - +Stream<ModelEvent<T>> watchChanges(); - -dynamic _buildModelSpecificController(); - +dynamic ensurePersisted(); - +WrappedModel<T> upsertLocally(); - +List<WrappedModel<T>> upsertAllLocally(); - +dynamic emitUpdate(); - +dynamic emitModelEvent(); - +dynamic emitError(); - +void dispose(); - +List<ModelAction<dynamic>> availableActions() + +Widget build(); + -Widget _buildColumnHeader() ] - [<abstract>ModelRepository]o-[<abstract>IModelRepositoryDelegate] - [<abstract>ModelRepository]o-[BehaviorSubject] - [<abstract>IModelRepository]<:-[<abstract>ModelRepository] + [StudiesTable]o-[void Function(Study)] + [StudiesTable]o-[List<ModelAction<dynamic>> Function(Study)] + [StudiesTable]o-[<abstract>Widget] + [StudiesTable]o-[DashboardController] - [<abstract>SupabaseClientDependant + [StudiesTableColumn | - +supabaseClient: SupabaseClient + +index: int; + <static>+values: List<StudiesTableColumn>; + <static>+pin: StudiesTableColumn; + <static>+title: StudiesTableColumn; + <static>+status: StudiesTableColumn; + <static>+participation: StudiesTableColumn; + <static>+createdAt: StudiesTableColumn; + <static>+enrolled: StudiesTableColumn; + <static>+active: StudiesTableColumn; + <static>+completed: StudiesTableColumn; + <static>+action: StudiesTableColumn ] - [<abstract>SupabaseClientDependant]o-[SupabaseClient] + [StudiesTableColumn]o-[StudiesTableColumn] + [Enum]<:--[StudiesTableColumn] - [SupabaseQueryError + [StudiesTableItem | - +statusCode: String?; - +message: String; - +details: dynamic + +study: Study; + +itemHeight: double; + +itemPadding: double; + +rowSpacing: double; + +columnSpacing: double; + +actions: List<ModelAction<dynamic>>; + +columnSizes: List<StudiesTableColumnSize>; + +isPinned: bool; + +onPinnedChanged: void Function(Study, bool)?; + +onTap: void Function(Study)? + ] + + [StudiesTableItem]o-[Study] + [StudiesTableItem]o-[void Function(Study, bool)?] + [StudiesTableItem]o-[void Function(Study)?] + + [App ] - [Exception]<:--[SupabaseQueryError] + [AppContent + ] - [<abstract>SupabaseQueryMixin + [AccountSettingsDialog | - +dynamic deleteAll(); - +dynamic getAll(); - +dynamic getById(); - +dynamic getByColumn(); - +List<T> deserializeList(); - +T deserializeObject() + +Widget build() ] + [<abstract>ConsumerWidget]<:-[AccountSettingsDialog] + [<abstract>IInviteCodeRepository | +dynamic isCodeAlreadyUsed() @@ -3784,2753 +3992,2630 @@ [StudyRepositoryDelegate]o-[<abstract>IAuthRepository] [<abstract>IModelRepositoryDelegate]<:-[StudyRepositoryDelegate] - [<abstract>ModelEvent - | - +modelId: String; - +model: T - ] - - [IsFetched - ] - - [<abstract>ModelEvent]<:-[IsFetched] - - [IsSaving - ] - - [<abstract>ModelEvent]<:-[IsSaving] - - [IsSaved - ] - - [<abstract>ModelEvent]<:-[IsSaved] - - [IsDeleted - ] - - [<abstract>ModelEvent]<:-[IsDeleted] - - [<abstract>IUserRepository - | - +user: StudyUUser - | - +dynamic fetchUser(); - +dynamic saveUser(); - +dynamic updatePreferences() - ] - - [<abstract>IUserRepository]o-[StudyUUser] - - [UserRepository - | - +apiClient: StudyUApi; - +authRepository: IAuthRepository; - +ref: Ref<Object?>; - +user: StudyUUser + [<abstract>StudyUApi | + +dynamic saveStudy(); + +dynamic fetchStudy(); + +dynamic getUserStudies(); + +dynamic deleteStudy(); + +dynamic saveStudyInvite(); + +dynamic fetchStudyInvite(); + +dynamic deleteStudyInvite(); + +dynamic deleteParticipants(); + +dynamic fetchAppConfig(); +dynamic fetchUser(); - +dynamic saveUser(); - +dynamic updatePreferences() - ] - - [UserRepository]o-[<abstract>StudyUApi] - [UserRepository]o-[<abstract>IAuthRepository] - [UserRepository]o-[<abstract>Ref] - [UserRepository]o-[StudyUUser] - [<abstract>IUserRepository]<:--[UserRepository] - - [PreferenceAction - | - +index: int; - <static>+values: List<PreferenceAction>; - <static>+pin: PreferenceAction; - <static>+pinOff: PreferenceAction - ] - - [PreferenceAction]o-[PreferenceAction] - [Enum]<:--[PreferenceAction] - - [DropdownMenuItemTheme - | - +iconTheme: IconThemeData? - ] - - [DropdownMenuItemTheme]o-[IconThemeData] - [<abstract>Diagnosticable]<:-[DropdownMenuItemTheme] - - [ThemeConfig - | - <static>+kMinContentWidth: double; - <static>+kMaxContentWidth: double; - <static>+kHoverFadeFactor: double; - <static>+kMuteFadeFactor: double - | - <static>+dynamic bodyBackgroundColor(); - <static>+Color modalBarrierColor(); - <static>+Color containerColor(); - <static>+Color colorPickerInitialColor(); - <static>+TextStyle bodyTextMuted(); - <static>+TextStyle bodyTextBackground(); - <static>+double iconSplashRadius(); - <static>+Color sidesheetBackgroundColor(); - <static>+InputDecorationTheme dropdownInputDecorationTheme(); - <static>+DropdownMenuItemTheme dropdownMenuItemTheme() - ] - - [NoAnimationPageTransitionsBuilder - | - +Widget buildTransitions() - ] - - [<abstract>PageTransitionsBuilder]<:-[NoAnimationPageTransitionsBuilder] - - [WebTransitionBuilder - | - +Widget buildTransitions() - ] - - [<abstract>PageTransitionsBuilder]<:-[WebTransitionBuilder] - - [ThemeSettingChange - | - +settings: ThemeSettings - ] - - [ThemeSettingChange]o-[ThemeSettings] - [<abstract>Notification]<:-[ThemeSettingChange] - - [ThemeProvider - | - +settings: ValueNotifier<ThemeSettings>; - +lightDynamic: ColorScheme?; - +darkDynamic: ColorScheme?; - +pageTransitionsTheme: PageTransitionsTheme; - +shapeMedium: ShapeBorder - | - +Color custom(); - +Color blend(); - +Color source(); - +ColorScheme colors(); - +CardTheme cardTheme(); - +ListTileThemeData listTileTheme(); - +AppBarTheme appBarTheme(); - +SnackBarThemeData snackBarThemeData(); - +TabBarTheme tabBarTheme(); - +BottomAppBarTheme bottomAppBarTheme(); - +BottomNavigationBarThemeData bottomNavigationBarTheme(); - +SwitchThemeData switchTheme(); - +InputDecorationTheme inputDecorationTheme(); - +TextTheme textTheme(); - +DividerThemeData dividerTheme(); - +NavigationRailThemeData navigationRailTheme(); - +DrawerThemeData drawerTheme(); - +IconThemeData iconTheme(); - +CheckboxThemeData checkboxTheme(); - +RadioThemeData radioTheme(); - +TooltipThemeData tooltipTheme(); - +ThemeData light(); - +ThemeData dark(); - +ThemeMode themeMode(); - +ThemeData theme(); - <static>+ThemeProvider of(); - +bool updateShouldNotify() + +dynamic saveUser() ] - [ThemeProvider]o-[ValueNotifier] - [ThemeProvider]o-[ColorScheme] - [ThemeProvider]o-[PageTransitionsTheme] - [ThemeProvider]o-[<abstract>ShapeBorder] - [<abstract>InheritedWidget]<:-[ThemeProvider] - - [ThemeSettings - | - +sourceColor: Color; - +themeMode: ThemeMode + [APIException ] - [ThemeSettings]o-[Color] - [ThemeSettings]o-[ThemeMode] + [Exception]<:--[APIException] - [CustomColor - | - +name: String; - +color: Color; - +blend: bool - | - +Color value() + [StudyNotFoundException ] - [CustomColor]o-[Color] - - [StudyTemplates - | - <static>+kUnnamedStudyTitle: String - | - <static>+Study emptyDraft() - ] + [APIException]<:-[StudyNotFoundException] - [StudyActionType - | - +index: int; - <static>+values: List<StudyActionType>; - <static>+pin: StudyActionType; - <static>+pinoff: StudyActionType; - <static>+edit: StudyActionType; - <static>+duplicate: StudyActionType; - <static>+duplicateDraft: StudyActionType; - <static>+addCollaborator: StudyActionType; - <static>+export: StudyActionType; - <static>+delete: StudyActionType + [MeasurementNotFoundException ] - [StudyActionType]o-[StudyActionType] - [Enum]<:--[StudyActionType] - - [<abstract>ResultTypes - ] + [APIException]<:-[MeasurementNotFoundException] - [MeasurementResultTypes - | - <static>+questionnaire: String; - <static>+values: List<String> + [QuestionNotFoundException ] - [<abstract>ResultTypes]<:-[MeasurementResultTypes] + [APIException]<:-[QuestionNotFoundException] - [InterventionResultTypes - | - <static>+checkmarkTask: String; - <static>+values: List<String> + [ConsentItemNotFoundException ] - [<abstract>ResultTypes]<:-[InterventionResultTypes] + [APIException]<:-[ConsentItemNotFoundException] - [StudyExportData - | - +study: Study; - +measurementsData: List<Map<String, dynamic>>; - +interventionsData: List<Map<String, dynamic>>; - +isEmpty: bool + [InterventionNotFoundException ] - [StudyExportData]o-[Study] + [APIException]<:-[InterventionNotFoundException] - [CombinedStreamNotifier - | - -_subscriptions: List<StreamSubscription<dynamic>> - | - +void dispose() + [InterventionTaskNotFoundException ] - [ChangeNotifier]<:-[CombinedStreamNotifier] + [APIException]<:-[InterventionTaskNotFoundException] - [OptimisticUpdate - | - +applyOptimistic: void Function(); - +apply: dynamic Function(); - +rollback: void Function(); - +onUpdate: void Function()?; - +onError: void Function(Object, StackTrace?)?; - +rethrowErrors: bool; - +runOptimistically: bool; - +completeFutureOptimistically: bool - | - +dynamic execute(); - -void _runUpdateHandlerIfAny() + [ReportNotFoundException ] - [OptimisticUpdate]o-[void Function()] - [OptimisticUpdate]o-[dynamic Function()] - [OptimisticUpdate]o-[void Function()?] - [OptimisticUpdate]o-[void Function(Object, StackTrace?)?] + [APIException]<:-[ReportNotFoundException] - [Time - | - <static>+dynamic fromTimeOfDay(); - +Map<String, dynamic> toJson(); - <static>+Time fromJson() + [ReportSectionNotFoundException ] - [TimeOfDay]<:-[Time] + [APIException]<:-[ReportSectionNotFoundException] - [TimeValueAccessor - | - +String modelToViewValue(); - +Time? viewToModelValue(); - -String _addLeadingZeroIfNeeded() + [StudyInviteNotFoundException ] - [<abstract>ControlValueAccessor]<:-[TimeValueAccessor] + [APIException]<:-[StudyInviteNotFoundException] - [ModelAction - | - +type: T; - +label: String; - +icon: IconData?; - +onExecute: Function; - +isAvailable: bool; - +isDestructive: bool + [UserNotFoundException ] - [ModelAction]o-[IconData] + [APIException]<:-[UserNotFoundException] - [<abstract>IModelActionProvider + [StudyUApiClient | - +List<ModelAction<dynamic>> availableActions() - ] - - [<abstract>IListActionProvider + +supabaseClient: SupabaseClient; + <static>+studyColumns: List<String>; + <static>+studyWithParticipantActivityColumns: List<String>; + +testDelayMilliseconds: int | - +void onSelectItem(); - +void onNewItem() + +dynamic deleteParticipants(); + +dynamic getUserStudies(); + +dynamic fetchStudy(); + +dynamic deleteStudy(); + +dynamic saveStudy(); + +dynamic fetchStudyInvite(); + +dynamic saveStudyInvite(); + +dynamic deleteStudyInvite(); + +dynamic fetchAppConfig(); + +dynamic fetchUser(); + +dynamic saveUser(); + -dynamic _awaitGuarded(); + -dynamic _apiException(); + -dynamic _testDelay() ] - [<abstract>IModelActionProvider]<:-[<abstract>IListActionProvider] + [StudyUApiClient]o-[SupabaseClient] + [<abstract>SupabaseClientDependant]<:-[StudyUApiClient] + [<abstract>SupabaseQueryMixin]<:-[StudyUApiClient] + [<abstract>StudyUApi]<:--[StudyUApiClient] - [ModelActionType + [<abstract>IAppRepository | - +index: int; - <static>+values: List<ModelActionType>; - <static>+edit: ModelActionType; - <static>+delete: ModelActionType; - <static>+remove: ModelActionType; - <static>+duplicate: ModelActionType; - <static>+clipboard: ModelActionType; - <static>+primary: ModelActionType + +dynamic fetchAppConfig(); + +void dispose() ] - [ModelActionType]o-[ModelActionType] - [Enum]<:--[ModelActionType] - - [SerializableColor + [AppRepository | - +Map<String, dynamic> toJson(); - <static>+SerializableColor fromJson() + +apiClient: StudyUApi + | + +dynamic fetchAppConfig(); + +void dispose() ] - [Color]<:-[SerializableColor] + [AppRepository]o-[<abstract>StudyUApi] + [<abstract>IAppRepository]<:--[AppRepository] - [Tuple + [<abstract>IUserRepository | - +first: T1; - +second: T2; - +props: List<Object?> + +user: StudyUUser | - +Map<String, dynamic> toJson(); - <static>+Tuple<dynamic, dynamic> fromJson(); - +Tuple<T1, T2> copy(); - +Tuple<T1, T2> copyWith() + +dynamic fetchUser(); + +dynamic saveUser(); + +dynamic updatePreferences() ] - [<abstract>Equatable]<:-[Tuple] + [<abstract>IUserRepository]o-[StudyUUser] - [CountWhereValidator + [UserRepository | - +predicate: bool Function(T?); - +minCount: int?; - +maxCount: int?; - <static>+kValidationMessageMinCount: String; - <static>+kValidationMessageMaxCount: String + +apiClient: StudyUApi; + +authRepository: IAuthRepository; + +ref: Ref<Object?>; + +user: StudyUUser | - +Map<String, dynamic>? validate() + +dynamic fetchUser(); + +dynamic saveUser(); + +dynamic updatePreferences() ] - [CountWhereValidator]o-[bool Function(T?)] - [<abstract>Validator]<:-[CountWhereValidator] + [UserRepository]o-[<abstract>StudyUApi] + [UserRepository]o-[<abstract>IAuthRepository] + [UserRepository]o-[<abstract>Ref] + [UserRepository]o-[StudyUUser] + [<abstract>IUserRepository]<:--[UserRepository] - [Patterns + [PreferenceAction | - <static>+timeFormatString: String; - <static>+emailFormatString: String; - <static>+url: String + +index: int; + <static>+values: List<PreferenceAction>; + <static>+pin: PreferenceAction; + <static>+pinOff: PreferenceAction ] - [<abstract>ExecutionLimiter + [PreferenceAction]o-[PreferenceAction] + [Enum]<:--[PreferenceAction] + + [<abstract>IAuthRepository | - +milliseconds: int; - <static>-_timer: Timer? + +allowPasswordReset: bool; + +currentUser: User?; + +isLoggedIn: bool; + +session: Session?; + +serializedSession: String? | + +dynamic signUp(); + +dynamic signInWith(); + +dynamic signOut(); + +dynamic resetPasswordForEmail(); + +dynamic updateUser(); +void dispose() ] - [<abstract>ExecutionLimiter]o-[Timer] + [<abstract>IAuthRepository]o-[User] + [<abstract>IAuthRepository]o-[Session] + [<abstract>IAppDelegate]<:-[<abstract>IAuthRepository] - [Debouncer + [AuthRepository | - +leading: bool; - +cancelUncompleted: bool; - -_uncompletedFutureOperation: CancelableOperation<dynamic>? + +supabaseClient: SupabaseClient; + +sharedPreferences: SharedPreferences; + +allowPasswordReset: bool; + +authClient: GoTrueClient; + +session: Session?; + +serializedSession: String?; + +currentUser: User?; + +isLoggedIn: bool | - +dynamic call() + -void _registerAuthListener(); + +dynamic signUp(); + +dynamic signInWith(); + +dynamic signOut(); + +dynamic resetPasswordForEmail(); + +dynamic updateUser(); + +void dispose(); + +dynamic onAppStart() ] - [Debouncer]o-[CancelableOperation] - [<abstract>ExecutionLimiter]<:-[Debouncer] + [AuthRepository]o-[SupabaseClient] + [AuthRepository]o-[SharedPreferences] + [AuthRepository]o-[GoTrueClient] + [AuthRepository]o-[Session] + [AuthRepository]o-[User] + [<abstract>IAuthRepository]<:--[AuthRepository] - [Throttler - | - +dynamic call() + [StudyLaunched ] - [<abstract>ExecutionLimiter]<:-[Throttler] + [<abstract>ModelEvent]<:-[StudyLaunched] - [SuppressedBehaviorSubject + [<abstract>SupabaseClientDependant | - +subject: BehaviorSubject<T>; - +didSuppressInitialEvent: bool; - -_controller: StreamController<T> + +supabaseClient: SupabaseClient + ] + + [<abstract>SupabaseClientDependant]o-[SupabaseClient] + + [SupabaseQueryError | - -StreamController<T> _buildDerivedController(); - +dynamic close() + +statusCode: String?; + +message: String; + +details: dynamic ] - [SuppressedBehaviorSubject]o-[BehaviorSubject] - [SuppressedBehaviorSubject]o-[StreamController] + [Exception]<:--[SupabaseQueryError] - [<abstract>JsonFileLoader + [<abstract>SupabaseQueryMixin | - +jsonAssetsPath: String + +dynamic deleteAll(); + +dynamic getAll(); + +dynamic getById(); + +dynamic getByColumn(); + +List<T> deserializeList(); + +T deserializeObject() + ] + + [WrappedModel | - +dynamic loadJson(); - +dynamic parseJsonMapFromAssets(); - +dynamic parseJsonListFromAssets() + -_model: T; + +asyncValue: AsyncValue<T>; + +isLocalOnly: bool; + +isDirty: bool; + +isDeleted: bool; + +lastSaved: DateTime?; + +lastFetched: DateTime?; + +lastUpdated: DateTime?; + +model: T + | + +dynamic markWithError(); + +dynamic markAsLoading(); + +dynamic markAsFetched(); + +dynamic markAsSaved() ] - [<abstract>IProviderArgsResolver - | - +R provide() - ] + [WrappedModel]o-[<abstract>AsyncValue] - [NumericalRangeFormatter - | - +min: int?; - +max: int? - | - +TextEditingValue formatEditUpdate() + [ModelRepositoryException ] - [<abstract>TextInputFormatter]<:-[NumericalRangeFormatter] + [Exception]<:--[ModelRepositoryException] - [StudySequenceFormatter - | - +TextEditingValue formatEditUpdate() + [ModelNotFoundException ] - [<abstract>TextInputFormatter]<:-[StudySequenceFormatter] + [ModelRepositoryException]<:--[ModelNotFoundException] - [<abstract>FileFormatEncoder + [<abstract>IModelRepository | - +dynamic encodeAsync(); - +String encode(); - +dynamic call() + +String getKey(); + +WrappedModel<T>? get(); + +dynamic fetchAll(); + +dynamic fetch(); + +dynamic save(); + +dynamic delete(); + +dynamic duplicateAndSave(); + +dynamic duplicateAndSaveFromRemote(); + +Stream<WrappedModel<T>> watch(); + +Stream<List<WrappedModel<T>>> watchAll(); + +Stream<ModelEvent<T>> watchChanges(); + +Stream<ModelEvent<T>> watchAllChanges(); + +dynamic ensurePersisted(); + +void dispose() ] - [CSVStringEncoder + [<abstract>IModelActionProvider]<:--[<abstract>IModelRepository] + + [<abstract>IModelRepositoryDelegate | - +String encode() + +dynamic fetchAll(); + +dynamic fetch(); + +dynamic save(); + +dynamic delete(); + +T createNewInstance(); + +T createDuplicate(); + +dynamic onError() ] - [<abstract>FileFormatEncoder]<:-[CSVStringEncoder] - - [JsonStringEncoder + [<abstract>ModelRepository | - +String encode() + +delegate: IModelRepositoryDelegate<T>; + -_allModelsStreamController: BehaviorSubject<List<WrappedModel<T>>>; + -_allModelEventsStreamController: BehaviorSubject<ModelEvent<T>>; + +modelStreamControllers: Map<String, BehaviorSubject<WrappedModel<T>>>; + +modelEventsStreamControllers: Map<String, BehaviorSubject<ModelEvent<T>>>; + -_allModels: Map<String, WrappedModel<T>> + | + +WrappedModel<T>? get(); + +dynamic fetchAll(); + +dynamic fetch(); + +dynamic save(); + +dynamic delete(); + +dynamic duplicateAndSave(); + +dynamic duplicateAndSaveFromRemote(); + +Stream<List<WrappedModel<T>>> watchAll(); + +Stream<WrappedModel<T>> watch(); + +Stream<ModelEvent<T>> watchAllChanges(); + +Stream<ModelEvent<T>> watchChanges(); + -dynamic _buildModelSpecificController(); + +dynamic ensurePersisted(); + +WrappedModel<T> upsertLocally(); + +List<WrappedModel<T>> upsertAllLocally(); + +dynamic emitUpdate(); + +dynamic emitModelEvent(); + +dynamic emitError(); + +void dispose(); + +List<ModelAction<dynamic>> availableActions() ] - [<abstract>FileFormatEncoder]<:-[JsonStringEncoder] + [<abstract>ModelRepository]o-[<abstract>IModelRepositoryDelegate] + [<abstract>ModelRepository]o-[BehaviorSubject] + [<abstract>IModelRepository]<:-[<abstract>ModelRepository] - [PlatformLocaleWeb + [<abstract>ModelEvent | - +Locale getPlatformLocale() + +modelId: String; + +model: T ] - [<abstract>PlatformLocale]<:--[PlatformLocaleWeb] - - [PlatformLocaleMobile - | - +Locale getPlatformLocale() + [IsFetched ] - [<abstract>PlatformLocale]<:--[PlatformLocaleMobile] + [<abstract>ModelEvent]<:-[IsFetched] - [<abstract>PlatformLocale - | - +Locale getPlatformLocale() + [IsSaving ] - [AppTranslation - | - <static>+dynamic init() - ] + [<abstract>ModelEvent]<:-[IsSaving] - [LanguagePicker - | - +languagePickerType: LanguagePickerType; - +iconColor: Color?; - +offset: Offset? + [IsSaved ] - [LanguagePicker]o-[LanguagePickerType] - [LanguagePicker]o-[Color] - [LanguagePicker]o-[Offset] + [<abstract>ModelEvent]<:-[IsSaved] - [LanguagePickerType - | - +index: int; - <static>+values: List<LanguagePickerType>; - <static>+field: LanguagePickerType; - <static>+icon: LanguagePickerType + [IsDeleted ] - [LanguagePickerType]o-[LanguagePickerType] - [Enum]<:--[LanguagePickerType] + [<abstract>ModelEvent]<:-[IsDeleted] - + - - - - - + + + + + - + - + - + - - - + + - + + - + - + - + - + - + - - - + - + - + - - + + - + - + - - - - - - - - - - - - - - + - - - - - - - - + - + - + - + - + + + + + - + - - - - - + + + + + + - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + + - - + - + - + - - - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - + + - + + - + - + - + - - - + - + - - - + - + - + - + - + - + - + - + - + - + - + - + - - - + + - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - + - - + + + - + - + - + - + - + - - - - - + - + - + + + - + - + - + - + - + - + + + - + - + - + - + - + - + - + - + - + - + + + - + - + + + - + - + - - + + - + - + + + - + - + - + - + - + - + - + - + - + - - - + + - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - + - - + - + - + - + - + - + - + - + - + - + - + - + + + + - - - + + - + - + + + + + - + - + - + - + - + - + - + - + - + - - + + + - - + - + - - - + - + - + - + - + - + - + - + - + - + - + - + - - - - - + - + - - - - - - + + - + - - + + - + - + - + - + - - - - + - - + - + - - - - - + + - + + - + - + - + - + - + - + - + - + - + - + - + - - + + + - - + + + - + - + - - + + - + - - - + - + - - - + + + + + + + + + + + + - + + + + + + + + - + - + + + + + + + - + - - - + + + - + - + - + - + - + - + - + - - - + + + - + - + - - - - + - - - - - - + - + - + - + - + - + - + + + + + - + - - - + + + - + - - - + + - + + - + - + - + - - - - - - - + - + - + - + - + + + + + - + - + - + - - - + + + + + + + + + - + - + + + + + + + + + - - - - - - - - + - - + - + - + + + + + + + - + - + - + - + - + - + + + - + - + + + - + - + + + - + - - - - - + + + - + - + + + - + - + - + - + - + - + - - - - - - + - - + - + - + - + - - - - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - - - - - - - - - - - - - - - + - + + - + - - - + + - + + - + - + - - + + - + - + - + - + - - - - + - - + - + - + - + - + - + - + - + - + - + - + - + - - - + + + + - + + - + - + - + - + - + - + - + - + + + - + - - - + - + - + - - + + - + - - - + + + - + - + - + - + - + - + - + - + - + - + - - + + - + - + + + + + + - - + - + - - + + - + - - + + + + - + - + + + - + - + - + - + - + - + - + - + - + - + - + - - - + - + - + - + - + + + + + + + + + - + - + + + - + - + - + - - - + - + - + - + - + - + - + - + - - - + - + - + - - - - - - + - - - - - - - - - - + + + + + - + - + - + - - + + + + - + - - + + - + - - + + + - - - - - - + - + - - - + - + - - - + - + - + - + + + + + - + - - + + - + - + - + - - - + - + - - - + - + - - - + - + - + - + - + + + - + - + - + - + - + - - - - + + + - - + + + + + - + - + + + - + - - + + + - - - + + + - - - + + + - - + - + - - + + + - - + + + + + + + + + - + - - - + - + - + + + - + - + + + + + - + - + - + - + - + - + - + - + - + - - + + + + - + - + - + - + - + - - + + - - - - + - - + - + - - - + + + + + - + - + - + - - - + + + - + - + - - - - + + - + - + - + - - - + + - - - - - - - + + - + - + - + - + - + - + - + - + - + - - - - + + - + - + - + - + - + + + + + + + + + + + + + + + + + + + + + + - - - - + - + - + - + - + - + - + - + - + - - + + - + - + + + + + - + - - - + + + - + - + - + - - - + - + - - - - + + + + + + + + + + + + + - - - - - - + - + - + - + - + - + - + - + - + - + + + + + + + + + + - + + - + - + - + - - - - - + - + - + - + - + - - + + - + - + - + - + + + + + + - - + - + - + - - + + - + - + - + - + - + - + + + + + - + - - - + + - - + - + - + - + - + - + + + + + + - - + - + - - - + + + - + - - - + + + - + - + - + - + - + - - - - - - + + + + + + - + - + - + - + - + - - + + + + - + - - + + + + + + + + + + + - - - - - - - - + - + + + + + + + - + - + - + + + + + + + + + + + + + + + + - - + - + - + + + + + - + - + + + + + - + - - - + - + - + - + + + + - + + - + + + + + + - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + + + - + - + - + - + - + + + + + + - - + - + + + + + - + - - - - + + + - - - + + - + - + - + - + - + - - - + - + - - - + - + - - - + - + - + - + - + - + - + - + - + - + + + - + - - + + - + - + - + - - - - - + + - - - + + + - - - - - + + + - + + - + - - - + + - + + + + + + - + - + + + - + - + + + - + - - - - + + + + + - - + - - + + - + - + - + - - + + + + + - - - + + + + + - - - + + + - - + - + - + - + - - - + - + + + - + - - + + - + - + - + - - - - - + + - + + - + - + + + - + - + - + - + + + - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + - - + - + - - + + + - - - + + + - - - + + + - - + - + - + - + - - - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - - - + - - + + - + - + - + - + - + - - + + - + - - + + - + - + - + - + - + - + - + - - + + + + + + - + - - + + - + - + - + - - - - - - - - - - - + - + - - - + + + + - + + - + - + - + - + - + - - - - - + - + + + - + - - + + - + - - - - - - - + - + - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + - + - - - + + - + + - + - - - + - + - + - + - + - + - + - + - + - - - - - - + + - + - - - - - + + - + + - + - + - + - + + + - + - - - - - + - + - - - + - - - - + - - - - - - + - + - - - + - + - - - + + - - - - - + + + + - + + + + - + + - + - - - - - - - - - + - + - - - - - - + - - - + + + - + + - + - + - - - - + - + + + + + + + + + + - - + + - + Config - + <static>+isDebugMode: bool <static>+defaultLocale: Set<String> @@ -6543,687 +6628,495 @@ - - - - - - - - RoutingIntents - - - - - - <static>+root: RoutingIntent - <static>+studies: RoutingIntent - <static>+studiesShared: RoutingIntent - <static>+publicRegistry: RoutingIntent - <static>+study: RoutingIntent Function(String) - <static>+studyEdit: RoutingIntent Function(String) - <static>+studyEditInfo: RoutingIntent Function(String) - <static>+studyEditEnrollment: RoutingIntent Function(String) - <static>+studyEditInterventions: RoutingIntent Function(String) - <static>+studyEditIntervention: RoutingIntent Function(String, String) - <static>+studyEditMeasurements: RoutingIntent Function(String) - <static>+studyEditReports: RoutingIntent Function(String) - <static>+studyEditMeasurement: RoutingIntent Function(String, String) - <static>+studyTest: RoutingIntent Function(String, {String? appRoute}) - <static>+studyRecruit: RoutingIntent Function(String) - <static>+studyMonitor: RoutingIntent Function(String) - <static>+studyAnalyze: RoutingIntent Function(String) - <static>+studySettings: RoutingIntent Function(String) - <static>+accountSettings: RoutingIntent - <static>+studyNew: RoutingIntent - <static>+login: RoutingIntent - <static>+signup: RoutingIntent - <static>+passwordForgot: RoutingIntent - <static>+passwordForgot2: RoutingIntent Function(String) - <static>+passwordRecovery: RoutingIntent - <static>+error: RoutingIntent Function(Exception) - - - - - - - - - - - - - RoutingIntent - - - - - - +route: GoRoute - +params: Map<String, String> - +queryParams: Map<String, String> - +dispatch: RoutingIntentDispatch? - +extra: Object? - +routeName: String - +arguments: Map<String, String> - +props: List<Object?> - - - - - - -dynamic _validateRoute() - +bool matches() - - - - - - - - - - - RoutingIntent Function(String) - - - - - - - - - - - RoutingIntent Function(String, String) - - - - - - - - - - - RoutingIntent Function(String, {String? appRoute}) - - - - - - - - - - - RoutingIntent Function(Exception) - - - - - - - - - - - GoRoute - - - - - - - - - - - - RoutingIntentDispatch - - - - - - +index: int - <static>+values: List<RoutingIntentDispatch> - <static>+go: RoutingIntentDispatch - <static>+push: RoutingIntentDispatch - - - - - - - - - - - Equatable - - - - - - - - - - - Enum - - - - - - - - - - - - GoRouteParamEnum - - + + + - - - +String toRouteParam() - +String toShortString() + + + ResultTypes - - - - - - - - RouterKeys - - + + + + - - - <static>+studyKey: ValueKey<String> - <static>+authKey: ValueKey<String> + + + MeasurementResultTypes - - - - - - - - ValueKey + + + <static>+questionnaire: String + <static>+values: List<String> - - - - + + + + - - - RouteParams + + + InterventionResultTypes - - - - - <static>+studiesFilter: String - <static>+studyId: String - <static>+measurementId: String - <static>+interventionId: String - <static>+testAppRoute: String + + + + + <static>+checkmarkTask: String + <static>+values: List<String> - - - - - + + + + - - - RouterConf + + + StudyExportData - - - <static>+router: GoRouter - <static>+routes: List<GoRoute> - <static>+publicRoutes: List<GoRoute> - <static>+privateRoutes: List<GoRoute> + + + +study: Study + +measurementsData: List<Map<String, dynamic>> + +interventionsData: List<Map<String, dynamic>> + +isEmpty: bool - - - <static>+GoRoute route() + + + + + + + + Study - - - + + + + + - - - GoRouter + + + StudyTemplates - - - - - - - - - StudyFormRouteArgs + + + <static>+kUnnamedStudyTitle: String - - - +studyId: String + + + <static>+Study emptyDraft() - - - - + + + + - - - QuestionFormRouteArgs + + + StudyActionType - - - +questionId: String + + + +index: int + <static>+values: List<StudyActionType> + <static>+pin: StudyActionType + <static>+pinoff: StudyActionType + <static>+edit: StudyActionType + <static>+duplicate: StudyActionType + <static>+duplicateDraft: StudyActionType + <static>+addCollaborator: StudyActionType + <static>+export: StudyActionType + <static>+delete: StudyActionType - - - + + + - - - ScreenerQuestionFormRouteArgs + + + Enum - - - - + + + + - - - ConsentItemFormRouteArgs + + + Notifications - - - +consentId: String + + + <static>+credentialsInvalid: SnackbarIntent + <static>+userAlreadyRegistered: SnackbarIntent + <static>+passwordReset: SnackbarIntent + <static>+passwordResetSuccess: SnackbarIntent + <static>+studyDeleted: SnackbarIntent + <static>+inviteCodeDeleted: SnackbarIntent + <static>+inviteCodeClipped: SnackbarIntent + <static>+studyDeleteConfirmation: AlertIntent - - - - + + + + - - - MeasurementFormRouteArgs + + + SnackbarIntent - - - +measurementId: String + + + +duration: int? - - - - + + + + - - - SurveyQuestionFormRouteArgs + + + AlertIntent - - - +questionId: String + + + +title: String + +dismissOnAction: bool + +isDestructive: dynamic - - - - + + + + - - - InterventionFormRouteArgs + + + NotificationDefaultActions - - - +interventionId: String + + + <static>+cancel: NotificationAction - - - - + + + + - - - InterventionTaskFormRouteArgs + + + NotificationAction - - - +taskId: String + + + +label: String + +onSelect: dynamic Function() + +isDestructive: bool - - - - + + + + - - - ReportItemFormRouteArgs + + + INotificationService - - - +sectionId: String + + + +void showMessage() + +void show() + +Stream<NotificationIntent> watchNotifications() + +void dispose() - - - - - - - - ISyncIndicatorViewModel - - + + + + + - - - +isDirty: bool - +lastSynced: DateTime? + + + NotificationService - - - - - - - - - SyncIndicator + + + -_streamController: BehaviorSubject<NotificationIntent> - - - +state: AsyncValue<T> - +lastSynced: DateTime? - +isDirty: bool - +animationDuration: int - +iconSize: double + + + +Stream<NotificationIntent> watchNotifications() + +void showMessage() + +void show() + +void dispose() - - - + + + - - - AsyncValue + + + BehaviorSubject - - - - - - - - - EmptyBody - - + + + + + - - - +icon: IconData? - +leading: Widget? - +leadingSpacing: double? - +title: String? - +description: String? - +button: Widget? + + + NotificationIntent - - - +Widget build() + + + +message: String? + +customContent: Widget? + +icon: IconData? + +actions: List<NotificationAction>? + +type: NotificationType - - - - - - - - IconData + + + +void register() - + - + Widget - - - - - - - NullHelperDecoration - - - - - - - + + + - - - InputDecoration + + + IconData - - - - + + + + - - - Search + + + NotificationType - - - +onQueryChanged: dynamic Function(String) - +searchController: SearchController? - +hintText: String? - +initialText: String? + + + +index: int + <static>+values: List<NotificationType> + <static>+snackbar: NotificationType + <static>+alert: NotificationType + <static>+custom: NotificationType - - - + + + - - - dynamic Function(String) + + + dynamic Function() - - - - + + + + - - - SearchController + + + IClipboardService - - - +setText: void Function(String) + + + +dynamic copy() - - - + + + + - - - void Function(String) + + + ClipboardService + + + + + + +dynamic copy() - - - - - + + + + - - - ConstrainedWidthFlexible + + + NotificationDispatcher - - - +minWidth: double - +maxWidth: double - +flex: int - +flexSum: int - +child: Widget - +outerConstraints: BoxConstraints + + + +child: Widget? + +snackbarInnerPadding: double + +snackbarWidth: double? + +snackbarBehavior: SnackBarBehavior + +snackbarDefaultDuration: int - - - +Widget build() - -double _getWidth() + + + + + + + + SnackBarBehavior - - - + + + + - - - BoxConstraints + + + Assets + + + + + + <static>+logoWide: String - - - + + + - + AsyncValueWidget - + +value: AsyncValue<T> +data: Widget Function(T) @@ -7233,7 +7126,7 @@ - + +Widget build() -Widget _buildDataOrEmptyWidget() @@ -7243,11 +7136,22 @@ + + + + + + + AsyncValue + + + + - + - + Widget Function(T) @@ -7256,9 +7160,9 @@ - + - + Widget Function(Object, StackTrace?)? @@ -7267,778 +7171,662 @@ - + - + Widget Function()? - - - - - - - - - ActionPopUpMenuButton - - - - - - +actions: List<ModelAction<dynamic>> - +triggerIconColor: Color? - +triggerIconColorHover: Color? - +triggerIconSize: double - +disableSplashEffect: bool - +hideOnEmpty: bool - +orientation: Axis - +elevation: double? - +splashRadius: double? - +enabled: bool - +position: PopupMenuPosition - - - - - - +Widget build() - -Widget _buildPopupMenu() - - - - - - - - - - - Color - - - - - - - - - - - Axis - - - - - - - - - - - PopupMenuPosition - - - - - - - - - - - - PrimaryButton - - - - - - +text: String - +icon: IconData? - +isLoading: bool - +showLoadingEarliestAfterMs: int - +onPressed: void Function()? - +tooltip: String - +tooltipDisabled: String - +enabled: bool - +onPressedFuture: dynamic Function()? - +innerPadding: EdgeInsets - +minimumSize: Size? - +isDisabled: bool - - - - - - - - - - - void Function()? - - - - - - - + + + + + - - - dynamic Function()? + + + FormControlLabel - - - - - - - - EdgeInsets + + + +formControl: AbstractControl<dynamic> + +text: String + +isClickable: bool + +textStyle: TextStyle? + +onClick: void Function(AbstractControl<dynamic>)? - - - - - - - - Size + + + +Widget build() - - - - - - - - Hyperlink - - + + + - - - +text: String - +url: String? - +onClick: void Function()? - +linkColor: Color - +hoverColor: Color? - +visitedColor: Color? - +style: TextStyle? - +hoverStyle: TextStyle? - +visitedStyle: TextStyle? - +icon: IconData? - +iconSize: double? + + + AbstractControl - + - + TextStyle - - - - - + + + - - - DismissButton + + + void Function(AbstractControl<dynamic>)? - - - +onPressed: void Function()? - +text: String? + + + + + + + + + + ActionPopUpMenuButton - - - +Widget build() + + + +actions: List<ModelAction<dynamic>> + +triggerIconColor: Color? + +triggerIconColorHover: Color? + +triggerIconSize: double + +disableSplashEffect: bool + +hideOnEmpty: bool + +orientation: Axis + +elevation: double? + +splashRadius: double? + +enabled: bool + +position: PopupMenuPosition - - - - - - - - - FormTableRow + + + +Widget build() + -Widget _buildPopupMenu() - - - +label: String? - +labelBuilder: Widget Function(BuildContext)? - +labelStyle: TextStyle? - +labelHelpText: String? - +input: Widget - +control: AbstractControl<dynamic>? - +layout: FormTableRowLayout? + + + + + + + + Color - - - + + + - - - Widget Function(BuildContext)? + + + Axis - - - + + + - - - AbstractControl + + + PopupMenuPosition - - - - + + + + - - - FormTableRowLayout + + + Search - - - +index: int - <static>+values: List<FormTableRowLayout> - <static>+vertical: FormTableRowLayout - <static>+horizontal: FormTableRowLayout + + + +onQueryChanged: dynamic Function(String) + +searchController: SearchController? + +hintText: String? + +initialText: String? - - - - - + + + - - - FormTableLayout + + + dynamic Function(String) - - - +rows: List<FormTableRow> - +columnWidths: Map<int, TableColumnWidth> - +rowDivider: Widget? - +rowLayout: FormTableRowLayout? - +rowLabelStyle: TextStyle? + + + + + + + + + SearchController - - - +Widget build() + + + +setText: void Function(String) - - - - - + + + - - - FormSectionHeader + + + void Function(String) - - - +title: String - +titleTextStyle: TextStyle? - +helpText: String? - +divider: bool - +helpTextDisabled: bool + + + + + + + + + FormScaffold - - - +Widget build() + + + +formViewModel: T + +actions: List<Widget>? + +body: Widget + +drawer: Widget? + +actionsSpacing: double + +actionsPadding: double - - - - - + + + + + - - - FormLabel + + + ConstrainedWidthFlexible - - - +labelText: String? - +helpText: String? - +labelTextStyle: TextStyle? - +layout: FormTableRowLayout? + + + +minWidth: double + +maxWidth: double + +flex: int + +flexSum: int + +child: Widget + +outerConstraints: BoxConstraints - - - +Widget build() + + + +Widget build() + -double _getWidth() - - - - - - - - ActionMenuType - - + + + - - - +index: int - <static>+values: List<ActionMenuType> - <static>+inline: ActionMenuType - <static>+popup: ActionMenuType + + + BoxConstraints - - - + + + + - - - ReactiveCustomColorPicker + + + PrimaryButton - - - - - - - - ReactiveFormField + + + +text: String + +icon: IconData? + +isLoading: bool + +showLoadingEarliestAfterMs: int + +onPressed: void Function()? + +tooltip: String + +tooltipDisabled: String + +enabled: bool + +onPressedFuture: dynamic Function()? + +innerPadding: EdgeInsets + +minimumSize: Size? + +isDisabled: bool - - - - + + + - - - NavbarTab + + + void Function()? - - - +title: String - +intent: RoutingIntent? - +index: int - +enabled: bool + + + + + + + + dynamic Function()? - - - - + + + - - - TabbedNavbar + + + EdgeInsets - - - +tabs: List<T> - +selectedTab: T? - +indicator: BoxDecoration? - +height: double? - +disabledBackgroundColor: Color? - +disabledTooltipText: String? - +onSelect: void Function(int, T)? - +labelPadding: EdgeInsets? - +labelSpacing: double? - +indicatorSize: TabBarIndicatorSize? - +isScrollable: bool - +backgroundColor: Color? - +labelColorHover: Color? - +unselectedLabelColorHover: Color? + + + + + + + + Size - - - + + + + - - - BoxDecoration + + + FormTableRow - - - - - - - - void Function(int, T)? + + + +label: String? + +labelBuilder: Widget Function(BuildContext)? + +labelStyle: TextStyle? + +labelHelpText: String? + +input: Widget + +control: AbstractControl<dynamic>? + +layout: FormTableRowLayout? - - - + + + - - - TabBarIndicatorSize + + + Widget Function(BuildContext)? - - - - + + + + - - - Collapsible + + + FormTableRowLayout - - - +contentBuilder: Widget Function(BuildContext, bool) - +headerBuilder: Widget Function(BuildContext, bool)? - +title: String? - +isCollapsed: bool + + + +index: int + <static>+values: List<FormTableRowLayout> + <static>+vertical: FormTableRowLayout + <static>+horizontal: FormTableRowLayout - - - + + + + + - - - Widget Function(BuildContext, bool) + + + FormTableLayout - - - - + + + +rows: List<FormTableRow> + +columnWidths: Map<int, TableColumnWidth> + +rowDivider: Widget? + +rowLayout: FormTableRowLayout? + +rowLabelStyle: TextStyle? + + - - - Widget Function(BuildContext, bool)? + + + +Widget build() - - - - - + + + + + - - - StudyULogo + + + FormSectionHeader - - - +onTap: void Function()? + + + +title: String + +titleTextStyle: TextStyle? + +helpText: String? + +divider: bool + +helpTextDisabled: bool - - - +Widget build() + + + +Widget build() - - - - - - - - FormSideSheetTab - - + + + + + - - - +formViewBuilder: Widget Function(T) + + + FormLabel - - - - - - - - - SidesheetTab + + + +labelText: String? + +helpText: String? + +labelTextStyle: TextStyle? + +layout: FormTableRowLayout? - - - +builder: Widget Function(BuildContext) + + + +Widget build() - - - + + + + + - - - Widget Function(BuildContext) + + + DismissButton - - - - - - - - - Sidesheet + + + +onPressed: void Function()? + +text: String? - - - <static>+kDefaultWidth: double - +titleText: String - +body: Widget? - +tabs: List<SidesheetTab>? - +actionButtons: List<Widget>? - +width: double? - +withCloseButton: bool - +ignoreAppBar: bool - +collapseSingleTab: bool - +bodyPadding: EdgeInsets? - +wrapContent: Widget Function(Widget)? + + + +Widget build() - - - + + + + + - - - Widget Function(Widget)? + + + Badge - - - - - - - - - MouseEventsRegion + + + +icon: IconData? + +color: Color? + +borderRadius: double + +label: String + +type: BadgeType + +padding: EdgeInsets + +iconSize: double? + +labelStyle: TextStyle? + +center: bool - - - +onTap: void Function()? - +onHover: void Function(PointerHoverEvent)? - +onEnter: void Function(PointerEnterEvent)? - +onExit: void Function(PointerExitEvent)? - +autoselectCursor: bool - +cursor: SystemMouseCursor - <static>+defaultCursor: SystemMouseCursor - +autoCursor: SystemMouseCursor + + + +Widget build() + -Color? _getBackgroundColor() + -Color _getBorderColor() + -Color? _getLabelColor() - - - + + + + - - - void Function(PointerHoverEvent)? + + + BadgeType - - - - - - - - void Function(PointerEnterEvent)? + + + +index: int + <static>+values: List<BadgeType> + <static>+filled: BadgeType + <static>+outlined: BadgeType + <static>+outlineFill: BadgeType + <static>+plain: BadgeType - - - + + + + + - - - void Function(PointerExitEvent)? + + + StandardDialog - - - - + + + +title: Widget? + +titleText: String? + +body: Widget + +actionButtons: List<Widget> + +backgroundColor: Color? + +borderRadius: double? + +width: double? + +height: double? + +minWidth: double + +minHeight: double + +maxWidth: double? + +maxHeight: double? + +padding: EdgeInsets + + - - - SystemMouseCursor + + + +Widget build() - - - - - + + + + - - - FormControlLabel + + + ISyncIndicatorViewModel - - - +formControl: AbstractControl<dynamic> - +text: String - +isClickable: bool - +textStyle: TextStyle? - +onClick: void Function(AbstractControl<dynamic>)? + + + +isDirty: bool + +lastSynced: DateTime? - - - +Widget build() + + + + + + + + + SyncIndicator - - - - - - - - void Function(AbstractControl<dynamic>)? + + + +state: AsyncValue<T> + +lastSynced: DateTime? + +isDirty: bool + +animationDuration: int + +iconSize: double - - + + - + IWithBanner - + +Widget? banner() @@ -8047,16 +7835,16 @@ - - + + - + BannerBox - + +prefixIcon: Widget? +body: Widget @@ -8073,16 +7861,16 @@ - - + + - + BannerStyle - + +index: int <static>+values: List<BannerStyle> @@ -8093,654 +7881,642 @@ - - - - - + + + + + - - - SecondaryButton + + + ActionMenuInline - - - +text: String - +icon: IconData? - +isLoading: bool - +onPressed: void Function()? + + + +actions: List<ModelAction<dynamic>> + +iconSize: double? + +visible: bool + +splashRadius: double? + +paddingVertical: double? + +paddingHorizontal: double? - - - +Widget build() + + + +Widget build() - - - - - - - - - IconPack - - + + + + - - - <static>+defaultPack: List<IconOption> - <static>+material: List<IconOption> + + + Collapsible - - - <static>+IconOption? resolveIconByName() + + + +contentBuilder: Widget Function(BuildContext, bool) + +headerBuilder: Widget Function(BuildContext, bool)? + +title: String? + +isCollapsed: bool - - - - - + + + - - - IconOption + + + Widget Function(BuildContext, bool) - - - +name: String - +icon: IconData? - +isEmpty: bool - +props: List<Object?> - - + + + + - - - +String toJson() - <static>+IconOption fromJson() + + + Widget Function(BuildContext, bool)? - - - + + + + - - - ReactiveIconPicker + + + NavbarTab - - - - - - - - ReactiveFocusableFormField + + + +title: String + +intent: RoutingIntent? + +index: int + +enabled: bool - - - - - + + + + + - - - IconPicker + + + RoutingIntent - - - +iconOptions: List<IconOption> - +selectedOption: IconOption? - +onSelect: void Function(IconOption)? - +galleryIconSize: double? - +selectedIconSize: double? - +focusNode: FocusNode? - +isDisabled: bool + + + +route: GoRoute + +params: Map<String, String> + +queryParams: Map<String, String> + +dispatch: RoutingIntentDispatch? + +extra: Object? + +routeName: String + +arguments: Map<String, String> + +props: List<Object?> - - - +Widget build() + + + -dynamic _validateRoute() + +bool matches() - - - + + + + - - - void Function(IconOption)? + + + TabbedNavbar - - - - - - - - FocusNode + + + +tabs: List<T> + +selectedTab: T? + +indicator: BoxDecoration? + +height: double? + +disabledBackgroundColor: Color? + +disabledTooltipText: String? + +onSelect: void Function(int, T)? + +labelPadding: EdgeInsets? + +labelSpacing: double? + +indicatorSize: TabBarIndicatorSize? + +isScrollable: bool + +backgroundColor: Color? + +labelColorHover: Color? + +unselectedLabelColorHover: Color? - - - - - - - - - IconPickerField - - - - - - +iconOptions: List<IconOption> - +selectedOption: IconOption? - +selectedIconSize: double? - +galleryIconSize: double? - +onSelect: void Function(IconOption)? - +focusNode: FocusNode? - +isDisabled: bool - - + + + - - - +Widget build() + + + BoxDecoration - - - - - + + + - - - IconPickerGallery + + + void Function(int, T)? - - - +iconOptions: List<IconOption> - +onSelect: void Function(IconOption)? - +iconSize: double - - + + + + - - - +Widget build() + + + TabBarIndicatorSize - - - - - + + + + - - - SingleColumnLayout + + + SidesheetTab - - - <static>+defaultConstraints: BoxConstraints - <static>+defaultConstraintsNarrow: BoxConstraints - +body: Widget - +header: Widget? - +stickyHeader: bool - +constraints: BoxConstraints? - +scroll: bool - +padding: EdgeInsets? + + + +builder: Widget Function(BuildContext) - - - <static>+dynamic fromType() + + + + + + + + Widget Function(BuildContext) - - - - + + + + - - - SingleColumnLayoutType + + + Sidesheet - - - +index: int - <static>+values: List<SingleColumnLayoutType> - <static>+boundedWide: SingleColumnLayoutType - <static>+boundedNarrow: SingleColumnLayoutType - <static>+stretched: SingleColumnLayoutType - <static>+split: SingleColumnLayoutType + + + <static>+kDefaultWidth: double + +titleText: String + +body: Widget? + +tabs: List<SidesheetTab>? + +actionButtons: List<Widget>? + +width: double? + +withCloseButton: bool + +ignoreAppBar: bool + +collapseSingleTab: bool + +bodyPadding: EdgeInsets? + +wrapContent: Widget Function(Widget)? - - - - - - - - FormConsumerWidget - - + + + - - - +Widget build() + + + Widget Function(Widget)? - - - - + + + + - - - FormConsumerRefWidget + + + FormSideSheetTab - - - +Widget build() + + + +formViewBuilder: Widget Function(T) - - - - + + + + + - - - FormScaffold + + + HelpIcon - - - +formViewModel: T - +actions: List<Widget>? - +body: Widget - +drawer: Widget? - +actionsSpacing: double - +actionsPadding: double + + + +tooltipText: String? + + + + + + +Widget build() - - - - - + + + + + - - - StandardDialog + + + EmptyBody - - - +title: Widget? - +titleText: String? - +body: Widget - +actionButtons: List<Widget> - +backgroundColor: Color? - +borderRadius: double? - +width: double? - +height: double? - +minWidth: double - +minHeight: double - +maxWidth: double? - +maxHeight: double? - +padding: EdgeInsets + + + +icon: IconData? + +leading: Widget? + +leadingSpacing: double? + +title: String? + +description: String? + +button: Widget? - - - +Widget build() + + + +Widget build() - - - - - + + + + + - - - HtmlStylingBanner + + + IndicatorRangeSliderThumbShape - - - +isDismissed: bool - +onDismissed: dynamic Function()? + + + +buildContext: BuildContext + +start: T + +end: T - - - +Widget build() + + + +Size getPreferredSize() + +void paint() - - - - + + + - - - StandardTableColumn + + + BuildContext - - - +label: String - +tooltip: String? - +columnWidth: TableColumnWidth - +sortable: bool - +sortAscending: bool? - +sortableIcon: Widget? + + + + + + + + RangeSliderThumbShape - - - + + + + - - - TableColumnWidth + + + MouseEventsRegion + + + + + + +onTap: void Function()? + +onHover: void Function(PointerHoverEvent)? + +onEnter: void Function(PointerEnterEvent)? + +onExit: void Function(PointerExitEvent)? + +autoselectCursor: bool + +cursor: SystemMouseCursor + <static>+defaultCursor: SystemMouseCursor + +autoCursor: SystemMouseCursor - - - - + + + - - - StandardTable + + + void Function(PointerHoverEvent)? - - - +items: List<T> - +inputColumns: List<StandardTableColumn> - +onSelectItem: void Function(T) - +trailingActionsAt: List<ModelAction<dynamic>> Function(T, int)? - +trailingActionsMenuType: ActionMenuType? - +sortColumnPredicates: List<int Function(T, T)?>? - +pinnedPredicates: int Function(T, T)? - +headerRowBuilder: TableRow Function(BuildContext, List<StandardTableColumn>)? - +dataRowBuilder: TableRow Function(BuildContext, List<StandardTableColumn>)? - +inputTrailingActionsColumn: StandardTableColumn - +tableWrapper: Widget Function(Widget)? - +cellSpacing: double - +rowSpacing: double - +minRowHeight: double? - +showTableHeader: bool - +hideLeadingTrailingWhenEmpty: bool - +leadingWidget: Widget? - +trailingWidget: Widget? - +leadingWidgetSpacing: double? - +trailingWidgetSpacing: double? - +emptyWidget: Widget? - +rowStyle: StandardTableStyle - +disableRowInteractions: bool + + + + + + + + void Function(PointerEnterEvent)? - - - + + + - - - void Function(T) + + + void Function(PointerExitEvent)? - - - + + + - - - List<ModelAction<dynamic>> Function(T, int)? + + + SystemMouseCursor - - - + + + - - - int Function(T, T)? + + + ReactiveCustomColorPicker - - - + + + - - - TableRow Function(BuildContext, List<StandardTableColumn>)? + + + ReactiveFormField - - - - + + + + + - - - StandardTableStyle + + + TextParagraph - - - +index: int - <static>+values: List<StandardTableStyle> - <static>+plain: StandardTableStyle - <static>+material: StandardTableStyle + + + +text: String? + +style: TextStyle? + +selectable: bool + +span: List<TextSpan>? + + + + + + +Widget build() - - - - + + + + - - - TwoColumnLayout + + + UnderConstruction - - - <static>+defaultDivider: VerticalDivider - <static>+defaultContentPadding: EdgeInsets - <static>+slimContentPadding: EdgeInsets - +leftWidget: Widget - +rightWidget: Widget - +dividerWidget: Widget? - +headerWidget: Widget? - +flexLeft: int? - +flexRight: int? - +constraintsLeft: BoxConstraints? - +constraintsRight: BoxConstraints? - +scrollLeft: bool - +scrollRight: bool - +paddingLeft: EdgeInsets? - +paddingRight: EdgeInsets? - +backgroundColorLeft: Color? - +backgroundColorRight: Color? - +stretchHeight: bool + + + +Widget build() - - - + + + - - - VerticalDivider + + + NullHelperDecoration - - - - - + + + - - - ActionMenuInline + + + InputDecoration - - - +actions: List<ModelAction<dynamic>> - +iconSize: double? - +visible: bool - +splashRadius: double? - +paddingVertical: double? - +paddingHorizontal: double? + + + + + + + + + ActionMenuType - - - +Widget build() + + + +index: int + <static>+values: List<ActionMenuType> + <static>+inline: ActionMenuType + <static>+popup: ActionMenuType - - - - - + + + + + - - - TextParagraph + + + HtmlStylingBanner - - - +text: String? - +style: TextStyle? - +selectable: bool - +span: List<TextSpan>? + + + +isDismissed: bool + +onDismissed: dynamic Function()? - - - +Widget build() + + + +Widget build() + + + + + + + + + + + + FormConsumerWidget + + + + + + +Widget build() + + + + + + + + + + + + FormConsumerRefWidget + + + + + + +Widget build() - - + + - + SplashPage - + +Widget build() @@ -8749,23 +8525,23 @@ - - - + + + - + ErrorPage - + +error: Exception? - + +Widget build() @@ -8774,4967 +8550,5013 @@ - + - + ConsumerWidget - - - - - + + + + + - - - Badge + + + StudyULogo - - - +icon: IconData? - +color: Color? - +borderRadius: double - +label: String - +type: BadgeType - +padding: EdgeInsets - +iconSize: double? - +labelStyle: TextStyle? - +center: bool + + + +onTap: void Function()? - - - +Widget build() - -Color? _getBackgroundColor() - -Color _getBorderColor() - -Color? _getLabelColor() + + + +Widget build() - - - - + + + + + - - - BadgeType + + + SingleColumnLayout - - - +index: int - <static>+values: List<BadgeType> - <static>+filled: BadgeType - <static>+outlined: BadgeType - <static>+outlineFill: BadgeType - <static>+plain: BadgeType + + + <static>+defaultConstraints: BoxConstraints + <static>+defaultConstraintsNarrow: BoxConstraints + +body: Widget + +header: Widget? + +stickyHeader: bool + +constraints: BoxConstraints? + +scroll: bool + +padding: EdgeInsets? + + + + + + <static>+dynamic fromType() - - - - - + + + + - - - IndicatorRangeSliderThumbShape + + + SingleColumnLayoutType - - - +buildContext: BuildContext - +start: T - +end: T + + + +index: int + <static>+values: List<SingleColumnLayoutType> + <static>+boundedWide: SingleColumnLayoutType + <static>+boundedNarrow: SingleColumnLayoutType + <static>+stretched: SingleColumnLayoutType + <static>+split: SingleColumnLayoutType - - - +Size getPreferredSize() - +void paint() + + + + + + + + + Hyperlink + + + + + + +text: String + +url: String? + +onClick: void Function()? + +linkColor: Color + +hoverColor: Color? + +visitedColor: Color? + +style: TextStyle? + +hoverStyle: TextStyle? + +visitedStyle: TextStyle? + +icon: IconData? + +iconSize: double? - - - + + + + - - - BuildContext + + + StandardTableColumn + + + + + + +label: String + +tooltip: String? + +columnWidth: TableColumnWidth + +sortable: bool + +sortAscending: bool? + +sortableIcon: Widget? - - - + + + - - - RangeSliderThumbShape + + + TableColumnWidth - - - - - + + + + - - - HelpIcon + + + StandardTable + + + + + + +items: List<T> + +inputColumns: List<StandardTableColumn> + +onSelectItem: void Function(T) + +trailingActionsAt: List<ModelAction<dynamic>> Function(T, int)? + +trailingActionsMenuType: ActionMenuType? + +sortColumnPredicates: List<int Function(T, T)?>? + +pinnedPredicates: int Function(T, T)? + +headerRowBuilder: TableRow Function(BuildContext, List<StandardTableColumn>)? + +dataRowBuilder: TableRow Function(BuildContext, List<StandardTableColumn>)? + +inputTrailingActionsColumn: StandardTableColumn + +tableWrapper: Widget Function(Widget)? + +cellSpacing: double + +rowSpacing: double + +minRowHeight: double? + +headerMaxLines: int + +showTableHeader: bool + +hideLeadingTrailingWhenEmpty: bool + +leadingWidget: Widget? + +trailingWidget: Widget? + +leadingWidgetSpacing: double? + +trailingWidgetSpacing: double? + +emptyWidget: Widget? + +rowStyle: StandardTableStyle + +disableRowInteractions: bool + + + + + + + + + + + void Function(T) + + + + + + + + + + + List<ModelAction<dynamic>> Function(T, int)? - - - +tooltipText: String? + + + + + + + + int Function(T, T)? - - - +Widget build() + + + + + + + + TableRow Function(BuildContext, List<StandardTableColumn>)? - - - - + + + + - - - UnderConstruction + + + StandardTableStyle - - - +Widget build() + + + +index: int + <static>+values: List<StandardTableStyle> + <static>+plain: StandardTableStyle + <static>+material: StandardTableStyle - - - - + + + + + - - - NotificationDispatcher + + + IconPack - - - +child: Widget? - +snackbarInnerPadding: double - +snackbarWidth: double? - +snackbarBehavior: SnackBarBehavior - +snackbarDefaultDuration: int + + + <static>+defaultPack: List<IconOption> + <static>+material: List<IconOption> - - - - - - - - SnackBarBehavior + + + <static>+IconOption? resolveIconByName() - - - - - + + + + + - - - NotificationIntent + + + IconOption - - - +message: String? - +customContent: Widget? - +icon: IconData? - +actions: List<NotificationAction>? - +type: NotificationType + + + +name: String + +icon: IconData? + +isEmpty: bool + +props: List<Object?> - - - +void register() + + + +String toJson() + <static>+IconOption fromJson() - - - - - - - - NotificationType - - + + + - - - +index: int - <static>+values: List<NotificationType> - <static>+snackbar: NotificationType - <static>+alert: NotificationType - <static>+custom: NotificationType + + + Equatable - - - - + + + - - - NotificationAction + + + ReactiveIconPicker - - - +label: String - +onSelect: dynamic Function() - +isDestructive: bool + + + + + + + + ReactiveFocusableFormField - - - + + + + + - - - dynamic Function() + + + IconPicker - - - - - - - - - SnackbarIntent + + + +iconOptions: List<IconOption> + +selectedOption: IconOption? + +onSelect: void Function(IconOption)? + +galleryIconSize: double? + +selectedIconSize: double? + +focusNode: FocusNode? + +isDisabled: bool - - - +duration: int? + + + +Widget build() - - - - + + + - - - AlertIntent + + + void Function(IconOption)? - - - +title: String - +dismissOnAction: bool - +isDestructive: dynamic + + + + + + + + FocusNode - - - - + + + + + - - - INotificationService + + + IconPickerField - - - +void showMessage() - +void show() - +Stream<NotificationIntent> watchNotifications() - +void dispose() + + + +iconOptions: List<IconOption> + +selectedOption: IconOption? + +selectedIconSize: double? + +galleryIconSize: double? + +onSelect: void Function(IconOption)? + +focusNode: FocusNode? + +isDisabled: bool + + + + + + +Widget build() - - - - - + + + + + - - - NotificationService + + + IconPickerGallery - - - -_streamController: BehaviorSubject<NotificationIntent> + + + +iconOptions: List<IconOption> + +onSelect: void Function(IconOption)? + +iconSize: double - - - +Stream<NotificationIntent> watchNotifications() - +void showMessage() - +void show() - +void dispose() + + + +Widget build() - - - + + + + + - - - BehaviorSubject + + + SecondaryButton + + + + + + +text: String + +icon: IconData? + +isLoading: bool + +onPressed: void Function()? + + + + + + +Widget build() - - - - + + + + - - - Notifications + + + TwoColumnLayout - - - <static>+credentialsInvalid: SnackbarIntent - <static>+userAlreadyRegistered: SnackbarIntent - <static>+passwordReset: SnackbarIntent - <static>+passwordResetSuccess: SnackbarIntent - <static>+studyDeleted: SnackbarIntent - <static>+inviteCodeDeleted: SnackbarIntent - <static>+inviteCodeClipped: SnackbarIntent - <static>+studyDeleteConfirmation: AlertIntent + + + <static>+defaultDivider: VerticalDivider + <static>+defaultContentPadding: EdgeInsets + <static>+slimContentPadding: EdgeInsets + +leftWidget: Widget + +rightWidget: Widget + +dividerWidget: Widget? + +headerWidget: Widget? + +flexLeft: int? + +flexRight: int? + +constraintsLeft: BoxConstraints? + +constraintsRight: BoxConstraints? + +scrollLeft: bool + +scrollRight: bool + +paddingLeft: EdgeInsets? + +paddingRight: EdgeInsets? + +backgroundColorLeft: Color? + +backgroundColorRight: Color? + +stretchHeight: bool - - - - - - - - NotificationDefaultActions - - + + + - - - <static>+cancel: NotificationAction + + + VerticalDivider - - - - + + + + - - - IClipboardService + + + AppTranslation - - - +dynamic copy() + + + <static>+dynamic init() - - - - + + + + - - - ClipboardService + + + PlatformLocale - - - +dynamic copy() + + + +Locale getPlatformLocale() - - - - + + + + - - - Assets + + + PlatformLocaleWeb - - - <static>+logoWide: String + + + +Locale getPlatformLocale() - - - - - - - - - SignupForm - - + + + + - - - +formKey: AuthFormKey + + + PlatformLocaleMobile - - - +Widget build() - -dynamic _onClickTermsOfUse() - -dynamic _onClickPrivacyPolicy() + + + +Locale getPlatformLocale() - - - - + + + + - - - AuthFormKey + + + LanguagePicker - - - +index: int - <static>+values: List<AuthFormKey> - <static>+login: AuthFormKey - <static>+signup: AuthFormKey - <static>+passwordForgot: AuthFormKey - <static>+passwordRecovery: AuthFormKey - <static>-_loginSubmit: AuthFormKey - <static>-_signupSubmit: AuthFormKey + + + +languagePickerType: LanguagePickerType + +iconColor: Color? + +offset: Offset? - - - - - - - - - AuthFormController - - + + + + - - - +authRepository: IAuthRepository - +sharedPreferences: SharedPreferences - +notificationService: INotificationService - +router: GoRouter - +emailControl: FormControl<String> - +passwordControl: FormControl<String> - +passwordConfirmationControl: FormControl<String> - +rememberMeControl: FormControl<bool> - +termsOfServiceControl: FormControl<bool> - <static>+authValidationMessages: Map<String, String Function(dynamic)> - +loginForm: FormGroup - +signupForm: FormGroup - +passwordForgotForm: FormGroup - +passwordRecoveryForm: FormGroup - +controlValidatorsByForm: Map<AuthFormKey, Map<FormControl<dynamic>, List<Validator<dynamic>>>> - -_formKey: AuthFormKey - +shouldRemember: bool - +formKey: AuthFormKey - +form: FormGroup + + + LanguagePickerType - - - -dynamic _getFormFor() - -dynamic _onChangeFormKey() - +dynamic resetControlsFor() - -dynamic _forceValidationMessages() - +dynamic signUp() - -dynamic _signUp() - +dynamic signIn() - -dynamic _signInWith() - +dynamic signOut() - +dynamic resetPasswordForEmail() - +dynamic sendPasswordResetLink() - +dynamic recoverPassword() - +dynamic updateUser() - -dynamic _readDebugUser() - -void _setRememberMe() - -void _delRememberMe() - -void _initRememberMe() + + + +index: int + <static>+values: List<LanguagePickerType> + <static>+field: LanguagePickerType + <static>+icon: LanguagePickerType - - - - - + + + - - - IAuthRepository + + + Offset - - - +allowPasswordReset: bool - +currentUser: User? - +isLoggedIn: bool - +session: Session? - +serializedSession: String? + + + + + + + + + GoRouteParamEnum - - - +dynamic signUp() - +dynamic signInWith() - +dynamic signOut() - +dynamic resetPasswordForEmail() - +dynamic updateUser() - +void dispose() + + + +String toRouteParam() + +String toShortString() - - - + + + + - - - SharedPreferences + + + RoutingIntents - - - - - - - - FormControl + + + <static>+root: RoutingIntent + <static>+studies: RoutingIntent + <static>+studiesShared: RoutingIntent + <static>+publicRegistry: RoutingIntent + <static>+study: RoutingIntent Function(String) + <static>+studyEdit: RoutingIntent Function(String) + <static>+studyEditInfo: RoutingIntent Function(String) + <static>+studyEditEnrollment: RoutingIntent Function(String) + <static>+studyEditInterventions: RoutingIntent Function(String) + <static>+studyEditIntervention: RoutingIntent Function(String, String) + <static>+studyEditMeasurements: RoutingIntent Function(String) + <static>+studyEditReports: RoutingIntent Function(String) + <static>+studyEditMeasurement: RoutingIntent Function(String, String) + <static>+studyTest: RoutingIntent Function(String, {String? appRoute}) + <static>+studyRecruit: RoutingIntent Function(String) + <static>+studyMonitor: RoutingIntent Function(String) + <static>+studyAnalyze: RoutingIntent Function(String) + <static>+studySettings: RoutingIntent Function(String) + <static>+accountSettings: RoutingIntent + <static>+studyNew: RoutingIntent + <static>+login: RoutingIntent + <static>+signup: RoutingIntent + <static>+passwordForgot: RoutingIntent + <static>+passwordForgot2: RoutingIntent Function(String) + <static>+passwordRecovery: RoutingIntent + <static>+error: RoutingIntent Function(Exception) - - - + + + - - - FormGroup + + + RoutingIntent Function(String) - - - - - - - - IFormGroupController - - + + + - - - +form: FormGroup + + + RoutingIntent Function(String, String) - - - - - + + + - - - PasswordForgotForm + + + RoutingIntent Function(String, {String? appRoute}) - - - +formKey: AuthFormKey + + + + + + + + RoutingIntent Function(Exception) - - - +Widget build() + + + + + + + + GoRoute - - - - + + + + - - - EmailTextField + + + RoutingIntentDispatch - - - +labelText: String - +hintText: String? - +formControlName: String? - +formControl: FormControl<dynamic>? + + + +index: int + <static>+values: List<RoutingIntentDispatch> + <static>+go: RoutingIntentDispatch + <static>+push: RoutingIntentDispatch - - - - + + + + - - - PasswordTextField + + + RouterKeys - - - +labelText: String - +hintText: String? - +onSubmitted: dynamic Function(FormControl<dynamic>)? - +formControlName: String? - +formControl: FormControl<dynamic>? + + + <static>+studyKey: ValueKey<String> + <static>+authKey: ValueKey<String> - - - + + + - - - dynamic Function(FormControl<dynamic>)? + + + ValueKey - - - - - - - - - PasswordRecoveryForm - - + + + + - - - +formKey: AuthFormKey + + + RouteParams - - - +Widget build() + + + <static>+studiesFilter: String + <static>+studyId: String + <static>+measurementId: String + <static>+interventionId: String + <static>+testAppRoute: String - - - - - - - - AuthScaffold - - + + + + + - - - +body: Widget - +formKey: AuthFormKey - +leftContentMinWidth: double - +leftPanelMinWidth: double - +leftPanelPadding: EdgeInsets + + + RouterConf - - - - - - - - - StudyUJobsToBeDone + + + <static>+router: GoRouter + <static>+routes: List<GoRoute> + <static>+publicRoutes: List<GoRoute> + <static>+privateRoutes: List<GoRoute> - - - +Widget build() + + + <static>+GoRoute route() - - - - - + + + - - - LoginForm + + + GoRouter - - - +formKey: AuthFormKey + + + + + + + + + StudyFormRouteArgs - - - +Widget build() + + + +studyId: String - - - - + + + + - - - IAppDelegate + + + QuestionFormRouteArgs - - - +dynamic onAppStart() + + + +questionId: String - - - - - + + + - - - AppController + + + ScreenerQuestionFormRouteArgs - - - +sharedPreferences: SharedPreferences - +appDelegates: List<IAppDelegate> - -_delayedFuture: dynamic - +isInitialized: dynamic + + + + + + + + + ConsentItemFormRouteArgs - - - +dynamic onAppStart() - -dynamic _callDelegates() + + + +consentId: String - - - + + + + - - - App + + + MeasurementFormRouteArgs - - - - - - - - AppContent + + + +measurementId: String - - - - + + + + - - - AppStatus + + + SurveyQuestionFormRouteArgs - - - +index: int - <static>+values: List<AppStatus> - <static>+initializing: AppStatus - <static>+initialized: AppStatus + + + +questionId: String - - - - + + + + - - - StudyAnalyzeScreen + + + InterventionFormRouteArgs - - - +Widget? banner() - +Widget build() + + + +interventionId: String - - - - - - - - - StudyPageWidget - - + + + + - - - +studyId: String + + + InterventionTaskFormRouteArgs - - - +Widget? banner() + + + +taskId: String - - - - + + + + - - - StudyAnalyzeController + + + ReportItemFormRouteArgs - - - +dynamic onExport() + + + +sectionId: String - - - - - - - - - StudyBaseController - - + + + + - - - +studyId: String - +studyRepository: IStudyRepository - +router: GoRouter - +studySubscription: StreamSubscription<WrappedModel<Study>>? + + + DropdownMenuItemTheme - - - +dynamic subscribeStudy() - +dynamic onStudySubscriptionUpdate() - +dynamic onStudySubscriptionError() - +void dispose() + + + +iconTheme: IconThemeData? - - - - - + + + - - - StudyParticipationBadge + + + IconThemeData - - - +participation: Participation - +type: BadgeType - +showPrefixIcon: bool - +center: bool - - + + + + - - - +Widget build() + + + Diagnosticable - - - + + + + + - - - Participation + + + ThemeConfig - - - - - - - - - PreviewFrame + + + <static>+kMinContentWidth: double + <static>+kMaxContentWidth: double + <static>+kHoverFadeFactor: double + <static>+kMuteFadeFactor: double - - - +studyId: String - +routeArgs: StudyFormRouteArgs? - +route: String? + + + <static>+dynamic bodyBackgroundColor() + <static>+Color modalBarrierColor() + <static>+Color containerColor() + <static>+Color colorPickerInitialColor() + <static>+TextStyle bodyTextMuted() + <static>+TextStyle bodyTextBackground() + <static>+double iconSplashRadius() + <static>+Color sidesheetBackgroundColor() + <static>+InputDecorationTheme dropdownInputDecorationTheme() + <static>+DropdownMenuItemTheme dropdownMenuItemTheme() - - - - - + + + + - - - FrameControlsWidget + + + NoAnimationPageTransitionsBuilder - - - +onRefresh: void Function()? - +onOpenNewTab: void Function()? - +enabled: bool + + + +Widget buildTransitions() - - - +Widget build() + + + + + + + + PageTransitionsBuilder - - - - + + + + - - - IStudyNavViewModel + + + WebTransitionBuilder - - - +isEditTabEnabled: bool - +isTestTabEnabled: bool - +isRecruitTabEnabled: bool - +isMonitorTabEnabled: bool - +isAnalyzeTabEnabled: bool - +isSettingsEnabled: bool + + + +Widget buildTransitions() - - - - + + + + - - - StudyNav + + + ThemeSettingChange - - - <static>+dynamic tabs() - <static>+dynamic edit() - <static>+dynamic test() - <static>+dynamic recruit() - <static>+dynamic monitor() - <static>+dynamic analyze() + + + +settings: ThemeSettings - - - - + + + + - - - StudyDesignNav + + + ThemeSettings - - - <static>+dynamic tabs() - <static>+dynamic info() - <static>+dynamic enrollment() - <static>+dynamic interventions() - <static>+dynamic measurements() - <static>+dynamic reports() + + + +sourceColor: Color + +themeMode: ThemeMode - - - - - + + + - - - StudySettingsFormViewModel + + + Notification - - - +study: AsyncValue<Study> - +studyRepository: IStudyRepository - <static>+defaultPublishedToRegistry: bool - <static>+defaultPublishedToRegistryResults: bool - +isPublishedToRegistryControl: FormControl<bool> - +isPublishedToRegistryResultsControl: FormControl<bool> - +form: FormGroup - +titles: Map<FormMode, String> - - + + + + + + - - - +void setControlsFrom() - +Study buildFormData() - +dynamic keepControlsSynced() - +dynamic save() - +dynamic setLaunchDefaults() + + + ThemeProvider - - - - - - - - - IStudyRepository + + + +settings: ValueNotifier<ThemeSettings> + +lightDynamic: ColorScheme? + +darkDynamic: ColorScheme? + +pageTransitionsTheme: PageTransitionsTheme + +shapeMedium: ShapeBorder - - - +dynamic launch() - +dynamic deleteParticipants() + + + +Color custom() + +Color blend() + +Color source() + +ColorScheme colors() + +CardTheme cardTheme() + +ListTileThemeData listTileTheme() + +AppBarTheme appBarTheme() + +SnackBarThemeData snackBarThemeData() + +TabBarTheme tabBarTheme() + +BottomAppBarTheme bottomAppBarTheme() + +BottomNavigationBarThemeData bottomNavigationBarTheme() + +SwitchThemeData switchTheme() + +InputDecorationTheme inputDecorationTheme() + +TextTheme textTheme() + +DividerThemeData dividerTheme() + +NavigationRailThemeData navigationRailTheme() + +DrawerThemeData drawerTheme() + +IconThemeData iconTheme() + +CheckboxThemeData checkboxTheme() + +RadioThemeData radioTheme() + +TooltipThemeData tooltipTheme() + +ThemeData light() + +ThemeData dark() + +ThemeMode themeMode() + +ThemeData theme() + <static>+ThemeProvider of() + +bool updateShouldNotify() - - - - - + + + - - - FormViewModel + + + ValueNotifier - - - -_formData: T? - -_formMode: FormMode - -_validationSet: FormValidationSetEnum? - +delegate: IFormViewModelDelegate<FormViewModel<dynamic>>? - +autosave: bool - -_immediateFormChildrenSubscriptions: List<StreamSubscription<dynamic>> - -_immediateFormChildrenListenerDebouncer: Debouncer? - -_autosaveOperation: CancelableOperation<dynamic>? - -_defaultControlValidators: Map<String, Tuple<List<Validator<dynamic>>, List<AsyncValidator<dynamic>>>> - +prevFormValue: Map<String, dynamic>? - <static>-_formKey: String - +formData: T? - +formMode: FormMode - +isReadonly: bool - +validationSet: FormValidationSetEnum? - +isDirty: bool - +title: String - +isValid: bool - +titles: Map<FormMode, String> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - - + + + + - - - -dynamic _setFormData() - -dynamic _rememberDefaultControlValidators() - -Tuple<List<Validator<dynamic>>, List<AsyncValidator<dynamic>>>? _getDefaultValidators() - -dynamic _disableAllControls() - -dynamic _formModeUpdated() - -dynamic _restoreControlsFromFormData() - +void revalidate() - -void _applyValidationSet() - +void read() - +dynamic save() - +dynamic cancel() - +void enableAutosave() - +void listenToImmediateFormChildren() - +dynamic markFormGroupChanged() - +void dispose() - +void setControlsFrom() - +T buildFormData() - +void initControls() + + + ColorScheme - - - - + + + - - - StudySettingsDialog + + + PageTransitionsTheme - - - +Widget build() + + + + + + + + ShapeBorder - - - - - + + + - - - StudyTestScreen + + + InheritedWidget - - - +previewRoute: String? - - + + + + - - - +Widget build() - +Widget? banner() - +dynamic load() - +dynamic save() - +dynamic showHelp() + + + ThemeMode - - - + + + + + - - - StreamSubscription + + + CustomColor - - - - - - - - - StudyTestController + + + +name: String + +color: Color + +blend: bool - - - +authRepository: IAuthRepository - +languageCode: String + + + +Color value() - - - - - + + + + + - - - WebFrame + + + SuppressedBehaviorSubject - - - +previewSrc: String - +studyId: String + + + +subject: BehaviorSubject<T> + +didSuppressInitialEvent: bool + -_controller: StreamController<T> - - - +Widget build() + + + -StreamController<T> _buildDerivedController() + +dynamic close() - - - - - - - - DisabledFrame - - + + + - - - +Widget build() + + + StreamController - - - - - + + + + - - - PhoneContainer + + + Time - - - <static>+defaultWidth: double - <static>+defaultHeight: double - +width: double - +height: double - +borderColor: Color - +borderWidth: double - +borderRadius: double - +innerContent: Widget - +innerContentBackgroundColor: Color? + + + <static>+dynamic fromTimeOfDay() + +Map<String, dynamic> toJson() + <static>+Time fromJson() - - - +Widget build() + + + + + + + + TimeOfDay - - - - + + + + - - - MobileFrame + + + TimeValueAccessor - - - +Widget build() + + + +String modelToViewValue() + +Time? viewToModelValue() + -String _addLeadingZeroIfNeeded() - - - - - - - - DesktopFrame - - + + + - - - +Widget build() + + + ControlValueAccessor - - - - + + + + - - - IStudyAppBarViewModel + + + ModelAction - - - +isSyncIndicatorVisible: bool - +isStatusBadgeVisible: bool - +isPublishVisible: bool + + + +type: T + +label: String + +icon: IconData? + +onExecute: Function + +isAvailable: bool + +isDestructive: bool - - - - + + + + - - - IStudyStatusBadgeViewModel + + + IModelActionProvider - - - +studyParticipation: Participation? - +studyStatus: StudyStatus? + + + +List<ModelAction<dynamic>> availableActions() - - - - + + + + - - - StudyScaffold + + + IListActionProvider - - - +studyId: String - +tabs: List<NavbarTab>? - +tabsSubnav: List<NavbarTab>? - +selectedTab: NavbarTab? - +selectedTabSubnav: NavbarTab? - +body: StudyPageWidget - +drawer: Widget? - +disableActions: bool - +actionsSpacing: double - +actionsPadding: double - +layoutType: SingleColumnLayoutType? - +appbarHeight: double - +appbarSubnavHeight: double + + + +void onSelectItem() + +void onNewItem() - - - - - - - - - RouteInformation - - + + + + - - - +route: String? - +extra: String? - +cmd: String? - +data: String? + + + ModelActionType - - - +String toString() + + + +index: int + <static>+values: List<ModelActionType> + <static>+edit: ModelActionType + <static>+delete: ModelActionType + <static>+remove: ModelActionType + <static>+duplicate: ModelActionType + <static>+clipboard: ModelActionType + <static>+primary: ModelActionType - - - - - + + + + + - - - PlatformController + + + OptimisticUpdate - - - +studyId: String - +baseSrc: String - +previewSrc: String - +routeInformation: RouteInformation - +frameWidget: Widget + + + +applyOptimistic: void Function() + +apply: dynamic Function() + +rollback: void Function() + +onUpdate: void Function()? + +onError: void Function(Object, StackTrace?)? + +rethrowErrors: bool + +runOptimistically: bool + +completeFutureOptimistically: bool - - - +void activate() - +void registerViews() - +void generateUrl() - +void navigate() - +void refresh() - +void listen() - +void send() - +void openNewPage() + + + +dynamic execute() + -void _runUpdateHandlerIfAny() - - - - - + + + - - - WebController + + + void Function() - - - +iFrameElement: IFrameElement - - + + + + - - - +void activate() - +void registerViews() - +void generateUrl() - +void navigate() - +void refresh() - +void openNewPage() - +void listen() - +void send() + + + void Function(Object, StackTrace?)? - - - + + + + - - - IFrameElement + + + FileFormatEncoder + + + + + + +dynamic encodeAsync() + +String encode() + +dynamic call() - - - - + + + + - - - MobileController + + + CSVStringEncoder - - - +void openNewPage() - +void refresh() - +void registerViews() - +void listen() - +void send() - +void navigate() - +void activate() - +void generateUrl() + + + +String encode() - - - + + + + - - - StudyStatus + + + JsonStringEncoder + + + + + + +String encode() - - - - - + + + + + - - - StudyStatusBadge + + + ExecutionLimiter - - - +participation: Participation? - +status: StudyStatus? - +type: BadgeType - +showPrefixIcon: bool - +showTooltip: bool + + + +milliseconds: int + <static>-_timer: Timer? - - - +Widget build() + + + +void dispose() - - - - + + + - - - TestAppRoutes + + + Timer - - - <static>+studyOverview: String - <static>+eligibility: String - <static>+intervention: String - <static>+consent: String - <static>+journey: String - <static>+dashboard: String + + + + + + + + + + Debouncer - - - - - - - - - - StudyController + + + +leading: bool + +cancelUncompleted: bool + -_uncompletedFutureOperation: CancelableOperation<dynamic>? - - - +notificationService: INotificationService - +studyEventsSubscription: StreamSubscription<ModelEvent<Study>>? - +studyActions: List<ModelAction<dynamic>> + + + +dynamic call() - - - +dynamic syncStudyStatus() - +dynamic onStudySubscriptionUpdate() - -dynamic _redirectNewToActualStudyID() - +dynamic publishStudy() - +void onChangeStudyParticipation() - +void onAddParticipants() - +void onSettingsPressed() - +void dispose() + + + + + + + + CancelableOperation - - - - + + + + - - - StudyMonitorScreen + + + Throttler - - - +Widget build() + + + +dynamic call() - - - - + + + + - - - StudiesTableColumnHeader + + + SerializableColor - - - +title: String - +sortable: bool - +sortAscending: bool - +sortingActive: bool - +onSort: void Function()? + + + +Map<String, dynamic> toJson() + <static>+SerializableColor fromJson() - - - - - - - - - DashboardScaffold - - + + + + - - - <static>+compactWidthThreshold: double - +body: Widget + + + IProviderArgsResolver - - - +Widget build() + + + +R provide() - - - - - + + + + + - - - StudiesTableColumnSize + + + CombinedStreamNotifier - - - +collapsed: bool - +flex: int? - +width: double? + + + -_subscriptions: List<StreamSubscription<dynamic>> - - - +Widget createContainer() + + + +void dispose() - - - - - + + + - - - StudiesTable + + + ChangeNotifier - - - +itemHeight: double - +itemPadding: double - +rowSpacing: double - +columnSpacing: double - +compactWidthThreshold: double - +superCompactWidthThreshold: double - +compactStatTitleThreshold: double - +studies: List<Study> - +onSelect: void Function(Study) - +getActions: List<ModelAction<dynamic>> Function(Study) - +emptyWidget: Widget - +pinnedStudies: Iterable<String> - +dashboardController: DashboardController + + + + + + + + + + CountWhereValidator + + + + + + +predicate: bool Function(T?) + +minCount: int? + +maxCount: int? + <static>+kValidationMessageMinCount: String + <static>+kValidationMessageMaxCount: String - - - +Widget build() - -Widget _buildColumnHeader() + + + +Map<String, dynamic>? validate() - - - + + + - - - void Function(Study) + + + bool Function(T?) - - - + + + - - - List<ModelAction<dynamic>> Function(Study) + + + Validator - - - - - + + + + - - - DashboardController + + + Patterns - - - +studyRepository: IStudyRepository - +authRepository: IAuthRepository - +userRepository: IUserRepository - +router: GoRouter - -_studiesSubscription: StreamSubscription<List<WrappedModel<Study>>>? - +searchController: SearchController - +isSortAscending: bool + + + <static>+timeFormatString: String + <static>+emailFormatString: String + <static>+url: String - - - -dynamic _subscribeStudies() - +dynamic setSearchText() - +dynamic setStudiesFilter() - +dynamic onSelectStudy() - +dynamic onClickNewStudy() - +dynamic pinStudy() - +dynamic pinOffStudy() - +void setSorting() - +void filterStudies() - +void sortStudies() - +bool isSortingActiveForColumn() - +bool isPinned() - +List<ModelAction<dynamic>> availableActions() - +void dispose() + + + + + + + + + + NumericalRangeFormatter - - - - - + + + +min: int? + +max: int? + + - - - StudiesTableColumn + + + +TextEditingValue formatEditUpdate() - - - +index: int - <static>+values: List<StudiesTableColumn> - <static>+pin: StudiesTableColumn - <static>+title: StudiesTableColumn - <static>+status: StudiesTableColumn - <static>+participation: StudiesTableColumn - <static>+createdAt: StudiesTableColumn - <static>+enrolled: StudiesTableColumn - <static>+active: StudiesTableColumn - <static>+completed: StudiesTableColumn - <static>+action: StudiesTableColumn + + + + + + + + TextInputFormatter - - - - + + + + - - - DashboardScreen + + + StudySequenceFormatter - - - +filter: StudiesFilter? + + + +TextEditingValue formatEditUpdate() - - - - + + + + + - - - StudiesFilter + + + Tuple - - - +index: int - <static>+values: List<StudiesFilter> + + + +first: T1 + +second: T2 + +props: List<Object?> + + + + + + +Map<String, dynamic> toJson() + <static>+Tuple<dynamic, dynamic> fromJson() + +Tuple<T1, T2> copy() + +Tuple<T1, T2> copyWith() - - - - - + + + + + - - - IUserRepository + + + JsonFileLoader - - - +user: StudyUUser + + + +jsonAssetsPath: String - - - +dynamic fetchUser() - +dynamic saveUser() - +dynamic updatePreferences() + + + +dynamic loadJson() + +dynamic parseJsonMapFromAssets() + +dynamic parseJsonListFromAssets() - - - - + + + + - - - IModelActionProvider + + + IAppDelegate - - - +List<ModelAction<dynamic>> availableActions() + + + +dynamic onAppStart() - - - - + + + + + - - - StudiesTableItem + + + AppController - - - +study: Study - +itemHeight: double - +itemPadding: double - +rowSpacing: double - +columnSpacing: double - +actions: List<ModelAction<dynamic>> - +columnSizes: List<StudiesTableColumnSize> - +isPinned: bool - +onPinnedChanged: void Function(Study, bool)? - +onTap: void Function(Study)? + + + +sharedPreferences: SharedPreferences + +appDelegates: List<IAppDelegate> + -_delayedFuture: dynamic + +isInitialized: dynamic + + + + + + +dynamic onAppStart() + -dynamic _callDelegates() - - - + + + - - - Study + + + SharedPreferences - - - + + + + + - - - void Function(Study, bool)? + + + ParticipantDetailsFormView - - - - + + + +formViewModel: ParticipantDetailsFormViewModel + + - - - void Function(Study)? + + + +Widget build() - - - - - + + + + + - - - FormArrayTable + + + ParticipantDetailsFormViewModel - - - +control: AbstractControl<dynamic> - +items: List<T> - +onSelectItem: void Function(T) - +getActionsAt: List<ModelAction<dynamic>> Function(T, int) - +onNewItem: void Function()? - +rowTitle: String Function(T) - +onNewItemLabel: String - +sectionTitle: String? - +sectionDescription: String? - +emptyIcon: IconData? - +emptyTitle: String? - +emptyDescription: String? - +sectionTitleDivider: bool? - +rowPrefix: Widget Function(BuildContext, T, int)? - +rowSuffix: Widget Function(BuildContext, T, int)? - +leadingWidget: Widget? - +itemsSectionPadding: EdgeInsets? - +hideLeadingTrailingWhenEmpty: bool - <static>+columns: List<StandardTableColumn> + + + +participantIdControl: FormControl<String> + +rawDataControl: FormControl<String> + +form: FormGroup + +titles: Map<FormMode, String> - - - +Widget build() - -List<Widget> _buildRow() - -Widget _newItemButton() + + + +void initControls() + +StudyMonitorItem buildFormData() + +void setControlsFrom() + + + + + + + + + + + + StudyMonitorScreen + + + + + + +Widget build() + -Widget _monitorSectionHeader() + -Widget _buildStat() + -dynamic _onSelectParticipant() - - - + + + + + - - - List<ModelAction<dynamic>> Function(T, int) + + + StudyPageWidget - - - - - - - - String Function(T) + + + +studyId: String - - - - - - - - Widget Function(BuildContext, T, int)? + + + +Widget? banner() - - - - - + + + + + - - - CustomFormControl + + + StudyMonitorItem - - - -_onValueChangedDebouncer: Debouncer? - -_onStatusChangedDebouncer: Debouncer? - +onValueChanged: void Function(T?)? - +onStatusChanged: void Function(ControlStatus)? - +onStatusChangedDebounceTime: int? - +onValueChangedDebounceTime: int? + + + +participantId: String + +inviteCode: String? + +enrolledAt: DateTime + +lastActivityAt: DateTime + +currentDayOfStudy: int + +studyDurationInDays: int + +completedInterventions: int + +missedInterventions: int + +completedSurveys: int + +missedSurveys: int + +rawData: String + +props: List<Object?> - - - +void dispose() + + + <static>+List<StudyMonitorItem> fromStudy() - - - - - + + + + + - - - Debouncer + + + StudyMonitorTable - - - +leading: bool - +cancelUncompleted: bool - -_uncompletedFutureOperation: CancelableOperation<dynamic>? + + + +studyMonitorItems: List<StudyMonitorItem> + +onSelectItem: void Function(StudyMonitorItem) - - - +dynamic call() + + + +Widget build() + -List<Widget> _buildRow() + -String _formatTime() + -Widget _buildProgressCell() - - - + + + - - - void Function(T?)? + + + void Function(StudyMonitorItem) - - - + + + - - - void Function(ControlStatus)? + + + FormControl - - - + + + - - - FormInvalidException + + + FormGroup - - - + + + + + - - - Exception + + + FormViewModel + + + + + + -_formData: T? + -_formMode: FormMode + -_validationSet: FormValidationSetEnum? + +delegate: IFormViewModelDelegate<FormViewModel<dynamic>>? + +autosave: bool + -_immediateFormChildrenSubscriptions: List<StreamSubscription<dynamic>> + -_immediateFormChildrenListenerDebouncer: Debouncer? + -_autosaveOperation: CancelableOperation<dynamic>? + -_defaultControlValidators: Map<String, Tuple<List<Validator<dynamic>>, List<AsyncValidator<dynamic>>>> + +prevFormValue: Map<String, dynamic>? + <static>-_formKey: String + +formData: T? + +formMode: FormMode + +isReadonly: bool + +validationSet: FormValidationSetEnum? + +isDirty: bool + +title: String + +isValid: bool + +titles: Map<FormMode, String> + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + + + + + + -dynamic _setFormData() + -dynamic _rememberDefaultControlValidators() + -Tuple<List<Validator<dynamic>>, List<AsyncValidator<dynamic>>>? _getDefaultValidators() + -dynamic _disableAllControls() + -dynamic _formModeUpdated() + -dynamic _restoreControlsFromFormData() + +void revalidate() + -void _applyValidationSet() + +void read() + +dynamic save() + +dynamic cancel() + +void enableAutosave() + +void listenToImmediateFormChildren() + +dynamic markFormGroupChanged() + +void dispose() + +void setControlsFrom() + +T buildFormData() + +void initControls() - - - - + + + + + - - - FormConfigException + + + LoginForm - - - +message: String? + + + +formKey: AuthFormKey + + + + + + +Widget build() - - - - + + + + - - - IFormViewModelDelegate + + + AuthFormKey - - - +dynamic onSave() - +void onCancel() + + + +index: int + <static>+values: List<AuthFormKey> + <static>+login: AuthFormKey + <static>+signup: AuthFormKey + <static>+passwordForgot: AuthFormKey + <static>+passwordRecovery: AuthFormKey + <static>-_loginSubmit: AuthFormKey + <static>-_signupSubmit: AuthFormKey - - - - + + + + + - - - FormControlOption + + + PasswordRecoveryForm - - - +value: T - +label: String - +description: String? - +props: List<Object?> + + + +formKey: AuthFormKey + + + + + + +Widget build() - - - - + + + + + - - - FormMode + + + PasswordForgotForm - - - +index: int - <static>+values: List<FormMode> - <static>+create: FormMode - <static>+readonly: FormMode - <static>+edit: FormMode + + + +formKey: AuthFormKey + + + + + + +Widget build() - - - + + + + + - - - FormValidationSetEnum + + + SignupForm - - - - + + + +formKey: AuthFormKey + + - - - CancelableOperation + + + +Widget build() + -dynamic _onClickTermsOfUse() + -dynamic _onClickPrivacyPolicy() - - - - - + + + + - - - IFormData + + + AuthScaffold - - - +id: String + + + +body: Widget + +formKey: AuthFormKey + +leftContentMinWidth: double + +leftPanelMinWidth: double + +leftPanelPadding: EdgeInsets - - - +IFormData copy() + + + + + + + + + EmailTextField + + + + + + +labelText: String + +hintText: String? + +formControlName: String? + +formControl: FormControl<dynamic>? - - - - + + + + - - - UnsavedChangesDialog + + + PasswordTextField - - - +Widget build() + + + +labelText: String + +hintText: String? + +onSubmitted: dynamic Function(FormControl<dynamic>)? + +formControlName: String? + +formControl: FormControl<dynamic>? - - - - - + + + - - - FormControlValidation + + + dynamic Function(FormControl<dynamic>)? - - - +control: AbstractControl<dynamic> - +validators: List<Validator<dynamic>> - +asyncValidators: List<AsyncValidator<dynamic>>? - +validationMessages: Map<String, String Function(Object)> + + + + + + + + + StudyUJobsToBeDone - - - +FormControlValidation merge() + + + +Widget build() - - - - + + + + + - - - ManagedFormViewModel + + + AuthFormController - - - +ManagedFormViewModel<T> createDuplicate() + + + +authRepository: IAuthRepository + +sharedPreferences: SharedPreferences + +notificationService: INotificationService + +router: GoRouter + +emailControl: FormControl<String> + +passwordControl: FormControl<String> + +passwordConfirmationControl: FormControl<String> + +rememberMeControl: FormControl<bool> + +termsOfServiceControl: FormControl<bool> + <static>+authValidationMessages: Map<String, String Function(dynamic)> + +loginForm: FormGroup + +signupForm: FormGroup + +passwordForgotForm: FormGroup + +passwordRecoveryForm: FormGroup + +controlValidatorsByForm: Map<AuthFormKey, Map<FormControl<dynamic>, List<Validator<dynamic>>>> + -_formKey: AuthFormKey + +shouldRemember: bool + +formKey: AuthFormKey + +form: FormGroup - - - - - - - - FormViewModelNotFoundException + + + -dynamic _getFormFor() + -dynamic _onChangeFormKey() + +dynamic resetControlsFor() + -dynamic _forceValidationMessages() + +dynamic signUp() + -dynamic _signUp() + +dynamic signIn() + -dynamic _signInWith() + +dynamic signOut() + +dynamic resetPasswordForEmail() + +dynamic sendPasswordResetLink() + +dynamic recoverPassword() + +dynamic updateUser() + -dynamic _readDebugUser() + -void _setRememberMe() + -void _delRememberMe() + -void _initRememberMe() - - - - - + + + + + - - - FormViewModelCollection + + + IAuthRepository - - - +formViewModels: List<T> - +formArray: FormArray<dynamic> - +stagedViewModels: List<T> - +retrievableViewModels: List<T> - +formData: List<D> + + + +allowPasswordReset: bool + +currentUser: User? + +isLoggedIn: bool + +session: Session? + +serializedSession: String? - - - +void add() - +T remove() - +T? findWhere() - +T? removeWhere() - +bool contains() - +void stage() - +T commit() - +void reset() - +void read() + + + +dynamic signUp() + +dynamic signInWith() + +dynamic signOut() + +dynamic resetPasswordForEmail() + +dynamic updateUser() + +void dispose() - - - + + + + - - - FormArray + + + IFormGroupController - - - - - - - - - - DrawerEntry + + + +form: FormGroup - - - +localizedTitle: String Function() - +icon: IconData? - +localizedHelpText: String Function()? - +enabled: bool - +onSelected: void Function(BuildContext, WidgetRef)? - +autoCloseDrawer: bool - +title: String - +helpText: String? + + + + + + + + + AppStatus - - - +void onClick() + + + +index: int + <static>+values: List<AppStatus> + <static>+initializing: AppStatus + <static>+initialized: AppStatus - - - + + + + + - - - String Function() + + + FormArrayTable - - - - - - - - String Function()? + + + +control: AbstractControl<dynamic> + +items: List<T> + +onSelectItem: void Function(T) + +getActionsAt: List<ModelAction<dynamic>> Function(T, int) + +onNewItem: void Function()? + +rowTitle: String Function(T) + +onNewItemLabel: String + +sectionTitle: String? + +sectionDescription: String? + +emptyIcon: IconData? + +emptyTitle: String? + +emptyDescription: String? + +sectionTitleDivider: bool? + +rowPrefix: Widget Function(BuildContext, T, int)? + +rowSuffix: Widget Function(BuildContext, T, int)? + +leadingWidget: Widget? + +itemsSectionPadding: EdgeInsets? + +hideLeadingTrailingWhenEmpty: bool + <static>+columns: List<StandardTableColumn> - - - - - - - - void Function(BuildContext, WidgetRef)? + + + +Widget build() + -List<Widget> _buildRow() + -Widget _newItemButton() - - - - - + + + - - - GoRouterDrawerEntry + + + List<ModelAction<dynamic>> Function(T, int) - - - +intent: RoutingIntent - +onNavigated: void Function()? - - + + + + - - - +void onClick() + + + String Function(T) - - - - - - - - AppDrawer - - + + + - - - +width: int - +autoCloseDrawer: bool - +leftPaddingEntries: double - +logoPaddingVertical: double - +logoPaddingHorizontal: double - +logoMaxHeight: double - +logoSectionMinHeight: double - +logoSectionMaxHeight: double + + + Widget Function(BuildContext, T, int)? - - - - - + + + + - - - StudyInvitesTable + + + ManagedFormViewModel - - - +invites: List<StudyInvite> - +onSelect: void Function(StudyInvite) - +getActions: List<ModelAction<dynamic>> Function(StudyInvite) - +getInlineActions: List<ModelAction<dynamic>> Function(StudyInvite) - +getIntervention: Intervention? Function(String) - +getParticipantCountForInvite: int Function(StudyInvite) + + + +ManagedFormViewModel<T> createDuplicate() - - - +Widget build() - -List<Widget> _buildRow() + + + + + + + + FormViewModelNotFoundException - - - + + + - - - void Function(StudyInvite) + + + Exception - - - + + + + + - - - List<ModelAction<dynamic>> Function(StudyInvite) + + + FormViewModelCollection - - - - + + + +formViewModels: List<T> + +formArray: FormArray<dynamic> + +stagedViewModels: List<T> + +retrievableViewModels: List<T> + +formData: List<D> + + - - - Intervention? Function(String) + + + +void add() + +T remove() + +T? findWhere() + +T? removeWhere() + +bool contains() + +void stage() + +T commit() + +void reset() + +void read() - - - + + + - - - int Function(StudyInvite) + + + FormArray - - - - - + + + + + - - - InviteCodeFormView + + + CustomFormControl - - - +formViewModel: InviteCodeFormViewModel + + + -_onValueChangedDebouncer: Debouncer? + -_onStatusChangedDebouncer: Debouncer? + +onValueChanged: void Function(T?)? + +onStatusChanged: void Function(ControlStatus)? + +onStatusChangedDebounceTime: int? + +onValueChangedDebounceTime: int? - - - +Widget build() - -List<FormTableRow> _conditionalInterventionRows() + + + +void dispose() - - - - - + + + - - - InviteCodeFormViewModel + + + void Function(T?)? - - - +study: Study - +inviteCodeRepository: IInviteCodeRepository - +codeControl: FormControl<String> - +codeControlValidationMessages: Map<String, String Function(dynamic)> - +isPreconfiguredScheduleControl: FormControl<bool> - +preconfiguredScheduleTypeControl: FormControl<PhaseSequence> - +interventionAControl: FormControl<String> - +interventionBControl: FormControl<String> - +form: FormGroup - +titles: Map<FormMode, String> - +interventionControlOptions: List<FormControlOption<String>> - +preconfiguredScheduleTypeOptions: List<FormControlOption<PhaseSequence>> - +isPreconfiguredSchedule: bool - +preconfiguredSchedule: List<String>? - - + + + + - - - +void initControls() - -dynamic _uniqueInviteCode() - +void regenerateCode() - -String _generateCode() - +StudyInvite buildFormData() - +void setControlsFrom() - +dynamic save() + + + void Function(ControlStatus)? - - - - + + + + - - - IInviteCodeRepository + + + UnsavedChangesDialog - - - +dynamic isCodeAlreadyUsed() + + + +Widget build() - - - - - + + + - - - StudyRecruitController + + + FormValidationSetEnum - - - +inviteCodeRepository: IInviteCodeRepository - -_invitesSubscription: StreamSubscription<List<WrappedModel<StudyInvite>>>? + + + + + + + + + + FormControlValidation - - - -dynamic _subscribeInvites() - +Intervention? getIntervention() - +int getParticipantCountForInvite() - +List<ModelAction<dynamic>> availableActions() - +List<ModelAction<dynamic>> availableInlineActions() - +void dispose() + + + +control: AbstractControl<dynamic> + +validators: List<Validator<dynamic>> + +asyncValidators: List<AsyncValidator<dynamic>>? + +validationMessages: Map<String, String Function(Object)> + + + + + + +FormControlValidation merge() - - - - + + + + + - - - StudyRecruitScreen + + + IFormData - - - +Widget build() - -Widget _inviteCodesSectionHeader() - -Widget _newInviteCodeButton() - -dynamic _onSelectInvite() + + + +id: String + + + + + + +IFormData copy() - - - - - + + + - - - EnrolledBadge + + + FormInvalidException - - - +enrolledCount: int + + + + + + + + + FormConfigException - - - +Widget build() + + + +message: String? - - - - + + + + - - - PublishConfirmationDialog + + + IFormViewModelDelegate - - - +Widget build() + + + +dynamic onSave() + +void onCancel() - - - - + + + + - - - PublishSuccessDialog + + + FormControlOption - - - +Widget build() + + + +value: T + +label: String + +description: String? + +props: List<Object?> - - - - + + + + - - - PublishDialog + + + FormMode - - - +Widget build() + + + +index: int + <static>+values: List<FormMode> + <static>+create: FormMode + <static>+readonly: FormMode + <static>+edit: FormMode - - - - - + + + + + - - - StudyFormScaffold + + + EnrolledBadge - - - +studyId: String - +formViewModelBuilder: T Function(WidgetRef) - +formViewBuilder: Widget Function(T) + + + +enrolledCount: int - - - +Widget build() + + + +Widget build() - - - + + + + + - - - T Function(WidgetRef) + + + StudyRecruitController - - - - - - - - - StudyFormValidationSet + + + +inviteCodeRepository: IInviteCodeRepository + -_invitesSubscription: StreamSubscription<List<WrappedModel<StudyInvite>>>? - - - +index: int - <static>+values: List<StudyFormValidationSet> + + + -dynamic _subscribeInvites() + +Intervention? getIntervention() + +int getParticipantCountForInvite() + +List<ModelAction<dynamic>> availableActions() + +List<ModelAction<dynamic>> availableInlineActions() + +void dispose() - - - - - + + + + - - - QuestionFormData + + + IInviteCodeRepository - - - <static>+questionTypeFormDataFactories: Map<SurveyQuestionType, QuestionFormData Function(Question<dynamic>, List<EligibilityCriterion>)> - +questionId: String - +questionText: String - +questionInfoText: String? - +questionType: SurveyQuestionType - +responseOptionsValidity: Map<dynamic, bool> - +responseOptions: List<dynamic> - +id: String + + + +dynamic isCodeAlreadyUsed() - - - +Question<dynamic> toQuestion() - +EligibilityCriterion toEligibilityCriterion() - +Answer<dynamic> constructAnswerFor() - +dynamic setResponseOptionsValidityFrom() - +QuestionFormData copy() + + + + + + + + StreamSubscription - - - - + + + + + - - - SurveyQuestionType + + + StudyBaseController - - - +index: int - <static>+values: List<SurveyQuestionType> - <static>+choice: SurveyQuestionType - <static>+bool: SurveyQuestionType - <static>+scale: SurveyQuestionType - <static>+freeText: SurveyQuestionType + + + +studyId: String + +studyRepository: IStudyRepository + +router: GoRouter + +studySubscription: StreamSubscription<WrappedModel<Study>>? - - - - - - - - - - ChoiceQuestionFormData + + + +dynamic subscribeStudy() + +dynamic onStudySubscriptionUpdate() + +dynamic onStudySubscriptionError() + +void dispose() - - - +isMultipleChoice: bool - +answerOptions: List<String> - +responseOptions: List<String> + + + + + + + + + StudyRecruitScreen - - - +Question<dynamic> toQuestion() - +QuestionFormData copy() - -Choice _buildChoiceForValue() - +Answer<dynamic> constructAnswerFor() + + + +Widget build() + -Widget _inviteCodesSectionHeader() + -Widget _newInviteCodeButton() + -dynamic _onSelectInvite() - - - - - + + + + + - - - BoolQuestionFormData + + + InviteCodeFormView - - - <static>+kResponseOptions: Map<String, bool> - +responseOptions: List<String> + + + +formViewModel: InviteCodeFormViewModel - - - +Question<dynamic> toQuestion() - +BoolQuestionFormData copy() - +Answer<dynamic> constructAnswerFor() + + + +Widget build() + -List<FormTableRow> _conditionalInterventionRows() - - - - - + + + + + - - - ScaleQuestionFormData + + + InviteCodeFormViewModel - - - +minValue: double - +maxValue: double - +minLabel: String? - +maxLabel: String? - +midValues: List<double?> - +midLabels: List<String?> - +stepSize: double - +initialValue: double? - +minColor: Color? - +maxColor: Color? - +responseOptions: List<double> - +midAnnotations: List<Annotation> + + + +study: Study + +inviteCodeRepository: IInviteCodeRepository + +codeControl: FormControl<String> + +codeControlValidationMessages: Map<String, String Function(dynamic)> + +isPreconfiguredScheduleControl: FormControl<bool> + +preconfiguredScheduleTypeControl: FormControl<PhaseSequence> + +interventionAControl: FormControl<String> + +interventionBControl: FormControl<String> + +form: FormGroup + +titles: Map<FormMode, String> + +interventionControlOptions: List<FormControlOption<String>> + +preconfiguredScheduleTypeOptions: List<FormControlOption<PhaseSequence>> + +isPreconfiguredSchedule: bool + +preconfiguredSchedule: List<String>? - - - +ScaleQuestion toQuestion() - +QuestionFormData copy() - +Answer<dynamic> constructAnswerFor() + + + +void initControls() + -dynamic _uniqueInviteCode() + +void regenerateCode() + -String _generateCode() + +StudyInvite buildFormData() + +void setControlsFrom() + +dynamic save() - - - - - + + + + + - - - FreeTextQuestionFormData + + + StudyInvitesTable - - - +textLengthRange: List<int> - +textType: FreeTextQuestionType - +textTypeExpression: String? - +responseOptions: List<String> + + + +invites: List<StudyInvite> + +onSelect: void Function(StudyInvite) + +getActions: List<ModelAction<dynamic>> Function(StudyInvite) + +getInlineActions: List<ModelAction<dynamic>> Function(StudyInvite) + +getIntervention: Intervention? Function(String) + +getParticipantCountForInvite: int Function(StudyInvite) - - - +Question<dynamic> toQuestion() - +FreeTextQuestionFormData copy() - +Answer<dynamic> constructAnswerFor() + + + +Widget build() + -List<Widget> _buildRow() - - - + + + - - - FreeTextQuestionType + + + void Function(StudyInvite) - - - - + + + - - - SurveyQuestionFormView + + + List<ModelAction<dynamic>> Function(StudyInvite) - - - +formViewModel: QuestionFormViewModel - +isHtmlStyleable: bool + + + + + + + + Intervention? Function(String) - - - - - + + + - - - QuestionFormViewModel + + + int Function(StudyInvite) - - - <static>+defaultQuestionType: SurveyQuestionType - -_titles: Map<FormMode, String Function()>? - +questionIdControl: FormControl<String> - +questionTypeControl: FormControl<SurveyQuestionType> - +questionTextControl: FormControl<String> - +questionInfoTextControl: FormControl<String> - +questionBaseControls: Map<String, AbstractControl<dynamic>> - +isMultipleChoiceControl: FormControl<bool> - +choiceResponseOptionsArray: FormArray<dynamic> - +customOptionsMin: int - +customOptionsMax: int - +customOptionsInitial: int - +boolResponseOptionsArray: FormArray<String> - <static>+kDefaultScaleMinValue: int - <static>+kDefaultScaleMaxValue: int - <static>+kNumMidValueControls: int - <static>+kMidValueDebounceMilliseconds: int - +scaleMinValueControl: FormControl<int> - +scaleMaxValueControl: FormControl<int> - -_scaleRangeControl: FormControl<int> - +scaleMinLabelControl: FormControl<String> - +scaleMaxLabelControl: FormControl<String> - +scaleMidValueControls: FormArray<int> - +scaleMidLabelControls: FormArray<String?> - -_scaleResponseOptionsArray: FormArray<int> - +scaleMinColorControl: FormControl<SerializableColor> - +scaleMaxColorControl: FormControl<SerializableColor> - +prevMidValues: List<int?>? - +freeTextTypeControl: FormControl<FreeTextQuestionType> - +customRegexControl: FormControl<String> - +freeTextResponseOptionsArray: FormArray<dynamic> - +freeTextLengthMin: AbstractControl<int> - +freeTextLengthMax: AbstractControl<int> - +freeTextExampleTextControl: FormControl<String> - <static>+kDefaultFreeTextMinLength: int - <static>+kDefaultFreeTextMaxLength: int - +freeTextLengthControl: FormControl<RangeValues> - -_controlsByQuestionType: Map<SurveyQuestionType, FormGroup> - -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - -_validationConfigsByQuestionType: Map<SurveyQuestionType, Map<FormValidationSetEnum, List<FormControlValidation>>> - +form: FormGroup - +questionId: String - +questionType: SurveyQuestionType - +questionTypeControlOptions: List<FormControlOption<SurveyQuestionType>> - +answerOptionsArray: FormArray<dynamic> - +answerOptionsControls: List<AbstractControl<dynamic>> - +validAnswerOptions: List<String> - +boolOptions: List<AbstractControl<String>> - +scaleMinValue: int - +scaleMaxValue: int - +scaleRange: int - +scaleAllValueControls: List<AbstractControl<int>> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +questionTextRequired: dynamic - +numValidChoiceOptions: dynamic - +scaleRangeValid: dynamic - +titles: Map<FormMode, String> - +isAddOptionButtonVisible: bool - +isMidValuesClearedInfoVisible: bool + + + + + + + + + PublishSuccessDialog - - - +String? scaleMidLabelAt() - -dynamic _onScaleRangeChanged() - -dynamic _applyInputFormatters() - -dynamic _updateScaleMidValueControls() - -Map<String, dynamic>? _validateFreeText() - -dynamic _onFreeTextLengthChanged() - -List<FormControlValidation> _getValidationConfig() - +dynamic onQuestionTypeChanged() - +dynamic onResponseOptionsChanged() - -void _updateFormControls() - +void initControls() - +void setControlsFrom() - +QuestionFormData buildFormData() - +List<ModelAction<dynamic>> availableActions() - +void onNewItem() - +void onSelectItem() - +dynamic save() - +QuestionFormViewModel createDuplicate() + + + +Widget build() - - - - + + + + - - - IScaleQuestionFormViewModel + + + PublishDialog - - - +isMidValuesClearedInfoVisible: bool + + + +Widget build() - - - - + + + + - - - ScaleQuestionFormView + + + PublishConfirmationDialog - - - +formViewModel: QuestionFormViewModel + + + +Widget build() - - - - - + + + + + - - - ChoiceQuestionFormView + + + FrameControlsWidget - - - +formViewModel: QuestionFormViewModel + + + +onRefresh: void Function()? + +onOpenNewTab: void Function()? + +enabled: bool - - - +Widget build() + + + +Widget build() - - - - - + + + + - - - BoolQuestionFormView + + + IStudyStatusBadgeViewModel - - - +formViewModel: QuestionFormViewModel + + + +studyParticipation: Participation? + +studyStatus: StudyStatus? - - - +Widget build() + + + + + + + + Participation - - - - - + + + - - - FreeTextQuestionFormView + + + StudyStatus - - - +formViewModel: QuestionFormViewModel - +generateLabelHelpTextMap: dynamic + + + + + + + + + + StudyStatusBadge - - - +Widget build() - +Widget disableOnReadonly() - +Widget generateRow() + + + +participation: Participation? + +status: StudyStatus? + +type: BadgeType + +showPrefixIcon: bool + +showTooltip: bool + + + + + + +Widget build() - - - - + + + + + - - - IListActionProvider + + + RouteInformation - - - +void onSelectItem() - +void onNewItem() + + + +route: String? + +extra: String? + +cmd: String? + +data: String? + + + + + + +String toString() - - - - - + + + + + - - - WithQuestionnaireControls + + + PlatformController - - - +questionsArray: FormArray<dynamic> - +questionFormViewModels: FormViewModelCollection<Q, QuestionFormData> - +questionnaireControls: Map<String, FormArray<dynamic>> - +propagateOnSave: bool - +questionModels: List<Q> - +questionTitles: Map<FormMode, String Function()> + + + +studyId: String + +baseSrc: String + +previewSrc: String + +routeInformation: RouteInformation + +frameWidget: Widget - - - +void setQuestionnaireControlsFrom() - +QuestionnaireFormData buildQuestionnaireFormData() - +void read() - +void onCancel() - +dynamic onSave() - +Q provide() - +Q provideQuestionFormViewModel() + + + +void activate() + +void registerViews() + +void generateUrl() + +void navigate() + +void refresh() + +void listen() + +void send() + +void openNewPage() - - - - + + + + + - - - IProviderArgsResolver + + + WebController - - - +R provide() + + + +iFrameElement: IFrameElement + + + + + + +void activate() + +void registerViews() + +void generateUrl() + +void navigate() + +void refresh() + +void openNewPage() + +void listen() + +void send() - - - - - + + + - - - QuestionnaireFormData + + + IFrameElement - - - +questionsData: List<QuestionFormData>? - +id: String + + + + + + + + + MobileController - - - +StudyUQuestionnaire toQuestionnaire() - +List<EligibilityCriterion> toEligibilityCriteria() - +QuestionnaireFormData copy() + + + +void openNewPage() + +void refresh() + +void registerViews() + +void listen() + +void send() + +void navigate() + +void activate() + +void generateUrl() - - - - - + + + + + - - - IFormDataWithSchedule + + + StudyController - - - +instanceId: String - +isTimeLocked: bool - +timeLockStart: StudyUTimeOfDay? - +timeLockEnd: StudyUTimeOfDay? - +hasReminder: bool - +reminderTime: StudyUTimeOfDay? + + + +notificationService: INotificationService + +studyEventsSubscription: StreamSubscription<ModelEvent<Study>>? + +studyActions: List<ModelAction<dynamic>> - - - +Schedule toSchedule() + + + +dynamic syncStudyStatus() + +dynamic onStudySubscriptionUpdate() + -dynamic _redirectNewToActualStudyID() + +dynamic publishStudy() + +void onChangeStudyParticipation() + +void onAddParticipants() + +void onSettingsPressed() + +void dispose() - - - + + + + - - - StudyUTimeOfDay + + + IStudyNavViewModel - - - - - - - - - - ScheduleControls + + + +isEditTabEnabled: bool + +isTestTabEnabled: bool + +isRecruitTabEnabled: bool + +isMonitorTabEnabled: bool + +isAnalyzeTabEnabled: bool + +isSettingsEnabled: bool - - - +formViewModel: WithScheduleControls + + + + + + + + + StudyNav - - - +Widget build() - -List<FormTableRow> _conditionalTimeRestrictions() + + + <static>+dynamic tabs() + <static>+dynamic edit() + <static>+dynamic test() + <static>+dynamic recruit() + <static>+dynamic monitor() + <static>+dynamic analyze() - - - - - - - - - WithScheduleControls - - + + + + - - - +isTimeRestrictedControl: FormControl<bool> - +instanceID: FormControl<String> - +restrictedTimeStartControl: FormControl<Time> - +restrictedTimeStartPickerControl: FormControl<TimeOfDay> - +restrictedTimeEndControl: FormControl<Time> - +restrictedTimeEndPickerControl: FormControl<TimeOfDay> - +hasReminderControl: FormControl<bool> - +reminderTimeControl: FormControl<Time> - +reminderTimePickerControl: FormControl<TimeOfDay> - -_reminderControlStream: StreamSubscription<dynamic>? - +scheduleFormControls: Map<String, FormControl<Object>> - +hasReminder: bool - +isTimeRestricted: bool - +timeRestriction: List<Time>? + + + StudyDesignNav - - - +void setScheduleControlsFrom() - -dynamic _initReminderControl() + + + <static>+dynamic tabs() + <static>+dynamic info() + <static>+dynamic enrollment() + <static>+dynamic interventions() + <static>+dynamic measurements() + <static>+dynamic reports() - - - - - + + + + + - - - InterventionFormViewModel + + + StudyParticipationBadge - - - +study: Study - +interventionIdControl: FormControl<String> - +interventionTitleControl: FormControl<String> - +interventionIconControl: FormControl<IconOption> - +interventionDescriptionControl: FormControl<String> - +interventionTasksArray: FormArray<dynamic> - +tasksCollection: FormViewModelCollection<InterventionTaskFormViewModel, InterventionTaskFormData> - +form: FormGroup - +interventionId: String - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titleRequired: dynamic - +atLeastOneTask: dynamic - +breadcrumbsTitle: String - +titles: Map<FormMode, String> + + + +participation: Participation + +type: BadgeType + +showPrefixIcon: bool + +center: bool - - - +void setControlsFrom() - +InterventionFormData buildFormData() - +List<ModelAction<dynamic>> availableActions() - +List<ModelAction<dynamic>> availablePopupActions() - +List<ModelAction<dynamic>> availableInlineActions() - +void onSelectItem() - +void onNewItem() - +void onCancel() - +dynamic onSave() - +InterventionTaskFormViewModel provide() - +InterventionTaskFormRouteArgs buildNewFormRouteArgs() - +InterventionTaskFormRouteArgs buildFormRouteArgs() - +InterventionFormViewModel createDuplicate() + + + +Widget build() - - - - - + + + + - - - StudyScheduleFormData + + + IStudyRepository - - - +sequenceType: PhaseSequence - +sequenceTypeCustom: String - +numCycles: int - +phaseDuration: int - +includeBaseline: bool - +id: String + + + +dynamic launch() + +dynamic deleteParticipants() - - - +StudySchedule toStudySchedule() - +Study apply() - +StudyScheduleFormData copy() + + + + + + + + + PreviewFrame - - - - - - - - PhaseSequence + + + +studyId: String + +routeArgs: StudyFormRouteArgs? + +route: String? - - - - + + + + - - - IStudyFormData + + + IStudyAppBarViewModel - - - +Study apply() + + + +isSyncIndicatorVisible: bool + +isStatusBadgeVisible: bool + +isPublishVisible: bool - - - - - - - - - StudyScheduleFormView - - + + + + - - - +formViewModel: StudyScheduleControls + + + StudyScaffold - - - -FormTableRow _renderCustomSequence() - +Widget build() + + + +studyId: String + +tabs: List<NavbarTab>? + +tabsSubnav: List<NavbarTab>? + +selectedTab: NavbarTab? + +selectedTabSubnav: NavbarTab? + +body: StudyPageWidget + +drawer: Widget? + +disableActions: bool + +actionsSpacing: double + +actionsPadding: double + +layoutType: SingleColumnLayoutType? + +appbarHeight: double + +appbarSubnavHeight: double - - - - - + + + + + - - - StudyScheduleControls + + + WebFrame - - - <static>+defaultScheduleType: PhaseSequence - <static>+defaultScheduleTypeSequence: String - <static>+defaultNumCycles: int - <static>+defaultPeriodLength: int - +sequenceTypeControl: FormControl<PhaseSequence> - +sequenceTypeCustomControl: FormControl<String> - +phaseDurationControl: FormControl<int> - +numCyclesControl: FormControl<int> - +includeBaselineControl: FormControl<bool> - +studyScheduleControls: Map<String, FormControl<Object>> - <static>+kNumCyclesMin: int - <static>+kNumCyclesMax: int - <static>+kPhaseDurationMin: int - <static>+kPhaseDurationMax: int - +sequenceTypeControlOptions: List<FormControlOption<PhaseSequence>> - +studyScheduleValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +numCyclesRange: dynamic - +phaseDurationRange: dynamic - +customSequenceRequired: dynamic + + + +previewSrc: String + +studyId: String - - - +void setStudyScheduleControlsFrom() - +StudyScheduleFormData buildStudyScheduleFormData() - +bool isSequencingCustom() + + + +Widget build() - - - - + + + + - - - InterventionTaskFormView + + + DisabledFrame - - - +formViewModel: InterventionTaskFormViewModel + + + +Widget build() - - - - - + + + + + - - - InterventionTaskFormViewModel + + + PhoneContainer - - - +taskIdControl: FormControl<String> - +instanceIdControl: FormControl<String> - +taskTitleControl: FormControl<String> - +taskDescriptionControl: FormControl<String> - +markAsCompletedControl: FormControl<bool> - +form: FormGroup - +taskId: String - +instanceId: String - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titleRequired: dynamic - +titles: Map<FormMode, String> + + + <static>+defaultWidth: double + <static>+defaultHeight: double + +width: double + +height: double + +borderColor: Color + +borderWidth: double + +borderRadius: double + +innerContent: Widget + +innerContentBackgroundColor: Color? - - - +void setControlsFrom() - +InterventionTaskFormData buildFormData() - +InterventionTaskFormViewModel createDuplicate() + + + +Widget build() - - - - - + + + + - - - InterventionPreview + + + MobileFrame - - - +routeArgs: InterventionFormRouteArgs + + + +Widget build() - - - +Widget build() + + + + + + + + + DesktopFrame + + + + + + +Widget build() - - - - - + + + + + - - - InterventionsFormData + + + StudyTestScreen - - - +interventionsData: List<InterventionFormData> - +studyScheduleData: StudyScheduleFormData - +id: String + + + +previewRoute: String? - - - +Study apply() - +InterventionsFormData copy() + + + +Widget build() + +Widget? banner() + +dynamic load() + +dynamic save() + +dynamic showHelp() - - - - - + + + + + - - - InterventionTaskFormData + + + StudySettingsFormViewModel - - - +taskId: String - +taskTitle: String - +taskDescription: String? - <static>+kDefaultTitle: String - +id: String + + + +study: AsyncValue<Study> + +studyRepository: IStudyRepository + <static>+defaultPublishedToRegistry: bool + <static>+defaultPublishedToRegistryResults: bool + +isPublishedToRegistryControl: FormControl<bool> + +isPublishedToRegistryResultsControl: FormControl<bool> + +form: FormGroup + +titles: Map<FormMode, String> - - - +CheckmarkTask toTask() - +InterventionTaskFormData copy() + + + +void setControlsFrom() + +Study buildFormData() + +dynamic keepControlsSynced() + +dynamic save() + +dynamic setLaunchDefaults() - - - - + + + + - - - InterventionFormView + + + StudySettingsDialog - - - +formViewModel: InterventionFormViewModel + + + +Widget build() - - - - + + + + - - - StudyDesignInterventionsFormView + + + StudyTestController - - - +Widget build() + + + +authRepository: IAuthRepository + +languageCode: String - - - - + + + + - - - StudyDesignPageWidget + + + TestAppRoutes - - - +Widget? banner() + + + <static>+studyOverview: String + <static>+eligibility: String + <static>+intervention: String + <static>+consent: String + <static>+journey: String + <static>+dashboard: String - - - - - - - - - InterventionsFormViewModel - - + + + + + - - - +study: Study - +router: GoRouter - +interventionsArray: FormArray<dynamic> - +interventionsCollection: FormViewModelCollection<InterventionFormViewModel, InterventionFormData> - +form: FormGroup - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +interventionsRequired: dynamic - +titles: Map<FormMode, String> - +canTestStudySchedule: bool + + + DrawerEntry - - - +void setControlsFrom() - +InterventionsFormData buildFormData() - +void read() - +List<ModelAction<dynamic>> availableActions() - +List<ModelAction<dynamic>> availablePopupActions() - +List<ModelAction<dynamic>> availableInlineActions() - +void onSelectItem() - +void onNewItem() - +InterventionFormViewModel provide() - +void onCancel() - +dynamic onSave() - +dynamic testStudySchedule() + + + +localizedTitle: String Function() + +icon: IconData? + +localizedHelpText: String Function()? + +enabled: bool + +onSelected: void Function(BuildContext, WidgetRef)? + +autoCloseDrawer: bool + +title: String + +helpText: String? + + + + + + +void onClick() - - - - - + + + - - - InterventionFormData + + + String Function() - - - +interventionId: String - +title: String - +description: String? - +tasksData: List<InterventionTaskFormData>? - +iconName: String? - <static>+kDefaultTitle: String - +id: String + + + + + + + + String Function()? - - - +Intervention toIntervention() - +InterventionFormData copy() + + + + + + + + void Function(BuildContext, WidgetRef)? - - - - - + + + + + - - - EnrollmentFormData + + + GoRouterDrawerEntry - - - <static>+kDefaultEnrollmentType: Participation - +enrollmentType: Participation - +questionnaireFormData: QuestionnaireFormData - +consentItemsFormData: List<ConsentItemFormData>? - +id: String + + + +intent: RoutingIntent + +onNavigated: void Function()? - - - +Study apply() - +EnrollmentFormData copy() + + + +void onClick() - - - - - + + + + - - - ConsentItemFormViewModel + + + AppDrawer - - - +consentIdControl: FormControl<String> - +titleControl: FormControl<String> - +descriptionControl: FormControl<String> - +iconControl: FormControl<IconOption> - +form: FormGroup - +consentId: String - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titleRequired: dynamic - +descriptionRequired: dynamic - +titles: Map<FormMode, String> + + + +width: int + +autoCloseDrawer: bool + +leftPaddingEntries: double + +logoPaddingVertical: double + +logoPaddingHorizontal: double + +logoMaxHeight: double + +logoSectionMinHeight: double + +logoSectionMaxHeight: double - - - +void setControlsFrom() - +ConsentItemFormData buildFormData() - +ConsentItemFormViewModel createDuplicate() + + + + + + + + + StudyAnalyzeScreen + + + + + + +Widget? banner() + +Widget build() - - - - + + + + - - - ConsentItemFormView + + + StudyAnalyzeController - - - +formViewModel: ConsentItemFormViewModel + + + +dynamic onExport() - - - - + + + + - - - IScreenerQuestionLogicFormViewModel + + + StudyDesignInterventionsFormView - - - +isDirtyOptionsBannerVisible: bool + + + +Widget build() - - - - - + + + + - - - ScreenerQuestionLogicFormView + + + StudyDesignPageWidget - - - +formViewModel: ScreenerQuestionFormViewModel + + + +Widget? banner() - - - +Widget build() - -dynamic _buildInfoBanner() - -dynamic _buildAnswerOptionsLogicControls() - -List<Widget> _buildOptionLogicRow() + + + + + + + + + InterventionFormView + + + + + + +formViewModel: InterventionFormViewModel - - - - - + + + + + - - - ScreenerQuestionFormViewModel + + + InterventionFormViewModel - - - <static>+defaultResponseOptionValidity: bool - +responseOptionsDisabledArray: FormArray<dynamic> - +responseOptionsLogicControls: FormArray<bool> - +responseOptionsLogicDescriptionControls: FormArray<String> - -_questionBaseControls: Map<String, AbstractControl<dynamic>> - +prevResponseOptionControls: List<AbstractControl<dynamic>> - +prevResponseOptionValues: List<dynamic> - +responseOptionsDisabledControls: List<AbstractControl<dynamic>> - +logicControlOptions: List<FormControlOption<bool>> - +questionBaseControls: Map<String, AbstractControl<dynamic>> - +isDirtyOptionsBannerVisible: bool + + + +study: Study + +interventionIdControl: FormControl<String> + +interventionTitleControl: FormControl<String> + +interventionIconControl: FormControl<IconOption> + +interventionDescriptionControl: FormControl<String> + +interventionTasksArray: FormArray<dynamic> + +tasksCollection: FormViewModelCollection<InterventionTaskFormViewModel, InterventionTaskFormData> + +form: FormGroup + +interventionId: String + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titleRequired: dynamic + +atLeastOneTask: dynamic + +breadcrumbsTitle: String + +titles: Map<FormMode, String> - - - +dynamic onResponseOptionsChanged() - +void setControlsFrom() - +QuestionFormData buildFormData() - -List<FormControl<dynamic>> _copyFormControls() - -AbstractControl<dynamic>? _findAssociatedLogicControlFor() - -AbstractControl<dynamic>? _findAssociatedControlFor() - +ScreenerQuestionFormViewModel createDuplicate() + + + +void setControlsFrom() + +InterventionFormData buildFormData() + +List<ModelAction<dynamic>> availableActions() + +List<ModelAction<dynamic>> availablePopupActions() + +List<ModelAction<dynamic>> availableInlineActions() + +void onSelectItem() + +void onNewItem() + +void onCancel() + +dynamic onSave() + +InterventionTaskFormViewModel provide() + +InterventionTaskFormRouteArgs buildNewFormRouteArgs() + +InterventionTaskFormRouteArgs buildFormRouteArgs() + +InterventionFormViewModel createDuplicate() - - - - + + + + + - - - StudyDesignEnrollmentFormView + + + InterventionPreview - - - +Widget build() - -dynamic _showScreenerQuestionSidesheetWithArgs() - -dynamic _showConsentItemSidesheetWithArgs() + + + +routeArgs: InterventionFormRouteArgs + + + + + + +Widget build() - - - - - + + + + + - - - ConsentItemFormData + + + StudyScheduleFormView - - - +consentId: String - +title: String - +description: String - +iconName: String? - +id: String + + + +formViewModel: StudyScheduleControls - - - +ConsentItem toConsentItem() - +ConsentItemFormData copy() + + + -FormTableRow _renderCustomSequence() + +Widget build() - - - - - + + + + + - - - EnrollmentFormViewModel + + + StudyScheduleControls - - - +study: Study - +router: GoRouter - +consentItemDelegate: EnrollmentFormConsentItemDelegate - +enrollmentTypeControl: FormControl<Participation> - +consentItemArray: FormArray<dynamic> - +consentItemFormViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData> - +form: FormGroup - +enrollmentTypeControlOptions: List<FormControlOption<Participation>> - +consentItemModels: List<ConsentItemFormViewModel> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titles: Map<FormMode, String> - +canTestScreener: bool - +canTestConsent: bool - +questionTitles: Map<FormMode, String Function()> + + + <static>+defaultScheduleType: PhaseSequence + <static>+defaultScheduleTypeSequence: String + <static>+defaultNumCycles: int + <static>+defaultPeriodLength: int + +sequenceTypeControl: FormControl<PhaseSequence> + +sequenceTypeCustomControl: FormControl<String> + +phaseDurationControl: FormControl<int> + +numCyclesControl: FormControl<int> + +includeBaselineControl: FormControl<bool> + +studyScheduleControls: Map<String, FormControl<Object>> + <static>+kNumCyclesMin: int + <static>+kNumCyclesMax: int + <static>+kPhaseDurationMin: int + <static>+kPhaseDurationMax: int + +sequenceTypeControlOptions: List<FormControlOption<PhaseSequence>> + +studyScheduleValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +numCyclesRange: dynamic + +phaseDurationRange: dynamic + +customSequenceRequired: dynamic - - - +void setControlsFrom() - +EnrollmentFormData buildFormData() - +void read() - +List<ModelAction<dynamic>> availableActions() - +List<ModelAction<dynamic>> availablePopupActions() - +List<ModelAction<dynamic>> availableInlineActions() - +void onSelectItem() - +void onNewItem() - +ScreenerQuestionFormRouteArgs buildNewScreenerQuestionFormRouteArgs() - +ScreenerQuestionFormRouteArgs buildScreenerQuestionFormRouteArgs() - +ConsentItemFormRouteArgs buildNewConsentItemFormRouteArgs() - +ConsentItemFormRouteArgs buildConsentItemFormRouteArgs() - +dynamic testScreener() - +dynamic testConsent() - +ScreenerQuestionFormViewModel provideQuestionFormViewModel() + + + +void setStudyScheduleControlsFrom() + +StudyScheduleFormData buildStudyScheduleFormData() + +bool isSequencingCustom() - - - - - + + + + + - - - EnrollmentFormConsentItemDelegate + + + InterventionTaskFormData - - - +formViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData> - +owner: EnrollmentFormViewModel - +propagateOnSave: bool - +validationSet: dynamic + + + +taskId: String + +taskTitle: String + +taskDescription: String? + <static>+kDefaultTitle: String + +id: String - - - +void onCancel() - +dynamic onSave() - +ConsentItemFormViewModel provide() - +List<ModelAction<dynamic>> availableActions() - +void onNewItem() - +void onSelectItem() + + + +CheckmarkTask toTask() + +InterventionTaskFormData copy() - - - - - + + + + + - - - MeasurementsFormViewModel + + + IFormDataWithSchedule - - - +study: Study - +router: GoRouter - +measurementsArray: FormArray<dynamic> - +surveyMeasurementFormViewModels: FormViewModelCollection<MeasurementSurveyFormViewModel, MeasurementSurveyFormData> - +form: FormGroup - +measurementViewModels: List<MeasurementSurveyFormViewModel> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +measurementRequired: dynamic - +titles: Map<FormMode, String> + + + +instanceId: String + +isTimeLocked: bool + +timeLockStart: StudyUTimeOfDay? + +timeLockEnd: StudyUTimeOfDay? + +hasReminder: bool + +reminderTime: StudyUTimeOfDay? - - - +void read() - +void setControlsFrom() - +MeasurementsFormData buildFormData() - +List<ModelAction<dynamic>> availableActions() - +List<ModelAction<dynamic>> availablePopupActions() - +List<ModelAction<dynamic>> availableInlineActions() - +void onSelectItem() - +void onNewItem() - +MeasurementSurveyFormViewModel provide() - +void onCancel() - +dynamic onSave() + + + +Schedule toSchedule() - - - - - + + + + + - - - MeasurementSurveyFormData + + + InterventionsFormViewModel - - - +measurementId: String - +title: String - +introText: String? - +outroText: String? - +questionnaireFormData: QuestionnaireFormData - <static>+kDefaultTitle: String - +id: String + + + +study: Study + +router: GoRouter + +interventionsArray: FormArray<dynamic> + +interventionsCollection: FormViewModelCollection<InterventionFormViewModel, InterventionFormData> + +form: FormGroup + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +interventionsRequired: dynamic + +titles: Map<FormMode, String> + +canTestStudySchedule: bool - - - +QuestionnaireTask toQuestionnaireTask() - +MeasurementSurveyFormData copy() + + + +void setControlsFrom() + +InterventionsFormData buildFormData() + +void read() + +List<ModelAction<dynamic>> availableActions() + +List<ModelAction<dynamic>> availablePopupActions() + +List<ModelAction<dynamic>> availableInlineActions() + +void onSelectItem() + +void onNewItem() + +InterventionFormViewModel provide() + +void onCancel() + +dynamic onSave() + +dynamic testStudySchedule() - - - - - + + + + + - - - SurveyPreview + + + InterventionTaskFormViewModel - - - +routeArgs: MeasurementFormRouteArgs + + + +taskIdControl: FormControl<String> + +instanceIdControl: FormControl<String> + +taskTitleControl: FormControl<String> + +taskDescriptionControl: FormControl<String> + +markAsCompletedControl: FormControl<bool> + +form: FormGroup + +taskId: String + +instanceId: String + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titleRequired: dynamic + +titles: Map<FormMode, String> - - - +Widget build() + + + +void setControlsFrom() + +InterventionTaskFormData buildFormData() + +InterventionTaskFormViewModel createDuplicate() - - - - - + + + + + - - - MeasurementSurveyFormViewModel + + + WithScheduleControls - - - +study: Study - +measurementIdControl: FormControl<String> - +instanceIdControl: FormControl<String> - +surveyTitleControl: FormControl<String> - +surveyIntroTextControl: FormControl<String> - +surveyOutroTextControl: FormControl<String> - +form: FormGroup - +measurementId: String - +instanceId: String - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titleRequired: dynamic - +atLeastOneQuestion: dynamic - +breadcrumbsTitle: String - +titles: Map<FormMode, String> + + + +isTimeRestrictedControl: FormControl<bool> + +instanceID: FormControl<String> + +restrictedTimeStartControl: FormControl<Time> + +restrictedTimeStartPickerControl: FormControl<TimeOfDay> + +restrictedTimeEndControl: FormControl<Time> + +restrictedTimeEndPickerControl: FormControl<TimeOfDay> + +hasReminderControl: FormControl<bool> + +reminderTimeControl: FormControl<Time> + +reminderTimePickerControl: FormControl<TimeOfDay> + -_reminderControlStream: StreamSubscription<dynamic>? + +scheduleFormControls: Map<String, FormControl<Object>> + +hasReminder: bool + +isTimeRestricted: bool + +timeRestriction: List<Time>? - - - +void setControlsFrom() - +MeasurementSurveyFormData buildFormData() - +List<ModelAction<dynamic>> availableActions() - +List<ModelAction<dynamic>> availablePopupActions() - +List<ModelAction<dynamic>> availableInlineActions() - +void onSelectItem() - +void onNewItem() - +SurveyQuestionFormRouteArgs buildNewFormRouteArgs() - +SurveyQuestionFormRouteArgs buildFormRouteArgs() - +MeasurementSurveyFormViewModel createDuplicate() + + + +void setScheduleControlsFrom() + -dynamic _initReminderControl() - - - - + + + - - - MeasurementSurveyFormView + + + PhaseSequence - - - +formViewModel: MeasurementSurveyFormViewModel + + + + + + + + + + InterventionFormData + + + + + + +interventionId: String + +title: String + +description: String? + +tasksData: List<InterventionTaskFormData>? + +iconName: String? + <static>+kDefaultTitle: String + +id: String + + + + + + +Intervention toIntervention() + +InterventionFormData copy() - - - - - + + + + + - - - MeasurementsFormData + + + StudyScheduleFormData - - - +surveyMeasurements: List<MeasurementSurveyFormData> - +id: String + + + +sequenceType: PhaseSequence + +sequenceTypeCustom: String + +numCycles: int + +phaseDuration: int + +includeBaseline: bool + +id: String - - - +Study apply() - +MeasurementsFormData copy() + + + +StudySchedule toStudySchedule() + +Study apply() + +StudyScheduleFormData copy() - - - - + + + + - - - StudyDesignMeasurementsFormView + + + IStudyFormData - - - +Widget build() + + + +Study apply() - - - - + + + + - - - StudyDesignInfoFormView + + + InterventionTaskFormView - - - +Widget build() + + + +formViewModel: InterventionTaskFormViewModel - - - - - + + + + + - - - StudyInfoFormData + + + InterventionsFormData - - - +title: String - +description: String? - +iconName: String - +contactInfoFormData: StudyContactInfoFormData - +id: String + + + +interventionsData: List<InterventionFormData> + +studyScheduleData: StudyScheduleFormData + +id: String - - - +Study apply() - +StudyInfoFormData copy() + + + +Study apply() + +InterventionsFormData copy() - - - - - + + + + - - - StudyContactInfoFormData + + + StudyDesignReportsFormView - - - +organization: String? - +institutionalReviewBoard: String? - +institutionalReviewBoardNumber: String? - +researchers: String? - +email: String? - +website: String? - +phone: String? - +additionalInfo: String? - +id: String + + + +Widget build() + -dynamic _showReportItemSidesheetWithArgs() - - - +Study apply() - +StudyInfoFormData copy() + + + + + + + + + + ReportItemFormData - - - - - - - - - - StudyInfoFormViewModel + + + +isPrimary: bool + +section: ReportSection + +id: String - - - +study: Study - +titleControl: FormControl<String> - +iconControl: FormControl<IconOption> - +descriptionControl: FormControl<String> - +organizationControl: FormControl<String> - +reviewBoardControl: FormControl<String> - +reviewBoardNumberControl: FormControl<String> - +researchersControl: FormControl<String> - +emailControl: FormControl<String> - +websiteControl: FormControl<String> - +phoneControl: FormControl<String> - +additionalInfoControl: FormControl<String> - +form: FormGroup - +titles: Map<FormMode, String> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titleRequired: dynamic - +descriptionRequired: dynamic - +iconRequired: dynamic - +organizationRequired: dynamic - +reviewBoardRequired: dynamic - +reviewBoardNumberRequired: dynamic - +researchersRequired: dynamic - +emailRequired: dynamic - +phoneRequired: dynamic - +emailFormat: dynamic - +websiteFormat: dynamic + + + <static>+dynamic fromDomainModel() + +ReportItemFormData copy() - - - +void setControlsFrom() - +StudyInfoFormData buildFormData() + + + + + + + + ReportSection - - - - - + + + + + - - - StudyFormViewModel + + + DataReferenceEditor - - - +studyDirtyCopy: Study? - +studyRepository: IStudyRepository - +authRepository: IAuthRepository - +router: GoRouter - +studyInfoFormViewModel: StudyInfoFormViewModel - +enrollmentFormViewModel: EnrollmentFormViewModel - +measurementsFormViewModel: MeasurementsFormViewModel - +reportsFormViewModel: ReportsFormViewModel - +interventionsFormViewModel: InterventionsFormViewModel - +form: FormGroup - +isStudyReadonly: bool - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titles: Map<FormMode, String> + + + +formControl: FormControl<DataReferenceIdentifier<T>> + +availableTasks: List<Task> + +buildReactiveDropdownField: ReactiveDropdownField<dynamic> - - - +void read() - +void setControlsFrom() - +Study buildFormData() - +void dispose() - +void onCancel() - +dynamic onSave() - -dynamic _applyAndSaveSubform() + + + +FormTableRow buildFormTableRow() + -List<DropdownMenuItem<DataReferenceIdentifier<dynamic>>> _dataReferenceItems() - - - - - + + + - - - ReportsFormViewModel + + + ReactiveDropdownField - - - +study: Study - +router: GoRouter - +reportItemDelegate: ReportFormItemDelegate - +reportItemArray: FormArray<dynamic> - +reportItemFormViewModels: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData> - +form: FormGroup - +reportItemModels: List<ReportItemFormViewModel> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titles: Map<FormMode, String> - +canTestConsent: bool + + + + + + + + + + TemporalAggregationFormatted + + + + + + -_value: TemporalAggregation + <static>+values: List<TemporalAggregationFormatted> + +value: TemporalAggregation + +string: String + +icon: IconData? + +hashCode: int - - - +void setControlsFrom() - +ReportsFormData buildFormData() - +void read() - +ReportItemFormRouteArgs buildNewReportItemFormRouteArgs() - +ReportItemFormRouteArgs buildReportItemFormRouteArgs() - +dynamic testReport() - +void onCancel() - +dynamic onSave() - +ReportItemFormViewModel provide() + + + +bool ==() + +String toString() + +String toJson() + <static>+TemporalAggregationFormatted fromJson() - - - - - + + + - - - ReportsFormData + + + TemporalAggregation - - - +reportItems: List<ReportItemFormData> - +id: String + + + + + + + + + + ImprovementDirectionFormatted - - - +Study apply() - +ReportsFormData copy() + + + -_value: ImprovementDirection + <static>+values: List<ImprovementDirectionFormatted> + +value: ImprovementDirection + +string: String + +icon: IconData? + +hashCode: int - - - - - - - - - ReportStatus + + + +bool ==() + +String toString() + +String toJson() + <static>+ImprovementDirectionFormatted fromJson() - - - +index: int - <static>+values: List<ReportStatus> - <static>+primary: ReportStatus - <static>+secondary: ReportStatus + + + + + + + + ImprovementDirection - - - - - + + + + - - - ReportItemFormData + + + ReportSectionType - - - +isPrimary: bool - +section: ReportSection - +id: String + + + +index: int + <static>+values: List<ReportSectionType> + <static>+average: ReportSectionType + <static>+linearRegression: ReportSectionType - - - <static>+dynamic fromDomainModel() - +ReportItemFormData copy() + + + + + + + + + + AverageSectionFormView - - - - + + + +formViewModel: ReportItemFormViewModel + +studyId: String + +reportSectionColumnWidth: Map<int, TableColumnWidth> + + - - - ReportSection + + + +Widget build() - - - + + + - + ReportItemFormViewModel - + <static>+defaultSectionType: ReportSectionType +sectionIdControl: FormControl<String> @@ -13767,7 +13589,7 @@ - + -List<FormControlValidation> _getValidationConfig() +ReportItemFormData buildFormData() @@ -13779,40 +13601,55 @@ - - - - + + + + + - - - ReportSectionType + + + DataReferenceIdentifier - - - +index: int - <static>+values: List<ReportSectionType> - <static>+average: ReportSectionType - <static>+linearRegression: ReportSectionType + + + +hashCode: int + + + + + + +bool ==() + + + + + + + + + + + DataReference - - - + + + - + LinearRegressionSectionFormView - + +formViewModel: ReportItemFormViewModel +studyId: String @@ -13820,2274 +13657,2657 @@ - - - +Widget build() + + + +Widget build() + + + + + + + + + + + + + ReportItemFormView + + + + + + +formViewModel: ReportItemFormViewModel + +studyId: String + +reportSectionColumnWidth: dynamic + +sectionTypeBodyBuilder: Widget Function(BuildContext) + + + + + + +Widget build() + -dynamic _buildSectionText() + -dynamic _buildSectionTypeHeader() + + + + + + + + + + + + + ReportsFormViewModel + + + + + + +study: Study + +router: GoRouter + +reportItemDelegate: ReportFormItemDelegate + +reportItemArray: FormArray<dynamic> + +reportItemFormViewModels: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData> + +form: FormGroup + +reportItemModels: List<ReportItemFormViewModel> + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titles: Map<FormMode, String> + +canTestConsent: bool + + + + + + +void setControlsFrom() + +ReportsFormData buildFormData() + +void read() + +ReportItemFormRouteArgs buildNewReportItemFormRouteArgs() + +ReportItemFormRouteArgs buildReportItemFormRouteArgs() + +dynamic testReport() + +void onCancel() + +dynamic onSave() + +ReportItemFormViewModel provide() + + + + + + + + + + + + + ReportFormItemDelegate + + + + + + +formViewModelCollection: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData> + +owner: ReportsFormViewModel + +propagateOnSave: bool + +validationSet: dynamic + + + + + + +void onCancel() + +dynamic onSave() + +ReportItemFormViewModel provide() + +List<ModelAction<dynamic>> availableActions() + +void onNewItem() + +void onSelectItem() + + + + + + + + + + + + + ReportBadge + + + + + + +status: ReportStatus? + +type: BadgeType + +showPrefixIcon: bool + +showTooltip: bool + + + + + + +Widget build() + + + + + + + + + + + + ReportStatus + + + + + + +index: int + <static>+values: List<ReportStatus> + <static>+primary: ReportStatus + <static>+secondary: ReportStatus - - - - - + + + + + - - - AverageSectionFormView + + + ReportsFormData - - - +formViewModel: ReportItemFormViewModel - +studyId: String - +reportSectionColumnWidth: Map<int, TableColumnWidth> + + + +reportItems: List<ReportItemFormData> + +id: String - - - +Widget build() + + + +Study apply() + +ReportsFormData copy() - - - - - + + + + + - - - TemporalAggregationFormatted + + + StudyInfoFormViewModel - - - -_value: TemporalAggregation - <static>+values: List<TemporalAggregationFormatted> - +value: TemporalAggregation - +string: String - +icon: IconData? - +hashCode: int + + + +study: Study + +titleControl: FormControl<String> + +iconControl: FormControl<IconOption> + +descriptionControl: FormControl<String> + +organizationControl: FormControl<String> + +reviewBoardControl: FormControl<String> + +reviewBoardNumberControl: FormControl<String> + +researchersControl: FormControl<String> + +emailControl: FormControl<String> + +websiteControl: FormControl<String> + +phoneControl: FormControl<String> + +additionalInfoControl: FormControl<String> + +form: FormGroup + +titles: Map<FormMode, String> + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titleRequired: dynamic + +descriptionRequired: dynamic + +iconRequired: dynamic + +organizationRequired: dynamic + +reviewBoardRequired: dynamic + +reviewBoardNumberRequired: dynamic + +researchersRequired: dynamic + +emailRequired: dynamic + +phoneRequired: dynamic + +emailFormat: dynamic + +websiteFormat: dynamic - - - +bool ==() - +String toString() - +String toJson() - <static>+TemporalAggregationFormatted fromJson() + + + +void setControlsFrom() + +StudyInfoFormData buildFormData() - - - + + + + - - - TemporalAggregation + + + StudyDesignInfoFormView - - - - - - - - - - ImprovementDirectionFormatted + + + +Widget build() - - - -_value: ImprovementDirection - <static>+values: List<ImprovementDirectionFormatted> - +value: ImprovementDirection - +string: String - +icon: IconData? - +hashCode: int + + + + + + + + + + StudyInfoFormData - - - +bool ==() - +String toString() - +String toJson() - <static>+ImprovementDirectionFormatted fromJson() + + + +title: String + +description: String? + +iconName: String + +contactInfoFormData: StudyContactInfoFormData + +id: String - - - - - - - - ImprovementDirection + + + +Study apply() + +StudyInfoFormData copy() - - - - - + + + + + - - - DataReferenceEditor + + + StudyContactInfoFormData - - - +formControl: FormControl<DataReferenceIdentifier<T>> - +availableTasks: List<Task> - +buildReactiveDropdownField: ReactiveDropdownField<dynamic> + + + +organization: String? + +institutionalReviewBoard: String? + +institutionalReviewBoardNumber: String? + +researchers: String? + +email: String? + +website: String? + +phone: String? + +additionalInfo: String? + +id: String - - - +FormTableRow buildFormTableRow() - -List<DropdownMenuItem<DataReferenceIdentifier<dynamic>>> _dataReferenceItems() + + + +Study apply() + +StudyInfoFormData copy() - - - + + + + - - - ReactiveDropdownField + + + StudyFormValidationSet - - - - - - - - - - DataReferenceIdentifier + + + +index: int + <static>+values: List<StudyFormValidationSet> - - - +hashCode: int + + + + + + + + + + MeasurementsFormData - - - +bool ==() + + + +surveyMeasurements: List<MeasurementSurveyFormData> + +id: String - - - - - - - - DataReference + + + +Study apply() + +MeasurementsFormData copy() - - - - - + + + + - - - ReportItemFormView + + + MeasurementSurveyFormView - - - +formViewModel: ReportItemFormViewModel - +studyId: String - +reportSectionColumnWidth: dynamic - +sectionTypeBodyBuilder: Widget Function(BuildContext) + + + +formViewModel: MeasurementSurveyFormViewModel - - - +Widget build() - -dynamic _buildSectionText() - -dynamic _buildSectionTypeHeader() + + + + + + + + + + MeasurementSurveyFormViewModel - - - - - - - - - StudyDesignReportsFormView + + + +study: Study + +measurementIdControl: FormControl<String> + +instanceIdControl: FormControl<String> + +surveyTitleControl: FormControl<String> + +surveyIntroTextControl: FormControl<String> + +surveyOutroTextControl: FormControl<String> + +form: FormGroup + +measurementId: String + +instanceId: String + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titleRequired: dynamic + +atLeastOneQuestion: dynamic + +breadcrumbsTitle: String + +titles: Map<FormMode, String> - - - +Widget build() - -dynamic _showReportItemSidesheetWithArgs() + + + +void setControlsFrom() + +MeasurementSurveyFormData buildFormData() + +List<ModelAction<dynamic>> availableActions() + +List<ModelAction<dynamic>> availablePopupActions() + +List<ModelAction<dynamic>> availableInlineActions() + +void onSelectItem() + +void onNewItem() + +SurveyQuestionFormRouteArgs buildNewFormRouteArgs() + +SurveyQuestionFormRouteArgs buildFormRouteArgs() + +MeasurementSurveyFormViewModel createDuplicate() - - - - - - + + + + + + - - - ReportFormItemDelegate + + + SurveyPreview - - - +formViewModelCollection: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData> - +owner: ReportsFormViewModel - +propagateOnSave: bool - +validationSet: dynamic + + + +routeArgs: MeasurementFormRouteArgs - - - +void onCancel() - +dynamic onSave() - +ReportItemFormViewModel provide() - +List<ModelAction<dynamic>> availableActions() - +void onNewItem() - +void onSelectItem() + + + +Widget build() - - - - - + + + + + - - - ReportBadge + + + MeasurementSurveyFormData - - - +status: ReportStatus? - +type: BadgeType - +showPrefixIcon: bool - +showTooltip: bool + + + +measurementId: String + +title: String + +introText: String? + +outroText: String? + +questionnaireFormData: QuestionnaireFormData + <static>+kDefaultTitle: String + +id: String - - - +Widget build() + + + +QuestionnaireTask toQuestionnaireTask() + +MeasurementSurveyFormData copy() - - - - - - - - AccountSettingsDialog - - + + + + + - - - +Widget build() + + + QuestionnaireFormData - - - - - - - - - IAppRepository + + + +questionsData: List<QuestionFormData>? + +id: String - - - +dynamic fetchAppConfig() - +void dispose() + + + +StudyUQuestionnaire toQuestionnaire() + +List<EligibilityCriterion> toEligibilityCriteria() + +QuestionnaireFormData copy() - - - - - + + + + + - - - AppRepository + + + WithQuestionnaireControls - - - +apiClient: StudyUApi + + + +questionsArray: FormArray<dynamic> + +questionFormViewModels: FormViewModelCollection<Q, QuestionFormData> + +questionnaireControls: Map<String, FormArray<dynamic>> + +propagateOnSave: bool + +questionModels: List<Q> + +questionTitles: Map<FormMode, String Function()> - - - +dynamic fetchAppConfig() - +void dispose() + + + +void setQuestionnaireControlsFrom() + +QuestionnaireFormData buildQuestionnaireFormData() + +void read() + +void onCancel() + +dynamic onSave() + +Q provide() + +Q provideQuestionFormViewModel() - - - - + + + + - - - StudyUApi + + + StudyDesignMeasurementsFormView - - - +dynamic saveStudy() - +dynamic fetchStudy() - +dynamic getUserStudies() - +dynamic deleteStudy() - +dynamic saveStudyInvite() - +dynamic fetchStudyInvite() - +dynamic deleteStudyInvite() - +dynamic deleteParticipants() - +dynamic fetchAppConfig() - +dynamic fetchUser() - +dynamic saveUser() + + + +Widget build() - - - + + + + + - - - User + + + MeasurementsFormViewModel - - - - + + + +study: Study + +router: GoRouter + +measurementsArray: FormArray<dynamic> + +surveyMeasurementFormViewModels: FormViewModelCollection<MeasurementSurveyFormViewModel, MeasurementSurveyFormData> + +form: FormGroup + +measurementViewModels: List<MeasurementSurveyFormViewModel> + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +measurementRequired: dynamic + +titles: Map<FormMode, String> + + - - - Session + + + +void read() + +void setControlsFrom() + +MeasurementsFormData buildFormData() + +List<ModelAction<dynamic>> availableActions() + +List<ModelAction<dynamic>> availablePopupActions() + +List<ModelAction<dynamic>> availableInlineActions() + +void onSelectItem() + +void onNewItem() + +MeasurementSurveyFormViewModel provide() + +void onCancel() + +dynamic onSave() - - - - - + + + + + - - - AuthRepository + + + StudyFormScaffold - - - +supabaseClient: SupabaseClient - +sharedPreferences: SharedPreferences - +allowPasswordReset: bool - +authClient: GoTrueClient - +session: Session? - +serializedSession: String? - +currentUser: User? - +isLoggedIn: bool + + + +studyId: String + +formViewModelBuilder: T Function(WidgetRef) + +formViewBuilder: Widget Function(T) - - - -void _registerAuthListener() - +dynamic signUp() - +dynamic signInWith() - +dynamic signOut() - +dynamic resetPasswordForEmail() - +dynamic updateUser() - +void dispose() - +dynamic onAppStart() + + + +Widget build() - - - + + + - - - SupabaseClient + + + T Function(WidgetRef) - - - + + + + + - - - GoTrueClient + + + ConsentItemFormViewModel - - - - - - - - StudyLaunched + + + +consentIdControl: FormControl<String> + +titleControl: FormControl<String> + +descriptionControl: FormControl<String> + +iconControl: FormControl<IconOption> + +form: FormGroup + +consentId: String + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titleRequired: dynamic + +descriptionRequired: dynamic + +titles: Map<FormMode, String> - - - - - - - - - ModelEvent + + + +void setControlsFrom() + +ConsentItemFormData buildFormData() + +ConsentItemFormViewModel createDuplicate() - - - +modelId: String - +model: T + + + + + + + + + StudyDesignEnrollmentFormView - - - - - - - - APIException + + + +Widget build() + -dynamic _showScreenerQuestionSidesheetWithArgs() + -dynamic _showConsentItemSidesheetWithArgs() - - - + + + + - - - StudyNotFoundException + + + IScreenerQuestionLogicFormViewModel - - - - - - - - MeasurementNotFoundException + + + +isDirtyOptionsBannerVisible: bool - - - + + + + + - - - QuestionNotFoundException + + + ScreenerQuestionLogicFormView - - - - + + + +formViewModel: ScreenerQuestionFormViewModel + + - - - ConsentItemNotFoundException + + + +Widget build() + -dynamic _buildInfoBanner() + -dynamic _buildAnswerOptionsLogicControls() + -List<Widget> _buildOptionLogicRow() - - - + + + + + - - - InterventionNotFoundException + + + ScreenerQuestionFormViewModel - - - - + + + <static>+defaultResponseOptionValidity: bool + +responseOptionsDisabledArray: FormArray<dynamic> + +responseOptionsLogicControls: FormArray<bool> + +responseOptionsLogicDescriptionControls: FormArray<String> + -_questionBaseControls: Map<String, AbstractControl<dynamic>> + +prevResponseOptionControls: List<AbstractControl<dynamic>> + +prevResponseOptionValues: List<dynamic> + +responseOptionsDisabledControls: List<AbstractControl<dynamic>> + +logicControlOptions: List<FormControlOption<bool>> + +questionBaseControls: Map<String, AbstractControl<dynamic>> + +isDirtyOptionsBannerVisible: bool + + - - - InterventionTaskNotFoundException + + + +dynamic onResponseOptionsChanged() + +void setControlsFrom() + +QuestionFormData buildFormData() + -List<FormControl<dynamic>> _copyFormControls() + -AbstractControl<dynamic>? _findAssociatedLogicControlFor() + -AbstractControl<dynamic>? _findAssociatedControlFor() + +ScreenerQuestionFormViewModel createDuplicate() - - - + + + + + - - - ReportNotFoundException + + + ConsentItemFormData - - - - + + + +consentId: String + +title: String + +description: String + +iconName: String? + +id: String + + - - - ReportSectionNotFoundException + + + +ConsentItem toConsentItem() + +ConsentItemFormData copy() - - - + + + + - - - StudyInviteNotFoundException + + + ConsentItemFormView - - - - - - - - UserNotFoundException + + + +formViewModel: ConsentItemFormViewModel - - - - - + + + + + - - - StudyUApiClient + + + EnrollmentFormData - - - +supabaseClient: SupabaseClient - <static>+studyColumns: List<String> - <static>+studyWithParticipantActivityColumns: List<String> - +testDelayMilliseconds: int + + + <static>+kDefaultEnrollmentType: Participation + +enrollmentType: Participation + +questionnaireFormData: QuestionnaireFormData + +consentItemsFormData: List<ConsentItemFormData>? + +id: String - - - +dynamic deleteParticipants() - +dynamic getUserStudies() - +dynamic fetchStudy() - +dynamic deleteStudy() - +dynamic saveStudy() - +dynamic fetchStudyInvite() - +dynamic saveStudyInvite() - +dynamic deleteStudyInvite() - +dynamic fetchAppConfig() - +dynamic fetchUser() - +dynamic saveUser() - -dynamic _awaitGuarded() - -dynamic _apiException() - -dynamic _testDelay() + + + +Study apply() + +EnrollmentFormData copy() - - - - - - - - SupabaseClientDependant - - + + + + + - - - +supabaseClient: SupabaseClient + + + QuestionFormViewModel - - - - - - - - - SupabaseQueryMixin + + + <static>+defaultQuestionType: SurveyQuestionType + -_titles: Map<FormMode, String Function()>? + +questionIdControl: FormControl<String> + +questionTypeControl: FormControl<SurveyQuestionType> + +questionTextControl: FormControl<String> + +questionInfoTextControl: FormControl<String> + +questionBaseControls: Map<String, AbstractControl<dynamic>> + +isMultipleChoiceControl: FormControl<bool> + +choiceResponseOptionsArray: FormArray<dynamic> + +customOptionsMin: int + +customOptionsMax: int + +customOptionsInitial: int + +boolResponseOptionsArray: FormArray<String> + <static>+kDefaultScaleMinValue: int + <static>+kDefaultScaleMaxValue: int + <static>+kNumMidValueControls: int + <static>+kMidValueDebounceMilliseconds: int + +scaleMinValueControl: FormControl<int> + +scaleMaxValueControl: FormControl<int> + -_scaleRangeControl: FormControl<int> + +scaleMinLabelControl: FormControl<String> + +scaleMaxLabelControl: FormControl<String> + +scaleMidValueControls: FormArray<int> + +scaleMidLabelControls: FormArray<String?> + -_scaleResponseOptionsArray: FormArray<int> + +scaleMinColorControl: FormControl<SerializableColor> + +scaleMaxColorControl: FormControl<SerializableColor> + +prevMidValues: List<int?>? + +freeTextTypeControl: FormControl<FreeTextQuestionType> + +customRegexControl: FormControl<String> + +freeTextResponseOptionsArray: FormArray<dynamic> + +freeTextLengthMin: AbstractControl<int> + +freeTextLengthMax: AbstractControl<int> + +freeTextExampleTextControl: FormControl<String> + <static>+kDefaultFreeTextMinLength: int + <static>+kDefaultFreeTextMaxLength: int + +freeTextLengthControl: FormControl<RangeValues> + -_controlsByQuestionType: Map<SurveyQuestionType, FormGroup> + -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + -_validationConfigsByQuestionType: Map<SurveyQuestionType, Map<FormValidationSetEnum, List<FormControlValidation>>> + +form: FormGroup + +questionId: String + +questionType: SurveyQuestionType + +questionTypeControlOptions: List<FormControlOption<SurveyQuestionType>> + +answerOptionsArray: FormArray<dynamic> + +answerOptionsControls: List<AbstractControl<dynamic>> + +validAnswerOptions: List<String> + +boolOptions: List<AbstractControl<String>> + +scaleMinValue: int + +scaleMaxValue: int + +scaleRange: int + +scaleAllValueControls: List<AbstractControl<int>> + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +questionTextRequired: dynamic + +numValidChoiceOptions: dynamic + +scaleRangeValid: dynamic + +titles: Map<FormMode, String> + +isAddOptionButtonVisible: bool + +isMidValuesClearedInfoVisible: bool - - - +dynamic deleteAll() - +dynamic getAll() - +dynamic getById() - +dynamic getByColumn() - +List<T> deserializeList() - +T deserializeObject() + + + +String? scaleMidLabelAt() + -dynamic _onScaleRangeChanged() + -dynamic _applyInputFormatters() + -dynamic _updateScaleMidValueControls() + -Map<String, dynamic>? _validateFreeText() + -dynamic _onFreeTextLengthChanged() + -List<FormControlValidation> _getValidationConfig() + +dynamic onQuestionTypeChanged() + +dynamic onResponseOptionsChanged() + -void _updateFormControls() + +void initControls() + +void setControlsFrom() + +QuestionFormData buildFormData() + +List<ModelAction<dynamic>> availableActions() + +void onNewItem() + +void onSelectItem() + +dynamic save() + +QuestionFormViewModel createDuplicate() - - - - - + + + + + - - - WrappedModel + + + EnrollmentFormViewModel - - - -_model: T - +asyncValue: AsyncValue<T> - +isLocalOnly: bool - +isDirty: bool - +isDeleted: bool - +lastSaved: DateTime? - +lastFetched: DateTime? - +lastUpdated: DateTime? - +model: T + + + +study: Study + +router: GoRouter + +consentItemDelegate: EnrollmentFormConsentItemDelegate + +enrollmentTypeControl: FormControl<Participation> + +consentItemArray: FormArray<dynamic> + +consentItemFormViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData> + +form: FormGroup + +enrollmentTypeControlOptions: List<FormControlOption<Participation>> + +consentItemModels: List<ConsentItemFormViewModel> + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titles: Map<FormMode, String> + +canTestScreener: bool + +canTestConsent: bool + +questionTitles: Map<FormMode, String Function()> - - - +dynamic markWithError() - +dynamic markAsLoading() - +dynamic markAsFetched() - +dynamic markAsSaved() + + + +void setControlsFrom() + +EnrollmentFormData buildFormData() + +void read() + +List<ModelAction<dynamic>> availableActions() + +List<ModelAction<dynamic>> availablePopupActions() + +List<ModelAction<dynamic>> availableInlineActions() + +void onSelectItem() + +void onNewItem() + +ScreenerQuestionFormRouteArgs buildNewScreenerQuestionFormRouteArgs() + +ScreenerQuestionFormRouteArgs buildScreenerQuestionFormRouteArgs() + +ConsentItemFormRouteArgs buildNewConsentItemFormRouteArgs() + +ConsentItemFormRouteArgs buildConsentItemFormRouteArgs() + +dynamic testScreener() + +dynamic testConsent() + +ScreenerQuestionFormViewModel provideQuestionFormViewModel() - - - + + + + + - - - ModelRepositoryException + + + EnrollmentFormConsentItemDelegate - - - - + + + +formViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData> + +owner: EnrollmentFormViewModel + +propagateOnSave: bool + +validationSet: dynamic + + - - - ModelNotFoundException + + + +void onCancel() + +dynamic onSave() + +ConsentItemFormViewModel provide() + +List<ModelAction<dynamic>> availableActions() + +void onNewItem() + +void onSelectItem() - - - - + + + + + - - - IModelRepository + + + StudyFormViewModel - - - +String getKey() - +WrappedModel<T>? get() - +dynamic fetchAll() - +dynamic fetch() - +dynamic save() - +dynamic delete() - +dynamic duplicateAndSave() - +dynamic duplicateAndSaveFromRemote() - +Stream<WrappedModel<T>> watch() - +Stream<List<WrappedModel<T>>> watchAll() - +Stream<ModelEvent<T>> watchChanges() - +Stream<ModelEvent<T>> watchAllChanges() - +dynamic ensurePersisted() - +void dispose() + + + +studyDirtyCopy: Study? + +studyRepository: IStudyRepository + +authRepository: IAuthRepository + +router: GoRouter + +studyInfoFormViewModel: StudyInfoFormViewModel + +enrollmentFormViewModel: EnrollmentFormViewModel + +measurementsFormViewModel: MeasurementsFormViewModel + +reportsFormViewModel: ReportsFormViewModel + +interventionsFormViewModel: InterventionsFormViewModel + +form: FormGroup + +isStudyReadonly: bool + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titles: Map<FormMode, String> + + + + + + +void read() + +void setControlsFrom() + +Study buildFormData() + +void dispose() + +void onCancel() + +dynamic onSave() + -dynamic _applyAndSaveSubform() - - - - + + + + + - - - IModelRepositoryDelegate + + + QuestionFormData - - - +dynamic fetchAll() - +dynamic fetch() - +dynamic save() - +dynamic delete() - +T createNewInstance() - +T createDuplicate() - +dynamic onError() + + + <static>+questionTypeFormDataFactories: Map<SurveyQuestionType, QuestionFormData Function(Question<dynamic>, List<EligibilityCriterion>)> + +questionId: String + +questionText: String + +questionInfoText: String? + +questionType: SurveyQuestionType + +responseOptionsValidity: Map<dynamic, bool> + +responseOptions: List<dynamic> + +id: String - - - - - - - - - - ModelRepository + + + +Question<dynamic> toQuestion() + +EligibilityCriterion toEligibilityCriterion() + +Answer<dynamic> constructAnswerFor() + +dynamic setResponseOptionsValidityFrom() + +QuestionFormData copy() - - - +delegate: IModelRepositoryDelegate<T> - -_allModelsStreamController: BehaviorSubject<List<WrappedModel<T>>> - -_allModelEventsStreamController: BehaviorSubject<ModelEvent<T>> - +modelStreamControllers: Map<String, BehaviorSubject<WrappedModel<T>>> - +modelEventsStreamControllers: Map<String, BehaviorSubject<ModelEvent<T>>> - -_allModels: Map<String, WrappedModel<T>> + + + + + + + + + SurveyQuestionType - - - +WrappedModel<T>? get() - +dynamic fetchAll() - +dynamic fetch() - +dynamic save() - +dynamic delete() - +dynamic duplicateAndSave() - +dynamic duplicateAndSaveFromRemote() - +Stream<List<WrappedModel<T>>> watchAll() - +Stream<WrappedModel<T>> watch() - +Stream<ModelEvent<T>> watchAllChanges() - +Stream<ModelEvent<T>> watchChanges() - -dynamic _buildModelSpecificController() - +dynamic ensurePersisted() - +WrappedModel<T> upsertLocally() - +List<WrappedModel<T>> upsertAllLocally() - +dynamic emitUpdate() - +dynamic emitModelEvent() - +dynamic emitError() - +void dispose() - +List<ModelAction<dynamic>> availableActions() + + + +index: int + <static>+values: List<SurveyQuestionType> + <static>+choice: SurveyQuestionType + <static>+bool: SurveyQuestionType + <static>+scale: SurveyQuestionType + <static>+freeText: SurveyQuestionType - - - - + + + + + - - - SupabaseQueryError + + + ChoiceQuestionFormData - - - +statusCode: String? - +message: String - +details: dynamic + + + +isMultipleChoice: bool + +answerOptions: List<String> + +responseOptions: List<String> - - - - - - - - - - InviteCodeRepository + + + +Question<dynamic> toQuestion() + +QuestionFormData copy() + -Choice _buildChoiceForValue() + +Answer<dynamic> constructAnswerFor() - - - +studyId: String - +ref: ProviderRef<dynamic> - +apiClient: StudyUApi - +authRepository: IAuthRepository - +studyRepository: IStudyRepository - +study: Study + + + + + + + + + + BoolQuestionFormData - - - +String getKey() - +dynamic isCodeAlreadyUsed() - +List<ModelAction<dynamic>> availableActions() - +dynamic emitUpdate() + + + <static>+kResponseOptions: Map<String, bool> + +responseOptions: List<String> - - - - - - - - ProviderRef + + + +Question<dynamic> toQuestion() + +BoolQuestionFormData copy() + +Answer<dynamic> constructAnswerFor() - - - - - + + + + + - - - InviteCodeRepositoryDelegate + + + ScaleQuestionFormData - - - +study: Study - +apiClient: StudyUApi - +studyRepository: IStudyRepository + + + +minValue: double + +maxValue: double + +minLabel: String? + +maxLabel: String? + +midValues: List<double?> + +midLabels: List<String?> + +stepSize: double + +initialValue: double? + +minColor: Color? + +maxColor: Color? + +responseOptions: List<double> + +midAnnotations: List<Annotation> - - - +dynamic fetch() - +dynamic fetchAll() - +dynamic save() - +dynamic delete() - +dynamic onError() - +StudyInvite createDuplicate() - +StudyInvite createNewInstance() + + + +ScaleQuestion toQuestion() + +QuestionFormData copy() + +Answer<dynamic> constructAnswerFor() - - - - - + + + + + - - - StudyRepository + + + FreeTextQuestionFormData - - - +apiClient: StudyUApi - +authRepository: IAuthRepository - +ref: ProviderRef<dynamic> - +sortCallback: void Function()? + + + +textLengthRange: List<int> + +textType: FreeTextQuestionType + +textTypeExpression: String? + +responseOptions: List<String> - - - +String getKey() - +dynamic deleteParticipants() - +dynamic launch() - +List<ModelAction<dynamic>> availableActions() + + + +Question<dynamic> toQuestion() + +FreeTextQuestionFormData copy() + +Answer<dynamic> constructAnswerFor() - - - - - + + + - - - StudyRepositoryDelegate + + + FreeTextQuestionType - - - +apiClient: StudyUApi - +authRepository: IAuthRepository + + + + + + + + + + FreeTextQuestionFormView - - - +dynamic fetchAll() - +dynamic fetch() - +dynamic save() - +dynamic delete() - +dynamic onError() - +Study createNewInstance() - +Study createDuplicate() + + + +formViewModel: QuestionFormViewModel + +generateLabelHelpTextMap: dynamic - - - - - - - - IsFetched + + + +Widget build() + +Widget disableOnReadonly() + +Widget generateRow() - - - + + + + - - - IsSaving + + + IScaleQuestionFormViewModel - - - - - - - - IsSaved + + + +isMidValuesClearedInfoVisible: bool - - - + + + + - - - IsDeleted + + + ScaleQuestionFormView - - - - - - - - StudyUUser + + + +formViewModel: QuestionFormViewModel - - - - - + + + + + - - - UserRepository + + + ChoiceQuestionFormView - - - +apiClient: StudyUApi - +authRepository: IAuthRepository - +ref: Ref<Object?> - +user: StudyUUser + + + +formViewModel: QuestionFormViewModel - - - +dynamic fetchUser() - +dynamic saveUser() - +dynamic updatePreferences() + + + +Widget build() - - - + + + + + - - - Ref + + + BoolQuestionFormView - - - - - - - - - PreferenceAction + + + +formViewModel: QuestionFormViewModel - - - +index: int - <static>+values: List<PreferenceAction> - <static>+pin: PreferenceAction - <static>+pinOff: PreferenceAction + + + +Widget build() - - - - + + + + - - - DropdownMenuItemTheme + + + SurveyQuestionFormView - - - +iconTheme: IconThemeData? + + + +formViewModel: QuestionFormViewModel + +isHtmlStyleable: bool - - - + + + - - - IconThemeData + + + StudyUTimeOfDay - - - + + + + + - - - Diagnosticable + + + ScheduleControls + + + + + + +formViewModel: WithScheduleControls + + + + + + +Widget build() + -List<FormTableRow> _conditionalTimeRestrictions() - - - - - + + + + - - - ThemeConfig + + + StudiesTableColumnHeader - - - <static>+kMinContentWidth: double - <static>+kMaxContentWidth: double - <static>+kHoverFadeFactor: double - <static>+kMuteFadeFactor: double + + + +title: String + +sortable: bool + +sortAscending: bool + +sortingActive: bool + +onSort: void Function()? + + + + + + + + + + + + DashboardScreen - - - <static>+dynamic bodyBackgroundColor() - <static>+Color modalBarrierColor() - <static>+Color containerColor() - <static>+Color colorPickerInitialColor() - <static>+TextStyle bodyTextMuted() - <static>+TextStyle bodyTextBackground() - <static>+double iconSplashRadius() - <static>+Color sidesheetBackgroundColor() - <static>+InputDecorationTheme dropdownInputDecorationTheme() - <static>+DropdownMenuItemTheme dropdownMenuItemTheme() + + + +filter: StudiesFilter? - - - - + + + + - - - NoAnimationPageTransitionsBuilder + + + StudiesFilter - - - +Widget buildTransitions() + + + +index: int + <static>+values: List<StudiesFilter> - - - + + + + + - - - PageTransitionsBuilder + + + DashboardScaffold - - - - - - - - - WebTransitionBuilder + + + <static>+compactWidthThreshold: double + +body: Widget - - - +Widget buildTransitions() + + + +Widget build() - - - - + + + + + - - - ThemeSettingChange + + + DashboardController - - - +settings: ThemeSettings + + + +studyRepository: IStudyRepository + +authRepository: IAuthRepository + +userRepository: IUserRepository + +router: GoRouter + -_studiesSubscription: StreamSubscription<List<WrappedModel<Study>>>? + +searchController: SearchController + +isSortAscending: bool + + + + + + -dynamic _subscribeStudies() + +dynamic setSearchText() + +dynamic setStudiesFilter() + +dynamic onSelectStudy() + +dynamic onClickNewStudy() + +dynamic pinStudy() + +dynamic pinOffStudy() + +void setSorting() + +void filterStudies() + +void sortStudies() + +bool isSortingActiveForColumn() + +bool isPinned() + +List<ModelAction<dynamic>> availableActions() + +void dispose() - - - - + + + + + - - - ThemeSettings + + + IUserRepository - - - +sourceColor: Color - +themeMode: ThemeMode + + + +user: StudyUUser - - - - - - - - Notification + + + +dynamic fetchUser() + +dynamic saveUser() + +dynamic updatePreferences() - - - - - + + + + + - - - ThemeProvider + + + StudiesTableColumnSize - - - +settings: ValueNotifier<ThemeSettings> - +lightDynamic: ColorScheme? - +darkDynamic: ColorScheme? - +pageTransitionsTheme: PageTransitionsTheme - +shapeMedium: ShapeBorder + + + +collapsed: bool + +flex: int? + +width: double? - - - +Color custom() - +Color blend() - +Color source() - +ColorScheme colors() - +CardTheme cardTheme() - +ListTileThemeData listTileTheme() - +AppBarTheme appBarTheme() - +SnackBarThemeData snackBarThemeData() - +TabBarTheme tabBarTheme() - +BottomAppBarTheme bottomAppBarTheme() - +BottomNavigationBarThemeData bottomNavigationBarTheme() - +SwitchThemeData switchTheme() - +InputDecorationTheme inputDecorationTheme() - +TextTheme textTheme() - +DividerThemeData dividerTheme() - +NavigationRailThemeData navigationRailTheme() - +DrawerThemeData drawerTheme() - +IconThemeData iconTheme() - +CheckboxThemeData checkboxTheme() - +RadioThemeData radioTheme() - +TooltipThemeData tooltipTheme() - +ThemeData light() - +ThemeData dark() - +ThemeMode themeMode() - +ThemeData theme() - <static>+ThemeProvider of() - +bool updateShouldNotify() + + + +Widget createContainer() - - - + + + + + - - - ValueNotifier + + + StudiesTable - - - - - - - - ColorScheme + + + +itemHeight: double + +itemPadding: double + +rowSpacing: double + +columnSpacing: double + +compactWidthThreshold: double + +superCompactWidthThreshold: double + +compactStatTitleThreshold: double + +studies: List<Study> + +onSelect: void Function(Study) + +getActions: List<ModelAction<dynamic>> Function(Study) + +emptyWidget: Widget + +pinnedStudies: Iterable<String> + +dashboardController: DashboardController - - - - - - - - PageTransitionsTheme + + + +Widget build() + -Widget _buildColumnHeader() - - - + + + - - - ShapeBorder + + + void Function(Study) - - - + + + - - - InheritedWidget + + + List<ModelAction<dynamic>> Function(Study) - - - + + + + - - - ThemeMode + + + StudiesTableColumn - - - - - - - - - - CustomColor + + + +index: int + <static>+values: List<StudiesTableColumn> + <static>+pin: StudiesTableColumn + <static>+title: StudiesTableColumn + <static>+status: StudiesTableColumn + <static>+participation: StudiesTableColumn + <static>+createdAt: StudiesTableColumn + <static>+enrolled: StudiesTableColumn + <static>+active: StudiesTableColumn + <static>+completed: StudiesTableColumn + <static>+action: StudiesTableColumn - - - +name: String - +color: Color - +blend: bool + + + + + + + + + StudiesTableItem - - - +Color value() + + + +study: Study + +itemHeight: double + +itemPadding: double + +rowSpacing: double + +columnSpacing: double + +actions: List<ModelAction<dynamic>> + +columnSizes: List<StudiesTableColumnSize> + +isPinned: bool + +onPinnedChanged: void Function(Study, bool)? + +onTap: void Function(Study)? - - - - - + + + - - - StudyTemplates + + + void Function(Study, bool)? - - - <static>+kUnnamedStudyTitle: String - - + + + + - - - <static>+Study emptyDraft() + + + void Function(Study)? - - - - - - - - StudyActionType - - + + + - - - +index: int - <static>+values: List<StudyActionType> - <static>+pin: StudyActionType - <static>+pinoff: StudyActionType - <static>+edit: StudyActionType - <static>+duplicate: StudyActionType - <static>+duplicateDraft: StudyActionType - <static>+addCollaborator: StudyActionType - <static>+export: StudyActionType - <static>+delete: StudyActionType + + + App - - - + + + - - - ResultTypes + + + AppContent - - - - + + + + - - - MeasurementResultTypes + + + AccountSettingsDialog - - - <static>+questionnaire: String - <static>+values: List<String> + + + +Widget build() - - - - - - - - InterventionResultTypes - - + + + + + - - - <static>+checkmarkTask: String - <static>+values: List<String> + + + ModelRepository - - - - - - - - - StudyExportData + + + +delegate: IModelRepositoryDelegate<T> + -_allModelsStreamController: BehaviorSubject<List<WrappedModel<T>>> + -_allModelEventsStreamController: BehaviorSubject<ModelEvent<T>> + +modelStreamControllers: Map<String, BehaviorSubject<WrappedModel<T>>> + +modelEventsStreamControllers: Map<String, BehaviorSubject<ModelEvent<T>>> + -_allModels: Map<String, WrappedModel<T>> - - - +study: Study - +measurementsData: List<Map<String, dynamic>> - +interventionsData: List<Map<String, dynamic>> - +isEmpty: bool + + + +WrappedModel<T>? get() + +dynamic fetchAll() + +dynamic fetch() + +dynamic save() + +dynamic delete() + +dynamic duplicateAndSave() + +dynamic duplicateAndSaveFromRemote() + +Stream<List<WrappedModel<T>>> watchAll() + +Stream<WrappedModel<T>> watch() + +Stream<ModelEvent<T>> watchAllChanges() + +Stream<ModelEvent<T>> watchChanges() + -dynamic _buildModelSpecificController() + +dynamic ensurePersisted() + +WrappedModel<T> upsertLocally() + +List<WrappedModel<T>> upsertAllLocally() + +dynamic emitUpdate() + +dynamic emitModelEvent() + +dynamic emitError() + +void dispose() + +List<ModelAction<dynamic>> availableActions() - - - - - + + + + + - - - CombinedStreamNotifier + + + InviteCodeRepository - - - -_subscriptions: List<StreamSubscription<dynamic>> + + + +studyId: String + +ref: ProviderRef<dynamic> + +apiClient: StudyUApi + +authRepository: IAuthRepository + +studyRepository: IStudyRepository + +study: Study - - - +void dispose() + + + +String getKey() + +dynamic isCodeAlreadyUsed() + +List<ModelAction<dynamic>> availableActions() + +dynamic emitUpdate() - - - + + + - - - ChangeNotifier + + + ProviderRef - - - - - - - - - OptimisticUpdate - - + + + + - - - +applyOptimistic: void Function() - +apply: dynamic Function() - +rollback: void Function() - +onUpdate: void Function()? - +onError: void Function(Object, StackTrace?)? - +rethrowErrors: bool - +runOptimistically: bool - +completeFutureOptimistically: bool + + + StudyUApi - - - +dynamic execute() - -void _runUpdateHandlerIfAny() + + + +dynamic saveStudy() + +dynamic fetchStudy() + +dynamic getUserStudies() + +dynamic deleteStudy() + +dynamic saveStudyInvite() + +dynamic fetchStudyInvite() + +dynamic deleteStudyInvite() + +dynamic deleteParticipants() + +dynamic fetchAppConfig() + +dynamic fetchUser() + +dynamic saveUser() - - - + + + + + - - - void Function() + + + InviteCodeRepositoryDelegate - - - - + + + +study: Study + +apiClient: StudyUApi + +studyRepository: IStudyRepository + + - - - void Function(Object, StackTrace?)? + + + +dynamic fetch() + +dynamic fetchAll() + +dynamic save() + +dynamic delete() + +dynamic onError() + +StudyInvite createDuplicate() + +StudyInvite createNewInstance() - - - - + + + + - - - Time + + + IModelRepositoryDelegate - - - <static>+dynamic fromTimeOfDay() - +Map<String, dynamic> toJson() - <static>+Time fromJson() + + + +dynamic fetchAll() + +dynamic fetch() + +dynamic save() + +dynamic delete() + +T createNewInstance() + +T createDuplicate() + +dynamic onError() - - - + + + + + - - - TimeOfDay + + + StudyRepository - - - - - - - - - TimeValueAccessor + + + +apiClient: StudyUApi + +authRepository: IAuthRepository + +ref: ProviderRef<dynamic> + +sortCallback: void Function()? - - - +String modelToViewValue() - +Time? viewToModelValue() - -String _addLeadingZeroIfNeeded() + + + +String getKey() + +dynamic deleteParticipants() + +dynamic launch() + +List<ModelAction<dynamic>> availableActions() - - - + + + + + - - - ControlValueAccessor + + + StudyRepositoryDelegate - - - - - - - - - ModelAction + + + +apiClient: StudyUApi + +authRepository: IAuthRepository - - - +type: T - +label: String - +icon: IconData? - +onExecute: Function - +isAvailable: bool - +isDestructive: bool + + + +dynamic fetchAll() + +dynamic fetch() + +dynamic save() + +dynamic delete() + +dynamic onError() + +Study createNewInstance() + +Study createDuplicate() - - - - + + + - - - ModelActionType + + + APIException - - - +index: int - <static>+values: List<ModelActionType> - <static>+edit: ModelActionType - <static>+delete: ModelActionType - <static>+remove: ModelActionType - <static>+duplicate: ModelActionType - <static>+clipboard: ModelActionType - <static>+primary: ModelActionType + + + + + + + + StudyNotFoundException - - - - + + + - - - SerializableColor + + + MeasurementNotFoundException - - - +Map<String, dynamic> toJson() - <static>+SerializableColor fromJson() + + + + + + + + QuestionNotFoundException - - - - - + + + - - - Tuple + + + ConsentItemNotFoundException - - - +first: T1 - +second: T2 - +props: List<Object?> - - + + + + - - - +Map<String, dynamic> toJson() - <static>+Tuple<dynamic, dynamic> fromJson() - +Tuple<T1, T2> copy() - +Tuple<T1, T2> copyWith() + + + InterventionNotFoundException - - - - - + + + - - - CountWhereValidator + + + InterventionTaskNotFoundException - - - +predicate: bool Function(T?) - +minCount: int? - +maxCount: int? - <static>+kValidationMessageMinCount: String - <static>+kValidationMessageMaxCount: String + + + + + + + + ReportNotFoundException - - - +Map<String, dynamic>? validate() + + + + + + + + ReportSectionNotFoundException - - - + + + - - - bool Function(T?) + + + StudyInviteNotFoundException - - - + + + - - - Validator + + + UserNotFoundException - - - - + + + + + - - - Patterns + + + StudyUApiClient - - - <static>+timeFormatString: String - <static>+emailFormatString: String - <static>+url: String + + + +supabaseClient: SupabaseClient + <static>+studyColumns: List<String> + <static>+studyWithParticipantActivityColumns: List<String> + +testDelayMilliseconds: int + + + + + + +dynamic deleteParticipants() + +dynamic getUserStudies() + +dynamic fetchStudy() + +dynamic deleteStudy() + +dynamic saveStudy() + +dynamic fetchStudyInvite() + +dynamic saveStudyInvite() + +dynamic deleteStudyInvite() + +dynamic fetchAppConfig() + +dynamic fetchUser() + +dynamic saveUser() + -dynamic _awaitGuarded() + -dynamic _apiException() + -dynamic _testDelay() - - - - - + + + - - - ExecutionLimiter + + + SupabaseClient - - - +milliseconds: int - <static>-_timer: Timer? + + + + + + + + + SupabaseClientDependant - - - +void dispose() + + + +supabaseClient: SupabaseClient - - - + + + + - - - Timer + + + SupabaseQueryMixin + + + + + + +dynamic deleteAll() + +dynamic getAll() + +dynamic getById() + +dynamic getByColumn() + +List<T> deserializeList() + +T deserializeObject() - - - - + + + + - - - Throttler + + + IAppRepository - - - +dynamic call() + + + +dynamic fetchAppConfig() + +void dispose() - - - - - + + + + + - - - SuppressedBehaviorSubject + + + AppRepository - - - +subject: BehaviorSubject<T> - +didSuppressInitialEvent: bool - -_controller: StreamController<T> + + + +apiClient: StudyUApi - - - -StreamController<T> _buildDerivedController() - +dynamic close() + + + +dynamic fetchAppConfig() + +void dispose() - - - - - - - StreamController + + + + + + + StudyUUser - - - - - + + + + + - - - JsonFileLoader + + + UserRepository - - - +jsonAssetsPath: String + + + +apiClient: StudyUApi + +authRepository: IAuthRepository + +ref: Ref<Object?> + +user: StudyUUser - - - +dynamic loadJson() - +dynamic parseJsonMapFromAssets() - +dynamic parseJsonListFromAssets() + + + +dynamic fetchUser() + +dynamic saveUser() + +dynamic updatePreferences() - - - - - + + + - - - NumericalRangeFormatter + + + Ref - - - +min: int? - +max: int? + + + + + + + + + PreferenceAction - - - +TextEditingValue formatEditUpdate() + + + +index: int + <static>+values: List<PreferenceAction> + <static>+pin: PreferenceAction + <static>+pinOff: PreferenceAction - - - + + + - - - TextInputFormatter + + + User - - - - + + + - - - StudySequenceFormatter + + + Session - - - +TextEditingValue formatEditUpdate() + + + + + + + + + + AuthRepository - - - - - - - - - FileFormatEncoder + + + +supabaseClient: SupabaseClient + +sharedPreferences: SharedPreferences + +allowPasswordReset: bool + +authClient: GoTrueClient + +session: Session? + +serializedSession: String? + +currentUser: User? + +isLoggedIn: bool - - - +dynamic encodeAsync() - +String encode() - +dynamic call() + + + -void _registerAuthListener() + +dynamic signUp() + +dynamic signInWith() + +dynamic signOut() + +dynamic resetPasswordForEmail() + +dynamic updateUser() + +void dispose() + +dynamic onAppStart() - - - - + + + - - - CSVStringEncoder + + + GoTrueClient - - - +String encode() + + + + + + + + StudyLaunched - - - - + + + + - - - JsonStringEncoder + + + ModelEvent - - - +String encode() + + + +modelId: String + +model: T - - - - + + + + - - - PlatformLocaleWeb + + + SupabaseQueryError - - - +Locale getPlatformLocale() + + + +statusCode: String? + +message: String + +details: dynamic - - - - + + + + + - - - PlatformLocale + + + WrappedModel - - - +Locale getPlatformLocale() + + + -_model: T + +asyncValue: AsyncValue<T> + +isLocalOnly: bool + +isDirty: bool + +isDeleted: bool + +lastSaved: DateTime? + +lastFetched: DateTime? + +lastUpdated: DateTime? + +model: T + + + + + + +dynamic markWithError() + +dynamic markAsLoading() + +dynamic markAsFetched() + +dynamic markAsSaved() - - - - + + + - - - PlatformLocaleMobile + + + ModelRepositoryException - - - +Locale getPlatformLocale() + + + + + + + + ModelNotFoundException - - - - + + + + - - - AppTranslation + + + IModelRepository - - - <static>+dynamic init() + + + +String getKey() + +WrappedModel<T>? get() + +dynamic fetchAll() + +dynamic fetch() + +dynamic save() + +dynamic delete() + +dynamic duplicateAndSave() + +dynamic duplicateAndSaveFromRemote() + +Stream<WrappedModel<T>> watch() + +Stream<List<WrappedModel<T>>> watchAll() + +Stream<ModelEvent<T>> watchChanges() + +Stream<ModelEvent<T>> watchAllChanges() + +dynamic ensurePersisted() + +void dispose() - - - - - - - - LanguagePicker - - + + + - - - +languagePickerType: LanguagePickerType - +iconColor: Color? - +offset: Offset? + + + IsFetched - - - - + + + - - - LanguagePickerType + + + IsSaving - - - +index: int - <static>+values: List<LanguagePickerType> - <static>+field: LanguagePickerType - <static>+icon: LanguagePickerType + + + + + + + + IsSaved - - - + + + - - - Offset + + + IsDeleted From d4bbcbe8f0d9f7b130965830f8750610388862f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20G=C3=B6cer?= Date: Thu, 18 Apr 2024 18:42:42 +0200 Subject: [PATCH 003/314] fix: merge mistake --- designer_v2/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/designer_v2/pubspec.yaml b/designer_v2/pubspec.yaml index aa09fb95c..0714e744f 100644 --- a/designer_v2/pubspec.yaml +++ b/designer_v2/pubspec.yaml @@ -23,7 +23,7 @@ dependencies: flutter_riverpod: ^2.5.1 flutter_web_plugins: sdk: flutter - go_router: ^13.2.1 + go_router: ^13.2.4 intl: material_color_utilities: material_design_icons_flutter: ^7.0.7296 From fa3167e9368254ef4a371618a22c8f8473b09679 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20G=C3=B6cer?= Date: Thu, 18 Apr 2024 19:02:03 +0200 Subject: [PATCH 004/314] fix: total interventions calculation --- designer_v2/lib/features/monitor/study_monitor_table.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/designer_v2/lib/features/monitor/study_monitor_table.dart b/designer_v2/lib/features/monitor/study_monitor_table.dart index be7b3ff9e..62e8e60a0 100644 --- a/designer_v2/lib/features/monitor/study_monitor_table.dart +++ b/designer_v2/lib/features/monitor/study_monitor_table.dart @@ -53,7 +53,7 @@ class StudyMonitorItem extends Equatable { min(studyDurationInDays, DateTime.now().toUtc().difference(participant.startedAt!).inDays); final daysInBaseline = study.schedule.includeBaseline ? study.schedule.phaseDuration : 0; - final totalInterventions = max(0, currentDayOfStudy - daysInBaseline) * interventions.length; + final totalInterventions = max(0, currentDayOfStudy - daysInBaseline); final totalSurveys = currentDayOfStudy * study.observations.length; final completedInterventions = progresses.where((p) => p.resultType == "bool").toList(); From f8c8fc3ca48f0ccb602c0f5db102eb8666d72548 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20G=C3=B6cer?= Date: Thu, 18 Apr 2024 19:03:11 +0200 Subject: [PATCH 005/314] feat: also enable monitor page if results are public but not creator --- designer_v2/lib/features/study/study_controller_state.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/designer_v2/lib/features/study/study_controller_state.dart b/designer_v2/lib/features/study/study_controller_state.dart index 3c41c6566..581fc711f 100644 --- a/designer_v2/lib/features/study/study_controller_state.dart +++ b/designer_v2/lib/features/study/study_controller_state.dart @@ -46,7 +46,7 @@ class StudyControllerState extends StudyControllerBaseState implements IStudyApp study.value == null || (study.value != null && study.value!.canEdit(super.currentUser)); @override - bool get isMonitorTabEnabled => isRecruitTabEnabled; + bool get isMonitorTabEnabled => isAnalyzeTabEnabled; @override bool get isAnalyzeTabEnabled => From 13c823f6ce3672067db205022d544c831667d90b Mon Sep 17 00:00:00 2001 From: StudyU Documenter Date: Thu, 18 Apr 2024 17:05:48 +0000 Subject: [PATCH 006/314] docs: update UML documentation --- .../designer_v2/lib/features/study/uml.svg | 1488 ++-- docs/uml/designer_v2/lib/features/uml.svg | 3590 ++++----- docs/uml/designer_v2/lib/uml.svg | 6541 +++++++++-------- 3 files changed, 5959 insertions(+), 5660 deletions(-) diff --git a/docs/uml/designer_v2/lib/features/study/uml.svg b/docs/uml/designer_v2/lib/features/study/uml.svg index d5afd8d04..ecd129fbe 100644 --- a/docs/uml/designer_v2/lib/features/study/uml.svg +++ b/docs/uml/designer_v2/lib/features/study/uml.svg @@ -1,34 +1,40 @@ - - [<abstract>IStudyNavViewModel + + [FrameControlsWidget | - +isEditTabEnabled: bool; - +isTestTabEnabled: bool; - +isRecruitTabEnabled: bool; - +isMonitorTabEnabled: bool; - +isAnalyzeTabEnabled: bool; - +isSettingsEnabled: bool + +onRefresh: void Function()?; + +onOpenNewTab: void Function()?; + +enabled: bool + | + +Widget build() ] - [StudyNav + [FrameControlsWidget]o-[void Function()?] + [<abstract>ConsumerWidget]<:-[FrameControlsWidget] + + [<abstract>IStudyStatusBadgeViewModel | - <static>+dynamic tabs(); - <static>+dynamic edit(); - <static>+dynamic test(); - <static>+dynamic recruit(); - <static>+dynamic monitor(); - <static>+dynamic analyze() + +studyParticipation: Participation?; + +studyStatus: StudyStatus? ] - [StudyDesignNav + [<abstract>IStudyStatusBadgeViewModel]o-[Participation] + [<abstract>IStudyStatusBadgeViewModel]o-[StudyStatus] + + [StudyStatusBadge | - <static>+dynamic tabs(); - <static>+dynamic info(); - <static>+dynamic enrollment(); - <static>+dynamic interventions(); - <static>+dynamic measurements(); - <static>+dynamic reports() + +participation: Participation?; + +status: StudyStatus?; + +type: BadgeType; + +showPrefixIcon: bool; + +showTooltip: bool + | + +Widget build() ] + [StudyStatusBadge]o-[Participation] + [StudyStatusBadge]o-[StudyStatus] + [StudyStatusBadge]o-[BadgeType] + [RouteInformation | +route: String?; @@ -91,58 +97,55 @@ [<abstract>PlatformController]<:-[MobileController] - [TestAppRoutes - | - <static>+studyOverview: String; - <static>+eligibility: String; - <static>+intervention: String; - <static>+consent: String; - <static>+journey: String; - <static>+dashboard: String - ] - - [StudySettingsFormViewModel + [StudyController | - +study: AsyncValue<Study>; - +studyRepository: IStudyRepository; - <static>+defaultPublishedToRegistry: bool; - <static>+defaultPublishedToRegistryResults: bool; - +isPublishedToRegistryControl: FormControl<bool>; - +isPublishedToRegistryResultsControl: FormControl<bool>; - +form: FormGroup; - +titles: Map<FormMode, String> + +notificationService: INotificationService; + +studyEventsSubscription: StreamSubscription<ModelEvent<Study>>?; + +studyActions: List<ModelAction<dynamic>> | - +void setControlsFrom(); - +Study buildFormData(); - +dynamic keepControlsSynced(); - +dynamic save(); - +dynamic setLaunchDefaults() + +dynamic syncStudyStatus(); + +dynamic onStudySubscriptionUpdate(); + -dynamic _redirectNewToActualStudyID(); + +dynamic publishStudy(); + +void onChangeStudyParticipation(); + +void onAddParticipants(); + +void onSettingsPressed(); + +void dispose() ] - [StudySettingsFormViewModel]o-[<abstract>AsyncValue] - [StudySettingsFormViewModel]o-[<abstract>IStudyRepository] - [StudySettingsFormViewModel]o-[FormControl] - [StudySettingsFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[StudySettingsFormViewModel] + [StudyController]o-[<abstract>INotificationService] + [StudyController]o-[StreamSubscription] + [StudyBaseController]<:-[StudyController] - [StudySettingsDialog + [<abstract>IStudyNavViewModel | - +Widget build() + +isEditTabEnabled: bool; + +isTestTabEnabled: bool; + +isRecruitTabEnabled: bool; + +isMonitorTabEnabled: bool; + +isAnalyzeTabEnabled: bool; + +isSettingsEnabled: bool ] - [<abstract>StudyPageWidget]<:-[StudySettingsDialog] - - [FrameControlsWidget - | - +onRefresh: void Function()?; - +onOpenNewTab: void Function()?; - +enabled: bool + [StudyNav | - +Widget build() + <static>+dynamic tabs(); + <static>+dynamic edit(); + <static>+dynamic test(); + <static>+dynamic recruit(); + <static>+dynamic monitor(); + <static>+dynamic analyze() ] - [FrameControlsWidget]o-[void Function()?] - [<abstract>ConsumerWidget]<:-[FrameControlsWidget] + [StudyDesignNav + | + <static>+dynamic tabs(); + <static>+dynamic info(); + <static>+dynamic enrollment(); + <static>+dynamic interventions(); + <static>+dynamic measurements(); + <static>+dynamic reports() + ] [<abstract>StudyPageWidget | @@ -154,19 +157,6 @@ [<abstract>ConsumerWidget]<:-[<abstract>StudyPageWidget] [<abstract>IWithBanner]<:--[<abstract>StudyPageWidget] - [StudyTestScreen - | - +previewRoute: String? - | - +Widget build(); - +Widget? banner(); - +dynamic load(); - +dynamic save(); - +dynamic showHelp() - ] - - [<abstract>StudyPageWidget]<:-[StudyTestScreen] - [StudyParticipationBadge | +participation: Participation; @@ -180,49 +170,22 @@ [StudyParticipationBadge]o-[Participation] [StudyParticipationBadge]o-[BadgeType] - [<abstract>IStudyStatusBadgeViewModel - | - +studyParticipation: Participation?; - +studyStatus: StudyStatus? - ] - - [<abstract>IStudyStatusBadgeViewModel]o-[Participation] - [<abstract>IStudyStatusBadgeViewModel]o-[StudyStatus] - - [StudyStatusBadge - | - +participation: Participation?; - +status: StudyStatus?; - +type: BadgeType; - +showPrefixIcon: bool; - +showTooltip: bool - | - +Widget build() - ] - - [StudyStatusBadge]o-[Participation] - [StudyStatusBadge]o-[StudyStatus] - [StudyStatusBadge]o-[BadgeType] - - [StudyController + [StudyBaseController | - +notificationService: INotificationService; - +studyEventsSubscription: StreamSubscription<ModelEvent<Study>>?; - +studyActions: List<ModelAction<dynamic>> + +studyId: String; + +studyRepository: IStudyRepository; + +router: GoRouter; + +studySubscription: StreamSubscription<WrappedModel<Study>>? | - +dynamic syncStudyStatus(); + +dynamic subscribeStudy(); +dynamic onStudySubscriptionUpdate(); - -dynamic _redirectNewToActualStudyID(); - +dynamic publishStudy(); - +void onChangeStudyParticipation(); - +void onAddParticipants(); - +void onSettingsPressed(); + +dynamic onStudySubscriptionError(); +void dispose() ] - [StudyController]o-[<abstract>INotificationService] - [StudyController]o-[StreamSubscription] - [StudyBaseController]<:-[StudyController] + [StudyBaseController]o-[<abstract>IStudyRepository] + [StudyBaseController]o-[GoRouter] + [StudyBaseController]o-[StreamSubscription] [PreviewFrame | @@ -233,15 +196,6 @@ [PreviewFrame]o-[<abstract>StudyFormRouteArgs] - [StudyTestController - | - +authRepository: IAuthRepository; - +languageCode: String - ] - - [StudyTestController]o-[<abstract>IAuthRepository] - [StudyBaseController]<:-[StudyTestController] - [<abstract>IStudyAppBarViewModel | +isSyncIndicatorVisible: bool; @@ -315,255 +269,362 @@ +Widget build() ] - [StudyBaseController + [StudyTestScreen | - +studyId: String; + +previewRoute: String? + | + +Widget build(); + +Widget? banner(); + +dynamic load(); + +dynamic save(); + +dynamic showHelp() + ] + + [<abstract>StudyPageWidget]<:-[StudyTestScreen] + + [StudySettingsFormViewModel + | + +study: AsyncValue<Study>; +studyRepository: IStudyRepository; - +router: GoRouter; - +studySubscription: StreamSubscription<WrappedModel<Study>>? + <static>+defaultPublishedToRegistry: bool; + <static>+defaultPublishedToRegistryResults: bool; + +isPublishedToRegistryControl: FormControl<bool>; + +isPublishedToRegistryResultsControl: FormControl<bool>; + +form: FormGroup; + +titles: Map<FormMode, String> | - +dynamic subscribeStudy(); - +dynamic onStudySubscriptionUpdate(); - +dynamic onStudySubscriptionError(); - +void dispose() + +void setControlsFrom(); + +Study buildFormData(); + +dynamic keepControlsSynced(); + +dynamic save(); + +dynamic setLaunchDefaults() ] - [StudyBaseController]o-[<abstract>IStudyRepository] - [StudyBaseController]o-[GoRouter] - [StudyBaseController]o-[StreamSubscription] + [StudySettingsFormViewModel]o-[<abstract>AsyncValue] + [StudySettingsFormViewModel]o-[<abstract>IStudyRepository] + [StudySettingsFormViewModel]o-[FormControl] + [StudySettingsFormViewModel]o-[FormGroup] + [<abstract>FormViewModel]<:-[StudySettingsFormViewModel] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + [StudySettingsDialog + | + +Widget build() + ] + + [<abstract>StudyPageWidget]<:-[StudySettingsDialog] + + [StudyTestController + | + +authRepository: IAuthRepository; + +languageCode: String + ] + + [StudyTestController]o-[<abstract>IAuthRepository] + [StudyBaseController]<:-[StudyTestController] + + [TestAppRoutes + | + <static>+studyOverview: String; + <static>+eligibility: String; + <static>+intervention: String; + <static>+consent: String; + <static>+journey: String; + <static>+dashboard: String + ] + + + + + + + + + + + + + + + + + + + + + + - - - - + - + - + - + - + - + - + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + - + + - + - + - + - + - + - + - + - - - + - + - + - + - - - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + + + - + - + - + - + - + - - - - + + + + + + + + + + + + + + + + + + + - - - IStudyNavViewModel + + + FrameControlsWidget - - - +isEditTabEnabled: bool - +isTestTabEnabled: bool - +isRecruitTabEnabled: bool - +isMonitorTabEnabled: bool - +isAnalyzeTabEnabled: bool - +isSettingsEnabled: bool + + + +onRefresh: void Function()? + +onOpenNewTab: void Function()? + +enabled: bool + + + + + + +Widget build() - - - - + + + - - - StudyNav + + + void Function()? - - - <static>+dynamic tabs() - <static>+dynamic edit() - <static>+dynamic test() - <static>+dynamic recruit() - <static>+dynamic monitor() - <static>+dynamic analyze() + + + + + + + + ConsumerWidget - - - - + + + + - - - StudyDesignNav + + + IStudyStatusBadgeViewModel - - - <static>+dynamic tabs() - <static>+dynamic info() - <static>+dynamic enrollment() - <static>+dynamic interventions() - <static>+dynamic measurements() - <static>+dynamic reports() + + + +studyParticipation: Participation? + +studyStatus: StudyStatus? + + + + + + + + + + + Participation + + + + + + + + + + + StudyStatus + + + + + + + + + + + + + StudyStatusBadge + + + + + + +participation: Participation? + +status: StudyStatus? + +type: BadgeType + +showPrefixIcon: bool + +showTooltip: bool + + + + + + +Widget build() + + + + + + + + + + + BadgeType - - - + + + - + RouteInformation - + +route: String? +extra: String? @@ -572,7 +633,7 @@ - + +String toString() @@ -581,17 +642,17 @@ - - - + + + - + PlatformController - + +studyId: String +baseSrc: String @@ -601,7 +662,7 @@ - + +void activate() +void registerViews() @@ -617,9 +678,9 @@ - + - + Widget @@ -628,23 +689,23 @@ - - - + + + - + WebController - + +iFrameElement: IFrameElement - + +void activate() +void registerViews() @@ -660,9 +721,9 @@ - + - + IFrameElement @@ -671,16 +732,16 @@ - - + + - + MobileController - + +void openNewPage() +void refresh() @@ -694,460 +755,260 @@ - - - - - - - - TestAppRoutes - - - - - - <static>+studyOverview: String - <static>+eligibility: String - <static>+intervention: String - <static>+consent: String - <static>+journey: String - <static>+dashboard: String - - - - - - - - - - - - - StudySettingsFormViewModel - - - - - - +study: AsyncValue<Study> - +studyRepository: IStudyRepository - <static>+defaultPublishedToRegistry: bool - <static>+defaultPublishedToRegistryResults: bool - +isPublishedToRegistryControl: FormControl<bool> - +isPublishedToRegistryResultsControl: FormControl<bool> - +form: FormGroup - +titles: Map<FormMode, String> - - - - - - +void setControlsFrom() - +Study buildFormData() - +dynamic keepControlsSynced() - +dynamic save() - +dynamic setLaunchDefaults() - - - - - - - - - - - AsyncValue - - - - - - - - - - - IStudyRepository - - - - - - - - - - - FormControl - - - - - - - - - - - FormGroup - - - - - - - - - - - FormViewModel - - - - - - - - - - - - StudySettingsDialog - - - - - - +Widget build() - - - - - - - - - - - - - StudyPageWidget - - - - - - +studyId: String - - - - - - +Widget? banner() - - - - - - - - - - - - - FrameControlsWidget - - - - - - +onRefresh: void Function()? - +onOpenNewTab: void Function()? - +enabled: bool - - + + + + + - - - +Widget build() + + + StudyController - - - - - - - - void Function()? + + + +notificationService: INotificationService + +studyEventsSubscription: StreamSubscription<ModelEvent<Study>>? + +studyActions: List<ModelAction<dynamic>> - - - - - - - - ConsumerWidget + + + +dynamic syncStudyStatus() + +dynamic onStudySubscriptionUpdate() + -dynamic _redirectNewToActualStudyID() + +dynamic publishStudy() + +void onChangeStudyParticipation() + +void onAddParticipants() + +void onSettingsPressed() + +void dispose() - - - + + + - - - IWithBanner + + + INotificationService - - - - - - - - - StudyTestScreen - - - - - - +previewRoute: String? - - + + + - - - +Widget build() - +Widget? banner() - +dynamic load() - +dynamic save() - +dynamic showHelp() + + + StreamSubscription - - - - - + + + + + - - - StudyParticipationBadge + + + StudyBaseController - - - +participation: Participation - +type: BadgeType - +showPrefixIcon: bool - +center: bool + + + +studyId: String + +studyRepository: IStudyRepository + +router: GoRouter + +studySubscription: StreamSubscription<WrappedModel<Study>>? - - - +Widget build() + + + +dynamic subscribeStudy() + +dynamic onStudySubscriptionUpdate() + +dynamic onStudySubscriptionError() + +void dispose() - - - + + + + - - - Participation + + + IStudyNavViewModel - - - - - - - - BadgeType + + + +isEditTabEnabled: bool + +isTestTabEnabled: bool + +isRecruitTabEnabled: bool + +isMonitorTabEnabled: bool + +isAnalyzeTabEnabled: bool + +isSettingsEnabled: bool - - - - - - - - IStudyStatusBadgeViewModel - - + + + + - - - +studyParticipation: Participation? - +studyStatus: StudyStatus? + + + StudyNav - - - - - - - - StudyStatus + + + <static>+dynamic tabs() + <static>+dynamic edit() + <static>+dynamic test() + <static>+dynamic recruit() + <static>+dynamic monitor() + <static>+dynamic analyze() - - - - - - - - - StudyStatusBadge - - + + + + - - - +participation: Participation? - +status: StudyStatus? - +type: BadgeType - +showPrefixIcon: bool - +showTooltip: bool + + + StudyDesignNav - - - +Widget build() + + + <static>+dynamic tabs() + <static>+dynamic info() + <static>+dynamic enrollment() + <static>+dynamic interventions() + <static>+dynamic measurements() + <static>+dynamic reports() - - - - - + + + + + - - - StudyController + + + StudyPageWidget - - - +notificationService: INotificationService - +studyEventsSubscription: StreamSubscription<ModelEvent<Study>>? - +studyActions: List<ModelAction<dynamic>> + + + +studyId: String - - - +dynamic syncStudyStatus() - +dynamic onStudySubscriptionUpdate() - -dynamic _redirectNewToActualStudyID() - +dynamic publishStudy() - +void onChangeStudyParticipation() - +void onAddParticipants() - +void onSettingsPressed() - +void dispose() + + + +Widget? banner() - - - + + + - - - INotificationService + + + IWithBanner - - - + + + + + - - - StreamSubscription + + + StudyParticipationBadge - - - - - - + + + +participation: Participation + +type: BadgeType + +showPrefixIcon: bool + +center: bool + + - - - StudyBaseController + + + +Widget build() - - - +studyId: String - +studyRepository: IStudyRepository - +router: GoRouter - +studySubscription: StreamSubscription<WrappedModel<Study>>? + + + + + + + + IStudyRepository - - - +dynamic subscribeStudy() - +dynamic onStudySubscriptionUpdate() - +dynamic onStudySubscriptionError() - +void dispose() + + + + + + + + GoRouter - - + + - + PreviewFrame - + +studyId: String +routeArgs: StudyFormRouteArgs? @@ -1158,57 +1019,27 @@ - + - + StudyFormRouteArgs - - - - - - - - StudyTestController - - - - - - +authRepository: IAuthRepository - +languageCode: String - - - - - - - - - - - IAuthRepository - - - - - - + + - + IStudyAppBarViewModel - + +isSyncIndicatorVisible: bool +isStatusBadgeVisible: bool @@ -1219,16 +1050,16 @@ - - + + - + StudyScaffold - + +studyId: String +tabs: List<NavbarTab>? @@ -1249,9 +1080,9 @@ - + - + NavbarTab @@ -1260,9 +1091,9 @@ - + - + SingleColumnLayoutType @@ -1271,24 +1102,24 @@ - - - + + + - + WebFrame - + +previewSrc: String +studyId: String - + +Widget build() @@ -1297,16 +1128,16 @@ - - + + - + DisabledFrame - + +Widget build() @@ -1315,17 +1146,17 @@ - - - + + + - + PhoneContainer - + <static>+defaultWidth: double <static>+defaultHeight: double @@ -1339,7 +1170,7 @@ - + +Widget build() @@ -1348,9 +1179,9 @@ - + - + Color @@ -1359,16 +1190,16 @@ - - + + - + MobileFrame - + +Widget build() @@ -1377,29 +1208,198 @@ - - + + - + DesktopFrame - + +Widget build() - - - + + + + + - - - GoRouter + + + StudyTestScreen + + + + + + +previewRoute: String? + + + + + + +Widget build() + +Widget? banner() + +dynamic load() + +dynamic save() + +dynamic showHelp() + + + + + + + + + + + + + StudySettingsFormViewModel + + + + + + +study: AsyncValue<Study> + +studyRepository: IStudyRepository + <static>+defaultPublishedToRegistry: bool + <static>+defaultPublishedToRegistryResults: bool + +isPublishedToRegistryControl: FormControl<bool> + +isPublishedToRegistryResultsControl: FormControl<bool> + +form: FormGroup + +titles: Map<FormMode, String> + + + + + + +void setControlsFrom() + +Study buildFormData() + +dynamic keepControlsSynced() + +dynamic save() + +dynamic setLaunchDefaults() + + + + + + + + + + + AsyncValue + + + + + + + + + + + FormControl + + + + + + + + + + + FormGroup + + + + + + + + + + + FormViewModel + + + + + + + + + + + + StudySettingsDialog + + + + + + +Widget build() + + + + + + + + + + + + StudyTestController + + + + + + +authRepository: IAuthRepository + +languageCode: String + + + + + + + + + + + IAuthRepository + + + + + + + + + + + + TestAppRoutes + + + + + + <static>+studyOverview: String + <static>+eligibility: String + <static>+intervention: String + <static>+consent: String + <static>+journey: String + <static>+dashboard: String diff --git a/docs/uml/designer_v2/lib/features/uml.svg b/docs/uml/designer_v2/lib/features/uml.svg index a6d29463e..35e9bd57c 100644 --- a/docs/uml/designer_v2/lib/features/uml.svg +++ b/docs/uml/designer_v2/lib/features/uml.svg @@ -1,4 +1,4 @@ - + [<abstract>IAppDelegate | +dynamic onAppStart() @@ -6,7 +6,6 @@ [AppController | - +sharedPreferences: SharedPreferences; +appDelegates: List<IAppDelegate>; -_delayedFuture: dynamic; +isInitialized: dynamic @@ -15,8 +14,6 @@ -dynamic _callDelegates() ] - [AppController]o-[SharedPreferences] - [ParticipantDetailsFormView | +formViewModel: ParticipantDetailsFormViewModel @@ -171,13 +168,11 @@ [AuthFormController | +authRepository: IAuthRepository; - +sharedPreferences: SharedPreferences; +notificationService: INotificationService; +router: GoRouter; +emailControl: FormControl<String>; +passwordControl: FormControl<String>; +passwordConfirmationControl: FormControl<String>; - +rememberMeControl: FormControl<bool>; +termsOfServiceControl: FormControl<bool>; <static>+authValidationMessages: Map<String, String Function(dynamic)>; +loginForm: FormGroup; @@ -186,7 +181,6 @@ +passwordRecoveryForm: FormGroup; +controlValidatorsByForm: Map<AuthFormKey, Map<FormControl<dynamic>, List<Validator<dynamic>>>>; -_formKey: AuthFormKey; - +shouldRemember: bool; +formKey: AuthFormKey; +form: FormGroup | @@ -203,14 +197,10 @@ +dynamic sendPasswordResetLink(); +dynamic recoverPassword(); +dynamic updateUser(); - -dynamic _readDebugUser(); - -void _setRememberMe(); - -void _delRememberMe(); - -void _initRememberMe() + -dynamic _readDebugUser() ] [AuthFormController]o-[<abstract>IAuthRepository] - [AuthFormController]o-[SharedPreferences] [AuthFormController]o-[<abstract>INotificationService] [AuthFormController]o-[GoRouter] [AuthFormController]o-[FormControl] @@ -1994,6 +1984,31 @@ [<abstract>QuestionFormData]<:-[BoolQuestionFormData] + [ImageQuestionFormData + | + <static>+kResponseOptions: Map<String, FutureBlobFile>; + +responseOptions: List<String> + | + +Question<dynamic> toQuestion(); + +ImageQuestionFormData copy(); + +Answer<dynamic> constructAnswerFor() + ] + + [<abstract>QuestionFormData]<:-[ImageQuestionFormData] + + [AudioQuestionFormData + | + +maxRecordingDurationSeconds: int; + <static>+kResponseOptions: Map<String, FutureBlobFile>; + +responseOptions: List<String> + | + +Question<dynamic> toQuestion(); + +AudioQuestionFormData copy(); + +Answer<dynamic> constructAnswerFor() + ] + + [<abstract>QuestionFormData]<:-[AudioQuestionFormData] + [ScaleQuestionFormData | +minValue: double; @@ -2032,6 +2047,16 @@ [FreeTextQuestionFormData]o-[FreeTextQuestionType] [<abstract>QuestionFormData]<:-[FreeTextQuestionFormData] + [AudioRecordingQuestionFormView + | + +formViewModel: QuestionFormViewModel + | + +Widget build() + ] + + [AudioRecordingQuestionFormView]o-[QuestionFormViewModel] + [<abstract>ConsumerWidget]<:-[AudioRecordingQuestionFormView] + [FreeTextQuestionFormView | +formViewModel: QuestionFormViewModel; @@ -2052,12 +2077,24 @@ <static>+choice: SurveyQuestionType; <static>+bool: SurveyQuestionType; <static>+scale: SurveyQuestionType; + <static>+image: SurveyQuestionType; + <static>+audio: SurveyQuestionType; <static>+freeText: SurveyQuestionType ] [SurveyQuestionType]o-[SurveyQuestionType] [Enum]<:--[SurveyQuestionType] + [ImageCapturingQuestionFormView + | + +formViewModel: QuestionFormViewModel + | + +Widget build() + ] + + [ImageCapturingQuestionFormView]o-[QuestionFormViewModel] + [<abstract>ConsumerWidget]<:-[ImageCapturingQuestionFormView] + [<abstract>IScaleQuestionFormViewModel | +isMidValuesClearedInfoVisible: bool @@ -2105,6 +2142,11 @@ +customOptionsMax: int; +customOptionsInitial: int; +boolResponseOptionsArray: FormArray<String>; + +imageResponseOptionsArray: FormArray<String>; + <static>+kDefaultMaxRecordingDurationSeconds: int; + <static>+kMaxRecordingDurationSeconds: int; + +audioResponseOptionsArray: FormArray<String>; + +maxRecordingDurationSecondsControl: FormControl<int>; <static>+kDefaultScaleMinValue: int; <static>+kDefaultScaleMaxValue: int; <static>+kNumMidValueControls: int; @@ -2140,6 +2182,8 @@ +answerOptionsControls: List<AbstractControl<dynamic>>; +validAnswerOptions: List<String>; +boolOptions: List<AbstractControl<String>>; + +imageOptions: List<AbstractControl<String>>; + +audioOptions: List<AbstractControl<String>>; +scaleMinValue: int; +scaleMaxValue: int; +scaleRange: int; @@ -2148,6 +2192,7 @@ +questionTextRequired: dynamic; +numValidChoiceOptions: dynamic; +scaleRangeValid: dynamic; + +maxRecordingDurationValid: dynamic; +titles: Map<FormMode, String>; +isAddOptionButtonVisible: bool; +isMidValuesClearedInfoVisible: bool @@ -2402,1270 +2447,1278 @@ - + - - - - - + - - - - - - - + + + + + + + - + - + - + - + - + - - - + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - - + - + - - + + - + - + - - + + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - - + + - + - + - + - + - + - + - + - - - + + + - + - + - + - + - - + + - + - - - + + + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - - + + - + - + - + - - + + - + - - - + + + - - - + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - - - - - - + + + + + + + + + - + - - - + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - - + + + + + - + - + - + - - - - + + + + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - - - + + + - + - + - + - + - + - + - + - - - - - + + + + + - + - - - + + + - + - + - + - + - + - + - + - + - + - + - + - - - - - - - - - + + + + + + + + + - + - + - + - - + + - - - - - + + + + + - + - + - + - + - + - + - + - + - + - - - + + + - + - + - + - + - + - - + + - + - + - + - - - - - + + + + + - + - - - + + + - + - + - - + + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - - - - + + + + - + - - - + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - - - - - + + + + + - + - - - + + + - + - + - + - + - + - - - + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - - + + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - - + + - + - + - + - + - - + + - + - + - + - + - + - - - - - + + + + + - + - + - + - + - + - + - + - + - - + + - + - + - + - - - + + + - + - - - + + + - + - + - + - + - + - - - - - - + + + + + + - + - + - + - + - + - - - - + + + + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - - + + - + - + - + - - - + + + - + - + - + - - - - - + + + + + - + - - - - - + + + + + - + - + - + - + - + - + - - + + - + - - + + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - + + + + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - - + + - + - + - + - + - + - + - + - + - - + + - + - + + + + + + + + + + + + + + - - - - - - + + + - + - - - + + + - + - - - + + + - + - - - + + + - + - + + + + + + - - + + + - + - + - + - - - + + + - + - - - + + + - + - + - + - + - + - + - + - + - + - - + + - + - - + + - + - + - + - + - - + + - + - - - + + + - + - + - + - - - + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - - + + - - + + - + IAppDelegate - + +dynamic onAppStart() @@ -3674,26 +3727,25 @@ - - - + + + - + - AppController + AppController - + - +sharedPreferences: SharedPreferences - +appDelegates: List<IAppDelegate> - -_delayedFuture: dynamic - +isInitialized: dynamic + +appDelegates: List<IAppDelegate> + -_delayedFuture: dynamic + +isInitialized: dynamic - + +dynamic onAppStart() -dynamic _callDelegates() @@ -3701,17 +3753,6 @@ - - - - - - - SharedPreferences - - - - @@ -3739,17 +3780,17 @@ - - - + + + - + ParticipantDetailsFormViewModel - + +participantIdControl: FormControl<String> +rawDataControl: FormControl<String> @@ -3758,7 +3799,7 @@ - + +void initControls() +StudyMonitorItem buildFormData() @@ -3769,9 +3810,9 @@ - + - + FormConsumerWidget @@ -3780,16 +3821,16 @@ - - + + - + StudyMonitorScreen - + +Widget build() -Widget _monitorSectionHeader() @@ -3801,23 +3842,23 @@ - - - + + + - + StudyPageWidget - + +studyId: String - + +Widget? banner() @@ -3826,17 +3867,17 @@ - - - + + + - + StudyMonitorItem - + +participantId: String +inviteCode: String? @@ -3853,7 +3894,7 @@ - + <static>+List<StudyMonitorItem> fromStudy() @@ -3862,9 +3903,9 @@ - + - + Equatable @@ -3873,24 +3914,24 @@ - - - + + + - + StudyMonitorTable - + +studyMonitorItems: List<StudyMonitorItem> +onSelectItem: void Function(StudyMonitorItem) - + +Widget build() -List<Widget> _buildRow() @@ -3902,9 +3943,9 @@ - + - + void Function(StudyMonitorItem) @@ -3913,9 +3954,9 @@ - + - + FormControl @@ -3924,9 +3965,9 @@ - + - + FormGroup @@ -3935,17 +3976,17 @@ - - - + + + - + FormViewModel - + -_formData: T? -_formMode: FormMode @@ -3970,7 +4011,7 @@ - + -dynamic _setFormData() -dynamic _rememberDefaultControlValidators() @@ -3996,23 +4037,23 @@ - - - + + + - + LoginForm - + +formKey: AuthFormKey - + +Widget build() @@ -4021,16 +4062,16 @@ - - + + - + AuthFormKey - + +index: int <static>+values: List<AuthFormKey> @@ -4057,23 +4098,23 @@ - - - + + + - + PasswordRecoveryForm - + +formKey: AuthFormKey - + +Widget build() @@ -4082,23 +4123,23 @@ - - - + + + - + PasswordForgotForm - + +formKey: AuthFormKey - + +Widget build() @@ -4107,23 +4148,23 @@ - - - + + + - + SignupForm - + +formKey: AuthFormKey - + +Widget build() -dynamic _onClickTermsOfUse() @@ -4156,9 +4197,9 @@ - + - + Widget @@ -4167,9 +4208,9 @@ - + - + EdgeInsets @@ -4178,16 +4219,16 @@ - - + + - + EmailTextField - + +labelText: String +hintText: String? @@ -4199,16 +4240,16 @@ - - + + - + PasswordTextField - + +labelText: String +hintText: String? @@ -4221,9 +4262,9 @@ - + - + dynamic Function(FormControl<dynamic>)? @@ -4232,16 +4273,16 @@ - - + + - + StudyUJobsToBeDone - + +Widget build() @@ -4250,41 +4291,38 @@ - - - + + + - + AuthFormController - + +authRepository: IAuthRepository - +sharedPreferences: SharedPreferences - +notificationService: INotificationService - +router: GoRouter - +emailControl: FormControl<String> - +passwordControl: FormControl<String> - +passwordConfirmationControl: FormControl<String> - +rememberMeControl: FormControl<bool> - +termsOfServiceControl: FormControl<bool> - <static>+authValidationMessages: Map<String, String Function(dynamic)> - +loginForm: FormGroup - +signupForm: FormGroup - +passwordForgotForm: FormGroup - +passwordRecoveryForm: FormGroup - +controlValidatorsByForm: Map<AuthFormKey, Map<FormControl<dynamic>, List<Validator<dynamic>>>> - -_formKey: AuthFormKey - +shouldRemember: bool - +formKey: AuthFormKey - +form: FormGroup - - - - + +notificationService: INotificationService + +router: GoRouter + +emailControl: FormControl<String> + +passwordControl: FormControl<String> + +passwordConfirmationControl: FormControl<String> + +termsOfServiceControl: FormControl<bool> + <static>+authValidationMessages: Map<String, String Function(dynamic)> + +loginForm: FormGroup + +signupForm: FormGroup + +passwordForgotForm: FormGroup + +passwordRecoveryForm: FormGroup + +controlValidatorsByForm: Map<AuthFormKey, Map<FormControl<dynamic>, List<Validator<dynamic>>>> + -_formKey: AuthFormKey + +formKey: AuthFormKey + +form: FormGroup + + + + -dynamic _getFormFor() -dynamic _onChangeFormKey() @@ -4300,18 +4338,15 @@ +dynamic recoverPassword() +dynamic updateUser() -dynamic _readDebugUser() - -void _setRememberMe() - -void _delRememberMe() - -void _initRememberMe() - + - + IAuthRepository @@ -4320,9 +4355,9 @@ - + - + INotificationService @@ -4331,9 +4366,9 @@ - + - + GoRouter @@ -4342,16 +4377,16 @@ - - + + - + IFormGroupController - + +form: FormGroup @@ -4360,9 +4395,9 @@ - + - + Enum @@ -4371,16 +4406,16 @@ - - + + - + AppStatus - + +index: int <static>+values: List<AppStatus> @@ -4392,17 +4427,17 @@ - - - + + + - + FormArrayTable - + +control: AbstractControl<dynamic> +items: List<T> @@ -4426,7 +4461,7 @@ - + +Widget build() -List<Widget> _buildRow() @@ -4437,9 +4472,9 @@ - + - + AbstractControl @@ -4448,9 +4483,9 @@ - + - + void Function(T) @@ -4459,9 +4494,9 @@ - + - + List<ModelAction<dynamic>> Function(T, int) @@ -4470,9 +4505,9 @@ - + - + void Function()? @@ -4481,9 +4516,9 @@ - + - + String Function(T) @@ -4492,9 +4527,9 @@ - + - + IconData @@ -4503,9 +4538,9 @@ - + - + Widget Function(BuildContext, T, int)? @@ -4514,16 +4549,16 @@ - - + + - + ManagedFormViewModel - + +ManagedFormViewModel<T> createDuplicate() @@ -4532,9 +4567,9 @@ - + - + FormViewModelNotFoundException @@ -4543,9 +4578,9 @@ - + - + Exception @@ -4554,17 +4589,17 @@ - - - + + + - + FormViewModelCollection - + +formViewModels: List<T> +formArray: FormArray<dynamic> @@ -4574,7 +4609,7 @@ - + +void add() +T remove() @@ -4591,9 +4626,9 @@ - + - + FormArray @@ -4602,17 +4637,17 @@ - - - + + + - + CustomFormControl - + -_onValueChangedDebouncer: Debouncer? -_onStatusChangedDebouncer: Debouncer? @@ -4623,7 +4658,7 @@ - + +void dispose() @@ -4632,9 +4667,9 @@ - + - + Debouncer @@ -4643,9 +4678,9 @@ - + - + void Function(T?)? @@ -4654,9 +4689,9 @@ - + - + void Function(ControlStatus)? @@ -4665,16 +4700,16 @@ - - + + - + UnsavedChangesDialog - + +Widget build() @@ -4683,9 +4718,9 @@ - + - + FormValidationSetEnum @@ -4694,17 +4729,17 @@ - - - + + + - + FormControlValidation - + +control: AbstractControl<dynamic> +validators: List<Validator<dynamic>> @@ -4713,7 +4748,7 @@ - + +FormControlValidation merge() @@ -4722,23 +4757,23 @@ - - - + + + - + IFormData - + +id: String - + +IFormData copy() @@ -4747,9 +4782,9 @@ - + - + FormInvalidException @@ -4758,16 +4793,16 @@ - - + + - + FormConfigException - + +message: String? @@ -4776,16 +4811,16 @@ - - + + - + IFormViewModelDelegate - + +dynamic onSave() +void onCancel() @@ -4795,16 +4830,16 @@ - - + + - + FormControlOption - + +value: T +label: String @@ -4816,16 +4851,16 @@ - - + + - + FormMode - + +index: int <static>+values: List<FormMode> @@ -4838,9 +4873,9 @@ - + - + CancelableOperation @@ -4849,23 +4884,23 @@ - - - + + + - + EnrolledBadge - + +enrolledCount: int - + +Widget build() @@ -4874,24 +4909,24 @@ - - - + + + - + StudyRecruitController - + +inviteCodeRepository: IInviteCodeRepository -_invitesSubscription: StreamSubscription<List<WrappedModel<StudyInvite>>>? - + -dynamic _subscribeInvites() +Intervention? getIntervention() @@ -4905,9 +4940,9 @@ - + - + IInviteCodeRepository @@ -4916,9 +4951,9 @@ - + - + StreamSubscription @@ -4927,17 +4962,17 @@ - - - + + + - + StudyBaseController - + +studyId: String +studyRepository: IStudyRepository @@ -4946,7 +4981,7 @@ - + +dynamic subscribeStudy() +dynamic onStudySubscriptionUpdate() @@ -4969,16 +5004,16 @@ - - + + - + StudyRecruitScreen - + +Widget build() -Widget _inviteCodesSectionHeader() @@ -5016,17 +5051,17 @@ - - - + + + - + InviteCodeFormViewModel - + +study: Study +inviteCodeRepository: IInviteCodeRepository @@ -5045,7 +5080,7 @@ - + +void initControls() -dynamic _uniqueInviteCode() @@ -5060,17 +5095,17 @@ - - - + + + - + StudyInvitesTable - + +invites: List<StudyInvite> +onSelect: void Function(StudyInvite) @@ -5081,7 +5116,7 @@ - + +Widget build() -List<Widget> _buildRow() @@ -5091,9 +5126,9 @@ - + - + void Function(StudyInvite) @@ -5102,9 +5137,9 @@ - + - + List<ModelAction<dynamic>> Function(StudyInvite) @@ -5113,9 +5148,9 @@ - + - + Intervention? Function(String) @@ -5124,9 +5159,9 @@ - + - + int Function(StudyInvite) @@ -5135,9 +5170,9 @@ - + - + Study @@ -5146,16 +5181,16 @@ - - + + - + PublishSuccessDialog - + +Widget build() @@ -5164,16 +5199,16 @@ - - + + - + PublishDialog - + +Widget build() @@ -5182,16 +5217,16 @@ - - + + - + PublishConfirmationDialog - + +Widget build() @@ -5200,17 +5235,17 @@ - - - + + + - + FrameControlsWidget - + +onRefresh: void Function()? +onOpenNewTab: void Function()? @@ -5218,7 +5253,7 @@ - + +Widget build() @@ -5227,9 +5262,9 @@ - + - + ConsumerWidget @@ -5238,16 +5273,16 @@ - - + + - + IStudyStatusBadgeViewModel - + +studyParticipation: Participation? +studyStatus: StudyStatus? @@ -5257,9 +5292,9 @@ - + - + Participation @@ -5268,9 +5303,9 @@ - + - + StudyStatus @@ -5279,17 +5314,17 @@ - - - + + + - + StudyStatusBadge - + +participation: Participation? +status: StudyStatus? @@ -5299,7 +5334,7 @@ - + +Widget build() @@ -5308,9 +5343,9 @@ - + - + BadgeType @@ -5319,17 +5354,17 @@ - - - + + + - + RouteInformation - + +route: String? +extra: String? @@ -5338,7 +5373,7 @@ - + +String toString() @@ -5347,17 +5382,17 @@ - - - + + + - + PlatformController - + +studyId: String +baseSrc: String @@ -5367,7 +5402,7 @@ - + +void activate() +void registerViews() @@ -5383,23 +5418,23 @@ - - - + + + - + WebController - + +iFrameElement: IFrameElement - + +void activate() +void registerViews() @@ -5415,9 +5450,9 @@ - + - + IFrameElement @@ -5426,16 +5461,16 @@ - - + + - + MobileController - + +void openNewPage() +void refresh() @@ -5451,17 +5486,17 @@ - - - + + + - + StudyController - + +notificationService: INotificationService +studyEventsSubscription: StreamSubscription<ModelEvent<Study>>? @@ -5469,7 +5504,7 @@ - + +dynamic syncStudyStatus() +dynamic onStudySubscriptionUpdate() @@ -5485,16 +5520,16 @@ - - + + - + IStudyNavViewModel - + +isEditTabEnabled: bool +isTestTabEnabled: bool @@ -5508,16 +5543,16 @@ - - + + - + StudyNav - + <static>+dynamic tabs() <static>+dynamic edit() @@ -5531,16 +5566,16 @@ - - + + - + StudyDesignNav - + <static>+dynamic tabs() <static>+dynamic info() @@ -5554,9 +5589,9 @@ - + - + IWithBanner @@ -5565,17 +5600,17 @@ - - - + + + - + StudyParticipationBadge - + +participation: Participation +type: BadgeType @@ -5584,7 +5619,7 @@ - + +Widget build() @@ -5593,9 +5628,9 @@ - + - + IStudyRepository @@ -5604,16 +5639,16 @@ - - + + - + PreviewFrame - + +studyId: String +routeArgs: StudyFormRouteArgs? @@ -5624,9 +5659,9 @@ - + - + StudyFormRouteArgs @@ -5635,16 +5670,16 @@ - - + + - + IStudyAppBarViewModel - + +isSyncIndicatorVisible: bool +isStatusBadgeVisible: bool @@ -5655,16 +5690,16 @@ - - + + - + StudyScaffold - + +studyId: String +tabs: List<NavbarTab>? @@ -5685,9 +5720,9 @@ - + - + NavbarTab @@ -5696,9 +5731,9 @@ - + - + SingleColumnLayoutType @@ -5707,24 +5742,24 @@ - - - + + + - + WebFrame - + +previewSrc: String +studyId: String - + +Widget build() @@ -5733,16 +5768,16 @@ - - + + - + DisabledFrame - + +Widget build() @@ -5751,17 +5786,17 @@ - - - + + + - + PhoneContainer - + <static>+defaultWidth: double <static>+defaultHeight: double @@ -5775,7 +5810,7 @@ - + +Widget build() @@ -5784,9 +5819,9 @@ - + - + Color @@ -5795,16 +5830,16 @@ - - + + - + MobileFrame - + +Widget build() @@ -5813,16 +5848,16 @@ - - + + - + DesktopFrame - + +Widget build() @@ -5831,23 +5866,23 @@ - - - + + + - + StudyTestScreen - + +previewRoute: String? - + +Widget build() +Widget? banner() @@ -5860,17 +5895,17 @@ - - - + + + - + StudySettingsFormViewModel - + +study: AsyncValue<Study> +studyRepository: IStudyRepository @@ -5883,7 +5918,7 @@ - + +void setControlsFrom() +Study buildFormData() @@ -5896,9 +5931,9 @@ - + - + AsyncValue @@ -5907,16 +5942,16 @@ - - + + - + StudySettingsDialog - + +Widget build() @@ -5925,16 +5960,16 @@ - - + + - + StudyTestController - + +authRepository: IAuthRepository +languageCode: String @@ -5944,16 +5979,16 @@ - - + + - + TestAppRoutes - + <static>+studyOverview: String <static>+eligibility: String @@ -5967,17 +6002,17 @@ - - - + + + - + DrawerEntry - + +localizedTitle: String Function() +icon: IconData? @@ -5990,7 +6025,7 @@ - + +void onClick() @@ -5999,9 +6034,9 @@ - + - + String Function() @@ -6010,9 +6045,9 @@ - + - + String Function()? @@ -6021,9 +6056,9 @@ - + - + void Function(BuildContext, WidgetRef)? @@ -6032,24 +6067,24 @@ - - - + + + - + GoRouterDrawerEntry - + +intent: RoutingIntent +onNavigated: void Function()? - + +void onClick() @@ -6058,9 +6093,9 @@ - + - + RoutingIntent @@ -6069,16 +6104,16 @@ - - + + - + AppDrawer - + +width: int +autoCloseDrawer: bool @@ -6094,16 +6129,16 @@ - - + + - + StudyAnalyzeScreen - + +Widget? banner() +Widget build() @@ -6113,16 +6148,16 @@ - - + + - + StudyAnalyzeController - + +dynamic onExport() @@ -6131,16 +6166,16 @@ - - + + - + StudyDesignInterventionsFormView - + +Widget build() @@ -6149,16 +6184,16 @@ - - + + - + StudyDesignPageWidget - + +Widget? banner() @@ -6167,16 +6202,16 @@ - - + + - + InterventionFormView - + +formViewModel: InterventionFormViewModel @@ -6185,17 +6220,17 @@ - - - + + + - + InterventionFormViewModel - + +study: Study +interventionIdControl: FormControl<String> @@ -6214,7 +6249,7 @@ - + +void setControlsFrom() +InterventionFormData buildFormData() @@ -6235,23 +6270,23 @@ - - - + + + - + InterventionPreview - + +routeArgs: InterventionFormRouteArgs - + +Widget build() @@ -6260,9 +6295,9 @@ - + - + InterventionFormRouteArgs @@ -6342,17 +6377,17 @@ - - - + + + - + InterventionTaskFormData - + +taskId: String +taskTitle: String @@ -6362,7 +6397,7 @@ - + +CheckmarkTask toTask() +InterventionTaskFormData copy() @@ -6372,17 +6407,17 @@ - - - + + + - + IFormDataWithSchedule - + +instanceId: String +isTimeLocked: bool @@ -6393,7 +6428,7 @@ - + +Schedule toSchedule() @@ -6402,17 +6437,17 @@ - - - + + + - + InterventionsFormViewModel - + +study: Study +router: GoRouter @@ -6426,7 +6461,7 @@ - + +void setControlsFrom() +InterventionsFormData buildFormData() @@ -6446,9 +6481,9 @@ - + - + IListActionProvider @@ -6457,9 +6492,9 @@ - + - + IProviderArgsResolver @@ -6468,17 +6503,17 @@ - - - + + + - + InterventionTaskFormViewModel - + +taskIdControl: FormControl<String> +instanceIdControl: FormControl<String> @@ -6494,7 +6529,7 @@ - + +void setControlsFrom() +InterventionTaskFormData buildFormData() @@ -6505,17 +6540,17 @@ - - - + + + - + WithScheduleControls - + +isTimeRestrictedControl: FormControl<bool> +instanceID: FormControl<String> @@ -6534,7 +6569,7 @@ - + +void setScheduleControlsFrom() -dynamic _initReminderControl() @@ -6544,9 +6579,9 @@ - + - + PhaseSequence @@ -6555,17 +6590,17 @@ - - - + + + - + InterventionFormData - + +interventionId: String +title: String @@ -6577,7 +6612,7 @@ - + +Intervention toIntervention() +InterventionFormData copy() @@ -6587,17 +6622,17 @@ - - - + + + - + StudyScheduleFormData - + +sequenceType: PhaseSequence +sequenceTypeCustom: String @@ -6608,7 +6643,7 @@ - + +StudySchedule toStudySchedule() +Study apply() @@ -6619,16 +6654,16 @@ - - + + - + IStudyFormData - + +Study apply() @@ -6637,16 +6672,16 @@ - - + + - + InterventionTaskFormView - + +formViewModel: InterventionTaskFormViewModel @@ -6655,17 +6690,17 @@ - - - + + + - + InterventionsFormData - + +interventionsData: List<InterventionFormData> +studyScheduleData: StudyScheduleFormData @@ -6673,7 +6708,7 @@ - + +Study apply() +InterventionsFormData copy() @@ -6683,16 +6718,16 @@ - - + + - + StudyDesignReportsFormView - + +Widget build() -dynamic _showReportItemSidesheetWithArgs() @@ -6702,17 +6737,17 @@ - - - + + + - + ReportItemFormData - + +isPrimary: bool +section: ReportSection @@ -6720,7 +6755,7 @@ - + <static>+dynamic fromDomainModel() +ReportItemFormData copy() @@ -6730,9 +6765,9 @@ - + - + ReportSection @@ -6741,17 +6776,17 @@ - - - + + + - + DataReferenceEditor - + +formControl: FormControl<DataReferenceIdentifier<T>> +availableTasks: List<Task> @@ -6759,7 +6794,7 @@ - + +FormTableRow buildFormTableRow() -List<DropdownMenuItem<DataReferenceIdentifier<dynamic>>> _dataReferenceItems() @@ -6769,9 +6804,9 @@ - + - + ReactiveDropdownField @@ -6780,17 +6815,17 @@ - - - + + + - + TemporalAggregationFormatted - + -_value: TemporalAggregation <static>+values: List<TemporalAggregationFormatted> @@ -6801,7 +6836,7 @@ - + +bool ==() +String toString() @@ -6813,9 +6848,9 @@ - + - + TemporalAggregation @@ -6824,17 +6859,17 @@ - - - + + + - + ImprovementDirectionFormatted - + -_value: ImprovementDirection <static>+values: List<ImprovementDirectionFormatted> @@ -6845,7 +6880,7 @@ - + +bool ==() +String toString() @@ -6857,9 +6892,9 @@ - + - + ImprovementDirection @@ -6868,16 +6903,16 @@ - - + + - + ReportSectionType - + +index: int <static>+values: List<ReportSectionType> @@ -6889,17 +6924,17 @@ - - - + + + - + AverageSectionFormView - + +formViewModel: ReportItemFormViewModel +studyId: String @@ -6907,7 +6942,7 @@ - + +Widget build() @@ -6916,17 +6951,17 @@ - - - + + + - + ReportItemFormViewModel - + <static>+defaultSectionType: ReportSectionType +sectionIdControl: FormControl<String> @@ -6959,7 +6994,7 @@ - + -List<FormControlValidation> _getValidationConfig() +ReportItemFormData buildFormData() @@ -6973,23 +7008,23 @@ - - - + + + - + DataReferenceIdentifier - + +hashCode: int - + +bool ==() @@ -6998,9 +7033,9 @@ - + - + DataReference @@ -7009,17 +7044,17 @@ - - - + + + - + LinearRegressionSectionFormView - + +formViewModel: ReportItemFormViewModel +studyId: String @@ -7027,7 +7062,7 @@ - + +Widget build() @@ -7036,17 +7071,17 @@ - - - + + + - + ReportItemFormView - + +formViewModel: ReportItemFormViewModel +studyId: String @@ -7055,7 +7090,7 @@ - + +Widget build() -dynamic _buildSectionText() @@ -7066,9 +7101,9 @@ - + - + Widget Function(BuildContext) @@ -7077,17 +7112,17 @@ - - - + + + - + ReportsFormViewModel - + +study: Study +router: GoRouter @@ -7102,7 +7137,7 @@ - + +void setControlsFrom() +ReportsFormData buildFormData() @@ -7119,17 +7154,17 @@ - - - + + + - + ReportFormItemDelegate - + +formViewModelCollection: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData> +owner: ReportsFormViewModel @@ -7138,7 +7173,7 @@ - + +void onCancel() +dynamic onSave() @@ -7152,17 +7187,17 @@ - - - + + + - + ReportBadge - + +status: ReportStatus? +type: BadgeType @@ -7171,7 +7206,7 @@ - + +Widget build() @@ -7180,16 +7215,16 @@ - - + + - + ReportStatus - + +index: int <static>+values: List<ReportStatus> @@ -7201,24 +7236,24 @@ - - - + + + - + ReportsFormData - + +reportItems: List<ReportItemFormData> +id: String - + +Study apply() +ReportsFormData copy() @@ -7228,17 +7263,17 @@ - - - + + + - + StudyInfoFormViewModel - + +study: Study +titleControl: FormControl<String> @@ -7269,7 +7304,7 @@ - + +void setControlsFrom() +StudyInfoFormData buildFormData() @@ -7279,16 +7314,16 @@ - - + + - + StudyDesignInfoFormView - + +Widget build() @@ -7297,17 +7332,17 @@ - - - + + + - + StudyInfoFormData - + +title: String +description: String? @@ -7317,7 +7352,7 @@ - + +Study apply() +StudyInfoFormData copy() @@ -7327,17 +7362,17 @@ - - - + + + - + StudyContactInfoFormData - + +organization: String? +institutionalReviewBoard: String? @@ -7351,7 +7386,7 @@ - + +Study apply() +StudyInfoFormData copy() @@ -7361,16 +7396,16 @@ - - + + - + StudyFormValidationSet - + +index: int <static>+values: List<StudyFormValidationSet> @@ -7380,24 +7415,24 @@ - - - + + + - + MeasurementsFormData - + +surveyMeasurements: List<MeasurementSurveyFormData> +id: String - + +Study apply() +MeasurementsFormData copy() @@ -7407,16 +7442,16 @@ - - + + - + MeasurementSurveyFormView - + +formViewModel: MeasurementSurveyFormViewModel @@ -7425,17 +7460,17 @@ - - - + + + - + MeasurementSurveyFormViewModel - + +study: Study +measurementIdControl: FormControl<String> @@ -7454,7 +7489,7 @@ - + +void setControlsFrom() +MeasurementSurveyFormData buildFormData() @@ -7472,23 +7507,23 @@ - - - + + + - + SurveyPreview - + +routeArgs: MeasurementFormRouteArgs - + +Widget build() @@ -7497,9 +7532,9 @@ - + - + MeasurementFormRouteArgs @@ -7508,17 +7543,17 @@ - - - + + + - + MeasurementSurveyFormData - + +measurementId: String +title: String @@ -7530,7 +7565,7 @@ - + +QuestionnaireTask toQuestionnaireTask() +MeasurementSurveyFormData copy() @@ -7540,24 +7575,24 @@ - - - + + + - + QuestionnaireFormData - + +questionsData: List<QuestionFormData>? +id: String - + +StudyUQuestionnaire toQuestionnaire() +List<EligibilityCriterion> toEligibilityCriteria() @@ -7568,17 +7603,17 @@ - - - + + + - + WithQuestionnaireControls - + +questionsArray: FormArray<dynamic> +questionFormViewModels: FormViewModelCollection<Q, QuestionFormData> @@ -7589,7 +7624,7 @@ - + +void setQuestionnaireControlsFrom() +QuestionnaireFormData buildQuestionnaireFormData() @@ -7604,16 +7639,16 @@ - - + + - + StudyDesignMeasurementsFormView - + +Widget build() @@ -7622,17 +7657,17 @@ - - - + + + - + MeasurementsFormViewModel - + +study: Study +router: GoRouter @@ -7646,7 +7681,7 @@ - + +void read() +void setControlsFrom() @@ -7665,17 +7700,17 @@ - - - + + + - + StudyFormScaffold - + +studyId: String +formViewModelBuilder: T Function(WidgetRef) @@ -7683,7 +7718,7 @@ - + +Widget build() @@ -7692,9 +7727,9 @@ - + - + T Function(WidgetRef) @@ -7703,9 +7738,9 @@ - + - + Widget Function(T) @@ -7714,17 +7749,17 @@ - - - + + + - + ConsentItemFormViewModel - + +consentIdControl: FormControl<String> +titleControl: FormControl<String> @@ -7739,7 +7774,7 @@ - + +void setControlsFrom() +ConsentItemFormData buildFormData() @@ -7750,16 +7785,16 @@ - - + + - + StudyDesignEnrollmentFormView - + +Widget build() -dynamic _showScreenerQuestionSidesheetWithArgs() @@ -7770,16 +7805,16 @@ - - + + - + IScreenerQuestionLogicFormViewModel - + +isDirtyOptionsBannerVisible: bool @@ -7788,23 +7823,23 @@ - - - + + + - + ScreenerQuestionLogicFormView - + +formViewModel: ScreenerQuestionFormViewModel - + +Widget build() -dynamic _buildInfoBanner() @@ -7816,17 +7851,17 @@ - - - + + + - + ScreenerQuestionFormViewModel - + <static>+defaultResponseOptionValidity: bool +responseOptionsDisabledArray: FormArray<dynamic> @@ -7842,7 +7877,7 @@ - + +dynamic onResponseOptionsChanged() +void setControlsFrom() @@ -7857,17 +7892,17 @@ - - - + + + - + ConsentItemFormData - + +consentId: String +title: String @@ -7877,7 +7912,7 @@ - + +ConsentItem toConsentItem() +ConsentItemFormData copy() @@ -7887,16 +7922,16 @@ - - + + - + ConsentItemFormView - + +formViewModel: ConsentItemFormViewModel @@ -7905,17 +7940,17 @@ - - - + + + - + EnrollmentFormData - + <static>+kDefaultEnrollmentType: Participation +enrollmentType: Participation @@ -7925,7 +7960,7 @@ - + +Study apply() +EnrollmentFormData copy() @@ -7935,17 +7970,17 @@ - - - + + + - + QuestionFormViewModel - + <static>+defaultQuestionType: SurveyQuestionType -_titles: Map<FormMode, String Function()>? @@ -7960,56 +7995,64 @@ +customOptionsMax: int +customOptionsInitial: int +boolResponseOptionsArray: FormArray<String> - <static>+kDefaultScaleMinValue: int - <static>+kDefaultScaleMaxValue: int - <static>+kNumMidValueControls: int - <static>+kMidValueDebounceMilliseconds: int - +scaleMinValueControl: FormControl<int> - +scaleMaxValueControl: FormControl<int> - -_scaleRangeControl: FormControl<int> - +scaleMinLabelControl: FormControl<String> - +scaleMaxLabelControl: FormControl<String> - +scaleMidValueControls: FormArray<int> - +scaleMidLabelControls: FormArray<String?> - -_scaleResponseOptionsArray: FormArray<int> - +scaleMinColorControl: FormControl<SerializableColor> - +scaleMaxColorControl: FormControl<SerializableColor> - +prevMidValues: List<int?>? - +freeTextTypeControl: FormControl<FreeTextQuestionType> - +customRegexControl: FormControl<String> - +freeTextResponseOptionsArray: FormArray<dynamic> - +freeTextLengthMin: AbstractControl<int> - +freeTextLengthMax: AbstractControl<int> - +freeTextExampleTextControl: FormControl<String> - <static>+kDefaultFreeTextMinLength: int - <static>+kDefaultFreeTextMaxLength: int - +freeTextLengthControl: FormControl<RangeValues> - -_controlsByQuestionType: Map<SurveyQuestionType, FormGroup> - -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - -_validationConfigsByQuestionType: Map<SurveyQuestionType, Map<FormValidationSetEnum, List<FormControlValidation>>> - +form: FormGroup - +questionId: String - +questionType: SurveyQuestionType - +questionTypeControlOptions: List<FormControlOption<SurveyQuestionType>> - +answerOptionsArray: FormArray<dynamic> - +answerOptionsControls: List<AbstractControl<dynamic>> - +validAnswerOptions: List<String> - +boolOptions: List<AbstractControl<String>> - +scaleMinValue: int - +scaleMaxValue: int - +scaleRange: int - +scaleAllValueControls: List<AbstractControl<int>> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +questionTextRequired: dynamic - +numValidChoiceOptions: dynamic - +scaleRangeValid: dynamic - +titles: Map<FormMode, String> - +isAddOptionButtonVisible: bool - +isMidValuesClearedInfoVisible: bool - - - - + +imageResponseOptionsArray: FormArray<String> + <static>+kDefaultMaxRecordingDurationSeconds: int + <static>+kMaxRecordingDurationSeconds: int + +audioResponseOptionsArray: FormArray<String> + +maxRecordingDurationSecondsControl: FormControl<int> + <static>+kDefaultScaleMinValue: int + <static>+kDefaultScaleMaxValue: int + <static>+kNumMidValueControls: int + <static>+kMidValueDebounceMilliseconds: int + +scaleMinValueControl: FormControl<int> + +scaleMaxValueControl: FormControl<int> + -_scaleRangeControl: FormControl<int> + +scaleMinLabelControl: FormControl<String> + +scaleMaxLabelControl: FormControl<String> + +scaleMidValueControls: FormArray<int> + +scaleMidLabelControls: FormArray<String?> + -_scaleResponseOptionsArray: FormArray<int> + +scaleMinColorControl: FormControl<SerializableColor> + +scaleMaxColorControl: FormControl<SerializableColor> + +prevMidValues: List<int?>? + +freeTextTypeControl: FormControl<FreeTextQuestionType> + +customRegexControl: FormControl<String> + +freeTextResponseOptionsArray: FormArray<dynamic> + +freeTextLengthMin: AbstractControl<int> + +freeTextLengthMax: AbstractControl<int> + +freeTextExampleTextControl: FormControl<String> + <static>+kDefaultFreeTextMinLength: int + <static>+kDefaultFreeTextMaxLength: int + +freeTextLengthControl: FormControl<RangeValues> + -_controlsByQuestionType: Map<SurveyQuestionType, FormGroup> + -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + -_validationConfigsByQuestionType: Map<SurveyQuestionType, Map<FormValidationSetEnum, List<FormControlValidation>>> + +form: FormGroup + +questionId: String + +questionType: SurveyQuestionType + +questionTypeControlOptions: List<FormControlOption<SurveyQuestionType>> + +answerOptionsArray: FormArray<dynamic> + +answerOptionsControls: List<AbstractControl<dynamic>> + +validAnswerOptions: List<String> + +boolOptions: List<AbstractControl<String>> + +imageOptions: List<AbstractControl<String>> + +audioOptions: List<AbstractControl<String>> + +scaleMinValue: int + +scaleMaxValue: int + +scaleRange: int + +scaleAllValueControls: List<AbstractControl<int>> + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +questionTextRequired: dynamic + +numValidChoiceOptions: dynamic + +scaleRangeValid: dynamic + +maxRecordingDurationValid: dynamic + +titles: Map<FormMode, String> + +isAddOptionButtonVisible: bool + +isMidValuesClearedInfoVisible: bool + + + + +String? scaleMidLabelAt() -dynamic _onScaleRangeChanged() @@ -8035,17 +8078,17 @@ - - - + + + - + EnrollmentFormViewModel - + +study: Study +router: GoRouter @@ -8064,7 +8107,7 @@ - + +void setControlsFrom() +EnrollmentFormData buildFormData() @@ -8087,17 +8130,17 @@ - - - + + + - + EnrollmentFormConsentItemDelegate - + +formViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData> +owner: EnrollmentFormViewModel @@ -8106,7 +8149,7 @@ - + +void onCancel() +dynamic onSave() @@ -8120,17 +8163,17 @@ - - - + + + - + StudyFormViewModel - + +studyDirtyCopy: Study? +studyRepository: IStudyRepository @@ -8148,7 +8191,7 @@ - + +void read() +void setControlsFrom() @@ -8163,17 +8206,17 @@ - - - + + + - + QuestionFormData - + <static>+questionTypeFormDataFactories: Map<SurveyQuestionType, QuestionFormData Function(Question<dynamic>, List<EligibilityCriterion>)> +questionId: String @@ -8186,7 +8229,7 @@ - + +Question<dynamic> toQuestion() +EligibilityCriterion toEligibilityCriterion() @@ -8199,40 +8242,42 @@ - - + + - + SurveyQuestionType - + +index: int <static>+values: List<SurveyQuestionType> <static>+choice: SurveyQuestionType <static>+bool: SurveyQuestionType <static>+scale: SurveyQuestionType - <static>+freeText: SurveyQuestionType + <static>+image: SurveyQuestionType + <static>+audio: SurveyQuestionType + <static>+freeText: SurveyQuestionType - - - + + + - + ChoiceQuestionFormData - + +isMultipleChoice: bool +answerOptions: List<String> @@ -8240,7 +8285,7 @@ - + +Question<dynamic> toQuestion() +QuestionFormData copy() @@ -8252,24 +8297,24 @@ - - - + + + - + BoolQuestionFormData - + <static>+kResponseOptions: Map<String, bool> +responseOptions: List<String> - + +Question<dynamic> toQuestion() +BoolQuestionFormData copy() @@ -8278,19 +8323,76 @@ + + + + + + + + + ImageQuestionFormData + + + + + + <static>+kResponseOptions: Map<String, FutureBlobFile> + +responseOptions: List<String> + + + + + + +Question<dynamic> toQuestion() + +ImageQuestionFormData copy() + +Answer<dynamic> constructAnswerFor() + + + + + + + + + + + + + AudioQuestionFormData + + + + + + +maxRecordingDurationSeconds: int + <static>+kResponseOptions: Map<String, FutureBlobFile> + +responseOptions: List<String> + + + + + + +Question<dynamic> toQuestion() + +AudioQuestionFormData copy() + +Answer<dynamic> constructAnswerFor() + + + + - - - + + + - + ScaleQuestionFormData - + +minValue: double +maxValue: double @@ -8307,7 +8409,7 @@ - + +ScaleQuestion toQuestion() +QuestionFormData copy() @@ -8318,17 +8420,17 @@ - - - + + + - + FreeTextQuestionFormData - + +textLengthRange: List<int> +textType: FreeTextQuestionType @@ -8337,7 +8439,7 @@ - + +Question<dynamic> toQuestion() +FreeTextQuestionFormData copy() @@ -8348,35 +8450,60 @@ - + - + FreeTextQuestionType + + + + + + + + + AudioRecordingQuestionFormView + + + + + + +formViewModel: QuestionFormViewModel + + + + + + +Widget build() + + + + - - - + + + - + FreeTextQuestionFormView - + +formViewModel: QuestionFormViewModel +generateLabelHelpTextMap: dynamic - + +Widget build() +Widget disableOnReadonly() @@ -8385,18 +8512,43 @@ + + + + + + + + + ImageCapturingQuestionFormView + + + + + + +formViewModel: QuestionFormViewModel + + + + + + +Widget build() + + + + - - + + - + IScaleQuestionFormViewModel - + +isMidValuesClearedInfoVisible: bool @@ -8405,16 +8557,16 @@ - - + + - + ScaleQuestionFormView - + +formViewModel: QuestionFormViewModel @@ -8423,23 +8575,23 @@ - - - + + + - + ChoiceQuestionFormView - + +formViewModel: QuestionFormViewModel - + +Widget build() @@ -8448,23 +8600,23 @@ - - - + + + - + BoolQuestionFormView - + +formViewModel: QuestionFormViewModel - + +Widget build() @@ -8473,16 +8625,16 @@ - - + + - + SurveyQuestionFormView - + +formViewModel: QuestionFormViewModel +isHtmlStyleable: bool @@ -8492,9 +8644,9 @@ - + - + StudyUTimeOfDay @@ -8503,23 +8655,23 @@ - - - + + + - + ScheduleControls - + +formViewModel: WithScheduleControls - + +Widget build() -List<FormTableRow> _conditionalTimeRestrictions() @@ -8529,16 +8681,16 @@ - - + + - + StudiesTableColumnHeader - + +title: String +sortable: bool @@ -8551,16 +8703,16 @@ - - + + - + DashboardScreen - + +filter: StudiesFilter? @@ -8569,16 +8721,16 @@ - - + + - + StudiesFilter - + +index: int <static>+values: List<StudiesFilter> @@ -8588,24 +8740,24 @@ - - - + + + - + DashboardScaffold - + <static>+compactWidthThreshold: double +body: Widget - + +Widget build() @@ -8614,17 +8766,17 @@ - - - + + + - + DashboardController - + +studyRepository: IStudyRepository +authRepository: IAuthRepository @@ -8636,7 +8788,7 @@ - + -dynamic _subscribeStudies() +dynamic setSearchText() @@ -8658,9 +8810,9 @@ - + - + IUserRepository @@ -8669,9 +8821,9 @@ - + - + SearchController @@ -8680,17 +8832,17 @@ - - - + + + - + StudiesTableColumnSize - + +collapsed: bool +flex: int? @@ -8698,7 +8850,7 @@ - + +Widget createContainer() @@ -8707,17 +8859,17 @@ - - - + + + - + StudiesTable - + +itemHeight: double +itemPadding: double @@ -8735,7 +8887,7 @@ - + +Widget build() -Widget _buildColumnHeader() @@ -8745,9 +8897,9 @@ - + - + void Function(Study) @@ -8756,9 +8908,9 @@ - + - + List<ModelAction<dynamic>> Function(Study) @@ -8767,16 +8919,16 @@ - - + + - + StudiesTableColumn - + +index: int <static>+values: List<StudiesTableColumn> @@ -8795,16 +8947,16 @@ - - + + - + StudiesTableItem - + +study: Study +itemHeight: double @@ -8822,9 +8974,9 @@ - + - + void Function(Study, bool)? @@ -8833,9 +8985,9 @@ - + - + void Function(Study)? @@ -8844,9 +8996,9 @@ - + - + App @@ -8855,9 +9007,9 @@ - + - + AppContent @@ -8866,16 +9018,16 @@ - - + + - + AccountSettingsDialog - + +Widget build() diff --git a/docs/uml/designer_v2/lib/uml.svg b/docs/uml/designer_v2/lib/uml.svg index 88247b56d..22e73cd1e 100644 --- a/docs/uml/designer_v2/lib/uml.svg +++ b/docs/uml/designer_v2/lib/uml.svg @@ -1,4 +1,4 @@ - + [Config | <static>+isDebugMode: bool; @@ -34,6 +34,7 @@ +study: Study; +measurementsData: List<Map<String, dynamic>>; +interventionsData: List<Map<String, dynamic>>; + +mediaData: List<String>; +isEmpty: bool ] @@ -1504,7 +1505,6 @@ [AppController | - +sharedPreferences: SharedPreferences; +appDelegates: List<IAppDelegate>; -_delayedFuture: dynamic; +isInitialized: dynamic @@ -1513,8 +1513,6 @@ -dynamic _callDelegates() ] - [AppController]o-[SharedPreferences] - [ParticipantDetailsFormView | +formViewModel: ParticipantDetailsFormViewModel @@ -1669,13 +1667,11 @@ [AuthFormController | +authRepository: IAuthRepository; - +sharedPreferences: SharedPreferences; +notificationService: INotificationService; +router: GoRouter; +emailControl: FormControl<String>; +passwordControl: FormControl<String>; +passwordConfirmationControl: FormControl<String>; - +rememberMeControl: FormControl<bool>; +termsOfServiceControl: FormControl<bool>; <static>+authValidationMessages: Map<String, String Function(dynamic)>; +loginForm: FormGroup; @@ -1684,7 +1680,6 @@ +passwordRecoveryForm: FormGroup; +controlValidatorsByForm: Map<AuthFormKey, Map<FormControl<dynamic>, List<Validator<dynamic>>>>; -_formKey: AuthFormKey; - +shouldRemember: bool; +formKey: AuthFormKey; +form: FormGroup | @@ -1701,14 +1696,10 @@ +dynamic sendPasswordResetLink(); +dynamic recoverPassword(); +dynamic updateUser(); - -dynamic _readDebugUser(); - -void _setRememberMe(); - -void _delRememberMe(); - -void _initRememberMe() + -dynamic _readDebugUser() ] [AuthFormController]o-[<abstract>IAuthRepository] - [AuthFormController]o-[SharedPreferences] [AuthFormController]o-[<abstract>INotificationService] [AuthFormController]o-[GoRouter] [AuthFormController]o-[FormControl] @@ -3492,6 +3483,31 @@ [<abstract>QuestionFormData]<:-[BoolQuestionFormData] + [ImageQuestionFormData + | + <static>+kResponseOptions: Map<String, FutureBlobFile>; + +responseOptions: List<String> + | + +Question<dynamic> toQuestion(); + +ImageQuestionFormData copy(); + +Answer<dynamic> constructAnswerFor() + ] + + [<abstract>QuestionFormData]<:-[ImageQuestionFormData] + + [AudioQuestionFormData + | + +maxRecordingDurationSeconds: int; + <static>+kResponseOptions: Map<String, FutureBlobFile>; + +responseOptions: List<String> + | + +Question<dynamic> toQuestion(); + +AudioQuestionFormData copy(); + +Answer<dynamic> constructAnswerFor() + ] + + [<abstract>QuestionFormData]<:-[AudioQuestionFormData] + [ScaleQuestionFormData | +minValue: double; @@ -3530,6 +3546,16 @@ [FreeTextQuestionFormData]o-[FreeTextQuestionType] [<abstract>QuestionFormData]<:-[FreeTextQuestionFormData] + [AudioRecordingQuestionFormView + | + +formViewModel: QuestionFormViewModel + | + +Widget build() + ] + + [AudioRecordingQuestionFormView]o-[QuestionFormViewModel] + [<abstract>ConsumerWidget]<:-[AudioRecordingQuestionFormView] + [FreeTextQuestionFormView | +formViewModel: QuestionFormViewModel; @@ -3550,12 +3576,24 @@ <static>+choice: SurveyQuestionType; <static>+bool: SurveyQuestionType; <static>+scale: SurveyQuestionType; + <static>+image: SurveyQuestionType; + <static>+audio: SurveyQuestionType; <static>+freeText: SurveyQuestionType ] [SurveyQuestionType]o-[SurveyQuestionType] [Enum]<:--[SurveyQuestionType] + [ImageCapturingQuestionFormView + | + +formViewModel: QuestionFormViewModel + | + +Widget build() + ] + + [ImageCapturingQuestionFormView]o-[QuestionFormViewModel] + [<abstract>ConsumerWidget]<:-[ImageCapturingQuestionFormView] + [<abstract>IScaleQuestionFormViewModel | +isMidValuesClearedInfoVisible: bool @@ -3603,6 +3641,11 @@ +customOptionsMax: int; +customOptionsInitial: int; +boolResponseOptionsArray: FormArray<String>; + +imageResponseOptionsArray: FormArray<String>; + <static>+kDefaultMaxRecordingDurationSeconds: int; + <static>+kMaxRecordingDurationSeconds: int; + +audioResponseOptionsArray: FormArray<String>; + +maxRecordingDurationSecondsControl: FormControl<int>; <static>+kDefaultScaleMinValue: int; <static>+kDefaultScaleMaxValue: int; <static>+kNumMidValueControls: int; @@ -3638,6 +3681,8 @@ +answerOptionsControls: List<AbstractControl<dynamic>>; +validAnswerOptions: List<String>; +boolOptions: List<AbstractControl<String>>; + +imageOptions: List<AbstractControl<String>>; + +audioOptions: List<AbstractControl<String>>; +scaleMinValue: int; +scaleMaxValue: int; +scaleRange: int; @@ -3646,6 +3691,7 @@ +questionTextRequired: dynamic; +numValidChoiceOptions: dynamic; +scaleRangeValid: dynamic; + +maxRecordingDurationValid: dynamic; +titles: Map<FormMode, String>; +isAddOptionButtonVisible: bool; +isMidValuesClearedInfoVisible: bool @@ -4170,7 +4216,6 @@ [AuthRepository | +supabaseClient: SupabaseClient; - +sharedPreferences: SharedPreferences; +allowPasswordReset: bool; +authClient: GoTrueClient; +session: Session?; @@ -4189,7 +4234,6 @@ ] [AuthRepository]o-[SupabaseClient] - [AuthRepository]o-[SharedPreferences] [AuthRepository]o-[GoTrueClient] [AuthRepository]o-[Session] [AuthRepository]o-[User] @@ -4352,2270 +4396,2274 @@ - + - - - - - + + + + + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - - - - - + + + + + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - + + + - + - + - + - + - + - + - + - - - + + + - + - + - + - + - + - - - + + + - + - + - + - + - + - + - + - + - + - - - + + + - + - - - + + + - + - + - - + + - + - - - + + + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - - - - - + + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - + + + - + - + - - + + - + - + - + - - - - - - - - - - + + + + + + + + + + - + - - - - - - - - + + + + + + + + - + - - - - - - - + + + + + + + - + - - - + + + - + - + - + - + - + - + - + - - - + + + - + - + - + - + - + - + - + - + - + - - - - - + + + + + - + - - - + + + - + - - - - - - - - - - + - + + - + - + - + - - - - - + - + - + - + - - - - - - - - - + + + + + - + - - - - - - - - - + - + - + + + + + + + + + - + - - - - - - - + + + + + + + + + - + - + + + + + + + - + - + - + - - - + - + - - - + + + - + - - - + + + - + - - - + + + - + - - - + + + - + - + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - - + + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - - + + - + - + - + - + - + - + - + - - - + + + - + - + - + - + - - + + - + - - - + + + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - - + + - + - + - + - - + + - + - - - - + + + + - + - - - + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - - - - - - + + + + + + + + + - + - - - + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - - + + + + + - + - + - + - - - - + + + + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - - - + + + - + - + - + - + - + - + - + - - - - - + + + + + - + - - - + + + - + - + - + - + - + - + - + - + - + - + - + - - - - - - - - - + + + + + + + + + - + - + - + - - - + + + - + - - - - - + + + + + - + - + - + - + - + - + - + - + - + - - - - + + + + - + - + - + - + - + - - + + - + - + - + - - - - - + + + + + - + - + - + - - - + + + - + - + - - + + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - - - - + + + + - + - - - + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - - - - - + + + + + - + - - - + + + - + - + - + - + - + - - - + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - - + + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - - + + - + - + - + - + - - + + - + - + - + - + - + - - - - - + + + + + - + - + - + - + - + - + - + - + - - + + - + - + - + - - - + + + - + - - - + + + - + - + - + - + - + - - - - - - + + + + + + - + - + - + - + - + - - - - + + + + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - - + + - + - + - + - - - + + + - + - + - + - - - - - + + + + + - + - - - - - + + + + + - + - + - + - + - + - + - - + + - + - - + + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - + + + + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - - + + - + - + - + - + - + - + - + - + - - + + - + - + + + + + + + + + + + + + + - - - - - - + + + - + - - - + + + - + - - - + + + - + - - - + + + - + - + - - + + - + - + + + - + - - - + - + - - - + + + - + - + + + - + - + - + - + - + - + - + - - + + + + + + - + - - + + - + - + - + - + - - + + - + - - - + + + - + - + - + - - - + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - - + + - + - - + + - + - + - + - + - + - + - + - + - + - - + + - + - - + + - + - + - + - + - + - - + + - + - - + + - + - + - + - + - + - + - + - - + + - + - - + + - + - + - + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - - + + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - - + + - + - + - + - - - + + + - + - + - + - + - + - + - - - - - + - + - - - - + + + + - + - + - - + + - + - + - + - + - + - + - - + + - + - + - + - - - - - - - - - - + + + + + + + + + + - - + + - + Config - + <static>+isDebugMode: bool <static>+defaultLocale: Set<String> @@ -6630,9 +6678,9 @@ - + - + ResultTypes @@ -6641,16 +6689,16 @@ - - + + - + MeasurementResultTypes - + <static>+questionnaire: String <static>+values: List<String> @@ -6660,16 +6708,16 @@ - - + + - + InterventionResultTypes - + <static>+checkmarkTask: String <static>+values: List<String> @@ -6679,30 +6727,31 @@ - - + + - + StudyExportData - + +study: Study +measurementsData: List<Map<String, dynamic>> +interventionsData: List<Map<String, dynamic>> - +isEmpty: bool + +mediaData: List<String> + +isEmpty: bool - + - + Study @@ -6711,23 +6760,23 @@ - - - + + + - + StudyTemplates - + <static>+kUnnamedStudyTitle: String - + <static>+Study emptyDraft() @@ -6736,16 +6785,16 @@ - - + + - + StudyActionType - + +index: int <static>+values: List<StudyActionType> @@ -6763,9 +6812,9 @@ - + - + Enum @@ -6774,16 +6823,16 @@ - - + + - + Notifications - + <static>+credentialsInvalid: SnackbarIntent <static>+userAlreadyRegistered: SnackbarIntent @@ -6799,16 +6848,16 @@ - - + + - + SnackbarIntent - + +duration: int? @@ -6817,16 +6866,16 @@ - - + + - + AlertIntent - + +title: String +dismissOnAction: bool @@ -6837,16 +6886,16 @@ - - + + - + NotificationDefaultActions - + <static>+cancel: NotificationAction @@ -6855,16 +6904,16 @@ - - + + - + NotificationAction - + +label: String +onSelect: dynamic Function() @@ -6875,16 +6924,16 @@ - - + + - + INotificationService - + +void showMessage() +void show() @@ -6896,23 +6945,23 @@ - - - + + + - + NotificationService - + -_streamController: BehaviorSubject<NotificationIntent> - + +Stream<NotificationIntent> watchNotifications() +void showMessage() @@ -6924,9 +6973,9 @@ - + - + BehaviorSubject @@ -6935,17 +6984,17 @@ - - - + + + - + NotificationIntent - + +message: String? +customContent: Widget? @@ -6955,7 +7004,7 @@ - + +void register() @@ -6964,9 +7013,9 @@ - + - + Widget @@ -6975,9 +7024,9 @@ - + - + IconData @@ -6986,16 +7035,16 @@ - - + + - + NotificationType - + +index: int <static>+values: List<NotificationType> @@ -7008,9 +7057,9 @@ - + - + dynamic Function() @@ -7019,16 +7068,16 @@ - - + + - + IClipboardService - + +dynamic copy() @@ -7037,16 +7086,16 @@ - - + + - + ClipboardService - + +dynamic copy() @@ -7055,16 +7104,16 @@ - - + + - + NotificationDispatcher - + +child: Widget? +snackbarInnerPadding: double @@ -7077,9 +7126,9 @@ - + - + SnackBarBehavior @@ -7088,16 +7137,16 @@ - - + + - + Assets - + <static>+logoWide: String @@ -7106,17 +7155,17 @@ - - - + + + - + AsyncValueWidget - + +value: AsyncValue<T> +data: Widget Function(T) @@ -7126,7 +7175,7 @@ - + +Widget build() -Widget _buildDataOrEmptyWidget() @@ -7138,9 +7187,9 @@ - + - + AsyncValue @@ -7149,9 +7198,9 @@ - + - + Widget Function(T) @@ -7160,9 +7209,9 @@ - + - + Widget Function(Object, StackTrace?)? @@ -7171,9 +7220,9 @@ - + - + Widget Function()? @@ -7182,17 +7231,17 @@ - - - + + + - + FormControlLabel - + +formControl: AbstractControl<dynamic> +text: String @@ -7202,7 +7251,7 @@ - + +Widget build() @@ -7211,9 +7260,9 @@ - + - + AbstractControl @@ -7222,9 +7271,9 @@ - + - + TextStyle @@ -7233,9 +7282,9 @@ - + - + void Function(AbstractControl<dynamic>)? @@ -7244,17 +7293,17 @@ - - - + + + - + ActionPopUpMenuButton - + +actions: List<ModelAction<dynamic>> +triggerIconColor: Color? @@ -7270,7 +7319,7 @@ - + +Widget build() -Widget _buildPopupMenu() @@ -7280,9 +7329,9 @@ - + - + Color @@ -7291,9 +7340,9 @@ - + - + Axis @@ -7302,9 +7351,9 @@ - + - + PopupMenuPosition @@ -7313,16 +7362,16 @@ - - + + - + Search - + +onQueryChanged: dynamic Function(String) +searchController: SearchController? @@ -7334,9 +7383,9 @@ - + - + dynamic Function(String) @@ -7345,16 +7394,16 @@ - - + + - + SearchController - + +setText: void Function(String) @@ -7363,9 +7412,9 @@ - + - + void Function(String) @@ -7374,16 +7423,16 @@ - - + + - + FormScaffold - + +formViewModel: T +actions: List<Widget>? @@ -7397,17 +7446,17 @@ - - - + + + - + ConstrainedWidthFlexible - + +minWidth: double +maxWidth: double @@ -7418,7 +7467,7 @@ - + +Widget build() -double _getWidth() @@ -7428,9 +7477,9 @@ - + - + BoxConstraints @@ -7439,16 +7488,16 @@ - - + + - + PrimaryButton - + +text: String +icon: IconData? @@ -7468,9 +7517,9 @@ - + - + void Function()? @@ -7479,9 +7528,9 @@ - + - + dynamic Function()? @@ -7490,9 +7539,9 @@ - + - + EdgeInsets @@ -7501,9 +7550,9 @@ - + - + Size @@ -7512,16 +7561,16 @@ - - + + - + FormTableRow - + +label: String? +labelBuilder: Widget Function(BuildContext)? @@ -7536,9 +7585,9 @@ - + - + Widget Function(BuildContext)? @@ -7547,16 +7596,16 @@ - - + + - + FormTableRowLayout - + +index: int <static>+values: List<FormTableRowLayout> @@ -7568,17 +7617,17 @@ - - - + + + - + FormTableLayout - + +rows: List<FormTableRow> +columnWidths: Map<int, TableColumnWidth> @@ -7588,7 +7637,7 @@ - + +Widget build() @@ -7597,17 +7646,17 @@ - - - + + + - + FormSectionHeader - + +title: String +titleTextStyle: TextStyle? @@ -7617,7 +7666,7 @@ - + +Widget build() @@ -7626,17 +7675,17 @@ - - - + + + - + FormLabel - + +labelText: String? +helpText: String? @@ -7645,7 +7694,7 @@ - + +Widget build() @@ -7654,24 +7703,24 @@ - - - + + + - + DismissButton - + +onPressed: void Function()? +text: String? - + +Widget build() @@ -7680,17 +7729,17 @@ - - - + + + - + Badge - + +icon: IconData? +color: Color? @@ -7704,7 +7753,7 @@ - + +Widget build() -Color? _getBackgroundColor() @@ -7716,16 +7765,16 @@ - - + + - + BadgeType - + +index: int <static>+values: List<BadgeType> @@ -7739,17 +7788,17 @@ - - - + + + - + StandardDialog - + +title: Widget? +titleText: String? @@ -7767,7 +7816,7 @@ - + +Widget build() @@ -7776,16 +7825,16 @@ - - + + - + ISyncIndicatorViewModel - + +isDirty: bool +lastSynced: DateTime? @@ -7795,16 +7844,16 @@ - - + + - + SyncIndicator - + +state: AsyncValue<T> +lastSynced: DateTime? @@ -7817,16 +7866,16 @@ - - + + - + IWithBanner - + +Widget? banner() @@ -7835,16 +7884,16 @@ - - + + - + BannerBox - + +prefixIcon: Widget? +body: Widget @@ -7861,16 +7910,16 @@ - - + + - + BannerStyle - + +index: int <static>+values: List<BannerStyle> @@ -7883,17 +7932,17 @@ - - - + + + - + ActionMenuInline - + +actions: List<ModelAction<dynamic>> +iconSize: double? @@ -7904,7 +7953,7 @@ - + +Widget build() @@ -7913,16 +7962,16 @@ - - + + - + Collapsible - + +contentBuilder: Widget Function(BuildContext, bool) +headerBuilder: Widget Function(BuildContext, bool)? @@ -7934,9 +7983,9 @@ - + - + Widget Function(BuildContext, bool) @@ -7945,9 +7994,9 @@ - + - + Widget Function(BuildContext, bool)? @@ -7956,16 +8005,16 @@ - - + + - + NavbarTab - + +title: String +intent: RoutingIntent? @@ -7977,17 +8026,17 @@ - - - + + + - + RoutingIntent - + +route: GoRoute +params: Map<String, String> @@ -8000,7 +8049,7 @@ - + -dynamic _validateRoute() +bool matches() @@ -8010,16 +8059,16 @@ - - + + - + TabbedNavbar - + +tabs: List<T> +selectedTab: T? @@ -8041,9 +8090,9 @@ - + - + BoxDecoration @@ -8052,9 +8101,9 @@ - + - + void Function(int, T)? @@ -8063,9 +8112,9 @@ - + - + TabBarIndicatorSize @@ -8074,16 +8123,16 @@ - - + + - + SidesheetTab - + +builder: Widget Function(BuildContext) @@ -8092,9 +8141,9 @@ - + - + Widget Function(BuildContext) @@ -8103,16 +8152,16 @@ - - + + - + Sidesheet - + <static>+kDefaultWidth: double +titleText: String @@ -8131,9 +8180,9 @@ - + - + Widget Function(Widget)? @@ -8142,16 +8191,16 @@ - - + + - + FormSideSheetTab - + +formViewBuilder: Widget Function(T) @@ -8160,23 +8209,23 @@ - - - + + + - + HelpIcon - + +tooltipText: String? - + +Widget build() @@ -8185,17 +8234,17 @@ - - - + + + - + EmptyBody - + +icon: IconData? +leading: Widget? @@ -8206,7 +8255,7 @@ - + +Widget build() @@ -8215,17 +8264,17 @@ - - - + + + - + IndicatorRangeSliderThumbShape - + +buildContext: BuildContext +start: T @@ -8233,7 +8282,7 @@ - + +Size getPreferredSize() +void paint() @@ -8243,9 +8292,9 @@ - + - + BuildContext @@ -8254,9 +8303,9 @@ - + - + RangeSliderThumbShape @@ -8265,16 +8314,16 @@ - - + + - + MouseEventsRegion - + +onTap: void Function()? +onHover: void Function(PointerHoverEvent)? @@ -8290,9 +8339,9 @@ - + - + void Function(PointerHoverEvent)? @@ -8301,9 +8350,9 @@ - + - + void Function(PointerEnterEvent)? @@ -8312,9 +8361,9 @@ - + - + void Function(PointerExitEvent)? @@ -8323,9 +8372,9 @@ - + - + SystemMouseCursor @@ -8334,9 +8383,9 @@ - + - + ReactiveCustomColorPicker @@ -8345,9 +8394,9 @@ - + - + ReactiveFormField @@ -8356,17 +8405,17 @@ - - - + + + - + TextParagraph - + +text: String? +style: TextStyle? @@ -8375,7 +8424,7 @@ - + +Widget build() @@ -8384,16 +8433,16 @@ - - + + - + UnderConstruction - + +Widget build() @@ -8402,9 +8451,9 @@ - + - + NullHelperDecoration @@ -8413,9 +8462,9 @@ - + - + InputDecoration @@ -8424,16 +8473,16 @@ - - + + - + ActionMenuType - + +index: int <static>+values: List<ActionMenuType> @@ -8445,24 +8494,24 @@ - - - + + + - + HtmlStylingBanner - + +isDismissed: bool +onDismissed: dynamic Function()? - + +Widget build() @@ -8471,16 +8520,16 @@ - - + + - + FormConsumerWidget - + +Widget build() @@ -8489,16 +8538,16 @@ - - + + - + FormConsumerRefWidget - + +Widget build() @@ -8507,16 +8556,16 @@ - - + + - + SplashPage - + +Widget build() @@ -8525,23 +8574,23 @@ - - - + + + - + ErrorPage - + +error: Exception? - + +Widget build() @@ -8550,9 +8599,9 @@ - + - + ConsumerWidget @@ -8561,23 +8610,23 @@ - - - + + + - + StudyULogo - + +onTap: void Function()? - + +Widget build() @@ -8586,17 +8635,17 @@ - - - + + + - + SingleColumnLayout - + <static>+defaultConstraints: BoxConstraints <static>+defaultConstraintsNarrow: BoxConstraints @@ -8609,7 +8658,7 @@ - + <static>+dynamic fromType() @@ -8618,16 +8667,16 @@ - - + + - + SingleColumnLayoutType - + +index: int <static>+values: List<SingleColumnLayoutType> @@ -8641,16 +8690,16 @@ - - + + - + Hyperlink - + +text: String +url: String? @@ -8669,16 +8718,16 @@ - - + + - + StandardTableColumn - + +label: String +tooltip: String? @@ -8692,9 +8741,9 @@ - + - + TableColumnWidth @@ -8703,16 +8752,16 @@ - - + + - + StandardTable - + +items: List<T> +inputColumns: List<StandardTableColumn> @@ -8744,9 +8793,9 @@ - + - + void Function(T) @@ -8755,9 +8804,9 @@ - + - + List<ModelAction<dynamic>> Function(T, int)? @@ -8766,9 +8815,9 @@ - + - + int Function(T, T)? @@ -8777,9 +8826,9 @@ - + - + TableRow Function(BuildContext, List<StandardTableColumn>)? @@ -8788,16 +8837,16 @@ - - + + - + StandardTableStyle - + +index: int <static>+values: List<StandardTableStyle> @@ -8809,24 +8858,24 @@ - - - + + + - + IconPack - + <static>+defaultPack: List<IconOption> <static>+material: List<IconOption> - + <static>+IconOption? resolveIconByName() @@ -8835,17 +8884,17 @@ - - - + + + - + IconOption - + +name: String +icon: IconData? @@ -8854,7 +8903,7 @@ - + +String toJson() <static>+IconOption fromJson() @@ -8864,9 +8913,9 @@ - + - + Equatable @@ -8875,9 +8924,9 @@ - + - + ReactiveIconPicker @@ -8886,9 +8935,9 @@ - + - + ReactiveFocusableFormField @@ -8897,17 +8946,17 @@ - - - + + + - + IconPicker - + +iconOptions: List<IconOption> +selectedOption: IconOption? @@ -8919,7 +8968,7 @@ - + +Widget build() @@ -8928,9 +8977,9 @@ - + - + void Function(IconOption)? @@ -8939,9 +8988,9 @@ - + - + FocusNode @@ -8950,17 +8999,17 @@ - - - + + + - + IconPickerField - + +iconOptions: List<IconOption> +selectedOption: IconOption? @@ -8972,7 +9021,7 @@ - + +Widget build() @@ -8981,17 +9030,17 @@ - - - + + + - + IconPickerGallery - + +iconOptions: List<IconOption> +onSelect: void Function(IconOption)? @@ -8999,7 +9048,7 @@ - + +Widget build() @@ -9008,17 +9057,17 @@ - - - + + + - + SecondaryButton - + +text: String +icon: IconData? @@ -9027,7 +9076,7 @@ - + +Widget build() @@ -9036,16 +9085,16 @@ - - + + - + TwoColumnLayout - + <static>+defaultDivider: VerticalDivider <static>+defaultContentPadding: EdgeInsets @@ -9071,9 +9120,9 @@ - + - + VerticalDivider @@ -9082,16 +9131,16 @@ - - + + - + AppTranslation - + <static>+dynamic init() @@ -9100,16 +9149,16 @@ - - + + - + PlatformLocale - + +Locale getPlatformLocale() @@ -9118,16 +9167,16 @@ - - + + - + PlatformLocaleWeb - + +Locale getPlatformLocale() @@ -9136,16 +9185,16 @@ - - + + - + PlatformLocaleMobile - + +Locale getPlatformLocale() @@ -9154,16 +9203,16 @@ - - + + - + LanguagePicker - + +languagePickerType: LanguagePickerType +iconColor: Color? @@ -9174,16 +9223,16 @@ - - + + - + LanguagePickerType - + +index: int <static>+values: List<LanguagePickerType> @@ -9195,9 +9244,9 @@ - + - + Offset @@ -9206,16 +9255,16 @@ - - + + - + GoRouteParamEnum - + +String toRouteParam() +String toShortString() @@ -9225,16 +9274,16 @@ - - + + - + RoutingIntents - + <static>+root: RoutingIntent <static>+studies: RoutingIntent @@ -9268,9 +9317,9 @@ - + - + RoutingIntent Function(String) @@ -9279,9 +9328,9 @@ - + - + RoutingIntent Function(String, String) @@ -9290,9 +9339,9 @@ - + - + RoutingIntent Function(String, {String? appRoute}) @@ -9301,9 +9350,9 @@ - + - + RoutingIntent Function(Exception) @@ -9312,9 +9361,9 @@ - + - + GoRoute @@ -9323,16 +9372,16 @@ - - + + - + RoutingIntentDispatch - + +index: int <static>+values: List<RoutingIntentDispatch> @@ -9344,16 +9393,16 @@ - - + + - + RouterKeys - + <static>+studyKey: ValueKey<String> <static>+authKey: ValueKey<String> @@ -9363,9 +9412,9 @@ - + - + ValueKey @@ -9374,16 +9423,16 @@ - - + + - + RouteParams - + <static>+studiesFilter: String <static>+studyId: String @@ -9396,17 +9445,17 @@ - - - + + + - + RouterConf - + <static>+router: GoRouter <static>+routes: List<GoRoute> @@ -9415,7 +9464,7 @@ - + <static>+GoRoute route() @@ -9424,9 +9473,9 @@ - + - + GoRouter @@ -9435,16 +9484,16 @@ - - + + - + StudyFormRouteArgs - + +studyId: String @@ -9453,16 +9502,16 @@ - - + + - + QuestionFormRouteArgs - + +questionId: String @@ -9471,9 +9520,9 @@ - + - + ScreenerQuestionFormRouteArgs @@ -9482,16 +9531,16 @@ - - + + - + ConsentItemFormRouteArgs - + +consentId: String @@ -9500,16 +9549,16 @@ - - + + - + MeasurementFormRouteArgs - + +measurementId: String @@ -9518,16 +9567,16 @@ - - + + - + SurveyQuestionFormRouteArgs - + +questionId: String @@ -9536,16 +9585,16 @@ - - + + - + InterventionFormRouteArgs - + +interventionId: String @@ -9554,16 +9603,16 @@ - - + + - + InterventionTaskFormRouteArgs - + +taskId: String @@ -9572,16 +9621,16 @@ - - + + - + ReportItemFormRouteArgs - + +sectionId: String @@ -9590,16 +9639,16 @@ - - + + - + DropdownMenuItemTheme - + +iconTheme: IconThemeData? @@ -9608,9 +9657,9 @@ - + - + IconThemeData @@ -9619,9 +9668,9 @@ - + - + Diagnosticable @@ -9630,17 +9679,17 @@ - - - + + + - + ThemeConfig - + <static>+kMinContentWidth: double <static>+kMaxContentWidth: double @@ -9649,7 +9698,7 @@ - + <static>+dynamic bodyBackgroundColor() <static>+Color modalBarrierColor() @@ -9667,16 +9716,16 @@ - - + + - + NoAnimationPageTransitionsBuilder - + +Widget buildTransitions() @@ -9685,9 +9734,9 @@ - + - + PageTransitionsBuilder @@ -9696,16 +9745,16 @@ - - + + - + WebTransitionBuilder - + +Widget buildTransitions() @@ -9714,16 +9763,16 @@ - - + + - + ThemeSettingChange - + +settings: ThemeSettings @@ -9732,16 +9781,16 @@ - - + + - + ThemeSettings - + +sourceColor: Color +themeMode: ThemeMode @@ -9751,9 +9800,9 @@ - + - + Notification @@ -9762,17 +9811,17 @@ - - - + + + - + ThemeProvider - + +settings: ValueNotifier<ThemeSettings> +lightDynamic: ColorScheme? @@ -9782,7 +9831,7 @@ - + +Color custom() +Color blend() @@ -9817,9 +9866,9 @@ - + - + ValueNotifier @@ -9828,9 +9877,9 @@ - + - + ColorScheme @@ -9839,9 +9888,9 @@ - + - + PageTransitionsTheme @@ -9850,9 +9899,9 @@ - + - + ShapeBorder @@ -9861,9 +9910,9 @@ - + - + InheritedWidget @@ -9872,9 +9921,9 @@ - + - + ThemeMode @@ -9883,17 +9932,17 @@ - - - + + + - + CustomColor - + +name: String +color: Color @@ -9901,7 +9950,7 @@ - + +Color value() @@ -9910,17 +9959,17 @@ - - - + + + - + SuppressedBehaviorSubject - + +subject: BehaviorSubject<T> +didSuppressInitialEvent: bool @@ -9928,7 +9977,7 @@ - + -StreamController<T> _buildDerivedController() +dynamic close() @@ -9938,9 +9987,9 @@ - + - + StreamController @@ -9949,16 +9998,16 @@ - - + + - + Time - + <static>+dynamic fromTimeOfDay() +Map<String, dynamic> toJson() @@ -9969,9 +10018,9 @@ - + - + TimeOfDay @@ -9980,16 +10029,16 @@ - - + + - + TimeValueAccessor - + +String modelToViewValue() +Time? viewToModelValue() @@ -10000,9 +10049,9 @@ - + - + ControlValueAccessor @@ -10011,16 +10060,16 @@ - - + + - + ModelAction - + +type: T +label: String @@ -10034,16 +10083,16 @@ - - + + - + IModelActionProvider - + +List<ModelAction<dynamic>> availableActions() @@ -10052,16 +10101,16 @@ - - + + - + IListActionProvider - + +void onSelectItem() +void onNewItem() @@ -10071,16 +10120,16 @@ - - + + - + ModelActionType - + +index: int <static>+values: List<ModelActionType> @@ -10096,17 +10145,17 @@ - - - + + + - + OptimisticUpdate - + +applyOptimistic: void Function() +apply: dynamic Function() @@ -10119,7 +10168,7 @@ - + +dynamic execute() -void _runUpdateHandlerIfAny() @@ -10129,9 +10178,9 @@ - + - + void Function() @@ -10140,9 +10189,9 @@ - + - + void Function(Object, StackTrace?)? @@ -10151,16 +10200,16 @@ - - + + - + FileFormatEncoder - + +dynamic encodeAsync() +String encode() @@ -10171,16 +10220,16 @@ - - + + - + CSVStringEncoder - + +String encode() @@ -10189,16 +10238,16 @@ - - + + - + JsonStringEncoder - + +String encode() @@ -10207,24 +10256,24 @@ - - - + + + - + ExecutionLimiter - + +milliseconds: int <static>-_timer: Timer? - + +void dispose() @@ -10233,9 +10282,9 @@ - + - + Timer @@ -10244,17 +10293,17 @@ - - - + + + - + Debouncer - + +leading: bool +cancelUncompleted: bool @@ -10262,7 +10311,7 @@ - + +dynamic call() @@ -10271,9 +10320,9 @@ - + - + CancelableOperation @@ -10282,16 +10331,16 @@ - - + + - + Throttler - + +dynamic call() @@ -10300,16 +10349,16 @@ - - + + - + SerializableColor - + +Map<String, dynamic> toJson() <static>+SerializableColor fromJson() @@ -10319,16 +10368,16 @@ - - + + - + IProviderArgsResolver - + +R provide() @@ -10337,23 +10386,23 @@ - - - + + + - + CombinedStreamNotifier - + -_subscriptions: List<StreamSubscription<dynamic>> - + +void dispose() @@ -10362,9 +10411,9 @@ - + - + ChangeNotifier @@ -10373,17 +10422,17 @@ - - - + + + - + CountWhereValidator - + +predicate: bool Function(T?) +minCount: int? @@ -10393,7 +10442,7 @@ - + +Map<String, dynamic>? validate() @@ -10402,9 +10451,9 @@ - + - + bool Function(T?) @@ -10413,9 +10462,9 @@ - + - + Validator @@ -10424,16 +10473,16 @@ - - + + - + Patterns - + <static>+timeFormatString: String <static>+emailFormatString: String @@ -10444,24 +10493,24 @@ - - - + + + - + NumericalRangeFormatter - + +min: int? +max: int? - + +TextEditingValue formatEditUpdate() @@ -10470,9 +10519,9 @@ - + - + TextInputFormatter @@ -10481,16 +10530,16 @@ - - + + - + StudySequenceFormatter - + +TextEditingValue formatEditUpdate() @@ -10499,17 +10548,17 @@ - - - + + + - + Tuple - + +first: T1 +second: T2 @@ -10517,7 +10566,7 @@ - + +Map<String, dynamic> toJson() <static>+Tuple<dynamic, dynamic> fromJson() @@ -10529,23 +10578,23 @@ - - - + + + - + JsonFileLoader - + +jsonAssetsPath: String - + +dynamic loadJson() +dynamic parseJsonMapFromAssets() @@ -10556,16 +10605,16 @@ - - + + - + IAppDelegate - + +dynamic onAppStart() @@ -10574,26 +10623,25 @@ - - - + + + - + - AppController + AppController - + - +sharedPreferences: SharedPreferences - +appDelegates: List<IAppDelegate> - -_delayedFuture: dynamic - +isInitialized: dynamic + +appDelegates: List<IAppDelegate> + -_delayedFuture: dynamic + +isInitialized: dynamic - + +dynamic onAppStart() -dynamic _callDelegates() @@ -10601,36 +10649,25 @@ - - - - - - - SharedPreferences - - - - - - - + + + - + ParticipantDetailsFormView - + +formViewModel: ParticipantDetailsFormViewModel - + +Widget build() @@ -10639,17 +10676,17 @@ - - - + + + - + ParticipantDetailsFormViewModel - + +participantIdControl: FormControl<String> +rawDataControl: FormControl<String> @@ -10658,7 +10695,7 @@ - + +void initControls() +StudyMonitorItem buildFormData() @@ -10669,16 +10706,16 @@ - - + + - + StudyMonitorScreen - + +Widget build() -Widget _monitorSectionHeader() @@ -10690,23 +10727,23 @@ - - - + + + - + StudyPageWidget - + +studyId: String - + +Widget? banner() @@ -10715,17 +10752,17 @@ - - - + + + - + StudyMonitorItem - + +participantId: String +inviteCode: String? @@ -10742,7 +10779,7 @@ - + <static>+List<StudyMonitorItem> fromStudy() @@ -10751,24 +10788,24 @@ - - - + + + - + StudyMonitorTable - + +studyMonitorItems: List<StudyMonitorItem> +onSelectItem: void Function(StudyMonitorItem) - + +Widget build() -List<Widget> _buildRow() @@ -10780,9 +10817,9 @@ - + - + void Function(StudyMonitorItem) @@ -10791,9 +10828,9 @@ - + - + FormControl @@ -10802,9 +10839,9 @@ - + - + FormGroup @@ -10813,17 +10850,17 @@ - - - + + + - + FormViewModel - + -_formData: T? -_formMode: FormMode @@ -10848,7 +10885,7 @@ - + -dynamic _setFormData() -dynamic _rememberDefaultControlValidators() @@ -10874,23 +10911,23 @@ - - - + + + - + LoginForm - + +formKey: AuthFormKey - + +Widget build() @@ -10899,16 +10936,16 @@ - - + + - + AuthFormKey - + +index: int <static>+values: List<AuthFormKey> @@ -10924,23 +10961,23 @@ - - - + + + - + PasswordRecoveryForm - + +formKey: AuthFormKey - + +Widget build() @@ -10949,23 +10986,23 @@ - - - + + + - + PasswordForgotForm - + +formKey: AuthFormKey - + +Widget build() @@ -10974,23 +11011,23 @@ - - - + + + - + SignupForm - + +formKey: AuthFormKey - + +Widget build() -dynamic _onClickTermsOfUse() @@ -11001,16 +11038,16 @@ - - + + - + AuthScaffold - + +body: Widget +formKey: AuthFormKey @@ -11023,16 +11060,16 @@ - - + + - + EmailTextField - + +labelText: String +hintText: String? @@ -11044,16 +11081,16 @@ - - + + - + PasswordTextField - + +labelText: String +hintText: String? @@ -11066,9 +11103,9 @@ - + - + dynamic Function(FormControl<dynamic>)? @@ -11077,16 +11114,16 @@ - - + + - + StudyUJobsToBeDone - + +Widget build() @@ -11095,41 +11132,38 @@ - - - + + + - + AuthFormController - + +authRepository: IAuthRepository - +sharedPreferences: SharedPreferences - +notificationService: INotificationService - +router: GoRouter - +emailControl: FormControl<String> - +passwordControl: FormControl<String> - +passwordConfirmationControl: FormControl<String> - +rememberMeControl: FormControl<bool> - +termsOfServiceControl: FormControl<bool> - <static>+authValidationMessages: Map<String, String Function(dynamic)> - +loginForm: FormGroup - +signupForm: FormGroup - +passwordForgotForm: FormGroup - +passwordRecoveryForm: FormGroup - +controlValidatorsByForm: Map<AuthFormKey, Map<FormControl<dynamic>, List<Validator<dynamic>>>> - -_formKey: AuthFormKey - +shouldRemember: bool - +formKey: AuthFormKey - +form: FormGroup - - - - + +notificationService: INotificationService + +router: GoRouter + +emailControl: FormControl<String> + +passwordControl: FormControl<String> + +passwordConfirmationControl: FormControl<String> + +termsOfServiceControl: FormControl<bool> + <static>+authValidationMessages: Map<String, String Function(dynamic)> + +loginForm: FormGroup + +signupForm: FormGroup + +passwordForgotForm: FormGroup + +passwordRecoveryForm: FormGroup + +controlValidatorsByForm: Map<AuthFormKey, Map<FormControl<dynamic>, List<Validator<dynamic>>>> + -_formKey: AuthFormKey + +formKey: AuthFormKey + +form: FormGroup + + + + -dynamic _getFormFor() -dynamic _onChangeFormKey() @@ -11145,26 +11179,23 @@ +dynamic recoverPassword() +dynamic updateUser() -dynamic _readDebugUser() - -void _setRememberMe() - -void _delRememberMe() - -void _initRememberMe() - - - + + + - + IAuthRepository - + +allowPasswordReset: bool +currentUser: User? @@ -11174,7 +11205,7 @@ - + +dynamic signUp() +dynamic signInWith() @@ -11188,16 +11219,16 @@ - - + + - + IFormGroupController - + +form: FormGroup @@ -11206,16 +11237,16 @@ - - + + - + AppStatus - + +index: int <static>+values: List<AppStatus> @@ -11227,17 +11258,17 @@ - - - + + + - + FormArrayTable - + +control: AbstractControl<dynamic> +items: List<T> @@ -11261,7 +11292,7 @@ - + +Widget build() -List<Widget> _buildRow() @@ -11272,9 +11303,9 @@ - + - + List<ModelAction<dynamic>> Function(T, int) @@ -11283,9 +11314,9 @@ - + - + String Function(T) @@ -11294,9 +11325,9 @@ - + - + Widget Function(BuildContext, T, int)? @@ -11305,16 +11336,16 @@ - - + + - + ManagedFormViewModel - + +ManagedFormViewModel<T> createDuplicate() @@ -11323,9 +11354,9 @@ - + - + FormViewModelNotFoundException @@ -11334,9 +11365,9 @@ - + - + Exception @@ -11345,17 +11376,17 @@ - - - + + + - + FormViewModelCollection - + +formViewModels: List<T> +formArray: FormArray<dynamic> @@ -11365,7 +11396,7 @@ - + +void add() +T remove() @@ -11382,9 +11413,9 @@ - + - + FormArray @@ -11393,17 +11424,17 @@ - - - + + + - + CustomFormControl - + -_onValueChangedDebouncer: Debouncer? -_onStatusChangedDebouncer: Debouncer? @@ -11414,7 +11445,7 @@ - + +void dispose() @@ -11423,9 +11454,9 @@ - + - + void Function(T?)? @@ -11434,9 +11465,9 @@ - + - + void Function(ControlStatus)? @@ -11445,16 +11476,16 @@ - - + + - + UnsavedChangesDialog - + +Widget build() @@ -11463,9 +11494,9 @@ - + - + FormValidationSetEnum @@ -11474,17 +11505,17 @@ - - - + + + - + FormControlValidation - + +control: AbstractControl<dynamic> +validators: List<Validator<dynamic>> @@ -11493,7 +11524,7 @@ - + +FormControlValidation merge() @@ -11502,23 +11533,23 @@ - - - + + + - + IFormData - + +id: String - + +IFormData copy() @@ -11527,9 +11558,9 @@ - + - + FormInvalidException @@ -11538,16 +11569,16 @@ - - + + - + FormConfigException - + +message: String? @@ -11556,16 +11587,16 @@ - - + + - + IFormViewModelDelegate - + +dynamic onSave() +void onCancel() @@ -11575,16 +11606,16 @@ - - + + - + FormControlOption - + +value: T +label: String @@ -11596,16 +11627,16 @@ - - + + - + FormMode - + +index: int <static>+values: List<FormMode> @@ -11618,23 +11649,23 @@ - - - + + + - + EnrolledBadge - + +enrolledCount: int - + +Widget build() @@ -11643,24 +11674,24 @@ - - - + + + - + StudyRecruitController - + +inviteCodeRepository: IInviteCodeRepository -_invitesSubscription: StreamSubscription<List<WrappedModel<StudyInvite>>>? - + -dynamic _subscribeInvites() +Intervention? getIntervention() @@ -11674,16 +11705,16 @@ - - + + - + IInviteCodeRepository - + +dynamic isCodeAlreadyUsed() @@ -11692,9 +11723,9 @@ - + - + StreamSubscription @@ -11703,17 +11734,17 @@ - - - + + + - + StudyBaseController - + +studyId: String +studyRepository: IStudyRepository @@ -11722,7 +11753,7 @@ - + +dynamic subscribeStudy() +dynamic onStudySubscriptionUpdate() @@ -11734,16 +11765,16 @@ - - + + - + StudyRecruitScreen - + +Widget build() -Widget _inviteCodesSectionHeader() @@ -11755,23 +11786,23 @@ - - - + + + - + InviteCodeFormView - + +formViewModel: InviteCodeFormViewModel - + +Widget build() -List<FormTableRow> _conditionalInterventionRows() @@ -11781,17 +11812,17 @@ - - - + + + - + InviteCodeFormViewModel - + +study: Study +inviteCodeRepository: IInviteCodeRepository @@ -11810,7 +11841,7 @@ - + +void initControls() -dynamic _uniqueInviteCode() @@ -11825,17 +11856,17 @@ - - - + + + - + StudyInvitesTable - + +invites: List<StudyInvite> +onSelect: void Function(StudyInvite) @@ -11846,7 +11877,7 @@ - + +Widget build() -List<Widget> _buildRow() @@ -11856,9 +11887,9 @@ - + - + void Function(StudyInvite) @@ -11867,9 +11898,9 @@ - + - + List<ModelAction<dynamic>> Function(StudyInvite) @@ -11878,9 +11909,9 @@ - + - + Intervention? Function(String) @@ -11889,9 +11920,9 @@ - + - + int Function(StudyInvite) @@ -11900,16 +11931,16 @@ - - + + - + PublishSuccessDialog - + +Widget build() @@ -11918,16 +11949,16 @@ - - + + - + PublishDialog - + +Widget build() @@ -11936,16 +11967,16 @@ - - + + - + PublishConfirmationDialog - + +Widget build() @@ -11954,17 +11985,17 @@ - - - + + + - + FrameControlsWidget - + +onRefresh: void Function()? +onOpenNewTab: void Function()? @@ -11972,7 +12003,7 @@ - + +Widget build() @@ -11981,16 +12012,16 @@ - - + + - + IStudyStatusBadgeViewModel - + +studyParticipation: Participation? +studyStatus: StudyStatus? @@ -12000,9 +12031,9 @@ - + - + Participation @@ -12011,9 +12042,9 @@ - + - + StudyStatus @@ -12022,17 +12053,17 @@ - - - + + + - + StudyStatusBadge - + +participation: Participation? +status: StudyStatus? @@ -12042,7 +12073,7 @@ - + +Widget build() @@ -12051,17 +12082,17 @@ - - - + + + - + RouteInformation - + +route: String? +extra: String? @@ -12070,7 +12101,7 @@ - + +String toString() @@ -12079,17 +12110,17 @@ - - - + + + - + PlatformController - + +studyId: String +baseSrc: String @@ -12099,7 +12130,7 @@ - + +void activate() +void registerViews() @@ -12115,23 +12146,23 @@ - - - + + + - + WebController - + +iFrameElement: IFrameElement - + +void activate() +void registerViews() @@ -12147,9 +12178,9 @@ - + - + IFrameElement @@ -12158,16 +12189,16 @@ - - + + - + MobileController - + +void openNewPage() +void refresh() @@ -12183,17 +12214,17 @@ - - - + + + - + StudyController - + +notificationService: INotificationService +studyEventsSubscription: StreamSubscription<ModelEvent<Study>>? @@ -12201,7 +12232,7 @@ - + +dynamic syncStudyStatus() +dynamic onStudySubscriptionUpdate() @@ -12217,16 +12248,16 @@ - - + + - + IStudyNavViewModel - + +isEditTabEnabled: bool +isTestTabEnabled: bool @@ -12240,16 +12271,16 @@ - - + + - + StudyNav - + <static>+dynamic tabs() <static>+dynamic edit() @@ -12263,16 +12294,16 @@ - - + + - + StudyDesignNav - + <static>+dynamic tabs() <static>+dynamic info() @@ -12286,17 +12317,17 @@ - - - + + + - + StudyParticipationBadge - + +participation: Participation +type: BadgeType @@ -12305,7 +12336,7 @@ - + +Widget build() @@ -12314,16 +12345,16 @@ - - + + - + IStudyRepository - + +dynamic launch() +dynamic deleteParticipants() @@ -12333,16 +12364,16 @@ - - + + - + PreviewFrame - + +studyId: String +routeArgs: StudyFormRouteArgs? @@ -12353,16 +12384,16 @@ - - + + - + IStudyAppBarViewModel - + +isSyncIndicatorVisible: bool +isStatusBadgeVisible: bool @@ -12373,16 +12404,16 @@ - - + + - + StudyScaffold - + +studyId: String +tabs: List<NavbarTab>? @@ -12403,24 +12434,24 @@ - - - + + + - + WebFrame - + +previewSrc: String +studyId: String - + +Widget build() @@ -12429,16 +12460,16 @@ - - + + - + DisabledFrame - + +Widget build() @@ -12447,17 +12478,17 @@ - - - + + + - + PhoneContainer - + <static>+defaultWidth: double <static>+defaultHeight: double @@ -12471,7 +12502,7 @@ - + +Widget build() @@ -12480,16 +12511,16 @@ - - + + - + MobileFrame - + +Widget build() @@ -12498,16 +12529,16 @@ - - + + - + DesktopFrame - + +Widget build() @@ -12516,23 +12547,23 @@ - - - + + + - + StudyTestScreen - + +previewRoute: String? - + +Widget build() +Widget? banner() @@ -12545,17 +12576,17 @@ - - - + + + - + StudySettingsFormViewModel - + +study: AsyncValue<Study> +studyRepository: IStudyRepository @@ -12568,7 +12599,7 @@ - + +void setControlsFrom() +Study buildFormData() @@ -12581,16 +12612,16 @@ - - + + - + StudySettingsDialog - + +Widget build() @@ -12599,16 +12630,16 @@ - - + + - + StudyTestController - + +authRepository: IAuthRepository +languageCode: String @@ -12618,16 +12649,16 @@ - - + + - + TestAppRoutes - + <static>+studyOverview: String <static>+eligibility: String @@ -12641,17 +12672,17 @@ - - - + + + - + DrawerEntry - + +localizedTitle: String Function() +icon: IconData? @@ -12664,7 +12695,7 @@ - + +void onClick() @@ -12673,9 +12704,9 @@ - + - + String Function() @@ -12684,9 +12715,9 @@ - + - + String Function()? @@ -12695,9 +12726,9 @@ - + - + void Function(BuildContext, WidgetRef)? @@ -12706,24 +12737,24 @@ - - - + + + - + GoRouterDrawerEntry - + +intent: RoutingIntent +onNavigated: void Function()? - + +void onClick() @@ -12732,16 +12763,16 @@ - - + + - + AppDrawer - + +width: int +autoCloseDrawer: bool @@ -12757,16 +12788,16 @@ - - + + - + StudyAnalyzeScreen - + +Widget? banner() +Widget build() @@ -12776,16 +12807,16 @@ - - + + - + StudyAnalyzeController - + +dynamic onExport() @@ -12794,16 +12825,16 @@ - - + + - + StudyDesignInterventionsFormView - + +Widget build() @@ -12812,16 +12843,16 @@ - - + + - + StudyDesignPageWidget - + +Widget? banner() @@ -12830,16 +12861,16 @@ - - + + - + InterventionFormView - + +formViewModel: InterventionFormViewModel @@ -12848,17 +12879,17 @@ - - - + + + - + InterventionFormViewModel - + +study: Study +interventionIdControl: FormControl<String> @@ -12877,7 +12908,7 @@ - + +void setControlsFrom() +InterventionFormData buildFormData() @@ -12898,23 +12929,23 @@ - - - + + + - + InterventionPreview - + +routeArgs: InterventionFormRouteArgs - + +Widget build() @@ -12923,23 +12954,23 @@ - - - + + + - + StudyScheduleFormView - + +formViewModel: StudyScheduleControls - + -FormTableRow _renderCustomSequence() +Widget build() @@ -12949,17 +12980,17 @@ - - - + + + - + StudyScheduleControls - + <static>+defaultScheduleType: PhaseSequence <static>+defaultScheduleTypeSequence: String @@ -12983,7 +13014,7 @@ - + +void setStudyScheduleControlsFrom() +StudyScheduleFormData buildStudyScheduleFormData() @@ -12994,17 +13025,17 @@ - - - + + + - + InterventionTaskFormData - + +taskId: String +taskTitle: String @@ -13014,7 +13045,7 @@ - + +CheckmarkTask toTask() +InterventionTaskFormData copy() @@ -13024,17 +13055,17 @@ - - - + + + - + IFormDataWithSchedule - + +instanceId: String +isTimeLocked: bool @@ -13045,7 +13076,7 @@ - + +Schedule toSchedule() @@ -13054,17 +13085,17 @@ - - - + + + - + InterventionsFormViewModel - + +study: Study +router: GoRouter @@ -13078,7 +13109,7 @@ - + +void setControlsFrom() +InterventionsFormData buildFormData() @@ -13098,17 +13129,17 @@ - - - + + + - + InterventionTaskFormViewModel - + +taskIdControl: FormControl<String> +instanceIdControl: FormControl<String> @@ -13124,7 +13155,7 @@ - + +void setControlsFrom() +InterventionTaskFormData buildFormData() @@ -13135,17 +13166,17 @@ - - - + + + - + WithScheduleControls - + +isTimeRestrictedControl: FormControl<bool> +instanceID: FormControl<String> @@ -13164,7 +13195,7 @@ - + +void setScheduleControlsFrom() -dynamic _initReminderControl() @@ -13174,9 +13205,9 @@ - + - + PhaseSequence @@ -13185,17 +13216,17 @@ - - - + + + - + InterventionFormData - + +interventionId: String +title: String @@ -13207,7 +13238,7 @@ - + +Intervention toIntervention() +InterventionFormData copy() @@ -13217,17 +13248,17 @@ - - - + + + - + StudyScheduleFormData - + +sequenceType: PhaseSequence +sequenceTypeCustom: String @@ -13238,7 +13269,7 @@ - + +StudySchedule toStudySchedule() +Study apply() @@ -13249,16 +13280,16 @@ - - + + - + IStudyFormData - + +Study apply() @@ -13267,16 +13298,16 @@ - - + + - + InterventionTaskFormView - + +formViewModel: InterventionTaskFormViewModel @@ -13285,17 +13316,17 @@ - - - + + + - + InterventionsFormData - + +interventionsData: List<InterventionFormData> +studyScheduleData: StudyScheduleFormData @@ -13303,7 +13334,7 @@ - + +Study apply() +InterventionsFormData copy() @@ -13313,16 +13344,16 @@ - - + + - + StudyDesignReportsFormView - + +Widget build() -dynamic _showReportItemSidesheetWithArgs() @@ -13332,17 +13363,17 @@ - - - + + + - + ReportItemFormData - + +isPrimary: bool +section: ReportSection @@ -13350,7 +13381,7 @@ - + <static>+dynamic fromDomainModel() +ReportItemFormData copy() @@ -13360,9 +13391,9 @@ - + - + ReportSection @@ -13371,17 +13402,17 @@ - - - + + + - + DataReferenceEditor - + +formControl: FormControl<DataReferenceIdentifier<T>> +availableTasks: List<Task> @@ -13389,7 +13420,7 @@ - + +FormTableRow buildFormTableRow() -List<DropdownMenuItem<DataReferenceIdentifier<dynamic>>> _dataReferenceItems() @@ -13399,9 +13430,9 @@ - + - + ReactiveDropdownField @@ -13410,17 +13441,17 @@ - - - + + + - + TemporalAggregationFormatted - + -_value: TemporalAggregation <static>+values: List<TemporalAggregationFormatted> @@ -13431,7 +13462,7 @@ - + +bool ==() +String toString() @@ -13443,9 +13474,9 @@ - + - + TemporalAggregation @@ -13454,17 +13485,17 @@ - - - + + + - + ImprovementDirectionFormatted - + -_value: ImprovementDirection <static>+values: List<ImprovementDirectionFormatted> @@ -13475,7 +13506,7 @@ - + +bool ==() +String toString() @@ -13487,9 +13518,9 @@ - + - + ImprovementDirection @@ -13498,16 +13529,16 @@ - - + + - + ReportSectionType - + +index: int <static>+values: List<ReportSectionType> @@ -13519,17 +13550,17 @@ - - - + + + - + AverageSectionFormView - + +formViewModel: ReportItemFormViewModel +studyId: String @@ -13537,7 +13568,7 @@ - + +Widget build() @@ -13546,17 +13577,17 @@ - - - + + + - + ReportItemFormViewModel - + <static>+defaultSectionType: ReportSectionType +sectionIdControl: FormControl<String> @@ -13589,7 +13620,7 @@ - + -List<FormControlValidation> _getValidationConfig() +ReportItemFormData buildFormData() @@ -13603,23 +13634,23 @@ - - - + + + - + DataReferenceIdentifier - + +hashCode: int - + +bool ==() @@ -13628,9 +13659,9 @@ - + - + DataReference @@ -13639,17 +13670,17 @@ - - - + + + - + LinearRegressionSectionFormView - + +formViewModel: ReportItemFormViewModel +studyId: String @@ -13657,7 +13688,7 @@ - + +Widget build() @@ -13666,17 +13697,17 @@ - - - + + + - + ReportItemFormView - + +formViewModel: ReportItemFormViewModel +studyId: String @@ -13685,7 +13716,7 @@ - + +Widget build() -dynamic _buildSectionText() @@ -13696,17 +13727,17 @@ - - - + + + - + ReportsFormViewModel - + +study: Study +router: GoRouter @@ -13721,7 +13752,7 @@ - + +void setControlsFrom() +ReportsFormData buildFormData() @@ -13738,17 +13769,17 @@ - - - + + + - + ReportFormItemDelegate - + +formViewModelCollection: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData> +owner: ReportsFormViewModel @@ -13757,7 +13788,7 @@ - + +void onCancel() +dynamic onSave() @@ -13771,17 +13802,17 @@ - - - + + + - + ReportBadge - + +status: ReportStatus? +type: BadgeType @@ -13790,7 +13821,7 @@ - + +Widget build() @@ -13799,16 +13830,16 @@ - - + + - + ReportStatus - + +index: int <static>+values: List<ReportStatus> @@ -13820,24 +13851,24 @@ - - - + + + - + ReportsFormData - + +reportItems: List<ReportItemFormData> +id: String - + +Study apply() +ReportsFormData copy() @@ -13847,17 +13878,17 @@ - - - + + + - + StudyInfoFormViewModel - + +study: Study +titleControl: FormControl<String> @@ -13888,7 +13919,7 @@ - + +void setControlsFrom() +StudyInfoFormData buildFormData() @@ -13898,16 +13929,16 @@ - - + + - + StudyDesignInfoFormView - + +Widget build() @@ -13916,17 +13947,17 @@ - - - + + + - + StudyInfoFormData - + +title: String +description: String? @@ -13936,7 +13967,7 @@ - + +Study apply() +StudyInfoFormData copy() @@ -13946,17 +13977,17 @@ - - - + + + - + StudyContactInfoFormData - + +organization: String? +institutionalReviewBoard: String? @@ -13970,7 +14001,7 @@ - + +Study apply() +StudyInfoFormData copy() @@ -13980,16 +14011,16 @@ - - + + - + StudyFormValidationSet - + +index: int <static>+values: List<StudyFormValidationSet> @@ -13999,24 +14030,24 @@ - - - + + + - + MeasurementsFormData - + +surveyMeasurements: List<MeasurementSurveyFormData> +id: String - + +Study apply() +MeasurementsFormData copy() @@ -14026,16 +14057,16 @@ - - + + - + MeasurementSurveyFormView - + +formViewModel: MeasurementSurveyFormViewModel @@ -14044,17 +14075,17 @@ - - - + + + - + MeasurementSurveyFormViewModel - + +study: Study +measurementIdControl: FormControl<String> @@ -14073,7 +14104,7 @@ - + +void setControlsFrom() +MeasurementSurveyFormData buildFormData() @@ -14091,23 +14122,23 @@ - - - + + + - + SurveyPreview - + +routeArgs: MeasurementFormRouteArgs - + +Widget build() @@ -14116,17 +14147,17 @@ - - - + + + - + MeasurementSurveyFormData - + +measurementId: String +title: String @@ -14138,7 +14169,7 @@ - + +QuestionnaireTask toQuestionnaireTask() +MeasurementSurveyFormData copy() @@ -14148,24 +14179,24 @@ - - - + + + - + QuestionnaireFormData - + +questionsData: List<QuestionFormData>? +id: String - + +StudyUQuestionnaire toQuestionnaire() +List<EligibilityCriterion> toEligibilityCriteria() @@ -14176,17 +14207,17 @@ - - - + + + - + WithQuestionnaireControls - + +questionsArray: FormArray<dynamic> +questionFormViewModels: FormViewModelCollection<Q, QuestionFormData> @@ -14197,7 +14228,7 @@ - + +void setQuestionnaireControlsFrom() +QuestionnaireFormData buildQuestionnaireFormData() @@ -14212,16 +14243,16 @@ - - + + - + StudyDesignMeasurementsFormView - + +Widget build() @@ -14230,17 +14261,17 @@ - - - + + + - + MeasurementsFormViewModel - + +study: Study +router: GoRouter @@ -14254,7 +14285,7 @@ - + +void read() +void setControlsFrom() @@ -14273,17 +14304,17 @@ - - - + + + - + StudyFormScaffold - + +studyId: String +formViewModelBuilder: T Function(WidgetRef) @@ -14291,7 +14322,7 @@ - + +Widget build() @@ -14300,9 +14331,9 @@ - + - + T Function(WidgetRef) @@ -14311,17 +14342,17 @@ - - - + + + - + ConsentItemFormViewModel - + +consentIdControl: FormControl<String> +titleControl: FormControl<String> @@ -14336,7 +14367,7 @@ - + +void setControlsFrom() +ConsentItemFormData buildFormData() @@ -14347,16 +14378,16 @@ - - + + - + StudyDesignEnrollmentFormView - + +Widget build() -dynamic _showScreenerQuestionSidesheetWithArgs() @@ -14367,16 +14398,16 @@ - - + + - + IScreenerQuestionLogicFormViewModel - + +isDirtyOptionsBannerVisible: bool @@ -14385,23 +14416,23 @@ - - - + + + - + ScreenerQuestionLogicFormView - + +formViewModel: ScreenerQuestionFormViewModel - + +Widget build() -dynamic _buildInfoBanner() @@ -14413,17 +14444,17 @@ - - - + + + - + ScreenerQuestionFormViewModel - + <static>+defaultResponseOptionValidity: bool +responseOptionsDisabledArray: FormArray<dynamic> @@ -14439,7 +14470,7 @@ - + +dynamic onResponseOptionsChanged() +void setControlsFrom() @@ -14454,17 +14485,17 @@ - - - + + + - + ConsentItemFormData - + +consentId: String +title: String @@ -14474,7 +14505,7 @@ - + +ConsentItem toConsentItem() +ConsentItemFormData copy() @@ -14484,16 +14515,16 @@ - - + + - + ConsentItemFormView - + +formViewModel: ConsentItemFormViewModel @@ -14502,17 +14533,17 @@ - - - + + + - + EnrollmentFormData - + <static>+kDefaultEnrollmentType: Participation +enrollmentType: Participation @@ -14522,7 +14553,7 @@ - + +Study apply() +EnrollmentFormData copy() @@ -14532,17 +14563,17 @@ - - - + + + - + QuestionFormViewModel - + <static>+defaultQuestionType: SurveyQuestionType -_titles: Map<FormMode, String Function()>? @@ -14557,56 +14588,64 @@ +customOptionsMax: int +customOptionsInitial: int +boolResponseOptionsArray: FormArray<String> - <static>+kDefaultScaleMinValue: int - <static>+kDefaultScaleMaxValue: int - <static>+kNumMidValueControls: int - <static>+kMidValueDebounceMilliseconds: int - +scaleMinValueControl: FormControl<int> - +scaleMaxValueControl: FormControl<int> - -_scaleRangeControl: FormControl<int> - +scaleMinLabelControl: FormControl<String> - +scaleMaxLabelControl: FormControl<String> - +scaleMidValueControls: FormArray<int> - +scaleMidLabelControls: FormArray<String?> - -_scaleResponseOptionsArray: FormArray<int> - +scaleMinColorControl: FormControl<SerializableColor> - +scaleMaxColorControl: FormControl<SerializableColor> - +prevMidValues: List<int?>? - +freeTextTypeControl: FormControl<FreeTextQuestionType> - +customRegexControl: FormControl<String> - +freeTextResponseOptionsArray: FormArray<dynamic> - +freeTextLengthMin: AbstractControl<int> - +freeTextLengthMax: AbstractControl<int> - +freeTextExampleTextControl: FormControl<String> - <static>+kDefaultFreeTextMinLength: int - <static>+kDefaultFreeTextMaxLength: int - +freeTextLengthControl: FormControl<RangeValues> - -_controlsByQuestionType: Map<SurveyQuestionType, FormGroup> - -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - -_validationConfigsByQuestionType: Map<SurveyQuestionType, Map<FormValidationSetEnum, List<FormControlValidation>>> - +form: FormGroup - +questionId: String - +questionType: SurveyQuestionType - +questionTypeControlOptions: List<FormControlOption<SurveyQuestionType>> - +answerOptionsArray: FormArray<dynamic> - +answerOptionsControls: List<AbstractControl<dynamic>> - +validAnswerOptions: List<String> - +boolOptions: List<AbstractControl<String>> - +scaleMinValue: int - +scaleMaxValue: int - +scaleRange: int - +scaleAllValueControls: List<AbstractControl<int>> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +questionTextRequired: dynamic - +numValidChoiceOptions: dynamic - +scaleRangeValid: dynamic - +titles: Map<FormMode, String> - +isAddOptionButtonVisible: bool - +isMidValuesClearedInfoVisible: bool - - - - + +imageResponseOptionsArray: FormArray<String> + <static>+kDefaultMaxRecordingDurationSeconds: int + <static>+kMaxRecordingDurationSeconds: int + +audioResponseOptionsArray: FormArray<String> + +maxRecordingDurationSecondsControl: FormControl<int> + <static>+kDefaultScaleMinValue: int + <static>+kDefaultScaleMaxValue: int + <static>+kNumMidValueControls: int + <static>+kMidValueDebounceMilliseconds: int + +scaleMinValueControl: FormControl<int> + +scaleMaxValueControl: FormControl<int> + -_scaleRangeControl: FormControl<int> + +scaleMinLabelControl: FormControl<String> + +scaleMaxLabelControl: FormControl<String> + +scaleMidValueControls: FormArray<int> + +scaleMidLabelControls: FormArray<String?> + -_scaleResponseOptionsArray: FormArray<int> + +scaleMinColorControl: FormControl<SerializableColor> + +scaleMaxColorControl: FormControl<SerializableColor> + +prevMidValues: List<int?>? + +freeTextTypeControl: FormControl<FreeTextQuestionType> + +customRegexControl: FormControl<String> + +freeTextResponseOptionsArray: FormArray<dynamic> + +freeTextLengthMin: AbstractControl<int> + +freeTextLengthMax: AbstractControl<int> + +freeTextExampleTextControl: FormControl<String> + <static>+kDefaultFreeTextMinLength: int + <static>+kDefaultFreeTextMaxLength: int + +freeTextLengthControl: FormControl<RangeValues> + -_controlsByQuestionType: Map<SurveyQuestionType, FormGroup> + -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + -_validationConfigsByQuestionType: Map<SurveyQuestionType, Map<FormValidationSetEnum, List<FormControlValidation>>> + +form: FormGroup + +questionId: String + +questionType: SurveyQuestionType + +questionTypeControlOptions: List<FormControlOption<SurveyQuestionType>> + +answerOptionsArray: FormArray<dynamic> + +answerOptionsControls: List<AbstractControl<dynamic>> + +validAnswerOptions: List<String> + +boolOptions: List<AbstractControl<String>> + +imageOptions: List<AbstractControl<String>> + +audioOptions: List<AbstractControl<String>> + +scaleMinValue: int + +scaleMaxValue: int + +scaleRange: int + +scaleAllValueControls: List<AbstractControl<int>> + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +questionTextRequired: dynamic + +numValidChoiceOptions: dynamic + +scaleRangeValid: dynamic + +maxRecordingDurationValid: dynamic + +titles: Map<FormMode, String> + +isAddOptionButtonVisible: bool + +isMidValuesClearedInfoVisible: bool + + + + +String? scaleMidLabelAt() -dynamic _onScaleRangeChanged() @@ -14632,17 +14671,17 @@ - - - + + + - + EnrollmentFormViewModel - + +study: Study +router: GoRouter @@ -14661,7 +14700,7 @@ - + +void setControlsFrom() +EnrollmentFormData buildFormData() @@ -14684,17 +14723,17 @@ - - - + + + - + EnrollmentFormConsentItemDelegate - + +formViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData> +owner: EnrollmentFormViewModel @@ -14703,7 +14742,7 @@ - + +void onCancel() +dynamic onSave() @@ -14717,17 +14756,17 @@ - - - + + + - + StudyFormViewModel - + +studyDirtyCopy: Study? +studyRepository: IStudyRepository @@ -14745,7 +14784,7 @@ - + +void read() +void setControlsFrom() @@ -14760,17 +14799,17 @@ - - - + + + - + QuestionFormData - + <static>+questionTypeFormDataFactories: Map<SurveyQuestionType, QuestionFormData Function(Question<dynamic>, List<EligibilityCriterion>)> +questionId: String @@ -14783,7 +14822,7 @@ - + +Question<dynamic> toQuestion() +EligibilityCriterion toEligibilityCriterion() @@ -14796,40 +14835,42 @@ - - + + - + SurveyQuestionType - + +index: int <static>+values: List<SurveyQuestionType> <static>+choice: SurveyQuestionType <static>+bool: SurveyQuestionType <static>+scale: SurveyQuestionType - <static>+freeText: SurveyQuestionType + <static>+image: SurveyQuestionType + <static>+audio: SurveyQuestionType + <static>+freeText: SurveyQuestionType - - - + + + - + ChoiceQuestionFormData - + +isMultipleChoice: bool +answerOptions: List<String> @@ -14837,7 +14878,7 @@ - + +Question<dynamic> toQuestion() +QuestionFormData copy() @@ -14849,24 +14890,24 @@ - - - + + + - + BoolQuestionFormData - + <static>+kResponseOptions: Map<String, bool> +responseOptions: List<String> - + +Question<dynamic> toQuestion() +BoolQuestionFormData copy() @@ -14875,19 +14916,76 @@ + + + + + + + + + ImageQuestionFormData + + + + + + <static>+kResponseOptions: Map<String, FutureBlobFile> + +responseOptions: List<String> + + + + + + +Question<dynamic> toQuestion() + +ImageQuestionFormData copy() + +Answer<dynamic> constructAnswerFor() + + + + + + + + + + + + + AudioQuestionFormData + + + + + + +maxRecordingDurationSeconds: int + <static>+kResponseOptions: Map<String, FutureBlobFile> + +responseOptions: List<String> + + + + + + +Question<dynamic> toQuestion() + +AudioQuestionFormData copy() + +Answer<dynamic> constructAnswerFor() + + + + - - - + + + - + ScaleQuestionFormData - + +minValue: double +maxValue: double @@ -14904,7 +15002,7 @@ - + +ScaleQuestion toQuestion() +QuestionFormData copy() @@ -14915,17 +15013,17 @@ - - - + + + - + FreeTextQuestionFormData - + +textLengthRange: List<int> +textType: FreeTextQuestionType @@ -14934,7 +15032,7 @@ - + +Question<dynamic> toQuestion() +FreeTextQuestionFormData copy() @@ -14945,35 +15043,60 @@ - + - + FreeTextQuestionType + + + + + + + + + AudioRecordingQuestionFormView + + + + + + +formViewModel: QuestionFormViewModel + + + + + + +Widget build() + + + + - - - + + + - + FreeTextQuestionFormView - + +formViewModel: QuestionFormViewModel +generateLabelHelpTextMap: dynamic - + +Widget build() +Widget disableOnReadonly() @@ -14982,18 +15105,43 @@ + + + + + + + + + ImageCapturingQuestionFormView + + + + + + +formViewModel: QuestionFormViewModel + + + + + + +Widget build() + + + + - - + + - + IScaleQuestionFormViewModel - + +isMidValuesClearedInfoVisible: bool @@ -15002,16 +15150,16 @@ - - + + - + ScaleQuestionFormView - + +formViewModel: QuestionFormViewModel @@ -15020,23 +15168,23 @@ - - - + + + - + ChoiceQuestionFormView - + +formViewModel: QuestionFormViewModel - + +Widget build() @@ -15045,23 +15193,23 @@ - - - + + + - + BoolQuestionFormView - + +formViewModel: QuestionFormViewModel - + +Widget build() @@ -15070,16 +15218,16 @@ - - + + - + SurveyQuestionFormView - + +formViewModel: QuestionFormViewModel +isHtmlStyleable: bool @@ -15089,9 +15237,9 @@ - + - + StudyUTimeOfDay @@ -15100,23 +15248,23 @@ - - - + + + - + ScheduleControls - + +formViewModel: WithScheduleControls - + +Widget build() -List<FormTableRow> _conditionalTimeRestrictions() @@ -15126,16 +15274,16 @@ - - + + - + StudiesTableColumnHeader - + +title: String +sortable: bool @@ -15148,16 +15296,16 @@ - - + + - + DashboardScreen - + +filter: StudiesFilter? @@ -15166,16 +15314,16 @@ - - + + - + StudiesFilter - + +index: int <static>+values: List<StudiesFilter> @@ -15185,24 +15333,24 @@ - - - + + + - + DashboardScaffold - + <static>+compactWidthThreshold: double +body: Widget - + +Widget build() @@ -15211,17 +15359,17 @@ - - - + + + - + DashboardController - + +studyRepository: IStudyRepository +authRepository: IAuthRepository @@ -15233,7 +15381,7 @@ - + -dynamic _subscribeStudies() +dynamic setSearchText() @@ -15255,23 +15403,23 @@ - - - + + + - + IUserRepository - + +user: StudyUUser - + +dynamic fetchUser() +dynamic saveUser() @@ -15282,17 +15430,17 @@ - - - + + + - + StudiesTableColumnSize - + +collapsed: bool +flex: int? @@ -15300,7 +15448,7 @@ - + +Widget createContainer() @@ -15309,17 +15457,17 @@ - - - + + + - + StudiesTable - + +itemHeight: double +itemPadding: double @@ -15337,7 +15485,7 @@ - + +Widget build() -Widget _buildColumnHeader() @@ -15347,9 +15495,9 @@ - + - + void Function(Study) @@ -15358,9 +15506,9 @@ - + - + List<ModelAction<dynamic>> Function(Study) @@ -15369,16 +15517,16 @@ - - + + - + StudiesTableColumn - + +index: int <static>+values: List<StudiesTableColumn> @@ -15397,16 +15545,16 @@ - - + + - + StudiesTableItem - + +study: Study +itemHeight: double @@ -15424,9 +15572,9 @@ - + - + void Function(Study, bool)? @@ -15435,9 +15583,9 @@ - + - + void Function(Study)? @@ -15446,9 +15594,9 @@ - + - + App @@ -15457,9 +15605,9 @@ - + - + AppContent @@ -15468,16 +15616,16 @@ - - + + - + AccountSettingsDialog - + +Widget build() @@ -15486,17 +15634,17 @@ - - - + + + - + ModelRepository - + +delegate: IModelRepositoryDelegate<T> -_allModelsStreamController: BehaviorSubject<List<WrappedModel<T>>> @@ -15507,7 +15655,7 @@ - + +WrappedModel<T>? get() +dynamic fetchAll() @@ -15535,17 +15683,17 @@ - - - + + + - + InviteCodeRepository - + +studyId: String +ref: ProviderRef<dynamic> @@ -15556,7 +15704,7 @@ - + +String getKey() +dynamic isCodeAlreadyUsed() @@ -15568,9 +15716,9 @@ - + - + ProviderRef @@ -15579,16 +15727,16 @@ - - + + - + StudyUApi - + +dynamic saveStudy() +dynamic fetchStudy() @@ -15607,17 +15755,17 @@ - - - + + + - + InviteCodeRepositoryDelegate - + +study: Study +apiClient: StudyUApi @@ -15625,7 +15773,7 @@ - + +dynamic fetch() +dynamic fetchAll() @@ -15640,16 +15788,16 @@ - - + + - + IModelRepositoryDelegate - + +dynamic fetchAll() +dynamic fetch() @@ -15664,17 +15812,17 @@ - - - + + + - + StudyRepository - + +apiClient: StudyUApi +authRepository: IAuthRepository @@ -15683,7 +15831,7 @@ - + +String getKey() +dynamic deleteParticipants() @@ -15695,24 +15843,24 @@ - - - + + + - + StudyRepositoryDelegate - + +apiClient: StudyUApi +authRepository: IAuthRepository - + +dynamic fetchAll() +dynamic fetch() @@ -15727,9 +15875,9 @@ - + - + APIException @@ -15738,9 +15886,9 @@ - + - + StudyNotFoundException @@ -15749,9 +15897,9 @@ - + - + MeasurementNotFoundException @@ -15760,9 +15908,9 @@ - + - + QuestionNotFoundException @@ -15771,9 +15919,9 @@ - + - + ConsentItemNotFoundException @@ -15782,9 +15930,9 @@ - + - + InterventionNotFoundException @@ -15793,9 +15941,9 @@ - + - + InterventionTaskNotFoundException @@ -15804,9 +15952,9 @@ - + - + ReportNotFoundException @@ -15815,9 +15963,9 @@ - + - + ReportSectionNotFoundException @@ -15826,9 +15974,9 @@ - + - + StudyInviteNotFoundException @@ -15837,9 +15985,9 @@ - + - + UserNotFoundException @@ -15848,17 +15996,17 @@ - - - + + + - + StudyUApiClient - + +supabaseClient: SupabaseClient <static>+studyColumns: List<String> @@ -15867,7 +16015,7 @@ - + +dynamic deleteParticipants() +dynamic getUserStudies() @@ -15889,9 +16037,9 @@ - + - + SupabaseClient @@ -15900,16 +16048,16 @@ - - + + - + SupabaseClientDependant - + +supabaseClient: SupabaseClient @@ -15918,16 +16066,16 @@ - - + + - + SupabaseQueryMixin - + +dynamic deleteAll() +dynamic getAll() @@ -15941,16 +16089,16 @@ - - + + - + IAppRepository - + +dynamic fetchAppConfig() +void dispose() @@ -15960,23 +16108,23 @@ - - - + + + - + AppRepository - + +apiClient: StudyUApi - + +dynamic fetchAppConfig() +void dispose() @@ -15986,9 +16134,9 @@ - + - + StudyUUser @@ -15997,17 +16145,17 @@ - - - + + + - + UserRepository - + +apiClient: StudyUApi +authRepository: IAuthRepository @@ -16016,7 +16164,7 @@ - + +dynamic fetchUser() +dynamic saveUser() @@ -16027,9 +16175,9 @@ - + - + Ref @@ -16038,16 +16186,16 @@ - - + + - + PreferenceAction - + +index: int <static>+values: List<PreferenceAction> @@ -16059,9 +16207,9 @@ - + - + User @@ -16070,9 +16218,9 @@ - + - + Session @@ -16081,30 +16229,29 @@ - - - + + + - + - AuthRepository + AuthRepository - + +supabaseClient: SupabaseClient - +sharedPreferences: SharedPreferences - +allowPasswordReset: bool - +authClient: GoTrueClient - +session: Session? - +serializedSession: String? - +currentUser: User? - +isLoggedIn: bool + +allowPasswordReset: bool + +authClient: GoTrueClient + +session: Session? + +serializedSession: String? + +currentUser: User? + +isLoggedIn: bool - + -void _registerAuthListener() +dynamic signUp() @@ -16120,9 +16267,9 @@ - + - + GoTrueClient @@ -16131,9 +16278,9 @@ - + - + StudyLaunched @@ -16142,16 +16289,16 @@ - - + + - + ModelEvent - + +modelId: String +model: T @@ -16161,16 +16308,16 @@ - - + + - + SupabaseQueryError - + +statusCode: String? +message: String @@ -16181,17 +16328,17 @@ - - - + + + - + WrappedModel - + -_model: T +asyncValue: AsyncValue<T> @@ -16205,7 +16352,7 @@ - + +dynamic markWithError() +dynamic markAsLoading() @@ -16217,9 +16364,9 @@ - + - + ModelRepositoryException @@ -16228,9 +16375,9 @@ - + - + ModelNotFoundException @@ -16239,16 +16386,16 @@ - - + + - + IModelRepository - + +String getKey() +WrappedModel<T>? get() @@ -16270,9 +16417,9 @@ - + - + IsFetched @@ -16281,9 +16428,9 @@ - + - + IsSaving @@ -16292,9 +16439,9 @@ - + - + IsSaved @@ -16303,9 +16450,9 @@ - + - + IsDeleted From e63fe7563e5ed4bfe6dc943a17e5870cca406ce9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20G=C3=B6cer?= Date: Thu, 18 Apr 2024 19:35:18 +0200 Subject: [PATCH 007/314] fix: calculation of totalInterventions --- .../src/models/study_schedule/study_schedule.dart | 8 ++++++++ core/lib/src/models/tables/study_subject.dart | 5 +---- .../lib/features/monitor/study_monitor_table.dart | 14 ++++++++++++-- 3 files changed, 21 insertions(+), 6 deletions(-) diff --git a/core/lib/src/models/study_schedule/study_schedule.dart b/core/lib/src/models/study_schedule/study_schedule.dart index 1b841edb7..420c989b4 100644 --- a/core/lib/src/models/study_schedule/study_schedule.dart +++ b/core/lib/src/models/study_schedule/study_schedule.dart @@ -1,4 +1,5 @@ import 'package:json_annotation/json_annotation.dart'; +import 'package:studyu_core/core.dart'; part 'study_schedule.g.dart'; @@ -29,6 +30,13 @@ class StudySchedule { return phases; } + List generateInterventionIdsInOrder(List interventionsIds) { + return [ + if (includeBaseline) Study.baselineID, + ...generateWith(0).map((int index) => interventionsIds[index]), + ]; + } + int _nextIntervention(int index) => (index + 1) % numberOfInterventions; List _generateCycle(int first, int cycle) { diff --git a/core/lib/src/models/tables/study_subject.dart b/core/lib/src/models/tables/study_subject.dart index 90517d868..4a15d59f1 100644 --- a/core/lib/src/models/tables/study_subject.dart +++ b/core/lib/src/models/tables/study_subject.dart @@ -64,10 +64,7 @@ class StudySubject extends SupabaseObjectFunctions { : id = const Uuid().v4(), studyId = study.id; - List get interventionOrder => [ - if (study.schedule.includeBaseline) Study.baselineID, - ...study.schedule.generateWith(0).map((int index) => selectedInterventionIds[index]), - ]; + List get interventionOrder => study.schedule.generateInterventionIdsInOrder(selectedInterventionIds); List get selectedInterventions { final selectedInterventions = selectedInterventionIds diff --git a/designer_v2/lib/features/monitor/study_monitor_table.dart b/designer_v2/lib/features/monitor/study_monitor_table.dart index 62e8e60a0..3950dd8dd 100644 --- a/designer_v2/lib/features/monitor/study_monitor_table.dart +++ b/designer_v2/lib/features/monitor/study_monitor_table.dart @@ -46,14 +46,24 @@ class StudyMonitorItem extends Equatable { for (final participant in participants) { final progresses = participantsProgress.where((progress) => progress.subjectId == participant.id).toList(); progresses.sort((b, a) => a.completedAt!.compareTo(b.completedAt!)); // descending - final interventions = participant.selectedInterventionIds; + final interventionOrder = study.schedule.generateInterventionIdsInOrder(participant.selectedInterventionIds); final lastActivityAt = progresses.isNotEmpty ? progresses.first.completedAt! : participant.startedAt!; final studyDurationInDays = study.schedule.length; final currentDayOfStudy = min(studyDurationInDays, DateTime.now().toUtc().difference(participant.startedAt!).inDays); final daysInBaseline = study.schedule.includeBaseline ? study.schedule.phaseDuration : 0; - final totalInterventions = max(0, currentDayOfStudy - daysInBaseline); + int totalInterventions = 0; + for (int day = 0; day < currentDayOfStudy; day++) { + if (day < daysInBaseline) { + continue; + } + + final interventionIdForThisPhase = interventionOrder[day ~/ study.schedule.phaseDuration]; + final interventionForThisPhase = study.interventions.firstWhere((i) => i.id == interventionIdForThisPhase); + totalInterventions += interventionForThisPhase.tasks.length; + } + final totalSurveys = currentDayOfStudy * study.observations.length; final completedInterventions = progresses.where((p) => p.resultType == "bool").toList(); From 45df4ce7e8eec49706d42ce081acbd9704aff9ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20G=C3=B6cer?= Date: Wed, 24 Apr 2024 19:45:58 +0200 Subject: [PATCH 008/314] feat: add dropout stats to monitoring --- designer_v2/lib/domain/study_monitoring.dart | 129 ++++++++++++++++++ .../participant_details_form_controller.dart | 4 +- .../features/monitor/study_monitor_page.dart | 30 ++-- .../features/monitor/study_monitor_table.dart | 100 +------------- designer_v2/lib/localization/app_de.arb | 8 +- designer_v2/lib/localization/app_en.arb | 8 +- 6 files changed, 159 insertions(+), 120 deletions(-) create mode 100644 designer_v2/lib/domain/study_monitoring.dart diff --git a/designer_v2/lib/domain/study_monitoring.dart b/designer_v2/lib/domain/study_monitoring.dart new file mode 100644 index 000000000..8689c338e --- /dev/null +++ b/designer_v2/lib/domain/study_monitoring.dart @@ -0,0 +1,129 @@ +import 'dart:math'; + +import 'package:equatable/equatable.dart'; +import 'package:studyu_core/core.dart'; + +class StudyMonitorData { + /// Number of participants who are currently active in the study + /// Active means that the the study has not ended yet and the participant did not drop out + final int activeParticipants; + + /// Number of participants who dropped out of the study before the study ended + /// Hint: The is_deleted flag in the study_subject database table marks a participant as dropped out + final int dropoutParticipants; + + /// Number of participants who completed the study + /// Completed means that the participant has reached the end of the study + final int completedParticipants; + + /// List of all participants with their monitoring data + final List items; + + const StudyMonitorData({ + required this.activeParticipants, + required this.dropoutParticipants, + required this.completedParticipants, + required this.items, + }); +} + +class StudyMonitorItem extends Equatable { + final String participantId; + final String? inviteCode; + final DateTime enrolledAt; + final DateTime lastActivityAt; + final int currentDayOfStudy; + final int studyDurationInDays; + final int completedInterventions; + final int missedInterventions; + final int completedSurveys; + final int missedSurveys; + final bool droppedOut; + + const StudyMonitorItem({ + required this.participantId, + required this.inviteCode, + required this.enrolledAt, + required this.lastActivityAt, + required this.currentDayOfStudy, + required this.studyDurationInDays, + required this.completedInterventions, + required this.missedInterventions, + required this.completedSurveys, + required this.missedSurveys, + required this.droppedOut, + }); + + @override + List get props => [participantId]; +} + +extension StudyMonitoringX on Study { + StudyMonitorData get monitorData { + final List items = []; + + final participants = this.participants ?? []; + final participantsProgress = this.participantsProgress ?? []; + + participants.sort((a, b) => a.startedAt!.compareTo(b.startedAt!)); // ascending + + for (final participant in participants) { + final progresses = participantsProgress.where((progress) => progress.subjectId == participant.id).toList(); + progresses.sort((b, a) => a.completedAt!.compareTo(b.completedAt!)); // descending + final interventionOrder = schedule.generateInterventionIdsInOrder(participant.selectedInterventionIds); + final lastActivityAt = progresses.isNotEmpty ? progresses.first.completedAt! : participant.startedAt!; + final studyDurationInDays = schedule.length; + final currentDayOfStudy = + min(studyDurationInDays, DateTime.now().toUtc().difference(participant.startedAt!).inDays); + final daysInBaseline = schedule.includeBaseline ? schedule.phaseDuration : 0; + + int totalInterventions = 0; + for (int day = 0; day < currentDayOfStudy; day++) { + if (day < daysInBaseline) { + continue; + } + + final interventionIdForThisPhase = interventionOrder[day ~/ schedule.phaseDuration]; + final interventionForThisPhase = interventions.firstWhere((i) => i.id == interventionIdForThisPhase); + totalInterventions += interventionForThisPhase.tasks.length; + } + + final totalSurveys = currentDayOfStudy * observations.length; + + final completedInterventions = progresses.where((p) => p.resultType == "bool").toList(); + final completedSurveys = progresses.where((p) => p.resultType != "bool").toList(); + + final missedInterventions = totalInterventions - completedInterventions.length; + final missedSurveys = totalSurveys - completedSurveys.length; + + items.add(StudyMonitorItem( + participantId: participant.id, + inviteCode: participant.inviteCode, + enrolledAt: participant.startedAt!, + lastActivityAt: lastActivityAt, + currentDayOfStudy: currentDayOfStudy, + studyDurationInDays: studyDurationInDays, + completedInterventions: completedInterventions.length, + missedInterventions: missedInterventions, + completedSurveys: completedSurveys.length, + missedSurveys: missedSurveys, + droppedOut: participant.isDeleted, + )); + } + + final activeParticipants = + items.where((item) => !item.droppedOut && item.currentDayOfStudy < item.studyDurationInDays).length; + final dropoutParticipants = + items.where((item) => item.droppedOut && item.currentDayOfStudy < item.studyDurationInDays).length; + final completedParticipants = items.where((item) => item.currentDayOfStudy >= item.studyDurationInDays).length; + + assert(activeParticipants + dropoutParticipants + completedParticipants == items.length); + + return StudyMonitorData( + activeParticipants: activeParticipants, + dropoutParticipants: dropoutParticipants, + completedParticipants: completedParticipants, + items: items, + ); + } +} diff --git a/designer_v2/lib/features/monitor/participant_details_form_controller.dart b/designer_v2/lib/features/monitor/participant_details_form_controller.dart index 90f8ec706..055d41128 100644 --- a/designer_v2/lib/features/monitor/participant_details_form_controller.dart +++ b/designer_v2/lib/features/monitor/participant_details_form_controller.dart @@ -1,7 +1,7 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:reactive_forms/reactive_forms.dart'; +import 'package:studyu_designer_v2/domain/study_monitoring.dart'; import 'package:studyu_designer_v2/features/forms/form_view_model.dart'; -import 'package:studyu_designer_v2/features/monitor/study_monitor_table.dart'; import 'package:studyu_designer_v2/localization/app_translation.dart'; class ParticipantDetailsFormViewModel extends FormViewModel { @@ -34,7 +34,7 @@ class ParticipantDetailsFormViewModel extends FormViewModel { @override void setControlsFrom(StudyMonitorItem data) { participantIdControl.value = data.participantId; - rawDataControl.value = data.rawData; + rawDataControl.value = ""; } } diff --git a/designer_v2/lib/features/monitor/study_monitor_page.dart b/designer_v2/lib/features/monitor/study_monitor_page.dart index 83193aa43..a7150f018 100644 --- a/designer_v2/lib/features/monitor/study_monitor_page.dart +++ b/designer_v2/lib/features/monitor/study_monitor_page.dart @@ -6,6 +6,7 @@ import 'package:studyu_designer_v2/common_views/empty_body.dart'; import 'package:studyu_designer_v2/common_views/form_buttons.dart'; import 'package:studyu_designer_v2/common_views/sidesheet/sidesheet_form.dart'; import 'package:studyu_designer_v2/common_views/utils.dart'; +import 'package:studyu_designer_v2/domain/study_monitoring.dart'; import 'package:studyu_designer_v2/features/monitor/participant_details_form_controller.dart'; import 'package:studyu_designer_v2/features/monitor/participant_details_form_view.dart'; import 'package:studyu_designer_v2/features/monitor/study_monitor_table.dart'; @@ -22,16 +23,16 @@ class StudyMonitorScreen extends StudyPageWidget { return AsyncValueWidget( value: state.study, data: (study) { - final studyMonitorItems = StudyMonitorItem.fromStudy(study); + final studyMonitorData = study.monitorData; return Column( mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: [ - _monitorSectionHeader(context, study), + _monitorSectionHeader(context, studyMonitorData), const SizedBox(height: 40.0), // spacing between body elements - studyMonitorItems.isNotEmpty + studyMonitorData.items.isNotEmpty ? StudyMonitorTable( - studyMonitorItems: studyMonitorItems, + studyMonitorItems: studyMonitorData.items, onSelectItem: (item) => _onSelectParticipant(context, ref, item), ) : EmptyBody( @@ -43,13 +44,9 @@ class StudyMonitorScreen extends StudyPageWidget { }); } - Widget _monitorSectionHeader(BuildContext context, Study study) { - // Using study.participants.length because participantCount does not include soft deleted participants - final enrolled = study.participants?.length ?? study.participantCount; - // Active participants are those who were active in the last 3 days - final active = study.activeSubjectCount; - // Ended participants are those with days in study >= study duration - final ended = study.endedCount; + Widget _monitorSectionHeader(BuildContext context, StudyMonitorData monitorData) { + final enrolled = + monitorData.activeParticipants + monitorData.dropoutParticipants + monitorData.completedParticipants; return Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -59,9 +56,16 @@ class StudyMonitorScreen extends StudyPageWidget { child: Row( children: [ Expanded( - child: _buildStat(context, tr.monitoring_active, tr.monitoring_active_tooltip, active, enrolled)), + child: _buildStat(context, tr.monitoring_active, tr.monitoring_active_tooltip, + monitorData.activeParticipants, enrolled)), const SizedBox(width: 20.0), - Expanded(child: _buildStat(context, tr.monitoring_ended, tr.monitoring_ended_tooltip, ended, enrolled)), + Expanded( + child: _buildStat(context, tr.monitoring_dropout, tr.monitoring_dropout_tooltip, + monitorData.dropoutParticipants, enrolled)), + const SizedBox(width: 20.0), + Expanded( + child: _buildStat(context, tr.monitoring_completed, tr.monitoring_completed_tooltip, + monitorData.completedParticipants, enrolled)), ], ), ), diff --git a/designer_v2/lib/features/monitor/study_monitor_table.dart b/designer_v2/lib/features/monitor/study_monitor_table.dart index 3950dd8dd..a5b8322d0 100644 --- a/designer_v2/lib/features/monitor/study_monitor_table.dart +++ b/designer_v2/lib/features/monitor/study_monitor_table.dart @@ -1,107 +1,9 @@ -import 'dart:convert'; -import 'dart:math'; - -import 'package:equatable/equatable.dart'; import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; -import 'package:studyu_core/core.dart'; import 'package:studyu_designer_v2/common_views/standard_table.dart'; +import 'package:studyu_designer_v2/domain/study_monitoring.dart'; import 'package:studyu_designer_v2/localization/app_translation.dart'; -class StudyMonitorItem extends Equatable { - final String participantId; - final String? inviteCode; - final DateTime enrolledAt; - final DateTime lastActivityAt; - final int currentDayOfStudy; - final int studyDurationInDays; - final int completedInterventions; - final int missedInterventions; - final int completedSurveys; - final int missedSurveys; - final String rawData; - - const StudyMonitorItem({ - required this.participantId, - required this.inviteCode, - required this.enrolledAt, - required this.lastActivityAt, - required this.currentDayOfStudy, - required this.studyDurationInDays, - required this.completedInterventions, - required this.missedInterventions, - required this.completedSurveys, - required this.missedSurveys, - required this.rawData, - }); - - static List fromStudy(Study study) { - final List items = []; - - final participants = study.participants ?? []; - final participantsProgress = study.participantsProgress ?? []; - - participants.sort((a, b) => a.startedAt!.compareTo(b.startedAt!)); // ascending - - for (final participant in participants) { - final progresses = participantsProgress.where((progress) => progress.subjectId == participant.id).toList(); - progresses.sort((b, a) => a.completedAt!.compareTo(b.completedAt!)); // descending - final interventionOrder = study.schedule.generateInterventionIdsInOrder(participant.selectedInterventionIds); - final lastActivityAt = progresses.isNotEmpty ? progresses.first.completedAt! : participant.startedAt!; - final studyDurationInDays = study.schedule.length; - final currentDayOfStudy = - min(studyDurationInDays, DateTime.now().toUtc().difference(participant.startedAt!).inDays); - final daysInBaseline = study.schedule.includeBaseline ? study.schedule.phaseDuration : 0; - - int totalInterventions = 0; - for (int day = 0; day < currentDayOfStudy; day++) { - if (day < daysInBaseline) { - continue; - } - - final interventionIdForThisPhase = interventionOrder[day ~/ study.schedule.phaseDuration]; - final interventionForThisPhase = study.interventions.firstWhere((i) => i.id == interventionIdForThisPhase); - totalInterventions += interventionForThisPhase.tasks.length; - } - - final totalSurveys = currentDayOfStudy * study.observations.length; - - final completedInterventions = progresses.where((p) => p.resultType == "bool").toList(); - final completedSurveys = progresses.where((p) => p.resultType != "bool").toList(); - - final missedInterventions = totalInterventions - completedInterventions.length; - final missedSurveys = totalSurveys - completedSurveys.length; - - final rawDataDict = { - "participant": participant.toJson(), - "interventions": completedInterventions.map((p) => p.toJson()).toList(), - "surveys": completedSurveys.map((p) => p.toJson()).toList(), - }; - - final rawData = const JsonEncoder.withIndent(' ').convert(rawDataDict); - - items.add(StudyMonitorItem( - participantId: participant.id, - inviteCode: participant.inviteCode, - enrolledAt: participant.startedAt!, - lastActivityAt: lastActivityAt, - currentDayOfStudy: currentDayOfStudy, - studyDurationInDays: studyDurationInDays, - completedInterventions: completedInterventions.length, - missedInterventions: missedInterventions, - completedSurveys: completedSurveys.length, - missedSurveys: missedSurveys, - rawData: rawData, - )); - } - - return items; - } - - @override - List get props => [participantId]; -} - class StudyMonitorTable extends StatelessWidget { final List studyMonitorItems; final OnSelectHandler onSelectItem; diff --git a/designer_v2/lib/localization/app_de.arb b/designer_v2/lib/localization/app_de.arb index 880133dc1..ce97fd86d 100644 --- a/designer_v2/lib/localization/app_de.arb +++ b/designer_v2/lib/localization/app_de.arb @@ -490,9 +490,11 @@ "monitoring_no_participants_description": "Sobald Teilnehmer in Ihrer Studie eingeschrieben sind, können Sie hier deren Fortschritt überwachen und ihre Daten einsehen.", "monitoring_participants_title": "Teilnehmer", "monitoring_active": "Aktiv", - "monitoring_active_tooltip": "Anzahl der Teilnehmer, die in den letzten 3 Tagen aktiv waren", - "monitoring_ended": "Beendet", - "monitoring_ended_tooltip": "Anzahl der Teilnehmer, die das Ende der Studie erreicht haben", + "monitoring_active_tooltip": "Anzahl der Teilnehmer, die derzeit in der Studie sind", + "monitoring_dropout": "Dropout", + "monitoring_dropout_tooltip": "Anzahl der Teilnehmer, die die Studie vorzeitig abgebrochen haben", + "monitoring_completed": "Abgeschlossen", + "monitoring_completed_tooltip": "Anzahl der Teilnehmer, die das Ende der Studie erreicht haben", "monitoring_table_column_participant_id": "Teilnehmer-ID", "monitoring_table_column_invite_code": "Einladungscode", "monitoring_table_column_enrolled": "Eingeschrieben", diff --git a/designer_v2/lib/localization/app_en.arb b/designer_v2/lib/localization/app_en.arb index f39dc90f1..7dccb658a 100644 --- a/designer_v2/lib/localization/app_en.arb +++ b/designer_v2/lib/localization/app_en.arb @@ -538,9 +538,11 @@ "monitoring_no_participants_description": "Once participants have enrolled in your study, you can monitor their progress and view their data here.", "monitoring_participants_title": "Participants", "monitoring_active": "Active", - "monitoring_active_tooltip": "Number of participants that were active in the last 3 days", - "monitoring_ended": "Ended", - "monitoring_ended_tooltip": "Number of participants who reached the end of the study", + "monitoring_active_tooltip": "Number of participants who are currently in the study", + "monitoring_dropout": "Dropout", + "monitoring_dropout_tooltip": "Number of participants who have dropped out before the end of the study", + "monitoring_completed": "Completed", + "monitoring_completed_tooltip": "Number of participants who reached the end of the study", "monitoring_table_column_participant_id": "Participant ID", "monitoring_table_column_invite_code": "Invite Code", "monitoring_table_column_enrolled": "Enrolled", From f73af2acfb874f740801516874712b37300cb928 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20G=C3=B6cer?= Date: Wed, 24 Apr 2024 22:22:20 +0200 Subject: [PATCH 009/314] feat: show study days overview in participant details --- designer_v2/lib/domain/study_monitoring.dart | 63 ++++++++++--- .../participant_details_form_controller.dart | 42 --------- .../participant_details_form_view.dart | 46 ---------- .../monitor/participant_details_view.dart | 92 +++++++++++++++++++ .../features/monitor/study_monitor_page.dart | 20 ++-- designer_v2/lib/localization/app_de.arb | 2 +- designer_v2/lib/localization/app_en.arb | 3 +- designer_v2/pubspec.lock | 2 +- designer_v2/pubspec.yaml | 1 + 9 files changed, 152 insertions(+), 119 deletions(-) delete mode 100644 designer_v2/lib/features/monitor/participant_details_form_controller.dart delete mode 100644 designer_v2/lib/features/monitor/participant_details_form_view.dart create mode 100644 designer_v2/lib/features/monitor/participant_details_view.dart diff --git a/designer_v2/lib/domain/study_monitoring.dart b/designer_v2/lib/domain/study_monitoring.dart index 8689c338e..27a7d25fa 100644 --- a/designer_v2/lib/domain/study_monitoring.dart +++ b/designer_v2/lib/domain/study_monitoring.dart @@ -39,8 +39,10 @@ class StudyMonitorItem extends Equatable { final int completedSurveys; final int missedSurveys; final bool droppedOut; + final List> missedTasksPerDay; + final List> completedTasksPerDay; - const StudyMonitorItem({ + StudyMonitorItem({ required this.participantId, required this.inviteCode, required this.enrolledAt, @@ -52,7 +54,12 @@ class StudyMonitorItem extends Equatable { required this.completedSurveys, required this.missedSurveys, required this.droppedOut, - }); + required this.missedTasksPerDay, + required this.completedTasksPerDay, + }) { + assert(missedTasksPerDay.length == currentDayOfStudy); + assert(completedTasksPerDay.length == currentDayOfStudy); + } @override List get props => [participantId]; @@ -77,24 +84,48 @@ extension StudyMonitoringX on Study { min(studyDurationInDays, DateTime.now().toUtc().difference(participant.startedAt!).inDays); final daysInBaseline = schedule.includeBaseline ? schedule.phaseDuration : 0; - int totalInterventions = 0; + final Set requiredSurveyTaskIds = observations.map((o) => o.id).toSet(); + + int completedInterventions = 0; + int completedSurveys = 0; + final List> missedTasksPerDay = []; + final List> completedTasksPerDay = []; + for (int day = 0; day < currentDayOfStudy; day++) { - if (day < daysInBaseline) { - continue; + final Set requiredInterventionTaskIds = {}; + if (day >= daysInBaseline) { + final interventionIdForThisPhase = interventionOrder[day ~/ schedule.phaseDuration]; + final interventionForThisPhase = interventions.firstWhere((i) => i.id == interventionIdForThisPhase); + requiredInterventionTaskIds.addAll(interventionForThisPhase.tasks.map((t) => t.id)); } - final interventionIdForThisPhase = interventionOrder[day ~/ schedule.phaseDuration]; - final interventionForThisPhase = interventions.firstWhere((i) => i.id == interventionIdForThisPhase); - totalInterventions += interventionForThisPhase.tasks.length; + final requiredTaskIds = requiredInterventionTaskIds.union(requiredSurveyTaskIds); + + final completedTaskIds = progresses + .where((p) => + p.completedAt!.isAfter(participant.startedAt!.add(Duration(days: day))) && + p.completedAt!.isBefore(participant.startedAt!.add(Duration(days: day + 1)))) + .map((p) => p.taskId) + .toSet(); + + final missedTaskIds = requiredTaskIds.difference(completedTaskIds); + missedTasksPerDay.add(missedTaskIds); + + final completedTaskIdsPerDay = requiredTaskIds.intersection(completedTaskIds); + completedTasksPerDay.add(completedTaskIdsPerDay); + + final completedSurveysSet = requiredSurveyTaskIds.intersection(completedTaskIds); + final completedIntervention = requiredInterventionTaskIds.isNotEmpty && + requiredInterventionTaskIds.intersection(completedTaskIds).length == requiredInterventionTaskIds.length; + completedSurveys += completedSurveysSet.length; + completedInterventions += completedIntervention ? 1 : 0; } final totalSurveys = currentDayOfStudy * observations.length; + final totalInterventions = max(0, currentDayOfStudy - daysInBaseline); - final completedInterventions = progresses.where((p) => p.resultType == "bool").toList(); - final completedSurveys = progresses.where((p) => p.resultType != "bool").toList(); - - final missedInterventions = totalInterventions - completedInterventions.length; - final missedSurveys = totalSurveys - completedSurveys.length; + final missedInterventions = totalInterventions - completedInterventions; + final missedSurveys = totalSurveys - completedSurveys; items.add(StudyMonitorItem( participantId: participant.id, @@ -103,11 +134,13 @@ extension StudyMonitoringX on Study { lastActivityAt: lastActivityAt, currentDayOfStudy: currentDayOfStudy, studyDurationInDays: studyDurationInDays, - completedInterventions: completedInterventions.length, + completedInterventions: completedInterventions, missedInterventions: missedInterventions, - completedSurveys: completedSurveys.length, + completedSurveys: completedSurveys, missedSurveys: missedSurveys, droppedOut: participant.isDeleted, + missedTasksPerDay: missedTasksPerDay, + completedTasksPerDay: completedTasksPerDay, )); } diff --git a/designer_v2/lib/features/monitor/participant_details_form_controller.dart b/designer_v2/lib/features/monitor/participant_details_form_controller.dart deleted file mode 100644 index 055d41128..000000000 --- a/designer_v2/lib/features/monitor/participant_details_form_controller.dart +++ /dev/null @@ -1,42 +0,0 @@ -import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:reactive_forms/reactive_forms.dart'; -import 'package:studyu_designer_v2/domain/study_monitoring.dart'; -import 'package:studyu_designer_v2/features/forms/form_view_model.dart'; -import 'package:studyu_designer_v2/localization/app_translation.dart'; - -class ParticipantDetailsFormViewModel extends FormViewModel { - ParticipantDetailsFormViewModel() : super(); - - @override - Map get titles => { - FormMode.create: tr.participant_details_title, - FormMode.readonly: tr.participant_details_title, - }; - - final participantIdControl = FormControl(value: ''); - - final rawDataControl = FormControl(value: ''); - - @override - late final form = FormGroup({ - 'participantId': participantIdControl, - 'rawData': rawDataControl, - }); - - @override - void initControls() {} - - @override - StudyMonitorItem buildFormData() { - throw UnsupportedError("This form is read-only"); - } - - @override - void setControlsFrom(StudyMonitorItem data) { - participantIdControl.value = data.participantId; - rawDataControl.value = ""; - } -} - -final participantDetailsFormViewModelProvider = Provider.autoDispose - .family((ref, item) => ParticipantDetailsFormViewModel()); diff --git a/designer_v2/lib/features/monitor/participant_details_form_view.dart b/designer_v2/lib/features/monitor/participant_details_form_view.dart deleted file mode 100644 index 4d30104ef..000000000 --- a/designer_v2/lib/features/monitor/participant_details_form_view.dart +++ /dev/null @@ -1,46 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:reactive_forms/reactive_forms.dart'; -import 'package:studyu_designer_v2/common_views/form_consumer_widget.dart'; -import 'package:studyu_designer_v2/common_views/form_table_layout.dart'; -import 'package:studyu_designer_v2/features/monitor/participant_details_form_controller.dart'; -import 'package:studyu_designer_v2/localization/app_translation.dart'; - -class ParticipantDetailsFormView extends FormConsumerWidget { - const ParticipantDetailsFormView({required this.formViewModel, super.key}); - - final ParticipantDetailsFormViewModel formViewModel; - - @override - Widget build(BuildContext context, FormGroup form) { - return Column( - children: [ - FormTableLayout(rows: [ - FormTableRow( - label: tr.monitoring_table_column_participant_id, - labelStyle: const TextStyle(fontWeight: FontWeight.bold), - control: formViewModel.participantIdControl, - input: ReactiveTextField( - formControl: formViewModel.participantIdControl, - readOnly: true, - ), - ), - ]), - const SizedBox(height: 16.0), - Align( - alignment: Alignment.centerLeft, - child: FormLabel( - labelText: tr.participant_details_raw_data, - labelTextStyle: const TextStyle( - fontWeight: FontWeight.bold, - )), - ), - const SizedBox(height: 8.0), - ReactiveTextField( - formControl: formViewModel.rawDataControl, - maxLines: null, - readOnly: true, - ), - ], - ); - } -} diff --git a/designer_v2/lib/features/monitor/participant_details_view.dart b/designer_v2/lib/features/monitor/participant_details_view.dart new file mode 100644 index 000000000..1c6911f79 --- /dev/null +++ b/designer_v2/lib/features/monitor/participant_details_view.dart @@ -0,0 +1,92 @@ +import 'package:collection/collection.dart'; +import 'package:flutter/material.dart'; +import 'package:reactive_forms/reactive_forms.dart'; +import 'package:studyu_core/core.dart'; +import 'package:studyu_designer_v2/common_views/form_table_layout.dart'; +import 'package:studyu_designer_v2/domain/study_monitoring.dart'; +import 'package:studyu_designer_v2/localization/app_translation.dart'; + +class ParticipantDetailsView extends StatelessWidget { + const ParticipantDetailsView( + {required this.monitorItem, required this.interventions, required this.observations, super.key}); + + final StudyMonitorItem monitorItem; + final List interventions; + final List observations; + + @override + Widget build(BuildContext context) { + return Column( + children: [ + FormTableLayout(rows: [ + FormTableRow( + label: tr.monitoring_table_column_participant_id, + labelStyle: const TextStyle(fontWeight: FontWeight.bold), + input: ReactiveTextField( + formControl: FormControl(value: monitorItem.participantId), + readOnly: true, + ), + ), + ]), + const SizedBox(height: 16.0), + Align( + alignment: Alignment.centerLeft, + child: FormSectionHeader( + title: tr.participant_details_study_days_overview, + ), + ), + const SizedBox(height: 8.0), + _buildPerDayStatus(context), + ], + ); + } + + Widget _buildPerDayStatus(BuildContext context) { + assert(monitorItem.missedTasksPerDay.length == monitorItem.completedTasksPerDay.length); + return Wrap( + children: monitorItem.missedTasksPerDay + .mapIndexed((index, missed) => Tooltip( + message: _getTooltipText(missed, monitorItem.completedTasksPerDay[index]), + child: Container( + height: 50, + width: 50, + margin: const EdgeInsets.fromLTRB(0, 0, 8, 8), + decoration: BoxDecoration( + color: missed.isEmpty + ? Colors.green + : (monitorItem.completedTasksPerDay[index].isEmpty ? Colors.red : Colors.orange), + borderRadius: BorderRadius.circular(8), + ), + child: Center( + child: Text( + (index + 1).toString(), + style: const TextStyle(color: Colors.white, fontWeight: FontWeight.bold), + ), + ), + ), + )) + .toList(), + ); + } + + String _getTooltipText(Set missedTaskIds, Set completedTaskIds) { + final sb = StringBuffer(); + for (final intervention in interventions) { + for (final task in intervention.tasks) { + if (missedTaskIds.contains(task.id)) { + sb.writeln('❌ ${intervention.name} - ${task.title}'); + } else if (completedTaskIds.contains(task.id)) { + sb.writeln('✅ ${intervention.name} - ${task.title}'); + } + } + } + for (final observation in observations) { + if (missedTaskIds.contains(observation.id)) { + sb.writeln('❌ ${observation.title}'); + } else if (completedTaskIds.contains(observation.id)) { + sb.writeln('✅ ${observation.title}'); + } + } + return sb.toString(); + } +} diff --git a/designer_v2/lib/features/monitor/study_monitor_page.dart b/designer_v2/lib/features/monitor/study_monitor_page.dart index a7150f018..52dbae14e 100644 --- a/designer_v2/lib/features/monitor/study_monitor_page.dart +++ b/designer_v2/lib/features/monitor/study_monitor_page.dart @@ -4,11 +4,10 @@ import 'package:studyu_core/core.dart'; import 'package:studyu_designer_v2/common_views/async_value_widget.dart'; import 'package:studyu_designer_v2/common_views/empty_body.dart'; import 'package:studyu_designer_v2/common_views/form_buttons.dart'; -import 'package:studyu_designer_v2/common_views/sidesheet/sidesheet_form.dart'; +import 'package:studyu_designer_v2/common_views/sidesheet/sidesheet.dart'; import 'package:studyu_designer_v2/common_views/utils.dart'; import 'package:studyu_designer_v2/domain/study_monitoring.dart'; -import 'package:studyu_designer_v2/features/monitor/participant_details_form_controller.dart'; -import 'package:studyu_designer_v2/features/monitor/participant_details_form_view.dart'; +import 'package:studyu_designer_v2/features/monitor/participant_details_view.dart'; import 'package:studyu_designer_v2/features/monitor/study_monitor_table.dart'; import 'package:studyu_designer_v2/features/study/study_controller.dart'; import 'package:studyu_designer_v2/features/study/study_page_view.dart'; @@ -33,7 +32,7 @@ class StudyMonitorScreen extends StudyPageWidget { studyMonitorData.items.isNotEmpty ? StudyMonitorTable( studyMonitorItems: studyMonitorData.items, - onSelectItem: (item) => _onSelectParticipant(context, ref, item), + onSelectItem: (item) => _onSelectParticipant(context, ref, item, study), ) : EmptyBody( icon: Icons.person_off_rounded, @@ -98,16 +97,13 @@ class StudyMonitorScreen extends StudyPageWidget { ); } - _onSelectParticipant(BuildContext context, WidgetRef ref, StudyMonitorItem item) { + _onSelectParticipant(BuildContext context, WidgetRef ref, StudyMonitorItem item, Study study) { // TODO: refactor to use [RoutingIntent] for sidesheet (so that it can be triggered from controller) - final formViewModel = ref.read(participantDetailsFormViewModelProvider(item)); - formViewModel.setControlsFrom(item); - showFormSideSheet( + showModalSideSheet( context: context, - formViewModel: formViewModel, - formViewBuilder: (formViewModel) => ParticipantDetailsFormView( - formViewModel: formViewModel, - ), + title: tr.participant_details_title, + body: ParticipantDetailsView( + monitorItem: item, interventions: study.interventions, observations: study.observations), actionButtons: [ retainSizeInAppBar(DismissButton( text: tr.dialog_close, diff --git a/designer_v2/lib/localization/app_de.arb b/designer_v2/lib/localization/app_de.arb index ce97fd86d..0cf7622b3 100644 --- a/designer_v2/lib/localization/app_de.arb +++ b/designer_v2/lib/localization/app_de.arb @@ -485,7 +485,7 @@ "notification_code_clipboard": "Code wurde in die Zwischenablage kopiert", "@__________________STUDYPAGE_MONITOR__________________": {}, "participant_details_title": "Teilnehmerdetails", - "participant_details_raw_data": "Rohdaten", + "participant_details_study_days_overview": "Übersicht über Studientage", "monitoring_no_participants_title": "Es gibt noch keine Teilnehmer in dieser Studie", "monitoring_no_participants_description": "Sobald Teilnehmer in Ihrer Studie eingeschrieben sind, können Sie hier deren Fortschritt überwachen und ihre Daten einsehen.", "monitoring_participants_title": "Teilnehmer", diff --git a/designer_v2/lib/localization/app_en.arb b/designer_v2/lib/localization/app_en.arb index 7dccb658a..1b56ecf24 100644 --- a/designer_v2/lib/localization/app_en.arb +++ b/designer_v2/lib/localization/app_en.arb @@ -144,7 +144,6 @@ "question_type_audio": "Audio", "form_array_response_options_bool_yes": "Yes", "form_array_response_options_bool_no": "No", - "form_field_response_image": "Image", "form_field_response_choice_multiple": "Select multiple", "form_field_response_image": "Provide directions for capturing image", "form_field_response_audio": "Provide directions for recording audio", @@ -533,7 +532,7 @@ "action_button_code_new": "New code", "@__________________STUDYPAGE_MONITOR__________________": {}, "participant_details_title": "Participant Details", - "participant_details_raw_data": "Raw Data", + "participant_details_study_days_overview": "Study days overview", "monitoring_no_participants_title": "There are no participants in this study yet", "monitoring_no_participants_description": "Once participants have enrolled in your study, you can monitor their progress and view their data here.", "monitoring_participants_title": "Participants", diff --git a/designer_v2/pubspec.lock b/designer_v2/pubspec.lock index 7ce8d7ed6..b27194271 100644 --- a/designer_v2/pubspec.lock +++ b/designer_v2/pubspec.lock @@ -106,7 +106,7 @@ packages: source: hosted version: "1.1.1" collection: - dependency: transitive + dependency: "direct main" description: name: collection sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a diff --git a/designer_v2/pubspec.yaml b/designer_v2/pubspec.yaml index 31602b091..28ff82b23 100644 --- a/designer_v2/pubspec.yaml +++ b/designer_v2/pubspec.yaml @@ -11,6 +11,7 @@ environment: dependencies: archive: ^3.4.10 async: ^2.11.0 + collection: csv: ^6.0.0 cupertino_icons: ^1.0.8 dynamic_color: From 8df279885b1832f73ec46a3972c6018982d2bc2a Mon Sep 17 00:00:00 2001 From: StudyU Documenter Date: Wed, 24 Apr 2024 20:25:46 +0000 Subject: [PATCH 010/314] docs: update UML documentation --- docs/uml/designer_v2/lib/domain/uml.svg | 175 +- .../designer_v2/lib/features/monitor/uml.svg | 269 +- docs/uml/designer_v2/lib/features/uml.svg | 3678 +++++---- docs/uml/designer_v2/lib/uml.svg | 6569 ++++++++--------- 4 files changed, 5253 insertions(+), 5438 deletions(-) diff --git a/docs/uml/designer_v2/lib/domain/uml.svg b/docs/uml/designer_v2/lib/domain/uml.svg index 6959fd20f..893c3e1b2 100644 --- a/docs/uml/designer_v2/lib/domain/uml.svg +++ b/docs/uml/designer_v2/lib/domain/uml.svg @@ -1,5 +1,33 @@ - - [<abstract>ResultTypes + + [StudyMonitorData + | + +activeParticipants: int; + +dropoutParticipants: int; + +completedParticipants: int; + +items: List<StudyMonitorItem> + ] + + [StudyMonitorItem + | + +participantId: String; + +inviteCode: String?; + +enrolledAt: DateTime; + +lastActivityAt: DateTime; + +currentDayOfStudy: int; + +studyDurationInDays: int; + +completedInterventions: int; + +missedInterventions: int; + +completedSurveys: int; + +missedSurveys: int; + +droppedOut: bool; + +missedTasksPerDay: List<Set<String>>; + +completedTasksPerDay: List<Set<String>>; + +props: List<Object?> + ] + + [<abstract>Equatable]<:-[StudyMonitorItem] + + [<abstract>ResultTypes ] [MeasurementResultTypes @@ -57,31 +85,96 @@ - + - - - - - + + + + + + + - + - + - + - + + + + + + + + + + + StudyMonitorData + + + + + + +activeParticipants: int + +dropoutParticipants: int + +completedParticipants: int + +items: List<StudyMonitorItem> + + + + + + + + + + + + StudyMonitorItem + + + + + + +participantId: String + +inviteCode: String? + +enrolledAt: DateTime + +lastActivityAt: DateTime + +currentDayOfStudy: int + +studyDurationInDays: int + +completedInterventions: int + +missedInterventions: int + +completedSurveys: int + +missedSurveys: int + +droppedOut: bool + +missedTasksPerDay: List<Set<String>> + +completedTasksPerDay: List<Set<String>> + +props: List<Object?> + + + + + + + + + + + Equatable + + + - - + - + ResultTypes @@ -90,16 +183,16 @@ - - + + - + MeasurementResultTypes - + <static>+questionnaire: String <static>+values: List<String> @@ -109,16 +202,16 @@ - - + + - + InterventionResultTypes - + <static>+checkmarkTask: String <static>+values: List<String> @@ -128,16 +221,16 @@ - - + + - + StudyExportData - + +study: Study +measurementsData: List<Map<String, dynamic>> @@ -150,9 +243,9 @@ - + - + Study @@ -161,23 +254,23 @@ - - - + + + - + StudyTemplates - + <static>+kUnnamedStudyTitle: String - + <static>+Study emptyDraft() @@ -186,16 +279,16 @@ - - + + - + StudyActionType - + +index: int <static>+values: List<StudyActionType> @@ -213,9 +306,9 @@ - + - + Enum diff --git a/docs/uml/designer_v2/lib/features/monitor/uml.svg b/docs/uml/designer_v2/lib/features/monitor/uml.svg index 598d7fc1a..fbafb4e75 100644 --- a/docs/uml/designer_v2/lib/features/monitor/uml.svg +++ b/docs/uml/designer_v2/lib/features/monitor/uml.svg @@ -1,15 +1,5 @@ - - [ParticipantDetailsFormView - | - +formViewModel: ParticipantDetailsFormViewModel - | - +Widget build() - ] - - [ParticipantDetailsFormView]o-[ParticipantDetailsFormViewModel] - [<abstract>FormConsumerWidget]<:-[ParticipantDetailsFormView] - - [StudyMonitorScreen + + [StudyMonitorScreen | +Widget build(); -Widget _monitorSectionHeader(); @@ -19,26 +9,6 @@ [<abstract>StudyPageWidget]<:-[StudyMonitorScreen] - [StudyMonitorItem - | - +participantId: String; - +inviteCode: String?; - +enrolledAt: DateTime; - +lastActivityAt: DateTime; - +currentDayOfStudy: int; - +studyDurationInDays: int; - +completedInterventions: int; - +missedInterventions: int; - +completedSurveys: int; - +missedSurveys: int; - +rawData: String; - +props: List<Object?> - | - <static>+List<StudyMonitorItem> fromStudy() - ] - - [<abstract>Equatable]<:-[StudyMonitorItem] - [StudyMonitorTable | +studyMonitorItems: List<StudyMonitorItem>; @@ -52,132 +22,49 @@ [StudyMonitorTable]o-[void Function(StudyMonitorItem)] - [ParticipantDetailsFormViewModel + [ParticipantDetailsView | - +participantIdControl: FormControl<String>; - +rawDataControl: FormControl<String>; - +form: FormGroup; - +titles: Map<FormMode, String> + +monitorItem: StudyMonitorItem; + +interventions: List<Intervention>; + +observations: List<Observation> | - +void initControls(); - +StudyMonitorItem buildFormData(); - +void setControlsFrom() + +Widget build(); + -Widget _buildPerDayStatus(); + -String _getTooltipText() ] - [ParticipantDetailsFormViewModel]o-[FormControl] - [ParticipantDetailsFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[ParticipantDetailsFormViewModel] + [ParticipantDetailsView]o-[StudyMonitorItem] - + - - - - - - - - - - - - + + + + - + - + - - - - - - - - - - - - - - - - - ParticipantDetailsFormView - - - - - - +formViewModel: ParticipantDetailsFormViewModel - - - - - - +Widget build() - - - - - - - - - - - - - ParticipantDetailsFormViewModel - - - - - - +participantIdControl: FormControl<String> - +rawDataControl: FormControl<String> - +form: FormGroup - +titles: Map<FormMode, String> - - - - - - +void initControls() - +StudyMonitorItem buildFormData() - +void setControlsFrom() - - - - - - - - - - - FormConsumerWidget - - - + - - + + - + StudyMonitorScreen - + +Widget build() -Widget _monitorSectionHeader() @@ -189,82 +76,35 @@ - + - + StudyPageWidget - - - - - - - - - StudyMonitorItem - - - - - - +participantId: String - +inviteCode: String? - +enrolledAt: DateTime - +lastActivityAt: DateTime - +currentDayOfStudy: int - +studyDurationInDays: int - +completedInterventions: int - +missedInterventions: int - +completedSurveys: int - +missedSurveys: int - +rawData: String - +props: List<Object?> - - - - - - <static>+List<StudyMonitorItem> fromStudy() - - - - - - - - - - - Equatable - - - - - - - + + + - + StudyMonitorTable - + +studyMonitorItems: List<StudyMonitorItem> +onSelectItem: void Function(StudyMonitorItem) - + +Widget build() -List<Widget> _buildRow() @@ -276,44 +116,51 @@ - + - + void Function(StudyMonitorItem) - - - + + + + + - - - FormControl + + + ParticipantDetailsView - - - - + + + +monitorItem: StudyMonitorItem + +interventions: List<Intervention> + +observations: List<Observation> + + - - - FormGroup + + + +Widget build() + -Widget _buildPerDayStatus() + -String _getTooltipText() - - - + + + - - - FormViewModel + + + StudyMonitorItem diff --git a/docs/uml/designer_v2/lib/features/uml.svg b/docs/uml/designer_v2/lib/features/uml.svg index 35e9bd57c..562de6fb2 100644 --- a/docs/uml/designer_v2/lib/features/uml.svg +++ b/docs/uml/designer_v2/lib/features/uml.svg @@ -1,4 +1,4 @@ - + [<abstract>IAppDelegate | +dynamic onAppStart() @@ -14,16 +14,6 @@ -dynamic _callDelegates() ] - [ParticipantDetailsFormView - | - +formViewModel: ParticipantDetailsFormViewModel - | - +Widget build() - ] - - [ParticipantDetailsFormView]o-[ParticipantDetailsFormViewModel] - [<abstract>FormConsumerWidget]<:-[ParticipantDetailsFormView] - [StudyMonitorScreen | +Widget build(); @@ -34,26 +24,6 @@ [<abstract>StudyPageWidget]<:-[StudyMonitorScreen] - [StudyMonitorItem - | - +participantId: String; - +inviteCode: String?; - +enrolledAt: DateTime; - +lastActivityAt: DateTime; - +currentDayOfStudy: int; - +studyDurationInDays: int; - +completedInterventions: int; - +missedInterventions: int; - +completedSurveys: int; - +missedSurveys: int; - +rawData: String; - +props: List<Object?> - | - <static>+List<StudyMonitorItem> fromStudy() - ] - - [<abstract>Equatable]<:-[StudyMonitorItem] - [StudyMonitorTable | +studyMonitorItems: List<StudyMonitorItem>; @@ -67,21 +37,18 @@ [StudyMonitorTable]o-[void Function(StudyMonitorItem)] - [ParticipantDetailsFormViewModel + [ParticipantDetailsView | - +participantIdControl: FormControl<String>; - +rawDataControl: FormControl<String>; - +form: FormGroup; - +titles: Map<FormMode, String> + +monitorItem: StudyMonitorItem; + +interventions: List<Intervention>; + +observations: List<Observation> | - +void initControls(); - +StudyMonitorItem buildFormData(); - +void setControlsFrom() + +Widget build(); + -Widget _buildPerDayStatus(); + -String _getTooltipText() ] - [ParticipantDetailsFormViewModel]o-[FormControl] - [ParticipantDetailsFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[ParticipantDetailsFormViewModel] + [ParticipantDetailsView]o-[StudyMonitorItem] [LoginForm | @@ -2447,1278 +2414,1264 @@ - + - - - - - - - - - - - + + + - + - + - + - + - + - - - + + + - + - - - + + + - + - - - + + + - + - - - + + + - + - - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - - + - + - - + + - + - + - - + + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - - + + - + - + - + - + - + - + - + - - - + + + - + - + - + - + - - + + - + - - - + + + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - - + + - + - + - + - - + + - + - - - - + + + + - + - - - + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - - - - - - + + + + + + + + + - + - - - + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - - + + + + + - + - + - + - - - - + + + + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - - - + + + - + - + - + - + - + - + - + - - - - - + + + + + - + - - - + + + - + - + - + - + - + - + - + - + - + - + - + - - - - - - - - - + + + + + + + + + - + - + - + - - - + + + - + - - - - - + + + + + - + - + - + - + - + - + - + - + - + - - - - + + + + - + - + - + - + - + - - + + - + - + - + - - - - - + + + + + - + - + - + - - - + + + - + - + - - + + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - - - - + + + + - + - - - + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - - - - - + + + + + - + - - - + + + - + - + - + - + - + - - - + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - - + + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - - + + - + - + - + - + - - + + - + - + - + - + - + - - - - - + + + + + - + - + - + - + - + - + - + - + - - + + - + - + - + - - - + + + - + - - - + + + - + - + - + - + - + - - - - - - + + + + + + - + - + - + - + - + - - - - + + + + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - - + + - + - + - + - - - + + + - + - + - + - - - - - + + + + + - + - - - - - + + + + + - + - + - + - + - + - + - - + + - + - - + + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - + + + + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - - + + - + - + - + - + - + - + - + - + - - + + - + - + - - - - - - - - - - + + + + + + + + + + - + - - - + + + - + - - - + + + - + - - - + + + - + - - - + + + - + - + - - + + - + - - - + + + - + - + - + - - - + + + - + - - - + + + - + - + - + - + - + - + - + - + - + - - + + - + - - + + - + - + - + - + - - + + - + - - - + + + - + - + - + - - - + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - - + + - - + + - + IAppDelegate - + +dynamic onAppStart() @@ -3727,17 +3680,17 @@ - - - + + + - + AppController - + +appDelegates: List<IAppDelegate> -_delayedFuture: dynamic @@ -3745,7 +3698,7 @@ - + +dynamic onAppStart() -dynamic _callDelegates() @@ -3753,84 +3706,18 @@ - - - - - - - - - ParticipantDetailsFormView - - - - - - +formViewModel: ParticipantDetailsFormViewModel - - - - - - +Widget build() - - - - - - - - - - - - - ParticipantDetailsFormViewModel - - - - - - +participantIdControl: FormControl<String> - +rawDataControl: FormControl<String> - +form: FormGroup - +titles: Map<FormMode, String> - - - - - - +void initControls() - +StudyMonitorItem buildFormData() - +void setControlsFrom() - - - - - - - - - - - FormConsumerWidget - - - - - - + + - + StudyMonitorScreen - + +Widget build() -Widget _monitorSectionHeader() @@ -3842,96 +3729,49 @@ - - - + + + - + StudyPageWidget - + +studyId: String - + +Widget? banner() - - - - - - - - - StudyMonitorItem - - - - - - +participantId: String - +inviteCode: String? - +enrolledAt: DateTime - +lastActivityAt: DateTime - +currentDayOfStudy: int - +studyDurationInDays: int - +completedInterventions: int - +missedInterventions: int - +completedSurveys: int - +missedSurveys: int - +rawData: String - +props: List<Object?> - - - - - - <static>+List<StudyMonitorItem> fromStudy() - - - - - - - - - - - Equatable - - - - - - - + + + - + StudyMonitorTable - + +studyMonitorItems: List<StudyMonitorItem> +onSelectItem: void Function(StudyMonitorItem) - + +Widget build() -List<Widget> _buildRow() @@ -3943,117 +3783,74 @@ - + - + void Function(StudyMonitorItem) - - - + + + + + - - - FormControl + + + ParticipantDetailsView - - - - - - - - FormGroup + + + +monitorItem: StudyMonitorItem + +interventions: List<Intervention> + +observations: List<Observation> - - - - - - - - - - FormViewModel + + + +Widget build() + -Widget _buildPerDayStatus() + -String _getTooltipText() - - - -_formData: T? - -_formMode: FormMode - -_validationSet: FormValidationSetEnum? - +delegate: IFormViewModelDelegate<FormViewModel<dynamic>>? - +autosave: bool - -_immediateFormChildrenSubscriptions: List<StreamSubscription<dynamic>> - -_immediateFormChildrenListenerDebouncer: Debouncer? - -_autosaveOperation: CancelableOperation<dynamic>? - -_defaultControlValidators: Map<String, Tuple<List<Validator<dynamic>>, List<AsyncValidator<dynamic>>>> - +prevFormValue: Map<String, dynamic>? - <static>-_formKey: String - +formData: T? - +formMode: FormMode - +isReadonly: bool - +validationSet: FormValidationSetEnum? - +isDirty: bool - +title: String - +isValid: bool - +titles: Map<FormMode, String> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - - + + + + - - - -dynamic _setFormData() - -dynamic _rememberDefaultControlValidators() - -Tuple<List<Validator<dynamic>>, List<AsyncValidator<dynamic>>>? _getDefaultValidators() - -dynamic _disableAllControls() - -dynamic _formModeUpdated() - -dynamic _restoreControlsFromFormData() - +void revalidate() - -void _applyValidationSet() - +void read() - +dynamic save() - +dynamic cancel() - +void enableAutosave() - +void listenToImmediateFormChildren() - +dynamic markFormGroupChanged() - +void dispose() - +void setControlsFrom() - +T buildFormData() - +void initControls() + + + StudyMonitorItem - - - + + + - + LoginForm - + +formKey: AuthFormKey - + +Widget build() @@ -4062,16 +3859,16 @@ - - + + - + AuthFormKey - + +index: int <static>+values: List<AuthFormKey> @@ -4087,9 +3884,9 @@ - + - + FormConsumerRefWidget @@ -4098,23 +3895,23 @@ - - - + + + - + PasswordRecoveryForm - + +formKey: AuthFormKey - + +Widget build() @@ -4123,23 +3920,23 @@ - - - + + + - + PasswordForgotForm - + +formKey: AuthFormKey - + +Widget build() @@ -4148,23 +3945,23 @@ - - - + + + - + SignupForm - + +formKey: AuthFormKey - + +Widget build() -dynamic _onClickTermsOfUse() @@ -4175,16 +3972,16 @@ - - + + - + AuthScaffold - + +body: Widget +formKey: AuthFormKey @@ -4197,9 +3994,9 @@ - + - + Widget @@ -4208,9 +4005,9 @@ - + - + EdgeInsets @@ -4219,16 +4016,16 @@ - - + + - + EmailTextField - + +labelText: String +hintText: String? @@ -4238,18 +4035,29 @@ + + + + + + + FormControl + + + + - - + + - + PasswordTextField - + +labelText: String +hintText: String? @@ -4262,9 +4070,9 @@ - + - + dynamic Function(FormControl<dynamic>)? @@ -4273,16 +4081,16 @@ - - + + - + StudyUJobsToBeDone - + +Widget build() @@ -4291,17 +4099,17 @@ - - - + + + - + AuthFormController - + +authRepository: IAuthRepository +notificationService: INotificationService @@ -4322,7 +4130,7 @@ - + -dynamic _getFormFor() -dynamic _onChangeFormKey() @@ -4344,9 +4152,9 @@ - + - + IAuthRepository @@ -4355,9 +4163,9 @@ - + - + INotificationService @@ -4366,27 +4174,38 @@ - + - + GoRouter + + + + + + + FormGroup + + + + - - + + - + IFormGroupController - + +form: FormGroup @@ -4395,9 +4214,9 @@ - + - + Enum @@ -4406,16 +4225,16 @@ - - + + - + AppStatus - + +index: int <static>+values: List<AppStatus> @@ -4427,17 +4246,17 @@ - - - + + + - + FormArrayTable - + +control: AbstractControl<dynamic> +items: List<T> @@ -4461,7 +4280,7 @@ - + +Widget build() -List<Widget> _buildRow() @@ -4472,9 +4291,9 @@ - + - + AbstractControl @@ -4483,9 +4302,9 @@ - + - + void Function(T) @@ -4494,9 +4313,9 @@ - + - + List<ModelAction<dynamic>> Function(T, int) @@ -4505,9 +4324,9 @@ - + - + void Function()? @@ -4516,9 +4335,9 @@ - + - + String Function(T) @@ -4527,9 +4346,9 @@ - + - + IconData @@ -4538,9 +4357,9 @@ - + - + Widget Function(BuildContext, T, int)? @@ -4549,27 +4368,88 @@ - - + + - + ManagedFormViewModel - + +ManagedFormViewModel<T> createDuplicate() + + + + + + + + + FormViewModel + + + + + + -_formData: T? + -_formMode: FormMode + -_validationSet: FormValidationSetEnum? + +delegate: IFormViewModelDelegate<FormViewModel<dynamic>>? + +autosave: bool + -_immediateFormChildrenSubscriptions: List<StreamSubscription<dynamic>> + -_immediateFormChildrenListenerDebouncer: Debouncer? + -_autosaveOperation: CancelableOperation<dynamic>? + -_defaultControlValidators: Map<String, Tuple<List<Validator<dynamic>>, List<AsyncValidator<dynamic>>>> + +prevFormValue: Map<String, dynamic>? + <static>-_formKey: String + +formData: T? + +formMode: FormMode + +isReadonly: bool + +validationSet: FormValidationSetEnum? + +isDirty: bool + +title: String + +isValid: bool + +titles: Map<FormMode, String> + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + + + + + + -dynamic _setFormData() + -dynamic _rememberDefaultControlValidators() + -Tuple<List<Validator<dynamic>>, List<AsyncValidator<dynamic>>>? _getDefaultValidators() + -dynamic _disableAllControls() + -dynamic _formModeUpdated() + -dynamic _restoreControlsFromFormData() + +void revalidate() + -void _applyValidationSet() + +void read() + +dynamic save() + +dynamic cancel() + +void enableAutosave() + +void listenToImmediateFormChildren() + +dynamic markFormGroupChanged() + +void dispose() + +void setControlsFrom() + +T buildFormData() + +void initControls() + + + + - + - + FormViewModelNotFoundException @@ -4578,9 +4458,9 @@ - + - + Exception @@ -4589,17 +4469,17 @@ - - - + + + - + FormViewModelCollection - + +formViewModels: List<T> +formArray: FormArray<dynamic> @@ -4609,7 +4489,7 @@ - + +void add() +T remove() @@ -4626,9 +4506,9 @@ - + - + FormArray @@ -4637,17 +4517,17 @@ - - - + + + - + CustomFormControl - + -_onValueChangedDebouncer: Debouncer? -_onStatusChangedDebouncer: Debouncer? @@ -4658,7 +4538,7 @@ - + +void dispose() @@ -4667,9 +4547,9 @@ - + - + Debouncer @@ -4678,9 +4558,9 @@ - + - + void Function(T?)? @@ -4689,9 +4569,9 @@ - + - + void Function(ControlStatus)? @@ -4700,16 +4580,16 @@ - - + + - + UnsavedChangesDialog - + +Widget build() @@ -4718,9 +4598,9 @@ - + - + FormValidationSetEnum @@ -4729,17 +4609,17 @@ - - - + + + - + FormControlValidation - + +control: AbstractControl<dynamic> +validators: List<Validator<dynamic>> @@ -4748,7 +4628,7 @@ - + +FormControlValidation merge() @@ -4757,23 +4637,23 @@ - - - + + + - + IFormData - + +id: String - + +IFormData copy() @@ -4782,9 +4662,9 @@ - + - + FormInvalidException @@ -4793,16 +4673,16 @@ - - + + - + FormConfigException - + +message: String? @@ -4811,16 +4691,16 @@ - - + + - + IFormViewModelDelegate - + +dynamic onSave() +void onCancel() @@ -4830,16 +4710,16 @@ - - + + - + FormControlOption - + +value: T +label: String @@ -4849,18 +4729,29 @@ + + + + + + + Equatable + + + + - - + + - + FormMode - + +index: int <static>+values: List<FormMode> @@ -4873,9 +4764,9 @@ - + - + CancelableOperation @@ -4884,23 +4775,23 @@ - - - + + + - + EnrolledBadge - + +enrolledCount: int - + +Widget build() @@ -4909,24 +4800,24 @@ - - - + + + - + StudyRecruitController - + +inviteCodeRepository: IInviteCodeRepository -_invitesSubscription: StreamSubscription<List<WrappedModel<StudyInvite>>>? - + -dynamic _subscribeInvites() +Intervention? getIntervention() @@ -4940,9 +4831,9 @@ - + - + IInviteCodeRepository @@ -4951,9 +4842,9 @@ - + - + StreamSubscription @@ -4962,17 +4853,17 @@ - - - + + + - + StudyBaseController - + +studyId: String +studyRepository: IStudyRepository @@ -4981,7 +4872,7 @@ - + +dynamic subscribeStudy() +dynamic onStudySubscriptionUpdate() @@ -4993,9 +4884,9 @@ - + - + IModelActionProvider @@ -5004,16 +4895,16 @@ - - + + - + StudyRecruitScreen - + +Widget build() -Widget _inviteCodesSectionHeader() @@ -5025,23 +4916,23 @@ - - - + + + - + InviteCodeFormView - + +formViewModel: InviteCodeFormViewModel - + +Widget build() -List<FormTableRow> _conditionalInterventionRows() @@ -5051,17 +4942,17 @@ - - - + + + - + InviteCodeFormViewModel - + +study: Study +inviteCodeRepository: IInviteCodeRepository @@ -5080,7 +4971,7 @@ - + +void initControls() -dynamic _uniqueInviteCode() @@ -5093,19 +4984,30 @@ + + + + + + + FormConsumerWidget + + + + - - - + + + - + StudyInvitesTable - + +invites: List<StudyInvite> +onSelect: void Function(StudyInvite) @@ -5116,7 +5018,7 @@ - + +Widget build() -List<Widget> _buildRow() @@ -5126,9 +5028,9 @@ - + - + void Function(StudyInvite) @@ -5137,9 +5039,9 @@ - + - + List<ModelAction<dynamic>> Function(StudyInvite) @@ -5148,9 +5050,9 @@ - + - + Intervention? Function(String) @@ -5159,9 +5061,9 @@ - + - + int Function(StudyInvite) @@ -5170,9 +5072,9 @@ - + - + Study @@ -5181,16 +5083,16 @@ - - + + - + PublishSuccessDialog - + +Widget build() @@ -5199,16 +5101,16 @@ - - + + - + PublishDialog - + +Widget build() @@ -5217,16 +5119,16 @@ - - + + - + PublishConfirmationDialog - + +Widget build() @@ -5235,17 +5137,17 @@ - - - + + + - + FrameControlsWidget - + +onRefresh: void Function()? +onOpenNewTab: void Function()? @@ -5253,7 +5155,7 @@ - + +Widget build() @@ -5262,9 +5164,9 @@ - + - + ConsumerWidget @@ -5273,16 +5175,16 @@ - - + + - + IStudyStatusBadgeViewModel - + +studyParticipation: Participation? +studyStatus: StudyStatus? @@ -5292,9 +5194,9 @@ - + - + Participation @@ -5303,9 +5205,9 @@ - + - + StudyStatus @@ -5314,17 +5216,17 @@ - - - + + + - + StudyStatusBadge - + +participation: Participation? +status: StudyStatus? @@ -5334,7 +5236,7 @@ - + +Widget build() @@ -5343,9 +5245,9 @@ - + - + BadgeType @@ -5354,17 +5256,17 @@ - - - + + + - + RouteInformation - + +route: String? +extra: String? @@ -5373,7 +5275,7 @@ - + +String toString() @@ -5382,17 +5284,17 @@ - - - + + + - + PlatformController - + +studyId: String +baseSrc: String @@ -5402,7 +5304,7 @@ - + +void activate() +void registerViews() @@ -5418,23 +5320,23 @@ - - - + + + - + WebController - + +iFrameElement: IFrameElement - + +void activate() +void registerViews() @@ -5450,9 +5352,9 @@ - + - + IFrameElement @@ -5461,16 +5363,16 @@ - - + + - + MobileController - + +void openNewPage() +void refresh() @@ -5486,17 +5388,17 @@ - - - + + + - + StudyController - + +notificationService: INotificationService +studyEventsSubscription: StreamSubscription<ModelEvent<Study>>? @@ -5504,7 +5406,7 @@ - + +dynamic syncStudyStatus() +dynamic onStudySubscriptionUpdate() @@ -5520,16 +5422,16 @@ - - + + - + IStudyNavViewModel - + +isEditTabEnabled: bool +isTestTabEnabled: bool @@ -5543,16 +5445,16 @@ - - + + - + StudyNav - + <static>+dynamic tabs() <static>+dynamic edit() @@ -5566,16 +5468,16 @@ - - + + - + StudyDesignNav - + <static>+dynamic tabs() <static>+dynamic info() @@ -5589,9 +5491,9 @@ - + - + IWithBanner @@ -5600,17 +5502,17 @@ - - - + + + - + StudyParticipationBadge - + +participation: Participation +type: BadgeType @@ -5619,7 +5521,7 @@ - + +Widget build() @@ -5628,9 +5530,9 @@ - + - + IStudyRepository @@ -5639,16 +5541,16 @@ - - + + - + PreviewFrame - + +studyId: String +routeArgs: StudyFormRouteArgs? @@ -5659,9 +5561,9 @@ - + - + StudyFormRouteArgs @@ -5670,16 +5572,16 @@ - - + + - + IStudyAppBarViewModel - + +isSyncIndicatorVisible: bool +isStatusBadgeVisible: bool @@ -5690,16 +5592,16 @@ - - + + - + StudyScaffold - + +studyId: String +tabs: List<NavbarTab>? @@ -5720,9 +5622,9 @@ - + - + NavbarTab @@ -5731,9 +5633,9 @@ - + - + SingleColumnLayoutType @@ -5742,24 +5644,24 @@ - - - + + + - + WebFrame - + +previewSrc: String +studyId: String - + +Widget build() @@ -5768,16 +5670,16 @@ - - + + - + DisabledFrame - + +Widget build() @@ -5786,17 +5688,17 @@ - - - + + + - + PhoneContainer - + <static>+defaultWidth: double <static>+defaultHeight: double @@ -5810,7 +5712,7 @@ - + +Widget build() @@ -5819,9 +5721,9 @@ - + - + Color @@ -5830,16 +5732,16 @@ - - + + - + MobileFrame - + +Widget build() @@ -5848,16 +5750,16 @@ - - + + - + DesktopFrame - + +Widget build() @@ -5866,23 +5768,23 @@ - - - + + + - + StudyTestScreen - + +previewRoute: String? - + +Widget build() +Widget? banner() @@ -5895,17 +5797,17 @@ - - - + + + - + StudySettingsFormViewModel - + +study: AsyncValue<Study> +studyRepository: IStudyRepository @@ -5918,7 +5820,7 @@ - + +void setControlsFrom() +Study buildFormData() @@ -5931,9 +5833,9 @@ - + - + AsyncValue @@ -5942,16 +5844,16 @@ - - + + - + StudySettingsDialog - + +Widget build() @@ -5960,16 +5862,16 @@ - - + + - + StudyTestController - + +authRepository: IAuthRepository +languageCode: String @@ -5979,16 +5881,16 @@ - - + + - + TestAppRoutes - + <static>+studyOverview: String <static>+eligibility: String @@ -6002,17 +5904,17 @@ - - - + + + - + DrawerEntry - + +localizedTitle: String Function() +icon: IconData? @@ -6025,7 +5927,7 @@ - + +void onClick() @@ -6034,9 +5936,9 @@ - + - + String Function() @@ -6045,9 +5947,9 @@ - + - + String Function()? @@ -6056,9 +5958,9 @@ - + - + void Function(BuildContext, WidgetRef)? @@ -6067,24 +5969,24 @@ - - - + + + - + GoRouterDrawerEntry - + +intent: RoutingIntent +onNavigated: void Function()? - + +void onClick() @@ -6093,9 +5995,9 @@ - + - + RoutingIntent @@ -6104,16 +6006,16 @@ - - + + - + AppDrawer - + +width: int +autoCloseDrawer: bool @@ -6129,16 +6031,16 @@ - - + + - + StudyAnalyzeScreen - + +Widget? banner() +Widget build() @@ -6148,16 +6050,16 @@ - - + + - + StudyAnalyzeController - + +dynamic onExport() @@ -6166,16 +6068,16 @@ - - + + - + StudyDesignInterventionsFormView - + +Widget build() @@ -6184,16 +6086,16 @@ - - + + - + StudyDesignPageWidget - + +Widget? banner() @@ -6202,16 +6104,16 @@ - - + + - + InterventionFormView - + +formViewModel: InterventionFormViewModel @@ -6220,17 +6122,17 @@ - - - + + + - + InterventionFormViewModel - + +study: Study +interventionIdControl: FormControl<String> @@ -6249,7 +6151,7 @@ - + +void setControlsFrom() +InterventionFormData buildFormData() @@ -6270,23 +6172,23 @@ - - - + + + - + InterventionPreview - + +routeArgs: InterventionFormRouteArgs - + +Widget build() @@ -6295,9 +6197,9 @@ - + - + InterventionFormRouteArgs @@ -6306,23 +6208,23 @@ - - - + + + - + StudyScheduleFormView - + +formViewModel: StudyScheduleControls - + -FormTableRow _renderCustomSequence() +Widget build() @@ -6332,17 +6234,17 @@ - - - + + + - + StudyScheduleControls - + <static>+defaultScheduleType: PhaseSequence <static>+defaultScheduleTypeSequence: String @@ -6366,7 +6268,7 @@ - + +void setStudyScheduleControlsFrom() +StudyScheduleFormData buildStudyScheduleFormData() @@ -6377,17 +6279,17 @@ - - - + + + - + InterventionTaskFormData - + +taskId: String +taskTitle: String @@ -6397,7 +6299,7 @@ - + +CheckmarkTask toTask() +InterventionTaskFormData copy() @@ -6407,17 +6309,17 @@ - - - + + + - + IFormDataWithSchedule - + +instanceId: String +isTimeLocked: bool @@ -6428,7 +6330,7 @@ - + +Schedule toSchedule() @@ -6437,17 +6339,17 @@ - - - + + + - + InterventionsFormViewModel - + +study: Study +router: GoRouter @@ -6461,7 +6363,7 @@ - + +void setControlsFrom() +InterventionsFormData buildFormData() @@ -6481,9 +6383,9 @@ - + - + IListActionProvider @@ -6492,9 +6394,9 @@ - + - + IProviderArgsResolver @@ -6503,17 +6405,17 @@ - - - + + + - + InterventionTaskFormViewModel - + +taskIdControl: FormControl<String> +instanceIdControl: FormControl<String> @@ -6529,7 +6431,7 @@ - + +void setControlsFrom() +InterventionTaskFormData buildFormData() @@ -6540,17 +6442,17 @@ - - - + + + - + WithScheduleControls - + +isTimeRestrictedControl: FormControl<bool> +instanceID: FormControl<String> @@ -6569,7 +6471,7 @@ - + +void setScheduleControlsFrom() -dynamic _initReminderControl() @@ -6579,9 +6481,9 @@ - + - + PhaseSequence @@ -6590,17 +6492,17 @@ - - - + + + - + InterventionFormData - + +interventionId: String +title: String @@ -6612,7 +6514,7 @@ - + +Intervention toIntervention() +InterventionFormData copy() @@ -6622,17 +6524,17 @@ - - - + + + - + StudyScheduleFormData - + +sequenceType: PhaseSequence +sequenceTypeCustom: String @@ -6643,7 +6545,7 @@ - + +StudySchedule toStudySchedule() +Study apply() @@ -6654,16 +6556,16 @@ - - + + - + IStudyFormData - + +Study apply() @@ -6672,16 +6574,16 @@ - - + + - + InterventionTaskFormView - + +formViewModel: InterventionTaskFormViewModel @@ -6690,17 +6592,17 @@ - - - + + + - + InterventionsFormData - + +interventionsData: List<InterventionFormData> +studyScheduleData: StudyScheduleFormData @@ -6708,7 +6610,7 @@ - + +Study apply() +InterventionsFormData copy() @@ -6718,16 +6620,16 @@ - - + + - + StudyDesignReportsFormView - + +Widget build() -dynamic _showReportItemSidesheetWithArgs() @@ -6737,17 +6639,17 @@ - - - + + + - + ReportItemFormData - + +isPrimary: bool +section: ReportSection @@ -6755,7 +6657,7 @@ - + <static>+dynamic fromDomainModel() +ReportItemFormData copy() @@ -6765,9 +6667,9 @@ - + - + ReportSection @@ -6776,17 +6678,17 @@ - - - + + + - + DataReferenceEditor - + +formControl: FormControl<DataReferenceIdentifier<T>> +availableTasks: List<Task> @@ -6794,7 +6696,7 @@ - + +FormTableRow buildFormTableRow() -List<DropdownMenuItem<DataReferenceIdentifier<dynamic>>> _dataReferenceItems() @@ -6804,9 +6706,9 @@ - + - + ReactiveDropdownField @@ -6815,17 +6717,17 @@ - - - + + + - + TemporalAggregationFormatted - + -_value: TemporalAggregation <static>+values: List<TemporalAggregationFormatted> @@ -6836,7 +6738,7 @@ - + +bool ==() +String toString() @@ -6848,9 +6750,9 @@ - + - + TemporalAggregation @@ -6859,17 +6761,17 @@ - - - + + + - + ImprovementDirectionFormatted - + -_value: ImprovementDirection <static>+values: List<ImprovementDirectionFormatted> @@ -6880,7 +6782,7 @@ - + +bool ==() +String toString() @@ -6892,9 +6794,9 @@ - + - + ImprovementDirection @@ -6903,16 +6805,16 @@ - - + + - + ReportSectionType - + +index: int <static>+values: List<ReportSectionType> @@ -6924,17 +6826,17 @@ - - - + + + - + AverageSectionFormView - + +formViewModel: ReportItemFormViewModel +studyId: String @@ -6942,7 +6844,7 @@ - + +Widget build() @@ -6951,17 +6853,17 @@ - - - + + + - + ReportItemFormViewModel - + <static>+defaultSectionType: ReportSectionType +sectionIdControl: FormControl<String> @@ -6994,7 +6896,7 @@ - + -List<FormControlValidation> _getValidationConfig() +ReportItemFormData buildFormData() @@ -7008,23 +6910,23 @@ - - - + + + - + DataReferenceIdentifier - + +hashCode: int - + +bool ==() @@ -7033,9 +6935,9 @@ - + - + DataReference @@ -7044,17 +6946,17 @@ - - - + + + - + LinearRegressionSectionFormView - + +formViewModel: ReportItemFormViewModel +studyId: String @@ -7062,7 +6964,7 @@ - + +Widget build() @@ -7071,17 +6973,17 @@ - - - + + + - + ReportItemFormView - + +formViewModel: ReportItemFormViewModel +studyId: String @@ -7090,7 +6992,7 @@ - + +Widget build() -dynamic _buildSectionText() @@ -7101,9 +7003,9 @@ - + - + Widget Function(BuildContext) @@ -7112,17 +7014,17 @@ - - - + + + - + ReportsFormViewModel - + +study: Study +router: GoRouter @@ -7137,7 +7039,7 @@ - + +void setControlsFrom() +ReportsFormData buildFormData() @@ -7154,17 +7056,17 @@ - - - + + + - + ReportFormItemDelegate - + +formViewModelCollection: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData> +owner: ReportsFormViewModel @@ -7173,7 +7075,7 @@ - + +void onCancel() +dynamic onSave() @@ -7187,17 +7089,17 @@ - - - + + + - + ReportBadge - + +status: ReportStatus? +type: BadgeType @@ -7206,7 +7108,7 @@ - + +Widget build() @@ -7215,16 +7117,16 @@ - - + + - + ReportStatus - + +index: int <static>+values: List<ReportStatus> @@ -7236,24 +7138,24 @@ - - - + + + - + ReportsFormData - + +reportItems: List<ReportItemFormData> +id: String - + +Study apply() +ReportsFormData copy() @@ -7263,17 +7165,17 @@ - - - + + + - + StudyInfoFormViewModel - + +study: Study +titleControl: FormControl<String> @@ -7304,7 +7206,7 @@ - + +void setControlsFrom() +StudyInfoFormData buildFormData() @@ -7314,16 +7216,16 @@ - - + + - + StudyDesignInfoFormView - + +Widget build() @@ -7332,17 +7234,17 @@ - - - + + + - + StudyInfoFormData - + +title: String +description: String? @@ -7352,7 +7254,7 @@ - + +Study apply() +StudyInfoFormData copy() @@ -7362,17 +7264,17 @@ - - - + + + - + StudyContactInfoFormData - + +organization: String? +institutionalReviewBoard: String? @@ -7386,7 +7288,7 @@ - + +Study apply() +StudyInfoFormData copy() @@ -7396,16 +7298,16 @@ - - + + - + StudyFormValidationSet - + +index: int <static>+values: List<StudyFormValidationSet> @@ -7415,24 +7317,24 @@ - - - + + + - + MeasurementsFormData - + +surveyMeasurements: List<MeasurementSurveyFormData> +id: String - + +Study apply() +MeasurementsFormData copy() @@ -7442,16 +7344,16 @@ - - + + - + MeasurementSurveyFormView - + +formViewModel: MeasurementSurveyFormViewModel @@ -7460,17 +7362,17 @@ - - - + + + - + MeasurementSurveyFormViewModel - + +study: Study +measurementIdControl: FormControl<String> @@ -7489,7 +7391,7 @@ - + +void setControlsFrom() +MeasurementSurveyFormData buildFormData() @@ -7507,23 +7409,23 @@ - - - + + + - + SurveyPreview - + +routeArgs: MeasurementFormRouteArgs - + +Widget build() @@ -7532,9 +7434,9 @@ - + - + MeasurementFormRouteArgs @@ -7543,17 +7445,17 @@ - - - + + + - + MeasurementSurveyFormData - + +measurementId: String +title: String @@ -7565,7 +7467,7 @@ - + +QuestionnaireTask toQuestionnaireTask() +MeasurementSurveyFormData copy() @@ -7575,24 +7477,24 @@ - - - + + + - + QuestionnaireFormData - + +questionsData: List<QuestionFormData>? +id: String - + +StudyUQuestionnaire toQuestionnaire() +List<EligibilityCriterion> toEligibilityCriteria() @@ -7603,17 +7505,17 @@ - - - + + + - + WithQuestionnaireControls - + +questionsArray: FormArray<dynamic> +questionFormViewModels: FormViewModelCollection<Q, QuestionFormData> @@ -7624,7 +7526,7 @@ - + +void setQuestionnaireControlsFrom() +QuestionnaireFormData buildQuestionnaireFormData() @@ -7639,16 +7541,16 @@ - - + + - + StudyDesignMeasurementsFormView - + +Widget build() @@ -7657,17 +7559,17 @@ - - - + + + - + MeasurementsFormViewModel - + +study: Study +router: GoRouter @@ -7681,7 +7583,7 @@ - + +void read() +void setControlsFrom() @@ -7700,17 +7602,17 @@ - - - + + + - + StudyFormScaffold - + +studyId: String +formViewModelBuilder: T Function(WidgetRef) @@ -7718,7 +7620,7 @@ - + +Widget build() @@ -7727,9 +7629,9 @@ - + - + T Function(WidgetRef) @@ -7738,9 +7640,9 @@ - + - + Widget Function(T) @@ -7749,17 +7651,17 @@ - - - + + + - + ConsentItemFormViewModel - + +consentIdControl: FormControl<String> +titleControl: FormControl<String> @@ -7774,7 +7676,7 @@ - + +void setControlsFrom() +ConsentItemFormData buildFormData() @@ -7785,16 +7687,16 @@ - - + + - + StudyDesignEnrollmentFormView - + +Widget build() -dynamic _showScreenerQuestionSidesheetWithArgs() @@ -7805,16 +7707,16 @@ - - + + - + IScreenerQuestionLogicFormViewModel - + +isDirtyOptionsBannerVisible: bool @@ -7823,23 +7725,23 @@ - - - + + + - + ScreenerQuestionLogicFormView - + +formViewModel: ScreenerQuestionFormViewModel - + +Widget build() -dynamic _buildInfoBanner() @@ -7851,17 +7753,17 @@ - - - + + + - + ScreenerQuestionFormViewModel - + <static>+defaultResponseOptionValidity: bool +responseOptionsDisabledArray: FormArray<dynamic> @@ -7877,7 +7779,7 @@ - + +dynamic onResponseOptionsChanged() +void setControlsFrom() @@ -7892,17 +7794,17 @@ - - - + + + - + ConsentItemFormData - + +consentId: String +title: String @@ -7912,7 +7814,7 @@ - + +ConsentItem toConsentItem() +ConsentItemFormData copy() @@ -7922,16 +7824,16 @@ - - + + - + ConsentItemFormView - + +formViewModel: ConsentItemFormViewModel @@ -7940,17 +7842,17 @@ - - - + + + - + EnrollmentFormData - + <static>+kDefaultEnrollmentType: Participation +enrollmentType: Participation @@ -7960,7 +7862,7 @@ - + +Study apply() +EnrollmentFormData copy() @@ -7970,17 +7872,17 @@ - - - + + + - + QuestionFormViewModel - + <static>+defaultQuestionType: SurveyQuestionType -_titles: Map<FormMode, String Function()>? @@ -8052,7 +7954,7 @@ - + +String? scaleMidLabelAt() -dynamic _onScaleRangeChanged() @@ -8078,17 +7980,17 @@ - - - + + + - + EnrollmentFormViewModel - + +study: Study +router: GoRouter @@ -8107,7 +8009,7 @@ - + +void setControlsFrom() +EnrollmentFormData buildFormData() @@ -8130,17 +8032,17 @@ - - - + + + - + EnrollmentFormConsentItemDelegate - + +formViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData> +owner: EnrollmentFormViewModel @@ -8149,7 +8051,7 @@ - + +void onCancel() +dynamic onSave() @@ -8163,17 +8065,17 @@ - - - + + + - + StudyFormViewModel - + +studyDirtyCopy: Study? +studyRepository: IStudyRepository @@ -8191,7 +8093,7 @@ - + +void read() +void setControlsFrom() @@ -8206,17 +8108,17 @@ - - - + + + - + QuestionFormData - + <static>+questionTypeFormDataFactories: Map<SurveyQuestionType, QuestionFormData Function(Question<dynamic>, List<EligibilityCriterion>)> +questionId: String @@ -8229,7 +8131,7 @@ - + +Question<dynamic> toQuestion() +EligibilityCriterion toEligibilityCriterion() @@ -8242,16 +8144,16 @@ - - + + - + SurveyQuestionType - + +index: int <static>+values: List<SurveyQuestionType> @@ -8267,17 +8169,17 @@ - - - + + + - + ChoiceQuestionFormData - + +isMultipleChoice: bool +answerOptions: List<String> @@ -8285,7 +8187,7 @@ - + +Question<dynamic> toQuestion() +QuestionFormData copy() @@ -8297,24 +8199,24 @@ - - - + + + - + BoolQuestionFormData - + <static>+kResponseOptions: Map<String, bool> +responseOptions: List<String> - + +Question<dynamic> toQuestion() +BoolQuestionFormData copy() @@ -8325,24 +8227,24 @@ - - - + + + - + ImageQuestionFormData - + <static>+kResponseOptions: Map<String, FutureBlobFile> +responseOptions: List<String> - + +Question<dynamic> toQuestion() +ImageQuestionFormData copy() @@ -8353,17 +8255,17 @@ - - - + + + - + AudioQuestionFormData - + +maxRecordingDurationSeconds: int <static>+kResponseOptions: Map<String, FutureBlobFile> @@ -8371,7 +8273,7 @@ - + +Question<dynamic> toQuestion() +AudioQuestionFormData copy() @@ -8382,17 +8284,17 @@ - - - + + + - + ScaleQuestionFormData - + +minValue: double +maxValue: double @@ -8409,7 +8311,7 @@ - + +ScaleQuestion toQuestion() +QuestionFormData copy() @@ -8420,17 +8322,17 @@ - - - + + + - + FreeTextQuestionFormData - + +textLengthRange: List<int> +textType: FreeTextQuestionType @@ -8439,7 +8341,7 @@ - + +Question<dynamic> toQuestion() +FreeTextQuestionFormData copy() @@ -8450,9 +8352,9 @@ - + - + FreeTextQuestionType @@ -8461,23 +8363,23 @@ - - - + + + - + AudioRecordingQuestionFormView - + +formViewModel: QuestionFormViewModel - + +Widget build() @@ -8486,24 +8388,24 @@ - - - + + + - + FreeTextQuestionFormView - + +formViewModel: QuestionFormViewModel +generateLabelHelpTextMap: dynamic - + +Widget build() +Widget disableOnReadonly() @@ -8514,23 +8416,23 @@ - - - + + + - + ImageCapturingQuestionFormView - + +formViewModel: QuestionFormViewModel - + +Widget build() @@ -8539,16 +8441,16 @@ - - + + - + IScaleQuestionFormViewModel - + +isMidValuesClearedInfoVisible: bool @@ -8557,16 +8459,16 @@ - - + + - + ScaleQuestionFormView - + +formViewModel: QuestionFormViewModel @@ -8575,23 +8477,23 @@ - - - + + + - + ChoiceQuestionFormView - + +formViewModel: QuestionFormViewModel - + +Widget build() @@ -8600,23 +8502,23 @@ - - - + + + - + BoolQuestionFormView - + +formViewModel: QuestionFormViewModel - + +Widget build() @@ -8625,16 +8527,16 @@ - - + + - + SurveyQuestionFormView - + +formViewModel: QuestionFormViewModel +isHtmlStyleable: bool @@ -8644,9 +8546,9 @@ - + - + StudyUTimeOfDay @@ -8655,23 +8557,23 @@ - - - + + + - + ScheduleControls - + +formViewModel: WithScheduleControls - + +Widget build() -List<FormTableRow> _conditionalTimeRestrictions() @@ -8681,16 +8583,16 @@ - - + + - + StudiesTableColumnHeader - + +title: String +sortable: bool @@ -8703,16 +8605,16 @@ - - + + - + DashboardScreen - + +filter: StudiesFilter? @@ -8721,16 +8623,16 @@ - - + + - + StudiesFilter - + +index: int <static>+values: List<StudiesFilter> @@ -8740,24 +8642,24 @@ - - - + + + - + DashboardScaffold - + <static>+compactWidthThreshold: double +body: Widget - + +Widget build() @@ -8766,17 +8668,17 @@ - - - + + + - + DashboardController - + +studyRepository: IStudyRepository +authRepository: IAuthRepository @@ -8788,7 +8690,7 @@ - + -dynamic _subscribeStudies() +dynamic setSearchText() @@ -8810,9 +8712,9 @@ - + - + IUserRepository @@ -8821,9 +8723,9 @@ - + - + SearchController @@ -8832,17 +8734,17 @@ - - - + + + - + StudiesTableColumnSize - + +collapsed: bool +flex: int? @@ -8850,7 +8752,7 @@ - + +Widget createContainer() @@ -8859,17 +8761,17 @@ - - - + + + - + StudiesTable - + +itemHeight: double +itemPadding: double @@ -8887,7 +8789,7 @@ - + +Widget build() -Widget _buildColumnHeader() @@ -8897,9 +8799,9 @@ - + - + void Function(Study) @@ -8908,9 +8810,9 @@ - + - + List<ModelAction<dynamic>> Function(Study) @@ -8919,16 +8821,16 @@ - - + + - + StudiesTableColumn - + +index: int <static>+values: List<StudiesTableColumn> @@ -8947,16 +8849,16 @@ - - + + - + StudiesTableItem - + +study: Study +itemHeight: double @@ -8974,9 +8876,9 @@ - + - + void Function(Study, bool)? @@ -8985,9 +8887,9 @@ - + - + void Function(Study)? @@ -8996,9 +8898,9 @@ - + - + App @@ -9007,9 +8909,9 @@ - + - + AppContent @@ -9018,16 +8920,16 @@ - - + + - + AccountSettingsDialog - + +Widget build() diff --git a/docs/uml/designer_v2/lib/uml.svg b/docs/uml/designer_v2/lib/uml.svg index 22e73cd1e..45a13971a 100644 --- a/docs/uml/designer_v2/lib/uml.svg +++ b/docs/uml/designer_v2/lib/uml.svg @@ -1,4 +1,4 @@ - + [Config | <static>+isDebugMode: bool; @@ -10,6 +10,34 @@ <static>+formAutosaveDebounce: int ] + [StudyMonitorData + | + +activeParticipants: int; + +dropoutParticipants: int; + +completedParticipants: int; + +items: List<StudyMonitorItem> + ] + + [StudyMonitorItem + | + +participantId: String; + +inviteCode: String?; + +enrolledAt: DateTime; + +lastActivityAt: DateTime; + +currentDayOfStudy: int; + +studyDurationInDays: int; + +completedInterventions: int; + +missedInterventions: int; + +completedSurveys: int; + +missedSurveys: int; + +droppedOut: bool; + +missedTasksPerDay: List<Set<String>>; + +completedTasksPerDay: List<Set<String>>; + +props: List<Object?> + ] + + [<abstract>Equatable]<:-[StudyMonitorItem] + [<abstract>ResultTypes ] @@ -1513,16 +1541,6 @@ -dynamic _callDelegates() ] - [ParticipantDetailsFormView - | - +formViewModel: ParticipantDetailsFormViewModel - | - +Widget build() - ] - - [ParticipantDetailsFormView]o-[ParticipantDetailsFormViewModel] - [<abstract>FormConsumerWidget]<:-[ParticipantDetailsFormView] - [StudyMonitorScreen | +Widget build(); @@ -1533,26 +1551,6 @@ [<abstract>StudyPageWidget]<:-[StudyMonitorScreen] - [StudyMonitorItem - | - +participantId: String; - +inviteCode: String?; - +enrolledAt: DateTime; - +lastActivityAt: DateTime; - +currentDayOfStudy: int; - +studyDurationInDays: int; - +completedInterventions: int; - +missedInterventions: int; - +completedSurveys: int; - +missedSurveys: int; - +rawData: String; - +props: List<Object?> - | - <static>+List<StudyMonitorItem> fromStudy() - ] - - [<abstract>Equatable]<:-[StudyMonitorItem] - [StudyMonitorTable | +studyMonitorItems: List<StudyMonitorItem>; @@ -1566,21 +1564,18 @@ [StudyMonitorTable]o-[void Function(StudyMonitorItem)] - [ParticipantDetailsFormViewModel + [ParticipantDetailsView | - +participantIdControl: FormControl<String>; - +rawDataControl: FormControl<String>; - +form: FormGroup; - +titles: Map<FormMode, String> + +monitorItem: StudyMonitorItem; + +interventions: List<Intervention>; + +observations: List<Observation> | - +void initControls(); - +StudyMonitorItem buildFormData(); - +void setControlsFrom() + +Widget build(); + -Widget _buildPerDayStatus(); + -String _getTooltipText() ] - [ParticipantDetailsFormViewModel]o-[FormControl] - [ParticipantDetailsFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[ParticipantDetailsFormViewModel] + [ParticipantDetailsView]o-[StudyMonitorItem] [LoginForm | @@ -4396,2274 +4391,2262 @@ - + - - - - - + + + + + + + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - - - - - + + + + + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - + + + - + - + - + - + - + - + - + - - - + + + - + - + - + - + - + - - - + + + - + - + - + - + - + - + - + - + - + - - - + + + - + - - - + + + - + - + - - + + - + - - - + + + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - - - - - + + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - + + + - + - + - - + + - + - + - + - - - - - - - - - - + + + + + + + + + + - + - - - - - - - - + + + + + + + + - + - - - - - - - + + + + + + + - + - - - + + + - + - + - + - + - + - + - + - - - + + + - + - + - + - + - + - + - + - + - + - - - - - + + + + + - + - - - + + + - + - + - - + + - + - + - + - + - + - + - + - - - - - + + + + + - + - + - + - - - - - - - - - + + + + + + + + + - + - - - - - - - - - + + + + + + + + + + + - + - - - - - - - + - + - + - + - + + + - + - - - + + + - + - - - + + + - + - - - + + + - + - - - + - + - - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - - - - - - + - + - - + + - + - + - - + + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - - + + - + - + - + - + - + - + - + - - - + + + - + - + - + - + - - + + - + - - - + + + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - - + + - + - + - + - - + + - + - - - - + + + + - + - - - + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - - - - - - + + + + + + + + + - + - - - + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - - + + + + + - + - + - + - - - - + + + + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - - - + + + - + - + - + - + - + - + - + - - - - - + + + + + - + - - - + + + - + - + - + - + - + - + - + - + - + - + - + - - - - - - - - - + + + + + + + + + - + - + - + - - - + + + - + - - - - - + + + + + - + - + - + - + - + - + - + - + - + - - - - + + + + - + - + - + - + - + - - + + - + - + - + - - - - - + + + + + - + - + - + - - - + + + - + - + - - + + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - - - - + + + + - + - - - + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - - - - - + + + + + - + - - - + + + - + - + - + - + - + - - - + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - - + + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - - + + - + - + - + - + - - + + - + - + - + - + - + - - - - - + + + + + - + - + - + - + - + - + - + - + - - + + - + - + - + - - - + + + - + - - - + + + - + - + - + - + - + - - - - - - + + + + + + - + - + - + - + - + - - - - + + + + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - - + + - + - + - + - - - + + + - + - + - + - - - - - + + + + + - + - - - - - + + + + + - + - + - + - + - + - + - - + + - + - - + + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - + + + + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - - + + - + - + - + - + - + - + - + - + - - + + - + - + - - - - - - - - - - + + + + + + + + + + - + - - - + + + - + - - - + + + - + - - - + + + - + - - - + + + - + - + - - + + - + - - - + + + - + - + - + - - - + + + - + - - - + + + - + - + - + - + - + - + - + - + - + - - + + - + - - + + - + - + - + - + - - + + - + - - - + + + - + - + - + - - - + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - - + + - + - - + + - + - + - + - + - + - + - + - + - + - - + + - + - - + + - + - + - + - + - + - - + + - + - - + + - + - + - + - + - + - + - + - - + + - + - - + + - + - + - + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - - + + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - - + + - + - + - + - - - + + + - + - + - + - + - + - + - + - + - - - - + + + + - + - + - - + + - + - + - + - + - + - + - - + + - + - + - + - - - - - - - - - - + + + + + + + + + + - - + + - + Config - + <static>+isDebugMode: bool <static>+defaultLocale: Set<String> @@ -6676,11 +6659,74 @@ + + + + + + + + StudyMonitorData + + + + + + +activeParticipants: int + +dropoutParticipants: int + +completedParticipants: int + +items: List<StudyMonitorItem> + + + + + + + + + + + + StudyMonitorItem + + + + + + +participantId: String + +inviteCode: String? + +enrolledAt: DateTime + +lastActivityAt: DateTime + +currentDayOfStudy: int + +studyDurationInDays: int + +completedInterventions: int + +missedInterventions: int + +completedSurveys: int + +missedSurveys: int + +droppedOut: bool + +missedTasksPerDay: List<Set<String>> + +completedTasksPerDay: List<Set<String>> + +props: List<Object?> + + + + + + + + + + + Equatable + + + + - + - + ResultTypes @@ -6689,16 +6735,16 @@ - - + + - + MeasurementResultTypes - + <static>+questionnaire: String <static>+values: List<String> @@ -6708,16 +6754,16 @@ - - + + - + InterventionResultTypes - + <static>+checkmarkTask: String <static>+values: List<String> @@ -6727,16 +6773,16 @@ - - + + - + StudyExportData - + +study: Study +measurementsData: List<Map<String, dynamic>> @@ -6749,9 +6795,9 @@ - + - + Study @@ -6760,23 +6806,23 @@ - - - + + + - + StudyTemplates - + <static>+kUnnamedStudyTitle: String - + <static>+Study emptyDraft() @@ -6785,16 +6831,16 @@ - - + + - + StudyActionType - + +index: int <static>+values: List<StudyActionType> @@ -6812,9 +6858,9 @@ - + - + Enum @@ -6823,16 +6869,16 @@ - - + + - + Notifications - + <static>+credentialsInvalid: SnackbarIntent <static>+userAlreadyRegistered: SnackbarIntent @@ -6848,16 +6894,16 @@ - - + + - + SnackbarIntent - + +duration: int? @@ -6866,16 +6912,16 @@ - - + + - + AlertIntent - + +title: String +dismissOnAction: bool @@ -6886,16 +6932,16 @@ - - + + - + NotificationDefaultActions - + <static>+cancel: NotificationAction @@ -6904,16 +6950,16 @@ - - + + - + NotificationAction - + +label: String +onSelect: dynamic Function() @@ -6924,16 +6970,16 @@ - - + + - + INotificationService - + +void showMessage() +void show() @@ -6945,23 +6991,23 @@ - - - + + + - + NotificationService - + -_streamController: BehaviorSubject<NotificationIntent> - + +Stream<NotificationIntent> watchNotifications() +void showMessage() @@ -6973,9 +7019,9 @@ - + - + BehaviorSubject @@ -6984,17 +7030,17 @@ - - - + + + - + NotificationIntent - + +message: String? +customContent: Widget? @@ -7004,7 +7050,7 @@ - + +void register() @@ -7013,9 +7059,9 @@ - + - + Widget @@ -7024,9 +7070,9 @@ - + - + IconData @@ -7035,16 +7081,16 @@ - - + + - + NotificationType - + +index: int <static>+values: List<NotificationType> @@ -7057,9 +7103,9 @@ - + - + dynamic Function() @@ -7068,16 +7114,16 @@ - - + + - + IClipboardService - + +dynamic copy() @@ -7086,16 +7132,16 @@ - - + + - + ClipboardService - + +dynamic copy() @@ -7104,16 +7150,16 @@ - - + + - + NotificationDispatcher - + +child: Widget? +snackbarInnerPadding: double @@ -7126,9 +7172,9 @@ - + - + SnackBarBehavior @@ -7137,16 +7183,16 @@ - - + + - + Assets - + <static>+logoWide: String @@ -7155,17 +7201,17 @@ - - - + + + - + AsyncValueWidget - + +value: AsyncValue<T> +data: Widget Function(T) @@ -7175,7 +7221,7 @@ - + +Widget build() -Widget _buildDataOrEmptyWidget() @@ -7187,9 +7233,9 @@ - + - + AsyncValue @@ -7198,9 +7244,9 @@ - + - + Widget Function(T) @@ -7209,9 +7255,9 @@ - + - + Widget Function(Object, StackTrace?)? @@ -7220,9 +7266,9 @@ - + - + Widget Function()? @@ -7231,17 +7277,17 @@ - - - + + + - + FormControlLabel - + +formControl: AbstractControl<dynamic> +text: String @@ -7251,7 +7297,7 @@ - + +Widget build() @@ -7260,9 +7306,9 @@ - + - + AbstractControl @@ -7271,9 +7317,9 @@ - + - + TextStyle @@ -7282,9 +7328,9 @@ - + - + void Function(AbstractControl<dynamic>)? @@ -7293,17 +7339,17 @@ - - - + + + - + ActionPopUpMenuButton - + +actions: List<ModelAction<dynamic>> +triggerIconColor: Color? @@ -7319,7 +7365,7 @@ - + +Widget build() -Widget _buildPopupMenu() @@ -7329,9 +7375,9 @@ - + - + Color @@ -7340,9 +7386,9 @@ - + - + Axis @@ -7351,9 +7397,9 @@ - + - + PopupMenuPosition @@ -7362,16 +7408,16 @@ - - + + - + Search - + +onQueryChanged: dynamic Function(String) +searchController: SearchController? @@ -7383,9 +7429,9 @@ - + - + dynamic Function(String) @@ -7394,16 +7440,16 @@ - - + + - + SearchController - + +setText: void Function(String) @@ -7412,9 +7458,9 @@ - + - + void Function(String) @@ -7423,16 +7469,16 @@ - - + + - + FormScaffold - + +formViewModel: T +actions: List<Widget>? @@ -7446,17 +7492,17 @@ - - - + + + - + ConstrainedWidthFlexible - + +minWidth: double +maxWidth: double @@ -7467,7 +7513,7 @@ - + +Widget build() -double _getWidth() @@ -7477,9 +7523,9 @@ - + - + BoxConstraints @@ -7488,16 +7534,16 @@ - - + + - + PrimaryButton - + +text: String +icon: IconData? @@ -7517,9 +7563,9 @@ - + - + void Function()? @@ -7528,9 +7574,9 @@ - + - + dynamic Function()? @@ -7539,9 +7585,9 @@ - + - + EdgeInsets @@ -7550,9 +7596,9 @@ - + - + Size @@ -7561,16 +7607,16 @@ - - + + - + FormTableRow - + +label: String? +labelBuilder: Widget Function(BuildContext)? @@ -7585,9 +7631,9 @@ - + - + Widget Function(BuildContext)? @@ -7596,16 +7642,16 @@ - - + + - + FormTableRowLayout - + +index: int <static>+values: List<FormTableRowLayout> @@ -7617,17 +7663,17 @@ - - - + + + - + FormTableLayout - + +rows: List<FormTableRow> +columnWidths: Map<int, TableColumnWidth> @@ -7637,7 +7683,7 @@ - + +Widget build() @@ -7646,17 +7692,17 @@ - - - + + + - + FormSectionHeader - + +title: String +titleTextStyle: TextStyle? @@ -7666,7 +7712,7 @@ - + +Widget build() @@ -7675,17 +7721,17 @@ - - - + + + - + FormLabel - + +labelText: String? +helpText: String? @@ -7694,7 +7740,7 @@ - + +Widget build() @@ -7703,24 +7749,24 @@ - - - + + + - + DismissButton - + +onPressed: void Function()? +text: String? - + +Widget build() @@ -7729,17 +7775,17 @@ - - - + + + - + Badge - + +icon: IconData? +color: Color? @@ -7753,7 +7799,7 @@ - + +Widget build() -Color? _getBackgroundColor() @@ -7765,16 +7811,16 @@ - - + + - + BadgeType - + +index: int <static>+values: List<BadgeType> @@ -7788,17 +7834,17 @@ - - - + + + - + StandardDialog - + +title: Widget? +titleText: String? @@ -7816,7 +7862,7 @@ - + +Widget build() @@ -7825,16 +7871,16 @@ - - + + - + ISyncIndicatorViewModel - + +isDirty: bool +lastSynced: DateTime? @@ -7844,16 +7890,16 @@ - - + + - + SyncIndicator - + +state: AsyncValue<T> +lastSynced: DateTime? @@ -7866,16 +7912,16 @@ - - + + - + IWithBanner - + +Widget? banner() @@ -7884,16 +7930,16 @@ - - + + - + BannerBox - + +prefixIcon: Widget? +body: Widget @@ -7910,16 +7956,16 @@ - - + + - + BannerStyle - + +index: int <static>+values: List<BannerStyle> @@ -7932,17 +7978,17 @@ - - - + + + - + ActionMenuInline - + +actions: List<ModelAction<dynamic>> +iconSize: double? @@ -7953,7 +7999,7 @@ - + +Widget build() @@ -7962,16 +8008,16 @@ - - + + - + Collapsible - + +contentBuilder: Widget Function(BuildContext, bool) +headerBuilder: Widget Function(BuildContext, bool)? @@ -7983,9 +8029,9 @@ - + - + Widget Function(BuildContext, bool) @@ -7994,9 +8040,9 @@ - + - + Widget Function(BuildContext, bool)? @@ -8005,16 +8051,16 @@ - - + + - + NavbarTab - + +title: String +intent: RoutingIntent? @@ -8026,17 +8072,17 @@ - - - + + + - + RoutingIntent - + +route: GoRoute +params: Map<String, String> @@ -8049,7 +8095,7 @@ - + -dynamic _validateRoute() +bool matches() @@ -8059,16 +8105,16 @@ - - + + - + TabbedNavbar - + +tabs: List<T> +selectedTab: T? @@ -8090,9 +8136,9 @@ - + - + BoxDecoration @@ -8101,9 +8147,9 @@ - + - + void Function(int, T)? @@ -8112,9 +8158,9 @@ - + - + TabBarIndicatorSize @@ -8123,16 +8169,16 @@ - - + + - + SidesheetTab - + +builder: Widget Function(BuildContext) @@ -8141,9 +8187,9 @@ - + - + Widget Function(BuildContext) @@ -8152,16 +8198,16 @@ - - + + - + Sidesheet - + <static>+kDefaultWidth: double +titleText: String @@ -8180,9 +8226,9 @@ - + - + Widget Function(Widget)? @@ -8191,16 +8237,16 @@ - - + + - + FormSideSheetTab - + +formViewBuilder: Widget Function(T) @@ -8209,23 +8255,23 @@ - - - + + + - + HelpIcon - + +tooltipText: String? - + +Widget build() @@ -8234,17 +8280,17 @@ - - - + + + - + EmptyBody - + +icon: IconData? +leading: Widget? @@ -8255,7 +8301,7 @@ - + +Widget build() @@ -8264,17 +8310,17 @@ - - - + + + - + IndicatorRangeSliderThumbShape - + +buildContext: BuildContext +start: T @@ -8282,7 +8328,7 @@ - + +Size getPreferredSize() +void paint() @@ -8292,9 +8338,9 @@ - + - + BuildContext @@ -8303,9 +8349,9 @@ - + - + RangeSliderThumbShape @@ -8314,16 +8360,16 @@ - - + + - + MouseEventsRegion - + +onTap: void Function()? +onHover: void Function(PointerHoverEvent)? @@ -8339,9 +8385,9 @@ - + - + void Function(PointerHoverEvent)? @@ -8350,9 +8396,9 @@ - + - + void Function(PointerEnterEvent)? @@ -8361,9 +8407,9 @@ - + - + void Function(PointerExitEvent)? @@ -8372,9 +8418,9 @@ - + - + SystemMouseCursor @@ -8383,9 +8429,9 @@ - + - + ReactiveCustomColorPicker @@ -8394,9 +8440,9 @@ - + - + ReactiveFormField @@ -8405,17 +8451,17 @@ - - - + + + - + TextParagraph - + +text: String? +style: TextStyle? @@ -8424,7 +8470,7 @@ - + +Widget build() @@ -8433,16 +8479,16 @@ - - + + - + UnderConstruction - + +Widget build() @@ -8451,9 +8497,9 @@ - + - + NullHelperDecoration @@ -8462,9 +8508,9 @@ - + - + InputDecoration @@ -8473,16 +8519,16 @@ - - + + - + ActionMenuType - + +index: int <static>+values: List<ActionMenuType> @@ -8494,24 +8540,24 @@ - - - + + + - + HtmlStylingBanner - + +isDismissed: bool +onDismissed: dynamic Function()? - + +Widget build() @@ -8520,16 +8566,16 @@ - - + + - + FormConsumerWidget - + +Widget build() @@ -8538,16 +8584,16 @@ - - + + - + FormConsumerRefWidget - + +Widget build() @@ -8556,16 +8602,16 @@ - - + + - + SplashPage - + +Widget build() @@ -8574,23 +8620,23 @@ - - - + + + - + ErrorPage - + +error: Exception? - + +Widget build() @@ -8599,9 +8645,9 @@ - + - + ConsumerWidget @@ -8610,23 +8656,23 @@ - - - + + + - + StudyULogo - + +onTap: void Function()? - + +Widget build() @@ -8635,17 +8681,17 @@ - - - + + + - + SingleColumnLayout - + <static>+defaultConstraints: BoxConstraints <static>+defaultConstraintsNarrow: BoxConstraints @@ -8658,7 +8704,7 @@ - + <static>+dynamic fromType() @@ -8667,16 +8713,16 @@ - - + + - + SingleColumnLayoutType - + +index: int <static>+values: List<SingleColumnLayoutType> @@ -8690,16 +8736,16 @@ - - + + - + Hyperlink - + +text: String +url: String? @@ -8718,16 +8764,16 @@ - - + + - + StandardTableColumn - + +label: String +tooltip: String? @@ -8741,9 +8787,9 @@ - + - + TableColumnWidth @@ -8752,16 +8798,16 @@ - - + + - + StandardTable - + +items: List<T> +inputColumns: List<StandardTableColumn> @@ -8793,9 +8839,9 @@ - + - + void Function(T) @@ -8804,9 +8850,9 @@ - + - + List<ModelAction<dynamic>> Function(T, int)? @@ -8815,9 +8861,9 @@ - + - + int Function(T, T)? @@ -8826,9 +8872,9 @@ - + - + TableRow Function(BuildContext, List<StandardTableColumn>)? @@ -8837,16 +8883,16 @@ - - + + - + StandardTableStyle - + +index: int <static>+values: List<StandardTableStyle> @@ -8858,24 +8904,24 @@ - - - + + + - + IconPack - + <static>+defaultPack: List<IconOption> <static>+material: List<IconOption> - + <static>+IconOption? resolveIconByName() @@ -8884,17 +8930,17 @@ - - - + + + - + IconOption - + +name: String +icon: IconData? @@ -8903,7 +8949,7 @@ - + +String toJson() <static>+IconOption fromJson() @@ -8911,22 +8957,11 @@ - - - - - - - Equatable - - - - - + - + ReactiveIconPicker @@ -8935,9 +8970,9 @@ - + - + ReactiveFocusableFormField @@ -8946,17 +8981,17 @@ - - - + + + - + IconPicker - + +iconOptions: List<IconOption> +selectedOption: IconOption? @@ -8968,7 +9003,7 @@ - + +Widget build() @@ -8977,9 +9012,9 @@ - + - + void Function(IconOption)? @@ -8988,9 +9023,9 @@ - + - + FocusNode @@ -8999,17 +9034,17 @@ - - - + + + - + IconPickerField - + +iconOptions: List<IconOption> +selectedOption: IconOption? @@ -9021,7 +9056,7 @@ - + +Widget build() @@ -9030,17 +9065,17 @@ - - - + + + - + IconPickerGallery - + +iconOptions: List<IconOption> +onSelect: void Function(IconOption)? @@ -9048,7 +9083,7 @@ - + +Widget build() @@ -9057,17 +9092,17 @@ - - - + + + - + SecondaryButton - + +text: String +icon: IconData? @@ -9076,7 +9111,7 @@ - + +Widget build() @@ -9085,16 +9120,16 @@ - - + + - + TwoColumnLayout - + <static>+defaultDivider: VerticalDivider <static>+defaultContentPadding: EdgeInsets @@ -9120,9 +9155,9 @@ - + - + VerticalDivider @@ -9131,16 +9166,16 @@ - - + + - + AppTranslation - + <static>+dynamic init() @@ -9149,16 +9184,16 @@ - - + + - + PlatformLocale - + +Locale getPlatformLocale() @@ -9167,16 +9202,16 @@ - - + + - + PlatformLocaleWeb - + +Locale getPlatformLocale() @@ -9185,16 +9220,16 @@ - - + + - + PlatformLocaleMobile - + +Locale getPlatformLocale() @@ -9203,16 +9238,16 @@ - - + + - + LanguagePicker - + +languagePickerType: LanguagePickerType +iconColor: Color? @@ -9223,16 +9258,16 @@ - - + + - + LanguagePickerType - + +index: int <static>+values: List<LanguagePickerType> @@ -9244,9 +9279,9 @@ - + - + Offset @@ -9255,16 +9290,16 @@ - - + + - + GoRouteParamEnum - + +String toRouteParam() +String toShortString() @@ -9274,16 +9309,16 @@ - - + + - + RoutingIntents - + <static>+root: RoutingIntent <static>+studies: RoutingIntent @@ -9317,9 +9352,9 @@ - + - + RoutingIntent Function(String) @@ -9328,9 +9363,9 @@ - + - + RoutingIntent Function(String, String) @@ -9339,9 +9374,9 @@ - + - + RoutingIntent Function(String, {String? appRoute}) @@ -9350,9 +9385,9 @@ - + - + RoutingIntent Function(Exception) @@ -9361,9 +9396,9 @@ - + - + GoRoute @@ -9372,16 +9407,16 @@ - - + + - + RoutingIntentDispatch - + +index: int <static>+values: List<RoutingIntentDispatch> @@ -9393,16 +9428,16 @@ - - + + - + RouterKeys - + <static>+studyKey: ValueKey<String> <static>+authKey: ValueKey<String> @@ -9412,9 +9447,9 @@ - + - + ValueKey @@ -9423,16 +9458,16 @@ - - + + - + RouteParams - + <static>+studiesFilter: String <static>+studyId: String @@ -9445,17 +9480,17 @@ - - - + + + - + RouterConf - + <static>+router: GoRouter <static>+routes: List<GoRoute> @@ -9464,7 +9499,7 @@ - + <static>+GoRoute route() @@ -9473,9 +9508,9 @@ - + - + GoRouter @@ -9484,16 +9519,16 @@ - - + + - + StudyFormRouteArgs - + +studyId: String @@ -9502,16 +9537,16 @@ - - + + - + QuestionFormRouteArgs - + +questionId: String @@ -9520,9 +9555,9 @@ - + - + ScreenerQuestionFormRouteArgs @@ -9531,16 +9566,16 @@ - - + + - + ConsentItemFormRouteArgs - + +consentId: String @@ -9549,16 +9584,16 @@ - - + + - + MeasurementFormRouteArgs - + +measurementId: String @@ -9567,16 +9602,16 @@ - - + + - + SurveyQuestionFormRouteArgs - + +questionId: String @@ -9585,16 +9620,16 @@ - - + + - + InterventionFormRouteArgs - + +interventionId: String @@ -9603,16 +9638,16 @@ - - + + - + InterventionTaskFormRouteArgs - + +taskId: String @@ -9621,16 +9656,16 @@ - - + + - + ReportItemFormRouteArgs - + +sectionId: String @@ -9639,16 +9674,16 @@ - - + + - + DropdownMenuItemTheme - + +iconTheme: IconThemeData? @@ -9657,9 +9692,9 @@ - + - + IconThemeData @@ -9668,9 +9703,9 @@ - + - + Diagnosticable @@ -9679,17 +9714,17 @@ - - - + + + - + ThemeConfig - + <static>+kMinContentWidth: double <static>+kMaxContentWidth: double @@ -9698,7 +9733,7 @@ - + <static>+dynamic bodyBackgroundColor() <static>+Color modalBarrierColor() @@ -9716,16 +9751,16 @@ - - + + - + NoAnimationPageTransitionsBuilder - + +Widget buildTransitions() @@ -9734,9 +9769,9 @@ - + - + PageTransitionsBuilder @@ -9745,16 +9780,16 @@ - - + + - + WebTransitionBuilder - + +Widget buildTransitions() @@ -9763,16 +9798,16 @@ - - + + - + ThemeSettingChange - + +settings: ThemeSettings @@ -9781,16 +9816,16 @@ - - + + - + ThemeSettings - + +sourceColor: Color +themeMode: ThemeMode @@ -9800,9 +9835,9 @@ - + - + Notification @@ -9811,17 +9846,17 @@ - - - + + + - + ThemeProvider - + +settings: ValueNotifier<ThemeSettings> +lightDynamic: ColorScheme? @@ -9831,7 +9866,7 @@ - + +Color custom() +Color blend() @@ -9866,9 +9901,9 @@ - + - + ValueNotifier @@ -9877,9 +9912,9 @@ - + - + ColorScheme @@ -9888,9 +9923,9 @@ - + - + PageTransitionsTheme @@ -9899,9 +9934,9 @@ - + - + ShapeBorder @@ -9910,9 +9945,9 @@ - + - + InheritedWidget @@ -9921,9 +9956,9 @@ - + - + ThemeMode @@ -9932,17 +9967,17 @@ - - - + + + - + CustomColor - + +name: String +color: Color @@ -9950,7 +9985,7 @@ - + +Color value() @@ -9959,17 +9994,17 @@ - - - + + + - + SuppressedBehaviorSubject - + +subject: BehaviorSubject<T> +didSuppressInitialEvent: bool @@ -9977,7 +10012,7 @@ - + -StreamController<T> _buildDerivedController() +dynamic close() @@ -9987,9 +10022,9 @@ - + - + StreamController @@ -9998,16 +10033,16 @@ - - + + - + Time - + <static>+dynamic fromTimeOfDay() +Map<String, dynamic> toJson() @@ -10018,9 +10053,9 @@ - + - + TimeOfDay @@ -10029,16 +10064,16 @@ - - + + - + TimeValueAccessor - + +String modelToViewValue() +Time? viewToModelValue() @@ -10049,9 +10084,9 @@ - + - + ControlValueAccessor @@ -10060,16 +10095,16 @@ - - + + - + ModelAction - + +type: T +label: String @@ -10083,16 +10118,16 @@ - - + + - + IModelActionProvider - + +List<ModelAction<dynamic>> availableActions() @@ -10101,16 +10136,16 @@ - - + + - + IListActionProvider - + +void onSelectItem() +void onNewItem() @@ -10120,16 +10155,16 @@ - - + + - + ModelActionType - + +index: int <static>+values: List<ModelActionType> @@ -10145,17 +10180,17 @@ - - - + + + - + OptimisticUpdate - + +applyOptimistic: void Function() +apply: dynamic Function() @@ -10168,7 +10203,7 @@ - + +dynamic execute() -void _runUpdateHandlerIfAny() @@ -10178,9 +10213,9 @@ - + - + void Function() @@ -10189,9 +10224,9 @@ - + - + void Function(Object, StackTrace?)? @@ -10200,16 +10235,16 @@ - - + + - + FileFormatEncoder - + +dynamic encodeAsync() +String encode() @@ -10220,16 +10255,16 @@ - - + + - + CSVStringEncoder - + +String encode() @@ -10238,16 +10273,16 @@ - - + + - + JsonStringEncoder - + +String encode() @@ -10256,24 +10291,24 @@ - - - + + + - + ExecutionLimiter - + +milliseconds: int <static>-_timer: Timer? - + +void dispose() @@ -10282,9 +10317,9 @@ - + - + Timer @@ -10293,17 +10328,17 @@ - - - + + + - + Debouncer - + +leading: bool +cancelUncompleted: bool @@ -10311,7 +10346,7 @@ - + +dynamic call() @@ -10320,9 +10355,9 @@ - + - + CancelableOperation @@ -10331,16 +10366,16 @@ - - + + - + Throttler - + +dynamic call() @@ -10349,16 +10384,16 @@ - - + + - + SerializableColor - + +Map<String, dynamic> toJson() <static>+SerializableColor fromJson() @@ -10368,16 +10403,16 @@ - - + + - + IProviderArgsResolver - + +R provide() @@ -10386,23 +10421,23 @@ - - - + + + - + CombinedStreamNotifier - + -_subscriptions: List<StreamSubscription<dynamic>> - + +void dispose() @@ -10411,9 +10446,9 @@ - + - + ChangeNotifier @@ -10422,17 +10457,17 @@ - - - + + + - + CountWhereValidator - + +predicate: bool Function(T?) +minCount: int? @@ -10442,7 +10477,7 @@ - + +Map<String, dynamic>? validate() @@ -10451,9 +10486,9 @@ - + - + bool Function(T?) @@ -10462,9 +10497,9 @@ - + - + Validator @@ -10473,16 +10508,16 @@ - - + + - + Patterns - + <static>+timeFormatString: String <static>+emailFormatString: String @@ -10493,24 +10528,24 @@ - - - + + + - + NumericalRangeFormatter - + +min: int? +max: int? - + +TextEditingValue formatEditUpdate() @@ -10519,9 +10554,9 @@ - + - + TextInputFormatter @@ -10530,16 +10565,16 @@ - - + + - + StudySequenceFormatter - + +TextEditingValue formatEditUpdate() @@ -10548,17 +10583,17 @@ - - - + + + - + Tuple - + +first: T1 +second: T2 @@ -10566,7 +10601,7 @@ - + +Map<String, dynamic> toJson() <static>+Tuple<dynamic, dynamic> fromJson() @@ -10578,23 +10613,23 @@ - - - + + + - + JsonFileLoader - + +jsonAssetsPath: String - + +dynamic loadJson() +dynamic parseJsonMapFromAssets() @@ -10605,16 +10640,16 @@ - - + + - + IAppDelegate - + +dynamic onAppStart() @@ -10623,17 +10658,17 @@ - - - + + + - + AppController - + +appDelegates: List<IAppDelegate> -_delayedFuture: dynamic @@ -10641,7 +10676,7 @@ - + +dynamic onAppStart() -dynamic _callDelegates() @@ -10649,73 +10684,18 @@ - - - - - - - - - ParticipantDetailsFormView - - - - - - +formViewModel: ParticipantDetailsFormViewModel - - - - - - +Widget build() - - - - - - - - - - - - - ParticipantDetailsFormViewModel - - - - - - +participantIdControl: FormControl<String> - +rawDataControl: FormControl<String> - +form: FormGroup - +titles: Map<FormMode, String> - - - - - - +void initControls() - +StudyMonitorItem buildFormData() - +void setControlsFrom() - - - - - - + + - + StudyMonitorScreen - + +Widget build() -Widget _monitorSectionHeader() @@ -10727,85 +10707,49 @@ - - - + + + - + StudyPageWidget - + +studyId: String - + +Widget? banner() - - - - - - - - - StudyMonitorItem - - - - - - +participantId: String - +inviteCode: String? - +enrolledAt: DateTime - +lastActivityAt: DateTime - +currentDayOfStudy: int - +studyDurationInDays: int - +completedInterventions: int - +missedInterventions: int - +completedSurveys: int - +missedSurveys: int - +rawData: String - +props: List<Object?> - - - - - - <static>+List<StudyMonitorItem> fromStudy() - - - - - - - + + + - + StudyMonitorTable - + +studyMonitorItems: List<StudyMonitorItem> +onSelectItem: void Function(StudyMonitorItem) - + +Widget build() -List<Widget> _buildRow() @@ -10817,117 +10761,63 @@ - + - + void Function(StudyMonitorItem) - - - + + + + + - - - FormControl + + + ParticipantDetailsView - - - - - - - - FormGroup + + + +monitorItem: StudyMonitorItem + +interventions: List<Intervention> + +observations: List<Observation> - - - - - - - - - - FormViewModel - - - - - - -_formData: T? - -_formMode: FormMode - -_validationSet: FormValidationSetEnum? - +delegate: IFormViewModelDelegate<FormViewModel<dynamic>>? - +autosave: bool - -_immediateFormChildrenSubscriptions: List<StreamSubscription<dynamic>> - -_immediateFormChildrenListenerDebouncer: Debouncer? - -_autosaveOperation: CancelableOperation<dynamic>? - -_defaultControlValidators: Map<String, Tuple<List<Validator<dynamic>>, List<AsyncValidator<dynamic>>>> - +prevFormValue: Map<String, dynamic>? - <static>-_formKey: String - +formData: T? - +formMode: FormMode - +isReadonly: bool - +validationSet: FormValidationSetEnum? - +isDirty: bool - +title: String - +isValid: bool - +titles: Map<FormMode, String> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - - - - - - -dynamic _setFormData() - -dynamic _rememberDefaultControlValidators() - -Tuple<List<Validator<dynamic>>, List<AsyncValidator<dynamic>>>? _getDefaultValidators() - -dynamic _disableAllControls() - -dynamic _formModeUpdated() - -dynamic _restoreControlsFromFormData() - +void revalidate() - -void _applyValidationSet() - +void read() - +dynamic save() - +dynamic cancel() - +void enableAutosave() - +void listenToImmediateFormChildren() - +dynamic markFormGroupChanged() - +void dispose() - +void setControlsFrom() - +T buildFormData() - +void initControls() + + + +Widget build() + -Widget _buildPerDayStatus() + -String _getTooltipText() - - - + + + - + LoginForm - + +formKey: AuthFormKey - + +Widget build() @@ -10936,16 +10826,16 @@ - - + + - + AuthFormKey - + +index: int <static>+values: List<AuthFormKey> @@ -10961,23 +10851,23 @@ - - - + + + - + PasswordRecoveryForm - + +formKey: AuthFormKey - + +Widget build() @@ -10986,23 +10876,23 @@ - - - + + + - + PasswordForgotForm - + +formKey: AuthFormKey - + +Widget build() @@ -11011,23 +10901,23 @@ - - - + + + - + SignupForm - + +formKey: AuthFormKey - + +Widget build() -dynamic _onClickTermsOfUse() @@ -11038,16 +10928,16 @@ - - + + - + AuthScaffold - + +body: Widget +formKey: AuthFormKey @@ -11060,16 +10950,16 @@ - - + + - + EmailTextField - + +labelText: String +hintText: String? @@ -11079,18 +10969,29 @@ + + + + + + + FormControl + + + + - - + + - + PasswordTextField - + +labelText: String +hintText: String? @@ -11103,9 +11004,9 @@ - + - + dynamic Function(FormControl<dynamic>)? @@ -11114,16 +11015,16 @@ - - + + - + StudyUJobsToBeDone - + +Widget build() @@ -11132,17 +11033,17 @@ - - - + + + - + AuthFormController - + +authRepository: IAuthRepository +notificationService: INotificationService @@ -11163,7 +11064,7 @@ - + -dynamic _getFormFor() -dynamic _onChangeFormKey() @@ -11185,17 +11086,17 @@ - - - + + + - + IAuthRepository - + +allowPasswordReset: bool +currentUser: User? @@ -11205,7 +11106,7 @@ - + +dynamic signUp() +dynamic signInWith() @@ -11217,18 +11118,29 @@ + + + + + + + FormGroup + + + + - - + + - + IFormGroupController - + +form: FormGroup @@ -11237,16 +11149,16 @@ - - + + - + AppStatus - + +index: int <static>+values: List<AppStatus> @@ -11258,17 +11170,17 @@ - - - + + + - + FormArrayTable - + +control: AbstractControl<dynamic> +items: List<T> @@ -11292,7 +11204,7 @@ - + +Widget build() -List<Widget> _buildRow() @@ -11303,9 +11215,9 @@ - + - + List<ModelAction<dynamic>> Function(T, int) @@ -11314,9 +11226,9 @@ - + - + String Function(T) @@ -11325,9 +11237,9 @@ - + - + Widget Function(BuildContext, T, int)? @@ -11336,27 +11248,88 @@ - - + + - + ManagedFormViewModel - + +ManagedFormViewModel<T> createDuplicate() + + + + + + + + + FormViewModel + + + + + + -_formData: T? + -_formMode: FormMode + -_validationSet: FormValidationSetEnum? + +delegate: IFormViewModelDelegate<FormViewModel<dynamic>>? + +autosave: bool + -_immediateFormChildrenSubscriptions: List<StreamSubscription<dynamic>> + -_immediateFormChildrenListenerDebouncer: Debouncer? + -_autosaveOperation: CancelableOperation<dynamic>? + -_defaultControlValidators: Map<String, Tuple<List<Validator<dynamic>>, List<AsyncValidator<dynamic>>>> + +prevFormValue: Map<String, dynamic>? + <static>-_formKey: String + +formData: T? + +formMode: FormMode + +isReadonly: bool + +validationSet: FormValidationSetEnum? + +isDirty: bool + +title: String + +isValid: bool + +titles: Map<FormMode, String> + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + + + + + + -dynamic _setFormData() + -dynamic _rememberDefaultControlValidators() + -Tuple<List<Validator<dynamic>>, List<AsyncValidator<dynamic>>>? _getDefaultValidators() + -dynamic _disableAllControls() + -dynamic _formModeUpdated() + -dynamic _restoreControlsFromFormData() + +void revalidate() + -void _applyValidationSet() + +void read() + +dynamic save() + +dynamic cancel() + +void enableAutosave() + +void listenToImmediateFormChildren() + +dynamic markFormGroupChanged() + +void dispose() + +void setControlsFrom() + +T buildFormData() + +void initControls() + + + + - + - + FormViewModelNotFoundException @@ -11365,9 +11338,9 @@ - + - + Exception @@ -11376,17 +11349,17 @@ - - - + + + - + FormViewModelCollection - + +formViewModels: List<T> +formArray: FormArray<dynamic> @@ -11396,7 +11369,7 @@ - + +void add() +T remove() @@ -11413,9 +11386,9 @@ - + - + FormArray @@ -11424,17 +11397,17 @@ - - - + + + - + CustomFormControl - + -_onValueChangedDebouncer: Debouncer? -_onStatusChangedDebouncer: Debouncer? @@ -11445,7 +11418,7 @@ - + +void dispose() @@ -11454,9 +11427,9 @@ - + - + void Function(T?)? @@ -11465,9 +11438,9 @@ - + - + void Function(ControlStatus)? @@ -11476,16 +11449,16 @@ - - + + - + UnsavedChangesDialog - + +Widget build() @@ -11494,9 +11467,9 @@ - + - + FormValidationSetEnum @@ -11505,17 +11478,17 @@ - - - + + + - + FormControlValidation - + +control: AbstractControl<dynamic> +validators: List<Validator<dynamic>> @@ -11524,7 +11497,7 @@ - + +FormControlValidation merge() @@ -11533,23 +11506,23 @@ - - - + + + - + IFormData - + +id: String - + +IFormData copy() @@ -11558,9 +11531,9 @@ - + - + FormInvalidException @@ -11569,16 +11542,16 @@ - - + + - + FormConfigException - + +message: String? @@ -11587,16 +11560,16 @@ - - + + - + IFormViewModelDelegate - + +dynamic onSave() +void onCancel() @@ -11606,16 +11579,16 @@ - - + + - + FormControlOption - + +value: T +label: String @@ -11627,16 +11600,16 @@ - - + + - + FormMode - + +index: int <static>+values: List<FormMode> @@ -11649,23 +11622,23 @@ - - - + + + - + EnrolledBadge - + +enrolledCount: int - + +Widget build() @@ -11674,24 +11647,24 @@ - - - + + + - + StudyRecruitController - + +inviteCodeRepository: IInviteCodeRepository -_invitesSubscription: StreamSubscription<List<WrappedModel<StudyInvite>>>? - + -dynamic _subscribeInvites() +Intervention? getIntervention() @@ -11705,16 +11678,16 @@ - - + + - + IInviteCodeRepository - + +dynamic isCodeAlreadyUsed() @@ -11723,9 +11696,9 @@ - + - + StreamSubscription @@ -11734,17 +11707,17 @@ - - - + + + - + StudyBaseController - + +studyId: String +studyRepository: IStudyRepository @@ -11753,7 +11726,7 @@ - + +dynamic subscribeStudy() +dynamic onStudySubscriptionUpdate() @@ -11765,16 +11738,16 @@ - - + + - + StudyRecruitScreen - + +Widget build() -Widget _inviteCodesSectionHeader() @@ -11786,23 +11759,23 @@ - - - + + + - + InviteCodeFormView - + +formViewModel: InviteCodeFormViewModel - + +Widget build() -List<FormTableRow> _conditionalInterventionRows() @@ -11812,17 +11785,17 @@ - - - + + + - + InviteCodeFormViewModel - + +study: Study +inviteCodeRepository: IInviteCodeRepository @@ -11841,7 +11814,7 @@ - + +void initControls() -dynamic _uniqueInviteCode() @@ -11856,17 +11829,17 @@ - - - + + + - + StudyInvitesTable - + +invites: List<StudyInvite> +onSelect: void Function(StudyInvite) @@ -11877,7 +11850,7 @@ - + +Widget build() -List<Widget> _buildRow() @@ -11887,9 +11860,9 @@ - + - + void Function(StudyInvite) @@ -11898,9 +11871,9 @@ - + - + List<ModelAction<dynamic>> Function(StudyInvite) @@ -11909,9 +11882,9 @@ - + - + Intervention? Function(String) @@ -11920,9 +11893,9 @@ - + - + int Function(StudyInvite) @@ -11931,16 +11904,16 @@ - - + + - + PublishSuccessDialog - + +Widget build() @@ -11949,16 +11922,16 @@ - - + + - + PublishDialog - + +Widget build() @@ -11967,16 +11940,16 @@ - - + + - + PublishConfirmationDialog - + +Widget build() @@ -11985,17 +11958,17 @@ - - - + + + - + FrameControlsWidget - + +onRefresh: void Function()? +onOpenNewTab: void Function()? @@ -12003,7 +11976,7 @@ - + +Widget build() @@ -12012,16 +11985,16 @@ - - + + - + IStudyStatusBadgeViewModel - + +studyParticipation: Participation? +studyStatus: StudyStatus? @@ -12031,9 +12004,9 @@ - + - + Participation @@ -12042,9 +12015,9 @@ - + - + StudyStatus @@ -12053,17 +12026,17 @@ - - - + + + - + StudyStatusBadge - + +participation: Participation? +status: StudyStatus? @@ -12073,7 +12046,7 @@ - + +Widget build() @@ -12082,17 +12055,17 @@ - - - + + + - + RouteInformation - + +route: String? +extra: String? @@ -12101,7 +12074,7 @@ - + +String toString() @@ -12110,17 +12083,17 @@ - - - + + + - + PlatformController - + +studyId: String +baseSrc: String @@ -12130,7 +12103,7 @@ - + +void activate() +void registerViews() @@ -12146,23 +12119,23 @@ - - - + + + - + WebController - + +iFrameElement: IFrameElement - + +void activate() +void registerViews() @@ -12178,9 +12151,9 @@ - + - + IFrameElement @@ -12189,16 +12162,16 @@ - - + + - + MobileController - + +void openNewPage() +void refresh() @@ -12214,17 +12187,17 @@ - - - + + + - + StudyController - + +notificationService: INotificationService +studyEventsSubscription: StreamSubscription<ModelEvent<Study>>? @@ -12232,7 +12205,7 @@ - + +dynamic syncStudyStatus() +dynamic onStudySubscriptionUpdate() @@ -12248,16 +12221,16 @@ - - + + - + IStudyNavViewModel - + +isEditTabEnabled: bool +isTestTabEnabled: bool @@ -12271,16 +12244,16 @@ - - + + - + StudyNav - + <static>+dynamic tabs() <static>+dynamic edit() @@ -12294,16 +12267,16 @@ - - + + - + StudyDesignNav - + <static>+dynamic tabs() <static>+dynamic info() @@ -12317,17 +12290,17 @@ - - - + + + - + StudyParticipationBadge - + +participation: Participation +type: BadgeType @@ -12336,7 +12309,7 @@ - + +Widget build() @@ -12345,16 +12318,16 @@ - - + + - + IStudyRepository - + +dynamic launch() +dynamic deleteParticipants() @@ -12364,16 +12337,16 @@ - - + + - + PreviewFrame - + +studyId: String +routeArgs: StudyFormRouteArgs? @@ -12384,16 +12357,16 @@ - - + + - + IStudyAppBarViewModel - + +isSyncIndicatorVisible: bool +isStatusBadgeVisible: bool @@ -12404,16 +12377,16 @@ - - + + - + StudyScaffold - + +studyId: String +tabs: List<NavbarTab>? @@ -12434,24 +12407,24 @@ - - - + + + - + WebFrame - + +previewSrc: String +studyId: String - + +Widget build() @@ -12460,16 +12433,16 @@ - - + + - + DisabledFrame - + +Widget build() @@ -12478,17 +12451,17 @@ - - - + + + - + PhoneContainer - + <static>+defaultWidth: double <static>+defaultHeight: double @@ -12502,7 +12475,7 @@ - + +Widget build() @@ -12511,16 +12484,16 @@ - - + + - + MobileFrame - + +Widget build() @@ -12529,16 +12502,16 @@ - - + + - + DesktopFrame - + +Widget build() @@ -12547,23 +12520,23 @@ - - - + + + - + StudyTestScreen - + +previewRoute: String? - + +Widget build() +Widget? banner() @@ -12576,17 +12549,17 @@ - - - + + + - + StudySettingsFormViewModel - + +study: AsyncValue<Study> +studyRepository: IStudyRepository @@ -12599,7 +12572,7 @@ - + +void setControlsFrom() +Study buildFormData() @@ -12612,16 +12585,16 @@ - - + + - + StudySettingsDialog - + +Widget build() @@ -12630,16 +12603,16 @@ - - + + - + StudyTestController - + +authRepository: IAuthRepository +languageCode: String @@ -12649,16 +12622,16 @@ - - + + - + TestAppRoutes - + <static>+studyOverview: String <static>+eligibility: String @@ -12672,17 +12645,17 @@ - - - + + + - + DrawerEntry - + +localizedTitle: String Function() +icon: IconData? @@ -12695,7 +12668,7 @@ - + +void onClick() @@ -12704,9 +12677,9 @@ - + - + String Function() @@ -12715,9 +12688,9 @@ - + - + String Function()? @@ -12726,9 +12699,9 @@ - + - + void Function(BuildContext, WidgetRef)? @@ -12737,24 +12710,24 @@ - - - + + + - + GoRouterDrawerEntry - + +intent: RoutingIntent +onNavigated: void Function()? - + +void onClick() @@ -12763,16 +12736,16 @@ - - + + - + AppDrawer - + +width: int +autoCloseDrawer: bool @@ -12788,16 +12761,16 @@ - - + + - + StudyAnalyzeScreen - + +Widget? banner() +Widget build() @@ -12807,16 +12780,16 @@ - - + + - + StudyAnalyzeController - + +dynamic onExport() @@ -12825,16 +12798,16 @@ - - + + - + StudyDesignInterventionsFormView - + +Widget build() @@ -12843,16 +12816,16 @@ - - + + - + StudyDesignPageWidget - + +Widget? banner() @@ -12861,16 +12834,16 @@ - - + + - + InterventionFormView - + +formViewModel: InterventionFormViewModel @@ -12879,17 +12852,17 @@ - - - + + + - + InterventionFormViewModel - + +study: Study +interventionIdControl: FormControl<String> @@ -12908,7 +12881,7 @@ - + +void setControlsFrom() +InterventionFormData buildFormData() @@ -12929,23 +12902,23 @@ - - - + + + - + InterventionPreview - + +routeArgs: InterventionFormRouteArgs - + +Widget build() @@ -12954,23 +12927,23 @@ - - - + + + - + StudyScheduleFormView - + +formViewModel: StudyScheduleControls - + -FormTableRow _renderCustomSequence() +Widget build() @@ -12980,17 +12953,17 @@ - - - + + + - + StudyScheduleControls - + <static>+defaultScheduleType: PhaseSequence <static>+defaultScheduleTypeSequence: String @@ -13014,7 +12987,7 @@ - + +void setStudyScheduleControlsFrom() +StudyScheduleFormData buildStudyScheduleFormData() @@ -13025,17 +12998,17 @@ - - - + + + - + InterventionTaskFormData - + +taskId: String +taskTitle: String @@ -13045,7 +13018,7 @@ - + +CheckmarkTask toTask() +InterventionTaskFormData copy() @@ -13055,17 +13028,17 @@ - - - + + + - + IFormDataWithSchedule - + +instanceId: String +isTimeLocked: bool @@ -13076,7 +13049,7 @@ - + +Schedule toSchedule() @@ -13085,17 +13058,17 @@ - - - + + + - + InterventionsFormViewModel - + +study: Study +router: GoRouter @@ -13109,7 +13082,7 @@ - + +void setControlsFrom() +InterventionsFormData buildFormData() @@ -13129,17 +13102,17 @@ - - - + + + - + InterventionTaskFormViewModel - + +taskIdControl: FormControl<String> +instanceIdControl: FormControl<String> @@ -13155,7 +13128,7 @@ - + +void setControlsFrom() +InterventionTaskFormData buildFormData() @@ -13166,17 +13139,17 @@ - - - + + + - + WithScheduleControls - + +isTimeRestrictedControl: FormControl<bool> +instanceID: FormControl<String> @@ -13195,7 +13168,7 @@ - + +void setScheduleControlsFrom() -dynamic _initReminderControl() @@ -13205,9 +13178,9 @@ - + - + PhaseSequence @@ -13216,17 +13189,17 @@ - - - + + + - + InterventionFormData - + +interventionId: String +title: String @@ -13238,7 +13211,7 @@ - + +Intervention toIntervention() +InterventionFormData copy() @@ -13248,17 +13221,17 @@ - - - + + + - + StudyScheduleFormData - + +sequenceType: PhaseSequence +sequenceTypeCustom: String @@ -13269,7 +13242,7 @@ - + +StudySchedule toStudySchedule() +Study apply() @@ -13280,16 +13253,16 @@ - - + + - + IStudyFormData - + +Study apply() @@ -13298,16 +13271,16 @@ - - + + - + InterventionTaskFormView - + +formViewModel: InterventionTaskFormViewModel @@ -13316,17 +13289,17 @@ - - - + + + - + InterventionsFormData - + +interventionsData: List<InterventionFormData> +studyScheduleData: StudyScheduleFormData @@ -13334,7 +13307,7 @@ - + +Study apply() +InterventionsFormData copy() @@ -13344,16 +13317,16 @@ - - + + - + StudyDesignReportsFormView - + +Widget build() -dynamic _showReportItemSidesheetWithArgs() @@ -13363,17 +13336,17 @@ - - - + + + - + ReportItemFormData - + +isPrimary: bool +section: ReportSection @@ -13381,7 +13354,7 @@ - + <static>+dynamic fromDomainModel() +ReportItemFormData copy() @@ -13391,9 +13364,9 @@ - + - + ReportSection @@ -13402,17 +13375,17 @@ - - - + + + - + DataReferenceEditor - + +formControl: FormControl<DataReferenceIdentifier<T>> +availableTasks: List<Task> @@ -13420,7 +13393,7 @@ - + +FormTableRow buildFormTableRow() -List<DropdownMenuItem<DataReferenceIdentifier<dynamic>>> _dataReferenceItems() @@ -13430,9 +13403,9 @@ - + - + ReactiveDropdownField @@ -13441,17 +13414,17 @@ - - - + + + - + TemporalAggregationFormatted - + -_value: TemporalAggregation <static>+values: List<TemporalAggregationFormatted> @@ -13462,7 +13435,7 @@ - + +bool ==() +String toString() @@ -13474,9 +13447,9 @@ - + - + TemporalAggregation @@ -13485,17 +13458,17 @@ - - - + + + - + ImprovementDirectionFormatted - + -_value: ImprovementDirection <static>+values: List<ImprovementDirectionFormatted> @@ -13506,7 +13479,7 @@ - + +bool ==() +String toString() @@ -13518,9 +13491,9 @@ - + - + ImprovementDirection @@ -13529,16 +13502,16 @@ - - + + - + ReportSectionType - + +index: int <static>+values: List<ReportSectionType> @@ -13550,17 +13523,17 @@ - - - + + + - + AverageSectionFormView - + +formViewModel: ReportItemFormViewModel +studyId: String @@ -13568,7 +13541,7 @@ - + +Widget build() @@ -13577,17 +13550,17 @@ - - - + + + - + ReportItemFormViewModel - + <static>+defaultSectionType: ReportSectionType +sectionIdControl: FormControl<String> @@ -13620,7 +13593,7 @@ - + -List<FormControlValidation> _getValidationConfig() +ReportItemFormData buildFormData() @@ -13634,23 +13607,23 @@ - - - + + + - + DataReferenceIdentifier - + +hashCode: int - + +bool ==() @@ -13659,9 +13632,9 @@ - + - + DataReference @@ -13670,17 +13643,17 @@ - - - + + + - + LinearRegressionSectionFormView - + +formViewModel: ReportItemFormViewModel +studyId: String @@ -13688,7 +13661,7 @@ - + +Widget build() @@ -13697,17 +13670,17 @@ - - - + + + - + ReportItemFormView - + +formViewModel: ReportItemFormViewModel +studyId: String @@ -13716,7 +13689,7 @@ - + +Widget build() -dynamic _buildSectionText() @@ -13727,17 +13700,17 @@ - - - + + + - + ReportsFormViewModel - + +study: Study +router: GoRouter @@ -13752,7 +13725,7 @@ - + +void setControlsFrom() +ReportsFormData buildFormData() @@ -13769,17 +13742,17 @@ - - - + + + - + ReportFormItemDelegate - + +formViewModelCollection: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData> +owner: ReportsFormViewModel @@ -13788,7 +13761,7 @@ - + +void onCancel() +dynamic onSave() @@ -13802,17 +13775,17 @@ - - - + + + - + ReportBadge - + +status: ReportStatus? +type: BadgeType @@ -13821,7 +13794,7 @@ - + +Widget build() @@ -13830,16 +13803,16 @@ - - + + - + ReportStatus - + +index: int <static>+values: List<ReportStatus> @@ -13851,24 +13824,24 @@ - - - + + + - + ReportsFormData - + +reportItems: List<ReportItemFormData> +id: String - + +Study apply() +ReportsFormData copy() @@ -13878,17 +13851,17 @@ - - - + + + - + StudyInfoFormViewModel - + +study: Study +titleControl: FormControl<String> @@ -13919,7 +13892,7 @@ - + +void setControlsFrom() +StudyInfoFormData buildFormData() @@ -13929,16 +13902,16 @@ - - + + - + StudyDesignInfoFormView - + +Widget build() @@ -13947,17 +13920,17 @@ - - - + + + - + StudyInfoFormData - + +title: String +description: String? @@ -13967,7 +13940,7 @@ - + +Study apply() +StudyInfoFormData copy() @@ -13977,17 +13950,17 @@ - - - + + + - + StudyContactInfoFormData - + +organization: String? +institutionalReviewBoard: String? @@ -14001,7 +13974,7 @@ - + +Study apply() +StudyInfoFormData copy() @@ -14011,16 +13984,16 @@ - - + + - + StudyFormValidationSet - + +index: int <static>+values: List<StudyFormValidationSet> @@ -14030,24 +14003,24 @@ - - - + + + - + MeasurementsFormData - + +surveyMeasurements: List<MeasurementSurveyFormData> +id: String - + +Study apply() +MeasurementsFormData copy() @@ -14057,16 +14030,16 @@ - - + + - + MeasurementSurveyFormView - + +formViewModel: MeasurementSurveyFormViewModel @@ -14075,17 +14048,17 @@ - - - + + + - + MeasurementSurveyFormViewModel - + +study: Study +measurementIdControl: FormControl<String> @@ -14104,7 +14077,7 @@ - + +void setControlsFrom() +MeasurementSurveyFormData buildFormData() @@ -14122,23 +14095,23 @@ - - - + + + - + SurveyPreview - + +routeArgs: MeasurementFormRouteArgs - + +Widget build() @@ -14147,17 +14120,17 @@ - - - + + + - + MeasurementSurveyFormData - + +measurementId: String +title: String @@ -14169,7 +14142,7 @@ - + +QuestionnaireTask toQuestionnaireTask() +MeasurementSurveyFormData copy() @@ -14179,24 +14152,24 @@ - - - + + + - + QuestionnaireFormData - + +questionsData: List<QuestionFormData>? +id: String - + +StudyUQuestionnaire toQuestionnaire() +List<EligibilityCriterion> toEligibilityCriteria() @@ -14207,17 +14180,17 @@ - - - + + + - + WithQuestionnaireControls - + +questionsArray: FormArray<dynamic> +questionFormViewModels: FormViewModelCollection<Q, QuestionFormData> @@ -14228,7 +14201,7 @@ - + +void setQuestionnaireControlsFrom() +QuestionnaireFormData buildQuestionnaireFormData() @@ -14243,16 +14216,16 @@ - - + + - + StudyDesignMeasurementsFormView - + +Widget build() @@ -14261,17 +14234,17 @@ - - - + + + - + MeasurementsFormViewModel - + +study: Study +router: GoRouter @@ -14285,7 +14258,7 @@ - + +void read() +void setControlsFrom() @@ -14304,17 +14277,17 @@ - - - + + + - + StudyFormScaffold - + +studyId: String +formViewModelBuilder: T Function(WidgetRef) @@ -14322,7 +14295,7 @@ - + +Widget build() @@ -14331,9 +14304,9 @@ - + - + T Function(WidgetRef) @@ -14342,17 +14315,17 @@ - - - + + + - + ConsentItemFormViewModel - + +consentIdControl: FormControl<String> +titleControl: FormControl<String> @@ -14367,7 +14340,7 @@ - + +void setControlsFrom() +ConsentItemFormData buildFormData() @@ -14378,16 +14351,16 @@ - - + + - + StudyDesignEnrollmentFormView - + +Widget build() -dynamic _showScreenerQuestionSidesheetWithArgs() @@ -14398,16 +14371,16 @@ - - + + - + IScreenerQuestionLogicFormViewModel - + +isDirtyOptionsBannerVisible: bool @@ -14416,23 +14389,23 @@ - - - + + + - + ScreenerQuestionLogicFormView - + +formViewModel: ScreenerQuestionFormViewModel - + +Widget build() -dynamic _buildInfoBanner() @@ -14444,17 +14417,17 @@ - - - + + + - + ScreenerQuestionFormViewModel - + <static>+defaultResponseOptionValidity: bool +responseOptionsDisabledArray: FormArray<dynamic> @@ -14470,7 +14443,7 @@ - + +dynamic onResponseOptionsChanged() +void setControlsFrom() @@ -14485,17 +14458,17 @@ - - - + + + - + ConsentItemFormData - + +consentId: String +title: String @@ -14505,7 +14478,7 @@ - + +ConsentItem toConsentItem() +ConsentItemFormData copy() @@ -14515,16 +14488,16 @@ - - + + - + ConsentItemFormView - + +formViewModel: ConsentItemFormViewModel @@ -14533,17 +14506,17 @@ - - - + + + - + EnrollmentFormData - + <static>+kDefaultEnrollmentType: Participation +enrollmentType: Participation @@ -14553,7 +14526,7 @@ - + +Study apply() +EnrollmentFormData copy() @@ -14563,17 +14536,17 @@ - - - + + + - + QuestionFormViewModel - + <static>+defaultQuestionType: SurveyQuestionType -_titles: Map<FormMode, String Function()>? @@ -14645,7 +14618,7 @@ - + +String? scaleMidLabelAt() -dynamic _onScaleRangeChanged() @@ -14671,17 +14644,17 @@ - - - + + + - + EnrollmentFormViewModel - + +study: Study +router: GoRouter @@ -14700,7 +14673,7 @@ - + +void setControlsFrom() +EnrollmentFormData buildFormData() @@ -14723,17 +14696,17 @@ - - - + + + - + EnrollmentFormConsentItemDelegate - + +formViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData> +owner: EnrollmentFormViewModel @@ -14742,7 +14715,7 @@ - + +void onCancel() +dynamic onSave() @@ -14756,17 +14729,17 @@ - - - + + + - + StudyFormViewModel - + +studyDirtyCopy: Study? +studyRepository: IStudyRepository @@ -14784,7 +14757,7 @@ - + +void read() +void setControlsFrom() @@ -14799,17 +14772,17 @@ - - - + + + - + QuestionFormData - + <static>+questionTypeFormDataFactories: Map<SurveyQuestionType, QuestionFormData Function(Question<dynamic>, List<EligibilityCriterion>)> +questionId: String @@ -14822,7 +14795,7 @@ - + +Question<dynamic> toQuestion() +EligibilityCriterion toEligibilityCriterion() @@ -14835,16 +14808,16 @@ - - + + - + SurveyQuestionType - + +index: int <static>+values: List<SurveyQuestionType> @@ -14860,17 +14833,17 @@ - - - + + + - + ChoiceQuestionFormData - + +isMultipleChoice: bool +answerOptions: List<String> @@ -14878,7 +14851,7 @@ - + +Question<dynamic> toQuestion() +QuestionFormData copy() @@ -14890,24 +14863,24 @@ - - - + + + - + BoolQuestionFormData - + <static>+kResponseOptions: Map<String, bool> +responseOptions: List<String> - + +Question<dynamic> toQuestion() +BoolQuestionFormData copy() @@ -14918,24 +14891,24 @@ - - - + + + - + ImageQuestionFormData - + <static>+kResponseOptions: Map<String, FutureBlobFile> +responseOptions: List<String> - + +Question<dynamic> toQuestion() +ImageQuestionFormData copy() @@ -14946,17 +14919,17 @@ - - - + + + - + AudioQuestionFormData - + +maxRecordingDurationSeconds: int <static>+kResponseOptions: Map<String, FutureBlobFile> @@ -14964,7 +14937,7 @@ - + +Question<dynamic> toQuestion() +AudioQuestionFormData copy() @@ -14975,17 +14948,17 @@ - - - + + + - + ScaleQuestionFormData - + +minValue: double +maxValue: double @@ -15002,7 +14975,7 @@ - + +ScaleQuestion toQuestion() +QuestionFormData copy() @@ -15013,17 +14986,17 @@ - - - + + + - + FreeTextQuestionFormData - + +textLengthRange: List<int> +textType: FreeTextQuestionType @@ -15032,7 +15005,7 @@ - + +Question<dynamic> toQuestion() +FreeTextQuestionFormData copy() @@ -15043,9 +15016,9 @@ - + - + FreeTextQuestionType @@ -15054,23 +15027,23 @@ - - - + + + - + AudioRecordingQuestionFormView - + +formViewModel: QuestionFormViewModel - + +Widget build() @@ -15079,24 +15052,24 @@ - - - + + + - + FreeTextQuestionFormView - + +formViewModel: QuestionFormViewModel +generateLabelHelpTextMap: dynamic - + +Widget build() +Widget disableOnReadonly() @@ -15107,23 +15080,23 @@ - - - + + + - + ImageCapturingQuestionFormView - + +formViewModel: QuestionFormViewModel - + +Widget build() @@ -15132,16 +15105,16 @@ - - + + - + IScaleQuestionFormViewModel - + +isMidValuesClearedInfoVisible: bool @@ -15150,16 +15123,16 @@ - - + + - + ScaleQuestionFormView - + +formViewModel: QuestionFormViewModel @@ -15168,23 +15141,23 @@ - - - + + + - + ChoiceQuestionFormView - + +formViewModel: QuestionFormViewModel - + +Widget build() @@ -15193,23 +15166,23 @@ - - - + + + - + BoolQuestionFormView - + +formViewModel: QuestionFormViewModel - + +Widget build() @@ -15218,16 +15191,16 @@ - - + + - + SurveyQuestionFormView - + +formViewModel: QuestionFormViewModel +isHtmlStyleable: bool @@ -15237,9 +15210,9 @@ - + - + StudyUTimeOfDay @@ -15248,23 +15221,23 @@ - - - + + + - + ScheduleControls - + +formViewModel: WithScheduleControls - + +Widget build() -List<FormTableRow> _conditionalTimeRestrictions() @@ -15274,16 +15247,16 @@ - - + + - + StudiesTableColumnHeader - + +title: String +sortable: bool @@ -15296,16 +15269,16 @@ - - + + - + DashboardScreen - + +filter: StudiesFilter? @@ -15314,16 +15287,16 @@ - - + + - + StudiesFilter - + +index: int <static>+values: List<StudiesFilter> @@ -15333,24 +15306,24 @@ - - - + + + - + DashboardScaffold - + <static>+compactWidthThreshold: double +body: Widget - + +Widget build() @@ -15359,17 +15332,17 @@ - - - + + + - + DashboardController - + +studyRepository: IStudyRepository +authRepository: IAuthRepository @@ -15381,7 +15354,7 @@ - + -dynamic _subscribeStudies() +dynamic setSearchText() @@ -15403,23 +15376,23 @@ - - - + + + - + IUserRepository - + +user: StudyUUser - + +dynamic fetchUser() +dynamic saveUser() @@ -15430,17 +15403,17 @@ - - - + + + - + StudiesTableColumnSize - + +collapsed: bool +flex: int? @@ -15448,7 +15421,7 @@ - + +Widget createContainer() @@ -15457,17 +15430,17 @@ - - - + + + - + StudiesTable - + +itemHeight: double +itemPadding: double @@ -15485,7 +15458,7 @@ - + +Widget build() -Widget _buildColumnHeader() @@ -15495,9 +15468,9 @@ - + - + void Function(Study) @@ -15506,9 +15479,9 @@ - + - + List<ModelAction<dynamic>> Function(Study) @@ -15517,16 +15490,16 @@ - - + + - + StudiesTableColumn - + +index: int <static>+values: List<StudiesTableColumn> @@ -15545,16 +15518,16 @@ - - + + - + StudiesTableItem - + +study: Study +itemHeight: double @@ -15572,9 +15545,9 @@ - + - + void Function(Study, bool)? @@ -15583,9 +15556,9 @@ - + - + void Function(Study)? @@ -15594,9 +15567,9 @@ - + - + App @@ -15605,9 +15578,9 @@ - + - + AppContent @@ -15616,16 +15589,16 @@ - - + + - + AccountSettingsDialog - + +Widget build() @@ -15634,17 +15607,17 @@ - - - + + + - + ModelRepository - + +delegate: IModelRepositoryDelegate<T> -_allModelsStreamController: BehaviorSubject<List<WrappedModel<T>>> @@ -15655,7 +15628,7 @@ - + +WrappedModel<T>? get() +dynamic fetchAll() @@ -15683,17 +15656,17 @@ - - - + + + - + InviteCodeRepository - + +studyId: String +ref: ProviderRef<dynamic> @@ -15704,7 +15677,7 @@ - + +String getKey() +dynamic isCodeAlreadyUsed() @@ -15716,9 +15689,9 @@ - + - + ProviderRef @@ -15727,16 +15700,16 @@ - - + + - + StudyUApi - + +dynamic saveStudy() +dynamic fetchStudy() @@ -15755,17 +15728,17 @@ - - - + + + - + InviteCodeRepositoryDelegate - + +study: Study +apiClient: StudyUApi @@ -15773,7 +15746,7 @@ - + +dynamic fetch() +dynamic fetchAll() @@ -15788,16 +15761,16 @@ - - + + - + IModelRepositoryDelegate - + +dynamic fetchAll() +dynamic fetch() @@ -15812,17 +15785,17 @@ - - - + + + - + StudyRepository - + +apiClient: StudyUApi +authRepository: IAuthRepository @@ -15831,7 +15804,7 @@ - + +String getKey() +dynamic deleteParticipants() @@ -15843,24 +15816,24 @@ - - - + + + - + StudyRepositoryDelegate - + +apiClient: StudyUApi +authRepository: IAuthRepository - + +dynamic fetchAll() +dynamic fetch() @@ -15875,9 +15848,9 @@ - + - + APIException @@ -15886,9 +15859,9 @@ - + - + StudyNotFoundException @@ -15897,9 +15870,9 @@ - + - + MeasurementNotFoundException @@ -15908,9 +15881,9 @@ - + - + QuestionNotFoundException @@ -15919,9 +15892,9 @@ - + - + ConsentItemNotFoundException @@ -15930,9 +15903,9 @@ - + - + InterventionNotFoundException @@ -15941,9 +15914,9 @@ - + - + InterventionTaskNotFoundException @@ -15952,9 +15925,9 @@ - + - + ReportNotFoundException @@ -15963,9 +15936,9 @@ - + - + ReportSectionNotFoundException @@ -15974,9 +15947,9 @@ - + - + StudyInviteNotFoundException @@ -15985,9 +15958,9 @@ - + - + UserNotFoundException @@ -15996,17 +15969,17 @@ - - - + + + - + StudyUApiClient - + +supabaseClient: SupabaseClient <static>+studyColumns: List<String> @@ -16015,7 +15988,7 @@ - + +dynamic deleteParticipants() +dynamic getUserStudies() @@ -16037,9 +16010,9 @@ - + - + SupabaseClient @@ -16048,16 +16021,16 @@ - - + + - + SupabaseClientDependant - + +supabaseClient: SupabaseClient @@ -16066,16 +16039,16 @@ - - + + - + SupabaseQueryMixin - + +dynamic deleteAll() +dynamic getAll() @@ -16089,16 +16062,16 @@ - - + + - + IAppRepository - + +dynamic fetchAppConfig() +void dispose() @@ -16108,23 +16081,23 @@ - - - + + + - + AppRepository - + +apiClient: StudyUApi - + +dynamic fetchAppConfig() +void dispose() @@ -16134,9 +16107,9 @@ - + - + StudyUUser @@ -16145,17 +16118,17 @@ - - - + + + - + UserRepository - + +apiClient: StudyUApi +authRepository: IAuthRepository @@ -16164,7 +16137,7 @@ - + +dynamic fetchUser() +dynamic saveUser() @@ -16175,9 +16148,9 @@ - + - + Ref @@ -16186,16 +16159,16 @@ - - + + - + PreferenceAction - + +index: int <static>+values: List<PreferenceAction> @@ -16207,9 +16180,9 @@ - + - + User @@ -16218,9 +16191,9 @@ - + - + Session @@ -16229,17 +16202,17 @@ - - - + + + - + AuthRepository - + +supabaseClient: SupabaseClient +allowPasswordReset: bool @@ -16251,7 +16224,7 @@ - + -void _registerAuthListener() +dynamic signUp() @@ -16267,9 +16240,9 @@ - + - + GoTrueClient @@ -16278,9 +16251,9 @@ - + - + StudyLaunched @@ -16289,16 +16262,16 @@ - - + + - + ModelEvent - + +modelId: String +model: T @@ -16308,16 +16281,16 @@ - - + + - + SupabaseQueryError - + +statusCode: String? +message: String @@ -16328,17 +16301,17 @@ - - - + + + - + WrappedModel - + -_model: T +asyncValue: AsyncValue<T> @@ -16352,7 +16325,7 @@ - + +dynamic markWithError() +dynamic markAsLoading() @@ -16364,9 +16337,9 @@ - + - + ModelRepositoryException @@ -16375,9 +16348,9 @@ - + - + ModelNotFoundException @@ -16386,16 +16359,16 @@ - - + + - + IModelRepository - + +String getKey() +WrappedModel<T>? get() @@ -16417,9 +16390,9 @@ - + - + IsFetched @@ -16428,9 +16401,9 @@ - + - + IsSaving @@ -16439,9 +16412,9 @@ - + - + IsSaved @@ -16450,9 +16423,9 @@ - + - + IsDeleted From cf8c9ba20b1f401fcfb3725139319f6958807bc6 Mon Sep 17 00:00:00 2001 From: Johannes Vedder Date: Thu, 25 Apr 2024 15:03:43 +0200 Subject: [PATCH 011/314] chore: upgrade deps --- app/pubspec.lock | 28 ++++++++++++++-------------- app/pubspec.yaml | 10 +++++----- core/pubspec.lock | 12 ++++++------ core/pubspec.yaml | 6 +++--- designer_v2/pubspec.lock | 12 ++++++------ designer_v2/pubspec.yaml | 6 +++--- flutter_common/pubspec.lock | 8 ++++---- flutter_common/pubspec.yaml | 2 +- pubspec.lock | 4 ++-- pubspec.yaml | 2 +- 10 files changed, 45 insertions(+), 45 deletions(-) diff --git a/app/pubspec.lock b/app/pubspec.lock index 9a97219fb..7d2100ae0 100644 --- a/app/pubspec.lock +++ b/app/pubspec.lock @@ -338,10 +338,10 @@ packages: dependency: "direct main" description: name: flutter_local_notifications - sha256: a701df4866f9a38bb8e4450a54c143bbeeb0ce2381e7df5a36e1006f3b43bb28 + sha256: "8cdc719114ab1c86c64bb7a86d3a679674c3637edd229e3a994797d4a1504ce4" url: "https://pub.dev" source: hosted - version: "17.0.1" + version: "17.1.0" flutter_local_notifications_linux: dependency: transitive description: @@ -354,10 +354,10 @@ packages: dependency: transitive description: name: flutter_local_notifications_platform_interface - sha256: "7cf643d6d5022f3baed0be777b0662cce5919c0a7b86e700299f22dc4ae660ef" + sha256: "340abf67df238f7f0ef58f4a26d2a83e1ab74c77ab03cd2b2d5018ac64db30b7" url: "https://pub.dev" source: hosted - version: "7.0.0+1" + version: "7.1.0" flutter_localizations: dependency: "direct main" description: flutter @@ -593,10 +593,10 @@ packages: dependency: transitive description: name: json_annotation - sha256: b10a7b2ff83d83c777edba3c6a0f97045ddadd56c944e1a23a3fdf43a1bf4467 + sha256: "1ce844379ca14835a50d2f019a3099f419082cfdd231cd86a142af94dd5c6bb1" url: "https://pub.dev" source: hosted - version: "4.8.1" + version: "4.9.0" just_audio: dependency: transitive description: @@ -1033,26 +1033,26 @@ packages: dependency: transitive description: name: sentry - sha256: "19a267774906ca3a3c4677fc7e9582ea9da79ae9a28f84bbe4885dac2c269b70" + sha256: "961630a4dba41cebd692612421fd3805a991ebd8ef4a8d84a6c179e6b89eaf22" url: "https://pub.dev" source: hosted - version: "7.20.0" + version: "8.0.0" sentry_flutter: dependency: "direct main" description: name: sentry_flutter - sha256: "2d2917f7d795167e33a790db9bc5e1104d2035569ecf83e09a3f491bc6978cfe" + sha256: "705da7adfcd1fb23fc8720b6e222f5e03d53f1d020cd635586c319ee323366b4" url: "https://pub.dev" source: hosted - version: "7.20.0" + version: "8.0.0" sentry_logging: dependency: "direct main" description: name: sentry_logging - sha256: "73002a2d4baec71f34e6e775223780279c005644fcd3422127d8802aaed8f86d" + sha256: "136751f7d0428b89267fb0c5d20308cb6237148930ce3a5ff9f82c069a9ea793" url: "https://pub.dev" source: hosted - version: "7.20.0" + version: "8.0.0" shared_preferences: dependency: "direct main" description: @@ -1252,10 +1252,10 @@ packages: dependency: "direct main" description: name: timezone - sha256: "1cfd8ddc2d1cfd836bc93e67b9be88c3adaeca6f40a00ca999104c30693cdca0" + sha256: a6ccda4a69a442098b602c44e61a1e2b4bf6f5516e875bbf0f427d5df14745d5 url: "https://pub.dev" source: hosted - version: "0.9.2" + version: "0.9.3" typed_data: dependency: transitive description: diff --git a/app/pubspec.yaml b/app/pubspec.yaml index 677d3458c..12133a149 100644 --- a/app/pubspec.yaml +++ b/app/pubspec.yaml @@ -16,7 +16,7 @@ dependencies: flutter: sdk: flutter flutter_file_dialog: ^3.0.2 - flutter_local_notifications: ^17.0.1 + flutter_local_notifications: ^17.1.0 flutter_localizations: sdk: flutter flutter_timezone: ^1.0.8 @@ -26,7 +26,7 @@ dependencies: intersperse: ^2.0.0 intl: ^0.18.1 # flutter_localizations material_design_icons_flutter: ^7.0.7296 - package_info_plus: ^7.0.0 + package_info_plus: ^7.0.0 # wakelock_plus <= 1.2.4 path: ^1.9.0 path_provider: ^2.1.3 pdf: ^3.10.8 @@ -35,15 +35,15 @@ dependencies: quiver: ^3.2.1 rainbow_color: ^2.0.1 record: ^5.0.5 - sentry_flutter: ^7.20.0 - sentry_logging: ^7.20.0 + sentry_flutter: ^8.0.0 + sentry_logging: ^8.0.0 shared_preferences: ^2.2.3 studyu_core: ^4.4.1 studyu_flutter_common: ^1.8.2 supabase: ^2.1.1 supabase_flutter: ^2.5.1 timeline_tile: ^2.0.0 - timezone: ^0.9.2 + timezone: ^0.9.3 universal_html: ^2.2.4 url_launcher: ^6.2.6 uuid: ^4.4.0 diff --git a/core/pubspec.lock b/core/pubspec.lock index 358397574..f07c31977 100644 --- a/core/pubspec.lock +++ b/core/pubspec.lock @@ -269,18 +269,18 @@ packages: dependency: "direct main" description: name: json_annotation - sha256: b10a7b2ff83d83c777edba3c6a0f97045ddadd56c944e1a23a3fdf43a1bf4467 + sha256: "1ce844379ca14835a50d2f019a3099f419082cfdd231cd86a142af94dd5c6bb1" url: "https://pub.dev" source: hosted - version: "4.8.1" + version: "4.9.0" json_serializable: dependency: "direct dev" description: name: json_serializable - sha256: aa1f5a8912615733e0fdc7a02af03308933c93235bdc8d50d0b0c8a8ccb0b969 + sha256: ea1432d167339ea9b5bb153f0571d0039607a873d6e04e0117af043f14a1fd4b url: "https://pub.dev" source: hosted - version: "6.7.1" + version: "6.8.0" jwt_decode: dependency: transitive description: @@ -429,10 +429,10 @@ packages: dependency: "direct main" description: name: sentry - sha256: "19a267774906ca3a3c4677fc7e9582ea9da79ae9a28f84bbe4885dac2c269b70" + sha256: "961630a4dba41cebd692612421fd3805a991ebd8ef4a8d84a6c179e6b89eaf22" url: "https://pub.dev" source: hosted - version: "7.20.0" + version: "8.0.0" shelf: dependency: transitive description: diff --git a/core/pubspec.yaml b/core/pubspec.yaml index ca55b430d..e3019f053 100644 --- a/core/pubspec.yaml +++ b/core/pubspec.yaml @@ -10,15 +10,15 @@ environment: dependencies: collection: ^1.18.0 csv: ^6.0.0 - json_annotation: ^4.8.1 + json_annotation: ^4.9.0 logger: ^2.2.0 quiver: ^3.2.1 - sentry: ^7.20.0 + sentry: ^8.0.0 supabase: ^2.1.1 uuid: ^4.4.0 dev_dependencies: build_runner: ^2.4.9 - json_serializable: ^6.7.1 + json_serializable: ^6.8.0 lint: ^2.3.0 test: ^1.25.4 diff --git a/designer_v2/pubspec.lock b/designer_v2/pubspec.lock index 961564d98..dedbea596 100644 --- a/designer_v2/pubspec.lock +++ b/designer_v2/pubspec.lock @@ -387,10 +387,10 @@ packages: dependency: "direct main" description: name: go_router - sha256: "771c8feb40ad0ef639973d7ecf1b43d55ffcedb2207fd43fab030f5639e40446" + sha256: "28ef8a8320ab3bf5752424e6bca6961ce25108afc344f3127b5155caf7a792c8" url: "https://pub.dev" source: hosted - version: "13.2.4" + version: "14.0.0" gotrue: dependency: transitive description: @@ -480,10 +480,10 @@ packages: dependency: transitive description: name: json_annotation - sha256: b10a7b2ff83d83c777edba3c6a0f97045ddadd56c944e1a23a3fdf43a1bf4467 + sha256: "1ce844379ca14835a50d2f019a3099f419082cfdd231cd86a142af94dd5c6bb1" url: "https://pub.dev" source: hosted - version: "4.8.1" + version: "4.9.0" jwt_decode: dependency: transitive description: @@ -864,10 +864,10 @@ packages: dependency: transitive description: name: sentry - sha256: "19a267774906ca3a3c4677fc7e9582ea9da79ae9a28f84bbe4885dac2c269b70" + sha256: "961630a4dba41cebd692612421fd3805a991ebd8ef4a8d84a6c179e6b89eaf22" url: "https://pub.dev" source: hosted - version: "7.20.0" + version: "8.0.0" shared_preferences: dependency: transitive description: diff --git a/designer_v2/pubspec.yaml b/designer_v2/pubspec.yaml index 8731ccf78..e4b28a826 100644 --- a/designer_v2/pubspec.yaml +++ b/designer_v2/pubspec.yaml @@ -23,14 +23,14 @@ dependencies: flutter_riverpod: ^2.5.1 flutter_web_plugins: sdk: flutter - go_router: ^13.2.4 + go_router: ^14.0.0 material_color_utilities: material_design_icons_flutter: ^7.0.7296 pointer_interceptor: ^0.10.1 reactive_color_picker: ^2.0.0 - reactive_forms: ^16.1.1 + reactive_forms: ^16.1.1 # reactive_range_slider <= 2.0.0 reactive_multi_select_flutter: ^2.0.0 - reactive_range_slider: ^2.0.0 # reactive_forms <= 16.1.1 + reactive_range_slider: ^2.0.0 rxdart: ^0.27.7 studyu_core: ^4.4.1 studyu_flutter_common: ^1.8.2 diff --git a/flutter_common/pubspec.lock b/flutter_common/pubspec.lock index 1da42973a..b663c054c 100644 --- a/flutter_common/pubspec.lock +++ b/flutter_common/pubspec.lock @@ -228,10 +228,10 @@ packages: dependency: transitive description: name: json_annotation - sha256: b10a7b2ff83d83c777edba3c6a0f97045ddadd56c944e1a23a3fdf43a1bf4467 + sha256: "1ce844379ca14835a50d2f019a3099f419082cfdd231cd86a142af94dd5c6bb1" url: "https://pub.dev" source: hosted - version: "4.8.1" + version: "4.9.0" jwt_decode: dependency: transitive description: @@ -428,10 +428,10 @@ packages: dependency: transitive description: name: sentry - sha256: "19a267774906ca3a3c4677fc7e9582ea9da79ae9a28f84bbe4885dac2c269b70" + sha256: "961630a4dba41cebd692612421fd3805a991ebd8ef4a8d84a6c179e6b89eaf22" url: "https://pub.dev" source: hosted - version: "7.20.0" + version: "8.0.0" shared_preferences: dependency: "direct main" description: diff --git a/flutter_common/pubspec.yaml b/flutter_common/pubspec.yaml index bf12523c3..0522ef65c 100644 --- a/flutter_common/pubspec.yaml +++ b/flutter_common/pubspec.yaml @@ -12,7 +12,7 @@ dependencies: sdk: flutter flutter_dotenv: ^5.1.0 flutter_secure_storage: ^9.0.0 - shared_preferences: ^2.2.2 # Can be removed after migrating phase + shared_preferences: ^2.2.3 # Can be removed after migrating phase studyu_core: ^4.4.1 supabase_flutter: ^2.5.1 synchronized: ^3.1.0+1 diff --git a/pubspec.lock b/pubspec.lock index 206912c52..1d4a296ac 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -165,10 +165,10 @@ packages: dependency: "direct dev" description: name: melos - sha256: a0cb264096a315e4acdb66ae75ee594a76c97fe15ce9ae469f6c58c6c4b2be87 + sha256: f9a6fc4f4842b7edfca2e00ab3b5b06928584f24bdc3d776ab0b30be7d599450 url: "https://pub.dev" source: hosted - version: "5.3.0" + version: "6.0.0" meta: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 839421ca3..bfc6f81d4 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -9,4 +9,4 @@ environment: dev_dependencies: flutter_lints: ^3.0.2 lint: ^2.3.0 - melos: ^5.3.0 + melos: ^6.0.0 From c9ed4e6206d7e39a1dc245ace3b0b77906a32b1b Mon Sep 17 00:00:00 2001 From: Johannes Vedder Date: Thu, 25 Apr 2024 20:24:03 +0200 Subject: [PATCH 012/314] chore: regenerate files --- .../questionnaire/questions/annotated_scale_question.g.dart | 2 +- .../questionnaire/questions/audio_recording_question.g.dart | 3 ++- .../models/questionnaire/questions/free_text_question.g.dart | 5 +++-- .../src/models/questionnaire/questions/scale_question.g.dart | 4 ++-- .../questionnaire/questions/visual_analogue_question.g.dart | 4 ++-- core/lib/src/models/study_schedule/study_schedule.g.dart | 4 ++-- 6 files changed, 12 insertions(+), 10 deletions(-) diff --git a/core/lib/src/models/questionnaire/questions/annotated_scale_question.g.dart b/core/lib/src/models/questionnaire/questions/annotated_scale_question.g.dart index 88f580b18..1de91484b 100644 --- a/core/lib/src/models/questionnaire/questions/annotated_scale_question.g.dart +++ b/core/lib/src/models/questionnaire/questions/annotated_scale_question.g.dart @@ -50,7 +50,7 @@ Map _$AnnotatedScaleQuestionToJson( } Annotation _$AnnotationFromJson(Map json) => Annotation() - ..value = json['value'] as int + ..value = (json['value'] as num).toInt() ..annotation = json['annotation'] as String; Map _$AnnotationToJson(Annotation instance) => diff --git a/core/lib/src/models/questionnaire/questions/audio_recording_question.g.dart b/core/lib/src/models/questionnaire/questions/audio_recording_question.g.dart index 15d48dc67..c09581df9 100644 --- a/core/lib/src/models/questionnaire/questions/audio_recording_question.g.dart +++ b/core/lib/src/models/questionnaire/questions/audio_recording_question.g.dart @@ -9,7 +9,8 @@ part of 'audio_recording_question.dart'; AudioRecordingQuestion _$AudioRecordingQuestionFromJson( Map json) => AudioRecordingQuestion( - maxRecordingDurationSeconds: json['maxRecordingDurationSeconds'] as int, + maxRecordingDurationSeconds: + (json['maxRecordingDurationSeconds'] as num).toInt(), ) ..type = json['type'] as String ..id = json['id'] as String diff --git a/core/lib/src/models/questionnaire/questions/free_text_question.g.dart b/core/lib/src/models/questionnaire/questions/free_text_question.g.dart index c15443724..4a6865334 100644 --- a/core/lib/src/models/questionnaire/questions/free_text_question.g.dart +++ b/core/lib/src/models/questionnaire/questions/free_text_question.g.dart @@ -9,8 +9,9 @@ part of 'free_text_question.dart'; FreeTextQuestion _$FreeTextQuestionFromJson(Map json) => FreeTextQuestion( textType: $enumDecode(_$FreeTextQuestionTypeEnumMap, json['textType']), - lengthRange: - (json['lengthRange'] as List).map((e) => e as int).toList(), + lengthRange: (json['lengthRange'] as List) + .map((e) => (e as num).toInt()) + .toList(), customTypeExpression: json['customTypeExpression'] as String?, ) ..type = json['type'] as String diff --git a/core/lib/src/models/questionnaire/questions/scale_question.g.dart b/core/lib/src/models/questionnaire/questions/scale_question.g.dart index d05ec400c..e69c71d08 100644 --- a/core/lib/src/models/questionnaire/questions/scale_question.g.dart +++ b/core/lib/src/models/questionnaire/questions/scale_question.g.dart @@ -22,8 +22,8 @@ ScaleQuestion _$ScaleQuestionFromJson(Map json) => ..annotations = (json['annotations'] as List) .map((e) => Annotation.fromJson(e as Map)) .toList() - ..minColor = json['min_color'] as int? - ..maxColor = json['max_color'] as int? + ..minColor = (json['min_color'] as num?)?.toInt() + ..maxColor = (json['max_color'] as num?)?.toInt() ..step = (json['step'] as num).toDouble(); Map _$ScaleQuestionToJson(ScaleQuestion instance) { diff --git a/core/lib/src/models/questionnaire/questions/visual_analogue_question.g.dart b/core/lib/src/models/questionnaire/questions/visual_analogue_question.g.dart index 2511e9751..2c2a2b505 100644 --- a/core/lib/src/models/questionnaire/questions/visual_analogue_question.g.dart +++ b/core/lib/src/models/questionnaire/questions/visual_analogue_question.g.dart @@ -21,8 +21,8 @@ VisualAnalogueQuestion _$VisualAnalogueQuestionFromJson( ..maximum = (json['maximum'] as num).toDouble() ..step = (json['step'] as num).toDouble() ..initial = (json['initial'] as num).toDouble() - ..minimumColor = json['minimumColor'] as int - ..maximumColor = json['maximumColor'] as int + ..minimumColor = (json['minimumColor'] as num).toInt() + ..maximumColor = (json['maximumColor'] as num).toInt() ..minimumAnnotation = json['minimumAnnotation'] as String ..maximumAnnotation = json['maximumAnnotation'] as String; diff --git a/core/lib/src/models/study_schedule/study_schedule.g.dart b/core/lib/src/models/study_schedule/study_schedule.g.dart index 22f3cd80f..ae103a19d 100644 --- a/core/lib/src/models/study_schedule/study_schedule.g.dart +++ b/core/lib/src/models/study_schedule/study_schedule.g.dart @@ -10,8 +10,8 @@ StudySchedule _$StudyScheduleFromJson(Map json) => StudySchedule( sequenceCustom: json['sequenceCustom'] as String? ?? 'ABAB', ) - ..numberOfCycles = json['numberOfCycles'] as int - ..phaseDuration = json['phaseDuration'] as int + ..numberOfCycles = (json['numberOfCycles'] as num).toInt() + ..phaseDuration = (json['phaseDuration'] as num).toInt() ..includeBaseline = json['includeBaseline'] as bool ..sequence = $enumDecode(_$PhaseSequenceEnumMap, json['sequence']); From ad50defaf1fee2c92a741298879cc341331de3ce Mon Sep 17 00:00:00 2001 From: Johannes Vedder Date: Fri, 26 Apr 2024 10:40:21 +0200 Subject: [PATCH 013/314] chore: add reset melos command --- melos.yaml | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/melos.yaml b/melos.yaml index 16c3c92b1..3f11616a5 100644 --- a/melos.yaml +++ b/melos.yaml @@ -8,16 +8,6 @@ packages: - core - flutter_common -command: - clean: - hooks: - # Clean things very deeply, can be used to establish "pristine checkout" status - pre: > - git clean -x -d -f -q || true - # Additional cleanup lifecycle script, executed when `melos clean` is ran. - post: > - melos exec --flutter --concurrency=3 -- "flutter clean" - scripts: analyze: run: | @@ -76,6 +66,14 @@ scripts: packageFilters: scope: studyu_core + reset: + run: | + git clean -x -d -f -q || true + melos clean + melos exec --flutter --concurrency=1 -- "flutter clean" + melos bootstrap + description: Reset the workspace to a "pristine checkout" status. + dev:designer: run: | melos exec -c 1 -- \ From eeab500f572b85903657dfcad29e4ace5a2e3f1d Mon Sep 17 00:00:00 2001 From: Johannes Vedder Date: Fri, 19 Apr 2024 16:00:15 +0200 Subject: [PATCH 014/314] feat: sort invite codes alphabetically --- designer_v2/lib/features/recruit/study_recruit_controller.dart | 2 ++ 1 file changed, 2 insertions(+) diff --git a/designer_v2/lib/features/recruit/study_recruit_controller.dart b/designer_v2/lib/features/recruit/study_recruit_controller.dart index 5b2797126..909024b0a 100644 --- a/designer_v2/lib/features/recruit/study_recruit_controller.dart +++ b/designer_v2/lib/features/recruit/study_recruit_controller.dart @@ -36,6 +36,8 @@ class StudyRecruitController extends StudyBaseController invite.model).toList(); + // Sort invites alphabetically by code + invites.sort((a, b) => a.code.compareTo(b.code)); state = state.copyWith( invites: AsyncValue.data(invites), ); From de4cbd59b7f5a61300b53191b3a4351ef91a7fe7 Mon Sep 17 00:00:00 2001 From: StudyU Documenter Date: Fri, 19 Apr 2024 14:05:53 +0000 Subject: [PATCH 015/314] docs: update UML documentation --- .../designer_v2/lib/features/recruit/uml.svg | 450 +- docs/uml/designer_v2/lib/features/uml.svg | 11136 ++++---- docs/uml/designer_v2/lib/uml.svg | 21652 ++++++++-------- 3 files changed, 16619 insertions(+), 16619 deletions(-) diff --git a/docs/uml/designer_v2/lib/features/recruit/uml.svg b/docs/uml/designer_v2/lib/features/recruit/uml.svg index b113e1780..cb4d698e7 100644 --- a/docs/uml/designer_v2/lib/features/recruit/uml.svg +++ b/docs/uml/designer_v2/lib/features/recruit/uml.svg @@ -1,36 +1,11 @@ - - [InviteCodeFormViewModel + + [EnrolledBadge | - +study: Study; - +inviteCodeRepository: IInviteCodeRepository; - +codeControl: FormControl<String>; - +codeControlValidationMessages: Map<String, String Function(dynamic)>; - +isPreconfiguredScheduleControl: FormControl<bool>; - +preconfiguredScheduleTypeControl: FormControl<PhaseSequence>; - +interventionAControl: FormControl<String>; - +interventionBControl: FormControl<String>; - +form: FormGroup; - +titles: Map<FormMode, String>; - +interventionControlOptions: List<FormControlOption<String>>; - +preconfiguredScheduleTypeOptions: List<FormControlOption<PhaseSequence>>; - +isPreconfiguredSchedule: bool; - +preconfiguredSchedule: List<String>? + +enrolledCount: int | - +void initControls(); - -dynamic _uniqueInviteCode(); - +void regenerateCode(); - -String _generateCode(); - +StudyInvite buildFormData(); - +void setControlsFrom(); - +dynamic save() + +Widget build() ] - [InviteCodeFormViewModel]o-[Study] - [InviteCodeFormViewModel]o-[<abstract>IInviteCodeRepository] - [InviteCodeFormViewModel]o-[FormControl] - [InviteCodeFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[InviteCodeFormViewModel] - [StudyRecruitController | +inviteCodeRepository: IInviteCodeRepository; @@ -49,13 +24,6 @@ [StudyBaseController]<:-[StudyRecruitController] [<abstract>IModelActionProvider]<:--[StudyRecruitController] - [EnrolledBadge - | - +enrolledCount: int - | - +Widget build() - ] - [StudyRecruitScreen | +Widget build(); @@ -95,189 +63,147 @@ [StudyInvitesTable]o-[Intervention? Function(String)] [StudyInvitesTable]o-[int Function(StudyInvite)] + [InviteCodeFormViewModel + | + +study: Study; + +inviteCodeRepository: IInviteCodeRepository; + +codeControl: FormControl<String>; + +codeControlValidationMessages: Map<String, String Function(dynamic)>; + +isPreconfiguredScheduleControl: FormControl<bool>; + +preconfiguredScheduleTypeControl: FormControl<PhaseSequence>; + +interventionAControl: FormControl<String>; + +interventionBControl: FormControl<String>; + +form: FormGroup; + +titles: Map<FormMode, String>; + +interventionControlOptions: List<FormControlOption<String>>; + +preconfiguredScheduleTypeOptions: List<FormControlOption<PhaseSequence>>; + +isPreconfiguredSchedule: bool; + +preconfiguredSchedule: List<String>? + | + +void initControls(); + -dynamic _uniqueInviteCode(); + +void regenerateCode(); + -String _generateCode(); + +StudyInvite buildFormData(); + +void setControlsFrom(); + +dynamic save() + ] + + [InviteCodeFormViewModel]o-[Study] + [InviteCodeFormViewModel]o-[<abstract>IInviteCodeRepository] + [InviteCodeFormViewModel]o-[FormControl] + [InviteCodeFormViewModel]o-[FormGroup] + [<abstract>FormViewModel]<:-[InviteCodeFormViewModel] + - + - - + + - + - + - + - - - + + + + - + + + + - + - - - + + + - + - + - - - - - - + - - - - + - + - - - + - + - + - + - + - + - + - + - - - - - - - - - InviteCodeFormViewModel - - - - - - +study: Study - +inviteCodeRepository: IInviteCodeRepository - +codeControl: FormControl<String> - +codeControlValidationMessages: Map<String, String Function(dynamic)> - +isPreconfiguredScheduleControl: FormControl<bool> - +preconfiguredScheduleTypeControl: FormControl<PhaseSequence> - +interventionAControl: FormControl<String> - +interventionBControl: FormControl<String> - +form: FormGroup - +titles: Map<FormMode, String> - +interventionControlOptions: List<FormControlOption<String>> - +preconfiguredScheduleTypeOptions: List<FormControlOption<PhaseSequence>> - +isPreconfiguredSchedule: bool - +preconfiguredSchedule: List<String>? - - - - - - +void initControls() - -dynamic _uniqueInviteCode() - +void regenerateCode() - -String _generateCode() - +StudyInvite buildFormData() - +void setControlsFrom() - +dynamic save() - - - - - - - - - - - Study - - - - - - - - - - - IInviteCodeRepository - - - + + + - - - + + + + + + + - - - FormControl + + + EnrolledBadge - - - - - - - - FormGroup + + + +enrolledCount: int - - - - - - - - FormViewModel + + + +Widget build() - - - + + + - + StudyRecruitController - + +inviteCodeRepository: IInviteCodeRepository -_invitesSubscription: StreamSubscription<List<WrappedModel<StudyInvite>>>? - + -dynamic _subscribeInvites() +Intervention? getIntervention() @@ -289,11 +215,22 @@ + + + + + + + IInviteCodeRepository + + + + - + - + StreamSubscription @@ -302,9 +239,9 @@ - + - + StudyBaseController @@ -313,52 +250,27 @@ - + - + IModelActionProvider - - - - - - - - - EnrolledBadge - - - - - - +enrolledCount: int - - - - - - +Widget build() - - - - - - + + - + StudyRecruitScreen - + +Widget build() -Widget _inviteCodesSectionHeader() @@ -370,9 +282,9 @@ - + - + StudyPageWidget @@ -381,23 +293,23 @@ - - - + + + - + InviteCodeFormView - + +formViewModel: InviteCodeFormViewModel - + +Widget build() -List<FormTableRow> _conditionalInterventionRows() @@ -405,11 +317,55 @@ + + + + + + + + + InviteCodeFormViewModel + + + + + + +study: Study + +inviteCodeRepository: IInviteCodeRepository + +codeControl: FormControl<String> + +codeControlValidationMessages: Map<String, String Function(dynamic)> + +isPreconfiguredScheduleControl: FormControl<bool> + +preconfiguredScheduleTypeControl: FormControl<PhaseSequence> + +interventionAControl: FormControl<String> + +interventionBControl: FormControl<String> + +form: FormGroup + +titles: Map<FormMode, String> + +interventionControlOptions: List<FormControlOption<String>> + +preconfiguredScheduleTypeOptions: List<FormControlOption<PhaseSequence>> + +isPreconfiguredSchedule: bool + +preconfiguredSchedule: List<String>? + + + + + + +void initControls() + -dynamic _uniqueInviteCode() + +void regenerateCode() + -String _generateCode() + +StudyInvite buildFormData() + +void setControlsFrom() + +dynamic save() + + + + - + - + FormConsumerWidget @@ -418,17 +374,17 @@ - - - + + + - + StudyInvitesTable - + +invites: List<StudyInvite> +onSelect: void Function(StudyInvite) @@ -439,7 +395,7 @@ - + +Widget build() -List<Widget> _buildRow() @@ -449,9 +405,9 @@ - + - + void Function(StudyInvite) @@ -460,9 +416,9 @@ - + - + List<ModelAction<dynamic>> Function(StudyInvite) @@ -471,9 +427,9 @@ - + - + Intervention? Function(String) @@ -482,15 +438,59 @@ - + - + int Function(StudyInvite) + + + + + + + Study + + + + + + + + + + + FormControl + + + + + + + + + + + FormGroup + + + + + + + + + + + FormViewModel + + + + diff --git a/docs/uml/designer_v2/lib/features/uml.svg b/docs/uml/designer_v2/lib/features/uml.svg index bb00ae648..d85f16001 100644 --- a/docs/uml/designer_v2/lib/features/uml.svg +++ b/docs/uml/designer_v2/lib/features/uml.svg @@ -1,921 +1,895 @@ - - [WebFrame + + [<abstract>IAppDelegate | - +previewSrc: String; - +studyId: String + +dynamic onAppStart() + ] + + [AppController | - +Widget build() + +appDelegates: List<IAppDelegate>; + -_delayedFuture: dynamic; + +isInitialized: dynamic + | + +dynamic onAppStart(); + -dynamic _callDelegates() ] - [DisabledFrame + [StudyMonitorScreen | +Widget build() ] - [PhoneContainer + [<abstract>StudyPageWidget]<:-[StudyMonitorScreen] + + [LoginForm | - <static>+defaultWidth: double; - <static>+defaultHeight: double; - +width: double; - +height: double; - +borderColor: Color; - +borderWidth: double; - +borderRadius: double; - +innerContent: Widget; - +innerContentBackgroundColor: Color? + +formKey: AuthFormKey | +Widget build() ] - [PhoneContainer]o-[Color] - [PhoneContainer]o-[<abstract>Widget] + [LoginForm]o-[AuthFormKey] + [<abstract>FormConsumerRefWidget]<:-[LoginForm] - [MobileFrame + [PasswordRecoveryForm + | + +formKey: AuthFormKey | +Widget build() ] - [DesktopFrame + [PasswordRecoveryForm]o-[AuthFormKey] + [<abstract>FormConsumerRefWidget]<:-[PasswordRecoveryForm] + + [PasswordForgotForm + | + +formKey: AuthFormKey | +Widget build() ] - [StudyController + [PasswordForgotForm]o-[AuthFormKey] + [<abstract>FormConsumerRefWidget]<:-[PasswordForgotForm] + + [SignupForm | - +notificationService: INotificationService; - +studyEventsSubscription: StreamSubscription<ModelEvent<Study>>?; - +studyActions: List<ModelAction<dynamic>> + +formKey: AuthFormKey | - +dynamic syncStudyStatus(); - +dynamic onStudySubscriptionUpdate(); - -dynamic _redirectNewToActualStudyID(); - +dynamic publishStudy(); - +void onChangeStudyParticipation(); - +void onAddParticipants(); - +void onSettingsPressed(); - +void dispose() + +Widget build(); + -dynamic _onClickTermsOfUse(); + -dynamic _onClickPrivacyPolicy() ] - [StudyController]o-[<abstract>INotificationService] - [StudyController]o-[StreamSubscription] - [StudyBaseController]<:-[StudyController] + [SignupForm]o-[AuthFormKey] + [<abstract>FormConsumerRefWidget]<:-[SignupForm] - [<abstract>IStudyAppBarViewModel + [AuthScaffold | - +isSyncIndicatorVisible: bool; - +isStatusBadgeVisible: bool; - +isPublishVisible: bool + +body: Widget; + +formKey: AuthFormKey; + +leftContentMinWidth: double; + +leftPanelMinWidth: double; + +leftPanelPadding: EdgeInsets ] - [<abstract>IStudyStatusBadgeViewModel]<:--[<abstract>IStudyAppBarViewModel] - [<abstract>IStudyNavViewModel]<:--[<abstract>IStudyAppBarViewModel] + [AuthScaffold]o-[<abstract>Widget] + [AuthScaffold]o-[AuthFormKey] + [AuthScaffold]o-[EdgeInsets] - [StudyScaffold + [EmailTextField | - +studyId: String; - +tabs: List<NavbarTab>?; - +tabsSubnav: List<NavbarTab>?; - +selectedTab: NavbarTab?; - +selectedTabSubnav: NavbarTab?; - +body: StudyPageWidget; - +drawer: Widget?; - +disableActions: bool; - +actionsSpacing: double; - +actionsPadding: double; - +layoutType: SingleColumnLayoutType?; - +appbarHeight: double; - +appbarSubnavHeight: double + +labelText: String; + +hintText: String?; + +formControlName: String?; + +formControl: FormControl<dynamic>? ] - [StudyScaffold]o-[NavbarTab] - [StudyScaffold]o-[<abstract>StudyPageWidget] - [StudyScaffold]o-[<abstract>Widget] - [StudyScaffold]o-[SingleColumnLayoutType] + [EmailTextField]o-[FormControl] - [PreviewFrame + [PasswordTextField | - +studyId: String; - +routeArgs: StudyFormRouteArgs?; - +route: String? + +labelText: String; + +hintText: String?; + +onSubmitted: dynamic Function(FormControl<dynamic>)?; + +formControlName: String?; + +formControl: FormControl<dynamic>? ] - [PreviewFrame]o-[<abstract>StudyFormRouteArgs] + [PasswordTextField]o-[dynamic Function(FormControl<dynamic>)?] + [PasswordTextField]o-[FormControl] - [RouteInformation - | - +route: String?; - +extra: String?; - +cmd: String?; - +data: String? + [StudyUJobsToBeDone | - +String toString() + +Widget build() ] - [<abstract>PlatformController + [AuthFormController | - +studyId: String; - +baseSrc: String; - +previewSrc: String; - +routeInformation: RouteInformation; - +frameWidget: Widget + +authRepository: IAuthRepository; + +notificationService: INotificationService; + +router: GoRouter; + +emailControl: FormControl<String>; + +passwordControl: FormControl<String>; + +passwordConfirmationControl: FormControl<String>; + +termsOfServiceControl: FormControl<bool>; + <static>+authValidationMessages: Map<String, String Function(dynamic)>; + +loginForm: FormGroup; + +signupForm: FormGroup; + +passwordForgotForm: FormGroup; + +passwordRecoveryForm: FormGroup; + +controlValidatorsByForm: Map<AuthFormKey, Map<FormControl<dynamic>, List<Validator<dynamic>>>>; + -_formKey: AuthFormKey; + +formKey: AuthFormKey; + +form: FormGroup | - +void activate(); - +void registerViews(); - +void generateUrl(); - +void navigate(); - +void refresh(); - +void listen(); - +void send(); - +void openNewPage() + -dynamic _getFormFor(); + -dynamic _onChangeFormKey(); + +dynamic resetControlsFor(); + -dynamic _forceValidationMessages(); + +dynamic signUp(); + -dynamic _signUp(); + +dynamic signIn(); + -dynamic _signInWith(); + +dynamic signOut(); + +dynamic resetPasswordForEmail(); + +dynamic sendPasswordResetLink(); + +dynamic recoverPassword(); + +dynamic updateUser(); + -dynamic _readDebugUser() ] - [<abstract>PlatformController]o-[RouteInformation] - [<abstract>PlatformController]o-[<abstract>Widget] + [AuthFormController]o-[<abstract>IAuthRepository] + [AuthFormController]o-[<abstract>INotificationService] + [AuthFormController]o-[GoRouter] + [AuthFormController]o-[FormControl] + [AuthFormController]o-[FormGroup] + [AuthFormController]o-[AuthFormKey] + [<abstract>IFormGroupController]<:--[AuthFormController] - [WebController - | - +iFrameElement: IFrameElement + [AuthFormKey | - +void activate(); - +void registerViews(); - +void generateUrl(); - +void navigate(); - +void refresh(); - +void openNewPage(); - +void listen(); - +void send() + +index: int; + <static>+values: List<AuthFormKey>; + <static>+login: AuthFormKey; + <static>+signup: AuthFormKey; + <static>+passwordForgot: AuthFormKey; + <static>+passwordRecovery: AuthFormKey; + <static>-_loginSubmit: AuthFormKey; + <static>-_signupSubmit: AuthFormKey ] - [WebController]o-[IFrameElement] - [<abstract>PlatformController]<:-[WebController] + [AuthFormKey]o-[AuthFormKey] + [Enum]<:--[AuthFormKey] - [MobileController + [AppStatus | - +void openNewPage(); - +void refresh(); - +void registerViews(); - +void listen(); - +void send(); - +void navigate(); - +void activate(); - +void generateUrl() + +index: int; + <static>+values: List<AppStatus>; + <static>+initializing: AppStatus; + <static>+initialized: AppStatus ] - [<abstract>PlatformController]<:-[MobileController] + [AppStatus]o-[AppStatus] + [Enum]<:--[AppStatus] - [StudyParticipationBadge + [FormArrayTable | - +participation: Participation; - +type: BadgeType; - +showPrefixIcon: bool; - +center: bool + +control: AbstractControl<dynamic>; + +items: List<T>; + +onSelectItem: void Function(T); + +getActionsAt: List<ModelAction<dynamic>> Function(T, int); + +onNewItem: void Function()?; + +rowTitle: String Function(T); + +onNewItemLabel: String; + +sectionTitle: String?; + +sectionDescription: String?; + +emptyIcon: IconData?; + +emptyTitle: String?; + +emptyDescription: String?; + +sectionTitleDivider: bool?; + +rowPrefix: Widget Function(BuildContext, T, int)?; + +rowSuffix: Widget Function(BuildContext, T, int)?; + +leadingWidget: Widget?; + +itemsSectionPadding: EdgeInsets?; + +hideLeadingTrailingWhenEmpty: bool; + <static>+columns: List<StandardTableColumn> | - +Widget build() + +Widget build(); + -List<Widget> _buildRow(); + -Widget _newItemButton() ] - [StudyParticipationBadge]o-[Participation] - [StudyParticipationBadge]o-[BadgeType] + [FormArrayTable]o-[<abstract>AbstractControl] + [FormArrayTable]o-[void Function(T)] + [FormArrayTable]o-[List<ModelAction<dynamic>> Function(T, int)] + [FormArrayTable]o-[void Function()?] + [FormArrayTable]o-[String Function(T)] + [FormArrayTable]o-[IconData] + [FormArrayTable]o-[Widget Function(BuildContext, T, int)?] + [FormArrayTable]o-[<abstract>Widget] + [FormArrayTable]o-[EdgeInsets] - [StudyTestScreen - | - +previewRoute: String? + [<abstract>ManagedFormViewModel | - +Widget build(); - +Widget? banner(); - +dynamic load(); - +dynamic save(); - +dynamic showHelp() + +ManagedFormViewModel<T> createDuplicate() ] - [<abstract>StudyPageWidget]<:-[StudyTestScreen] + [<abstract>FormViewModel]<:-[<abstract>ManagedFormViewModel] - [TestAppRoutes - | - <static>+studyOverview: String; - <static>+eligibility: String; - <static>+intervention: String; - <static>+consent: String; - <static>+journey: String; - <static>+dashboard: String + [FormViewModelNotFoundException ] - [<abstract>IStudyNavViewModel - | - +isEditTabEnabled: bool; - +isTestTabEnabled: bool; - +isRecruitTabEnabled: bool; - +isMonitorTabEnabled: bool; - +isAnalyzeTabEnabled: bool; - +isSettingsEnabled: bool - ] + [Exception]<:--[FormViewModelNotFoundException] - [StudyNav + [FormViewModelCollection | - <static>+dynamic tabs(); - <static>+dynamic edit(); - <static>+dynamic test(); - <static>+dynamic recruit(); - <static>+dynamic monitor(); - <static>+dynamic analyze() - ] - - [StudyDesignNav + +formViewModels: List<T>; + +formArray: FormArray<dynamic>; + +stagedViewModels: List<T>; + +retrievableViewModels: List<T>; + +formData: List<D> | - <static>+dynamic tabs(); - <static>+dynamic info(); - <static>+dynamic enrollment(); - <static>+dynamic interventions(); - <static>+dynamic measurements(); - <static>+dynamic reports() + +void add(); + +T remove(); + +T? findWhere(); + +T? removeWhere(); + +bool contains(); + +void stage(); + +T commit(); + +void reset(); + +void read() ] - [StudyTestController + [FormViewModelCollection]o-[FormArray] + + [CustomFormControl | - +authRepository: IAuthRepository; - +languageCode: String + -_onValueChangedDebouncer: Debouncer?; + -_onStatusChangedDebouncer: Debouncer?; + +onValueChanged: void Function(T?)?; + +onStatusChanged: void Function(ControlStatus)?; + +onStatusChangedDebounceTime: int?; + +onValueChangedDebounceTime: int? + | + +void dispose() ] - [StudyTestController]o-[<abstract>IAuthRepository] - [StudyBaseController]<:-[StudyTestController] + [CustomFormControl]o-[Debouncer] + [CustomFormControl]o-[void Function(T?)?] + [CustomFormControl]o-[void Function(ControlStatus)?] + [FormControl]<:-[CustomFormControl] - [<abstract>IStudyStatusBadgeViewModel + [UnsavedChangesDialog | - +studyParticipation: Participation?; - +studyStatus: StudyStatus? + +Widget build() ] - [<abstract>IStudyStatusBadgeViewModel]o-[Participation] - [<abstract>IStudyStatusBadgeViewModel]o-[StudyStatus] + [<abstract>FormValidationSetEnum + ] - [StudyStatusBadge + [FormControlValidation | - +participation: Participation?; - +status: StudyStatus?; - +type: BadgeType; - +showPrefixIcon: bool; - +showTooltip: bool + +control: AbstractControl<dynamic>; + +validators: List<Validator<dynamic>>; + +asyncValidators: List<AsyncValidator<dynamic>>?; + +validationMessages: Map<String, String Function(Object)> | - +Widget build() + +FormControlValidation merge() ] - [StudyStatusBadge]o-[Participation] - [StudyStatusBadge]o-[StudyStatus] - [StudyStatusBadge]o-[BadgeType] + [FormControlValidation]o-[<abstract>AbstractControl] - [FrameControlsWidget + [<abstract>IFormData | - +onRefresh: void Function()?; - +onOpenNewTab: void Function()?; - +enabled: bool + +id: String | - +Widget build() + +IFormData copy() ] - [FrameControlsWidget]o-[void Function()?] - [<abstract>ConsumerWidget]<:-[FrameControlsWidget] + [FormInvalidException + ] - [StudySettingsDialog + [Exception]<:--[FormInvalidException] + + [FormConfigException | - +Widget build() + +message: String? ] - [<abstract>StudyPageWidget]<:-[StudySettingsDialog] + [Exception]<:--[FormConfigException] - [StudySettingsFormViewModel + [<abstract>IFormViewModelDelegate | - +study: AsyncValue<Study>; - +studyRepository: IStudyRepository; - <static>+defaultPublishedToRegistry: bool; - <static>+defaultPublishedToRegistryResults: bool; - +isPublishedToRegistryControl: FormControl<bool>; - +isPublishedToRegistryResultsControl: FormControl<bool>; - +form: FormGroup; - +titles: Map<FormMode, String> + +dynamic onSave(); + +void onCancel() + ] + + [<abstract>IFormGroupController | - +void setControlsFrom(); - +Study buildFormData(); - +dynamic keepControlsSynced(); - +dynamic save(); - +dynamic setLaunchDefaults() + +form: FormGroup ] - [StudySettingsFormViewModel]o-[<abstract>AsyncValue] - [StudySettingsFormViewModel]o-[<abstract>IStudyRepository] - [StudySettingsFormViewModel]o-[FormControl] - [StudySettingsFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[StudySettingsFormViewModel] + [<abstract>IFormGroupController]o-[FormGroup] - [StudyBaseController - | - +studyId: String; - +studyRepository: IStudyRepository; - +router: GoRouter; - +studySubscription: StreamSubscription<WrappedModel<Study>>? + [FormControlOption | - +dynamic subscribeStudy(); - +dynamic onStudySubscriptionUpdate(); - +dynamic onStudySubscriptionError(); - +void dispose() + +value: T; + +label: String; + +description: String?; + +props: List<Object?> ] - [StudyBaseController]o-[<abstract>IStudyRepository] - [StudyBaseController]o-[GoRouter] - [StudyBaseController]o-[StreamSubscription] + [<abstract>Equatable]<:-[FormControlOption] - [<abstract>StudyPageWidget + [<abstract>FormViewModel | - +studyId: String + -_formData: T?; + -_formMode: FormMode; + -_validationSet: FormValidationSetEnum?; + +delegate: IFormViewModelDelegate<FormViewModel<dynamic>>?; + +autosave: bool; + -_immediateFormChildrenSubscriptions: List<StreamSubscription<dynamic>>; + -_immediateFormChildrenListenerDebouncer: Debouncer?; + -_autosaveOperation: CancelableOperation<dynamic>?; + -_defaultControlValidators: Map<String, Tuple<List<Validator<dynamic>>, List<AsyncValidator<dynamic>>>>; + +prevFormValue: Map<String, dynamic>?; + <static>-_formKey: String; + +formData: T?; + +formMode: FormMode; + +isReadonly: bool; + +validationSet: FormValidationSetEnum?; + +isDirty: bool; + +title: String; + +isValid: bool; + +titles: Map<FormMode, String>; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> | - +Widget? banner() + -dynamic _setFormData(); + -dynamic _rememberDefaultControlValidators(); + -Tuple<List<Validator<dynamic>>, List<AsyncValidator<dynamic>>>? _getDefaultValidators(); + -dynamic _disableAllControls(); + -dynamic _formModeUpdated(); + -dynamic _restoreControlsFromFormData(); + +void revalidate(); + -void _applyValidationSet(); + +void read(); + +dynamic save(); + +dynamic cancel(); + +void enableAutosave(); + +void listenToImmediateFormChildren(); + +dynamic markFormGroupChanged(); + +void dispose(); + +void setControlsFrom(); + +T buildFormData(); + +void initControls() ] - [<abstract>ConsumerWidget]<:-[<abstract>StudyPageWidget] - [<abstract>IWithBanner]<:--[<abstract>StudyPageWidget] + [<abstract>FormViewModel]o-[FormMode] + [<abstract>FormViewModel]o-[<abstract>FormValidationSetEnum] + [<abstract>FormViewModel]o-[<abstract>IFormViewModelDelegate] + [<abstract>FormViewModel]o-[Debouncer] + [<abstract>FormViewModel]o-[CancelableOperation] + [<abstract>IFormGroupController]<:--[<abstract>FormViewModel] - [AppStatus + [FormMode | +index: int; - <static>+values: List<AppStatus>; - <static>+initializing: AppStatus; - <static>+initialized: AppStatus + <static>+values: List<FormMode>; + <static>+create: FormMode; + <static>+readonly: FormMode; + <static>+edit: FormMode ] - [AppStatus]o-[AppStatus] - [Enum]<:--[AppStatus] + [FormMode]o-[FormMode] + [Enum]<:--[FormMode] - [<abstract>IAppDelegate + [EnrolledBadge | - +dynamic onAppStart() + +enrolledCount: int + | + +Widget build() ] - [AppController + [StudyRecruitController | - +appDelegates: List<IAppDelegate>; - -_delayedFuture: dynamic; - +isInitialized: dynamic + +inviteCodeRepository: IInviteCodeRepository; + -_invitesSubscription: StreamSubscription<List<WrappedModel<StudyInvite>>>? | - +dynamic onAppStart(); - -dynamic _callDelegates() + -dynamic _subscribeInvites(); + +Intervention? getIntervention(); + +int getParticipantCountForInvite(); + +List<ModelAction<dynamic>> availableActions(); + +List<ModelAction<dynamic>> availableInlineActions(); + +void dispose() ] - [App - ] + [StudyRecruitController]o-[<abstract>IInviteCodeRepository] + [StudyRecruitController]o-[StreamSubscription] + [StudyBaseController]<:-[StudyRecruitController] + [<abstract>IModelActionProvider]<:--[StudyRecruitController] - [AppContent + [StudyRecruitScreen + | + +Widget build(); + -Widget _inviteCodesSectionHeader(); + -Widget _newInviteCodeButton(); + -dynamic _onSelectInvite() ] - [AuthFormController + [<abstract>StudyPageWidget]<:-[StudyRecruitScreen] + + [InviteCodeFormView | - +authRepository: IAuthRepository; - +notificationService: INotificationService; - +router: GoRouter; - +emailControl: FormControl<String>; - +passwordControl: FormControl<String>; - +passwordConfirmationControl: FormControl<String>; - +termsOfServiceControl: FormControl<bool>; - <static>+authValidationMessages: Map<String, String Function(dynamic)>; - +loginForm: FormGroup; - +signupForm: FormGroup; - +passwordForgotForm: FormGroup; - +passwordRecoveryForm: FormGroup; - +controlValidatorsByForm: Map<AuthFormKey, Map<FormControl<dynamic>, List<Validator<dynamic>>>>; - -_formKey: AuthFormKey; - +formKey: AuthFormKey; - +form: FormGroup + +formViewModel: InviteCodeFormViewModel | - -dynamic _getFormFor(); - -dynamic _onChangeFormKey(); - +dynamic resetControlsFor(); - -dynamic _forceValidationMessages(); - +dynamic signUp(); - -dynamic _signUp(); - +dynamic signIn(); - -dynamic _signInWith(); - +dynamic signOut(); - +dynamic resetPasswordForEmail(); - +dynamic sendPasswordResetLink(); - +dynamic recoverPassword(); - +dynamic updateUser(); - -dynamic _readDebugUser() + +Widget build(); + -List<FormTableRow> _conditionalInterventionRows() ] - [AuthFormController]o-[<abstract>IAuthRepository] - [AuthFormController]o-[<abstract>INotificationService] - [AuthFormController]o-[GoRouter] - [AuthFormController]o-[FormControl] - [AuthFormController]o-[FormGroup] - [AuthFormController]o-[AuthFormKey] - [<abstract>IFormGroupController]<:--[AuthFormController] + [InviteCodeFormView]o-[InviteCodeFormViewModel] + [<abstract>FormConsumerWidget]<:-[InviteCodeFormView] - [AuthFormKey + [StudyInvitesTable | - +index: int; - <static>+values: List<AuthFormKey>; - <static>+login: AuthFormKey; - <static>+signup: AuthFormKey; - <static>+passwordForgot: AuthFormKey; - <static>+passwordRecovery: AuthFormKey; - <static>-_loginSubmit: AuthFormKey; - <static>-_signupSubmit: AuthFormKey + +invites: List<StudyInvite>; + +onSelect: void Function(StudyInvite); + +getActions: List<ModelAction<dynamic>> Function(StudyInvite); + +getInlineActions: List<ModelAction<dynamic>> Function(StudyInvite); + +getIntervention: Intervention? Function(String); + +getParticipantCountForInvite: int Function(StudyInvite) + | + +Widget build(); + -List<Widget> _buildRow() ] - [AuthFormKey]o-[AuthFormKey] - [Enum]<:--[AuthFormKey] + [StudyInvitesTable]o-[void Function(StudyInvite)] + [StudyInvitesTable]o-[List<ModelAction<dynamic>> Function(StudyInvite)] + [StudyInvitesTable]o-[Intervention? Function(String)] + [StudyInvitesTable]o-[int Function(StudyInvite)] - [PasswordRecoveryForm + [InviteCodeFormViewModel | - +formKey: AuthFormKey + +study: Study; + +inviteCodeRepository: IInviteCodeRepository; + +codeControl: FormControl<String>; + +codeControlValidationMessages: Map<String, String Function(dynamic)>; + +isPreconfiguredScheduleControl: FormControl<bool>; + +preconfiguredScheduleTypeControl: FormControl<PhaseSequence>; + +interventionAControl: FormControl<String>; + +interventionBControl: FormControl<String>; + +form: FormGroup; + +titles: Map<FormMode, String>; + +interventionControlOptions: List<FormControlOption<String>>; + +preconfiguredScheduleTypeOptions: List<FormControlOption<PhaseSequence>>; + +isPreconfiguredSchedule: bool; + +preconfiguredSchedule: List<String>? | - +Widget build() + +void initControls(); + -dynamic _uniqueInviteCode(); + +void regenerateCode(); + -String _generateCode(); + +StudyInvite buildFormData(); + +void setControlsFrom(); + +dynamic save() ] - [PasswordRecoveryForm]o-[AuthFormKey] - [<abstract>FormConsumerRefWidget]<:-[PasswordRecoveryForm] + [InviteCodeFormViewModel]o-[Study] + [InviteCodeFormViewModel]o-[<abstract>IInviteCodeRepository] + [InviteCodeFormViewModel]o-[FormControl] + [InviteCodeFormViewModel]o-[FormGroup] + [<abstract>FormViewModel]<:-[InviteCodeFormViewModel] - [PasswordForgotForm - | - +formKey: AuthFormKey + [PublishSuccessDialog | +Widget build() ] - [PasswordForgotForm]o-[AuthFormKey] - [<abstract>FormConsumerRefWidget]<:-[PasswordForgotForm] + [<abstract>StudyPageWidget]<:-[PublishSuccessDialog] - [LoginForm - | - +formKey: AuthFormKey + [PublishDialog | +Widget build() ] - [LoginForm]o-[AuthFormKey] - [<abstract>FormConsumerRefWidget]<:-[LoginForm] + [<abstract>StudyPageWidget]<:-[PublishDialog] - [EmailTextField + [PublishConfirmationDialog | - +labelText: String; - +hintText: String?; - +formControlName: String?; - +formControl: FormControl<dynamic>? + +Widget build() ] - [EmailTextField]o-[FormControl] + [<abstract>StudyPageWidget]<:-[PublishConfirmationDialog] - [PasswordTextField + [FrameControlsWidget | - +labelText: String; - +hintText: String?; - +onSubmitted: dynamic Function(FormControl<dynamic>)?; - +formControlName: String?; - +formControl: FormControl<dynamic>? + +onRefresh: void Function()?; + +onOpenNewTab: void Function()?; + +enabled: bool + | + +Widget build() ] - [PasswordTextField]o-[dynamic Function(FormControl<dynamic>)?] - [PasswordTextField]o-[FormControl] + [FrameControlsWidget]o-[void Function()?] + [<abstract>ConsumerWidget]<:-[FrameControlsWidget] - [SignupForm - | - +formKey: AuthFormKey + [<abstract>IStudyStatusBadgeViewModel | - +Widget build(); - -dynamic _onClickTermsOfUse(); - -dynamic _onClickPrivacyPolicy() + +studyParticipation: Participation?; + +studyStatus: StudyStatus? ] - [SignupForm]o-[AuthFormKey] - [<abstract>FormConsumerRefWidget]<:-[SignupForm] + [<abstract>IStudyStatusBadgeViewModel]o-[Participation] + [<abstract>IStudyStatusBadgeViewModel]o-[StudyStatus] - [StudyUJobsToBeDone + [StudyStatusBadge + | + +participation: Participation?; + +status: StudyStatus?; + +type: BadgeType; + +showPrefixIcon: bool; + +showTooltip: bool | +Widget build() ] - [AuthScaffold + [StudyStatusBadge]o-[Participation] + [StudyStatusBadge]o-[StudyStatus] + [StudyStatusBadge]o-[BadgeType] + + [RouteInformation | - +body: Widget; - +formKey: AuthFormKey; - +leftContentMinWidth: double; - +leftPanelMinWidth: double; - +leftPanelPadding: EdgeInsets + +route: String?; + +extra: String?; + +cmd: String?; + +data: String? + | + +String toString() ] - [AuthScaffold]o-[<abstract>Widget] - [AuthScaffold]o-[AuthFormKey] - [AuthScaffold]o-[EdgeInsets] - - [PublishDialog + [<abstract>PlatformController | - +Widget build() + +studyId: String; + +baseSrc: String; + +previewSrc: String; + +routeInformation: RouteInformation; + +frameWidget: Widget + | + +void activate(); + +void registerViews(); + +void generateUrl(); + +void navigate(); + +void refresh(); + +void listen(); + +void send(); + +void openNewPage() ] - [<abstract>StudyPageWidget]<:-[PublishDialog] + [<abstract>PlatformController]o-[RouteInformation] + [<abstract>PlatformController]o-[<abstract>Widget] - [PublishSuccessDialog + [WebController | - +Widget build() + +iFrameElement: IFrameElement + | + +void activate(); + +void registerViews(); + +void generateUrl(); + +void navigate(); + +void refresh(); + +void openNewPage(); + +void listen(); + +void send() ] - [<abstract>StudyPageWidget]<:-[PublishSuccessDialog] + [WebController]o-[IFrameElement] + [<abstract>PlatformController]<:-[WebController] - [PublishConfirmationDialog + [MobileController | - +Widget build() + +void openNewPage(); + +void refresh(); + +void registerViews(); + +void listen(); + +void send(); + +void navigate(); + +void activate(); + +void generateUrl() ] - [<abstract>StudyPageWidget]<:-[PublishConfirmationDialog] + [<abstract>PlatformController]<:-[MobileController] - [FormArrayTable + [StudyController | - +control: AbstractControl<dynamic>; - +items: List<T>; - +onSelectItem: void Function(T); - +getActionsAt: List<ModelAction<dynamic>> Function(T, int); - +onNewItem: void Function()?; - +rowTitle: String Function(T); - +onNewItemLabel: String; - +sectionTitle: String?; - +sectionDescription: String?; - +emptyIcon: IconData?; - +emptyTitle: String?; - +emptyDescription: String?; - +sectionTitleDivider: bool?; - +rowPrefix: Widget Function(BuildContext, T, int)?; - +rowSuffix: Widget Function(BuildContext, T, int)?; - +leadingWidget: Widget?; - +itemsSectionPadding: EdgeInsets?; - +hideLeadingTrailingWhenEmpty: bool; - <static>+columns: List<StandardTableColumn> + +notificationService: INotificationService; + +studyEventsSubscription: StreamSubscription<ModelEvent<Study>>?; + +studyActions: List<ModelAction<dynamic>> | - +Widget build(); - -List<Widget> _buildRow(); - -Widget _newItemButton() + +dynamic syncStudyStatus(); + +dynamic onStudySubscriptionUpdate(); + -dynamic _redirectNewToActualStudyID(); + +dynamic publishStudy(); + +void onChangeStudyParticipation(); + +void onAddParticipants(); + +void onSettingsPressed(); + +void dispose() ] - [FormArrayTable]o-[<abstract>AbstractControl] - [FormArrayTable]o-[void Function(T)] - [FormArrayTable]o-[List<ModelAction<dynamic>> Function(T, int)] - [FormArrayTable]o-[void Function()?] - [FormArrayTable]o-[String Function(T)] - [FormArrayTable]o-[IconData] - [FormArrayTable]o-[Widget Function(BuildContext, T, int)?] - [FormArrayTable]o-[<abstract>Widget] - [FormArrayTable]o-[EdgeInsets] + [StudyController]o-[<abstract>INotificationService] + [StudyController]o-[StreamSubscription] + [StudyBaseController]<:-[StudyController] - [<abstract>IFormData - | - +id: String + [<abstract>IStudyNavViewModel | - +IFormData copy() + +isEditTabEnabled: bool; + +isTestTabEnabled: bool; + +isRecruitTabEnabled: bool; + +isMonitorTabEnabled: bool; + +isAnalyzeTabEnabled: bool; + +isSettingsEnabled: bool ] - [<abstract>ManagedFormViewModel + [StudyNav | - +ManagedFormViewModel<T> createDuplicate() + <static>+dynamic tabs(); + <static>+dynamic edit(); + <static>+dynamic test(); + <static>+dynamic recruit(); + <static>+dynamic monitor(); + <static>+dynamic analyze() ] - [<abstract>FormViewModel]<:-[<abstract>ManagedFormViewModel] - - [FormViewModelNotFoundException + [StudyDesignNav + | + <static>+dynamic tabs(); + <static>+dynamic info(); + <static>+dynamic enrollment(); + <static>+dynamic interventions(); + <static>+dynamic measurements(); + <static>+dynamic reports() ] - [Exception]<:--[FormViewModelNotFoundException] - - [FormViewModelCollection + [<abstract>StudyPageWidget | - +formViewModels: List<T>; - +formArray: FormArray<dynamic>; - +stagedViewModels: List<T>; - +retrievableViewModels: List<T>; - +formData: List<D> + +studyId: String | - +void add(); - +T remove(); - +T? findWhere(); - +T? removeWhere(); - +bool contains(); - +void stage(); - +T commit(); - +void reset(); - +void read() - ] - - [FormViewModelCollection]o-[FormArray] - - [FormInvalidException + +Widget? banner() ] - [Exception]<:--[FormInvalidException] + [<abstract>ConsumerWidget]<:-[<abstract>StudyPageWidget] + [<abstract>IWithBanner]<:--[<abstract>StudyPageWidget] - [FormConfigException + [StudyParticipationBadge | - +message: String? + +participation: Participation; + +type: BadgeType; + +showPrefixIcon: bool; + +center: bool + | + +Widget build() ] - [Exception]<:--[FormConfigException] + [StudyParticipationBadge]o-[Participation] + [StudyParticipationBadge]o-[BadgeType] - [<abstract>IFormViewModelDelegate + [StudyBaseController | - +dynamic onSave(); - +void onCancel() - ] - - [<abstract>IFormGroupController + +studyId: String; + +studyRepository: IStudyRepository; + +router: GoRouter; + +studySubscription: StreamSubscription<WrappedModel<Study>>? | - +form: FormGroup + +dynamic subscribeStudy(); + +dynamic onStudySubscriptionUpdate(); + +dynamic onStudySubscriptionError(); + +void dispose() ] - [<abstract>IFormGroupController]o-[FormGroup] + [StudyBaseController]o-[<abstract>IStudyRepository] + [StudyBaseController]o-[GoRouter] + [StudyBaseController]o-[StreamSubscription] - [FormControlOption + [PreviewFrame | - +value: T; - +label: String; - +description: String?; - +props: List<Object?> + +studyId: String; + +routeArgs: StudyFormRouteArgs?; + +route: String? ] - [<abstract>Equatable]<:-[FormControlOption] + [PreviewFrame]o-[<abstract>StudyFormRouteArgs] - [<abstract>FormViewModel - | - -_formData: T?; - -_formMode: FormMode; - -_validationSet: FormValidationSetEnum?; - +delegate: IFormViewModelDelegate<FormViewModel<dynamic>>?; - +autosave: bool; - -_immediateFormChildrenSubscriptions: List<StreamSubscription<dynamic>>; - -_immediateFormChildrenListenerDebouncer: Debouncer?; - -_autosaveOperation: CancelableOperation<dynamic>?; - -_defaultControlValidators: Map<String, Tuple<List<Validator<dynamic>>, List<AsyncValidator<dynamic>>>>; - +prevFormValue: Map<String, dynamic>?; - <static>-_formKey: String; - +formData: T?; - +formMode: FormMode; - +isReadonly: bool; - +validationSet: FormValidationSetEnum?; - +isDirty: bool; - +title: String; - +isValid: bool; - +titles: Map<FormMode, String>; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + [<abstract>IStudyAppBarViewModel | - -dynamic _setFormData(); - -dynamic _rememberDefaultControlValidators(); - -Tuple<List<Validator<dynamic>>, List<AsyncValidator<dynamic>>>? _getDefaultValidators(); - -dynamic _disableAllControls(); - -dynamic _formModeUpdated(); - -dynamic _restoreControlsFromFormData(); - +void revalidate(); - -void _applyValidationSet(); - +void read(); - +dynamic save(); - +dynamic cancel(); - +void enableAutosave(); - +void listenToImmediateFormChildren(); - +dynamic markFormGroupChanged(); - +void dispose(); - +void setControlsFrom(); - +T buildFormData(); - +void initControls() + +isSyncIndicatorVisible: bool; + +isStatusBadgeVisible: bool; + +isPublishVisible: bool ] - [<abstract>FormViewModel]o-[FormMode] - [<abstract>FormViewModel]o-[<abstract>FormValidationSetEnum] - [<abstract>FormViewModel]o-[<abstract>IFormViewModelDelegate] - [<abstract>FormViewModel]o-[Debouncer] - [<abstract>FormViewModel]o-[CancelableOperation] - [<abstract>IFormGroupController]<:--[<abstract>FormViewModel] + [<abstract>IStudyStatusBadgeViewModel]<:--[<abstract>IStudyAppBarViewModel] + [<abstract>IStudyNavViewModel]<:--[<abstract>IStudyAppBarViewModel] - [FormMode + [StudyScaffold | - +index: int; - <static>+values: List<FormMode>; - <static>+create: FormMode; - <static>+readonly: FormMode; - <static>+edit: FormMode + +studyId: String; + +tabs: List<NavbarTab>?; + +tabsSubnav: List<NavbarTab>?; + +selectedTab: NavbarTab?; + +selectedTabSubnav: NavbarTab?; + +body: StudyPageWidget; + +drawer: Widget?; + +disableActions: bool; + +actionsSpacing: double; + +actionsPadding: double; + +layoutType: SingleColumnLayoutType?; + +appbarHeight: double; + +appbarSubnavHeight: double ] - [FormMode]o-[FormMode] - [Enum]<:--[FormMode] + [StudyScaffold]o-[NavbarTab] + [StudyScaffold]o-[<abstract>StudyPageWidget] + [StudyScaffold]o-[<abstract>Widget] + [StudyScaffold]o-[SingleColumnLayoutType] - [CustomFormControl + [WebFrame | - -_onValueChangedDebouncer: Debouncer?; - -_onStatusChangedDebouncer: Debouncer?; - +onValueChanged: void Function(T?)?; - +onStatusChanged: void Function(ControlStatus)?; - +onStatusChangedDebounceTime: int?; - +onValueChangedDebounceTime: int? + +previewSrc: String; + +studyId: String | - +void dispose() + +Widget build() ] - [CustomFormControl]o-[Debouncer] - [CustomFormControl]o-[void Function(T?)?] - [CustomFormControl]o-[void Function(ControlStatus)?] - [FormControl]<:-[CustomFormControl] - - [UnsavedChangesDialog + [DisabledFrame | +Widget build() ] - [<abstract>FormValidationSetEnum - ] - - [FormControlValidation - | - +control: AbstractControl<dynamic>; - +validators: List<Validator<dynamic>>; - +asyncValidators: List<AsyncValidator<dynamic>>?; - +validationMessages: Map<String, String Function(Object)> + [PhoneContainer | - +FormControlValidation merge() - ] - - [FormControlValidation]o-[<abstract>AbstractControl] - - [ScreenerQuestionFormViewModel - | - <static>+defaultResponseOptionValidity: bool; - +responseOptionsDisabledArray: FormArray<dynamic>; - +responseOptionsLogicControls: FormArray<bool>; - +responseOptionsLogicDescriptionControls: FormArray<String>; - -_questionBaseControls: Map<String, AbstractControl<dynamic>>; - +prevResponseOptionControls: List<AbstractControl<dynamic>>; - +prevResponseOptionValues: List<dynamic>; - +responseOptionsDisabledControls: List<AbstractControl<dynamic>>; - +logicControlOptions: List<FormControlOption<bool>>; - +questionBaseControls: Map<String, AbstractControl<dynamic>>; - +isDirtyOptionsBannerVisible: bool + <static>+defaultWidth: double; + <static>+defaultHeight: double; + +width: double; + +height: double; + +borderColor: Color; + +borderWidth: double; + +borderRadius: double; + +innerContent: Widget; + +innerContentBackgroundColor: Color? | - +dynamic onResponseOptionsChanged(); - +void setControlsFrom(); - +QuestionFormData buildFormData(); - -List<FormControl<dynamic>> _copyFormControls(); - -AbstractControl<dynamic>? _findAssociatedLogicControlFor(); - -AbstractControl<dynamic>? _findAssociatedControlFor(); - +ScreenerQuestionFormViewModel createDuplicate() + +Widget build() ] - [ScreenerQuestionFormViewModel]o-[FormArray] - [QuestionFormViewModel]<:-[ScreenerQuestionFormViewModel] - [<abstract>IScreenerQuestionLogicFormViewModel]<:--[ScreenerQuestionFormViewModel] + [PhoneContainer]o-[Color] + [PhoneContainer]o-[<abstract>Widget] - [StudyDesignEnrollmentFormView + [MobileFrame | - +Widget build(); - -dynamic _showScreenerQuestionSidesheetWithArgs(); - -dynamic _showConsentItemSidesheetWithArgs() + +Widget build() ] - [<abstract>StudyDesignPageWidget]<:-[StudyDesignEnrollmentFormView] - - [<abstract>IScreenerQuestionLogicFormViewModel + [DesktopFrame | - +isDirtyOptionsBannerVisible: bool + +Widget build() ] - [ScreenerQuestionLogicFormView + [StudyTestScreen | - +formViewModel: ScreenerQuestionFormViewModel + +previewRoute: String? | +Widget build(); - -dynamic _buildInfoBanner(); - -dynamic _buildAnswerOptionsLogicControls(); - -List<Widget> _buildOptionLogicRow() + +Widget? banner(); + +dynamic load(); + +dynamic save(); + +dynamic showHelp() ] - [ScreenerQuestionLogicFormView]o-[ScreenerQuestionFormViewModel] - [<abstract>FormConsumerWidget]<:-[ScreenerQuestionLogicFormView] + [<abstract>StudyPageWidget]<:-[StudyTestScreen] - [ConsentItemFormData + [StudySettingsFormViewModel | - +consentId: String; - +title: String; - +description: String; - +iconName: String?; - +id: String + +study: AsyncValue<Study>; + +studyRepository: IStudyRepository; + <static>+defaultPublishedToRegistry: bool; + <static>+defaultPublishedToRegistryResults: bool; + +isPublishedToRegistryControl: FormControl<bool>; + +isPublishedToRegistryResultsControl: FormControl<bool>; + +form: FormGroup; + +titles: Map<FormMode, String> | - +ConsentItem toConsentItem(); - +ConsentItemFormData copy() + +void setControlsFrom(); + +Study buildFormData(); + +dynamic keepControlsSynced(); + +dynamic save(); + +dynamic setLaunchDefaults() ] - [<abstract>IFormData]<:-[ConsentItemFormData] + [StudySettingsFormViewModel]o-[<abstract>AsyncValue] + [StudySettingsFormViewModel]o-[<abstract>IStudyRepository] + [StudySettingsFormViewModel]o-[FormControl] + [StudySettingsFormViewModel]o-[FormGroup] + [<abstract>FormViewModel]<:-[StudySettingsFormViewModel] - [EnrollmentFormViewModel + [StudySettingsDialog | - +study: Study; - +router: GoRouter; - +consentItemDelegate: EnrollmentFormConsentItemDelegate; - +enrollmentTypeControl: FormControl<Participation>; - +consentItemArray: FormArray<dynamic>; - +consentItemFormViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData>; - +form: FormGroup; - +enrollmentTypeControlOptions: List<FormControlOption<Participation>>; - +consentItemModels: List<ConsentItemFormViewModel>; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titles: Map<FormMode, String>; - +canTestScreener: bool; - +canTestConsent: bool; - +questionTitles: Map<FormMode, String Function()> + +Widget build() + ] + + [<abstract>StudyPageWidget]<:-[StudySettingsDialog] + + [StudyTestController | - +void setControlsFrom(); - +EnrollmentFormData buildFormData(); - +void read(); - +List<ModelAction<dynamic>> availableActions(); - +List<ModelAction<dynamic>> availablePopupActions(); - +List<ModelAction<dynamic>> availableInlineActions(); - +void onSelectItem(); - +void onNewItem(); - +ScreenerQuestionFormRouteArgs buildNewScreenerQuestionFormRouteArgs(); - +ScreenerQuestionFormRouteArgs buildScreenerQuestionFormRouteArgs(); - +ConsentItemFormRouteArgs buildNewConsentItemFormRouteArgs(); - +ConsentItemFormRouteArgs buildConsentItemFormRouteArgs(); - +dynamic testScreener(); - +dynamic testConsent(); - +ScreenerQuestionFormViewModel provideQuestionFormViewModel() + +authRepository: IAuthRepository; + +languageCode: String ] - [EnrollmentFormViewModel]o-[Study] - [EnrollmentFormViewModel]o-[GoRouter] - [EnrollmentFormViewModel]o-[EnrollmentFormConsentItemDelegate] - [EnrollmentFormViewModel]o-[FormControl] - [EnrollmentFormViewModel]o-[FormArray] - [EnrollmentFormViewModel]o-[FormViewModelCollection] - [EnrollmentFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[EnrollmentFormViewModel] - [<abstract>WithQuestionnaireControls]<:-[EnrollmentFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[EnrollmentFormViewModel] - [<abstract>IListActionProvider]<:--[EnrollmentFormViewModel] - [<abstract>IProviderArgsResolver]<:--[EnrollmentFormViewModel] + [StudyTestController]o-[<abstract>IAuthRepository] + [StudyBaseController]<:-[StudyTestController] - [EnrollmentFormConsentItemDelegate + [TestAppRoutes | - +formViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData>; - +owner: EnrollmentFormViewModel; - +propagateOnSave: bool; - +validationSet: dynamic + <static>+studyOverview: String; + <static>+eligibility: String; + <static>+intervention: String; + <static>+consent: String; + <static>+journey: String; + <static>+dashboard: String + ] + + [DrawerEntry | - +void onCancel(); - +dynamic onSave(); - +ConsentItemFormViewModel provide(); - +List<ModelAction<dynamic>> availableActions(); - +void onNewItem(); - +void onSelectItem() + +localizedTitle: String Function(); + +icon: IconData?; + +localizedHelpText: String Function()?; + +enabled: bool; + +onSelected: void Function(BuildContext, WidgetRef)?; + +autoCloseDrawer: bool; + +title: String; + +helpText: String? + | + +void onClick() ] - [EnrollmentFormConsentItemDelegate]o-[FormViewModelCollection] - [EnrollmentFormConsentItemDelegate]o-[EnrollmentFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[EnrollmentFormConsentItemDelegate] - [<abstract>IListActionProvider]<:--[EnrollmentFormConsentItemDelegate] - [<abstract>IProviderArgsResolver]<:--[EnrollmentFormConsentItemDelegate] + [DrawerEntry]o-[String Function()] + [DrawerEntry]o-[IconData] + [DrawerEntry]o-[String Function()?] + [DrawerEntry]o-[void Function(BuildContext, WidgetRef)?] - [ConsentItemFormViewModel + [GoRouterDrawerEntry | - +consentIdControl: FormControl<String>; - +titleControl: FormControl<String>; - +descriptionControl: FormControl<String>; - +iconControl: FormControl<IconOption>; - +form: FormGroup; - +consentId: String; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titleRequired: dynamic; - +descriptionRequired: dynamic; - +titles: Map<FormMode, String> + +intent: RoutingIntent; + +onNavigated: void Function()? | - +void setControlsFrom(); - +ConsentItemFormData buildFormData(); - +ConsentItemFormViewModel createDuplicate() + +void onClick() ] - [ConsentItemFormViewModel]o-[FormControl] - [ConsentItemFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[ConsentItemFormViewModel] + [GoRouterDrawerEntry]o-[RoutingIntent] + [GoRouterDrawerEntry]o-[void Function()?] + [DrawerEntry]<:-[GoRouterDrawerEntry] - [ConsentItemFormView + [AppDrawer | - +formViewModel: ConsentItemFormViewModel + +width: int; + +autoCloseDrawer: bool; + +leftPaddingEntries: double; + +logoPaddingVertical: double; + +logoPaddingHorizontal: double; + +logoMaxHeight: double; + +logoSectionMinHeight: double; + +logoSectionMaxHeight: double ] - [ConsentItemFormView]o-[ConsentItemFormViewModel] - - [EnrollmentFormData + [StudyAnalyzeScreen | - <static>+kDefaultEnrollmentType: Participation; - +enrollmentType: Participation; - +questionnaireFormData: QuestionnaireFormData; - +consentItemsFormData: List<ConsentItemFormData>?; - +id: String + +Widget? banner(); + +Widget build() + ] + + [<abstract>StudyPageWidget]<:-[StudyAnalyzeScreen] + + [StudyAnalyzeController | - +Study apply(); - +EnrollmentFormData copy() + +dynamic onExport() ] - [EnrollmentFormData]o-[Participation] - [EnrollmentFormData]o-[QuestionnaireFormData] - [<abstract>IStudyFormData]<:--[EnrollmentFormData] + [StudyBaseController]<:-[StudyAnalyzeController] [StudyDesignInterventionsFormView | @@ -924,84 +898,33 @@ [<abstract>StudyDesignPageWidget]<:-[StudyDesignInterventionsFormView] - [InterventionsFormViewModel - | - +study: Study; - +router: GoRouter; - +interventionsArray: FormArray<dynamic>; - +interventionsCollection: FormViewModelCollection<InterventionFormViewModel, InterventionFormData>; - +form: FormGroup; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +interventionsRequired: dynamic; - +titles: Map<FormMode, String>; - +canTestStudySchedule: bool + [InterventionFormView | - +void setControlsFrom(); - +InterventionsFormData buildFormData(); - +void read(); - +List<ModelAction<dynamic>> availableActions(); - +List<ModelAction<dynamic>> availablePopupActions(); - +List<ModelAction<dynamic>> availableInlineActions(); - +void onSelectItem(); - +void onNewItem(); - +InterventionFormViewModel provide(); - +void onCancel(); - +dynamic onSave(); - +dynamic testStudySchedule() + +formViewModel: InterventionFormViewModel ] - [InterventionsFormViewModel]o-[Study] - [InterventionsFormViewModel]o-[GoRouter] - [InterventionsFormViewModel]o-[FormArray] - [InterventionsFormViewModel]o-[FormViewModelCollection] - [InterventionsFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[InterventionsFormViewModel] - [<abstract>StudyScheduleControls]<:-[InterventionsFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[InterventionsFormViewModel] - [<abstract>IListActionProvider]<:--[InterventionsFormViewModel] - [<abstract>IProviderArgsResolver]<:--[InterventionsFormViewModel] + [InterventionFormView]o-[InterventionFormViewModel] - [InterventionFormViewModel + [InterventionPreview | - +study: Study; - +interventionIdControl: FormControl<String>; - +interventionTitleControl: FormControl<String>; - +interventionIconControl: FormControl<IconOption>; - +interventionDescriptionControl: FormControl<String>; - +interventionTasksArray: FormArray<dynamic>; - +tasksCollection: FormViewModelCollection<InterventionTaskFormViewModel, InterventionTaskFormData>; - +form: FormGroup; - +interventionId: String; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titleRequired: dynamic; - +atLeastOneTask: dynamic; - +breadcrumbsTitle: String; - +titles: Map<FormMode, String> + +routeArgs: InterventionFormRouteArgs | - +void setControlsFrom(); - +InterventionFormData buildFormData(); - +List<ModelAction<dynamic>> availableActions(); - +List<ModelAction<dynamic>> availablePopupActions(); - +List<ModelAction<dynamic>> availableInlineActions(); - +void onSelectItem(); - +void onNewItem(); - +void onCancel(); - +dynamic onSave(); - +InterventionTaskFormViewModel provide(); - +InterventionTaskFormRouteArgs buildNewFormRouteArgs(); - +InterventionTaskFormRouteArgs buildFormRouteArgs(); - +InterventionFormViewModel createDuplicate() + +Widget build() ] - [InterventionFormViewModel]o-[Study] - [InterventionFormViewModel]o-[FormControl] - [InterventionFormViewModel]o-[FormArray] - [InterventionFormViewModel]o-[FormViewModelCollection] - [InterventionFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[InterventionFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[InterventionFormViewModel] - [<abstract>IListActionProvider]<:--[InterventionFormViewModel] - [<abstract>IProviderArgsResolver]<:--[InterventionFormViewModel] + [InterventionPreview]o-[InterventionFormRouteArgs] + [<abstract>ConsumerWidget]<:-[InterventionPreview] + + [StudyScheduleFormView + | + +formViewModel: StudyScheduleControls + | + -FormTableRow _renderCustomSequence(); + +Widget build() + ] + + [StudyScheduleFormView]o-[<abstract>StudyScheduleControls] + [<abstract>FormConsumerWidget]<:-[StudyScheduleFormView] [InterventionTaskFormData | @@ -1017,32 +940,42 @@ [<abstract>IFormDataWithSchedule]<:-[InterventionTaskFormData] - [StudyScheduleFormData - | - +sequenceType: PhaseSequence; - +sequenceTypeCustom: String; - +numCycles: int; - +phaseDuration: int; - +includeBaseline: bool; - +id: String - | - +StudySchedule toStudySchedule(); - +Study apply(); - +StudyScheduleFormData copy() - ] - - [StudyScheduleFormData]o-[PhaseSequence] - [<abstract>IStudyFormData]<:--[StudyScheduleFormData] - - [InterventionPreview + [InterventionsFormViewModel | - +routeArgs: InterventionFormRouteArgs + +study: Study; + +router: GoRouter; + +interventionsArray: FormArray<dynamic>; + +interventionsCollection: FormViewModelCollection<InterventionFormViewModel, InterventionFormData>; + +form: FormGroup; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +interventionsRequired: dynamic; + +titles: Map<FormMode, String>; + +canTestStudySchedule: bool | - +Widget build() + +void setControlsFrom(); + +InterventionsFormData buildFormData(); + +void read(); + +List<ModelAction<dynamic>> availableActions(); + +List<ModelAction<dynamic>> availablePopupActions(); + +List<ModelAction<dynamic>> availableInlineActions(); + +void onSelectItem(); + +void onNewItem(); + +InterventionFormViewModel provide(); + +void onCancel(); + +dynamic onSave(); + +dynamic testStudySchedule() ] - [InterventionPreview]o-[InterventionFormRouteArgs] - [<abstract>ConsumerWidget]<:-[InterventionPreview] + [InterventionsFormViewModel]o-[Study] + [InterventionsFormViewModel]o-[GoRouter] + [InterventionsFormViewModel]o-[FormArray] + [InterventionsFormViewModel]o-[FormViewModelCollection] + [InterventionsFormViewModel]o-[FormGroup] + [<abstract>FormViewModel]<:-[InterventionsFormViewModel] + [<abstract>StudyScheduleControls]<:-[InterventionsFormViewModel] + [<abstract>IFormViewModelDelegate]<:--[InterventionsFormViewModel] + [<abstract>IListActionProvider]<:--[InterventionsFormViewModel] + [<abstract>IProviderArgsResolver]<:--[InterventionsFormViewModel] [InterventionTaskFormViewModel | @@ -1068,26 +1001,6 @@ [<abstract>ManagedFormViewModel]<:-[InterventionTaskFormViewModel] [<abstract>WithScheduleControls]<:-[InterventionTaskFormViewModel] - [InterventionsFormData - | - +interventionsData: List<InterventionFormData>; - +studyScheduleData: StudyScheduleFormData; - +id: String - | - +Study apply(); - +InterventionsFormData copy() - ] - - [InterventionsFormData]o-[StudyScheduleFormData] - [<abstract>IStudyFormData]<:--[InterventionsFormData] - - [InterventionFormView - | - +formViewModel: InterventionFormViewModel - ] - - [InterventionFormView]o-[InterventionFormViewModel] - [<abstract>StudyScheduleControls | <static>+defaultScheduleType: PhaseSequence; @@ -1118,13 +1031,6 @@ [<abstract>StudyScheduleControls]o-[PhaseSequence] [<abstract>StudyScheduleControls]o-[FormControl] - [InterventionTaskFormView - | - +formViewModel: InterventionTaskFormViewModel - ] - - [InterventionTaskFormView]o-[InterventionTaskFormViewModel] - [InterventionFormData | +interventionId: String; @@ -1141,235 +1047,257 @@ [<abstract>IFormData]<:-[InterventionFormData] - [StudyScheduleFormView + [StudyScheduleFormData | - +formViewModel: StudyScheduleControls + +sequenceType: PhaseSequence; + +sequenceTypeCustom: String; + +numCycles: int; + +phaseDuration: int; + +includeBaseline: bool; + +id: String | - -FormTableRow _renderCustomSequence(); - +Widget build() + +StudySchedule toStudySchedule(); + +Study apply(); + +StudyScheduleFormData copy() ] - [StudyScheduleFormView]o-[<abstract>StudyScheduleControls] - [<abstract>FormConsumerWidget]<:-[StudyScheduleFormView] + [StudyScheduleFormData]o-[PhaseSequence] + [<abstract>IStudyFormData]<:--[StudyScheduleFormData] - [<abstract>IStudyFormData + [InterventionTaskFormView | - +Study apply() + +formViewModel: InterventionTaskFormViewModel ] - [<abstract>IFormData]<:--[<abstract>IStudyFormData] + [InterventionTaskFormView]o-[InterventionTaskFormViewModel] - [StudyInfoFormData + [InterventionsFormData | - +title: String; - +description: String?; - +iconName: String; - +contactInfoFormData: StudyContactInfoFormData; + +interventionsData: List<InterventionFormData>; + +studyScheduleData: StudyScheduleFormData; +id: String | +Study apply(); - +StudyInfoFormData copy() + +InterventionsFormData copy() ] - [StudyInfoFormData]o-[StudyContactInfoFormData] - [<abstract>IStudyFormData]<:--[StudyInfoFormData] + [InterventionsFormData]o-[StudyScheduleFormData] + [<abstract>IStudyFormData]<:--[InterventionsFormData] - [StudyContactInfoFormData + [InterventionFormViewModel | - +organization: String?; - +institutionalReviewBoard: String?; - +institutionalReviewBoardNumber: String?; - +researchers: String?; - +email: String?; - +website: String?; - +phone: String?; - +additionalInfo: String?; - +id: String + +study: Study; + +interventionIdControl: FormControl<String>; + +interventionTitleControl: FormControl<String>; + +interventionIconControl: FormControl<IconOption>; + +interventionDescriptionControl: FormControl<String>; + +interventionTasksArray: FormArray<dynamic>; + +tasksCollection: FormViewModelCollection<InterventionTaskFormViewModel, InterventionTaskFormData>; + +form: FormGroup; + +interventionId: String; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +titleRequired: dynamic; + +atLeastOneTask: dynamic; + +breadcrumbsTitle: String; + +titles: Map<FormMode, String> | - +Study apply(); - +StudyInfoFormData copy() + +void setControlsFrom(); + +InterventionFormData buildFormData(); + +List<ModelAction<dynamic>> availableActions(); + +List<ModelAction<dynamic>> availablePopupActions(); + +List<ModelAction<dynamic>> availableInlineActions(); + +void onSelectItem(); + +void onNewItem(); + +void onCancel(); + +dynamic onSave(); + +InterventionTaskFormViewModel provide(); + +InterventionTaskFormRouteArgs buildNewFormRouteArgs(); + +InterventionTaskFormRouteArgs buildFormRouteArgs(); + +InterventionFormViewModel createDuplicate() ] - [<abstract>IStudyFormData]<:--[StudyContactInfoFormData] + [InterventionFormViewModel]o-[Study] + [InterventionFormViewModel]o-[FormControl] + [InterventionFormViewModel]o-[FormArray] + [InterventionFormViewModel]o-[FormViewModelCollection] + [InterventionFormViewModel]o-[FormGroup] + [<abstract>ManagedFormViewModel]<:-[InterventionFormViewModel] + [<abstract>IFormViewModelDelegate]<:--[InterventionFormViewModel] + [<abstract>IListActionProvider]<:--[InterventionFormViewModel] + [<abstract>IProviderArgsResolver]<:--[InterventionFormViewModel] - [StudyDesignInfoFormView + [StudyDesignReportsFormView | - +Widget build() + +Widget build(); + -dynamic _showReportItemSidesheetWithArgs() ] - [<abstract>StudyDesignPageWidget]<:-[StudyDesignInfoFormView] + [<abstract>StudyDesignPageWidget]<:-[StudyDesignReportsFormView] - [StudyInfoFormViewModel + [ReportItemFormData | - +study: Study; - +titleControl: FormControl<String>; - +iconControl: FormControl<IconOption>; - +descriptionControl: FormControl<String>; - +organizationControl: FormControl<String>; - +reviewBoardControl: FormControl<String>; - +reviewBoardNumberControl: FormControl<String>; - +researchersControl: FormControl<String>; - +emailControl: FormControl<String>; - +websiteControl: FormControl<String>; - +phoneControl: FormControl<String>; - +additionalInfoControl: FormControl<String>; - +form: FormGroup; - +titles: Map<FormMode, String>; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titleRequired: dynamic; - +descriptionRequired: dynamic; - +iconRequired: dynamic; - +organizationRequired: dynamic; - +reviewBoardRequired: dynamic; - +reviewBoardNumberRequired: dynamic; - +researchersRequired: dynamic; - +emailRequired: dynamic; - +phoneRequired: dynamic; - +emailFormat: dynamic; - +websiteFormat: dynamic + +isPrimary: bool; + +section: ReportSection; + +id: String | - +void setControlsFrom(); - +StudyInfoFormData buildFormData() + <static>+dynamic fromDomainModel(); + +ReportItemFormData copy() ] - [StudyInfoFormViewModel]o-[Study] - [StudyInfoFormViewModel]o-[FormControl] - [StudyInfoFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[StudyInfoFormViewModel] + [ReportItemFormData]o-[<abstract>ReportSection] + [<abstract>IFormData]<:-[ReportItemFormData] - [MeasurementSurveyFormData + [DataReferenceEditor | - +measurementId: String; - +title: String; - +introText: String?; - +outroText: String?; - +questionnaireFormData: QuestionnaireFormData; - <static>+kDefaultTitle: String; - +id: String + +formControl: FormControl<DataReferenceIdentifier<T>>; + +availableTasks: List<Task>; + +buildReactiveDropdownField: ReactiveDropdownField<dynamic> | - +QuestionnaireTask toQuestionnaireTask(); - +MeasurementSurveyFormData copy() + +FormTableRow buildFormTableRow(); + -List<DropdownMenuItem<DataReferenceIdentifier<dynamic>>> _dataReferenceItems() ] - [MeasurementSurveyFormData]o-[QuestionnaireFormData] - [<abstract>IFormDataWithSchedule]<:-[MeasurementSurveyFormData] + [DataReferenceEditor]o-[FormControl] + [DataReferenceEditor]o-[ReactiveDropdownField] - [MeasurementSurveyFormView + [TemporalAggregationFormatted | - +formViewModel: MeasurementSurveyFormViewModel + -_value: TemporalAggregation; + <static>+values: List<TemporalAggregationFormatted>; + +value: TemporalAggregation; + +string: String; + +icon: IconData?; + +hashCode: int + | + +bool ==(); + +String toString(); + +String toJson(); + <static>+TemporalAggregationFormatted fromJson() ] - [MeasurementSurveyFormView]o-[MeasurementSurveyFormViewModel] + [TemporalAggregationFormatted]o-[TemporalAggregation] + [TemporalAggregationFormatted]o-[IconData] - [MeasurementSurveyFormViewModel + [ImprovementDirectionFormatted | - +study: Study; - +measurementIdControl: FormControl<String>; - +instanceIdControl: FormControl<String>; - +surveyTitleControl: FormControl<String>; - +surveyIntroTextControl: FormControl<String>; - +surveyOutroTextControl: FormControl<String>; - +form: FormGroup; - +measurementId: String; - +instanceId: String; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titleRequired: dynamic; - +atLeastOneQuestion: dynamic; - +breadcrumbsTitle: String; - +titles: Map<FormMode, String> + -_value: ImprovementDirection; + <static>+values: List<ImprovementDirectionFormatted>; + +value: ImprovementDirection; + +string: String; + +icon: IconData?; + +hashCode: int | - +void setControlsFrom(); - +MeasurementSurveyFormData buildFormData(); - +List<ModelAction<dynamic>> availableActions(); - +List<ModelAction<dynamic>> availablePopupActions(); - +List<ModelAction<dynamic>> availableInlineActions(); - +void onSelectItem(); - +void onNewItem(); - +SurveyQuestionFormRouteArgs buildNewFormRouteArgs(); - +SurveyQuestionFormRouteArgs buildFormRouteArgs(); - +MeasurementSurveyFormViewModel createDuplicate() + +bool ==(); + +String toString(); + +String toJson(); + <static>+ImprovementDirectionFormatted fromJson() ] - [MeasurementSurveyFormViewModel]o-[Study] - [MeasurementSurveyFormViewModel]o-[FormControl] - [MeasurementSurveyFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[MeasurementSurveyFormViewModel] - [<abstract>WithQuestionnaireControls]<:-[MeasurementSurveyFormViewModel] - [<abstract>WithScheduleControls]<:-[MeasurementSurveyFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[MeasurementSurveyFormViewModel] - [<abstract>IListActionProvider]<:--[MeasurementSurveyFormViewModel] - [<abstract>IProviderArgsResolver]<:--[MeasurementSurveyFormViewModel] + [ImprovementDirectionFormatted]o-[ImprovementDirection] + [ImprovementDirectionFormatted]o-[IconData] - [SurveyPreview + [ReportSectionType | - +routeArgs: MeasurementFormRouteArgs + +index: int; + <static>+values: List<ReportSectionType>; + <static>+average: ReportSectionType; + <static>+linearRegression: ReportSectionType + ] + + [ReportSectionType]o-[ReportSectionType] + [Enum]<:--[ReportSectionType] + + [AverageSectionFormView + | + +formViewModel: ReportItemFormViewModel; + +studyId: String; + +reportSectionColumnWidth: Map<int, TableColumnWidth> | +Widget build() ] - [SurveyPreview]o-[MeasurementFormRouteArgs] - [<abstract>ConsumerWidget]<:-[SurveyPreview] + [AverageSectionFormView]o-[ReportItemFormViewModel] + [<abstract>ConsumerWidget]<:-[AverageSectionFormView] - [StudyDesignMeasurementsFormView + [DataReferenceIdentifier | - +Widget build() + +hashCode: int + | + +bool ==() ] - [<abstract>StudyDesignPageWidget]<:-[StudyDesignMeasurementsFormView] + [DataReference]<:-[DataReferenceIdentifier] - [MeasurementsFormData + [LinearRegressionSectionFormView | - +surveyMeasurements: List<MeasurementSurveyFormData>; - +id: String + +formViewModel: ReportItemFormViewModel; + +studyId: String; + +reportSectionColumnWidth: Map<int, TableColumnWidth> | - +Study apply(); - +MeasurementsFormData copy() + +Widget build() ] - [<abstract>IStudyFormData]<:--[MeasurementsFormData] + [LinearRegressionSectionFormView]o-[ReportItemFormViewModel] + [<abstract>ConsumerWidget]<:-[LinearRegressionSectionFormView] - [MeasurementsFormViewModel + [ReportItemFormViewModel | - +study: Study; - +router: GoRouter; - +measurementsArray: FormArray<dynamic>; - +surveyMeasurementFormViewModels: FormViewModelCollection<MeasurementSurveyFormViewModel, MeasurementSurveyFormData>; + <static>+defaultSectionType: ReportSectionType; + +sectionIdControl: FormControl<String>; + +sectionTypeControl: FormControl<ReportSectionType>; + +titleControl: FormControl<String>; + +descriptionControl: FormControl<String>; + +sectionControl: FormControl<ReportSection>; + +dataReferenceControl: FormControl<DataReferenceIdentifier<num>>; + +temporalAggregationControl: FormControl<TemporalAggregationFormatted>; + +improvementDirectionControl: FormControl<ImprovementDirectionFormatted>; + +alphaControl: FormControl<double>; + -_controlsBySectionType: Map<ReportSectionType, FormGroup>; + -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + -_validationConfigsBySectionType: Map<ReportSectionType, Map<FormValidationSetEnum, List<FormControlValidation>>>; + +sectionBaseControls: Map<String, AbstractControl<dynamic>>; +form: FormGroup; - +measurementViewModels: List<MeasurementSurveyFormViewModel>; + +sectionId: String; + +sectionType: ReportSectionType; + <static>+sectionTypeControlOptions: List<FormControlOption<ReportSectionType>>; + <static>+temporalAggregationControlOptions: List<FormControlOption<TemporalAggregationFormatted>>; + <static>+improvementDirectionControlOptions: List<FormControlOption<ImprovementDirectionFormatted>>; + +titles: Map<FormMode, String>; +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +measurementRequired: dynamic; - +titles: Map<FormMode, String> + +titleRequired: dynamic; + +descriptionRequired: dynamic; + +dataReferenceRequired: dynamic; + +aggregationRequired: dynamic; + +improvementDirectionRequired: dynamic; + +alphaConfidenceRequired: dynamic | - +void read(); - +void setControlsFrom(); - +MeasurementsFormData buildFormData(); - +List<ModelAction<dynamic>> availableActions(); - +List<ModelAction<dynamic>> availablePopupActions(); - +List<ModelAction<dynamic>> availableInlineActions(); - +void onSelectItem(); - +void onNewItem(); - +MeasurementSurveyFormViewModel provide(); - +void onCancel(); - +dynamic onSave() + -List<FormControlValidation> _getValidationConfig(); + +ReportItemFormData buildFormData(); + +ReportItemFormViewModel createDuplicate(); + +dynamic onSectionTypeChanged(); + -void _updateFormControls(); + +void setControlsFrom() ] - [MeasurementsFormViewModel]o-[Study] - [MeasurementsFormViewModel]o-[GoRouter] - [MeasurementsFormViewModel]o-[FormArray] - [MeasurementsFormViewModel]o-[FormViewModelCollection] - [MeasurementsFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[MeasurementsFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[MeasurementsFormViewModel] - [<abstract>IListActionProvider]<:--[MeasurementsFormViewModel] - [<abstract>IProviderArgsResolver]<:--[MeasurementsFormViewModel] + [ReportItemFormViewModel]o-[ReportSectionType] + [ReportItemFormViewModel]o-[FormControl] + [ReportItemFormViewModel]o-[FormGroup] + [<abstract>ManagedFormViewModel]<:-[ReportItemFormViewModel] - [StudyFormValidationSet + [ReportItemFormView | - +index: int; - <static>+values: List<StudyFormValidationSet> + +formViewModel: ReportItemFormViewModel; + +studyId: String; + +reportSectionColumnWidth: dynamic; + +sectionTypeBodyBuilder: Widget Function(BuildContext) + | + +Widget build(); + -dynamic _buildSectionText(); + -dynamic _buildSectionTypeHeader() ] - [Enum]<:--[StudyFormValidationSet] + [ReportItemFormView]o-[ReportItemFormViewModel] + [ReportItemFormView]o-[Widget Function(BuildContext)] [ReportsFormViewModel | @@ -1426,332 +1354,526 @@ [<abstract>IListActionProvider]<:--[ReportFormItemDelegate] [<abstract>IProviderArgsResolver]<:--[ReportFormItemDelegate] - [ReportItemFormData + [ReportBadge | - +isPrimary: bool; - +section: ReportSection; - +id: String + +status: ReportStatus?; + +type: BadgeType; + +showPrefixIcon: bool; + +showTooltip: bool | - <static>+dynamic fromDomainModel(); - +ReportItemFormData copy() + +Widget build() ] - [ReportItemFormData]o-[<abstract>ReportSection] - [<abstract>IFormData]<:-[ReportItemFormData] + [ReportBadge]o-[ReportStatus] + [ReportBadge]o-[BadgeType] - [ReportItemFormView + [ReportsFormData | - +formViewModel: ReportItemFormViewModel; - +studyId: String; - +reportSectionColumnWidth: dynamic; - +sectionTypeBodyBuilder: Widget Function(BuildContext) + +reportItems: List<ReportItemFormData>; + +id: String | - +Widget build(); - -dynamic _buildSectionText(); - -dynamic _buildSectionTypeHeader() + +Study apply(); + +ReportsFormData copy() ] - [ReportItemFormView]o-[ReportItemFormViewModel] - [ReportItemFormView]o-[Widget Function(BuildContext)] + [<abstract>IStudyFormData]<:--[ReportsFormData] - [ReportItemFormViewModel - | - <static>+defaultSectionType: ReportSectionType; - +sectionIdControl: FormControl<String>; - +sectionTypeControl: FormControl<ReportSectionType>; - +titleControl: FormControl<String>; - +descriptionControl: FormControl<String>; - +sectionControl: FormControl<ReportSection>; - +dataReferenceControl: FormControl<DataReferenceIdentifier<num>>; - +temporalAggregationControl: FormControl<TemporalAggregationFormatted>; - +improvementDirectionControl: FormControl<ImprovementDirectionFormatted>; - +alphaControl: FormControl<double>; - -_controlsBySectionType: Map<ReportSectionType, FormGroup>; - -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - -_validationConfigsBySectionType: Map<ReportSectionType, Map<FormValidationSetEnum, List<FormControlValidation>>>; - +sectionBaseControls: Map<String, AbstractControl<dynamic>>; - +form: FormGroup; - +sectionId: String; - +sectionType: ReportSectionType; - <static>+sectionTypeControlOptions: List<FormControlOption<ReportSectionType>>; - <static>+temporalAggregationControlOptions: List<FormControlOption<TemporalAggregationFormatted>>; - <static>+improvementDirectionControlOptions: List<FormControlOption<ImprovementDirectionFormatted>>; - +titles: Map<FormMode, String>; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titleRequired: dynamic; - +descriptionRequired: dynamic; - +dataReferenceRequired: dynamic; - +aggregationRequired: dynamic; - +improvementDirectionRequired: dynamic; - +alphaConfidenceRequired: dynamic + [ReportStatus | - -List<FormControlValidation> _getValidationConfig(); - +ReportItemFormData buildFormData(); - +ReportItemFormViewModel createDuplicate(); - +dynamic onSectionTypeChanged(); - -void _updateFormControls(); - +void setControlsFrom() + +index: int; + <static>+values: List<ReportStatus>; + <static>+primary: ReportStatus; + <static>+secondary: ReportStatus ] - [ReportItemFormViewModel]o-[ReportSectionType] - [ReportItemFormViewModel]o-[FormControl] - [ReportItemFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[ReportItemFormViewModel] + [ReportStatus]o-[ReportStatus] + [Enum]<:--[ReportStatus] - [TemporalAggregationFormatted - | - -_value: TemporalAggregation; - <static>+values: List<TemporalAggregationFormatted>; - +value: TemporalAggregation; - +string: String; - +icon: IconData?; - +hashCode: int + [<abstract>IStudyFormData | - +bool ==(); - +String toString(); - +String toJson(); - <static>+TemporalAggregationFormatted fromJson() + +Study apply() ] - [TemporalAggregationFormatted]o-[TemporalAggregation] - [TemporalAggregationFormatted]o-[IconData] + [<abstract>IFormData]<:--[<abstract>IStudyFormData] - [ImprovementDirectionFormatted - | - -_value: ImprovementDirection; - <static>+values: List<ImprovementDirectionFormatted>; - +value: ImprovementDirection; - +string: String; - +icon: IconData?; - +hashCode: int + [StudyInfoFormViewModel | - +bool ==(); - +String toString(); - +String toJson(); - <static>+ImprovementDirectionFormatted fromJson() - ] - - [ImprovementDirectionFormatted]o-[ImprovementDirection] - [ImprovementDirectionFormatted]o-[IconData] - - [ReportSectionType + +study: Study; + +titleControl: FormControl<String>; + +iconControl: FormControl<IconOption>; + +descriptionControl: FormControl<String>; + +organizationControl: FormControl<String>; + +reviewBoardControl: FormControl<String>; + +reviewBoardNumberControl: FormControl<String>; + +researchersControl: FormControl<String>; + +emailControl: FormControl<String>; + +websiteControl: FormControl<String>; + +phoneControl: FormControl<String>; + +additionalInfoControl: FormControl<String>; + +form: FormGroup; + +titles: Map<FormMode, String>; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +titleRequired: dynamic; + +descriptionRequired: dynamic; + +iconRequired: dynamic; + +organizationRequired: dynamic; + +reviewBoardRequired: dynamic; + +reviewBoardNumberRequired: dynamic; + +researchersRequired: dynamic; + +emailRequired: dynamic; + +phoneRequired: dynamic; + +emailFormat: dynamic; + +websiteFormat: dynamic | - +index: int; - <static>+values: List<ReportSectionType>; - <static>+average: ReportSectionType; - <static>+linearRegression: ReportSectionType + +void setControlsFrom(); + +StudyInfoFormData buildFormData() ] - [ReportSectionType]o-[ReportSectionType] - [Enum]<:--[ReportSectionType] + [StudyInfoFormViewModel]o-[Study] + [StudyInfoFormViewModel]o-[FormControl] + [StudyInfoFormViewModel]o-[FormGroup] + [<abstract>FormViewModel]<:-[StudyInfoFormViewModel] - [AverageSectionFormView - | - +formViewModel: ReportItemFormViewModel; - +studyId: String; - +reportSectionColumnWidth: Map<int, TableColumnWidth> + [StudyDesignInfoFormView | +Widget build() ] - [AverageSectionFormView]o-[ReportItemFormViewModel] - [<abstract>ConsumerWidget]<:-[AverageSectionFormView] + [<abstract>StudyDesignPageWidget]<:-[StudyDesignInfoFormView] - [LinearRegressionSectionFormView + [StudyInfoFormData | - +formViewModel: ReportItemFormViewModel; - +studyId: String; - +reportSectionColumnWidth: Map<int, TableColumnWidth> + +title: String; + +description: String?; + +iconName: String; + +contactInfoFormData: StudyContactInfoFormData; + +id: String | - +Widget build() + +Study apply(); + +StudyInfoFormData copy() ] - [LinearRegressionSectionFormView]o-[ReportItemFormViewModel] - [<abstract>ConsumerWidget]<:-[LinearRegressionSectionFormView] + [StudyInfoFormData]o-[StudyContactInfoFormData] + [<abstract>IStudyFormData]<:--[StudyInfoFormData] - [DataReferenceIdentifier + [StudyContactInfoFormData | - +hashCode: int + +organization: String?; + +institutionalReviewBoard: String?; + +institutionalReviewBoardNumber: String?; + +researchers: String?; + +email: String?; + +website: String?; + +phone: String?; + +additionalInfo: String?; + +id: String | - +bool ==() + +Study apply(); + +StudyInfoFormData copy() ] - [DataReference]<:-[DataReferenceIdentifier] + [<abstract>IStudyFormData]<:--[StudyContactInfoFormData] - [DataReferenceEditor - | - +formControl: FormControl<DataReferenceIdentifier<T>>; - +availableTasks: List<Task>; - +buildReactiveDropdownField: ReactiveDropdownField<dynamic> + [StudyFormValidationSet | - +FormTableRow buildFormTableRow(); - -List<DropdownMenuItem<DataReferenceIdentifier<dynamic>>> _dataReferenceItems() + +index: int; + <static>+values: List<StudyFormValidationSet> ] - [DataReferenceEditor]o-[FormControl] - [DataReferenceEditor]o-[ReactiveDropdownField] + [Enum]<:--[StudyFormValidationSet] - [ReportsFormData + [MeasurementsFormData | - +reportItems: List<ReportItemFormData>; + +surveyMeasurements: List<MeasurementSurveyFormData>; +id: String | +Study apply(); - +ReportsFormData copy() + +MeasurementsFormData copy() ] - [<abstract>IStudyFormData]<:--[ReportsFormData] + [<abstract>IStudyFormData]<:--[MeasurementsFormData] - [ReportStatus + [MeasurementSurveyFormView | - +index: int; - <static>+values: List<ReportStatus>; - <static>+primary: ReportStatus; - <static>+secondary: ReportStatus + +formViewModel: MeasurementSurveyFormViewModel ] - [ReportStatus]o-[ReportStatus] - [Enum]<:--[ReportStatus] + [MeasurementSurveyFormView]o-[MeasurementSurveyFormViewModel] - [ReportBadge + [SurveyPreview | - +status: ReportStatus?; - +type: BadgeType; - +showPrefixIcon: bool; - +showTooltip: bool + +routeArgs: MeasurementFormRouteArgs | +Widget build() ] - [ReportBadge]o-[ReportStatus] - [ReportBadge]o-[BadgeType] - - [StudyDesignReportsFormView - | - +Widget build(); - -dynamic _showReportItemSidesheetWithArgs() - ] - - [<abstract>StudyDesignPageWidget]<:-[StudyDesignReportsFormView] + [SurveyPreview]o-[MeasurementFormRouteArgs] + [<abstract>ConsumerWidget]<:-[SurveyPreview] - [StudyFormScaffold + [MeasurementSurveyFormData | - +studyId: String; - +formViewModelBuilder: T Function(WidgetRef); - +formViewBuilder: Widget Function(T) + +measurementId: String; + +title: String; + +introText: String?; + +outroText: String?; + +questionnaireFormData: QuestionnaireFormData; + <static>+kDefaultTitle: String; + +id: String | - +Widget build() + +QuestionnaireTask toQuestionnaireTask(); + +MeasurementSurveyFormData copy() ] - [StudyFormScaffold]o-[T Function(WidgetRef)] - [StudyFormScaffold]o-[Widget Function(T)] - [<abstract>ConsumerWidget]<:-[StudyFormScaffold] + [MeasurementSurveyFormData]o-[QuestionnaireFormData] + [<abstract>IFormDataWithSchedule]<:-[MeasurementSurveyFormData] - [SurveyQuestionFormView + [MeasurementSurveyFormViewModel | - +formViewModel: QuestionFormViewModel; - +isHtmlStyleable: bool + +study: Study; + +measurementIdControl: FormControl<String>; + +instanceIdControl: FormControl<String>; + +surveyTitleControl: FormControl<String>; + +surveyIntroTextControl: FormControl<String>; + +surveyOutroTextControl: FormControl<String>; + +form: FormGroup; + +measurementId: String; + +instanceId: String; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +titleRequired: dynamic; + +atLeastOneQuestion: dynamic; + +breadcrumbsTitle: String; + +titles: Map<FormMode, String> + | + +void setControlsFrom(); + +MeasurementSurveyFormData buildFormData(); + +List<ModelAction<dynamic>> availableActions(); + +List<ModelAction<dynamic>> availablePopupActions(); + +List<ModelAction<dynamic>> availableInlineActions(); + +void onSelectItem(); + +void onNewItem(); + +SurveyQuestionFormRouteArgs buildNewFormRouteArgs(); + +SurveyQuestionFormRouteArgs buildFormRouteArgs(); + +MeasurementSurveyFormViewModel createDuplicate() ] - [SurveyQuestionFormView]o-[QuestionFormViewModel] + [MeasurementSurveyFormViewModel]o-[Study] + [MeasurementSurveyFormViewModel]o-[FormControl] + [MeasurementSurveyFormViewModel]o-[FormGroup] + [<abstract>ManagedFormViewModel]<:-[MeasurementSurveyFormViewModel] + [<abstract>WithQuestionnaireControls]<:-[MeasurementSurveyFormViewModel] + [<abstract>WithScheduleControls]<:-[MeasurementSurveyFormViewModel] + [<abstract>IFormViewModelDelegate]<:--[MeasurementSurveyFormViewModel] + [<abstract>IListActionProvider]<:--[MeasurementSurveyFormViewModel] + [<abstract>IProviderArgsResolver]<:--[MeasurementSurveyFormViewModel] - [QuestionFormViewModel + [StudyDesignMeasurementsFormView | - <static>+defaultQuestionType: SurveyQuestionType; - -_titles: Map<FormMode, String Function()>?; - +questionIdControl: FormControl<String>; - +questionTypeControl: FormControl<SurveyQuestionType>; - +questionTextControl: FormControl<String>; - +questionInfoTextControl: FormControl<String>; - +questionBaseControls: Map<String, AbstractControl<dynamic>>; - +isMultipleChoiceControl: FormControl<bool>; - +choiceResponseOptionsArray: FormArray<dynamic>; - +customOptionsMin: int; - +customOptionsMax: int; - +customOptionsInitial: int; - +boolResponseOptionsArray: FormArray<String>; - +imageResponseOptionsArray: FormArray<String>; - <static>+kDefaultMaxRecordingDurationSeconds: int; - <static>+kMaxRecordingDurationSeconds: int; - +audioResponseOptionsArray: FormArray<String>; - +maxRecordingDurationSecondsControl: FormControl<int>; - <static>+kDefaultScaleMinValue: int; - <static>+kDefaultScaleMaxValue: int; - <static>+kNumMidValueControls: int; - <static>+kMidValueDebounceMilliseconds: int; - +scaleMinValueControl: FormControl<int>; - +scaleMaxValueControl: FormControl<int>; - -_scaleRangeControl: FormControl<int>; - +scaleMinLabelControl: FormControl<String>; - +scaleMaxLabelControl: FormControl<String>; - +scaleMidValueControls: FormArray<int>; - +scaleMidLabelControls: FormArray<String?>; - -_scaleResponseOptionsArray: FormArray<int>; - +scaleMinColorControl: FormControl<SerializableColor>; - +scaleMaxColorControl: FormControl<SerializableColor>; - +prevMidValues: List<int?>?; - +freeTextTypeControl: FormControl<FreeTextQuestionType>; - +customRegexControl: FormControl<String>; - +freeTextResponseOptionsArray: FormArray<dynamic>; - +freeTextLengthMin: AbstractControl<int>; - +freeTextLengthMax: AbstractControl<int>; - +freeTextExampleTextControl: FormControl<String>; - <static>+kDefaultFreeTextMinLength: int; - <static>+kDefaultFreeTextMaxLength: int; - +freeTextLengthControl: FormControl<RangeValues>; - -_controlsByQuestionType: Map<SurveyQuestionType, FormGroup>; - -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - -_validationConfigsByQuestionType: Map<SurveyQuestionType, Map<FormValidationSetEnum, List<FormControlValidation>>>; + +Widget build() + ] + + [<abstract>StudyDesignPageWidget]<:-[StudyDesignMeasurementsFormView] + + [MeasurementsFormViewModel + | + +study: Study; + +router: GoRouter; + +measurementsArray: FormArray<dynamic>; + +surveyMeasurementFormViewModels: FormViewModelCollection<MeasurementSurveyFormViewModel, MeasurementSurveyFormData>; +form: FormGroup; - +questionId: String; - +questionType: SurveyQuestionType; - +questionTypeControlOptions: List<FormControlOption<SurveyQuestionType>>; - +answerOptionsArray: FormArray<dynamic>; - +answerOptionsControls: List<AbstractControl<dynamic>>; - +validAnswerOptions: List<String>; - +boolOptions: List<AbstractControl<String>>; - +imageOptions: List<AbstractControl<String>>; - +audioOptions: List<AbstractControl<String>>; - +scaleMinValue: int; - +scaleMaxValue: int; - +scaleRange: int; - +scaleAllValueControls: List<AbstractControl<int>>; + +measurementViewModels: List<MeasurementSurveyFormViewModel>; +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +questionTextRequired: dynamic; - +numValidChoiceOptions: dynamic; - +scaleRangeValid: dynamic; - +maxRecordingDurationValid: dynamic; - +titles: Map<FormMode, String>; - +isAddOptionButtonVisible: bool; - +isMidValuesClearedInfoVisible: bool + +measurementRequired: dynamic; + +titles: Map<FormMode, String> + | + +void read(); + +void setControlsFrom(); + +MeasurementsFormData buildFormData(); + +List<ModelAction<dynamic>> availableActions(); + +List<ModelAction<dynamic>> availablePopupActions(); + +List<ModelAction<dynamic>> availableInlineActions(); + +void onSelectItem(); + +void onNewItem(); + +MeasurementSurveyFormViewModel provide(); + +void onCancel(); + +dynamic onSave() + ] + + [MeasurementsFormViewModel]o-[Study] + [MeasurementsFormViewModel]o-[GoRouter] + [MeasurementsFormViewModel]o-[FormArray] + [MeasurementsFormViewModel]o-[FormViewModelCollection] + [MeasurementsFormViewModel]o-[FormGroup] + [<abstract>FormViewModel]<:-[MeasurementsFormViewModel] + [<abstract>IFormViewModelDelegate]<:--[MeasurementsFormViewModel] + [<abstract>IListActionProvider]<:--[MeasurementsFormViewModel] + [<abstract>IProviderArgsResolver]<:--[MeasurementsFormViewModel] + + [StudyFormScaffold + | + +studyId: String; + +formViewModelBuilder: T Function(WidgetRef); + +formViewBuilder: Widget Function(T) + | + +Widget build() + ] + + [StudyFormScaffold]o-[T Function(WidgetRef)] + [StudyFormScaffold]o-[Widget Function(T)] + [<abstract>ConsumerWidget]<:-[StudyFormScaffold] + + [ConsentItemFormViewModel + | + +consentIdControl: FormControl<String>; + +titleControl: FormControl<String>; + +descriptionControl: FormControl<String>; + +iconControl: FormControl<IconOption>; + +form: FormGroup; + +consentId: String; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +titleRequired: dynamic; + +descriptionRequired: dynamic; + +titles: Map<FormMode, String> + | + +void setControlsFrom(); + +ConsentItemFormData buildFormData(); + +ConsentItemFormViewModel createDuplicate() + ] + + [ConsentItemFormViewModel]o-[FormControl] + [ConsentItemFormViewModel]o-[FormGroup] + [<abstract>ManagedFormViewModel]<:-[ConsentItemFormViewModel] + + [StudyDesignEnrollmentFormView + | + +Widget build(); + -dynamic _showScreenerQuestionSidesheetWithArgs(); + -dynamic _showConsentItemSidesheetWithArgs() + ] + + [<abstract>StudyDesignPageWidget]<:-[StudyDesignEnrollmentFormView] + + [<abstract>IScreenerQuestionLogicFormViewModel + | + +isDirtyOptionsBannerVisible: bool + ] + + [ScreenerQuestionLogicFormView + | + +formViewModel: ScreenerQuestionFormViewModel + | + +Widget build(); + -dynamic _buildInfoBanner(); + -dynamic _buildAnswerOptionsLogicControls(); + -List<Widget> _buildOptionLogicRow() + ] + + [ScreenerQuestionLogicFormView]o-[ScreenerQuestionFormViewModel] + [<abstract>FormConsumerWidget]<:-[ScreenerQuestionLogicFormView] + + [ConsentItemFormData + | + +consentId: String; + +title: String; + +description: String; + +iconName: String?; + +id: String + | + +ConsentItem toConsentItem(); + +ConsentItemFormData copy() + ] + + [<abstract>IFormData]<:-[ConsentItemFormData] + + [ConsentItemFormView + | + +formViewModel: ConsentItemFormViewModel + ] + + [ConsentItemFormView]o-[ConsentItemFormViewModel] + + [EnrollmentFormData + | + <static>+kDefaultEnrollmentType: Participation; + +enrollmentType: Participation; + +questionnaireFormData: QuestionnaireFormData; + +consentItemsFormData: List<ConsentItemFormData>?; + +id: String + | + +Study apply(); + +EnrollmentFormData copy() + ] + + [EnrollmentFormData]o-[Participation] + [EnrollmentFormData]o-[QuestionnaireFormData] + [<abstract>IStudyFormData]<:--[EnrollmentFormData] + + [ScreenerQuestionFormViewModel + | + <static>+defaultResponseOptionValidity: bool; + +responseOptionsDisabledArray: FormArray<dynamic>; + +responseOptionsLogicControls: FormArray<bool>; + +responseOptionsLogicDescriptionControls: FormArray<String>; + -_questionBaseControls: Map<String, AbstractControl<dynamic>>; + +prevResponseOptionControls: List<AbstractControl<dynamic>>; + +prevResponseOptionValues: List<dynamic>; + +responseOptionsDisabledControls: List<AbstractControl<dynamic>>; + +logicControlOptions: List<FormControlOption<bool>>; + +questionBaseControls: Map<String, AbstractControl<dynamic>>; + +isDirtyOptionsBannerVisible: bool | - +String? scaleMidLabelAt(); - -dynamic _onScaleRangeChanged(); - -dynamic _applyInputFormatters(); - -dynamic _updateScaleMidValueControls(); - -Map<String, dynamic>? _validateFreeText(); - -dynamic _onFreeTextLengthChanged(); - -List<FormControlValidation> _getValidationConfig(); - +dynamic onQuestionTypeChanged(); +dynamic onResponseOptionsChanged(); - -void _updateFormControls(); - +void initControls(); +void setControlsFrom(); +QuestionFormData buildFormData(); + -List<FormControl<dynamic>> _copyFormControls(); + -AbstractControl<dynamic>? _findAssociatedLogicControlFor(); + -AbstractControl<dynamic>? _findAssociatedControlFor(); + +ScreenerQuestionFormViewModel createDuplicate() + ] + + [ScreenerQuestionFormViewModel]o-[FormArray] + [QuestionFormViewModel]<:-[ScreenerQuestionFormViewModel] + [<abstract>IScreenerQuestionLogicFormViewModel]<:--[ScreenerQuestionFormViewModel] + + [EnrollmentFormViewModel + | + +study: Study; + +router: GoRouter; + +consentItemDelegate: EnrollmentFormConsentItemDelegate; + +enrollmentTypeControl: FormControl<Participation>; + +consentItemArray: FormArray<dynamic>; + +consentItemFormViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData>; + +form: FormGroup; + +enrollmentTypeControlOptions: List<FormControlOption<Participation>>; + +consentItemModels: List<ConsentItemFormViewModel>; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +titles: Map<FormMode, String>; + +canTestScreener: bool; + +canTestConsent: bool; + +questionTitles: Map<FormMode, String Function()> + | + +void setControlsFrom(); + +EnrollmentFormData buildFormData(); + +void read(); +List<ModelAction<dynamic>> availableActions(); - +void onNewItem(); + +List<ModelAction<dynamic>> availablePopupActions(); + +List<ModelAction<dynamic>> availableInlineActions(); +void onSelectItem(); - +dynamic save(); - +QuestionFormViewModel createDuplicate() + +void onNewItem(); + +ScreenerQuestionFormRouteArgs buildNewScreenerQuestionFormRouteArgs(); + +ScreenerQuestionFormRouteArgs buildScreenerQuestionFormRouteArgs(); + +ConsentItemFormRouteArgs buildNewConsentItemFormRouteArgs(); + +ConsentItemFormRouteArgs buildConsentItemFormRouteArgs(); + +dynamic testScreener(); + +dynamic testConsent(); + +ScreenerQuestionFormViewModel provideQuestionFormViewModel() + ] + + [EnrollmentFormViewModel]o-[Study] + [EnrollmentFormViewModel]o-[GoRouter] + [EnrollmentFormViewModel]o-[EnrollmentFormConsentItemDelegate] + [EnrollmentFormViewModel]o-[FormControl] + [EnrollmentFormViewModel]o-[FormArray] + [EnrollmentFormViewModel]o-[FormViewModelCollection] + [EnrollmentFormViewModel]o-[FormGroup] + [<abstract>FormViewModel]<:-[EnrollmentFormViewModel] + [<abstract>WithQuestionnaireControls]<:-[EnrollmentFormViewModel] + [<abstract>IFormViewModelDelegate]<:--[EnrollmentFormViewModel] + [<abstract>IListActionProvider]<:--[EnrollmentFormViewModel] + [<abstract>IProviderArgsResolver]<:--[EnrollmentFormViewModel] + + [EnrollmentFormConsentItemDelegate + | + +formViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData>; + +owner: EnrollmentFormViewModel; + +propagateOnSave: bool; + +validationSet: dynamic + | + +void onCancel(); + +dynamic onSave(); + +ConsentItemFormViewModel provide(); + +List<ModelAction<dynamic>> availableActions(); + +void onNewItem(); + +void onSelectItem() + ] + + [EnrollmentFormConsentItemDelegate]o-[FormViewModelCollection] + [EnrollmentFormConsentItemDelegate]o-[EnrollmentFormViewModel] + [<abstract>IFormViewModelDelegate]<:--[EnrollmentFormConsentItemDelegate] + [<abstract>IListActionProvider]<:--[EnrollmentFormConsentItemDelegate] + [<abstract>IProviderArgsResolver]<:--[EnrollmentFormConsentItemDelegate] + + [StudyFormViewModel + | + +studyDirtyCopy: Study?; + +studyRepository: IStudyRepository; + +authRepository: IAuthRepository; + +router: GoRouter; + +studyInfoFormViewModel: StudyInfoFormViewModel; + +enrollmentFormViewModel: EnrollmentFormViewModel; + +measurementsFormViewModel: MeasurementsFormViewModel; + +reportsFormViewModel: ReportsFormViewModel; + +interventionsFormViewModel: InterventionsFormViewModel; + +form: FormGroup; + +isStudyReadonly: bool; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +titles: Map<FormMode, String> + | + +void read(); + +void setControlsFrom(); + +Study buildFormData(); + +void dispose(); + +void onCancel(); + +dynamic onSave(); + -dynamic _applyAndSaveSubform() + ] + + [StudyFormViewModel]o-[Study] + [StudyFormViewModel]o-[<abstract>IStudyRepository] + [StudyFormViewModel]o-[<abstract>IAuthRepository] + [StudyFormViewModel]o-[GoRouter] + [StudyFormViewModel]o-[StudyInfoFormViewModel] + [StudyFormViewModel]o-[EnrollmentFormViewModel] + [StudyFormViewModel]o-[MeasurementsFormViewModel] + [StudyFormViewModel]o-[ReportsFormViewModel] + [StudyFormViewModel]o-[InterventionsFormViewModel] + [StudyFormViewModel]o-[FormGroup] + [<abstract>FormViewModel]<:-[StudyFormViewModel] + [<abstract>IFormViewModelDelegate]<:--[StudyFormViewModel] + + [<abstract>WithQuestionnaireControls + | + +questionsArray: FormArray<dynamic>; + +questionFormViewModels: FormViewModelCollection<Q, QuestionFormData>; + +questionnaireControls: Map<String, FormArray<dynamic>>; + +propagateOnSave: bool; + +questionModels: List<Q>; + +questionTitles: Map<FormMode, String Function()> + | + +void setQuestionnaireControlsFrom(); + +QuestionnaireFormData buildQuestionnaireFormData(); + +void read(); + +void onCancel(); + +dynamic onSave(); + +Q provide(); + +Q provideQuestionFormViewModel() + ] + + [<abstract>WithQuestionnaireControls]o-[FormArray] + [<abstract>WithQuestionnaireControls]o-[FormViewModelCollection] + [<abstract>IFormViewModelDelegate]<:--[<abstract>WithQuestionnaireControls] + [<abstract>IProviderArgsResolver]<:--[<abstract>WithQuestionnaireControls] + + [QuestionnaireFormData + | + +questionsData: List<QuestionFormData>?; + +id: String + | + +StudyUQuestionnaire toQuestionnaire(); + +List<EligibilityCriterion> toEligibilityCriteria(); + +QuestionnaireFormData copy() ] - [QuestionFormViewModel]o-[SurveyQuestionType] - [QuestionFormViewModel]o-[FormControl] - [QuestionFormViewModel]o-[FormArray] - [QuestionFormViewModel]o-[<abstract>AbstractControl] - [QuestionFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[QuestionFormViewModel] - [<abstract>IListActionProvider]<:--[QuestionFormViewModel] + [<abstract>IFormData]<:--[QuestionnaireFormData] [<abstract>QuestionFormData | @@ -1863,17 +1985,15 @@ [FreeTextQuestionFormData]o-[FreeTextQuestionType] [<abstract>QuestionFormData]<:-[FreeTextQuestionFormData] - [<abstract>IScaleQuestionFormViewModel - | - +isMidValuesClearedInfoVisible: bool - ] - - [ScaleQuestionFormView + [AudioRecordingQuestionFormView | +formViewModel: QuestionFormViewModel + | + +Widget build() ] - [ScaleQuestionFormView]o-[QuestionFormViewModel] + [AudioRecordingQuestionFormView]o-[QuestionFormViewModel] + [<abstract>ConsumerWidget]<:-[AudioRecordingQuestionFormView] [FreeTextQuestionFormView | @@ -1888,16 +2008,6 @@ [FreeTextQuestionFormView]o-[QuestionFormViewModel] [<abstract>ConsumerWidget]<:-[FreeTextQuestionFormView] - [BoolQuestionFormView - | - +formViewModel: QuestionFormViewModel - | - +Widget build() - ] - - [BoolQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[BoolQuestionFormView] - [SurveyQuestionType | +index: int; @@ -1913,81 +2023,153 @@ [SurveyQuestionType]o-[SurveyQuestionType] [Enum]<:--[SurveyQuestionType] - [AudioRecordingQuestionFormView + [ImageCapturingQuestionFormView | +formViewModel: QuestionFormViewModel | +Widget build() ] - [AudioRecordingQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[AudioRecordingQuestionFormView] + [ImageCapturingQuestionFormView]o-[QuestionFormViewModel] + [<abstract>ConsumerWidget]<:-[ImageCapturingQuestionFormView] - [ChoiceQuestionFormView + [<abstract>IScaleQuestionFormViewModel | - +formViewModel: QuestionFormViewModel + +isMidValuesClearedInfoVisible: bool + ] + + [ScaleQuestionFormView | - +Widget build() + +formViewModel: QuestionFormViewModel ] - [ChoiceQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[ChoiceQuestionFormView] + [ScaleQuestionFormView]o-[QuestionFormViewModel] - [ImageCapturingQuestionFormView + [ChoiceQuestionFormView | +formViewModel: QuestionFormViewModel | +Widget build() ] - [ImageCapturingQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[ImageCapturingQuestionFormView] + [ChoiceQuestionFormView]o-[QuestionFormViewModel] + [<abstract>ConsumerWidget]<:-[ChoiceQuestionFormView] - [<abstract>WithQuestionnaireControls + [BoolQuestionFormView | - +questionsArray: FormArray<dynamic>; - +questionFormViewModels: FormViewModelCollection<Q, QuestionFormData>; - +questionnaireControls: Map<String, FormArray<dynamic>>; - +propagateOnSave: bool; - +questionModels: List<Q>; - +questionTitles: Map<FormMode, String Function()> + +formViewModel: QuestionFormViewModel | - +void setQuestionnaireControlsFrom(); - +QuestionnaireFormData buildQuestionnaireFormData(); - +void read(); - +void onCancel(); - +dynamic onSave(); - +Q provide(); - +Q provideQuestionFormViewModel() + +Widget build() ] - [<abstract>WithQuestionnaireControls]o-[FormArray] - [<abstract>WithQuestionnaireControls]o-[FormViewModelCollection] - [<abstract>IFormViewModelDelegate]<:--[<abstract>WithQuestionnaireControls] - [<abstract>IProviderArgsResolver]<:--[<abstract>WithQuestionnaireControls] + [BoolQuestionFormView]o-[QuestionFormViewModel] + [<abstract>ConsumerWidget]<:-[BoolQuestionFormView] - [QuestionnaireFormData + [QuestionFormViewModel | - +questionsData: List<QuestionFormData>?; - +id: String + <static>+defaultQuestionType: SurveyQuestionType; + -_titles: Map<FormMode, String Function()>?; + +questionIdControl: FormControl<String>; + +questionTypeControl: FormControl<SurveyQuestionType>; + +questionTextControl: FormControl<String>; + +questionInfoTextControl: FormControl<String>; + +questionBaseControls: Map<String, AbstractControl<dynamic>>; + +isMultipleChoiceControl: FormControl<bool>; + +choiceResponseOptionsArray: FormArray<dynamic>; + +customOptionsMin: int; + +customOptionsMax: int; + +customOptionsInitial: int; + +boolResponseOptionsArray: FormArray<String>; + +imageResponseOptionsArray: FormArray<String>; + <static>+kDefaultMaxRecordingDurationSeconds: int; + <static>+kMaxRecordingDurationSeconds: int; + +audioResponseOptionsArray: FormArray<String>; + +maxRecordingDurationSecondsControl: FormControl<int>; + <static>+kDefaultScaleMinValue: int; + <static>+kDefaultScaleMaxValue: int; + <static>+kNumMidValueControls: int; + <static>+kMidValueDebounceMilliseconds: int; + +scaleMinValueControl: FormControl<int>; + +scaleMaxValueControl: FormControl<int>; + -_scaleRangeControl: FormControl<int>; + +scaleMinLabelControl: FormControl<String>; + +scaleMaxLabelControl: FormControl<String>; + +scaleMidValueControls: FormArray<int>; + +scaleMidLabelControls: FormArray<String?>; + -_scaleResponseOptionsArray: FormArray<int>; + +scaleMinColorControl: FormControl<SerializableColor>; + +scaleMaxColorControl: FormControl<SerializableColor>; + +prevMidValues: List<int?>?; + +freeTextTypeControl: FormControl<FreeTextQuestionType>; + +customRegexControl: FormControl<String>; + +freeTextResponseOptionsArray: FormArray<dynamic>; + +freeTextLengthMin: AbstractControl<int>; + +freeTextLengthMax: AbstractControl<int>; + +freeTextExampleTextControl: FormControl<String>; + <static>+kDefaultFreeTextMinLength: int; + <static>+kDefaultFreeTextMaxLength: int; + +freeTextLengthControl: FormControl<RangeValues>; + -_controlsByQuestionType: Map<SurveyQuestionType, FormGroup>; + -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + -_validationConfigsByQuestionType: Map<SurveyQuestionType, Map<FormValidationSetEnum, List<FormControlValidation>>>; + +form: FormGroup; + +questionId: String; + +questionType: SurveyQuestionType; + +questionTypeControlOptions: List<FormControlOption<SurveyQuestionType>>; + +answerOptionsArray: FormArray<dynamic>; + +answerOptionsControls: List<AbstractControl<dynamic>>; + +validAnswerOptions: List<String>; + +boolOptions: List<AbstractControl<String>>; + +imageOptions: List<AbstractControl<String>>; + +audioOptions: List<AbstractControl<String>>; + +scaleMinValue: int; + +scaleMaxValue: int; + +scaleRange: int; + +scaleAllValueControls: List<AbstractControl<int>>; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +questionTextRequired: dynamic; + +numValidChoiceOptions: dynamic; + +scaleRangeValid: dynamic; + +maxRecordingDurationValid: dynamic; + +titles: Map<FormMode, String>; + +isAddOptionButtonVisible: bool; + +isMidValuesClearedInfoVisible: bool | - +StudyUQuestionnaire toQuestionnaire(); - +List<EligibilityCriterion> toEligibilityCriteria(); - +QuestionnaireFormData copy() + +String? scaleMidLabelAt(); + -dynamic _onScaleRangeChanged(); + -dynamic _applyInputFormatters(); + -dynamic _updateScaleMidValueControls(); + -Map<String, dynamic>? _validateFreeText(); + -dynamic _onFreeTextLengthChanged(); + -List<FormControlValidation> _getValidationConfig(); + +dynamic onQuestionTypeChanged(); + +dynamic onResponseOptionsChanged(); + -void _updateFormControls(); + +void initControls(); + +void setControlsFrom(); + +QuestionFormData buildFormData(); + +List<ModelAction<dynamic>> availableActions(); + +void onNewItem(); + +void onSelectItem(); + +dynamic save(); + +QuestionFormViewModel createDuplicate() ] - [<abstract>IFormData]<:--[QuestionnaireFormData] + [QuestionFormViewModel]o-[SurveyQuestionType] + [QuestionFormViewModel]o-[FormControl] + [QuestionFormViewModel]o-[FormArray] + [QuestionFormViewModel]o-[<abstract>AbstractControl] + [QuestionFormViewModel]o-[FormGroup] + [<abstract>ManagedFormViewModel]<:-[QuestionFormViewModel] + [<abstract>IListActionProvider]<:--[QuestionFormViewModel] - [ScheduleControls - | - +formViewModel: WithScheduleControls + [SurveyQuestionFormView | - +Widget build(); - -List<FormTableRow> _conditionalTimeRestrictions() + +formViewModel: QuestionFormViewModel; + +isHtmlStyleable: bool ] - [ScheduleControls]o-[<abstract>WithScheduleControls] - [<abstract>FormConsumerWidget]<:-[ScheduleControls] + [SurveyQuestionFormView]o-[QuestionFormViewModel] [<abstract>IFormDataWithSchedule | @@ -2004,6 +2186,17 @@ [<abstract>IFormDataWithSchedule]o-[StudyUTimeOfDay] [<abstract>IFormData]<:--[<abstract>IFormDataWithSchedule] + [ScheduleControls + | + +formViewModel: WithScheduleControls + | + +Widget build(); + -List<FormTableRow> _conditionalTimeRestrictions() + ] + + [ScheduleControls]o-[<abstract>WithScheduleControls] + [<abstract>FormConsumerWidget]<:-[ScheduleControls] + [<abstract>WithScheduleControls | +isTimeRestrictedControl: FormControl<bool>; @@ -2020,51 +2213,13 @@ +hasReminder: bool; +isTimeRestricted: bool; +timeRestriction: List<Time>? - | - +void setScheduleControlsFrom(); - -dynamic _initReminderControl() - ] - - [<abstract>WithScheduleControls]o-[FormControl] - [<abstract>WithScheduleControls]o-[StreamSubscription] - - [StudyFormViewModel - | - +studyDirtyCopy: Study?; - +studyRepository: IStudyRepository; - +authRepository: IAuthRepository; - +router: GoRouter; - +studyInfoFormViewModel: StudyInfoFormViewModel; - +enrollmentFormViewModel: EnrollmentFormViewModel; - +measurementsFormViewModel: MeasurementsFormViewModel; - +reportsFormViewModel: ReportsFormViewModel; - +interventionsFormViewModel: InterventionsFormViewModel; - +form: FormGroup; - +isStudyReadonly: bool; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titles: Map<FormMode, String> - | - +void read(); - +void setControlsFrom(); - +Study buildFormData(); - +void dispose(); - +void onCancel(); - +dynamic onSave(); - -dynamic _applyAndSaveSubform() - ] - - [StudyFormViewModel]o-[Study] - [StudyFormViewModel]o-[<abstract>IStudyRepository] - [StudyFormViewModel]o-[<abstract>IAuthRepository] - [StudyFormViewModel]o-[GoRouter] - [StudyFormViewModel]o-[StudyInfoFormViewModel] - [StudyFormViewModel]o-[EnrollmentFormViewModel] - [StudyFormViewModel]o-[MeasurementsFormViewModel] - [StudyFormViewModel]o-[ReportsFormViewModel] - [StudyFormViewModel]o-[InterventionsFormViewModel] - [StudyFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[StudyFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[StudyFormViewModel] + | + +void setScheduleControlsFrom(); + -dynamic _initReminderControl() + ] + + [<abstract>WithScheduleControls]o-[FormControl] + [<abstract>WithScheduleControls]o-[StreamSubscription] [<abstract>StudyDesignPageWidget | @@ -2073,45 +2228,33 @@ [<abstract>StudyPageWidget]<:-[<abstract>StudyDesignPageWidget] - [StudyAnalyzeScreen + [StudiesTableColumnHeader | - +Widget? banner(); - +Widget build() + +title: String; + +sortable: bool; + +sortAscending: bool; + +sortingActive: bool; + +onSort: void Function()? ] - [<abstract>StudyPageWidget]<:-[StudyAnalyzeScreen] + [StudiesTableColumnHeader]o-[void Function()?] - [StudyAnalyzeController + [DashboardScreen | - +dynamic onExport() + +filter: StudiesFilter? ] - [StudyBaseController]<:-[StudyAnalyzeController] + [DashboardScreen]o-[StudiesFilter] - [StudyMonitorScreen + [DashboardScaffold | - +Widget build() - ] - - [<abstract>StudyPageWidget]<:-[StudyMonitorScreen] - - [StudiesTableItem + <static>+compactWidthThreshold: double; + +body: Widget | - +study: Study; - +itemHeight: double; - +itemPadding: double; - +rowSpacing: double; - +columnSpacing: double; - +actions: List<ModelAction<dynamic>>; - +columnSizes: List<StudiesTableColumnSize>; - +isPinned: bool; - +onPinnedChanged: void Function(Study, bool)?; - +onTap: void Function(Study)? + +Widget build() ] - [StudiesTableItem]o-[Study] - [StudiesTableItem]o-[void Function(Study, bool)?] - [StudiesTableItem]o-[void Function(Study)?] + [DashboardScaffold]o-[<abstract>Widget] [DashboardController | @@ -2147,6 +2290,14 @@ [DashboardController]o-[SearchController] [<abstract>IModelActionProvider]<:--[DashboardController] + [StudiesFilter + | + +index: int; + <static>+values: List<StudiesFilter> + ] + + [Enum]<:--[StudiesFilter] + [StudiesTableColumnSize | +collapsed: bool; @@ -2199,42 +2350,30 @@ [StudiesTableColumn]o-[StudiesTableColumn] [Enum]<:--[StudiesTableColumn] - [DashboardScreen - | - +filter: StudiesFilter? - ] - - [DashboardScreen]o-[StudiesFilter] - - [DashboardScaffold - | - <static>+compactWidthThreshold: double; - +body: Widget + [StudiesTableItem | - +Widget build() + +study: Study; + +itemHeight: double; + +itemPadding: double; + +rowSpacing: double; + +columnSpacing: double; + +actions: List<ModelAction<dynamic>>; + +columnSizes: List<StudiesTableColumnSize>; + +isPinned: bool; + +onPinnedChanged: void Function(Study, bool)?; + +onTap: void Function(Study)? ] - [DashboardScaffold]o-[<abstract>Widget] + [StudiesTableItem]o-[Study] + [StudiesTableItem]o-[void Function(Study, bool)?] + [StudiesTableItem]o-[void Function(Study)?] - [StudiesFilter - | - +index: int; - <static>+values: List<StudiesFilter> + [App ] - [Enum]<:--[StudiesFilter] - - [StudiesTableColumnHeader - | - +title: String; - +sortable: bool; - +sortAscending: bool; - +sortingActive: bool; - +onSort: void Function()? + [AppContent ] - [StudiesTableColumnHeader]o-[void Function()?] - [AccountSettingsDialog | +Widget build() @@ -2242,3917 +2381,3750 @@ [<abstract>ConsumerWidget]<:-[AccountSettingsDialog] - [StudyInvitesTable - | - +invites: List<StudyInvite>; - +onSelect: void Function(StudyInvite); - +getActions: List<ModelAction<dynamic>> Function(StudyInvite); - +getInlineActions: List<ModelAction<dynamic>> Function(StudyInvite); - +getIntervention: Intervention? Function(String); - +getParticipantCountForInvite: int Function(StudyInvite) - | - +Widget build(); - -List<Widget> _buildRow() - ] - - [StudyInvitesTable]o-[void Function(StudyInvite)] - [StudyInvitesTable]o-[List<ModelAction<dynamic>> Function(StudyInvite)] - [StudyInvitesTable]o-[Intervention? Function(String)] - [StudyInvitesTable]o-[int Function(StudyInvite)] - - [StudyRecruitController - | - +inviteCodeRepository: IInviteCodeRepository; - -_invitesSubscription: StreamSubscription<List<WrappedModel<StudyInvite>>>? - | - -dynamic _subscribeInvites(); - +Intervention? getIntervention(); - +int getParticipantCountForInvite(); - +List<ModelAction<dynamic>> availableActions(); - +List<ModelAction<dynamic>> availableInlineActions(); - +void dispose() - ] - - [StudyRecruitController]o-[<abstract>IInviteCodeRepository] - [StudyRecruitController]o-[StreamSubscription] - [StudyBaseController]<:-[StudyRecruitController] - [<abstract>IModelActionProvider]<:--[StudyRecruitController] - - [InviteCodeFormViewModel - | - +study: Study; - +inviteCodeRepository: IInviteCodeRepository; - +codeControl: FormControl<String>; - +codeControlValidationMessages: Map<String, String Function(dynamic)>; - +isPreconfiguredScheduleControl: FormControl<bool>; - +preconfiguredScheduleTypeControl: FormControl<PhaseSequence>; - +interventionAControl: FormControl<String>; - +interventionBControl: FormControl<String>; - +form: FormGroup; - +titles: Map<FormMode, String>; - +interventionControlOptions: List<FormControlOption<String>>; - +preconfiguredScheduleTypeOptions: List<FormControlOption<PhaseSequence>>; - +isPreconfiguredSchedule: bool; - +preconfiguredSchedule: List<String>? - | - +void initControls(); - -dynamic _uniqueInviteCode(); - +void regenerateCode(); - -String _generateCode(); - +StudyInvite buildFormData(); - +void setControlsFrom(); - +dynamic save() - ] - - [InviteCodeFormViewModel]o-[Study] - [InviteCodeFormViewModel]o-[<abstract>IInviteCodeRepository] - [InviteCodeFormViewModel]o-[FormControl] - [InviteCodeFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[InviteCodeFormViewModel] - - [EnrolledBadge - | - +enrolledCount: int - | - +Widget build() - ] - - [InviteCodeFormView - | - +formViewModel: InviteCodeFormViewModel - | - +Widget build(); - -List<FormTableRow> _conditionalInterventionRows() - ] - - [InviteCodeFormView]o-[InviteCodeFormViewModel] - [<abstract>FormConsumerWidget]<:-[InviteCodeFormView] - - [StudyRecruitScreen - | - +Widget build(); - -Widget _inviteCodesSectionHeader(); - -Widget _newInviteCodeButton(); - -dynamic _onSelectInvite() - ] - - [<abstract>StudyPageWidget]<:-[StudyRecruitScreen] - - [DrawerEntry - | - +localizedTitle: String Function(); - +icon: IconData?; - +localizedHelpText: String Function()?; - +enabled: bool; - +onSelected: void Function(BuildContext, WidgetRef)?; - +autoCloseDrawer: bool; - +title: String; - +helpText: String? - | - +void onClick() - ] - - [DrawerEntry]o-[String Function()] - [DrawerEntry]o-[IconData] - [DrawerEntry]o-[String Function()?] - [DrawerEntry]o-[void Function(BuildContext, WidgetRef)?] - - [GoRouterDrawerEntry - | - +intent: RoutingIntent; - +onNavigated: void Function()? - | - +void onClick() - ] - - [GoRouterDrawerEntry]o-[RoutingIntent] - [GoRouterDrawerEntry]o-[void Function()?] - [DrawerEntry]<:-[GoRouterDrawerEntry] - - [AppDrawer - | - +width: int; - +autoCloseDrawer: bool; - +leftPaddingEntries: double; - +logoPaddingVertical: double; - +logoPaddingHorizontal: double; - +logoMaxHeight: double; - +logoSectionMinHeight: double; - +logoSectionMaxHeight: double - ] - - + - + + + - + - + + + - + - + + + - + - + + + - + - - - - + + + + + - - - + + + + + + + + + + + - - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + + + + + + + + + + + + + - + + - + - - - - - - - + + - + + - + - - - + - + - - - + - + - + - + - + - + - + - + - + - + - + - + - - - - - + - + - - - + + + + - + + - + - + - + - - - + - + - + - + - + + + - + - - - - - - - - + + - + - - + + - + - + + + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - - + + - + - - - + - + + + + + + - - - + + + + - + - - - + + + - + - + - + - + - + - + - + - - - + - + - + - + - + - + - - - - - - - + - + - + + + + + + + + + - + - + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - + + + - - + + + + + - + - - + + + - + + + + - + - - + + - + - - - + - + - + - + - + - + - + - + - + - + - - - - - - + + - + - - + + - + - + - + - + - + - - - + - + - + - - - - - - + - - - - + - + - - - - - + + + - + - + - + - + - + - + - + - + + + + + - + - + + + - + - + - + - - - - - - - - - - - - - - - - - + - + - + - - - - + - - - - - - - - - - + - + - + - + - - - + + + + + + + + + - + - + - + - + + + - + - - - - - - - + + + + + - + - + - + - + - + - + - + - + - + - - - - + + + + - + - + - + - + - + - - + + - + - + - + - + + + + + - + - + - + - + + + - - - - - - + - - + - - - + + + + - - - - + - + - + + + + + + - - + - + - - - + - + - + - + - - - - - + - + + + + + + + + + + + - + - - + + + + - + - + + + - + - + - + - + - + - - - + - + - - - - + + + - - + - + - - + + + - - + - - - - + + - + - + + + + + - + - + + + - + - - - + - + - - - + - + - + + + - + - + - - - - - - - - - - - - - - + - - - - - - - - - - + - + - - - - - - - - - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - - - + + + + + + + + - - + - - - - + + + - - - + + + - + + - + - + - + - - - + + - + + - + - - - + - + - + - - + + - + - + - + + + + + + + + + + + + + - + - + - + - + - + - - - - + + + - - - + + - + - + - + - + + + - + - + + + - + - + - + - - - + - + - - - + + + + + + + + - - - + + + - - - + + + - + + + + - + - - - - - + - + - - - + - + - - - - - + - + - + - + + + - + - - - - + + + + - + - - + + - + - + - + - - - + + + - + - + - + - - - + + + + + - + - + + + + + - + - + - + - + - + - - - + + - + + - + - - + + - + - - + + - - - - + - - - - - - - - - - + - + - - - + - + - - - + - + - + - + - - - + - + - - - + - + + + + + - + - - - - - - - - - - + + + - - - - - + + + - - - + + - + - + - + - + - + - + - + - + - - + + - + - - - + - - - - + - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - + + + + - + + - + - + - + - - - + + - - + - + - - - - - - - - - - + + + + + + - + + + + - + + + + + + + + + + - + - + + + - + - + + + - + - + + + - + - + + + - + - + + + + + - + - + + + - + - + - + - - + + + + + - - + + + - + - + - + - + - + - + - + - + - + + + - + - - + + - + - + - + - + - - + + - + - - - + + + - + - + - + - + + + - + - + - + - + - + - + - + - - - - + + + + + + + - - + - + - + - + - + - + + + + + + + + - + + - + - - - + - + - - - - - + - + - + - + - + - + - + + + + + - + - + - + - + - + - - - - - - - + + + + + + - - - WebFrame + + + IAppDelegate - - - +previewSrc: String - +studyId: String + + + +dynamic onAppStart() - - - +Widget build() + + + + + + + + + + AppController - - - - - - - - - DisabledFrame + + + +appDelegates: List<IAppDelegate> + -_delayedFuture: dynamic + +isInitialized: dynamic - - - +Widget build() + + + +dynamic onAppStart() + -dynamic _callDelegates() - - - - - + + + + - - - PhoneContainer + + + StudyMonitorScreen - - - <static>+defaultWidth: double - <static>+defaultHeight: double - +width: double - +height: double - +borderColor: Color - +borderWidth: double - +borderRadius: double - +innerContent: Widget - +innerContentBackgroundColor: Color? + + + +Widget build() - - - +Widget build() + + + + + + + + + + StudyPageWidget - - - - + + + +studyId: String + + - - - Color + + + +Widget? banner() - - - + + + + + - - - Widget + + + LoginForm - - - - - - - - - MobileFrame + + + +formKey: AuthFormKey - - - +Widget build() + + + +Widget build() - - - - + + + + - - - DesktopFrame + + + AuthFormKey - - - +Widget build() + + + +index: int + <static>+values: List<AuthFormKey> + <static>+login: AuthFormKey + <static>+signup: AuthFormKey + <static>+passwordForgot: AuthFormKey + <static>+passwordRecovery: AuthFormKey + <static>-_loginSubmit: AuthFormKey + <static>-_signupSubmit: AuthFormKey - - - - - + + + - - - StudyController + + + FormConsumerRefWidget - - - +notificationService: INotificationService - +studyEventsSubscription: StreamSubscription<ModelEvent<Study>>? - +studyActions: List<ModelAction<dynamic>> + + + + + + + + + + PasswordRecoveryForm - - - +dynamic syncStudyStatus() - +dynamic onStudySubscriptionUpdate() - -dynamic _redirectNewToActualStudyID() - +dynamic publishStudy() - +void onChangeStudyParticipation() - +void onAddParticipants() - +void onSettingsPressed() - +void dispose() + + + +formKey: AuthFormKey + + + + + + +Widget build() - - - + + + + + - - - INotificationService + + + PasswordForgotForm - - - - + + + +formKey: AuthFormKey + + - - - StreamSubscription + + + +Widget build() - - - - - + + + + + - - - StudyBaseController + + + SignupForm - - - +studyId: String - +studyRepository: IStudyRepository - +router: GoRouter - +studySubscription: StreamSubscription<WrappedModel<Study>>? + + + +formKey: AuthFormKey - - - +dynamic subscribeStudy() - +dynamic onStudySubscriptionUpdate() - +dynamic onStudySubscriptionError() - +void dispose() + + + +Widget build() + -dynamic _onClickTermsOfUse() + -dynamic _onClickPrivacyPolicy() - - - - + + + + - - - IStudyAppBarViewModel + + + AuthScaffold - - - +isSyncIndicatorVisible: bool - +isStatusBadgeVisible: bool - +isPublishVisible: bool + + + +body: Widget + +formKey: AuthFormKey + +leftContentMinWidth: double + +leftPanelMinWidth: double + +leftPanelPadding: EdgeInsets - - - - + + + - - - IStudyStatusBadgeViewModel + + + Widget - - - +studyParticipation: Participation? - +studyStatus: StudyStatus? + + + + + + + + EdgeInsets - - - - + + + + - - - IStudyNavViewModel + + + EmailTextField - - - +isEditTabEnabled: bool - +isTestTabEnabled: bool - +isRecruitTabEnabled: bool - +isMonitorTabEnabled: bool - +isAnalyzeTabEnabled: bool - +isSettingsEnabled: bool + + + +labelText: String + +hintText: String? + +formControlName: String? + +formControl: FormControl<dynamic>? - - - - + + + - - - StudyScaffold + + + FormControl - - - +studyId: String - +tabs: List<NavbarTab>? - +tabsSubnav: List<NavbarTab>? - +selectedTab: NavbarTab? - +selectedTabSubnav: NavbarTab? - +body: StudyPageWidget - +drawer: Widget? - +disableActions: bool - +actionsSpacing: double - +actionsPadding: double - +layoutType: SingleColumnLayoutType? - +appbarHeight: double - +appbarSubnavHeight: double + + + + + + + + + PasswordTextField + + + + + + +labelText: String + +hintText: String? + +onSubmitted: dynamic Function(FormControl<dynamic>)? + +formControlName: String? + +formControl: FormControl<dynamic>? - - - + + + - - - NavbarTab + + + dynamic Function(FormControl<dynamic>)? - - - - - + + + + - - - StudyPageWidget + + + StudyUJobsToBeDone - - - +studyId: String + + + +Widget build() - - - +Widget? banner() + + + + + + + + + + AuthFormController - - - - + + + +authRepository: IAuthRepository + +notificationService: INotificationService + +router: GoRouter + +emailControl: FormControl<String> + +passwordControl: FormControl<String> + +passwordConfirmationControl: FormControl<String> + +termsOfServiceControl: FormControl<bool> + <static>+authValidationMessages: Map<String, String Function(dynamic)> + +loginForm: FormGroup + +signupForm: FormGroup + +passwordForgotForm: FormGroup + +passwordRecoveryForm: FormGroup + +controlValidatorsByForm: Map<AuthFormKey, Map<FormControl<dynamic>, List<Validator<dynamic>>>> + -_formKey: AuthFormKey + +formKey: AuthFormKey + +form: FormGroup + + - - - SingleColumnLayoutType + + + -dynamic _getFormFor() + -dynamic _onChangeFormKey() + +dynamic resetControlsFor() + -dynamic _forceValidationMessages() + +dynamic signUp() + -dynamic _signUp() + +dynamic signIn() + -dynamic _signInWith() + +dynamic signOut() + +dynamic resetPasswordForEmail() + +dynamic sendPasswordResetLink() + +dynamic recoverPassword() + +dynamic updateUser() + -dynamic _readDebugUser() - - - - + + + - - - PreviewFrame + + + IAuthRepository - - - +studyId: String - +routeArgs: StudyFormRouteArgs? - +route: String? + + + + + + + + INotificationService - - - + + + - - - StudyFormRouteArgs + + + GoRouter - - - - - + + + - - - RouteInformation + + + FormGroup - - - +route: String? - +extra: String? - +cmd: String? - +data: String? + + + + + + + + + IFormGroupController - - - +String toString() + + + +form: FormGroup - - - - - + + + - - - PlatformController + + + Enum - - - +studyId: String - +baseSrc: String - +previewSrc: String - +routeInformation: RouteInformation - +frameWidget: Widget + + + + + + + + + AppStatus - - - +void activate() - +void registerViews() - +void generateUrl() - +void navigate() - +void refresh() - +void listen() - +void send() - +void openNewPage() + + + +index: int + <static>+values: List<AppStatus> + <static>+initializing: AppStatus + <static>+initialized: AppStatus - - - - - + + + + + - - - WebController + + + FormArrayTable - - - +iFrameElement: IFrameElement + + + +control: AbstractControl<dynamic> + +items: List<T> + +onSelectItem: void Function(T) + +getActionsAt: List<ModelAction<dynamic>> Function(T, int) + +onNewItem: void Function()? + +rowTitle: String Function(T) + +onNewItemLabel: String + +sectionTitle: String? + +sectionDescription: String? + +emptyIcon: IconData? + +emptyTitle: String? + +emptyDescription: String? + +sectionTitleDivider: bool? + +rowPrefix: Widget Function(BuildContext, T, int)? + +rowSuffix: Widget Function(BuildContext, T, int)? + +leadingWidget: Widget? + +itemsSectionPadding: EdgeInsets? + +hideLeadingTrailingWhenEmpty: bool + <static>+columns: List<StandardTableColumn> - - - +void activate() - +void registerViews() - +void generateUrl() - +void navigate() - +void refresh() - +void openNewPage() - +void listen() - +void send() + + + +Widget build() + -List<Widget> _buildRow() + -Widget _newItemButton() - - - + + + - - - IFrameElement + + + AbstractControl - - - - - - - - MobileController - - + + + - - - +void openNewPage() - +void refresh() - +void registerViews() - +void listen() - +void send() - +void navigate() - +void activate() - +void generateUrl() + + + void Function(T) - - - - - + + + - - - StudyParticipationBadge + + + List<ModelAction<dynamic>> Function(T, int) - - - +participation: Participation - +type: BadgeType - +showPrefixIcon: bool - +center: bool - - + + + + - - - +Widget build() + + + void Function()? - - - + + + - - - Participation + + + String Function(T) - - - + + + - - - BadgeType + + + IconData - - - - - + + + - - - StudyTestScreen + + + Widget Function(BuildContext, T, int)? - - - +previewRoute: String? + + + + + + + + + ManagedFormViewModel - - - +Widget build() - +Widget? banner() - +dynamic load() - +dynamic save() - +dynamic showHelp() + + + +ManagedFormViewModel<T> createDuplicate() - - - - - - - - TestAppRoutes - - + + + + + - - - <static>+studyOverview: String - <static>+eligibility: String - <static>+intervention: String - <static>+consent: String - <static>+journey: String - <static>+dashboard: String + + + FormViewModel - - - - - - - - - StudyNav + + + -_formData: T? + -_formMode: FormMode + -_validationSet: FormValidationSetEnum? + +delegate: IFormViewModelDelegate<FormViewModel<dynamic>>? + +autosave: bool + -_immediateFormChildrenSubscriptions: List<StreamSubscription<dynamic>> + -_immediateFormChildrenListenerDebouncer: Debouncer? + -_autosaveOperation: CancelableOperation<dynamic>? + -_defaultControlValidators: Map<String, Tuple<List<Validator<dynamic>>, List<AsyncValidator<dynamic>>>> + +prevFormValue: Map<String, dynamic>? + <static>-_formKey: String + +formData: T? + +formMode: FormMode + +isReadonly: bool + +validationSet: FormValidationSetEnum? + +isDirty: bool + +title: String + +isValid: bool + +titles: Map<FormMode, String> + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - - - <static>+dynamic tabs() - <static>+dynamic edit() - <static>+dynamic test() - <static>+dynamic recruit() - <static>+dynamic monitor() - <static>+dynamic analyze() + + + -dynamic _setFormData() + -dynamic _rememberDefaultControlValidators() + -Tuple<List<Validator<dynamic>>, List<AsyncValidator<dynamic>>>? _getDefaultValidators() + -dynamic _disableAllControls() + -dynamic _formModeUpdated() + -dynamic _restoreControlsFromFormData() + +void revalidate() + -void _applyValidationSet() + +void read() + +dynamic save() + +dynamic cancel() + +void enableAutosave() + +void listenToImmediateFormChildren() + +dynamic markFormGroupChanged() + +void dispose() + +void setControlsFrom() + +T buildFormData() + +void initControls() - - - - + + + - - - StudyDesignNav + + + FormViewModelNotFoundException - - - <static>+dynamic tabs() - <static>+dynamic info() - <static>+dynamic enrollment() - <static>+dynamic interventions() - <static>+dynamic measurements() - <static>+dynamic reports() + + + + + + + + Exception - - - - + + + + + - - - StudyTestController + + + FormViewModelCollection - - - +authRepository: IAuthRepository - +languageCode: String + + + +formViewModels: List<T> + +formArray: FormArray<dynamic> + +stagedViewModels: List<T> + +retrievableViewModels: List<T> + +formData: List<D> - - - - - - - - IAuthRepository + + + +void add() + +T remove() + +T? findWhere() + +T? removeWhere() + +bool contains() + +void stage() + +T commit() + +void reset() + +void read() - - - + + + - - - StudyStatus + + + FormArray - - - - - + + + + + - - - StudyStatusBadge + + + CustomFormControl - - - +participation: Participation? - +status: StudyStatus? - +type: BadgeType - +showPrefixIcon: bool - +showTooltip: bool + + + -_onValueChangedDebouncer: Debouncer? + -_onStatusChangedDebouncer: Debouncer? + +onValueChanged: void Function(T?)? + +onStatusChanged: void Function(ControlStatus)? + +onStatusChangedDebounceTime: int? + +onValueChangedDebounceTime: int? - - - +Widget build() + + + +void dispose() - - - - - + + + - - - FrameControlsWidget + + + Debouncer - - - +onRefresh: void Function()? - +onOpenNewTab: void Function()? - +enabled: bool + + + + + + + + void Function(T?)? - - - +Widget build() + + + + + + + + void Function(ControlStatus)? - - - + + + + - - - void Function()? + + + UnsavedChangesDialog + + + + + + +Widget build() - - - + + + - - - ConsumerWidget + + + FormValidationSetEnum - - - - + + + + + - - - StudySettingsDialog + + + FormControlValidation - - - +Widget build() + + + +control: AbstractControl<dynamic> + +validators: List<Validator<dynamic>> + +asyncValidators: List<AsyncValidator<dynamic>>? + +validationMessages: Map<String, String Function(Object)> + + + + + + +FormControlValidation merge() - - - - - + + + + + - - - StudySettingsFormViewModel + + + IFormData - - - +study: AsyncValue<Study> - +studyRepository: IStudyRepository - <static>+defaultPublishedToRegistry: bool - <static>+defaultPublishedToRegistryResults: bool - +isPublishedToRegistryControl: FormControl<bool> - +isPublishedToRegistryResultsControl: FormControl<bool> - +form: FormGroup - +titles: Map<FormMode, String> + + + +id: String - - - +void setControlsFrom() - +Study buildFormData() - +dynamic keepControlsSynced() - +dynamic save() - +dynamic setLaunchDefaults() + + + +IFormData copy() - - - + + + - - - AsyncValue + + + FormInvalidException - - - + + + + - - - IStudyRepository + + + FormConfigException - - - - - - - - FormControl + + + +message: String? - - - + + + + - - - FormGroup + + + IFormViewModelDelegate + + + + + + +dynamic onSave() + +void onCancel() - - - - - + + + + - - - FormViewModel + + + FormControlOption - - - -_formData: T? - -_formMode: FormMode - -_validationSet: FormValidationSetEnum? - +delegate: IFormViewModelDelegate<FormViewModel<dynamic>>? - +autosave: bool - -_immediateFormChildrenSubscriptions: List<StreamSubscription<dynamic>> - -_immediateFormChildrenListenerDebouncer: Debouncer? - -_autosaveOperation: CancelableOperation<dynamic>? - -_defaultControlValidators: Map<String, Tuple<List<Validator<dynamic>>, List<AsyncValidator<dynamic>>>> - +prevFormValue: Map<String, dynamic>? - <static>-_formKey: String - +formData: T? - +formMode: FormMode - +isReadonly: bool - +validationSet: FormValidationSetEnum? - +isDirty: bool - +title: String - +isValid: bool - +titles: Map<FormMode, String> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + + + +value: T + +label: String + +description: String? + +props: List<Object?> - - - -dynamic _setFormData() - -dynamic _rememberDefaultControlValidators() - -Tuple<List<Validator<dynamic>>, List<AsyncValidator<dynamic>>>? _getDefaultValidators() - -dynamic _disableAllControls() - -dynamic _formModeUpdated() - -dynamic _restoreControlsFromFormData() - +void revalidate() - -void _applyValidationSet() - +void read() - +dynamic save() - +dynamic cancel() - +void enableAutosave() - +void listenToImmediateFormChildren() - +dynamic markFormGroupChanged() - +void dispose() - +void setControlsFrom() - +T buildFormData() - +void initControls() + + + + + + + + Equatable - - - + + + + - - - GoRouter + + + FormMode + + + + + + +index: int + <static>+values: List<FormMode> + <static>+create: FormMode + <static>+readonly: FormMode + <static>+edit: FormMode - - - + + + - - - IWithBanner + + + CancelableOperation - - - - + + + + + - - - AppStatus + + + EnrolledBadge - - - +index: int - <static>+values: List<AppStatus> - <static>+initializing: AppStatus - <static>+initialized: AppStatus + + + +enrolledCount: int + + + + + + +Widget build() - - - + + + + + - - - Enum + + + StudyRecruitController + + + + + + +inviteCodeRepository: IInviteCodeRepository + -_invitesSubscription: StreamSubscription<List<WrappedModel<StudyInvite>>>? + + + + + + -dynamic _subscribeInvites() + +Intervention? getIntervention() + +int getParticipantCountForInvite() + +List<ModelAction<dynamic>> availableActions() + +List<ModelAction<dynamic>> availableInlineActions() + +void dispose() - - - - + + + - - - IAppDelegate + + + IInviteCodeRepository - - - +dynamic onAppStart() + + + + + + + + StreamSubscription - - - - - + + + + + - - - AppController + + + StudyBaseController - - - +appDelegates: List<IAppDelegate> - -_delayedFuture: dynamic - +isInitialized: dynamic + + + +studyId: String + +studyRepository: IStudyRepository + +router: GoRouter + +studySubscription: StreamSubscription<WrappedModel<Study>>? - - - +dynamic onAppStart() - -dynamic _callDelegates() + + + +dynamic subscribeStudy() + +dynamic onStudySubscriptionUpdate() + +dynamic onStudySubscriptionError() + +void dispose() - - - + + + - - - App + + + IModelActionProvider - - - + + + + - - - AppContent + + + StudyRecruitScreen + + + + + + +Widget build() + -Widget _inviteCodesSectionHeader() + -Widget _newInviteCodeButton() + -dynamic _onSelectInvite() - - - - - + + + + + - - - AuthFormController + + + InviteCodeFormView - - - +authRepository: IAuthRepository - +notificationService: INotificationService - +router: GoRouter - +emailControl: FormControl<String> - +passwordControl: FormControl<String> - +passwordConfirmationControl: FormControl<String> - +termsOfServiceControl: FormControl<bool> - <static>+authValidationMessages: Map<String, String Function(dynamic)> - +loginForm: FormGroup - +signupForm: FormGroup - +passwordForgotForm: FormGroup - +passwordRecoveryForm: FormGroup - +controlValidatorsByForm: Map<AuthFormKey, Map<FormControl<dynamic>, List<Validator<dynamic>>>> - -_formKey: AuthFormKey - +formKey: AuthFormKey - +form: FormGroup + + + +formViewModel: InviteCodeFormViewModel - - - -dynamic _getFormFor() - -dynamic _onChangeFormKey() - +dynamic resetControlsFor() - -dynamic _forceValidationMessages() - +dynamic signUp() - -dynamic _signUp() - +dynamic signIn() - -dynamic _signInWith() - +dynamic signOut() - +dynamic resetPasswordForEmail() - +dynamic sendPasswordResetLink() - +dynamic recoverPassword() - +dynamic updateUser() - -dynamic _readDebugUser() + + + +Widget build() + -List<FormTableRow> _conditionalInterventionRows() - - - - + + + + + - - - AuthFormKey + + + InviteCodeFormViewModel - - - +index: int - <static>+values: List<AuthFormKey> - <static>+login: AuthFormKey - <static>+signup: AuthFormKey - <static>+passwordForgot: AuthFormKey - <static>+passwordRecovery: AuthFormKey - <static>-_loginSubmit: AuthFormKey - <static>-_signupSubmit: AuthFormKey + + + +study: Study + +inviteCodeRepository: IInviteCodeRepository + +codeControl: FormControl<String> + +codeControlValidationMessages: Map<String, String Function(dynamic)> + +isPreconfiguredScheduleControl: FormControl<bool> + +preconfiguredScheduleTypeControl: FormControl<PhaseSequence> + +interventionAControl: FormControl<String> + +interventionBControl: FormControl<String> + +form: FormGroup + +titles: Map<FormMode, String> + +interventionControlOptions: List<FormControlOption<String>> + +preconfiguredScheduleTypeOptions: List<FormControlOption<PhaseSequence>> + +isPreconfiguredSchedule: bool + +preconfiguredSchedule: List<String>? - - - - - - - - - IFormGroupController + + + +void initControls() + -dynamic _uniqueInviteCode() + +void regenerateCode() + -String _generateCode() + +StudyInvite buildFormData() + +void setControlsFrom() + +dynamic save() - - - +form: FormGroup + + + + + + + + FormConsumerWidget - - - - - + + + + + - - - PasswordRecoveryForm + + + StudyInvitesTable + + + + + + +invites: List<StudyInvite> + +onSelect: void Function(StudyInvite) + +getActions: List<ModelAction<dynamic>> Function(StudyInvite) + +getInlineActions: List<ModelAction<dynamic>> Function(StudyInvite) + +getIntervention: Intervention? Function(String) + +getParticipantCountForInvite: int Function(StudyInvite) - - - +formKey: AuthFormKey + + + +Widget build() + -List<Widget> _buildRow() - - - +Widget build() + + + + + + + + void Function(StudyInvite) - - - + + + - - - FormConsumerRefWidget + + + List<ModelAction<dynamic>> Function(StudyInvite) - - - - - + + + - - - PasswordForgotForm + + + Intervention? Function(String) - - - +formKey: AuthFormKey - - + + + + - - - +Widget build() + + + int Function(StudyInvite) - - - - - + + + - - - LoginForm + + + Study - - - +formKey: AuthFormKey + + + + + + + + + PublishSuccessDialog - - - +Widget build() + + + +Widget build() - - - - + + + + - - - EmailTextField + + + PublishDialog - - - +labelText: String - +hintText: String? - +formControlName: String? - +formControl: FormControl<dynamic>? + + + +Widget build() - - - - + + + + - - - PasswordTextField + + + PublishConfirmationDialog - - - +labelText: String - +hintText: String? - +onSubmitted: dynamic Function(FormControl<dynamic>)? - +formControlName: String? - +formControl: FormControl<dynamic>? + + + +Widget build() - - - + + + + + - - - dynamic Function(FormControl<dynamic>)? + + + FrameControlsWidget - - - - - - - - - - SignupForm + + + +onRefresh: void Function()? + +onOpenNewTab: void Function()? + +enabled: bool - - - +formKey: AuthFormKey + + + +Widget build() - - - +Widget build() - -dynamic _onClickTermsOfUse() - -dynamic _onClickPrivacyPolicy() + + + + + + + + ConsumerWidget - - - - + + + + - - - StudyUJobsToBeDone + + + IStudyStatusBadgeViewModel - - - +Widget build() + + + +studyParticipation: Participation? + +studyStatus: StudyStatus? - - - - + + + - - - AuthScaffold + + + Participation - - - +body: Widget - +formKey: AuthFormKey - +leftContentMinWidth: double - +leftPanelMinWidth: double - +leftPanelPadding: EdgeInsets + + + + + + + + StudyStatus - - - + + + + + - - - EdgeInsets + + + StudyStatusBadge - - - - - - - - - PublishDialog + + + +participation: Participation? + +status: StudyStatus? + +type: BadgeType + +showPrefixIcon: bool + +showTooltip: bool - - - +Widget build() + + + +Widget build() - - - - + + + - - - PublishSuccessDialog + + + BadgeType - - - +Widget build() + + + + + + + + + + RouteInformation - - - - - - - - - PublishConfirmationDialog + + + +route: String? + +extra: String? + +cmd: String? + +data: String? - - - +Widget build() + + + +String toString() - - - - - + + + + + - - - FormArrayTable + + + PlatformController - - - +control: AbstractControl<dynamic> - +items: List<T> - +onSelectItem: void Function(T) - +getActionsAt: List<ModelAction<dynamic>> Function(T, int) - +onNewItem: void Function()? - +rowTitle: String Function(T) - +onNewItemLabel: String - +sectionTitle: String? - +sectionDescription: String? - +emptyIcon: IconData? - +emptyTitle: String? - +emptyDescription: String? - +sectionTitleDivider: bool? - +rowPrefix: Widget Function(BuildContext, T, int)? - +rowSuffix: Widget Function(BuildContext, T, int)? - +leadingWidget: Widget? - +itemsSectionPadding: EdgeInsets? - +hideLeadingTrailingWhenEmpty: bool - <static>+columns: List<StandardTableColumn> + + + +studyId: String + +baseSrc: String + +previewSrc: String + +routeInformation: RouteInformation + +frameWidget: Widget - - - +Widget build() - -List<Widget> _buildRow() - -Widget _newItemButton() + + + +void activate() + +void registerViews() + +void generateUrl() + +void navigate() + +void refresh() + +void listen() + +void send() + +void openNewPage() - - - + + + + + - - - AbstractControl + + + WebController - - - - - - - - void Function(T) + + + +iFrameElement: IFrameElement - - - - - - - - List<ModelAction<dynamic>> Function(T, int) + + + +void activate() + +void registerViews() + +void generateUrl() + +void navigate() + +void refresh() + +void openNewPage() + +void listen() + +void send() - - - + + + - - - String Function(T) + + + IFrameElement - - - + + + + - - - IconData + + + MobileController - - - - - - - - Widget Function(BuildContext, T, int)? + + + +void openNewPage() + +void refresh() + +void registerViews() + +void listen() + +void send() + +void navigate() + +void activate() + +void generateUrl() - - - - - + + + + + - - - IFormData + + + StudyController - - - +id: String + + + +notificationService: INotificationService + +studyEventsSubscription: StreamSubscription<ModelEvent<Study>>? + +studyActions: List<ModelAction<dynamic>> - - - +IFormData copy() + + + +dynamic syncStudyStatus() + +dynamic onStudySubscriptionUpdate() + -dynamic _redirectNewToActualStudyID() + +dynamic publishStudy() + +void onChangeStudyParticipation() + +void onAddParticipants() + +void onSettingsPressed() + +void dispose() - - - - + + + + - - - ManagedFormViewModel + + + IStudyNavViewModel - - - +ManagedFormViewModel<T> createDuplicate() + + + +isEditTabEnabled: bool + +isTestTabEnabled: bool + +isRecruitTabEnabled: bool + +isMonitorTabEnabled: bool + +isAnalyzeTabEnabled: bool + +isSettingsEnabled: bool - - - + + + + - - - FormViewModelNotFoundException + + + StudyNav - - - - - - - - Exception + + + <static>+dynamic tabs() + <static>+dynamic edit() + <static>+dynamic test() + <static>+dynamic recruit() + <static>+dynamic monitor() + <static>+dynamic analyze() - - - - - - - - - FormViewModelCollection - - + + + + - - - +formViewModels: List<T> - +formArray: FormArray<dynamic> - +stagedViewModels: List<T> - +retrievableViewModels: List<T> - +formData: List<D> + + + StudyDesignNav - - - +void add() - +T remove() - +T? findWhere() - +T? removeWhere() - +bool contains() - +void stage() - +T commit() - +void reset() - +void read() + + + <static>+dynamic tabs() + <static>+dynamic info() + <static>+dynamic enrollment() + <static>+dynamic interventions() + <static>+dynamic measurements() + <static>+dynamic reports() - - - + + + - - - FormArray + + + IWithBanner - - - + + + + + - - - FormInvalidException + + + StudyParticipationBadge - - - - - - - - - FormConfigException + + + +participation: Participation + +type: BadgeType + +showPrefixIcon: bool + +center: bool - - - +message: String? + + + +Widget build() - - - - - - - - IFormViewModelDelegate - - + + + - - - +dynamic onSave() - +void onCancel() + + + IStudyRepository - - - - + + + + - - - FormControlOption + + + PreviewFrame - - - +value: T - +label: String - +description: String? - +props: List<Object?> + + + +studyId: String + +routeArgs: StudyFormRouteArgs? + +route: String? - - - + + + - - - Equatable + + + StudyFormRouteArgs - - - - + + + + - - - FormMode + + + IStudyAppBarViewModel - - - +index: int - <static>+values: List<FormMode> - <static>+create: FormMode - <static>+readonly: FormMode - <static>+edit: FormMode + + + +isSyncIndicatorVisible: bool + +isStatusBadgeVisible: bool + +isPublishVisible: bool - - - + + + + + + + + StudyScaffold + + - - - FormValidationSetEnum + + + +studyId: String + +tabs: List<NavbarTab>? + +tabsSubnav: List<NavbarTab>? + +selectedTab: NavbarTab? + +selectedTabSubnav: NavbarTab? + +body: StudyPageWidget + +drawer: Widget? + +disableActions: bool + +actionsSpacing: double + +actionsPadding: double + +layoutType: SingleColumnLayoutType? + +appbarHeight: double + +appbarSubnavHeight: double - - - + + + - - - Debouncer + + + NavbarTab - - - + + + - - - CancelableOperation + + + SingleColumnLayoutType - - - - - + + + + + - - - CustomFormControl + + + WebFrame - - - -_onValueChangedDebouncer: Debouncer? - -_onStatusChangedDebouncer: Debouncer? - +onValueChanged: void Function(T?)? - +onStatusChanged: void Function(ControlStatus)? - +onStatusChangedDebounceTime: int? - +onValueChangedDebounceTime: int? + + + +previewSrc: String + +studyId: String - - - +void dispose() + + + +Widget build() - - - + + + + - - - void Function(T?)? + + + DisabledFrame - - - - - - - - void Function(ControlStatus)? + + + +Widget build() - - - - + + + + + - - - UnsavedChangesDialog + + + PhoneContainer - - - +Widget build() + + + <static>+defaultWidth: double + <static>+defaultHeight: double + +width: double + +height: double + +borderColor: Color + +borderWidth: double + +borderRadius: double + +innerContent: Widget + +innerContentBackgroundColor: Color? + + + + + + +Widget build() - - - - - + + + - - - FormControlValidation + + + Color - - - +control: AbstractControl<dynamic> - +validators: List<Validator<dynamic>> - +asyncValidators: List<AsyncValidator<dynamic>>? - +validationMessages: Map<String, String Function(Object)> + + + + + + + + + MobileFrame - - - +FormControlValidation merge() + + + +Widget build() - - - - - - - - - ScreenerQuestionFormViewModel - - + + + + - - - <static>+defaultResponseOptionValidity: bool - +responseOptionsDisabledArray: FormArray<dynamic> - +responseOptionsLogicControls: FormArray<bool> - +responseOptionsLogicDescriptionControls: FormArray<String> - -_questionBaseControls: Map<String, AbstractControl<dynamic>> - +prevResponseOptionControls: List<AbstractControl<dynamic>> - +prevResponseOptionValues: List<dynamic> - +responseOptionsDisabledControls: List<AbstractControl<dynamic>> - +logicControlOptions: List<FormControlOption<bool>> - +questionBaseControls: Map<String, AbstractControl<dynamic>> - +isDirtyOptionsBannerVisible: bool + + + DesktopFrame - - - +dynamic onResponseOptionsChanged() - +void setControlsFrom() - +QuestionFormData buildFormData() - -List<FormControl<dynamic>> _copyFormControls() - -AbstractControl<dynamic>? _findAssociatedLogicControlFor() - -AbstractControl<dynamic>? _findAssociatedControlFor() - +ScreenerQuestionFormViewModel createDuplicate() + + + +Widget build() - - - - - + + + + + - - - QuestionFormViewModel + + + StudyTestScreen - - - <static>+defaultQuestionType: SurveyQuestionType - -_titles: Map<FormMode, String Function()>? - +questionIdControl: FormControl<String> - +questionTypeControl: FormControl<SurveyQuestionType> - +questionTextControl: FormControl<String> - +questionInfoTextControl: FormControl<String> - +questionBaseControls: Map<String, AbstractControl<dynamic>> - +isMultipleChoiceControl: FormControl<bool> - +choiceResponseOptionsArray: FormArray<dynamic> - +customOptionsMin: int - +customOptionsMax: int - +customOptionsInitial: int - +boolResponseOptionsArray: FormArray<String> - +imageResponseOptionsArray: FormArray<String> - <static>+kDefaultMaxRecordingDurationSeconds: int - <static>+kMaxRecordingDurationSeconds: int - +audioResponseOptionsArray: FormArray<String> - +maxRecordingDurationSecondsControl: FormControl<int> - <static>+kDefaultScaleMinValue: int - <static>+kDefaultScaleMaxValue: int - <static>+kNumMidValueControls: int - <static>+kMidValueDebounceMilliseconds: int - +scaleMinValueControl: FormControl<int> - +scaleMaxValueControl: FormControl<int> - -_scaleRangeControl: FormControl<int> - +scaleMinLabelControl: FormControl<String> - +scaleMaxLabelControl: FormControl<String> - +scaleMidValueControls: FormArray<int> - +scaleMidLabelControls: FormArray<String?> - -_scaleResponseOptionsArray: FormArray<int> - +scaleMinColorControl: FormControl<SerializableColor> - +scaleMaxColorControl: FormControl<SerializableColor> - +prevMidValues: List<int?>? - +freeTextTypeControl: FormControl<FreeTextQuestionType> - +customRegexControl: FormControl<String> - +freeTextResponseOptionsArray: FormArray<dynamic> - +freeTextLengthMin: AbstractControl<int> - +freeTextLengthMax: AbstractControl<int> - +freeTextExampleTextControl: FormControl<String> - <static>+kDefaultFreeTextMinLength: int - <static>+kDefaultFreeTextMaxLength: int - +freeTextLengthControl: FormControl<RangeValues> - -_controlsByQuestionType: Map<SurveyQuestionType, FormGroup> - -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - -_validationConfigsByQuestionType: Map<SurveyQuestionType, Map<FormValidationSetEnum, List<FormControlValidation>>> - +form: FormGroup - +questionId: String - +questionType: SurveyQuestionType - +questionTypeControlOptions: List<FormControlOption<SurveyQuestionType>> - +answerOptionsArray: FormArray<dynamic> - +answerOptionsControls: List<AbstractControl<dynamic>> - +validAnswerOptions: List<String> - +boolOptions: List<AbstractControl<String>> - +imageOptions: List<AbstractControl<String>> - +audioOptions: List<AbstractControl<String>> - +scaleMinValue: int - +scaleMaxValue: int - +scaleRange: int - +scaleAllValueControls: List<AbstractControl<int>> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +questionTextRequired: dynamic - +numValidChoiceOptions: dynamic - +scaleRangeValid: dynamic - +maxRecordingDurationValid: dynamic - +titles: Map<FormMode, String> - +isAddOptionButtonVisible: bool - +isMidValuesClearedInfoVisible: bool + + + +previewRoute: String? - - - +String? scaleMidLabelAt() - -dynamic _onScaleRangeChanged() - -dynamic _applyInputFormatters() - -dynamic _updateScaleMidValueControls() - -Map<String, dynamic>? _validateFreeText() - -dynamic _onFreeTextLengthChanged() - -List<FormControlValidation> _getValidationConfig() - +dynamic onQuestionTypeChanged() - +dynamic onResponseOptionsChanged() - -void _updateFormControls() - +void initControls() - +void setControlsFrom() - +QuestionFormData buildFormData() - +List<ModelAction<dynamic>> availableActions() - +void onNewItem() - +void onSelectItem() - +dynamic save() - +QuestionFormViewModel createDuplicate() + + + +Widget build() + +Widget? banner() + +dynamic load() + +dynamic save() + +dynamic showHelp() - - - - + + + + + - - - IScreenerQuestionLogicFormViewModel + + + StudySettingsFormViewModel - - - +isDirtyOptionsBannerVisible: bool + + + +study: AsyncValue<Study> + +studyRepository: IStudyRepository + <static>+defaultPublishedToRegistry: bool + <static>+defaultPublishedToRegistryResults: bool + +isPublishedToRegistryControl: FormControl<bool> + +isPublishedToRegistryResultsControl: FormControl<bool> + +form: FormGroup + +titles: Map<FormMode, String> - - - - - - - - - StudyDesignEnrollmentFormView + + + +void setControlsFrom() + +Study buildFormData() + +dynamic keepControlsSynced() + +dynamic save() + +dynamic setLaunchDefaults() - - - +Widget build() - -dynamic _showScreenerQuestionSidesheetWithArgs() - -dynamic _showConsentItemSidesheetWithArgs() + + + + + + + + AsyncValue - - - - + + + + - - - StudyDesignPageWidget + + + StudySettingsDialog - - - +Widget? banner() + + + +Widget build() - - - - - + + + + - - - ScreenerQuestionLogicFormView + + + StudyTestController - - - +formViewModel: ScreenerQuestionFormViewModel + + + +authRepository: IAuthRepository + +languageCode: String - - - +Widget build() - -dynamic _buildInfoBanner() - -dynamic _buildAnswerOptionsLogicControls() - -List<Widget> _buildOptionLogicRow() + + + + + + + + + TestAppRoutes - - - - - - - - FormConsumerWidget + + + <static>+studyOverview: String + <static>+eligibility: String + <static>+intervention: String + <static>+consent: String + <static>+journey: String + <static>+dashboard: String - - - - - + + + + + - - - ConsentItemFormData + + + DrawerEntry - - - +consentId: String - +title: String - +description: String - +iconName: String? - +id: String + + + +localizedTitle: String Function() + +icon: IconData? + +localizedHelpText: String Function()? + +enabled: bool + +onSelected: void Function(BuildContext, WidgetRef)? + +autoCloseDrawer: bool + +title: String + +helpText: String? - - - +ConsentItem toConsentItem() - +ConsentItemFormData copy() + + + +void onClick() - - - - - + + + - - - EnrollmentFormViewModel + + + String Function() - - - +study: Study - +router: GoRouter - +consentItemDelegate: EnrollmentFormConsentItemDelegate - +enrollmentTypeControl: FormControl<Participation> - +consentItemArray: FormArray<dynamic> - +consentItemFormViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData> - +form: FormGroup - +enrollmentTypeControlOptions: List<FormControlOption<Participation>> - +consentItemModels: List<ConsentItemFormViewModel> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titles: Map<FormMode, String> - +canTestScreener: bool - +canTestConsent: bool - +questionTitles: Map<FormMode, String Function()> - - + + + + - - - +void setControlsFrom() - +EnrollmentFormData buildFormData() - +void read() - +List<ModelAction<dynamic>> availableActions() - +List<ModelAction<dynamic>> availablePopupActions() - +List<ModelAction<dynamic>> availableInlineActions() - +void onSelectItem() - +void onNewItem() - +ScreenerQuestionFormRouteArgs buildNewScreenerQuestionFormRouteArgs() - +ScreenerQuestionFormRouteArgs buildScreenerQuestionFormRouteArgs() - +ConsentItemFormRouteArgs buildNewConsentItemFormRouteArgs() - +ConsentItemFormRouteArgs buildConsentItemFormRouteArgs() - +dynamic testScreener() - +dynamic testConsent() - +ScreenerQuestionFormViewModel provideQuestionFormViewModel() + + + String Function()? - - - + + + - - - Study + + + void Function(BuildContext, WidgetRef)? - - - - - + + + + + - - - EnrollmentFormConsentItemDelegate + + + GoRouterDrawerEntry - - - +formViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData> - +owner: EnrollmentFormViewModel - +propagateOnSave: bool - +validationSet: dynamic + + + +intent: RoutingIntent + +onNavigated: void Function()? - - - +void onCancel() - +dynamic onSave() - +ConsentItemFormViewModel provide() - +List<ModelAction<dynamic>> availableActions() - +void onNewItem() - +void onSelectItem() + + + +void onClick() - - - - - + + + - - - WithQuestionnaireControls + + + RoutingIntent - - - +questionsArray: FormArray<dynamic> - +questionFormViewModels: FormViewModelCollection<Q, QuestionFormData> - +questionnaireControls: Map<String, FormArray<dynamic>> - +propagateOnSave: bool - +questionModels: List<Q> - +questionTitles: Map<FormMode, String Function()> - - + + + + + - - - +void setQuestionnaireControlsFrom() - +QuestionnaireFormData buildQuestionnaireFormData() - +void read() - +void onCancel() - +dynamic onSave() - +Q provide() - +Q provideQuestionFormViewModel() + + + AppDrawer - - - - - - - - IListActionProvider + + + +width: int + +autoCloseDrawer: bool + +leftPaddingEntries: double + +logoPaddingVertical: double + +logoPaddingHorizontal: double + +logoMaxHeight: double + +logoSectionMinHeight: double + +logoSectionMaxHeight: double - - - + + + + - - - IProviderArgsResolver + + + StudyAnalyzeScreen - - - - - - - - - - ConsentItemFormViewModel + + + +Widget? banner() + +Widget build() - - - +consentIdControl: FormControl<String> - +titleControl: FormControl<String> - +descriptionControl: FormControl<String> - +iconControl: FormControl<IconOption> - +form: FormGroup - +consentId: String - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titleRequired: dynamic - +descriptionRequired: dynamic - +titles: Map<FormMode, String> + + + + + + + + + StudyAnalyzeController - - - +void setControlsFrom() - +ConsentItemFormData buildFormData() - +ConsentItemFormViewModel createDuplicate() + + + +dynamic onExport() - - - - + + + + - - - ConsentItemFormView + + + StudyDesignInterventionsFormView - - - +formViewModel: ConsentItemFormViewModel + + + +Widget build() - - - - - + + + + - - - EnrollmentFormData + + + StudyDesignPageWidget - - - <static>+kDefaultEnrollmentType: Participation - +enrollmentType: Participation - +questionnaireFormData: QuestionnaireFormData - +consentItemsFormData: List<ConsentItemFormData>? - +id: String + + + +Widget? banner() - - - +Study apply() - +EnrollmentFormData copy() + + + + + + + + + InterventionFormView + + + + + + +formViewModel: InterventionFormViewModel - - - - - + + + + + - - - QuestionnaireFormData + + + InterventionFormViewModel - - - +questionsData: List<QuestionFormData>? - +id: String + + + +study: Study + +interventionIdControl: FormControl<String> + +interventionTitleControl: FormControl<String> + +interventionIconControl: FormControl<IconOption> + +interventionDescriptionControl: FormControl<String> + +interventionTasksArray: FormArray<dynamic> + +tasksCollection: FormViewModelCollection<InterventionTaskFormViewModel, InterventionTaskFormData> + +form: FormGroup + +interventionId: String + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titleRequired: dynamic + +atLeastOneTask: dynamic + +breadcrumbsTitle: String + +titles: Map<FormMode, String> - - - +StudyUQuestionnaire toQuestionnaire() - +List<EligibilityCriterion> toEligibilityCriteria() - +QuestionnaireFormData copy() + + + +void setControlsFrom() + +InterventionFormData buildFormData() + +List<ModelAction<dynamic>> availableActions() + +List<ModelAction<dynamic>> availablePopupActions() + +List<ModelAction<dynamic>> availableInlineActions() + +void onSelectItem() + +void onNewItem() + +void onCancel() + +dynamic onSave() + +InterventionTaskFormViewModel provide() + +InterventionTaskFormRouteArgs buildNewFormRouteArgs() + +InterventionTaskFormRouteArgs buildFormRouteArgs() + +InterventionFormViewModel createDuplicate() - - - - + + + + + - - - IStudyFormData + + + InterventionPreview - - - +Study apply() + + + +routeArgs: InterventionFormRouteArgs - - - - - - - - - StudyDesignInterventionsFormView + + + +Widget build() - - - +Widget build() + + + + + + + + InterventionFormRouteArgs - - - - - + + + + + - - - InterventionsFormViewModel + + + StudyScheduleFormView - - - +study: Study - +router: GoRouter - +interventionsArray: FormArray<dynamic> - +interventionsCollection: FormViewModelCollection<InterventionFormViewModel, InterventionFormData> - +form: FormGroup - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +interventionsRequired: dynamic - +titles: Map<FormMode, String> - +canTestStudySchedule: bool + + + +formViewModel: StudyScheduleControls - - - +void setControlsFrom() - +InterventionsFormData buildFormData() - +void read() - +List<ModelAction<dynamic>> availableActions() - +List<ModelAction<dynamic>> availablePopupActions() - +List<ModelAction<dynamic>> availableInlineActions() - +void onSelectItem() - +void onNewItem() - +InterventionFormViewModel provide() - +void onCancel() - +dynamic onSave() - +dynamic testStudySchedule() + + + -FormTableRow _renderCustomSequence() + +Widget build() - - - + + + - + StudyScheduleControls - + <static>+defaultScheduleType: PhaseSequence <static>+defaultScheduleTypeSequence: String @@ -6176,7 +6148,7 @@ - + +void setStudyScheduleControlsFrom() +StudyScheduleFormData buildStudyScheduleFormData() @@ -6185,69 +6157,19 @@ - - - - - - - - - InterventionFormViewModel - - - - - - +study: Study - +interventionIdControl: FormControl<String> - +interventionTitleControl: FormControl<String> - +interventionIconControl: FormControl<IconOption> - +interventionDescriptionControl: FormControl<String> - +interventionTasksArray: FormArray<dynamic> - +tasksCollection: FormViewModelCollection<InterventionTaskFormViewModel, InterventionTaskFormData> - +form: FormGroup - +interventionId: String - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titleRequired: dynamic - +atLeastOneTask: dynamic - +breadcrumbsTitle: String - +titles: Map<FormMode, String> - - - - - - +void setControlsFrom() - +InterventionFormData buildFormData() - +List<ModelAction<dynamic>> availableActions() - +List<ModelAction<dynamic>> availablePopupActions() - +List<ModelAction<dynamic>> availableInlineActions() - +void onSelectItem() - +void onNewItem() - +void onCancel() - +dynamic onSave() - +InterventionTaskFormViewModel provide() - +InterventionTaskFormRouteArgs buildNewFormRouteArgs() - +InterventionTaskFormRouteArgs buildFormRouteArgs() - +InterventionFormViewModel createDuplicate() - - - - - - - + + + - + InterventionTaskFormData - + +taskId: String +taskTitle: String @@ -6257,7 +6179,7 @@ - + +CheckmarkTask toTask() +InterventionTaskFormData copy() @@ -6267,17 +6189,17 @@ - - - + + + - + IFormDataWithSchedule - + +instanceId: String +isTimeLocked: bool @@ -6288,105 +6210,92 @@ - + - +Schedule toSchedule() - - - - - - - - - - - - - StudyScheduleFormData - - - - - - +sequenceType: PhaseSequence - +sequenceTypeCustom: String - +numCycles: int - +phaseDuration: int - +includeBaseline: bool - +id: String - - - - - - +StudySchedule toStudySchedule() - +Study apply() - +StudyScheduleFormData copy() - - - - - - - - - - - PhaseSequence + +Schedule toSchedule() - - - - - + + + + + - - - InterventionPreview + + + InterventionsFormViewModel - - - +routeArgs: InterventionFormRouteArgs + + + +study: Study + +router: GoRouter + +interventionsArray: FormArray<dynamic> + +interventionsCollection: FormViewModelCollection<InterventionFormViewModel, InterventionFormData> + +form: FormGroup + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +interventionsRequired: dynamic + +titles: Map<FormMode, String> + +canTestStudySchedule: bool - - - +Widget build() + + + +void setControlsFrom() + +InterventionsFormData buildFormData() + +void read() + +List<ModelAction<dynamic>> availableActions() + +List<ModelAction<dynamic>> availablePopupActions() + +List<ModelAction<dynamic>> availableInlineActions() + +void onSelectItem() + +void onNewItem() + +InterventionFormViewModel provide() + +void onCancel() + +dynamic onSave() + +dynamic testStudySchedule() - - - + + + - - - InterventionFormRouteArgs + + + IListActionProvider + + + + + + + + + + + IProviderArgsResolver - - - + + + - + InterventionTaskFormViewModel - + +taskIdControl: FormControl<String> +instanceIdControl: FormControl<String> @@ -6402,7 +6311,7 @@ - + +void setControlsFrom() +InterventionTaskFormData buildFormData() @@ -6413,17 +6322,17 @@ - - - + + + - + WithScheduleControls - + +isTimeRestrictedControl: FormControl<bool> +instanceID: FormControl<String> @@ -6442,7 +6351,7 @@ - + +void setScheduleControlsFrom() -dynamic _initReminderControl() @@ -6450,83 +6359,30 @@ - - - - - - - - - InterventionsFormData - - - - - - +interventionsData: List<InterventionFormData> - +studyScheduleData: StudyScheduleFormData - +id: String - - - - - - +Study apply() - +InterventionsFormData copy() - - - - - - - - - - - - InterventionFormView - - - - - - +formViewModel: InterventionFormViewModel - - - - - - - - - - - - InterventionTaskFormView - - + + + - - - +formViewModel: InterventionTaskFormViewModel + + + PhaseSequence - - - + + + - + InterventionFormData - + +interventionId: String +title: String @@ -6538,7 +6394,7 @@ - + +Intervention toIntervention() +InterventionFormData copy() @@ -6546,562 +6402,348 @@ - - - - - - - - - StudyScheduleFormView - - - - - - +formViewModel: StudyScheduleControls - - - - - - -FormTableRow _renderCustomSequence() - +Widget build() - - - - - - - - - - - - - StudyInfoFormData - - - - - - +title: String - +description: String? - +iconName: String - +contactInfoFormData: StudyContactInfoFormData - +id: String - - - - - - +Study apply() - +StudyInfoFormData copy() - - - - - - - - - - - - - StudyContactInfoFormData - - - - - - +organization: String? - +institutionalReviewBoard: String? - +institutionalReviewBoardNumber: String? - +researchers: String? - +email: String? - +website: String? - +phone: String? - +additionalInfo: String? - +id: String - - - - - - +Study apply() - +StudyInfoFormData copy() - - - - - - - - - - - - StudyDesignInfoFormView - - - - - - +Widget build() - - - - - - - - - - - - - StudyInfoFormViewModel - - - - - - +study: Study - +titleControl: FormControl<String> - +iconControl: FormControl<IconOption> - +descriptionControl: FormControl<String> - +organizationControl: FormControl<String> - +reviewBoardControl: FormControl<String> - +reviewBoardNumberControl: FormControl<String> - +researchersControl: FormControl<String> - +emailControl: FormControl<String> - +websiteControl: FormControl<String> - +phoneControl: FormControl<String> - +additionalInfoControl: FormControl<String> - +form: FormGroup - +titles: Map<FormMode, String> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titleRequired: dynamic - +descriptionRequired: dynamic - +iconRequired: dynamic - +organizationRequired: dynamic - +reviewBoardRequired: dynamic - +reviewBoardNumberRequired: dynamic - +researchersRequired: dynamic - +emailRequired: dynamic - +phoneRequired: dynamic - +emailFormat: dynamic - +websiteFormat: dynamic - - - - - - +void setControlsFrom() - +StudyInfoFormData buildFormData() - - - - - - - - - + + + + + - - - MeasurementSurveyFormData + + + StudyScheduleFormData - - - +measurementId: String - +title: String - +introText: String? - +outroText: String? - +questionnaireFormData: QuestionnaireFormData - <static>+kDefaultTitle: String - +id: String + + + +sequenceType: PhaseSequence + +sequenceTypeCustom: String + +numCycles: int + +phaseDuration: int + +includeBaseline: bool + +id: String - - - +QuestionnaireTask toQuestionnaireTask() - +MeasurementSurveyFormData copy() + + + +StudySchedule toStudySchedule() + +Study apply() + +StudyScheduleFormData copy() - - - - + + + + - - - MeasurementSurveyFormView + + + IStudyFormData - - - +formViewModel: MeasurementSurveyFormViewModel + + + +Study apply() - - - - - - - - - MeasurementSurveyFormViewModel - - + + + + - - - +study: Study - +measurementIdControl: FormControl<String> - +instanceIdControl: FormControl<String> - +surveyTitleControl: FormControl<String> - +surveyIntroTextControl: FormControl<String> - +surveyOutroTextControl: FormControl<String> - +form: FormGroup - +measurementId: String - +instanceId: String - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titleRequired: dynamic - +atLeastOneQuestion: dynamic - +breadcrumbsTitle: String - +titles: Map<FormMode, String> + + + InterventionTaskFormView - - - +void setControlsFrom() - +MeasurementSurveyFormData buildFormData() - +List<ModelAction<dynamic>> availableActions() - +List<ModelAction<dynamic>> availablePopupActions() - +List<ModelAction<dynamic>> availableInlineActions() - +void onSelectItem() - +void onNewItem() - +SurveyQuestionFormRouteArgs buildNewFormRouteArgs() - +SurveyQuestionFormRouteArgs buildFormRouteArgs() - +MeasurementSurveyFormViewModel createDuplicate() + + + +formViewModel: InterventionTaskFormViewModel - - - - - + + + + + - - - SurveyPreview + + + InterventionsFormData - - - +routeArgs: MeasurementFormRouteArgs + + + +interventionsData: List<InterventionFormData> + +studyScheduleData: StudyScheduleFormData + +id: String - - - +Widget build() + + + +Study apply() + +InterventionsFormData copy() - - - + + + + - - - MeasurementFormRouteArgs + + + StudyDesignReportsFormView - - - - - - - - - StudyDesignMeasurementsFormView + + + +Widget build() + -dynamic _showReportItemSidesheetWithArgs() - - - +Widget build() + + + + + + + + + + ReportItemFormData - - - - - - - - - - MeasurementsFormData + + + +isPrimary: bool + +section: ReportSection + +id: String - - - +surveyMeasurements: List<MeasurementSurveyFormData> - +id: String + + + <static>+dynamic fromDomainModel() + +ReportItemFormData copy() - - - +Study apply() - +MeasurementsFormData copy() + + + + + + + + ReportSection - - - - - + + + + + - - - MeasurementsFormViewModel + + + DataReferenceEditor - - - +study: Study - +router: GoRouter - +measurementsArray: FormArray<dynamic> - +surveyMeasurementFormViewModels: FormViewModelCollection<MeasurementSurveyFormViewModel, MeasurementSurveyFormData> - +form: FormGroup - +measurementViewModels: List<MeasurementSurveyFormViewModel> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +measurementRequired: dynamic - +titles: Map<FormMode, String> + + + +formControl: FormControl<DataReferenceIdentifier<T>> + +availableTasks: List<Task> + +buildReactiveDropdownField: ReactiveDropdownField<dynamic> - - - +void read() - +void setControlsFrom() - +MeasurementsFormData buildFormData() - +List<ModelAction<dynamic>> availableActions() - +List<ModelAction<dynamic>> availablePopupActions() - +List<ModelAction<dynamic>> availableInlineActions() - +void onSelectItem() - +void onNewItem() - +MeasurementSurveyFormViewModel provide() - +void onCancel() - +dynamic onSave() + + + +FormTableRow buildFormTableRow() + -List<DropdownMenuItem<DataReferenceIdentifier<dynamic>>> _dataReferenceItems() - - - - + + + - - - StudyFormValidationSet + + + ReactiveDropdownField - - - +index: int - <static>+values: List<StudyFormValidationSet> + + + + + + + + + + TemporalAggregationFormatted - - - - - - - - - - ReportsFormViewModel + + + -_value: TemporalAggregation + <static>+values: List<TemporalAggregationFormatted> + +value: TemporalAggregation + +string: String + +icon: IconData? + +hashCode: int - - - +study: Study - +router: GoRouter - +reportItemDelegate: ReportFormItemDelegate - +reportItemArray: FormArray<dynamic> - +reportItemFormViewModels: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData> - +form: FormGroup - +reportItemModels: List<ReportItemFormViewModel> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titles: Map<FormMode, String> - +canTestConsent: bool + + + +bool ==() + +String toString() + +String toJson() + <static>+TemporalAggregationFormatted fromJson() - - - +void setControlsFrom() - +ReportsFormData buildFormData() - +void read() - +ReportItemFormRouteArgs buildNewReportItemFormRouteArgs() - +ReportItemFormRouteArgs buildReportItemFormRouteArgs() - +dynamic testReport() - +void onCancel() - +dynamic onSave() - +ReportItemFormViewModel provide() + + + + + + + + TemporalAggregation - - - - - + + + + + - - - ReportFormItemDelegate + + + ImprovementDirectionFormatted - - - +formViewModelCollection: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData> - +owner: ReportsFormViewModel - +propagateOnSave: bool - +validationSet: dynamic + + + -_value: ImprovementDirection + <static>+values: List<ImprovementDirectionFormatted> + +value: ImprovementDirection + +string: String + +icon: IconData? + +hashCode: int - - - +void onCancel() - +dynamic onSave() - +ReportItemFormViewModel provide() - +List<ModelAction<dynamic>> availableActions() - +void onNewItem() - +void onSelectItem() + + + +bool ==() + +String toString() + +String toJson() + <static>+ImprovementDirectionFormatted fromJson() - - - - - + + + - - - ReportItemFormData + + + ImprovementDirection - - - +isPrimary: bool - +section: ReportSection - +id: String - - + + + + + - - - <static>+dynamic fromDomainModel() - +ReportItemFormData copy() + + + ReportSectionType - - - - - - - - ReportSection + + + +index: int + <static>+values: List<ReportSectionType> + <static>+average: ReportSectionType + <static>+linearRegression: ReportSectionType - - - - - + + + + + - - - ReportItemFormView + + + AverageSectionFormView - - - +formViewModel: ReportItemFormViewModel - +studyId: String - +reportSectionColumnWidth: dynamic - +sectionTypeBodyBuilder: Widget Function(BuildContext) + + + +formViewModel: ReportItemFormViewModel + +studyId: String + +reportSectionColumnWidth: Map<int, TableColumnWidth> - - - +Widget build() - -dynamic _buildSectionText() - -dynamic _buildSectionTypeHeader() + + + +Widget build() - - - + + + - + ReportItemFormViewModel - + <static>+defaultSectionType: ReportSectionType +sectionIdControl: FormControl<String> @@ -7134,7 +6776,7 @@ - + -List<FormControlValidation> _getValidationConfig() +ReportItemFormData buildFormData() @@ -7146,887 +6788,1174 @@ - - - + + + + + - - - Widget Function(BuildContext) + + + DataReferenceIdentifier + + + + + + +hashCode: int + + + + + + +bool ==() - - - - + + + - - - ReportSectionType + + + DataReference - - - +index: int - <static>+values: List<ReportSectionType> - <static>+average: ReportSectionType - <static>+linearRegression: ReportSectionType + + + + + + + + + + LinearRegressionSectionFormView + + + + + + +formViewModel: ReportItemFormViewModel + +studyId: String + +reportSectionColumnWidth: Map<int, TableColumnWidth> + + + + + + +Widget build() - - - - - + + + + + - - - TemporalAggregationFormatted + + + ReportItemFormView - - - -_value: TemporalAggregation - <static>+values: List<TemporalAggregationFormatted> - +value: TemporalAggregation - +string: String - +icon: IconData? - +hashCode: int + + + +formViewModel: ReportItemFormViewModel + +studyId: String + +reportSectionColumnWidth: dynamic + +sectionTypeBodyBuilder: Widget Function(BuildContext) - - - +bool ==() - +String toString() - +String toJson() - <static>+TemporalAggregationFormatted fromJson() + + + +Widget build() + -dynamic _buildSectionText() + -dynamic _buildSectionTypeHeader() - - - + + + - - - TemporalAggregation + + + Widget Function(BuildContext) - - - - - + + + + + - - - ImprovementDirectionFormatted + + + ReportsFormViewModel - - - -_value: ImprovementDirection - <static>+values: List<ImprovementDirectionFormatted> - +value: ImprovementDirection - +string: String - +icon: IconData? - +hashCode: int + + + +study: Study + +router: GoRouter + +reportItemDelegate: ReportFormItemDelegate + +reportItemArray: FormArray<dynamic> + +reportItemFormViewModels: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData> + +form: FormGroup + +reportItemModels: List<ReportItemFormViewModel> + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titles: Map<FormMode, String> + +canTestConsent: bool - - - +bool ==() - +String toString() - +String toJson() - <static>+ImprovementDirectionFormatted fromJson() + + + +void setControlsFrom() + +ReportsFormData buildFormData() + +void read() + +ReportItemFormRouteArgs buildNewReportItemFormRouteArgs() + +ReportItemFormRouteArgs buildReportItemFormRouteArgs() + +dynamic testReport() + +void onCancel() + +dynamic onSave() + +ReportItemFormViewModel provide() - - - + + + + + - - - ImprovementDirection + + + ReportFormItemDelegate + + + + + + +formViewModelCollection: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData> + +owner: ReportsFormViewModel + +propagateOnSave: bool + +validationSet: dynamic + + + + + + +void onCancel() + +dynamic onSave() + +ReportItemFormViewModel provide() + +List<ModelAction<dynamic>> availableActions() + +void onNewItem() + +void onSelectItem() - - - - - + + + + + - - - AverageSectionFormView + + + ReportBadge - - - +formViewModel: ReportItemFormViewModel - +studyId: String - +reportSectionColumnWidth: Map<int, TableColumnWidth> + + + +status: ReportStatus? + +type: BadgeType + +showPrefixIcon: bool + +showTooltip: bool - - - +Widget build() + + + +Widget build() - - - - - + + + + - - - LinearRegressionSectionFormView + + + ReportStatus + + + + + + +index: int + <static>+values: List<ReportStatus> + <static>+primary: ReportStatus + <static>+secondary: ReportStatus + + + + + + + + + + + + + ReportsFormData - - - +formViewModel: ReportItemFormViewModel - +studyId: String - +reportSectionColumnWidth: Map<int, TableColumnWidth> + + + +reportItems: List<ReportItemFormData> + +id: String - - - +Widget build() + + + +Study apply() + +ReportsFormData copy() - - - - - + + + + + - - - DataReferenceIdentifier + + + StudyInfoFormViewModel - - - +hashCode: int + + + +study: Study + +titleControl: FormControl<String> + +iconControl: FormControl<IconOption> + +descriptionControl: FormControl<String> + +organizationControl: FormControl<String> + +reviewBoardControl: FormControl<String> + +reviewBoardNumberControl: FormControl<String> + +researchersControl: FormControl<String> + +emailControl: FormControl<String> + +websiteControl: FormControl<String> + +phoneControl: FormControl<String> + +additionalInfoControl: FormControl<String> + +form: FormGroup + +titles: Map<FormMode, String> + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titleRequired: dynamic + +descriptionRequired: dynamic + +iconRequired: dynamic + +organizationRequired: dynamic + +reviewBoardRequired: dynamic + +reviewBoardNumberRequired: dynamic + +researchersRequired: dynamic + +emailRequired: dynamic + +phoneRequired: dynamic + +emailFormat: dynamic + +websiteFormat: dynamic - - - +bool ==() + + + +void setControlsFrom() + +StudyInfoFormData buildFormData() - - - + + + + - - - DataReference + + + StudyDesignInfoFormView - - - - - - - - - - DataReferenceEditor + + + +Widget build() - - - +formControl: FormControl<DataReferenceIdentifier<T>> - +availableTasks: List<Task> - +buildReactiveDropdownField: ReactiveDropdownField<dynamic> + + + + + + + + + + StudyInfoFormData - - - +FormTableRow buildFormTableRow() - -List<DropdownMenuItem<DataReferenceIdentifier<dynamic>>> _dataReferenceItems() + + + +title: String + +description: String? + +iconName: String + +contactInfoFormData: StudyContactInfoFormData + +id: String - - - - - - - - ReactiveDropdownField + + + +Study apply() + +StudyInfoFormData copy() - - - - - + + + + + - - - ReportsFormData + + + StudyContactInfoFormData - - - +reportItems: List<ReportItemFormData> - +id: String + + + +organization: String? + +institutionalReviewBoard: String? + +institutionalReviewBoardNumber: String? + +researchers: String? + +email: String? + +website: String? + +phone: String? + +additionalInfo: String? + +id: String - - - +Study apply() - +ReportsFormData copy() + + + +Study apply() + +StudyInfoFormData copy() - - - - + + + + - - - ReportStatus + + + StudyFormValidationSet - - - +index: int - <static>+values: List<ReportStatus> - <static>+primary: ReportStatus - <static>+secondary: ReportStatus + + + +index: int + <static>+values: List<StudyFormValidationSet> - - - - - + + + + + - - - ReportBadge + + + MeasurementsFormData - - - +status: ReportStatus? - +type: BadgeType - +showPrefixIcon: bool - +showTooltip: bool + + + +surveyMeasurements: List<MeasurementSurveyFormData> + +id: String - - - +Widget build() + + + +Study apply() + +MeasurementsFormData copy() - - - - + + + + - - - StudyDesignReportsFormView + + + MeasurementSurveyFormView - - - +Widget build() - -dynamic _showReportItemSidesheetWithArgs() + + + +formViewModel: MeasurementSurveyFormViewModel - - - - - + + + + + - - - StudyFormScaffold + + + MeasurementSurveyFormViewModel - - - +studyId: String - +formViewModelBuilder: T Function(WidgetRef) - +formViewBuilder: Widget Function(T) + + + +study: Study + +measurementIdControl: FormControl<String> + +instanceIdControl: FormControl<String> + +surveyTitleControl: FormControl<String> + +surveyIntroTextControl: FormControl<String> + +surveyOutroTextControl: FormControl<String> + +form: FormGroup + +measurementId: String + +instanceId: String + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titleRequired: dynamic + +atLeastOneQuestion: dynamic + +breadcrumbsTitle: String + +titles: Map<FormMode, String> - - - +Widget build() + + + +void setControlsFrom() + +MeasurementSurveyFormData buildFormData() + +List<ModelAction<dynamic>> availableActions() + +List<ModelAction<dynamic>> availablePopupActions() + +List<ModelAction<dynamic>> availableInlineActions() + +void onSelectItem() + +void onNewItem() + +SurveyQuestionFormRouteArgs buildNewFormRouteArgs() + +SurveyQuestionFormRouteArgs buildFormRouteArgs() + +MeasurementSurveyFormViewModel createDuplicate() - - - + + + + + - - - T Function(WidgetRef) + + + SurveyPreview - - - - - - - - Widget Function(T) + + + +routeArgs: MeasurementFormRouteArgs - - - - - - - - - SurveyQuestionFormView + + + +Widget build() - - - +formViewModel: QuestionFormViewModel - +isHtmlStyleable: bool + + + + + + + + MeasurementFormRouteArgs - - - - + + + + + + + + + MeasurementSurveyFormData + + - - - SurveyQuestionType + + + +measurementId: String + +title: String + +introText: String? + +outroText: String? + +questionnaireFormData: QuestionnaireFormData + <static>+kDefaultTitle: String + +id: String - - - +index: int - <static>+values: List<SurveyQuestionType> - <static>+choice: SurveyQuestionType - <static>+bool: SurveyQuestionType - <static>+scale: SurveyQuestionType - <static>+image: SurveyQuestionType - <static>+audio: SurveyQuestionType - <static>+freeText: SurveyQuestionType + + + +QuestionnaireTask toQuestionnaireTask() + +MeasurementSurveyFormData copy() - - - - - + + + + + - - - QuestionFormData + + + QuestionnaireFormData - - - <static>+questionTypeFormDataFactories: Map<SurveyQuestionType, QuestionFormData Function(Question<dynamic>, List<EligibilityCriterion>)> - +questionId: String - +questionText: String - +questionInfoText: String? - +questionType: SurveyQuestionType - +responseOptionsValidity: Map<dynamic, bool> - +responseOptions: List<dynamic> - +id: String + + + +questionsData: List<QuestionFormData>? + +id: String - - - +Question<dynamic> toQuestion() - +EligibilityCriterion toEligibilityCriterion() - +Answer<dynamic> constructAnswerFor() - +dynamic setResponseOptionsValidityFrom() - +QuestionFormData copy() + + + +StudyUQuestionnaire toQuestionnaire() + +List<EligibilityCriterion> toEligibilityCriteria() + +QuestionnaireFormData copy() - - - - - + + + + + - - - ChoiceQuestionFormData + + + WithQuestionnaireControls - - - +isMultipleChoice: bool - +answerOptions: List<String> - +responseOptions: List<String> + + + +questionsArray: FormArray<dynamic> + +questionFormViewModels: FormViewModelCollection<Q, QuestionFormData> + +questionnaireControls: Map<String, FormArray<dynamic>> + +propagateOnSave: bool + +questionModels: List<Q> + +questionTitles: Map<FormMode, String Function()> - - - +Question<dynamic> toQuestion() - +QuestionFormData copy() - -Choice _buildChoiceForValue() - +Answer<dynamic> constructAnswerFor() + + + +void setQuestionnaireControlsFrom() + +QuestionnaireFormData buildQuestionnaireFormData() + +void read() + +void onCancel() + +dynamic onSave() + +Q provide() + +Q provideQuestionFormViewModel() - - - - - - - - - BoolQuestionFormData - - + + + + - - - <static>+kResponseOptions: Map<String, bool> - +responseOptions: List<String> + + + StudyDesignMeasurementsFormView - - - +Question<dynamic> toQuestion() - +BoolQuestionFormData copy() - +Answer<dynamic> constructAnswerFor() + + + +Widget build() - - - - - + + + + + - - - ImageQuestionFormData + + + MeasurementsFormViewModel - - - <static>+kResponseOptions: Map<String, FutureBlobFile> - +responseOptions: List<String> + + + +study: Study + +router: GoRouter + +measurementsArray: FormArray<dynamic> + +surveyMeasurementFormViewModels: FormViewModelCollection<MeasurementSurveyFormViewModel, MeasurementSurveyFormData> + +form: FormGroup + +measurementViewModels: List<MeasurementSurveyFormViewModel> + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +measurementRequired: dynamic + +titles: Map<FormMode, String> - - - +Question<dynamic> toQuestion() - +ImageQuestionFormData copy() - +Answer<dynamic> constructAnswerFor() + + + +void read() + +void setControlsFrom() + +MeasurementsFormData buildFormData() + +List<ModelAction<dynamic>> availableActions() + +List<ModelAction<dynamic>> availablePopupActions() + +List<ModelAction<dynamic>> availableInlineActions() + +void onSelectItem() + +void onNewItem() + +MeasurementSurveyFormViewModel provide() + +void onCancel() + +dynamic onSave() - - - - - + + + + + - - - AudioQuestionFormData + + + StudyFormScaffold - - - +maxRecordingDurationSeconds: int - <static>+kResponseOptions: Map<String, FutureBlobFile> - +responseOptions: List<String> + + + +studyId: String + +formViewModelBuilder: T Function(WidgetRef) + +formViewBuilder: Widget Function(T) - - - +Question<dynamic> toQuestion() - +AudioQuestionFormData copy() - +Answer<dynamic> constructAnswerFor() + + + +Widget build() - - - - - + + + - - - ScaleQuestionFormData + + + T Function(WidgetRef) - - - +minValue: double - +maxValue: double - +minLabel: String? - +maxLabel: String? - +midValues: List<double?> - +midLabels: List<String?> - +stepSize: double - +initialValue: double? - +minColor: Color? - +maxColor: Color? - +responseOptions: List<double> - +midAnnotations: List<Annotation> - - + + + + - - - +ScaleQuestion toQuestion() - +QuestionFormData copy() - +Answer<dynamic> constructAnswerFor() + + + Widget Function(T) - - - - - + + + + + - - - FreeTextQuestionFormData + + + ConsentItemFormViewModel - - - +textLengthRange: List<int> - +textType: FreeTextQuestionType - +textTypeExpression: String? - +responseOptions: List<String> + + + +consentIdControl: FormControl<String> + +titleControl: FormControl<String> + +descriptionControl: FormControl<String> + +iconControl: FormControl<IconOption> + +form: FormGroup + +consentId: String + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titleRequired: dynamic + +descriptionRequired: dynamic + +titles: Map<FormMode, String> - - - +Question<dynamic> toQuestion() - +FreeTextQuestionFormData copy() - +Answer<dynamic> constructAnswerFor() + + + +void setControlsFrom() + +ConsentItemFormData buildFormData() + +ConsentItemFormViewModel createDuplicate() - - - + + + + - - - FreeTextQuestionType + + + StudyDesignEnrollmentFormView + + + + + + +Widget build() + -dynamic _showScreenerQuestionSidesheetWithArgs() + -dynamic _showConsentItemSidesheetWithArgs() - - - - + + + + - - - IScaleQuestionFormViewModel + + + IScreenerQuestionLogicFormViewModel - - - +isMidValuesClearedInfoVisible: bool + + + +isDirtyOptionsBannerVisible: bool - - - - + + + + + - - - ScaleQuestionFormView + + + ScreenerQuestionLogicFormView - - - +formViewModel: QuestionFormViewModel + + + +formViewModel: ScreenerQuestionFormViewModel + + + + + + +Widget build() + -dynamic _buildInfoBanner() + -dynamic _buildAnswerOptionsLogicControls() + -List<Widget> _buildOptionLogicRow() - - - - - + + + + + - - - FreeTextQuestionFormView + + + ScreenerQuestionFormViewModel - - - +formViewModel: QuestionFormViewModel - +generateLabelHelpTextMap: dynamic + + + <static>+defaultResponseOptionValidity: bool + +responseOptionsDisabledArray: FormArray<dynamic> + +responseOptionsLogicControls: FormArray<bool> + +responseOptionsLogicDescriptionControls: FormArray<String> + -_questionBaseControls: Map<String, AbstractControl<dynamic>> + +prevResponseOptionControls: List<AbstractControl<dynamic>> + +prevResponseOptionValues: List<dynamic> + +responseOptionsDisabledControls: List<AbstractControl<dynamic>> + +logicControlOptions: List<FormControlOption<bool>> + +questionBaseControls: Map<String, AbstractControl<dynamic>> + +isDirtyOptionsBannerVisible: bool - - - +Widget build() - +Widget disableOnReadonly() - +Widget generateRow() + + + +dynamic onResponseOptionsChanged() + +void setControlsFrom() + +QuestionFormData buildFormData() + -List<FormControl<dynamic>> _copyFormControls() + -AbstractControl<dynamic>? _findAssociatedLogicControlFor() + -AbstractControl<dynamic>? _findAssociatedControlFor() + +ScreenerQuestionFormViewModel createDuplicate() - - - - - + + + + + - - - BoolQuestionFormView + + + ConsentItemFormData - - - +formViewModel: QuestionFormViewModel + + + +consentId: String + +title: String + +description: String + +iconName: String? + +id: String - - - +Widget build() + + + +ConsentItem toConsentItem() + +ConsentItemFormData copy() - - - - - - - - - AudioRecordingQuestionFormView - - + + + + - - - +formViewModel: QuestionFormViewModel + + + ConsentItemFormView - - - +Widget build() + + + +formViewModel: ConsentItemFormViewModel - - - - - + + + + + - - - ChoiceQuestionFormView + + + EnrollmentFormData - - - +formViewModel: QuestionFormViewModel + + + <static>+kDefaultEnrollmentType: Participation + +enrollmentType: Participation + +questionnaireFormData: QuestionnaireFormData + +consentItemsFormData: List<ConsentItemFormData>? + +id: String - - - +Widget build() + + + +Study apply() + +EnrollmentFormData copy() - - - - - + + + + + - - - ImageCapturingQuestionFormView + + + QuestionFormViewModel - - - +formViewModel: QuestionFormViewModel + + + <static>+defaultQuestionType: SurveyQuestionType + -_titles: Map<FormMode, String Function()>? + +questionIdControl: FormControl<String> + +questionTypeControl: FormControl<SurveyQuestionType> + +questionTextControl: FormControl<String> + +questionInfoTextControl: FormControl<String> + +questionBaseControls: Map<String, AbstractControl<dynamic>> + +isMultipleChoiceControl: FormControl<bool> + +choiceResponseOptionsArray: FormArray<dynamic> + +customOptionsMin: int + +customOptionsMax: int + +customOptionsInitial: int + +boolResponseOptionsArray: FormArray<String> + +imageResponseOptionsArray: FormArray<String> + <static>+kDefaultMaxRecordingDurationSeconds: int + <static>+kMaxRecordingDurationSeconds: int + +audioResponseOptionsArray: FormArray<String> + +maxRecordingDurationSecondsControl: FormControl<int> + <static>+kDefaultScaleMinValue: int + <static>+kDefaultScaleMaxValue: int + <static>+kNumMidValueControls: int + <static>+kMidValueDebounceMilliseconds: int + +scaleMinValueControl: FormControl<int> + +scaleMaxValueControl: FormControl<int> + -_scaleRangeControl: FormControl<int> + +scaleMinLabelControl: FormControl<String> + +scaleMaxLabelControl: FormControl<String> + +scaleMidValueControls: FormArray<int> + +scaleMidLabelControls: FormArray<String?> + -_scaleResponseOptionsArray: FormArray<int> + +scaleMinColorControl: FormControl<SerializableColor> + +scaleMaxColorControl: FormControl<SerializableColor> + +prevMidValues: List<int?>? + +freeTextTypeControl: FormControl<FreeTextQuestionType> + +customRegexControl: FormControl<String> + +freeTextResponseOptionsArray: FormArray<dynamic> + +freeTextLengthMin: AbstractControl<int> + +freeTextLengthMax: AbstractControl<int> + +freeTextExampleTextControl: FormControl<String> + <static>+kDefaultFreeTextMinLength: int + <static>+kDefaultFreeTextMaxLength: int + +freeTextLengthControl: FormControl<RangeValues> + -_controlsByQuestionType: Map<SurveyQuestionType, FormGroup> + -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + -_validationConfigsByQuestionType: Map<SurveyQuestionType, Map<FormValidationSetEnum, List<FormControlValidation>>> + +form: FormGroup + +questionId: String + +questionType: SurveyQuestionType + +questionTypeControlOptions: List<FormControlOption<SurveyQuestionType>> + +answerOptionsArray: FormArray<dynamic> + +answerOptionsControls: List<AbstractControl<dynamic>> + +validAnswerOptions: List<String> + +boolOptions: List<AbstractControl<String>> + +imageOptions: List<AbstractControl<String>> + +audioOptions: List<AbstractControl<String>> + +scaleMinValue: int + +scaleMaxValue: int + +scaleRange: int + +scaleAllValueControls: List<AbstractControl<int>> + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +questionTextRequired: dynamic + +numValidChoiceOptions: dynamic + +scaleRangeValid: dynamic + +maxRecordingDurationValid: dynamic + +titles: Map<FormMode, String> + +isAddOptionButtonVisible: bool + +isMidValuesClearedInfoVisible: bool - - - +Widget build() + + + +String? scaleMidLabelAt() + -dynamic _onScaleRangeChanged() + -dynamic _applyInputFormatters() + -dynamic _updateScaleMidValueControls() + -Map<String, dynamic>? _validateFreeText() + -dynamic _onFreeTextLengthChanged() + -List<FormControlValidation> _getValidationConfig() + +dynamic onQuestionTypeChanged() + +dynamic onResponseOptionsChanged() + -void _updateFormControls() + +void initControls() + +void setControlsFrom() + +QuestionFormData buildFormData() + +List<ModelAction<dynamic>> availableActions() + +void onNewItem() + +void onSelectItem() + +dynamic save() + +QuestionFormViewModel createDuplicate() - - - - - + + + + + - - - ScheduleControls + + + EnrollmentFormViewModel + + + + + + +study: Study + +router: GoRouter + +consentItemDelegate: EnrollmentFormConsentItemDelegate + +enrollmentTypeControl: FormControl<Participation> + +consentItemArray: FormArray<dynamic> + +consentItemFormViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData> + +form: FormGroup + +enrollmentTypeControlOptions: List<FormControlOption<Participation>> + +consentItemModels: List<ConsentItemFormViewModel> + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titles: Map<FormMode, String> + +canTestScreener: bool + +canTestConsent: bool + +questionTitles: Map<FormMode, String Function()> + + + + + + +void setControlsFrom() + +EnrollmentFormData buildFormData() + +void read() + +List<ModelAction<dynamic>> availableActions() + +List<ModelAction<dynamic>> availablePopupActions() + +List<ModelAction<dynamic>> availableInlineActions() + +void onSelectItem() + +void onNewItem() + +ScreenerQuestionFormRouteArgs buildNewScreenerQuestionFormRouteArgs() + +ScreenerQuestionFormRouteArgs buildScreenerQuestionFormRouteArgs() + +ConsentItemFormRouteArgs buildNewConsentItemFormRouteArgs() + +ConsentItemFormRouteArgs buildConsentItemFormRouteArgs() + +dynamic testScreener() + +dynamic testConsent() + +ScreenerQuestionFormViewModel provideQuestionFormViewModel() - - - +formViewModel: WithScheduleControls + + + + + + + + + + EnrollmentFormConsentItemDelegate - - - +Widget build() - -List<FormTableRow> _conditionalTimeRestrictions() + + + +formViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData> + +owner: EnrollmentFormViewModel + +propagateOnSave: bool + +validationSet: dynamic - - - - - - - - StudyUTimeOfDay + + + +void onCancel() + +dynamic onSave() + +ConsentItemFormViewModel provide() + +List<ModelAction<dynamic>> availableActions() + +void onNewItem() + +void onSelectItem() - - - + + + - + StudyFormViewModel - + +studyDirtyCopy: Study? +studyRepository: IStudyRepository @@ -8044,7 +7973,7 @@ - + +void read() +void setControlsFrom() @@ -8057,761 +7986,832 @@ - - - - + + + + + - - - StudyAnalyzeScreen + + + QuestionFormData - - - +Widget? banner() - +Widget build() + + + <static>+questionTypeFormDataFactories: Map<SurveyQuestionType, QuestionFormData Function(Question<dynamic>, List<EligibilityCriterion>)> + +questionId: String + +questionText: String + +questionInfoText: String? + +questionType: SurveyQuestionType + +responseOptionsValidity: Map<dynamic, bool> + +responseOptions: List<dynamic> + +id: String + + + + + + +Question<dynamic> toQuestion() + +EligibilityCriterion toEligibilityCriterion() + +Answer<dynamic> constructAnswerFor() + +dynamic setResponseOptionsValidityFrom() + +QuestionFormData copy() - - - - + + + + - - - StudyAnalyzeController + + + SurveyQuestionType - - - +dynamic onExport() + + + +index: int + <static>+values: List<SurveyQuestionType> + <static>+choice: SurveyQuestionType + <static>+bool: SurveyQuestionType + <static>+scale: SurveyQuestionType + <static>+image: SurveyQuestionType + <static>+audio: SurveyQuestionType + <static>+freeText: SurveyQuestionType - - - - + + + + + - - - StudyMonitorScreen + + + ChoiceQuestionFormData - - - +Widget build() + + + +isMultipleChoice: bool + +answerOptions: List<String> + +responseOptions: List<String> + + + + + + +Question<dynamic> toQuestion() + +QuestionFormData copy() + -Choice _buildChoiceForValue() + +Answer<dynamic> constructAnswerFor() - - - - + + + + + - - - StudiesTableItem + + + BoolQuestionFormData - - - +study: Study - +itemHeight: double - +itemPadding: double - +rowSpacing: double - +columnSpacing: double - +actions: List<ModelAction<dynamic>> - +columnSizes: List<StudiesTableColumnSize> - +isPinned: bool - +onPinnedChanged: void Function(Study, bool)? - +onTap: void Function(Study)? + + + <static>+kResponseOptions: Map<String, bool> + +responseOptions: List<String> + + + + + + +Question<dynamic> toQuestion() + +BoolQuestionFormData copy() + +Answer<dynamic> constructAnswerFor() - - - + + + + + - - - void Function(Study, bool)? + + + ImageQuestionFormData - - - - + + + <static>+kResponseOptions: Map<String, FutureBlobFile> + +responseOptions: List<String> + + - - - void Function(Study)? + + + +Question<dynamic> toQuestion() + +ImageQuestionFormData copy() + +Answer<dynamic> constructAnswerFor() - - - - - + + + + + - - - DashboardController + + + AudioQuestionFormData - - - +studyRepository: IStudyRepository - +authRepository: IAuthRepository - +userRepository: IUserRepository - +router: GoRouter - -_studiesSubscription: StreamSubscription<List<WrappedModel<Study>>>? - +searchController: SearchController - +isSortAscending: bool + + + +maxRecordingDurationSeconds: int + <static>+kResponseOptions: Map<String, FutureBlobFile> + +responseOptions: List<String> - - - -dynamic _subscribeStudies() - +dynamic setSearchText() - +dynamic setStudiesFilter() - +dynamic onSelectStudy() - +dynamic onClickNewStudy() - +dynamic pinStudy() - +dynamic pinOffStudy() - +void setSorting() - +void filterStudies() - +void sortStudies() - +bool isSortingActiveForColumn() - +bool isPinned() - +List<ModelAction<dynamic>> availableActions() - +void dispose() + + + +Question<dynamic> toQuestion() + +AudioQuestionFormData copy() + +Answer<dynamic> constructAnswerFor() - - - + + + + + - - - IUserRepository + + + ScaleQuestionFormData + + + + + + +minValue: double + +maxValue: double + +minLabel: String? + +maxLabel: String? + +midValues: List<double?> + +midLabels: List<String?> + +stepSize: double + +initialValue: double? + +minColor: Color? + +maxColor: Color? + +responseOptions: List<double> + +midAnnotations: List<Annotation> + + + + + + +ScaleQuestion toQuestion() + +QuestionFormData copy() + +Answer<dynamic> constructAnswerFor() - - - + + + + + - - - SearchController + + + FreeTextQuestionFormData + + + + + + +textLengthRange: List<int> + +textType: FreeTextQuestionType + +textTypeExpression: String? + +responseOptions: List<String> + + + + + + +Question<dynamic> toQuestion() + +FreeTextQuestionFormData copy() + +Answer<dynamic> constructAnswerFor() - - - + + + - - - IModelActionProvider + + + FreeTextQuestionType - - - - - + + + + + - - - StudiesTableColumnSize + + + AudioRecordingQuestionFormView - - - +collapsed: bool - +flex: int? - +width: double? + + + +formViewModel: QuestionFormViewModel - - - +Widget createContainer() + + + +Widget build() - - - - - + + + + + - - - StudiesTable + + + FreeTextQuestionFormView - - - +itemHeight: double - +itemPadding: double - +rowSpacing: double - +columnSpacing: double - +compactWidthThreshold: double - +superCompactWidthThreshold: double - +compactStatTitleThreshold: double - +studies: List<Study> - +onSelect: void Function(Study) - +getActions: List<ModelAction<dynamic>> Function(Study) - +emptyWidget: Widget - +pinnedStudies: Iterable<String> - +dashboardController: DashboardController + + + +formViewModel: QuestionFormViewModel + +generateLabelHelpTextMap: dynamic - - - +Widget build() - -Widget _buildColumnHeader() + + + +Widget build() + +Widget disableOnReadonly() + +Widget generateRow() - - - + + + + + - - - void Function(Study) + + + ImageCapturingQuestionFormView - - - - + + + +formViewModel: QuestionFormViewModel + + - - - List<ModelAction<dynamic>> Function(Study) + + + +Widget build() - - - - + + + + - - - StudiesTableColumn + + + IScaleQuestionFormViewModel - - - +index: int - <static>+values: List<StudiesTableColumn> - <static>+pin: StudiesTableColumn - <static>+title: StudiesTableColumn - <static>+status: StudiesTableColumn - <static>+participation: StudiesTableColumn - <static>+createdAt: StudiesTableColumn - <static>+enrolled: StudiesTableColumn - <static>+active: StudiesTableColumn - <static>+completed: StudiesTableColumn - <static>+action: StudiesTableColumn + + + +isMidValuesClearedInfoVisible: bool - - - - + + + + - - - DashboardScreen + + + ScaleQuestionFormView - - - +filter: StudiesFilter? + + + +formViewModel: QuestionFormViewModel - - - - + + + + + - - - StudiesFilter + + + ChoiceQuestionFormView - - - +index: int - <static>+values: List<StudiesFilter> + + + +formViewModel: QuestionFormViewModel + + + + + + +Widget build() - - - - - + + + + + - - - DashboardScaffold + + + BoolQuestionFormView - - - <static>+compactWidthThreshold: double - +body: Widget + + + +formViewModel: QuestionFormViewModel - - - +Widget build() + + + +Widget build() - - - - + + + + - - - StudiesTableColumnHeader + + + SurveyQuestionFormView - - - +title: String - +sortable: bool - +sortAscending: bool - +sortingActive: bool - +onSort: void Function()? + + + +formViewModel: QuestionFormViewModel + +isHtmlStyleable: bool - - - - - - - - AccountSettingsDialog - - + + + - - - +Widget build() + + + StudyUTimeOfDay - - - - - + + + + + - - - StudyInvitesTable + + + ScheduleControls - - - +invites: List<StudyInvite> - +onSelect: void Function(StudyInvite) - +getActions: List<ModelAction<dynamic>> Function(StudyInvite) - +getInlineActions: List<ModelAction<dynamic>> Function(StudyInvite) - +getIntervention: Intervention? Function(String) - +getParticipantCountForInvite: int Function(StudyInvite) + + + +formViewModel: WithScheduleControls - - - +Widget build() - -List<Widget> _buildRow() + + + +Widget build() + -List<FormTableRow> _conditionalTimeRestrictions() - - - + + + + - - - void Function(StudyInvite) + + + StudiesTableColumnHeader - - - - - - - - List<ModelAction<dynamic>> Function(StudyInvite) + + + +title: String + +sortable: bool + +sortAscending: bool + +sortingActive: bool + +onSort: void Function()? - - - + + + + - - - Intervention? Function(String) + + + DashboardScreen + + + + + + +filter: StudiesFilter? - - - + + + + - - - int Function(StudyInvite) + + + StudiesFilter + + + + + + +index: int + <static>+values: List<StudiesFilter> - - - - - + + + + + - - - StudyRecruitController + + + DashboardScaffold - - - +inviteCodeRepository: IInviteCodeRepository - -_invitesSubscription: StreamSubscription<List<WrappedModel<StudyInvite>>>? + + + <static>+compactWidthThreshold: double + +body: Widget - - - -dynamic _subscribeInvites() - +Intervention? getIntervention() - +int getParticipantCountForInvite() - +List<ModelAction<dynamic>> availableActions() - +List<ModelAction<dynamic>> availableInlineActions() - +void dispose() + + + +Widget build() - - - + + + + + - - - IInviteCodeRepository + + + DashboardController - - - - - - + + + +studyRepository: IStudyRepository + +authRepository: IAuthRepository + +userRepository: IUserRepository + +router: GoRouter + -_studiesSubscription: StreamSubscription<List<WrappedModel<Study>>>? + +searchController: SearchController + +isSortAscending: bool + + - - - InviteCodeFormViewModel + + + -dynamic _subscribeStudies() + +dynamic setSearchText() + +dynamic setStudiesFilter() + +dynamic onSelectStudy() + +dynamic onClickNewStudy() + +dynamic pinStudy() + +dynamic pinOffStudy() + +void setSorting() + +void filterStudies() + +void sortStudies() + +bool isSortingActiveForColumn() + +bool isPinned() + +List<ModelAction<dynamic>> availableActions() + +void dispose() - - - +study: Study - +inviteCodeRepository: IInviteCodeRepository - +codeControl: FormControl<String> - +codeControlValidationMessages: Map<String, String Function(dynamic)> - +isPreconfiguredScheduleControl: FormControl<bool> - +preconfiguredScheduleTypeControl: FormControl<PhaseSequence> - +interventionAControl: FormControl<String> - +interventionBControl: FormControl<String> - +form: FormGroup - +titles: Map<FormMode, String> - +interventionControlOptions: List<FormControlOption<String>> - +preconfiguredScheduleTypeOptions: List<FormControlOption<PhaseSequence>> - +isPreconfiguredSchedule: bool - +preconfiguredSchedule: List<String>? + + + + + + + + IUserRepository - - - +void initControls() - -dynamic _uniqueInviteCode() - +void regenerateCode() - -String _generateCode() - +StudyInvite buildFormData() - +void setControlsFrom() - +dynamic save() + + + + + + + + SearchController - - - - - + + + + + - - - EnrolledBadge + + + StudiesTableColumnSize - - - +enrolledCount: int + + + +collapsed: bool + +flex: int? + +width: double? - - - +Widget build() + + + +Widget createContainer() - - - - - + + + + + - - - InviteCodeFormView + + + StudiesTable - - - +formViewModel: InviteCodeFormViewModel + + + +itemHeight: double + +itemPadding: double + +rowSpacing: double + +columnSpacing: double + +compactWidthThreshold: double + +superCompactWidthThreshold: double + +compactStatTitleThreshold: double + +studies: List<Study> + +onSelect: void Function(Study) + +getActions: List<ModelAction<dynamic>> Function(Study) + +emptyWidget: Widget + +pinnedStudies: Iterable<String> + +dashboardController: DashboardController - - - +Widget build() - -List<FormTableRow> _conditionalInterventionRows() + + + +Widget build() + -Widget _buildColumnHeader() - - - - - - - - StudyRecruitScreen - - + + + - - - +Widget build() - -Widget _inviteCodesSectionHeader() - -Widget _newInviteCodeButton() - -dynamic _onSelectInvite() + + + void Function(Study) - - - - - + + + - - - DrawerEntry + + + List<ModelAction<dynamic>> Function(Study) - - - +localizedTitle: String Function() - +icon: IconData? - +localizedHelpText: String Function()? - +enabled: bool - +onSelected: void Function(BuildContext, WidgetRef)? - +autoCloseDrawer: bool - +title: String - +helpText: String? + + + + + + + + + StudiesTableColumn - - - +void onClick() + + + +index: int + <static>+values: List<StudiesTableColumn> + <static>+pin: StudiesTableColumn + <static>+title: StudiesTableColumn + <static>+status: StudiesTableColumn + <static>+participation: StudiesTableColumn + <static>+createdAt: StudiesTableColumn + <static>+enrolled: StudiesTableColumn + <static>+active: StudiesTableColumn + <static>+completed: StudiesTableColumn + <static>+action: StudiesTableColumn - - - + + + + - - - String Function() + + + StudiesTableItem - - - - - - - - String Function()? + + + +study: Study + +itemHeight: double + +itemPadding: double + +rowSpacing: double + +columnSpacing: double + +actions: List<ModelAction<dynamic>> + +columnSizes: List<StudiesTableColumnSize> + +isPinned: bool + +onPinnedChanged: void Function(Study, bool)? + +onTap: void Function(Study)? - - - + + + - - - void Function(BuildContext, WidgetRef)? + + + void Function(Study, bool)? - - - - - + + + - - - GoRouterDrawerEntry + + + void Function(Study)? - - - +intent: RoutingIntent - +onNavigated: void Function()? - - + + + + - - - +void onClick() + + + App - - - + + + - - - RoutingIntent + + + AppContent - - - - + + + + - - - AppDrawer + + + AccountSettingsDialog - - - +width: int - +autoCloseDrawer: bool - +leftPaddingEntries: double - +logoPaddingVertical: double - +logoPaddingHorizontal: double - +logoMaxHeight: double - +logoSectionMinHeight: double - +logoSectionMaxHeight: double + + + +Widget build() diff --git a/docs/uml/designer_v2/lib/uml.svg b/docs/uml/designer_v2/lib/uml.svg index 135fe44da..880ed2de2 100644 --- a/docs/uml/designer_v2/lib/uml.svg +++ b/docs/uml/designer_v2/lib/uml.svg @@ -1,16240 +1,16240 @@ - - [<abstract>GoRouteParamEnum + + [Config | - +String toRouteParam(); - +String toShortString() + <static>+isDebugMode: bool; + <static>+defaultLocale: Set<String>; + <static>+supportedLocales: Map<String, String>; + <static>+newStudyId: String; + <static>+newModelId: String; + <static>+minSplashTime: int; + <static>+formAutosaveDebounce: int ] - [RoutingIntents - | - <static>+root: RoutingIntent; - <static>+studies: RoutingIntent; - <static>+studiesShared: RoutingIntent; - <static>+publicRegistry: RoutingIntent; - <static>+study: RoutingIntent Function(String); - <static>+studyEdit: RoutingIntent Function(String); - <static>+studyEditInfo: RoutingIntent Function(String); - <static>+studyEditEnrollment: RoutingIntent Function(String); - <static>+studyEditInterventions: RoutingIntent Function(String); - <static>+studyEditIntervention: RoutingIntent Function(String, String); - <static>+studyEditMeasurements: RoutingIntent Function(String); - <static>+studyEditReports: RoutingIntent Function(String); - <static>+studyEditMeasurement: RoutingIntent Function(String, String); - <static>+studyTest: RoutingIntent Function(String, {String? appRoute}); - <static>+studyRecruit: RoutingIntent Function(String); - <static>+studyMonitor: RoutingIntent Function(String); - <static>+studyAnalyze: RoutingIntent Function(String); - <static>+studySettings: RoutingIntent Function(String); - <static>+accountSettings: RoutingIntent; - <static>+studyNew: RoutingIntent; - <static>+login: RoutingIntent; - <static>+signup: RoutingIntent; - <static>+passwordForgot: RoutingIntent; - <static>+passwordForgot2: RoutingIntent Function(String); - <static>+passwordRecovery: RoutingIntent; - <static>+error: RoutingIntent Function(Exception) + [<abstract>ResultTypes ] - [RoutingIntents]o-[RoutingIntent] - [RoutingIntents]o-[RoutingIntent Function(String)] - [RoutingIntents]o-[RoutingIntent Function(String, String)] - [RoutingIntents]o-[RoutingIntent Function(String, {String? appRoute})] - [RoutingIntents]o-[RoutingIntent Function(Exception)] - - [RoutingIntent - | - +route: GoRoute; - +params: Map<String, String>; - +queryParams: Map<String, String>; - +dispatch: RoutingIntentDispatch?; - +extra: Object?; - +routeName: String; - +arguments: Map<String, String>; - +props: List<Object?> + [MeasurementResultTypes | - -dynamic _validateRoute(); - +bool matches() + <static>+questionnaire: String; + <static>+values: List<String> ] - [RoutingIntent]o-[GoRoute] - [RoutingIntent]o-[RoutingIntentDispatch] - [<abstract>Equatable]<:-[RoutingIntent] + [<abstract>ResultTypes]<:-[MeasurementResultTypes] - [RoutingIntentDispatch + [InterventionResultTypes | - +index: int; - <static>+values: List<RoutingIntentDispatch>; - <static>+go: RoutingIntentDispatch; - <static>+push: RoutingIntentDispatch + <static>+checkmarkTask: String; + <static>+values: List<String> ] - [RoutingIntentDispatch]o-[RoutingIntentDispatch] - [Enum]<:--[RoutingIntentDispatch] + [<abstract>ResultTypes]<:-[InterventionResultTypes] - [RouterKeys + [StudyExportData | - <static>+studyKey: ValueKey<String>; - <static>+authKey: ValueKey<String> + +study: Study; + +measurementsData: List<Map<String, dynamic>>; + +interventionsData: List<Map<String, dynamic>>; + +mediaData: List<String>; + +isEmpty: bool ] - [RouterKeys]o-[ValueKey] - - [RouteParams - | - <static>+studiesFilter: String; - <static>+studyId: String; - <static>+measurementId: String; - <static>+interventionId: String; - <static>+testAppRoute: String - ] + [StudyExportData]o-[Study] - [RouterConf - | - <static>+router: GoRouter; - <static>+routes: List<GoRoute>; - <static>+publicRoutes: List<GoRoute>; - <static>+privateRoutes: List<GoRoute> + [StudyTemplates | - <static>+GoRoute route() - ] - - [RouterConf]o-[GoRouter] - - [<abstract>StudyFormRouteArgs + <static>+kUnnamedStudyTitle: String | - +studyId: String + <static>+Study emptyDraft() ] - [<abstract>QuestionFormRouteArgs + [StudyActionType | - +questionId: String + +index: int; + <static>+values: List<StudyActionType>; + <static>+pin: StudyActionType; + <static>+pinoff: StudyActionType; + <static>+edit: StudyActionType; + <static>+duplicate: StudyActionType; + <static>+duplicateDraft: StudyActionType; + <static>+addCollaborator: StudyActionType; + <static>+export: StudyActionType; + <static>+delete: StudyActionType ] - [<abstract>StudyFormRouteArgs]<:-[<abstract>QuestionFormRouteArgs] + [StudyActionType]o-[StudyActionType] + [Enum]<:--[StudyActionType] - [ScreenerQuestionFormRouteArgs + [Notifications + | + <static>+credentialsInvalid: SnackbarIntent; + <static>+userAlreadyRegistered: SnackbarIntent; + <static>+passwordReset: SnackbarIntent; + <static>+passwordResetSuccess: SnackbarIntent; + <static>+studyDeleted: SnackbarIntent; + <static>+inviteCodeDeleted: SnackbarIntent; + <static>+inviteCodeClipped: SnackbarIntent; + <static>+studyDeleteConfirmation: AlertIntent ] - [<abstract>QuestionFormRouteArgs]<:-[ScreenerQuestionFormRouteArgs] + [Notifications]o-[SnackbarIntent] + [Notifications]o-[AlertIntent] - [ConsentItemFormRouteArgs + [NotificationDefaultActions | - +consentId: String + <static>+cancel: NotificationAction ] - [<abstract>StudyFormRouteArgs]<:-[ConsentItemFormRouteArgs] + [NotificationDefaultActions]o-[NotificationAction] - [MeasurementFormRouteArgs + [<abstract>INotificationService | - +measurementId: String + +void showMessage(); + +void show(); + +Stream<NotificationIntent> watchNotifications(); + +void dispose() ] - [<abstract>StudyFormRouteArgs]<:-[MeasurementFormRouteArgs] - - [SurveyQuestionFormRouteArgs + [NotificationService | - +questionId: String + -_streamController: BehaviorSubject<NotificationIntent> + | + +Stream<NotificationIntent> watchNotifications(); + +void showMessage(); + +void show(); + +void dispose() ] - [MeasurementFormRouteArgs]<:-[SurveyQuestionFormRouteArgs] - [<abstract>QuestionFormRouteArgs]<:--[SurveyQuestionFormRouteArgs] + [NotificationService]o-[BehaviorSubject] + [<abstract>INotificationService]<:--[NotificationService] - [InterventionFormRouteArgs + [<abstract>NotificationIntent | - +interventionId: String + +message: String?; + +customContent: Widget?; + +icon: IconData?; + +actions: List<NotificationAction>?; + +type: NotificationType + | + +void register() ] - [<abstract>StudyFormRouteArgs]<:-[InterventionFormRouteArgs] + [<abstract>NotificationIntent]o-[<abstract>Widget] + [<abstract>NotificationIntent]o-[IconData] + [<abstract>NotificationIntent]o-[NotificationType] - [InterventionTaskFormRouteArgs + [NotificationAction | - +taskId: String + +label: String; + +onSelect: dynamic Function(); + +isDestructive: bool ] - [InterventionFormRouteArgs]<:-[InterventionTaskFormRouteArgs] + [NotificationAction]o-[dynamic Function()] - [ReportItemFormRouteArgs + [SnackbarIntent | - +sectionId: String + +duration: int? ] - [<abstract>StudyFormRouteArgs]<:-[ReportItemFormRouteArgs] + [<abstract>NotificationIntent]<:-[SnackbarIntent] - [<abstract>JsonFileLoader - | - +jsonAssetsPath: String + [AlertIntent | - +dynamic loadJson(); - +dynamic parseJsonMapFromAssets(); - +dynamic parseJsonListFromAssets() + +title: String; + +dismissOnAction: bool; + +isDestructive: dynamic ] - [CombinedStreamNotifier - | - -_subscriptions: List<StreamSubscription<dynamic>> + [<abstract>NotificationIntent]<:-[AlertIntent] + + [NotificationType | - +void dispose() + +index: int; + <static>+values: List<NotificationType>; + <static>+snackbar: NotificationType; + <static>+alert: NotificationType; + <static>+custom: NotificationType ] - [ChangeNotifier]<:-[CombinedStreamNotifier] + [NotificationType]o-[NotificationType] + [Enum]<:--[NotificationType] - [<abstract>IProviderArgsResolver + [<abstract>IClipboardService | - +R provide() + +dynamic copy() ] - [SuppressedBehaviorSubject - | - +subject: BehaviorSubject<T>; - +didSuppressInitialEvent: bool; - -_controller: StreamController<T> + [ClipboardService | - -StreamController<T> _buildDerivedController(); - +dynamic close() + +dynamic copy() ] - [SuppressedBehaviorSubject]o-[BehaviorSubject] - [SuppressedBehaviorSubject]o-[StreamController] + [<abstract>IClipboardService]<:--[ClipboardService] - [Time + [NotificationDispatcher | - <static>+dynamic fromTimeOfDay(); - +Map<String, dynamic> toJson(); - <static>+Time fromJson() + +child: Widget?; + +snackbarInnerPadding: double; + +snackbarWidth: double?; + +snackbarBehavior: SnackBarBehavior; + +snackbarDefaultDuration: int ] - [TimeOfDay]<:-[Time] + [NotificationDispatcher]o-[<abstract>Widget] + [NotificationDispatcher]o-[SnackBarBehavior] - [TimeValueAccessor + [Assets | - +String modelToViewValue(); - +Time? viewToModelValue(); - -String _addLeadingZeroIfNeeded() + <static>+logoWide: String ] - [<abstract>ControlValueAccessor]<:-[TimeValueAccessor] - - [Tuple + [AsyncValueWidget | - +first: T1; - +second: T2; - +props: List<Object?> + +value: AsyncValue<T>; + +data: Widget Function(T); + +error: Widget Function(Object, StackTrace?)?; + +loading: Widget Function()?; + +empty: Widget Function()? | - +Map<String, dynamic> toJson(); - <static>+Tuple<dynamic, dynamic> fromJson(); - +Tuple<T1, T2> copy(); - +Tuple<T1, T2> copyWith() + +Widget build(); + -Widget _buildDataOrEmptyWidget(); + -Widget _defaultError(); + -Widget _defaultLoad() ] - [<abstract>Equatable]<:-[Tuple] + [AsyncValueWidget]o-[<abstract>AsyncValue] + [AsyncValueWidget]o-[Widget Function(T)] + [AsyncValueWidget]o-[Widget Function(Object, StackTrace?)?] + [AsyncValueWidget]o-[Widget Function()?] - [OptimisticUpdate + [FormControlLabel | - +applyOptimistic: void Function(); - +apply: dynamic Function(); - +rollback: void Function(); - +onUpdate: void Function()?; - +onError: void Function(Object, StackTrace?)?; - +rethrowErrors: bool; - +runOptimistically: bool; - +completeFutureOptimistically: bool + +formControl: AbstractControl<dynamic>; + +text: String; + +isClickable: bool; + +textStyle: TextStyle?; + +onClick: void Function(AbstractControl<dynamic>)? | - +dynamic execute(); - -void _runUpdateHandlerIfAny() + +Widget build() ] - [OptimisticUpdate]o-[void Function()] - [OptimisticUpdate]o-[dynamic Function()] - [OptimisticUpdate]o-[void Function()?] - [OptimisticUpdate]o-[void Function(Object, StackTrace?)?] + [FormControlLabel]o-[<abstract>AbstractControl] + [FormControlLabel]o-[TextStyle] + [FormControlLabel]o-[void Function(AbstractControl<dynamic>)?] - [SerializableColor + [ActionPopUpMenuButton | - +Map<String, dynamic> toJson(); - <static>+SerializableColor fromJson() + +actions: List<ModelAction<dynamic>>; + +triggerIconColor: Color?; + +triggerIconColorHover: Color?; + +triggerIconSize: double; + +disableSplashEffect: bool; + +hideOnEmpty: bool; + +orientation: Axis; + +elevation: double?; + +splashRadius: double?; + +enabled: bool; + +position: PopupMenuPosition + | + +Widget build(); + -Widget _buildPopupMenu() ] - [Color]<:-[SerializableColor] + [ActionPopUpMenuButton]o-[Color] + [ActionPopUpMenuButton]o-[Axis] + [ActionPopUpMenuButton]o-[PopupMenuPosition] - [<abstract>FileFormatEncoder + [Search | - +dynamic encodeAsync(); - +String encode(); - +dynamic call() + +onQueryChanged: dynamic Function(String); + +searchController: SearchController?; + +hintText: String?; + +initialText: String? ] - [CSVStringEncoder + [Search]o-[dynamic Function(String)] + [Search]o-[SearchController] + + [SearchController | - +String encode() + +setText: void Function(String) ] - [<abstract>FileFormatEncoder]<:-[CSVStringEncoder] + [SearchController]o-[void Function(String)] - [JsonStringEncoder + [FormScaffold | - +String encode() + +formViewModel: T; + +actions: List<Widget>?; + +body: Widget; + +drawer: Widget?; + +actionsSpacing: double; + +actionsPadding: double ] - [<abstract>FileFormatEncoder]<:-[JsonStringEncoder] + [FormScaffold]o-[<abstract>Widget] - [NumericalRangeFormatter + [ConstrainedWidthFlexible | - +min: int?; - +max: int? + +minWidth: double; + +maxWidth: double; + +flex: int; + +flexSum: int; + +child: Widget; + +outerConstraints: BoxConstraints | - +TextEditingValue formatEditUpdate() + +Widget build(); + -double _getWidth() ] - [<abstract>TextInputFormatter]<:-[NumericalRangeFormatter] + [ConstrainedWidthFlexible]o-[<abstract>Widget] + [ConstrainedWidthFlexible]o-[BoxConstraints] - [StudySequenceFormatter + [PrimaryButton | - +TextEditingValue formatEditUpdate() + +text: String; + +icon: IconData?; + +isLoading: bool; + +showLoadingEarliestAfterMs: int; + +onPressed: void Function()?; + +tooltip: String; + +tooltipDisabled: String; + +enabled: bool; + +onPressedFuture: dynamic Function()?; + +innerPadding: EdgeInsets; + +minimumSize: Size?; + +isDisabled: bool ] - [<abstract>TextInputFormatter]<:-[StudySequenceFormatter] + [PrimaryButton]o-[IconData] + [PrimaryButton]o-[void Function()?] + [PrimaryButton]o-[dynamic Function()?] + [PrimaryButton]o-[EdgeInsets] + [PrimaryButton]o-[Size] - [CountWhereValidator - | - +predicate: bool Function(T?); - +minCount: int?; - +maxCount: int?; - <static>+kValidationMessageMinCount: String; - <static>+kValidationMessageMaxCount: String + [FormTableRow | - +Map<String, dynamic>? validate() + +label: String?; + +labelBuilder: Widget Function(BuildContext)?; + +labelStyle: TextStyle?; + +labelHelpText: String?; + +input: Widget; + +control: AbstractControl<dynamic>?; + +layout: FormTableRowLayout? ] - [CountWhereValidator]o-[bool Function(T?)] - [<abstract>Validator]<:-[CountWhereValidator] + [FormTableRow]o-[Widget Function(BuildContext)?] + [FormTableRow]o-[TextStyle] + [FormTableRow]o-[<abstract>Widget] + [FormTableRow]o-[<abstract>AbstractControl] + [FormTableRow]o-[FormTableRowLayout] - [Patterns + [FormTableLayout | - <static>+timeFormatString: String; - <static>+emailFormatString: String; - <static>+url: String + +rows: List<FormTableRow>; + +columnWidths: Map<int, TableColumnWidth>; + +rowDivider: Widget?; + +rowLayout: FormTableRowLayout?; + +rowLabelStyle: TextStyle? + | + +Widget build() ] - [<abstract>ExecutionLimiter + [FormTableLayout]o-[<abstract>Widget] + [FormTableLayout]o-[FormTableRowLayout] + [FormTableLayout]o-[TextStyle] + + [FormSectionHeader | - +milliseconds: int; - <static>-_timer: Timer? + +title: String; + +titleTextStyle: TextStyle?; + +helpText: String?; + +divider: bool; + +helpTextDisabled: bool | - +void dispose() + +Widget build() ] - [<abstract>ExecutionLimiter]o-[Timer] + [FormSectionHeader]o-[TextStyle] - [Debouncer + [FormLabel | - +leading: bool; - +cancelUncompleted: bool; - -_uncompletedFutureOperation: CancelableOperation<dynamic>? + +labelText: String?; + +helpText: String?; + +labelTextStyle: TextStyle?; + +layout: FormTableRowLayout? | - +dynamic call() + +Widget build() ] - [Debouncer]o-[CancelableOperation] - [<abstract>ExecutionLimiter]<:-[Debouncer] + [FormLabel]o-[TextStyle] + [FormLabel]o-[FormTableRowLayout] - [Throttler + [FormTableRowLayout | - +dynamic call() + +index: int; + <static>+values: List<FormTableRowLayout>; + <static>+vertical: FormTableRowLayout; + <static>+horizontal: FormTableRowLayout ] - [<abstract>ExecutionLimiter]<:-[Throttler] + [FormTableRowLayout]o-[FormTableRowLayout] + [Enum]<:--[FormTableRowLayout] - [ModelAction + [DismissButton | - +type: T; - +label: String; - +icon: IconData?; - +onExecute: Function; - +isAvailable: bool; - +isDestructive: bool + +onPressed: void Function()?; + +text: String? + | + +Widget build() ] - [ModelAction]o-[IconData] + [DismissButton]o-[void Function()?] - [<abstract>IModelActionProvider + [Badge | - +List<ModelAction<dynamic>> availableActions() - ] - - [<abstract>IListActionProvider + +icon: IconData?; + +color: Color?; + +borderRadius: double; + +label: String; + +type: BadgeType; + +padding: EdgeInsets; + +iconSize: double?; + +labelStyle: TextStyle?; + +center: bool | - +void onSelectItem(); - +void onNewItem() + +Widget build(); + -Color? _getBackgroundColor(); + -Color _getBorderColor(); + -Color? _getLabelColor() ] - [<abstract>IModelActionProvider]<:-[<abstract>IListActionProvider] + [Badge]o-[IconData] + [Badge]o-[Color] + [Badge]o-[BadgeType] + [Badge]o-[EdgeInsets] + [Badge]o-[TextStyle] - [ModelActionType + [BadgeType | +index: int; - <static>+values: List<ModelActionType>; - <static>+edit: ModelActionType; - <static>+delete: ModelActionType; - <static>+remove: ModelActionType; - <static>+duplicate: ModelActionType; - <static>+clipboard: ModelActionType; - <static>+primary: ModelActionType + <static>+values: List<BadgeType>; + <static>+filled: BadgeType; + <static>+outlined: BadgeType; + <static>+outlineFill: BadgeType; + <static>+plain: BadgeType ] - [ModelActionType]o-[ModelActionType] - [Enum]<:--[ModelActionType] - - [Config - | - <static>+isDebugMode: bool; - <static>+defaultLocale: Set<String>; - <static>+supportedLocales: Map<String, String>; - <static>+newStudyId: String; - <static>+newModelId: String; - <static>+minSplashTime: int; - <static>+formAutosaveDebounce: int - ] + [BadgeType]o-[BadgeType] + [Enum]<:--[BadgeType] - [<abstract>IAuthRepository + [StandardDialog | - +allowPasswordReset: bool; - +currentUser: User?; - +isLoggedIn: bool; - +session: Session?; - +serializedSession: String? + +title: Widget?; + +titleText: String?; + +body: Widget; + +actionButtons: List<Widget>; + +backgroundColor: Color?; + +borderRadius: double?; + +width: double?; + +height: double?; + +minWidth: double; + +minHeight: double; + +maxWidth: double?; + +maxHeight: double?; + +padding: EdgeInsets | - +dynamic signUp(); - +dynamic signInWith(); - +dynamic signOut(); - +dynamic resetPasswordForEmail(); - +dynamic updateUser(); - +void dispose() + +Widget build() ] - [<abstract>IAuthRepository]o-[User] - [<abstract>IAuthRepository]o-[Session] - [<abstract>IAppDelegate]<:-[<abstract>IAuthRepository] + [StandardDialog]o-[<abstract>Widget] + [StandardDialog]o-[Color] + [StandardDialog]o-[EdgeInsets] - [AuthRepository - | - +supabaseClient: SupabaseClient; - +allowPasswordReset: bool; - +authClient: GoTrueClient; - +session: Session?; - +serializedSession: String?; - +currentUser: User?; - +isLoggedIn: bool + [<abstract>ISyncIndicatorViewModel | - -void _registerAuthListener(); - +dynamic signUp(); - +dynamic signInWith(); - +dynamic signOut(); - +dynamic resetPasswordForEmail(); - +dynamic updateUser(); - +void dispose(); - +dynamic onAppStart() + +isDirty: bool; + +lastSynced: DateTime? ] - [AuthRepository]o-[SupabaseClient] - [AuthRepository]o-[GoTrueClient] - [AuthRepository]o-[Session] - [AuthRepository]o-[User] - [<abstract>IAuthRepository]<:--[AuthRepository] - - [<abstract>IInviteCodeRepository + [SyncIndicator | - +dynamic isCodeAlreadyUsed() + +state: AsyncValue<T>; + +lastSynced: DateTime?; + +isDirty: bool; + +animationDuration: int; + +iconSize: double ] - [<abstract>ModelRepository]<:--[<abstract>IInviteCodeRepository] + [SyncIndicator]o-[<abstract>AsyncValue] - [InviteCodeRepository - | - +studyId: String; - +ref: ProviderRef<dynamic>; - +apiClient: StudyUApi; - +authRepository: IAuthRepository; - +studyRepository: IStudyRepository; - +study: Study + [<abstract>IWithBanner | - +String getKey(); - +dynamic isCodeAlreadyUsed(); - +List<ModelAction<dynamic>> availableActions(); - +dynamic emitUpdate() + +Widget? banner() ] - [InviteCodeRepository]o-[<abstract>ProviderRef] - [InviteCodeRepository]o-[<abstract>StudyUApi] - [InviteCodeRepository]o-[<abstract>IAuthRepository] - [InviteCodeRepository]o-[<abstract>IStudyRepository] - [InviteCodeRepository]o-[Study] - [<abstract>ModelRepository]<:-[InviteCodeRepository] - [<abstract>IInviteCodeRepository]<:--[InviteCodeRepository] - - [InviteCodeRepositoryDelegate - | - +study: Study; - +apiClient: StudyUApi; - +studyRepository: IStudyRepository + [BannerBox | - +dynamic fetch(); - +dynamic fetchAll(); - +dynamic save(); - +dynamic delete(); - +dynamic onError(); - +StudyInvite createDuplicate(); - +StudyInvite createNewInstance() + +prefixIcon: Widget?; + +body: Widget; + +style: BannerStyle; + +padding: EdgeInsets?; + +noPrefix: bool; + +dismissable: bool; + +isDismissed: bool?; + +onDismissed: dynamic Function()?; + +dismissIconSize: double ] - [InviteCodeRepositoryDelegate]o-[Study] - [InviteCodeRepositoryDelegate]o-[<abstract>StudyUApi] - [InviteCodeRepositoryDelegate]o-[<abstract>IStudyRepository] - [<abstract>IModelRepositoryDelegate]<:-[InviteCodeRepositoryDelegate] + [BannerBox]o-[<abstract>Widget] + [BannerBox]o-[BannerStyle] + [BannerBox]o-[EdgeInsets] + [BannerBox]o-[dynamic Function()?] - [StudyLaunched + [BannerStyle + | + +index: int; + <static>+values: List<BannerStyle>; + <static>+warning: BannerStyle; + <static>+info: BannerStyle; + <static>+error: BannerStyle ] - [<abstract>ModelEvent]<:-[StudyLaunched] + [BannerStyle]o-[BannerStyle] + [Enum]<:--[BannerStyle] - [WrappedModel + [ActionMenuInline | - -_model: T; - +asyncValue: AsyncValue<T>; - +isLocalOnly: bool; - +isDirty: bool; - +isDeleted: bool; - +lastSaved: DateTime?; - +lastFetched: DateTime?; - +lastUpdated: DateTime?; - +model: T + +actions: List<ModelAction<dynamic>>; + +iconSize: double?; + +visible: bool; + +splashRadius: double?; + +paddingVertical: double?; + +paddingHorizontal: double? | - +dynamic markWithError(); - +dynamic markAsLoading(); - +dynamic markAsFetched(); - +dynamic markAsSaved() + +Widget build() ] - [WrappedModel]o-[<abstract>AsyncValue] - - [ModelRepositoryException + [Collapsible + | + +contentBuilder: Widget Function(BuildContext, bool); + +headerBuilder: Widget Function(BuildContext, bool)?; + +title: String?; + +isCollapsed: bool ] - [Exception]<:--[ModelRepositoryException] + [Collapsible]o-[Widget Function(BuildContext, bool)] + [Collapsible]o-[Widget Function(BuildContext, bool)?] - [ModelNotFoundException + [NavbarTab + | + +title: String; + +intent: RoutingIntent?; + +index: int; + +enabled: bool ] - [ModelRepositoryException]<:--[ModelNotFoundException] + [NavbarTab]o-[RoutingIntent] - [<abstract>IModelRepository + [TabbedNavbar | - +String getKey(); - +WrappedModel<T>? get(); - +dynamic fetchAll(); - +dynamic fetch(); - +dynamic save(); - +dynamic delete(); - +dynamic duplicateAndSave(); - +dynamic duplicateAndSaveFromRemote(); - +Stream<WrappedModel<T>> watch(); - +Stream<List<WrappedModel<T>>> watchAll(); - +Stream<ModelEvent<T>> watchChanges(); - +Stream<ModelEvent<T>> watchAllChanges(); - +dynamic ensurePersisted(); - +void dispose() + +tabs: List<T>; + +selectedTab: T?; + +indicator: BoxDecoration?; + +height: double?; + +disabledBackgroundColor: Color?; + +disabledTooltipText: String?; + +onSelect: void Function(int, T)?; + +labelPadding: EdgeInsets?; + +labelSpacing: double?; + +indicatorSize: TabBarIndicatorSize?; + +isScrollable: bool; + +backgroundColor: Color?; + +labelColorHover: Color?; + +unselectedLabelColorHover: Color? ] - [<abstract>IModelActionProvider]<:--[<abstract>IModelRepository] + [TabbedNavbar]o-[BoxDecoration] + [TabbedNavbar]o-[Color] + [TabbedNavbar]o-[void Function(int, T)?] + [TabbedNavbar]o-[EdgeInsets] + [TabbedNavbar]o-[TabBarIndicatorSize] - [<abstract>IModelRepositoryDelegate + [SidesheetTab | - +dynamic fetchAll(); - +dynamic fetch(); - +dynamic save(); - +dynamic delete(); - +T createNewInstance(); - +T createDuplicate(); - +dynamic onError() + +builder: Widget Function(BuildContext) ] - [<abstract>ModelRepository + [SidesheetTab]o-[Widget Function(BuildContext)] + [NavbarTab]<:-[SidesheetTab] + + [Sidesheet | - +delegate: IModelRepositoryDelegate<T>; - -_allModelsStreamController: BehaviorSubject<List<WrappedModel<T>>>; - -_allModelEventsStreamController: BehaviorSubject<ModelEvent<T>>; - +modelStreamControllers: Map<String, BehaviorSubject<WrappedModel<T>>>; - +modelEventsStreamControllers: Map<String, BehaviorSubject<ModelEvent<T>>>; - -_allModels: Map<String, WrappedModel<T>> - | - +WrappedModel<T>? get(); - +dynamic fetchAll(); - +dynamic fetch(); - +dynamic save(); - +dynamic delete(); - +dynamic duplicateAndSave(); - +dynamic duplicateAndSaveFromRemote(); - +Stream<List<WrappedModel<T>>> watchAll(); - +Stream<WrappedModel<T>> watch(); - +Stream<ModelEvent<T>> watchAllChanges(); - +Stream<ModelEvent<T>> watchChanges(); - -dynamic _buildModelSpecificController(); - +dynamic ensurePersisted(); - +WrappedModel<T> upsertLocally(); - +List<WrappedModel<T>> upsertAllLocally(); - +dynamic emitUpdate(); - +dynamic emitModelEvent(); - +dynamic emitError(); - +void dispose(); - +List<ModelAction<dynamic>> availableActions() + <static>+kDefaultWidth: double; + +titleText: String; + +body: Widget?; + +tabs: List<SidesheetTab>?; + +actionButtons: List<Widget>?; + +width: double?; + +withCloseButton: bool; + +ignoreAppBar: bool; + +collapseSingleTab: bool; + +bodyPadding: EdgeInsets?; + +wrapContent: Widget Function(Widget)? ] - [<abstract>ModelRepository]o-[<abstract>IModelRepositoryDelegate] - [<abstract>ModelRepository]o-[BehaviorSubject] - [<abstract>IModelRepository]<:-[<abstract>ModelRepository] + [Sidesheet]o-[<abstract>Widget] + [Sidesheet]o-[EdgeInsets] + [Sidesheet]o-[Widget Function(Widget)?] - [<abstract>StudyUApi + [FormSideSheetTab | - +dynamic saveStudy(); - +dynamic fetchStudy(); - +dynamic getUserStudies(); - +dynamic deleteStudy(); - +dynamic saveStudyInvite(); - +dynamic fetchStudyInvite(); - +dynamic deleteStudyInvite(); - +dynamic deleteParticipants(); - +dynamic fetchAppConfig(); - +dynamic fetchUser(); - +dynamic saveUser() - ] - - [APIException - ] - - [Exception]<:--[APIException] - - [StudyNotFoundException + +formViewBuilder: Widget Function(T) ] - [APIException]<:-[StudyNotFoundException] + [FormSideSheetTab]o-[Widget Function(T)] + [NavbarTab]<:-[FormSideSheetTab] - [MeasurementNotFoundException + [HelpIcon + | + +tooltipText: String? + | + +Widget build() ] - [APIException]<:-[MeasurementNotFoundException] - - [QuestionNotFoundException + [EmptyBody + | + +icon: IconData?; + +leading: Widget?; + +leadingSpacing: double?; + +title: String?; + +description: String?; + +button: Widget? + | + +Widget build() ] - [APIException]<:-[QuestionNotFoundException] + [EmptyBody]o-[IconData] + [EmptyBody]o-[<abstract>Widget] - [ConsentItemNotFoundException + [IndicatorRangeSliderThumbShape + | + +buildContext: BuildContext; + +start: T; + +end: T + | + +Size getPreferredSize(); + +void paint() ] - [APIException]<:-[ConsentItemNotFoundException] + [IndicatorRangeSliderThumbShape]o-[<abstract>BuildContext] + [<abstract>RangeSliderThumbShape]<:-[IndicatorRangeSliderThumbShape] - [InterventionNotFoundException + [MouseEventsRegion + | + +onTap: void Function()?; + +onHover: void Function(PointerHoverEvent)?; + +onEnter: void Function(PointerEnterEvent)?; + +onExit: void Function(PointerExitEvent)?; + +autoselectCursor: bool; + +cursor: SystemMouseCursor; + <static>+defaultCursor: SystemMouseCursor; + +autoCursor: SystemMouseCursor ] - [APIException]<:-[InterventionNotFoundException] + [MouseEventsRegion]o-[void Function()?] + [MouseEventsRegion]o-[void Function(PointerHoverEvent)?] + [MouseEventsRegion]o-[void Function(PointerEnterEvent)?] + [MouseEventsRegion]o-[void Function(PointerExitEvent)?] + [MouseEventsRegion]o-[SystemMouseCursor] - [InterventionTaskNotFoundException + [ReactiveCustomColorPicker ] - [APIException]<:-[InterventionTaskNotFoundException] + [ReactiveFormField]<:-[ReactiveCustomColorPicker] - [ReportNotFoundException + [TextParagraph + | + +text: String?; + +style: TextStyle?; + +selectable: bool; + +span: List<TextSpan>? + | + +Widget build() ] - [APIException]<:-[ReportNotFoundException] + [TextParagraph]o-[TextStyle] - [ReportSectionNotFoundException + [UnderConstruction + | + +Widget build() ] - [APIException]<:-[ReportSectionNotFoundException] - - [StudyInviteNotFoundException + [NullHelperDecoration ] - [APIException]<:-[StudyInviteNotFoundException] + [InputDecoration]<:-[NullHelperDecoration] - [UserNotFoundException + [ActionMenuType + | + +index: int; + <static>+values: List<ActionMenuType>; + <static>+inline: ActionMenuType; + <static>+popup: ActionMenuType ] - [APIException]<:-[UserNotFoundException] + [ActionMenuType]o-[ActionMenuType] + [Enum]<:--[ActionMenuType] - [StudyUApiClient + [HtmlStylingBanner | - +supabaseClient: SupabaseClient; - <static>+studyColumns: List<String>; - <static>+studyWithParticipantActivityColumns: List<String>; - +testDelayMilliseconds: int + +isDismissed: bool; + +onDismissed: dynamic Function()? | - +dynamic deleteParticipants(); - +dynamic getUserStudies(); - +dynamic fetchStudy(); - +dynamic deleteStudy(); - +dynamic saveStudy(); - +dynamic fetchStudyInvite(); - +dynamic saveStudyInvite(); - +dynamic deleteStudyInvite(); - +dynamic fetchAppConfig(); - +dynamic fetchUser(); - +dynamic saveUser(); - -dynamic _awaitGuarded(); - -dynamic _apiException(); - -dynamic _testDelay() + +Widget build() ] - [StudyUApiClient]o-[SupabaseClient] - [<abstract>SupabaseClientDependant]<:-[StudyUApiClient] - [<abstract>SupabaseQueryMixin]<:-[StudyUApiClient] - [<abstract>StudyUApi]<:--[StudyUApiClient] + [HtmlStylingBanner]o-[dynamic Function()?] - [<abstract>ModelEvent + [<abstract>FormConsumerWidget | - +modelId: String; - +model: T + +Widget build() ] - [IsFetched + [<abstract>FormConsumerRefWidget + | + +Widget build() ] - [<abstract>ModelEvent]<:-[IsFetched] - - [IsSaving + [SplashPage + | + +Widget build() ] - [<abstract>ModelEvent]<:-[IsSaving] - - [IsSaved + [ErrorPage + | + +error: Exception? + | + +Widget build() ] - [<abstract>ModelEvent]<:-[IsSaved] + [<abstract>ConsumerWidget]<:-[ErrorPage] - [IsDeleted + [StudyULogo + | + +onTap: void Function()? + | + +Widget build() ] - [<abstract>ModelEvent]<:-[IsDeleted] + [StudyULogo]o-[void Function()?] - [<abstract>SupabaseClientDependant + [SingleColumnLayout | - +supabaseClient: SupabaseClient + <static>+defaultConstraints: BoxConstraints; + <static>+defaultConstraintsNarrow: BoxConstraints; + +body: Widget; + +header: Widget?; + +stickyHeader: bool; + +constraints: BoxConstraints?; + +scroll: bool; + +padding: EdgeInsets? + | + <static>+dynamic fromType() ] - [<abstract>SupabaseClientDependant]o-[SupabaseClient] + [SingleColumnLayout]o-[BoxConstraints] + [SingleColumnLayout]o-[<abstract>Widget] + [SingleColumnLayout]o-[EdgeInsets] - [SupabaseQueryError + [SingleColumnLayoutType | - +statusCode: String?; - +message: String; - +details: dynamic + +index: int; + <static>+values: List<SingleColumnLayoutType>; + <static>+boundedWide: SingleColumnLayoutType; + <static>+boundedNarrow: SingleColumnLayoutType; + <static>+stretched: SingleColumnLayoutType; + <static>+split: SingleColumnLayoutType ] - [Exception]<:--[SupabaseQueryError] + [SingleColumnLayoutType]o-[SingleColumnLayoutType] + [Enum]<:--[SingleColumnLayoutType] - [<abstract>SupabaseQueryMixin + [Hyperlink | - +dynamic deleteAll(); - +dynamic getAll(); - +dynamic getById(); - +dynamic getByColumn(); - +List<T> deserializeList(); - +T deserializeObject() - ] - - [<abstract>IStudyRepository - | - +dynamic launch(); - +dynamic deleteParticipants() + +text: String; + +url: String?; + +onClick: void Function()?; + +linkColor: Color; + +hoverColor: Color?; + +visitedColor: Color?; + +style: TextStyle?; + +hoverStyle: TextStyle?; + +visitedStyle: TextStyle?; + +icon: IconData?; + +iconSize: double? ] - [<abstract>ModelRepository]<:--[<abstract>IStudyRepository] + [Hyperlink]o-[void Function()?] + [Hyperlink]o-[Color] + [Hyperlink]o-[TextStyle] + [Hyperlink]o-[IconData] - [StudyRepository - | - +apiClient: StudyUApi; - +authRepository: IAuthRepository; - +ref: ProviderRef<dynamic>; - +sortCallback: void Function()? + [StandardTableColumn | - +String getKey(); - +dynamic deleteParticipants(); - +dynamic launch(); - +List<ModelAction<dynamic>> availableActions() + +label: String; + +tooltip: String?; + +columnWidth: TableColumnWidth; + +sortable: bool; + +sortAscending: bool?; + +sortableIcon: Widget? ] - [StudyRepository]o-[<abstract>StudyUApi] - [StudyRepository]o-[<abstract>IAuthRepository] - [StudyRepository]o-[<abstract>ProviderRef] - [StudyRepository]o-[void Function()?] - [<abstract>ModelRepository]<:-[StudyRepository] - [<abstract>IStudyRepository]<:--[StudyRepository] + [StandardTableColumn]o-[<abstract>TableColumnWidth] + [StandardTableColumn]o-[<abstract>Widget] - [StudyRepositoryDelegate - | - +apiClient: StudyUApi; - +authRepository: IAuthRepository + [StandardTable | - +dynamic fetchAll(); - +dynamic fetch(); - +dynamic save(); - +dynamic delete(); - +dynamic onError(); - +Study createNewInstance(); - +Study createDuplicate() + +items: List<T>; + +inputColumns: List<StandardTableColumn>; + +onSelectItem: void Function(T); + +trailingActionsAt: List<ModelAction<dynamic>> Function(T, int)?; + +trailingActionsMenuType: ActionMenuType?; + +sortColumnPredicates: List<int Function(T, T)?>?; + +pinnedPredicates: int Function(T, T)?; + +headerRowBuilder: TableRow Function(BuildContext, List<StandardTableColumn>)?; + +dataRowBuilder: TableRow Function(BuildContext, List<StandardTableColumn>)?; + +inputTrailingActionsColumn: StandardTableColumn; + +tableWrapper: Widget Function(Widget)?; + +cellSpacing: double; + +rowSpacing: double; + +minRowHeight: double?; + +showTableHeader: bool; + +hideLeadingTrailingWhenEmpty: bool; + +leadingWidget: Widget?; + +trailingWidget: Widget?; + +leadingWidgetSpacing: double?; + +trailingWidgetSpacing: double?; + +emptyWidget: Widget?; + +rowStyle: StandardTableStyle; + +disableRowInteractions: bool ] - [StudyRepositoryDelegate]o-[<abstract>StudyUApi] - [StudyRepositoryDelegate]o-[<abstract>IAuthRepository] - [<abstract>IModelRepositoryDelegate]<:-[StudyRepositoryDelegate] + [StandardTable]o-[void Function(T)] + [StandardTable]o-[List<ModelAction<dynamic>> Function(T, int)?] + [StandardTable]o-[ActionMenuType] + [StandardTable]o-[int Function(T, T)?] + [StandardTable]o-[TableRow Function(BuildContext, List<StandardTableColumn>)?] + [StandardTable]o-[StandardTableColumn] + [StandardTable]o-[Widget Function(Widget)?] + [StandardTable]o-[<abstract>Widget] + [StandardTable]o-[StandardTableStyle] - [<abstract>IUserRepository - | - +user: StudyUUser + [StandardTableStyle | - +dynamic fetchUser(); - +dynamic saveUser(); - +dynamic updatePreferences() + +index: int; + <static>+values: List<StandardTableStyle>; + <static>+plain: StandardTableStyle; + <static>+material: StandardTableStyle ] - [<abstract>IUserRepository]o-[StudyUUser] + [StandardTableStyle]o-[StandardTableStyle] + [Enum]<:--[StandardTableStyle] - [UserRepository + [IconPack | - +apiClient: StudyUApi; - +authRepository: IAuthRepository; - +ref: Ref<Object?>; - +user: StudyUUser + <static>+defaultPack: List<IconOption>; + <static>+material: List<IconOption> | - +dynamic fetchUser(); - +dynamic saveUser(); - +dynamic updatePreferences() + <static>+IconOption? resolveIconByName() ] - [UserRepository]o-[<abstract>StudyUApi] - [UserRepository]o-[<abstract>IAuthRepository] - [UserRepository]o-[<abstract>Ref] - [UserRepository]o-[StudyUUser] - [<abstract>IUserRepository]<:--[UserRepository] - - [PreferenceAction + [IconOption | - +index: int; - <static>+values: List<PreferenceAction>; - <static>+pin: PreferenceAction; - <static>+pinOff: PreferenceAction + +name: String; + +icon: IconData?; + +isEmpty: bool; + +props: List<Object?> + | + +String toJson(); + <static>+IconOption fromJson() ] - [PreferenceAction]o-[PreferenceAction] - [Enum]<:--[PreferenceAction] + [IconOption]o-[IconData] + [<abstract>Equatable]<:-[IconOption] - [<abstract>IAppRepository - | - +dynamic fetchAppConfig(); - +void dispose() + [ReactiveIconPicker ] - [AppRepository + [ReactiveFocusableFormField]<:-[ReactiveIconPicker] + + [IconPicker | - +apiClient: StudyUApi + +iconOptions: List<IconOption>; + +selectedOption: IconOption?; + +onSelect: void Function(IconOption)?; + +galleryIconSize: double?; + +selectedIconSize: double?; + +focusNode: FocusNode?; + +isDisabled: bool | - +dynamic fetchAppConfig(); - +void dispose() + +Widget build() ] - [AppRepository]o-[<abstract>StudyUApi] - [<abstract>IAppRepository]<:--[AppRepository] + [IconPicker]o-[IconOption] + [IconPicker]o-[void Function(IconOption)?] + [IconPicker]o-[FocusNode] - [WebFrame + [IconPickerField | - +previewSrc: String; - +studyId: String + +iconOptions: List<IconOption>; + +selectedOption: IconOption?; + +selectedIconSize: double?; + +galleryIconSize: double?; + +onSelect: void Function(IconOption)?; + +focusNode: FocusNode?; + +isDisabled: bool | +Widget build() ] - [DisabledFrame + [IconPickerField]o-[IconOption] + [IconPickerField]o-[void Function(IconOption)?] + [IconPickerField]o-[FocusNode] + + [IconPickerGallery + | + +iconOptions: List<IconOption>; + +onSelect: void Function(IconOption)?; + +iconSize: double | +Widget build() ] - [PhoneContainer + [IconPickerGallery]o-[void Function(IconOption)?] + + [SecondaryButton | - <static>+defaultWidth: double; - <static>+defaultHeight: double; - +width: double; - +height: double; - +borderColor: Color; - +borderWidth: double; - +borderRadius: double; - +innerContent: Widget; - +innerContentBackgroundColor: Color? + +text: String; + +icon: IconData?; + +isLoading: bool; + +onPressed: void Function()? | +Widget build() ] - [PhoneContainer]o-[Color] - [PhoneContainer]o-[<abstract>Widget] + [SecondaryButton]o-[IconData] + [SecondaryButton]o-[void Function()?] - [MobileFrame + [TwoColumnLayout | - +Widget build() + <static>+defaultDivider: VerticalDivider; + <static>+defaultContentPadding: EdgeInsets; + <static>+slimContentPadding: EdgeInsets; + +leftWidget: Widget; + +rightWidget: Widget; + +dividerWidget: Widget?; + +headerWidget: Widget?; + +flexLeft: int?; + +flexRight: int?; + +constraintsLeft: BoxConstraints?; + +constraintsRight: BoxConstraints?; + +scrollLeft: bool; + +scrollRight: bool; + +paddingLeft: EdgeInsets?; + +paddingRight: EdgeInsets?; + +backgroundColorLeft: Color?; + +backgroundColorRight: Color?; + +stretchHeight: bool ] - [DesktopFrame + [TwoColumnLayout]o-[VerticalDivider] + [TwoColumnLayout]o-[EdgeInsets] + [TwoColumnLayout]o-[<abstract>Widget] + [TwoColumnLayout]o-[BoxConstraints] + [TwoColumnLayout]o-[Color] + + [AppTranslation | - +Widget build() + <static>+dynamic init() ] - [StudyController + [<abstract>PlatformLocale | - +notificationService: INotificationService; - +studyEventsSubscription: StreamSubscription<ModelEvent<Study>>?; - +studyActions: List<ModelAction<dynamic>> + +Locale getPlatformLocale() + ] + + [PlatformLocaleWeb | - +dynamic syncStudyStatus(); - +dynamic onStudySubscriptionUpdate(); - -dynamic _redirectNewToActualStudyID(); - +dynamic publishStudy(); - +void onChangeStudyParticipation(); - +void onAddParticipants(); - +void onSettingsPressed(); - +void dispose() + +Locale getPlatformLocale() ] - [StudyController]o-[<abstract>INotificationService] - [StudyController]o-[StreamSubscription] - [StudyBaseController]<:-[StudyController] + [<abstract>PlatformLocale]<:--[PlatformLocaleWeb] - [<abstract>IStudyAppBarViewModel + [PlatformLocaleMobile | - +isSyncIndicatorVisible: bool; - +isStatusBadgeVisible: bool; - +isPublishVisible: bool + +Locale getPlatformLocale() ] - [<abstract>IStudyStatusBadgeViewModel]<:--[<abstract>IStudyAppBarViewModel] - [<abstract>IStudyNavViewModel]<:--[<abstract>IStudyAppBarViewModel] + [<abstract>PlatformLocale]<:--[PlatformLocaleMobile] - [StudyScaffold + [LanguagePicker | - +studyId: String; - +tabs: List<NavbarTab>?; - +tabsSubnav: List<NavbarTab>?; - +selectedTab: NavbarTab?; - +selectedTabSubnav: NavbarTab?; - +body: StudyPageWidget; - +drawer: Widget?; - +disableActions: bool; - +actionsSpacing: double; - +actionsPadding: double; - +layoutType: SingleColumnLayoutType?; - +appbarHeight: double; - +appbarSubnavHeight: double + +languagePickerType: LanguagePickerType; + +iconColor: Color?; + +offset: Offset? ] - [StudyScaffold]o-[NavbarTab] - [StudyScaffold]o-[<abstract>StudyPageWidget] - [StudyScaffold]o-[<abstract>Widget] - [StudyScaffold]o-[SingleColumnLayoutType] + [LanguagePicker]o-[LanguagePickerType] + [LanguagePicker]o-[Color] + [LanguagePicker]o-[Offset] - [PreviewFrame + [LanguagePickerType | - +studyId: String; - +routeArgs: StudyFormRouteArgs?; - +route: String? + +index: int; + <static>+values: List<LanguagePickerType>; + <static>+field: LanguagePickerType; + <static>+icon: LanguagePickerType ] - [PreviewFrame]o-[<abstract>StudyFormRouteArgs] + [LanguagePickerType]o-[LanguagePickerType] + [Enum]<:--[LanguagePickerType] - [RouteInformation - | - +route: String?; - +extra: String?; - +cmd: String?; - +data: String? + [<abstract>GoRouteParamEnum | - +String toString() + +String toRouteParam(); + +String toShortString() ] - [<abstract>PlatformController - | - +studyId: String; - +baseSrc: String; - +previewSrc: String; - +routeInformation: RouteInformation; - +frameWidget: Widget + [RoutingIntents | - +void activate(); - +void registerViews(); - +void generateUrl(); - +void navigate(); - +void refresh(); - +void listen(); - +void send(); - +void openNewPage() + <static>+root: RoutingIntent; + <static>+studies: RoutingIntent; + <static>+studiesShared: RoutingIntent; + <static>+publicRegistry: RoutingIntent; + <static>+study: RoutingIntent Function(String); + <static>+studyEdit: RoutingIntent Function(String); + <static>+studyEditInfo: RoutingIntent Function(String); + <static>+studyEditEnrollment: RoutingIntent Function(String); + <static>+studyEditInterventions: RoutingIntent Function(String); + <static>+studyEditIntervention: RoutingIntent Function(String, String); + <static>+studyEditMeasurements: RoutingIntent Function(String); + <static>+studyEditReports: RoutingIntent Function(String); + <static>+studyEditMeasurement: RoutingIntent Function(String, String); + <static>+studyTest: RoutingIntent Function(String, {String? appRoute}); + <static>+studyRecruit: RoutingIntent Function(String); + <static>+studyMonitor: RoutingIntent Function(String); + <static>+studyAnalyze: RoutingIntent Function(String); + <static>+studySettings: RoutingIntent Function(String); + <static>+accountSettings: RoutingIntent; + <static>+studyNew: RoutingIntent; + <static>+login: RoutingIntent; + <static>+signup: RoutingIntent; + <static>+passwordForgot: RoutingIntent; + <static>+passwordForgot2: RoutingIntent Function(String); + <static>+passwordRecovery: RoutingIntent; + <static>+error: RoutingIntent Function(Exception) ] - [<abstract>PlatformController]o-[RouteInformation] - [<abstract>PlatformController]o-[<abstract>Widget] + [RoutingIntents]o-[RoutingIntent] + [RoutingIntents]o-[RoutingIntent Function(String)] + [RoutingIntents]o-[RoutingIntent Function(String, String)] + [RoutingIntents]o-[RoutingIntent Function(String, {String? appRoute})] + [RoutingIntents]o-[RoutingIntent Function(Exception)] - [WebController + [RoutingIntent | - +iFrameElement: IFrameElement + +route: GoRoute; + +params: Map<String, String>; + +queryParams: Map<String, String>; + +dispatch: RoutingIntentDispatch?; + +extra: Object?; + +routeName: String; + +arguments: Map<String, String>; + +props: List<Object?> | - +void activate(); - +void registerViews(); - +void generateUrl(); - +void navigate(); - +void refresh(); - +void openNewPage(); - +void listen(); - +void send() + -dynamic _validateRoute(); + +bool matches() ] - [WebController]o-[IFrameElement] - [<abstract>PlatformController]<:-[WebController] + [RoutingIntent]o-[GoRoute] + [RoutingIntent]o-[RoutingIntentDispatch] + [<abstract>Equatable]<:-[RoutingIntent] - [MobileController + [RoutingIntentDispatch | - +void openNewPage(); - +void refresh(); - +void registerViews(); - +void listen(); - +void send(); - +void navigate(); - +void activate(); - +void generateUrl() + +index: int; + <static>+values: List<RoutingIntentDispatch>; + <static>+go: RoutingIntentDispatch; + <static>+push: RoutingIntentDispatch ] - [<abstract>PlatformController]<:-[MobileController] + [RoutingIntentDispatch]o-[RoutingIntentDispatch] + [Enum]<:--[RoutingIntentDispatch] - [StudyParticipationBadge - | - +participation: Participation; - +type: BadgeType; - +showPrefixIcon: bool; - +center: bool + [RouterKeys | - +Widget build() + <static>+studyKey: ValueKey<String>; + <static>+authKey: ValueKey<String> ] - [StudyParticipationBadge]o-[Participation] - [StudyParticipationBadge]o-[BadgeType] + [RouterKeys]o-[ValueKey] - [StudyTestScreen + [RouteParams | - +previewRoute: String? + <static>+studiesFilter: String; + <static>+studyId: String; + <static>+measurementId: String; + <static>+interventionId: String; + <static>+testAppRoute: String + ] + + [RouterConf | - +Widget build(); - +Widget? banner(); - +dynamic load(); - +dynamic save(); - +dynamic showHelp() + <static>+router: GoRouter; + <static>+routes: List<GoRoute>; + <static>+publicRoutes: List<GoRoute>; + <static>+privateRoutes: List<GoRoute> + | + <static>+GoRoute route() ] - [<abstract>StudyPageWidget]<:-[StudyTestScreen] + [RouterConf]o-[GoRouter] - [TestAppRoutes + [<abstract>StudyFormRouteArgs | - <static>+studyOverview: String; - <static>+eligibility: String; - <static>+intervention: String; - <static>+consent: String; - <static>+journey: String; - <static>+dashboard: String + +studyId: String ] - [<abstract>IStudyNavViewModel + [<abstract>QuestionFormRouteArgs | - +isEditTabEnabled: bool; - +isTestTabEnabled: bool; - +isRecruitTabEnabled: bool; - +isMonitorTabEnabled: bool; - +isAnalyzeTabEnabled: bool; - +isSettingsEnabled: bool + +questionId: String ] - [StudyNav + [<abstract>StudyFormRouteArgs]<:-[<abstract>QuestionFormRouteArgs] + + [ScreenerQuestionFormRouteArgs + ] + + [<abstract>QuestionFormRouteArgs]<:-[ScreenerQuestionFormRouteArgs] + + [ConsentItemFormRouteArgs | - <static>+dynamic tabs(); - <static>+dynamic edit(); - <static>+dynamic test(); - <static>+dynamic recruit(); - <static>+dynamic monitor(); - <static>+dynamic analyze() + +consentId: String ] - [StudyDesignNav + [<abstract>StudyFormRouteArgs]<:-[ConsentItemFormRouteArgs] + + [MeasurementFormRouteArgs | - <static>+dynamic tabs(); - <static>+dynamic info(); - <static>+dynamic enrollment(); - <static>+dynamic interventions(); - <static>+dynamic measurements(); - <static>+dynamic reports() + +measurementId: String ] - [StudyTestController + [<abstract>StudyFormRouteArgs]<:-[MeasurementFormRouteArgs] + + [SurveyQuestionFormRouteArgs | - +authRepository: IAuthRepository; - +languageCode: String + +questionId: String ] - [StudyTestController]o-[<abstract>IAuthRepository] - [StudyBaseController]<:-[StudyTestController] + [MeasurementFormRouteArgs]<:-[SurveyQuestionFormRouteArgs] + [<abstract>QuestionFormRouteArgs]<:--[SurveyQuestionFormRouteArgs] - [<abstract>IStudyStatusBadgeViewModel + [InterventionFormRouteArgs | - +studyParticipation: Participation?; - +studyStatus: StudyStatus? + +interventionId: String ] - [<abstract>IStudyStatusBadgeViewModel]o-[Participation] - [<abstract>IStudyStatusBadgeViewModel]o-[StudyStatus] + [<abstract>StudyFormRouteArgs]<:-[InterventionFormRouteArgs] - [StudyStatusBadge + [InterventionTaskFormRouteArgs | - +participation: Participation?; - +status: StudyStatus?; - +type: BadgeType; - +showPrefixIcon: bool; - +showTooltip: bool - | - +Widget build() + +taskId: String ] - [StudyStatusBadge]o-[Participation] - [StudyStatusBadge]o-[StudyStatus] - [StudyStatusBadge]o-[BadgeType] + [InterventionFormRouteArgs]<:-[InterventionTaskFormRouteArgs] - [FrameControlsWidget - | - +onRefresh: void Function()?; - +onOpenNewTab: void Function()?; - +enabled: bool + [ReportItemFormRouteArgs | - +Widget build() + +sectionId: String ] - [FrameControlsWidget]o-[void Function()?] - [<abstract>ConsumerWidget]<:-[FrameControlsWidget] + [<abstract>StudyFormRouteArgs]<:-[ReportItemFormRouteArgs] - [StudySettingsDialog + [DropdownMenuItemTheme | - +Widget build() + +iconTheme: IconThemeData? ] - [<abstract>StudyPageWidget]<:-[StudySettingsDialog] + [DropdownMenuItemTheme]o-[IconThemeData] + [<abstract>Diagnosticable]<:-[DropdownMenuItemTheme] - [StudySettingsFormViewModel + [ThemeConfig | - +study: AsyncValue<Study>; - +studyRepository: IStudyRepository; - <static>+defaultPublishedToRegistry: bool; - <static>+defaultPublishedToRegistryResults: bool; - +isPublishedToRegistryControl: FormControl<bool>; - +isPublishedToRegistryResultsControl: FormControl<bool>; - +form: FormGroup; - +titles: Map<FormMode, String> + <static>+kMinContentWidth: double; + <static>+kMaxContentWidth: double; + <static>+kHoverFadeFactor: double; + <static>+kMuteFadeFactor: double | - +void setControlsFrom(); - +Study buildFormData(); - +dynamic keepControlsSynced(); - +dynamic save(); - +dynamic setLaunchDefaults() + <static>+dynamic bodyBackgroundColor(); + <static>+Color modalBarrierColor(); + <static>+Color containerColor(); + <static>+Color colorPickerInitialColor(); + <static>+TextStyle bodyTextMuted(); + <static>+TextStyle bodyTextBackground(); + <static>+double iconSplashRadius(); + <static>+Color sidesheetBackgroundColor(); + <static>+InputDecorationTheme dropdownInputDecorationTheme(); + <static>+DropdownMenuItemTheme dropdownMenuItemTheme() ] - [StudySettingsFormViewModel]o-[<abstract>AsyncValue] - [StudySettingsFormViewModel]o-[<abstract>IStudyRepository] - [StudySettingsFormViewModel]o-[FormControl] - [StudySettingsFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[StudySettingsFormViewModel] - - [StudyBaseController - | - +studyId: String; - +studyRepository: IStudyRepository; - +router: GoRouter; - +studySubscription: StreamSubscription<WrappedModel<Study>>? + [NoAnimationPageTransitionsBuilder | - +dynamic subscribeStudy(); - +dynamic onStudySubscriptionUpdate(); - +dynamic onStudySubscriptionError(); - +void dispose() + +Widget buildTransitions() ] - [StudyBaseController]o-[<abstract>IStudyRepository] - [StudyBaseController]o-[GoRouter] - [StudyBaseController]o-[StreamSubscription] + [<abstract>PageTransitionsBuilder]<:-[NoAnimationPageTransitionsBuilder] - [<abstract>StudyPageWidget - | - +studyId: String + [WebTransitionBuilder | - +Widget? banner() + +Widget buildTransitions() ] - [<abstract>ConsumerWidget]<:-[<abstract>StudyPageWidget] - [<abstract>IWithBanner]<:--[<abstract>StudyPageWidget] + [<abstract>PageTransitionsBuilder]<:-[WebTransitionBuilder] - [AppStatus + [ThemeSettingChange | - +index: int; - <static>+values: List<AppStatus>; - <static>+initializing: AppStatus; - <static>+initialized: AppStatus + +settings: ThemeSettings ] - [AppStatus]o-[AppStatus] - [Enum]<:--[AppStatus] - - [<abstract>IAppDelegate - | - +dynamic onAppStart() - ] + [ThemeSettingChange]o-[ThemeSettings] + [<abstract>Notification]<:-[ThemeSettingChange] - [AppController + [ThemeProvider | - +appDelegates: List<IAppDelegate>; - -_delayedFuture: dynamic; - +isInitialized: dynamic + +settings: ValueNotifier<ThemeSettings>; + +lightDynamic: ColorScheme?; + +darkDynamic: ColorScheme?; + +pageTransitionsTheme: PageTransitionsTheme; + +shapeMedium: ShapeBorder | - +dynamic onAppStart(); - -dynamic _callDelegates() - ] - - [App + +Color custom(); + +Color blend(); + +Color source(); + +ColorScheme colors(); + +CardTheme cardTheme(); + +ListTileThemeData listTileTheme(); + +AppBarTheme appBarTheme(); + +SnackBarThemeData snackBarThemeData(); + +TabBarTheme tabBarTheme(); + +BottomAppBarTheme bottomAppBarTheme(); + +BottomNavigationBarThemeData bottomNavigationBarTheme(); + +SwitchThemeData switchTheme(); + +InputDecorationTheme inputDecorationTheme(); + +TextTheme textTheme(); + +DividerThemeData dividerTheme(); + +NavigationRailThemeData navigationRailTheme(); + +DrawerThemeData drawerTheme(); + +IconThemeData iconTheme(); + +CheckboxThemeData checkboxTheme(); + +RadioThemeData radioTheme(); + +TooltipThemeData tooltipTheme(); + +ThemeData light(); + +ThemeData dark(); + +ThemeMode themeMode(); + +ThemeData theme(); + <static>+ThemeProvider of(); + +bool updateShouldNotify() ] - [AppContent - ] + [ThemeProvider]o-[ValueNotifier] + [ThemeProvider]o-[ColorScheme] + [ThemeProvider]o-[PageTransitionsTheme] + [ThemeProvider]o-[<abstract>ShapeBorder] + [<abstract>InheritedWidget]<:-[ThemeProvider] - [AuthFormController - | - +authRepository: IAuthRepository; - +notificationService: INotificationService; - +router: GoRouter; - +emailControl: FormControl<String>; - +passwordControl: FormControl<String>; - +passwordConfirmationControl: FormControl<String>; - +termsOfServiceControl: FormControl<bool>; - <static>+authValidationMessages: Map<String, String Function(dynamic)>; - +loginForm: FormGroup; - +signupForm: FormGroup; - +passwordForgotForm: FormGroup; - +passwordRecoveryForm: FormGroup; - +controlValidatorsByForm: Map<AuthFormKey, Map<FormControl<dynamic>, List<Validator<dynamic>>>>; - -_formKey: AuthFormKey; - +formKey: AuthFormKey; - +form: FormGroup + [ThemeSettings | - -dynamic _getFormFor(); - -dynamic _onChangeFormKey(); - +dynamic resetControlsFor(); - -dynamic _forceValidationMessages(); - +dynamic signUp(); - -dynamic _signUp(); - +dynamic signIn(); - -dynamic _signInWith(); - +dynamic signOut(); - +dynamic resetPasswordForEmail(); - +dynamic sendPasswordResetLink(); - +dynamic recoverPassword(); - +dynamic updateUser(); - -dynamic _readDebugUser() + +sourceColor: Color; + +themeMode: ThemeMode ] - [AuthFormController]o-[<abstract>IAuthRepository] - [AuthFormController]o-[<abstract>INotificationService] - [AuthFormController]o-[GoRouter] - [AuthFormController]o-[FormControl] - [AuthFormController]o-[FormGroup] - [AuthFormController]o-[AuthFormKey] - [<abstract>IFormGroupController]<:--[AuthFormController] + [ThemeSettings]o-[Color] + [ThemeSettings]o-[ThemeMode] - [AuthFormKey + [CustomColor | - +index: int; - <static>+values: List<AuthFormKey>; - <static>+login: AuthFormKey; - <static>+signup: AuthFormKey; - <static>+passwordForgot: AuthFormKey; - <static>+passwordRecovery: AuthFormKey; - <static>-_loginSubmit: AuthFormKey; - <static>-_signupSubmit: AuthFormKey + +name: String; + +color: Color; + +blend: bool + | + +Color value() ] - [AuthFormKey]o-[AuthFormKey] - [Enum]<:--[AuthFormKey] + [CustomColor]o-[Color] - [PasswordRecoveryForm + [SuppressedBehaviorSubject | - +formKey: AuthFormKey + +subject: BehaviorSubject<T>; + +didSuppressInitialEvent: bool; + -_controller: StreamController<T> | - +Widget build() + -StreamController<T> _buildDerivedController(); + +dynamic close() ] - [PasswordRecoveryForm]o-[AuthFormKey] - [<abstract>FormConsumerRefWidget]<:-[PasswordRecoveryForm] + [SuppressedBehaviorSubject]o-[BehaviorSubject] + [SuppressedBehaviorSubject]o-[StreamController] - [PasswordForgotForm - | - +formKey: AuthFormKey + [Time | - +Widget build() + <static>+dynamic fromTimeOfDay(); + +Map<String, dynamic> toJson(); + <static>+Time fromJson() ] - [PasswordForgotForm]o-[AuthFormKey] - [<abstract>FormConsumerRefWidget]<:-[PasswordForgotForm] + [TimeOfDay]<:-[Time] - [LoginForm - | - +formKey: AuthFormKey + [TimeValueAccessor | - +Widget build() + +String modelToViewValue(); + +Time? viewToModelValue(); + -String _addLeadingZeroIfNeeded() ] - [LoginForm]o-[AuthFormKey] - [<abstract>FormConsumerRefWidget]<:-[LoginForm] + [<abstract>ControlValueAccessor]<:-[TimeValueAccessor] - [EmailTextField + [ModelAction | - +labelText: String; - +hintText: String?; - +formControlName: String?; - +formControl: FormControl<dynamic>? + +type: T; + +label: String; + +icon: IconData?; + +onExecute: Function; + +isAvailable: bool; + +isDestructive: bool ] - [EmailTextField]o-[FormControl] + [ModelAction]o-[IconData] - [PasswordTextField + [<abstract>IModelActionProvider | - +labelText: String; - +hintText: String?; - +onSubmitted: dynamic Function(FormControl<dynamic>)?; - +formControlName: String?; - +formControl: FormControl<dynamic>? + +List<ModelAction<dynamic>> availableActions() ] - [PasswordTextField]o-[dynamic Function(FormControl<dynamic>)?] - [PasswordTextField]o-[FormControl] + [<abstract>IListActionProvider + | + +void onSelectItem(); + +void onNewItem() + ] - [SignupForm + [<abstract>IModelActionProvider]<:-[<abstract>IListActionProvider] + + [ModelActionType | - +formKey: AuthFormKey + +index: int; + <static>+values: List<ModelActionType>; + <static>+edit: ModelActionType; + <static>+delete: ModelActionType; + <static>+remove: ModelActionType; + <static>+duplicate: ModelActionType; + <static>+clipboard: ModelActionType; + <static>+primary: ModelActionType + ] + + [ModelActionType]o-[ModelActionType] + [Enum]<:--[ModelActionType] + + [OptimisticUpdate | - +Widget build(); - -dynamic _onClickTermsOfUse(); - -dynamic _onClickPrivacyPolicy() + +applyOptimistic: void Function(); + +apply: dynamic Function(); + +rollback: void Function(); + +onUpdate: void Function()?; + +onError: void Function(Object, StackTrace?)?; + +rethrowErrors: bool; + +runOptimistically: bool; + +completeFutureOptimistically: bool + | + +dynamic execute(); + -void _runUpdateHandlerIfAny() ] - [SignupForm]o-[AuthFormKey] - [<abstract>FormConsumerRefWidget]<:-[SignupForm] + [OptimisticUpdate]o-[void Function()] + [OptimisticUpdate]o-[dynamic Function()] + [OptimisticUpdate]o-[void Function()?] + [OptimisticUpdate]o-[void Function(Object, StackTrace?)?] - [StudyUJobsToBeDone + [<abstract>FileFormatEncoder | - +Widget build() + +dynamic encodeAsync(); + +String encode(); + +dynamic call() ] - [AuthScaffold + [CSVStringEncoder | - +body: Widget; - +formKey: AuthFormKey; - +leftContentMinWidth: double; - +leftPanelMinWidth: double; - +leftPanelPadding: EdgeInsets + +String encode() ] - [AuthScaffold]o-[<abstract>Widget] - [AuthScaffold]o-[AuthFormKey] - [AuthScaffold]o-[EdgeInsets] + [<abstract>FileFormatEncoder]<:-[CSVStringEncoder] - [PublishDialog + [JsonStringEncoder | - +Widget build() + +String encode() ] - [<abstract>StudyPageWidget]<:-[PublishDialog] + [<abstract>FileFormatEncoder]<:-[JsonStringEncoder] - [PublishSuccessDialog + [<abstract>ExecutionLimiter | - +Widget build() + +milliseconds: int; + <static>-_timer: Timer? + | + +void dispose() ] - [<abstract>StudyPageWidget]<:-[PublishSuccessDialog] + [<abstract>ExecutionLimiter]o-[Timer] - [PublishConfirmationDialog + [Debouncer | - +Widget build() + +leading: bool; + +cancelUncompleted: bool; + -_uncompletedFutureOperation: CancelableOperation<dynamic>? + | + +dynamic call() ] - [<abstract>StudyPageWidget]<:-[PublishConfirmationDialog] + [Debouncer]o-[CancelableOperation] + [<abstract>ExecutionLimiter]<:-[Debouncer] - [FormArrayTable - | - +control: AbstractControl<dynamic>; - +items: List<T>; - +onSelectItem: void Function(T); - +getActionsAt: List<ModelAction<dynamic>> Function(T, int); - +onNewItem: void Function()?; - +rowTitle: String Function(T); - +onNewItemLabel: String; - +sectionTitle: String?; - +sectionDescription: String?; - +emptyIcon: IconData?; - +emptyTitle: String?; - +emptyDescription: String?; - +sectionTitleDivider: bool?; - +rowPrefix: Widget Function(BuildContext, T, int)?; - +rowSuffix: Widget Function(BuildContext, T, int)?; - +leadingWidget: Widget?; - +itemsSectionPadding: EdgeInsets?; - +hideLeadingTrailingWhenEmpty: bool; - <static>+columns: List<StandardTableColumn> + [Throttler | - +Widget build(); - -List<Widget> _buildRow(); - -Widget _newItemButton() + +dynamic call() ] - [FormArrayTable]o-[<abstract>AbstractControl] - [FormArrayTable]o-[void Function(T)] - [FormArrayTable]o-[List<ModelAction<dynamic>> Function(T, int)] - [FormArrayTable]o-[void Function()?] - [FormArrayTable]o-[String Function(T)] - [FormArrayTable]o-[IconData] - [FormArrayTable]o-[Widget Function(BuildContext, T, int)?] - [FormArrayTable]o-[<abstract>Widget] - [FormArrayTable]o-[EdgeInsets] + [<abstract>ExecutionLimiter]<:-[Throttler] - [<abstract>IFormData + [SerializableColor | - +id: String + +Map<String, dynamic> toJson(); + <static>+SerializableColor fromJson() + ] + + [Color]<:-[SerializableColor] + + [<abstract>IProviderArgsResolver | - +IFormData copy() + +R provide() ] - [<abstract>ManagedFormViewModel + [CombinedStreamNotifier | - +ManagedFormViewModel<T> createDuplicate() + -_subscriptions: List<StreamSubscription<dynamic>> + | + +void dispose() ] - [<abstract>FormViewModel]<:-[<abstract>ManagedFormViewModel] + [ChangeNotifier]<:-[CombinedStreamNotifier] - [FormViewModelNotFoundException + [CountWhereValidator + | + +predicate: bool Function(T?); + +minCount: int?; + +maxCount: int?; + <static>+kValidationMessageMinCount: String; + <static>+kValidationMessageMaxCount: String + | + +Map<String, dynamic>? validate() ] - [Exception]<:--[FormViewModelNotFoundException] + [CountWhereValidator]o-[bool Function(T?)] + [<abstract>Validator]<:-[CountWhereValidator] - [FormViewModelCollection + [Patterns | - +formViewModels: List<T>; - +formArray: FormArray<dynamic>; - +stagedViewModels: List<T>; - +retrievableViewModels: List<T>; - +formData: List<D> + <static>+timeFormatString: String; + <static>+emailFormatString: String; + <static>+url: String + ] + + [NumericalRangeFormatter | - +void add(); - +T remove(); - +T? findWhere(); - +T? removeWhere(); - +bool contains(); - +void stage(); - +T commit(); - +void reset(); - +void read() + +min: int?; + +max: int? + | + +TextEditingValue formatEditUpdate() ] - [FormViewModelCollection]o-[FormArray] + [<abstract>TextInputFormatter]<:-[NumericalRangeFormatter] - [FormInvalidException + [StudySequenceFormatter + | + +TextEditingValue formatEditUpdate() ] - [Exception]<:--[FormInvalidException] + [<abstract>TextInputFormatter]<:-[StudySequenceFormatter] - [FormConfigException + [Tuple | - +message: String? + +first: T1; + +second: T2; + +props: List<Object?> + | + +Map<String, dynamic> toJson(); + <static>+Tuple<dynamic, dynamic> fromJson(); + +Tuple<T1, T2> copy(); + +Tuple<T1, T2> copyWith() ] - [Exception]<:--[FormConfigException] + [<abstract>Equatable]<:-[Tuple] - [<abstract>IFormViewModelDelegate + [<abstract>JsonFileLoader | - +dynamic onSave(); - +void onCancel() + +jsonAssetsPath: String + | + +dynamic loadJson(); + +dynamic parseJsonMapFromAssets(); + +dynamic parseJsonListFromAssets() ] - [<abstract>IFormGroupController + [<abstract>IAppDelegate | - +form: FormGroup + +dynamic onAppStart() ] - [<abstract>IFormGroupController]o-[FormGroup] + [AppController + | + +appDelegates: List<IAppDelegate>; + -_delayedFuture: dynamic; + +isInitialized: dynamic + | + +dynamic onAppStart(); + -dynamic _callDelegates() + ] - [FormControlOption + [StudyMonitorScreen | - +value: T; - +label: String; - +description: String?; - +props: List<Object?> + +Widget build() ] - [<abstract>Equatable]<:-[FormControlOption] + [<abstract>StudyPageWidget]<:-[StudyMonitorScreen] - [<abstract>FormViewModel + [LoginForm | - -_formData: T?; - -_formMode: FormMode; - -_validationSet: FormValidationSetEnum?; - +delegate: IFormViewModelDelegate<FormViewModel<dynamic>>?; - +autosave: bool; - -_immediateFormChildrenSubscriptions: List<StreamSubscription<dynamic>>; - -_immediateFormChildrenListenerDebouncer: Debouncer?; - -_autosaveOperation: CancelableOperation<dynamic>?; - -_defaultControlValidators: Map<String, Tuple<List<Validator<dynamic>>, List<AsyncValidator<dynamic>>>>; - +prevFormValue: Map<String, dynamic>?; - <static>-_formKey: String; - +formData: T?; - +formMode: FormMode; - +isReadonly: bool; - +validationSet: FormValidationSetEnum?; - +isDirty: bool; - +title: String; - +isValid: bool; - +titles: Map<FormMode, String>; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +formKey: AuthFormKey | - -dynamic _setFormData(); - -dynamic _rememberDefaultControlValidators(); - -Tuple<List<Validator<dynamic>>, List<AsyncValidator<dynamic>>>? _getDefaultValidators(); - -dynamic _disableAllControls(); - -dynamic _formModeUpdated(); - -dynamic _restoreControlsFromFormData(); - +void revalidate(); - -void _applyValidationSet(); - +void read(); - +dynamic save(); - +dynamic cancel(); - +void enableAutosave(); - +void listenToImmediateFormChildren(); - +dynamic markFormGroupChanged(); - +void dispose(); - +void setControlsFrom(); - +T buildFormData(); - +void initControls() + +Widget build() ] - [<abstract>FormViewModel]o-[FormMode] - [<abstract>FormViewModel]o-[<abstract>FormValidationSetEnum] - [<abstract>FormViewModel]o-[<abstract>IFormViewModelDelegate] - [<abstract>FormViewModel]o-[Debouncer] - [<abstract>FormViewModel]o-[CancelableOperation] - [<abstract>IFormGroupController]<:--[<abstract>FormViewModel] + [LoginForm]o-[AuthFormKey] + [<abstract>FormConsumerRefWidget]<:-[LoginForm] - [FormMode + [PasswordRecoveryForm | - +index: int; - <static>+values: List<FormMode>; - <static>+create: FormMode; - <static>+readonly: FormMode; - <static>+edit: FormMode + +formKey: AuthFormKey + | + +Widget build() ] - [FormMode]o-[FormMode] - [Enum]<:--[FormMode] + [PasswordRecoveryForm]o-[AuthFormKey] + [<abstract>FormConsumerRefWidget]<:-[PasswordRecoveryForm] - [CustomFormControl + [PasswordForgotForm | - -_onValueChangedDebouncer: Debouncer?; - -_onStatusChangedDebouncer: Debouncer?; - +onValueChanged: void Function(T?)?; - +onStatusChanged: void Function(ControlStatus)?; - +onStatusChangedDebounceTime: int?; - +onValueChangedDebounceTime: int? + +formKey: AuthFormKey | - +void dispose() + +Widget build() ] - [CustomFormControl]o-[Debouncer] - [CustomFormControl]o-[void Function(T?)?] - [CustomFormControl]o-[void Function(ControlStatus)?] - [FormControl]<:-[CustomFormControl] + [PasswordForgotForm]o-[AuthFormKey] + [<abstract>FormConsumerRefWidget]<:-[PasswordForgotForm] - [UnsavedChangesDialog + [SignupForm | - +Widget build() + +formKey: AuthFormKey + | + +Widget build(); + -dynamic _onClickTermsOfUse(); + -dynamic _onClickPrivacyPolicy() ] - [<abstract>FormValidationSetEnum - ] + [SignupForm]o-[AuthFormKey] + [<abstract>FormConsumerRefWidget]<:-[SignupForm] - [FormControlValidation - | - +control: AbstractControl<dynamic>; - +validators: List<Validator<dynamic>>; - +asyncValidators: List<AsyncValidator<dynamic>>?; - +validationMessages: Map<String, String Function(Object)> + [AuthScaffold | - +FormControlValidation merge() + +body: Widget; + +formKey: AuthFormKey; + +leftContentMinWidth: double; + +leftPanelMinWidth: double; + +leftPanelPadding: EdgeInsets ] - [FormControlValidation]o-[<abstract>AbstractControl] + [AuthScaffold]o-[<abstract>Widget] + [AuthScaffold]o-[AuthFormKey] + [AuthScaffold]o-[EdgeInsets] - [ScreenerQuestionFormViewModel - | - <static>+defaultResponseOptionValidity: bool; - +responseOptionsDisabledArray: FormArray<dynamic>; - +responseOptionsLogicControls: FormArray<bool>; - +responseOptionsLogicDescriptionControls: FormArray<String>; - -_questionBaseControls: Map<String, AbstractControl<dynamic>>; - +prevResponseOptionControls: List<AbstractControl<dynamic>>; - +prevResponseOptionValues: List<dynamic>; - +responseOptionsDisabledControls: List<AbstractControl<dynamic>>; - +logicControlOptions: List<FormControlOption<bool>>; - +questionBaseControls: Map<String, AbstractControl<dynamic>>; - +isDirtyOptionsBannerVisible: bool + [EmailTextField | - +dynamic onResponseOptionsChanged(); - +void setControlsFrom(); - +QuestionFormData buildFormData(); - -List<FormControl<dynamic>> _copyFormControls(); - -AbstractControl<dynamic>? _findAssociatedLogicControlFor(); - -AbstractControl<dynamic>? _findAssociatedControlFor(); - +ScreenerQuestionFormViewModel createDuplicate() + +labelText: String; + +hintText: String?; + +formControlName: String?; + +formControl: FormControl<dynamic>? ] - [ScreenerQuestionFormViewModel]o-[FormArray] - [QuestionFormViewModel]<:-[ScreenerQuestionFormViewModel] - [<abstract>IScreenerQuestionLogicFormViewModel]<:--[ScreenerQuestionFormViewModel] + [EmailTextField]o-[FormControl] - [StudyDesignEnrollmentFormView + [PasswordTextField | - +Widget build(); - -dynamic _showScreenerQuestionSidesheetWithArgs(); - -dynamic _showConsentItemSidesheetWithArgs() + +labelText: String; + +hintText: String?; + +onSubmitted: dynamic Function(FormControl<dynamic>)?; + +formControlName: String?; + +formControl: FormControl<dynamic>? ] - [<abstract>StudyDesignPageWidget]<:-[StudyDesignEnrollmentFormView] + [PasswordTextField]o-[dynamic Function(FormControl<dynamic>)?] + [PasswordTextField]o-[FormControl] - [<abstract>IScreenerQuestionLogicFormViewModel + [StudyUJobsToBeDone | - +isDirtyOptionsBannerVisible: bool + +Widget build() ] - [ScreenerQuestionLogicFormView + [AuthFormController | - +formViewModel: ScreenerQuestionFormViewModel + +authRepository: IAuthRepository; + +notificationService: INotificationService; + +router: GoRouter; + +emailControl: FormControl<String>; + +passwordControl: FormControl<String>; + +passwordConfirmationControl: FormControl<String>; + +termsOfServiceControl: FormControl<bool>; + <static>+authValidationMessages: Map<String, String Function(dynamic)>; + +loginForm: FormGroup; + +signupForm: FormGroup; + +passwordForgotForm: FormGroup; + +passwordRecoveryForm: FormGroup; + +controlValidatorsByForm: Map<AuthFormKey, Map<FormControl<dynamic>, List<Validator<dynamic>>>>; + -_formKey: AuthFormKey; + +formKey: AuthFormKey; + +form: FormGroup | - +Widget build(); - -dynamic _buildInfoBanner(); - -dynamic _buildAnswerOptionsLogicControls(); - -List<Widget> _buildOptionLogicRow() + -dynamic _getFormFor(); + -dynamic _onChangeFormKey(); + +dynamic resetControlsFor(); + -dynamic _forceValidationMessages(); + +dynamic signUp(); + -dynamic _signUp(); + +dynamic signIn(); + -dynamic _signInWith(); + +dynamic signOut(); + +dynamic resetPasswordForEmail(); + +dynamic sendPasswordResetLink(); + +dynamic recoverPassword(); + +dynamic updateUser(); + -dynamic _readDebugUser() ] - [ScreenerQuestionLogicFormView]o-[ScreenerQuestionFormViewModel] - [<abstract>FormConsumerWidget]<:-[ScreenerQuestionLogicFormView] + [AuthFormController]o-[<abstract>IAuthRepository] + [AuthFormController]o-[<abstract>INotificationService] + [AuthFormController]o-[GoRouter] + [AuthFormController]o-[FormControl] + [AuthFormController]o-[FormGroup] + [AuthFormController]o-[AuthFormKey] + [<abstract>IFormGroupController]<:--[AuthFormController] - [ConsentItemFormData - | - +consentId: String; - +title: String; - +description: String; - +iconName: String?; - +id: String + [AuthFormKey | - +ConsentItem toConsentItem(); - +ConsentItemFormData copy() + +index: int; + <static>+values: List<AuthFormKey>; + <static>+login: AuthFormKey; + <static>+signup: AuthFormKey; + <static>+passwordForgot: AuthFormKey; + <static>+passwordRecovery: AuthFormKey; + <static>-_loginSubmit: AuthFormKey; + <static>-_signupSubmit: AuthFormKey ] - [<abstract>IFormData]<:-[ConsentItemFormData] + [AuthFormKey]o-[AuthFormKey] + [Enum]<:--[AuthFormKey] - [EnrollmentFormViewModel + [AppStatus | - +study: Study; - +router: GoRouter; - +consentItemDelegate: EnrollmentFormConsentItemDelegate; - +enrollmentTypeControl: FormControl<Participation>; - +consentItemArray: FormArray<dynamic>; - +consentItemFormViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData>; - +form: FormGroup; - +enrollmentTypeControlOptions: List<FormControlOption<Participation>>; - +consentItemModels: List<ConsentItemFormViewModel>; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titles: Map<FormMode, String>; - +canTestScreener: bool; - +canTestConsent: bool; - +questionTitles: Map<FormMode, String Function()> + +index: int; + <static>+values: List<AppStatus>; + <static>+initializing: AppStatus; + <static>+initialized: AppStatus + ] + + [AppStatus]o-[AppStatus] + [Enum]<:--[AppStatus] + + [FormArrayTable | - +void setControlsFrom(); - +EnrollmentFormData buildFormData(); - +void read(); - +List<ModelAction<dynamic>> availableActions(); - +List<ModelAction<dynamic>> availablePopupActions(); - +List<ModelAction<dynamic>> availableInlineActions(); - +void onSelectItem(); - +void onNewItem(); - +ScreenerQuestionFormRouteArgs buildNewScreenerQuestionFormRouteArgs(); - +ScreenerQuestionFormRouteArgs buildScreenerQuestionFormRouteArgs(); - +ConsentItemFormRouteArgs buildNewConsentItemFormRouteArgs(); - +ConsentItemFormRouteArgs buildConsentItemFormRouteArgs(); - +dynamic testScreener(); - +dynamic testConsent(); - +ScreenerQuestionFormViewModel provideQuestionFormViewModel() + +control: AbstractControl<dynamic>; + +items: List<T>; + +onSelectItem: void Function(T); + +getActionsAt: List<ModelAction<dynamic>> Function(T, int); + +onNewItem: void Function()?; + +rowTitle: String Function(T); + +onNewItemLabel: String; + +sectionTitle: String?; + +sectionDescription: String?; + +emptyIcon: IconData?; + +emptyTitle: String?; + +emptyDescription: String?; + +sectionTitleDivider: bool?; + +rowPrefix: Widget Function(BuildContext, T, int)?; + +rowSuffix: Widget Function(BuildContext, T, int)?; + +leadingWidget: Widget?; + +itemsSectionPadding: EdgeInsets?; + +hideLeadingTrailingWhenEmpty: bool; + <static>+columns: List<StandardTableColumn> + | + +Widget build(); + -List<Widget> _buildRow(); + -Widget _newItemButton() ] - [EnrollmentFormViewModel]o-[Study] - [EnrollmentFormViewModel]o-[GoRouter] - [EnrollmentFormViewModel]o-[EnrollmentFormConsentItemDelegate] - [EnrollmentFormViewModel]o-[FormControl] - [EnrollmentFormViewModel]o-[FormArray] - [EnrollmentFormViewModel]o-[FormViewModelCollection] - [EnrollmentFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[EnrollmentFormViewModel] - [<abstract>WithQuestionnaireControls]<:-[EnrollmentFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[EnrollmentFormViewModel] - [<abstract>IListActionProvider]<:--[EnrollmentFormViewModel] - [<abstract>IProviderArgsResolver]<:--[EnrollmentFormViewModel] + [FormArrayTable]o-[<abstract>AbstractControl] + [FormArrayTable]o-[void Function(T)] + [FormArrayTable]o-[List<ModelAction<dynamic>> Function(T, int)] + [FormArrayTable]o-[void Function()?] + [FormArrayTable]o-[String Function(T)] + [FormArrayTable]o-[IconData] + [FormArrayTable]o-[Widget Function(BuildContext, T, int)?] + [FormArrayTable]o-[<abstract>Widget] + [FormArrayTable]o-[EdgeInsets] - [EnrollmentFormConsentItemDelegate - | - +formViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData>; - +owner: EnrollmentFormViewModel; - +propagateOnSave: bool; - +validationSet: dynamic + [<abstract>ManagedFormViewModel | - +void onCancel(); - +dynamic onSave(); - +ConsentItemFormViewModel provide(); - +List<ModelAction<dynamic>> availableActions(); - +void onNewItem(); - +void onSelectItem() + +ManagedFormViewModel<T> createDuplicate() ] - [EnrollmentFormConsentItemDelegate]o-[FormViewModelCollection] - [EnrollmentFormConsentItemDelegate]o-[EnrollmentFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[EnrollmentFormConsentItemDelegate] - [<abstract>IListActionProvider]<:--[EnrollmentFormConsentItemDelegate] - [<abstract>IProviderArgsResolver]<:--[EnrollmentFormConsentItemDelegate] + [<abstract>FormViewModel]<:-[<abstract>ManagedFormViewModel] - [ConsentItemFormViewModel - | - +consentIdControl: FormControl<String>; - +titleControl: FormControl<String>; - +descriptionControl: FormControl<String>; - +iconControl: FormControl<IconOption>; - +form: FormGroup; - +consentId: String; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titleRequired: dynamic; - +descriptionRequired: dynamic; - +titles: Map<FormMode, String> - | - +void setControlsFrom(); - +ConsentItemFormData buildFormData(); - +ConsentItemFormViewModel createDuplicate() + [FormViewModelNotFoundException ] - [ConsentItemFormViewModel]o-[FormControl] - [ConsentItemFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[ConsentItemFormViewModel] + [Exception]<:--[FormViewModelNotFoundException] - [ConsentItemFormView + [FormViewModelCollection | - +formViewModel: ConsentItemFormViewModel + +formViewModels: List<T>; + +formArray: FormArray<dynamic>; + +stagedViewModels: List<T>; + +retrievableViewModels: List<T>; + +formData: List<D> + | + +void add(); + +T remove(); + +T? findWhere(); + +T? removeWhere(); + +bool contains(); + +void stage(); + +T commit(); + +void reset(); + +void read() ] - [ConsentItemFormView]o-[ConsentItemFormViewModel] + [FormViewModelCollection]o-[FormArray] - [EnrollmentFormData + [CustomFormControl | - <static>+kDefaultEnrollmentType: Participation; - +enrollmentType: Participation; - +questionnaireFormData: QuestionnaireFormData; - +consentItemsFormData: List<ConsentItemFormData>?; - +id: String + -_onValueChangedDebouncer: Debouncer?; + -_onStatusChangedDebouncer: Debouncer?; + +onValueChanged: void Function(T?)?; + +onStatusChanged: void Function(ControlStatus)?; + +onStatusChangedDebounceTime: int?; + +onValueChangedDebounceTime: int? | - +Study apply(); - +EnrollmentFormData copy() + +void dispose() ] - [EnrollmentFormData]o-[Participation] - [EnrollmentFormData]o-[QuestionnaireFormData] - [<abstract>IStudyFormData]<:--[EnrollmentFormData] + [CustomFormControl]o-[Debouncer] + [CustomFormControl]o-[void Function(T?)?] + [CustomFormControl]o-[void Function(ControlStatus)?] + [FormControl]<:-[CustomFormControl] - [StudyDesignInterventionsFormView + [UnsavedChangesDialog | +Widget build() ] - [<abstract>StudyDesignPageWidget]<:-[StudyDesignInterventionsFormView] - - [InterventionsFormViewModel - | - +study: Study; - +router: GoRouter; - +interventionsArray: FormArray<dynamic>; - +interventionsCollection: FormViewModelCollection<InterventionFormViewModel, InterventionFormData>; - +form: FormGroup; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +interventionsRequired: dynamic; - +titles: Map<FormMode, String>; - +canTestStudySchedule: bool - | - +void setControlsFrom(); - +InterventionsFormData buildFormData(); - +void read(); - +List<ModelAction<dynamic>> availableActions(); - +List<ModelAction<dynamic>> availablePopupActions(); - +List<ModelAction<dynamic>> availableInlineActions(); - +void onSelectItem(); - +void onNewItem(); - +InterventionFormViewModel provide(); - +void onCancel(); - +dynamic onSave(); - +dynamic testStudySchedule() + [<abstract>FormValidationSetEnum ] - [InterventionsFormViewModel]o-[Study] - [InterventionsFormViewModel]o-[GoRouter] - [InterventionsFormViewModel]o-[FormArray] - [InterventionsFormViewModel]o-[FormViewModelCollection] - [InterventionsFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[InterventionsFormViewModel] - [<abstract>StudyScheduleControls]<:-[InterventionsFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[InterventionsFormViewModel] - [<abstract>IListActionProvider]<:--[InterventionsFormViewModel] - [<abstract>IProviderArgsResolver]<:--[InterventionsFormViewModel] - - [InterventionFormViewModel + [FormControlValidation | - +study: Study; - +interventionIdControl: FormControl<String>; - +interventionTitleControl: FormControl<String>; - +interventionIconControl: FormControl<IconOption>; - +interventionDescriptionControl: FormControl<String>; - +interventionTasksArray: FormArray<dynamic>; - +tasksCollection: FormViewModelCollection<InterventionTaskFormViewModel, InterventionTaskFormData>; - +form: FormGroup; - +interventionId: String; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titleRequired: dynamic; - +atLeastOneTask: dynamic; - +breadcrumbsTitle: String; - +titles: Map<FormMode, String> + +control: AbstractControl<dynamic>; + +validators: List<Validator<dynamic>>; + +asyncValidators: List<AsyncValidator<dynamic>>?; + +validationMessages: Map<String, String Function(Object)> | - +void setControlsFrom(); - +InterventionFormData buildFormData(); - +List<ModelAction<dynamic>> availableActions(); - +List<ModelAction<dynamic>> availablePopupActions(); - +List<ModelAction<dynamic>> availableInlineActions(); - +void onSelectItem(); - +void onNewItem(); - +void onCancel(); - +dynamic onSave(); - +InterventionTaskFormViewModel provide(); - +InterventionTaskFormRouteArgs buildNewFormRouteArgs(); - +InterventionTaskFormRouteArgs buildFormRouteArgs(); - +InterventionFormViewModel createDuplicate() + +FormControlValidation merge() ] - [InterventionFormViewModel]o-[Study] - [InterventionFormViewModel]o-[FormControl] - [InterventionFormViewModel]o-[FormArray] - [InterventionFormViewModel]o-[FormViewModelCollection] - [InterventionFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[InterventionFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[InterventionFormViewModel] - [<abstract>IListActionProvider]<:--[InterventionFormViewModel] - [<abstract>IProviderArgsResolver]<:--[InterventionFormViewModel] + [FormControlValidation]o-[<abstract>AbstractControl] - [InterventionTaskFormData + [<abstract>IFormData | - +taskId: String; - +taskTitle: String; - +taskDescription: String?; - <static>+kDefaultTitle: String; +id: String | - +CheckmarkTask toTask(); - +InterventionTaskFormData copy() + +IFormData copy() ] - [<abstract>IFormDataWithSchedule]<:-[InterventionTaskFormData] - - [StudyScheduleFormData - | - +sequenceType: PhaseSequence; - +sequenceTypeCustom: String; - +numCycles: int; - +phaseDuration: int; - +includeBaseline: bool; - +id: String - | - +StudySchedule toStudySchedule(); - +Study apply(); - +StudyScheduleFormData copy() + [FormInvalidException ] - [StudyScheduleFormData]o-[PhaseSequence] - [<abstract>IStudyFormData]<:--[StudyScheduleFormData] + [Exception]<:--[FormInvalidException] - [InterventionPreview - | - +routeArgs: InterventionFormRouteArgs + [FormConfigException | - +Widget build() + +message: String? ] - [InterventionPreview]o-[InterventionFormRouteArgs] - [<abstract>ConsumerWidget]<:-[InterventionPreview] + [Exception]<:--[FormConfigException] - [InterventionTaskFormViewModel + [<abstract>IFormViewModelDelegate | - +taskIdControl: FormControl<String>; - +instanceIdControl: FormControl<String>; - +taskTitleControl: FormControl<String>; - +taskDescriptionControl: FormControl<String>; - +markAsCompletedControl: FormControl<bool>; - +form: FormGroup; - +taskId: String; - +instanceId: String; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titleRequired: dynamic; - +titles: Map<FormMode, String> + +dynamic onSave(); + +void onCancel() + ] + + [<abstract>IFormGroupController | - +void setControlsFrom(); - +InterventionTaskFormData buildFormData(); - +InterventionTaskFormViewModel createDuplicate() + +form: FormGroup ] - [InterventionTaskFormViewModel]o-[FormControl] - [InterventionTaskFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[InterventionTaskFormViewModel] - [<abstract>WithScheduleControls]<:-[InterventionTaskFormViewModel] + [<abstract>IFormGroupController]o-[FormGroup] - [InterventionsFormData + [FormControlOption | - +interventionsData: List<InterventionFormData>; - +studyScheduleData: StudyScheduleFormData; - +id: String + +value: T; + +label: String; + +description: String?; + +props: List<Object?> + ] + + [<abstract>Equatable]<:-[FormControlOption] + + [<abstract>FormViewModel | - +Study apply(); - +InterventionsFormData copy() + -_formData: T?; + -_formMode: FormMode; + -_validationSet: FormValidationSetEnum?; + +delegate: IFormViewModelDelegate<FormViewModel<dynamic>>?; + +autosave: bool; + -_immediateFormChildrenSubscriptions: List<StreamSubscription<dynamic>>; + -_immediateFormChildrenListenerDebouncer: Debouncer?; + -_autosaveOperation: CancelableOperation<dynamic>?; + -_defaultControlValidators: Map<String, Tuple<List<Validator<dynamic>>, List<AsyncValidator<dynamic>>>>; + +prevFormValue: Map<String, dynamic>?; + <static>-_formKey: String; + +formData: T?; + +formMode: FormMode; + +isReadonly: bool; + +validationSet: FormValidationSetEnum?; + +isDirty: bool; + +title: String; + +isValid: bool; + +titles: Map<FormMode, String>; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + | + -dynamic _setFormData(); + -dynamic _rememberDefaultControlValidators(); + -Tuple<List<Validator<dynamic>>, List<AsyncValidator<dynamic>>>? _getDefaultValidators(); + -dynamic _disableAllControls(); + -dynamic _formModeUpdated(); + -dynamic _restoreControlsFromFormData(); + +void revalidate(); + -void _applyValidationSet(); + +void read(); + +dynamic save(); + +dynamic cancel(); + +void enableAutosave(); + +void listenToImmediateFormChildren(); + +dynamic markFormGroupChanged(); + +void dispose(); + +void setControlsFrom(); + +T buildFormData(); + +void initControls() ] - [InterventionsFormData]o-[StudyScheduleFormData] - [<abstract>IStudyFormData]<:--[InterventionsFormData] + [<abstract>FormViewModel]o-[FormMode] + [<abstract>FormViewModel]o-[<abstract>FormValidationSetEnum] + [<abstract>FormViewModel]o-[<abstract>IFormViewModelDelegate] + [<abstract>FormViewModel]o-[Debouncer] + [<abstract>FormViewModel]o-[CancelableOperation] + [<abstract>IFormGroupController]<:--[<abstract>FormViewModel] - [InterventionFormView + [FormMode | - +formViewModel: InterventionFormViewModel + +index: int; + <static>+values: List<FormMode>; + <static>+create: FormMode; + <static>+readonly: FormMode; + <static>+edit: FormMode ] - [InterventionFormView]o-[InterventionFormViewModel] + [FormMode]o-[FormMode] + [Enum]<:--[FormMode] - [<abstract>StudyScheduleControls + [EnrolledBadge | - <static>+defaultScheduleType: PhaseSequence; - <static>+defaultScheduleTypeSequence: String; - <static>+defaultNumCycles: int; - <static>+defaultPeriodLength: int; - +sequenceTypeControl: FormControl<PhaseSequence>; - +sequenceTypeCustomControl: FormControl<String>; - +phaseDurationControl: FormControl<int>; - +numCyclesControl: FormControl<int>; - +includeBaselineControl: FormControl<bool>; - +studyScheduleControls: Map<String, FormControl<Object>>; - <static>+kNumCyclesMin: int; - <static>+kNumCyclesMax: int; - <static>+kPhaseDurationMin: int; - <static>+kPhaseDurationMax: int; - +sequenceTypeControlOptions: List<FormControlOption<PhaseSequence>>; - +studyScheduleValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +numCyclesRange: dynamic; - +phaseDurationRange: dynamic; - +customSequenceRequired: dynamic + +enrolledCount: int | - +void setStudyScheduleControlsFrom(); - +StudyScheduleFormData buildStudyScheduleFormData(); - +bool isSequencingCustom() + +Widget build() ] - [<abstract>StudyScheduleControls]o-[PhaseSequence] - [<abstract>StudyScheduleControls]o-[FormControl] - - [InterventionTaskFormView + [StudyRecruitController | - +formViewModel: InterventionTaskFormViewModel + +inviteCodeRepository: IInviteCodeRepository; + -_invitesSubscription: StreamSubscription<List<WrappedModel<StudyInvite>>>? + | + -dynamic _subscribeInvites(); + +Intervention? getIntervention(); + +int getParticipantCountForInvite(); + +List<ModelAction<dynamic>> availableActions(); + +List<ModelAction<dynamic>> availableInlineActions(); + +void dispose() ] - [InterventionTaskFormView]o-[InterventionTaskFormViewModel] + [StudyRecruitController]o-[<abstract>IInviteCodeRepository] + [StudyRecruitController]o-[StreamSubscription] + [StudyBaseController]<:-[StudyRecruitController] + [<abstract>IModelActionProvider]<:--[StudyRecruitController] - [InterventionFormData - | - +interventionId: String; - +title: String; - +description: String?; - +tasksData: List<InterventionTaskFormData>?; - +iconName: String?; - <static>+kDefaultTitle: String; - +id: String + [StudyRecruitScreen | - +Intervention toIntervention(); - +InterventionFormData copy() + +Widget build(); + -Widget _inviteCodesSectionHeader(); + -Widget _newInviteCodeButton(); + -dynamic _onSelectInvite() ] - [<abstract>IFormData]<:-[InterventionFormData] + [<abstract>StudyPageWidget]<:-[StudyRecruitScreen] - [StudyScheduleFormView + [InviteCodeFormView | - +formViewModel: StudyScheduleControls + +formViewModel: InviteCodeFormViewModel | - -FormTableRow _renderCustomSequence(); - +Widget build() + +Widget build(); + -List<FormTableRow> _conditionalInterventionRows() ] - [StudyScheduleFormView]o-[<abstract>StudyScheduleControls] - [<abstract>FormConsumerWidget]<:-[StudyScheduleFormView] + [InviteCodeFormView]o-[InviteCodeFormViewModel] + [<abstract>FormConsumerWidget]<:-[InviteCodeFormView] - [<abstract>IStudyFormData + [StudyInvitesTable | - +Study apply() + +invites: List<StudyInvite>; + +onSelect: void Function(StudyInvite); + +getActions: List<ModelAction<dynamic>> Function(StudyInvite); + +getInlineActions: List<ModelAction<dynamic>> Function(StudyInvite); + +getIntervention: Intervention? Function(String); + +getParticipantCountForInvite: int Function(StudyInvite) + | + +Widget build(); + -List<Widget> _buildRow() ] - [<abstract>IFormData]<:--[<abstract>IStudyFormData] + [StudyInvitesTable]o-[void Function(StudyInvite)] + [StudyInvitesTable]o-[List<ModelAction<dynamic>> Function(StudyInvite)] + [StudyInvitesTable]o-[Intervention? Function(String)] + [StudyInvitesTable]o-[int Function(StudyInvite)] - [StudyInfoFormData + [InviteCodeFormViewModel | - +title: String; - +description: String?; - +iconName: String; - +contactInfoFormData: StudyContactInfoFormData; - +id: String + +study: Study; + +inviteCodeRepository: IInviteCodeRepository; + +codeControl: FormControl<String>; + +codeControlValidationMessages: Map<String, String Function(dynamic)>; + +isPreconfiguredScheduleControl: FormControl<bool>; + +preconfiguredScheduleTypeControl: FormControl<PhaseSequence>; + +interventionAControl: FormControl<String>; + +interventionBControl: FormControl<String>; + +form: FormGroup; + +titles: Map<FormMode, String>; + +interventionControlOptions: List<FormControlOption<String>>; + +preconfiguredScheduleTypeOptions: List<FormControlOption<PhaseSequence>>; + +isPreconfiguredSchedule: bool; + +preconfiguredSchedule: List<String>? | - +Study apply(); - +StudyInfoFormData copy() + +void initControls(); + -dynamic _uniqueInviteCode(); + +void regenerateCode(); + -String _generateCode(); + +StudyInvite buildFormData(); + +void setControlsFrom(); + +dynamic save() ] - [StudyInfoFormData]o-[StudyContactInfoFormData] - [<abstract>IStudyFormData]<:--[StudyInfoFormData] + [InviteCodeFormViewModel]o-[Study] + [InviteCodeFormViewModel]o-[<abstract>IInviteCodeRepository] + [InviteCodeFormViewModel]o-[FormControl] + [InviteCodeFormViewModel]o-[FormGroup] + [<abstract>FormViewModel]<:-[InviteCodeFormViewModel] - [StudyContactInfoFormData - | - +organization: String?; - +institutionalReviewBoard: String?; - +institutionalReviewBoardNumber: String?; - +researchers: String?; - +email: String?; - +website: String?; - +phone: String?; - +additionalInfo: String?; - +id: String + [PublishSuccessDialog | - +Study apply(); - +StudyInfoFormData copy() + +Widget build() ] - [<abstract>IStudyFormData]<:--[StudyContactInfoFormData] + [<abstract>StudyPageWidget]<:-[PublishSuccessDialog] - [StudyDesignInfoFormView + [PublishDialog | +Widget build() ] - [<abstract>StudyDesignPageWidget]<:-[StudyDesignInfoFormView] + [<abstract>StudyPageWidget]<:-[PublishDialog] - [StudyInfoFormViewModel + [PublishConfirmationDialog | - +study: Study; - +titleControl: FormControl<String>; - +iconControl: FormControl<IconOption>; - +descriptionControl: FormControl<String>; - +organizationControl: FormControl<String>; - +reviewBoardControl: FormControl<String>; - +reviewBoardNumberControl: FormControl<String>; - +researchersControl: FormControl<String>; - +emailControl: FormControl<String>; - +websiteControl: FormControl<String>; - +phoneControl: FormControl<String>; - +additionalInfoControl: FormControl<String>; - +form: FormGroup; - +titles: Map<FormMode, String>; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titleRequired: dynamic; - +descriptionRequired: dynamic; - +iconRequired: dynamic; - +organizationRequired: dynamic; - +reviewBoardRequired: dynamic; - +reviewBoardNumberRequired: dynamic; - +researchersRequired: dynamic; - +emailRequired: dynamic; - +phoneRequired: dynamic; - +emailFormat: dynamic; - +websiteFormat: dynamic - | - +void setControlsFrom(); - +StudyInfoFormData buildFormData() + +Widget build() ] - [StudyInfoFormViewModel]o-[Study] - [StudyInfoFormViewModel]o-[FormControl] - [StudyInfoFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[StudyInfoFormViewModel] + [<abstract>StudyPageWidget]<:-[PublishConfirmationDialog] - [MeasurementSurveyFormData + [FrameControlsWidget | - +measurementId: String; - +title: String; - +introText: String?; - +outroText: String?; - +questionnaireFormData: QuestionnaireFormData; - <static>+kDefaultTitle: String; - +id: String + +onRefresh: void Function()?; + +onOpenNewTab: void Function()?; + +enabled: bool | - +QuestionnaireTask toQuestionnaireTask(); - +MeasurementSurveyFormData copy() + +Widget build() ] - [MeasurementSurveyFormData]o-[QuestionnaireFormData] - [<abstract>IFormDataWithSchedule]<:-[MeasurementSurveyFormData] + [FrameControlsWidget]o-[void Function()?] + [<abstract>ConsumerWidget]<:-[FrameControlsWidget] - [MeasurementSurveyFormView + [<abstract>IStudyStatusBadgeViewModel | - +formViewModel: MeasurementSurveyFormViewModel + +studyParticipation: Participation?; + +studyStatus: StudyStatus? ] - [MeasurementSurveyFormView]o-[MeasurementSurveyFormViewModel] + [<abstract>IStudyStatusBadgeViewModel]o-[Participation] + [<abstract>IStudyStatusBadgeViewModel]o-[StudyStatus] - [MeasurementSurveyFormViewModel + [StudyStatusBadge | - +study: Study; - +measurementIdControl: FormControl<String>; - +instanceIdControl: FormControl<String>; - +surveyTitleControl: FormControl<String>; - +surveyIntroTextControl: FormControl<String>; - +surveyOutroTextControl: FormControl<String>; - +form: FormGroup; - +measurementId: String; - +instanceId: String; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titleRequired: dynamic; - +atLeastOneQuestion: dynamic; - +breadcrumbsTitle: String; - +titles: Map<FormMode, String> + +participation: Participation?; + +status: StudyStatus?; + +type: BadgeType; + +showPrefixIcon: bool; + +showTooltip: bool | - +void setControlsFrom(); - +MeasurementSurveyFormData buildFormData(); - +List<ModelAction<dynamic>> availableActions(); - +List<ModelAction<dynamic>> availablePopupActions(); - +List<ModelAction<dynamic>> availableInlineActions(); - +void onSelectItem(); - +void onNewItem(); - +SurveyQuestionFormRouteArgs buildNewFormRouteArgs(); - +SurveyQuestionFormRouteArgs buildFormRouteArgs(); - +MeasurementSurveyFormViewModel createDuplicate() + +Widget build() ] - [MeasurementSurveyFormViewModel]o-[Study] - [MeasurementSurveyFormViewModel]o-[FormControl] - [MeasurementSurveyFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[MeasurementSurveyFormViewModel] - [<abstract>WithQuestionnaireControls]<:-[MeasurementSurveyFormViewModel] - [<abstract>WithScheduleControls]<:-[MeasurementSurveyFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[MeasurementSurveyFormViewModel] - [<abstract>IListActionProvider]<:--[MeasurementSurveyFormViewModel] - [<abstract>IProviderArgsResolver]<:--[MeasurementSurveyFormViewModel] + [StudyStatusBadge]o-[Participation] + [StudyStatusBadge]o-[StudyStatus] + [StudyStatusBadge]o-[BadgeType] - [SurveyPreview + [RouteInformation | - +routeArgs: MeasurementFormRouteArgs + +route: String?; + +extra: String?; + +cmd: String?; + +data: String? | - +Widget build() + +String toString() ] - [SurveyPreview]o-[MeasurementFormRouteArgs] - [<abstract>ConsumerWidget]<:-[SurveyPreview] - - [StudyDesignMeasurementsFormView + [<abstract>PlatformController | - +Widget build() + +studyId: String; + +baseSrc: String; + +previewSrc: String; + +routeInformation: RouteInformation; + +frameWidget: Widget + | + +void activate(); + +void registerViews(); + +void generateUrl(); + +void navigate(); + +void refresh(); + +void listen(); + +void send(); + +void openNewPage() ] - [<abstract>StudyDesignPageWidget]<:-[StudyDesignMeasurementsFormView] + [<abstract>PlatformController]o-[RouteInformation] + [<abstract>PlatformController]o-[<abstract>Widget] - [MeasurementsFormData + [WebController | - +surveyMeasurements: List<MeasurementSurveyFormData>; - +id: String + +iFrameElement: IFrameElement | - +Study apply(); - +MeasurementsFormData copy() + +void activate(); + +void registerViews(); + +void generateUrl(); + +void navigate(); + +void refresh(); + +void openNewPage(); + +void listen(); + +void send() ] - [<abstract>IStudyFormData]<:--[MeasurementsFormData] + [WebController]o-[IFrameElement] + [<abstract>PlatformController]<:-[WebController] - [MeasurementsFormViewModel - | - +study: Study; - +router: GoRouter; - +measurementsArray: FormArray<dynamic>; - +surveyMeasurementFormViewModels: FormViewModelCollection<MeasurementSurveyFormViewModel, MeasurementSurveyFormData>; - +form: FormGroup; - +measurementViewModels: List<MeasurementSurveyFormViewModel>; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +measurementRequired: dynamic; - +titles: Map<FormMode, String> + [MobileController | - +void read(); - +void setControlsFrom(); - +MeasurementsFormData buildFormData(); - +List<ModelAction<dynamic>> availableActions(); - +List<ModelAction<dynamic>> availablePopupActions(); - +List<ModelAction<dynamic>> availableInlineActions(); - +void onSelectItem(); - +void onNewItem(); - +MeasurementSurveyFormViewModel provide(); - +void onCancel(); - +dynamic onSave() + +void openNewPage(); + +void refresh(); + +void registerViews(); + +void listen(); + +void send(); + +void navigate(); + +void activate(); + +void generateUrl() ] - [MeasurementsFormViewModel]o-[Study] - [MeasurementsFormViewModel]o-[GoRouter] - [MeasurementsFormViewModel]o-[FormArray] - [MeasurementsFormViewModel]o-[FormViewModelCollection] - [MeasurementsFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[MeasurementsFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[MeasurementsFormViewModel] - [<abstract>IListActionProvider]<:--[MeasurementsFormViewModel] - [<abstract>IProviderArgsResolver]<:--[MeasurementsFormViewModel] + [<abstract>PlatformController]<:-[MobileController] - [StudyFormValidationSet + [StudyController | - +index: int; - <static>+values: List<StudyFormValidationSet> + +notificationService: INotificationService; + +studyEventsSubscription: StreamSubscription<ModelEvent<Study>>?; + +studyActions: List<ModelAction<dynamic>> + | + +dynamic syncStudyStatus(); + +dynamic onStudySubscriptionUpdate(); + -dynamic _redirectNewToActualStudyID(); + +dynamic publishStudy(); + +void onChangeStudyParticipation(); + +void onAddParticipants(); + +void onSettingsPressed(); + +void dispose() ] - [Enum]<:--[StudyFormValidationSet] + [StudyController]o-[<abstract>INotificationService] + [StudyController]o-[StreamSubscription] + [StudyBaseController]<:-[StudyController] - [ReportsFormViewModel - | - +study: Study; - +router: GoRouter; - +reportItemDelegate: ReportFormItemDelegate; - +reportItemArray: FormArray<dynamic>; - +reportItemFormViewModels: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData>; - +form: FormGroup; - +reportItemModels: List<ReportItemFormViewModel>; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titles: Map<FormMode, String>; - +canTestConsent: bool + [<abstract>IStudyNavViewModel | - +void setControlsFrom(); - +ReportsFormData buildFormData(); - +void read(); - +ReportItemFormRouteArgs buildNewReportItemFormRouteArgs(); - +ReportItemFormRouteArgs buildReportItemFormRouteArgs(); - +dynamic testReport(); - +void onCancel(); - +dynamic onSave(); - +ReportItemFormViewModel provide() + +isEditTabEnabled: bool; + +isTestTabEnabled: bool; + +isRecruitTabEnabled: bool; + +isMonitorTabEnabled: bool; + +isAnalyzeTabEnabled: bool; + +isSettingsEnabled: bool ] - [ReportsFormViewModel]o-[Study] - [ReportsFormViewModel]o-[GoRouter] - [ReportsFormViewModel]o-[ReportFormItemDelegate] - [ReportsFormViewModel]o-[FormArray] - [ReportsFormViewModel]o-[FormViewModelCollection] - [ReportsFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[ReportsFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[ReportsFormViewModel] - [<abstract>IProviderArgsResolver]<:--[ReportsFormViewModel] - - [ReportFormItemDelegate + [StudyNav | - +formViewModelCollection: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData>; - +owner: ReportsFormViewModel; - +propagateOnSave: bool; - +validationSet: dynamic - | - +void onCancel(); - +dynamic onSave(); - +ReportItemFormViewModel provide(); - +List<ModelAction<dynamic>> availableActions(); - +void onNewItem(); - +void onSelectItem() + <static>+dynamic tabs(); + <static>+dynamic edit(); + <static>+dynamic test(); + <static>+dynamic recruit(); + <static>+dynamic monitor(); + <static>+dynamic analyze() ] - [ReportFormItemDelegate]o-[FormViewModelCollection] - [ReportFormItemDelegate]o-[ReportsFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[ReportFormItemDelegate] - [<abstract>IListActionProvider]<:--[ReportFormItemDelegate] - [<abstract>IProviderArgsResolver]<:--[ReportFormItemDelegate] - - [ReportItemFormData - | - +isPrimary: bool; - +section: ReportSection; - +id: String + [StudyDesignNav | - <static>+dynamic fromDomainModel(); - +ReportItemFormData copy() + <static>+dynamic tabs(); + <static>+dynamic info(); + <static>+dynamic enrollment(); + <static>+dynamic interventions(); + <static>+dynamic measurements(); + <static>+dynamic reports() ] - [ReportItemFormData]o-[<abstract>ReportSection] - [<abstract>IFormData]<:-[ReportItemFormData] - - [ReportItemFormView + [<abstract>StudyPageWidget | - +formViewModel: ReportItemFormViewModel; - +studyId: String; - +reportSectionColumnWidth: dynamic; - +sectionTypeBodyBuilder: Widget Function(BuildContext) + +studyId: String | - +Widget build(); - -dynamic _buildSectionText(); - -dynamic _buildSectionTypeHeader() + +Widget? banner() ] - [ReportItemFormView]o-[ReportItemFormViewModel] - [ReportItemFormView]o-[Widget Function(BuildContext)] + [<abstract>ConsumerWidget]<:-[<abstract>StudyPageWidget] + [<abstract>IWithBanner]<:--[<abstract>StudyPageWidget] - [ReportItemFormViewModel + [StudyParticipationBadge | - <static>+defaultSectionType: ReportSectionType; - +sectionIdControl: FormControl<String>; - +sectionTypeControl: FormControl<ReportSectionType>; - +titleControl: FormControl<String>; - +descriptionControl: FormControl<String>; - +sectionControl: FormControl<ReportSection>; - +dataReferenceControl: FormControl<DataReferenceIdentifier<num>>; - +temporalAggregationControl: FormControl<TemporalAggregationFormatted>; - +improvementDirectionControl: FormControl<ImprovementDirectionFormatted>; - +alphaControl: FormControl<double>; - -_controlsBySectionType: Map<ReportSectionType, FormGroup>; - -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - -_validationConfigsBySectionType: Map<ReportSectionType, Map<FormValidationSetEnum, List<FormControlValidation>>>; - +sectionBaseControls: Map<String, AbstractControl<dynamic>>; - +form: FormGroup; - +sectionId: String; - +sectionType: ReportSectionType; - <static>+sectionTypeControlOptions: List<FormControlOption<ReportSectionType>>; - <static>+temporalAggregationControlOptions: List<FormControlOption<TemporalAggregationFormatted>>; - <static>+improvementDirectionControlOptions: List<FormControlOption<ImprovementDirectionFormatted>>; - +titles: Map<FormMode, String>; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titleRequired: dynamic; - +descriptionRequired: dynamic; - +dataReferenceRequired: dynamic; - +aggregationRequired: dynamic; - +improvementDirectionRequired: dynamic; - +alphaConfidenceRequired: dynamic + +participation: Participation; + +type: BadgeType; + +showPrefixIcon: bool; + +center: bool | - -List<FormControlValidation> _getValidationConfig(); - +ReportItemFormData buildFormData(); - +ReportItemFormViewModel createDuplicate(); - +dynamic onSectionTypeChanged(); - -void _updateFormControls(); - +void setControlsFrom() + +Widget build() ] - [ReportItemFormViewModel]o-[ReportSectionType] - [ReportItemFormViewModel]o-[FormControl] - [ReportItemFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[ReportItemFormViewModel] + [StudyParticipationBadge]o-[Participation] + [StudyParticipationBadge]o-[BadgeType] - [TemporalAggregationFormatted + [StudyBaseController | - -_value: TemporalAggregation; - <static>+values: List<TemporalAggregationFormatted>; - +value: TemporalAggregation; - +string: String; - +icon: IconData?; - +hashCode: int + +studyId: String; + +studyRepository: IStudyRepository; + +router: GoRouter; + +studySubscription: StreamSubscription<WrappedModel<Study>>? | - +bool ==(); - +String toString(); - +String toJson(); - <static>+TemporalAggregationFormatted fromJson() + +dynamic subscribeStudy(); + +dynamic onStudySubscriptionUpdate(); + +dynamic onStudySubscriptionError(); + +void dispose() ] - [TemporalAggregationFormatted]o-[TemporalAggregation] - [TemporalAggregationFormatted]o-[IconData] + [StudyBaseController]o-[<abstract>IStudyRepository] + [StudyBaseController]o-[GoRouter] + [StudyBaseController]o-[StreamSubscription] - [ImprovementDirectionFormatted - | - -_value: ImprovementDirection; - <static>+values: List<ImprovementDirectionFormatted>; - +value: ImprovementDirection; - +string: String; - +icon: IconData?; - +hashCode: int + [PreviewFrame | - +bool ==(); - +String toString(); - +String toJson(); - <static>+ImprovementDirectionFormatted fromJson() + +studyId: String; + +routeArgs: StudyFormRouteArgs?; + +route: String? ] - [ImprovementDirectionFormatted]o-[ImprovementDirection] - [ImprovementDirectionFormatted]o-[IconData] + [PreviewFrame]o-[<abstract>StudyFormRouteArgs] - [ReportSectionType + [<abstract>IStudyAppBarViewModel | - +index: int; - <static>+values: List<ReportSectionType>; - <static>+average: ReportSectionType; - <static>+linearRegression: ReportSectionType + +isSyncIndicatorVisible: bool; + +isStatusBadgeVisible: bool; + +isPublishVisible: bool ] - [ReportSectionType]o-[ReportSectionType] - [Enum]<:--[ReportSectionType] + [<abstract>IStudyStatusBadgeViewModel]<:--[<abstract>IStudyAppBarViewModel] + [<abstract>IStudyNavViewModel]<:--[<abstract>IStudyAppBarViewModel] - [AverageSectionFormView + [StudyScaffold | - +formViewModel: ReportItemFormViewModel; +studyId: String; - +reportSectionColumnWidth: Map<int, TableColumnWidth> - | - +Widget build() + +tabs: List<NavbarTab>?; + +tabsSubnav: List<NavbarTab>?; + +selectedTab: NavbarTab?; + +selectedTabSubnav: NavbarTab?; + +body: StudyPageWidget; + +drawer: Widget?; + +disableActions: bool; + +actionsSpacing: double; + +actionsPadding: double; + +layoutType: SingleColumnLayoutType?; + +appbarHeight: double; + +appbarSubnavHeight: double ] - [AverageSectionFormView]o-[ReportItemFormViewModel] - [<abstract>ConsumerWidget]<:-[AverageSectionFormView] + [StudyScaffold]o-[NavbarTab] + [StudyScaffold]o-[<abstract>StudyPageWidget] + [StudyScaffold]o-[<abstract>Widget] + [StudyScaffold]o-[SingleColumnLayoutType] - [LinearRegressionSectionFormView + [WebFrame | - +formViewModel: ReportItemFormViewModel; - +studyId: String; - +reportSectionColumnWidth: Map<int, TableColumnWidth> + +previewSrc: String; + +studyId: String | +Widget build() ] - [LinearRegressionSectionFormView]o-[ReportItemFormViewModel] - [<abstract>ConsumerWidget]<:-[LinearRegressionSectionFormView] - - [DataReferenceIdentifier - | - +hashCode: int + [DisabledFrame | - +bool ==() + +Widget build() ] - [DataReference]<:-[DataReferenceIdentifier] - - [DataReferenceEditor + [PhoneContainer | - +formControl: FormControl<DataReferenceIdentifier<T>>; - +availableTasks: List<Task>; - +buildReactiveDropdownField: ReactiveDropdownField<dynamic> + <static>+defaultWidth: double; + <static>+defaultHeight: double; + +width: double; + +height: double; + +borderColor: Color; + +borderWidth: double; + +borderRadius: double; + +innerContent: Widget; + +innerContentBackgroundColor: Color? | - +FormTableRow buildFormTableRow(); - -List<DropdownMenuItem<DataReferenceIdentifier<dynamic>>> _dataReferenceItems() + +Widget build() ] - [DataReferenceEditor]o-[FormControl] - [DataReferenceEditor]o-[ReactiveDropdownField] + [PhoneContainer]o-[Color] + [PhoneContainer]o-[<abstract>Widget] - [ReportsFormData - | - +reportItems: List<ReportItemFormData>; - +id: String + [MobileFrame | - +Study apply(); - +ReportsFormData copy() + +Widget build() ] - [<abstract>IStudyFormData]<:--[ReportsFormData] - - [ReportStatus + [DesktopFrame | - +index: int; - <static>+values: List<ReportStatus>; - <static>+primary: ReportStatus; - <static>+secondary: ReportStatus + +Widget build() ] - [ReportStatus]o-[ReportStatus] - [Enum]<:--[ReportStatus] - - [ReportBadge + [StudyTestScreen | - +status: ReportStatus?; - +type: BadgeType; - +showPrefixIcon: bool; - +showTooltip: bool + +previewRoute: String? | - +Widget build() + +Widget build(); + +Widget? banner(); + +dynamic load(); + +dynamic save(); + +dynamic showHelp() ] - [ReportBadge]o-[ReportStatus] - [ReportBadge]o-[BadgeType] + [<abstract>StudyPageWidget]<:-[StudyTestScreen] - [StudyDesignReportsFormView + [StudySettingsFormViewModel | - +Widget build(); - -dynamic _showReportItemSidesheetWithArgs() + +study: AsyncValue<Study>; + +studyRepository: IStudyRepository; + <static>+defaultPublishedToRegistry: bool; + <static>+defaultPublishedToRegistryResults: bool; + +isPublishedToRegistryControl: FormControl<bool>; + +isPublishedToRegistryResultsControl: FormControl<bool>; + +form: FormGroup; + +titles: Map<FormMode, String> + | + +void setControlsFrom(); + +Study buildFormData(); + +dynamic keepControlsSynced(); + +dynamic save(); + +dynamic setLaunchDefaults() ] - [<abstract>StudyDesignPageWidget]<:-[StudyDesignReportsFormView] + [StudySettingsFormViewModel]o-[<abstract>AsyncValue] + [StudySettingsFormViewModel]o-[<abstract>IStudyRepository] + [StudySettingsFormViewModel]o-[FormControl] + [StudySettingsFormViewModel]o-[FormGroup] + [<abstract>FormViewModel]<:-[StudySettingsFormViewModel] - [StudyFormScaffold + [StudySettingsDialog | - +studyId: String; - +formViewModelBuilder: T Function(WidgetRef); - +formViewBuilder: Widget Function(T) + +Widget build() + ] + + [<abstract>StudyPageWidget]<:-[StudySettingsDialog] + + [StudyTestController | + +authRepository: IAuthRepository; + +languageCode: String + ] + + [StudyTestController]o-[<abstract>IAuthRepository] + [StudyBaseController]<:-[StudyTestController] + + [TestAppRoutes + | + <static>+studyOverview: String; + <static>+eligibility: String; + <static>+intervention: String; + <static>+consent: String; + <static>+journey: String; + <static>+dashboard: String + ] + + [DrawerEntry + | + +localizedTitle: String Function(); + +icon: IconData?; + +localizedHelpText: String Function()?; + +enabled: bool; + +onSelected: void Function(BuildContext, WidgetRef)?; + +autoCloseDrawer: bool; + +title: String; + +helpText: String? + | + +void onClick() + ] + + [DrawerEntry]o-[String Function()] + [DrawerEntry]o-[IconData] + [DrawerEntry]o-[String Function()?] + [DrawerEntry]o-[void Function(BuildContext, WidgetRef)?] + + [GoRouterDrawerEntry + | + +intent: RoutingIntent; + +onNavigated: void Function()? + | + +void onClick() + ] + + [GoRouterDrawerEntry]o-[RoutingIntent] + [GoRouterDrawerEntry]o-[void Function()?] + [DrawerEntry]<:-[GoRouterDrawerEntry] + + [AppDrawer + | + +width: int; + +autoCloseDrawer: bool; + +leftPaddingEntries: double; + +logoPaddingVertical: double; + +logoPaddingHorizontal: double; + +logoMaxHeight: double; + +logoSectionMinHeight: double; + +logoSectionMaxHeight: double + ] + + [StudyAnalyzeScreen + | + +Widget? banner(); +Widget build() ] - [StudyFormScaffold]o-[T Function(WidgetRef)] - [StudyFormScaffold]o-[Widget Function(T)] - [<abstract>ConsumerWidget]<:-[StudyFormScaffold] + [<abstract>StudyPageWidget]<:-[StudyAnalyzeScreen] - [SurveyQuestionFormView + [StudyAnalyzeController | - +formViewModel: QuestionFormViewModel; - +isHtmlStyleable: bool + +dynamic onExport() ] - [SurveyQuestionFormView]o-[QuestionFormViewModel] + [StudyBaseController]<:-[StudyAnalyzeController] - [QuestionFormViewModel + [StudyDesignInterventionsFormView | - <static>+defaultQuestionType: SurveyQuestionType; - -_titles: Map<FormMode, String Function()>?; - +questionIdControl: FormControl<String>; - +questionTypeControl: FormControl<SurveyQuestionType>; - +questionTextControl: FormControl<String>; - +questionInfoTextControl: FormControl<String>; - +questionBaseControls: Map<String, AbstractControl<dynamic>>; - +isMultipleChoiceControl: FormControl<bool>; - +choiceResponseOptionsArray: FormArray<dynamic>; - +customOptionsMin: int; - +customOptionsMax: int; - +customOptionsInitial: int; - +boolResponseOptionsArray: FormArray<String>; - +imageResponseOptionsArray: FormArray<String>; - <static>+kDefaultMaxRecordingDurationSeconds: int; - <static>+kMaxRecordingDurationSeconds: int; - +audioResponseOptionsArray: FormArray<String>; - +maxRecordingDurationSecondsControl: FormControl<int>; - <static>+kDefaultScaleMinValue: int; - <static>+kDefaultScaleMaxValue: int; - <static>+kNumMidValueControls: int; - <static>+kMidValueDebounceMilliseconds: int; - +scaleMinValueControl: FormControl<int>; - +scaleMaxValueControl: FormControl<int>; - -_scaleRangeControl: FormControl<int>; - +scaleMinLabelControl: FormControl<String>; - +scaleMaxLabelControl: FormControl<String>; - +scaleMidValueControls: FormArray<int>; - +scaleMidLabelControls: FormArray<String?>; - -_scaleResponseOptionsArray: FormArray<int>; - +scaleMinColorControl: FormControl<SerializableColor>; - +scaleMaxColorControl: FormControl<SerializableColor>; - +prevMidValues: List<int?>?; - +freeTextTypeControl: FormControl<FreeTextQuestionType>; - +customRegexControl: FormControl<String>; - +freeTextResponseOptionsArray: FormArray<dynamic>; - +freeTextLengthMin: AbstractControl<int>; - +freeTextLengthMax: AbstractControl<int>; - +freeTextExampleTextControl: FormControl<String>; - <static>+kDefaultFreeTextMinLength: int; - <static>+kDefaultFreeTextMaxLength: int; - +freeTextLengthControl: FormControl<RangeValues>; - -_controlsByQuestionType: Map<SurveyQuestionType, FormGroup>; - -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - -_validationConfigsByQuestionType: Map<SurveyQuestionType, Map<FormValidationSetEnum, List<FormControlValidation>>>; - +form: FormGroup; - +questionId: String; - +questionType: SurveyQuestionType; - +questionTypeControlOptions: List<FormControlOption<SurveyQuestionType>>; - +answerOptionsArray: FormArray<dynamic>; - +answerOptionsControls: List<AbstractControl<dynamic>>; - +validAnswerOptions: List<String>; - +boolOptions: List<AbstractControl<String>>; - +imageOptions: List<AbstractControl<String>>; - +audioOptions: List<AbstractControl<String>>; - +scaleMinValue: int; - +scaleMaxValue: int; - +scaleRange: int; - +scaleAllValueControls: List<AbstractControl<int>>; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +questionTextRequired: dynamic; - +numValidChoiceOptions: dynamic; - +scaleRangeValid: dynamic; - +maxRecordingDurationValid: dynamic; - +titles: Map<FormMode, String>; - +isAddOptionButtonVisible: bool; - +isMidValuesClearedInfoVisible: bool + +Widget build() + ] + + [<abstract>StudyDesignPageWidget]<:-[StudyDesignInterventionsFormView] + + [InterventionFormView | - +String? scaleMidLabelAt(); - -dynamic _onScaleRangeChanged(); - -dynamic _applyInputFormatters(); - -dynamic _updateScaleMidValueControls(); - -Map<String, dynamic>? _validateFreeText(); - -dynamic _onFreeTextLengthChanged(); - -List<FormControlValidation> _getValidationConfig(); - +dynamic onQuestionTypeChanged(); - +dynamic onResponseOptionsChanged(); - -void _updateFormControls(); - +void initControls(); - +void setControlsFrom(); - +QuestionFormData buildFormData(); - +List<ModelAction<dynamic>> availableActions(); - +void onNewItem(); - +void onSelectItem(); - +dynamic save(); - +QuestionFormViewModel createDuplicate() + +formViewModel: InterventionFormViewModel ] - [QuestionFormViewModel]o-[SurveyQuestionType] - [QuestionFormViewModel]o-[FormControl] - [QuestionFormViewModel]o-[FormArray] - [QuestionFormViewModel]o-[<abstract>AbstractControl] - [QuestionFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[QuestionFormViewModel] - [<abstract>IListActionProvider]<:--[QuestionFormViewModel] + [InterventionFormView]o-[InterventionFormViewModel] - [<abstract>QuestionFormData + [InterventionPreview | - <static>+questionTypeFormDataFactories: Map<SurveyQuestionType, QuestionFormData Function(Question<dynamic>, List<EligibilityCriterion>)>; - +questionId: String; - +questionText: String; - +questionInfoText: String?; - +questionType: SurveyQuestionType; - +responseOptionsValidity: Map<dynamic, bool>; - +responseOptions: List<dynamic>; + +routeArgs: InterventionFormRouteArgs + | + +Widget build() + ] + + [InterventionPreview]o-[InterventionFormRouteArgs] + [<abstract>ConsumerWidget]<:-[InterventionPreview] + + [StudyScheduleFormView + | + +formViewModel: StudyScheduleControls + | + -FormTableRow _renderCustomSequence(); + +Widget build() + ] + + [StudyScheduleFormView]o-[<abstract>StudyScheduleControls] + [<abstract>FormConsumerWidget]<:-[StudyScheduleFormView] + + [InterventionTaskFormData + | + +taskId: String; + +taskTitle: String; + +taskDescription: String?; + <static>+kDefaultTitle: String; +id: String | - +Question<dynamic> toQuestion(); - +EligibilityCriterion toEligibilityCriterion(); - +Answer<dynamic> constructAnswerFor(); - +dynamic setResponseOptionsValidityFrom(); - +QuestionFormData copy() + +CheckmarkTask toTask(); + +InterventionTaskFormData copy() ] - [<abstract>QuestionFormData]o-[SurveyQuestionType] - [<abstract>IFormData]<:--[<abstract>QuestionFormData] + [<abstract>IFormDataWithSchedule]<:-[InterventionTaskFormData] - [ChoiceQuestionFormData + [InterventionsFormViewModel | - +isMultipleChoice: bool; - +answerOptions: List<String>; - +responseOptions: List<String> + +study: Study; + +router: GoRouter; + +interventionsArray: FormArray<dynamic>; + +interventionsCollection: FormViewModelCollection<InterventionFormViewModel, InterventionFormData>; + +form: FormGroup; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +interventionsRequired: dynamic; + +titles: Map<FormMode, String>; + +canTestStudySchedule: bool | - +Question<dynamic> toQuestion(); - +QuestionFormData copy(); - -Choice _buildChoiceForValue(); - +Answer<dynamic> constructAnswerFor() + +void setControlsFrom(); + +InterventionsFormData buildFormData(); + +void read(); + +List<ModelAction<dynamic>> availableActions(); + +List<ModelAction<dynamic>> availablePopupActions(); + +List<ModelAction<dynamic>> availableInlineActions(); + +void onSelectItem(); + +void onNewItem(); + +InterventionFormViewModel provide(); + +void onCancel(); + +dynamic onSave(); + +dynamic testStudySchedule() ] - [<abstract>QuestionFormData]<:-[ChoiceQuestionFormData] + [InterventionsFormViewModel]o-[Study] + [InterventionsFormViewModel]o-[GoRouter] + [InterventionsFormViewModel]o-[FormArray] + [InterventionsFormViewModel]o-[FormViewModelCollection] + [InterventionsFormViewModel]o-[FormGroup] + [<abstract>FormViewModel]<:-[InterventionsFormViewModel] + [<abstract>StudyScheduleControls]<:-[InterventionsFormViewModel] + [<abstract>IFormViewModelDelegate]<:--[InterventionsFormViewModel] + [<abstract>IListActionProvider]<:--[InterventionsFormViewModel] + [<abstract>IProviderArgsResolver]<:--[InterventionsFormViewModel] - [BoolQuestionFormData + [InterventionTaskFormViewModel | - <static>+kResponseOptions: Map<String, bool>; - +responseOptions: List<String> + +taskIdControl: FormControl<String>; + +instanceIdControl: FormControl<String>; + +taskTitleControl: FormControl<String>; + +taskDescriptionControl: FormControl<String>; + +markAsCompletedControl: FormControl<bool>; + +form: FormGroup; + +taskId: String; + +instanceId: String; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +titleRequired: dynamic; + +titles: Map<FormMode, String> | - +Question<dynamic> toQuestion(); - +BoolQuestionFormData copy(); - +Answer<dynamic> constructAnswerFor() + +void setControlsFrom(); + +InterventionTaskFormData buildFormData(); + +InterventionTaskFormViewModel createDuplicate() ] - [<abstract>QuestionFormData]<:-[BoolQuestionFormData] + [InterventionTaskFormViewModel]o-[FormControl] + [InterventionTaskFormViewModel]o-[FormGroup] + [<abstract>ManagedFormViewModel]<:-[InterventionTaskFormViewModel] + [<abstract>WithScheduleControls]<:-[InterventionTaskFormViewModel] - [ImageQuestionFormData + [<abstract>StudyScheduleControls | - <static>+kResponseOptions: Map<String, FutureBlobFile>; - +responseOptions: List<String> + <static>+defaultScheduleType: PhaseSequence; + <static>+defaultScheduleTypeSequence: String; + <static>+defaultNumCycles: int; + <static>+defaultPeriodLength: int; + +sequenceTypeControl: FormControl<PhaseSequence>; + +sequenceTypeCustomControl: FormControl<String>; + +phaseDurationControl: FormControl<int>; + +numCyclesControl: FormControl<int>; + +includeBaselineControl: FormControl<bool>; + +studyScheduleControls: Map<String, FormControl<Object>>; + <static>+kNumCyclesMin: int; + <static>+kNumCyclesMax: int; + <static>+kPhaseDurationMin: int; + <static>+kPhaseDurationMax: int; + +sequenceTypeControlOptions: List<FormControlOption<PhaseSequence>>; + +studyScheduleValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +numCyclesRange: dynamic; + +phaseDurationRange: dynamic; + +customSequenceRequired: dynamic | - +Question<dynamic> toQuestion(); - +ImageQuestionFormData copy(); - +Answer<dynamic> constructAnswerFor() + +void setStudyScheduleControlsFrom(); + +StudyScheduleFormData buildStudyScheduleFormData(); + +bool isSequencingCustom() ] - [<abstract>QuestionFormData]<:-[ImageQuestionFormData] + [<abstract>StudyScheduleControls]o-[PhaseSequence] + [<abstract>StudyScheduleControls]o-[FormControl] - [AudioQuestionFormData + [InterventionFormData | - +maxRecordingDurationSeconds: int; - <static>+kResponseOptions: Map<String, FutureBlobFile>; - +responseOptions: List<String> + +interventionId: String; + +title: String; + +description: String?; + +tasksData: List<InterventionTaskFormData>?; + +iconName: String?; + <static>+kDefaultTitle: String; + +id: String | - +Question<dynamic> toQuestion(); - +AudioQuestionFormData copy(); - +Answer<dynamic> constructAnswerFor() + +Intervention toIntervention(); + +InterventionFormData copy() ] - [<abstract>QuestionFormData]<:-[AudioQuestionFormData] + [<abstract>IFormData]<:-[InterventionFormData] - [ScaleQuestionFormData + [StudyScheduleFormData | - +minValue: double; - +maxValue: double; - +minLabel: String?; - +maxLabel: String?; - +midValues: List<double?>; - +midLabels: List<String?>; - +stepSize: double; - +initialValue: double?; - +minColor: Color?; - +maxColor: Color?; - +responseOptions: List<double>; - +midAnnotations: List<Annotation> + +sequenceType: PhaseSequence; + +sequenceTypeCustom: String; + +numCycles: int; + +phaseDuration: int; + +includeBaseline: bool; + +id: String | - +ScaleQuestion toQuestion(); - +QuestionFormData copy(); - +Answer<dynamic> constructAnswerFor() + +StudySchedule toStudySchedule(); + +Study apply(); + +StudyScheduleFormData copy() + ] + + [StudyScheduleFormData]o-[PhaseSequence] + [<abstract>IStudyFormData]<:--[StudyScheduleFormData] + + [InterventionTaskFormView + | + +formViewModel: InterventionTaskFormViewModel ] - [ScaleQuestionFormData]o-[Color] - [<abstract>QuestionFormData]<:-[ScaleQuestionFormData] + [InterventionTaskFormView]o-[InterventionTaskFormViewModel] - [FreeTextQuestionFormData + [InterventionsFormData | - +textLengthRange: List<int>; - +textType: FreeTextQuestionType; - +textTypeExpression: String?; - +responseOptions: List<String> + +interventionsData: List<InterventionFormData>; + +studyScheduleData: StudyScheduleFormData; + +id: String | - +Question<dynamic> toQuestion(); - +FreeTextQuestionFormData copy(); - +Answer<dynamic> constructAnswerFor() + +Study apply(); + +InterventionsFormData copy() ] - [FreeTextQuestionFormData]o-[FreeTextQuestionType] - [<abstract>QuestionFormData]<:-[FreeTextQuestionFormData] + [InterventionsFormData]o-[StudyScheduleFormData] + [<abstract>IStudyFormData]<:--[InterventionsFormData] - [<abstract>IScaleQuestionFormViewModel + [InterventionFormViewModel | - +isMidValuesClearedInfoVisible: bool - ] - - [ScaleQuestionFormView + +study: Study; + +interventionIdControl: FormControl<String>; + +interventionTitleControl: FormControl<String>; + +interventionIconControl: FormControl<IconOption>; + +interventionDescriptionControl: FormControl<String>; + +interventionTasksArray: FormArray<dynamic>; + +tasksCollection: FormViewModelCollection<InterventionTaskFormViewModel, InterventionTaskFormData>; + +form: FormGroup; + +interventionId: String; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +titleRequired: dynamic; + +atLeastOneTask: dynamic; + +breadcrumbsTitle: String; + +titles: Map<FormMode, String> | - +formViewModel: QuestionFormViewModel + +void setControlsFrom(); + +InterventionFormData buildFormData(); + +List<ModelAction<dynamic>> availableActions(); + +List<ModelAction<dynamic>> availablePopupActions(); + +List<ModelAction<dynamic>> availableInlineActions(); + +void onSelectItem(); + +void onNewItem(); + +void onCancel(); + +dynamic onSave(); + +InterventionTaskFormViewModel provide(); + +InterventionTaskFormRouteArgs buildNewFormRouteArgs(); + +InterventionTaskFormRouteArgs buildFormRouteArgs(); + +InterventionFormViewModel createDuplicate() ] - [ScaleQuestionFormView]o-[QuestionFormViewModel] + [InterventionFormViewModel]o-[Study] + [InterventionFormViewModel]o-[FormControl] + [InterventionFormViewModel]o-[FormArray] + [InterventionFormViewModel]o-[FormViewModelCollection] + [InterventionFormViewModel]o-[FormGroup] + [<abstract>ManagedFormViewModel]<:-[InterventionFormViewModel] + [<abstract>IFormViewModelDelegate]<:--[InterventionFormViewModel] + [<abstract>IListActionProvider]<:--[InterventionFormViewModel] + [<abstract>IProviderArgsResolver]<:--[InterventionFormViewModel] - [FreeTextQuestionFormView - | - +formViewModel: QuestionFormViewModel; - +generateLabelHelpTextMap: dynamic + [StudyDesignReportsFormView | +Widget build(); - +Widget disableOnReadonly(); - +Widget generateRow() + -dynamic _showReportItemSidesheetWithArgs() ] - [FreeTextQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[FreeTextQuestionFormView] + [<abstract>StudyDesignPageWidget]<:-[StudyDesignReportsFormView] - [BoolQuestionFormView + [ReportItemFormData | - +formViewModel: QuestionFormViewModel + +isPrimary: bool; + +section: ReportSection; + +id: String | - +Widget build() + <static>+dynamic fromDomainModel(); + +ReportItemFormData copy() ] - [BoolQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[BoolQuestionFormView] + [ReportItemFormData]o-[<abstract>ReportSection] + [<abstract>IFormData]<:-[ReportItemFormData] - [SurveyQuestionType + [DataReferenceEditor | - +index: int; - <static>+values: List<SurveyQuestionType>; - <static>+choice: SurveyQuestionType; - <static>+bool: SurveyQuestionType; - <static>+scale: SurveyQuestionType; - <static>+image: SurveyQuestionType; - <static>+audio: SurveyQuestionType; - <static>+freeText: SurveyQuestionType + +formControl: FormControl<DataReferenceIdentifier<T>>; + +availableTasks: List<Task>; + +buildReactiveDropdownField: ReactiveDropdownField<dynamic> + | + +FormTableRow buildFormTableRow(); + -List<DropdownMenuItem<DataReferenceIdentifier<dynamic>>> _dataReferenceItems() ] - [SurveyQuestionType]o-[SurveyQuestionType] - [Enum]<:--[SurveyQuestionType] + [DataReferenceEditor]o-[FormControl] + [DataReferenceEditor]o-[ReactiveDropdownField] - [AudioRecordingQuestionFormView + [TemporalAggregationFormatted | - +formViewModel: QuestionFormViewModel + -_value: TemporalAggregation; + <static>+values: List<TemporalAggregationFormatted>; + +value: TemporalAggregation; + +string: String; + +icon: IconData?; + +hashCode: int | - +Widget build() + +bool ==(); + +String toString(); + +String toJson(); + <static>+TemporalAggregationFormatted fromJson() ] - [AudioRecordingQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[AudioRecordingQuestionFormView] + [TemporalAggregationFormatted]o-[TemporalAggregation] + [TemporalAggregationFormatted]o-[IconData] - [ChoiceQuestionFormView + [ImprovementDirectionFormatted | - +formViewModel: QuestionFormViewModel + -_value: ImprovementDirection; + <static>+values: List<ImprovementDirectionFormatted>; + +value: ImprovementDirection; + +string: String; + +icon: IconData?; + +hashCode: int | - +Widget build() + +bool ==(); + +String toString(); + +String toJson(); + <static>+ImprovementDirectionFormatted fromJson() ] - [ChoiceQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[ChoiceQuestionFormView] + [ImprovementDirectionFormatted]o-[ImprovementDirection] + [ImprovementDirectionFormatted]o-[IconData] - [ImageCapturingQuestionFormView - | - +formViewModel: QuestionFormViewModel + [ReportSectionType | - +Widget build() + +index: int; + <static>+values: List<ReportSectionType>; + <static>+average: ReportSectionType; + <static>+linearRegression: ReportSectionType ] - [ImageCapturingQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[ImageCapturingQuestionFormView] + [ReportSectionType]o-[ReportSectionType] + [Enum]<:--[ReportSectionType] - [<abstract>WithQuestionnaireControls + [AverageSectionFormView | - +questionsArray: FormArray<dynamic>; - +questionFormViewModels: FormViewModelCollection<Q, QuestionFormData>; - +questionnaireControls: Map<String, FormArray<dynamic>>; - +propagateOnSave: bool; - +questionModels: List<Q>; - +questionTitles: Map<FormMode, String Function()> + +formViewModel: ReportItemFormViewModel; + +studyId: String; + +reportSectionColumnWidth: Map<int, TableColumnWidth> | - +void setQuestionnaireControlsFrom(); - +QuestionnaireFormData buildQuestionnaireFormData(); - +void read(); - +void onCancel(); - +dynamic onSave(); - +Q provide(); - +Q provideQuestionFormViewModel() + +Widget build() ] - [<abstract>WithQuestionnaireControls]o-[FormArray] - [<abstract>WithQuestionnaireControls]o-[FormViewModelCollection] - [<abstract>IFormViewModelDelegate]<:--[<abstract>WithQuestionnaireControls] - [<abstract>IProviderArgsResolver]<:--[<abstract>WithQuestionnaireControls] + [AverageSectionFormView]o-[ReportItemFormViewModel] + [<abstract>ConsumerWidget]<:-[AverageSectionFormView] - [QuestionnaireFormData + [DataReferenceIdentifier | - +questionsData: List<QuestionFormData>?; - +id: String + +hashCode: int | - +StudyUQuestionnaire toQuestionnaire(); - +List<EligibilityCriterion> toEligibilityCriteria(); - +QuestionnaireFormData copy() + +bool ==() ] - [<abstract>IFormData]<:--[QuestionnaireFormData] + [DataReference]<:-[DataReferenceIdentifier] - [ScheduleControls + [LinearRegressionSectionFormView | - +formViewModel: WithScheduleControls + +formViewModel: ReportItemFormViewModel; + +studyId: String; + +reportSectionColumnWidth: Map<int, TableColumnWidth> | - +Widget build(); - -List<FormTableRow> _conditionalTimeRestrictions() + +Widget build() ] - [ScheduleControls]o-[<abstract>WithScheduleControls] - [<abstract>FormConsumerWidget]<:-[ScheduleControls] + [LinearRegressionSectionFormView]o-[ReportItemFormViewModel] + [<abstract>ConsumerWidget]<:-[LinearRegressionSectionFormView] - [<abstract>IFormDataWithSchedule + [ReportItemFormViewModel | - +instanceId: String; - +isTimeLocked: bool; - +timeLockStart: StudyUTimeOfDay?; - +timeLockEnd: StudyUTimeOfDay?; - +hasReminder: bool; - +reminderTime: StudyUTimeOfDay? + <static>+defaultSectionType: ReportSectionType; + +sectionIdControl: FormControl<String>; + +sectionTypeControl: FormControl<ReportSectionType>; + +titleControl: FormControl<String>; + +descriptionControl: FormControl<String>; + +sectionControl: FormControl<ReportSection>; + +dataReferenceControl: FormControl<DataReferenceIdentifier<num>>; + +temporalAggregationControl: FormControl<TemporalAggregationFormatted>; + +improvementDirectionControl: FormControl<ImprovementDirectionFormatted>; + +alphaControl: FormControl<double>; + -_controlsBySectionType: Map<ReportSectionType, FormGroup>; + -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + -_validationConfigsBySectionType: Map<ReportSectionType, Map<FormValidationSetEnum, List<FormControlValidation>>>; + +sectionBaseControls: Map<String, AbstractControl<dynamic>>; + +form: FormGroup; + +sectionId: String; + +sectionType: ReportSectionType; + <static>+sectionTypeControlOptions: List<FormControlOption<ReportSectionType>>; + <static>+temporalAggregationControlOptions: List<FormControlOption<TemporalAggregationFormatted>>; + <static>+improvementDirectionControlOptions: List<FormControlOption<ImprovementDirectionFormatted>>; + +titles: Map<FormMode, String>; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +titleRequired: dynamic; + +descriptionRequired: dynamic; + +dataReferenceRequired: dynamic; + +aggregationRequired: dynamic; + +improvementDirectionRequired: dynamic; + +alphaConfidenceRequired: dynamic | - +Schedule toSchedule() + -List<FormControlValidation> _getValidationConfig(); + +ReportItemFormData buildFormData(); + +ReportItemFormViewModel createDuplicate(); + +dynamic onSectionTypeChanged(); + -void _updateFormControls(); + +void setControlsFrom() ] - [<abstract>IFormDataWithSchedule]o-[StudyUTimeOfDay] - [<abstract>IFormData]<:--[<abstract>IFormDataWithSchedule] + [ReportItemFormViewModel]o-[ReportSectionType] + [ReportItemFormViewModel]o-[FormControl] + [ReportItemFormViewModel]o-[FormGroup] + [<abstract>ManagedFormViewModel]<:-[ReportItemFormViewModel] - [<abstract>WithScheduleControls + [ReportItemFormView | - +isTimeRestrictedControl: FormControl<bool>; - +instanceID: FormControl<String>; - +restrictedTimeStartControl: FormControl<Time>; - +restrictedTimeStartPickerControl: FormControl<TimeOfDay>; - +restrictedTimeEndControl: FormControl<Time>; - +restrictedTimeEndPickerControl: FormControl<TimeOfDay>; - +hasReminderControl: FormControl<bool>; - +reminderTimeControl: FormControl<Time>; - +reminderTimePickerControl: FormControl<TimeOfDay>; - -_reminderControlStream: StreamSubscription<dynamic>?; - +scheduleFormControls: Map<String, FormControl<Object>>; - +hasReminder: bool; - +isTimeRestricted: bool; - +timeRestriction: List<Time>? + +formViewModel: ReportItemFormViewModel; + +studyId: String; + +reportSectionColumnWidth: dynamic; + +sectionTypeBodyBuilder: Widget Function(BuildContext) | - +void setScheduleControlsFrom(); - -dynamic _initReminderControl() + +Widget build(); + -dynamic _buildSectionText(); + -dynamic _buildSectionTypeHeader() ] - [<abstract>WithScheduleControls]o-[FormControl] - [<abstract>WithScheduleControls]o-[StreamSubscription] + [ReportItemFormView]o-[ReportItemFormViewModel] + [ReportItemFormView]o-[Widget Function(BuildContext)] - [StudyFormViewModel + [ReportsFormViewModel | - +studyDirtyCopy: Study?; - +studyRepository: IStudyRepository; - +authRepository: IAuthRepository; + +study: Study; +router: GoRouter; - +studyInfoFormViewModel: StudyInfoFormViewModel; - +enrollmentFormViewModel: EnrollmentFormViewModel; - +measurementsFormViewModel: MeasurementsFormViewModel; - +reportsFormViewModel: ReportsFormViewModel; - +interventionsFormViewModel: InterventionsFormViewModel; + +reportItemDelegate: ReportFormItemDelegate; + +reportItemArray: FormArray<dynamic>; + +reportItemFormViewModels: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData>; +form: FormGroup; - +isStudyReadonly: bool; + +reportItemModels: List<ReportItemFormViewModel>; +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titles: Map<FormMode, String> + +titles: Map<FormMode, String>; + +canTestConsent: bool | - +void read(); +void setControlsFrom(); - +Study buildFormData(); - +void dispose(); + +ReportsFormData buildFormData(); + +void read(); + +ReportItemFormRouteArgs buildNewReportItemFormRouteArgs(); + +ReportItemFormRouteArgs buildReportItemFormRouteArgs(); + +dynamic testReport(); +void onCancel(); +dynamic onSave(); - -dynamic _applyAndSaveSubform() + +ReportItemFormViewModel provide() ] - [StudyFormViewModel]o-[Study] - [StudyFormViewModel]o-[<abstract>IStudyRepository] - [StudyFormViewModel]o-[<abstract>IAuthRepository] - [StudyFormViewModel]o-[GoRouter] - [StudyFormViewModel]o-[StudyInfoFormViewModel] - [StudyFormViewModel]o-[EnrollmentFormViewModel] - [StudyFormViewModel]o-[MeasurementsFormViewModel] - [StudyFormViewModel]o-[ReportsFormViewModel] - [StudyFormViewModel]o-[InterventionsFormViewModel] - [StudyFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[StudyFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[StudyFormViewModel] + [ReportsFormViewModel]o-[Study] + [ReportsFormViewModel]o-[GoRouter] + [ReportsFormViewModel]o-[ReportFormItemDelegate] + [ReportsFormViewModel]o-[FormArray] + [ReportsFormViewModel]o-[FormViewModelCollection] + [ReportsFormViewModel]o-[FormGroup] + [<abstract>FormViewModel]<:-[ReportsFormViewModel] + [<abstract>IFormViewModelDelegate]<:--[ReportsFormViewModel] + [<abstract>IProviderArgsResolver]<:--[ReportsFormViewModel] - [<abstract>StudyDesignPageWidget + [ReportFormItemDelegate | - +Widget? banner() - ] - - [<abstract>StudyPageWidget]<:-[<abstract>StudyDesignPageWidget] - - [StudyAnalyzeScreen + +formViewModelCollection: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData>; + +owner: ReportsFormViewModel; + +propagateOnSave: bool; + +validationSet: dynamic | - +Widget? banner(); - +Widget build() + +void onCancel(); + +dynamic onSave(); + +ReportItemFormViewModel provide(); + +List<ModelAction<dynamic>> availableActions(); + +void onNewItem(); + +void onSelectItem() ] - [<abstract>StudyPageWidget]<:-[StudyAnalyzeScreen] + [ReportFormItemDelegate]o-[FormViewModelCollection] + [ReportFormItemDelegate]o-[ReportsFormViewModel] + [<abstract>IFormViewModelDelegate]<:--[ReportFormItemDelegate] + [<abstract>IListActionProvider]<:--[ReportFormItemDelegate] + [<abstract>IProviderArgsResolver]<:--[ReportFormItemDelegate] - [StudyAnalyzeController + [ReportBadge | - +dynamic onExport() - ] - - [StudyBaseController]<:-[StudyAnalyzeController] - - [StudyMonitorScreen + +status: ReportStatus?; + +type: BadgeType; + +showPrefixIcon: bool; + +showTooltip: bool | +Widget build() ] - [<abstract>StudyPageWidget]<:-[StudyMonitorScreen] + [ReportBadge]o-[ReportStatus] + [ReportBadge]o-[BadgeType] - [StudiesTableItem + [ReportsFormData | - +study: Study; - +itemHeight: double; - +itemPadding: double; - +rowSpacing: double; - +columnSpacing: double; - +actions: List<ModelAction<dynamic>>; - +columnSizes: List<StudiesTableColumnSize>; - +isPinned: bool; - +onPinnedChanged: void Function(Study, bool)?; - +onTap: void Function(Study)? + +reportItems: List<ReportItemFormData>; + +id: String + | + +Study apply(); + +ReportsFormData copy() ] - [StudiesTableItem]o-[Study] - [StudiesTableItem]o-[void Function(Study, bool)?] - [StudiesTableItem]o-[void Function(Study)?] + [<abstract>IStudyFormData]<:--[ReportsFormData] - [DashboardController - | - +studyRepository: IStudyRepository; - +authRepository: IAuthRepository; - +userRepository: IUserRepository; - +router: GoRouter; - -_studiesSubscription: StreamSubscription<List<WrappedModel<Study>>>?; - +searchController: SearchController; - +isSortAscending: bool + [ReportStatus | - -dynamic _subscribeStudies(); - +dynamic setSearchText(); - +dynamic setStudiesFilter(); - +dynamic onSelectStudy(); - +dynamic onClickNewStudy(); - +dynamic pinStudy(); - +dynamic pinOffStudy(); - +void setSorting(); - +void filterStudies(); - +void sortStudies(); - +bool isSortingActiveForColumn(); - +bool isPinned(); - +List<ModelAction<dynamic>> availableActions(); - +void dispose() + +index: int; + <static>+values: List<ReportStatus>; + <static>+primary: ReportStatus; + <static>+secondary: ReportStatus ] - [DashboardController]o-[<abstract>IStudyRepository] - [DashboardController]o-[<abstract>IAuthRepository] - [DashboardController]o-[<abstract>IUserRepository] - [DashboardController]o-[GoRouter] - [DashboardController]o-[StreamSubscription] - [DashboardController]o-[SearchController] - [<abstract>IModelActionProvider]<:--[DashboardController] + [ReportStatus]o-[ReportStatus] + [Enum]<:--[ReportStatus] - [StudiesTableColumnSize - | - +collapsed: bool; - +flex: int?; - +width: double? + [<abstract>IStudyFormData | - +Widget createContainer() + +Study apply() ] - [StudiesTable + [<abstract>IFormData]<:--[<abstract>IStudyFormData] + + [StudyInfoFormViewModel | - +itemHeight: double; - +itemPadding: double; - +rowSpacing: double; - +columnSpacing: double; - +compactWidthThreshold: double; - +superCompactWidthThreshold: double; - +compactStatTitleThreshold: double; - +studies: List<Study>; - +onSelect: void Function(Study); - +getActions: List<ModelAction<dynamic>> Function(Study); - +emptyWidget: Widget; - +pinnedStudies: Iterable<String>; - +dashboardController: DashboardController + +study: Study; + +titleControl: FormControl<String>; + +iconControl: FormControl<IconOption>; + +descriptionControl: FormControl<String>; + +organizationControl: FormControl<String>; + +reviewBoardControl: FormControl<String>; + +reviewBoardNumberControl: FormControl<String>; + +researchersControl: FormControl<String>; + +emailControl: FormControl<String>; + +websiteControl: FormControl<String>; + +phoneControl: FormControl<String>; + +additionalInfoControl: FormControl<String>; + +form: FormGroup; + +titles: Map<FormMode, String>; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +titleRequired: dynamic; + +descriptionRequired: dynamic; + +iconRequired: dynamic; + +organizationRequired: dynamic; + +reviewBoardRequired: dynamic; + +reviewBoardNumberRequired: dynamic; + +researchersRequired: dynamic; + +emailRequired: dynamic; + +phoneRequired: dynamic; + +emailFormat: dynamic; + +websiteFormat: dynamic | - +Widget build(); - -Widget _buildColumnHeader() + +void setControlsFrom(); + +StudyInfoFormData buildFormData() ] - [StudiesTable]o-[void Function(Study)] - [StudiesTable]o-[List<ModelAction<dynamic>> Function(Study)] - [StudiesTable]o-[<abstract>Widget] - [StudiesTable]o-[DashboardController] + [StudyInfoFormViewModel]o-[Study] + [StudyInfoFormViewModel]o-[FormControl] + [StudyInfoFormViewModel]o-[FormGroup] + [<abstract>FormViewModel]<:-[StudyInfoFormViewModel] - [StudiesTableColumn + [StudyDesignInfoFormView | - +index: int; - <static>+values: List<StudiesTableColumn>; - <static>+pin: StudiesTableColumn; - <static>+title: StudiesTableColumn; - <static>+status: StudiesTableColumn; - <static>+participation: StudiesTableColumn; - <static>+createdAt: StudiesTableColumn; - <static>+enrolled: StudiesTableColumn; - <static>+active: StudiesTableColumn; - <static>+completed: StudiesTableColumn; - <static>+action: StudiesTableColumn + +Widget build() ] - [StudiesTableColumn]o-[StudiesTableColumn] - [Enum]<:--[StudiesTableColumn] + [<abstract>StudyDesignPageWidget]<:-[StudyDesignInfoFormView] - [DashboardScreen + [StudyInfoFormData | - +filter: StudiesFilter? + +title: String; + +description: String?; + +iconName: String; + +contactInfoFormData: StudyContactInfoFormData; + +id: String + | + +Study apply(); + +StudyInfoFormData copy() ] - [DashboardScreen]o-[StudiesFilter] + [StudyInfoFormData]o-[StudyContactInfoFormData] + [<abstract>IStudyFormData]<:--[StudyInfoFormData] - [DashboardScaffold + [StudyContactInfoFormData | - <static>+compactWidthThreshold: double; - +body: Widget + +organization: String?; + +institutionalReviewBoard: String?; + +institutionalReviewBoardNumber: String?; + +researchers: String?; + +email: String?; + +website: String?; + +phone: String?; + +additionalInfo: String?; + +id: String | - +Widget build() + +Study apply(); + +StudyInfoFormData copy() ] - [DashboardScaffold]o-[<abstract>Widget] + [<abstract>IStudyFormData]<:--[StudyContactInfoFormData] - [StudiesFilter + [StudyFormValidationSet | +index: int; - <static>+values: List<StudiesFilter> + <static>+values: List<StudyFormValidationSet> ] - [Enum]<:--[StudiesFilter] + [Enum]<:--[StudyFormValidationSet] - [StudiesTableColumnHeader + [MeasurementsFormData | - +title: String; - +sortable: bool; - +sortAscending: bool; - +sortingActive: bool; - +onSort: void Function()? + +surveyMeasurements: List<MeasurementSurveyFormData>; + +id: String + | + +Study apply(); + +MeasurementsFormData copy() ] - [StudiesTableColumnHeader]o-[void Function()?] + [<abstract>IStudyFormData]<:--[MeasurementsFormData] - [AccountSettingsDialog + [MeasurementSurveyFormView | - +Widget build() + +formViewModel: MeasurementSurveyFormViewModel ] - [<abstract>ConsumerWidget]<:-[AccountSettingsDialog] + [MeasurementSurveyFormView]o-[MeasurementSurveyFormViewModel] - [StudyInvitesTable + [SurveyPreview | - +invites: List<StudyInvite>; - +onSelect: void Function(StudyInvite); - +getActions: List<ModelAction<dynamic>> Function(StudyInvite); - +getInlineActions: List<ModelAction<dynamic>> Function(StudyInvite); - +getIntervention: Intervention? Function(String); - +getParticipantCountForInvite: int Function(StudyInvite) + +routeArgs: MeasurementFormRouteArgs | - +Widget build(); - -List<Widget> _buildRow() + +Widget build() ] - [StudyInvitesTable]o-[void Function(StudyInvite)] - [StudyInvitesTable]o-[List<ModelAction<dynamic>> Function(StudyInvite)] - [StudyInvitesTable]o-[Intervention? Function(String)] - [StudyInvitesTable]o-[int Function(StudyInvite)] + [SurveyPreview]o-[MeasurementFormRouteArgs] + [<abstract>ConsumerWidget]<:-[SurveyPreview] - [StudyRecruitController + [MeasurementSurveyFormData | - +inviteCodeRepository: IInviteCodeRepository; - -_invitesSubscription: StreamSubscription<List<WrappedModel<StudyInvite>>>? + +measurementId: String; + +title: String; + +introText: String?; + +outroText: String?; + +questionnaireFormData: QuestionnaireFormData; + <static>+kDefaultTitle: String; + +id: String | - -dynamic _subscribeInvites(); - +Intervention? getIntervention(); - +int getParticipantCountForInvite(); - +List<ModelAction<dynamic>> availableActions(); - +List<ModelAction<dynamic>> availableInlineActions(); - +void dispose() + +QuestionnaireTask toQuestionnaireTask(); + +MeasurementSurveyFormData copy() ] - [StudyRecruitController]o-[<abstract>IInviteCodeRepository] - [StudyRecruitController]o-[StreamSubscription] - [StudyBaseController]<:-[StudyRecruitController] - [<abstract>IModelActionProvider]<:--[StudyRecruitController] + [MeasurementSurveyFormData]o-[QuestionnaireFormData] + [<abstract>IFormDataWithSchedule]<:-[MeasurementSurveyFormData] - [InviteCodeFormViewModel + [MeasurementSurveyFormViewModel | +study: Study; - +inviteCodeRepository: IInviteCodeRepository; - +codeControl: FormControl<String>; - +codeControlValidationMessages: Map<String, String Function(dynamic)>; - +isPreconfiguredScheduleControl: FormControl<bool>; - +preconfiguredScheduleTypeControl: FormControl<PhaseSequence>; - +interventionAControl: FormControl<String>; - +interventionBControl: FormControl<String>; + +measurementIdControl: FormControl<String>; + +instanceIdControl: FormControl<String>; + +surveyTitleControl: FormControl<String>; + +surveyIntroTextControl: FormControl<String>; + +surveyOutroTextControl: FormControl<String>; +form: FormGroup; - +titles: Map<FormMode, String>; - +interventionControlOptions: List<FormControlOption<String>>; - +preconfiguredScheduleTypeOptions: List<FormControlOption<PhaseSequence>>; - +isPreconfiguredSchedule: bool; - +preconfiguredSchedule: List<String>? + +measurementId: String; + +instanceId: String; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +titleRequired: dynamic; + +atLeastOneQuestion: dynamic; + +breadcrumbsTitle: String; + +titles: Map<FormMode, String> | - +void initControls(); - -dynamic _uniqueInviteCode(); - +void regenerateCode(); - -String _generateCode(); - +StudyInvite buildFormData(); +void setControlsFrom(); - +dynamic save() + +MeasurementSurveyFormData buildFormData(); + +List<ModelAction<dynamic>> availableActions(); + +List<ModelAction<dynamic>> availablePopupActions(); + +List<ModelAction<dynamic>> availableInlineActions(); + +void onSelectItem(); + +void onNewItem(); + +SurveyQuestionFormRouteArgs buildNewFormRouteArgs(); + +SurveyQuestionFormRouteArgs buildFormRouteArgs(); + +MeasurementSurveyFormViewModel createDuplicate() ] - [InviteCodeFormViewModel]o-[Study] - [InviteCodeFormViewModel]o-[<abstract>IInviteCodeRepository] - [InviteCodeFormViewModel]o-[FormControl] - [InviteCodeFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[InviteCodeFormViewModel] + [MeasurementSurveyFormViewModel]o-[Study] + [MeasurementSurveyFormViewModel]o-[FormControl] + [MeasurementSurveyFormViewModel]o-[FormGroup] + [<abstract>ManagedFormViewModel]<:-[MeasurementSurveyFormViewModel] + [<abstract>WithQuestionnaireControls]<:-[MeasurementSurveyFormViewModel] + [<abstract>WithScheduleControls]<:-[MeasurementSurveyFormViewModel] + [<abstract>IFormViewModelDelegate]<:--[MeasurementSurveyFormViewModel] + [<abstract>IListActionProvider]<:--[MeasurementSurveyFormViewModel] + [<abstract>IProviderArgsResolver]<:--[MeasurementSurveyFormViewModel] - [EnrolledBadge - | - +enrolledCount: int + [StudyDesignMeasurementsFormView | +Widget build() ] - [InviteCodeFormView - | - +formViewModel: InviteCodeFormViewModel - | - +Widget build(); - -List<FormTableRow> _conditionalInterventionRows() - ] - - [InviteCodeFormView]o-[InviteCodeFormViewModel] - [<abstract>FormConsumerWidget]<:-[InviteCodeFormView] - - [StudyRecruitScreen - | - +Widget build(); - -Widget _inviteCodesSectionHeader(); - -Widget _newInviteCodeButton(); - -dynamic _onSelectInvite() - ] - - [<abstract>StudyPageWidget]<:-[StudyRecruitScreen] + [<abstract>StudyDesignPageWidget]<:-[StudyDesignMeasurementsFormView] - [DrawerEntry + [MeasurementsFormViewModel | - +localizedTitle: String Function(); - +icon: IconData?; - +localizedHelpText: String Function()?; - +enabled: bool; - +onSelected: void Function(BuildContext, WidgetRef)?; - +autoCloseDrawer: bool; - +title: String; - +helpText: String? + +study: Study; + +router: GoRouter; + +measurementsArray: FormArray<dynamic>; + +surveyMeasurementFormViewModels: FormViewModelCollection<MeasurementSurveyFormViewModel, MeasurementSurveyFormData>; + +form: FormGroup; + +measurementViewModels: List<MeasurementSurveyFormViewModel>; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +measurementRequired: dynamic; + +titles: Map<FormMode, String> | - +void onClick() + +void read(); + +void setControlsFrom(); + +MeasurementsFormData buildFormData(); + +List<ModelAction<dynamic>> availableActions(); + +List<ModelAction<dynamic>> availablePopupActions(); + +List<ModelAction<dynamic>> availableInlineActions(); + +void onSelectItem(); + +void onNewItem(); + +MeasurementSurveyFormViewModel provide(); + +void onCancel(); + +dynamic onSave() ] - [DrawerEntry]o-[String Function()] - [DrawerEntry]o-[IconData] - [DrawerEntry]o-[String Function()?] - [DrawerEntry]o-[void Function(BuildContext, WidgetRef)?] + [MeasurementsFormViewModel]o-[Study] + [MeasurementsFormViewModel]o-[GoRouter] + [MeasurementsFormViewModel]o-[FormArray] + [MeasurementsFormViewModel]o-[FormViewModelCollection] + [MeasurementsFormViewModel]o-[FormGroup] + [<abstract>FormViewModel]<:-[MeasurementsFormViewModel] + [<abstract>IFormViewModelDelegate]<:--[MeasurementsFormViewModel] + [<abstract>IListActionProvider]<:--[MeasurementsFormViewModel] + [<abstract>IProviderArgsResolver]<:--[MeasurementsFormViewModel] - [GoRouterDrawerEntry + [StudyFormScaffold | - +intent: RoutingIntent; - +onNavigated: void Function()? + +studyId: String; + +formViewModelBuilder: T Function(WidgetRef); + +formViewBuilder: Widget Function(T) | - +void onClick() + +Widget build() ] - [GoRouterDrawerEntry]o-[RoutingIntent] - [GoRouterDrawerEntry]o-[void Function()?] - [DrawerEntry]<:-[GoRouterDrawerEntry] + [StudyFormScaffold]o-[T Function(WidgetRef)] + [StudyFormScaffold]o-[Widget Function(T)] + [<abstract>ConsumerWidget]<:-[StudyFormScaffold] - [AppDrawer + [ConsentItemFormViewModel + | + +consentIdControl: FormControl<String>; + +titleControl: FormControl<String>; + +descriptionControl: FormControl<String>; + +iconControl: FormControl<IconOption>; + +form: FormGroup; + +consentId: String; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +titleRequired: dynamic; + +descriptionRequired: dynamic; + +titles: Map<FormMode, String> | - +width: int; - +autoCloseDrawer: bool; - +leftPaddingEntries: double; - +logoPaddingVertical: double; - +logoPaddingHorizontal: double; - +logoMaxHeight: double; - +logoSectionMinHeight: double; - +logoSectionMaxHeight: double + +void setControlsFrom(); + +ConsentItemFormData buildFormData(); + +ConsentItemFormViewModel createDuplicate() ] - [NotificationDispatcher + [ConsentItemFormViewModel]o-[FormControl] + [ConsentItemFormViewModel]o-[FormGroup] + [<abstract>ManagedFormViewModel]<:-[ConsentItemFormViewModel] + + [StudyDesignEnrollmentFormView | - +child: Widget?; - +snackbarInnerPadding: double; - +snackbarWidth: double?; - +snackbarBehavior: SnackBarBehavior; - +snackbarDefaultDuration: int + +Widget build(); + -dynamic _showScreenerQuestionSidesheetWithArgs(); + -dynamic _showConsentItemSidesheetWithArgs() ] - [NotificationDispatcher]o-[<abstract>Widget] - [NotificationDispatcher]o-[SnackBarBehavior] + [<abstract>StudyDesignPageWidget]<:-[StudyDesignEnrollmentFormView] - [Notifications + [<abstract>IScreenerQuestionLogicFormViewModel | - <static>+credentialsInvalid: SnackbarIntent; - <static>+userAlreadyRegistered: SnackbarIntent; - <static>+passwordReset: SnackbarIntent; - <static>+passwordResetSuccess: SnackbarIntent; - <static>+studyDeleted: SnackbarIntent; - <static>+inviteCodeDeleted: SnackbarIntent; - <static>+inviteCodeClipped: SnackbarIntent; - <static>+studyDeleteConfirmation: AlertIntent + +isDirtyOptionsBannerVisible: bool ] - [Notifications]o-[SnackbarIntent] - [Notifications]o-[AlertIntent] - - [NotificationDefaultActions + [ScreenerQuestionLogicFormView | - <static>+cancel: NotificationAction + +formViewModel: ScreenerQuestionFormViewModel + | + +Widget build(); + -dynamic _buildInfoBanner(); + -dynamic _buildAnswerOptionsLogicControls(); + -List<Widget> _buildOptionLogicRow() ] - [NotificationDefaultActions]o-[NotificationAction] + [ScreenerQuestionLogicFormView]o-[ScreenerQuestionFormViewModel] + [<abstract>FormConsumerWidget]<:-[ScreenerQuestionLogicFormView] - [<abstract>NotificationIntent + [ConsentItemFormData | - +message: String?; - +customContent: Widget?; - +icon: IconData?; - +actions: List<NotificationAction>?; - +type: NotificationType + +consentId: String; + +title: String; + +description: String; + +iconName: String?; + +id: String | - +void register() + +ConsentItem toConsentItem(); + +ConsentItemFormData copy() ] - [<abstract>NotificationIntent]o-[<abstract>Widget] - [<abstract>NotificationIntent]o-[IconData] - [<abstract>NotificationIntent]o-[NotificationType] + [<abstract>IFormData]<:-[ConsentItemFormData] - [NotificationAction + [ConsentItemFormView | - +label: String; - +onSelect: dynamic Function(); - +isDestructive: bool + +formViewModel: ConsentItemFormViewModel ] - [NotificationAction]o-[dynamic Function()] + [ConsentItemFormView]o-[ConsentItemFormViewModel] - [SnackbarIntent + [EnrollmentFormData | - +duration: int? + <static>+kDefaultEnrollmentType: Participation; + +enrollmentType: Participation; + +questionnaireFormData: QuestionnaireFormData; + +consentItemsFormData: List<ConsentItemFormData>?; + +id: String + | + +Study apply(); + +EnrollmentFormData copy() ] - [<abstract>NotificationIntent]<:-[SnackbarIntent] + [EnrollmentFormData]o-[Participation] + [EnrollmentFormData]o-[QuestionnaireFormData] + [<abstract>IStudyFormData]<:--[EnrollmentFormData] - [AlertIntent + [ScreenerQuestionFormViewModel | - +title: String; - +dismissOnAction: bool; - +isDestructive: dynamic + <static>+defaultResponseOptionValidity: bool; + +responseOptionsDisabledArray: FormArray<dynamic>; + +responseOptionsLogicControls: FormArray<bool>; + +responseOptionsLogicDescriptionControls: FormArray<String>; + -_questionBaseControls: Map<String, AbstractControl<dynamic>>; + +prevResponseOptionControls: List<AbstractControl<dynamic>>; + +prevResponseOptionValues: List<dynamic>; + +responseOptionsDisabledControls: List<AbstractControl<dynamic>>; + +logicControlOptions: List<FormControlOption<bool>>; + +questionBaseControls: Map<String, AbstractControl<dynamic>>; + +isDirtyOptionsBannerVisible: bool + | + +dynamic onResponseOptionsChanged(); + +void setControlsFrom(); + +QuestionFormData buildFormData(); + -List<FormControl<dynamic>> _copyFormControls(); + -AbstractControl<dynamic>? _findAssociatedLogicControlFor(); + -AbstractControl<dynamic>? _findAssociatedControlFor(); + +ScreenerQuestionFormViewModel createDuplicate() ] - [<abstract>NotificationIntent]<:-[AlertIntent] + [ScreenerQuestionFormViewModel]o-[FormArray] + [QuestionFormViewModel]<:-[ScreenerQuestionFormViewModel] + [<abstract>IScreenerQuestionLogicFormViewModel]<:--[ScreenerQuestionFormViewModel] - [NotificationType + [EnrollmentFormViewModel | - +index: int; - <static>+values: List<NotificationType>; - <static>+snackbar: NotificationType; - <static>+alert: NotificationType; - <static>+custom: NotificationType + +study: Study; + +router: GoRouter; + +consentItemDelegate: EnrollmentFormConsentItemDelegate; + +enrollmentTypeControl: FormControl<Participation>; + +consentItemArray: FormArray<dynamic>; + +consentItemFormViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData>; + +form: FormGroup; + +enrollmentTypeControlOptions: List<FormControlOption<Participation>>; + +consentItemModels: List<ConsentItemFormViewModel>; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +titles: Map<FormMode, String>; + +canTestScreener: bool; + +canTestConsent: bool; + +questionTitles: Map<FormMode, String Function()> + | + +void setControlsFrom(); + +EnrollmentFormData buildFormData(); + +void read(); + +List<ModelAction<dynamic>> availableActions(); + +List<ModelAction<dynamic>> availablePopupActions(); + +List<ModelAction<dynamic>> availableInlineActions(); + +void onSelectItem(); + +void onNewItem(); + +ScreenerQuestionFormRouteArgs buildNewScreenerQuestionFormRouteArgs(); + +ScreenerQuestionFormRouteArgs buildScreenerQuestionFormRouteArgs(); + +ConsentItemFormRouteArgs buildNewConsentItemFormRouteArgs(); + +ConsentItemFormRouteArgs buildConsentItemFormRouteArgs(); + +dynamic testScreener(); + +dynamic testConsent(); + +ScreenerQuestionFormViewModel provideQuestionFormViewModel() ] - [NotificationType]o-[NotificationType] - [Enum]<:--[NotificationType] + [EnrollmentFormViewModel]o-[Study] + [EnrollmentFormViewModel]o-[GoRouter] + [EnrollmentFormViewModel]o-[EnrollmentFormConsentItemDelegate] + [EnrollmentFormViewModel]o-[FormControl] + [EnrollmentFormViewModel]o-[FormArray] + [EnrollmentFormViewModel]o-[FormViewModelCollection] + [EnrollmentFormViewModel]o-[FormGroup] + [<abstract>FormViewModel]<:-[EnrollmentFormViewModel] + [<abstract>WithQuestionnaireControls]<:-[EnrollmentFormViewModel] + [<abstract>IFormViewModelDelegate]<:--[EnrollmentFormViewModel] + [<abstract>IListActionProvider]<:--[EnrollmentFormViewModel] + [<abstract>IProviderArgsResolver]<:--[EnrollmentFormViewModel] - [<abstract>IClipboardService + [EnrollmentFormConsentItemDelegate | - +dynamic copy() - ] - - [ClipboardService + +formViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData>; + +owner: EnrollmentFormViewModel; + +propagateOnSave: bool; + +validationSet: dynamic | - +dynamic copy() + +void onCancel(); + +dynamic onSave(); + +ConsentItemFormViewModel provide(); + +List<ModelAction<dynamic>> availableActions(); + +void onNewItem(); + +void onSelectItem() ] - [<abstract>IClipboardService]<:--[ClipboardService] + [EnrollmentFormConsentItemDelegate]o-[FormViewModelCollection] + [EnrollmentFormConsentItemDelegate]o-[EnrollmentFormViewModel] + [<abstract>IFormViewModelDelegate]<:--[EnrollmentFormConsentItemDelegate] + [<abstract>IListActionProvider]<:--[EnrollmentFormConsentItemDelegate] + [<abstract>IProviderArgsResolver]<:--[EnrollmentFormConsentItemDelegate] - [<abstract>INotificationService + [StudyFormViewModel | - +void showMessage(); - +void show(); - +Stream<NotificationIntent> watchNotifications(); - +void dispose() + +studyDirtyCopy: Study?; + +studyRepository: IStudyRepository; + +authRepository: IAuthRepository; + +router: GoRouter; + +studyInfoFormViewModel: StudyInfoFormViewModel; + +enrollmentFormViewModel: EnrollmentFormViewModel; + +measurementsFormViewModel: MeasurementsFormViewModel; + +reportsFormViewModel: ReportsFormViewModel; + +interventionsFormViewModel: InterventionsFormViewModel; + +form: FormGroup; + +isStudyReadonly: bool; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +titles: Map<FormMode, String> + | + +void read(); + +void setControlsFrom(); + +Study buildFormData(); + +void dispose(); + +void onCancel(); + +dynamic onSave(); + -dynamic _applyAndSaveSubform() ] - [NotificationService + [StudyFormViewModel]o-[Study] + [StudyFormViewModel]o-[<abstract>IStudyRepository] + [StudyFormViewModel]o-[<abstract>IAuthRepository] + [StudyFormViewModel]o-[GoRouter] + [StudyFormViewModel]o-[StudyInfoFormViewModel] + [StudyFormViewModel]o-[EnrollmentFormViewModel] + [StudyFormViewModel]o-[MeasurementsFormViewModel] + [StudyFormViewModel]o-[ReportsFormViewModel] + [StudyFormViewModel]o-[InterventionsFormViewModel] + [StudyFormViewModel]o-[FormGroup] + [<abstract>FormViewModel]<:-[StudyFormViewModel] + [<abstract>IFormViewModelDelegate]<:--[StudyFormViewModel] + + [<abstract>WithQuestionnaireControls | - -_streamController: BehaviorSubject<NotificationIntent> + +questionsArray: FormArray<dynamic>; + +questionFormViewModels: FormViewModelCollection<Q, QuestionFormData>; + +questionnaireControls: Map<String, FormArray<dynamic>>; + +propagateOnSave: bool; + +questionModels: List<Q>; + +questionTitles: Map<FormMode, String Function()> | - +Stream<NotificationIntent> watchNotifications(); - +void showMessage(); - +void show(); - +void dispose() + +void setQuestionnaireControlsFrom(); + +QuestionnaireFormData buildQuestionnaireFormData(); + +void read(); + +void onCancel(); + +dynamic onSave(); + +Q provide(); + +Q provideQuestionFormViewModel() ] - [NotificationService]o-[BehaviorSubject] - [<abstract>INotificationService]<:--[NotificationService] + [<abstract>WithQuestionnaireControls]o-[FormArray] + [<abstract>WithQuestionnaireControls]o-[FormViewModelCollection] + [<abstract>IFormViewModelDelegate]<:--[<abstract>WithQuestionnaireControls] + [<abstract>IProviderArgsResolver]<:--[<abstract>WithQuestionnaireControls] - [Assets + [QuestionnaireFormData | - <static>+logoWide: String - ] - - [Hyperlink + +questionsData: List<QuestionFormData>?; + +id: String | - +text: String; - +url: String?; - +onClick: void Function()?; - +linkColor: Color; - +hoverColor: Color?; - +visitedColor: Color?; - +style: TextStyle?; - +hoverStyle: TextStyle?; - +visitedStyle: TextStyle?; - +icon: IconData?; - +iconSize: double? + +StudyUQuestionnaire toQuestionnaire(); + +List<EligibilityCriterion> toEligibilityCriteria(); + +QuestionnaireFormData copy() ] - [Hyperlink]o-[void Function()?] - [Hyperlink]o-[Color] - [Hyperlink]o-[TextStyle] - [Hyperlink]o-[IconData] + [<abstract>IFormData]<:--[QuestionnaireFormData] - [StandardTableColumn + [<abstract>QuestionFormData | - +label: String; - +tooltip: String?; - +columnWidth: TableColumnWidth; - +sortable: bool; - +sortAscending: bool?; - +sortableIcon: Widget? - ] - - [StandardTableColumn]o-[<abstract>TableColumnWidth] - [StandardTableColumn]o-[<abstract>Widget] - - [StandardTable + <static>+questionTypeFormDataFactories: Map<SurveyQuestionType, QuestionFormData Function(Question<dynamic>, List<EligibilityCriterion>)>; + +questionId: String; + +questionText: String; + +questionInfoText: String?; + +questionType: SurveyQuestionType; + +responseOptionsValidity: Map<dynamic, bool>; + +responseOptions: List<dynamic>; + +id: String | - +items: List<T>; - +inputColumns: List<StandardTableColumn>; - +onSelectItem: void Function(T); - +trailingActionsAt: List<ModelAction<dynamic>> Function(T, int)?; - +trailingActionsMenuType: ActionMenuType?; - +sortColumnPredicates: List<int Function(T, T)?>?; - +pinnedPredicates: int Function(T, T)?; - +headerRowBuilder: TableRow Function(BuildContext, List<StandardTableColumn>)?; - +dataRowBuilder: TableRow Function(BuildContext, List<StandardTableColumn>)?; - +inputTrailingActionsColumn: StandardTableColumn; - +tableWrapper: Widget Function(Widget)?; - +cellSpacing: double; - +rowSpacing: double; - +minRowHeight: double?; - +showTableHeader: bool; - +hideLeadingTrailingWhenEmpty: bool; - +leadingWidget: Widget?; - +trailingWidget: Widget?; - +leadingWidgetSpacing: double?; - +trailingWidgetSpacing: double?; - +emptyWidget: Widget?; - +rowStyle: StandardTableStyle; - +disableRowInteractions: bool + +Question<dynamic> toQuestion(); + +EligibilityCriterion toEligibilityCriterion(); + +Answer<dynamic> constructAnswerFor(); + +dynamic setResponseOptionsValidityFrom(); + +QuestionFormData copy() ] - [StandardTable]o-[void Function(T)] - [StandardTable]o-[List<ModelAction<dynamic>> Function(T, int)?] - [StandardTable]o-[ActionMenuType] - [StandardTable]o-[int Function(T, T)?] - [StandardTable]o-[TableRow Function(BuildContext, List<StandardTableColumn>)?] - [StandardTable]o-[StandardTableColumn] - [StandardTable]o-[Widget Function(Widget)?] - [StandardTable]o-[<abstract>Widget] - [StandardTable]o-[StandardTableStyle] + [<abstract>QuestionFormData]o-[SurveyQuestionType] + [<abstract>IFormData]<:--[<abstract>QuestionFormData] - [StandardTableStyle + [ChoiceQuestionFormData | - +index: int; - <static>+values: List<StandardTableStyle>; - <static>+plain: StandardTableStyle; - <static>+material: StandardTableStyle + +isMultipleChoice: bool; + +answerOptions: List<String>; + +responseOptions: List<String> + | + +Question<dynamic> toQuestion(); + +QuestionFormData copy(); + -Choice _buildChoiceForValue(); + +Answer<dynamic> constructAnswerFor() ] - [StandardTableStyle]o-[StandardTableStyle] - [Enum]<:--[StandardTableStyle] + [<abstract>QuestionFormData]<:-[ChoiceQuestionFormData] - [HelpIcon + [BoolQuestionFormData | - +tooltipText: String? + <static>+kResponseOptions: Map<String, bool>; + +responseOptions: List<String> | - +Widget build() + +Question<dynamic> toQuestion(); + +BoolQuestionFormData copy(); + +Answer<dynamic> constructAnswerFor() ] - [ErrorPage + [<abstract>QuestionFormData]<:-[BoolQuestionFormData] + + [ImageQuestionFormData | - +error: Exception? + <static>+kResponseOptions: Map<String, FutureBlobFile>; + +responseOptions: List<String> | - +Widget build() + +Question<dynamic> toQuestion(); + +ImageQuestionFormData copy(); + +Answer<dynamic> constructAnswerFor() ] - [<abstract>ConsumerWidget]<:-[ErrorPage] - - [SplashPage - | - +Widget build() - ] + [<abstract>QuestionFormData]<:-[ImageQuestionFormData] - [IconPack + [AudioQuestionFormData | - <static>+defaultPack: List<IconOption>; - <static>+material: List<IconOption> + +maxRecordingDurationSeconds: int; + <static>+kResponseOptions: Map<String, FutureBlobFile>; + +responseOptions: List<String> | - <static>+IconOption? resolveIconByName() + +Question<dynamic> toQuestion(); + +AudioQuestionFormData copy(); + +Answer<dynamic> constructAnswerFor() ] - [IconOption + [<abstract>QuestionFormData]<:-[AudioQuestionFormData] + + [ScaleQuestionFormData | - +name: String; - +icon: IconData?; - +isEmpty: bool; - +props: List<Object?> + +minValue: double; + +maxValue: double; + +minLabel: String?; + +maxLabel: String?; + +midValues: List<double?>; + +midLabels: List<String?>; + +stepSize: double; + +initialValue: double?; + +minColor: Color?; + +maxColor: Color?; + +responseOptions: List<double>; + +midAnnotations: List<Annotation> | - +String toJson(); - <static>+IconOption fromJson() + +ScaleQuestion toQuestion(); + +QuestionFormData copy(); + +Answer<dynamic> constructAnswerFor() ] - [IconOption]o-[IconData] - [<abstract>Equatable]<:-[IconOption] + [ScaleQuestionFormData]o-[Color] + [<abstract>QuestionFormData]<:-[ScaleQuestionFormData] - [ReactiveIconPicker + [FreeTextQuestionFormData + | + +textLengthRange: List<int>; + +textType: FreeTextQuestionType; + +textTypeExpression: String?; + +responseOptions: List<String> + | + +Question<dynamic> toQuestion(); + +FreeTextQuestionFormData copy(); + +Answer<dynamic> constructAnswerFor() ] - [ReactiveFocusableFormField]<:-[ReactiveIconPicker] + [FreeTextQuestionFormData]o-[FreeTextQuestionType] + [<abstract>QuestionFormData]<:-[FreeTextQuestionFormData] - [IconPicker + [AudioRecordingQuestionFormView | - +iconOptions: List<IconOption>; - +selectedOption: IconOption?; - +onSelect: void Function(IconOption)?; - +galleryIconSize: double?; - +selectedIconSize: double?; - +focusNode: FocusNode?; - +isDisabled: bool + +formViewModel: QuestionFormViewModel | +Widget build() ] - [IconPicker]o-[IconOption] - [IconPicker]o-[void Function(IconOption)?] - [IconPicker]o-[FocusNode] + [AudioRecordingQuestionFormView]o-[QuestionFormViewModel] + [<abstract>ConsumerWidget]<:-[AudioRecordingQuestionFormView] - [IconPickerField + [FreeTextQuestionFormView | - +iconOptions: List<IconOption>; - +selectedOption: IconOption?; - +selectedIconSize: double?; - +galleryIconSize: double?; - +onSelect: void Function(IconOption)?; - +focusNode: FocusNode?; - +isDisabled: bool + +formViewModel: QuestionFormViewModel; + +generateLabelHelpTextMap: dynamic | - +Widget build() + +Widget build(); + +Widget disableOnReadonly(); + +Widget generateRow() ] - [IconPickerField]o-[IconOption] - [IconPickerField]o-[void Function(IconOption)?] - [IconPickerField]o-[FocusNode] + [FreeTextQuestionFormView]o-[QuestionFormViewModel] + [<abstract>ConsumerWidget]<:-[FreeTextQuestionFormView] - [IconPickerGallery - | - +iconOptions: List<IconOption>; - +onSelect: void Function(IconOption)?; - +iconSize: double + [SurveyQuestionType | - +Widget build() + +index: int; + <static>+values: List<SurveyQuestionType>; + <static>+choice: SurveyQuestionType; + <static>+bool: SurveyQuestionType; + <static>+scale: SurveyQuestionType; + <static>+image: SurveyQuestionType; + <static>+audio: SurveyQuestionType; + <static>+freeText: SurveyQuestionType ] - [IconPickerGallery]o-[void Function(IconOption)?] + [SurveyQuestionType]o-[SurveyQuestionType] + [Enum]<:--[SurveyQuestionType] - [FormSideSheetTab + [ImageCapturingQuestionFormView | - +formViewBuilder: Widget Function(T) + +formViewModel: QuestionFormViewModel + | + +Widget build() ] - [FormSideSheetTab]o-[Widget Function(T)] - [NavbarTab]<:-[FormSideSheetTab] + [ImageCapturingQuestionFormView]o-[QuestionFormViewModel] + [<abstract>ConsumerWidget]<:-[ImageCapturingQuestionFormView] - [SidesheetTab + [<abstract>IScaleQuestionFormViewModel | - +builder: Widget Function(BuildContext) + +isMidValuesClearedInfoVisible: bool ] - [SidesheetTab]o-[Widget Function(BuildContext)] - [NavbarTab]<:-[SidesheetTab] - - [Sidesheet + [ScaleQuestionFormView | - <static>+kDefaultWidth: double; - +titleText: String; - +body: Widget?; - +tabs: List<SidesheetTab>?; - +actionButtons: List<Widget>?; - +width: double?; - +withCloseButton: bool; - +ignoreAppBar: bool; - +collapseSingleTab: bool; - +bodyPadding: EdgeInsets?; - +wrapContent: Widget Function(Widget)? + +formViewModel: QuestionFormViewModel ] - [Sidesheet]o-[<abstract>Widget] - [Sidesheet]o-[EdgeInsets] - [Sidesheet]o-[Widget Function(Widget)?] + [ScaleQuestionFormView]o-[QuestionFormViewModel] - [ReactiveCustomColorPicker + [ChoiceQuestionFormView + | + +formViewModel: QuestionFormViewModel + | + +Widget build() ] - [ReactiveFormField]<:-[ReactiveCustomColorPicker] + [ChoiceQuestionFormView]o-[QuestionFormViewModel] + [<abstract>ConsumerWidget]<:-[ChoiceQuestionFormView] - [TextParagraph + [BoolQuestionFormView | - +text: String?; - +style: TextStyle?; - +selectable: bool; - +span: List<TextSpan>? + +formViewModel: QuestionFormViewModel | +Widget build() ] - [TextParagraph]o-[TextStyle] + [BoolQuestionFormView]o-[QuestionFormViewModel] + [<abstract>ConsumerWidget]<:-[BoolQuestionFormView] - [ConstrainedWidthFlexible + [QuestionFormViewModel | - +minWidth: double; - +maxWidth: double; - +flex: int; - +flexSum: int; - +child: Widget; - +outerConstraints: BoxConstraints + <static>+defaultQuestionType: SurveyQuestionType; + -_titles: Map<FormMode, String Function()>?; + +questionIdControl: FormControl<String>; + +questionTypeControl: FormControl<SurveyQuestionType>; + +questionTextControl: FormControl<String>; + +questionInfoTextControl: FormControl<String>; + +questionBaseControls: Map<String, AbstractControl<dynamic>>; + +isMultipleChoiceControl: FormControl<bool>; + +choiceResponseOptionsArray: FormArray<dynamic>; + +customOptionsMin: int; + +customOptionsMax: int; + +customOptionsInitial: int; + +boolResponseOptionsArray: FormArray<String>; + +imageResponseOptionsArray: FormArray<String>; + <static>+kDefaultMaxRecordingDurationSeconds: int; + <static>+kMaxRecordingDurationSeconds: int; + +audioResponseOptionsArray: FormArray<String>; + +maxRecordingDurationSecondsControl: FormControl<int>; + <static>+kDefaultScaleMinValue: int; + <static>+kDefaultScaleMaxValue: int; + <static>+kNumMidValueControls: int; + <static>+kMidValueDebounceMilliseconds: int; + +scaleMinValueControl: FormControl<int>; + +scaleMaxValueControl: FormControl<int>; + -_scaleRangeControl: FormControl<int>; + +scaleMinLabelControl: FormControl<String>; + +scaleMaxLabelControl: FormControl<String>; + +scaleMidValueControls: FormArray<int>; + +scaleMidLabelControls: FormArray<String?>; + -_scaleResponseOptionsArray: FormArray<int>; + +scaleMinColorControl: FormControl<SerializableColor>; + +scaleMaxColorControl: FormControl<SerializableColor>; + +prevMidValues: List<int?>?; + +freeTextTypeControl: FormControl<FreeTextQuestionType>; + +customRegexControl: FormControl<String>; + +freeTextResponseOptionsArray: FormArray<dynamic>; + +freeTextLengthMin: AbstractControl<int>; + +freeTextLengthMax: AbstractControl<int>; + +freeTextExampleTextControl: FormControl<String>; + <static>+kDefaultFreeTextMinLength: int; + <static>+kDefaultFreeTextMaxLength: int; + +freeTextLengthControl: FormControl<RangeValues>; + -_controlsByQuestionType: Map<SurveyQuestionType, FormGroup>; + -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + -_validationConfigsByQuestionType: Map<SurveyQuestionType, Map<FormValidationSetEnum, List<FormControlValidation>>>; + +form: FormGroup; + +questionId: String; + +questionType: SurveyQuestionType; + +questionTypeControlOptions: List<FormControlOption<SurveyQuestionType>>; + +answerOptionsArray: FormArray<dynamic>; + +answerOptionsControls: List<AbstractControl<dynamic>>; + +validAnswerOptions: List<String>; + +boolOptions: List<AbstractControl<String>>; + +imageOptions: List<AbstractControl<String>>; + +audioOptions: List<AbstractControl<String>>; + +scaleMinValue: int; + +scaleMaxValue: int; + +scaleRange: int; + +scaleAllValueControls: List<AbstractControl<int>>; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +questionTextRequired: dynamic; + +numValidChoiceOptions: dynamic; + +scaleRangeValid: dynamic; + +maxRecordingDurationValid: dynamic; + +titles: Map<FormMode, String>; + +isAddOptionButtonVisible: bool; + +isMidValuesClearedInfoVisible: bool | - +Widget build(); - -double _getWidth() + +String? scaleMidLabelAt(); + -dynamic _onScaleRangeChanged(); + -dynamic _applyInputFormatters(); + -dynamic _updateScaleMidValueControls(); + -Map<String, dynamic>? _validateFreeText(); + -dynamic _onFreeTextLengthChanged(); + -List<FormControlValidation> _getValidationConfig(); + +dynamic onQuestionTypeChanged(); + +dynamic onResponseOptionsChanged(); + -void _updateFormControls(); + +void initControls(); + +void setControlsFrom(); + +QuestionFormData buildFormData(); + +List<ModelAction<dynamic>> availableActions(); + +void onNewItem(); + +void onSelectItem(); + +dynamic save(); + +QuestionFormViewModel createDuplicate() ] - [ConstrainedWidthFlexible]o-[<abstract>Widget] - [ConstrainedWidthFlexible]o-[BoxConstraints] + [QuestionFormViewModel]o-[SurveyQuestionType] + [QuestionFormViewModel]o-[FormControl] + [QuestionFormViewModel]o-[FormArray] + [QuestionFormViewModel]o-[<abstract>AbstractControl] + [QuestionFormViewModel]o-[FormGroup] + [<abstract>ManagedFormViewModel]<:-[QuestionFormViewModel] + [<abstract>IListActionProvider]<:--[QuestionFormViewModel] - [PrimaryButton + [SurveyQuestionFormView | - +text: String; - +icon: IconData?; - +isLoading: bool; - +showLoadingEarliestAfterMs: int; - +onPressed: void Function()?; - +tooltip: String; - +tooltipDisabled: String; - +enabled: bool; - +onPressedFuture: dynamic Function()?; - +innerPadding: EdgeInsets; - +minimumSize: Size?; - +isDisabled: bool + +formViewModel: QuestionFormViewModel; + +isHtmlStyleable: bool ] - [PrimaryButton]o-[IconData] - [PrimaryButton]o-[void Function()?] - [PrimaryButton]o-[dynamic Function()?] - [PrimaryButton]o-[EdgeInsets] - [PrimaryButton]o-[Size] + [SurveyQuestionFormView]o-[QuestionFormViewModel] - [EmptyBody + [<abstract>IFormDataWithSchedule | - +icon: IconData?; - +leading: Widget?; - +leadingSpacing: double?; - +title: String?; - +description: String?; - +button: Widget? + +instanceId: String; + +isTimeLocked: bool; + +timeLockStart: StudyUTimeOfDay?; + +timeLockEnd: StudyUTimeOfDay?; + +hasReminder: bool; + +reminderTime: StudyUTimeOfDay? | - +Widget build() + +Schedule toSchedule() ] - [EmptyBody]o-[IconData] - [EmptyBody]o-[<abstract>Widget] + [<abstract>IFormDataWithSchedule]o-[StudyUTimeOfDay] + [<abstract>IFormData]<:--[<abstract>IFormDataWithSchedule] - [<abstract>FormConsumerWidget + [ScheduleControls | - +Widget build() - ] - - [<abstract>FormConsumerRefWidget + +formViewModel: WithScheduleControls | - +Widget build() + +Widget build(); + -List<FormTableRow> _conditionalTimeRestrictions() ] - [Badge + [ScheduleControls]o-[<abstract>WithScheduleControls] + [<abstract>FormConsumerWidget]<:-[ScheduleControls] + + [<abstract>WithScheduleControls | - +icon: IconData?; - +color: Color?; - +borderRadius: double; - +label: String; - +type: BadgeType; - +padding: EdgeInsets; - +iconSize: double?; - +labelStyle: TextStyle?; - +center: bool + +isTimeRestrictedControl: FormControl<bool>; + +instanceID: FormControl<String>; + +restrictedTimeStartControl: FormControl<Time>; + +restrictedTimeStartPickerControl: FormControl<TimeOfDay>; + +restrictedTimeEndControl: FormControl<Time>; + +restrictedTimeEndPickerControl: FormControl<TimeOfDay>; + +hasReminderControl: FormControl<bool>; + +reminderTimeControl: FormControl<Time>; + +reminderTimePickerControl: FormControl<TimeOfDay>; + -_reminderControlStream: StreamSubscription<dynamic>?; + +scheduleFormControls: Map<String, FormControl<Object>>; + +hasReminder: bool; + +isTimeRestricted: bool; + +timeRestriction: List<Time>? | - +Widget build(); - -Color? _getBackgroundColor(); - -Color _getBorderColor(); - -Color? _getLabelColor() + +void setScheduleControlsFrom(); + -dynamic _initReminderControl() ] - [Badge]o-[IconData] - [Badge]o-[Color] - [Badge]o-[BadgeType] - [Badge]o-[EdgeInsets] - [Badge]o-[TextStyle] + [<abstract>WithScheduleControls]o-[FormControl] + [<abstract>WithScheduleControls]o-[StreamSubscription] - [BadgeType + [<abstract>StudyDesignPageWidget | - +index: int; - <static>+values: List<BadgeType>; - <static>+filled: BadgeType; - <static>+outlined: BadgeType; - <static>+outlineFill: BadgeType; - <static>+plain: BadgeType + +Widget? banner() ] - [BadgeType]o-[BadgeType] - [Enum]<:--[BadgeType] + [<abstract>StudyPageWidget]<:-[<abstract>StudyDesignPageWidget] - [NullHelperDecoration + [StudiesTableColumnHeader + | + +title: String; + +sortable: bool; + +sortAscending: bool; + +sortingActive: bool; + +onSort: void Function()? ] - [InputDecoration]<:-[NullHelperDecoration] + [StudiesTableColumnHeader]o-[void Function()?] - [Collapsible + [DashboardScreen | - +contentBuilder: Widget Function(BuildContext, bool); - +headerBuilder: Widget Function(BuildContext, bool)?; - +title: String?; - +isCollapsed: bool + +filter: StudiesFilter? ] - [Collapsible]o-[Widget Function(BuildContext, bool)] - [Collapsible]o-[Widget Function(BuildContext, bool)?] + [DashboardScreen]o-[StudiesFilter] - [ActionMenuInline + [DashboardScaffold | - +actions: List<ModelAction<dynamic>>; - +iconSize: double?; - +visible: bool; - +splashRadius: double?; - +paddingVertical: double?; - +paddingHorizontal: double? + <static>+compactWidthThreshold: double; + +body: Widget | +Widget build() ] - [StudyULogo + [DashboardScaffold]o-[<abstract>Widget] + + [DashboardController | - +onTap: void Function()? + +studyRepository: IStudyRepository; + +authRepository: IAuthRepository; + +userRepository: IUserRepository; + +router: GoRouter; + -_studiesSubscription: StreamSubscription<List<WrappedModel<Study>>>?; + +searchController: SearchController; + +isSortAscending: bool | - +Widget build() + -dynamic _subscribeStudies(); + +dynamic setSearchText(); + +dynamic setStudiesFilter(); + +dynamic onSelectStudy(); + +dynamic onClickNewStudy(); + +dynamic pinStudy(); + +dynamic pinOffStudy(); + +void setSorting(); + +void filterStudies(); + +void sortStudies(); + +bool isSortingActiveForColumn(); + +bool isPinned(); + +List<ModelAction<dynamic>> availableActions(); + +void dispose() ] - [StudyULogo]o-[void Function()?] + [DashboardController]o-[<abstract>IStudyRepository] + [DashboardController]o-[<abstract>IAuthRepository] + [DashboardController]o-[<abstract>IUserRepository] + [DashboardController]o-[GoRouter] + [DashboardController]o-[StreamSubscription] + [DashboardController]o-[SearchController] + [<abstract>IModelActionProvider]<:--[DashboardController] - [NavbarTab + [StudiesFilter | - +title: String; - +intent: RoutingIntent?; +index: int; - +enabled: bool + <static>+values: List<StudiesFilter> ] - [NavbarTab]o-[RoutingIntent] + [Enum]<:--[StudiesFilter] - [TabbedNavbar + [StudiesTableColumnSize | - +tabs: List<T>; - +selectedTab: T?; - +indicator: BoxDecoration?; - +height: double?; - +disabledBackgroundColor: Color?; - +disabledTooltipText: String?; - +onSelect: void Function(int, T)?; - +labelPadding: EdgeInsets?; - +labelSpacing: double?; - +indicatorSize: TabBarIndicatorSize?; - +isScrollable: bool; - +backgroundColor: Color?; - +labelColorHover: Color?; - +unselectedLabelColorHover: Color? + +collapsed: bool; + +flex: int?; + +width: double? + | + +Widget createContainer() ] - [TabbedNavbar]o-[BoxDecoration] - [TabbedNavbar]o-[Color] - [TabbedNavbar]o-[void Function(int, T)?] - [TabbedNavbar]o-[EdgeInsets] - [TabbedNavbar]o-[TabBarIndicatorSize] - - [HtmlStylingBanner + [StudiesTable | - +isDismissed: bool; - +onDismissed: dynamic Function()? + +itemHeight: double; + +itemPadding: double; + +rowSpacing: double; + +columnSpacing: double; + +compactWidthThreshold: double; + +superCompactWidthThreshold: double; + +compactStatTitleThreshold: double; + +studies: List<Study>; + +onSelect: void Function(Study); + +getActions: List<ModelAction<dynamic>> Function(Study); + +emptyWidget: Widget; + +pinnedStudies: Iterable<String>; + +dashboardController: DashboardController | - +Widget build() + +Widget build(); + -Widget _buildColumnHeader() ] - [HtmlStylingBanner]o-[dynamic Function()?] + [StudiesTable]o-[void Function(Study)] + [StudiesTable]o-[List<ModelAction<dynamic>> Function(Study)] + [StudiesTable]o-[<abstract>Widget] + [StudiesTable]o-[DashboardController] - [<abstract>ISyncIndicatorViewModel + [StudiesTableColumn | - +isDirty: bool; - +lastSynced: DateTime? + +index: int; + <static>+values: List<StudiesTableColumn>; + <static>+pin: StudiesTableColumn; + <static>+title: StudiesTableColumn; + <static>+status: StudiesTableColumn; + <static>+participation: StudiesTableColumn; + <static>+createdAt: StudiesTableColumn; + <static>+enrolled: StudiesTableColumn; + <static>+active: StudiesTableColumn; + <static>+completed: StudiesTableColumn; + <static>+action: StudiesTableColumn ] - [SyncIndicator + [StudiesTableColumn]o-[StudiesTableColumn] + [Enum]<:--[StudiesTableColumn] + + [StudiesTableItem | - +state: AsyncValue<T>; - +lastSynced: DateTime?; - +isDirty: bool; - +animationDuration: int; - +iconSize: double + +study: Study; + +itemHeight: double; + +itemPadding: double; + +rowSpacing: double; + +columnSpacing: double; + +actions: List<ModelAction<dynamic>>; + +columnSizes: List<StudiesTableColumnSize>; + +isPinned: bool; + +onPinnedChanged: void Function(Study, bool)?; + +onTap: void Function(Study)? ] - [SyncIndicator]o-[<abstract>AsyncValue] + [StudiesTableItem]o-[Study] + [StudiesTableItem]o-[void Function(Study, bool)?] + [StudiesTableItem]o-[void Function(Study)?] - [Search - | - +onQueryChanged: dynamic Function(String); - +searchController: SearchController?; - +hintText: String?; - +initialText: String? + [App ] - [Search]o-[dynamic Function(String)] - [Search]o-[SearchController] + [AppContent + ] - [SearchController + [AccountSettingsDialog | - +setText: void Function(String) + +Widget build() ] - [SearchController]o-[void Function(String)] + [<abstract>ConsumerWidget]<:-[AccountSettingsDialog] - [ActionMenuType + [<abstract>IInviteCodeRepository | - +index: int; - <static>+values: List<ActionMenuType>; - <static>+inline: ActionMenuType; - <static>+popup: ActionMenuType + +dynamic isCodeAlreadyUsed() ] - [ActionMenuType]o-[ActionMenuType] - [Enum]<:--[ActionMenuType] + [<abstract>ModelRepository]<:--[<abstract>IInviteCodeRepository] - [SecondaryButton + [InviteCodeRepository | - +text: String; - +icon: IconData?; - +isLoading: bool; - +onPressed: void Function()? + +studyId: String; + +ref: ProviderRef<dynamic>; + +apiClient: StudyUApi; + +authRepository: IAuthRepository; + +studyRepository: IStudyRepository; + +study: Study | - +Widget build() + +String getKey(); + +dynamic isCodeAlreadyUsed(); + +List<ModelAction<dynamic>> availableActions(); + +dynamic emitUpdate() ] - [SecondaryButton]o-[IconData] - [SecondaryButton]o-[void Function()?] + [InviteCodeRepository]o-[<abstract>ProviderRef] + [InviteCodeRepository]o-[<abstract>StudyUApi] + [InviteCodeRepository]o-[<abstract>IAuthRepository] + [InviteCodeRepository]o-[<abstract>IStudyRepository] + [InviteCodeRepository]o-[Study] + [<abstract>ModelRepository]<:-[InviteCodeRepository] + [<abstract>IInviteCodeRepository]<:--[InviteCodeRepository] - [FormTableRow + [InviteCodeRepositoryDelegate | - +label: String?; - +labelBuilder: Widget Function(BuildContext)?; - +labelStyle: TextStyle?; - +labelHelpText: String?; - +input: Widget; - +control: AbstractControl<dynamic>?; - +layout: FormTableRowLayout? + +study: Study; + +apiClient: StudyUApi; + +studyRepository: IStudyRepository + | + +dynamic fetch(); + +dynamic fetchAll(); + +dynamic save(); + +dynamic delete(); + +dynamic onError(); + +StudyInvite createDuplicate(); + +StudyInvite createNewInstance() ] - [FormTableRow]o-[Widget Function(BuildContext)?] - [FormTableRow]o-[TextStyle] - [FormTableRow]o-[<abstract>Widget] - [FormTableRow]o-[<abstract>AbstractControl] - [FormTableRow]o-[FormTableRowLayout] + [InviteCodeRepositoryDelegate]o-[Study] + [InviteCodeRepositoryDelegate]o-[<abstract>StudyUApi] + [InviteCodeRepositoryDelegate]o-[<abstract>IStudyRepository] + [<abstract>IModelRepositoryDelegate]<:-[InviteCodeRepositoryDelegate] - [FormTableLayout - | - +rows: List<FormTableRow>; - +columnWidths: Map<int, TableColumnWidth>; - +rowDivider: Widget?; - +rowLayout: FormTableRowLayout?; - +rowLabelStyle: TextStyle? + [<abstract>IStudyRepository | - +Widget build() + +dynamic launch(); + +dynamic deleteParticipants() ] - [FormTableLayout]o-[<abstract>Widget] - [FormTableLayout]o-[FormTableRowLayout] - [FormTableLayout]o-[TextStyle] + [<abstract>ModelRepository]<:--[<abstract>IStudyRepository] - [FormSectionHeader + [StudyRepository | - +title: String; - +titleTextStyle: TextStyle?; - +helpText: String?; - +divider: bool; - +helpTextDisabled: bool + +apiClient: StudyUApi; + +authRepository: IAuthRepository; + +ref: ProviderRef<dynamic>; + +sortCallback: void Function()? | - +Widget build() + +String getKey(); + +dynamic deleteParticipants(); + +dynamic launch(); + +List<ModelAction<dynamic>> availableActions() ] - [FormSectionHeader]o-[TextStyle] + [StudyRepository]o-[<abstract>StudyUApi] + [StudyRepository]o-[<abstract>IAuthRepository] + [StudyRepository]o-[<abstract>ProviderRef] + [StudyRepository]o-[void Function()?] + [<abstract>ModelRepository]<:-[StudyRepository] + [<abstract>IStudyRepository]<:--[StudyRepository] - [FormLabel + [StudyRepositoryDelegate | - +labelText: String?; - +helpText: String?; - +labelTextStyle: TextStyle?; - +layout: FormTableRowLayout? + +apiClient: StudyUApi; + +authRepository: IAuthRepository | - +Widget build() + +dynamic fetchAll(); + +dynamic fetch(); + +dynamic save(); + +dynamic delete(); + +dynamic onError(); + +Study createNewInstance(); + +Study createDuplicate() ] - [FormLabel]o-[TextStyle] - [FormLabel]o-[FormTableRowLayout] + [StudyRepositoryDelegate]o-[<abstract>StudyUApi] + [StudyRepositoryDelegate]o-[<abstract>IAuthRepository] + [<abstract>IModelRepositoryDelegate]<:-[StudyRepositoryDelegate] - [FormTableRowLayout + [<abstract>StudyUApi | - +index: int; - <static>+values: List<FormTableRowLayout>; - <static>+vertical: FormTableRowLayout; - <static>+horizontal: FormTableRowLayout + +dynamic saveStudy(); + +dynamic fetchStudy(); + +dynamic getUserStudies(); + +dynamic deleteStudy(); + +dynamic saveStudyInvite(); + +dynamic fetchStudyInvite(); + +dynamic deleteStudyInvite(); + +dynamic deleteParticipants(); + +dynamic fetchAppConfig(); + +dynamic fetchUser(); + +dynamic saveUser() ] - [FormTableRowLayout]o-[FormTableRowLayout] - [Enum]<:--[FormTableRowLayout] - - [MouseEventsRegion - | - +onTap: void Function()?; - +onHover: void Function(PointerHoverEvent)?; - +onEnter: void Function(PointerEnterEvent)?; - +onExit: void Function(PointerExitEvent)?; - +autoselectCursor: bool; - +cursor: SystemMouseCursor; - <static>+defaultCursor: SystemMouseCursor; - +autoCursor: SystemMouseCursor + [APIException ] - [MouseEventsRegion]o-[void Function()?] - [MouseEventsRegion]o-[void Function(PointerHoverEvent)?] - [MouseEventsRegion]o-[void Function(PointerEnterEvent)?] - [MouseEventsRegion]o-[void Function(PointerExitEvent)?] - [MouseEventsRegion]o-[SystemMouseCursor] + [Exception]<:--[APIException] - [FormControlLabel - | - +formControl: AbstractControl<dynamic>; - +text: String; - +isClickable: bool; - +textStyle: TextStyle?; - +onClick: void Function(AbstractControl<dynamic>)? - | - +Widget build() + [StudyNotFoundException ] - [FormControlLabel]o-[<abstract>AbstractControl] - [FormControlLabel]o-[TextStyle] - [FormControlLabel]o-[void Function(AbstractControl<dynamic>)?] + [APIException]<:-[StudyNotFoundException] - [SingleColumnLayout - | - <static>+defaultConstraints: BoxConstraints; - <static>+defaultConstraintsNarrow: BoxConstraints; - +body: Widget; - +header: Widget?; - +stickyHeader: bool; - +constraints: BoxConstraints?; - +scroll: bool; - +padding: EdgeInsets? - | - <static>+dynamic fromType() + [MeasurementNotFoundException ] - [SingleColumnLayout]o-[BoxConstraints] - [SingleColumnLayout]o-[<abstract>Widget] - [SingleColumnLayout]o-[EdgeInsets] + [APIException]<:-[MeasurementNotFoundException] - [SingleColumnLayoutType - | - +index: int; - <static>+values: List<SingleColumnLayoutType>; - <static>+boundedWide: SingleColumnLayoutType; - <static>+boundedNarrow: SingleColumnLayoutType; - <static>+stretched: SingleColumnLayoutType; - <static>+split: SingleColumnLayoutType + [QuestionNotFoundException ] - [SingleColumnLayoutType]o-[SingleColumnLayoutType] - [Enum]<:--[SingleColumnLayoutType] + [APIException]<:-[QuestionNotFoundException] - [TwoColumnLayout - | - <static>+defaultDivider: VerticalDivider; - <static>+defaultContentPadding: EdgeInsets; - <static>+slimContentPadding: EdgeInsets; - +leftWidget: Widget; - +rightWidget: Widget; - +dividerWidget: Widget?; - +headerWidget: Widget?; - +flexLeft: int?; - +flexRight: int?; - +constraintsLeft: BoxConstraints?; - +constraintsRight: BoxConstraints?; - +scrollLeft: bool; - +scrollRight: bool; - +paddingLeft: EdgeInsets?; - +paddingRight: EdgeInsets?; - +backgroundColorLeft: Color?; - +backgroundColorRight: Color?; - +stretchHeight: bool + [ConsentItemNotFoundException ] - [TwoColumnLayout]o-[VerticalDivider] - [TwoColumnLayout]o-[EdgeInsets] - [TwoColumnLayout]o-[<abstract>Widget] - [TwoColumnLayout]o-[BoxConstraints] - [TwoColumnLayout]o-[Color] + [APIException]<:-[ConsentItemNotFoundException] - [UnderConstruction - | - +Widget build() + [InterventionNotFoundException ] - [StandardDialog - | - +title: Widget?; - +titleText: String?; - +body: Widget; - +actionButtons: List<Widget>; - +backgroundColor: Color?; - +borderRadius: double?; - +width: double?; - +height: double?; - +minWidth: double; - +minHeight: double; - +maxWidth: double?; - +maxHeight: double?; - +padding: EdgeInsets - | - +Widget build() + [APIException]<:-[InterventionNotFoundException] + + [InterventionTaskNotFoundException ] - [StandardDialog]o-[<abstract>Widget] - [StandardDialog]o-[Color] - [StandardDialog]o-[EdgeInsets] + [APIException]<:-[InterventionTaskNotFoundException] - [IndicatorRangeSliderThumbShape - | - +buildContext: BuildContext; - +start: T; - +end: T - | - +Size getPreferredSize(); - +void paint() + [ReportNotFoundException ] - [IndicatorRangeSliderThumbShape]o-[<abstract>BuildContext] - [<abstract>RangeSliderThumbShape]<:-[IndicatorRangeSliderThumbShape] + [APIException]<:-[ReportNotFoundException] - [<abstract>IWithBanner - | - +Widget? banner() + [ReportSectionNotFoundException ] - [BannerBox - | - +prefixIcon: Widget?; - +body: Widget; - +style: BannerStyle; - +padding: EdgeInsets?; - +noPrefix: bool; - +dismissable: bool; - +isDismissed: bool?; - +onDismissed: dynamic Function()?; - +dismissIconSize: double + [APIException]<:-[ReportSectionNotFoundException] + + [StudyInviteNotFoundException ] - [BannerBox]o-[<abstract>Widget] - [BannerBox]o-[BannerStyle] - [BannerBox]o-[EdgeInsets] - [BannerBox]o-[dynamic Function()?] + [APIException]<:-[StudyInviteNotFoundException] - [BannerStyle - | - +index: int; - <static>+values: List<BannerStyle>; - <static>+warning: BannerStyle; - <static>+info: BannerStyle; - <static>+error: BannerStyle + [UserNotFoundException ] - [BannerStyle]o-[BannerStyle] - [Enum]<:--[BannerStyle] + [APIException]<:-[UserNotFoundException] - [ActionPopUpMenuButton + [StudyUApiClient | - +actions: List<ModelAction<dynamic>>; - +triggerIconColor: Color?; - +triggerIconColorHover: Color?; - +triggerIconSize: double; - +disableSplashEffect: bool; - +hideOnEmpty: bool; - +orientation: Axis; - +elevation: double?; - +splashRadius: double?; - +enabled: bool; - +position: PopupMenuPosition + +supabaseClient: SupabaseClient; + <static>+studyColumns: List<String>; + <static>+studyWithParticipantActivityColumns: List<String>; + +testDelayMilliseconds: int | - +Widget build(); - -Widget _buildPopupMenu() + +dynamic deleteParticipants(); + +dynamic getUserStudies(); + +dynamic fetchStudy(); + +dynamic deleteStudy(); + +dynamic saveStudy(); + +dynamic fetchStudyInvite(); + +dynamic saveStudyInvite(); + +dynamic deleteStudyInvite(); + +dynamic fetchAppConfig(); + +dynamic fetchUser(); + +dynamic saveUser(); + -dynamic _awaitGuarded(); + -dynamic _apiException(); + -dynamic _testDelay() ] - [ActionPopUpMenuButton]o-[Color] - [ActionPopUpMenuButton]o-[Axis] - [ActionPopUpMenuButton]o-[PopupMenuPosition] + [StudyUApiClient]o-[SupabaseClient] + [<abstract>SupabaseClientDependant]<:-[StudyUApiClient] + [<abstract>SupabaseQueryMixin]<:-[StudyUApiClient] + [<abstract>StudyUApi]<:--[StudyUApiClient] - [DismissButton - | - +onPressed: void Function()?; - +text: String? + [<abstract>IAppRepository | - +Widget build() + +dynamic fetchAppConfig(); + +void dispose() ] - [DismissButton]o-[void Function()?] - - [FormScaffold + [AppRepository | - +formViewModel: T; - +actions: List<Widget>?; - +body: Widget; - +drawer: Widget?; - +actionsSpacing: double; - +actionsPadding: double + +apiClient: StudyUApi + | + +dynamic fetchAppConfig(); + +void dispose() ] - [FormScaffold]o-[<abstract>Widget] + [AppRepository]o-[<abstract>StudyUApi] + [<abstract>IAppRepository]<:--[AppRepository] - [AsyncValueWidget + [<abstract>IUserRepository | - +value: AsyncValue<T>; - +data: Widget Function(T); - +error: Widget Function(Object, StackTrace?)?; - +loading: Widget Function()?; - +empty: Widget Function()? + +user: StudyUUser | - +Widget build(); - -Widget _buildDataOrEmptyWidget(); - -Widget _defaultError(); - -Widget _defaultLoad() + +dynamic fetchUser(); + +dynamic saveUser(); + +dynamic updatePreferences() ] - [AsyncValueWidget]o-[<abstract>AsyncValue] - [AsyncValueWidget]o-[Widget Function(T)] - [AsyncValueWidget]o-[Widget Function(Object, StackTrace?)?] - [AsyncValueWidget]o-[Widget Function()?] - - [<abstract>ResultTypes - ] + [<abstract>IUserRepository]o-[StudyUUser] - [MeasurementResultTypes + [UserRepository | - <static>+questionnaire: String; - <static>+values: List<String> + +apiClient: StudyUApi; + +authRepository: IAuthRepository; + +ref: Ref<Object?>; + +user: StudyUUser + | + +dynamic fetchUser(); + +dynamic saveUser(); + +dynamic updatePreferences() ] - [<abstract>ResultTypes]<:-[MeasurementResultTypes] + [UserRepository]o-[<abstract>StudyUApi] + [UserRepository]o-[<abstract>IAuthRepository] + [UserRepository]o-[<abstract>Ref] + [UserRepository]o-[StudyUUser] + [<abstract>IUserRepository]<:--[UserRepository] - [InterventionResultTypes + [PreferenceAction | - <static>+checkmarkTask: String; - <static>+values: List<String> + +index: int; + <static>+values: List<PreferenceAction>; + <static>+pin: PreferenceAction; + <static>+pinOff: PreferenceAction ] - [<abstract>ResultTypes]<:-[InterventionResultTypes] + [PreferenceAction]o-[PreferenceAction] + [Enum]<:--[PreferenceAction] - [StudyExportData + [<abstract>IAuthRepository | - +study: Study; - +measurementsData: List<Map<String, dynamic>>; - +interventionsData: List<Map<String, dynamic>>; - +mediaData: List<String>; - +isEmpty: bool + +allowPasswordReset: bool; + +currentUser: User?; + +isLoggedIn: bool; + +session: Session?; + +serializedSession: String? + | + +dynamic signUp(); + +dynamic signInWith(); + +dynamic signOut(); + +dynamic resetPasswordForEmail(); + +dynamic updateUser(); + +void dispose() ] - [StudyExportData]o-[Study] + [<abstract>IAuthRepository]o-[User] + [<abstract>IAuthRepository]o-[Session] + [<abstract>IAppDelegate]<:-[<abstract>IAuthRepository] - [StudyTemplates + [AuthRepository | - <static>+kUnnamedStudyTitle: String + +supabaseClient: SupabaseClient; + +allowPasswordReset: bool; + +authClient: GoTrueClient; + +session: Session?; + +serializedSession: String?; + +currentUser: User?; + +isLoggedIn: bool | - <static>+Study emptyDraft() + -void _registerAuthListener(); + +dynamic signUp(); + +dynamic signInWith(); + +dynamic signOut(); + +dynamic resetPasswordForEmail(); + +dynamic updateUser(); + +void dispose(); + +dynamic onAppStart() ] - [StudyActionType - | - +index: int; - <static>+values: List<StudyActionType>; - <static>+pin: StudyActionType; - <static>+pinoff: StudyActionType; - <static>+edit: StudyActionType; - <static>+duplicate: StudyActionType; - <static>+duplicateDraft: StudyActionType; - <static>+addCollaborator: StudyActionType; - <static>+export: StudyActionType; - <static>+delete: StudyActionType + [AuthRepository]o-[SupabaseClient] + [AuthRepository]o-[GoTrueClient] + [AuthRepository]o-[Session] + [AuthRepository]o-[User] + [<abstract>IAuthRepository]<:--[AuthRepository] + + [StudyLaunched ] - [StudyActionType]o-[StudyActionType] - [Enum]<:--[StudyActionType] + [<abstract>ModelEvent]<:-[StudyLaunched] - [DropdownMenuItemTheme + [<abstract>SupabaseClientDependant | - +iconTheme: IconThemeData? + +supabaseClient: SupabaseClient ] - [DropdownMenuItemTheme]o-[IconThemeData] - [<abstract>Diagnosticable]<:-[DropdownMenuItemTheme] + [<abstract>SupabaseClientDependant]o-[SupabaseClient] - [ThemeConfig - | - <static>+kMinContentWidth: double; - <static>+kMaxContentWidth: double; - <static>+kHoverFadeFactor: double; - <static>+kMuteFadeFactor: double + [SupabaseQueryError | - <static>+dynamic bodyBackgroundColor(); - <static>+Color modalBarrierColor(); - <static>+Color containerColor(); - <static>+Color colorPickerInitialColor(); - <static>+TextStyle bodyTextMuted(); - <static>+TextStyle bodyTextBackground(); - <static>+double iconSplashRadius(); - <static>+Color sidesheetBackgroundColor(); - <static>+InputDecorationTheme dropdownInputDecorationTheme(); - <static>+DropdownMenuItemTheme dropdownMenuItemTheme() + +statusCode: String?; + +message: String; + +details: dynamic ] - [NoAnimationPageTransitionsBuilder + [Exception]<:--[SupabaseQueryError] + + [<abstract>SupabaseQueryMixin | - +Widget buildTransitions() + +dynamic deleteAll(); + +dynamic getAll(); + +dynamic getById(); + +dynamic getByColumn(); + +List<T> deserializeList(); + +T deserializeObject() ] - [<abstract>PageTransitionsBuilder]<:-[NoAnimationPageTransitionsBuilder] - - [WebTransitionBuilder + [WrappedModel | - +Widget buildTransitions() + -_model: T; + +asyncValue: AsyncValue<T>; + +isLocalOnly: bool; + +isDirty: bool; + +isDeleted: bool; + +lastSaved: DateTime?; + +lastFetched: DateTime?; + +lastUpdated: DateTime?; + +model: T + | + +dynamic markWithError(); + +dynamic markAsLoading(); + +dynamic markAsFetched(); + +dynamic markAsSaved() ] - [<abstract>PageTransitionsBuilder]<:-[WebTransitionBuilder] + [WrappedModel]o-[<abstract>AsyncValue] - [ThemeSettingChange - | - +settings: ThemeSettings + [ModelRepositoryException ] - [ThemeSettingChange]o-[ThemeSettings] - [<abstract>Notification]<:-[ThemeSettingChange] + [Exception]<:--[ModelRepositoryException] - [ThemeProvider - | - +settings: ValueNotifier<ThemeSettings>; - +lightDynamic: ColorScheme?; - +darkDynamic: ColorScheme?; - +pageTransitionsTheme: PageTransitionsTheme; - +shapeMedium: ShapeBorder - | - +Color custom(); - +Color blend(); - +Color source(); - +ColorScheme colors(); - +CardTheme cardTheme(); - +ListTileThemeData listTileTheme(); - +AppBarTheme appBarTheme(); - +SnackBarThemeData snackBarThemeData(); - +TabBarTheme tabBarTheme(); - +BottomAppBarTheme bottomAppBarTheme(); - +BottomNavigationBarThemeData bottomNavigationBarTheme(); - +SwitchThemeData switchTheme(); - +InputDecorationTheme inputDecorationTheme(); - +TextTheme textTheme(); - +DividerThemeData dividerTheme(); - +NavigationRailThemeData navigationRailTheme(); - +DrawerThemeData drawerTheme(); - +IconThemeData iconTheme(); - +CheckboxThemeData checkboxTheme(); - +RadioThemeData radioTheme(); - +TooltipThemeData tooltipTheme(); - +ThemeData light(); - +ThemeData dark(); - +ThemeMode themeMode(); - +ThemeData theme(); - <static>+ThemeProvider of(); - +bool updateShouldNotify() + [ModelNotFoundException ] - [ThemeProvider]o-[ValueNotifier] - [ThemeProvider]o-[ColorScheme] - [ThemeProvider]o-[PageTransitionsTheme] - [ThemeProvider]o-[<abstract>ShapeBorder] - [<abstract>InheritedWidget]<:-[ThemeProvider] + [ModelRepositoryException]<:--[ModelNotFoundException] - [ThemeSettings + [<abstract>IModelRepository | - +sourceColor: Color; - +themeMode: ThemeMode + +String getKey(); + +WrappedModel<T>? get(); + +dynamic fetchAll(); + +dynamic fetch(); + +dynamic save(); + +dynamic delete(); + +dynamic duplicateAndSave(); + +dynamic duplicateAndSaveFromRemote(); + +Stream<WrappedModel<T>> watch(); + +Stream<List<WrappedModel<T>>> watchAll(); + +Stream<ModelEvent<T>> watchChanges(); + +Stream<ModelEvent<T>> watchAllChanges(); + +dynamic ensurePersisted(); + +void dispose() ] - [ThemeSettings]o-[Color] - [ThemeSettings]o-[ThemeMode] + [<abstract>IModelActionProvider]<:--[<abstract>IModelRepository] - [CustomColor - | - +name: String; - +color: Color; - +blend: bool + [<abstract>IModelRepositoryDelegate | - +Color value() + +dynamic fetchAll(); + +dynamic fetch(); + +dynamic save(); + +dynamic delete(); + +T createNewInstance(); + +T createDuplicate(); + +dynamic onError() ] - [CustomColor]o-[Color] - - [LanguagePicker + [<abstract>ModelRepository | - +languagePickerType: LanguagePickerType; - +iconColor: Color?; - +offset: Offset? + +delegate: IModelRepositoryDelegate<T>; + -_allModelsStreamController: BehaviorSubject<List<WrappedModel<T>>>; + -_allModelEventsStreamController: BehaviorSubject<ModelEvent<T>>; + +modelStreamControllers: Map<String, BehaviorSubject<WrappedModel<T>>>; + +modelEventsStreamControllers: Map<String, BehaviorSubject<ModelEvent<T>>>; + -_allModels: Map<String, WrappedModel<T>> + | + +WrappedModel<T>? get(); + +dynamic fetchAll(); + +dynamic fetch(); + +dynamic save(); + +dynamic delete(); + +dynamic duplicateAndSave(); + +dynamic duplicateAndSaveFromRemote(); + +Stream<List<WrappedModel<T>>> watchAll(); + +Stream<WrappedModel<T>> watch(); + +Stream<ModelEvent<T>> watchAllChanges(); + +Stream<ModelEvent<T>> watchChanges(); + -dynamic _buildModelSpecificController(); + +dynamic ensurePersisted(); + +WrappedModel<T> upsertLocally(); + +List<WrappedModel<T>> upsertAllLocally(); + +dynamic emitUpdate(); + +dynamic emitModelEvent(); + +dynamic emitError(); + +void dispose(); + +List<ModelAction<dynamic>> availableActions() ] - [LanguagePicker]o-[LanguagePickerType] - [LanguagePicker]o-[Color] - [LanguagePicker]o-[Offset] + [<abstract>ModelRepository]o-[<abstract>IModelRepositoryDelegate] + [<abstract>ModelRepository]o-[BehaviorSubject] + [<abstract>IModelRepository]<:-[<abstract>ModelRepository] - [LanguagePickerType + [<abstract>ModelEvent | - +index: int; - <static>+values: List<LanguagePickerType>; - <static>+field: LanguagePickerType; - <static>+icon: LanguagePickerType + +modelId: String; + +model: T ] - [LanguagePickerType]o-[LanguagePickerType] - [Enum]<:--[LanguagePickerType] - - [PlatformLocaleMobile - | - +Locale getPlatformLocale() + [IsFetched ] - [<abstract>PlatformLocale]<:--[PlatformLocaleMobile] + [<abstract>ModelEvent]<:-[IsFetched] - [<abstract>PlatformLocale - | - +Locale getPlatformLocale() + [IsSaving ] - [PlatformLocaleWeb - | - +Locale getPlatformLocale() + [<abstract>ModelEvent]<:-[IsSaving] + + [IsSaved ] - [<abstract>PlatformLocale]<:--[PlatformLocaleWeb] + [<abstract>ModelEvent]<:-[IsSaved] - [AppTranslation - | - <static>+dynamic init() + [IsDeleted ] + [<abstract>ModelEvent]<:-[IsDeleted] + - + - + - + + + + + - + - + - + - + + + + + - + - + - + - + - + - + - + + + + - + + - + - - - + - + - - + + + - - + - + - + + + + + - + - - - - - - - - - - - + - - - - - - - - - - - - + + + - + + - + - - - - - - - + - + - + - + - + - + - + - + - - - - - - - - - - - + - + - - - + - + - + - + - - - - - + - + - - - + - + - - - - - + - + - + - + - - - + - + - + - + - + - + - + - - - - + - - - - - - + - + - + - + - + - + - + - + - + - - - - - - + - - + - + - + - + - + - + - - - - - + - - - - - - - - + - - - - - - + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + - - - - - - - - - - + - + - - + + + - - - + + + - - + - + - + - + - + - + - + - + - - - + - - + + - + - + - + - - - + - + - + - + - + - + - + - + - + - + - + - - + + - - - - + - - + - - - - + - - + - + - + - + - + - + - + - - - - - - - - - - + - - + - + - + - + - + - + + + + - + + - + - + - + - + - + - + - + - + - + - - - - - + - + - + - + - - - + - + - - - + - + - + + + - + - + - + - + - + - + - + - + + + - + - - - - - + - + - + - + - + + + - + - + - + - - - + - + - + - + - + - + - - - - + + + + + - - + + + - + - + - - + + - + - + + + - + - + - + - + - + - + - + - + - + - + - - + + - - - - + - - + - + - - - + - + - - - + - + - - - + - + - + - + - + - + - + - + - - - + - + - + - + - + - + - - - - - - - + - + - + - + - + - + - + - + - + - + - - - + + - + + - + - + + + + + - + - + - + - - - - + + + - - + - + - - + + + - - - + + + - - + - + - - - + - + - + - + - + - + - + - + - + - + - - + + + - - + - + - + - - - - + + + - + + - + - + - + - - - + - + - + - + - - - + - - - - + + - + - - - - - + - + - + - + - + - + - + - + - + - + - + - + - + + + - - - - - - - - - - - - + - - + - - + + - + - + - + + + + + + + + + + + - + - - - + + + + + + + + + + - - - + + + + + + + + + - - + + + - + - + - + - - - + - + - + - + - + + + - + - - + + + - - - - + - + - + - + - + - + - + + + + + - + - + + + - + - - - - - + - - - + + + + - - - + + + - - + - + - + - + - + + + + + - + - + - + - + + + + + + + + + - + - - - - + + + + + + + + + + + + + - - - + + + + + - - - + + + + + - - - - + + + - + - - + + + + + - - + - + - - - + - + - + - + - - - - - + - + - - + + + + + + + - - + - + - + - + - + - + - + - + - - - + - + - - - + - - + + - + - + + + + + + - - + - - - - + + - + - + - + - + - + - - - + - + - - - + - + - + - + - + - + - + - + - - - - - - - - + + + - + + - + - - - + + + + + + + + + + + + + + + + - - + + + - + + + + - - - - + - + - - + + - + - + + + - + - + - + - + - + - + - + - - - - + + + - - + - - - + + + + - - + - - + + - + - + - + - - - + + + + - + + + + - + - + + + - + - + - - - - - - + - - - + + + - - + - + - + - + - - + + + - - - + + + - - - + + + - - + + + + + + + + + - + - - - + + + - + - + - + - + - + - + - + - + - + - - - + - + - + - + - + - + - + + + + + - + - + - + + + + + - + - - + + - + - - - + - + - - - - - + - + - + - + - - + + + - - + - + + + + + - + - - + + - + - + - + - - - + - + - + - + - - - + - + - + - + - + + + - + - + - + - + - + - + - + - - - - + + + + + + + - - + + + - + - - + + + - - - - - - - - - - + - + - - - + - + - - - + - + - + - + - - - + + + + + + + + + - + - - - + - + - - + + + + + - - + + + + + - + - - - + - + - - - + - + - - - + - + - + - + + + + + - + - + - + - + - + - - + + - + - - - + - - - - + - - + + + + + - + - + - + - + + + - + - - - + + - + + - + - + - + - - - + + - + + - + - + - + - + - + - + - + - + - + - - + + - + - - - - - - - - - - - - + + + + + + + - + + + + - + - + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + + + + + - + - + + + - + - + - + - + - - - - + - - + + + - + - + - + - - + + + - - + - + - - - + - + - + - + - + - + - + - + + + + + + + + + + - + + - + - + - + + + + - - + - + - - - - + + + - + + - + - + - + - - - + + - - - + + - + - - - - - - - + + - - - + + + - + + - + - + - + - + - + - + + + + + - + - - - - - + + - - - + + + - - - + + + - - - + + + - + + - + - + - + - + + + - + - + + + - + - + - + - - - - - + - + + + + + + + - + - + - - - - - - + + - + - - + + + + - + - + - + - + - + - + - + - + - + - - - + + + + - - - + + + - - - + + + - + + - + - + - + - + + + - + - + - + - + + + + + - + - + + + + + - + - + - + - + - + - + - - - - + + - + - - - - - - - + + + + - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - - + + + + + + - - - - - + + + - - - + + + - + + - + - - - + - + - - - + + - - - + + + - - - + + + - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + + + - + + - + - + - + + + + + + + + + - + - - - - + + - + + + + - + + + + + + + + + + - + - + + + - + - + + + - + - + + + - + - + + + - + + + + - + + - + - + + + - + - + - + - + + + - + - + + + - + - + - + - + - + - + - + - + - + + + - + - - + + - + - + - + - - - + + - + + - + - + + + - + - + - + - + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - + - - + - + - - - + + - - - + + + - + + - + - + - + - + - + - + - + - + - + - - - + + - + + - + - + - + - + - + + + - + - - + + - + - + - + - + - + - + - + - + - + - - - + + + + - + + - + - + - + - + - + - - - - - + + + + - + + - + - + - + - + - + - + - + + + - - - - - - + - + + - + - + - + - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + - + - - - + + - + + - + - + - + - + - + - - - - - + - + - + - + - - - - - - + - - - - - - - + + - + - - - - - + + - + + - + - + - + - + + + - + - - - + - + - + - + - + - + - - - + + - + + + + - + - - - + + - + + - + - + - + - + - + - - - - - - - - - - - GoRouteParamEnum - - - - - - +String toRouteParam() - +String toShortString() - - - + - - - - - - - - RoutingIntents - - - - - - <static>+root: RoutingIntent - <static>+studies: RoutingIntent - <static>+studiesShared: RoutingIntent - <static>+publicRegistry: RoutingIntent - <static>+study: RoutingIntent Function(String) - <static>+studyEdit: RoutingIntent Function(String) - <static>+studyEditInfo: RoutingIntent Function(String) - <static>+studyEditEnrollment: RoutingIntent Function(String) - <static>+studyEditInterventions: RoutingIntent Function(String) - <static>+studyEditIntervention: RoutingIntent Function(String, String) - <static>+studyEditMeasurements: RoutingIntent Function(String) - <static>+studyEditReports: RoutingIntent Function(String) - <static>+studyEditMeasurement: RoutingIntent Function(String, String) - <static>+studyTest: RoutingIntent Function(String, {String? appRoute}) - <static>+studyRecruit: RoutingIntent Function(String) - <static>+studyMonitor: RoutingIntent Function(String) - <static>+studyAnalyze: RoutingIntent Function(String) - <static>+studySettings: RoutingIntent Function(String) - <static>+accountSettings: RoutingIntent - <static>+studyNew: RoutingIntent - <static>+login: RoutingIntent - <static>+signup: RoutingIntent - <static>+passwordForgot: RoutingIntent - <static>+passwordForgot2: RoutingIntent Function(String) - <static>+passwordRecovery: RoutingIntent - <static>+error: RoutingIntent Function(Exception) - - - + + + + - - - - - - - - - RoutingIntent - - - - - - +route: GoRoute - +params: Map<String, String> - +queryParams: Map<String, String> - +dispatch: RoutingIntentDispatch? - +extra: Object? - +routeName: String - +arguments: Map<String, String> - +props: List<Object?> - - - - - - -dynamic _validateRoute() - +bool matches() - - - + + + - - - + + + + + + + + + + + + + + - - - RoutingIntent Function(String) + + + Config - - - - - - - - RoutingIntent Function(String, String) + + + <static>+isDebugMode: bool + <static>+defaultLocale: Set<String> + <static>+supportedLocales: Map<String, String> + <static>+newStudyId: String + <static>+newModelId: String + <static>+minSplashTime: int + <static>+formAutosaveDebounce: int - - - + + + - - - RoutingIntent Function(String, {String? appRoute}) + + + ResultTypes - - - + + + + - - - RoutingIntent Function(Exception) + + + MeasurementResultTypes - - - - - - - - GoRoute + + + <static>+questionnaire: String + <static>+values: List<String> - - - - + + + + - - - RoutingIntentDispatch + + + InterventionResultTypes - - - +index: int - <static>+values: List<RoutingIntentDispatch> - <static>+go: RoutingIntentDispatch - <static>+push: RoutingIntentDispatch + + + <static>+checkmarkTask: String + <static>+values: List<String> - - - + + + + - - - Equatable + + + StudyExportData - - - - - - - - Enum + + + +study: Study + +measurementsData: List<Map<String, dynamic>> + +interventionsData: List<Map<String, dynamic>> + +mediaData: List<String> + +isEmpty: bool - - - - - - - - RouterKeys - - + + + - - - <static>+studyKey: ValueKey<String> - <static>+authKey: ValueKey<String> + + + Study - - - + + + + + - - - ValueKey + + + StudyTemplates - - - - - - - - - RouteParams + + + <static>+kUnnamedStudyTitle: String - - - <static>+studiesFilter: String - <static>+studyId: String - <static>+measurementId: String - <static>+interventionId: String - <static>+testAppRoute: String + + + <static>+Study emptyDraft() - - - - - - - - - RouterConf - - + + + + - - - <static>+router: GoRouter - <static>+routes: List<GoRoute> - <static>+publicRoutes: List<GoRoute> - <static>+privateRoutes: List<GoRoute> + + + StudyActionType - - - <static>+GoRoute route() + + + +index: int + <static>+values: List<StudyActionType> + <static>+pin: StudyActionType + <static>+pinoff: StudyActionType + <static>+edit: StudyActionType + <static>+duplicate: StudyActionType + <static>+duplicateDraft: StudyActionType + <static>+addCollaborator: StudyActionType + <static>+export: StudyActionType + <static>+delete: StudyActionType - - - + + + - - - GoRouter + + + Enum - - - - + + + + - - - StudyFormRouteArgs + + + Notifications - - - +studyId: String + + + <static>+credentialsInvalid: SnackbarIntent + <static>+userAlreadyRegistered: SnackbarIntent + <static>+passwordReset: SnackbarIntent + <static>+passwordResetSuccess: SnackbarIntent + <static>+studyDeleted: SnackbarIntent + <static>+inviteCodeDeleted: SnackbarIntent + <static>+inviteCodeClipped: SnackbarIntent + <static>+studyDeleteConfirmation: AlertIntent - - - - + + + + - - - QuestionFormRouteArgs + + + SnackbarIntent - - - +questionId: String + + + +duration: int? - - - + + + + - - - ScreenerQuestionFormRouteArgs + + + AlertIntent + + + + + + +title: String + +dismissOnAction: bool + +isDestructive: dynamic - - - - + + + + - - - ConsentItemFormRouteArgs + + + NotificationDefaultActions - - - +consentId: String + + + <static>+cancel: NotificationAction - - - - + + + + - - - MeasurementFormRouteArgs + + + NotificationAction - - - +measurementId: String + + + +label: String + +onSelect: dynamic Function() + +isDestructive: bool - - - - + + + + - - - SurveyQuestionFormRouteArgs + + + INotificationService - - - +questionId: String + + + +void showMessage() + +void show() + +Stream<NotificationIntent> watchNotifications() + +void dispose() - - - - + + + + + - - - InterventionFormRouteArgs + + + NotificationService - - - +interventionId: String + + + -_streamController: BehaviorSubject<NotificationIntent> - - - - - - - - - InterventionTaskFormRouteArgs + + + +Stream<NotificationIntent> watchNotifications() + +void showMessage() + +void show() + +void dispose() - - - +taskId: String + + + + + + + + BehaviorSubject - - - - + + + + + - - - ReportItemFormRouteArgs + + + NotificationIntent - - - +sectionId: String + + + +message: String? + +customContent: Widget? + +icon: IconData? + +actions: List<NotificationAction>? + +type: NotificationType - - - - - - - - - - JsonFileLoader + + + +void register() - - - +jsonAssetsPath: String - - + + + + - - - +dynamic loadJson() - +dynamic parseJsonMapFromAssets() - +dynamic parseJsonListFromAssets() + + + Widget - - - - - + + + - - - CombinedStreamNotifier + + + IconData - - - -_subscriptions: List<StreamSubscription<dynamic>> + + + + + + + + + NotificationType - - - +void dispose() + + + +index: int + <static>+values: List<NotificationType> + <static>+snackbar: NotificationType + <static>+alert: NotificationType + <static>+custom: NotificationType - - - + + + - - - ChangeNotifier + + + dynamic Function() - - - - + + + + - - - IProviderArgsResolver + + + IClipboardService - - - +R provide() + + + +dynamic copy() - - - - - + + + + - - - SuppressedBehaviorSubject + + + ClipboardService - - - +subject: BehaviorSubject<T> - +didSuppressInitialEvent: bool - -_controller: StreamController<T> + + + +dynamic copy() - - - -StreamController<T> _buildDerivedController() - +dynamic close() + + + + + + + + + NotificationDispatcher - - - - - - - - BehaviorSubject + + + +child: Widget? + +snackbarInnerPadding: double + +snackbarWidth: double? + +snackbarBehavior: SnackBarBehavior + +snackbarDefaultDuration: int - - - + + + - - - StreamController + + + SnackBarBehavior - - - - + + + + - - - Time + + + Assets - - - <static>+dynamic fromTimeOfDay() - +Map<String, dynamic> toJson() - <static>+Time fromJson() + + + <static>+logoWide: String - - - + + + + + - - - TimeOfDay + + + AsyncValueWidget - - - - - - - - - TimeValueAccessor + + + +value: AsyncValue<T> + +data: Widget Function(T) + +error: Widget Function(Object, StackTrace?)? + +loading: Widget Function()? + +empty: Widget Function()? - - - +String modelToViewValue() - +Time? viewToModelValue() - -String _addLeadingZeroIfNeeded() + + + +Widget build() + -Widget _buildDataOrEmptyWidget() + -Widget _defaultError() + -Widget _defaultLoad() - - - + + + - - - ControlValueAccessor + + + AsyncValue - - - - - + + + - - - Tuple + + + Widget Function(T) - - - +first: T1 - +second: T2 - +props: List<Object?> + + + + + + + + Widget Function(Object, StackTrace?)? - - - +Map<String, dynamic> toJson() - <static>+Tuple<dynamic, dynamic> fromJson() - +Tuple<T1, T2> copy() - +Tuple<T1, T2> copyWith() + + + + + + + + Widget Function()? - - - - - + + + + + - - - OptimisticUpdate + + + FormControlLabel - - - +applyOptimistic: void Function() - +apply: dynamic Function() - +rollback: void Function() - +onUpdate: void Function()? - +onError: void Function(Object, StackTrace?)? - +rethrowErrors: bool - +runOptimistically: bool - +completeFutureOptimistically: bool + + + +formControl: AbstractControl<dynamic> + +text: String + +isClickable: bool + +textStyle: TextStyle? + +onClick: void Function(AbstractControl<dynamic>)? - - - +dynamic execute() - -void _runUpdateHandlerIfAny() + + + +Widget build() - - - + + + - - - void Function() + + + AbstractControl - - - + + + - - - dynamic Function() + + + TextStyle - - - + + + - - - void Function()? + + + void Function(AbstractControl<dynamic>)? - - - + + + + + - - - void Function(Object, StackTrace?)? + + + ActionPopUpMenuButton - - - - - - - - - SerializableColor + + + +actions: List<ModelAction<dynamic>> + +triggerIconColor: Color? + +triggerIconColorHover: Color? + +triggerIconSize: double + +disableSplashEffect: bool + +hideOnEmpty: bool + +orientation: Axis + +elevation: double? + +splashRadius: double? + +enabled: bool + +position: PopupMenuPosition - - - +Map<String, dynamic> toJson() - <static>+SerializableColor fromJson() + + + +Widget build() + -Widget _buildPopupMenu() - + - + Color - - - - + + + - - - FileFormatEncoder + + + Axis - - - +dynamic encodeAsync() - +String encode() - +dynamic call() + + + + + + + + PopupMenuPosition - - - - + + + + - - - CSVStringEncoder + + + Search - - - +String encode() + + + +onQueryChanged: dynamic Function(String) + +searchController: SearchController? + +hintText: String? + +initialText: String? - - - - - - - - JsonStringEncoder - - + + + - - - +String encode() + + + dynamic Function(String) - - - - - - - - - NumericalRangeFormatter - - + + + + - - - +min: int? - +max: int? + + + SearchController - - - +TextEditingValue formatEditUpdate() + + + +setText: void Function(String) - - - + + + - - - TextInputFormatter + + + void Function(String) - - - - + + + + - - - StudySequenceFormatter + + + FormScaffold - - - +TextEditingValue formatEditUpdate() + + + +formViewModel: T + +actions: List<Widget>? + +body: Widget + +drawer: Widget? + +actionsSpacing: double + +actionsPadding: double - - - - - - - - - CountWhereValidator - - + + + + + - - - +predicate: bool Function(T?) - +minCount: int? - +maxCount: int? - <static>+kValidationMessageMinCount: String - <static>+kValidationMessageMaxCount: String + + + ConstrainedWidthFlexible - - - +Map<String, dynamic>? validate() + + + +minWidth: double + +maxWidth: double + +flex: int + +flexSum: int + +child: Widget + +outerConstraints: BoxConstraints - - - - - - - - bool Function(T?) + + + +Widget build() + -double _getWidth() - - - + + + - - - Validator + + + BoxConstraints - - - - + + + + - - - Patterns + + + PrimaryButton - - - <static>+timeFormatString: String - <static>+emailFormatString: String - <static>+url: String + + + +text: String + +icon: IconData? + +isLoading: bool + +showLoadingEarliestAfterMs: int + +onPressed: void Function()? + +tooltip: String + +tooltipDisabled: String + +enabled: bool + +onPressedFuture: dynamic Function()? + +innerPadding: EdgeInsets + +minimumSize: Size? + +isDisabled: bool - - - - - + + + - - - ExecutionLimiter + + + void Function()? - - - +milliseconds: int - <static>-_timer: Timer? - - + + + + - - - +void dispose() + + + dynamic Function()? - - - + + + - - - Timer + + + EdgeInsets - - - - - + + + - - - Debouncer + + + Size - - - +leading: bool - +cancelUncompleted: bool - -_uncompletedFutureOperation: CancelableOperation<dynamic>? + + + + + + + + + FormTableRow - - - +dynamic call() + + + +label: String? + +labelBuilder: Widget Function(BuildContext)? + +labelStyle: TextStyle? + +labelHelpText: String? + +input: Widget + +control: AbstractControl<dynamic>? + +layout: FormTableRowLayout? - - - + + + - - - CancelableOperation + + + Widget Function(BuildContext)? - - - - + + + + - - - Throttler + + + FormTableRowLayout - - - +dynamic call() + + + +index: int + <static>+values: List<FormTableRowLayout> + <static>+vertical: FormTableRowLayout + <static>+horizontal: FormTableRowLayout - - - - + + + + + - - - ModelAction + + + FormTableLayout - - - +type: T - +label: String - +icon: IconData? - +onExecute: Function - +isAvailable: bool - +isDestructive: bool + + + +rows: List<FormTableRow> + +columnWidths: Map<int, TableColumnWidth> + +rowDivider: Widget? + +rowLayout: FormTableRowLayout? + +rowLabelStyle: TextStyle? - - - - - - - - IconData + + + +Widget build() - - - - + + + + + - - - IModelActionProvider + + + FormSectionHeader - - - +List<ModelAction<dynamic>> availableActions() + + + +title: String + +titleTextStyle: TextStyle? + +helpText: String? + +divider: bool + +helpTextDisabled: bool + + + + + + +Widget build() - - - - + + + + + - - - IListActionProvider + + + FormLabel + + + + + + +labelText: String? + +helpText: String? + +labelTextStyle: TextStyle? + +layout: FormTableRowLayout? - - - +void onSelectItem() - +void onNewItem() + + + +Widget build() - - - - + + + + + - - - ModelActionType + + + DismissButton - - - +index: int - <static>+values: List<ModelActionType> - <static>+edit: ModelActionType - <static>+delete: ModelActionType - <static>+remove: ModelActionType - <static>+duplicate: ModelActionType - <static>+clipboard: ModelActionType - <static>+primary: ModelActionType + + + +onPressed: void Function()? + +text: String? + + + + + + +Widget build() - - - - + + + + + - - - Config + + + Badge - - - <static>+isDebugMode: bool - <static>+defaultLocale: Set<String> - <static>+supportedLocales: Map<String, String> - <static>+newStudyId: String - <static>+newModelId: String - <static>+minSplashTime: int - <static>+formAutosaveDebounce: int + + + +icon: IconData? + +color: Color? + +borderRadius: double + +label: String + +type: BadgeType + +padding: EdgeInsets + +iconSize: double? + +labelStyle: TextStyle? + +center: bool - - - - - - - - - - IAuthRepository + + + +Widget build() + -Color? _getBackgroundColor() + -Color _getBorderColor() + -Color? _getLabelColor() - - - +allowPasswordReset: bool - +currentUser: User? - +isLoggedIn: bool - +session: Session? - +serializedSession: String? + + + + + + + + + BadgeType - - - +dynamic signUp() - +dynamic signInWith() - +dynamic signOut() - +dynamic resetPasswordForEmail() - +dynamic updateUser() - +void dispose() + + + +index: int + <static>+values: List<BadgeType> + <static>+filled: BadgeType + <static>+outlined: BadgeType + <static>+outlineFill: BadgeType + <static>+plain: BadgeType - - - + + + + + - - - User + + + StandardDialog - - - - + + + +title: Widget? + +titleText: String? + +body: Widget + +actionButtons: List<Widget> + +backgroundColor: Color? + +borderRadius: double? + +width: double? + +height: double? + +minWidth: double + +minHeight: double + +maxWidth: double? + +maxHeight: double? + +padding: EdgeInsets + + - - - Session + + + +Widget build() - - - - + + + + - - - IAppDelegate + + + ISyncIndicatorViewModel - - - +dynamic onAppStart() + + + +isDirty: bool + +lastSynced: DateTime? - - - - - - - - - AuthRepository - - + + + + - - - +supabaseClient: SupabaseClient - +allowPasswordReset: bool - +authClient: GoTrueClient - +session: Session? - +serializedSession: String? - +currentUser: User? - +isLoggedIn: bool + + + SyncIndicator - - - -void _registerAuthListener() - +dynamic signUp() - +dynamic signInWith() - +dynamic signOut() - +dynamic resetPasswordForEmail() - +dynamic updateUser() - +void dispose() - +dynamic onAppStart() + + + +state: AsyncValue<T> + +lastSynced: DateTime? + +isDirty: bool + +animationDuration: int + +iconSize: double - - - + + + + - - - SupabaseClient + + + IWithBanner - - - - - - - - GoTrueClient + + + +Widget? banner() - - - - + + + + - - - IInviteCodeRepository + + + BannerBox - - - +dynamic isCodeAlreadyUsed() + + + +prefixIcon: Widget? + +body: Widget + +style: BannerStyle + +padding: EdgeInsets? + +noPrefix: bool + +dismissable: bool + +isDismissed: bool? + +onDismissed: dynamic Function()? + +dismissIconSize: double - - - - - + + + + - - - ModelRepository + + + BannerStyle - - - +delegate: IModelRepositoryDelegate<T> - -_allModelsStreamController: BehaviorSubject<List<WrappedModel<T>>> - -_allModelEventsStreamController: BehaviorSubject<ModelEvent<T>> - +modelStreamControllers: Map<String, BehaviorSubject<WrappedModel<T>>> - +modelEventsStreamControllers: Map<String, BehaviorSubject<ModelEvent<T>>> - -_allModels: Map<String, WrappedModel<T>> + + + +index: int + <static>+values: List<BannerStyle> + <static>+warning: BannerStyle + <static>+info: BannerStyle + <static>+error: BannerStyle - - - +WrappedModel<T>? get() - +dynamic fetchAll() - +dynamic fetch() - +dynamic save() - +dynamic delete() - +dynamic duplicateAndSave() - +dynamic duplicateAndSaveFromRemote() - +Stream<List<WrappedModel<T>>> watchAll() - +Stream<WrappedModel<T>> watch() - +Stream<ModelEvent<T>> watchAllChanges() - +Stream<ModelEvent<T>> watchChanges() - -dynamic _buildModelSpecificController() - +dynamic ensurePersisted() - +WrappedModel<T> upsertLocally() - +List<WrappedModel<T>> upsertAllLocally() - +dynamic emitUpdate() - +dynamic emitModelEvent() - +dynamic emitError() - +void dispose() - +List<ModelAction<dynamic>> availableActions() + + + + + + + + + + ActionMenuInline + + + + + + +actions: List<ModelAction<dynamic>> + +iconSize: double? + +visible: bool + +splashRadius: double? + +paddingVertical: double? + +paddingHorizontal: double? + + + + + + +Widget build() - - - - - + + + + - - - InviteCodeRepository + + + Collapsible - - - +studyId: String - +ref: ProviderRef<dynamic> - +apiClient: StudyUApi - +authRepository: IAuthRepository - +studyRepository: IStudyRepository - +study: Study + + + +contentBuilder: Widget Function(BuildContext, bool) + +headerBuilder: Widget Function(BuildContext, bool)? + +title: String? + +isCollapsed: bool - - - +String getKey() - +dynamic isCodeAlreadyUsed() - +List<ModelAction<dynamic>> availableActions() - +dynamic emitUpdate() + + + + + + + + Widget Function(BuildContext, bool) - - - + + + - - - ProviderRef + + + Widget Function(BuildContext, bool)? - - - - + + + + - - - StudyUApi + + + NavbarTab - - - +dynamic saveStudy() - +dynamic fetchStudy() - +dynamic getUserStudies() - +dynamic deleteStudy() - +dynamic saveStudyInvite() - +dynamic fetchStudyInvite() - +dynamic deleteStudyInvite() - +dynamic deleteParticipants() - +dynamic fetchAppConfig() - +dynamic fetchUser() - +dynamic saveUser() + + + +title: String + +intent: RoutingIntent? + +index: int + +enabled: bool - - - - + + + + + - - - IStudyRepository + + + RoutingIntent - - - +dynamic launch() - +dynamic deleteParticipants() + + + +route: GoRoute + +params: Map<String, String> + +queryParams: Map<String, String> + +dispatch: RoutingIntentDispatch? + +extra: Object? + +routeName: String + +arguments: Map<String, String> + +props: List<Object?> + + + + + + -dynamic _validateRoute() + +bool matches() - - - + + + + - - - Study + + + TabbedNavbar + + + + + + +tabs: List<T> + +selectedTab: T? + +indicator: BoxDecoration? + +height: double? + +disabledBackgroundColor: Color? + +disabledTooltipText: String? + +onSelect: void Function(int, T)? + +labelPadding: EdgeInsets? + +labelSpacing: double? + +indicatorSize: TabBarIndicatorSize? + +isScrollable: bool + +backgroundColor: Color? + +labelColorHover: Color? + +unselectedLabelColorHover: Color? - - - - - + + + - - - InviteCodeRepositoryDelegate + + + BoxDecoration - - - +study: Study - +apiClient: StudyUApi - +studyRepository: IStudyRepository + + + + + + + + void Function(int, T)? - - - +dynamic fetch() - +dynamic fetchAll() - +dynamic save() - +dynamic delete() - +dynamic onError() - +StudyInvite createDuplicate() - +StudyInvite createNewInstance() + + + + + + + + TabBarIndicatorSize - - - - + + + + - - - IModelRepositoryDelegate + + + SidesheetTab - - - +dynamic fetchAll() - +dynamic fetch() - +dynamic save() - +dynamic delete() - +T createNewInstance() - +T createDuplicate() - +dynamic onError() + + + +builder: Widget Function(BuildContext) - - - + + + - - - StudyLaunched + + + Widget Function(BuildContext) - - - - + + + + - - - ModelEvent + + + Sidesheet - - - +modelId: String - +model: T + + + <static>+kDefaultWidth: double + +titleText: String + +body: Widget? + +tabs: List<SidesheetTab>? + +actionButtons: List<Widget>? + +width: double? + +withCloseButton: bool + +ignoreAppBar: bool + +collapseSingleTab: bool + +bodyPadding: EdgeInsets? + +wrapContent: Widget Function(Widget)? - - - - - + + + - - - WrappedModel + + + Widget Function(Widget)? - - - -_model: T - +asyncValue: AsyncValue<T> - +isLocalOnly: bool - +isDirty: bool - +isDeleted: bool - +lastSaved: DateTime? - +lastFetched: DateTime? - +lastUpdated: DateTime? - +model: T + + + + + + + + + FormSideSheetTab - - - +dynamic markWithError() - +dynamic markAsLoading() - +dynamic markAsFetched() - +dynamic markAsSaved() + + + +formViewBuilder: Widget Function(T) - - - + + + + + - - - AsyncValue + + + HelpIcon + + + + + + +tooltipText: String? - - - - - - - - ModelRepositoryException + + + +Widget build() - - - + + + + + - - - Exception + + + EmptyBody - - - - + + + +icon: IconData? + +leading: Widget? + +leadingSpacing: double? + +title: String? + +description: String? + +button: Widget? + + - - - ModelNotFoundException + + + +Widget build() - - - - + + + + + - - - IModelRepository + + + IndicatorRangeSliderThumbShape - - - +String getKey() - +WrappedModel<T>? get() - +dynamic fetchAll() - +dynamic fetch() - +dynamic save() - +dynamic delete() - +dynamic duplicateAndSave() - +dynamic duplicateAndSaveFromRemote() - +Stream<WrappedModel<T>> watch() - +Stream<List<WrappedModel<T>>> watchAll() - +Stream<ModelEvent<T>> watchChanges() - +Stream<ModelEvent<T>> watchAllChanges() - +dynamic ensurePersisted() - +void dispose() + + + +buildContext: BuildContext + +start: T + +end: T - - - - - - - - APIException + + + +Size getPreferredSize() + +void paint() - - - + + + - - - StudyNotFoundException + + + BuildContext - - - + + + - - - MeasurementNotFoundException + + + RangeSliderThumbShape - - - + + + + - - - QuestionNotFoundException + + + MouseEventsRegion - - - - - - - - ConsentItemNotFoundException + + + +onTap: void Function()? + +onHover: void Function(PointerHoverEvent)? + +onEnter: void Function(PointerEnterEvent)? + +onExit: void Function(PointerExitEvent)? + +autoselectCursor: bool + +cursor: SystemMouseCursor + <static>+defaultCursor: SystemMouseCursor + +autoCursor: SystemMouseCursor - - - + + + - - - InterventionNotFoundException + + + void Function(PointerHoverEvent)? - - - + + + - - - InterventionTaskNotFoundException + + + void Function(PointerEnterEvent)? - - - + + + - - - ReportNotFoundException + + + void Function(PointerExitEvent)? - - - + + + - - - ReportSectionNotFoundException + + + SystemMouseCursor - - - + + + - - - StudyInviteNotFoundException + + + ReactiveCustomColorPicker - - - + + + - - - UserNotFoundException + + + ReactiveFormField - - - - - + + + + + - - - StudyUApiClient + + + TextParagraph - - - +supabaseClient: SupabaseClient - <static>+studyColumns: List<String> - <static>+studyWithParticipantActivityColumns: List<String> - +testDelayMilliseconds: int + + + +text: String? + +style: TextStyle? + +selectable: bool + +span: List<TextSpan>? - - - +dynamic deleteParticipants() - +dynamic getUserStudies() - +dynamic fetchStudy() - +dynamic deleteStudy() - +dynamic saveStudy() - +dynamic fetchStudyInvite() - +dynamic saveStudyInvite() - +dynamic deleteStudyInvite() - +dynamic fetchAppConfig() - +dynamic fetchUser() - +dynamic saveUser() - -dynamic _awaitGuarded() - -dynamic _apiException() - -dynamic _testDelay() + + + +Widget build() - - - - + + + + - - - SupabaseClientDependant + + + UnderConstruction - - - +supabaseClient: SupabaseClient + + + +Widget build() - - - - + + + - - - SupabaseQueryMixin + + + NullHelperDecoration - - - +dynamic deleteAll() - +dynamic getAll() - +dynamic getById() - +dynamic getByColumn() - +List<T> deserializeList() - +T deserializeObject() + + + + + + + + InputDecoration - - - + + + + - - - IsFetched + + + ActionMenuType - - - - - - - - IsSaving + + + +index: int + <static>+values: List<ActionMenuType> + <static>+inline: ActionMenuType + <static>+popup: ActionMenuType - - - + + + + + - - - IsSaved + + + HtmlStylingBanner - - - - + + + +isDismissed: bool + +onDismissed: dynamic Function()? + + - - - IsDeleted + + + +Widget build() - - - - + + + + - - - SupabaseQueryError + + + FormConsumerWidget - - - +statusCode: String? - +message: String - +details: dynamic + + + +Widget build() - - - - - - - - - StudyRepository - - + + + + - - - +apiClient: StudyUApi - +authRepository: IAuthRepository - +ref: ProviderRef<dynamic> - +sortCallback: void Function()? + + + FormConsumerRefWidget - - - +String getKey() - +dynamic deleteParticipants() - +dynamic launch() - +List<ModelAction<dynamic>> availableActions() + + + +Widget build() - - - - - - - - - StudyRepositoryDelegate - - + + + + - - - +apiClient: StudyUApi - +authRepository: IAuthRepository + + + SplashPage - - - +dynamic fetchAll() - +dynamic fetch() - +dynamic save() - +dynamic delete() - +dynamic onError() - +Study createNewInstance() - +Study createDuplicate() + + + +Widget build() - - - - - + + + + + - - - IUserRepository + + + ErrorPage - - - +user: StudyUUser + + + +error: Exception? - - - +dynamic fetchUser() - +dynamic saveUser() - +dynamic updatePreferences() + + + +Widget build() - - - + + + - - - StudyUUser + + + ConsumerWidget - - - - - + + + + + - - - UserRepository + + + StudyULogo - - - +apiClient: StudyUApi - +authRepository: IAuthRepository - +ref: Ref<Object?> - +user: StudyUUser + + + +onTap: void Function()? - - - +dynamic fetchUser() - +dynamic saveUser() - +dynamic updatePreferences() + + + +Widget build() - - - + + + + + - - - Ref + + + SingleColumnLayout - - - - - - - - - PreferenceAction + + + <static>+defaultConstraints: BoxConstraints + <static>+defaultConstraintsNarrow: BoxConstraints + +body: Widget + +header: Widget? + +stickyHeader: bool + +constraints: BoxConstraints? + +scroll: bool + +padding: EdgeInsets? - - - +index: int - <static>+values: List<PreferenceAction> - <static>+pin: PreferenceAction - <static>+pinOff: PreferenceAction + + + <static>+dynamic fromType() - - - - + + + + - - - IAppRepository + + + SingleColumnLayoutType - - - +dynamic fetchAppConfig() - +void dispose() + + + +index: int + <static>+values: List<SingleColumnLayoutType> + <static>+boundedWide: SingleColumnLayoutType + <static>+boundedNarrow: SingleColumnLayoutType + <static>+stretched: SingleColumnLayoutType + <static>+split: SingleColumnLayoutType - - - - - - - - - AppRepository - - + + + + - - - +apiClient: StudyUApi + + + Hyperlink - - - +dynamic fetchAppConfig() - +void dispose() + + + +text: String + +url: String? + +onClick: void Function()? + +linkColor: Color + +hoverColor: Color? + +visitedColor: Color? + +style: TextStyle? + +hoverStyle: TextStyle? + +visitedStyle: TextStyle? + +icon: IconData? + +iconSize: double? - - - - - + + + + - - - WebFrame + + + StandardTableColumn - - - +previewSrc: String - +studyId: String + + + +label: String + +tooltip: String? + +columnWidth: TableColumnWidth + +sortable: bool + +sortAscending: bool? + +sortableIcon: Widget? - - - +Widget build() + + + + + + + + TableColumnWidth - - - - + + + + - - - DisabledFrame + + + StandardTable - - - +Widget build() + + + +items: List<T> + +inputColumns: List<StandardTableColumn> + +onSelectItem: void Function(T) + +trailingActionsAt: List<ModelAction<dynamic>> Function(T, int)? + +trailingActionsMenuType: ActionMenuType? + +sortColumnPredicates: List<int Function(T, T)?>? + +pinnedPredicates: int Function(T, T)? + +headerRowBuilder: TableRow Function(BuildContext, List<StandardTableColumn>)? + +dataRowBuilder: TableRow Function(BuildContext, List<StandardTableColumn>)? + +inputTrailingActionsColumn: StandardTableColumn + +tableWrapper: Widget Function(Widget)? + +cellSpacing: double + +rowSpacing: double + +minRowHeight: double? + +showTableHeader: bool + +hideLeadingTrailingWhenEmpty: bool + +leadingWidget: Widget? + +trailingWidget: Widget? + +leadingWidgetSpacing: double? + +trailingWidgetSpacing: double? + +emptyWidget: Widget? + +rowStyle: StandardTableStyle + +disableRowInteractions: bool + + + + + + + + + + + void Function(T) - - - - - + + + - - - PhoneContainer + + + List<ModelAction<dynamic>> Function(T, int)? - - - <static>+defaultWidth: double - <static>+defaultHeight: double - +width: double - +height: double - +borderColor: Color - +borderWidth: double - +borderRadius: double - +innerContent: Widget - +innerContentBackgroundColor: Color? - - + + + + - - - +Widget build() + + + int Function(T, T)? - - - + + + - - - Widget + + + TableRow Function(BuildContext, List<StandardTableColumn>)? - - - - + + + + - - - MobileFrame + + + StandardTableStyle - - - +Widget build() + + + +index: int + <static>+values: List<StandardTableStyle> + <static>+plain: StandardTableStyle + <static>+material: StandardTableStyle - - - - + + + + + - - - DesktopFrame + + + IconPack - - - +Widget build() + + + <static>+defaultPack: List<IconOption> + <static>+material: List<IconOption> + + + + + + <static>+IconOption? resolveIconByName() - - - - - + + + + + - - - StudyController + + + IconOption - - - +notificationService: INotificationService - +studyEventsSubscription: StreamSubscription<ModelEvent<Study>>? - +studyActions: List<ModelAction<dynamic>> + + + +name: String + +icon: IconData? + +isEmpty: bool + +props: List<Object?> - - - +dynamic syncStudyStatus() - +dynamic onStudySubscriptionUpdate() - -dynamic _redirectNewToActualStudyID() - +dynamic publishStudy() - +void onChangeStudyParticipation() - +void onAddParticipants() - +void onSettingsPressed() - +void dispose() + + + +String toJson() + <static>+IconOption fromJson() - - - - + + + - - - INotificationService + + + Equatable - - - +void showMessage() - +void show() - +Stream<NotificationIntent> watchNotifications() - +void dispose() + + + + + + + + ReactiveIconPicker - - - + + + - - - StreamSubscription + + + ReactiveFocusableFormField - - - - - + + + + + - - - StudyBaseController + + + IconPicker - - - +studyId: String - +studyRepository: IStudyRepository - +router: GoRouter - +studySubscription: StreamSubscription<WrappedModel<Study>>? + + + +iconOptions: List<IconOption> + +selectedOption: IconOption? + +onSelect: void Function(IconOption)? + +galleryIconSize: double? + +selectedIconSize: double? + +focusNode: FocusNode? + +isDisabled: bool - - - +dynamic subscribeStudy() - +dynamic onStudySubscriptionUpdate() - +dynamic onStudySubscriptionError() - +void dispose() + + + +Widget build() - - - - + + + - - - IStudyAppBarViewModel + + + void Function(IconOption)? - - - +isSyncIndicatorVisible: bool - +isStatusBadgeVisible: bool - +isPublishVisible: bool + + + + + + + + FocusNode - - - - + + + + + - - - IStudyStatusBadgeViewModel + + + IconPickerField - - - +studyParticipation: Participation? - +studyStatus: StudyStatus? + + + +iconOptions: List<IconOption> + +selectedOption: IconOption? + +selectedIconSize: double? + +galleryIconSize: double? + +onSelect: void Function(IconOption)? + +focusNode: FocusNode? + +isDisabled: bool - - - - - - - - - IStudyNavViewModel + + + +Widget build() - - - +isEditTabEnabled: bool - +isTestTabEnabled: bool - +isRecruitTabEnabled: bool - +isMonitorTabEnabled: bool - +isAnalyzeTabEnabled: bool - +isSettingsEnabled: bool + + + + + + + + + + IconPickerGallery - - - - - - - - - StudyScaffold + + + +iconOptions: List<IconOption> + +onSelect: void Function(IconOption)? + +iconSize: double - - - +studyId: String - +tabs: List<NavbarTab>? - +tabsSubnav: List<NavbarTab>? - +selectedTab: NavbarTab? - +selectedTabSubnav: NavbarTab? - +body: StudyPageWidget - +drawer: Widget? - +disableActions: bool - +actionsSpacing: double - +actionsPadding: double - +layoutType: SingleColumnLayoutType? - +appbarHeight: double - +appbarSubnavHeight: double + + + +Widget build() - - - - + + + + + - - - NavbarTab + + + SecondaryButton - - - +title: String - +intent: RoutingIntent? - +index: int - +enabled: bool + + + +text: String + +icon: IconData? + +isLoading: bool + +onPressed: void Function()? + + + + + + +Widget build() - - - - - + + + + - - - StudyPageWidget + + + TwoColumnLayout - - - +studyId: String + + + <static>+defaultDivider: VerticalDivider + <static>+defaultContentPadding: EdgeInsets + <static>+slimContentPadding: EdgeInsets + +leftWidget: Widget + +rightWidget: Widget + +dividerWidget: Widget? + +headerWidget: Widget? + +flexLeft: int? + +flexRight: int? + +constraintsLeft: BoxConstraints? + +constraintsRight: BoxConstraints? + +scrollLeft: bool + +scrollRight: bool + +paddingLeft: EdgeInsets? + +paddingRight: EdgeInsets? + +backgroundColorLeft: Color? + +backgroundColorRight: Color? + +stretchHeight: bool - - - +Widget? banner() + + + + + + + + VerticalDivider - - - - + + + + - - - SingleColumnLayoutType + + + AppTranslation - - - +index: int - <static>+values: List<SingleColumnLayoutType> - <static>+boundedWide: SingleColumnLayoutType - <static>+boundedNarrow: SingleColumnLayoutType - <static>+stretched: SingleColumnLayoutType - <static>+split: SingleColumnLayoutType + + + <static>+dynamic init() - - - - + + + + - - - PreviewFrame + + + PlatformLocale - - - +studyId: String - +routeArgs: StudyFormRouteArgs? - +route: String? + + + +Locale getPlatformLocale() - - - - - - - - - RouteInformation - - + + + + - - - +route: String? - +extra: String? - +cmd: String? - +data: String? + + + PlatformLocaleWeb - - - +String toString() + + + +Locale getPlatformLocale() - - - - - + + + + - - - PlatformController + + + PlatformLocaleMobile - - - +studyId: String - +baseSrc: String - +previewSrc: String - +routeInformation: RouteInformation - +frameWidget: Widget + + + +Locale getPlatformLocale() - - - +void activate() - +void registerViews() - +void generateUrl() - +void navigate() - +void refresh() - +void listen() - +void send() - +void openNewPage() + + + + + + + + + LanguagePicker - - - - - - - - - - WebController + + + +languagePickerType: LanguagePickerType + +iconColor: Color? + +offset: Offset? - - - +iFrameElement: IFrameElement + + + + + + + + + LanguagePickerType - - - +void activate() - +void registerViews() - +void generateUrl() - +void navigate() - +void refresh() - +void openNewPage() - +void listen() - +void send() + + + +index: int + <static>+values: List<LanguagePickerType> + <static>+field: LanguagePickerType + <static>+icon: LanguagePickerType - - - + + + - - - IFrameElement + + + Offset - - - - + + + + - - - MobileController + + + GoRouteParamEnum - - - +void openNewPage() - +void refresh() - +void registerViews() - +void listen() - +void send() - +void navigate() - +void activate() - +void generateUrl() + + + +String toRouteParam() + +String toShortString() - - - - - - - - - StudyParticipationBadge - - + + + + - - - +participation: Participation - +type: BadgeType - +showPrefixIcon: bool - +center: bool + + + RoutingIntents - - - +Widget build() + + + <static>+root: RoutingIntent + <static>+studies: RoutingIntent + <static>+studiesShared: RoutingIntent + <static>+publicRegistry: RoutingIntent + <static>+study: RoutingIntent Function(String) + <static>+studyEdit: RoutingIntent Function(String) + <static>+studyEditInfo: RoutingIntent Function(String) + <static>+studyEditEnrollment: RoutingIntent Function(String) + <static>+studyEditInterventions: RoutingIntent Function(String) + <static>+studyEditIntervention: RoutingIntent Function(String, String) + <static>+studyEditMeasurements: RoutingIntent Function(String) + <static>+studyEditReports: RoutingIntent Function(String) + <static>+studyEditMeasurement: RoutingIntent Function(String, String) + <static>+studyTest: RoutingIntent Function(String, {String? appRoute}) + <static>+studyRecruit: RoutingIntent Function(String) + <static>+studyMonitor: RoutingIntent Function(String) + <static>+studyAnalyze: RoutingIntent Function(String) + <static>+studySettings: RoutingIntent Function(String) + <static>+accountSettings: RoutingIntent + <static>+studyNew: RoutingIntent + <static>+login: RoutingIntent + <static>+signup: RoutingIntent + <static>+passwordForgot: RoutingIntent + <static>+passwordForgot2: RoutingIntent Function(String) + <static>+passwordRecovery: RoutingIntent + <static>+error: RoutingIntent Function(Exception) - - - + + + - - - Participation + + + RoutingIntent Function(String) - - - - - - - - BadgeType - - + + + - - - +index: int - <static>+values: List<BadgeType> - <static>+filled: BadgeType - <static>+outlined: BadgeType - <static>+outlineFill: BadgeType - <static>+plain: BadgeType + + + RoutingIntent Function(String, String) - - - - - + + + - - - StudyTestScreen + + + RoutingIntent Function(String, {String? appRoute}) - - - +previewRoute: String? + + + + + + + + RoutingIntent Function(Exception) - - - +Widget build() - +Widget? banner() - +dynamic load() - +dynamic save() - +dynamic showHelp() + + + + + + + + GoRoute - - - - + + + + - - - TestAppRoutes + + + RoutingIntentDispatch - - - <static>+studyOverview: String - <static>+eligibility: String - <static>+intervention: String - <static>+consent: String - <static>+journey: String - <static>+dashboard: String + + + +index: int + <static>+values: List<RoutingIntentDispatch> + <static>+go: RoutingIntentDispatch + <static>+push: RoutingIntentDispatch - - - - + + + + - - - StudyNav + + + RouterKeys - - - <static>+dynamic tabs() - <static>+dynamic edit() - <static>+dynamic test() - <static>+dynamic recruit() - <static>+dynamic monitor() - <static>+dynamic analyze() + + + <static>+studyKey: ValueKey<String> + <static>+authKey: ValueKey<String> - - - - - - - - StudyDesignNav - - + + + - - - <static>+dynamic tabs() - <static>+dynamic info() - <static>+dynamic enrollment() - <static>+dynamic interventions() - <static>+dynamic measurements() - <static>+dynamic reports() + + + ValueKey - - - - + + + + - - - StudyTestController + + + RouteParams - - - +authRepository: IAuthRepository - +languageCode: String + + + <static>+studiesFilter: String + <static>+studyId: String + <static>+measurementId: String + <static>+interventionId: String + <static>+testAppRoute: String - - - + + + + + - - - StudyStatus + + + RouterConf - - - - - - - - - - StudyStatusBadge + + + <static>+router: GoRouter + <static>+routes: List<GoRoute> + <static>+publicRoutes: List<GoRoute> + <static>+privateRoutes: List<GoRoute> - - - +participation: Participation? - +status: StudyStatus? - +type: BadgeType - +showPrefixIcon: bool - +showTooltip: bool + + + <static>+GoRoute route() - - - +Widget build() + + + + + + + + GoRouter - - - - - + + + + - - - FrameControlsWidget + + + StudyFormRouteArgs - - - +onRefresh: void Function()? - +onOpenNewTab: void Function()? - +enabled: bool + + + +studyId: String - - - +Widget build() + + + + + + + + + QuestionFormRouteArgs + + + + + + +questionId: String - - - + + + - - - ConsumerWidget + + + ScreenerQuestionFormRouteArgs - - - - + + + + - - - StudySettingsDialog + + + ConsentItemFormRouteArgs - - - +Widget build() + + + +consentId: String - - - - - - - - - StudySettingsFormViewModel - - + + + + - - - +study: AsyncValue<Study> - +studyRepository: IStudyRepository - <static>+defaultPublishedToRegistry: bool - <static>+defaultPublishedToRegistryResults: bool - +isPublishedToRegistryControl: FormControl<bool> - +isPublishedToRegistryResultsControl: FormControl<bool> - +form: FormGroup - +titles: Map<FormMode, String> + + + MeasurementFormRouteArgs - - - +void setControlsFrom() - +Study buildFormData() - +dynamic keepControlsSynced() - +dynamic save() - +dynamic setLaunchDefaults() + + + +measurementId: String - - - + + + + - - - FormControl + + + SurveyQuestionFormRouteArgs - - - - - - - - FormGroup + + + +questionId: String - - - - - + + + + - - - FormViewModel + + + InterventionFormRouteArgs - - - -_formData: T? - -_formMode: FormMode - -_validationSet: FormValidationSetEnum? - +delegate: IFormViewModelDelegate<FormViewModel<dynamic>>? - +autosave: bool - -_immediateFormChildrenSubscriptions: List<StreamSubscription<dynamic>> - -_immediateFormChildrenListenerDebouncer: Debouncer? - -_autosaveOperation: CancelableOperation<dynamic>? - -_defaultControlValidators: Map<String, Tuple<List<Validator<dynamic>>, List<AsyncValidator<dynamic>>>> - +prevFormValue: Map<String, dynamic>? - <static>-_formKey: String - +formData: T? - +formMode: FormMode - +isReadonly: bool - +validationSet: FormValidationSetEnum? - +isDirty: bool - +title: String - +isValid: bool - +titles: Map<FormMode, String> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + + + +interventionId: String - - - -dynamic _setFormData() - -dynamic _rememberDefaultControlValidators() - -Tuple<List<Validator<dynamic>>, List<AsyncValidator<dynamic>>>? _getDefaultValidators() - -dynamic _disableAllControls() - -dynamic _formModeUpdated() - -dynamic _restoreControlsFromFormData() - +void revalidate() - -void _applyValidationSet() - +void read() - +dynamic save() - +dynamic cancel() - +void enableAutosave() - +void listenToImmediateFormChildren() - +dynamic markFormGroupChanged() - +void dispose() - +void setControlsFrom() - +T buildFormData() - +void initControls() + + + + + + + + + InterventionTaskFormRouteArgs + + + + + + +taskId: String - - - - + + + + - - - IWithBanner + + + ReportItemFormRouteArgs - - - +Widget? banner() + + + +sectionId: String - - - - + + + + - - - AppStatus + + + DropdownMenuItemTheme - - - +index: int - <static>+values: List<AppStatus> - <static>+initializing: AppStatus - <static>+initialized: AppStatus + + + +iconTheme: IconThemeData? - - - - - + + + - - - AppController + + + IconThemeData - - - +appDelegates: List<IAppDelegate> - -_delayedFuture: dynamic - +isInitialized: dynamic + + + + + + + + Diagnosticable - - - +dynamic onAppStart() - -dynamic _callDelegates() + + + + + + + + + + ThemeConfig - - - - + + + <static>+kMinContentWidth: double + <static>+kMaxContentWidth: double + <static>+kHoverFadeFactor: double + <static>+kMuteFadeFactor: double + + - - - App + + + <static>+dynamic bodyBackgroundColor() + <static>+Color modalBarrierColor() + <static>+Color containerColor() + <static>+Color colorPickerInitialColor() + <static>+TextStyle bodyTextMuted() + <static>+TextStyle bodyTextBackground() + <static>+double iconSplashRadius() + <static>+Color sidesheetBackgroundColor() + <static>+InputDecorationTheme dropdownInputDecorationTheme() + <static>+DropdownMenuItemTheme dropdownMenuItemTheme() - - - + + + + - - - AppContent + + + NoAnimationPageTransitionsBuilder + + + + + + +Widget buildTransitions() - - - - - + + + - - - AuthFormController + + + PageTransitionsBuilder - - - +authRepository: IAuthRepository - +notificationService: INotificationService - +router: GoRouter - +emailControl: FormControl<String> - +passwordControl: FormControl<String> - +passwordConfirmationControl: FormControl<String> - +termsOfServiceControl: FormControl<bool> - <static>+authValidationMessages: Map<String, String Function(dynamic)> - +loginForm: FormGroup - +signupForm: FormGroup - +passwordForgotForm: FormGroup - +passwordRecoveryForm: FormGroup - +controlValidatorsByForm: Map<AuthFormKey, Map<FormControl<dynamic>, List<Validator<dynamic>>>> - -_formKey: AuthFormKey - +formKey: AuthFormKey - +form: FormGroup + + + + + + + + + WebTransitionBuilder - - - -dynamic _getFormFor() - -dynamic _onChangeFormKey() - +dynamic resetControlsFor() - -dynamic _forceValidationMessages() - +dynamic signUp() - -dynamic _signUp() - +dynamic signIn() - -dynamic _signInWith() - +dynamic signOut() - +dynamic resetPasswordForEmail() - +dynamic sendPasswordResetLink() - +dynamic recoverPassword() - +dynamic updateUser() - -dynamic _readDebugUser() + + + +Widget buildTransitions() - - - - + + + + - - - AuthFormKey + + + ThemeSettingChange - - - +index: int - <static>+values: List<AuthFormKey> - <static>+login: AuthFormKey - <static>+signup: AuthFormKey - <static>+passwordForgot: AuthFormKey - <static>+passwordRecovery: AuthFormKey - <static>-_loginSubmit: AuthFormKey - <static>-_signupSubmit: AuthFormKey + + + +settings: ThemeSettings - - - - + + + + - - - IFormGroupController + + + ThemeSettings - - - +form: FormGroup + + + +sourceColor: Color + +themeMode: ThemeMode - - - - - + + + - - - PasswordRecoveryForm + + + Notification - - - +formKey: AuthFormKey + + + + + + + + + + ThemeProvider + + + + + + +settings: ValueNotifier<ThemeSettings> + +lightDynamic: ColorScheme? + +darkDynamic: ColorScheme? + +pageTransitionsTheme: PageTransitionsTheme + +shapeMedium: ShapeBorder + + + + + + +Color custom() + +Color blend() + +Color source() + +ColorScheme colors() + +CardTheme cardTheme() + +ListTileThemeData listTileTheme() + +AppBarTheme appBarTheme() + +SnackBarThemeData snackBarThemeData() + +TabBarTheme tabBarTheme() + +BottomAppBarTheme bottomAppBarTheme() + +BottomNavigationBarThemeData bottomNavigationBarTheme() + +SwitchThemeData switchTheme() + +InputDecorationTheme inputDecorationTheme() + +TextTheme textTheme() + +DividerThemeData dividerTheme() + +NavigationRailThemeData navigationRailTheme() + +DrawerThemeData drawerTheme() + +IconThemeData iconTheme() + +CheckboxThemeData checkboxTheme() + +RadioThemeData radioTheme() + +TooltipThemeData tooltipTheme() + +ThemeData light() + +ThemeData dark() + +ThemeMode themeMode() + +ThemeData theme() + <static>+ThemeProvider of() + +bool updateShouldNotify() - - - +Widget build() + + + + + + + + ValueNotifier - - - - + + + - - - FormConsumerRefWidget + + + ColorScheme - - - +Widget build() + + + + + + + + PageTransitionsTheme - - - - - + + + - - - PasswordForgotForm + + + ShapeBorder - - - +formKey: AuthFormKey + + + + + + + + InheritedWidget - - - +Widget build() + + + + + + + + ThemeMode - - - - - + + + + + - - - LoginForm + + + CustomColor - - - +formKey: AuthFormKey + + + +name: String + +color: Color + +blend: bool - - - +Widget build() + + + +Color value() - - - - - - - - EmailTextField - - + + + + + - - - +labelText: String - +hintText: String? - +formControlName: String? - +formControl: FormControl<dynamic>? + + + SuppressedBehaviorSubject - - - - - - - - - PasswordTextField + + + +subject: BehaviorSubject<T> + +didSuppressInitialEvent: bool + -_controller: StreamController<T> - - - +labelText: String - +hintText: String? - +onSubmitted: dynamic Function(FormControl<dynamic>)? - +formControlName: String? - +formControl: FormControl<dynamic>? + + + -StreamController<T> _buildDerivedController() + +dynamic close() - - - + + + - - - dynamic Function(FormControl<dynamic>)? + + + StreamController - - - - - + + + + - - - SignupForm + + + Time - - - +formKey: AuthFormKey + + + <static>+dynamic fromTimeOfDay() + +Map<String, dynamic> toJson() + <static>+Time fromJson() - - - +Widget build() - -dynamic _onClickTermsOfUse() - -dynamic _onClickPrivacyPolicy() + + + + + + + + TimeOfDay - - - - + + + + - - - StudyUJobsToBeDone + + + TimeValueAccessor - - - +Widget build() + + + +String modelToViewValue() + +Time? viewToModelValue() + -String _addLeadingZeroIfNeeded() - - - - + + + - - - AuthScaffold + + + ControlValueAccessor - - - +body: Widget - +formKey: AuthFormKey - +leftContentMinWidth: double - +leftPanelMinWidth: double - +leftPanelPadding: EdgeInsets + + + + + + + + + ModelAction - - - - - - - - EdgeInsets + + + +type: T + +label: String + +icon: IconData? + +onExecute: Function + +isAvailable: bool + +isDestructive: bool - - - - + + + + - - - PublishDialog + + + IModelActionProvider - - - +Widget build() + + + +List<ModelAction<dynamic>> availableActions() - - - - + + + + - - - PublishSuccessDialog + + + IListActionProvider - - - +Widget build() + + + +void onSelectItem() + +void onNewItem() - - - - + + + + - - - PublishConfirmationDialog + + + ModelActionType - - - +Widget build() + + + +index: int + <static>+values: List<ModelActionType> + <static>+edit: ModelActionType + <static>+delete: ModelActionType + <static>+remove: ModelActionType + <static>+duplicate: ModelActionType + <static>+clipboard: ModelActionType + <static>+primary: ModelActionType - - - - - - - - - FormArrayTable - - + + + + + - - - +control: AbstractControl<dynamic> - +items: List<T> - +onSelectItem: void Function(T) - +getActionsAt: List<ModelAction<dynamic>> Function(T, int) - +onNewItem: void Function()? - +rowTitle: String Function(T) - +onNewItemLabel: String - +sectionTitle: String? - +sectionDescription: String? - +emptyIcon: IconData? - +emptyTitle: String? - +emptyDescription: String? - +sectionTitleDivider: bool? - +rowPrefix: Widget Function(BuildContext, T, int)? - +rowSuffix: Widget Function(BuildContext, T, int)? - +leadingWidget: Widget? - +itemsSectionPadding: EdgeInsets? - +hideLeadingTrailingWhenEmpty: bool - <static>+columns: List<StandardTableColumn> + + + OptimisticUpdate - - - +Widget build() - -List<Widget> _buildRow() - -Widget _newItemButton() + + + +applyOptimistic: void Function() + +apply: dynamic Function() + +rollback: void Function() + +onUpdate: void Function()? + +onError: void Function(Object, StackTrace?)? + +rethrowErrors: bool + +runOptimistically: bool + +completeFutureOptimistically: bool - - - - - - - - AbstractControl + + + +dynamic execute() + -void _runUpdateHandlerIfAny() - - - + + + - - - void Function(T) + + + void Function() - - - + + + - - - List<ModelAction<dynamic>> Function(T, int) + + + void Function(Object, StackTrace?)? - - - + + + + - - - String Function(T) + + + FileFormatEncoder - - - - - - - - Widget Function(BuildContext, T, int)? + + + +dynamic encodeAsync() + +String encode() + +dynamic call() - - - - - + + + + - - - IFormData + + + CSVStringEncoder - - - +id: String + + + +String encode() - - - +IFormData copy() + + + + + + + + + JsonStringEncoder + + + + + + +String encode() - - - - + + + + + - - - ManagedFormViewModel + + + ExecutionLimiter - - - +ManagedFormViewModel<T> createDuplicate() + + + +milliseconds: int + <static>-_timer: Timer? + + + + + + +void dispose() - - - + + + - - - FormViewModelNotFoundException + + + Timer - - - - - + + + + + - - - FormViewModelCollection + + + Debouncer - - - +formViewModels: List<T> - +formArray: FormArray<dynamic> - +stagedViewModels: List<T> - +retrievableViewModels: List<T> - +formData: List<D> + + + +leading: bool + +cancelUncompleted: bool + -_uncompletedFutureOperation: CancelableOperation<dynamic>? - - - +void add() - +T remove() - +T? findWhere() - +T? removeWhere() - +bool contains() - +void stage() - +T commit() - +void reset() - +void read() + + + +dynamic call() - - - + + + - - - FormArray + + + CancelableOperation - - - + + + + - - - FormInvalidException + + + Throttler + + + + + + +dynamic call() - - - - + + + + - - - FormConfigException + + + SerializableColor - - - +message: String? + + + +Map<String, dynamic> toJson() + <static>+SerializableColor fromJson() - - - - + + + + - - - IFormViewModelDelegate + + + IProviderArgsResolver - - - +dynamic onSave() - +void onCancel() + + + +R provide() - - - - + + + + + - - - FormControlOption + + + CombinedStreamNotifier - - - +value: T - +label: String - +description: String? - +props: List<Object?> + + + -_subscriptions: List<StreamSubscription<dynamic>> + + + + + + +void dispose() - - - - + + + - - - FormMode + + + ChangeNotifier - - - +index: int - <static>+values: List<FormMode> - <static>+create: FormMode - <static>+readonly: FormMode - <static>+edit: FormMode + + + + + + + + + + CountWhereValidator + + + + + + +predicate: bool Function(T?) + +minCount: int? + +maxCount: int? + <static>+kValidationMessageMinCount: String + <static>+kValidationMessageMaxCount: String + + + + + + +Map<String, dynamic>? validate() - - - + + + - - - FormValidationSetEnum + + + bool Function(T?) + + + + + + + + + + + Validator - - - - - + + + + - - - CustomFormControl + + + Patterns - - - -_onValueChangedDebouncer: Debouncer? - -_onStatusChangedDebouncer: Debouncer? - +onValueChanged: void Function(T?)? - +onStatusChanged: void Function(ControlStatus)? - +onStatusChangedDebounceTime: int? - +onValueChangedDebounceTime: int? + + + <static>+timeFormatString: String + <static>+emailFormatString: String + <static>+url: String - - - +void dispose() + + + + + + + + + + NumericalRangeFormatter - - - - + + + +min: int? + +max: int? + + - - - void Function(T?)? + + + +TextEditingValue formatEditUpdate() - - - + + + - - - void Function(ControlStatus)? + + + TextInputFormatter - - - - + + + + - - - UnsavedChangesDialog + + + StudySequenceFormatter - - - +Widget build() + + + +TextEditingValue formatEditUpdate() - - - - - + + + + + - - - FormControlValidation + + + Tuple - - - +control: AbstractControl<dynamic> - +validators: List<Validator<dynamic>> - +asyncValidators: List<AsyncValidator<dynamic>>? - +validationMessages: Map<String, String Function(Object)> + + + +first: T1 + +second: T2 + +props: List<Object?> - - - +FormControlValidation merge() + + + +Map<String, dynamic> toJson() + <static>+Tuple<dynamic, dynamic> fromJson() + +Tuple<T1, T2> copy() + +Tuple<T1, T2> copyWith() - - - - - + + + + + - - - ScreenerQuestionFormViewModel + + + JsonFileLoader - - - <static>+defaultResponseOptionValidity: bool - +responseOptionsDisabledArray: FormArray<dynamic> - +responseOptionsLogicControls: FormArray<bool> - +responseOptionsLogicDescriptionControls: FormArray<String> - -_questionBaseControls: Map<String, AbstractControl<dynamic>> - +prevResponseOptionControls: List<AbstractControl<dynamic>> - +prevResponseOptionValues: List<dynamic> - +responseOptionsDisabledControls: List<AbstractControl<dynamic>> - +logicControlOptions: List<FormControlOption<bool>> - +questionBaseControls: Map<String, AbstractControl<dynamic>> - +isDirtyOptionsBannerVisible: bool + + + +jsonAssetsPath: String - - - +dynamic onResponseOptionsChanged() - +void setControlsFrom() - +QuestionFormData buildFormData() - -List<FormControl<dynamic>> _copyFormControls() - -AbstractControl<dynamic>? _findAssociatedLogicControlFor() - -AbstractControl<dynamic>? _findAssociatedControlFor() - +ScreenerQuestionFormViewModel createDuplicate() + + + +dynamic loadJson() + +dynamic parseJsonMapFromAssets() + +dynamic parseJsonListFromAssets() - - - - - + + + + - - - QuestionFormViewModel + + + IAppDelegate - - - <static>+defaultQuestionType: SurveyQuestionType - -_titles: Map<FormMode, String Function()>? - +questionIdControl: FormControl<String> - +questionTypeControl: FormControl<SurveyQuestionType> - +questionTextControl: FormControl<String> - +questionInfoTextControl: FormControl<String> - +questionBaseControls: Map<String, AbstractControl<dynamic>> - +isMultipleChoiceControl: FormControl<bool> - +choiceResponseOptionsArray: FormArray<dynamic> - +customOptionsMin: int - +customOptionsMax: int - +customOptionsInitial: int - +boolResponseOptionsArray: FormArray<String> - +imageResponseOptionsArray: FormArray<String> - <static>+kDefaultMaxRecordingDurationSeconds: int - <static>+kMaxRecordingDurationSeconds: int - +audioResponseOptionsArray: FormArray<String> - +maxRecordingDurationSecondsControl: FormControl<int> - <static>+kDefaultScaleMinValue: int - <static>+kDefaultScaleMaxValue: int - <static>+kNumMidValueControls: int - <static>+kMidValueDebounceMilliseconds: int - +scaleMinValueControl: FormControl<int> - +scaleMaxValueControl: FormControl<int> - -_scaleRangeControl: FormControl<int> - +scaleMinLabelControl: FormControl<String> - +scaleMaxLabelControl: FormControl<String> - +scaleMidValueControls: FormArray<int> - +scaleMidLabelControls: FormArray<String?> - -_scaleResponseOptionsArray: FormArray<int> - +scaleMinColorControl: FormControl<SerializableColor> - +scaleMaxColorControl: FormControl<SerializableColor> - +prevMidValues: List<int?>? - +freeTextTypeControl: FormControl<FreeTextQuestionType> - +customRegexControl: FormControl<String> - +freeTextResponseOptionsArray: FormArray<dynamic> - +freeTextLengthMin: AbstractControl<int> - +freeTextLengthMax: AbstractControl<int> - +freeTextExampleTextControl: FormControl<String> - <static>+kDefaultFreeTextMinLength: int - <static>+kDefaultFreeTextMaxLength: int - +freeTextLengthControl: FormControl<RangeValues> - -_controlsByQuestionType: Map<SurveyQuestionType, FormGroup> - -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - -_validationConfigsByQuestionType: Map<SurveyQuestionType, Map<FormValidationSetEnum, List<FormControlValidation>>> - +form: FormGroup - +questionId: String - +questionType: SurveyQuestionType - +questionTypeControlOptions: List<FormControlOption<SurveyQuestionType>> - +answerOptionsArray: FormArray<dynamic> - +answerOptionsControls: List<AbstractControl<dynamic>> - +validAnswerOptions: List<String> - +boolOptions: List<AbstractControl<String>> - +imageOptions: List<AbstractControl<String>> - +audioOptions: List<AbstractControl<String>> - +scaleMinValue: int - +scaleMaxValue: int - +scaleRange: int - +scaleAllValueControls: List<AbstractControl<int>> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +questionTextRequired: dynamic - +numValidChoiceOptions: dynamic - +scaleRangeValid: dynamic - +maxRecordingDurationValid: dynamic - +titles: Map<FormMode, String> - +isAddOptionButtonVisible: bool - +isMidValuesClearedInfoVisible: bool + + + +dynamic onAppStart() - - - +String? scaleMidLabelAt() - -dynamic _onScaleRangeChanged() - -dynamic _applyInputFormatters() - -dynamic _updateScaleMidValueControls() - -Map<String, dynamic>? _validateFreeText() - -dynamic _onFreeTextLengthChanged() - -List<FormControlValidation> _getValidationConfig() - +dynamic onQuestionTypeChanged() - +dynamic onResponseOptionsChanged() - -void _updateFormControls() - +void initControls() - +void setControlsFrom() - +QuestionFormData buildFormData() - +List<ModelAction<dynamic>> availableActions() - +void onNewItem() - +void onSelectItem() - +dynamic save() - +QuestionFormViewModel createDuplicate() + + + + + + + + + + AppController - - - - - - - - - IScreenerQuestionLogicFormViewModel + + + +appDelegates: List<IAppDelegate> + -_delayedFuture: dynamic + +isInitialized: dynamic - - - +isDirtyOptionsBannerVisible: bool + + + +dynamic onAppStart() + -dynamic _callDelegates() - - - - + + + + - - - StudyDesignEnrollmentFormView + + + StudyMonitorScreen - - - +Widget build() - -dynamic _showScreenerQuestionSidesheetWithArgs() - -dynamic _showConsentItemSidesheetWithArgs() + + + +Widget build() + + + + + + + + + + + + + StudyPageWidget - - - - - - - - - StudyDesignPageWidget + + + +studyId: String - - - +Widget? banner() + + + +Widget? banner() - - - - - + + + + + - - - ScreenerQuestionLogicFormView + + + LoginForm - - - +formViewModel: ScreenerQuestionFormViewModel + + + +formKey: AuthFormKey - - - +Widget build() - -dynamic _buildInfoBanner() - -dynamic _buildAnswerOptionsLogicControls() - -List<Widget> _buildOptionLogicRow() + + + +Widget build() - - - - + + + + - - - FormConsumerWidget + + + AuthFormKey - - - +Widget build() + + + +index: int + <static>+values: List<AuthFormKey> + <static>+login: AuthFormKey + <static>+signup: AuthFormKey + <static>+passwordForgot: AuthFormKey + <static>+passwordRecovery: AuthFormKey + <static>-_loginSubmit: AuthFormKey + <static>-_signupSubmit: AuthFormKey - - - - - + + + + + - - - ConsentItemFormData + + + PasswordRecoveryForm - - - +consentId: String - +title: String - +description: String - +iconName: String? - +id: String + + + +formKey: AuthFormKey - - - +ConsentItem toConsentItem() - +ConsentItemFormData copy() + + + +Widget build() - - - - - + + + + + - - - EnrollmentFormViewModel + + + PasswordForgotForm - - - +study: Study - +router: GoRouter - +consentItemDelegate: EnrollmentFormConsentItemDelegate - +enrollmentTypeControl: FormControl<Participation> - +consentItemArray: FormArray<dynamic> - +consentItemFormViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData> - +form: FormGroup - +enrollmentTypeControlOptions: List<FormControlOption<Participation>> - +consentItemModels: List<ConsentItemFormViewModel> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titles: Map<FormMode, String> - +canTestScreener: bool - +canTestConsent: bool - +questionTitles: Map<FormMode, String Function()> + + + +formKey: AuthFormKey - - - +void setControlsFrom() - +EnrollmentFormData buildFormData() - +void read() - +List<ModelAction<dynamic>> availableActions() - +List<ModelAction<dynamic>> availablePopupActions() - +List<ModelAction<dynamic>> availableInlineActions() - +void onSelectItem() - +void onNewItem() - +ScreenerQuestionFormRouteArgs buildNewScreenerQuestionFormRouteArgs() - +ScreenerQuestionFormRouteArgs buildScreenerQuestionFormRouteArgs() - +ConsentItemFormRouteArgs buildNewConsentItemFormRouteArgs() - +ConsentItemFormRouteArgs buildConsentItemFormRouteArgs() - +dynamic testScreener() - +dynamic testConsent() - +ScreenerQuestionFormViewModel provideQuestionFormViewModel() + + + +Widget build() - - - - - + + + + + - - - EnrollmentFormConsentItemDelegate + + + SignupForm - - - +formViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData> - +owner: EnrollmentFormViewModel - +propagateOnSave: bool - +validationSet: dynamic + + + +formKey: AuthFormKey - - - +void onCancel() - +dynamic onSave() - +ConsentItemFormViewModel provide() - +List<ModelAction<dynamic>> availableActions() - +void onNewItem() - +void onSelectItem() + + + +Widget build() + -dynamic _onClickTermsOfUse() + -dynamic _onClickPrivacyPolicy() - - - - - - - - - WithQuestionnaireControls - - + + + + - - - +questionsArray: FormArray<dynamic> - +questionFormViewModels: FormViewModelCollection<Q, QuestionFormData> - +questionnaireControls: Map<String, FormArray<dynamic>> - +propagateOnSave: bool - +questionModels: List<Q> - +questionTitles: Map<FormMode, String Function()> + + + AuthScaffold - - - +void setQuestionnaireControlsFrom() - +QuestionnaireFormData buildQuestionnaireFormData() - +void read() - +void onCancel() - +dynamic onSave() - +Q provide() - +Q provideQuestionFormViewModel() + + + +body: Widget + +formKey: AuthFormKey + +leftContentMinWidth: double + +leftPanelMinWidth: double + +leftPanelPadding: EdgeInsets - - - - - + + + + - - - ConsentItemFormViewModel + + + EmailTextField - - - +consentIdControl: FormControl<String> - +titleControl: FormControl<String> - +descriptionControl: FormControl<String> - +iconControl: FormControl<IconOption> - +form: FormGroup - +consentId: String - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titleRequired: dynamic - +descriptionRequired: dynamic - +titles: Map<FormMode, String> + + + +labelText: String + +hintText: String? + +formControlName: String? + +formControl: FormControl<dynamic>? - - - +void setControlsFrom() - +ConsentItemFormData buildFormData() - +ConsentItemFormViewModel createDuplicate() + + + + + + + + FormControl - - - - + + + + - - - ConsentItemFormView + + + PasswordTextField - - - +formViewModel: ConsentItemFormViewModel + + + +labelText: String + +hintText: String? + +onSubmitted: dynamic Function(FormControl<dynamic>)? + +formControlName: String? + +formControl: FormControl<dynamic>? - - - - - + + + - - - EnrollmentFormData + + + dynamic Function(FormControl<dynamic>)? - - - <static>+kDefaultEnrollmentType: Participation - +enrollmentType: Participation - +questionnaireFormData: QuestionnaireFormData - +consentItemsFormData: List<ConsentItemFormData>? - +id: String + + + + + + + + + StudyUJobsToBeDone - - - +Study apply() - +EnrollmentFormData copy() + + + +Widget build() - - - - - + + + + + - - - QuestionnaireFormData + + + AuthFormController - - - +questionsData: List<QuestionFormData>? - +id: String + + + +authRepository: IAuthRepository + +notificationService: INotificationService + +router: GoRouter + +emailControl: FormControl<String> + +passwordControl: FormControl<String> + +passwordConfirmationControl: FormControl<String> + +termsOfServiceControl: FormControl<bool> + <static>+authValidationMessages: Map<String, String Function(dynamic)> + +loginForm: FormGroup + +signupForm: FormGroup + +passwordForgotForm: FormGroup + +passwordRecoveryForm: FormGroup + +controlValidatorsByForm: Map<AuthFormKey, Map<FormControl<dynamic>, List<Validator<dynamic>>>> + -_formKey: AuthFormKey + +formKey: AuthFormKey + +form: FormGroup - - - +StudyUQuestionnaire toQuestionnaire() - +List<EligibilityCriterion> toEligibilityCriteria() - +QuestionnaireFormData copy() + + + -dynamic _getFormFor() + -dynamic _onChangeFormKey() + +dynamic resetControlsFor() + -dynamic _forceValidationMessages() + +dynamic signUp() + -dynamic _signUp() + +dynamic signIn() + -dynamic _signInWith() + +dynamic signOut() + +dynamic resetPasswordForEmail() + +dynamic sendPasswordResetLink() + +dynamic recoverPassword() + +dynamic updateUser() + -dynamic _readDebugUser() - - - - - - - - IStudyFormData - - + + + + + - - - +Study apply() + + + IAuthRepository - - - - - - - - - StudyDesignInterventionsFormView + + + +allowPasswordReset: bool + +currentUser: User? + +isLoggedIn: bool + +session: Session? + +serializedSession: String? - - - +Widget build() + + + +dynamic signUp() + +dynamic signInWith() + +dynamic signOut() + +dynamic resetPasswordForEmail() + +dynamic updateUser() + +void dispose() - - - - - + + + - - - InterventionsFormViewModel + + + FormGroup - - - +study: Study - +router: GoRouter - +interventionsArray: FormArray<dynamic> - +interventionsCollection: FormViewModelCollection<InterventionFormViewModel, InterventionFormData> - +form: FormGroup - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +interventionsRequired: dynamic - +titles: Map<FormMode, String> - +canTestStudySchedule: bool + + + + + + + + + IFormGroupController - - - +void setControlsFrom() - +InterventionsFormData buildFormData() - +void read() - +List<ModelAction<dynamic>> availableActions() - +List<ModelAction<dynamic>> availablePopupActions() - +List<ModelAction<dynamic>> availableInlineActions() - +void onSelectItem() - +void onNewItem() - +InterventionFormViewModel provide() - +void onCancel() - +dynamic onSave() - +dynamic testStudySchedule() + + + +form: FormGroup - - - - - - - - - StudyScheduleControls - - + + + + - - - <static>+defaultScheduleType: PhaseSequence - <static>+defaultScheduleTypeSequence: String - <static>+defaultNumCycles: int - <static>+defaultPeriodLength: int - +sequenceTypeControl: FormControl<PhaseSequence> - +sequenceTypeCustomControl: FormControl<String> - +phaseDurationControl: FormControl<int> - +numCyclesControl: FormControl<int> - +includeBaselineControl: FormControl<bool> - +studyScheduleControls: Map<String, FormControl<Object>> - <static>+kNumCyclesMin: int - <static>+kNumCyclesMax: int - <static>+kPhaseDurationMin: int - <static>+kPhaseDurationMax: int - +sequenceTypeControlOptions: List<FormControlOption<PhaseSequence>> - +studyScheduleValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +numCyclesRange: dynamic - +phaseDurationRange: dynamic - +customSequenceRequired: dynamic + + + AppStatus - - - +void setStudyScheduleControlsFrom() - +StudyScheduleFormData buildStudyScheduleFormData() - +bool isSequencingCustom() + + + +index: int + <static>+values: List<AppStatus> + <static>+initializing: AppStatus + <static>+initialized: AppStatus - - - - - + + + + + - - - InterventionFormViewModel + + + FormArrayTable - - - +study: Study - +interventionIdControl: FormControl<String> - +interventionTitleControl: FormControl<String> - +interventionIconControl: FormControl<IconOption> - +interventionDescriptionControl: FormControl<String> - +interventionTasksArray: FormArray<dynamic> - +tasksCollection: FormViewModelCollection<InterventionTaskFormViewModel, InterventionTaskFormData> - +form: FormGroup - +interventionId: String - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titleRequired: dynamic - +atLeastOneTask: dynamic - +breadcrumbsTitle: String - +titles: Map<FormMode, String> + + + +control: AbstractControl<dynamic> + +items: List<T> + +onSelectItem: void Function(T) + +getActionsAt: List<ModelAction<dynamic>> Function(T, int) + +onNewItem: void Function()? + +rowTitle: String Function(T) + +onNewItemLabel: String + +sectionTitle: String? + +sectionDescription: String? + +emptyIcon: IconData? + +emptyTitle: String? + +emptyDescription: String? + +sectionTitleDivider: bool? + +rowPrefix: Widget Function(BuildContext, T, int)? + +rowSuffix: Widget Function(BuildContext, T, int)? + +leadingWidget: Widget? + +itemsSectionPadding: EdgeInsets? + +hideLeadingTrailingWhenEmpty: bool + <static>+columns: List<StandardTableColumn> - - - +void setControlsFrom() - +InterventionFormData buildFormData() - +List<ModelAction<dynamic>> availableActions() - +List<ModelAction<dynamic>> availablePopupActions() - +List<ModelAction<dynamic>> availableInlineActions() - +void onSelectItem() - +void onNewItem() - +void onCancel() - +dynamic onSave() - +InterventionTaskFormViewModel provide() - +InterventionTaskFormRouteArgs buildNewFormRouteArgs() - +InterventionTaskFormRouteArgs buildFormRouteArgs() - +InterventionFormViewModel createDuplicate() + + + +Widget build() + -List<Widget> _buildRow() + -Widget _newItemButton() - - - - - + + + - - - InterventionTaskFormData + + + List<ModelAction<dynamic>> Function(T, int) - - - +taskId: String - +taskTitle: String - +taskDescription: String? - <static>+kDefaultTitle: String - +id: String - - + + + + - - - +CheckmarkTask toTask() - +InterventionTaskFormData copy() + + + String Function(T) - - - - - + + + - - - IFormDataWithSchedule + + + Widget Function(BuildContext, T, int)? - - - +instanceId: String - +isTimeLocked: bool - +timeLockStart: StudyUTimeOfDay? - +timeLockEnd: StudyUTimeOfDay? - +hasReminder: bool - +reminderTime: StudyUTimeOfDay? + + + + + + + + + ManagedFormViewModel - - - +Schedule toSchedule() + + + +ManagedFormViewModel<T> createDuplicate() - - - - - + + + + + - - - StudyScheduleFormData + + + FormViewModel - - - +sequenceType: PhaseSequence - +sequenceTypeCustom: String - +numCycles: int - +phaseDuration: int - +includeBaseline: bool - +id: String + + + -_formData: T? + -_formMode: FormMode + -_validationSet: FormValidationSetEnum? + +delegate: IFormViewModelDelegate<FormViewModel<dynamic>>? + +autosave: bool + -_immediateFormChildrenSubscriptions: List<StreamSubscription<dynamic>> + -_immediateFormChildrenListenerDebouncer: Debouncer? + -_autosaveOperation: CancelableOperation<dynamic>? + -_defaultControlValidators: Map<String, Tuple<List<Validator<dynamic>>, List<AsyncValidator<dynamic>>>> + +prevFormValue: Map<String, dynamic>? + <static>-_formKey: String + +formData: T? + +formMode: FormMode + +isReadonly: bool + +validationSet: FormValidationSetEnum? + +isDirty: bool + +title: String + +isValid: bool + +titles: Map<FormMode, String> + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - - - +StudySchedule toStudySchedule() - +Study apply() - +StudyScheduleFormData copy() + + + -dynamic _setFormData() + -dynamic _rememberDefaultControlValidators() + -Tuple<List<Validator<dynamic>>, List<AsyncValidator<dynamic>>>? _getDefaultValidators() + -dynamic _disableAllControls() + -dynamic _formModeUpdated() + -dynamic _restoreControlsFromFormData() + +void revalidate() + -void _applyValidationSet() + +void read() + +dynamic save() + +dynamic cancel() + +void enableAutosave() + +void listenToImmediateFormChildren() + +dynamic markFormGroupChanged() + +void dispose() + +void setControlsFrom() + +T buildFormData() + +void initControls() - - - + + + - - - PhaseSequence + + + FormViewModelNotFoundException - - - - - + + + - - - InterventionPreview + + + Exception - - - +routeArgs: InterventionFormRouteArgs - - + + + + + + - - - +Widget build() + + + FormViewModelCollection - - - - - - - - - - InterventionTaskFormViewModel + + + +formViewModels: List<T> + +formArray: FormArray<dynamic> + +stagedViewModels: List<T> + +retrievableViewModels: List<T> + +formData: List<D> - - - +taskIdControl: FormControl<String> - +instanceIdControl: FormControl<String> - +taskTitleControl: FormControl<String> - +taskDescriptionControl: FormControl<String> - +markAsCompletedControl: FormControl<bool> - +form: FormGroup - +taskId: String - +instanceId: String - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titleRequired: dynamic - +titles: Map<FormMode, String> + + + +void add() + +T remove() + +T? findWhere() + +T? removeWhere() + +bool contains() + +void stage() + +T commit() + +void reset() + +void read() - - - +void setControlsFrom() - +InterventionTaskFormData buildFormData() - +InterventionTaskFormViewModel createDuplicate() + + + + + + + + FormArray - - - - - + + + + + - - - WithScheduleControls + + + CustomFormControl - - - +isTimeRestrictedControl: FormControl<bool> - +instanceID: FormControl<String> - +restrictedTimeStartControl: FormControl<Time> - +restrictedTimeStartPickerControl: FormControl<TimeOfDay> - +restrictedTimeEndControl: FormControl<Time> - +restrictedTimeEndPickerControl: FormControl<TimeOfDay> - +hasReminderControl: FormControl<bool> - +reminderTimeControl: FormControl<Time> - +reminderTimePickerControl: FormControl<TimeOfDay> - -_reminderControlStream: StreamSubscription<dynamic>? - +scheduleFormControls: Map<String, FormControl<Object>> - +hasReminder: bool - +isTimeRestricted: bool - +timeRestriction: List<Time>? + + + -_onValueChangedDebouncer: Debouncer? + -_onStatusChangedDebouncer: Debouncer? + +onValueChanged: void Function(T?)? + +onStatusChanged: void Function(ControlStatus)? + +onStatusChangedDebounceTime: int? + +onValueChangedDebounceTime: int? - - - +void setScheduleControlsFrom() - -dynamic _initReminderControl() + + + +void dispose() - - - - - + + + - - - InterventionsFormData + + + void Function(T?)? - - - +interventionsData: List<InterventionFormData> - +studyScheduleData: StudyScheduleFormData - +id: String - - + + + + - - - +Study apply() - +InterventionsFormData copy() + + + void Function(ControlStatus)? - - - - + + + + - - - InterventionFormView + + + UnsavedChangesDialog - - - +formViewModel: InterventionFormViewModel + + + +Widget build() - - - - - - - - InterventionTaskFormView - - + + + - - - +formViewModel: InterventionTaskFormViewModel + + + FormValidationSetEnum - - - - - + + + + + - - - InterventionFormData + + + FormControlValidation - - - +interventionId: String - +title: String - +description: String? - +tasksData: List<InterventionTaskFormData>? - +iconName: String? - <static>+kDefaultTitle: String - +id: String + + + +control: AbstractControl<dynamic> + +validators: List<Validator<dynamic>> + +asyncValidators: List<AsyncValidator<dynamic>>? + +validationMessages: Map<String, String Function(Object)> - - - +Intervention toIntervention() - +InterventionFormData copy() + + + +FormControlValidation merge() - - - - - + + + + + - - - StudyScheduleFormView + + + IFormData - - - +formViewModel: StudyScheduleControls + + + +id: String - - - -FormTableRow _renderCustomSequence() - +Widget build() + + + +IFormData copy() - - - - - + + + - - - StudyInfoFormData + + + FormInvalidException - - - +title: String - +description: String? - +iconName: String - +contactInfoFormData: StudyContactInfoFormData - +id: String + + + + + + + + + FormConfigException - - - +Study apply() - +StudyInfoFormData copy() + + + +message: String? - - - - - - - - - StudyContactInfoFormData - - + + + + - - - +organization: String? - +institutionalReviewBoard: String? - +institutionalReviewBoardNumber: String? - +researchers: String? - +email: String? - +website: String? - +phone: String? - +additionalInfo: String? - +id: String + + + IFormViewModelDelegate - - - +Study apply() - +StudyInfoFormData copy() + + + +dynamic onSave() + +void onCancel() - - - - + + + + - - - StudyDesignInfoFormView + + + FormControlOption - - - +Widget build() + + + +value: T + +label: String + +description: String? + +props: List<Object?> - - - - - - - - - StudyInfoFormViewModel - - + + + + - - - +study: Study - +titleControl: FormControl<String> - +iconControl: FormControl<IconOption> - +descriptionControl: FormControl<String> - +organizationControl: FormControl<String> - +reviewBoardControl: FormControl<String> - +reviewBoardNumberControl: FormControl<String> - +researchersControl: FormControl<String> - +emailControl: FormControl<String> - +websiteControl: FormControl<String> - +phoneControl: FormControl<String> - +additionalInfoControl: FormControl<String> - +form: FormGroup - +titles: Map<FormMode, String> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titleRequired: dynamic - +descriptionRequired: dynamic - +iconRequired: dynamic - +organizationRequired: dynamic - +reviewBoardRequired: dynamic - +reviewBoardNumberRequired: dynamic - +researchersRequired: dynamic - +emailRequired: dynamic - +phoneRequired: dynamic - +emailFormat: dynamic - +websiteFormat: dynamic + + + FormMode - - - +void setControlsFrom() - +StudyInfoFormData buildFormData() + + + +index: int + <static>+values: List<FormMode> + <static>+create: FormMode + <static>+readonly: FormMode + <static>+edit: FormMode - - - - - + + + + + - - - MeasurementSurveyFormData + + + EnrolledBadge - - - +measurementId: String - +title: String - +introText: String? - +outroText: String? - +questionnaireFormData: QuestionnaireFormData - <static>+kDefaultTitle: String - +id: String + + + +enrolledCount: int - - - +QuestionnaireTask toQuestionnaireTask() - +MeasurementSurveyFormData copy() + + + +Widget build() - - - - + + + + + - - - MeasurementSurveyFormView + + + StudyRecruitController - - - +formViewModel: MeasurementSurveyFormViewModel + + + +inviteCodeRepository: IInviteCodeRepository + -_invitesSubscription: StreamSubscription<List<WrappedModel<StudyInvite>>>? + + + + + + -dynamic _subscribeInvites() + +Intervention? getIntervention() + +int getParticipantCountForInvite() + +List<ModelAction<dynamic>> availableActions() + +List<ModelAction<dynamic>> availableInlineActions() + +void dispose() - - - - - + + + + - - - MeasurementSurveyFormViewModel + + + IInviteCodeRepository - - - +study: Study - +measurementIdControl: FormControl<String> - +instanceIdControl: FormControl<String> - +surveyTitleControl: FormControl<String> - +surveyIntroTextControl: FormControl<String> - +surveyOutroTextControl: FormControl<String> - +form: FormGroup - +measurementId: String - +instanceId: String - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titleRequired: dynamic - +atLeastOneQuestion: dynamic - +breadcrumbsTitle: String - +titles: Map<FormMode, String> + + + +dynamic isCodeAlreadyUsed() - - - +void setControlsFrom() - +MeasurementSurveyFormData buildFormData() - +List<ModelAction<dynamic>> availableActions() - +List<ModelAction<dynamic>> availablePopupActions() - +List<ModelAction<dynamic>> availableInlineActions() - +void onSelectItem() - +void onNewItem() - +SurveyQuestionFormRouteArgs buildNewFormRouteArgs() - +SurveyQuestionFormRouteArgs buildFormRouteArgs() - +MeasurementSurveyFormViewModel createDuplicate() + + + + + + + + StreamSubscription - - - - - + + + + + - - - SurveyPreview + + + StudyBaseController - - - +routeArgs: MeasurementFormRouteArgs + + + +studyId: String + +studyRepository: IStudyRepository + +router: GoRouter + +studySubscription: StreamSubscription<WrappedModel<Study>>? - - - +Widget build() + + + +dynamic subscribeStudy() + +dynamic onStudySubscriptionUpdate() + +dynamic onStudySubscriptionError() + +void dispose() - - - - + + + + - - - StudyDesignMeasurementsFormView + + + StudyRecruitScreen - - - +Widget build() + + + +Widget build() + -Widget _inviteCodesSectionHeader() + -Widget _newInviteCodeButton() + -dynamic _onSelectInvite() - - - - - + + + + + - - - MeasurementsFormData + + + InviteCodeFormView - - - +surveyMeasurements: List<MeasurementSurveyFormData> - +id: String + + + +formViewModel: InviteCodeFormViewModel - - - +Study apply() - +MeasurementsFormData copy() + + + +Widget build() + -List<FormTableRow> _conditionalInterventionRows() - - - - - + + + + + - - - MeasurementsFormViewModel + + + InviteCodeFormViewModel - - - +study: Study - +router: GoRouter - +measurementsArray: FormArray<dynamic> - +surveyMeasurementFormViewModels: FormViewModelCollection<MeasurementSurveyFormViewModel, MeasurementSurveyFormData> - +form: FormGroup - +measurementViewModels: List<MeasurementSurveyFormViewModel> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +measurementRequired: dynamic - +titles: Map<FormMode, String> + + + +study: Study + +inviteCodeRepository: IInviteCodeRepository + +codeControl: FormControl<String> + +codeControlValidationMessages: Map<String, String Function(dynamic)> + +isPreconfiguredScheduleControl: FormControl<bool> + +preconfiguredScheduleTypeControl: FormControl<PhaseSequence> + +interventionAControl: FormControl<String> + +interventionBControl: FormControl<String> + +form: FormGroup + +titles: Map<FormMode, String> + +interventionControlOptions: List<FormControlOption<String>> + +preconfiguredScheduleTypeOptions: List<FormControlOption<PhaseSequence>> + +isPreconfiguredSchedule: bool + +preconfiguredSchedule: List<String>? - - - +void read() - +void setControlsFrom() - +MeasurementsFormData buildFormData() - +List<ModelAction<dynamic>> availableActions() - +List<ModelAction<dynamic>> availablePopupActions() - +List<ModelAction<dynamic>> availableInlineActions() - +void onSelectItem() - +void onNewItem() - +MeasurementSurveyFormViewModel provide() - +void onCancel() - +dynamic onSave() + + + +void initControls() + -dynamic _uniqueInviteCode() + +void regenerateCode() + -String _generateCode() + +StudyInvite buildFormData() + +void setControlsFrom() + +dynamic save() - - - - + + + + + - - - StudyFormValidationSet + + + StudyInvitesTable - - - +index: int - <static>+values: List<StudyFormValidationSet> + + + +invites: List<StudyInvite> + +onSelect: void Function(StudyInvite) + +getActions: List<ModelAction<dynamic>> Function(StudyInvite) + +getInlineActions: List<ModelAction<dynamic>> Function(StudyInvite) + +getIntervention: Intervention? Function(String) + +getParticipantCountForInvite: int Function(StudyInvite) + + + + + + +Widget build() + -List<Widget> _buildRow() - - - - - + + + - - - ReportsFormViewModel + + + void Function(StudyInvite) - - - +study: Study - +router: GoRouter - +reportItemDelegate: ReportFormItemDelegate - +reportItemArray: FormArray<dynamic> - +reportItemFormViewModels: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData> - +form: FormGroup - +reportItemModels: List<ReportItemFormViewModel> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titles: Map<FormMode, String> - +canTestConsent: bool + + + + + + + + List<ModelAction<dynamic>> Function(StudyInvite) - - - +void setControlsFrom() - +ReportsFormData buildFormData() - +void read() - +ReportItemFormRouteArgs buildNewReportItemFormRouteArgs() - +ReportItemFormRouteArgs buildReportItemFormRouteArgs() - +dynamic testReport() - +void onCancel() - +dynamic onSave() - +ReportItemFormViewModel provide() + + + + + + + + Intervention? Function(String) - - - - - + + + - - - ReportFormItemDelegate + + + int Function(StudyInvite) - - - +formViewModelCollection: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData> - +owner: ReportsFormViewModel - +propagateOnSave: bool - +validationSet: dynamic + + + + + + + + + PublishSuccessDialog - - - +void onCancel() - +dynamic onSave() - +ReportItemFormViewModel provide() - +List<ModelAction<dynamic>> availableActions() - +void onNewItem() - +void onSelectItem() + + + +Widget build() - - - - - + + + + - - - ReportItemFormData + + + PublishDialog - - - +isPrimary: bool - +section: ReportSection - +id: String + + + +Widget build() - - - <static>+dynamic fromDomainModel() - +ReportItemFormData copy() + + + + + + + + + PublishConfirmationDialog - - - - - - - - ReportSection + + + +Widget build() - - - - - + + + + + - - - ReportItemFormView + + + FrameControlsWidget - - - +formViewModel: ReportItemFormViewModel - +studyId: String - +reportSectionColumnWidth: dynamic - +sectionTypeBodyBuilder: Widget Function(BuildContext) + + + +onRefresh: void Function()? + +onOpenNewTab: void Function()? + +enabled: bool - - - +Widget build() - -dynamic _buildSectionText() - -dynamic _buildSectionTypeHeader() + + + +Widget build() - - - - - + + + + - - - ReportItemFormViewModel + + + IStudyStatusBadgeViewModel - - - <static>+defaultSectionType: ReportSectionType - +sectionIdControl: FormControl<String> - +sectionTypeControl: FormControl<ReportSectionType> - +titleControl: FormControl<String> - +descriptionControl: FormControl<String> - +sectionControl: FormControl<ReportSection> - +dataReferenceControl: FormControl<DataReferenceIdentifier<num>> - +temporalAggregationControl: FormControl<TemporalAggregationFormatted> - +improvementDirectionControl: FormControl<ImprovementDirectionFormatted> - +alphaControl: FormControl<double> - -_controlsBySectionType: Map<ReportSectionType, FormGroup> - -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - -_validationConfigsBySectionType: Map<ReportSectionType, Map<FormValidationSetEnum, List<FormControlValidation>>> - +sectionBaseControls: Map<String, AbstractControl<dynamic>> - +form: FormGroup - +sectionId: String - +sectionType: ReportSectionType - <static>+sectionTypeControlOptions: List<FormControlOption<ReportSectionType>> - <static>+temporalAggregationControlOptions: List<FormControlOption<TemporalAggregationFormatted>> - <static>+improvementDirectionControlOptions: List<FormControlOption<ImprovementDirectionFormatted>> - +titles: Map<FormMode, String> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titleRequired: dynamic - +descriptionRequired: dynamic - +dataReferenceRequired: dynamic - +aggregationRequired: dynamic - +improvementDirectionRequired: dynamic - +alphaConfidenceRequired: dynamic + + + +studyParticipation: Participation? + +studyStatus: StudyStatus? - - - -List<FormControlValidation> _getValidationConfig() - +ReportItemFormData buildFormData() - +ReportItemFormViewModel createDuplicate() - +dynamic onSectionTypeChanged() - -void _updateFormControls() - +void setControlsFrom() + + + + + + + + Participation - - - + + + - - - Widget Function(BuildContext) + + + StudyStatus - - - - + + + + + - - - ReportSectionType + + + StudyStatusBadge - - - +index: int - <static>+values: List<ReportSectionType> - <static>+average: ReportSectionType - <static>+linearRegression: ReportSectionType + + + +participation: Participation? + +status: StudyStatus? + +type: BadgeType + +showPrefixIcon: bool + +showTooltip: bool + + + + + + +Widget build() - - - - - + + + + + - - - TemporalAggregationFormatted + + + RouteInformation - - - -_value: TemporalAggregation - <static>+values: List<TemporalAggregationFormatted> - +value: TemporalAggregation - +string: String - +icon: IconData? - +hashCode: int + + + +route: String? + +extra: String? + +cmd: String? + +data: String? - - - +bool ==() - +String toString() - +String toJson() - <static>+TemporalAggregationFormatted fromJson() + + + +String toString() - - - + + + + + - - - TemporalAggregation + + + PlatformController - - - - - - - - - - ImprovementDirectionFormatted + + + +studyId: String + +baseSrc: String + +previewSrc: String + +routeInformation: RouteInformation + +frameWidget: Widget - - - -_value: ImprovementDirection - <static>+values: List<ImprovementDirectionFormatted> - +value: ImprovementDirection - +string: String - +icon: IconData? - +hashCode: int + + + +void activate() + +void registerViews() + +void generateUrl() + +void navigate() + +void refresh() + +void listen() + +void send() + +void openNewPage() - - - +bool ==() - +String toString() - +String toJson() - <static>+ImprovementDirectionFormatted fromJson() + + + + + + + + + + WebController - - - - + + + +iFrameElement: IFrameElement + + - - - ImprovementDirection + + + +void activate() + +void registerViews() + +void generateUrl() + +void navigate() + +void refresh() + +void openNewPage() + +void listen() + +void send() - - - - - + + + - - - AverageSectionFormView + + + IFrameElement - - - +formViewModel: ReportItemFormViewModel - +studyId: String - +reportSectionColumnWidth: Map<int, TableColumnWidth> + + + + + + + + + MobileController - - - +Widget build() + + + +void openNewPage() + +void refresh() + +void registerViews() + +void listen() + +void send() + +void navigate() + +void activate() + +void generateUrl() - - - - - + + + + + - - - LinearRegressionSectionFormView + + + StudyController - - - +formViewModel: ReportItemFormViewModel - +studyId: String - +reportSectionColumnWidth: Map<int, TableColumnWidth> + + + +notificationService: INotificationService + +studyEventsSubscription: StreamSubscription<ModelEvent<Study>>? + +studyActions: List<ModelAction<dynamic>> - - - +Widget build() + + + +dynamic syncStudyStatus() + +dynamic onStudySubscriptionUpdate() + -dynamic _redirectNewToActualStudyID() + +dynamic publishStudy() + +void onChangeStudyParticipation() + +void onAddParticipants() + +void onSettingsPressed() + +void dispose() - - - - - + + + + - - - DataReferenceIdentifier + + + IStudyNavViewModel - - - +hashCode: int + + + +isEditTabEnabled: bool + +isTestTabEnabled: bool + +isRecruitTabEnabled: bool + +isMonitorTabEnabled: bool + +isAnalyzeTabEnabled: bool + +isSettingsEnabled: bool - - - +bool ==() + + + + + + + + + StudyNav + + + + + + <static>+dynamic tabs() + <static>+dynamic edit() + <static>+dynamic test() + <static>+dynamic recruit() + <static>+dynamic monitor() + <static>+dynamic analyze() - - - + + + + - - - DataReference + + + StudyDesignNav + + + + + + <static>+dynamic tabs() + <static>+dynamic info() + <static>+dynamic enrollment() + <static>+dynamic interventions() + <static>+dynamic measurements() + <static>+dynamic reports() - - - - - + + + + + - - - DataReferenceEditor + + + StudyParticipationBadge + + + + + + +participation: Participation + +type: BadgeType + +showPrefixIcon: bool + +center: bool + + + + + + +Widget build() - - - +formControl: FormControl<DataReferenceIdentifier<T>> - +availableTasks: List<Task> - +buildReactiveDropdownField: ReactiveDropdownField<dynamic> + + + + + + + + + IStudyRepository - - - +FormTableRow buildFormTableRow() - -List<DropdownMenuItem<DataReferenceIdentifier<dynamic>>> _dataReferenceItems() + + + +dynamic launch() + +dynamic deleteParticipants() - - - + + + + - - - ReactiveDropdownField + + + PreviewFrame - - - - - - - - - - ReportsFormData + + + +studyId: String + +routeArgs: StudyFormRouteArgs? + +route: String? - - - +reportItems: List<ReportItemFormData> - +id: String + + + + + + + + + IStudyAppBarViewModel - - - +Study apply() - +ReportsFormData copy() + + + +isSyncIndicatorVisible: bool + +isStatusBadgeVisible: bool + +isPublishVisible: bool - - - - + + + + - - - ReportStatus + + + StudyScaffold - - - +index: int - <static>+values: List<ReportStatus> - <static>+primary: ReportStatus - <static>+secondary: ReportStatus + + + +studyId: String + +tabs: List<NavbarTab>? + +tabsSubnav: List<NavbarTab>? + +selectedTab: NavbarTab? + +selectedTabSubnav: NavbarTab? + +body: StudyPageWidget + +drawer: Widget? + +disableActions: bool + +actionsSpacing: double + +actionsPadding: double + +layoutType: SingleColumnLayoutType? + +appbarHeight: double + +appbarSubnavHeight: double - - - - - + + + + + - - - ReportBadge + + + WebFrame - - - +status: ReportStatus? - +type: BadgeType - +showPrefixIcon: bool - +showTooltip: bool + + + +previewSrc: String + +studyId: String - - - +Widget build() + + + +Widget build() - - - - + + + + - - - StudyDesignReportsFormView + + + DisabledFrame - - - +Widget build() - -dynamic _showReportItemSidesheetWithArgs() + + + +Widget build() - - - - - + + + + + - - - StudyFormScaffold + + + PhoneContainer - - - +studyId: String - +formViewModelBuilder: T Function(WidgetRef) - +formViewBuilder: Widget Function(T) + + + <static>+defaultWidth: double + <static>+defaultHeight: double + +width: double + +height: double + +borderColor: Color + +borderWidth: double + +borderRadius: double + +innerContent: Widget + +innerContentBackgroundColor: Color? - - - +Widget build() + + + +Widget build() - - - + + + + - - - T Function(WidgetRef) + + + MobileFrame - - - - - - - - Widget Function(T) + + + +Widget build() - - - - + + + + - - - SurveyQuestionFormView + + + DesktopFrame - - - +formViewModel: QuestionFormViewModel - +isHtmlStyleable: bool + + + +Widget build() - - - - + + + + + - - - SurveyQuestionType + + + StudyTestScreen - - - +index: int - <static>+values: List<SurveyQuestionType> - <static>+choice: SurveyQuestionType - <static>+bool: SurveyQuestionType - <static>+scale: SurveyQuestionType - <static>+image: SurveyQuestionType - <static>+audio: SurveyQuestionType - <static>+freeText: SurveyQuestionType + + + +previewRoute: String? + + + + + + +Widget build() + +Widget? banner() + +dynamic load() + +dynamic save() + +dynamic showHelp() - - - - - + + + + + - - - QuestionFormData + + + StudySettingsFormViewModel - - - <static>+questionTypeFormDataFactories: Map<SurveyQuestionType, QuestionFormData Function(Question<dynamic>, List<EligibilityCriterion>)> - +questionId: String - +questionText: String - +questionInfoText: String? - +questionType: SurveyQuestionType - +responseOptionsValidity: Map<dynamic, bool> - +responseOptions: List<dynamic> - +id: String + + + +study: AsyncValue<Study> + +studyRepository: IStudyRepository + <static>+defaultPublishedToRegistry: bool + <static>+defaultPublishedToRegistryResults: bool + +isPublishedToRegistryControl: FormControl<bool> + +isPublishedToRegistryResultsControl: FormControl<bool> + +form: FormGroup + +titles: Map<FormMode, String> - - - +Question<dynamic> toQuestion() - +EligibilityCriterion toEligibilityCriterion() - +Answer<dynamic> constructAnswerFor() - +dynamic setResponseOptionsValidityFrom() - +QuestionFormData copy() + + + +void setControlsFrom() + +Study buildFormData() + +dynamic keepControlsSynced() + +dynamic save() + +dynamic setLaunchDefaults() - - - - - - - - - ChoiceQuestionFormData - - + + + + - - - +isMultipleChoice: bool - +answerOptions: List<String> - +responseOptions: List<String> + + + StudySettingsDialog - - - +Question<dynamic> toQuestion() - +QuestionFormData copy() - -Choice _buildChoiceForValue() - +Answer<dynamic> constructAnswerFor() + + + +Widget build() - - - - - - - - - BoolQuestionFormData - - + + + + - - - <static>+kResponseOptions: Map<String, bool> - +responseOptions: List<String> + + + StudyTestController - - - +Question<dynamic> toQuestion() - +BoolQuestionFormData copy() - +Answer<dynamic> constructAnswerFor() + + + +authRepository: IAuthRepository + +languageCode: String - - - - - - - - - ImageQuestionFormData - - + + + + - - - <static>+kResponseOptions: Map<String, FutureBlobFile> - +responseOptions: List<String> + + + TestAppRoutes - - - +Question<dynamic> toQuestion() - +ImageQuestionFormData copy() - +Answer<dynamic> constructAnswerFor() + + + <static>+studyOverview: String + <static>+eligibility: String + <static>+intervention: String + <static>+consent: String + <static>+journey: String + <static>+dashboard: String - - - - - + + + + + - - - AudioQuestionFormData + + + DrawerEntry - - - +maxRecordingDurationSeconds: int - <static>+kResponseOptions: Map<String, FutureBlobFile> - +responseOptions: List<String> + + + +localizedTitle: String Function() + +icon: IconData? + +localizedHelpText: String Function()? + +enabled: bool + +onSelected: void Function(BuildContext, WidgetRef)? + +autoCloseDrawer: bool + +title: String + +helpText: String? - - - +Question<dynamic> toQuestion() - +AudioQuestionFormData copy() - +Answer<dynamic> constructAnswerFor() + + + +void onClick() - - - - - + + + - - - ScaleQuestionFormData + + + String Function() - - - +minValue: double - +maxValue: double - +minLabel: String? - +maxLabel: String? - +midValues: List<double?> - +midLabels: List<String?> - +stepSize: double - +initialValue: double? - +minColor: Color? - +maxColor: Color? - +responseOptions: List<double> - +midAnnotations: List<Annotation> + + + + + + + + String Function()? - - - +ScaleQuestion toQuestion() - +QuestionFormData copy() - +Answer<dynamic> constructAnswerFor() + + + + + + + + void Function(BuildContext, WidgetRef)? - - - - - + + + + + - - - FreeTextQuestionFormData + + + GoRouterDrawerEntry - - - +textLengthRange: List<int> - +textType: FreeTextQuestionType - +textTypeExpression: String? - +responseOptions: List<String> + + + +intent: RoutingIntent + +onNavigated: void Function()? - - - +Question<dynamic> toQuestion() - +FreeTextQuestionFormData copy() - +Answer<dynamic> constructAnswerFor() + + + +void onClick() - - - + + + + - - - FreeTextQuestionType + + + AppDrawer + + + + + + +width: int + +autoCloseDrawer: bool + +leftPaddingEntries: double + +logoPaddingVertical: double + +logoPaddingHorizontal: double + +logoMaxHeight: double + +logoSectionMinHeight: double + +logoSectionMaxHeight: double - - - - + + + + - - - IScaleQuestionFormViewModel + + + StudyAnalyzeScreen - - - +isMidValuesClearedInfoVisible: bool + + + +Widget? banner() + +Widget build() - - - - + + + + - - - ScaleQuestionFormView + + + StudyAnalyzeController - - - +formViewModel: QuestionFormViewModel + + + +dynamic onExport() - - - - - + + + + - - - FreeTextQuestionFormView + + + StudyDesignInterventionsFormView - - - +formViewModel: QuestionFormViewModel - +generateLabelHelpTextMap: dynamic + + + +Widget build() - - - +Widget build() - +Widget disableOnReadonly() - +Widget generateRow() + + + + + + + + + StudyDesignPageWidget - - - - - - - - - - BoolQuestionFormView + + + +Widget? banner() - - - +formViewModel: QuestionFormViewModel + + + + + + + + + InterventionFormView - - - +Widget build() + + + +formViewModel: InterventionFormViewModel - - - - - + + + + + - - - AudioRecordingQuestionFormView + + + InterventionFormViewModel - - - +formViewModel: QuestionFormViewModel + + + +study: Study + +interventionIdControl: FormControl<String> + +interventionTitleControl: FormControl<String> + +interventionIconControl: FormControl<IconOption> + +interventionDescriptionControl: FormControl<String> + +interventionTasksArray: FormArray<dynamic> + +tasksCollection: FormViewModelCollection<InterventionTaskFormViewModel, InterventionTaskFormData> + +form: FormGroup + +interventionId: String + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titleRequired: dynamic + +atLeastOneTask: dynamic + +breadcrumbsTitle: String + +titles: Map<FormMode, String> - - - +Widget build() + + + +void setControlsFrom() + +InterventionFormData buildFormData() + +List<ModelAction<dynamic>> availableActions() + +List<ModelAction<dynamic>> availablePopupActions() + +List<ModelAction<dynamic>> availableInlineActions() + +void onSelectItem() + +void onNewItem() + +void onCancel() + +dynamic onSave() + +InterventionTaskFormViewModel provide() + +InterventionTaskFormRouteArgs buildNewFormRouteArgs() + +InterventionTaskFormRouteArgs buildFormRouteArgs() + +InterventionFormViewModel createDuplicate() - - - - - + + + + + - - - ChoiceQuestionFormView + + + InterventionPreview - - - +formViewModel: QuestionFormViewModel + + + +routeArgs: InterventionFormRouteArgs - - - +Widget build() + + + +Widget build() - - - - - + + + + + - - - ImageCapturingQuestionFormView + + + StudyScheduleFormView - - - +formViewModel: QuestionFormViewModel + + + +formViewModel: StudyScheduleControls - - - +Widget build() + + + -FormTableRow _renderCustomSequence() + +Widget build() - - - - - - - - - ScheduleControls - - + + + + + - - - +formViewModel: WithScheduleControls + + + StudyScheduleControls - - - +Widget build() - -List<FormTableRow> _conditionalTimeRestrictions() + + + <static>+defaultScheduleType: PhaseSequence + <static>+defaultScheduleTypeSequence: String + <static>+defaultNumCycles: int + <static>+defaultPeriodLength: int + +sequenceTypeControl: FormControl<PhaseSequence> + +sequenceTypeCustomControl: FormControl<String> + +phaseDurationControl: FormControl<int> + +numCyclesControl: FormControl<int> + +includeBaselineControl: FormControl<bool> + +studyScheduleControls: Map<String, FormControl<Object>> + <static>+kNumCyclesMin: int + <static>+kNumCyclesMax: int + <static>+kPhaseDurationMin: int + <static>+kPhaseDurationMax: int + +sequenceTypeControlOptions: List<FormControlOption<PhaseSequence>> + +studyScheduleValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +numCyclesRange: dynamic + +phaseDurationRange: dynamic + +customSequenceRequired: dynamic - - - - - - - - StudyUTimeOfDay + + + +void setStudyScheduleControlsFrom() + +StudyScheduleFormData buildStudyScheduleFormData() + +bool isSequencingCustom() - - - - - + + + + + - - - StudyFormViewModel + + + InterventionTaskFormData - - - +studyDirtyCopy: Study? - +studyRepository: IStudyRepository - +authRepository: IAuthRepository - +router: GoRouter - +studyInfoFormViewModel: StudyInfoFormViewModel - +enrollmentFormViewModel: EnrollmentFormViewModel - +measurementsFormViewModel: MeasurementsFormViewModel - +reportsFormViewModel: ReportsFormViewModel - +interventionsFormViewModel: InterventionsFormViewModel - +form: FormGroup - +isStudyReadonly: bool - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titles: Map<FormMode, String> + + + +taskId: String + +taskTitle: String + +taskDescription: String? + <static>+kDefaultTitle: String + +id: String - - - +void read() - +void setControlsFrom() - +Study buildFormData() - +void dispose() - +void onCancel() - +dynamic onSave() - -dynamic _applyAndSaveSubform() + + + +CheckmarkTask toTask() + +InterventionTaskFormData copy() - - - - - - - - StudyAnalyzeScreen - - + + + + + - - - +Widget? banner() - +Widget build() + + + IFormDataWithSchedule - - - - - - - - - StudyAnalyzeController + + + +instanceId: String + +isTimeLocked: bool + +timeLockStart: StudyUTimeOfDay? + +timeLockEnd: StudyUTimeOfDay? + +hasReminder: bool + +reminderTime: StudyUTimeOfDay? - - - +dynamic onExport() + + + +Schedule toSchedule() - - - - - - - - StudyMonitorScreen - - + + + + + - - - +Widget build() + + + InterventionsFormViewModel - - - - - - - - - StudiesTableItem + + + +study: Study + +router: GoRouter + +interventionsArray: FormArray<dynamic> + +interventionsCollection: FormViewModelCollection<InterventionFormViewModel, InterventionFormData> + +form: FormGroup + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +interventionsRequired: dynamic + +titles: Map<FormMode, String> + +canTestStudySchedule: bool - - - +study: Study - +itemHeight: double - +itemPadding: double - +rowSpacing: double - +columnSpacing: double - +actions: List<ModelAction<dynamic>> - +columnSizes: List<StudiesTableColumnSize> - +isPinned: bool - +onPinnedChanged: void Function(Study, bool)? - +onTap: void Function(Study)? + + + +void setControlsFrom() + +InterventionsFormData buildFormData() + +void read() + +List<ModelAction<dynamic>> availableActions() + +List<ModelAction<dynamic>> availablePopupActions() + +List<ModelAction<dynamic>> availableInlineActions() + +void onSelectItem() + +void onNewItem() + +InterventionFormViewModel provide() + +void onCancel() + +dynamic onSave() + +dynamic testStudySchedule() - - - + + + + + - - - void Function(Study, bool)? + + + InterventionTaskFormViewModel - - - - - - - - void Function(Study)? + + + +taskIdControl: FormControl<String> + +instanceIdControl: FormControl<String> + +taskTitleControl: FormControl<String> + +taskDescriptionControl: FormControl<String> + +markAsCompletedControl: FormControl<bool> + +form: FormGroup + +taskId: String + +instanceId: String + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titleRequired: dynamic + +titles: Map<FormMode, String> - - - - - - - - - - DashboardController + + + +void setControlsFrom() + +InterventionTaskFormData buildFormData() + +InterventionTaskFormViewModel createDuplicate() - - - +studyRepository: IStudyRepository - +authRepository: IAuthRepository - +userRepository: IUserRepository - +router: GoRouter - -_studiesSubscription: StreamSubscription<List<WrappedModel<Study>>>? - +searchController: SearchController - +isSortAscending: bool + + + + + + + + + + WithScheduleControls - - - -dynamic _subscribeStudies() - +dynamic setSearchText() - +dynamic setStudiesFilter() - +dynamic onSelectStudy() - +dynamic onClickNewStudy() - +dynamic pinStudy() - +dynamic pinOffStudy() - +void setSorting() - +void filterStudies() - +void sortStudies() - +bool isSortingActiveForColumn() - +bool isPinned() - +List<ModelAction<dynamic>> availableActions() - +void dispose() + + + +isTimeRestrictedControl: FormControl<bool> + +instanceID: FormControl<String> + +restrictedTimeStartControl: FormControl<Time> + +restrictedTimeStartPickerControl: FormControl<TimeOfDay> + +restrictedTimeEndControl: FormControl<Time> + +restrictedTimeEndPickerControl: FormControl<TimeOfDay> + +hasReminderControl: FormControl<bool> + +reminderTimeControl: FormControl<Time> + +reminderTimePickerControl: FormControl<TimeOfDay> + -_reminderControlStream: StreamSubscription<dynamic>? + +scheduleFormControls: Map<String, FormControl<Object>> + +hasReminder: bool + +isTimeRestricted: bool + +timeRestriction: List<Time>? - - - - - - - - - SearchController + + + +void setScheduleControlsFrom() + -dynamic _initReminderControl() - - - +setText: void Function(String) + + + + + + + + PhaseSequence - - - - - + + + + + - - - StudiesTableColumnSize + + + InterventionFormData - - - +collapsed: bool - +flex: int? - +width: double? + + + +interventionId: String + +title: String + +description: String? + +tasksData: List<InterventionTaskFormData>? + +iconName: String? + <static>+kDefaultTitle: String + +id: String - - - +Widget createContainer() + + + +Intervention toIntervention() + +InterventionFormData copy() - - - - - + + + + + - - - StudiesTable + + + StudyScheduleFormData - - - +itemHeight: double - +itemPadding: double - +rowSpacing: double - +columnSpacing: double - +compactWidthThreshold: double - +superCompactWidthThreshold: double - +compactStatTitleThreshold: double - +studies: List<Study> - +onSelect: void Function(Study) - +getActions: List<ModelAction<dynamic>> Function(Study) - +emptyWidget: Widget - +pinnedStudies: Iterable<String> - +dashboardController: DashboardController + + + +sequenceType: PhaseSequence + +sequenceTypeCustom: String + +numCycles: int + +phaseDuration: int + +includeBaseline: bool + +id: String - - - +Widget build() - -Widget _buildColumnHeader() + + + +StudySchedule toStudySchedule() + +Study apply() + +StudyScheduleFormData copy() - - - + + + + - - - void Function(Study) + + + IStudyFormData - - - - - - - - List<ModelAction<dynamic>> Function(Study) + + + +Study apply() - - - - + + + + - - - StudiesTableColumn + + + InterventionTaskFormView - - - +index: int - <static>+values: List<StudiesTableColumn> - <static>+pin: StudiesTableColumn - <static>+title: StudiesTableColumn - <static>+status: StudiesTableColumn - <static>+participation: StudiesTableColumn - <static>+createdAt: StudiesTableColumn - <static>+enrolled: StudiesTableColumn - <static>+active: StudiesTableColumn - <static>+completed: StudiesTableColumn - <static>+action: StudiesTableColumn + + + +formViewModel: InterventionTaskFormViewModel - - - - + + + + + - - - DashboardScreen + + + InterventionsFormData - - - +filter: StudiesFilter? + + + +interventionsData: List<InterventionFormData> + +studyScheduleData: StudyScheduleFormData + +id: String + + + + + + +Study apply() + +InterventionsFormData copy() - - - - + + + + - - - StudiesFilter + + + StudyDesignReportsFormView - - - +index: int - <static>+values: List<StudiesFilter> + + + +Widget build() + -dynamic _showReportItemSidesheetWithArgs() - - - - - + + + + + - - - DashboardScaffold + + + ReportItemFormData - - - <static>+compactWidthThreshold: double - +body: Widget + + + +isPrimary: bool + +section: ReportSection + +id: String - - - +Widget build() + + + <static>+dynamic fromDomainModel() + +ReportItemFormData copy() - - - - + + + - - - StudiesTableColumnHeader + + + ReportSection - - - +title: String - +sortable: bool - +sortAscending: bool - +sortingActive: bool - +onSort: void Function()? + + + + + + + + + + DataReferenceEditor - - - - - - - - - AccountSettingsDialog + + + +formControl: FormControl<DataReferenceIdentifier<T>> + +availableTasks: List<Task> + +buildReactiveDropdownField: ReactiveDropdownField<dynamic> - - - +Widget build() + + + +FormTableRow buildFormTableRow() + -List<DropdownMenuItem<DataReferenceIdentifier<dynamic>>> _dataReferenceItems() - - - - - + + + - - - StudyInvitesTable + + + ReactiveDropdownField - - - +invites: List<StudyInvite> - +onSelect: void Function(StudyInvite) - +getActions: List<ModelAction<dynamic>> Function(StudyInvite) - +getInlineActions: List<ModelAction<dynamic>> Function(StudyInvite) - +getIntervention: Intervention? Function(String) - +getParticipantCountForInvite: int Function(StudyInvite) + + + + + + + + + + TemporalAggregationFormatted - - - +Widget build() - -List<Widget> _buildRow() + + + -_value: TemporalAggregation + <static>+values: List<TemporalAggregationFormatted> + +value: TemporalAggregation + +string: String + +icon: IconData? + +hashCode: int - - - - - - - - void Function(StudyInvite) + + + +bool ==() + +String toString() + +String toJson() + <static>+TemporalAggregationFormatted fromJson() - - - + + + - - - List<ModelAction<dynamic>> Function(StudyInvite) + + + TemporalAggregation - - - + + + + + - - - Intervention? Function(String) + + + ImprovementDirectionFormatted - - - - + + + -_value: ImprovementDirection + <static>+values: List<ImprovementDirectionFormatted> + +value: ImprovementDirection + +string: String + +icon: IconData? + +hashCode: int + + - - - int Function(StudyInvite) + + + +bool ==() + +String toString() + +String toJson() + <static>+ImprovementDirectionFormatted fromJson() - - - - - + + + - - - StudyRecruitController + + + ImprovementDirection - - - +inviteCodeRepository: IInviteCodeRepository - -_invitesSubscription: StreamSubscription<List<WrappedModel<StudyInvite>>>? + + + + + + + + + ReportSectionType - - - -dynamic _subscribeInvites() - +Intervention? getIntervention() - +int getParticipantCountForInvite() - +List<ModelAction<dynamic>> availableActions() - +List<ModelAction<dynamic>> availableInlineActions() - +void dispose() + + + +index: int + <static>+values: List<ReportSectionType> + <static>+average: ReportSectionType + <static>+linearRegression: ReportSectionType - - - - - + + + + + - - - InviteCodeFormViewModel + + + AverageSectionFormView - - - +study: Study - +inviteCodeRepository: IInviteCodeRepository - +codeControl: FormControl<String> - +codeControlValidationMessages: Map<String, String Function(dynamic)> - +isPreconfiguredScheduleControl: FormControl<bool> - +preconfiguredScheduleTypeControl: FormControl<PhaseSequence> - +interventionAControl: FormControl<String> - +interventionBControl: FormControl<String> - +form: FormGroup - +titles: Map<FormMode, String> - +interventionControlOptions: List<FormControlOption<String>> - +preconfiguredScheduleTypeOptions: List<FormControlOption<PhaseSequence>> - +isPreconfiguredSchedule: bool - +preconfiguredSchedule: List<String>? + + + +formViewModel: ReportItemFormViewModel + +studyId: String + +reportSectionColumnWidth: Map<int, TableColumnWidth> - - - +void initControls() - -dynamic _uniqueInviteCode() - +void regenerateCode() - -String _generateCode() - +StudyInvite buildFormData() - +void setControlsFrom() - +dynamic save() + + + +Widget build() - - - - - + + + + + - - - EnrolledBadge + + + ReportItemFormViewModel - - - +enrolledCount: int + + + <static>+defaultSectionType: ReportSectionType + +sectionIdControl: FormControl<String> + +sectionTypeControl: FormControl<ReportSectionType> + +titleControl: FormControl<String> + +descriptionControl: FormControl<String> + +sectionControl: FormControl<ReportSection> + +dataReferenceControl: FormControl<DataReferenceIdentifier<num>> + +temporalAggregationControl: FormControl<TemporalAggregationFormatted> + +improvementDirectionControl: FormControl<ImprovementDirectionFormatted> + +alphaControl: FormControl<double> + -_controlsBySectionType: Map<ReportSectionType, FormGroup> + -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + -_validationConfigsBySectionType: Map<ReportSectionType, Map<FormValidationSetEnum, List<FormControlValidation>>> + +sectionBaseControls: Map<String, AbstractControl<dynamic>> + +form: FormGroup + +sectionId: String + +sectionType: ReportSectionType + <static>+sectionTypeControlOptions: List<FormControlOption<ReportSectionType>> + <static>+temporalAggregationControlOptions: List<FormControlOption<TemporalAggregationFormatted>> + <static>+improvementDirectionControlOptions: List<FormControlOption<ImprovementDirectionFormatted>> + +titles: Map<FormMode, String> + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titleRequired: dynamic + +descriptionRequired: dynamic + +dataReferenceRequired: dynamic + +aggregationRequired: dynamic + +improvementDirectionRequired: dynamic + +alphaConfidenceRequired: dynamic - - - +Widget build() + + + -List<FormControlValidation> _getValidationConfig() + +ReportItemFormData buildFormData() + +ReportItemFormViewModel createDuplicate() + +dynamic onSectionTypeChanged() + -void _updateFormControls() + +void setControlsFrom() - - - - - + + + + + - - - InviteCodeFormView + + + DataReferenceIdentifier - - - +formViewModel: InviteCodeFormViewModel + + + +hashCode: int - - - +Widget build() - -List<FormTableRow> _conditionalInterventionRows() + + + +bool ==() - - - - - - - - StudyRecruitScreen - - + + + - - - +Widget build() - -Widget _inviteCodesSectionHeader() - -Widget _newInviteCodeButton() - -dynamic _onSelectInvite() + + + DataReference - - - - - + + + + + - - - DrawerEntry + + + LinearRegressionSectionFormView - - - +localizedTitle: String Function() - +icon: IconData? - +localizedHelpText: String Function()? - +enabled: bool - +onSelected: void Function(BuildContext, WidgetRef)? - +autoCloseDrawer: bool - +title: String - +helpText: String? + + + +formViewModel: ReportItemFormViewModel + +studyId: String + +reportSectionColumnWidth: Map<int, TableColumnWidth> - - - +void onClick() + + + +Widget build() - - - + + + + + - - - String Function() + + + ReportItemFormView - - - - - - - - String Function()? + + + +formViewModel: ReportItemFormViewModel + +studyId: String + +reportSectionColumnWidth: dynamic + +sectionTypeBodyBuilder: Widget Function(BuildContext) - - - - - - - - void Function(BuildContext, WidgetRef)? + + + +Widget build() + -dynamic _buildSectionText() + -dynamic _buildSectionTypeHeader() - - - - - + + + + + - - - GoRouterDrawerEntry + + + ReportsFormViewModel - - - +intent: RoutingIntent - +onNavigated: void Function()? + + + +study: Study + +router: GoRouter + +reportItemDelegate: ReportFormItemDelegate + +reportItemArray: FormArray<dynamic> + +reportItemFormViewModels: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData> + +form: FormGroup + +reportItemModels: List<ReportItemFormViewModel> + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titles: Map<FormMode, String> + +canTestConsent: bool - - - +void onClick() + + + +void setControlsFrom() + +ReportsFormData buildFormData() + +void read() + +ReportItemFormRouteArgs buildNewReportItemFormRouteArgs() + +ReportItemFormRouteArgs buildReportItemFormRouteArgs() + +dynamic testReport() + +void onCancel() + +dynamic onSave() + +ReportItemFormViewModel provide() - - - - + + + + + - - - AppDrawer + + + ReportFormItemDelegate - - - +width: int - +autoCloseDrawer: bool - +leftPaddingEntries: double - +logoPaddingVertical: double - +logoPaddingHorizontal: double - +logoMaxHeight: double - +logoSectionMinHeight: double - +logoSectionMaxHeight: double + + + +formViewModelCollection: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData> + +owner: ReportsFormViewModel + +propagateOnSave: bool + +validationSet: dynamic + + + + + + +void onCancel() + +dynamic onSave() + +ReportItemFormViewModel provide() + +List<ModelAction<dynamic>> availableActions() + +void onNewItem() + +void onSelectItem() - - - - + + + + + - - - NotificationDispatcher + + + ReportBadge - - - +child: Widget? - +snackbarInnerPadding: double - +snackbarWidth: double? - +snackbarBehavior: SnackBarBehavior - +snackbarDefaultDuration: int + + + +status: ReportStatus? + +type: BadgeType + +showPrefixIcon: bool + +showTooltip: bool - - - - - - - - SnackBarBehavior + + + +Widget build() - - - - + + + + - - - Notifications + + + ReportStatus - - - <static>+credentialsInvalid: SnackbarIntent - <static>+userAlreadyRegistered: SnackbarIntent - <static>+passwordReset: SnackbarIntent - <static>+passwordResetSuccess: SnackbarIntent - <static>+studyDeleted: SnackbarIntent - <static>+inviteCodeDeleted: SnackbarIntent - <static>+inviteCodeClipped: SnackbarIntent - <static>+studyDeleteConfirmation: AlertIntent + + + +index: int + <static>+values: List<ReportStatus> + <static>+primary: ReportStatus + <static>+secondary: ReportStatus - - - - + + + + + - - - SnackbarIntent + + + ReportsFormData - - - +duration: int? + + + +reportItems: List<ReportItemFormData> + +id: String - - - - - - - - - AlertIntent + + + +Study apply() + +ReportsFormData copy() - - - +title: String - +dismissOnAction: bool - +isDestructive: dynamic + + + + + + + + + + StudyInfoFormViewModel - - - - - - - - - NotificationDefaultActions + + + +study: Study + +titleControl: FormControl<String> + +iconControl: FormControl<IconOption> + +descriptionControl: FormControl<String> + +organizationControl: FormControl<String> + +reviewBoardControl: FormControl<String> + +reviewBoardNumberControl: FormControl<String> + +researchersControl: FormControl<String> + +emailControl: FormControl<String> + +websiteControl: FormControl<String> + +phoneControl: FormControl<String> + +additionalInfoControl: FormControl<String> + +form: FormGroup + +titles: Map<FormMode, String> + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titleRequired: dynamic + +descriptionRequired: dynamic + +iconRequired: dynamic + +organizationRequired: dynamic + +reviewBoardRequired: dynamic + +reviewBoardNumberRequired: dynamic + +researchersRequired: dynamic + +emailRequired: dynamic + +phoneRequired: dynamic + +emailFormat: dynamic + +websiteFormat: dynamic - - - <static>+cancel: NotificationAction + + + +void setControlsFrom() + +StudyInfoFormData buildFormData() - - - - + + + + - - - NotificationAction + + + StudyDesignInfoFormView - - - +label: String - +onSelect: dynamic Function() - +isDestructive: bool + + + +Widget build() - - - - - + + + + + - - - NotificationIntent + + + StudyInfoFormData - - - +message: String? - +customContent: Widget? - +icon: IconData? - +actions: List<NotificationAction>? - +type: NotificationType + + + +title: String + +description: String? + +iconName: String + +contactInfoFormData: StudyContactInfoFormData + +id: String - - - +void register() + + + +Study apply() + +StudyInfoFormData copy() - - - - - - - - NotificationType - - + + + + + - - - +index: int - <static>+values: List<NotificationType> - <static>+snackbar: NotificationType - <static>+alert: NotificationType - <static>+custom: NotificationType + + + StudyContactInfoFormData - - - - - - - - - IClipboardService + + + +organization: String? + +institutionalReviewBoard: String? + +institutionalReviewBoardNumber: String? + +researchers: String? + +email: String? + +website: String? + +phone: String? + +additionalInfo: String? + +id: String - - - +dynamic copy() + + + +Study apply() + +StudyInfoFormData copy() - - - - + + + + - - - ClipboardService + + + StudyFormValidationSet - - - +dynamic copy() + + + +index: int + <static>+values: List<StudyFormValidationSet> - - - - - + + + + + - - - NotificationService + + + MeasurementsFormData - - - -_streamController: BehaviorSubject<NotificationIntent> + + + +surveyMeasurements: List<MeasurementSurveyFormData> + +id: String - - - +Stream<NotificationIntent> watchNotifications() - +void showMessage() - +void show() - +void dispose() + + + +Study apply() + +MeasurementsFormData copy() - - - - + + + + - - - Assets + + + MeasurementSurveyFormView - - - <static>+logoWide: String + + + +formViewModel: MeasurementSurveyFormViewModel - - - - + + + + + - - - Hyperlink + + + MeasurementSurveyFormViewModel - - - +text: String - +url: String? - +onClick: void Function()? - +linkColor: Color - +hoverColor: Color? - +visitedColor: Color? - +style: TextStyle? - +hoverStyle: TextStyle? - +visitedStyle: TextStyle? - +icon: IconData? - +iconSize: double? + + + +study: Study + +measurementIdControl: FormControl<String> + +instanceIdControl: FormControl<String> + +surveyTitleControl: FormControl<String> + +surveyIntroTextControl: FormControl<String> + +surveyOutroTextControl: FormControl<String> + +form: FormGroup + +measurementId: String + +instanceId: String + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titleRequired: dynamic + +atLeastOneQuestion: dynamic + +breadcrumbsTitle: String + +titles: Map<FormMode, String> - - - - - - - - TextStyle + + + +void setControlsFrom() + +MeasurementSurveyFormData buildFormData() + +List<ModelAction<dynamic>> availableActions() + +List<ModelAction<dynamic>> availablePopupActions() + +List<ModelAction<dynamic>> availableInlineActions() + +void onSelectItem() + +void onNewItem() + +SurveyQuestionFormRouteArgs buildNewFormRouteArgs() + +SurveyQuestionFormRouteArgs buildFormRouteArgs() + +MeasurementSurveyFormViewModel createDuplicate() - - - - + + + + + - - - StandardTableColumn + + + SurveyPreview - - - +label: String - +tooltip: String? - +columnWidth: TableColumnWidth - +sortable: bool - +sortAscending: bool? - +sortableIcon: Widget? + + + +routeArgs: MeasurementFormRouteArgs - - - - - - - - TableColumnWidth + + + +Widget build() - - - - + + + + + - - - StandardTable + + + MeasurementSurveyFormData - - - +items: List<T> - +inputColumns: List<StandardTableColumn> - +onSelectItem: void Function(T) - +trailingActionsAt: List<ModelAction<dynamic>> Function(T, int)? - +trailingActionsMenuType: ActionMenuType? - +sortColumnPredicates: List<int Function(T, T)?>? - +pinnedPredicates: int Function(T, T)? - +headerRowBuilder: TableRow Function(BuildContext, List<StandardTableColumn>)? - +dataRowBuilder: TableRow Function(BuildContext, List<StandardTableColumn>)? - +inputTrailingActionsColumn: StandardTableColumn - +tableWrapper: Widget Function(Widget)? - +cellSpacing: double - +rowSpacing: double - +minRowHeight: double? - +showTableHeader: bool - +hideLeadingTrailingWhenEmpty: bool - +leadingWidget: Widget? - +trailingWidget: Widget? - +leadingWidgetSpacing: double? - +trailingWidgetSpacing: double? - +emptyWidget: Widget? - +rowStyle: StandardTableStyle - +disableRowInteractions: bool + + + +measurementId: String + +title: String + +introText: String? + +outroText: String? + +questionnaireFormData: QuestionnaireFormData + <static>+kDefaultTitle: String + +id: String - - - - - - - - List<ModelAction<dynamic>> Function(T, int)? + + + +QuestionnaireTask toQuestionnaireTask() + +MeasurementSurveyFormData copy() - - - - - - - - ActionMenuType - - + + + + + - - - +index: int - <static>+values: List<ActionMenuType> - <static>+inline: ActionMenuType - <static>+popup: ActionMenuType + + + QuestionnaireFormData - - - - - - - - int Function(T, T)? + + + +questionsData: List<QuestionFormData>? + +id: String - - - - - - - - TableRow Function(BuildContext, List<StandardTableColumn>)? + + + +StudyUQuestionnaire toQuestionnaire() + +List<EligibilityCriterion> toEligibilityCriteria() + +QuestionnaireFormData copy() - - - + + + + + - - - Widget Function(Widget)? + + + WithQuestionnaireControls - - - - - - - - - StandardTableStyle + + + +questionsArray: FormArray<dynamic> + +questionFormViewModels: FormViewModelCollection<Q, QuestionFormData> + +questionnaireControls: Map<String, FormArray<dynamic>> + +propagateOnSave: bool + +questionModels: List<Q> + +questionTitles: Map<FormMode, String Function()> - - - +index: int - <static>+values: List<StandardTableStyle> - <static>+plain: StandardTableStyle - <static>+material: StandardTableStyle + + + +void setQuestionnaireControlsFrom() + +QuestionnaireFormData buildQuestionnaireFormData() + +void read() + +void onCancel() + +dynamic onSave() + +Q provide() + +Q provideQuestionFormViewModel() - - - - - - - - - HelpIcon - - + + + + - - - +tooltipText: String? + + + StudyDesignMeasurementsFormView - - - +Widget build() + + + +Widget build() - - - - - + + + + + - - - ErrorPage + + + MeasurementsFormViewModel - - - +error: Exception? + + + +study: Study + +router: GoRouter + +measurementsArray: FormArray<dynamic> + +surveyMeasurementFormViewModels: FormViewModelCollection<MeasurementSurveyFormViewModel, MeasurementSurveyFormData> + +form: FormGroup + +measurementViewModels: List<MeasurementSurveyFormViewModel> + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +measurementRequired: dynamic + +titles: Map<FormMode, String> - - - +Widget build() + + + +void read() + +void setControlsFrom() + +MeasurementsFormData buildFormData() + +List<ModelAction<dynamic>> availableActions() + +List<ModelAction<dynamic>> availablePopupActions() + +List<ModelAction<dynamic>> availableInlineActions() + +void onSelectItem() + +void onNewItem() + +MeasurementSurveyFormViewModel provide() + +void onCancel() + +dynamic onSave() - - - - + + + + + - - - SplashPage + + + StudyFormScaffold - - - +Widget build() + + + +studyId: String + +formViewModelBuilder: T Function(WidgetRef) + +formViewBuilder: Widget Function(T) - - - - - - - - - - IconPack + + + +Widget build() - - - <static>+defaultPack: List<IconOption> - <static>+material: List<IconOption> - - + + + + - - - <static>+IconOption? resolveIconByName() + + + T Function(WidgetRef) - - - - - + + + + + - - - IconOption + + + ConsentItemFormViewModel - - - +name: String - +icon: IconData? - +isEmpty: bool - +props: List<Object?> + + + +consentIdControl: FormControl<String> + +titleControl: FormControl<String> + +descriptionControl: FormControl<String> + +iconControl: FormControl<IconOption> + +form: FormGroup + +consentId: String + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titleRequired: dynamic + +descriptionRequired: dynamic + +titles: Map<FormMode, String> - - - +String toJson() - <static>+IconOption fromJson() + + + +void setControlsFrom() + +ConsentItemFormData buildFormData() + +ConsentItemFormViewModel createDuplicate() - - - + + + + - - - ReactiveIconPicker + + + StudyDesignEnrollmentFormView - - - - - - - - ReactiveFocusableFormField + + + +Widget build() + -dynamic _showScreenerQuestionSidesheetWithArgs() + -dynamic _showConsentItemSidesheetWithArgs() - - - - - - - - - IconPicker - - + + + + - - - +iconOptions: List<IconOption> - +selectedOption: IconOption? - +onSelect: void Function(IconOption)? - +galleryIconSize: double? - +selectedIconSize: double? - +focusNode: FocusNode? - +isDisabled: bool + + + IScreenerQuestionLogicFormViewModel - - - +Widget build() + + + +isDirtyOptionsBannerVisible: bool - - - + + + + + - - - void Function(IconOption)? + + + ScreenerQuestionLogicFormView - - - - + + + +formViewModel: ScreenerQuestionFormViewModel + + - - - FocusNode + + + +Widget build() + -dynamic _buildInfoBanner() + -dynamic _buildAnswerOptionsLogicControls() + -List<Widget> _buildOptionLogicRow() - - - - - + + + + + - - - IconPickerField + + + ScreenerQuestionFormViewModel - - - +iconOptions: List<IconOption> - +selectedOption: IconOption? - +selectedIconSize: double? - +galleryIconSize: double? - +onSelect: void Function(IconOption)? - +focusNode: FocusNode? - +isDisabled: bool + + + <static>+defaultResponseOptionValidity: bool + +responseOptionsDisabledArray: FormArray<dynamic> + +responseOptionsLogicControls: FormArray<bool> + +responseOptionsLogicDescriptionControls: FormArray<String> + -_questionBaseControls: Map<String, AbstractControl<dynamic>> + +prevResponseOptionControls: List<AbstractControl<dynamic>> + +prevResponseOptionValues: List<dynamic> + +responseOptionsDisabledControls: List<AbstractControl<dynamic>> + +logicControlOptions: List<FormControlOption<bool>> + +questionBaseControls: Map<String, AbstractControl<dynamic>> + +isDirtyOptionsBannerVisible: bool - - - +Widget build() + + + +dynamic onResponseOptionsChanged() + +void setControlsFrom() + +QuestionFormData buildFormData() + -List<FormControl<dynamic>> _copyFormControls() + -AbstractControl<dynamic>? _findAssociatedLogicControlFor() + -AbstractControl<dynamic>? _findAssociatedControlFor() + +ScreenerQuestionFormViewModel createDuplicate() - - - - - + + + + + - - - IconPickerGallery + + + ConsentItemFormData - - - +iconOptions: List<IconOption> - +onSelect: void Function(IconOption)? - +iconSize: double + + + +consentId: String + +title: String + +description: String + +iconName: String? + +id: String - - - +Widget build() + + + +ConsentItem toConsentItem() + +ConsentItemFormData copy() - - - - + + + + - - - FormSideSheetTab + + + ConsentItemFormView - - - +formViewBuilder: Widget Function(T) + + + +formViewModel: ConsentItemFormViewModel - - - - - - - - SidesheetTab - - + + + + + - - - +builder: Widget Function(BuildContext) + + + EnrollmentFormData - - - - - - - - - Sidesheet + + + <static>+kDefaultEnrollmentType: Participation + +enrollmentType: Participation + +questionnaireFormData: QuestionnaireFormData + +consentItemsFormData: List<ConsentItemFormData>? + +id: String - - - <static>+kDefaultWidth: double - +titleText: String - +body: Widget? - +tabs: List<SidesheetTab>? - +actionButtons: List<Widget>? - +width: double? - +withCloseButton: bool - +ignoreAppBar: bool - +collapseSingleTab: bool - +bodyPadding: EdgeInsets? - +wrapContent: Widget Function(Widget)? + + + +Study apply() + +EnrollmentFormData copy() - - - + + + + + - - - ReactiveCustomColorPicker + + + QuestionFormViewModel - - - - + + + <static>+defaultQuestionType: SurveyQuestionType + -_titles: Map<FormMode, String Function()>? + +questionIdControl: FormControl<String> + +questionTypeControl: FormControl<SurveyQuestionType> + +questionTextControl: FormControl<String> + +questionInfoTextControl: FormControl<String> + +questionBaseControls: Map<String, AbstractControl<dynamic>> + +isMultipleChoiceControl: FormControl<bool> + +choiceResponseOptionsArray: FormArray<dynamic> + +customOptionsMin: int + +customOptionsMax: int + +customOptionsInitial: int + +boolResponseOptionsArray: FormArray<String> + +imageResponseOptionsArray: FormArray<String> + <static>+kDefaultMaxRecordingDurationSeconds: int + <static>+kMaxRecordingDurationSeconds: int + +audioResponseOptionsArray: FormArray<String> + +maxRecordingDurationSecondsControl: FormControl<int> + <static>+kDefaultScaleMinValue: int + <static>+kDefaultScaleMaxValue: int + <static>+kNumMidValueControls: int + <static>+kMidValueDebounceMilliseconds: int + +scaleMinValueControl: FormControl<int> + +scaleMaxValueControl: FormControl<int> + -_scaleRangeControl: FormControl<int> + +scaleMinLabelControl: FormControl<String> + +scaleMaxLabelControl: FormControl<String> + +scaleMidValueControls: FormArray<int> + +scaleMidLabelControls: FormArray<String?> + -_scaleResponseOptionsArray: FormArray<int> + +scaleMinColorControl: FormControl<SerializableColor> + +scaleMaxColorControl: FormControl<SerializableColor> + +prevMidValues: List<int?>? + +freeTextTypeControl: FormControl<FreeTextQuestionType> + +customRegexControl: FormControl<String> + +freeTextResponseOptionsArray: FormArray<dynamic> + +freeTextLengthMin: AbstractControl<int> + +freeTextLengthMax: AbstractControl<int> + +freeTextExampleTextControl: FormControl<String> + <static>+kDefaultFreeTextMinLength: int + <static>+kDefaultFreeTextMaxLength: int + +freeTextLengthControl: FormControl<RangeValues> + -_controlsByQuestionType: Map<SurveyQuestionType, FormGroup> + -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + -_validationConfigsByQuestionType: Map<SurveyQuestionType, Map<FormValidationSetEnum, List<FormControlValidation>>> + +form: FormGroup + +questionId: String + +questionType: SurveyQuestionType + +questionTypeControlOptions: List<FormControlOption<SurveyQuestionType>> + +answerOptionsArray: FormArray<dynamic> + +answerOptionsControls: List<AbstractControl<dynamic>> + +validAnswerOptions: List<String> + +boolOptions: List<AbstractControl<String>> + +imageOptions: List<AbstractControl<String>> + +audioOptions: List<AbstractControl<String>> + +scaleMinValue: int + +scaleMaxValue: int + +scaleRange: int + +scaleAllValueControls: List<AbstractControl<int>> + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +questionTextRequired: dynamic + +numValidChoiceOptions: dynamic + +scaleRangeValid: dynamic + +maxRecordingDurationValid: dynamic + +titles: Map<FormMode, String> + +isAddOptionButtonVisible: bool + +isMidValuesClearedInfoVisible: bool + + - - - ReactiveFormField + + + +String? scaleMidLabelAt() + -dynamic _onScaleRangeChanged() + -dynamic _applyInputFormatters() + -dynamic _updateScaleMidValueControls() + -Map<String, dynamic>? _validateFreeText() + -dynamic _onFreeTextLengthChanged() + -List<FormControlValidation> _getValidationConfig() + +dynamic onQuestionTypeChanged() + +dynamic onResponseOptionsChanged() + -void _updateFormControls() + +void initControls() + +void setControlsFrom() + +QuestionFormData buildFormData() + +List<ModelAction<dynamic>> availableActions() + +void onNewItem() + +void onSelectItem() + +dynamic save() + +QuestionFormViewModel createDuplicate() - - - - - + + + + + - - - TextParagraph + + + EnrollmentFormViewModel - - - +text: String? - +style: TextStyle? - +selectable: bool - +span: List<TextSpan>? + + + +study: Study + +router: GoRouter + +consentItemDelegate: EnrollmentFormConsentItemDelegate + +enrollmentTypeControl: FormControl<Participation> + +consentItemArray: FormArray<dynamic> + +consentItemFormViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData> + +form: FormGroup + +enrollmentTypeControlOptions: List<FormControlOption<Participation>> + +consentItemModels: List<ConsentItemFormViewModel> + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titles: Map<FormMode, String> + +canTestScreener: bool + +canTestConsent: bool + +questionTitles: Map<FormMode, String Function()> - - - +Widget build() + + + +void setControlsFrom() + +EnrollmentFormData buildFormData() + +void read() + +List<ModelAction<dynamic>> availableActions() + +List<ModelAction<dynamic>> availablePopupActions() + +List<ModelAction<dynamic>> availableInlineActions() + +void onSelectItem() + +void onNewItem() + +ScreenerQuestionFormRouteArgs buildNewScreenerQuestionFormRouteArgs() + +ScreenerQuestionFormRouteArgs buildScreenerQuestionFormRouteArgs() + +ConsentItemFormRouteArgs buildNewConsentItemFormRouteArgs() + +ConsentItemFormRouteArgs buildConsentItemFormRouteArgs() + +dynamic testScreener() + +dynamic testConsent() + +ScreenerQuestionFormViewModel provideQuestionFormViewModel() - - - - - + + + + + - - - ConstrainedWidthFlexible + + + EnrollmentFormConsentItemDelegate - - - +minWidth: double - +maxWidth: double - +flex: int - +flexSum: int - +child: Widget - +outerConstraints: BoxConstraints + + + +formViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData> + +owner: EnrollmentFormViewModel + +propagateOnSave: bool + +validationSet: dynamic - - - +Widget build() - -double _getWidth() + + + +void onCancel() + +dynamic onSave() + +ConsentItemFormViewModel provide() + +List<ModelAction<dynamic>> availableActions() + +void onNewItem() + +void onSelectItem() - - - + + + + + - - - BoxConstraints + + + StudyFormViewModel - - - - - - - - - PrimaryButton + + + +studyDirtyCopy: Study? + +studyRepository: IStudyRepository + +authRepository: IAuthRepository + +router: GoRouter + +studyInfoFormViewModel: StudyInfoFormViewModel + +enrollmentFormViewModel: EnrollmentFormViewModel + +measurementsFormViewModel: MeasurementsFormViewModel + +reportsFormViewModel: ReportsFormViewModel + +interventionsFormViewModel: InterventionsFormViewModel + +form: FormGroup + +isStudyReadonly: bool + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titles: Map<FormMode, String> - - - +text: String - +icon: IconData? - +isLoading: bool - +showLoadingEarliestAfterMs: int - +onPressed: void Function()? - +tooltip: String - +tooltipDisabled: String - +enabled: bool - +onPressedFuture: dynamic Function()? - +innerPadding: EdgeInsets - +minimumSize: Size? - +isDisabled: bool + + + +void read() + +void setControlsFrom() + +Study buildFormData() + +void dispose() + +void onCancel() + +dynamic onSave() + -dynamic _applyAndSaveSubform() - - - + + + + + - - - dynamic Function()? + + + QuestionFormData - - - - - - - - Size + + + <static>+questionTypeFormDataFactories: Map<SurveyQuestionType, QuestionFormData Function(Question<dynamic>, List<EligibilityCriterion>)> + +questionId: String + +questionText: String + +questionInfoText: String? + +questionType: SurveyQuestionType + +responseOptionsValidity: Map<dynamic, bool> + +responseOptions: List<dynamic> + +id: String - - - - - - - - - - EmptyBody + + + +Question<dynamic> toQuestion() + +EligibilityCriterion toEligibilityCriterion() + +Answer<dynamic> constructAnswerFor() + +dynamic setResponseOptionsValidityFrom() + +QuestionFormData copy() - - - +icon: IconData? - +leading: Widget? - +leadingSpacing: double? - +title: String? - +description: String? - +button: Widget? + + + + + + + + + SurveyQuestionType - - - +Widget build() + + + +index: int + <static>+values: List<SurveyQuestionType> + <static>+choice: SurveyQuestionType + <static>+bool: SurveyQuestionType + <static>+scale: SurveyQuestionType + <static>+image: SurveyQuestionType + <static>+audio: SurveyQuestionType + <static>+freeText: SurveyQuestionType - - - - - + + + + + - - - Badge + + + ChoiceQuestionFormData - - - +icon: IconData? - +color: Color? - +borderRadius: double - +label: String - +type: BadgeType - +padding: EdgeInsets - +iconSize: double? - +labelStyle: TextStyle? - +center: bool + + + +isMultipleChoice: bool + +answerOptions: List<String> + +responseOptions: List<String> - - - +Widget build() - -Color? _getBackgroundColor() - -Color _getBorderColor() - -Color? _getLabelColor() + + + +Question<dynamic> toQuestion() + +QuestionFormData copy() + -Choice _buildChoiceForValue() + +Answer<dynamic> constructAnswerFor() - - - + + + + + - - - NullHelperDecoration + + + BoolQuestionFormData - - - - + + + <static>+kResponseOptions: Map<String, bool> + +responseOptions: List<String> + + - - - InputDecoration + + + +Question<dynamic> toQuestion() + +BoolQuestionFormData copy() + +Answer<dynamic> constructAnswerFor() - - - - + + + + + - - - Collapsible + + + ImageQuestionFormData - - - +contentBuilder: Widget Function(BuildContext, bool) - +headerBuilder: Widget Function(BuildContext, bool)? - +title: String? - +isCollapsed: bool + + + <static>+kResponseOptions: Map<String, FutureBlobFile> + +responseOptions: List<String> + + + + + + +Question<dynamic> toQuestion() + +ImageQuestionFormData copy() + +Answer<dynamic> constructAnswerFor() - - - + + + + + - - - Widget Function(BuildContext, bool) + + + AudioQuestionFormData - - - - + + + +maxRecordingDurationSeconds: int + <static>+kResponseOptions: Map<String, FutureBlobFile> + +responseOptions: List<String> + + - - - Widget Function(BuildContext, bool)? + + + +Question<dynamic> toQuestion() + +AudioQuestionFormData copy() + +Answer<dynamic> constructAnswerFor() - - - - - + + + + + - - - ActionMenuInline + + + ScaleQuestionFormData - - - +actions: List<ModelAction<dynamic>> - +iconSize: double? - +visible: bool - +splashRadius: double? - +paddingVertical: double? - +paddingHorizontal: double? + + + +minValue: double + +maxValue: double + +minLabel: String? + +maxLabel: String? + +midValues: List<double?> + +midLabels: List<String?> + +stepSize: double + +initialValue: double? + +minColor: Color? + +maxColor: Color? + +responseOptions: List<double> + +midAnnotations: List<Annotation> - - - +Widget build() + + + +ScaleQuestion toQuestion() + +QuestionFormData copy() + +Answer<dynamic> constructAnswerFor() - - - - - + + + + + - - - StudyULogo + + + FreeTextQuestionFormData - - - +onTap: void Function()? + + + +textLengthRange: List<int> + +textType: FreeTextQuestionType + +textTypeExpression: String? + +responseOptions: List<String> - - - +Widget build() + + + +Question<dynamic> toQuestion() + +FreeTextQuestionFormData copy() + +Answer<dynamic> constructAnswerFor() - - - - - - - - TabbedNavbar - - + + + - - - +tabs: List<T> - +selectedTab: T? - +indicator: BoxDecoration? - +height: double? - +disabledBackgroundColor: Color? - +disabledTooltipText: String? - +onSelect: void Function(int, T)? - +labelPadding: EdgeInsets? - +labelSpacing: double? - +indicatorSize: TabBarIndicatorSize? - +isScrollable: bool - +backgroundColor: Color? - +labelColorHover: Color? - +unselectedLabelColorHover: Color? + + + FreeTextQuestionType - - - + + + + + - - - BoxDecoration + + + AudioRecordingQuestionFormView - - - - - - - - void Function(int, T)? + + + +formViewModel: QuestionFormViewModel - - - - - - - - TabBarIndicatorSize + + + +Widget build() - - - - - + + + + + - - - HtmlStylingBanner + + + FreeTextQuestionFormView - - - +isDismissed: bool - +onDismissed: dynamic Function()? + + + +formViewModel: QuestionFormViewModel + +generateLabelHelpTextMap: dynamic - - - +Widget build() + + + +Widget build() + +Widget disableOnReadonly() + +Widget generateRow() - - - - - - - - ISyncIndicatorViewModel - - + + + + + - - - +isDirty: bool - +lastSynced: DateTime? + + + ImageCapturingQuestionFormView - - - - - - - - - SyncIndicator + + + +formViewModel: QuestionFormViewModel - - - +state: AsyncValue<T> - +lastSynced: DateTime? - +isDirty: bool - +animationDuration: int - +iconSize: double + + + +Widget build() - - - - + + + + - - - Search + + + IScaleQuestionFormViewModel - - - +onQueryChanged: dynamic Function(String) - +searchController: SearchController? - +hintText: String? - +initialText: String? + + + +isMidValuesClearedInfoVisible: bool - - - + + + + - - - dynamic Function(String) + + + ScaleQuestionFormView - - - - - - - - void Function(String) + + + +formViewModel: QuestionFormViewModel - - - - - + + + + + - - - SecondaryButton + + + ChoiceQuestionFormView - - - +text: String - +icon: IconData? - +isLoading: bool - +onPressed: void Function()? + + + +formViewModel: QuestionFormViewModel - - - +Widget build() + + + +Widget build() - - - - + + + + + - - - FormTableRow + + + BoolQuestionFormView - - - +label: String? - +labelBuilder: Widget Function(BuildContext)? - +labelStyle: TextStyle? - +labelHelpText: String? - +input: Widget - +control: AbstractControl<dynamic>? - +layout: FormTableRowLayout? + + + +formViewModel: QuestionFormViewModel - - - - - - - - Widget Function(BuildContext)? + + + +Widget build() - - - - + + + + - - - FormTableRowLayout + + + SurveyQuestionFormView - - - +index: int - <static>+values: List<FormTableRowLayout> - <static>+vertical: FormTableRowLayout - <static>+horizontal: FormTableRowLayout + + + +formViewModel: QuestionFormViewModel + +isHtmlStyleable: bool - - - - - + + + - - - FormTableLayout + + + StudyUTimeOfDay - - - +rows: List<FormTableRow> - +columnWidths: Map<int, TableColumnWidth> - +rowDivider: Widget? - +rowLayout: FormTableRowLayout? - +rowLabelStyle: TextStyle? + + + + + + + + + + ScheduleControls - - - +Widget build() + + + +formViewModel: WithScheduleControls - - - - - - - - - - FormSectionHeader + + + +Widget build() + -List<FormTableRow> _conditionalTimeRestrictions() - - - +title: String - +titleTextStyle: TextStyle? - +helpText: String? - +divider: bool - +helpTextDisabled: bool + + + + + + + + + StudiesTableColumnHeader - - - +Widget build() + + + +title: String + +sortable: bool + +sortAscending: bool + +sortingActive: bool + +onSort: void Function()? - - - - - - - - - FormLabel - - + + + + - - - +labelText: String? - +helpText: String? - +labelTextStyle: TextStyle? - +layout: FormTableRowLayout? + + + DashboardScreen - - - +Widget build() + + + +filter: StudiesFilter? - - - - + + + + - - - MouseEventsRegion + + + StudiesFilter - - - +onTap: void Function()? - +onHover: void Function(PointerHoverEvent)? - +onEnter: void Function(PointerEnterEvent)? - +onExit: void Function(PointerExitEvent)? - +autoselectCursor: bool - +cursor: SystemMouseCursor - <static>+defaultCursor: SystemMouseCursor - +autoCursor: SystemMouseCursor + + + +index: int + <static>+values: List<StudiesFilter> - - - + + + + + - - - void Function(PointerHoverEvent)? + + + DashboardScaffold + + + + + + <static>+compactWidthThreshold: double + +body: Widget - - - - - - - - void Function(PointerEnterEvent)? + + + +Widget build() - - - + + + + + - - - void Function(PointerExitEvent)? + + + DashboardController - - - - + + + +studyRepository: IStudyRepository + +authRepository: IAuthRepository + +userRepository: IUserRepository + +router: GoRouter + -_studiesSubscription: StreamSubscription<List<WrappedModel<Study>>>? + +searchController: SearchController + +isSortAscending: bool + + - - - SystemMouseCursor + + + -dynamic _subscribeStudies() + +dynamic setSearchText() + +dynamic setStudiesFilter() + +dynamic onSelectStudy() + +dynamic onClickNewStudy() + +dynamic pinStudy() + +dynamic pinOffStudy() + +void setSorting() + +void filterStudies() + +void sortStudies() + +bool isSortingActiveForColumn() + +bool isPinned() + +List<ModelAction<dynamic>> availableActions() + +void dispose() - - - - - + + + + + - - - FormControlLabel + + + IUserRepository - - - +formControl: AbstractControl<dynamic> - +text: String - +isClickable: bool - +textStyle: TextStyle? - +onClick: void Function(AbstractControl<dynamic>)? + + + +user: StudyUUser - - - +Widget build() + + + +dynamic fetchUser() + +dynamic saveUser() + +dynamic updatePreferences() - - - + + + + + - - - void Function(AbstractControl<dynamic>)? + + + StudiesTableColumnSize - - - - - - - - - - SingleColumnLayout + + + +collapsed: bool + +flex: int? + +width: double? - - - <static>+defaultConstraints: BoxConstraints - <static>+defaultConstraintsNarrow: BoxConstraints - +body: Widget - +header: Widget? - +stickyHeader: bool - +constraints: BoxConstraints? - +scroll: bool - +padding: EdgeInsets? + + + +Widget createContainer() - - - <static>+dynamic fromType() + + + + + + + + + + StudiesTable - - - - - - - - - TwoColumnLayout + + + +itemHeight: double + +itemPadding: double + +rowSpacing: double + +columnSpacing: double + +compactWidthThreshold: double + +superCompactWidthThreshold: double + +compactStatTitleThreshold: double + +studies: List<Study> + +onSelect: void Function(Study) + +getActions: List<ModelAction<dynamic>> Function(Study) + +emptyWidget: Widget + +pinnedStudies: Iterable<String> + +dashboardController: DashboardController - - - <static>+defaultDivider: VerticalDivider - <static>+defaultContentPadding: EdgeInsets - <static>+slimContentPadding: EdgeInsets - +leftWidget: Widget - +rightWidget: Widget - +dividerWidget: Widget? - +headerWidget: Widget? - +flexLeft: int? - +flexRight: int? - +constraintsLeft: BoxConstraints? - +constraintsRight: BoxConstraints? - +scrollLeft: bool - +scrollRight: bool - +paddingLeft: EdgeInsets? - +paddingRight: EdgeInsets? - +backgroundColorLeft: Color? - +backgroundColorRight: Color? - +stretchHeight: bool + + + +Widget build() + -Widget _buildColumnHeader() - - - + + + - - - VerticalDivider + + + void Function(Study) - - - - + + + - - - UnderConstruction + + + List<ModelAction<dynamic>> Function(Study) - - - +Widget build() + + + + + + + + + StudiesTableColumn - - - - - - - - - - StandardDialog + + + +index: int + <static>+values: List<StudiesTableColumn> + <static>+pin: StudiesTableColumn + <static>+title: StudiesTableColumn + <static>+status: StudiesTableColumn + <static>+participation: StudiesTableColumn + <static>+createdAt: StudiesTableColumn + <static>+enrolled: StudiesTableColumn + <static>+active: StudiesTableColumn + <static>+completed: StudiesTableColumn + <static>+action: StudiesTableColumn - - - +title: Widget? - +titleText: String? - +body: Widget - +actionButtons: List<Widget> - +backgroundColor: Color? - +borderRadius: double? - +width: double? - +height: double? - +minWidth: double - +minHeight: double - +maxWidth: double? - +maxHeight: double? - +padding: EdgeInsets + + + + + + + + + StudiesTableItem - - - +Widget build() + + + +study: Study + +itemHeight: double + +itemPadding: double + +rowSpacing: double + +columnSpacing: double + +actions: List<ModelAction<dynamic>> + +columnSizes: List<StudiesTableColumnSize> + +isPinned: bool + +onPinnedChanged: void Function(Study, bool)? + +onTap: void Function(Study)? - - - - - + + + - - - IndicatorRangeSliderThumbShape + + + void Function(Study, bool)? - - - +buildContext: BuildContext - +start: T - +end: T - - + + + + - - - +Size getPreferredSize() - +void paint() + + + void Function(Study)? - - - + + + - - - BuildContext + + + App - - - - + + + + - - - RangeSliderThumbShape + + + AppContent - - - - + + + + - - - BannerBox + + + AccountSettingsDialog - - - +prefixIcon: Widget? - +body: Widget - +style: BannerStyle - +padding: EdgeInsets? - +noPrefix: bool - +dismissable: bool - +isDismissed: bool? - +onDismissed: dynamic Function()? - +dismissIconSize: double + + + +Widget build() - - - - + + + + + - - - BannerStyle + + + ModelRepository - - - +index: int - <static>+values: List<BannerStyle> - <static>+warning: BannerStyle - <static>+info: BannerStyle - <static>+error: BannerStyle + + + +delegate: IModelRepositoryDelegate<T> + -_allModelsStreamController: BehaviorSubject<List<WrappedModel<T>>> + -_allModelEventsStreamController: BehaviorSubject<ModelEvent<T>> + +modelStreamControllers: Map<String, BehaviorSubject<WrappedModel<T>>> + +modelEventsStreamControllers: Map<String, BehaviorSubject<ModelEvent<T>>> + -_allModels: Map<String, WrappedModel<T>> + + + + + + +WrappedModel<T>? get() + +dynamic fetchAll() + +dynamic fetch() + +dynamic save() + +dynamic delete() + +dynamic duplicateAndSave() + +dynamic duplicateAndSaveFromRemote() + +Stream<List<WrappedModel<T>>> watchAll() + +Stream<WrappedModel<T>> watch() + +Stream<ModelEvent<T>> watchAllChanges() + +Stream<ModelEvent<T>> watchChanges() + -dynamic _buildModelSpecificController() + +dynamic ensurePersisted() + +WrappedModel<T> upsertLocally() + +List<WrappedModel<T>> upsertAllLocally() + +dynamic emitUpdate() + +dynamic emitModelEvent() + +dynamic emitError() + +void dispose() + +List<ModelAction<dynamic>> availableActions() - - - - - + + + + + - - - ActionPopUpMenuButton + + + InviteCodeRepository - - - +actions: List<ModelAction<dynamic>> - +triggerIconColor: Color? - +triggerIconColorHover: Color? - +triggerIconSize: double - +disableSplashEffect: bool - +hideOnEmpty: bool - +orientation: Axis - +elevation: double? - +splashRadius: double? - +enabled: bool - +position: PopupMenuPosition + + + +studyId: String + +ref: ProviderRef<dynamic> + +apiClient: StudyUApi + +authRepository: IAuthRepository + +studyRepository: IStudyRepository + +study: Study - - - +Widget build() - -Widget _buildPopupMenu() + + + +String getKey() + +dynamic isCodeAlreadyUsed() + +List<ModelAction<dynamic>> availableActions() + +dynamic emitUpdate() - - - + + + - - - Axis + + + ProviderRef - - - + + + + - - - PopupMenuPosition + + + StudyUApi + + + + + + +dynamic saveStudy() + +dynamic fetchStudy() + +dynamic getUserStudies() + +dynamic deleteStudy() + +dynamic saveStudyInvite() + +dynamic fetchStudyInvite() + +dynamic deleteStudyInvite() + +dynamic deleteParticipants() + +dynamic fetchAppConfig() + +dynamic fetchUser() + +dynamic saveUser() - - - - - + + + + + - - - DismissButton + + + InviteCodeRepositoryDelegate - - - +onPressed: void Function()? - +text: String? + + + +study: Study + +apiClient: StudyUApi + +studyRepository: IStudyRepository - - - +Widget build() + + + +dynamic fetch() + +dynamic fetchAll() + +dynamic save() + +dynamic delete() + +dynamic onError() + +StudyInvite createDuplicate() + +StudyInvite createNewInstance() - - - - + + + + - - - FormScaffold + + + IModelRepositoryDelegate - - - +formViewModel: T - +actions: List<Widget>? - +body: Widget - +drawer: Widget? - +actionsSpacing: double - +actionsPadding: double + + + +dynamic fetchAll() + +dynamic fetch() + +dynamic save() + +dynamic delete() + +T createNewInstance() + +T createDuplicate() + +dynamic onError() - - - - - + + + + + - - - AsyncValueWidget + + + StudyRepository - - - +value: AsyncValue<T> - +data: Widget Function(T) - +error: Widget Function(Object, StackTrace?)? - +loading: Widget Function()? - +empty: Widget Function()? + + + +apiClient: StudyUApi + +authRepository: IAuthRepository + +ref: ProviderRef<dynamic> + +sortCallback: void Function()? - - - +Widget build() - -Widget _buildDataOrEmptyWidget() - -Widget _defaultError() - -Widget _defaultLoad() + + + +String getKey() + +dynamic deleteParticipants() + +dynamic launch() + +List<ModelAction<dynamic>> availableActions() - - - + + + + + - - - Widget Function(Object, StackTrace?)? + + + StudyRepositoryDelegate + + + + + + +apiClient: StudyUApi + +authRepository: IAuthRepository + + + + + + +dynamic fetchAll() + +dynamic fetch() + +dynamic save() + +dynamic delete() + +dynamic onError() + +Study createNewInstance() + +Study createDuplicate() - - - + + + - - - Widget Function()? + + + APIException - - - + + + - - - ResultTypes + + + StudyNotFoundException - - - - + + + - - - MeasurementResultTypes + + + MeasurementNotFoundException - - - <static>+questionnaire: String - <static>+values: List<String> + + + + + + + + QuestionNotFoundException - - - - + + + - - - InterventionResultTypes + + + ConsentItemNotFoundException - - - <static>+checkmarkTask: String - <static>+values: List<String> + + + + + + + + InterventionNotFoundException - - - - + + + - - - StudyExportData + + + InterventionTaskNotFoundException - - - +study: Study - +measurementsData: List<Map<String, dynamic>> - +interventionsData: List<Map<String, dynamic>> - +mediaData: List<String> - +isEmpty: bool + + + + + + + + ReportNotFoundException - - - - - + + + - - - StudyTemplates + + + ReportSectionNotFoundException - - - <static>+kUnnamedStudyTitle: String - - + + + + - - - <static>+Study emptyDraft() + + + StudyInviteNotFoundException - - - - + + + - - - StudyActionType + + + UserNotFoundException - - - +index: int - <static>+values: List<StudyActionType> - <static>+pin: StudyActionType - <static>+pinoff: StudyActionType - <static>+edit: StudyActionType - <static>+duplicate: StudyActionType - <static>+duplicateDraft: StudyActionType - <static>+addCollaborator: StudyActionType - <static>+export: StudyActionType - <static>+delete: StudyActionType + + + + + + + + + + StudyUApiClient - - - - - - - - - DropdownMenuItemTheme + + + +supabaseClient: SupabaseClient + <static>+studyColumns: List<String> + <static>+studyWithParticipantActivityColumns: List<String> + +testDelayMilliseconds: int - - - +iconTheme: IconThemeData? + + + +dynamic deleteParticipants() + +dynamic getUserStudies() + +dynamic fetchStudy() + +dynamic deleteStudy() + +dynamic saveStudy() + +dynamic fetchStudyInvite() + +dynamic saveStudyInvite() + +dynamic deleteStudyInvite() + +dynamic fetchAppConfig() + +dynamic fetchUser() + +dynamic saveUser() + -dynamic _awaitGuarded() + -dynamic _apiException() + -dynamic _testDelay() - - - + + + - - - IconThemeData + + + SupabaseClient - - - + + + + - - - Diagnosticable + + + SupabaseClientDependant - - - - - - - - - - ThemeConfig + + + +supabaseClient: SupabaseClient - - - <static>+kMinContentWidth: double - <static>+kMaxContentWidth: double - <static>+kHoverFadeFactor: double - <static>+kMuteFadeFactor: double + + + + + + + + + SupabaseQueryMixin - - - <static>+dynamic bodyBackgroundColor() - <static>+Color modalBarrierColor() - <static>+Color containerColor() - <static>+Color colorPickerInitialColor() - <static>+TextStyle bodyTextMuted() - <static>+TextStyle bodyTextBackground() - <static>+double iconSplashRadius() - <static>+Color sidesheetBackgroundColor() - <static>+InputDecorationTheme dropdownInputDecorationTheme() - <static>+DropdownMenuItemTheme dropdownMenuItemTheme() + + + +dynamic deleteAll() + +dynamic getAll() + +dynamic getById() + +dynamic getByColumn() + +List<T> deserializeList() + +T deserializeObject() - - - - + + + + - - - NoAnimationPageTransitionsBuilder + + + IAppRepository - - - +Widget buildTransitions() + + + +dynamic fetchAppConfig() + +void dispose() - - - + + + + + - - - PageTransitionsBuilder + + + AppRepository - - - - - - - - - WebTransitionBuilder + + + +apiClient: StudyUApi - - - +Widget buildTransitions() + + + +dynamic fetchAppConfig() + +void dispose() - - - - - - - - ThemeSettingChange - - + + + - - - +settings: ThemeSettings + + + StudyUUser - - - - + + + + + - - - ThemeSettings + + + UserRepository - - - +sourceColor: Color - +themeMode: ThemeMode + + + +apiClient: StudyUApi + +authRepository: IAuthRepository + +ref: Ref<Object?> + +user: StudyUUser - - - - - - - - Notification + + + +dynamic fetchUser() + +dynamic saveUser() + +dynamic updatePreferences() - - - - - + + + - - - ThemeProvider + + + Ref - - - +settings: ValueNotifier<ThemeSettings> - +lightDynamic: ColorScheme? - +darkDynamic: ColorScheme? - +pageTransitionsTheme: PageTransitionsTheme - +shapeMedium: ShapeBorder + + + + + + + + + PreferenceAction - - - +Color custom() - +Color blend() - +Color source() - +ColorScheme colors() - +CardTheme cardTheme() - +ListTileThemeData listTileTheme() - +AppBarTheme appBarTheme() - +SnackBarThemeData snackBarThemeData() - +TabBarTheme tabBarTheme() - +BottomAppBarTheme bottomAppBarTheme() - +BottomNavigationBarThemeData bottomNavigationBarTheme() - +SwitchThemeData switchTheme() - +InputDecorationTheme inputDecorationTheme() - +TextTheme textTheme() - +DividerThemeData dividerTheme() - +NavigationRailThemeData navigationRailTheme() - +DrawerThemeData drawerTheme() - +IconThemeData iconTheme() - +CheckboxThemeData checkboxTheme() - +RadioThemeData radioTheme() - +TooltipThemeData tooltipTheme() - +ThemeData light() - +ThemeData dark() - +ThemeMode themeMode() - +ThemeData theme() - <static>+ThemeProvider of() - +bool updateShouldNotify() + + + +index: int + <static>+values: List<PreferenceAction> + <static>+pin: PreferenceAction + <static>+pinOff: PreferenceAction - - - + + + - - - ValueNotifier + + + User - - - + + + - - - ColorScheme + + + Session - - - + + + + + - - - PageTransitionsTheme + + + AuthRepository - - - - - - - - ShapeBorder + + + +supabaseClient: SupabaseClient + +allowPasswordReset: bool + +authClient: GoTrueClient + +session: Session? + +serializedSession: String? + +currentUser: User? + +isLoggedIn: bool - - - - - - - - InheritedWidget + + + -void _registerAuthListener() + +dynamic signUp() + +dynamic signInWith() + +dynamic signOut() + +dynamic resetPasswordForEmail() + +dynamic updateUser() + +void dispose() + +dynamic onAppStart() - - - + + + - - - ThemeMode + + + GoTrueClient - - - - - + + + - - - CustomColor + + + StudyLaunched - - - +name: String - +color: Color - +blend: bool + + + + + + + + + ModelEvent - - - +Color value() + + + +modelId: String + +model: T - - - - + + + + - - - LanguagePicker + + + SupabaseQueryError - - - +languagePickerType: LanguagePickerType - +iconColor: Color? - +offset: Offset? + + + +statusCode: String? + +message: String + +details: dynamic - - - - + + + + + - - - LanguagePickerType + + + WrappedModel - - - +index: int - <static>+values: List<LanguagePickerType> - <static>+field: LanguagePickerType - <static>+icon: LanguagePickerType + + + -_model: T + +asyncValue: AsyncValue<T> + +isLocalOnly: bool + +isDirty: bool + +isDeleted: bool + +lastSaved: DateTime? + +lastFetched: DateTime? + +lastUpdated: DateTime? + +model: T - - - - - - - - Offset + + + +dynamic markWithError() + +dynamic markAsLoading() + +dynamic markAsFetched() + +dynamic markAsSaved() - - - - + + + - - - PlatformLocaleMobile + + + ModelRepositoryException - - - +Locale getPlatformLocale() + + + + + + + + ModelNotFoundException - - - - + + + + - - - PlatformLocale + + + IModelRepository - - - +Locale getPlatformLocale() + + + +String getKey() + +WrappedModel<T>? get() + +dynamic fetchAll() + +dynamic fetch() + +dynamic save() + +dynamic delete() + +dynamic duplicateAndSave() + +dynamic duplicateAndSaveFromRemote() + +Stream<WrappedModel<T>> watch() + +Stream<List<WrappedModel<T>>> watchAll() + +Stream<ModelEvent<T>> watchChanges() + +Stream<ModelEvent<T>> watchAllChanges() + +dynamic ensurePersisted() + +void dispose() - - - - + + + - - - PlatformLocaleWeb + + + IsFetched - - - +Locale getPlatformLocale() + + + + + + + + IsSaving - - - - + + + - - - AppTranslation + + + IsSaved - - - <static>+dynamic init() + + + + + + + + IsDeleted From 43671cb53100d3602304d6fb94288fa4f2c3755f Mon Sep 17 00:00:00 2001 From: Johannes Vedder Date: Fri, 26 Apr 2024 10:40:10 +0200 Subject: [PATCH 016/314] chore: upgrade deps --- app/pubspec.lock | 16 ++++++++-------- designer_v2/pubspec.lock | 12 ++++++------ designer_v2/pubspec.yaml | 2 +- flutter_common/pubspec.lock | 4 ++-- pubspec.lock | 4 ++-- 5 files changed, 19 insertions(+), 19 deletions(-) diff --git a/app/pubspec.lock b/app/pubspec.lock index 7d2100ae0..cbad20ab3 100644 --- a/app/pubspec.lock +++ b/app/pubspec.lock @@ -109,10 +109,10 @@ packages: dependency: transitive description: name: camera_avfoundation - sha256: "9375082d2da45754277b5ae6ff2560cfecb799a4991aa9a3a2ee8e56d2bb0561" + sha256: "7d021e8cd30d9b71b8b92b4ad669e80af432d722d18d6aac338572754a786c15" url: "https://pub.dev" source: hosted - version: "0.9.15+1" + version: "0.9.16" camera_platform_interface: dependency: transitive description: @@ -298,10 +298,10 @@ packages: dependency: transitive description: name: flutter_cache_manager - sha256: "8207f27539deb83732fdda03e259349046a39a4c767269285f449ade355d54ba" + sha256: "395d6b7831f21f3b989ebedbb785545932adb9afe2622c1ffacf7f4b53a7e544" url: "https://pub.dev" source: hosted - version: "3.3.1" + version: "3.3.2" flutter_dotenv: dependency: transitive description: @@ -897,10 +897,10 @@ packages: dependency: transitive description: name: pointycastle - sha256: "70fe966348fe08c34bf929582f1d8247d9d9408130723206472b4687227e4333" + sha256: "79fbafed02cfdbe85ef3fd06c7f4bc2cbcba0177e61b765264853d4253b21744" url: "https://pub.dev" source: hosted - version: "3.8.0" + version: "3.9.0" postgrest: dependency: transitive description: @@ -1500,10 +1500,10 @@ packages: dependency: transitive description: name: win32 - sha256: "0a989dc7ca2bb51eac91e8fd00851297cfffd641aa7538b165c62637ca0eaa4a" + sha256: "0eaf06e3446824099858367950a813472af675116bf63f008a4c2a75ae13e9cb" url: "https://pub.dev" source: hosted - version: "5.4.0" + version: "5.5.0" xdg_directories: dependency: transitive description: diff --git a/designer_v2/pubspec.lock b/designer_v2/pubspec.lock index dedbea596..bb00fcb1a 100644 --- a/designer_v2/pubspec.lock +++ b/designer_v2/pubspec.lock @@ -387,10 +387,10 @@ packages: dependency: "direct main" description: name: go_router - sha256: "28ef8a8320ab3bf5752424e6bca6961ce25108afc344f3127b5155caf7a792c8" + sha256: "466425a64508ca00983882f523400d9169365cb9b464e2e2419f3b6545ff9c51" url: "https://pub.dev" source: hosted - version: "14.0.0" + version: "14.0.1" gotrue: dependency: transitive description: @@ -728,10 +728,10 @@ packages: dependency: transitive description: name: pointycastle - sha256: "70fe966348fe08c34bf929582f1d8247d9d9408130723206472b4687227e4333" + sha256: "79fbafed02cfdbe85ef3fd06c7f4bc2cbcba0177e61b765264853d4253b21744" url: "https://pub.dev" source: hosted - version: "3.8.0" + version: "3.9.0" pool: dependency: transitive description: @@ -1259,10 +1259,10 @@ packages: dependency: transitive description: name: win32 - sha256: "0a989dc7ca2bb51eac91e8fd00851297cfffd641aa7538b165c62637ca0eaa4a" + sha256: "0eaf06e3446824099858367950a813472af675116bf63f008a4c2a75ae13e9cb" url: "https://pub.dev" source: hosted - version: "5.4.0" + version: "5.5.0" xdg_directories: dependency: transitive description: diff --git a/designer_v2/pubspec.yaml b/designer_v2/pubspec.yaml index e4b28a826..378fa75a5 100644 --- a/designer_v2/pubspec.yaml +++ b/designer_v2/pubspec.yaml @@ -23,7 +23,7 @@ dependencies: flutter_riverpod: ^2.5.1 flutter_web_plugins: sdk: flutter - go_router: ^14.0.0 + go_router: ^14.0.1 material_color_utilities: material_design_icons_flutter: ^7.0.7296 pointer_interceptor: ^0.10.1 diff --git a/flutter_common/pubspec.lock b/flutter_common/pubspec.lock index b663c054c..5521f4aa5 100644 --- a/flutter_common/pubspec.lock +++ b/flutter_common/pubspec.lock @@ -704,10 +704,10 @@ packages: dependency: transitive description: name: win32 - sha256: "0a989dc7ca2bb51eac91e8fd00851297cfffd641aa7538b165c62637ca0eaa4a" + sha256: "0eaf06e3446824099858367950a813472af675116bf63f008a4c2a75ae13e9cb" url: "https://pub.dev" source: hosted - version: "5.4.0" + version: "5.5.0" xdg_directories: dependency: transitive description: diff --git a/pubspec.lock b/pubspec.lock index 1d4a296ac..7435a66c5 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -133,10 +133,10 @@ packages: dependency: transitive description: name: json_annotation - sha256: b10a7b2ff83d83c777edba3c6a0f97045ddadd56c944e1a23a3fdf43a1bf4467 + sha256: "1ce844379ca14835a50d2f019a3099f419082cfdd231cd86a142af94dd5c6bb1" url: "https://pub.dev" source: hosted - version: "4.8.1" + version: "4.9.0" lint: dependency: "direct dev" description: From 1c9f062c5ea8ae08221c5e15da423c69cbbd46f0 Mon Sep 17 00:00:00 2001 From: Johannes Vedder Date: Fri, 19 Apr 2024 16:00:15 +0200 Subject: [PATCH 017/314] feat: sort invite codes alphabetically --- designer_v2/lib/features/recruit/study_recruit_controller.dart | 2 ++ 1 file changed, 2 insertions(+) diff --git a/designer_v2/lib/features/recruit/study_recruit_controller.dart b/designer_v2/lib/features/recruit/study_recruit_controller.dart index 5b2797126..909024b0a 100644 --- a/designer_v2/lib/features/recruit/study_recruit_controller.dart +++ b/designer_v2/lib/features/recruit/study_recruit_controller.dart @@ -36,6 +36,8 @@ class StudyRecruitController extends StudyBaseController invite.model).toList(); + // Sort invites alphabetically by code + invites.sort((a, b) => a.code.compareTo(b.code)); state = state.copyWith( invites: AsyncValue.data(invites), ); From ffd36d31cb0f6af6415d617f56362556006163ee Mon Sep 17 00:00:00 2001 From: StudyU Documenter Date: Fri, 19 Apr 2024 14:05:53 +0000 Subject: [PATCH 018/314] docs: update UML documentation --- .../designer_v2/lib/features/recruit/uml.svg | 450 +- docs/uml/designer_v2/lib/features/uml.svg | 11136 ++++---- docs/uml/designer_v2/lib/uml.svg | 21652 ++++++++-------- 3 files changed, 16619 insertions(+), 16619 deletions(-) diff --git a/docs/uml/designer_v2/lib/features/recruit/uml.svg b/docs/uml/designer_v2/lib/features/recruit/uml.svg index b113e1780..cb4d698e7 100644 --- a/docs/uml/designer_v2/lib/features/recruit/uml.svg +++ b/docs/uml/designer_v2/lib/features/recruit/uml.svg @@ -1,36 +1,11 @@ - - [InviteCodeFormViewModel + + [EnrolledBadge | - +study: Study; - +inviteCodeRepository: IInviteCodeRepository; - +codeControl: FormControl<String>; - +codeControlValidationMessages: Map<String, String Function(dynamic)>; - +isPreconfiguredScheduleControl: FormControl<bool>; - +preconfiguredScheduleTypeControl: FormControl<PhaseSequence>; - +interventionAControl: FormControl<String>; - +interventionBControl: FormControl<String>; - +form: FormGroup; - +titles: Map<FormMode, String>; - +interventionControlOptions: List<FormControlOption<String>>; - +preconfiguredScheduleTypeOptions: List<FormControlOption<PhaseSequence>>; - +isPreconfiguredSchedule: bool; - +preconfiguredSchedule: List<String>? + +enrolledCount: int | - +void initControls(); - -dynamic _uniqueInviteCode(); - +void regenerateCode(); - -String _generateCode(); - +StudyInvite buildFormData(); - +void setControlsFrom(); - +dynamic save() + +Widget build() ] - [InviteCodeFormViewModel]o-[Study] - [InviteCodeFormViewModel]o-[<abstract>IInviteCodeRepository] - [InviteCodeFormViewModel]o-[FormControl] - [InviteCodeFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[InviteCodeFormViewModel] - [StudyRecruitController | +inviteCodeRepository: IInviteCodeRepository; @@ -49,13 +24,6 @@ [StudyBaseController]<:-[StudyRecruitController] [<abstract>IModelActionProvider]<:--[StudyRecruitController] - [EnrolledBadge - | - +enrolledCount: int - | - +Widget build() - ] - [StudyRecruitScreen | +Widget build(); @@ -95,189 +63,147 @@ [StudyInvitesTable]o-[Intervention? Function(String)] [StudyInvitesTable]o-[int Function(StudyInvite)] + [InviteCodeFormViewModel + | + +study: Study; + +inviteCodeRepository: IInviteCodeRepository; + +codeControl: FormControl<String>; + +codeControlValidationMessages: Map<String, String Function(dynamic)>; + +isPreconfiguredScheduleControl: FormControl<bool>; + +preconfiguredScheduleTypeControl: FormControl<PhaseSequence>; + +interventionAControl: FormControl<String>; + +interventionBControl: FormControl<String>; + +form: FormGroup; + +titles: Map<FormMode, String>; + +interventionControlOptions: List<FormControlOption<String>>; + +preconfiguredScheduleTypeOptions: List<FormControlOption<PhaseSequence>>; + +isPreconfiguredSchedule: bool; + +preconfiguredSchedule: List<String>? + | + +void initControls(); + -dynamic _uniqueInviteCode(); + +void regenerateCode(); + -String _generateCode(); + +StudyInvite buildFormData(); + +void setControlsFrom(); + +dynamic save() + ] + + [InviteCodeFormViewModel]o-[Study] + [InviteCodeFormViewModel]o-[<abstract>IInviteCodeRepository] + [InviteCodeFormViewModel]o-[FormControl] + [InviteCodeFormViewModel]o-[FormGroup] + [<abstract>FormViewModel]<:-[InviteCodeFormViewModel] + - + - - + + - + - + - + - - - + + + + - + + + + - + - - - + + + - + - + - - - - - - + - - - - + - + - - - + - + - + - + - + - + - + - + - - - - - - - - - InviteCodeFormViewModel - - - - - - +study: Study - +inviteCodeRepository: IInviteCodeRepository - +codeControl: FormControl<String> - +codeControlValidationMessages: Map<String, String Function(dynamic)> - +isPreconfiguredScheduleControl: FormControl<bool> - +preconfiguredScheduleTypeControl: FormControl<PhaseSequence> - +interventionAControl: FormControl<String> - +interventionBControl: FormControl<String> - +form: FormGroup - +titles: Map<FormMode, String> - +interventionControlOptions: List<FormControlOption<String>> - +preconfiguredScheduleTypeOptions: List<FormControlOption<PhaseSequence>> - +isPreconfiguredSchedule: bool - +preconfiguredSchedule: List<String>? - - - - - - +void initControls() - -dynamic _uniqueInviteCode() - +void regenerateCode() - -String _generateCode() - +StudyInvite buildFormData() - +void setControlsFrom() - +dynamic save() - - - - - - - - - - - Study - - - - - - - - - - - IInviteCodeRepository - - - + + + - - - + + + + + + + - - - FormControl + + + EnrolledBadge - - - - - - - - FormGroup + + + +enrolledCount: int - - - - - - - - FormViewModel + + + +Widget build() - - - + + + - + StudyRecruitController - + +inviteCodeRepository: IInviteCodeRepository -_invitesSubscription: StreamSubscription<List<WrappedModel<StudyInvite>>>? - + -dynamic _subscribeInvites() +Intervention? getIntervention() @@ -289,11 +215,22 @@ + + + + + + + IInviteCodeRepository + + + + - + - + StreamSubscription @@ -302,9 +239,9 @@ - + - + StudyBaseController @@ -313,52 +250,27 @@ - + - + IModelActionProvider - - - - - - - - - EnrolledBadge - - - - - - +enrolledCount: int - - - - - - +Widget build() - - - - - - + + - + StudyRecruitScreen - + +Widget build() -Widget _inviteCodesSectionHeader() @@ -370,9 +282,9 @@ - + - + StudyPageWidget @@ -381,23 +293,23 @@ - - - + + + - + InviteCodeFormView - + +formViewModel: InviteCodeFormViewModel - + +Widget build() -List<FormTableRow> _conditionalInterventionRows() @@ -405,11 +317,55 @@ + + + + + + + + + InviteCodeFormViewModel + + + + + + +study: Study + +inviteCodeRepository: IInviteCodeRepository + +codeControl: FormControl<String> + +codeControlValidationMessages: Map<String, String Function(dynamic)> + +isPreconfiguredScheduleControl: FormControl<bool> + +preconfiguredScheduleTypeControl: FormControl<PhaseSequence> + +interventionAControl: FormControl<String> + +interventionBControl: FormControl<String> + +form: FormGroup + +titles: Map<FormMode, String> + +interventionControlOptions: List<FormControlOption<String>> + +preconfiguredScheduleTypeOptions: List<FormControlOption<PhaseSequence>> + +isPreconfiguredSchedule: bool + +preconfiguredSchedule: List<String>? + + + + + + +void initControls() + -dynamic _uniqueInviteCode() + +void regenerateCode() + -String _generateCode() + +StudyInvite buildFormData() + +void setControlsFrom() + +dynamic save() + + + + - + - + FormConsumerWidget @@ -418,17 +374,17 @@ - - - + + + - + StudyInvitesTable - + +invites: List<StudyInvite> +onSelect: void Function(StudyInvite) @@ -439,7 +395,7 @@ - + +Widget build() -List<Widget> _buildRow() @@ -449,9 +405,9 @@ - + - + void Function(StudyInvite) @@ -460,9 +416,9 @@ - + - + List<ModelAction<dynamic>> Function(StudyInvite) @@ -471,9 +427,9 @@ - + - + Intervention? Function(String) @@ -482,15 +438,59 @@ - + - + int Function(StudyInvite) + + + + + + + Study + + + + + + + + + + + FormControl + + + + + + + + + + + FormGroup + + + + + + + + + + + FormViewModel + + + + diff --git a/docs/uml/designer_v2/lib/features/uml.svg b/docs/uml/designer_v2/lib/features/uml.svg index bb00ae648..d85f16001 100644 --- a/docs/uml/designer_v2/lib/features/uml.svg +++ b/docs/uml/designer_v2/lib/features/uml.svg @@ -1,921 +1,895 @@ - - [WebFrame + + [<abstract>IAppDelegate | - +previewSrc: String; - +studyId: String + +dynamic onAppStart() + ] + + [AppController | - +Widget build() + +appDelegates: List<IAppDelegate>; + -_delayedFuture: dynamic; + +isInitialized: dynamic + | + +dynamic onAppStart(); + -dynamic _callDelegates() ] - [DisabledFrame + [StudyMonitorScreen | +Widget build() ] - [PhoneContainer + [<abstract>StudyPageWidget]<:-[StudyMonitorScreen] + + [LoginForm | - <static>+defaultWidth: double; - <static>+defaultHeight: double; - +width: double; - +height: double; - +borderColor: Color; - +borderWidth: double; - +borderRadius: double; - +innerContent: Widget; - +innerContentBackgroundColor: Color? + +formKey: AuthFormKey | +Widget build() ] - [PhoneContainer]o-[Color] - [PhoneContainer]o-[<abstract>Widget] + [LoginForm]o-[AuthFormKey] + [<abstract>FormConsumerRefWidget]<:-[LoginForm] - [MobileFrame + [PasswordRecoveryForm + | + +formKey: AuthFormKey | +Widget build() ] - [DesktopFrame + [PasswordRecoveryForm]o-[AuthFormKey] + [<abstract>FormConsumerRefWidget]<:-[PasswordRecoveryForm] + + [PasswordForgotForm + | + +formKey: AuthFormKey | +Widget build() ] - [StudyController + [PasswordForgotForm]o-[AuthFormKey] + [<abstract>FormConsumerRefWidget]<:-[PasswordForgotForm] + + [SignupForm | - +notificationService: INotificationService; - +studyEventsSubscription: StreamSubscription<ModelEvent<Study>>?; - +studyActions: List<ModelAction<dynamic>> + +formKey: AuthFormKey | - +dynamic syncStudyStatus(); - +dynamic onStudySubscriptionUpdate(); - -dynamic _redirectNewToActualStudyID(); - +dynamic publishStudy(); - +void onChangeStudyParticipation(); - +void onAddParticipants(); - +void onSettingsPressed(); - +void dispose() + +Widget build(); + -dynamic _onClickTermsOfUse(); + -dynamic _onClickPrivacyPolicy() ] - [StudyController]o-[<abstract>INotificationService] - [StudyController]o-[StreamSubscription] - [StudyBaseController]<:-[StudyController] + [SignupForm]o-[AuthFormKey] + [<abstract>FormConsumerRefWidget]<:-[SignupForm] - [<abstract>IStudyAppBarViewModel + [AuthScaffold | - +isSyncIndicatorVisible: bool; - +isStatusBadgeVisible: bool; - +isPublishVisible: bool + +body: Widget; + +formKey: AuthFormKey; + +leftContentMinWidth: double; + +leftPanelMinWidth: double; + +leftPanelPadding: EdgeInsets ] - [<abstract>IStudyStatusBadgeViewModel]<:--[<abstract>IStudyAppBarViewModel] - [<abstract>IStudyNavViewModel]<:--[<abstract>IStudyAppBarViewModel] + [AuthScaffold]o-[<abstract>Widget] + [AuthScaffold]o-[AuthFormKey] + [AuthScaffold]o-[EdgeInsets] - [StudyScaffold + [EmailTextField | - +studyId: String; - +tabs: List<NavbarTab>?; - +tabsSubnav: List<NavbarTab>?; - +selectedTab: NavbarTab?; - +selectedTabSubnav: NavbarTab?; - +body: StudyPageWidget; - +drawer: Widget?; - +disableActions: bool; - +actionsSpacing: double; - +actionsPadding: double; - +layoutType: SingleColumnLayoutType?; - +appbarHeight: double; - +appbarSubnavHeight: double + +labelText: String; + +hintText: String?; + +formControlName: String?; + +formControl: FormControl<dynamic>? ] - [StudyScaffold]o-[NavbarTab] - [StudyScaffold]o-[<abstract>StudyPageWidget] - [StudyScaffold]o-[<abstract>Widget] - [StudyScaffold]o-[SingleColumnLayoutType] + [EmailTextField]o-[FormControl] - [PreviewFrame + [PasswordTextField | - +studyId: String; - +routeArgs: StudyFormRouteArgs?; - +route: String? + +labelText: String; + +hintText: String?; + +onSubmitted: dynamic Function(FormControl<dynamic>)?; + +formControlName: String?; + +formControl: FormControl<dynamic>? ] - [PreviewFrame]o-[<abstract>StudyFormRouteArgs] + [PasswordTextField]o-[dynamic Function(FormControl<dynamic>)?] + [PasswordTextField]o-[FormControl] - [RouteInformation - | - +route: String?; - +extra: String?; - +cmd: String?; - +data: String? + [StudyUJobsToBeDone | - +String toString() + +Widget build() ] - [<abstract>PlatformController + [AuthFormController | - +studyId: String; - +baseSrc: String; - +previewSrc: String; - +routeInformation: RouteInformation; - +frameWidget: Widget + +authRepository: IAuthRepository; + +notificationService: INotificationService; + +router: GoRouter; + +emailControl: FormControl<String>; + +passwordControl: FormControl<String>; + +passwordConfirmationControl: FormControl<String>; + +termsOfServiceControl: FormControl<bool>; + <static>+authValidationMessages: Map<String, String Function(dynamic)>; + +loginForm: FormGroup; + +signupForm: FormGroup; + +passwordForgotForm: FormGroup; + +passwordRecoveryForm: FormGroup; + +controlValidatorsByForm: Map<AuthFormKey, Map<FormControl<dynamic>, List<Validator<dynamic>>>>; + -_formKey: AuthFormKey; + +formKey: AuthFormKey; + +form: FormGroup | - +void activate(); - +void registerViews(); - +void generateUrl(); - +void navigate(); - +void refresh(); - +void listen(); - +void send(); - +void openNewPage() + -dynamic _getFormFor(); + -dynamic _onChangeFormKey(); + +dynamic resetControlsFor(); + -dynamic _forceValidationMessages(); + +dynamic signUp(); + -dynamic _signUp(); + +dynamic signIn(); + -dynamic _signInWith(); + +dynamic signOut(); + +dynamic resetPasswordForEmail(); + +dynamic sendPasswordResetLink(); + +dynamic recoverPassword(); + +dynamic updateUser(); + -dynamic _readDebugUser() ] - [<abstract>PlatformController]o-[RouteInformation] - [<abstract>PlatformController]o-[<abstract>Widget] + [AuthFormController]o-[<abstract>IAuthRepository] + [AuthFormController]o-[<abstract>INotificationService] + [AuthFormController]o-[GoRouter] + [AuthFormController]o-[FormControl] + [AuthFormController]o-[FormGroup] + [AuthFormController]o-[AuthFormKey] + [<abstract>IFormGroupController]<:--[AuthFormController] - [WebController - | - +iFrameElement: IFrameElement + [AuthFormKey | - +void activate(); - +void registerViews(); - +void generateUrl(); - +void navigate(); - +void refresh(); - +void openNewPage(); - +void listen(); - +void send() + +index: int; + <static>+values: List<AuthFormKey>; + <static>+login: AuthFormKey; + <static>+signup: AuthFormKey; + <static>+passwordForgot: AuthFormKey; + <static>+passwordRecovery: AuthFormKey; + <static>-_loginSubmit: AuthFormKey; + <static>-_signupSubmit: AuthFormKey ] - [WebController]o-[IFrameElement] - [<abstract>PlatformController]<:-[WebController] + [AuthFormKey]o-[AuthFormKey] + [Enum]<:--[AuthFormKey] - [MobileController + [AppStatus | - +void openNewPage(); - +void refresh(); - +void registerViews(); - +void listen(); - +void send(); - +void navigate(); - +void activate(); - +void generateUrl() + +index: int; + <static>+values: List<AppStatus>; + <static>+initializing: AppStatus; + <static>+initialized: AppStatus ] - [<abstract>PlatformController]<:-[MobileController] + [AppStatus]o-[AppStatus] + [Enum]<:--[AppStatus] - [StudyParticipationBadge + [FormArrayTable | - +participation: Participation; - +type: BadgeType; - +showPrefixIcon: bool; - +center: bool + +control: AbstractControl<dynamic>; + +items: List<T>; + +onSelectItem: void Function(T); + +getActionsAt: List<ModelAction<dynamic>> Function(T, int); + +onNewItem: void Function()?; + +rowTitle: String Function(T); + +onNewItemLabel: String; + +sectionTitle: String?; + +sectionDescription: String?; + +emptyIcon: IconData?; + +emptyTitle: String?; + +emptyDescription: String?; + +sectionTitleDivider: bool?; + +rowPrefix: Widget Function(BuildContext, T, int)?; + +rowSuffix: Widget Function(BuildContext, T, int)?; + +leadingWidget: Widget?; + +itemsSectionPadding: EdgeInsets?; + +hideLeadingTrailingWhenEmpty: bool; + <static>+columns: List<StandardTableColumn> | - +Widget build() + +Widget build(); + -List<Widget> _buildRow(); + -Widget _newItemButton() ] - [StudyParticipationBadge]o-[Participation] - [StudyParticipationBadge]o-[BadgeType] + [FormArrayTable]o-[<abstract>AbstractControl] + [FormArrayTable]o-[void Function(T)] + [FormArrayTable]o-[List<ModelAction<dynamic>> Function(T, int)] + [FormArrayTable]o-[void Function()?] + [FormArrayTable]o-[String Function(T)] + [FormArrayTable]o-[IconData] + [FormArrayTable]o-[Widget Function(BuildContext, T, int)?] + [FormArrayTable]o-[<abstract>Widget] + [FormArrayTable]o-[EdgeInsets] - [StudyTestScreen - | - +previewRoute: String? + [<abstract>ManagedFormViewModel | - +Widget build(); - +Widget? banner(); - +dynamic load(); - +dynamic save(); - +dynamic showHelp() + +ManagedFormViewModel<T> createDuplicate() ] - [<abstract>StudyPageWidget]<:-[StudyTestScreen] + [<abstract>FormViewModel]<:-[<abstract>ManagedFormViewModel] - [TestAppRoutes - | - <static>+studyOverview: String; - <static>+eligibility: String; - <static>+intervention: String; - <static>+consent: String; - <static>+journey: String; - <static>+dashboard: String + [FormViewModelNotFoundException ] - [<abstract>IStudyNavViewModel - | - +isEditTabEnabled: bool; - +isTestTabEnabled: bool; - +isRecruitTabEnabled: bool; - +isMonitorTabEnabled: bool; - +isAnalyzeTabEnabled: bool; - +isSettingsEnabled: bool - ] + [Exception]<:--[FormViewModelNotFoundException] - [StudyNav + [FormViewModelCollection | - <static>+dynamic tabs(); - <static>+dynamic edit(); - <static>+dynamic test(); - <static>+dynamic recruit(); - <static>+dynamic monitor(); - <static>+dynamic analyze() - ] - - [StudyDesignNav + +formViewModels: List<T>; + +formArray: FormArray<dynamic>; + +stagedViewModels: List<T>; + +retrievableViewModels: List<T>; + +formData: List<D> | - <static>+dynamic tabs(); - <static>+dynamic info(); - <static>+dynamic enrollment(); - <static>+dynamic interventions(); - <static>+dynamic measurements(); - <static>+dynamic reports() + +void add(); + +T remove(); + +T? findWhere(); + +T? removeWhere(); + +bool contains(); + +void stage(); + +T commit(); + +void reset(); + +void read() ] - [StudyTestController + [FormViewModelCollection]o-[FormArray] + + [CustomFormControl | - +authRepository: IAuthRepository; - +languageCode: String + -_onValueChangedDebouncer: Debouncer?; + -_onStatusChangedDebouncer: Debouncer?; + +onValueChanged: void Function(T?)?; + +onStatusChanged: void Function(ControlStatus)?; + +onStatusChangedDebounceTime: int?; + +onValueChangedDebounceTime: int? + | + +void dispose() ] - [StudyTestController]o-[<abstract>IAuthRepository] - [StudyBaseController]<:-[StudyTestController] + [CustomFormControl]o-[Debouncer] + [CustomFormControl]o-[void Function(T?)?] + [CustomFormControl]o-[void Function(ControlStatus)?] + [FormControl]<:-[CustomFormControl] - [<abstract>IStudyStatusBadgeViewModel + [UnsavedChangesDialog | - +studyParticipation: Participation?; - +studyStatus: StudyStatus? + +Widget build() ] - [<abstract>IStudyStatusBadgeViewModel]o-[Participation] - [<abstract>IStudyStatusBadgeViewModel]o-[StudyStatus] + [<abstract>FormValidationSetEnum + ] - [StudyStatusBadge + [FormControlValidation | - +participation: Participation?; - +status: StudyStatus?; - +type: BadgeType; - +showPrefixIcon: bool; - +showTooltip: bool + +control: AbstractControl<dynamic>; + +validators: List<Validator<dynamic>>; + +asyncValidators: List<AsyncValidator<dynamic>>?; + +validationMessages: Map<String, String Function(Object)> | - +Widget build() + +FormControlValidation merge() ] - [StudyStatusBadge]o-[Participation] - [StudyStatusBadge]o-[StudyStatus] - [StudyStatusBadge]o-[BadgeType] + [FormControlValidation]o-[<abstract>AbstractControl] - [FrameControlsWidget + [<abstract>IFormData | - +onRefresh: void Function()?; - +onOpenNewTab: void Function()?; - +enabled: bool + +id: String | - +Widget build() + +IFormData copy() ] - [FrameControlsWidget]o-[void Function()?] - [<abstract>ConsumerWidget]<:-[FrameControlsWidget] + [FormInvalidException + ] - [StudySettingsDialog + [Exception]<:--[FormInvalidException] + + [FormConfigException | - +Widget build() + +message: String? ] - [<abstract>StudyPageWidget]<:-[StudySettingsDialog] + [Exception]<:--[FormConfigException] - [StudySettingsFormViewModel + [<abstract>IFormViewModelDelegate | - +study: AsyncValue<Study>; - +studyRepository: IStudyRepository; - <static>+defaultPublishedToRegistry: bool; - <static>+defaultPublishedToRegistryResults: bool; - +isPublishedToRegistryControl: FormControl<bool>; - +isPublishedToRegistryResultsControl: FormControl<bool>; - +form: FormGroup; - +titles: Map<FormMode, String> + +dynamic onSave(); + +void onCancel() + ] + + [<abstract>IFormGroupController | - +void setControlsFrom(); - +Study buildFormData(); - +dynamic keepControlsSynced(); - +dynamic save(); - +dynamic setLaunchDefaults() + +form: FormGroup ] - [StudySettingsFormViewModel]o-[<abstract>AsyncValue] - [StudySettingsFormViewModel]o-[<abstract>IStudyRepository] - [StudySettingsFormViewModel]o-[FormControl] - [StudySettingsFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[StudySettingsFormViewModel] + [<abstract>IFormGroupController]o-[FormGroup] - [StudyBaseController - | - +studyId: String; - +studyRepository: IStudyRepository; - +router: GoRouter; - +studySubscription: StreamSubscription<WrappedModel<Study>>? + [FormControlOption | - +dynamic subscribeStudy(); - +dynamic onStudySubscriptionUpdate(); - +dynamic onStudySubscriptionError(); - +void dispose() + +value: T; + +label: String; + +description: String?; + +props: List<Object?> ] - [StudyBaseController]o-[<abstract>IStudyRepository] - [StudyBaseController]o-[GoRouter] - [StudyBaseController]o-[StreamSubscription] + [<abstract>Equatable]<:-[FormControlOption] - [<abstract>StudyPageWidget + [<abstract>FormViewModel | - +studyId: String + -_formData: T?; + -_formMode: FormMode; + -_validationSet: FormValidationSetEnum?; + +delegate: IFormViewModelDelegate<FormViewModel<dynamic>>?; + +autosave: bool; + -_immediateFormChildrenSubscriptions: List<StreamSubscription<dynamic>>; + -_immediateFormChildrenListenerDebouncer: Debouncer?; + -_autosaveOperation: CancelableOperation<dynamic>?; + -_defaultControlValidators: Map<String, Tuple<List<Validator<dynamic>>, List<AsyncValidator<dynamic>>>>; + +prevFormValue: Map<String, dynamic>?; + <static>-_formKey: String; + +formData: T?; + +formMode: FormMode; + +isReadonly: bool; + +validationSet: FormValidationSetEnum?; + +isDirty: bool; + +title: String; + +isValid: bool; + +titles: Map<FormMode, String>; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> | - +Widget? banner() + -dynamic _setFormData(); + -dynamic _rememberDefaultControlValidators(); + -Tuple<List<Validator<dynamic>>, List<AsyncValidator<dynamic>>>? _getDefaultValidators(); + -dynamic _disableAllControls(); + -dynamic _formModeUpdated(); + -dynamic _restoreControlsFromFormData(); + +void revalidate(); + -void _applyValidationSet(); + +void read(); + +dynamic save(); + +dynamic cancel(); + +void enableAutosave(); + +void listenToImmediateFormChildren(); + +dynamic markFormGroupChanged(); + +void dispose(); + +void setControlsFrom(); + +T buildFormData(); + +void initControls() ] - [<abstract>ConsumerWidget]<:-[<abstract>StudyPageWidget] - [<abstract>IWithBanner]<:--[<abstract>StudyPageWidget] + [<abstract>FormViewModel]o-[FormMode] + [<abstract>FormViewModel]o-[<abstract>FormValidationSetEnum] + [<abstract>FormViewModel]o-[<abstract>IFormViewModelDelegate] + [<abstract>FormViewModel]o-[Debouncer] + [<abstract>FormViewModel]o-[CancelableOperation] + [<abstract>IFormGroupController]<:--[<abstract>FormViewModel] - [AppStatus + [FormMode | +index: int; - <static>+values: List<AppStatus>; - <static>+initializing: AppStatus; - <static>+initialized: AppStatus + <static>+values: List<FormMode>; + <static>+create: FormMode; + <static>+readonly: FormMode; + <static>+edit: FormMode ] - [AppStatus]o-[AppStatus] - [Enum]<:--[AppStatus] + [FormMode]o-[FormMode] + [Enum]<:--[FormMode] - [<abstract>IAppDelegate + [EnrolledBadge | - +dynamic onAppStart() + +enrolledCount: int + | + +Widget build() ] - [AppController + [StudyRecruitController | - +appDelegates: List<IAppDelegate>; - -_delayedFuture: dynamic; - +isInitialized: dynamic + +inviteCodeRepository: IInviteCodeRepository; + -_invitesSubscription: StreamSubscription<List<WrappedModel<StudyInvite>>>? | - +dynamic onAppStart(); - -dynamic _callDelegates() + -dynamic _subscribeInvites(); + +Intervention? getIntervention(); + +int getParticipantCountForInvite(); + +List<ModelAction<dynamic>> availableActions(); + +List<ModelAction<dynamic>> availableInlineActions(); + +void dispose() ] - [App - ] + [StudyRecruitController]o-[<abstract>IInviteCodeRepository] + [StudyRecruitController]o-[StreamSubscription] + [StudyBaseController]<:-[StudyRecruitController] + [<abstract>IModelActionProvider]<:--[StudyRecruitController] - [AppContent + [StudyRecruitScreen + | + +Widget build(); + -Widget _inviteCodesSectionHeader(); + -Widget _newInviteCodeButton(); + -dynamic _onSelectInvite() ] - [AuthFormController + [<abstract>StudyPageWidget]<:-[StudyRecruitScreen] + + [InviteCodeFormView | - +authRepository: IAuthRepository; - +notificationService: INotificationService; - +router: GoRouter; - +emailControl: FormControl<String>; - +passwordControl: FormControl<String>; - +passwordConfirmationControl: FormControl<String>; - +termsOfServiceControl: FormControl<bool>; - <static>+authValidationMessages: Map<String, String Function(dynamic)>; - +loginForm: FormGroup; - +signupForm: FormGroup; - +passwordForgotForm: FormGroup; - +passwordRecoveryForm: FormGroup; - +controlValidatorsByForm: Map<AuthFormKey, Map<FormControl<dynamic>, List<Validator<dynamic>>>>; - -_formKey: AuthFormKey; - +formKey: AuthFormKey; - +form: FormGroup + +formViewModel: InviteCodeFormViewModel | - -dynamic _getFormFor(); - -dynamic _onChangeFormKey(); - +dynamic resetControlsFor(); - -dynamic _forceValidationMessages(); - +dynamic signUp(); - -dynamic _signUp(); - +dynamic signIn(); - -dynamic _signInWith(); - +dynamic signOut(); - +dynamic resetPasswordForEmail(); - +dynamic sendPasswordResetLink(); - +dynamic recoverPassword(); - +dynamic updateUser(); - -dynamic _readDebugUser() + +Widget build(); + -List<FormTableRow> _conditionalInterventionRows() ] - [AuthFormController]o-[<abstract>IAuthRepository] - [AuthFormController]o-[<abstract>INotificationService] - [AuthFormController]o-[GoRouter] - [AuthFormController]o-[FormControl] - [AuthFormController]o-[FormGroup] - [AuthFormController]o-[AuthFormKey] - [<abstract>IFormGroupController]<:--[AuthFormController] + [InviteCodeFormView]o-[InviteCodeFormViewModel] + [<abstract>FormConsumerWidget]<:-[InviteCodeFormView] - [AuthFormKey + [StudyInvitesTable | - +index: int; - <static>+values: List<AuthFormKey>; - <static>+login: AuthFormKey; - <static>+signup: AuthFormKey; - <static>+passwordForgot: AuthFormKey; - <static>+passwordRecovery: AuthFormKey; - <static>-_loginSubmit: AuthFormKey; - <static>-_signupSubmit: AuthFormKey + +invites: List<StudyInvite>; + +onSelect: void Function(StudyInvite); + +getActions: List<ModelAction<dynamic>> Function(StudyInvite); + +getInlineActions: List<ModelAction<dynamic>> Function(StudyInvite); + +getIntervention: Intervention? Function(String); + +getParticipantCountForInvite: int Function(StudyInvite) + | + +Widget build(); + -List<Widget> _buildRow() ] - [AuthFormKey]o-[AuthFormKey] - [Enum]<:--[AuthFormKey] + [StudyInvitesTable]o-[void Function(StudyInvite)] + [StudyInvitesTable]o-[List<ModelAction<dynamic>> Function(StudyInvite)] + [StudyInvitesTable]o-[Intervention? Function(String)] + [StudyInvitesTable]o-[int Function(StudyInvite)] - [PasswordRecoveryForm + [InviteCodeFormViewModel | - +formKey: AuthFormKey + +study: Study; + +inviteCodeRepository: IInviteCodeRepository; + +codeControl: FormControl<String>; + +codeControlValidationMessages: Map<String, String Function(dynamic)>; + +isPreconfiguredScheduleControl: FormControl<bool>; + +preconfiguredScheduleTypeControl: FormControl<PhaseSequence>; + +interventionAControl: FormControl<String>; + +interventionBControl: FormControl<String>; + +form: FormGroup; + +titles: Map<FormMode, String>; + +interventionControlOptions: List<FormControlOption<String>>; + +preconfiguredScheduleTypeOptions: List<FormControlOption<PhaseSequence>>; + +isPreconfiguredSchedule: bool; + +preconfiguredSchedule: List<String>? | - +Widget build() + +void initControls(); + -dynamic _uniqueInviteCode(); + +void regenerateCode(); + -String _generateCode(); + +StudyInvite buildFormData(); + +void setControlsFrom(); + +dynamic save() ] - [PasswordRecoveryForm]o-[AuthFormKey] - [<abstract>FormConsumerRefWidget]<:-[PasswordRecoveryForm] + [InviteCodeFormViewModel]o-[Study] + [InviteCodeFormViewModel]o-[<abstract>IInviteCodeRepository] + [InviteCodeFormViewModel]o-[FormControl] + [InviteCodeFormViewModel]o-[FormGroup] + [<abstract>FormViewModel]<:-[InviteCodeFormViewModel] - [PasswordForgotForm - | - +formKey: AuthFormKey + [PublishSuccessDialog | +Widget build() ] - [PasswordForgotForm]o-[AuthFormKey] - [<abstract>FormConsumerRefWidget]<:-[PasswordForgotForm] + [<abstract>StudyPageWidget]<:-[PublishSuccessDialog] - [LoginForm - | - +formKey: AuthFormKey + [PublishDialog | +Widget build() ] - [LoginForm]o-[AuthFormKey] - [<abstract>FormConsumerRefWidget]<:-[LoginForm] + [<abstract>StudyPageWidget]<:-[PublishDialog] - [EmailTextField + [PublishConfirmationDialog | - +labelText: String; - +hintText: String?; - +formControlName: String?; - +formControl: FormControl<dynamic>? + +Widget build() ] - [EmailTextField]o-[FormControl] + [<abstract>StudyPageWidget]<:-[PublishConfirmationDialog] - [PasswordTextField + [FrameControlsWidget | - +labelText: String; - +hintText: String?; - +onSubmitted: dynamic Function(FormControl<dynamic>)?; - +formControlName: String?; - +formControl: FormControl<dynamic>? + +onRefresh: void Function()?; + +onOpenNewTab: void Function()?; + +enabled: bool + | + +Widget build() ] - [PasswordTextField]o-[dynamic Function(FormControl<dynamic>)?] - [PasswordTextField]o-[FormControl] + [FrameControlsWidget]o-[void Function()?] + [<abstract>ConsumerWidget]<:-[FrameControlsWidget] - [SignupForm - | - +formKey: AuthFormKey + [<abstract>IStudyStatusBadgeViewModel | - +Widget build(); - -dynamic _onClickTermsOfUse(); - -dynamic _onClickPrivacyPolicy() + +studyParticipation: Participation?; + +studyStatus: StudyStatus? ] - [SignupForm]o-[AuthFormKey] - [<abstract>FormConsumerRefWidget]<:-[SignupForm] + [<abstract>IStudyStatusBadgeViewModel]o-[Participation] + [<abstract>IStudyStatusBadgeViewModel]o-[StudyStatus] - [StudyUJobsToBeDone + [StudyStatusBadge + | + +participation: Participation?; + +status: StudyStatus?; + +type: BadgeType; + +showPrefixIcon: bool; + +showTooltip: bool | +Widget build() ] - [AuthScaffold + [StudyStatusBadge]o-[Participation] + [StudyStatusBadge]o-[StudyStatus] + [StudyStatusBadge]o-[BadgeType] + + [RouteInformation | - +body: Widget; - +formKey: AuthFormKey; - +leftContentMinWidth: double; - +leftPanelMinWidth: double; - +leftPanelPadding: EdgeInsets + +route: String?; + +extra: String?; + +cmd: String?; + +data: String? + | + +String toString() ] - [AuthScaffold]o-[<abstract>Widget] - [AuthScaffold]o-[AuthFormKey] - [AuthScaffold]o-[EdgeInsets] - - [PublishDialog + [<abstract>PlatformController | - +Widget build() + +studyId: String; + +baseSrc: String; + +previewSrc: String; + +routeInformation: RouteInformation; + +frameWidget: Widget + | + +void activate(); + +void registerViews(); + +void generateUrl(); + +void navigate(); + +void refresh(); + +void listen(); + +void send(); + +void openNewPage() ] - [<abstract>StudyPageWidget]<:-[PublishDialog] + [<abstract>PlatformController]o-[RouteInformation] + [<abstract>PlatformController]o-[<abstract>Widget] - [PublishSuccessDialog + [WebController | - +Widget build() + +iFrameElement: IFrameElement + | + +void activate(); + +void registerViews(); + +void generateUrl(); + +void navigate(); + +void refresh(); + +void openNewPage(); + +void listen(); + +void send() ] - [<abstract>StudyPageWidget]<:-[PublishSuccessDialog] + [WebController]o-[IFrameElement] + [<abstract>PlatformController]<:-[WebController] - [PublishConfirmationDialog + [MobileController | - +Widget build() + +void openNewPage(); + +void refresh(); + +void registerViews(); + +void listen(); + +void send(); + +void navigate(); + +void activate(); + +void generateUrl() ] - [<abstract>StudyPageWidget]<:-[PublishConfirmationDialog] + [<abstract>PlatformController]<:-[MobileController] - [FormArrayTable + [StudyController | - +control: AbstractControl<dynamic>; - +items: List<T>; - +onSelectItem: void Function(T); - +getActionsAt: List<ModelAction<dynamic>> Function(T, int); - +onNewItem: void Function()?; - +rowTitle: String Function(T); - +onNewItemLabel: String; - +sectionTitle: String?; - +sectionDescription: String?; - +emptyIcon: IconData?; - +emptyTitle: String?; - +emptyDescription: String?; - +sectionTitleDivider: bool?; - +rowPrefix: Widget Function(BuildContext, T, int)?; - +rowSuffix: Widget Function(BuildContext, T, int)?; - +leadingWidget: Widget?; - +itemsSectionPadding: EdgeInsets?; - +hideLeadingTrailingWhenEmpty: bool; - <static>+columns: List<StandardTableColumn> + +notificationService: INotificationService; + +studyEventsSubscription: StreamSubscription<ModelEvent<Study>>?; + +studyActions: List<ModelAction<dynamic>> | - +Widget build(); - -List<Widget> _buildRow(); - -Widget _newItemButton() + +dynamic syncStudyStatus(); + +dynamic onStudySubscriptionUpdate(); + -dynamic _redirectNewToActualStudyID(); + +dynamic publishStudy(); + +void onChangeStudyParticipation(); + +void onAddParticipants(); + +void onSettingsPressed(); + +void dispose() ] - [FormArrayTable]o-[<abstract>AbstractControl] - [FormArrayTable]o-[void Function(T)] - [FormArrayTable]o-[List<ModelAction<dynamic>> Function(T, int)] - [FormArrayTable]o-[void Function()?] - [FormArrayTable]o-[String Function(T)] - [FormArrayTable]o-[IconData] - [FormArrayTable]o-[Widget Function(BuildContext, T, int)?] - [FormArrayTable]o-[<abstract>Widget] - [FormArrayTable]o-[EdgeInsets] + [StudyController]o-[<abstract>INotificationService] + [StudyController]o-[StreamSubscription] + [StudyBaseController]<:-[StudyController] - [<abstract>IFormData - | - +id: String + [<abstract>IStudyNavViewModel | - +IFormData copy() + +isEditTabEnabled: bool; + +isTestTabEnabled: bool; + +isRecruitTabEnabled: bool; + +isMonitorTabEnabled: bool; + +isAnalyzeTabEnabled: bool; + +isSettingsEnabled: bool ] - [<abstract>ManagedFormViewModel + [StudyNav | - +ManagedFormViewModel<T> createDuplicate() + <static>+dynamic tabs(); + <static>+dynamic edit(); + <static>+dynamic test(); + <static>+dynamic recruit(); + <static>+dynamic monitor(); + <static>+dynamic analyze() ] - [<abstract>FormViewModel]<:-[<abstract>ManagedFormViewModel] - - [FormViewModelNotFoundException + [StudyDesignNav + | + <static>+dynamic tabs(); + <static>+dynamic info(); + <static>+dynamic enrollment(); + <static>+dynamic interventions(); + <static>+dynamic measurements(); + <static>+dynamic reports() ] - [Exception]<:--[FormViewModelNotFoundException] - - [FormViewModelCollection + [<abstract>StudyPageWidget | - +formViewModels: List<T>; - +formArray: FormArray<dynamic>; - +stagedViewModels: List<T>; - +retrievableViewModels: List<T>; - +formData: List<D> + +studyId: String | - +void add(); - +T remove(); - +T? findWhere(); - +T? removeWhere(); - +bool contains(); - +void stage(); - +T commit(); - +void reset(); - +void read() - ] - - [FormViewModelCollection]o-[FormArray] - - [FormInvalidException + +Widget? banner() ] - [Exception]<:--[FormInvalidException] + [<abstract>ConsumerWidget]<:-[<abstract>StudyPageWidget] + [<abstract>IWithBanner]<:--[<abstract>StudyPageWidget] - [FormConfigException + [StudyParticipationBadge | - +message: String? + +participation: Participation; + +type: BadgeType; + +showPrefixIcon: bool; + +center: bool + | + +Widget build() ] - [Exception]<:--[FormConfigException] + [StudyParticipationBadge]o-[Participation] + [StudyParticipationBadge]o-[BadgeType] - [<abstract>IFormViewModelDelegate + [StudyBaseController | - +dynamic onSave(); - +void onCancel() - ] - - [<abstract>IFormGroupController + +studyId: String; + +studyRepository: IStudyRepository; + +router: GoRouter; + +studySubscription: StreamSubscription<WrappedModel<Study>>? | - +form: FormGroup + +dynamic subscribeStudy(); + +dynamic onStudySubscriptionUpdate(); + +dynamic onStudySubscriptionError(); + +void dispose() ] - [<abstract>IFormGroupController]o-[FormGroup] + [StudyBaseController]o-[<abstract>IStudyRepository] + [StudyBaseController]o-[GoRouter] + [StudyBaseController]o-[StreamSubscription] - [FormControlOption + [PreviewFrame | - +value: T; - +label: String; - +description: String?; - +props: List<Object?> + +studyId: String; + +routeArgs: StudyFormRouteArgs?; + +route: String? ] - [<abstract>Equatable]<:-[FormControlOption] + [PreviewFrame]o-[<abstract>StudyFormRouteArgs] - [<abstract>FormViewModel - | - -_formData: T?; - -_formMode: FormMode; - -_validationSet: FormValidationSetEnum?; - +delegate: IFormViewModelDelegate<FormViewModel<dynamic>>?; - +autosave: bool; - -_immediateFormChildrenSubscriptions: List<StreamSubscription<dynamic>>; - -_immediateFormChildrenListenerDebouncer: Debouncer?; - -_autosaveOperation: CancelableOperation<dynamic>?; - -_defaultControlValidators: Map<String, Tuple<List<Validator<dynamic>>, List<AsyncValidator<dynamic>>>>; - +prevFormValue: Map<String, dynamic>?; - <static>-_formKey: String; - +formData: T?; - +formMode: FormMode; - +isReadonly: bool; - +validationSet: FormValidationSetEnum?; - +isDirty: bool; - +title: String; - +isValid: bool; - +titles: Map<FormMode, String>; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + [<abstract>IStudyAppBarViewModel | - -dynamic _setFormData(); - -dynamic _rememberDefaultControlValidators(); - -Tuple<List<Validator<dynamic>>, List<AsyncValidator<dynamic>>>? _getDefaultValidators(); - -dynamic _disableAllControls(); - -dynamic _formModeUpdated(); - -dynamic _restoreControlsFromFormData(); - +void revalidate(); - -void _applyValidationSet(); - +void read(); - +dynamic save(); - +dynamic cancel(); - +void enableAutosave(); - +void listenToImmediateFormChildren(); - +dynamic markFormGroupChanged(); - +void dispose(); - +void setControlsFrom(); - +T buildFormData(); - +void initControls() + +isSyncIndicatorVisible: bool; + +isStatusBadgeVisible: bool; + +isPublishVisible: bool ] - [<abstract>FormViewModel]o-[FormMode] - [<abstract>FormViewModel]o-[<abstract>FormValidationSetEnum] - [<abstract>FormViewModel]o-[<abstract>IFormViewModelDelegate] - [<abstract>FormViewModel]o-[Debouncer] - [<abstract>FormViewModel]o-[CancelableOperation] - [<abstract>IFormGroupController]<:--[<abstract>FormViewModel] + [<abstract>IStudyStatusBadgeViewModel]<:--[<abstract>IStudyAppBarViewModel] + [<abstract>IStudyNavViewModel]<:--[<abstract>IStudyAppBarViewModel] - [FormMode + [StudyScaffold | - +index: int; - <static>+values: List<FormMode>; - <static>+create: FormMode; - <static>+readonly: FormMode; - <static>+edit: FormMode + +studyId: String; + +tabs: List<NavbarTab>?; + +tabsSubnav: List<NavbarTab>?; + +selectedTab: NavbarTab?; + +selectedTabSubnav: NavbarTab?; + +body: StudyPageWidget; + +drawer: Widget?; + +disableActions: bool; + +actionsSpacing: double; + +actionsPadding: double; + +layoutType: SingleColumnLayoutType?; + +appbarHeight: double; + +appbarSubnavHeight: double ] - [FormMode]o-[FormMode] - [Enum]<:--[FormMode] + [StudyScaffold]o-[NavbarTab] + [StudyScaffold]o-[<abstract>StudyPageWidget] + [StudyScaffold]o-[<abstract>Widget] + [StudyScaffold]o-[SingleColumnLayoutType] - [CustomFormControl + [WebFrame | - -_onValueChangedDebouncer: Debouncer?; - -_onStatusChangedDebouncer: Debouncer?; - +onValueChanged: void Function(T?)?; - +onStatusChanged: void Function(ControlStatus)?; - +onStatusChangedDebounceTime: int?; - +onValueChangedDebounceTime: int? + +previewSrc: String; + +studyId: String | - +void dispose() + +Widget build() ] - [CustomFormControl]o-[Debouncer] - [CustomFormControl]o-[void Function(T?)?] - [CustomFormControl]o-[void Function(ControlStatus)?] - [FormControl]<:-[CustomFormControl] - - [UnsavedChangesDialog + [DisabledFrame | +Widget build() ] - [<abstract>FormValidationSetEnum - ] - - [FormControlValidation - | - +control: AbstractControl<dynamic>; - +validators: List<Validator<dynamic>>; - +asyncValidators: List<AsyncValidator<dynamic>>?; - +validationMessages: Map<String, String Function(Object)> + [PhoneContainer | - +FormControlValidation merge() - ] - - [FormControlValidation]o-[<abstract>AbstractControl] - - [ScreenerQuestionFormViewModel - | - <static>+defaultResponseOptionValidity: bool; - +responseOptionsDisabledArray: FormArray<dynamic>; - +responseOptionsLogicControls: FormArray<bool>; - +responseOptionsLogicDescriptionControls: FormArray<String>; - -_questionBaseControls: Map<String, AbstractControl<dynamic>>; - +prevResponseOptionControls: List<AbstractControl<dynamic>>; - +prevResponseOptionValues: List<dynamic>; - +responseOptionsDisabledControls: List<AbstractControl<dynamic>>; - +logicControlOptions: List<FormControlOption<bool>>; - +questionBaseControls: Map<String, AbstractControl<dynamic>>; - +isDirtyOptionsBannerVisible: bool + <static>+defaultWidth: double; + <static>+defaultHeight: double; + +width: double; + +height: double; + +borderColor: Color; + +borderWidth: double; + +borderRadius: double; + +innerContent: Widget; + +innerContentBackgroundColor: Color? | - +dynamic onResponseOptionsChanged(); - +void setControlsFrom(); - +QuestionFormData buildFormData(); - -List<FormControl<dynamic>> _copyFormControls(); - -AbstractControl<dynamic>? _findAssociatedLogicControlFor(); - -AbstractControl<dynamic>? _findAssociatedControlFor(); - +ScreenerQuestionFormViewModel createDuplicate() + +Widget build() ] - [ScreenerQuestionFormViewModel]o-[FormArray] - [QuestionFormViewModel]<:-[ScreenerQuestionFormViewModel] - [<abstract>IScreenerQuestionLogicFormViewModel]<:--[ScreenerQuestionFormViewModel] + [PhoneContainer]o-[Color] + [PhoneContainer]o-[<abstract>Widget] - [StudyDesignEnrollmentFormView + [MobileFrame | - +Widget build(); - -dynamic _showScreenerQuestionSidesheetWithArgs(); - -dynamic _showConsentItemSidesheetWithArgs() + +Widget build() ] - [<abstract>StudyDesignPageWidget]<:-[StudyDesignEnrollmentFormView] - - [<abstract>IScreenerQuestionLogicFormViewModel + [DesktopFrame | - +isDirtyOptionsBannerVisible: bool + +Widget build() ] - [ScreenerQuestionLogicFormView + [StudyTestScreen | - +formViewModel: ScreenerQuestionFormViewModel + +previewRoute: String? | +Widget build(); - -dynamic _buildInfoBanner(); - -dynamic _buildAnswerOptionsLogicControls(); - -List<Widget> _buildOptionLogicRow() + +Widget? banner(); + +dynamic load(); + +dynamic save(); + +dynamic showHelp() ] - [ScreenerQuestionLogicFormView]o-[ScreenerQuestionFormViewModel] - [<abstract>FormConsumerWidget]<:-[ScreenerQuestionLogicFormView] + [<abstract>StudyPageWidget]<:-[StudyTestScreen] - [ConsentItemFormData + [StudySettingsFormViewModel | - +consentId: String; - +title: String; - +description: String; - +iconName: String?; - +id: String + +study: AsyncValue<Study>; + +studyRepository: IStudyRepository; + <static>+defaultPublishedToRegistry: bool; + <static>+defaultPublishedToRegistryResults: bool; + +isPublishedToRegistryControl: FormControl<bool>; + +isPublishedToRegistryResultsControl: FormControl<bool>; + +form: FormGroup; + +titles: Map<FormMode, String> | - +ConsentItem toConsentItem(); - +ConsentItemFormData copy() + +void setControlsFrom(); + +Study buildFormData(); + +dynamic keepControlsSynced(); + +dynamic save(); + +dynamic setLaunchDefaults() ] - [<abstract>IFormData]<:-[ConsentItemFormData] + [StudySettingsFormViewModel]o-[<abstract>AsyncValue] + [StudySettingsFormViewModel]o-[<abstract>IStudyRepository] + [StudySettingsFormViewModel]o-[FormControl] + [StudySettingsFormViewModel]o-[FormGroup] + [<abstract>FormViewModel]<:-[StudySettingsFormViewModel] - [EnrollmentFormViewModel + [StudySettingsDialog | - +study: Study; - +router: GoRouter; - +consentItemDelegate: EnrollmentFormConsentItemDelegate; - +enrollmentTypeControl: FormControl<Participation>; - +consentItemArray: FormArray<dynamic>; - +consentItemFormViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData>; - +form: FormGroup; - +enrollmentTypeControlOptions: List<FormControlOption<Participation>>; - +consentItemModels: List<ConsentItemFormViewModel>; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titles: Map<FormMode, String>; - +canTestScreener: bool; - +canTestConsent: bool; - +questionTitles: Map<FormMode, String Function()> + +Widget build() + ] + + [<abstract>StudyPageWidget]<:-[StudySettingsDialog] + + [StudyTestController | - +void setControlsFrom(); - +EnrollmentFormData buildFormData(); - +void read(); - +List<ModelAction<dynamic>> availableActions(); - +List<ModelAction<dynamic>> availablePopupActions(); - +List<ModelAction<dynamic>> availableInlineActions(); - +void onSelectItem(); - +void onNewItem(); - +ScreenerQuestionFormRouteArgs buildNewScreenerQuestionFormRouteArgs(); - +ScreenerQuestionFormRouteArgs buildScreenerQuestionFormRouteArgs(); - +ConsentItemFormRouteArgs buildNewConsentItemFormRouteArgs(); - +ConsentItemFormRouteArgs buildConsentItemFormRouteArgs(); - +dynamic testScreener(); - +dynamic testConsent(); - +ScreenerQuestionFormViewModel provideQuestionFormViewModel() + +authRepository: IAuthRepository; + +languageCode: String ] - [EnrollmentFormViewModel]o-[Study] - [EnrollmentFormViewModel]o-[GoRouter] - [EnrollmentFormViewModel]o-[EnrollmentFormConsentItemDelegate] - [EnrollmentFormViewModel]o-[FormControl] - [EnrollmentFormViewModel]o-[FormArray] - [EnrollmentFormViewModel]o-[FormViewModelCollection] - [EnrollmentFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[EnrollmentFormViewModel] - [<abstract>WithQuestionnaireControls]<:-[EnrollmentFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[EnrollmentFormViewModel] - [<abstract>IListActionProvider]<:--[EnrollmentFormViewModel] - [<abstract>IProviderArgsResolver]<:--[EnrollmentFormViewModel] + [StudyTestController]o-[<abstract>IAuthRepository] + [StudyBaseController]<:-[StudyTestController] - [EnrollmentFormConsentItemDelegate + [TestAppRoutes | - +formViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData>; - +owner: EnrollmentFormViewModel; - +propagateOnSave: bool; - +validationSet: dynamic + <static>+studyOverview: String; + <static>+eligibility: String; + <static>+intervention: String; + <static>+consent: String; + <static>+journey: String; + <static>+dashboard: String + ] + + [DrawerEntry | - +void onCancel(); - +dynamic onSave(); - +ConsentItemFormViewModel provide(); - +List<ModelAction<dynamic>> availableActions(); - +void onNewItem(); - +void onSelectItem() + +localizedTitle: String Function(); + +icon: IconData?; + +localizedHelpText: String Function()?; + +enabled: bool; + +onSelected: void Function(BuildContext, WidgetRef)?; + +autoCloseDrawer: bool; + +title: String; + +helpText: String? + | + +void onClick() ] - [EnrollmentFormConsentItemDelegate]o-[FormViewModelCollection] - [EnrollmentFormConsentItemDelegate]o-[EnrollmentFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[EnrollmentFormConsentItemDelegate] - [<abstract>IListActionProvider]<:--[EnrollmentFormConsentItemDelegate] - [<abstract>IProviderArgsResolver]<:--[EnrollmentFormConsentItemDelegate] + [DrawerEntry]o-[String Function()] + [DrawerEntry]o-[IconData] + [DrawerEntry]o-[String Function()?] + [DrawerEntry]o-[void Function(BuildContext, WidgetRef)?] - [ConsentItemFormViewModel + [GoRouterDrawerEntry | - +consentIdControl: FormControl<String>; - +titleControl: FormControl<String>; - +descriptionControl: FormControl<String>; - +iconControl: FormControl<IconOption>; - +form: FormGroup; - +consentId: String; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titleRequired: dynamic; - +descriptionRequired: dynamic; - +titles: Map<FormMode, String> + +intent: RoutingIntent; + +onNavigated: void Function()? | - +void setControlsFrom(); - +ConsentItemFormData buildFormData(); - +ConsentItemFormViewModel createDuplicate() + +void onClick() ] - [ConsentItemFormViewModel]o-[FormControl] - [ConsentItemFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[ConsentItemFormViewModel] + [GoRouterDrawerEntry]o-[RoutingIntent] + [GoRouterDrawerEntry]o-[void Function()?] + [DrawerEntry]<:-[GoRouterDrawerEntry] - [ConsentItemFormView + [AppDrawer | - +formViewModel: ConsentItemFormViewModel + +width: int; + +autoCloseDrawer: bool; + +leftPaddingEntries: double; + +logoPaddingVertical: double; + +logoPaddingHorizontal: double; + +logoMaxHeight: double; + +logoSectionMinHeight: double; + +logoSectionMaxHeight: double ] - [ConsentItemFormView]o-[ConsentItemFormViewModel] - - [EnrollmentFormData + [StudyAnalyzeScreen | - <static>+kDefaultEnrollmentType: Participation; - +enrollmentType: Participation; - +questionnaireFormData: QuestionnaireFormData; - +consentItemsFormData: List<ConsentItemFormData>?; - +id: String + +Widget? banner(); + +Widget build() + ] + + [<abstract>StudyPageWidget]<:-[StudyAnalyzeScreen] + + [StudyAnalyzeController | - +Study apply(); - +EnrollmentFormData copy() + +dynamic onExport() ] - [EnrollmentFormData]o-[Participation] - [EnrollmentFormData]o-[QuestionnaireFormData] - [<abstract>IStudyFormData]<:--[EnrollmentFormData] + [StudyBaseController]<:-[StudyAnalyzeController] [StudyDesignInterventionsFormView | @@ -924,84 +898,33 @@ [<abstract>StudyDesignPageWidget]<:-[StudyDesignInterventionsFormView] - [InterventionsFormViewModel - | - +study: Study; - +router: GoRouter; - +interventionsArray: FormArray<dynamic>; - +interventionsCollection: FormViewModelCollection<InterventionFormViewModel, InterventionFormData>; - +form: FormGroup; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +interventionsRequired: dynamic; - +titles: Map<FormMode, String>; - +canTestStudySchedule: bool + [InterventionFormView | - +void setControlsFrom(); - +InterventionsFormData buildFormData(); - +void read(); - +List<ModelAction<dynamic>> availableActions(); - +List<ModelAction<dynamic>> availablePopupActions(); - +List<ModelAction<dynamic>> availableInlineActions(); - +void onSelectItem(); - +void onNewItem(); - +InterventionFormViewModel provide(); - +void onCancel(); - +dynamic onSave(); - +dynamic testStudySchedule() + +formViewModel: InterventionFormViewModel ] - [InterventionsFormViewModel]o-[Study] - [InterventionsFormViewModel]o-[GoRouter] - [InterventionsFormViewModel]o-[FormArray] - [InterventionsFormViewModel]o-[FormViewModelCollection] - [InterventionsFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[InterventionsFormViewModel] - [<abstract>StudyScheduleControls]<:-[InterventionsFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[InterventionsFormViewModel] - [<abstract>IListActionProvider]<:--[InterventionsFormViewModel] - [<abstract>IProviderArgsResolver]<:--[InterventionsFormViewModel] + [InterventionFormView]o-[InterventionFormViewModel] - [InterventionFormViewModel + [InterventionPreview | - +study: Study; - +interventionIdControl: FormControl<String>; - +interventionTitleControl: FormControl<String>; - +interventionIconControl: FormControl<IconOption>; - +interventionDescriptionControl: FormControl<String>; - +interventionTasksArray: FormArray<dynamic>; - +tasksCollection: FormViewModelCollection<InterventionTaskFormViewModel, InterventionTaskFormData>; - +form: FormGroup; - +interventionId: String; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titleRequired: dynamic; - +atLeastOneTask: dynamic; - +breadcrumbsTitle: String; - +titles: Map<FormMode, String> + +routeArgs: InterventionFormRouteArgs | - +void setControlsFrom(); - +InterventionFormData buildFormData(); - +List<ModelAction<dynamic>> availableActions(); - +List<ModelAction<dynamic>> availablePopupActions(); - +List<ModelAction<dynamic>> availableInlineActions(); - +void onSelectItem(); - +void onNewItem(); - +void onCancel(); - +dynamic onSave(); - +InterventionTaskFormViewModel provide(); - +InterventionTaskFormRouteArgs buildNewFormRouteArgs(); - +InterventionTaskFormRouteArgs buildFormRouteArgs(); - +InterventionFormViewModel createDuplicate() + +Widget build() ] - [InterventionFormViewModel]o-[Study] - [InterventionFormViewModel]o-[FormControl] - [InterventionFormViewModel]o-[FormArray] - [InterventionFormViewModel]o-[FormViewModelCollection] - [InterventionFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[InterventionFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[InterventionFormViewModel] - [<abstract>IListActionProvider]<:--[InterventionFormViewModel] - [<abstract>IProviderArgsResolver]<:--[InterventionFormViewModel] + [InterventionPreview]o-[InterventionFormRouteArgs] + [<abstract>ConsumerWidget]<:-[InterventionPreview] + + [StudyScheduleFormView + | + +formViewModel: StudyScheduleControls + | + -FormTableRow _renderCustomSequence(); + +Widget build() + ] + + [StudyScheduleFormView]o-[<abstract>StudyScheduleControls] + [<abstract>FormConsumerWidget]<:-[StudyScheduleFormView] [InterventionTaskFormData | @@ -1017,32 +940,42 @@ [<abstract>IFormDataWithSchedule]<:-[InterventionTaskFormData] - [StudyScheduleFormData - | - +sequenceType: PhaseSequence; - +sequenceTypeCustom: String; - +numCycles: int; - +phaseDuration: int; - +includeBaseline: bool; - +id: String - | - +StudySchedule toStudySchedule(); - +Study apply(); - +StudyScheduleFormData copy() - ] - - [StudyScheduleFormData]o-[PhaseSequence] - [<abstract>IStudyFormData]<:--[StudyScheduleFormData] - - [InterventionPreview + [InterventionsFormViewModel | - +routeArgs: InterventionFormRouteArgs + +study: Study; + +router: GoRouter; + +interventionsArray: FormArray<dynamic>; + +interventionsCollection: FormViewModelCollection<InterventionFormViewModel, InterventionFormData>; + +form: FormGroup; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +interventionsRequired: dynamic; + +titles: Map<FormMode, String>; + +canTestStudySchedule: bool | - +Widget build() + +void setControlsFrom(); + +InterventionsFormData buildFormData(); + +void read(); + +List<ModelAction<dynamic>> availableActions(); + +List<ModelAction<dynamic>> availablePopupActions(); + +List<ModelAction<dynamic>> availableInlineActions(); + +void onSelectItem(); + +void onNewItem(); + +InterventionFormViewModel provide(); + +void onCancel(); + +dynamic onSave(); + +dynamic testStudySchedule() ] - [InterventionPreview]o-[InterventionFormRouteArgs] - [<abstract>ConsumerWidget]<:-[InterventionPreview] + [InterventionsFormViewModel]o-[Study] + [InterventionsFormViewModel]o-[GoRouter] + [InterventionsFormViewModel]o-[FormArray] + [InterventionsFormViewModel]o-[FormViewModelCollection] + [InterventionsFormViewModel]o-[FormGroup] + [<abstract>FormViewModel]<:-[InterventionsFormViewModel] + [<abstract>StudyScheduleControls]<:-[InterventionsFormViewModel] + [<abstract>IFormViewModelDelegate]<:--[InterventionsFormViewModel] + [<abstract>IListActionProvider]<:--[InterventionsFormViewModel] + [<abstract>IProviderArgsResolver]<:--[InterventionsFormViewModel] [InterventionTaskFormViewModel | @@ -1068,26 +1001,6 @@ [<abstract>ManagedFormViewModel]<:-[InterventionTaskFormViewModel] [<abstract>WithScheduleControls]<:-[InterventionTaskFormViewModel] - [InterventionsFormData - | - +interventionsData: List<InterventionFormData>; - +studyScheduleData: StudyScheduleFormData; - +id: String - | - +Study apply(); - +InterventionsFormData copy() - ] - - [InterventionsFormData]o-[StudyScheduleFormData] - [<abstract>IStudyFormData]<:--[InterventionsFormData] - - [InterventionFormView - | - +formViewModel: InterventionFormViewModel - ] - - [InterventionFormView]o-[InterventionFormViewModel] - [<abstract>StudyScheduleControls | <static>+defaultScheduleType: PhaseSequence; @@ -1118,13 +1031,6 @@ [<abstract>StudyScheduleControls]o-[PhaseSequence] [<abstract>StudyScheduleControls]o-[FormControl] - [InterventionTaskFormView - | - +formViewModel: InterventionTaskFormViewModel - ] - - [InterventionTaskFormView]o-[InterventionTaskFormViewModel] - [InterventionFormData | +interventionId: String; @@ -1141,235 +1047,257 @@ [<abstract>IFormData]<:-[InterventionFormData] - [StudyScheduleFormView + [StudyScheduleFormData | - +formViewModel: StudyScheduleControls + +sequenceType: PhaseSequence; + +sequenceTypeCustom: String; + +numCycles: int; + +phaseDuration: int; + +includeBaseline: bool; + +id: String | - -FormTableRow _renderCustomSequence(); - +Widget build() + +StudySchedule toStudySchedule(); + +Study apply(); + +StudyScheduleFormData copy() ] - [StudyScheduleFormView]o-[<abstract>StudyScheduleControls] - [<abstract>FormConsumerWidget]<:-[StudyScheduleFormView] + [StudyScheduleFormData]o-[PhaseSequence] + [<abstract>IStudyFormData]<:--[StudyScheduleFormData] - [<abstract>IStudyFormData + [InterventionTaskFormView | - +Study apply() + +formViewModel: InterventionTaskFormViewModel ] - [<abstract>IFormData]<:--[<abstract>IStudyFormData] + [InterventionTaskFormView]o-[InterventionTaskFormViewModel] - [StudyInfoFormData + [InterventionsFormData | - +title: String; - +description: String?; - +iconName: String; - +contactInfoFormData: StudyContactInfoFormData; + +interventionsData: List<InterventionFormData>; + +studyScheduleData: StudyScheduleFormData; +id: String | +Study apply(); - +StudyInfoFormData copy() + +InterventionsFormData copy() ] - [StudyInfoFormData]o-[StudyContactInfoFormData] - [<abstract>IStudyFormData]<:--[StudyInfoFormData] + [InterventionsFormData]o-[StudyScheduleFormData] + [<abstract>IStudyFormData]<:--[InterventionsFormData] - [StudyContactInfoFormData + [InterventionFormViewModel | - +organization: String?; - +institutionalReviewBoard: String?; - +institutionalReviewBoardNumber: String?; - +researchers: String?; - +email: String?; - +website: String?; - +phone: String?; - +additionalInfo: String?; - +id: String + +study: Study; + +interventionIdControl: FormControl<String>; + +interventionTitleControl: FormControl<String>; + +interventionIconControl: FormControl<IconOption>; + +interventionDescriptionControl: FormControl<String>; + +interventionTasksArray: FormArray<dynamic>; + +tasksCollection: FormViewModelCollection<InterventionTaskFormViewModel, InterventionTaskFormData>; + +form: FormGroup; + +interventionId: String; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +titleRequired: dynamic; + +atLeastOneTask: dynamic; + +breadcrumbsTitle: String; + +titles: Map<FormMode, String> | - +Study apply(); - +StudyInfoFormData copy() + +void setControlsFrom(); + +InterventionFormData buildFormData(); + +List<ModelAction<dynamic>> availableActions(); + +List<ModelAction<dynamic>> availablePopupActions(); + +List<ModelAction<dynamic>> availableInlineActions(); + +void onSelectItem(); + +void onNewItem(); + +void onCancel(); + +dynamic onSave(); + +InterventionTaskFormViewModel provide(); + +InterventionTaskFormRouteArgs buildNewFormRouteArgs(); + +InterventionTaskFormRouteArgs buildFormRouteArgs(); + +InterventionFormViewModel createDuplicate() ] - [<abstract>IStudyFormData]<:--[StudyContactInfoFormData] + [InterventionFormViewModel]o-[Study] + [InterventionFormViewModel]o-[FormControl] + [InterventionFormViewModel]o-[FormArray] + [InterventionFormViewModel]o-[FormViewModelCollection] + [InterventionFormViewModel]o-[FormGroup] + [<abstract>ManagedFormViewModel]<:-[InterventionFormViewModel] + [<abstract>IFormViewModelDelegate]<:--[InterventionFormViewModel] + [<abstract>IListActionProvider]<:--[InterventionFormViewModel] + [<abstract>IProviderArgsResolver]<:--[InterventionFormViewModel] - [StudyDesignInfoFormView + [StudyDesignReportsFormView | - +Widget build() + +Widget build(); + -dynamic _showReportItemSidesheetWithArgs() ] - [<abstract>StudyDesignPageWidget]<:-[StudyDesignInfoFormView] + [<abstract>StudyDesignPageWidget]<:-[StudyDesignReportsFormView] - [StudyInfoFormViewModel + [ReportItemFormData | - +study: Study; - +titleControl: FormControl<String>; - +iconControl: FormControl<IconOption>; - +descriptionControl: FormControl<String>; - +organizationControl: FormControl<String>; - +reviewBoardControl: FormControl<String>; - +reviewBoardNumberControl: FormControl<String>; - +researchersControl: FormControl<String>; - +emailControl: FormControl<String>; - +websiteControl: FormControl<String>; - +phoneControl: FormControl<String>; - +additionalInfoControl: FormControl<String>; - +form: FormGroup; - +titles: Map<FormMode, String>; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titleRequired: dynamic; - +descriptionRequired: dynamic; - +iconRequired: dynamic; - +organizationRequired: dynamic; - +reviewBoardRequired: dynamic; - +reviewBoardNumberRequired: dynamic; - +researchersRequired: dynamic; - +emailRequired: dynamic; - +phoneRequired: dynamic; - +emailFormat: dynamic; - +websiteFormat: dynamic + +isPrimary: bool; + +section: ReportSection; + +id: String | - +void setControlsFrom(); - +StudyInfoFormData buildFormData() + <static>+dynamic fromDomainModel(); + +ReportItemFormData copy() ] - [StudyInfoFormViewModel]o-[Study] - [StudyInfoFormViewModel]o-[FormControl] - [StudyInfoFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[StudyInfoFormViewModel] + [ReportItemFormData]o-[<abstract>ReportSection] + [<abstract>IFormData]<:-[ReportItemFormData] - [MeasurementSurveyFormData + [DataReferenceEditor | - +measurementId: String; - +title: String; - +introText: String?; - +outroText: String?; - +questionnaireFormData: QuestionnaireFormData; - <static>+kDefaultTitle: String; - +id: String + +formControl: FormControl<DataReferenceIdentifier<T>>; + +availableTasks: List<Task>; + +buildReactiveDropdownField: ReactiveDropdownField<dynamic> | - +QuestionnaireTask toQuestionnaireTask(); - +MeasurementSurveyFormData copy() + +FormTableRow buildFormTableRow(); + -List<DropdownMenuItem<DataReferenceIdentifier<dynamic>>> _dataReferenceItems() ] - [MeasurementSurveyFormData]o-[QuestionnaireFormData] - [<abstract>IFormDataWithSchedule]<:-[MeasurementSurveyFormData] + [DataReferenceEditor]o-[FormControl] + [DataReferenceEditor]o-[ReactiveDropdownField] - [MeasurementSurveyFormView + [TemporalAggregationFormatted | - +formViewModel: MeasurementSurveyFormViewModel + -_value: TemporalAggregation; + <static>+values: List<TemporalAggregationFormatted>; + +value: TemporalAggregation; + +string: String; + +icon: IconData?; + +hashCode: int + | + +bool ==(); + +String toString(); + +String toJson(); + <static>+TemporalAggregationFormatted fromJson() ] - [MeasurementSurveyFormView]o-[MeasurementSurveyFormViewModel] + [TemporalAggregationFormatted]o-[TemporalAggregation] + [TemporalAggregationFormatted]o-[IconData] - [MeasurementSurveyFormViewModel + [ImprovementDirectionFormatted | - +study: Study; - +measurementIdControl: FormControl<String>; - +instanceIdControl: FormControl<String>; - +surveyTitleControl: FormControl<String>; - +surveyIntroTextControl: FormControl<String>; - +surveyOutroTextControl: FormControl<String>; - +form: FormGroup; - +measurementId: String; - +instanceId: String; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titleRequired: dynamic; - +atLeastOneQuestion: dynamic; - +breadcrumbsTitle: String; - +titles: Map<FormMode, String> + -_value: ImprovementDirection; + <static>+values: List<ImprovementDirectionFormatted>; + +value: ImprovementDirection; + +string: String; + +icon: IconData?; + +hashCode: int | - +void setControlsFrom(); - +MeasurementSurveyFormData buildFormData(); - +List<ModelAction<dynamic>> availableActions(); - +List<ModelAction<dynamic>> availablePopupActions(); - +List<ModelAction<dynamic>> availableInlineActions(); - +void onSelectItem(); - +void onNewItem(); - +SurveyQuestionFormRouteArgs buildNewFormRouteArgs(); - +SurveyQuestionFormRouteArgs buildFormRouteArgs(); - +MeasurementSurveyFormViewModel createDuplicate() + +bool ==(); + +String toString(); + +String toJson(); + <static>+ImprovementDirectionFormatted fromJson() ] - [MeasurementSurveyFormViewModel]o-[Study] - [MeasurementSurveyFormViewModel]o-[FormControl] - [MeasurementSurveyFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[MeasurementSurveyFormViewModel] - [<abstract>WithQuestionnaireControls]<:-[MeasurementSurveyFormViewModel] - [<abstract>WithScheduleControls]<:-[MeasurementSurveyFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[MeasurementSurveyFormViewModel] - [<abstract>IListActionProvider]<:--[MeasurementSurveyFormViewModel] - [<abstract>IProviderArgsResolver]<:--[MeasurementSurveyFormViewModel] + [ImprovementDirectionFormatted]o-[ImprovementDirection] + [ImprovementDirectionFormatted]o-[IconData] - [SurveyPreview + [ReportSectionType | - +routeArgs: MeasurementFormRouteArgs + +index: int; + <static>+values: List<ReportSectionType>; + <static>+average: ReportSectionType; + <static>+linearRegression: ReportSectionType + ] + + [ReportSectionType]o-[ReportSectionType] + [Enum]<:--[ReportSectionType] + + [AverageSectionFormView + | + +formViewModel: ReportItemFormViewModel; + +studyId: String; + +reportSectionColumnWidth: Map<int, TableColumnWidth> | +Widget build() ] - [SurveyPreview]o-[MeasurementFormRouteArgs] - [<abstract>ConsumerWidget]<:-[SurveyPreview] + [AverageSectionFormView]o-[ReportItemFormViewModel] + [<abstract>ConsumerWidget]<:-[AverageSectionFormView] - [StudyDesignMeasurementsFormView + [DataReferenceIdentifier | - +Widget build() + +hashCode: int + | + +bool ==() ] - [<abstract>StudyDesignPageWidget]<:-[StudyDesignMeasurementsFormView] + [DataReference]<:-[DataReferenceIdentifier] - [MeasurementsFormData + [LinearRegressionSectionFormView | - +surveyMeasurements: List<MeasurementSurveyFormData>; - +id: String + +formViewModel: ReportItemFormViewModel; + +studyId: String; + +reportSectionColumnWidth: Map<int, TableColumnWidth> | - +Study apply(); - +MeasurementsFormData copy() + +Widget build() ] - [<abstract>IStudyFormData]<:--[MeasurementsFormData] + [LinearRegressionSectionFormView]o-[ReportItemFormViewModel] + [<abstract>ConsumerWidget]<:-[LinearRegressionSectionFormView] - [MeasurementsFormViewModel + [ReportItemFormViewModel | - +study: Study; - +router: GoRouter; - +measurementsArray: FormArray<dynamic>; - +surveyMeasurementFormViewModels: FormViewModelCollection<MeasurementSurveyFormViewModel, MeasurementSurveyFormData>; + <static>+defaultSectionType: ReportSectionType; + +sectionIdControl: FormControl<String>; + +sectionTypeControl: FormControl<ReportSectionType>; + +titleControl: FormControl<String>; + +descriptionControl: FormControl<String>; + +sectionControl: FormControl<ReportSection>; + +dataReferenceControl: FormControl<DataReferenceIdentifier<num>>; + +temporalAggregationControl: FormControl<TemporalAggregationFormatted>; + +improvementDirectionControl: FormControl<ImprovementDirectionFormatted>; + +alphaControl: FormControl<double>; + -_controlsBySectionType: Map<ReportSectionType, FormGroup>; + -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + -_validationConfigsBySectionType: Map<ReportSectionType, Map<FormValidationSetEnum, List<FormControlValidation>>>; + +sectionBaseControls: Map<String, AbstractControl<dynamic>>; +form: FormGroup; - +measurementViewModels: List<MeasurementSurveyFormViewModel>; + +sectionId: String; + +sectionType: ReportSectionType; + <static>+sectionTypeControlOptions: List<FormControlOption<ReportSectionType>>; + <static>+temporalAggregationControlOptions: List<FormControlOption<TemporalAggregationFormatted>>; + <static>+improvementDirectionControlOptions: List<FormControlOption<ImprovementDirectionFormatted>>; + +titles: Map<FormMode, String>; +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +measurementRequired: dynamic; - +titles: Map<FormMode, String> + +titleRequired: dynamic; + +descriptionRequired: dynamic; + +dataReferenceRequired: dynamic; + +aggregationRequired: dynamic; + +improvementDirectionRequired: dynamic; + +alphaConfidenceRequired: dynamic | - +void read(); - +void setControlsFrom(); - +MeasurementsFormData buildFormData(); - +List<ModelAction<dynamic>> availableActions(); - +List<ModelAction<dynamic>> availablePopupActions(); - +List<ModelAction<dynamic>> availableInlineActions(); - +void onSelectItem(); - +void onNewItem(); - +MeasurementSurveyFormViewModel provide(); - +void onCancel(); - +dynamic onSave() + -List<FormControlValidation> _getValidationConfig(); + +ReportItemFormData buildFormData(); + +ReportItemFormViewModel createDuplicate(); + +dynamic onSectionTypeChanged(); + -void _updateFormControls(); + +void setControlsFrom() ] - [MeasurementsFormViewModel]o-[Study] - [MeasurementsFormViewModel]o-[GoRouter] - [MeasurementsFormViewModel]o-[FormArray] - [MeasurementsFormViewModel]o-[FormViewModelCollection] - [MeasurementsFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[MeasurementsFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[MeasurementsFormViewModel] - [<abstract>IListActionProvider]<:--[MeasurementsFormViewModel] - [<abstract>IProviderArgsResolver]<:--[MeasurementsFormViewModel] + [ReportItemFormViewModel]o-[ReportSectionType] + [ReportItemFormViewModel]o-[FormControl] + [ReportItemFormViewModel]o-[FormGroup] + [<abstract>ManagedFormViewModel]<:-[ReportItemFormViewModel] - [StudyFormValidationSet + [ReportItemFormView | - +index: int; - <static>+values: List<StudyFormValidationSet> + +formViewModel: ReportItemFormViewModel; + +studyId: String; + +reportSectionColumnWidth: dynamic; + +sectionTypeBodyBuilder: Widget Function(BuildContext) + | + +Widget build(); + -dynamic _buildSectionText(); + -dynamic _buildSectionTypeHeader() ] - [Enum]<:--[StudyFormValidationSet] + [ReportItemFormView]o-[ReportItemFormViewModel] + [ReportItemFormView]o-[Widget Function(BuildContext)] [ReportsFormViewModel | @@ -1426,332 +1354,526 @@ [<abstract>IListActionProvider]<:--[ReportFormItemDelegate] [<abstract>IProviderArgsResolver]<:--[ReportFormItemDelegate] - [ReportItemFormData + [ReportBadge | - +isPrimary: bool; - +section: ReportSection; - +id: String + +status: ReportStatus?; + +type: BadgeType; + +showPrefixIcon: bool; + +showTooltip: bool | - <static>+dynamic fromDomainModel(); - +ReportItemFormData copy() + +Widget build() ] - [ReportItemFormData]o-[<abstract>ReportSection] - [<abstract>IFormData]<:-[ReportItemFormData] + [ReportBadge]o-[ReportStatus] + [ReportBadge]o-[BadgeType] - [ReportItemFormView + [ReportsFormData | - +formViewModel: ReportItemFormViewModel; - +studyId: String; - +reportSectionColumnWidth: dynamic; - +sectionTypeBodyBuilder: Widget Function(BuildContext) + +reportItems: List<ReportItemFormData>; + +id: String | - +Widget build(); - -dynamic _buildSectionText(); - -dynamic _buildSectionTypeHeader() + +Study apply(); + +ReportsFormData copy() ] - [ReportItemFormView]o-[ReportItemFormViewModel] - [ReportItemFormView]o-[Widget Function(BuildContext)] + [<abstract>IStudyFormData]<:--[ReportsFormData] - [ReportItemFormViewModel - | - <static>+defaultSectionType: ReportSectionType; - +sectionIdControl: FormControl<String>; - +sectionTypeControl: FormControl<ReportSectionType>; - +titleControl: FormControl<String>; - +descriptionControl: FormControl<String>; - +sectionControl: FormControl<ReportSection>; - +dataReferenceControl: FormControl<DataReferenceIdentifier<num>>; - +temporalAggregationControl: FormControl<TemporalAggregationFormatted>; - +improvementDirectionControl: FormControl<ImprovementDirectionFormatted>; - +alphaControl: FormControl<double>; - -_controlsBySectionType: Map<ReportSectionType, FormGroup>; - -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - -_validationConfigsBySectionType: Map<ReportSectionType, Map<FormValidationSetEnum, List<FormControlValidation>>>; - +sectionBaseControls: Map<String, AbstractControl<dynamic>>; - +form: FormGroup; - +sectionId: String; - +sectionType: ReportSectionType; - <static>+sectionTypeControlOptions: List<FormControlOption<ReportSectionType>>; - <static>+temporalAggregationControlOptions: List<FormControlOption<TemporalAggregationFormatted>>; - <static>+improvementDirectionControlOptions: List<FormControlOption<ImprovementDirectionFormatted>>; - +titles: Map<FormMode, String>; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titleRequired: dynamic; - +descriptionRequired: dynamic; - +dataReferenceRequired: dynamic; - +aggregationRequired: dynamic; - +improvementDirectionRequired: dynamic; - +alphaConfidenceRequired: dynamic + [ReportStatus | - -List<FormControlValidation> _getValidationConfig(); - +ReportItemFormData buildFormData(); - +ReportItemFormViewModel createDuplicate(); - +dynamic onSectionTypeChanged(); - -void _updateFormControls(); - +void setControlsFrom() + +index: int; + <static>+values: List<ReportStatus>; + <static>+primary: ReportStatus; + <static>+secondary: ReportStatus ] - [ReportItemFormViewModel]o-[ReportSectionType] - [ReportItemFormViewModel]o-[FormControl] - [ReportItemFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[ReportItemFormViewModel] + [ReportStatus]o-[ReportStatus] + [Enum]<:--[ReportStatus] - [TemporalAggregationFormatted - | - -_value: TemporalAggregation; - <static>+values: List<TemporalAggregationFormatted>; - +value: TemporalAggregation; - +string: String; - +icon: IconData?; - +hashCode: int + [<abstract>IStudyFormData | - +bool ==(); - +String toString(); - +String toJson(); - <static>+TemporalAggregationFormatted fromJson() + +Study apply() ] - [TemporalAggregationFormatted]o-[TemporalAggregation] - [TemporalAggregationFormatted]o-[IconData] + [<abstract>IFormData]<:--[<abstract>IStudyFormData] - [ImprovementDirectionFormatted - | - -_value: ImprovementDirection; - <static>+values: List<ImprovementDirectionFormatted>; - +value: ImprovementDirection; - +string: String; - +icon: IconData?; - +hashCode: int + [StudyInfoFormViewModel | - +bool ==(); - +String toString(); - +String toJson(); - <static>+ImprovementDirectionFormatted fromJson() - ] - - [ImprovementDirectionFormatted]o-[ImprovementDirection] - [ImprovementDirectionFormatted]o-[IconData] - - [ReportSectionType + +study: Study; + +titleControl: FormControl<String>; + +iconControl: FormControl<IconOption>; + +descriptionControl: FormControl<String>; + +organizationControl: FormControl<String>; + +reviewBoardControl: FormControl<String>; + +reviewBoardNumberControl: FormControl<String>; + +researchersControl: FormControl<String>; + +emailControl: FormControl<String>; + +websiteControl: FormControl<String>; + +phoneControl: FormControl<String>; + +additionalInfoControl: FormControl<String>; + +form: FormGroup; + +titles: Map<FormMode, String>; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +titleRequired: dynamic; + +descriptionRequired: dynamic; + +iconRequired: dynamic; + +organizationRequired: dynamic; + +reviewBoardRequired: dynamic; + +reviewBoardNumberRequired: dynamic; + +researchersRequired: dynamic; + +emailRequired: dynamic; + +phoneRequired: dynamic; + +emailFormat: dynamic; + +websiteFormat: dynamic | - +index: int; - <static>+values: List<ReportSectionType>; - <static>+average: ReportSectionType; - <static>+linearRegression: ReportSectionType + +void setControlsFrom(); + +StudyInfoFormData buildFormData() ] - [ReportSectionType]o-[ReportSectionType] - [Enum]<:--[ReportSectionType] + [StudyInfoFormViewModel]o-[Study] + [StudyInfoFormViewModel]o-[FormControl] + [StudyInfoFormViewModel]o-[FormGroup] + [<abstract>FormViewModel]<:-[StudyInfoFormViewModel] - [AverageSectionFormView - | - +formViewModel: ReportItemFormViewModel; - +studyId: String; - +reportSectionColumnWidth: Map<int, TableColumnWidth> + [StudyDesignInfoFormView | +Widget build() ] - [AverageSectionFormView]o-[ReportItemFormViewModel] - [<abstract>ConsumerWidget]<:-[AverageSectionFormView] + [<abstract>StudyDesignPageWidget]<:-[StudyDesignInfoFormView] - [LinearRegressionSectionFormView + [StudyInfoFormData | - +formViewModel: ReportItemFormViewModel; - +studyId: String; - +reportSectionColumnWidth: Map<int, TableColumnWidth> + +title: String; + +description: String?; + +iconName: String; + +contactInfoFormData: StudyContactInfoFormData; + +id: String | - +Widget build() + +Study apply(); + +StudyInfoFormData copy() ] - [LinearRegressionSectionFormView]o-[ReportItemFormViewModel] - [<abstract>ConsumerWidget]<:-[LinearRegressionSectionFormView] + [StudyInfoFormData]o-[StudyContactInfoFormData] + [<abstract>IStudyFormData]<:--[StudyInfoFormData] - [DataReferenceIdentifier + [StudyContactInfoFormData | - +hashCode: int + +organization: String?; + +institutionalReviewBoard: String?; + +institutionalReviewBoardNumber: String?; + +researchers: String?; + +email: String?; + +website: String?; + +phone: String?; + +additionalInfo: String?; + +id: String | - +bool ==() + +Study apply(); + +StudyInfoFormData copy() ] - [DataReference]<:-[DataReferenceIdentifier] + [<abstract>IStudyFormData]<:--[StudyContactInfoFormData] - [DataReferenceEditor - | - +formControl: FormControl<DataReferenceIdentifier<T>>; - +availableTasks: List<Task>; - +buildReactiveDropdownField: ReactiveDropdownField<dynamic> + [StudyFormValidationSet | - +FormTableRow buildFormTableRow(); - -List<DropdownMenuItem<DataReferenceIdentifier<dynamic>>> _dataReferenceItems() + +index: int; + <static>+values: List<StudyFormValidationSet> ] - [DataReferenceEditor]o-[FormControl] - [DataReferenceEditor]o-[ReactiveDropdownField] + [Enum]<:--[StudyFormValidationSet] - [ReportsFormData + [MeasurementsFormData | - +reportItems: List<ReportItemFormData>; + +surveyMeasurements: List<MeasurementSurveyFormData>; +id: String | +Study apply(); - +ReportsFormData copy() + +MeasurementsFormData copy() ] - [<abstract>IStudyFormData]<:--[ReportsFormData] + [<abstract>IStudyFormData]<:--[MeasurementsFormData] - [ReportStatus + [MeasurementSurveyFormView | - +index: int; - <static>+values: List<ReportStatus>; - <static>+primary: ReportStatus; - <static>+secondary: ReportStatus + +formViewModel: MeasurementSurveyFormViewModel ] - [ReportStatus]o-[ReportStatus] - [Enum]<:--[ReportStatus] + [MeasurementSurveyFormView]o-[MeasurementSurveyFormViewModel] - [ReportBadge + [SurveyPreview | - +status: ReportStatus?; - +type: BadgeType; - +showPrefixIcon: bool; - +showTooltip: bool + +routeArgs: MeasurementFormRouteArgs | +Widget build() ] - [ReportBadge]o-[ReportStatus] - [ReportBadge]o-[BadgeType] - - [StudyDesignReportsFormView - | - +Widget build(); - -dynamic _showReportItemSidesheetWithArgs() - ] - - [<abstract>StudyDesignPageWidget]<:-[StudyDesignReportsFormView] + [SurveyPreview]o-[MeasurementFormRouteArgs] + [<abstract>ConsumerWidget]<:-[SurveyPreview] - [StudyFormScaffold + [MeasurementSurveyFormData | - +studyId: String; - +formViewModelBuilder: T Function(WidgetRef); - +formViewBuilder: Widget Function(T) + +measurementId: String; + +title: String; + +introText: String?; + +outroText: String?; + +questionnaireFormData: QuestionnaireFormData; + <static>+kDefaultTitle: String; + +id: String | - +Widget build() + +QuestionnaireTask toQuestionnaireTask(); + +MeasurementSurveyFormData copy() ] - [StudyFormScaffold]o-[T Function(WidgetRef)] - [StudyFormScaffold]o-[Widget Function(T)] - [<abstract>ConsumerWidget]<:-[StudyFormScaffold] + [MeasurementSurveyFormData]o-[QuestionnaireFormData] + [<abstract>IFormDataWithSchedule]<:-[MeasurementSurveyFormData] - [SurveyQuestionFormView + [MeasurementSurveyFormViewModel | - +formViewModel: QuestionFormViewModel; - +isHtmlStyleable: bool + +study: Study; + +measurementIdControl: FormControl<String>; + +instanceIdControl: FormControl<String>; + +surveyTitleControl: FormControl<String>; + +surveyIntroTextControl: FormControl<String>; + +surveyOutroTextControl: FormControl<String>; + +form: FormGroup; + +measurementId: String; + +instanceId: String; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +titleRequired: dynamic; + +atLeastOneQuestion: dynamic; + +breadcrumbsTitle: String; + +titles: Map<FormMode, String> + | + +void setControlsFrom(); + +MeasurementSurveyFormData buildFormData(); + +List<ModelAction<dynamic>> availableActions(); + +List<ModelAction<dynamic>> availablePopupActions(); + +List<ModelAction<dynamic>> availableInlineActions(); + +void onSelectItem(); + +void onNewItem(); + +SurveyQuestionFormRouteArgs buildNewFormRouteArgs(); + +SurveyQuestionFormRouteArgs buildFormRouteArgs(); + +MeasurementSurveyFormViewModel createDuplicate() ] - [SurveyQuestionFormView]o-[QuestionFormViewModel] + [MeasurementSurveyFormViewModel]o-[Study] + [MeasurementSurveyFormViewModel]o-[FormControl] + [MeasurementSurveyFormViewModel]o-[FormGroup] + [<abstract>ManagedFormViewModel]<:-[MeasurementSurveyFormViewModel] + [<abstract>WithQuestionnaireControls]<:-[MeasurementSurveyFormViewModel] + [<abstract>WithScheduleControls]<:-[MeasurementSurveyFormViewModel] + [<abstract>IFormViewModelDelegate]<:--[MeasurementSurveyFormViewModel] + [<abstract>IListActionProvider]<:--[MeasurementSurveyFormViewModel] + [<abstract>IProviderArgsResolver]<:--[MeasurementSurveyFormViewModel] - [QuestionFormViewModel + [StudyDesignMeasurementsFormView | - <static>+defaultQuestionType: SurveyQuestionType; - -_titles: Map<FormMode, String Function()>?; - +questionIdControl: FormControl<String>; - +questionTypeControl: FormControl<SurveyQuestionType>; - +questionTextControl: FormControl<String>; - +questionInfoTextControl: FormControl<String>; - +questionBaseControls: Map<String, AbstractControl<dynamic>>; - +isMultipleChoiceControl: FormControl<bool>; - +choiceResponseOptionsArray: FormArray<dynamic>; - +customOptionsMin: int; - +customOptionsMax: int; - +customOptionsInitial: int; - +boolResponseOptionsArray: FormArray<String>; - +imageResponseOptionsArray: FormArray<String>; - <static>+kDefaultMaxRecordingDurationSeconds: int; - <static>+kMaxRecordingDurationSeconds: int; - +audioResponseOptionsArray: FormArray<String>; - +maxRecordingDurationSecondsControl: FormControl<int>; - <static>+kDefaultScaleMinValue: int; - <static>+kDefaultScaleMaxValue: int; - <static>+kNumMidValueControls: int; - <static>+kMidValueDebounceMilliseconds: int; - +scaleMinValueControl: FormControl<int>; - +scaleMaxValueControl: FormControl<int>; - -_scaleRangeControl: FormControl<int>; - +scaleMinLabelControl: FormControl<String>; - +scaleMaxLabelControl: FormControl<String>; - +scaleMidValueControls: FormArray<int>; - +scaleMidLabelControls: FormArray<String?>; - -_scaleResponseOptionsArray: FormArray<int>; - +scaleMinColorControl: FormControl<SerializableColor>; - +scaleMaxColorControl: FormControl<SerializableColor>; - +prevMidValues: List<int?>?; - +freeTextTypeControl: FormControl<FreeTextQuestionType>; - +customRegexControl: FormControl<String>; - +freeTextResponseOptionsArray: FormArray<dynamic>; - +freeTextLengthMin: AbstractControl<int>; - +freeTextLengthMax: AbstractControl<int>; - +freeTextExampleTextControl: FormControl<String>; - <static>+kDefaultFreeTextMinLength: int; - <static>+kDefaultFreeTextMaxLength: int; - +freeTextLengthControl: FormControl<RangeValues>; - -_controlsByQuestionType: Map<SurveyQuestionType, FormGroup>; - -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - -_validationConfigsByQuestionType: Map<SurveyQuestionType, Map<FormValidationSetEnum, List<FormControlValidation>>>; + +Widget build() + ] + + [<abstract>StudyDesignPageWidget]<:-[StudyDesignMeasurementsFormView] + + [MeasurementsFormViewModel + | + +study: Study; + +router: GoRouter; + +measurementsArray: FormArray<dynamic>; + +surveyMeasurementFormViewModels: FormViewModelCollection<MeasurementSurveyFormViewModel, MeasurementSurveyFormData>; +form: FormGroup; - +questionId: String; - +questionType: SurveyQuestionType; - +questionTypeControlOptions: List<FormControlOption<SurveyQuestionType>>; - +answerOptionsArray: FormArray<dynamic>; - +answerOptionsControls: List<AbstractControl<dynamic>>; - +validAnswerOptions: List<String>; - +boolOptions: List<AbstractControl<String>>; - +imageOptions: List<AbstractControl<String>>; - +audioOptions: List<AbstractControl<String>>; - +scaleMinValue: int; - +scaleMaxValue: int; - +scaleRange: int; - +scaleAllValueControls: List<AbstractControl<int>>; + +measurementViewModels: List<MeasurementSurveyFormViewModel>; +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +questionTextRequired: dynamic; - +numValidChoiceOptions: dynamic; - +scaleRangeValid: dynamic; - +maxRecordingDurationValid: dynamic; - +titles: Map<FormMode, String>; - +isAddOptionButtonVisible: bool; - +isMidValuesClearedInfoVisible: bool + +measurementRequired: dynamic; + +titles: Map<FormMode, String> + | + +void read(); + +void setControlsFrom(); + +MeasurementsFormData buildFormData(); + +List<ModelAction<dynamic>> availableActions(); + +List<ModelAction<dynamic>> availablePopupActions(); + +List<ModelAction<dynamic>> availableInlineActions(); + +void onSelectItem(); + +void onNewItem(); + +MeasurementSurveyFormViewModel provide(); + +void onCancel(); + +dynamic onSave() + ] + + [MeasurementsFormViewModel]o-[Study] + [MeasurementsFormViewModel]o-[GoRouter] + [MeasurementsFormViewModel]o-[FormArray] + [MeasurementsFormViewModel]o-[FormViewModelCollection] + [MeasurementsFormViewModel]o-[FormGroup] + [<abstract>FormViewModel]<:-[MeasurementsFormViewModel] + [<abstract>IFormViewModelDelegate]<:--[MeasurementsFormViewModel] + [<abstract>IListActionProvider]<:--[MeasurementsFormViewModel] + [<abstract>IProviderArgsResolver]<:--[MeasurementsFormViewModel] + + [StudyFormScaffold + | + +studyId: String; + +formViewModelBuilder: T Function(WidgetRef); + +formViewBuilder: Widget Function(T) + | + +Widget build() + ] + + [StudyFormScaffold]o-[T Function(WidgetRef)] + [StudyFormScaffold]o-[Widget Function(T)] + [<abstract>ConsumerWidget]<:-[StudyFormScaffold] + + [ConsentItemFormViewModel + | + +consentIdControl: FormControl<String>; + +titleControl: FormControl<String>; + +descriptionControl: FormControl<String>; + +iconControl: FormControl<IconOption>; + +form: FormGroup; + +consentId: String; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +titleRequired: dynamic; + +descriptionRequired: dynamic; + +titles: Map<FormMode, String> + | + +void setControlsFrom(); + +ConsentItemFormData buildFormData(); + +ConsentItemFormViewModel createDuplicate() + ] + + [ConsentItemFormViewModel]o-[FormControl] + [ConsentItemFormViewModel]o-[FormGroup] + [<abstract>ManagedFormViewModel]<:-[ConsentItemFormViewModel] + + [StudyDesignEnrollmentFormView + | + +Widget build(); + -dynamic _showScreenerQuestionSidesheetWithArgs(); + -dynamic _showConsentItemSidesheetWithArgs() + ] + + [<abstract>StudyDesignPageWidget]<:-[StudyDesignEnrollmentFormView] + + [<abstract>IScreenerQuestionLogicFormViewModel + | + +isDirtyOptionsBannerVisible: bool + ] + + [ScreenerQuestionLogicFormView + | + +formViewModel: ScreenerQuestionFormViewModel + | + +Widget build(); + -dynamic _buildInfoBanner(); + -dynamic _buildAnswerOptionsLogicControls(); + -List<Widget> _buildOptionLogicRow() + ] + + [ScreenerQuestionLogicFormView]o-[ScreenerQuestionFormViewModel] + [<abstract>FormConsumerWidget]<:-[ScreenerQuestionLogicFormView] + + [ConsentItemFormData + | + +consentId: String; + +title: String; + +description: String; + +iconName: String?; + +id: String + | + +ConsentItem toConsentItem(); + +ConsentItemFormData copy() + ] + + [<abstract>IFormData]<:-[ConsentItemFormData] + + [ConsentItemFormView + | + +formViewModel: ConsentItemFormViewModel + ] + + [ConsentItemFormView]o-[ConsentItemFormViewModel] + + [EnrollmentFormData + | + <static>+kDefaultEnrollmentType: Participation; + +enrollmentType: Participation; + +questionnaireFormData: QuestionnaireFormData; + +consentItemsFormData: List<ConsentItemFormData>?; + +id: String + | + +Study apply(); + +EnrollmentFormData copy() + ] + + [EnrollmentFormData]o-[Participation] + [EnrollmentFormData]o-[QuestionnaireFormData] + [<abstract>IStudyFormData]<:--[EnrollmentFormData] + + [ScreenerQuestionFormViewModel + | + <static>+defaultResponseOptionValidity: bool; + +responseOptionsDisabledArray: FormArray<dynamic>; + +responseOptionsLogicControls: FormArray<bool>; + +responseOptionsLogicDescriptionControls: FormArray<String>; + -_questionBaseControls: Map<String, AbstractControl<dynamic>>; + +prevResponseOptionControls: List<AbstractControl<dynamic>>; + +prevResponseOptionValues: List<dynamic>; + +responseOptionsDisabledControls: List<AbstractControl<dynamic>>; + +logicControlOptions: List<FormControlOption<bool>>; + +questionBaseControls: Map<String, AbstractControl<dynamic>>; + +isDirtyOptionsBannerVisible: bool | - +String? scaleMidLabelAt(); - -dynamic _onScaleRangeChanged(); - -dynamic _applyInputFormatters(); - -dynamic _updateScaleMidValueControls(); - -Map<String, dynamic>? _validateFreeText(); - -dynamic _onFreeTextLengthChanged(); - -List<FormControlValidation> _getValidationConfig(); - +dynamic onQuestionTypeChanged(); +dynamic onResponseOptionsChanged(); - -void _updateFormControls(); - +void initControls(); +void setControlsFrom(); +QuestionFormData buildFormData(); + -List<FormControl<dynamic>> _copyFormControls(); + -AbstractControl<dynamic>? _findAssociatedLogicControlFor(); + -AbstractControl<dynamic>? _findAssociatedControlFor(); + +ScreenerQuestionFormViewModel createDuplicate() + ] + + [ScreenerQuestionFormViewModel]o-[FormArray] + [QuestionFormViewModel]<:-[ScreenerQuestionFormViewModel] + [<abstract>IScreenerQuestionLogicFormViewModel]<:--[ScreenerQuestionFormViewModel] + + [EnrollmentFormViewModel + | + +study: Study; + +router: GoRouter; + +consentItemDelegate: EnrollmentFormConsentItemDelegate; + +enrollmentTypeControl: FormControl<Participation>; + +consentItemArray: FormArray<dynamic>; + +consentItemFormViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData>; + +form: FormGroup; + +enrollmentTypeControlOptions: List<FormControlOption<Participation>>; + +consentItemModels: List<ConsentItemFormViewModel>; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +titles: Map<FormMode, String>; + +canTestScreener: bool; + +canTestConsent: bool; + +questionTitles: Map<FormMode, String Function()> + | + +void setControlsFrom(); + +EnrollmentFormData buildFormData(); + +void read(); +List<ModelAction<dynamic>> availableActions(); - +void onNewItem(); + +List<ModelAction<dynamic>> availablePopupActions(); + +List<ModelAction<dynamic>> availableInlineActions(); +void onSelectItem(); - +dynamic save(); - +QuestionFormViewModel createDuplicate() + +void onNewItem(); + +ScreenerQuestionFormRouteArgs buildNewScreenerQuestionFormRouteArgs(); + +ScreenerQuestionFormRouteArgs buildScreenerQuestionFormRouteArgs(); + +ConsentItemFormRouteArgs buildNewConsentItemFormRouteArgs(); + +ConsentItemFormRouteArgs buildConsentItemFormRouteArgs(); + +dynamic testScreener(); + +dynamic testConsent(); + +ScreenerQuestionFormViewModel provideQuestionFormViewModel() + ] + + [EnrollmentFormViewModel]o-[Study] + [EnrollmentFormViewModel]o-[GoRouter] + [EnrollmentFormViewModel]o-[EnrollmentFormConsentItemDelegate] + [EnrollmentFormViewModel]o-[FormControl] + [EnrollmentFormViewModel]o-[FormArray] + [EnrollmentFormViewModel]o-[FormViewModelCollection] + [EnrollmentFormViewModel]o-[FormGroup] + [<abstract>FormViewModel]<:-[EnrollmentFormViewModel] + [<abstract>WithQuestionnaireControls]<:-[EnrollmentFormViewModel] + [<abstract>IFormViewModelDelegate]<:--[EnrollmentFormViewModel] + [<abstract>IListActionProvider]<:--[EnrollmentFormViewModel] + [<abstract>IProviderArgsResolver]<:--[EnrollmentFormViewModel] + + [EnrollmentFormConsentItemDelegate + | + +formViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData>; + +owner: EnrollmentFormViewModel; + +propagateOnSave: bool; + +validationSet: dynamic + | + +void onCancel(); + +dynamic onSave(); + +ConsentItemFormViewModel provide(); + +List<ModelAction<dynamic>> availableActions(); + +void onNewItem(); + +void onSelectItem() + ] + + [EnrollmentFormConsentItemDelegate]o-[FormViewModelCollection] + [EnrollmentFormConsentItemDelegate]o-[EnrollmentFormViewModel] + [<abstract>IFormViewModelDelegate]<:--[EnrollmentFormConsentItemDelegate] + [<abstract>IListActionProvider]<:--[EnrollmentFormConsentItemDelegate] + [<abstract>IProviderArgsResolver]<:--[EnrollmentFormConsentItemDelegate] + + [StudyFormViewModel + | + +studyDirtyCopy: Study?; + +studyRepository: IStudyRepository; + +authRepository: IAuthRepository; + +router: GoRouter; + +studyInfoFormViewModel: StudyInfoFormViewModel; + +enrollmentFormViewModel: EnrollmentFormViewModel; + +measurementsFormViewModel: MeasurementsFormViewModel; + +reportsFormViewModel: ReportsFormViewModel; + +interventionsFormViewModel: InterventionsFormViewModel; + +form: FormGroup; + +isStudyReadonly: bool; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +titles: Map<FormMode, String> + | + +void read(); + +void setControlsFrom(); + +Study buildFormData(); + +void dispose(); + +void onCancel(); + +dynamic onSave(); + -dynamic _applyAndSaveSubform() + ] + + [StudyFormViewModel]o-[Study] + [StudyFormViewModel]o-[<abstract>IStudyRepository] + [StudyFormViewModel]o-[<abstract>IAuthRepository] + [StudyFormViewModel]o-[GoRouter] + [StudyFormViewModel]o-[StudyInfoFormViewModel] + [StudyFormViewModel]o-[EnrollmentFormViewModel] + [StudyFormViewModel]o-[MeasurementsFormViewModel] + [StudyFormViewModel]o-[ReportsFormViewModel] + [StudyFormViewModel]o-[InterventionsFormViewModel] + [StudyFormViewModel]o-[FormGroup] + [<abstract>FormViewModel]<:-[StudyFormViewModel] + [<abstract>IFormViewModelDelegate]<:--[StudyFormViewModel] + + [<abstract>WithQuestionnaireControls + | + +questionsArray: FormArray<dynamic>; + +questionFormViewModels: FormViewModelCollection<Q, QuestionFormData>; + +questionnaireControls: Map<String, FormArray<dynamic>>; + +propagateOnSave: bool; + +questionModels: List<Q>; + +questionTitles: Map<FormMode, String Function()> + | + +void setQuestionnaireControlsFrom(); + +QuestionnaireFormData buildQuestionnaireFormData(); + +void read(); + +void onCancel(); + +dynamic onSave(); + +Q provide(); + +Q provideQuestionFormViewModel() + ] + + [<abstract>WithQuestionnaireControls]o-[FormArray] + [<abstract>WithQuestionnaireControls]o-[FormViewModelCollection] + [<abstract>IFormViewModelDelegate]<:--[<abstract>WithQuestionnaireControls] + [<abstract>IProviderArgsResolver]<:--[<abstract>WithQuestionnaireControls] + + [QuestionnaireFormData + | + +questionsData: List<QuestionFormData>?; + +id: String + | + +StudyUQuestionnaire toQuestionnaire(); + +List<EligibilityCriterion> toEligibilityCriteria(); + +QuestionnaireFormData copy() ] - [QuestionFormViewModel]o-[SurveyQuestionType] - [QuestionFormViewModel]o-[FormControl] - [QuestionFormViewModel]o-[FormArray] - [QuestionFormViewModel]o-[<abstract>AbstractControl] - [QuestionFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[QuestionFormViewModel] - [<abstract>IListActionProvider]<:--[QuestionFormViewModel] + [<abstract>IFormData]<:--[QuestionnaireFormData] [<abstract>QuestionFormData | @@ -1863,17 +1985,15 @@ [FreeTextQuestionFormData]o-[FreeTextQuestionType] [<abstract>QuestionFormData]<:-[FreeTextQuestionFormData] - [<abstract>IScaleQuestionFormViewModel - | - +isMidValuesClearedInfoVisible: bool - ] - - [ScaleQuestionFormView + [AudioRecordingQuestionFormView | +formViewModel: QuestionFormViewModel + | + +Widget build() ] - [ScaleQuestionFormView]o-[QuestionFormViewModel] + [AudioRecordingQuestionFormView]o-[QuestionFormViewModel] + [<abstract>ConsumerWidget]<:-[AudioRecordingQuestionFormView] [FreeTextQuestionFormView | @@ -1888,16 +2008,6 @@ [FreeTextQuestionFormView]o-[QuestionFormViewModel] [<abstract>ConsumerWidget]<:-[FreeTextQuestionFormView] - [BoolQuestionFormView - | - +formViewModel: QuestionFormViewModel - | - +Widget build() - ] - - [BoolQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[BoolQuestionFormView] - [SurveyQuestionType | +index: int; @@ -1913,81 +2023,153 @@ [SurveyQuestionType]o-[SurveyQuestionType] [Enum]<:--[SurveyQuestionType] - [AudioRecordingQuestionFormView + [ImageCapturingQuestionFormView | +formViewModel: QuestionFormViewModel | +Widget build() ] - [AudioRecordingQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[AudioRecordingQuestionFormView] + [ImageCapturingQuestionFormView]o-[QuestionFormViewModel] + [<abstract>ConsumerWidget]<:-[ImageCapturingQuestionFormView] - [ChoiceQuestionFormView + [<abstract>IScaleQuestionFormViewModel | - +formViewModel: QuestionFormViewModel + +isMidValuesClearedInfoVisible: bool + ] + + [ScaleQuestionFormView | - +Widget build() + +formViewModel: QuestionFormViewModel ] - [ChoiceQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[ChoiceQuestionFormView] + [ScaleQuestionFormView]o-[QuestionFormViewModel] - [ImageCapturingQuestionFormView + [ChoiceQuestionFormView | +formViewModel: QuestionFormViewModel | +Widget build() ] - [ImageCapturingQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[ImageCapturingQuestionFormView] + [ChoiceQuestionFormView]o-[QuestionFormViewModel] + [<abstract>ConsumerWidget]<:-[ChoiceQuestionFormView] - [<abstract>WithQuestionnaireControls + [BoolQuestionFormView | - +questionsArray: FormArray<dynamic>; - +questionFormViewModels: FormViewModelCollection<Q, QuestionFormData>; - +questionnaireControls: Map<String, FormArray<dynamic>>; - +propagateOnSave: bool; - +questionModels: List<Q>; - +questionTitles: Map<FormMode, String Function()> + +formViewModel: QuestionFormViewModel | - +void setQuestionnaireControlsFrom(); - +QuestionnaireFormData buildQuestionnaireFormData(); - +void read(); - +void onCancel(); - +dynamic onSave(); - +Q provide(); - +Q provideQuestionFormViewModel() + +Widget build() ] - [<abstract>WithQuestionnaireControls]o-[FormArray] - [<abstract>WithQuestionnaireControls]o-[FormViewModelCollection] - [<abstract>IFormViewModelDelegate]<:--[<abstract>WithQuestionnaireControls] - [<abstract>IProviderArgsResolver]<:--[<abstract>WithQuestionnaireControls] + [BoolQuestionFormView]o-[QuestionFormViewModel] + [<abstract>ConsumerWidget]<:-[BoolQuestionFormView] - [QuestionnaireFormData + [QuestionFormViewModel | - +questionsData: List<QuestionFormData>?; - +id: String + <static>+defaultQuestionType: SurveyQuestionType; + -_titles: Map<FormMode, String Function()>?; + +questionIdControl: FormControl<String>; + +questionTypeControl: FormControl<SurveyQuestionType>; + +questionTextControl: FormControl<String>; + +questionInfoTextControl: FormControl<String>; + +questionBaseControls: Map<String, AbstractControl<dynamic>>; + +isMultipleChoiceControl: FormControl<bool>; + +choiceResponseOptionsArray: FormArray<dynamic>; + +customOptionsMin: int; + +customOptionsMax: int; + +customOptionsInitial: int; + +boolResponseOptionsArray: FormArray<String>; + +imageResponseOptionsArray: FormArray<String>; + <static>+kDefaultMaxRecordingDurationSeconds: int; + <static>+kMaxRecordingDurationSeconds: int; + +audioResponseOptionsArray: FormArray<String>; + +maxRecordingDurationSecondsControl: FormControl<int>; + <static>+kDefaultScaleMinValue: int; + <static>+kDefaultScaleMaxValue: int; + <static>+kNumMidValueControls: int; + <static>+kMidValueDebounceMilliseconds: int; + +scaleMinValueControl: FormControl<int>; + +scaleMaxValueControl: FormControl<int>; + -_scaleRangeControl: FormControl<int>; + +scaleMinLabelControl: FormControl<String>; + +scaleMaxLabelControl: FormControl<String>; + +scaleMidValueControls: FormArray<int>; + +scaleMidLabelControls: FormArray<String?>; + -_scaleResponseOptionsArray: FormArray<int>; + +scaleMinColorControl: FormControl<SerializableColor>; + +scaleMaxColorControl: FormControl<SerializableColor>; + +prevMidValues: List<int?>?; + +freeTextTypeControl: FormControl<FreeTextQuestionType>; + +customRegexControl: FormControl<String>; + +freeTextResponseOptionsArray: FormArray<dynamic>; + +freeTextLengthMin: AbstractControl<int>; + +freeTextLengthMax: AbstractControl<int>; + +freeTextExampleTextControl: FormControl<String>; + <static>+kDefaultFreeTextMinLength: int; + <static>+kDefaultFreeTextMaxLength: int; + +freeTextLengthControl: FormControl<RangeValues>; + -_controlsByQuestionType: Map<SurveyQuestionType, FormGroup>; + -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + -_validationConfigsByQuestionType: Map<SurveyQuestionType, Map<FormValidationSetEnum, List<FormControlValidation>>>; + +form: FormGroup; + +questionId: String; + +questionType: SurveyQuestionType; + +questionTypeControlOptions: List<FormControlOption<SurveyQuestionType>>; + +answerOptionsArray: FormArray<dynamic>; + +answerOptionsControls: List<AbstractControl<dynamic>>; + +validAnswerOptions: List<String>; + +boolOptions: List<AbstractControl<String>>; + +imageOptions: List<AbstractControl<String>>; + +audioOptions: List<AbstractControl<String>>; + +scaleMinValue: int; + +scaleMaxValue: int; + +scaleRange: int; + +scaleAllValueControls: List<AbstractControl<int>>; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +questionTextRequired: dynamic; + +numValidChoiceOptions: dynamic; + +scaleRangeValid: dynamic; + +maxRecordingDurationValid: dynamic; + +titles: Map<FormMode, String>; + +isAddOptionButtonVisible: bool; + +isMidValuesClearedInfoVisible: bool | - +StudyUQuestionnaire toQuestionnaire(); - +List<EligibilityCriterion> toEligibilityCriteria(); - +QuestionnaireFormData copy() + +String? scaleMidLabelAt(); + -dynamic _onScaleRangeChanged(); + -dynamic _applyInputFormatters(); + -dynamic _updateScaleMidValueControls(); + -Map<String, dynamic>? _validateFreeText(); + -dynamic _onFreeTextLengthChanged(); + -List<FormControlValidation> _getValidationConfig(); + +dynamic onQuestionTypeChanged(); + +dynamic onResponseOptionsChanged(); + -void _updateFormControls(); + +void initControls(); + +void setControlsFrom(); + +QuestionFormData buildFormData(); + +List<ModelAction<dynamic>> availableActions(); + +void onNewItem(); + +void onSelectItem(); + +dynamic save(); + +QuestionFormViewModel createDuplicate() ] - [<abstract>IFormData]<:--[QuestionnaireFormData] + [QuestionFormViewModel]o-[SurveyQuestionType] + [QuestionFormViewModel]o-[FormControl] + [QuestionFormViewModel]o-[FormArray] + [QuestionFormViewModel]o-[<abstract>AbstractControl] + [QuestionFormViewModel]o-[FormGroup] + [<abstract>ManagedFormViewModel]<:-[QuestionFormViewModel] + [<abstract>IListActionProvider]<:--[QuestionFormViewModel] - [ScheduleControls - | - +formViewModel: WithScheduleControls + [SurveyQuestionFormView | - +Widget build(); - -List<FormTableRow> _conditionalTimeRestrictions() + +formViewModel: QuestionFormViewModel; + +isHtmlStyleable: bool ] - [ScheduleControls]o-[<abstract>WithScheduleControls] - [<abstract>FormConsumerWidget]<:-[ScheduleControls] + [SurveyQuestionFormView]o-[QuestionFormViewModel] [<abstract>IFormDataWithSchedule | @@ -2004,6 +2186,17 @@ [<abstract>IFormDataWithSchedule]o-[StudyUTimeOfDay] [<abstract>IFormData]<:--[<abstract>IFormDataWithSchedule] + [ScheduleControls + | + +formViewModel: WithScheduleControls + | + +Widget build(); + -List<FormTableRow> _conditionalTimeRestrictions() + ] + + [ScheduleControls]o-[<abstract>WithScheduleControls] + [<abstract>FormConsumerWidget]<:-[ScheduleControls] + [<abstract>WithScheduleControls | +isTimeRestrictedControl: FormControl<bool>; @@ -2020,51 +2213,13 @@ +hasReminder: bool; +isTimeRestricted: bool; +timeRestriction: List<Time>? - | - +void setScheduleControlsFrom(); - -dynamic _initReminderControl() - ] - - [<abstract>WithScheduleControls]o-[FormControl] - [<abstract>WithScheduleControls]o-[StreamSubscription] - - [StudyFormViewModel - | - +studyDirtyCopy: Study?; - +studyRepository: IStudyRepository; - +authRepository: IAuthRepository; - +router: GoRouter; - +studyInfoFormViewModel: StudyInfoFormViewModel; - +enrollmentFormViewModel: EnrollmentFormViewModel; - +measurementsFormViewModel: MeasurementsFormViewModel; - +reportsFormViewModel: ReportsFormViewModel; - +interventionsFormViewModel: InterventionsFormViewModel; - +form: FormGroup; - +isStudyReadonly: bool; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titles: Map<FormMode, String> - | - +void read(); - +void setControlsFrom(); - +Study buildFormData(); - +void dispose(); - +void onCancel(); - +dynamic onSave(); - -dynamic _applyAndSaveSubform() - ] - - [StudyFormViewModel]o-[Study] - [StudyFormViewModel]o-[<abstract>IStudyRepository] - [StudyFormViewModel]o-[<abstract>IAuthRepository] - [StudyFormViewModel]o-[GoRouter] - [StudyFormViewModel]o-[StudyInfoFormViewModel] - [StudyFormViewModel]o-[EnrollmentFormViewModel] - [StudyFormViewModel]o-[MeasurementsFormViewModel] - [StudyFormViewModel]o-[ReportsFormViewModel] - [StudyFormViewModel]o-[InterventionsFormViewModel] - [StudyFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[StudyFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[StudyFormViewModel] + | + +void setScheduleControlsFrom(); + -dynamic _initReminderControl() + ] + + [<abstract>WithScheduleControls]o-[FormControl] + [<abstract>WithScheduleControls]o-[StreamSubscription] [<abstract>StudyDesignPageWidget | @@ -2073,45 +2228,33 @@ [<abstract>StudyPageWidget]<:-[<abstract>StudyDesignPageWidget] - [StudyAnalyzeScreen + [StudiesTableColumnHeader | - +Widget? banner(); - +Widget build() + +title: String; + +sortable: bool; + +sortAscending: bool; + +sortingActive: bool; + +onSort: void Function()? ] - [<abstract>StudyPageWidget]<:-[StudyAnalyzeScreen] + [StudiesTableColumnHeader]o-[void Function()?] - [StudyAnalyzeController + [DashboardScreen | - +dynamic onExport() + +filter: StudiesFilter? ] - [StudyBaseController]<:-[StudyAnalyzeController] + [DashboardScreen]o-[StudiesFilter] - [StudyMonitorScreen + [DashboardScaffold | - +Widget build() - ] - - [<abstract>StudyPageWidget]<:-[StudyMonitorScreen] - - [StudiesTableItem + <static>+compactWidthThreshold: double; + +body: Widget | - +study: Study; - +itemHeight: double; - +itemPadding: double; - +rowSpacing: double; - +columnSpacing: double; - +actions: List<ModelAction<dynamic>>; - +columnSizes: List<StudiesTableColumnSize>; - +isPinned: bool; - +onPinnedChanged: void Function(Study, bool)?; - +onTap: void Function(Study)? + +Widget build() ] - [StudiesTableItem]o-[Study] - [StudiesTableItem]o-[void Function(Study, bool)?] - [StudiesTableItem]o-[void Function(Study)?] + [DashboardScaffold]o-[<abstract>Widget] [DashboardController | @@ -2147,6 +2290,14 @@ [DashboardController]o-[SearchController] [<abstract>IModelActionProvider]<:--[DashboardController] + [StudiesFilter + | + +index: int; + <static>+values: List<StudiesFilter> + ] + + [Enum]<:--[StudiesFilter] + [StudiesTableColumnSize | +collapsed: bool; @@ -2199,42 +2350,30 @@ [StudiesTableColumn]o-[StudiesTableColumn] [Enum]<:--[StudiesTableColumn] - [DashboardScreen - | - +filter: StudiesFilter? - ] - - [DashboardScreen]o-[StudiesFilter] - - [DashboardScaffold - | - <static>+compactWidthThreshold: double; - +body: Widget + [StudiesTableItem | - +Widget build() + +study: Study; + +itemHeight: double; + +itemPadding: double; + +rowSpacing: double; + +columnSpacing: double; + +actions: List<ModelAction<dynamic>>; + +columnSizes: List<StudiesTableColumnSize>; + +isPinned: bool; + +onPinnedChanged: void Function(Study, bool)?; + +onTap: void Function(Study)? ] - [DashboardScaffold]o-[<abstract>Widget] + [StudiesTableItem]o-[Study] + [StudiesTableItem]o-[void Function(Study, bool)?] + [StudiesTableItem]o-[void Function(Study)?] - [StudiesFilter - | - +index: int; - <static>+values: List<StudiesFilter> + [App ] - [Enum]<:--[StudiesFilter] - - [StudiesTableColumnHeader - | - +title: String; - +sortable: bool; - +sortAscending: bool; - +sortingActive: bool; - +onSort: void Function()? + [AppContent ] - [StudiesTableColumnHeader]o-[void Function()?] - [AccountSettingsDialog | +Widget build() @@ -2242,3917 +2381,3750 @@ [<abstract>ConsumerWidget]<:-[AccountSettingsDialog] - [StudyInvitesTable - | - +invites: List<StudyInvite>; - +onSelect: void Function(StudyInvite); - +getActions: List<ModelAction<dynamic>> Function(StudyInvite); - +getInlineActions: List<ModelAction<dynamic>> Function(StudyInvite); - +getIntervention: Intervention? Function(String); - +getParticipantCountForInvite: int Function(StudyInvite) - | - +Widget build(); - -List<Widget> _buildRow() - ] - - [StudyInvitesTable]o-[void Function(StudyInvite)] - [StudyInvitesTable]o-[List<ModelAction<dynamic>> Function(StudyInvite)] - [StudyInvitesTable]o-[Intervention? Function(String)] - [StudyInvitesTable]o-[int Function(StudyInvite)] - - [StudyRecruitController - | - +inviteCodeRepository: IInviteCodeRepository; - -_invitesSubscription: StreamSubscription<List<WrappedModel<StudyInvite>>>? - | - -dynamic _subscribeInvites(); - +Intervention? getIntervention(); - +int getParticipantCountForInvite(); - +List<ModelAction<dynamic>> availableActions(); - +List<ModelAction<dynamic>> availableInlineActions(); - +void dispose() - ] - - [StudyRecruitController]o-[<abstract>IInviteCodeRepository] - [StudyRecruitController]o-[StreamSubscription] - [StudyBaseController]<:-[StudyRecruitController] - [<abstract>IModelActionProvider]<:--[StudyRecruitController] - - [InviteCodeFormViewModel - | - +study: Study; - +inviteCodeRepository: IInviteCodeRepository; - +codeControl: FormControl<String>; - +codeControlValidationMessages: Map<String, String Function(dynamic)>; - +isPreconfiguredScheduleControl: FormControl<bool>; - +preconfiguredScheduleTypeControl: FormControl<PhaseSequence>; - +interventionAControl: FormControl<String>; - +interventionBControl: FormControl<String>; - +form: FormGroup; - +titles: Map<FormMode, String>; - +interventionControlOptions: List<FormControlOption<String>>; - +preconfiguredScheduleTypeOptions: List<FormControlOption<PhaseSequence>>; - +isPreconfiguredSchedule: bool; - +preconfiguredSchedule: List<String>? - | - +void initControls(); - -dynamic _uniqueInviteCode(); - +void regenerateCode(); - -String _generateCode(); - +StudyInvite buildFormData(); - +void setControlsFrom(); - +dynamic save() - ] - - [InviteCodeFormViewModel]o-[Study] - [InviteCodeFormViewModel]o-[<abstract>IInviteCodeRepository] - [InviteCodeFormViewModel]o-[FormControl] - [InviteCodeFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[InviteCodeFormViewModel] - - [EnrolledBadge - | - +enrolledCount: int - | - +Widget build() - ] - - [InviteCodeFormView - | - +formViewModel: InviteCodeFormViewModel - | - +Widget build(); - -List<FormTableRow> _conditionalInterventionRows() - ] - - [InviteCodeFormView]o-[InviteCodeFormViewModel] - [<abstract>FormConsumerWidget]<:-[InviteCodeFormView] - - [StudyRecruitScreen - | - +Widget build(); - -Widget _inviteCodesSectionHeader(); - -Widget _newInviteCodeButton(); - -dynamic _onSelectInvite() - ] - - [<abstract>StudyPageWidget]<:-[StudyRecruitScreen] - - [DrawerEntry - | - +localizedTitle: String Function(); - +icon: IconData?; - +localizedHelpText: String Function()?; - +enabled: bool; - +onSelected: void Function(BuildContext, WidgetRef)?; - +autoCloseDrawer: bool; - +title: String; - +helpText: String? - | - +void onClick() - ] - - [DrawerEntry]o-[String Function()] - [DrawerEntry]o-[IconData] - [DrawerEntry]o-[String Function()?] - [DrawerEntry]o-[void Function(BuildContext, WidgetRef)?] - - [GoRouterDrawerEntry - | - +intent: RoutingIntent; - +onNavigated: void Function()? - | - +void onClick() - ] - - [GoRouterDrawerEntry]o-[RoutingIntent] - [GoRouterDrawerEntry]o-[void Function()?] - [DrawerEntry]<:-[GoRouterDrawerEntry] - - [AppDrawer - | - +width: int; - +autoCloseDrawer: bool; - +leftPaddingEntries: double; - +logoPaddingVertical: double; - +logoPaddingHorizontal: double; - +logoMaxHeight: double; - +logoSectionMinHeight: double; - +logoSectionMaxHeight: double - ] - - + - + + + - + - + + + - + - + + + - + - + + + - + - - - - + + + + + - - - + + + + + + + + + + + - - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + + + + + + + + + + + + + - + + - + - - - - - - - + + - + + - + - - - + - + - - - + - + - + - + - + - + - + - + - + - + - + - + - - - - - + - + - - - + + + + - + + - + - + - + - - - + - + - + - + - + + + - + - - - - - - - - + + - + - - + + - + - + + + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - - + + - + - - - + - + + + + + + - - - + + + + - + - - - + + + - + - + - + - + - + - + - + - - - + - + - + - + - + - + - - - - - - - + - + - + + + + + + + + + - + - + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - + + + - - + + + + + - + - - + + + - + + + + - + - - + + - + - - - + - + - + - + - + - + - + - + - + - + - - - - - - + + - + - - + + - + - + - + - + - + - - - + - + - + - - - - - - + - - - - + - + - - - - - + + + - + - + - + - + - + - + - + - + + + + + - + - + + + - + - + - + - - - - - - - - - - - - - - - - - + - + - + - - - - + - - - - - - - - - - + - + - + - + - - - + + + + + + + + + - + - + - + - + + + - + - - - - - - - + + + + + - + - + - + - + - + - + - + - + - + - - - - + + + + - + - + - + - + - + - - + + - + - + - + - + + + + + - + - + - + - + + + - - - - - - + - - + - - - + + + + - - - - + - + - + + + + + + - - + - + - - - + - + - + - + - - - - - + - + + + + + + + + + + + - + - - + + + + - + - + + + - + - + - + - + - + - - - + - + - - - - + + + - - + - + - - + + + - - + - - - - + + - + - + + + + + - + - + + + - + - - - + - + - - - + - + - + + + - + - + - - - - - - - - - - - - - - + - - - - - - - - - - + - + - - - - - - - - - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - - - + + + + + + + + - - + - - - - + + + - - - + + + - + + - + - + - + - - - + + - + + - + - - - + - + - + - - + + - + - + - + + + + + + + + + + + + + - + - + - + - + - + - - - - + + + - - - + + - + - + - + - + + + - + - + + + - + - + - + - - - + - + - - - + + + + + + + + - - - + + + - - - + + + - + + + + - + - - - - - + - + - - - + - + - - - - - + - + - + - + + + - + - - - - + + + + - + - - + + - + - + - + - - - + + + - + - + - + - - - + + + + + - + - + + + + + - + - + - + - + - + - - - + + - + + - + - - + + - + - - + + - - - - + - - - - - - - - - - + - + - - - + - + - - - + - + - + - + - - - + - + - - - + - + + + + + - + - - - - - - - - - - + + + - - - - - + + + - - - + + - + - + - + - + - + - + - + - + - - + + - + - - - + - - - - + - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - + + + + - + + - + - + - + - - - + + - - + - + - - - - - - - - - - + + + + + + - + + + + - + + + + + + + + + + - + - + + + - + - + + + - + - + + + - + - + + + - + - + + + + + - + - + + + - + - + - + - - + + + + + - - + + + - + - + - + - + - + - + - + - + - + + + - + - - + + - + - + - + - + - - + + - + - - - + + + - + - + - + - + + + - + - + - + - + - + - + - + - - - - + + + + + + + - - + - + - + - + - + - + + + + + + + + - + + - + - - - + - + - - - - - + - + - + - + - + - + - + + + + + - + - + - + - + - + - - - - - - - + + + + + + - - - WebFrame + + + IAppDelegate - - - +previewSrc: String - +studyId: String + + + +dynamic onAppStart() - - - +Widget build() + + + + + + + + + + AppController - - - - - - - - - DisabledFrame + + + +appDelegates: List<IAppDelegate> + -_delayedFuture: dynamic + +isInitialized: dynamic - - - +Widget build() + + + +dynamic onAppStart() + -dynamic _callDelegates() - - - - - + + + + - - - PhoneContainer + + + StudyMonitorScreen - - - <static>+defaultWidth: double - <static>+defaultHeight: double - +width: double - +height: double - +borderColor: Color - +borderWidth: double - +borderRadius: double - +innerContent: Widget - +innerContentBackgroundColor: Color? + + + +Widget build() - - - +Widget build() + + + + + + + + + + StudyPageWidget - - - - + + + +studyId: String + + - - - Color + + + +Widget? banner() - - - + + + + + - - - Widget + + + LoginForm - - - - - - - - - MobileFrame + + + +formKey: AuthFormKey - - - +Widget build() + + + +Widget build() - - - - + + + + - - - DesktopFrame + + + AuthFormKey - - - +Widget build() + + + +index: int + <static>+values: List<AuthFormKey> + <static>+login: AuthFormKey + <static>+signup: AuthFormKey + <static>+passwordForgot: AuthFormKey + <static>+passwordRecovery: AuthFormKey + <static>-_loginSubmit: AuthFormKey + <static>-_signupSubmit: AuthFormKey - - - - - + + + - - - StudyController + + + FormConsumerRefWidget - - - +notificationService: INotificationService - +studyEventsSubscription: StreamSubscription<ModelEvent<Study>>? - +studyActions: List<ModelAction<dynamic>> + + + + + + + + + + PasswordRecoveryForm - - - +dynamic syncStudyStatus() - +dynamic onStudySubscriptionUpdate() - -dynamic _redirectNewToActualStudyID() - +dynamic publishStudy() - +void onChangeStudyParticipation() - +void onAddParticipants() - +void onSettingsPressed() - +void dispose() + + + +formKey: AuthFormKey + + + + + + +Widget build() - - - + + + + + - - - INotificationService + + + PasswordForgotForm - - - - + + + +formKey: AuthFormKey + + - - - StreamSubscription + + + +Widget build() - - - - - + + + + + - - - StudyBaseController + + + SignupForm - - - +studyId: String - +studyRepository: IStudyRepository - +router: GoRouter - +studySubscription: StreamSubscription<WrappedModel<Study>>? + + + +formKey: AuthFormKey - - - +dynamic subscribeStudy() - +dynamic onStudySubscriptionUpdate() - +dynamic onStudySubscriptionError() - +void dispose() + + + +Widget build() + -dynamic _onClickTermsOfUse() + -dynamic _onClickPrivacyPolicy() - - - - + + + + - - - IStudyAppBarViewModel + + + AuthScaffold - - - +isSyncIndicatorVisible: bool - +isStatusBadgeVisible: bool - +isPublishVisible: bool + + + +body: Widget + +formKey: AuthFormKey + +leftContentMinWidth: double + +leftPanelMinWidth: double + +leftPanelPadding: EdgeInsets - - - - + + + - - - IStudyStatusBadgeViewModel + + + Widget - - - +studyParticipation: Participation? - +studyStatus: StudyStatus? + + + + + + + + EdgeInsets - - - - + + + + - - - IStudyNavViewModel + + + EmailTextField - - - +isEditTabEnabled: bool - +isTestTabEnabled: bool - +isRecruitTabEnabled: bool - +isMonitorTabEnabled: bool - +isAnalyzeTabEnabled: bool - +isSettingsEnabled: bool + + + +labelText: String + +hintText: String? + +formControlName: String? + +formControl: FormControl<dynamic>? - - - - + + + - - - StudyScaffold + + + FormControl - - - +studyId: String - +tabs: List<NavbarTab>? - +tabsSubnav: List<NavbarTab>? - +selectedTab: NavbarTab? - +selectedTabSubnav: NavbarTab? - +body: StudyPageWidget - +drawer: Widget? - +disableActions: bool - +actionsSpacing: double - +actionsPadding: double - +layoutType: SingleColumnLayoutType? - +appbarHeight: double - +appbarSubnavHeight: double + + + + + + + + + PasswordTextField + + + + + + +labelText: String + +hintText: String? + +onSubmitted: dynamic Function(FormControl<dynamic>)? + +formControlName: String? + +formControl: FormControl<dynamic>? - - - + + + - - - NavbarTab + + + dynamic Function(FormControl<dynamic>)? - - - - - + + + + - - - StudyPageWidget + + + StudyUJobsToBeDone - - - +studyId: String + + + +Widget build() - - - +Widget? banner() + + + + + + + + + + AuthFormController - - - - + + + +authRepository: IAuthRepository + +notificationService: INotificationService + +router: GoRouter + +emailControl: FormControl<String> + +passwordControl: FormControl<String> + +passwordConfirmationControl: FormControl<String> + +termsOfServiceControl: FormControl<bool> + <static>+authValidationMessages: Map<String, String Function(dynamic)> + +loginForm: FormGroup + +signupForm: FormGroup + +passwordForgotForm: FormGroup + +passwordRecoveryForm: FormGroup + +controlValidatorsByForm: Map<AuthFormKey, Map<FormControl<dynamic>, List<Validator<dynamic>>>> + -_formKey: AuthFormKey + +formKey: AuthFormKey + +form: FormGroup + + - - - SingleColumnLayoutType + + + -dynamic _getFormFor() + -dynamic _onChangeFormKey() + +dynamic resetControlsFor() + -dynamic _forceValidationMessages() + +dynamic signUp() + -dynamic _signUp() + +dynamic signIn() + -dynamic _signInWith() + +dynamic signOut() + +dynamic resetPasswordForEmail() + +dynamic sendPasswordResetLink() + +dynamic recoverPassword() + +dynamic updateUser() + -dynamic _readDebugUser() - - - - + + + - - - PreviewFrame + + + IAuthRepository - - - +studyId: String - +routeArgs: StudyFormRouteArgs? - +route: String? + + + + + + + + INotificationService - - - + + + - - - StudyFormRouteArgs + + + GoRouter - - - - - + + + - - - RouteInformation + + + FormGroup - - - +route: String? - +extra: String? - +cmd: String? - +data: String? + + + + + + + + + IFormGroupController - - - +String toString() + + + +form: FormGroup - - - - - + + + - - - PlatformController + + + Enum - - - +studyId: String - +baseSrc: String - +previewSrc: String - +routeInformation: RouteInformation - +frameWidget: Widget + + + + + + + + + AppStatus - - - +void activate() - +void registerViews() - +void generateUrl() - +void navigate() - +void refresh() - +void listen() - +void send() - +void openNewPage() + + + +index: int + <static>+values: List<AppStatus> + <static>+initializing: AppStatus + <static>+initialized: AppStatus - - - - - + + + + + - - - WebController + + + FormArrayTable - - - +iFrameElement: IFrameElement + + + +control: AbstractControl<dynamic> + +items: List<T> + +onSelectItem: void Function(T) + +getActionsAt: List<ModelAction<dynamic>> Function(T, int) + +onNewItem: void Function()? + +rowTitle: String Function(T) + +onNewItemLabel: String + +sectionTitle: String? + +sectionDescription: String? + +emptyIcon: IconData? + +emptyTitle: String? + +emptyDescription: String? + +sectionTitleDivider: bool? + +rowPrefix: Widget Function(BuildContext, T, int)? + +rowSuffix: Widget Function(BuildContext, T, int)? + +leadingWidget: Widget? + +itemsSectionPadding: EdgeInsets? + +hideLeadingTrailingWhenEmpty: bool + <static>+columns: List<StandardTableColumn> - - - +void activate() - +void registerViews() - +void generateUrl() - +void navigate() - +void refresh() - +void openNewPage() - +void listen() - +void send() + + + +Widget build() + -List<Widget> _buildRow() + -Widget _newItemButton() - - - + + + - - - IFrameElement + + + AbstractControl - - - - - - - - MobileController - - + + + - - - +void openNewPage() - +void refresh() - +void registerViews() - +void listen() - +void send() - +void navigate() - +void activate() - +void generateUrl() + + + void Function(T) - - - - - + + + - - - StudyParticipationBadge + + + List<ModelAction<dynamic>> Function(T, int) - - - +participation: Participation - +type: BadgeType - +showPrefixIcon: bool - +center: bool - - + + + + - - - +Widget build() + + + void Function()? - - - + + + - - - Participation + + + String Function(T) - - - + + + - - - BadgeType + + + IconData - - - - - + + + - - - StudyTestScreen + + + Widget Function(BuildContext, T, int)? - - - +previewRoute: String? + + + + + + + + + ManagedFormViewModel - - - +Widget build() - +Widget? banner() - +dynamic load() - +dynamic save() - +dynamic showHelp() + + + +ManagedFormViewModel<T> createDuplicate() - - - - - - - - TestAppRoutes - - + + + + + - - - <static>+studyOverview: String - <static>+eligibility: String - <static>+intervention: String - <static>+consent: String - <static>+journey: String - <static>+dashboard: String + + + FormViewModel - - - - - - - - - StudyNav + + + -_formData: T? + -_formMode: FormMode + -_validationSet: FormValidationSetEnum? + +delegate: IFormViewModelDelegate<FormViewModel<dynamic>>? + +autosave: bool + -_immediateFormChildrenSubscriptions: List<StreamSubscription<dynamic>> + -_immediateFormChildrenListenerDebouncer: Debouncer? + -_autosaveOperation: CancelableOperation<dynamic>? + -_defaultControlValidators: Map<String, Tuple<List<Validator<dynamic>>, List<AsyncValidator<dynamic>>>> + +prevFormValue: Map<String, dynamic>? + <static>-_formKey: String + +formData: T? + +formMode: FormMode + +isReadonly: bool + +validationSet: FormValidationSetEnum? + +isDirty: bool + +title: String + +isValid: bool + +titles: Map<FormMode, String> + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - - - <static>+dynamic tabs() - <static>+dynamic edit() - <static>+dynamic test() - <static>+dynamic recruit() - <static>+dynamic monitor() - <static>+dynamic analyze() + + + -dynamic _setFormData() + -dynamic _rememberDefaultControlValidators() + -Tuple<List<Validator<dynamic>>, List<AsyncValidator<dynamic>>>? _getDefaultValidators() + -dynamic _disableAllControls() + -dynamic _formModeUpdated() + -dynamic _restoreControlsFromFormData() + +void revalidate() + -void _applyValidationSet() + +void read() + +dynamic save() + +dynamic cancel() + +void enableAutosave() + +void listenToImmediateFormChildren() + +dynamic markFormGroupChanged() + +void dispose() + +void setControlsFrom() + +T buildFormData() + +void initControls() - - - - + + + - - - StudyDesignNav + + + FormViewModelNotFoundException - - - <static>+dynamic tabs() - <static>+dynamic info() - <static>+dynamic enrollment() - <static>+dynamic interventions() - <static>+dynamic measurements() - <static>+dynamic reports() + + + + + + + + Exception - - - - + + + + + - - - StudyTestController + + + FormViewModelCollection - - - +authRepository: IAuthRepository - +languageCode: String + + + +formViewModels: List<T> + +formArray: FormArray<dynamic> + +stagedViewModels: List<T> + +retrievableViewModels: List<T> + +formData: List<D> - - - - - - - - IAuthRepository + + + +void add() + +T remove() + +T? findWhere() + +T? removeWhere() + +bool contains() + +void stage() + +T commit() + +void reset() + +void read() - - - + + + - - - StudyStatus + + + FormArray - - - - - + + + + + - - - StudyStatusBadge + + + CustomFormControl - - - +participation: Participation? - +status: StudyStatus? - +type: BadgeType - +showPrefixIcon: bool - +showTooltip: bool + + + -_onValueChangedDebouncer: Debouncer? + -_onStatusChangedDebouncer: Debouncer? + +onValueChanged: void Function(T?)? + +onStatusChanged: void Function(ControlStatus)? + +onStatusChangedDebounceTime: int? + +onValueChangedDebounceTime: int? - - - +Widget build() + + + +void dispose() - - - - - + + + - - - FrameControlsWidget + + + Debouncer - - - +onRefresh: void Function()? - +onOpenNewTab: void Function()? - +enabled: bool + + + + + + + + void Function(T?)? - - - +Widget build() + + + + + + + + void Function(ControlStatus)? - - - + + + + - - - void Function()? + + + UnsavedChangesDialog + + + + + + +Widget build() - - - + + + - - - ConsumerWidget + + + FormValidationSetEnum - - - - + + + + + - - - StudySettingsDialog + + + FormControlValidation - - - +Widget build() + + + +control: AbstractControl<dynamic> + +validators: List<Validator<dynamic>> + +asyncValidators: List<AsyncValidator<dynamic>>? + +validationMessages: Map<String, String Function(Object)> + + + + + + +FormControlValidation merge() - - - - - + + + + + - - - StudySettingsFormViewModel + + + IFormData - - - +study: AsyncValue<Study> - +studyRepository: IStudyRepository - <static>+defaultPublishedToRegistry: bool - <static>+defaultPublishedToRegistryResults: bool - +isPublishedToRegistryControl: FormControl<bool> - +isPublishedToRegistryResultsControl: FormControl<bool> - +form: FormGroup - +titles: Map<FormMode, String> + + + +id: String - - - +void setControlsFrom() - +Study buildFormData() - +dynamic keepControlsSynced() - +dynamic save() - +dynamic setLaunchDefaults() + + + +IFormData copy() - - - + + + - - - AsyncValue + + + FormInvalidException - - - + + + + - - - IStudyRepository + + + FormConfigException - - - - - - - - FormControl + + + +message: String? - - - + + + + - - - FormGroup + + + IFormViewModelDelegate + + + + + + +dynamic onSave() + +void onCancel() - - - - - + + + + - - - FormViewModel + + + FormControlOption - - - -_formData: T? - -_formMode: FormMode - -_validationSet: FormValidationSetEnum? - +delegate: IFormViewModelDelegate<FormViewModel<dynamic>>? - +autosave: bool - -_immediateFormChildrenSubscriptions: List<StreamSubscription<dynamic>> - -_immediateFormChildrenListenerDebouncer: Debouncer? - -_autosaveOperation: CancelableOperation<dynamic>? - -_defaultControlValidators: Map<String, Tuple<List<Validator<dynamic>>, List<AsyncValidator<dynamic>>>> - +prevFormValue: Map<String, dynamic>? - <static>-_formKey: String - +formData: T? - +formMode: FormMode - +isReadonly: bool - +validationSet: FormValidationSetEnum? - +isDirty: bool - +title: String - +isValid: bool - +titles: Map<FormMode, String> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + + + +value: T + +label: String + +description: String? + +props: List<Object?> - - - -dynamic _setFormData() - -dynamic _rememberDefaultControlValidators() - -Tuple<List<Validator<dynamic>>, List<AsyncValidator<dynamic>>>? _getDefaultValidators() - -dynamic _disableAllControls() - -dynamic _formModeUpdated() - -dynamic _restoreControlsFromFormData() - +void revalidate() - -void _applyValidationSet() - +void read() - +dynamic save() - +dynamic cancel() - +void enableAutosave() - +void listenToImmediateFormChildren() - +dynamic markFormGroupChanged() - +void dispose() - +void setControlsFrom() - +T buildFormData() - +void initControls() + + + + + + + + Equatable - - - + + + + - - - GoRouter + + + FormMode + + + + + + +index: int + <static>+values: List<FormMode> + <static>+create: FormMode + <static>+readonly: FormMode + <static>+edit: FormMode - - - + + + - - - IWithBanner + + + CancelableOperation - - - - + + + + + - - - AppStatus + + + EnrolledBadge - - - +index: int - <static>+values: List<AppStatus> - <static>+initializing: AppStatus - <static>+initialized: AppStatus + + + +enrolledCount: int + + + + + + +Widget build() - - - + + + + + - - - Enum + + + StudyRecruitController + + + + + + +inviteCodeRepository: IInviteCodeRepository + -_invitesSubscription: StreamSubscription<List<WrappedModel<StudyInvite>>>? + + + + + + -dynamic _subscribeInvites() + +Intervention? getIntervention() + +int getParticipantCountForInvite() + +List<ModelAction<dynamic>> availableActions() + +List<ModelAction<dynamic>> availableInlineActions() + +void dispose() - - - - + + + - - - IAppDelegate + + + IInviteCodeRepository - - - +dynamic onAppStart() + + + + + + + + StreamSubscription - - - - - + + + + + - - - AppController + + + StudyBaseController - - - +appDelegates: List<IAppDelegate> - -_delayedFuture: dynamic - +isInitialized: dynamic + + + +studyId: String + +studyRepository: IStudyRepository + +router: GoRouter + +studySubscription: StreamSubscription<WrappedModel<Study>>? - - - +dynamic onAppStart() - -dynamic _callDelegates() + + + +dynamic subscribeStudy() + +dynamic onStudySubscriptionUpdate() + +dynamic onStudySubscriptionError() + +void dispose() - - - + + + - - - App + + + IModelActionProvider - - - + + + + - - - AppContent + + + StudyRecruitScreen + + + + + + +Widget build() + -Widget _inviteCodesSectionHeader() + -Widget _newInviteCodeButton() + -dynamic _onSelectInvite() - - - - - + + + + + - - - AuthFormController + + + InviteCodeFormView - - - +authRepository: IAuthRepository - +notificationService: INotificationService - +router: GoRouter - +emailControl: FormControl<String> - +passwordControl: FormControl<String> - +passwordConfirmationControl: FormControl<String> - +termsOfServiceControl: FormControl<bool> - <static>+authValidationMessages: Map<String, String Function(dynamic)> - +loginForm: FormGroup - +signupForm: FormGroup - +passwordForgotForm: FormGroup - +passwordRecoveryForm: FormGroup - +controlValidatorsByForm: Map<AuthFormKey, Map<FormControl<dynamic>, List<Validator<dynamic>>>> - -_formKey: AuthFormKey - +formKey: AuthFormKey - +form: FormGroup + + + +formViewModel: InviteCodeFormViewModel - - - -dynamic _getFormFor() - -dynamic _onChangeFormKey() - +dynamic resetControlsFor() - -dynamic _forceValidationMessages() - +dynamic signUp() - -dynamic _signUp() - +dynamic signIn() - -dynamic _signInWith() - +dynamic signOut() - +dynamic resetPasswordForEmail() - +dynamic sendPasswordResetLink() - +dynamic recoverPassword() - +dynamic updateUser() - -dynamic _readDebugUser() + + + +Widget build() + -List<FormTableRow> _conditionalInterventionRows() - - - - + + + + + - - - AuthFormKey + + + InviteCodeFormViewModel - - - +index: int - <static>+values: List<AuthFormKey> - <static>+login: AuthFormKey - <static>+signup: AuthFormKey - <static>+passwordForgot: AuthFormKey - <static>+passwordRecovery: AuthFormKey - <static>-_loginSubmit: AuthFormKey - <static>-_signupSubmit: AuthFormKey + + + +study: Study + +inviteCodeRepository: IInviteCodeRepository + +codeControl: FormControl<String> + +codeControlValidationMessages: Map<String, String Function(dynamic)> + +isPreconfiguredScheduleControl: FormControl<bool> + +preconfiguredScheduleTypeControl: FormControl<PhaseSequence> + +interventionAControl: FormControl<String> + +interventionBControl: FormControl<String> + +form: FormGroup + +titles: Map<FormMode, String> + +interventionControlOptions: List<FormControlOption<String>> + +preconfiguredScheduleTypeOptions: List<FormControlOption<PhaseSequence>> + +isPreconfiguredSchedule: bool + +preconfiguredSchedule: List<String>? - - - - - - - - - IFormGroupController + + + +void initControls() + -dynamic _uniqueInviteCode() + +void regenerateCode() + -String _generateCode() + +StudyInvite buildFormData() + +void setControlsFrom() + +dynamic save() - - - +form: FormGroup + + + + + + + + FormConsumerWidget - - - - - + + + + + - - - PasswordRecoveryForm + + + StudyInvitesTable + + + + + + +invites: List<StudyInvite> + +onSelect: void Function(StudyInvite) + +getActions: List<ModelAction<dynamic>> Function(StudyInvite) + +getInlineActions: List<ModelAction<dynamic>> Function(StudyInvite) + +getIntervention: Intervention? Function(String) + +getParticipantCountForInvite: int Function(StudyInvite) - - - +formKey: AuthFormKey + + + +Widget build() + -List<Widget> _buildRow() - - - +Widget build() + + + + + + + + void Function(StudyInvite) - - - + + + - - - FormConsumerRefWidget + + + List<ModelAction<dynamic>> Function(StudyInvite) - - - - - + + + - - - PasswordForgotForm + + + Intervention? Function(String) - - - +formKey: AuthFormKey - - + + + + - - - +Widget build() + + + int Function(StudyInvite) - - - - - + + + - - - LoginForm + + + Study - - - +formKey: AuthFormKey + + + + + + + + + PublishSuccessDialog - - - +Widget build() + + + +Widget build() - - - - + + + + - - - EmailTextField + + + PublishDialog - - - +labelText: String - +hintText: String? - +formControlName: String? - +formControl: FormControl<dynamic>? + + + +Widget build() - - - - + + + + - - - PasswordTextField + + + PublishConfirmationDialog - - - +labelText: String - +hintText: String? - +onSubmitted: dynamic Function(FormControl<dynamic>)? - +formControlName: String? - +formControl: FormControl<dynamic>? + + + +Widget build() - - - + + + + + - - - dynamic Function(FormControl<dynamic>)? + + + FrameControlsWidget - - - - - - - - - - SignupForm + + + +onRefresh: void Function()? + +onOpenNewTab: void Function()? + +enabled: bool - - - +formKey: AuthFormKey + + + +Widget build() - - - +Widget build() - -dynamic _onClickTermsOfUse() - -dynamic _onClickPrivacyPolicy() + + + + + + + + ConsumerWidget - - - - + + + + - - - StudyUJobsToBeDone + + + IStudyStatusBadgeViewModel - - - +Widget build() + + + +studyParticipation: Participation? + +studyStatus: StudyStatus? - - - - + + + - - - AuthScaffold + + + Participation - - - +body: Widget - +formKey: AuthFormKey - +leftContentMinWidth: double - +leftPanelMinWidth: double - +leftPanelPadding: EdgeInsets + + + + + + + + StudyStatus - - - + + + + + - - - EdgeInsets + + + StudyStatusBadge - - - - - - - - - PublishDialog + + + +participation: Participation? + +status: StudyStatus? + +type: BadgeType + +showPrefixIcon: bool + +showTooltip: bool - - - +Widget build() + + + +Widget build() - - - - + + + - - - PublishSuccessDialog + + + BadgeType - - - +Widget build() + + + + + + + + + + RouteInformation - - - - - - - - - PublishConfirmationDialog + + + +route: String? + +extra: String? + +cmd: String? + +data: String? - - - +Widget build() + + + +String toString() - - - - - + + + + + - - - FormArrayTable + + + PlatformController - - - +control: AbstractControl<dynamic> - +items: List<T> - +onSelectItem: void Function(T) - +getActionsAt: List<ModelAction<dynamic>> Function(T, int) - +onNewItem: void Function()? - +rowTitle: String Function(T) - +onNewItemLabel: String - +sectionTitle: String? - +sectionDescription: String? - +emptyIcon: IconData? - +emptyTitle: String? - +emptyDescription: String? - +sectionTitleDivider: bool? - +rowPrefix: Widget Function(BuildContext, T, int)? - +rowSuffix: Widget Function(BuildContext, T, int)? - +leadingWidget: Widget? - +itemsSectionPadding: EdgeInsets? - +hideLeadingTrailingWhenEmpty: bool - <static>+columns: List<StandardTableColumn> + + + +studyId: String + +baseSrc: String + +previewSrc: String + +routeInformation: RouteInformation + +frameWidget: Widget - - - +Widget build() - -List<Widget> _buildRow() - -Widget _newItemButton() + + + +void activate() + +void registerViews() + +void generateUrl() + +void navigate() + +void refresh() + +void listen() + +void send() + +void openNewPage() - - - + + + + + - - - AbstractControl + + + WebController - - - - - - - - void Function(T) + + + +iFrameElement: IFrameElement - - - - - - - - List<ModelAction<dynamic>> Function(T, int) + + + +void activate() + +void registerViews() + +void generateUrl() + +void navigate() + +void refresh() + +void openNewPage() + +void listen() + +void send() - - - + + + - - - String Function(T) + + + IFrameElement - - - + + + + - - - IconData + + + MobileController - - - - - - - - Widget Function(BuildContext, T, int)? + + + +void openNewPage() + +void refresh() + +void registerViews() + +void listen() + +void send() + +void navigate() + +void activate() + +void generateUrl() - - - - - + + + + + - - - IFormData + + + StudyController - - - +id: String + + + +notificationService: INotificationService + +studyEventsSubscription: StreamSubscription<ModelEvent<Study>>? + +studyActions: List<ModelAction<dynamic>> - - - +IFormData copy() + + + +dynamic syncStudyStatus() + +dynamic onStudySubscriptionUpdate() + -dynamic _redirectNewToActualStudyID() + +dynamic publishStudy() + +void onChangeStudyParticipation() + +void onAddParticipants() + +void onSettingsPressed() + +void dispose() - - - - + + + + - - - ManagedFormViewModel + + + IStudyNavViewModel - - - +ManagedFormViewModel<T> createDuplicate() + + + +isEditTabEnabled: bool + +isTestTabEnabled: bool + +isRecruitTabEnabled: bool + +isMonitorTabEnabled: bool + +isAnalyzeTabEnabled: bool + +isSettingsEnabled: bool - - - + + + + - - - FormViewModelNotFoundException + + + StudyNav - - - - - - - - Exception + + + <static>+dynamic tabs() + <static>+dynamic edit() + <static>+dynamic test() + <static>+dynamic recruit() + <static>+dynamic monitor() + <static>+dynamic analyze() - - - - - - - - - FormViewModelCollection - - + + + + - - - +formViewModels: List<T> - +formArray: FormArray<dynamic> - +stagedViewModels: List<T> - +retrievableViewModels: List<T> - +formData: List<D> + + + StudyDesignNav - - - +void add() - +T remove() - +T? findWhere() - +T? removeWhere() - +bool contains() - +void stage() - +T commit() - +void reset() - +void read() + + + <static>+dynamic tabs() + <static>+dynamic info() + <static>+dynamic enrollment() + <static>+dynamic interventions() + <static>+dynamic measurements() + <static>+dynamic reports() - - - + + + - - - FormArray + + + IWithBanner - - - + + + + + - - - FormInvalidException + + + StudyParticipationBadge - - - - - - - - - FormConfigException + + + +participation: Participation + +type: BadgeType + +showPrefixIcon: bool + +center: bool - - - +message: String? + + + +Widget build() - - - - - - - - IFormViewModelDelegate - - + + + - - - +dynamic onSave() - +void onCancel() + + + IStudyRepository - - - - + + + + - - - FormControlOption + + + PreviewFrame - - - +value: T - +label: String - +description: String? - +props: List<Object?> + + + +studyId: String + +routeArgs: StudyFormRouteArgs? + +route: String? - - - + + + - - - Equatable + + + StudyFormRouteArgs - - - - + + + + - - - FormMode + + + IStudyAppBarViewModel - - - +index: int - <static>+values: List<FormMode> - <static>+create: FormMode - <static>+readonly: FormMode - <static>+edit: FormMode + + + +isSyncIndicatorVisible: bool + +isStatusBadgeVisible: bool + +isPublishVisible: bool - - - + + + + + + + + StudyScaffold + + - - - FormValidationSetEnum + + + +studyId: String + +tabs: List<NavbarTab>? + +tabsSubnav: List<NavbarTab>? + +selectedTab: NavbarTab? + +selectedTabSubnav: NavbarTab? + +body: StudyPageWidget + +drawer: Widget? + +disableActions: bool + +actionsSpacing: double + +actionsPadding: double + +layoutType: SingleColumnLayoutType? + +appbarHeight: double + +appbarSubnavHeight: double - - - + + + - - - Debouncer + + + NavbarTab - - - + + + - - - CancelableOperation + + + SingleColumnLayoutType - - - - - + + + + + - - - CustomFormControl + + + WebFrame - - - -_onValueChangedDebouncer: Debouncer? - -_onStatusChangedDebouncer: Debouncer? - +onValueChanged: void Function(T?)? - +onStatusChanged: void Function(ControlStatus)? - +onStatusChangedDebounceTime: int? - +onValueChangedDebounceTime: int? + + + +previewSrc: String + +studyId: String - - - +void dispose() + + + +Widget build() - - - + + + + - - - void Function(T?)? + + + DisabledFrame - - - - - - - - void Function(ControlStatus)? + + + +Widget build() - - - - + + + + + - - - UnsavedChangesDialog + + + PhoneContainer - - - +Widget build() + + + <static>+defaultWidth: double + <static>+defaultHeight: double + +width: double + +height: double + +borderColor: Color + +borderWidth: double + +borderRadius: double + +innerContent: Widget + +innerContentBackgroundColor: Color? + + + + + + +Widget build() - - - - - + + + - - - FormControlValidation + + + Color - - - +control: AbstractControl<dynamic> - +validators: List<Validator<dynamic>> - +asyncValidators: List<AsyncValidator<dynamic>>? - +validationMessages: Map<String, String Function(Object)> + + + + + + + + + MobileFrame - - - +FormControlValidation merge() + + + +Widget build() - - - - - - - - - ScreenerQuestionFormViewModel - - + + + + - - - <static>+defaultResponseOptionValidity: bool - +responseOptionsDisabledArray: FormArray<dynamic> - +responseOptionsLogicControls: FormArray<bool> - +responseOptionsLogicDescriptionControls: FormArray<String> - -_questionBaseControls: Map<String, AbstractControl<dynamic>> - +prevResponseOptionControls: List<AbstractControl<dynamic>> - +prevResponseOptionValues: List<dynamic> - +responseOptionsDisabledControls: List<AbstractControl<dynamic>> - +logicControlOptions: List<FormControlOption<bool>> - +questionBaseControls: Map<String, AbstractControl<dynamic>> - +isDirtyOptionsBannerVisible: bool + + + DesktopFrame - - - +dynamic onResponseOptionsChanged() - +void setControlsFrom() - +QuestionFormData buildFormData() - -List<FormControl<dynamic>> _copyFormControls() - -AbstractControl<dynamic>? _findAssociatedLogicControlFor() - -AbstractControl<dynamic>? _findAssociatedControlFor() - +ScreenerQuestionFormViewModel createDuplicate() + + + +Widget build() - - - - - + + + + + - - - QuestionFormViewModel + + + StudyTestScreen - - - <static>+defaultQuestionType: SurveyQuestionType - -_titles: Map<FormMode, String Function()>? - +questionIdControl: FormControl<String> - +questionTypeControl: FormControl<SurveyQuestionType> - +questionTextControl: FormControl<String> - +questionInfoTextControl: FormControl<String> - +questionBaseControls: Map<String, AbstractControl<dynamic>> - +isMultipleChoiceControl: FormControl<bool> - +choiceResponseOptionsArray: FormArray<dynamic> - +customOptionsMin: int - +customOptionsMax: int - +customOptionsInitial: int - +boolResponseOptionsArray: FormArray<String> - +imageResponseOptionsArray: FormArray<String> - <static>+kDefaultMaxRecordingDurationSeconds: int - <static>+kMaxRecordingDurationSeconds: int - +audioResponseOptionsArray: FormArray<String> - +maxRecordingDurationSecondsControl: FormControl<int> - <static>+kDefaultScaleMinValue: int - <static>+kDefaultScaleMaxValue: int - <static>+kNumMidValueControls: int - <static>+kMidValueDebounceMilliseconds: int - +scaleMinValueControl: FormControl<int> - +scaleMaxValueControl: FormControl<int> - -_scaleRangeControl: FormControl<int> - +scaleMinLabelControl: FormControl<String> - +scaleMaxLabelControl: FormControl<String> - +scaleMidValueControls: FormArray<int> - +scaleMidLabelControls: FormArray<String?> - -_scaleResponseOptionsArray: FormArray<int> - +scaleMinColorControl: FormControl<SerializableColor> - +scaleMaxColorControl: FormControl<SerializableColor> - +prevMidValues: List<int?>? - +freeTextTypeControl: FormControl<FreeTextQuestionType> - +customRegexControl: FormControl<String> - +freeTextResponseOptionsArray: FormArray<dynamic> - +freeTextLengthMin: AbstractControl<int> - +freeTextLengthMax: AbstractControl<int> - +freeTextExampleTextControl: FormControl<String> - <static>+kDefaultFreeTextMinLength: int - <static>+kDefaultFreeTextMaxLength: int - +freeTextLengthControl: FormControl<RangeValues> - -_controlsByQuestionType: Map<SurveyQuestionType, FormGroup> - -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - -_validationConfigsByQuestionType: Map<SurveyQuestionType, Map<FormValidationSetEnum, List<FormControlValidation>>> - +form: FormGroup - +questionId: String - +questionType: SurveyQuestionType - +questionTypeControlOptions: List<FormControlOption<SurveyQuestionType>> - +answerOptionsArray: FormArray<dynamic> - +answerOptionsControls: List<AbstractControl<dynamic>> - +validAnswerOptions: List<String> - +boolOptions: List<AbstractControl<String>> - +imageOptions: List<AbstractControl<String>> - +audioOptions: List<AbstractControl<String>> - +scaleMinValue: int - +scaleMaxValue: int - +scaleRange: int - +scaleAllValueControls: List<AbstractControl<int>> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +questionTextRequired: dynamic - +numValidChoiceOptions: dynamic - +scaleRangeValid: dynamic - +maxRecordingDurationValid: dynamic - +titles: Map<FormMode, String> - +isAddOptionButtonVisible: bool - +isMidValuesClearedInfoVisible: bool + + + +previewRoute: String? - - - +String? scaleMidLabelAt() - -dynamic _onScaleRangeChanged() - -dynamic _applyInputFormatters() - -dynamic _updateScaleMidValueControls() - -Map<String, dynamic>? _validateFreeText() - -dynamic _onFreeTextLengthChanged() - -List<FormControlValidation> _getValidationConfig() - +dynamic onQuestionTypeChanged() - +dynamic onResponseOptionsChanged() - -void _updateFormControls() - +void initControls() - +void setControlsFrom() - +QuestionFormData buildFormData() - +List<ModelAction<dynamic>> availableActions() - +void onNewItem() - +void onSelectItem() - +dynamic save() - +QuestionFormViewModel createDuplicate() + + + +Widget build() + +Widget? banner() + +dynamic load() + +dynamic save() + +dynamic showHelp() - - - - + + + + + - - - IScreenerQuestionLogicFormViewModel + + + StudySettingsFormViewModel - - - +isDirtyOptionsBannerVisible: bool + + + +study: AsyncValue<Study> + +studyRepository: IStudyRepository + <static>+defaultPublishedToRegistry: bool + <static>+defaultPublishedToRegistryResults: bool + +isPublishedToRegistryControl: FormControl<bool> + +isPublishedToRegistryResultsControl: FormControl<bool> + +form: FormGroup + +titles: Map<FormMode, String> - - - - - - - - - StudyDesignEnrollmentFormView + + + +void setControlsFrom() + +Study buildFormData() + +dynamic keepControlsSynced() + +dynamic save() + +dynamic setLaunchDefaults() - - - +Widget build() - -dynamic _showScreenerQuestionSidesheetWithArgs() - -dynamic _showConsentItemSidesheetWithArgs() + + + + + + + + AsyncValue - - - - + + + + - - - StudyDesignPageWidget + + + StudySettingsDialog - - - +Widget? banner() + + + +Widget build() - - - - - + + + + - - - ScreenerQuestionLogicFormView + + + StudyTestController - - - +formViewModel: ScreenerQuestionFormViewModel + + + +authRepository: IAuthRepository + +languageCode: String - - - +Widget build() - -dynamic _buildInfoBanner() - -dynamic _buildAnswerOptionsLogicControls() - -List<Widget> _buildOptionLogicRow() + + + + + + + + + TestAppRoutes - - - - - - - - FormConsumerWidget + + + <static>+studyOverview: String + <static>+eligibility: String + <static>+intervention: String + <static>+consent: String + <static>+journey: String + <static>+dashboard: String - - - - - + + + + + - - - ConsentItemFormData + + + DrawerEntry - - - +consentId: String - +title: String - +description: String - +iconName: String? - +id: String + + + +localizedTitle: String Function() + +icon: IconData? + +localizedHelpText: String Function()? + +enabled: bool + +onSelected: void Function(BuildContext, WidgetRef)? + +autoCloseDrawer: bool + +title: String + +helpText: String? - - - +ConsentItem toConsentItem() - +ConsentItemFormData copy() + + + +void onClick() - - - - - + + + - - - EnrollmentFormViewModel + + + String Function() - - - +study: Study - +router: GoRouter - +consentItemDelegate: EnrollmentFormConsentItemDelegate - +enrollmentTypeControl: FormControl<Participation> - +consentItemArray: FormArray<dynamic> - +consentItemFormViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData> - +form: FormGroup - +enrollmentTypeControlOptions: List<FormControlOption<Participation>> - +consentItemModels: List<ConsentItemFormViewModel> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titles: Map<FormMode, String> - +canTestScreener: bool - +canTestConsent: bool - +questionTitles: Map<FormMode, String Function()> - - + + + + - - - +void setControlsFrom() - +EnrollmentFormData buildFormData() - +void read() - +List<ModelAction<dynamic>> availableActions() - +List<ModelAction<dynamic>> availablePopupActions() - +List<ModelAction<dynamic>> availableInlineActions() - +void onSelectItem() - +void onNewItem() - +ScreenerQuestionFormRouteArgs buildNewScreenerQuestionFormRouteArgs() - +ScreenerQuestionFormRouteArgs buildScreenerQuestionFormRouteArgs() - +ConsentItemFormRouteArgs buildNewConsentItemFormRouteArgs() - +ConsentItemFormRouteArgs buildConsentItemFormRouteArgs() - +dynamic testScreener() - +dynamic testConsent() - +ScreenerQuestionFormViewModel provideQuestionFormViewModel() + + + String Function()? - - - + + + - - - Study + + + void Function(BuildContext, WidgetRef)? - - - - - + + + + + - - - EnrollmentFormConsentItemDelegate + + + GoRouterDrawerEntry - - - +formViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData> - +owner: EnrollmentFormViewModel - +propagateOnSave: bool - +validationSet: dynamic + + + +intent: RoutingIntent + +onNavigated: void Function()? - - - +void onCancel() - +dynamic onSave() - +ConsentItemFormViewModel provide() - +List<ModelAction<dynamic>> availableActions() - +void onNewItem() - +void onSelectItem() + + + +void onClick() - - - - - + + + - - - WithQuestionnaireControls + + + RoutingIntent - - - +questionsArray: FormArray<dynamic> - +questionFormViewModels: FormViewModelCollection<Q, QuestionFormData> - +questionnaireControls: Map<String, FormArray<dynamic>> - +propagateOnSave: bool - +questionModels: List<Q> - +questionTitles: Map<FormMode, String Function()> - - + + + + + - - - +void setQuestionnaireControlsFrom() - +QuestionnaireFormData buildQuestionnaireFormData() - +void read() - +void onCancel() - +dynamic onSave() - +Q provide() - +Q provideQuestionFormViewModel() + + + AppDrawer - - - - - - - - IListActionProvider + + + +width: int + +autoCloseDrawer: bool + +leftPaddingEntries: double + +logoPaddingVertical: double + +logoPaddingHorizontal: double + +logoMaxHeight: double + +logoSectionMinHeight: double + +logoSectionMaxHeight: double - - - + + + + - - - IProviderArgsResolver + + + StudyAnalyzeScreen - - - - - - - - - - ConsentItemFormViewModel + + + +Widget? banner() + +Widget build() - - - +consentIdControl: FormControl<String> - +titleControl: FormControl<String> - +descriptionControl: FormControl<String> - +iconControl: FormControl<IconOption> - +form: FormGroup - +consentId: String - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titleRequired: dynamic - +descriptionRequired: dynamic - +titles: Map<FormMode, String> + + + + + + + + + StudyAnalyzeController - - - +void setControlsFrom() - +ConsentItemFormData buildFormData() - +ConsentItemFormViewModel createDuplicate() + + + +dynamic onExport() - - - - + + + + - - - ConsentItemFormView + + + StudyDesignInterventionsFormView - - - +formViewModel: ConsentItemFormViewModel + + + +Widget build() - - - - - + + + + - - - EnrollmentFormData + + + StudyDesignPageWidget - - - <static>+kDefaultEnrollmentType: Participation - +enrollmentType: Participation - +questionnaireFormData: QuestionnaireFormData - +consentItemsFormData: List<ConsentItemFormData>? - +id: String + + + +Widget? banner() - - - +Study apply() - +EnrollmentFormData copy() + + + + + + + + + InterventionFormView + + + + + + +formViewModel: InterventionFormViewModel - - - - - + + + + + - - - QuestionnaireFormData + + + InterventionFormViewModel - - - +questionsData: List<QuestionFormData>? - +id: String + + + +study: Study + +interventionIdControl: FormControl<String> + +interventionTitleControl: FormControl<String> + +interventionIconControl: FormControl<IconOption> + +interventionDescriptionControl: FormControl<String> + +interventionTasksArray: FormArray<dynamic> + +tasksCollection: FormViewModelCollection<InterventionTaskFormViewModel, InterventionTaskFormData> + +form: FormGroup + +interventionId: String + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titleRequired: dynamic + +atLeastOneTask: dynamic + +breadcrumbsTitle: String + +titles: Map<FormMode, String> - - - +StudyUQuestionnaire toQuestionnaire() - +List<EligibilityCriterion> toEligibilityCriteria() - +QuestionnaireFormData copy() + + + +void setControlsFrom() + +InterventionFormData buildFormData() + +List<ModelAction<dynamic>> availableActions() + +List<ModelAction<dynamic>> availablePopupActions() + +List<ModelAction<dynamic>> availableInlineActions() + +void onSelectItem() + +void onNewItem() + +void onCancel() + +dynamic onSave() + +InterventionTaskFormViewModel provide() + +InterventionTaskFormRouteArgs buildNewFormRouteArgs() + +InterventionTaskFormRouteArgs buildFormRouteArgs() + +InterventionFormViewModel createDuplicate() - - - - + + + + + - - - IStudyFormData + + + InterventionPreview - - - +Study apply() + + + +routeArgs: InterventionFormRouteArgs - - - - - - - - - StudyDesignInterventionsFormView + + + +Widget build() - - - +Widget build() + + + + + + + + InterventionFormRouteArgs - - - - - + + + + + - - - InterventionsFormViewModel + + + StudyScheduleFormView - - - +study: Study - +router: GoRouter - +interventionsArray: FormArray<dynamic> - +interventionsCollection: FormViewModelCollection<InterventionFormViewModel, InterventionFormData> - +form: FormGroup - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +interventionsRequired: dynamic - +titles: Map<FormMode, String> - +canTestStudySchedule: bool + + + +formViewModel: StudyScheduleControls - - - +void setControlsFrom() - +InterventionsFormData buildFormData() - +void read() - +List<ModelAction<dynamic>> availableActions() - +List<ModelAction<dynamic>> availablePopupActions() - +List<ModelAction<dynamic>> availableInlineActions() - +void onSelectItem() - +void onNewItem() - +InterventionFormViewModel provide() - +void onCancel() - +dynamic onSave() - +dynamic testStudySchedule() + + + -FormTableRow _renderCustomSequence() + +Widget build() - - - + + + - + StudyScheduleControls - + <static>+defaultScheduleType: PhaseSequence <static>+defaultScheduleTypeSequence: String @@ -6176,7 +6148,7 @@ - + +void setStudyScheduleControlsFrom() +StudyScheduleFormData buildStudyScheduleFormData() @@ -6185,69 +6157,19 @@ - - - - - - - - - InterventionFormViewModel - - - - - - +study: Study - +interventionIdControl: FormControl<String> - +interventionTitleControl: FormControl<String> - +interventionIconControl: FormControl<IconOption> - +interventionDescriptionControl: FormControl<String> - +interventionTasksArray: FormArray<dynamic> - +tasksCollection: FormViewModelCollection<InterventionTaskFormViewModel, InterventionTaskFormData> - +form: FormGroup - +interventionId: String - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titleRequired: dynamic - +atLeastOneTask: dynamic - +breadcrumbsTitle: String - +titles: Map<FormMode, String> - - - - - - +void setControlsFrom() - +InterventionFormData buildFormData() - +List<ModelAction<dynamic>> availableActions() - +List<ModelAction<dynamic>> availablePopupActions() - +List<ModelAction<dynamic>> availableInlineActions() - +void onSelectItem() - +void onNewItem() - +void onCancel() - +dynamic onSave() - +InterventionTaskFormViewModel provide() - +InterventionTaskFormRouteArgs buildNewFormRouteArgs() - +InterventionTaskFormRouteArgs buildFormRouteArgs() - +InterventionFormViewModel createDuplicate() - - - - - - - + + + - + InterventionTaskFormData - + +taskId: String +taskTitle: String @@ -6257,7 +6179,7 @@ - + +CheckmarkTask toTask() +InterventionTaskFormData copy() @@ -6267,17 +6189,17 @@ - - - + + + - + IFormDataWithSchedule - + +instanceId: String +isTimeLocked: bool @@ -6288,105 +6210,92 @@ - + - +Schedule toSchedule() - - - - - - - - - - - - - StudyScheduleFormData - - - - - - +sequenceType: PhaseSequence - +sequenceTypeCustom: String - +numCycles: int - +phaseDuration: int - +includeBaseline: bool - +id: String - - - - - - +StudySchedule toStudySchedule() - +Study apply() - +StudyScheduleFormData copy() - - - - - - - - - - - PhaseSequence + +Schedule toSchedule() - - - - - + + + + + - - - InterventionPreview + + + InterventionsFormViewModel - - - +routeArgs: InterventionFormRouteArgs + + + +study: Study + +router: GoRouter + +interventionsArray: FormArray<dynamic> + +interventionsCollection: FormViewModelCollection<InterventionFormViewModel, InterventionFormData> + +form: FormGroup + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +interventionsRequired: dynamic + +titles: Map<FormMode, String> + +canTestStudySchedule: bool - - - +Widget build() + + + +void setControlsFrom() + +InterventionsFormData buildFormData() + +void read() + +List<ModelAction<dynamic>> availableActions() + +List<ModelAction<dynamic>> availablePopupActions() + +List<ModelAction<dynamic>> availableInlineActions() + +void onSelectItem() + +void onNewItem() + +InterventionFormViewModel provide() + +void onCancel() + +dynamic onSave() + +dynamic testStudySchedule() - - - + + + - - - InterventionFormRouteArgs + + + IListActionProvider + + + + + + + + + + + IProviderArgsResolver - - - + + + - + InterventionTaskFormViewModel - + +taskIdControl: FormControl<String> +instanceIdControl: FormControl<String> @@ -6402,7 +6311,7 @@ - + +void setControlsFrom() +InterventionTaskFormData buildFormData() @@ -6413,17 +6322,17 @@ - - - + + + - + WithScheduleControls - + +isTimeRestrictedControl: FormControl<bool> +instanceID: FormControl<String> @@ -6442,7 +6351,7 @@ - + +void setScheduleControlsFrom() -dynamic _initReminderControl() @@ -6450,83 +6359,30 @@ - - - - - - - - - InterventionsFormData - - - - - - +interventionsData: List<InterventionFormData> - +studyScheduleData: StudyScheduleFormData - +id: String - - - - - - +Study apply() - +InterventionsFormData copy() - - - - - - - - - - - - InterventionFormView - - - - - - +formViewModel: InterventionFormViewModel - - - - - - - - - - - - InterventionTaskFormView - - + + + - - - +formViewModel: InterventionTaskFormViewModel + + + PhaseSequence - - - + + + - + InterventionFormData - + +interventionId: String +title: String @@ -6538,7 +6394,7 @@ - + +Intervention toIntervention() +InterventionFormData copy() @@ -6546,562 +6402,348 @@ - - - - - - - - - StudyScheduleFormView - - - - - - +formViewModel: StudyScheduleControls - - - - - - -FormTableRow _renderCustomSequence() - +Widget build() - - - - - - - - - - - - - StudyInfoFormData - - - - - - +title: String - +description: String? - +iconName: String - +contactInfoFormData: StudyContactInfoFormData - +id: String - - - - - - +Study apply() - +StudyInfoFormData copy() - - - - - - - - - - - - - StudyContactInfoFormData - - - - - - +organization: String? - +institutionalReviewBoard: String? - +institutionalReviewBoardNumber: String? - +researchers: String? - +email: String? - +website: String? - +phone: String? - +additionalInfo: String? - +id: String - - - - - - +Study apply() - +StudyInfoFormData copy() - - - - - - - - - - - - StudyDesignInfoFormView - - - - - - +Widget build() - - - - - - - - - - - - - StudyInfoFormViewModel - - - - - - +study: Study - +titleControl: FormControl<String> - +iconControl: FormControl<IconOption> - +descriptionControl: FormControl<String> - +organizationControl: FormControl<String> - +reviewBoardControl: FormControl<String> - +reviewBoardNumberControl: FormControl<String> - +researchersControl: FormControl<String> - +emailControl: FormControl<String> - +websiteControl: FormControl<String> - +phoneControl: FormControl<String> - +additionalInfoControl: FormControl<String> - +form: FormGroup - +titles: Map<FormMode, String> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titleRequired: dynamic - +descriptionRequired: dynamic - +iconRequired: dynamic - +organizationRequired: dynamic - +reviewBoardRequired: dynamic - +reviewBoardNumberRequired: dynamic - +researchersRequired: dynamic - +emailRequired: dynamic - +phoneRequired: dynamic - +emailFormat: dynamic - +websiteFormat: dynamic - - - - - - +void setControlsFrom() - +StudyInfoFormData buildFormData() - - - - - - - - - + + + + + - - - MeasurementSurveyFormData + + + StudyScheduleFormData - - - +measurementId: String - +title: String - +introText: String? - +outroText: String? - +questionnaireFormData: QuestionnaireFormData - <static>+kDefaultTitle: String - +id: String + + + +sequenceType: PhaseSequence + +sequenceTypeCustom: String + +numCycles: int + +phaseDuration: int + +includeBaseline: bool + +id: String - - - +QuestionnaireTask toQuestionnaireTask() - +MeasurementSurveyFormData copy() + + + +StudySchedule toStudySchedule() + +Study apply() + +StudyScheduleFormData copy() - - - - + + + + - - - MeasurementSurveyFormView + + + IStudyFormData - - - +formViewModel: MeasurementSurveyFormViewModel + + + +Study apply() - - - - - - - - - MeasurementSurveyFormViewModel - - + + + + - - - +study: Study - +measurementIdControl: FormControl<String> - +instanceIdControl: FormControl<String> - +surveyTitleControl: FormControl<String> - +surveyIntroTextControl: FormControl<String> - +surveyOutroTextControl: FormControl<String> - +form: FormGroup - +measurementId: String - +instanceId: String - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titleRequired: dynamic - +atLeastOneQuestion: dynamic - +breadcrumbsTitle: String - +titles: Map<FormMode, String> + + + InterventionTaskFormView - - - +void setControlsFrom() - +MeasurementSurveyFormData buildFormData() - +List<ModelAction<dynamic>> availableActions() - +List<ModelAction<dynamic>> availablePopupActions() - +List<ModelAction<dynamic>> availableInlineActions() - +void onSelectItem() - +void onNewItem() - +SurveyQuestionFormRouteArgs buildNewFormRouteArgs() - +SurveyQuestionFormRouteArgs buildFormRouteArgs() - +MeasurementSurveyFormViewModel createDuplicate() + + + +formViewModel: InterventionTaskFormViewModel - - - - - + + + + + - - - SurveyPreview + + + InterventionsFormData - - - +routeArgs: MeasurementFormRouteArgs + + + +interventionsData: List<InterventionFormData> + +studyScheduleData: StudyScheduleFormData + +id: String - - - +Widget build() + + + +Study apply() + +InterventionsFormData copy() - - - + + + + - - - MeasurementFormRouteArgs + + + StudyDesignReportsFormView - - - - - - - - - StudyDesignMeasurementsFormView + + + +Widget build() + -dynamic _showReportItemSidesheetWithArgs() - - - +Widget build() + + + + + + + + + + ReportItemFormData - - - - - - - - - - MeasurementsFormData + + + +isPrimary: bool + +section: ReportSection + +id: String - - - +surveyMeasurements: List<MeasurementSurveyFormData> - +id: String + + + <static>+dynamic fromDomainModel() + +ReportItemFormData copy() - - - +Study apply() - +MeasurementsFormData copy() + + + + + + + + ReportSection - - - - - + + + + + - - - MeasurementsFormViewModel + + + DataReferenceEditor - - - +study: Study - +router: GoRouter - +measurementsArray: FormArray<dynamic> - +surveyMeasurementFormViewModels: FormViewModelCollection<MeasurementSurveyFormViewModel, MeasurementSurveyFormData> - +form: FormGroup - +measurementViewModels: List<MeasurementSurveyFormViewModel> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +measurementRequired: dynamic - +titles: Map<FormMode, String> + + + +formControl: FormControl<DataReferenceIdentifier<T>> + +availableTasks: List<Task> + +buildReactiveDropdownField: ReactiveDropdownField<dynamic> - - - +void read() - +void setControlsFrom() - +MeasurementsFormData buildFormData() - +List<ModelAction<dynamic>> availableActions() - +List<ModelAction<dynamic>> availablePopupActions() - +List<ModelAction<dynamic>> availableInlineActions() - +void onSelectItem() - +void onNewItem() - +MeasurementSurveyFormViewModel provide() - +void onCancel() - +dynamic onSave() + + + +FormTableRow buildFormTableRow() + -List<DropdownMenuItem<DataReferenceIdentifier<dynamic>>> _dataReferenceItems() - - - - + + + - - - StudyFormValidationSet + + + ReactiveDropdownField - - - +index: int - <static>+values: List<StudyFormValidationSet> + + + + + + + + + + TemporalAggregationFormatted - - - - - - - - - - ReportsFormViewModel + + + -_value: TemporalAggregation + <static>+values: List<TemporalAggregationFormatted> + +value: TemporalAggregation + +string: String + +icon: IconData? + +hashCode: int - - - +study: Study - +router: GoRouter - +reportItemDelegate: ReportFormItemDelegate - +reportItemArray: FormArray<dynamic> - +reportItemFormViewModels: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData> - +form: FormGroup - +reportItemModels: List<ReportItemFormViewModel> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titles: Map<FormMode, String> - +canTestConsent: bool + + + +bool ==() + +String toString() + +String toJson() + <static>+TemporalAggregationFormatted fromJson() - - - +void setControlsFrom() - +ReportsFormData buildFormData() - +void read() - +ReportItemFormRouteArgs buildNewReportItemFormRouteArgs() - +ReportItemFormRouteArgs buildReportItemFormRouteArgs() - +dynamic testReport() - +void onCancel() - +dynamic onSave() - +ReportItemFormViewModel provide() + + + + + + + + TemporalAggregation - - - - - + + + + + - - - ReportFormItemDelegate + + + ImprovementDirectionFormatted - - - +formViewModelCollection: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData> - +owner: ReportsFormViewModel - +propagateOnSave: bool - +validationSet: dynamic + + + -_value: ImprovementDirection + <static>+values: List<ImprovementDirectionFormatted> + +value: ImprovementDirection + +string: String + +icon: IconData? + +hashCode: int - - - +void onCancel() - +dynamic onSave() - +ReportItemFormViewModel provide() - +List<ModelAction<dynamic>> availableActions() - +void onNewItem() - +void onSelectItem() + + + +bool ==() + +String toString() + +String toJson() + <static>+ImprovementDirectionFormatted fromJson() - - - - - + + + - - - ReportItemFormData + + + ImprovementDirection - - - +isPrimary: bool - +section: ReportSection - +id: String - - + + + + + - - - <static>+dynamic fromDomainModel() - +ReportItemFormData copy() + + + ReportSectionType - - - - - - - - ReportSection + + + +index: int + <static>+values: List<ReportSectionType> + <static>+average: ReportSectionType + <static>+linearRegression: ReportSectionType - - - - - + + + + + - - - ReportItemFormView + + + AverageSectionFormView - - - +formViewModel: ReportItemFormViewModel - +studyId: String - +reportSectionColumnWidth: dynamic - +sectionTypeBodyBuilder: Widget Function(BuildContext) + + + +formViewModel: ReportItemFormViewModel + +studyId: String + +reportSectionColumnWidth: Map<int, TableColumnWidth> - - - +Widget build() - -dynamic _buildSectionText() - -dynamic _buildSectionTypeHeader() + + + +Widget build() - - - + + + - + ReportItemFormViewModel - + <static>+defaultSectionType: ReportSectionType +sectionIdControl: FormControl<String> @@ -7134,7 +6776,7 @@ - + -List<FormControlValidation> _getValidationConfig() +ReportItemFormData buildFormData() @@ -7146,887 +6788,1174 @@ - - - + + + + + - - - Widget Function(BuildContext) + + + DataReferenceIdentifier + + + + + + +hashCode: int + + + + + + +bool ==() - - - - + + + - - - ReportSectionType + + + DataReference - - - +index: int - <static>+values: List<ReportSectionType> - <static>+average: ReportSectionType - <static>+linearRegression: ReportSectionType + + + + + + + + + + LinearRegressionSectionFormView + + + + + + +formViewModel: ReportItemFormViewModel + +studyId: String + +reportSectionColumnWidth: Map<int, TableColumnWidth> + + + + + + +Widget build() - - - - - + + + + + - - - TemporalAggregationFormatted + + + ReportItemFormView - - - -_value: TemporalAggregation - <static>+values: List<TemporalAggregationFormatted> - +value: TemporalAggregation - +string: String - +icon: IconData? - +hashCode: int + + + +formViewModel: ReportItemFormViewModel + +studyId: String + +reportSectionColumnWidth: dynamic + +sectionTypeBodyBuilder: Widget Function(BuildContext) - - - +bool ==() - +String toString() - +String toJson() - <static>+TemporalAggregationFormatted fromJson() + + + +Widget build() + -dynamic _buildSectionText() + -dynamic _buildSectionTypeHeader() - - - + + + - - - TemporalAggregation + + + Widget Function(BuildContext) - - - - - + + + + + - - - ImprovementDirectionFormatted + + + ReportsFormViewModel - - - -_value: ImprovementDirection - <static>+values: List<ImprovementDirectionFormatted> - +value: ImprovementDirection - +string: String - +icon: IconData? - +hashCode: int + + + +study: Study + +router: GoRouter + +reportItemDelegate: ReportFormItemDelegate + +reportItemArray: FormArray<dynamic> + +reportItemFormViewModels: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData> + +form: FormGroup + +reportItemModels: List<ReportItemFormViewModel> + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titles: Map<FormMode, String> + +canTestConsent: bool - - - +bool ==() - +String toString() - +String toJson() - <static>+ImprovementDirectionFormatted fromJson() + + + +void setControlsFrom() + +ReportsFormData buildFormData() + +void read() + +ReportItemFormRouteArgs buildNewReportItemFormRouteArgs() + +ReportItemFormRouteArgs buildReportItemFormRouteArgs() + +dynamic testReport() + +void onCancel() + +dynamic onSave() + +ReportItemFormViewModel provide() - - - + + + + + - - - ImprovementDirection + + + ReportFormItemDelegate + + + + + + +formViewModelCollection: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData> + +owner: ReportsFormViewModel + +propagateOnSave: bool + +validationSet: dynamic + + + + + + +void onCancel() + +dynamic onSave() + +ReportItemFormViewModel provide() + +List<ModelAction<dynamic>> availableActions() + +void onNewItem() + +void onSelectItem() - - - - - + + + + + - - - AverageSectionFormView + + + ReportBadge - - - +formViewModel: ReportItemFormViewModel - +studyId: String - +reportSectionColumnWidth: Map<int, TableColumnWidth> + + + +status: ReportStatus? + +type: BadgeType + +showPrefixIcon: bool + +showTooltip: bool - - - +Widget build() + + + +Widget build() - - - - - + + + + - - - LinearRegressionSectionFormView + + + ReportStatus + + + + + + +index: int + <static>+values: List<ReportStatus> + <static>+primary: ReportStatus + <static>+secondary: ReportStatus + + + + + + + + + + + + + ReportsFormData - - - +formViewModel: ReportItemFormViewModel - +studyId: String - +reportSectionColumnWidth: Map<int, TableColumnWidth> + + + +reportItems: List<ReportItemFormData> + +id: String - - - +Widget build() + + + +Study apply() + +ReportsFormData copy() - - - - - + + + + + - - - DataReferenceIdentifier + + + StudyInfoFormViewModel - - - +hashCode: int + + + +study: Study + +titleControl: FormControl<String> + +iconControl: FormControl<IconOption> + +descriptionControl: FormControl<String> + +organizationControl: FormControl<String> + +reviewBoardControl: FormControl<String> + +reviewBoardNumberControl: FormControl<String> + +researchersControl: FormControl<String> + +emailControl: FormControl<String> + +websiteControl: FormControl<String> + +phoneControl: FormControl<String> + +additionalInfoControl: FormControl<String> + +form: FormGroup + +titles: Map<FormMode, String> + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titleRequired: dynamic + +descriptionRequired: dynamic + +iconRequired: dynamic + +organizationRequired: dynamic + +reviewBoardRequired: dynamic + +reviewBoardNumberRequired: dynamic + +researchersRequired: dynamic + +emailRequired: dynamic + +phoneRequired: dynamic + +emailFormat: dynamic + +websiteFormat: dynamic - - - +bool ==() + + + +void setControlsFrom() + +StudyInfoFormData buildFormData() - - - + + + + - - - DataReference + + + StudyDesignInfoFormView - - - - - - - - - - DataReferenceEditor + + + +Widget build() - - - +formControl: FormControl<DataReferenceIdentifier<T>> - +availableTasks: List<Task> - +buildReactiveDropdownField: ReactiveDropdownField<dynamic> + + + + + + + + + + StudyInfoFormData - - - +FormTableRow buildFormTableRow() - -List<DropdownMenuItem<DataReferenceIdentifier<dynamic>>> _dataReferenceItems() + + + +title: String + +description: String? + +iconName: String + +contactInfoFormData: StudyContactInfoFormData + +id: String - - - - - - - - ReactiveDropdownField + + + +Study apply() + +StudyInfoFormData copy() - - - - - + + + + + - - - ReportsFormData + + + StudyContactInfoFormData - - - +reportItems: List<ReportItemFormData> - +id: String + + + +organization: String? + +institutionalReviewBoard: String? + +institutionalReviewBoardNumber: String? + +researchers: String? + +email: String? + +website: String? + +phone: String? + +additionalInfo: String? + +id: String - - - +Study apply() - +ReportsFormData copy() + + + +Study apply() + +StudyInfoFormData copy() - - - - + + + + - - - ReportStatus + + + StudyFormValidationSet - - - +index: int - <static>+values: List<ReportStatus> - <static>+primary: ReportStatus - <static>+secondary: ReportStatus + + + +index: int + <static>+values: List<StudyFormValidationSet> - - - - - + + + + + - - - ReportBadge + + + MeasurementsFormData - - - +status: ReportStatus? - +type: BadgeType - +showPrefixIcon: bool - +showTooltip: bool + + + +surveyMeasurements: List<MeasurementSurveyFormData> + +id: String - - - +Widget build() + + + +Study apply() + +MeasurementsFormData copy() - - - - + + + + - - - StudyDesignReportsFormView + + + MeasurementSurveyFormView - - - +Widget build() - -dynamic _showReportItemSidesheetWithArgs() + + + +formViewModel: MeasurementSurveyFormViewModel - - - - - + + + + + - - - StudyFormScaffold + + + MeasurementSurveyFormViewModel - - - +studyId: String - +formViewModelBuilder: T Function(WidgetRef) - +formViewBuilder: Widget Function(T) + + + +study: Study + +measurementIdControl: FormControl<String> + +instanceIdControl: FormControl<String> + +surveyTitleControl: FormControl<String> + +surveyIntroTextControl: FormControl<String> + +surveyOutroTextControl: FormControl<String> + +form: FormGroup + +measurementId: String + +instanceId: String + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titleRequired: dynamic + +atLeastOneQuestion: dynamic + +breadcrumbsTitle: String + +titles: Map<FormMode, String> - - - +Widget build() + + + +void setControlsFrom() + +MeasurementSurveyFormData buildFormData() + +List<ModelAction<dynamic>> availableActions() + +List<ModelAction<dynamic>> availablePopupActions() + +List<ModelAction<dynamic>> availableInlineActions() + +void onSelectItem() + +void onNewItem() + +SurveyQuestionFormRouteArgs buildNewFormRouteArgs() + +SurveyQuestionFormRouteArgs buildFormRouteArgs() + +MeasurementSurveyFormViewModel createDuplicate() - - - + + + + + - - - T Function(WidgetRef) + + + SurveyPreview - - - - - - - - Widget Function(T) + + + +routeArgs: MeasurementFormRouteArgs - - - - - - - - - SurveyQuestionFormView + + + +Widget build() - - - +formViewModel: QuestionFormViewModel - +isHtmlStyleable: bool + + + + + + + + MeasurementFormRouteArgs - - - - + + + + + + + + + MeasurementSurveyFormData + + - - - SurveyQuestionType + + + +measurementId: String + +title: String + +introText: String? + +outroText: String? + +questionnaireFormData: QuestionnaireFormData + <static>+kDefaultTitle: String + +id: String - - - +index: int - <static>+values: List<SurveyQuestionType> - <static>+choice: SurveyQuestionType - <static>+bool: SurveyQuestionType - <static>+scale: SurveyQuestionType - <static>+image: SurveyQuestionType - <static>+audio: SurveyQuestionType - <static>+freeText: SurveyQuestionType + + + +QuestionnaireTask toQuestionnaireTask() + +MeasurementSurveyFormData copy() - - - - - + + + + + - - - QuestionFormData + + + QuestionnaireFormData - - - <static>+questionTypeFormDataFactories: Map<SurveyQuestionType, QuestionFormData Function(Question<dynamic>, List<EligibilityCriterion>)> - +questionId: String - +questionText: String - +questionInfoText: String? - +questionType: SurveyQuestionType - +responseOptionsValidity: Map<dynamic, bool> - +responseOptions: List<dynamic> - +id: String + + + +questionsData: List<QuestionFormData>? + +id: String - - - +Question<dynamic> toQuestion() - +EligibilityCriterion toEligibilityCriterion() - +Answer<dynamic> constructAnswerFor() - +dynamic setResponseOptionsValidityFrom() - +QuestionFormData copy() + + + +StudyUQuestionnaire toQuestionnaire() + +List<EligibilityCriterion> toEligibilityCriteria() + +QuestionnaireFormData copy() - - - - - + + + + + - - - ChoiceQuestionFormData + + + WithQuestionnaireControls - - - +isMultipleChoice: bool - +answerOptions: List<String> - +responseOptions: List<String> + + + +questionsArray: FormArray<dynamic> + +questionFormViewModels: FormViewModelCollection<Q, QuestionFormData> + +questionnaireControls: Map<String, FormArray<dynamic>> + +propagateOnSave: bool + +questionModels: List<Q> + +questionTitles: Map<FormMode, String Function()> - - - +Question<dynamic> toQuestion() - +QuestionFormData copy() - -Choice _buildChoiceForValue() - +Answer<dynamic> constructAnswerFor() + + + +void setQuestionnaireControlsFrom() + +QuestionnaireFormData buildQuestionnaireFormData() + +void read() + +void onCancel() + +dynamic onSave() + +Q provide() + +Q provideQuestionFormViewModel() - - - - - - - - - BoolQuestionFormData - - + + + + - - - <static>+kResponseOptions: Map<String, bool> - +responseOptions: List<String> + + + StudyDesignMeasurementsFormView - - - +Question<dynamic> toQuestion() - +BoolQuestionFormData copy() - +Answer<dynamic> constructAnswerFor() + + + +Widget build() - - - - - + + + + + - - - ImageQuestionFormData + + + MeasurementsFormViewModel - - - <static>+kResponseOptions: Map<String, FutureBlobFile> - +responseOptions: List<String> + + + +study: Study + +router: GoRouter + +measurementsArray: FormArray<dynamic> + +surveyMeasurementFormViewModels: FormViewModelCollection<MeasurementSurveyFormViewModel, MeasurementSurveyFormData> + +form: FormGroup + +measurementViewModels: List<MeasurementSurveyFormViewModel> + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +measurementRequired: dynamic + +titles: Map<FormMode, String> - - - +Question<dynamic> toQuestion() - +ImageQuestionFormData copy() - +Answer<dynamic> constructAnswerFor() + + + +void read() + +void setControlsFrom() + +MeasurementsFormData buildFormData() + +List<ModelAction<dynamic>> availableActions() + +List<ModelAction<dynamic>> availablePopupActions() + +List<ModelAction<dynamic>> availableInlineActions() + +void onSelectItem() + +void onNewItem() + +MeasurementSurveyFormViewModel provide() + +void onCancel() + +dynamic onSave() - - - - - + + + + + - - - AudioQuestionFormData + + + StudyFormScaffold - - - +maxRecordingDurationSeconds: int - <static>+kResponseOptions: Map<String, FutureBlobFile> - +responseOptions: List<String> + + + +studyId: String + +formViewModelBuilder: T Function(WidgetRef) + +formViewBuilder: Widget Function(T) - - - +Question<dynamic> toQuestion() - +AudioQuestionFormData copy() - +Answer<dynamic> constructAnswerFor() + + + +Widget build() - - - - - + + + - - - ScaleQuestionFormData + + + T Function(WidgetRef) - - - +minValue: double - +maxValue: double - +minLabel: String? - +maxLabel: String? - +midValues: List<double?> - +midLabels: List<String?> - +stepSize: double - +initialValue: double? - +minColor: Color? - +maxColor: Color? - +responseOptions: List<double> - +midAnnotations: List<Annotation> - - + + + + - - - +ScaleQuestion toQuestion() - +QuestionFormData copy() - +Answer<dynamic> constructAnswerFor() + + + Widget Function(T) - - - - - + + + + + - - - FreeTextQuestionFormData + + + ConsentItemFormViewModel - - - +textLengthRange: List<int> - +textType: FreeTextQuestionType - +textTypeExpression: String? - +responseOptions: List<String> + + + +consentIdControl: FormControl<String> + +titleControl: FormControl<String> + +descriptionControl: FormControl<String> + +iconControl: FormControl<IconOption> + +form: FormGroup + +consentId: String + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titleRequired: dynamic + +descriptionRequired: dynamic + +titles: Map<FormMode, String> - - - +Question<dynamic> toQuestion() - +FreeTextQuestionFormData copy() - +Answer<dynamic> constructAnswerFor() + + + +void setControlsFrom() + +ConsentItemFormData buildFormData() + +ConsentItemFormViewModel createDuplicate() - - - + + + + - - - FreeTextQuestionType + + + StudyDesignEnrollmentFormView + + + + + + +Widget build() + -dynamic _showScreenerQuestionSidesheetWithArgs() + -dynamic _showConsentItemSidesheetWithArgs() - - - - + + + + - - - IScaleQuestionFormViewModel + + + IScreenerQuestionLogicFormViewModel - - - +isMidValuesClearedInfoVisible: bool + + + +isDirtyOptionsBannerVisible: bool - - - - + + + + + - - - ScaleQuestionFormView + + + ScreenerQuestionLogicFormView - - - +formViewModel: QuestionFormViewModel + + + +formViewModel: ScreenerQuestionFormViewModel + + + + + + +Widget build() + -dynamic _buildInfoBanner() + -dynamic _buildAnswerOptionsLogicControls() + -List<Widget> _buildOptionLogicRow() - - - - - + + + + + - - - FreeTextQuestionFormView + + + ScreenerQuestionFormViewModel - - - +formViewModel: QuestionFormViewModel - +generateLabelHelpTextMap: dynamic + + + <static>+defaultResponseOptionValidity: bool + +responseOptionsDisabledArray: FormArray<dynamic> + +responseOptionsLogicControls: FormArray<bool> + +responseOptionsLogicDescriptionControls: FormArray<String> + -_questionBaseControls: Map<String, AbstractControl<dynamic>> + +prevResponseOptionControls: List<AbstractControl<dynamic>> + +prevResponseOptionValues: List<dynamic> + +responseOptionsDisabledControls: List<AbstractControl<dynamic>> + +logicControlOptions: List<FormControlOption<bool>> + +questionBaseControls: Map<String, AbstractControl<dynamic>> + +isDirtyOptionsBannerVisible: bool - - - +Widget build() - +Widget disableOnReadonly() - +Widget generateRow() + + + +dynamic onResponseOptionsChanged() + +void setControlsFrom() + +QuestionFormData buildFormData() + -List<FormControl<dynamic>> _copyFormControls() + -AbstractControl<dynamic>? _findAssociatedLogicControlFor() + -AbstractControl<dynamic>? _findAssociatedControlFor() + +ScreenerQuestionFormViewModel createDuplicate() - - - - - + + + + + - - - BoolQuestionFormView + + + ConsentItemFormData - - - +formViewModel: QuestionFormViewModel + + + +consentId: String + +title: String + +description: String + +iconName: String? + +id: String - - - +Widget build() + + + +ConsentItem toConsentItem() + +ConsentItemFormData copy() - - - - - - - - - AudioRecordingQuestionFormView - - + + + + - - - +formViewModel: QuestionFormViewModel + + + ConsentItemFormView - - - +Widget build() + + + +formViewModel: ConsentItemFormViewModel - - - - - + + + + + - - - ChoiceQuestionFormView + + + EnrollmentFormData - - - +formViewModel: QuestionFormViewModel + + + <static>+kDefaultEnrollmentType: Participation + +enrollmentType: Participation + +questionnaireFormData: QuestionnaireFormData + +consentItemsFormData: List<ConsentItemFormData>? + +id: String - - - +Widget build() + + + +Study apply() + +EnrollmentFormData copy() - - - - - + + + + + - - - ImageCapturingQuestionFormView + + + QuestionFormViewModel - - - +formViewModel: QuestionFormViewModel + + + <static>+defaultQuestionType: SurveyQuestionType + -_titles: Map<FormMode, String Function()>? + +questionIdControl: FormControl<String> + +questionTypeControl: FormControl<SurveyQuestionType> + +questionTextControl: FormControl<String> + +questionInfoTextControl: FormControl<String> + +questionBaseControls: Map<String, AbstractControl<dynamic>> + +isMultipleChoiceControl: FormControl<bool> + +choiceResponseOptionsArray: FormArray<dynamic> + +customOptionsMin: int + +customOptionsMax: int + +customOptionsInitial: int + +boolResponseOptionsArray: FormArray<String> + +imageResponseOptionsArray: FormArray<String> + <static>+kDefaultMaxRecordingDurationSeconds: int + <static>+kMaxRecordingDurationSeconds: int + +audioResponseOptionsArray: FormArray<String> + +maxRecordingDurationSecondsControl: FormControl<int> + <static>+kDefaultScaleMinValue: int + <static>+kDefaultScaleMaxValue: int + <static>+kNumMidValueControls: int + <static>+kMidValueDebounceMilliseconds: int + +scaleMinValueControl: FormControl<int> + +scaleMaxValueControl: FormControl<int> + -_scaleRangeControl: FormControl<int> + +scaleMinLabelControl: FormControl<String> + +scaleMaxLabelControl: FormControl<String> + +scaleMidValueControls: FormArray<int> + +scaleMidLabelControls: FormArray<String?> + -_scaleResponseOptionsArray: FormArray<int> + +scaleMinColorControl: FormControl<SerializableColor> + +scaleMaxColorControl: FormControl<SerializableColor> + +prevMidValues: List<int?>? + +freeTextTypeControl: FormControl<FreeTextQuestionType> + +customRegexControl: FormControl<String> + +freeTextResponseOptionsArray: FormArray<dynamic> + +freeTextLengthMin: AbstractControl<int> + +freeTextLengthMax: AbstractControl<int> + +freeTextExampleTextControl: FormControl<String> + <static>+kDefaultFreeTextMinLength: int + <static>+kDefaultFreeTextMaxLength: int + +freeTextLengthControl: FormControl<RangeValues> + -_controlsByQuestionType: Map<SurveyQuestionType, FormGroup> + -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + -_validationConfigsByQuestionType: Map<SurveyQuestionType, Map<FormValidationSetEnum, List<FormControlValidation>>> + +form: FormGroup + +questionId: String + +questionType: SurveyQuestionType + +questionTypeControlOptions: List<FormControlOption<SurveyQuestionType>> + +answerOptionsArray: FormArray<dynamic> + +answerOptionsControls: List<AbstractControl<dynamic>> + +validAnswerOptions: List<String> + +boolOptions: List<AbstractControl<String>> + +imageOptions: List<AbstractControl<String>> + +audioOptions: List<AbstractControl<String>> + +scaleMinValue: int + +scaleMaxValue: int + +scaleRange: int + +scaleAllValueControls: List<AbstractControl<int>> + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +questionTextRequired: dynamic + +numValidChoiceOptions: dynamic + +scaleRangeValid: dynamic + +maxRecordingDurationValid: dynamic + +titles: Map<FormMode, String> + +isAddOptionButtonVisible: bool + +isMidValuesClearedInfoVisible: bool - - - +Widget build() + + + +String? scaleMidLabelAt() + -dynamic _onScaleRangeChanged() + -dynamic _applyInputFormatters() + -dynamic _updateScaleMidValueControls() + -Map<String, dynamic>? _validateFreeText() + -dynamic _onFreeTextLengthChanged() + -List<FormControlValidation> _getValidationConfig() + +dynamic onQuestionTypeChanged() + +dynamic onResponseOptionsChanged() + -void _updateFormControls() + +void initControls() + +void setControlsFrom() + +QuestionFormData buildFormData() + +List<ModelAction<dynamic>> availableActions() + +void onNewItem() + +void onSelectItem() + +dynamic save() + +QuestionFormViewModel createDuplicate() - - - - - + + + + + - - - ScheduleControls + + + EnrollmentFormViewModel + + + + + + +study: Study + +router: GoRouter + +consentItemDelegate: EnrollmentFormConsentItemDelegate + +enrollmentTypeControl: FormControl<Participation> + +consentItemArray: FormArray<dynamic> + +consentItemFormViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData> + +form: FormGroup + +enrollmentTypeControlOptions: List<FormControlOption<Participation>> + +consentItemModels: List<ConsentItemFormViewModel> + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titles: Map<FormMode, String> + +canTestScreener: bool + +canTestConsent: bool + +questionTitles: Map<FormMode, String Function()> + + + + + + +void setControlsFrom() + +EnrollmentFormData buildFormData() + +void read() + +List<ModelAction<dynamic>> availableActions() + +List<ModelAction<dynamic>> availablePopupActions() + +List<ModelAction<dynamic>> availableInlineActions() + +void onSelectItem() + +void onNewItem() + +ScreenerQuestionFormRouteArgs buildNewScreenerQuestionFormRouteArgs() + +ScreenerQuestionFormRouteArgs buildScreenerQuestionFormRouteArgs() + +ConsentItemFormRouteArgs buildNewConsentItemFormRouteArgs() + +ConsentItemFormRouteArgs buildConsentItemFormRouteArgs() + +dynamic testScreener() + +dynamic testConsent() + +ScreenerQuestionFormViewModel provideQuestionFormViewModel() - - - +formViewModel: WithScheduleControls + + + + + + + + + + EnrollmentFormConsentItemDelegate - - - +Widget build() - -List<FormTableRow> _conditionalTimeRestrictions() + + + +formViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData> + +owner: EnrollmentFormViewModel + +propagateOnSave: bool + +validationSet: dynamic - - - - - - - - StudyUTimeOfDay + + + +void onCancel() + +dynamic onSave() + +ConsentItemFormViewModel provide() + +List<ModelAction<dynamic>> availableActions() + +void onNewItem() + +void onSelectItem() - - - + + + - + StudyFormViewModel - + +studyDirtyCopy: Study? +studyRepository: IStudyRepository @@ -8044,7 +7973,7 @@ - + +void read() +void setControlsFrom() @@ -8057,761 +7986,832 @@ - - - - + + + + + - - - StudyAnalyzeScreen + + + QuestionFormData - - - +Widget? banner() - +Widget build() + + + <static>+questionTypeFormDataFactories: Map<SurveyQuestionType, QuestionFormData Function(Question<dynamic>, List<EligibilityCriterion>)> + +questionId: String + +questionText: String + +questionInfoText: String? + +questionType: SurveyQuestionType + +responseOptionsValidity: Map<dynamic, bool> + +responseOptions: List<dynamic> + +id: String + + + + + + +Question<dynamic> toQuestion() + +EligibilityCriterion toEligibilityCriterion() + +Answer<dynamic> constructAnswerFor() + +dynamic setResponseOptionsValidityFrom() + +QuestionFormData copy() - - - - + + + + - - - StudyAnalyzeController + + + SurveyQuestionType - - - +dynamic onExport() + + + +index: int + <static>+values: List<SurveyQuestionType> + <static>+choice: SurveyQuestionType + <static>+bool: SurveyQuestionType + <static>+scale: SurveyQuestionType + <static>+image: SurveyQuestionType + <static>+audio: SurveyQuestionType + <static>+freeText: SurveyQuestionType - - - - + + + + + - - - StudyMonitorScreen + + + ChoiceQuestionFormData - - - +Widget build() + + + +isMultipleChoice: bool + +answerOptions: List<String> + +responseOptions: List<String> + + + + + + +Question<dynamic> toQuestion() + +QuestionFormData copy() + -Choice _buildChoiceForValue() + +Answer<dynamic> constructAnswerFor() - - - - + + + + + - - - StudiesTableItem + + + BoolQuestionFormData - - - +study: Study - +itemHeight: double - +itemPadding: double - +rowSpacing: double - +columnSpacing: double - +actions: List<ModelAction<dynamic>> - +columnSizes: List<StudiesTableColumnSize> - +isPinned: bool - +onPinnedChanged: void Function(Study, bool)? - +onTap: void Function(Study)? + + + <static>+kResponseOptions: Map<String, bool> + +responseOptions: List<String> + + + + + + +Question<dynamic> toQuestion() + +BoolQuestionFormData copy() + +Answer<dynamic> constructAnswerFor() - - - + + + + + - - - void Function(Study, bool)? + + + ImageQuestionFormData - - - - + + + <static>+kResponseOptions: Map<String, FutureBlobFile> + +responseOptions: List<String> + + - - - void Function(Study)? + + + +Question<dynamic> toQuestion() + +ImageQuestionFormData copy() + +Answer<dynamic> constructAnswerFor() - - - - - + + + + + - - - DashboardController + + + AudioQuestionFormData - - - +studyRepository: IStudyRepository - +authRepository: IAuthRepository - +userRepository: IUserRepository - +router: GoRouter - -_studiesSubscription: StreamSubscription<List<WrappedModel<Study>>>? - +searchController: SearchController - +isSortAscending: bool + + + +maxRecordingDurationSeconds: int + <static>+kResponseOptions: Map<String, FutureBlobFile> + +responseOptions: List<String> - - - -dynamic _subscribeStudies() - +dynamic setSearchText() - +dynamic setStudiesFilter() - +dynamic onSelectStudy() - +dynamic onClickNewStudy() - +dynamic pinStudy() - +dynamic pinOffStudy() - +void setSorting() - +void filterStudies() - +void sortStudies() - +bool isSortingActiveForColumn() - +bool isPinned() - +List<ModelAction<dynamic>> availableActions() - +void dispose() + + + +Question<dynamic> toQuestion() + +AudioQuestionFormData copy() + +Answer<dynamic> constructAnswerFor() - - - + + + + + - - - IUserRepository + + + ScaleQuestionFormData + + + + + + +minValue: double + +maxValue: double + +minLabel: String? + +maxLabel: String? + +midValues: List<double?> + +midLabels: List<String?> + +stepSize: double + +initialValue: double? + +minColor: Color? + +maxColor: Color? + +responseOptions: List<double> + +midAnnotations: List<Annotation> + + + + + + +ScaleQuestion toQuestion() + +QuestionFormData copy() + +Answer<dynamic> constructAnswerFor() - - - + + + + + - - - SearchController + + + FreeTextQuestionFormData + + + + + + +textLengthRange: List<int> + +textType: FreeTextQuestionType + +textTypeExpression: String? + +responseOptions: List<String> + + + + + + +Question<dynamic> toQuestion() + +FreeTextQuestionFormData copy() + +Answer<dynamic> constructAnswerFor() - - - + + + - - - IModelActionProvider + + + FreeTextQuestionType - - - - - + + + + + - - - StudiesTableColumnSize + + + AudioRecordingQuestionFormView - - - +collapsed: bool - +flex: int? - +width: double? + + + +formViewModel: QuestionFormViewModel - - - +Widget createContainer() + + + +Widget build() - - - - - + + + + + - - - StudiesTable + + + FreeTextQuestionFormView - - - +itemHeight: double - +itemPadding: double - +rowSpacing: double - +columnSpacing: double - +compactWidthThreshold: double - +superCompactWidthThreshold: double - +compactStatTitleThreshold: double - +studies: List<Study> - +onSelect: void Function(Study) - +getActions: List<ModelAction<dynamic>> Function(Study) - +emptyWidget: Widget - +pinnedStudies: Iterable<String> - +dashboardController: DashboardController + + + +formViewModel: QuestionFormViewModel + +generateLabelHelpTextMap: dynamic - - - +Widget build() - -Widget _buildColumnHeader() + + + +Widget build() + +Widget disableOnReadonly() + +Widget generateRow() - - - + + + + + - - - void Function(Study) + + + ImageCapturingQuestionFormView - - - - + + + +formViewModel: QuestionFormViewModel + + - - - List<ModelAction<dynamic>> Function(Study) + + + +Widget build() - - - - + + + + - - - StudiesTableColumn + + + IScaleQuestionFormViewModel - - - +index: int - <static>+values: List<StudiesTableColumn> - <static>+pin: StudiesTableColumn - <static>+title: StudiesTableColumn - <static>+status: StudiesTableColumn - <static>+participation: StudiesTableColumn - <static>+createdAt: StudiesTableColumn - <static>+enrolled: StudiesTableColumn - <static>+active: StudiesTableColumn - <static>+completed: StudiesTableColumn - <static>+action: StudiesTableColumn + + + +isMidValuesClearedInfoVisible: bool - - - - + + + + - - - DashboardScreen + + + ScaleQuestionFormView - - - +filter: StudiesFilter? + + + +formViewModel: QuestionFormViewModel - - - - + + + + + - - - StudiesFilter + + + ChoiceQuestionFormView - - - +index: int - <static>+values: List<StudiesFilter> + + + +formViewModel: QuestionFormViewModel + + + + + + +Widget build() - - - - - + + + + + - - - DashboardScaffold + + + BoolQuestionFormView - - - <static>+compactWidthThreshold: double - +body: Widget + + + +formViewModel: QuestionFormViewModel - - - +Widget build() + + + +Widget build() - - - - + + + + - - - StudiesTableColumnHeader + + + SurveyQuestionFormView - - - +title: String - +sortable: bool - +sortAscending: bool - +sortingActive: bool - +onSort: void Function()? + + + +formViewModel: QuestionFormViewModel + +isHtmlStyleable: bool - - - - - - - - AccountSettingsDialog - - + + + - - - +Widget build() + + + StudyUTimeOfDay - - - - - + + + + + - - - StudyInvitesTable + + + ScheduleControls - - - +invites: List<StudyInvite> - +onSelect: void Function(StudyInvite) - +getActions: List<ModelAction<dynamic>> Function(StudyInvite) - +getInlineActions: List<ModelAction<dynamic>> Function(StudyInvite) - +getIntervention: Intervention? Function(String) - +getParticipantCountForInvite: int Function(StudyInvite) + + + +formViewModel: WithScheduleControls - - - +Widget build() - -List<Widget> _buildRow() + + + +Widget build() + -List<FormTableRow> _conditionalTimeRestrictions() - - - + + + + - - - void Function(StudyInvite) + + + StudiesTableColumnHeader - - - - - - - - List<ModelAction<dynamic>> Function(StudyInvite) + + + +title: String + +sortable: bool + +sortAscending: bool + +sortingActive: bool + +onSort: void Function()? - - - + + + + - - - Intervention? Function(String) + + + DashboardScreen + + + + + + +filter: StudiesFilter? - - - + + + + - - - int Function(StudyInvite) + + + StudiesFilter + + + + + + +index: int + <static>+values: List<StudiesFilter> - - - - - + + + + + - - - StudyRecruitController + + + DashboardScaffold - - - +inviteCodeRepository: IInviteCodeRepository - -_invitesSubscription: StreamSubscription<List<WrappedModel<StudyInvite>>>? + + + <static>+compactWidthThreshold: double + +body: Widget - - - -dynamic _subscribeInvites() - +Intervention? getIntervention() - +int getParticipantCountForInvite() - +List<ModelAction<dynamic>> availableActions() - +List<ModelAction<dynamic>> availableInlineActions() - +void dispose() + + + +Widget build() - - - + + + + + - - - IInviteCodeRepository + + + DashboardController - - - - - - + + + +studyRepository: IStudyRepository + +authRepository: IAuthRepository + +userRepository: IUserRepository + +router: GoRouter + -_studiesSubscription: StreamSubscription<List<WrappedModel<Study>>>? + +searchController: SearchController + +isSortAscending: bool + + - - - InviteCodeFormViewModel + + + -dynamic _subscribeStudies() + +dynamic setSearchText() + +dynamic setStudiesFilter() + +dynamic onSelectStudy() + +dynamic onClickNewStudy() + +dynamic pinStudy() + +dynamic pinOffStudy() + +void setSorting() + +void filterStudies() + +void sortStudies() + +bool isSortingActiveForColumn() + +bool isPinned() + +List<ModelAction<dynamic>> availableActions() + +void dispose() - - - +study: Study - +inviteCodeRepository: IInviteCodeRepository - +codeControl: FormControl<String> - +codeControlValidationMessages: Map<String, String Function(dynamic)> - +isPreconfiguredScheduleControl: FormControl<bool> - +preconfiguredScheduleTypeControl: FormControl<PhaseSequence> - +interventionAControl: FormControl<String> - +interventionBControl: FormControl<String> - +form: FormGroup - +titles: Map<FormMode, String> - +interventionControlOptions: List<FormControlOption<String>> - +preconfiguredScheduleTypeOptions: List<FormControlOption<PhaseSequence>> - +isPreconfiguredSchedule: bool - +preconfiguredSchedule: List<String>? + + + + + + + + IUserRepository - - - +void initControls() - -dynamic _uniqueInviteCode() - +void regenerateCode() - -String _generateCode() - +StudyInvite buildFormData() - +void setControlsFrom() - +dynamic save() + + + + + + + + SearchController - - - - - + + + + + - - - EnrolledBadge + + + StudiesTableColumnSize - - - +enrolledCount: int + + + +collapsed: bool + +flex: int? + +width: double? - - - +Widget build() + + + +Widget createContainer() - - - - - + + + + + - - - InviteCodeFormView + + + StudiesTable - - - +formViewModel: InviteCodeFormViewModel + + + +itemHeight: double + +itemPadding: double + +rowSpacing: double + +columnSpacing: double + +compactWidthThreshold: double + +superCompactWidthThreshold: double + +compactStatTitleThreshold: double + +studies: List<Study> + +onSelect: void Function(Study) + +getActions: List<ModelAction<dynamic>> Function(Study) + +emptyWidget: Widget + +pinnedStudies: Iterable<String> + +dashboardController: DashboardController - - - +Widget build() - -List<FormTableRow> _conditionalInterventionRows() + + + +Widget build() + -Widget _buildColumnHeader() - - - - - - - - StudyRecruitScreen - - + + + - - - +Widget build() - -Widget _inviteCodesSectionHeader() - -Widget _newInviteCodeButton() - -dynamic _onSelectInvite() + + + void Function(Study) - - - - - + + + - - - DrawerEntry + + + List<ModelAction<dynamic>> Function(Study) - - - +localizedTitle: String Function() - +icon: IconData? - +localizedHelpText: String Function()? - +enabled: bool - +onSelected: void Function(BuildContext, WidgetRef)? - +autoCloseDrawer: bool - +title: String - +helpText: String? + + + + + + + + + StudiesTableColumn - - - +void onClick() + + + +index: int + <static>+values: List<StudiesTableColumn> + <static>+pin: StudiesTableColumn + <static>+title: StudiesTableColumn + <static>+status: StudiesTableColumn + <static>+participation: StudiesTableColumn + <static>+createdAt: StudiesTableColumn + <static>+enrolled: StudiesTableColumn + <static>+active: StudiesTableColumn + <static>+completed: StudiesTableColumn + <static>+action: StudiesTableColumn - - - + + + + - - - String Function() + + + StudiesTableItem - - - - - - - - String Function()? + + + +study: Study + +itemHeight: double + +itemPadding: double + +rowSpacing: double + +columnSpacing: double + +actions: List<ModelAction<dynamic>> + +columnSizes: List<StudiesTableColumnSize> + +isPinned: bool + +onPinnedChanged: void Function(Study, bool)? + +onTap: void Function(Study)? - - - + + + - - - void Function(BuildContext, WidgetRef)? + + + void Function(Study, bool)? - - - - - + + + - - - GoRouterDrawerEntry + + + void Function(Study)? - - - +intent: RoutingIntent - +onNavigated: void Function()? - - + + + + - - - +void onClick() + + + App - - - + + + - - - RoutingIntent + + + AppContent - - - - + + + + - - - AppDrawer + + + AccountSettingsDialog - - - +width: int - +autoCloseDrawer: bool - +leftPaddingEntries: double - +logoPaddingVertical: double - +logoPaddingHorizontal: double - +logoMaxHeight: double - +logoSectionMinHeight: double - +logoSectionMaxHeight: double + + + +Widget build() diff --git a/docs/uml/designer_v2/lib/uml.svg b/docs/uml/designer_v2/lib/uml.svg index 135fe44da..880ed2de2 100644 --- a/docs/uml/designer_v2/lib/uml.svg +++ b/docs/uml/designer_v2/lib/uml.svg @@ -1,16240 +1,16240 @@ - - [<abstract>GoRouteParamEnum + + [Config | - +String toRouteParam(); - +String toShortString() + <static>+isDebugMode: bool; + <static>+defaultLocale: Set<String>; + <static>+supportedLocales: Map<String, String>; + <static>+newStudyId: String; + <static>+newModelId: String; + <static>+minSplashTime: int; + <static>+formAutosaveDebounce: int ] - [RoutingIntents - | - <static>+root: RoutingIntent; - <static>+studies: RoutingIntent; - <static>+studiesShared: RoutingIntent; - <static>+publicRegistry: RoutingIntent; - <static>+study: RoutingIntent Function(String); - <static>+studyEdit: RoutingIntent Function(String); - <static>+studyEditInfo: RoutingIntent Function(String); - <static>+studyEditEnrollment: RoutingIntent Function(String); - <static>+studyEditInterventions: RoutingIntent Function(String); - <static>+studyEditIntervention: RoutingIntent Function(String, String); - <static>+studyEditMeasurements: RoutingIntent Function(String); - <static>+studyEditReports: RoutingIntent Function(String); - <static>+studyEditMeasurement: RoutingIntent Function(String, String); - <static>+studyTest: RoutingIntent Function(String, {String? appRoute}); - <static>+studyRecruit: RoutingIntent Function(String); - <static>+studyMonitor: RoutingIntent Function(String); - <static>+studyAnalyze: RoutingIntent Function(String); - <static>+studySettings: RoutingIntent Function(String); - <static>+accountSettings: RoutingIntent; - <static>+studyNew: RoutingIntent; - <static>+login: RoutingIntent; - <static>+signup: RoutingIntent; - <static>+passwordForgot: RoutingIntent; - <static>+passwordForgot2: RoutingIntent Function(String); - <static>+passwordRecovery: RoutingIntent; - <static>+error: RoutingIntent Function(Exception) + [<abstract>ResultTypes ] - [RoutingIntents]o-[RoutingIntent] - [RoutingIntents]o-[RoutingIntent Function(String)] - [RoutingIntents]o-[RoutingIntent Function(String, String)] - [RoutingIntents]o-[RoutingIntent Function(String, {String? appRoute})] - [RoutingIntents]o-[RoutingIntent Function(Exception)] - - [RoutingIntent - | - +route: GoRoute; - +params: Map<String, String>; - +queryParams: Map<String, String>; - +dispatch: RoutingIntentDispatch?; - +extra: Object?; - +routeName: String; - +arguments: Map<String, String>; - +props: List<Object?> + [MeasurementResultTypes | - -dynamic _validateRoute(); - +bool matches() + <static>+questionnaire: String; + <static>+values: List<String> ] - [RoutingIntent]o-[GoRoute] - [RoutingIntent]o-[RoutingIntentDispatch] - [<abstract>Equatable]<:-[RoutingIntent] + [<abstract>ResultTypes]<:-[MeasurementResultTypes] - [RoutingIntentDispatch + [InterventionResultTypes | - +index: int; - <static>+values: List<RoutingIntentDispatch>; - <static>+go: RoutingIntentDispatch; - <static>+push: RoutingIntentDispatch + <static>+checkmarkTask: String; + <static>+values: List<String> ] - [RoutingIntentDispatch]o-[RoutingIntentDispatch] - [Enum]<:--[RoutingIntentDispatch] + [<abstract>ResultTypes]<:-[InterventionResultTypes] - [RouterKeys + [StudyExportData | - <static>+studyKey: ValueKey<String>; - <static>+authKey: ValueKey<String> + +study: Study; + +measurementsData: List<Map<String, dynamic>>; + +interventionsData: List<Map<String, dynamic>>; + +mediaData: List<String>; + +isEmpty: bool ] - [RouterKeys]o-[ValueKey] - - [RouteParams - | - <static>+studiesFilter: String; - <static>+studyId: String; - <static>+measurementId: String; - <static>+interventionId: String; - <static>+testAppRoute: String - ] + [StudyExportData]o-[Study] - [RouterConf - | - <static>+router: GoRouter; - <static>+routes: List<GoRoute>; - <static>+publicRoutes: List<GoRoute>; - <static>+privateRoutes: List<GoRoute> + [StudyTemplates | - <static>+GoRoute route() - ] - - [RouterConf]o-[GoRouter] - - [<abstract>StudyFormRouteArgs + <static>+kUnnamedStudyTitle: String | - +studyId: String + <static>+Study emptyDraft() ] - [<abstract>QuestionFormRouteArgs + [StudyActionType | - +questionId: String + +index: int; + <static>+values: List<StudyActionType>; + <static>+pin: StudyActionType; + <static>+pinoff: StudyActionType; + <static>+edit: StudyActionType; + <static>+duplicate: StudyActionType; + <static>+duplicateDraft: StudyActionType; + <static>+addCollaborator: StudyActionType; + <static>+export: StudyActionType; + <static>+delete: StudyActionType ] - [<abstract>StudyFormRouteArgs]<:-[<abstract>QuestionFormRouteArgs] + [StudyActionType]o-[StudyActionType] + [Enum]<:--[StudyActionType] - [ScreenerQuestionFormRouteArgs + [Notifications + | + <static>+credentialsInvalid: SnackbarIntent; + <static>+userAlreadyRegistered: SnackbarIntent; + <static>+passwordReset: SnackbarIntent; + <static>+passwordResetSuccess: SnackbarIntent; + <static>+studyDeleted: SnackbarIntent; + <static>+inviteCodeDeleted: SnackbarIntent; + <static>+inviteCodeClipped: SnackbarIntent; + <static>+studyDeleteConfirmation: AlertIntent ] - [<abstract>QuestionFormRouteArgs]<:-[ScreenerQuestionFormRouteArgs] + [Notifications]o-[SnackbarIntent] + [Notifications]o-[AlertIntent] - [ConsentItemFormRouteArgs + [NotificationDefaultActions | - +consentId: String + <static>+cancel: NotificationAction ] - [<abstract>StudyFormRouteArgs]<:-[ConsentItemFormRouteArgs] + [NotificationDefaultActions]o-[NotificationAction] - [MeasurementFormRouteArgs + [<abstract>INotificationService | - +measurementId: String + +void showMessage(); + +void show(); + +Stream<NotificationIntent> watchNotifications(); + +void dispose() ] - [<abstract>StudyFormRouteArgs]<:-[MeasurementFormRouteArgs] - - [SurveyQuestionFormRouteArgs + [NotificationService | - +questionId: String + -_streamController: BehaviorSubject<NotificationIntent> + | + +Stream<NotificationIntent> watchNotifications(); + +void showMessage(); + +void show(); + +void dispose() ] - [MeasurementFormRouteArgs]<:-[SurveyQuestionFormRouteArgs] - [<abstract>QuestionFormRouteArgs]<:--[SurveyQuestionFormRouteArgs] + [NotificationService]o-[BehaviorSubject] + [<abstract>INotificationService]<:--[NotificationService] - [InterventionFormRouteArgs + [<abstract>NotificationIntent | - +interventionId: String + +message: String?; + +customContent: Widget?; + +icon: IconData?; + +actions: List<NotificationAction>?; + +type: NotificationType + | + +void register() ] - [<abstract>StudyFormRouteArgs]<:-[InterventionFormRouteArgs] + [<abstract>NotificationIntent]o-[<abstract>Widget] + [<abstract>NotificationIntent]o-[IconData] + [<abstract>NotificationIntent]o-[NotificationType] - [InterventionTaskFormRouteArgs + [NotificationAction | - +taskId: String + +label: String; + +onSelect: dynamic Function(); + +isDestructive: bool ] - [InterventionFormRouteArgs]<:-[InterventionTaskFormRouteArgs] + [NotificationAction]o-[dynamic Function()] - [ReportItemFormRouteArgs + [SnackbarIntent | - +sectionId: String + +duration: int? ] - [<abstract>StudyFormRouteArgs]<:-[ReportItemFormRouteArgs] + [<abstract>NotificationIntent]<:-[SnackbarIntent] - [<abstract>JsonFileLoader - | - +jsonAssetsPath: String + [AlertIntent | - +dynamic loadJson(); - +dynamic parseJsonMapFromAssets(); - +dynamic parseJsonListFromAssets() + +title: String; + +dismissOnAction: bool; + +isDestructive: dynamic ] - [CombinedStreamNotifier - | - -_subscriptions: List<StreamSubscription<dynamic>> + [<abstract>NotificationIntent]<:-[AlertIntent] + + [NotificationType | - +void dispose() + +index: int; + <static>+values: List<NotificationType>; + <static>+snackbar: NotificationType; + <static>+alert: NotificationType; + <static>+custom: NotificationType ] - [ChangeNotifier]<:-[CombinedStreamNotifier] + [NotificationType]o-[NotificationType] + [Enum]<:--[NotificationType] - [<abstract>IProviderArgsResolver + [<abstract>IClipboardService | - +R provide() + +dynamic copy() ] - [SuppressedBehaviorSubject - | - +subject: BehaviorSubject<T>; - +didSuppressInitialEvent: bool; - -_controller: StreamController<T> + [ClipboardService | - -StreamController<T> _buildDerivedController(); - +dynamic close() + +dynamic copy() ] - [SuppressedBehaviorSubject]o-[BehaviorSubject] - [SuppressedBehaviorSubject]o-[StreamController] + [<abstract>IClipboardService]<:--[ClipboardService] - [Time + [NotificationDispatcher | - <static>+dynamic fromTimeOfDay(); - +Map<String, dynamic> toJson(); - <static>+Time fromJson() + +child: Widget?; + +snackbarInnerPadding: double; + +snackbarWidth: double?; + +snackbarBehavior: SnackBarBehavior; + +snackbarDefaultDuration: int ] - [TimeOfDay]<:-[Time] + [NotificationDispatcher]o-[<abstract>Widget] + [NotificationDispatcher]o-[SnackBarBehavior] - [TimeValueAccessor + [Assets | - +String modelToViewValue(); - +Time? viewToModelValue(); - -String _addLeadingZeroIfNeeded() + <static>+logoWide: String ] - [<abstract>ControlValueAccessor]<:-[TimeValueAccessor] - - [Tuple + [AsyncValueWidget | - +first: T1; - +second: T2; - +props: List<Object?> + +value: AsyncValue<T>; + +data: Widget Function(T); + +error: Widget Function(Object, StackTrace?)?; + +loading: Widget Function()?; + +empty: Widget Function()? | - +Map<String, dynamic> toJson(); - <static>+Tuple<dynamic, dynamic> fromJson(); - +Tuple<T1, T2> copy(); - +Tuple<T1, T2> copyWith() + +Widget build(); + -Widget _buildDataOrEmptyWidget(); + -Widget _defaultError(); + -Widget _defaultLoad() ] - [<abstract>Equatable]<:-[Tuple] + [AsyncValueWidget]o-[<abstract>AsyncValue] + [AsyncValueWidget]o-[Widget Function(T)] + [AsyncValueWidget]o-[Widget Function(Object, StackTrace?)?] + [AsyncValueWidget]o-[Widget Function()?] - [OptimisticUpdate + [FormControlLabel | - +applyOptimistic: void Function(); - +apply: dynamic Function(); - +rollback: void Function(); - +onUpdate: void Function()?; - +onError: void Function(Object, StackTrace?)?; - +rethrowErrors: bool; - +runOptimistically: bool; - +completeFutureOptimistically: bool + +formControl: AbstractControl<dynamic>; + +text: String; + +isClickable: bool; + +textStyle: TextStyle?; + +onClick: void Function(AbstractControl<dynamic>)? | - +dynamic execute(); - -void _runUpdateHandlerIfAny() + +Widget build() ] - [OptimisticUpdate]o-[void Function()] - [OptimisticUpdate]o-[dynamic Function()] - [OptimisticUpdate]o-[void Function()?] - [OptimisticUpdate]o-[void Function(Object, StackTrace?)?] + [FormControlLabel]o-[<abstract>AbstractControl] + [FormControlLabel]o-[TextStyle] + [FormControlLabel]o-[void Function(AbstractControl<dynamic>)?] - [SerializableColor + [ActionPopUpMenuButton | - +Map<String, dynamic> toJson(); - <static>+SerializableColor fromJson() + +actions: List<ModelAction<dynamic>>; + +triggerIconColor: Color?; + +triggerIconColorHover: Color?; + +triggerIconSize: double; + +disableSplashEffect: bool; + +hideOnEmpty: bool; + +orientation: Axis; + +elevation: double?; + +splashRadius: double?; + +enabled: bool; + +position: PopupMenuPosition + | + +Widget build(); + -Widget _buildPopupMenu() ] - [Color]<:-[SerializableColor] + [ActionPopUpMenuButton]o-[Color] + [ActionPopUpMenuButton]o-[Axis] + [ActionPopUpMenuButton]o-[PopupMenuPosition] - [<abstract>FileFormatEncoder + [Search | - +dynamic encodeAsync(); - +String encode(); - +dynamic call() + +onQueryChanged: dynamic Function(String); + +searchController: SearchController?; + +hintText: String?; + +initialText: String? ] - [CSVStringEncoder + [Search]o-[dynamic Function(String)] + [Search]o-[SearchController] + + [SearchController | - +String encode() + +setText: void Function(String) ] - [<abstract>FileFormatEncoder]<:-[CSVStringEncoder] + [SearchController]o-[void Function(String)] - [JsonStringEncoder + [FormScaffold | - +String encode() + +formViewModel: T; + +actions: List<Widget>?; + +body: Widget; + +drawer: Widget?; + +actionsSpacing: double; + +actionsPadding: double ] - [<abstract>FileFormatEncoder]<:-[JsonStringEncoder] + [FormScaffold]o-[<abstract>Widget] - [NumericalRangeFormatter + [ConstrainedWidthFlexible | - +min: int?; - +max: int? + +minWidth: double; + +maxWidth: double; + +flex: int; + +flexSum: int; + +child: Widget; + +outerConstraints: BoxConstraints | - +TextEditingValue formatEditUpdate() + +Widget build(); + -double _getWidth() ] - [<abstract>TextInputFormatter]<:-[NumericalRangeFormatter] + [ConstrainedWidthFlexible]o-[<abstract>Widget] + [ConstrainedWidthFlexible]o-[BoxConstraints] - [StudySequenceFormatter + [PrimaryButton | - +TextEditingValue formatEditUpdate() + +text: String; + +icon: IconData?; + +isLoading: bool; + +showLoadingEarliestAfterMs: int; + +onPressed: void Function()?; + +tooltip: String; + +tooltipDisabled: String; + +enabled: bool; + +onPressedFuture: dynamic Function()?; + +innerPadding: EdgeInsets; + +minimumSize: Size?; + +isDisabled: bool ] - [<abstract>TextInputFormatter]<:-[StudySequenceFormatter] + [PrimaryButton]o-[IconData] + [PrimaryButton]o-[void Function()?] + [PrimaryButton]o-[dynamic Function()?] + [PrimaryButton]o-[EdgeInsets] + [PrimaryButton]o-[Size] - [CountWhereValidator - | - +predicate: bool Function(T?); - +minCount: int?; - +maxCount: int?; - <static>+kValidationMessageMinCount: String; - <static>+kValidationMessageMaxCount: String + [FormTableRow | - +Map<String, dynamic>? validate() + +label: String?; + +labelBuilder: Widget Function(BuildContext)?; + +labelStyle: TextStyle?; + +labelHelpText: String?; + +input: Widget; + +control: AbstractControl<dynamic>?; + +layout: FormTableRowLayout? ] - [CountWhereValidator]o-[bool Function(T?)] - [<abstract>Validator]<:-[CountWhereValidator] + [FormTableRow]o-[Widget Function(BuildContext)?] + [FormTableRow]o-[TextStyle] + [FormTableRow]o-[<abstract>Widget] + [FormTableRow]o-[<abstract>AbstractControl] + [FormTableRow]o-[FormTableRowLayout] - [Patterns + [FormTableLayout | - <static>+timeFormatString: String; - <static>+emailFormatString: String; - <static>+url: String + +rows: List<FormTableRow>; + +columnWidths: Map<int, TableColumnWidth>; + +rowDivider: Widget?; + +rowLayout: FormTableRowLayout?; + +rowLabelStyle: TextStyle? + | + +Widget build() ] - [<abstract>ExecutionLimiter + [FormTableLayout]o-[<abstract>Widget] + [FormTableLayout]o-[FormTableRowLayout] + [FormTableLayout]o-[TextStyle] + + [FormSectionHeader | - +milliseconds: int; - <static>-_timer: Timer? + +title: String; + +titleTextStyle: TextStyle?; + +helpText: String?; + +divider: bool; + +helpTextDisabled: bool | - +void dispose() + +Widget build() ] - [<abstract>ExecutionLimiter]o-[Timer] + [FormSectionHeader]o-[TextStyle] - [Debouncer + [FormLabel | - +leading: bool; - +cancelUncompleted: bool; - -_uncompletedFutureOperation: CancelableOperation<dynamic>? + +labelText: String?; + +helpText: String?; + +labelTextStyle: TextStyle?; + +layout: FormTableRowLayout? | - +dynamic call() + +Widget build() ] - [Debouncer]o-[CancelableOperation] - [<abstract>ExecutionLimiter]<:-[Debouncer] + [FormLabel]o-[TextStyle] + [FormLabel]o-[FormTableRowLayout] - [Throttler + [FormTableRowLayout | - +dynamic call() + +index: int; + <static>+values: List<FormTableRowLayout>; + <static>+vertical: FormTableRowLayout; + <static>+horizontal: FormTableRowLayout ] - [<abstract>ExecutionLimiter]<:-[Throttler] + [FormTableRowLayout]o-[FormTableRowLayout] + [Enum]<:--[FormTableRowLayout] - [ModelAction + [DismissButton | - +type: T; - +label: String; - +icon: IconData?; - +onExecute: Function; - +isAvailable: bool; - +isDestructive: bool + +onPressed: void Function()?; + +text: String? + | + +Widget build() ] - [ModelAction]o-[IconData] + [DismissButton]o-[void Function()?] - [<abstract>IModelActionProvider + [Badge | - +List<ModelAction<dynamic>> availableActions() - ] - - [<abstract>IListActionProvider + +icon: IconData?; + +color: Color?; + +borderRadius: double; + +label: String; + +type: BadgeType; + +padding: EdgeInsets; + +iconSize: double?; + +labelStyle: TextStyle?; + +center: bool | - +void onSelectItem(); - +void onNewItem() + +Widget build(); + -Color? _getBackgroundColor(); + -Color _getBorderColor(); + -Color? _getLabelColor() ] - [<abstract>IModelActionProvider]<:-[<abstract>IListActionProvider] + [Badge]o-[IconData] + [Badge]o-[Color] + [Badge]o-[BadgeType] + [Badge]o-[EdgeInsets] + [Badge]o-[TextStyle] - [ModelActionType + [BadgeType | +index: int; - <static>+values: List<ModelActionType>; - <static>+edit: ModelActionType; - <static>+delete: ModelActionType; - <static>+remove: ModelActionType; - <static>+duplicate: ModelActionType; - <static>+clipboard: ModelActionType; - <static>+primary: ModelActionType + <static>+values: List<BadgeType>; + <static>+filled: BadgeType; + <static>+outlined: BadgeType; + <static>+outlineFill: BadgeType; + <static>+plain: BadgeType ] - [ModelActionType]o-[ModelActionType] - [Enum]<:--[ModelActionType] - - [Config - | - <static>+isDebugMode: bool; - <static>+defaultLocale: Set<String>; - <static>+supportedLocales: Map<String, String>; - <static>+newStudyId: String; - <static>+newModelId: String; - <static>+minSplashTime: int; - <static>+formAutosaveDebounce: int - ] + [BadgeType]o-[BadgeType] + [Enum]<:--[BadgeType] - [<abstract>IAuthRepository + [StandardDialog | - +allowPasswordReset: bool; - +currentUser: User?; - +isLoggedIn: bool; - +session: Session?; - +serializedSession: String? + +title: Widget?; + +titleText: String?; + +body: Widget; + +actionButtons: List<Widget>; + +backgroundColor: Color?; + +borderRadius: double?; + +width: double?; + +height: double?; + +minWidth: double; + +minHeight: double; + +maxWidth: double?; + +maxHeight: double?; + +padding: EdgeInsets | - +dynamic signUp(); - +dynamic signInWith(); - +dynamic signOut(); - +dynamic resetPasswordForEmail(); - +dynamic updateUser(); - +void dispose() + +Widget build() ] - [<abstract>IAuthRepository]o-[User] - [<abstract>IAuthRepository]o-[Session] - [<abstract>IAppDelegate]<:-[<abstract>IAuthRepository] + [StandardDialog]o-[<abstract>Widget] + [StandardDialog]o-[Color] + [StandardDialog]o-[EdgeInsets] - [AuthRepository - | - +supabaseClient: SupabaseClient; - +allowPasswordReset: bool; - +authClient: GoTrueClient; - +session: Session?; - +serializedSession: String?; - +currentUser: User?; - +isLoggedIn: bool + [<abstract>ISyncIndicatorViewModel | - -void _registerAuthListener(); - +dynamic signUp(); - +dynamic signInWith(); - +dynamic signOut(); - +dynamic resetPasswordForEmail(); - +dynamic updateUser(); - +void dispose(); - +dynamic onAppStart() + +isDirty: bool; + +lastSynced: DateTime? ] - [AuthRepository]o-[SupabaseClient] - [AuthRepository]o-[GoTrueClient] - [AuthRepository]o-[Session] - [AuthRepository]o-[User] - [<abstract>IAuthRepository]<:--[AuthRepository] - - [<abstract>IInviteCodeRepository + [SyncIndicator | - +dynamic isCodeAlreadyUsed() + +state: AsyncValue<T>; + +lastSynced: DateTime?; + +isDirty: bool; + +animationDuration: int; + +iconSize: double ] - [<abstract>ModelRepository]<:--[<abstract>IInviteCodeRepository] + [SyncIndicator]o-[<abstract>AsyncValue] - [InviteCodeRepository - | - +studyId: String; - +ref: ProviderRef<dynamic>; - +apiClient: StudyUApi; - +authRepository: IAuthRepository; - +studyRepository: IStudyRepository; - +study: Study + [<abstract>IWithBanner | - +String getKey(); - +dynamic isCodeAlreadyUsed(); - +List<ModelAction<dynamic>> availableActions(); - +dynamic emitUpdate() + +Widget? banner() ] - [InviteCodeRepository]o-[<abstract>ProviderRef] - [InviteCodeRepository]o-[<abstract>StudyUApi] - [InviteCodeRepository]o-[<abstract>IAuthRepository] - [InviteCodeRepository]o-[<abstract>IStudyRepository] - [InviteCodeRepository]o-[Study] - [<abstract>ModelRepository]<:-[InviteCodeRepository] - [<abstract>IInviteCodeRepository]<:--[InviteCodeRepository] - - [InviteCodeRepositoryDelegate - | - +study: Study; - +apiClient: StudyUApi; - +studyRepository: IStudyRepository + [BannerBox | - +dynamic fetch(); - +dynamic fetchAll(); - +dynamic save(); - +dynamic delete(); - +dynamic onError(); - +StudyInvite createDuplicate(); - +StudyInvite createNewInstance() + +prefixIcon: Widget?; + +body: Widget; + +style: BannerStyle; + +padding: EdgeInsets?; + +noPrefix: bool; + +dismissable: bool; + +isDismissed: bool?; + +onDismissed: dynamic Function()?; + +dismissIconSize: double ] - [InviteCodeRepositoryDelegate]o-[Study] - [InviteCodeRepositoryDelegate]o-[<abstract>StudyUApi] - [InviteCodeRepositoryDelegate]o-[<abstract>IStudyRepository] - [<abstract>IModelRepositoryDelegate]<:-[InviteCodeRepositoryDelegate] + [BannerBox]o-[<abstract>Widget] + [BannerBox]o-[BannerStyle] + [BannerBox]o-[EdgeInsets] + [BannerBox]o-[dynamic Function()?] - [StudyLaunched + [BannerStyle + | + +index: int; + <static>+values: List<BannerStyle>; + <static>+warning: BannerStyle; + <static>+info: BannerStyle; + <static>+error: BannerStyle ] - [<abstract>ModelEvent]<:-[StudyLaunched] + [BannerStyle]o-[BannerStyle] + [Enum]<:--[BannerStyle] - [WrappedModel + [ActionMenuInline | - -_model: T; - +asyncValue: AsyncValue<T>; - +isLocalOnly: bool; - +isDirty: bool; - +isDeleted: bool; - +lastSaved: DateTime?; - +lastFetched: DateTime?; - +lastUpdated: DateTime?; - +model: T + +actions: List<ModelAction<dynamic>>; + +iconSize: double?; + +visible: bool; + +splashRadius: double?; + +paddingVertical: double?; + +paddingHorizontal: double? | - +dynamic markWithError(); - +dynamic markAsLoading(); - +dynamic markAsFetched(); - +dynamic markAsSaved() + +Widget build() ] - [WrappedModel]o-[<abstract>AsyncValue] - - [ModelRepositoryException + [Collapsible + | + +contentBuilder: Widget Function(BuildContext, bool); + +headerBuilder: Widget Function(BuildContext, bool)?; + +title: String?; + +isCollapsed: bool ] - [Exception]<:--[ModelRepositoryException] + [Collapsible]o-[Widget Function(BuildContext, bool)] + [Collapsible]o-[Widget Function(BuildContext, bool)?] - [ModelNotFoundException + [NavbarTab + | + +title: String; + +intent: RoutingIntent?; + +index: int; + +enabled: bool ] - [ModelRepositoryException]<:--[ModelNotFoundException] + [NavbarTab]o-[RoutingIntent] - [<abstract>IModelRepository + [TabbedNavbar | - +String getKey(); - +WrappedModel<T>? get(); - +dynamic fetchAll(); - +dynamic fetch(); - +dynamic save(); - +dynamic delete(); - +dynamic duplicateAndSave(); - +dynamic duplicateAndSaveFromRemote(); - +Stream<WrappedModel<T>> watch(); - +Stream<List<WrappedModel<T>>> watchAll(); - +Stream<ModelEvent<T>> watchChanges(); - +Stream<ModelEvent<T>> watchAllChanges(); - +dynamic ensurePersisted(); - +void dispose() + +tabs: List<T>; + +selectedTab: T?; + +indicator: BoxDecoration?; + +height: double?; + +disabledBackgroundColor: Color?; + +disabledTooltipText: String?; + +onSelect: void Function(int, T)?; + +labelPadding: EdgeInsets?; + +labelSpacing: double?; + +indicatorSize: TabBarIndicatorSize?; + +isScrollable: bool; + +backgroundColor: Color?; + +labelColorHover: Color?; + +unselectedLabelColorHover: Color? ] - [<abstract>IModelActionProvider]<:--[<abstract>IModelRepository] + [TabbedNavbar]o-[BoxDecoration] + [TabbedNavbar]o-[Color] + [TabbedNavbar]o-[void Function(int, T)?] + [TabbedNavbar]o-[EdgeInsets] + [TabbedNavbar]o-[TabBarIndicatorSize] - [<abstract>IModelRepositoryDelegate + [SidesheetTab | - +dynamic fetchAll(); - +dynamic fetch(); - +dynamic save(); - +dynamic delete(); - +T createNewInstance(); - +T createDuplicate(); - +dynamic onError() + +builder: Widget Function(BuildContext) ] - [<abstract>ModelRepository + [SidesheetTab]o-[Widget Function(BuildContext)] + [NavbarTab]<:-[SidesheetTab] + + [Sidesheet | - +delegate: IModelRepositoryDelegate<T>; - -_allModelsStreamController: BehaviorSubject<List<WrappedModel<T>>>; - -_allModelEventsStreamController: BehaviorSubject<ModelEvent<T>>; - +modelStreamControllers: Map<String, BehaviorSubject<WrappedModel<T>>>; - +modelEventsStreamControllers: Map<String, BehaviorSubject<ModelEvent<T>>>; - -_allModels: Map<String, WrappedModel<T>> - | - +WrappedModel<T>? get(); - +dynamic fetchAll(); - +dynamic fetch(); - +dynamic save(); - +dynamic delete(); - +dynamic duplicateAndSave(); - +dynamic duplicateAndSaveFromRemote(); - +Stream<List<WrappedModel<T>>> watchAll(); - +Stream<WrappedModel<T>> watch(); - +Stream<ModelEvent<T>> watchAllChanges(); - +Stream<ModelEvent<T>> watchChanges(); - -dynamic _buildModelSpecificController(); - +dynamic ensurePersisted(); - +WrappedModel<T> upsertLocally(); - +List<WrappedModel<T>> upsertAllLocally(); - +dynamic emitUpdate(); - +dynamic emitModelEvent(); - +dynamic emitError(); - +void dispose(); - +List<ModelAction<dynamic>> availableActions() + <static>+kDefaultWidth: double; + +titleText: String; + +body: Widget?; + +tabs: List<SidesheetTab>?; + +actionButtons: List<Widget>?; + +width: double?; + +withCloseButton: bool; + +ignoreAppBar: bool; + +collapseSingleTab: bool; + +bodyPadding: EdgeInsets?; + +wrapContent: Widget Function(Widget)? ] - [<abstract>ModelRepository]o-[<abstract>IModelRepositoryDelegate] - [<abstract>ModelRepository]o-[BehaviorSubject] - [<abstract>IModelRepository]<:-[<abstract>ModelRepository] + [Sidesheet]o-[<abstract>Widget] + [Sidesheet]o-[EdgeInsets] + [Sidesheet]o-[Widget Function(Widget)?] - [<abstract>StudyUApi + [FormSideSheetTab | - +dynamic saveStudy(); - +dynamic fetchStudy(); - +dynamic getUserStudies(); - +dynamic deleteStudy(); - +dynamic saveStudyInvite(); - +dynamic fetchStudyInvite(); - +dynamic deleteStudyInvite(); - +dynamic deleteParticipants(); - +dynamic fetchAppConfig(); - +dynamic fetchUser(); - +dynamic saveUser() - ] - - [APIException - ] - - [Exception]<:--[APIException] - - [StudyNotFoundException + +formViewBuilder: Widget Function(T) ] - [APIException]<:-[StudyNotFoundException] + [FormSideSheetTab]o-[Widget Function(T)] + [NavbarTab]<:-[FormSideSheetTab] - [MeasurementNotFoundException + [HelpIcon + | + +tooltipText: String? + | + +Widget build() ] - [APIException]<:-[MeasurementNotFoundException] - - [QuestionNotFoundException + [EmptyBody + | + +icon: IconData?; + +leading: Widget?; + +leadingSpacing: double?; + +title: String?; + +description: String?; + +button: Widget? + | + +Widget build() ] - [APIException]<:-[QuestionNotFoundException] + [EmptyBody]o-[IconData] + [EmptyBody]o-[<abstract>Widget] - [ConsentItemNotFoundException + [IndicatorRangeSliderThumbShape + | + +buildContext: BuildContext; + +start: T; + +end: T + | + +Size getPreferredSize(); + +void paint() ] - [APIException]<:-[ConsentItemNotFoundException] + [IndicatorRangeSliderThumbShape]o-[<abstract>BuildContext] + [<abstract>RangeSliderThumbShape]<:-[IndicatorRangeSliderThumbShape] - [InterventionNotFoundException + [MouseEventsRegion + | + +onTap: void Function()?; + +onHover: void Function(PointerHoverEvent)?; + +onEnter: void Function(PointerEnterEvent)?; + +onExit: void Function(PointerExitEvent)?; + +autoselectCursor: bool; + +cursor: SystemMouseCursor; + <static>+defaultCursor: SystemMouseCursor; + +autoCursor: SystemMouseCursor ] - [APIException]<:-[InterventionNotFoundException] + [MouseEventsRegion]o-[void Function()?] + [MouseEventsRegion]o-[void Function(PointerHoverEvent)?] + [MouseEventsRegion]o-[void Function(PointerEnterEvent)?] + [MouseEventsRegion]o-[void Function(PointerExitEvent)?] + [MouseEventsRegion]o-[SystemMouseCursor] - [InterventionTaskNotFoundException + [ReactiveCustomColorPicker ] - [APIException]<:-[InterventionTaskNotFoundException] + [ReactiveFormField]<:-[ReactiveCustomColorPicker] - [ReportNotFoundException + [TextParagraph + | + +text: String?; + +style: TextStyle?; + +selectable: bool; + +span: List<TextSpan>? + | + +Widget build() ] - [APIException]<:-[ReportNotFoundException] + [TextParagraph]o-[TextStyle] - [ReportSectionNotFoundException + [UnderConstruction + | + +Widget build() ] - [APIException]<:-[ReportSectionNotFoundException] - - [StudyInviteNotFoundException + [NullHelperDecoration ] - [APIException]<:-[StudyInviteNotFoundException] + [InputDecoration]<:-[NullHelperDecoration] - [UserNotFoundException + [ActionMenuType + | + +index: int; + <static>+values: List<ActionMenuType>; + <static>+inline: ActionMenuType; + <static>+popup: ActionMenuType ] - [APIException]<:-[UserNotFoundException] + [ActionMenuType]o-[ActionMenuType] + [Enum]<:--[ActionMenuType] - [StudyUApiClient + [HtmlStylingBanner | - +supabaseClient: SupabaseClient; - <static>+studyColumns: List<String>; - <static>+studyWithParticipantActivityColumns: List<String>; - +testDelayMilliseconds: int + +isDismissed: bool; + +onDismissed: dynamic Function()? | - +dynamic deleteParticipants(); - +dynamic getUserStudies(); - +dynamic fetchStudy(); - +dynamic deleteStudy(); - +dynamic saveStudy(); - +dynamic fetchStudyInvite(); - +dynamic saveStudyInvite(); - +dynamic deleteStudyInvite(); - +dynamic fetchAppConfig(); - +dynamic fetchUser(); - +dynamic saveUser(); - -dynamic _awaitGuarded(); - -dynamic _apiException(); - -dynamic _testDelay() + +Widget build() ] - [StudyUApiClient]o-[SupabaseClient] - [<abstract>SupabaseClientDependant]<:-[StudyUApiClient] - [<abstract>SupabaseQueryMixin]<:-[StudyUApiClient] - [<abstract>StudyUApi]<:--[StudyUApiClient] + [HtmlStylingBanner]o-[dynamic Function()?] - [<abstract>ModelEvent + [<abstract>FormConsumerWidget | - +modelId: String; - +model: T + +Widget build() ] - [IsFetched + [<abstract>FormConsumerRefWidget + | + +Widget build() ] - [<abstract>ModelEvent]<:-[IsFetched] - - [IsSaving + [SplashPage + | + +Widget build() ] - [<abstract>ModelEvent]<:-[IsSaving] - - [IsSaved + [ErrorPage + | + +error: Exception? + | + +Widget build() ] - [<abstract>ModelEvent]<:-[IsSaved] + [<abstract>ConsumerWidget]<:-[ErrorPage] - [IsDeleted + [StudyULogo + | + +onTap: void Function()? + | + +Widget build() ] - [<abstract>ModelEvent]<:-[IsDeleted] + [StudyULogo]o-[void Function()?] - [<abstract>SupabaseClientDependant + [SingleColumnLayout | - +supabaseClient: SupabaseClient + <static>+defaultConstraints: BoxConstraints; + <static>+defaultConstraintsNarrow: BoxConstraints; + +body: Widget; + +header: Widget?; + +stickyHeader: bool; + +constraints: BoxConstraints?; + +scroll: bool; + +padding: EdgeInsets? + | + <static>+dynamic fromType() ] - [<abstract>SupabaseClientDependant]o-[SupabaseClient] + [SingleColumnLayout]o-[BoxConstraints] + [SingleColumnLayout]o-[<abstract>Widget] + [SingleColumnLayout]o-[EdgeInsets] - [SupabaseQueryError + [SingleColumnLayoutType | - +statusCode: String?; - +message: String; - +details: dynamic + +index: int; + <static>+values: List<SingleColumnLayoutType>; + <static>+boundedWide: SingleColumnLayoutType; + <static>+boundedNarrow: SingleColumnLayoutType; + <static>+stretched: SingleColumnLayoutType; + <static>+split: SingleColumnLayoutType ] - [Exception]<:--[SupabaseQueryError] + [SingleColumnLayoutType]o-[SingleColumnLayoutType] + [Enum]<:--[SingleColumnLayoutType] - [<abstract>SupabaseQueryMixin + [Hyperlink | - +dynamic deleteAll(); - +dynamic getAll(); - +dynamic getById(); - +dynamic getByColumn(); - +List<T> deserializeList(); - +T deserializeObject() - ] - - [<abstract>IStudyRepository - | - +dynamic launch(); - +dynamic deleteParticipants() + +text: String; + +url: String?; + +onClick: void Function()?; + +linkColor: Color; + +hoverColor: Color?; + +visitedColor: Color?; + +style: TextStyle?; + +hoverStyle: TextStyle?; + +visitedStyle: TextStyle?; + +icon: IconData?; + +iconSize: double? ] - [<abstract>ModelRepository]<:--[<abstract>IStudyRepository] + [Hyperlink]o-[void Function()?] + [Hyperlink]o-[Color] + [Hyperlink]o-[TextStyle] + [Hyperlink]o-[IconData] - [StudyRepository - | - +apiClient: StudyUApi; - +authRepository: IAuthRepository; - +ref: ProviderRef<dynamic>; - +sortCallback: void Function()? + [StandardTableColumn | - +String getKey(); - +dynamic deleteParticipants(); - +dynamic launch(); - +List<ModelAction<dynamic>> availableActions() + +label: String; + +tooltip: String?; + +columnWidth: TableColumnWidth; + +sortable: bool; + +sortAscending: bool?; + +sortableIcon: Widget? ] - [StudyRepository]o-[<abstract>StudyUApi] - [StudyRepository]o-[<abstract>IAuthRepository] - [StudyRepository]o-[<abstract>ProviderRef] - [StudyRepository]o-[void Function()?] - [<abstract>ModelRepository]<:-[StudyRepository] - [<abstract>IStudyRepository]<:--[StudyRepository] + [StandardTableColumn]o-[<abstract>TableColumnWidth] + [StandardTableColumn]o-[<abstract>Widget] - [StudyRepositoryDelegate - | - +apiClient: StudyUApi; - +authRepository: IAuthRepository + [StandardTable | - +dynamic fetchAll(); - +dynamic fetch(); - +dynamic save(); - +dynamic delete(); - +dynamic onError(); - +Study createNewInstance(); - +Study createDuplicate() + +items: List<T>; + +inputColumns: List<StandardTableColumn>; + +onSelectItem: void Function(T); + +trailingActionsAt: List<ModelAction<dynamic>> Function(T, int)?; + +trailingActionsMenuType: ActionMenuType?; + +sortColumnPredicates: List<int Function(T, T)?>?; + +pinnedPredicates: int Function(T, T)?; + +headerRowBuilder: TableRow Function(BuildContext, List<StandardTableColumn>)?; + +dataRowBuilder: TableRow Function(BuildContext, List<StandardTableColumn>)?; + +inputTrailingActionsColumn: StandardTableColumn; + +tableWrapper: Widget Function(Widget)?; + +cellSpacing: double; + +rowSpacing: double; + +minRowHeight: double?; + +showTableHeader: bool; + +hideLeadingTrailingWhenEmpty: bool; + +leadingWidget: Widget?; + +trailingWidget: Widget?; + +leadingWidgetSpacing: double?; + +trailingWidgetSpacing: double?; + +emptyWidget: Widget?; + +rowStyle: StandardTableStyle; + +disableRowInteractions: bool ] - [StudyRepositoryDelegate]o-[<abstract>StudyUApi] - [StudyRepositoryDelegate]o-[<abstract>IAuthRepository] - [<abstract>IModelRepositoryDelegate]<:-[StudyRepositoryDelegate] + [StandardTable]o-[void Function(T)] + [StandardTable]o-[List<ModelAction<dynamic>> Function(T, int)?] + [StandardTable]o-[ActionMenuType] + [StandardTable]o-[int Function(T, T)?] + [StandardTable]o-[TableRow Function(BuildContext, List<StandardTableColumn>)?] + [StandardTable]o-[StandardTableColumn] + [StandardTable]o-[Widget Function(Widget)?] + [StandardTable]o-[<abstract>Widget] + [StandardTable]o-[StandardTableStyle] - [<abstract>IUserRepository - | - +user: StudyUUser + [StandardTableStyle | - +dynamic fetchUser(); - +dynamic saveUser(); - +dynamic updatePreferences() + +index: int; + <static>+values: List<StandardTableStyle>; + <static>+plain: StandardTableStyle; + <static>+material: StandardTableStyle ] - [<abstract>IUserRepository]o-[StudyUUser] + [StandardTableStyle]o-[StandardTableStyle] + [Enum]<:--[StandardTableStyle] - [UserRepository + [IconPack | - +apiClient: StudyUApi; - +authRepository: IAuthRepository; - +ref: Ref<Object?>; - +user: StudyUUser + <static>+defaultPack: List<IconOption>; + <static>+material: List<IconOption> | - +dynamic fetchUser(); - +dynamic saveUser(); - +dynamic updatePreferences() + <static>+IconOption? resolveIconByName() ] - [UserRepository]o-[<abstract>StudyUApi] - [UserRepository]o-[<abstract>IAuthRepository] - [UserRepository]o-[<abstract>Ref] - [UserRepository]o-[StudyUUser] - [<abstract>IUserRepository]<:--[UserRepository] - - [PreferenceAction + [IconOption | - +index: int; - <static>+values: List<PreferenceAction>; - <static>+pin: PreferenceAction; - <static>+pinOff: PreferenceAction + +name: String; + +icon: IconData?; + +isEmpty: bool; + +props: List<Object?> + | + +String toJson(); + <static>+IconOption fromJson() ] - [PreferenceAction]o-[PreferenceAction] - [Enum]<:--[PreferenceAction] + [IconOption]o-[IconData] + [<abstract>Equatable]<:-[IconOption] - [<abstract>IAppRepository - | - +dynamic fetchAppConfig(); - +void dispose() + [ReactiveIconPicker ] - [AppRepository + [ReactiveFocusableFormField]<:-[ReactiveIconPicker] + + [IconPicker | - +apiClient: StudyUApi + +iconOptions: List<IconOption>; + +selectedOption: IconOption?; + +onSelect: void Function(IconOption)?; + +galleryIconSize: double?; + +selectedIconSize: double?; + +focusNode: FocusNode?; + +isDisabled: bool | - +dynamic fetchAppConfig(); - +void dispose() + +Widget build() ] - [AppRepository]o-[<abstract>StudyUApi] - [<abstract>IAppRepository]<:--[AppRepository] + [IconPicker]o-[IconOption] + [IconPicker]o-[void Function(IconOption)?] + [IconPicker]o-[FocusNode] - [WebFrame + [IconPickerField | - +previewSrc: String; - +studyId: String + +iconOptions: List<IconOption>; + +selectedOption: IconOption?; + +selectedIconSize: double?; + +galleryIconSize: double?; + +onSelect: void Function(IconOption)?; + +focusNode: FocusNode?; + +isDisabled: bool | +Widget build() ] - [DisabledFrame + [IconPickerField]o-[IconOption] + [IconPickerField]o-[void Function(IconOption)?] + [IconPickerField]o-[FocusNode] + + [IconPickerGallery + | + +iconOptions: List<IconOption>; + +onSelect: void Function(IconOption)?; + +iconSize: double | +Widget build() ] - [PhoneContainer + [IconPickerGallery]o-[void Function(IconOption)?] + + [SecondaryButton | - <static>+defaultWidth: double; - <static>+defaultHeight: double; - +width: double; - +height: double; - +borderColor: Color; - +borderWidth: double; - +borderRadius: double; - +innerContent: Widget; - +innerContentBackgroundColor: Color? + +text: String; + +icon: IconData?; + +isLoading: bool; + +onPressed: void Function()? | +Widget build() ] - [PhoneContainer]o-[Color] - [PhoneContainer]o-[<abstract>Widget] + [SecondaryButton]o-[IconData] + [SecondaryButton]o-[void Function()?] - [MobileFrame + [TwoColumnLayout | - +Widget build() + <static>+defaultDivider: VerticalDivider; + <static>+defaultContentPadding: EdgeInsets; + <static>+slimContentPadding: EdgeInsets; + +leftWidget: Widget; + +rightWidget: Widget; + +dividerWidget: Widget?; + +headerWidget: Widget?; + +flexLeft: int?; + +flexRight: int?; + +constraintsLeft: BoxConstraints?; + +constraintsRight: BoxConstraints?; + +scrollLeft: bool; + +scrollRight: bool; + +paddingLeft: EdgeInsets?; + +paddingRight: EdgeInsets?; + +backgroundColorLeft: Color?; + +backgroundColorRight: Color?; + +stretchHeight: bool ] - [DesktopFrame + [TwoColumnLayout]o-[VerticalDivider] + [TwoColumnLayout]o-[EdgeInsets] + [TwoColumnLayout]o-[<abstract>Widget] + [TwoColumnLayout]o-[BoxConstraints] + [TwoColumnLayout]o-[Color] + + [AppTranslation | - +Widget build() + <static>+dynamic init() ] - [StudyController + [<abstract>PlatformLocale | - +notificationService: INotificationService; - +studyEventsSubscription: StreamSubscription<ModelEvent<Study>>?; - +studyActions: List<ModelAction<dynamic>> + +Locale getPlatformLocale() + ] + + [PlatformLocaleWeb | - +dynamic syncStudyStatus(); - +dynamic onStudySubscriptionUpdate(); - -dynamic _redirectNewToActualStudyID(); - +dynamic publishStudy(); - +void onChangeStudyParticipation(); - +void onAddParticipants(); - +void onSettingsPressed(); - +void dispose() + +Locale getPlatformLocale() ] - [StudyController]o-[<abstract>INotificationService] - [StudyController]o-[StreamSubscription] - [StudyBaseController]<:-[StudyController] + [<abstract>PlatformLocale]<:--[PlatformLocaleWeb] - [<abstract>IStudyAppBarViewModel + [PlatformLocaleMobile | - +isSyncIndicatorVisible: bool; - +isStatusBadgeVisible: bool; - +isPublishVisible: bool + +Locale getPlatformLocale() ] - [<abstract>IStudyStatusBadgeViewModel]<:--[<abstract>IStudyAppBarViewModel] - [<abstract>IStudyNavViewModel]<:--[<abstract>IStudyAppBarViewModel] + [<abstract>PlatformLocale]<:--[PlatformLocaleMobile] - [StudyScaffold + [LanguagePicker | - +studyId: String; - +tabs: List<NavbarTab>?; - +tabsSubnav: List<NavbarTab>?; - +selectedTab: NavbarTab?; - +selectedTabSubnav: NavbarTab?; - +body: StudyPageWidget; - +drawer: Widget?; - +disableActions: bool; - +actionsSpacing: double; - +actionsPadding: double; - +layoutType: SingleColumnLayoutType?; - +appbarHeight: double; - +appbarSubnavHeight: double + +languagePickerType: LanguagePickerType; + +iconColor: Color?; + +offset: Offset? ] - [StudyScaffold]o-[NavbarTab] - [StudyScaffold]o-[<abstract>StudyPageWidget] - [StudyScaffold]o-[<abstract>Widget] - [StudyScaffold]o-[SingleColumnLayoutType] + [LanguagePicker]o-[LanguagePickerType] + [LanguagePicker]o-[Color] + [LanguagePicker]o-[Offset] - [PreviewFrame + [LanguagePickerType | - +studyId: String; - +routeArgs: StudyFormRouteArgs?; - +route: String? + +index: int; + <static>+values: List<LanguagePickerType>; + <static>+field: LanguagePickerType; + <static>+icon: LanguagePickerType ] - [PreviewFrame]o-[<abstract>StudyFormRouteArgs] + [LanguagePickerType]o-[LanguagePickerType] + [Enum]<:--[LanguagePickerType] - [RouteInformation - | - +route: String?; - +extra: String?; - +cmd: String?; - +data: String? + [<abstract>GoRouteParamEnum | - +String toString() + +String toRouteParam(); + +String toShortString() ] - [<abstract>PlatformController - | - +studyId: String; - +baseSrc: String; - +previewSrc: String; - +routeInformation: RouteInformation; - +frameWidget: Widget + [RoutingIntents | - +void activate(); - +void registerViews(); - +void generateUrl(); - +void navigate(); - +void refresh(); - +void listen(); - +void send(); - +void openNewPage() + <static>+root: RoutingIntent; + <static>+studies: RoutingIntent; + <static>+studiesShared: RoutingIntent; + <static>+publicRegistry: RoutingIntent; + <static>+study: RoutingIntent Function(String); + <static>+studyEdit: RoutingIntent Function(String); + <static>+studyEditInfo: RoutingIntent Function(String); + <static>+studyEditEnrollment: RoutingIntent Function(String); + <static>+studyEditInterventions: RoutingIntent Function(String); + <static>+studyEditIntervention: RoutingIntent Function(String, String); + <static>+studyEditMeasurements: RoutingIntent Function(String); + <static>+studyEditReports: RoutingIntent Function(String); + <static>+studyEditMeasurement: RoutingIntent Function(String, String); + <static>+studyTest: RoutingIntent Function(String, {String? appRoute}); + <static>+studyRecruit: RoutingIntent Function(String); + <static>+studyMonitor: RoutingIntent Function(String); + <static>+studyAnalyze: RoutingIntent Function(String); + <static>+studySettings: RoutingIntent Function(String); + <static>+accountSettings: RoutingIntent; + <static>+studyNew: RoutingIntent; + <static>+login: RoutingIntent; + <static>+signup: RoutingIntent; + <static>+passwordForgot: RoutingIntent; + <static>+passwordForgot2: RoutingIntent Function(String); + <static>+passwordRecovery: RoutingIntent; + <static>+error: RoutingIntent Function(Exception) ] - [<abstract>PlatformController]o-[RouteInformation] - [<abstract>PlatformController]o-[<abstract>Widget] + [RoutingIntents]o-[RoutingIntent] + [RoutingIntents]o-[RoutingIntent Function(String)] + [RoutingIntents]o-[RoutingIntent Function(String, String)] + [RoutingIntents]o-[RoutingIntent Function(String, {String? appRoute})] + [RoutingIntents]o-[RoutingIntent Function(Exception)] - [WebController + [RoutingIntent | - +iFrameElement: IFrameElement + +route: GoRoute; + +params: Map<String, String>; + +queryParams: Map<String, String>; + +dispatch: RoutingIntentDispatch?; + +extra: Object?; + +routeName: String; + +arguments: Map<String, String>; + +props: List<Object?> | - +void activate(); - +void registerViews(); - +void generateUrl(); - +void navigate(); - +void refresh(); - +void openNewPage(); - +void listen(); - +void send() + -dynamic _validateRoute(); + +bool matches() ] - [WebController]o-[IFrameElement] - [<abstract>PlatformController]<:-[WebController] + [RoutingIntent]o-[GoRoute] + [RoutingIntent]o-[RoutingIntentDispatch] + [<abstract>Equatable]<:-[RoutingIntent] - [MobileController + [RoutingIntentDispatch | - +void openNewPage(); - +void refresh(); - +void registerViews(); - +void listen(); - +void send(); - +void navigate(); - +void activate(); - +void generateUrl() + +index: int; + <static>+values: List<RoutingIntentDispatch>; + <static>+go: RoutingIntentDispatch; + <static>+push: RoutingIntentDispatch ] - [<abstract>PlatformController]<:-[MobileController] + [RoutingIntentDispatch]o-[RoutingIntentDispatch] + [Enum]<:--[RoutingIntentDispatch] - [StudyParticipationBadge - | - +participation: Participation; - +type: BadgeType; - +showPrefixIcon: bool; - +center: bool + [RouterKeys | - +Widget build() + <static>+studyKey: ValueKey<String>; + <static>+authKey: ValueKey<String> ] - [StudyParticipationBadge]o-[Participation] - [StudyParticipationBadge]o-[BadgeType] + [RouterKeys]o-[ValueKey] - [StudyTestScreen + [RouteParams | - +previewRoute: String? + <static>+studiesFilter: String; + <static>+studyId: String; + <static>+measurementId: String; + <static>+interventionId: String; + <static>+testAppRoute: String + ] + + [RouterConf | - +Widget build(); - +Widget? banner(); - +dynamic load(); - +dynamic save(); - +dynamic showHelp() + <static>+router: GoRouter; + <static>+routes: List<GoRoute>; + <static>+publicRoutes: List<GoRoute>; + <static>+privateRoutes: List<GoRoute> + | + <static>+GoRoute route() ] - [<abstract>StudyPageWidget]<:-[StudyTestScreen] + [RouterConf]o-[GoRouter] - [TestAppRoutes + [<abstract>StudyFormRouteArgs | - <static>+studyOverview: String; - <static>+eligibility: String; - <static>+intervention: String; - <static>+consent: String; - <static>+journey: String; - <static>+dashboard: String + +studyId: String ] - [<abstract>IStudyNavViewModel + [<abstract>QuestionFormRouteArgs | - +isEditTabEnabled: bool; - +isTestTabEnabled: bool; - +isRecruitTabEnabled: bool; - +isMonitorTabEnabled: bool; - +isAnalyzeTabEnabled: bool; - +isSettingsEnabled: bool + +questionId: String ] - [StudyNav + [<abstract>StudyFormRouteArgs]<:-[<abstract>QuestionFormRouteArgs] + + [ScreenerQuestionFormRouteArgs + ] + + [<abstract>QuestionFormRouteArgs]<:-[ScreenerQuestionFormRouteArgs] + + [ConsentItemFormRouteArgs | - <static>+dynamic tabs(); - <static>+dynamic edit(); - <static>+dynamic test(); - <static>+dynamic recruit(); - <static>+dynamic monitor(); - <static>+dynamic analyze() + +consentId: String ] - [StudyDesignNav + [<abstract>StudyFormRouteArgs]<:-[ConsentItemFormRouteArgs] + + [MeasurementFormRouteArgs | - <static>+dynamic tabs(); - <static>+dynamic info(); - <static>+dynamic enrollment(); - <static>+dynamic interventions(); - <static>+dynamic measurements(); - <static>+dynamic reports() + +measurementId: String ] - [StudyTestController + [<abstract>StudyFormRouteArgs]<:-[MeasurementFormRouteArgs] + + [SurveyQuestionFormRouteArgs | - +authRepository: IAuthRepository; - +languageCode: String + +questionId: String ] - [StudyTestController]o-[<abstract>IAuthRepository] - [StudyBaseController]<:-[StudyTestController] + [MeasurementFormRouteArgs]<:-[SurveyQuestionFormRouteArgs] + [<abstract>QuestionFormRouteArgs]<:--[SurveyQuestionFormRouteArgs] - [<abstract>IStudyStatusBadgeViewModel + [InterventionFormRouteArgs | - +studyParticipation: Participation?; - +studyStatus: StudyStatus? + +interventionId: String ] - [<abstract>IStudyStatusBadgeViewModel]o-[Participation] - [<abstract>IStudyStatusBadgeViewModel]o-[StudyStatus] + [<abstract>StudyFormRouteArgs]<:-[InterventionFormRouteArgs] - [StudyStatusBadge + [InterventionTaskFormRouteArgs | - +participation: Participation?; - +status: StudyStatus?; - +type: BadgeType; - +showPrefixIcon: bool; - +showTooltip: bool - | - +Widget build() + +taskId: String ] - [StudyStatusBadge]o-[Participation] - [StudyStatusBadge]o-[StudyStatus] - [StudyStatusBadge]o-[BadgeType] + [InterventionFormRouteArgs]<:-[InterventionTaskFormRouteArgs] - [FrameControlsWidget - | - +onRefresh: void Function()?; - +onOpenNewTab: void Function()?; - +enabled: bool + [ReportItemFormRouteArgs | - +Widget build() + +sectionId: String ] - [FrameControlsWidget]o-[void Function()?] - [<abstract>ConsumerWidget]<:-[FrameControlsWidget] + [<abstract>StudyFormRouteArgs]<:-[ReportItemFormRouteArgs] - [StudySettingsDialog + [DropdownMenuItemTheme | - +Widget build() + +iconTheme: IconThemeData? ] - [<abstract>StudyPageWidget]<:-[StudySettingsDialog] + [DropdownMenuItemTheme]o-[IconThemeData] + [<abstract>Diagnosticable]<:-[DropdownMenuItemTheme] - [StudySettingsFormViewModel + [ThemeConfig | - +study: AsyncValue<Study>; - +studyRepository: IStudyRepository; - <static>+defaultPublishedToRegistry: bool; - <static>+defaultPublishedToRegistryResults: bool; - +isPublishedToRegistryControl: FormControl<bool>; - +isPublishedToRegistryResultsControl: FormControl<bool>; - +form: FormGroup; - +titles: Map<FormMode, String> + <static>+kMinContentWidth: double; + <static>+kMaxContentWidth: double; + <static>+kHoverFadeFactor: double; + <static>+kMuteFadeFactor: double | - +void setControlsFrom(); - +Study buildFormData(); - +dynamic keepControlsSynced(); - +dynamic save(); - +dynamic setLaunchDefaults() + <static>+dynamic bodyBackgroundColor(); + <static>+Color modalBarrierColor(); + <static>+Color containerColor(); + <static>+Color colorPickerInitialColor(); + <static>+TextStyle bodyTextMuted(); + <static>+TextStyle bodyTextBackground(); + <static>+double iconSplashRadius(); + <static>+Color sidesheetBackgroundColor(); + <static>+InputDecorationTheme dropdownInputDecorationTheme(); + <static>+DropdownMenuItemTheme dropdownMenuItemTheme() ] - [StudySettingsFormViewModel]o-[<abstract>AsyncValue] - [StudySettingsFormViewModel]o-[<abstract>IStudyRepository] - [StudySettingsFormViewModel]o-[FormControl] - [StudySettingsFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[StudySettingsFormViewModel] - - [StudyBaseController - | - +studyId: String; - +studyRepository: IStudyRepository; - +router: GoRouter; - +studySubscription: StreamSubscription<WrappedModel<Study>>? + [NoAnimationPageTransitionsBuilder | - +dynamic subscribeStudy(); - +dynamic onStudySubscriptionUpdate(); - +dynamic onStudySubscriptionError(); - +void dispose() + +Widget buildTransitions() ] - [StudyBaseController]o-[<abstract>IStudyRepository] - [StudyBaseController]o-[GoRouter] - [StudyBaseController]o-[StreamSubscription] + [<abstract>PageTransitionsBuilder]<:-[NoAnimationPageTransitionsBuilder] - [<abstract>StudyPageWidget - | - +studyId: String + [WebTransitionBuilder | - +Widget? banner() + +Widget buildTransitions() ] - [<abstract>ConsumerWidget]<:-[<abstract>StudyPageWidget] - [<abstract>IWithBanner]<:--[<abstract>StudyPageWidget] + [<abstract>PageTransitionsBuilder]<:-[WebTransitionBuilder] - [AppStatus + [ThemeSettingChange | - +index: int; - <static>+values: List<AppStatus>; - <static>+initializing: AppStatus; - <static>+initialized: AppStatus + +settings: ThemeSettings ] - [AppStatus]o-[AppStatus] - [Enum]<:--[AppStatus] - - [<abstract>IAppDelegate - | - +dynamic onAppStart() - ] + [ThemeSettingChange]o-[ThemeSettings] + [<abstract>Notification]<:-[ThemeSettingChange] - [AppController + [ThemeProvider | - +appDelegates: List<IAppDelegate>; - -_delayedFuture: dynamic; - +isInitialized: dynamic + +settings: ValueNotifier<ThemeSettings>; + +lightDynamic: ColorScheme?; + +darkDynamic: ColorScheme?; + +pageTransitionsTheme: PageTransitionsTheme; + +shapeMedium: ShapeBorder | - +dynamic onAppStart(); - -dynamic _callDelegates() - ] - - [App + +Color custom(); + +Color blend(); + +Color source(); + +ColorScheme colors(); + +CardTheme cardTheme(); + +ListTileThemeData listTileTheme(); + +AppBarTheme appBarTheme(); + +SnackBarThemeData snackBarThemeData(); + +TabBarTheme tabBarTheme(); + +BottomAppBarTheme bottomAppBarTheme(); + +BottomNavigationBarThemeData bottomNavigationBarTheme(); + +SwitchThemeData switchTheme(); + +InputDecorationTheme inputDecorationTheme(); + +TextTheme textTheme(); + +DividerThemeData dividerTheme(); + +NavigationRailThemeData navigationRailTheme(); + +DrawerThemeData drawerTheme(); + +IconThemeData iconTheme(); + +CheckboxThemeData checkboxTheme(); + +RadioThemeData radioTheme(); + +TooltipThemeData tooltipTheme(); + +ThemeData light(); + +ThemeData dark(); + +ThemeMode themeMode(); + +ThemeData theme(); + <static>+ThemeProvider of(); + +bool updateShouldNotify() ] - [AppContent - ] + [ThemeProvider]o-[ValueNotifier] + [ThemeProvider]o-[ColorScheme] + [ThemeProvider]o-[PageTransitionsTheme] + [ThemeProvider]o-[<abstract>ShapeBorder] + [<abstract>InheritedWidget]<:-[ThemeProvider] - [AuthFormController - | - +authRepository: IAuthRepository; - +notificationService: INotificationService; - +router: GoRouter; - +emailControl: FormControl<String>; - +passwordControl: FormControl<String>; - +passwordConfirmationControl: FormControl<String>; - +termsOfServiceControl: FormControl<bool>; - <static>+authValidationMessages: Map<String, String Function(dynamic)>; - +loginForm: FormGroup; - +signupForm: FormGroup; - +passwordForgotForm: FormGroup; - +passwordRecoveryForm: FormGroup; - +controlValidatorsByForm: Map<AuthFormKey, Map<FormControl<dynamic>, List<Validator<dynamic>>>>; - -_formKey: AuthFormKey; - +formKey: AuthFormKey; - +form: FormGroup + [ThemeSettings | - -dynamic _getFormFor(); - -dynamic _onChangeFormKey(); - +dynamic resetControlsFor(); - -dynamic _forceValidationMessages(); - +dynamic signUp(); - -dynamic _signUp(); - +dynamic signIn(); - -dynamic _signInWith(); - +dynamic signOut(); - +dynamic resetPasswordForEmail(); - +dynamic sendPasswordResetLink(); - +dynamic recoverPassword(); - +dynamic updateUser(); - -dynamic _readDebugUser() + +sourceColor: Color; + +themeMode: ThemeMode ] - [AuthFormController]o-[<abstract>IAuthRepository] - [AuthFormController]o-[<abstract>INotificationService] - [AuthFormController]o-[GoRouter] - [AuthFormController]o-[FormControl] - [AuthFormController]o-[FormGroup] - [AuthFormController]o-[AuthFormKey] - [<abstract>IFormGroupController]<:--[AuthFormController] + [ThemeSettings]o-[Color] + [ThemeSettings]o-[ThemeMode] - [AuthFormKey + [CustomColor | - +index: int; - <static>+values: List<AuthFormKey>; - <static>+login: AuthFormKey; - <static>+signup: AuthFormKey; - <static>+passwordForgot: AuthFormKey; - <static>+passwordRecovery: AuthFormKey; - <static>-_loginSubmit: AuthFormKey; - <static>-_signupSubmit: AuthFormKey + +name: String; + +color: Color; + +blend: bool + | + +Color value() ] - [AuthFormKey]o-[AuthFormKey] - [Enum]<:--[AuthFormKey] + [CustomColor]o-[Color] - [PasswordRecoveryForm + [SuppressedBehaviorSubject | - +formKey: AuthFormKey + +subject: BehaviorSubject<T>; + +didSuppressInitialEvent: bool; + -_controller: StreamController<T> | - +Widget build() + -StreamController<T> _buildDerivedController(); + +dynamic close() ] - [PasswordRecoveryForm]o-[AuthFormKey] - [<abstract>FormConsumerRefWidget]<:-[PasswordRecoveryForm] + [SuppressedBehaviorSubject]o-[BehaviorSubject] + [SuppressedBehaviorSubject]o-[StreamController] - [PasswordForgotForm - | - +formKey: AuthFormKey + [Time | - +Widget build() + <static>+dynamic fromTimeOfDay(); + +Map<String, dynamic> toJson(); + <static>+Time fromJson() ] - [PasswordForgotForm]o-[AuthFormKey] - [<abstract>FormConsumerRefWidget]<:-[PasswordForgotForm] + [TimeOfDay]<:-[Time] - [LoginForm - | - +formKey: AuthFormKey + [TimeValueAccessor | - +Widget build() + +String modelToViewValue(); + +Time? viewToModelValue(); + -String _addLeadingZeroIfNeeded() ] - [LoginForm]o-[AuthFormKey] - [<abstract>FormConsumerRefWidget]<:-[LoginForm] + [<abstract>ControlValueAccessor]<:-[TimeValueAccessor] - [EmailTextField + [ModelAction | - +labelText: String; - +hintText: String?; - +formControlName: String?; - +formControl: FormControl<dynamic>? + +type: T; + +label: String; + +icon: IconData?; + +onExecute: Function; + +isAvailable: bool; + +isDestructive: bool ] - [EmailTextField]o-[FormControl] + [ModelAction]o-[IconData] - [PasswordTextField + [<abstract>IModelActionProvider | - +labelText: String; - +hintText: String?; - +onSubmitted: dynamic Function(FormControl<dynamic>)?; - +formControlName: String?; - +formControl: FormControl<dynamic>? + +List<ModelAction<dynamic>> availableActions() ] - [PasswordTextField]o-[dynamic Function(FormControl<dynamic>)?] - [PasswordTextField]o-[FormControl] + [<abstract>IListActionProvider + | + +void onSelectItem(); + +void onNewItem() + ] - [SignupForm + [<abstract>IModelActionProvider]<:-[<abstract>IListActionProvider] + + [ModelActionType | - +formKey: AuthFormKey + +index: int; + <static>+values: List<ModelActionType>; + <static>+edit: ModelActionType; + <static>+delete: ModelActionType; + <static>+remove: ModelActionType; + <static>+duplicate: ModelActionType; + <static>+clipboard: ModelActionType; + <static>+primary: ModelActionType + ] + + [ModelActionType]o-[ModelActionType] + [Enum]<:--[ModelActionType] + + [OptimisticUpdate | - +Widget build(); - -dynamic _onClickTermsOfUse(); - -dynamic _onClickPrivacyPolicy() + +applyOptimistic: void Function(); + +apply: dynamic Function(); + +rollback: void Function(); + +onUpdate: void Function()?; + +onError: void Function(Object, StackTrace?)?; + +rethrowErrors: bool; + +runOptimistically: bool; + +completeFutureOptimistically: bool + | + +dynamic execute(); + -void _runUpdateHandlerIfAny() ] - [SignupForm]o-[AuthFormKey] - [<abstract>FormConsumerRefWidget]<:-[SignupForm] + [OptimisticUpdate]o-[void Function()] + [OptimisticUpdate]o-[dynamic Function()] + [OptimisticUpdate]o-[void Function()?] + [OptimisticUpdate]o-[void Function(Object, StackTrace?)?] - [StudyUJobsToBeDone + [<abstract>FileFormatEncoder | - +Widget build() + +dynamic encodeAsync(); + +String encode(); + +dynamic call() ] - [AuthScaffold + [CSVStringEncoder | - +body: Widget; - +formKey: AuthFormKey; - +leftContentMinWidth: double; - +leftPanelMinWidth: double; - +leftPanelPadding: EdgeInsets + +String encode() ] - [AuthScaffold]o-[<abstract>Widget] - [AuthScaffold]o-[AuthFormKey] - [AuthScaffold]o-[EdgeInsets] + [<abstract>FileFormatEncoder]<:-[CSVStringEncoder] - [PublishDialog + [JsonStringEncoder | - +Widget build() + +String encode() ] - [<abstract>StudyPageWidget]<:-[PublishDialog] + [<abstract>FileFormatEncoder]<:-[JsonStringEncoder] - [PublishSuccessDialog + [<abstract>ExecutionLimiter | - +Widget build() + +milliseconds: int; + <static>-_timer: Timer? + | + +void dispose() ] - [<abstract>StudyPageWidget]<:-[PublishSuccessDialog] + [<abstract>ExecutionLimiter]o-[Timer] - [PublishConfirmationDialog + [Debouncer | - +Widget build() + +leading: bool; + +cancelUncompleted: bool; + -_uncompletedFutureOperation: CancelableOperation<dynamic>? + | + +dynamic call() ] - [<abstract>StudyPageWidget]<:-[PublishConfirmationDialog] + [Debouncer]o-[CancelableOperation] + [<abstract>ExecutionLimiter]<:-[Debouncer] - [FormArrayTable - | - +control: AbstractControl<dynamic>; - +items: List<T>; - +onSelectItem: void Function(T); - +getActionsAt: List<ModelAction<dynamic>> Function(T, int); - +onNewItem: void Function()?; - +rowTitle: String Function(T); - +onNewItemLabel: String; - +sectionTitle: String?; - +sectionDescription: String?; - +emptyIcon: IconData?; - +emptyTitle: String?; - +emptyDescription: String?; - +sectionTitleDivider: bool?; - +rowPrefix: Widget Function(BuildContext, T, int)?; - +rowSuffix: Widget Function(BuildContext, T, int)?; - +leadingWidget: Widget?; - +itemsSectionPadding: EdgeInsets?; - +hideLeadingTrailingWhenEmpty: bool; - <static>+columns: List<StandardTableColumn> + [Throttler | - +Widget build(); - -List<Widget> _buildRow(); - -Widget _newItemButton() + +dynamic call() ] - [FormArrayTable]o-[<abstract>AbstractControl] - [FormArrayTable]o-[void Function(T)] - [FormArrayTable]o-[List<ModelAction<dynamic>> Function(T, int)] - [FormArrayTable]o-[void Function()?] - [FormArrayTable]o-[String Function(T)] - [FormArrayTable]o-[IconData] - [FormArrayTable]o-[Widget Function(BuildContext, T, int)?] - [FormArrayTable]o-[<abstract>Widget] - [FormArrayTable]o-[EdgeInsets] + [<abstract>ExecutionLimiter]<:-[Throttler] - [<abstract>IFormData + [SerializableColor | - +id: String + +Map<String, dynamic> toJson(); + <static>+SerializableColor fromJson() + ] + + [Color]<:-[SerializableColor] + + [<abstract>IProviderArgsResolver | - +IFormData copy() + +R provide() ] - [<abstract>ManagedFormViewModel + [CombinedStreamNotifier | - +ManagedFormViewModel<T> createDuplicate() + -_subscriptions: List<StreamSubscription<dynamic>> + | + +void dispose() ] - [<abstract>FormViewModel]<:-[<abstract>ManagedFormViewModel] + [ChangeNotifier]<:-[CombinedStreamNotifier] - [FormViewModelNotFoundException + [CountWhereValidator + | + +predicate: bool Function(T?); + +minCount: int?; + +maxCount: int?; + <static>+kValidationMessageMinCount: String; + <static>+kValidationMessageMaxCount: String + | + +Map<String, dynamic>? validate() ] - [Exception]<:--[FormViewModelNotFoundException] + [CountWhereValidator]o-[bool Function(T?)] + [<abstract>Validator]<:-[CountWhereValidator] - [FormViewModelCollection + [Patterns | - +formViewModels: List<T>; - +formArray: FormArray<dynamic>; - +stagedViewModels: List<T>; - +retrievableViewModels: List<T>; - +formData: List<D> + <static>+timeFormatString: String; + <static>+emailFormatString: String; + <static>+url: String + ] + + [NumericalRangeFormatter | - +void add(); - +T remove(); - +T? findWhere(); - +T? removeWhere(); - +bool contains(); - +void stage(); - +T commit(); - +void reset(); - +void read() + +min: int?; + +max: int? + | + +TextEditingValue formatEditUpdate() ] - [FormViewModelCollection]o-[FormArray] + [<abstract>TextInputFormatter]<:-[NumericalRangeFormatter] - [FormInvalidException + [StudySequenceFormatter + | + +TextEditingValue formatEditUpdate() ] - [Exception]<:--[FormInvalidException] + [<abstract>TextInputFormatter]<:-[StudySequenceFormatter] - [FormConfigException + [Tuple | - +message: String? + +first: T1; + +second: T2; + +props: List<Object?> + | + +Map<String, dynamic> toJson(); + <static>+Tuple<dynamic, dynamic> fromJson(); + +Tuple<T1, T2> copy(); + +Tuple<T1, T2> copyWith() ] - [Exception]<:--[FormConfigException] + [<abstract>Equatable]<:-[Tuple] - [<abstract>IFormViewModelDelegate + [<abstract>JsonFileLoader | - +dynamic onSave(); - +void onCancel() + +jsonAssetsPath: String + | + +dynamic loadJson(); + +dynamic parseJsonMapFromAssets(); + +dynamic parseJsonListFromAssets() ] - [<abstract>IFormGroupController + [<abstract>IAppDelegate | - +form: FormGroup + +dynamic onAppStart() ] - [<abstract>IFormGroupController]o-[FormGroup] + [AppController + | + +appDelegates: List<IAppDelegate>; + -_delayedFuture: dynamic; + +isInitialized: dynamic + | + +dynamic onAppStart(); + -dynamic _callDelegates() + ] - [FormControlOption + [StudyMonitorScreen | - +value: T; - +label: String; - +description: String?; - +props: List<Object?> + +Widget build() ] - [<abstract>Equatable]<:-[FormControlOption] + [<abstract>StudyPageWidget]<:-[StudyMonitorScreen] - [<abstract>FormViewModel + [LoginForm | - -_formData: T?; - -_formMode: FormMode; - -_validationSet: FormValidationSetEnum?; - +delegate: IFormViewModelDelegate<FormViewModel<dynamic>>?; - +autosave: bool; - -_immediateFormChildrenSubscriptions: List<StreamSubscription<dynamic>>; - -_immediateFormChildrenListenerDebouncer: Debouncer?; - -_autosaveOperation: CancelableOperation<dynamic>?; - -_defaultControlValidators: Map<String, Tuple<List<Validator<dynamic>>, List<AsyncValidator<dynamic>>>>; - +prevFormValue: Map<String, dynamic>?; - <static>-_formKey: String; - +formData: T?; - +formMode: FormMode; - +isReadonly: bool; - +validationSet: FormValidationSetEnum?; - +isDirty: bool; - +title: String; - +isValid: bool; - +titles: Map<FormMode, String>; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +formKey: AuthFormKey | - -dynamic _setFormData(); - -dynamic _rememberDefaultControlValidators(); - -Tuple<List<Validator<dynamic>>, List<AsyncValidator<dynamic>>>? _getDefaultValidators(); - -dynamic _disableAllControls(); - -dynamic _formModeUpdated(); - -dynamic _restoreControlsFromFormData(); - +void revalidate(); - -void _applyValidationSet(); - +void read(); - +dynamic save(); - +dynamic cancel(); - +void enableAutosave(); - +void listenToImmediateFormChildren(); - +dynamic markFormGroupChanged(); - +void dispose(); - +void setControlsFrom(); - +T buildFormData(); - +void initControls() + +Widget build() ] - [<abstract>FormViewModel]o-[FormMode] - [<abstract>FormViewModel]o-[<abstract>FormValidationSetEnum] - [<abstract>FormViewModel]o-[<abstract>IFormViewModelDelegate] - [<abstract>FormViewModel]o-[Debouncer] - [<abstract>FormViewModel]o-[CancelableOperation] - [<abstract>IFormGroupController]<:--[<abstract>FormViewModel] + [LoginForm]o-[AuthFormKey] + [<abstract>FormConsumerRefWidget]<:-[LoginForm] - [FormMode + [PasswordRecoveryForm | - +index: int; - <static>+values: List<FormMode>; - <static>+create: FormMode; - <static>+readonly: FormMode; - <static>+edit: FormMode + +formKey: AuthFormKey + | + +Widget build() ] - [FormMode]o-[FormMode] - [Enum]<:--[FormMode] + [PasswordRecoveryForm]o-[AuthFormKey] + [<abstract>FormConsumerRefWidget]<:-[PasswordRecoveryForm] - [CustomFormControl + [PasswordForgotForm | - -_onValueChangedDebouncer: Debouncer?; - -_onStatusChangedDebouncer: Debouncer?; - +onValueChanged: void Function(T?)?; - +onStatusChanged: void Function(ControlStatus)?; - +onStatusChangedDebounceTime: int?; - +onValueChangedDebounceTime: int? + +formKey: AuthFormKey | - +void dispose() + +Widget build() ] - [CustomFormControl]o-[Debouncer] - [CustomFormControl]o-[void Function(T?)?] - [CustomFormControl]o-[void Function(ControlStatus)?] - [FormControl]<:-[CustomFormControl] + [PasswordForgotForm]o-[AuthFormKey] + [<abstract>FormConsumerRefWidget]<:-[PasswordForgotForm] - [UnsavedChangesDialog + [SignupForm | - +Widget build() + +formKey: AuthFormKey + | + +Widget build(); + -dynamic _onClickTermsOfUse(); + -dynamic _onClickPrivacyPolicy() ] - [<abstract>FormValidationSetEnum - ] + [SignupForm]o-[AuthFormKey] + [<abstract>FormConsumerRefWidget]<:-[SignupForm] - [FormControlValidation - | - +control: AbstractControl<dynamic>; - +validators: List<Validator<dynamic>>; - +asyncValidators: List<AsyncValidator<dynamic>>?; - +validationMessages: Map<String, String Function(Object)> + [AuthScaffold | - +FormControlValidation merge() + +body: Widget; + +formKey: AuthFormKey; + +leftContentMinWidth: double; + +leftPanelMinWidth: double; + +leftPanelPadding: EdgeInsets ] - [FormControlValidation]o-[<abstract>AbstractControl] + [AuthScaffold]o-[<abstract>Widget] + [AuthScaffold]o-[AuthFormKey] + [AuthScaffold]o-[EdgeInsets] - [ScreenerQuestionFormViewModel - | - <static>+defaultResponseOptionValidity: bool; - +responseOptionsDisabledArray: FormArray<dynamic>; - +responseOptionsLogicControls: FormArray<bool>; - +responseOptionsLogicDescriptionControls: FormArray<String>; - -_questionBaseControls: Map<String, AbstractControl<dynamic>>; - +prevResponseOptionControls: List<AbstractControl<dynamic>>; - +prevResponseOptionValues: List<dynamic>; - +responseOptionsDisabledControls: List<AbstractControl<dynamic>>; - +logicControlOptions: List<FormControlOption<bool>>; - +questionBaseControls: Map<String, AbstractControl<dynamic>>; - +isDirtyOptionsBannerVisible: bool + [EmailTextField | - +dynamic onResponseOptionsChanged(); - +void setControlsFrom(); - +QuestionFormData buildFormData(); - -List<FormControl<dynamic>> _copyFormControls(); - -AbstractControl<dynamic>? _findAssociatedLogicControlFor(); - -AbstractControl<dynamic>? _findAssociatedControlFor(); - +ScreenerQuestionFormViewModel createDuplicate() + +labelText: String; + +hintText: String?; + +formControlName: String?; + +formControl: FormControl<dynamic>? ] - [ScreenerQuestionFormViewModel]o-[FormArray] - [QuestionFormViewModel]<:-[ScreenerQuestionFormViewModel] - [<abstract>IScreenerQuestionLogicFormViewModel]<:--[ScreenerQuestionFormViewModel] + [EmailTextField]o-[FormControl] - [StudyDesignEnrollmentFormView + [PasswordTextField | - +Widget build(); - -dynamic _showScreenerQuestionSidesheetWithArgs(); - -dynamic _showConsentItemSidesheetWithArgs() + +labelText: String; + +hintText: String?; + +onSubmitted: dynamic Function(FormControl<dynamic>)?; + +formControlName: String?; + +formControl: FormControl<dynamic>? ] - [<abstract>StudyDesignPageWidget]<:-[StudyDesignEnrollmentFormView] + [PasswordTextField]o-[dynamic Function(FormControl<dynamic>)?] + [PasswordTextField]o-[FormControl] - [<abstract>IScreenerQuestionLogicFormViewModel + [StudyUJobsToBeDone | - +isDirtyOptionsBannerVisible: bool + +Widget build() ] - [ScreenerQuestionLogicFormView + [AuthFormController | - +formViewModel: ScreenerQuestionFormViewModel + +authRepository: IAuthRepository; + +notificationService: INotificationService; + +router: GoRouter; + +emailControl: FormControl<String>; + +passwordControl: FormControl<String>; + +passwordConfirmationControl: FormControl<String>; + +termsOfServiceControl: FormControl<bool>; + <static>+authValidationMessages: Map<String, String Function(dynamic)>; + +loginForm: FormGroup; + +signupForm: FormGroup; + +passwordForgotForm: FormGroup; + +passwordRecoveryForm: FormGroup; + +controlValidatorsByForm: Map<AuthFormKey, Map<FormControl<dynamic>, List<Validator<dynamic>>>>; + -_formKey: AuthFormKey; + +formKey: AuthFormKey; + +form: FormGroup | - +Widget build(); - -dynamic _buildInfoBanner(); - -dynamic _buildAnswerOptionsLogicControls(); - -List<Widget> _buildOptionLogicRow() + -dynamic _getFormFor(); + -dynamic _onChangeFormKey(); + +dynamic resetControlsFor(); + -dynamic _forceValidationMessages(); + +dynamic signUp(); + -dynamic _signUp(); + +dynamic signIn(); + -dynamic _signInWith(); + +dynamic signOut(); + +dynamic resetPasswordForEmail(); + +dynamic sendPasswordResetLink(); + +dynamic recoverPassword(); + +dynamic updateUser(); + -dynamic _readDebugUser() ] - [ScreenerQuestionLogicFormView]o-[ScreenerQuestionFormViewModel] - [<abstract>FormConsumerWidget]<:-[ScreenerQuestionLogicFormView] + [AuthFormController]o-[<abstract>IAuthRepository] + [AuthFormController]o-[<abstract>INotificationService] + [AuthFormController]o-[GoRouter] + [AuthFormController]o-[FormControl] + [AuthFormController]o-[FormGroup] + [AuthFormController]o-[AuthFormKey] + [<abstract>IFormGroupController]<:--[AuthFormController] - [ConsentItemFormData - | - +consentId: String; - +title: String; - +description: String; - +iconName: String?; - +id: String + [AuthFormKey | - +ConsentItem toConsentItem(); - +ConsentItemFormData copy() + +index: int; + <static>+values: List<AuthFormKey>; + <static>+login: AuthFormKey; + <static>+signup: AuthFormKey; + <static>+passwordForgot: AuthFormKey; + <static>+passwordRecovery: AuthFormKey; + <static>-_loginSubmit: AuthFormKey; + <static>-_signupSubmit: AuthFormKey ] - [<abstract>IFormData]<:-[ConsentItemFormData] + [AuthFormKey]o-[AuthFormKey] + [Enum]<:--[AuthFormKey] - [EnrollmentFormViewModel + [AppStatus | - +study: Study; - +router: GoRouter; - +consentItemDelegate: EnrollmentFormConsentItemDelegate; - +enrollmentTypeControl: FormControl<Participation>; - +consentItemArray: FormArray<dynamic>; - +consentItemFormViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData>; - +form: FormGroup; - +enrollmentTypeControlOptions: List<FormControlOption<Participation>>; - +consentItemModels: List<ConsentItemFormViewModel>; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titles: Map<FormMode, String>; - +canTestScreener: bool; - +canTestConsent: bool; - +questionTitles: Map<FormMode, String Function()> + +index: int; + <static>+values: List<AppStatus>; + <static>+initializing: AppStatus; + <static>+initialized: AppStatus + ] + + [AppStatus]o-[AppStatus] + [Enum]<:--[AppStatus] + + [FormArrayTable | - +void setControlsFrom(); - +EnrollmentFormData buildFormData(); - +void read(); - +List<ModelAction<dynamic>> availableActions(); - +List<ModelAction<dynamic>> availablePopupActions(); - +List<ModelAction<dynamic>> availableInlineActions(); - +void onSelectItem(); - +void onNewItem(); - +ScreenerQuestionFormRouteArgs buildNewScreenerQuestionFormRouteArgs(); - +ScreenerQuestionFormRouteArgs buildScreenerQuestionFormRouteArgs(); - +ConsentItemFormRouteArgs buildNewConsentItemFormRouteArgs(); - +ConsentItemFormRouteArgs buildConsentItemFormRouteArgs(); - +dynamic testScreener(); - +dynamic testConsent(); - +ScreenerQuestionFormViewModel provideQuestionFormViewModel() + +control: AbstractControl<dynamic>; + +items: List<T>; + +onSelectItem: void Function(T); + +getActionsAt: List<ModelAction<dynamic>> Function(T, int); + +onNewItem: void Function()?; + +rowTitle: String Function(T); + +onNewItemLabel: String; + +sectionTitle: String?; + +sectionDescription: String?; + +emptyIcon: IconData?; + +emptyTitle: String?; + +emptyDescription: String?; + +sectionTitleDivider: bool?; + +rowPrefix: Widget Function(BuildContext, T, int)?; + +rowSuffix: Widget Function(BuildContext, T, int)?; + +leadingWidget: Widget?; + +itemsSectionPadding: EdgeInsets?; + +hideLeadingTrailingWhenEmpty: bool; + <static>+columns: List<StandardTableColumn> + | + +Widget build(); + -List<Widget> _buildRow(); + -Widget _newItemButton() ] - [EnrollmentFormViewModel]o-[Study] - [EnrollmentFormViewModel]o-[GoRouter] - [EnrollmentFormViewModel]o-[EnrollmentFormConsentItemDelegate] - [EnrollmentFormViewModel]o-[FormControl] - [EnrollmentFormViewModel]o-[FormArray] - [EnrollmentFormViewModel]o-[FormViewModelCollection] - [EnrollmentFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[EnrollmentFormViewModel] - [<abstract>WithQuestionnaireControls]<:-[EnrollmentFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[EnrollmentFormViewModel] - [<abstract>IListActionProvider]<:--[EnrollmentFormViewModel] - [<abstract>IProviderArgsResolver]<:--[EnrollmentFormViewModel] + [FormArrayTable]o-[<abstract>AbstractControl] + [FormArrayTable]o-[void Function(T)] + [FormArrayTable]o-[List<ModelAction<dynamic>> Function(T, int)] + [FormArrayTable]o-[void Function()?] + [FormArrayTable]o-[String Function(T)] + [FormArrayTable]o-[IconData] + [FormArrayTable]o-[Widget Function(BuildContext, T, int)?] + [FormArrayTable]o-[<abstract>Widget] + [FormArrayTable]o-[EdgeInsets] - [EnrollmentFormConsentItemDelegate - | - +formViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData>; - +owner: EnrollmentFormViewModel; - +propagateOnSave: bool; - +validationSet: dynamic + [<abstract>ManagedFormViewModel | - +void onCancel(); - +dynamic onSave(); - +ConsentItemFormViewModel provide(); - +List<ModelAction<dynamic>> availableActions(); - +void onNewItem(); - +void onSelectItem() + +ManagedFormViewModel<T> createDuplicate() ] - [EnrollmentFormConsentItemDelegate]o-[FormViewModelCollection] - [EnrollmentFormConsentItemDelegate]o-[EnrollmentFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[EnrollmentFormConsentItemDelegate] - [<abstract>IListActionProvider]<:--[EnrollmentFormConsentItemDelegate] - [<abstract>IProviderArgsResolver]<:--[EnrollmentFormConsentItemDelegate] + [<abstract>FormViewModel]<:-[<abstract>ManagedFormViewModel] - [ConsentItemFormViewModel - | - +consentIdControl: FormControl<String>; - +titleControl: FormControl<String>; - +descriptionControl: FormControl<String>; - +iconControl: FormControl<IconOption>; - +form: FormGroup; - +consentId: String; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titleRequired: dynamic; - +descriptionRequired: dynamic; - +titles: Map<FormMode, String> - | - +void setControlsFrom(); - +ConsentItemFormData buildFormData(); - +ConsentItemFormViewModel createDuplicate() + [FormViewModelNotFoundException ] - [ConsentItemFormViewModel]o-[FormControl] - [ConsentItemFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[ConsentItemFormViewModel] + [Exception]<:--[FormViewModelNotFoundException] - [ConsentItemFormView + [FormViewModelCollection | - +formViewModel: ConsentItemFormViewModel + +formViewModels: List<T>; + +formArray: FormArray<dynamic>; + +stagedViewModels: List<T>; + +retrievableViewModels: List<T>; + +formData: List<D> + | + +void add(); + +T remove(); + +T? findWhere(); + +T? removeWhere(); + +bool contains(); + +void stage(); + +T commit(); + +void reset(); + +void read() ] - [ConsentItemFormView]o-[ConsentItemFormViewModel] + [FormViewModelCollection]o-[FormArray] - [EnrollmentFormData + [CustomFormControl | - <static>+kDefaultEnrollmentType: Participation; - +enrollmentType: Participation; - +questionnaireFormData: QuestionnaireFormData; - +consentItemsFormData: List<ConsentItemFormData>?; - +id: String + -_onValueChangedDebouncer: Debouncer?; + -_onStatusChangedDebouncer: Debouncer?; + +onValueChanged: void Function(T?)?; + +onStatusChanged: void Function(ControlStatus)?; + +onStatusChangedDebounceTime: int?; + +onValueChangedDebounceTime: int? | - +Study apply(); - +EnrollmentFormData copy() + +void dispose() ] - [EnrollmentFormData]o-[Participation] - [EnrollmentFormData]o-[QuestionnaireFormData] - [<abstract>IStudyFormData]<:--[EnrollmentFormData] + [CustomFormControl]o-[Debouncer] + [CustomFormControl]o-[void Function(T?)?] + [CustomFormControl]o-[void Function(ControlStatus)?] + [FormControl]<:-[CustomFormControl] - [StudyDesignInterventionsFormView + [UnsavedChangesDialog | +Widget build() ] - [<abstract>StudyDesignPageWidget]<:-[StudyDesignInterventionsFormView] - - [InterventionsFormViewModel - | - +study: Study; - +router: GoRouter; - +interventionsArray: FormArray<dynamic>; - +interventionsCollection: FormViewModelCollection<InterventionFormViewModel, InterventionFormData>; - +form: FormGroup; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +interventionsRequired: dynamic; - +titles: Map<FormMode, String>; - +canTestStudySchedule: bool - | - +void setControlsFrom(); - +InterventionsFormData buildFormData(); - +void read(); - +List<ModelAction<dynamic>> availableActions(); - +List<ModelAction<dynamic>> availablePopupActions(); - +List<ModelAction<dynamic>> availableInlineActions(); - +void onSelectItem(); - +void onNewItem(); - +InterventionFormViewModel provide(); - +void onCancel(); - +dynamic onSave(); - +dynamic testStudySchedule() + [<abstract>FormValidationSetEnum ] - [InterventionsFormViewModel]o-[Study] - [InterventionsFormViewModel]o-[GoRouter] - [InterventionsFormViewModel]o-[FormArray] - [InterventionsFormViewModel]o-[FormViewModelCollection] - [InterventionsFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[InterventionsFormViewModel] - [<abstract>StudyScheduleControls]<:-[InterventionsFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[InterventionsFormViewModel] - [<abstract>IListActionProvider]<:--[InterventionsFormViewModel] - [<abstract>IProviderArgsResolver]<:--[InterventionsFormViewModel] - - [InterventionFormViewModel + [FormControlValidation | - +study: Study; - +interventionIdControl: FormControl<String>; - +interventionTitleControl: FormControl<String>; - +interventionIconControl: FormControl<IconOption>; - +interventionDescriptionControl: FormControl<String>; - +interventionTasksArray: FormArray<dynamic>; - +tasksCollection: FormViewModelCollection<InterventionTaskFormViewModel, InterventionTaskFormData>; - +form: FormGroup; - +interventionId: String; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titleRequired: dynamic; - +atLeastOneTask: dynamic; - +breadcrumbsTitle: String; - +titles: Map<FormMode, String> + +control: AbstractControl<dynamic>; + +validators: List<Validator<dynamic>>; + +asyncValidators: List<AsyncValidator<dynamic>>?; + +validationMessages: Map<String, String Function(Object)> | - +void setControlsFrom(); - +InterventionFormData buildFormData(); - +List<ModelAction<dynamic>> availableActions(); - +List<ModelAction<dynamic>> availablePopupActions(); - +List<ModelAction<dynamic>> availableInlineActions(); - +void onSelectItem(); - +void onNewItem(); - +void onCancel(); - +dynamic onSave(); - +InterventionTaskFormViewModel provide(); - +InterventionTaskFormRouteArgs buildNewFormRouteArgs(); - +InterventionTaskFormRouteArgs buildFormRouteArgs(); - +InterventionFormViewModel createDuplicate() + +FormControlValidation merge() ] - [InterventionFormViewModel]o-[Study] - [InterventionFormViewModel]o-[FormControl] - [InterventionFormViewModel]o-[FormArray] - [InterventionFormViewModel]o-[FormViewModelCollection] - [InterventionFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[InterventionFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[InterventionFormViewModel] - [<abstract>IListActionProvider]<:--[InterventionFormViewModel] - [<abstract>IProviderArgsResolver]<:--[InterventionFormViewModel] + [FormControlValidation]o-[<abstract>AbstractControl] - [InterventionTaskFormData + [<abstract>IFormData | - +taskId: String; - +taskTitle: String; - +taskDescription: String?; - <static>+kDefaultTitle: String; +id: String | - +CheckmarkTask toTask(); - +InterventionTaskFormData copy() + +IFormData copy() ] - [<abstract>IFormDataWithSchedule]<:-[InterventionTaskFormData] - - [StudyScheduleFormData - | - +sequenceType: PhaseSequence; - +sequenceTypeCustom: String; - +numCycles: int; - +phaseDuration: int; - +includeBaseline: bool; - +id: String - | - +StudySchedule toStudySchedule(); - +Study apply(); - +StudyScheduleFormData copy() + [FormInvalidException ] - [StudyScheduleFormData]o-[PhaseSequence] - [<abstract>IStudyFormData]<:--[StudyScheduleFormData] + [Exception]<:--[FormInvalidException] - [InterventionPreview - | - +routeArgs: InterventionFormRouteArgs + [FormConfigException | - +Widget build() + +message: String? ] - [InterventionPreview]o-[InterventionFormRouteArgs] - [<abstract>ConsumerWidget]<:-[InterventionPreview] + [Exception]<:--[FormConfigException] - [InterventionTaskFormViewModel + [<abstract>IFormViewModelDelegate | - +taskIdControl: FormControl<String>; - +instanceIdControl: FormControl<String>; - +taskTitleControl: FormControl<String>; - +taskDescriptionControl: FormControl<String>; - +markAsCompletedControl: FormControl<bool>; - +form: FormGroup; - +taskId: String; - +instanceId: String; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titleRequired: dynamic; - +titles: Map<FormMode, String> + +dynamic onSave(); + +void onCancel() + ] + + [<abstract>IFormGroupController | - +void setControlsFrom(); - +InterventionTaskFormData buildFormData(); - +InterventionTaskFormViewModel createDuplicate() + +form: FormGroup ] - [InterventionTaskFormViewModel]o-[FormControl] - [InterventionTaskFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[InterventionTaskFormViewModel] - [<abstract>WithScheduleControls]<:-[InterventionTaskFormViewModel] + [<abstract>IFormGroupController]o-[FormGroup] - [InterventionsFormData + [FormControlOption | - +interventionsData: List<InterventionFormData>; - +studyScheduleData: StudyScheduleFormData; - +id: String + +value: T; + +label: String; + +description: String?; + +props: List<Object?> + ] + + [<abstract>Equatable]<:-[FormControlOption] + + [<abstract>FormViewModel | - +Study apply(); - +InterventionsFormData copy() + -_formData: T?; + -_formMode: FormMode; + -_validationSet: FormValidationSetEnum?; + +delegate: IFormViewModelDelegate<FormViewModel<dynamic>>?; + +autosave: bool; + -_immediateFormChildrenSubscriptions: List<StreamSubscription<dynamic>>; + -_immediateFormChildrenListenerDebouncer: Debouncer?; + -_autosaveOperation: CancelableOperation<dynamic>?; + -_defaultControlValidators: Map<String, Tuple<List<Validator<dynamic>>, List<AsyncValidator<dynamic>>>>; + +prevFormValue: Map<String, dynamic>?; + <static>-_formKey: String; + +formData: T?; + +formMode: FormMode; + +isReadonly: bool; + +validationSet: FormValidationSetEnum?; + +isDirty: bool; + +title: String; + +isValid: bool; + +titles: Map<FormMode, String>; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + | + -dynamic _setFormData(); + -dynamic _rememberDefaultControlValidators(); + -Tuple<List<Validator<dynamic>>, List<AsyncValidator<dynamic>>>? _getDefaultValidators(); + -dynamic _disableAllControls(); + -dynamic _formModeUpdated(); + -dynamic _restoreControlsFromFormData(); + +void revalidate(); + -void _applyValidationSet(); + +void read(); + +dynamic save(); + +dynamic cancel(); + +void enableAutosave(); + +void listenToImmediateFormChildren(); + +dynamic markFormGroupChanged(); + +void dispose(); + +void setControlsFrom(); + +T buildFormData(); + +void initControls() ] - [InterventionsFormData]o-[StudyScheduleFormData] - [<abstract>IStudyFormData]<:--[InterventionsFormData] + [<abstract>FormViewModel]o-[FormMode] + [<abstract>FormViewModel]o-[<abstract>FormValidationSetEnum] + [<abstract>FormViewModel]o-[<abstract>IFormViewModelDelegate] + [<abstract>FormViewModel]o-[Debouncer] + [<abstract>FormViewModel]o-[CancelableOperation] + [<abstract>IFormGroupController]<:--[<abstract>FormViewModel] - [InterventionFormView + [FormMode | - +formViewModel: InterventionFormViewModel + +index: int; + <static>+values: List<FormMode>; + <static>+create: FormMode; + <static>+readonly: FormMode; + <static>+edit: FormMode ] - [InterventionFormView]o-[InterventionFormViewModel] + [FormMode]o-[FormMode] + [Enum]<:--[FormMode] - [<abstract>StudyScheduleControls + [EnrolledBadge | - <static>+defaultScheduleType: PhaseSequence; - <static>+defaultScheduleTypeSequence: String; - <static>+defaultNumCycles: int; - <static>+defaultPeriodLength: int; - +sequenceTypeControl: FormControl<PhaseSequence>; - +sequenceTypeCustomControl: FormControl<String>; - +phaseDurationControl: FormControl<int>; - +numCyclesControl: FormControl<int>; - +includeBaselineControl: FormControl<bool>; - +studyScheduleControls: Map<String, FormControl<Object>>; - <static>+kNumCyclesMin: int; - <static>+kNumCyclesMax: int; - <static>+kPhaseDurationMin: int; - <static>+kPhaseDurationMax: int; - +sequenceTypeControlOptions: List<FormControlOption<PhaseSequence>>; - +studyScheduleValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +numCyclesRange: dynamic; - +phaseDurationRange: dynamic; - +customSequenceRequired: dynamic + +enrolledCount: int | - +void setStudyScheduleControlsFrom(); - +StudyScheduleFormData buildStudyScheduleFormData(); - +bool isSequencingCustom() + +Widget build() ] - [<abstract>StudyScheduleControls]o-[PhaseSequence] - [<abstract>StudyScheduleControls]o-[FormControl] - - [InterventionTaskFormView + [StudyRecruitController | - +formViewModel: InterventionTaskFormViewModel + +inviteCodeRepository: IInviteCodeRepository; + -_invitesSubscription: StreamSubscription<List<WrappedModel<StudyInvite>>>? + | + -dynamic _subscribeInvites(); + +Intervention? getIntervention(); + +int getParticipantCountForInvite(); + +List<ModelAction<dynamic>> availableActions(); + +List<ModelAction<dynamic>> availableInlineActions(); + +void dispose() ] - [InterventionTaskFormView]o-[InterventionTaskFormViewModel] + [StudyRecruitController]o-[<abstract>IInviteCodeRepository] + [StudyRecruitController]o-[StreamSubscription] + [StudyBaseController]<:-[StudyRecruitController] + [<abstract>IModelActionProvider]<:--[StudyRecruitController] - [InterventionFormData - | - +interventionId: String; - +title: String; - +description: String?; - +tasksData: List<InterventionTaskFormData>?; - +iconName: String?; - <static>+kDefaultTitle: String; - +id: String + [StudyRecruitScreen | - +Intervention toIntervention(); - +InterventionFormData copy() + +Widget build(); + -Widget _inviteCodesSectionHeader(); + -Widget _newInviteCodeButton(); + -dynamic _onSelectInvite() ] - [<abstract>IFormData]<:-[InterventionFormData] + [<abstract>StudyPageWidget]<:-[StudyRecruitScreen] - [StudyScheduleFormView + [InviteCodeFormView | - +formViewModel: StudyScheduleControls + +formViewModel: InviteCodeFormViewModel | - -FormTableRow _renderCustomSequence(); - +Widget build() + +Widget build(); + -List<FormTableRow> _conditionalInterventionRows() ] - [StudyScheduleFormView]o-[<abstract>StudyScheduleControls] - [<abstract>FormConsumerWidget]<:-[StudyScheduleFormView] + [InviteCodeFormView]o-[InviteCodeFormViewModel] + [<abstract>FormConsumerWidget]<:-[InviteCodeFormView] - [<abstract>IStudyFormData + [StudyInvitesTable | - +Study apply() + +invites: List<StudyInvite>; + +onSelect: void Function(StudyInvite); + +getActions: List<ModelAction<dynamic>> Function(StudyInvite); + +getInlineActions: List<ModelAction<dynamic>> Function(StudyInvite); + +getIntervention: Intervention? Function(String); + +getParticipantCountForInvite: int Function(StudyInvite) + | + +Widget build(); + -List<Widget> _buildRow() ] - [<abstract>IFormData]<:--[<abstract>IStudyFormData] + [StudyInvitesTable]o-[void Function(StudyInvite)] + [StudyInvitesTable]o-[List<ModelAction<dynamic>> Function(StudyInvite)] + [StudyInvitesTable]o-[Intervention? Function(String)] + [StudyInvitesTable]o-[int Function(StudyInvite)] - [StudyInfoFormData + [InviteCodeFormViewModel | - +title: String; - +description: String?; - +iconName: String; - +contactInfoFormData: StudyContactInfoFormData; - +id: String + +study: Study; + +inviteCodeRepository: IInviteCodeRepository; + +codeControl: FormControl<String>; + +codeControlValidationMessages: Map<String, String Function(dynamic)>; + +isPreconfiguredScheduleControl: FormControl<bool>; + +preconfiguredScheduleTypeControl: FormControl<PhaseSequence>; + +interventionAControl: FormControl<String>; + +interventionBControl: FormControl<String>; + +form: FormGroup; + +titles: Map<FormMode, String>; + +interventionControlOptions: List<FormControlOption<String>>; + +preconfiguredScheduleTypeOptions: List<FormControlOption<PhaseSequence>>; + +isPreconfiguredSchedule: bool; + +preconfiguredSchedule: List<String>? | - +Study apply(); - +StudyInfoFormData copy() + +void initControls(); + -dynamic _uniqueInviteCode(); + +void regenerateCode(); + -String _generateCode(); + +StudyInvite buildFormData(); + +void setControlsFrom(); + +dynamic save() ] - [StudyInfoFormData]o-[StudyContactInfoFormData] - [<abstract>IStudyFormData]<:--[StudyInfoFormData] + [InviteCodeFormViewModel]o-[Study] + [InviteCodeFormViewModel]o-[<abstract>IInviteCodeRepository] + [InviteCodeFormViewModel]o-[FormControl] + [InviteCodeFormViewModel]o-[FormGroup] + [<abstract>FormViewModel]<:-[InviteCodeFormViewModel] - [StudyContactInfoFormData - | - +organization: String?; - +institutionalReviewBoard: String?; - +institutionalReviewBoardNumber: String?; - +researchers: String?; - +email: String?; - +website: String?; - +phone: String?; - +additionalInfo: String?; - +id: String + [PublishSuccessDialog | - +Study apply(); - +StudyInfoFormData copy() + +Widget build() ] - [<abstract>IStudyFormData]<:--[StudyContactInfoFormData] + [<abstract>StudyPageWidget]<:-[PublishSuccessDialog] - [StudyDesignInfoFormView + [PublishDialog | +Widget build() ] - [<abstract>StudyDesignPageWidget]<:-[StudyDesignInfoFormView] + [<abstract>StudyPageWidget]<:-[PublishDialog] - [StudyInfoFormViewModel + [PublishConfirmationDialog | - +study: Study; - +titleControl: FormControl<String>; - +iconControl: FormControl<IconOption>; - +descriptionControl: FormControl<String>; - +organizationControl: FormControl<String>; - +reviewBoardControl: FormControl<String>; - +reviewBoardNumberControl: FormControl<String>; - +researchersControl: FormControl<String>; - +emailControl: FormControl<String>; - +websiteControl: FormControl<String>; - +phoneControl: FormControl<String>; - +additionalInfoControl: FormControl<String>; - +form: FormGroup; - +titles: Map<FormMode, String>; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titleRequired: dynamic; - +descriptionRequired: dynamic; - +iconRequired: dynamic; - +organizationRequired: dynamic; - +reviewBoardRequired: dynamic; - +reviewBoardNumberRequired: dynamic; - +researchersRequired: dynamic; - +emailRequired: dynamic; - +phoneRequired: dynamic; - +emailFormat: dynamic; - +websiteFormat: dynamic - | - +void setControlsFrom(); - +StudyInfoFormData buildFormData() + +Widget build() ] - [StudyInfoFormViewModel]o-[Study] - [StudyInfoFormViewModel]o-[FormControl] - [StudyInfoFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[StudyInfoFormViewModel] + [<abstract>StudyPageWidget]<:-[PublishConfirmationDialog] - [MeasurementSurveyFormData + [FrameControlsWidget | - +measurementId: String; - +title: String; - +introText: String?; - +outroText: String?; - +questionnaireFormData: QuestionnaireFormData; - <static>+kDefaultTitle: String; - +id: String + +onRefresh: void Function()?; + +onOpenNewTab: void Function()?; + +enabled: bool | - +QuestionnaireTask toQuestionnaireTask(); - +MeasurementSurveyFormData copy() + +Widget build() ] - [MeasurementSurveyFormData]o-[QuestionnaireFormData] - [<abstract>IFormDataWithSchedule]<:-[MeasurementSurveyFormData] + [FrameControlsWidget]o-[void Function()?] + [<abstract>ConsumerWidget]<:-[FrameControlsWidget] - [MeasurementSurveyFormView + [<abstract>IStudyStatusBadgeViewModel | - +formViewModel: MeasurementSurveyFormViewModel + +studyParticipation: Participation?; + +studyStatus: StudyStatus? ] - [MeasurementSurveyFormView]o-[MeasurementSurveyFormViewModel] + [<abstract>IStudyStatusBadgeViewModel]o-[Participation] + [<abstract>IStudyStatusBadgeViewModel]o-[StudyStatus] - [MeasurementSurveyFormViewModel + [StudyStatusBadge | - +study: Study; - +measurementIdControl: FormControl<String>; - +instanceIdControl: FormControl<String>; - +surveyTitleControl: FormControl<String>; - +surveyIntroTextControl: FormControl<String>; - +surveyOutroTextControl: FormControl<String>; - +form: FormGroup; - +measurementId: String; - +instanceId: String; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titleRequired: dynamic; - +atLeastOneQuestion: dynamic; - +breadcrumbsTitle: String; - +titles: Map<FormMode, String> + +participation: Participation?; + +status: StudyStatus?; + +type: BadgeType; + +showPrefixIcon: bool; + +showTooltip: bool | - +void setControlsFrom(); - +MeasurementSurveyFormData buildFormData(); - +List<ModelAction<dynamic>> availableActions(); - +List<ModelAction<dynamic>> availablePopupActions(); - +List<ModelAction<dynamic>> availableInlineActions(); - +void onSelectItem(); - +void onNewItem(); - +SurveyQuestionFormRouteArgs buildNewFormRouteArgs(); - +SurveyQuestionFormRouteArgs buildFormRouteArgs(); - +MeasurementSurveyFormViewModel createDuplicate() + +Widget build() ] - [MeasurementSurveyFormViewModel]o-[Study] - [MeasurementSurveyFormViewModel]o-[FormControl] - [MeasurementSurveyFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[MeasurementSurveyFormViewModel] - [<abstract>WithQuestionnaireControls]<:-[MeasurementSurveyFormViewModel] - [<abstract>WithScheduleControls]<:-[MeasurementSurveyFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[MeasurementSurveyFormViewModel] - [<abstract>IListActionProvider]<:--[MeasurementSurveyFormViewModel] - [<abstract>IProviderArgsResolver]<:--[MeasurementSurveyFormViewModel] + [StudyStatusBadge]o-[Participation] + [StudyStatusBadge]o-[StudyStatus] + [StudyStatusBadge]o-[BadgeType] - [SurveyPreview + [RouteInformation | - +routeArgs: MeasurementFormRouteArgs + +route: String?; + +extra: String?; + +cmd: String?; + +data: String? | - +Widget build() + +String toString() ] - [SurveyPreview]o-[MeasurementFormRouteArgs] - [<abstract>ConsumerWidget]<:-[SurveyPreview] - - [StudyDesignMeasurementsFormView + [<abstract>PlatformController | - +Widget build() + +studyId: String; + +baseSrc: String; + +previewSrc: String; + +routeInformation: RouteInformation; + +frameWidget: Widget + | + +void activate(); + +void registerViews(); + +void generateUrl(); + +void navigate(); + +void refresh(); + +void listen(); + +void send(); + +void openNewPage() ] - [<abstract>StudyDesignPageWidget]<:-[StudyDesignMeasurementsFormView] + [<abstract>PlatformController]o-[RouteInformation] + [<abstract>PlatformController]o-[<abstract>Widget] - [MeasurementsFormData + [WebController | - +surveyMeasurements: List<MeasurementSurveyFormData>; - +id: String + +iFrameElement: IFrameElement | - +Study apply(); - +MeasurementsFormData copy() + +void activate(); + +void registerViews(); + +void generateUrl(); + +void navigate(); + +void refresh(); + +void openNewPage(); + +void listen(); + +void send() ] - [<abstract>IStudyFormData]<:--[MeasurementsFormData] + [WebController]o-[IFrameElement] + [<abstract>PlatformController]<:-[WebController] - [MeasurementsFormViewModel - | - +study: Study; - +router: GoRouter; - +measurementsArray: FormArray<dynamic>; - +surveyMeasurementFormViewModels: FormViewModelCollection<MeasurementSurveyFormViewModel, MeasurementSurveyFormData>; - +form: FormGroup; - +measurementViewModels: List<MeasurementSurveyFormViewModel>; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +measurementRequired: dynamic; - +titles: Map<FormMode, String> + [MobileController | - +void read(); - +void setControlsFrom(); - +MeasurementsFormData buildFormData(); - +List<ModelAction<dynamic>> availableActions(); - +List<ModelAction<dynamic>> availablePopupActions(); - +List<ModelAction<dynamic>> availableInlineActions(); - +void onSelectItem(); - +void onNewItem(); - +MeasurementSurveyFormViewModel provide(); - +void onCancel(); - +dynamic onSave() + +void openNewPage(); + +void refresh(); + +void registerViews(); + +void listen(); + +void send(); + +void navigate(); + +void activate(); + +void generateUrl() ] - [MeasurementsFormViewModel]o-[Study] - [MeasurementsFormViewModel]o-[GoRouter] - [MeasurementsFormViewModel]o-[FormArray] - [MeasurementsFormViewModel]o-[FormViewModelCollection] - [MeasurementsFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[MeasurementsFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[MeasurementsFormViewModel] - [<abstract>IListActionProvider]<:--[MeasurementsFormViewModel] - [<abstract>IProviderArgsResolver]<:--[MeasurementsFormViewModel] + [<abstract>PlatformController]<:-[MobileController] - [StudyFormValidationSet + [StudyController | - +index: int; - <static>+values: List<StudyFormValidationSet> + +notificationService: INotificationService; + +studyEventsSubscription: StreamSubscription<ModelEvent<Study>>?; + +studyActions: List<ModelAction<dynamic>> + | + +dynamic syncStudyStatus(); + +dynamic onStudySubscriptionUpdate(); + -dynamic _redirectNewToActualStudyID(); + +dynamic publishStudy(); + +void onChangeStudyParticipation(); + +void onAddParticipants(); + +void onSettingsPressed(); + +void dispose() ] - [Enum]<:--[StudyFormValidationSet] + [StudyController]o-[<abstract>INotificationService] + [StudyController]o-[StreamSubscription] + [StudyBaseController]<:-[StudyController] - [ReportsFormViewModel - | - +study: Study; - +router: GoRouter; - +reportItemDelegate: ReportFormItemDelegate; - +reportItemArray: FormArray<dynamic>; - +reportItemFormViewModels: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData>; - +form: FormGroup; - +reportItemModels: List<ReportItemFormViewModel>; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titles: Map<FormMode, String>; - +canTestConsent: bool + [<abstract>IStudyNavViewModel | - +void setControlsFrom(); - +ReportsFormData buildFormData(); - +void read(); - +ReportItemFormRouteArgs buildNewReportItemFormRouteArgs(); - +ReportItemFormRouteArgs buildReportItemFormRouteArgs(); - +dynamic testReport(); - +void onCancel(); - +dynamic onSave(); - +ReportItemFormViewModel provide() + +isEditTabEnabled: bool; + +isTestTabEnabled: bool; + +isRecruitTabEnabled: bool; + +isMonitorTabEnabled: bool; + +isAnalyzeTabEnabled: bool; + +isSettingsEnabled: bool ] - [ReportsFormViewModel]o-[Study] - [ReportsFormViewModel]o-[GoRouter] - [ReportsFormViewModel]o-[ReportFormItemDelegate] - [ReportsFormViewModel]o-[FormArray] - [ReportsFormViewModel]o-[FormViewModelCollection] - [ReportsFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[ReportsFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[ReportsFormViewModel] - [<abstract>IProviderArgsResolver]<:--[ReportsFormViewModel] - - [ReportFormItemDelegate + [StudyNav | - +formViewModelCollection: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData>; - +owner: ReportsFormViewModel; - +propagateOnSave: bool; - +validationSet: dynamic - | - +void onCancel(); - +dynamic onSave(); - +ReportItemFormViewModel provide(); - +List<ModelAction<dynamic>> availableActions(); - +void onNewItem(); - +void onSelectItem() + <static>+dynamic tabs(); + <static>+dynamic edit(); + <static>+dynamic test(); + <static>+dynamic recruit(); + <static>+dynamic monitor(); + <static>+dynamic analyze() ] - [ReportFormItemDelegate]o-[FormViewModelCollection] - [ReportFormItemDelegate]o-[ReportsFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[ReportFormItemDelegate] - [<abstract>IListActionProvider]<:--[ReportFormItemDelegate] - [<abstract>IProviderArgsResolver]<:--[ReportFormItemDelegate] - - [ReportItemFormData - | - +isPrimary: bool; - +section: ReportSection; - +id: String + [StudyDesignNav | - <static>+dynamic fromDomainModel(); - +ReportItemFormData copy() + <static>+dynamic tabs(); + <static>+dynamic info(); + <static>+dynamic enrollment(); + <static>+dynamic interventions(); + <static>+dynamic measurements(); + <static>+dynamic reports() ] - [ReportItemFormData]o-[<abstract>ReportSection] - [<abstract>IFormData]<:-[ReportItemFormData] - - [ReportItemFormView + [<abstract>StudyPageWidget | - +formViewModel: ReportItemFormViewModel; - +studyId: String; - +reportSectionColumnWidth: dynamic; - +sectionTypeBodyBuilder: Widget Function(BuildContext) + +studyId: String | - +Widget build(); - -dynamic _buildSectionText(); - -dynamic _buildSectionTypeHeader() + +Widget? banner() ] - [ReportItemFormView]o-[ReportItemFormViewModel] - [ReportItemFormView]o-[Widget Function(BuildContext)] + [<abstract>ConsumerWidget]<:-[<abstract>StudyPageWidget] + [<abstract>IWithBanner]<:--[<abstract>StudyPageWidget] - [ReportItemFormViewModel + [StudyParticipationBadge | - <static>+defaultSectionType: ReportSectionType; - +sectionIdControl: FormControl<String>; - +sectionTypeControl: FormControl<ReportSectionType>; - +titleControl: FormControl<String>; - +descriptionControl: FormControl<String>; - +sectionControl: FormControl<ReportSection>; - +dataReferenceControl: FormControl<DataReferenceIdentifier<num>>; - +temporalAggregationControl: FormControl<TemporalAggregationFormatted>; - +improvementDirectionControl: FormControl<ImprovementDirectionFormatted>; - +alphaControl: FormControl<double>; - -_controlsBySectionType: Map<ReportSectionType, FormGroup>; - -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - -_validationConfigsBySectionType: Map<ReportSectionType, Map<FormValidationSetEnum, List<FormControlValidation>>>; - +sectionBaseControls: Map<String, AbstractControl<dynamic>>; - +form: FormGroup; - +sectionId: String; - +sectionType: ReportSectionType; - <static>+sectionTypeControlOptions: List<FormControlOption<ReportSectionType>>; - <static>+temporalAggregationControlOptions: List<FormControlOption<TemporalAggregationFormatted>>; - <static>+improvementDirectionControlOptions: List<FormControlOption<ImprovementDirectionFormatted>>; - +titles: Map<FormMode, String>; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titleRequired: dynamic; - +descriptionRequired: dynamic; - +dataReferenceRequired: dynamic; - +aggregationRequired: dynamic; - +improvementDirectionRequired: dynamic; - +alphaConfidenceRequired: dynamic + +participation: Participation; + +type: BadgeType; + +showPrefixIcon: bool; + +center: bool | - -List<FormControlValidation> _getValidationConfig(); - +ReportItemFormData buildFormData(); - +ReportItemFormViewModel createDuplicate(); - +dynamic onSectionTypeChanged(); - -void _updateFormControls(); - +void setControlsFrom() + +Widget build() ] - [ReportItemFormViewModel]o-[ReportSectionType] - [ReportItemFormViewModel]o-[FormControl] - [ReportItemFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[ReportItemFormViewModel] + [StudyParticipationBadge]o-[Participation] + [StudyParticipationBadge]o-[BadgeType] - [TemporalAggregationFormatted + [StudyBaseController | - -_value: TemporalAggregation; - <static>+values: List<TemporalAggregationFormatted>; - +value: TemporalAggregation; - +string: String; - +icon: IconData?; - +hashCode: int + +studyId: String; + +studyRepository: IStudyRepository; + +router: GoRouter; + +studySubscription: StreamSubscription<WrappedModel<Study>>? | - +bool ==(); - +String toString(); - +String toJson(); - <static>+TemporalAggregationFormatted fromJson() + +dynamic subscribeStudy(); + +dynamic onStudySubscriptionUpdate(); + +dynamic onStudySubscriptionError(); + +void dispose() ] - [TemporalAggregationFormatted]o-[TemporalAggregation] - [TemporalAggregationFormatted]o-[IconData] + [StudyBaseController]o-[<abstract>IStudyRepository] + [StudyBaseController]o-[GoRouter] + [StudyBaseController]o-[StreamSubscription] - [ImprovementDirectionFormatted - | - -_value: ImprovementDirection; - <static>+values: List<ImprovementDirectionFormatted>; - +value: ImprovementDirection; - +string: String; - +icon: IconData?; - +hashCode: int + [PreviewFrame | - +bool ==(); - +String toString(); - +String toJson(); - <static>+ImprovementDirectionFormatted fromJson() + +studyId: String; + +routeArgs: StudyFormRouteArgs?; + +route: String? ] - [ImprovementDirectionFormatted]o-[ImprovementDirection] - [ImprovementDirectionFormatted]o-[IconData] + [PreviewFrame]o-[<abstract>StudyFormRouteArgs] - [ReportSectionType + [<abstract>IStudyAppBarViewModel | - +index: int; - <static>+values: List<ReportSectionType>; - <static>+average: ReportSectionType; - <static>+linearRegression: ReportSectionType + +isSyncIndicatorVisible: bool; + +isStatusBadgeVisible: bool; + +isPublishVisible: bool ] - [ReportSectionType]o-[ReportSectionType] - [Enum]<:--[ReportSectionType] + [<abstract>IStudyStatusBadgeViewModel]<:--[<abstract>IStudyAppBarViewModel] + [<abstract>IStudyNavViewModel]<:--[<abstract>IStudyAppBarViewModel] - [AverageSectionFormView + [StudyScaffold | - +formViewModel: ReportItemFormViewModel; +studyId: String; - +reportSectionColumnWidth: Map<int, TableColumnWidth> - | - +Widget build() + +tabs: List<NavbarTab>?; + +tabsSubnav: List<NavbarTab>?; + +selectedTab: NavbarTab?; + +selectedTabSubnav: NavbarTab?; + +body: StudyPageWidget; + +drawer: Widget?; + +disableActions: bool; + +actionsSpacing: double; + +actionsPadding: double; + +layoutType: SingleColumnLayoutType?; + +appbarHeight: double; + +appbarSubnavHeight: double ] - [AverageSectionFormView]o-[ReportItemFormViewModel] - [<abstract>ConsumerWidget]<:-[AverageSectionFormView] + [StudyScaffold]o-[NavbarTab] + [StudyScaffold]o-[<abstract>StudyPageWidget] + [StudyScaffold]o-[<abstract>Widget] + [StudyScaffold]o-[SingleColumnLayoutType] - [LinearRegressionSectionFormView + [WebFrame | - +formViewModel: ReportItemFormViewModel; - +studyId: String; - +reportSectionColumnWidth: Map<int, TableColumnWidth> + +previewSrc: String; + +studyId: String | +Widget build() ] - [LinearRegressionSectionFormView]o-[ReportItemFormViewModel] - [<abstract>ConsumerWidget]<:-[LinearRegressionSectionFormView] - - [DataReferenceIdentifier - | - +hashCode: int + [DisabledFrame | - +bool ==() + +Widget build() ] - [DataReference]<:-[DataReferenceIdentifier] - - [DataReferenceEditor + [PhoneContainer | - +formControl: FormControl<DataReferenceIdentifier<T>>; - +availableTasks: List<Task>; - +buildReactiveDropdownField: ReactiveDropdownField<dynamic> + <static>+defaultWidth: double; + <static>+defaultHeight: double; + +width: double; + +height: double; + +borderColor: Color; + +borderWidth: double; + +borderRadius: double; + +innerContent: Widget; + +innerContentBackgroundColor: Color? | - +FormTableRow buildFormTableRow(); - -List<DropdownMenuItem<DataReferenceIdentifier<dynamic>>> _dataReferenceItems() + +Widget build() ] - [DataReferenceEditor]o-[FormControl] - [DataReferenceEditor]o-[ReactiveDropdownField] + [PhoneContainer]o-[Color] + [PhoneContainer]o-[<abstract>Widget] - [ReportsFormData - | - +reportItems: List<ReportItemFormData>; - +id: String + [MobileFrame | - +Study apply(); - +ReportsFormData copy() + +Widget build() ] - [<abstract>IStudyFormData]<:--[ReportsFormData] - - [ReportStatus + [DesktopFrame | - +index: int; - <static>+values: List<ReportStatus>; - <static>+primary: ReportStatus; - <static>+secondary: ReportStatus + +Widget build() ] - [ReportStatus]o-[ReportStatus] - [Enum]<:--[ReportStatus] - - [ReportBadge + [StudyTestScreen | - +status: ReportStatus?; - +type: BadgeType; - +showPrefixIcon: bool; - +showTooltip: bool + +previewRoute: String? | - +Widget build() + +Widget build(); + +Widget? banner(); + +dynamic load(); + +dynamic save(); + +dynamic showHelp() ] - [ReportBadge]o-[ReportStatus] - [ReportBadge]o-[BadgeType] + [<abstract>StudyPageWidget]<:-[StudyTestScreen] - [StudyDesignReportsFormView + [StudySettingsFormViewModel | - +Widget build(); - -dynamic _showReportItemSidesheetWithArgs() + +study: AsyncValue<Study>; + +studyRepository: IStudyRepository; + <static>+defaultPublishedToRegistry: bool; + <static>+defaultPublishedToRegistryResults: bool; + +isPublishedToRegistryControl: FormControl<bool>; + +isPublishedToRegistryResultsControl: FormControl<bool>; + +form: FormGroup; + +titles: Map<FormMode, String> + | + +void setControlsFrom(); + +Study buildFormData(); + +dynamic keepControlsSynced(); + +dynamic save(); + +dynamic setLaunchDefaults() ] - [<abstract>StudyDesignPageWidget]<:-[StudyDesignReportsFormView] + [StudySettingsFormViewModel]o-[<abstract>AsyncValue] + [StudySettingsFormViewModel]o-[<abstract>IStudyRepository] + [StudySettingsFormViewModel]o-[FormControl] + [StudySettingsFormViewModel]o-[FormGroup] + [<abstract>FormViewModel]<:-[StudySettingsFormViewModel] - [StudyFormScaffold + [StudySettingsDialog | - +studyId: String; - +formViewModelBuilder: T Function(WidgetRef); - +formViewBuilder: Widget Function(T) + +Widget build() + ] + + [<abstract>StudyPageWidget]<:-[StudySettingsDialog] + + [StudyTestController | + +authRepository: IAuthRepository; + +languageCode: String + ] + + [StudyTestController]o-[<abstract>IAuthRepository] + [StudyBaseController]<:-[StudyTestController] + + [TestAppRoutes + | + <static>+studyOverview: String; + <static>+eligibility: String; + <static>+intervention: String; + <static>+consent: String; + <static>+journey: String; + <static>+dashboard: String + ] + + [DrawerEntry + | + +localizedTitle: String Function(); + +icon: IconData?; + +localizedHelpText: String Function()?; + +enabled: bool; + +onSelected: void Function(BuildContext, WidgetRef)?; + +autoCloseDrawer: bool; + +title: String; + +helpText: String? + | + +void onClick() + ] + + [DrawerEntry]o-[String Function()] + [DrawerEntry]o-[IconData] + [DrawerEntry]o-[String Function()?] + [DrawerEntry]o-[void Function(BuildContext, WidgetRef)?] + + [GoRouterDrawerEntry + | + +intent: RoutingIntent; + +onNavigated: void Function()? + | + +void onClick() + ] + + [GoRouterDrawerEntry]o-[RoutingIntent] + [GoRouterDrawerEntry]o-[void Function()?] + [DrawerEntry]<:-[GoRouterDrawerEntry] + + [AppDrawer + | + +width: int; + +autoCloseDrawer: bool; + +leftPaddingEntries: double; + +logoPaddingVertical: double; + +logoPaddingHorizontal: double; + +logoMaxHeight: double; + +logoSectionMinHeight: double; + +logoSectionMaxHeight: double + ] + + [StudyAnalyzeScreen + | + +Widget? banner(); +Widget build() ] - [StudyFormScaffold]o-[T Function(WidgetRef)] - [StudyFormScaffold]o-[Widget Function(T)] - [<abstract>ConsumerWidget]<:-[StudyFormScaffold] + [<abstract>StudyPageWidget]<:-[StudyAnalyzeScreen] - [SurveyQuestionFormView + [StudyAnalyzeController | - +formViewModel: QuestionFormViewModel; - +isHtmlStyleable: bool + +dynamic onExport() ] - [SurveyQuestionFormView]o-[QuestionFormViewModel] + [StudyBaseController]<:-[StudyAnalyzeController] - [QuestionFormViewModel + [StudyDesignInterventionsFormView | - <static>+defaultQuestionType: SurveyQuestionType; - -_titles: Map<FormMode, String Function()>?; - +questionIdControl: FormControl<String>; - +questionTypeControl: FormControl<SurveyQuestionType>; - +questionTextControl: FormControl<String>; - +questionInfoTextControl: FormControl<String>; - +questionBaseControls: Map<String, AbstractControl<dynamic>>; - +isMultipleChoiceControl: FormControl<bool>; - +choiceResponseOptionsArray: FormArray<dynamic>; - +customOptionsMin: int; - +customOptionsMax: int; - +customOptionsInitial: int; - +boolResponseOptionsArray: FormArray<String>; - +imageResponseOptionsArray: FormArray<String>; - <static>+kDefaultMaxRecordingDurationSeconds: int; - <static>+kMaxRecordingDurationSeconds: int; - +audioResponseOptionsArray: FormArray<String>; - +maxRecordingDurationSecondsControl: FormControl<int>; - <static>+kDefaultScaleMinValue: int; - <static>+kDefaultScaleMaxValue: int; - <static>+kNumMidValueControls: int; - <static>+kMidValueDebounceMilliseconds: int; - +scaleMinValueControl: FormControl<int>; - +scaleMaxValueControl: FormControl<int>; - -_scaleRangeControl: FormControl<int>; - +scaleMinLabelControl: FormControl<String>; - +scaleMaxLabelControl: FormControl<String>; - +scaleMidValueControls: FormArray<int>; - +scaleMidLabelControls: FormArray<String?>; - -_scaleResponseOptionsArray: FormArray<int>; - +scaleMinColorControl: FormControl<SerializableColor>; - +scaleMaxColorControl: FormControl<SerializableColor>; - +prevMidValues: List<int?>?; - +freeTextTypeControl: FormControl<FreeTextQuestionType>; - +customRegexControl: FormControl<String>; - +freeTextResponseOptionsArray: FormArray<dynamic>; - +freeTextLengthMin: AbstractControl<int>; - +freeTextLengthMax: AbstractControl<int>; - +freeTextExampleTextControl: FormControl<String>; - <static>+kDefaultFreeTextMinLength: int; - <static>+kDefaultFreeTextMaxLength: int; - +freeTextLengthControl: FormControl<RangeValues>; - -_controlsByQuestionType: Map<SurveyQuestionType, FormGroup>; - -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - -_validationConfigsByQuestionType: Map<SurveyQuestionType, Map<FormValidationSetEnum, List<FormControlValidation>>>; - +form: FormGroup; - +questionId: String; - +questionType: SurveyQuestionType; - +questionTypeControlOptions: List<FormControlOption<SurveyQuestionType>>; - +answerOptionsArray: FormArray<dynamic>; - +answerOptionsControls: List<AbstractControl<dynamic>>; - +validAnswerOptions: List<String>; - +boolOptions: List<AbstractControl<String>>; - +imageOptions: List<AbstractControl<String>>; - +audioOptions: List<AbstractControl<String>>; - +scaleMinValue: int; - +scaleMaxValue: int; - +scaleRange: int; - +scaleAllValueControls: List<AbstractControl<int>>; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +questionTextRequired: dynamic; - +numValidChoiceOptions: dynamic; - +scaleRangeValid: dynamic; - +maxRecordingDurationValid: dynamic; - +titles: Map<FormMode, String>; - +isAddOptionButtonVisible: bool; - +isMidValuesClearedInfoVisible: bool + +Widget build() + ] + + [<abstract>StudyDesignPageWidget]<:-[StudyDesignInterventionsFormView] + + [InterventionFormView | - +String? scaleMidLabelAt(); - -dynamic _onScaleRangeChanged(); - -dynamic _applyInputFormatters(); - -dynamic _updateScaleMidValueControls(); - -Map<String, dynamic>? _validateFreeText(); - -dynamic _onFreeTextLengthChanged(); - -List<FormControlValidation> _getValidationConfig(); - +dynamic onQuestionTypeChanged(); - +dynamic onResponseOptionsChanged(); - -void _updateFormControls(); - +void initControls(); - +void setControlsFrom(); - +QuestionFormData buildFormData(); - +List<ModelAction<dynamic>> availableActions(); - +void onNewItem(); - +void onSelectItem(); - +dynamic save(); - +QuestionFormViewModel createDuplicate() + +formViewModel: InterventionFormViewModel ] - [QuestionFormViewModel]o-[SurveyQuestionType] - [QuestionFormViewModel]o-[FormControl] - [QuestionFormViewModel]o-[FormArray] - [QuestionFormViewModel]o-[<abstract>AbstractControl] - [QuestionFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[QuestionFormViewModel] - [<abstract>IListActionProvider]<:--[QuestionFormViewModel] + [InterventionFormView]o-[InterventionFormViewModel] - [<abstract>QuestionFormData + [InterventionPreview | - <static>+questionTypeFormDataFactories: Map<SurveyQuestionType, QuestionFormData Function(Question<dynamic>, List<EligibilityCriterion>)>; - +questionId: String; - +questionText: String; - +questionInfoText: String?; - +questionType: SurveyQuestionType; - +responseOptionsValidity: Map<dynamic, bool>; - +responseOptions: List<dynamic>; + +routeArgs: InterventionFormRouteArgs + | + +Widget build() + ] + + [InterventionPreview]o-[InterventionFormRouteArgs] + [<abstract>ConsumerWidget]<:-[InterventionPreview] + + [StudyScheduleFormView + | + +formViewModel: StudyScheduleControls + | + -FormTableRow _renderCustomSequence(); + +Widget build() + ] + + [StudyScheduleFormView]o-[<abstract>StudyScheduleControls] + [<abstract>FormConsumerWidget]<:-[StudyScheduleFormView] + + [InterventionTaskFormData + | + +taskId: String; + +taskTitle: String; + +taskDescription: String?; + <static>+kDefaultTitle: String; +id: String | - +Question<dynamic> toQuestion(); - +EligibilityCriterion toEligibilityCriterion(); - +Answer<dynamic> constructAnswerFor(); - +dynamic setResponseOptionsValidityFrom(); - +QuestionFormData copy() + +CheckmarkTask toTask(); + +InterventionTaskFormData copy() ] - [<abstract>QuestionFormData]o-[SurveyQuestionType] - [<abstract>IFormData]<:--[<abstract>QuestionFormData] + [<abstract>IFormDataWithSchedule]<:-[InterventionTaskFormData] - [ChoiceQuestionFormData + [InterventionsFormViewModel | - +isMultipleChoice: bool; - +answerOptions: List<String>; - +responseOptions: List<String> + +study: Study; + +router: GoRouter; + +interventionsArray: FormArray<dynamic>; + +interventionsCollection: FormViewModelCollection<InterventionFormViewModel, InterventionFormData>; + +form: FormGroup; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +interventionsRequired: dynamic; + +titles: Map<FormMode, String>; + +canTestStudySchedule: bool | - +Question<dynamic> toQuestion(); - +QuestionFormData copy(); - -Choice _buildChoiceForValue(); - +Answer<dynamic> constructAnswerFor() + +void setControlsFrom(); + +InterventionsFormData buildFormData(); + +void read(); + +List<ModelAction<dynamic>> availableActions(); + +List<ModelAction<dynamic>> availablePopupActions(); + +List<ModelAction<dynamic>> availableInlineActions(); + +void onSelectItem(); + +void onNewItem(); + +InterventionFormViewModel provide(); + +void onCancel(); + +dynamic onSave(); + +dynamic testStudySchedule() ] - [<abstract>QuestionFormData]<:-[ChoiceQuestionFormData] + [InterventionsFormViewModel]o-[Study] + [InterventionsFormViewModel]o-[GoRouter] + [InterventionsFormViewModel]o-[FormArray] + [InterventionsFormViewModel]o-[FormViewModelCollection] + [InterventionsFormViewModel]o-[FormGroup] + [<abstract>FormViewModel]<:-[InterventionsFormViewModel] + [<abstract>StudyScheduleControls]<:-[InterventionsFormViewModel] + [<abstract>IFormViewModelDelegate]<:--[InterventionsFormViewModel] + [<abstract>IListActionProvider]<:--[InterventionsFormViewModel] + [<abstract>IProviderArgsResolver]<:--[InterventionsFormViewModel] - [BoolQuestionFormData + [InterventionTaskFormViewModel | - <static>+kResponseOptions: Map<String, bool>; - +responseOptions: List<String> + +taskIdControl: FormControl<String>; + +instanceIdControl: FormControl<String>; + +taskTitleControl: FormControl<String>; + +taskDescriptionControl: FormControl<String>; + +markAsCompletedControl: FormControl<bool>; + +form: FormGroup; + +taskId: String; + +instanceId: String; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +titleRequired: dynamic; + +titles: Map<FormMode, String> | - +Question<dynamic> toQuestion(); - +BoolQuestionFormData copy(); - +Answer<dynamic> constructAnswerFor() + +void setControlsFrom(); + +InterventionTaskFormData buildFormData(); + +InterventionTaskFormViewModel createDuplicate() ] - [<abstract>QuestionFormData]<:-[BoolQuestionFormData] + [InterventionTaskFormViewModel]o-[FormControl] + [InterventionTaskFormViewModel]o-[FormGroup] + [<abstract>ManagedFormViewModel]<:-[InterventionTaskFormViewModel] + [<abstract>WithScheduleControls]<:-[InterventionTaskFormViewModel] - [ImageQuestionFormData + [<abstract>StudyScheduleControls | - <static>+kResponseOptions: Map<String, FutureBlobFile>; - +responseOptions: List<String> + <static>+defaultScheduleType: PhaseSequence; + <static>+defaultScheduleTypeSequence: String; + <static>+defaultNumCycles: int; + <static>+defaultPeriodLength: int; + +sequenceTypeControl: FormControl<PhaseSequence>; + +sequenceTypeCustomControl: FormControl<String>; + +phaseDurationControl: FormControl<int>; + +numCyclesControl: FormControl<int>; + +includeBaselineControl: FormControl<bool>; + +studyScheduleControls: Map<String, FormControl<Object>>; + <static>+kNumCyclesMin: int; + <static>+kNumCyclesMax: int; + <static>+kPhaseDurationMin: int; + <static>+kPhaseDurationMax: int; + +sequenceTypeControlOptions: List<FormControlOption<PhaseSequence>>; + +studyScheduleValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +numCyclesRange: dynamic; + +phaseDurationRange: dynamic; + +customSequenceRequired: dynamic | - +Question<dynamic> toQuestion(); - +ImageQuestionFormData copy(); - +Answer<dynamic> constructAnswerFor() + +void setStudyScheduleControlsFrom(); + +StudyScheduleFormData buildStudyScheduleFormData(); + +bool isSequencingCustom() ] - [<abstract>QuestionFormData]<:-[ImageQuestionFormData] + [<abstract>StudyScheduleControls]o-[PhaseSequence] + [<abstract>StudyScheduleControls]o-[FormControl] - [AudioQuestionFormData + [InterventionFormData | - +maxRecordingDurationSeconds: int; - <static>+kResponseOptions: Map<String, FutureBlobFile>; - +responseOptions: List<String> + +interventionId: String; + +title: String; + +description: String?; + +tasksData: List<InterventionTaskFormData>?; + +iconName: String?; + <static>+kDefaultTitle: String; + +id: String | - +Question<dynamic> toQuestion(); - +AudioQuestionFormData copy(); - +Answer<dynamic> constructAnswerFor() + +Intervention toIntervention(); + +InterventionFormData copy() ] - [<abstract>QuestionFormData]<:-[AudioQuestionFormData] + [<abstract>IFormData]<:-[InterventionFormData] - [ScaleQuestionFormData + [StudyScheduleFormData | - +minValue: double; - +maxValue: double; - +minLabel: String?; - +maxLabel: String?; - +midValues: List<double?>; - +midLabels: List<String?>; - +stepSize: double; - +initialValue: double?; - +minColor: Color?; - +maxColor: Color?; - +responseOptions: List<double>; - +midAnnotations: List<Annotation> + +sequenceType: PhaseSequence; + +sequenceTypeCustom: String; + +numCycles: int; + +phaseDuration: int; + +includeBaseline: bool; + +id: String | - +ScaleQuestion toQuestion(); - +QuestionFormData copy(); - +Answer<dynamic> constructAnswerFor() + +StudySchedule toStudySchedule(); + +Study apply(); + +StudyScheduleFormData copy() + ] + + [StudyScheduleFormData]o-[PhaseSequence] + [<abstract>IStudyFormData]<:--[StudyScheduleFormData] + + [InterventionTaskFormView + | + +formViewModel: InterventionTaskFormViewModel ] - [ScaleQuestionFormData]o-[Color] - [<abstract>QuestionFormData]<:-[ScaleQuestionFormData] + [InterventionTaskFormView]o-[InterventionTaskFormViewModel] - [FreeTextQuestionFormData + [InterventionsFormData | - +textLengthRange: List<int>; - +textType: FreeTextQuestionType; - +textTypeExpression: String?; - +responseOptions: List<String> + +interventionsData: List<InterventionFormData>; + +studyScheduleData: StudyScheduleFormData; + +id: String | - +Question<dynamic> toQuestion(); - +FreeTextQuestionFormData copy(); - +Answer<dynamic> constructAnswerFor() + +Study apply(); + +InterventionsFormData copy() ] - [FreeTextQuestionFormData]o-[FreeTextQuestionType] - [<abstract>QuestionFormData]<:-[FreeTextQuestionFormData] + [InterventionsFormData]o-[StudyScheduleFormData] + [<abstract>IStudyFormData]<:--[InterventionsFormData] - [<abstract>IScaleQuestionFormViewModel + [InterventionFormViewModel | - +isMidValuesClearedInfoVisible: bool - ] - - [ScaleQuestionFormView + +study: Study; + +interventionIdControl: FormControl<String>; + +interventionTitleControl: FormControl<String>; + +interventionIconControl: FormControl<IconOption>; + +interventionDescriptionControl: FormControl<String>; + +interventionTasksArray: FormArray<dynamic>; + +tasksCollection: FormViewModelCollection<InterventionTaskFormViewModel, InterventionTaskFormData>; + +form: FormGroup; + +interventionId: String; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +titleRequired: dynamic; + +atLeastOneTask: dynamic; + +breadcrumbsTitle: String; + +titles: Map<FormMode, String> | - +formViewModel: QuestionFormViewModel + +void setControlsFrom(); + +InterventionFormData buildFormData(); + +List<ModelAction<dynamic>> availableActions(); + +List<ModelAction<dynamic>> availablePopupActions(); + +List<ModelAction<dynamic>> availableInlineActions(); + +void onSelectItem(); + +void onNewItem(); + +void onCancel(); + +dynamic onSave(); + +InterventionTaskFormViewModel provide(); + +InterventionTaskFormRouteArgs buildNewFormRouteArgs(); + +InterventionTaskFormRouteArgs buildFormRouteArgs(); + +InterventionFormViewModel createDuplicate() ] - [ScaleQuestionFormView]o-[QuestionFormViewModel] + [InterventionFormViewModel]o-[Study] + [InterventionFormViewModel]o-[FormControl] + [InterventionFormViewModel]o-[FormArray] + [InterventionFormViewModel]o-[FormViewModelCollection] + [InterventionFormViewModel]o-[FormGroup] + [<abstract>ManagedFormViewModel]<:-[InterventionFormViewModel] + [<abstract>IFormViewModelDelegate]<:--[InterventionFormViewModel] + [<abstract>IListActionProvider]<:--[InterventionFormViewModel] + [<abstract>IProviderArgsResolver]<:--[InterventionFormViewModel] - [FreeTextQuestionFormView - | - +formViewModel: QuestionFormViewModel; - +generateLabelHelpTextMap: dynamic + [StudyDesignReportsFormView | +Widget build(); - +Widget disableOnReadonly(); - +Widget generateRow() + -dynamic _showReportItemSidesheetWithArgs() ] - [FreeTextQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[FreeTextQuestionFormView] + [<abstract>StudyDesignPageWidget]<:-[StudyDesignReportsFormView] - [BoolQuestionFormView + [ReportItemFormData | - +formViewModel: QuestionFormViewModel + +isPrimary: bool; + +section: ReportSection; + +id: String | - +Widget build() + <static>+dynamic fromDomainModel(); + +ReportItemFormData copy() ] - [BoolQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[BoolQuestionFormView] + [ReportItemFormData]o-[<abstract>ReportSection] + [<abstract>IFormData]<:-[ReportItemFormData] - [SurveyQuestionType + [DataReferenceEditor | - +index: int; - <static>+values: List<SurveyQuestionType>; - <static>+choice: SurveyQuestionType; - <static>+bool: SurveyQuestionType; - <static>+scale: SurveyQuestionType; - <static>+image: SurveyQuestionType; - <static>+audio: SurveyQuestionType; - <static>+freeText: SurveyQuestionType + +formControl: FormControl<DataReferenceIdentifier<T>>; + +availableTasks: List<Task>; + +buildReactiveDropdownField: ReactiveDropdownField<dynamic> + | + +FormTableRow buildFormTableRow(); + -List<DropdownMenuItem<DataReferenceIdentifier<dynamic>>> _dataReferenceItems() ] - [SurveyQuestionType]o-[SurveyQuestionType] - [Enum]<:--[SurveyQuestionType] + [DataReferenceEditor]o-[FormControl] + [DataReferenceEditor]o-[ReactiveDropdownField] - [AudioRecordingQuestionFormView + [TemporalAggregationFormatted | - +formViewModel: QuestionFormViewModel + -_value: TemporalAggregation; + <static>+values: List<TemporalAggregationFormatted>; + +value: TemporalAggregation; + +string: String; + +icon: IconData?; + +hashCode: int | - +Widget build() + +bool ==(); + +String toString(); + +String toJson(); + <static>+TemporalAggregationFormatted fromJson() ] - [AudioRecordingQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[AudioRecordingQuestionFormView] + [TemporalAggregationFormatted]o-[TemporalAggregation] + [TemporalAggregationFormatted]o-[IconData] - [ChoiceQuestionFormView + [ImprovementDirectionFormatted | - +formViewModel: QuestionFormViewModel + -_value: ImprovementDirection; + <static>+values: List<ImprovementDirectionFormatted>; + +value: ImprovementDirection; + +string: String; + +icon: IconData?; + +hashCode: int | - +Widget build() + +bool ==(); + +String toString(); + +String toJson(); + <static>+ImprovementDirectionFormatted fromJson() ] - [ChoiceQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[ChoiceQuestionFormView] + [ImprovementDirectionFormatted]o-[ImprovementDirection] + [ImprovementDirectionFormatted]o-[IconData] - [ImageCapturingQuestionFormView - | - +formViewModel: QuestionFormViewModel + [ReportSectionType | - +Widget build() + +index: int; + <static>+values: List<ReportSectionType>; + <static>+average: ReportSectionType; + <static>+linearRegression: ReportSectionType ] - [ImageCapturingQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[ImageCapturingQuestionFormView] + [ReportSectionType]o-[ReportSectionType] + [Enum]<:--[ReportSectionType] - [<abstract>WithQuestionnaireControls + [AverageSectionFormView | - +questionsArray: FormArray<dynamic>; - +questionFormViewModels: FormViewModelCollection<Q, QuestionFormData>; - +questionnaireControls: Map<String, FormArray<dynamic>>; - +propagateOnSave: bool; - +questionModels: List<Q>; - +questionTitles: Map<FormMode, String Function()> + +formViewModel: ReportItemFormViewModel; + +studyId: String; + +reportSectionColumnWidth: Map<int, TableColumnWidth> | - +void setQuestionnaireControlsFrom(); - +QuestionnaireFormData buildQuestionnaireFormData(); - +void read(); - +void onCancel(); - +dynamic onSave(); - +Q provide(); - +Q provideQuestionFormViewModel() + +Widget build() ] - [<abstract>WithQuestionnaireControls]o-[FormArray] - [<abstract>WithQuestionnaireControls]o-[FormViewModelCollection] - [<abstract>IFormViewModelDelegate]<:--[<abstract>WithQuestionnaireControls] - [<abstract>IProviderArgsResolver]<:--[<abstract>WithQuestionnaireControls] + [AverageSectionFormView]o-[ReportItemFormViewModel] + [<abstract>ConsumerWidget]<:-[AverageSectionFormView] - [QuestionnaireFormData + [DataReferenceIdentifier | - +questionsData: List<QuestionFormData>?; - +id: String + +hashCode: int | - +StudyUQuestionnaire toQuestionnaire(); - +List<EligibilityCriterion> toEligibilityCriteria(); - +QuestionnaireFormData copy() + +bool ==() ] - [<abstract>IFormData]<:--[QuestionnaireFormData] + [DataReference]<:-[DataReferenceIdentifier] - [ScheduleControls + [LinearRegressionSectionFormView | - +formViewModel: WithScheduleControls + +formViewModel: ReportItemFormViewModel; + +studyId: String; + +reportSectionColumnWidth: Map<int, TableColumnWidth> | - +Widget build(); - -List<FormTableRow> _conditionalTimeRestrictions() + +Widget build() ] - [ScheduleControls]o-[<abstract>WithScheduleControls] - [<abstract>FormConsumerWidget]<:-[ScheduleControls] + [LinearRegressionSectionFormView]o-[ReportItemFormViewModel] + [<abstract>ConsumerWidget]<:-[LinearRegressionSectionFormView] - [<abstract>IFormDataWithSchedule + [ReportItemFormViewModel | - +instanceId: String; - +isTimeLocked: bool; - +timeLockStart: StudyUTimeOfDay?; - +timeLockEnd: StudyUTimeOfDay?; - +hasReminder: bool; - +reminderTime: StudyUTimeOfDay? + <static>+defaultSectionType: ReportSectionType; + +sectionIdControl: FormControl<String>; + +sectionTypeControl: FormControl<ReportSectionType>; + +titleControl: FormControl<String>; + +descriptionControl: FormControl<String>; + +sectionControl: FormControl<ReportSection>; + +dataReferenceControl: FormControl<DataReferenceIdentifier<num>>; + +temporalAggregationControl: FormControl<TemporalAggregationFormatted>; + +improvementDirectionControl: FormControl<ImprovementDirectionFormatted>; + +alphaControl: FormControl<double>; + -_controlsBySectionType: Map<ReportSectionType, FormGroup>; + -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + -_validationConfigsBySectionType: Map<ReportSectionType, Map<FormValidationSetEnum, List<FormControlValidation>>>; + +sectionBaseControls: Map<String, AbstractControl<dynamic>>; + +form: FormGroup; + +sectionId: String; + +sectionType: ReportSectionType; + <static>+sectionTypeControlOptions: List<FormControlOption<ReportSectionType>>; + <static>+temporalAggregationControlOptions: List<FormControlOption<TemporalAggregationFormatted>>; + <static>+improvementDirectionControlOptions: List<FormControlOption<ImprovementDirectionFormatted>>; + +titles: Map<FormMode, String>; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +titleRequired: dynamic; + +descriptionRequired: dynamic; + +dataReferenceRequired: dynamic; + +aggregationRequired: dynamic; + +improvementDirectionRequired: dynamic; + +alphaConfidenceRequired: dynamic | - +Schedule toSchedule() + -List<FormControlValidation> _getValidationConfig(); + +ReportItemFormData buildFormData(); + +ReportItemFormViewModel createDuplicate(); + +dynamic onSectionTypeChanged(); + -void _updateFormControls(); + +void setControlsFrom() ] - [<abstract>IFormDataWithSchedule]o-[StudyUTimeOfDay] - [<abstract>IFormData]<:--[<abstract>IFormDataWithSchedule] + [ReportItemFormViewModel]o-[ReportSectionType] + [ReportItemFormViewModel]o-[FormControl] + [ReportItemFormViewModel]o-[FormGroup] + [<abstract>ManagedFormViewModel]<:-[ReportItemFormViewModel] - [<abstract>WithScheduleControls + [ReportItemFormView | - +isTimeRestrictedControl: FormControl<bool>; - +instanceID: FormControl<String>; - +restrictedTimeStartControl: FormControl<Time>; - +restrictedTimeStartPickerControl: FormControl<TimeOfDay>; - +restrictedTimeEndControl: FormControl<Time>; - +restrictedTimeEndPickerControl: FormControl<TimeOfDay>; - +hasReminderControl: FormControl<bool>; - +reminderTimeControl: FormControl<Time>; - +reminderTimePickerControl: FormControl<TimeOfDay>; - -_reminderControlStream: StreamSubscription<dynamic>?; - +scheduleFormControls: Map<String, FormControl<Object>>; - +hasReminder: bool; - +isTimeRestricted: bool; - +timeRestriction: List<Time>? + +formViewModel: ReportItemFormViewModel; + +studyId: String; + +reportSectionColumnWidth: dynamic; + +sectionTypeBodyBuilder: Widget Function(BuildContext) | - +void setScheduleControlsFrom(); - -dynamic _initReminderControl() + +Widget build(); + -dynamic _buildSectionText(); + -dynamic _buildSectionTypeHeader() ] - [<abstract>WithScheduleControls]o-[FormControl] - [<abstract>WithScheduleControls]o-[StreamSubscription] + [ReportItemFormView]o-[ReportItemFormViewModel] + [ReportItemFormView]o-[Widget Function(BuildContext)] - [StudyFormViewModel + [ReportsFormViewModel | - +studyDirtyCopy: Study?; - +studyRepository: IStudyRepository; - +authRepository: IAuthRepository; + +study: Study; +router: GoRouter; - +studyInfoFormViewModel: StudyInfoFormViewModel; - +enrollmentFormViewModel: EnrollmentFormViewModel; - +measurementsFormViewModel: MeasurementsFormViewModel; - +reportsFormViewModel: ReportsFormViewModel; - +interventionsFormViewModel: InterventionsFormViewModel; + +reportItemDelegate: ReportFormItemDelegate; + +reportItemArray: FormArray<dynamic>; + +reportItemFormViewModels: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData>; +form: FormGroup; - +isStudyReadonly: bool; + +reportItemModels: List<ReportItemFormViewModel>; +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titles: Map<FormMode, String> + +titles: Map<FormMode, String>; + +canTestConsent: bool | - +void read(); +void setControlsFrom(); - +Study buildFormData(); - +void dispose(); + +ReportsFormData buildFormData(); + +void read(); + +ReportItemFormRouteArgs buildNewReportItemFormRouteArgs(); + +ReportItemFormRouteArgs buildReportItemFormRouteArgs(); + +dynamic testReport(); +void onCancel(); +dynamic onSave(); - -dynamic _applyAndSaveSubform() + +ReportItemFormViewModel provide() ] - [StudyFormViewModel]o-[Study] - [StudyFormViewModel]o-[<abstract>IStudyRepository] - [StudyFormViewModel]o-[<abstract>IAuthRepository] - [StudyFormViewModel]o-[GoRouter] - [StudyFormViewModel]o-[StudyInfoFormViewModel] - [StudyFormViewModel]o-[EnrollmentFormViewModel] - [StudyFormViewModel]o-[MeasurementsFormViewModel] - [StudyFormViewModel]o-[ReportsFormViewModel] - [StudyFormViewModel]o-[InterventionsFormViewModel] - [StudyFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[StudyFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[StudyFormViewModel] + [ReportsFormViewModel]o-[Study] + [ReportsFormViewModel]o-[GoRouter] + [ReportsFormViewModel]o-[ReportFormItemDelegate] + [ReportsFormViewModel]o-[FormArray] + [ReportsFormViewModel]o-[FormViewModelCollection] + [ReportsFormViewModel]o-[FormGroup] + [<abstract>FormViewModel]<:-[ReportsFormViewModel] + [<abstract>IFormViewModelDelegate]<:--[ReportsFormViewModel] + [<abstract>IProviderArgsResolver]<:--[ReportsFormViewModel] - [<abstract>StudyDesignPageWidget + [ReportFormItemDelegate | - +Widget? banner() - ] - - [<abstract>StudyPageWidget]<:-[<abstract>StudyDesignPageWidget] - - [StudyAnalyzeScreen + +formViewModelCollection: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData>; + +owner: ReportsFormViewModel; + +propagateOnSave: bool; + +validationSet: dynamic | - +Widget? banner(); - +Widget build() + +void onCancel(); + +dynamic onSave(); + +ReportItemFormViewModel provide(); + +List<ModelAction<dynamic>> availableActions(); + +void onNewItem(); + +void onSelectItem() ] - [<abstract>StudyPageWidget]<:-[StudyAnalyzeScreen] + [ReportFormItemDelegate]o-[FormViewModelCollection] + [ReportFormItemDelegate]o-[ReportsFormViewModel] + [<abstract>IFormViewModelDelegate]<:--[ReportFormItemDelegate] + [<abstract>IListActionProvider]<:--[ReportFormItemDelegate] + [<abstract>IProviderArgsResolver]<:--[ReportFormItemDelegate] - [StudyAnalyzeController + [ReportBadge | - +dynamic onExport() - ] - - [StudyBaseController]<:-[StudyAnalyzeController] - - [StudyMonitorScreen + +status: ReportStatus?; + +type: BadgeType; + +showPrefixIcon: bool; + +showTooltip: bool | +Widget build() ] - [<abstract>StudyPageWidget]<:-[StudyMonitorScreen] + [ReportBadge]o-[ReportStatus] + [ReportBadge]o-[BadgeType] - [StudiesTableItem + [ReportsFormData | - +study: Study; - +itemHeight: double; - +itemPadding: double; - +rowSpacing: double; - +columnSpacing: double; - +actions: List<ModelAction<dynamic>>; - +columnSizes: List<StudiesTableColumnSize>; - +isPinned: bool; - +onPinnedChanged: void Function(Study, bool)?; - +onTap: void Function(Study)? + +reportItems: List<ReportItemFormData>; + +id: String + | + +Study apply(); + +ReportsFormData copy() ] - [StudiesTableItem]o-[Study] - [StudiesTableItem]o-[void Function(Study, bool)?] - [StudiesTableItem]o-[void Function(Study)?] + [<abstract>IStudyFormData]<:--[ReportsFormData] - [DashboardController - | - +studyRepository: IStudyRepository; - +authRepository: IAuthRepository; - +userRepository: IUserRepository; - +router: GoRouter; - -_studiesSubscription: StreamSubscription<List<WrappedModel<Study>>>?; - +searchController: SearchController; - +isSortAscending: bool + [ReportStatus | - -dynamic _subscribeStudies(); - +dynamic setSearchText(); - +dynamic setStudiesFilter(); - +dynamic onSelectStudy(); - +dynamic onClickNewStudy(); - +dynamic pinStudy(); - +dynamic pinOffStudy(); - +void setSorting(); - +void filterStudies(); - +void sortStudies(); - +bool isSortingActiveForColumn(); - +bool isPinned(); - +List<ModelAction<dynamic>> availableActions(); - +void dispose() + +index: int; + <static>+values: List<ReportStatus>; + <static>+primary: ReportStatus; + <static>+secondary: ReportStatus ] - [DashboardController]o-[<abstract>IStudyRepository] - [DashboardController]o-[<abstract>IAuthRepository] - [DashboardController]o-[<abstract>IUserRepository] - [DashboardController]o-[GoRouter] - [DashboardController]o-[StreamSubscription] - [DashboardController]o-[SearchController] - [<abstract>IModelActionProvider]<:--[DashboardController] + [ReportStatus]o-[ReportStatus] + [Enum]<:--[ReportStatus] - [StudiesTableColumnSize - | - +collapsed: bool; - +flex: int?; - +width: double? + [<abstract>IStudyFormData | - +Widget createContainer() + +Study apply() ] - [StudiesTable + [<abstract>IFormData]<:--[<abstract>IStudyFormData] + + [StudyInfoFormViewModel | - +itemHeight: double; - +itemPadding: double; - +rowSpacing: double; - +columnSpacing: double; - +compactWidthThreshold: double; - +superCompactWidthThreshold: double; - +compactStatTitleThreshold: double; - +studies: List<Study>; - +onSelect: void Function(Study); - +getActions: List<ModelAction<dynamic>> Function(Study); - +emptyWidget: Widget; - +pinnedStudies: Iterable<String>; - +dashboardController: DashboardController + +study: Study; + +titleControl: FormControl<String>; + +iconControl: FormControl<IconOption>; + +descriptionControl: FormControl<String>; + +organizationControl: FormControl<String>; + +reviewBoardControl: FormControl<String>; + +reviewBoardNumberControl: FormControl<String>; + +researchersControl: FormControl<String>; + +emailControl: FormControl<String>; + +websiteControl: FormControl<String>; + +phoneControl: FormControl<String>; + +additionalInfoControl: FormControl<String>; + +form: FormGroup; + +titles: Map<FormMode, String>; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +titleRequired: dynamic; + +descriptionRequired: dynamic; + +iconRequired: dynamic; + +organizationRequired: dynamic; + +reviewBoardRequired: dynamic; + +reviewBoardNumberRequired: dynamic; + +researchersRequired: dynamic; + +emailRequired: dynamic; + +phoneRequired: dynamic; + +emailFormat: dynamic; + +websiteFormat: dynamic | - +Widget build(); - -Widget _buildColumnHeader() + +void setControlsFrom(); + +StudyInfoFormData buildFormData() ] - [StudiesTable]o-[void Function(Study)] - [StudiesTable]o-[List<ModelAction<dynamic>> Function(Study)] - [StudiesTable]o-[<abstract>Widget] - [StudiesTable]o-[DashboardController] + [StudyInfoFormViewModel]o-[Study] + [StudyInfoFormViewModel]o-[FormControl] + [StudyInfoFormViewModel]o-[FormGroup] + [<abstract>FormViewModel]<:-[StudyInfoFormViewModel] - [StudiesTableColumn + [StudyDesignInfoFormView | - +index: int; - <static>+values: List<StudiesTableColumn>; - <static>+pin: StudiesTableColumn; - <static>+title: StudiesTableColumn; - <static>+status: StudiesTableColumn; - <static>+participation: StudiesTableColumn; - <static>+createdAt: StudiesTableColumn; - <static>+enrolled: StudiesTableColumn; - <static>+active: StudiesTableColumn; - <static>+completed: StudiesTableColumn; - <static>+action: StudiesTableColumn + +Widget build() ] - [StudiesTableColumn]o-[StudiesTableColumn] - [Enum]<:--[StudiesTableColumn] + [<abstract>StudyDesignPageWidget]<:-[StudyDesignInfoFormView] - [DashboardScreen + [StudyInfoFormData | - +filter: StudiesFilter? + +title: String; + +description: String?; + +iconName: String; + +contactInfoFormData: StudyContactInfoFormData; + +id: String + | + +Study apply(); + +StudyInfoFormData copy() ] - [DashboardScreen]o-[StudiesFilter] + [StudyInfoFormData]o-[StudyContactInfoFormData] + [<abstract>IStudyFormData]<:--[StudyInfoFormData] - [DashboardScaffold + [StudyContactInfoFormData | - <static>+compactWidthThreshold: double; - +body: Widget + +organization: String?; + +institutionalReviewBoard: String?; + +institutionalReviewBoardNumber: String?; + +researchers: String?; + +email: String?; + +website: String?; + +phone: String?; + +additionalInfo: String?; + +id: String | - +Widget build() + +Study apply(); + +StudyInfoFormData copy() ] - [DashboardScaffold]o-[<abstract>Widget] + [<abstract>IStudyFormData]<:--[StudyContactInfoFormData] - [StudiesFilter + [StudyFormValidationSet | +index: int; - <static>+values: List<StudiesFilter> + <static>+values: List<StudyFormValidationSet> ] - [Enum]<:--[StudiesFilter] + [Enum]<:--[StudyFormValidationSet] - [StudiesTableColumnHeader + [MeasurementsFormData | - +title: String; - +sortable: bool; - +sortAscending: bool; - +sortingActive: bool; - +onSort: void Function()? + +surveyMeasurements: List<MeasurementSurveyFormData>; + +id: String + | + +Study apply(); + +MeasurementsFormData copy() ] - [StudiesTableColumnHeader]o-[void Function()?] + [<abstract>IStudyFormData]<:--[MeasurementsFormData] - [AccountSettingsDialog + [MeasurementSurveyFormView | - +Widget build() + +formViewModel: MeasurementSurveyFormViewModel ] - [<abstract>ConsumerWidget]<:-[AccountSettingsDialog] + [MeasurementSurveyFormView]o-[MeasurementSurveyFormViewModel] - [StudyInvitesTable + [SurveyPreview | - +invites: List<StudyInvite>; - +onSelect: void Function(StudyInvite); - +getActions: List<ModelAction<dynamic>> Function(StudyInvite); - +getInlineActions: List<ModelAction<dynamic>> Function(StudyInvite); - +getIntervention: Intervention? Function(String); - +getParticipantCountForInvite: int Function(StudyInvite) + +routeArgs: MeasurementFormRouteArgs | - +Widget build(); - -List<Widget> _buildRow() + +Widget build() ] - [StudyInvitesTable]o-[void Function(StudyInvite)] - [StudyInvitesTable]o-[List<ModelAction<dynamic>> Function(StudyInvite)] - [StudyInvitesTable]o-[Intervention? Function(String)] - [StudyInvitesTable]o-[int Function(StudyInvite)] + [SurveyPreview]o-[MeasurementFormRouteArgs] + [<abstract>ConsumerWidget]<:-[SurveyPreview] - [StudyRecruitController + [MeasurementSurveyFormData | - +inviteCodeRepository: IInviteCodeRepository; - -_invitesSubscription: StreamSubscription<List<WrappedModel<StudyInvite>>>? + +measurementId: String; + +title: String; + +introText: String?; + +outroText: String?; + +questionnaireFormData: QuestionnaireFormData; + <static>+kDefaultTitle: String; + +id: String | - -dynamic _subscribeInvites(); - +Intervention? getIntervention(); - +int getParticipantCountForInvite(); - +List<ModelAction<dynamic>> availableActions(); - +List<ModelAction<dynamic>> availableInlineActions(); - +void dispose() + +QuestionnaireTask toQuestionnaireTask(); + +MeasurementSurveyFormData copy() ] - [StudyRecruitController]o-[<abstract>IInviteCodeRepository] - [StudyRecruitController]o-[StreamSubscription] - [StudyBaseController]<:-[StudyRecruitController] - [<abstract>IModelActionProvider]<:--[StudyRecruitController] + [MeasurementSurveyFormData]o-[QuestionnaireFormData] + [<abstract>IFormDataWithSchedule]<:-[MeasurementSurveyFormData] - [InviteCodeFormViewModel + [MeasurementSurveyFormViewModel | +study: Study; - +inviteCodeRepository: IInviteCodeRepository; - +codeControl: FormControl<String>; - +codeControlValidationMessages: Map<String, String Function(dynamic)>; - +isPreconfiguredScheduleControl: FormControl<bool>; - +preconfiguredScheduleTypeControl: FormControl<PhaseSequence>; - +interventionAControl: FormControl<String>; - +interventionBControl: FormControl<String>; + +measurementIdControl: FormControl<String>; + +instanceIdControl: FormControl<String>; + +surveyTitleControl: FormControl<String>; + +surveyIntroTextControl: FormControl<String>; + +surveyOutroTextControl: FormControl<String>; +form: FormGroup; - +titles: Map<FormMode, String>; - +interventionControlOptions: List<FormControlOption<String>>; - +preconfiguredScheduleTypeOptions: List<FormControlOption<PhaseSequence>>; - +isPreconfiguredSchedule: bool; - +preconfiguredSchedule: List<String>? + +measurementId: String; + +instanceId: String; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +titleRequired: dynamic; + +atLeastOneQuestion: dynamic; + +breadcrumbsTitle: String; + +titles: Map<FormMode, String> | - +void initControls(); - -dynamic _uniqueInviteCode(); - +void regenerateCode(); - -String _generateCode(); - +StudyInvite buildFormData(); +void setControlsFrom(); - +dynamic save() + +MeasurementSurveyFormData buildFormData(); + +List<ModelAction<dynamic>> availableActions(); + +List<ModelAction<dynamic>> availablePopupActions(); + +List<ModelAction<dynamic>> availableInlineActions(); + +void onSelectItem(); + +void onNewItem(); + +SurveyQuestionFormRouteArgs buildNewFormRouteArgs(); + +SurveyQuestionFormRouteArgs buildFormRouteArgs(); + +MeasurementSurveyFormViewModel createDuplicate() ] - [InviteCodeFormViewModel]o-[Study] - [InviteCodeFormViewModel]o-[<abstract>IInviteCodeRepository] - [InviteCodeFormViewModel]o-[FormControl] - [InviteCodeFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[InviteCodeFormViewModel] + [MeasurementSurveyFormViewModel]o-[Study] + [MeasurementSurveyFormViewModel]o-[FormControl] + [MeasurementSurveyFormViewModel]o-[FormGroup] + [<abstract>ManagedFormViewModel]<:-[MeasurementSurveyFormViewModel] + [<abstract>WithQuestionnaireControls]<:-[MeasurementSurveyFormViewModel] + [<abstract>WithScheduleControls]<:-[MeasurementSurveyFormViewModel] + [<abstract>IFormViewModelDelegate]<:--[MeasurementSurveyFormViewModel] + [<abstract>IListActionProvider]<:--[MeasurementSurveyFormViewModel] + [<abstract>IProviderArgsResolver]<:--[MeasurementSurveyFormViewModel] - [EnrolledBadge - | - +enrolledCount: int + [StudyDesignMeasurementsFormView | +Widget build() ] - [InviteCodeFormView - | - +formViewModel: InviteCodeFormViewModel - | - +Widget build(); - -List<FormTableRow> _conditionalInterventionRows() - ] - - [InviteCodeFormView]o-[InviteCodeFormViewModel] - [<abstract>FormConsumerWidget]<:-[InviteCodeFormView] - - [StudyRecruitScreen - | - +Widget build(); - -Widget _inviteCodesSectionHeader(); - -Widget _newInviteCodeButton(); - -dynamic _onSelectInvite() - ] - - [<abstract>StudyPageWidget]<:-[StudyRecruitScreen] + [<abstract>StudyDesignPageWidget]<:-[StudyDesignMeasurementsFormView] - [DrawerEntry + [MeasurementsFormViewModel | - +localizedTitle: String Function(); - +icon: IconData?; - +localizedHelpText: String Function()?; - +enabled: bool; - +onSelected: void Function(BuildContext, WidgetRef)?; - +autoCloseDrawer: bool; - +title: String; - +helpText: String? + +study: Study; + +router: GoRouter; + +measurementsArray: FormArray<dynamic>; + +surveyMeasurementFormViewModels: FormViewModelCollection<MeasurementSurveyFormViewModel, MeasurementSurveyFormData>; + +form: FormGroup; + +measurementViewModels: List<MeasurementSurveyFormViewModel>; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +measurementRequired: dynamic; + +titles: Map<FormMode, String> | - +void onClick() + +void read(); + +void setControlsFrom(); + +MeasurementsFormData buildFormData(); + +List<ModelAction<dynamic>> availableActions(); + +List<ModelAction<dynamic>> availablePopupActions(); + +List<ModelAction<dynamic>> availableInlineActions(); + +void onSelectItem(); + +void onNewItem(); + +MeasurementSurveyFormViewModel provide(); + +void onCancel(); + +dynamic onSave() ] - [DrawerEntry]o-[String Function()] - [DrawerEntry]o-[IconData] - [DrawerEntry]o-[String Function()?] - [DrawerEntry]o-[void Function(BuildContext, WidgetRef)?] + [MeasurementsFormViewModel]o-[Study] + [MeasurementsFormViewModel]o-[GoRouter] + [MeasurementsFormViewModel]o-[FormArray] + [MeasurementsFormViewModel]o-[FormViewModelCollection] + [MeasurementsFormViewModel]o-[FormGroup] + [<abstract>FormViewModel]<:-[MeasurementsFormViewModel] + [<abstract>IFormViewModelDelegate]<:--[MeasurementsFormViewModel] + [<abstract>IListActionProvider]<:--[MeasurementsFormViewModel] + [<abstract>IProviderArgsResolver]<:--[MeasurementsFormViewModel] - [GoRouterDrawerEntry + [StudyFormScaffold | - +intent: RoutingIntent; - +onNavigated: void Function()? + +studyId: String; + +formViewModelBuilder: T Function(WidgetRef); + +formViewBuilder: Widget Function(T) | - +void onClick() + +Widget build() ] - [GoRouterDrawerEntry]o-[RoutingIntent] - [GoRouterDrawerEntry]o-[void Function()?] - [DrawerEntry]<:-[GoRouterDrawerEntry] + [StudyFormScaffold]o-[T Function(WidgetRef)] + [StudyFormScaffold]o-[Widget Function(T)] + [<abstract>ConsumerWidget]<:-[StudyFormScaffold] - [AppDrawer + [ConsentItemFormViewModel + | + +consentIdControl: FormControl<String>; + +titleControl: FormControl<String>; + +descriptionControl: FormControl<String>; + +iconControl: FormControl<IconOption>; + +form: FormGroup; + +consentId: String; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +titleRequired: dynamic; + +descriptionRequired: dynamic; + +titles: Map<FormMode, String> | - +width: int; - +autoCloseDrawer: bool; - +leftPaddingEntries: double; - +logoPaddingVertical: double; - +logoPaddingHorizontal: double; - +logoMaxHeight: double; - +logoSectionMinHeight: double; - +logoSectionMaxHeight: double + +void setControlsFrom(); + +ConsentItemFormData buildFormData(); + +ConsentItemFormViewModel createDuplicate() ] - [NotificationDispatcher + [ConsentItemFormViewModel]o-[FormControl] + [ConsentItemFormViewModel]o-[FormGroup] + [<abstract>ManagedFormViewModel]<:-[ConsentItemFormViewModel] + + [StudyDesignEnrollmentFormView | - +child: Widget?; - +snackbarInnerPadding: double; - +snackbarWidth: double?; - +snackbarBehavior: SnackBarBehavior; - +snackbarDefaultDuration: int + +Widget build(); + -dynamic _showScreenerQuestionSidesheetWithArgs(); + -dynamic _showConsentItemSidesheetWithArgs() ] - [NotificationDispatcher]o-[<abstract>Widget] - [NotificationDispatcher]o-[SnackBarBehavior] + [<abstract>StudyDesignPageWidget]<:-[StudyDesignEnrollmentFormView] - [Notifications + [<abstract>IScreenerQuestionLogicFormViewModel | - <static>+credentialsInvalid: SnackbarIntent; - <static>+userAlreadyRegistered: SnackbarIntent; - <static>+passwordReset: SnackbarIntent; - <static>+passwordResetSuccess: SnackbarIntent; - <static>+studyDeleted: SnackbarIntent; - <static>+inviteCodeDeleted: SnackbarIntent; - <static>+inviteCodeClipped: SnackbarIntent; - <static>+studyDeleteConfirmation: AlertIntent + +isDirtyOptionsBannerVisible: bool ] - [Notifications]o-[SnackbarIntent] - [Notifications]o-[AlertIntent] - - [NotificationDefaultActions + [ScreenerQuestionLogicFormView | - <static>+cancel: NotificationAction + +formViewModel: ScreenerQuestionFormViewModel + | + +Widget build(); + -dynamic _buildInfoBanner(); + -dynamic _buildAnswerOptionsLogicControls(); + -List<Widget> _buildOptionLogicRow() ] - [NotificationDefaultActions]o-[NotificationAction] + [ScreenerQuestionLogicFormView]o-[ScreenerQuestionFormViewModel] + [<abstract>FormConsumerWidget]<:-[ScreenerQuestionLogicFormView] - [<abstract>NotificationIntent + [ConsentItemFormData | - +message: String?; - +customContent: Widget?; - +icon: IconData?; - +actions: List<NotificationAction>?; - +type: NotificationType + +consentId: String; + +title: String; + +description: String; + +iconName: String?; + +id: String | - +void register() + +ConsentItem toConsentItem(); + +ConsentItemFormData copy() ] - [<abstract>NotificationIntent]o-[<abstract>Widget] - [<abstract>NotificationIntent]o-[IconData] - [<abstract>NotificationIntent]o-[NotificationType] + [<abstract>IFormData]<:-[ConsentItemFormData] - [NotificationAction + [ConsentItemFormView | - +label: String; - +onSelect: dynamic Function(); - +isDestructive: bool + +formViewModel: ConsentItemFormViewModel ] - [NotificationAction]o-[dynamic Function()] + [ConsentItemFormView]o-[ConsentItemFormViewModel] - [SnackbarIntent + [EnrollmentFormData | - +duration: int? + <static>+kDefaultEnrollmentType: Participation; + +enrollmentType: Participation; + +questionnaireFormData: QuestionnaireFormData; + +consentItemsFormData: List<ConsentItemFormData>?; + +id: String + | + +Study apply(); + +EnrollmentFormData copy() ] - [<abstract>NotificationIntent]<:-[SnackbarIntent] + [EnrollmentFormData]o-[Participation] + [EnrollmentFormData]o-[QuestionnaireFormData] + [<abstract>IStudyFormData]<:--[EnrollmentFormData] - [AlertIntent + [ScreenerQuestionFormViewModel | - +title: String; - +dismissOnAction: bool; - +isDestructive: dynamic + <static>+defaultResponseOptionValidity: bool; + +responseOptionsDisabledArray: FormArray<dynamic>; + +responseOptionsLogicControls: FormArray<bool>; + +responseOptionsLogicDescriptionControls: FormArray<String>; + -_questionBaseControls: Map<String, AbstractControl<dynamic>>; + +prevResponseOptionControls: List<AbstractControl<dynamic>>; + +prevResponseOptionValues: List<dynamic>; + +responseOptionsDisabledControls: List<AbstractControl<dynamic>>; + +logicControlOptions: List<FormControlOption<bool>>; + +questionBaseControls: Map<String, AbstractControl<dynamic>>; + +isDirtyOptionsBannerVisible: bool + | + +dynamic onResponseOptionsChanged(); + +void setControlsFrom(); + +QuestionFormData buildFormData(); + -List<FormControl<dynamic>> _copyFormControls(); + -AbstractControl<dynamic>? _findAssociatedLogicControlFor(); + -AbstractControl<dynamic>? _findAssociatedControlFor(); + +ScreenerQuestionFormViewModel createDuplicate() ] - [<abstract>NotificationIntent]<:-[AlertIntent] + [ScreenerQuestionFormViewModel]o-[FormArray] + [QuestionFormViewModel]<:-[ScreenerQuestionFormViewModel] + [<abstract>IScreenerQuestionLogicFormViewModel]<:--[ScreenerQuestionFormViewModel] - [NotificationType + [EnrollmentFormViewModel | - +index: int; - <static>+values: List<NotificationType>; - <static>+snackbar: NotificationType; - <static>+alert: NotificationType; - <static>+custom: NotificationType + +study: Study; + +router: GoRouter; + +consentItemDelegate: EnrollmentFormConsentItemDelegate; + +enrollmentTypeControl: FormControl<Participation>; + +consentItemArray: FormArray<dynamic>; + +consentItemFormViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData>; + +form: FormGroup; + +enrollmentTypeControlOptions: List<FormControlOption<Participation>>; + +consentItemModels: List<ConsentItemFormViewModel>; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +titles: Map<FormMode, String>; + +canTestScreener: bool; + +canTestConsent: bool; + +questionTitles: Map<FormMode, String Function()> + | + +void setControlsFrom(); + +EnrollmentFormData buildFormData(); + +void read(); + +List<ModelAction<dynamic>> availableActions(); + +List<ModelAction<dynamic>> availablePopupActions(); + +List<ModelAction<dynamic>> availableInlineActions(); + +void onSelectItem(); + +void onNewItem(); + +ScreenerQuestionFormRouteArgs buildNewScreenerQuestionFormRouteArgs(); + +ScreenerQuestionFormRouteArgs buildScreenerQuestionFormRouteArgs(); + +ConsentItemFormRouteArgs buildNewConsentItemFormRouteArgs(); + +ConsentItemFormRouteArgs buildConsentItemFormRouteArgs(); + +dynamic testScreener(); + +dynamic testConsent(); + +ScreenerQuestionFormViewModel provideQuestionFormViewModel() ] - [NotificationType]o-[NotificationType] - [Enum]<:--[NotificationType] + [EnrollmentFormViewModel]o-[Study] + [EnrollmentFormViewModel]o-[GoRouter] + [EnrollmentFormViewModel]o-[EnrollmentFormConsentItemDelegate] + [EnrollmentFormViewModel]o-[FormControl] + [EnrollmentFormViewModel]o-[FormArray] + [EnrollmentFormViewModel]o-[FormViewModelCollection] + [EnrollmentFormViewModel]o-[FormGroup] + [<abstract>FormViewModel]<:-[EnrollmentFormViewModel] + [<abstract>WithQuestionnaireControls]<:-[EnrollmentFormViewModel] + [<abstract>IFormViewModelDelegate]<:--[EnrollmentFormViewModel] + [<abstract>IListActionProvider]<:--[EnrollmentFormViewModel] + [<abstract>IProviderArgsResolver]<:--[EnrollmentFormViewModel] - [<abstract>IClipboardService + [EnrollmentFormConsentItemDelegate | - +dynamic copy() - ] - - [ClipboardService + +formViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData>; + +owner: EnrollmentFormViewModel; + +propagateOnSave: bool; + +validationSet: dynamic | - +dynamic copy() + +void onCancel(); + +dynamic onSave(); + +ConsentItemFormViewModel provide(); + +List<ModelAction<dynamic>> availableActions(); + +void onNewItem(); + +void onSelectItem() ] - [<abstract>IClipboardService]<:--[ClipboardService] + [EnrollmentFormConsentItemDelegate]o-[FormViewModelCollection] + [EnrollmentFormConsentItemDelegate]o-[EnrollmentFormViewModel] + [<abstract>IFormViewModelDelegate]<:--[EnrollmentFormConsentItemDelegate] + [<abstract>IListActionProvider]<:--[EnrollmentFormConsentItemDelegate] + [<abstract>IProviderArgsResolver]<:--[EnrollmentFormConsentItemDelegate] - [<abstract>INotificationService + [StudyFormViewModel | - +void showMessage(); - +void show(); - +Stream<NotificationIntent> watchNotifications(); - +void dispose() + +studyDirtyCopy: Study?; + +studyRepository: IStudyRepository; + +authRepository: IAuthRepository; + +router: GoRouter; + +studyInfoFormViewModel: StudyInfoFormViewModel; + +enrollmentFormViewModel: EnrollmentFormViewModel; + +measurementsFormViewModel: MeasurementsFormViewModel; + +reportsFormViewModel: ReportsFormViewModel; + +interventionsFormViewModel: InterventionsFormViewModel; + +form: FormGroup; + +isStudyReadonly: bool; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +titles: Map<FormMode, String> + | + +void read(); + +void setControlsFrom(); + +Study buildFormData(); + +void dispose(); + +void onCancel(); + +dynamic onSave(); + -dynamic _applyAndSaveSubform() ] - [NotificationService + [StudyFormViewModel]o-[Study] + [StudyFormViewModel]o-[<abstract>IStudyRepository] + [StudyFormViewModel]o-[<abstract>IAuthRepository] + [StudyFormViewModel]o-[GoRouter] + [StudyFormViewModel]o-[StudyInfoFormViewModel] + [StudyFormViewModel]o-[EnrollmentFormViewModel] + [StudyFormViewModel]o-[MeasurementsFormViewModel] + [StudyFormViewModel]o-[ReportsFormViewModel] + [StudyFormViewModel]o-[InterventionsFormViewModel] + [StudyFormViewModel]o-[FormGroup] + [<abstract>FormViewModel]<:-[StudyFormViewModel] + [<abstract>IFormViewModelDelegate]<:--[StudyFormViewModel] + + [<abstract>WithQuestionnaireControls | - -_streamController: BehaviorSubject<NotificationIntent> + +questionsArray: FormArray<dynamic>; + +questionFormViewModels: FormViewModelCollection<Q, QuestionFormData>; + +questionnaireControls: Map<String, FormArray<dynamic>>; + +propagateOnSave: bool; + +questionModels: List<Q>; + +questionTitles: Map<FormMode, String Function()> | - +Stream<NotificationIntent> watchNotifications(); - +void showMessage(); - +void show(); - +void dispose() + +void setQuestionnaireControlsFrom(); + +QuestionnaireFormData buildQuestionnaireFormData(); + +void read(); + +void onCancel(); + +dynamic onSave(); + +Q provide(); + +Q provideQuestionFormViewModel() ] - [NotificationService]o-[BehaviorSubject] - [<abstract>INotificationService]<:--[NotificationService] + [<abstract>WithQuestionnaireControls]o-[FormArray] + [<abstract>WithQuestionnaireControls]o-[FormViewModelCollection] + [<abstract>IFormViewModelDelegate]<:--[<abstract>WithQuestionnaireControls] + [<abstract>IProviderArgsResolver]<:--[<abstract>WithQuestionnaireControls] - [Assets + [QuestionnaireFormData | - <static>+logoWide: String - ] - - [Hyperlink + +questionsData: List<QuestionFormData>?; + +id: String | - +text: String; - +url: String?; - +onClick: void Function()?; - +linkColor: Color; - +hoverColor: Color?; - +visitedColor: Color?; - +style: TextStyle?; - +hoverStyle: TextStyle?; - +visitedStyle: TextStyle?; - +icon: IconData?; - +iconSize: double? + +StudyUQuestionnaire toQuestionnaire(); + +List<EligibilityCriterion> toEligibilityCriteria(); + +QuestionnaireFormData copy() ] - [Hyperlink]o-[void Function()?] - [Hyperlink]o-[Color] - [Hyperlink]o-[TextStyle] - [Hyperlink]o-[IconData] + [<abstract>IFormData]<:--[QuestionnaireFormData] - [StandardTableColumn + [<abstract>QuestionFormData | - +label: String; - +tooltip: String?; - +columnWidth: TableColumnWidth; - +sortable: bool; - +sortAscending: bool?; - +sortableIcon: Widget? - ] - - [StandardTableColumn]o-[<abstract>TableColumnWidth] - [StandardTableColumn]o-[<abstract>Widget] - - [StandardTable + <static>+questionTypeFormDataFactories: Map<SurveyQuestionType, QuestionFormData Function(Question<dynamic>, List<EligibilityCriterion>)>; + +questionId: String; + +questionText: String; + +questionInfoText: String?; + +questionType: SurveyQuestionType; + +responseOptionsValidity: Map<dynamic, bool>; + +responseOptions: List<dynamic>; + +id: String | - +items: List<T>; - +inputColumns: List<StandardTableColumn>; - +onSelectItem: void Function(T); - +trailingActionsAt: List<ModelAction<dynamic>> Function(T, int)?; - +trailingActionsMenuType: ActionMenuType?; - +sortColumnPredicates: List<int Function(T, T)?>?; - +pinnedPredicates: int Function(T, T)?; - +headerRowBuilder: TableRow Function(BuildContext, List<StandardTableColumn>)?; - +dataRowBuilder: TableRow Function(BuildContext, List<StandardTableColumn>)?; - +inputTrailingActionsColumn: StandardTableColumn; - +tableWrapper: Widget Function(Widget)?; - +cellSpacing: double; - +rowSpacing: double; - +minRowHeight: double?; - +showTableHeader: bool; - +hideLeadingTrailingWhenEmpty: bool; - +leadingWidget: Widget?; - +trailingWidget: Widget?; - +leadingWidgetSpacing: double?; - +trailingWidgetSpacing: double?; - +emptyWidget: Widget?; - +rowStyle: StandardTableStyle; - +disableRowInteractions: bool + +Question<dynamic> toQuestion(); + +EligibilityCriterion toEligibilityCriterion(); + +Answer<dynamic> constructAnswerFor(); + +dynamic setResponseOptionsValidityFrom(); + +QuestionFormData copy() ] - [StandardTable]o-[void Function(T)] - [StandardTable]o-[List<ModelAction<dynamic>> Function(T, int)?] - [StandardTable]o-[ActionMenuType] - [StandardTable]o-[int Function(T, T)?] - [StandardTable]o-[TableRow Function(BuildContext, List<StandardTableColumn>)?] - [StandardTable]o-[StandardTableColumn] - [StandardTable]o-[Widget Function(Widget)?] - [StandardTable]o-[<abstract>Widget] - [StandardTable]o-[StandardTableStyle] + [<abstract>QuestionFormData]o-[SurveyQuestionType] + [<abstract>IFormData]<:--[<abstract>QuestionFormData] - [StandardTableStyle + [ChoiceQuestionFormData | - +index: int; - <static>+values: List<StandardTableStyle>; - <static>+plain: StandardTableStyle; - <static>+material: StandardTableStyle + +isMultipleChoice: bool; + +answerOptions: List<String>; + +responseOptions: List<String> + | + +Question<dynamic> toQuestion(); + +QuestionFormData copy(); + -Choice _buildChoiceForValue(); + +Answer<dynamic> constructAnswerFor() ] - [StandardTableStyle]o-[StandardTableStyle] - [Enum]<:--[StandardTableStyle] + [<abstract>QuestionFormData]<:-[ChoiceQuestionFormData] - [HelpIcon + [BoolQuestionFormData | - +tooltipText: String? + <static>+kResponseOptions: Map<String, bool>; + +responseOptions: List<String> | - +Widget build() + +Question<dynamic> toQuestion(); + +BoolQuestionFormData copy(); + +Answer<dynamic> constructAnswerFor() ] - [ErrorPage + [<abstract>QuestionFormData]<:-[BoolQuestionFormData] + + [ImageQuestionFormData | - +error: Exception? + <static>+kResponseOptions: Map<String, FutureBlobFile>; + +responseOptions: List<String> | - +Widget build() + +Question<dynamic> toQuestion(); + +ImageQuestionFormData copy(); + +Answer<dynamic> constructAnswerFor() ] - [<abstract>ConsumerWidget]<:-[ErrorPage] - - [SplashPage - | - +Widget build() - ] + [<abstract>QuestionFormData]<:-[ImageQuestionFormData] - [IconPack + [AudioQuestionFormData | - <static>+defaultPack: List<IconOption>; - <static>+material: List<IconOption> + +maxRecordingDurationSeconds: int; + <static>+kResponseOptions: Map<String, FutureBlobFile>; + +responseOptions: List<String> | - <static>+IconOption? resolveIconByName() + +Question<dynamic> toQuestion(); + +AudioQuestionFormData copy(); + +Answer<dynamic> constructAnswerFor() ] - [IconOption + [<abstract>QuestionFormData]<:-[AudioQuestionFormData] + + [ScaleQuestionFormData | - +name: String; - +icon: IconData?; - +isEmpty: bool; - +props: List<Object?> + +minValue: double; + +maxValue: double; + +minLabel: String?; + +maxLabel: String?; + +midValues: List<double?>; + +midLabels: List<String?>; + +stepSize: double; + +initialValue: double?; + +minColor: Color?; + +maxColor: Color?; + +responseOptions: List<double>; + +midAnnotations: List<Annotation> | - +String toJson(); - <static>+IconOption fromJson() + +ScaleQuestion toQuestion(); + +QuestionFormData copy(); + +Answer<dynamic> constructAnswerFor() ] - [IconOption]o-[IconData] - [<abstract>Equatable]<:-[IconOption] + [ScaleQuestionFormData]o-[Color] + [<abstract>QuestionFormData]<:-[ScaleQuestionFormData] - [ReactiveIconPicker + [FreeTextQuestionFormData + | + +textLengthRange: List<int>; + +textType: FreeTextQuestionType; + +textTypeExpression: String?; + +responseOptions: List<String> + | + +Question<dynamic> toQuestion(); + +FreeTextQuestionFormData copy(); + +Answer<dynamic> constructAnswerFor() ] - [ReactiveFocusableFormField]<:-[ReactiveIconPicker] + [FreeTextQuestionFormData]o-[FreeTextQuestionType] + [<abstract>QuestionFormData]<:-[FreeTextQuestionFormData] - [IconPicker + [AudioRecordingQuestionFormView | - +iconOptions: List<IconOption>; - +selectedOption: IconOption?; - +onSelect: void Function(IconOption)?; - +galleryIconSize: double?; - +selectedIconSize: double?; - +focusNode: FocusNode?; - +isDisabled: bool + +formViewModel: QuestionFormViewModel | +Widget build() ] - [IconPicker]o-[IconOption] - [IconPicker]o-[void Function(IconOption)?] - [IconPicker]o-[FocusNode] + [AudioRecordingQuestionFormView]o-[QuestionFormViewModel] + [<abstract>ConsumerWidget]<:-[AudioRecordingQuestionFormView] - [IconPickerField + [FreeTextQuestionFormView | - +iconOptions: List<IconOption>; - +selectedOption: IconOption?; - +selectedIconSize: double?; - +galleryIconSize: double?; - +onSelect: void Function(IconOption)?; - +focusNode: FocusNode?; - +isDisabled: bool + +formViewModel: QuestionFormViewModel; + +generateLabelHelpTextMap: dynamic | - +Widget build() + +Widget build(); + +Widget disableOnReadonly(); + +Widget generateRow() ] - [IconPickerField]o-[IconOption] - [IconPickerField]o-[void Function(IconOption)?] - [IconPickerField]o-[FocusNode] + [FreeTextQuestionFormView]o-[QuestionFormViewModel] + [<abstract>ConsumerWidget]<:-[FreeTextQuestionFormView] - [IconPickerGallery - | - +iconOptions: List<IconOption>; - +onSelect: void Function(IconOption)?; - +iconSize: double + [SurveyQuestionType | - +Widget build() + +index: int; + <static>+values: List<SurveyQuestionType>; + <static>+choice: SurveyQuestionType; + <static>+bool: SurveyQuestionType; + <static>+scale: SurveyQuestionType; + <static>+image: SurveyQuestionType; + <static>+audio: SurveyQuestionType; + <static>+freeText: SurveyQuestionType ] - [IconPickerGallery]o-[void Function(IconOption)?] + [SurveyQuestionType]o-[SurveyQuestionType] + [Enum]<:--[SurveyQuestionType] - [FormSideSheetTab + [ImageCapturingQuestionFormView | - +formViewBuilder: Widget Function(T) + +formViewModel: QuestionFormViewModel + | + +Widget build() ] - [FormSideSheetTab]o-[Widget Function(T)] - [NavbarTab]<:-[FormSideSheetTab] + [ImageCapturingQuestionFormView]o-[QuestionFormViewModel] + [<abstract>ConsumerWidget]<:-[ImageCapturingQuestionFormView] - [SidesheetTab + [<abstract>IScaleQuestionFormViewModel | - +builder: Widget Function(BuildContext) + +isMidValuesClearedInfoVisible: bool ] - [SidesheetTab]o-[Widget Function(BuildContext)] - [NavbarTab]<:-[SidesheetTab] - - [Sidesheet + [ScaleQuestionFormView | - <static>+kDefaultWidth: double; - +titleText: String; - +body: Widget?; - +tabs: List<SidesheetTab>?; - +actionButtons: List<Widget>?; - +width: double?; - +withCloseButton: bool; - +ignoreAppBar: bool; - +collapseSingleTab: bool; - +bodyPadding: EdgeInsets?; - +wrapContent: Widget Function(Widget)? + +formViewModel: QuestionFormViewModel ] - [Sidesheet]o-[<abstract>Widget] - [Sidesheet]o-[EdgeInsets] - [Sidesheet]o-[Widget Function(Widget)?] + [ScaleQuestionFormView]o-[QuestionFormViewModel] - [ReactiveCustomColorPicker + [ChoiceQuestionFormView + | + +formViewModel: QuestionFormViewModel + | + +Widget build() ] - [ReactiveFormField]<:-[ReactiveCustomColorPicker] + [ChoiceQuestionFormView]o-[QuestionFormViewModel] + [<abstract>ConsumerWidget]<:-[ChoiceQuestionFormView] - [TextParagraph + [BoolQuestionFormView | - +text: String?; - +style: TextStyle?; - +selectable: bool; - +span: List<TextSpan>? + +formViewModel: QuestionFormViewModel | +Widget build() ] - [TextParagraph]o-[TextStyle] + [BoolQuestionFormView]o-[QuestionFormViewModel] + [<abstract>ConsumerWidget]<:-[BoolQuestionFormView] - [ConstrainedWidthFlexible + [QuestionFormViewModel | - +minWidth: double; - +maxWidth: double; - +flex: int; - +flexSum: int; - +child: Widget; - +outerConstraints: BoxConstraints + <static>+defaultQuestionType: SurveyQuestionType; + -_titles: Map<FormMode, String Function()>?; + +questionIdControl: FormControl<String>; + +questionTypeControl: FormControl<SurveyQuestionType>; + +questionTextControl: FormControl<String>; + +questionInfoTextControl: FormControl<String>; + +questionBaseControls: Map<String, AbstractControl<dynamic>>; + +isMultipleChoiceControl: FormControl<bool>; + +choiceResponseOptionsArray: FormArray<dynamic>; + +customOptionsMin: int; + +customOptionsMax: int; + +customOptionsInitial: int; + +boolResponseOptionsArray: FormArray<String>; + +imageResponseOptionsArray: FormArray<String>; + <static>+kDefaultMaxRecordingDurationSeconds: int; + <static>+kMaxRecordingDurationSeconds: int; + +audioResponseOptionsArray: FormArray<String>; + +maxRecordingDurationSecondsControl: FormControl<int>; + <static>+kDefaultScaleMinValue: int; + <static>+kDefaultScaleMaxValue: int; + <static>+kNumMidValueControls: int; + <static>+kMidValueDebounceMilliseconds: int; + +scaleMinValueControl: FormControl<int>; + +scaleMaxValueControl: FormControl<int>; + -_scaleRangeControl: FormControl<int>; + +scaleMinLabelControl: FormControl<String>; + +scaleMaxLabelControl: FormControl<String>; + +scaleMidValueControls: FormArray<int>; + +scaleMidLabelControls: FormArray<String?>; + -_scaleResponseOptionsArray: FormArray<int>; + +scaleMinColorControl: FormControl<SerializableColor>; + +scaleMaxColorControl: FormControl<SerializableColor>; + +prevMidValues: List<int?>?; + +freeTextTypeControl: FormControl<FreeTextQuestionType>; + +customRegexControl: FormControl<String>; + +freeTextResponseOptionsArray: FormArray<dynamic>; + +freeTextLengthMin: AbstractControl<int>; + +freeTextLengthMax: AbstractControl<int>; + +freeTextExampleTextControl: FormControl<String>; + <static>+kDefaultFreeTextMinLength: int; + <static>+kDefaultFreeTextMaxLength: int; + +freeTextLengthControl: FormControl<RangeValues>; + -_controlsByQuestionType: Map<SurveyQuestionType, FormGroup>; + -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + -_validationConfigsByQuestionType: Map<SurveyQuestionType, Map<FormValidationSetEnum, List<FormControlValidation>>>; + +form: FormGroup; + +questionId: String; + +questionType: SurveyQuestionType; + +questionTypeControlOptions: List<FormControlOption<SurveyQuestionType>>; + +answerOptionsArray: FormArray<dynamic>; + +answerOptionsControls: List<AbstractControl<dynamic>>; + +validAnswerOptions: List<String>; + +boolOptions: List<AbstractControl<String>>; + +imageOptions: List<AbstractControl<String>>; + +audioOptions: List<AbstractControl<String>>; + +scaleMinValue: int; + +scaleMaxValue: int; + +scaleRange: int; + +scaleAllValueControls: List<AbstractControl<int>>; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +questionTextRequired: dynamic; + +numValidChoiceOptions: dynamic; + +scaleRangeValid: dynamic; + +maxRecordingDurationValid: dynamic; + +titles: Map<FormMode, String>; + +isAddOptionButtonVisible: bool; + +isMidValuesClearedInfoVisible: bool | - +Widget build(); - -double _getWidth() + +String? scaleMidLabelAt(); + -dynamic _onScaleRangeChanged(); + -dynamic _applyInputFormatters(); + -dynamic _updateScaleMidValueControls(); + -Map<String, dynamic>? _validateFreeText(); + -dynamic _onFreeTextLengthChanged(); + -List<FormControlValidation> _getValidationConfig(); + +dynamic onQuestionTypeChanged(); + +dynamic onResponseOptionsChanged(); + -void _updateFormControls(); + +void initControls(); + +void setControlsFrom(); + +QuestionFormData buildFormData(); + +List<ModelAction<dynamic>> availableActions(); + +void onNewItem(); + +void onSelectItem(); + +dynamic save(); + +QuestionFormViewModel createDuplicate() ] - [ConstrainedWidthFlexible]o-[<abstract>Widget] - [ConstrainedWidthFlexible]o-[BoxConstraints] + [QuestionFormViewModel]o-[SurveyQuestionType] + [QuestionFormViewModel]o-[FormControl] + [QuestionFormViewModel]o-[FormArray] + [QuestionFormViewModel]o-[<abstract>AbstractControl] + [QuestionFormViewModel]o-[FormGroup] + [<abstract>ManagedFormViewModel]<:-[QuestionFormViewModel] + [<abstract>IListActionProvider]<:--[QuestionFormViewModel] - [PrimaryButton + [SurveyQuestionFormView | - +text: String; - +icon: IconData?; - +isLoading: bool; - +showLoadingEarliestAfterMs: int; - +onPressed: void Function()?; - +tooltip: String; - +tooltipDisabled: String; - +enabled: bool; - +onPressedFuture: dynamic Function()?; - +innerPadding: EdgeInsets; - +minimumSize: Size?; - +isDisabled: bool + +formViewModel: QuestionFormViewModel; + +isHtmlStyleable: bool ] - [PrimaryButton]o-[IconData] - [PrimaryButton]o-[void Function()?] - [PrimaryButton]o-[dynamic Function()?] - [PrimaryButton]o-[EdgeInsets] - [PrimaryButton]o-[Size] + [SurveyQuestionFormView]o-[QuestionFormViewModel] - [EmptyBody + [<abstract>IFormDataWithSchedule | - +icon: IconData?; - +leading: Widget?; - +leadingSpacing: double?; - +title: String?; - +description: String?; - +button: Widget? + +instanceId: String; + +isTimeLocked: bool; + +timeLockStart: StudyUTimeOfDay?; + +timeLockEnd: StudyUTimeOfDay?; + +hasReminder: bool; + +reminderTime: StudyUTimeOfDay? | - +Widget build() + +Schedule toSchedule() ] - [EmptyBody]o-[IconData] - [EmptyBody]o-[<abstract>Widget] + [<abstract>IFormDataWithSchedule]o-[StudyUTimeOfDay] + [<abstract>IFormData]<:--[<abstract>IFormDataWithSchedule] - [<abstract>FormConsumerWidget + [ScheduleControls | - +Widget build() - ] - - [<abstract>FormConsumerRefWidget + +formViewModel: WithScheduleControls | - +Widget build() + +Widget build(); + -List<FormTableRow> _conditionalTimeRestrictions() ] - [Badge + [ScheduleControls]o-[<abstract>WithScheduleControls] + [<abstract>FormConsumerWidget]<:-[ScheduleControls] + + [<abstract>WithScheduleControls | - +icon: IconData?; - +color: Color?; - +borderRadius: double; - +label: String; - +type: BadgeType; - +padding: EdgeInsets; - +iconSize: double?; - +labelStyle: TextStyle?; - +center: bool + +isTimeRestrictedControl: FormControl<bool>; + +instanceID: FormControl<String>; + +restrictedTimeStartControl: FormControl<Time>; + +restrictedTimeStartPickerControl: FormControl<TimeOfDay>; + +restrictedTimeEndControl: FormControl<Time>; + +restrictedTimeEndPickerControl: FormControl<TimeOfDay>; + +hasReminderControl: FormControl<bool>; + +reminderTimeControl: FormControl<Time>; + +reminderTimePickerControl: FormControl<TimeOfDay>; + -_reminderControlStream: StreamSubscription<dynamic>?; + +scheduleFormControls: Map<String, FormControl<Object>>; + +hasReminder: bool; + +isTimeRestricted: bool; + +timeRestriction: List<Time>? | - +Widget build(); - -Color? _getBackgroundColor(); - -Color _getBorderColor(); - -Color? _getLabelColor() + +void setScheduleControlsFrom(); + -dynamic _initReminderControl() ] - [Badge]o-[IconData] - [Badge]o-[Color] - [Badge]o-[BadgeType] - [Badge]o-[EdgeInsets] - [Badge]o-[TextStyle] + [<abstract>WithScheduleControls]o-[FormControl] + [<abstract>WithScheduleControls]o-[StreamSubscription] - [BadgeType + [<abstract>StudyDesignPageWidget | - +index: int; - <static>+values: List<BadgeType>; - <static>+filled: BadgeType; - <static>+outlined: BadgeType; - <static>+outlineFill: BadgeType; - <static>+plain: BadgeType + +Widget? banner() ] - [BadgeType]o-[BadgeType] - [Enum]<:--[BadgeType] + [<abstract>StudyPageWidget]<:-[<abstract>StudyDesignPageWidget] - [NullHelperDecoration + [StudiesTableColumnHeader + | + +title: String; + +sortable: bool; + +sortAscending: bool; + +sortingActive: bool; + +onSort: void Function()? ] - [InputDecoration]<:-[NullHelperDecoration] + [StudiesTableColumnHeader]o-[void Function()?] - [Collapsible + [DashboardScreen | - +contentBuilder: Widget Function(BuildContext, bool); - +headerBuilder: Widget Function(BuildContext, bool)?; - +title: String?; - +isCollapsed: bool + +filter: StudiesFilter? ] - [Collapsible]o-[Widget Function(BuildContext, bool)] - [Collapsible]o-[Widget Function(BuildContext, bool)?] + [DashboardScreen]o-[StudiesFilter] - [ActionMenuInline + [DashboardScaffold | - +actions: List<ModelAction<dynamic>>; - +iconSize: double?; - +visible: bool; - +splashRadius: double?; - +paddingVertical: double?; - +paddingHorizontal: double? + <static>+compactWidthThreshold: double; + +body: Widget | +Widget build() ] - [StudyULogo + [DashboardScaffold]o-[<abstract>Widget] + + [DashboardController | - +onTap: void Function()? + +studyRepository: IStudyRepository; + +authRepository: IAuthRepository; + +userRepository: IUserRepository; + +router: GoRouter; + -_studiesSubscription: StreamSubscription<List<WrappedModel<Study>>>?; + +searchController: SearchController; + +isSortAscending: bool | - +Widget build() + -dynamic _subscribeStudies(); + +dynamic setSearchText(); + +dynamic setStudiesFilter(); + +dynamic onSelectStudy(); + +dynamic onClickNewStudy(); + +dynamic pinStudy(); + +dynamic pinOffStudy(); + +void setSorting(); + +void filterStudies(); + +void sortStudies(); + +bool isSortingActiveForColumn(); + +bool isPinned(); + +List<ModelAction<dynamic>> availableActions(); + +void dispose() ] - [StudyULogo]o-[void Function()?] + [DashboardController]o-[<abstract>IStudyRepository] + [DashboardController]o-[<abstract>IAuthRepository] + [DashboardController]o-[<abstract>IUserRepository] + [DashboardController]o-[GoRouter] + [DashboardController]o-[StreamSubscription] + [DashboardController]o-[SearchController] + [<abstract>IModelActionProvider]<:--[DashboardController] - [NavbarTab + [StudiesFilter | - +title: String; - +intent: RoutingIntent?; +index: int; - +enabled: bool + <static>+values: List<StudiesFilter> ] - [NavbarTab]o-[RoutingIntent] + [Enum]<:--[StudiesFilter] - [TabbedNavbar + [StudiesTableColumnSize | - +tabs: List<T>; - +selectedTab: T?; - +indicator: BoxDecoration?; - +height: double?; - +disabledBackgroundColor: Color?; - +disabledTooltipText: String?; - +onSelect: void Function(int, T)?; - +labelPadding: EdgeInsets?; - +labelSpacing: double?; - +indicatorSize: TabBarIndicatorSize?; - +isScrollable: bool; - +backgroundColor: Color?; - +labelColorHover: Color?; - +unselectedLabelColorHover: Color? + +collapsed: bool; + +flex: int?; + +width: double? + | + +Widget createContainer() ] - [TabbedNavbar]o-[BoxDecoration] - [TabbedNavbar]o-[Color] - [TabbedNavbar]o-[void Function(int, T)?] - [TabbedNavbar]o-[EdgeInsets] - [TabbedNavbar]o-[TabBarIndicatorSize] - - [HtmlStylingBanner + [StudiesTable | - +isDismissed: bool; - +onDismissed: dynamic Function()? + +itemHeight: double; + +itemPadding: double; + +rowSpacing: double; + +columnSpacing: double; + +compactWidthThreshold: double; + +superCompactWidthThreshold: double; + +compactStatTitleThreshold: double; + +studies: List<Study>; + +onSelect: void Function(Study); + +getActions: List<ModelAction<dynamic>> Function(Study); + +emptyWidget: Widget; + +pinnedStudies: Iterable<String>; + +dashboardController: DashboardController | - +Widget build() + +Widget build(); + -Widget _buildColumnHeader() ] - [HtmlStylingBanner]o-[dynamic Function()?] + [StudiesTable]o-[void Function(Study)] + [StudiesTable]o-[List<ModelAction<dynamic>> Function(Study)] + [StudiesTable]o-[<abstract>Widget] + [StudiesTable]o-[DashboardController] - [<abstract>ISyncIndicatorViewModel + [StudiesTableColumn | - +isDirty: bool; - +lastSynced: DateTime? + +index: int; + <static>+values: List<StudiesTableColumn>; + <static>+pin: StudiesTableColumn; + <static>+title: StudiesTableColumn; + <static>+status: StudiesTableColumn; + <static>+participation: StudiesTableColumn; + <static>+createdAt: StudiesTableColumn; + <static>+enrolled: StudiesTableColumn; + <static>+active: StudiesTableColumn; + <static>+completed: StudiesTableColumn; + <static>+action: StudiesTableColumn ] - [SyncIndicator + [StudiesTableColumn]o-[StudiesTableColumn] + [Enum]<:--[StudiesTableColumn] + + [StudiesTableItem | - +state: AsyncValue<T>; - +lastSynced: DateTime?; - +isDirty: bool; - +animationDuration: int; - +iconSize: double + +study: Study; + +itemHeight: double; + +itemPadding: double; + +rowSpacing: double; + +columnSpacing: double; + +actions: List<ModelAction<dynamic>>; + +columnSizes: List<StudiesTableColumnSize>; + +isPinned: bool; + +onPinnedChanged: void Function(Study, bool)?; + +onTap: void Function(Study)? ] - [SyncIndicator]o-[<abstract>AsyncValue] + [StudiesTableItem]o-[Study] + [StudiesTableItem]o-[void Function(Study, bool)?] + [StudiesTableItem]o-[void Function(Study)?] - [Search - | - +onQueryChanged: dynamic Function(String); - +searchController: SearchController?; - +hintText: String?; - +initialText: String? + [App ] - [Search]o-[dynamic Function(String)] - [Search]o-[SearchController] + [AppContent + ] - [SearchController + [AccountSettingsDialog | - +setText: void Function(String) + +Widget build() ] - [SearchController]o-[void Function(String)] + [<abstract>ConsumerWidget]<:-[AccountSettingsDialog] - [ActionMenuType + [<abstract>IInviteCodeRepository | - +index: int; - <static>+values: List<ActionMenuType>; - <static>+inline: ActionMenuType; - <static>+popup: ActionMenuType + +dynamic isCodeAlreadyUsed() ] - [ActionMenuType]o-[ActionMenuType] - [Enum]<:--[ActionMenuType] + [<abstract>ModelRepository]<:--[<abstract>IInviteCodeRepository] - [SecondaryButton + [InviteCodeRepository | - +text: String; - +icon: IconData?; - +isLoading: bool; - +onPressed: void Function()? + +studyId: String; + +ref: ProviderRef<dynamic>; + +apiClient: StudyUApi; + +authRepository: IAuthRepository; + +studyRepository: IStudyRepository; + +study: Study | - +Widget build() + +String getKey(); + +dynamic isCodeAlreadyUsed(); + +List<ModelAction<dynamic>> availableActions(); + +dynamic emitUpdate() ] - [SecondaryButton]o-[IconData] - [SecondaryButton]o-[void Function()?] + [InviteCodeRepository]o-[<abstract>ProviderRef] + [InviteCodeRepository]o-[<abstract>StudyUApi] + [InviteCodeRepository]o-[<abstract>IAuthRepository] + [InviteCodeRepository]o-[<abstract>IStudyRepository] + [InviteCodeRepository]o-[Study] + [<abstract>ModelRepository]<:-[InviteCodeRepository] + [<abstract>IInviteCodeRepository]<:--[InviteCodeRepository] - [FormTableRow + [InviteCodeRepositoryDelegate | - +label: String?; - +labelBuilder: Widget Function(BuildContext)?; - +labelStyle: TextStyle?; - +labelHelpText: String?; - +input: Widget; - +control: AbstractControl<dynamic>?; - +layout: FormTableRowLayout? + +study: Study; + +apiClient: StudyUApi; + +studyRepository: IStudyRepository + | + +dynamic fetch(); + +dynamic fetchAll(); + +dynamic save(); + +dynamic delete(); + +dynamic onError(); + +StudyInvite createDuplicate(); + +StudyInvite createNewInstance() ] - [FormTableRow]o-[Widget Function(BuildContext)?] - [FormTableRow]o-[TextStyle] - [FormTableRow]o-[<abstract>Widget] - [FormTableRow]o-[<abstract>AbstractControl] - [FormTableRow]o-[FormTableRowLayout] + [InviteCodeRepositoryDelegate]o-[Study] + [InviteCodeRepositoryDelegate]o-[<abstract>StudyUApi] + [InviteCodeRepositoryDelegate]o-[<abstract>IStudyRepository] + [<abstract>IModelRepositoryDelegate]<:-[InviteCodeRepositoryDelegate] - [FormTableLayout - | - +rows: List<FormTableRow>; - +columnWidths: Map<int, TableColumnWidth>; - +rowDivider: Widget?; - +rowLayout: FormTableRowLayout?; - +rowLabelStyle: TextStyle? + [<abstract>IStudyRepository | - +Widget build() + +dynamic launch(); + +dynamic deleteParticipants() ] - [FormTableLayout]o-[<abstract>Widget] - [FormTableLayout]o-[FormTableRowLayout] - [FormTableLayout]o-[TextStyle] + [<abstract>ModelRepository]<:--[<abstract>IStudyRepository] - [FormSectionHeader + [StudyRepository | - +title: String; - +titleTextStyle: TextStyle?; - +helpText: String?; - +divider: bool; - +helpTextDisabled: bool + +apiClient: StudyUApi; + +authRepository: IAuthRepository; + +ref: ProviderRef<dynamic>; + +sortCallback: void Function()? | - +Widget build() + +String getKey(); + +dynamic deleteParticipants(); + +dynamic launch(); + +List<ModelAction<dynamic>> availableActions() ] - [FormSectionHeader]o-[TextStyle] + [StudyRepository]o-[<abstract>StudyUApi] + [StudyRepository]o-[<abstract>IAuthRepository] + [StudyRepository]o-[<abstract>ProviderRef] + [StudyRepository]o-[void Function()?] + [<abstract>ModelRepository]<:-[StudyRepository] + [<abstract>IStudyRepository]<:--[StudyRepository] - [FormLabel + [StudyRepositoryDelegate | - +labelText: String?; - +helpText: String?; - +labelTextStyle: TextStyle?; - +layout: FormTableRowLayout? + +apiClient: StudyUApi; + +authRepository: IAuthRepository | - +Widget build() + +dynamic fetchAll(); + +dynamic fetch(); + +dynamic save(); + +dynamic delete(); + +dynamic onError(); + +Study createNewInstance(); + +Study createDuplicate() ] - [FormLabel]o-[TextStyle] - [FormLabel]o-[FormTableRowLayout] + [StudyRepositoryDelegate]o-[<abstract>StudyUApi] + [StudyRepositoryDelegate]o-[<abstract>IAuthRepository] + [<abstract>IModelRepositoryDelegate]<:-[StudyRepositoryDelegate] - [FormTableRowLayout + [<abstract>StudyUApi | - +index: int; - <static>+values: List<FormTableRowLayout>; - <static>+vertical: FormTableRowLayout; - <static>+horizontal: FormTableRowLayout + +dynamic saveStudy(); + +dynamic fetchStudy(); + +dynamic getUserStudies(); + +dynamic deleteStudy(); + +dynamic saveStudyInvite(); + +dynamic fetchStudyInvite(); + +dynamic deleteStudyInvite(); + +dynamic deleteParticipants(); + +dynamic fetchAppConfig(); + +dynamic fetchUser(); + +dynamic saveUser() ] - [FormTableRowLayout]o-[FormTableRowLayout] - [Enum]<:--[FormTableRowLayout] - - [MouseEventsRegion - | - +onTap: void Function()?; - +onHover: void Function(PointerHoverEvent)?; - +onEnter: void Function(PointerEnterEvent)?; - +onExit: void Function(PointerExitEvent)?; - +autoselectCursor: bool; - +cursor: SystemMouseCursor; - <static>+defaultCursor: SystemMouseCursor; - +autoCursor: SystemMouseCursor + [APIException ] - [MouseEventsRegion]o-[void Function()?] - [MouseEventsRegion]o-[void Function(PointerHoverEvent)?] - [MouseEventsRegion]o-[void Function(PointerEnterEvent)?] - [MouseEventsRegion]o-[void Function(PointerExitEvent)?] - [MouseEventsRegion]o-[SystemMouseCursor] + [Exception]<:--[APIException] - [FormControlLabel - | - +formControl: AbstractControl<dynamic>; - +text: String; - +isClickable: bool; - +textStyle: TextStyle?; - +onClick: void Function(AbstractControl<dynamic>)? - | - +Widget build() + [StudyNotFoundException ] - [FormControlLabel]o-[<abstract>AbstractControl] - [FormControlLabel]o-[TextStyle] - [FormControlLabel]o-[void Function(AbstractControl<dynamic>)?] + [APIException]<:-[StudyNotFoundException] - [SingleColumnLayout - | - <static>+defaultConstraints: BoxConstraints; - <static>+defaultConstraintsNarrow: BoxConstraints; - +body: Widget; - +header: Widget?; - +stickyHeader: bool; - +constraints: BoxConstraints?; - +scroll: bool; - +padding: EdgeInsets? - | - <static>+dynamic fromType() + [MeasurementNotFoundException ] - [SingleColumnLayout]o-[BoxConstraints] - [SingleColumnLayout]o-[<abstract>Widget] - [SingleColumnLayout]o-[EdgeInsets] + [APIException]<:-[MeasurementNotFoundException] - [SingleColumnLayoutType - | - +index: int; - <static>+values: List<SingleColumnLayoutType>; - <static>+boundedWide: SingleColumnLayoutType; - <static>+boundedNarrow: SingleColumnLayoutType; - <static>+stretched: SingleColumnLayoutType; - <static>+split: SingleColumnLayoutType + [QuestionNotFoundException ] - [SingleColumnLayoutType]o-[SingleColumnLayoutType] - [Enum]<:--[SingleColumnLayoutType] + [APIException]<:-[QuestionNotFoundException] - [TwoColumnLayout - | - <static>+defaultDivider: VerticalDivider; - <static>+defaultContentPadding: EdgeInsets; - <static>+slimContentPadding: EdgeInsets; - +leftWidget: Widget; - +rightWidget: Widget; - +dividerWidget: Widget?; - +headerWidget: Widget?; - +flexLeft: int?; - +flexRight: int?; - +constraintsLeft: BoxConstraints?; - +constraintsRight: BoxConstraints?; - +scrollLeft: bool; - +scrollRight: bool; - +paddingLeft: EdgeInsets?; - +paddingRight: EdgeInsets?; - +backgroundColorLeft: Color?; - +backgroundColorRight: Color?; - +stretchHeight: bool + [ConsentItemNotFoundException ] - [TwoColumnLayout]o-[VerticalDivider] - [TwoColumnLayout]o-[EdgeInsets] - [TwoColumnLayout]o-[<abstract>Widget] - [TwoColumnLayout]o-[BoxConstraints] - [TwoColumnLayout]o-[Color] + [APIException]<:-[ConsentItemNotFoundException] - [UnderConstruction - | - +Widget build() + [InterventionNotFoundException ] - [StandardDialog - | - +title: Widget?; - +titleText: String?; - +body: Widget; - +actionButtons: List<Widget>; - +backgroundColor: Color?; - +borderRadius: double?; - +width: double?; - +height: double?; - +minWidth: double; - +minHeight: double; - +maxWidth: double?; - +maxHeight: double?; - +padding: EdgeInsets - | - +Widget build() + [APIException]<:-[InterventionNotFoundException] + + [InterventionTaskNotFoundException ] - [StandardDialog]o-[<abstract>Widget] - [StandardDialog]o-[Color] - [StandardDialog]o-[EdgeInsets] + [APIException]<:-[InterventionTaskNotFoundException] - [IndicatorRangeSliderThumbShape - | - +buildContext: BuildContext; - +start: T; - +end: T - | - +Size getPreferredSize(); - +void paint() + [ReportNotFoundException ] - [IndicatorRangeSliderThumbShape]o-[<abstract>BuildContext] - [<abstract>RangeSliderThumbShape]<:-[IndicatorRangeSliderThumbShape] + [APIException]<:-[ReportNotFoundException] - [<abstract>IWithBanner - | - +Widget? banner() + [ReportSectionNotFoundException ] - [BannerBox - | - +prefixIcon: Widget?; - +body: Widget; - +style: BannerStyle; - +padding: EdgeInsets?; - +noPrefix: bool; - +dismissable: bool; - +isDismissed: bool?; - +onDismissed: dynamic Function()?; - +dismissIconSize: double + [APIException]<:-[ReportSectionNotFoundException] + + [StudyInviteNotFoundException ] - [BannerBox]o-[<abstract>Widget] - [BannerBox]o-[BannerStyle] - [BannerBox]o-[EdgeInsets] - [BannerBox]o-[dynamic Function()?] + [APIException]<:-[StudyInviteNotFoundException] - [BannerStyle - | - +index: int; - <static>+values: List<BannerStyle>; - <static>+warning: BannerStyle; - <static>+info: BannerStyle; - <static>+error: BannerStyle + [UserNotFoundException ] - [BannerStyle]o-[BannerStyle] - [Enum]<:--[BannerStyle] + [APIException]<:-[UserNotFoundException] - [ActionPopUpMenuButton + [StudyUApiClient | - +actions: List<ModelAction<dynamic>>; - +triggerIconColor: Color?; - +triggerIconColorHover: Color?; - +triggerIconSize: double; - +disableSplashEffect: bool; - +hideOnEmpty: bool; - +orientation: Axis; - +elevation: double?; - +splashRadius: double?; - +enabled: bool; - +position: PopupMenuPosition + +supabaseClient: SupabaseClient; + <static>+studyColumns: List<String>; + <static>+studyWithParticipantActivityColumns: List<String>; + +testDelayMilliseconds: int | - +Widget build(); - -Widget _buildPopupMenu() + +dynamic deleteParticipants(); + +dynamic getUserStudies(); + +dynamic fetchStudy(); + +dynamic deleteStudy(); + +dynamic saveStudy(); + +dynamic fetchStudyInvite(); + +dynamic saveStudyInvite(); + +dynamic deleteStudyInvite(); + +dynamic fetchAppConfig(); + +dynamic fetchUser(); + +dynamic saveUser(); + -dynamic _awaitGuarded(); + -dynamic _apiException(); + -dynamic _testDelay() ] - [ActionPopUpMenuButton]o-[Color] - [ActionPopUpMenuButton]o-[Axis] - [ActionPopUpMenuButton]o-[PopupMenuPosition] + [StudyUApiClient]o-[SupabaseClient] + [<abstract>SupabaseClientDependant]<:-[StudyUApiClient] + [<abstract>SupabaseQueryMixin]<:-[StudyUApiClient] + [<abstract>StudyUApi]<:--[StudyUApiClient] - [DismissButton - | - +onPressed: void Function()?; - +text: String? + [<abstract>IAppRepository | - +Widget build() + +dynamic fetchAppConfig(); + +void dispose() ] - [DismissButton]o-[void Function()?] - - [FormScaffold + [AppRepository | - +formViewModel: T; - +actions: List<Widget>?; - +body: Widget; - +drawer: Widget?; - +actionsSpacing: double; - +actionsPadding: double + +apiClient: StudyUApi + | + +dynamic fetchAppConfig(); + +void dispose() ] - [FormScaffold]o-[<abstract>Widget] + [AppRepository]o-[<abstract>StudyUApi] + [<abstract>IAppRepository]<:--[AppRepository] - [AsyncValueWidget + [<abstract>IUserRepository | - +value: AsyncValue<T>; - +data: Widget Function(T); - +error: Widget Function(Object, StackTrace?)?; - +loading: Widget Function()?; - +empty: Widget Function()? + +user: StudyUUser | - +Widget build(); - -Widget _buildDataOrEmptyWidget(); - -Widget _defaultError(); - -Widget _defaultLoad() + +dynamic fetchUser(); + +dynamic saveUser(); + +dynamic updatePreferences() ] - [AsyncValueWidget]o-[<abstract>AsyncValue] - [AsyncValueWidget]o-[Widget Function(T)] - [AsyncValueWidget]o-[Widget Function(Object, StackTrace?)?] - [AsyncValueWidget]o-[Widget Function()?] - - [<abstract>ResultTypes - ] + [<abstract>IUserRepository]o-[StudyUUser] - [MeasurementResultTypes + [UserRepository | - <static>+questionnaire: String; - <static>+values: List<String> + +apiClient: StudyUApi; + +authRepository: IAuthRepository; + +ref: Ref<Object?>; + +user: StudyUUser + | + +dynamic fetchUser(); + +dynamic saveUser(); + +dynamic updatePreferences() ] - [<abstract>ResultTypes]<:-[MeasurementResultTypes] + [UserRepository]o-[<abstract>StudyUApi] + [UserRepository]o-[<abstract>IAuthRepository] + [UserRepository]o-[<abstract>Ref] + [UserRepository]o-[StudyUUser] + [<abstract>IUserRepository]<:--[UserRepository] - [InterventionResultTypes + [PreferenceAction | - <static>+checkmarkTask: String; - <static>+values: List<String> + +index: int; + <static>+values: List<PreferenceAction>; + <static>+pin: PreferenceAction; + <static>+pinOff: PreferenceAction ] - [<abstract>ResultTypes]<:-[InterventionResultTypes] + [PreferenceAction]o-[PreferenceAction] + [Enum]<:--[PreferenceAction] - [StudyExportData + [<abstract>IAuthRepository | - +study: Study; - +measurementsData: List<Map<String, dynamic>>; - +interventionsData: List<Map<String, dynamic>>; - +mediaData: List<String>; - +isEmpty: bool + +allowPasswordReset: bool; + +currentUser: User?; + +isLoggedIn: bool; + +session: Session?; + +serializedSession: String? + | + +dynamic signUp(); + +dynamic signInWith(); + +dynamic signOut(); + +dynamic resetPasswordForEmail(); + +dynamic updateUser(); + +void dispose() ] - [StudyExportData]o-[Study] + [<abstract>IAuthRepository]o-[User] + [<abstract>IAuthRepository]o-[Session] + [<abstract>IAppDelegate]<:-[<abstract>IAuthRepository] - [StudyTemplates + [AuthRepository | - <static>+kUnnamedStudyTitle: String + +supabaseClient: SupabaseClient; + +allowPasswordReset: bool; + +authClient: GoTrueClient; + +session: Session?; + +serializedSession: String?; + +currentUser: User?; + +isLoggedIn: bool | - <static>+Study emptyDraft() + -void _registerAuthListener(); + +dynamic signUp(); + +dynamic signInWith(); + +dynamic signOut(); + +dynamic resetPasswordForEmail(); + +dynamic updateUser(); + +void dispose(); + +dynamic onAppStart() ] - [StudyActionType - | - +index: int; - <static>+values: List<StudyActionType>; - <static>+pin: StudyActionType; - <static>+pinoff: StudyActionType; - <static>+edit: StudyActionType; - <static>+duplicate: StudyActionType; - <static>+duplicateDraft: StudyActionType; - <static>+addCollaborator: StudyActionType; - <static>+export: StudyActionType; - <static>+delete: StudyActionType + [AuthRepository]o-[SupabaseClient] + [AuthRepository]o-[GoTrueClient] + [AuthRepository]o-[Session] + [AuthRepository]o-[User] + [<abstract>IAuthRepository]<:--[AuthRepository] + + [StudyLaunched ] - [StudyActionType]o-[StudyActionType] - [Enum]<:--[StudyActionType] + [<abstract>ModelEvent]<:-[StudyLaunched] - [DropdownMenuItemTheme + [<abstract>SupabaseClientDependant | - +iconTheme: IconThemeData? + +supabaseClient: SupabaseClient ] - [DropdownMenuItemTheme]o-[IconThemeData] - [<abstract>Diagnosticable]<:-[DropdownMenuItemTheme] + [<abstract>SupabaseClientDependant]o-[SupabaseClient] - [ThemeConfig - | - <static>+kMinContentWidth: double; - <static>+kMaxContentWidth: double; - <static>+kHoverFadeFactor: double; - <static>+kMuteFadeFactor: double + [SupabaseQueryError | - <static>+dynamic bodyBackgroundColor(); - <static>+Color modalBarrierColor(); - <static>+Color containerColor(); - <static>+Color colorPickerInitialColor(); - <static>+TextStyle bodyTextMuted(); - <static>+TextStyle bodyTextBackground(); - <static>+double iconSplashRadius(); - <static>+Color sidesheetBackgroundColor(); - <static>+InputDecorationTheme dropdownInputDecorationTheme(); - <static>+DropdownMenuItemTheme dropdownMenuItemTheme() + +statusCode: String?; + +message: String; + +details: dynamic ] - [NoAnimationPageTransitionsBuilder + [Exception]<:--[SupabaseQueryError] + + [<abstract>SupabaseQueryMixin | - +Widget buildTransitions() + +dynamic deleteAll(); + +dynamic getAll(); + +dynamic getById(); + +dynamic getByColumn(); + +List<T> deserializeList(); + +T deserializeObject() ] - [<abstract>PageTransitionsBuilder]<:-[NoAnimationPageTransitionsBuilder] - - [WebTransitionBuilder + [WrappedModel | - +Widget buildTransitions() + -_model: T; + +asyncValue: AsyncValue<T>; + +isLocalOnly: bool; + +isDirty: bool; + +isDeleted: bool; + +lastSaved: DateTime?; + +lastFetched: DateTime?; + +lastUpdated: DateTime?; + +model: T + | + +dynamic markWithError(); + +dynamic markAsLoading(); + +dynamic markAsFetched(); + +dynamic markAsSaved() ] - [<abstract>PageTransitionsBuilder]<:-[WebTransitionBuilder] + [WrappedModel]o-[<abstract>AsyncValue] - [ThemeSettingChange - | - +settings: ThemeSettings + [ModelRepositoryException ] - [ThemeSettingChange]o-[ThemeSettings] - [<abstract>Notification]<:-[ThemeSettingChange] + [Exception]<:--[ModelRepositoryException] - [ThemeProvider - | - +settings: ValueNotifier<ThemeSettings>; - +lightDynamic: ColorScheme?; - +darkDynamic: ColorScheme?; - +pageTransitionsTheme: PageTransitionsTheme; - +shapeMedium: ShapeBorder - | - +Color custom(); - +Color blend(); - +Color source(); - +ColorScheme colors(); - +CardTheme cardTheme(); - +ListTileThemeData listTileTheme(); - +AppBarTheme appBarTheme(); - +SnackBarThemeData snackBarThemeData(); - +TabBarTheme tabBarTheme(); - +BottomAppBarTheme bottomAppBarTheme(); - +BottomNavigationBarThemeData bottomNavigationBarTheme(); - +SwitchThemeData switchTheme(); - +InputDecorationTheme inputDecorationTheme(); - +TextTheme textTheme(); - +DividerThemeData dividerTheme(); - +NavigationRailThemeData navigationRailTheme(); - +DrawerThemeData drawerTheme(); - +IconThemeData iconTheme(); - +CheckboxThemeData checkboxTheme(); - +RadioThemeData radioTheme(); - +TooltipThemeData tooltipTheme(); - +ThemeData light(); - +ThemeData dark(); - +ThemeMode themeMode(); - +ThemeData theme(); - <static>+ThemeProvider of(); - +bool updateShouldNotify() + [ModelNotFoundException ] - [ThemeProvider]o-[ValueNotifier] - [ThemeProvider]o-[ColorScheme] - [ThemeProvider]o-[PageTransitionsTheme] - [ThemeProvider]o-[<abstract>ShapeBorder] - [<abstract>InheritedWidget]<:-[ThemeProvider] + [ModelRepositoryException]<:--[ModelNotFoundException] - [ThemeSettings + [<abstract>IModelRepository | - +sourceColor: Color; - +themeMode: ThemeMode + +String getKey(); + +WrappedModel<T>? get(); + +dynamic fetchAll(); + +dynamic fetch(); + +dynamic save(); + +dynamic delete(); + +dynamic duplicateAndSave(); + +dynamic duplicateAndSaveFromRemote(); + +Stream<WrappedModel<T>> watch(); + +Stream<List<WrappedModel<T>>> watchAll(); + +Stream<ModelEvent<T>> watchChanges(); + +Stream<ModelEvent<T>> watchAllChanges(); + +dynamic ensurePersisted(); + +void dispose() ] - [ThemeSettings]o-[Color] - [ThemeSettings]o-[ThemeMode] + [<abstract>IModelActionProvider]<:--[<abstract>IModelRepository] - [CustomColor - | - +name: String; - +color: Color; - +blend: bool + [<abstract>IModelRepositoryDelegate | - +Color value() + +dynamic fetchAll(); + +dynamic fetch(); + +dynamic save(); + +dynamic delete(); + +T createNewInstance(); + +T createDuplicate(); + +dynamic onError() ] - [CustomColor]o-[Color] - - [LanguagePicker + [<abstract>ModelRepository | - +languagePickerType: LanguagePickerType; - +iconColor: Color?; - +offset: Offset? + +delegate: IModelRepositoryDelegate<T>; + -_allModelsStreamController: BehaviorSubject<List<WrappedModel<T>>>; + -_allModelEventsStreamController: BehaviorSubject<ModelEvent<T>>; + +modelStreamControllers: Map<String, BehaviorSubject<WrappedModel<T>>>; + +modelEventsStreamControllers: Map<String, BehaviorSubject<ModelEvent<T>>>; + -_allModels: Map<String, WrappedModel<T>> + | + +WrappedModel<T>? get(); + +dynamic fetchAll(); + +dynamic fetch(); + +dynamic save(); + +dynamic delete(); + +dynamic duplicateAndSave(); + +dynamic duplicateAndSaveFromRemote(); + +Stream<List<WrappedModel<T>>> watchAll(); + +Stream<WrappedModel<T>> watch(); + +Stream<ModelEvent<T>> watchAllChanges(); + +Stream<ModelEvent<T>> watchChanges(); + -dynamic _buildModelSpecificController(); + +dynamic ensurePersisted(); + +WrappedModel<T> upsertLocally(); + +List<WrappedModel<T>> upsertAllLocally(); + +dynamic emitUpdate(); + +dynamic emitModelEvent(); + +dynamic emitError(); + +void dispose(); + +List<ModelAction<dynamic>> availableActions() ] - [LanguagePicker]o-[LanguagePickerType] - [LanguagePicker]o-[Color] - [LanguagePicker]o-[Offset] + [<abstract>ModelRepository]o-[<abstract>IModelRepositoryDelegate] + [<abstract>ModelRepository]o-[BehaviorSubject] + [<abstract>IModelRepository]<:-[<abstract>ModelRepository] - [LanguagePickerType + [<abstract>ModelEvent | - +index: int; - <static>+values: List<LanguagePickerType>; - <static>+field: LanguagePickerType; - <static>+icon: LanguagePickerType + +modelId: String; + +model: T ] - [LanguagePickerType]o-[LanguagePickerType] - [Enum]<:--[LanguagePickerType] - - [PlatformLocaleMobile - | - +Locale getPlatformLocale() + [IsFetched ] - [<abstract>PlatformLocale]<:--[PlatformLocaleMobile] + [<abstract>ModelEvent]<:-[IsFetched] - [<abstract>PlatformLocale - | - +Locale getPlatformLocale() + [IsSaving ] - [PlatformLocaleWeb - | - +Locale getPlatformLocale() + [<abstract>ModelEvent]<:-[IsSaving] + + [IsSaved ] - [<abstract>PlatformLocale]<:--[PlatformLocaleWeb] + [<abstract>ModelEvent]<:-[IsSaved] - [AppTranslation - | - <static>+dynamic init() + [IsDeleted ] + [<abstract>ModelEvent]<:-[IsDeleted] + - + - + - + + + + + - + - + - + - + + + + + - + - + - + - + - + - + - + + + + - + + - + - - - + - + - - + + + - - + - + - + + + + + - + - - - - - - - - - - - + - - - - - - - - - - - - + + + - + + - + - - - - - - - + - + - + - + - + - + - + - + - - - - - - - - - - - + - + - - - + - + - + - + - - - - - + - + - - - + - + - - - - - + - + - + - + - - - + - + - + - + - + - + - + - - - - + - - - - - - + - + - + - + - + - + - + - + - + - - - - - - + - - + - + - + - + - + - + - - - - - + - - - - - - - - + - - - - - - + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + - - - - - - - - - - + - + - - + + + - - - + + + - - + - + - + - + - + - + - + - + - - - + - - + + - + - + - + - - - + - + - + - + - + - + - + - + - + - + - + - - + + - - - - + - - + - - - - + - - + - + - + - + - + - + - + - - - - - - - - - - + - - + - + - + - + - + - + + + + - + + - + - + - + - + - + - + - + - + - + - - - - - + - + - + - + - - - + - + - - - + - + - + + + - + - + - + - + - + - + - + - + + + - + - - - - - + - + - + - + - + + + - + - + - + - - - + - + - + - + - + - + - - - - + + + + + - - + + + - + - + - - + + - + - + + + - + - + - + - + - + - + - + - + - + - + - - + + - - - - + - - + - + - - - + - + - - - + - + - - - + - + - + - + - + - + - + - + - - - + - + - + - + - + - + - - - - - - - + - + - + - + - + - + - + - + - + - + - - - + + - + + - + - + + + + + - + - + - + - - - - + + + - - + - + - - + + + - - - + + + - - + - + - - - + - + - + - + - + - + - + - + - + - + - - + + + - - + - + - + - - - - + + + - + + - + - + - + - - - + - + - + - + - - - + - - - - + + - + - - - - - + - + - + - + - + - + - + - + - + - + - + - + - + + + - - - - - - - - - - - - + - - + - - + + - + - + - + + + + + + + + + + + - + - - - + + + + + + + + + + - - - + + + + + + + + + - - + + + - + - + - + - - - + - + - + - + - + + + - + - - + + + - - - - + - + - + - + - + - + - + + + + + - + - + + + - + - - - - - + - - - + + + + - - - + + + - - + - + - + - + - + + + + + - + - + - + - + + + + + + + + + - + - - - - + + + + + + + + + + + + + - - - + + + + + - - - + + + + + - - - - + + + - + - - + + + + + - - + - + - - - + - + - + - + - - - - - + - + - - + + + + + + + - - + - + - + - + - + - + - + - + - - - + - + - - - + - - + + - + - + + + + + + - - + - - - - + + - + - + - + - + - + - - - + - + - - - + - + - + - + - + - + - + - + - - - - - - - - + + + - + + - + - - - + + + + + + + + + + + + + + + + - - + + + - + + + + - - - - + - + - - + + - + - + + + - + - + - + - + - + - + - + - - - - + + + - - + - - - + + + + - - + - - + + - + - + - + - - - + + + + - + + + + - + - + + + - + - + - - - - - - + - - - + + + - - + - + - + - + - - + + + - - - + + + - - - + + + - - + + + + + + + + + - + - - - + + + - + - + - + - + - + - + - + - + - + - - - + - + - + - + - + - + - + + + + + - + - + - + + + + + - + - - + + - + - - - + - + - - - - - + - + - + - + - - + + + - - + - + + + + + - + - - + + - + - + - + - - - + - + - + - + - - - + - + - + - + - + + + - + - + - + - + - + - + - + - - - - + + + + + + + - - + + + - + - - + + + - - - - - - - - - - + - + - - - + - + - - - + - + - + - + - - - + + + + + + + + + - + - - - + - + - - + + + + + - - + + + + + - + - - - + - + - - - + - + - - - + - + - + - + + + + + - + - + - + - + - + - - + + - + - - - + - - - - + - - + + + + + - + - + - + - + + + - + - - - + + - + + - + - + - + - - - + + - + + - + - + - + - + - + - + - + - + - + - - + + - + - - - - - - - - - - - - + + + + + + + - + + + + - + - + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + + + + + - + - + + + - + - + - + - + - - - - + - - + + + - + - + - + - - + + + - - + - + - - - + - + - + - + - + - + - + - + + + + + + + + + + - + + - + - + - + + + + - - + - + - - - - + + + - + + - + - + - + - - - + + - - - + + - + - - - - - - - + + - - - + + + - + + - + - + - + - + - + - + + + + + - + - - - - - + + - - - + + + - - - + + + - - - + + + - + + - + - + - + - + + + - + - + + + - + - + - + - - - - - + - + + + + + + + - + - + - - - - - - + + - + - - + + + + - + - + - + - + - + - + - + - + - + - - - + + + + - - - + + + - - - + + + - + + - + - + - + - + + + - + - + - + - + + + + + - + - + + + + + - + - + - + - + - + - + - - - - + + - + - - - - - - - + + + + - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - - + + + + + + - - - - - + + + - - - + + + - + + - + - - - + - + - - - + + - - - + + + - - - + + + - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + + + - + + - + - + - + + + + + + + + + - + - - - - + + - + + + + - + + + + + + + + + + - + - + + + - + - + + + - + - + + + - + - + + + - + + + + - + + - + - + + + - + - + - + - + + + - + - + + + - + - + - + - + - + - + - + - + - + + + - + - - + + - + - + - + - - - + + - + + - + - + + + - + - + - + - + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - + - - + - + - - - + + - - - + + + - + + - + - + - + - + - + - + - + - + - + - - - + + - + + - + - + - + - + - + + + - + - - + + - + - + - + - + - + - + - + - + - + - - - + + + + - + + - + - + - + - + - + - - - - - + + + + - + + - + - + - + - + - + - + - + + + - - - - - - + - + + - + - + - + - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + - + - - - + + - + + - + - + - + - + - + - - - - - + - + - + - + - - - - - - + - - - - - - - + + - + - - - - - + + - + + - + - + - + - + + + - + - - - + - + - + - + - + - + - - - + + - + + + + - + - - - + + - + + - + - + - + - + - + - - - - - - - - - - - GoRouteParamEnum - - - - - - +String toRouteParam() - +String toShortString() - - - + - - - - - - - - RoutingIntents - - - - - - <static>+root: RoutingIntent - <static>+studies: RoutingIntent - <static>+studiesShared: RoutingIntent - <static>+publicRegistry: RoutingIntent - <static>+study: RoutingIntent Function(String) - <static>+studyEdit: RoutingIntent Function(String) - <static>+studyEditInfo: RoutingIntent Function(String) - <static>+studyEditEnrollment: RoutingIntent Function(String) - <static>+studyEditInterventions: RoutingIntent Function(String) - <static>+studyEditIntervention: RoutingIntent Function(String, String) - <static>+studyEditMeasurements: RoutingIntent Function(String) - <static>+studyEditReports: RoutingIntent Function(String) - <static>+studyEditMeasurement: RoutingIntent Function(String, String) - <static>+studyTest: RoutingIntent Function(String, {String? appRoute}) - <static>+studyRecruit: RoutingIntent Function(String) - <static>+studyMonitor: RoutingIntent Function(String) - <static>+studyAnalyze: RoutingIntent Function(String) - <static>+studySettings: RoutingIntent Function(String) - <static>+accountSettings: RoutingIntent - <static>+studyNew: RoutingIntent - <static>+login: RoutingIntent - <static>+signup: RoutingIntent - <static>+passwordForgot: RoutingIntent - <static>+passwordForgot2: RoutingIntent Function(String) - <static>+passwordRecovery: RoutingIntent - <static>+error: RoutingIntent Function(Exception) - - - + + + + - - - - - - - - - RoutingIntent - - - - - - +route: GoRoute - +params: Map<String, String> - +queryParams: Map<String, String> - +dispatch: RoutingIntentDispatch? - +extra: Object? - +routeName: String - +arguments: Map<String, String> - +props: List<Object?> - - - - - - -dynamic _validateRoute() - +bool matches() - - - + + + - - - + + + + + + + + + + + + + + - - - RoutingIntent Function(String) + + + Config - - - - - - - - RoutingIntent Function(String, String) + + + <static>+isDebugMode: bool + <static>+defaultLocale: Set<String> + <static>+supportedLocales: Map<String, String> + <static>+newStudyId: String + <static>+newModelId: String + <static>+minSplashTime: int + <static>+formAutosaveDebounce: int - - - + + + - - - RoutingIntent Function(String, {String? appRoute}) + + + ResultTypes - - - + + + + - - - RoutingIntent Function(Exception) + + + MeasurementResultTypes - - - - - - - - GoRoute + + + <static>+questionnaire: String + <static>+values: List<String> - - - - + + + + - - - RoutingIntentDispatch + + + InterventionResultTypes - - - +index: int - <static>+values: List<RoutingIntentDispatch> - <static>+go: RoutingIntentDispatch - <static>+push: RoutingIntentDispatch + + + <static>+checkmarkTask: String + <static>+values: List<String> - - - + + + + - - - Equatable + + + StudyExportData - - - - - - - - Enum + + + +study: Study + +measurementsData: List<Map<String, dynamic>> + +interventionsData: List<Map<String, dynamic>> + +mediaData: List<String> + +isEmpty: bool - - - - - - - - RouterKeys - - + + + - - - <static>+studyKey: ValueKey<String> - <static>+authKey: ValueKey<String> + + + Study - - - + + + + + - - - ValueKey + + + StudyTemplates - - - - - - - - - RouteParams + + + <static>+kUnnamedStudyTitle: String - - - <static>+studiesFilter: String - <static>+studyId: String - <static>+measurementId: String - <static>+interventionId: String - <static>+testAppRoute: String + + + <static>+Study emptyDraft() - - - - - - - - - RouterConf - - + + + + - - - <static>+router: GoRouter - <static>+routes: List<GoRoute> - <static>+publicRoutes: List<GoRoute> - <static>+privateRoutes: List<GoRoute> + + + StudyActionType - - - <static>+GoRoute route() + + + +index: int + <static>+values: List<StudyActionType> + <static>+pin: StudyActionType + <static>+pinoff: StudyActionType + <static>+edit: StudyActionType + <static>+duplicate: StudyActionType + <static>+duplicateDraft: StudyActionType + <static>+addCollaborator: StudyActionType + <static>+export: StudyActionType + <static>+delete: StudyActionType - - - + + + - - - GoRouter + + + Enum - - - - + + + + - - - StudyFormRouteArgs + + + Notifications - - - +studyId: String + + + <static>+credentialsInvalid: SnackbarIntent + <static>+userAlreadyRegistered: SnackbarIntent + <static>+passwordReset: SnackbarIntent + <static>+passwordResetSuccess: SnackbarIntent + <static>+studyDeleted: SnackbarIntent + <static>+inviteCodeDeleted: SnackbarIntent + <static>+inviteCodeClipped: SnackbarIntent + <static>+studyDeleteConfirmation: AlertIntent - - - - + + + + - - - QuestionFormRouteArgs + + + SnackbarIntent - - - +questionId: String + + + +duration: int? - - - + + + + - - - ScreenerQuestionFormRouteArgs + + + AlertIntent + + + + + + +title: String + +dismissOnAction: bool + +isDestructive: dynamic - - - - + + + + - - - ConsentItemFormRouteArgs + + + NotificationDefaultActions - - - +consentId: String + + + <static>+cancel: NotificationAction - - - - + + + + - - - MeasurementFormRouteArgs + + + NotificationAction - - - +measurementId: String + + + +label: String + +onSelect: dynamic Function() + +isDestructive: bool - - - - + + + + - - - SurveyQuestionFormRouteArgs + + + INotificationService - - - +questionId: String + + + +void showMessage() + +void show() + +Stream<NotificationIntent> watchNotifications() + +void dispose() - - - - + + + + + - - - InterventionFormRouteArgs + + + NotificationService - - - +interventionId: String + + + -_streamController: BehaviorSubject<NotificationIntent> - - - - - - - - - InterventionTaskFormRouteArgs + + + +Stream<NotificationIntent> watchNotifications() + +void showMessage() + +void show() + +void dispose() - - - +taskId: String + + + + + + + + BehaviorSubject - - - - + + + + + - - - ReportItemFormRouteArgs + + + NotificationIntent - - - +sectionId: String + + + +message: String? + +customContent: Widget? + +icon: IconData? + +actions: List<NotificationAction>? + +type: NotificationType - - - - - - - - - - JsonFileLoader + + + +void register() - - - +jsonAssetsPath: String - - + + + + - - - +dynamic loadJson() - +dynamic parseJsonMapFromAssets() - +dynamic parseJsonListFromAssets() + + + Widget - - - - - + + + - - - CombinedStreamNotifier + + + IconData - - - -_subscriptions: List<StreamSubscription<dynamic>> + + + + + + + + + NotificationType - - - +void dispose() + + + +index: int + <static>+values: List<NotificationType> + <static>+snackbar: NotificationType + <static>+alert: NotificationType + <static>+custom: NotificationType - - - + + + - - - ChangeNotifier + + + dynamic Function() - - - - + + + + - - - IProviderArgsResolver + + + IClipboardService - - - +R provide() + + + +dynamic copy() - - - - - + + + + - - - SuppressedBehaviorSubject + + + ClipboardService - - - +subject: BehaviorSubject<T> - +didSuppressInitialEvent: bool - -_controller: StreamController<T> + + + +dynamic copy() - - - -StreamController<T> _buildDerivedController() - +dynamic close() + + + + + + + + + NotificationDispatcher - - - - - - - - BehaviorSubject + + + +child: Widget? + +snackbarInnerPadding: double + +snackbarWidth: double? + +snackbarBehavior: SnackBarBehavior + +snackbarDefaultDuration: int - - - + + + - - - StreamController + + + SnackBarBehavior - - - - + + + + - - - Time + + + Assets - - - <static>+dynamic fromTimeOfDay() - +Map<String, dynamic> toJson() - <static>+Time fromJson() + + + <static>+logoWide: String - - - + + + + + - - - TimeOfDay + + + AsyncValueWidget - - - - - - - - - TimeValueAccessor + + + +value: AsyncValue<T> + +data: Widget Function(T) + +error: Widget Function(Object, StackTrace?)? + +loading: Widget Function()? + +empty: Widget Function()? - - - +String modelToViewValue() - +Time? viewToModelValue() - -String _addLeadingZeroIfNeeded() + + + +Widget build() + -Widget _buildDataOrEmptyWidget() + -Widget _defaultError() + -Widget _defaultLoad() - - - + + + - - - ControlValueAccessor + + + AsyncValue - - - - - + + + - - - Tuple + + + Widget Function(T) - - - +first: T1 - +second: T2 - +props: List<Object?> + + + + + + + + Widget Function(Object, StackTrace?)? - - - +Map<String, dynamic> toJson() - <static>+Tuple<dynamic, dynamic> fromJson() - +Tuple<T1, T2> copy() - +Tuple<T1, T2> copyWith() + + + + + + + + Widget Function()? - - - - - + + + + + - - - OptimisticUpdate + + + FormControlLabel - - - +applyOptimistic: void Function() - +apply: dynamic Function() - +rollback: void Function() - +onUpdate: void Function()? - +onError: void Function(Object, StackTrace?)? - +rethrowErrors: bool - +runOptimistically: bool - +completeFutureOptimistically: bool + + + +formControl: AbstractControl<dynamic> + +text: String + +isClickable: bool + +textStyle: TextStyle? + +onClick: void Function(AbstractControl<dynamic>)? - - - +dynamic execute() - -void _runUpdateHandlerIfAny() + + + +Widget build() - - - + + + - - - void Function() + + + AbstractControl - - - + + + - - - dynamic Function() + + + TextStyle - - - + + + - - - void Function()? + + + void Function(AbstractControl<dynamic>)? - - - + + + + + - - - void Function(Object, StackTrace?)? + + + ActionPopUpMenuButton - - - - - - - - - SerializableColor + + + +actions: List<ModelAction<dynamic>> + +triggerIconColor: Color? + +triggerIconColorHover: Color? + +triggerIconSize: double + +disableSplashEffect: bool + +hideOnEmpty: bool + +orientation: Axis + +elevation: double? + +splashRadius: double? + +enabled: bool + +position: PopupMenuPosition - - - +Map<String, dynamic> toJson() - <static>+SerializableColor fromJson() + + + +Widget build() + -Widget _buildPopupMenu() - + - + Color - - - - + + + - - - FileFormatEncoder + + + Axis - - - +dynamic encodeAsync() - +String encode() - +dynamic call() + + + + + + + + PopupMenuPosition - - - - + + + + - - - CSVStringEncoder + + + Search - - - +String encode() + + + +onQueryChanged: dynamic Function(String) + +searchController: SearchController? + +hintText: String? + +initialText: String? - - - - - - - - JsonStringEncoder - - + + + - - - +String encode() + + + dynamic Function(String) - - - - - - - - - NumericalRangeFormatter - - + + + + - - - +min: int? - +max: int? + + + SearchController - - - +TextEditingValue formatEditUpdate() + + + +setText: void Function(String) - - - + + + - - - TextInputFormatter + + + void Function(String) - - - - + + + + - - - StudySequenceFormatter + + + FormScaffold - - - +TextEditingValue formatEditUpdate() + + + +formViewModel: T + +actions: List<Widget>? + +body: Widget + +drawer: Widget? + +actionsSpacing: double + +actionsPadding: double - - - - - - - - - CountWhereValidator - - + + + + + - - - +predicate: bool Function(T?) - +minCount: int? - +maxCount: int? - <static>+kValidationMessageMinCount: String - <static>+kValidationMessageMaxCount: String + + + ConstrainedWidthFlexible - - - +Map<String, dynamic>? validate() + + + +minWidth: double + +maxWidth: double + +flex: int + +flexSum: int + +child: Widget + +outerConstraints: BoxConstraints - - - - - - - - bool Function(T?) + + + +Widget build() + -double _getWidth() - - - + + + - - - Validator + + + BoxConstraints - - - - + + + + - - - Patterns + + + PrimaryButton - - - <static>+timeFormatString: String - <static>+emailFormatString: String - <static>+url: String + + + +text: String + +icon: IconData? + +isLoading: bool + +showLoadingEarliestAfterMs: int + +onPressed: void Function()? + +tooltip: String + +tooltipDisabled: String + +enabled: bool + +onPressedFuture: dynamic Function()? + +innerPadding: EdgeInsets + +minimumSize: Size? + +isDisabled: bool - - - - - + + + - - - ExecutionLimiter + + + void Function()? - - - +milliseconds: int - <static>-_timer: Timer? - - + + + + - - - +void dispose() + + + dynamic Function()? - - - + + + - - - Timer + + + EdgeInsets - - - - - + + + - - - Debouncer + + + Size - - - +leading: bool - +cancelUncompleted: bool - -_uncompletedFutureOperation: CancelableOperation<dynamic>? + + + + + + + + + FormTableRow - - - +dynamic call() + + + +label: String? + +labelBuilder: Widget Function(BuildContext)? + +labelStyle: TextStyle? + +labelHelpText: String? + +input: Widget + +control: AbstractControl<dynamic>? + +layout: FormTableRowLayout? - - - + + + - - - CancelableOperation + + + Widget Function(BuildContext)? - - - - + + + + - - - Throttler + + + FormTableRowLayout - - - +dynamic call() + + + +index: int + <static>+values: List<FormTableRowLayout> + <static>+vertical: FormTableRowLayout + <static>+horizontal: FormTableRowLayout - - - - + + + + + - - - ModelAction + + + FormTableLayout - - - +type: T - +label: String - +icon: IconData? - +onExecute: Function - +isAvailable: bool - +isDestructive: bool + + + +rows: List<FormTableRow> + +columnWidths: Map<int, TableColumnWidth> + +rowDivider: Widget? + +rowLayout: FormTableRowLayout? + +rowLabelStyle: TextStyle? - - - - - - - - IconData + + + +Widget build() - - - - + + + + + - - - IModelActionProvider + + + FormSectionHeader - - - +List<ModelAction<dynamic>> availableActions() + + + +title: String + +titleTextStyle: TextStyle? + +helpText: String? + +divider: bool + +helpTextDisabled: bool + + + + + + +Widget build() - - - - + + + + + - - - IListActionProvider + + + FormLabel + + + + + + +labelText: String? + +helpText: String? + +labelTextStyle: TextStyle? + +layout: FormTableRowLayout? - - - +void onSelectItem() - +void onNewItem() + + + +Widget build() - - - - + + + + + - - - ModelActionType + + + DismissButton - - - +index: int - <static>+values: List<ModelActionType> - <static>+edit: ModelActionType - <static>+delete: ModelActionType - <static>+remove: ModelActionType - <static>+duplicate: ModelActionType - <static>+clipboard: ModelActionType - <static>+primary: ModelActionType + + + +onPressed: void Function()? + +text: String? + + + + + + +Widget build() - - - - + + + + + - - - Config + + + Badge - - - <static>+isDebugMode: bool - <static>+defaultLocale: Set<String> - <static>+supportedLocales: Map<String, String> - <static>+newStudyId: String - <static>+newModelId: String - <static>+minSplashTime: int - <static>+formAutosaveDebounce: int + + + +icon: IconData? + +color: Color? + +borderRadius: double + +label: String + +type: BadgeType + +padding: EdgeInsets + +iconSize: double? + +labelStyle: TextStyle? + +center: bool - - - - - - - - - - IAuthRepository + + + +Widget build() + -Color? _getBackgroundColor() + -Color _getBorderColor() + -Color? _getLabelColor() - - - +allowPasswordReset: bool - +currentUser: User? - +isLoggedIn: bool - +session: Session? - +serializedSession: String? + + + + + + + + + BadgeType - - - +dynamic signUp() - +dynamic signInWith() - +dynamic signOut() - +dynamic resetPasswordForEmail() - +dynamic updateUser() - +void dispose() + + + +index: int + <static>+values: List<BadgeType> + <static>+filled: BadgeType + <static>+outlined: BadgeType + <static>+outlineFill: BadgeType + <static>+plain: BadgeType - - - + + + + + - - - User + + + StandardDialog - - - - + + + +title: Widget? + +titleText: String? + +body: Widget + +actionButtons: List<Widget> + +backgroundColor: Color? + +borderRadius: double? + +width: double? + +height: double? + +minWidth: double + +minHeight: double + +maxWidth: double? + +maxHeight: double? + +padding: EdgeInsets + + - - - Session + + + +Widget build() - - - - + + + + - - - IAppDelegate + + + ISyncIndicatorViewModel - - - +dynamic onAppStart() + + + +isDirty: bool + +lastSynced: DateTime? - - - - - - - - - AuthRepository - - + + + + - - - +supabaseClient: SupabaseClient - +allowPasswordReset: bool - +authClient: GoTrueClient - +session: Session? - +serializedSession: String? - +currentUser: User? - +isLoggedIn: bool + + + SyncIndicator - - - -void _registerAuthListener() - +dynamic signUp() - +dynamic signInWith() - +dynamic signOut() - +dynamic resetPasswordForEmail() - +dynamic updateUser() - +void dispose() - +dynamic onAppStart() + + + +state: AsyncValue<T> + +lastSynced: DateTime? + +isDirty: bool + +animationDuration: int + +iconSize: double - - - + + + + - - - SupabaseClient + + + IWithBanner - - - - - - - - GoTrueClient + + + +Widget? banner() - - - - + + + + - - - IInviteCodeRepository + + + BannerBox - - - +dynamic isCodeAlreadyUsed() + + + +prefixIcon: Widget? + +body: Widget + +style: BannerStyle + +padding: EdgeInsets? + +noPrefix: bool + +dismissable: bool + +isDismissed: bool? + +onDismissed: dynamic Function()? + +dismissIconSize: double - - - - - + + + + - - - ModelRepository + + + BannerStyle - - - +delegate: IModelRepositoryDelegate<T> - -_allModelsStreamController: BehaviorSubject<List<WrappedModel<T>>> - -_allModelEventsStreamController: BehaviorSubject<ModelEvent<T>> - +modelStreamControllers: Map<String, BehaviorSubject<WrappedModel<T>>> - +modelEventsStreamControllers: Map<String, BehaviorSubject<ModelEvent<T>>> - -_allModels: Map<String, WrappedModel<T>> + + + +index: int + <static>+values: List<BannerStyle> + <static>+warning: BannerStyle + <static>+info: BannerStyle + <static>+error: BannerStyle - - - +WrappedModel<T>? get() - +dynamic fetchAll() - +dynamic fetch() - +dynamic save() - +dynamic delete() - +dynamic duplicateAndSave() - +dynamic duplicateAndSaveFromRemote() - +Stream<List<WrappedModel<T>>> watchAll() - +Stream<WrappedModel<T>> watch() - +Stream<ModelEvent<T>> watchAllChanges() - +Stream<ModelEvent<T>> watchChanges() - -dynamic _buildModelSpecificController() - +dynamic ensurePersisted() - +WrappedModel<T> upsertLocally() - +List<WrappedModel<T>> upsertAllLocally() - +dynamic emitUpdate() - +dynamic emitModelEvent() - +dynamic emitError() - +void dispose() - +List<ModelAction<dynamic>> availableActions() + + + + + + + + + + ActionMenuInline + + + + + + +actions: List<ModelAction<dynamic>> + +iconSize: double? + +visible: bool + +splashRadius: double? + +paddingVertical: double? + +paddingHorizontal: double? + + + + + + +Widget build() - - - - - + + + + - - - InviteCodeRepository + + + Collapsible - - - +studyId: String - +ref: ProviderRef<dynamic> - +apiClient: StudyUApi - +authRepository: IAuthRepository - +studyRepository: IStudyRepository - +study: Study + + + +contentBuilder: Widget Function(BuildContext, bool) + +headerBuilder: Widget Function(BuildContext, bool)? + +title: String? + +isCollapsed: bool - - - +String getKey() - +dynamic isCodeAlreadyUsed() - +List<ModelAction<dynamic>> availableActions() - +dynamic emitUpdate() + + + + + + + + Widget Function(BuildContext, bool) - - - + + + - - - ProviderRef + + + Widget Function(BuildContext, bool)? - - - - + + + + - - - StudyUApi + + + NavbarTab - - - +dynamic saveStudy() - +dynamic fetchStudy() - +dynamic getUserStudies() - +dynamic deleteStudy() - +dynamic saveStudyInvite() - +dynamic fetchStudyInvite() - +dynamic deleteStudyInvite() - +dynamic deleteParticipants() - +dynamic fetchAppConfig() - +dynamic fetchUser() - +dynamic saveUser() + + + +title: String + +intent: RoutingIntent? + +index: int + +enabled: bool - - - - + + + + + - - - IStudyRepository + + + RoutingIntent - - - +dynamic launch() - +dynamic deleteParticipants() + + + +route: GoRoute + +params: Map<String, String> + +queryParams: Map<String, String> + +dispatch: RoutingIntentDispatch? + +extra: Object? + +routeName: String + +arguments: Map<String, String> + +props: List<Object?> + + + + + + -dynamic _validateRoute() + +bool matches() - - - + + + + - - - Study + + + TabbedNavbar + + + + + + +tabs: List<T> + +selectedTab: T? + +indicator: BoxDecoration? + +height: double? + +disabledBackgroundColor: Color? + +disabledTooltipText: String? + +onSelect: void Function(int, T)? + +labelPadding: EdgeInsets? + +labelSpacing: double? + +indicatorSize: TabBarIndicatorSize? + +isScrollable: bool + +backgroundColor: Color? + +labelColorHover: Color? + +unselectedLabelColorHover: Color? - - - - - + + + - - - InviteCodeRepositoryDelegate + + + BoxDecoration - - - +study: Study - +apiClient: StudyUApi - +studyRepository: IStudyRepository + + + + + + + + void Function(int, T)? - - - +dynamic fetch() - +dynamic fetchAll() - +dynamic save() - +dynamic delete() - +dynamic onError() - +StudyInvite createDuplicate() - +StudyInvite createNewInstance() + + + + + + + + TabBarIndicatorSize - - - - + + + + - - - IModelRepositoryDelegate + + + SidesheetTab - - - +dynamic fetchAll() - +dynamic fetch() - +dynamic save() - +dynamic delete() - +T createNewInstance() - +T createDuplicate() - +dynamic onError() + + + +builder: Widget Function(BuildContext) - - - + + + - - - StudyLaunched + + + Widget Function(BuildContext) - - - - + + + + - - - ModelEvent + + + Sidesheet - - - +modelId: String - +model: T + + + <static>+kDefaultWidth: double + +titleText: String + +body: Widget? + +tabs: List<SidesheetTab>? + +actionButtons: List<Widget>? + +width: double? + +withCloseButton: bool + +ignoreAppBar: bool + +collapseSingleTab: bool + +bodyPadding: EdgeInsets? + +wrapContent: Widget Function(Widget)? - - - - - + + + - - - WrappedModel + + + Widget Function(Widget)? - - - -_model: T - +asyncValue: AsyncValue<T> - +isLocalOnly: bool - +isDirty: bool - +isDeleted: bool - +lastSaved: DateTime? - +lastFetched: DateTime? - +lastUpdated: DateTime? - +model: T + + + + + + + + + FormSideSheetTab - - - +dynamic markWithError() - +dynamic markAsLoading() - +dynamic markAsFetched() - +dynamic markAsSaved() + + + +formViewBuilder: Widget Function(T) - - - + + + + + - - - AsyncValue + + + HelpIcon + + + + + + +tooltipText: String? - - - - - - - - ModelRepositoryException + + + +Widget build() - - - + + + + + - - - Exception + + + EmptyBody - - - - + + + +icon: IconData? + +leading: Widget? + +leadingSpacing: double? + +title: String? + +description: String? + +button: Widget? + + - - - ModelNotFoundException + + + +Widget build() - - - - + + + + + - - - IModelRepository + + + IndicatorRangeSliderThumbShape - - - +String getKey() - +WrappedModel<T>? get() - +dynamic fetchAll() - +dynamic fetch() - +dynamic save() - +dynamic delete() - +dynamic duplicateAndSave() - +dynamic duplicateAndSaveFromRemote() - +Stream<WrappedModel<T>> watch() - +Stream<List<WrappedModel<T>>> watchAll() - +Stream<ModelEvent<T>> watchChanges() - +Stream<ModelEvent<T>> watchAllChanges() - +dynamic ensurePersisted() - +void dispose() + + + +buildContext: BuildContext + +start: T + +end: T - - - - - - - - APIException + + + +Size getPreferredSize() + +void paint() - - - + + + - - - StudyNotFoundException + + + BuildContext - - - + + + - - - MeasurementNotFoundException + + + RangeSliderThumbShape - - - + + + + - - - QuestionNotFoundException + + + MouseEventsRegion - - - - - - - - ConsentItemNotFoundException + + + +onTap: void Function()? + +onHover: void Function(PointerHoverEvent)? + +onEnter: void Function(PointerEnterEvent)? + +onExit: void Function(PointerExitEvent)? + +autoselectCursor: bool + +cursor: SystemMouseCursor + <static>+defaultCursor: SystemMouseCursor + +autoCursor: SystemMouseCursor - - - + + + - - - InterventionNotFoundException + + + void Function(PointerHoverEvent)? - - - + + + - - - InterventionTaskNotFoundException + + + void Function(PointerEnterEvent)? - - - + + + - - - ReportNotFoundException + + + void Function(PointerExitEvent)? - - - + + + - - - ReportSectionNotFoundException + + + SystemMouseCursor - - - + + + - - - StudyInviteNotFoundException + + + ReactiveCustomColorPicker - - - + + + - - - UserNotFoundException + + + ReactiveFormField - - - - - + + + + + - - - StudyUApiClient + + + TextParagraph - - - +supabaseClient: SupabaseClient - <static>+studyColumns: List<String> - <static>+studyWithParticipantActivityColumns: List<String> - +testDelayMilliseconds: int + + + +text: String? + +style: TextStyle? + +selectable: bool + +span: List<TextSpan>? - - - +dynamic deleteParticipants() - +dynamic getUserStudies() - +dynamic fetchStudy() - +dynamic deleteStudy() - +dynamic saveStudy() - +dynamic fetchStudyInvite() - +dynamic saveStudyInvite() - +dynamic deleteStudyInvite() - +dynamic fetchAppConfig() - +dynamic fetchUser() - +dynamic saveUser() - -dynamic _awaitGuarded() - -dynamic _apiException() - -dynamic _testDelay() + + + +Widget build() - - - - + + + + - - - SupabaseClientDependant + + + UnderConstruction - - - +supabaseClient: SupabaseClient + + + +Widget build() - - - - + + + - - - SupabaseQueryMixin + + + NullHelperDecoration - - - +dynamic deleteAll() - +dynamic getAll() - +dynamic getById() - +dynamic getByColumn() - +List<T> deserializeList() - +T deserializeObject() + + + + + + + + InputDecoration - - - + + + + - - - IsFetched + + + ActionMenuType - - - - - - - - IsSaving + + + +index: int + <static>+values: List<ActionMenuType> + <static>+inline: ActionMenuType + <static>+popup: ActionMenuType - - - + + + + + - - - IsSaved + + + HtmlStylingBanner - - - - + + + +isDismissed: bool + +onDismissed: dynamic Function()? + + - - - IsDeleted + + + +Widget build() - - - - + + + + - - - SupabaseQueryError + + + FormConsumerWidget - - - +statusCode: String? - +message: String - +details: dynamic + + + +Widget build() - - - - - - - - - StudyRepository - - + + + + - - - +apiClient: StudyUApi - +authRepository: IAuthRepository - +ref: ProviderRef<dynamic> - +sortCallback: void Function()? + + + FormConsumerRefWidget - - - +String getKey() - +dynamic deleteParticipants() - +dynamic launch() - +List<ModelAction<dynamic>> availableActions() + + + +Widget build() - - - - - - - - - StudyRepositoryDelegate - - + + + + - - - +apiClient: StudyUApi - +authRepository: IAuthRepository + + + SplashPage - - - +dynamic fetchAll() - +dynamic fetch() - +dynamic save() - +dynamic delete() - +dynamic onError() - +Study createNewInstance() - +Study createDuplicate() + + + +Widget build() - - - - - + + + + + - - - IUserRepository + + + ErrorPage - - - +user: StudyUUser + + + +error: Exception? - - - +dynamic fetchUser() - +dynamic saveUser() - +dynamic updatePreferences() + + + +Widget build() - - - + + + - - - StudyUUser + + + ConsumerWidget - - - - - + + + + + - - - UserRepository + + + StudyULogo - - - +apiClient: StudyUApi - +authRepository: IAuthRepository - +ref: Ref<Object?> - +user: StudyUUser + + + +onTap: void Function()? - - - +dynamic fetchUser() - +dynamic saveUser() - +dynamic updatePreferences() + + + +Widget build() - - - + + + + + - - - Ref + + + SingleColumnLayout - - - - - - - - - PreferenceAction + + + <static>+defaultConstraints: BoxConstraints + <static>+defaultConstraintsNarrow: BoxConstraints + +body: Widget + +header: Widget? + +stickyHeader: bool + +constraints: BoxConstraints? + +scroll: bool + +padding: EdgeInsets? - - - +index: int - <static>+values: List<PreferenceAction> - <static>+pin: PreferenceAction - <static>+pinOff: PreferenceAction + + + <static>+dynamic fromType() - - - - + + + + - - - IAppRepository + + + SingleColumnLayoutType - - - +dynamic fetchAppConfig() - +void dispose() + + + +index: int + <static>+values: List<SingleColumnLayoutType> + <static>+boundedWide: SingleColumnLayoutType + <static>+boundedNarrow: SingleColumnLayoutType + <static>+stretched: SingleColumnLayoutType + <static>+split: SingleColumnLayoutType - - - - - - - - - AppRepository - - + + + + - - - +apiClient: StudyUApi + + + Hyperlink - - - +dynamic fetchAppConfig() - +void dispose() + + + +text: String + +url: String? + +onClick: void Function()? + +linkColor: Color + +hoverColor: Color? + +visitedColor: Color? + +style: TextStyle? + +hoverStyle: TextStyle? + +visitedStyle: TextStyle? + +icon: IconData? + +iconSize: double? - - - - - + + + + - - - WebFrame + + + StandardTableColumn - - - +previewSrc: String - +studyId: String + + + +label: String + +tooltip: String? + +columnWidth: TableColumnWidth + +sortable: bool + +sortAscending: bool? + +sortableIcon: Widget? - - - +Widget build() + + + + + + + + TableColumnWidth - - - - + + + + - - - DisabledFrame + + + StandardTable - - - +Widget build() + + + +items: List<T> + +inputColumns: List<StandardTableColumn> + +onSelectItem: void Function(T) + +trailingActionsAt: List<ModelAction<dynamic>> Function(T, int)? + +trailingActionsMenuType: ActionMenuType? + +sortColumnPredicates: List<int Function(T, T)?>? + +pinnedPredicates: int Function(T, T)? + +headerRowBuilder: TableRow Function(BuildContext, List<StandardTableColumn>)? + +dataRowBuilder: TableRow Function(BuildContext, List<StandardTableColumn>)? + +inputTrailingActionsColumn: StandardTableColumn + +tableWrapper: Widget Function(Widget)? + +cellSpacing: double + +rowSpacing: double + +minRowHeight: double? + +showTableHeader: bool + +hideLeadingTrailingWhenEmpty: bool + +leadingWidget: Widget? + +trailingWidget: Widget? + +leadingWidgetSpacing: double? + +trailingWidgetSpacing: double? + +emptyWidget: Widget? + +rowStyle: StandardTableStyle + +disableRowInteractions: bool + + + + + + + + + + + void Function(T) - - - - - + + + - - - PhoneContainer + + + List<ModelAction<dynamic>> Function(T, int)? - - - <static>+defaultWidth: double - <static>+defaultHeight: double - +width: double - +height: double - +borderColor: Color - +borderWidth: double - +borderRadius: double - +innerContent: Widget - +innerContentBackgroundColor: Color? - - + + + + - - - +Widget build() + + + int Function(T, T)? - - - + + + - - - Widget + + + TableRow Function(BuildContext, List<StandardTableColumn>)? - - - - + + + + - - - MobileFrame + + + StandardTableStyle - - - +Widget build() + + + +index: int + <static>+values: List<StandardTableStyle> + <static>+plain: StandardTableStyle + <static>+material: StandardTableStyle - - - - + + + + + - - - DesktopFrame + + + IconPack - - - +Widget build() + + + <static>+defaultPack: List<IconOption> + <static>+material: List<IconOption> + + + + + + <static>+IconOption? resolveIconByName() - - - - - + + + + + - - - StudyController + + + IconOption - - - +notificationService: INotificationService - +studyEventsSubscription: StreamSubscription<ModelEvent<Study>>? - +studyActions: List<ModelAction<dynamic>> + + + +name: String + +icon: IconData? + +isEmpty: bool + +props: List<Object?> - - - +dynamic syncStudyStatus() - +dynamic onStudySubscriptionUpdate() - -dynamic _redirectNewToActualStudyID() - +dynamic publishStudy() - +void onChangeStudyParticipation() - +void onAddParticipants() - +void onSettingsPressed() - +void dispose() + + + +String toJson() + <static>+IconOption fromJson() - - - - + + + - - - INotificationService + + + Equatable - - - +void showMessage() - +void show() - +Stream<NotificationIntent> watchNotifications() - +void dispose() + + + + + + + + ReactiveIconPicker - - - + + + - - - StreamSubscription + + + ReactiveFocusableFormField - - - - - + + + + + - - - StudyBaseController + + + IconPicker - - - +studyId: String - +studyRepository: IStudyRepository - +router: GoRouter - +studySubscription: StreamSubscription<WrappedModel<Study>>? + + + +iconOptions: List<IconOption> + +selectedOption: IconOption? + +onSelect: void Function(IconOption)? + +galleryIconSize: double? + +selectedIconSize: double? + +focusNode: FocusNode? + +isDisabled: bool - - - +dynamic subscribeStudy() - +dynamic onStudySubscriptionUpdate() - +dynamic onStudySubscriptionError() - +void dispose() + + + +Widget build() - - - - + + + - - - IStudyAppBarViewModel + + + void Function(IconOption)? - - - +isSyncIndicatorVisible: bool - +isStatusBadgeVisible: bool - +isPublishVisible: bool + + + + + + + + FocusNode - - - - + + + + + - - - IStudyStatusBadgeViewModel + + + IconPickerField - - - +studyParticipation: Participation? - +studyStatus: StudyStatus? + + + +iconOptions: List<IconOption> + +selectedOption: IconOption? + +selectedIconSize: double? + +galleryIconSize: double? + +onSelect: void Function(IconOption)? + +focusNode: FocusNode? + +isDisabled: bool - - - - - - - - - IStudyNavViewModel + + + +Widget build() - - - +isEditTabEnabled: bool - +isTestTabEnabled: bool - +isRecruitTabEnabled: bool - +isMonitorTabEnabled: bool - +isAnalyzeTabEnabled: bool - +isSettingsEnabled: bool + + + + + + + + + + IconPickerGallery - - - - - - - - - StudyScaffold + + + +iconOptions: List<IconOption> + +onSelect: void Function(IconOption)? + +iconSize: double - - - +studyId: String - +tabs: List<NavbarTab>? - +tabsSubnav: List<NavbarTab>? - +selectedTab: NavbarTab? - +selectedTabSubnav: NavbarTab? - +body: StudyPageWidget - +drawer: Widget? - +disableActions: bool - +actionsSpacing: double - +actionsPadding: double - +layoutType: SingleColumnLayoutType? - +appbarHeight: double - +appbarSubnavHeight: double + + + +Widget build() - - - - + + + + + - - - NavbarTab + + + SecondaryButton - - - +title: String - +intent: RoutingIntent? - +index: int - +enabled: bool + + + +text: String + +icon: IconData? + +isLoading: bool + +onPressed: void Function()? + + + + + + +Widget build() - - - - - + + + + - - - StudyPageWidget + + + TwoColumnLayout - - - +studyId: String + + + <static>+defaultDivider: VerticalDivider + <static>+defaultContentPadding: EdgeInsets + <static>+slimContentPadding: EdgeInsets + +leftWidget: Widget + +rightWidget: Widget + +dividerWidget: Widget? + +headerWidget: Widget? + +flexLeft: int? + +flexRight: int? + +constraintsLeft: BoxConstraints? + +constraintsRight: BoxConstraints? + +scrollLeft: bool + +scrollRight: bool + +paddingLeft: EdgeInsets? + +paddingRight: EdgeInsets? + +backgroundColorLeft: Color? + +backgroundColorRight: Color? + +stretchHeight: bool - - - +Widget? banner() + + + + + + + + VerticalDivider - - - - + + + + - - - SingleColumnLayoutType + + + AppTranslation - - - +index: int - <static>+values: List<SingleColumnLayoutType> - <static>+boundedWide: SingleColumnLayoutType - <static>+boundedNarrow: SingleColumnLayoutType - <static>+stretched: SingleColumnLayoutType - <static>+split: SingleColumnLayoutType + + + <static>+dynamic init() - - - - + + + + - - - PreviewFrame + + + PlatformLocale - - - +studyId: String - +routeArgs: StudyFormRouteArgs? - +route: String? + + + +Locale getPlatformLocale() - - - - - - - - - RouteInformation - - + + + + - - - +route: String? - +extra: String? - +cmd: String? - +data: String? + + + PlatformLocaleWeb - - - +String toString() + + + +Locale getPlatformLocale() - - - - - + + + + - - - PlatformController + + + PlatformLocaleMobile - - - +studyId: String - +baseSrc: String - +previewSrc: String - +routeInformation: RouteInformation - +frameWidget: Widget + + + +Locale getPlatformLocale() - - - +void activate() - +void registerViews() - +void generateUrl() - +void navigate() - +void refresh() - +void listen() - +void send() - +void openNewPage() + + + + + + + + + LanguagePicker - - - - - - - - - - WebController + + + +languagePickerType: LanguagePickerType + +iconColor: Color? + +offset: Offset? - - - +iFrameElement: IFrameElement + + + + + + + + + LanguagePickerType - - - +void activate() - +void registerViews() - +void generateUrl() - +void navigate() - +void refresh() - +void openNewPage() - +void listen() - +void send() + + + +index: int + <static>+values: List<LanguagePickerType> + <static>+field: LanguagePickerType + <static>+icon: LanguagePickerType - - - + + + - - - IFrameElement + + + Offset - - - - + + + + - - - MobileController + + + GoRouteParamEnum - - - +void openNewPage() - +void refresh() - +void registerViews() - +void listen() - +void send() - +void navigate() - +void activate() - +void generateUrl() + + + +String toRouteParam() + +String toShortString() - - - - - - - - - StudyParticipationBadge - - + + + + - - - +participation: Participation - +type: BadgeType - +showPrefixIcon: bool - +center: bool + + + RoutingIntents - - - +Widget build() + + + <static>+root: RoutingIntent + <static>+studies: RoutingIntent + <static>+studiesShared: RoutingIntent + <static>+publicRegistry: RoutingIntent + <static>+study: RoutingIntent Function(String) + <static>+studyEdit: RoutingIntent Function(String) + <static>+studyEditInfo: RoutingIntent Function(String) + <static>+studyEditEnrollment: RoutingIntent Function(String) + <static>+studyEditInterventions: RoutingIntent Function(String) + <static>+studyEditIntervention: RoutingIntent Function(String, String) + <static>+studyEditMeasurements: RoutingIntent Function(String) + <static>+studyEditReports: RoutingIntent Function(String) + <static>+studyEditMeasurement: RoutingIntent Function(String, String) + <static>+studyTest: RoutingIntent Function(String, {String? appRoute}) + <static>+studyRecruit: RoutingIntent Function(String) + <static>+studyMonitor: RoutingIntent Function(String) + <static>+studyAnalyze: RoutingIntent Function(String) + <static>+studySettings: RoutingIntent Function(String) + <static>+accountSettings: RoutingIntent + <static>+studyNew: RoutingIntent + <static>+login: RoutingIntent + <static>+signup: RoutingIntent + <static>+passwordForgot: RoutingIntent + <static>+passwordForgot2: RoutingIntent Function(String) + <static>+passwordRecovery: RoutingIntent + <static>+error: RoutingIntent Function(Exception) - - - + + + - - - Participation + + + RoutingIntent Function(String) - - - - - - - - BadgeType - - + + + - - - +index: int - <static>+values: List<BadgeType> - <static>+filled: BadgeType - <static>+outlined: BadgeType - <static>+outlineFill: BadgeType - <static>+plain: BadgeType + + + RoutingIntent Function(String, String) - - - - - + + + - - - StudyTestScreen + + + RoutingIntent Function(String, {String? appRoute}) - - - +previewRoute: String? + + + + + + + + RoutingIntent Function(Exception) - - - +Widget build() - +Widget? banner() - +dynamic load() - +dynamic save() - +dynamic showHelp() + + + + + + + + GoRoute - - - - + + + + - - - TestAppRoutes + + + RoutingIntentDispatch - - - <static>+studyOverview: String - <static>+eligibility: String - <static>+intervention: String - <static>+consent: String - <static>+journey: String - <static>+dashboard: String + + + +index: int + <static>+values: List<RoutingIntentDispatch> + <static>+go: RoutingIntentDispatch + <static>+push: RoutingIntentDispatch - - - - + + + + - - - StudyNav + + + RouterKeys - - - <static>+dynamic tabs() - <static>+dynamic edit() - <static>+dynamic test() - <static>+dynamic recruit() - <static>+dynamic monitor() - <static>+dynamic analyze() + + + <static>+studyKey: ValueKey<String> + <static>+authKey: ValueKey<String> - - - - - - - - StudyDesignNav - - + + + - - - <static>+dynamic tabs() - <static>+dynamic info() - <static>+dynamic enrollment() - <static>+dynamic interventions() - <static>+dynamic measurements() - <static>+dynamic reports() + + + ValueKey - - - - + + + + - - - StudyTestController + + + RouteParams - - - +authRepository: IAuthRepository - +languageCode: String + + + <static>+studiesFilter: String + <static>+studyId: String + <static>+measurementId: String + <static>+interventionId: String + <static>+testAppRoute: String - - - + + + + + - - - StudyStatus + + + RouterConf - - - - - - - - - - StudyStatusBadge + + + <static>+router: GoRouter + <static>+routes: List<GoRoute> + <static>+publicRoutes: List<GoRoute> + <static>+privateRoutes: List<GoRoute> - - - +participation: Participation? - +status: StudyStatus? - +type: BadgeType - +showPrefixIcon: bool - +showTooltip: bool + + + <static>+GoRoute route() - - - +Widget build() + + + + + + + + GoRouter - - - - - + + + + - - - FrameControlsWidget + + + StudyFormRouteArgs - - - +onRefresh: void Function()? - +onOpenNewTab: void Function()? - +enabled: bool + + + +studyId: String - - - +Widget build() + + + + + + + + + QuestionFormRouteArgs + + + + + + +questionId: String - - - + + + - - - ConsumerWidget + + + ScreenerQuestionFormRouteArgs - - - - + + + + - - - StudySettingsDialog + + + ConsentItemFormRouteArgs - - - +Widget build() + + + +consentId: String - - - - - - - - - StudySettingsFormViewModel - - + + + + - - - +study: AsyncValue<Study> - +studyRepository: IStudyRepository - <static>+defaultPublishedToRegistry: bool - <static>+defaultPublishedToRegistryResults: bool - +isPublishedToRegistryControl: FormControl<bool> - +isPublishedToRegistryResultsControl: FormControl<bool> - +form: FormGroup - +titles: Map<FormMode, String> + + + MeasurementFormRouteArgs - - - +void setControlsFrom() - +Study buildFormData() - +dynamic keepControlsSynced() - +dynamic save() - +dynamic setLaunchDefaults() + + + +measurementId: String - - - + + + + - - - FormControl + + + SurveyQuestionFormRouteArgs - - - - - - - - FormGroup + + + +questionId: String - - - - - + + + + - - - FormViewModel + + + InterventionFormRouteArgs - - - -_formData: T? - -_formMode: FormMode - -_validationSet: FormValidationSetEnum? - +delegate: IFormViewModelDelegate<FormViewModel<dynamic>>? - +autosave: bool - -_immediateFormChildrenSubscriptions: List<StreamSubscription<dynamic>> - -_immediateFormChildrenListenerDebouncer: Debouncer? - -_autosaveOperation: CancelableOperation<dynamic>? - -_defaultControlValidators: Map<String, Tuple<List<Validator<dynamic>>, List<AsyncValidator<dynamic>>>> - +prevFormValue: Map<String, dynamic>? - <static>-_formKey: String - +formData: T? - +formMode: FormMode - +isReadonly: bool - +validationSet: FormValidationSetEnum? - +isDirty: bool - +title: String - +isValid: bool - +titles: Map<FormMode, String> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + + + +interventionId: String - - - -dynamic _setFormData() - -dynamic _rememberDefaultControlValidators() - -Tuple<List<Validator<dynamic>>, List<AsyncValidator<dynamic>>>? _getDefaultValidators() - -dynamic _disableAllControls() - -dynamic _formModeUpdated() - -dynamic _restoreControlsFromFormData() - +void revalidate() - -void _applyValidationSet() - +void read() - +dynamic save() - +dynamic cancel() - +void enableAutosave() - +void listenToImmediateFormChildren() - +dynamic markFormGroupChanged() - +void dispose() - +void setControlsFrom() - +T buildFormData() - +void initControls() + + + + + + + + + InterventionTaskFormRouteArgs + + + + + + +taskId: String - - - - + + + + - - - IWithBanner + + + ReportItemFormRouteArgs - - - +Widget? banner() + + + +sectionId: String - - - - + + + + - - - AppStatus + + + DropdownMenuItemTheme - - - +index: int - <static>+values: List<AppStatus> - <static>+initializing: AppStatus - <static>+initialized: AppStatus + + + +iconTheme: IconThemeData? - - - - - + + + - - - AppController + + + IconThemeData - - - +appDelegates: List<IAppDelegate> - -_delayedFuture: dynamic - +isInitialized: dynamic + + + + + + + + Diagnosticable - - - +dynamic onAppStart() - -dynamic _callDelegates() + + + + + + + + + + ThemeConfig - - - - + + + <static>+kMinContentWidth: double + <static>+kMaxContentWidth: double + <static>+kHoverFadeFactor: double + <static>+kMuteFadeFactor: double + + - - - App + + + <static>+dynamic bodyBackgroundColor() + <static>+Color modalBarrierColor() + <static>+Color containerColor() + <static>+Color colorPickerInitialColor() + <static>+TextStyle bodyTextMuted() + <static>+TextStyle bodyTextBackground() + <static>+double iconSplashRadius() + <static>+Color sidesheetBackgroundColor() + <static>+InputDecorationTheme dropdownInputDecorationTheme() + <static>+DropdownMenuItemTheme dropdownMenuItemTheme() - - - + + + + - - - AppContent + + + NoAnimationPageTransitionsBuilder + + + + + + +Widget buildTransitions() - - - - - + + + - - - AuthFormController + + + PageTransitionsBuilder - - - +authRepository: IAuthRepository - +notificationService: INotificationService - +router: GoRouter - +emailControl: FormControl<String> - +passwordControl: FormControl<String> - +passwordConfirmationControl: FormControl<String> - +termsOfServiceControl: FormControl<bool> - <static>+authValidationMessages: Map<String, String Function(dynamic)> - +loginForm: FormGroup - +signupForm: FormGroup - +passwordForgotForm: FormGroup - +passwordRecoveryForm: FormGroup - +controlValidatorsByForm: Map<AuthFormKey, Map<FormControl<dynamic>, List<Validator<dynamic>>>> - -_formKey: AuthFormKey - +formKey: AuthFormKey - +form: FormGroup + + + + + + + + + WebTransitionBuilder - - - -dynamic _getFormFor() - -dynamic _onChangeFormKey() - +dynamic resetControlsFor() - -dynamic _forceValidationMessages() - +dynamic signUp() - -dynamic _signUp() - +dynamic signIn() - -dynamic _signInWith() - +dynamic signOut() - +dynamic resetPasswordForEmail() - +dynamic sendPasswordResetLink() - +dynamic recoverPassword() - +dynamic updateUser() - -dynamic _readDebugUser() + + + +Widget buildTransitions() - - - - + + + + - - - AuthFormKey + + + ThemeSettingChange - - - +index: int - <static>+values: List<AuthFormKey> - <static>+login: AuthFormKey - <static>+signup: AuthFormKey - <static>+passwordForgot: AuthFormKey - <static>+passwordRecovery: AuthFormKey - <static>-_loginSubmit: AuthFormKey - <static>-_signupSubmit: AuthFormKey + + + +settings: ThemeSettings - - - - + + + + - - - IFormGroupController + + + ThemeSettings - - - +form: FormGroup + + + +sourceColor: Color + +themeMode: ThemeMode - - - - - + + + - - - PasswordRecoveryForm + + + Notification - - - +formKey: AuthFormKey + + + + + + + + + + ThemeProvider + + + + + + +settings: ValueNotifier<ThemeSettings> + +lightDynamic: ColorScheme? + +darkDynamic: ColorScheme? + +pageTransitionsTheme: PageTransitionsTheme + +shapeMedium: ShapeBorder + + + + + + +Color custom() + +Color blend() + +Color source() + +ColorScheme colors() + +CardTheme cardTheme() + +ListTileThemeData listTileTheme() + +AppBarTheme appBarTheme() + +SnackBarThemeData snackBarThemeData() + +TabBarTheme tabBarTheme() + +BottomAppBarTheme bottomAppBarTheme() + +BottomNavigationBarThemeData bottomNavigationBarTheme() + +SwitchThemeData switchTheme() + +InputDecorationTheme inputDecorationTheme() + +TextTheme textTheme() + +DividerThemeData dividerTheme() + +NavigationRailThemeData navigationRailTheme() + +DrawerThemeData drawerTheme() + +IconThemeData iconTheme() + +CheckboxThemeData checkboxTheme() + +RadioThemeData radioTheme() + +TooltipThemeData tooltipTheme() + +ThemeData light() + +ThemeData dark() + +ThemeMode themeMode() + +ThemeData theme() + <static>+ThemeProvider of() + +bool updateShouldNotify() - - - +Widget build() + + + + + + + + ValueNotifier - - - - + + + - - - FormConsumerRefWidget + + + ColorScheme - - - +Widget build() + + + + + + + + PageTransitionsTheme - - - - - + + + - - - PasswordForgotForm + + + ShapeBorder - - - +formKey: AuthFormKey + + + + + + + + InheritedWidget - - - +Widget build() + + + + + + + + ThemeMode - - - - - + + + + + - - - LoginForm + + + CustomColor - - - +formKey: AuthFormKey + + + +name: String + +color: Color + +blend: bool - - - +Widget build() + + + +Color value() - - - - - - - - EmailTextField - - + + + + + - - - +labelText: String - +hintText: String? - +formControlName: String? - +formControl: FormControl<dynamic>? + + + SuppressedBehaviorSubject - - - - - - - - - PasswordTextField + + + +subject: BehaviorSubject<T> + +didSuppressInitialEvent: bool + -_controller: StreamController<T> - - - +labelText: String - +hintText: String? - +onSubmitted: dynamic Function(FormControl<dynamic>)? - +formControlName: String? - +formControl: FormControl<dynamic>? + + + -StreamController<T> _buildDerivedController() + +dynamic close() - - - + + + - - - dynamic Function(FormControl<dynamic>)? + + + StreamController - - - - - + + + + - - - SignupForm + + + Time - - - +formKey: AuthFormKey + + + <static>+dynamic fromTimeOfDay() + +Map<String, dynamic> toJson() + <static>+Time fromJson() - - - +Widget build() - -dynamic _onClickTermsOfUse() - -dynamic _onClickPrivacyPolicy() + + + + + + + + TimeOfDay - - - - + + + + - - - StudyUJobsToBeDone + + + TimeValueAccessor - - - +Widget build() + + + +String modelToViewValue() + +Time? viewToModelValue() + -String _addLeadingZeroIfNeeded() - - - - + + + - - - AuthScaffold + + + ControlValueAccessor - - - +body: Widget - +formKey: AuthFormKey - +leftContentMinWidth: double - +leftPanelMinWidth: double - +leftPanelPadding: EdgeInsets + + + + + + + + + ModelAction - - - - - - - - EdgeInsets + + + +type: T + +label: String + +icon: IconData? + +onExecute: Function + +isAvailable: bool + +isDestructive: bool - - - - + + + + - - - PublishDialog + + + IModelActionProvider - - - +Widget build() + + + +List<ModelAction<dynamic>> availableActions() - - - - + + + + - - - PublishSuccessDialog + + + IListActionProvider - - - +Widget build() + + + +void onSelectItem() + +void onNewItem() - - - - + + + + - - - PublishConfirmationDialog + + + ModelActionType - - - +Widget build() + + + +index: int + <static>+values: List<ModelActionType> + <static>+edit: ModelActionType + <static>+delete: ModelActionType + <static>+remove: ModelActionType + <static>+duplicate: ModelActionType + <static>+clipboard: ModelActionType + <static>+primary: ModelActionType - - - - - - - - - FormArrayTable - - + + + + + - - - +control: AbstractControl<dynamic> - +items: List<T> - +onSelectItem: void Function(T) - +getActionsAt: List<ModelAction<dynamic>> Function(T, int) - +onNewItem: void Function()? - +rowTitle: String Function(T) - +onNewItemLabel: String - +sectionTitle: String? - +sectionDescription: String? - +emptyIcon: IconData? - +emptyTitle: String? - +emptyDescription: String? - +sectionTitleDivider: bool? - +rowPrefix: Widget Function(BuildContext, T, int)? - +rowSuffix: Widget Function(BuildContext, T, int)? - +leadingWidget: Widget? - +itemsSectionPadding: EdgeInsets? - +hideLeadingTrailingWhenEmpty: bool - <static>+columns: List<StandardTableColumn> + + + OptimisticUpdate - - - +Widget build() - -List<Widget> _buildRow() - -Widget _newItemButton() + + + +applyOptimistic: void Function() + +apply: dynamic Function() + +rollback: void Function() + +onUpdate: void Function()? + +onError: void Function(Object, StackTrace?)? + +rethrowErrors: bool + +runOptimistically: bool + +completeFutureOptimistically: bool - - - - - - - - AbstractControl + + + +dynamic execute() + -void _runUpdateHandlerIfAny() - - - + + + - - - void Function(T) + + + void Function() - - - + + + - - - List<ModelAction<dynamic>> Function(T, int) + + + void Function(Object, StackTrace?)? - - - + + + + - - - String Function(T) + + + FileFormatEncoder - - - - - - - - Widget Function(BuildContext, T, int)? + + + +dynamic encodeAsync() + +String encode() + +dynamic call() - - - - - + + + + - - - IFormData + + + CSVStringEncoder - - - +id: String + + + +String encode() - - - +IFormData copy() + + + + + + + + + JsonStringEncoder + + + + + + +String encode() - - - - + + + + + - - - ManagedFormViewModel + + + ExecutionLimiter - - - +ManagedFormViewModel<T> createDuplicate() + + + +milliseconds: int + <static>-_timer: Timer? + + + + + + +void dispose() - - - + + + - - - FormViewModelNotFoundException + + + Timer - - - - - + + + + + - - - FormViewModelCollection + + + Debouncer - - - +formViewModels: List<T> - +formArray: FormArray<dynamic> - +stagedViewModels: List<T> - +retrievableViewModels: List<T> - +formData: List<D> + + + +leading: bool + +cancelUncompleted: bool + -_uncompletedFutureOperation: CancelableOperation<dynamic>? - - - +void add() - +T remove() - +T? findWhere() - +T? removeWhere() - +bool contains() - +void stage() - +T commit() - +void reset() - +void read() + + + +dynamic call() - - - + + + - - - FormArray + + + CancelableOperation - - - + + + + - - - FormInvalidException + + + Throttler + + + + + + +dynamic call() - - - - + + + + - - - FormConfigException + + + SerializableColor - - - +message: String? + + + +Map<String, dynamic> toJson() + <static>+SerializableColor fromJson() - - - - + + + + - - - IFormViewModelDelegate + + + IProviderArgsResolver - - - +dynamic onSave() - +void onCancel() + + + +R provide() - - - - + + + + + - - - FormControlOption + + + CombinedStreamNotifier - - - +value: T - +label: String - +description: String? - +props: List<Object?> + + + -_subscriptions: List<StreamSubscription<dynamic>> + + + + + + +void dispose() - - - - + + + - - - FormMode + + + ChangeNotifier - - - +index: int - <static>+values: List<FormMode> - <static>+create: FormMode - <static>+readonly: FormMode - <static>+edit: FormMode + + + + + + + + + + CountWhereValidator + + + + + + +predicate: bool Function(T?) + +minCount: int? + +maxCount: int? + <static>+kValidationMessageMinCount: String + <static>+kValidationMessageMaxCount: String + + + + + + +Map<String, dynamic>? validate() - - - + + + - - - FormValidationSetEnum + + + bool Function(T?) + + + + + + + + + + + Validator - - - - - + + + + - - - CustomFormControl + + + Patterns - - - -_onValueChangedDebouncer: Debouncer? - -_onStatusChangedDebouncer: Debouncer? - +onValueChanged: void Function(T?)? - +onStatusChanged: void Function(ControlStatus)? - +onStatusChangedDebounceTime: int? - +onValueChangedDebounceTime: int? + + + <static>+timeFormatString: String + <static>+emailFormatString: String + <static>+url: String - - - +void dispose() + + + + + + + + + + NumericalRangeFormatter - - - - + + + +min: int? + +max: int? + + - - - void Function(T?)? + + + +TextEditingValue formatEditUpdate() - - - + + + - - - void Function(ControlStatus)? + + + TextInputFormatter - - - - + + + + - - - UnsavedChangesDialog + + + StudySequenceFormatter - - - +Widget build() + + + +TextEditingValue formatEditUpdate() - - - - - + + + + + - - - FormControlValidation + + + Tuple - - - +control: AbstractControl<dynamic> - +validators: List<Validator<dynamic>> - +asyncValidators: List<AsyncValidator<dynamic>>? - +validationMessages: Map<String, String Function(Object)> + + + +first: T1 + +second: T2 + +props: List<Object?> - - - +FormControlValidation merge() + + + +Map<String, dynamic> toJson() + <static>+Tuple<dynamic, dynamic> fromJson() + +Tuple<T1, T2> copy() + +Tuple<T1, T2> copyWith() - - - - - + + + + + - - - ScreenerQuestionFormViewModel + + + JsonFileLoader - - - <static>+defaultResponseOptionValidity: bool - +responseOptionsDisabledArray: FormArray<dynamic> - +responseOptionsLogicControls: FormArray<bool> - +responseOptionsLogicDescriptionControls: FormArray<String> - -_questionBaseControls: Map<String, AbstractControl<dynamic>> - +prevResponseOptionControls: List<AbstractControl<dynamic>> - +prevResponseOptionValues: List<dynamic> - +responseOptionsDisabledControls: List<AbstractControl<dynamic>> - +logicControlOptions: List<FormControlOption<bool>> - +questionBaseControls: Map<String, AbstractControl<dynamic>> - +isDirtyOptionsBannerVisible: bool + + + +jsonAssetsPath: String - - - +dynamic onResponseOptionsChanged() - +void setControlsFrom() - +QuestionFormData buildFormData() - -List<FormControl<dynamic>> _copyFormControls() - -AbstractControl<dynamic>? _findAssociatedLogicControlFor() - -AbstractControl<dynamic>? _findAssociatedControlFor() - +ScreenerQuestionFormViewModel createDuplicate() + + + +dynamic loadJson() + +dynamic parseJsonMapFromAssets() + +dynamic parseJsonListFromAssets() - - - - - + + + + - - - QuestionFormViewModel + + + IAppDelegate - - - <static>+defaultQuestionType: SurveyQuestionType - -_titles: Map<FormMode, String Function()>? - +questionIdControl: FormControl<String> - +questionTypeControl: FormControl<SurveyQuestionType> - +questionTextControl: FormControl<String> - +questionInfoTextControl: FormControl<String> - +questionBaseControls: Map<String, AbstractControl<dynamic>> - +isMultipleChoiceControl: FormControl<bool> - +choiceResponseOptionsArray: FormArray<dynamic> - +customOptionsMin: int - +customOptionsMax: int - +customOptionsInitial: int - +boolResponseOptionsArray: FormArray<String> - +imageResponseOptionsArray: FormArray<String> - <static>+kDefaultMaxRecordingDurationSeconds: int - <static>+kMaxRecordingDurationSeconds: int - +audioResponseOptionsArray: FormArray<String> - +maxRecordingDurationSecondsControl: FormControl<int> - <static>+kDefaultScaleMinValue: int - <static>+kDefaultScaleMaxValue: int - <static>+kNumMidValueControls: int - <static>+kMidValueDebounceMilliseconds: int - +scaleMinValueControl: FormControl<int> - +scaleMaxValueControl: FormControl<int> - -_scaleRangeControl: FormControl<int> - +scaleMinLabelControl: FormControl<String> - +scaleMaxLabelControl: FormControl<String> - +scaleMidValueControls: FormArray<int> - +scaleMidLabelControls: FormArray<String?> - -_scaleResponseOptionsArray: FormArray<int> - +scaleMinColorControl: FormControl<SerializableColor> - +scaleMaxColorControl: FormControl<SerializableColor> - +prevMidValues: List<int?>? - +freeTextTypeControl: FormControl<FreeTextQuestionType> - +customRegexControl: FormControl<String> - +freeTextResponseOptionsArray: FormArray<dynamic> - +freeTextLengthMin: AbstractControl<int> - +freeTextLengthMax: AbstractControl<int> - +freeTextExampleTextControl: FormControl<String> - <static>+kDefaultFreeTextMinLength: int - <static>+kDefaultFreeTextMaxLength: int - +freeTextLengthControl: FormControl<RangeValues> - -_controlsByQuestionType: Map<SurveyQuestionType, FormGroup> - -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - -_validationConfigsByQuestionType: Map<SurveyQuestionType, Map<FormValidationSetEnum, List<FormControlValidation>>> - +form: FormGroup - +questionId: String - +questionType: SurveyQuestionType - +questionTypeControlOptions: List<FormControlOption<SurveyQuestionType>> - +answerOptionsArray: FormArray<dynamic> - +answerOptionsControls: List<AbstractControl<dynamic>> - +validAnswerOptions: List<String> - +boolOptions: List<AbstractControl<String>> - +imageOptions: List<AbstractControl<String>> - +audioOptions: List<AbstractControl<String>> - +scaleMinValue: int - +scaleMaxValue: int - +scaleRange: int - +scaleAllValueControls: List<AbstractControl<int>> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +questionTextRequired: dynamic - +numValidChoiceOptions: dynamic - +scaleRangeValid: dynamic - +maxRecordingDurationValid: dynamic - +titles: Map<FormMode, String> - +isAddOptionButtonVisible: bool - +isMidValuesClearedInfoVisible: bool + + + +dynamic onAppStart() - - - +String? scaleMidLabelAt() - -dynamic _onScaleRangeChanged() - -dynamic _applyInputFormatters() - -dynamic _updateScaleMidValueControls() - -Map<String, dynamic>? _validateFreeText() - -dynamic _onFreeTextLengthChanged() - -List<FormControlValidation> _getValidationConfig() - +dynamic onQuestionTypeChanged() - +dynamic onResponseOptionsChanged() - -void _updateFormControls() - +void initControls() - +void setControlsFrom() - +QuestionFormData buildFormData() - +List<ModelAction<dynamic>> availableActions() - +void onNewItem() - +void onSelectItem() - +dynamic save() - +QuestionFormViewModel createDuplicate() + + + + + + + + + + AppController - - - - - - - - - IScreenerQuestionLogicFormViewModel + + + +appDelegates: List<IAppDelegate> + -_delayedFuture: dynamic + +isInitialized: dynamic - - - +isDirtyOptionsBannerVisible: bool + + + +dynamic onAppStart() + -dynamic _callDelegates() - - - - + + + + - - - StudyDesignEnrollmentFormView + + + StudyMonitorScreen - - - +Widget build() - -dynamic _showScreenerQuestionSidesheetWithArgs() - -dynamic _showConsentItemSidesheetWithArgs() + + + +Widget build() + + + + + + + + + + + + + StudyPageWidget - - - - - - - - - StudyDesignPageWidget + + + +studyId: String - - - +Widget? banner() + + + +Widget? banner() - - - - - + + + + + - - - ScreenerQuestionLogicFormView + + + LoginForm - - - +formViewModel: ScreenerQuestionFormViewModel + + + +formKey: AuthFormKey - - - +Widget build() - -dynamic _buildInfoBanner() - -dynamic _buildAnswerOptionsLogicControls() - -List<Widget> _buildOptionLogicRow() + + + +Widget build() - - - - + + + + - - - FormConsumerWidget + + + AuthFormKey - - - +Widget build() + + + +index: int + <static>+values: List<AuthFormKey> + <static>+login: AuthFormKey + <static>+signup: AuthFormKey + <static>+passwordForgot: AuthFormKey + <static>+passwordRecovery: AuthFormKey + <static>-_loginSubmit: AuthFormKey + <static>-_signupSubmit: AuthFormKey - - - - - + + + + + - - - ConsentItemFormData + + + PasswordRecoveryForm - - - +consentId: String - +title: String - +description: String - +iconName: String? - +id: String + + + +formKey: AuthFormKey - - - +ConsentItem toConsentItem() - +ConsentItemFormData copy() + + + +Widget build() - - - - - + + + + + - - - EnrollmentFormViewModel + + + PasswordForgotForm - - - +study: Study - +router: GoRouter - +consentItemDelegate: EnrollmentFormConsentItemDelegate - +enrollmentTypeControl: FormControl<Participation> - +consentItemArray: FormArray<dynamic> - +consentItemFormViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData> - +form: FormGroup - +enrollmentTypeControlOptions: List<FormControlOption<Participation>> - +consentItemModels: List<ConsentItemFormViewModel> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titles: Map<FormMode, String> - +canTestScreener: bool - +canTestConsent: bool - +questionTitles: Map<FormMode, String Function()> + + + +formKey: AuthFormKey - - - +void setControlsFrom() - +EnrollmentFormData buildFormData() - +void read() - +List<ModelAction<dynamic>> availableActions() - +List<ModelAction<dynamic>> availablePopupActions() - +List<ModelAction<dynamic>> availableInlineActions() - +void onSelectItem() - +void onNewItem() - +ScreenerQuestionFormRouteArgs buildNewScreenerQuestionFormRouteArgs() - +ScreenerQuestionFormRouteArgs buildScreenerQuestionFormRouteArgs() - +ConsentItemFormRouteArgs buildNewConsentItemFormRouteArgs() - +ConsentItemFormRouteArgs buildConsentItemFormRouteArgs() - +dynamic testScreener() - +dynamic testConsent() - +ScreenerQuestionFormViewModel provideQuestionFormViewModel() + + + +Widget build() - - - - - + + + + + - - - EnrollmentFormConsentItemDelegate + + + SignupForm - - - +formViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData> - +owner: EnrollmentFormViewModel - +propagateOnSave: bool - +validationSet: dynamic + + + +formKey: AuthFormKey - - - +void onCancel() - +dynamic onSave() - +ConsentItemFormViewModel provide() - +List<ModelAction<dynamic>> availableActions() - +void onNewItem() - +void onSelectItem() + + + +Widget build() + -dynamic _onClickTermsOfUse() + -dynamic _onClickPrivacyPolicy() - - - - - - - - - WithQuestionnaireControls - - + + + + - - - +questionsArray: FormArray<dynamic> - +questionFormViewModels: FormViewModelCollection<Q, QuestionFormData> - +questionnaireControls: Map<String, FormArray<dynamic>> - +propagateOnSave: bool - +questionModels: List<Q> - +questionTitles: Map<FormMode, String Function()> + + + AuthScaffold - - - +void setQuestionnaireControlsFrom() - +QuestionnaireFormData buildQuestionnaireFormData() - +void read() - +void onCancel() - +dynamic onSave() - +Q provide() - +Q provideQuestionFormViewModel() + + + +body: Widget + +formKey: AuthFormKey + +leftContentMinWidth: double + +leftPanelMinWidth: double + +leftPanelPadding: EdgeInsets - - - - - + + + + - - - ConsentItemFormViewModel + + + EmailTextField - - - +consentIdControl: FormControl<String> - +titleControl: FormControl<String> - +descriptionControl: FormControl<String> - +iconControl: FormControl<IconOption> - +form: FormGroup - +consentId: String - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titleRequired: dynamic - +descriptionRequired: dynamic - +titles: Map<FormMode, String> + + + +labelText: String + +hintText: String? + +formControlName: String? + +formControl: FormControl<dynamic>? - - - +void setControlsFrom() - +ConsentItemFormData buildFormData() - +ConsentItemFormViewModel createDuplicate() + + + + + + + + FormControl - - - - + + + + - - - ConsentItemFormView + + + PasswordTextField - - - +formViewModel: ConsentItemFormViewModel + + + +labelText: String + +hintText: String? + +onSubmitted: dynamic Function(FormControl<dynamic>)? + +formControlName: String? + +formControl: FormControl<dynamic>? - - - - - + + + - - - EnrollmentFormData + + + dynamic Function(FormControl<dynamic>)? - - - <static>+kDefaultEnrollmentType: Participation - +enrollmentType: Participation - +questionnaireFormData: QuestionnaireFormData - +consentItemsFormData: List<ConsentItemFormData>? - +id: String + + + + + + + + + StudyUJobsToBeDone - - - +Study apply() - +EnrollmentFormData copy() + + + +Widget build() - - - - - + + + + + - - - QuestionnaireFormData + + + AuthFormController - - - +questionsData: List<QuestionFormData>? - +id: String + + + +authRepository: IAuthRepository + +notificationService: INotificationService + +router: GoRouter + +emailControl: FormControl<String> + +passwordControl: FormControl<String> + +passwordConfirmationControl: FormControl<String> + +termsOfServiceControl: FormControl<bool> + <static>+authValidationMessages: Map<String, String Function(dynamic)> + +loginForm: FormGroup + +signupForm: FormGroup + +passwordForgotForm: FormGroup + +passwordRecoveryForm: FormGroup + +controlValidatorsByForm: Map<AuthFormKey, Map<FormControl<dynamic>, List<Validator<dynamic>>>> + -_formKey: AuthFormKey + +formKey: AuthFormKey + +form: FormGroup - - - +StudyUQuestionnaire toQuestionnaire() - +List<EligibilityCriterion> toEligibilityCriteria() - +QuestionnaireFormData copy() + + + -dynamic _getFormFor() + -dynamic _onChangeFormKey() + +dynamic resetControlsFor() + -dynamic _forceValidationMessages() + +dynamic signUp() + -dynamic _signUp() + +dynamic signIn() + -dynamic _signInWith() + +dynamic signOut() + +dynamic resetPasswordForEmail() + +dynamic sendPasswordResetLink() + +dynamic recoverPassword() + +dynamic updateUser() + -dynamic _readDebugUser() - - - - - - - - IStudyFormData - - + + + + + - - - +Study apply() + + + IAuthRepository - - - - - - - - - StudyDesignInterventionsFormView + + + +allowPasswordReset: bool + +currentUser: User? + +isLoggedIn: bool + +session: Session? + +serializedSession: String? - - - +Widget build() + + + +dynamic signUp() + +dynamic signInWith() + +dynamic signOut() + +dynamic resetPasswordForEmail() + +dynamic updateUser() + +void dispose() - - - - - + + + - - - InterventionsFormViewModel + + + FormGroup - - - +study: Study - +router: GoRouter - +interventionsArray: FormArray<dynamic> - +interventionsCollection: FormViewModelCollection<InterventionFormViewModel, InterventionFormData> - +form: FormGroup - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +interventionsRequired: dynamic - +titles: Map<FormMode, String> - +canTestStudySchedule: bool + + + + + + + + + IFormGroupController - - - +void setControlsFrom() - +InterventionsFormData buildFormData() - +void read() - +List<ModelAction<dynamic>> availableActions() - +List<ModelAction<dynamic>> availablePopupActions() - +List<ModelAction<dynamic>> availableInlineActions() - +void onSelectItem() - +void onNewItem() - +InterventionFormViewModel provide() - +void onCancel() - +dynamic onSave() - +dynamic testStudySchedule() + + + +form: FormGroup - - - - - - - - - StudyScheduleControls - - + + + + - - - <static>+defaultScheduleType: PhaseSequence - <static>+defaultScheduleTypeSequence: String - <static>+defaultNumCycles: int - <static>+defaultPeriodLength: int - +sequenceTypeControl: FormControl<PhaseSequence> - +sequenceTypeCustomControl: FormControl<String> - +phaseDurationControl: FormControl<int> - +numCyclesControl: FormControl<int> - +includeBaselineControl: FormControl<bool> - +studyScheduleControls: Map<String, FormControl<Object>> - <static>+kNumCyclesMin: int - <static>+kNumCyclesMax: int - <static>+kPhaseDurationMin: int - <static>+kPhaseDurationMax: int - +sequenceTypeControlOptions: List<FormControlOption<PhaseSequence>> - +studyScheduleValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +numCyclesRange: dynamic - +phaseDurationRange: dynamic - +customSequenceRequired: dynamic + + + AppStatus - - - +void setStudyScheduleControlsFrom() - +StudyScheduleFormData buildStudyScheduleFormData() - +bool isSequencingCustom() + + + +index: int + <static>+values: List<AppStatus> + <static>+initializing: AppStatus + <static>+initialized: AppStatus - - - - - + + + + + - - - InterventionFormViewModel + + + FormArrayTable - - - +study: Study - +interventionIdControl: FormControl<String> - +interventionTitleControl: FormControl<String> - +interventionIconControl: FormControl<IconOption> - +interventionDescriptionControl: FormControl<String> - +interventionTasksArray: FormArray<dynamic> - +tasksCollection: FormViewModelCollection<InterventionTaskFormViewModel, InterventionTaskFormData> - +form: FormGroup - +interventionId: String - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titleRequired: dynamic - +atLeastOneTask: dynamic - +breadcrumbsTitle: String - +titles: Map<FormMode, String> + + + +control: AbstractControl<dynamic> + +items: List<T> + +onSelectItem: void Function(T) + +getActionsAt: List<ModelAction<dynamic>> Function(T, int) + +onNewItem: void Function()? + +rowTitle: String Function(T) + +onNewItemLabel: String + +sectionTitle: String? + +sectionDescription: String? + +emptyIcon: IconData? + +emptyTitle: String? + +emptyDescription: String? + +sectionTitleDivider: bool? + +rowPrefix: Widget Function(BuildContext, T, int)? + +rowSuffix: Widget Function(BuildContext, T, int)? + +leadingWidget: Widget? + +itemsSectionPadding: EdgeInsets? + +hideLeadingTrailingWhenEmpty: bool + <static>+columns: List<StandardTableColumn> - - - +void setControlsFrom() - +InterventionFormData buildFormData() - +List<ModelAction<dynamic>> availableActions() - +List<ModelAction<dynamic>> availablePopupActions() - +List<ModelAction<dynamic>> availableInlineActions() - +void onSelectItem() - +void onNewItem() - +void onCancel() - +dynamic onSave() - +InterventionTaskFormViewModel provide() - +InterventionTaskFormRouteArgs buildNewFormRouteArgs() - +InterventionTaskFormRouteArgs buildFormRouteArgs() - +InterventionFormViewModel createDuplicate() + + + +Widget build() + -List<Widget> _buildRow() + -Widget _newItemButton() - - - - - + + + - - - InterventionTaskFormData + + + List<ModelAction<dynamic>> Function(T, int) - - - +taskId: String - +taskTitle: String - +taskDescription: String? - <static>+kDefaultTitle: String - +id: String - - + + + + - - - +CheckmarkTask toTask() - +InterventionTaskFormData copy() + + + String Function(T) - - - - - + + + - - - IFormDataWithSchedule + + + Widget Function(BuildContext, T, int)? - - - +instanceId: String - +isTimeLocked: bool - +timeLockStart: StudyUTimeOfDay? - +timeLockEnd: StudyUTimeOfDay? - +hasReminder: bool - +reminderTime: StudyUTimeOfDay? + + + + + + + + + ManagedFormViewModel - - - +Schedule toSchedule() + + + +ManagedFormViewModel<T> createDuplicate() - - - - - + + + + + - - - StudyScheduleFormData + + + FormViewModel - - - +sequenceType: PhaseSequence - +sequenceTypeCustom: String - +numCycles: int - +phaseDuration: int - +includeBaseline: bool - +id: String + + + -_formData: T? + -_formMode: FormMode + -_validationSet: FormValidationSetEnum? + +delegate: IFormViewModelDelegate<FormViewModel<dynamic>>? + +autosave: bool + -_immediateFormChildrenSubscriptions: List<StreamSubscription<dynamic>> + -_immediateFormChildrenListenerDebouncer: Debouncer? + -_autosaveOperation: CancelableOperation<dynamic>? + -_defaultControlValidators: Map<String, Tuple<List<Validator<dynamic>>, List<AsyncValidator<dynamic>>>> + +prevFormValue: Map<String, dynamic>? + <static>-_formKey: String + +formData: T? + +formMode: FormMode + +isReadonly: bool + +validationSet: FormValidationSetEnum? + +isDirty: bool + +title: String + +isValid: bool + +titles: Map<FormMode, String> + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - - - +StudySchedule toStudySchedule() - +Study apply() - +StudyScheduleFormData copy() + + + -dynamic _setFormData() + -dynamic _rememberDefaultControlValidators() + -Tuple<List<Validator<dynamic>>, List<AsyncValidator<dynamic>>>? _getDefaultValidators() + -dynamic _disableAllControls() + -dynamic _formModeUpdated() + -dynamic _restoreControlsFromFormData() + +void revalidate() + -void _applyValidationSet() + +void read() + +dynamic save() + +dynamic cancel() + +void enableAutosave() + +void listenToImmediateFormChildren() + +dynamic markFormGroupChanged() + +void dispose() + +void setControlsFrom() + +T buildFormData() + +void initControls() - - - + + + - - - PhaseSequence + + + FormViewModelNotFoundException - - - - - + + + - - - InterventionPreview + + + Exception - - - +routeArgs: InterventionFormRouteArgs - - + + + + + + - - - +Widget build() + + + FormViewModelCollection - - - - - - - - - - InterventionTaskFormViewModel + + + +formViewModels: List<T> + +formArray: FormArray<dynamic> + +stagedViewModels: List<T> + +retrievableViewModels: List<T> + +formData: List<D> - - - +taskIdControl: FormControl<String> - +instanceIdControl: FormControl<String> - +taskTitleControl: FormControl<String> - +taskDescriptionControl: FormControl<String> - +markAsCompletedControl: FormControl<bool> - +form: FormGroup - +taskId: String - +instanceId: String - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titleRequired: dynamic - +titles: Map<FormMode, String> + + + +void add() + +T remove() + +T? findWhere() + +T? removeWhere() + +bool contains() + +void stage() + +T commit() + +void reset() + +void read() - - - +void setControlsFrom() - +InterventionTaskFormData buildFormData() - +InterventionTaskFormViewModel createDuplicate() + + + + + + + + FormArray - - - - - + + + + + - - - WithScheduleControls + + + CustomFormControl - - - +isTimeRestrictedControl: FormControl<bool> - +instanceID: FormControl<String> - +restrictedTimeStartControl: FormControl<Time> - +restrictedTimeStartPickerControl: FormControl<TimeOfDay> - +restrictedTimeEndControl: FormControl<Time> - +restrictedTimeEndPickerControl: FormControl<TimeOfDay> - +hasReminderControl: FormControl<bool> - +reminderTimeControl: FormControl<Time> - +reminderTimePickerControl: FormControl<TimeOfDay> - -_reminderControlStream: StreamSubscription<dynamic>? - +scheduleFormControls: Map<String, FormControl<Object>> - +hasReminder: bool - +isTimeRestricted: bool - +timeRestriction: List<Time>? + + + -_onValueChangedDebouncer: Debouncer? + -_onStatusChangedDebouncer: Debouncer? + +onValueChanged: void Function(T?)? + +onStatusChanged: void Function(ControlStatus)? + +onStatusChangedDebounceTime: int? + +onValueChangedDebounceTime: int? - - - +void setScheduleControlsFrom() - -dynamic _initReminderControl() + + + +void dispose() - - - - - + + + - - - InterventionsFormData + + + void Function(T?)? - - - +interventionsData: List<InterventionFormData> - +studyScheduleData: StudyScheduleFormData - +id: String - - + + + + - - - +Study apply() - +InterventionsFormData copy() + + + void Function(ControlStatus)? - - - - + + + + - - - InterventionFormView + + + UnsavedChangesDialog - - - +formViewModel: InterventionFormViewModel + + + +Widget build() - - - - - - - - InterventionTaskFormView - - + + + - - - +formViewModel: InterventionTaskFormViewModel + + + FormValidationSetEnum - - - - - + + + + + - - - InterventionFormData + + + FormControlValidation - - - +interventionId: String - +title: String - +description: String? - +tasksData: List<InterventionTaskFormData>? - +iconName: String? - <static>+kDefaultTitle: String - +id: String + + + +control: AbstractControl<dynamic> + +validators: List<Validator<dynamic>> + +asyncValidators: List<AsyncValidator<dynamic>>? + +validationMessages: Map<String, String Function(Object)> - - - +Intervention toIntervention() - +InterventionFormData copy() + + + +FormControlValidation merge() - - - - - + + + + + - - - StudyScheduleFormView + + + IFormData - - - +formViewModel: StudyScheduleControls + + + +id: String - - - -FormTableRow _renderCustomSequence() - +Widget build() + + + +IFormData copy() - - - - - + + + - - - StudyInfoFormData + + + FormInvalidException - - - +title: String - +description: String? - +iconName: String - +contactInfoFormData: StudyContactInfoFormData - +id: String + + + + + + + + + FormConfigException - - - +Study apply() - +StudyInfoFormData copy() + + + +message: String? - - - - - - - - - StudyContactInfoFormData - - + + + + - - - +organization: String? - +institutionalReviewBoard: String? - +institutionalReviewBoardNumber: String? - +researchers: String? - +email: String? - +website: String? - +phone: String? - +additionalInfo: String? - +id: String + + + IFormViewModelDelegate - - - +Study apply() - +StudyInfoFormData copy() + + + +dynamic onSave() + +void onCancel() - - - - + + + + - - - StudyDesignInfoFormView + + + FormControlOption - - - +Widget build() + + + +value: T + +label: String + +description: String? + +props: List<Object?> - - - - - - - - - StudyInfoFormViewModel - - + + + + - - - +study: Study - +titleControl: FormControl<String> - +iconControl: FormControl<IconOption> - +descriptionControl: FormControl<String> - +organizationControl: FormControl<String> - +reviewBoardControl: FormControl<String> - +reviewBoardNumberControl: FormControl<String> - +researchersControl: FormControl<String> - +emailControl: FormControl<String> - +websiteControl: FormControl<String> - +phoneControl: FormControl<String> - +additionalInfoControl: FormControl<String> - +form: FormGroup - +titles: Map<FormMode, String> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titleRequired: dynamic - +descriptionRequired: dynamic - +iconRequired: dynamic - +organizationRequired: dynamic - +reviewBoardRequired: dynamic - +reviewBoardNumberRequired: dynamic - +researchersRequired: dynamic - +emailRequired: dynamic - +phoneRequired: dynamic - +emailFormat: dynamic - +websiteFormat: dynamic + + + FormMode - - - +void setControlsFrom() - +StudyInfoFormData buildFormData() + + + +index: int + <static>+values: List<FormMode> + <static>+create: FormMode + <static>+readonly: FormMode + <static>+edit: FormMode - - - - - + + + + + - - - MeasurementSurveyFormData + + + EnrolledBadge - - - +measurementId: String - +title: String - +introText: String? - +outroText: String? - +questionnaireFormData: QuestionnaireFormData - <static>+kDefaultTitle: String - +id: String + + + +enrolledCount: int - - - +QuestionnaireTask toQuestionnaireTask() - +MeasurementSurveyFormData copy() + + + +Widget build() - - - - + + + + + - - - MeasurementSurveyFormView + + + StudyRecruitController - - - +formViewModel: MeasurementSurveyFormViewModel + + + +inviteCodeRepository: IInviteCodeRepository + -_invitesSubscription: StreamSubscription<List<WrappedModel<StudyInvite>>>? + + + + + + -dynamic _subscribeInvites() + +Intervention? getIntervention() + +int getParticipantCountForInvite() + +List<ModelAction<dynamic>> availableActions() + +List<ModelAction<dynamic>> availableInlineActions() + +void dispose() - - - - - + + + + - - - MeasurementSurveyFormViewModel + + + IInviteCodeRepository - - - +study: Study - +measurementIdControl: FormControl<String> - +instanceIdControl: FormControl<String> - +surveyTitleControl: FormControl<String> - +surveyIntroTextControl: FormControl<String> - +surveyOutroTextControl: FormControl<String> - +form: FormGroup - +measurementId: String - +instanceId: String - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titleRequired: dynamic - +atLeastOneQuestion: dynamic - +breadcrumbsTitle: String - +titles: Map<FormMode, String> + + + +dynamic isCodeAlreadyUsed() - - - +void setControlsFrom() - +MeasurementSurveyFormData buildFormData() - +List<ModelAction<dynamic>> availableActions() - +List<ModelAction<dynamic>> availablePopupActions() - +List<ModelAction<dynamic>> availableInlineActions() - +void onSelectItem() - +void onNewItem() - +SurveyQuestionFormRouteArgs buildNewFormRouteArgs() - +SurveyQuestionFormRouteArgs buildFormRouteArgs() - +MeasurementSurveyFormViewModel createDuplicate() + + + + + + + + StreamSubscription - - - - - + + + + + - - - SurveyPreview + + + StudyBaseController - - - +routeArgs: MeasurementFormRouteArgs + + + +studyId: String + +studyRepository: IStudyRepository + +router: GoRouter + +studySubscription: StreamSubscription<WrappedModel<Study>>? - - - +Widget build() + + + +dynamic subscribeStudy() + +dynamic onStudySubscriptionUpdate() + +dynamic onStudySubscriptionError() + +void dispose() - - - - + + + + - - - StudyDesignMeasurementsFormView + + + StudyRecruitScreen - - - +Widget build() + + + +Widget build() + -Widget _inviteCodesSectionHeader() + -Widget _newInviteCodeButton() + -dynamic _onSelectInvite() - - - - - + + + + + - - - MeasurementsFormData + + + InviteCodeFormView - - - +surveyMeasurements: List<MeasurementSurveyFormData> - +id: String + + + +formViewModel: InviteCodeFormViewModel - - - +Study apply() - +MeasurementsFormData copy() + + + +Widget build() + -List<FormTableRow> _conditionalInterventionRows() - - - - - + + + + + - - - MeasurementsFormViewModel + + + InviteCodeFormViewModel - - - +study: Study - +router: GoRouter - +measurementsArray: FormArray<dynamic> - +surveyMeasurementFormViewModels: FormViewModelCollection<MeasurementSurveyFormViewModel, MeasurementSurveyFormData> - +form: FormGroup - +measurementViewModels: List<MeasurementSurveyFormViewModel> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +measurementRequired: dynamic - +titles: Map<FormMode, String> + + + +study: Study + +inviteCodeRepository: IInviteCodeRepository + +codeControl: FormControl<String> + +codeControlValidationMessages: Map<String, String Function(dynamic)> + +isPreconfiguredScheduleControl: FormControl<bool> + +preconfiguredScheduleTypeControl: FormControl<PhaseSequence> + +interventionAControl: FormControl<String> + +interventionBControl: FormControl<String> + +form: FormGroup + +titles: Map<FormMode, String> + +interventionControlOptions: List<FormControlOption<String>> + +preconfiguredScheduleTypeOptions: List<FormControlOption<PhaseSequence>> + +isPreconfiguredSchedule: bool + +preconfiguredSchedule: List<String>? - - - +void read() - +void setControlsFrom() - +MeasurementsFormData buildFormData() - +List<ModelAction<dynamic>> availableActions() - +List<ModelAction<dynamic>> availablePopupActions() - +List<ModelAction<dynamic>> availableInlineActions() - +void onSelectItem() - +void onNewItem() - +MeasurementSurveyFormViewModel provide() - +void onCancel() - +dynamic onSave() + + + +void initControls() + -dynamic _uniqueInviteCode() + +void regenerateCode() + -String _generateCode() + +StudyInvite buildFormData() + +void setControlsFrom() + +dynamic save() - - - - + + + + + - - - StudyFormValidationSet + + + StudyInvitesTable - - - +index: int - <static>+values: List<StudyFormValidationSet> + + + +invites: List<StudyInvite> + +onSelect: void Function(StudyInvite) + +getActions: List<ModelAction<dynamic>> Function(StudyInvite) + +getInlineActions: List<ModelAction<dynamic>> Function(StudyInvite) + +getIntervention: Intervention? Function(String) + +getParticipantCountForInvite: int Function(StudyInvite) + + + + + + +Widget build() + -List<Widget> _buildRow() - - - - - + + + - - - ReportsFormViewModel + + + void Function(StudyInvite) - - - +study: Study - +router: GoRouter - +reportItemDelegate: ReportFormItemDelegate - +reportItemArray: FormArray<dynamic> - +reportItemFormViewModels: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData> - +form: FormGroup - +reportItemModels: List<ReportItemFormViewModel> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titles: Map<FormMode, String> - +canTestConsent: bool + + + + + + + + List<ModelAction<dynamic>> Function(StudyInvite) - - - +void setControlsFrom() - +ReportsFormData buildFormData() - +void read() - +ReportItemFormRouteArgs buildNewReportItemFormRouteArgs() - +ReportItemFormRouteArgs buildReportItemFormRouteArgs() - +dynamic testReport() - +void onCancel() - +dynamic onSave() - +ReportItemFormViewModel provide() + + + + + + + + Intervention? Function(String) - - - - - + + + - - - ReportFormItemDelegate + + + int Function(StudyInvite) - - - +formViewModelCollection: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData> - +owner: ReportsFormViewModel - +propagateOnSave: bool - +validationSet: dynamic + + + + + + + + + PublishSuccessDialog - - - +void onCancel() - +dynamic onSave() - +ReportItemFormViewModel provide() - +List<ModelAction<dynamic>> availableActions() - +void onNewItem() - +void onSelectItem() + + + +Widget build() - - - - - + + + + - - - ReportItemFormData + + + PublishDialog - - - +isPrimary: bool - +section: ReportSection - +id: String + + + +Widget build() - - - <static>+dynamic fromDomainModel() - +ReportItemFormData copy() + + + + + + + + + PublishConfirmationDialog - - - - - - - - ReportSection + + + +Widget build() - - - - - + + + + + - - - ReportItemFormView + + + FrameControlsWidget - - - +formViewModel: ReportItemFormViewModel - +studyId: String - +reportSectionColumnWidth: dynamic - +sectionTypeBodyBuilder: Widget Function(BuildContext) + + + +onRefresh: void Function()? + +onOpenNewTab: void Function()? + +enabled: bool - - - +Widget build() - -dynamic _buildSectionText() - -dynamic _buildSectionTypeHeader() + + + +Widget build() - - - - - + + + + - - - ReportItemFormViewModel + + + IStudyStatusBadgeViewModel - - - <static>+defaultSectionType: ReportSectionType - +sectionIdControl: FormControl<String> - +sectionTypeControl: FormControl<ReportSectionType> - +titleControl: FormControl<String> - +descriptionControl: FormControl<String> - +sectionControl: FormControl<ReportSection> - +dataReferenceControl: FormControl<DataReferenceIdentifier<num>> - +temporalAggregationControl: FormControl<TemporalAggregationFormatted> - +improvementDirectionControl: FormControl<ImprovementDirectionFormatted> - +alphaControl: FormControl<double> - -_controlsBySectionType: Map<ReportSectionType, FormGroup> - -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - -_validationConfigsBySectionType: Map<ReportSectionType, Map<FormValidationSetEnum, List<FormControlValidation>>> - +sectionBaseControls: Map<String, AbstractControl<dynamic>> - +form: FormGroup - +sectionId: String - +sectionType: ReportSectionType - <static>+sectionTypeControlOptions: List<FormControlOption<ReportSectionType>> - <static>+temporalAggregationControlOptions: List<FormControlOption<TemporalAggregationFormatted>> - <static>+improvementDirectionControlOptions: List<FormControlOption<ImprovementDirectionFormatted>> - +titles: Map<FormMode, String> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titleRequired: dynamic - +descriptionRequired: dynamic - +dataReferenceRequired: dynamic - +aggregationRequired: dynamic - +improvementDirectionRequired: dynamic - +alphaConfidenceRequired: dynamic + + + +studyParticipation: Participation? + +studyStatus: StudyStatus? - - - -List<FormControlValidation> _getValidationConfig() - +ReportItemFormData buildFormData() - +ReportItemFormViewModel createDuplicate() - +dynamic onSectionTypeChanged() - -void _updateFormControls() - +void setControlsFrom() + + + + + + + + Participation - - - + + + - - - Widget Function(BuildContext) + + + StudyStatus - - - - + + + + + - - - ReportSectionType + + + StudyStatusBadge - - - +index: int - <static>+values: List<ReportSectionType> - <static>+average: ReportSectionType - <static>+linearRegression: ReportSectionType + + + +participation: Participation? + +status: StudyStatus? + +type: BadgeType + +showPrefixIcon: bool + +showTooltip: bool + + + + + + +Widget build() - - - - - + + + + + - - - TemporalAggregationFormatted + + + RouteInformation - - - -_value: TemporalAggregation - <static>+values: List<TemporalAggregationFormatted> - +value: TemporalAggregation - +string: String - +icon: IconData? - +hashCode: int + + + +route: String? + +extra: String? + +cmd: String? + +data: String? - - - +bool ==() - +String toString() - +String toJson() - <static>+TemporalAggregationFormatted fromJson() + + + +String toString() - - - + + + + + - - - TemporalAggregation + + + PlatformController - - - - - - - - - - ImprovementDirectionFormatted + + + +studyId: String + +baseSrc: String + +previewSrc: String + +routeInformation: RouteInformation + +frameWidget: Widget - - - -_value: ImprovementDirection - <static>+values: List<ImprovementDirectionFormatted> - +value: ImprovementDirection - +string: String - +icon: IconData? - +hashCode: int + + + +void activate() + +void registerViews() + +void generateUrl() + +void navigate() + +void refresh() + +void listen() + +void send() + +void openNewPage() - - - +bool ==() - +String toString() - +String toJson() - <static>+ImprovementDirectionFormatted fromJson() + + + + + + + + + + WebController - - - - + + + +iFrameElement: IFrameElement + + - - - ImprovementDirection + + + +void activate() + +void registerViews() + +void generateUrl() + +void navigate() + +void refresh() + +void openNewPage() + +void listen() + +void send() - - - - - + + + - - - AverageSectionFormView + + + IFrameElement - - - +formViewModel: ReportItemFormViewModel - +studyId: String - +reportSectionColumnWidth: Map<int, TableColumnWidth> + + + + + + + + + MobileController - - - +Widget build() + + + +void openNewPage() + +void refresh() + +void registerViews() + +void listen() + +void send() + +void navigate() + +void activate() + +void generateUrl() - - - - - + + + + + - - - LinearRegressionSectionFormView + + + StudyController - - - +formViewModel: ReportItemFormViewModel - +studyId: String - +reportSectionColumnWidth: Map<int, TableColumnWidth> + + + +notificationService: INotificationService + +studyEventsSubscription: StreamSubscription<ModelEvent<Study>>? + +studyActions: List<ModelAction<dynamic>> - - - +Widget build() + + + +dynamic syncStudyStatus() + +dynamic onStudySubscriptionUpdate() + -dynamic _redirectNewToActualStudyID() + +dynamic publishStudy() + +void onChangeStudyParticipation() + +void onAddParticipants() + +void onSettingsPressed() + +void dispose() - - - - - + + + + - - - DataReferenceIdentifier + + + IStudyNavViewModel - - - +hashCode: int + + + +isEditTabEnabled: bool + +isTestTabEnabled: bool + +isRecruitTabEnabled: bool + +isMonitorTabEnabled: bool + +isAnalyzeTabEnabled: bool + +isSettingsEnabled: bool - - - +bool ==() + + + + + + + + + StudyNav + + + + + + <static>+dynamic tabs() + <static>+dynamic edit() + <static>+dynamic test() + <static>+dynamic recruit() + <static>+dynamic monitor() + <static>+dynamic analyze() - - - + + + + - - - DataReference + + + StudyDesignNav + + + + + + <static>+dynamic tabs() + <static>+dynamic info() + <static>+dynamic enrollment() + <static>+dynamic interventions() + <static>+dynamic measurements() + <static>+dynamic reports() - - - - - + + + + + - - - DataReferenceEditor + + + StudyParticipationBadge + + + + + + +participation: Participation + +type: BadgeType + +showPrefixIcon: bool + +center: bool + + + + + + +Widget build() - - - +formControl: FormControl<DataReferenceIdentifier<T>> - +availableTasks: List<Task> - +buildReactiveDropdownField: ReactiveDropdownField<dynamic> + + + + + + + + + IStudyRepository - - - +FormTableRow buildFormTableRow() - -List<DropdownMenuItem<DataReferenceIdentifier<dynamic>>> _dataReferenceItems() + + + +dynamic launch() + +dynamic deleteParticipants() - - - + + + + - - - ReactiveDropdownField + + + PreviewFrame - - - - - - - - - - ReportsFormData + + + +studyId: String + +routeArgs: StudyFormRouteArgs? + +route: String? - - - +reportItems: List<ReportItemFormData> - +id: String + + + + + + + + + IStudyAppBarViewModel - - - +Study apply() - +ReportsFormData copy() + + + +isSyncIndicatorVisible: bool + +isStatusBadgeVisible: bool + +isPublishVisible: bool - - - - + + + + - - - ReportStatus + + + StudyScaffold - - - +index: int - <static>+values: List<ReportStatus> - <static>+primary: ReportStatus - <static>+secondary: ReportStatus + + + +studyId: String + +tabs: List<NavbarTab>? + +tabsSubnav: List<NavbarTab>? + +selectedTab: NavbarTab? + +selectedTabSubnav: NavbarTab? + +body: StudyPageWidget + +drawer: Widget? + +disableActions: bool + +actionsSpacing: double + +actionsPadding: double + +layoutType: SingleColumnLayoutType? + +appbarHeight: double + +appbarSubnavHeight: double - - - - - + + + + + - - - ReportBadge + + + WebFrame - - - +status: ReportStatus? - +type: BadgeType - +showPrefixIcon: bool - +showTooltip: bool + + + +previewSrc: String + +studyId: String - - - +Widget build() + + + +Widget build() - - - - + + + + - - - StudyDesignReportsFormView + + + DisabledFrame - - - +Widget build() - -dynamic _showReportItemSidesheetWithArgs() + + + +Widget build() - - - - - + + + + + - - - StudyFormScaffold + + + PhoneContainer - - - +studyId: String - +formViewModelBuilder: T Function(WidgetRef) - +formViewBuilder: Widget Function(T) + + + <static>+defaultWidth: double + <static>+defaultHeight: double + +width: double + +height: double + +borderColor: Color + +borderWidth: double + +borderRadius: double + +innerContent: Widget + +innerContentBackgroundColor: Color? - - - +Widget build() + + + +Widget build() - - - + + + + - - - T Function(WidgetRef) + + + MobileFrame - - - - - - - - Widget Function(T) + + + +Widget build() - - - - + + + + - - - SurveyQuestionFormView + + + DesktopFrame - - - +formViewModel: QuestionFormViewModel - +isHtmlStyleable: bool + + + +Widget build() - - - - + + + + + - - - SurveyQuestionType + + + StudyTestScreen - - - +index: int - <static>+values: List<SurveyQuestionType> - <static>+choice: SurveyQuestionType - <static>+bool: SurveyQuestionType - <static>+scale: SurveyQuestionType - <static>+image: SurveyQuestionType - <static>+audio: SurveyQuestionType - <static>+freeText: SurveyQuestionType + + + +previewRoute: String? + + + + + + +Widget build() + +Widget? banner() + +dynamic load() + +dynamic save() + +dynamic showHelp() - - - - - + + + + + - - - QuestionFormData + + + StudySettingsFormViewModel - - - <static>+questionTypeFormDataFactories: Map<SurveyQuestionType, QuestionFormData Function(Question<dynamic>, List<EligibilityCriterion>)> - +questionId: String - +questionText: String - +questionInfoText: String? - +questionType: SurveyQuestionType - +responseOptionsValidity: Map<dynamic, bool> - +responseOptions: List<dynamic> - +id: String + + + +study: AsyncValue<Study> + +studyRepository: IStudyRepository + <static>+defaultPublishedToRegistry: bool + <static>+defaultPublishedToRegistryResults: bool + +isPublishedToRegistryControl: FormControl<bool> + +isPublishedToRegistryResultsControl: FormControl<bool> + +form: FormGroup + +titles: Map<FormMode, String> - - - +Question<dynamic> toQuestion() - +EligibilityCriterion toEligibilityCriterion() - +Answer<dynamic> constructAnswerFor() - +dynamic setResponseOptionsValidityFrom() - +QuestionFormData copy() + + + +void setControlsFrom() + +Study buildFormData() + +dynamic keepControlsSynced() + +dynamic save() + +dynamic setLaunchDefaults() - - - - - - - - - ChoiceQuestionFormData - - + + + + - - - +isMultipleChoice: bool - +answerOptions: List<String> - +responseOptions: List<String> + + + StudySettingsDialog - - - +Question<dynamic> toQuestion() - +QuestionFormData copy() - -Choice _buildChoiceForValue() - +Answer<dynamic> constructAnswerFor() + + + +Widget build() - - - - - - - - - BoolQuestionFormData - - + + + + - - - <static>+kResponseOptions: Map<String, bool> - +responseOptions: List<String> + + + StudyTestController - - - +Question<dynamic> toQuestion() - +BoolQuestionFormData copy() - +Answer<dynamic> constructAnswerFor() + + + +authRepository: IAuthRepository + +languageCode: String - - - - - - - - - ImageQuestionFormData - - + + + + - - - <static>+kResponseOptions: Map<String, FutureBlobFile> - +responseOptions: List<String> + + + TestAppRoutes - - - +Question<dynamic> toQuestion() - +ImageQuestionFormData copy() - +Answer<dynamic> constructAnswerFor() + + + <static>+studyOverview: String + <static>+eligibility: String + <static>+intervention: String + <static>+consent: String + <static>+journey: String + <static>+dashboard: String - - - - - + + + + + - - - AudioQuestionFormData + + + DrawerEntry - - - +maxRecordingDurationSeconds: int - <static>+kResponseOptions: Map<String, FutureBlobFile> - +responseOptions: List<String> + + + +localizedTitle: String Function() + +icon: IconData? + +localizedHelpText: String Function()? + +enabled: bool + +onSelected: void Function(BuildContext, WidgetRef)? + +autoCloseDrawer: bool + +title: String + +helpText: String? - - - +Question<dynamic> toQuestion() - +AudioQuestionFormData copy() - +Answer<dynamic> constructAnswerFor() + + + +void onClick() - - - - - + + + - - - ScaleQuestionFormData + + + String Function() - - - +minValue: double - +maxValue: double - +minLabel: String? - +maxLabel: String? - +midValues: List<double?> - +midLabels: List<String?> - +stepSize: double - +initialValue: double? - +minColor: Color? - +maxColor: Color? - +responseOptions: List<double> - +midAnnotations: List<Annotation> + + + + + + + + String Function()? - - - +ScaleQuestion toQuestion() - +QuestionFormData copy() - +Answer<dynamic> constructAnswerFor() + + + + + + + + void Function(BuildContext, WidgetRef)? - - - - - + + + + + - - - FreeTextQuestionFormData + + + GoRouterDrawerEntry - - - +textLengthRange: List<int> - +textType: FreeTextQuestionType - +textTypeExpression: String? - +responseOptions: List<String> + + + +intent: RoutingIntent + +onNavigated: void Function()? - - - +Question<dynamic> toQuestion() - +FreeTextQuestionFormData copy() - +Answer<dynamic> constructAnswerFor() + + + +void onClick() - - - + + + + - - - FreeTextQuestionType + + + AppDrawer + + + + + + +width: int + +autoCloseDrawer: bool + +leftPaddingEntries: double + +logoPaddingVertical: double + +logoPaddingHorizontal: double + +logoMaxHeight: double + +logoSectionMinHeight: double + +logoSectionMaxHeight: double - - - - + + + + - - - IScaleQuestionFormViewModel + + + StudyAnalyzeScreen - - - +isMidValuesClearedInfoVisible: bool + + + +Widget? banner() + +Widget build() - - - - + + + + - - - ScaleQuestionFormView + + + StudyAnalyzeController - - - +formViewModel: QuestionFormViewModel + + + +dynamic onExport() - - - - - + + + + - - - FreeTextQuestionFormView + + + StudyDesignInterventionsFormView - - - +formViewModel: QuestionFormViewModel - +generateLabelHelpTextMap: dynamic + + + +Widget build() - - - +Widget build() - +Widget disableOnReadonly() - +Widget generateRow() + + + + + + + + + StudyDesignPageWidget - - - - - - - - - - BoolQuestionFormView + + + +Widget? banner() - - - +formViewModel: QuestionFormViewModel + + + + + + + + + InterventionFormView - - - +Widget build() + + + +formViewModel: InterventionFormViewModel - - - - - + + + + + - - - AudioRecordingQuestionFormView + + + InterventionFormViewModel - - - +formViewModel: QuestionFormViewModel + + + +study: Study + +interventionIdControl: FormControl<String> + +interventionTitleControl: FormControl<String> + +interventionIconControl: FormControl<IconOption> + +interventionDescriptionControl: FormControl<String> + +interventionTasksArray: FormArray<dynamic> + +tasksCollection: FormViewModelCollection<InterventionTaskFormViewModel, InterventionTaskFormData> + +form: FormGroup + +interventionId: String + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titleRequired: dynamic + +atLeastOneTask: dynamic + +breadcrumbsTitle: String + +titles: Map<FormMode, String> - - - +Widget build() + + + +void setControlsFrom() + +InterventionFormData buildFormData() + +List<ModelAction<dynamic>> availableActions() + +List<ModelAction<dynamic>> availablePopupActions() + +List<ModelAction<dynamic>> availableInlineActions() + +void onSelectItem() + +void onNewItem() + +void onCancel() + +dynamic onSave() + +InterventionTaskFormViewModel provide() + +InterventionTaskFormRouteArgs buildNewFormRouteArgs() + +InterventionTaskFormRouteArgs buildFormRouteArgs() + +InterventionFormViewModel createDuplicate() - - - - - + + + + + - - - ChoiceQuestionFormView + + + InterventionPreview - - - +formViewModel: QuestionFormViewModel + + + +routeArgs: InterventionFormRouteArgs - - - +Widget build() + + + +Widget build() - - - - - + + + + + - - - ImageCapturingQuestionFormView + + + StudyScheduleFormView - - - +formViewModel: QuestionFormViewModel + + + +formViewModel: StudyScheduleControls - - - +Widget build() + + + -FormTableRow _renderCustomSequence() + +Widget build() - - - - - - - - - ScheduleControls - - + + + + + - - - +formViewModel: WithScheduleControls + + + StudyScheduleControls - - - +Widget build() - -List<FormTableRow> _conditionalTimeRestrictions() + + + <static>+defaultScheduleType: PhaseSequence + <static>+defaultScheduleTypeSequence: String + <static>+defaultNumCycles: int + <static>+defaultPeriodLength: int + +sequenceTypeControl: FormControl<PhaseSequence> + +sequenceTypeCustomControl: FormControl<String> + +phaseDurationControl: FormControl<int> + +numCyclesControl: FormControl<int> + +includeBaselineControl: FormControl<bool> + +studyScheduleControls: Map<String, FormControl<Object>> + <static>+kNumCyclesMin: int + <static>+kNumCyclesMax: int + <static>+kPhaseDurationMin: int + <static>+kPhaseDurationMax: int + +sequenceTypeControlOptions: List<FormControlOption<PhaseSequence>> + +studyScheduleValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +numCyclesRange: dynamic + +phaseDurationRange: dynamic + +customSequenceRequired: dynamic - - - - - - - - StudyUTimeOfDay + + + +void setStudyScheduleControlsFrom() + +StudyScheduleFormData buildStudyScheduleFormData() + +bool isSequencingCustom() - - - - - + + + + + - - - StudyFormViewModel + + + InterventionTaskFormData - - - +studyDirtyCopy: Study? - +studyRepository: IStudyRepository - +authRepository: IAuthRepository - +router: GoRouter - +studyInfoFormViewModel: StudyInfoFormViewModel - +enrollmentFormViewModel: EnrollmentFormViewModel - +measurementsFormViewModel: MeasurementsFormViewModel - +reportsFormViewModel: ReportsFormViewModel - +interventionsFormViewModel: InterventionsFormViewModel - +form: FormGroup - +isStudyReadonly: bool - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titles: Map<FormMode, String> + + + +taskId: String + +taskTitle: String + +taskDescription: String? + <static>+kDefaultTitle: String + +id: String - - - +void read() - +void setControlsFrom() - +Study buildFormData() - +void dispose() - +void onCancel() - +dynamic onSave() - -dynamic _applyAndSaveSubform() + + + +CheckmarkTask toTask() + +InterventionTaskFormData copy() - - - - - - - - StudyAnalyzeScreen - - + + + + + - - - +Widget? banner() - +Widget build() + + + IFormDataWithSchedule - - - - - - - - - StudyAnalyzeController + + + +instanceId: String + +isTimeLocked: bool + +timeLockStart: StudyUTimeOfDay? + +timeLockEnd: StudyUTimeOfDay? + +hasReminder: bool + +reminderTime: StudyUTimeOfDay? - - - +dynamic onExport() + + + +Schedule toSchedule() - - - - - - - - StudyMonitorScreen - - + + + + + - - - +Widget build() + + + InterventionsFormViewModel - - - - - - - - - StudiesTableItem + + + +study: Study + +router: GoRouter + +interventionsArray: FormArray<dynamic> + +interventionsCollection: FormViewModelCollection<InterventionFormViewModel, InterventionFormData> + +form: FormGroup + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +interventionsRequired: dynamic + +titles: Map<FormMode, String> + +canTestStudySchedule: bool - - - +study: Study - +itemHeight: double - +itemPadding: double - +rowSpacing: double - +columnSpacing: double - +actions: List<ModelAction<dynamic>> - +columnSizes: List<StudiesTableColumnSize> - +isPinned: bool - +onPinnedChanged: void Function(Study, bool)? - +onTap: void Function(Study)? + + + +void setControlsFrom() + +InterventionsFormData buildFormData() + +void read() + +List<ModelAction<dynamic>> availableActions() + +List<ModelAction<dynamic>> availablePopupActions() + +List<ModelAction<dynamic>> availableInlineActions() + +void onSelectItem() + +void onNewItem() + +InterventionFormViewModel provide() + +void onCancel() + +dynamic onSave() + +dynamic testStudySchedule() - - - + + + + + - - - void Function(Study, bool)? + + + InterventionTaskFormViewModel - - - - - - - - void Function(Study)? + + + +taskIdControl: FormControl<String> + +instanceIdControl: FormControl<String> + +taskTitleControl: FormControl<String> + +taskDescriptionControl: FormControl<String> + +markAsCompletedControl: FormControl<bool> + +form: FormGroup + +taskId: String + +instanceId: String + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titleRequired: dynamic + +titles: Map<FormMode, String> - - - - - - - - - - DashboardController + + + +void setControlsFrom() + +InterventionTaskFormData buildFormData() + +InterventionTaskFormViewModel createDuplicate() - - - +studyRepository: IStudyRepository - +authRepository: IAuthRepository - +userRepository: IUserRepository - +router: GoRouter - -_studiesSubscription: StreamSubscription<List<WrappedModel<Study>>>? - +searchController: SearchController - +isSortAscending: bool + + + + + + + + + + WithScheduleControls - - - -dynamic _subscribeStudies() - +dynamic setSearchText() - +dynamic setStudiesFilter() - +dynamic onSelectStudy() - +dynamic onClickNewStudy() - +dynamic pinStudy() - +dynamic pinOffStudy() - +void setSorting() - +void filterStudies() - +void sortStudies() - +bool isSortingActiveForColumn() - +bool isPinned() - +List<ModelAction<dynamic>> availableActions() - +void dispose() + + + +isTimeRestrictedControl: FormControl<bool> + +instanceID: FormControl<String> + +restrictedTimeStartControl: FormControl<Time> + +restrictedTimeStartPickerControl: FormControl<TimeOfDay> + +restrictedTimeEndControl: FormControl<Time> + +restrictedTimeEndPickerControl: FormControl<TimeOfDay> + +hasReminderControl: FormControl<bool> + +reminderTimeControl: FormControl<Time> + +reminderTimePickerControl: FormControl<TimeOfDay> + -_reminderControlStream: StreamSubscription<dynamic>? + +scheduleFormControls: Map<String, FormControl<Object>> + +hasReminder: bool + +isTimeRestricted: bool + +timeRestriction: List<Time>? - - - - - - - - - SearchController + + + +void setScheduleControlsFrom() + -dynamic _initReminderControl() - - - +setText: void Function(String) + + + + + + + + PhaseSequence - - - - - + + + + + - - - StudiesTableColumnSize + + + InterventionFormData - - - +collapsed: bool - +flex: int? - +width: double? + + + +interventionId: String + +title: String + +description: String? + +tasksData: List<InterventionTaskFormData>? + +iconName: String? + <static>+kDefaultTitle: String + +id: String - - - +Widget createContainer() + + + +Intervention toIntervention() + +InterventionFormData copy() - - - - - + + + + + - - - StudiesTable + + + StudyScheduleFormData - - - +itemHeight: double - +itemPadding: double - +rowSpacing: double - +columnSpacing: double - +compactWidthThreshold: double - +superCompactWidthThreshold: double - +compactStatTitleThreshold: double - +studies: List<Study> - +onSelect: void Function(Study) - +getActions: List<ModelAction<dynamic>> Function(Study) - +emptyWidget: Widget - +pinnedStudies: Iterable<String> - +dashboardController: DashboardController + + + +sequenceType: PhaseSequence + +sequenceTypeCustom: String + +numCycles: int + +phaseDuration: int + +includeBaseline: bool + +id: String - - - +Widget build() - -Widget _buildColumnHeader() + + + +StudySchedule toStudySchedule() + +Study apply() + +StudyScheduleFormData copy() - - - + + + + - - - void Function(Study) + + + IStudyFormData - - - - - - - - List<ModelAction<dynamic>> Function(Study) + + + +Study apply() - - - - + + + + - - - StudiesTableColumn + + + InterventionTaskFormView - - - +index: int - <static>+values: List<StudiesTableColumn> - <static>+pin: StudiesTableColumn - <static>+title: StudiesTableColumn - <static>+status: StudiesTableColumn - <static>+participation: StudiesTableColumn - <static>+createdAt: StudiesTableColumn - <static>+enrolled: StudiesTableColumn - <static>+active: StudiesTableColumn - <static>+completed: StudiesTableColumn - <static>+action: StudiesTableColumn + + + +formViewModel: InterventionTaskFormViewModel - - - - + + + + + - - - DashboardScreen + + + InterventionsFormData - - - +filter: StudiesFilter? + + + +interventionsData: List<InterventionFormData> + +studyScheduleData: StudyScheduleFormData + +id: String + + + + + + +Study apply() + +InterventionsFormData copy() - - - - + + + + - - - StudiesFilter + + + StudyDesignReportsFormView - - - +index: int - <static>+values: List<StudiesFilter> + + + +Widget build() + -dynamic _showReportItemSidesheetWithArgs() - - - - - + + + + + - - - DashboardScaffold + + + ReportItemFormData - - - <static>+compactWidthThreshold: double - +body: Widget + + + +isPrimary: bool + +section: ReportSection + +id: String - - - +Widget build() + + + <static>+dynamic fromDomainModel() + +ReportItemFormData copy() - - - - + + + - - - StudiesTableColumnHeader + + + ReportSection - - - +title: String - +sortable: bool - +sortAscending: bool - +sortingActive: bool - +onSort: void Function()? + + + + + + + + + + DataReferenceEditor - - - - - - - - - AccountSettingsDialog + + + +formControl: FormControl<DataReferenceIdentifier<T>> + +availableTasks: List<Task> + +buildReactiveDropdownField: ReactiveDropdownField<dynamic> - - - +Widget build() + + + +FormTableRow buildFormTableRow() + -List<DropdownMenuItem<DataReferenceIdentifier<dynamic>>> _dataReferenceItems() - - - - - + + + - - - StudyInvitesTable + + + ReactiveDropdownField - - - +invites: List<StudyInvite> - +onSelect: void Function(StudyInvite) - +getActions: List<ModelAction<dynamic>> Function(StudyInvite) - +getInlineActions: List<ModelAction<dynamic>> Function(StudyInvite) - +getIntervention: Intervention? Function(String) - +getParticipantCountForInvite: int Function(StudyInvite) + + + + + + + + + + TemporalAggregationFormatted - - - +Widget build() - -List<Widget> _buildRow() + + + -_value: TemporalAggregation + <static>+values: List<TemporalAggregationFormatted> + +value: TemporalAggregation + +string: String + +icon: IconData? + +hashCode: int - - - - - - - - void Function(StudyInvite) + + + +bool ==() + +String toString() + +String toJson() + <static>+TemporalAggregationFormatted fromJson() - - - + + + - - - List<ModelAction<dynamic>> Function(StudyInvite) + + + TemporalAggregation - - - + + + + + - - - Intervention? Function(String) + + + ImprovementDirectionFormatted - - - - + + + -_value: ImprovementDirection + <static>+values: List<ImprovementDirectionFormatted> + +value: ImprovementDirection + +string: String + +icon: IconData? + +hashCode: int + + - - - int Function(StudyInvite) + + + +bool ==() + +String toString() + +String toJson() + <static>+ImprovementDirectionFormatted fromJson() - - - - - + + + - - - StudyRecruitController + + + ImprovementDirection - - - +inviteCodeRepository: IInviteCodeRepository - -_invitesSubscription: StreamSubscription<List<WrappedModel<StudyInvite>>>? + + + + + + + + + ReportSectionType - - - -dynamic _subscribeInvites() - +Intervention? getIntervention() - +int getParticipantCountForInvite() - +List<ModelAction<dynamic>> availableActions() - +List<ModelAction<dynamic>> availableInlineActions() - +void dispose() + + + +index: int + <static>+values: List<ReportSectionType> + <static>+average: ReportSectionType + <static>+linearRegression: ReportSectionType - - - - - + + + + + - - - InviteCodeFormViewModel + + + AverageSectionFormView - - - +study: Study - +inviteCodeRepository: IInviteCodeRepository - +codeControl: FormControl<String> - +codeControlValidationMessages: Map<String, String Function(dynamic)> - +isPreconfiguredScheduleControl: FormControl<bool> - +preconfiguredScheduleTypeControl: FormControl<PhaseSequence> - +interventionAControl: FormControl<String> - +interventionBControl: FormControl<String> - +form: FormGroup - +titles: Map<FormMode, String> - +interventionControlOptions: List<FormControlOption<String>> - +preconfiguredScheduleTypeOptions: List<FormControlOption<PhaseSequence>> - +isPreconfiguredSchedule: bool - +preconfiguredSchedule: List<String>? + + + +formViewModel: ReportItemFormViewModel + +studyId: String + +reportSectionColumnWidth: Map<int, TableColumnWidth> - - - +void initControls() - -dynamic _uniqueInviteCode() - +void regenerateCode() - -String _generateCode() - +StudyInvite buildFormData() - +void setControlsFrom() - +dynamic save() + + + +Widget build() - - - - - + + + + + - - - EnrolledBadge + + + ReportItemFormViewModel - - - +enrolledCount: int + + + <static>+defaultSectionType: ReportSectionType + +sectionIdControl: FormControl<String> + +sectionTypeControl: FormControl<ReportSectionType> + +titleControl: FormControl<String> + +descriptionControl: FormControl<String> + +sectionControl: FormControl<ReportSection> + +dataReferenceControl: FormControl<DataReferenceIdentifier<num>> + +temporalAggregationControl: FormControl<TemporalAggregationFormatted> + +improvementDirectionControl: FormControl<ImprovementDirectionFormatted> + +alphaControl: FormControl<double> + -_controlsBySectionType: Map<ReportSectionType, FormGroup> + -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + -_validationConfigsBySectionType: Map<ReportSectionType, Map<FormValidationSetEnum, List<FormControlValidation>>> + +sectionBaseControls: Map<String, AbstractControl<dynamic>> + +form: FormGroup + +sectionId: String + +sectionType: ReportSectionType + <static>+sectionTypeControlOptions: List<FormControlOption<ReportSectionType>> + <static>+temporalAggregationControlOptions: List<FormControlOption<TemporalAggregationFormatted>> + <static>+improvementDirectionControlOptions: List<FormControlOption<ImprovementDirectionFormatted>> + +titles: Map<FormMode, String> + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titleRequired: dynamic + +descriptionRequired: dynamic + +dataReferenceRequired: dynamic + +aggregationRequired: dynamic + +improvementDirectionRequired: dynamic + +alphaConfidenceRequired: dynamic - - - +Widget build() + + + -List<FormControlValidation> _getValidationConfig() + +ReportItemFormData buildFormData() + +ReportItemFormViewModel createDuplicate() + +dynamic onSectionTypeChanged() + -void _updateFormControls() + +void setControlsFrom() - - - - - + + + + + - - - InviteCodeFormView + + + DataReferenceIdentifier - - - +formViewModel: InviteCodeFormViewModel + + + +hashCode: int - - - +Widget build() - -List<FormTableRow> _conditionalInterventionRows() + + + +bool ==() - - - - - - - - StudyRecruitScreen - - + + + - - - +Widget build() - -Widget _inviteCodesSectionHeader() - -Widget _newInviteCodeButton() - -dynamic _onSelectInvite() + + + DataReference - - - - - + + + + + - - - DrawerEntry + + + LinearRegressionSectionFormView - - - +localizedTitle: String Function() - +icon: IconData? - +localizedHelpText: String Function()? - +enabled: bool - +onSelected: void Function(BuildContext, WidgetRef)? - +autoCloseDrawer: bool - +title: String - +helpText: String? + + + +formViewModel: ReportItemFormViewModel + +studyId: String + +reportSectionColumnWidth: Map<int, TableColumnWidth> - - - +void onClick() + + + +Widget build() - - - + + + + + - - - String Function() + + + ReportItemFormView - - - - - - - - String Function()? + + + +formViewModel: ReportItemFormViewModel + +studyId: String + +reportSectionColumnWidth: dynamic + +sectionTypeBodyBuilder: Widget Function(BuildContext) - - - - - - - - void Function(BuildContext, WidgetRef)? + + + +Widget build() + -dynamic _buildSectionText() + -dynamic _buildSectionTypeHeader() - - - - - + + + + + - - - GoRouterDrawerEntry + + + ReportsFormViewModel - - - +intent: RoutingIntent - +onNavigated: void Function()? + + + +study: Study + +router: GoRouter + +reportItemDelegate: ReportFormItemDelegate + +reportItemArray: FormArray<dynamic> + +reportItemFormViewModels: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData> + +form: FormGroup + +reportItemModels: List<ReportItemFormViewModel> + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titles: Map<FormMode, String> + +canTestConsent: bool - - - +void onClick() + + + +void setControlsFrom() + +ReportsFormData buildFormData() + +void read() + +ReportItemFormRouteArgs buildNewReportItemFormRouteArgs() + +ReportItemFormRouteArgs buildReportItemFormRouteArgs() + +dynamic testReport() + +void onCancel() + +dynamic onSave() + +ReportItemFormViewModel provide() - - - - + + + + + - - - AppDrawer + + + ReportFormItemDelegate - - - +width: int - +autoCloseDrawer: bool - +leftPaddingEntries: double - +logoPaddingVertical: double - +logoPaddingHorizontal: double - +logoMaxHeight: double - +logoSectionMinHeight: double - +logoSectionMaxHeight: double + + + +formViewModelCollection: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData> + +owner: ReportsFormViewModel + +propagateOnSave: bool + +validationSet: dynamic + + + + + + +void onCancel() + +dynamic onSave() + +ReportItemFormViewModel provide() + +List<ModelAction<dynamic>> availableActions() + +void onNewItem() + +void onSelectItem() - - - - + + + + + - - - NotificationDispatcher + + + ReportBadge - - - +child: Widget? - +snackbarInnerPadding: double - +snackbarWidth: double? - +snackbarBehavior: SnackBarBehavior - +snackbarDefaultDuration: int + + + +status: ReportStatus? + +type: BadgeType + +showPrefixIcon: bool + +showTooltip: bool - - - - - - - - SnackBarBehavior + + + +Widget build() - - - - + + + + - - - Notifications + + + ReportStatus - - - <static>+credentialsInvalid: SnackbarIntent - <static>+userAlreadyRegistered: SnackbarIntent - <static>+passwordReset: SnackbarIntent - <static>+passwordResetSuccess: SnackbarIntent - <static>+studyDeleted: SnackbarIntent - <static>+inviteCodeDeleted: SnackbarIntent - <static>+inviteCodeClipped: SnackbarIntent - <static>+studyDeleteConfirmation: AlertIntent + + + +index: int + <static>+values: List<ReportStatus> + <static>+primary: ReportStatus + <static>+secondary: ReportStatus - - - - + + + + + - - - SnackbarIntent + + + ReportsFormData - - - +duration: int? + + + +reportItems: List<ReportItemFormData> + +id: String - - - - - - - - - AlertIntent + + + +Study apply() + +ReportsFormData copy() - - - +title: String - +dismissOnAction: bool - +isDestructive: dynamic + + + + + + + + + + StudyInfoFormViewModel - - - - - - - - - NotificationDefaultActions + + + +study: Study + +titleControl: FormControl<String> + +iconControl: FormControl<IconOption> + +descriptionControl: FormControl<String> + +organizationControl: FormControl<String> + +reviewBoardControl: FormControl<String> + +reviewBoardNumberControl: FormControl<String> + +researchersControl: FormControl<String> + +emailControl: FormControl<String> + +websiteControl: FormControl<String> + +phoneControl: FormControl<String> + +additionalInfoControl: FormControl<String> + +form: FormGroup + +titles: Map<FormMode, String> + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titleRequired: dynamic + +descriptionRequired: dynamic + +iconRequired: dynamic + +organizationRequired: dynamic + +reviewBoardRequired: dynamic + +reviewBoardNumberRequired: dynamic + +researchersRequired: dynamic + +emailRequired: dynamic + +phoneRequired: dynamic + +emailFormat: dynamic + +websiteFormat: dynamic - - - <static>+cancel: NotificationAction + + + +void setControlsFrom() + +StudyInfoFormData buildFormData() - - - - + + + + - - - NotificationAction + + + StudyDesignInfoFormView - - - +label: String - +onSelect: dynamic Function() - +isDestructive: bool + + + +Widget build() - - - - - + + + + + - - - NotificationIntent + + + StudyInfoFormData - - - +message: String? - +customContent: Widget? - +icon: IconData? - +actions: List<NotificationAction>? - +type: NotificationType + + + +title: String + +description: String? + +iconName: String + +contactInfoFormData: StudyContactInfoFormData + +id: String - - - +void register() + + + +Study apply() + +StudyInfoFormData copy() - - - - - - - - NotificationType - - + + + + + - - - +index: int - <static>+values: List<NotificationType> - <static>+snackbar: NotificationType - <static>+alert: NotificationType - <static>+custom: NotificationType + + + StudyContactInfoFormData - - - - - - - - - IClipboardService + + + +organization: String? + +institutionalReviewBoard: String? + +institutionalReviewBoardNumber: String? + +researchers: String? + +email: String? + +website: String? + +phone: String? + +additionalInfo: String? + +id: String - - - +dynamic copy() + + + +Study apply() + +StudyInfoFormData copy() - - - - + + + + - - - ClipboardService + + + StudyFormValidationSet - - - +dynamic copy() + + + +index: int + <static>+values: List<StudyFormValidationSet> - - - - - + + + + + - - - NotificationService + + + MeasurementsFormData - - - -_streamController: BehaviorSubject<NotificationIntent> + + + +surveyMeasurements: List<MeasurementSurveyFormData> + +id: String - - - +Stream<NotificationIntent> watchNotifications() - +void showMessage() - +void show() - +void dispose() + + + +Study apply() + +MeasurementsFormData copy() - - - - + + + + - - - Assets + + + MeasurementSurveyFormView - - - <static>+logoWide: String + + + +formViewModel: MeasurementSurveyFormViewModel - - - - + + + + + - - - Hyperlink + + + MeasurementSurveyFormViewModel - - - +text: String - +url: String? - +onClick: void Function()? - +linkColor: Color - +hoverColor: Color? - +visitedColor: Color? - +style: TextStyle? - +hoverStyle: TextStyle? - +visitedStyle: TextStyle? - +icon: IconData? - +iconSize: double? + + + +study: Study + +measurementIdControl: FormControl<String> + +instanceIdControl: FormControl<String> + +surveyTitleControl: FormControl<String> + +surveyIntroTextControl: FormControl<String> + +surveyOutroTextControl: FormControl<String> + +form: FormGroup + +measurementId: String + +instanceId: String + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titleRequired: dynamic + +atLeastOneQuestion: dynamic + +breadcrumbsTitle: String + +titles: Map<FormMode, String> - - - - - - - - TextStyle + + + +void setControlsFrom() + +MeasurementSurveyFormData buildFormData() + +List<ModelAction<dynamic>> availableActions() + +List<ModelAction<dynamic>> availablePopupActions() + +List<ModelAction<dynamic>> availableInlineActions() + +void onSelectItem() + +void onNewItem() + +SurveyQuestionFormRouteArgs buildNewFormRouteArgs() + +SurveyQuestionFormRouteArgs buildFormRouteArgs() + +MeasurementSurveyFormViewModel createDuplicate() - - - - + + + + + - - - StandardTableColumn + + + SurveyPreview - - - +label: String - +tooltip: String? - +columnWidth: TableColumnWidth - +sortable: bool - +sortAscending: bool? - +sortableIcon: Widget? + + + +routeArgs: MeasurementFormRouteArgs - - - - - - - - TableColumnWidth + + + +Widget build() - - - - + + + + + - - - StandardTable + + + MeasurementSurveyFormData - - - +items: List<T> - +inputColumns: List<StandardTableColumn> - +onSelectItem: void Function(T) - +trailingActionsAt: List<ModelAction<dynamic>> Function(T, int)? - +trailingActionsMenuType: ActionMenuType? - +sortColumnPredicates: List<int Function(T, T)?>? - +pinnedPredicates: int Function(T, T)? - +headerRowBuilder: TableRow Function(BuildContext, List<StandardTableColumn>)? - +dataRowBuilder: TableRow Function(BuildContext, List<StandardTableColumn>)? - +inputTrailingActionsColumn: StandardTableColumn - +tableWrapper: Widget Function(Widget)? - +cellSpacing: double - +rowSpacing: double - +minRowHeight: double? - +showTableHeader: bool - +hideLeadingTrailingWhenEmpty: bool - +leadingWidget: Widget? - +trailingWidget: Widget? - +leadingWidgetSpacing: double? - +trailingWidgetSpacing: double? - +emptyWidget: Widget? - +rowStyle: StandardTableStyle - +disableRowInteractions: bool + + + +measurementId: String + +title: String + +introText: String? + +outroText: String? + +questionnaireFormData: QuestionnaireFormData + <static>+kDefaultTitle: String + +id: String - - - - - - - - List<ModelAction<dynamic>> Function(T, int)? + + + +QuestionnaireTask toQuestionnaireTask() + +MeasurementSurveyFormData copy() - - - - - - - - ActionMenuType - - + + + + + - - - +index: int - <static>+values: List<ActionMenuType> - <static>+inline: ActionMenuType - <static>+popup: ActionMenuType + + + QuestionnaireFormData - - - - - - - - int Function(T, T)? + + + +questionsData: List<QuestionFormData>? + +id: String - - - - - - - - TableRow Function(BuildContext, List<StandardTableColumn>)? + + + +StudyUQuestionnaire toQuestionnaire() + +List<EligibilityCriterion> toEligibilityCriteria() + +QuestionnaireFormData copy() - - - + + + + + - - - Widget Function(Widget)? + + + WithQuestionnaireControls - - - - - - - - - StandardTableStyle + + + +questionsArray: FormArray<dynamic> + +questionFormViewModels: FormViewModelCollection<Q, QuestionFormData> + +questionnaireControls: Map<String, FormArray<dynamic>> + +propagateOnSave: bool + +questionModels: List<Q> + +questionTitles: Map<FormMode, String Function()> - - - +index: int - <static>+values: List<StandardTableStyle> - <static>+plain: StandardTableStyle - <static>+material: StandardTableStyle + + + +void setQuestionnaireControlsFrom() + +QuestionnaireFormData buildQuestionnaireFormData() + +void read() + +void onCancel() + +dynamic onSave() + +Q provide() + +Q provideQuestionFormViewModel() - - - - - - - - - HelpIcon - - + + + + - - - +tooltipText: String? + + + StudyDesignMeasurementsFormView - - - +Widget build() + + + +Widget build() - - - - - + + + + + - - - ErrorPage + + + MeasurementsFormViewModel - - - +error: Exception? + + + +study: Study + +router: GoRouter + +measurementsArray: FormArray<dynamic> + +surveyMeasurementFormViewModels: FormViewModelCollection<MeasurementSurveyFormViewModel, MeasurementSurveyFormData> + +form: FormGroup + +measurementViewModels: List<MeasurementSurveyFormViewModel> + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +measurementRequired: dynamic + +titles: Map<FormMode, String> - - - +Widget build() + + + +void read() + +void setControlsFrom() + +MeasurementsFormData buildFormData() + +List<ModelAction<dynamic>> availableActions() + +List<ModelAction<dynamic>> availablePopupActions() + +List<ModelAction<dynamic>> availableInlineActions() + +void onSelectItem() + +void onNewItem() + +MeasurementSurveyFormViewModel provide() + +void onCancel() + +dynamic onSave() - - - - + + + + + - - - SplashPage + + + StudyFormScaffold - - - +Widget build() + + + +studyId: String + +formViewModelBuilder: T Function(WidgetRef) + +formViewBuilder: Widget Function(T) - - - - - - - - - - IconPack + + + +Widget build() - - - <static>+defaultPack: List<IconOption> - <static>+material: List<IconOption> - - + + + + - - - <static>+IconOption? resolveIconByName() + + + T Function(WidgetRef) - - - - - + + + + + - - - IconOption + + + ConsentItemFormViewModel - - - +name: String - +icon: IconData? - +isEmpty: bool - +props: List<Object?> + + + +consentIdControl: FormControl<String> + +titleControl: FormControl<String> + +descriptionControl: FormControl<String> + +iconControl: FormControl<IconOption> + +form: FormGroup + +consentId: String + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titleRequired: dynamic + +descriptionRequired: dynamic + +titles: Map<FormMode, String> - - - +String toJson() - <static>+IconOption fromJson() + + + +void setControlsFrom() + +ConsentItemFormData buildFormData() + +ConsentItemFormViewModel createDuplicate() - - - + + + + - - - ReactiveIconPicker + + + StudyDesignEnrollmentFormView - - - - - - - - ReactiveFocusableFormField + + + +Widget build() + -dynamic _showScreenerQuestionSidesheetWithArgs() + -dynamic _showConsentItemSidesheetWithArgs() - - - - - - - - - IconPicker - - + + + + - - - +iconOptions: List<IconOption> - +selectedOption: IconOption? - +onSelect: void Function(IconOption)? - +galleryIconSize: double? - +selectedIconSize: double? - +focusNode: FocusNode? - +isDisabled: bool + + + IScreenerQuestionLogicFormViewModel - - - +Widget build() + + + +isDirtyOptionsBannerVisible: bool - - - + + + + + - - - void Function(IconOption)? + + + ScreenerQuestionLogicFormView - - - - + + + +formViewModel: ScreenerQuestionFormViewModel + + - - - FocusNode + + + +Widget build() + -dynamic _buildInfoBanner() + -dynamic _buildAnswerOptionsLogicControls() + -List<Widget> _buildOptionLogicRow() - - - - - + + + + + - - - IconPickerField + + + ScreenerQuestionFormViewModel - - - +iconOptions: List<IconOption> - +selectedOption: IconOption? - +selectedIconSize: double? - +galleryIconSize: double? - +onSelect: void Function(IconOption)? - +focusNode: FocusNode? - +isDisabled: bool + + + <static>+defaultResponseOptionValidity: bool + +responseOptionsDisabledArray: FormArray<dynamic> + +responseOptionsLogicControls: FormArray<bool> + +responseOptionsLogicDescriptionControls: FormArray<String> + -_questionBaseControls: Map<String, AbstractControl<dynamic>> + +prevResponseOptionControls: List<AbstractControl<dynamic>> + +prevResponseOptionValues: List<dynamic> + +responseOptionsDisabledControls: List<AbstractControl<dynamic>> + +logicControlOptions: List<FormControlOption<bool>> + +questionBaseControls: Map<String, AbstractControl<dynamic>> + +isDirtyOptionsBannerVisible: bool - - - +Widget build() + + + +dynamic onResponseOptionsChanged() + +void setControlsFrom() + +QuestionFormData buildFormData() + -List<FormControl<dynamic>> _copyFormControls() + -AbstractControl<dynamic>? _findAssociatedLogicControlFor() + -AbstractControl<dynamic>? _findAssociatedControlFor() + +ScreenerQuestionFormViewModel createDuplicate() - - - - - + + + + + - - - IconPickerGallery + + + ConsentItemFormData - - - +iconOptions: List<IconOption> - +onSelect: void Function(IconOption)? - +iconSize: double + + + +consentId: String + +title: String + +description: String + +iconName: String? + +id: String - - - +Widget build() + + + +ConsentItem toConsentItem() + +ConsentItemFormData copy() - - - - + + + + - - - FormSideSheetTab + + + ConsentItemFormView - - - +formViewBuilder: Widget Function(T) + + + +formViewModel: ConsentItemFormViewModel - - - - - - - - SidesheetTab - - + + + + + - - - +builder: Widget Function(BuildContext) + + + EnrollmentFormData - - - - - - - - - Sidesheet + + + <static>+kDefaultEnrollmentType: Participation + +enrollmentType: Participation + +questionnaireFormData: QuestionnaireFormData + +consentItemsFormData: List<ConsentItemFormData>? + +id: String - - - <static>+kDefaultWidth: double - +titleText: String - +body: Widget? - +tabs: List<SidesheetTab>? - +actionButtons: List<Widget>? - +width: double? - +withCloseButton: bool - +ignoreAppBar: bool - +collapseSingleTab: bool - +bodyPadding: EdgeInsets? - +wrapContent: Widget Function(Widget)? + + + +Study apply() + +EnrollmentFormData copy() - - - + + + + + - - - ReactiveCustomColorPicker + + + QuestionFormViewModel - - - - + + + <static>+defaultQuestionType: SurveyQuestionType + -_titles: Map<FormMode, String Function()>? + +questionIdControl: FormControl<String> + +questionTypeControl: FormControl<SurveyQuestionType> + +questionTextControl: FormControl<String> + +questionInfoTextControl: FormControl<String> + +questionBaseControls: Map<String, AbstractControl<dynamic>> + +isMultipleChoiceControl: FormControl<bool> + +choiceResponseOptionsArray: FormArray<dynamic> + +customOptionsMin: int + +customOptionsMax: int + +customOptionsInitial: int + +boolResponseOptionsArray: FormArray<String> + +imageResponseOptionsArray: FormArray<String> + <static>+kDefaultMaxRecordingDurationSeconds: int + <static>+kMaxRecordingDurationSeconds: int + +audioResponseOptionsArray: FormArray<String> + +maxRecordingDurationSecondsControl: FormControl<int> + <static>+kDefaultScaleMinValue: int + <static>+kDefaultScaleMaxValue: int + <static>+kNumMidValueControls: int + <static>+kMidValueDebounceMilliseconds: int + +scaleMinValueControl: FormControl<int> + +scaleMaxValueControl: FormControl<int> + -_scaleRangeControl: FormControl<int> + +scaleMinLabelControl: FormControl<String> + +scaleMaxLabelControl: FormControl<String> + +scaleMidValueControls: FormArray<int> + +scaleMidLabelControls: FormArray<String?> + -_scaleResponseOptionsArray: FormArray<int> + +scaleMinColorControl: FormControl<SerializableColor> + +scaleMaxColorControl: FormControl<SerializableColor> + +prevMidValues: List<int?>? + +freeTextTypeControl: FormControl<FreeTextQuestionType> + +customRegexControl: FormControl<String> + +freeTextResponseOptionsArray: FormArray<dynamic> + +freeTextLengthMin: AbstractControl<int> + +freeTextLengthMax: AbstractControl<int> + +freeTextExampleTextControl: FormControl<String> + <static>+kDefaultFreeTextMinLength: int + <static>+kDefaultFreeTextMaxLength: int + +freeTextLengthControl: FormControl<RangeValues> + -_controlsByQuestionType: Map<SurveyQuestionType, FormGroup> + -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + -_validationConfigsByQuestionType: Map<SurveyQuestionType, Map<FormValidationSetEnum, List<FormControlValidation>>> + +form: FormGroup + +questionId: String + +questionType: SurveyQuestionType + +questionTypeControlOptions: List<FormControlOption<SurveyQuestionType>> + +answerOptionsArray: FormArray<dynamic> + +answerOptionsControls: List<AbstractControl<dynamic>> + +validAnswerOptions: List<String> + +boolOptions: List<AbstractControl<String>> + +imageOptions: List<AbstractControl<String>> + +audioOptions: List<AbstractControl<String>> + +scaleMinValue: int + +scaleMaxValue: int + +scaleRange: int + +scaleAllValueControls: List<AbstractControl<int>> + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +questionTextRequired: dynamic + +numValidChoiceOptions: dynamic + +scaleRangeValid: dynamic + +maxRecordingDurationValid: dynamic + +titles: Map<FormMode, String> + +isAddOptionButtonVisible: bool + +isMidValuesClearedInfoVisible: bool + + - - - ReactiveFormField + + + +String? scaleMidLabelAt() + -dynamic _onScaleRangeChanged() + -dynamic _applyInputFormatters() + -dynamic _updateScaleMidValueControls() + -Map<String, dynamic>? _validateFreeText() + -dynamic _onFreeTextLengthChanged() + -List<FormControlValidation> _getValidationConfig() + +dynamic onQuestionTypeChanged() + +dynamic onResponseOptionsChanged() + -void _updateFormControls() + +void initControls() + +void setControlsFrom() + +QuestionFormData buildFormData() + +List<ModelAction<dynamic>> availableActions() + +void onNewItem() + +void onSelectItem() + +dynamic save() + +QuestionFormViewModel createDuplicate() - - - - - + + + + + - - - TextParagraph + + + EnrollmentFormViewModel - - - +text: String? - +style: TextStyle? - +selectable: bool - +span: List<TextSpan>? + + + +study: Study + +router: GoRouter + +consentItemDelegate: EnrollmentFormConsentItemDelegate + +enrollmentTypeControl: FormControl<Participation> + +consentItemArray: FormArray<dynamic> + +consentItemFormViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData> + +form: FormGroup + +enrollmentTypeControlOptions: List<FormControlOption<Participation>> + +consentItemModels: List<ConsentItemFormViewModel> + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titles: Map<FormMode, String> + +canTestScreener: bool + +canTestConsent: bool + +questionTitles: Map<FormMode, String Function()> - - - +Widget build() + + + +void setControlsFrom() + +EnrollmentFormData buildFormData() + +void read() + +List<ModelAction<dynamic>> availableActions() + +List<ModelAction<dynamic>> availablePopupActions() + +List<ModelAction<dynamic>> availableInlineActions() + +void onSelectItem() + +void onNewItem() + +ScreenerQuestionFormRouteArgs buildNewScreenerQuestionFormRouteArgs() + +ScreenerQuestionFormRouteArgs buildScreenerQuestionFormRouteArgs() + +ConsentItemFormRouteArgs buildNewConsentItemFormRouteArgs() + +ConsentItemFormRouteArgs buildConsentItemFormRouteArgs() + +dynamic testScreener() + +dynamic testConsent() + +ScreenerQuestionFormViewModel provideQuestionFormViewModel() - - - - - + + + + + - - - ConstrainedWidthFlexible + + + EnrollmentFormConsentItemDelegate - - - +minWidth: double - +maxWidth: double - +flex: int - +flexSum: int - +child: Widget - +outerConstraints: BoxConstraints + + + +formViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData> + +owner: EnrollmentFormViewModel + +propagateOnSave: bool + +validationSet: dynamic - - - +Widget build() - -double _getWidth() + + + +void onCancel() + +dynamic onSave() + +ConsentItemFormViewModel provide() + +List<ModelAction<dynamic>> availableActions() + +void onNewItem() + +void onSelectItem() - - - + + + + + - - - BoxConstraints + + + StudyFormViewModel - - - - - - - - - PrimaryButton + + + +studyDirtyCopy: Study? + +studyRepository: IStudyRepository + +authRepository: IAuthRepository + +router: GoRouter + +studyInfoFormViewModel: StudyInfoFormViewModel + +enrollmentFormViewModel: EnrollmentFormViewModel + +measurementsFormViewModel: MeasurementsFormViewModel + +reportsFormViewModel: ReportsFormViewModel + +interventionsFormViewModel: InterventionsFormViewModel + +form: FormGroup + +isStudyReadonly: bool + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titles: Map<FormMode, String> - - - +text: String - +icon: IconData? - +isLoading: bool - +showLoadingEarliestAfterMs: int - +onPressed: void Function()? - +tooltip: String - +tooltipDisabled: String - +enabled: bool - +onPressedFuture: dynamic Function()? - +innerPadding: EdgeInsets - +minimumSize: Size? - +isDisabled: bool + + + +void read() + +void setControlsFrom() + +Study buildFormData() + +void dispose() + +void onCancel() + +dynamic onSave() + -dynamic _applyAndSaveSubform() - - - + + + + + - - - dynamic Function()? + + + QuestionFormData - - - - - - - - Size + + + <static>+questionTypeFormDataFactories: Map<SurveyQuestionType, QuestionFormData Function(Question<dynamic>, List<EligibilityCriterion>)> + +questionId: String + +questionText: String + +questionInfoText: String? + +questionType: SurveyQuestionType + +responseOptionsValidity: Map<dynamic, bool> + +responseOptions: List<dynamic> + +id: String - - - - - - - - - - EmptyBody + + + +Question<dynamic> toQuestion() + +EligibilityCriterion toEligibilityCriterion() + +Answer<dynamic> constructAnswerFor() + +dynamic setResponseOptionsValidityFrom() + +QuestionFormData copy() - - - +icon: IconData? - +leading: Widget? - +leadingSpacing: double? - +title: String? - +description: String? - +button: Widget? + + + + + + + + + SurveyQuestionType - - - +Widget build() + + + +index: int + <static>+values: List<SurveyQuestionType> + <static>+choice: SurveyQuestionType + <static>+bool: SurveyQuestionType + <static>+scale: SurveyQuestionType + <static>+image: SurveyQuestionType + <static>+audio: SurveyQuestionType + <static>+freeText: SurveyQuestionType - - - - - + + + + + - - - Badge + + + ChoiceQuestionFormData - - - +icon: IconData? - +color: Color? - +borderRadius: double - +label: String - +type: BadgeType - +padding: EdgeInsets - +iconSize: double? - +labelStyle: TextStyle? - +center: bool + + + +isMultipleChoice: bool + +answerOptions: List<String> + +responseOptions: List<String> - - - +Widget build() - -Color? _getBackgroundColor() - -Color _getBorderColor() - -Color? _getLabelColor() + + + +Question<dynamic> toQuestion() + +QuestionFormData copy() + -Choice _buildChoiceForValue() + +Answer<dynamic> constructAnswerFor() - - - + + + + + - - - NullHelperDecoration + + + BoolQuestionFormData - - - - + + + <static>+kResponseOptions: Map<String, bool> + +responseOptions: List<String> + + - - - InputDecoration + + + +Question<dynamic> toQuestion() + +BoolQuestionFormData copy() + +Answer<dynamic> constructAnswerFor() - - - - + + + + + - - - Collapsible + + + ImageQuestionFormData - - - +contentBuilder: Widget Function(BuildContext, bool) - +headerBuilder: Widget Function(BuildContext, bool)? - +title: String? - +isCollapsed: bool + + + <static>+kResponseOptions: Map<String, FutureBlobFile> + +responseOptions: List<String> + + + + + + +Question<dynamic> toQuestion() + +ImageQuestionFormData copy() + +Answer<dynamic> constructAnswerFor() - - - + + + + + - - - Widget Function(BuildContext, bool) + + + AudioQuestionFormData - - - - + + + +maxRecordingDurationSeconds: int + <static>+kResponseOptions: Map<String, FutureBlobFile> + +responseOptions: List<String> + + - - - Widget Function(BuildContext, bool)? + + + +Question<dynamic> toQuestion() + +AudioQuestionFormData copy() + +Answer<dynamic> constructAnswerFor() - - - - - + + + + + - - - ActionMenuInline + + + ScaleQuestionFormData - - - +actions: List<ModelAction<dynamic>> - +iconSize: double? - +visible: bool - +splashRadius: double? - +paddingVertical: double? - +paddingHorizontal: double? + + + +minValue: double + +maxValue: double + +minLabel: String? + +maxLabel: String? + +midValues: List<double?> + +midLabels: List<String?> + +stepSize: double + +initialValue: double? + +minColor: Color? + +maxColor: Color? + +responseOptions: List<double> + +midAnnotations: List<Annotation> - - - +Widget build() + + + +ScaleQuestion toQuestion() + +QuestionFormData copy() + +Answer<dynamic> constructAnswerFor() - - - - - + + + + + - - - StudyULogo + + + FreeTextQuestionFormData - - - +onTap: void Function()? + + + +textLengthRange: List<int> + +textType: FreeTextQuestionType + +textTypeExpression: String? + +responseOptions: List<String> - - - +Widget build() + + + +Question<dynamic> toQuestion() + +FreeTextQuestionFormData copy() + +Answer<dynamic> constructAnswerFor() - - - - - - - - TabbedNavbar - - + + + - - - +tabs: List<T> - +selectedTab: T? - +indicator: BoxDecoration? - +height: double? - +disabledBackgroundColor: Color? - +disabledTooltipText: String? - +onSelect: void Function(int, T)? - +labelPadding: EdgeInsets? - +labelSpacing: double? - +indicatorSize: TabBarIndicatorSize? - +isScrollable: bool - +backgroundColor: Color? - +labelColorHover: Color? - +unselectedLabelColorHover: Color? + + + FreeTextQuestionType - - - + + + + + - - - BoxDecoration + + + AudioRecordingQuestionFormView - - - - - - - - void Function(int, T)? + + + +formViewModel: QuestionFormViewModel - - - - - - - - TabBarIndicatorSize + + + +Widget build() - - - - - + + + + + - - - HtmlStylingBanner + + + FreeTextQuestionFormView - - - +isDismissed: bool - +onDismissed: dynamic Function()? + + + +formViewModel: QuestionFormViewModel + +generateLabelHelpTextMap: dynamic - - - +Widget build() + + + +Widget build() + +Widget disableOnReadonly() + +Widget generateRow() - - - - - - - - ISyncIndicatorViewModel - - + + + + + - - - +isDirty: bool - +lastSynced: DateTime? + + + ImageCapturingQuestionFormView - - - - - - - - - SyncIndicator + + + +formViewModel: QuestionFormViewModel - - - +state: AsyncValue<T> - +lastSynced: DateTime? - +isDirty: bool - +animationDuration: int - +iconSize: double + + + +Widget build() - - - - + + + + - - - Search + + + IScaleQuestionFormViewModel - - - +onQueryChanged: dynamic Function(String) - +searchController: SearchController? - +hintText: String? - +initialText: String? + + + +isMidValuesClearedInfoVisible: bool - - - + + + + - - - dynamic Function(String) + + + ScaleQuestionFormView - - - - - - - - void Function(String) + + + +formViewModel: QuestionFormViewModel - - - - - + + + + + - - - SecondaryButton + + + ChoiceQuestionFormView - - - +text: String - +icon: IconData? - +isLoading: bool - +onPressed: void Function()? + + + +formViewModel: QuestionFormViewModel - - - +Widget build() + + + +Widget build() - - - - + + + + + - - - FormTableRow + + + BoolQuestionFormView - - - +label: String? - +labelBuilder: Widget Function(BuildContext)? - +labelStyle: TextStyle? - +labelHelpText: String? - +input: Widget - +control: AbstractControl<dynamic>? - +layout: FormTableRowLayout? + + + +formViewModel: QuestionFormViewModel - - - - - - - - Widget Function(BuildContext)? + + + +Widget build() - - - - + + + + - - - FormTableRowLayout + + + SurveyQuestionFormView - - - +index: int - <static>+values: List<FormTableRowLayout> - <static>+vertical: FormTableRowLayout - <static>+horizontal: FormTableRowLayout + + + +formViewModel: QuestionFormViewModel + +isHtmlStyleable: bool - - - - - + + + - - - FormTableLayout + + + StudyUTimeOfDay - - - +rows: List<FormTableRow> - +columnWidths: Map<int, TableColumnWidth> - +rowDivider: Widget? - +rowLayout: FormTableRowLayout? - +rowLabelStyle: TextStyle? + + + + + + + + + + ScheduleControls - - - +Widget build() + + + +formViewModel: WithScheduleControls - - - - - - - - - - FormSectionHeader + + + +Widget build() + -List<FormTableRow> _conditionalTimeRestrictions() - - - +title: String - +titleTextStyle: TextStyle? - +helpText: String? - +divider: bool - +helpTextDisabled: bool + + + + + + + + + StudiesTableColumnHeader - - - +Widget build() + + + +title: String + +sortable: bool + +sortAscending: bool + +sortingActive: bool + +onSort: void Function()? - - - - - - - - - FormLabel - - + + + + - - - +labelText: String? - +helpText: String? - +labelTextStyle: TextStyle? - +layout: FormTableRowLayout? + + + DashboardScreen - - - +Widget build() + + + +filter: StudiesFilter? - - - - + + + + - - - MouseEventsRegion + + + StudiesFilter - - - +onTap: void Function()? - +onHover: void Function(PointerHoverEvent)? - +onEnter: void Function(PointerEnterEvent)? - +onExit: void Function(PointerExitEvent)? - +autoselectCursor: bool - +cursor: SystemMouseCursor - <static>+defaultCursor: SystemMouseCursor - +autoCursor: SystemMouseCursor + + + +index: int + <static>+values: List<StudiesFilter> - - - + + + + + - - - void Function(PointerHoverEvent)? + + + DashboardScaffold + + + + + + <static>+compactWidthThreshold: double + +body: Widget - - - - - - - - void Function(PointerEnterEvent)? + + + +Widget build() - - - + + + + + - - - void Function(PointerExitEvent)? + + + DashboardController - - - - + + + +studyRepository: IStudyRepository + +authRepository: IAuthRepository + +userRepository: IUserRepository + +router: GoRouter + -_studiesSubscription: StreamSubscription<List<WrappedModel<Study>>>? + +searchController: SearchController + +isSortAscending: bool + + - - - SystemMouseCursor + + + -dynamic _subscribeStudies() + +dynamic setSearchText() + +dynamic setStudiesFilter() + +dynamic onSelectStudy() + +dynamic onClickNewStudy() + +dynamic pinStudy() + +dynamic pinOffStudy() + +void setSorting() + +void filterStudies() + +void sortStudies() + +bool isSortingActiveForColumn() + +bool isPinned() + +List<ModelAction<dynamic>> availableActions() + +void dispose() - - - - - + + + + + - - - FormControlLabel + + + IUserRepository - - - +formControl: AbstractControl<dynamic> - +text: String - +isClickable: bool - +textStyle: TextStyle? - +onClick: void Function(AbstractControl<dynamic>)? + + + +user: StudyUUser - - - +Widget build() + + + +dynamic fetchUser() + +dynamic saveUser() + +dynamic updatePreferences() - - - + + + + + - - - void Function(AbstractControl<dynamic>)? + + + StudiesTableColumnSize - - - - - - - - - - SingleColumnLayout + + + +collapsed: bool + +flex: int? + +width: double? - - - <static>+defaultConstraints: BoxConstraints - <static>+defaultConstraintsNarrow: BoxConstraints - +body: Widget - +header: Widget? - +stickyHeader: bool - +constraints: BoxConstraints? - +scroll: bool - +padding: EdgeInsets? + + + +Widget createContainer() - - - <static>+dynamic fromType() + + + + + + + + + + StudiesTable - - - - - - - - - TwoColumnLayout + + + +itemHeight: double + +itemPadding: double + +rowSpacing: double + +columnSpacing: double + +compactWidthThreshold: double + +superCompactWidthThreshold: double + +compactStatTitleThreshold: double + +studies: List<Study> + +onSelect: void Function(Study) + +getActions: List<ModelAction<dynamic>> Function(Study) + +emptyWidget: Widget + +pinnedStudies: Iterable<String> + +dashboardController: DashboardController - - - <static>+defaultDivider: VerticalDivider - <static>+defaultContentPadding: EdgeInsets - <static>+slimContentPadding: EdgeInsets - +leftWidget: Widget - +rightWidget: Widget - +dividerWidget: Widget? - +headerWidget: Widget? - +flexLeft: int? - +flexRight: int? - +constraintsLeft: BoxConstraints? - +constraintsRight: BoxConstraints? - +scrollLeft: bool - +scrollRight: bool - +paddingLeft: EdgeInsets? - +paddingRight: EdgeInsets? - +backgroundColorLeft: Color? - +backgroundColorRight: Color? - +stretchHeight: bool + + + +Widget build() + -Widget _buildColumnHeader() - - - + + + - - - VerticalDivider + + + void Function(Study) - - - - + + + - - - UnderConstruction + + + List<ModelAction<dynamic>> Function(Study) - - - +Widget build() + + + + + + + + + StudiesTableColumn - - - - - - - - - - StandardDialog + + + +index: int + <static>+values: List<StudiesTableColumn> + <static>+pin: StudiesTableColumn + <static>+title: StudiesTableColumn + <static>+status: StudiesTableColumn + <static>+participation: StudiesTableColumn + <static>+createdAt: StudiesTableColumn + <static>+enrolled: StudiesTableColumn + <static>+active: StudiesTableColumn + <static>+completed: StudiesTableColumn + <static>+action: StudiesTableColumn - - - +title: Widget? - +titleText: String? - +body: Widget - +actionButtons: List<Widget> - +backgroundColor: Color? - +borderRadius: double? - +width: double? - +height: double? - +minWidth: double - +minHeight: double - +maxWidth: double? - +maxHeight: double? - +padding: EdgeInsets + + + + + + + + + StudiesTableItem - - - +Widget build() + + + +study: Study + +itemHeight: double + +itemPadding: double + +rowSpacing: double + +columnSpacing: double + +actions: List<ModelAction<dynamic>> + +columnSizes: List<StudiesTableColumnSize> + +isPinned: bool + +onPinnedChanged: void Function(Study, bool)? + +onTap: void Function(Study)? - - - - - + + + - - - IndicatorRangeSliderThumbShape + + + void Function(Study, bool)? - - - +buildContext: BuildContext - +start: T - +end: T - - + + + + - - - +Size getPreferredSize() - +void paint() + + + void Function(Study)? - - - + + + - - - BuildContext + + + App - - - - + + + + - - - RangeSliderThumbShape + + + AppContent - - - - + + + + - - - BannerBox + + + AccountSettingsDialog - - - +prefixIcon: Widget? - +body: Widget - +style: BannerStyle - +padding: EdgeInsets? - +noPrefix: bool - +dismissable: bool - +isDismissed: bool? - +onDismissed: dynamic Function()? - +dismissIconSize: double + + + +Widget build() - - - - + + + + + - - - BannerStyle + + + ModelRepository - - - +index: int - <static>+values: List<BannerStyle> - <static>+warning: BannerStyle - <static>+info: BannerStyle - <static>+error: BannerStyle + + + +delegate: IModelRepositoryDelegate<T> + -_allModelsStreamController: BehaviorSubject<List<WrappedModel<T>>> + -_allModelEventsStreamController: BehaviorSubject<ModelEvent<T>> + +modelStreamControllers: Map<String, BehaviorSubject<WrappedModel<T>>> + +modelEventsStreamControllers: Map<String, BehaviorSubject<ModelEvent<T>>> + -_allModels: Map<String, WrappedModel<T>> + + + + + + +WrappedModel<T>? get() + +dynamic fetchAll() + +dynamic fetch() + +dynamic save() + +dynamic delete() + +dynamic duplicateAndSave() + +dynamic duplicateAndSaveFromRemote() + +Stream<List<WrappedModel<T>>> watchAll() + +Stream<WrappedModel<T>> watch() + +Stream<ModelEvent<T>> watchAllChanges() + +Stream<ModelEvent<T>> watchChanges() + -dynamic _buildModelSpecificController() + +dynamic ensurePersisted() + +WrappedModel<T> upsertLocally() + +List<WrappedModel<T>> upsertAllLocally() + +dynamic emitUpdate() + +dynamic emitModelEvent() + +dynamic emitError() + +void dispose() + +List<ModelAction<dynamic>> availableActions() - - - - - + + + + + - - - ActionPopUpMenuButton + + + InviteCodeRepository - - - +actions: List<ModelAction<dynamic>> - +triggerIconColor: Color? - +triggerIconColorHover: Color? - +triggerIconSize: double - +disableSplashEffect: bool - +hideOnEmpty: bool - +orientation: Axis - +elevation: double? - +splashRadius: double? - +enabled: bool - +position: PopupMenuPosition + + + +studyId: String + +ref: ProviderRef<dynamic> + +apiClient: StudyUApi + +authRepository: IAuthRepository + +studyRepository: IStudyRepository + +study: Study - - - +Widget build() - -Widget _buildPopupMenu() + + + +String getKey() + +dynamic isCodeAlreadyUsed() + +List<ModelAction<dynamic>> availableActions() + +dynamic emitUpdate() - - - + + + - - - Axis + + + ProviderRef - - - + + + + - - - PopupMenuPosition + + + StudyUApi + + + + + + +dynamic saveStudy() + +dynamic fetchStudy() + +dynamic getUserStudies() + +dynamic deleteStudy() + +dynamic saveStudyInvite() + +dynamic fetchStudyInvite() + +dynamic deleteStudyInvite() + +dynamic deleteParticipants() + +dynamic fetchAppConfig() + +dynamic fetchUser() + +dynamic saveUser() - - - - - + + + + + - - - DismissButton + + + InviteCodeRepositoryDelegate - - - +onPressed: void Function()? - +text: String? + + + +study: Study + +apiClient: StudyUApi + +studyRepository: IStudyRepository - - - +Widget build() + + + +dynamic fetch() + +dynamic fetchAll() + +dynamic save() + +dynamic delete() + +dynamic onError() + +StudyInvite createDuplicate() + +StudyInvite createNewInstance() - - - - + + + + - - - FormScaffold + + + IModelRepositoryDelegate - - - +formViewModel: T - +actions: List<Widget>? - +body: Widget - +drawer: Widget? - +actionsSpacing: double - +actionsPadding: double + + + +dynamic fetchAll() + +dynamic fetch() + +dynamic save() + +dynamic delete() + +T createNewInstance() + +T createDuplicate() + +dynamic onError() - - - - - + + + + + - - - AsyncValueWidget + + + StudyRepository - - - +value: AsyncValue<T> - +data: Widget Function(T) - +error: Widget Function(Object, StackTrace?)? - +loading: Widget Function()? - +empty: Widget Function()? + + + +apiClient: StudyUApi + +authRepository: IAuthRepository + +ref: ProviderRef<dynamic> + +sortCallback: void Function()? - - - +Widget build() - -Widget _buildDataOrEmptyWidget() - -Widget _defaultError() - -Widget _defaultLoad() + + + +String getKey() + +dynamic deleteParticipants() + +dynamic launch() + +List<ModelAction<dynamic>> availableActions() - - - + + + + + - - - Widget Function(Object, StackTrace?)? + + + StudyRepositoryDelegate + + + + + + +apiClient: StudyUApi + +authRepository: IAuthRepository + + + + + + +dynamic fetchAll() + +dynamic fetch() + +dynamic save() + +dynamic delete() + +dynamic onError() + +Study createNewInstance() + +Study createDuplicate() - - - + + + - - - Widget Function()? + + + APIException - - - + + + - - - ResultTypes + + + StudyNotFoundException - - - - + + + - - - MeasurementResultTypes + + + MeasurementNotFoundException - - - <static>+questionnaire: String - <static>+values: List<String> + + + + + + + + QuestionNotFoundException - - - - + + + - - - InterventionResultTypes + + + ConsentItemNotFoundException - - - <static>+checkmarkTask: String - <static>+values: List<String> + + + + + + + + InterventionNotFoundException - - - - + + + - - - StudyExportData + + + InterventionTaskNotFoundException - - - +study: Study - +measurementsData: List<Map<String, dynamic>> - +interventionsData: List<Map<String, dynamic>> - +mediaData: List<String> - +isEmpty: bool + + + + + + + + ReportNotFoundException - - - - - + + + - - - StudyTemplates + + + ReportSectionNotFoundException - - - <static>+kUnnamedStudyTitle: String - - + + + + - - - <static>+Study emptyDraft() + + + StudyInviteNotFoundException - - - - + + + - - - StudyActionType + + + UserNotFoundException - - - +index: int - <static>+values: List<StudyActionType> - <static>+pin: StudyActionType - <static>+pinoff: StudyActionType - <static>+edit: StudyActionType - <static>+duplicate: StudyActionType - <static>+duplicateDraft: StudyActionType - <static>+addCollaborator: StudyActionType - <static>+export: StudyActionType - <static>+delete: StudyActionType + + + + + + + + + + StudyUApiClient - - - - - - - - - DropdownMenuItemTheme + + + +supabaseClient: SupabaseClient + <static>+studyColumns: List<String> + <static>+studyWithParticipantActivityColumns: List<String> + +testDelayMilliseconds: int - - - +iconTheme: IconThemeData? + + + +dynamic deleteParticipants() + +dynamic getUserStudies() + +dynamic fetchStudy() + +dynamic deleteStudy() + +dynamic saveStudy() + +dynamic fetchStudyInvite() + +dynamic saveStudyInvite() + +dynamic deleteStudyInvite() + +dynamic fetchAppConfig() + +dynamic fetchUser() + +dynamic saveUser() + -dynamic _awaitGuarded() + -dynamic _apiException() + -dynamic _testDelay() - - - + + + - - - IconThemeData + + + SupabaseClient - - - + + + + - - - Diagnosticable + + + SupabaseClientDependant - - - - - - - - - - ThemeConfig + + + +supabaseClient: SupabaseClient - - - <static>+kMinContentWidth: double - <static>+kMaxContentWidth: double - <static>+kHoverFadeFactor: double - <static>+kMuteFadeFactor: double + + + + + + + + + SupabaseQueryMixin - - - <static>+dynamic bodyBackgroundColor() - <static>+Color modalBarrierColor() - <static>+Color containerColor() - <static>+Color colorPickerInitialColor() - <static>+TextStyle bodyTextMuted() - <static>+TextStyle bodyTextBackground() - <static>+double iconSplashRadius() - <static>+Color sidesheetBackgroundColor() - <static>+InputDecorationTheme dropdownInputDecorationTheme() - <static>+DropdownMenuItemTheme dropdownMenuItemTheme() + + + +dynamic deleteAll() + +dynamic getAll() + +dynamic getById() + +dynamic getByColumn() + +List<T> deserializeList() + +T deserializeObject() - - - - + + + + - - - NoAnimationPageTransitionsBuilder + + + IAppRepository - - - +Widget buildTransitions() + + + +dynamic fetchAppConfig() + +void dispose() - - - + + + + + - - - PageTransitionsBuilder + + + AppRepository - - - - - - - - - WebTransitionBuilder + + + +apiClient: StudyUApi - - - +Widget buildTransitions() + + + +dynamic fetchAppConfig() + +void dispose() - - - - - - - - ThemeSettingChange - - + + + - - - +settings: ThemeSettings + + + StudyUUser - - - - + + + + + - - - ThemeSettings + + + UserRepository - - - +sourceColor: Color - +themeMode: ThemeMode + + + +apiClient: StudyUApi + +authRepository: IAuthRepository + +ref: Ref<Object?> + +user: StudyUUser - - - - - - - - Notification + + + +dynamic fetchUser() + +dynamic saveUser() + +dynamic updatePreferences() - - - - - + + + - - - ThemeProvider + + + Ref - - - +settings: ValueNotifier<ThemeSettings> - +lightDynamic: ColorScheme? - +darkDynamic: ColorScheme? - +pageTransitionsTheme: PageTransitionsTheme - +shapeMedium: ShapeBorder + + + + + + + + + PreferenceAction - - - +Color custom() - +Color blend() - +Color source() - +ColorScheme colors() - +CardTheme cardTheme() - +ListTileThemeData listTileTheme() - +AppBarTheme appBarTheme() - +SnackBarThemeData snackBarThemeData() - +TabBarTheme tabBarTheme() - +BottomAppBarTheme bottomAppBarTheme() - +BottomNavigationBarThemeData bottomNavigationBarTheme() - +SwitchThemeData switchTheme() - +InputDecorationTheme inputDecorationTheme() - +TextTheme textTheme() - +DividerThemeData dividerTheme() - +NavigationRailThemeData navigationRailTheme() - +DrawerThemeData drawerTheme() - +IconThemeData iconTheme() - +CheckboxThemeData checkboxTheme() - +RadioThemeData radioTheme() - +TooltipThemeData tooltipTheme() - +ThemeData light() - +ThemeData dark() - +ThemeMode themeMode() - +ThemeData theme() - <static>+ThemeProvider of() - +bool updateShouldNotify() + + + +index: int + <static>+values: List<PreferenceAction> + <static>+pin: PreferenceAction + <static>+pinOff: PreferenceAction - - - + + + - - - ValueNotifier + + + User - - - + + + - - - ColorScheme + + + Session - - - + + + + + - - - PageTransitionsTheme + + + AuthRepository - - - - - - - - ShapeBorder + + + +supabaseClient: SupabaseClient + +allowPasswordReset: bool + +authClient: GoTrueClient + +session: Session? + +serializedSession: String? + +currentUser: User? + +isLoggedIn: bool - - - - - - - - InheritedWidget + + + -void _registerAuthListener() + +dynamic signUp() + +dynamic signInWith() + +dynamic signOut() + +dynamic resetPasswordForEmail() + +dynamic updateUser() + +void dispose() + +dynamic onAppStart() - - - + + + - - - ThemeMode + + + GoTrueClient - - - - - + + + - - - CustomColor + + + StudyLaunched - - - +name: String - +color: Color - +blend: bool + + + + + + + + + ModelEvent - - - +Color value() + + + +modelId: String + +model: T - - - - + + + + - - - LanguagePicker + + + SupabaseQueryError - - - +languagePickerType: LanguagePickerType - +iconColor: Color? - +offset: Offset? + + + +statusCode: String? + +message: String + +details: dynamic - - - - + + + + + - - - LanguagePickerType + + + WrappedModel - - - +index: int - <static>+values: List<LanguagePickerType> - <static>+field: LanguagePickerType - <static>+icon: LanguagePickerType + + + -_model: T + +asyncValue: AsyncValue<T> + +isLocalOnly: bool + +isDirty: bool + +isDeleted: bool + +lastSaved: DateTime? + +lastFetched: DateTime? + +lastUpdated: DateTime? + +model: T - - - - - - - - Offset + + + +dynamic markWithError() + +dynamic markAsLoading() + +dynamic markAsFetched() + +dynamic markAsSaved() - - - - + + + - - - PlatformLocaleMobile + + + ModelRepositoryException - - - +Locale getPlatformLocale() + + + + + + + + ModelNotFoundException - - - - + + + + - - - PlatformLocale + + + IModelRepository - - - +Locale getPlatformLocale() + + + +String getKey() + +WrappedModel<T>? get() + +dynamic fetchAll() + +dynamic fetch() + +dynamic save() + +dynamic delete() + +dynamic duplicateAndSave() + +dynamic duplicateAndSaveFromRemote() + +Stream<WrappedModel<T>> watch() + +Stream<List<WrappedModel<T>>> watchAll() + +Stream<ModelEvent<T>> watchChanges() + +Stream<ModelEvent<T>> watchAllChanges() + +dynamic ensurePersisted() + +void dispose() - - - - + + + - - - PlatformLocaleWeb + + + IsFetched - - - +Locale getPlatformLocale() + + + + + + + + IsSaving - - - - + + + - - - AppTranslation + + + IsSaved - - - <static>+dynamic init() + + + + + + + + IsDeleted From 396ca07c4036de580628499f3a52b9903099b551 Mon Sep 17 00:00:00 2001 From: Johannes Vedder Date: Thu, 25 Apr 2024 15:03:43 +0200 Subject: [PATCH 019/314] chore: upgrade deps --- app/pubspec.lock | 28 ++++++++++++++-------------- app/pubspec.yaml | 10 +++++----- core/pubspec.lock | 12 ++++++------ core/pubspec.yaml | 6 +++--- designer_v2/pubspec.lock | 12 ++++++------ designer_v2/pubspec.yaml | 6 +++--- flutter_common/pubspec.lock | 8 ++++---- flutter_common/pubspec.yaml | 2 +- pubspec.lock | 4 ++-- pubspec.yaml | 2 +- 10 files changed, 45 insertions(+), 45 deletions(-) diff --git a/app/pubspec.lock b/app/pubspec.lock index 9a97219fb..7d2100ae0 100644 --- a/app/pubspec.lock +++ b/app/pubspec.lock @@ -338,10 +338,10 @@ packages: dependency: "direct main" description: name: flutter_local_notifications - sha256: a701df4866f9a38bb8e4450a54c143bbeeb0ce2381e7df5a36e1006f3b43bb28 + sha256: "8cdc719114ab1c86c64bb7a86d3a679674c3637edd229e3a994797d4a1504ce4" url: "https://pub.dev" source: hosted - version: "17.0.1" + version: "17.1.0" flutter_local_notifications_linux: dependency: transitive description: @@ -354,10 +354,10 @@ packages: dependency: transitive description: name: flutter_local_notifications_platform_interface - sha256: "7cf643d6d5022f3baed0be777b0662cce5919c0a7b86e700299f22dc4ae660ef" + sha256: "340abf67df238f7f0ef58f4a26d2a83e1ab74c77ab03cd2b2d5018ac64db30b7" url: "https://pub.dev" source: hosted - version: "7.0.0+1" + version: "7.1.0" flutter_localizations: dependency: "direct main" description: flutter @@ -593,10 +593,10 @@ packages: dependency: transitive description: name: json_annotation - sha256: b10a7b2ff83d83c777edba3c6a0f97045ddadd56c944e1a23a3fdf43a1bf4467 + sha256: "1ce844379ca14835a50d2f019a3099f419082cfdd231cd86a142af94dd5c6bb1" url: "https://pub.dev" source: hosted - version: "4.8.1" + version: "4.9.0" just_audio: dependency: transitive description: @@ -1033,26 +1033,26 @@ packages: dependency: transitive description: name: sentry - sha256: "19a267774906ca3a3c4677fc7e9582ea9da79ae9a28f84bbe4885dac2c269b70" + sha256: "961630a4dba41cebd692612421fd3805a991ebd8ef4a8d84a6c179e6b89eaf22" url: "https://pub.dev" source: hosted - version: "7.20.0" + version: "8.0.0" sentry_flutter: dependency: "direct main" description: name: sentry_flutter - sha256: "2d2917f7d795167e33a790db9bc5e1104d2035569ecf83e09a3f491bc6978cfe" + sha256: "705da7adfcd1fb23fc8720b6e222f5e03d53f1d020cd635586c319ee323366b4" url: "https://pub.dev" source: hosted - version: "7.20.0" + version: "8.0.0" sentry_logging: dependency: "direct main" description: name: sentry_logging - sha256: "73002a2d4baec71f34e6e775223780279c005644fcd3422127d8802aaed8f86d" + sha256: "136751f7d0428b89267fb0c5d20308cb6237148930ce3a5ff9f82c069a9ea793" url: "https://pub.dev" source: hosted - version: "7.20.0" + version: "8.0.0" shared_preferences: dependency: "direct main" description: @@ -1252,10 +1252,10 @@ packages: dependency: "direct main" description: name: timezone - sha256: "1cfd8ddc2d1cfd836bc93e67b9be88c3adaeca6f40a00ca999104c30693cdca0" + sha256: a6ccda4a69a442098b602c44e61a1e2b4bf6f5516e875bbf0f427d5df14745d5 url: "https://pub.dev" source: hosted - version: "0.9.2" + version: "0.9.3" typed_data: dependency: transitive description: diff --git a/app/pubspec.yaml b/app/pubspec.yaml index 655d7ebab..608fbd9ef 100644 --- a/app/pubspec.yaml +++ b/app/pubspec.yaml @@ -16,7 +16,7 @@ dependencies: flutter: sdk: flutter flutter_file_dialog: ^3.0.2 - flutter_local_notifications: ^17.0.1 + flutter_local_notifications: ^17.1.0 flutter_localizations: sdk: flutter flutter_timezone: ^1.0.8 @@ -26,7 +26,7 @@ dependencies: intersperse: ^2.0.0 intl: ^0.18.1 # flutter_localizations material_design_icons_flutter: ^7.0.7296 - package_info_plus: ^7.0.0 + package_info_plus: ^7.0.0 # wakelock_plus <= 1.2.4 path: ^1.9.0 path_provider: ^2.1.3 pdf: ^3.10.8 @@ -35,15 +35,15 @@ dependencies: quiver: ^3.2.1 rainbow_color: ^2.0.1 record: ^5.0.5 - sentry_flutter: ^7.20.0 - sentry_logging: ^7.20.0 + sentry_flutter: ^8.0.0 + sentry_logging: ^8.0.0 shared_preferences: ^2.2.3 studyu_core: ^4.4.1 studyu_flutter_common: ^1.8.2 supabase: ^2.1.1 supabase_flutter: ^2.5.1 timeline_tile: ^2.0.0 - timezone: ^0.9.2 + timezone: ^0.9.3 universal_html: ^2.2.4 url_launcher: ^6.2.6 uuid: ^4.4.0 diff --git a/core/pubspec.lock b/core/pubspec.lock index 358397574..f07c31977 100644 --- a/core/pubspec.lock +++ b/core/pubspec.lock @@ -269,18 +269,18 @@ packages: dependency: "direct main" description: name: json_annotation - sha256: b10a7b2ff83d83c777edba3c6a0f97045ddadd56c944e1a23a3fdf43a1bf4467 + sha256: "1ce844379ca14835a50d2f019a3099f419082cfdd231cd86a142af94dd5c6bb1" url: "https://pub.dev" source: hosted - version: "4.8.1" + version: "4.9.0" json_serializable: dependency: "direct dev" description: name: json_serializable - sha256: aa1f5a8912615733e0fdc7a02af03308933c93235bdc8d50d0b0c8a8ccb0b969 + sha256: ea1432d167339ea9b5bb153f0571d0039607a873d6e04e0117af043f14a1fd4b url: "https://pub.dev" source: hosted - version: "6.7.1" + version: "6.8.0" jwt_decode: dependency: transitive description: @@ -429,10 +429,10 @@ packages: dependency: "direct main" description: name: sentry - sha256: "19a267774906ca3a3c4677fc7e9582ea9da79ae9a28f84bbe4885dac2c269b70" + sha256: "961630a4dba41cebd692612421fd3805a991ebd8ef4a8d84a6c179e6b89eaf22" url: "https://pub.dev" source: hosted - version: "7.20.0" + version: "8.0.0" shelf: dependency: transitive description: diff --git a/core/pubspec.yaml b/core/pubspec.yaml index ca55b430d..e3019f053 100644 --- a/core/pubspec.yaml +++ b/core/pubspec.yaml @@ -10,15 +10,15 @@ environment: dependencies: collection: ^1.18.0 csv: ^6.0.0 - json_annotation: ^4.8.1 + json_annotation: ^4.9.0 logger: ^2.2.0 quiver: ^3.2.1 - sentry: ^7.20.0 + sentry: ^8.0.0 supabase: ^2.1.1 uuid: ^4.4.0 dev_dependencies: build_runner: ^2.4.9 - json_serializable: ^6.7.1 + json_serializable: ^6.8.0 lint: ^2.3.0 test: ^1.25.4 diff --git a/designer_v2/pubspec.lock b/designer_v2/pubspec.lock index 961564d98..dedbea596 100644 --- a/designer_v2/pubspec.lock +++ b/designer_v2/pubspec.lock @@ -387,10 +387,10 @@ packages: dependency: "direct main" description: name: go_router - sha256: "771c8feb40ad0ef639973d7ecf1b43d55ffcedb2207fd43fab030f5639e40446" + sha256: "28ef8a8320ab3bf5752424e6bca6961ce25108afc344f3127b5155caf7a792c8" url: "https://pub.dev" source: hosted - version: "13.2.4" + version: "14.0.0" gotrue: dependency: transitive description: @@ -480,10 +480,10 @@ packages: dependency: transitive description: name: json_annotation - sha256: b10a7b2ff83d83c777edba3c6a0f97045ddadd56c944e1a23a3fdf43a1bf4467 + sha256: "1ce844379ca14835a50d2f019a3099f419082cfdd231cd86a142af94dd5c6bb1" url: "https://pub.dev" source: hosted - version: "4.8.1" + version: "4.9.0" jwt_decode: dependency: transitive description: @@ -864,10 +864,10 @@ packages: dependency: transitive description: name: sentry - sha256: "19a267774906ca3a3c4677fc7e9582ea9da79ae9a28f84bbe4885dac2c269b70" + sha256: "961630a4dba41cebd692612421fd3805a991ebd8ef4a8d84a6c179e6b89eaf22" url: "https://pub.dev" source: hosted - version: "7.20.0" + version: "8.0.0" shared_preferences: dependency: transitive description: diff --git a/designer_v2/pubspec.yaml b/designer_v2/pubspec.yaml index 8731ccf78..e4b28a826 100644 --- a/designer_v2/pubspec.yaml +++ b/designer_v2/pubspec.yaml @@ -23,14 +23,14 @@ dependencies: flutter_riverpod: ^2.5.1 flutter_web_plugins: sdk: flutter - go_router: ^13.2.4 + go_router: ^14.0.0 material_color_utilities: material_design_icons_flutter: ^7.0.7296 pointer_interceptor: ^0.10.1 reactive_color_picker: ^2.0.0 - reactive_forms: ^16.1.1 + reactive_forms: ^16.1.1 # reactive_range_slider <= 2.0.0 reactive_multi_select_flutter: ^2.0.0 - reactive_range_slider: ^2.0.0 # reactive_forms <= 16.1.1 + reactive_range_slider: ^2.0.0 rxdart: ^0.27.7 studyu_core: ^4.4.1 studyu_flutter_common: ^1.8.2 diff --git a/flutter_common/pubspec.lock b/flutter_common/pubspec.lock index 1da42973a..b663c054c 100644 --- a/flutter_common/pubspec.lock +++ b/flutter_common/pubspec.lock @@ -228,10 +228,10 @@ packages: dependency: transitive description: name: json_annotation - sha256: b10a7b2ff83d83c777edba3c6a0f97045ddadd56c944e1a23a3fdf43a1bf4467 + sha256: "1ce844379ca14835a50d2f019a3099f419082cfdd231cd86a142af94dd5c6bb1" url: "https://pub.dev" source: hosted - version: "4.8.1" + version: "4.9.0" jwt_decode: dependency: transitive description: @@ -428,10 +428,10 @@ packages: dependency: transitive description: name: sentry - sha256: "19a267774906ca3a3c4677fc7e9582ea9da79ae9a28f84bbe4885dac2c269b70" + sha256: "961630a4dba41cebd692612421fd3805a991ebd8ef4a8d84a6c179e6b89eaf22" url: "https://pub.dev" source: hosted - version: "7.20.0" + version: "8.0.0" shared_preferences: dependency: "direct main" description: diff --git a/flutter_common/pubspec.yaml b/flutter_common/pubspec.yaml index bf12523c3..0522ef65c 100644 --- a/flutter_common/pubspec.yaml +++ b/flutter_common/pubspec.yaml @@ -12,7 +12,7 @@ dependencies: sdk: flutter flutter_dotenv: ^5.1.0 flutter_secure_storage: ^9.0.0 - shared_preferences: ^2.2.2 # Can be removed after migrating phase + shared_preferences: ^2.2.3 # Can be removed after migrating phase studyu_core: ^4.4.1 supabase_flutter: ^2.5.1 synchronized: ^3.1.0+1 diff --git a/pubspec.lock b/pubspec.lock index 206912c52..1d4a296ac 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -165,10 +165,10 @@ packages: dependency: "direct dev" description: name: melos - sha256: a0cb264096a315e4acdb66ae75ee594a76c97fe15ce9ae469f6c58c6c4b2be87 + sha256: f9a6fc4f4842b7edfca2e00ab3b5b06928584f24bdc3d776ab0b30be7d599450 url: "https://pub.dev" source: hosted - version: "5.3.0" + version: "6.0.0" meta: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 839421ca3..bfc6f81d4 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -9,4 +9,4 @@ environment: dev_dependencies: flutter_lints: ^3.0.2 lint: ^2.3.0 - melos: ^5.3.0 + melos: ^6.0.0 From 9841938b8b46d32470bf488eaa3326f347235d60 Mon Sep 17 00:00:00 2001 From: Johannes Vedder Date: Thu, 25 Apr 2024 20:24:03 +0200 Subject: [PATCH 020/314] chore: regenerate files --- .../questionnaire/questions/annotated_scale_question.g.dart | 2 +- .../questionnaire/questions/audio_recording_question.g.dart | 3 ++- .../models/questionnaire/questions/free_text_question.g.dart | 5 +++-- .../src/models/questionnaire/questions/scale_question.g.dart | 4 ++-- .../questionnaire/questions/visual_analogue_question.g.dart | 4 ++-- core/lib/src/models/study_schedule/study_schedule.g.dart | 4 ++-- 6 files changed, 12 insertions(+), 10 deletions(-) diff --git a/core/lib/src/models/questionnaire/questions/annotated_scale_question.g.dart b/core/lib/src/models/questionnaire/questions/annotated_scale_question.g.dart index 88f580b18..1de91484b 100644 --- a/core/lib/src/models/questionnaire/questions/annotated_scale_question.g.dart +++ b/core/lib/src/models/questionnaire/questions/annotated_scale_question.g.dart @@ -50,7 +50,7 @@ Map _$AnnotatedScaleQuestionToJson( } Annotation _$AnnotationFromJson(Map json) => Annotation() - ..value = json['value'] as int + ..value = (json['value'] as num).toInt() ..annotation = json['annotation'] as String; Map _$AnnotationToJson(Annotation instance) => diff --git a/core/lib/src/models/questionnaire/questions/audio_recording_question.g.dart b/core/lib/src/models/questionnaire/questions/audio_recording_question.g.dart index 15d48dc67..c09581df9 100644 --- a/core/lib/src/models/questionnaire/questions/audio_recording_question.g.dart +++ b/core/lib/src/models/questionnaire/questions/audio_recording_question.g.dart @@ -9,7 +9,8 @@ part of 'audio_recording_question.dart'; AudioRecordingQuestion _$AudioRecordingQuestionFromJson( Map json) => AudioRecordingQuestion( - maxRecordingDurationSeconds: json['maxRecordingDurationSeconds'] as int, + maxRecordingDurationSeconds: + (json['maxRecordingDurationSeconds'] as num).toInt(), ) ..type = json['type'] as String ..id = json['id'] as String diff --git a/core/lib/src/models/questionnaire/questions/free_text_question.g.dart b/core/lib/src/models/questionnaire/questions/free_text_question.g.dart index c15443724..4a6865334 100644 --- a/core/lib/src/models/questionnaire/questions/free_text_question.g.dart +++ b/core/lib/src/models/questionnaire/questions/free_text_question.g.dart @@ -9,8 +9,9 @@ part of 'free_text_question.dart'; FreeTextQuestion _$FreeTextQuestionFromJson(Map json) => FreeTextQuestion( textType: $enumDecode(_$FreeTextQuestionTypeEnumMap, json['textType']), - lengthRange: - (json['lengthRange'] as List).map((e) => e as int).toList(), + lengthRange: (json['lengthRange'] as List) + .map((e) => (e as num).toInt()) + .toList(), customTypeExpression: json['customTypeExpression'] as String?, ) ..type = json['type'] as String diff --git a/core/lib/src/models/questionnaire/questions/scale_question.g.dart b/core/lib/src/models/questionnaire/questions/scale_question.g.dart index d05ec400c..e69c71d08 100644 --- a/core/lib/src/models/questionnaire/questions/scale_question.g.dart +++ b/core/lib/src/models/questionnaire/questions/scale_question.g.dart @@ -22,8 +22,8 @@ ScaleQuestion _$ScaleQuestionFromJson(Map json) => ..annotations = (json['annotations'] as List) .map((e) => Annotation.fromJson(e as Map)) .toList() - ..minColor = json['min_color'] as int? - ..maxColor = json['max_color'] as int? + ..minColor = (json['min_color'] as num?)?.toInt() + ..maxColor = (json['max_color'] as num?)?.toInt() ..step = (json['step'] as num).toDouble(); Map _$ScaleQuestionToJson(ScaleQuestion instance) { diff --git a/core/lib/src/models/questionnaire/questions/visual_analogue_question.g.dart b/core/lib/src/models/questionnaire/questions/visual_analogue_question.g.dart index 2511e9751..2c2a2b505 100644 --- a/core/lib/src/models/questionnaire/questions/visual_analogue_question.g.dart +++ b/core/lib/src/models/questionnaire/questions/visual_analogue_question.g.dart @@ -21,8 +21,8 @@ VisualAnalogueQuestion _$VisualAnalogueQuestionFromJson( ..maximum = (json['maximum'] as num).toDouble() ..step = (json['step'] as num).toDouble() ..initial = (json['initial'] as num).toDouble() - ..minimumColor = json['minimumColor'] as int - ..maximumColor = json['maximumColor'] as int + ..minimumColor = (json['minimumColor'] as num).toInt() + ..maximumColor = (json['maximumColor'] as num).toInt() ..minimumAnnotation = json['minimumAnnotation'] as String ..maximumAnnotation = json['maximumAnnotation'] as String; diff --git a/core/lib/src/models/study_schedule/study_schedule.g.dart b/core/lib/src/models/study_schedule/study_schedule.g.dart index 22f3cd80f..ae103a19d 100644 --- a/core/lib/src/models/study_schedule/study_schedule.g.dart +++ b/core/lib/src/models/study_schedule/study_schedule.g.dart @@ -10,8 +10,8 @@ StudySchedule _$StudyScheduleFromJson(Map json) => StudySchedule( sequenceCustom: json['sequenceCustom'] as String? ?? 'ABAB', ) - ..numberOfCycles = json['numberOfCycles'] as int - ..phaseDuration = json['phaseDuration'] as int + ..numberOfCycles = (json['numberOfCycles'] as num).toInt() + ..phaseDuration = (json['phaseDuration'] as num).toInt() ..includeBaseline = json['includeBaseline'] as bool ..sequence = $enumDecode(_$PhaseSequenceEnumMap, json['sequence']); From 97d7e33dc79641c45e5c909076dfc76b6f59d9d1 Mon Sep 17 00:00:00 2001 From: Johannes Vedder Date: Fri, 26 Apr 2024 10:40:21 +0200 Subject: [PATCH 021/314] chore: add reset melos command --- melos.yaml | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/melos.yaml b/melos.yaml index 16c3c92b1..3f11616a5 100644 --- a/melos.yaml +++ b/melos.yaml @@ -8,16 +8,6 @@ packages: - core - flutter_common -command: - clean: - hooks: - # Clean things very deeply, can be used to establish "pristine checkout" status - pre: > - git clean -x -d -f -q || true - # Additional cleanup lifecycle script, executed when `melos clean` is ran. - post: > - melos exec --flutter --concurrency=3 -- "flutter clean" - scripts: analyze: run: | @@ -76,6 +66,14 @@ scripts: packageFilters: scope: studyu_core + reset: + run: | + git clean -x -d -f -q || true + melos clean + melos exec --flutter --concurrency=1 -- "flutter clean" + melos bootstrap + description: Reset the workspace to a "pristine checkout" status. + dev:designer: run: | melos exec -c 1 -- \ From 6fb574dcf5b7b67084f00895b58f4ea35e180b0f Mon Sep 17 00:00:00 2001 From: Johannes Vedder Date: Fri, 26 Apr 2024 10:40:10 +0200 Subject: [PATCH 022/314] chore: upgrade deps --- app/pubspec.lock | 16 ++++++++-------- designer_v2/pubspec.lock | 12 ++++++------ designer_v2/pubspec.yaml | 2 +- flutter_common/pubspec.lock | 4 ++-- pubspec.lock | 4 ++-- 5 files changed, 19 insertions(+), 19 deletions(-) diff --git a/app/pubspec.lock b/app/pubspec.lock index 7d2100ae0..cbad20ab3 100644 --- a/app/pubspec.lock +++ b/app/pubspec.lock @@ -109,10 +109,10 @@ packages: dependency: transitive description: name: camera_avfoundation - sha256: "9375082d2da45754277b5ae6ff2560cfecb799a4991aa9a3a2ee8e56d2bb0561" + sha256: "7d021e8cd30d9b71b8b92b4ad669e80af432d722d18d6aac338572754a786c15" url: "https://pub.dev" source: hosted - version: "0.9.15+1" + version: "0.9.16" camera_platform_interface: dependency: transitive description: @@ -298,10 +298,10 @@ packages: dependency: transitive description: name: flutter_cache_manager - sha256: "8207f27539deb83732fdda03e259349046a39a4c767269285f449ade355d54ba" + sha256: "395d6b7831f21f3b989ebedbb785545932adb9afe2622c1ffacf7f4b53a7e544" url: "https://pub.dev" source: hosted - version: "3.3.1" + version: "3.3.2" flutter_dotenv: dependency: transitive description: @@ -897,10 +897,10 @@ packages: dependency: transitive description: name: pointycastle - sha256: "70fe966348fe08c34bf929582f1d8247d9d9408130723206472b4687227e4333" + sha256: "79fbafed02cfdbe85ef3fd06c7f4bc2cbcba0177e61b765264853d4253b21744" url: "https://pub.dev" source: hosted - version: "3.8.0" + version: "3.9.0" postgrest: dependency: transitive description: @@ -1500,10 +1500,10 @@ packages: dependency: transitive description: name: win32 - sha256: "0a989dc7ca2bb51eac91e8fd00851297cfffd641aa7538b165c62637ca0eaa4a" + sha256: "0eaf06e3446824099858367950a813472af675116bf63f008a4c2a75ae13e9cb" url: "https://pub.dev" source: hosted - version: "5.4.0" + version: "5.5.0" xdg_directories: dependency: transitive description: diff --git a/designer_v2/pubspec.lock b/designer_v2/pubspec.lock index dedbea596..bb00fcb1a 100644 --- a/designer_v2/pubspec.lock +++ b/designer_v2/pubspec.lock @@ -387,10 +387,10 @@ packages: dependency: "direct main" description: name: go_router - sha256: "28ef8a8320ab3bf5752424e6bca6961ce25108afc344f3127b5155caf7a792c8" + sha256: "466425a64508ca00983882f523400d9169365cb9b464e2e2419f3b6545ff9c51" url: "https://pub.dev" source: hosted - version: "14.0.0" + version: "14.0.1" gotrue: dependency: transitive description: @@ -728,10 +728,10 @@ packages: dependency: transitive description: name: pointycastle - sha256: "70fe966348fe08c34bf929582f1d8247d9d9408130723206472b4687227e4333" + sha256: "79fbafed02cfdbe85ef3fd06c7f4bc2cbcba0177e61b765264853d4253b21744" url: "https://pub.dev" source: hosted - version: "3.8.0" + version: "3.9.0" pool: dependency: transitive description: @@ -1259,10 +1259,10 @@ packages: dependency: transitive description: name: win32 - sha256: "0a989dc7ca2bb51eac91e8fd00851297cfffd641aa7538b165c62637ca0eaa4a" + sha256: "0eaf06e3446824099858367950a813472af675116bf63f008a4c2a75ae13e9cb" url: "https://pub.dev" source: hosted - version: "5.4.0" + version: "5.5.0" xdg_directories: dependency: transitive description: diff --git a/designer_v2/pubspec.yaml b/designer_v2/pubspec.yaml index e4b28a826..378fa75a5 100644 --- a/designer_v2/pubspec.yaml +++ b/designer_v2/pubspec.yaml @@ -23,7 +23,7 @@ dependencies: flutter_riverpod: ^2.5.1 flutter_web_plugins: sdk: flutter - go_router: ^14.0.0 + go_router: ^14.0.1 material_color_utilities: material_design_icons_flutter: ^7.0.7296 pointer_interceptor: ^0.10.1 diff --git a/flutter_common/pubspec.lock b/flutter_common/pubspec.lock index b663c054c..5521f4aa5 100644 --- a/flutter_common/pubspec.lock +++ b/flutter_common/pubspec.lock @@ -704,10 +704,10 @@ packages: dependency: transitive description: name: win32 - sha256: "0a989dc7ca2bb51eac91e8fd00851297cfffd641aa7538b165c62637ca0eaa4a" + sha256: "0eaf06e3446824099858367950a813472af675116bf63f008a4c2a75ae13e9cb" url: "https://pub.dev" source: hosted - version: "5.4.0" + version: "5.5.0" xdg_directories: dependency: transitive description: diff --git a/pubspec.lock b/pubspec.lock index 1d4a296ac..7435a66c5 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -133,10 +133,10 @@ packages: dependency: transitive description: name: json_annotation - sha256: b10a7b2ff83d83c777edba3c6a0f97045ddadd56c944e1a23a3fdf43a1bf4467 + sha256: "1ce844379ca14835a50d2f019a3099f419082cfdd231cd86a142af94dd5c6bb1" url: "https://pub.dev" source: hosted - version: "4.8.1" + version: "4.9.0" lint: dependency: "direct dev" description: From 6bf4f3e26b89a5285894f484190d878fe4354e71 Mon Sep 17 00:00:00 2001 From: StudyU Documenter Date: Fri, 26 Apr 2024 13:14:09 +0000 Subject: [PATCH 023/314] docs: update UML documentation --- docs/uml/app/lib/uml.svg | 4488 +++++++++++++++++---------------- docs/uml/app/lib/util/uml.svg | 468 ++-- 2 files changed, 2573 insertions(+), 2383 deletions(-) diff --git a/docs/uml/app/lib/uml.svg b/docs/uml/app/lib/uml.svg index b774303a4..befab00ad 100644 --- a/docs/uml/app/lib/uml.svg +++ b/docs/uml/app/lib/uml.svg @@ -1,170 +1,111 @@ - - [MyApp + + [AboutScreen | - +queryParameters: Map<String, String>; - +appConfig: AppConfig?; - +initialRoute: String + +Widget build() ] - [MyApp]o-[AppConfig] - - [NotificationValidators + [WelcomeScreen | - +didNotificationLaunchApp: bool; - +wasNotificationActionHandled: bool; - +wasNotificationActionCompleted: bool + +Widget build() ] - [StudyNotifications + [Preview | - +subject: StudySubject?; - +flutterLocalNotificationsPlugin: FlutterLocalNotificationsPlugin; - +context: BuildContext; - +didReceiveLocalNotificationStream: StreamController<ReceivedNotification>; - +selectNotificationStream: StreamController<String?>; - <static>+validator: NotificationValidators; - <static>+debug: bool; - <static>+scheduledNotificationsDebug: String? + +queryParameters: Map<String, String>?; + +appLanguage: AppLanguage; + +selectedRoute: String?; + +extra: String?; + +study: Study?; + +selectedStudyObjectId: String?; + +subject: StudySubject? | - <static>+dynamic create(); - -dynamic _isAndroidPermissionGranted(); - -dynamic _requestPermissions(); - -void _configureDidReceiveLocalNotificationSubject(); - -void _configureSelectNotificationSubject(); - -void _initNotificationsPlugin(); - +dynamic handleNotificationResponse() + +bool hasRoute(); + +void handleQueries(); + +dynamic init(); + +dynamic handleAuthorization(); + +dynamic runCommands(); + +String? getSelectedRoute(); + +bool containsQuery(); + +bool containsQueryPair(); + +dynamic getStudySubject(); + -dynamic _createFakeSubject(); + +List<String> getInterventionIds() ] - [StudyNotifications]o-[StudySubject] - [StudyNotifications]o-[FlutterLocalNotificationsPlugin] - [StudyNotifications]o-[<abstract>BuildContext] - [StudyNotifications]o-[StreamController] - [StudyNotifications]o-[NotificationValidators] - - [ReceivedNotification - | - +id: int?; - +title: String?; - +body: String?; - +payload: String? - ] + [Preview]o-[AppLanguage] + [Preview]o-[Study] + [Preview]o-[StudySubject] - [StudyNotification + [IFrameHelper | - +taskInstance: TaskInstance; - +date: DateTime + +void postRouteFinished(); + +void listen() ] - [StudyNotification]o-[TaskInstance] - - [AppAnalytics - | - <static>-_userEnabled: bool?; - <static>+keyAnalyticsUserEnable: String; - +context: BuildContext; - +subject: StudySubject?; - <static>+isUserEnabled: dynamic - | - <static>+dynamic init(); - <static>+dynamic start(); - <static>+void setEnabled(); - +dynamic initBasic(); - +void initAdvanced() + [TermsScreen ] - [AppAnalytics]o-[<abstract>BuildContext] - [AppAnalytics]o-[StudySubject] - - [GroupedIterable + [LegalSection | - +data: Map<K, Iterable<V>>; - +iterator: Iterator<MapEntry<K, Iterable<V>>> + +title: String?; + +description: String?; + +icon: Icon?; + +pdfUrl: String?; + +pdfUrlLabel: String?; + +acknowledgment: String?; + +isChecked: bool?; + +onChange: void Function(bool?)? | - +Iterable<MapEntry<K, R>> aggregate(); - +Iterable<MapEntry<K, R>> aggregateWithKey() + +Widget build() ] - [Iterable]<:-[GroupedIterable] + [LegalSection]o-[Icon] + [LegalSection]o-[void Function(bool?)?] - [Cache - | - <static>+isSynchronizing: bool; - <static>+sharedPrefs: dynamic + [AppOutdatedScreen | - <static>+dynamic storeSubject(); - <static>+dynamic loadSubject(); - <static>+dynamic storeAnalytics(); - <static>+dynamic loadAnalytics(); - <static>+dynamic delete(); - <static>+dynamic synchronize() - ] - - [ConsentScreen + +Widget build() ] - [ConsentCard - | - +consent: ConsentItem?; - +index: int?; - +onTapped: dynamic Function(int); - +isChecked: bool? + [LoadingScreen | - +Widget build() + +sessionString: String?; + +queryParameters: Map<String, String>? ] - [ConsentCard]o-[ConsentItem] - [ConsentCard]o-[dynamic Function(int)] - - [ConsentElement + [QuestionnaireTaskWidget | - +title: String; - +descriptionText: String; - +acknowledgmentText: String; - +icon: IconData + +task: QuestionnaireTask; + +completionPeriod: CompletionPeriod ] - [ConsentElement]o-[IconData] - - [StudyOverviewScreen - ] + [QuestionnaireTaskWidget]o-[QuestionnaireTask] + [QuestionnaireTaskWidget]o-[CompletionPeriod] - [_StudyOverviewScreen + [TaskScreen | - +study: Study? + +taskInstance: TaskInstance | - +dynamic navigateToJourney(); - +dynamic navigateToEligibilityCheck(); - +Widget build() + <static>+MaterialPageRoute<bool> routeFor() ] - [_StudyOverviewScreen]o-[Study] + [TaskScreen]o-[TaskInstance] - [StudyDetailsView - | - +study: Study?; - +iconSize: double + [CheckmarkTaskWidget | - +Widget build() + +task: CheckmarkTask?; + +completionPeriod: CompletionPeriod? ] - [StudyDetailsView]o-[Study] - - [KickoffScreen - ] + [CheckmarkTaskWidget]o-[CheckmarkTask] + [CheckmarkTaskWidget]o-[CompletionPeriod] - [_KickoffScreen - | - +subject: StudySubject?; - +ready: bool + [CapturePictureScreen | - -dynamic _storeUserStudy(); - -Widget _constructStatusIcon(); - -String _getStatusText(); - +Widget build() + +userId: String; + +studyId: String ] - [_KickoffScreen]o-[StudySubject] - [EligibilityResult | +eligible: bool; @@ -182,23 +123,32 @@ [EligibilityScreen]o-[Study] - [OnboardingProgress + [InterventionSelectionScreen + ] + + [StudyOverviewScreen + ] + + [_StudyOverviewScreen | - +stage: int; - +progress: double + +study: Study? | - -double _getProgressForStage(); + +dynamic navigateToJourney(); + +dynamic navigateToEligibilityCheck(); +Widget build() ] - [StudySelectionScreen - ] + [_StudyOverviewScreen]o-[Study] - [InviteCodeDialog + [StudyDetailsView + | + +study: Study?; + +iconSize: double + | + +Widget build() ] - [InterventionSelectionScreen - ] + [StudyDetailsView]o-[Study] [JourneyOverviewScreen ] @@ -255,61 +205,63 @@ [TimelineChild]o-[<abstract>Widget] - [AverageSectionWidget + [KickoffScreen + ] + + [_KickoffScreen | - +section: AverageSection; - +titlePos: List<int>; - +phasePos: List<int> + +subject: StudySubject?; + +ready: bool | - +Widget build(); - +Widget getLegend(); - +Widget getDiagram(); - +BarChartData getChartData(); - +Widget getTitles(); - +Widget getValues(); - +List<BarChartGroupData> getBarGroups(); - +FlGridData getGridData(); - +MaterialColor getColor(); - +int getDayIndex(); - +Iterable<DiagramDatum> getAggregatedData(); - +Map<String, String?> getInterventionNames() + -dynamic _storeUserStudy(); + -Widget _constructStatusIcon(); + -String _getStatusText(); + +Widget build() ] - [AverageSectionWidget]o-[AverageSection] - [<abstract>ReportSectionWidget]<:-[AverageSectionWidget] + [_KickoffScreen]o-[StudySubject] - [DiagramDatum - | - +x: num; - +value: num; - +timestamp: DateTime?; - +intervention: String + [ConsentScreen ] - [LinearRegressionSectionWidget + [ConsentCard | - +section: LinearRegressionSection + +consent: ConsentItem?; + +index: int?; + +onTapped: dynamic Function(int); + +isChecked: bool? | +Widget build() ] - [LinearRegressionSectionWidget]o-[LinearRegressionSection] - [<abstract>ReportSectionWidget]<:-[LinearRegressionSectionWidget] + [ConsentCard]o-[ConsentItem] + [ConsentCard]o-[dynamic Function(int)] - [ReportHistoryScreen + [ConsentElement | - +Widget build() + +title: String; + +descriptionText: String; + +acknowledgmentText: String; + +icon: IconData ] - [ReportHistoryItem + [ConsentElement]o-[IconData] + + [StudySelectionScreen + ] + + [InviteCodeDialog + ] + + [OnboardingProgress | - +subject: StudySubject + +stage: int; + +progress: double | + -double _getProgressForStage(); +Widget build() ] - [ReportHistoryItem]o-[StudySubject] - [ReportDetailsScreen | +subject: StudySubject @@ -327,31 +279,19 @@ [<abstract>GenericSection]<:-[GeneralDetailsSection] - [<abstract>GenericSection - | - +subject: StudySubject?; - +onTap: void Function()? + [ReportHistoryScreen | - +Widget buildContent(); +Widget build() ] - [<abstract>GenericSection]o-[StudySubject] - [<abstract>GenericSection]o-[void Function()?] - - [DisclaimerSection - | - +Widget buildContent() - ] - - [<abstract>GenericSection]<:-[DisclaimerSection] - - [<abstract>ReportSectionWidget + [ReportHistoryItem | +subject: StudySubject + | + +Widget build() ] - [<abstract>ReportSectionWidget]o-[StudySubject] + [ReportHistoryItem]o-[StudySubject] [LegendWidget | @@ -441,6 +381,66 @@ +Widget build() ] + [<abstract>ReportSectionWidget + | + +subject: StudySubject + ] + + [<abstract>ReportSectionWidget]o-[StudySubject] + + [<abstract>GenericSection + | + +subject: StudySubject?; + +onTap: void Function()? + | + +Widget buildContent(); + +Widget build() + ] + + [<abstract>GenericSection]o-[StudySubject] + [<abstract>GenericSection]o-[void Function()?] + + [AverageSectionWidget + | + +section: AverageSection; + +titlePos: List<int>; + +phasePos: List<int> + | + +Widget build(); + +Widget getLegend(); + +Widget getDiagram(); + +BarChartData getChartData(); + +Widget getTitles(); + +Widget getValues(); + +List<BarChartGroupData> getBarGroups(); + +FlGridData getGridData(); + +MaterialColor getColor(); + +int getDayIndex(); + +Iterable<DiagramDatum> getAggregatedData(); + +Map<String, String?> getInterventionNames() + ] + + [AverageSectionWidget]o-[AverageSection] + [<abstract>ReportSectionWidget]<:-[AverageSectionWidget] + + [DiagramDatum + | + +x: num; + +value: num; + +timestamp: DateTime?; + +intervention: String + ] + + [LinearRegressionSectionWidget + | + +section: LinearRegressionSection + | + +Widget build() + ] + + [LinearRegressionSectionWidget]o-[LinearRegressionSection] + [<abstract>ReportSectionWidget]<:-[LinearRegressionSectionWidget] + [ReportSectionContainer | +section: ReportSection; @@ -458,6 +458,13 @@ [ReportSectionContainer]o-[StudySubject] [ReportSectionContainer]o-[void Function()?] + [DisclaimerSection + | + +Widget buildContent() + ] + + [<abstract>GenericSection]<:-[DisclaimerSection] + [Settings ] @@ -479,47 +486,26 @@ [DeleteAlertDialog]o-[StudySubject] - [TaskBox + [FAQ | - +taskInstance: TaskInstance; - +icon: Icon; - +onCompleted: dynamic Function() + +Widget build() ] - [TaskBox]o-[TaskInstance] - [TaskBox]o-[Icon] - [TaskBox]o-[dynamic Function()] - - [ProgressRow + [Entry | - +subject: StudySubject? + +title: String; + +children: List<Entry> ] - [ProgressRow]o-[StudySubject] - - [InterventionSegment + [EntryItem | - +intervention: Intervention; - +percentCompleted: double; - +percentMissed: double; - +isCurrent: bool; - +isFuture: bool; - +phaseDuration: int + +entry: Entry | - +List<Widget> buildSeparators(); + -Widget _buildTiles(); +Widget build() ] - [InterventionSegment]o-[Intervention] - - [TaskOverview - | - +subject: StudySubject?; - +scheduleToday: List<TaskInstance>?; - +interventionIcon: String? - ] - - [TaskOverview]o-[StudySubject] + [EntryItem]o-[Entry] [ContactScreen ] @@ -565,27 +551,6 @@ [ContactItemType]o-[ContactItemType] [Enum]<:--[ContactItemType] - [FAQ - | - +Widget build() - ] - - [Entry - | - +title: String; - +children: List<Entry> - ] - - [EntryItem - | - +entry: Entry - | - -Widget _buildTiles(); - +Widget build() - ] - - [EntryItem]o-[Entry] - [DashboardScreen | +error: String? @@ -611,192 +576,219 @@ [StudyFinishedPlaceholder]o-[SizedBox] - [QuestionnaireTaskWidget + [TaskOverview | - +task: QuestionnaireTask; - +completionPeriod: CompletionPeriod + +subject: StudySubject?; + +scheduleToday: List<TaskInstance>?; + +interventionIcon: String? ] - [QuestionnaireTaskWidget]o-[QuestionnaireTask] - [QuestionnaireTaskWidget]o-[CompletionPeriod] + [TaskOverview]o-[StudySubject] - [TaskScreen - | - +taskInstance: TaskInstance + [ProgressRow | - <static>+MaterialPageRoute<bool> routeFor() + +subject: StudySubject? ] - [TaskScreen]o-[TaskInstance] + [ProgressRow]o-[StudySubject] - [CheckmarkTaskWidget + [InterventionSegment | - +task: CheckmarkTask?; - +completionPeriod: CompletionPeriod? - ] - - [CheckmarkTaskWidget]o-[CheckmarkTask] - [CheckmarkTaskWidget]o-[CompletionPeriod] - - [AppOutdatedScreen + +intervention: Intervention; + +percentCompleted: double; + +percentMissed: double; + +isCurrent: bool; + +isFuture: bool; + +phaseDuration: int | + +List<Widget> buildSeparators(); +Widget build() ] - [TermsScreen - ] + [InterventionSegment]o-[Intervention] - [LegalSection - | - +title: String?; - +description: String?; - +icon: Icon?; - +pdfUrl: String?; - +pdfUrlLabel: String?; - +acknowledgment: String?; - +isChecked: bool?; - +onChange: void Function(bool?)? + [TaskBox | - +Widget build() + +taskInstance: TaskInstance; + +icon: Icon; + +onCompleted: dynamic Function() ] - [LegalSection]o-[Icon] - [LegalSection]o-[void Function(bool?)?] + [TaskBox]o-[TaskInstance] + [TaskBox]o-[Icon] + [TaskBox]o-[dynamic Function()] - [IFrameHelper + [Routes | - +void postRouteFinished(); - +void listen() + <static>+loading: String; + <static>+preview: String; + <static>+appOutdated: String; + <static>+dashboard: String; + <static>+welcome: String; + <static>+about: String; + <static>+terms: String; + <static>+studySelection: String; + <static>+studyOverview: String; + <static>+interventionSelection: String; + <static>+journey: String; + <static>+consent: String; + <static>+kickoff: String; + <static>+contact: String; + <static>+faq: String; + <static>+appSettings: String; + <static>+questionnaire: String; + <static>+reportHistory: String; + <static>+reportDetails: String; + <static>+performanceDetails: String + | + <static>+Route<dynamic> unknownRoute(); + <static>+Route<dynamic>? generateRoute() ] - [LoadingScreen - | - +sessionString: String?; - +queryParameters: Map<String, String>? - ] - - [AboutScreen + [NotificationValidators | - +Widget build() + +didNotificationLaunchApp: bool; + +wasNotificationActionHandled: bool; + +wasNotificationActionCompleted: bool ] - [Preview + [StudyNotifications | - +queryParameters: Map<String, String>?; - +appLanguage: AppLanguage; - +selectedRoute: String?; - +extra: String?; - +study: Study?; - +selectedStudyObjectId: String?; - +subject: StudySubject? + +subject: StudySubject?; + +flutterLocalNotificationsPlugin: FlutterLocalNotificationsPlugin; + +context: BuildContext; + +didReceiveLocalNotificationStream: StreamController<ReceivedNotification>; + +selectNotificationStream: StreamController<String?>; + <static>+validator: NotificationValidators; + <static>+debug: bool; + <static>+scheduledNotificationsDebug: String? | - +bool hasRoute(); - +void handleQueries(); - +dynamic init(); - +dynamic handleAuthorization(); - +dynamic runCommands(); - +String? getSelectedRoute(); - +bool containsQuery(); - +bool containsQueryPair(); - +dynamic getStudySubject(); - -dynamic _createFakeSubject(); - +List<String> getInterventionIds() + <static>+dynamic create(); + -dynamic _isAndroidPermissionGranted(); + -dynamic _requestPermissions(); + -void _configureDidReceiveLocalNotificationSubject(); + -void _configureSelectNotificationSubject(); + -void _initNotificationsPlugin(); + +dynamic handleNotificationResponse() ] - [Preview]o-[AppLanguage] - [Preview]o-[Study] - [Preview]o-[StudySubject] + [StudyNotifications]o-[StudySubject] + [StudyNotifications]o-[FlutterLocalNotificationsPlugin] + [StudyNotifications]o-[<abstract>BuildContext] + [StudyNotifications]o-[StreamController] + [StudyNotifications]o-[NotificationValidators] - [WelcomeScreen + [ReceivedNotification | - +Widget build() + +id: int?; + +title: String?; + +body: String?; + +payload: String? ] - [ThemeConfig + [StudyNotification | - <static>+SliderThemeData coloredSliderTheme() + +taskInstance: TaskInstance; + +date: DateTime ] - [HtmlText + [StudyNotification]o-[TaskInstance] + + [TemporaryStorageHandler + | + <static>-_stagingBaseNamePrefix: String; + <static>-_audioFileType: String; + <static>-_imageFileType: String; + -_userId: String; + -_studyId: String + | + -String _buildFileName(); + <static>-dynamic _getMultimodalTempDirectory(); + <static>-dynamic _getMultimodalUploadDirectory(); + <static>+dynamic moveStagingFileToUploadDirectory(); + <static>+dynamic getFutureBlobFiles(); + +dynamic getStagingAudio(); + +dynamic getStagingImage(); + <static>+dynamic deleteAllStagingFiles() + ] + + [GroupedIterable | - +text: String?; - +style: TextStyle?; - +centered: bool + +data: Map<K, Iterable<V>>; + +iterator: Iterator<MapEntry<K, Iterable<V>>> | - +Widget build() + +Iterable<MapEntry<K, R>> aggregate(); + +Iterable<MapEntry<K, R>> aggregateWithKey() ] - [HtmlText]o-[TextStyle] + [Iterable]<:-[GroupedIterable] - [RoundCheckbox + [Cache | - +onChanged: dynamic Function(bool)?; - +value: bool? + <static>+isSynchronizing: bool | - +Widget build() + <static>+dynamic storeSubject(); + <static>+dynamic loadSubject(); + <static>+dynamic storeAnalytics(); + <static>+dynamic loadAnalytics(); + <static>+dynamic delete(); + <static>+dynamic uploadBlobFiles(); + <static>+dynamic synchronize() ] - [RoundCheckbox]o-[dynamic Function(bool)?] - - [CustomSlider + [AppAnalytics | - +value: double?; - +minValue: double?; - +maxValue: double?; - +minorTick: int?; - +onChanged: dynamic Function(double)?; - +onChangeEnd: dynamic Function(double)?; - +activeColor: Color?; - +inactiveColor: Color?; - +minColor: Color?; - +maxColor: Color?; - +thumbColor: Color?; - +isColored: bool; - +labelValuePrecision: int; - +tickValuePrecision: int; - +linearStep: bool; - +steps: AnnotatedScaleQuestion? + <static>-_userEnabled: bool?; + <static>+keyAnalyticsUserEnable: String; + +context: BuildContext; + +subject: StudySubject?; + <static>+isUserEnabled: dynamic | - +Widget build() + <static>+dynamic init(); + <static>+dynamic start(); + <static>+void setEnabled(); + +dynamic initBasic(); + +void initAdvanced() ] - [CustomSlider]o-[dynamic Function(double)?] - [CustomSlider]o-[Color] - [CustomSlider]o-[AnnotatedScaleQuestion] + [AppAnalytics]o-[<abstract>BuildContext] + [AppAnalytics]o-[StudySubject] - [CustomTrackShape + [ThemeConfig | - +Rect getPreferredRect() + <static>+SliderThemeData coloredSliderTheme() ] - [RoundedRectSliderTrackShape]<:-[CustomTrackShape] - - [QuestionHeader - | - +prompt: String?; - +subtitle: String?; - +rationale: String? + [ScaleQuestionWidget | - -List<Widget> _buildSubtitle(); - -List<Widget> _buildRationaleButton(); - +Widget build() + +question: ScaleQuestion; + +onDone: dynamic Function(Answer<dynamic>)? ] - [QuestionnaireWidget + [ScaleQuestionWidget]o-[ScaleQuestion] + [ScaleQuestionWidget]o-[dynamic Function(Answer<dynamic>)?] + [<abstract>QuestionWidget]<:-[ScaleQuestionWidget] + + [VisualAnalogueQuestionWidget | - +title: String?; - +header: String?; - +footer: String?; - +questions: List<Question<dynamic>> + +question: VisualAnalogueQuestion; + +onDone: dynamic Function(Answer<dynamic>)? ] - [HtmlTextBox - | - +text: String? + [VisualAnalogueQuestionWidget]o-[VisualAnalogueQuestion] + [VisualAnalogueQuestionWidget]o-[dynamic Function(Answer<dynamic>)?] + [<abstract>QuestionWidget]<:-[VisualAnalogueQuestionWidget] + + [AnnotatedScaleQuestionWidget | - +Widget build() + +question: AnnotatedScaleQuestion; + +onDone: dynamic Function(Answer<dynamic>)? ] + [AnnotatedScaleQuestionWidget]o-[AnnotatedScaleQuestion] + [AnnotatedScaleQuestionWidget]o-[dynamic Function(Answer<dynamic>)?] + [<abstract>QuestionWidget]<:-[AnnotatedScaleQuestionWidget] + [BooleanQuestionWidget | +question: BooleanQuestion; @@ -807,11 +799,6 @@ [BooleanQuestionWidget]o-[dynamic Function(Answer<dynamic>)?] [<abstract>QuestionWidget]<:-[BooleanQuestionWidget] - [<abstract>QuestionWidget - | - +subtitle: String? - ] - [FreeTextQuestionWidget | +question: FreeTextQuestion; @@ -822,26 +809,11 @@ [FreeTextQuestionWidget]o-[dynamic Function(Answer<dynamic>)?] [<abstract>QuestionWidget]<:-[FreeTextQuestionWidget] - [ScaleQuestionWidget - | - +question: ScaleQuestion; - +onDone: dynamic Function(Answer<dynamic>)? - ] - - [ScaleQuestionWidget]o-[ScaleQuestion] - [ScaleQuestionWidget]o-[dynamic Function(Answer<dynamic>)?] - [<abstract>QuestionWidget]<:-[ScaleQuestionWidget] - - [VisualAnalogueQuestionWidget + [<abstract>QuestionWidget | - +question: VisualAnalogueQuestion; - +onDone: dynamic Function(Answer<dynamic>)? + +subtitle: String? ] - [VisualAnalogueQuestionWidget]o-[VisualAnalogueQuestion] - [VisualAnalogueQuestionWidget]o-[dynamic Function(Answer<dynamic>)?] - [<abstract>QuestionWidget]<:-[VisualAnalogueQuestionWidget] - [ChoiceQuestionWidget | +question: ChoiceQuestion; @@ -854,99 +826,94 @@ [ChoiceQuestionWidget]o-[dynamic Function(Answer<dynamic>)] [<abstract>QuestionWidget]<:-[ChoiceQuestionWidget] - [AnnotatedScaleQuestionWidget + [AudioRecordingQuestionWidget | - +question: AnnotatedScaleQuestion; - +onDone: dynamic Function(Answer<dynamic>)? + +question: AudioRecordingQuestion; + +onDone: dynamic Function(Answer<FutureBlobFile>)? ] - [AnnotatedScaleQuestionWidget]o-[AnnotatedScaleQuestion] - [AnnotatedScaleQuestionWidget]o-[dynamic Function(Answer<dynamic>)?] - [<abstract>QuestionWidget]<:-[AnnotatedScaleQuestionWidget] + [AudioRecordingQuestionWidget]o-[AudioRecordingQuestion] + [AudioRecordingQuestionWidget]o-[dynamic Function(Answer<FutureBlobFile>)?] + [<abstract>QuestionWidget]<:-[AudioRecordingQuestionWidget] - [QuestionContainer + [QuestionnaireWidget | - +onDone: dynamic Function(Answer<dynamic>, int); - +question: Question<dynamic>; - +index: int + +title: String?; + +header: String?; + +footer: String?; + +questions: List<Question<dynamic>> ] - [QuestionContainer]o-[dynamic Function(Answer<dynamic>, int)] - [QuestionContainer]o-[<abstract>Question] - - [InterventionCard + [HtmlTextBox | - +intervention: Intervention; - +selected: bool; - +showCheckbox: bool; - +showTasks: bool; - +showDescription: bool; - +onTap: dynamic Function()? + +text: String? | +Widget build() ] - [InterventionCard]o-[Intervention] - [InterventionCard]o-[dynamic Function()?] - - [InterventionCardTitle - | - +intervention: Intervention?; - +selected: bool; - +showCheckbox: bool; - +showDescriptionButton: bool; - +onTap: dynamic Function()? + [ImageCapturingQuestionWidget | - +Widget build() + +question: ImageCapturingQuestion; + +onDone: dynamic Function(Answer<FutureBlobFile>)? ] - [InterventionCardTitle]o-[Intervention] - [InterventionCardTitle]o-[dynamic Function()?] + [ImageCapturingQuestionWidget]o-[ImageCapturingQuestion] + [ImageCapturingQuestionWidget]o-[dynamic Function(Answer<FutureBlobFile>)?] + [<abstract>QuestionWidget]<:-[ImageCapturingQuestionWidget] - [InterventionCardDescription - | - +intervention: Intervention + [QuestionContainer | - +Widget build() + +onDone: dynamic Function(Answer<dynamic>, int); + +question: Question<dynamic>; + +index: int ] - [InterventionCardDescription]o-[Intervention] + [QuestionContainer]o-[dynamic Function(Answer<dynamic>, int)] + [QuestionContainer]o-[<abstract>Question] - [_TaskList + [QuestionHeader | - +tasks: List<InterventionTask> + +prompt: String?; + +subtitle: String?; + +rationale: String? | - +String scheduleString(); + -List<Widget> _buildSubtitle(); + -List<Widget> _buildRationaleButton(); +Widget build() ] - [SelectableButton + [CustomSlider | - +child: Widget; - +selected: bool; - +onTap: dynamic Function()? + +value: double?; + +minValue: double?; + +maxValue: double?; + +minorTick: int?; + +onChanged: dynamic Function(double)?; + +onChangeEnd: dynamic Function(double)?; + +activeColor: Color?; + +inactiveColor: Color?; + +minColor: Color?; + +maxColor: Color?; + +thumbColor: Color?; + +isColored: bool; + +labelValuePrecision: int; + +tickValuePrecision: int; + +linearStep: bool; + +steps: AnnotatedScaleQuestion? | - -Color _getFillColor(); - -Color _getTextColor(); +Widget build() ] - [SelectableButton]o-[<abstract>Widget] - [SelectableButton]o-[dynamic Function()?] + [CustomSlider]o-[dynamic Function(double)?] + [CustomSlider]o-[Color] + [CustomSlider]o-[AnnotatedScaleQuestion] - [StudyTile - | - +title: String?; - +description: String?; - +iconName: String; - +onTap: dynamic Function()?; - +contentPadding: EdgeInsetsGeometry + [CustomTrackShape | - +Widget build() + +Rect getPreferredRect() ] - [StudyTile]o-[dynamic Function()?] - [StudyTile]o-[<abstract>EdgeInsetsGeometry] + [RoundedRectSliderTrackShape]<:-[CustomTrackShape] [BottomOnboardingNavigation | @@ -966,973 +933,933 @@ [BottomOnboardingNavigation]o-[Icon] [BottomOnboardingNavigation]o-[<abstract>Widget] - [Routes + [InterventionCard | - <static>+loading: String; - <static>+preview: String; - <static>+appOutdated: String; - <static>+dashboard: String; - <static>+welcome: String; - <static>+about: String; - <static>+terms: String; - <static>+studySelection: String; - <static>+studyOverview: String; - <static>+interventionSelection: String; - <static>+journey: String; - <static>+consent: String; - <static>+kickoff: String; - <static>+contact: String; - <static>+faq: String; - <static>+appSettings: String; - <static>+questionnaire: String; - <static>+reportHistory: String; - <static>+reportDetails: String; - <static>+performanceDetails: String + +intervention: Intervention; + +selected: bool; + +showCheckbox: bool; + +showTasks: bool; + +showDescription: bool; + +onTap: dynamic Function()? | - <static>+Route<dynamic> unknownRoute(); - <static>+Route<dynamic>? generateRoute() + +Widget build() + ] + + [InterventionCard]o-[Intervention] + [InterventionCard]o-[dynamic Function()?] + + [InterventionCardTitle + | + +intervention: Intervention?; + +selected: bool; + +showCheckbox: bool; + +showDescriptionButton: bool; + +onTap: dynamic Function()? + | + +Widget build() + ] + + [InterventionCardTitle]o-[Intervention] + [InterventionCardTitle]o-[dynamic Function()?] + + [InterventionCardDescription + | + +intervention: Intervention + | + +Widget build() + ] + + [InterventionCardDescription]o-[Intervention] + + [_TaskList + | + +tasks: List<InterventionTask> + | + +String scheduleString(); + +Widget build() ] + [StudyTile + | + +title: String?; + +description: String?; + +iconName: String; + +onTap: dynamic Function()?; + +contentPadding: EdgeInsetsGeometry + | + +Widget build() + ] + + [StudyTile]o-[dynamic Function()?] + [StudyTile]o-[<abstract>EdgeInsetsGeometry] + + [RoundCheckbox + | + +onChanged: dynamic Function(bool)?; + +value: bool? + | + +Widget build() + ] + + [RoundCheckbox]o-[dynamic Function(bool)?] + + [SelectableButton + | + +child: Widget; + +selected: bool; + +onTap: dynamic Function()? + | + -Color _getFillColor(); + -Color _getTextColor(); + +Widget build() + ] + + [SelectableButton]o-[<abstract>Widget] + [SelectableButton]o-[dynamic Function()?] + + [HtmlText + | + +text: String?; + +style: TextStyle?; + +centered: bool + | + +Widget build() + ] + + [HtmlText]o-[TextStyle] + + [MyApp + | + +queryParameters: Map<String, String>; + +appConfig: AppConfig?; + +initialRoute: String + ] + + [MyApp]o-[AppConfig] + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - + - + - - - + + + - + - + - + - - - + - + - + - + - - - + - + - + - + - + - + - + - + - + - + - + + + - + - + - + - + - + - + - + - - - + + + - + - + + + - + - + - + - + - + - + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + - + + - + - + - + - + - + - + - + - - + + + - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + - + - + - + - + - + - + - + - + + + - + - + - + - + + + - + - + - + - + + + - + - - - + - + - + + + - + - - - + - + - + + + - + - - - + - + - + + + - + - - - + - + - + + + - + - - - + - + - + + + - + - - - + - + - + - + - - - + - + - + - + - + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - - - - - MyApp - - - - - - +queryParameters: Map<String, String> - +appConfig: AppConfig? - +initialRoute: String - - - + + + - - - - - - - AppConfig - - - + + + - - - - - - - - NotificationValidators - - - - - - +didNotificationLaunchApp: bool - +wasNotificationActionHandled: bool - +wasNotificationActionCompleted: bool - - - + + + - - - - - - - - - StudyNotifications - - - - - - +subject: StudySubject? - +flutterLocalNotificationsPlugin: FlutterLocalNotificationsPlugin - +context: BuildContext - +didReceiveLocalNotificationStream: StreamController<ReceivedNotification> - +selectNotificationStream: StreamController<String?> - <static>+validator: NotificationValidators - <static>+debug: bool - <static>+scheduledNotificationsDebug: String? - - + + + + - - - <static>+dynamic create() - -dynamic _isAndroidPermissionGranted() - -dynamic _requestPermissions() - -void _configureDidReceiveLocalNotificationSubject() - -void _configureSelectNotificationSubject() - -void _initNotificationsPlugin() - +dynamic handleNotificationResponse() + + + AboutScreen - - - - - - - - StudySubject + + + +Widget build() - - - + + + + - - - FlutterLocalNotificationsPlugin + + + WelcomeScreen - - - - - - - - BuildContext + + + +Widget build() - - - + + + + + - - - StreamController + + + Preview - - - - - - - - - ReceivedNotification + + + +queryParameters: Map<String, String>? + +appLanguage: AppLanguage + +selectedRoute: String? + +extra: String? + +study: Study? + +selectedStudyObjectId: String? + +subject: StudySubject? - - - +id: int? - +title: String? - +body: String? - +payload: String? + + + +bool hasRoute() + +void handleQueries() + +dynamic init() + +dynamic handleAuthorization() + +dynamic runCommands() + +String? getSelectedRoute() + +bool containsQuery() + +bool containsQueryPair() + +dynamic getStudySubject() + -dynamic _createFakeSubject() + +List<String> getInterventionIds() - - - - - - - - StudyNotification - - + + + - - - +taskInstance: TaskInstance - +date: DateTime + + + AppLanguage - - - + + + - - - TaskInstance + + + Study - - - - - - - - - AppAnalytics - - - - - - <static>-_userEnabled: bool? - <static>+keyAnalyticsUserEnable: String - +context: BuildContext - +subject: StudySubject? - <static>+isUserEnabled: dynamic - - + + + - - - <static>+dynamic init() - <static>+dynamic start() - <static>+void setEnabled() - +dynamic initBasic() - +void initAdvanced() + + + StudySubject - - - - - - - - - GroupedIterable - - + + + + - - - +data: Map<K, Iterable<V>> - +iterator: Iterator<MapEntry<K, Iterable<V>>> + + + IFrameHelper - - - +Iterable<MapEntry<K, R>> aggregate() - +Iterable<MapEntry<K, R>> aggregateWithKey() + + + +void postRouteFinished() + +void listen() - - - + + + - - - Iterable + + + TermsScreen - - - - - + + + + + - - - Cache + + + LegalSection - - - <static>+isSynchronizing: bool - <static>+sharedPrefs: dynamic + + + +title: String? + +description: String? + +icon: Icon? + +pdfUrl: String? + +pdfUrlLabel: String? + +acknowledgment: String? + +isChecked: bool? + +onChange: void Function(bool?)? - - - <static>+dynamic storeSubject() - <static>+dynamic loadSubject() - <static>+dynamic storeAnalytics() - <static>+dynamic loadAnalytics() - <static>+dynamic delete() - <static>+dynamic synchronize() + + + +Widget build() - - - + + + - - - ConsentScreen + + + Icon - - - - - + + + - - - ConsentCard + + + void Function(bool?)? - - - +consent: ConsentItem? - +index: int? - +onTapped: dynamic Function(int) - +isChecked: bool? - - + + + + + - - - +Widget build() + + + AppOutdatedScreen - - - - - - - - ConsentItem + + + +Widget build() - - - + + + + + + + + LoadingScreen + + - - - dynamic Function(int) + + + +sessionString: String? + +queryParameters: Map<String, String>? - - - - + + + + - - - ConsentElement + + + QuestionnaireTaskWidget - - - +title: String - +descriptionText: String - +acknowledgmentText: String - +icon: IconData + + + +task: QuestionnaireTask + +completionPeriod: CompletionPeriod - - - + + + - - - IconData + + + QuestionnaireTask - - - + + + - - - StudyOverviewScreen + + + CompletionPeriod - - - - - + + + + + - - - _StudyOverviewScreen + + + TaskScreen - - - +study: Study? + + + +taskInstance: TaskInstance - - - +dynamic navigateToJourney() - +dynamic navigateToEligibilityCheck() - +Widget build() + + + <static>+MaterialPageRoute<bool> routeFor() - - - + + + - - - Study + + + TaskInstance - - - - - - - - - StudyDetailsView - - + + + + - - - +study: Study? - +iconSize: double + + + CheckmarkTaskWidget - - - +Widget build() + + + +task: CheckmarkTask? + +completionPeriod: CompletionPeriod? - - - + + + - - - KickoffScreen + + + CheckmarkTask - - - - - - - - - _KickoffScreen - - + + + + - - - +subject: StudySubject? - +ready: bool + + + CapturePictureScreen - - - -dynamic _storeUserStudy() - -Widget _constructStatusIcon() - -String _getStatusText() - +Widget build() + + + +userId: String + +studyId: String - - + + - + EligibilityResult - + +eligible: bool +firstFailed: EligibilityCriterion? @@ -1942,9 +1869,9 @@ - + - + EligibilityCriterion @@ -1953,94 +1880,109 @@ - - - + + + - + EligibilityScreen - + +study: Study? - + <static>+MaterialPageRoute<EligibilityResult> routeFor() - - - - - + + + - - - OnboardingProgress + + + InterventionSelectionScreen - - - +stage: int - +progress: double + + + + + + + + StudyOverviewScreen - - - -double _getProgressForStage() - +Widget build() + + + + + + + + + + _StudyOverviewScreen - - - - + + + +study: Study? + + - - - StudySelectionScreen + + + +dynamic navigateToJourney() + +dynamic navigateToEligibilityCheck() + +Widget build() - - - + + + + + - - - InviteCodeDialog + + + StudyDetailsView - - - - + + + +study: Study? + +iconSize: double + + - - - InterventionSelectionScreen + + + +Widget build() - + - + JourneyOverviewScreen @@ -2049,23 +1991,23 @@ - - - + + + - + _JourneyOverviewScreen - + +subject: StudySubject? - + +dynamic getConsentAndNavigateToDashboard() +Widget build() @@ -2075,23 +2017,23 @@ - - - + + + - + Timeline - + +subject: StudySubject? - + +Widget build() @@ -2100,17 +2042,17 @@ - - - + + + - + InterventionTile - + +title: String? +iconName: String @@ -2121,7 +2063,7 @@ - + +Widget build() @@ -2130,9 +2072,9 @@ - + - + Color @@ -2141,24 +2083,24 @@ - - - + + + - + IconIndicator - + +iconName: String +color: Color? - + +Widget build() @@ -2167,23 +2109,23 @@ - - - + + + - + TimelineChild - + +child: Widget? - + +Widget build() @@ -2192,201 +2134,216 @@ - + - + Widget - - - - - + + + - - - AverageSectionWidget + + + KickoffScreen - - - +section: AverageSection - +titlePos: List<int> - +phasePos: List<int> + + + + + + + + + + _KickoffScreen - - - +Widget build() - +Widget getLegend() - +Widget getDiagram() - +BarChartData getChartData() - +Widget getTitles() - +Widget getValues() - +List<BarChartGroupData> getBarGroups() - +FlGridData getGridData() - +MaterialColor getColor() - +int getDayIndex() - +Iterable<DiagramDatum> getAggregatedData() - +Map<String, String?> getInterventionNames() + + + +subject: StudySubject? + +ready: bool + + + + + + -dynamic _storeUserStudy() + -Widget _constructStatusIcon() + -String _getStatusText() + +Widget build() - - - + + + - - - AverageSection + + + ConsentScreen - - - - + + + + + - - - ReportSectionWidget + + + ConsentCard - - - +subject: StudySubject + + + +consent: ConsentItem? + +index: int? + +onTapped: dynamic Function(int) + +isChecked: bool? - - - - - - - - - DiagramDatum + + + +Widget build() - - - +x: num - +value: num - +timestamp: DateTime? - +intervention: String + + + + + + + + ConsentItem - - - - - + + + - - - LinearRegressionSectionWidget + + + dynamic Function(int) - - - +section: LinearRegressionSection + + + + + + + + + ConsentElement - - - +Widget build() + + + +title: String + +descriptionText: String + +acknowledgmentText: String + +icon: IconData - - - + + + - - - LinearRegressionSection + + + IconData - - - - + + + - - - ReportHistoryScreen + + + StudySelectionScreen - - - +Widget build() + + + + + + + + InviteCodeDialog - - - - - + + + + + - - - ReportHistoryItem + + + OnboardingProgress - - - +subject: StudySubject + + + +stage: int + +progress: double - - - +Widget build() + + + -double _getProgressForStage() + +Widget build() - - - + + + - + ReportDetailsScreen - + +subject: StudySubject - + <static>+MaterialPageRoute<dynamic> routeFor() +Widget build() @@ -2396,16 +2353,16 @@ - - + + - + GeneralDetailsSection - + +Widget buildContent() @@ -2414,24 +2371,24 @@ - - - + + + - + GenericSection - + +subject: StudySubject? +onTap: void Function()? - + +Widget buildContent() +Widget build() @@ -2439,55 +2396,69 @@ - - - + + + + - - - void Function()? + + + ReportHistoryScreen + + + + + + +Widget build() - - - - + + + + + - - - DisclaimerSection + + + ReportHistoryItem - - - +Widget buildContent() + + + +subject: StudySubject + + + + + + +Widget build() - - - + + + - + LegendWidget - + +name: String +color: Color - + +Widget build() @@ -2496,23 +2467,23 @@ - - - + + + - + LegendsListWidget - + +legends: List<Legend> - + +Widget build() @@ -2521,16 +2492,16 @@ - - + + - + Legend - + +name: String +color: Color @@ -2540,23 +2511,23 @@ - - - + + + - + PerformanceDetailsScreen - + +reportSubject: StudySubject? - + <static>+MaterialPageRoute<dynamic> routeFor() +Widget build() @@ -2566,24 +2537,24 @@ - - - + + + - + InterventionPerformanceBar - + +intervention: Intervention +subject: StudySubject? - + +Widget build() @@ -2592,9 +2563,9 @@ - + - + Intervention @@ -2603,24 +2574,24 @@ - - - + + + - + ObservationPerformanceBar - + +observation: Observation +subject: StudySubject? - + +Widget build() @@ -2629,9 +2600,9 @@ - + - + Observation @@ -2640,17 +2611,17 @@ - - - + + + - + PerformanceBar - + +task: Task +completed: int @@ -2658,7 +2629,7 @@ - + +Widget build() @@ -2667,9 +2638,9 @@ - + - + Task @@ -2678,24 +2649,24 @@ - - - + + + - + PerformanceSection - + +minimumRatio: double +maximum: double - + +Widget buildContent() +String getPowerLevelDescription() @@ -2704,19 +2675,154 @@ + + + + + + + + ReportSectionWidget + + + + + + +subject: StudySubject + + + + + + + + + + + void Function()? + + + + + + + + + + + + + AverageSectionWidget + + + + + + +section: AverageSection + +titlePos: List<int> + +phasePos: List<int> + + + + + + +Widget build() + +Widget getLegend() + +Widget getDiagram() + +BarChartData getChartData() + +Widget getTitles() + +Widget getValues() + +List<BarChartGroupData> getBarGroups() + +FlGridData getGridData() + +MaterialColor getColor() + +int getDayIndex() + +Iterable<DiagramDatum> getAggregatedData() + +Map<String, String?> getInterventionNames() + + + + + + + + + + + AverageSection + + + + + + + + + + + + DiagramDatum + + + + + + +x: num + +value: num + +timestamp: DateTime? + +intervention: String + + + + + + + + + + + + + LinearRegressionSectionWidget + + + + + + +section: LinearRegressionSection + + + + + + +Widget build() + + + + + + + + + + + LinearRegressionSection + + + + - - - + + + - + ReportSectionContainer - + +section: ReportSection +subject: StudySubject @@ -2725,7 +2831,7 @@ - + +ReportSectionWidget buildContents() +dynamic () @@ -2737,20 +2843,38 @@ - + - + ReportSection + + + + + + + + DisclaimerSection + + + + + + +Widget buildContent() + + + + - + - + Settings @@ -2759,23 +2883,23 @@ - - - + + + - + OptOutAlertDialog - + +subject: StudySubject? - + +Widget build() @@ -2784,145 +2908,97 @@ - - - + + + - + DeleteAlertDialog - + +subject: StudySubject? - + +Widget build() - - - - - - - - TaskBox - - - - - - +taskInstance: TaskInstance - +icon: Icon - +onCompleted: dynamic Function() - - - - - - - - - - - Icon - - - - - - - - - - - dynamic Function() - - - - - - - - + + + + - - - ProgressRow + + + FAQ - - - +subject: StudySubject? + + + +Widget build() - - - - - + + + + - - - InterventionSegment + + + Entry - - - +intervention: Intervention - +percentCompleted: double - +percentMissed: double - +isCurrent: bool - +isFuture: bool - +phaseDuration: int + + + +title: String + +children: List<Entry> - - - +List<Widget> buildSeparators() - +Widget build() + + + + + + + + + + EntryItem - - - - - - - - - TaskOverview + + + +entry: Entry - - - +subject: StudySubject? - +scheduleToday: List<TaskInstance>? - +interventionIcon: String? + + + -Widget _buildTiles() + +Widget build() - + - + ContactScreen @@ -2931,17 +3007,17 @@ - - - + + + - + ContactWidget - + +contact: Contact? +title: String @@ -2950,7 +3026,7 @@ - + +Widget build() @@ -2959,9 +3035,9 @@ - + - + Contact @@ -2970,17 +3046,17 @@ - - - + + + - + ContactItem - + +iconData: IconData +itemName: String @@ -2990,7 +3066,7 @@ - + +dynamic launchContact() +Widget build() @@ -3000,16 +3076,16 @@ - - + + - + ContactItemType - + +index: int <static>+values: List<ContactItemType> @@ -3022,683 +3098,808 @@ - + - + Enum - - - - + + + + - - - FAQ + + + DashboardScreen - - - +Widget build() + + + +error: String? - - - - + + + + - - - Entry + + + OverflowMenuItem - - - +title: String - +children: List<Entry> + + + +name: String + +icon: IconData + +routeName: String? + +onTap: dynamic Function()? - - - - - + + + - - - EntryItem + + + dynamic Function()? - - - +entry: Entry + + + + + + + + + + StudyFinishedPlaceholder - - - -Widget _buildTiles() - +Widget build() + + + <static>+space: SizedBox + + + + + + +Widget build() - - - - + + + - - - DashboardScreen + + + SizedBox - - - +error: String? + + + + + + + + + TaskOverview + + + + + + +subject: StudySubject? + +scheduleToday: List<TaskInstance>? + +interventionIcon: String? - - - - + + + + - - - OverflowMenuItem + + + ProgressRow - - - +name: String - +icon: IconData - +routeName: String? - +onTap: dynamic Function()? + + + +subject: StudySubject? - - - + + + + + - - - dynamic Function()? + + + InterventionSegment + + + + + + +intervention: Intervention + +percentCompleted: double + +percentMissed: double + +isCurrent: bool + +isFuture: bool + +phaseDuration: int + + + + + + +List<Widget> buildSeparators() + +Widget build() - - - - - + + + + - - - StudyFinishedPlaceholder + + + TaskBox - - - <static>+space: SizedBox + + + +taskInstance: TaskInstance + +icon: Icon + +onCompleted: dynamic Function() + + + + + + + + + + + dynamic Function() + + + + + + + + + + + + + Routes + + + + + + <static>+loading: String + <static>+preview: String + <static>+appOutdated: String + <static>+dashboard: String + <static>+welcome: String + <static>+about: String + <static>+terms: String + <static>+studySelection: String + <static>+studyOverview: String + <static>+interventionSelection: String + <static>+journey: String + <static>+consent: String + <static>+kickoff: String + <static>+contact: String + <static>+faq: String + <static>+appSettings: String + <static>+questionnaire: String + <static>+reportHistory: String + <static>+reportDetails: String + <static>+performanceDetails: String + + + + + + <static>+Route<dynamic> unknownRoute() + <static>+Route<dynamic>? generateRoute() + + + + + + + + + + + + NotificationValidators + + + + + + +didNotificationLaunchApp: bool + +wasNotificationActionHandled: bool + +wasNotificationActionCompleted: bool + + + + + + + + + + + + + StudyNotifications + + + + + + +subject: StudySubject? + +flutterLocalNotificationsPlugin: FlutterLocalNotificationsPlugin + +context: BuildContext + +didReceiveLocalNotificationStream: StreamController<ReceivedNotification> + +selectNotificationStream: StreamController<String?> + <static>+validator: NotificationValidators + <static>+debug: bool + <static>+scheduledNotificationsDebug: String? - - - +Widget build() + + + <static>+dynamic create() + -dynamic _isAndroidPermissionGranted() + -dynamic _requestPermissions() + -void _configureDidReceiveLocalNotificationSubject() + -void _configureSelectNotificationSubject() + -void _initNotificationsPlugin() + +dynamic handleNotificationResponse() - - - + + + - - - SizedBox + + + FlutterLocalNotificationsPlugin - - - - + + + - - - QuestionnaireTaskWidget + + + BuildContext - - - +task: QuestionnaireTask - +completionPeriod: CompletionPeriod + + + + + + + + StreamController - - - + + + + - - - QuestionnaireTask + + + ReceivedNotification - - - - - - - - CompletionPeriod + + + +id: int? + +title: String? + +body: String? + +payload: String? - - - - - + + + + - - - TaskScreen + + + StudyNotification - - - +taskInstance: TaskInstance + + + +taskInstance: TaskInstance + +date: DateTime - - - <static>+MaterialPageRoute<bool> routeFor() + + + + + + + + + + TemporaryStorageHandler - - - - - - - - - CheckmarkTaskWidget + + + <static>-_stagingBaseNamePrefix: String + <static>-_audioFileType: String + <static>-_imageFileType: String + -_userId: String + -_studyId: String - - - +task: CheckmarkTask? - +completionPeriod: CompletionPeriod? + + + -String _buildFileName() + <static>-dynamic _getMultimodalTempDirectory() + <static>-dynamic _getMultimodalUploadDirectory() + <static>+dynamic moveStagingFileToUploadDirectory() + <static>+dynamic getFutureBlobFiles() + +dynamic getStagingAudio() + +dynamic getStagingImage() + <static>+dynamic deleteAllStagingFiles() - - - + + + + + - - - CheckmarkTask + + + GroupedIterable - - - - - - - - - AppOutdatedScreen + + + +data: Map<K, Iterable<V>> + +iterator: Iterator<MapEntry<K, Iterable<V>>> - - - +Widget build() + + + +Iterable<MapEntry<K, R>> aggregate() + +Iterable<MapEntry<K, R>> aggregateWithKey() - - - + + + - - - TermsScreen + + + Iterable - - - - - + + + + + - - - LegalSection + + + Cache - - - +title: String? - +description: String? - +icon: Icon? - +pdfUrl: String? - +pdfUrlLabel: String? - +acknowledgment: String? - +isChecked: bool? - +onChange: void Function(bool?)? + + + <static>+isSynchronizing: bool - - - +Widget build() + + + <static>+dynamic storeSubject() + <static>+dynamic loadSubject() + <static>+dynamic storeAnalytics() + <static>+dynamic loadAnalytics() + <static>+dynamic delete() + <static>+dynamic uploadBlobFiles() + <static>+dynamic synchronize() - - - + + + + + - - - void Function(bool?)? + + + AppAnalytics - - - - - - - - - IFrameHelper + + + <static>-_userEnabled: bool? + <static>+keyAnalyticsUserEnable: String + +context: BuildContext + +subject: StudySubject? + <static>+isUserEnabled: dynamic - - - +void postRouteFinished() - +void listen() + + + <static>+dynamic init() + <static>+dynamic start() + <static>+void setEnabled() + +dynamic initBasic() + +void initAdvanced() - - - - + + + + - - - LoadingScreen + + + ThemeConfig - - - +sessionString: String? - +queryParameters: Map<String, String>? + + + <static>+SliderThemeData coloredSliderTheme() - - - - + + + + - - - AboutScreen + + + ScaleQuestionWidget - - - +Widget build() + + + +question: ScaleQuestion + +onDone: dynamic Function(Answer<dynamic>)? - - - - - - - - - Preview - - - - - - +queryParameters: Map<String, String>? - +appLanguage: AppLanguage - +selectedRoute: String? - +extra: String? - +study: Study? - +selectedStudyObjectId: String? - +subject: StudySubject? - - + + + - - - +bool hasRoute() - +void handleQueries() - +dynamic init() - +dynamic handleAuthorization() - +dynamic runCommands() - +String? getSelectedRoute() - +bool containsQuery() - +bool containsQueryPair() - +dynamic getStudySubject() - -dynamic _createFakeSubject() - +List<String> getInterventionIds() + + + ScaleQuestion - - - + + + - - - AppLanguage + + + dynamic Function(Answer<dynamic>)? - - - - + + + + - - - WelcomeScreen + + + QuestionWidget - - - +Widget build() + + + +subtitle: String? - - - - + + + + - - - ThemeConfig + + + VisualAnalogueQuestionWidget - - - <static>+SliderThemeData coloredSliderTheme() + + + +question: VisualAnalogueQuestion + +onDone: dynamic Function(Answer<dynamic>)? - - - - - + + + - - - HtmlText + + + VisualAnalogueQuestion - - - +text: String? - +style: TextStyle? - +centered: bool + + + + + + + + + AnnotatedScaleQuestionWidget - - - +Widget build() + + + +question: AnnotatedScaleQuestion + +onDone: dynamic Function(Answer<dynamic>)? - - - + + + - - - TextStyle + + + AnnotatedScaleQuestion - - - - - + + + + - - - RoundCheckbox + + + BooleanQuestionWidget - - - +onChanged: dynamic Function(bool)? - +value: bool? + + + +question: BooleanQuestion + +onDone: dynamic Function(Answer<dynamic>)? - - - +Widget build() + + + + + + + + BooleanQuestion - - - + + + + - - - dynamic Function(bool)? + + + FreeTextQuestionWidget + + + + + + +question: FreeTextQuestion + +onDone: dynamic Function(Answer<dynamic>)? - - - - - + + + - - - CustomSlider + + + FreeTextQuestion - - - +value: double? - +minValue: double? - +maxValue: double? - +minorTick: int? - +onChanged: dynamic Function(double)? - +onChangeEnd: dynamic Function(double)? - +activeColor: Color? - +inactiveColor: Color? - +minColor: Color? - +maxColor: Color? - +thumbColor: Color? - +isColored: bool - +labelValuePrecision: int - +tickValuePrecision: int - +linearStep: bool - +steps: AnnotatedScaleQuestion? + + + + + + + + + ChoiceQuestionWidget - - - +Widget build() + + + +question: ChoiceQuestion + +onDone: dynamic Function(Answer<dynamic>) + +multiSelectionText: String + +subtitle: String? - - - + + + - - - dynamic Function(double)? + + + ChoiceQuestion - - - + + + - - - AnnotatedScaleQuestion + + + dynamic Function(Answer<dynamic>) - - - - + + + + - - - CustomTrackShape + + + AudioRecordingQuestionWidget - - - +Rect getPreferredRect() + + + +question: AudioRecordingQuestion + +onDone: dynamic Function(Answer<FutureBlobFile>)? - - - + + + - - - RoundedRectSliderTrackShape + + + AudioRecordingQuestion - - - - - - - - - QuestionHeader - - - - - - +prompt: String? - +subtitle: String? - +rationale: String? - - + + + - - - -List<Widget> _buildSubtitle() - -List<Widget> _buildRationaleButton() - +Widget build() + + + dynamic Function(Answer<FutureBlobFile>)? - - + + - + QuestionnaireWidget - + +title: String? +header: String? @@ -3710,295 +3911,255 @@ - - - + + + - + HtmlTextBox - + +text: String? - + +Widget build() - - - - - - - - BooleanQuestionWidget - - - - - - +question: BooleanQuestion - +onDone: dynamic Function(Answer<dynamic>)? - - - - - - - + + + + - - - BooleanQuestion + + + ImageCapturingQuestionWidget - - - - - - - - dynamic Function(Answer<dynamic>)? + + + +question: ImageCapturingQuestion + +onDone: dynamic Function(Answer<FutureBlobFile>)? - - - - - - - - QuestionWidget - - + + + - - - +subtitle: String? + + + ImageCapturingQuestion - - - - - - - - FreeTextQuestionWidget - - + + + + - - - +question: FreeTextQuestion - +onDone: dynamic Function(Answer<dynamic>)? + + + QuestionContainer - - - - - - - - FreeTextQuestion + + + +onDone: dynamic Function(Answer<dynamic>, int) + +question: Question<dynamic> + +index: int - - - - - - - - ScaleQuestionWidget - - + + + - - - +question: ScaleQuestion - +onDone: dynamic Function(Answer<dynamic>)? + + + dynamic Function(Answer<dynamic>, int) - - - + + + - - - ScaleQuestion + + + Question - - - - + + + + + - - - VisualAnalogueQuestionWidget + + + QuestionHeader - - - +question: VisualAnalogueQuestion - +onDone: dynamic Function(Answer<dynamic>)? + + + +prompt: String? + +subtitle: String? + +rationale: String? - - - - - - - - - VisualAnalogueQuestion + + + + -List<Widget> _buildSubtitle() + -List<Widget> _buildRationaleButton() + +Widget build() - - - - + + + + + - - - ChoiceQuestionWidget + + + CustomSlider - - - +question: ChoiceQuestion - +onDone: dynamic Function(Answer<dynamic>) - +multiSelectionText: String - +subtitle: String? + + + +value: double? + +minValue: double? + +maxValue: double? + +minorTick: int? + +onChanged: dynamic Function(double)? + +onChangeEnd: dynamic Function(double)? + +activeColor: Color? + +inactiveColor: Color? + +minColor: Color? + +maxColor: Color? + +thumbColor: Color? + +isColored: bool + +labelValuePrecision: int + +tickValuePrecision: int + +linearStep: bool + +steps: AnnotatedScaleQuestion? - - - - - - - - ChoiceQuestion + + + +Widget build() - - - + + + - - - dynamic Function(Answer<dynamic>) + + + dynamic Function(double)? - - - - + + + + - - - AnnotatedScaleQuestionWidget + + + CustomTrackShape - - - +question: AnnotatedScaleQuestion - +onDone: dynamic Function(Answer<dynamic>)? + + + +Rect getPreferredRect() - - - - - - - - QuestionContainer - - + + + - - - +onDone: dynamic Function(Answer<dynamic>, int) - +question: Question<dynamic> - +index: int + + + RoundedRectSliderTrackShape - - - + + + + + - - - dynamic Function(Answer<dynamic>, int) + + + BottomOnboardingNavigation - - - - + + + +onBack: void Function()? + +onNext: void Function()? + +backLabel: String? + +nextLabel: String? + +hideNext: bool + +nextIcon: Icon? + +backIcon: Icon? + +progress: Widget? + + - - - Question + + + +Widget build() - - - + + + - + InterventionCard - + +intervention: Intervention +selected: bool @@ -4009,7 +4170,7 @@ - + +Widget build() @@ -4018,17 +4179,17 @@ - - - + + + - + InterventionCardTitle - + +intervention: Intervention? +selected: bool @@ -4038,7 +4199,7 @@ - + +Widget build() @@ -4047,23 +4208,23 @@ - - - + + + - + InterventionCardDescription - + +intervention: Intervention - + +Widget build() @@ -4072,23 +4233,23 @@ - - - + + + - + _TaskList - + +tasks: List<InterventionTask> - + +String scheduleString() +Widget build() @@ -4096,48 +4257,19 @@ - - - - - - - - - SelectableButton - - - - - - +child: Widget - +selected: bool - +onTap: dynamic Function()? - - - - - - -Color _getFillColor() - -Color _getTextColor() - +Widget build() - - - - - - - + + + - + StudyTile - + +title: String? +description: String? @@ -4147,7 +4279,7 @@ - + +Widget build() @@ -4156,88 +4288,146 @@ - + - + EdgeInsetsGeometry - - - - - + + + + + - - - BottomOnboardingNavigation + + + RoundCheckbox - - - +onBack: void Function()? - +onNext: void Function()? - +backLabel: String? - +nextLabel: String? - +hideNext: bool - +nextIcon: Icon? - +backIcon: Icon? - +progress: Widget? + + + +onChanged: dynamic Function(bool)? + +value: bool? - - - +Widget build() + + + +Widget build() - - - - - + + + - - - Routes + + + dynamic Function(bool)? - - - <static>+loading: String - <static>+preview: String - <static>+appOutdated: String - <static>+dashboard: String - <static>+welcome: String - <static>+about: String - <static>+terms: String - <static>+studySelection: String - <static>+studyOverview: String - <static>+interventionSelection: String - <static>+journey: String - <static>+consent: String - <static>+kickoff: String - <static>+contact: String - <static>+faq: String - <static>+appSettings: String - <static>+questionnaire: String - <static>+reportHistory: String - <static>+reportDetails: String - <static>+performanceDetails: String + + + + + + + + + + SelectableButton - - - <static>+Route<dynamic> unknownRoute() - <static>+Route<dynamic>? generateRoute() + + + +child: Widget + +selected: bool + +onTap: dynamic Function()? + + + + + + -Color _getFillColor() + -Color _getTextColor() + +Widget build() + + + + + + + + + + + + + HtmlText + + + + + + +text: String? + +style: TextStyle? + +centered: bool + + + + + + +Widget build() + + + + + + + + + + + TextStyle + + + + + + + + + + + + MyApp + + + + + + +queryParameters: Map<String, String> + +appConfig: AppConfig? + +initialRoute: String + + + + + + + + + + + AppConfig diff --git a/docs/uml/app/lib/util/uml.svg b/docs/uml/app/lib/util/uml.svg index 67876f367..d4be4e904 100644 --- a/docs/uml/app/lib/util/uml.svg +++ b/docs/uml/app/lib/util/uml.svg @@ -1,55 +1,5 @@ - - [StudyNotification - | - +taskInstance: TaskInstance; - +date: DateTime - ] - - [StudyNotification]o-[TaskInstance] - - [GroupedIterable - | - +data: Map<K, Iterable<V>>; - +iterator: Iterator<MapEntry<K, Iterable<V>>> - | - +Iterable<MapEntry<K, R>> aggregate(); - +Iterable<MapEntry<K, R>> aggregateWithKey() - ] - - [Iterable]<:-[GroupedIterable] - - [TemporaryStorageHandler - | - <static>-_stagingBaseNamePrefix: String; - <static>-_audioFileType: String; - <static>-_imageFileType: String; - -_userId: String; - -_studyId: String - | - -String _buildFileName(); - <static>-dynamic _getMultimodalTempDirectory(); - <static>-dynamic _getMultimodalUploadDirectory(); - <static>+dynamic moveStagingFileToUploadDirectory(); - <static>+dynamic getFutureBlobFiles(); - +dynamic getStagingAudio(); - +dynamic getStagingImage(); - <static>+dynamic deleteAllStagingFiles() - ] - - [Cache - | - <static>+isSynchronizing: bool - | - <static>+dynamic storeSubject(); - <static>+dynamic loadSubject(); - <static>+dynamic storeAnalytics(); - <static>+dynamic loadAnalytics(); - <static>+dynamic delete(); - <static>+dynamic uploadBlobFiles(); - <static>+dynamic synchronize() - ] - - [NotificationValidators + + [NotificationValidators | +didNotificationLaunchApp: bool; +wasNotificationActionHandled: bool; @@ -90,6 +40,56 @@ +payload: String? ] + [StudyNotification + | + +taskInstance: TaskInstance; + +date: DateTime + ] + + [StudyNotification]o-[TaskInstance] + + [TemporaryStorageHandler + | + <static>-_stagingBaseNamePrefix: String; + <static>-_audioFileType: String; + <static>-_imageFileType: String; + -_userId: String; + -_studyId: String + | + -String _buildFileName(); + <static>-dynamic _getMultimodalTempDirectory(); + <static>-dynamic _getMultimodalUploadDirectory(); + <static>+dynamic moveStagingFileToUploadDirectory(); + <static>+dynamic getFutureBlobFiles(); + +dynamic getStagingAudio(); + +dynamic getStagingImage(); + <static>+dynamic deleteAllStagingFiles() + ] + + [GroupedIterable + | + +data: Map<K, Iterable<V>>; + +iterator: Iterator<MapEntry<K, Iterable<V>>> + | + +Iterable<MapEntry<K, R>> aggregate(); + +Iterable<MapEntry<K, R>> aggregateWithKey() + ] + + [Iterable]<:-[GroupedIterable] + + [Cache + | + <static>+isSynchronizing: bool + | + <static>+dynamic storeSubject(); + <static>+dynamic loadSubject(); + <static>+dynamic storeAnalytics(); + <static>+dynamic loadAnalytics(); + <static>+dynamic delete(); + <static>+dynamic uploadBlobFiles(); + <static>+dynamic synchronize() + ] + [AppAnalytics | <static>-_userEnabled: bool?; @@ -112,191 +112,56 @@ - + - + - + - - - + - + - + - + - + - + - + - + - + - + - + + + - + - + - - - - - - - - - - StudyNotification - - - - - - +taskInstance: TaskInstance - +date: DateTime - - - - - - - - - - - TaskInstance - - - - - - - - - - - - - GroupedIterable - - - - - - +data: Map<K, Iterable<V>> - +iterator: Iterator<MapEntry<K, Iterable<V>>> - - - - - - +Iterable<MapEntry<K, R>> aggregate() - +Iterable<MapEntry<K, R>> aggregateWithKey() - - - - - - - - - - - Iterable - - - - - - - - - - - - - TemporaryStorageHandler - - - - - - <static>-_stagingBaseNamePrefix: String - <static>-_audioFileType: String - <static>-_imageFileType: String - -_userId: String - -_studyId: String - - - - - - -String _buildFileName() - <static>-dynamic _getMultimodalTempDirectory() - <static>-dynamic _getMultimodalUploadDirectory() - <static>+dynamic moveStagingFileToUploadDirectory() - <static>+dynamic getFutureBlobFiles() - +dynamic getStagingAudio() - +dynamic getStagingImage() - <static>+dynamic deleteAllStagingFiles() - - - - - - - - - - - - - Cache - - - - - - <static>+isSynchronizing: bool - - - - - - <static>+dynamic storeSubject() - <static>+dynamic loadSubject() - <static>+dynamic storeAnalytics() - <static>+dynamic loadAnalytics() - <static>+dynamic delete() - <static>+dynamic uploadBlobFiles() - <static>+dynamic synchronize() - - - + - - + + - + NotificationValidators - + +didNotificationLaunchApp: bool +wasNotificationActionHandled: bool @@ -307,17 +172,17 @@ - - - + + + - + StudyNotifications - + +subject: StudySubject? +flutterLocalNotificationsPlugin: FlutterLocalNotificationsPlugin @@ -330,7 +195,7 @@ - + <static>+dynamic create() -dynamic _isAndroidPermissionGranted() @@ -345,9 +210,9 @@ - + - + StudySubject @@ -356,9 +221,9 @@ - + - + FlutterLocalNotificationsPlugin @@ -367,9 +232,9 @@ - + - + BuildContext @@ -378,9 +243,9 @@ - + - + StreamController @@ -389,16 +254,16 @@ - - + + - + ReceivedNotification - + +id: int? +title: String? @@ -408,19 +273,154 @@ + + + + + + + + StudyNotification + + + + + + +taskInstance: TaskInstance + +date: DateTime + + + + + + + + + + + TaskInstance + + + + + + + + + + + + + TemporaryStorageHandler + + + + + + <static>-_stagingBaseNamePrefix: String + <static>-_audioFileType: String + <static>-_imageFileType: String + -_userId: String + -_studyId: String + + + + + + -String _buildFileName() + <static>-dynamic _getMultimodalTempDirectory() + <static>-dynamic _getMultimodalUploadDirectory() + <static>+dynamic moveStagingFileToUploadDirectory() + <static>+dynamic getFutureBlobFiles() + +dynamic getStagingAudio() + +dynamic getStagingImage() + <static>+dynamic deleteAllStagingFiles() + + + + + + + + + + + + + GroupedIterable + + + + + + +data: Map<K, Iterable<V>> + +iterator: Iterator<MapEntry<K, Iterable<V>>> + + + + + + +Iterable<MapEntry<K, R>> aggregate() + +Iterable<MapEntry<K, R>> aggregateWithKey() + + + + + + + + + + + Iterable + + + + + + + + + + + + + Cache + + + + + + <static>+isSynchronizing: bool + + + + + + <static>+dynamic storeSubject() + <static>+dynamic loadSubject() + <static>+dynamic storeAnalytics() + <static>+dynamic loadAnalytics() + <static>+dynamic delete() + <static>+dynamic uploadBlobFiles() + <static>+dynamic synchronize() + + + + - - - + + + - + AppAnalytics - + <static>-_userEnabled: bool? <static>+keyAnalyticsUserEnable: String @@ -430,7 +430,7 @@ - + <static>+dynamic init() <static>+dynamic start() From f12fcd9502afc55a4ad694f7ac5b87831a938052 Mon Sep 17 00:00:00 2001 From: Johannes Vedder Date: Mon, 29 Apr 2024 11:54:17 +0200 Subject: [PATCH 024/314] fix: upgrade deps and migrate --- app/pubspec.lock | 64 +++++++------------ app/pubspec.yaml | 6 +- core/pubspec.lock | 12 ++-- core/pubspec.yaml | 2 +- .../question/question_form_controller.dart | 6 +- designer_v2/pubspec.lock | 64 ++++++++----------- designer_v2/pubspec.yaml | 14 ++-- flutter_common/pubspec.lock | 32 +++++----- flutter_common/pubspec.yaml | 2 +- 9 files changed, 89 insertions(+), 113 deletions(-) diff --git a/app/pubspec.lock b/app/pubspec.lock index cbad20ab3..19dda25f1 100644 --- a/app/pubspec.lock +++ b/app/pubspec.lock @@ -5,18 +5,18 @@ packages: dependency: transitive description: name: app_links - sha256: "42dc15aecf2618ace4ffb74a2e58a50e45cd1b9f2c17c8f0cafe4c297f08c815" + sha256: "0fd41f0501f131d931251e0942ac63d6216096a0052aeca037915c2c1deeb121" url: "https://pub.dev" source: hosted - version: "4.0.1" + version: "5.0.0" archive: dependency: transitive description: name: archive - sha256: "22600aa1e926be775fa5fe7e6894e7fb3df9efda8891c73f70fb3262399a432d" + sha256: "0763b45fa9294197a2885c8567927e2830ade852e5c896fd4ab7e0e348d0f373" url: "https://pub.dev" source: hosted - version: "3.4.10" + version: "3.5.0" args: dependency: transitive description: @@ -45,10 +45,10 @@ packages: dependency: transitive description: name: barcode - sha256: "1fe4a55344505850517ce72d4a3a7b9ccf51b0dc1631ee7e552f6eacc4947f96" + sha256: ab180ce22c6555d77d45f0178a523669db67f95856e3378259ef2ffeb43e6003 url: "https://pub.dev" source: hosted - version: "2.2.7" + version: "2.2.8" bidi: dependency: transitive description: @@ -85,10 +85,10 @@ packages: dependency: transitive description: name: cached_network_image_web - sha256: "42a835caa27c220d1294311ac409a43361088625a4f23c820b006dd9bffb3316" + sha256: "205d6a9f1862de34b93184f22b9d2d94586b2f05c581d546695e3d8f6a805cd7" url: "https://pub.dev" source: hosted - version: "1.1.1" + version: "1.2.0" camera: dependency: "direct main" description: @@ -185,14 +185,6 @@ packages: url: "https://pub.dev" source: hosted version: "1.18.0" - convert: - dependency: transitive - description: - name: convert - sha256: "0f08b14755d163f6e2134cb58222dd25ea2a2ee8a195e53983d57c075324d592" - url: "https://pub.dev" - source: hosted - version: "3.1.1" cross_file: dependency: "direct main" description: @@ -465,10 +457,10 @@ packages: dependency: transitive description: name: functions_client - sha256: "9a0ab83a525c8691a6724746e642de755a299afa04158807787364cd9e718001" + sha256: a70b0dd9a1c35d05d1141557f7e49ffe4de5f450ffde31755a9eeeadca03b8ee url: "https://pub.dev" source: hosted - version: "2.0.0" + version: "2.1.0" fwfh_cached_network_image: dependency: transitive description: @@ -521,10 +513,10 @@ packages: dependency: transitive description: name: gotrue - sha256: a0eee21a7e8ec09e6bbd5c9a36e31e423827b575ba6fc2dd049805dcfaac5b02 + sha256: c9c984f088320a5c5e87c7a34571e3de3982cca4cbd8b978e59d36baf748edfb url: "https://pub.dev" source: hosted - version: "2.6.0" + version: "2.6.1" gtk: dependency: transitive description: @@ -577,10 +569,10 @@ packages: dependency: "direct main" description: name: intl - sha256: "3bc132a9dbce73a7e4a21a17d06e1878839ffbf975568bc875c60537824b0c4d" + sha256: d6f56758b7d3014a48af9701c085700aac781a92a87a62b1333b46d8879661cf url: "https://pub.dev" source: hosted - version: "0.18.1" + version: "0.19.0" js: dependency: transitive description: @@ -633,10 +625,10 @@ packages: dependency: transitive description: name: leak_tracker - sha256: "78eb209deea09858f5269f5a5b02be4049535f568c07b275096836f01ea323fa" + sha256: "3f87a60e8c63aecc975dda1ceedbc8f24de75f09e4856ea27daf8958f2f0ce05" url: "https://pub.dev" source: hosted - version: "10.0.0" + version: "10.0.5" leak_tracker_flutter_testing: dependency: transitive description: @@ -649,10 +641,10 @@ packages: dependency: transitive description: name: leak_tracker_testing - sha256: a597f72a664dbd293f3bfc51f9ba69816f84dcd403cdac7066cb3f6003f3ab47 + sha256: d4c8f568c60af6b6daa74c80fc04411765769882600f6bf9cd4b391c96de42ce url: "https://pub.dev" source: hosted - version: "2.0.1" + version: "2.0.3" lints: dependency: transitive description: @@ -705,10 +697,10 @@ packages: dependency: transitive description: name: meta - sha256: d584fa6707a52763a52446f02cc621b077888fb63b93bbcb1143a7be5a0c0c04 + sha256: "25dfcaf170a0190f47ca6355bdd4552cb8924b430512ff0cafb8db9bd41fe33b" url: "https://pub.dev" source: hosted - version: "1.11.0" + version: "1.14.0" mime: dependency: transitive description: @@ -893,14 +885,6 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.8" - pointycastle: - dependency: transitive - description: - name: pointycastle - sha256: "79fbafed02cfdbe85ef3fd06c7f4bc2cbcba0177e61b765264853d4253b21744" - url: "https://pub.dev" - source: hosted - version: "3.9.0" postgrest: dependency: transitive description: @@ -1204,18 +1188,18 @@ packages: dependency: "direct main" description: name: supabase - sha256: b652dab5f3041ae85c94358bf9142b3c85655446ab9a78e1b40bbd41b9d8087b + sha256: ef407187b18c440f4a5c3f3cf30eb5cc1daadd4ff5616febf445a37e0e0ed34e url: "https://pub.dev" source: hosted - version: "2.1.1" + version: "2.1.2" supabase_flutter: dependency: "direct main" description: name: supabase_flutter - sha256: cfbe0ad4e3e7a0d4621340323d3c9da5326e7a19689b93359f130f7a27b3c284 + sha256: "6a77bd6ef6dc451bb2561de0334d68d620b84d7df1de1448dd7962ed5d1a79ea" url: "https://pub.dev" source: hosted - version: "2.5.1" + version: "2.5.2" synchronized: dependency: transitive description: diff --git a/app/pubspec.yaml b/app/pubspec.yaml index 608fbd9ef..2a8d77388 100644 --- a/app/pubspec.yaml +++ b/app/pubspec.yaml @@ -24,7 +24,7 @@ dependencies: sdk: flutter flutter_widget_from_html: ^0.14.11 intersperse: ^2.0.0 - intl: ^0.18.1 # flutter_localizations + intl: ^0.19.0 material_design_icons_flutter: ^7.0.7296 package_info_plus: ^7.0.0 # wakelock_plus <= 1.2.4 path: ^1.9.0 @@ -40,8 +40,8 @@ dependencies: shared_preferences: ^2.2.3 studyu_core: ^4.4.1 studyu_flutter_common: ^1.8.2 - supabase: ^2.1.1 - supabase_flutter: ^2.5.1 + supabase: ^2.1.2 + supabase_flutter: ^2.5.2 timeline_tile: ^2.0.0 timezone: ^0.9.3 universal_html: ^2.2.4 diff --git a/core/pubspec.lock b/core/pubspec.lock index f07c31977..cfdd1b72f 100644 --- a/core/pubspec.lock +++ b/core/pubspec.lock @@ -197,10 +197,10 @@ packages: dependency: transitive description: name: functions_client - sha256: "9a0ab83a525c8691a6724746e642de755a299afa04158807787364cd9e718001" + sha256: a70b0dd9a1c35d05d1141557f7e49ffe4de5f450ffde31755a9eeeadca03b8ee url: "https://pub.dev" source: hosted - version: "2.0.0" + version: "2.1.0" glob: dependency: transitive description: @@ -213,10 +213,10 @@ packages: dependency: transitive description: name: gotrue - sha256: a0eee21a7e8ec09e6bbd5c9a36e31e423827b575ba6fc2dd049805dcfaac5b02 + sha256: c9c984f088320a5c5e87c7a34571e3de3982cca4cbd8b978e59d36baf748edfb url: "https://pub.dev" source: hosted - version: "2.6.0" + version: "2.6.1" graphs: dependency: transitive description: @@ -557,10 +557,10 @@ packages: dependency: "direct main" description: name: supabase - sha256: b652dab5f3041ae85c94358bf9142b3c85655446ab9a78e1b40bbd41b9d8087b + sha256: ef407187b18c440f4a5c3f3cf30eb5cc1daadd4ff5616febf445a37e0e0ed34e url: "https://pub.dev" source: hosted - version: "2.1.1" + version: "2.1.2" term_glyph: dependency: transitive description: diff --git a/core/pubspec.yaml b/core/pubspec.yaml index e3019f053..bd5987f50 100644 --- a/core/pubspec.yaml +++ b/core/pubspec.yaml @@ -14,7 +14,7 @@ dependencies: logger: ^2.2.0 quiver: ^3.2.1 sentry: ^8.0.0 - supabase: ^2.1.1 + supabase: ^2.1.2 uuid: ^4.4.0 dev_dependencies: diff --git a/designer_v2/lib/features/design/shared/questionnaire/question/question_form_controller.dart b/designer_v2/lib/features/design/shared/questionnaire/question/question_form_controller.dart index 0863dba3c..0cf3d6c9b 100644 --- a/designer_v2/lib/features/design/shared/questionnaire/question/question_form_controller.dart +++ b/designer_v2/lib/features/design/shared/questionnaire/question/question_form_controller.dart @@ -115,7 +115,7 @@ class QuestionFormViewModel extends ManagedFormViewModel late final FormArray audioResponseOptionsArray = FormArray(audioOptions); final FormControl maxRecordingDurationSecondsControl = FormControl( value: kDefaultMaxRecordingDurationSeconds, - validators: [Validators.number, Validators.min(1), Validators.max(kMaxRecordingDurationSeconds)]); + validators: [Validators.number(allowNegatives: false), Validators.min(1), Validators.max(kMaxRecordingDurationSeconds)]); // Scale static const int kDefaultScaleMinValue = 0; @@ -234,7 +234,7 @@ class QuestionFormViewModel extends ManagedFormViewModel validators.add(Validators.pattern(alphanumericPattern)); break; case FreeTextQuestionType.numeric: - validators.add(Validators.number); + validators.add(Validators.number(allowNegatives: false)); break; case FreeTextQuestionType.custom: if (customRegexControl.value != null) { @@ -362,7 +362,7 @@ class QuestionFormViewModel extends ManagedFormViewModel get maxRecordingDurationValid { return FormControlValidation(control: maxRecordingDurationSecondsControl, validators: [ - Validators.number, + Validators.number(allowNegatives: false), Validators.min(1), Validators.max(kMaxRecordingDurationSeconds), ], validationMessages: { diff --git a/designer_v2/pubspec.lock b/designer_v2/pubspec.lock index bb00fcb1a..f0cc30dea 100644 --- a/designer_v2/pubspec.lock +++ b/designer_v2/pubspec.lock @@ -29,18 +29,18 @@ packages: dependency: transitive description: name: app_links - sha256: "42dc15aecf2618ace4ffb74a2e58a50e45cd1b9f2c17c8f0cafe4c297f08c815" + sha256: "0fd41f0501f131d931251e0942ac63d6216096a0052aeca037915c2c1deeb121" url: "https://pub.dev" source: hosted - version: "4.0.1" + version: "5.0.0" archive: dependency: "direct main" description: name: archive - sha256: "22600aa1e926be775fa5fe7e6894e7fb3df9efda8891c73f70fb3262399a432d" + sha256: "0763b45fa9294197a2885c8567927e2830ade852e5c896fd4ab7e0e348d0f373" url: "https://pub.dev" source: hosted - version: "3.4.10" + version: "3.5.0" args: dependency: transitive description: @@ -371,10 +371,10 @@ packages: dependency: transitive description: name: functions_client - sha256: "9a0ab83a525c8691a6724746e642de755a299afa04158807787364cd9e718001" + sha256: a70b0dd9a1c35d05d1141557f7e49ffe4de5f450ffde31755a9eeeadca03b8ee url: "https://pub.dev" source: hosted - version: "2.0.0" + version: "2.1.0" glob: dependency: transitive description: @@ -395,10 +395,10 @@ packages: dependency: transitive description: name: gotrue - sha256: a0eee21a7e8ec09e6bbd5c9a36e31e423827b575ba6fc2dd049805dcfaac5b02 + sha256: c9c984f088320a5c5e87c7a34571e3de3982cca4cbd8b978e59d36baf748edfb url: "https://pub.dev" source: hosted - version: "2.6.0" + version: "2.6.1" gtk: dependency: transitive description: @@ -456,10 +456,10 @@ packages: dependency: transitive description: name: intl - sha256: "3bc132a9dbce73a7e4a21a17d06e1878839ffbf975568bc875c60537824b0c4d" + sha256: d6f56758b7d3014a48af9701c085700aac781a92a87a62b1333b46d8879661cf url: "https://pub.dev" source: hosted - version: "0.18.1" + version: "0.19.0" io: dependency: transitive description: @@ -496,10 +496,10 @@ packages: dependency: transitive description: name: leak_tracker - sha256: "78eb209deea09858f5269f5a5b02be4049535f568c07b275096836f01ea323fa" + sha256: "3f87a60e8c63aecc975dda1ceedbc8f24de75f09e4856ea27daf8958f2f0ce05" url: "https://pub.dev" source: hosted - version: "10.0.0" + version: "10.0.5" leak_tracker_flutter_testing: dependency: transitive description: @@ -512,10 +512,10 @@ packages: dependency: transitive description: name: leak_tracker_testing - sha256: a597f72a664dbd293f3bfc51f9ba69816f84dcd403cdac7066cb3f6003f3ab47 + sha256: d4c8f568c60af6b6daa74c80fc04411765769882600f6bf9cd4b391c96de42ce url: "https://pub.dev" source: hosted - version: "2.0.1" + version: "2.0.3" lints: dependency: transitive description: @@ -568,10 +568,10 @@ packages: dependency: transitive description: name: meta - sha256: d584fa6707a52763a52446f02cc621b077888fb63b93bbcb1143a7be5a0c0c04 + sha256: "25dfcaf170a0190f47ca6355bdd4552cb8924b430512ff0cafb8db9bd41fe33b" url: "https://pub.dev" source: hosted - version: "1.11.0" + version: "1.14.0" mime: dependency: transitive description: @@ -724,14 +724,6 @@ packages: url: "https://pub.dev" source: hosted version: "0.10.2" - pointycastle: - dependency: transitive - description: - name: pointycastle - sha256: "79fbafed02cfdbe85ef3fd06c7f4bc2cbcba0177e61b765264853d4253b21744" - url: "https://pub.dev" - source: hosted - version: "3.9.0" pool: dependency: transitive description: @@ -784,34 +776,34 @@ packages: dependency: "direct main" description: name: reactive_color_picker - sha256: dbb0dcd2a41f2af836baf06164deddeaa0465ba75ef537ab4b2747073214561b + sha256: "175889c7a0435de18d56dd3e821bb0e398ca25ae4895f02baef95289bf4a1acb" url: "https://pub.dev" source: hosted - version: "2.0.0" + version: "2.0.1" reactive_forms: dependency: "direct main" description: name: reactive_forms - sha256: b7d64d8fe45c19f506c762e219f4c6a3bdcfc4842d6fba98f866be5fca75d8e5 + sha256: "10771b3b8f7df3dc6942928cc55b2abb49c0a5eb56ca8ab1ff4084b2bd968044" url: "https://pub.dev" source: hosted - version: "16.1.1" + version: "17.0.0" reactive_multi_select_flutter: dependency: "direct main" description: name: reactive_multi_select_flutter - sha256: "78bd530847d9d37d2ec05b18413ca68ec670cd65ddc59ba40a4bbf532757093e" + sha256: "1127da052f7d315e96563a23958c1aa5952ab702a6093aba20aa459d58c183eb" url: "https://pub.dev" source: hosted - version: "2.0.0" + version: "2.0.1" reactive_range_slider: dependency: "direct main" description: name: reactive_range_slider - sha256: "63c35ef17a146e02d3d98c8912278ac718106ba1ed72679eeba8d784855c713a" + sha256: b493aaf682a7bb0800b582951e63cbba92563c3361164b566a377e498dc8cfd5 url: "https://pub.dev" source: hosted - version: "2.0.0" + version: "2.0.1" realtime_client: dependency: transitive description: @@ -1059,18 +1051,18 @@ packages: dependency: "direct main" description: name: supabase - sha256: b652dab5f3041ae85c94358bf9142b3c85655446ab9a78e1b40bbd41b9d8087b + sha256: ef407187b18c440f4a5c3f3cf30eb5cc1daadd4ff5616febf445a37e0e0ed34e url: "https://pub.dev" source: hosted - version: "2.1.1" + version: "2.1.2" supabase_flutter: dependency: "direct main" description: name: supabase_flutter - sha256: cfbe0ad4e3e7a0d4621340323d3c9da5326e7a19689b93359f130f7a27b3c284 + sha256: "6a77bd6ef6dc451bb2561de0334d68d620b84d7df1de1448dd7962ed5d1a79ea" url: "https://pub.dev" source: hosted - version: "2.5.1" + version: "2.5.2" sync_http: dependency: transitive description: diff --git a/designer_v2/pubspec.yaml b/designer_v2/pubspec.yaml index 378fa75a5..f36fe086e 100644 --- a/designer_v2/pubspec.yaml +++ b/designer_v2/pubspec.yaml @@ -9,7 +9,7 @@ environment: sdk: '>=3.0.0 <4.0.0' dependencies: - archive: ^3.4.10 + archive: ^3.5.0 async: ^2.11.0 csv: ^6.0.0 cupertino_icons: ^1.0.8 @@ -27,15 +27,15 @@ dependencies: material_color_utilities: material_design_icons_flutter: ^7.0.7296 pointer_interceptor: ^0.10.1 - reactive_color_picker: ^2.0.0 - reactive_forms: ^16.1.1 # reactive_range_slider <= 2.0.0 - reactive_multi_select_flutter: ^2.0.0 - reactive_range_slider: ^2.0.0 + reactive_color_picker: ^2.0.1 + reactive_forms: ^17.0.0 + reactive_multi_select_flutter: ^2.0.1 + reactive_range_slider: ^2.0.1 rxdart: ^0.27.7 studyu_core: ^4.4.1 studyu_flutter_common: ^1.8.2 - supabase: ^2.1.1 - supabase_flutter: ^2.5.1 + supabase: ^2.1.2 + supabase_flutter: ^2.5.2 url_launcher: ^6.2.6 uuid: ^4.4.0 diff --git a/flutter_common/pubspec.lock b/flutter_common/pubspec.lock index 5521f4aa5..bf35dd539 100644 --- a/flutter_common/pubspec.lock +++ b/flutter_common/pubspec.lock @@ -5,10 +5,10 @@ packages: dependency: transitive description: name: app_links - sha256: "42dc15aecf2618ace4ffb74a2e58a50e45cd1b9f2c17c8f0cafe4c297f08c815" + sha256: "0fd41f0501f131d931251e0942ac63d6216096a0052aeca037915c2c1deeb121" url: "https://pub.dev" source: hosted - version: "4.0.1" + version: "5.0.0" async: dependency: transitive description: @@ -180,18 +180,18 @@ packages: dependency: transitive description: name: functions_client - sha256: "9a0ab83a525c8691a6724746e642de755a299afa04158807787364cd9e718001" + sha256: a70b0dd9a1c35d05d1141557f7e49ffe4de5f450ffde31755a9eeeadca03b8ee url: "https://pub.dev" source: hosted - version: "2.0.0" + version: "2.1.0" gotrue: dependency: transitive description: name: gotrue - sha256: a0eee21a7e8ec09e6bbd5c9a36e31e423827b575ba6fc2dd049805dcfaac5b02 + sha256: c9c984f088320a5c5e87c7a34571e3de3982cca4cbd8b978e59d36baf748edfb url: "https://pub.dev" source: hosted - version: "2.6.0" + version: "2.6.1" gtk: dependency: transitive description: @@ -244,10 +244,10 @@ packages: dependency: transitive description: name: leak_tracker - sha256: "78eb209deea09858f5269f5a5b02be4049535f568c07b275096836f01ea323fa" + sha256: "3f87a60e8c63aecc975dda1ceedbc8f24de75f09e4856ea27daf8958f2f0ce05" url: "https://pub.dev" source: hosted - version: "10.0.0" + version: "10.0.5" leak_tracker_flutter_testing: dependency: transitive description: @@ -260,10 +260,10 @@ packages: dependency: transitive description: name: leak_tracker_testing - sha256: a597f72a664dbd293f3bfc51f9ba69816f84dcd403cdac7066cb3f6003f3ab47 + sha256: d4c8f568c60af6b6daa74c80fc04411765769882600f6bf9cd4b391c96de42ce url: "https://pub.dev" source: hosted - version: "2.0.1" + version: "2.0.3" lints: dependency: transitive description: @@ -300,10 +300,10 @@ packages: dependency: transitive description: name: meta - sha256: d584fa6707a52763a52446f02cc621b077888fb63b93bbcb1143a7be5a0c0c04 + sha256: "25dfcaf170a0190f47ca6355bdd4552cb8924b430512ff0cafb8db9bd41fe33b" url: "https://pub.dev" source: hosted - version: "1.11.0" + version: "1.14.0" mime: dependency: transitive description: @@ -552,18 +552,18 @@ packages: dependency: transitive description: name: supabase - sha256: b652dab5f3041ae85c94358bf9142b3c85655446ab9a78e1b40bbd41b9d8087b + sha256: ef407187b18c440f4a5c3f3cf30eb5cc1daadd4ff5616febf445a37e0e0ed34e url: "https://pub.dev" source: hosted - version: "2.1.1" + version: "2.1.2" supabase_flutter: dependency: "direct main" description: name: supabase_flutter - sha256: cfbe0ad4e3e7a0d4621340323d3c9da5326e7a19689b93359f130f7a27b3c284 + sha256: "6a77bd6ef6dc451bb2561de0334d68d620b84d7df1de1448dd7962ed5d1a79ea" url: "https://pub.dev" source: hosted - version: "2.5.1" + version: "2.5.2" synchronized: dependency: "direct main" description: diff --git a/flutter_common/pubspec.yaml b/flutter_common/pubspec.yaml index 0522ef65c..15437a3fb 100644 --- a/flutter_common/pubspec.yaml +++ b/flutter_common/pubspec.yaml @@ -14,7 +14,7 @@ dependencies: flutter_secure_storage: ^9.0.0 shared_preferences: ^2.2.3 # Can be removed after migrating phase studyu_core: ^4.4.1 - supabase_flutter: ^2.5.1 + supabase_flutter: ^2.5.2 synchronized: ^3.1.0+1 uuid: ^4.4.0 From 9e5cf789aafcc1581c366f36293248f0d05d628e Mon Sep 17 00:00:00 2001 From: Johannes Vedder Date: Mon, 29 Apr 2024 11:58:07 +0200 Subject: [PATCH 025/314] chore(release): publish packages - studyu_app@2.7.4-dev.0 - studyu_core@4.4.2-dev.0 - studyu_designer_v2@1.8.0-dev.0 - studyu_flutter_common@1.8.3-dev.0 --- CHANGELOG.md | 37 +++++++++++++++++++++++++++++++++++++ app/CHANGELOG.md | 4 ++++ app/pubspec.yaml | 6 +++--- core/CHANGELOG.md | 4 ++++ core/pubspec.yaml | 2 +- designer_v2/CHANGELOG.md | 5 +++++ designer_v2/pubspec.yaml | 6 +++--- flutter_common/CHANGELOG.md | 4 ++++ flutter_common/pubspec.yaml | 4 ++-- 9 files changed, 63 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d09abeb61..fac3f4242 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,43 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## 2024-04-29 + +### Changes + +--- + +Packages with breaking changes: + + - There are no breaking changes in this release. + +Packages with other changes: + + - [`studyu_app` - `v2.7.4-dev.0`](#studyu_app---v274-dev0) + - [`studyu_core` - `v4.4.2-dev.0`](#studyu_core---v442-dev0) + - [`studyu_designer_v2` - `v1.8.0-dev.0`](#studyu_designer_v2---v180-dev0) + - [`studyu_flutter_common` - `v1.8.3-dev.0`](#studyu_flutter_common---v183-dev0) + +--- + +#### `studyu_app` - `v2.7.4-dev.0` + + - **FIX**: upgrade deps and migrate. + +#### `studyu_core` - `v4.4.2-dev.0` + + - **FIX**: upgrade deps and migrate. + +#### `studyu_designer_v2` - `v1.8.0-dev.0` + + - **FIX**: upgrade deps and migrate. + - **FEAT**: sort invite codes alphabetically. + +#### `studyu_flutter_common` - `v1.8.3-dev.0` + + - **FIX**: upgrade deps and migrate. + + ## 2024-04-26 ### Changes diff --git a/app/CHANGELOG.md b/app/CHANGELOG.md index 3eb285599..0aa8a48f3 100644 --- a/app/CHANGELOG.md +++ b/app/CHANGELOG.md @@ -1,3 +1,7 @@ +## 2.7.4-dev.0 + + - **FIX**: upgrade deps and migrate. + ## 2.7.3 - **FIX**: skip handling multimodal for web. ([27ba5298](https://github.com/hpi-studyu/studyu/commit/27ba5298a1b714e1cc7e21a6d88c286f91e2907a)) diff --git a/app/pubspec.yaml b/app/pubspec.yaml index 2a8d77388..f21aa8416 100644 --- a/app/pubspec.yaml +++ b/app/pubspec.yaml @@ -1,5 +1,5 @@ name: studyu_app -version: 2.7.3 +version: 2.7.4-dev.0 description: Partake in digital N-of-1 trials with the innovative StudyU Health App publish_to: none homepage: https://studyu.health @@ -38,8 +38,8 @@ dependencies: sentry_flutter: ^8.0.0 sentry_logging: ^8.0.0 shared_preferences: ^2.2.3 - studyu_core: ^4.4.1 - studyu_flutter_common: ^1.8.2 + studyu_core: ^4.4.2-dev.0 + studyu_flutter_common: ^1.8.3-dev.0 supabase: ^2.1.2 supabase_flutter: ^2.5.2 timeline_tile: ^2.0.0 diff --git a/core/CHANGELOG.md b/core/CHANGELOG.md index 628add53f..e4b68e9a5 100644 --- a/core/CHANGELOG.md +++ b/core/CHANGELOG.md @@ -1,3 +1,7 @@ +## 4.4.2-dev.0 + + - **FIX**: upgrade deps and migrate. + ## 4.4.1 - **FIX**: check if result is QuestionnaireState. ([c7535804](https://github.com/hpi-studyu/studyu/commit/c7535804281f9bbdf757a2eb11df03940eceeec9)) diff --git a/core/pubspec.yaml b/core/pubspec.yaml index bd5987f50..457b30aca 100644 --- a/core/pubspec.yaml +++ b/core/pubspec.yaml @@ -1,5 +1,5 @@ name: studyu_core -version: 4.4.1 +version: 4.4.2-dev.0 description: This package contains StudyU models and common functions for the app and designer packages homepage: https://studyu.health repository: https://github.com/hpi-studyu/studyu diff --git a/designer_v2/CHANGELOG.md b/designer_v2/CHANGELOG.md index d099f7090..8793c2e3a 100644 --- a/designer_v2/CHANGELOG.md +++ b/designer_v2/CHANGELOG.md @@ -1,3 +1,8 @@ +## 1.8.0-dev.0 + + - **FIX**: upgrade deps and migrate. + - **FEAT**: sort invite codes alphabetically. + ## 1.7.2 - **FIX**: signup was not possible with flutter_secure_storage. ([26425971](https://github.com/hpi-studyu/studyu/commit/2642597141653aa724a1305456e43840d6fbebe5)) diff --git a/designer_v2/pubspec.yaml b/designer_v2/pubspec.yaml index f36fe086e..294c1a8d1 100644 --- a/designer_v2/pubspec.yaml +++ b/designer_v2/pubspec.yaml @@ -1,5 +1,5 @@ name: studyu_designer_v2 -version: 1.7.2 +version: 1.8.0-dev.0 description: Implement digital N-of-1 studies seamlessly with the StudyU Health Designer publish_to: none homepage: https://studyu.health @@ -32,8 +32,8 @@ dependencies: reactive_multi_select_flutter: ^2.0.1 reactive_range_slider: ^2.0.1 rxdart: ^0.27.7 - studyu_core: ^4.4.1 - studyu_flutter_common: ^1.8.2 + studyu_core: ^4.4.2-dev.0 + studyu_flutter_common: ^1.8.3-dev.0 supabase: ^2.1.2 supabase_flutter: ^2.5.2 url_launcher: ^6.2.6 diff --git a/flutter_common/CHANGELOG.md b/flutter_common/CHANGELOG.md index 684b4435b..c7262f9c0 100644 --- a/flutter_common/CHANGELOG.md +++ b/flutter_common/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.8.3-dev.0 + + - **FIX**: upgrade deps and migrate. + ## 1.8.2 - **FIX**: skip signin after signup if user is already authenticated. ([7e978122](https://github.com/hpi-studyu/studyu/commit/7e97812279b77fb9406fb288341c0fd9e349ad9c)) diff --git a/flutter_common/pubspec.yaml b/flutter_common/pubspec.yaml index 15437a3fb..068a8c397 100644 --- a/flutter_common/pubspec.yaml +++ b/flutter_common/pubspec.yaml @@ -1,5 +1,5 @@ name: studyu_flutter_common -version: 1.8.2 +version: 1.8.3-dev.0 description: StudyU common flutter components and functions for app and designer homepage: https://studyu.health repository: https://github.com/hpi-studyu/studyu @@ -13,7 +13,7 @@ dependencies: flutter_dotenv: ^5.1.0 flutter_secure_storage: ^9.0.0 shared_preferences: ^2.2.3 # Can be removed after migrating phase - studyu_core: ^4.4.1 + studyu_core: ^4.4.2-dev.0 supabase_flutter: ^2.5.2 synchronized: ^3.1.0+1 uuid: ^4.4.0 From 7a68007f03b1d0c49e0c50fadd77e7fc512ea882 Mon Sep 17 00:00:00 2001 From: Johannes Vedder Date: Mon, 29 Apr 2024 12:45:12 +0200 Subject: [PATCH 026/314] chore: lock files --- app/pubspec.lock | 4 ++-- designer_v2/pubspec.lock | 4 ++-- flutter_common/pubspec.lock | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/app/pubspec.lock b/app/pubspec.lock index 19dda25f1..c1d20a32e 100644 --- a/app/pubspec.lock +++ b/app/pubspec.lock @@ -1176,14 +1176,14 @@ packages: path: "../core" relative: true source: path - version: "4.4.1" + version: "4.4.2-dev.0" studyu_flutter_common: dependency: "direct main" description: path: "../flutter_common" relative: true source: path - version: "1.8.2" + version: "1.8.3-dev.0" supabase: dependency: "direct main" description: diff --git a/designer_v2/pubspec.lock b/designer_v2/pubspec.lock index f0cc30dea..fc33e6cb2 100644 --- a/designer_v2/pubspec.lock +++ b/designer_v2/pubspec.lock @@ -1039,14 +1039,14 @@ packages: path: "../core" relative: true source: path - version: "4.4.1" + version: "4.4.2-dev.0" studyu_flutter_common: dependency: "direct main" description: path: "../flutter_common" relative: true source: path - version: "1.8.2" + version: "1.8.3-dev.0" supabase: dependency: "direct main" description: diff --git a/flutter_common/pubspec.lock b/flutter_common/pubspec.lock index bf35dd539..9c7d8768c 100644 --- a/flutter_common/pubspec.lock +++ b/flutter_common/pubspec.lock @@ -547,7 +547,7 @@ packages: path: "../core" relative: true source: path - version: "4.4.1" + version: "4.4.2-dev.0" supabase: dependency: transitive description: From e45970e09a3b639dcb0b44f31796f8b5581980f9 Mon Sep 17 00:00:00 2001 From: Johannes Vedder Date: Mon, 29 Apr 2024 14:33:57 +0200 Subject: [PATCH 027/314] chore: override intl: ^0.19.0 --- app/pubspec.yaml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/pubspec.yaml b/app/pubspec.yaml index f21aa8416..d8c4269c0 100644 --- a/app/pubspec.yaml +++ b/app/pubspec.yaml @@ -55,6 +55,9 @@ dev_dependencies: flutter_test: sdk: flutter +dependency_overrides: + intl: ^0.19.0 + flutter: generate: true uses-material-design: true From f7178f5158053b8a5e9b712fcdc0c508b520b27c Mon Sep 17 00:00:00 2001 From: Johannes Vedder Date: Mon, 13 May 2024 14:36:30 +0200 Subject: [PATCH 028/314] docs: update docs --- CONTRIBUTING.md | 17 ++++++++++++++--- README.md | 8 ++++++++ 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 508848533..fe7f35f17 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -2,10 +2,10 @@ ## Getting Started -1. Clone this repository and `cd` into it. -2. [Setup Flutter](https://flutter.dev/docs/get-started/install) -3. Make sure both flutter and dart are in your PATH. Run `dart --version` and +1. [Setup Flutter](https://flutter.dev/docs/get-started/install) +2. Make sure both flutter and dart are in your PATH. Run `dart --version` and `flutter --version` to check. +3. Clone this repository and `cd` into it. 4. Install [Melos](https://melos.invertase.dev/) by running: `dart pub global activate melos`. Melos is used to manage the Monorepo structure and links all packages. @@ -58,6 +58,7 @@ STUDYU_SUPABASE_URL=https://efeapuvwaxtxnlkzlajv.supabase.co STUDYU_SUPABASE_PUBLIC_ANON_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJyb2xlIjoiYW5vbiIsImlhdCI6MTYyNTUwODMyOCwiZXhwIjoxOTQxMDg0MzI4fQ.PUirsx5Zzhj3akaStc5Djid0aAVza3ELoZ5XUTqM91A STUDYU_PROJECT_GENERATOR_URL=https://studyu-project-generator-2zro3rzera-ew.a.run.app STUDYU_APP_URL="https://app.studyu.health/" +STUDYU_DESIGNER_URL="https://designer.studyu.health/" ``` The great advantage of this new approach (compared to the previous approach @@ -91,6 +92,16 @@ Contrary to most recommendations, we commit those generated files to Git. This is needed, because core is a dependency by app and designer and dependencies need to have all files generated, when being imported. +## Code Style + +We use the [Effective Dart](https://dart.dev/guides/language/effective-dart) +guidelines for Dart and Flutter. Run `melos format` to format your code and +`melos analyze` to check for any issues. For commit messages, we use the +[Conventional Commits](https://www.conventionalcommits.org) format. For any new +features or bug fixes, create a new branch and open a pull request. + +Please make sure to follow these guidelines when contributing to the project. + ## Database and Backend We are using a self-hosted instance of [Supabase](https://supabase.com/) as a diff --git a/README.md b/README.md index b426a3cb5..c87fd03ca 100644 --- a/README.md +++ b/README.md @@ -13,6 +13,14 @@ research methods. Find out more about StudyU and start your first digital N-of-1 trial now at: **[StudyU.health](https://www.studyu.health)** +Are you a researcher or clinician interested in conducting large-scale N-of-1 +trials on a digital basis? Then the StudyU platform is the right choice for you. +[Contact us](https://www.studyu.health/contact) to learn more about how we can +support your research. + +Are you a developer interested in contributing to the StudyU platform? Then +check out our [contributing guidelines](CONTRIBUTING.md) to get started. + ## The StudyU Platform The StudyU platform incorporates the [StudyU App](https://app.studyu.health) From 983c1e6513b680bcd0d95d5a856508ad0ef4a884 Mon Sep 17 00:00:00 2001 From: Johannes Vedder Date: Thu, 11 Apr 2024 11:32:40 +0200 Subject: [PATCH 029/314] refactor: improved app config error handling --- core/lib/src/models/tables/app_config.dart | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/core/lib/src/models/tables/app_config.dart b/core/lib/src/models/tables/app_config.dart index a4e4a5764..020097540 100644 --- a/core/lib/src/models/tables/app_config.dart +++ b/core/lib/src/models/tables/app_config.dart @@ -43,7 +43,14 @@ class AppConfig extends SupabaseObjectFunctions { @override Map toJson() => _$AppConfigToJson(this); - static Future getAppConfig() async => SupabaseQuery.getById('prod'); + static Future getAppConfig() async { + try { + return await SupabaseQuery.getById('prod'); + } catch (error) { + throw Exception("Could not load app config. Check if the database is " + "running and app_config table is properly set up."); + } + } static Future getAppContact() async { return (await getAppConfig()).contact; From cbb04b6ed0997a9f1f6b108fdd3cc198fa51af14 Mon Sep 17 00:00:00 2001 From: Johannes Vedder Date: Mon, 13 May 2024 16:16:08 +0200 Subject: [PATCH 030/314] chore: load whole env asset folder --- flutter_common/lib/src/utils/env_loader.dart | 2 +- flutter_common/pubspec.yaml | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/flutter_common/lib/src/utils/env_loader.dart b/flutter_common/lib/src/utils/env_loader.dart index 7a0796e71..c4e6886a5 100644 --- a/flutter_common/lib/src/utils/env_loader.dart +++ b/flutter_common/lib/src/utils/env_loader.dart @@ -3,7 +3,7 @@ import 'package:studyu_core/env.dart' as env; import 'package:studyu_flutter_common/src/utils/storage.dart'; import 'package:supabase_flutter/supabase_flutter.dart'; -const envsAssetPath = 'packages/studyu_flutter_common/envs'; +const envsAssetPath = 'packages/studyu_flutter_common/lib/envs'; // load env from envs/.env or from the filename specified in the STUDYU_ENV runtime-variable String envFilePath() { diff --git a/flutter_common/pubspec.yaml b/flutter_common/pubspec.yaml index bf12523c3..95d68592f 100644 --- a/flutter_common/pubspec.yaml +++ b/flutter_common/pubspec.yaml @@ -26,5 +26,4 @@ dev_dependencies: flutter: generate: true assets: - - packages/studyu_flutter_common/envs/.env - - packages/studyu_flutter_common/envs/.env.dev + - lib/envs/ From d7e843491dd7078c05e2b6e1582f65f060ed0b4d Mon Sep 17 00:00:00 2001 From: Johannes Vedder Date: Mon, 13 May 2024 16:27:39 +0200 Subject: [PATCH 031/314] chore: refactor melos scripts for dev --- melos.yaml | 64 +++++++++--------------------------------------------- 1 file changed, 10 insertions(+), 54 deletions(-) diff --git a/melos.yaml b/melos.yaml index 16c3c92b1..26004f38a 100644 --- a/melos.yaml +++ b/melos.yaml @@ -76,21 +76,21 @@ scripts: packageFilters: scope: studyu_core - dev:designer: + dev:app: run: | melos exec -c 1 -- \ - "flutter run -d chrome --web-port 3001 --dart-define=STUDYU_ENV=.env.local" + "flutter run -d chrome --web-port 8080 --dart-define=STUDYU_ENV=.env.local" packageFilters: - scope: studyu_designer_v2 - description: Runs designer in Chrome on port 3001 with local env for local development + scope: studyu_app + description: Runs app for local development - dev:app: + dev:designer: run: | melos exec -c 1 -- \ - "flutter run --dart-define=STUDYU_ENV=.env.local" + "flutter run -d chrome --web-port 8081 --dart-define=STUDYU_ENV=.env.local" packageFilters: - scope: studyu_app - description: Runs app with local env for local development + scope: studyu_designer_v2 + description: Runs designer for local development build:android: run: | @@ -125,54 +125,10 @@ scripts: packageFilters: scope: studyu_app - build:web:designer_v2: + build:web:designer: run: | melos exec -c 1 --fail-fast -- \ "flutter build web" - description: Build designer_v2 for Web. - packageFilters: - scope: studyu_designer_v2 - - build:web:dev: - run: | - melos exec -c 2 --fail-fast -- \ - "flutter build web --web-renderer auto --dart-define=STUDYU_ENV=.env.dev" - description: Build web dev. - packageFilters: - scope: [studyu_app, studyu_designer_v2] - dir-exists: web - - build:web:app:dev: - run: | - melos exec -c 2 --fail-fast -- \ - "flutter build web --web-renderer auto --dart-define=STUDYU_ENV=.env.dev" - description: Build web app dev. - packageFilters: - scope: studyu_app - dir-exists: web - - build:web:designer_v2:dev: - run: | - melos exec -c 2 --fail-fast -- \ - "flutter build web --web-renderer auto --dart-define=STUDYU_ENV=.env.dev" - description: Build web designer_v2 dev. - packageFilters: - scope: studyu_designer_v2 - dir-exists: web - - # Used to test Designer "Try out study" feature, where the designer opens the App using the user auth token from designer - app:web:local: - run: | - melos exec -c 1 -- \ - "flutter run lib/main.dart -d chrome --web-port 8080 --dart-define=STUDYU_ENV=.env.local" - packageFilters: - scope: studyu_app - description: Runs app in chrome on port 8080 with local env - - designer_v2:web:local: - run: | - melos exec -c 1 -- \ - "flutter run lib/main.dart -d chrome --web-port 8081 --dart-define=STUDYU_ENV=.env.local" + description: Build designer for Web. packageFilters: scope: studyu_designer_v2 - description: Runs designer in chrome on port 8081 with local env From 04a708643f5068e0f84283f5759689e4ac92f345 Mon Sep 17 00:00:00 2001 From: Johannes Vedder Date: Fri, 26 Apr 2024 10:40:21 +0200 Subject: [PATCH 032/314] chore: add reset melos script --- melos.yaml | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/melos.yaml b/melos.yaml index 26004f38a..eceeb013b 100644 --- a/melos.yaml +++ b/melos.yaml @@ -8,16 +8,6 @@ packages: - core - flutter_common -command: - clean: - hooks: - # Clean things very deeply, can be used to establish "pristine checkout" status - pre: > - git clean -x -d -f -q || true - # Additional cleanup lifecycle script, executed when `melos clean` is ran. - post: > - melos exec --flutter --concurrency=3 -- "flutter clean" - scripts: analyze: run: | @@ -76,6 +66,14 @@ scripts: packageFilters: scope: studyu_core + reset: + run: | + git clean -x -d -f -q || true + melos clean + melos exec --flutter --concurrency=1 -- "flutter clean" + melos bootstrap + description: Reset the workspace to a pristine checkout status. + dev:app: run: | melos exec -c 1 -- \ From e278abfa3647624e462b4856cfe43833a8c32ae0 Mon Sep 17 00:00:00 2001 From: Johannes Vedder Date: Mon, 13 May 2024 16:34:44 +0200 Subject: [PATCH 033/314] chore: upgrade deps --- app/pubspec.lock | 96 ++++++++++++++++++------------------- app/pubspec.yaml | 18 +++---- core/pubspec.lock | 12 ++--- core/pubspec.yaml | 6 +-- designer_v2/pubspec.lock | 76 ++++++++++++++--------------- designer_v2/pubspec.yaml | 12 ++--- flutter_common/pubspec.lock | 52 ++++++++++---------- flutter_common/pubspec.yaml | 4 +- pubspec.lock | 16 +++---- pubspec.yaml | 2 +- 10 files changed, 147 insertions(+), 147 deletions(-) diff --git a/app/pubspec.lock b/app/pubspec.lock index c1d20a32e..d8c5b9b1e 100644 --- a/app/pubspec.lock +++ b/app/pubspec.lock @@ -93,10 +93,10 @@ packages: dependency: "direct main" description: name: camera - sha256: "9499cbc2e51d8eb0beadc158b288380037618ce4e30c9acbc4fae1ac3ecb5797" + sha256: dfa8fc5a1adaeb95e7a54d86a5bd56f4bb0e035515354c8ac6d262e35cec2ec8 url: "https://pub.dev" source: hosted - version: "0.10.5+9" + version: "0.10.6" camera_android: dependency: transitive description: @@ -277,10 +277,10 @@ packages: dependency: "direct main" description: name: fl_chart - sha256: "2b7c1f5d867da9a054661641c8f499c55c47c39acccb97b3bc673f5fa9a39e74" + sha256: d0f0d49112f2f4b192481c16d05b6418bd7820e021e265a3c22db98acf7ed7fb url: "https://pub.dev" source: hosted - version: "0.67.0" + version: "0.68.0" flutter: dependency: "direct main" description: flutter @@ -322,18 +322,18 @@ packages: dependency: "direct dev" description: name: flutter_lints - sha256: "9e8c3858111da373efc5aa341de011d9bd23e2c5c5e0c62bccf32438e192d7b1" + sha256: "3f41d009ba7172d5ff9be5f6e6e6abb4300e263aab8866d2a0842ed2a70f8f0c" url: "https://pub.dev" source: hosted - version: "3.0.2" + version: "4.0.0" flutter_local_notifications: dependency: "direct main" description: name: flutter_local_notifications - sha256: "8cdc719114ab1c86c64bb7a86d3a679674c3637edd229e3a994797d4a1504ce4" + sha256: "40e6fbd2da7dcc7ed78432c5cdab1559674b4af035fddbfb2f9a8f9c2112fcef" url: "https://pub.dev" source: hosted - version: "17.1.0" + version: "17.1.2" flutter_local_notifications_linux: dependency: transitive description: @@ -367,50 +367,50 @@ packages: dependency: transitive description: name: flutter_secure_storage - sha256: ffdbb60130e4665d2af814a0267c481bcf522c41ae2e43caf69fa0146876d685 + sha256: c0f402067fb0498934faa6bddd670de0a3db45222e2ca9a068c6177c9a2360a4 url: "https://pub.dev" source: hosted - version: "9.0.0" + version: "9.1.1" flutter_secure_storage_linux: dependency: transitive description: name: flutter_secure_storage_linux - sha256: "3d5032e314774ee0e1a7d0a9f5e2793486f0dff2dd9ef5a23f4e3fb2a0ae6a9e" + sha256: "4d91bfc23047422cbcd73ac684bc169859ee766482517c22172c86596bf1464b" url: "https://pub.dev" source: hosted - version: "1.2.0" + version: "1.2.1" flutter_secure_storage_macos: dependency: transitive description: name: flutter_secure_storage_macos - sha256: bd33935b4b628abd0b86c8ca20655c5b36275c3a3f5194769a7b3f37c905369c + sha256: "8cfa53010a294ff095d7be8fa5bb15f2252c50018d69c5104851303f3ff92510" url: "https://pub.dev" source: hosted - version: "3.0.1" + version: "3.1.0" flutter_secure_storage_platform_interface: dependency: transitive description: name: flutter_secure_storage_platform_interface - sha256: "0d4d3a5dd4db28c96ae414d7ba3b8422fd735a8255642774803b2532c9a61d7e" + sha256: "301f67ee9b87f04aef227f57f13f126fa7b13543c8e7a93f25c5d2d534c28a4a" url: "https://pub.dev" source: hosted - version: "1.0.2" + version: "1.1.1" flutter_secure_storage_web: dependency: transitive description: name: flutter_secure_storage_web - sha256: "30f84f102df9dcdaa2241866a958c2ec976902ebdaa8883fbfe525f1f2f3cf20" + sha256: f4ebff989b4f07b2656fb16b47852c0aab9fed9b4ec1c70103368337bc1886a9 url: "https://pub.dev" source: hosted - version: "1.1.2" + version: "1.2.1" flutter_secure_storage_windows: dependency: transitive description: name: flutter_secure_storage_windows - sha256: "5809c66f9dd3b4b93b0a6e2e8561539405322ee767ac2f64d084e2ab5429d108" + sha256: b20b07cb5ed4ed74fc567b78a72936203f587eba460af1df11281c9326cd3709 url: "https://pub.dev" source: hosted - version: "3.0.0" + version: "3.1.2" flutter_svg: dependency: transitive description: @@ -441,18 +441,18 @@ packages: dependency: "direct main" description: name: flutter_widget_from_html - sha256: "22c911b6ccf82b83e0c457d987bac4e703440fea0fc88dab24f4dfe995a5f33f" + sha256: b931148824bcfc24c7be6f2daeabf549e237c9e617e93cd63256d924884ce423 url: "https://pub.dev" source: hosted - version: "0.14.11" + version: "0.15.0" flutter_widget_from_html_core: dependency: transitive description: name: flutter_widget_from_html_core - sha256: "028f4989b9ff4907466af233d50146d807772600d98a3e895662fbdb09c39225" + sha256: cc1d9be3d187ce668ee02091cd5442dfb050cdaf98e0ab9a4d12ad008f966979 url: "https://pub.dev" source: hosted - version: "0.14.11" + version: "0.14.12" functions_client: dependency: transitive description: @@ -481,10 +481,10 @@ packages: dependency: transitive description: name: fwfh_just_audio - sha256: "4962bc59cf8bbb0a77a55ff56a7b925612b0d8263bc2ede3636b9c86113cb493" + sha256: "209cf9644599e37b0edb6961c4f30ce80d156f5a53a50355f75fb4a22f9fdb0a" url: "https://pub.dev" source: hosted - version: "0.14.2" + version: "0.14.3" fwfh_svg: dependency: transitive description: @@ -505,10 +505,10 @@ packages: dependency: transitive description: name: fwfh_webview - sha256: b828bb5ddd4361a866cdb8f1b0de4f3348f332915ecf2f4215ba17e46c656adc + sha256: "63fa69577d5cbed5603cc91d6a7eca62472a852db14225da2f4ec6839c2f59e6" url: "https://pub.dev" source: hosted - version: "0.14.8" + version: "0.15.0" gotrue: dependency: transitive description: @@ -625,10 +625,10 @@ packages: dependency: transitive description: name: leak_tracker - sha256: "3f87a60e8c63aecc975dda1ceedbc8f24de75f09e4856ea27daf8958f2f0ce05" + sha256: "78eb209deea09858f5269f5a5b02be4049535f568c07b275096836f01ea323fa" url: "https://pub.dev" source: hosted - version: "10.0.5" + version: "10.0.0" leak_tracker_flutter_testing: dependency: transitive description: @@ -641,26 +641,26 @@ packages: dependency: transitive description: name: leak_tracker_testing - sha256: d4c8f568c60af6b6daa74c80fc04411765769882600f6bf9cd4b391c96de42ce + sha256: a597f72a664dbd293f3bfc51f9ba69816f84dcd403cdac7066cb3f6003f3ab47 url: "https://pub.dev" source: hosted - version: "2.0.3" + version: "2.0.1" lints: dependency: transitive description: name: lints - sha256: cbf8d4b858bb0134ef3ef87841abdf8d63bfc255c266b7bf6b39daa1085c4290 + sha256: "976c774dd944a42e83e2467f4cc670daef7eed6295b10b36ae8c85bcbf828235" url: "https://pub.dev" source: hosted - version: "3.0.0" + version: "4.0.0" logger: dependency: transitive description: name: logger - sha256: "8c94b8c219e7e50194efc8771cd0e9f10807d8d3e219af473d89b06cc2ee4e04" + sha256: af05cc8714f356fd1f3888fb6741cbe9fbe25cdb6eedbab80e1a6db21047d4a4 url: "https://pub.dev" source: hosted - version: "2.2.0" + version: "2.3.0" logging: dependency: transitive description: @@ -697,10 +697,10 @@ packages: dependency: transitive description: name: meta - sha256: "25dfcaf170a0190f47ca6355bdd4552cb8924b430512ff0cafb8db9bd41fe33b" + sha256: d584fa6707a52763a52446f02cc621b077888fb63b93bbcb1143a7be5a0c0c04 url: "https://pub.dev" source: hosted - version: "1.14.0" + version: "1.11.0" mime: dependency: transitive description: @@ -729,10 +729,10 @@ packages: dependency: "direct main" description: name: package_info_plus - sha256: "2c582551839386fa7ddbc7770658be7c0f87f388a4bff72066478f597c34d17f" + sha256: b93d8b4d624b4ea19b0a5a208b2d6eff06004bc3ce74c06040b120eeadd00ce0 url: "https://pub.dev" source: hosted - version: "7.0.0" + version: "8.0.0" package_info_plus_platform_interface: dependency: transitive description: @@ -1017,26 +1017,26 @@ packages: dependency: transitive description: name: sentry - sha256: "961630a4dba41cebd692612421fd3805a991ebd8ef4a8d84a6c179e6b89eaf22" + sha256: "1d2952d40b99da0dc4bf3ba4797e3985dd60cc61a13d0a1d2c62b02f6528441a" url: "https://pub.dev" source: hosted - version: "8.0.0" + version: "8.1.0" sentry_flutter: dependency: "direct main" description: name: sentry_flutter - sha256: "705da7adfcd1fb23fc8720b6e222f5e03d53f1d020cd635586c319ee323366b4" + sha256: "848aaccfc75f1d35d5f7e5230770761f1b2a33e604f24498200566443da1470a" url: "https://pub.dev" source: hosted - version: "8.0.0" + version: "8.1.0" sentry_logging: dependency: "direct main" description: name: sentry_logging - sha256: "136751f7d0428b89267fb0c5d20308cb6237148930ce3a5ff9f82c069a9ea793" + sha256: "86a0b30a868cd9738694ddde4b82a2ac60b1e33abdff04216dfc556ef6d56fb1" url: "https://pub.dev" source: hosted - version: "8.0.0" + version: "8.1.0" shared_preferences: dependency: "direct main" description: @@ -1420,10 +1420,10 @@ packages: dependency: "direct main" description: name: wakelock_plus - sha256: c8b7cc80f045533b40a0e6c9109905494e3cf32c0fbd5c62616998e0de44003f + sha256: "14758533319a462ffb5aa3b7ddb198e59b29ac3b02da14173a1715d65d4e6e68" url: "https://pub.dev" source: hosted - version: "1.2.4" + version: "1.2.5" wakelock_plus_platform_interface: dependency: transitive description: diff --git a/app/pubspec.yaml b/app/pubspec.yaml index d8c4269c0..0af37b3e9 100644 --- a/app/pubspec.yaml +++ b/app/pubspec.yaml @@ -8,25 +8,25 @@ repository: https://github.com/hpi-studyu/studyu environment: sdk: '>=3.2.0 <4.0.0' dependencies: - camera: ^0.10.5+9 + camera: ^0.10.6 collection: ^1.18.0 cross_file: ^0.3.4+1 cupertino_icons: ^1.0.8 - fl_chart: ^0.67.0 + fl_chart: ^0.68.0 flutter: sdk: flutter flutter_file_dialog: ^3.0.2 - flutter_local_notifications: ^17.1.0 + flutter_local_notifications: ^17.1.2 flutter_localizations: sdk: flutter flutter_timezone: ^1.0.8 flutter_web_plugins: sdk: flutter - flutter_widget_from_html: ^0.14.11 + flutter_widget_from_html: ^0.15.0 intersperse: ^2.0.0 intl: ^0.19.0 material_design_icons_flutter: ^7.0.7296 - package_info_plus: ^7.0.0 # wakelock_plus <= 1.2.4 + package_info_plus: ^8.0.0 path: ^1.9.0 path_provider: ^2.1.3 pdf: ^3.10.8 @@ -35,8 +35,8 @@ dependencies: quiver: ^3.2.1 rainbow_color: ^2.0.1 record: ^5.0.5 - sentry_flutter: ^8.0.0 - sentry_logging: ^8.0.0 + sentry_flutter: ^8.1.0 + sentry_logging: ^8.1.0 shared_preferences: ^2.2.3 studyu_core: ^4.4.2-dev.0 studyu_flutter_common: ^1.8.3-dev.0 @@ -47,11 +47,11 @@ dependencies: universal_html: ^2.2.4 url_launcher: ^6.2.6 uuid: ^4.4.0 - wakelock_plus: ^1.2.4 + wakelock_plus: ^1.2.5 dev_dependencies: flutter_launcher_icons: ^0.13.1 - flutter_lints: ^3.0.2 + flutter_lints: ^4.0.0 flutter_test: sdk: flutter diff --git a/core/pubspec.lock b/core/pubspec.lock index cfdd1b72f..e5bb2e1a2 100644 --- a/core/pubspec.lock +++ b/core/pubspec.lock @@ -301,10 +301,10 @@ packages: dependency: "direct main" description: name: logger - sha256: "8c94b8c219e7e50194efc8771cd0e9f10807d8d3e219af473d89b06cc2ee4e04" + sha256: af05cc8714f356fd1f3888fb6741cbe9fbe25cdb6eedbab80e1a6db21047d4a4 url: "https://pub.dev" source: hosted - version: "2.2.0" + version: "2.3.0" logging: dependency: transitive description: @@ -429,10 +429,10 @@ packages: dependency: "direct main" description: name: sentry - sha256: "961630a4dba41cebd692612421fd3805a991ebd8ef4a8d84a6c179e6b89eaf22" + sha256: "1d2952d40b99da0dc4bf3ba4797e3985dd60cc61a13d0a1d2c62b02f6528441a" url: "https://pub.dev" source: hosted - version: "8.0.0" + version: "8.1.0" shelf: dependency: transitive description: @@ -573,10 +573,10 @@ packages: dependency: "direct dev" description: name: test - sha256: d72b538180efcf8413cd2e4e6fcc7ae99c7712e0909eb9223f9da6e6d0ef715f + sha256: d11b55850c68c1f6c0cf00eabded4e66c4043feaf6c0d7ce4a36785137df6331 url: "https://pub.dev" source: hosted - version: "1.25.4" + version: "1.25.5" test_api: dependency: transitive description: diff --git a/core/pubspec.yaml b/core/pubspec.yaml index 457b30aca..64ab17b22 100644 --- a/core/pubspec.yaml +++ b/core/pubspec.yaml @@ -11,9 +11,9 @@ dependencies: collection: ^1.18.0 csv: ^6.0.0 json_annotation: ^4.9.0 - logger: ^2.2.0 + logger: ^2.3.0 quiver: ^3.2.1 - sentry: ^8.0.0 + sentry: ^8.1.0 supabase: ^2.1.2 uuid: ^4.4.0 @@ -21,4 +21,4 @@ dev_dependencies: build_runner: ^2.4.9 json_serializable: ^6.8.0 lint: ^2.3.0 - test: ^1.25.4 + test: ^1.25.5 diff --git a/designer_v2/pubspec.lock b/designer_v2/pubspec.lock index fc33e6cb2..c98bfe6dc 100644 --- a/designer_v2/pubspec.lock +++ b/designer_v2/pubspec.lock @@ -37,10 +37,10 @@ packages: dependency: "direct main" description: name: archive - sha256: "0763b45fa9294197a2885c8567927e2830ade852e5c896fd4ab7e0e348d0f373" + sha256: ecf4273855368121b1caed0d10d4513c7241dfc813f7d3c8933b36622ae9b265 url: "https://pub.dev" source: hosted - version: "3.5.0" + version: "3.5.1" args: dependency: transitive description: @@ -271,10 +271,10 @@ packages: dependency: "direct dev" description: name: flutter_lints - sha256: "9e8c3858111da373efc5aa341de011d9bd23e2c5c5e0c62bccf32438e192d7b1" + sha256: "3f41d009ba7172d5ff9be5f6e6e6abb4300e263aab8866d2a0842ed2a70f8f0c" url: "https://pub.dev" source: hosted - version: "3.0.2" + version: "4.0.0" flutter_localizations: dependency: "direct main" description: flutter @@ -292,50 +292,50 @@ packages: dependency: transitive description: name: flutter_secure_storage - sha256: ffdbb60130e4665d2af814a0267c481bcf522c41ae2e43caf69fa0146876d685 + sha256: c0f402067fb0498934faa6bddd670de0a3db45222e2ca9a068c6177c9a2360a4 url: "https://pub.dev" source: hosted - version: "9.0.0" + version: "9.1.1" flutter_secure_storage_linux: dependency: transitive description: name: flutter_secure_storage_linux - sha256: "3d5032e314774ee0e1a7d0a9f5e2793486f0dff2dd9ef5a23f4e3fb2a0ae6a9e" + sha256: "4d91bfc23047422cbcd73ac684bc169859ee766482517c22172c86596bf1464b" url: "https://pub.dev" source: hosted - version: "1.2.0" + version: "1.2.1" flutter_secure_storage_macos: dependency: transitive description: name: flutter_secure_storage_macos - sha256: bd33935b4b628abd0b86c8ca20655c5b36275c3a3f5194769a7b3f37c905369c + sha256: "8cfa53010a294ff095d7be8fa5bb15f2252c50018d69c5104851303f3ff92510" url: "https://pub.dev" source: hosted - version: "3.0.1" + version: "3.1.0" flutter_secure_storage_platform_interface: dependency: transitive description: name: flutter_secure_storage_platform_interface - sha256: "0d4d3a5dd4db28c96ae414d7ba3b8422fd735a8255642774803b2532c9a61d7e" + sha256: "301f67ee9b87f04aef227f57f13f126fa7b13543c8e7a93f25c5d2d534c28a4a" url: "https://pub.dev" source: hosted - version: "1.0.2" + version: "1.1.1" flutter_secure_storage_web: dependency: transitive description: name: flutter_secure_storage_web - sha256: "30f84f102df9dcdaa2241866a958c2ec976902ebdaa8883fbfe525f1f2f3cf20" + sha256: f4ebff989b4f07b2656fb16b47852c0aab9fed9b4ec1c70103368337bc1886a9 url: "https://pub.dev" source: hosted - version: "1.1.2" + version: "1.2.1" flutter_secure_storage_windows: dependency: transitive description: name: flutter_secure_storage_windows - sha256: "5809c66f9dd3b4b93b0a6e2e8561539405322ee767ac2f64d084e2ab5429d108" + sha256: b20b07cb5ed4ed74fc567b78a72936203f587eba460af1df11281c9326cd3709 url: "https://pub.dev" source: hosted - version: "3.0.0" + version: "3.1.2" flutter_test: dependency: "direct dev" description: flutter @@ -387,10 +387,10 @@ packages: dependency: "direct main" description: name: go_router - sha256: "466425a64508ca00983882f523400d9169365cb9b464e2e2419f3b6545ff9c51" + sha256: "81f94e16d7063b60f0da3a79f872e140d6518f306749303bf981abd7d6b46734" url: "https://pub.dev" source: hosted - version: "14.0.1" + version: "14.1.0" gotrue: dependency: transitive description: @@ -456,10 +456,10 @@ packages: dependency: transitive description: name: intl - sha256: d6f56758b7d3014a48af9701c085700aac781a92a87a62b1333b46d8879661cf + sha256: "3bc132a9dbce73a7e4a21a17d06e1878839ffbf975568bc875c60537824b0c4d" url: "https://pub.dev" source: hosted - version: "0.19.0" + version: "0.18.1" io: dependency: transitive description: @@ -496,10 +496,10 @@ packages: dependency: transitive description: name: leak_tracker - sha256: "3f87a60e8c63aecc975dda1ceedbc8f24de75f09e4856ea27daf8958f2f0ce05" + sha256: "78eb209deea09858f5269f5a5b02be4049535f568c07b275096836f01ea323fa" url: "https://pub.dev" source: hosted - version: "10.0.5" + version: "10.0.0" leak_tracker_flutter_testing: dependency: transitive description: @@ -512,26 +512,26 @@ packages: dependency: transitive description: name: leak_tracker_testing - sha256: d4c8f568c60af6b6daa74c80fc04411765769882600f6bf9cd4b391c96de42ce + sha256: a597f72a664dbd293f3bfc51f9ba69816f84dcd403cdac7066cb3f6003f3ab47 url: "https://pub.dev" source: hosted - version: "2.0.3" + version: "2.0.1" lints: dependency: transitive description: name: lints - sha256: cbf8d4b858bb0134ef3ef87841abdf8d63bfc255c266b7bf6b39daa1085c4290 + sha256: "976c774dd944a42e83e2467f4cc670daef7eed6295b10b36ae8c85bcbf828235" url: "https://pub.dev" source: hosted - version: "3.0.0" + version: "4.0.0" logger: dependency: transitive description: name: logger - sha256: "8c94b8c219e7e50194efc8771cd0e9f10807d8d3e219af473d89b06cc2ee4e04" + sha256: af05cc8714f356fd1f3888fb6741cbe9fbe25cdb6eedbab80e1a6db21047d4a4 url: "https://pub.dev" source: hosted - version: "2.2.0" + version: "2.3.0" logging: dependency: transitive description: @@ -568,10 +568,10 @@ packages: dependency: transitive description: name: meta - sha256: "25dfcaf170a0190f47ca6355bdd4552cb8924b430512ff0cafb8db9bd41fe33b" + sha256: d584fa6707a52763a52446f02cc621b077888fb63b93bbcb1143a7be5a0c0c04 url: "https://pub.dev" source: hosted - version: "1.14.0" + version: "1.11.0" mime: dependency: transitive description: @@ -696,10 +696,10 @@ packages: dependency: "direct main" description: name: pointer_interceptor - sha256: bd18321519718678d5fa98ad3a3359cbc7a31f018554eab80b73d08a7f0c165a + sha256: d0a8e660d1204eaec5bd34b34cc92174690e076d2e4f893d9d68c486a13b07c4 url: "https://pub.dev" source: hosted - version: "0.10.1" + version: "0.10.1+1" pointer_interceptor_ios: dependency: transitive description: @@ -784,10 +784,10 @@ packages: dependency: "direct main" description: name: reactive_forms - sha256: "10771b3b8f7df3dc6942928cc55b2abb49c0a5eb56ca8ab1ff4084b2bd968044" + sha256: "9b1fb18e0aae9c50cfa0aaabaaa38bc4d78eefc9b7b95fa9c947b051f6524b8e" url: "https://pub.dev" source: hosted - version: "17.0.0" + version: "17.0.1" reactive_multi_select_flutter: dependency: "direct main" description: @@ -800,10 +800,10 @@ packages: dependency: "direct main" description: name: reactive_range_slider - sha256: b493aaf682a7bb0800b582951e63cbba92563c3361164b566a377e498dc8cfd5 + sha256: becdfbacd56e405a9e64afcf34e100dc2f593bf9d7b1fb2407eb0f542420fd62 url: "https://pub.dev" source: hosted - version: "2.0.1" + version: "2.1.0" realtime_client: dependency: transitive description: @@ -856,10 +856,10 @@ packages: dependency: transitive description: name: sentry - sha256: "961630a4dba41cebd692612421fd3805a991ebd8ef4a8d84a6c179e6b89eaf22" + sha256: "1d2952d40b99da0dc4bf3ba4797e3985dd60cc61a13d0a1d2c62b02f6528441a" url: "https://pub.dev" source: hosted - version: "8.0.0" + version: "8.1.0" shared_preferences: dependency: transitive description: diff --git a/designer_v2/pubspec.yaml b/designer_v2/pubspec.yaml index 294c1a8d1..e31b647df 100644 --- a/designer_v2/pubspec.yaml +++ b/designer_v2/pubspec.yaml @@ -9,7 +9,7 @@ environment: sdk: '>=3.0.0 <4.0.0' dependencies: - archive: ^3.5.0 + archive: ^3.5.1 async: ^2.11.0 csv: ^6.0.0 cupertino_icons: ^1.0.8 @@ -23,14 +23,14 @@ dependencies: flutter_riverpod: ^2.5.1 flutter_web_plugins: sdk: flutter - go_router: ^14.0.1 + go_router: ^14.1.0 material_color_utilities: material_design_icons_flutter: ^7.0.7296 - pointer_interceptor: ^0.10.1 + pointer_interceptor: ^0.10.1+1 reactive_color_picker: ^2.0.1 - reactive_forms: ^17.0.0 + reactive_forms: ^17.0.1 reactive_multi_select_flutter: ^2.0.1 - reactive_range_slider: ^2.0.1 + reactive_range_slider: ^2.1.0 rxdart: ^0.27.7 studyu_core: ^4.4.2-dev.0 studyu_flutter_common: ^1.8.3-dev.0 @@ -42,7 +42,7 @@ dependencies: dev_dependencies: custom_lint: flutter_launcher_icons: ^0.13.1 - flutter_lints: ^3.0.2 + flutter_lints: ^4.0.0 flutter_test: sdk: flutter integration_test: diff --git a/flutter_common/pubspec.lock b/flutter_common/pubspec.lock index 9c7d8768c..d9ab74a12 100644 --- a/flutter_common/pubspec.lock +++ b/flutter_common/pubspec.lock @@ -114,58 +114,58 @@ packages: dependency: "direct dev" description: name: flutter_lints - sha256: "9e8c3858111da373efc5aa341de011d9bd23e2c5c5e0c62bccf32438e192d7b1" + sha256: "3f41d009ba7172d5ff9be5f6e6e6abb4300e263aab8866d2a0842ed2a70f8f0c" url: "https://pub.dev" source: hosted - version: "3.0.2" + version: "4.0.0" flutter_secure_storage: dependency: "direct main" description: name: flutter_secure_storage - sha256: ffdbb60130e4665d2af814a0267c481bcf522c41ae2e43caf69fa0146876d685 + sha256: c0f402067fb0498934faa6bddd670de0a3db45222e2ca9a068c6177c9a2360a4 url: "https://pub.dev" source: hosted - version: "9.0.0" + version: "9.1.1" flutter_secure_storage_linux: dependency: transitive description: name: flutter_secure_storage_linux - sha256: "3d5032e314774ee0e1a7d0a9f5e2793486f0dff2dd9ef5a23f4e3fb2a0ae6a9e" + sha256: "4d91bfc23047422cbcd73ac684bc169859ee766482517c22172c86596bf1464b" url: "https://pub.dev" source: hosted - version: "1.2.0" + version: "1.2.1" flutter_secure_storage_macos: dependency: transitive description: name: flutter_secure_storage_macos - sha256: bd33935b4b628abd0b86c8ca20655c5b36275c3a3f5194769a7b3f37c905369c + sha256: "8cfa53010a294ff095d7be8fa5bb15f2252c50018d69c5104851303f3ff92510" url: "https://pub.dev" source: hosted - version: "3.0.1" + version: "3.1.0" flutter_secure_storage_platform_interface: dependency: transitive description: name: flutter_secure_storage_platform_interface - sha256: "0d4d3a5dd4db28c96ae414d7ba3b8422fd735a8255642774803b2532c9a61d7e" + sha256: "301f67ee9b87f04aef227f57f13f126fa7b13543c8e7a93f25c5d2d534c28a4a" url: "https://pub.dev" source: hosted - version: "1.0.2" + version: "1.1.1" flutter_secure_storage_web: dependency: transitive description: name: flutter_secure_storage_web - sha256: "30f84f102df9dcdaa2241866a958c2ec976902ebdaa8883fbfe525f1f2f3cf20" + sha256: f4ebff989b4f07b2656fb16b47852c0aab9fed9b4ec1c70103368337bc1886a9 url: "https://pub.dev" source: hosted - version: "1.1.2" + version: "1.2.1" flutter_secure_storage_windows: dependency: transitive description: name: flutter_secure_storage_windows - sha256: "5809c66f9dd3b4b93b0a6e2e8561539405322ee767ac2f64d084e2ab5429d108" + sha256: b20b07cb5ed4ed74fc567b78a72936203f587eba460af1df11281c9326cd3709 url: "https://pub.dev" source: hosted - version: "3.0.0" + version: "3.1.2" flutter_test: dependency: "direct dev" description: flutter @@ -244,10 +244,10 @@ packages: dependency: transitive description: name: leak_tracker - sha256: "3f87a60e8c63aecc975dda1ceedbc8f24de75f09e4856ea27daf8958f2f0ce05" + sha256: "78eb209deea09858f5269f5a5b02be4049535f568c07b275096836f01ea323fa" url: "https://pub.dev" source: hosted - version: "10.0.5" + version: "10.0.0" leak_tracker_flutter_testing: dependency: transitive description: @@ -260,26 +260,26 @@ packages: dependency: transitive description: name: leak_tracker_testing - sha256: d4c8f568c60af6b6daa74c80fc04411765769882600f6bf9cd4b391c96de42ce + sha256: a597f72a664dbd293f3bfc51f9ba69816f84dcd403cdac7066cb3f6003f3ab47 url: "https://pub.dev" source: hosted - version: "2.0.3" + version: "2.0.1" lints: dependency: transitive description: name: lints - sha256: cbf8d4b858bb0134ef3ef87841abdf8d63bfc255c266b7bf6b39daa1085c4290 + sha256: "976c774dd944a42e83e2467f4cc670daef7eed6295b10b36ae8c85bcbf828235" url: "https://pub.dev" source: hosted - version: "3.0.0" + version: "4.0.0" logger: dependency: transitive description: name: logger - sha256: "8c94b8c219e7e50194efc8771cd0e9f10807d8d3e219af473d89b06cc2ee4e04" + sha256: af05cc8714f356fd1f3888fb6741cbe9fbe25cdb6eedbab80e1a6db21047d4a4 url: "https://pub.dev" source: hosted - version: "2.2.0" + version: "2.3.0" matcher: dependency: transitive description: @@ -300,10 +300,10 @@ packages: dependency: transitive description: name: meta - sha256: "25dfcaf170a0190f47ca6355bdd4552cb8924b430512ff0cafb8db9bd41fe33b" + sha256: d584fa6707a52763a52446f02cc621b077888fb63b93bbcb1143a7be5a0c0c04 url: "https://pub.dev" source: hosted - version: "1.14.0" + version: "1.11.0" mime: dependency: transitive description: @@ -428,10 +428,10 @@ packages: dependency: transitive description: name: sentry - sha256: "961630a4dba41cebd692612421fd3805a991ebd8ef4a8d84a6c179e6b89eaf22" + sha256: "1d2952d40b99da0dc4bf3ba4797e3985dd60cc61a13d0a1d2c62b02f6528441a" url: "https://pub.dev" source: hosted - version: "8.0.0" + version: "8.1.0" shared_preferences: dependency: "direct main" description: diff --git a/flutter_common/pubspec.yaml b/flutter_common/pubspec.yaml index 068a8c397..296605606 100644 --- a/flutter_common/pubspec.yaml +++ b/flutter_common/pubspec.yaml @@ -11,7 +11,7 @@ dependencies: flutter: sdk: flutter flutter_dotenv: ^5.1.0 - flutter_secure_storage: ^9.0.0 + flutter_secure_storage: ^9.1.1 shared_preferences: ^2.2.3 # Can be removed after migrating phase studyu_core: ^4.4.2-dev.0 supabase_flutter: ^2.5.2 @@ -19,7 +19,7 @@ dependencies: uuid: ^4.4.0 dev_dependencies: - flutter_lints: ^3.0.2 + flutter_lints: ^4.0.0 flutter_test: sdk: flutter diff --git a/pubspec.lock b/pubspec.lock index 7435a66c5..fc4a0080a 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -85,10 +85,10 @@ packages: dependency: "direct dev" description: name: flutter_lints - sha256: "9e8c3858111da373efc5aa341de011d9bd23e2c5c5e0c62bccf32438e192d7b1" + sha256: "3f41d009ba7172d5ff9be5f6e6e6abb4300e263aab8866d2a0842ed2a70f8f0c" url: "https://pub.dev" source: hosted - version: "3.0.2" + version: "4.0.0" glob: dependency: transitive description: @@ -149,10 +149,10 @@ packages: dependency: transitive description: name: lints - sha256: cbf8d4b858bb0134ef3ef87841abdf8d63bfc255c266b7bf6b39daa1085c4290 + sha256: "976c774dd944a42e83e2467f4cc670daef7eed6295b10b36ae8c85bcbf828235" url: "https://pub.dev" source: hosted - version: "3.0.0" + version: "4.0.0" matcher: dependency: transitive description: @@ -173,10 +173,10 @@ packages: dependency: transitive description: name: meta - sha256: "25dfcaf170a0190f47ca6355bdd4552cb8924b430512ff0cafb8db9bd41fe33b" + sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7 url: "https://pub.dev" source: hosted - version: "1.14.0" + version: "1.15.0" mustache_template: dependency: transitive description: @@ -341,9 +341,9 @@ packages: dependency: transitive description: name: yaml_edit - sha256: c566f4f804215d84a7a2c377667f546c6033d5b34b4f9e60dfb09d17c4e97826 + sha256: e9c1a3543d2da0db3e90270dbb1e4eebc985ee5e3ffe468d83224472b2194a5f url: "https://pub.dev" source: hosted - version: "2.2.0" + version: "2.2.1" sdks: dart: ">=3.3.0 <4.0.0" diff --git a/pubspec.yaml b/pubspec.yaml index bfc6f81d4..b8592b1e2 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -7,6 +7,6 @@ environment: sdk: ">=2.18.0 <3.0.0" dev_dependencies: - flutter_lints: ^3.0.2 + flutter_lints: ^4.0.0 lint: ^2.3.0 melos: ^6.0.0 From a4ccf86756c2e3aaf7b451cb1511c5d39283b82b Mon Sep 17 00:00:00 2001 From: Johannes Vedder Date: Mon, 13 May 2024 16:38:57 +0200 Subject: [PATCH 034/314] chore: add deployment --- melos.yaml | 33 +++++++++++++++++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) diff --git a/melos.yaml b/melos.yaml index eceeb013b..f4da45be8 100644 --- a/melos.yaml +++ b/melos.yaml @@ -106,6 +106,8 @@ scripts: packageFilters: dir-exists: ios + # The following scripts are used for deployment + build:web: run: | melos exec -c 2 --fail-fast -- \ @@ -123,10 +125,37 @@ scripts: packageFilters: scope: studyu_app - build:web:designer: + build:web:designer_v2: run: | melos exec -c 1 --fail-fast -- \ "flutter build web" - description: Build designer for Web. + description: Build designer_v2 for Web. packageFilters: scope: studyu_designer_v2 + + build:web:dev: + run: | + melos exec -c 2 --fail-fast -- \ + "flutter build web --web-renderer auto --dart-define=STUDYU_ENV=.env.dev" + description: Build web dev. + packageFilters: + scope: [studyu_app, studyu_designer_v2] + dir-exists: web + + build:web:app:dev: + run: | + melos exec -c 2 --fail-fast -- \ + "flutter build web --web-renderer auto --dart-define=STUDYU_ENV=.env.dev" + description: Build web app dev. + packageFilters: + scope: studyu_app + dir-exists: web + + build:web:designer_v2:dev: + run: | + melos exec -c 2 --fail-fast -- \ + "flutter build web --web-renderer auto --dart-define=STUDYU_ENV=.env.dev" + description: Build web designer_v2 dev. + packageFilters: + scope: studyu_designer_v2 + dir-exists: web From d54cb6d927f37509f95af73f0c8927abeec558e9 Mon Sep 17 00:00:00 2001 From: StudyU Documenter Date: Mon, 13 May 2024 14:39:19 +0000 Subject: [PATCH 035/314] docs: update UML documentation --- .../shared/questionnaire/question/uml.svg | 1102 ++-- .../design/shared/questionnaire/uml.svg | 1222 ++-- .../lib/features/design/shared/uml.svg | 1454 ++--- .../designer_v2/lib/features/design/uml.svg | 5816 ++++++++--------- 4 files changed, 4797 insertions(+), 4797 deletions(-) diff --git a/docs/uml/designer_v2/lib/features/design/shared/questionnaire/question/uml.svg b/docs/uml/designer_v2/lib/features/design/shared/questionnaire/question/uml.svg index 13434ccb4..557598554 100644 --- a/docs/uml/designer_v2/lib/features/design/shared/questionnaire/question/uml.svg +++ b/docs/uml/designer_v2/lib/features/design/shared/questionnaire/question/uml.svg @@ -1,111 +1,5 @@ - - [SurveyQuestionFormView - | - +formViewModel: QuestionFormViewModel; - +isHtmlStyleable: bool - ] - - [SurveyQuestionFormView]o-[QuestionFormViewModel] - - [QuestionFormViewModel - | - <static>+defaultQuestionType: SurveyQuestionType; - -_titles: Map<FormMode, String Function()>?; - +questionIdControl: FormControl<String>; - +questionTypeControl: FormControl<SurveyQuestionType>; - +questionTextControl: FormControl<String>; - +questionInfoTextControl: FormControl<String>; - +questionBaseControls: Map<String, AbstractControl<dynamic>>; - +isMultipleChoiceControl: FormControl<bool>; - +choiceResponseOptionsArray: FormArray<dynamic>; - +customOptionsMin: int; - +customOptionsMax: int; - +customOptionsInitial: int; - +boolResponseOptionsArray: FormArray<String>; - +imageResponseOptionsArray: FormArray<String>; - <static>+kDefaultMaxRecordingDurationSeconds: int; - <static>+kMaxRecordingDurationSeconds: int; - +audioResponseOptionsArray: FormArray<String>; - +maxRecordingDurationSecondsControl: FormControl<int>; - <static>+kDefaultScaleMinValue: int; - <static>+kDefaultScaleMaxValue: int; - <static>+kNumMidValueControls: int; - <static>+kMidValueDebounceMilliseconds: int; - +scaleMinValueControl: FormControl<int>; - +scaleMaxValueControl: FormControl<int>; - -_scaleRangeControl: FormControl<int>; - +scaleMinLabelControl: FormControl<String>; - +scaleMaxLabelControl: FormControl<String>; - +scaleMidValueControls: FormArray<int>; - +scaleMidLabelControls: FormArray<String?>; - -_scaleResponseOptionsArray: FormArray<int>; - +scaleMinColorControl: FormControl<SerializableColor>; - +scaleMaxColorControl: FormControl<SerializableColor>; - +prevMidValues: List<int?>?; - +freeTextTypeControl: FormControl<FreeTextQuestionType>; - +customRegexControl: FormControl<String>; - +freeTextResponseOptionsArray: FormArray<dynamic>; - +freeTextLengthMin: AbstractControl<int>; - +freeTextLengthMax: AbstractControl<int>; - +freeTextExampleTextControl: FormControl<String>; - <static>+kDefaultFreeTextMinLength: int; - <static>+kDefaultFreeTextMaxLength: int; - +freeTextLengthControl: FormControl<RangeValues>; - -_controlsByQuestionType: Map<SurveyQuestionType, FormGroup>; - -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - -_validationConfigsByQuestionType: Map<SurveyQuestionType, Map<FormValidationSetEnum, List<FormControlValidation>>>; - +form: FormGroup; - +questionId: String; - +questionType: SurveyQuestionType; - +questionTypeControlOptions: List<FormControlOption<SurveyQuestionType>>; - +answerOptionsArray: FormArray<dynamic>; - +answerOptionsControls: List<AbstractControl<dynamic>>; - +validAnswerOptions: List<String>; - +boolOptions: List<AbstractControl<String>>; - +imageOptions: List<AbstractControl<String>>; - +audioOptions: List<AbstractControl<String>>; - +scaleMinValue: int; - +scaleMaxValue: int; - +scaleRange: int; - +scaleAllValueControls: List<AbstractControl<int>>; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +questionTextRequired: dynamic; - +numValidChoiceOptions: dynamic; - +scaleRangeValid: dynamic; - +maxRecordingDurationValid: dynamic; - +titles: Map<FormMode, String>; - +isAddOptionButtonVisible: bool; - +isMidValuesClearedInfoVisible: bool - | - +String? scaleMidLabelAt(); - -dynamic _onScaleRangeChanged(); - -dynamic _applyInputFormatters(); - -dynamic _updateScaleMidValueControls(); - -Map<String, dynamic>? _validateFreeText(); - -dynamic _onFreeTextLengthChanged(); - -List<FormControlValidation> _getValidationConfig(); - +dynamic onQuestionTypeChanged(); - +dynamic onResponseOptionsChanged(); - -void _updateFormControls(); - +void initControls(); - +void setControlsFrom(); - +QuestionFormData buildFormData(); - +List<ModelAction<dynamic>> availableActions(); - +void onNewItem(); - +void onSelectItem(); - +dynamic save(); - +QuestionFormViewModel createDuplicate() - ] - - [QuestionFormViewModel]o-[SurveyQuestionType] - [QuestionFormViewModel]o-[FormControl] - [QuestionFormViewModel]o-[FormArray] - [QuestionFormViewModel]o-[<abstract>AbstractControl] - [QuestionFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[QuestionFormViewModel] - [<abstract>IListActionProvider]<:--[QuestionFormViewModel] - - [<abstract>QuestionFormData + + [<abstract>QuestionFormData | <static>+questionTypeFormDataFactories: Map<SurveyQuestionType, QuestionFormData Function(Question<dynamic>, List<EligibilityCriterion>)>; +questionId: String; @@ -215,17 +109,15 @@ [FreeTextQuestionFormData]o-[FreeTextQuestionType] [<abstract>QuestionFormData]<:-[FreeTextQuestionFormData] - [<abstract>IScaleQuestionFormViewModel - | - +isMidValuesClearedInfoVisible: bool - ] - - [ScaleQuestionFormView + [AudioRecordingQuestionFormView | +formViewModel: QuestionFormViewModel + | + +Widget build() ] - [ScaleQuestionFormView]o-[QuestionFormViewModel] + [AudioRecordingQuestionFormView]o-[QuestionFormViewModel] + [<abstract>ConsumerWidget]<:-[AudioRecordingQuestionFormView] [FreeTextQuestionFormView | @@ -240,16 +132,6 @@ [FreeTextQuestionFormView]o-[QuestionFormViewModel] [<abstract>ConsumerWidget]<:-[FreeTextQuestionFormView] - [BoolQuestionFormView - | - +formViewModel: QuestionFormViewModel - | - +Widget build() - ] - - [BoolQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[BoolQuestionFormView] - [SurveyQuestionType | +index: int; @@ -265,15 +147,27 @@ [SurveyQuestionType]o-[SurveyQuestionType] [Enum]<:--[SurveyQuestionType] - [AudioRecordingQuestionFormView + [ImageCapturingQuestionFormView | +formViewModel: QuestionFormViewModel | +Widget build() ] - [AudioRecordingQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[AudioRecordingQuestionFormView] + [ImageCapturingQuestionFormView]o-[QuestionFormViewModel] + [<abstract>ConsumerWidget]<:-[ImageCapturingQuestionFormView] + + [<abstract>IScaleQuestionFormViewModel + | + +isMidValuesClearedInfoVisible: bool + ] + + [ScaleQuestionFormView + | + +formViewModel: QuestionFormViewModel + ] + + [ScaleQuestionFormView]o-[QuestionFormViewModel] [ChoiceQuestionFormView | @@ -285,263 +179,278 @@ [ChoiceQuestionFormView]o-[QuestionFormViewModel] [<abstract>ConsumerWidget]<:-[ChoiceQuestionFormView] - [ImageCapturingQuestionFormView + [BoolQuestionFormView | +formViewModel: QuestionFormViewModel | +Widget build() ] - [ImageCapturingQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[ImageCapturingQuestionFormView] + [BoolQuestionFormView]o-[QuestionFormViewModel] + [<abstract>ConsumerWidget]<:-[BoolQuestionFormView] + + [QuestionFormViewModel + | + <static>+defaultQuestionType: SurveyQuestionType; + -_titles: Map<FormMode, String Function()>?; + +questionIdControl: FormControl<String>; + +questionTypeControl: FormControl<SurveyQuestionType>; + +questionTextControl: FormControl<String>; + +questionInfoTextControl: FormControl<String>; + +questionBaseControls: Map<String, AbstractControl<dynamic>>; + +isMultipleChoiceControl: FormControl<bool>; + +choiceResponseOptionsArray: FormArray<dynamic>; + +customOptionsMin: int; + +customOptionsMax: int; + +customOptionsInitial: int; + +boolResponseOptionsArray: FormArray<String>; + +imageResponseOptionsArray: FormArray<String>; + <static>+kDefaultMaxRecordingDurationSeconds: int; + <static>+kMaxRecordingDurationSeconds: int; + +audioResponseOptionsArray: FormArray<String>; + +maxRecordingDurationSecondsControl: FormControl<int>; + <static>+kDefaultScaleMinValue: int; + <static>+kDefaultScaleMaxValue: int; + <static>+kNumMidValueControls: int; + <static>+kMidValueDebounceMilliseconds: int; + +scaleMinValueControl: FormControl<int>; + +scaleMaxValueControl: FormControl<int>; + -_scaleRangeControl: FormControl<int>; + +scaleMinLabelControl: FormControl<String>; + +scaleMaxLabelControl: FormControl<String>; + +scaleMidValueControls: FormArray<int>; + +scaleMidLabelControls: FormArray<String?>; + -_scaleResponseOptionsArray: FormArray<int>; + +scaleMinColorControl: FormControl<SerializableColor>; + +scaleMaxColorControl: FormControl<SerializableColor>; + +prevMidValues: List<int?>?; + +freeTextTypeControl: FormControl<FreeTextQuestionType>; + +customRegexControl: FormControl<String>; + +freeTextResponseOptionsArray: FormArray<dynamic>; + +freeTextLengthMin: AbstractControl<int>; + +freeTextLengthMax: AbstractControl<int>; + +freeTextExampleTextControl: FormControl<String>; + <static>+kDefaultFreeTextMinLength: int; + <static>+kDefaultFreeTextMaxLength: int; + +freeTextLengthControl: FormControl<RangeValues>; + -_controlsByQuestionType: Map<SurveyQuestionType, FormGroup>; + -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + -_validationConfigsByQuestionType: Map<SurveyQuestionType, Map<FormValidationSetEnum, List<FormControlValidation>>>; + +form: FormGroup; + +questionId: String; + +questionType: SurveyQuestionType; + +questionTypeControlOptions: List<FormControlOption<SurveyQuestionType>>; + +answerOptionsArray: FormArray<dynamic>; + +answerOptionsControls: List<AbstractControl<dynamic>>; + +validAnswerOptions: List<String>; + +boolOptions: List<AbstractControl<String>>; + +imageOptions: List<AbstractControl<String>>; + +audioOptions: List<AbstractControl<String>>; + +scaleMinValue: int; + +scaleMaxValue: int; + +scaleRange: int; + +scaleAllValueControls: List<AbstractControl<int>>; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +questionTextRequired: dynamic; + +numValidChoiceOptions: dynamic; + +scaleRangeValid: dynamic; + +maxRecordingDurationValid: dynamic; + +titles: Map<FormMode, String>; + +isAddOptionButtonVisible: bool; + +isMidValuesClearedInfoVisible: bool + | + +String? scaleMidLabelAt(); + -dynamic _onScaleRangeChanged(); + -dynamic _applyInputFormatters(); + -dynamic _updateScaleMidValueControls(); + -Map<String, dynamic>? _validateFreeText(); + -dynamic _onFreeTextLengthChanged(); + -List<FormControlValidation> _getValidationConfig(); + +dynamic onQuestionTypeChanged(); + +dynamic onResponseOptionsChanged(); + -void _updateFormControls(); + +void initControls(); + +void setControlsFrom(); + +QuestionFormData buildFormData(); + +List<ModelAction<dynamic>> availableActions(); + +void onNewItem(); + +void onSelectItem(); + +dynamic save(); + +QuestionFormViewModel createDuplicate() + ] + + [QuestionFormViewModel]o-[SurveyQuestionType] + [QuestionFormViewModel]o-[FormControl] + [QuestionFormViewModel]o-[FormArray] + [QuestionFormViewModel]o-[<abstract>AbstractControl] + [QuestionFormViewModel]o-[FormGroup] + [<abstract>ManagedFormViewModel]<:-[QuestionFormViewModel] + [<abstract>IListActionProvider]<:--[QuestionFormViewModel] + + [SurveyQuestionFormView + | + +formViewModel: QuestionFormViewModel; + +isHtmlStyleable: bool + ] + + [SurveyQuestionFormView]o-[QuestionFormViewModel] - + - - + + - + - - - + + - + + + + + + + + + + - + - + + + - + - + + + - + - + + + - - - - - - + - - + + + - + - + - - - - - - - - - - + + - + - - - + + + - + - - - + - + - + + + - + - - - + + + - + - - - + - + - - - - - + - + - - - + - + - - - + - + - - - - - - - - - - SurveyQuestionFormView - - - - - - +formViewModel: QuestionFormViewModel - +isHtmlStyleable: bool - - - + + + + - - - - - + + + + + + + + + + - - - QuestionFormViewModel + + + QuestionFormData - - - <static>+defaultQuestionType: SurveyQuestionType - -_titles: Map<FormMode, String Function()>? - +questionIdControl: FormControl<String> - +questionTypeControl: FormControl<SurveyQuestionType> - +questionTextControl: FormControl<String> - +questionInfoTextControl: FormControl<String> - +questionBaseControls: Map<String, AbstractControl<dynamic>> - +isMultipleChoiceControl: FormControl<bool> - +choiceResponseOptionsArray: FormArray<dynamic> - +customOptionsMin: int - +customOptionsMax: int - +customOptionsInitial: int - +boolResponseOptionsArray: FormArray<String> - +imageResponseOptionsArray: FormArray<String> - <static>+kDefaultMaxRecordingDurationSeconds: int - <static>+kMaxRecordingDurationSeconds: int - +audioResponseOptionsArray: FormArray<String> - +maxRecordingDurationSecondsControl: FormControl<int> - <static>+kDefaultScaleMinValue: int - <static>+kDefaultScaleMaxValue: int - <static>+kNumMidValueControls: int - <static>+kMidValueDebounceMilliseconds: int - +scaleMinValueControl: FormControl<int> - +scaleMaxValueControl: FormControl<int> - -_scaleRangeControl: FormControl<int> - +scaleMinLabelControl: FormControl<String> - +scaleMaxLabelControl: FormControl<String> - +scaleMidValueControls: FormArray<int> - +scaleMidLabelControls: FormArray<String?> - -_scaleResponseOptionsArray: FormArray<int> - +scaleMinColorControl: FormControl<SerializableColor> - +scaleMaxColorControl: FormControl<SerializableColor> - +prevMidValues: List<int?>? - +freeTextTypeControl: FormControl<FreeTextQuestionType> - +customRegexControl: FormControl<String> - +freeTextResponseOptionsArray: FormArray<dynamic> - +freeTextLengthMin: AbstractControl<int> - +freeTextLengthMax: AbstractControl<int> - +freeTextExampleTextControl: FormControl<String> - <static>+kDefaultFreeTextMinLength: int - <static>+kDefaultFreeTextMaxLength: int - +freeTextLengthControl: FormControl<RangeValues> - -_controlsByQuestionType: Map<SurveyQuestionType, FormGroup> - -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - -_validationConfigsByQuestionType: Map<SurveyQuestionType, Map<FormValidationSetEnum, List<FormControlValidation>>> - +form: FormGroup - +questionId: String - +questionType: SurveyQuestionType - +questionTypeControlOptions: List<FormControlOption<SurveyQuestionType>> - +answerOptionsArray: FormArray<dynamic> - +answerOptionsControls: List<AbstractControl<dynamic>> - +validAnswerOptions: List<String> - +boolOptions: List<AbstractControl<String>> - +imageOptions: List<AbstractControl<String>> - +audioOptions: List<AbstractControl<String>> - +scaleMinValue: int - +scaleMaxValue: int - +scaleRange: int - +scaleAllValueControls: List<AbstractControl<int>> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +questionTextRequired: dynamic - +numValidChoiceOptions: dynamic - +scaleRangeValid: dynamic - +maxRecordingDurationValid: dynamic - +titles: Map<FormMode, String> - +isAddOptionButtonVisible: bool - +isMidValuesClearedInfoVisible: bool + + + <static>+questionTypeFormDataFactories: Map<SurveyQuestionType, QuestionFormData Function(Question<dynamic>, List<EligibilityCriterion>)> + +questionId: String + +questionText: String + +questionInfoText: String? + +questionType: SurveyQuestionType + +responseOptionsValidity: Map<dynamic, bool> + +responseOptions: List<dynamic> + +id: String - - - +String? scaleMidLabelAt() - -dynamic _onScaleRangeChanged() - -dynamic _applyInputFormatters() - -dynamic _updateScaleMidValueControls() - -Map<String, dynamic>? _validateFreeText() - -dynamic _onFreeTextLengthChanged() - -List<FormControlValidation> _getValidationConfig() - +dynamic onQuestionTypeChanged() - +dynamic onResponseOptionsChanged() - -void _updateFormControls() - +void initControls() - +void setControlsFrom() - +QuestionFormData buildFormData() - +List<ModelAction<dynamic>> availableActions() - +void onNewItem() - +void onSelectItem() - +dynamic save() - +QuestionFormViewModel createDuplicate() + + + +Question<dynamic> toQuestion() + +EligibilityCriterion toEligibilityCriterion() + +Answer<dynamic> constructAnswerFor() + +dynamic setResponseOptionsValidityFrom() + +QuestionFormData copy() - - + + - + SurveyQuestionType - + +index: int <static>+values: List<SurveyQuestionType> @@ -555,113 +464,11 @@ - - - - - - - FormControl - - - - - - - - - - - FormArray - - - - - - - - - - - AbstractControl - - - - - - - - - - - FormGroup - - - - - - - - - - - ManagedFormViewModel - - - - - - - - - - - IListActionProvider - - - - - - - - - - - - - QuestionFormData - - - - - - <static>+questionTypeFormDataFactories: Map<SurveyQuestionType, QuestionFormData Function(Question<dynamic>, List<EligibilityCriterion>)> - +questionId: String - +questionText: String - +questionInfoText: String? - +questionType: SurveyQuestionType - +responseOptionsValidity: Map<dynamic, bool> - +responseOptions: List<dynamic> - +id: String - - - - - - +Question<dynamic> toQuestion() - +EligibilityCriterion toEligibilityCriterion() - +Answer<dynamic> constructAnswerFor() - +dynamic setResponseOptionsValidityFrom() - +QuestionFormData copy() - - - - - + - + IFormData @@ -670,17 +477,17 @@ - - - + + + - + ChoiceQuestionFormData - + +isMultipleChoice: bool +answerOptions: List<String> @@ -688,7 +495,7 @@ - + +Question<dynamic> toQuestion() +QuestionFormData copy() @@ -700,24 +507,24 @@ - - - + + + - + BoolQuestionFormData - + <static>+kResponseOptions: Map<String, bool> +responseOptions: List<String> - + +Question<dynamic> toQuestion() +BoolQuestionFormData copy() @@ -728,24 +535,24 @@ - - - + + + - + ImageQuestionFormData - + <static>+kResponseOptions: Map<String, FutureBlobFile> +responseOptions: List<String> - + +Question<dynamic> toQuestion() +ImageQuestionFormData copy() @@ -756,17 +563,17 @@ - - - + + + - + AudioQuestionFormData - + +maxRecordingDurationSeconds: int <static>+kResponseOptions: Map<String, FutureBlobFile> @@ -774,7 +581,7 @@ - + +Question<dynamic> toQuestion() +AudioQuestionFormData copy() @@ -785,17 +592,17 @@ - - - + + + - + ScaleQuestionFormData - + +minValue: double +maxValue: double @@ -812,7 +619,7 @@ - + +ScaleQuestion toQuestion() +QuestionFormData copy() @@ -823,9 +630,9 @@ - + - + Color @@ -834,17 +641,17 @@ - - - + + + - + FreeTextQuestionFormData - + +textLengthRange: List<int> +textType: FreeTextQuestionType @@ -853,7 +660,7 @@ - + +Question<dynamic> toQuestion() +FreeTextQuestionFormData copy() @@ -864,71 +671,179 @@ - + - + FreeTextQuestionType - - - - + + + + + - - - IScaleQuestionFormViewModel + + + AudioRecordingQuestionFormView - - - +isMidValuesClearedInfoVisible: bool + + + +formViewModel: QuestionFormViewModel + + + + + + +Widget build() - - - - + + + + + - - - ScaleQuestionFormView + + + QuestionFormViewModel - - - +formViewModel: QuestionFormViewModel + + + <static>+defaultQuestionType: SurveyQuestionType + -_titles: Map<FormMode, String Function()>? + +questionIdControl: FormControl<String> + +questionTypeControl: FormControl<SurveyQuestionType> + +questionTextControl: FormControl<String> + +questionInfoTextControl: FormControl<String> + +questionBaseControls: Map<String, AbstractControl<dynamic>> + +isMultipleChoiceControl: FormControl<bool> + +choiceResponseOptionsArray: FormArray<dynamic> + +customOptionsMin: int + +customOptionsMax: int + +customOptionsInitial: int + +boolResponseOptionsArray: FormArray<String> + +imageResponseOptionsArray: FormArray<String> + <static>+kDefaultMaxRecordingDurationSeconds: int + <static>+kMaxRecordingDurationSeconds: int + +audioResponseOptionsArray: FormArray<String> + +maxRecordingDurationSecondsControl: FormControl<int> + <static>+kDefaultScaleMinValue: int + <static>+kDefaultScaleMaxValue: int + <static>+kNumMidValueControls: int + <static>+kMidValueDebounceMilliseconds: int + +scaleMinValueControl: FormControl<int> + +scaleMaxValueControl: FormControl<int> + -_scaleRangeControl: FormControl<int> + +scaleMinLabelControl: FormControl<String> + +scaleMaxLabelControl: FormControl<String> + +scaleMidValueControls: FormArray<int> + +scaleMidLabelControls: FormArray<String?> + -_scaleResponseOptionsArray: FormArray<int> + +scaleMinColorControl: FormControl<SerializableColor> + +scaleMaxColorControl: FormControl<SerializableColor> + +prevMidValues: List<int?>? + +freeTextTypeControl: FormControl<FreeTextQuestionType> + +customRegexControl: FormControl<String> + +freeTextResponseOptionsArray: FormArray<dynamic> + +freeTextLengthMin: AbstractControl<int> + +freeTextLengthMax: AbstractControl<int> + +freeTextExampleTextControl: FormControl<String> + <static>+kDefaultFreeTextMinLength: int + <static>+kDefaultFreeTextMaxLength: int + +freeTextLengthControl: FormControl<RangeValues> + -_controlsByQuestionType: Map<SurveyQuestionType, FormGroup> + -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + -_validationConfigsByQuestionType: Map<SurveyQuestionType, Map<FormValidationSetEnum, List<FormControlValidation>>> + +form: FormGroup + +questionId: String + +questionType: SurveyQuestionType + +questionTypeControlOptions: List<FormControlOption<SurveyQuestionType>> + +answerOptionsArray: FormArray<dynamic> + +answerOptionsControls: List<AbstractControl<dynamic>> + +validAnswerOptions: List<String> + +boolOptions: List<AbstractControl<String>> + +imageOptions: List<AbstractControl<String>> + +audioOptions: List<AbstractControl<String>> + +scaleMinValue: int + +scaleMaxValue: int + +scaleRange: int + +scaleAllValueControls: List<AbstractControl<int>> + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +questionTextRequired: dynamic + +numValidChoiceOptions: dynamic + +scaleRangeValid: dynamic + +maxRecordingDurationValid: dynamic + +titles: Map<FormMode, String> + +isAddOptionButtonVisible: bool + +isMidValuesClearedInfoVisible: bool + + + + + + +String? scaleMidLabelAt() + -dynamic _onScaleRangeChanged() + -dynamic _applyInputFormatters() + -dynamic _updateScaleMidValueControls() + -Map<String, dynamic>? _validateFreeText() + -dynamic _onFreeTextLengthChanged() + -List<FormControlValidation> _getValidationConfig() + +dynamic onQuestionTypeChanged() + +dynamic onResponseOptionsChanged() + -void _updateFormControls() + +void initControls() + +void setControlsFrom() + +QuestionFormData buildFormData() + +List<ModelAction<dynamic>> availableActions() + +void onNewItem() + +void onSelectItem() + +dynamic save() + +QuestionFormViewModel createDuplicate() + + + + + + + + + + + ConsumerWidget - - - + + + - + FreeTextQuestionFormView - + +formViewModel: QuestionFormViewModel +generateLabelHelpTextMap: dynamic - + +Widget build() +Widget disableOnReadonly() @@ -937,124 +852,209 @@ - - - + + + - - - ConsumerWidget + + + Enum - - - - - + + + + + - - - BoolQuestionFormView + + + ImageCapturingQuestionFormView - - - +formViewModel: QuestionFormViewModel + + + +formViewModel: QuestionFormViewModel - - - +Widget build() + + + +Widget build() - - - + + + + - - - Enum + + + IScaleQuestionFormViewModel - - - - - - - - - - AudioRecordingQuestionFormView + + + +isMidValuesClearedInfoVisible: bool - - - +formViewModel: QuestionFormViewModel + + + + + + + + + ScaleQuestionFormView - - - +Widget build() + + + +formViewModel: QuestionFormViewModel - - - + + + - + ChoiceQuestionFormView - + +formViewModel: QuestionFormViewModel - + +Widget build() - - - - - + + + + + - - - ImageCapturingQuestionFormView + + + BoolQuestionFormView - - - +formViewModel: QuestionFormViewModel + + + +formViewModel: QuestionFormViewModel - - - +Widget build() + + + +Widget build() + + + + + + + + + + + FormControl + + + + + + + + + + + FormArray + + + + + + + + + + + AbstractControl + + + + + + + + + + + FormGroup + + + + + + + + + + + ManagedFormViewModel + + + + + + + + + + + IListActionProvider + + + + + + + + + + + + SurveyQuestionFormView + + + + + + +formViewModel: QuestionFormViewModel + +isHtmlStyleable: bool diff --git a/docs/uml/designer_v2/lib/features/design/shared/questionnaire/uml.svg b/docs/uml/designer_v2/lib/features/design/shared/questionnaire/uml.svg index fc77234fa..c2db0b180 100644 --- a/docs/uml/designer_v2/lib/features/design/shared/questionnaire/uml.svg +++ b/docs/uml/designer_v2/lib/features/design/shared/questionnaire/uml.svg @@ -1,109 +1,38 @@ - - [SurveyQuestionFormView + + [<abstract>WithQuestionnaireControls | - +formViewModel: QuestionFormViewModel; - +isHtmlStyleable: bool + +questionsArray: FormArray<dynamic>; + +questionFormViewModels: FormViewModelCollection<Q, QuestionFormData>; + +questionnaireControls: Map<String, FormArray<dynamic>>; + +propagateOnSave: bool; + +questionModels: List<Q>; + +questionTitles: Map<FormMode, String Function()> + | + +void setQuestionnaireControlsFrom(); + +QuestionnaireFormData buildQuestionnaireFormData(); + +void read(); + +void onCancel(); + +dynamic onSave(); + +Q provide(); + +Q provideQuestionFormViewModel() ] - [SurveyQuestionFormView]o-[QuestionFormViewModel] + [<abstract>WithQuestionnaireControls]o-[FormArray] + [<abstract>WithQuestionnaireControls]o-[FormViewModelCollection] + [<abstract>IFormViewModelDelegate]<:--[<abstract>WithQuestionnaireControls] + [<abstract>IProviderArgsResolver]<:--[<abstract>WithQuestionnaireControls] - [QuestionFormViewModel + [QuestionnaireFormData | - <static>+defaultQuestionType: SurveyQuestionType; - -_titles: Map<FormMode, String Function()>?; - +questionIdControl: FormControl<String>; - +questionTypeControl: FormControl<SurveyQuestionType>; - +questionTextControl: FormControl<String>; - +questionInfoTextControl: FormControl<String>; - +questionBaseControls: Map<String, AbstractControl<dynamic>>; - +isMultipleChoiceControl: FormControl<bool>; - +choiceResponseOptionsArray: FormArray<dynamic>; - +customOptionsMin: int; - +customOptionsMax: int; - +customOptionsInitial: int; - +boolResponseOptionsArray: FormArray<String>; - +imageResponseOptionsArray: FormArray<String>; - <static>+kDefaultMaxRecordingDurationSeconds: int; - <static>+kMaxRecordingDurationSeconds: int; - +audioResponseOptionsArray: FormArray<String>; - +maxRecordingDurationSecondsControl: FormControl<int>; - <static>+kDefaultScaleMinValue: int; - <static>+kDefaultScaleMaxValue: int; - <static>+kNumMidValueControls: int; - <static>+kMidValueDebounceMilliseconds: int; - +scaleMinValueControl: FormControl<int>; - +scaleMaxValueControl: FormControl<int>; - -_scaleRangeControl: FormControl<int>; - +scaleMinLabelControl: FormControl<String>; - +scaleMaxLabelControl: FormControl<String>; - +scaleMidValueControls: FormArray<int>; - +scaleMidLabelControls: FormArray<String?>; - -_scaleResponseOptionsArray: FormArray<int>; - +scaleMinColorControl: FormControl<SerializableColor>; - +scaleMaxColorControl: FormControl<SerializableColor>; - +prevMidValues: List<int?>?; - +freeTextTypeControl: FormControl<FreeTextQuestionType>; - +customRegexControl: FormControl<String>; - +freeTextResponseOptionsArray: FormArray<dynamic>; - +freeTextLengthMin: AbstractControl<int>; - +freeTextLengthMax: AbstractControl<int>; - +freeTextExampleTextControl: FormControl<String>; - <static>+kDefaultFreeTextMinLength: int; - <static>+kDefaultFreeTextMaxLength: int; - +freeTextLengthControl: FormControl<RangeValues>; - -_controlsByQuestionType: Map<SurveyQuestionType, FormGroup>; - -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - -_validationConfigsByQuestionType: Map<SurveyQuestionType, Map<FormValidationSetEnum, List<FormControlValidation>>>; - +form: FormGroup; - +questionId: String; - +questionType: SurveyQuestionType; - +questionTypeControlOptions: List<FormControlOption<SurveyQuestionType>>; - +answerOptionsArray: FormArray<dynamic>; - +answerOptionsControls: List<AbstractControl<dynamic>>; - +validAnswerOptions: List<String>; - +boolOptions: List<AbstractControl<String>>; - +imageOptions: List<AbstractControl<String>>; - +audioOptions: List<AbstractControl<String>>; - +scaleMinValue: int; - +scaleMaxValue: int; - +scaleRange: int; - +scaleAllValueControls: List<AbstractControl<int>>; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +questionTextRequired: dynamic; - +numValidChoiceOptions: dynamic; - +scaleRangeValid: dynamic; - +maxRecordingDurationValid: dynamic; - +titles: Map<FormMode, String>; - +isAddOptionButtonVisible: bool; - +isMidValuesClearedInfoVisible: bool + +questionsData: List<QuestionFormData>?; + +id: String | - +String? scaleMidLabelAt(); - -dynamic _onScaleRangeChanged(); - -dynamic _applyInputFormatters(); - -dynamic _updateScaleMidValueControls(); - -Map<String, dynamic>? _validateFreeText(); - -dynamic _onFreeTextLengthChanged(); - -List<FormControlValidation> _getValidationConfig(); - +dynamic onQuestionTypeChanged(); - +dynamic onResponseOptionsChanged(); - -void _updateFormControls(); - +void initControls(); - +void setControlsFrom(); - +QuestionFormData buildFormData(); - +List<ModelAction<dynamic>> availableActions(); - +void onNewItem(); - +void onSelectItem(); - +dynamic save(); - +QuestionFormViewModel createDuplicate() + +StudyUQuestionnaire toQuestionnaire(); + +List<EligibilityCriterion> toEligibilityCriteria(); + +QuestionnaireFormData copy() ] - [QuestionFormViewModel]o-[SurveyQuestionType] - [QuestionFormViewModel]o-[FormControl] - [QuestionFormViewModel]o-[FormArray] - [QuestionFormViewModel]o-[<abstract>AbstractControl] - [QuestionFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[QuestionFormViewModel] - [<abstract>IListActionProvider]<:--[QuestionFormViewModel] + [<abstract>IFormData]<:--[QuestionnaireFormData] [<abstract>QuestionFormData | @@ -215,17 +144,15 @@ [FreeTextQuestionFormData]o-[FreeTextQuestionType] [<abstract>QuestionFormData]<:-[FreeTextQuestionFormData] - [<abstract>IScaleQuestionFormViewModel - | - +isMidValuesClearedInfoVisible: bool - ] - - [ScaleQuestionFormView + [AudioRecordingQuestionFormView | +formViewModel: QuestionFormViewModel + | + +Widget build() ] - [ScaleQuestionFormView]o-[QuestionFormViewModel] + [AudioRecordingQuestionFormView]o-[QuestionFormViewModel] + [<abstract>ConsumerWidget]<:-[AudioRecordingQuestionFormView] [FreeTextQuestionFormView | @@ -240,16 +167,6 @@ [FreeTextQuestionFormView]o-[QuestionFormViewModel] [<abstract>ConsumerWidget]<:-[FreeTextQuestionFormView] - [BoolQuestionFormView - | - +formViewModel: QuestionFormViewModel - | - +Widget build() - ] - - [BoolQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[BoolQuestionFormView] - [SurveyQuestionType | +index: int; @@ -265,15 +182,27 @@ [SurveyQuestionType]o-[SurveyQuestionType] [Enum]<:--[SurveyQuestionType] - [AudioRecordingQuestionFormView + [ImageCapturingQuestionFormView | +formViewModel: QuestionFormViewModel | +Widget build() ] - [AudioRecordingQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[AudioRecordingQuestionFormView] + [ImageCapturingQuestionFormView]o-[QuestionFormViewModel] + [<abstract>ConsumerWidget]<:-[ImageCapturingQuestionFormView] + + [<abstract>IScaleQuestionFormViewModel + | + +isMidValuesClearedInfoVisible: bool + ] + + [ScaleQuestionFormView + | + +formViewModel: QuestionFormViewModel + ] + + [ScaleQuestionFormView]o-[QuestionFormViewModel] [ChoiceQuestionFormView | @@ -285,410 +214,382 @@ [ChoiceQuestionFormView]o-[QuestionFormViewModel] [<abstract>ConsumerWidget]<:-[ChoiceQuestionFormView] - [ImageCapturingQuestionFormView + [BoolQuestionFormView | +formViewModel: QuestionFormViewModel | +Widget build() ] - [ImageCapturingQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[ImageCapturingQuestionFormView] + [BoolQuestionFormView]o-[QuestionFormViewModel] + [<abstract>ConsumerWidget]<:-[BoolQuestionFormView] - [<abstract>WithQuestionnaireControls + [QuestionFormViewModel | - +questionsArray: FormArray<dynamic>; - +questionFormViewModels: FormViewModelCollection<Q, QuestionFormData>; - +questionnaireControls: Map<String, FormArray<dynamic>>; - +propagateOnSave: bool; - +questionModels: List<Q>; - +questionTitles: Map<FormMode, String Function()> + <static>+defaultQuestionType: SurveyQuestionType; + -_titles: Map<FormMode, String Function()>?; + +questionIdControl: FormControl<String>; + +questionTypeControl: FormControl<SurveyQuestionType>; + +questionTextControl: FormControl<String>; + +questionInfoTextControl: FormControl<String>; + +questionBaseControls: Map<String, AbstractControl<dynamic>>; + +isMultipleChoiceControl: FormControl<bool>; + +choiceResponseOptionsArray: FormArray<dynamic>; + +customOptionsMin: int; + +customOptionsMax: int; + +customOptionsInitial: int; + +boolResponseOptionsArray: FormArray<String>; + +imageResponseOptionsArray: FormArray<String>; + <static>+kDefaultMaxRecordingDurationSeconds: int; + <static>+kMaxRecordingDurationSeconds: int; + +audioResponseOptionsArray: FormArray<String>; + +maxRecordingDurationSecondsControl: FormControl<int>; + <static>+kDefaultScaleMinValue: int; + <static>+kDefaultScaleMaxValue: int; + <static>+kNumMidValueControls: int; + <static>+kMidValueDebounceMilliseconds: int; + +scaleMinValueControl: FormControl<int>; + +scaleMaxValueControl: FormControl<int>; + -_scaleRangeControl: FormControl<int>; + +scaleMinLabelControl: FormControl<String>; + +scaleMaxLabelControl: FormControl<String>; + +scaleMidValueControls: FormArray<int>; + +scaleMidLabelControls: FormArray<String?>; + -_scaleResponseOptionsArray: FormArray<int>; + +scaleMinColorControl: FormControl<SerializableColor>; + +scaleMaxColorControl: FormControl<SerializableColor>; + +prevMidValues: List<int?>?; + +freeTextTypeControl: FormControl<FreeTextQuestionType>; + +customRegexControl: FormControl<String>; + +freeTextResponseOptionsArray: FormArray<dynamic>; + +freeTextLengthMin: AbstractControl<int>; + +freeTextLengthMax: AbstractControl<int>; + +freeTextExampleTextControl: FormControl<String>; + <static>+kDefaultFreeTextMinLength: int; + <static>+kDefaultFreeTextMaxLength: int; + +freeTextLengthControl: FormControl<RangeValues>; + -_controlsByQuestionType: Map<SurveyQuestionType, FormGroup>; + -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + -_validationConfigsByQuestionType: Map<SurveyQuestionType, Map<FormValidationSetEnum, List<FormControlValidation>>>; + +form: FormGroup; + +questionId: String; + +questionType: SurveyQuestionType; + +questionTypeControlOptions: List<FormControlOption<SurveyQuestionType>>; + +answerOptionsArray: FormArray<dynamic>; + +answerOptionsControls: List<AbstractControl<dynamic>>; + +validAnswerOptions: List<String>; + +boolOptions: List<AbstractControl<String>>; + +imageOptions: List<AbstractControl<String>>; + +audioOptions: List<AbstractControl<String>>; + +scaleMinValue: int; + +scaleMaxValue: int; + +scaleRange: int; + +scaleAllValueControls: List<AbstractControl<int>>; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +questionTextRequired: dynamic; + +numValidChoiceOptions: dynamic; + +scaleRangeValid: dynamic; + +maxRecordingDurationValid: dynamic; + +titles: Map<FormMode, String>; + +isAddOptionButtonVisible: bool; + +isMidValuesClearedInfoVisible: bool | - +void setQuestionnaireControlsFrom(); - +QuestionnaireFormData buildQuestionnaireFormData(); - +void read(); - +void onCancel(); - +dynamic onSave(); - +Q provide(); - +Q provideQuestionFormViewModel() - ] - - [<abstract>WithQuestionnaireControls]o-[FormArray] - [<abstract>WithQuestionnaireControls]o-[FormViewModelCollection] - [<abstract>IFormViewModelDelegate]<:--[<abstract>WithQuestionnaireControls] - [<abstract>IProviderArgsResolver]<:--[<abstract>WithQuestionnaireControls] - - [QuestionnaireFormData - | - +questionsData: List<QuestionFormData>?; - +id: String + +String? scaleMidLabelAt(); + -dynamic _onScaleRangeChanged(); + -dynamic _applyInputFormatters(); + -dynamic _updateScaleMidValueControls(); + -Map<String, dynamic>? _validateFreeText(); + -dynamic _onFreeTextLengthChanged(); + -List<FormControlValidation> _getValidationConfig(); + +dynamic onQuestionTypeChanged(); + +dynamic onResponseOptionsChanged(); + -void _updateFormControls(); + +void initControls(); + +void setControlsFrom(); + +QuestionFormData buildFormData(); + +List<ModelAction<dynamic>> availableActions(); + +void onNewItem(); + +void onSelectItem(); + +dynamic save(); + +QuestionFormViewModel createDuplicate() + ] + + [QuestionFormViewModel]o-[SurveyQuestionType] + [QuestionFormViewModel]o-[FormControl] + [QuestionFormViewModel]o-[FormArray] + [QuestionFormViewModel]o-[<abstract>AbstractControl] + [QuestionFormViewModel]o-[FormGroup] + [<abstract>ManagedFormViewModel]<:-[QuestionFormViewModel] + [<abstract>IListActionProvider]<:--[QuestionFormViewModel] + + [SurveyQuestionFormView | - +StudyUQuestionnaire toQuestionnaire(); - +List<EligibilityCriterion> toEligibilityCriteria(); - +QuestionnaireFormData copy() + +formViewModel: QuestionFormViewModel; + +isHtmlStyleable: bool ] - [<abstract>IFormData]<:--[QuestionnaireFormData] + [SurveyQuestionFormView]o-[QuestionFormViewModel] - + - - + + - + - + - + - - - + + - - - + + + - - - + + + - + + - + - - - + - - + + + + + + + + + + - - - - + - - - - - - - - - - + + + - + - - - + + + - + - - - + + + - + - + + + - + + + + - - - + + - + - - - + + + - + - - + + + - - + + + - + - - - + + + - + - - - + - + - - - + - + - + - + - - + + + - + + - + - - - + + + + - - - - - + + + + + - - - SurveyQuestionFormView + + + WithQuestionnaireControls - - - +formViewModel: QuestionFormViewModel - +isHtmlStyleable: bool + + + +questionsArray: FormArray<dynamic> + +questionFormViewModels: FormViewModelCollection<Q, QuestionFormData> + +questionnaireControls: Map<String, FormArray<dynamic>> + +propagateOnSave: bool + +questionModels: List<Q> + +questionTitles: Map<FormMode, String Function()> - - - - - - - - - - QuestionFormViewModel + + + +void setQuestionnaireControlsFrom() + +QuestionnaireFormData buildQuestionnaireFormData() + +void read() + +void onCancel() + +dynamic onSave() + +Q provide() + +Q provideQuestionFormViewModel() - - - <static>+defaultQuestionType: SurveyQuestionType - -_titles: Map<FormMode, String Function()>? - +questionIdControl: FormControl<String> - +questionTypeControl: FormControl<SurveyQuestionType> - +questionTextControl: FormControl<String> - +questionInfoTextControl: FormControl<String> - +questionBaseControls: Map<String, AbstractControl<dynamic>> - +isMultipleChoiceControl: FormControl<bool> - +choiceResponseOptionsArray: FormArray<dynamic> - +customOptionsMin: int - +customOptionsMax: int - +customOptionsInitial: int - +boolResponseOptionsArray: FormArray<String> - +imageResponseOptionsArray: FormArray<String> - <static>+kDefaultMaxRecordingDurationSeconds: int - <static>+kMaxRecordingDurationSeconds: int - +audioResponseOptionsArray: FormArray<String> - +maxRecordingDurationSecondsControl: FormControl<int> - <static>+kDefaultScaleMinValue: int - <static>+kDefaultScaleMaxValue: int - <static>+kNumMidValueControls: int - <static>+kMidValueDebounceMilliseconds: int - +scaleMinValueControl: FormControl<int> - +scaleMaxValueControl: FormControl<int> - -_scaleRangeControl: FormControl<int> - +scaleMinLabelControl: FormControl<String> - +scaleMaxLabelControl: FormControl<String> - +scaleMidValueControls: FormArray<int> - +scaleMidLabelControls: FormArray<String?> - -_scaleResponseOptionsArray: FormArray<int> - +scaleMinColorControl: FormControl<SerializableColor> - +scaleMaxColorControl: FormControl<SerializableColor> - +prevMidValues: List<int?>? - +freeTextTypeControl: FormControl<FreeTextQuestionType> - +customRegexControl: FormControl<String> - +freeTextResponseOptionsArray: FormArray<dynamic> - +freeTextLengthMin: AbstractControl<int> - +freeTextLengthMax: AbstractControl<int> - +freeTextExampleTextControl: FormControl<String> - <static>+kDefaultFreeTextMinLength: int - <static>+kDefaultFreeTextMaxLength: int - +freeTextLengthControl: FormControl<RangeValues> - -_controlsByQuestionType: Map<SurveyQuestionType, FormGroup> - -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - -_validationConfigsByQuestionType: Map<SurveyQuestionType, Map<FormValidationSetEnum, List<FormControlValidation>>> - +form: FormGroup - +questionId: String - +questionType: SurveyQuestionType - +questionTypeControlOptions: List<FormControlOption<SurveyQuestionType>> - +answerOptionsArray: FormArray<dynamic> - +answerOptionsControls: List<AbstractControl<dynamic>> - +validAnswerOptions: List<String> - +boolOptions: List<AbstractControl<String>> - +imageOptions: List<AbstractControl<String>> - +audioOptions: List<AbstractControl<String>> - +scaleMinValue: int - +scaleMaxValue: int - +scaleRange: int - +scaleAllValueControls: List<AbstractControl<int>> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +questionTextRequired: dynamic - +numValidChoiceOptions: dynamic - +scaleRangeValid: dynamic - +maxRecordingDurationValid: dynamic - +titles: Map<FormMode, String> - +isAddOptionButtonVisible: bool - +isMidValuesClearedInfoVisible: bool - - + + + + - - - +String? scaleMidLabelAt() - -dynamic _onScaleRangeChanged() - -dynamic _applyInputFormatters() - -dynamic _updateScaleMidValueControls() - -Map<String, dynamic>? _validateFreeText() - -dynamic _onFreeTextLengthChanged() - -List<FormControlValidation> _getValidationConfig() - +dynamic onQuestionTypeChanged() - +dynamic onResponseOptionsChanged() - -void _updateFormControls() - +void initControls() - +void setControlsFrom() - +QuestionFormData buildFormData() - +List<ModelAction<dynamic>> availableActions() - +void onNewItem() - +void onSelectItem() - +dynamic save() - +QuestionFormViewModel createDuplicate() + + + FormArray - - - - - - - - SurveyQuestionType - - + + + - - - +index: int - <static>+values: List<SurveyQuestionType> - <static>+choice: SurveyQuestionType - <static>+bool: SurveyQuestionType - <static>+scale: SurveyQuestionType - <static>+image: SurveyQuestionType - <static>+audio: SurveyQuestionType - <static>+freeText: SurveyQuestionType + + + FormViewModelCollection - - - + + + - - - FormControl + + + IFormViewModelDelegate - - - + + + - - - FormArray + + + IProviderArgsResolver - - - + + + + + - - - AbstractControl + + + QuestionnaireFormData - - - - - - - - FormGroup + + + +questionsData: List<QuestionFormData>? + +id: String - - - - - - - - ManagedFormViewModel + + + +StudyUQuestionnaire toQuestionnaire() + +List<EligibilityCriterion> toEligibilityCriteria() + +QuestionnaireFormData copy() - - - + + + - - - IListActionProvider + + + IFormData - - - + + + - + QuestionFormData - + <static>+questionTypeFormDataFactories: Map<SurveyQuestionType, QuestionFormData Function(Question<dynamic>, List<EligibilityCriterion>)> +questionId: String @@ -701,7 +602,7 @@ - + +Question<dynamic> toQuestion() +EligibilityCriterion toEligibilityCriterion() @@ -712,30 +613,44 @@ - - - + + + + - - - IFormData + + + SurveyQuestionType + + + + + + +index: int + <static>+values: List<SurveyQuestionType> + <static>+choice: SurveyQuestionType + <static>+bool: SurveyQuestionType + <static>+scale: SurveyQuestionType + <static>+image: SurveyQuestionType + <static>+audio: SurveyQuestionType + <static>+freeText: SurveyQuestionType - - - + + + - + ChoiceQuestionFormData - + +isMultipleChoice: bool +answerOptions: List<String> @@ -743,7 +658,7 @@ - + +Question<dynamic> toQuestion() +QuestionFormData copy() @@ -755,24 +670,24 @@ - - - + + + - + BoolQuestionFormData - + <static>+kResponseOptions: Map<String, bool> +responseOptions: List<String> - + +Question<dynamic> toQuestion() +BoolQuestionFormData copy() @@ -783,24 +698,24 @@ - - - + + + - + ImageQuestionFormData - + <static>+kResponseOptions: Map<String, FutureBlobFile> +responseOptions: List<String> - + +Question<dynamic> toQuestion() +ImageQuestionFormData copy() @@ -811,17 +726,17 @@ - - - + + + - + AudioQuestionFormData - + +maxRecordingDurationSeconds: int <static>+kResponseOptions: Map<String, FutureBlobFile> @@ -829,7 +744,7 @@ - + +Question<dynamic> toQuestion() +AudioQuestionFormData copy() @@ -840,17 +755,17 @@ - - - + + + - + ScaleQuestionFormData - + +minValue: double +maxValue: double @@ -867,7 +782,7 @@ - + +ScaleQuestion toQuestion() +QuestionFormData copy() @@ -878,9 +793,9 @@ - + - + Color @@ -889,17 +804,17 @@ - - - + + + - + FreeTextQuestionFormData - + +textLengthRange: List<int> +textType: FreeTextQuestionType @@ -908,7 +823,7 @@ - + +Question<dynamic> toQuestion() +FreeTextQuestionFormData copy() @@ -919,71 +834,179 @@ - + - + FreeTextQuestionType - - - - + + + + + + + + + AudioRecordingQuestionFormView + + + + + + +formViewModel: QuestionFormViewModel + + + + + + +Widget build() + + + + + + + + + - - - IScaleQuestionFormViewModel + + + QuestionFormViewModel - - - +isMidValuesClearedInfoVisible: bool + + + <static>+defaultQuestionType: SurveyQuestionType + -_titles: Map<FormMode, String Function()>? + +questionIdControl: FormControl<String> + +questionTypeControl: FormControl<SurveyQuestionType> + +questionTextControl: FormControl<String> + +questionInfoTextControl: FormControl<String> + +questionBaseControls: Map<String, AbstractControl<dynamic>> + +isMultipleChoiceControl: FormControl<bool> + +choiceResponseOptionsArray: FormArray<dynamic> + +customOptionsMin: int + +customOptionsMax: int + +customOptionsInitial: int + +boolResponseOptionsArray: FormArray<String> + +imageResponseOptionsArray: FormArray<String> + <static>+kDefaultMaxRecordingDurationSeconds: int + <static>+kMaxRecordingDurationSeconds: int + +audioResponseOptionsArray: FormArray<String> + +maxRecordingDurationSecondsControl: FormControl<int> + <static>+kDefaultScaleMinValue: int + <static>+kDefaultScaleMaxValue: int + <static>+kNumMidValueControls: int + <static>+kMidValueDebounceMilliseconds: int + +scaleMinValueControl: FormControl<int> + +scaleMaxValueControl: FormControl<int> + -_scaleRangeControl: FormControl<int> + +scaleMinLabelControl: FormControl<String> + +scaleMaxLabelControl: FormControl<String> + +scaleMidValueControls: FormArray<int> + +scaleMidLabelControls: FormArray<String?> + -_scaleResponseOptionsArray: FormArray<int> + +scaleMinColorControl: FormControl<SerializableColor> + +scaleMaxColorControl: FormControl<SerializableColor> + +prevMidValues: List<int?>? + +freeTextTypeControl: FormControl<FreeTextQuestionType> + +customRegexControl: FormControl<String> + +freeTextResponseOptionsArray: FormArray<dynamic> + +freeTextLengthMin: AbstractControl<int> + +freeTextLengthMax: AbstractControl<int> + +freeTextExampleTextControl: FormControl<String> + <static>+kDefaultFreeTextMinLength: int + <static>+kDefaultFreeTextMaxLength: int + +freeTextLengthControl: FormControl<RangeValues> + -_controlsByQuestionType: Map<SurveyQuestionType, FormGroup> + -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + -_validationConfigsByQuestionType: Map<SurveyQuestionType, Map<FormValidationSetEnum, List<FormControlValidation>>> + +form: FormGroup + +questionId: String + +questionType: SurveyQuestionType + +questionTypeControlOptions: List<FormControlOption<SurveyQuestionType>> + +answerOptionsArray: FormArray<dynamic> + +answerOptionsControls: List<AbstractControl<dynamic>> + +validAnswerOptions: List<String> + +boolOptions: List<AbstractControl<String>> + +imageOptions: List<AbstractControl<String>> + +audioOptions: List<AbstractControl<String>> + +scaleMinValue: int + +scaleMaxValue: int + +scaleRange: int + +scaleAllValueControls: List<AbstractControl<int>> + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +questionTextRequired: dynamic + +numValidChoiceOptions: dynamic + +scaleRangeValid: dynamic + +maxRecordingDurationValid: dynamic + +titles: Map<FormMode, String> + +isAddOptionButtonVisible: bool + +isMidValuesClearedInfoVisible: bool - - - - - - - - - ScaleQuestionFormView + + + +String? scaleMidLabelAt() + -dynamic _onScaleRangeChanged() + -dynamic _applyInputFormatters() + -dynamic _updateScaleMidValueControls() + -Map<String, dynamic>? _validateFreeText() + -dynamic _onFreeTextLengthChanged() + -List<FormControlValidation> _getValidationConfig() + +dynamic onQuestionTypeChanged() + +dynamic onResponseOptionsChanged() + -void _updateFormControls() + +void initControls() + +void setControlsFrom() + +QuestionFormData buildFormData() + +List<ModelAction<dynamic>> availableActions() + +void onNewItem() + +void onSelectItem() + +dynamic save() + +QuestionFormViewModel createDuplicate() - - - +formViewModel: QuestionFormViewModel + + + + + + + + ConsumerWidget - - - + + + - + FreeTextQuestionFormView - + +formViewModel: QuestionFormViewModel +generateLabelHelpTextMap: dynamic - + +Widget build() +Widget disableOnReadonly() @@ -992,221 +1015,198 @@ - - - + + + - - - ConsumerWidget + + + Enum - - - - - + + + + + - - - BoolQuestionFormView + + + ImageCapturingQuestionFormView - - - +formViewModel: QuestionFormViewModel + + + +formViewModel: QuestionFormViewModel - - - +Widget build() + + + +Widget build() - - - + + + + - - - Enum + + + IScaleQuestionFormViewModel - - - - - - - - - - AudioRecordingQuestionFormView + + + +isMidValuesClearedInfoVisible: bool - - - +formViewModel: QuestionFormViewModel + + + + + + + + + ScaleQuestionFormView - - - +Widget build() + + + +formViewModel: QuestionFormViewModel - - - + + + - + ChoiceQuestionFormView - + +formViewModel: QuestionFormViewModel - + +Widget build() - - - - - + + + + + - - - ImageCapturingQuestionFormView + + + BoolQuestionFormView - - - +formViewModel: QuestionFormViewModel + + + +formViewModel: QuestionFormViewModel - - - +Widget build() + + + +Widget build() - - - - - + + + - - - WithQuestionnaireControls + + + FormControl - - - +questionsArray: FormArray<dynamic> - +questionFormViewModels: FormViewModelCollection<Q, QuestionFormData> - +questionnaireControls: Map<String, FormArray<dynamic>> - +propagateOnSave: bool - +questionModels: List<Q> - +questionTitles: Map<FormMode, String Function()> - - + + + + - - - +void setQuestionnaireControlsFrom() - +QuestionnaireFormData buildQuestionnaireFormData() - +void read() - +void onCancel() - +dynamic onSave() - +Q provide() - +Q provideQuestionFormViewModel() + + + AbstractControl - - - + + + - - - FormViewModelCollection + + + FormGroup - - - + + + - - - IFormViewModelDelegate + + + ManagedFormViewModel - - - + + + - - - IProviderArgsResolver + + + IListActionProvider - - - - - - - - - QuestionnaireFormData - - + + + + - - - +questionsData: List<QuestionFormData>? - +id: String + + + SurveyQuestionFormView - - - +StudyUQuestionnaire toQuestionnaire() - +List<EligibilityCriterion> toEligibilityCriteria() - +QuestionnaireFormData copy() + + + +formViewModel: QuestionFormViewModel + +isHtmlStyleable: bool diff --git a/docs/uml/designer_v2/lib/features/design/shared/uml.svg b/docs/uml/designer_v2/lib/features/design/shared/uml.svg index 164371e09..cb3e53617 100644 --- a/docs/uml/designer_v2/lib/features/design/shared/uml.svg +++ b/docs/uml/designer_v2/lib/features/design/shared/uml.svg @@ -1,109 +1,38 @@ - - [SurveyQuestionFormView + + [<abstract>WithQuestionnaireControls | - +formViewModel: QuestionFormViewModel; - +isHtmlStyleable: bool + +questionsArray: FormArray<dynamic>; + +questionFormViewModels: FormViewModelCollection<Q, QuestionFormData>; + +questionnaireControls: Map<String, FormArray<dynamic>>; + +propagateOnSave: bool; + +questionModels: List<Q>; + +questionTitles: Map<FormMode, String Function()> + | + +void setQuestionnaireControlsFrom(); + +QuestionnaireFormData buildQuestionnaireFormData(); + +void read(); + +void onCancel(); + +dynamic onSave(); + +Q provide(); + +Q provideQuestionFormViewModel() ] - [SurveyQuestionFormView]o-[QuestionFormViewModel] + [<abstract>WithQuestionnaireControls]o-[FormArray] + [<abstract>WithQuestionnaireControls]o-[FormViewModelCollection] + [<abstract>IFormViewModelDelegate]<:--[<abstract>WithQuestionnaireControls] + [<abstract>IProviderArgsResolver]<:--[<abstract>WithQuestionnaireControls] - [QuestionFormViewModel + [QuestionnaireFormData | - <static>+defaultQuestionType: SurveyQuestionType; - -_titles: Map<FormMode, String Function()>?; - +questionIdControl: FormControl<String>; - +questionTypeControl: FormControl<SurveyQuestionType>; - +questionTextControl: FormControl<String>; - +questionInfoTextControl: FormControl<String>; - +questionBaseControls: Map<String, AbstractControl<dynamic>>; - +isMultipleChoiceControl: FormControl<bool>; - +choiceResponseOptionsArray: FormArray<dynamic>; - +customOptionsMin: int; - +customOptionsMax: int; - +customOptionsInitial: int; - +boolResponseOptionsArray: FormArray<String>; - +imageResponseOptionsArray: FormArray<String>; - <static>+kDefaultMaxRecordingDurationSeconds: int; - <static>+kMaxRecordingDurationSeconds: int; - +audioResponseOptionsArray: FormArray<String>; - +maxRecordingDurationSecondsControl: FormControl<int>; - <static>+kDefaultScaleMinValue: int; - <static>+kDefaultScaleMaxValue: int; - <static>+kNumMidValueControls: int; - <static>+kMidValueDebounceMilliseconds: int; - +scaleMinValueControl: FormControl<int>; - +scaleMaxValueControl: FormControl<int>; - -_scaleRangeControl: FormControl<int>; - +scaleMinLabelControl: FormControl<String>; - +scaleMaxLabelControl: FormControl<String>; - +scaleMidValueControls: FormArray<int>; - +scaleMidLabelControls: FormArray<String?>; - -_scaleResponseOptionsArray: FormArray<int>; - +scaleMinColorControl: FormControl<SerializableColor>; - +scaleMaxColorControl: FormControl<SerializableColor>; - +prevMidValues: List<int?>?; - +freeTextTypeControl: FormControl<FreeTextQuestionType>; - +customRegexControl: FormControl<String>; - +freeTextResponseOptionsArray: FormArray<dynamic>; - +freeTextLengthMin: AbstractControl<int>; - +freeTextLengthMax: AbstractControl<int>; - +freeTextExampleTextControl: FormControl<String>; - <static>+kDefaultFreeTextMinLength: int; - <static>+kDefaultFreeTextMaxLength: int; - +freeTextLengthControl: FormControl<RangeValues>; - -_controlsByQuestionType: Map<SurveyQuestionType, FormGroup>; - -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - -_validationConfigsByQuestionType: Map<SurveyQuestionType, Map<FormValidationSetEnum, List<FormControlValidation>>>; - +form: FormGroup; - +questionId: String; - +questionType: SurveyQuestionType; - +questionTypeControlOptions: List<FormControlOption<SurveyQuestionType>>; - +answerOptionsArray: FormArray<dynamic>; - +answerOptionsControls: List<AbstractControl<dynamic>>; - +validAnswerOptions: List<String>; - +boolOptions: List<AbstractControl<String>>; - +imageOptions: List<AbstractControl<String>>; - +audioOptions: List<AbstractControl<String>>; - +scaleMinValue: int; - +scaleMaxValue: int; - +scaleRange: int; - +scaleAllValueControls: List<AbstractControl<int>>; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +questionTextRequired: dynamic; - +numValidChoiceOptions: dynamic; - +scaleRangeValid: dynamic; - +maxRecordingDurationValid: dynamic; - +titles: Map<FormMode, String>; - +isAddOptionButtonVisible: bool; - +isMidValuesClearedInfoVisible: bool + +questionsData: List<QuestionFormData>?; + +id: String | - +String? scaleMidLabelAt(); - -dynamic _onScaleRangeChanged(); - -dynamic _applyInputFormatters(); - -dynamic _updateScaleMidValueControls(); - -Map<String, dynamic>? _validateFreeText(); - -dynamic _onFreeTextLengthChanged(); - -List<FormControlValidation> _getValidationConfig(); - +dynamic onQuestionTypeChanged(); - +dynamic onResponseOptionsChanged(); - -void _updateFormControls(); - +void initControls(); - +void setControlsFrom(); - +QuestionFormData buildFormData(); - +List<ModelAction<dynamic>> availableActions(); - +void onNewItem(); - +void onSelectItem(); - +dynamic save(); - +QuestionFormViewModel createDuplicate() + +StudyUQuestionnaire toQuestionnaire(); + +List<EligibilityCriterion> toEligibilityCriteria(); + +QuestionnaireFormData copy() ] - [QuestionFormViewModel]o-[SurveyQuestionType] - [QuestionFormViewModel]o-[FormControl] - [QuestionFormViewModel]o-[FormArray] - [QuestionFormViewModel]o-[<abstract>AbstractControl] - [QuestionFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[QuestionFormViewModel] - [<abstract>IListActionProvider]<:--[QuestionFormViewModel] + [<abstract>IFormData]<:--[QuestionnaireFormData] [<abstract>QuestionFormData | @@ -215,17 +144,15 @@ [FreeTextQuestionFormData]o-[FreeTextQuestionType] [<abstract>QuestionFormData]<:-[FreeTextQuestionFormData] - [<abstract>IScaleQuestionFormViewModel - | - +isMidValuesClearedInfoVisible: bool - ] - - [ScaleQuestionFormView + [AudioRecordingQuestionFormView | +formViewModel: QuestionFormViewModel + | + +Widget build() ] - [ScaleQuestionFormView]o-[QuestionFormViewModel] + [AudioRecordingQuestionFormView]o-[QuestionFormViewModel] + [<abstract>ConsumerWidget]<:-[AudioRecordingQuestionFormView] [FreeTextQuestionFormView | @@ -240,16 +167,6 @@ [FreeTextQuestionFormView]o-[QuestionFormViewModel] [<abstract>ConsumerWidget]<:-[FreeTextQuestionFormView] - [BoolQuestionFormView - | - +formViewModel: QuestionFormViewModel - | - +Widget build() - ] - - [BoolQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[BoolQuestionFormView] - [SurveyQuestionType | +index: int; @@ -265,81 +182,153 @@ [SurveyQuestionType]o-[SurveyQuestionType] [Enum]<:--[SurveyQuestionType] - [AudioRecordingQuestionFormView + [ImageCapturingQuestionFormView | +formViewModel: QuestionFormViewModel | +Widget build() ] - [AudioRecordingQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[AudioRecordingQuestionFormView] + [ImageCapturingQuestionFormView]o-[QuestionFormViewModel] + [<abstract>ConsumerWidget]<:-[ImageCapturingQuestionFormView] - [ChoiceQuestionFormView + [<abstract>IScaleQuestionFormViewModel | - +formViewModel: QuestionFormViewModel + +isMidValuesClearedInfoVisible: bool + ] + + [ScaleQuestionFormView | - +Widget build() + +formViewModel: QuestionFormViewModel ] - [ChoiceQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[ChoiceQuestionFormView] + [ScaleQuestionFormView]o-[QuestionFormViewModel] - [ImageCapturingQuestionFormView + [ChoiceQuestionFormView | +formViewModel: QuestionFormViewModel | +Widget build() ] - [ImageCapturingQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[ImageCapturingQuestionFormView] + [ChoiceQuestionFormView]o-[QuestionFormViewModel] + [<abstract>ConsumerWidget]<:-[ChoiceQuestionFormView] - [<abstract>WithQuestionnaireControls + [BoolQuestionFormView | - +questionsArray: FormArray<dynamic>; - +questionFormViewModels: FormViewModelCollection<Q, QuestionFormData>; - +questionnaireControls: Map<String, FormArray<dynamic>>; - +propagateOnSave: bool; - +questionModels: List<Q>; - +questionTitles: Map<FormMode, String Function()> + +formViewModel: QuestionFormViewModel | - +void setQuestionnaireControlsFrom(); - +QuestionnaireFormData buildQuestionnaireFormData(); - +void read(); - +void onCancel(); - +dynamic onSave(); - +Q provide(); - +Q provideQuestionFormViewModel() + +Widget build() ] - [<abstract>WithQuestionnaireControls]o-[FormArray] - [<abstract>WithQuestionnaireControls]o-[FormViewModelCollection] - [<abstract>IFormViewModelDelegate]<:--[<abstract>WithQuestionnaireControls] - [<abstract>IProviderArgsResolver]<:--[<abstract>WithQuestionnaireControls] + [BoolQuestionFormView]o-[QuestionFormViewModel] + [<abstract>ConsumerWidget]<:-[BoolQuestionFormView] - [QuestionnaireFormData + [QuestionFormViewModel | - +questionsData: List<QuestionFormData>?; - +id: String + <static>+defaultQuestionType: SurveyQuestionType; + -_titles: Map<FormMode, String Function()>?; + +questionIdControl: FormControl<String>; + +questionTypeControl: FormControl<SurveyQuestionType>; + +questionTextControl: FormControl<String>; + +questionInfoTextControl: FormControl<String>; + +questionBaseControls: Map<String, AbstractControl<dynamic>>; + +isMultipleChoiceControl: FormControl<bool>; + +choiceResponseOptionsArray: FormArray<dynamic>; + +customOptionsMin: int; + +customOptionsMax: int; + +customOptionsInitial: int; + +boolResponseOptionsArray: FormArray<String>; + +imageResponseOptionsArray: FormArray<String>; + <static>+kDefaultMaxRecordingDurationSeconds: int; + <static>+kMaxRecordingDurationSeconds: int; + +audioResponseOptionsArray: FormArray<String>; + +maxRecordingDurationSecondsControl: FormControl<int>; + <static>+kDefaultScaleMinValue: int; + <static>+kDefaultScaleMaxValue: int; + <static>+kNumMidValueControls: int; + <static>+kMidValueDebounceMilliseconds: int; + +scaleMinValueControl: FormControl<int>; + +scaleMaxValueControl: FormControl<int>; + -_scaleRangeControl: FormControl<int>; + +scaleMinLabelControl: FormControl<String>; + +scaleMaxLabelControl: FormControl<String>; + +scaleMidValueControls: FormArray<int>; + +scaleMidLabelControls: FormArray<String?>; + -_scaleResponseOptionsArray: FormArray<int>; + +scaleMinColorControl: FormControl<SerializableColor>; + +scaleMaxColorControl: FormControl<SerializableColor>; + +prevMidValues: List<int?>?; + +freeTextTypeControl: FormControl<FreeTextQuestionType>; + +customRegexControl: FormControl<String>; + +freeTextResponseOptionsArray: FormArray<dynamic>; + +freeTextLengthMin: AbstractControl<int>; + +freeTextLengthMax: AbstractControl<int>; + +freeTextExampleTextControl: FormControl<String>; + <static>+kDefaultFreeTextMinLength: int; + <static>+kDefaultFreeTextMaxLength: int; + +freeTextLengthControl: FormControl<RangeValues>; + -_controlsByQuestionType: Map<SurveyQuestionType, FormGroup>; + -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + -_validationConfigsByQuestionType: Map<SurveyQuestionType, Map<FormValidationSetEnum, List<FormControlValidation>>>; + +form: FormGroup; + +questionId: String; + +questionType: SurveyQuestionType; + +questionTypeControlOptions: List<FormControlOption<SurveyQuestionType>>; + +answerOptionsArray: FormArray<dynamic>; + +answerOptionsControls: List<AbstractControl<dynamic>>; + +validAnswerOptions: List<String>; + +boolOptions: List<AbstractControl<String>>; + +imageOptions: List<AbstractControl<String>>; + +audioOptions: List<AbstractControl<String>>; + +scaleMinValue: int; + +scaleMaxValue: int; + +scaleRange: int; + +scaleAllValueControls: List<AbstractControl<int>>; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +questionTextRequired: dynamic; + +numValidChoiceOptions: dynamic; + +scaleRangeValid: dynamic; + +maxRecordingDurationValid: dynamic; + +titles: Map<FormMode, String>; + +isAddOptionButtonVisible: bool; + +isMidValuesClearedInfoVisible: bool | - +StudyUQuestionnaire toQuestionnaire(); - +List<EligibilityCriterion> toEligibilityCriteria(); - +QuestionnaireFormData copy() + +String? scaleMidLabelAt(); + -dynamic _onScaleRangeChanged(); + -dynamic _applyInputFormatters(); + -dynamic _updateScaleMidValueControls(); + -Map<String, dynamic>? _validateFreeText(); + -dynamic _onFreeTextLengthChanged(); + -List<FormControlValidation> _getValidationConfig(); + +dynamic onQuestionTypeChanged(); + +dynamic onResponseOptionsChanged(); + -void _updateFormControls(); + +void initControls(); + +void setControlsFrom(); + +QuestionFormData buildFormData(); + +List<ModelAction<dynamic>> availableActions(); + +void onNewItem(); + +void onSelectItem(); + +dynamic save(); + +QuestionFormViewModel createDuplicate() ] - [<abstract>IFormData]<:--[QuestionnaireFormData] + [QuestionFormViewModel]o-[SurveyQuestionType] + [QuestionFormViewModel]o-[FormControl] + [QuestionFormViewModel]o-[FormArray] + [QuestionFormViewModel]o-[<abstract>AbstractControl] + [QuestionFormViewModel]o-[FormGroup] + [<abstract>ManagedFormViewModel]<:-[QuestionFormViewModel] + [<abstract>IListActionProvider]<:--[QuestionFormViewModel] - [ScheduleControls + [SurveyQuestionFormView | - +formViewModel: WithScheduleControls - | - +Widget build(); - -List<FormTableRow> _conditionalTimeRestrictions() + +formViewModel: QuestionFormViewModel; + +isHtmlStyleable: bool ] - [ScheduleControls]o-[<abstract>WithScheduleControls] - [<abstract>FormConsumerWidget]<:-[ScheduleControls] + [SurveyQuestionFormView]o-[QuestionFormViewModel] [<abstract>IFormDataWithSchedule | @@ -356,6 +345,17 @@ [<abstract>IFormDataWithSchedule]o-[StudyUTimeOfDay] [<abstract>IFormData]<:--[<abstract>IFormDataWithSchedule] + [ScheduleControls + | + +formViewModel: WithScheduleControls + | + +Widget build(); + -List<FormTableRow> _conditionalTimeRestrictions() + ] + + [ScheduleControls]o-[<abstract>WithScheduleControls] + [<abstract>FormConsumerWidget]<:-[ScheduleControls] + [<abstract>WithScheduleControls | +isTimeRestrictedControl: FormControl<bool>; @@ -384,383 +384,284 @@ - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + - - - + - - - - - - - - - - - + - + - + - - - - - - - - - - - - - - - - + + - - - - - - - - - - - - - - - - - - - SurveyQuestionFormView - - - - - - +formViewModel: QuestionFormViewModel - +isHtmlStyleable: bool - - - + - - - - - - - - - QuestionFormViewModel - - - - - - <static>+defaultQuestionType: SurveyQuestionType - -_titles: Map<FormMode, String Function()>? - +questionIdControl: FormControl<String> - +questionTypeControl: FormControl<SurveyQuestionType> - +questionTextControl: FormControl<String> - +questionInfoTextControl: FormControl<String> - +questionBaseControls: Map<String, AbstractControl<dynamic>> - +isMultipleChoiceControl: FormControl<bool> - +choiceResponseOptionsArray: FormArray<dynamic> - +customOptionsMin: int - +customOptionsMax: int - +customOptionsInitial: int - +boolResponseOptionsArray: FormArray<String> - +imageResponseOptionsArray: FormArray<String> - <static>+kDefaultMaxRecordingDurationSeconds: int - <static>+kMaxRecordingDurationSeconds: int - +audioResponseOptionsArray: FormArray<String> - +maxRecordingDurationSecondsControl: FormControl<int> - <static>+kDefaultScaleMinValue: int - <static>+kDefaultScaleMaxValue: int - <static>+kNumMidValueControls: int - <static>+kMidValueDebounceMilliseconds: int - +scaleMinValueControl: FormControl<int> - +scaleMaxValueControl: FormControl<int> - -_scaleRangeControl: FormControl<int> - +scaleMinLabelControl: FormControl<String> - +scaleMaxLabelControl: FormControl<String> - +scaleMidValueControls: FormArray<int> - +scaleMidLabelControls: FormArray<String?> - -_scaleResponseOptionsArray: FormArray<int> - +scaleMinColorControl: FormControl<SerializableColor> - +scaleMaxColorControl: FormControl<SerializableColor> - +prevMidValues: List<int?>? - +freeTextTypeControl: FormControl<FreeTextQuestionType> - +customRegexControl: FormControl<String> - +freeTextResponseOptionsArray: FormArray<dynamic> - +freeTextLengthMin: AbstractControl<int> - +freeTextLengthMax: AbstractControl<int> - +freeTextExampleTextControl: FormControl<String> - <static>+kDefaultFreeTextMinLength: int - <static>+kDefaultFreeTextMaxLength: int - +freeTextLengthControl: FormControl<RangeValues> - -_controlsByQuestionType: Map<SurveyQuestionType, FormGroup> - -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - -_validationConfigsByQuestionType: Map<SurveyQuestionType, Map<FormValidationSetEnum, List<FormControlValidation>>> - +form: FormGroup - +questionId: String - +questionType: SurveyQuestionType - +questionTypeControlOptions: List<FormControlOption<SurveyQuestionType>> - +answerOptionsArray: FormArray<dynamic> - +answerOptionsControls: List<AbstractControl<dynamic>> - +validAnswerOptions: List<String> - +boolOptions: List<AbstractControl<String>> - +imageOptions: List<AbstractControl<String>> - +audioOptions: List<AbstractControl<String>> - +scaleMinValue: int - +scaleMaxValue: int - +scaleRange: int - +scaleAllValueControls: List<AbstractControl<int>> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +questionTextRequired: dynamic - +numValidChoiceOptions: dynamic - +scaleRangeValid: dynamic - +maxRecordingDurationValid: dynamic - +titles: Map<FormMode, String> - +isAddOptionButtonVisible: bool - +isMidValuesClearedInfoVisible: bool + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + WithQuestionnaireControls - - - +String? scaleMidLabelAt() - -dynamic _onScaleRangeChanged() - -dynamic _applyInputFormatters() - -dynamic _updateScaleMidValueControls() - -Map<String, dynamic>? _validateFreeText() - -dynamic _onFreeTextLengthChanged() - -List<FormControlValidation> _getValidationConfig() - +dynamic onQuestionTypeChanged() - +dynamic onResponseOptionsChanged() - -void _updateFormControls() - +void initControls() - +void setControlsFrom() - +QuestionFormData buildFormData() - +List<ModelAction<dynamic>> availableActions() - +void onNewItem() - +void onSelectItem() - +dynamic save() - +QuestionFormViewModel createDuplicate() + + + +questionsArray: FormArray<dynamic> + +questionFormViewModels: FormViewModelCollection<Q, QuestionFormData> + +questionnaireControls: Map<String, FormArray<dynamic>> + +propagateOnSave: bool + +questionModels: List<Q> + +questionTitles: Map<FormMode, String Function()> - - - - - - - - - SurveyQuestionType + + + +void setQuestionnaireControlsFrom() + +QuestionnaireFormData buildQuestionnaireFormData() + +void read() + +void onCancel() + +dynamic onSave() + +Q provide() + +Q provideQuestionFormViewModel() - - - +index: int - <static>+values: List<SurveyQuestionType> - <static>+choice: SurveyQuestionType - <static>+bool: SurveyQuestionType - <static>+scale: SurveyQuestionType - <static>+image: SurveyQuestionType - <static>+audio: SurveyQuestionType - <static>+freeText: SurveyQuestionType + + + + + + + + FormArray - - - + + + - - - FormControl + + + FormViewModelCollection - - - + + + - - - FormArray + + + IFormViewModelDelegate - - - + + + - - - AbstractControl + + + IProviderArgsResolver - - - + + + + + - - - FormGroup + + + QuestionnaireFormData - - - - + + + +questionsData: List<QuestionFormData>? + +id: String + + - - - ManagedFormViewModel + + + +StudyUQuestionnaire toQuestionnaire() + +List<EligibilityCriterion> toEligibilityCriteria() + +QuestionnaireFormData copy() - - - + + + - - - IListActionProvider + + + IFormData - - - + + + - + QuestionFormData - + <static>+questionTypeFormDataFactories: Map<SurveyQuestionType, QuestionFormData Function(Question<dynamic>, List<EligibilityCriterion>)> +questionId: String @@ -773,7 +674,7 @@ - + +Question<dynamic> toQuestion() +EligibilityCriterion toEligibilityCriterion() @@ -784,30 +685,44 @@ - - - + + + + - - - IFormData + + + SurveyQuestionType + + + + + + +index: int + <static>+values: List<SurveyQuestionType> + <static>+choice: SurveyQuestionType + <static>+bool: SurveyQuestionType + <static>+scale: SurveyQuestionType + <static>+image: SurveyQuestionType + <static>+audio: SurveyQuestionType + <static>+freeText: SurveyQuestionType - - - + + + - + ChoiceQuestionFormData - + +isMultipleChoice: bool +answerOptions: List<String> @@ -815,7 +730,7 @@ - + +Question<dynamic> toQuestion() +QuestionFormData copy() @@ -827,24 +742,24 @@ - - - + + + - + BoolQuestionFormData - + <static>+kResponseOptions: Map<String, bool> +responseOptions: List<String> - + +Question<dynamic> toQuestion() +BoolQuestionFormData copy() @@ -855,24 +770,24 @@ - - - + + + - + ImageQuestionFormData - + <static>+kResponseOptions: Map<String, FutureBlobFile> +responseOptions: List<String> - + +Question<dynamic> toQuestion() +ImageQuestionFormData copy() @@ -883,17 +798,17 @@ - - - + + + - + AudioQuestionFormData - + +maxRecordingDurationSeconds: int <static>+kResponseOptions: Map<String, FutureBlobFile> @@ -901,7 +816,7 @@ - + +Question<dynamic> toQuestion() +AudioQuestionFormData copy() @@ -912,17 +827,17 @@ - - - + + + - + ScaleQuestionFormData - + +minValue: double +maxValue: double @@ -939,7 +854,7 @@ - + +ScaleQuestion toQuestion() +QuestionFormData copy() @@ -950,9 +865,9 @@ - + - + Color @@ -961,17 +876,17 @@ - - - + + + - + FreeTextQuestionFormData - + +textLengthRange: List<int> +textType: FreeTextQuestionType @@ -980,7 +895,7 @@ - + +Question<dynamic> toQuestion() +FreeTextQuestionFormData copy() @@ -991,71 +906,179 @@ - + - + FreeTextQuestionType - - - - + + + + + - - - IScaleQuestionFormViewModel + + + AudioRecordingQuestionFormView + + + + + + +formViewModel: QuestionFormViewModel + + + + + + +Widget build() + + + + + + + + + + + + + QuestionFormViewModel + + + + + + <static>+defaultQuestionType: SurveyQuestionType + -_titles: Map<FormMode, String Function()>? + +questionIdControl: FormControl<String> + +questionTypeControl: FormControl<SurveyQuestionType> + +questionTextControl: FormControl<String> + +questionInfoTextControl: FormControl<String> + +questionBaseControls: Map<String, AbstractControl<dynamic>> + +isMultipleChoiceControl: FormControl<bool> + +choiceResponseOptionsArray: FormArray<dynamic> + +customOptionsMin: int + +customOptionsMax: int + +customOptionsInitial: int + +boolResponseOptionsArray: FormArray<String> + +imageResponseOptionsArray: FormArray<String> + <static>+kDefaultMaxRecordingDurationSeconds: int + <static>+kMaxRecordingDurationSeconds: int + +audioResponseOptionsArray: FormArray<String> + +maxRecordingDurationSecondsControl: FormControl<int> + <static>+kDefaultScaleMinValue: int + <static>+kDefaultScaleMaxValue: int + <static>+kNumMidValueControls: int + <static>+kMidValueDebounceMilliseconds: int + +scaleMinValueControl: FormControl<int> + +scaleMaxValueControl: FormControl<int> + -_scaleRangeControl: FormControl<int> + +scaleMinLabelControl: FormControl<String> + +scaleMaxLabelControl: FormControl<String> + +scaleMidValueControls: FormArray<int> + +scaleMidLabelControls: FormArray<String?> + -_scaleResponseOptionsArray: FormArray<int> + +scaleMinColorControl: FormControl<SerializableColor> + +scaleMaxColorControl: FormControl<SerializableColor> + +prevMidValues: List<int?>? + +freeTextTypeControl: FormControl<FreeTextQuestionType> + +customRegexControl: FormControl<String> + +freeTextResponseOptionsArray: FormArray<dynamic> + +freeTextLengthMin: AbstractControl<int> + +freeTextLengthMax: AbstractControl<int> + +freeTextExampleTextControl: FormControl<String> + <static>+kDefaultFreeTextMinLength: int + <static>+kDefaultFreeTextMaxLength: int + +freeTextLengthControl: FormControl<RangeValues> + -_controlsByQuestionType: Map<SurveyQuestionType, FormGroup> + -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + -_validationConfigsByQuestionType: Map<SurveyQuestionType, Map<FormValidationSetEnum, List<FormControlValidation>>> + +form: FormGroup + +questionId: String + +questionType: SurveyQuestionType + +questionTypeControlOptions: List<FormControlOption<SurveyQuestionType>> + +answerOptionsArray: FormArray<dynamic> + +answerOptionsControls: List<AbstractControl<dynamic>> + +validAnswerOptions: List<String> + +boolOptions: List<AbstractControl<String>> + +imageOptions: List<AbstractControl<String>> + +audioOptions: List<AbstractControl<String>> + +scaleMinValue: int + +scaleMaxValue: int + +scaleRange: int + +scaleAllValueControls: List<AbstractControl<int>> + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +questionTextRequired: dynamic + +numValidChoiceOptions: dynamic + +scaleRangeValid: dynamic + +maxRecordingDurationValid: dynamic + +titles: Map<FormMode, String> + +isAddOptionButtonVisible: bool + +isMidValuesClearedInfoVisible: bool - - - +isMidValuesClearedInfoVisible: bool + + + +String? scaleMidLabelAt() + -dynamic _onScaleRangeChanged() + -dynamic _applyInputFormatters() + -dynamic _updateScaleMidValueControls() + -Map<String, dynamic>? _validateFreeText() + -dynamic _onFreeTextLengthChanged() + -List<FormControlValidation> _getValidationConfig() + +dynamic onQuestionTypeChanged() + +dynamic onResponseOptionsChanged() + -void _updateFormControls() + +void initControls() + +void setControlsFrom() + +QuestionFormData buildFormData() + +List<ModelAction<dynamic>> availableActions() + +void onNewItem() + +void onSelectItem() + +dynamic save() + +QuestionFormViewModel createDuplicate() - - - - - - - - ScaleQuestionFormView - - + + + - - - +formViewModel: QuestionFormViewModel + + + ConsumerWidget - - - + + + - + FreeTextQuestionFormView - + +formViewModel: QuestionFormViewModel +generateLabelHelpTextMap: dynamic - + +Widget build() +Widget disableOnReadonly() @@ -1064,244 +1087,262 @@ - - - + + + - - - ConsumerWidget + + + Enum - - - - - + + + + + - - - BoolQuestionFormView + + + ImageCapturingQuestionFormView - - - +formViewModel: QuestionFormViewModel + + + +formViewModel: QuestionFormViewModel - - - +Widget build() + + + +Widget build() - - - + + + + - - - Enum + + + IScaleQuestionFormViewModel - - - - - - - - - - AudioRecordingQuestionFormView + + + +isMidValuesClearedInfoVisible: bool - - - +formViewModel: QuestionFormViewModel + + + + + + + + + ScaleQuestionFormView - - - +Widget build() + + + +formViewModel: QuestionFormViewModel - - - + + + - + ChoiceQuestionFormView - + +formViewModel: QuestionFormViewModel - + +Widget build() - - - - - + + + + + - - - ImageCapturingQuestionFormView + + + BoolQuestionFormView - - - +formViewModel: QuestionFormViewModel + + + +formViewModel: QuestionFormViewModel - - - +Widget build() + + + +Widget build() - - - - - + + + - - - WithQuestionnaireControls + + + FormControl - - - +questionsArray: FormArray<dynamic> - +questionFormViewModels: FormViewModelCollection<Q, QuestionFormData> - +questionnaireControls: Map<String, FormArray<dynamic>> - +propagateOnSave: bool - +questionModels: List<Q> - +questionTitles: Map<FormMode, String Function()> + + + + + + + + AbstractControl - - - +void setQuestionnaireControlsFrom() - +QuestionnaireFormData buildQuestionnaireFormData() - +void read() - +void onCancel() - +dynamic onSave() - +Q provide() - +Q provideQuestionFormViewModel() + + + + + + + + FormGroup - - - + + + - - - FormViewModelCollection + + + ManagedFormViewModel - - - + + + - - - IFormViewModelDelegate + + + IListActionProvider - - - + + + + - - - IProviderArgsResolver + + + SurveyQuestionFormView + + + + + + +formViewModel: QuestionFormViewModel + +isHtmlStyleable: bool - - - - - + + + + + - - - QuestionnaireFormData + + + IFormDataWithSchedule - - - +questionsData: List<QuestionFormData>? - +id: String + + + +instanceId: String + +isTimeLocked: bool + +timeLockStart: StudyUTimeOfDay? + +timeLockEnd: StudyUTimeOfDay? + +hasReminder: bool + +reminderTime: StudyUTimeOfDay? - - - +StudyUQuestionnaire toQuestionnaire() - +List<EligibilityCriterion> toEligibilityCriteria() - +QuestionnaireFormData copy() + + + +Schedule toSchedule() + + + + + + + + + + + StudyUTimeOfDay - - - + + + - + ScheduleControls - + +formViewModel: WithScheduleControls - + +Widget build() -List<FormTableRow> _conditionalTimeRestrictions() @@ -1311,17 +1352,17 @@ - - - + + + - + WithScheduleControls - + +isTimeRestrictedControl: FormControl<bool> +instanceID: FormControl<String> @@ -1340,7 +1381,7 @@ - + +void setScheduleControlsFrom() -dynamic _initReminderControl() @@ -1350,61 +1391,20 @@ - + - + FormConsumerWidget - - - - - - - - - IFormDataWithSchedule - - - - - - +instanceId: String - +isTimeLocked: bool - +timeLockStart: StudyUTimeOfDay? - +timeLockEnd: StudyUTimeOfDay? - +hasReminder: bool - +reminderTime: StudyUTimeOfDay? - - - - - - +Schedule toSchedule() - - - - - - - - - - - StudyUTimeOfDay - - - - - + - + StreamSubscription diff --git a/docs/uml/designer_v2/lib/features/design/uml.svg b/docs/uml/designer_v2/lib/features/design/uml.svg index 5ea2c816d..e752ee322 100644 --- a/docs/uml/designer_v2/lib/features/design/uml.svg +++ b/docs/uml/designer_v2/lib/features/design/uml.svg @@ -1,191 +1,52 @@ - - [ScreenerQuestionFormViewModel + + [StudyDesignInterventionsFormView | - <static>+defaultResponseOptionValidity: bool; - +responseOptionsDisabledArray: FormArray<dynamic>; - +responseOptionsLogicControls: FormArray<bool>; - +responseOptionsLogicDescriptionControls: FormArray<String>; - -_questionBaseControls: Map<String, AbstractControl<dynamic>>; - +prevResponseOptionControls: List<AbstractControl<dynamic>>; - +prevResponseOptionValues: List<dynamic>; - +responseOptionsDisabledControls: List<AbstractControl<dynamic>>; - +logicControlOptions: List<FormControlOption<bool>>; - +questionBaseControls: Map<String, AbstractControl<dynamic>>; - +isDirtyOptionsBannerVisible: bool - | - +dynamic onResponseOptionsChanged(); - +void setControlsFrom(); - +QuestionFormData buildFormData(); - -List<FormControl<dynamic>> _copyFormControls(); - -AbstractControl<dynamic>? _findAssociatedLogicControlFor(); - -AbstractControl<dynamic>? _findAssociatedControlFor(); - +ScreenerQuestionFormViewModel createDuplicate() - ] - - [ScreenerQuestionFormViewModel]o-[FormArray] - [QuestionFormViewModel]<:-[ScreenerQuestionFormViewModel] - [<abstract>IScreenerQuestionLogicFormViewModel]<:--[ScreenerQuestionFormViewModel] - - [StudyDesignEnrollmentFormView - | - +Widget build(); - -dynamic _showScreenerQuestionSidesheetWithArgs(); - -dynamic _showConsentItemSidesheetWithArgs() - ] - - [<abstract>StudyDesignPageWidget]<:-[StudyDesignEnrollmentFormView] - - [<abstract>IScreenerQuestionLogicFormViewModel - | - +isDirtyOptionsBannerVisible: bool - ] - - [ScreenerQuestionLogicFormView - | - +formViewModel: ScreenerQuestionFormViewModel - | - +Widget build(); - -dynamic _buildInfoBanner(); - -dynamic _buildAnswerOptionsLogicControls(); - -List<Widget> _buildOptionLogicRow() - ] - - [ScreenerQuestionLogicFormView]o-[ScreenerQuestionFormViewModel] - [<abstract>FormConsumerWidget]<:-[ScreenerQuestionLogicFormView] - - [ConsentItemFormData - | - +consentId: String; - +title: String; - +description: String; - +iconName: String?; - +id: String - | - +ConsentItem toConsentItem(); - +ConsentItemFormData copy() + +Widget build() ] - [<abstract>IFormData]<:-[ConsentItemFormData] + [<abstract>StudyDesignPageWidget]<:-[StudyDesignInterventionsFormView] - [EnrollmentFormViewModel - | - +study: Study; - +router: GoRouter; - +consentItemDelegate: EnrollmentFormConsentItemDelegate; - +enrollmentTypeControl: FormControl<Participation>; - +consentItemArray: FormArray<dynamic>; - +consentItemFormViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData>; - +form: FormGroup; - +enrollmentTypeControlOptions: List<FormControlOption<Participation>>; - +consentItemModels: List<ConsentItemFormViewModel>; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titles: Map<FormMode, String>; - +canTestScreener: bool; - +canTestConsent: bool; - +questionTitles: Map<FormMode, String Function()> + [InterventionFormView | - +void setControlsFrom(); - +EnrollmentFormData buildFormData(); - +void read(); - +List<ModelAction<dynamic>> availableActions(); - +List<ModelAction<dynamic>> availablePopupActions(); - +List<ModelAction<dynamic>> availableInlineActions(); - +void onSelectItem(); - +void onNewItem(); - +ScreenerQuestionFormRouteArgs buildNewScreenerQuestionFormRouteArgs(); - +ScreenerQuestionFormRouteArgs buildScreenerQuestionFormRouteArgs(); - +ConsentItemFormRouteArgs buildNewConsentItemFormRouteArgs(); - +ConsentItemFormRouteArgs buildConsentItemFormRouteArgs(); - +dynamic testScreener(); - +dynamic testConsent(); - +ScreenerQuestionFormViewModel provideQuestionFormViewModel() + +formViewModel: InterventionFormViewModel ] - [EnrollmentFormViewModel]o-[Study] - [EnrollmentFormViewModel]o-[GoRouter] - [EnrollmentFormViewModel]o-[EnrollmentFormConsentItemDelegate] - [EnrollmentFormViewModel]o-[FormControl] - [EnrollmentFormViewModel]o-[FormArray] - [EnrollmentFormViewModel]o-[FormViewModelCollection] - [EnrollmentFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[EnrollmentFormViewModel] - [<abstract>WithQuestionnaireControls]<:-[EnrollmentFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[EnrollmentFormViewModel] - [<abstract>IListActionProvider]<:--[EnrollmentFormViewModel] - [<abstract>IProviderArgsResolver]<:--[EnrollmentFormViewModel] + [InterventionFormView]o-[InterventionFormViewModel] - [EnrollmentFormConsentItemDelegate + [InterventionPreview | - +formViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData>; - +owner: EnrollmentFormViewModel; - +propagateOnSave: bool; - +validationSet: dynamic + +routeArgs: InterventionFormRouteArgs | - +void onCancel(); - +dynamic onSave(); - +ConsentItemFormViewModel provide(); - +List<ModelAction<dynamic>> availableActions(); - +void onNewItem(); - +void onSelectItem() + +Widget build() ] - [EnrollmentFormConsentItemDelegate]o-[FormViewModelCollection] - [EnrollmentFormConsentItemDelegate]o-[EnrollmentFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[EnrollmentFormConsentItemDelegate] - [<abstract>IListActionProvider]<:--[EnrollmentFormConsentItemDelegate] - [<abstract>IProviderArgsResolver]<:--[EnrollmentFormConsentItemDelegate] + [InterventionPreview]o-[InterventionFormRouteArgs] + [<abstract>ConsumerWidget]<:-[InterventionPreview] - [ConsentItemFormViewModel - | - +consentIdControl: FormControl<String>; - +titleControl: FormControl<String>; - +descriptionControl: FormControl<String>; - +iconControl: FormControl<IconOption>; - +form: FormGroup; - +consentId: String; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titleRequired: dynamic; - +descriptionRequired: dynamic; - +titles: Map<FormMode, String> + [StudyScheduleFormView | - +void setControlsFrom(); - +ConsentItemFormData buildFormData(); - +ConsentItemFormViewModel createDuplicate() - ] - - [ConsentItemFormViewModel]o-[FormControl] - [ConsentItemFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[ConsentItemFormViewModel] - - [ConsentItemFormView + +formViewModel: StudyScheduleControls | - +formViewModel: ConsentItemFormViewModel + -FormTableRow _renderCustomSequence(); + +Widget build() ] - [ConsentItemFormView]o-[ConsentItemFormViewModel] + [StudyScheduleFormView]o-[<abstract>StudyScheduleControls] + [<abstract>FormConsumerWidget]<:-[StudyScheduleFormView] - [EnrollmentFormData + [InterventionTaskFormData | - <static>+kDefaultEnrollmentType: Participation; - +enrollmentType: Participation; - +questionnaireFormData: QuestionnaireFormData; - +consentItemsFormData: List<ConsentItemFormData>?; + +taskId: String; + +taskTitle: String; + +taskDescription: String?; + <static>+kDefaultTitle: String; +id: String | - +Study apply(); - +EnrollmentFormData copy() - ] - - [EnrollmentFormData]o-[Participation] - [EnrollmentFormData]o-[QuestionnaireFormData] - [<abstract>IStudyFormData]<:--[EnrollmentFormData] - - [StudyDesignInterventionsFormView - | - +Widget build() + +CheckmarkTask toTask(); + +InterventionTaskFormData copy() ] - [<abstract>StudyDesignPageWidget]<:-[StudyDesignInterventionsFormView] + [<abstract>IFormDataWithSchedule]<:-[InterventionTaskFormData] [InterventionsFormViewModel | @@ -224,134 +85,31 @@ [<abstract>IListActionProvider]<:--[InterventionsFormViewModel] [<abstract>IProviderArgsResolver]<:--[InterventionsFormViewModel] - [InterventionFormViewModel + [InterventionTaskFormViewModel | - +study: Study; - +interventionIdControl: FormControl<String>; - +interventionTitleControl: FormControl<String>; - +interventionIconControl: FormControl<IconOption>; - +interventionDescriptionControl: FormControl<String>; - +interventionTasksArray: FormArray<dynamic>; - +tasksCollection: FormViewModelCollection<InterventionTaskFormViewModel, InterventionTaskFormData>; + +taskIdControl: FormControl<String>; + +instanceIdControl: FormControl<String>; + +taskTitleControl: FormControl<String>; + +taskDescriptionControl: FormControl<String>; + +markAsCompletedControl: FormControl<bool>; +form: FormGroup; - +interventionId: String; + +taskId: String; + +instanceId: String; +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; +titleRequired: dynamic; - +atLeastOneTask: dynamic; - +breadcrumbsTitle: String; +titles: Map<FormMode, String> | +void setControlsFrom(); - +InterventionFormData buildFormData(); - +List<ModelAction<dynamic>> availableActions(); - +List<ModelAction<dynamic>> availablePopupActions(); - +List<ModelAction<dynamic>> availableInlineActions(); - +void onSelectItem(); - +void onNewItem(); - +void onCancel(); - +dynamic onSave(); - +InterventionTaskFormViewModel provide(); - +InterventionTaskFormRouteArgs buildNewFormRouteArgs(); - +InterventionTaskFormRouteArgs buildFormRouteArgs(); - +InterventionFormViewModel createDuplicate() - ] - - [InterventionFormViewModel]o-[Study] - [InterventionFormViewModel]o-[FormControl] - [InterventionFormViewModel]o-[FormArray] - [InterventionFormViewModel]o-[FormViewModelCollection] - [InterventionFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[InterventionFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[InterventionFormViewModel] - [<abstract>IListActionProvider]<:--[InterventionFormViewModel] - [<abstract>IProviderArgsResolver]<:--[InterventionFormViewModel] - - [InterventionTaskFormData - | - +taskId: String; - +taskTitle: String; - +taskDescription: String?; - <static>+kDefaultTitle: String; - +id: String - | - +CheckmarkTask toTask(); - +InterventionTaskFormData copy() + +InterventionTaskFormData buildFormData(); + +InterventionTaskFormViewModel createDuplicate() ] - [<abstract>IFormDataWithSchedule]<:-[InterventionTaskFormData] + [InterventionTaskFormViewModel]o-[FormControl] + [InterventionTaskFormViewModel]o-[FormGroup] + [<abstract>ManagedFormViewModel]<:-[InterventionTaskFormViewModel] + [<abstract>WithScheduleControls]<:-[InterventionTaskFormViewModel] - [StudyScheduleFormData - | - +sequenceType: PhaseSequence; - +sequenceTypeCustom: String; - +numCycles: int; - +phaseDuration: int; - +includeBaseline: bool; - +id: String - | - +StudySchedule toStudySchedule(); - +Study apply(); - +StudyScheduleFormData copy() - ] - - [StudyScheduleFormData]o-[PhaseSequence] - [<abstract>IStudyFormData]<:--[StudyScheduleFormData] - - [InterventionPreview - | - +routeArgs: InterventionFormRouteArgs - | - +Widget build() - ] - - [InterventionPreview]o-[InterventionFormRouteArgs] - [<abstract>ConsumerWidget]<:-[InterventionPreview] - - [InterventionTaskFormViewModel - | - +taskIdControl: FormControl<String>; - +instanceIdControl: FormControl<String>; - +taskTitleControl: FormControl<String>; - +taskDescriptionControl: FormControl<String>; - +markAsCompletedControl: FormControl<bool>; - +form: FormGroup; - +taskId: String; - +instanceId: String; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titleRequired: dynamic; - +titles: Map<FormMode, String> - | - +void setControlsFrom(); - +InterventionTaskFormData buildFormData(); - +InterventionTaskFormViewModel createDuplicate() - ] - - [InterventionTaskFormViewModel]o-[FormControl] - [InterventionTaskFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[InterventionTaskFormViewModel] - [<abstract>WithScheduleControls]<:-[InterventionTaskFormViewModel] - - [InterventionsFormData - | - +interventionsData: List<InterventionFormData>; - +studyScheduleData: StudyScheduleFormData; - +id: String - | - +Study apply(); - +InterventionsFormData copy() - ] - - [InterventionsFormData]o-[StudyScheduleFormData] - [<abstract>IStudyFormData]<:--[InterventionsFormData] - - [InterventionFormView - | - +formViewModel: InterventionFormViewModel - ] - - [InterventionFormView]o-[InterventionFormViewModel] - - [<abstract>StudyScheduleControls + [<abstract>StudyScheduleControls | <static>+defaultScheduleType: PhaseSequence; <static>+defaultScheduleTypeSequence: String; @@ -381,13 +139,6 @@ [<abstract>StudyScheduleControls]o-[PhaseSequence] [<abstract>StudyScheduleControls]o-[FormControl] - [InterventionTaskFormView - | - +formViewModel: InterventionTaskFormViewModel - ] - - [InterventionTaskFormView]o-[InterventionTaskFormViewModel] - [InterventionFormData | +interventionId: String; @@ -404,235 +155,257 @@ [<abstract>IFormData]<:-[InterventionFormData] - [StudyScheduleFormView + [StudyScheduleFormData | - +formViewModel: StudyScheduleControls + +sequenceType: PhaseSequence; + +sequenceTypeCustom: String; + +numCycles: int; + +phaseDuration: int; + +includeBaseline: bool; + +id: String | - -FormTableRow _renderCustomSequence(); - +Widget build() + +StudySchedule toStudySchedule(); + +Study apply(); + +StudyScheduleFormData copy() ] - [StudyScheduleFormView]o-[<abstract>StudyScheduleControls] - [<abstract>FormConsumerWidget]<:-[StudyScheduleFormView] + [StudyScheduleFormData]o-[PhaseSequence] + [<abstract>IStudyFormData]<:--[StudyScheduleFormData] - [<abstract>IStudyFormData + [InterventionTaskFormView | - +Study apply() + +formViewModel: InterventionTaskFormViewModel ] - [<abstract>IFormData]<:--[<abstract>IStudyFormData] + [InterventionTaskFormView]o-[InterventionTaskFormViewModel] - [StudyInfoFormData + [InterventionsFormData | - +title: String; - +description: String?; - +iconName: String; - +contactInfoFormData: StudyContactInfoFormData; + +interventionsData: List<InterventionFormData>; + +studyScheduleData: StudyScheduleFormData; +id: String | +Study apply(); - +StudyInfoFormData copy() + +InterventionsFormData copy() ] - [StudyInfoFormData]o-[StudyContactInfoFormData] - [<abstract>IStudyFormData]<:--[StudyInfoFormData] + [InterventionsFormData]o-[StudyScheduleFormData] + [<abstract>IStudyFormData]<:--[InterventionsFormData] - [StudyContactInfoFormData + [InterventionFormViewModel | - +organization: String?; - +institutionalReviewBoard: String?; - +institutionalReviewBoardNumber: String?; - +researchers: String?; - +email: String?; - +website: String?; - +phone: String?; - +additionalInfo: String?; - +id: String + +study: Study; + +interventionIdControl: FormControl<String>; + +interventionTitleControl: FormControl<String>; + +interventionIconControl: FormControl<IconOption>; + +interventionDescriptionControl: FormControl<String>; + +interventionTasksArray: FormArray<dynamic>; + +tasksCollection: FormViewModelCollection<InterventionTaskFormViewModel, InterventionTaskFormData>; + +form: FormGroup; + +interventionId: String; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +titleRequired: dynamic; + +atLeastOneTask: dynamic; + +breadcrumbsTitle: String; + +titles: Map<FormMode, String> | - +Study apply(); - +StudyInfoFormData copy() + +void setControlsFrom(); + +InterventionFormData buildFormData(); + +List<ModelAction<dynamic>> availableActions(); + +List<ModelAction<dynamic>> availablePopupActions(); + +List<ModelAction<dynamic>> availableInlineActions(); + +void onSelectItem(); + +void onNewItem(); + +void onCancel(); + +dynamic onSave(); + +InterventionTaskFormViewModel provide(); + +InterventionTaskFormRouteArgs buildNewFormRouteArgs(); + +InterventionTaskFormRouteArgs buildFormRouteArgs(); + +InterventionFormViewModel createDuplicate() ] - [<abstract>IStudyFormData]<:--[StudyContactInfoFormData] + [InterventionFormViewModel]o-[Study] + [InterventionFormViewModel]o-[FormControl] + [InterventionFormViewModel]o-[FormArray] + [InterventionFormViewModel]o-[FormViewModelCollection] + [InterventionFormViewModel]o-[FormGroup] + [<abstract>ManagedFormViewModel]<:-[InterventionFormViewModel] + [<abstract>IFormViewModelDelegate]<:--[InterventionFormViewModel] + [<abstract>IListActionProvider]<:--[InterventionFormViewModel] + [<abstract>IProviderArgsResolver]<:--[InterventionFormViewModel] - [StudyDesignInfoFormView + [StudyDesignReportsFormView | - +Widget build() + +Widget build(); + -dynamic _showReportItemSidesheetWithArgs() ] - [<abstract>StudyDesignPageWidget]<:-[StudyDesignInfoFormView] + [<abstract>StudyDesignPageWidget]<:-[StudyDesignReportsFormView] - [StudyInfoFormViewModel + [ReportItemFormData | - +study: Study; - +titleControl: FormControl<String>; - +iconControl: FormControl<IconOption>; - +descriptionControl: FormControl<String>; - +organizationControl: FormControl<String>; - +reviewBoardControl: FormControl<String>; - +reviewBoardNumberControl: FormControl<String>; - +researchersControl: FormControl<String>; - +emailControl: FormControl<String>; - +websiteControl: FormControl<String>; - +phoneControl: FormControl<String>; - +additionalInfoControl: FormControl<String>; - +form: FormGroup; - +titles: Map<FormMode, String>; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titleRequired: dynamic; - +descriptionRequired: dynamic; - +iconRequired: dynamic; - +organizationRequired: dynamic; - +reviewBoardRequired: dynamic; - +reviewBoardNumberRequired: dynamic; - +researchersRequired: dynamic; - +emailRequired: dynamic; - +phoneRequired: dynamic; - +emailFormat: dynamic; - +websiteFormat: dynamic + +isPrimary: bool; + +section: ReportSection; + +id: String | - +void setControlsFrom(); - +StudyInfoFormData buildFormData() + <static>+dynamic fromDomainModel(); + +ReportItemFormData copy() ] - [StudyInfoFormViewModel]o-[Study] - [StudyInfoFormViewModel]o-[FormControl] - [StudyInfoFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[StudyInfoFormViewModel] + [ReportItemFormData]o-[<abstract>ReportSection] + [<abstract>IFormData]<:-[ReportItemFormData] - [MeasurementSurveyFormData + [DataReferenceEditor | - +measurementId: String; - +title: String; - +introText: String?; - +outroText: String?; - +questionnaireFormData: QuestionnaireFormData; - <static>+kDefaultTitle: String; - +id: String + +formControl: FormControl<DataReferenceIdentifier<T>>; + +availableTasks: List<Task>; + +buildReactiveDropdownField: ReactiveDropdownField<dynamic> | - +QuestionnaireTask toQuestionnaireTask(); - +MeasurementSurveyFormData copy() + +FormTableRow buildFormTableRow(); + -List<DropdownMenuItem<DataReferenceIdentifier<dynamic>>> _dataReferenceItems() ] - [MeasurementSurveyFormData]o-[QuestionnaireFormData] - [<abstract>IFormDataWithSchedule]<:-[MeasurementSurveyFormData] + [DataReferenceEditor]o-[FormControl] + [DataReferenceEditor]o-[ReactiveDropdownField] - [MeasurementSurveyFormView + [TemporalAggregationFormatted | - +formViewModel: MeasurementSurveyFormViewModel + -_value: TemporalAggregation; + <static>+values: List<TemporalAggregationFormatted>; + +value: TemporalAggregation; + +string: String; + +icon: IconData?; + +hashCode: int + | + +bool ==(); + +String toString(); + +String toJson(); + <static>+TemporalAggregationFormatted fromJson() ] - [MeasurementSurveyFormView]o-[MeasurementSurveyFormViewModel] + [TemporalAggregationFormatted]o-[TemporalAggregation] + [TemporalAggregationFormatted]o-[IconData] - [MeasurementSurveyFormViewModel + [ImprovementDirectionFormatted | - +study: Study; - +measurementIdControl: FormControl<String>; - +instanceIdControl: FormControl<String>; - +surveyTitleControl: FormControl<String>; - +surveyIntroTextControl: FormControl<String>; - +surveyOutroTextControl: FormControl<String>; - +form: FormGroup; - +measurementId: String; - +instanceId: String; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titleRequired: dynamic; - +atLeastOneQuestion: dynamic; - +breadcrumbsTitle: String; - +titles: Map<FormMode, String> + -_value: ImprovementDirection; + <static>+values: List<ImprovementDirectionFormatted>; + +value: ImprovementDirection; + +string: String; + +icon: IconData?; + +hashCode: int | - +void setControlsFrom(); - +MeasurementSurveyFormData buildFormData(); - +List<ModelAction<dynamic>> availableActions(); - +List<ModelAction<dynamic>> availablePopupActions(); - +List<ModelAction<dynamic>> availableInlineActions(); - +void onSelectItem(); - +void onNewItem(); - +SurveyQuestionFormRouteArgs buildNewFormRouteArgs(); - +SurveyQuestionFormRouteArgs buildFormRouteArgs(); - +MeasurementSurveyFormViewModel createDuplicate() + +bool ==(); + +String toString(); + +String toJson(); + <static>+ImprovementDirectionFormatted fromJson() ] - [MeasurementSurveyFormViewModel]o-[Study] - [MeasurementSurveyFormViewModel]o-[FormControl] - [MeasurementSurveyFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[MeasurementSurveyFormViewModel] - [<abstract>WithQuestionnaireControls]<:-[MeasurementSurveyFormViewModel] - [<abstract>WithScheduleControls]<:-[MeasurementSurveyFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[MeasurementSurveyFormViewModel] - [<abstract>IListActionProvider]<:--[MeasurementSurveyFormViewModel] - [<abstract>IProviderArgsResolver]<:--[MeasurementSurveyFormViewModel] + [ImprovementDirectionFormatted]o-[ImprovementDirection] + [ImprovementDirectionFormatted]o-[IconData] - [SurveyPreview + [ReportSectionType | - +routeArgs: MeasurementFormRouteArgs + +index: int; + <static>+values: List<ReportSectionType>; + <static>+average: ReportSectionType; + <static>+linearRegression: ReportSectionType + ] + + [ReportSectionType]o-[ReportSectionType] + [Enum]<:--[ReportSectionType] + + [AverageSectionFormView + | + +formViewModel: ReportItemFormViewModel; + +studyId: String; + +reportSectionColumnWidth: Map<int, TableColumnWidth> | +Widget build() ] - [SurveyPreview]o-[MeasurementFormRouteArgs] - [<abstract>ConsumerWidget]<:-[SurveyPreview] + [AverageSectionFormView]o-[ReportItemFormViewModel] + [<abstract>ConsumerWidget]<:-[AverageSectionFormView] - [StudyDesignMeasurementsFormView + [DataReferenceIdentifier | - +Widget build() + +hashCode: int + | + +bool ==() ] - [<abstract>StudyDesignPageWidget]<:-[StudyDesignMeasurementsFormView] + [DataReference]<:-[DataReferenceIdentifier] - [MeasurementsFormData + [LinearRegressionSectionFormView | - +surveyMeasurements: List<MeasurementSurveyFormData>; - +id: String + +formViewModel: ReportItemFormViewModel; + +studyId: String; + +reportSectionColumnWidth: Map<int, TableColumnWidth> | - +Study apply(); - +MeasurementsFormData copy() + +Widget build() ] - [<abstract>IStudyFormData]<:--[MeasurementsFormData] + [LinearRegressionSectionFormView]o-[ReportItemFormViewModel] + [<abstract>ConsumerWidget]<:-[LinearRegressionSectionFormView] - [MeasurementsFormViewModel + [ReportItemFormViewModel | - +study: Study; - +router: GoRouter; - +measurementsArray: FormArray<dynamic>; - +surveyMeasurementFormViewModels: FormViewModelCollection<MeasurementSurveyFormViewModel, MeasurementSurveyFormData>; + <static>+defaultSectionType: ReportSectionType; + +sectionIdControl: FormControl<String>; + +sectionTypeControl: FormControl<ReportSectionType>; + +titleControl: FormControl<String>; + +descriptionControl: FormControl<String>; + +sectionControl: FormControl<ReportSection>; + +dataReferenceControl: FormControl<DataReferenceIdentifier<num>>; + +temporalAggregationControl: FormControl<TemporalAggregationFormatted>; + +improvementDirectionControl: FormControl<ImprovementDirectionFormatted>; + +alphaControl: FormControl<double>; + -_controlsBySectionType: Map<ReportSectionType, FormGroup>; + -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + -_validationConfigsBySectionType: Map<ReportSectionType, Map<FormValidationSetEnum, List<FormControlValidation>>>; + +sectionBaseControls: Map<String, AbstractControl<dynamic>>; +form: FormGroup; - +measurementViewModels: List<MeasurementSurveyFormViewModel>; + +sectionId: String; + +sectionType: ReportSectionType; + <static>+sectionTypeControlOptions: List<FormControlOption<ReportSectionType>>; + <static>+temporalAggregationControlOptions: List<FormControlOption<TemporalAggregationFormatted>>; + <static>+improvementDirectionControlOptions: List<FormControlOption<ImprovementDirectionFormatted>>; + +titles: Map<FormMode, String>; +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +measurementRequired: dynamic; - +titles: Map<FormMode, String> + +titleRequired: dynamic; + +descriptionRequired: dynamic; + +dataReferenceRequired: dynamic; + +aggregationRequired: dynamic; + +improvementDirectionRequired: dynamic; + +alphaConfidenceRequired: dynamic | - +void read(); - +void setControlsFrom(); - +MeasurementsFormData buildFormData(); - +List<ModelAction<dynamic>> availableActions(); - +List<ModelAction<dynamic>> availablePopupActions(); - +List<ModelAction<dynamic>> availableInlineActions(); - +void onSelectItem(); - +void onNewItem(); - +MeasurementSurveyFormViewModel provide(); - +void onCancel(); - +dynamic onSave() + -List<FormControlValidation> _getValidationConfig(); + +ReportItemFormData buildFormData(); + +ReportItemFormViewModel createDuplicate(); + +dynamic onSectionTypeChanged(); + -void _updateFormControls(); + +void setControlsFrom() ] - [MeasurementsFormViewModel]o-[Study] - [MeasurementsFormViewModel]o-[GoRouter] - [MeasurementsFormViewModel]o-[FormArray] - [MeasurementsFormViewModel]o-[FormViewModelCollection] - [MeasurementsFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[MeasurementsFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[MeasurementsFormViewModel] - [<abstract>IListActionProvider]<:--[MeasurementsFormViewModel] - [<abstract>IProviderArgsResolver]<:--[MeasurementsFormViewModel] + [ReportItemFormViewModel]o-[ReportSectionType] + [ReportItemFormViewModel]o-[FormControl] + [ReportItemFormViewModel]o-[FormGroup] + [<abstract>ManagedFormViewModel]<:-[ReportItemFormViewModel] - [StudyFormValidationSet + [ReportItemFormView | - +index: int; - <static>+values: List<StudyFormValidationSet> + +formViewModel: ReportItemFormViewModel; + +studyId: String; + +reportSectionColumnWidth: dynamic; + +sectionTypeBodyBuilder: Widget Function(BuildContext) + | + +Widget build(); + -dynamic _buildSectionText(); + -dynamic _buildSectionTypeHeader() ] - [Enum]<:--[StudyFormValidationSet] + [ReportItemFormView]o-[ReportItemFormViewModel] + [ReportItemFormView]o-[Widget Function(BuildContext)] [ReportsFormViewModel | @@ -689,213 +462,259 @@ [<abstract>IListActionProvider]<:--[ReportFormItemDelegate] [<abstract>IProviderArgsResolver]<:--[ReportFormItemDelegate] - [ReportItemFormData + [ReportBadge | - +isPrimary: bool; - +section: ReportSection; + +status: ReportStatus?; + +type: BadgeType; + +showPrefixIcon: bool; + +showTooltip: bool + | + +Widget build() + ] + + [ReportBadge]o-[ReportStatus] + [ReportBadge]o-[BadgeType] + + [ReportsFormData + | + +reportItems: List<ReportItemFormData>; +id: String | - <static>+dynamic fromDomainModel(); - +ReportItemFormData copy() + +Study apply(); + +ReportsFormData copy() ] - [ReportItemFormData]o-[<abstract>ReportSection] - [<abstract>IFormData]<:-[ReportItemFormData] + [<abstract>IStudyFormData]<:--[ReportsFormData] - [ReportItemFormView + [ReportStatus | - +formViewModel: ReportItemFormViewModel; - +studyId: String; - +reportSectionColumnWidth: dynamic; - +sectionTypeBodyBuilder: Widget Function(BuildContext) + +index: int; + <static>+values: List<ReportStatus>; + <static>+primary: ReportStatus; + <static>+secondary: ReportStatus + ] + + [ReportStatus]o-[ReportStatus] + [Enum]<:--[ReportStatus] + + [<abstract>IStudyFormData | - +Widget build(); - -dynamic _buildSectionText(); - -dynamic _buildSectionTypeHeader() + +Study apply() ] - [ReportItemFormView]o-[ReportItemFormViewModel] - [ReportItemFormView]o-[Widget Function(BuildContext)] + [<abstract>IFormData]<:--[<abstract>IStudyFormData] - [ReportItemFormViewModel + [StudyInfoFormViewModel | - <static>+defaultSectionType: ReportSectionType; - +sectionIdControl: FormControl<String>; - +sectionTypeControl: FormControl<ReportSectionType>; + +study: Study; +titleControl: FormControl<String>; + +iconControl: FormControl<IconOption>; +descriptionControl: FormControl<String>; - +sectionControl: FormControl<ReportSection>; - +dataReferenceControl: FormControl<DataReferenceIdentifier<num>>; - +temporalAggregationControl: FormControl<TemporalAggregationFormatted>; - +improvementDirectionControl: FormControl<ImprovementDirectionFormatted>; - +alphaControl: FormControl<double>; - -_controlsBySectionType: Map<ReportSectionType, FormGroup>; - -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - -_validationConfigsBySectionType: Map<ReportSectionType, Map<FormValidationSetEnum, List<FormControlValidation>>>; - +sectionBaseControls: Map<String, AbstractControl<dynamic>>; + +organizationControl: FormControl<String>; + +reviewBoardControl: FormControl<String>; + +reviewBoardNumberControl: FormControl<String>; + +researchersControl: FormControl<String>; + +emailControl: FormControl<String>; + +websiteControl: FormControl<String>; + +phoneControl: FormControl<String>; + +additionalInfoControl: FormControl<String>; +form: FormGroup; - +sectionId: String; - +sectionType: ReportSectionType; - <static>+sectionTypeControlOptions: List<FormControlOption<ReportSectionType>>; - <static>+temporalAggregationControlOptions: List<FormControlOption<TemporalAggregationFormatted>>; - <static>+improvementDirectionControlOptions: List<FormControlOption<ImprovementDirectionFormatted>>; +titles: Map<FormMode, String>; +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; +titleRequired: dynamic; +descriptionRequired: dynamic; - +dataReferenceRequired: dynamic; - +aggregationRequired: dynamic; - +improvementDirectionRequired: dynamic; - +alphaConfidenceRequired: dynamic + +iconRequired: dynamic; + +organizationRequired: dynamic; + +reviewBoardRequired: dynamic; + +reviewBoardNumberRequired: dynamic; + +researchersRequired: dynamic; + +emailRequired: dynamic; + +phoneRequired: dynamic; + +emailFormat: dynamic; + +websiteFormat: dynamic | - -List<FormControlValidation> _getValidationConfig(); - +ReportItemFormData buildFormData(); - +ReportItemFormViewModel createDuplicate(); - +dynamic onSectionTypeChanged(); - -void _updateFormControls(); - +void setControlsFrom() + +void setControlsFrom(); + +StudyInfoFormData buildFormData() ] - [ReportItemFormViewModel]o-[ReportSectionType] - [ReportItemFormViewModel]o-[FormControl] - [ReportItemFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[ReportItemFormViewModel] + [StudyInfoFormViewModel]o-[Study] + [StudyInfoFormViewModel]o-[FormControl] + [StudyInfoFormViewModel]o-[FormGroup] + [<abstract>FormViewModel]<:-[StudyInfoFormViewModel] - [TemporalAggregationFormatted - | - -_value: TemporalAggregation; - <static>+values: List<TemporalAggregationFormatted>; - +value: TemporalAggregation; - +string: String; - +icon: IconData?; - +hashCode: int + [StudyDesignInfoFormView | - +bool ==(); - +String toString(); - +String toJson(); - <static>+TemporalAggregationFormatted fromJson() + +Widget build() ] - [TemporalAggregationFormatted]o-[TemporalAggregation] - [TemporalAggregationFormatted]o-[IconData] + [<abstract>StudyDesignPageWidget]<:-[StudyDesignInfoFormView] - [ImprovementDirectionFormatted + [StudyInfoFormData | - -_value: ImprovementDirection; - <static>+values: List<ImprovementDirectionFormatted>; - +value: ImprovementDirection; - +string: String; - +icon: IconData?; - +hashCode: int + +title: String; + +description: String?; + +iconName: String; + +contactInfoFormData: StudyContactInfoFormData; + +id: String | - +bool ==(); - +String toString(); - +String toJson(); - <static>+ImprovementDirectionFormatted fromJson() + +Study apply(); + +StudyInfoFormData copy() ] - [ImprovementDirectionFormatted]o-[ImprovementDirection] - [ImprovementDirectionFormatted]o-[IconData] + [StudyInfoFormData]o-[StudyContactInfoFormData] + [<abstract>IStudyFormData]<:--[StudyInfoFormData] - [ReportSectionType + [StudyContactInfoFormData | - +index: int; - <static>+values: List<ReportSectionType>; - <static>+average: ReportSectionType; - <static>+linearRegression: ReportSectionType + +organization: String?; + +institutionalReviewBoard: String?; + +institutionalReviewBoardNumber: String?; + +researchers: String?; + +email: String?; + +website: String?; + +phone: String?; + +additionalInfo: String?; + +id: String + | + +Study apply(); + +StudyInfoFormData copy() ] - [ReportSectionType]o-[ReportSectionType] - [Enum]<:--[ReportSectionType] + [<abstract>IStudyFormData]<:--[StudyContactInfoFormData] - [AverageSectionFormView - | - +formViewModel: ReportItemFormViewModel; - +studyId: String; - +reportSectionColumnWidth: Map<int, TableColumnWidth> + [StudyFormValidationSet | - +Widget build() + +index: int; + <static>+values: List<StudyFormValidationSet> ] - [AverageSectionFormView]o-[ReportItemFormViewModel] - [<abstract>ConsumerWidget]<:-[AverageSectionFormView] + [Enum]<:--[StudyFormValidationSet] - [LinearRegressionSectionFormView + [MeasurementsFormData | - +formViewModel: ReportItemFormViewModel; - +studyId: String; - +reportSectionColumnWidth: Map<int, TableColumnWidth> + +surveyMeasurements: List<MeasurementSurveyFormData>; + +id: String | - +Widget build() + +Study apply(); + +MeasurementsFormData copy() ] - [LinearRegressionSectionFormView]o-[ReportItemFormViewModel] - [<abstract>ConsumerWidget]<:-[LinearRegressionSectionFormView] + [<abstract>IStudyFormData]<:--[MeasurementsFormData] - [DataReferenceIdentifier - | - +hashCode: int + [MeasurementSurveyFormView | - +bool ==() + +formViewModel: MeasurementSurveyFormViewModel ] - [DataReference]<:-[DataReferenceIdentifier] + [MeasurementSurveyFormView]o-[MeasurementSurveyFormViewModel] - [DataReferenceEditor + [SurveyPreview | - +formControl: FormControl<DataReferenceIdentifier<T>>; - +availableTasks: List<Task>; - +buildReactiveDropdownField: ReactiveDropdownField<dynamic> + +routeArgs: MeasurementFormRouteArgs | - +FormTableRow buildFormTableRow(); - -List<DropdownMenuItem<DataReferenceIdentifier<dynamic>>> _dataReferenceItems() + +Widget build() ] - [DataReferenceEditor]o-[FormControl] - [DataReferenceEditor]o-[ReactiveDropdownField] + [SurveyPreview]o-[MeasurementFormRouteArgs] + [<abstract>ConsumerWidget]<:-[SurveyPreview] - [ReportsFormData + [MeasurementSurveyFormData | - +reportItems: List<ReportItemFormData>; + +measurementId: String; + +title: String; + +introText: String?; + +outroText: String?; + +questionnaireFormData: QuestionnaireFormData; + <static>+kDefaultTitle: String; +id: String | - +Study apply(); - +ReportsFormData copy() + +QuestionnaireTask toQuestionnaireTask(); + +MeasurementSurveyFormData copy() ] - [<abstract>IStudyFormData]<:--[ReportsFormData] + [MeasurementSurveyFormData]o-[QuestionnaireFormData] + [<abstract>IFormDataWithSchedule]<:-[MeasurementSurveyFormData] - [ReportStatus + [MeasurementSurveyFormViewModel | - +index: int; - <static>+values: List<ReportStatus>; - <static>+primary: ReportStatus; - <static>+secondary: ReportStatus + +study: Study; + +measurementIdControl: FormControl<String>; + +instanceIdControl: FormControl<String>; + +surveyTitleControl: FormControl<String>; + +surveyIntroTextControl: FormControl<String>; + +surveyOutroTextControl: FormControl<String>; + +form: FormGroup; + +measurementId: String; + +instanceId: String; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +titleRequired: dynamic; + +atLeastOneQuestion: dynamic; + +breadcrumbsTitle: String; + +titles: Map<FormMode, String> + | + +void setControlsFrom(); + +MeasurementSurveyFormData buildFormData(); + +List<ModelAction<dynamic>> availableActions(); + +List<ModelAction<dynamic>> availablePopupActions(); + +List<ModelAction<dynamic>> availableInlineActions(); + +void onSelectItem(); + +void onNewItem(); + +SurveyQuestionFormRouteArgs buildNewFormRouteArgs(); + +SurveyQuestionFormRouteArgs buildFormRouteArgs(); + +MeasurementSurveyFormViewModel createDuplicate() ] - [ReportStatus]o-[ReportStatus] - [Enum]<:--[ReportStatus] + [MeasurementSurveyFormViewModel]o-[Study] + [MeasurementSurveyFormViewModel]o-[FormControl] + [MeasurementSurveyFormViewModel]o-[FormGroup] + [<abstract>ManagedFormViewModel]<:-[MeasurementSurveyFormViewModel] + [<abstract>WithQuestionnaireControls]<:-[MeasurementSurveyFormViewModel] + [<abstract>WithScheduleControls]<:-[MeasurementSurveyFormViewModel] + [<abstract>IFormViewModelDelegate]<:--[MeasurementSurveyFormViewModel] + [<abstract>IListActionProvider]<:--[MeasurementSurveyFormViewModel] + [<abstract>IProviderArgsResolver]<:--[MeasurementSurveyFormViewModel] - [ReportBadge - | - +status: ReportStatus?; - +type: BadgeType; - +showPrefixIcon: bool; - +showTooltip: bool + [StudyDesignMeasurementsFormView | +Widget build() ] - [ReportBadge]o-[ReportStatus] - [ReportBadge]o-[BadgeType] + [<abstract>StudyDesignPageWidget]<:-[StudyDesignMeasurementsFormView] - [StudyDesignReportsFormView + [MeasurementsFormViewModel | - +Widget build(); - -dynamic _showReportItemSidesheetWithArgs() + +study: Study; + +router: GoRouter; + +measurementsArray: FormArray<dynamic>; + +surveyMeasurementFormViewModels: FormViewModelCollection<MeasurementSurveyFormViewModel, MeasurementSurveyFormData>; + +form: FormGroup; + +measurementViewModels: List<MeasurementSurveyFormViewModel>; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +measurementRequired: dynamic; + +titles: Map<FormMode, String> + | + +void read(); + +void setControlsFrom(); + +MeasurementsFormData buildFormData(); + +List<ModelAction<dynamic>> availableActions(); + +List<ModelAction<dynamic>> availablePopupActions(); + +List<ModelAction<dynamic>> availableInlineActions(); + +void onSelectItem(); + +void onNewItem(); + +MeasurementSurveyFormViewModel provide(); + +void onCancel(); + +dynamic onSave() ] - [<abstract>StudyDesignPageWidget]<:-[StudyDesignReportsFormView] + [MeasurementsFormViewModel]o-[Study] + [MeasurementsFormViewModel]o-[GoRouter] + [MeasurementsFormViewModel]o-[FormArray] + [MeasurementsFormViewModel]o-[FormViewModelCollection] + [MeasurementsFormViewModel]o-[FormGroup] + [<abstract>FormViewModel]<:-[MeasurementsFormViewModel] + [<abstract>IFormViewModelDelegate]<:--[MeasurementsFormViewModel] + [<abstract>IListActionProvider]<:--[MeasurementsFormViewModel] + [<abstract>IProviderArgsResolver]<:--[MeasurementsFormViewModel] [StudyFormScaffold | @@ -910,111 +729,259 @@ [StudyFormScaffold]o-[Widget Function(T)] [<abstract>ConsumerWidget]<:-[StudyFormScaffold] - [SurveyQuestionFormView + [ConsentItemFormViewModel | - +formViewModel: QuestionFormViewModel; - +isHtmlStyleable: bool + +consentIdControl: FormControl<String>; + +titleControl: FormControl<String>; + +descriptionControl: FormControl<String>; + +iconControl: FormControl<IconOption>; + +form: FormGroup; + +consentId: String; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +titleRequired: dynamic; + +descriptionRequired: dynamic; + +titles: Map<FormMode, String> + | + +void setControlsFrom(); + +ConsentItemFormData buildFormData(); + +ConsentItemFormViewModel createDuplicate() ] - [SurveyQuestionFormView]o-[QuestionFormViewModel] + [ConsentItemFormViewModel]o-[FormControl] + [ConsentItemFormViewModel]o-[FormGroup] + [<abstract>ManagedFormViewModel]<:-[ConsentItemFormViewModel] - [QuestionFormViewModel + [StudyDesignEnrollmentFormView | - <static>+defaultQuestionType: SurveyQuestionType; - -_titles: Map<FormMode, String Function()>?; - +questionIdControl: FormControl<String>; - +questionTypeControl: FormControl<SurveyQuestionType>; - +questionTextControl: FormControl<String>; - +questionInfoTextControl: FormControl<String>; - +questionBaseControls: Map<String, AbstractControl<dynamic>>; - +isMultipleChoiceControl: FormControl<bool>; - +choiceResponseOptionsArray: FormArray<dynamic>; - +customOptionsMin: int; - +customOptionsMax: int; - +customOptionsInitial: int; - +boolResponseOptionsArray: FormArray<String>; - +imageResponseOptionsArray: FormArray<String>; - <static>+kDefaultMaxRecordingDurationSeconds: int; - <static>+kMaxRecordingDurationSeconds: int; - +audioResponseOptionsArray: FormArray<String>; - +maxRecordingDurationSecondsControl: FormControl<int>; - <static>+kDefaultScaleMinValue: int; - <static>+kDefaultScaleMaxValue: int; - <static>+kNumMidValueControls: int; - <static>+kMidValueDebounceMilliseconds: int; - +scaleMinValueControl: FormControl<int>; - +scaleMaxValueControl: FormControl<int>; - -_scaleRangeControl: FormControl<int>; - +scaleMinLabelControl: FormControl<String>; - +scaleMaxLabelControl: FormControl<String>; - +scaleMidValueControls: FormArray<int>; - +scaleMidLabelControls: FormArray<String?>; - -_scaleResponseOptionsArray: FormArray<int>; - +scaleMinColorControl: FormControl<SerializableColor>; - +scaleMaxColorControl: FormControl<SerializableColor>; - +prevMidValues: List<int?>?; - +freeTextTypeControl: FormControl<FreeTextQuestionType>; - +customRegexControl: FormControl<String>; - +freeTextResponseOptionsArray: FormArray<dynamic>; - +freeTextLengthMin: AbstractControl<int>; - +freeTextLengthMax: AbstractControl<int>; - +freeTextExampleTextControl: FormControl<String>; - <static>+kDefaultFreeTextMinLength: int; - <static>+kDefaultFreeTextMaxLength: int; - +freeTextLengthControl: FormControl<RangeValues>; - -_controlsByQuestionType: Map<SurveyQuestionType, FormGroup>; - -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - -_validationConfigsByQuestionType: Map<SurveyQuestionType, Map<FormValidationSetEnum, List<FormControlValidation>>>; + +Widget build(); + -dynamic _showScreenerQuestionSidesheetWithArgs(); + -dynamic _showConsentItemSidesheetWithArgs() + ] + + [<abstract>StudyDesignPageWidget]<:-[StudyDesignEnrollmentFormView] + + [<abstract>IScreenerQuestionLogicFormViewModel + | + +isDirtyOptionsBannerVisible: bool + ] + + [ScreenerQuestionLogicFormView + | + +formViewModel: ScreenerQuestionFormViewModel + | + +Widget build(); + -dynamic _buildInfoBanner(); + -dynamic _buildAnswerOptionsLogicControls(); + -List<Widget> _buildOptionLogicRow() + ] + + [ScreenerQuestionLogicFormView]o-[ScreenerQuestionFormViewModel] + [<abstract>FormConsumerWidget]<:-[ScreenerQuestionLogicFormView] + + [ConsentItemFormData + | + +consentId: String; + +title: String; + +description: String; + +iconName: String?; + +id: String + | + +ConsentItem toConsentItem(); + +ConsentItemFormData copy() + ] + + [<abstract>IFormData]<:-[ConsentItemFormData] + + [ConsentItemFormView + | + +formViewModel: ConsentItemFormViewModel + ] + + [ConsentItemFormView]o-[ConsentItemFormViewModel] + + [EnrollmentFormData + | + <static>+kDefaultEnrollmentType: Participation; + +enrollmentType: Participation; + +questionnaireFormData: QuestionnaireFormData; + +consentItemsFormData: List<ConsentItemFormData>?; + +id: String + | + +Study apply(); + +EnrollmentFormData copy() + ] + + [EnrollmentFormData]o-[Participation] + [EnrollmentFormData]o-[QuestionnaireFormData] + [<abstract>IStudyFormData]<:--[EnrollmentFormData] + + [ScreenerQuestionFormViewModel + | + <static>+defaultResponseOptionValidity: bool; + +responseOptionsDisabledArray: FormArray<dynamic>; + +responseOptionsLogicControls: FormArray<bool>; + +responseOptionsLogicDescriptionControls: FormArray<String>; + -_questionBaseControls: Map<String, AbstractControl<dynamic>>; + +prevResponseOptionControls: List<AbstractControl<dynamic>>; + +prevResponseOptionValues: List<dynamic>; + +responseOptionsDisabledControls: List<AbstractControl<dynamic>>; + +logicControlOptions: List<FormControlOption<bool>>; + +questionBaseControls: Map<String, AbstractControl<dynamic>>; + +isDirtyOptionsBannerVisible: bool + | + +dynamic onResponseOptionsChanged(); + +void setControlsFrom(); + +QuestionFormData buildFormData(); + -List<FormControl<dynamic>> _copyFormControls(); + -AbstractControl<dynamic>? _findAssociatedLogicControlFor(); + -AbstractControl<dynamic>? _findAssociatedControlFor(); + +ScreenerQuestionFormViewModel createDuplicate() + ] + + [ScreenerQuestionFormViewModel]o-[FormArray] + [QuestionFormViewModel]<:-[ScreenerQuestionFormViewModel] + [<abstract>IScreenerQuestionLogicFormViewModel]<:--[ScreenerQuestionFormViewModel] + + [EnrollmentFormViewModel + | + +study: Study; + +router: GoRouter; + +consentItemDelegate: EnrollmentFormConsentItemDelegate; + +enrollmentTypeControl: FormControl<Participation>; + +consentItemArray: FormArray<dynamic>; + +consentItemFormViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData>; +form: FormGroup; - +questionId: String; - +questionType: SurveyQuestionType; - +questionTypeControlOptions: List<FormControlOption<SurveyQuestionType>>; - +answerOptionsArray: FormArray<dynamic>; - +answerOptionsControls: List<AbstractControl<dynamic>>; - +validAnswerOptions: List<String>; - +boolOptions: List<AbstractControl<String>>; - +imageOptions: List<AbstractControl<String>>; - +audioOptions: List<AbstractControl<String>>; - +scaleMinValue: int; - +scaleMaxValue: int; - +scaleRange: int; - +scaleAllValueControls: List<AbstractControl<int>>; + +enrollmentTypeControlOptions: List<FormControlOption<Participation>>; + +consentItemModels: List<ConsentItemFormViewModel>; +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +questionTextRequired: dynamic; - +numValidChoiceOptions: dynamic; - +scaleRangeValid: dynamic; - +maxRecordingDurationValid: dynamic; +titles: Map<FormMode, String>; - +isAddOptionButtonVisible: bool; - +isMidValuesClearedInfoVisible: bool + +canTestScreener: bool; + +canTestConsent: bool; + +questionTitles: Map<FormMode, String Function()> | - +String? scaleMidLabelAt(); - -dynamic _onScaleRangeChanged(); - -dynamic _applyInputFormatters(); - -dynamic _updateScaleMidValueControls(); - -Map<String, dynamic>? _validateFreeText(); - -dynamic _onFreeTextLengthChanged(); - -List<FormControlValidation> _getValidationConfig(); - +dynamic onQuestionTypeChanged(); - +dynamic onResponseOptionsChanged(); - -void _updateFormControls(); - +void initControls(); +void setControlsFrom(); - +QuestionFormData buildFormData(); + +EnrollmentFormData buildFormData(); + +void read(); +List<ModelAction<dynamic>> availableActions(); - +void onNewItem(); + +List<ModelAction<dynamic>> availablePopupActions(); + +List<ModelAction<dynamic>> availableInlineActions(); +void onSelectItem(); - +dynamic save(); - +QuestionFormViewModel createDuplicate() + +void onNewItem(); + +ScreenerQuestionFormRouteArgs buildNewScreenerQuestionFormRouteArgs(); + +ScreenerQuestionFormRouteArgs buildScreenerQuestionFormRouteArgs(); + +ConsentItemFormRouteArgs buildNewConsentItemFormRouteArgs(); + +ConsentItemFormRouteArgs buildConsentItemFormRouteArgs(); + +dynamic testScreener(); + +dynamic testConsent(); + +ScreenerQuestionFormViewModel provideQuestionFormViewModel() ] - [QuestionFormViewModel]o-[SurveyQuestionType] - [QuestionFormViewModel]o-[FormControl] - [QuestionFormViewModel]o-[FormArray] - [QuestionFormViewModel]o-[<abstract>AbstractControl] - [QuestionFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[QuestionFormViewModel] - [<abstract>IListActionProvider]<:--[QuestionFormViewModel] + [EnrollmentFormViewModel]o-[Study] + [EnrollmentFormViewModel]o-[GoRouter] + [EnrollmentFormViewModel]o-[EnrollmentFormConsentItemDelegate] + [EnrollmentFormViewModel]o-[FormControl] + [EnrollmentFormViewModel]o-[FormArray] + [EnrollmentFormViewModel]o-[FormViewModelCollection] + [EnrollmentFormViewModel]o-[FormGroup] + [<abstract>FormViewModel]<:-[EnrollmentFormViewModel] + [<abstract>WithQuestionnaireControls]<:-[EnrollmentFormViewModel] + [<abstract>IFormViewModelDelegate]<:--[EnrollmentFormViewModel] + [<abstract>IListActionProvider]<:--[EnrollmentFormViewModel] + [<abstract>IProviderArgsResolver]<:--[EnrollmentFormViewModel] + + [EnrollmentFormConsentItemDelegate + | + +formViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData>; + +owner: EnrollmentFormViewModel; + +propagateOnSave: bool; + +validationSet: dynamic + | + +void onCancel(); + +dynamic onSave(); + +ConsentItemFormViewModel provide(); + +List<ModelAction<dynamic>> availableActions(); + +void onNewItem(); + +void onSelectItem() + ] + + [EnrollmentFormConsentItemDelegate]o-[FormViewModelCollection] + [EnrollmentFormConsentItemDelegate]o-[EnrollmentFormViewModel] + [<abstract>IFormViewModelDelegate]<:--[EnrollmentFormConsentItemDelegate] + [<abstract>IListActionProvider]<:--[EnrollmentFormConsentItemDelegate] + [<abstract>IProviderArgsResolver]<:--[EnrollmentFormConsentItemDelegate] + + [StudyFormViewModel + | + +studyDirtyCopy: Study?; + +studyRepository: IStudyRepository; + +authRepository: IAuthRepository; + +router: GoRouter; + +studyInfoFormViewModel: StudyInfoFormViewModel; + +enrollmentFormViewModel: EnrollmentFormViewModel; + +measurementsFormViewModel: MeasurementsFormViewModel; + +reportsFormViewModel: ReportsFormViewModel; + +interventionsFormViewModel: InterventionsFormViewModel; + +form: FormGroup; + +isStudyReadonly: bool; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +titles: Map<FormMode, String> + | + +void read(); + +void setControlsFrom(); + +Study buildFormData(); + +void dispose(); + +void onCancel(); + +dynamic onSave(); + -dynamic _applyAndSaveSubform() + ] + + [StudyFormViewModel]o-[Study] + [StudyFormViewModel]o-[<abstract>IStudyRepository] + [StudyFormViewModel]o-[<abstract>IAuthRepository] + [StudyFormViewModel]o-[GoRouter] + [StudyFormViewModel]o-[StudyInfoFormViewModel] + [StudyFormViewModel]o-[EnrollmentFormViewModel] + [StudyFormViewModel]o-[MeasurementsFormViewModel] + [StudyFormViewModel]o-[ReportsFormViewModel] + [StudyFormViewModel]o-[InterventionsFormViewModel] + [StudyFormViewModel]o-[FormGroup] + [<abstract>FormViewModel]<:-[StudyFormViewModel] + [<abstract>IFormViewModelDelegate]<:--[StudyFormViewModel] + + [<abstract>WithQuestionnaireControls + | + +questionsArray: FormArray<dynamic>; + +questionFormViewModels: FormViewModelCollection<Q, QuestionFormData>; + +questionnaireControls: Map<String, FormArray<dynamic>>; + +propagateOnSave: bool; + +questionModels: List<Q>; + +questionTitles: Map<FormMode, String Function()> + | + +void setQuestionnaireControlsFrom(); + +QuestionnaireFormData buildQuestionnaireFormData(); + +void read(); + +void onCancel(); + +dynamic onSave(); + +Q provide(); + +Q provideQuestionFormViewModel() + ] + + [<abstract>WithQuestionnaireControls]o-[FormArray] + [<abstract>WithQuestionnaireControls]o-[FormViewModelCollection] + [<abstract>IFormViewModelDelegate]<:--[<abstract>WithQuestionnaireControls] + [<abstract>IProviderArgsResolver]<:--[<abstract>WithQuestionnaireControls] + + [QuestionnaireFormData + | + +questionsData: List<QuestionFormData>?; + +id: String + | + +StudyUQuestionnaire toQuestionnaire(); + +List<EligibilityCriterion> toEligibilityCriteria(); + +QuestionnaireFormData copy() + ] + + [<abstract>IFormData]<:--[QuestionnaireFormData] [<abstract>QuestionFormData | @@ -1126,17 +1093,15 @@ [FreeTextQuestionFormData]o-[FreeTextQuestionType] [<abstract>QuestionFormData]<:-[FreeTextQuestionFormData] - [<abstract>IScaleQuestionFormViewModel - | - +isMidValuesClearedInfoVisible: bool - ] - - [ScaleQuestionFormView + [AudioRecordingQuestionFormView | +formViewModel: QuestionFormViewModel + | + +Widget build() ] - [ScaleQuestionFormView]o-[QuestionFormViewModel] + [AudioRecordingQuestionFormView]o-[QuestionFormViewModel] + [<abstract>ConsumerWidget]<:-[AudioRecordingQuestionFormView] [FreeTextQuestionFormView | @@ -1151,16 +1116,6 @@ [FreeTextQuestionFormView]o-[QuestionFormViewModel] [<abstract>ConsumerWidget]<:-[FreeTextQuestionFormView] - [BoolQuestionFormView - | - +formViewModel: QuestionFormViewModel - | - +Widget build() - ] - - [BoolQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[BoolQuestionFormView] - [SurveyQuestionType | +index: int; @@ -1176,81 +1131,153 @@ [SurveyQuestionType]o-[SurveyQuestionType] [Enum]<:--[SurveyQuestionType] - [AudioRecordingQuestionFormView + [ImageCapturingQuestionFormView | +formViewModel: QuestionFormViewModel | +Widget build() ] - [AudioRecordingQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[AudioRecordingQuestionFormView] + [ImageCapturingQuestionFormView]o-[QuestionFormViewModel] + [<abstract>ConsumerWidget]<:-[ImageCapturingQuestionFormView] - [ChoiceQuestionFormView + [<abstract>IScaleQuestionFormViewModel | - +formViewModel: QuestionFormViewModel + +isMidValuesClearedInfoVisible: bool + ] + + [ScaleQuestionFormView | - +Widget build() + +formViewModel: QuestionFormViewModel ] - [ChoiceQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[ChoiceQuestionFormView] + [ScaleQuestionFormView]o-[QuestionFormViewModel] - [ImageCapturingQuestionFormView + [ChoiceQuestionFormView | +formViewModel: QuestionFormViewModel | +Widget build() ] - [ImageCapturingQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[ImageCapturingQuestionFormView] + [ChoiceQuestionFormView]o-[QuestionFormViewModel] + [<abstract>ConsumerWidget]<:-[ChoiceQuestionFormView] - [<abstract>WithQuestionnaireControls + [BoolQuestionFormView | - +questionsArray: FormArray<dynamic>; - +questionFormViewModels: FormViewModelCollection<Q, QuestionFormData>; - +questionnaireControls: Map<String, FormArray<dynamic>>; - +propagateOnSave: bool; - +questionModels: List<Q>; - +questionTitles: Map<FormMode, String Function()> + +formViewModel: QuestionFormViewModel | - +void setQuestionnaireControlsFrom(); - +QuestionnaireFormData buildQuestionnaireFormData(); - +void read(); - +void onCancel(); - +dynamic onSave(); - +Q provide(); - +Q provideQuestionFormViewModel() + +Widget build() ] - [<abstract>WithQuestionnaireControls]o-[FormArray] - [<abstract>WithQuestionnaireControls]o-[FormViewModelCollection] - [<abstract>IFormViewModelDelegate]<:--[<abstract>WithQuestionnaireControls] - [<abstract>IProviderArgsResolver]<:--[<abstract>WithQuestionnaireControls] + [BoolQuestionFormView]o-[QuestionFormViewModel] + [<abstract>ConsumerWidget]<:-[BoolQuestionFormView] - [QuestionnaireFormData + [QuestionFormViewModel | - +questionsData: List<QuestionFormData>?; - +id: String + <static>+defaultQuestionType: SurveyQuestionType; + -_titles: Map<FormMode, String Function()>?; + +questionIdControl: FormControl<String>; + +questionTypeControl: FormControl<SurveyQuestionType>; + +questionTextControl: FormControl<String>; + +questionInfoTextControl: FormControl<String>; + +questionBaseControls: Map<String, AbstractControl<dynamic>>; + +isMultipleChoiceControl: FormControl<bool>; + +choiceResponseOptionsArray: FormArray<dynamic>; + +customOptionsMin: int; + +customOptionsMax: int; + +customOptionsInitial: int; + +boolResponseOptionsArray: FormArray<String>; + +imageResponseOptionsArray: FormArray<String>; + <static>+kDefaultMaxRecordingDurationSeconds: int; + <static>+kMaxRecordingDurationSeconds: int; + +audioResponseOptionsArray: FormArray<String>; + +maxRecordingDurationSecondsControl: FormControl<int>; + <static>+kDefaultScaleMinValue: int; + <static>+kDefaultScaleMaxValue: int; + <static>+kNumMidValueControls: int; + <static>+kMidValueDebounceMilliseconds: int; + +scaleMinValueControl: FormControl<int>; + +scaleMaxValueControl: FormControl<int>; + -_scaleRangeControl: FormControl<int>; + +scaleMinLabelControl: FormControl<String>; + +scaleMaxLabelControl: FormControl<String>; + +scaleMidValueControls: FormArray<int>; + +scaleMidLabelControls: FormArray<String?>; + -_scaleResponseOptionsArray: FormArray<int>; + +scaleMinColorControl: FormControl<SerializableColor>; + +scaleMaxColorControl: FormControl<SerializableColor>; + +prevMidValues: List<int?>?; + +freeTextTypeControl: FormControl<FreeTextQuestionType>; + +customRegexControl: FormControl<String>; + +freeTextResponseOptionsArray: FormArray<dynamic>; + +freeTextLengthMin: AbstractControl<int>; + +freeTextLengthMax: AbstractControl<int>; + +freeTextExampleTextControl: FormControl<String>; + <static>+kDefaultFreeTextMinLength: int; + <static>+kDefaultFreeTextMaxLength: int; + +freeTextLengthControl: FormControl<RangeValues>; + -_controlsByQuestionType: Map<SurveyQuestionType, FormGroup>; + -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + -_validationConfigsByQuestionType: Map<SurveyQuestionType, Map<FormValidationSetEnum, List<FormControlValidation>>>; + +form: FormGroup; + +questionId: String; + +questionType: SurveyQuestionType; + +questionTypeControlOptions: List<FormControlOption<SurveyQuestionType>>; + +answerOptionsArray: FormArray<dynamic>; + +answerOptionsControls: List<AbstractControl<dynamic>>; + +validAnswerOptions: List<String>; + +boolOptions: List<AbstractControl<String>>; + +imageOptions: List<AbstractControl<String>>; + +audioOptions: List<AbstractControl<String>>; + +scaleMinValue: int; + +scaleMaxValue: int; + +scaleRange: int; + +scaleAllValueControls: List<AbstractControl<int>>; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +questionTextRequired: dynamic; + +numValidChoiceOptions: dynamic; + +scaleRangeValid: dynamic; + +maxRecordingDurationValid: dynamic; + +titles: Map<FormMode, String>; + +isAddOptionButtonVisible: bool; + +isMidValuesClearedInfoVisible: bool | - +StudyUQuestionnaire toQuestionnaire(); - +List<EligibilityCriterion> toEligibilityCriteria(); - +QuestionnaireFormData copy() + +String? scaleMidLabelAt(); + -dynamic _onScaleRangeChanged(); + -dynamic _applyInputFormatters(); + -dynamic _updateScaleMidValueControls(); + -Map<String, dynamic>? _validateFreeText(); + -dynamic _onFreeTextLengthChanged(); + -List<FormControlValidation> _getValidationConfig(); + +dynamic onQuestionTypeChanged(); + +dynamic onResponseOptionsChanged(); + -void _updateFormControls(); + +void initControls(); + +void setControlsFrom(); + +QuestionFormData buildFormData(); + +List<ModelAction<dynamic>> availableActions(); + +void onNewItem(); + +void onSelectItem(); + +dynamic save(); + +QuestionFormViewModel createDuplicate() ] - [<abstract>IFormData]<:--[QuestionnaireFormData] + [QuestionFormViewModel]o-[SurveyQuestionType] + [QuestionFormViewModel]o-[FormControl] + [QuestionFormViewModel]o-[FormArray] + [QuestionFormViewModel]o-[<abstract>AbstractControl] + [QuestionFormViewModel]o-[FormGroup] + [<abstract>ManagedFormViewModel]<:-[QuestionFormViewModel] + [<abstract>IListActionProvider]<:--[QuestionFormViewModel] - [ScheduleControls - | - +formViewModel: WithScheduleControls + [SurveyQuestionFormView | - +Widget build(); - -List<FormTableRow> _conditionalTimeRestrictions() + +formViewModel: QuestionFormViewModel; + +isHtmlStyleable: bool ] - [ScheduleControls]o-[<abstract>WithScheduleControls] - [<abstract>FormConsumerWidget]<:-[ScheduleControls] + [SurveyQuestionFormView]o-[QuestionFormViewModel] [<abstract>IFormDataWithSchedule | @@ -1267,6 +1294,17 @@ [<abstract>IFormDataWithSchedule]o-[StudyUTimeOfDay] [<abstract>IFormData]<:--[<abstract>IFormDataWithSchedule] + [ScheduleControls + | + +formViewModel: WithScheduleControls + | + +Widget build(); + -List<FormTableRow> _conditionalTimeRestrictions() + ] + + [ScheduleControls]o-[<abstract>WithScheduleControls] + [<abstract>FormConsumerWidget]<:-[ScheduleControls] + [<abstract>WithScheduleControls | +isTimeRestrictedControl: FormControl<bool>; @@ -1291,44 +1329,6 @@ [<abstract>WithScheduleControls]o-[FormControl] [<abstract>WithScheduleControls]o-[StreamSubscription] - [StudyFormViewModel - | - +studyDirtyCopy: Study?; - +studyRepository: IStudyRepository; - +authRepository: IAuthRepository; - +router: GoRouter; - +studyInfoFormViewModel: StudyInfoFormViewModel; - +enrollmentFormViewModel: EnrollmentFormViewModel; - +measurementsFormViewModel: MeasurementsFormViewModel; - +reportsFormViewModel: ReportsFormViewModel; - +interventionsFormViewModel: InterventionsFormViewModel; - +form: FormGroup; - +isStudyReadonly: bool; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titles: Map<FormMode, String> - | - +void read(); - +void setControlsFrom(); - +Study buildFormData(); - +void dispose(); - +void onCancel(); - +dynamic onSave(); - -dynamic _applyAndSaveSubform() - ] - - [StudyFormViewModel]o-[Study] - [StudyFormViewModel]o-[<abstract>IStudyRepository] - [StudyFormViewModel]o-[<abstract>IAuthRepository] - [StudyFormViewModel]o-[GoRouter] - [StudyFormViewModel]o-[StudyInfoFormViewModel] - [StudyFormViewModel]o-[EnrollmentFormViewModel] - [StudyFormViewModel]o-[MeasurementsFormViewModel] - [StudyFormViewModel]o-[ReportsFormViewModel] - [StudyFormViewModel]o-[InterventionsFormViewModel] - [StudyFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[StudyFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[StudyFormViewModel] - [<abstract>StudyDesignPageWidget | +Widget? banner() @@ -1340,1077 +1340,1066 @@ - + - - - - - - - - - - - - - + + + - + - - - - - + - + - + + + - + - + + + + + - + - + - + - + - + - + - + - + - + - - - - + + + + - + - + - + - + - + - - + + - + - + - - - - + - - - - - - - - - - + + + + + - + - + - + - - - + + + - + - + + + + + - + - + - + - + - - - - + + - + - + - + - + - + - + - + - + - + - - - - + + - + - + - + - + - + - - + + + + - + - + + + - + - + - + - + - + - + - - - - - - + - - - + + + - - - + + + - - - - + - + - + - - + + - + - - - + + + + + - + - + + + - + - - - - - + - + - - - - - + - + - + + + - + - + - + - + - + - - - + - - - - - - + - - + - + - - - - - - - - - - - + - + - + - + - + - + - - - - - + + + + - - - - - + + + - + + - + - + - + - - - - - - - - - - - + - + - + - + - + + + + + + - - + - + - - - - - + - - + + - + + + + + + + + - + + - + - + - + - + - + - + + + + + - + - - - + - + - + - + - + - + - + - - + + - + - + - + - + + + - + - + + + - + - + - + - + - + + + + + + + + + + - - + - + - + - + - - + + + + - + - + - + + + + + + + + + + + + + + + - + - + - + - + - + - - + + - + - - - + - + - + + + - + - + - + - + + + + + - + - + + + + + - + - - - + - + - + - + + + + - + + - + - + + + + + + + - + - + - + - - + + + - - + - + - - - + - + - - - - - + - + - + - + + + + + - + - - - - + + + + - + - - + + - + - + - + - - - - - + + - - - + + + - - - - - + + + - + + - + - + - + - + - + - + - + - + - + - - - - - - - + - + - - - - - - - - - - - - - + - + - - - + - + - - - + - + - + - + + + + + + - - - + + - + - - - + - + - + - - - - + + + + + + + - - - + + - + - - - + + + + + + + + + + + + + - + - - - + + + - + - + + + - + - - + + + + + - - - + + + + + - - + - - + + - + - - - + + + - - - - + - - + - + - + + + - + - + + + - + - + - + - + - + - + - + - + - + - + + + + + + + - + - + - + + + + - + + - + - + + + - + - + - + - - - - + + + + + + + + + + StudyDesignInterventionsFormView + + + + + + +Widget build() + + + - - - - - - - - + + + + - - - ScreenerQuestionFormViewModel + + + StudyDesignPageWidget - - - <static>+defaultResponseOptionValidity: bool - +responseOptionsDisabledArray: FormArray<dynamic> - +responseOptionsLogicControls: FormArray<bool> - +responseOptionsLogicDescriptionControls: FormArray<String> - -_questionBaseControls: Map<String, AbstractControl<dynamic>> - +prevResponseOptionControls: List<AbstractControl<dynamic>> - +prevResponseOptionValues: List<dynamic> - +responseOptionsDisabledControls: List<AbstractControl<dynamic>> - +logicControlOptions: List<FormControlOption<bool>> - +questionBaseControls: Map<String, AbstractControl<dynamic>> - +isDirtyOptionsBannerVisible: bool + + + +Widget? banner() - - - +dynamic onResponseOptionsChanged() - +void setControlsFrom() - +QuestionFormData buildFormData() - -List<FormControl<dynamic>> _copyFormControls() - -AbstractControl<dynamic>? _findAssociatedLogicControlFor() - -AbstractControl<dynamic>? _findAssociatedControlFor() - +ScreenerQuestionFormViewModel createDuplicate() + + + + + + + + + InterventionFormView + + + + + + +formViewModel: InterventionFormViewModel + + + + + + + + + + + + + InterventionFormViewModel + + + + + + +study: Study + +interventionIdControl: FormControl<String> + +interventionTitleControl: FormControl<String> + +interventionIconControl: FormControl<IconOption> + +interventionDescriptionControl: FormControl<String> + +interventionTasksArray: FormArray<dynamic> + +tasksCollection: FormViewModelCollection<InterventionTaskFormViewModel, InterventionTaskFormData> + +form: FormGroup + +interventionId: String + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titleRequired: dynamic + +atLeastOneTask: dynamic + +breadcrumbsTitle: String + +titles: Map<FormMode, String> - - - - - - - - FormArray + + + +void setControlsFrom() + +InterventionFormData buildFormData() + +List<ModelAction<dynamic>> availableActions() + +List<ModelAction<dynamic>> availablePopupActions() + +List<ModelAction<dynamic>> availableInlineActions() + +void onSelectItem() + +void onNewItem() + +void onCancel() + +dynamic onSave() + +InterventionTaskFormViewModel provide() + +InterventionTaskFormRouteArgs buildNewFormRouteArgs() + +InterventionTaskFormRouteArgs buildFormRouteArgs() + +InterventionFormViewModel createDuplicate() - - - - - + + + + + - - - QuestionFormViewModel + + + InterventionPreview - - - <static>+defaultQuestionType: SurveyQuestionType - -_titles: Map<FormMode, String Function()>? - +questionIdControl: FormControl<String> - +questionTypeControl: FormControl<SurveyQuestionType> - +questionTextControl: FormControl<String> - +questionInfoTextControl: FormControl<String> - +questionBaseControls: Map<String, AbstractControl<dynamic>> - +isMultipleChoiceControl: FormControl<bool> - +choiceResponseOptionsArray: FormArray<dynamic> - +customOptionsMin: int - +customOptionsMax: int - +customOptionsInitial: int - +boolResponseOptionsArray: FormArray<String> - +imageResponseOptionsArray: FormArray<String> - <static>+kDefaultMaxRecordingDurationSeconds: int - <static>+kMaxRecordingDurationSeconds: int - +audioResponseOptionsArray: FormArray<String> - +maxRecordingDurationSecondsControl: FormControl<int> - <static>+kDefaultScaleMinValue: int - <static>+kDefaultScaleMaxValue: int - <static>+kNumMidValueControls: int - <static>+kMidValueDebounceMilliseconds: int - +scaleMinValueControl: FormControl<int> - +scaleMaxValueControl: FormControl<int> - -_scaleRangeControl: FormControl<int> - +scaleMinLabelControl: FormControl<String> - +scaleMaxLabelControl: FormControl<String> - +scaleMidValueControls: FormArray<int> - +scaleMidLabelControls: FormArray<String?> - -_scaleResponseOptionsArray: FormArray<int> - +scaleMinColorControl: FormControl<SerializableColor> - +scaleMaxColorControl: FormControl<SerializableColor> - +prevMidValues: List<int?>? - +freeTextTypeControl: FormControl<FreeTextQuestionType> - +customRegexControl: FormControl<String> - +freeTextResponseOptionsArray: FormArray<dynamic> - +freeTextLengthMin: AbstractControl<int> - +freeTextLengthMax: AbstractControl<int> - +freeTextExampleTextControl: FormControl<String> - <static>+kDefaultFreeTextMinLength: int - <static>+kDefaultFreeTextMaxLength: int - +freeTextLengthControl: FormControl<RangeValues> - -_controlsByQuestionType: Map<SurveyQuestionType, FormGroup> - -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - -_validationConfigsByQuestionType: Map<SurveyQuestionType, Map<FormValidationSetEnum, List<FormControlValidation>>> - +form: FormGroup - +questionId: String - +questionType: SurveyQuestionType - +questionTypeControlOptions: List<FormControlOption<SurveyQuestionType>> - +answerOptionsArray: FormArray<dynamic> - +answerOptionsControls: List<AbstractControl<dynamic>> - +validAnswerOptions: List<String> - +boolOptions: List<AbstractControl<String>> - +imageOptions: List<AbstractControl<String>> - +audioOptions: List<AbstractControl<String>> - +scaleMinValue: int - +scaleMaxValue: int - +scaleRange: int - +scaleAllValueControls: List<AbstractControl<int>> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +questionTextRequired: dynamic - +numValidChoiceOptions: dynamic - +scaleRangeValid: dynamic - +maxRecordingDurationValid: dynamic - +titles: Map<FormMode, String> - +isAddOptionButtonVisible: bool - +isMidValuesClearedInfoVisible: bool + + + +routeArgs: InterventionFormRouteArgs - - - +String? scaleMidLabelAt() - -dynamic _onScaleRangeChanged() - -dynamic _applyInputFormatters() - -dynamic _updateScaleMidValueControls() - -Map<String, dynamic>? _validateFreeText() - -dynamic _onFreeTextLengthChanged() - -List<FormControlValidation> _getValidationConfig() - +dynamic onQuestionTypeChanged() - +dynamic onResponseOptionsChanged() - -void _updateFormControls() - +void initControls() - +void setControlsFrom() - +QuestionFormData buildFormData() - +List<ModelAction<dynamic>> availableActions() - +void onNewItem() - +void onSelectItem() - +dynamic save() - +QuestionFormViewModel createDuplicate() + + + +Widget build() - - - - - - - - IScreenerQuestionLogicFormViewModel - - + + + - - - +isDirtyOptionsBannerVisible: bool + + + InterventionFormRouteArgs - - - - + + + - - - StudyDesignEnrollmentFormView + + + ConsumerWidget - - - +Widget build() - -dynamic _showScreenerQuestionSidesheetWithArgs() - -dynamic _showConsentItemSidesheetWithArgs() + + + + + + + + + + StudyScheduleFormView - - - - - - - - - StudyDesignPageWidget + + + +formViewModel: StudyScheduleControls - - - +Widget? banner() + + + -FormTableRow _renderCustomSequence() + +Widget build() - - - - - + + + + + - - - ScreenerQuestionLogicFormView + + + StudyScheduleControls - - - +formViewModel: ScreenerQuestionFormViewModel + + + <static>+defaultScheduleType: PhaseSequence + <static>+defaultScheduleTypeSequence: String + <static>+defaultNumCycles: int + <static>+defaultPeriodLength: int + +sequenceTypeControl: FormControl<PhaseSequence> + +sequenceTypeCustomControl: FormControl<String> + +phaseDurationControl: FormControl<int> + +numCyclesControl: FormControl<int> + +includeBaselineControl: FormControl<bool> + +studyScheduleControls: Map<String, FormControl<Object>> + <static>+kNumCyclesMin: int + <static>+kNumCyclesMax: int + <static>+kPhaseDurationMin: int + <static>+kPhaseDurationMax: int + +sequenceTypeControlOptions: List<FormControlOption<PhaseSequence>> + +studyScheduleValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +numCyclesRange: dynamic + +phaseDurationRange: dynamic + +customSequenceRequired: dynamic - - - +Widget build() - -dynamic _buildInfoBanner() - -dynamic _buildAnswerOptionsLogicControls() - -List<Widget> _buildOptionLogicRow() + + + +void setStudyScheduleControlsFrom() + +StudyScheduleFormData buildStudyScheduleFormData() + +bool isSequencingCustom() - + - + FormConsumerWidget - - - - - + + + + + - - - ConsentItemFormData + + + InterventionTaskFormData - - - +consentId: String - +title: String - +description: String - +iconName: String? - +id: String + + + +taskId: String + +taskTitle: String + +taskDescription: String? + <static>+kDefaultTitle: String + +id: String - - - +ConsentItem toConsentItem() - +ConsentItemFormData copy() + + + +CheckmarkTask toTask() + +InterventionTaskFormData copy() - - - + + + + + + + + + IFormDataWithSchedule + + + + + + +instanceId: String + +isTimeLocked: bool + +timeLockStart: StudyUTimeOfDay? + +timeLockEnd: StudyUTimeOfDay? + +hasReminder: bool + +reminderTime: StudyUTimeOfDay? + + - - - IFormData + + + +Schedule toSchedule() - - - - - + + + + + - - - EnrollmentFormViewModel + + + InterventionsFormViewModel - - - +study: Study - +router: GoRouter - +consentItemDelegate: EnrollmentFormConsentItemDelegate - +enrollmentTypeControl: FormControl<Participation> - +consentItemArray: FormArray<dynamic> - +consentItemFormViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData> - +form: FormGroup - +enrollmentTypeControlOptions: List<FormControlOption<Participation>> - +consentItemModels: List<ConsentItemFormViewModel> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titles: Map<FormMode, String> - +canTestScreener: bool - +canTestConsent: bool - +questionTitles: Map<FormMode, String Function()> + + + +study: Study + +router: GoRouter + +interventionsArray: FormArray<dynamic> + +interventionsCollection: FormViewModelCollection<InterventionFormViewModel, InterventionFormData> + +form: FormGroup + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +interventionsRequired: dynamic + +titles: Map<FormMode, String> + +canTestStudySchedule: bool - - - +void setControlsFrom() - +EnrollmentFormData buildFormData() - +void read() - +List<ModelAction<dynamic>> availableActions() - +List<ModelAction<dynamic>> availablePopupActions() - +List<ModelAction<dynamic>> availableInlineActions() - +void onSelectItem() - +void onNewItem() - +ScreenerQuestionFormRouteArgs buildNewScreenerQuestionFormRouteArgs() - +ScreenerQuestionFormRouteArgs buildScreenerQuestionFormRouteArgs() - +ConsentItemFormRouteArgs buildNewConsentItemFormRouteArgs() - +ConsentItemFormRouteArgs buildConsentItemFormRouteArgs() - +dynamic testScreener() - +dynamic testConsent() - +ScreenerQuestionFormViewModel provideQuestionFormViewModel() + + + +void setControlsFrom() + +InterventionsFormData buildFormData() + +void read() + +List<ModelAction<dynamic>> availableActions() + +List<ModelAction<dynamic>> availablePopupActions() + +List<ModelAction<dynamic>> availableInlineActions() + +void onSelectItem() + +void onNewItem() + +InterventionFormViewModel provide() + +void onCancel() + +dynamic onSave() + +dynamic testStudySchedule() - + - + Study @@ -2419,64 +2408,31 @@ - + - + GoRouter - - - - - - - - - EnrollmentFormConsentItemDelegate - - - - - - +formViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData> - +owner: EnrollmentFormViewModel - +propagateOnSave: bool - +validationSet: dynamic - - - - - - +void onCancel() - +dynamic onSave() - +ConsentItemFormViewModel provide() - +List<ModelAction<dynamic>> availableActions() - +void onNewItem() - +void onSelectItem() - - - - - - - + + + - - - FormControl + + + FormArray - + - + FormViewModelCollection @@ -2485,9 +2441,9 @@ - + - + FormGroup @@ -2496,56 +2452,20 @@ - + - + FormViewModel - - - - - - - - - WithQuestionnaireControls - - - - - - +questionsArray: FormArray<dynamic> - +questionFormViewModels: FormViewModelCollection<Q, QuestionFormData> - +questionnaireControls: Map<String, FormArray<dynamic>> - +propagateOnSave: bool - +questionModels: List<Q> - +questionTitles: Map<FormMode, String Function()> - - - - - - +void setQuestionnaireControlsFrom() - +QuestionnaireFormData buildQuestionnaireFormData() - +void read() - +void onCancel() - +dynamic onSave() - +Q provide() - +Q provideQuestionFormViewModel() - - - - - + - + IFormViewModelDelegate @@ -2554,9 +2474,9 @@ - + - + IListActionProvider @@ -2565,767 +2485,854 @@ - + - + IProviderArgsResolver - - - - - + + + + + - - - ConsentItemFormViewModel + + + InterventionTaskFormViewModel - - - +consentIdControl: FormControl<String> - +titleControl: FormControl<String> - +descriptionControl: FormControl<String> - +iconControl: FormControl<IconOption> - +form: FormGroup - +consentId: String - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titleRequired: dynamic - +descriptionRequired: dynamic - +titles: Map<FormMode, String> + + + +taskIdControl: FormControl<String> + +instanceIdControl: FormControl<String> + +taskTitleControl: FormControl<String> + +taskDescriptionControl: FormControl<String> + +markAsCompletedControl: FormControl<bool> + +form: FormGroup + +taskId: String + +instanceId: String + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titleRequired: dynamic + +titles: Map<FormMode, String> - - - +void setControlsFrom() - +ConsentItemFormData buildFormData() - +ConsentItemFormViewModel createDuplicate() + + + +void setControlsFrom() + +InterventionTaskFormData buildFormData() + +InterventionTaskFormViewModel createDuplicate() + + + + + + + + + + + FormControl - + - + ManagedFormViewModel - - - - + + + + + - - - ConsentItemFormView + + + WithScheduleControls - - - +formViewModel: ConsentItemFormViewModel + + + +isTimeRestrictedControl: FormControl<bool> + +instanceID: FormControl<String> + +restrictedTimeStartControl: FormControl<Time> + +restrictedTimeStartPickerControl: FormControl<TimeOfDay> + +restrictedTimeEndControl: FormControl<Time> + +restrictedTimeEndPickerControl: FormControl<TimeOfDay> + +hasReminderControl: FormControl<bool> + +reminderTimeControl: FormControl<Time> + +reminderTimePickerControl: FormControl<TimeOfDay> + -_reminderControlStream: StreamSubscription<dynamic>? + +scheduleFormControls: Map<String, FormControl<Object>> + +hasReminder: bool + +isTimeRestricted: bool + +timeRestriction: List<Time>? + + + + + + +void setScheduleControlsFrom() + -dynamic _initReminderControl() - - - - - + + + - - - EnrollmentFormData + + + PhaseSequence - - - <static>+kDefaultEnrollmentType: Participation - +enrollmentType: Participation - +questionnaireFormData: QuestionnaireFormData - +consentItemsFormData: List<ConsentItemFormData>? - +id: String + + + + + + + + + + InterventionFormData - - - +Study apply() - +EnrollmentFormData copy() + + + +interventionId: String + +title: String + +description: String? + +tasksData: List<InterventionTaskFormData>? + +iconName: String? + <static>+kDefaultTitle: String + +id: String + + + + + + +Intervention toIntervention() + +InterventionFormData copy() - - - + + + - - - Participation + + + IFormData - - - - - + + + + + - - - QuestionnaireFormData + + + StudyScheduleFormData - - - +questionsData: List<QuestionFormData>? - +id: String + + + +sequenceType: PhaseSequence + +sequenceTypeCustom: String + +numCycles: int + +phaseDuration: int + +includeBaseline: bool + +id: String - - - +StudyUQuestionnaire toQuestionnaire() - +List<EligibilityCriterion> toEligibilityCriteria() - +QuestionnaireFormData copy() + + + +StudySchedule toStudySchedule() + +Study apply() + +StudyScheduleFormData copy() - - + + - + IStudyFormData - + +Study apply() - - - - + + + + - - - StudyDesignInterventionsFormView + + + InterventionTaskFormView - - - +Widget build() + + + +formViewModel: InterventionTaskFormViewModel - - - - - + + + + + - - - InterventionsFormViewModel + + + InterventionsFormData - - - +study: Study - +router: GoRouter - +interventionsArray: FormArray<dynamic> - +interventionsCollection: FormViewModelCollection<InterventionFormViewModel, InterventionFormData> - +form: FormGroup - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +interventionsRequired: dynamic - +titles: Map<FormMode, String> - +canTestStudySchedule: bool + + + +interventionsData: List<InterventionFormData> + +studyScheduleData: StudyScheduleFormData + +id: String - - - +void setControlsFrom() - +InterventionsFormData buildFormData() - +void read() - +List<ModelAction<dynamic>> availableActions() - +List<ModelAction<dynamic>> availablePopupActions() - +List<ModelAction<dynamic>> availableInlineActions() - +void onSelectItem() - +void onNewItem() - +InterventionFormViewModel provide() - +void onCancel() - +dynamic onSave() - +dynamic testStudySchedule() + + + +Study apply() + +InterventionsFormData copy() - - - - - + + + + - - - StudyScheduleControls + + + StudyDesignReportsFormView - - - <static>+defaultScheduleType: PhaseSequence - <static>+defaultScheduleTypeSequence: String - <static>+defaultNumCycles: int - <static>+defaultPeriodLength: int - +sequenceTypeControl: FormControl<PhaseSequence> - +sequenceTypeCustomControl: FormControl<String> - +phaseDurationControl: FormControl<int> - +numCyclesControl: FormControl<int> - +includeBaselineControl: FormControl<bool> - +studyScheduleControls: Map<String, FormControl<Object>> - <static>+kNumCyclesMin: int - <static>+kNumCyclesMax: int - <static>+kPhaseDurationMin: int - <static>+kPhaseDurationMax: int - +sequenceTypeControlOptions: List<FormControlOption<PhaseSequence>> - +studyScheduleValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +numCyclesRange: dynamic - +phaseDurationRange: dynamic - +customSequenceRequired: dynamic + + + +Widget build() + -dynamic _showReportItemSidesheetWithArgs() - - - +void setStudyScheduleControlsFrom() - +StudyScheduleFormData buildStudyScheduleFormData() - +bool isSequencingCustom() + + + + + + + + + + ReportItemFormData + + + + + + +isPrimary: bool + +section: ReportSection + +id: String + + + + + + <static>+dynamic fromDomainModel() + +ReportItemFormData copy() - - - - - + + + - - - InterventionFormViewModel + + + ReportSection - - - +study: Study - +interventionIdControl: FormControl<String> - +interventionTitleControl: FormControl<String> - +interventionIconControl: FormControl<IconOption> - +interventionDescriptionControl: FormControl<String> - +interventionTasksArray: FormArray<dynamic> - +tasksCollection: FormViewModelCollection<InterventionTaskFormViewModel, InterventionTaskFormData> - +form: FormGroup - +interventionId: String - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titleRequired: dynamic - +atLeastOneTask: dynamic - +breadcrumbsTitle: String - +titles: Map<FormMode, String> + + + + + + + + + + DataReferenceEditor - - - +void setControlsFrom() - +InterventionFormData buildFormData() - +List<ModelAction<dynamic>> availableActions() - +List<ModelAction<dynamic>> availablePopupActions() - +List<ModelAction<dynamic>> availableInlineActions() - +void onSelectItem() - +void onNewItem() - +void onCancel() - +dynamic onSave() - +InterventionTaskFormViewModel provide() - +InterventionTaskFormRouteArgs buildNewFormRouteArgs() - +InterventionTaskFormRouteArgs buildFormRouteArgs() - +InterventionFormViewModel createDuplicate() + + + +formControl: FormControl<DataReferenceIdentifier<T>> + +availableTasks: List<Task> + +buildReactiveDropdownField: ReactiveDropdownField<dynamic> + + + + + + +FormTableRow buildFormTableRow() + -List<DropdownMenuItem<DataReferenceIdentifier<dynamic>>> _dataReferenceItems() - - - - - + + + - - - InterventionTaskFormData + + + ReactiveDropdownField - - - +taskId: String - +taskTitle: String - +taskDescription: String? - <static>+kDefaultTitle: String - +id: String + + + + + + + + + + TemporalAggregationFormatted - - - +CheckmarkTask toTask() - +InterventionTaskFormData copy() + + + -_value: TemporalAggregation + <static>+values: List<TemporalAggregationFormatted> + +value: TemporalAggregation + +string: String + +icon: IconData? + +hashCode: int + + + + + + +bool ==() + +String toString() + +String toJson() + <static>+TemporalAggregationFormatted fromJson() - - - - - + + + - - - IFormDataWithSchedule + + + TemporalAggregation - - - +instanceId: String - +isTimeLocked: bool - +timeLockStart: StudyUTimeOfDay? - +timeLockEnd: StudyUTimeOfDay? - +hasReminder: bool - +reminderTime: StudyUTimeOfDay? + + + + + + + + IconData + + + + + + + + + + + + + ImprovementDirectionFormatted + + + + + + -_value: ImprovementDirection + <static>+values: List<ImprovementDirectionFormatted> + +value: ImprovementDirection + +string: String + +icon: IconData? + +hashCode: int - - - +Schedule toSchedule() + + + +bool ==() + +String toString() + +String toJson() + <static>+ImprovementDirectionFormatted fromJson() - - - - - + + + - - - StudyScheduleFormData + + + ImprovementDirection - - - +sequenceType: PhaseSequence - +sequenceTypeCustom: String - +numCycles: int - +phaseDuration: int - +includeBaseline: bool - +id: String + + + + + + + + + ReportSectionType - - - +StudySchedule toStudySchedule() - +Study apply() - +StudyScheduleFormData copy() + + + +index: int + <static>+values: List<ReportSectionType> + <static>+average: ReportSectionType + <static>+linearRegression: ReportSectionType - - - + + + - - - PhaseSequence + + + Enum - - - - - + + + + + - - - InterventionPreview + + + AverageSectionFormView - - - +routeArgs: InterventionFormRouteArgs + + + +formViewModel: ReportItemFormViewModel + +studyId: String + +reportSectionColumnWidth: Map<int, TableColumnWidth> - - - +Widget build() + + + +Widget build() - - - + + + + + - - - InterventionFormRouteArgs + + + ReportItemFormViewModel - - - - + + + <static>+defaultSectionType: ReportSectionType + +sectionIdControl: FormControl<String> + +sectionTypeControl: FormControl<ReportSectionType> + +titleControl: FormControl<String> + +descriptionControl: FormControl<String> + +sectionControl: FormControl<ReportSection> + +dataReferenceControl: FormControl<DataReferenceIdentifier<num>> + +temporalAggregationControl: FormControl<TemporalAggregationFormatted> + +improvementDirectionControl: FormControl<ImprovementDirectionFormatted> + +alphaControl: FormControl<double> + -_controlsBySectionType: Map<ReportSectionType, FormGroup> + -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + -_validationConfigsBySectionType: Map<ReportSectionType, Map<FormValidationSetEnum, List<FormControlValidation>>> + +sectionBaseControls: Map<String, AbstractControl<dynamic>> + +form: FormGroup + +sectionId: String + +sectionType: ReportSectionType + <static>+sectionTypeControlOptions: List<FormControlOption<ReportSectionType>> + <static>+temporalAggregationControlOptions: List<FormControlOption<TemporalAggregationFormatted>> + <static>+improvementDirectionControlOptions: List<FormControlOption<ImprovementDirectionFormatted>> + +titles: Map<FormMode, String> + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titleRequired: dynamic + +descriptionRequired: dynamic + +dataReferenceRequired: dynamic + +aggregationRequired: dynamic + +improvementDirectionRequired: dynamic + +alphaConfidenceRequired: dynamic + + - - - ConsumerWidget + + + -List<FormControlValidation> _getValidationConfig() + +ReportItemFormData buildFormData() + +ReportItemFormViewModel createDuplicate() + +dynamic onSectionTypeChanged() + -void _updateFormControls() + +void setControlsFrom() - - - - - + + + + + - - - InterventionTaskFormViewModel + + + DataReferenceIdentifier - - - +taskIdControl: FormControl<String> - +instanceIdControl: FormControl<String> - +taskTitleControl: FormControl<String> - +taskDescriptionControl: FormControl<String> - +markAsCompletedControl: FormControl<bool> - +form: FormGroup - +taskId: String - +instanceId: String - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titleRequired: dynamic - +titles: Map<FormMode, String> + + + +hashCode: int - - - +void setControlsFrom() - +InterventionTaskFormData buildFormData() - +InterventionTaskFormViewModel createDuplicate() + + + +bool ==() - - - - - + + + - - - WithScheduleControls + + + DataReference - - - +isTimeRestrictedControl: FormControl<bool> - +instanceID: FormControl<String> - +restrictedTimeStartControl: FormControl<Time> - +restrictedTimeStartPickerControl: FormControl<TimeOfDay> - +restrictedTimeEndControl: FormControl<Time> - +restrictedTimeEndPickerControl: FormControl<TimeOfDay> - +hasReminderControl: FormControl<bool> - +reminderTimeControl: FormControl<Time> - +reminderTimePickerControl: FormControl<TimeOfDay> - -_reminderControlStream: StreamSubscription<dynamic>? - +scheduleFormControls: Map<String, FormControl<Object>> - +hasReminder: bool - +isTimeRestricted: bool - +timeRestriction: List<Time>? + + + + + + + + + + LinearRegressionSectionFormView - - - +void setScheduleControlsFrom() - -dynamic _initReminderControl() + + + +formViewModel: ReportItemFormViewModel + +studyId: String + +reportSectionColumnWidth: Map<int, TableColumnWidth> + + + + + + +Widget build() - - - - - + + + + + - - - InterventionsFormData + + + ReportItemFormView - - - +interventionsData: List<InterventionFormData> - +studyScheduleData: StudyScheduleFormData - +id: String + + + +formViewModel: ReportItemFormViewModel + +studyId: String + +reportSectionColumnWidth: dynamic + +sectionTypeBodyBuilder: Widget Function(BuildContext) - - - +Study apply() - +InterventionsFormData copy() + + + +Widget build() + -dynamic _buildSectionText() + -dynamic _buildSectionTypeHeader() - - - - + + + - - - InterventionFormView + + + Widget Function(BuildContext) - - - +formViewModel: InterventionFormViewModel + + + + + + + + + + ReportsFormViewModel - - - - - - - - - InterventionTaskFormView + + + +study: Study + +router: GoRouter + +reportItemDelegate: ReportFormItemDelegate + +reportItemArray: FormArray<dynamic> + +reportItemFormViewModels: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData> + +form: FormGroup + +reportItemModels: List<ReportItemFormViewModel> + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titles: Map<FormMode, String> + +canTestConsent: bool - - - +formViewModel: InterventionTaskFormViewModel + + + +void setControlsFrom() + +ReportsFormData buildFormData() + +void read() + +ReportItemFormRouteArgs buildNewReportItemFormRouteArgs() + +ReportItemFormRouteArgs buildReportItemFormRouteArgs() + +dynamic testReport() + +void onCancel() + +dynamic onSave() + +ReportItemFormViewModel provide() - - - - - + + + + + - - - InterventionFormData + + + ReportFormItemDelegate - - - +interventionId: String - +title: String - +description: String? - +tasksData: List<InterventionTaskFormData>? - +iconName: String? - <static>+kDefaultTitle: String - +id: String + + + +formViewModelCollection: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData> + +owner: ReportsFormViewModel + +propagateOnSave: bool + +validationSet: dynamic - - - +Intervention toIntervention() - +InterventionFormData copy() + + + +void onCancel() + +dynamic onSave() + +ReportItemFormViewModel provide() + +List<ModelAction<dynamic>> availableActions() + +void onNewItem() + +void onSelectItem() - - - - - + + + + + - - - StudyScheduleFormView + + + ReportBadge - - - +formViewModel: StudyScheduleControls + + + +status: ReportStatus? + +type: BadgeType + +showPrefixIcon: bool + +showTooltip: bool - - - -FormTableRow _renderCustomSequence() - +Widget build() + + + +Widget build() - - - - - - - - - StudyInfoFormData - - + + + + - - - +title: String - +description: String? - +iconName: String - +contactInfoFormData: StudyContactInfoFormData - +id: String + + + ReportStatus - - - +Study apply() - +StudyInfoFormData copy() + + + +index: int + <static>+values: List<ReportStatus> + <static>+primary: ReportStatus + <static>+secondary: ReportStatus - - - - - + + + - - - StudyContactInfoFormData + + + BadgeType - - - +organization: String? - +institutionalReviewBoard: String? - +institutionalReviewBoardNumber: String? - +researchers: String? - +email: String? - +website: String? - +phone: String? - +additionalInfo: String? - +id: String - - + + + + + + - - - +Study apply() - +StudyInfoFormData copy() + + + ReportsFormData - - - - - - - - - StudyDesignInfoFormView + + + +reportItems: List<ReportItemFormData> + +id: String - - - +Widget build() + + + +Study apply() + +ReportsFormData copy() - - - + + + - + StudyInfoFormViewModel - + +study: Study +titleControl: FormControl<String> @@ -3356,7 +3363,7 @@ - + +void setControlsFrom() +StudyInfoFormData buildFormData() @@ -3364,239 +3371,100 @@ - - - - - - - - - MeasurementSurveyFormData - - - - - - +measurementId: String - +title: String - +introText: String? - +outroText: String? - +questionnaireFormData: QuestionnaireFormData - <static>+kDefaultTitle: String - +id: String - - - - - - +QuestionnaireTask toQuestionnaireTask() - +MeasurementSurveyFormData copy() - - - - - - - - - - - - MeasurementSurveyFormView - - - - - - +formViewModel: MeasurementSurveyFormViewModel - - - - - - - - - - - - - MeasurementSurveyFormViewModel - - - - - - +study: Study - +measurementIdControl: FormControl<String> - +instanceIdControl: FormControl<String> - +surveyTitleControl: FormControl<String> - +surveyIntroTextControl: FormControl<String> - +surveyOutroTextControl: FormControl<String> - +form: FormGroup - +measurementId: String - +instanceId: String - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titleRequired: dynamic - +atLeastOneQuestion: dynamic - +breadcrumbsTitle: String - +titles: Map<FormMode, String> - - - - - - +void setControlsFrom() - +MeasurementSurveyFormData buildFormData() - +List<ModelAction<dynamic>> availableActions() - +List<ModelAction<dynamic>> availablePopupActions() - +List<ModelAction<dynamic>> availableInlineActions() - +void onSelectItem() - +void onNewItem() - +SurveyQuestionFormRouteArgs buildNewFormRouteArgs() - +SurveyQuestionFormRouteArgs buildFormRouteArgs() - +MeasurementSurveyFormViewModel createDuplicate() - - - - - - - - - - - - - SurveyPreview - - - - - - +routeArgs: MeasurementFormRouteArgs - - - - - - +Widget build() - - - - - - - - - - - MeasurementFormRouteArgs - - - - - - - - + + + + - - - StudyDesignMeasurementsFormView + + + StudyDesignInfoFormView - - - +Widget build() + + + +Widget build() - - - - - + + + + + - - - MeasurementsFormData + + + StudyInfoFormData - - - +surveyMeasurements: List<MeasurementSurveyFormData> - +id: String + + + +title: String + +description: String? + +iconName: String + +contactInfoFormData: StudyContactInfoFormData + +id: String - - - +Study apply() - +MeasurementsFormData copy() + + + +Study apply() + +StudyInfoFormData copy() - - - - - + + + + + - - - MeasurementsFormViewModel + + + StudyContactInfoFormData - - - +study: Study - +router: GoRouter - +measurementsArray: FormArray<dynamic> - +surveyMeasurementFormViewModels: FormViewModelCollection<MeasurementSurveyFormViewModel, MeasurementSurveyFormData> - +form: FormGroup - +measurementViewModels: List<MeasurementSurveyFormViewModel> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +measurementRequired: dynamic - +titles: Map<FormMode, String> + + + +organization: String? + +institutionalReviewBoard: String? + +institutionalReviewBoardNumber: String? + +researchers: String? + +email: String? + +website: String? + +phone: String? + +additionalInfo: String? + +id: String - - - +void read() - +void setControlsFrom() - +MeasurementsFormData buildFormData() - +List<ModelAction<dynamic>> availableActions() - +List<ModelAction<dynamic>> availablePopupActions() - +List<ModelAction<dynamic>> availableInlineActions() - +void onSelectItem() - +void onNewItem() - +MeasurementSurveyFormViewModel provide() - +void onCancel() - +dynamic onSave() + + + +Study apply() + +StudyInfoFormData copy() - - + + - + StudyFormValidationSet - + +index: int <static>+values: List<StudyFormValidationSet> @@ -3604,701 +3472,843 @@ - - - - - - - Enum - - - - - - - - - + + + + + - - - ReportsFormViewModel + + + MeasurementsFormData - - - +study: Study - +router: GoRouter - +reportItemDelegate: ReportFormItemDelegate - +reportItemArray: FormArray<dynamic> - +reportItemFormViewModels: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData> - +form: FormGroup - +reportItemModels: List<ReportItemFormViewModel> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titles: Map<FormMode, String> - +canTestConsent: bool + + + +surveyMeasurements: List<MeasurementSurveyFormData> + +id: String - - - +void setControlsFrom() - +ReportsFormData buildFormData() - +void read() - +ReportItemFormRouteArgs buildNewReportItemFormRouteArgs() - +ReportItemFormRouteArgs buildReportItemFormRouteArgs() - +dynamic testReport() - +void onCancel() - +dynamic onSave() - +ReportItemFormViewModel provide() + + + +Study apply() + +MeasurementsFormData copy() - - - - - - - - - ReportFormItemDelegate - - + + + + - - - +formViewModelCollection: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData> - +owner: ReportsFormViewModel - +propagateOnSave: bool - +validationSet: dynamic + + + MeasurementSurveyFormView - - - +void onCancel() - +dynamic onSave() - +ReportItemFormViewModel provide() - +List<ModelAction<dynamic>> availableActions() - +void onNewItem() - +void onSelectItem() + + + +formViewModel: MeasurementSurveyFormViewModel - - - - - - - - - ReportItemFormData - - + + + + + - - - +isPrimary: bool - +section: ReportSection - +id: String + + + MeasurementSurveyFormViewModel - - - <static>+dynamic fromDomainModel() - +ReportItemFormData copy() + + + +study: Study + +measurementIdControl: FormControl<String> + +instanceIdControl: FormControl<String> + +surveyTitleControl: FormControl<String> + +surveyIntroTextControl: FormControl<String> + +surveyOutroTextControl: FormControl<String> + +form: FormGroup + +measurementId: String + +instanceId: String + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titleRequired: dynamic + +atLeastOneQuestion: dynamic + +breadcrumbsTitle: String + +titles: Map<FormMode, String> - - - - - - - - ReportSection + + + +void setControlsFrom() + +MeasurementSurveyFormData buildFormData() + +List<ModelAction<dynamic>> availableActions() + +List<ModelAction<dynamic>> availablePopupActions() + +List<ModelAction<dynamic>> availableInlineActions() + +void onSelectItem() + +void onNewItem() + +SurveyQuestionFormRouteArgs buildNewFormRouteArgs() + +SurveyQuestionFormRouteArgs buildFormRouteArgs() + +MeasurementSurveyFormViewModel createDuplicate() - - - - - + + + + + - - - ReportItemFormView + + + SurveyPreview - - - +formViewModel: ReportItemFormViewModel - +studyId: String - +reportSectionColumnWidth: dynamic - +sectionTypeBodyBuilder: Widget Function(BuildContext) + + + +routeArgs: MeasurementFormRouteArgs - - - +Widget build() - -dynamic _buildSectionText() - -dynamic _buildSectionTypeHeader() + + + +Widget build() - - - - - + + + - - - ReportItemFormViewModel + + + MeasurementFormRouteArgs - - - <static>+defaultSectionType: ReportSectionType - +sectionIdControl: FormControl<String> - +sectionTypeControl: FormControl<ReportSectionType> - +titleControl: FormControl<String> - +descriptionControl: FormControl<String> - +sectionControl: FormControl<ReportSection> - +dataReferenceControl: FormControl<DataReferenceIdentifier<num>> - +temporalAggregationControl: FormControl<TemporalAggregationFormatted> - +improvementDirectionControl: FormControl<ImprovementDirectionFormatted> - +alphaControl: FormControl<double> - -_controlsBySectionType: Map<ReportSectionType, FormGroup> - -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - -_validationConfigsBySectionType: Map<ReportSectionType, Map<FormValidationSetEnum, List<FormControlValidation>>> - +sectionBaseControls: Map<String, AbstractControl<dynamic>> - +form: FormGroup - +sectionId: String - +sectionType: ReportSectionType - <static>+sectionTypeControlOptions: List<FormControlOption<ReportSectionType>> - <static>+temporalAggregationControlOptions: List<FormControlOption<TemporalAggregationFormatted>> - <static>+improvementDirectionControlOptions: List<FormControlOption<ImprovementDirectionFormatted>> - +titles: Map<FormMode, String> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titleRequired: dynamic - +descriptionRequired: dynamic - +dataReferenceRequired: dynamic - +aggregationRequired: dynamic - +improvementDirectionRequired: dynamic - +alphaConfidenceRequired: dynamic + + + + + + + + + + MeasurementSurveyFormData - - - -List<FormControlValidation> _getValidationConfig() - +ReportItemFormData buildFormData() - +ReportItemFormViewModel createDuplicate() - +dynamic onSectionTypeChanged() - -void _updateFormControls() - +void setControlsFrom() + + + +measurementId: String + +title: String + +introText: String? + +outroText: String? + +questionnaireFormData: QuestionnaireFormData + <static>+kDefaultTitle: String + +id: String - - - - - - - - Widget Function(BuildContext) + + + +QuestionnaireTask toQuestionnaireTask() + +MeasurementSurveyFormData copy() - - - - + + + + + - - - ReportSectionType + + + QuestionnaireFormData - - - +index: int - <static>+values: List<ReportSectionType> - <static>+average: ReportSectionType - <static>+linearRegression: ReportSectionType + + + +questionsData: List<QuestionFormData>? + +id: String + + + + + + +StudyUQuestionnaire toQuestionnaire() + +List<EligibilityCriterion> toEligibilityCriteria() + +QuestionnaireFormData copy() - - - - - + + + + + - - - TemporalAggregationFormatted + + + WithQuestionnaireControls - - - -_value: TemporalAggregation - <static>+values: List<TemporalAggregationFormatted> - +value: TemporalAggregation - +string: String - +icon: IconData? - +hashCode: int + + + +questionsArray: FormArray<dynamic> + +questionFormViewModels: FormViewModelCollection<Q, QuestionFormData> + +questionnaireControls: Map<String, FormArray<dynamic>> + +propagateOnSave: bool + +questionModels: List<Q> + +questionTitles: Map<FormMode, String Function()> - - - +bool ==() - +String toString() - +String toJson() - <static>+TemporalAggregationFormatted fromJson() + + + +void setQuestionnaireControlsFrom() + +QuestionnaireFormData buildQuestionnaireFormData() + +void read() + +void onCancel() + +dynamic onSave() + +Q provide() + +Q provideQuestionFormViewModel() - - - + + + + - - - TemporalAggregation + + + StudyDesignMeasurementsFormView - - - - - - - - IconData + + + +Widget build() - - - - - + + + + + - - - ImprovementDirectionFormatted + + + MeasurementsFormViewModel - - - -_value: ImprovementDirection - <static>+values: List<ImprovementDirectionFormatted> - +value: ImprovementDirection - +string: String - +icon: IconData? - +hashCode: int + + + +study: Study + +router: GoRouter + +measurementsArray: FormArray<dynamic> + +surveyMeasurementFormViewModels: FormViewModelCollection<MeasurementSurveyFormViewModel, MeasurementSurveyFormData> + +form: FormGroup + +measurementViewModels: List<MeasurementSurveyFormViewModel> + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +measurementRequired: dynamic + +titles: Map<FormMode, String> - - - +bool ==() - +String toString() - +String toJson() - <static>+ImprovementDirectionFormatted fromJson() + + + +void read() + +void setControlsFrom() + +MeasurementsFormData buildFormData() + +List<ModelAction<dynamic>> availableActions() + +List<ModelAction<dynamic>> availablePopupActions() + +List<ModelAction<dynamic>> availableInlineActions() + +void onSelectItem() + +void onNewItem() + +MeasurementSurveyFormViewModel provide() + +void onCancel() + +dynamic onSave() - - - + + + + + - - - ImprovementDirection + + + StudyFormScaffold - - - - - - + + + +studyId: String + +formViewModelBuilder: T Function(WidgetRef) + +formViewBuilder: Widget Function(T) + + - - - AverageSectionFormView + + + +Widget build() - - - +formViewModel: ReportItemFormViewModel - +studyId: String - +reportSectionColumnWidth: Map<int, TableColumnWidth> + + + + + + + + T Function(WidgetRef) - - - +Widget build() + + + + + + + + Widget Function(T) - - - - - + + + + + - - - LinearRegressionSectionFormView + + + ConsentItemFormViewModel - - - +formViewModel: ReportItemFormViewModel - +studyId: String - +reportSectionColumnWidth: Map<int, TableColumnWidth> + + + +consentIdControl: FormControl<String> + +titleControl: FormControl<String> + +descriptionControl: FormControl<String> + +iconControl: FormControl<IconOption> + +form: FormGroup + +consentId: String + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titleRequired: dynamic + +descriptionRequired: dynamic + +titles: Map<FormMode, String> - - - +Widget build() + + + +void setControlsFrom() + +ConsentItemFormData buildFormData() + +ConsentItemFormViewModel createDuplicate() - - - - - + + + + - - - DataReferenceIdentifier + + + StudyDesignEnrollmentFormView - - - +hashCode: int + + + +Widget build() + -dynamic _showScreenerQuestionSidesheetWithArgs() + -dynamic _showConsentItemSidesheetWithArgs() - - - +bool ==() + + + + + + + + + IScreenerQuestionLogicFormViewModel + + + + + + +isDirtyOptionsBannerVisible: bool - - - + + + + + - - - DataReference + + + ScreenerQuestionLogicFormView - - - - - - + + + +formViewModel: ScreenerQuestionFormViewModel + + - - - DataReferenceEditor + + + +Widget build() + -dynamic _buildInfoBanner() + -dynamic _buildAnswerOptionsLogicControls() + -List<Widget> _buildOptionLogicRow() - - - +formControl: FormControl<DataReferenceIdentifier<T>> - +availableTasks: List<Task> - +buildReactiveDropdownField: ReactiveDropdownField<dynamic> + + + + + + + + + + ScreenerQuestionFormViewModel - - - +FormTableRow buildFormTableRow() - -List<DropdownMenuItem<DataReferenceIdentifier<dynamic>>> _dataReferenceItems() + + + <static>+defaultResponseOptionValidity: bool + +responseOptionsDisabledArray: FormArray<dynamic> + +responseOptionsLogicControls: FormArray<bool> + +responseOptionsLogicDescriptionControls: FormArray<String> + -_questionBaseControls: Map<String, AbstractControl<dynamic>> + +prevResponseOptionControls: List<AbstractControl<dynamic>> + +prevResponseOptionValues: List<dynamic> + +responseOptionsDisabledControls: List<AbstractControl<dynamic>> + +logicControlOptions: List<FormControlOption<bool>> + +questionBaseControls: Map<String, AbstractControl<dynamic>> + +isDirtyOptionsBannerVisible: bool - - - - - - - - ReactiveDropdownField + + + +dynamic onResponseOptionsChanged() + +void setControlsFrom() + +QuestionFormData buildFormData() + -List<FormControl<dynamic>> _copyFormControls() + -AbstractControl<dynamic>? _findAssociatedLogicControlFor() + -AbstractControl<dynamic>? _findAssociatedControlFor() + +ScreenerQuestionFormViewModel createDuplicate() - - - - - + + + + + - - - ReportsFormData + + + ConsentItemFormData - - - +reportItems: List<ReportItemFormData> - +id: String + + + +consentId: String + +title: String + +description: String + +iconName: String? + +id: String - - - +Study apply() - +ReportsFormData copy() + + + +ConsentItem toConsentItem() + +ConsentItemFormData copy() - - - - + + + + - - - ReportStatus + + + ConsentItemFormView - - - +index: int - <static>+values: List<ReportStatus> - <static>+primary: ReportStatus - <static>+secondary: ReportStatus + + + +formViewModel: ConsentItemFormViewModel - - - - - + + + + + - - - ReportBadge + + + EnrollmentFormData - - - +status: ReportStatus? - +type: BadgeType - +showPrefixIcon: bool - +showTooltip: bool + + + <static>+kDefaultEnrollmentType: Participation + +enrollmentType: Participation + +questionnaireFormData: QuestionnaireFormData + +consentItemsFormData: List<ConsentItemFormData>? + +id: String - - - +Widget build() + + + +Study apply() + +EnrollmentFormData copy() - - - + + + - - - BadgeType + + + Participation - - - - + + + + + - - - StudyDesignReportsFormView + + + QuestionFormViewModel - - - +Widget build() - -dynamic _showReportItemSidesheetWithArgs() + + + <static>+defaultQuestionType: SurveyQuestionType + -_titles: Map<FormMode, String Function()>? + +questionIdControl: FormControl<String> + +questionTypeControl: FormControl<SurveyQuestionType> + +questionTextControl: FormControl<String> + +questionInfoTextControl: FormControl<String> + +questionBaseControls: Map<String, AbstractControl<dynamic>> + +isMultipleChoiceControl: FormControl<bool> + +choiceResponseOptionsArray: FormArray<dynamic> + +customOptionsMin: int + +customOptionsMax: int + +customOptionsInitial: int + +boolResponseOptionsArray: FormArray<String> + +imageResponseOptionsArray: FormArray<String> + <static>+kDefaultMaxRecordingDurationSeconds: int + <static>+kMaxRecordingDurationSeconds: int + +audioResponseOptionsArray: FormArray<String> + +maxRecordingDurationSecondsControl: FormControl<int> + <static>+kDefaultScaleMinValue: int + <static>+kDefaultScaleMaxValue: int + <static>+kNumMidValueControls: int + <static>+kMidValueDebounceMilliseconds: int + +scaleMinValueControl: FormControl<int> + +scaleMaxValueControl: FormControl<int> + -_scaleRangeControl: FormControl<int> + +scaleMinLabelControl: FormControl<String> + +scaleMaxLabelControl: FormControl<String> + +scaleMidValueControls: FormArray<int> + +scaleMidLabelControls: FormArray<String?> + -_scaleResponseOptionsArray: FormArray<int> + +scaleMinColorControl: FormControl<SerializableColor> + +scaleMaxColorControl: FormControl<SerializableColor> + +prevMidValues: List<int?>? + +freeTextTypeControl: FormControl<FreeTextQuestionType> + +customRegexControl: FormControl<String> + +freeTextResponseOptionsArray: FormArray<dynamic> + +freeTextLengthMin: AbstractControl<int> + +freeTextLengthMax: AbstractControl<int> + +freeTextExampleTextControl: FormControl<String> + <static>+kDefaultFreeTextMinLength: int + <static>+kDefaultFreeTextMaxLength: int + +freeTextLengthControl: FormControl<RangeValues> + -_controlsByQuestionType: Map<SurveyQuestionType, FormGroup> + -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + -_validationConfigsByQuestionType: Map<SurveyQuestionType, Map<FormValidationSetEnum, List<FormControlValidation>>> + +form: FormGroup + +questionId: String + +questionType: SurveyQuestionType + +questionTypeControlOptions: List<FormControlOption<SurveyQuestionType>> + +answerOptionsArray: FormArray<dynamic> + +answerOptionsControls: List<AbstractControl<dynamic>> + +validAnswerOptions: List<String> + +boolOptions: List<AbstractControl<String>> + +imageOptions: List<AbstractControl<String>> + +audioOptions: List<AbstractControl<String>> + +scaleMinValue: int + +scaleMaxValue: int + +scaleRange: int + +scaleAllValueControls: List<AbstractControl<int>> + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +questionTextRequired: dynamic + +numValidChoiceOptions: dynamic + +scaleRangeValid: dynamic + +maxRecordingDurationValid: dynamic + +titles: Map<FormMode, String> + +isAddOptionButtonVisible: bool + +isMidValuesClearedInfoVisible: bool + + + + + + +String? scaleMidLabelAt() + -dynamic _onScaleRangeChanged() + -dynamic _applyInputFormatters() + -dynamic _updateScaleMidValueControls() + -Map<String, dynamic>? _validateFreeText() + -dynamic _onFreeTextLengthChanged() + -List<FormControlValidation> _getValidationConfig() + +dynamic onQuestionTypeChanged() + +dynamic onResponseOptionsChanged() + -void _updateFormControls() + +void initControls() + +void setControlsFrom() + +QuestionFormData buildFormData() + +List<ModelAction<dynamic>> availableActions() + +void onNewItem() + +void onSelectItem() + +dynamic save() + +QuestionFormViewModel createDuplicate() - - - - - + + + + + - - - StudyFormScaffold + + + EnrollmentFormViewModel - - - +studyId: String - +formViewModelBuilder: T Function(WidgetRef) - +formViewBuilder: Widget Function(T) + + + +study: Study + +router: GoRouter + +consentItemDelegate: EnrollmentFormConsentItemDelegate + +enrollmentTypeControl: FormControl<Participation> + +consentItemArray: FormArray<dynamic> + +consentItemFormViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData> + +form: FormGroup + +enrollmentTypeControlOptions: List<FormControlOption<Participation>> + +consentItemModels: List<ConsentItemFormViewModel> + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titles: Map<FormMode, String> + +canTestScreener: bool + +canTestConsent: bool + +questionTitles: Map<FormMode, String Function()> - - - +Widget build() + + + +void setControlsFrom() + +EnrollmentFormData buildFormData() + +void read() + +List<ModelAction<dynamic>> availableActions() + +List<ModelAction<dynamic>> availablePopupActions() + +List<ModelAction<dynamic>> availableInlineActions() + +void onSelectItem() + +void onNewItem() + +ScreenerQuestionFormRouteArgs buildNewScreenerQuestionFormRouteArgs() + +ScreenerQuestionFormRouteArgs buildScreenerQuestionFormRouteArgs() + +ConsentItemFormRouteArgs buildNewConsentItemFormRouteArgs() + +ConsentItemFormRouteArgs buildConsentItemFormRouteArgs() + +dynamic testScreener() + +dynamic testConsent() + +ScreenerQuestionFormViewModel provideQuestionFormViewModel() - - - + + + + + - - - T Function(WidgetRef) + + + EnrollmentFormConsentItemDelegate + + + + + + +formViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData> + +owner: EnrollmentFormViewModel + +propagateOnSave: bool + +validationSet: dynamic + + + + + + +void onCancel() + +dynamic onSave() + +ConsentItemFormViewModel provide() + +List<ModelAction<dynamic>> availableActions() + +void onNewItem() + +void onSelectItem() - - - + + + + + - - - Widget Function(T) + + + StudyFormViewModel - - - - - - - - - SurveyQuestionFormView + + + +studyDirtyCopy: Study? + +studyRepository: IStudyRepository + +authRepository: IAuthRepository + +router: GoRouter + +studyInfoFormViewModel: StudyInfoFormViewModel + +enrollmentFormViewModel: EnrollmentFormViewModel + +measurementsFormViewModel: MeasurementsFormViewModel + +reportsFormViewModel: ReportsFormViewModel + +interventionsFormViewModel: InterventionsFormViewModel + +form: FormGroup + +isStudyReadonly: bool + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titles: Map<FormMode, String> - - - +formViewModel: QuestionFormViewModel - +isHtmlStyleable: bool + + + +void read() + +void setControlsFrom() + +Study buildFormData() + +void dispose() + +void onCancel() + +dynamic onSave() + -dynamic _applyAndSaveSubform() - - - - - - - - SurveyQuestionType - - + + + - - - +index: int - <static>+values: List<SurveyQuestionType> - <static>+choice: SurveyQuestionType - <static>+bool: SurveyQuestionType - <static>+scale: SurveyQuestionType - <static>+image: SurveyQuestionType - <static>+audio: SurveyQuestionType - <static>+freeText: SurveyQuestionType + + + IStudyRepository - - - + + + - - - AbstractControl + + + IAuthRepository - - - + + + - + QuestionFormData - + <static>+questionTypeFormDataFactories: Map<SurveyQuestionType, QuestionFormData Function(Question<dynamic>, List<EligibilityCriterion>)> +questionId: String @@ -4311,7 +4321,7 @@ - + +Question<dynamic> toQuestion() +EligibilityCriterion toEligibilityCriterion() @@ -4322,19 +4332,44 @@ + + + + + + + + SurveyQuestionType + + + + + + +index: int + <static>+values: List<SurveyQuestionType> + <static>+choice: SurveyQuestionType + <static>+bool: SurveyQuestionType + <static>+scale: SurveyQuestionType + <static>+image: SurveyQuestionType + <static>+audio: SurveyQuestionType + <static>+freeText: SurveyQuestionType + + + + - - - + + + - + ChoiceQuestionFormData - + +isMultipleChoice: bool +answerOptions: List<String> @@ -4342,7 +4377,7 @@ - + +Question<dynamic> toQuestion() +QuestionFormData copy() @@ -4354,24 +4389,24 @@ - - - + + + - + BoolQuestionFormData - + <static>+kResponseOptions: Map<String, bool> +responseOptions: List<String> - + +Question<dynamic> toQuestion() +BoolQuestionFormData copy() @@ -4382,24 +4417,24 @@ - - - + + + - + ImageQuestionFormData - + <static>+kResponseOptions: Map<String, FutureBlobFile> +responseOptions: List<String> - + +Question<dynamic> toQuestion() +ImageQuestionFormData copy() @@ -4410,17 +4445,17 @@ - - - + + + - + AudioQuestionFormData - + +maxRecordingDurationSeconds: int <static>+kResponseOptions: Map<String, FutureBlobFile> @@ -4428,7 +4463,7 @@ - + +Question<dynamic> toQuestion() +AudioQuestionFormData copy() @@ -4439,17 +4474,17 @@ - - - + + + - + ScaleQuestionFormData - + +minValue: double +maxValue: double @@ -4466,7 +4501,7 @@ - + +ScaleQuestion toQuestion() +QuestionFormData copy() @@ -4477,9 +4512,9 @@ - + - + Color @@ -4488,17 +4523,17 @@ - - - + + + - + FreeTextQuestionFormData - + +textLengthRange: List<int> +textType: FreeTextQuestionType @@ -4507,7 +4542,7 @@ - + +Question<dynamic> toQuestion() +FreeTextQuestionFormData copy() @@ -4518,71 +4553,60 @@ - + - + FreeTextQuestionType - - - - - - - - IScaleQuestionFormViewModel - - + + + + + - - - +isMidValuesClearedInfoVisible: bool + + + AudioRecordingQuestionFormView - - - - - - - - - ScaleQuestionFormView + + + +formViewModel: QuestionFormViewModel - - - +formViewModel: QuestionFormViewModel + + + +Widget build() - - - + + + - + FreeTextQuestionFormView - + +formViewModel: QuestionFormViewModel +generateLabelHelpTextMap: dynamic - + +Widget build() +Widget disableOnReadonly() @@ -4591,224 +4615,200 @@ - - - - - + + + + + - - - BoolQuestionFormView + + + ImageCapturingQuestionFormView - - - +formViewModel: QuestionFormViewModel + + + +formViewModel: QuestionFormViewModel - - - +Widget build() + + + +Widget build() - - - - - + + + + - - - AudioRecordingQuestionFormView + + + IScaleQuestionFormViewModel - - - +formViewModel: QuestionFormViewModel + + + +isMidValuesClearedInfoVisible: bool - - - +Widget build() + + + + + + + + + ScaleQuestionFormView + + + + + + +formViewModel: QuestionFormViewModel - - - + + + - + ChoiceQuestionFormView - + +formViewModel: QuestionFormViewModel - + +Widget build() - - - - - + + + + + - - - ImageCapturingQuestionFormView + + + BoolQuestionFormView - - - +formViewModel: QuestionFormViewModel + + + +formViewModel: QuestionFormViewModel - - - +Widget build() + + + +Widget build() - - - - - + + + - - - ScheduleControls + + + AbstractControl - - - +formViewModel: WithScheduleControls + + + + + + + + + SurveyQuestionFormView - - - +Widget build() - -List<FormTableRow> _conditionalTimeRestrictions() + + + +formViewModel: QuestionFormViewModel + +isHtmlStyleable: bool - + - + StudyUTimeOfDay - - - - - - - StreamSubscription - - - - - - - - - - - - - StudyFormViewModel - - + + + + + - - - +studyDirtyCopy: Study? - +studyRepository: IStudyRepository - +authRepository: IAuthRepository - +router: GoRouter - +studyInfoFormViewModel: StudyInfoFormViewModel - +enrollmentFormViewModel: EnrollmentFormViewModel - +measurementsFormViewModel: MeasurementsFormViewModel - +reportsFormViewModel: ReportsFormViewModel - +interventionsFormViewModel: InterventionsFormViewModel - +form: FormGroup - +isStudyReadonly: bool - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titles: Map<FormMode, String> + + + ScheduleControls - - - +void read() - +void setControlsFrom() - +Study buildFormData() - +void dispose() - +void onCancel() - +dynamic onSave() - -dynamic _applyAndSaveSubform() + + + +formViewModel: WithScheduleControls - - - - - - - - IStudyRepository + + + +Widget build() + -List<FormTableRow> _conditionalTimeRestrictions() - - - + + + - - - IAuthRepository + + + StreamSubscription - + - + StudyPageWidget From ef118dc351c60aa0e28a5e028bec7337a02d8499 Mon Sep 17 00:00:00 2001 From: Johannes Vedder Date: Mon, 13 May 2024 16:43:55 +0200 Subject: [PATCH 036/314] chore: format --- .../questionnaire/question/question_form_controller.dart | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/designer_v2/lib/features/design/shared/questionnaire/question/question_form_controller.dart b/designer_v2/lib/features/design/shared/questionnaire/question/question_form_controller.dart index 0cf3d6c9b..cdc0b995d 100644 --- a/designer_v2/lib/features/design/shared/questionnaire/question/question_form_controller.dart +++ b/designer_v2/lib/features/design/shared/questionnaire/question/question_form_controller.dart @@ -115,7 +115,11 @@ class QuestionFormViewModel extends ManagedFormViewModel late final FormArray audioResponseOptionsArray = FormArray(audioOptions); final FormControl maxRecordingDurationSecondsControl = FormControl( value: kDefaultMaxRecordingDurationSeconds, - validators: [Validators.number(allowNegatives: false), Validators.min(1), Validators.max(kMaxRecordingDurationSeconds)]); + validators: [ + Validators.number(allowNegatives: false), + Validators.min(1), + Validators.max(kMaxRecordingDurationSeconds) + ]); // Scale static const int kDefaultScaleMinValue = 0; From 9f4750c350d196c80e0692ef36950e3bc45f015e Mon Sep 17 00:00:00 2001 From: Johannes Vedder Date: Mon, 13 May 2024 17:27:03 +0200 Subject: [PATCH 037/314] chore(release): publish packages - studyu_core@4.4.2-dev.1 - studyu_app@2.7.4-dev.1 - studyu_designer_v2@1.8.0-dev.1 - studyu_flutter_common@1.8.3-dev.1 --- CHANGELOG.md | 36 ++++++++++++++++++++++++++++++++++++ app/CHANGELOG.md | 4 ++++ app/pubspec.yaml | 6 +++--- core/CHANGELOG.md | 4 ++++ core/pubspec.yaml | 2 +- designer_v2/CHANGELOG.md | 4 ++++ designer_v2/pubspec.yaml | 6 +++--- flutter_common/CHANGELOG.md | 4 ++++ flutter_common/pubspec.yaml | 4 ++-- 9 files changed, 61 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fac3f4242..e145354a8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,42 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## 2024-05-13 + +### Changes + +--- + +Packages with breaking changes: + + - There are no breaking changes in this release. + +Packages with other changes: + + - [`studyu_core` - `v4.4.2-dev.1`](#studyu_core---v442-dev1) + - [`studyu_app` - `v2.7.4-dev.1`](#studyu_app---v274-dev1) + - [`studyu_designer_v2` - `v1.8.0-dev.1`](#studyu_designer_v2---v180-dev1) + - [`studyu_flutter_common` - `v1.8.3-dev.1`](#studyu_flutter_common---v183-dev1) + +Packages with dependency updates only: + +> Packages listed below depend on other packages in this workspace that have had changes. Their versions have been incremented to bump the minimum dependency versions of the packages they depend upon in this project. + + - `studyu_app` - `v2.7.4-dev.1` + - `studyu_designer_v2` - `v1.8.0-dev.1` + - `studyu_flutter_common` - `v1.8.3-dev.1` + +--- + +#### `studyu_core` - `v4.4.2-dev.1` + + - **REFACTOR**: improved app config error handling. + +# Change Log + +All notable changes to this project will be documented in this file. +See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + ## 2024-04-29 ### Changes diff --git a/app/CHANGELOG.md b/app/CHANGELOG.md index 0aa8a48f3..d4d847b3d 100644 --- a/app/CHANGELOG.md +++ b/app/CHANGELOG.md @@ -1,3 +1,7 @@ +## 2.7.4-dev.1 + + - Update a dependency to the latest release. + ## 2.7.4-dev.0 - **FIX**: upgrade deps and migrate. diff --git a/app/pubspec.yaml b/app/pubspec.yaml index 0af37b3e9..cb616b323 100644 --- a/app/pubspec.yaml +++ b/app/pubspec.yaml @@ -1,5 +1,5 @@ name: studyu_app -version: 2.7.4-dev.0 +version: 2.7.4-dev.1 description: Partake in digital N-of-1 trials with the innovative StudyU Health App publish_to: none homepage: https://studyu.health @@ -38,8 +38,8 @@ dependencies: sentry_flutter: ^8.1.0 sentry_logging: ^8.1.0 shared_preferences: ^2.2.3 - studyu_core: ^4.4.2-dev.0 - studyu_flutter_common: ^1.8.3-dev.0 + studyu_core: ^4.4.2-dev.1 + studyu_flutter_common: ^1.8.3-dev.1 supabase: ^2.1.2 supabase_flutter: ^2.5.2 timeline_tile: ^2.0.0 diff --git a/core/CHANGELOG.md b/core/CHANGELOG.md index e4b68e9a5..85b3aa307 100644 --- a/core/CHANGELOG.md +++ b/core/CHANGELOG.md @@ -1,3 +1,7 @@ +## 4.4.2-dev.1 + + - **REFACTOR**: improved app config error handling. + ## 4.4.2-dev.0 - **FIX**: upgrade deps and migrate. diff --git a/core/pubspec.yaml b/core/pubspec.yaml index 64ab17b22..88cbd8704 100644 --- a/core/pubspec.yaml +++ b/core/pubspec.yaml @@ -1,5 +1,5 @@ name: studyu_core -version: 4.4.2-dev.0 +version: 4.4.2-dev.1 description: This package contains StudyU models and common functions for the app and designer packages homepage: https://studyu.health repository: https://github.com/hpi-studyu/studyu diff --git a/designer_v2/CHANGELOG.md b/designer_v2/CHANGELOG.md index 8793c2e3a..34f3595bc 100644 --- a/designer_v2/CHANGELOG.md +++ b/designer_v2/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.8.0-dev.1 + + - Update a dependency to the latest release. + ## 1.8.0-dev.0 - **FIX**: upgrade deps and migrate. diff --git a/designer_v2/pubspec.yaml b/designer_v2/pubspec.yaml index e31b647df..f7d669f75 100644 --- a/designer_v2/pubspec.yaml +++ b/designer_v2/pubspec.yaml @@ -1,5 +1,5 @@ name: studyu_designer_v2 -version: 1.8.0-dev.0 +version: 1.8.0-dev.1 description: Implement digital N-of-1 studies seamlessly with the StudyU Health Designer publish_to: none homepage: https://studyu.health @@ -32,8 +32,8 @@ dependencies: reactive_multi_select_flutter: ^2.0.1 reactive_range_slider: ^2.1.0 rxdart: ^0.27.7 - studyu_core: ^4.4.2-dev.0 - studyu_flutter_common: ^1.8.3-dev.0 + studyu_core: ^4.4.2-dev.1 + studyu_flutter_common: ^1.8.3-dev.1 supabase: ^2.1.2 supabase_flutter: ^2.5.2 url_launcher: ^6.2.6 diff --git a/flutter_common/CHANGELOG.md b/flutter_common/CHANGELOG.md index c7262f9c0..6de6c86db 100644 --- a/flutter_common/CHANGELOG.md +++ b/flutter_common/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.8.3-dev.1 + + - Update a dependency to the latest release. + ## 1.8.3-dev.0 - **FIX**: upgrade deps and migrate. diff --git a/flutter_common/pubspec.yaml b/flutter_common/pubspec.yaml index 296605606..5780c4758 100644 --- a/flutter_common/pubspec.yaml +++ b/flutter_common/pubspec.yaml @@ -1,5 +1,5 @@ name: studyu_flutter_common -version: 1.8.3-dev.0 +version: 1.8.3-dev.1 description: StudyU common flutter components and functions for app and designer homepage: https://studyu.health repository: https://github.com/hpi-studyu/studyu @@ -13,7 +13,7 @@ dependencies: flutter_dotenv: ^5.1.0 flutter_secure_storage: ^9.1.1 shared_preferences: ^2.2.3 # Can be removed after migrating phase - studyu_core: ^4.4.2-dev.0 + studyu_core: ^4.4.2-dev.1 supabase_flutter: ^2.5.2 synchronized: ^3.1.0+1 uuid: ^4.4.0 From 5895e3caa72764d08ef585e8d7371f21c5942b06 Mon Sep 17 00:00:00 2001 From: Johannes Vedder Date: Mon, 13 May 2024 17:31:34 +0200 Subject: [PATCH 038/314] chore: lock files --- app/pubspec.lock | 4 ++-- designer_v2/pubspec.lock | 4 ++-- flutter_common/pubspec.lock | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/app/pubspec.lock b/app/pubspec.lock index d8c5b9b1e..6e1f1ed70 100644 --- a/app/pubspec.lock +++ b/app/pubspec.lock @@ -1176,14 +1176,14 @@ packages: path: "../core" relative: true source: path - version: "4.4.2-dev.0" + version: "4.4.2-dev.1" studyu_flutter_common: dependency: "direct main" description: path: "../flutter_common" relative: true source: path - version: "1.8.3-dev.0" + version: "1.8.3-dev.1" supabase: dependency: "direct main" description: diff --git a/designer_v2/pubspec.lock b/designer_v2/pubspec.lock index c98bfe6dc..979c1231f 100644 --- a/designer_v2/pubspec.lock +++ b/designer_v2/pubspec.lock @@ -1039,14 +1039,14 @@ packages: path: "../core" relative: true source: path - version: "4.4.2-dev.0" + version: "4.4.2-dev.1" studyu_flutter_common: dependency: "direct main" description: path: "../flutter_common" relative: true source: path - version: "1.8.3-dev.0" + version: "1.8.3-dev.1" supabase: dependency: "direct main" description: diff --git a/flutter_common/pubspec.lock b/flutter_common/pubspec.lock index d9ab74a12..d220a5f26 100644 --- a/flutter_common/pubspec.lock +++ b/flutter_common/pubspec.lock @@ -547,7 +547,7 @@ packages: path: "../core" relative: true source: path - version: "4.4.2-dev.0" + version: "4.4.2-dev.1" supabase: dependency: transitive description: From 5625900efd3109c89d7a6d48e55475ea48267ac1 Mon Sep 17 00:00:00 2001 From: Johannes Vedder Date: Mon, 13 May 2024 17:45:06 +0200 Subject: [PATCH 039/314] chore(release): publish packages - studyu_app@2.7.4 - studyu_core@4.4.2 - studyu_designer_v2@1.8.0 - studyu_flutter_common@1.8.3 --- CHANGELOG.md | 38 +++++++++++++++++++++++++++++++++++++ app/CHANGELOG.md | 4 ++++ app/pubspec.yaml | 6 +++--- core/CHANGELOG.md | 4 ++++ core/pubspec.yaml | 2 +- designer_v2/CHANGELOG.md | 4 ++++ designer_v2/pubspec.yaml | 6 +++--- flutter_common/CHANGELOG.md | 4 ++++ flutter_common/pubspec.yaml | 4 ++-- 9 files changed, 63 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e145354a8..b6ad89708 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,44 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline --- +Packages with breaking changes: + + - [`studyu_app` - `v2.7.4`](#studyu_app---v274) + - [`studyu_core` - `v4.4.2`](#studyu_core---v442) + - [`studyu_flutter_common` - `v1.8.3`](#studyu_flutter_common---v183) + +Packages with other changes: + + - [`studyu_designer_v2` - `v1.8.0`](#studyu_designer_v2---v180) + +Packages graduated to a stable release (see pre-releases prior to the stable version for changelog entries): + + - `studyu_app` - `v2.7.4` + - `studyu_core` - `v4.4.2` + - `studyu_designer_v2` - `v1.8.0` + - `studyu_flutter_common` - `v1.8.3` + +--- + +#### `studyu_app` - `v2.7.4` + +#### `studyu_core` - `v4.4.2` + +#### `studyu_flutter_common` - `v1.8.3` + +#### `studyu_designer_v2` - `v1.8.0` + +# Change Log + +All notable changes to this project will be documented in this file. +See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +## 2024-05-13 + +### Changes + +--- + Packages with breaking changes: - There are no breaking changes in this release. diff --git a/app/CHANGELOG.md b/app/CHANGELOG.md index d4d847b3d..ac60e5485 100644 --- a/app/CHANGELOG.md +++ b/app/CHANGELOG.md @@ -1,3 +1,7 @@ +## 2.7.4 + + - Graduate package to a stable release. See pre-releases prior to this version for changelog entries. + ## 2.7.4-dev.1 - Update a dependency to the latest release. diff --git a/app/pubspec.yaml b/app/pubspec.yaml index cb616b323..f7cee3b47 100644 --- a/app/pubspec.yaml +++ b/app/pubspec.yaml @@ -1,5 +1,5 @@ name: studyu_app -version: 2.7.4-dev.1 +version: 2.7.4 description: Partake in digital N-of-1 trials with the innovative StudyU Health App publish_to: none homepage: https://studyu.health @@ -38,8 +38,8 @@ dependencies: sentry_flutter: ^8.1.0 sentry_logging: ^8.1.0 shared_preferences: ^2.2.3 - studyu_core: ^4.4.2-dev.1 - studyu_flutter_common: ^1.8.3-dev.1 + studyu_core: ^4.4.2 + studyu_flutter_common: ^1.8.3 supabase: ^2.1.2 supabase_flutter: ^2.5.2 timeline_tile: ^2.0.0 diff --git a/core/CHANGELOG.md b/core/CHANGELOG.md index 85b3aa307..7b8d97130 100644 --- a/core/CHANGELOG.md +++ b/core/CHANGELOG.md @@ -1,3 +1,7 @@ +## 4.4.2 + + - Graduate package to a stable release. See pre-releases prior to this version for changelog entries. + ## 4.4.2-dev.1 - **REFACTOR**: improved app config error handling. diff --git a/core/pubspec.yaml b/core/pubspec.yaml index 88cbd8704..c5361ac52 100644 --- a/core/pubspec.yaml +++ b/core/pubspec.yaml @@ -1,5 +1,5 @@ name: studyu_core -version: 4.4.2-dev.1 +version: 4.4.2 description: This package contains StudyU models and common functions for the app and designer packages homepage: https://studyu.health repository: https://github.com/hpi-studyu/studyu diff --git a/designer_v2/CHANGELOG.md b/designer_v2/CHANGELOG.md index 34f3595bc..dbe71f863 100644 --- a/designer_v2/CHANGELOG.md +++ b/designer_v2/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.8.0 + + - Graduate package to a stable release. See pre-releases prior to this version for changelog entries. + ## 1.8.0-dev.1 - Update a dependency to the latest release. diff --git a/designer_v2/pubspec.yaml b/designer_v2/pubspec.yaml index f7d669f75..4beebd13e 100644 --- a/designer_v2/pubspec.yaml +++ b/designer_v2/pubspec.yaml @@ -1,5 +1,5 @@ name: studyu_designer_v2 -version: 1.8.0-dev.1 +version: 1.8.0 description: Implement digital N-of-1 studies seamlessly with the StudyU Health Designer publish_to: none homepage: https://studyu.health @@ -32,8 +32,8 @@ dependencies: reactive_multi_select_flutter: ^2.0.1 reactive_range_slider: ^2.1.0 rxdart: ^0.27.7 - studyu_core: ^4.4.2-dev.1 - studyu_flutter_common: ^1.8.3-dev.1 + studyu_core: ^4.4.2 + studyu_flutter_common: ^1.8.3 supabase: ^2.1.2 supabase_flutter: ^2.5.2 url_launcher: ^6.2.6 diff --git a/flutter_common/CHANGELOG.md b/flutter_common/CHANGELOG.md index 6de6c86db..e15cea9e6 100644 --- a/flutter_common/CHANGELOG.md +++ b/flutter_common/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.8.3 + + - Graduate package to a stable release. See pre-releases prior to this version for changelog entries. + ## 1.8.3-dev.1 - Update a dependency to the latest release. diff --git a/flutter_common/pubspec.yaml b/flutter_common/pubspec.yaml index 5780c4758..18a4d95b7 100644 --- a/flutter_common/pubspec.yaml +++ b/flutter_common/pubspec.yaml @@ -1,5 +1,5 @@ name: studyu_flutter_common -version: 1.8.3-dev.1 +version: 1.8.3 description: StudyU common flutter components and functions for app and designer homepage: https://studyu.health repository: https://github.com/hpi-studyu/studyu @@ -13,7 +13,7 @@ dependencies: flutter_dotenv: ^5.1.0 flutter_secure_storage: ^9.1.1 shared_preferences: ^2.2.3 # Can be removed after migrating phase - studyu_core: ^4.4.2-dev.1 + studyu_core: ^4.4.2 supabase_flutter: ^2.5.2 synchronized: ^3.1.0+1 uuid: ^4.4.0 From 9cdcf10c225ad56d42da562f29d31f09d5651455 Mon Sep 17 00:00:00 2001 From: Johannes Vedder Date: Mon, 13 May 2024 17:45:39 +0200 Subject: [PATCH 040/314] chore: lock files --- app/pubspec.lock | 4 ++-- designer_v2/pubspec.lock | 4 ++-- flutter_common/pubspec.lock | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/app/pubspec.lock b/app/pubspec.lock index 6e1f1ed70..8fda1fbd1 100644 --- a/app/pubspec.lock +++ b/app/pubspec.lock @@ -1176,14 +1176,14 @@ packages: path: "../core" relative: true source: path - version: "4.4.2-dev.1" + version: "4.4.2" studyu_flutter_common: dependency: "direct main" description: path: "../flutter_common" relative: true source: path - version: "1.8.3-dev.1" + version: "1.8.3" supabase: dependency: "direct main" description: diff --git a/designer_v2/pubspec.lock b/designer_v2/pubspec.lock index 979c1231f..d76411159 100644 --- a/designer_v2/pubspec.lock +++ b/designer_v2/pubspec.lock @@ -1039,14 +1039,14 @@ packages: path: "../core" relative: true source: path - version: "4.4.2-dev.1" + version: "4.4.2" studyu_flutter_common: dependency: "direct main" description: path: "../flutter_common" relative: true source: path - version: "1.8.3-dev.1" + version: "1.8.3" supabase: dependency: "direct main" description: diff --git a/flutter_common/pubspec.lock b/flutter_common/pubspec.lock index d220a5f26..bfe5e83fe 100644 --- a/flutter_common/pubspec.lock +++ b/flutter_common/pubspec.lock @@ -547,7 +547,7 @@ packages: path: "../core" relative: true source: path - version: "4.4.2-dev.1" + version: "4.4.2" supabase: dependency: transitive description: From c989ec004aefb7a55fb842756eaf785c12b641b5 Mon Sep 17 00:00:00 2001 From: Johannes Vedder Date: Mon, 13 May 2024 18:13:34 +0200 Subject: [PATCH 041/314] fix: update podfile --- app/ios/Podfile.lock | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/app/ios/Podfile.lock b/app/ios/Podfile.lock index 2f2376adc..bf4adfc7d 100644 --- a/app/ios/Podfile.lock +++ b/app/ios/Podfile.lock @@ -26,13 +26,11 @@ PODS: - record_darwin (1.0.0): - Flutter - FlutterMacOS - - Sentry/HybridSDK (8.21.0): - - SentryPrivate (= 8.21.0) - - sentry_flutter (7.20.0): + - Sentry/HybridSDK (8.25.0) + - sentry_flutter (8.1.0): - Flutter - FlutterMacOS - - Sentry/HybridSDK (= 8.21.0) - - SentryPrivate (8.21.0) + - Sentry/HybridSDK (= 8.25.0) - shared_preferences_foundation (0.0.1): - Flutter - FlutterMacOS @@ -74,7 +72,6 @@ DEPENDENCIES: SPEC REPOS: trunk: - Sentry - - SentryPrivate EXTERNAL SOURCES: app_links: @@ -125,16 +122,15 @@ SPEC CHECKSUMS: Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7 flutter_file_dialog: 4c014a45b105709a27391e266c277d7e588e9299 flutter_local_notifications: 4cde75091f6327eb8517fa068a0a5950212d2086 - flutter_secure_storage: 23fc622d89d073675f2eaa109381aefbcf5a49be + flutter_secure_storage: d33dac7ae2ea08509be337e775f6b59f1ff45f12 flutter_timezone: ffb07bdad3c6276af8dada0f11978d8a1f8a20bb just_audio: baa7252489dbcf47a4c7cc9ca663e9661c99aafa package_info_plus: 58f0028419748fad15bf008b270aaa8e54380b1c path_provider_foundation: 3784922295ac71e43754bd15e0653ccfd36a147c permission_handler_apple: 9878588469a2b0d0fc1e048d9f43605f92e6cec2 record_darwin: 1f6619f2abac4d1ca91d3eeab038c980d76f1517 - Sentry: ebc12276bd17613a114ab359074096b6b3725203 - sentry_flutter: df6e28477322fc5202bbe20aafdd7404b6e97729 - SentryPrivate: d651efb234cf385ec9a1cdd3eff94b5e78a0e0fe + Sentry: cd86fc55628f5b7c572cabe66cc8f95a9d2f165a + sentry_flutter: ca7760fc008dc3bc2981730dc0c1d2f892178370 shared_preferences_foundation: b4c3b4cddf1c21f02770737f147a3f5da9d39695 sqflite: 673a0e54cc04b7d6dba8d24fb8095b31c3a99eec url_launcher_ios: 6116280ddcfe98ab8820085d8d76ae7449447586 From bcf6344f7d1dff6c47825ac62554f0178a29b659 Mon Sep 17 00:00:00 2001 From: Johannes Vedder Date: Mon, 13 May 2024 18:15:12 +0200 Subject: [PATCH 042/314] chore(release): publish packages - studyu_app@2.7.5 --- CHANGELOG.md | 21 +++++++++++++++++++++ app/CHANGELOG.md | 4 ++++ app/pubspec.yaml | 2 +- 3 files changed, 26 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b6ad89708..23f3fc9b7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,27 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## 2024-05-13 + +### Changes + +--- + +Packages with breaking changes: + + - There are no breaking changes in this release. + +Packages with other changes: + + - [`studyu_app` - `v2.7.5`](#studyu_app---v275) + +--- + +#### `studyu_app` - `v2.7.5` + + - **FIX**: update podfile. + + ## 2024-05-13 ### Changes diff --git a/app/CHANGELOG.md b/app/CHANGELOG.md index ac60e5485..cc511277d 100644 --- a/app/CHANGELOG.md +++ b/app/CHANGELOG.md @@ -1,3 +1,7 @@ +## 2.7.5 + + - **FIX**: update podfile. + ## 2.7.4 - Graduate package to a stable release. See pre-releases prior to this version for changelog entries. diff --git a/app/pubspec.yaml b/app/pubspec.yaml index f7cee3b47..8599dffca 100644 --- a/app/pubspec.yaml +++ b/app/pubspec.yaml @@ -1,5 +1,5 @@ name: studyu_app -version: 2.7.4 +version: 2.7.5 description: Partake in digital N-of-1 trials with the innovative StudyU Health App publish_to: none homepage: https://studyu.health From be5b9dee8929184c6d69fe2c5909d7aab94771b7 Mon Sep 17 00:00:00 2001 From: Johannes Vedder Date: Mon, 13 May 2024 14:42:43 +0200 Subject: [PATCH 043/314] chore: remove docs action --- .github/docker/db-docs.yml | 17 - .github/scripts/generate-uml.bash | 69 - .github/workflows/db-docs.yml | 41 - .github/workflows/uml-docs.yml | 43 - docs/README.md | 28 - docs/database/README.md | 295 - docs/database/auth.audit_log_entries.md | 35 - docs/database/auth.audit_log_entries.svg | 35 - docs/database/auth.instances.md | 35 - docs/database/auth.instances.svg | 38 - docs/database/auth.refresh_tokens.md | 40 - docs/database/auth.refresh_tokens.svg | 44 - docs/database/auth.schema_migrations.md | 31 - docs/database/auth.schema_migrations.svg | 26 - docs/database/auth.users.md | 61 - docs/database/auth.users.svg | 157 - .../database/extensions.pg_stat_statements.md | 117 - .../extensions.pg_stat_statements.svg | 152 - .../extensions.pg_stat_statements_info.md | 35 - .../extensions.pg_stat_statements_info.svg | 29 - docs/database/net._http_response.md | 30 - docs/database/net._http_response.svg | 47 - docs/database/net.http_request_queue.md | 22 - docs/database/net.http_request_queue.svg | 41 - docs/database/pgsodium.decrypted_key.md | 66 - docs/database/pgsodium.decrypted_key.svg | 65 - docs/database/pgsodium.key.md | 58 - docs/database/pgsodium.key.svg | 112 - docs/database/pgsodium.mask_columns.md | 49 - docs/database/pgsodium.mask_columns.svg | 44 - docs/database/pgsodium.masking_rule.md | 85 - docs/database/pgsodium.masking_rule.svg | 65 - docs/database/pgsodium.valid_key.md | 54 - docs/database/pgsodium.valid_key.svg | 50 - docs/database/public.app_config.md | 39 - docs/database/public.app_config.svg | 50 - docs/database/public.repo.md | 36 - docs/database/public.repo.svg | 139 - docs/database/public.study.md | 58 - docs/database/public.study.svg | 201 - docs/database/public.study_invite.md | 34 - docs/database/public.study_invite.svg | 148 - docs/database/public.study_progress_export.md | 53 - .../database/public.study_progress_export.svg | 53 - docs/database/public.study_subject.md | 38 - docs/database/public.study_subject.svg | 207 - docs/database/public.study_tag.md | 32 - docs/database/public.study_tag.svg | 130 - docs/database/public.subject_progress.md | 35 - docs/database/public.subject_progress.svg | 78 - docs/database/public.tag.md | 32 - docs/database/public.tag.svg | 51 - docs/database/public.user.md | 33 - docs/database/public.user.svg | 176 - docs/database/schema.json | 1 - docs/database/schema.svg | 1142 -- docs/database/storage.buckets.md | 35 - docs/database/storage.buckets.svg | 157 - docs/database/storage.migrations.md | 34 - docs/database/storage.migrations.svg | 35 - docs/database/storage.objects.md | 40 - docs/database/storage.objects.svg | 157 - docs/database/supabase_functions.hooks.md | 37 - docs/database/supabase_functions.hooks.svg | 38 - .../database/supabase_functions.migrations.md | 30 - .../supabase_functions.migrations.svg | 29 - docs/database/vault.decrypted_secrets.md | 56 - docs/database/vault.decrypted_secrets.svg | 50 - docs/database/vault.secrets.md | 46 - docs/database/vault.secrets.svg | 105 - docs/uml/app/lib/models/uml.svg | 14 - .../app/lib/screens/app_onboarding/uml.svg | 339 - .../study/dashboard/contact_tab/uml.svg | 309 - .../study/dashboard/task_overview_tab/uml.svg | 224 - .../app/lib/screens/study/dashboard/uml.svg | 732 - .../app/lib/screens/study/multimodal/uml.svg | 39 - .../app/lib/screens/study/onboarding/uml.svg | 721 - .../screens/study/report/performance/uml.svg | 291 - .../lib/screens/study/report/sections/uml.svg | 184 - docs/uml/app/lib/screens/study/report/uml.svg | 865 - .../app/lib/screens/study/report/util/uml.svg | 128 - .../screens/study/tasks/intervention/uml.svg | 72 - .../screens/study/tasks/observation/uml.svg | 72 - docs/uml/app/lib/screens/study/tasks/uml.svg | 168 - docs/uml/app/lib/screens/study/uml.svg | 2368 --- docs/uml/app/lib/screens/uml.svg | 2660 --- .../widgets/questionnaire/questions/uml.svg | 363 - .../uml/app/lib/widgets/questionnaire/uml.svg | 773 - docs/uml/app/lib/widgets/uml.svg | 1172 -- docs/uml/core/lib/src/env/uml.svg | 14 - docs/uml/core/lib/src/models/consent/uml.svg | 54 - docs/uml/core/lib/src/models/data/uml.svg | 52 - .../core/lib/src/models/eligibility/uml.svg | 12 - .../lib/src/models/expressions/types/uml.svg | 12 - .../core/lib/src/models/expressions/uml.svg | 12 - .../src/models/interventions/tasks/uml.svg | 12 - .../core/lib/src/models/interventions/uml.svg | 12 - .../lib/src/models/observations/tasks/uml.svg | 12 - .../core/lib/src/models/observations/uml.svg | 12 - .../models/questionnaire/questions/uml.svg | 12 - .../core/lib/src/models/questionnaire/uml.svg | 12 - .../lib/src/models/report/sections/uml.svg | 200 - docs/uml/core/lib/src/models/report/uml.svg | 306 - docs/uml/core/lib/src/models/results/uml.svg | 12 - .../src/models/study_results/results/uml.svg | 123 - .../core/lib/src/models/study_results/uml.svg | 156 - .../lib/src/models/study_schedule/uml.svg | 12 - docs/uml/core/lib/src/models/tables/uml.svg | 12 - docs/uml/core/lib/src/models/tasks/uml.svg | 12 - docs/uml/core/lib/src/models/uml.svg | 12 - docs/uml/core/lib/src/uml.svg | 12 - docs/uml/core/lib/src/util/multimodal/uml.svg | 50 - docs/uml/core/lib/src/util/uml.svg | 12 - docs/uml/core/lib/uml.svg | 12 - .../lib/common_views/pages/uml.svg | 84 - .../lib/common_views/sidesheet/uml.svg | 203 - docs/uml/designer_v2/lib/common_views/uml.svg | 3242 --- docs/uml/designer_v2/lib/domain/uml.svg | 229 - .../designer_v2/lib/features/account/uml.svg | 52 - .../designer_v2/lib/features/analyze/uml.svg | 92 - .../uml/designer_v2/lib/features/auth/uml.svg | 650 - .../lib/features/dashboard/uml.svg | 648 - .../lib/features/design/enrollment/uml.svg | 820 - .../lib/features/design/info/uml.svg | 319 - .../lib/features/design/interventions/uml.svg | 1004 - .../design/measurements/survey/uml.svg | 398 - .../lib/features/design/measurements/uml.svg | 645 - .../design/reports/section/types/uml.svg | 446 - .../features/design/reports/section/uml.svg | 705 - .../lib/features/design/reports/uml.svg | 1170 -- .../questionnaire/question/types/uml.svg | 272 - .../features/design/shared/schedule/uml.svg | 236 - .../designer_v2/lib/features/forms/uml.svg | 937 - .../designer_v2/lib/features/monitor/uml.svg | 52 - .../designer_v2/lib/features/publish/uml.svg | 106 - .../designer_v2/lib/features/recruit/uml.svg | 498 - .../lib/features/study/settings/uml.svg | 185 - .../designer_v2/lib/features/study/uml.svg | 1411 -- docs/uml/designer_v2/lib/features/uml.svg | 8823 --------- .../lib/localization/platform_locale/uml.svg | 95 - docs/uml/designer_v2/lib/localization/uml.svg | 234 - docs/uml/designer_v2/lib/repositories/uml.svg | 1725 -- docs/uml/designer_v2/lib/routing/uml.svg | 680 - docs/uml/designer_v2/lib/services/uml.svg | 518 - docs/uml/designer_v2/lib/uml.svg | 16246 ---------------- docs/uml/designer_v2/lib/utils/uml.svg | 1035 - docs/uml/flutter_common/lib/src/uml.svg | 299 - docs/uml/flutter_common/lib/src/utils/uml.svg | 299 - docs/uml/flutter_common/lib/uml.svg | 299 - 149 files changed, 63041 deletions(-) delete mode 100644 .github/docker/db-docs.yml delete mode 100755 .github/scripts/generate-uml.bash delete mode 100644 .github/workflows/db-docs.yml delete mode 100644 .github/workflows/uml-docs.yml delete mode 100644 docs/README.md delete mode 100644 docs/database/README.md delete mode 100644 docs/database/auth.audit_log_entries.md delete mode 100644 docs/database/auth.audit_log_entries.svg delete mode 100644 docs/database/auth.instances.md delete mode 100644 docs/database/auth.instances.svg delete mode 100644 docs/database/auth.refresh_tokens.md delete mode 100644 docs/database/auth.refresh_tokens.svg delete mode 100644 docs/database/auth.schema_migrations.md delete mode 100644 docs/database/auth.schema_migrations.svg delete mode 100644 docs/database/auth.users.md delete mode 100644 docs/database/auth.users.svg delete mode 100644 docs/database/extensions.pg_stat_statements.md delete mode 100644 docs/database/extensions.pg_stat_statements.svg delete mode 100644 docs/database/extensions.pg_stat_statements_info.md delete mode 100644 docs/database/extensions.pg_stat_statements_info.svg delete mode 100644 docs/database/net._http_response.md delete mode 100644 docs/database/net._http_response.svg delete mode 100644 docs/database/net.http_request_queue.md delete mode 100644 docs/database/net.http_request_queue.svg delete mode 100644 docs/database/pgsodium.decrypted_key.md delete mode 100644 docs/database/pgsodium.decrypted_key.svg delete mode 100644 docs/database/pgsodium.key.md delete mode 100644 docs/database/pgsodium.key.svg delete mode 100644 docs/database/pgsodium.mask_columns.md delete mode 100644 docs/database/pgsodium.mask_columns.svg delete mode 100644 docs/database/pgsodium.masking_rule.md delete mode 100644 docs/database/pgsodium.masking_rule.svg delete mode 100644 docs/database/pgsodium.valid_key.md delete mode 100644 docs/database/pgsodium.valid_key.svg delete mode 100644 docs/database/public.app_config.md delete mode 100644 docs/database/public.app_config.svg delete mode 100644 docs/database/public.repo.md delete mode 100644 docs/database/public.repo.svg delete mode 100644 docs/database/public.study.md delete mode 100644 docs/database/public.study.svg delete mode 100644 docs/database/public.study_invite.md delete mode 100644 docs/database/public.study_invite.svg delete mode 100644 docs/database/public.study_progress_export.md delete mode 100644 docs/database/public.study_progress_export.svg delete mode 100644 docs/database/public.study_subject.md delete mode 100644 docs/database/public.study_subject.svg delete mode 100644 docs/database/public.study_tag.md delete mode 100644 docs/database/public.study_tag.svg delete mode 100644 docs/database/public.subject_progress.md delete mode 100644 docs/database/public.subject_progress.svg delete mode 100644 docs/database/public.tag.md delete mode 100644 docs/database/public.tag.svg delete mode 100644 docs/database/public.user.md delete mode 100644 docs/database/public.user.svg delete mode 100644 docs/database/schema.json delete mode 100644 docs/database/schema.svg delete mode 100644 docs/database/storage.buckets.md delete mode 100644 docs/database/storage.buckets.svg delete mode 100644 docs/database/storage.migrations.md delete mode 100644 docs/database/storage.migrations.svg delete mode 100644 docs/database/storage.objects.md delete mode 100644 docs/database/storage.objects.svg delete mode 100644 docs/database/supabase_functions.hooks.md delete mode 100644 docs/database/supabase_functions.hooks.svg delete mode 100644 docs/database/supabase_functions.migrations.md delete mode 100644 docs/database/supabase_functions.migrations.svg delete mode 100644 docs/database/vault.decrypted_secrets.md delete mode 100644 docs/database/vault.decrypted_secrets.svg delete mode 100644 docs/database/vault.secrets.md delete mode 100644 docs/database/vault.secrets.svg delete mode 100644 docs/uml/app/lib/models/uml.svg delete mode 100644 docs/uml/app/lib/screens/app_onboarding/uml.svg delete mode 100644 docs/uml/app/lib/screens/study/dashboard/contact_tab/uml.svg delete mode 100644 docs/uml/app/lib/screens/study/dashboard/task_overview_tab/uml.svg delete mode 100644 docs/uml/app/lib/screens/study/dashboard/uml.svg delete mode 100644 docs/uml/app/lib/screens/study/multimodal/uml.svg delete mode 100644 docs/uml/app/lib/screens/study/onboarding/uml.svg delete mode 100644 docs/uml/app/lib/screens/study/report/performance/uml.svg delete mode 100644 docs/uml/app/lib/screens/study/report/sections/uml.svg delete mode 100644 docs/uml/app/lib/screens/study/report/uml.svg delete mode 100644 docs/uml/app/lib/screens/study/report/util/uml.svg delete mode 100644 docs/uml/app/lib/screens/study/tasks/intervention/uml.svg delete mode 100644 docs/uml/app/lib/screens/study/tasks/observation/uml.svg delete mode 100644 docs/uml/app/lib/screens/study/tasks/uml.svg delete mode 100644 docs/uml/app/lib/screens/study/uml.svg delete mode 100644 docs/uml/app/lib/screens/uml.svg delete mode 100644 docs/uml/app/lib/widgets/questionnaire/questions/uml.svg delete mode 100644 docs/uml/app/lib/widgets/questionnaire/uml.svg delete mode 100644 docs/uml/app/lib/widgets/uml.svg delete mode 100644 docs/uml/core/lib/src/env/uml.svg delete mode 100644 docs/uml/core/lib/src/models/consent/uml.svg delete mode 100644 docs/uml/core/lib/src/models/data/uml.svg delete mode 100644 docs/uml/core/lib/src/models/eligibility/uml.svg delete mode 100644 docs/uml/core/lib/src/models/expressions/types/uml.svg delete mode 100644 docs/uml/core/lib/src/models/expressions/uml.svg delete mode 100644 docs/uml/core/lib/src/models/interventions/tasks/uml.svg delete mode 100644 docs/uml/core/lib/src/models/interventions/uml.svg delete mode 100644 docs/uml/core/lib/src/models/observations/tasks/uml.svg delete mode 100644 docs/uml/core/lib/src/models/observations/uml.svg delete mode 100644 docs/uml/core/lib/src/models/questionnaire/questions/uml.svg delete mode 100644 docs/uml/core/lib/src/models/questionnaire/uml.svg delete mode 100644 docs/uml/core/lib/src/models/report/sections/uml.svg delete mode 100644 docs/uml/core/lib/src/models/report/uml.svg delete mode 100644 docs/uml/core/lib/src/models/results/uml.svg delete mode 100644 docs/uml/core/lib/src/models/study_results/results/uml.svg delete mode 100644 docs/uml/core/lib/src/models/study_results/uml.svg delete mode 100644 docs/uml/core/lib/src/models/study_schedule/uml.svg delete mode 100644 docs/uml/core/lib/src/models/tables/uml.svg delete mode 100644 docs/uml/core/lib/src/models/tasks/uml.svg delete mode 100644 docs/uml/core/lib/src/models/uml.svg delete mode 100644 docs/uml/core/lib/src/uml.svg delete mode 100644 docs/uml/core/lib/src/util/multimodal/uml.svg delete mode 100644 docs/uml/core/lib/src/util/uml.svg delete mode 100644 docs/uml/core/lib/uml.svg delete mode 100644 docs/uml/designer_v2/lib/common_views/pages/uml.svg delete mode 100644 docs/uml/designer_v2/lib/common_views/sidesheet/uml.svg delete mode 100644 docs/uml/designer_v2/lib/common_views/uml.svg delete mode 100644 docs/uml/designer_v2/lib/domain/uml.svg delete mode 100644 docs/uml/designer_v2/lib/features/account/uml.svg delete mode 100644 docs/uml/designer_v2/lib/features/analyze/uml.svg delete mode 100644 docs/uml/designer_v2/lib/features/auth/uml.svg delete mode 100644 docs/uml/designer_v2/lib/features/dashboard/uml.svg delete mode 100644 docs/uml/designer_v2/lib/features/design/enrollment/uml.svg delete mode 100644 docs/uml/designer_v2/lib/features/design/info/uml.svg delete mode 100644 docs/uml/designer_v2/lib/features/design/interventions/uml.svg delete mode 100644 docs/uml/designer_v2/lib/features/design/measurements/survey/uml.svg delete mode 100644 docs/uml/designer_v2/lib/features/design/measurements/uml.svg delete mode 100644 docs/uml/designer_v2/lib/features/design/reports/section/types/uml.svg delete mode 100644 docs/uml/designer_v2/lib/features/design/reports/section/uml.svg delete mode 100644 docs/uml/designer_v2/lib/features/design/reports/uml.svg delete mode 100644 docs/uml/designer_v2/lib/features/design/shared/questionnaire/question/types/uml.svg delete mode 100644 docs/uml/designer_v2/lib/features/design/shared/schedule/uml.svg delete mode 100644 docs/uml/designer_v2/lib/features/forms/uml.svg delete mode 100644 docs/uml/designer_v2/lib/features/monitor/uml.svg delete mode 100644 docs/uml/designer_v2/lib/features/publish/uml.svg delete mode 100644 docs/uml/designer_v2/lib/features/recruit/uml.svg delete mode 100644 docs/uml/designer_v2/lib/features/study/settings/uml.svg delete mode 100644 docs/uml/designer_v2/lib/features/study/uml.svg delete mode 100644 docs/uml/designer_v2/lib/features/uml.svg delete mode 100644 docs/uml/designer_v2/lib/localization/platform_locale/uml.svg delete mode 100644 docs/uml/designer_v2/lib/localization/uml.svg delete mode 100644 docs/uml/designer_v2/lib/repositories/uml.svg delete mode 100644 docs/uml/designer_v2/lib/routing/uml.svg delete mode 100644 docs/uml/designer_v2/lib/services/uml.svg delete mode 100644 docs/uml/designer_v2/lib/uml.svg delete mode 100644 docs/uml/designer_v2/lib/utils/uml.svg delete mode 100644 docs/uml/flutter_common/lib/src/uml.svg delete mode 100644 docs/uml/flutter_common/lib/src/utils/uml.svg delete mode 100644 docs/uml/flutter_common/lib/uml.svg diff --git a/.github/docker/db-docs.yml b/.github/docker/db-docs.yml deleted file mode 100644 index 5603897a0..000000000 --- a/.github/docker/db-docs.yml +++ /dev/null @@ -1,17 +0,0 @@ -version: '3' -name: 'studyu' - -services: - autodocs: - image: ghcr.io/k1low/tbls - depends_on: - db: - condition: service_healthy - command: - - doc - - --force - - postgres://postgres:${POSTGRES_PASSWORD}@supabase-db:${POSTGRES_PORT}/${POSTGRES_DB}?sslmode=disable - - output - working_dir: /work - volumes: - - ${DB_DOCS_DEST}:/work/output diff --git a/.github/scripts/generate-uml.bash b/.github/scripts/generate-uml.bash deleted file mode 100755 index a760082c5..000000000 --- a/.github/scripts/generate-uml.bash +++ /dev/null @@ -1,69 +0,0 @@ -#!/bin/bash - -# repo root at ../.. from this file's directory -root="$(realpath "$(dirname "$(realpath "$0")")/../..")" - -docs_dir="$root/docs/uml" - -# find directories whose umls need updates ------------------------------------- -# regenerating all umls every time is too slow - -# find latest commit that updated uml diagrams (or use initial commit) -prev_update="$(git log -n 1 --pretty=format:%H -- "$docs_dir")" -[[ -z "$prev_update" ]] && prev_update="$(git rev-list --max-parents=0 HEAD)" - -# associative array, keys will be all directories whose uml has to be -# regenerated -declare -A dirty -# get all directories that have changed since prev_update -for changed in $(git diff --name-only "$prev_update" \ - | grep --extended-regexp '(flutter_common|core|designer_v2|app)/lib/.*\.dart' \ - | xargs dirname \ - | sort --unique \ -); do - # set changed dir as dirty for all parents until we reach lib - while grep --extended-regexp -q '[^/]*/lib' <<< "$changed"; do - dirty[$changed]=1 - changed="$(dirname "$changed")" - done -done - -# generate needed umls --------------------------------------------------------- - -# temporary file for uml data -tmpf=$(mktemp) - -# iterate keys of dirty -for d in "${!dirty[@]}"; do - out="$docs_dir/$d/uml.svg" - # remove old uml if it exists - rm -rf "$out" - # skip to next if directory doesn't exist (i.e. git diff showed it because - # it was deleted - test -d "$root/$d" || continue - - echo "Generating diagram for $d" - - # ensure destination dir extists - mkdir -p "$(dirname "$out")" - - # go to package dir, i.e. first path component - cd "$root/$(cut -d/ -f1 <<< "$d")" || exit - # uml generator gets confused with generated files so we have to remove - # them - find . -type f -name '*.g.dart' -exec rm {} \; - - # generate uml & svg - dart pub global run dcdg \ - --exclude=State --exclude=StatefulWidget --exclude=StatelessWidget \ - -b nomnoml \ - -s "$(cut -d/ -f2- <<< "$d")" \ - > "$tmpf" - npx --yes nomnoml "$tmpf" "$out" - - # get deleted generated files back from git - git checkout HEAD -- . -done - -# remove temporary file -rm "$tmpf" diff --git a/.github/workflows/db-docs.yml b/.github/workflows/db-docs.yml deleted file mode 100644 index f54e9f55b..000000000 --- a/.github/workflows/db-docs.yml +++ /dev/null @@ -1,41 +0,0 @@ -name: Generate database docs - -on: - push: - branches: - - '**' - - '!dev' - - '!main' - paths: - - 'database/**' - - 'docker/supabase/**' - -concurrency: - group: ${{ github.ref }}-db-docs - cancel-in-progress: true - -jobs: - generate-docs: - runs-on: ubuntu-latest - steps: - - name: Check out repo - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - name: Generate documentation - env: - POSTGRES_PORT: 5432 - POSTGRES_PASSWORD: your-super-secret-and-long-postgres-password - POSTGRES_DB: postgres - DB_DOCS_DEST: ${{ github.workspace }}/docs/database - run: | - docker network create studyu_network || true - docker compose -f docker/supabase/docker-compose-db.yml -f .github/docker/db-docs.yml up --abort-on-container-exit - - - name: Commit documentation - run: | - git config --global user.name "StudyU Documenter" - git config --global user.email "studyu-documenter" - git add --all - git commit -m 'docs: update database documentation' || true - git push diff --git a/.github/workflows/uml-docs.yml b/.github/workflows/uml-docs.yml deleted file mode 100644 index 5577b47ea..000000000 --- a/.github/workflows/uml-docs.yml +++ /dev/null @@ -1,43 +0,0 @@ -name: Generate UML docs - -on: - push: - branches: - - '**' - - '!dev' - - '!main' - paths: - - 'flutter_common/**/*.dart' - - 'core/**/*.dart' - - 'designer_v2/**/*.dart' - - '!designer_v2/integration_test/**' - - '!designer_v2/test_driver/**' - - 'app/**/*.dart' - workflow_dispatch: - -concurrency: - group: ${{ github.ref }}-uml-docs - cancel-in-progress: true - -jobs: - generate-docs: - runs-on: ubuntu-latest - steps: - - name: "Check out repo" - uses: actions/checkout@v4 - with: - fetch-depth: 0 - token: ${{ secrets.READY_TO_MERGE_TOKEN }} - - name: Init workspace - uses: ./.github/workflows/init-workspace - - name: "Install dcdg" - run: dart pub global activate dcdg - - name: "Generate documentation" - run: bash .github/scripts/generate-uml.bash - - name: "Commit documentation" - run: | - git config --global user.name "StudyU Documenter" - git config --global user.email "studyu-documenter" - git add docs/uml - git commit -m 'docs: update UML documentation' || true - git push diff --git a/docs/README.md b/docs/README.md deleted file mode 100644 index 030cc4870..000000000 --- a/docs/README.md +++ /dev/null @@ -1,28 +0,0 @@ -# StudyU documentation - -To get an overview of the project and learn how to get started, please refer to -our [contribution guide](../CONTRIBUTING.md). - -The contents of this directory serve as more detailed and specific -documentation. - -## Automatically generated documentation - -The StudyU repository has GitHub workflows that automatically generate and -update - -- Documentation of the database in [database/](database), generated by the - [`db-docs.yml`](../.github/workflows/db-docs.yml) workflow -- UML diagrams for all dart code in [uml/](uml), organized in directories - analogous to the file structure of the code, generated by the - [`uml-docs.yml`](../.github/workflows/uml-docs.yml) workflow - -These documentation updates are committed to your branch while you are working -on it, meaning you should pull and rebase where appropriate to keep a clean -commit history. - -**Important note** The documentation workflows are designed to do as little work -as necessary by detecting which parts of the documentation need to be updated. -Manually committing anything to the [database/](database) or [uml/](uml) -directories may break this detection. If you have to make any changes there, -please make sure you understand how the respective workflow functions first. diff --git a/docs/database/README.md b/docs/database/README.md deleted file mode 100644 index 6d3d3bbf4..000000000 --- a/docs/database/README.md +++ /dev/null @@ -1,295 +0,0 @@ -# postgres - -## Tables - -| Name | Columns | Comment | Type | -| ---- | ------- | ------- | ---- | -| [auth.users](auth.users.md) | 21 | Auth: Stores user login data within a secure schema. | BASE TABLE | -| [auth.refresh_tokens](auth.refresh_tokens.md) | 7 | Auth: Store of tokens used to refresh JWT tokens once they expire. | BASE TABLE | -| [auth.instances](auth.instances.md) | 5 | Auth: Manages users across multiple sites. | BASE TABLE | -| [auth.audit_log_entries](auth.audit_log_entries.md) | 4 | Auth: Audit trail for user actions. | BASE TABLE | -| [auth.schema_migrations](auth.schema_migrations.md) | 1 | Auth: Manages updates to the auth system. | BASE TABLE | -| [storage.buckets](storage.buckets.md) | 5 | | BASE TABLE | -| [storage.objects](storage.objects.md) | 8 | | BASE TABLE | -| [storage.migrations](storage.migrations.md) | 4 | | BASE TABLE | -| [net.http_request_queue](net.http_request_queue.md) | 6 | | BASE TABLE | -| [net._http_response](net._http_response.md) | 8 | | BASE TABLE | -| [supabase_functions.migrations](supabase_functions.migrations.md) | 2 | | BASE TABLE | -| [supabase_functions.hooks](supabase_functions.hooks.md) | 5 | Supabase Functions Hooks: Audit trail for triggered hooks. | BASE TABLE | -| [public.study](public.study.md) | 21 | | BASE TABLE | -| [public.study_subject](public.study_subject.md) | 7 | | BASE TABLE | -| [public.app_config](public.app_config.md) | 9 | Stores app config for different envs | BASE TABLE | -| [public.repo](public.repo.md) | 4 | Git repo where the generated project is stored | BASE TABLE | -| [public.study_invite](public.study_invite.md) | 3 | Study invite codes | BASE TABLE | -| [public.subject_progress](public.subject_progress.md) | 6 | | BASE TABLE | -| [public.study_progress_export](public.study_progress_export.md) | 10 | | VIEW | -| [public.user](public.user.md) | 3 | Users get automatically added, when a new user is created in auth.users | BASE TABLE | -| [extensions.pg_stat_statements_info](extensions.pg_stat_statements_info.md) | 2 | | VIEW | -| [extensions.pg_stat_statements](extensions.pg_stat_statements.md) | 43 | | VIEW | -| [pgsodium.key](pgsodium.key.md) | 14 | This table holds metadata for derived keys given a key_id and key_context. The raw key is never stored. | BASE TABLE | -| [pgsodium.valid_key](pgsodium.valid_key.md) | 9 | | VIEW | -| [pgsodium.masking_rule](pgsodium.masking_rule.md) | 14 | | VIEW | -| [pgsodium.mask_columns](pgsodium.mask_columns.md) | 7 | | VIEW | -| [pgsodium.decrypted_key](pgsodium.decrypted_key.md) | 14 | | VIEW | -| [vault.secrets](vault.secrets.md) | 8 | Table with encrypted `secret` column for storing sensitive information on disk. | BASE TABLE | -| [vault.decrypted_secrets](vault.decrypted_secrets.md) | 9 | | VIEW | - -## Stored procedures and functions - -| Name | ReturnType | Arguments | Type | -| ---- | ------- | ------- | ---- | -| extensions.uuid_generate_v4 | uuid | | FUNCTION | -| pgbouncer.get_auth | record | p_usename text | FUNCTION | -| storage.filename | text | name text | FUNCTION | -| extensions.digest | bytea | text, text | FUNCTION | -| storage.foldername | _text | name text | FUNCTION | -| extensions.decrypt_iv | bytea | bytea, bytea, bytea, text | FUNCTION | -| storage.extension | text | name text | FUNCTION | -| extensions.gen_random_bytes | bytea | integer | FUNCTION | -| extensions.encrypt | bytea | bytea, bytea, text | FUNCTION | -| extensions.decrypt | bytea | bytea, bytea, text | FUNCTION | -| extensions.encrypt_iv | bytea | bytea, bytea, bytea, text | FUNCTION | -| extensions.gen_random_uuid | uuid | | FUNCTION | -| extensions.uuid_nil | uuid | | FUNCTION | -| extensions.uuid_ns_dns | uuid | | FUNCTION | -| storage.search | record | prefix text, bucketname text, limits integer DEFAULT 100, levels integer DEFAULT 1, offsets integer DEFAULT 0 | FUNCTION | -| extensions.uuid_ns_url | uuid | | FUNCTION | -| extensions.uuid_ns_oid | uuid | | FUNCTION | -| auth.uid | uuid | | FUNCTION | -| auth.email | text | | FUNCTION | -| extensions.uuid_generate_v3 | uuid | namespace uuid, name text | FUNCTION | -| extensions.uuid_ns_x500 | uuid | | FUNCTION | -| extensions.uuid_generate_v1 | uuid | | FUNCTION | -| extensions.uuid_generate_v1mc | uuid | | FUNCTION | -| net.check_worker_is_up | void | | FUNCTION | -| net._await_response | bool | request_id bigint | FUNCTION | -| net._urlencode_string | text | string character varying | FUNCTION | -| net._encode_url_with_params_array | text | url text, params_array text[] | FUNCTION | -| graphql.increment_schema_version | event_trigger | | FUNCTION | -| graphql.get_schema_version | int4 | | FUNCTION | -| graphql.resolve | jsonb | query text, variables jsonb DEFAULT '{}'::jsonb, "operationName" text DEFAULT NULL::text, extensions jsonb DEFAULT NULL::jsonb | FUNCTION | -| extensions.pgp_pub_decrypt_bytea | bytea | bytea, bytea, text | FUNCTION | -| extensions.pgp_pub_decrypt | text | bytea, bytea, text, text | FUNCTION | -| extensions.pgp_pub_decrypt_bytea | bytea | bytea, bytea, text, text | FUNCTION | -| net.http_delete | int8 | url text, params jsonb DEFAULT '{}'::jsonb, headers jsonb DEFAULT '{}'::jsonb, timeout_milliseconds integer DEFAULT 2000 | FUNCTION | -| net._http_collect_response | http_response_result | request_id bigint, async boolean DEFAULT true | FUNCTION | -| net.http_collect_response | http_response_result | request_id bigint, async boolean DEFAULT true | FUNCTION | -| supabase_functions.http_request | trigger | | FUNCTION | -| public.active_subject_count | int4 | study study | FUNCTION | -| public.can_edit | bool | user_id uuid, study_param study | FUNCTION | -| public.get_study_from_invite | record | invite_code text | FUNCTION | -| public.get_study_record_from_invite | study | invite_code text | FUNCTION | -| public.handle_new_user | trigger | | FUNCTION | -| public.has_study_ended | bool | psubject_id uuid | FUNCTION | -| public.has_results_public | bool | psubject_id uuid | FUNCTION | -| public.has_study_ended | bool | subject study_subject | FUNCTION | -| public.is_active_subject | bool | psubject_id uuid, days_active integer | FUNCTION | -| public.is_study_subject_of | bool | _user_id uuid, _study_id uuid | FUNCTION | -| public.last_completed_task | date | psubject_id uuid | FUNCTION | -| public.study_active_days | _int4 | study_param study | FUNCTION | -| public.study_ended_count | int4 | study study | FUNCTION | -| public.study_length | int4 | study_param study | FUNCTION | -| public.study_missed_days | _int4 | study_param study | FUNCTION | -| net.http_get | int8 | url text, params jsonb DEFAULT '{}'::jsonb, headers jsonb DEFAULT '{}'::jsonb, timeout_milliseconds integer DEFAULT 2000 | FUNCTION | -| extensions.pgp_sym_decrypt_bytea | bytea | bytea, text, text | FUNCTION | -| public.study_participant_count | int4 | study study | FUNCTION | -| public.study_total_tasks | int4 | subject study_subject | FUNCTION | -| public.subject_current_day | int4 | subject study_subject | FUNCTION | -| public.subject_total_active_days | int4 | subject study_subject | FUNCTION | -| public.user_email | text | user_id uuid | FUNCTION | -| extensions.pgp_pub_encrypt | bytea | text, bytea | FUNCTION | -| extensions.pgp_pub_encrypt_bytea | bytea | bytea, bytea | FUNCTION | -| extensions.pgp_pub_encrypt | bytea | text, bytea, text | FUNCTION | -| extensions.pgp_pub_encrypt_bytea | bytea | bytea, bytea, text | FUNCTION | -| extensions.pgp_pub_decrypt | text | bytea, bytea | FUNCTION | -| extensions.pgp_pub_decrypt_bytea | bytea | bytea, bytea | FUNCTION | -| extensions.pgp_pub_decrypt | text | bytea, bytea, text | FUNCTION | -| extensions.gen_salt | text | text, integer | FUNCTION | -| auth.role | text | | FUNCTION | -| extensions.uuid_generate_v5 | uuid | namespace uuid, name text | FUNCTION | -| extensions.digest | bytea | bytea, text | FUNCTION | -| extensions.hmac | bytea | text, text, text | FUNCTION | -| extensions.hmac | bytea | bytea, bytea, text | FUNCTION | -| extensions.crypt | text | text, text | FUNCTION | -| extensions.gen_salt | text | text | FUNCTION | -| extensions.sign | text | payload json, secret text, algorithm text DEFAULT 'HS256'::text | FUNCTION | -| extensions.pgrst_ddl_watch | event_trigger | | FUNCTION | -| graphql._internal_resolve | jsonb | query text, variables jsonb DEFAULT '{}'::jsonb, "operationName" text DEFAULT NULL::text, extensions jsonb DEFAULT NULL::jsonb | FUNCTION | -| graphql.exception | text | message text | FUNCTION | -| graphql.comment_directive | jsonb | comment_ text | FUNCTION | -| extensions.pgrst_drop_watch | event_trigger | | FUNCTION | -| graphql_public.graphql | jsonb | "operationName" text DEFAULT NULL::text, query text DEFAULT NULL::text, variables jsonb DEFAULT NULL::jsonb, extensions jsonb DEFAULT NULL::jsonb | FUNCTION | -| extensions.grant_pg_graphql_access | event_trigger | | FUNCTION | -| net.http_post | int8 | url text, body jsonb DEFAULT '{}'::jsonb, params jsonb DEFAULT '{}'::jsonb, headers jsonb DEFAULT '{"Content-Type": "application/json"}'::jsonb, timeout_milliseconds integer DEFAULT 2000 | FUNCTION | -| pgsodium.crypto_pwhash_saltgen | bytea | | FUNCTION | -| pgsodium.crypto_kx_client_session_keys | crypto_kx_session | client_pk bytea, client_sk bytea, server_pk bytea | FUNCTION | -| pgsodium.crypto_kx_server_session_keys | crypto_kx_session | server_pk bytea, server_sk bytea, client_pk bytea | FUNCTION | -| pgsodium.crypto_auth_hmacsha512_keygen | bytea | | FUNCTION | -| pgsodium.crypto_box_new_seed | bytea | | FUNCTION | -| pgsodium.crypto_sign_new_seed | bytea | | FUNCTION | -| pgsodium.derive_key | bytea | key_id bigint, key_len integer DEFAULT 32, context bytea DEFAULT '\x7067736f6469756d'::bytea | FUNCTION | -| pgsodium.pgsodium_derive | bytea | key_id bigint, key_len integer DEFAULT 32, context bytea DEFAULT decode('pgsodium'::text, 'escape'::text) | FUNCTION | -| pgsodium.randombytes_new_seed | bytea | | FUNCTION | -| pgsodium.crypto_secretbox_keygen | bytea | | FUNCTION | -| pgsodium.crypto_auth_keygen | bytea | | FUNCTION | -| pgsodium.crypto_box_noncegen | bytea | | FUNCTION | -| pgsodium.crypto_aead_ietf_keygen | bytea | | FUNCTION | -| pgsodium.crypto_shorthash_keygen | bytea | | FUNCTION | -| pgsodium.crypto_generichash_keygen | bytea | | FUNCTION | -| pgsodium.crypto_kdf_keygen | bytea | | FUNCTION | -| pgsodium.crypto_kx_new_keypair | crypto_kx_keypair | | FUNCTION | -| pgsodium.crypto_kx_new_seed | bytea | | FUNCTION | -| pgsodium.crypto_kx_seed_new_keypair | crypto_kx_keypair | seed bytea | FUNCTION | -| pgsodium.crypto_auth_hmacsha256_keygen | bytea | | FUNCTION | -| pgsodium.crypto_box_new_keypair | crypto_box_keypair | | FUNCTION | -| pgsodium.crypto_sign_new_keypair | crypto_sign_keypair | | FUNCTION | -| pgsodium.crypto_sign_init | bytea | | FUNCTION | -| pgsodium.crypto_sign_update | bytea | state bytea, message bytea | FUNCTION | -| pgsodium.randombytes_random | int4 | | FUNCTION | -| pgsodium.crypto_secretbox_noncegen | bytea | | FUNCTION | -| pgsodium.crypto_aead_ietf_noncegen | bytea | | FUNCTION | -| pgsodium.crypto_secretstream_keygen | bytea | | FUNCTION | -| pgsodium.crypto_stream_xchacha20_keygen | bytea | | FUNCTION | -| pgsodium.crypto_stream_xchacha20_noncegen | bytea | | FUNCTION | -| pgsodium.crypto_cmp | bool | text, text | FUNCTION | -| pgsodium.crypto_signcrypt_new_keypair | crypto_signcrypt_keypair | | FUNCTION | -| pgsodium.crypto_aead_det_encrypt | bytea | message bytea, additional bytea, key bytea, nonce bytea DEFAULT NULL::bytea | FUNCTION | -| pgsodium.crypto_aead_det_decrypt | bytea | ciphertext bytea, additional bytea, key bytea, nonce bytea DEFAULT NULL::bytea | FUNCTION | -| pgsodium.crypto_aead_det_encrypt | bytea | message bytea, additional bytea, key_id bigint, context bytea DEFAULT '\x7067736f6469756d'::bytea, nonce bytea DEFAULT NULL::bytea | FUNCTION | -| pgsodium.crypto_aead_det_decrypt | bytea | message bytea, additional bytea, key_id bigint, context bytea DEFAULT '\x7067736f6469756d'::bytea, nonce bytea DEFAULT NULL::bytea | FUNCTION | -| pgsodium.version | text | | FUNCTION | -| pgsodium.crypto_aead_det_noncegen | bytea | | FUNCTION | -| pgsodium.has_mask | bool | role regrole, source_name text | FUNCTION | -| pgsodium.mask_columns | record | source_relid oid | FUNCTION | -| pgsodium.crypto_sign_final_verify | bool | state bytea, signature bytea, key bytea | FUNCTION | -| pgsodium.create_mask_view | void | relid oid, debug boolean DEFAULT false | FUNCTION | -| pgsodium.create_key | valid_key | key_type pgsodium.key_type DEFAULT 'aead-det'::pgsodium.key_type, name text DEFAULT NULL::text, raw_key bytea DEFAULT NULL::bytea, raw_key_nonce bytea DEFAULT NULL::bytea, parent_key uuid DEFAULT NULL::uuid, key_context bytea DEFAULT '\x7067736f6469756d'::bytea, expires timestamp with time zone DEFAULT NULL::timestamp with time zone, associated_data text DEFAULT ''::text | FUNCTION | -| pgsodium.get_key_by_name | valid_key | text | FUNCTION | -| pgsodium.quote_assoc | text | text, boolean DEFAULT false | FUNCTION | -| pgsodium.crypto_sign_open | bytea | signed_message bytea, key bytea | FUNCTION | -| pgsodium.crypto_kdf_derive_from_key | bytea | subkey_size integer, subkey_id bigint, context bytea, primary_key uuid | FUNCTION | -| pgsodium.get_named_keys | valid_key | filter text DEFAULT '%'::text | FUNCTION | -| pgsodium.crypto_aead_det_encrypt | bytea | message bytea, additional bytea, key_uuid uuid | FUNCTION | -| pgsodium.crypto_aead_det_decrypt | bytea | message bytea, additional bytea, key_uuid uuid | FUNCTION | -| pgsodium.crypto_aead_ietf_encrypt | bytea | message bytea, additional bytea, nonce bytea, key_id bigint, context bytea DEFAULT '\x7067736f6469756d'::bytea | FUNCTION | -| pgsodium.get_key_by_id | valid_key | uuid | FUNCTION | -| pgsodium.enable_security_label_trigger | void | | FUNCTION | -| pgsodium.disable_security_label_trigger | void | | FUNCTION | -| pgsodium.update_mask | void | target oid, debug boolean DEFAULT false | FUNCTION | -| pgsodium.crypto_sign_update_agg1 | bytea | state bytea, message bytea | FUNCTION | -| pgsodium.crypto_sign_update_agg2 | bytea | cur_state bytea, initial_state bytea, message bytea | FUNCTION | -| pgsodium.crypto_sign_update_agg | bytea | message bytea | a | -| pgsodium.crypto_sign_update_agg | bytea | state bytea, message bytea | a | -| pgsodium.encrypted_columns | text | relid oid | FUNCTION | -| pgsodium.decrypted_columns | text | relid oid | FUNCTION | -| pgsodium.crypto_aead_ietf_encrypt | bytea | message bytea, additional bytea, nonce bytea, key bytea | FUNCTION | -| pgsodium.crypto_aead_ietf_encrypt | bytea | message bytea, additional bytea, nonce bytea, key_uuid uuid | FUNCTION | -| pgsodium.crypto_aead_ietf_decrypt | bytea | message bytea, additional bytea, nonce bytea, key bytea | FUNCTION | -| pgsodium.crypto_aead_ietf_decrypt | bytea | message bytea, additional bytea, nonce bytea, key_id bigint, context bytea DEFAULT '\x7067736f6469756d'::bytea | FUNCTION | -| pgsodium.crypto_aead_ietf_decrypt | bytea | message bytea, additional bytea, nonce bytea, key_uuid uuid | FUNCTION | -| pgsodium.crypto_auth | bytea | message bytea, key bytea | FUNCTION | -| pgsodium.crypto_auth | bytea | message bytea, key_id bigint, context bytea DEFAULT '\x7067736f6469756d'::bytea | FUNCTION | -| pgsodium.crypto_auth | bytea | message bytea, key_uuid uuid | FUNCTION | -| pgsodium.crypto_auth_verify | bool | mac bytea, message bytea, key bytea | FUNCTION | -| pgsodium.crypto_auth_verify | bool | mac bytea, message bytea, key_id bigint, context bytea DEFAULT '\x7067736f6469756d'::bytea | FUNCTION | -| pgsodium.crypto_auth_verify | bool | mac bytea, message bytea, key_uuid uuid | FUNCTION | -| pgsodium.crypto_box_seed_new_keypair | crypto_box_keypair | seed bytea | FUNCTION | -| pgsodium.crypto_box | bytea | message bytea, nonce bytea, public bytea, secret bytea | FUNCTION | -| pgsodium.crypto_box_open | bytea | ciphertext bytea, nonce bytea, public bytea, secret bytea | FUNCTION | -| pgsodium.crypto_box_seal | bytea | message bytea, public_key bytea | FUNCTION | -| pgsodium.crypto_box_seal_open | bytea | ciphertext bytea, public_key bytea, secret_key bytea | FUNCTION | -| pgsodium.crypto_generichash | bytea | message bytea, key bigint, context bytea DEFAULT '\x7067736f6469756d'::bytea | FUNCTION | -| pgsodium.crypto_generichash | bytea | message bytea, key bytea DEFAULT NULL::bytea | FUNCTION | -| pgsodium.crypto_generichash | bytea | message bytea, key_uuid uuid | FUNCTION | -| pgsodium.crypto_shorthash | bytea | message bytea, key bigint, context bytea DEFAULT '\x7067736f6469756d'::bytea | FUNCTION | -| pgsodium.crypto_shorthash | bytea | message bytea, key bytea | FUNCTION | -| pgsodium.crypto_shorthash | bytea | message bytea, key_uuid uuid | FUNCTION | -| pgsodium.sodium_bin2base64 | text | bin bytea | FUNCTION | -| pgsodium.sodium_base642bin | bytea | base64 text | FUNCTION | -| pgsodium.crypto_auth_hmacsha512 | bytea | message bytea, secret bytea | FUNCTION | -| pgsodium.crypto_auth_hmacsha512 | bytea | message bytea, key_id bigint, context bytea DEFAULT '\x7067736f6469756d'::bytea | FUNCTION | -| pgsodium.crypto_auth_hmacsha512 | bytea | message bytea, key_uuid uuid | FUNCTION | -| pgsodium.crypto_auth_hmacsha512_verify | bool | hash bytea, message bytea, secret bytea | FUNCTION | -| pgsodium.crypto_auth_hmacsha512_verify | bool | hash bytea, message bytea, key_id bigint, context bytea DEFAULT '\x7067736f6469756d'::bytea | FUNCTION | -| pgsodium.crypto_auth_hmacsha512_verify | bool | signature bytea, message bytea, key_uuid uuid | FUNCTION | -| pgsodium.crypto_auth_hmacsha256 | bytea | message bytea, secret bytea | FUNCTION | -| pgsodium.crypto_auth_hmacsha256 | bytea | message bytea, key_id bigint, context bytea DEFAULT '\x7067736f6469756d'::bytea | FUNCTION | -| pgsodium.crypto_auth_hmacsha256 | bytea | message bytea, key_uuid uuid | FUNCTION | -| pgsodium.crypto_auth_hmacsha256_verify | bool | hash bytea, message bytea, secret bytea | FUNCTION | -| pgsodium.crypto_sign_final_create | bytea | state bytea, key bytea | FUNCTION | -| pgsodium.crypto_auth_hmacsha256_verify | bool | hash bytea, message bytea, key_id bigint, context bytea DEFAULT '\x7067736f6469756d'::bytea | FUNCTION | -| pgsodium.crypto_auth_hmacsha256_verify | bool | signature bytea, message bytea, key_uuid uuid | FUNCTION | -| pgsodium.crypto_kdf_derive_from_key | bytea | subkey_size bigint, subkey_id bigint, context bytea, primary_key bytea | FUNCTION | -| pgsodium.crypto_pwhash | bytea | password bytea, salt bytea | FUNCTION | -| pgsodium.crypto_pwhash_str | bytea | password bytea | FUNCTION | -| pgsodium.crypto_pwhash_str_verify | bool | hashed_password bytea, password bytea | FUNCTION | -| pgsodium.randombytes_uniform | int4 | upper_bound integer | FUNCTION | -| pgsodium.randombytes_buf | bytea | size integer | FUNCTION | -| pgsodium.randombytes_buf_deterministic | bytea | size integer, seed bytea | FUNCTION | -| pgsodium.crypto_secretbox | bytea | message bytea, nonce bytea, key bytea | FUNCTION | -| pgsodium.crypto_secretbox | bytea | message bytea, nonce bytea, key_id bigint, context bytea DEFAULT '\x7067736f6469756d'::bytea | FUNCTION | -| pgsodium.crypto_secretbox | bytea | message bytea, nonce bytea, key_uuid uuid | FUNCTION | -| pgsodium.crypto_secretbox_open | bytea | ciphertext bytea, nonce bytea, key bytea | FUNCTION | -| pgsodium.crypto_secretbox_open | bytea | message bytea, nonce bytea, key_id bigint, context bytea DEFAULT '\x7067736f6469756d'::bytea | FUNCTION | -| pgsodium.crypto_secretbox_open | bytea | message bytea, nonce bytea, key_uuid uuid | FUNCTION | -| pgsodium.crypto_hash_sha256 | bytea | message bytea | FUNCTION | -| pgsodium.crypto_hash_sha512 | bytea | message bytea | FUNCTION | -| pgsodium.crypto_sign | bytea | message bytea, key bytea | FUNCTION | -| pgsodium.crypto_sign_detached | bytea | message bytea, key bytea | FUNCTION | -| pgsodium.crypto_sign_seed_new_keypair | crypto_sign_keypair | seed bytea | FUNCTION | -| pgsodium.crypto_sign_verify_detached | bool | sig bytea, message bytea, key bytea | FUNCTION | -| pgsodium.crypto_signcrypt_sign_after | bytea | state bytea, sender_sk bytea, ciphertext bytea | FUNCTION | -| pgsodium.crypto_signcrypt_sign_before | crypto_signcrypt_state_key | sender bytea, recipient bytea, sender_sk bytea, recipient_pk bytea, additional bytea | FUNCTION | -| pgsodium.crypto_signcrypt_verify_after | bool | state bytea, signature bytea, sender_pk bytea, ciphertext bytea | FUNCTION | -| pgsodium.crypto_signcrypt_verify_before | crypto_signcrypt_state_key | signature bytea, sender bytea, recipient bytea, additional bytea, sender_pk bytea, recipient_sk bytea | FUNCTION | -| pgsodium.crypto_signcrypt_verify_public | bool | signature bytea, sender bytea, recipient bytea, additional bytea, sender_pk bytea, ciphertext bytea | FUNCTION | -| pgsodium.crypto_stream_xchacha20 | bytea | bigint, bytea, bytea | FUNCTION | -| pgsodium.crypto_stream_xchacha20 | bytea | bigint, bytea, bigint, context bytea DEFAULT '\x7067736f6469756d'::bytea | FUNCTION | -| pgsodium.crypto_stream_xchacha20_xor | bytea | bytea, bytea, bytea | FUNCTION | -| pgsodium.crypto_stream_xchacha20_xor | bytea | bytea, bytea, bigint, context bytea DEFAULT '\x70676f736469756d'::bytea | FUNCTION | -| pgsodium.crypto_stream_xchacha20_xor_ic | bytea | bytea, bytea, bigint, bytea | FUNCTION | -| pgsodium.crypto_stream_xchacha20_xor_ic | bytea | bytea, bytea, bigint, bigint, context bytea DEFAULT '\x7067736f6469756d'::bytea | FUNCTION | -| pgsodium.encrypted_column | text | relid oid, m record | FUNCTION | -| pgsodium.update_masks | void | debug boolean DEFAULT false | FUNCTION | -| pgsodium.key_encrypt_secret_raw_key | trigger | | FUNCTION | -| pgsodium.mask_role | void | masked_role regrole, source_name text, view_name text | FUNCTION | -| pgsodium.create_mask_view | void | relid oid, subid integer, debug boolean DEFAULT false | FUNCTION | -| pgsodium.trg_mask_update | event_trigger | | FUNCTION | -| pgsodium.crypto_aead_det_decrypt | bytea | message bytea, additional bytea, key_uuid uuid, nonce bytea | FUNCTION | -| pgsodium.crypto_aead_det_encrypt | bytea | message bytea, additional bytea, key_uuid uuid, nonce bytea | FUNCTION | -| pgsodium.crypto_aead_det_keygen | bytea | | FUNCTION | -| vault.secrets_encrypt_secret_secret | trigger | | FUNCTION | -| vault.create_secret | uuid | new_secret text, new_name text DEFAULT NULL::text, new_description text DEFAULT ''::text, new_key_id uuid DEFAULT NULL::uuid | FUNCTION | -| vault.update_secret | void | secret_id uuid, new_secret text DEFAULT NULL::text, new_name text DEFAULT NULL::text, new_description text DEFAULT NULL::text, new_key_id uuid DEFAULT NULL::uuid | FUNCTION | -| extensions.pgp_key_id | text | bytea | FUNCTION | -| extensions.armor | text | bytea | FUNCTION | -| extensions.armor | text | bytea, text[], text[] | FUNCTION | -| extensions.dearmor | bytea | text | FUNCTION | -| extensions.pgp_armor_headers | record | text, OUT key text, OUT value text | FUNCTION | -| extensions.url_encode | text | data bytea | FUNCTION | -| extensions.url_decode | bytea | data text | FUNCTION | -| extensions.try_cast_double | float8 | inp text | FUNCTION | -| extensions.moddatetime | trigger | | FUNCTION | -| extensions.pgp_sym_encrypt | bytea | text, text | FUNCTION | -| extensions.pgp_sym_encrypt_bytea | bytea | bytea, text | FUNCTION | -| extensions.pgp_sym_encrypt | bytea | text, text, text | FUNCTION | -| extensions.pgp_sym_encrypt_bytea | bytea | bytea, text, text | FUNCTION | -| extensions.pgp_sym_decrypt | text | bytea, text | FUNCTION | -| extensions.pgp_sym_decrypt_bytea | bytea | bytea, text | FUNCTION | -| extensions.pgp_sym_decrypt | text | bytea, text, text | FUNCTION | -| extensions.algorithm_sign | text | signables text, secret text, algorithm text | FUNCTION | -| extensions.verify | record | token text, secret text, algorithm text DEFAULT 'HS256'::text | FUNCTION | -| extensions.grant_pg_cron_access | event_trigger | | FUNCTION | -| extensions.grant_pg_net_access | event_trigger | | FUNCTION | -| extensions.pg_stat_statements_reset | void | userid oid DEFAULT 0, dbid oid DEFAULT 0, queryid bigint DEFAULT 0 | FUNCTION | -| extensions.pg_stat_statements_info | record | OUT dealloc bigint, OUT stats_reset timestamp with time zone | FUNCTION | -| extensions.pg_stat_statements | record | showtext boolean, OUT userid oid, OUT dbid oid, OUT toplevel boolean, OUT queryid bigint, OUT query text, OUT plans bigint, OUT total_plan_time double precision, OUT min_plan_time double precision, OUT max_plan_time double precision, OUT mean_plan_time double precision, OUT stddev_plan_time double precision, OUT calls bigint, OUT total_exec_time double precision, OUT min_exec_time double precision, OUT max_exec_time double precision, OUT mean_exec_time double precision, OUT stddev_exec_time double precision, OUT rows bigint, OUT shared_blks_hit bigint, OUT shared_blks_read bigint, OUT shared_blks_dirtied bigint, OUT shared_blks_written bigint, OUT local_blks_hit bigint, OUT local_blks_read bigint, OUT local_blks_dirtied bigint, OUT local_blks_written bigint, OUT temp_blks_read bigint, OUT temp_blks_written bigint, OUT blk_read_time double precision, OUT blk_write_time double precision, OUT temp_blk_read_time double precision, OUT temp_blk_write_time double precision, OUT wal_records bigint, OUT wal_fpi bigint, OUT wal_bytes numeric, OUT jit_functions bigint, OUT jit_generation_time double precision, OUT jit_inlining_count bigint, OUT jit_inlining_time double precision, OUT jit_optimization_count bigint, OUT jit_optimization_time double precision, OUT jit_emission_count bigint, OUT jit_emission_time double precision | FUNCTION | -| extensions.set_graphql_placeholder | event_trigger | | FUNCTION | - -## Relations - -![er](schema.svg) - ---- - -> Generated by [tbls](https://github.com/k1LoW/tbls) diff --git a/docs/database/auth.audit_log_entries.md b/docs/database/auth.audit_log_entries.md deleted file mode 100644 index 5753c1844..000000000 --- a/docs/database/auth.audit_log_entries.md +++ /dev/null @@ -1,35 +0,0 @@ -# auth.audit_log_entries - -## Description - -Auth: Audit trail for user actions. - -## Columns - -| Name | Type | Default | Nullable | Children | Parents | Comment | -| ---- | ---- | ------- | -------- | -------- | ------- | ------- | -| instance_id | uuid | | true | | | | -| id | uuid | | false | | | | -| payload | json | | true | | | | -| created_at | timestamp with time zone | | true | | | | - -## Constraints - -| Name | Type | Definition | -| ---- | ---- | ---------- | -| audit_log_entries_pkey | PRIMARY KEY | PRIMARY KEY (id) | - -## Indexes - -| Name | Definition | -| ---- | ---------- | -| audit_log_entries_pkey | CREATE UNIQUE INDEX audit_log_entries_pkey ON auth.audit_log_entries USING btree (id) | -| audit_logs_instance_id_idx | CREATE INDEX audit_logs_instance_id_idx ON auth.audit_log_entries USING btree (instance_id) | - -## Relations - -![er](auth.audit_log_entries.svg) - ---- - -> Generated by [tbls](https://github.com/k1LoW/tbls) diff --git a/docs/database/auth.audit_log_entries.svg b/docs/database/auth.audit_log_entries.svg deleted file mode 100644 index 64855f6ea..000000000 --- a/docs/database/auth.audit_log_entries.svg +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - -auth.audit_log_entries - - - -auth.audit_log_entries - - -auth.audit_log_entries -     -[BASE TABLE] - -instance_id -[uuid] - -id -[uuid] - -payload -[json] - -created_at -[timestamp with time zone] - - - - diff --git a/docs/database/auth.instances.md b/docs/database/auth.instances.md deleted file mode 100644 index fd7b006fc..000000000 --- a/docs/database/auth.instances.md +++ /dev/null @@ -1,35 +0,0 @@ -# auth.instances - -## Description - -Auth: Manages users across multiple sites. - -## Columns - -| Name | Type | Default | Nullable | Children | Parents | Comment | -| ---- | ---- | ------- | -------- | -------- | ------- | ------- | -| id | uuid | | false | | | | -| uuid | uuid | | true | | | | -| raw_base_config | text | | true | | | | -| created_at | timestamp with time zone | | true | | | | -| updated_at | timestamp with time zone | | true | | | | - -## Constraints - -| Name | Type | Definition | -| ---- | ---- | ---------- | -| instances_pkey | PRIMARY KEY | PRIMARY KEY (id) | - -## Indexes - -| Name | Definition | -| ---- | ---------- | -| instances_pkey | CREATE UNIQUE INDEX instances_pkey ON auth.instances USING btree (id) | - -## Relations - -![er](auth.instances.svg) - ---- - -> Generated by [tbls](https://github.com/k1LoW/tbls) diff --git a/docs/database/auth.instances.svg b/docs/database/auth.instances.svg deleted file mode 100644 index 1de2be15a..000000000 --- a/docs/database/auth.instances.svg +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - -auth.instances - - - -auth.instances - - -auth.instances -     -[BASE TABLE] - -id -[uuid] - -uuid -[uuid] - -raw_base_config -[text] - -created_at -[timestamp with time zone] - -updated_at -[timestamp with time zone] - - - - diff --git a/docs/database/auth.refresh_tokens.md b/docs/database/auth.refresh_tokens.md deleted file mode 100644 index db4b1aca0..000000000 --- a/docs/database/auth.refresh_tokens.md +++ /dev/null @@ -1,40 +0,0 @@ -# auth.refresh_tokens - -## Description - -Auth: Store of tokens used to refresh JWT tokens once they expire. - -## Columns - -| Name | Type | Default | Nullable | Children | Parents | Comment | -| ---- | ---- | ------- | -------- | -------- | ------- | ------- | -| instance_id | uuid | | true | | | | -| id | bigint | nextval('auth.refresh_tokens_id_seq'::regclass) | false | | | | -| token | varchar(255) | | true | | | | -| user_id | varchar(255) | | true | | | | -| revoked | boolean | | true | | | | -| created_at | timestamp with time zone | | true | | | | -| updated_at | timestamp with time zone | | true | | | | - -## Constraints - -| Name | Type | Definition | -| ---- | ---- | ---------- | -| refresh_tokens_pkey | PRIMARY KEY | PRIMARY KEY (id) | - -## Indexes - -| Name | Definition | -| ---- | ---------- | -| refresh_tokens_pkey | CREATE UNIQUE INDEX refresh_tokens_pkey ON auth.refresh_tokens USING btree (id) | -| refresh_tokens_instance_id_idx | CREATE INDEX refresh_tokens_instance_id_idx ON auth.refresh_tokens USING btree (instance_id) | -| refresh_tokens_instance_id_user_id_idx | CREATE INDEX refresh_tokens_instance_id_user_id_idx ON auth.refresh_tokens USING btree (instance_id, user_id) | -| refresh_tokens_token_idx | CREATE INDEX refresh_tokens_token_idx ON auth.refresh_tokens USING btree (token) | - -## Relations - -![er](auth.refresh_tokens.svg) - ---- - -> Generated by [tbls](https://github.com/k1LoW/tbls) diff --git a/docs/database/auth.refresh_tokens.svg b/docs/database/auth.refresh_tokens.svg deleted file mode 100644 index a9e4582f5..000000000 --- a/docs/database/auth.refresh_tokens.svg +++ /dev/null @@ -1,44 +0,0 @@ - - - - - - -auth.refresh_tokens - - - -auth.refresh_tokens - - -auth.refresh_tokens -     -[BASE TABLE] - -instance_id -[uuid] - -id -[bigint] - -token -[varchar(255)] - -user_id -[varchar(255)] - -revoked -[boolean] - -created_at -[timestamp with time zone] - -updated_at -[timestamp with time zone] - - - - diff --git a/docs/database/auth.schema_migrations.md b/docs/database/auth.schema_migrations.md deleted file mode 100644 index d765593a2..000000000 --- a/docs/database/auth.schema_migrations.md +++ /dev/null @@ -1,31 +0,0 @@ -# auth.schema_migrations - -## Description - -Auth: Manages updates to the auth system. - -## Columns - -| Name | Type | Default | Nullable | Children | Parents | Comment | -| ---- | ---- | ------- | -------- | -------- | ------- | ------- | -| version | varchar(255) | | false | | | | - -## Constraints - -| Name | Type | Definition | -| ---- | ---- | ---------- | -| schema_migrations_pkey | PRIMARY KEY | PRIMARY KEY (version) | - -## Indexes - -| Name | Definition | -| ---- | ---------- | -| schema_migrations_pkey | CREATE UNIQUE INDEX schema_migrations_pkey ON auth.schema_migrations USING btree (version) | - -## Relations - -![er](auth.schema_migrations.svg) - ---- - -> Generated by [tbls](https://github.com/k1LoW/tbls) diff --git a/docs/database/auth.schema_migrations.svg b/docs/database/auth.schema_migrations.svg deleted file mode 100644 index 4a9d4324a..000000000 --- a/docs/database/auth.schema_migrations.svg +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - -auth.schema_migrations - - - -auth.schema_migrations - - -auth.schema_migrations -     -[BASE TABLE] - -version -[varchar(255)] - - - - diff --git a/docs/database/auth.users.md b/docs/database/auth.users.md deleted file mode 100644 index 4e1cf1bf9..000000000 --- a/docs/database/auth.users.md +++ /dev/null @@ -1,61 +0,0 @@ -# auth.users - -## Description - -Auth: Stores user login data within a secure schema. - -## Columns - -| Name | Type | Default | Nullable | Children | Parents | Comment | -| ---- | ---- | ------- | -------- | -------- | ------- | ------- | -| instance_id | uuid | | true | | | | -| id | uuid | | false | [storage.buckets](storage.buckets.md) [storage.objects](storage.objects.md) | | | -| aud | varchar(255) | | true | | | | -| role | varchar(255) | | true | | | | -| email | varchar(255) | | true | | | | -| encrypted_password | varchar(255) | | true | | | | -| confirmed_at | timestamp with time zone | | true | | | | -| invited_at | timestamp with time zone | | true | | | | -| confirmation_token | varchar(255) | | true | | | | -| confirmation_sent_at | timestamp with time zone | | true | | | | -| recovery_token | varchar(255) | | true | | | | -| recovery_sent_at | timestamp with time zone | | true | | | | -| email_change_token | varchar(255) | | true | | | | -| email_change | varchar(255) | | true | | | | -| email_change_sent_at | timestamp with time zone | | true | | | | -| last_sign_in_at | timestamp with time zone | | true | | | | -| raw_app_meta_data | jsonb | | true | | | | -| raw_user_meta_data | jsonb | | true | | | | -| is_super_admin | boolean | | true | | | | -| created_at | timestamp with time zone | | true | | | | -| updated_at | timestamp with time zone | | true | | | | - -## Constraints - -| Name | Type | Definition | -| ---- | ---- | ---------- | -| users_pkey | PRIMARY KEY | PRIMARY KEY (id) | -| users_email_key | UNIQUE | UNIQUE (email) | - -## Indexes - -| Name | Definition | -| ---- | ---------- | -| users_pkey | CREATE UNIQUE INDEX users_pkey ON auth.users USING btree (id) | -| users_email_key | CREATE UNIQUE INDEX users_email_key ON auth.users USING btree (email) | -| users_instance_id_email_idx | CREATE INDEX users_instance_id_email_idx ON auth.users USING btree (instance_id, email) | -| users_instance_id_idx | CREATE INDEX users_instance_id_idx ON auth.users USING btree (instance_id) | - -## Triggers - -| Name | Definition | -| ---- | ---------- | -| on_auth_user_created | CREATE TRIGGER on_auth_user_created AFTER INSERT ON auth.users FOR EACH ROW EXECUTE FUNCTION handle_new_user() | - -## Relations - -![er](auth.users.svg) - ---- - -> Generated by [tbls](https://github.com/k1LoW/tbls) diff --git a/docs/database/auth.users.svg b/docs/database/auth.users.svg deleted file mode 100644 index d921f4f1b..000000000 --- a/docs/database/auth.users.svg +++ /dev/null @@ -1,157 +0,0 @@ - - - - - - -auth.users - - - -auth.users - - -auth.users -     -[BASE TABLE] - -instance_id -[uuid] - -id -[uuid] - -aud -[varchar(255)] - -role -[varchar(255)] - -email -[varchar(255)] - -encrypted_password -[varchar(255)] - -confirmed_at -[timestamp with time zone] - -invited_at -[timestamp with time zone] - -confirmation_token -[varchar(255)] - -confirmation_sent_at -[timestamp with time zone] - -recovery_token -[varchar(255)] - -recovery_sent_at -[timestamp with time zone] - -email_change_token -[varchar(255)] - -email_change -[varchar(255)] - -email_change_sent_at -[timestamp with time zone] - -last_sign_in_at -[timestamp with time zone] - -raw_app_meta_data -[jsonb] - -raw_user_meta_data -[jsonb] - -is_super_admin -[boolean] - -created_at -[timestamp with time zone] - -updated_at -[timestamp with time zone] - - - - -storage.buckets - - -storage.buckets -     -[BASE TABLE] - -id     -[text] - -name     -[text] - -owner     -[uuid] - -created_at     -[timestamp with time zone] - -updated_at     -[timestamp with time zone] - - - -storage.buckets:owner->auth.users:id - - -FOREIGN KEY (owner) REFERENCES auth.users(id) - - - -storage.objects - - -storage.objects -     -[BASE TABLE] - -id     -[uuid] - -bucket_id     -[text] - -name     -[text] - -owner     -[uuid] - -created_at     -[timestamp with time zone] - -updated_at     -[timestamp with time zone] - -last_accessed_at     -[timestamp with time zone] - -metadata     -[jsonb] - - - -storage.objects:owner->auth.users:id - - -FOREIGN KEY (owner) REFERENCES auth.users(id) - - - diff --git a/docs/database/extensions.pg_stat_statements.md b/docs/database/extensions.pg_stat_statements.md deleted file mode 100644 index 1ac95502f..000000000 --- a/docs/database/extensions.pg_stat_statements.md +++ /dev/null @@ -1,117 +0,0 @@ -# extensions.pg_stat_statements - -## Description - -
-Table Definition - -```sql -CREATE VIEW pg_stat_statements AS ( - SELECT pg_stat_statements.userid, - pg_stat_statements.dbid, - pg_stat_statements.toplevel, - pg_stat_statements.queryid, - pg_stat_statements.query, - pg_stat_statements.plans, - pg_stat_statements.total_plan_time, - pg_stat_statements.min_plan_time, - pg_stat_statements.max_plan_time, - pg_stat_statements.mean_plan_time, - pg_stat_statements.stddev_plan_time, - pg_stat_statements.calls, - pg_stat_statements.total_exec_time, - pg_stat_statements.min_exec_time, - pg_stat_statements.max_exec_time, - pg_stat_statements.mean_exec_time, - pg_stat_statements.stddev_exec_time, - pg_stat_statements.rows, - pg_stat_statements.shared_blks_hit, - pg_stat_statements.shared_blks_read, - pg_stat_statements.shared_blks_dirtied, - pg_stat_statements.shared_blks_written, - pg_stat_statements.local_blks_hit, - pg_stat_statements.local_blks_read, - pg_stat_statements.local_blks_dirtied, - pg_stat_statements.local_blks_written, - pg_stat_statements.temp_blks_read, - pg_stat_statements.temp_blks_written, - pg_stat_statements.blk_read_time, - pg_stat_statements.blk_write_time, - pg_stat_statements.temp_blk_read_time, - pg_stat_statements.temp_blk_write_time, - pg_stat_statements.wal_records, - pg_stat_statements.wal_fpi, - pg_stat_statements.wal_bytes, - pg_stat_statements.jit_functions, - pg_stat_statements.jit_generation_time, - pg_stat_statements.jit_inlining_count, - pg_stat_statements.jit_inlining_time, - pg_stat_statements.jit_optimization_count, - pg_stat_statements.jit_optimization_time, - pg_stat_statements.jit_emission_count, - pg_stat_statements.jit_emission_time - FROM pg_stat_statements(true) pg_stat_statements(userid, dbid, toplevel, queryid, query, plans, total_plan_time, min_plan_time, max_plan_time, mean_plan_time, stddev_plan_time, calls, total_exec_time, min_exec_time, max_exec_time, mean_exec_time, stddev_exec_time, rows, shared_blks_hit, shared_blks_read, shared_blks_dirtied, shared_blks_written, local_blks_hit, local_blks_read, local_blks_dirtied, local_blks_written, temp_blks_read, temp_blks_written, blk_read_time, blk_write_time, temp_blk_read_time, temp_blk_write_time, wal_records, wal_fpi, wal_bytes, jit_functions, jit_generation_time, jit_inlining_count, jit_inlining_time, jit_optimization_count, jit_optimization_time, jit_emission_count, jit_emission_time) -) -``` - -
- -## Referenced Tables - -- pg_stat_statements - -## Columns - -| Name | Type | Default | Nullable | Children | Parents | Comment | -| ---- | ---- | ------- | -------- | -------- | ------- | ------- | -| userid | oid | | true | | | | -| dbid | oid | | true | | | | -| toplevel | boolean | | true | | | | -| queryid | bigint | | true | | | | -| query | text | | true | | | | -| plans | bigint | | true | | | | -| total_plan_time | double precision | | true | | | | -| min_plan_time | double precision | | true | | | | -| max_plan_time | double precision | | true | | | | -| mean_plan_time | double precision | | true | | | | -| stddev_plan_time | double precision | | true | | | | -| calls | bigint | | true | | | | -| total_exec_time | double precision | | true | | | | -| min_exec_time | double precision | | true | | | | -| max_exec_time | double precision | | true | | | | -| mean_exec_time | double precision | | true | | | | -| stddev_exec_time | double precision | | true | | | | -| rows | bigint | | true | | | | -| shared_blks_hit | bigint | | true | | | | -| shared_blks_read | bigint | | true | | | | -| shared_blks_dirtied | bigint | | true | | | | -| shared_blks_written | bigint | | true | | | | -| local_blks_hit | bigint | | true | | | | -| local_blks_read | bigint | | true | | | | -| local_blks_dirtied | bigint | | true | | | | -| local_blks_written | bigint | | true | | | | -| temp_blks_read | bigint | | true | | | | -| temp_blks_written | bigint | | true | | | | -| blk_read_time | double precision | | true | | | | -| blk_write_time | double precision | | true | | | | -| temp_blk_read_time | double precision | | true | | | | -| temp_blk_write_time | double precision | | true | | | | -| wal_records | bigint | | true | | | | -| wal_fpi | bigint | | true | | | | -| wal_bytes | numeric | | true | | | | -| jit_functions | bigint | | true | | | | -| jit_generation_time | double precision | | true | | | | -| jit_inlining_count | bigint | | true | | | | -| jit_inlining_time | double precision | | true | | | | -| jit_optimization_count | bigint | | true | | | | -| jit_optimization_time | double precision | | true | | | | -| jit_emission_count | bigint | | true | | | | -| jit_emission_time | double precision | | true | | | | - -## Relations - -![er](extensions.pg_stat_statements.svg) - ---- - -> Generated by [tbls](https://github.com/k1LoW/tbls) diff --git a/docs/database/extensions.pg_stat_statements.svg b/docs/database/extensions.pg_stat_statements.svg deleted file mode 100644 index 141127ffc..000000000 --- a/docs/database/extensions.pg_stat_statements.svg +++ /dev/null @@ -1,152 +0,0 @@ - - - - - - -extensions.pg_stat_statements - - - -extensions.pg_stat_statements - - -extensions.pg_stat_statements -     -[VIEW] - -userid -[oid] - -dbid -[oid] - -toplevel -[boolean] - -queryid -[bigint] - -query -[text] - -plans -[bigint] - -total_plan_time -[double precision] - -min_plan_time -[double precision] - -max_plan_time -[double precision] - -mean_plan_time -[double precision] - -stddev_plan_time -[double precision] - -calls -[bigint] - -total_exec_time -[double precision] - -min_exec_time -[double precision] - -max_exec_time -[double precision] - -mean_exec_time -[double precision] - -stddev_exec_time -[double precision] - -rows -[bigint] - -shared_blks_hit -[bigint] - -shared_blks_read -[bigint] - -shared_blks_dirtied -[bigint] - -shared_blks_written -[bigint] - -local_blks_hit -[bigint] - -local_blks_read -[bigint] - -local_blks_dirtied -[bigint] - -local_blks_written -[bigint] - -temp_blks_read -[bigint] - -temp_blks_written -[bigint] - -blk_read_time -[double precision] - -blk_write_time -[double precision] - -temp_blk_read_time -[double precision] - -temp_blk_write_time -[double precision] - -wal_records -[bigint] - -wal_fpi -[bigint] - -wal_bytes -[numeric] - -jit_functions -[bigint] - -jit_generation_time -[double precision] - -jit_inlining_count -[bigint] - -jit_inlining_time -[double precision] - -jit_optimization_count -[bigint] - -jit_optimization_time -[double precision] - -jit_emission_count -[bigint] - -jit_emission_time -[double precision] - - - - diff --git a/docs/database/extensions.pg_stat_statements_info.md b/docs/database/extensions.pg_stat_statements_info.md deleted file mode 100644 index 8d09611a4..000000000 --- a/docs/database/extensions.pg_stat_statements_info.md +++ /dev/null @@ -1,35 +0,0 @@ -# extensions.pg_stat_statements_info - -## Description - -
-Table Definition - -```sql -CREATE VIEW pg_stat_statements_info AS ( - SELECT pg_stat_statements_info.dealloc, - pg_stat_statements_info.stats_reset - FROM pg_stat_statements_info() pg_stat_statements_info(dealloc, stats_reset) -) -``` - -
- -## Referenced Tables - -- pg_stat_statements_info - -## Columns - -| Name | Type | Default | Nullable | Children | Parents | Comment | -| ---- | ---- | ------- | -------- | -------- | ------- | ------- | -| dealloc | bigint | | true | | | | -| stats_reset | timestamp with time zone | | true | | | | - -## Relations - -![er](extensions.pg_stat_statements_info.svg) - ---- - -> Generated by [tbls](https://github.com/k1LoW/tbls) diff --git a/docs/database/extensions.pg_stat_statements_info.svg b/docs/database/extensions.pg_stat_statements_info.svg deleted file mode 100644 index 3802f8f3f..000000000 --- a/docs/database/extensions.pg_stat_statements_info.svg +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - -extensions.pg_stat_statements_info - - - -extensions.pg_stat_statements_info - - -extensions.pg_stat_statements_info -     -[VIEW] - -dealloc -[bigint] - -stats_reset -[timestamp with time zone] - - - - diff --git a/docs/database/net._http_response.md b/docs/database/net._http_response.md deleted file mode 100644 index fe5d4f918..000000000 --- a/docs/database/net._http_response.md +++ /dev/null @@ -1,30 +0,0 @@ -# net._http_response - -## Description - -## Columns - -| Name | Type | Default | Nullable | Children | Parents | Comment | -| ---- | ---- | ------- | -------- | -------- | ------- | ------- | -| id | bigint | | true | | | | -| status_code | integer | | true | | | | -| content_type | text | | true | | | | -| headers | jsonb | | true | | | | -| content | text | | true | | | | -| timed_out | boolean | | true | | | | -| error_msg | text | | true | | | | -| created | timestamp with time zone | now() | false | | | | - -## Indexes - -| Name | Definition | -| ---- | ---------- | -| _http_response_created_idx | CREATE INDEX _http_response_created_idx ON net._http_response USING btree (created) | - -## Relations - -![er](net._http_response.svg) - ---- - -> Generated by [tbls](https://github.com/k1LoW/tbls) diff --git a/docs/database/net._http_response.svg b/docs/database/net._http_response.svg deleted file mode 100644 index ce4d35d7a..000000000 --- a/docs/database/net._http_response.svg +++ /dev/null @@ -1,47 +0,0 @@ - - - - - - -net._http_response - - - -net._http_response - - -net._http_response -     -[BASE TABLE] - -id -[bigint] - -status_code -[integer] - -content_type -[text] - -headers -[jsonb] - -content -[text] - -timed_out -[boolean] - -error_msg -[text] - -created -[timestamp with time zone] - - - - diff --git a/docs/database/net.http_request_queue.md b/docs/database/net.http_request_queue.md deleted file mode 100644 index af4cbff0b..000000000 --- a/docs/database/net.http_request_queue.md +++ /dev/null @@ -1,22 +0,0 @@ -# net.http_request_queue - -## Description - -## Columns - -| Name | Type | Default | Nullable | Children | Parents | Comment | -| ---- | ---- | ------- | -------- | -------- | ------- | ------- | -| id | bigint | nextval('net.http_request_queue_id_seq'::regclass) | false | | | | -| method | net.http_method | | false | | | | -| url | text | | false | | | | -| headers | jsonb | | false | | | | -| body | bytea | | true | | | | -| timeout_milliseconds | integer | | false | | | | - -## Relations - -![er](net.http_request_queue.svg) - ---- - -> Generated by [tbls](https://github.com/k1LoW/tbls) diff --git a/docs/database/net.http_request_queue.svg b/docs/database/net.http_request_queue.svg deleted file mode 100644 index 9472b9f9c..000000000 --- a/docs/database/net.http_request_queue.svg +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - -net.http_request_queue - - - -net.http_request_queue - - -net.http_request_queue -     -[BASE TABLE] - -id -[bigint] - -method -[net.http_method] - -url -[text] - -headers -[jsonb] - -body -[bytea] - -timeout_milliseconds -[integer] - - - - diff --git a/docs/database/pgsodium.decrypted_key.md b/docs/database/pgsodium.decrypted_key.md deleted file mode 100644 index 8c383e7a3..000000000 --- a/docs/database/pgsodium.decrypted_key.md +++ /dev/null @@ -1,66 +0,0 @@ -# pgsodium.decrypted_key - -## Description - -
-Table Definition - -```sql -CREATE VIEW decrypted_key AS ( - SELECT key.id, - key.status, - key.created, - key.expires, - key.key_type, - key.key_id, - key.key_context, - key.name, - key.associated_data, - key.raw_key, - CASE - WHEN (key.raw_key IS NULL) THEN NULL::bytea - ELSE - CASE - WHEN (key.parent_key IS NULL) THEN NULL::bytea - ELSE pgsodium.crypto_aead_det_decrypt(key.raw_key, convert_to(((key.id)::text || key.associated_data), 'utf8'::name), key.parent_key, key.raw_key_nonce) - END - END AS decrypted_raw_key, - key.raw_key_nonce, - key.parent_key, - key.comment - FROM pgsodium.key -) -``` - -
- -## Referenced Tables - -- [pgsodium.key](pgsodium.key.md) - -## Columns - -| Name | Type | Default | Nullable | Children | Parents | Comment | -| ---- | ---- | ------- | -------- | -------- | ------- | ------- | -| id | uuid | | true | | | | -| status | pgsodium.key_status | | true | | | | -| created | timestamp with time zone | | true | | | | -| expires | timestamp with time zone | | true | | | | -| key_type | pgsodium.key_type | | true | | | | -| key_id | bigint | | true | | | | -| key_context | bytea | | true | | | | -| name | text | | true | | | | -| associated_data | text | | true | | | | -| raw_key | bytea | | true | | | | -| decrypted_raw_key | bytea | | true | | | | -| raw_key_nonce | bytea | | true | | | | -| parent_key | uuid | | true | | | | -| comment | text | | true | | | | - -## Relations - -![er](pgsodium.decrypted_key.svg) - ---- - -> Generated by [tbls](https://github.com/k1LoW/tbls) diff --git a/docs/database/pgsodium.decrypted_key.svg b/docs/database/pgsodium.decrypted_key.svg deleted file mode 100644 index 934d30424..000000000 --- a/docs/database/pgsodium.decrypted_key.svg +++ /dev/null @@ -1,65 +0,0 @@ - - - - - - -pgsodium.decrypted_key - - - -pgsodium.decrypted_key - - -pgsodium.decrypted_key -     -[VIEW] - -id -[uuid] - -status -[pgsodium.key_status] - -created -[timestamp with time zone] - -expires -[timestamp with time zone] - -key_type -[pgsodium.key_type] - -key_id -[bigint] - -key_context -[bytea] - -name -[text] - -associated_data -[text] - -raw_key -[bytea] - -decrypted_raw_key -[bytea] - -raw_key_nonce -[bytea] - -parent_key -[uuid] - -comment -[text] - - - - diff --git a/docs/database/pgsodium.key.md b/docs/database/pgsodium.key.md deleted file mode 100644 index 974783813..000000000 --- a/docs/database/pgsodium.key.md +++ /dev/null @@ -1,58 +0,0 @@ -# pgsodium.key - -## Description - -This table holds metadata for derived keys given a key_id and key_context. The raw key is never stored. - -## Columns - -| Name | Type | Default | Nullable | Children | Parents | Comment | -| ---- | ---- | ------- | -------- | -------- | ------- | ------- | -| id | uuid | gen_random_uuid() | false | [pgsodium.key](pgsodium.key.md) [vault.secrets](vault.secrets.md) | | | -| status | pgsodium.key_status | 'valid'::pgsodium.key_status | true | | | | -| created | timestamp with time zone | CURRENT_TIMESTAMP | false | | | | -| expires | timestamp with time zone | | true | | | | -| key_type | pgsodium.key_type | | true | | | | -| key_id | bigint | nextval('pgsodium.key_key_id_seq'::regclass) | true | | | | -| key_context | bytea | '\x7067736f6469756d'::bytea | true | | | | -| name | text | | true | | | | -| associated_data | text | 'associated'::text | true | | | | -| raw_key | bytea | | true | | | | -| raw_key_nonce | bytea | | true | | | | -| parent_key | uuid | | true | | [pgsodium.key](pgsodium.key.md) | | -| comment | text | | true | | | | -| user_data | text | | true | | | | - -## Constraints - -| Name | Type | Definition | -| ---- | ---- | ---------- | -| key_key_context_check | CHECK | CHECK ((length(key_context) = 8)) | -| pgsodium_raw | CHECK | CHECK (
CASE
WHEN (raw_key IS NOT NULL) THEN ((key_id IS NULL) AND (key_context IS NULL) AND (parent_key IS NOT NULL))
ELSE ((key_id IS NOT NULL) AND (key_context IS NOT NULL) AND (parent_key IS NULL))
END) | -| key_parent_key_fkey | FOREIGN KEY | FOREIGN KEY (parent_key) REFERENCES pgsodium.key(id) | -| key_pkey | PRIMARY KEY | PRIMARY KEY (id) | -| pgsodium_key_unique_name | UNIQUE | UNIQUE (name) | - -## Indexes - -| Name | Definition | -| ---- | ---------- | -| key_pkey | CREATE UNIQUE INDEX key_pkey ON pgsodium.key USING btree (id) | -| key_status_idx | CREATE INDEX key_status_idx ON pgsodium.key USING btree (status) WHERE (status = ANY (ARRAY['valid'::pgsodium.key_status, 'default'::pgsodium.key_status])) | -| key_status_idx1 | CREATE UNIQUE INDEX key_status_idx1 ON pgsodium.key USING btree (status) WHERE (status = 'default'::pgsodium.key_status) | -| key_key_id_key_context_key_type_idx | CREATE UNIQUE INDEX key_key_id_key_context_key_type_idx ON pgsodium.key USING btree (key_id, key_context, key_type) | -| pgsodium_key_unique_name | CREATE UNIQUE INDEX pgsodium_key_unique_name ON pgsodium.key USING btree (name) | - -## Triggers - -| Name | Definition | -| ---- | ---------- | -| key_encrypt_secret_trigger_raw_key | CREATE TRIGGER key_encrypt_secret_trigger_raw_key BEFORE INSERT OR UPDATE OF raw_key ON pgsodium.key FOR EACH ROW EXECUTE FUNCTION pgsodium.key_encrypt_secret_raw_key() | - -## Relations - -![er](pgsodium.key.svg) - ---- - -> Generated by [tbls](https://github.com/k1LoW/tbls) diff --git a/docs/database/pgsodium.key.svg b/docs/database/pgsodium.key.svg deleted file mode 100644 index 9ba436b27..000000000 --- a/docs/database/pgsodium.key.svg +++ /dev/null @@ -1,112 +0,0 @@ - - - - - - -pgsodium.key - - - -pgsodium.key - - -pgsodium.key -     -[BASE TABLE] - -id -[uuid] - -status -[pgsodium.key_status] - -created -[timestamp with time zone] - -expires -[timestamp with time zone] - -key_type -[pgsodium.key_type] - -key_id -[bigint] - -key_context -[bytea] - -name -[text] - -associated_data -[text] - -raw_key -[bytea] - -raw_key_nonce -[bytea] - -parent_key -[uuid] - -comment -[text] - -user_data -[text] - - - - -pgsodium.key:parent_key->pgsodium.key:id - - -FOREIGN KEY (parent_key) REFERENCES pgsodium.key(id) - - - -vault.secrets - - -vault.secrets -     -[BASE TABLE] - -id     -[uuid] - -name     -[text] - -description     -[text] - -secret     -[text] - -key_id     -[uuid] - -nonce     -[bytea] - -created_at     -[timestamp with time zone] - -updated_at     -[timestamp with time zone] - - - -vault.secrets:key_id->pgsodium.key:id - - -FOREIGN KEY (key_id) REFERENCES pgsodium.key(id) - - - diff --git a/docs/database/pgsodium.mask_columns.md b/docs/database/pgsodium.mask_columns.md deleted file mode 100644 index 74198bb0a..000000000 --- a/docs/database/pgsodium.mask_columns.md +++ /dev/null @@ -1,49 +0,0 @@ -# pgsodium.mask_columns - -## Description - -
-Table Definition - -```sql -CREATE VIEW mask_columns AS ( - SELECT a.attname, - a.attrelid, - m.key_id, - m.key_id_column, - m.associated_columns, - m.nonce_column, - m.format_type - FROM (pg_attribute a - LEFT JOIN pgsodium.masking_rule m ON (((m.attrelid = a.attrelid) AND (m.attname = a.attname)))) - WHERE ((a.attnum > 0) AND (NOT a.attisdropped)) - ORDER BY a.attnum -) -``` - -
- -## Referenced Tables - -- pg_attribute -- [pgsodium.masking_rule](pgsodium.masking_rule.md) - -## Columns - -| Name | Type | Default | Nullable | Children | Parents | Comment | -| ---- | ---- | ------- | -------- | -------- | ------- | ------- | -| attname | name | | true | | | | -| attrelid | oid | | true | | | | -| key_id | text | | true | | | | -| key_id_column | text | | true | | | | -| associated_columns | text | | true | | | | -| nonce_column | text | | true | | | | -| format_type | text | | true | | | | - -## Relations - -![er](pgsodium.mask_columns.svg) - ---- - -> Generated by [tbls](https://github.com/k1LoW/tbls) diff --git a/docs/database/pgsodium.mask_columns.svg b/docs/database/pgsodium.mask_columns.svg deleted file mode 100644 index 931fa30af..000000000 --- a/docs/database/pgsodium.mask_columns.svg +++ /dev/null @@ -1,44 +0,0 @@ - - - - - - -pgsodium.mask_columns - - - -pgsodium.mask_columns - - -pgsodium.mask_columns -     -[VIEW] - -attname -[name] - -attrelid -[oid] - -key_id -[text] - -key_id_column -[text] - -associated_columns -[text] - -nonce_column -[text] - -format_type -[text] - - - - diff --git a/docs/database/pgsodium.masking_rule.md b/docs/database/pgsodium.masking_rule.md deleted file mode 100644 index 339482785..000000000 --- a/docs/database/pgsodium.masking_rule.md +++ /dev/null @@ -1,85 +0,0 @@ -# pgsodium.masking_rule - -## Description - -
-Table Definition - -```sql -CREATE VIEW masking_rule AS ( - WITH const AS ( - SELECT 'encrypt +with +key +id +([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})'::text AS pattern_key_id, - 'encrypt +with +key +column +([\w\"\-$]+)'::text AS pattern_key_id_column, - '(?<=associated) +\(([\w\"\-$, ]+)\)'::text AS pattern_associated_columns, - '(?<=nonce) +([\w\"\-$]+)'::text AS pattern_nonce_column, - '(?<=decrypt with view) +([\w\"\-$]+\.[\w\"\-$]+)'::text AS pattern_view_name, - '(?<=security invoker)'::text AS pattern_security_invoker - ), rules_from_seclabels AS ( - SELECT sl.objoid AS attrelid, - sl.objsubid AS attnum, - (c.relnamespace)::regnamespace AS relnamespace, - c.relname, - a.attname, - format_type(a.atttypid, a.atttypmod) AS format_type, - sl.label AS col_description, - (regexp_match(sl.label, k.pattern_key_id_column, 'i'::text))[1] AS key_id_column, - (regexp_match(sl.label, k.pattern_key_id, 'i'::text))[1] AS key_id, - (regexp_match(sl.label, k.pattern_associated_columns, 'i'::text))[1] AS associated_columns, - (regexp_match(sl.label, k.pattern_nonce_column, 'i'::text))[1] AS nonce_column, - COALESCE((regexp_match(sl2.label, k.pattern_view_name, 'i'::text))[1], (((c.relnamespace)::regnamespace || '.'::text) || quote_ident(('decrypted_'::text || (c.relname)::text)))) AS view_name, - 100 AS priority, - ((regexp_match(sl.label, k.pattern_security_invoker, 'i'::text))[1] IS NOT NULL) AS security_invoker - FROM const k, - (((pg_seclabel sl - JOIN pg_class c ON (((sl.classoid = c.tableoid) AND (sl.objoid = c.oid)))) - JOIN pg_attribute a ON (((a.attrelid = c.oid) AND (sl.objsubid = a.attnum)))) - LEFT JOIN pg_seclabel sl2 ON (((sl2.objoid = c.oid) AND (sl2.objsubid = 0)))) - WHERE ((a.attnum > 0) AND (((c.relnamespace)::regnamespace)::oid <> ('pg_catalog'::regnamespace)::oid) AND (NOT a.attisdropped) AND (sl.label ~~* 'ENCRYPT%'::text) AND (sl.provider = 'pgsodium'::text)) - ) - SELECT DISTINCT ON (rules_from_seclabels.attrelid, rules_from_seclabels.attnum) rules_from_seclabels.attrelid, - rules_from_seclabels.attnum, - rules_from_seclabels.relnamespace, - rules_from_seclabels.relname, - rules_from_seclabels.attname, - rules_from_seclabels.format_type, - rules_from_seclabels.col_description, - rules_from_seclabels.key_id_column, - rules_from_seclabels.key_id, - rules_from_seclabels.associated_columns, - rules_from_seclabels.nonce_column, - rules_from_seclabels.view_name, - rules_from_seclabels.priority, - rules_from_seclabels.security_invoker - FROM rules_from_seclabels - ORDER BY rules_from_seclabels.attrelid, rules_from_seclabels.attnum, rules_from_seclabels.priority DESC -) -``` - -
- -## Columns - -| Name | Type | Default | Nullable | Children | Parents | Comment | -| ---- | ---- | ------- | -------- | -------- | ------- | ------- | -| attrelid | oid | | true | | | | -| attnum | integer | | true | | | | -| relnamespace | regnamespace | | true | | | | -| relname | name | | true | | | | -| attname | name | | true | | | | -| format_type | text | | true | | | | -| col_description | text | | true | | | | -| key_id_column | text | | true | | | | -| key_id | text | | true | | | | -| associated_columns | text | | true | | | | -| nonce_column | text | | true | | | | -| view_name | text | | true | | | | -| priority | integer | | true | | | | -| security_invoker | boolean | | true | | | | - -## Relations - -![er](pgsodium.masking_rule.svg) - ---- - -> Generated by [tbls](https://github.com/k1LoW/tbls) diff --git a/docs/database/pgsodium.masking_rule.svg b/docs/database/pgsodium.masking_rule.svg deleted file mode 100644 index ade669e03..000000000 --- a/docs/database/pgsodium.masking_rule.svg +++ /dev/null @@ -1,65 +0,0 @@ - - - - - - -pgsodium.masking_rule - - - -pgsodium.masking_rule - - -pgsodium.masking_rule -     -[VIEW] - -attrelid -[oid] - -attnum -[integer] - -relnamespace -[regnamespace] - -relname -[name] - -attname -[name] - -format_type -[text] - -col_description -[text] - -key_id_column -[text] - -key_id -[text] - -associated_columns -[text] - -nonce_column -[text] - -view_name -[text] - -priority -[integer] - -security_invoker -[boolean] - - - - diff --git a/docs/database/pgsodium.valid_key.md b/docs/database/pgsodium.valid_key.md deleted file mode 100644 index 666f5b9a0..000000000 --- a/docs/database/pgsodium.valid_key.md +++ /dev/null @@ -1,54 +0,0 @@ -# pgsodium.valid_key - -## Description - -
-Table Definition - -```sql -CREATE VIEW valid_key AS ( - SELECT key.id, - key.name, - key.status, - key.key_type, - key.key_id, - key.key_context, - key.created, - key.expires, - key.associated_data - FROM pgsodium.key - WHERE ((key.status = ANY (ARRAY['valid'::pgsodium.key_status, 'default'::pgsodium.key_status])) AND - CASE - WHEN (key.expires IS NULL) THEN true - ELSE (key.expires > now()) - END) -) -``` - -
- -## Referenced Tables - -- [pgsodium.key](pgsodium.key.md) - -## Columns - -| Name | Type | Default | Nullable | Children | Parents | Comment | -| ---- | ---- | ------- | -------- | -------- | ------- | ------- | -| id | uuid | | true | | | | -| name | text | | true | | | | -| status | pgsodium.key_status | | true | | | | -| key_type | pgsodium.key_type | | true | | | | -| key_id | bigint | | true | | | | -| key_context | bytea | | true | | | | -| created | timestamp with time zone | | true | | | | -| expires | timestamp with time zone | | true | | | | -| associated_data | text | | true | | | | - -## Relations - -![er](pgsodium.valid_key.svg) - ---- - -> Generated by [tbls](https://github.com/k1LoW/tbls) diff --git a/docs/database/pgsodium.valid_key.svg b/docs/database/pgsodium.valid_key.svg deleted file mode 100644 index 807fa951e..000000000 --- a/docs/database/pgsodium.valid_key.svg +++ /dev/null @@ -1,50 +0,0 @@ - - - - - - -pgsodium.valid_key - - - -pgsodium.valid_key - - -pgsodium.valid_key -     -[VIEW] - -id -[uuid] - -name -[text] - -status -[pgsodium.key_status] - -key_type -[pgsodium.key_type] - -key_id -[bigint] - -key_context -[bytea] - -created -[timestamp with time zone] - -expires -[timestamp with time zone] - -associated_data -[text] - - - - diff --git a/docs/database/public.app_config.md b/docs/database/public.app_config.md deleted file mode 100644 index 05b404751..000000000 --- a/docs/database/public.app_config.md +++ /dev/null @@ -1,39 +0,0 @@ -# public.app_config - -## Description - -Stores app config for different envs - -## Columns - -| Name | Type | Default | Nullable | Children | Parents | Comment | -| ---- | ---- | ------- | -------- | -------- | ------- | ------- | -| id | text | | false | | | | -| app_min_version | text | | false | | | | -| app_privacy | jsonb | | false | | | | -| app_terms | jsonb | | false | | | | -| designer_privacy | jsonb | | false | | | | -| designer_terms | jsonb | | false | | | | -| imprint | jsonb | | false | | | | -| contact | jsonb | '{"email": "hpi-info@hpi.de", "phone": "+49-(0)331 5509-0", "website": "https://hpi.de/", "organization": "Hasso Plattner Institute"}'::jsonb | false | | | | -| analytics | jsonb | | true | | | | - -## Constraints - -| Name | Type | Definition | -| ---- | ---- | ---------- | -| AppConfig_pkey | PRIMARY KEY | PRIMARY KEY (id) | - -## Indexes - -| Name | Definition | -| ---- | ---------- | -| AppConfig_pkey | CREATE UNIQUE INDEX "AppConfig_pkey" ON public.app_config USING btree (id) | - -## Relations - -![er](public.app_config.svg) - ---- - -> Generated by [tbls](https://github.com/k1LoW/tbls) diff --git a/docs/database/public.app_config.svg b/docs/database/public.app_config.svg deleted file mode 100644 index 7c1a3cfa0..000000000 --- a/docs/database/public.app_config.svg +++ /dev/null @@ -1,50 +0,0 @@ - - - - - - -public.app_config - - - -public.app_config - - -public.app_config -     -[BASE TABLE] - -id -[text] - -app_min_version -[text] - -app_privacy -[jsonb] - -app_terms -[jsonb] - -designer_privacy -[jsonb] - -designer_terms -[jsonb] - -imprint -[jsonb] - -contact -[jsonb] - -analytics -[jsonb] - - - - diff --git a/docs/database/public.repo.md b/docs/database/public.repo.md deleted file mode 100644 index 9e45555ca..000000000 --- a/docs/database/public.repo.md +++ /dev/null @@ -1,36 +0,0 @@ -# public.repo - -## Description - -Git repo where the generated project is stored - -## Columns - -| Name | Type | Default | Nullable | Children | Parents | Comment | -| ---- | ---- | ------- | -------- | -------- | ------- | ------- | -| project_id | text | | false | | | | -| user_id | uuid | | false | | [public.user](public.user.md) | | -| study_id | uuid | | false | | [public.study](public.study.md) | | -| provider | git_provider | | false | | | | - -## Constraints - -| Name | Type | Definition | -| ---- | ---- | ---------- | -| repo_studyId_fkey | FOREIGN KEY | FOREIGN KEY (study_id) REFERENCES study(id) | -| repo_pkey | PRIMARY KEY | PRIMARY KEY (project_id) | -| repo_userId_fkey | FOREIGN KEY | FOREIGN KEY (user_id) REFERENCES "user"(id) ON DELETE CASCADE | - -## Indexes - -| Name | Definition | -| ---- | ---------- | -| repo_pkey | CREATE UNIQUE INDEX repo_pkey ON public.repo USING btree (project_id) | - -## Relations - -![er](public.repo.svg) - ---- - -> Generated by [tbls](https://github.com/k1LoW/tbls) diff --git a/docs/database/public.repo.svg b/docs/database/public.repo.svg deleted file mode 100644 index ac7efbd9a..000000000 --- a/docs/database/public.repo.svg +++ /dev/null @@ -1,139 +0,0 @@ - - - - - - -public.repo - - - -public.repo - - -public.repo -     -[BASE TABLE] - -project_id -[text] - -user_id -[uuid] - -study_id -[uuid] - -provider -[git_provider] - - - - -public.user - - -public.user -     -[BASE TABLE] - -id     -[uuid] - -email     -[text] - -preferences     -[jsonb] - - - -public.repo:user_id->public.user:id - - -FOREIGN KEY (user_id) REFERENCES "user"(id) ON DELETE CASCADE - - - -public.study - - -public.study -     -[BASE TABLE] - -id     -[uuid] - -contact     -[jsonb] - -title     -[text] - -description     -[text] - -icon_name     -[text] - -published     -[boolean] - -registry_published     -[boolean] - -questionnaire     -[jsonb] - -eligibility_criteria     -[jsonb] - -observations     -[jsonb] - -interventions     -[jsonb] - -consent     -[jsonb] - -schedule     -[jsonb] - -report_specification     -[jsonb] - -results     -[jsonb] - -created_at     -[timestamp with time zone] - -updated_at     -[timestamp with time zone] - -user_id     -[uuid] - -participation     -[participation] - -result_sharing     -[result_sharing] - -collaborator_emails     -[text[]] - - - -public.repo:study_id->public.study:id - - -FOREIGN KEY (study_id) REFERENCES study(id) - - - diff --git a/docs/database/public.study.md b/docs/database/public.study.md deleted file mode 100644 index 96eddd9f7..000000000 --- a/docs/database/public.study.md +++ /dev/null @@ -1,58 +0,0 @@ -# public.study - -## Description - -## Columns - -| Name | Type | Default | Nullable | Children | Parents | Comment | -| ---- | ---- | ------- | -------- | -------- | ------- | ------- | -| id | uuid | gen_random_uuid() | false | [public.study_subject](public.study_subject.md) [public.repo](public.repo.md) [public.study_invite](public.study_invite.md) | | | -| contact | jsonb | | false | | | | -| title | text | | false | | | | -| description | text | | false | | | | -| icon_name | text | | false | | | | -| published | boolean | false | false | | | | -| registry_published | boolean | false | false | | | | -| questionnaire | jsonb | | false | | | | -| eligibility_criteria | jsonb | | false | | | | -| observations | jsonb | | false | | | | -| interventions | jsonb | | false | | | | -| consent | jsonb | | false | | | | -| schedule | jsonb | | false | | | | -| report_specification | jsonb | | false | | | | -| results | jsonb | | false | | | | -| created_at | timestamp with time zone | now() | false | | | | -| updated_at | timestamp with time zone | now() | false | | | | -| user_id | uuid | | false | | [public.user](public.user.md) | UserId of study creator | -| participation | participation | 'invite'::participation | false | | | | -| result_sharing | result_sharing | 'private'::result_sharing | false | | | | -| collaborator_emails | text[] | '{}'::text[] | false | | | | - -## Constraints - -| Name | Type | Definition | -| ---- | ---- | ---------- | -| study_id_key | UNIQUE | UNIQUE (id) | -| study_pkey | PRIMARY KEY | PRIMARY KEY (id) | -| study_userId_fkey | FOREIGN KEY | FOREIGN KEY (user_id) REFERENCES "user"(id) | - -## Indexes - -| Name | Definition | -| ---- | ---------- | -| study_id_key | CREATE UNIQUE INDEX study_id_key ON public.study USING btree (id) | -| study_pkey | CREATE UNIQUE INDEX study_pkey ON public.study USING btree (id) | - -## Triggers - -| Name | Definition | -| ---- | ---------- | -| handle_updated_at | CREATE TRIGGER handle_updated_at BEFORE UPDATE ON public.study FOR EACH ROW EXECUTE FUNCTION moddatetime('updated_at') | - -## Relations - -![er](public.study.svg) - ---- - -> Generated by [tbls](https://github.com/k1LoW/tbls) diff --git a/docs/database/public.study.svg b/docs/database/public.study.svg deleted file mode 100644 index dec6fcf50..000000000 --- a/docs/database/public.study.svg +++ /dev/null @@ -1,201 +0,0 @@ - - - - - - -public.study - - - -public.study - - -public.study -     -[BASE TABLE] - -id -[uuid] - -contact -[jsonb] - -title -[text] - -description -[text] - -icon_name -[text] - -published -[boolean] - -registry_published -[boolean] - -questionnaire -[jsonb] - -eligibility_criteria -[jsonb] - -observations -[jsonb] - -interventions -[jsonb] - -consent -[jsonb] - -schedule -[jsonb] - -report_specification -[jsonb] - -results -[jsonb] - -created_at -[timestamp with time zone] - -updated_at -[timestamp with time zone] - -user_id -[uuid] - -participation -[participation] - -result_sharing -[result_sharing] - -collaborator_emails -[text[]] - - - - -public.user - - -public.user -     -[BASE TABLE] - -id     -[uuid] - -email     -[text] - -preferences     -[jsonb] - - - -public.study:user_id->public.user:id - - -FOREIGN KEY (user_id) REFERENCES "user"(id) - - - -public.study_subject - - -public.study_subject -     -[BASE TABLE] - -id     -[uuid] - -study_id     -[uuid] - -user_id     -[uuid] - -started_at     -[timestamp with time zone] - -selected_intervention_ids     -[text[]] - -invite_code     -[text] - -is_deleted     -[boolean] - - - -public.study_subject:study_id->public.study:id - - -FOREIGN KEY (study_id) REFERENCES study(id) ON DELETE CASCADE - - - -public.repo - - -public.repo -     -[BASE TABLE] - -project_id     -[text] - -user_id     -[uuid] - -study_id     -[uuid] - -provider     -[git_provider] - - - -public.repo:study_id->public.study:id - - -FOREIGN KEY (study_id) REFERENCES study(id) - - - -public.study_invite - - -public.study_invite -     -[BASE TABLE] - -code     -[text] - -study_id     -[uuid] - -preselected_intervention_ids     -[text[]] - - - -public.study_invite:study_id->public.study:id - - -FOREIGN KEY (study_id) REFERENCES study(id) ON DELETE CASCADE - - - diff --git a/docs/database/public.study_invite.md b/docs/database/public.study_invite.md deleted file mode 100644 index 79c271b4f..000000000 --- a/docs/database/public.study_invite.md +++ /dev/null @@ -1,34 +0,0 @@ -# public.study_invite - -## Description - -Study invite codes - -## Columns - -| Name | Type | Default | Nullable | Children | Parents | Comment | -| ---- | ---- | ------- | -------- | -------- | ------- | ------- | -| code | text | | false | [public.study_subject](public.study_subject.md) | | | -| study_id | uuid | | false | | [public.study](public.study.md) | | -| preselected_intervention_ids | text[] | | true | | | Intervention Ids (and order) preselected by study creator | - -## Constraints - -| Name | Type | Definition | -| ---- | ---- | ---------- | -| study_invite_studyId_fkey | FOREIGN KEY | FOREIGN KEY (study_id) REFERENCES study(id) ON DELETE CASCADE | -| study_invite_pkey | PRIMARY KEY | PRIMARY KEY (code) | - -## Indexes - -| Name | Definition | -| ---- | ---------- | -| study_invite_pkey | CREATE UNIQUE INDEX study_invite_pkey ON public.study_invite USING btree (code) | - -## Relations - -![er](public.study_invite.svg) - ---- - -> Generated by [tbls](https://github.com/k1LoW/tbls) diff --git a/docs/database/public.study_invite.svg b/docs/database/public.study_invite.svg deleted file mode 100644 index 2c39a3f06..000000000 --- a/docs/database/public.study_invite.svg +++ /dev/null @@ -1,148 +0,0 @@ - - - - - - -public.study_invite - - - -public.study_invite - - -public.study_invite -     -[BASE TABLE] - -code -[text] - -study_id -[uuid] - -preselected_intervention_ids -[text[]] - - - - -public.study - - -public.study -     -[BASE TABLE] - -id     -[uuid] - -contact     -[jsonb] - -title     -[text] - -description     -[text] - -icon_name     -[text] - -published     -[boolean] - -registry_published     -[boolean] - -questionnaire     -[jsonb] - -eligibility_criteria     -[jsonb] - -observations     -[jsonb] - -interventions     -[jsonb] - -consent     -[jsonb] - -schedule     -[jsonb] - -report_specification     -[jsonb] - -results     -[jsonb] - -created_at     -[timestamp with time zone] - -updated_at     -[timestamp with time zone] - -user_id     -[uuid] - -participation     -[participation] - -result_sharing     -[result_sharing] - -collaborator_emails     -[text[]] - - - -public.study_invite:study_id->public.study:id - - -FOREIGN KEY (study_id) REFERENCES study(id) ON DELETE CASCADE - - - -public.study_subject - - -public.study_subject -     -[BASE TABLE] - -id     -[uuid] - -study_id     -[uuid] - -user_id     -[uuid] - -started_at     -[timestamp with time zone] - -selected_intervention_ids     -[text[]] - -invite_code     -[text] - -is_deleted     -[boolean] - - - -public.study_subject:invite_code->public.study_invite:code - - -FOREIGN KEY (invite_code) REFERENCES study_invite(code) ON DELETE CASCADE - - - diff --git a/docs/database/public.study_progress_export.md b/docs/database/public.study_progress_export.md deleted file mode 100644 index 44e005d14..000000000 --- a/docs/database/public.study_progress_export.md +++ /dev/null @@ -1,53 +0,0 @@ -# public.study_progress_export - -## Description - -
-Table Definition - -```sql -CREATE VIEW study_progress_export AS ( - SELECT subject_progress.completed_at, - subject_progress.intervention_id, - subject_progress.task_id, - subject_progress.result_type, - subject_progress.result, - subject_progress.subject_id, - study_subject.user_id, - study_subject.study_id, - study_subject.started_at, - study_subject.selected_intervention_ids - FROM study_subject, - subject_progress - WHERE (study_subject.id = subject_progress.subject_id) -) -``` - -
- -## Referenced Tables - -- [public.study_subject](public.study_subject.md) - -## Columns - -| Name | Type | Default | Nullable | Children | Parents | Comment | -| ---- | ---- | ------- | -------- | -------- | ------- | ------- | -| completed_at | timestamp with time zone | | true | | | | -| intervention_id | text | | true | | | | -| task_id | text | | true | | | | -| result_type | text | | true | | | | -| result | jsonb | | true | | | | -| subject_id | uuid | | true | | | | -| user_id | uuid | | true | | | | -| study_id | uuid | | true | | | | -| started_at | timestamp with time zone | | true | | | | -| selected_intervention_ids | text[] | | true | | | | - -## Relations - -![er](public.study_progress_export.svg) - ---- - -> Generated by [tbls](https://github.com/k1LoW/tbls) diff --git a/docs/database/public.study_progress_export.svg b/docs/database/public.study_progress_export.svg deleted file mode 100644 index 628fd0f66..000000000 --- a/docs/database/public.study_progress_export.svg +++ /dev/null @@ -1,53 +0,0 @@ - - - - - - -public.study_progress_export - - - -public.study_progress_export - - -public.study_progress_export -     -[VIEW] - -completed_at -[timestamp with time zone] - -intervention_id -[text] - -task_id -[text] - -result_type -[text] - -result -[jsonb] - -subject_id -[uuid] - -user_id -[uuid] - -study_id -[uuid] - -started_at -[timestamp with time zone] - -selected_intervention_ids -[text[]] - - - - diff --git a/docs/database/public.study_subject.md b/docs/database/public.study_subject.md deleted file mode 100644 index 76d3dd93c..000000000 --- a/docs/database/public.study_subject.md +++ /dev/null @@ -1,38 +0,0 @@ -# public.study_subject - -## Description - -## Columns - -| Name | Type | Default | Nullable | Children | Parents | Comment | -| ---- | ---- | ------- | -------- | -------- | ------- | ------- | -| id | uuid | gen_random_uuid() | false | [public.subject_progress](public.subject_progress.md) | | | -| study_id | uuid | | false | | [public.study](public.study.md) | | -| user_id | uuid | | false | | [public.user](public.user.md) | | -| started_at | timestamp with time zone | now() | true | | | | -| selected_intervention_ids | text[] | | false | | | | -| invite_code | text | | true | | [public.study_invite](public.study_invite.md) | | -| is_deleted | boolean | false | false | | | | - -## Constraints - -| Name | Type | Definition | -| ---- | ---- | ---------- | -| study_subject_studyId_fkey | FOREIGN KEY | FOREIGN KEY (study_id) REFERENCES study(id) ON DELETE CASCADE | -| study_subject_loginCode_fkey | FOREIGN KEY | FOREIGN KEY (invite_code) REFERENCES study_invite(code) ON DELETE CASCADE | -| study_subject_pkey | PRIMARY KEY | PRIMARY KEY (id) | -| study_subject_userId_fkey | FOREIGN KEY | FOREIGN KEY (user_id) REFERENCES "user"(id) | - -## Indexes - -| Name | Definition | -| ---- | ---------- | -| study_subject_pkey | CREATE UNIQUE INDEX study_subject_pkey ON public.study_subject USING btree (id) | - -## Relations - -![er](public.study_subject.svg) - ---- - -> Generated by [tbls](https://github.com/k1LoW/tbls) diff --git a/docs/database/public.study_subject.svg b/docs/database/public.study_subject.svg deleted file mode 100644 index 00b4f83b2..000000000 --- a/docs/database/public.study_subject.svg +++ /dev/null @@ -1,207 +0,0 @@ - - - - - - -public.study_subject - - - -public.study_subject - - -public.study_subject -     -[BASE TABLE] - -id -[uuid] - -study_id -[uuid] - -user_id -[uuid] - -started_at -[timestamp with time zone] - -selected_intervention_ids -[text[]] - -invite_code -[text] - -is_deleted -[boolean] - - - - -public.study - - -public.study -     -[BASE TABLE] - -id     -[uuid] - -contact     -[jsonb] - -title     -[text] - -description     -[text] - -icon_name     -[text] - -published     -[boolean] - -registry_published     -[boolean] - -questionnaire     -[jsonb] - -eligibility_criteria     -[jsonb] - -observations     -[jsonb] - -interventions     -[jsonb] - -consent     -[jsonb] - -schedule     -[jsonb] - -report_specification     -[jsonb] - -results     -[jsonb] - -created_at     -[timestamp with time zone] - -updated_at     -[timestamp with time zone] - -user_id     -[uuid] - -participation     -[participation] - -result_sharing     -[result_sharing] - -collaborator_emails     -[text[]] - - - -public.study_subject:study_id->public.study:id - - -FOREIGN KEY (study_id) REFERENCES study(id) ON DELETE CASCADE - - - -public.user - - -public.user -     -[BASE TABLE] - -id     -[uuid] - -email     -[text] - -preferences     -[jsonb] - - - -public.study_subject:user_id->public.user:id - - -FOREIGN KEY (user_id) REFERENCES "user"(id) - - - -public.study_invite - - -public.study_invite -     -[BASE TABLE] - -code     -[text] - -study_id     -[uuid] - -preselected_intervention_ids     -[text[]] - - - -public.study_subject:invite_code->public.study_invite:code - - -FOREIGN KEY (invite_code) REFERENCES study_invite(code) ON DELETE CASCADE - - - -public.subject_progress - - -public.subject_progress -     -[BASE TABLE] - -completed_at     -[timestamp with time zone] - -subject_id     -[uuid] - -intervention_id     -[text] - -task_id     -[text] - -result_type     -[text] - -result     -[jsonb] - - - -public.subject_progress:subject_id->public.study_subject:id - - -FOREIGN KEY (subject_id) REFERENCES study_subject(id) ON DELETE CASCADE - - - diff --git a/docs/database/public.study_tag.md b/docs/database/public.study_tag.md deleted file mode 100644 index c04ba255c..000000000 --- a/docs/database/public.study_tag.md +++ /dev/null @@ -1,32 +0,0 @@ -# public.study_tag - -## Description - -## Columns - -| Name | Type | Default | Nullable | Children | Parents | Comment | -| ---- | ---- | ------- | -------- | -------- | ------- | ------- | -| study_id | uuid | | false | | [public.study](public.study.md) | | -| tag_id | uuid | | false | | [public.tag](public.tag.md) | | - -## Constraints - -| Name | Type | Definition | -| ---- | ---- | ---------- | -| study_tag_studyId_fkey | FOREIGN KEY | FOREIGN KEY (study_id) REFERENCES study(id) ON DELETE CASCADE | -| study_tag_tagId_fkey | FOREIGN KEY | FOREIGN KEY (tag_id) REFERENCES tag(id) ON DELETE CASCADE | -| study_tag_pkey | PRIMARY KEY | PRIMARY KEY (study_id, tag_id) | - -## Indexes - -| Name | Definition | -| ---- | ---------- | -| study_tag_pkey | CREATE UNIQUE INDEX study_tag_pkey ON public.study_tag USING btree (study_id, tag_id) | - -## Relations - -![er](public.study_tag.svg) - ---- - -> Generated by [tbls](https://github.com/k1LoW/tbls) diff --git a/docs/database/public.study_tag.svg b/docs/database/public.study_tag.svg deleted file mode 100644 index 8df118323..000000000 --- a/docs/database/public.study_tag.svg +++ /dev/null @@ -1,130 +0,0 @@ - - - - - - -public.study_tag - - - -public.study_tag - - -public.study_tag -     -[BASE TABLE] - -study_id -[uuid] - -tag_id -[uuid] - - - - -public.study - - -public.study -     -[BASE TABLE] - -id     -[uuid] - -contact     -[jsonb] - -title     -[text] - -description     -[text] - -icon_name     -[text] - -published     -[boolean] - -registry_published     -[boolean] - -questionnaire     -[jsonb] - -eligibility_criteria     -[jsonb] - -observations     -[jsonb] - -interventions     -[jsonb] - -consent     -[jsonb] - -schedule     -[jsonb] - -report_specification     -[jsonb] - -results     -[jsonb] - -created_at     -[timestamp with time zone] - -updated_at     -[timestamp with time zone] - -user_id     -[uuid] - -participation     -[participation] - -result_sharing     -[result_sharing] - -collaborator_emails     -[text[]] - - - -public.study_tag:study_id->public.study:id - - -FOREIGN KEY (study_id) REFERENCES study(id) ON DELETE CASCADE - - - -public.tag - - -public.tag -     -[BASE TABLE] - -id     -[uuid] - -name     -[text] - - - -public.study_tag:tag_id->public.tag:id - - -FOREIGN KEY (tag_id) REFERENCES tag(id) ON DELETE CASCADE - - - diff --git a/docs/database/public.subject_progress.md b/docs/database/public.subject_progress.md deleted file mode 100644 index 4290bc003..000000000 --- a/docs/database/public.subject_progress.md +++ /dev/null @@ -1,35 +0,0 @@ -# public.subject_progress - -## Description - -## Columns - -| Name | Type | Default | Nullable | Children | Parents | Comment | -| ---- | ---- | ------- | -------- | -------- | ------- | ------- | -| completed_at | timestamp with time zone | timezone('utc'::text, now()) | false | | | | -| subject_id | uuid | | false | | [public.study_subject](public.study_subject.md) | | -| intervention_id | text | | false | | | | -| task_id | text | | false | | | | -| result_type | text | | false | | | | -| result | jsonb | | false | | | | - -## Constraints - -| Name | Type | Definition | -| ---- | ---- | ---------- | -| participant_progress_pkey | PRIMARY KEY | PRIMARY KEY (completed_at, subject_id) | -| participant_progress_subjectId_fkey | FOREIGN KEY | FOREIGN KEY (subject_id) REFERENCES study_subject(id) ON DELETE CASCADE | - -## Indexes - -| Name | Definition | -| ---- | ---------- | -| participant_progress_pkey | CREATE UNIQUE INDEX participant_progress_pkey ON public.subject_progress USING btree (completed_at, subject_id) | - -## Relations - -![er](public.subject_progress.svg) - ---- - -> Generated by [tbls](https://github.com/k1LoW/tbls) diff --git a/docs/database/public.subject_progress.svg b/docs/database/public.subject_progress.svg deleted file mode 100644 index 4d3b52aaa..000000000 --- a/docs/database/public.subject_progress.svg +++ /dev/null @@ -1,78 +0,0 @@ - - - - - - -public.subject_progress - - - -public.subject_progress - - -public.subject_progress -     -[BASE TABLE] - -completed_at -[timestamp with time zone] - -subject_id -[uuid] - -intervention_id -[text] - -task_id -[text] - -result_type -[text] - -result -[jsonb] - - - - -public.study_subject - - -public.study_subject -     -[BASE TABLE] - -id     -[uuid] - -study_id     -[uuid] - -user_id     -[uuid] - -started_at     -[timestamp with time zone] - -selected_intervention_ids     -[text[]] - -invite_code     -[text] - -is_deleted     -[boolean] - - - -public.subject_progress:subject_id->public.study_subject:id - - -FOREIGN KEY (subject_id) REFERENCES study_subject(id) ON DELETE CASCADE - - - diff --git a/docs/database/public.tag.md b/docs/database/public.tag.md deleted file mode 100644 index 7b5185da3..000000000 --- a/docs/database/public.tag.md +++ /dev/null @@ -1,32 +0,0 @@ -# public.tag - -## Description - -## Columns - -| Name | Type | Default | Nullable | Children | Parents | Comment | -| ---- | ---- | ------- | -------- | -------- | ------- | ------- | -| id | uuid | gen_random_uuid() | false | [public.study_tag](public.study_tag.md) | | | -| name | text | | false | | | | - -## Constraints - -| Name | Type | Definition | -| ---- | ---- | ---------- | -| tag_name_key | UNIQUE | UNIQUE (name) | -| tag_pkey | PRIMARY KEY | PRIMARY KEY (id) | - -## Indexes - -| Name | Definition | -| ---- | ---------- | -| tag_name_key | CREATE UNIQUE INDEX tag_name_key ON public.tag USING btree (name) | -| tag_pkey | CREATE UNIQUE INDEX tag_pkey ON public.tag USING btree (id) | - -## Relations - -![er](public.tag.svg) - ---- - -> Generated by [tbls](https://github.com/k1LoW/tbls) diff --git a/docs/database/public.tag.svg b/docs/database/public.tag.svg deleted file mode 100644 index 6f2c73503..000000000 --- a/docs/database/public.tag.svg +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - -public.tag - - - -public.tag - - -public.tag -     -[BASE TABLE] - -id -[uuid] - -name -[text] - - - - -public.study_tag - - -public.study_tag -     -[BASE TABLE] - -study_id     -[uuid] - -tag_id     -[uuid] - - - -public.study_tag:tag_id->public.tag:id - - -FOREIGN KEY (tag_id) REFERENCES tag(id) ON DELETE CASCADE - - - diff --git a/docs/database/public.user.md b/docs/database/public.user.md deleted file mode 100644 index 5164cc9ca..000000000 --- a/docs/database/public.user.md +++ /dev/null @@ -1,33 +0,0 @@ -# public.user - -## Description - -Users get automatically added, when a new user is created in auth.users - -## Columns - -| Name | Type | Default | Nullable | Children | Parents | Comment | -| ---- | ---- | ------- | -------- | -------- | ------- | ------- | -| id | uuid | | false | [public.study](public.study.md) [public.study_subject](public.study_subject.md) [public.repo](public.repo.md) | | | -| email | text | | true | | | | -| preferences | jsonb | | true | | | | - -## Constraints - -| Name | Type | Definition | -| ---- | ---- | ---------- | -| user_pkey | PRIMARY KEY | PRIMARY KEY (id) | - -## Indexes - -| Name | Definition | -| ---- | ---------- | -| user_pkey | CREATE UNIQUE INDEX user_pkey ON public."user" USING btree (id) | - -## Relations - -![er](public.user.svg) - ---- - -> Generated by [tbls](https://github.com/k1LoW/tbls) diff --git a/docs/database/public.user.svg b/docs/database/public.user.svg deleted file mode 100644 index 696e041a9..000000000 --- a/docs/database/public.user.svg +++ /dev/null @@ -1,176 +0,0 @@ - - - - - - -public.user - - - -public.user - - -public.user -     -[BASE TABLE] - -id -[uuid] - -email -[text] - -preferences -[jsonb] - - - - -public.study - - -public.study -     -[BASE TABLE] - -id     -[uuid] - -contact     -[jsonb] - -title     -[text] - -description     -[text] - -icon_name     -[text] - -published     -[boolean] - -registry_published     -[boolean] - -questionnaire     -[jsonb] - -eligibility_criteria     -[jsonb] - -observations     -[jsonb] - -interventions     -[jsonb] - -consent     -[jsonb] - -schedule     -[jsonb] - -report_specification     -[jsonb] - -results     -[jsonb] - -created_at     -[timestamp with time zone] - -updated_at     -[timestamp with time zone] - -user_id     -[uuid] - -participation     -[participation] - -result_sharing     -[result_sharing] - -collaborator_emails     -[text[]] - - - -public.study:user_id->public.user:id - - -FOREIGN KEY (user_id) REFERENCES "user"(id) - - - -public.study_subject - - -public.study_subject -     -[BASE TABLE] - -id     -[uuid] - -study_id     -[uuid] - -user_id     -[uuid] - -started_at     -[timestamp with time zone] - -selected_intervention_ids     -[text[]] - -invite_code     -[text] - -is_deleted     -[boolean] - - - -public.study_subject:user_id->public.user:id - - -FOREIGN KEY (user_id) REFERENCES "user"(id) - - - -public.repo - - -public.repo -     -[BASE TABLE] - -project_id     -[text] - -user_id     -[uuid] - -study_id     -[uuid] - -provider     -[git_provider] - - - -public.repo:user_id->public.user:id - - -FOREIGN KEY (user_id) REFERENCES "user"(id) ON DELETE CASCADE - - - diff --git a/docs/database/schema.json b/docs/database/schema.json deleted file mode 100644 index 3d40ab780..000000000 --- a/docs/database/schema.json +++ /dev/null @@ -1 +0,0 @@ -{"name":"postgres","desc":"","tables":[{"name":"auth.users","type":"BASE TABLE","comment":"Auth: Stores user login data within a secure schema.","columns":[{"name":"instance_id","type":"uuid","nullable":true,"default":null,"comment":""},{"name":"id","type":"uuid","nullable":false,"default":null,"comment":""},{"name":"aud","type":"varchar(255)","nullable":true,"default":null,"comment":""},{"name":"role","type":"varchar(255)","nullable":true,"default":null,"comment":""},{"name":"email","type":"varchar(255)","nullable":true,"default":null,"comment":""},{"name":"encrypted_password","type":"varchar(255)","nullable":true,"default":null,"comment":""},{"name":"confirmed_at","type":"timestamp with time zone","nullable":true,"default":null,"comment":""},{"name":"invited_at","type":"timestamp with time zone","nullable":true,"default":null,"comment":""},{"name":"confirmation_token","type":"varchar(255)","nullable":true,"default":null,"comment":""},{"name":"confirmation_sent_at","type":"timestamp with time zone","nullable":true,"default":null,"comment":""},{"name":"recovery_token","type":"varchar(255)","nullable":true,"default":null,"comment":""},{"name":"recovery_sent_at","type":"timestamp with time zone","nullable":true,"default":null,"comment":""},{"name":"email_change_token","type":"varchar(255)","nullable":true,"default":null,"comment":""},{"name":"email_change","type":"varchar(255)","nullable":true,"default":null,"comment":""},{"name":"email_change_sent_at","type":"timestamp with time zone","nullable":true,"default":null,"comment":""},{"name":"last_sign_in_at","type":"timestamp with time zone","nullable":true,"default":null,"comment":""},{"name":"raw_app_meta_data","type":"jsonb","nullable":true,"default":null,"comment":""},{"name":"raw_user_meta_data","type":"jsonb","nullable":true,"default":null,"comment":""},{"name":"is_super_admin","type":"boolean","nullable":true,"default":null,"comment":""},{"name":"created_at","type":"timestamp with time zone","nullable":true,"default":null,"comment":""},{"name":"updated_at","type":"timestamp with time zone","nullable":true,"default":null,"comment":""}],"indexes":[{"name":"users_pkey","def":"CREATE UNIQUE INDEX users_pkey ON auth.users USING btree (id)","table":"auth.users","columns":["id"],"comment":""},{"name":"users_email_key","def":"CREATE UNIQUE INDEX users_email_key ON auth.users USING btree (email)","table":"auth.users","columns":["email"],"comment":""},{"name":"users_instance_id_email_idx","def":"CREATE INDEX users_instance_id_email_idx ON auth.users USING btree (instance_id, email)","table":"auth.users","columns":["email","instance_id"],"comment":""},{"name":"users_instance_id_idx","def":"CREATE INDEX users_instance_id_idx ON auth.users USING btree (instance_id)","table":"auth.users","columns":["instance_id"],"comment":""}],"constraints":[{"name":"users_pkey","type":"PRIMARY KEY","def":"PRIMARY KEY (id)","table":"auth.users","referenced_table":"","columns":["id"],"referenced_columns":[],"comment":""},{"name":"users_email_key","type":"UNIQUE","def":"UNIQUE (email)","table":"auth.users","referenced_table":"","columns":["email"],"referenced_columns":[],"comment":""}],"triggers":[{"name":"on_auth_user_created","def":"CREATE TRIGGER on_auth_user_created AFTER INSERT ON auth.users FOR EACH ROW EXECUTE FUNCTION handle_new_user()","comment":""}],"def":""},{"name":"auth.refresh_tokens","type":"BASE TABLE","comment":"Auth: Store of tokens used to refresh JWT tokens once they expire.","columns":[{"name":"instance_id","type":"uuid","nullable":true,"default":null,"comment":""},{"name":"id","type":"bigint","nullable":false,"default":"nextval('auth.refresh_tokens_id_seq'::regclass)","comment":""},{"name":"token","type":"varchar(255)","nullable":true,"default":null,"comment":""},{"name":"user_id","type":"varchar(255)","nullable":true,"default":null,"comment":""},{"name":"revoked","type":"boolean","nullable":true,"default":null,"comment":""},{"name":"created_at","type":"timestamp with time zone","nullable":true,"default":null,"comment":""},{"name":"updated_at","type":"timestamp with time zone","nullable":true,"default":null,"comment":""}],"indexes":[{"name":"refresh_tokens_pkey","def":"CREATE UNIQUE INDEX refresh_tokens_pkey ON auth.refresh_tokens USING btree (id)","table":"auth.refresh_tokens","columns":["id"],"comment":""},{"name":"refresh_tokens_instance_id_idx","def":"CREATE INDEX refresh_tokens_instance_id_idx ON auth.refresh_tokens USING btree (instance_id)","table":"auth.refresh_tokens","columns":["instance_id"],"comment":""},{"name":"refresh_tokens_instance_id_user_id_idx","def":"CREATE INDEX refresh_tokens_instance_id_user_id_idx ON auth.refresh_tokens USING btree (instance_id, user_id)","table":"auth.refresh_tokens","columns":["instance_id","user_id"],"comment":""},{"name":"refresh_tokens_token_idx","def":"CREATE INDEX refresh_tokens_token_idx ON auth.refresh_tokens USING btree (token)","table":"auth.refresh_tokens","columns":["token"],"comment":""}],"constraints":[{"name":"refresh_tokens_pkey","type":"PRIMARY KEY","def":"PRIMARY KEY (id)","table":"auth.refresh_tokens","referenced_table":"","columns":["id"],"referenced_columns":[],"comment":""}],"triggers":[],"def":""},{"name":"auth.instances","type":"BASE TABLE","comment":"Auth: Manages users across multiple sites.","columns":[{"name":"id","type":"uuid","nullable":false,"default":null,"comment":""},{"name":"uuid","type":"uuid","nullable":true,"default":null,"comment":""},{"name":"raw_base_config","type":"text","nullable":true,"default":null,"comment":""},{"name":"created_at","type":"timestamp with time zone","nullable":true,"default":null,"comment":""},{"name":"updated_at","type":"timestamp with time zone","nullable":true,"default":null,"comment":""}],"indexes":[{"name":"instances_pkey","def":"CREATE UNIQUE INDEX instances_pkey ON auth.instances USING btree (id)","table":"auth.instances","columns":["id"],"comment":""}],"constraints":[{"name":"instances_pkey","type":"PRIMARY KEY","def":"PRIMARY KEY (id)","table":"auth.instances","referenced_table":"","columns":["id"],"referenced_columns":[],"comment":""}],"triggers":[],"def":""},{"name":"auth.audit_log_entries","type":"BASE TABLE","comment":"Auth: Audit trail for user actions.","columns":[{"name":"instance_id","type":"uuid","nullable":true,"default":null,"comment":""},{"name":"id","type":"uuid","nullable":false,"default":null,"comment":""},{"name":"payload","type":"json","nullable":true,"default":null,"comment":""},{"name":"created_at","type":"timestamp with time zone","nullable":true,"default":null,"comment":""}],"indexes":[{"name":"audit_log_entries_pkey","def":"CREATE UNIQUE INDEX audit_log_entries_pkey ON auth.audit_log_entries USING btree (id)","table":"auth.audit_log_entries","columns":["id"],"comment":""},{"name":"audit_logs_instance_id_idx","def":"CREATE INDEX audit_logs_instance_id_idx ON auth.audit_log_entries USING btree (instance_id)","table":"auth.audit_log_entries","columns":["instance_id"],"comment":""}],"constraints":[{"name":"audit_log_entries_pkey","type":"PRIMARY KEY","def":"PRIMARY KEY (id)","table":"auth.audit_log_entries","referenced_table":"","columns":["id"],"referenced_columns":[],"comment":""}],"triggers":[],"def":""},{"name":"auth.schema_migrations","type":"BASE TABLE","comment":"Auth: Manages updates to the auth system.","columns":[{"name":"version","type":"varchar(255)","nullable":false,"default":null,"comment":""}],"indexes":[{"name":"schema_migrations_pkey","def":"CREATE UNIQUE INDEX schema_migrations_pkey ON auth.schema_migrations USING btree (version)","table":"auth.schema_migrations","columns":["version"],"comment":""}],"constraints":[{"name":"schema_migrations_pkey","type":"PRIMARY KEY","def":"PRIMARY KEY (version)","table":"auth.schema_migrations","referenced_table":"","columns":["version"],"referenced_columns":[],"comment":""}],"triggers":[],"def":""},{"name":"storage.buckets","type":"BASE TABLE","comment":"","columns":[{"name":"id","type":"text","nullable":false,"default":null,"comment":""},{"name":"name","type":"text","nullable":false,"default":null,"comment":""},{"name":"owner","type":"uuid","nullable":true,"default":null,"comment":""},{"name":"created_at","type":"timestamp with time zone","nullable":true,"default":"now()","comment":""},{"name":"updated_at","type":"timestamp with time zone","nullable":true,"default":"now()","comment":""}],"indexes":[{"name":"buckets_pkey","def":"CREATE UNIQUE INDEX buckets_pkey ON storage.buckets USING btree (id)","table":"storage.buckets","columns":["id"],"comment":""},{"name":"bname","def":"CREATE UNIQUE INDEX bname ON storage.buckets USING btree (name)","table":"storage.buckets","columns":["name"],"comment":""}],"constraints":[{"name":"buckets_owner_fkey","type":"FOREIGN KEY","def":"FOREIGN KEY (owner) REFERENCES auth.users(id)","table":"storage.buckets","referenced_table":"users","columns":["owner"],"referenced_columns":["id"],"comment":""},{"name":"buckets_pkey","type":"PRIMARY KEY","def":"PRIMARY KEY (id)","table":"storage.buckets","referenced_table":"","columns":["id"],"referenced_columns":[],"comment":""}],"triggers":[],"def":""},{"name":"storage.objects","type":"BASE TABLE","comment":"","columns":[{"name":"id","type":"uuid","nullable":false,"default":"uuid_generate_v4()","comment":""},{"name":"bucket_id","type":"text","nullable":true,"default":null,"comment":""},{"name":"name","type":"text","nullable":true,"default":null,"comment":""},{"name":"owner","type":"uuid","nullable":true,"default":null,"comment":""},{"name":"created_at","type":"timestamp with time zone","nullable":true,"default":"now()","comment":""},{"name":"updated_at","type":"timestamp with time zone","nullable":true,"default":"now()","comment":""},{"name":"last_accessed_at","type":"timestamp with time zone","nullable":true,"default":"now()","comment":""},{"name":"metadata","type":"jsonb","nullable":true,"default":null,"comment":""}],"indexes":[{"name":"objects_pkey","def":"CREATE UNIQUE INDEX objects_pkey ON storage.objects USING btree (id)","table":"storage.objects","columns":["id"],"comment":""},{"name":"bucketid_objname","def":"CREATE UNIQUE INDEX bucketid_objname ON storage.objects USING btree (bucket_id, name)","table":"storage.objects","columns":["bucket_id","name"],"comment":""},{"name":"name_prefix_search","def":"CREATE INDEX name_prefix_search ON storage.objects USING btree (name text_pattern_ops)","table":"storage.objects","columns":["name"],"comment":""}],"constraints":[{"name":"objects_owner_fkey","type":"FOREIGN KEY","def":"FOREIGN KEY (owner) REFERENCES auth.users(id)","table":"storage.objects","referenced_table":"users","columns":["owner"],"referenced_columns":["id"],"comment":""},{"name":"objects_bucketId_fkey","type":"FOREIGN KEY","def":"FOREIGN KEY (bucket_id) REFERENCES storage.buckets(id)","table":"storage.objects","referenced_table":"buckets","columns":["bucket_id"],"referenced_columns":["id"],"comment":""},{"name":"objects_pkey","type":"PRIMARY KEY","def":"PRIMARY KEY (id)","table":"storage.objects","referenced_table":"","columns":["id"],"referenced_columns":[],"comment":""}],"triggers":[],"def":""},{"name":"storage.migrations","type":"BASE TABLE","comment":"","columns":[{"name":"id","type":"integer","nullable":false,"default":null,"comment":""},{"name":"name","type":"varchar(100)","nullable":false,"default":null,"comment":""},{"name":"hash","type":"varchar(40)","nullable":false,"default":null,"comment":""},{"name":"executed_at","type":"timestamp without time zone","nullable":true,"default":"CURRENT_TIMESTAMP","comment":""}],"indexes":[{"name":"migrations_pkey","def":"CREATE UNIQUE INDEX migrations_pkey ON storage.migrations USING btree (id)","table":"storage.migrations","columns":["id"],"comment":""},{"name":"migrations_name_key","def":"CREATE UNIQUE INDEX migrations_name_key ON storage.migrations USING btree (name)","table":"storage.migrations","columns":["name"],"comment":""}],"constraints":[{"name":"migrations_pkey","type":"PRIMARY KEY","def":"PRIMARY KEY (id)","table":"storage.migrations","referenced_table":"","columns":["id"],"referenced_columns":[],"comment":""},{"name":"migrations_name_key","type":"UNIQUE","def":"UNIQUE (name)","table":"storage.migrations","referenced_table":"","columns":["name"],"referenced_columns":[],"comment":""}],"triggers":[],"def":""},{"name":"net.http_request_queue","type":"BASE TABLE","comment":"","columns":[{"name":"id","type":"bigint","nullable":false,"default":"nextval('net.http_request_queue_id_seq'::regclass)","comment":""},{"name":"method","type":"net.http_method","nullable":false,"default":null,"comment":""},{"name":"url","type":"text","nullable":false,"default":null,"comment":""},{"name":"headers","type":"jsonb","nullable":false,"default":null,"comment":""},{"name":"body","type":"bytea","nullable":true,"default":null,"comment":""},{"name":"timeout_milliseconds","type":"integer","nullable":false,"default":null,"comment":""}],"indexes":[],"constraints":[],"triggers":[],"def":""},{"name":"net._http_response","type":"BASE TABLE","comment":"","columns":[{"name":"id","type":"bigint","nullable":true,"default":null,"comment":""},{"name":"status_code","type":"integer","nullable":true,"default":null,"comment":""},{"name":"content_type","type":"text","nullable":true,"default":null,"comment":""},{"name":"headers","type":"jsonb","nullable":true,"default":null,"comment":""},{"name":"content","type":"text","nullable":true,"default":null,"comment":""},{"name":"timed_out","type":"boolean","nullable":true,"default":null,"comment":""},{"name":"error_msg","type":"text","nullable":true,"default":null,"comment":""},{"name":"created","type":"timestamp with time zone","nullable":false,"default":"now()","comment":""}],"indexes":[{"name":"_http_response_created_idx","def":"CREATE INDEX _http_response_created_idx ON net._http_response USING btree (created)","table":"net._http_response","columns":["created"],"comment":""}],"constraints":[],"triggers":[],"def":""},{"name":"supabase_functions.migrations","type":"BASE TABLE","comment":"","columns":[{"name":"version","type":"text","nullable":false,"default":null,"comment":""},{"name":"inserted_at","type":"timestamp with time zone","nullable":false,"default":"now()","comment":""}],"indexes":[{"name":"migrations_pkey","def":"CREATE UNIQUE INDEX migrations_pkey ON supabase_functions.migrations USING btree (version)","table":"supabase_functions.migrations","columns":["version"],"comment":""}],"constraints":[{"name":"migrations_pkey","type":"PRIMARY KEY","def":"PRIMARY KEY (version)","table":"supabase_functions.migrations","referenced_table":"","columns":["version"],"referenced_columns":[],"comment":""}],"triggers":[],"def":""},{"name":"supabase_functions.hooks","type":"BASE TABLE","comment":"Supabase Functions Hooks: Audit trail for triggered hooks.","columns":[{"name":"id","type":"bigint","nullable":false,"default":"nextval('supabase_functions.hooks_id_seq'::regclass)","comment":""},{"name":"hook_table_id","type":"integer","nullable":false,"default":null,"comment":""},{"name":"hook_name","type":"text","nullable":false,"default":null,"comment":""},{"name":"created_at","type":"timestamp with time zone","nullable":false,"default":"now()","comment":""},{"name":"request_id","type":"bigint","nullable":true,"default":null,"comment":""}],"indexes":[{"name":"hooks_pkey","def":"CREATE UNIQUE INDEX hooks_pkey ON supabase_functions.hooks USING btree (id)","table":"supabase_functions.hooks","columns":["id"],"comment":""},{"name":"supabase_functions_hooks_request_id_idx","def":"CREATE INDEX supabase_functions_hooks_request_id_idx ON supabase_functions.hooks USING btree (request_id)","table":"supabase_functions.hooks","columns":["request_id"],"comment":""},{"name":"supabase_functions_hooks_h_table_id_h_name_idx","def":"CREATE INDEX supabase_functions_hooks_h_table_id_h_name_idx ON supabase_functions.hooks USING btree (hook_table_id, hook_name)","table":"supabase_functions.hooks","columns":["hook_name","hook_table_id"],"comment":""}],"constraints":[{"name":"hooks_pkey","type":"PRIMARY KEY","def":"PRIMARY KEY (id)","table":"supabase_functions.hooks","referenced_table":"","columns":["id"],"referenced_columns":[],"comment":""}],"triggers":[],"def":""},{"name":"public.study","type":"BASE TABLE","comment":"","columns":[{"name":"id","type":"uuid","nullable":false,"default":"gen_random_uuid()","comment":""},{"name":"contact","type":"jsonb","nullable":false,"default":null,"comment":""},{"name":"title","type":"text","nullable":false,"default":null,"comment":""},{"name":"description","type":"text","nullable":false,"default":null,"comment":""},{"name":"icon_name","type":"text","nullable":false,"default":null,"comment":""},{"name":"published","type":"boolean","nullable":false,"default":"false","comment":""},{"name":"registry_published","type":"boolean","nullable":false,"default":"false","comment":""},{"name":"questionnaire","type":"jsonb","nullable":false,"default":null,"comment":""},{"name":"eligibility_criteria","type":"jsonb","nullable":false,"default":null,"comment":""},{"name":"observations","type":"jsonb","nullable":false,"default":null,"comment":""},{"name":"interventions","type":"jsonb","nullable":false,"default":null,"comment":""},{"name":"consent","type":"jsonb","nullable":false,"default":null,"comment":""},{"name":"schedule","type":"jsonb","nullable":false,"default":null,"comment":""},{"name":"report_specification","type":"jsonb","nullable":false,"default":null,"comment":""},{"name":"results","type":"jsonb","nullable":false,"default":null,"comment":""},{"name":"created_at","type":"timestamp with time zone","nullable":false,"default":"now()","comment":""},{"name":"updated_at","type":"timestamp with time zone","nullable":false,"default":"now()","comment":""},{"name":"user_id","type":"uuid","nullable":false,"default":null,"comment":"UserId of study creator"},{"name":"participation","type":"participation","nullable":false,"default":"'invite'::participation","comment":""},{"name":"result_sharing","type":"result_sharing","nullable":false,"default":"'private'::result_sharing","comment":""},{"name":"collaborator_emails","type":"text[]","nullable":false,"default":"'{}'::text[]","comment":""}],"indexes":[{"name":"study_id_key","def":"CREATE UNIQUE INDEX study_id_key ON public.study USING btree (id)","table":"public.study","columns":["id"],"comment":""},{"name":"study_pkey","def":"CREATE UNIQUE INDEX study_pkey ON public.study USING btree (id)","table":"public.study","columns":["id"],"comment":""}],"constraints":[{"name":"study_id_key","type":"UNIQUE","def":"UNIQUE (id)","table":"public.study","referenced_table":"","columns":["id"],"referenced_columns":[],"comment":""},{"name":"study_pkey","type":"PRIMARY KEY","def":"PRIMARY KEY (id)","table":"public.study","referenced_table":"","columns":["id"],"referenced_columns":[],"comment":""},{"name":"study_userId_fkey","type":"FOREIGN KEY","def":"FOREIGN KEY (user_id) REFERENCES \"user\"(id)","table":"public.study","referenced_table":"user","columns":["user_id"],"referenced_columns":["id"],"comment":""}],"triggers":[{"name":"handle_updated_at","def":"CREATE TRIGGER handle_updated_at BEFORE UPDATE ON public.study FOR EACH ROW EXECUTE FUNCTION moddatetime('updated_at')","comment":""}],"def":""},{"name":"public.study_subject","type":"BASE TABLE","comment":"","columns":[{"name":"id","type":"uuid","nullable":false,"default":"gen_random_uuid()","comment":""},{"name":"study_id","type":"uuid","nullable":false,"default":null,"comment":""},{"name":"user_id","type":"uuid","nullable":false,"default":null,"comment":""},{"name":"started_at","type":"timestamp with time zone","nullable":true,"default":"now()","comment":""},{"name":"selected_intervention_ids","type":"text[]","nullable":false,"default":null,"comment":""},{"name":"invite_code","type":"text","nullable":true,"default":null,"comment":""},{"name":"is_deleted","type":"boolean","nullable":false,"default":"false","comment":""}],"indexes":[{"name":"study_subject_pkey","def":"CREATE UNIQUE INDEX study_subject_pkey ON public.study_subject USING btree (id)","table":"public.study_subject","columns":["id"],"comment":""}],"constraints":[{"name":"study_subject_studyId_fkey","type":"FOREIGN KEY","def":"FOREIGN KEY (study_id) REFERENCES study(id) ON DELETE CASCADE","table":"public.study_subject","referenced_table":"study","columns":["study_id"],"referenced_columns":["id"],"comment":""},{"name":"study_subject_loginCode_fkey","type":"FOREIGN KEY","def":"FOREIGN KEY (invite_code) REFERENCES study_invite(code) ON DELETE CASCADE","table":"public.study_subject","referenced_table":"study_invite","columns":["invite_code"],"referenced_columns":["code"],"comment":""},{"name":"study_subject_pkey","type":"PRIMARY KEY","def":"PRIMARY KEY (id)","table":"public.study_subject","referenced_table":"","columns":["id"],"referenced_columns":[],"comment":""},{"name":"study_subject_userId_fkey","type":"FOREIGN KEY","def":"FOREIGN KEY (user_id) REFERENCES \"user\"(id)","table":"public.study_subject","referenced_table":"user","columns":["user_id"],"referenced_columns":["id"],"comment":""}],"triggers":[],"def":""},{"name":"public.app_config","type":"BASE TABLE","comment":"Stores app config for different envs","columns":[{"name":"id","type":"text","nullable":false,"default":null,"comment":""},{"name":"app_min_version","type":"text","nullable":false,"default":null,"comment":""},{"name":"app_privacy","type":"jsonb","nullable":false,"default":null,"comment":""},{"name":"app_terms","type":"jsonb","nullable":false,"default":null,"comment":""},{"name":"designer_privacy","type":"jsonb","nullable":false,"default":null,"comment":""},{"name":"designer_terms","type":"jsonb","nullable":false,"default":null,"comment":""},{"name":"imprint","type":"jsonb","nullable":false,"default":null,"comment":""},{"name":"contact","type":"jsonb","nullable":false,"default":"'{\"email\": \"hpi-info@hpi.de\", \"phone\": \"+49-(0)331 5509-0\", \"website\": \"https://hpi.de/\", \"organization\": \"Hasso Plattner Institute\"}'::jsonb","comment":""},{"name":"analytics","type":"jsonb","nullable":true,"default":null,"comment":""}],"indexes":[{"name":"AppConfig_pkey","def":"CREATE UNIQUE INDEX \"AppConfig_pkey\" ON public.app_config USING btree (id)","table":"public.app_config","columns":["id"],"comment":""}],"constraints":[{"name":"AppConfig_pkey","type":"PRIMARY KEY","def":"PRIMARY KEY (id)","table":"public.app_config","referenced_table":"","columns":["id"],"referenced_columns":[],"comment":""}],"triggers":[],"def":""},{"name":"public.repo","type":"BASE TABLE","comment":"Git repo where the generated project is stored","columns":[{"name":"project_id","type":"text","nullable":false,"default":null,"comment":""},{"name":"user_id","type":"uuid","nullable":false,"default":null,"comment":""},{"name":"study_id","type":"uuid","nullable":false,"default":null,"comment":""},{"name":"provider","type":"git_provider","nullable":false,"default":null,"comment":""}],"indexes":[{"name":"repo_pkey","def":"CREATE UNIQUE INDEX repo_pkey ON public.repo USING btree (project_id)","table":"public.repo","columns":["project_id"],"comment":""}],"constraints":[{"name":"repo_studyId_fkey","type":"FOREIGN KEY","def":"FOREIGN KEY (study_id) REFERENCES study(id)","table":"public.repo","referenced_table":"study","columns":["study_id"],"referenced_columns":["id"],"comment":""},{"name":"repo_pkey","type":"PRIMARY KEY","def":"PRIMARY KEY (project_id)","table":"public.repo","referenced_table":"","columns":["project_id"],"referenced_columns":[],"comment":""},{"name":"repo_userId_fkey","type":"FOREIGN KEY","def":"FOREIGN KEY (user_id) REFERENCES \"user\"(id) ON DELETE CASCADE","table":"public.repo","referenced_table":"user","columns":["user_id"],"referenced_columns":["id"],"comment":""}],"triggers":[],"def":""},{"name":"public.study_invite","type":"BASE TABLE","comment":"Study invite codes","columns":[{"name":"code","type":"text","nullable":false,"default":null,"comment":""},{"name":"study_id","type":"uuid","nullable":false,"default":null,"comment":""},{"name":"preselected_intervention_ids","type":"text[]","nullable":true,"default":null,"comment":"Intervention Ids (and order) preselected by study creator"}],"indexes":[{"name":"study_invite_pkey","def":"CREATE UNIQUE INDEX study_invite_pkey ON public.study_invite USING btree (code)","table":"public.study_invite","columns":["code"],"comment":""}],"constraints":[{"name":"study_invite_studyId_fkey","type":"FOREIGN KEY","def":"FOREIGN KEY (study_id) REFERENCES study(id) ON DELETE CASCADE","table":"public.study_invite","referenced_table":"study","columns":["study_id"],"referenced_columns":["id"],"comment":""},{"name":"study_invite_pkey","type":"PRIMARY KEY","def":"PRIMARY KEY (code)","table":"public.study_invite","referenced_table":"","columns":["code"],"referenced_columns":[],"comment":""}],"triggers":[],"def":""},{"name":"public.subject_progress","type":"BASE TABLE","comment":"","columns":[{"name":"completed_at","type":"timestamp with time zone","nullable":false,"default":"timezone('utc'::text, now())","comment":""},{"name":"subject_id","type":"uuid","nullable":false,"default":null,"comment":""},{"name":"intervention_id","type":"text","nullable":false,"default":null,"comment":""},{"name":"task_id","type":"text","nullable":false,"default":null,"comment":""},{"name":"result_type","type":"text","nullable":false,"default":null,"comment":""},{"name":"result","type":"jsonb","nullable":false,"default":null,"comment":""}],"indexes":[{"name":"participant_progress_pkey","def":"CREATE UNIQUE INDEX participant_progress_pkey ON public.subject_progress USING btree (completed_at, subject_id)","table":"public.subject_progress","columns":["completed_at","subject_id"],"comment":""}],"constraints":[{"name":"participant_progress_pkey","type":"PRIMARY KEY","def":"PRIMARY KEY (completed_at, subject_id)","table":"public.subject_progress","referenced_table":"","columns":["completed_at","subject_id"],"referenced_columns":[],"comment":""},{"name":"participant_progress_subjectId_fkey","type":"FOREIGN KEY","def":"FOREIGN KEY (subject_id) REFERENCES study_subject(id) ON DELETE CASCADE","table":"public.subject_progress","referenced_table":"study_subject","columns":["subject_id"],"referenced_columns":["id"],"comment":""}],"triggers":[],"def":""},{"name":"public.study_progress_export","type":"VIEW","comment":"","columns":[{"name":"completed_at","type":"timestamp with time zone","nullable":true,"default":null,"comment":""},{"name":"intervention_id","type":"text","nullable":true,"default":null,"comment":""},{"name":"task_id","type":"text","nullable":true,"default":null,"comment":""},{"name":"result_type","type":"text","nullable":true,"default":null,"comment":""},{"name":"result","type":"jsonb","nullable":true,"default":null,"comment":""},{"name":"subject_id","type":"uuid","nullable":true,"default":null,"comment":""},{"name":"user_id","type":"uuid","nullable":true,"default":null,"comment":""},{"name":"study_id","type":"uuid","nullable":true,"default":null,"comment":""},{"name":"started_at","type":"timestamp with time zone","nullable":true,"default":null,"comment":""},{"name":"selected_intervention_ids","type":"text[]","nullable":true,"default":null,"comment":""}],"indexes":[],"constraints":[],"triggers":[],"def":"CREATE VIEW study_progress_export AS (\n SELECT subject_progress.completed_at,\n subject_progress.intervention_id,\n subject_progress.task_id,\n subject_progress.result_type,\n subject_progress.result,\n subject_progress.subject_id,\n study_subject.user_id,\n study_subject.study_id,\n study_subject.started_at,\n study_subject.selected_intervention_ids\n FROM study_subject,\n subject_progress\n WHERE (study_subject.id = subject_progress.subject_id)\n)","referenced_tables":["public.study_subject"]},{"name":"public.user","type":"BASE TABLE","comment":"Users get automatically added, when a new user is created in auth.users","columns":[{"name":"id","type":"uuid","nullable":false,"default":null,"comment":""},{"name":"email","type":"text","nullable":true,"default":null,"comment":""},{"name":"preferences","type":"jsonb","nullable":true,"default":null,"comment":""}],"indexes":[{"name":"user_pkey","def":"CREATE UNIQUE INDEX user_pkey ON public.\"user\" USING btree (id)","table":"public.user","columns":["id"],"comment":""}],"constraints":[{"name":"user_pkey","type":"PRIMARY KEY","def":"PRIMARY KEY (id)","table":"public.user","referenced_table":"","columns":["id"],"referenced_columns":[],"comment":""}],"triggers":[],"def":""},{"name":"extensions.pg_stat_statements_info","type":"VIEW","comment":"","columns":[{"name":"dealloc","type":"bigint","nullable":true,"default":null,"comment":""},{"name":"stats_reset","type":"timestamp with time zone","nullable":true,"default":null,"comment":""}],"indexes":[],"constraints":[],"triggers":[],"def":"CREATE VIEW pg_stat_statements_info AS (\n SELECT pg_stat_statements_info.dealloc,\n pg_stat_statements_info.stats_reset\n FROM pg_stat_statements_info() pg_stat_statements_info(dealloc, stats_reset)\n)","referenced_tables":["pg_stat_statements_info"]},{"name":"extensions.pg_stat_statements","type":"VIEW","comment":"","columns":[{"name":"userid","type":"oid","nullable":true,"default":null,"comment":""},{"name":"dbid","type":"oid","nullable":true,"default":null,"comment":""},{"name":"toplevel","type":"boolean","nullable":true,"default":null,"comment":""},{"name":"queryid","type":"bigint","nullable":true,"default":null,"comment":""},{"name":"query","type":"text","nullable":true,"default":null,"comment":""},{"name":"plans","type":"bigint","nullable":true,"default":null,"comment":""},{"name":"total_plan_time","type":"double precision","nullable":true,"default":null,"comment":""},{"name":"min_plan_time","type":"double precision","nullable":true,"default":null,"comment":""},{"name":"max_plan_time","type":"double precision","nullable":true,"default":null,"comment":""},{"name":"mean_plan_time","type":"double precision","nullable":true,"default":null,"comment":""},{"name":"stddev_plan_time","type":"double precision","nullable":true,"default":null,"comment":""},{"name":"calls","type":"bigint","nullable":true,"default":null,"comment":""},{"name":"total_exec_time","type":"double precision","nullable":true,"default":null,"comment":""},{"name":"min_exec_time","type":"double precision","nullable":true,"default":null,"comment":""},{"name":"max_exec_time","type":"double precision","nullable":true,"default":null,"comment":""},{"name":"mean_exec_time","type":"double precision","nullable":true,"default":null,"comment":""},{"name":"stddev_exec_time","type":"double precision","nullable":true,"default":null,"comment":""},{"name":"rows","type":"bigint","nullable":true,"default":null,"comment":""},{"name":"shared_blks_hit","type":"bigint","nullable":true,"default":null,"comment":""},{"name":"shared_blks_read","type":"bigint","nullable":true,"default":null,"comment":""},{"name":"shared_blks_dirtied","type":"bigint","nullable":true,"default":null,"comment":""},{"name":"shared_blks_written","type":"bigint","nullable":true,"default":null,"comment":""},{"name":"local_blks_hit","type":"bigint","nullable":true,"default":null,"comment":""},{"name":"local_blks_read","type":"bigint","nullable":true,"default":null,"comment":""},{"name":"local_blks_dirtied","type":"bigint","nullable":true,"default":null,"comment":""},{"name":"local_blks_written","type":"bigint","nullable":true,"default":null,"comment":""},{"name":"temp_blks_read","type":"bigint","nullable":true,"default":null,"comment":""},{"name":"temp_blks_written","type":"bigint","nullable":true,"default":null,"comment":""},{"name":"blk_read_time","type":"double precision","nullable":true,"default":null,"comment":""},{"name":"blk_write_time","type":"double precision","nullable":true,"default":null,"comment":""},{"name":"temp_blk_read_time","type":"double precision","nullable":true,"default":null,"comment":""},{"name":"temp_blk_write_time","type":"double precision","nullable":true,"default":null,"comment":""},{"name":"wal_records","type":"bigint","nullable":true,"default":null,"comment":""},{"name":"wal_fpi","type":"bigint","nullable":true,"default":null,"comment":""},{"name":"wal_bytes","type":"numeric","nullable":true,"default":null,"comment":""},{"name":"jit_functions","type":"bigint","nullable":true,"default":null,"comment":""},{"name":"jit_generation_time","type":"double precision","nullable":true,"default":null,"comment":""},{"name":"jit_inlining_count","type":"bigint","nullable":true,"default":null,"comment":""},{"name":"jit_inlining_time","type":"double precision","nullable":true,"default":null,"comment":""},{"name":"jit_optimization_count","type":"bigint","nullable":true,"default":null,"comment":""},{"name":"jit_optimization_time","type":"double precision","nullable":true,"default":null,"comment":""},{"name":"jit_emission_count","type":"bigint","nullable":true,"default":null,"comment":""},{"name":"jit_emission_time","type":"double precision","nullable":true,"default":null,"comment":""}],"indexes":[],"constraints":[],"triggers":[],"def":"CREATE VIEW pg_stat_statements AS (\n SELECT pg_stat_statements.userid,\n pg_stat_statements.dbid,\n pg_stat_statements.toplevel,\n pg_stat_statements.queryid,\n pg_stat_statements.query,\n pg_stat_statements.plans,\n pg_stat_statements.total_plan_time,\n pg_stat_statements.min_plan_time,\n pg_stat_statements.max_plan_time,\n pg_stat_statements.mean_plan_time,\n pg_stat_statements.stddev_plan_time,\n pg_stat_statements.calls,\n pg_stat_statements.total_exec_time,\n pg_stat_statements.min_exec_time,\n pg_stat_statements.max_exec_time,\n pg_stat_statements.mean_exec_time,\n pg_stat_statements.stddev_exec_time,\n pg_stat_statements.rows,\n pg_stat_statements.shared_blks_hit,\n pg_stat_statements.shared_blks_read,\n pg_stat_statements.shared_blks_dirtied,\n pg_stat_statements.shared_blks_written,\n pg_stat_statements.local_blks_hit,\n pg_stat_statements.local_blks_read,\n pg_stat_statements.local_blks_dirtied,\n pg_stat_statements.local_blks_written,\n pg_stat_statements.temp_blks_read,\n pg_stat_statements.temp_blks_written,\n pg_stat_statements.blk_read_time,\n pg_stat_statements.blk_write_time,\n pg_stat_statements.temp_blk_read_time,\n pg_stat_statements.temp_blk_write_time,\n pg_stat_statements.wal_records,\n pg_stat_statements.wal_fpi,\n pg_stat_statements.wal_bytes,\n pg_stat_statements.jit_functions,\n pg_stat_statements.jit_generation_time,\n pg_stat_statements.jit_inlining_count,\n pg_stat_statements.jit_inlining_time,\n pg_stat_statements.jit_optimization_count,\n pg_stat_statements.jit_optimization_time,\n pg_stat_statements.jit_emission_count,\n pg_stat_statements.jit_emission_time\n FROM pg_stat_statements(true) pg_stat_statements(userid, dbid, toplevel, queryid, query, plans, total_plan_time, min_plan_time, max_plan_time, mean_plan_time, stddev_plan_time, calls, total_exec_time, min_exec_time, max_exec_time, mean_exec_time, stddev_exec_time, rows, shared_blks_hit, shared_blks_read, shared_blks_dirtied, shared_blks_written, local_blks_hit, local_blks_read, local_blks_dirtied, local_blks_written, temp_blks_read, temp_blks_written, blk_read_time, blk_write_time, temp_blk_read_time, temp_blk_write_time, wal_records, wal_fpi, wal_bytes, jit_functions, jit_generation_time, jit_inlining_count, jit_inlining_time, jit_optimization_count, jit_optimization_time, jit_emission_count, jit_emission_time)\n)","referenced_tables":["pg_stat_statements"]},{"name":"pgsodium.key","type":"BASE TABLE","comment":"This table holds metadata for derived keys given a key_id and key_context. The raw key is never stored.","columns":[{"name":"id","type":"uuid","nullable":false,"default":"gen_random_uuid()","comment":""},{"name":"status","type":"pgsodium.key_status","nullable":true,"default":"'valid'::pgsodium.key_status","comment":""},{"name":"created","type":"timestamp with time zone","nullable":false,"default":"CURRENT_TIMESTAMP","comment":""},{"name":"expires","type":"timestamp with time zone","nullable":true,"default":null,"comment":""},{"name":"key_type","type":"pgsodium.key_type","nullable":true,"default":null,"comment":""},{"name":"key_id","type":"bigint","nullable":true,"default":"nextval('pgsodium.key_key_id_seq'::regclass)","comment":""},{"name":"key_context","type":"bytea","nullable":true,"default":"'\\x7067736f6469756d'::bytea","comment":""},{"name":"name","type":"text","nullable":true,"default":null,"comment":""},{"name":"associated_data","type":"text","nullable":true,"default":"'associated'::text","comment":""},{"name":"raw_key","type":"bytea","nullable":true,"default":null,"comment":""},{"name":"raw_key_nonce","type":"bytea","nullable":true,"default":null,"comment":""},{"name":"parent_key","type":"uuid","nullable":true,"default":null,"comment":""},{"name":"comment","type":"text","nullable":true,"default":null,"comment":""},{"name":"user_data","type":"text","nullable":true,"default":null,"comment":""}],"indexes":[{"name":"key_pkey","def":"CREATE UNIQUE INDEX key_pkey ON pgsodium.key USING btree (id)","table":"pgsodium.key","columns":["id"],"comment":""},{"name":"key_status_idx","def":"CREATE INDEX key_status_idx ON pgsodium.key USING btree (status) WHERE (status = ANY (ARRAY['valid'::pgsodium.key_status, 'default'::pgsodium.key_status]))","table":"pgsodium.key","columns":["status"],"comment":""},{"name":"key_status_idx1","def":"CREATE UNIQUE INDEX key_status_idx1 ON pgsodium.key USING btree (status) WHERE (status = 'default'::pgsodium.key_status)","table":"pgsodium.key","columns":["status"],"comment":""},{"name":"key_key_id_key_context_key_type_idx","def":"CREATE UNIQUE INDEX key_key_id_key_context_key_type_idx ON pgsodium.key USING btree (key_id, key_context, key_type)","table":"pgsodium.key","columns":["key_context","key_id","key_type"],"comment":""},{"name":"pgsodium_key_unique_name","def":"CREATE UNIQUE INDEX pgsodium_key_unique_name ON pgsodium.key USING btree (name)","table":"pgsodium.key","columns":["name"],"comment":""}],"constraints":[{"name":"key_key_context_check","type":"CHECK","def":"CHECK ((length(key_context) = 8))","table":"pgsodium.key","referenced_table":"","columns":["key_context"],"referenced_columns":[],"comment":""},{"name":"pgsodium_raw","type":"CHECK","def":"CHECK (\nCASE\n WHEN (raw_key IS NOT NULL) THEN ((key_id IS NULL) AND (key_context IS NULL) AND (parent_key IS NOT NULL))\n ELSE ((key_id IS NOT NULL) AND (key_context IS NOT NULL) AND (parent_key IS NULL))\nEND)","table":"pgsodium.key","referenced_table":"","columns":["key_id","key_context","raw_key","parent_key"],"referenced_columns":[],"comment":""},{"name":"key_parent_key_fkey","type":"FOREIGN KEY","def":"FOREIGN KEY (parent_key) REFERENCES pgsodium.key(id)","table":"pgsodium.key","referenced_table":"key","columns":["parent_key"],"referenced_columns":["id"],"comment":""},{"name":"key_pkey","type":"PRIMARY KEY","def":"PRIMARY KEY (id)","table":"pgsodium.key","referenced_table":"","columns":["id"],"referenced_columns":[],"comment":""},{"name":"pgsodium_key_unique_name","type":"UNIQUE","def":"UNIQUE (name)","table":"pgsodium.key","referenced_table":"","columns":["name"],"referenced_columns":[],"comment":""}],"triggers":[{"name":"key_encrypt_secret_trigger_raw_key","def":"CREATE TRIGGER key_encrypt_secret_trigger_raw_key BEFORE INSERT OR UPDATE OF raw_key ON pgsodium.key FOR EACH ROW EXECUTE FUNCTION pgsodium.key_encrypt_secret_raw_key()","comment":""}],"def":""},{"name":"pgsodium.valid_key","type":"VIEW","comment":"","columns":[{"name":"id","type":"uuid","nullable":true,"default":null,"comment":""},{"name":"name","type":"text","nullable":true,"default":null,"comment":""},{"name":"status","type":"pgsodium.key_status","nullable":true,"default":null,"comment":""},{"name":"key_type","type":"pgsodium.key_type","nullable":true,"default":null,"comment":""},{"name":"key_id","type":"bigint","nullable":true,"default":null,"comment":""},{"name":"key_context","type":"bytea","nullable":true,"default":null,"comment":""},{"name":"created","type":"timestamp with time zone","nullable":true,"default":null,"comment":""},{"name":"expires","type":"timestamp with time zone","nullable":true,"default":null,"comment":""},{"name":"associated_data","type":"text","nullable":true,"default":null,"comment":""}],"indexes":[],"constraints":[],"triggers":[],"def":"CREATE VIEW valid_key AS (\n SELECT key.id,\n key.name,\n key.status,\n key.key_type,\n key.key_id,\n key.key_context,\n key.created,\n key.expires,\n key.associated_data\n FROM pgsodium.key\n WHERE ((key.status = ANY (ARRAY['valid'::pgsodium.key_status, 'default'::pgsodium.key_status])) AND\n CASE\n WHEN (key.expires IS NULL) THEN true\n ELSE (key.expires \u003e now())\n END)\n)","referenced_tables":["pgsodium.key"]},{"name":"pgsodium.masking_rule","type":"VIEW","comment":"","columns":[{"name":"attrelid","type":"oid","nullable":true,"default":null,"comment":""},{"name":"attnum","type":"integer","nullable":true,"default":null,"comment":""},{"name":"relnamespace","type":"regnamespace","nullable":true,"default":null,"comment":""},{"name":"relname","type":"name","nullable":true,"default":null,"comment":""},{"name":"attname","type":"name","nullable":true,"default":null,"comment":""},{"name":"format_type","type":"text","nullable":true,"default":null,"comment":""},{"name":"col_description","type":"text","nullable":true,"default":null,"comment":""},{"name":"key_id_column","type":"text","nullable":true,"default":null,"comment":""},{"name":"key_id","type":"text","nullable":true,"default":null,"comment":""},{"name":"associated_columns","type":"text","nullable":true,"default":null,"comment":""},{"name":"nonce_column","type":"text","nullable":true,"default":null,"comment":""},{"name":"view_name","type":"text","nullable":true,"default":null,"comment":""},{"name":"priority","type":"integer","nullable":true,"default":null,"comment":""},{"name":"security_invoker","type":"boolean","nullable":true,"default":null,"comment":""}],"indexes":[],"constraints":[],"triggers":[],"def":"CREATE VIEW masking_rule AS (\n WITH const AS (\n SELECT 'encrypt +with +key +id +([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})'::text AS pattern_key_id,\n 'encrypt +with +key +column +([\\w\\\"\\-$]+)'::text AS pattern_key_id_column,\n '(?\u003c=associated) +\\(([\\w\\\"\\-$, ]+)\\)'::text AS pattern_associated_columns,\n '(?\u003c=nonce) +([\\w\\\"\\-$]+)'::text AS pattern_nonce_column,\n '(?\u003c=decrypt with view) +([\\w\\\"\\-$]+\\.[\\w\\\"\\-$]+)'::text AS pattern_view_name,\n '(?\u003c=security invoker)'::text AS pattern_security_invoker\n ), rules_from_seclabels AS (\n SELECT sl.objoid AS attrelid,\n sl.objsubid AS attnum,\n (c.relnamespace)::regnamespace AS relnamespace,\n c.relname,\n a.attname,\n format_type(a.atttypid, a.atttypmod) AS format_type,\n sl.label AS col_description,\n (regexp_match(sl.label, k.pattern_key_id_column, 'i'::text))[1] AS key_id_column,\n (regexp_match(sl.label, k.pattern_key_id, 'i'::text))[1] AS key_id,\n (regexp_match(sl.label, k.pattern_associated_columns, 'i'::text))[1] AS associated_columns,\n (regexp_match(sl.label, k.pattern_nonce_column, 'i'::text))[1] AS nonce_column,\n COALESCE((regexp_match(sl2.label, k.pattern_view_name, 'i'::text))[1], (((c.relnamespace)::regnamespace || '.'::text) || quote_ident(('decrypted_'::text || (c.relname)::text)))) AS view_name,\n 100 AS priority,\n ((regexp_match(sl.label, k.pattern_security_invoker, 'i'::text))[1] IS NOT NULL) AS security_invoker\n FROM const k,\n (((pg_seclabel sl\n JOIN pg_class c ON (((sl.classoid = c.tableoid) AND (sl.objoid = c.oid))))\n JOIN pg_attribute a ON (((a.attrelid = c.oid) AND (sl.objsubid = a.attnum))))\n LEFT JOIN pg_seclabel sl2 ON (((sl2.objoid = c.oid) AND (sl2.objsubid = 0))))\n WHERE ((a.attnum \u003e 0) AND (((c.relnamespace)::regnamespace)::oid \u003c\u003e ('pg_catalog'::regnamespace)::oid) AND (NOT a.attisdropped) AND (sl.label ~~* 'ENCRYPT%'::text) AND (sl.provider = 'pgsodium'::text))\n )\n SELECT DISTINCT ON (rules_from_seclabels.attrelid, rules_from_seclabels.attnum) rules_from_seclabels.attrelid,\n rules_from_seclabels.attnum,\n rules_from_seclabels.relnamespace,\n rules_from_seclabels.relname,\n rules_from_seclabels.attname,\n rules_from_seclabels.format_type,\n rules_from_seclabels.col_description,\n rules_from_seclabels.key_id_column,\n rules_from_seclabels.key_id,\n rules_from_seclabels.associated_columns,\n rules_from_seclabels.nonce_column,\n rules_from_seclabels.view_name,\n rules_from_seclabels.priority,\n rules_from_seclabels.security_invoker\n FROM rules_from_seclabels\n ORDER BY rules_from_seclabels.attrelid, rules_from_seclabels.attnum, rules_from_seclabels.priority DESC\n)"},{"name":"pgsodium.mask_columns","type":"VIEW","comment":"","columns":[{"name":"attname","type":"name","nullable":true,"default":null,"comment":""},{"name":"attrelid","type":"oid","nullable":true,"default":null,"comment":""},{"name":"key_id","type":"text","nullable":true,"default":null,"comment":""},{"name":"key_id_column","type":"text","nullable":true,"default":null,"comment":""},{"name":"associated_columns","type":"text","nullable":true,"default":null,"comment":""},{"name":"nonce_column","type":"text","nullable":true,"default":null,"comment":""},{"name":"format_type","type":"text","nullable":true,"default":null,"comment":""}],"indexes":[],"constraints":[],"triggers":[],"def":"CREATE VIEW mask_columns AS (\n SELECT a.attname,\n a.attrelid,\n m.key_id,\n m.key_id_column,\n m.associated_columns,\n m.nonce_column,\n m.format_type\n FROM (pg_attribute a\n LEFT JOIN pgsodium.masking_rule m ON (((m.attrelid = a.attrelid) AND (m.attname = a.attname))))\n WHERE ((a.attnum \u003e 0) AND (NOT a.attisdropped))\n ORDER BY a.attnum\n)","referenced_tables":["pg_attribute","pgsodium.masking_rule"]},{"name":"pgsodium.decrypted_key","type":"VIEW","comment":"","columns":[{"name":"id","type":"uuid","nullable":true,"default":null,"comment":""},{"name":"status","type":"pgsodium.key_status","nullable":true,"default":null,"comment":""},{"name":"created","type":"timestamp with time zone","nullable":true,"default":null,"comment":""},{"name":"expires","type":"timestamp with time zone","nullable":true,"default":null,"comment":""},{"name":"key_type","type":"pgsodium.key_type","nullable":true,"default":null,"comment":""},{"name":"key_id","type":"bigint","nullable":true,"default":null,"comment":""},{"name":"key_context","type":"bytea","nullable":true,"default":null,"comment":""},{"name":"name","type":"text","nullable":true,"default":null,"comment":""},{"name":"associated_data","type":"text","nullable":true,"default":null,"comment":""},{"name":"raw_key","type":"bytea","nullable":true,"default":null,"comment":""},{"name":"decrypted_raw_key","type":"bytea","nullable":true,"default":null,"comment":""},{"name":"raw_key_nonce","type":"bytea","nullable":true,"default":null,"comment":""},{"name":"parent_key","type":"uuid","nullable":true,"default":null,"comment":""},{"name":"comment","type":"text","nullable":true,"default":null,"comment":""}],"indexes":[],"constraints":[],"triggers":[],"def":"CREATE VIEW decrypted_key AS (\n SELECT key.id,\n key.status,\n key.created,\n key.expires,\n key.key_type,\n key.key_id,\n key.key_context,\n key.name,\n key.associated_data,\n key.raw_key,\n CASE\n WHEN (key.raw_key IS NULL) THEN NULL::bytea\n ELSE\n CASE\n WHEN (key.parent_key IS NULL) THEN NULL::bytea\n ELSE pgsodium.crypto_aead_det_decrypt(key.raw_key, convert_to(((key.id)::text || key.associated_data), 'utf8'::name), key.parent_key, key.raw_key_nonce)\n END\n END AS decrypted_raw_key,\n key.raw_key_nonce,\n key.parent_key,\n key.comment\n FROM pgsodium.key\n)","referenced_tables":["pgsodium.key"]},{"name":"vault.secrets","type":"BASE TABLE","comment":"Table with encrypted `secret` column for storing sensitive information on disk.","columns":[{"name":"id","type":"uuid","nullable":false,"default":"gen_random_uuid()","comment":""},{"name":"name","type":"text","nullable":true,"default":null,"comment":""},{"name":"description","type":"text","nullable":false,"default":"''::text","comment":""},{"name":"secret","type":"text","nullable":false,"default":null,"comment":""},{"name":"key_id","type":"uuid","nullable":true,"default":"(pgsodium.create_key()).id","comment":""},{"name":"nonce","type":"bytea","nullable":true,"default":"pgsodium.crypto_aead_det_noncegen()","comment":""},{"name":"created_at","type":"timestamp with time zone","nullable":false,"default":"CURRENT_TIMESTAMP","comment":""},{"name":"updated_at","type":"timestamp with time zone","nullable":false,"default":"CURRENT_TIMESTAMP","comment":""}],"indexes":[{"name":"secrets_pkey","def":"CREATE UNIQUE INDEX secrets_pkey ON vault.secrets USING btree (id)","table":"vault.secrets","columns":["id"],"comment":""},{"name":"secrets_name_idx","def":"CREATE UNIQUE INDEX secrets_name_idx ON vault.secrets USING btree (name) WHERE (name IS NOT NULL)","table":"vault.secrets","columns":["name"],"comment":""}],"constraints":[{"name":"secrets_key_id_fkey","type":"FOREIGN KEY","def":"FOREIGN KEY (key_id) REFERENCES pgsodium.key(id)","table":"vault.secrets","referenced_table":"key","columns":["key_id"],"referenced_columns":["id"],"comment":""},{"name":"secrets_pkey","type":"PRIMARY KEY","def":"PRIMARY KEY (id)","table":"vault.secrets","referenced_table":"","columns":["id"],"referenced_columns":[],"comment":""}],"triggers":[{"name":"secrets_encrypt_secret_trigger_secret","def":"CREATE TRIGGER secrets_encrypt_secret_trigger_secret BEFORE INSERT OR UPDATE OF secret ON vault.secrets FOR EACH ROW EXECUTE FUNCTION vault.secrets_encrypt_secret_secret()","comment":""}],"def":""},{"name":"vault.decrypted_secrets","type":"VIEW","comment":"","columns":[{"name":"id","type":"uuid","nullable":true,"default":null,"comment":""},{"name":"name","type":"text","nullable":true,"default":null,"comment":""},{"name":"description","type":"text","nullable":true,"default":null,"comment":""},{"name":"secret","type":"text","nullable":true,"default":null,"comment":""},{"name":"decrypted_secret","type":"text","nullable":true,"default":null,"comment":""},{"name":"key_id","type":"uuid","nullable":true,"default":null,"comment":""},{"name":"nonce","type":"bytea","nullable":true,"default":null,"comment":""},{"name":"created_at","type":"timestamp with time zone","nullable":true,"default":null,"comment":""},{"name":"updated_at","type":"timestamp with time zone","nullable":true,"default":null,"comment":""}],"indexes":[],"constraints":[],"triggers":[],"def":"CREATE VIEW decrypted_secrets AS (\n SELECT secrets.id,\n secrets.name,\n secrets.description,\n secrets.secret,\n CASE\n WHEN (secrets.secret IS NULL) THEN NULL::text\n ELSE\n CASE\n WHEN (secrets.key_id IS NULL) THEN NULL::text\n ELSE convert_from(pgsodium.crypto_aead_det_decrypt(decode(secrets.secret, 'base64'::text), convert_to(((((secrets.id)::text || secrets.description) || (secrets.created_at)::text) || (secrets.updated_at)::text), 'utf8'::name), secrets.key_id, secrets.nonce), 'utf8'::name)\n END\n END AS decrypted_secret,\n secrets.key_id,\n secrets.nonce,\n secrets.created_at,\n secrets.updated_at\n FROM vault.secrets\n)","referenced_tables":["vault.secrets"]}],"relations":[{"table":"storage.buckets","columns":["owner"],"cardinality":"Zero or more","parent_table":"auth.users","parent_columns":["id"],"parent_cardinality":"Zero or one","def":"FOREIGN KEY (owner) REFERENCES auth.users(id)","virtual":false},{"table":"storage.objects","columns":["owner"],"cardinality":"Zero or more","parent_table":"auth.users","parent_columns":["id"],"parent_cardinality":"Zero or one","def":"FOREIGN KEY (owner) REFERENCES auth.users(id)","virtual":false},{"table":"storage.objects","columns":["bucket_id"],"cardinality":"Zero or more","parent_table":"storage.buckets","parent_columns":["id"],"parent_cardinality":"Zero or one","def":"FOREIGN KEY (bucket_id) REFERENCES storage.buckets(id)","virtual":false},{"table":"public.study","columns":["user_id"],"cardinality":"Zero or more","parent_table":"public.user","parent_columns":["id"],"parent_cardinality":"Exactly one","def":"FOREIGN KEY (user_id) REFERENCES \"user\"(id)","virtual":false},{"table":"public.study_subject","columns":["study_id"],"cardinality":"Zero or more","parent_table":"public.study","parent_columns":["id"],"parent_cardinality":"Exactly one","def":"FOREIGN KEY (study_id) REFERENCES study(id) ON DELETE CASCADE","virtual":false},{"table":"public.study_subject","columns":["invite_code"],"cardinality":"Zero or more","parent_table":"public.study_invite","parent_columns":["code"],"parent_cardinality":"Zero or one","def":"FOREIGN KEY (invite_code) REFERENCES study_invite(code) ON DELETE CASCADE","virtual":false},{"table":"public.study_subject","columns":["user_id"],"cardinality":"Zero or more","parent_table":"public.user","parent_columns":["id"],"parent_cardinality":"Exactly one","def":"FOREIGN KEY (user_id) REFERENCES \"user\"(id)","virtual":false},{"table":"public.repo","columns":["study_id"],"cardinality":"Zero or more","parent_table":"public.study","parent_columns":["id"],"parent_cardinality":"Exactly one","def":"FOREIGN KEY (study_id) REFERENCES study(id)","virtual":false},{"table":"public.repo","columns":["user_id"],"cardinality":"Zero or more","parent_table":"public.user","parent_columns":["id"],"parent_cardinality":"Exactly one","def":"FOREIGN KEY (user_id) REFERENCES \"user\"(id) ON DELETE CASCADE","virtual":false},{"table":"public.study_invite","columns":["study_id"],"cardinality":"Zero or more","parent_table":"public.study","parent_columns":["id"],"parent_cardinality":"Exactly one","def":"FOREIGN KEY (study_id) REFERENCES study(id) ON DELETE CASCADE","virtual":false},{"table":"public.subject_progress","columns":["subject_id"],"cardinality":"Zero or more","parent_table":"public.study_subject","parent_columns":["id"],"parent_cardinality":"Exactly one","def":"FOREIGN KEY (subject_id) REFERENCES study_subject(id) ON DELETE CASCADE","virtual":false},{"table":"pgsodium.key","columns":["parent_key"],"cardinality":"Zero or more","parent_table":"pgsodium.key","parent_columns":["id"],"parent_cardinality":"Zero or one","def":"FOREIGN KEY (parent_key) REFERENCES pgsodium.key(id)","virtual":false},{"table":"vault.secrets","columns":["key_id"],"cardinality":"Zero or more","parent_table":"pgsodium.key","parent_columns":["id"],"parent_cardinality":"Zero or one","def":"FOREIGN KEY (key_id) REFERENCES pgsodium.key(id)","virtual":false}],"functions":[{"name":"extensions.uuid_generate_v4","return_type":"uuid","arguments":"","type":"FUNCTION"},{"name":"pgbouncer.get_auth","return_type":"record","arguments":"p_usename text","type":"FUNCTION"},{"name":"storage.filename","return_type":"text","arguments":"name text","type":"FUNCTION"},{"name":"extensions.digest","return_type":"bytea","arguments":"text, text","type":"FUNCTION"},{"name":"storage.foldername","return_type":"_text","arguments":"name text","type":"FUNCTION"},{"name":"extensions.decrypt_iv","return_type":"bytea","arguments":"bytea, bytea, bytea, text","type":"FUNCTION"},{"name":"storage.extension","return_type":"text","arguments":"name text","type":"FUNCTION"},{"name":"extensions.gen_random_bytes","return_type":"bytea","arguments":"integer","type":"FUNCTION"},{"name":"extensions.encrypt","return_type":"bytea","arguments":"bytea, bytea, text","type":"FUNCTION"},{"name":"extensions.decrypt","return_type":"bytea","arguments":"bytea, bytea, text","type":"FUNCTION"},{"name":"extensions.encrypt_iv","return_type":"bytea","arguments":"bytea, bytea, bytea, text","type":"FUNCTION"},{"name":"extensions.gen_random_uuid","return_type":"uuid","arguments":"","type":"FUNCTION"},{"name":"extensions.uuid_nil","return_type":"uuid","arguments":"","type":"FUNCTION"},{"name":"extensions.uuid_ns_dns","return_type":"uuid","arguments":"","type":"FUNCTION"},{"name":"storage.search","return_type":"record","arguments":"prefix text, bucketname text, limits integer DEFAULT 100, levels integer DEFAULT 1, offsets integer DEFAULT 0","type":"FUNCTION"},{"name":"extensions.uuid_ns_url","return_type":"uuid","arguments":"","type":"FUNCTION"},{"name":"extensions.uuid_ns_oid","return_type":"uuid","arguments":"","type":"FUNCTION"},{"name":"auth.uid","return_type":"uuid","arguments":"","type":"FUNCTION"},{"name":"auth.email","return_type":"text","arguments":"","type":"FUNCTION"},{"name":"extensions.uuid_generate_v3","return_type":"uuid","arguments":"namespace uuid, name text","type":"FUNCTION"},{"name":"extensions.uuid_ns_x500","return_type":"uuid","arguments":"","type":"FUNCTION"},{"name":"extensions.uuid_generate_v1","return_type":"uuid","arguments":"","type":"FUNCTION"},{"name":"extensions.uuid_generate_v1mc","return_type":"uuid","arguments":"","type":"FUNCTION"},{"name":"net.check_worker_is_up","return_type":"void","arguments":"","type":"FUNCTION"},{"name":"net._await_response","return_type":"bool","arguments":"request_id bigint","type":"FUNCTION"},{"name":"net._urlencode_string","return_type":"text","arguments":"string character varying","type":"FUNCTION"},{"name":"net._encode_url_with_params_array","return_type":"text","arguments":"url text, params_array text[]","type":"FUNCTION"},{"name":"graphql.increment_schema_version","return_type":"event_trigger","arguments":"","type":"FUNCTION"},{"name":"graphql.get_schema_version","return_type":"int4","arguments":"","type":"FUNCTION"},{"name":"graphql.resolve","return_type":"jsonb","arguments":"query text, variables jsonb DEFAULT '{}'::jsonb, \"operationName\" text DEFAULT NULL::text, extensions jsonb DEFAULT NULL::jsonb","type":"FUNCTION"},{"name":"extensions.pgp_pub_decrypt_bytea","return_type":"bytea","arguments":"bytea, bytea, text","type":"FUNCTION"},{"name":"extensions.pgp_pub_decrypt","return_type":"text","arguments":"bytea, bytea, text, text","type":"FUNCTION"},{"name":"extensions.pgp_pub_decrypt_bytea","return_type":"bytea","arguments":"bytea, bytea, text, text","type":"FUNCTION"},{"name":"net.http_delete","return_type":"int8","arguments":"url text, params jsonb DEFAULT '{}'::jsonb, headers jsonb DEFAULT '{}'::jsonb, timeout_milliseconds integer DEFAULT 2000","type":"FUNCTION"},{"name":"net._http_collect_response","return_type":"http_response_result","arguments":"request_id bigint, async boolean DEFAULT true","type":"FUNCTION"},{"name":"net.http_collect_response","return_type":"http_response_result","arguments":"request_id bigint, async boolean DEFAULT true","type":"FUNCTION"},{"name":"supabase_functions.http_request","return_type":"trigger","arguments":"","type":"FUNCTION"},{"name":"public.active_subject_count","return_type":"int4","arguments":"study study","type":"FUNCTION"},{"name":"public.can_edit","return_type":"bool","arguments":"user_id uuid, study_param study","type":"FUNCTION"},{"name":"public.get_study_from_invite","return_type":"record","arguments":"invite_code text","type":"FUNCTION"},{"name":"public.get_study_record_from_invite","return_type":"study","arguments":"invite_code text","type":"FUNCTION"},{"name":"public.handle_new_user","return_type":"trigger","arguments":"","type":"FUNCTION"},{"name":"public.has_study_ended","return_type":"bool","arguments":"psubject_id uuid","type":"FUNCTION"},{"name":"public.has_results_public","return_type":"bool","arguments":"psubject_id uuid","type":"FUNCTION"},{"name":"public.has_study_ended","return_type":"bool","arguments":"subject study_subject","type":"FUNCTION"},{"name":"public.is_active_subject","return_type":"bool","arguments":"psubject_id uuid, days_active integer","type":"FUNCTION"},{"name":"public.is_study_subject_of","return_type":"bool","arguments":"_user_id uuid, _study_id uuid","type":"FUNCTION"},{"name":"public.last_completed_task","return_type":"date","arguments":"psubject_id uuid","type":"FUNCTION"},{"name":"public.study_active_days","return_type":"_int4","arguments":"study_param study","type":"FUNCTION"},{"name":"public.study_ended_count","return_type":"int4","arguments":"study study","type":"FUNCTION"},{"name":"public.study_length","return_type":"int4","arguments":"study_param study","type":"FUNCTION"},{"name":"public.study_missed_days","return_type":"_int4","arguments":"study_param study","type":"FUNCTION"},{"name":"net.http_get","return_type":"int8","arguments":"url text, params jsonb DEFAULT '{}'::jsonb, headers jsonb DEFAULT '{}'::jsonb, timeout_milliseconds integer DEFAULT 2000","type":"FUNCTION"},{"name":"extensions.pgp_sym_decrypt_bytea","return_type":"bytea","arguments":"bytea, text, text","type":"FUNCTION"},{"name":"public.study_participant_count","return_type":"int4","arguments":"study study","type":"FUNCTION"},{"name":"public.study_total_tasks","return_type":"int4","arguments":"subject study_subject","type":"FUNCTION"},{"name":"public.subject_current_day","return_type":"int4","arguments":"subject study_subject","type":"FUNCTION"},{"name":"public.subject_total_active_days","return_type":"int4","arguments":"subject study_subject","type":"FUNCTION"},{"name":"public.user_email","return_type":"text","arguments":"user_id uuid","type":"FUNCTION"},{"name":"extensions.pgp_pub_encrypt","return_type":"bytea","arguments":"text, bytea","type":"FUNCTION"},{"name":"extensions.pgp_pub_encrypt_bytea","return_type":"bytea","arguments":"bytea, bytea","type":"FUNCTION"},{"name":"extensions.pgp_pub_encrypt","return_type":"bytea","arguments":"text, bytea, text","type":"FUNCTION"},{"name":"extensions.pgp_pub_encrypt_bytea","return_type":"bytea","arguments":"bytea, bytea, text","type":"FUNCTION"},{"name":"extensions.pgp_pub_decrypt","return_type":"text","arguments":"bytea, bytea","type":"FUNCTION"},{"name":"extensions.pgp_pub_decrypt_bytea","return_type":"bytea","arguments":"bytea, bytea","type":"FUNCTION"},{"name":"extensions.pgp_pub_decrypt","return_type":"text","arguments":"bytea, bytea, text","type":"FUNCTION"},{"name":"extensions.gen_salt","return_type":"text","arguments":"text, integer","type":"FUNCTION"},{"name":"auth.role","return_type":"text","arguments":"","type":"FUNCTION"},{"name":"extensions.uuid_generate_v5","return_type":"uuid","arguments":"namespace uuid, name text","type":"FUNCTION"},{"name":"extensions.digest","return_type":"bytea","arguments":"bytea, text","type":"FUNCTION"},{"name":"extensions.hmac","return_type":"bytea","arguments":"text, text, text","type":"FUNCTION"},{"name":"extensions.hmac","return_type":"bytea","arguments":"bytea, bytea, text","type":"FUNCTION"},{"name":"extensions.crypt","return_type":"text","arguments":"text, text","type":"FUNCTION"},{"name":"extensions.gen_salt","return_type":"text","arguments":"text","type":"FUNCTION"},{"name":"extensions.sign","return_type":"text","arguments":"payload json, secret text, algorithm text DEFAULT 'HS256'::text","type":"FUNCTION"},{"name":"extensions.pgrst_ddl_watch","return_type":"event_trigger","arguments":"","type":"FUNCTION"},{"name":"graphql._internal_resolve","return_type":"jsonb","arguments":"query text, variables jsonb DEFAULT '{}'::jsonb, \"operationName\" text DEFAULT NULL::text, extensions jsonb DEFAULT NULL::jsonb","type":"FUNCTION"},{"name":"graphql.exception","return_type":"text","arguments":"message text","type":"FUNCTION"},{"name":"graphql.comment_directive","return_type":"jsonb","arguments":"comment_ text","type":"FUNCTION"},{"name":"extensions.pgrst_drop_watch","return_type":"event_trigger","arguments":"","type":"FUNCTION"},{"name":"graphql_public.graphql","return_type":"jsonb","arguments":"\"operationName\" text DEFAULT NULL::text, query text DEFAULT NULL::text, variables jsonb DEFAULT NULL::jsonb, extensions jsonb DEFAULT NULL::jsonb","type":"FUNCTION"},{"name":"extensions.grant_pg_graphql_access","return_type":"event_trigger","arguments":"","type":"FUNCTION"},{"name":"net.http_post","return_type":"int8","arguments":"url text, body jsonb DEFAULT '{}'::jsonb, params jsonb DEFAULT '{}'::jsonb, headers jsonb DEFAULT '{\"Content-Type\": \"application/json\"}'::jsonb, timeout_milliseconds integer DEFAULT 2000","type":"FUNCTION"},{"name":"pgsodium.crypto_pwhash_saltgen","return_type":"bytea","arguments":"","type":"FUNCTION"},{"name":"pgsodium.crypto_kx_client_session_keys","return_type":"crypto_kx_session","arguments":"client_pk bytea, client_sk bytea, server_pk bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_kx_server_session_keys","return_type":"crypto_kx_session","arguments":"server_pk bytea, server_sk bytea, client_pk bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_auth_hmacsha512_keygen","return_type":"bytea","arguments":"","type":"FUNCTION"},{"name":"pgsodium.crypto_box_new_seed","return_type":"bytea","arguments":"","type":"FUNCTION"},{"name":"pgsodium.crypto_sign_new_seed","return_type":"bytea","arguments":"","type":"FUNCTION"},{"name":"pgsodium.derive_key","return_type":"bytea","arguments":"key_id bigint, key_len integer DEFAULT 32, context bytea DEFAULT '\\x7067736f6469756d'::bytea","type":"FUNCTION"},{"name":"pgsodium.pgsodium_derive","return_type":"bytea","arguments":"key_id bigint, key_len integer DEFAULT 32, context bytea DEFAULT decode('pgsodium'::text, 'escape'::text)","type":"FUNCTION"},{"name":"pgsodium.randombytes_new_seed","return_type":"bytea","arguments":"","type":"FUNCTION"},{"name":"pgsodium.crypto_secretbox_keygen","return_type":"bytea","arguments":"","type":"FUNCTION"},{"name":"pgsodium.crypto_auth_keygen","return_type":"bytea","arguments":"","type":"FUNCTION"},{"name":"pgsodium.crypto_box_noncegen","return_type":"bytea","arguments":"","type":"FUNCTION"},{"name":"pgsodium.crypto_aead_ietf_keygen","return_type":"bytea","arguments":"","type":"FUNCTION"},{"name":"pgsodium.crypto_shorthash_keygen","return_type":"bytea","arguments":"","type":"FUNCTION"},{"name":"pgsodium.crypto_generichash_keygen","return_type":"bytea","arguments":"","type":"FUNCTION"},{"name":"pgsodium.crypto_kdf_keygen","return_type":"bytea","arguments":"","type":"FUNCTION"},{"name":"pgsodium.crypto_kx_new_keypair","return_type":"crypto_kx_keypair","arguments":"","type":"FUNCTION"},{"name":"pgsodium.crypto_kx_new_seed","return_type":"bytea","arguments":"","type":"FUNCTION"},{"name":"pgsodium.crypto_kx_seed_new_keypair","return_type":"crypto_kx_keypair","arguments":"seed bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_auth_hmacsha256_keygen","return_type":"bytea","arguments":"","type":"FUNCTION"},{"name":"pgsodium.crypto_box_new_keypair","return_type":"crypto_box_keypair","arguments":"","type":"FUNCTION"},{"name":"pgsodium.crypto_sign_new_keypair","return_type":"crypto_sign_keypair","arguments":"","type":"FUNCTION"},{"name":"pgsodium.crypto_sign_init","return_type":"bytea","arguments":"","type":"FUNCTION"},{"name":"pgsodium.crypto_sign_update","return_type":"bytea","arguments":"state bytea, message bytea","type":"FUNCTION"},{"name":"pgsodium.randombytes_random","return_type":"int4","arguments":"","type":"FUNCTION"},{"name":"pgsodium.crypto_secretbox_noncegen","return_type":"bytea","arguments":"","type":"FUNCTION"},{"name":"pgsodium.crypto_aead_ietf_noncegen","return_type":"bytea","arguments":"","type":"FUNCTION"},{"name":"pgsodium.crypto_secretstream_keygen","return_type":"bytea","arguments":"","type":"FUNCTION"},{"name":"pgsodium.crypto_stream_xchacha20_keygen","return_type":"bytea","arguments":"","type":"FUNCTION"},{"name":"pgsodium.crypto_stream_xchacha20_noncegen","return_type":"bytea","arguments":"","type":"FUNCTION"},{"name":"pgsodium.crypto_cmp","return_type":"bool","arguments":"text, text","type":"FUNCTION"},{"name":"pgsodium.crypto_signcrypt_new_keypair","return_type":"crypto_signcrypt_keypair","arguments":"","type":"FUNCTION"},{"name":"pgsodium.crypto_aead_det_encrypt","return_type":"bytea","arguments":"message bytea, additional bytea, key bytea, nonce bytea DEFAULT NULL::bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_aead_det_decrypt","return_type":"bytea","arguments":"ciphertext bytea, additional bytea, key bytea, nonce bytea DEFAULT NULL::bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_aead_det_encrypt","return_type":"bytea","arguments":"message bytea, additional bytea, key_id bigint, context bytea DEFAULT '\\x7067736f6469756d'::bytea, nonce bytea DEFAULT NULL::bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_aead_det_decrypt","return_type":"bytea","arguments":"message bytea, additional bytea, key_id bigint, context bytea DEFAULT '\\x7067736f6469756d'::bytea, nonce bytea DEFAULT NULL::bytea","type":"FUNCTION"},{"name":"pgsodium.version","return_type":"text","arguments":"","type":"FUNCTION"},{"name":"pgsodium.crypto_aead_det_noncegen","return_type":"bytea","arguments":"","type":"FUNCTION"},{"name":"pgsodium.has_mask","return_type":"bool","arguments":"role regrole, source_name text","type":"FUNCTION"},{"name":"pgsodium.mask_columns","return_type":"record","arguments":"source_relid oid","type":"FUNCTION"},{"name":"pgsodium.crypto_sign_final_verify","return_type":"bool","arguments":"state bytea, signature bytea, key bytea","type":"FUNCTION"},{"name":"pgsodium.create_mask_view","return_type":"void","arguments":"relid oid, debug boolean DEFAULT false","type":"FUNCTION"},{"name":"pgsodium.create_key","return_type":"valid_key","arguments":"key_type pgsodium.key_type DEFAULT 'aead-det'::pgsodium.key_type, name text DEFAULT NULL::text, raw_key bytea DEFAULT NULL::bytea, raw_key_nonce bytea DEFAULT NULL::bytea, parent_key uuid DEFAULT NULL::uuid, key_context bytea DEFAULT '\\x7067736f6469756d'::bytea, expires timestamp with time zone DEFAULT NULL::timestamp with time zone, associated_data text DEFAULT ''::text","type":"FUNCTION"},{"name":"pgsodium.get_key_by_name","return_type":"valid_key","arguments":"text","type":"FUNCTION"},{"name":"pgsodium.quote_assoc","return_type":"text","arguments":"text, boolean DEFAULT false","type":"FUNCTION"},{"name":"pgsodium.crypto_sign_open","return_type":"bytea","arguments":"signed_message bytea, key bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_kdf_derive_from_key","return_type":"bytea","arguments":"subkey_size integer, subkey_id bigint, context bytea, primary_key uuid","type":"FUNCTION"},{"name":"pgsodium.get_named_keys","return_type":"valid_key","arguments":"filter text DEFAULT '%'::text","type":"FUNCTION"},{"name":"pgsodium.crypto_aead_det_encrypt","return_type":"bytea","arguments":"message bytea, additional bytea, key_uuid uuid","type":"FUNCTION"},{"name":"pgsodium.crypto_aead_det_decrypt","return_type":"bytea","arguments":"message bytea, additional bytea, key_uuid uuid","type":"FUNCTION"},{"name":"pgsodium.crypto_aead_ietf_encrypt","return_type":"bytea","arguments":"message bytea, additional bytea, nonce bytea, key_id bigint, context bytea DEFAULT '\\x7067736f6469756d'::bytea","type":"FUNCTION"},{"name":"pgsodium.get_key_by_id","return_type":"valid_key","arguments":"uuid","type":"FUNCTION"},{"name":"pgsodium.enable_security_label_trigger","return_type":"void","arguments":"","type":"FUNCTION"},{"name":"pgsodium.disable_security_label_trigger","return_type":"void","arguments":"","type":"FUNCTION"},{"name":"pgsodium.update_mask","return_type":"void","arguments":"target oid, debug boolean DEFAULT false","type":"FUNCTION"},{"name":"pgsodium.crypto_sign_update_agg1","return_type":"bytea","arguments":"state bytea, message bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_sign_update_agg2","return_type":"bytea","arguments":"cur_state bytea, initial_state bytea, message bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_sign_update_agg","return_type":"bytea","arguments":"message bytea","type":"a"},{"name":"pgsodium.crypto_sign_update_agg","return_type":"bytea","arguments":"state bytea, message bytea","type":"a"},{"name":"pgsodium.encrypted_columns","return_type":"text","arguments":"relid oid","type":"FUNCTION"},{"name":"pgsodium.decrypted_columns","return_type":"text","arguments":"relid oid","type":"FUNCTION"},{"name":"pgsodium.crypto_aead_ietf_encrypt","return_type":"bytea","arguments":"message bytea, additional bytea, nonce bytea, key bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_aead_ietf_encrypt","return_type":"bytea","arguments":"message bytea, additional bytea, nonce bytea, key_uuid uuid","type":"FUNCTION"},{"name":"pgsodium.crypto_aead_ietf_decrypt","return_type":"bytea","arguments":"message bytea, additional bytea, nonce bytea, key bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_aead_ietf_decrypt","return_type":"bytea","arguments":"message bytea, additional bytea, nonce bytea, key_id bigint, context bytea DEFAULT '\\x7067736f6469756d'::bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_aead_ietf_decrypt","return_type":"bytea","arguments":"message bytea, additional bytea, nonce bytea, key_uuid uuid","type":"FUNCTION"},{"name":"pgsodium.crypto_auth","return_type":"bytea","arguments":"message bytea, key bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_auth","return_type":"bytea","arguments":"message bytea, key_id bigint, context bytea DEFAULT '\\x7067736f6469756d'::bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_auth","return_type":"bytea","arguments":"message bytea, key_uuid uuid","type":"FUNCTION"},{"name":"pgsodium.crypto_auth_verify","return_type":"bool","arguments":"mac bytea, message bytea, key bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_auth_verify","return_type":"bool","arguments":"mac bytea, message bytea, key_id bigint, context bytea DEFAULT '\\x7067736f6469756d'::bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_auth_verify","return_type":"bool","arguments":"mac bytea, message bytea, key_uuid uuid","type":"FUNCTION"},{"name":"pgsodium.crypto_box_seed_new_keypair","return_type":"crypto_box_keypair","arguments":"seed bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_box","return_type":"bytea","arguments":"message bytea, nonce bytea, public bytea, secret bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_box_open","return_type":"bytea","arguments":"ciphertext bytea, nonce bytea, public bytea, secret bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_box_seal","return_type":"bytea","arguments":"message bytea, public_key bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_box_seal_open","return_type":"bytea","arguments":"ciphertext bytea, public_key bytea, secret_key bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_generichash","return_type":"bytea","arguments":"message bytea, key bigint, context bytea DEFAULT '\\x7067736f6469756d'::bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_generichash","return_type":"bytea","arguments":"message bytea, key bytea DEFAULT NULL::bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_generichash","return_type":"bytea","arguments":"message bytea, key_uuid uuid","type":"FUNCTION"},{"name":"pgsodium.crypto_shorthash","return_type":"bytea","arguments":"message bytea, key bigint, context bytea DEFAULT '\\x7067736f6469756d'::bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_shorthash","return_type":"bytea","arguments":"message bytea, key bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_shorthash","return_type":"bytea","arguments":"message bytea, key_uuid uuid","type":"FUNCTION"},{"name":"pgsodium.sodium_bin2base64","return_type":"text","arguments":"bin bytea","type":"FUNCTION"},{"name":"pgsodium.sodium_base642bin","return_type":"bytea","arguments":"base64 text","type":"FUNCTION"},{"name":"pgsodium.crypto_auth_hmacsha512","return_type":"bytea","arguments":"message bytea, secret bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_auth_hmacsha512","return_type":"bytea","arguments":"message bytea, key_id bigint, context bytea DEFAULT '\\x7067736f6469756d'::bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_auth_hmacsha512","return_type":"bytea","arguments":"message bytea, key_uuid uuid","type":"FUNCTION"},{"name":"pgsodium.crypto_auth_hmacsha512_verify","return_type":"bool","arguments":"hash bytea, message bytea, secret bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_auth_hmacsha512_verify","return_type":"bool","arguments":"hash bytea, message bytea, key_id bigint, context bytea DEFAULT '\\x7067736f6469756d'::bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_auth_hmacsha512_verify","return_type":"bool","arguments":"signature bytea, message bytea, key_uuid uuid","type":"FUNCTION"},{"name":"pgsodium.crypto_auth_hmacsha256","return_type":"bytea","arguments":"message bytea, secret bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_auth_hmacsha256","return_type":"bytea","arguments":"message bytea, key_id bigint, context bytea DEFAULT '\\x7067736f6469756d'::bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_auth_hmacsha256","return_type":"bytea","arguments":"message bytea, key_uuid uuid","type":"FUNCTION"},{"name":"pgsodium.crypto_auth_hmacsha256_verify","return_type":"bool","arguments":"hash bytea, message bytea, secret bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_sign_final_create","return_type":"bytea","arguments":"state bytea, key bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_auth_hmacsha256_verify","return_type":"bool","arguments":"hash bytea, message bytea, key_id bigint, context bytea DEFAULT '\\x7067736f6469756d'::bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_auth_hmacsha256_verify","return_type":"bool","arguments":"signature bytea, message bytea, key_uuid uuid","type":"FUNCTION"},{"name":"pgsodium.crypto_kdf_derive_from_key","return_type":"bytea","arguments":"subkey_size bigint, subkey_id bigint, context bytea, primary_key bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_pwhash","return_type":"bytea","arguments":"password bytea, salt bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_pwhash_str","return_type":"bytea","arguments":"password bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_pwhash_str_verify","return_type":"bool","arguments":"hashed_password bytea, password bytea","type":"FUNCTION"},{"name":"pgsodium.randombytes_uniform","return_type":"int4","arguments":"upper_bound integer","type":"FUNCTION"},{"name":"pgsodium.randombytes_buf","return_type":"bytea","arguments":"size integer","type":"FUNCTION"},{"name":"pgsodium.randombytes_buf_deterministic","return_type":"bytea","arguments":"size integer, seed bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_secretbox","return_type":"bytea","arguments":"message bytea, nonce bytea, key bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_secretbox","return_type":"bytea","arguments":"message bytea, nonce bytea, key_id bigint, context bytea DEFAULT '\\x7067736f6469756d'::bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_secretbox","return_type":"bytea","arguments":"message bytea, nonce bytea, key_uuid uuid","type":"FUNCTION"},{"name":"pgsodium.crypto_secretbox_open","return_type":"bytea","arguments":"ciphertext bytea, nonce bytea, key bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_secretbox_open","return_type":"bytea","arguments":"message bytea, nonce bytea, key_id bigint, context bytea DEFAULT '\\x7067736f6469756d'::bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_secretbox_open","return_type":"bytea","arguments":"message bytea, nonce bytea, key_uuid uuid","type":"FUNCTION"},{"name":"pgsodium.crypto_hash_sha256","return_type":"bytea","arguments":"message bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_hash_sha512","return_type":"bytea","arguments":"message bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_sign","return_type":"bytea","arguments":"message bytea, key bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_sign_detached","return_type":"bytea","arguments":"message bytea, key bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_sign_seed_new_keypair","return_type":"crypto_sign_keypair","arguments":"seed bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_sign_verify_detached","return_type":"bool","arguments":"sig bytea, message bytea, key bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_signcrypt_sign_after","return_type":"bytea","arguments":"state bytea, sender_sk bytea, ciphertext bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_signcrypt_sign_before","return_type":"crypto_signcrypt_state_key","arguments":"sender bytea, recipient bytea, sender_sk bytea, recipient_pk bytea, additional bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_signcrypt_verify_after","return_type":"bool","arguments":"state bytea, signature bytea, sender_pk bytea, ciphertext bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_signcrypt_verify_before","return_type":"crypto_signcrypt_state_key","arguments":"signature bytea, sender bytea, recipient bytea, additional bytea, sender_pk bytea, recipient_sk bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_signcrypt_verify_public","return_type":"bool","arguments":"signature bytea, sender bytea, recipient bytea, additional bytea, sender_pk bytea, ciphertext bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_stream_xchacha20","return_type":"bytea","arguments":"bigint, bytea, bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_stream_xchacha20","return_type":"bytea","arguments":"bigint, bytea, bigint, context bytea DEFAULT '\\x7067736f6469756d'::bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_stream_xchacha20_xor","return_type":"bytea","arguments":"bytea, bytea, bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_stream_xchacha20_xor","return_type":"bytea","arguments":"bytea, bytea, bigint, context bytea DEFAULT '\\x70676f736469756d'::bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_stream_xchacha20_xor_ic","return_type":"bytea","arguments":"bytea, bytea, bigint, bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_stream_xchacha20_xor_ic","return_type":"bytea","arguments":"bytea, bytea, bigint, bigint, context bytea DEFAULT '\\x7067736f6469756d'::bytea","type":"FUNCTION"},{"name":"pgsodium.encrypted_column","return_type":"text","arguments":"relid oid, m record","type":"FUNCTION"},{"name":"pgsodium.update_masks","return_type":"void","arguments":"debug boolean DEFAULT false","type":"FUNCTION"},{"name":"pgsodium.key_encrypt_secret_raw_key","return_type":"trigger","arguments":"","type":"FUNCTION"},{"name":"pgsodium.mask_role","return_type":"void","arguments":"masked_role regrole, source_name text, view_name text","type":"FUNCTION"},{"name":"pgsodium.create_mask_view","return_type":"void","arguments":"relid oid, subid integer, debug boolean DEFAULT false","type":"FUNCTION"},{"name":"pgsodium.trg_mask_update","return_type":"event_trigger","arguments":"","type":"FUNCTION"},{"name":"pgsodium.crypto_aead_det_decrypt","return_type":"bytea","arguments":"message bytea, additional bytea, key_uuid uuid, nonce bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_aead_det_encrypt","return_type":"bytea","arguments":"message bytea, additional bytea, key_uuid uuid, nonce bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_aead_det_keygen","return_type":"bytea","arguments":"","type":"FUNCTION"},{"name":"vault.secrets_encrypt_secret_secret","return_type":"trigger","arguments":"","type":"FUNCTION"},{"name":"vault.create_secret","return_type":"uuid","arguments":"new_secret text, new_name text DEFAULT NULL::text, new_description text DEFAULT ''::text, new_key_id uuid DEFAULT NULL::uuid","type":"FUNCTION"},{"name":"vault.update_secret","return_type":"void","arguments":"secret_id uuid, new_secret text DEFAULT NULL::text, new_name text DEFAULT NULL::text, new_description text DEFAULT NULL::text, new_key_id uuid DEFAULT NULL::uuid","type":"FUNCTION"},{"name":"extensions.pgp_key_id","return_type":"text","arguments":"bytea","type":"FUNCTION"},{"name":"extensions.armor","return_type":"text","arguments":"bytea","type":"FUNCTION"},{"name":"extensions.armor","return_type":"text","arguments":"bytea, text[], text[]","type":"FUNCTION"},{"name":"extensions.dearmor","return_type":"bytea","arguments":"text","type":"FUNCTION"},{"name":"extensions.pgp_armor_headers","return_type":"record","arguments":"text, OUT key text, OUT value text","type":"FUNCTION"},{"name":"extensions.url_encode","return_type":"text","arguments":"data bytea","type":"FUNCTION"},{"name":"extensions.url_decode","return_type":"bytea","arguments":"data text","type":"FUNCTION"},{"name":"extensions.try_cast_double","return_type":"float8","arguments":"inp text","type":"FUNCTION"},{"name":"extensions.moddatetime","return_type":"trigger","arguments":"","type":"FUNCTION"},{"name":"extensions.pgp_sym_encrypt","return_type":"bytea","arguments":"text, text","type":"FUNCTION"},{"name":"extensions.pgp_sym_encrypt_bytea","return_type":"bytea","arguments":"bytea, text","type":"FUNCTION"},{"name":"extensions.pgp_sym_encrypt","return_type":"bytea","arguments":"text, text, text","type":"FUNCTION"},{"name":"extensions.pgp_sym_encrypt_bytea","return_type":"bytea","arguments":"bytea, text, text","type":"FUNCTION"},{"name":"extensions.pgp_sym_decrypt","return_type":"text","arguments":"bytea, text","type":"FUNCTION"},{"name":"extensions.pgp_sym_decrypt_bytea","return_type":"bytea","arguments":"bytea, text","type":"FUNCTION"},{"name":"extensions.pgp_sym_decrypt","return_type":"text","arguments":"bytea, text, text","type":"FUNCTION"},{"name":"extensions.algorithm_sign","return_type":"text","arguments":"signables text, secret text, algorithm text","type":"FUNCTION"},{"name":"extensions.verify","return_type":"record","arguments":"token text, secret text, algorithm text DEFAULT 'HS256'::text","type":"FUNCTION"},{"name":"extensions.grant_pg_cron_access","return_type":"event_trigger","arguments":"","type":"FUNCTION"},{"name":"extensions.grant_pg_net_access","return_type":"event_trigger","arguments":"","type":"FUNCTION"},{"name":"extensions.pg_stat_statements_reset","return_type":"void","arguments":"userid oid DEFAULT 0, dbid oid DEFAULT 0, queryid bigint DEFAULT 0","type":"FUNCTION"},{"name":"extensions.pg_stat_statements_info","return_type":"record","arguments":"OUT dealloc bigint, OUT stats_reset timestamp with time zone","type":"FUNCTION"},{"name":"extensions.pg_stat_statements","return_type":"record","arguments":"showtext boolean, OUT userid oid, OUT dbid oid, OUT toplevel boolean, OUT queryid bigint, OUT query text, OUT plans bigint, OUT total_plan_time double precision, OUT min_plan_time double precision, OUT max_plan_time double precision, OUT mean_plan_time double precision, OUT stddev_plan_time double precision, OUT calls bigint, OUT total_exec_time double precision, OUT min_exec_time double precision, OUT max_exec_time double precision, OUT mean_exec_time double precision, OUT stddev_exec_time double precision, OUT rows bigint, OUT shared_blks_hit bigint, OUT shared_blks_read bigint, OUT shared_blks_dirtied bigint, OUT shared_blks_written bigint, OUT local_blks_hit bigint, OUT local_blks_read bigint, OUT local_blks_dirtied bigint, OUT local_blks_written bigint, OUT temp_blks_read bigint, OUT temp_blks_written bigint, OUT blk_read_time double precision, OUT blk_write_time double precision, OUT temp_blk_read_time double precision, OUT temp_blk_write_time double precision, OUT wal_records bigint, OUT wal_fpi bigint, OUT wal_bytes numeric, OUT jit_functions bigint, OUT jit_generation_time double precision, OUT jit_inlining_count bigint, OUT jit_inlining_time double precision, OUT jit_optimization_count bigint, OUT jit_optimization_time double precision, OUT jit_emission_count bigint, OUT jit_emission_time double precision","type":"FUNCTION"},{"name":"extensions.set_graphql_placeholder","return_type":"event_trigger","arguments":"","type":"FUNCTION"}],"driver":{"name":"postgres","database_version":"PostgreSQL 15.1 (Ubuntu 15.1-1.pgdg20.04+1) on x86_64-pc-linux-gnu, compiled by gcc (Ubuntu 9.4.0-1ubuntu1~20.04.1) 9.4.0, 64-bit","meta":{"current_schema":"public","search_paths":["\"\\$user\"","public","extensions"],"dict":{"Functions":"Stored procedures and functions"}}}} diff --git a/docs/database/schema.svg b/docs/database/schema.svg deleted file mode 100644 index 7d67f2b18..000000000 --- a/docs/database/schema.svg +++ /dev/null @@ -1,1142 +0,0 @@ - - - - - - -postgres - - - -auth.users - - -auth.users -     -[BASE TABLE] - -instance_id     -[uuid] - -id     -[uuid] - -aud     -[varchar(255)] - -role     -[varchar(255)] - -email     -[varchar(255)] - -encrypted_password     -[varchar(255)] - -confirmed_at     -[timestamp with time zone] - -invited_at     -[timestamp with time zone] - -confirmation_token     -[varchar(255)] - -confirmation_sent_at     -[timestamp with time zone] - -recovery_token     -[varchar(255)] - -recovery_sent_at     -[timestamp with time zone] - -email_change_token     -[varchar(255)] - -email_change     -[varchar(255)] - -email_change_sent_at     -[timestamp with time zone] - -last_sign_in_at     -[timestamp with time zone] - -raw_app_meta_data     -[jsonb] - -raw_user_meta_data     -[jsonb] - -is_super_admin     -[boolean] - -created_at     -[timestamp with time zone] - -updated_at     -[timestamp with time zone] - - - -auth.refresh_tokens - - -auth.refresh_tokens -     -[BASE TABLE] - -instance_id     -[uuid] - -id     -[bigint] - -token     -[varchar(255)] - -user_id     -[varchar(255)] - -revoked     -[boolean] - -created_at     -[timestamp with time zone] - -updated_at     -[timestamp with time zone] - - - -auth.instances - - -auth.instances -     -[BASE TABLE] - -id     -[uuid] - -uuid     -[uuid] - -raw_base_config     -[text] - -created_at     -[timestamp with time zone] - -updated_at     -[timestamp with time zone] - - - -auth.audit_log_entries - - -auth.audit_log_entries -     -[BASE TABLE] - -instance_id     -[uuid] - -id     -[uuid] - -payload     -[json] - -created_at     -[timestamp with time zone] - - - -auth.schema_migrations - - -auth.schema_migrations -     -[BASE TABLE] - -version     -[varchar(255)] - - - -storage.buckets - - -storage.buckets -     -[BASE TABLE] - -id     -[text] - -name     -[text] - -owner     -[uuid] - -created_at     -[timestamp with time zone] - -updated_at     -[timestamp with time zone] - - - -storage.buckets:owner->auth.users:id - - -FOREIGN KEY (owner) REFERENCES auth.users(id) - - - -storage.objects - - -storage.objects -     -[BASE TABLE] - -id     -[uuid] - -bucket_id     -[text] - -name     -[text] - -owner     -[uuid] - -created_at     -[timestamp with time zone] - -updated_at     -[timestamp with time zone] - -last_accessed_at     -[timestamp with time zone] - -metadata     -[jsonb] - - - -storage.objects:owner->auth.users:id - - -FOREIGN KEY (owner) REFERENCES auth.users(id) - - - -storage.objects:bucket_id->storage.buckets:id - - -FOREIGN KEY (bucket_id) REFERENCES storage.buckets(id) - - - -storage.migrations - - -storage.migrations -     -[BASE TABLE] - -id     -[integer] - -name     -[varchar(100)] - -hash     -[varchar(40)] - -executed_at     -[timestamp without time zone] - - - -net.http_request_queue - - -net.http_request_queue -     -[BASE TABLE] - -id     -[bigint] - -method     -[net.http_method] - -url     -[text] - -headers     -[jsonb] - -body     -[bytea] - -timeout_milliseconds     -[integer] - - - -net._http_response - - -net._http_response -     -[BASE TABLE] - -id     -[bigint] - -status_code     -[integer] - -content_type     -[text] - -headers     -[jsonb] - -content     -[text] - -timed_out     -[boolean] - -error_msg     -[text] - -created     -[timestamp with time zone] - - - -supabase_functions.migrations - - -supabase_functions.migrations -     -[BASE TABLE] - -version     -[text] - -inserted_at     -[timestamp with time zone] - - - -supabase_functions.hooks - - -supabase_functions.hooks -     -[BASE TABLE] - -id     -[bigint] - -hook_table_id     -[integer] - -hook_name     -[text] - -created_at     -[timestamp with time zone] - -request_id     -[bigint] - - - -public.study - - -public.study -     -[BASE TABLE] - -id     -[uuid] - -contact     -[jsonb] - -title     -[text] - -description     -[text] - -icon_name     -[text] - -published     -[boolean] - -registry_published     -[boolean] - -questionnaire     -[jsonb] - -eligibility_criteria     -[jsonb] - -observations     -[jsonb] - -interventions     -[jsonb] - -consent     -[jsonb] - -schedule     -[jsonb] - -report_specification     -[jsonb] - -results     -[jsonb] - -created_at     -[timestamp with time zone] - -updated_at     -[timestamp with time zone] - -user_id     -[uuid] - -participation     -[participation] - -result_sharing     -[result_sharing] - -collaborator_emails     -[text[]] - - - -public.user - - -public.user -     -[BASE TABLE] - -id     -[uuid] - -email     -[text] - -preferences     -[jsonb] - - - -public.study:user_id->public.user:id - - -FOREIGN KEY (user_id) REFERENCES "user"(id) - - - -public.study_subject - - -public.study_subject -     -[BASE TABLE] - -id     -[uuid] - -study_id     -[uuid] - -user_id     -[uuid] - -started_at     -[timestamp with time zone] - -selected_intervention_ids     -[text[]] - -invite_code     -[text] - -is_deleted     -[boolean] - - - -public.study_subject:study_id->public.study:id - - -FOREIGN KEY (study_id) REFERENCES study(id) ON DELETE CASCADE - - - -public.study_invite - - -public.study_invite -     -[BASE TABLE] - -code     -[text] - -study_id     -[uuid] - -preselected_intervention_ids     -[text[]] - - - -public.study_subject:invite_code->public.study_invite:code - - -FOREIGN KEY (invite_code) REFERENCES study_invite(code) ON DELETE CASCADE - - - -public.study_subject:user_id->public.user:id - - -FOREIGN KEY (user_id) REFERENCES "user"(id) - - - -public.app_config - - -public.app_config -     -[BASE TABLE] - -id     -[text] - -app_min_version     -[text] - -app_privacy     -[jsonb] - -app_terms     -[jsonb] - -designer_privacy     -[jsonb] - -designer_terms     -[jsonb] - -imprint     -[jsonb] - -contact     -[jsonb] - -analytics     -[jsonb] - - - -public.repo - - -public.repo -     -[BASE TABLE] - -project_id     -[text] - -user_id     -[uuid] - -study_id     -[uuid] - -provider     -[git_provider] - - - -public.repo:study_id->public.study:id - - -FOREIGN KEY (study_id) REFERENCES study(id) - - - -public.repo:user_id->public.user:id - - -FOREIGN KEY (user_id) REFERENCES "user"(id) ON DELETE CASCADE - - - -public.study_invite:study_id->public.study:id - - -FOREIGN KEY (study_id) REFERENCES study(id) ON DELETE CASCADE - - - -public.subject_progress - - -public.subject_progress -     -[BASE TABLE] - -completed_at     -[timestamp with time zone] - -subject_id     -[uuid] - -intervention_id     -[text] - -task_id     -[text] - -result_type     -[text] - -result     -[jsonb] - - - -public.subject_progress:subject_id->public.study_subject:id - - -FOREIGN KEY (subject_id) REFERENCES study_subject(id) ON DELETE CASCADE - - - -public.study_progress_export - - -public.study_progress_export -     -[VIEW] - -completed_at     -[timestamp with time zone] - -intervention_id     -[text] - -task_id     -[text] - -result_type     -[text] - -result     -[jsonb] - -subject_id     -[uuid] - -user_id     -[uuid] - -study_id     -[uuid] - -started_at     -[timestamp with time zone] - -selected_intervention_ids     -[text[]] - - - -extensions.pg_stat_statements_info - - -extensions.pg_stat_statements_info -     -[VIEW] - -dealloc     -[bigint] - -stats_reset     -[timestamp with time zone] - - - -extensions.pg_stat_statements - - -extensions.pg_stat_statements -     -[VIEW] - -userid     -[oid] - -dbid     -[oid] - -toplevel     -[boolean] - -queryid     -[bigint] - -query     -[text] - -plans     -[bigint] - -total_plan_time     -[double precision] - -min_plan_time     -[double precision] - -max_plan_time     -[double precision] - -mean_plan_time     -[double precision] - -stddev_plan_time     -[double precision] - -calls     -[bigint] - -total_exec_time     -[double precision] - -min_exec_time     -[double precision] - -max_exec_time     -[double precision] - -mean_exec_time     -[double precision] - -stddev_exec_time     -[double precision] - -rows     -[bigint] - -shared_blks_hit     -[bigint] - -shared_blks_read     -[bigint] - -shared_blks_dirtied     -[bigint] - -shared_blks_written     -[bigint] - -local_blks_hit     -[bigint] - -local_blks_read     -[bigint] - -local_blks_dirtied     -[bigint] - -local_blks_written     -[bigint] - -temp_blks_read     -[bigint] - -temp_blks_written     -[bigint] - -blk_read_time     -[double precision] - -blk_write_time     -[double precision] - -temp_blk_read_time     -[double precision] - -temp_blk_write_time     -[double precision] - -wal_records     -[bigint] - -wal_fpi     -[bigint] - -wal_bytes     -[numeric] - -jit_functions     -[bigint] - -jit_generation_time     -[double precision] - -jit_inlining_count     -[bigint] - -jit_inlining_time     -[double precision] - -jit_optimization_count     -[bigint] - -jit_optimization_time     -[double precision] - -jit_emission_count     -[bigint] - -jit_emission_time     -[double precision] - - - -pgsodium.key - - -pgsodium.key -     -[BASE TABLE] - -id     -[uuid] - -status     -[pgsodium.key_status] - -created     -[timestamp with time zone] - -expires     -[timestamp with time zone] - -key_type     -[pgsodium.key_type] - -key_id     -[bigint] - -key_context     -[bytea] - -name     -[text] - -associated_data     -[text] - -raw_key     -[bytea] - -raw_key_nonce     -[bytea] - -parent_key     -[uuid] - -comment     -[text] - -user_data     -[text] - - - -pgsodium.key:parent_key->pgsodium.key:id - - -FOREIGN KEY (parent_key) REFERENCES pgsodium.key(id) - - - -pgsodium.valid_key - - -pgsodium.valid_key -     -[VIEW] - -id     -[uuid] - -name     -[text] - -status     -[pgsodium.key_status] - -key_type     -[pgsodium.key_type] - -key_id     -[bigint] - -key_context     -[bytea] - -created     -[timestamp with time zone] - -expires     -[timestamp with time zone] - -associated_data     -[text] - - - -pgsodium.masking_rule - - -pgsodium.masking_rule -     -[VIEW] - -attrelid     -[oid] - -attnum     -[integer] - -relnamespace     -[regnamespace] - -relname     -[name] - -attname     -[name] - -format_type     -[text] - -col_description     -[text] - -key_id_column     -[text] - -key_id     -[text] - -associated_columns     -[text] - -nonce_column     -[text] - -view_name     -[text] - -priority     -[integer] - -security_invoker     -[boolean] - - - -pgsodium.mask_columns - - -pgsodium.mask_columns -     -[VIEW] - -attname     -[name] - -attrelid     -[oid] - -key_id     -[text] - -key_id_column     -[text] - -associated_columns     -[text] - -nonce_column     -[text] - -format_type     -[text] - - - -pgsodium.decrypted_key - - -pgsodium.decrypted_key -     -[VIEW] - -id     -[uuid] - -status     -[pgsodium.key_status] - -created     -[timestamp with time zone] - -expires     -[timestamp with time zone] - -key_type     -[pgsodium.key_type] - -key_id     -[bigint] - -key_context     -[bytea] - -name     -[text] - -associated_data     -[text] - -raw_key     -[bytea] - -decrypted_raw_key     -[bytea] - -raw_key_nonce     -[bytea] - -parent_key     -[uuid] - -comment     -[text] - - - -vault.secrets - - -vault.secrets -     -[BASE TABLE] - -id     -[uuid] - -name     -[text] - -description     -[text] - -secret     -[text] - -key_id     -[uuid] - -nonce     -[bytea] - -created_at     -[timestamp with time zone] - -updated_at     -[timestamp with time zone] - - - -vault.secrets:key_id->pgsodium.key:id - - -FOREIGN KEY (key_id) REFERENCES pgsodium.key(id) - - - -vault.decrypted_secrets - - -vault.decrypted_secrets -     -[VIEW] - -id     -[uuid] - -name     -[text] - -description     -[text] - -secret     -[text] - -decrypted_secret     -[text] - -key_id     -[uuid] - -nonce     -[bytea] - -created_at     -[timestamp with time zone] - -updated_at     -[timestamp with time zone] - - - diff --git a/docs/database/storage.buckets.md b/docs/database/storage.buckets.md deleted file mode 100644 index 721b3da57..000000000 --- a/docs/database/storage.buckets.md +++ /dev/null @@ -1,35 +0,0 @@ -# storage.buckets - -## Description - -## Columns - -| Name | Type | Default | Nullable | Children | Parents | Comment | -| ---- | ---- | ------- | -------- | -------- | ------- | ------- | -| id | text | | false | [storage.objects](storage.objects.md) | | | -| name | text | | false | | | | -| owner | uuid | | true | | [auth.users](auth.users.md) | | -| created_at | timestamp with time zone | now() | true | | | | -| updated_at | timestamp with time zone | now() | true | | | | - -## Constraints - -| Name | Type | Definition | -| ---- | ---- | ---------- | -| buckets_owner_fkey | FOREIGN KEY | FOREIGN KEY (owner) REFERENCES auth.users(id) | -| buckets_pkey | PRIMARY KEY | PRIMARY KEY (id) | - -## Indexes - -| Name | Definition | -| ---- | ---------- | -| buckets_pkey | CREATE UNIQUE INDEX buckets_pkey ON storage.buckets USING btree (id) | -| bname | CREATE UNIQUE INDEX bname ON storage.buckets USING btree (name) | - -## Relations - -![er](storage.buckets.svg) - ---- - -> Generated by [tbls](https://github.com/k1LoW/tbls) diff --git a/docs/database/storage.buckets.svg b/docs/database/storage.buckets.svg deleted file mode 100644 index eb745c9e2..000000000 --- a/docs/database/storage.buckets.svg +++ /dev/null @@ -1,157 +0,0 @@ - - - - - - -storage.buckets - - - -storage.buckets - - -storage.buckets -     -[BASE TABLE] - -id -[text] - -name -[text] - -owner -[uuid] - -created_at -[timestamp with time zone] - -updated_at -[timestamp with time zone] - - - - -auth.users - - -auth.users -     -[BASE TABLE] - -instance_id     -[uuid] - -id     -[uuid] - -aud     -[varchar(255)] - -role     -[varchar(255)] - -email     -[varchar(255)] - -encrypted_password     -[varchar(255)] - -confirmed_at     -[timestamp with time zone] - -invited_at     -[timestamp with time zone] - -confirmation_token     -[varchar(255)] - -confirmation_sent_at     -[timestamp with time zone] - -recovery_token     -[varchar(255)] - -recovery_sent_at     -[timestamp with time zone] - -email_change_token     -[varchar(255)] - -email_change     -[varchar(255)] - -email_change_sent_at     -[timestamp with time zone] - -last_sign_in_at     -[timestamp with time zone] - -raw_app_meta_data     -[jsonb] - -raw_user_meta_data     -[jsonb] - -is_super_admin     -[boolean] - -created_at     -[timestamp with time zone] - -updated_at     -[timestamp with time zone] - - - -storage.buckets:owner->auth.users:id - - -FOREIGN KEY (owner) REFERENCES auth.users(id) - - - -storage.objects - - -storage.objects -     -[BASE TABLE] - -id     -[uuid] - -bucket_id     -[text] - -name     -[text] - -owner     -[uuid] - -created_at     -[timestamp with time zone] - -updated_at     -[timestamp with time zone] - -last_accessed_at     -[timestamp with time zone] - -metadata     -[jsonb] - - - -storage.objects:bucket_id->storage.buckets:id - - -FOREIGN KEY (bucket_id) REFERENCES storage.buckets(id) - - - diff --git a/docs/database/storage.migrations.md b/docs/database/storage.migrations.md deleted file mode 100644 index 2d9064cfd..000000000 --- a/docs/database/storage.migrations.md +++ /dev/null @@ -1,34 +0,0 @@ -# storage.migrations - -## Description - -## Columns - -| Name | Type | Default | Nullable | Children | Parents | Comment | -| ---- | ---- | ------- | -------- | -------- | ------- | ------- | -| id | integer | | false | | | | -| name | varchar(100) | | false | | | | -| hash | varchar(40) | | false | | | | -| executed_at | timestamp without time zone | CURRENT_TIMESTAMP | true | | | | - -## Constraints - -| Name | Type | Definition | -| ---- | ---- | ---------- | -| migrations_pkey | PRIMARY KEY | PRIMARY KEY (id) | -| migrations_name_key | UNIQUE | UNIQUE (name) | - -## Indexes - -| Name | Definition | -| ---- | ---------- | -| migrations_pkey | CREATE UNIQUE INDEX migrations_pkey ON storage.migrations USING btree (id) | -| migrations_name_key | CREATE UNIQUE INDEX migrations_name_key ON storage.migrations USING btree (name) | - -## Relations - -![er](storage.migrations.svg) - ---- - -> Generated by [tbls](https://github.com/k1LoW/tbls) diff --git a/docs/database/storage.migrations.svg b/docs/database/storage.migrations.svg deleted file mode 100644 index 4b38ba13d..000000000 --- a/docs/database/storage.migrations.svg +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - -storage.migrations - - - -storage.migrations - - -storage.migrations -     -[BASE TABLE] - -id -[integer] - -name -[varchar(100)] - -hash -[varchar(40)] - -executed_at -[timestamp without time zone] - - - - diff --git a/docs/database/storage.objects.md b/docs/database/storage.objects.md deleted file mode 100644 index 521b2a999..000000000 --- a/docs/database/storage.objects.md +++ /dev/null @@ -1,40 +0,0 @@ -# storage.objects - -## Description - -## Columns - -| Name | Type | Default | Nullable | Children | Parents | Comment | -| ---- | ---- | ------- | -------- | -------- | ------- | ------- | -| id | uuid | uuid_generate_v4() | false | | | | -| bucket_id | text | | true | | [storage.buckets](storage.buckets.md) | | -| name | text | | true | | | | -| owner | uuid | | true | | [auth.users](auth.users.md) | | -| created_at | timestamp with time zone | now() | true | | | | -| updated_at | timestamp with time zone | now() | true | | | | -| last_accessed_at | timestamp with time zone | now() | true | | | | -| metadata | jsonb | | true | | | | - -## Constraints - -| Name | Type | Definition | -| ---- | ---- | ---------- | -| objects_owner_fkey | FOREIGN KEY | FOREIGN KEY (owner) REFERENCES auth.users(id) | -| objects_bucketId_fkey | FOREIGN KEY | FOREIGN KEY (bucket_id) REFERENCES storage.buckets(id) | -| objects_pkey | PRIMARY KEY | PRIMARY KEY (id) | - -## Indexes - -| Name | Definition | -| ---- | ---------- | -| objects_pkey | CREATE UNIQUE INDEX objects_pkey ON storage.objects USING btree (id) | -| bucketid_objname | CREATE UNIQUE INDEX bucketid_objname ON storage.objects USING btree (bucket_id, name) | -| name_prefix_search | CREATE INDEX name_prefix_search ON storage.objects USING btree (name text_pattern_ops) | - -## Relations - -![er](storage.objects.svg) - ---- - -> Generated by [tbls](https://github.com/k1LoW/tbls) diff --git a/docs/database/storage.objects.svg b/docs/database/storage.objects.svg deleted file mode 100644 index 0a9fcd470..000000000 --- a/docs/database/storage.objects.svg +++ /dev/null @@ -1,157 +0,0 @@ - - - - - - -storage.objects - - - -storage.objects - - -storage.objects -     -[BASE TABLE] - -id -[uuid] - -bucket_id -[text] - -name -[text] - -owner -[uuid] - -created_at -[timestamp with time zone] - -updated_at -[timestamp with time zone] - -last_accessed_at -[timestamp with time zone] - -metadata -[jsonb] - - - - -storage.buckets - - -storage.buckets -     -[BASE TABLE] - -id     -[text] - -name     -[text] - -owner     -[uuid] - -created_at     -[timestamp with time zone] - -updated_at     -[timestamp with time zone] - - - -storage.objects:bucket_id->storage.buckets:id - - -FOREIGN KEY (bucket_id) REFERENCES storage.buckets(id) - - - -auth.users - - -auth.users -     -[BASE TABLE] - -instance_id     -[uuid] - -id     -[uuid] - -aud     -[varchar(255)] - -role     -[varchar(255)] - -email     -[varchar(255)] - -encrypted_password     -[varchar(255)] - -confirmed_at     -[timestamp with time zone] - -invited_at     -[timestamp with time zone] - -confirmation_token     -[varchar(255)] - -confirmation_sent_at     -[timestamp with time zone] - -recovery_token     -[varchar(255)] - -recovery_sent_at     -[timestamp with time zone] - -email_change_token     -[varchar(255)] - -email_change     -[varchar(255)] - -email_change_sent_at     -[timestamp with time zone] - -last_sign_in_at     -[timestamp with time zone] - -raw_app_meta_data     -[jsonb] - -raw_user_meta_data     -[jsonb] - -is_super_admin     -[boolean] - -created_at     -[timestamp with time zone] - -updated_at     -[timestamp with time zone] - - - -storage.objects:owner->auth.users:id - - -FOREIGN KEY (owner) REFERENCES auth.users(id) - - - diff --git a/docs/database/supabase_functions.hooks.md b/docs/database/supabase_functions.hooks.md deleted file mode 100644 index b7940b96e..000000000 --- a/docs/database/supabase_functions.hooks.md +++ /dev/null @@ -1,37 +0,0 @@ -# supabase_functions.hooks - -## Description - -Supabase Functions Hooks: Audit trail for triggered hooks. - -## Columns - -| Name | Type | Default | Nullable | Children | Parents | Comment | -| ---- | ---- | ------- | -------- | -------- | ------- | ------- | -| id | bigint | nextval('supabase_functions.hooks_id_seq'::regclass) | false | | | | -| hook_table_id | integer | | false | | | | -| hook_name | text | | false | | | | -| created_at | timestamp with time zone | now() | false | | | | -| request_id | bigint | | true | | | | - -## Constraints - -| Name | Type | Definition | -| ---- | ---- | ---------- | -| hooks_pkey | PRIMARY KEY | PRIMARY KEY (id) | - -## Indexes - -| Name | Definition | -| ---- | ---------- | -| hooks_pkey | CREATE UNIQUE INDEX hooks_pkey ON supabase_functions.hooks USING btree (id) | -| supabase_functions_hooks_request_id_idx | CREATE INDEX supabase_functions_hooks_request_id_idx ON supabase_functions.hooks USING btree (request_id) | -| supabase_functions_hooks_h_table_id_h_name_idx | CREATE INDEX supabase_functions_hooks_h_table_id_h_name_idx ON supabase_functions.hooks USING btree (hook_table_id, hook_name) | - -## Relations - -![er](supabase_functions.hooks.svg) - ---- - -> Generated by [tbls](https://github.com/k1LoW/tbls) diff --git a/docs/database/supabase_functions.hooks.svg b/docs/database/supabase_functions.hooks.svg deleted file mode 100644 index 770472c71..000000000 --- a/docs/database/supabase_functions.hooks.svg +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - -supabase_functions.hooks - - - -supabase_functions.hooks - - -supabase_functions.hooks -     -[BASE TABLE] - -id -[bigint] - -hook_table_id -[integer] - -hook_name -[text] - -created_at -[timestamp with time zone] - -request_id -[bigint] - - - - diff --git a/docs/database/supabase_functions.migrations.md b/docs/database/supabase_functions.migrations.md deleted file mode 100644 index 8c6ad439e..000000000 --- a/docs/database/supabase_functions.migrations.md +++ /dev/null @@ -1,30 +0,0 @@ -# supabase_functions.migrations - -## Description - -## Columns - -| Name | Type | Default | Nullable | Children | Parents | Comment | -| ---- | ---- | ------- | -------- | -------- | ------- | ------- | -| version | text | | false | | | | -| inserted_at | timestamp with time zone | now() | false | | | | - -## Constraints - -| Name | Type | Definition | -| ---- | ---- | ---------- | -| migrations_pkey | PRIMARY KEY | PRIMARY KEY (version) | - -## Indexes - -| Name | Definition | -| ---- | ---------- | -| migrations_pkey | CREATE UNIQUE INDEX migrations_pkey ON supabase_functions.migrations USING btree (version) | - -## Relations - -![er](supabase_functions.migrations.svg) - ---- - -> Generated by [tbls](https://github.com/k1LoW/tbls) diff --git a/docs/database/supabase_functions.migrations.svg b/docs/database/supabase_functions.migrations.svg deleted file mode 100644 index bc1eca4aa..000000000 --- a/docs/database/supabase_functions.migrations.svg +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - -supabase_functions.migrations - - - -supabase_functions.migrations - - -supabase_functions.migrations -     -[BASE TABLE] - -version -[text] - -inserted_at -[timestamp with time zone] - - - - diff --git a/docs/database/vault.decrypted_secrets.md b/docs/database/vault.decrypted_secrets.md deleted file mode 100644 index a0e489c91..000000000 --- a/docs/database/vault.decrypted_secrets.md +++ /dev/null @@ -1,56 +0,0 @@ -# vault.decrypted_secrets - -## Description - -
-Table Definition - -```sql -CREATE VIEW decrypted_secrets AS ( - SELECT secrets.id, - secrets.name, - secrets.description, - secrets.secret, - CASE - WHEN (secrets.secret IS NULL) THEN NULL::text - ELSE - CASE - WHEN (secrets.key_id IS NULL) THEN NULL::text - ELSE convert_from(pgsodium.crypto_aead_det_decrypt(decode(secrets.secret, 'base64'::text), convert_to(((((secrets.id)::text || secrets.description) || (secrets.created_at)::text) || (secrets.updated_at)::text), 'utf8'::name), secrets.key_id, secrets.nonce), 'utf8'::name) - END - END AS decrypted_secret, - secrets.key_id, - secrets.nonce, - secrets.created_at, - secrets.updated_at - FROM vault.secrets -) -``` - -
- -## Referenced Tables - -- [vault.secrets](vault.secrets.md) - -## Columns - -| Name | Type | Default | Nullable | Children | Parents | Comment | -| ---- | ---- | ------- | -------- | -------- | ------- | ------- | -| id | uuid | | true | | | | -| name | text | | true | | | | -| description | text | | true | | | | -| secret | text | | true | | | | -| decrypted_secret | text | | true | | | | -| key_id | uuid | | true | | | | -| nonce | bytea | | true | | | | -| created_at | timestamp with time zone | | true | | | | -| updated_at | timestamp with time zone | | true | | | | - -## Relations - -![er](vault.decrypted_secrets.svg) - ---- - -> Generated by [tbls](https://github.com/k1LoW/tbls) diff --git a/docs/database/vault.decrypted_secrets.svg b/docs/database/vault.decrypted_secrets.svg deleted file mode 100644 index e83fd10c6..000000000 --- a/docs/database/vault.decrypted_secrets.svg +++ /dev/null @@ -1,50 +0,0 @@ - - - - - - -vault.decrypted_secrets - - - -vault.decrypted_secrets - - -vault.decrypted_secrets -     -[VIEW] - -id -[uuid] - -name -[text] - -description -[text] - -secret -[text] - -decrypted_secret -[text] - -key_id -[uuid] - -nonce -[bytea] - -created_at -[timestamp with time zone] - -updated_at -[timestamp with time zone] - - - - diff --git a/docs/database/vault.secrets.md b/docs/database/vault.secrets.md deleted file mode 100644 index 35390903d..000000000 --- a/docs/database/vault.secrets.md +++ /dev/null @@ -1,46 +0,0 @@ -# vault.secrets - -## Description - -Table with encrypted `secret` column for storing sensitive information on disk. - -## Columns - -| Name | Type | Default | Nullable | Children | Parents | Comment | -| ---- | ---- | ------- | -------- | -------- | ------- | ------- | -| id | uuid | gen_random_uuid() | false | | | | -| name | text | | true | | | | -| description | text | ''::text | false | | | | -| secret | text | | false | | | | -| key_id | uuid | (pgsodium.create_key()).id | true | | [pgsodium.key](pgsodium.key.md) | | -| nonce | bytea | pgsodium.crypto_aead_det_noncegen() | true | | | | -| created_at | timestamp with time zone | CURRENT_TIMESTAMP | false | | | | -| updated_at | timestamp with time zone | CURRENT_TIMESTAMP | false | | | | - -## Constraints - -| Name | Type | Definition | -| ---- | ---- | ---------- | -| secrets_key_id_fkey | FOREIGN KEY | FOREIGN KEY (key_id) REFERENCES pgsodium.key(id) | -| secrets_pkey | PRIMARY KEY | PRIMARY KEY (id) | - -## Indexes - -| Name | Definition | -| ---- | ---------- | -| secrets_pkey | CREATE UNIQUE INDEX secrets_pkey ON vault.secrets USING btree (id) | -| secrets_name_idx | CREATE UNIQUE INDEX secrets_name_idx ON vault.secrets USING btree (name) WHERE (name IS NOT NULL) | - -## Triggers - -| Name | Definition | -| ---- | ---------- | -| secrets_encrypt_secret_trigger_secret | CREATE TRIGGER secrets_encrypt_secret_trigger_secret BEFORE INSERT OR UPDATE OF secret ON vault.secrets FOR EACH ROW EXECUTE FUNCTION vault.secrets_encrypt_secret_secret() | - -## Relations - -![er](vault.secrets.svg) - ---- - -> Generated by [tbls](https://github.com/k1LoW/tbls) diff --git a/docs/database/vault.secrets.svg b/docs/database/vault.secrets.svg deleted file mode 100644 index 3f750eb5e..000000000 --- a/docs/database/vault.secrets.svg +++ /dev/null @@ -1,105 +0,0 @@ - - - - - - -vault.secrets - - - -vault.secrets - - -vault.secrets -     -[BASE TABLE] - -id -[uuid] - -name -[text] - -description -[text] - -secret -[text] - -key_id -[uuid] - -nonce -[bytea] - -created_at -[timestamp with time zone] - -updated_at -[timestamp with time zone] - - - - -pgsodium.key - - -pgsodium.key -     -[BASE TABLE] - -id     -[uuid] - -status     -[pgsodium.key_status] - -created     -[timestamp with time zone] - -expires     -[timestamp with time zone] - -key_type     -[pgsodium.key_type] - -key_id     -[bigint] - -key_context     -[bytea] - -name     -[text] - -associated_data     -[text] - -raw_key     -[bytea] - -raw_key_nonce     -[bytea] - -parent_key     -[uuid] - -comment     -[text] - -user_data     -[text] - - - -vault.secrets:key_id->pgsodium.key:id - - -FOREIGN KEY (key_id) REFERENCES pgsodium.key(id) - - - diff --git a/docs/uml/app/lib/models/uml.svg b/docs/uml/app/lib/models/uml.svg deleted file mode 100644 index e1d655211..000000000 --- a/docs/uml/app/lib/models/uml.svg +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/uml/app/lib/screens/app_onboarding/uml.svg b/docs/uml/app/lib/screens/app_onboarding/uml.svg deleted file mode 100644 index d3d4c5668..000000000 --- a/docs/uml/app/lib/screens/app_onboarding/uml.svg +++ /dev/null @@ -1,339 +0,0 @@ - - [LoadingScreen - | - +sessionString: String?; - +queryParameters: Map<String, String>? - ] - - [AppOutdatedScreen - | - +Widget build() - ] - - [WelcomeScreen - | - +Widget build() - ] - - [TermsScreen - ] - - [LegalSection - | - +title: String?; - +description: String?; - +icon: Icon?; - +pdfUrl: String?; - +pdfUrlLabel: String?; - +acknowledgment: String?; - +isChecked: bool?; - +onChange: void Function(bool?)? - | - +Widget build() - ] - - [LegalSection]o-[Icon] - [LegalSection]o-[void Function(bool?)?] - - [IFrameHelper - | - +void postRouteFinished(); - +void listen() - ] - - [Preview - | - +queryParameters: Map<String, String>?; - +appLanguage: AppLanguage; - +selectedRoute: String?; - +extra: String?; - +study: Study?; - +selectedStudyObjectId: String?; - +subject: StudySubject? - | - +bool hasRoute(); - +void handleQueries(); - +dynamic init(); - +dynamic handleAuthorization(); - +dynamic runCommands(); - +String? getSelectedRoute(); - +bool containsQuery(); - +bool containsQueryPair(); - +dynamic getStudySubject(); - -dynamic _createFakeSubject(); - +List<String> getInterventionIds() - ] - - [Preview]o-[AppLanguage] - [Preview]o-[Study] - [Preview]o-[StudySubject] - - [AboutScreen - | - +Widget build() - ] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LoadingScreen - - - - - - +sessionString: String? - +queryParameters: Map<String, String>? - - - - - - - - - - - - AppOutdatedScreen - - - - - - +Widget build() - - - - - - - - - - - - WelcomeScreen - - - - - - +Widget build() - - - - - - - - - - - TermsScreen - - - - - - - - - - - - - LegalSection - - - - - - +title: String? - +description: String? - +icon: Icon? - +pdfUrl: String? - +pdfUrlLabel: String? - +acknowledgment: String? - +isChecked: bool? - +onChange: void Function(bool?)? - - - - - - +Widget build() - - - - - - - - - - - Icon - - - - - - - - - - - void Function(bool?)? - - - - - - - - - - - - IFrameHelper - - - - - - +void postRouteFinished() - +void listen() - - - - - - - - - - - - - Preview - - - - - - +queryParameters: Map<String, String>? - +appLanguage: AppLanguage - +selectedRoute: String? - +extra: String? - +study: Study? - +selectedStudyObjectId: String? - +subject: StudySubject? - - - - - - +bool hasRoute() - +void handleQueries() - +dynamic init() - +dynamic handleAuthorization() - +dynamic runCommands() - +String? getSelectedRoute() - +bool containsQuery() - +bool containsQueryPair() - +dynamic getStudySubject() - -dynamic _createFakeSubject() - +List<String> getInterventionIds() - - - - - - - - - - - AppLanguage - - - - - - - - - - - Study - - - - - - - - - - - StudySubject - - - - - - - - - - - - AboutScreen - - - - - - +Widget build() - - - - - - - - - \ No newline at end of file diff --git a/docs/uml/app/lib/screens/study/dashboard/contact_tab/uml.svg b/docs/uml/app/lib/screens/study/dashboard/contact_tab/uml.svg deleted file mode 100644 index c00cf0806..000000000 --- a/docs/uml/app/lib/screens/study/dashboard/contact_tab/uml.svg +++ /dev/null @@ -1,309 +0,0 @@ - - [ContactScreen - ] - - [ContactWidget - | - +contact: Contact?; - +title: String; - +subtitle: String?; - +color: Color - | - +Widget build() - ] - - [ContactWidget]o-[Contact] - [ContactWidget]o-[Color] - - [ContactItem - | - +iconData: IconData; - +itemName: String; - +itemValue: String?; - +type: ContactItemType?; - +iconColor: Color? - | - +dynamic launchContact(); - +Widget build() - ] - - [ContactItem]o-[IconData] - [ContactItem]o-[ContactItemType] - [ContactItem]o-[Color] - - [ContactItemType - | - +index: int; - <static>+values: List<ContactItemType>; - <static>+website: ContactItemType; - <static>+email: ContactItemType; - <static>+phone: ContactItemType - ] - - [ContactItemType]o-[ContactItemType] - [Enum]<:--[ContactItemType] - - [FAQ - | - +Widget build() - ] - - [Entry - | - +title: String; - +children: List<Entry> - ] - - [EntryItem - | - +entry: Entry - | - -Widget _buildTiles(); - +Widget build() - ] - - [EntryItem]o-[Entry] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ContactScreen - - - - - - - - - - - - - ContactWidget - - - - - - +contact: Contact? - +title: String - +subtitle: String? - +color: Color - - - - - - +Widget build() - - - - - - - - - - - Contact - - - - - - - - - - - Color - - - - - - - - - - - - - ContactItem - - - - - - +iconData: IconData - +itemName: String - +itemValue: String? - +type: ContactItemType? - +iconColor: Color? - - - - - - +dynamic launchContact() - +Widget build() - - - - - - - - - - - IconData - - - - - - - - - - - - ContactItemType - - - - - - +index: int - <static>+values: List<ContactItemType> - <static>+website: ContactItemType - <static>+email: ContactItemType - <static>+phone: ContactItemType - - - - - - - - - - - Enum - - - - - - - - - - - - FAQ - - - - - - +Widget build() - - - - - - - - - - - - Entry - - - - - - +title: String - +children: List<Entry> - - - - - - - - - - - - - EntryItem - - - - - - +entry: Entry - - - - - - -Widget _buildTiles() - +Widget build() - - - - - - - - - \ No newline at end of file diff --git a/docs/uml/app/lib/screens/study/dashboard/task_overview_tab/uml.svg b/docs/uml/app/lib/screens/study/dashboard/task_overview_tab/uml.svg deleted file mode 100644 index b5d839b5e..000000000 --- a/docs/uml/app/lib/screens/study/dashboard/task_overview_tab/uml.svg +++ /dev/null @@ -1,224 +0,0 @@ - - [TaskOverview - | - +subject: StudySubject?; - +scheduleToday: List<TaskInstance>?; - +interventionIcon: String? - ] - - [TaskOverview]o-[StudySubject] - - [TaskBox - | - +taskInstance: TaskInstance; - +icon: Icon; - +onCompleted: dynamic Function() - ] - - [TaskBox]o-[TaskInstance] - [TaskBox]o-[Icon] - [TaskBox]o-[dynamic Function()] - - [ProgressRow - | - +subject: StudySubject? - ] - - [ProgressRow]o-[StudySubject] - - [InterventionSegment - | - +intervention: Intervention; - +percentCompleted: double; - +percentMissed: double; - +isCurrent: bool; - +isFuture: bool; - +phaseDuration: int - | - +List<Widget> buildSeparators(); - +Widget build() - ] - - [InterventionSegment]o-[Intervention] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - TaskOverview - - - - - - +subject: StudySubject? - +scheduleToday: List<TaskInstance>? - +interventionIcon: String? - - - - - - - - - - - StudySubject - - - - - - - - - - - - TaskBox - - - - - - +taskInstance: TaskInstance - +icon: Icon - +onCompleted: dynamic Function() - - - - - - - - - - - TaskInstance - - - - - - - - - - - Icon - - - - - - - - - - - dynamic Function() - - - - - - - - - - - - ProgressRow - - - - - - +subject: StudySubject? - - - - - - - - - - - - - InterventionSegment - - - - - - +intervention: Intervention - +percentCompleted: double - +percentMissed: double - +isCurrent: bool - +isFuture: bool - +phaseDuration: int - - - - - - +List<Widget> buildSeparators() - +Widget build() - - - - - - - - - - - Intervention - - - - - - - - - \ No newline at end of file diff --git a/docs/uml/app/lib/screens/study/dashboard/uml.svg b/docs/uml/app/lib/screens/study/dashboard/uml.svg deleted file mode 100644 index f9ee5b73d..000000000 --- a/docs/uml/app/lib/screens/study/dashboard/uml.svg +++ /dev/null @@ -1,732 +0,0 @@ - - [Settings - ] - - [OptOutAlertDialog - | - +subject: StudySubject? - | - +Widget build() - ] - - [OptOutAlertDialog]o-[StudySubject] - - [DeleteAlertDialog - | - +subject: StudySubject? - | - +Widget build() - ] - - [DeleteAlertDialog]o-[StudySubject] - - [DashboardScreen - | - +error: String? - ] - - [OverflowMenuItem - | - +name: String; - +icon: IconData; - +routeName: String?; - +onTap: dynamic Function()? - ] - - [OverflowMenuItem]o-[IconData] - [OverflowMenuItem]o-[dynamic Function()?] - - [StudyFinishedPlaceholder - | - <static>+space: SizedBox - | - +Widget build() - ] - - [StudyFinishedPlaceholder]o-[SizedBox] - - [ProgressRow - | - +subject: StudySubject? - ] - - [ProgressRow]o-[StudySubject] - - [InterventionSegment - | - +intervention: Intervention; - +percentCompleted: double; - +percentMissed: double; - +isCurrent: bool; - +isFuture: bool; - +phaseDuration: int - | - +List<Widget> buildSeparators(); - +Widget build() - ] - - [InterventionSegment]o-[Intervention] - - [TaskBox - | - +taskInstance: TaskInstance; - +icon: Icon; - +onCompleted: dynamic Function() - ] - - [TaskBox]o-[TaskInstance] - [TaskBox]o-[Icon] - [TaskBox]o-[dynamic Function()] - - [TaskOverview - | - +subject: StudySubject?; - +scheduleToday: List<TaskInstance>?; - +interventionIcon: String? - ] - - [TaskOverview]o-[StudySubject] - - [FAQ - | - +Widget build() - ] - - [Entry - | - +title: String; - +children: List<Entry> - ] - - [EntryItem - | - +entry: Entry - | - -Widget _buildTiles(); - +Widget build() - ] - - [EntryItem]o-[Entry] - - [ContactScreen - ] - - [ContactWidget - | - +contact: Contact?; - +title: String; - +subtitle: String?; - +color: Color - | - +Widget build() - ] - - [ContactWidget]o-[Contact] - [ContactWidget]o-[Color] - - [ContactItem - | - +iconData: IconData; - +itemName: String; - +itemValue: String?; - +type: ContactItemType?; - +iconColor: Color? - | - +dynamic launchContact(); - +Widget build() - ] - - [ContactItem]o-[IconData] - [ContactItem]o-[ContactItemType] - [ContactItem]o-[Color] - - [ContactItemType - | - +index: int; - <static>+values: List<ContactItemType>; - <static>+website: ContactItemType; - <static>+email: ContactItemType; - <static>+phone: ContactItemType - ] - - [ContactItemType]o-[ContactItemType] - [Enum]<:--[ContactItemType] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Settings - - - - - - - - - - - - - OptOutAlertDialog - - - - - - +subject: StudySubject? - - - - - - +Widget build() - - - - - - - - - - - StudySubject - - - - - - - - - - - - - DeleteAlertDialog - - - - - - +subject: StudySubject? - - - - - - +Widget build() - - - - - - - - - - - - DashboardScreen - - - - - - +error: String? - - - - - - - - - - - - OverflowMenuItem - - - - - - +name: String - +icon: IconData - +routeName: String? - +onTap: dynamic Function()? - - - - - - - - - - - IconData - - - - - - - - - - - dynamic Function()? - - - - - - - - - - - - - StudyFinishedPlaceholder - - - - - - <static>+space: SizedBox - - - - - - +Widget build() - - - - - - - - - - - SizedBox - - - - - - - - - - - - ProgressRow - - - - - - +subject: StudySubject? - - - - - - - - - - - - - InterventionSegment - - - - - - +intervention: Intervention - +percentCompleted: double - +percentMissed: double - +isCurrent: bool - +isFuture: bool - +phaseDuration: int - - - - - - +List<Widget> buildSeparators() - +Widget build() - - - - - - - - - - - Intervention - - - - - - - - - - - - TaskBox - - - - - - +taskInstance: TaskInstance - +icon: Icon - +onCompleted: dynamic Function() - - - - - - - - - - - TaskInstance - - - - - - - - - - - Icon - - - - - - - - - - - dynamic Function() - - - - - - - - - - - - TaskOverview - - - - - - +subject: StudySubject? - +scheduleToday: List<TaskInstance>? - +interventionIcon: String? - - - - - - - - - - - - FAQ - - - - - - +Widget build() - - - - - - - - - - - - Entry - - - - - - +title: String - +children: List<Entry> - - - - - - - - - - - - - EntryItem - - - - - - +entry: Entry - - - - - - -Widget _buildTiles() - +Widget build() - - - - - - - - - - - ContactScreen - - - - - - - - - - - - - ContactWidget - - - - - - +contact: Contact? - +title: String - +subtitle: String? - +color: Color - - - - - - +Widget build() - - - - - - - - - - - Contact - - - - - - - - - - - Color - - - - - - - - - - - - - ContactItem - - - - - - +iconData: IconData - +itemName: String - +itemValue: String? - +type: ContactItemType? - +iconColor: Color? - - - - - - +dynamic launchContact() - +Widget build() - - - - - - - - - - - - ContactItemType - - - - - - +index: int - <static>+values: List<ContactItemType> - <static>+website: ContactItemType - <static>+email: ContactItemType - <static>+phone: ContactItemType - - - - - - - - - - - Enum - - - - - - - - - \ No newline at end of file diff --git a/docs/uml/app/lib/screens/study/multimodal/uml.svg b/docs/uml/app/lib/screens/study/multimodal/uml.svg deleted file mode 100644 index 6f6fa36dc..000000000 --- a/docs/uml/app/lib/screens/study/multimodal/uml.svg +++ /dev/null @@ -1,39 +0,0 @@ - - [CapturePictureScreen - | - +userId: String; - +studyId: String - ] - - - - - - - - - - - - - - - - - CapturePictureScreen - - - - - - +userId: String - +studyId: String - - - - - - - - - \ No newline at end of file diff --git a/docs/uml/app/lib/screens/study/onboarding/uml.svg b/docs/uml/app/lib/screens/study/onboarding/uml.svg deleted file mode 100644 index 942820264..000000000 --- a/docs/uml/app/lib/screens/study/onboarding/uml.svg +++ /dev/null @@ -1,721 +0,0 @@ - - [StudySelectionScreen - ] - - [InviteCodeDialog - ] - - [EligibilityResult - | - +eligible: bool; - +firstFailed: EligibilityCriterion? - ] - - [EligibilityResult]o-[EligibilityCriterion] - - [EligibilityScreen - | - +study: Study? - | - <static>+MaterialPageRoute<EligibilityResult> routeFor() - ] - - [EligibilityScreen]o-[Study] - - [ConsentScreen - ] - - [ConsentCard - | - +consent: ConsentItem?; - +index: int?; - +onTapped: dynamic Function(int); - +isChecked: bool? - | - +Widget build() - ] - - [ConsentCard]o-[ConsentItem] - [ConsentCard]o-[dynamic Function(int)] - - [ConsentElement - | - +title: String; - +descriptionText: String; - +acknowledgmentText: String; - +icon: IconData - ] - - [ConsentElement]o-[IconData] - - [KickoffScreen - ] - - [_KickoffScreen - | - +subject: StudySubject?; - +ready: bool - | - -dynamic _storeUserStudy(); - -Widget _constructStatusIcon(); - -String _getStatusText(); - +Widget build() - ] - - [_KickoffScreen]o-[StudySubject] - - [InterventionSelectionScreen - ] - - [OnboardingProgress - | - +stage: int; - +progress: double - | - -double _getProgressForStage(); - +Widget build() - ] - - [StudyOverviewScreen - ] - - [_StudyOverviewScreen - | - +study: Study? - | - +dynamic navigateToJourney(); - +dynamic navigateToEligibilityCheck(); - +Widget build() - ] - - [_StudyOverviewScreen]o-[Study] - - [StudyDetailsView - | - +study: Study?; - +iconSize: double - | - +Widget build() - ] - - [StudyDetailsView]o-[Study] - - [JourneyOverviewScreen - ] - - [_JourneyOverviewScreen - | - +subject: StudySubject? - | - +dynamic getConsentAndNavigateToDashboard(); - +Widget build() - ] - - [_JourneyOverviewScreen]o-[StudySubject] - - [Timeline - | - +subject: StudySubject? - | - +Widget build() - ] - - [Timeline]o-[StudySubject] - - [InterventionTile - | - +title: String?; - +iconName: String; - +date: DateTime; - +color: Color?; - +isFirst: bool; - +isLast: bool - | - +Widget build() - ] - - [InterventionTile]o-[Color] - - [IconIndicator - | - +iconName: String; - +color: Color? - | - +Widget build() - ] - - [IconIndicator]o-[Color] - - [TimelineChild - | - +child: Widget? - | - +Widget build() - ] - - [TimelineChild]o-[<abstract>Widget] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - StudySelectionScreen - - - - - - - - - - - InviteCodeDialog - - - - - - - - - - - - EligibilityResult - - - - - - +eligible: bool - +firstFailed: EligibilityCriterion? - - - - - - - - - - - EligibilityCriterion - - - - - - - - - - - - - EligibilityScreen - - - - - - +study: Study? - - - - - - <static>+MaterialPageRoute<EligibilityResult> routeFor() - - - - - - - - - - - Study - - - - - - - - - - - ConsentScreen - - - - - - - - - - - - - ConsentCard - - - - - - +consent: ConsentItem? - +index: int? - +onTapped: dynamic Function(int) - +isChecked: bool? - - - - - - +Widget build() - - - - - - - - - - - ConsentItem - - - - - - - - - - - dynamic Function(int) - - - - - - - - - - - - ConsentElement - - - - - - +title: String - +descriptionText: String - +acknowledgmentText: String - +icon: IconData - - - - - - - - - - - IconData - - - - - - - - - - - KickoffScreen - - - - - - - - - - - - - _KickoffScreen - - - - - - +subject: StudySubject? - +ready: bool - - - - - - -dynamic _storeUserStudy() - -Widget _constructStatusIcon() - -String _getStatusText() - +Widget build() - - - - - - - - - - - StudySubject - - - - - - - - - - - InterventionSelectionScreen - - - - - - - - - - - - - OnboardingProgress - - - - - - +stage: int - +progress: double - - - - - - -double _getProgressForStage() - +Widget build() - - - - - - - - - - - StudyOverviewScreen - - - - - - - - - - - - - _StudyOverviewScreen - - - - - - +study: Study? - - - - - - +dynamic navigateToJourney() - +dynamic navigateToEligibilityCheck() - +Widget build() - - - - - - - - - - - - - StudyDetailsView - - - - - - +study: Study? - +iconSize: double - - - - - - +Widget build() - - - - - - - - - - - JourneyOverviewScreen - - - - - - - - - - - - - _JourneyOverviewScreen - - - - - - +subject: StudySubject? - - - - - - +dynamic getConsentAndNavigateToDashboard() - +Widget build() - - - - - - - - - - - - - Timeline - - - - - - +subject: StudySubject? - - - - - - +Widget build() - - - - - - - - - - - - - InterventionTile - - - - - - +title: String? - +iconName: String - +date: DateTime - +color: Color? - +isFirst: bool - +isLast: bool - - - - - - +Widget build() - - - - - - - - - - - Color - - - - - - - - - - - - - IconIndicator - - - - - - +iconName: String - +color: Color? - - - - - - +Widget build() - - - - - - - - - - - - - TimelineChild - - - - - - +child: Widget? - - - - - - +Widget build() - - - - - - - - - - - Widget - - - - - - - - - \ No newline at end of file diff --git a/docs/uml/app/lib/screens/study/report/performance/uml.svg b/docs/uml/app/lib/screens/study/report/performance/uml.svg deleted file mode 100644 index 882316c2f..000000000 --- a/docs/uml/app/lib/screens/study/report/performance/uml.svg +++ /dev/null @@ -1,291 +0,0 @@ - - [PerformanceDetailsScreen - | - +reportSubject: StudySubject? - | - <static>+MaterialPageRoute<dynamic> routeFor(); - +Widget build() - ] - - [PerformanceDetailsScreen]o-[StudySubject] - - [InterventionPerformanceBar - | - +intervention: Intervention; - +subject: StudySubject? - | - +Widget build() - ] - - [InterventionPerformanceBar]o-[Intervention] - [InterventionPerformanceBar]o-[StudySubject] - - [ObservationPerformanceBar - | - +observation: Observation; - +subject: StudySubject? - | - +Widget build() - ] - - [ObservationPerformanceBar]o-[<abstract>Observation] - [ObservationPerformanceBar]o-[StudySubject] - - [PerformanceBar - | - +task: Task; - +completed: int; - +total: int - | - +Widget build() - ] - - [PerformanceBar]o-[<abstract>Task] - - [PerformanceSection - | - +minimumRatio: double; - +maximum: double - | - +Widget buildContent(); - +String getPowerLevelDescription(); - +int getCountableObservationAmount() - ] - - [<abstract>GenericSection]<:-[PerformanceSection] - - [PerformanceBar - | - +progress: double; - +minimum: double? - | - +Widget build() - ] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - PerformanceDetailsScreen - - - - - - +reportSubject: StudySubject? - - - - - - <static>+MaterialPageRoute<dynamic> routeFor() - +Widget build() - - - - - - - - - - - StudySubject - - - - - - - - - - - - - InterventionPerformanceBar - - - - - - +intervention: Intervention - +subject: StudySubject? - - - - - - +Widget build() - - - - - - - - - - - Intervention - - - - - - - - - - - - - ObservationPerformanceBar - - - - - - +observation: Observation - +subject: StudySubject? - - - - - - +Widget build() - - - - - - - - - - - Observation - - - - - - - - - - - - - PerformanceBar - - - - - - +task: Task - +completed: int - +total: int - - - - - - +Widget build() - - - - - - - - - - - Task - - - - - - - - - - - - - PerformanceSection - - - - - - +minimumRatio: double - +maximum: double - - - - - - +Widget buildContent() - +String getPowerLevelDescription() - +int getCountableObservationAmount() - - - - - - - - - - - GenericSection - - - - - - - - - \ No newline at end of file diff --git a/docs/uml/app/lib/screens/study/report/sections/uml.svg b/docs/uml/app/lib/screens/study/report/sections/uml.svg deleted file mode 100644 index 61a7f1b00..000000000 --- a/docs/uml/app/lib/screens/study/report/sections/uml.svg +++ /dev/null @@ -1,184 +0,0 @@ - - [LinearRegressionSectionWidget - | - +section: LinearRegressionSection - | - +Widget build() - ] - - [LinearRegressionSectionWidget]o-[LinearRegressionSection] - [<abstract>ReportSectionWidget]<:-[LinearRegressionSectionWidget] - - [AverageSectionWidget - | - +section: AverageSection; - +titlePos: List<int>; - +phasePos: List<int> - | - +Widget build(); - +Widget getLegend(); - +Widget getDiagram(); - +BarChartData getChartData(); - +Widget getTitles(); - +Widget getValues(); - +List<BarChartGroupData> getBarGroups(); - +FlGridData getGridData(); - +MaterialColor getColor(); - +int getDayIndex(); - +Iterable<DiagramDatum> getAggregatedData(); - +Map<String, String?> getInterventionNames() - ] - - [AverageSectionWidget]o-[AverageSection] - [<abstract>ReportSectionWidget]<:-[AverageSectionWidget] - - [DiagramDatum - | - +x: num; - +value: num; - +timestamp: DateTime?; - +intervention: String - ] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LinearRegressionSectionWidget - - - - - - +section: LinearRegressionSection - - - - - - +Widget build() - - - - - - - - - - - LinearRegressionSection - - - - - - - - - - - ReportSectionWidget - - - - - - - - - - - - - AverageSectionWidget - - - - - - +section: AverageSection - +titlePos: List<int> - +phasePos: List<int> - - - - - - +Widget build() - +Widget getLegend() - +Widget getDiagram() - +BarChartData getChartData() - +Widget getTitles() - +Widget getValues() - +List<BarChartGroupData> getBarGroups() - +FlGridData getGridData() - +MaterialColor getColor() - +int getDayIndex() - +Iterable<DiagramDatum> getAggregatedData() - +Map<String, String?> getInterventionNames() - - - - - - - - - - - AverageSection - - - - - - - - - - - - DiagramDatum - - - - - - +x: num - +value: num - +timestamp: DateTime? - +intervention: String - - - - - - - - - \ No newline at end of file diff --git a/docs/uml/app/lib/screens/study/report/uml.svg b/docs/uml/app/lib/screens/study/report/uml.svg deleted file mode 100644 index 6e51568c4..000000000 --- a/docs/uml/app/lib/screens/study/report/uml.svg +++ /dev/null @@ -1,865 +0,0 @@ - - [PerformanceSection - | - +minimumRatio: double; - +maximum: double - | - +Widget buildContent(); - +String getPowerLevelDescription(); - +int getCountableObservationAmount() - ] - - [<abstract>GenericSection]<:-[PerformanceSection] - - [PerformanceBar - | - +progress: double; - +minimum: double? - | - +Widget build() - ] - - [PerformanceDetailsScreen - | - +reportSubject: StudySubject? - | - <static>+MaterialPageRoute<dynamic> routeFor(); - +Widget build() - ] - - [PerformanceDetailsScreen]o-[StudySubject] - - [InterventionPerformanceBar - | - +intervention: Intervention; - +subject: StudySubject? - | - +Widget build() - ] - - [InterventionPerformanceBar]o-[Intervention] - [InterventionPerformanceBar]o-[StudySubject] - - [ObservationPerformanceBar - | - +observation: Observation; - +subject: StudySubject? - | - +Widget build() - ] - - [ObservationPerformanceBar]o-[<abstract>Observation] - [ObservationPerformanceBar]o-[StudySubject] - - [PerformanceBar - | - +task: Task; - +completed: int; - +total: int - | - +Widget build() - ] - - [PerformanceBar]o-[<abstract>Task] - - [ReportDetailsScreen - | - +subject: StudySubject - | - <static>+MaterialPageRoute<dynamic> routeFor(); - +Widget build() - ] - - [ReportDetailsScreen]o-[StudySubject] - - [ReportSectionContainer - | - +section: ReportSection; - +subject: StudySubject; - +primary: bool; - +onTap: void Function()? - | - +ReportSectionWidget buildContents(); - +dynamic (); - +List<Widget> buildPrimaryHeader(); - +Widget build() - ] - - [ReportSectionContainer]o-[<abstract>ReportSection] - [ReportSectionContainer]o-[StudySubject] - [ReportSectionContainer]o-[void Function()?] - - [ReportHistoryScreen - | - +Widget build() - ] - - [ReportHistoryItem - | - +subject: StudySubject - | - +Widget build() - ] - - [ReportHistoryItem]o-[StudySubject] - - [GeneralDetailsSection - | - +Widget buildContent() - ] - - [<abstract>GenericSection]<:-[GeneralDetailsSection] - - [<abstract>GenericSection - | - +subject: StudySubject?; - +onTap: void Function()? - | - +Widget buildContent(); - +Widget build() - ] - - [<abstract>GenericSection]o-[StudySubject] - [<abstract>GenericSection]o-[void Function()?] - - [LegendWidget - | - +name: String; - +color: Color - | - +Widget build() - ] - - [LegendWidget]o-[Color] - - [LegendsListWidget - | - +legends: List<Legend> - | - +Widget build() - ] - - [Legend - | - +name: String; - +color: Color - ] - - [Legend]o-[Color] - - [DisclaimerSection - | - +Widget buildContent() - ] - - [<abstract>GenericSection]<:-[DisclaimerSection] - - [<abstract>ReportSectionWidget - | - +subject: StudySubject - ] - - [<abstract>ReportSectionWidget]o-[StudySubject] - - [AverageSectionWidget - | - +section: AverageSection; - +titlePos: List<int>; - +phasePos: List<int> - | - +Widget build(); - +Widget getLegend(); - +Widget getDiagram(); - +BarChartData getChartData(); - +Widget getTitles(); - +Widget getValues(); - +List<BarChartGroupData> getBarGroups(); - +FlGridData getGridData(); - +MaterialColor getColor(); - +int getDayIndex(); - +Iterable<DiagramDatum> getAggregatedData(); - +Map<String, String?> getInterventionNames() - ] - - [AverageSectionWidget]o-[AverageSection] - [<abstract>ReportSectionWidget]<:-[AverageSectionWidget] - - [DiagramDatum - | - +x: num; - +value: num; - +timestamp: DateTime?; - +intervention: String - ] - - [LinearRegressionSectionWidget - | - +section: LinearRegressionSection - | - +Widget build() - ] - - [LinearRegressionSectionWidget]o-[LinearRegressionSection] - [<abstract>ReportSectionWidget]<:-[LinearRegressionSectionWidget] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - PerformanceSection - - - - - - +minimumRatio: double - +maximum: double - - - - - - +Widget buildContent() - +String getPowerLevelDescription() - +int getCountableObservationAmount() - - - - - - - - - - - - - GenericSection - - - - - - +subject: StudySubject? - +onTap: void Function()? - - - - - - +Widget buildContent() - +Widget build() - - - - - - - - - - - - - PerformanceBar - - - - - - +progress: double - +minimum: double? - - - - - - +Widget build() - - - - - - - - - - - - - PerformanceDetailsScreen - - - - - - +reportSubject: StudySubject? - - - - - - <static>+MaterialPageRoute<dynamic> routeFor() - +Widget build() - - - - - - - - - - - StudySubject - - - - - - - - - - - - - InterventionPerformanceBar - - - - - - +intervention: Intervention - +subject: StudySubject? - - - - - - +Widget build() - - - - - - - - - - - Intervention - - - - - - - - - - - - - ObservationPerformanceBar - - - - - - +observation: Observation - +subject: StudySubject? - - - - - - +Widget build() - - - - - - - - - - - Observation - - - - - - - - - - - Task - - - - - - - - - - - - - ReportDetailsScreen - - - - - - +subject: StudySubject - - - - - - <static>+MaterialPageRoute<dynamic> routeFor() - +Widget build() - - - - - - - - - - - - - ReportSectionContainer - - - - - - +section: ReportSection - +subject: StudySubject - +primary: bool - +onTap: void Function()? - - - - - - +ReportSectionWidget buildContents() - +dynamic () - +List<Widget> buildPrimaryHeader() - +Widget build() - - - - - - - - - - - ReportSection - - - - - - - - - - - void Function()? - - - - - - - - - - - - ReportHistoryScreen - - - - - - +Widget build() - - - - - - - - - - - - - ReportHistoryItem - - - - - - +subject: StudySubject - - - - - - +Widget build() - - - - - - - - - - - - GeneralDetailsSection - - - - - - +Widget buildContent() - - - - - - - - - - - - - LegendWidget - - - - - - +name: String - +color: Color - - - - - - +Widget build() - - - - - - - - - - - Color - - - - - - - - - - - - - LegendsListWidget - - - - - - +legends: List<Legend> - - - - - - +Widget build() - - - - - - - - - - - - Legend - - - - - - +name: String - +color: Color - - - - - - - - - - - - DisclaimerSection - - - - - - +Widget buildContent() - - - - - - - - - - - - ReportSectionWidget - - - - - - +subject: StudySubject - - - - - - - - - - - - - AverageSectionWidget - - - - - - +section: AverageSection - +titlePos: List<int> - +phasePos: List<int> - - - - - - +Widget build() - +Widget getLegend() - +Widget getDiagram() - +BarChartData getChartData() - +Widget getTitles() - +Widget getValues() - +List<BarChartGroupData> getBarGroups() - +FlGridData getGridData() - +MaterialColor getColor() - +int getDayIndex() - +Iterable<DiagramDatum> getAggregatedData() - +Map<String, String?> getInterventionNames() - - - - - - - - - - - AverageSection - - - - - - - - - - - - DiagramDatum - - - - - - +x: num - +value: num - +timestamp: DateTime? - +intervention: String - - - - - - - - - - - - - LinearRegressionSectionWidget - - - - - - +section: LinearRegressionSection - - - - - - +Widget build() - - - - - - - - - - - LinearRegressionSection - - - - - - - - - \ No newline at end of file diff --git a/docs/uml/app/lib/screens/study/report/util/uml.svg b/docs/uml/app/lib/screens/study/report/util/uml.svg deleted file mode 100644 index d13841612..000000000 --- a/docs/uml/app/lib/screens/study/report/util/uml.svg +++ /dev/null @@ -1,128 +0,0 @@ - - [LegendWidget - | - +name: String; - +color: Color - | - +Widget build() - ] - - [LegendWidget]o-[Color] - - [LegendsListWidget - | - +legends: List<Legend> - | - +Widget build() - ] - - [Legend - | - +name: String; - +color: Color - ] - - [Legend]o-[Color] - - - - - - - - - - - - - - - - - - - - - - - - - - LegendWidget - - - - - - +name: String - +color: Color - - - - - - +Widget build() - - - - - - - - - - - Color - - - - - - - - - - - - - LegendsListWidget - - - - - - +legends: List<Legend> - - - - - - +Widget build() - - - - - - - - - - - - Legend - - - - - - +name: String - +color: Color - - - - - - - - - \ No newline at end of file diff --git a/docs/uml/app/lib/screens/study/tasks/intervention/uml.svg b/docs/uml/app/lib/screens/study/tasks/intervention/uml.svg deleted file mode 100644 index e9e196b72..000000000 --- a/docs/uml/app/lib/screens/study/tasks/intervention/uml.svg +++ /dev/null @@ -1,72 +0,0 @@ - - [CheckmarkTaskWidget - | - +task: CheckmarkTask?; - +completionPeriod: CompletionPeriod? - ] - - [CheckmarkTaskWidget]o-[CheckmarkTask] - [CheckmarkTaskWidget]o-[CompletionPeriod] - - - - - - - - - - - - - - - - - - - - - - - - - CheckmarkTaskWidget - - - - - - +task: CheckmarkTask? - +completionPeriod: CompletionPeriod? - - - - - - - - - - - CheckmarkTask - - - - - - - - - - - CompletionPeriod - - - - - - - - - \ No newline at end of file diff --git a/docs/uml/app/lib/screens/study/tasks/observation/uml.svg b/docs/uml/app/lib/screens/study/tasks/observation/uml.svg deleted file mode 100644 index 6e6f81627..000000000 --- a/docs/uml/app/lib/screens/study/tasks/observation/uml.svg +++ /dev/null @@ -1,72 +0,0 @@ - - [QuestionnaireTaskWidget - | - +task: QuestionnaireTask; - +completionPeriod: CompletionPeriod - ] - - [QuestionnaireTaskWidget]o-[QuestionnaireTask] - [QuestionnaireTaskWidget]o-[CompletionPeriod] - - - - - - - - - - - - - - - - - - - - - - - - - QuestionnaireTaskWidget - - - - - - +task: QuestionnaireTask - +completionPeriod: CompletionPeriod - - - - - - - - - - - QuestionnaireTask - - - - - - - - - - - CompletionPeriod - - - - - - - - - \ No newline at end of file diff --git a/docs/uml/app/lib/screens/study/tasks/uml.svg b/docs/uml/app/lib/screens/study/tasks/uml.svg deleted file mode 100644 index 49428166b..000000000 --- a/docs/uml/app/lib/screens/study/tasks/uml.svg +++ /dev/null @@ -1,168 +0,0 @@ - - [QuestionnaireTaskWidget - | - +task: QuestionnaireTask; - +completionPeriod: CompletionPeriod - ] - - [QuestionnaireTaskWidget]o-[QuestionnaireTask] - [QuestionnaireTaskWidget]o-[CompletionPeriod] - - [TaskScreen - | - +taskInstance: TaskInstance - | - <static>+MaterialPageRoute<bool> routeFor() - ] - - [TaskScreen]o-[TaskInstance] - - [CheckmarkTaskWidget - | - +task: CheckmarkTask?; - +completionPeriod: CompletionPeriod? - ] - - [CheckmarkTaskWidget]o-[CheckmarkTask] - [CheckmarkTaskWidget]o-[CompletionPeriod] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - QuestionnaireTaskWidget - - - - - - +task: QuestionnaireTask - +completionPeriod: CompletionPeriod - - - - - - - - - - - QuestionnaireTask - - - - - - - - - - - CompletionPeriod - - - - - - - - - - - - - TaskScreen - - - - - - +taskInstance: TaskInstance - - - - - - <static>+MaterialPageRoute<bool> routeFor() - - - - - - - - - - - TaskInstance - - - - - - - - - - - - CheckmarkTaskWidget - - - - - - +task: CheckmarkTask? - +completionPeriod: CompletionPeriod? - - - - - - - - - - - CheckmarkTask - - - - - - - - - \ No newline at end of file diff --git a/docs/uml/app/lib/screens/study/uml.svg b/docs/uml/app/lib/screens/study/uml.svg deleted file mode 100644 index 5476a482f..000000000 --- a/docs/uml/app/lib/screens/study/uml.svg +++ /dev/null @@ -1,2368 +0,0 @@ - - [ConsentScreen - ] - - [ConsentCard - | - +consent: ConsentItem?; - +index: int?; - +onTapped: dynamic Function(int); - +isChecked: bool? - | - +Widget build() - ] - - [ConsentCard]o-[ConsentItem] - [ConsentCard]o-[dynamic Function(int)] - - [ConsentElement - | - +title: String; - +descriptionText: String; - +acknowledgmentText: String; - +icon: IconData - ] - - [ConsentElement]o-[IconData] - - [StudyOverviewScreen - ] - - [_StudyOverviewScreen - | - +study: Study? - | - +dynamic navigateToJourney(); - +dynamic navigateToEligibilityCheck(); - +Widget build() - ] - - [_StudyOverviewScreen]o-[Study] - - [StudyDetailsView - | - +study: Study?; - +iconSize: double - | - +Widget build() - ] - - [StudyDetailsView]o-[Study] - - [KickoffScreen - ] - - [_KickoffScreen - | - +subject: StudySubject?; - +ready: bool - | - -dynamic _storeUserStudy(); - -Widget _constructStatusIcon(); - -String _getStatusText(); - +Widget build() - ] - - [_KickoffScreen]o-[StudySubject] - - [EligibilityResult - | - +eligible: bool; - +firstFailed: EligibilityCriterion? - ] - - [EligibilityResult]o-[EligibilityCriterion] - - [EligibilityScreen - | - +study: Study? - | - <static>+MaterialPageRoute<EligibilityResult> routeFor() - ] - - [EligibilityScreen]o-[Study] - - [OnboardingProgress - | - +stage: int; - +progress: double - | - -double _getProgressForStage(); - +Widget build() - ] - - [StudySelectionScreen - ] - - [InviteCodeDialog - ] - - [InterventionSelectionScreen - ] - - [JourneyOverviewScreen - ] - - [_JourneyOverviewScreen - | - +subject: StudySubject? - | - +dynamic getConsentAndNavigateToDashboard(); - +Widget build() - ] - - [_JourneyOverviewScreen]o-[StudySubject] - - [Timeline - | - +subject: StudySubject? - | - +Widget build() - ] - - [Timeline]o-[StudySubject] - - [InterventionTile - | - +title: String?; - +iconName: String; - +date: DateTime; - +color: Color?; - +isFirst: bool; - +isLast: bool - | - +Widget build() - ] - - [InterventionTile]o-[Color] - - [IconIndicator - | - +iconName: String; - +color: Color? - | - +Widget build() - ] - - [IconIndicator]o-[Color] - - [TimelineChild - | - +child: Widget? - | - +Widget build() - ] - - [TimelineChild]o-[<abstract>Widget] - - [AverageSectionWidget - | - +section: AverageSection; - +titlePos: List<int>; - +phasePos: List<int> - | - +Widget build(); - +Widget getLegend(); - +Widget getDiagram(); - +BarChartData getChartData(); - +Widget getTitles(); - +Widget getValues(); - +List<BarChartGroupData> getBarGroups(); - +FlGridData getGridData(); - +MaterialColor getColor(); - +int getDayIndex(); - +Iterable<DiagramDatum> getAggregatedData(); - +Map<String, String?> getInterventionNames() - ] - - [AverageSectionWidget]o-[AverageSection] - [<abstract>ReportSectionWidget]<:-[AverageSectionWidget] - - [DiagramDatum - | - +x: num; - +value: num; - +timestamp: DateTime?; - +intervention: String - ] - - [LinearRegressionSectionWidget - | - +section: LinearRegressionSection - | - +Widget build() - ] - - [LinearRegressionSectionWidget]o-[LinearRegressionSection] - [<abstract>ReportSectionWidget]<:-[LinearRegressionSectionWidget] - - [ReportHistoryScreen - | - +Widget build() - ] - - [ReportHistoryItem - | - +subject: StudySubject - | - +Widget build() - ] - - [ReportHistoryItem]o-[StudySubject] - - [ReportDetailsScreen - | - +subject: StudySubject - | - <static>+MaterialPageRoute<dynamic> routeFor(); - +Widget build() - ] - - [ReportDetailsScreen]o-[StudySubject] - - [GeneralDetailsSection - | - +Widget buildContent() - ] - - [<abstract>GenericSection]<:-[GeneralDetailsSection] - - [<abstract>GenericSection - | - +subject: StudySubject?; - +onTap: void Function()? - | - +Widget buildContent(); - +Widget build() - ] - - [<abstract>GenericSection]o-[StudySubject] - [<abstract>GenericSection]o-[void Function()?] - - [DisclaimerSection - | - +Widget buildContent() - ] - - [<abstract>GenericSection]<:-[DisclaimerSection] - - [<abstract>ReportSectionWidget - | - +subject: StudySubject - ] - - [<abstract>ReportSectionWidget]o-[StudySubject] - - [LegendWidget - | - +name: String; - +color: Color - | - +Widget build() - ] - - [LegendWidget]o-[Color] - - [LegendsListWidget - | - +legends: List<Legend> - | - +Widget build() - ] - - [Legend - | - +name: String; - +color: Color - ] - - [Legend]o-[Color] - - [PerformanceDetailsScreen - | - +reportSubject: StudySubject? - | - <static>+MaterialPageRoute<dynamic> routeFor(); - +Widget build() - ] - - [PerformanceDetailsScreen]o-[StudySubject] - - [InterventionPerformanceBar - | - +intervention: Intervention; - +subject: StudySubject? - | - +Widget build() - ] - - [InterventionPerformanceBar]o-[Intervention] - [InterventionPerformanceBar]o-[StudySubject] - - [ObservationPerformanceBar - | - +observation: Observation; - +subject: StudySubject? - | - +Widget build() - ] - - [ObservationPerformanceBar]o-[<abstract>Observation] - [ObservationPerformanceBar]o-[StudySubject] - - [PerformanceBar - | - +task: Task; - +completed: int; - +total: int - | - +Widget build() - ] - - [PerformanceBar]o-[<abstract>Task] - - [PerformanceSection - | - +minimumRatio: double; - +maximum: double - | - +Widget buildContent(); - +String getPowerLevelDescription(); - +int getCountableObservationAmount() - ] - - [<abstract>GenericSection]<:-[PerformanceSection] - - [PerformanceBar - | - +progress: double; - +minimum: double? - | - +Widget build() - ] - - [ReportSectionContainer - | - +section: ReportSection; - +subject: StudySubject; - +primary: bool; - +onTap: void Function()? - | - +ReportSectionWidget buildContents(); - +dynamic (); - +List<Widget> buildPrimaryHeader(); - +Widget build() - ] - - [ReportSectionContainer]o-[<abstract>ReportSection] - [ReportSectionContainer]o-[StudySubject] - [ReportSectionContainer]o-[void Function()?] - - [Settings - ] - - [OptOutAlertDialog - | - +subject: StudySubject? - | - +Widget build() - ] - - [OptOutAlertDialog]o-[StudySubject] - - [DeleteAlertDialog - | - +subject: StudySubject? - | - +Widget build() - ] - - [DeleteAlertDialog]o-[StudySubject] - - [TaskBox - | - +taskInstance: TaskInstance; - +icon: Icon; - +onCompleted: dynamic Function() - ] - - [TaskBox]o-[TaskInstance] - [TaskBox]o-[Icon] - [TaskBox]o-[dynamic Function()] - - [ProgressRow - | - +subject: StudySubject? - ] - - [ProgressRow]o-[StudySubject] - - [InterventionSegment - | - +intervention: Intervention; - +percentCompleted: double; - +percentMissed: double; - +isCurrent: bool; - +isFuture: bool; - +phaseDuration: int - | - +List<Widget> buildSeparators(); - +Widget build() - ] - - [InterventionSegment]o-[Intervention] - - [TaskOverview - | - +subject: StudySubject?; - +scheduleToday: List<TaskInstance>?; - +interventionIcon: String? - ] - - [TaskOverview]o-[StudySubject] - - [ContactScreen - ] - - [ContactWidget - | - +contact: Contact?; - +title: String; - +subtitle: String?; - +color: Color - | - +Widget build() - ] - - [ContactWidget]o-[Contact] - [ContactWidget]o-[Color] - - [ContactItem - | - +iconData: IconData; - +itemName: String; - +itemValue: String?; - +type: ContactItemType?; - +iconColor: Color? - | - +dynamic launchContact(); - +Widget build() - ] - - [ContactItem]o-[IconData] - [ContactItem]o-[ContactItemType] - [ContactItem]o-[Color] - - [ContactItemType - | - +index: int; - <static>+values: List<ContactItemType>; - <static>+website: ContactItemType; - <static>+email: ContactItemType; - <static>+phone: ContactItemType - ] - - [ContactItemType]o-[ContactItemType] - [Enum]<:--[ContactItemType] - - [FAQ - | - +Widget build() - ] - - [Entry - | - +title: String; - +children: List<Entry> - ] - - [EntryItem - | - +entry: Entry - | - -Widget _buildTiles(); - +Widget build() - ] - - [EntryItem]o-[Entry] - - [DashboardScreen - | - +error: String? - ] - - [OverflowMenuItem - | - +name: String; - +icon: IconData; - +routeName: String?; - +onTap: dynamic Function()? - ] - - [OverflowMenuItem]o-[IconData] - [OverflowMenuItem]o-[dynamic Function()?] - - [StudyFinishedPlaceholder - | - <static>+space: SizedBox - | - +Widget build() - ] - - [StudyFinishedPlaceholder]o-[SizedBox] - - [QuestionnaireTaskWidget - | - +task: QuestionnaireTask; - +completionPeriod: CompletionPeriod - ] - - [QuestionnaireTaskWidget]o-[QuestionnaireTask] - [QuestionnaireTaskWidget]o-[CompletionPeriod] - - [TaskScreen - | - +taskInstance: TaskInstance - | - <static>+MaterialPageRoute<bool> routeFor() - ] - - [TaskScreen]o-[TaskInstance] - - [CheckmarkTaskWidget - | - +task: CheckmarkTask?; - +completionPeriod: CompletionPeriod? - ] - - [CheckmarkTaskWidget]o-[CheckmarkTask] - [CheckmarkTaskWidget]o-[CompletionPeriod] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ConsentScreen - - - - - - - - - - - - - ConsentCard - - - - - - +consent: ConsentItem? - +index: int? - +onTapped: dynamic Function(int) - +isChecked: bool? - - - - - - +Widget build() - - - - - - - - - - - ConsentItem - - - - - - - - - - - dynamic Function(int) - - - - - - - - - - - - ConsentElement - - - - - - +title: String - +descriptionText: String - +acknowledgmentText: String - +icon: IconData - - - - - - - - - - - IconData - - - - - - - - - - - StudyOverviewScreen - - - - - - - - - - - - - _StudyOverviewScreen - - - - - - +study: Study? - - - - - - +dynamic navigateToJourney() - +dynamic navigateToEligibilityCheck() - +Widget build() - - - - - - - - - - - Study - - - - - - - - - - - - - StudyDetailsView - - - - - - +study: Study? - +iconSize: double - - - - - - +Widget build() - - - - - - - - - - - KickoffScreen - - - - - - - - - - - - - _KickoffScreen - - - - - - +subject: StudySubject? - +ready: bool - - - - - - -dynamic _storeUserStudy() - -Widget _constructStatusIcon() - -String _getStatusText() - +Widget build() - - - - - - - - - - - StudySubject - - - - - - - - - - - - EligibilityResult - - - - - - +eligible: bool - +firstFailed: EligibilityCriterion? - - - - - - - - - - - EligibilityCriterion - - - - - - - - - - - - - EligibilityScreen - - - - - - +study: Study? - - - - - - <static>+MaterialPageRoute<EligibilityResult> routeFor() - - - - - - - - - - - - - OnboardingProgress - - - - - - +stage: int - +progress: double - - - - - - -double _getProgressForStage() - +Widget build() - - - - - - - - - - - StudySelectionScreen - - - - - - - - - - - InviteCodeDialog - - - - - - - - - - - InterventionSelectionScreen - - - - - - - - - - - JourneyOverviewScreen - - - - - - - - - - - - - _JourneyOverviewScreen - - - - - - +subject: StudySubject? - - - - - - +dynamic getConsentAndNavigateToDashboard() - +Widget build() - - - - - - - - - - - - - Timeline - - - - - - +subject: StudySubject? - - - - - - +Widget build() - - - - - - - - - - - - - InterventionTile - - - - - - +title: String? - +iconName: String - +date: DateTime - +color: Color? - +isFirst: bool - +isLast: bool - - - - - - +Widget build() - - - - - - - - - - - Color - - - - - - - - - - - - - IconIndicator - - - - - - +iconName: String - +color: Color? - - - - - - +Widget build() - - - - - - - - - - - - - TimelineChild - - - - - - +child: Widget? - - - - - - +Widget build() - - - - - - - - - - - Widget - - - - - - - - - - - - - AverageSectionWidget - - - - - - +section: AverageSection - +titlePos: List<int> - +phasePos: List<int> - - - - - - +Widget build() - +Widget getLegend() - +Widget getDiagram() - +BarChartData getChartData() - +Widget getTitles() - +Widget getValues() - +List<BarChartGroupData> getBarGroups() - +FlGridData getGridData() - +MaterialColor getColor() - +int getDayIndex() - +Iterable<DiagramDatum> getAggregatedData() - +Map<String, String?> getInterventionNames() - - - - - - - - - - - AverageSection - - - - - - - - - - - - ReportSectionWidget - - - - - - +subject: StudySubject - - - - - - - - - - - - DiagramDatum - - - - - - +x: num - +value: num - +timestamp: DateTime? - +intervention: String - - - - - - - - - - - - - LinearRegressionSectionWidget - - - - - - +section: LinearRegressionSection - - - - - - +Widget build() - - - - - - - - - - - LinearRegressionSection - - - - - - - - - - - - ReportHistoryScreen - - - - - - +Widget build() - - - - - - - - - - - - - ReportHistoryItem - - - - - - +subject: StudySubject - - - - - - +Widget build() - - - - - - - - - - - - - ReportDetailsScreen - - - - - - +subject: StudySubject - - - - - - <static>+MaterialPageRoute<dynamic> routeFor() - +Widget build() - - - - - - - - - - - - GeneralDetailsSection - - - - - - +Widget buildContent() - - - - - - - - - - - - - GenericSection - - - - - - +subject: StudySubject? - +onTap: void Function()? - - - - - - +Widget buildContent() - +Widget build() - - - - - - - - - - - void Function()? - - - - - - - - - - - - DisclaimerSection - - - - - - +Widget buildContent() - - - - - - - - - - - - - LegendWidget - - - - - - +name: String - +color: Color - - - - - - +Widget build() - - - - - - - - - - - - - LegendsListWidget - - - - - - +legends: List<Legend> - - - - - - +Widget build() - - - - - - - - - - - - Legend - - - - - - +name: String - +color: Color - - - - - - - - - - - - - PerformanceDetailsScreen - - - - - - +reportSubject: StudySubject? - - - - - - <static>+MaterialPageRoute<dynamic> routeFor() - +Widget build() - - - - - - - - - - - - - InterventionPerformanceBar - - - - - - +intervention: Intervention - +subject: StudySubject? - - - - - - +Widget build() - - - - - - - - - - - Intervention - - - - - - - - - - - - - ObservationPerformanceBar - - - - - - +observation: Observation - +subject: StudySubject? - - - - - - +Widget build() - - - - - - - - - - - Observation - - - - - - - - - - - - - PerformanceBar - - - - - - +task: Task - +completed: int - +total: int - - - - - - +Widget build() - - - - - - - - - - - Task - - - - - - - - - - - - - PerformanceSection - - - - - - +minimumRatio: double - +maximum: double - - - - - - +Widget buildContent() - +String getPowerLevelDescription() - +int getCountableObservationAmount() - - - - - - - - - - - - - ReportSectionContainer - - - - - - +section: ReportSection - +subject: StudySubject - +primary: bool - +onTap: void Function()? - - - - - - +ReportSectionWidget buildContents() - +dynamic () - +List<Widget> buildPrimaryHeader() - +Widget build() - - - - - - - - - - - ReportSection - - - - - - - - - - - Settings - - - - - - - - - - - - - OptOutAlertDialog - - - - - - +subject: StudySubject? - - - - - - +Widget build() - - - - - - - - - - - - - DeleteAlertDialog - - - - - - +subject: StudySubject? - - - - - - +Widget build() - - - - - - - - - - - - TaskBox - - - - - - +taskInstance: TaskInstance - +icon: Icon - +onCompleted: dynamic Function() - - - - - - - - - - - TaskInstance - - - - - - - - - - - Icon - - - - - - - - - - - dynamic Function() - - - - - - - - - - - - ProgressRow - - - - - - +subject: StudySubject? - - - - - - - - - - - - - InterventionSegment - - - - - - +intervention: Intervention - +percentCompleted: double - +percentMissed: double - +isCurrent: bool - +isFuture: bool - +phaseDuration: int - - - - - - +List<Widget> buildSeparators() - +Widget build() - - - - - - - - - - - - TaskOverview - - - - - - +subject: StudySubject? - +scheduleToday: List<TaskInstance>? - +interventionIcon: String? - - - - - - - - - - - ContactScreen - - - - - - - - - - - - - ContactWidget - - - - - - +contact: Contact? - +title: String - +subtitle: String? - +color: Color - - - - - - +Widget build() - - - - - - - - - - - Contact - - - - - - - - - - - - - ContactItem - - - - - - +iconData: IconData - +itemName: String - +itemValue: String? - +type: ContactItemType? - +iconColor: Color? - - - - - - +dynamic launchContact() - +Widget build() - - - - - - - - - - - - ContactItemType - - - - - - +index: int - <static>+values: List<ContactItemType> - <static>+website: ContactItemType - <static>+email: ContactItemType - <static>+phone: ContactItemType - - - - - - - - - - - Enum - - - - - - - - - - - - FAQ - - - - - - +Widget build() - - - - - - - - - - - - Entry - - - - - - +title: String - +children: List<Entry> - - - - - - - - - - - - - EntryItem - - - - - - +entry: Entry - - - - - - -Widget _buildTiles() - +Widget build() - - - - - - - - - - - - DashboardScreen - - - - - - +error: String? - - - - - - - - - - - - OverflowMenuItem - - - - - - +name: String - +icon: IconData - +routeName: String? - +onTap: dynamic Function()? - - - - - - - - - - - dynamic Function()? - - - - - - - - - - - - - StudyFinishedPlaceholder - - - - - - <static>+space: SizedBox - - - - - - +Widget build() - - - - - - - - - - - SizedBox - - - - - - - - - - - - QuestionnaireTaskWidget - - - - - - +task: QuestionnaireTask - +completionPeriod: CompletionPeriod - - - - - - - - - - - QuestionnaireTask - - - - - - - - - - - CompletionPeriod - - - - - - - - - - - - - TaskScreen - - - - - - +taskInstance: TaskInstance - - - - - - <static>+MaterialPageRoute<bool> routeFor() - - - - - - - - - - - - CheckmarkTaskWidget - - - - - - +task: CheckmarkTask? - +completionPeriod: CompletionPeriod? - - - - - - - - - - - CheckmarkTask - - - - - - - - - \ No newline at end of file diff --git a/docs/uml/app/lib/screens/uml.svg b/docs/uml/app/lib/screens/uml.svg deleted file mode 100644 index 7e5967908..000000000 --- a/docs/uml/app/lib/screens/uml.svg +++ /dev/null @@ -1,2660 +0,0 @@ - - [ConsentScreen - ] - - [ConsentCard - | - +consent: ConsentItem?; - +index: int?; - +onTapped: dynamic Function(int); - +isChecked: bool? - | - +Widget build() - ] - - [ConsentCard]o-[ConsentItem] - [ConsentCard]o-[dynamic Function(int)] - - [ConsentElement - | - +title: String; - +descriptionText: String; - +acknowledgmentText: String; - +icon: IconData - ] - - [ConsentElement]o-[IconData] - - [StudyOverviewScreen - ] - - [_StudyOverviewScreen - | - +study: Study? - | - +dynamic navigateToJourney(); - +dynamic navigateToEligibilityCheck(); - +Widget build() - ] - - [_StudyOverviewScreen]o-[Study] - - [StudyDetailsView - | - +study: Study?; - +iconSize: double - | - +Widget build() - ] - - [StudyDetailsView]o-[Study] - - [KickoffScreen - ] - - [_KickoffScreen - | - +subject: StudySubject?; - +ready: bool - | - -dynamic _storeUserStudy(); - -Widget _constructStatusIcon(); - -String _getStatusText(); - +Widget build() - ] - - [_KickoffScreen]o-[StudySubject] - - [EligibilityResult - | - +eligible: bool; - +firstFailed: EligibilityCriterion? - ] - - [EligibilityResult]o-[EligibilityCriterion] - - [EligibilityScreen - | - +study: Study? - | - <static>+MaterialPageRoute<EligibilityResult> routeFor() - ] - - [EligibilityScreen]o-[Study] - - [OnboardingProgress - | - +stage: int; - +progress: double - | - -double _getProgressForStage(); - +Widget build() - ] - - [StudySelectionScreen - ] - - [InviteCodeDialog - ] - - [InterventionSelectionScreen - ] - - [JourneyOverviewScreen - ] - - [_JourneyOverviewScreen - | - +subject: StudySubject? - | - +dynamic getConsentAndNavigateToDashboard(); - +Widget build() - ] - - [_JourneyOverviewScreen]o-[StudySubject] - - [Timeline - | - +subject: StudySubject? - | - +Widget build() - ] - - [Timeline]o-[StudySubject] - - [InterventionTile - | - +title: String?; - +iconName: String; - +date: DateTime; - +color: Color?; - +isFirst: bool; - +isLast: bool - | - +Widget build() - ] - - [InterventionTile]o-[Color] - - [IconIndicator - | - +iconName: String; - +color: Color? - | - +Widget build() - ] - - [IconIndicator]o-[Color] - - [TimelineChild - | - +child: Widget? - | - +Widget build() - ] - - [TimelineChild]o-[<abstract>Widget] - - [AverageSectionWidget - | - +section: AverageSection; - +titlePos: List<int>; - +phasePos: List<int> - | - +Widget build(); - +Widget getLegend(); - +Widget getDiagram(); - +BarChartData getChartData(); - +Widget getTitles(); - +Widget getValues(); - +List<BarChartGroupData> getBarGroups(); - +FlGridData getGridData(); - +MaterialColor getColor(); - +int getDayIndex(); - +Iterable<DiagramDatum> getAggregatedData(); - +Map<String, String?> getInterventionNames() - ] - - [AverageSectionWidget]o-[AverageSection] - [<abstract>ReportSectionWidget]<:-[AverageSectionWidget] - - [DiagramDatum - | - +x: num; - +value: num; - +timestamp: DateTime?; - +intervention: String - ] - - [LinearRegressionSectionWidget - | - +section: LinearRegressionSection - | - +Widget build() - ] - - [LinearRegressionSectionWidget]o-[LinearRegressionSection] - [<abstract>ReportSectionWidget]<:-[LinearRegressionSectionWidget] - - [ReportHistoryScreen - | - +Widget build() - ] - - [ReportHistoryItem - | - +subject: StudySubject - | - +Widget build() - ] - - [ReportHistoryItem]o-[StudySubject] - - [ReportDetailsScreen - | - +subject: StudySubject - | - <static>+MaterialPageRoute<dynamic> routeFor(); - +Widget build() - ] - - [ReportDetailsScreen]o-[StudySubject] - - [GeneralDetailsSection - | - +Widget buildContent() - ] - - [<abstract>GenericSection]<:-[GeneralDetailsSection] - - [<abstract>GenericSection - | - +subject: StudySubject?; - +onTap: void Function()? - | - +Widget buildContent(); - +Widget build() - ] - - [<abstract>GenericSection]o-[StudySubject] - [<abstract>GenericSection]o-[void Function()?] - - [DisclaimerSection - | - +Widget buildContent() - ] - - [<abstract>GenericSection]<:-[DisclaimerSection] - - [<abstract>ReportSectionWidget - | - +subject: StudySubject - ] - - [<abstract>ReportSectionWidget]o-[StudySubject] - - [LegendWidget - | - +name: String; - +color: Color - | - +Widget build() - ] - - [LegendWidget]o-[Color] - - [LegendsListWidget - | - +legends: List<Legend> - | - +Widget build() - ] - - [Legend - | - +name: String; - +color: Color - ] - - [Legend]o-[Color] - - [PerformanceDetailsScreen - | - +reportSubject: StudySubject? - | - <static>+MaterialPageRoute<dynamic> routeFor(); - +Widget build() - ] - - [PerformanceDetailsScreen]o-[StudySubject] - - [InterventionPerformanceBar - | - +intervention: Intervention; - +subject: StudySubject? - | - +Widget build() - ] - - [InterventionPerformanceBar]o-[Intervention] - [InterventionPerformanceBar]o-[StudySubject] - - [ObservationPerformanceBar - | - +observation: Observation; - +subject: StudySubject? - | - +Widget build() - ] - - [ObservationPerformanceBar]o-[<abstract>Observation] - [ObservationPerformanceBar]o-[StudySubject] - - [PerformanceBar - | - +task: Task; - +completed: int; - +total: int - | - +Widget build() - ] - - [PerformanceBar]o-[<abstract>Task] - - [PerformanceSection - | - +minimumRatio: double; - +maximum: double - | - +Widget buildContent(); - +String getPowerLevelDescription(); - +int getCountableObservationAmount() - ] - - [<abstract>GenericSection]<:-[PerformanceSection] - - [PerformanceBar - | - +progress: double; - +minimum: double? - | - +Widget build() - ] - - [ReportSectionContainer - | - +section: ReportSection; - +subject: StudySubject; - +primary: bool; - +onTap: void Function()? - | - +ReportSectionWidget buildContents(); - +dynamic (); - +List<Widget> buildPrimaryHeader(); - +Widget build() - ] - - [ReportSectionContainer]o-[<abstract>ReportSection] - [ReportSectionContainer]o-[StudySubject] - [ReportSectionContainer]o-[void Function()?] - - [Settings - ] - - [OptOutAlertDialog - | - +subject: StudySubject? - | - +Widget build() - ] - - [OptOutAlertDialog]o-[StudySubject] - - [DeleteAlertDialog - | - +subject: StudySubject? - | - +Widget build() - ] - - [DeleteAlertDialog]o-[StudySubject] - - [TaskBox - | - +taskInstance: TaskInstance; - +icon: Icon; - +onCompleted: dynamic Function() - ] - - [TaskBox]o-[TaskInstance] - [TaskBox]o-[Icon] - [TaskBox]o-[dynamic Function()] - - [ProgressRow - | - +subject: StudySubject? - ] - - [ProgressRow]o-[StudySubject] - - [InterventionSegment - | - +intervention: Intervention; - +percentCompleted: double; - +percentMissed: double; - +isCurrent: bool; - +isFuture: bool; - +phaseDuration: int - | - +List<Widget> buildSeparators(); - +Widget build() - ] - - [InterventionSegment]o-[Intervention] - - [TaskOverview - | - +subject: StudySubject?; - +scheduleToday: List<TaskInstance>?; - +interventionIcon: String? - ] - - [TaskOverview]o-[StudySubject] - - [ContactScreen - ] - - [ContactWidget - | - +contact: Contact?; - +title: String; - +subtitle: String?; - +color: Color - | - +Widget build() - ] - - [ContactWidget]o-[Contact] - [ContactWidget]o-[Color] - - [ContactItem - | - +iconData: IconData; - +itemName: String; - +itemValue: String?; - +type: ContactItemType?; - +iconColor: Color? - | - +dynamic launchContact(); - +Widget build() - ] - - [ContactItem]o-[IconData] - [ContactItem]o-[ContactItemType] - [ContactItem]o-[Color] - - [ContactItemType - | - +index: int; - <static>+values: List<ContactItemType>; - <static>+website: ContactItemType; - <static>+email: ContactItemType; - <static>+phone: ContactItemType - ] - - [ContactItemType]o-[ContactItemType] - [Enum]<:--[ContactItemType] - - [FAQ - | - +Widget build() - ] - - [Entry - | - +title: String; - +children: List<Entry> - ] - - [EntryItem - | - +entry: Entry - | - -Widget _buildTiles(); - +Widget build() - ] - - [EntryItem]o-[Entry] - - [DashboardScreen - | - +error: String? - ] - - [OverflowMenuItem - | - +name: String; - +icon: IconData; - +routeName: String?; - +onTap: dynamic Function()? - ] - - [OverflowMenuItem]o-[IconData] - [OverflowMenuItem]o-[dynamic Function()?] - - [StudyFinishedPlaceholder - | - <static>+space: SizedBox - | - +Widget build() - ] - - [StudyFinishedPlaceholder]o-[SizedBox] - - [QuestionnaireTaskWidget - | - +task: QuestionnaireTask; - +completionPeriod: CompletionPeriod - ] - - [QuestionnaireTaskWidget]o-[QuestionnaireTask] - [QuestionnaireTaskWidget]o-[CompletionPeriod] - - [TaskScreen - | - +taskInstance: TaskInstance - | - <static>+MaterialPageRoute<bool> routeFor() - ] - - [TaskScreen]o-[TaskInstance] - - [CheckmarkTaskWidget - | - +task: CheckmarkTask?; - +completionPeriod: CompletionPeriod? - ] - - [CheckmarkTaskWidget]o-[CheckmarkTask] - [CheckmarkTaskWidget]o-[CompletionPeriod] - - [AppOutdatedScreen - | - +Widget build() - ] - - [TermsScreen - ] - - [LegalSection - | - +title: String?; - +description: String?; - +icon: Icon?; - +pdfUrl: String?; - +pdfUrlLabel: String?; - +acknowledgment: String?; - +isChecked: bool?; - +onChange: void Function(bool?)? - | - +Widget build() - ] - - [LegalSection]o-[Icon] - [LegalSection]o-[void Function(bool?)?] - - [IFrameHelper - | - +void postRouteFinished(); - +void listen() - ] - - [LoadingScreen - | - +sessionString: String?; - +queryParameters: Map<String, String>? - ] - - [AboutScreen - | - +Widget build() - ] - - [Preview - | - +queryParameters: Map<String, String>?; - +appLanguage: AppLanguage; - +selectedRoute: String?; - +extra: String?; - +study: Study?; - +selectedStudyObjectId: String?; - +subject: StudySubject? - | - +bool hasRoute(); - +void handleQueries(); - +dynamic init(); - +dynamic handleAuthorization(); - +dynamic runCommands(); - +String? getSelectedRoute(); - +bool containsQuery(); - +bool containsQueryPair(); - +dynamic getStudySubject(); - -dynamic _createFakeSubject(); - +List<String> getInterventionIds() - ] - - [Preview]o-[AppLanguage] - [Preview]o-[Study] - [Preview]o-[StudySubject] - - [WelcomeScreen - | - +Widget build() - ] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ConsentScreen - - - - - - - - - - - - - ConsentCard - - - - - - +consent: ConsentItem? - +index: int? - +onTapped: dynamic Function(int) - +isChecked: bool? - - - - - - +Widget build() - - - - - - - - - - - ConsentItem - - - - - - - - - - - dynamic Function(int) - - - - - - - - - - - - ConsentElement - - - - - - +title: String - +descriptionText: String - +acknowledgmentText: String - +icon: IconData - - - - - - - - - - - IconData - - - - - - - - - - - StudyOverviewScreen - - - - - - - - - - - - - _StudyOverviewScreen - - - - - - +study: Study? - - - - - - +dynamic navigateToJourney() - +dynamic navigateToEligibilityCheck() - +Widget build() - - - - - - - - - - - Study - - - - - - - - - - - - - StudyDetailsView - - - - - - +study: Study? - +iconSize: double - - - - - - +Widget build() - - - - - - - - - - - KickoffScreen - - - - - - - - - - - - - _KickoffScreen - - - - - - +subject: StudySubject? - +ready: bool - - - - - - -dynamic _storeUserStudy() - -Widget _constructStatusIcon() - -String _getStatusText() - +Widget build() - - - - - - - - - - - StudySubject - - - - - - - - - - - - EligibilityResult - - - - - - +eligible: bool - +firstFailed: EligibilityCriterion? - - - - - - - - - - - EligibilityCriterion - - - - - - - - - - - - - EligibilityScreen - - - - - - +study: Study? - - - - - - <static>+MaterialPageRoute<EligibilityResult> routeFor() - - - - - - - - - - - - - OnboardingProgress - - - - - - +stage: int - +progress: double - - - - - - -double _getProgressForStage() - +Widget build() - - - - - - - - - - - StudySelectionScreen - - - - - - - - - - - InviteCodeDialog - - - - - - - - - - - InterventionSelectionScreen - - - - - - - - - - - JourneyOverviewScreen - - - - - - - - - - - - - _JourneyOverviewScreen - - - - - - +subject: StudySubject? - - - - - - +dynamic getConsentAndNavigateToDashboard() - +Widget build() - - - - - - - - - - - - - Timeline - - - - - - +subject: StudySubject? - - - - - - +Widget build() - - - - - - - - - - - - - InterventionTile - - - - - - +title: String? - +iconName: String - +date: DateTime - +color: Color? - +isFirst: bool - +isLast: bool - - - - - - +Widget build() - - - - - - - - - - - Color - - - - - - - - - - - - - IconIndicator - - - - - - +iconName: String - +color: Color? - - - - - - +Widget build() - - - - - - - - - - - - - TimelineChild - - - - - - +child: Widget? - - - - - - +Widget build() - - - - - - - - - - - Widget - - - - - - - - - - - - - AverageSectionWidget - - - - - - +section: AverageSection - +titlePos: List<int> - +phasePos: List<int> - - - - - - +Widget build() - +Widget getLegend() - +Widget getDiagram() - +BarChartData getChartData() - +Widget getTitles() - +Widget getValues() - +List<BarChartGroupData> getBarGroups() - +FlGridData getGridData() - +MaterialColor getColor() - +int getDayIndex() - +Iterable<DiagramDatum> getAggregatedData() - +Map<String, String?> getInterventionNames() - - - - - - - - - - - AverageSection - - - - - - - - - - - - ReportSectionWidget - - - - - - +subject: StudySubject - - - - - - - - - - - - DiagramDatum - - - - - - +x: num - +value: num - +timestamp: DateTime? - +intervention: String - - - - - - - - - - - - - LinearRegressionSectionWidget - - - - - - +section: LinearRegressionSection - - - - - - +Widget build() - - - - - - - - - - - LinearRegressionSection - - - - - - - - - - - - ReportHistoryScreen - - - - - - +Widget build() - - - - - - - - - - - - - ReportHistoryItem - - - - - - +subject: StudySubject - - - - - - +Widget build() - - - - - - - - - - - - - ReportDetailsScreen - - - - - - +subject: StudySubject - - - - - - <static>+MaterialPageRoute<dynamic> routeFor() - +Widget build() - - - - - - - - - - - - GeneralDetailsSection - - - - - - +Widget buildContent() - - - - - - - - - - - - - GenericSection - - - - - - +subject: StudySubject? - +onTap: void Function()? - - - - - - +Widget buildContent() - +Widget build() - - - - - - - - - - - void Function()? - - - - - - - - - - - - DisclaimerSection - - - - - - +Widget buildContent() - - - - - - - - - - - - - LegendWidget - - - - - - +name: String - +color: Color - - - - - - +Widget build() - - - - - - - - - - - - - LegendsListWidget - - - - - - +legends: List<Legend> - - - - - - +Widget build() - - - - - - - - - - - - Legend - - - - - - +name: String - +color: Color - - - - - - - - - - - - - PerformanceDetailsScreen - - - - - - +reportSubject: StudySubject? - - - - - - <static>+MaterialPageRoute<dynamic> routeFor() - +Widget build() - - - - - - - - - - - - - InterventionPerformanceBar - - - - - - +intervention: Intervention - +subject: StudySubject? - - - - - - +Widget build() - - - - - - - - - - - Intervention - - - - - - - - - - - - - ObservationPerformanceBar - - - - - - +observation: Observation - +subject: StudySubject? - - - - - - +Widget build() - - - - - - - - - - - Observation - - - - - - - - - - - - - PerformanceBar - - - - - - +task: Task - +completed: int - +total: int - - - - - - +Widget build() - - - - - - - - - - - Task - - - - - - - - - - - - - PerformanceSection - - - - - - +minimumRatio: double - +maximum: double - - - - - - +Widget buildContent() - +String getPowerLevelDescription() - +int getCountableObservationAmount() - - - - - - - - - - - - - ReportSectionContainer - - - - - - +section: ReportSection - +subject: StudySubject - +primary: bool - +onTap: void Function()? - - - - - - +ReportSectionWidget buildContents() - +dynamic () - +List<Widget> buildPrimaryHeader() - +Widget build() - - - - - - - - - - - ReportSection - - - - - - - - - - - Settings - - - - - - - - - - - - - OptOutAlertDialog - - - - - - +subject: StudySubject? - - - - - - +Widget build() - - - - - - - - - - - - - DeleteAlertDialog - - - - - - +subject: StudySubject? - - - - - - +Widget build() - - - - - - - - - - - - TaskBox - - - - - - +taskInstance: TaskInstance - +icon: Icon - +onCompleted: dynamic Function() - - - - - - - - - - - TaskInstance - - - - - - - - - - - Icon - - - - - - - - - - - dynamic Function() - - - - - - - - - - - - ProgressRow - - - - - - +subject: StudySubject? - - - - - - - - - - - - - InterventionSegment - - - - - - +intervention: Intervention - +percentCompleted: double - +percentMissed: double - +isCurrent: bool - +isFuture: bool - +phaseDuration: int - - - - - - +List<Widget> buildSeparators() - +Widget build() - - - - - - - - - - - - TaskOverview - - - - - - +subject: StudySubject? - +scheduleToday: List<TaskInstance>? - +interventionIcon: String? - - - - - - - - - - - ContactScreen - - - - - - - - - - - - - ContactWidget - - - - - - +contact: Contact? - +title: String - +subtitle: String? - +color: Color - - - - - - +Widget build() - - - - - - - - - - - Contact - - - - - - - - - - - - - ContactItem - - - - - - +iconData: IconData - +itemName: String - +itemValue: String? - +type: ContactItemType? - +iconColor: Color? - - - - - - +dynamic launchContact() - +Widget build() - - - - - - - - - - - - ContactItemType - - - - - - +index: int - <static>+values: List<ContactItemType> - <static>+website: ContactItemType - <static>+email: ContactItemType - <static>+phone: ContactItemType - - - - - - - - - - - Enum - - - - - - - - - - - - FAQ - - - - - - +Widget build() - - - - - - - - - - - - Entry - - - - - - +title: String - +children: List<Entry> - - - - - - - - - - - - - EntryItem - - - - - - +entry: Entry - - - - - - -Widget _buildTiles() - +Widget build() - - - - - - - - - - - - DashboardScreen - - - - - - +error: String? - - - - - - - - - - - - OverflowMenuItem - - - - - - +name: String - +icon: IconData - +routeName: String? - +onTap: dynamic Function()? - - - - - - - - - - - dynamic Function()? - - - - - - - - - - - - - StudyFinishedPlaceholder - - - - - - <static>+space: SizedBox - - - - - - +Widget build() - - - - - - - - - - - SizedBox - - - - - - - - - - - - QuestionnaireTaskWidget - - - - - - +task: QuestionnaireTask - +completionPeriod: CompletionPeriod - - - - - - - - - - - QuestionnaireTask - - - - - - - - - - - CompletionPeriod - - - - - - - - - - - - - TaskScreen - - - - - - +taskInstance: TaskInstance - - - - - - <static>+MaterialPageRoute<bool> routeFor() - - - - - - - - - - - - CheckmarkTaskWidget - - - - - - +task: CheckmarkTask? - +completionPeriod: CompletionPeriod? - - - - - - - - - - - CheckmarkTask - - - - - - - - - - - - AppOutdatedScreen - - - - - - +Widget build() - - - - - - - - - - - TermsScreen - - - - - - - - - - - - - LegalSection - - - - - - +title: String? - +description: String? - +icon: Icon? - +pdfUrl: String? - +pdfUrlLabel: String? - +acknowledgment: String? - +isChecked: bool? - +onChange: void Function(bool?)? - - - - - - +Widget build() - - - - - - - - - - - void Function(bool?)? - - - - - - - - - - - - IFrameHelper - - - - - - +void postRouteFinished() - +void listen() - - - - - - - - - - - - LoadingScreen - - - - - - +sessionString: String? - +queryParameters: Map<String, String>? - - - - - - - - - - - - AboutScreen - - - - - - +Widget build() - - - - - - - - - - - - - Preview - - - - - - +queryParameters: Map<String, String>? - +appLanguage: AppLanguage - +selectedRoute: String? - +extra: String? - +study: Study? - +selectedStudyObjectId: String? - +subject: StudySubject? - - - - - - +bool hasRoute() - +void handleQueries() - +dynamic init() - +dynamic handleAuthorization() - +dynamic runCommands() - +String? getSelectedRoute() - +bool containsQuery() - +bool containsQueryPair() - +dynamic getStudySubject() - -dynamic _createFakeSubject() - +List<String> getInterventionIds() - - - - - - - - - - - AppLanguage - - - - - - - - - - - - WelcomeScreen - - - - - - +Widget build() - - - - - - - - - \ No newline at end of file diff --git a/docs/uml/app/lib/widgets/questionnaire/questions/uml.svg b/docs/uml/app/lib/widgets/questionnaire/questions/uml.svg deleted file mode 100644 index abe98c1f5..000000000 --- a/docs/uml/app/lib/widgets/questionnaire/questions/uml.svg +++ /dev/null @@ -1,363 +0,0 @@ - - [ChoiceQuestionWidget - | - +question: ChoiceQuestion; - +onDone: dynamic Function(Answer<dynamic>); - +multiSelectionText: String; - +subtitle: String? - ] - - [ChoiceQuestionWidget]o-[ChoiceQuestion] - [ChoiceQuestionWidget]o-[dynamic Function(Answer<dynamic>)] - [<abstract>QuestionWidget]<:-[ChoiceQuestionWidget] - - [<abstract>QuestionWidget - | - +subtitle: String? - ] - - [AnnotatedScaleQuestionWidget - | - +question: AnnotatedScaleQuestion; - +onDone: dynamic Function(Answer<dynamic>)? - ] - - [AnnotatedScaleQuestionWidget]o-[AnnotatedScaleQuestion] - [AnnotatedScaleQuestionWidget]o-[dynamic Function(Answer<dynamic>)?] - [<abstract>QuestionWidget]<:-[AnnotatedScaleQuestionWidget] - - [BooleanQuestionWidget - | - +question: BooleanQuestion; - +onDone: dynamic Function(Answer<dynamic>)? - ] - - [BooleanQuestionWidget]o-[BooleanQuestion] - [BooleanQuestionWidget]o-[dynamic Function(Answer<dynamic>)?] - [<abstract>QuestionWidget]<:-[BooleanQuestionWidget] - - [FreeTextQuestionWidget - | - +question: FreeTextQuestion; - +onDone: dynamic Function(Answer<dynamic>)? - ] - - [FreeTextQuestionWidget]o-[FreeTextQuestion] - [FreeTextQuestionWidget]o-[dynamic Function(Answer<dynamic>)?] - [<abstract>QuestionWidget]<:-[FreeTextQuestionWidget] - - [ScaleQuestionWidget - | - +question: ScaleQuestion; - +onDone: dynamic Function(Answer<dynamic>)? - ] - - [ScaleQuestionWidget]o-[ScaleQuestion] - [ScaleQuestionWidget]o-[dynamic Function(Answer<dynamic>)?] - [<abstract>QuestionWidget]<:-[ScaleQuestionWidget] - - [VisualAnalogueQuestionWidget - | - +question: VisualAnalogueQuestion; - +onDone: dynamic Function(Answer<dynamic>)? - ] - - [VisualAnalogueQuestionWidget]o-[VisualAnalogueQuestion] - [VisualAnalogueQuestionWidget]o-[dynamic Function(Answer<dynamic>)?] - [<abstract>QuestionWidget]<:-[VisualAnalogueQuestionWidget] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ChoiceQuestionWidget - - - - - - +question: ChoiceQuestion - +onDone: dynamic Function(Answer<dynamic>) - +multiSelectionText: String - +subtitle: String? - - - - - - - - - - - ChoiceQuestion - - - - - - - - - - - dynamic Function(Answer<dynamic>) - - - - - - - - - - - - QuestionWidget - - - - - - +subtitle: String? - - - - - - - - - - - - AnnotatedScaleQuestionWidget - - - - - - +question: AnnotatedScaleQuestion - +onDone: dynamic Function(Answer<dynamic>)? - - - - - - - - - - - AnnotatedScaleQuestion - - - - - - - - - - - dynamic Function(Answer<dynamic>)? - - - - - - - - - - - - BooleanQuestionWidget - - - - - - +question: BooleanQuestion - +onDone: dynamic Function(Answer<dynamic>)? - - - - - - - - - - - BooleanQuestion - - - - - - - - - - - - FreeTextQuestionWidget - - - - - - +question: FreeTextQuestion - +onDone: dynamic Function(Answer<dynamic>)? - - - - - - - - - - - FreeTextQuestion - - - - - - - - - - - - ScaleQuestionWidget - - - - - - +question: ScaleQuestion - +onDone: dynamic Function(Answer<dynamic>)? - - - - - - - - - - - ScaleQuestion - - - - - - - - - - - - VisualAnalogueQuestionWidget - - - - - - +question: VisualAnalogueQuestion - +onDone: dynamic Function(Answer<dynamic>)? - - - - - - - - - - - VisualAnalogueQuestion - - - - - - - - - \ No newline at end of file diff --git a/docs/uml/app/lib/widgets/questionnaire/uml.svg b/docs/uml/app/lib/widgets/questionnaire/uml.svg deleted file mode 100644 index 8feef1090..000000000 --- a/docs/uml/app/lib/widgets/questionnaire/uml.svg +++ /dev/null @@ -1,773 +0,0 @@ - - [AudioRecordingQuestionWidget - | - +question: AudioRecordingQuestion; - +onDone: dynamic Function(Answer<FutureBlobFile>)? - ] - - [AudioRecordingQuestionWidget]o-[AudioRecordingQuestion] - [AudioRecordingQuestionWidget]o-[dynamic Function(Answer<FutureBlobFile>)?] - [<abstract>QuestionWidget]<:-[AudioRecordingQuestionWidget] - - [CustomSlider - | - +value: double?; - +minValue: double?; - +maxValue: double?; - +minorTick: int?; - +onChanged: dynamic Function(double)?; - +onChangeEnd: dynamic Function(double)?; - +activeColor: Color?; - +inactiveColor: Color?; - +minColor: Color?; - +maxColor: Color?; - +thumbColor: Color?; - +isColored: bool; - +labelValuePrecision: int; - +tickValuePrecision: int; - +linearStep: bool; - +steps: AnnotatedScaleQuestion? - | - +Widget build() - ] - - [CustomSlider]o-[dynamic Function(double)?] - [CustomSlider]o-[Color] - [CustomSlider]o-[AnnotatedScaleQuestion] - - [CustomTrackShape - | - +Rect getPreferredRect() - ] - - [RoundedRectSliderTrackShape]<:-[CustomTrackShape] - - [QuestionContainer - | - +onDone: dynamic Function(Answer<dynamic>, int); - +question: Question<dynamic>; - +index: int - ] - - [QuestionContainer]o-[dynamic Function(Answer<dynamic>, int)] - [QuestionContainer]o-[<abstract>Question] - - [QuestionHeader - | - +prompt: String?; - +subtitle: String?; - +rationale: String? - | - -List<Widget> _buildSubtitle(); - -List<Widget> _buildRationaleButton(); - +Widget build() - ] - - [ImageCapturingQuestionWidget - | - +question: ImageCapturingQuestion; - +onDone: dynamic Function(Answer<FutureBlobFile>)? - ] - - [ImageCapturingQuestionWidget]o-[ImageCapturingQuestion] - [ImageCapturingQuestionWidget]o-[dynamic Function(Answer<FutureBlobFile>)?] - [<abstract>QuestionWidget]<:-[ImageCapturingQuestionWidget] - - [QuestionnaireWidget - | - +title: String?; - +header: String?; - +footer: String?; - +questions: List<Question<dynamic>> - ] - - [HtmlTextBox - | - +text: String? - | - +Widget build() - ] - - [BooleanQuestionWidget - | - +question: BooleanQuestion; - +onDone: dynamic Function(Answer<dynamic>)? - ] - - [BooleanQuestionWidget]o-[BooleanQuestion] - [BooleanQuestionWidget]o-[dynamic Function(Answer<dynamic>)?] - [<abstract>QuestionWidget]<:-[BooleanQuestionWidget] - - [ChoiceQuestionWidget - | - +question: ChoiceQuestion; - +onDone: dynamic Function(Answer<dynamic>); - +multiSelectionText: String; - +subtitle: String? - ] - - [ChoiceQuestionWidget]o-[ChoiceQuestion] - [ChoiceQuestionWidget]o-[dynamic Function(Answer<dynamic>)] - [<abstract>QuestionWidget]<:-[ChoiceQuestionWidget] - - [VisualAnalogueQuestionWidget - | - +question: VisualAnalogueQuestion; - +onDone: dynamic Function(Answer<dynamic>)? - ] - - [VisualAnalogueQuestionWidget]o-[VisualAnalogueQuestion] - [VisualAnalogueQuestionWidget]o-[dynamic Function(Answer<dynamic>)?] - [<abstract>QuestionWidget]<:-[VisualAnalogueQuestionWidget] - - [FreeTextQuestionWidget - | - +question: FreeTextQuestion; - +onDone: dynamic Function(Answer<dynamic>)? - ] - - [FreeTextQuestionWidget]o-[FreeTextQuestion] - [FreeTextQuestionWidget]o-[dynamic Function(Answer<dynamic>)?] - [<abstract>QuestionWidget]<:-[FreeTextQuestionWidget] - - [AnnotatedScaleQuestionWidget - | - +question: AnnotatedScaleQuestion; - +onDone: dynamic Function(Answer<dynamic>)? - ] - - [AnnotatedScaleQuestionWidget]o-[AnnotatedScaleQuestion] - [AnnotatedScaleQuestionWidget]o-[dynamic Function(Answer<dynamic>)?] - [<abstract>QuestionWidget]<:-[AnnotatedScaleQuestionWidget] - - [<abstract>QuestionWidget - | - +subtitle: String? - ] - - [ScaleQuestionWidget - | - +question: ScaleQuestion; - +onDone: dynamic Function(Answer<dynamic>)? - ] - - [ScaleQuestionWidget]o-[ScaleQuestion] - [ScaleQuestionWidget]o-[dynamic Function(Answer<dynamic>)?] - [<abstract>QuestionWidget]<:-[ScaleQuestionWidget] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AudioRecordingQuestionWidget - - - - - - +question: AudioRecordingQuestion - +onDone: dynamic Function(Answer<FutureBlobFile>)? - - - - - - - - - - - AudioRecordingQuestion - - - - - - - - - - - dynamic Function(Answer<FutureBlobFile>)? - - - - - - - - - - - - QuestionWidget - - - - - - +subtitle: String? - - - - - - - - - - - - - CustomSlider - - - - - - +value: double? - +minValue: double? - +maxValue: double? - +minorTick: int? - +onChanged: dynamic Function(double)? - +onChangeEnd: dynamic Function(double)? - +activeColor: Color? - +inactiveColor: Color? - +minColor: Color? - +maxColor: Color? - +thumbColor: Color? - +isColored: bool - +labelValuePrecision: int - +tickValuePrecision: int - +linearStep: bool - +steps: AnnotatedScaleQuestion? - - - - - - +Widget build() - - - - - - - - - - - dynamic Function(double)? - - - - - - - - - - - Color - - - - - - - - - - - AnnotatedScaleQuestion - - - - - - - - - - - - CustomTrackShape - - - - - - +Rect getPreferredRect() - - - - - - - - - - - RoundedRectSliderTrackShape - - - - - - - - - - - - QuestionContainer - - - - - - +onDone: dynamic Function(Answer<dynamic>, int) - +question: Question<dynamic> - +index: int - - - - - - - - - - - dynamic Function(Answer<dynamic>, int) - - - - - - - - - - - Question - - - - - - - - - - - - - QuestionHeader - - - - - - +prompt: String? - +subtitle: String? - +rationale: String? - - - - - - -List<Widget> _buildSubtitle() - -List<Widget> _buildRationaleButton() - +Widget build() - - - - - - - - - - - - ImageCapturingQuestionWidget - - - - - - +question: ImageCapturingQuestion - +onDone: dynamic Function(Answer<FutureBlobFile>)? - - - - - - - - - - - ImageCapturingQuestion - - - - - - - - - - - - QuestionnaireWidget - - - - - - +title: String? - +header: String? - +footer: String? - +questions: List<Question<dynamic>> - - - - - - - - - - - - - HtmlTextBox - - - - - - +text: String? - - - - - - +Widget build() - - - - - - - - - - - - BooleanQuestionWidget - - - - - - +question: BooleanQuestion - +onDone: dynamic Function(Answer<dynamic>)? - - - - - - - - - - - BooleanQuestion - - - - - - - - - - - dynamic Function(Answer<dynamic>)? - - - - - - - - - - - - ChoiceQuestionWidget - - - - - - +question: ChoiceQuestion - +onDone: dynamic Function(Answer<dynamic>) - +multiSelectionText: String - +subtitle: String? - - - - - - - - - - - ChoiceQuestion - - - - - - - - - - - dynamic Function(Answer<dynamic>) - - - - - - - - - - - - VisualAnalogueQuestionWidget - - - - - - +question: VisualAnalogueQuestion - +onDone: dynamic Function(Answer<dynamic>)? - - - - - - - - - - - VisualAnalogueQuestion - - - - - - - - - - - - FreeTextQuestionWidget - - - - - - +question: FreeTextQuestion - +onDone: dynamic Function(Answer<dynamic>)? - - - - - - - - - - - FreeTextQuestion - - - - - - - - - - - - AnnotatedScaleQuestionWidget - - - - - - +question: AnnotatedScaleQuestion - +onDone: dynamic Function(Answer<dynamic>)? - - - - - - - - - - - - ScaleQuestionWidget - - - - - - +question: ScaleQuestion - +onDone: dynamic Function(Answer<dynamic>)? - - - - - - - - - - - ScaleQuestion - - - - - - - - - \ No newline at end of file diff --git a/docs/uml/app/lib/widgets/uml.svg b/docs/uml/app/lib/widgets/uml.svg deleted file mode 100644 index 81d54b744..000000000 --- a/docs/uml/app/lib/widgets/uml.svg +++ /dev/null @@ -1,1172 +0,0 @@ - - [SelectableButton - | - +child: Widget; - +selected: bool; - +onTap: dynamic Function()? - | - -Color _getFillColor(); - -Color _getTextColor(); - +Widget build() - ] - - [SelectableButton]o-[<abstract>Widget] - [SelectableButton]o-[dynamic Function()?] - - [CustomSlider - | - +value: double?; - +minValue: double?; - +maxValue: double?; - +minorTick: int?; - +onChanged: dynamic Function(double)?; - +onChangeEnd: dynamic Function(double)?; - +activeColor: Color?; - +inactiveColor: Color?; - +minColor: Color?; - +maxColor: Color?; - +thumbColor: Color?; - +isColored: bool; - +labelValuePrecision: int; - +tickValuePrecision: int; - +linearStep: bool; - +steps: AnnotatedScaleQuestion? - | - +Widget build() - ] - - [CustomSlider]o-[dynamic Function(double)?] - [CustomSlider]o-[Color] - [CustomSlider]o-[AnnotatedScaleQuestion] - - [CustomTrackShape - | - +Rect getPreferredRect() - ] - - [RoundedRectSliderTrackShape]<:-[CustomTrackShape] - - [QuestionnaireWidget - | - +title: String?; - +header: String?; - +footer: String?; - +questions: List<Question<dynamic>> - ] - - [HtmlTextBox - | - +text: String? - | - +Widget build() - ] - - [QuestionContainer - | - +onDone: dynamic Function(Answer<dynamic>, int); - +question: Question<dynamic>; - +index: int - ] - - [QuestionContainer]o-[dynamic Function(Answer<dynamic>, int)] - [QuestionContainer]o-[<abstract>Question] - - [QuestionHeader - | - +prompt: String?; - +subtitle: String?; - +rationale: String? - | - -List<Widget> _buildSubtitle(); - -List<Widget> _buildRationaleButton(); - +Widget build() - ] - - [ChoiceQuestionWidget - | - +question: ChoiceQuestion; - +onDone: dynamic Function(Answer<dynamic>); - +multiSelectionText: String; - +subtitle: String? - ] - - [ChoiceQuestionWidget]o-[ChoiceQuestion] - [ChoiceQuestionWidget]o-[dynamic Function(Answer<dynamic>)] - [<abstract>QuestionWidget]<:-[ChoiceQuestionWidget] - - [FreeTextQuestionWidget - | - +question: FreeTextQuestion; - +onDone: dynamic Function(Answer<dynamic>)? - ] - - [FreeTextQuestionWidget]o-[FreeTextQuestion] - [FreeTextQuestionWidget]o-[dynamic Function(Answer<dynamic>)?] - [<abstract>QuestionWidget]<:-[FreeTextQuestionWidget] - - [AnnotatedScaleQuestionWidget - | - +question: AnnotatedScaleQuestion; - +onDone: dynamic Function(Answer<dynamic>)? - ] - - [AnnotatedScaleQuestionWidget]o-[AnnotatedScaleQuestion] - [AnnotatedScaleQuestionWidget]o-[dynamic Function(Answer<dynamic>)?] - [<abstract>QuestionWidget]<:-[AnnotatedScaleQuestionWidget] - - [VisualAnalogueQuestionWidget - | - +question: VisualAnalogueQuestion; - +onDone: dynamic Function(Answer<dynamic>)? - ] - - [VisualAnalogueQuestionWidget]o-[VisualAnalogueQuestion] - [VisualAnalogueQuestionWidget]o-[dynamic Function(Answer<dynamic>)?] - [<abstract>QuestionWidget]<:-[VisualAnalogueQuestionWidget] - - [<abstract>QuestionWidget - | - +subtitle: String? - ] - - [BooleanQuestionWidget - | - +question: BooleanQuestion; - +onDone: dynamic Function(Answer<dynamic>)? - ] - - [BooleanQuestionWidget]o-[BooleanQuestion] - [BooleanQuestionWidget]o-[dynamic Function(Answer<dynamic>)?] - [<abstract>QuestionWidget]<:-[BooleanQuestionWidget] - - [ScaleQuestionWidget - | - +question: ScaleQuestion; - +onDone: dynamic Function(Answer<dynamic>)? - ] - - [ScaleQuestionWidget]o-[ScaleQuestion] - [ScaleQuestionWidget]o-[dynamic Function(Answer<dynamic>)?] - [<abstract>QuestionWidget]<:-[ScaleQuestionWidget] - - [StudyTile - | - +title: String?; - +description: String?; - +iconName: String; - +onTap: dynamic Function()?; - +contentPadding: EdgeInsetsGeometry - | - +Widget build() - ] - - [StudyTile]o-[dynamic Function()?] - [StudyTile]o-[<abstract>EdgeInsetsGeometry] - - [RoundCheckbox - | - +onChanged: dynamic Function(bool)?; - +value: bool? - | - +Widget build() - ] - - [RoundCheckbox]o-[dynamic Function(bool)?] - - [InterventionCard - | - +intervention: Intervention; - +selected: bool; - +showCheckbox: bool; - +showTasks: bool; - +showDescription: bool; - +onTap: dynamic Function()? - | - +Widget build() - ] - - [InterventionCard]o-[Intervention] - [InterventionCard]o-[dynamic Function()?] - - [InterventionCardTitle - | - +intervention: Intervention?; - +selected: bool; - +showCheckbox: bool; - +showDescriptionButton: bool; - +onTap: dynamic Function()? - | - +Widget build() - ] - - [InterventionCardTitle]o-[Intervention] - [InterventionCardTitle]o-[dynamic Function()?] - - [InterventionCardDescription - | - +intervention: Intervention - | - +Widget build() - ] - - [InterventionCardDescription]o-[Intervention] - - [_TaskList - | - +tasks: List<InterventionTask> - | - +String scheduleString(); - +Widget build() - ] - - [HtmlText - | - +text: String?; - +style: TextStyle?; - +centered: bool - | - +Widget build() - ] - - [HtmlText]o-[TextStyle] - - [BottomOnboardingNavigation - | - +onBack: void Function()?; - +onNext: void Function()?; - +backLabel: String?; - +nextLabel: String?; - +hideNext: bool; - +nextIcon: Icon?; - +backIcon: Icon?; - +progress: Widget? - | - +Widget build() - ] - - [BottomOnboardingNavigation]o-[void Function()?] - [BottomOnboardingNavigation]o-[Icon] - [BottomOnboardingNavigation]o-[<abstract>Widget] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - SelectableButton - - - - - - +child: Widget - +selected: bool - +onTap: dynamic Function()? - - - - - - -Color _getFillColor() - -Color _getTextColor() - +Widget build() - - - - - - - - - - - Widget - - - - - - - - - - - dynamic Function()? - - - - - - - - - - - - - CustomSlider - - - - - - +value: double? - +minValue: double? - +maxValue: double? - +minorTick: int? - +onChanged: dynamic Function(double)? - +onChangeEnd: dynamic Function(double)? - +activeColor: Color? - +inactiveColor: Color? - +minColor: Color? - +maxColor: Color? - +thumbColor: Color? - +isColored: bool - +labelValuePrecision: int - +tickValuePrecision: int - +linearStep: bool - +steps: AnnotatedScaleQuestion? - - - - - - +Widget build() - - - - - - - - - - - dynamic Function(double)? - - - - - - - - - - - Color - - - - - - - - - - - AnnotatedScaleQuestion - - - - - - - - - - - - CustomTrackShape - - - - - - +Rect getPreferredRect() - - - - - - - - - - - RoundedRectSliderTrackShape - - - - - - - - - - - - QuestionnaireWidget - - - - - - +title: String? - +header: String? - +footer: String? - +questions: List<Question<dynamic>> - - - - - - - - - - - - - HtmlTextBox - - - - - - +text: String? - - - - - - +Widget build() - - - - - - - - - - - - QuestionContainer - - - - - - +onDone: dynamic Function(Answer<dynamic>, int) - +question: Question<dynamic> - +index: int - - - - - - - - - - - dynamic Function(Answer<dynamic>, int) - - - - - - - - - - - Question - - - - - - - - - - - - - QuestionHeader - - - - - - +prompt: String? - +subtitle: String? - +rationale: String? - - - - - - -List<Widget> _buildSubtitle() - -List<Widget> _buildRationaleButton() - +Widget build() - - - - - - - - - - - - ChoiceQuestionWidget - - - - - - +question: ChoiceQuestion - +onDone: dynamic Function(Answer<dynamic>) - +multiSelectionText: String - +subtitle: String? - - - - - - - - - - - ChoiceQuestion - - - - - - - - - - - dynamic Function(Answer<dynamic>) - - - - - - - - - - - - QuestionWidget - - - - - - +subtitle: String? - - - - - - - - - - - - FreeTextQuestionWidget - - - - - - +question: FreeTextQuestion - +onDone: dynamic Function(Answer<dynamic>)? - - - - - - - - - - - FreeTextQuestion - - - - - - - - - - - dynamic Function(Answer<dynamic>)? - - - - - - - - - - - - AnnotatedScaleQuestionWidget - - - - - - +question: AnnotatedScaleQuestion - +onDone: dynamic Function(Answer<dynamic>)? - - - - - - - - - - - - VisualAnalogueQuestionWidget - - - - - - +question: VisualAnalogueQuestion - +onDone: dynamic Function(Answer<dynamic>)? - - - - - - - - - - - VisualAnalogueQuestion - - - - - - - - - - - - BooleanQuestionWidget - - - - - - +question: BooleanQuestion - +onDone: dynamic Function(Answer<dynamic>)? - - - - - - - - - - - BooleanQuestion - - - - - - - - - - - - ScaleQuestionWidget - - - - - - +question: ScaleQuestion - +onDone: dynamic Function(Answer<dynamic>)? - - - - - - - - - - - ScaleQuestion - - - - - - - - - - - - - StudyTile - - - - - - +title: String? - +description: String? - +iconName: String - +onTap: dynamic Function()? - +contentPadding: EdgeInsetsGeometry - - - - - - +Widget build() - - - - - - - - - - - EdgeInsetsGeometry - - - - - - - - - - - - - RoundCheckbox - - - - - - +onChanged: dynamic Function(bool)? - +value: bool? - - - - - - +Widget build() - - - - - - - - - - - dynamic Function(bool)? - - - - - - - - - - - - - InterventionCard - - - - - - +intervention: Intervention - +selected: bool - +showCheckbox: bool - +showTasks: bool - +showDescription: bool - +onTap: dynamic Function()? - - - - - - +Widget build() - - - - - - - - - - - Intervention - - - - - - - - - - - - - InterventionCardTitle - - - - - - +intervention: Intervention? - +selected: bool - +showCheckbox: bool - +showDescriptionButton: bool - +onTap: dynamic Function()? - - - - - - +Widget build() - - - - - - - - - - - - - InterventionCardDescription - - - - - - +intervention: Intervention - - - - - - +Widget build() - - - - - - - - - - - - - _TaskList - - - - - - +tasks: List<InterventionTask> - - - - - - +String scheduleString() - +Widget build() - - - - - - - - - - - - - HtmlText - - - - - - +text: String? - +style: TextStyle? - +centered: bool - - - - - - +Widget build() - - - - - - - - - - - TextStyle - - - - - - - - - - - - - BottomOnboardingNavigation - - - - - - +onBack: void Function()? - +onNext: void Function()? - +backLabel: String? - +nextLabel: String? - +hideNext: bool - +nextIcon: Icon? - +backIcon: Icon? - +progress: Widget? - - - - - - +Widget build() - - - - - - - - - - - void Function()? - - - - - - - - - - - Icon - - - - - - - - - \ No newline at end of file diff --git a/docs/uml/core/lib/src/env/uml.svg b/docs/uml/core/lib/src/env/uml.svg deleted file mode 100644 index e1d655211..000000000 --- a/docs/uml/core/lib/src/env/uml.svg +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/uml/core/lib/src/models/consent/uml.svg b/docs/uml/core/lib/src/models/consent/uml.svg deleted file mode 100644 index d14fbdd3c..000000000 --- a/docs/uml/core/lib/src/models/consent/uml.svg +++ /dev/null @@ -1,54 +0,0 @@ - - [ConsentItem - | - +id: String; - +title: String?; - +description: String?; - +iconName: String - | - +Map<String, dynamic> toJson(); - +String toString() - ] - - - - - - - - - - - - - - - - - - ConsentItem - - - - - - +id: String - +title: String? - +description: String? - +iconName: String - - - - - - +Map<String, dynamic> toJson() - +String toString() - - - - - - - - - \ No newline at end of file diff --git a/docs/uml/core/lib/src/models/data/uml.svg b/docs/uml/core/lib/src/models/data/uml.svg deleted file mode 100644 index 615c4e2a3..000000000 --- a/docs/uml/core/lib/src/models/data/uml.svg +++ /dev/null @@ -1,52 +0,0 @@ - - [DataReference - | - +task: String; - +property: String - | - +Map<String, dynamic> toJson(); - +String toString(); - +Map<DateTime, T> retrieveFromResults() - ] - - - - - - - - - - - - - - - - - - DataReference - - - - - - +task: String - +property: String - - - - - - +Map<String, dynamic> toJson() - +String toString() - +Map<DateTime, T> retrieveFromResults() - - - - - - - - - \ No newline at end of file diff --git a/docs/uml/core/lib/src/models/eligibility/uml.svg b/docs/uml/core/lib/src/models/eligibility/uml.svg deleted file mode 100644 index 32b5afd1e..000000000 --- a/docs/uml/core/lib/src/models/eligibility/uml.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/uml/core/lib/src/models/expressions/types/uml.svg b/docs/uml/core/lib/src/models/expressions/types/uml.svg deleted file mode 100644 index 32b5afd1e..000000000 --- a/docs/uml/core/lib/src/models/expressions/types/uml.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/uml/core/lib/src/models/expressions/uml.svg b/docs/uml/core/lib/src/models/expressions/uml.svg deleted file mode 100644 index 32b5afd1e..000000000 --- a/docs/uml/core/lib/src/models/expressions/uml.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/uml/core/lib/src/models/interventions/tasks/uml.svg b/docs/uml/core/lib/src/models/interventions/tasks/uml.svg deleted file mode 100644 index 32b5afd1e..000000000 --- a/docs/uml/core/lib/src/models/interventions/tasks/uml.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/uml/core/lib/src/models/interventions/uml.svg b/docs/uml/core/lib/src/models/interventions/uml.svg deleted file mode 100644 index 32b5afd1e..000000000 --- a/docs/uml/core/lib/src/models/interventions/uml.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/uml/core/lib/src/models/observations/tasks/uml.svg b/docs/uml/core/lib/src/models/observations/tasks/uml.svg deleted file mode 100644 index 32b5afd1e..000000000 --- a/docs/uml/core/lib/src/models/observations/tasks/uml.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/uml/core/lib/src/models/observations/uml.svg b/docs/uml/core/lib/src/models/observations/uml.svg deleted file mode 100644 index 32b5afd1e..000000000 --- a/docs/uml/core/lib/src/models/observations/uml.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/uml/core/lib/src/models/questionnaire/questions/uml.svg b/docs/uml/core/lib/src/models/questionnaire/questions/uml.svg deleted file mode 100644 index 32b5afd1e..000000000 --- a/docs/uml/core/lib/src/models/questionnaire/questions/uml.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/uml/core/lib/src/models/questionnaire/uml.svg b/docs/uml/core/lib/src/models/questionnaire/uml.svg deleted file mode 100644 index 32b5afd1e..000000000 --- a/docs/uml/core/lib/src/models/questionnaire/uml.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/uml/core/lib/src/models/report/sections/uml.svg b/docs/uml/core/lib/src/models/report/sections/uml.svg deleted file mode 100644 index 62be008e4..000000000 --- a/docs/uml/core/lib/src/models/report/sections/uml.svg +++ /dev/null @@ -1,200 +0,0 @@ - - [AverageSection - | - <static>+sectionType: String; - +aggregate: TemporalAggregation?; - +resultProperty: DataReference<num>? - | - +Map<String, dynamic> toJson() - ] - - [AverageSection]o-[TemporalAggregation] - [AverageSection]o-[DataReference] - [<abstract>ReportSection]<:-[AverageSection] - - [LinearRegressionSection - | - <static>+sectionType: String; - +resultProperty: DataReference<num>?; - +alpha: double; - +improvement: ImprovementDirection? - | - +Map<String, dynamic> toJson() - ] - - [LinearRegressionSection]o-[DataReference] - [LinearRegressionSection]o-[ImprovementDirection] - [<abstract>ReportSection]<:-[LinearRegressionSection] - - [ImprovementDirection - | - +index: int; - <static>+values: List<ImprovementDirection>; - <static>+positive: ImprovementDirection; - <static>+negative: ImprovementDirection - ] - - [ImprovementDirection]o-[ImprovementDirection] - [Enum]<:--[ImprovementDirection] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AverageSection - - - - - - <static>+sectionType: String - +aggregate: TemporalAggregation? - +resultProperty: DataReference<num>? - - - - - - +Map<String, dynamic> toJson() - - - - - - - - - - - TemporalAggregation - - - - - - - - - - - DataReference - - - - - - - - - - - ReportSection - - - - - - - - - - - - - LinearRegressionSection - - - - - - <static>+sectionType: String - +resultProperty: DataReference<num>? - +alpha: double - +improvement: ImprovementDirection? - - - - - - +Map<String, dynamic> toJson() - - - - - - - - - - - - ImprovementDirection - - - - - - +index: int - <static>+values: List<ImprovementDirection> - <static>+positive: ImprovementDirection - <static>+negative: ImprovementDirection - - - - - - - - - - - Enum - - - - - - - - - \ No newline at end of file diff --git a/docs/uml/core/lib/src/models/report/uml.svg b/docs/uml/core/lib/src/models/report/uml.svg deleted file mode 100644 index e323c06c7..000000000 --- a/docs/uml/core/lib/src/models/report/uml.svg +++ /dev/null @@ -1,306 +0,0 @@ - - [AverageSection - | - <static>+sectionType: String; - +aggregate: TemporalAggregation?; - +resultProperty: DataReference<num>? - | - +Map<String, dynamic> toJson() - ] - - [AverageSection]o-[TemporalAggregation] - [AverageSection]o-[DataReference] - [<abstract>ReportSection]<:-[AverageSection] - - [LinearRegressionSection - | - <static>+sectionType: String; - +resultProperty: DataReference<num>?; - +alpha: double; - +improvement: ImprovementDirection? - | - +Map<String, dynamic> toJson() - ] - - [LinearRegressionSection]o-[DataReference] - [LinearRegressionSection]o-[ImprovementDirection] - [<abstract>ReportSection]<:-[LinearRegressionSection] - - [ImprovementDirection - | - +index: int; - <static>+values: List<ImprovementDirection>; - <static>+positive: ImprovementDirection; - <static>+negative: ImprovementDirection - ] - - [ImprovementDirection]o-[ImprovementDirection] - [Enum]<:--[ImprovementDirection] - - [TemporalAggregation - | - +index: int; - <static>+values: List<TemporalAggregation>; - <static>+day: TemporalAggregation; - <static>+phase: TemporalAggregation; - <static>+intervention: TemporalAggregation - ] - - [TemporalAggregation]o-[TemporalAggregation] - [Enum]<:--[TemporalAggregation] - - [ReportSpecification - | - +primary: ReportSection?; - +secondary: List<ReportSection> - | - +Map<String, dynamic> toJson(); - +String toString() - ] - - [ReportSpecification]o-[<abstract>ReportSection] - - [<abstract>ReportSection - | - <static>+sectionTypes: Map<String, ReportSection Function(Map<String, dynamic>)>; - <static>+keyType: String; - +type: String; - +id: String; - +title: String?; - +description: String? - | - +Map<String, dynamic> toJson(); - +String toString() - ] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AverageSection - - - - - - <static>+sectionType: String - +aggregate: TemporalAggregation? - +resultProperty: DataReference<num>? - - - - - - +Map<String, dynamic> toJson() - - - - - - - - - - - - TemporalAggregation - - - - - - +index: int - <static>+values: List<TemporalAggregation> - <static>+day: TemporalAggregation - <static>+phase: TemporalAggregation - <static>+intervention: TemporalAggregation - - - - - - - - - - - DataReference - - - - - - - - - - - - - ReportSection - - - - - - <static>+sectionTypes: Map<String, ReportSection Function(Map<String, dynamic>)> - <static>+keyType: String - +type: String - +id: String - +title: String? - +description: String? - - - - - - +Map<String, dynamic> toJson() - +String toString() - - - - - - - - - - - - - LinearRegressionSection - - - - - - <static>+sectionType: String - +resultProperty: DataReference<num>? - +alpha: double - +improvement: ImprovementDirection? - - - - - - +Map<String, dynamic> toJson() - - - - - - - - - - - - ImprovementDirection - - - - - - +index: int - <static>+values: List<ImprovementDirection> - <static>+positive: ImprovementDirection - <static>+negative: ImprovementDirection - - - - - - - - - - - Enum - - - - - - - - - - - - - ReportSpecification - - - - - - +primary: ReportSection? - +secondary: List<ReportSection> - - - - - - +Map<String, dynamic> toJson() - +String toString() - - - - - - - - - \ No newline at end of file diff --git a/docs/uml/core/lib/src/models/results/uml.svg b/docs/uml/core/lib/src/models/results/uml.svg deleted file mode 100644 index 32b5afd1e..000000000 --- a/docs/uml/core/lib/src/models/results/uml.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/uml/core/lib/src/models/study_results/results/uml.svg b/docs/uml/core/lib/src/models/study_results/results/uml.svg deleted file mode 100644 index d1a28082e..000000000 --- a/docs/uml/core/lib/src/models/study_results/results/uml.svg +++ /dev/null @@ -1,123 +0,0 @@ - - [InterventionResult - | - <static>+studyResultType: String - | - +Map<String, dynamic> toJson(); - +List<String> getHeaders(); - +List<dynamic> getValues() - ] - - [<abstract>StudyResult]<:-[InterventionResult] - - [NumericResult - | - <static>+studyResultType: String; - +resultProperty: DataReference<num> - | - +Map<String, dynamic> toJson(); - +List<String> getHeaders(); - +List<dynamic> getValues() - ] - - [NumericResult]o-[DataReference] - [<abstract>StudyResult]<:-[NumericResult] - - - - - - - - - - - - - - - - - - - - - - - - - - InterventionResult - - - - - - <static>+studyResultType: String - - - - - - +Map<String, dynamic> toJson() - +List<String> getHeaders() - +List<dynamic> getValues() - - - - - - - - - - - StudyResult - - - - - - - - - - - - - NumericResult - - - - - - <static>+studyResultType: String - +resultProperty: DataReference<num> - - - - - - +Map<String, dynamic> toJson() - +List<String> getHeaders() - +List<dynamic> getValues() - - - - - - - - - - - DataReference - - - - - - - - - \ No newline at end of file diff --git a/docs/uml/core/lib/src/models/study_results/uml.svg b/docs/uml/core/lib/src/models/study_results/uml.svg deleted file mode 100644 index 7cdd82c0c..000000000 --- a/docs/uml/core/lib/src/models/study_results/uml.svg +++ /dev/null @@ -1,156 +0,0 @@ - - [<abstract>StudyResult - | - <static>+studyResultTypes: Map<String, StudyResult Function(Map<String, dynamic>)>; - <static>+keyType: String; - +type: String; - +id: String; - +filename: String - | - +Map<String, dynamic> toJson(); - +List<String> getHeaders(); - +List<dynamic> getValues() - ] - - [InterventionResult - | - <static>+studyResultType: String - | - +Map<String, dynamic> toJson(); - +List<String> getHeaders(); - +List<dynamic> getValues() - ] - - [<abstract>StudyResult]<:-[InterventionResult] - - [NumericResult - | - <static>+studyResultType: String; - +resultProperty: DataReference<num> - | - +Map<String, dynamic> toJson(); - +List<String> getHeaders(); - +List<dynamic> getValues() - ] - - [NumericResult]o-[DataReference] - [<abstract>StudyResult]<:-[NumericResult] - - - - - - - - - - - - - - - - - - - - - - - - - - StudyResult - - - - - - <static>+studyResultTypes: Map<String, StudyResult Function(Map<String, dynamic>)> - <static>+keyType: String - +type: String - +id: String - +filename: String - - - - - - +Map<String, dynamic> toJson() - +List<String> getHeaders() - +List<dynamic> getValues() - - - - - - - - - - - - - InterventionResult - - - - - - <static>+studyResultType: String - - - - - - +Map<String, dynamic> toJson() - +List<String> getHeaders() - +List<dynamic> getValues() - - - - - - - - - - - - - NumericResult - - - - - - <static>+studyResultType: String - +resultProperty: DataReference<num> - - - - - - +Map<String, dynamic> toJson() - +List<String> getHeaders() - +List<dynamic> getValues() - - - - - - - - - - - DataReference - - - - - - - - - \ No newline at end of file diff --git a/docs/uml/core/lib/src/models/study_schedule/uml.svg b/docs/uml/core/lib/src/models/study_schedule/uml.svg deleted file mode 100644 index 32b5afd1e..000000000 --- a/docs/uml/core/lib/src/models/study_schedule/uml.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/uml/core/lib/src/models/tables/uml.svg b/docs/uml/core/lib/src/models/tables/uml.svg deleted file mode 100644 index 32b5afd1e..000000000 --- a/docs/uml/core/lib/src/models/tables/uml.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/uml/core/lib/src/models/tasks/uml.svg b/docs/uml/core/lib/src/models/tasks/uml.svg deleted file mode 100644 index 32b5afd1e..000000000 --- a/docs/uml/core/lib/src/models/tasks/uml.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/uml/core/lib/src/models/uml.svg b/docs/uml/core/lib/src/models/uml.svg deleted file mode 100644 index 32b5afd1e..000000000 --- a/docs/uml/core/lib/src/models/uml.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/uml/core/lib/src/uml.svg b/docs/uml/core/lib/src/uml.svg deleted file mode 100644 index 32b5afd1e..000000000 --- a/docs/uml/core/lib/src/uml.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/uml/core/lib/src/util/multimodal/uml.svg b/docs/uml/core/lib/src/util/multimodal/uml.svg deleted file mode 100644 index 987386914..000000000 --- a/docs/uml/core/lib/src/util/multimodal/uml.svg +++ /dev/null @@ -1,50 +0,0 @@ - - [BlobStorageHandler - | - <static>-_observationsBucketName: String - | - +dynamic uploadObservation(); - +dynamic downloadObservation(); - +dynamic removeObservation() - ] - - - - - - - - - - - - - - - - - - BlobStorageHandler - - - - - - <static>-_observationsBucketName: String - - - - - - +dynamic uploadObservation() - +dynamic downloadObservation() - +dynamic removeObservation() - - - - - - - - - \ No newline at end of file diff --git a/docs/uml/core/lib/src/util/uml.svg b/docs/uml/core/lib/src/util/uml.svg deleted file mode 100644 index 32b5afd1e..000000000 --- a/docs/uml/core/lib/src/util/uml.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/uml/core/lib/uml.svg b/docs/uml/core/lib/uml.svg deleted file mode 100644 index 32b5afd1e..000000000 --- a/docs/uml/core/lib/uml.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/uml/designer_v2/lib/common_views/pages/uml.svg b/docs/uml/designer_v2/lib/common_views/pages/uml.svg deleted file mode 100644 index afcb7191f..000000000 --- a/docs/uml/designer_v2/lib/common_views/pages/uml.svg +++ /dev/null @@ -1,84 +0,0 @@ - - [SplashPage - | - +Widget build() - ] - - [ErrorPage - | - +error: Exception? - | - +Widget build() - ] - - [<abstract>ConsumerWidget]<:-[ErrorPage] - - - - - - - - - - - - - - - - - - - SplashPage - - - - - - +Widget build() - - - - - - - - - - - - - ErrorPage - - - - - - +error: Exception? - - - - - - +Widget build() - - - - - - - - - - - ConsumerWidget - - - - - - - - - \ No newline at end of file diff --git a/docs/uml/designer_v2/lib/common_views/sidesheet/uml.svg b/docs/uml/designer_v2/lib/common_views/sidesheet/uml.svg deleted file mode 100644 index 828b9f312..000000000 --- a/docs/uml/designer_v2/lib/common_views/sidesheet/uml.svg +++ /dev/null @@ -1,203 +0,0 @@ - - [FormSideSheetTab - | - +formViewBuilder: Widget Function(T) - ] - - [FormSideSheetTab]o-[Widget Function(T)] - [NavbarTab]<:-[FormSideSheetTab] - - [SidesheetTab - | - +builder: Widget Function(BuildContext) - ] - - [SidesheetTab]o-[Widget Function(BuildContext)] - [NavbarTab]<:-[SidesheetTab] - - [Sidesheet - | - <static>+kDefaultWidth: double; - +titleText: String; - +body: Widget?; - +tabs: List<SidesheetTab>?; - +actionButtons: List<Widget>?; - +width: double?; - +withCloseButton: bool; - +ignoreAppBar: bool; - +collapseSingleTab: bool; - +bodyPadding: EdgeInsets?; - +wrapContent: Widget Function(Widget)? - ] - - [Sidesheet]o-[<abstract>Widget] - [Sidesheet]o-[EdgeInsets] - [Sidesheet]o-[Widget Function(Widget)?] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - FormSideSheetTab - - - - - - +formViewBuilder: Widget Function(T) - - - - - - - - - - - Widget Function(T) - - - - - - - - - - - NavbarTab - - - - - - - - - - - - SidesheetTab - - - - - - +builder: Widget Function(BuildContext) - - - - - - - - - - - Widget Function(BuildContext) - - - - - - - - - - - - Sidesheet - - - - - - <static>+kDefaultWidth: double - +titleText: String - +body: Widget? - +tabs: List<SidesheetTab>? - +actionButtons: List<Widget>? - +width: double? - +withCloseButton: bool - +ignoreAppBar: bool - +collapseSingleTab: bool - +bodyPadding: EdgeInsets? - +wrapContent: Widget Function(Widget)? - - - - - - - - - - - Widget - - - - - - - - - - - EdgeInsets - - - - - - - - - - - Widget Function(Widget)? - - - - - - - - - \ No newline at end of file diff --git a/docs/uml/designer_v2/lib/common_views/uml.svg b/docs/uml/designer_v2/lib/common_views/uml.svg deleted file mode 100644 index 425f28f48..000000000 --- a/docs/uml/designer_v2/lib/common_views/uml.svg +++ /dev/null @@ -1,3242 +0,0 @@ - - [<abstract>ISyncIndicatorViewModel - | - +isDirty: bool; - +lastSynced: DateTime? - ] - - [SyncIndicator - | - +state: AsyncValue<T>; - +lastSynced: DateTime?; - +isDirty: bool; - +animationDuration: int; - +iconSize: double - ] - - [SyncIndicator]o-[<abstract>AsyncValue] - - [EmptyBody - | - +icon: IconData?; - +leading: Widget?; - +leadingSpacing: double?; - +title: String?; - +description: String?; - +button: Widget? - | - +Widget build() - ] - - [EmptyBody]o-[IconData] - [EmptyBody]o-[<abstract>Widget] - - [NullHelperDecoration - ] - - [InputDecoration]<:-[NullHelperDecoration] - - [Search - | - +onQueryChanged: dynamic Function(String); - +searchController: SearchController?; - +hintText: String?; - +initialText: String? - ] - - [Search]o-[dynamic Function(String)] - [Search]o-[SearchController] - - [SearchController - | - +setText: void Function(String) - ] - - [SearchController]o-[void Function(String)] - - [ConstrainedWidthFlexible - | - +minWidth: double; - +maxWidth: double; - +flex: int; - +flexSum: int; - +child: Widget; - +outerConstraints: BoxConstraints - | - +Widget build(); - -double _getWidth() - ] - - [ConstrainedWidthFlexible]o-[<abstract>Widget] - [ConstrainedWidthFlexible]o-[BoxConstraints] - - [AsyncValueWidget - | - +value: AsyncValue<T>; - +data: Widget Function(T); - +error: Widget Function(Object, StackTrace?)?; - +loading: Widget Function()?; - +empty: Widget Function()? - | - +Widget build(); - -Widget _buildDataOrEmptyWidget(); - -Widget _defaultError(); - -Widget _defaultLoad() - ] - - [AsyncValueWidget]o-[<abstract>AsyncValue] - [AsyncValueWidget]o-[Widget Function(T)] - [AsyncValueWidget]o-[Widget Function(Object, StackTrace?)?] - [AsyncValueWidget]o-[Widget Function()?] - - [ActionPopUpMenuButton - | - +actions: List<ModelAction<dynamic>>; - +triggerIconColor: Color?; - +triggerIconColorHover: Color?; - +triggerIconSize: double; - +disableSplashEffect: bool; - +hideOnEmpty: bool; - +orientation: Axis; - +elevation: double?; - +splashRadius: double?; - +enabled: bool; - +position: PopupMenuPosition - | - +Widget build(); - -Widget _buildPopupMenu() - ] - - [ActionPopUpMenuButton]o-[Color] - [ActionPopUpMenuButton]o-[Axis] - [ActionPopUpMenuButton]o-[PopupMenuPosition] - - [PrimaryButton - | - +text: String; - +icon: IconData?; - +isLoading: bool; - +showLoadingEarliestAfterMs: int; - +onPressed: void Function()?; - +tooltip: String; - +tooltipDisabled: String; - +enabled: bool; - +onPressedFuture: dynamic Function()?; - +innerPadding: EdgeInsets; - +minimumSize: Size?; - +isDisabled: bool - ] - - [PrimaryButton]o-[IconData] - [PrimaryButton]o-[void Function()?] - [PrimaryButton]o-[dynamic Function()?] - [PrimaryButton]o-[EdgeInsets] - [PrimaryButton]o-[Size] - - [Hyperlink - | - +text: String; - +url: String?; - +onClick: void Function()?; - +linkColor: Color; - +hoverColor: Color?; - +visitedColor: Color?; - +style: TextStyle?; - +hoverStyle: TextStyle?; - +visitedStyle: TextStyle?; - +icon: IconData?; - +iconSize: double? - ] - - [Hyperlink]o-[void Function()?] - [Hyperlink]o-[Color] - [Hyperlink]o-[TextStyle] - [Hyperlink]o-[IconData] - - [DismissButton - | - +onPressed: void Function()?; - +text: String? - | - +Widget build() - ] - - [DismissButton]o-[void Function()?] - - [FormTableRow - | - +label: String?; - +labelBuilder: Widget Function(BuildContext)?; - +labelStyle: TextStyle?; - +labelHelpText: String?; - +input: Widget; - +control: AbstractControl<dynamic>?; - +layout: FormTableRowLayout? - ] - - [FormTableRow]o-[Widget Function(BuildContext)?] - [FormTableRow]o-[TextStyle] - [FormTableRow]o-[<abstract>Widget] - [FormTableRow]o-[<abstract>AbstractControl] - [FormTableRow]o-[FormTableRowLayout] - - [FormTableLayout - | - +rows: List<FormTableRow>; - +columnWidths: Map<int, TableColumnWidth>; - +rowDivider: Widget?; - +rowLayout: FormTableRowLayout?; - +rowLabelStyle: TextStyle? - | - +Widget build() - ] - - [FormTableLayout]o-[<abstract>Widget] - [FormTableLayout]o-[FormTableRowLayout] - [FormTableLayout]o-[TextStyle] - - [FormSectionHeader - | - +title: String; - +titleTextStyle: TextStyle?; - +helpText: String?; - +divider: bool; - +helpTextDisabled: bool - | - +Widget build() - ] - - [FormSectionHeader]o-[TextStyle] - - [FormLabel - | - +labelText: String?; - +helpText: String?; - +labelTextStyle: TextStyle?; - +layout: FormTableRowLayout? - | - +Widget build() - ] - - [FormLabel]o-[TextStyle] - [FormLabel]o-[FormTableRowLayout] - - [FormTableRowLayout - | - +index: int; - <static>+values: List<FormTableRowLayout>; - <static>+vertical: FormTableRowLayout; - <static>+horizontal: FormTableRowLayout - ] - - [FormTableRowLayout]o-[FormTableRowLayout] - [Enum]<:--[FormTableRowLayout] - - [ActionMenuType - | - +index: int; - <static>+values: List<ActionMenuType>; - <static>+inline: ActionMenuType; - <static>+popup: ActionMenuType - ] - - [ActionMenuType]o-[ActionMenuType] - [Enum]<:--[ActionMenuType] - - [ReactiveCustomColorPicker - ] - - [ReactiveFormField]<:-[ReactiveCustomColorPicker] - - [NavbarTab - | - +title: String; - +intent: RoutingIntent?; - +index: int; - +enabled: bool - ] - - [NavbarTab]o-[RoutingIntent] - - [TabbedNavbar - | - +tabs: List<T>; - +selectedTab: T?; - +indicator: BoxDecoration?; - +height: double?; - +disabledBackgroundColor: Color?; - +disabledTooltipText: String?; - +onSelect: void Function(int, T)?; - +labelPadding: EdgeInsets?; - +labelSpacing: double?; - +indicatorSize: TabBarIndicatorSize?; - +isScrollable: bool; - +backgroundColor: Color?; - +labelColorHover: Color?; - +unselectedLabelColorHover: Color? - ] - - [TabbedNavbar]o-[BoxDecoration] - [TabbedNavbar]o-[Color] - [TabbedNavbar]o-[void Function(int, T)?] - [TabbedNavbar]o-[EdgeInsets] - [TabbedNavbar]o-[TabBarIndicatorSize] - - [Collapsible - | - +contentBuilder: Widget Function(BuildContext, bool); - +headerBuilder: Widget Function(BuildContext, bool)?; - +title: String?; - +isCollapsed: bool - ] - - [Collapsible]o-[Widget Function(BuildContext, bool)] - [Collapsible]o-[Widget Function(BuildContext, bool)?] - - [StudyULogo - | - +onTap: void Function()? - | - +Widget build() - ] - - [StudyULogo]o-[void Function()?] - - [FormSideSheetTab - | - +formViewBuilder: Widget Function(T) - ] - - [FormSideSheetTab]o-[Widget Function(T)] - [NavbarTab]<:-[FormSideSheetTab] - - [SidesheetTab - | - +builder: Widget Function(BuildContext) - ] - - [SidesheetTab]o-[Widget Function(BuildContext)] - [NavbarTab]<:-[SidesheetTab] - - [Sidesheet - | - <static>+kDefaultWidth: double; - +titleText: String; - +body: Widget?; - +tabs: List<SidesheetTab>?; - +actionButtons: List<Widget>?; - +width: double?; - +withCloseButton: bool; - +ignoreAppBar: bool; - +collapseSingleTab: bool; - +bodyPadding: EdgeInsets?; - +wrapContent: Widget Function(Widget)? - ] - - [Sidesheet]o-[<abstract>Widget] - [Sidesheet]o-[EdgeInsets] - [Sidesheet]o-[Widget Function(Widget)?] - - [MouseEventsRegion - | - +onTap: void Function()?; - +onHover: void Function(PointerHoverEvent)?; - +onEnter: void Function(PointerEnterEvent)?; - +onExit: void Function(PointerExitEvent)?; - +autoselectCursor: bool; - +cursor: SystemMouseCursor; - <static>+defaultCursor: SystemMouseCursor; - +autoCursor: SystemMouseCursor - ] - - [MouseEventsRegion]o-[void Function()?] - [MouseEventsRegion]o-[void Function(PointerHoverEvent)?] - [MouseEventsRegion]o-[void Function(PointerEnterEvent)?] - [MouseEventsRegion]o-[void Function(PointerExitEvent)?] - [MouseEventsRegion]o-[SystemMouseCursor] - - [FormControlLabel - | - +formControl: AbstractControl<dynamic>; - +text: String; - +isClickable: bool; - +textStyle: TextStyle?; - +onClick: void Function(AbstractControl<dynamic>)? - | - +Widget build() - ] - - [FormControlLabel]o-[<abstract>AbstractControl] - [FormControlLabel]o-[TextStyle] - [FormControlLabel]o-[void Function(AbstractControl<dynamic>)?] - - [<abstract>IWithBanner - | - +Widget? banner() - ] - - [BannerBox - | - +prefixIcon: Widget?; - +body: Widget; - +style: BannerStyle; - +padding: EdgeInsets?; - +noPrefix: bool; - +dismissable: bool; - +isDismissed: bool?; - +onDismissed: dynamic Function()?; - +dismissIconSize: double - ] - - [BannerBox]o-[<abstract>Widget] - [BannerBox]o-[BannerStyle] - [BannerBox]o-[EdgeInsets] - [BannerBox]o-[dynamic Function()?] - - [BannerStyle - | - +index: int; - <static>+values: List<BannerStyle>; - <static>+warning: BannerStyle; - <static>+info: BannerStyle; - <static>+error: BannerStyle - ] - - [BannerStyle]o-[BannerStyle] - [Enum]<:--[BannerStyle] - - [SecondaryButton - | - +text: String; - +icon: IconData?; - +isLoading: bool; - +onPressed: void Function()? - | - +Widget build() - ] - - [SecondaryButton]o-[IconData] - [SecondaryButton]o-[void Function()?] - - [IconPack - | - <static>+defaultPack: List<IconOption>; - <static>+material: List<IconOption> - | - <static>+IconOption? resolveIconByName() - ] - - [IconOption - | - +name: String; - +icon: IconData?; - +isEmpty: bool; - +props: List<Object?> - | - +String toJson(); - <static>+IconOption fromJson() - ] - - [IconOption]o-[IconData] - [<abstract>Equatable]<:-[IconOption] - - [ReactiveIconPicker - ] - - [ReactiveFocusableFormField]<:-[ReactiveIconPicker] - - [IconPicker - | - +iconOptions: List<IconOption>; - +selectedOption: IconOption?; - +onSelect: void Function(IconOption)?; - +galleryIconSize: double?; - +selectedIconSize: double?; - +focusNode: FocusNode?; - +isDisabled: bool - | - +Widget build() - ] - - [IconPicker]o-[IconOption] - [IconPicker]o-[void Function(IconOption)?] - [IconPicker]o-[FocusNode] - - [IconPickerField - | - +iconOptions: List<IconOption>; - +selectedOption: IconOption?; - +selectedIconSize: double?; - +galleryIconSize: double?; - +onSelect: void Function(IconOption)?; - +focusNode: FocusNode?; - +isDisabled: bool - | - +Widget build() - ] - - [IconPickerField]o-[IconOption] - [IconPickerField]o-[void Function(IconOption)?] - [IconPickerField]o-[FocusNode] - - [IconPickerGallery - | - +iconOptions: List<IconOption>; - +onSelect: void Function(IconOption)?; - +iconSize: double - | - +Widget build() - ] - - [IconPickerGallery]o-[void Function(IconOption)?] - - [SingleColumnLayout - | - <static>+defaultConstraints: BoxConstraints; - <static>+defaultConstraintsNarrow: BoxConstraints; - +body: Widget; - +header: Widget?; - +stickyHeader: bool; - +constraints: BoxConstraints?; - +scroll: bool; - +padding: EdgeInsets? - | - <static>+dynamic fromType() - ] - - [SingleColumnLayout]o-[BoxConstraints] - [SingleColumnLayout]o-[<abstract>Widget] - [SingleColumnLayout]o-[EdgeInsets] - - [SingleColumnLayoutType - | - +index: int; - <static>+values: List<SingleColumnLayoutType>; - <static>+boundedWide: SingleColumnLayoutType; - <static>+boundedNarrow: SingleColumnLayoutType; - <static>+stretched: SingleColumnLayoutType; - <static>+split: SingleColumnLayoutType - ] - - [SingleColumnLayoutType]o-[SingleColumnLayoutType] - [Enum]<:--[SingleColumnLayoutType] - - [<abstract>FormConsumerWidget - | - +Widget build() - ] - - [<abstract>FormConsumerRefWidget - | - +Widget build() - ] - - [FormScaffold - | - +formViewModel: T; - +actions: List<Widget>?; - +body: Widget; - +drawer: Widget?; - +actionsSpacing: double; - +actionsPadding: double - ] - - [FormScaffold]o-[<abstract>Widget] - - [StandardDialog - | - +title: Widget?; - +titleText: String?; - +body: Widget; - +actionButtons: List<Widget>; - +backgroundColor: Color?; - +borderRadius: double?; - +width: double?; - +height: double?; - +minWidth: double; - +minHeight: double; - +maxWidth: double?; - +maxHeight: double?; - +padding: EdgeInsets - | - +Widget build() - ] - - [StandardDialog]o-[<abstract>Widget] - [StandardDialog]o-[Color] - [StandardDialog]o-[EdgeInsets] - - [HtmlStylingBanner - | - +isDismissed: bool; - +onDismissed: dynamic Function()? - | - +Widget build() - ] - - [HtmlStylingBanner]o-[dynamic Function()?] - - [StandardTableColumn - | - +label: String; - +tooltip: String?; - +columnWidth: TableColumnWidth; - +sortable: bool; - +sortAscending: bool?; - +sortableIcon: Widget? - ] - - [StandardTableColumn]o-[<abstract>TableColumnWidth] - [StandardTableColumn]o-[<abstract>Widget] - - [StandardTable - | - +items: List<T>; - +inputColumns: List<StandardTableColumn>; - +onSelectItem: void Function(T); - +trailingActionsAt: List<ModelAction<dynamic>> Function(T, int)?; - +trailingActionsMenuType: ActionMenuType?; - +sortColumnPredicates: List<int Function(T, T)?>?; - +pinnedPredicates: int Function(T, T)?; - +headerRowBuilder: TableRow Function(BuildContext, List<StandardTableColumn>)?; - +dataRowBuilder: TableRow Function(BuildContext, List<StandardTableColumn>)?; - +inputTrailingActionsColumn: StandardTableColumn; - +tableWrapper: Widget Function(Widget)?; - +cellSpacing: double; - +rowSpacing: double; - +minRowHeight: double?; - +showTableHeader: bool; - +hideLeadingTrailingWhenEmpty: bool; - +leadingWidget: Widget?; - +trailingWidget: Widget?; - +leadingWidgetSpacing: double?; - +trailingWidgetSpacing: double?; - +emptyWidget: Widget?; - +rowStyle: StandardTableStyle; - +disableRowInteractions: bool - ] - - [StandardTable]o-[void Function(T)] - [StandardTable]o-[List<ModelAction<dynamic>> Function(T, int)?] - [StandardTable]o-[ActionMenuType] - [StandardTable]o-[int Function(T, T)?] - [StandardTable]o-[TableRow Function(BuildContext, List<StandardTableColumn>)?] - [StandardTable]o-[StandardTableColumn] - [StandardTable]o-[Widget Function(Widget)?] - [StandardTable]o-[<abstract>Widget] - [StandardTable]o-[StandardTableStyle] - - [StandardTableStyle - | - +index: int; - <static>+values: List<StandardTableStyle>; - <static>+plain: StandardTableStyle; - <static>+material: StandardTableStyle - ] - - [StandardTableStyle]o-[StandardTableStyle] - [Enum]<:--[StandardTableStyle] - - [TwoColumnLayout - | - <static>+defaultDivider: VerticalDivider; - <static>+defaultContentPadding: EdgeInsets; - <static>+slimContentPadding: EdgeInsets; - +leftWidget: Widget; - +rightWidget: Widget; - +dividerWidget: Widget?; - +headerWidget: Widget?; - +flexLeft: int?; - +flexRight: int?; - +constraintsLeft: BoxConstraints?; - +constraintsRight: BoxConstraints?; - +scrollLeft: bool; - +scrollRight: bool; - +paddingLeft: EdgeInsets?; - +paddingRight: EdgeInsets?; - +backgroundColorLeft: Color?; - +backgroundColorRight: Color?; - +stretchHeight: bool - ] - - [TwoColumnLayout]o-[VerticalDivider] - [TwoColumnLayout]o-[EdgeInsets] - [TwoColumnLayout]o-[<abstract>Widget] - [TwoColumnLayout]o-[BoxConstraints] - [TwoColumnLayout]o-[Color] - - [ActionMenuInline - | - +actions: List<ModelAction<dynamic>>; - +iconSize: double?; - +visible: bool; - +splashRadius: double?; - +paddingVertical: double?; - +paddingHorizontal: double? - | - +Widget build() - ] - - [TextParagraph - | - +text: String?; - +style: TextStyle?; - +selectable: bool; - +span: List<TextSpan>? - | - +Widget build() - ] - - [TextParagraph]o-[TextStyle] - - [SplashPage - | - +Widget build() - ] - - [ErrorPage - | - +error: Exception? - | - +Widget build() - ] - - [<abstract>ConsumerWidget]<:-[ErrorPage] - - [Badge - | - +icon: IconData?; - +color: Color?; - +borderRadius: double; - +label: String; - +type: BadgeType; - +padding: EdgeInsets; - +iconSize: double?; - +labelStyle: TextStyle?; - +center: bool - | - +Widget build(); - -Color? _getBackgroundColor(); - -Color _getBorderColor(); - -Color? _getLabelColor() - ] - - [Badge]o-[IconData] - [Badge]o-[Color] - [Badge]o-[BadgeType] - [Badge]o-[EdgeInsets] - [Badge]o-[TextStyle] - - [BadgeType - | - +index: int; - <static>+values: List<BadgeType>; - <static>+filled: BadgeType; - <static>+outlined: BadgeType; - <static>+outlineFill: BadgeType; - <static>+plain: BadgeType - ] - - [BadgeType]o-[BadgeType] - [Enum]<:--[BadgeType] - - [IndicatorRangeSliderThumbShape - | - +buildContext: BuildContext; - +start: T; - +end: T - | - +Size getPreferredSize(); - +void paint() - ] - - [IndicatorRangeSliderThumbShape]o-[<abstract>BuildContext] - [<abstract>RangeSliderThumbShape]<:-[IndicatorRangeSliderThumbShape] - - [HelpIcon - | - +tooltipText: String? - | - +Widget build() - ] - - [UnderConstruction - | - +Widget build() - ] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ISyncIndicatorViewModel - - - - - - +isDirty: bool - +lastSynced: DateTime? - - - - - - - - - - - - SyncIndicator - - - - - - +state: AsyncValue<T> - +lastSynced: DateTime? - +isDirty: bool - +animationDuration: int - +iconSize: double - - - - - - - - - - - AsyncValue - - - - - - - - - - - - - EmptyBody - - - - - - +icon: IconData? - +leading: Widget? - +leadingSpacing: double? - +title: String? - +description: String? - +button: Widget? - - - - - - +Widget build() - - - - - - - - - - - IconData - - - - - - - - - - - Widget - - - - - - - - - - - NullHelperDecoration - - - - - - - - - - - InputDecoration - - - - - - - - - - - - Search - - - - - - +onQueryChanged: dynamic Function(String) - +searchController: SearchController? - +hintText: String? - +initialText: String? - - - - - - - - - - - dynamic Function(String) - - - - - - - - - - - - SearchController - - - - - - +setText: void Function(String) - - - - - - - - - - - void Function(String) - - - - - - - - - - - - - ConstrainedWidthFlexible - - - - - - +minWidth: double - +maxWidth: double - +flex: int - +flexSum: int - +child: Widget - +outerConstraints: BoxConstraints - - - - - - +Widget build() - -double _getWidth() - - - - - - - - - - - BoxConstraints - - - - - - - - - - - - - AsyncValueWidget - - - - - - +value: AsyncValue<T> - +data: Widget Function(T) - +error: Widget Function(Object, StackTrace?)? - +loading: Widget Function()? - +empty: Widget Function()? - - - - - - +Widget build() - -Widget _buildDataOrEmptyWidget() - -Widget _defaultError() - -Widget _defaultLoad() - - - - - - - - - - - Widget Function(T) - - - - - - - - - - - Widget Function(Object, StackTrace?)? - - - - - - - - - - - Widget Function()? - - - - - - - - - - - - - ActionPopUpMenuButton - - - - - - +actions: List<ModelAction<dynamic>> - +triggerIconColor: Color? - +triggerIconColorHover: Color? - +triggerIconSize: double - +disableSplashEffect: bool - +hideOnEmpty: bool - +orientation: Axis - +elevation: double? - +splashRadius: double? - +enabled: bool - +position: PopupMenuPosition - - - - - - +Widget build() - -Widget _buildPopupMenu() - - - - - - - - - - - Color - - - - - - - - - - - Axis - - - - - - - - - - - PopupMenuPosition - - - - - - - - - - - - PrimaryButton - - - - - - +text: String - +icon: IconData? - +isLoading: bool - +showLoadingEarliestAfterMs: int - +onPressed: void Function()? - +tooltip: String - +tooltipDisabled: String - +enabled: bool - +onPressedFuture: dynamic Function()? - +innerPadding: EdgeInsets - +minimumSize: Size? - +isDisabled: bool - - - - - - - - - - - void Function()? - - - - - - - - - - - dynamic Function()? - - - - - - - - - - - EdgeInsets - - - - - - - - - - - Size - - - - - - - - - - - - Hyperlink - - - - - - +text: String - +url: String? - +onClick: void Function()? - +linkColor: Color - +hoverColor: Color? - +visitedColor: Color? - +style: TextStyle? - +hoverStyle: TextStyle? - +visitedStyle: TextStyle? - +icon: IconData? - +iconSize: double? - - - - - - - - - - - TextStyle - - - - - - - - - - - - - DismissButton - - - - - - +onPressed: void Function()? - +text: String? - - - - - - +Widget build() - - - - - - - - - - - - FormTableRow - - - - - - +label: String? - +labelBuilder: Widget Function(BuildContext)? - +labelStyle: TextStyle? - +labelHelpText: String? - +input: Widget - +control: AbstractControl<dynamic>? - +layout: FormTableRowLayout? - - - - - - - - - - - Widget Function(BuildContext)? - - - - - - - - - - - AbstractControl - - - - - - - - - - - - FormTableRowLayout - - - - - - +index: int - <static>+values: List<FormTableRowLayout> - <static>+vertical: FormTableRowLayout - <static>+horizontal: FormTableRowLayout - - - - - - - - - - - - - FormTableLayout - - - - - - +rows: List<FormTableRow> - +columnWidths: Map<int, TableColumnWidth> - +rowDivider: Widget? - +rowLayout: FormTableRowLayout? - +rowLabelStyle: TextStyle? - - - - - - +Widget build() - - - - - - - - - - - - - FormSectionHeader - - - - - - +title: String - +titleTextStyle: TextStyle? - +helpText: String? - +divider: bool - +helpTextDisabled: bool - - - - - - +Widget build() - - - - - - - - - - - - - FormLabel - - - - - - +labelText: String? - +helpText: String? - +labelTextStyle: TextStyle? - +layout: FormTableRowLayout? - - - - - - +Widget build() - - - - - - - - - - - Enum - - - - - - - - - - - - ActionMenuType - - - - - - +index: int - <static>+values: List<ActionMenuType> - <static>+inline: ActionMenuType - <static>+popup: ActionMenuType - - - - - - - - - - - ReactiveCustomColorPicker - - - - - - - - - - - ReactiveFormField - - - - - - - - - - - - NavbarTab - - - - - - +title: String - +intent: RoutingIntent? - +index: int - +enabled: bool - - - - - - - - - - - RoutingIntent - - - - - - - - - - - - TabbedNavbar - - - - - - +tabs: List<T> - +selectedTab: T? - +indicator: BoxDecoration? - +height: double? - +disabledBackgroundColor: Color? - +disabledTooltipText: String? - +onSelect: void Function(int, T)? - +labelPadding: EdgeInsets? - +labelSpacing: double? - +indicatorSize: TabBarIndicatorSize? - +isScrollable: bool - +backgroundColor: Color? - +labelColorHover: Color? - +unselectedLabelColorHover: Color? - - - - - - - - - - - BoxDecoration - - - - - - - - - - - void Function(int, T)? - - - - - - - - - - - TabBarIndicatorSize - - - - - - - - - - - - Collapsible - - - - - - +contentBuilder: Widget Function(BuildContext, bool) - +headerBuilder: Widget Function(BuildContext, bool)? - +title: String? - +isCollapsed: bool - - - - - - - - - - - Widget Function(BuildContext, bool) - - - - - - - - - - - Widget Function(BuildContext, bool)? - - - - - - - - - - - - - StudyULogo - - - - - - +onTap: void Function()? - - - - - - +Widget build() - - - - - - - - - - - - FormSideSheetTab - - - - - - +formViewBuilder: Widget Function(T) - - - - - - - - - - - - SidesheetTab - - - - - - +builder: Widget Function(BuildContext) - - - - - - - - - - - Widget Function(BuildContext) - - - - - - - - - - - - Sidesheet - - - - - - <static>+kDefaultWidth: double - +titleText: String - +body: Widget? - +tabs: List<SidesheetTab>? - +actionButtons: List<Widget>? - +width: double? - +withCloseButton: bool - +ignoreAppBar: bool - +collapseSingleTab: bool - +bodyPadding: EdgeInsets? - +wrapContent: Widget Function(Widget)? - - - - - - - - - - - Widget Function(Widget)? - - - - - - - - - - - - MouseEventsRegion - - - - - - +onTap: void Function()? - +onHover: void Function(PointerHoverEvent)? - +onEnter: void Function(PointerEnterEvent)? - +onExit: void Function(PointerExitEvent)? - +autoselectCursor: bool - +cursor: SystemMouseCursor - <static>+defaultCursor: SystemMouseCursor - +autoCursor: SystemMouseCursor - - - - - - - - - - - void Function(PointerHoverEvent)? - - - - - - - - - - - void Function(PointerEnterEvent)? - - - - - - - - - - - void Function(PointerExitEvent)? - - - - - - - - - - - SystemMouseCursor - - - - - - - - - - - - - FormControlLabel - - - - - - +formControl: AbstractControl<dynamic> - +text: String - +isClickable: bool - +textStyle: TextStyle? - +onClick: void Function(AbstractControl<dynamic>)? - - - - - - +Widget build() - - - - - - - - - - - void Function(AbstractControl<dynamic>)? - - - - - - - - - - - - IWithBanner - - - - - - +Widget? banner() - - - - - - - - - - - - BannerBox - - - - - - +prefixIcon: Widget? - +body: Widget - +style: BannerStyle - +padding: EdgeInsets? - +noPrefix: bool - +dismissable: bool - +isDismissed: bool? - +onDismissed: dynamic Function()? - +dismissIconSize: double - - - - - - - - - - - - BannerStyle - - - - - - +index: int - <static>+values: List<BannerStyle> - <static>+warning: BannerStyle - <static>+info: BannerStyle - <static>+error: BannerStyle - - - - - - - - - - - - - SecondaryButton - - - - - - +text: String - +icon: IconData? - +isLoading: bool - +onPressed: void Function()? - - - - - - +Widget build() - - - - - - - - - - - - - IconPack - - - - - - <static>+defaultPack: List<IconOption> - <static>+material: List<IconOption> - - - - - - <static>+IconOption? resolveIconByName() - - - - - - - - - - - - - IconOption - - - - - - +name: String - +icon: IconData? - +isEmpty: bool - +props: List<Object?> - - - - - - +String toJson() - <static>+IconOption fromJson() - - - - - - - - - - - Equatable - - - - - - - - - - - ReactiveIconPicker - - - - - - - - - - - ReactiveFocusableFormField - - - - - - - - - - - - - IconPicker - - - - - - +iconOptions: List<IconOption> - +selectedOption: IconOption? - +onSelect: void Function(IconOption)? - +galleryIconSize: double? - +selectedIconSize: double? - +focusNode: FocusNode? - +isDisabled: bool - - - - - - +Widget build() - - - - - - - - - - - void Function(IconOption)? - - - - - - - - - - - FocusNode - - - - - - - - - - - - - IconPickerField - - - - - - +iconOptions: List<IconOption> - +selectedOption: IconOption? - +selectedIconSize: double? - +galleryIconSize: double? - +onSelect: void Function(IconOption)? - +focusNode: FocusNode? - +isDisabled: bool - - - - - - +Widget build() - - - - - - - - - - - - - IconPickerGallery - - - - - - +iconOptions: List<IconOption> - +onSelect: void Function(IconOption)? - +iconSize: double - - - - - - +Widget build() - - - - - - - - - - - - - SingleColumnLayout - - - - - - <static>+defaultConstraints: BoxConstraints - <static>+defaultConstraintsNarrow: BoxConstraints - +body: Widget - +header: Widget? - +stickyHeader: bool - +constraints: BoxConstraints? - +scroll: bool - +padding: EdgeInsets? - - - - - - <static>+dynamic fromType() - - - - - - - - - - - - SingleColumnLayoutType - - - - - - +index: int - <static>+values: List<SingleColumnLayoutType> - <static>+boundedWide: SingleColumnLayoutType - <static>+boundedNarrow: SingleColumnLayoutType - <static>+stretched: SingleColumnLayoutType - <static>+split: SingleColumnLayoutType - - - - - - - - - - - - FormConsumerWidget - - - - - - +Widget build() - - - - - - - - - - - - FormConsumerRefWidget - - - - - - +Widget build() - - - - - - - - - - - - FormScaffold - - - - - - +formViewModel: T - +actions: List<Widget>? - +body: Widget - +drawer: Widget? - +actionsSpacing: double - +actionsPadding: double - - - - - - - - - - - - - StandardDialog - - - - - - +title: Widget? - +titleText: String? - +body: Widget - +actionButtons: List<Widget> - +backgroundColor: Color? - +borderRadius: double? - +width: double? - +height: double? - +minWidth: double - +minHeight: double - +maxWidth: double? - +maxHeight: double? - +padding: EdgeInsets - - - - - - +Widget build() - - - - - - - - - - - - - HtmlStylingBanner - - - - - - +isDismissed: bool - +onDismissed: dynamic Function()? - - - - - - +Widget build() - - - - - - - - - - - - StandardTableColumn - - - - - - +label: String - +tooltip: String? - +columnWidth: TableColumnWidth - +sortable: bool - +sortAscending: bool? - +sortableIcon: Widget? - - - - - - - - - - - TableColumnWidth - - - - - - - - - - - - StandardTable - - - - - - +items: List<T> - +inputColumns: List<StandardTableColumn> - +onSelectItem: void Function(T) - +trailingActionsAt: List<ModelAction<dynamic>> Function(T, int)? - +trailingActionsMenuType: ActionMenuType? - +sortColumnPredicates: List<int Function(T, T)?>? - +pinnedPredicates: int Function(T, T)? - +headerRowBuilder: TableRow Function(BuildContext, List<StandardTableColumn>)? - +dataRowBuilder: TableRow Function(BuildContext, List<StandardTableColumn>)? - +inputTrailingActionsColumn: StandardTableColumn - +tableWrapper: Widget Function(Widget)? - +cellSpacing: double - +rowSpacing: double - +minRowHeight: double? - +showTableHeader: bool - +hideLeadingTrailingWhenEmpty: bool - +leadingWidget: Widget? - +trailingWidget: Widget? - +leadingWidgetSpacing: double? - +trailingWidgetSpacing: double? - +emptyWidget: Widget? - +rowStyle: StandardTableStyle - +disableRowInteractions: bool - - - - - - - - - - - void Function(T) - - - - - - - - - - - List<ModelAction<dynamic>> Function(T, int)? - - - - - - - - - - - int Function(T, T)? - - - - - - - - - - - TableRow Function(BuildContext, List<StandardTableColumn>)? - - - - - - - - - - - - StandardTableStyle - - - - - - +index: int - <static>+values: List<StandardTableStyle> - <static>+plain: StandardTableStyle - <static>+material: StandardTableStyle - - - - - - - - - - - - TwoColumnLayout - - - - - - <static>+defaultDivider: VerticalDivider - <static>+defaultContentPadding: EdgeInsets - <static>+slimContentPadding: EdgeInsets - +leftWidget: Widget - +rightWidget: Widget - +dividerWidget: Widget? - +headerWidget: Widget? - +flexLeft: int? - +flexRight: int? - +constraintsLeft: BoxConstraints? - +constraintsRight: BoxConstraints? - +scrollLeft: bool - +scrollRight: bool - +paddingLeft: EdgeInsets? - +paddingRight: EdgeInsets? - +backgroundColorLeft: Color? - +backgroundColorRight: Color? - +stretchHeight: bool - - - - - - - - - - - VerticalDivider - - - - - - - - - - - - - ActionMenuInline - - - - - - +actions: List<ModelAction<dynamic>> - +iconSize: double? - +visible: bool - +splashRadius: double? - +paddingVertical: double? - +paddingHorizontal: double? - - - - - - +Widget build() - - - - - - - - - - - - - TextParagraph - - - - - - +text: String? - +style: TextStyle? - +selectable: bool - +span: List<TextSpan>? - - - - - - +Widget build() - - - - - - - - - - - - SplashPage - - - - - - +Widget build() - - - - - - - - - - - - - ErrorPage - - - - - - +error: Exception? - - - - - - +Widget build() - - - - - - - - - - - ConsumerWidget - - - - - - - - - - - - - Badge - - - - - - +icon: IconData? - +color: Color? - +borderRadius: double - +label: String - +type: BadgeType - +padding: EdgeInsets - +iconSize: double? - +labelStyle: TextStyle? - +center: bool - - - - - - +Widget build() - -Color? _getBackgroundColor() - -Color _getBorderColor() - -Color? _getLabelColor() - - - - - - - - - - - - BadgeType - - - - - - +index: int - <static>+values: List<BadgeType> - <static>+filled: BadgeType - <static>+outlined: BadgeType - <static>+outlineFill: BadgeType - <static>+plain: BadgeType - - - - - - - - - - - - - IndicatorRangeSliderThumbShape - - - - - - +buildContext: BuildContext - +start: T - +end: T - - - - - - +Size getPreferredSize() - +void paint() - - - - - - - - - - - BuildContext - - - - - - - - - - - RangeSliderThumbShape - - - - - - - - - - - - - HelpIcon - - - - - - +tooltipText: String? - - - - - - +Widget build() - - - - - - - - - - - - UnderConstruction - - - - - - +Widget build() - - - - - - - - - \ No newline at end of file diff --git a/docs/uml/designer_v2/lib/domain/uml.svg b/docs/uml/designer_v2/lib/domain/uml.svg deleted file mode 100644 index 6959fd20f..000000000 --- a/docs/uml/designer_v2/lib/domain/uml.svg +++ /dev/null @@ -1,229 +0,0 @@ - - [<abstract>ResultTypes - ] - - [MeasurementResultTypes - | - <static>+questionnaire: String; - <static>+values: List<String> - ] - - [<abstract>ResultTypes]<:-[MeasurementResultTypes] - - [InterventionResultTypes - | - <static>+checkmarkTask: String; - <static>+values: List<String> - ] - - [<abstract>ResultTypes]<:-[InterventionResultTypes] - - [StudyExportData - | - +study: Study; - +measurementsData: List<Map<String, dynamic>>; - +interventionsData: List<Map<String, dynamic>>; - +mediaData: List<String>; - +isEmpty: bool - ] - - [StudyExportData]o-[Study] - - [StudyTemplates - | - <static>+kUnnamedStudyTitle: String - | - <static>+Study emptyDraft() - ] - - [StudyActionType - | - +index: int; - <static>+values: List<StudyActionType>; - <static>+pin: StudyActionType; - <static>+pinoff: StudyActionType; - <static>+edit: StudyActionType; - <static>+duplicate: StudyActionType; - <static>+duplicateDraft: StudyActionType; - <static>+addCollaborator: StudyActionType; - <static>+export: StudyActionType; - <static>+delete: StudyActionType - ] - - [StudyActionType]o-[StudyActionType] - [Enum]<:--[StudyActionType] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ResultTypes - - - - - - - - - - - - MeasurementResultTypes - - - - - - <static>+questionnaire: String - <static>+values: List<String> - - - - - - - - - - - - InterventionResultTypes - - - - - - <static>+checkmarkTask: String - <static>+values: List<String> - - - - - - - - - - - - StudyExportData - - - - - - +study: Study - +measurementsData: List<Map<String, dynamic>> - +interventionsData: List<Map<String, dynamic>> - +mediaData: List<String> - +isEmpty: bool - - - - - - - - - - - Study - - - - - - - - - - - - - StudyTemplates - - - - - - <static>+kUnnamedStudyTitle: String - - - - - - <static>+Study emptyDraft() - - - - - - - - - - - - StudyActionType - - - - - - +index: int - <static>+values: List<StudyActionType> - <static>+pin: StudyActionType - <static>+pinoff: StudyActionType - <static>+edit: StudyActionType - <static>+duplicate: StudyActionType - <static>+duplicateDraft: StudyActionType - <static>+addCollaborator: StudyActionType - <static>+export: StudyActionType - <static>+delete: StudyActionType - - - - - - - - - - - Enum - - - - - - - - - \ No newline at end of file diff --git a/docs/uml/designer_v2/lib/features/account/uml.svg b/docs/uml/designer_v2/lib/features/account/uml.svg deleted file mode 100644 index 732599e0e..000000000 --- a/docs/uml/designer_v2/lib/features/account/uml.svg +++ /dev/null @@ -1,52 +0,0 @@ - - [AccountSettingsDialog - | - +Widget build() - ] - - [<abstract>ConsumerWidget]<:-[AccountSettingsDialog] - - - - - - - - - - - - - - - - - - - AccountSettingsDialog - - - - - - +Widget build() - - - - - - - - - - - ConsumerWidget - - - - - - - - - \ No newline at end of file diff --git a/docs/uml/designer_v2/lib/features/analyze/uml.svg b/docs/uml/designer_v2/lib/features/analyze/uml.svg deleted file mode 100644 index eae674115..000000000 --- a/docs/uml/designer_v2/lib/features/analyze/uml.svg +++ /dev/null @@ -1,92 +0,0 @@ - - [StudyAnalyzeScreen - | - +Widget? banner(); - +Widget build() - ] - - [<abstract>StudyPageWidget]<:-[StudyAnalyzeScreen] - - [StudyAnalyzeController - | - +dynamic onExport() - ] - - [StudyBaseController]<:-[StudyAnalyzeController] - - - - - - - - - - - - - - - - - - - - - StudyAnalyzeScreen - - - - - - +Widget? banner() - +Widget build() - - - - - - - - - - - StudyPageWidget - - - - - - - - - - - - StudyAnalyzeController - - - - - - +dynamic onExport() - - - - - - - - - - - StudyBaseController - - - - - - - - - \ No newline at end of file diff --git a/docs/uml/designer_v2/lib/features/auth/uml.svg b/docs/uml/designer_v2/lib/features/auth/uml.svg deleted file mode 100644 index dc5d87f42..000000000 --- a/docs/uml/designer_v2/lib/features/auth/uml.svg +++ /dev/null @@ -1,650 +0,0 @@ - - [StudyUJobsToBeDone - | - +Widget build() - ] - - [LoginForm - | - +formKey: AuthFormKey - | - +Widget build() - ] - - [LoginForm]o-[AuthFormKey] - [<abstract>FormConsumerRefWidget]<:-[LoginForm] - - [PasswordForgotForm - | - +formKey: AuthFormKey - | - +Widget build() - ] - - [PasswordForgotForm]o-[AuthFormKey] - [<abstract>FormConsumerRefWidget]<:-[PasswordForgotForm] - - [AuthFormController - | - +authRepository: IAuthRepository; - +sharedPreferences: SharedPreferences; - +notificationService: INotificationService; - +router: GoRouter; - +emailControl: FormControl<String>; - +passwordControl: FormControl<String>; - +passwordConfirmationControl: FormControl<String>; - +rememberMeControl: FormControl<bool>; - +termsOfServiceControl: FormControl<bool>; - <static>+authValidationMessages: Map<String, String Function(dynamic)>; - +loginForm: FormGroup; - +signupForm: FormGroup; - +passwordForgotForm: FormGroup; - +passwordRecoveryForm: FormGroup; - +controlValidatorsByForm: Map<AuthFormKey, Map<FormControl<dynamic>, List<Validator<dynamic>>>>; - -_formKey: AuthFormKey; - +shouldRemember: bool; - +formKey: AuthFormKey; - +form: FormGroup - | - -dynamic _getFormFor(); - -dynamic _onChangeFormKey(); - +dynamic resetControlsFor(); - -dynamic _forceValidationMessages(); - +dynamic signUp(); - -dynamic _signUp(); - +dynamic signIn(); - -dynamic _signInWith(); - +dynamic signOut(); - +dynamic resetPasswordForEmail(); - +dynamic sendPasswordResetLink(); - +dynamic recoverPassword(); - +dynamic updateUser(); - -dynamic _readDebugUser(); - -void _setRememberMe(); - -void _delRememberMe(); - -void _initRememberMe() - ] - - [AuthFormController]o-[<abstract>IAuthRepository] - [AuthFormController]o-[SharedPreferences] - [AuthFormController]o-[<abstract>INotificationService] - [AuthFormController]o-[GoRouter] - [AuthFormController]o-[FormControl] - [AuthFormController]o-[FormGroup] - [AuthFormController]o-[AuthFormKey] - [<abstract>IFormGroupController]<:--[AuthFormController] - - [AuthFormKey - | - +index: int; - <static>+values: List<AuthFormKey>; - <static>+login: AuthFormKey; - <static>+signup: AuthFormKey; - <static>+passwordForgot: AuthFormKey; - <static>+passwordRecovery: AuthFormKey; - <static>-_loginSubmit: AuthFormKey; - <static>-_signupSubmit: AuthFormKey - ] - - [AuthFormKey]o-[AuthFormKey] - [Enum]<:--[AuthFormKey] - - [EmailTextField - | - +labelText: String; - +hintText: String?; - +formControlName: String?; - +formControl: FormControl<dynamic>? - ] - - [EmailTextField]o-[FormControl] - - [PasswordTextField - | - +labelText: String; - +hintText: String?; - +onSubmitted: dynamic Function(FormControl<dynamic>)?; - +formControlName: String?; - +formControl: FormControl<dynamic>? - ] - - [PasswordTextField]o-[dynamic Function(FormControl<dynamic>)?] - [PasswordTextField]o-[FormControl] - - [AuthScaffold - | - +body: Widget; - +formKey: AuthFormKey; - +leftContentMinWidth: double; - +leftPanelMinWidth: double; - +leftPanelPadding: EdgeInsets - ] - - [AuthScaffold]o-[<abstract>Widget] - [AuthScaffold]o-[AuthFormKey] - [AuthScaffold]o-[EdgeInsets] - - [SignupForm - | - +formKey: AuthFormKey - | - +Widget build(); - -dynamic _onClickTermsOfUse(); - -dynamic _onClickPrivacyPolicy() - ] - - [SignupForm]o-[AuthFormKey] - [<abstract>FormConsumerRefWidget]<:-[SignupForm] - - [PasswordRecoveryForm - | - +formKey: AuthFormKey - | - +Widget build() - ] - - [PasswordRecoveryForm]o-[AuthFormKey] - [<abstract>FormConsumerRefWidget]<:-[PasswordRecoveryForm] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - StudyUJobsToBeDone - - - - - - +Widget build() - - - - - - - - - - - - - LoginForm - - - - - - +formKey: AuthFormKey - - - - - - +Widget build() - - - - - - - - - - - - AuthFormKey - - - - - - +index: int - <static>+values: List<AuthFormKey> - <static>+login: AuthFormKey - <static>+signup: AuthFormKey - <static>+passwordForgot: AuthFormKey - <static>+passwordRecovery: AuthFormKey - <static>-_loginSubmit: AuthFormKey - <static>-_signupSubmit: AuthFormKey - - - - - - - - - - - FormConsumerRefWidget - - - - - - - - - - - - - PasswordForgotForm - - - - - - +formKey: AuthFormKey - - - - - - +Widget build() - - - - - - - - - - - - - AuthFormController - - - - - - +authRepository: IAuthRepository - +sharedPreferences: SharedPreferences - +notificationService: INotificationService - +router: GoRouter - +emailControl: FormControl<String> - +passwordControl: FormControl<String> - +passwordConfirmationControl: FormControl<String> - +rememberMeControl: FormControl<bool> - +termsOfServiceControl: FormControl<bool> - <static>+authValidationMessages: Map<String, String Function(dynamic)> - +loginForm: FormGroup - +signupForm: FormGroup - +passwordForgotForm: FormGroup - +passwordRecoveryForm: FormGroup - +controlValidatorsByForm: Map<AuthFormKey, Map<FormControl<dynamic>, List<Validator<dynamic>>>> - -_formKey: AuthFormKey - +shouldRemember: bool - +formKey: AuthFormKey - +form: FormGroup - - - - - - -dynamic _getFormFor() - -dynamic _onChangeFormKey() - +dynamic resetControlsFor() - -dynamic _forceValidationMessages() - +dynamic signUp() - -dynamic _signUp() - +dynamic signIn() - -dynamic _signInWith() - +dynamic signOut() - +dynamic resetPasswordForEmail() - +dynamic sendPasswordResetLink() - +dynamic recoverPassword() - +dynamic updateUser() - -dynamic _readDebugUser() - -void _setRememberMe() - -void _delRememberMe() - -void _initRememberMe() - - - - - - - - - - - IAuthRepository - - - - - - - - - - - SharedPreferences - - - - - - - - - - - INotificationService - - - - - - - - - - - GoRouter - - - - - - - - - - - FormControl - - - - - - - - - - - FormGroup - - - - - - - - - - - IFormGroupController - - - - - - - - - - - Enum - - - - - - - - - - - - EmailTextField - - - - - - +labelText: String - +hintText: String? - +formControlName: String? - +formControl: FormControl<dynamic>? - - - - - - - - - - - - PasswordTextField - - - - - - +labelText: String - +hintText: String? - +onSubmitted: dynamic Function(FormControl<dynamic>)? - +formControlName: String? - +formControl: FormControl<dynamic>? - - - - - - - - - - - dynamic Function(FormControl<dynamic>)? - - - - - - - - - - - - AuthScaffold - - - - - - +body: Widget - +formKey: AuthFormKey - +leftContentMinWidth: double - +leftPanelMinWidth: double - +leftPanelPadding: EdgeInsets - - - - - - - - - - - Widget - - - - - - - - - - - EdgeInsets - - - - - - - - - - - - - SignupForm - - - - - - +formKey: AuthFormKey - - - - - - +Widget build() - -dynamic _onClickTermsOfUse() - -dynamic _onClickPrivacyPolicy() - - - - - - - - - - - - - PasswordRecoveryForm - - - - - - +formKey: AuthFormKey - - - - - - +Widget build() - - - - - - - - - \ No newline at end of file diff --git a/docs/uml/designer_v2/lib/features/dashboard/uml.svg b/docs/uml/designer_v2/lib/features/dashboard/uml.svg deleted file mode 100644 index 74b4061b4..000000000 --- a/docs/uml/designer_v2/lib/features/dashboard/uml.svg +++ /dev/null @@ -1,648 +0,0 @@ - - [StudiesTableColumnHeader - | - +title: String; - +sortable: bool; - +sortAscending: bool; - +sortingActive: bool; - +onSort: void Function()? - ] - - [StudiesTableColumnHeader]o-[void Function()?] - - [DashboardScaffold - | - <static>+compactWidthThreshold: double; - +body: Widget - | - +Widget build() - ] - - [DashboardScaffold]o-[<abstract>Widget] - - [StudiesTableColumnSize - | - +collapsed: bool; - +flex: int?; - +width: double? - | - +Widget createContainer() - ] - - [StudiesTable - | - +itemHeight: double; - +itemPadding: double; - +rowSpacing: double; - +columnSpacing: double; - +compactWidthThreshold: double; - +superCompactWidthThreshold: double; - +compactStatTitleThreshold: double; - +studies: List<Study>; - +onSelect: void Function(Study); - +getActions: List<ModelAction<dynamic>> Function(Study); - +emptyWidget: Widget; - +pinnedStudies: Iterable<String>; - +dashboardController: DashboardController - | - +Widget build(); - -Widget _buildColumnHeader() - ] - - [StudiesTable]o-[void Function(Study)] - [StudiesTable]o-[List<ModelAction<dynamic>> Function(Study)] - [StudiesTable]o-[<abstract>Widget] - [StudiesTable]o-[DashboardController] - - [StudiesTableColumn - | - +index: int; - <static>+values: List<StudiesTableColumn>; - <static>+pin: StudiesTableColumn; - <static>+title: StudiesTableColumn; - <static>+status: StudiesTableColumn; - <static>+participation: StudiesTableColumn; - <static>+createdAt: StudiesTableColumn; - <static>+enrolled: StudiesTableColumn; - <static>+active: StudiesTableColumn; - <static>+completed: StudiesTableColumn; - <static>+action: StudiesTableColumn - ] - - [StudiesTableColumn]o-[StudiesTableColumn] - [Enum]<:--[StudiesTableColumn] - - [DashboardScreen - | - +filter: StudiesFilter? - ] - - [DashboardScreen]o-[StudiesFilter] - - [DashboardController - | - +studyRepository: IStudyRepository; - +authRepository: IAuthRepository; - +userRepository: IUserRepository; - +router: GoRouter; - -_studiesSubscription: StreamSubscription<List<WrappedModel<Study>>>?; - +searchController: SearchController; - +isSortAscending: bool - | - -dynamic _subscribeStudies(); - +dynamic setSearchText(); - +dynamic setStudiesFilter(); - +dynamic onSelectStudy(); - +dynamic onClickNewStudy(); - +dynamic pinStudy(); - +dynamic pinOffStudy(); - +void setSorting(); - +void filterStudies(); - +void sortStudies(); - +bool isSortingActiveForColumn(); - +bool isPinned(); - +List<ModelAction<dynamic>> availableActions(); - +void dispose() - ] - - [DashboardController]o-[<abstract>IStudyRepository] - [DashboardController]o-[<abstract>IAuthRepository] - [DashboardController]o-[<abstract>IUserRepository] - [DashboardController]o-[GoRouter] - [DashboardController]o-[StreamSubscription] - [DashboardController]o-[SearchController] - [<abstract>IModelActionProvider]<:--[DashboardController] - - [StudiesTableItem - | - +study: Study; - +itemHeight: double; - +itemPadding: double; - +rowSpacing: double; - +columnSpacing: double; - +actions: List<ModelAction<dynamic>>; - +columnSizes: List<StudiesTableColumnSize>; - +isPinned: bool; - +onPinnedChanged: void Function(Study, bool)?; - +onTap: void Function(Study)? - ] - - [StudiesTableItem]o-[Study] - [StudiesTableItem]o-[void Function(Study, bool)?] - [StudiesTableItem]o-[void Function(Study)?] - - [StudiesFilter - | - +index: int; - <static>+values: List<StudiesFilter> - ] - - [Enum]<:--[StudiesFilter] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - StudiesTableColumnHeader - - - - - - +title: String - +sortable: bool - +sortAscending: bool - +sortingActive: bool - +onSort: void Function()? - - - - - - - - - - - void Function()? - - - - - - - - - - - - - DashboardScaffold - - - - - - <static>+compactWidthThreshold: double - +body: Widget - - - - - - +Widget build() - - - - - - - - - - - Widget - - - - - - - - - - - - - StudiesTableColumnSize - - - - - - +collapsed: bool - +flex: int? - +width: double? - - - - - - +Widget createContainer() - - - - - - - - - - - - - StudiesTable - - - - - - +itemHeight: double - +itemPadding: double - +rowSpacing: double - +columnSpacing: double - +compactWidthThreshold: double - +superCompactWidthThreshold: double - +compactStatTitleThreshold: double - +studies: List<Study> - +onSelect: void Function(Study) - +getActions: List<ModelAction<dynamic>> Function(Study) - +emptyWidget: Widget - +pinnedStudies: Iterable<String> - +dashboardController: DashboardController - - - - - - +Widget build() - -Widget _buildColumnHeader() - - - - - - - - - - - void Function(Study) - - - - - - - - - - - List<ModelAction<dynamic>> Function(Study) - - - - - - - - - - - - - DashboardController - - - - - - +studyRepository: IStudyRepository - +authRepository: IAuthRepository - +userRepository: IUserRepository - +router: GoRouter - -_studiesSubscription: StreamSubscription<List<WrappedModel<Study>>>? - +searchController: SearchController - +isSortAscending: bool - - - - - - -dynamic _subscribeStudies() - +dynamic setSearchText() - +dynamic setStudiesFilter() - +dynamic onSelectStudy() - +dynamic onClickNewStudy() - +dynamic pinStudy() - +dynamic pinOffStudy() - +void setSorting() - +void filterStudies() - +void sortStudies() - +bool isSortingActiveForColumn() - +bool isPinned() - +List<ModelAction<dynamic>> availableActions() - +void dispose() - - - - - - - - - - - - StudiesTableColumn - - - - - - +index: int - <static>+values: List<StudiesTableColumn> - <static>+pin: StudiesTableColumn - <static>+title: StudiesTableColumn - <static>+status: StudiesTableColumn - <static>+participation: StudiesTableColumn - <static>+createdAt: StudiesTableColumn - <static>+enrolled: StudiesTableColumn - <static>+active: StudiesTableColumn - <static>+completed: StudiesTableColumn - <static>+action: StudiesTableColumn - - - - - - - - - - - Enum - - - - - - - - - - - - DashboardScreen - - - - - - +filter: StudiesFilter? - - - - - - - - - - - - StudiesFilter - - - - - - +index: int - <static>+values: List<StudiesFilter> - - - - - - - - - - - IStudyRepository - - - - - - - - - - - IAuthRepository - - - - - - - - - - - IUserRepository - - - - - - - - - - - GoRouter - - - - - - - - - - - StreamSubscription - - - - - - - - - - - SearchController - - - - - - - - - - - IModelActionProvider - - - - - - - - - - - - StudiesTableItem - - - - - - +study: Study - +itemHeight: double - +itemPadding: double - +rowSpacing: double - +columnSpacing: double - +actions: List<ModelAction<dynamic>> - +columnSizes: List<StudiesTableColumnSize> - +isPinned: bool - +onPinnedChanged: void Function(Study, bool)? - +onTap: void Function(Study)? - - - - - - - - - - - Study - - - - - - - - - - - void Function(Study, bool)? - - - - - - - - - - - void Function(Study)? - - - - - - - - - \ No newline at end of file diff --git a/docs/uml/designer_v2/lib/features/design/enrollment/uml.svg b/docs/uml/designer_v2/lib/features/design/enrollment/uml.svg deleted file mode 100644 index a0c07f4f0..000000000 --- a/docs/uml/designer_v2/lib/features/design/enrollment/uml.svg +++ /dev/null @@ -1,820 +0,0 @@ - - [<abstract>IScreenerQuestionLogicFormViewModel - | - +isDirtyOptionsBannerVisible: bool - ] - - [ScreenerQuestionLogicFormView - | - +formViewModel: ScreenerQuestionFormViewModel - | - +Widget build(); - -dynamic _buildInfoBanner(); - -dynamic _buildAnswerOptionsLogicControls(); - -List<Widget> _buildOptionLogicRow() - ] - - [ScreenerQuestionLogicFormView]o-[ScreenerQuestionFormViewModel] - [<abstract>FormConsumerWidget]<:-[ScreenerQuestionLogicFormView] - - [EnrollmentFormData - | - <static>+kDefaultEnrollmentType: Participation; - +enrollmentType: Participation; - +questionnaireFormData: QuestionnaireFormData; - +consentItemsFormData: List<ConsentItemFormData>?; - +id: String - | - +Study apply(); - +EnrollmentFormData copy() - ] - - [EnrollmentFormData]o-[Participation] - [EnrollmentFormData]o-[QuestionnaireFormData] - [<abstract>IStudyFormData]<:--[EnrollmentFormData] - - [ConsentItemFormView - | - +formViewModel: ConsentItemFormViewModel - ] - - [ConsentItemFormView]o-[ConsentItemFormViewModel] - - [ConsentItemFormData - | - +consentId: String; - +title: String; - +description: String; - +iconName: String?; - +id: String - | - +ConsentItem toConsentItem(); - +ConsentItemFormData copy() - ] - - [<abstract>IFormData]<:-[ConsentItemFormData] - - [StudyDesignEnrollmentFormView - | - +Widget build(); - -dynamic _showScreenerQuestionSidesheetWithArgs(); - -dynamic _showConsentItemSidesheetWithArgs() - ] - - [<abstract>StudyDesignPageWidget]<:-[StudyDesignEnrollmentFormView] - - [ScreenerQuestionFormViewModel - | - <static>+defaultResponseOptionValidity: bool; - +responseOptionsDisabledArray: FormArray<dynamic>; - +responseOptionsLogicControls: FormArray<bool>; - +responseOptionsLogicDescriptionControls: FormArray<String>; - -_questionBaseControls: Map<String, AbstractControl<dynamic>>; - +prevResponseOptionControls: List<AbstractControl<dynamic>>; - +prevResponseOptionValues: List<dynamic>; - +responseOptionsDisabledControls: List<AbstractControl<dynamic>>; - +logicControlOptions: List<FormControlOption<bool>>; - +questionBaseControls: Map<String, AbstractControl<dynamic>>; - +isDirtyOptionsBannerVisible: bool - | - +dynamic onResponseOptionsChanged(); - +void setControlsFrom(); - +QuestionFormData buildFormData(); - -List<FormControl<dynamic>> _copyFormControls(); - -AbstractControl<dynamic>? _findAssociatedLogicControlFor(); - -AbstractControl<dynamic>? _findAssociatedControlFor(); - +ScreenerQuestionFormViewModel createDuplicate() - ] - - [ScreenerQuestionFormViewModel]o-[FormArray] - [QuestionFormViewModel]<:-[ScreenerQuestionFormViewModel] - [<abstract>IScreenerQuestionLogicFormViewModel]<:--[ScreenerQuestionFormViewModel] - - [EnrollmentFormViewModel - | - +study: Study; - +router: GoRouter; - +consentItemDelegate: EnrollmentFormConsentItemDelegate; - +enrollmentTypeControl: FormControl<Participation>; - +consentItemArray: FormArray<dynamic>; - +consentItemFormViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData>; - +form: FormGroup; - +enrollmentTypeControlOptions: List<FormControlOption<Participation>>; - +consentItemModels: List<ConsentItemFormViewModel>; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titles: Map<FormMode, String>; - +canTestScreener: bool; - +canTestConsent: bool; - +questionTitles: Map<FormMode, String Function()> - | - +void setControlsFrom(); - +EnrollmentFormData buildFormData(); - +void read(); - +List<ModelAction<dynamic>> availableActions(); - +List<ModelAction<dynamic>> availablePopupActions(); - +List<ModelAction<dynamic>> availableInlineActions(); - +void onSelectItem(); - +void onNewItem(); - +ScreenerQuestionFormRouteArgs buildNewScreenerQuestionFormRouteArgs(); - +ScreenerQuestionFormRouteArgs buildScreenerQuestionFormRouteArgs(); - +ConsentItemFormRouteArgs buildNewConsentItemFormRouteArgs(); - +ConsentItemFormRouteArgs buildConsentItemFormRouteArgs(); - +dynamic testScreener(); - +dynamic testConsent(); - +ScreenerQuestionFormViewModel provideQuestionFormViewModel() - ] - - [EnrollmentFormViewModel]o-[Study] - [EnrollmentFormViewModel]o-[GoRouter] - [EnrollmentFormViewModel]o-[EnrollmentFormConsentItemDelegate] - [EnrollmentFormViewModel]o-[FormControl] - [EnrollmentFormViewModel]o-[FormArray] - [EnrollmentFormViewModel]o-[FormViewModelCollection] - [EnrollmentFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[EnrollmentFormViewModel] - [<abstract>WithQuestionnaireControls]<:-[EnrollmentFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[EnrollmentFormViewModel] - [<abstract>IListActionProvider]<:--[EnrollmentFormViewModel] - [<abstract>IProviderArgsResolver]<:--[EnrollmentFormViewModel] - - [EnrollmentFormConsentItemDelegate - | - +formViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData>; - +owner: EnrollmentFormViewModel; - +propagateOnSave: bool; - +validationSet: dynamic - | - +void onCancel(); - +dynamic onSave(); - +ConsentItemFormViewModel provide(); - +List<ModelAction<dynamic>> availableActions(); - +void onNewItem(); - +void onSelectItem() - ] - - [EnrollmentFormConsentItemDelegate]o-[FormViewModelCollection] - [EnrollmentFormConsentItemDelegate]o-[EnrollmentFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[EnrollmentFormConsentItemDelegate] - [<abstract>IListActionProvider]<:--[EnrollmentFormConsentItemDelegate] - [<abstract>IProviderArgsResolver]<:--[EnrollmentFormConsentItemDelegate] - - [ConsentItemFormViewModel - | - +consentIdControl: FormControl<String>; - +titleControl: FormControl<String>; - +descriptionControl: FormControl<String>; - +iconControl: FormControl<IconOption>; - +form: FormGroup; - +consentId: String; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titleRequired: dynamic; - +descriptionRequired: dynamic; - +titles: Map<FormMode, String> - | - +void setControlsFrom(); - +ConsentItemFormData buildFormData(); - +ConsentItemFormViewModel createDuplicate() - ] - - [ConsentItemFormViewModel]o-[FormControl] - [ConsentItemFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[ConsentItemFormViewModel] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IScreenerQuestionLogicFormViewModel - - - - - - +isDirtyOptionsBannerVisible: bool - - - - - - - - - - - - - ScreenerQuestionLogicFormView - - - - - - +formViewModel: ScreenerQuestionFormViewModel - - - - - - +Widget build() - -dynamic _buildInfoBanner() - -dynamic _buildAnswerOptionsLogicControls() - -List<Widget> _buildOptionLogicRow() - - - - - - - - - - - - - ScreenerQuestionFormViewModel - - - - - - <static>+defaultResponseOptionValidity: bool - +responseOptionsDisabledArray: FormArray<dynamic> - +responseOptionsLogicControls: FormArray<bool> - +responseOptionsLogicDescriptionControls: FormArray<String> - -_questionBaseControls: Map<String, AbstractControl<dynamic>> - +prevResponseOptionControls: List<AbstractControl<dynamic>> - +prevResponseOptionValues: List<dynamic> - +responseOptionsDisabledControls: List<AbstractControl<dynamic>> - +logicControlOptions: List<FormControlOption<bool>> - +questionBaseControls: Map<String, AbstractControl<dynamic>> - +isDirtyOptionsBannerVisible: bool - - - - - - +dynamic onResponseOptionsChanged() - +void setControlsFrom() - +QuestionFormData buildFormData() - -List<FormControl<dynamic>> _copyFormControls() - -AbstractControl<dynamic>? _findAssociatedLogicControlFor() - -AbstractControl<dynamic>? _findAssociatedControlFor() - +ScreenerQuestionFormViewModel createDuplicate() - - - - - - - - - - - FormConsumerWidget - - - - - - - - - - - - - EnrollmentFormData - - - - - - <static>+kDefaultEnrollmentType: Participation - +enrollmentType: Participation - +questionnaireFormData: QuestionnaireFormData - +consentItemsFormData: List<ConsentItemFormData>? - +id: String - - - - - - +Study apply() - +EnrollmentFormData copy() - - - - - - - - - - - Participation - - - - - - - - - - - QuestionnaireFormData - - - - - - - - - - - IStudyFormData - - - - - - - - - - - - ConsentItemFormView - - - - - - +formViewModel: ConsentItemFormViewModel - - - - - - - - - - - - - ConsentItemFormViewModel - - - - - - +consentIdControl: FormControl<String> - +titleControl: FormControl<String> - +descriptionControl: FormControl<String> - +iconControl: FormControl<IconOption> - +form: FormGroup - +consentId: String - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titleRequired: dynamic - +descriptionRequired: dynamic - +titles: Map<FormMode, String> - - - - - - +void setControlsFrom() - +ConsentItemFormData buildFormData() - +ConsentItemFormViewModel createDuplicate() - - - - - - - - - - - - - ConsentItemFormData - - - - - - +consentId: String - +title: String - +description: String - +iconName: String? - +id: String - - - - - - +ConsentItem toConsentItem() - +ConsentItemFormData copy() - - - - - - - - - - - IFormData - - - - - - - - - - - - StudyDesignEnrollmentFormView - - - - - - +Widget build() - -dynamic _showScreenerQuestionSidesheetWithArgs() - -dynamic _showConsentItemSidesheetWithArgs() - - - - - - - - - - - StudyDesignPageWidget - - - - - - - - - - - FormArray - - - - - - - - - - - QuestionFormViewModel - - - - - - - - - - - - - EnrollmentFormViewModel - - - - - - +study: Study - +router: GoRouter - +consentItemDelegate: EnrollmentFormConsentItemDelegate - +enrollmentTypeControl: FormControl<Participation> - +consentItemArray: FormArray<dynamic> - +consentItemFormViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData> - +form: FormGroup - +enrollmentTypeControlOptions: List<FormControlOption<Participation>> - +consentItemModels: List<ConsentItemFormViewModel> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titles: Map<FormMode, String> - +canTestScreener: bool - +canTestConsent: bool - +questionTitles: Map<FormMode, String Function()> - - - - - - +void setControlsFrom() - +EnrollmentFormData buildFormData() - +void read() - +List<ModelAction<dynamic>> availableActions() - +List<ModelAction<dynamic>> availablePopupActions() - +List<ModelAction<dynamic>> availableInlineActions() - +void onSelectItem() - +void onNewItem() - +ScreenerQuestionFormRouteArgs buildNewScreenerQuestionFormRouteArgs() - +ScreenerQuestionFormRouteArgs buildScreenerQuestionFormRouteArgs() - +ConsentItemFormRouteArgs buildNewConsentItemFormRouteArgs() - +ConsentItemFormRouteArgs buildConsentItemFormRouteArgs() - +dynamic testScreener() - +dynamic testConsent() - +ScreenerQuestionFormViewModel provideQuestionFormViewModel() - - - - - - - - - - - Study - - - - - - - - - - - GoRouter - - - - - - - - - - - - - EnrollmentFormConsentItemDelegate - - - - - - +formViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData> - +owner: EnrollmentFormViewModel - +propagateOnSave: bool - +validationSet: dynamic - - - - - - +void onCancel() - +dynamic onSave() - +ConsentItemFormViewModel provide() - +List<ModelAction<dynamic>> availableActions() - +void onNewItem() - +void onSelectItem() - - - - - - - - - - - FormControl - - - - - - - - - - - FormViewModelCollection - - - - - - - - - - - FormGroup - - - - - - - - - - - FormViewModel - - - - - - - - - - - WithQuestionnaireControls - - - - - - - - - - - IFormViewModelDelegate - - - - - - - - - - - IListActionProvider - - - - - - - - - - - IProviderArgsResolver - - - - - - - - - - - ManagedFormViewModel - - - - - - - - - \ No newline at end of file diff --git a/docs/uml/designer_v2/lib/features/design/info/uml.svg b/docs/uml/designer_v2/lib/features/design/info/uml.svg deleted file mode 100644 index 580464fbd..000000000 --- a/docs/uml/designer_v2/lib/features/design/info/uml.svg +++ /dev/null @@ -1,319 +0,0 @@ - - [StudyDesignInfoFormView - | - +Widget build() - ] - - [<abstract>StudyDesignPageWidget]<:-[StudyDesignInfoFormView] - - [StudyInfoFormViewModel - | - +study: Study; - +titleControl: FormControl<String>; - +iconControl: FormControl<IconOption>; - +descriptionControl: FormControl<String>; - +organizationControl: FormControl<String>; - +reviewBoardControl: FormControl<String>; - +reviewBoardNumberControl: FormControl<String>; - +researchersControl: FormControl<String>; - +emailControl: FormControl<String>; - +websiteControl: FormControl<String>; - +phoneControl: FormControl<String>; - +additionalInfoControl: FormControl<String>; - +form: FormGroup; - +titles: Map<FormMode, String>; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titleRequired: dynamic; - +descriptionRequired: dynamic; - +iconRequired: dynamic; - +organizationRequired: dynamic; - +reviewBoardRequired: dynamic; - +reviewBoardNumberRequired: dynamic; - +researchersRequired: dynamic; - +emailRequired: dynamic; - +phoneRequired: dynamic; - +emailFormat: dynamic; - +websiteFormat: dynamic - | - +void setControlsFrom(); - +StudyInfoFormData buildFormData() - ] - - [StudyInfoFormViewModel]o-[Study] - [StudyInfoFormViewModel]o-[FormControl] - [StudyInfoFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[StudyInfoFormViewModel] - - [StudyInfoFormData - | - +title: String; - +description: String?; - +iconName: String; - +contactInfoFormData: StudyContactInfoFormData; - +id: String - | - +Study apply(); - +StudyInfoFormData copy() - ] - - [StudyInfoFormData]o-[StudyContactInfoFormData] - [<abstract>IStudyFormData]<:--[StudyInfoFormData] - - [StudyContactInfoFormData - | - +organization: String?; - +institutionalReviewBoard: String?; - +institutionalReviewBoardNumber: String?; - +researchers: String?; - +email: String?; - +website: String?; - +phone: String?; - +additionalInfo: String?; - +id: String - | - +Study apply(); - +StudyInfoFormData copy() - ] - - [<abstract>IStudyFormData]<:--[StudyContactInfoFormData] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - StudyDesignInfoFormView - - - - - - +Widget build() - - - - - - - - - - - StudyDesignPageWidget - - - - - - - - - - - - - StudyInfoFormViewModel - - - - - - +study: Study - +titleControl: FormControl<String> - +iconControl: FormControl<IconOption> - +descriptionControl: FormControl<String> - +organizationControl: FormControl<String> - +reviewBoardControl: FormControl<String> - +reviewBoardNumberControl: FormControl<String> - +researchersControl: FormControl<String> - +emailControl: FormControl<String> - +websiteControl: FormControl<String> - +phoneControl: FormControl<String> - +additionalInfoControl: FormControl<String> - +form: FormGroup - +titles: Map<FormMode, String> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titleRequired: dynamic - +descriptionRequired: dynamic - +iconRequired: dynamic - +organizationRequired: dynamic - +reviewBoardRequired: dynamic - +reviewBoardNumberRequired: dynamic - +researchersRequired: dynamic - +emailRequired: dynamic - +phoneRequired: dynamic - +emailFormat: dynamic - +websiteFormat: dynamic - - - - - - +void setControlsFrom() - +StudyInfoFormData buildFormData() - - - - - - - - - - - Study - - - - - - - - - - - FormControl - - - - - - - - - - - FormGroup - - - - - - - - - - - FormViewModel - - - - - - - - - - - - - StudyInfoFormData - - - - - - +title: String - +description: String? - +iconName: String - +contactInfoFormData: StudyContactInfoFormData - +id: String - - - - - - +Study apply() - +StudyInfoFormData copy() - - - - - - - - - - - - - StudyContactInfoFormData - - - - - - +organization: String? - +institutionalReviewBoard: String? - +institutionalReviewBoardNumber: String? - +researchers: String? - +email: String? - +website: String? - +phone: String? - +additionalInfo: String? - +id: String - - - - - - +Study apply() - +StudyInfoFormData copy() - - - - - - - - - - - IStudyFormData - - - - - - - - - \ No newline at end of file diff --git a/docs/uml/designer_v2/lib/features/design/interventions/uml.svg b/docs/uml/designer_v2/lib/features/design/interventions/uml.svg deleted file mode 100644 index 21200174f..000000000 --- a/docs/uml/designer_v2/lib/features/design/interventions/uml.svg +++ /dev/null @@ -1,1004 +0,0 @@ - - [InterventionsFormViewModel - | - +study: Study; - +router: GoRouter; - +interventionsArray: FormArray<dynamic>; - +interventionsCollection: FormViewModelCollection<InterventionFormViewModel, InterventionFormData>; - +form: FormGroup; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +interventionsRequired: dynamic; - +titles: Map<FormMode, String>; - +canTestStudySchedule: bool - | - +void setControlsFrom(); - +InterventionsFormData buildFormData(); - +void read(); - +List<ModelAction<dynamic>> availableActions(); - +List<ModelAction<dynamic>> availablePopupActions(); - +List<ModelAction<dynamic>> availableInlineActions(); - +void onSelectItem(); - +void onNewItem(); - +InterventionFormViewModel provide(); - +void onCancel(); - +dynamic onSave(); - +dynamic testStudySchedule() - ] - - [InterventionsFormViewModel]o-[Study] - [InterventionsFormViewModel]o-[GoRouter] - [InterventionsFormViewModel]o-[FormArray] - [InterventionsFormViewModel]o-[FormViewModelCollection] - [InterventionsFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[InterventionsFormViewModel] - [<abstract>StudyScheduleControls]<:-[InterventionsFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[InterventionsFormViewModel] - [<abstract>IListActionProvider]<:--[InterventionsFormViewModel] - [<abstract>IProviderArgsResolver]<:--[InterventionsFormViewModel] - - [InterventionTaskFormViewModel - | - +taskIdControl: FormControl<String>; - +instanceIdControl: FormControl<String>; - +taskTitleControl: FormControl<String>; - +taskDescriptionControl: FormControl<String>; - +markAsCompletedControl: FormControl<bool>; - +form: FormGroup; - +taskId: String; - +instanceId: String; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titleRequired: dynamic; - +titles: Map<FormMode, String> - | - +void setControlsFrom(); - +InterventionTaskFormData buildFormData(); - +InterventionTaskFormViewModel createDuplicate() - ] - - [InterventionTaskFormViewModel]o-[FormControl] - [InterventionTaskFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[InterventionTaskFormViewModel] - [<abstract>WithScheduleControls]<:-[InterventionTaskFormViewModel] - - [InterventionPreview - | - +routeArgs: InterventionFormRouteArgs - | - +Widget build() - ] - - [InterventionPreview]o-[InterventionFormRouteArgs] - [<abstract>ConsumerWidget]<:-[InterventionPreview] - - [<abstract>StudyScheduleControls - | - <static>+defaultScheduleType: PhaseSequence; - <static>+defaultScheduleTypeSequence: String; - <static>+defaultNumCycles: int; - <static>+defaultPeriodLength: int; - +sequenceTypeControl: FormControl<PhaseSequence>; - +sequenceTypeCustomControl: FormControl<String>; - +phaseDurationControl: FormControl<int>; - +numCyclesControl: FormControl<int>; - +includeBaselineControl: FormControl<bool>; - +studyScheduleControls: Map<String, FormControl<Object>>; - <static>+kNumCyclesMin: int; - <static>+kNumCyclesMax: int; - <static>+kPhaseDurationMin: int; - <static>+kPhaseDurationMax: int; - +sequenceTypeControlOptions: List<FormControlOption<PhaseSequence>>; - +studyScheduleValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +numCyclesRange: dynamic; - +phaseDurationRange: dynamic; - +customSequenceRequired: dynamic - | - +void setStudyScheduleControlsFrom(); - +StudyScheduleFormData buildStudyScheduleFormData(); - +bool isSequencingCustom() - ] - - [<abstract>StudyScheduleControls]o-[PhaseSequence] - [<abstract>StudyScheduleControls]o-[FormControl] - - [InterventionTaskFormView - | - +formViewModel: InterventionTaskFormViewModel - ] - - [InterventionTaskFormView]o-[InterventionTaskFormViewModel] - - [InterventionsFormData - | - +interventionsData: List<InterventionFormData>; - +studyScheduleData: StudyScheduleFormData; - +id: String - | - +Study apply(); - +InterventionsFormData copy() - ] - - [InterventionsFormData]o-[StudyScheduleFormData] - [<abstract>IStudyFormData]<:--[InterventionsFormData] - - [InterventionTaskFormData - | - +taskId: String; - +taskTitle: String; - +taskDescription: String?; - <static>+kDefaultTitle: String; - +id: String - | - +CheckmarkTask toTask(); - +InterventionTaskFormData copy() - ] - - [<abstract>IFormDataWithSchedule]<:-[InterventionTaskFormData] - - [InterventionFormView - | - +formViewModel: InterventionFormViewModel - ] - - [InterventionFormView]o-[InterventionFormViewModel] - - [StudyDesignInterventionsFormView - | - +Widget build() - ] - - [<abstract>StudyDesignPageWidget]<:-[StudyDesignInterventionsFormView] - - [InterventionFormData - | - +interventionId: String; - +title: String; - +description: String?; - +tasksData: List<InterventionTaskFormData>?; - +iconName: String?; - <static>+kDefaultTitle: String; - +id: String - | - +Intervention toIntervention(); - +InterventionFormData copy() - ] - - [<abstract>IFormData]<:-[InterventionFormData] - - [StudyScheduleFormData - | - +sequenceType: PhaseSequence; - +sequenceTypeCustom: String; - +numCycles: int; - +phaseDuration: int; - +includeBaseline: bool; - +id: String - | - +StudySchedule toStudySchedule(); - +Study apply(); - +StudyScheduleFormData copy() - ] - - [StudyScheduleFormData]o-[PhaseSequence] - [<abstract>IStudyFormData]<:--[StudyScheduleFormData] - - [StudyScheduleFormView - | - +formViewModel: StudyScheduleControls - | - -FormTableRow _renderCustomSequence(); - +Widget build() - ] - - [StudyScheduleFormView]o-[<abstract>StudyScheduleControls] - [<abstract>FormConsumerWidget]<:-[StudyScheduleFormView] - - [InterventionFormViewModel - | - +study: Study; - +interventionIdControl: FormControl<String>; - +interventionTitleControl: FormControl<String>; - +interventionIconControl: FormControl<IconOption>; - +interventionDescriptionControl: FormControl<String>; - +interventionTasksArray: FormArray<dynamic>; - +tasksCollection: FormViewModelCollection<InterventionTaskFormViewModel, InterventionTaskFormData>; - +form: FormGroup; - +interventionId: String; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titleRequired: dynamic; - +atLeastOneTask: dynamic; - +breadcrumbsTitle: String; - +titles: Map<FormMode, String> - | - +void setControlsFrom(); - +InterventionFormData buildFormData(); - +List<ModelAction<dynamic>> availableActions(); - +List<ModelAction<dynamic>> availablePopupActions(); - +List<ModelAction<dynamic>> availableInlineActions(); - +void onSelectItem(); - +void onNewItem(); - +void onCancel(); - +dynamic onSave(); - +InterventionTaskFormViewModel provide(); - +InterventionTaskFormRouteArgs buildNewFormRouteArgs(); - +InterventionTaskFormRouteArgs buildFormRouteArgs(); - +InterventionFormViewModel createDuplicate() - ] - - [InterventionFormViewModel]o-[Study] - [InterventionFormViewModel]o-[FormControl] - [InterventionFormViewModel]o-[FormArray] - [InterventionFormViewModel]o-[FormViewModelCollection] - [InterventionFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[InterventionFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[InterventionFormViewModel] - [<abstract>IListActionProvider]<:--[InterventionFormViewModel] - [<abstract>IProviderArgsResolver]<:--[InterventionFormViewModel] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - InterventionsFormViewModel - - - - - - +study: Study - +router: GoRouter - +interventionsArray: FormArray<dynamic> - +interventionsCollection: FormViewModelCollection<InterventionFormViewModel, InterventionFormData> - +form: FormGroup - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +interventionsRequired: dynamic - +titles: Map<FormMode, String> - +canTestStudySchedule: bool - - - - - - +void setControlsFrom() - +InterventionsFormData buildFormData() - +void read() - +List<ModelAction<dynamic>> availableActions() - +List<ModelAction<dynamic>> availablePopupActions() - +List<ModelAction<dynamic>> availableInlineActions() - +void onSelectItem() - +void onNewItem() - +InterventionFormViewModel provide() - +void onCancel() - +dynamic onSave() - +dynamic testStudySchedule() - - - - - - - - - - - Study - - - - - - - - - - - GoRouter - - - - - - - - - - - FormArray - - - - - - - - - - - FormViewModelCollection - - - - - - - - - - - FormGroup - - - - - - - - - - - FormViewModel - - - - - - - - - - - - - StudyScheduleControls - - - - - - <static>+defaultScheduleType: PhaseSequence - <static>+defaultScheduleTypeSequence: String - <static>+defaultNumCycles: int - <static>+defaultPeriodLength: int - +sequenceTypeControl: FormControl<PhaseSequence> - +sequenceTypeCustomControl: FormControl<String> - +phaseDurationControl: FormControl<int> - +numCyclesControl: FormControl<int> - +includeBaselineControl: FormControl<bool> - +studyScheduleControls: Map<String, FormControl<Object>> - <static>+kNumCyclesMin: int - <static>+kNumCyclesMax: int - <static>+kPhaseDurationMin: int - <static>+kPhaseDurationMax: int - +sequenceTypeControlOptions: List<FormControlOption<PhaseSequence>> - +studyScheduleValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +numCyclesRange: dynamic - +phaseDurationRange: dynamic - +customSequenceRequired: dynamic - - - - - - +void setStudyScheduleControlsFrom() - +StudyScheduleFormData buildStudyScheduleFormData() - +bool isSequencingCustom() - - - - - - - - - - - IFormViewModelDelegate - - - - - - - - - - - IListActionProvider - - - - - - - - - - - IProviderArgsResolver - - - - - - - - - - - - - InterventionTaskFormViewModel - - - - - - +taskIdControl: FormControl<String> - +instanceIdControl: FormControl<String> - +taskTitleControl: FormControl<String> - +taskDescriptionControl: FormControl<String> - +markAsCompletedControl: FormControl<bool> - +form: FormGroup - +taskId: String - +instanceId: String - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titleRequired: dynamic - +titles: Map<FormMode, String> - - - - - - +void setControlsFrom() - +InterventionTaskFormData buildFormData() - +InterventionTaskFormViewModel createDuplicate() - - - - - - - - - - - FormControl - - - - - - - - - - - ManagedFormViewModel - - - - - - - - - - - WithScheduleControls - - - - - - - - - - - - - InterventionPreview - - - - - - +routeArgs: InterventionFormRouteArgs - - - - - - +Widget build() - - - - - - - - - - - InterventionFormRouteArgs - - - - - - - - - - - ConsumerWidget - - - - - - - - - - - PhaseSequence - - - - - - - - - - - - InterventionTaskFormView - - - - - - +formViewModel: InterventionTaskFormViewModel - - - - - - - - - - - - - InterventionsFormData - - - - - - +interventionsData: List<InterventionFormData> - +studyScheduleData: StudyScheduleFormData - +id: String - - - - - - +Study apply() - +InterventionsFormData copy() - - - - - - - - - - - - - StudyScheduleFormData - - - - - - +sequenceType: PhaseSequence - +sequenceTypeCustom: String - +numCycles: int - +phaseDuration: int - +includeBaseline: bool - +id: String - - - - - - +StudySchedule toStudySchedule() - +Study apply() - +StudyScheduleFormData copy() - - - - - - - - - - - IStudyFormData - - - - - - - - - - - - - InterventionTaskFormData - - - - - - +taskId: String - +taskTitle: String - +taskDescription: String? - <static>+kDefaultTitle: String - +id: String - - - - - - +CheckmarkTask toTask() - +InterventionTaskFormData copy() - - - - - - - - - - - IFormDataWithSchedule - - - - - - - - - - - - InterventionFormView - - - - - - +formViewModel: InterventionFormViewModel - - - - - - - - - - - - - InterventionFormViewModel - - - - - - +study: Study - +interventionIdControl: FormControl<String> - +interventionTitleControl: FormControl<String> - +interventionIconControl: FormControl<IconOption> - +interventionDescriptionControl: FormControl<String> - +interventionTasksArray: FormArray<dynamic> - +tasksCollection: FormViewModelCollection<InterventionTaskFormViewModel, InterventionTaskFormData> - +form: FormGroup - +interventionId: String - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titleRequired: dynamic - +atLeastOneTask: dynamic - +breadcrumbsTitle: String - +titles: Map<FormMode, String> - - - - - - +void setControlsFrom() - +InterventionFormData buildFormData() - +List<ModelAction<dynamic>> availableActions() - +List<ModelAction<dynamic>> availablePopupActions() - +List<ModelAction<dynamic>> availableInlineActions() - +void onSelectItem() - +void onNewItem() - +void onCancel() - +dynamic onSave() - +InterventionTaskFormViewModel provide() - +InterventionTaskFormRouteArgs buildNewFormRouteArgs() - +InterventionTaskFormRouteArgs buildFormRouteArgs() - +InterventionFormViewModel createDuplicate() - - - - - - - - - - - - StudyDesignInterventionsFormView - - - - - - +Widget build() - - - - - - - - - - - StudyDesignPageWidget - - - - - - - - - - - - - InterventionFormData - - - - - - +interventionId: String - +title: String - +description: String? - +tasksData: List<InterventionTaskFormData>? - +iconName: String? - <static>+kDefaultTitle: String - +id: String - - - - - - +Intervention toIntervention() - +InterventionFormData copy() - - - - - - - - - - - IFormData - - - - - - - - - - - - - StudyScheduleFormView - - - - - - +formViewModel: StudyScheduleControls - - - - - - -FormTableRow _renderCustomSequence() - +Widget build() - - - - - - - - - - - FormConsumerWidget - - - - - - - - - \ No newline at end of file diff --git a/docs/uml/designer_v2/lib/features/design/measurements/survey/uml.svg b/docs/uml/designer_v2/lib/features/design/measurements/survey/uml.svg deleted file mode 100644 index 4f64dc548..000000000 --- a/docs/uml/designer_v2/lib/features/design/measurements/survey/uml.svg +++ /dev/null @@ -1,398 +0,0 @@ - - [MeasurementSurveyFormView - | - +formViewModel: MeasurementSurveyFormViewModel - ] - - [MeasurementSurveyFormView]o-[MeasurementSurveyFormViewModel] - - [MeasurementSurveyFormData - | - +measurementId: String; - +title: String; - +introText: String?; - +outroText: String?; - +questionnaireFormData: QuestionnaireFormData; - <static>+kDefaultTitle: String; - +id: String - | - +QuestionnaireTask toQuestionnaireTask(); - +MeasurementSurveyFormData copy() - ] - - [MeasurementSurveyFormData]o-[QuestionnaireFormData] - [<abstract>IFormDataWithSchedule]<:-[MeasurementSurveyFormData] - - [MeasurementSurveyFormViewModel - | - +study: Study; - +measurementIdControl: FormControl<String>; - +instanceIdControl: FormControl<String>; - +surveyTitleControl: FormControl<String>; - +surveyIntroTextControl: FormControl<String>; - +surveyOutroTextControl: FormControl<String>; - +form: FormGroup; - +measurementId: String; - +instanceId: String; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titleRequired: dynamic; - +atLeastOneQuestion: dynamic; - +breadcrumbsTitle: String; - +titles: Map<FormMode, String> - | - +void setControlsFrom(); - +MeasurementSurveyFormData buildFormData(); - +List<ModelAction<dynamic>> availableActions(); - +List<ModelAction<dynamic>> availablePopupActions(); - +List<ModelAction<dynamic>> availableInlineActions(); - +void onSelectItem(); - +void onNewItem(); - +SurveyQuestionFormRouteArgs buildNewFormRouteArgs(); - +SurveyQuestionFormRouteArgs buildFormRouteArgs(); - +MeasurementSurveyFormViewModel createDuplicate() - ] - - [MeasurementSurveyFormViewModel]o-[Study] - [MeasurementSurveyFormViewModel]o-[FormControl] - [MeasurementSurveyFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[MeasurementSurveyFormViewModel] - [<abstract>WithQuestionnaireControls]<:-[MeasurementSurveyFormViewModel] - [<abstract>WithScheduleControls]<:-[MeasurementSurveyFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[MeasurementSurveyFormViewModel] - [<abstract>IListActionProvider]<:--[MeasurementSurveyFormViewModel] - [<abstract>IProviderArgsResolver]<:--[MeasurementSurveyFormViewModel] - - [SurveyPreview - | - +routeArgs: MeasurementFormRouteArgs - | - +Widget build() - ] - - [SurveyPreview]o-[MeasurementFormRouteArgs] - [<abstract>ConsumerWidget]<:-[SurveyPreview] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - MeasurementSurveyFormView - - - - - - +formViewModel: MeasurementSurveyFormViewModel - - - - - - - - - - - - - MeasurementSurveyFormViewModel - - - - - - +study: Study - +measurementIdControl: FormControl<String> - +instanceIdControl: FormControl<String> - +surveyTitleControl: FormControl<String> - +surveyIntroTextControl: FormControl<String> - +surveyOutroTextControl: FormControl<String> - +form: FormGroup - +measurementId: String - +instanceId: String - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titleRequired: dynamic - +atLeastOneQuestion: dynamic - +breadcrumbsTitle: String - +titles: Map<FormMode, String> - - - - - - +void setControlsFrom() - +MeasurementSurveyFormData buildFormData() - +List<ModelAction<dynamic>> availableActions() - +List<ModelAction<dynamic>> availablePopupActions() - +List<ModelAction<dynamic>> availableInlineActions() - +void onSelectItem() - +void onNewItem() - +SurveyQuestionFormRouteArgs buildNewFormRouteArgs() - +SurveyQuestionFormRouteArgs buildFormRouteArgs() - +MeasurementSurveyFormViewModel createDuplicate() - - - - - - - - - - - - - MeasurementSurveyFormData - - - - - - +measurementId: String - +title: String - +introText: String? - +outroText: String? - +questionnaireFormData: QuestionnaireFormData - <static>+kDefaultTitle: String - +id: String - - - - - - +QuestionnaireTask toQuestionnaireTask() - +MeasurementSurveyFormData copy() - - - - - - - - - - - QuestionnaireFormData - - - - - - - - - - - IFormDataWithSchedule - - - - - - - - - - - Study - - - - - - - - - - - FormControl - - - - - - - - - - - FormGroup - - - - - - - - - - - ManagedFormViewModel - - - - - - - - - - - WithQuestionnaireControls - - - - - - - - - - - WithScheduleControls - - - - - - - - - - - IFormViewModelDelegate - - - - - - - - - - - IListActionProvider - - - - - - - - - - - IProviderArgsResolver - - - - - - - - - - - - - SurveyPreview - - - - - - +routeArgs: MeasurementFormRouteArgs - - - - - - +Widget build() - - - - - - - - - - - MeasurementFormRouteArgs - - - - - - - - - - - ConsumerWidget - - - - - - - - - \ No newline at end of file diff --git a/docs/uml/designer_v2/lib/features/design/measurements/uml.svg b/docs/uml/designer_v2/lib/features/design/measurements/uml.svg deleted file mode 100644 index 11d537c95..000000000 --- a/docs/uml/designer_v2/lib/features/design/measurements/uml.svg +++ /dev/null @@ -1,645 +0,0 @@ - - [MeasurementsFormViewModel - | - +study: Study; - +router: GoRouter; - +measurementsArray: FormArray<dynamic>; - +surveyMeasurementFormViewModels: FormViewModelCollection<MeasurementSurveyFormViewModel, MeasurementSurveyFormData>; - +form: FormGroup; - +measurementViewModels: List<MeasurementSurveyFormViewModel>; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +measurementRequired: dynamic; - +titles: Map<FormMode, String> - | - +void read(); - +void setControlsFrom(); - +MeasurementsFormData buildFormData(); - +List<ModelAction<dynamic>> availableActions(); - +List<ModelAction<dynamic>> availablePopupActions(); - +List<ModelAction<dynamic>> availableInlineActions(); - +void onSelectItem(); - +void onNewItem(); - +MeasurementSurveyFormViewModel provide(); - +void onCancel(); - +dynamic onSave() - ] - - [MeasurementsFormViewModel]o-[Study] - [MeasurementsFormViewModel]o-[GoRouter] - [MeasurementsFormViewModel]o-[FormArray] - [MeasurementsFormViewModel]o-[FormViewModelCollection] - [MeasurementsFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[MeasurementsFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[MeasurementsFormViewModel] - [<abstract>IListActionProvider]<:--[MeasurementsFormViewModel] - [<abstract>IProviderArgsResolver]<:--[MeasurementsFormViewModel] - - [StudyDesignMeasurementsFormView - | - +Widget build() - ] - - [<abstract>StudyDesignPageWidget]<:-[StudyDesignMeasurementsFormView] - - [MeasurementsFormData - | - +surveyMeasurements: List<MeasurementSurveyFormData>; - +id: String - | - +Study apply(); - +MeasurementsFormData copy() - ] - - [<abstract>IStudyFormData]<:--[MeasurementsFormData] - - [MeasurementSurveyFormView - | - +formViewModel: MeasurementSurveyFormViewModel - ] - - [MeasurementSurveyFormView]o-[MeasurementSurveyFormViewModel] - - [MeasurementSurveyFormData - | - +measurementId: String; - +title: String; - +introText: String?; - +outroText: String?; - +questionnaireFormData: QuestionnaireFormData; - <static>+kDefaultTitle: String; - +id: String - | - +QuestionnaireTask toQuestionnaireTask(); - +MeasurementSurveyFormData copy() - ] - - [MeasurementSurveyFormData]o-[QuestionnaireFormData] - [<abstract>IFormDataWithSchedule]<:-[MeasurementSurveyFormData] - - [MeasurementSurveyFormViewModel - | - +study: Study; - +measurementIdControl: FormControl<String>; - +instanceIdControl: FormControl<String>; - +surveyTitleControl: FormControl<String>; - +surveyIntroTextControl: FormControl<String>; - +surveyOutroTextControl: FormControl<String>; - +form: FormGroup; - +measurementId: String; - +instanceId: String; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titleRequired: dynamic; - +atLeastOneQuestion: dynamic; - +breadcrumbsTitle: String; - +titles: Map<FormMode, String> - | - +void setControlsFrom(); - +MeasurementSurveyFormData buildFormData(); - +List<ModelAction<dynamic>> availableActions(); - +List<ModelAction<dynamic>> availablePopupActions(); - +List<ModelAction<dynamic>> availableInlineActions(); - +void onSelectItem(); - +void onNewItem(); - +SurveyQuestionFormRouteArgs buildNewFormRouteArgs(); - +SurveyQuestionFormRouteArgs buildFormRouteArgs(); - +MeasurementSurveyFormViewModel createDuplicate() - ] - - [MeasurementSurveyFormViewModel]o-[Study] - [MeasurementSurveyFormViewModel]o-[FormControl] - [MeasurementSurveyFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[MeasurementSurveyFormViewModel] - [<abstract>WithQuestionnaireControls]<:-[MeasurementSurveyFormViewModel] - [<abstract>WithScheduleControls]<:-[MeasurementSurveyFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[MeasurementSurveyFormViewModel] - [<abstract>IListActionProvider]<:--[MeasurementSurveyFormViewModel] - [<abstract>IProviderArgsResolver]<:--[MeasurementSurveyFormViewModel] - - [SurveyPreview - | - +routeArgs: MeasurementFormRouteArgs - | - +Widget build() - ] - - [SurveyPreview]o-[MeasurementFormRouteArgs] - [<abstract>ConsumerWidget]<:-[SurveyPreview] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - MeasurementsFormViewModel - - - - - - +study: Study - +router: GoRouter - +measurementsArray: FormArray<dynamic> - +surveyMeasurementFormViewModels: FormViewModelCollection<MeasurementSurveyFormViewModel, MeasurementSurveyFormData> - +form: FormGroup - +measurementViewModels: List<MeasurementSurveyFormViewModel> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +measurementRequired: dynamic - +titles: Map<FormMode, String> - - - - - - +void read() - +void setControlsFrom() - +MeasurementsFormData buildFormData() - +List<ModelAction<dynamic>> availableActions() - +List<ModelAction<dynamic>> availablePopupActions() - +List<ModelAction<dynamic>> availableInlineActions() - +void onSelectItem() - +void onNewItem() - +MeasurementSurveyFormViewModel provide() - +void onCancel() - +dynamic onSave() - - - - - - - - - - - Study - - - - - - - - - - - GoRouter - - - - - - - - - - - FormArray - - - - - - - - - - - FormViewModelCollection - - - - - - - - - - - FormGroup - - - - - - - - - - - FormViewModel - - - - - - - - - - - IFormViewModelDelegate - - - - - - - - - - - IListActionProvider - - - - - - - - - - - IProviderArgsResolver - - - - - - - - - - - - StudyDesignMeasurementsFormView - - - - - - +Widget build() - - - - - - - - - - - StudyDesignPageWidget - - - - - - - - - - - - - MeasurementsFormData - - - - - - +surveyMeasurements: List<MeasurementSurveyFormData> - +id: String - - - - - - +Study apply() - +MeasurementsFormData copy() - - - - - - - - - - - IStudyFormData - - - - - - - - - - - - MeasurementSurveyFormView - - - - - - +formViewModel: MeasurementSurveyFormViewModel - - - - - - - - - - - - - MeasurementSurveyFormViewModel - - - - - - +study: Study - +measurementIdControl: FormControl<String> - +instanceIdControl: FormControl<String> - +surveyTitleControl: FormControl<String> - +surveyIntroTextControl: FormControl<String> - +surveyOutroTextControl: FormControl<String> - +form: FormGroup - +measurementId: String - +instanceId: String - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titleRequired: dynamic - +atLeastOneQuestion: dynamic - +breadcrumbsTitle: String - +titles: Map<FormMode, String> - - - - - - +void setControlsFrom() - +MeasurementSurveyFormData buildFormData() - +List<ModelAction<dynamic>> availableActions() - +List<ModelAction<dynamic>> availablePopupActions() - +List<ModelAction<dynamic>> availableInlineActions() - +void onSelectItem() - +void onNewItem() - +SurveyQuestionFormRouteArgs buildNewFormRouteArgs() - +SurveyQuestionFormRouteArgs buildFormRouteArgs() - +MeasurementSurveyFormViewModel createDuplicate() - - - - - - - - - - - - - MeasurementSurveyFormData - - - - - - +measurementId: String - +title: String - +introText: String? - +outroText: String? - +questionnaireFormData: QuestionnaireFormData - <static>+kDefaultTitle: String - +id: String - - - - - - +QuestionnaireTask toQuestionnaireTask() - +MeasurementSurveyFormData copy() - - - - - - - - - - - QuestionnaireFormData - - - - - - - - - - - IFormDataWithSchedule - - - - - - - - - - - FormControl - - - - - - - - - - - ManagedFormViewModel - - - - - - - - - - - WithQuestionnaireControls - - - - - - - - - - - WithScheduleControls - - - - - - - - - - - - - SurveyPreview - - - - - - +routeArgs: MeasurementFormRouteArgs - - - - - - +Widget build() - - - - - - - - - - - MeasurementFormRouteArgs - - - - - - - - - - - ConsumerWidget - - - - - - - - - \ No newline at end of file diff --git a/docs/uml/designer_v2/lib/features/design/reports/section/types/uml.svg b/docs/uml/designer_v2/lib/features/design/reports/section/types/uml.svg deleted file mode 100644 index 023bcc555..000000000 --- a/docs/uml/designer_v2/lib/features/design/reports/section/types/uml.svg +++ /dev/null @@ -1,446 +0,0 @@ - - [TemporalAggregationFormatted - | - -_value: TemporalAggregation; - <static>+values: List<TemporalAggregationFormatted>; - +value: TemporalAggregation; - +string: String; - +icon: IconData?; - +hashCode: int - | - +bool ==(); - +String toString(); - +String toJson(); - <static>+TemporalAggregationFormatted fromJson() - ] - - [TemporalAggregationFormatted]o-[TemporalAggregation] - [TemporalAggregationFormatted]o-[IconData] - - [ImprovementDirectionFormatted - | - -_value: ImprovementDirection; - <static>+values: List<ImprovementDirectionFormatted>; - +value: ImprovementDirection; - +string: String; - +icon: IconData?; - +hashCode: int - | - +bool ==(); - +String toString(); - +String toJson(); - <static>+ImprovementDirectionFormatted fromJson() - ] - - [ImprovementDirectionFormatted]o-[ImprovementDirection] - [ImprovementDirectionFormatted]o-[IconData] - - [ReportSectionType - | - +index: int; - <static>+values: List<ReportSectionType>; - <static>+average: ReportSectionType; - <static>+linearRegression: ReportSectionType - ] - - [ReportSectionType]o-[ReportSectionType] - [Enum]<:--[ReportSectionType] - - [DataReferenceIdentifier - | - +hashCode: int - | - +bool ==() - ] - - [DataReference]<:-[DataReferenceIdentifier] - - [DataReferenceEditor - | - +formControl: FormControl<DataReferenceIdentifier<T>>; - +availableTasks: List<Task>; - +buildReactiveDropdownField: ReactiveDropdownField<dynamic> - | - +FormTableRow buildFormTableRow(); - -List<DropdownMenuItem<DataReferenceIdentifier<dynamic>>> _dataReferenceItems() - ] - - [DataReferenceEditor]o-[FormControl] - [DataReferenceEditor]o-[ReactiveDropdownField] - - [AverageSectionFormView - | - +formViewModel: ReportItemFormViewModel; - +studyId: String; - +reportSectionColumnWidth: Map<int, TableColumnWidth> - | - +Widget build() - ] - - [AverageSectionFormView]o-[ReportItemFormViewModel] - [<abstract>ConsumerWidget]<:-[AverageSectionFormView] - - [LinearRegressionSectionFormView - | - +formViewModel: ReportItemFormViewModel; - +studyId: String; - +reportSectionColumnWidth: Map<int, TableColumnWidth> - | - +Widget build() - ] - - [LinearRegressionSectionFormView]o-[ReportItemFormViewModel] - [<abstract>ConsumerWidget]<:-[LinearRegressionSectionFormView] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - TemporalAggregationFormatted - - - - - - -_value: TemporalAggregation - <static>+values: List<TemporalAggregationFormatted> - +value: TemporalAggregation - +string: String - +icon: IconData? - +hashCode: int - - - - - - +bool ==() - +String toString() - +String toJson() - <static>+TemporalAggregationFormatted fromJson() - - - - - - - - - - - TemporalAggregation - - - - - - - - - - - IconData - - - - - - - - - - - - - ImprovementDirectionFormatted - - - - - - -_value: ImprovementDirection - <static>+values: List<ImprovementDirectionFormatted> - +value: ImprovementDirection - +string: String - +icon: IconData? - +hashCode: int - - - - - - +bool ==() - +String toString() - +String toJson() - <static>+ImprovementDirectionFormatted fromJson() - - - - - - - - - - - ImprovementDirection - - - - - - - - - - - - ReportSectionType - - - - - - +index: int - <static>+values: List<ReportSectionType> - <static>+average: ReportSectionType - <static>+linearRegression: ReportSectionType - - - - - - - - - - - Enum - - - - - - - - - - - - - DataReferenceIdentifier - - - - - - +hashCode: int - - - - - - +bool ==() - - - - - - - - - - - DataReference - - - - - - - - - - - - - DataReferenceEditor - - - - - - +formControl: FormControl<DataReferenceIdentifier<T>> - +availableTasks: List<Task> - +buildReactiveDropdownField: ReactiveDropdownField<dynamic> - - - - - - +FormTableRow buildFormTableRow() - -List<DropdownMenuItem<DataReferenceIdentifier<dynamic>>> _dataReferenceItems() - - - - - - - - - - - FormControl - - - - - - - - - - - ReactiveDropdownField - - - - - - - - - - - - - AverageSectionFormView - - - - - - +formViewModel: ReportItemFormViewModel - +studyId: String - +reportSectionColumnWidth: Map<int, TableColumnWidth> - - - - - - +Widget build() - - - - - - - - - - - ReportItemFormViewModel - - - - - - - - - - - ConsumerWidget - - - - - - - - - - - - - LinearRegressionSectionFormView - - - - - - +formViewModel: ReportItemFormViewModel - +studyId: String - +reportSectionColumnWidth: Map<int, TableColumnWidth> - - - - - - +Widget build() - - - - - - - - - \ No newline at end of file diff --git a/docs/uml/designer_v2/lib/features/design/reports/section/uml.svg b/docs/uml/designer_v2/lib/features/design/reports/section/uml.svg deleted file mode 100644 index 61458f4da..000000000 --- a/docs/uml/designer_v2/lib/features/design/reports/section/uml.svg +++ /dev/null @@ -1,705 +0,0 @@ - - [ReportItemFormView - | - +formViewModel: ReportItemFormViewModel; - +studyId: String; - +reportSectionColumnWidth: dynamic; - +sectionTypeBodyBuilder: Widget Function(BuildContext) - | - +Widget build(); - -dynamic _buildSectionText(); - -dynamic _buildSectionTypeHeader() - ] - - [ReportItemFormView]o-[ReportItemFormViewModel] - [ReportItemFormView]o-[Widget Function(BuildContext)] - - [TemporalAggregationFormatted - | - -_value: TemporalAggregation; - <static>+values: List<TemporalAggregationFormatted>; - +value: TemporalAggregation; - +string: String; - +icon: IconData?; - +hashCode: int - | - +bool ==(); - +String toString(); - +String toJson(); - <static>+TemporalAggregationFormatted fromJson() - ] - - [TemporalAggregationFormatted]o-[TemporalAggregation] - [TemporalAggregationFormatted]o-[IconData] - - [ImprovementDirectionFormatted - | - -_value: ImprovementDirection; - <static>+values: List<ImprovementDirectionFormatted>; - +value: ImprovementDirection; - +string: String; - +icon: IconData?; - +hashCode: int - | - +bool ==(); - +String toString(); - +String toJson(); - <static>+ImprovementDirectionFormatted fromJson() - ] - - [ImprovementDirectionFormatted]o-[ImprovementDirection] - [ImprovementDirectionFormatted]o-[IconData] - - [ReportSectionType - | - +index: int; - <static>+values: List<ReportSectionType>; - <static>+average: ReportSectionType; - <static>+linearRegression: ReportSectionType - ] - - [ReportSectionType]o-[ReportSectionType] - [Enum]<:--[ReportSectionType] - - [DataReferenceIdentifier - | - +hashCode: int - | - +bool ==() - ] - - [DataReference]<:-[DataReferenceIdentifier] - - [DataReferenceEditor - | - +formControl: FormControl<DataReferenceIdentifier<T>>; - +availableTasks: List<Task>; - +buildReactiveDropdownField: ReactiveDropdownField<dynamic> - | - +FormTableRow buildFormTableRow(); - -List<DropdownMenuItem<DataReferenceIdentifier<dynamic>>> _dataReferenceItems() - ] - - [DataReferenceEditor]o-[FormControl] - [DataReferenceEditor]o-[ReactiveDropdownField] - - [AverageSectionFormView - | - +formViewModel: ReportItemFormViewModel; - +studyId: String; - +reportSectionColumnWidth: Map<int, TableColumnWidth> - | - +Widget build() - ] - - [AverageSectionFormView]o-[ReportItemFormViewModel] - [<abstract>ConsumerWidget]<:-[AverageSectionFormView] - - [LinearRegressionSectionFormView - | - +formViewModel: ReportItemFormViewModel; - +studyId: String; - +reportSectionColumnWidth: Map<int, TableColumnWidth> - | - +Widget build() - ] - - [LinearRegressionSectionFormView]o-[ReportItemFormViewModel] - [<abstract>ConsumerWidget]<:-[LinearRegressionSectionFormView] - - [ReportItemFormData - | - +isPrimary: bool; - +section: ReportSection; - +id: String - | - <static>+dynamic fromDomainModel(); - +ReportItemFormData copy() - ] - - [ReportItemFormData]o-[<abstract>ReportSection] - [<abstract>IFormData]<:-[ReportItemFormData] - - [ReportItemFormViewModel - | - <static>+defaultSectionType: ReportSectionType; - +sectionIdControl: FormControl<String>; - +sectionTypeControl: FormControl<ReportSectionType>; - +titleControl: FormControl<String>; - +descriptionControl: FormControl<String>; - +sectionControl: FormControl<ReportSection>; - +dataReferenceControl: FormControl<DataReferenceIdentifier<num>>; - +temporalAggregationControl: FormControl<TemporalAggregationFormatted>; - +improvementDirectionControl: FormControl<ImprovementDirectionFormatted>; - +alphaControl: FormControl<double>; - -_controlsBySectionType: Map<ReportSectionType, FormGroup>; - -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - -_validationConfigsBySectionType: Map<ReportSectionType, Map<FormValidationSetEnum, List<FormControlValidation>>>; - +sectionBaseControls: Map<String, AbstractControl<dynamic>>; - +form: FormGroup; - +sectionId: String; - +sectionType: ReportSectionType; - <static>+sectionTypeControlOptions: List<FormControlOption<ReportSectionType>>; - <static>+temporalAggregationControlOptions: List<FormControlOption<TemporalAggregationFormatted>>; - <static>+improvementDirectionControlOptions: List<FormControlOption<ImprovementDirectionFormatted>>; - +titles: Map<FormMode, String>; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titleRequired: dynamic; - +descriptionRequired: dynamic; - +dataReferenceRequired: dynamic; - +aggregationRequired: dynamic; - +improvementDirectionRequired: dynamic; - +alphaConfidenceRequired: dynamic - | - -List<FormControlValidation> _getValidationConfig(); - +ReportItemFormData buildFormData(); - +ReportItemFormViewModel createDuplicate(); - +dynamic onSectionTypeChanged(); - -void _updateFormControls(); - +void setControlsFrom() - ] - - [ReportItemFormViewModel]o-[ReportSectionType] - [ReportItemFormViewModel]o-[FormControl] - [ReportItemFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[ReportItemFormViewModel] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ReportItemFormView - - - - - - +formViewModel: ReportItemFormViewModel - +studyId: String - +reportSectionColumnWidth: dynamic - +sectionTypeBodyBuilder: Widget Function(BuildContext) - - - - - - +Widget build() - -dynamic _buildSectionText() - -dynamic _buildSectionTypeHeader() - - - - - - - - - - - - - ReportItemFormViewModel - - - - - - <static>+defaultSectionType: ReportSectionType - +sectionIdControl: FormControl<String> - +sectionTypeControl: FormControl<ReportSectionType> - +titleControl: FormControl<String> - +descriptionControl: FormControl<String> - +sectionControl: FormControl<ReportSection> - +dataReferenceControl: FormControl<DataReferenceIdentifier<num>> - +temporalAggregationControl: FormControl<TemporalAggregationFormatted> - +improvementDirectionControl: FormControl<ImprovementDirectionFormatted> - +alphaControl: FormControl<double> - -_controlsBySectionType: Map<ReportSectionType, FormGroup> - -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - -_validationConfigsBySectionType: Map<ReportSectionType, Map<FormValidationSetEnum, List<FormControlValidation>>> - +sectionBaseControls: Map<String, AbstractControl<dynamic>> - +form: FormGroup - +sectionId: String - +sectionType: ReportSectionType - <static>+sectionTypeControlOptions: List<FormControlOption<ReportSectionType>> - <static>+temporalAggregationControlOptions: List<FormControlOption<TemporalAggregationFormatted>> - <static>+improvementDirectionControlOptions: List<FormControlOption<ImprovementDirectionFormatted>> - +titles: Map<FormMode, String> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titleRequired: dynamic - +descriptionRequired: dynamic - +dataReferenceRequired: dynamic - +aggregationRequired: dynamic - +improvementDirectionRequired: dynamic - +alphaConfidenceRequired: dynamic - - - - - - -List<FormControlValidation> _getValidationConfig() - +ReportItemFormData buildFormData() - +ReportItemFormViewModel createDuplicate() - +dynamic onSectionTypeChanged() - -void _updateFormControls() - +void setControlsFrom() - - - - - - - - - - - Widget Function(BuildContext) - - - - - - - - - - - - - TemporalAggregationFormatted - - - - - - -_value: TemporalAggregation - <static>+values: List<TemporalAggregationFormatted> - +value: TemporalAggregation - +string: String - +icon: IconData? - +hashCode: int - - - - - - +bool ==() - +String toString() - +String toJson() - <static>+TemporalAggregationFormatted fromJson() - - - - - - - - - - - TemporalAggregation - - - - - - - - - - - IconData - - - - - - - - - - - - - ImprovementDirectionFormatted - - - - - - -_value: ImprovementDirection - <static>+values: List<ImprovementDirectionFormatted> - +value: ImprovementDirection - +string: String - +icon: IconData? - +hashCode: int - - - - - - +bool ==() - +String toString() - +String toJson() - <static>+ImprovementDirectionFormatted fromJson() - - - - - - - - - - - ImprovementDirection - - - - - - - - - - - - ReportSectionType - - - - - - +index: int - <static>+values: List<ReportSectionType> - <static>+average: ReportSectionType - <static>+linearRegression: ReportSectionType - - - - - - - - - - - Enum - - - - - - - - - - - - - DataReferenceIdentifier - - - - - - +hashCode: int - - - - - - +bool ==() - - - - - - - - - - - DataReference - - - - - - - - - - - - - DataReferenceEditor - - - - - - +formControl: FormControl<DataReferenceIdentifier<T>> - +availableTasks: List<Task> - +buildReactiveDropdownField: ReactiveDropdownField<dynamic> - - - - - - +FormTableRow buildFormTableRow() - -List<DropdownMenuItem<DataReferenceIdentifier<dynamic>>> _dataReferenceItems() - - - - - - - - - - - FormControl - - - - - - - - - - - ReactiveDropdownField - - - - - - - - - - - - - AverageSectionFormView - - - - - - +formViewModel: ReportItemFormViewModel - +studyId: String - +reportSectionColumnWidth: Map<int, TableColumnWidth> - - - - - - +Widget build() - - - - - - - - - - - ConsumerWidget - - - - - - - - - - - - - LinearRegressionSectionFormView - - - - - - +formViewModel: ReportItemFormViewModel - +studyId: String - +reportSectionColumnWidth: Map<int, TableColumnWidth> - - - - - - +Widget build() - - - - - - - - - - - - - ReportItemFormData - - - - - - +isPrimary: bool - +section: ReportSection - +id: String - - - - - - <static>+dynamic fromDomainModel() - +ReportItemFormData copy() - - - - - - - - - - - ReportSection - - - - - - - - - - - IFormData - - - - - - - - - - - FormGroup - - - - - - - - - - - ManagedFormViewModel - - - - - - - - - \ No newline at end of file diff --git a/docs/uml/designer_v2/lib/features/design/reports/uml.svg b/docs/uml/designer_v2/lib/features/design/reports/uml.svg deleted file mode 100644 index c1d5b37ce..000000000 --- a/docs/uml/designer_v2/lib/features/design/reports/uml.svg +++ /dev/null @@ -1,1170 +0,0 @@ - - [ReportBadge - | - +status: ReportStatus?; - +type: BadgeType; - +showPrefixIcon: bool; - +showTooltip: bool - | - +Widget build() - ] - - [ReportBadge]o-[ReportStatus] - [ReportBadge]o-[BadgeType] - - [ReportsFormViewModel - | - +study: Study; - +router: GoRouter; - +reportItemDelegate: ReportFormItemDelegate; - +reportItemArray: FormArray<dynamic>; - +reportItemFormViewModels: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData>; - +form: FormGroup; - +reportItemModels: List<ReportItemFormViewModel>; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titles: Map<FormMode, String>; - +canTestConsent: bool - | - +void setControlsFrom(); - +ReportsFormData buildFormData(); - +void read(); - +ReportItemFormRouteArgs buildNewReportItemFormRouteArgs(); - +ReportItemFormRouteArgs buildReportItemFormRouteArgs(); - +dynamic testReport(); - +void onCancel(); - +dynamic onSave(); - +ReportItemFormViewModel provide() - ] - - [ReportsFormViewModel]o-[Study] - [ReportsFormViewModel]o-[GoRouter] - [ReportsFormViewModel]o-[ReportFormItemDelegate] - [ReportsFormViewModel]o-[FormArray] - [ReportsFormViewModel]o-[FormViewModelCollection] - [ReportsFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[ReportsFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[ReportsFormViewModel] - [<abstract>IProviderArgsResolver]<:--[ReportsFormViewModel] - - [ReportFormItemDelegate - | - +formViewModelCollection: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData>; - +owner: ReportsFormViewModel; - +propagateOnSave: bool; - +validationSet: dynamic - | - +void onCancel(); - +dynamic onSave(); - +ReportItemFormViewModel provide(); - +List<ModelAction<dynamic>> availableActions(); - +void onNewItem(); - +void onSelectItem() - ] - - [ReportFormItemDelegate]o-[FormViewModelCollection] - [ReportFormItemDelegate]o-[ReportsFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[ReportFormItemDelegate] - [<abstract>IListActionProvider]<:--[ReportFormItemDelegate] - [<abstract>IProviderArgsResolver]<:--[ReportFormItemDelegate] - - [StudyDesignReportsFormView - | - +Widget build(); - -dynamic _showReportItemSidesheetWithArgs() - ] - - [<abstract>StudyDesignPageWidget]<:-[StudyDesignReportsFormView] - - [ReportsFormData - | - +reportItems: List<ReportItemFormData>; - +id: String - | - +Study apply(); - +ReportsFormData copy() - ] - - [<abstract>IStudyFormData]<:--[ReportsFormData] - - [ReportStatus - | - +index: int; - <static>+values: List<ReportStatus>; - <static>+primary: ReportStatus; - <static>+secondary: ReportStatus - ] - - [ReportStatus]o-[ReportStatus] - [Enum]<:--[ReportStatus] - - [ReportItemFormViewModel - | - <static>+defaultSectionType: ReportSectionType; - +sectionIdControl: FormControl<String>; - +sectionTypeControl: FormControl<ReportSectionType>; - +titleControl: FormControl<String>; - +descriptionControl: FormControl<String>; - +sectionControl: FormControl<ReportSection>; - +dataReferenceControl: FormControl<DataReferenceIdentifier<num>>; - +temporalAggregationControl: FormControl<TemporalAggregationFormatted>; - +improvementDirectionControl: FormControl<ImprovementDirectionFormatted>; - +alphaControl: FormControl<double>; - -_controlsBySectionType: Map<ReportSectionType, FormGroup>; - -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - -_validationConfigsBySectionType: Map<ReportSectionType, Map<FormValidationSetEnum, List<FormControlValidation>>>; - +sectionBaseControls: Map<String, AbstractControl<dynamic>>; - +form: FormGroup; - +sectionId: String; - +sectionType: ReportSectionType; - <static>+sectionTypeControlOptions: List<FormControlOption<ReportSectionType>>; - <static>+temporalAggregationControlOptions: List<FormControlOption<TemporalAggregationFormatted>>; - <static>+improvementDirectionControlOptions: List<FormControlOption<ImprovementDirectionFormatted>>; - +titles: Map<FormMode, String>; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titleRequired: dynamic; - +descriptionRequired: dynamic; - +dataReferenceRequired: dynamic; - +aggregationRequired: dynamic; - +improvementDirectionRequired: dynamic; - +alphaConfidenceRequired: dynamic - | - -List<FormControlValidation> _getValidationConfig(); - +ReportItemFormData buildFormData(); - +ReportItemFormViewModel createDuplicate(); - +dynamic onSectionTypeChanged(); - -void _updateFormControls(); - +void setControlsFrom() - ] - - [ReportItemFormViewModel]o-[ReportSectionType] - [ReportItemFormViewModel]o-[FormControl] - [ReportItemFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[ReportItemFormViewModel] - - [ReportItemFormData - | - +isPrimary: bool; - +section: ReportSection; - +id: String - | - <static>+dynamic fromDomainModel(); - +ReportItemFormData copy() - ] - - [ReportItemFormData]o-[<abstract>ReportSection] - [<abstract>IFormData]<:-[ReportItemFormData] - - [ReportItemFormView - | - +formViewModel: ReportItemFormViewModel; - +studyId: String; - +reportSectionColumnWidth: dynamic; - +sectionTypeBodyBuilder: Widget Function(BuildContext) - | - +Widget build(); - -dynamic _buildSectionText(); - -dynamic _buildSectionTypeHeader() - ] - - [ReportItemFormView]o-[ReportItemFormViewModel] - [ReportItemFormView]o-[Widget Function(BuildContext)] - - [TemporalAggregationFormatted - | - -_value: TemporalAggregation; - <static>+values: List<TemporalAggregationFormatted>; - +value: TemporalAggregation; - +string: String; - +icon: IconData?; - +hashCode: int - | - +bool ==(); - +String toString(); - +String toJson(); - <static>+TemporalAggregationFormatted fromJson() - ] - - [TemporalAggregationFormatted]o-[TemporalAggregation] - [TemporalAggregationFormatted]o-[IconData] - - [ImprovementDirectionFormatted - | - -_value: ImprovementDirection; - <static>+values: List<ImprovementDirectionFormatted>; - +value: ImprovementDirection; - +string: String; - +icon: IconData?; - +hashCode: int - | - +bool ==(); - +String toString(); - +String toJson(); - <static>+ImprovementDirectionFormatted fromJson() - ] - - [ImprovementDirectionFormatted]o-[ImprovementDirection] - [ImprovementDirectionFormatted]o-[IconData] - - [ReportSectionType - | - +index: int; - <static>+values: List<ReportSectionType>; - <static>+average: ReportSectionType; - <static>+linearRegression: ReportSectionType - ] - - [ReportSectionType]o-[ReportSectionType] - [Enum]<:--[ReportSectionType] - - [DataReferenceIdentifier - | - +hashCode: int - | - +bool ==() - ] - - [DataReference]<:-[DataReferenceIdentifier] - - [LinearRegressionSectionFormView - | - +formViewModel: ReportItemFormViewModel; - +studyId: String; - +reportSectionColumnWidth: Map<int, TableColumnWidth> - | - +Widget build() - ] - - [LinearRegressionSectionFormView]o-[ReportItemFormViewModel] - [<abstract>ConsumerWidget]<:-[LinearRegressionSectionFormView] - - [DataReferenceEditor - | - +formControl: FormControl<DataReferenceIdentifier<T>>; - +availableTasks: List<Task>; - +buildReactiveDropdownField: ReactiveDropdownField<dynamic> - | - +FormTableRow buildFormTableRow(); - -List<DropdownMenuItem<DataReferenceIdentifier<dynamic>>> _dataReferenceItems() - ] - - [DataReferenceEditor]o-[FormControl] - [DataReferenceEditor]o-[ReactiveDropdownField] - - [AverageSectionFormView - | - +formViewModel: ReportItemFormViewModel; - +studyId: String; - +reportSectionColumnWidth: Map<int, TableColumnWidth> - | - +Widget build() - ] - - [AverageSectionFormView]o-[ReportItemFormViewModel] - [<abstract>ConsumerWidget]<:-[AverageSectionFormView] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ReportBadge - - - - - - +status: ReportStatus? - +type: BadgeType - +showPrefixIcon: bool - +showTooltip: bool - - - - - - +Widget build() - - - - - - - - - - - - ReportStatus - - - - - - +index: int - <static>+values: List<ReportStatus> - <static>+primary: ReportStatus - <static>+secondary: ReportStatus - - - - - - - - - - - BadgeType - - - - - - - - - - - - - ReportsFormViewModel - - - - - - +study: Study - +router: GoRouter - +reportItemDelegate: ReportFormItemDelegate - +reportItemArray: FormArray<dynamic> - +reportItemFormViewModels: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData> - +form: FormGroup - +reportItemModels: List<ReportItemFormViewModel> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titles: Map<FormMode, String> - +canTestConsent: bool - - - - - - +void setControlsFrom() - +ReportsFormData buildFormData() - +void read() - +ReportItemFormRouteArgs buildNewReportItemFormRouteArgs() - +ReportItemFormRouteArgs buildReportItemFormRouteArgs() - +dynamic testReport() - +void onCancel() - +dynamic onSave() - +ReportItemFormViewModel provide() - - - - - - - - - - - Study - - - - - - - - - - - GoRouter - - - - - - - - - - - - - ReportFormItemDelegate - - - - - - +formViewModelCollection: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData> - +owner: ReportsFormViewModel - +propagateOnSave: bool - +validationSet: dynamic - - - - - - +void onCancel() - +dynamic onSave() - +ReportItemFormViewModel provide() - +List<ModelAction<dynamic>> availableActions() - +void onNewItem() - +void onSelectItem() - - - - - - - - - - - FormArray - - - - - - - - - - - FormViewModelCollection - - - - - - - - - - - FormGroup - - - - - - - - - - - FormViewModel - - - - - - - - - - - IFormViewModelDelegate - - - - - - - - - - - IProviderArgsResolver - - - - - - - - - - - IListActionProvider - - - - - - - - - - - - StudyDesignReportsFormView - - - - - - +Widget build() - -dynamic _showReportItemSidesheetWithArgs() - - - - - - - - - - - StudyDesignPageWidget - - - - - - - - - - - - - ReportsFormData - - - - - - +reportItems: List<ReportItemFormData> - +id: String - - - - - - +Study apply() - +ReportsFormData copy() - - - - - - - - - - - IStudyFormData - - - - - - - - - - - Enum - - - - - - - - - - - - - ReportItemFormViewModel - - - - - - <static>+defaultSectionType: ReportSectionType - +sectionIdControl: FormControl<String> - +sectionTypeControl: FormControl<ReportSectionType> - +titleControl: FormControl<String> - +descriptionControl: FormControl<String> - +sectionControl: FormControl<ReportSection> - +dataReferenceControl: FormControl<DataReferenceIdentifier<num>> - +temporalAggregationControl: FormControl<TemporalAggregationFormatted> - +improvementDirectionControl: FormControl<ImprovementDirectionFormatted> - +alphaControl: FormControl<double> - -_controlsBySectionType: Map<ReportSectionType, FormGroup> - -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - -_validationConfigsBySectionType: Map<ReportSectionType, Map<FormValidationSetEnum, List<FormControlValidation>>> - +sectionBaseControls: Map<String, AbstractControl<dynamic>> - +form: FormGroup - +sectionId: String - +sectionType: ReportSectionType - <static>+sectionTypeControlOptions: List<FormControlOption<ReportSectionType>> - <static>+temporalAggregationControlOptions: List<FormControlOption<TemporalAggregationFormatted>> - <static>+improvementDirectionControlOptions: List<FormControlOption<ImprovementDirectionFormatted>> - +titles: Map<FormMode, String> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titleRequired: dynamic - +descriptionRequired: dynamic - +dataReferenceRequired: dynamic - +aggregationRequired: dynamic - +improvementDirectionRequired: dynamic - +alphaConfidenceRequired: dynamic - - - - - - -List<FormControlValidation> _getValidationConfig() - +ReportItemFormData buildFormData() - +ReportItemFormViewModel createDuplicate() - +dynamic onSectionTypeChanged() - -void _updateFormControls() - +void setControlsFrom() - - - - - - - - - - - - ReportSectionType - - - - - - +index: int - <static>+values: List<ReportSectionType> - <static>+average: ReportSectionType - <static>+linearRegression: ReportSectionType - - - - - - - - - - - FormControl - - - - - - - - - - - ManagedFormViewModel - - - - - - - - - - - - - ReportItemFormData - - - - - - +isPrimary: bool - +section: ReportSection - +id: String - - - - - - <static>+dynamic fromDomainModel() - +ReportItemFormData copy() - - - - - - - - - - - ReportSection - - - - - - - - - - - IFormData - - - - - - - - - - - - - ReportItemFormView - - - - - - +formViewModel: ReportItemFormViewModel - +studyId: String - +reportSectionColumnWidth: dynamic - +sectionTypeBodyBuilder: Widget Function(BuildContext) - - - - - - +Widget build() - -dynamic _buildSectionText() - -dynamic _buildSectionTypeHeader() - - - - - - - - - - - Widget Function(BuildContext) - - - - - - - - - - - - - TemporalAggregationFormatted - - - - - - -_value: TemporalAggregation - <static>+values: List<TemporalAggregationFormatted> - +value: TemporalAggregation - +string: String - +icon: IconData? - +hashCode: int - - - - - - +bool ==() - +String toString() - +String toJson() - <static>+TemporalAggregationFormatted fromJson() - - - - - - - - - - - TemporalAggregation - - - - - - - - - - - IconData - - - - - - - - - - - - - ImprovementDirectionFormatted - - - - - - -_value: ImprovementDirection - <static>+values: List<ImprovementDirectionFormatted> - +value: ImprovementDirection - +string: String - +icon: IconData? - +hashCode: int - - - - - - +bool ==() - +String toString() - +String toJson() - <static>+ImprovementDirectionFormatted fromJson() - - - - - - - - - - - ImprovementDirection - - - - - - - - - - - - - DataReferenceIdentifier - - - - - - +hashCode: int - - - - - - +bool ==() - - - - - - - - - - - DataReference - - - - - - - - - - - - - LinearRegressionSectionFormView - - - - - - +formViewModel: ReportItemFormViewModel - +studyId: String - +reportSectionColumnWidth: Map<int, TableColumnWidth> - - - - - - +Widget build() - - - - - - - - - - - ConsumerWidget - - - - - - - - - - - - - DataReferenceEditor - - - - - - +formControl: FormControl<DataReferenceIdentifier<T>> - +availableTasks: List<Task> - +buildReactiveDropdownField: ReactiveDropdownField<dynamic> - - - - - - +FormTableRow buildFormTableRow() - -List<DropdownMenuItem<DataReferenceIdentifier<dynamic>>> _dataReferenceItems() - - - - - - - - - - - ReactiveDropdownField - - - - - - - - - - - - - AverageSectionFormView - - - - - - +formViewModel: ReportItemFormViewModel - +studyId: String - +reportSectionColumnWidth: Map<int, TableColumnWidth> - - - - - - +Widget build() - - - - - - - - - \ No newline at end of file diff --git a/docs/uml/designer_v2/lib/features/design/shared/questionnaire/question/types/uml.svg b/docs/uml/designer_v2/lib/features/design/shared/questionnaire/question/types/uml.svg deleted file mode 100644 index 52be35c24..000000000 --- a/docs/uml/designer_v2/lib/features/design/shared/questionnaire/question/types/uml.svg +++ /dev/null @@ -1,272 +0,0 @@ - - [SurveyQuestionType - | - +index: int; - <static>+values: List<SurveyQuestionType>; - <static>+choice: SurveyQuestionType; - <static>+bool: SurveyQuestionType; - <static>+scale: SurveyQuestionType; - <static>+freeText: SurveyQuestionType - ] - - [SurveyQuestionType]o-[SurveyQuestionType] - [Enum]<:--[SurveyQuestionType] - - [<abstract>IScaleQuestionFormViewModel - | - +isMidValuesClearedInfoVisible: bool - ] - - [ScaleQuestionFormView - | - +formViewModel: QuestionFormViewModel - ] - - [ScaleQuestionFormView]o-[QuestionFormViewModel] - - [ChoiceQuestionFormView - | - +formViewModel: QuestionFormViewModel - | - +Widget build() - ] - - [ChoiceQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[ChoiceQuestionFormView] - - [BoolQuestionFormView - | - +formViewModel: QuestionFormViewModel - | - +Widget build() - ] - - [BoolQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[BoolQuestionFormView] - - [FreeTextQuestionFormView - | - +formViewModel: QuestionFormViewModel; - +generateLabelHelpTextMap: dynamic - | - +Widget build(); - +Widget disableOnReadonly(); - +Widget generateRow() - ] - - [FreeTextQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[FreeTextQuestionFormView] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - SurveyQuestionType - - - - - - +index: int - <static>+values: List<SurveyQuestionType> - <static>+choice: SurveyQuestionType - <static>+bool: SurveyQuestionType - <static>+scale: SurveyQuestionType - <static>+freeText: SurveyQuestionType - - - - - - - - - - - Enum - - - - - - - - - - - - IScaleQuestionFormViewModel - - - - - - +isMidValuesClearedInfoVisible: bool - - - - - - - - - - - - ScaleQuestionFormView - - - - - - +formViewModel: QuestionFormViewModel - - - - - - - - - - - QuestionFormViewModel - - - - - - - - - - - - - ChoiceQuestionFormView - - - - - - +formViewModel: QuestionFormViewModel - - - - - - +Widget build() - - - - - - - - - - - ConsumerWidget - - - - - - - - - - - - - BoolQuestionFormView - - - - - - +formViewModel: QuestionFormViewModel - - - - - - +Widget build() - - - - - - - - - - - - - FreeTextQuestionFormView - - - - - - +formViewModel: QuestionFormViewModel - +generateLabelHelpTextMap: dynamic - - - - - - +Widget build() - +Widget disableOnReadonly() - +Widget generateRow() - - - - - - - - - \ No newline at end of file diff --git a/docs/uml/designer_v2/lib/features/design/shared/schedule/uml.svg b/docs/uml/designer_v2/lib/features/design/shared/schedule/uml.svg deleted file mode 100644 index 1808e476c..000000000 --- a/docs/uml/designer_v2/lib/features/design/shared/schedule/uml.svg +++ /dev/null @@ -1,236 +0,0 @@ - - [ScheduleControls - | - +formViewModel: WithScheduleControls - | - +Widget build(); - -List<FormTableRow> _conditionalTimeRestrictions() - ] - - [ScheduleControls]o-[<abstract>WithScheduleControls] - [<abstract>FormConsumerWidget]<:-[ScheduleControls] - - [<abstract>WithScheduleControls - | - +isTimeRestrictedControl: FormControl<bool>; - +instanceID: FormControl<String>; - +restrictedTimeStartControl: FormControl<Time>; - +restrictedTimeStartPickerControl: FormControl<TimeOfDay>; - +restrictedTimeEndControl: FormControl<Time>; - +restrictedTimeEndPickerControl: FormControl<TimeOfDay>; - +hasReminderControl: FormControl<bool>; - +reminderTimeControl: FormControl<Time>; - +reminderTimePickerControl: FormControl<TimeOfDay>; - -_reminderControlStream: StreamSubscription<dynamic>?; - +scheduleFormControls: Map<String, FormControl<Object>>; - +hasReminder: bool; - +isTimeRestricted: bool; - +timeRestriction: List<Time>? - | - +void setScheduleControlsFrom(); - -dynamic _initReminderControl() - ] - - [<abstract>WithScheduleControls]o-[FormControl] - [<abstract>WithScheduleControls]o-[StreamSubscription] - - [<abstract>IFormDataWithSchedule - | - +instanceId: String; - +isTimeLocked: bool; - +timeLockStart: StudyUTimeOfDay?; - +timeLockEnd: StudyUTimeOfDay?; - +hasReminder: bool; - +reminderTime: StudyUTimeOfDay? - | - +Schedule toSchedule() - ] - - [<abstract>IFormDataWithSchedule]o-[StudyUTimeOfDay] - [<abstract>IFormData]<:--[<abstract>IFormDataWithSchedule] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ScheduleControls - - - - - - +formViewModel: WithScheduleControls - - - - - - +Widget build() - -List<FormTableRow> _conditionalTimeRestrictions() - - - - - - - - - - - - - WithScheduleControls - - - - - - +isTimeRestrictedControl: FormControl<bool> - +instanceID: FormControl<String> - +restrictedTimeStartControl: FormControl<Time> - +restrictedTimeStartPickerControl: FormControl<TimeOfDay> - +restrictedTimeEndControl: FormControl<Time> - +restrictedTimeEndPickerControl: FormControl<TimeOfDay> - +hasReminderControl: FormControl<bool> - +reminderTimeControl: FormControl<Time> - +reminderTimePickerControl: FormControl<TimeOfDay> - -_reminderControlStream: StreamSubscription<dynamic>? - +scheduleFormControls: Map<String, FormControl<Object>> - +hasReminder: bool - +isTimeRestricted: bool - +timeRestriction: List<Time>? - - - - - - +void setScheduleControlsFrom() - -dynamic _initReminderControl() - - - - - - - - - - - FormConsumerWidget - - - - - - - - - - - FormControl - - - - - - - - - - - StreamSubscription - - - - - - - - - - - - - IFormDataWithSchedule - - - - - - +instanceId: String - +isTimeLocked: bool - +timeLockStart: StudyUTimeOfDay? - +timeLockEnd: StudyUTimeOfDay? - +hasReminder: bool - +reminderTime: StudyUTimeOfDay? - - - - - - +Schedule toSchedule() - - - - - - - - - - - StudyUTimeOfDay - - - - - - - - - - - IFormData - - - - - - - - - \ No newline at end of file diff --git a/docs/uml/designer_v2/lib/features/forms/uml.svg b/docs/uml/designer_v2/lib/features/forms/uml.svg deleted file mode 100644 index 7f58f6adb..000000000 --- a/docs/uml/designer_v2/lib/features/forms/uml.svg +++ /dev/null @@ -1,937 +0,0 @@ - - [<abstract>ManagedFormViewModel - | - +ManagedFormViewModel<T> createDuplicate() - ] - - [<abstract>FormViewModel]<:-[<abstract>ManagedFormViewModel] - - [FormViewModelNotFoundException - ] - - [Exception]<:--[FormViewModelNotFoundException] - - [FormViewModelCollection - | - +formViewModels: List<T>; - +formArray: FormArray<dynamic>; - +stagedViewModels: List<T>; - +retrievableViewModels: List<T>; - +formData: List<D> - | - +void add(); - +T remove(); - +T? findWhere(); - +T? removeWhere(); - +bool contains(); - +void stage(); - +T commit(); - +void reset(); - +void read() - ] - - [FormViewModelCollection]o-[FormArray] - - [CustomFormControl - | - -_onValueChangedDebouncer: Debouncer?; - -_onStatusChangedDebouncer: Debouncer?; - +onValueChanged: void Function(T?)?; - +onStatusChanged: void Function(ControlStatus)?; - +onStatusChangedDebounceTime: int?; - +onValueChangedDebounceTime: int? - | - +void dispose() - ] - - [CustomFormControl]o-[Debouncer] - [CustomFormControl]o-[void Function(T?)?] - [CustomFormControl]o-[void Function(ControlStatus)?] - [FormControl]<:-[CustomFormControl] - - [FormArrayTable - | - +control: AbstractControl<dynamic>; - +items: List<T>; - +onSelectItem: void Function(T); - +getActionsAt: List<ModelAction<dynamic>> Function(T, int); - +onNewItem: void Function()?; - +rowTitle: String Function(T); - +onNewItemLabel: String; - +sectionTitle: String?; - +sectionDescription: String?; - +emptyIcon: IconData?; - +emptyTitle: String?; - +emptyDescription: String?; - +sectionTitleDivider: bool?; - +rowPrefix: Widget Function(BuildContext, T, int)?; - +rowSuffix: Widget Function(BuildContext, T, int)?; - +leadingWidget: Widget?; - +itemsSectionPadding: EdgeInsets?; - +hideLeadingTrailingWhenEmpty: bool; - <static>+columns: List<StandardTableColumn> - | - +Widget build(); - -List<Widget> _buildRow(); - -Widget _newItemButton() - ] - - [FormArrayTable]o-[<abstract>AbstractControl] - [FormArrayTable]o-[void Function(T)] - [FormArrayTable]o-[List<ModelAction<dynamic>> Function(T, int)] - [FormArrayTable]o-[void Function()?] - [FormArrayTable]o-[String Function(T)] - [FormArrayTable]o-[IconData] - [FormArrayTable]o-[Widget Function(BuildContext, T, int)?] - [FormArrayTable]o-[<abstract>Widget] - [FormArrayTable]o-[EdgeInsets] - - [FormInvalidException - ] - - [Exception]<:--[FormInvalidException] - - [FormConfigException - | - +message: String? - ] - - [Exception]<:--[FormConfigException] - - [<abstract>IFormViewModelDelegate - | - +dynamic onSave(); - +void onCancel() - ] - - [<abstract>IFormGroupController - | - +form: FormGroup - ] - - [<abstract>IFormGroupController]o-[FormGroup] - - [FormControlOption - | - +value: T; - +label: String; - +description: String?; - +props: List<Object?> - ] - - [<abstract>Equatable]<:-[FormControlOption] - - [<abstract>FormViewModel - | - -_formData: T?; - -_formMode: FormMode; - -_validationSet: FormValidationSetEnum?; - +delegate: IFormViewModelDelegate<FormViewModel<dynamic>>?; - +autosave: bool; - -_immediateFormChildrenSubscriptions: List<StreamSubscription<dynamic>>; - -_immediateFormChildrenListenerDebouncer: Debouncer?; - -_autosaveOperation: CancelableOperation<dynamic>?; - -_defaultControlValidators: Map<String, Tuple<List<Validator<dynamic>>, List<AsyncValidator<dynamic>>>>; - +prevFormValue: Map<String, dynamic>?; - <static>-_formKey: String; - +formData: T?; - +formMode: FormMode; - +isReadonly: bool; - +validationSet: FormValidationSetEnum?; - +isDirty: bool; - +title: String; - +isValid: bool; - +titles: Map<FormMode, String>; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - | - -dynamic _setFormData(); - -dynamic _rememberDefaultControlValidators(); - -Tuple<List<Validator<dynamic>>, List<AsyncValidator<dynamic>>>? _getDefaultValidators(); - -dynamic _disableAllControls(); - -dynamic _formModeUpdated(); - -dynamic _restoreControlsFromFormData(); - +void revalidate(); - -void _applyValidationSet(); - +void read(); - +dynamic save(); - +dynamic cancel(); - +void enableAutosave(); - +void listenToImmediateFormChildren(); - +dynamic markFormGroupChanged(); - +void dispose(); - +void setControlsFrom(); - +T buildFormData(); - +void initControls() - ] - - [<abstract>FormViewModel]o-[FormMode] - [<abstract>FormViewModel]o-[<abstract>FormValidationSetEnum] - [<abstract>FormViewModel]o-[<abstract>IFormViewModelDelegate] - [<abstract>FormViewModel]o-[Debouncer] - [<abstract>FormViewModel]o-[CancelableOperation] - [<abstract>IFormGroupController]<:--[<abstract>FormViewModel] - - [FormMode - | - +index: int; - <static>+values: List<FormMode>; - <static>+create: FormMode; - <static>+readonly: FormMode; - <static>+edit: FormMode - ] - - [FormMode]o-[FormMode] - [Enum]<:--[FormMode] - - [UnsavedChangesDialog - | - +Widget build() - ] - - [<abstract>FormValidationSetEnum - ] - - [FormControlValidation - | - +control: AbstractControl<dynamic>; - +validators: List<Validator<dynamic>>; - +asyncValidators: List<AsyncValidator<dynamic>>?; - +validationMessages: Map<String, String Function(Object)> - | - +FormControlValidation merge() - ] - - [FormControlValidation]o-[<abstract>AbstractControl] - - [<abstract>IFormData - | - +id: String - | - +IFormData copy() - ] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ManagedFormViewModel - - - - - - +ManagedFormViewModel<T> createDuplicate() - - - - - - - - - - - - - FormViewModel - - - - - - -_formData: T? - -_formMode: FormMode - -_validationSet: FormValidationSetEnum? - +delegate: IFormViewModelDelegate<FormViewModel<dynamic>>? - +autosave: bool - -_immediateFormChildrenSubscriptions: List<StreamSubscription<dynamic>> - -_immediateFormChildrenListenerDebouncer: Debouncer? - -_autosaveOperation: CancelableOperation<dynamic>? - -_defaultControlValidators: Map<String, Tuple<List<Validator<dynamic>>, List<AsyncValidator<dynamic>>>> - +prevFormValue: Map<String, dynamic>? - <static>-_formKey: String - +formData: T? - +formMode: FormMode - +isReadonly: bool - +validationSet: FormValidationSetEnum? - +isDirty: bool - +title: String - +isValid: bool - +titles: Map<FormMode, String> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - - - - - - -dynamic _setFormData() - -dynamic _rememberDefaultControlValidators() - -Tuple<List<Validator<dynamic>>, List<AsyncValidator<dynamic>>>? _getDefaultValidators() - -dynamic _disableAllControls() - -dynamic _formModeUpdated() - -dynamic _restoreControlsFromFormData() - +void revalidate() - -void _applyValidationSet() - +void read() - +dynamic save() - +dynamic cancel() - +void enableAutosave() - +void listenToImmediateFormChildren() - +dynamic markFormGroupChanged() - +void dispose() - +void setControlsFrom() - +T buildFormData() - +void initControls() - - - - - - - - - - - FormViewModelNotFoundException - - - - - - - - - - - Exception - - - - - - - - - - - - - FormViewModelCollection - - - - - - +formViewModels: List<T> - +formArray: FormArray<dynamic> - +stagedViewModels: List<T> - +retrievableViewModels: List<T> - +formData: List<D> - - - - - - +void add() - +T remove() - +T? findWhere() - +T? removeWhere() - +bool contains() - +void stage() - +T commit() - +void reset() - +void read() - - - - - - - - - - - FormArray - - - - - - - - - - - - - CustomFormControl - - - - - - -_onValueChangedDebouncer: Debouncer? - -_onStatusChangedDebouncer: Debouncer? - +onValueChanged: void Function(T?)? - +onStatusChanged: void Function(ControlStatus)? - +onStatusChangedDebounceTime: int? - +onValueChangedDebounceTime: int? - - - - - - +void dispose() - - - - - - - - - - - Debouncer - - - - - - - - - - - void Function(T?)? - - - - - - - - - - - void Function(ControlStatus)? - - - - - - - - - - - FormControl - - - - - - - - - - - - - FormArrayTable - - - - - - +control: AbstractControl<dynamic> - +items: List<T> - +onSelectItem: void Function(T) - +getActionsAt: List<ModelAction<dynamic>> Function(T, int) - +onNewItem: void Function()? - +rowTitle: String Function(T) - +onNewItemLabel: String - +sectionTitle: String? - +sectionDescription: String? - +emptyIcon: IconData? - +emptyTitle: String? - +emptyDescription: String? - +sectionTitleDivider: bool? - +rowPrefix: Widget Function(BuildContext, T, int)? - +rowSuffix: Widget Function(BuildContext, T, int)? - +leadingWidget: Widget? - +itemsSectionPadding: EdgeInsets? - +hideLeadingTrailingWhenEmpty: bool - <static>+columns: List<StandardTableColumn> - - - - - - +Widget build() - -List<Widget> _buildRow() - -Widget _newItemButton() - - - - - - - - - - - AbstractControl - - - - - - - - - - - void Function(T) - - - - - - - - - - - List<ModelAction<dynamic>> Function(T, int) - - - - - - - - - - - void Function()? - - - - - - - - - - - String Function(T) - - - - - - - - - - - IconData - - - - - - - - - - - Widget Function(BuildContext, T, int)? - - - - - - - - - - - Widget - - - - - - - - - - - EdgeInsets - - - - - - - - - - - FormInvalidException - - - - - - - - - - - - FormConfigException - - - - - - +message: String? - - - - - - - - - - - - IFormViewModelDelegate - - - - - - +dynamic onSave() - +void onCancel() - - - - - - - - - - - - IFormGroupController - - - - - - +form: FormGroup - - - - - - - - - - - FormGroup - - - - - - - - - - - - FormControlOption - - - - - - +value: T - +label: String - +description: String? - +props: List<Object?> - - - - - - - - - - - Equatable - - - - - - - - - - - - FormMode - - - - - - +index: int - <static>+values: List<FormMode> - <static>+create: FormMode - <static>+readonly: FormMode - <static>+edit: FormMode - - - - - - - - - - - FormValidationSetEnum - - - - - - - - - - - CancelableOperation - - - - - - - - - - - Enum - - - - - - - - - - - - UnsavedChangesDialog - - - - - - +Widget build() - - - - - - - - - - - - - FormControlValidation - - - - - - +control: AbstractControl<dynamic> - +validators: List<Validator<dynamic>> - +asyncValidators: List<AsyncValidator<dynamic>>? - +validationMessages: Map<String, String Function(Object)> - - - - - - +FormControlValidation merge() - - - - - - - - - - - - - IFormData - - - - - - +id: String - - - - - - +IFormData copy() - - - - - - - - - \ No newline at end of file diff --git a/docs/uml/designer_v2/lib/features/monitor/uml.svg b/docs/uml/designer_v2/lib/features/monitor/uml.svg deleted file mode 100644 index a3d10873a..000000000 --- a/docs/uml/designer_v2/lib/features/monitor/uml.svg +++ /dev/null @@ -1,52 +0,0 @@ - - [StudyMonitorScreen - | - +Widget build() - ] - - [<abstract>StudyPageWidget]<:-[StudyMonitorScreen] - - - - - - - - - - - - - - - - - - - StudyMonitorScreen - - - - - - +Widget build() - - - - - - - - - - - StudyPageWidget - - - - - - - - - \ No newline at end of file diff --git a/docs/uml/designer_v2/lib/features/publish/uml.svg b/docs/uml/designer_v2/lib/features/publish/uml.svg deleted file mode 100644 index d971c6a59..000000000 --- a/docs/uml/designer_v2/lib/features/publish/uml.svg +++ /dev/null @@ -1,106 +0,0 @@ - - [PublishConfirmationDialog - | - +Widget build() - ] - - [<abstract>StudyPageWidget]<:-[PublishConfirmationDialog] - - [PublishSuccessDialog - | - +Widget build() - ] - - [<abstract>StudyPageWidget]<:-[PublishSuccessDialog] - - [PublishDialog - | - +Widget build() - ] - - [<abstract>StudyPageWidget]<:-[PublishDialog] - - - - - - - - - - - - - - - - - - - - - - - PublishConfirmationDialog - - - - - - +Widget build() - - - - - - - - - - - StudyPageWidget - - - - - - - - - - - - PublishSuccessDialog - - - - - - +Widget build() - - - - - - - - - - - - PublishDialog - - - - - - +Widget build() - - - - - - - - - \ No newline at end of file diff --git a/docs/uml/designer_v2/lib/features/recruit/uml.svg b/docs/uml/designer_v2/lib/features/recruit/uml.svg deleted file mode 100644 index cb4d698e7..000000000 --- a/docs/uml/designer_v2/lib/features/recruit/uml.svg +++ /dev/null @@ -1,498 +0,0 @@ - - [EnrolledBadge - | - +enrolledCount: int - | - +Widget build() - ] - - [StudyRecruitController - | - +inviteCodeRepository: IInviteCodeRepository; - -_invitesSubscription: StreamSubscription<List<WrappedModel<StudyInvite>>>? - | - -dynamic _subscribeInvites(); - +Intervention? getIntervention(); - +int getParticipantCountForInvite(); - +List<ModelAction<dynamic>> availableActions(); - +List<ModelAction<dynamic>> availableInlineActions(); - +void dispose() - ] - - [StudyRecruitController]o-[<abstract>IInviteCodeRepository] - [StudyRecruitController]o-[StreamSubscription] - [StudyBaseController]<:-[StudyRecruitController] - [<abstract>IModelActionProvider]<:--[StudyRecruitController] - - [StudyRecruitScreen - | - +Widget build(); - -Widget _inviteCodesSectionHeader(); - -Widget _newInviteCodeButton(); - -dynamic _onSelectInvite() - ] - - [<abstract>StudyPageWidget]<:-[StudyRecruitScreen] - - [InviteCodeFormView - | - +formViewModel: InviteCodeFormViewModel - | - +Widget build(); - -List<FormTableRow> _conditionalInterventionRows() - ] - - [InviteCodeFormView]o-[InviteCodeFormViewModel] - [<abstract>FormConsumerWidget]<:-[InviteCodeFormView] - - [StudyInvitesTable - | - +invites: List<StudyInvite>; - +onSelect: void Function(StudyInvite); - +getActions: List<ModelAction<dynamic>> Function(StudyInvite); - +getInlineActions: List<ModelAction<dynamic>> Function(StudyInvite); - +getIntervention: Intervention? Function(String); - +getParticipantCountForInvite: int Function(StudyInvite) - | - +Widget build(); - -List<Widget> _buildRow() - ] - - [StudyInvitesTable]o-[void Function(StudyInvite)] - [StudyInvitesTable]o-[List<ModelAction<dynamic>> Function(StudyInvite)] - [StudyInvitesTable]o-[Intervention? Function(String)] - [StudyInvitesTable]o-[int Function(StudyInvite)] - - [InviteCodeFormViewModel - | - +study: Study; - +inviteCodeRepository: IInviteCodeRepository; - +codeControl: FormControl<String>; - +codeControlValidationMessages: Map<String, String Function(dynamic)>; - +isPreconfiguredScheduleControl: FormControl<bool>; - +preconfiguredScheduleTypeControl: FormControl<PhaseSequence>; - +interventionAControl: FormControl<String>; - +interventionBControl: FormControl<String>; - +form: FormGroup; - +titles: Map<FormMode, String>; - +interventionControlOptions: List<FormControlOption<String>>; - +preconfiguredScheduleTypeOptions: List<FormControlOption<PhaseSequence>>; - +isPreconfiguredSchedule: bool; - +preconfiguredSchedule: List<String>? - | - +void initControls(); - -dynamic _uniqueInviteCode(); - +void regenerateCode(); - -String _generateCode(); - +StudyInvite buildFormData(); - +void setControlsFrom(); - +dynamic save() - ] - - [InviteCodeFormViewModel]o-[Study] - [InviteCodeFormViewModel]o-[<abstract>IInviteCodeRepository] - [InviteCodeFormViewModel]o-[FormControl] - [InviteCodeFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[InviteCodeFormViewModel] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - EnrolledBadge - - - - - - +enrolledCount: int - - - - - - +Widget build() - - - - - - - - - - - - - StudyRecruitController - - - - - - +inviteCodeRepository: IInviteCodeRepository - -_invitesSubscription: StreamSubscription<List<WrappedModel<StudyInvite>>>? - - - - - - -dynamic _subscribeInvites() - +Intervention? getIntervention() - +int getParticipantCountForInvite() - +List<ModelAction<dynamic>> availableActions() - +List<ModelAction<dynamic>> availableInlineActions() - +void dispose() - - - - - - - - - - - IInviteCodeRepository - - - - - - - - - - - StreamSubscription - - - - - - - - - - - StudyBaseController - - - - - - - - - - - IModelActionProvider - - - - - - - - - - - - StudyRecruitScreen - - - - - - +Widget build() - -Widget _inviteCodesSectionHeader() - -Widget _newInviteCodeButton() - -dynamic _onSelectInvite() - - - - - - - - - - - StudyPageWidget - - - - - - - - - - - - - InviteCodeFormView - - - - - - +formViewModel: InviteCodeFormViewModel - - - - - - +Widget build() - -List<FormTableRow> _conditionalInterventionRows() - - - - - - - - - - - - - InviteCodeFormViewModel - - - - - - +study: Study - +inviteCodeRepository: IInviteCodeRepository - +codeControl: FormControl<String> - +codeControlValidationMessages: Map<String, String Function(dynamic)> - +isPreconfiguredScheduleControl: FormControl<bool> - +preconfiguredScheduleTypeControl: FormControl<PhaseSequence> - +interventionAControl: FormControl<String> - +interventionBControl: FormControl<String> - +form: FormGroup - +titles: Map<FormMode, String> - +interventionControlOptions: List<FormControlOption<String>> - +preconfiguredScheduleTypeOptions: List<FormControlOption<PhaseSequence>> - +isPreconfiguredSchedule: bool - +preconfiguredSchedule: List<String>? - - - - - - +void initControls() - -dynamic _uniqueInviteCode() - +void regenerateCode() - -String _generateCode() - +StudyInvite buildFormData() - +void setControlsFrom() - +dynamic save() - - - - - - - - - - - FormConsumerWidget - - - - - - - - - - - - - StudyInvitesTable - - - - - - +invites: List<StudyInvite> - +onSelect: void Function(StudyInvite) - +getActions: List<ModelAction<dynamic>> Function(StudyInvite) - +getInlineActions: List<ModelAction<dynamic>> Function(StudyInvite) - +getIntervention: Intervention? Function(String) - +getParticipantCountForInvite: int Function(StudyInvite) - - - - - - +Widget build() - -List<Widget> _buildRow() - - - - - - - - - - - void Function(StudyInvite) - - - - - - - - - - - List<ModelAction<dynamic>> Function(StudyInvite) - - - - - - - - - - - Intervention? Function(String) - - - - - - - - - - - int Function(StudyInvite) - - - - - - - - - - - Study - - - - - - - - - - - FormControl - - - - - - - - - - - FormGroup - - - - - - - - - - - FormViewModel - - - - - - - - - \ No newline at end of file diff --git a/docs/uml/designer_v2/lib/features/study/settings/uml.svg b/docs/uml/designer_v2/lib/features/study/settings/uml.svg deleted file mode 100644 index b6f45b2a3..000000000 --- a/docs/uml/designer_v2/lib/features/study/settings/uml.svg +++ /dev/null @@ -1,185 +0,0 @@ - - [StudySettingsDialog - | - +Widget build() - ] - - [<abstract>StudyPageWidget]<:-[StudySettingsDialog] - - [StudySettingsFormViewModel - | - +study: AsyncValue<Study>; - +studyRepository: IStudyRepository; - <static>+defaultPublishedToRegistry: bool; - <static>+defaultPublishedToRegistryResults: bool; - +isPublishedToRegistryControl: FormControl<bool>; - +isPublishedToRegistryResultsControl: FormControl<bool>; - +form: FormGroup; - +titles: Map<FormMode, String> - | - +void setControlsFrom(); - +Study buildFormData(); - +dynamic keepControlsSynced(); - +dynamic save(); - +dynamic setLaunchDefaults() - ] - - [StudySettingsFormViewModel]o-[<abstract>AsyncValue] - [StudySettingsFormViewModel]o-[<abstract>IStudyRepository] - [StudySettingsFormViewModel]o-[FormControl] - [StudySettingsFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[StudySettingsFormViewModel] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - StudySettingsDialog - - - - - - +Widget build() - - - - - - - - - - - StudyPageWidget - - - - - - - - - - - - - StudySettingsFormViewModel - - - - - - +study: AsyncValue<Study> - +studyRepository: IStudyRepository - <static>+defaultPublishedToRegistry: bool - <static>+defaultPublishedToRegistryResults: bool - +isPublishedToRegistryControl: FormControl<bool> - +isPublishedToRegistryResultsControl: FormControl<bool> - +form: FormGroup - +titles: Map<FormMode, String> - - - - - - +void setControlsFrom() - +Study buildFormData() - +dynamic keepControlsSynced() - +dynamic save() - +dynamic setLaunchDefaults() - - - - - - - - - - - AsyncValue - - - - - - - - - - - IStudyRepository - - - - - - - - - - - FormControl - - - - - - - - - - - FormGroup - - - - - - - - - - - FormViewModel - - - - - - - - - \ No newline at end of file diff --git a/docs/uml/designer_v2/lib/features/study/uml.svg b/docs/uml/designer_v2/lib/features/study/uml.svg deleted file mode 100644 index d5afd8d04..000000000 --- a/docs/uml/designer_v2/lib/features/study/uml.svg +++ /dev/null @@ -1,1411 +0,0 @@ - - [<abstract>IStudyNavViewModel - | - +isEditTabEnabled: bool; - +isTestTabEnabled: bool; - +isRecruitTabEnabled: bool; - +isMonitorTabEnabled: bool; - +isAnalyzeTabEnabled: bool; - +isSettingsEnabled: bool - ] - - [StudyNav - | - <static>+dynamic tabs(); - <static>+dynamic edit(); - <static>+dynamic test(); - <static>+dynamic recruit(); - <static>+dynamic monitor(); - <static>+dynamic analyze() - ] - - [StudyDesignNav - | - <static>+dynamic tabs(); - <static>+dynamic info(); - <static>+dynamic enrollment(); - <static>+dynamic interventions(); - <static>+dynamic measurements(); - <static>+dynamic reports() - ] - - [RouteInformation - | - +route: String?; - +extra: String?; - +cmd: String?; - +data: String? - | - +String toString() - ] - - [<abstract>PlatformController - | - +studyId: String; - +baseSrc: String; - +previewSrc: String; - +routeInformation: RouteInformation; - +frameWidget: Widget - | - +void activate(); - +void registerViews(); - +void generateUrl(); - +void navigate(); - +void refresh(); - +void listen(); - +void send(); - +void openNewPage() - ] - - [<abstract>PlatformController]o-[RouteInformation] - [<abstract>PlatformController]o-[<abstract>Widget] - - [WebController - | - +iFrameElement: IFrameElement - | - +void activate(); - +void registerViews(); - +void generateUrl(); - +void navigate(); - +void refresh(); - +void openNewPage(); - +void listen(); - +void send() - ] - - [WebController]o-[IFrameElement] - [<abstract>PlatformController]<:-[WebController] - - [MobileController - | - +void openNewPage(); - +void refresh(); - +void registerViews(); - +void listen(); - +void send(); - +void navigate(); - +void activate(); - +void generateUrl() - ] - - [<abstract>PlatformController]<:-[MobileController] - - [TestAppRoutes - | - <static>+studyOverview: String; - <static>+eligibility: String; - <static>+intervention: String; - <static>+consent: String; - <static>+journey: String; - <static>+dashboard: String - ] - - [StudySettingsFormViewModel - | - +study: AsyncValue<Study>; - +studyRepository: IStudyRepository; - <static>+defaultPublishedToRegistry: bool; - <static>+defaultPublishedToRegistryResults: bool; - +isPublishedToRegistryControl: FormControl<bool>; - +isPublishedToRegistryResultsControl: FormControl<bool>; - +form: FormGroup; - +titles: Map<FormMode, String> - | - +void setControlsFrom(); - +Study buildFormData(); - +dynamic keepControlsSynced(); - +dynamic save(); - +dynamic setLaunchDefaults() - ] - - [StudySettingsFormViewModel]o-[<abstract>AsyncValue] - [StudySettingsFormViewModel]o-[<abstract>IStudyRepository] - [StudySettingsFormViewModel]o-[FormControl] - [StudySettingsFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[StudySettingsFormViewModel] - - [StudySettingsDialog - | - +Widget build() - ] - - [<abstract>StudyPageWidget]<:-[StudySettingsDialog] - - [FrameControlsWidget - | - +onRefresh: void Function()?; - +onOpenNewTab: void Function()?; - +enabled: bool - | - +Widget build() - ] - - [FrameControlsWidget]o-[void Function()?] - [<abstract>ConsumerWidget]<:-[FrameControlsWidget] - - [<abstract>StudyPageWidget - | - +studyId: String - | - +Widget? banner() - ] - - [<abstract>ConsumerWidget]<:-[<abstract>StudyPageWidget] - [<abstract>IWithBanner]<:--[<abstract>StudyPageWidget] - - [StudyTestScreen - | - +previewRoute: String? - | - +Widget build(); - +Widget? banner(); - +dynamic load(); - +dynamic save(); - +dynamic showHelp() - ] - - [<abstract>StudyPageWidget]<:-[StudyTestScreen] - - [StudyParticipationBadge - | - +participation: Participation; - +type: BadgeType; - +showPrefixIcon: bool; - +center: bool - | - +Widget build() - ] - - [StudyParticipationBadge]o-[Participation] - [StudyParticipationBadge]o-[BadgeType] - - [<abstract>IStudyStatusBadgeViewModel - | - +studyParticipation: Participation?; - +studyStatus: StudyStatus? - ] - - [<abstract>IStudyStatusBadgeViewModel]o-[Participation] - [<abstract>IStudyStatusBadgeViewModel]o-[StudyStatus] - - [StudyStatusBadge - | - +participation: Participation?; - +status: StudyStatus?; - +type: BadgeType; - +showPrefixIcon: bool; - +showTooltip: bool - | - +Widget build() - ] - - [StudyStatusBadge]o-[Participation] - [StudyStatusBadge]o-[StudyStatus] - [StudyStatusBadge]o-[BadgeType] - - [StudyController - | - +notificationService: INotificationService; - +studyEventsSubscription: StreamSubscription<ModelEvent<Study>>?; - +studyActions: List<ModelAction<dynamic>> - | - +dynamic syncStudyStatus(); - +dynamic onStudySubscriptionUpdate(); - -dynamic _redirectNewToActualStudyID(); - +dynamic publishStudy(); - +void onChangeStudyParticipation(); - +void onAddParticipants(); - +void onSettingsPressed(); - +void dispose() - ] - - [StudyController]o-[<abstract>INotificationService] - [StudyController]o-[StreamSubscription] - [StudyBaseController]<:-[StudyController] - - [PreviewFrame - | - +studyId: String; - +routeArgs: StudyFormRouteArgs?; - +route: String? - ] - - [PreviewFrame]o-[<abstract>StudyFormRouteArgs] - - [StudyTestController - | - +authRepository: IAuthRepository; - +languageCode: String - ] - - [StudyTestController]o-[<abstract>IAuthRepository] - [StudyBaseController]<:-[StudyTestController] - - [<abstract>IStudyAppBarViewModel - | - +isSyncIndicatorVisible: bool; - +isStatusBadgeVisible: bool; - +isPublishVisible: bool - ] - - [<abstract>IStudyStatusBadgeViewModel]<:--[<abstract>IStudyAppBarViewModel] - [<abstract>IStudyNavViewModel]<:--[<abstract>IStudyAppBarViewModel] - - [StudyScaffold - | - +studyId: String; - +tabs: List<NavbarTab>?; - +tabsSubnav: List<NavbarTab>?; - +selectedTab: NavbarTab?; - +selectedTabSubnav: NavbarTab?; - +body: StudyPageWidget; - +drawer: Widget?; - +disableActions: bool; - +actionsSpacing: double; - +actionsPadding: double; - +layoutType: SingleColumnLayoutType?; - +appbarHeight: double; - +appbarSubnavHeight: double - ] - - [StudyScaffold]o-[NavbarTab] - [StudyScaffold]o-[<abstract>StudyPageWidget] - [StudyScaffold]o-[<abstract>Widget] - [StudyScaffold]o-[SingleColumnLayoutType] - - [WebFrame - | - +previewSrc: String; - +studyId: String - | - +Widget build() - ] - - [DisabledFrame - | - +Widget build() - ] - - [PhoneContainer - | - <static>+defaultWidth: double; - <static>+defaultHeight: double; - +width: double; - +height: double; - +borderColor: Color; - +borderWidth: double; - +borderRadius: double; - +innerContent: Widget; - +innerContentBackgroundColor: Color? - | - +Widget build() - ] - - [PhoneContainer]o-[Color] - [PhoneContainer]o-[<abstract>Widget] - - [MobileFrame - | - +Widget build() - ] - - [DesktopFrame - | - +Widget build() - ] - - [StudyBaseController - | - +studyId: String; - +studyRepository: IStudyRepository; - +router: GoRouter; - +studySubscription: StreamSubscription<WrappedModel<Study>>? - | - +dynamic subscribeStudy(); - +dynamic onStudySubscriptionUpdate(); - +dynamic onStudySubscriptionError(); - +void dispose() - ] - - [StudyBaseController]o-[<abstract>IStudyRepository] - [StudyBaseController]o-[GoRouter] - [StudyBaseController]o-[StreamSubscription] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IStudyNavViewModel - - - - - - +isEditTabEnabled: bool - +isTestTabEnabled: bool - +isRecruitTabEnabled: bool - +isMonitorTabEnabled: bool - +isAnalyzeTabEnabled: bool - +isSettingsEnabled: bool - - - - - - - - - - - - StudyNav - - - - - - <static>+dynamic tabs() - <static>+dynamic edit() - <static>+dynamic test() - <static>+dynamic recruit() - <static>+dynamic monitor() - <static>+dynamic analyze() - - - - - - - - - - - - StudyDesignNav - - - - - - <static>+dynamic tabs() - <static>+dynamic info() - <static>+dynamic enrollment() - <static>+dynamic interventions() - <static>+dynamic measurements() - <static>+dynamic reports() - - - - - - - - - - - - - RouteInformation - - - - - - +route: String? - +extra: String? - +cmd: String? - +data: String? - - - - - - +String toString() - - - - - - - - - - - - - PlatformController - - - - - - +studyId: String - +baseSrc: String - +previewSrc: String - +routeInformation: RouteInformation - +frameWidget: Widget - - - - - - +void activate() - +void registerViews() - +void generateUrl() - +void navigate() - +void refresh() - +void listen() - +void send() - +void openNewPage() - - - - - - - - - - - Widget - - - - - - - - - - - - - WebController - - - - - - +iFrameElement: IFrameElement - - - - - - +void activate() - +void registerViews() - +void generateUrl() - +void navigate() - +void refresh() - +void openNewPage() - +void listen() - +void send() - - - - - - - - - - - IFrameElement - - - - - - - - - - - - MobileController - - - - - - +void openNewPage() - +void refresh() - +void registerViews() - +void listen() - +void send() - +void navigate() - +void activate() - +void generateUrl() - - - - - - - - - - - - TestAppRoutes - - - - - - <static>+studyOverview: String - <static>+eligibility: String - <static>+intervention: String - <static>+consent: String - <static>+journey: String - <static>+dashboard: String - - - - - - - - - - - - - StudySettingsFormViewModel - - - - - - +study: AsyncValue<Study> - +studyRepository: IStudyRepository - <static>+defaultPublishedToRegistry: bool - <static>+defaultPublishedToRegistryResults: bool - +isPublishedToRegistryControl: FormControl<bool> - +isPublishedToRegistryResultsControl: FormControl<bool> - +form: FormGroup - +titles: Map<FormMode, String> - - - - - - +void setControlsFrom() - +Study buildFormData() - +dynamic keepControlsSynced() - +dynamic save() - +dynamic setLaunchDefaults() - - - - - - - - - - - AsyncValue - - - - - - - - - - - IStudyRepository - - - - - - - - - - - FormControl - - - - - - - - - - - FormGroup - - - - - - - - - - - FormViewModel - - - - - - - - - - - - StudySettingsDialog - - - - - - +Widget build() - - - - - - - - - - - - - StudyPageWidget - - - - - - +studyId: String - - - - - - +Widget? banner() - - - - - - - - - - - - - FrameControlsWidget - - - - - - +onRefresh: void Function()? - +onOpenNewTab: void Function()? - +enabled: bool - - - - - - +Widget build() - - - - - - - - - - - void Function()? - - - - - - - - - - - ConsumerWidget - - - - - - - - - - - IWithBanner - - - - - - - - - - - - - StudyTestScreen - - - - - - +previewRoute: String? - - - - - - +Widget build() - +Widget? banner() - +dynamic load() - +dynamic save() - +dynamic showHelp() - - - - - - - - - - - - - StudyParticipationBadge - - - - - - +participation: Participation - +type: BadgeType - +showPrefixIcon: bool - +center: bool - - - - - - +Widget build() - - - - - - - - - - - Participation - - - - - - - - - - - BadgeType - - - - - - - - - - - - IStudyStatusBadgeViewModel - - - - - - +studyParticipation: Participation? - +studyStatus: StudyStatus? - - - - - - - - - - - StudyStatus - - - - - - - - - - - - - StudyStatusBadge - - - - - - +participation: Participation? - +status: StudyStatus? - +type: BadgeType - +showPrefixIcon: bool - +showTooltip: bool - - - - - - +Widget build() - - - - - - - - - - - - - StudyController - - - - - - +notificationService: INotificationService - +studyEventsSubscription: StreamSubscription<ModelEvent<Study>>? - +studyActions: List<ModelAction<dynamic>> - - - - - - +dynamic syncStudyStatus() - +dynamic onStudySubscriptionUpdate() - -dynamic _redirectNewToActualStudyID() - +dynamic publishStudy() - +void onChangeStudyParticipation() - +void onAddParticipants() - +void onSettingsPressed() - +void dispose() - - - - - - - - - - - INotificationService - - - - - - - - - - - StreamSubscription - - - - - - - - - - - - - StudyBaseController - - - - - - +studyId: String - +studyRepository: IStudyRepository - +router: GoRouter - +studySubscription: StreamSubscription<WrappedModel<Study>>? - - - - - - +dynamic subscribeStudy() - +dynamic onStudySubscriptionUpdate() - +dynamic onStudySubscriptionError() - +void dispose() - - - - - - - - - - - - PreviewFrame - - - - - - +studyId: String - +routeArgs: StudyFormRouteArgs? - +route: String? - - - - - - - - - - - StudyFormRouteArgs - - - - - - - - - - - - StudyTestController - - - - - - +authRepository: IAuthRepository - +languageCode: String - - - - - - - - - - - IAuthRepository - - - - - - - - - - - - IStudyAppBarViewModel - - - - - - +isSyncIndicatorVisible: bool - +isStatusBadgeVisible: bool - +isPublishVisible: bool - - - - - - - - - - - - StudyScaffold - - - - - - +studyId: String - +tabs: List<NavbarTab>? - +tabsSubnav: List<NavbarTab>? - +selectedTab: NavbarTab? - +selectedTabSubnav: NavbarTab? - +body: StudyPageWidget - +drawer: Widget? - +disableActions: bool - +actionsSpacing: double - +actionsPadding: double - +layoutType: SingleColumnLayoutType? - +appbarHeight: double - +appbarSubnavHeight: double - - - - - - - - - - - NavbarTab - - - - - - - - - - - SingleColumnLayoutType - - - - - - - - - - - - - WebFrame - - - - - - +previewSrc: String - +studyId: String - - - - - - +Widget build() - - - - - - - - - - - - DisabledFrame - - - - - - +Widget build() - - - - - - - - - - - - - PhoneContainer - - - - - - <static>+defaultWidth: double - <static>+defaultHeight: double - +width: double - +height: double - +borderColor: Color - +borderWidth: double - +borderRadius: double - +innerContent: Widget - +innerContentBackgroundColor: Color? - - - - - - +Widget build() - - - - - - - - - - - Color - - - - - - - - - - - - MobileFrame - - - - - - +Widget build() - - - - - - - - - - - - DesktopFrame - - - - - - +Widget build() - - - - - - - - - - - GoRouter - - - - - - - - - \ No newline at end of file diff --git a/docs/uml/designer_v2/lib/features/uml.svg b/docs/uml/designer_v2/lib/features/uml.svg deleted file mode 100644 index d85f16001..000000000 --- a/docs/uml/designer_v2/lib/features/uml.svg +++ /dev/null @@ -1,8823 +0,0 @@ - - [<abstract>IAppDelegate - | - +dynamic onAppStart() - ] - - [AppController - | - +appDelegates: List<IAppDelegate>; - -_delayedFuture: dynamic; - +isInitialized: dynamic - | - +dynamic onAppStart(); - -dynamic _callDelegates() - ] - - [StudyMonitorScreen - | - +Widget build() - ] - - [<abstract>StudyPageWidget]<:-[StudyMonitorScreen] - - [LoginForm - | - +formKey: AuthFormKey - | - +Widget build() - ] - - [LoginForm]o-[AuthFormKey] - [<abstract>FormConsumerRefWidget]<:-[LoginForm] - - [PasswordRecoveryForm - | - +formKey: AuthFormKey - | - +Widget build() - ] - - [PasswordRecoveryForm]o-[AuthFormKey] - [<abstract>FormConsumerRefWidget]<:-[PasswordRecoveryForm] - - [PasswordForgotForm - | - +formKey: AuthFormKey - | - +Widget build() - ] - - [PasswordForgotForm]o-[AuthFormKey] - [<abstract>FormConsumerRefWidget]<:-[PasswordForgotForm] - - [SignupForm - | - +formKey: AuthFormKey - | - +Widget build(); - -dynamic _onClickTermsOfUse(); - -dynamic _onClickPrivacyPolicy() - ] - - [SignupForm]o-[AuthFormKey] - [<abstract>FormConsumerRefWidget]<:-[SignupForm] - - [AuthScaffold - | - +body: Widget; - +formKey: AuthFormKey; - +leftContentMinWidth: double; - +leftPanelMinWidth: double; - +leftPanelPadding: EdgeInsets - ] - - [AuthScaffold]o-[<abstract>Widget] - [AuthScaffold]o-[AuthFormKey] - [AuthScaffold]o-[EdgeInsets] - - [EmailTextField - | - +labelText: String; - +hintText: String?; - +formControlName: String?; - +formControl: FormControl<dynamic>? - ] - - [EmailTextField]o-[FormControl] - - [PasswordTextField - | - +labelText: String; - +hintText: String?; - +onSubmitted: dynamic Function(FormControl<dynamic>)?; - +formControlName: String?; - +formControl: FormControl<dynamic>? - ] - - [PasswordTextField]o-[dynamic Function(FormControl<dynamic>)?] - [PasswordTextField]o-[FormControl] - - [StudyUJobsToBeDone - | - +Widget build() - ] - - [AuthFormController - | - +authRepository: IAuthRepository; - +notificationService: INotificationService; - +router: GoRouter; - +emailControl: FormControl<String>; - +passwordControl: FormControl<String>; - +passwordConfirmationControl: FormControl<String>; - +termsOfServiceControl: FormControl<bool>; - <static>+authValidationMessages: Map<String, String Function(dynamic)>; - +loginForm: FormGroup; - +signupForm: FormGroup; - +passwordForgotForm: FormGroup; - +passwordRecoveryForm: FormGroup; - +controlValidatorsByForm: Map<AuthFormKey, Map<FormControl<dynamic>, List<Validator<dynamic>>>>; - -_formKey: AuthFormKey; - +formKey: AuthFormKey; - +form: FormGroup - | - -dynamic _getFormFor(); - -dynamic _onChangeFormKey(); - +dynamic resetControlsFor(); - -dynamic _forceValidationMessages(); - +dynamic signUp(); - -dynamic _signUp(); - +dynamic signIn(); - -dynamic _signInWith(); - +dynamic signOut(); - +dynamic resetPasswordForEmail(); - +dynamic sendPasswordResetLink(); - +dynamic recoverPassword(); - +dynamic updateUser(); - -dynamic _readDebugUser() - ] - - [AuthFormController]o-[<abstract>IAuthRepository] - [AuthFormController]o-[<abstract>INotificationService] - [AuthFormController]o-[GoRouter] - [AuthFormController]o-[FormControl] - [AuthFormController]o-[FormGroup] - [AuthFormController]o-[AuthFormKey] - [<abstract>IFormGroupController]<:--[AuthFormController] - - [AuthFormKey - | - +index: int; - <static>+values: List<AuthFormKey>; - <static>+login: AuthFormKey; - <static>+signup: AuthFormKey; - <static>+passwordForgot: AuthFormKey; - <static>+passwordRecovery: AuthFormKey; - <static>-_loginSubmit: AuthFormKey; - <static>-_signupSubmit: AuthFormKey - ] - - [AuthFormKey]o-[AuthFormKey] - [Enum]<:--[AuthFormKey] - - [AppStatus - | - +index: int; - <static>+values: List<AppStatus>; - <static>+initializing: AppStatus; - <static>+initialized: AppStatus - ] - - [AppStatus]o-[AppStatus] - [Enum]<:--[AppStatus] - - [FormArrayTable - | - +control: AbstractControl<dynamic>; - +items: List<T>; - +onSelectItem: void Function(T); - +getActionsAt: List<ModelAction<dynamic>> Function(T, int); - +onNewItem: void Function()?; - +rowTitle: String Function(T); - +onNewItemLabel: String; - +sectionTitle: String?; - +sectionDescription: String?; - +emptyIcon: IconData?; - +emptyTitle: String?; - +emptyDescription: String?; - +sectionTitleDivider: bool?; - +rowPrefix: Widget Function(BuildContext, T, int)?; - +rowSuffix: Widget Function(BuildContext, T, int)?; - +leadingWidget: Widget?; - +itemsSectionPadding: EdgeInsets?; - +hideLeadingTrailingWhenEmpty: bool; - <static>+columns: List<StandardTableColumn> - | - +Widget build(); - -List<Widget> _buildRow(); - -Widget _newItemButton() - ] - - [FormArrayTable]o-[<abstract>AbstractControl] - [FormArrayTable]o-[void Function(T)] - [FormArrayTable]o-[List<ModelAction<dynamic>> Function(T, int)] - [FormArrayTable]o-[void Function()?] - [FormArrayTable]o-[String Function(T)] - [FormArrayTable]o-[IconData] - [FormArrayTable]o-[Widget Function(BuildContext, T, int)?] - [FormArrayTable]o-[<abstract>Widget] - [FormArrayTable]o-[EdgeInsets] - - [<abstract>ManagedFormViewModel - | - +ManagedFormViewModel<T> createDuplicate() - ] - - [<abstract>FormViewModel]<:-[<abstract>ManagedFormViewModel] - - [FormViewModelNotFoundException - ] - - [Exception]<:--[FormViewModelNotFoundException] - - [FormViewModelCollection - | - +formViewModels: List<T>; - +formArray: FormArray<dynamic>; - +stagedViewModels: List<T>; - +retrievableViewModels: List<T>; - +formData: List<D> - | - +void add(); - +T remove(); - +T? findWhere(); - +T? removeWhere(); - +bool contains(); - +void stage(); - +T commit(); - +void reset(); - +void read() - ] - - [FormViewModelCollection]o-[FormArray] - - [CustomFormControl - | - -_onValueChangedDebouncer: Debouncer?; - -_onStatusChangedDebouncer: Debouncer?; - +onValueChanged: void Function(T?)?; - +onStatusChanged: void Function(ControlStatus)?; - +onStatusChangedDebounceTime: int?; - +onValueChangedDebounceTime: int? - | - +void dispose() - ] - - [CustomFormControl]o-[Debouncer] - [CustomFormControl]o-[void Function(T?)?] - [CustomFormControl]o-[void Function(ControlStatus)?] - [FormControl]<:-[CustomFormControl] - - [UnsavedChangesDialog - | - +Widget build() - ] - - [<abstract>FormValidationSetEnum - ] - - [FormControlValidation - | - +control: AbstractControl<dynamic>; - +validators: List<Validator<dynamic>>; - +asyncValidators: List<AsyncValidator<dynamic>>?; - +validationMessages: Map<String, String Function(Object)> - | - +FormControlValidation merge() - ] - - [FormControlValidation]o-[<abstract>AbstractControl] - - [<abstract>IFormData - | - +id: String - | - +IFormData copy() - ] - - [FormInvalidException - ] - - [Exception]<:--[FormInvalidException] - - [FormConfigException - | - +message: String? - ] - - [Exception]<:--[FormConfigException] - - [<abstract>IFormViewModelDelegate - | - +dynamic onSave(); - +void onCancel() - ] - - [<abstract>IFormGroupController - | - +form: FormGroup - ] - - [<abstract>IFormGroupController]o-[FormGroup] - - [FormControlOption - | - +value: T; - +label: String; - +description: String?; - +props: List<Object?> - ] - - [<abstract>Equatable]<:-[FormControlOption] - - [<abstract>FormViewModel - | - -_formData: T?; - -_formMode: FormMode; - -_validationSet: FormValidationSetEnum?; - +delegate: IFormViewModelDelegate<FormViewModel<dynamic>>?; - +autosave: bool; - -_immediateFormChildrenSubscriptions: List<StreamSubscription<dynamic>>; - -_immediateFormChildrenListenerDebouncer: Debouncer?; - -_autosaveOperation: CancelableOperation<dynamic>?; - -_defaultControlValidators: Map<String, Tuple<List<Validator<dynamic>>, List<AsyncValidator<dynamic>>>>; - +prevFormValue: Map<String, dynamic>?; - <static>-_formKey: String; - +formData: T?; - +formMode: FormMode; - +isReadonly: bool; - +validationSet: FormValidationSetEnum?; - +isDirty: bool; - +title: String; - +isValid: bool; - +titles: Map<FormMode, String>; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - | - -dynamic _setFormData(); - -dynamic _rememberDefaultControlValidators(); - -Tuple<List<Validator<dynamic>>, List<AsyncValidator<dynamic>>>? _getDefaultValidators(); - -dynamic _disableAllControls(); - -dynamic _formModeUpdated(); - -dynamic _restoreControlsFromFormData(); - +void revalidate(); - -void _applyValidationSet(); - +void read(); - +dynamic save(); - +dynamic cancel(); - +void enableAutosave(); - +void listenToImmediateFormChildren(); - +dynamic markFormGroupChanged(); - +void dispose(); - +void setControlsFrom(); - +T buildFormData(); - +void initControls() - ] - - [<abstract>FormViewModel]o-[FormMode] - [<abstract>FormViewModel]o-[<abstract>FormValidationSetEnum] - [<abstract>FormViewModel]o-[<abstract>IFormViewModelDelegate] - [<abstract>FormViewModel]o-[Debouncer] - [<abstract>FormViewModel]o-[CancelableOperation] - [<abstract>IFormGroupController]<:--[<abstract>FormViewModel] - - [FormMode - | - +index: int; - <static>+values: List<FormMode>; - <static>+create: FormMode; - <static>+readonly: FormMode; - <static>+edit: FormMode - ] - - [FormMode]o-[FormMode] - [Enum]<:--[FormMode] - - [EnrolledBadge - | - +enrolledCount: int - | - +Widget build() - ] - - [StudyRecruitController - | - +inviteCodeRepository: IInviteCodeRepository; - -_invitesSubscription: StreamSubscription<List<WrappedModel<StudyInvite>>>? - | - -dynamic _subscribeInvites(); - +Intervention? getIntervention(); - +int getParticipantCountForInvite(); - +List<ModelAction<dynamic>> availableActions(); - +List<ModelAction<dynamic>> availableInlineActions(); - +void dispose() - ] - - [StudyRecruitController]o-[<abstract>IInviteCodeRepository] - [StudyRecruitController]o-[StreamSubscription] - [StudyBaseController]<:-[StudyRecruitController] - [<abstract>IModelActionProvider]<:--[StudyRecruitController] - - [StudyRecruitScreen - | - +Widget build(); - -Widget _inviteCodesSectionHeader(); - -Widget _newInviteCodeButton(); - -dynamic _onSelectInvite() - ] - - [<abstract>StudyPageWidget]<:-[StudyRecruitScreen] - - [InviteCodeFormView - | - +formViewModel: InviteCodeFormViewModel - | - +Widget build(); - -List<FormTableRow> _conditionalInterventionRows() - ] - - [InviteCodeFormView]o-[InviteCodeFormViewModel] - [<abstract>FormConsumerWidget]<:-[InviteCodeFormView] - - [StudyInvitesTable - | - +invites: List<StudyInvite>; - +onSelect: void Function(StudyInvite); - +getActions: List<ModelAction<dynamic>> Function(StudyInvite); - +getInlineActions: List<ModelAction<dynamic>> Function(StudyInvite); - +getIntervention: Intervention? Function(String); - +getParticipantCountForInvite: int Function(StudyInvite) - | - +Widget build(); - -List<Widget> _buildRow() - ] - - [StudyInvitesTable]o-[void Function(StudyInvite)] - [StudyInvitesTable]o-[List<ModelAction<dynamic>> Function(StudyInvite)] - [StudyInvitesTable]o-[Intervention? Function(String)] - [StudyInvitesTable]o-[int Function(StudyInvite)] - - [InviteCodeFormViewModel - | - +study: Study; - +inviteCodeRepository: IInviteCodeRepository; - +codeControl: FormControl<String>; - +codeControlValidationMessages: Map<String, String Function(dynamic)>; - +isPreconfiguredScheduleControl: FormControl<bool>; - +preconfiguredScheduleTypeControl: FormControl<PhaseSequence>; - +interventionAControl: FormControl<String>; - +interventionBControl: FormControl<String>; - +form: FormGroup; - +titles: Map<FormMode, String>; - +interventionControlOptions: List<FormControlOption<String>>; - +preconfiguredScheduleTypeOptions: List<FormControlOption<PhaseSequence>>; - +isPreconfiguredSchedule: bool; - +preconfiguredSchedule: List<String>? - | - +void initControls(); - -dynamic _uniqueInviteCode(); - +void regenerateCode(); - -String _generateCode(); - +StudyInvite buildFormData(); - +void setControlsFrom(); - +dynamic save() - ] - - [InviteCodeFormViewModel]o-[Study] - [InviteCodeFormViewModel]o-[<abstract>IInviteCodeRepository] - [InviteCodeFormViewModel]o-[FormControl] - [InviteCodeFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[InviteCodeFormViewModel] - - [PublishSuccessDialog - | - +Widget build() - ] - - [<abstract>StudyPageWidget]<:-[PublishSuccessDialog] - - [PublishDialog - | - +Widget build() - ] - - [<abstract>StudyPageWidget]<:-[PublishDialog] - - [PublishConfirmationDialog - | - +Widget build() - ] - - [<abstract>StudyPageWidget]<:-[PublishConfirmationDialog] - - [FrameControlsWidget - | - +onRefresh: void Function()?; - +onOpenNewTab: void Function()?; - +enabled: bool - | - +Widget build() - ] - - [FrameControlsWidget]o-[void Function()?] - [<abstract>ConsumerWidget]<:-[FrameControlsWidget] - - [<abstract>IStudyStatusBadgeViewModel - | - +studyParticipation: Participation?; - +studyStatus: StudyStatus? - ] - - [<abstract>IStudyStatusBadgeViewModel]o-[Participation] - [<abstract>IStudyStatusBadgeViewModel]o-[StudyStatus] - - [StudyStatusBadge - | - +participation: Participation?; - +status: StudyStatus?; - +type: BadgeType; - +showPrefixIcon: bool; - +showTooltip: bool - | - +Widget build() - ] - - [StudyStatusBadge]o-[Participation] - [StudyStatusBadge]o-[StudyStatus] - [StudyStatusBadge]o-[BadgeType] - - [RouteInformation - | - +route: String?; - +extra: String?; - +cmd: String?; - +data: String? - | - +String toString() - ] - - [<abstract>PlatformController - | - +studyId: String; - +baseSrc: String; - +previewSrc: String; - +routeInformation: RouteInformation; - +frameWidget: Widget - | - +void activate(); - +void registerViews(); - +void generateUrl(); - +void navigate(); - +void refresh(); - +void listen(); - +void send(); - +void openNewPage() - ] - - [<abstract>PlatformController]o-[RouteInformation] - [<abstract>PlatformController]o-[<abstract>Widget] - - [WebController - | - +iFrameElement: IFrameElement - | - +void activate(); - +void registerViews(); - +void generateUrl(); - +void navigate(); - +void refresh(); - +void openNewPage(); - +void listen(); - +void send() - ] - - [WebController]o-[IFrameElement] - [<abstract>PlatformController]<:-[WebController] - - [MobileController - | - +void openNewPage(); - +void refresh(); - +void registerViews(); - +void listen(); - +void send(); - +void navigate(); - +void activate(); - +void generateUrl() - ] - - [<abstract>PlatformController]<:-[MobileController] - - [StudyController - | - +notificationService: INotificationService; - +studyEventsSubscription: StreamSubscription<ModelEvent<Study>>?; - +studyActions: List<ModelAction<dynamic>> - | - +dynamic syncStudyStatus(); - +dynamic onStudySubscriptionUpdate(); - -dynamic _redirectNewToActualStudyID(); - +dynamic publishStudy(); - +void onChangeStudyParticipation(); - +void onAddParticipants(); - +void onSettingsPressed(); - +void dispose() - ] - - [StudyController]o-[<abstract>INotificationService] - [StudyController]o-[StreamSubscription] - [StudyBaseController]<:-[StudyController] - - [<abstract>IStudyNavViewModel - | - +isEditTabEnabled: bool; - +isTestTabEnabled: bool; - +isRecruitTabEnabled: bool; - +isMonitorTabEnabled: bool; - +isAnalyzeTabEnabled: bool; - +isSettingsEnabled: bool - ] - - [StudyNav - | - <static>+dynamic tabs(); - <static>+dynamic edit(); - <static>+dynamic test(); - <static>+dynamic recruit(); - <static>+dynamic monitor(); - <static>+dynamic analyze() - ] - - [StudyDesignNav - | - <static>+dynamic tabs(); - <static>+dynamic info(); - <static>+dynamic enrollment(); - <static>+dynamic interventions(); - <static>+dynamic measurements(); - <static>+dynamic reports() - ] - - [<abstract>StudyPageWidget - | - +studyId: String - | - +Widget? banner() - ] - - [<abstract>ConsumerWidget]<:-[<abstract>StudyPageWidget] - [<abstract>IWithBanner]<:--[<abstract>StudyPageWidget] - - [StudyParticipationBadge - | - +participation: Participation; - +type: BadgeType; - +showPrefixIcon: bool; - +center: bool - | - +Widget build() - ] - - [StudyParticipationBadge]o-[Participation] - [StudyParticipationBadge]o-[BadgeType] - - [StudyBaseController - | - +studyId: String; - +studyRepository: IStudyRepository; - +router: GoRouter; - +studySubscription: StreamSubscription<WrappedModel<Study>>? - | - +dynamic subscribeStudy(); - +dynamic onStudySubscriptionUpdate(); - +dynamic onStudySubscriptionError(); - +void dispose() - ] - - [StudyBaseController]o-[<abstract>IStudyRepository] - [StudyBaseController]o-[GoRouter] - [StudyBaseController]o-[StreamSubscription] - - [PreviewFrame - | - +studyId: String; - +routeArgs: StudyFormRouteArgs?; - +route: String? - ] - - [PreviewFrame]o-[<abstract>StudyFormRouteArgs] - - [<abstract>IStudyAppBarViewModel - | - +isSyncIndicatorVisible: bool; - +isStatusBadgeVisible: bool; - +isPublishVisible: bool - ] - - [<abstract>IStudyStatusBadgeViewModel]<:--[<abstract>IStudyAppBarViewModel] - [<abstract>IStudyNavViewModel]<:--[<abstract>IStudyAppBarViewModel] - - [StudyScaffold - | - +studyId: String; - +tabs: List<NavbarTab>?; - +tabsSubnav: List<NavbarTab>?; - +selectedTab: NavbarTab?; - +selectedTabSubnav: NavbarTab?; - +body: StudyPageWidget; - +drawer: Widget?; - +disableActions: bool; - +actionsSpacing: double; - +actionsPadding: double; - +layoutType: SingleColumnLayoutType?; - +appbarHeight: double; - +appbarSubnavHeight: double - ] - - [StudyScaffold]o-[NavbarTab] - [StudyScaffold]o-[<abstract>StudyPageWidget] - [StudyScaffold]o-[<abstract>Widget] - [StudyScaffold]o-[SingleColumnLayoutType] - - [WebFrame - | - +previewSrc: String; - +studyId: String - | - +Widget build() - ] - - [DisabledFrame - | - +Widget build() - ] - - [PhoneContainer - | - <static>+defaultWidth: double; - <static>+defaultHeight: double; - +width: double; - +height: double; - +borderColor: Color; - +borderWidth: double; - +borderRadius: double; - +innerContent: Widget; - +innerContentBackgroundColor: Color? - | - +Widget build() - ] - - [PhoneContainer]o-[Color] - [PhoneContainer]o-[<abstract>Widget] - - [MobileFrame - | - +Widget build() - ] - - [DesktopFrame - | - +Widget build() - ] - - [StudyTestScreen - | - +previewRoute: String? - | - +Widget build(); - +Widget? banner(); - +dynamic load(); - +dynamic save(); - +dynamic showHelp() - ] - - [<abstract>StudyPageWidget]<:-[StudyTestScreen] - - [StudySettingsFormViewModel - | - +study: AsyncValue<Study>; - +studyRepository: IStudyRepository; - <static>+defaultPublishedToRegistry: bool; - <static>+defaultPublishedToRegistryResults: bool; - +isPublishedToRegistryControl: FormControl<bool>; - +isPublishedToRegistryResultsControl: FormControl<bool>; - +form: FormGroup; - +titles: Map<FormMode, String> - | - +void setControlsFrom(); - +Study buildFormData(); - +dynamic keepControlsSynced(); - +dynamic save(); - +dynamic setLaunchDefaults() - ] - - [StudySettingsFormViewModel]o-[<abstract>AsyncValue] - [StudySettingsFormViewModel]o-[<abstract>IStudyRepository] - [StudySettingsFormViewModel]o-[FormControl] - [StudySettingsFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[StudySettingsFormViewModel] - - [StudySettingsDialog - | - +Widget build() - ] - - [<abstract>StudyPageWidget]<:-[StudySettingsDialog] - - [StudyTestController - | - +authRepository: IAuthRepository; - +languageCode: String - ] - - [StudyTestController]o-[<abstract>IAuthRepository] - [StudyBaseController]<:-[StudyTestController] - - [TestAppRoutes - | - <static>+studyOverview: String; - <static>+eligibility: String; - <static>+intervention: String; - <static>+consent: String; - <static>+journey: String; - <static>+dashboard: String - ] - - [DrawerEntry - | - +localizedTitle: String Function(); - +icon: IconData?; - +localizedHelpText: String Function()?; - +enabled: bool; - +onSelected: void Function(BuildContext, WidgetRef)?; - +autoCloseDrawer: bool; - +title: String; - +helpText: String? - | - +void onClick() - ] - - [DrawerEntry]o-[String Function()] - [DrawerEntry]o-[IconData] - [DrawerEntry]o-[String Function()?] - [DrawerEntry]o-[void Function(BuildContext, WidgetRef)?] - - [GoRouterDrawerEntry - | - +intent: RoutingIntent; - +onNavigated: void Function()? - | - +void onClick() - ] - - [GoRouterDrawerEntry]o-[RoutingIntent] - [GoRouterDrawerEntry]o-[void Function()?] - [DrawerEntry]<:-[GoRouterDrawerEntry] - - [AppDrawer - | - +width: int; - +autoCloseDrawer: bool; - +leftPaddingEntries: double; - +logoPaddingVertical: double; - +logoPaddingHorizontal: double; - +logoMaxHeight: double; - +logoSectionMinHeight: double; - +logoSectionMaxHeight: double - ] - - [StudyAnalyzeScreen - | - +Widget? banner(); - +Widget build() - ] - - [<abstract>StudyPageWidget]<:-[StudyAnalyzeScreen] - - [StudyAnalyzeController - | - +dynamic onExport() - ] - - [StudyBaseController]<:-[StudyAnalyzeController] - - [StudyDesignInterventionsFormView - | - +Widget build() - ] - - [<abstract>StudyDesignPageWidget]<:-[StudyDesignInterventionsFormView] - - [InterventionFormView - | - +formViewModel: InterventionFormViewModel - ] - - [InterventionFormView]o-[InterventionFormViewModel] - - [InterventionPreview - | - +routeArgs: InterventionFormRouteArgs - | - +Widget build() - ] - - [InterventionPreview]o-[InterventionFormRouteArgs] - [<abstract>ConsumerWidget]<:-[InterventionPreview] - - [StudyScheduleFormView - | - +formViewModel: StudyScheduleControls - | - -FormTableRow _renderCustomSequence(); - +Widget build() - ] - - [StudyScheduleFormView]o-[<abstract>StudyScheduleControls] - [<abstract>FormConsumerWidget]<:-[StudyScheduleFormView] - - [InterventionTaskFormData - | - +taskId: String; - +taskTitle: String; - +taskDescription: String?; - <static>+kDefaultTitle: String; - +id: String - | - +CheckmarkTask toTask(); - +InterventionTaskFormData copy() - ] - - [<abstract>IFormDataWithSchedule]<:-[InterventionTaskFormData] - - [InterventionsFormViewModel - | - +study: Study; - +router: GoRouter; - +interventionsArray: FormArray<dynamic>; - +interventionsCollection: FormViewModelCollection<InterventionFormViewModel, InterventionFormData>; - +form: FormGroup; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +interventionsRequired: dynamic; - +titles: Map<FormMode, String>; - +canTestStudySchedule: bool - | - +void setControlsFrom(); - +InterventionsFormData buildFormData(); - +void read(); - +List<ModelAction<dynamic>> availableActions(); - +List<ModelAction<dynamic>> availablePopupActions(); - +List<ModelAction<dynamic>> availableInlineActions(); - +void onSelectItem(); - +void onNewItem(); - +InterventionFormViewModel provide(); - +void onCancel(); - +dynamic onSave(); - +dynamic testStudySchedule() - ] - - [InterventionsFormViewModel]o-[Study] - [InterventionsFormViewModel]o-[GoRouter] - [InterventionsFormViewModel]o-[FormArray] - [InterventionsFormViewModel]o-[FormViewModelCollection] - [InterventionsFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[InterventionsFormViewModel] - [<abstract>StudyScheduleControls]<:-[InterventionsFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[InterventionsFormViewModel] - [<abstract>IListActionProvider]<:--[InterventionsFormViewModel] - [<abstract>IProviderArgsResolver]<:--[InterventionsFormViewModel] - - [InterventionTaskFormViewModel - | - +taskIdControl: FormControl<String>; - +instanceIdControl: FormControl<String>; - +taskTitleControl: FormControl<String>; - +taskDescriptionControl: FormControl<String>; - +markAsCompletedControl: FormControl<bool>; - +form: FormGroup; - +taskId: String; - +instanceId: String; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titleRequired: dynamic; - +titles: Map<FormMode, String> - | - +void setControlsFrom(); - +InterventionTaskFormData buildFormData(); - +InterventionTaskFormViewModel createDuplicate() - ] - - [InterventionTaskFormViewModel]o-[FormControl] - [InterventionTaskFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[InterventionTaskFormViewModel] - [<abstract>WithScheduleControls]<:-[InterventionTaskFormViewModel] - - [<abstract>StudyScheduleControls - | - <static>+defaultScheduleType: PhaseSequence; - <static>+defaultScheduleTypeSequence: String; - <static>+defaultNumCycles: int; - <static>+defaultPeriodLength: int; - +sequenceTypeControl: FormControl<PhaseSequence>; - +sequenceTypeCustomControl: FormControl<String>; - +phaseDurationControl: FormControl<int>; - +numCyclesControl: FormControl<int>; - +includeBaselineControl: FormControl<bool>; - +studyScheduleControls: Map<String, FormControl<Object>>; - <static>+kNumCyclesMin: int; - <static>+kNumCyclesMax: int; - <static>+kPhaseDurationMin: int; - <static>+kPhaseDurationMax: int; - +sequenceTypeControlOptions: List<FormControlOption<PhaseSequence>>; - +studyScheduleValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +numCyclesRange: dynamic; - +phaseDurationRange: dynamic; - +customSequenceRequired: dynamic - | - +void setStudyScheduleControlsFrom(); - +StudyScheduleFormData buildStudyScheduleFormData(); - +bool isSequencingCustom() - ] - - [<abstract>StudyScheduleControls]o-[PhaseSequence] - [<abstract>StudyScheduleControls]o-[FormControl] - - [InterventionFormData - | - +interventionId: String; - +title: String; - +description: String?; - +tasksData: List<InterventionTaskFormData>?; - +iconName: String?; - <static>+kDefaultTitle: String; - +id: String - | - +Intervention toIntervention(); - +InterventionFormData copy() - ] - - [<abstract>IFormData]<:-[InterventionFormData] - - [StudyScheduleFormData - | - +sequenceType: PhaseSequence; - +sequenceTypeCustom: String; - +numCycles: int; - +phaseDuration: int; - +includeBaseline: bool; - +id: String - | - +StudySchedule toStudySchedule(); - +Study apply(); - +StudyScheduleFormData copy() - ] - - [StudyScheduleFormData]o-[PhaseSequence] - [<abstract>IStudyFormData]<:--[StudyScheduleFormData] - - [InterventionTaskFormView - | - +formViewModel: InterventionTaskFormViewModel - ] - - [InterventionTaskFormView]o-[InterventionTaskFormViewModel] - - [InterventionsFormData - | - +interventionsData: List<InterventionFormData>; - +studyScheduleData: StudyScheduleFormData; - +id: String - | - +Study apply(); - +InterventionsFormData copy() - ] - - [InterventionsFormData]o-[StudyScheduleFormData] - [<abstract>IStudyFormData]<:--[InterventionsFormData] - - [InterventionFormViewModel - | - +study: Study; - +interventionIdControl: FormControl<String>; - +interventionTitleControl: FormControl<String>; - +interventionIconControl: FormControl<IconOption>; - +interventionDescriptionControl: FormControl<String>; - +interventionTasksArray: FormArray<dynamic>; - +tasksCollection: FormViewModelCollection<InterventionTaskFormViewModel, InterventionTaskFormData>; - +form: FormGroup; - +interventionId: String; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titleRequired: dynamic; - +atLeastOneTask: dynamic; - +breadcrumbsTitle: String; - +titles: Map<FormMode, String> - | - +void setControlsFrom(); - +InterventionFormData buildFormData(); - +List<ModelAction<dynamic>> availableActions(); - +List<ModelAction<dynamic>> availablePopupActions(); - +List<ModelAction<dynamic>> availableInlineActions(); - +void onSelectItem(); - +void onNewItem(); - +void onCancel(); - +dynamic onSave(); - +InterventionTaskFormViewModel provide(); - +InterventionTaskFormRouteArgs buildNewFormRouteArgs(); - +InterventionTaskFormRouteArgs buildFormRouteArgs(); - +InterventionFormViewModel createDuplicate() - ] - - [InterventionFormViewModel]o-[Study] - [InterventionFormViewModel]o-[FormControl] - [InterventionFormViewModel]o-[FormArray] - [InterventionFormViewModel]o-[FormViewModelCollection] - [InterventionFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[InterventionFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[InterventionFormViewModel] - [<abstract>IListActionProvider]<:--[InterventionFormViewModel] - [<abstract>IProviderArgsResolver]<:--[InterventionFormViewModel] - - [StudyDesignReportsFormView - | - +Widget build(); - -dynamic _showReportItemSidesheetWithArgs() - ] - - [<abstract>StudyDesignPageWidget]<:-[StudyDesignReportsFormView] - - [ReportItemFormData - | - +isPrimary: bool; - +section: ReportSection; - +id: String - | - <static>+dynamic fromDomainModel(); - +ReportItemFormData copy() - ] - - [ReportItemFormData]o-[<abstract>ReportSection] - [<abstract>IFormData]<:-[ReportItemFormData] - - [DataReferenceEditor - | - +formControl: FormControl<DataReferenceIdentifier<T>>; - +availableTasks: List<Task>; - +buildReactiveDropdownField: ReactiveDropdownField<dynamic> - | - +FormTableRow buildFormTableRow(); - -List<DropdownMenuItem<DataReferenceIdentifier<dynamic>>> _dataReferenceItems() - ] - - [DataReferenceEditor]o-[FormControl] - [DataReferenceEditor]o-[ReactiveDropdownField] - - [TemporalAggregationFormatted - | - -_value: TemporalAggregation; - <static>+values: List<TemporalAggregationFormatted>; - +value: TemporalAggregation; - +string: String; - +icon: IconData?; - +hashCode: int - | - +bool ==(); - +String toString(); - +String toJson(); - <static>+TemporalAggregationFormatted fromJson() - ] - - [TemporalAggregationFormatted]o-[TemporalAggregation] - [TemporalAggregationFormatted]o-[IconData] - - [ImprovementDirectionFormatted - | - -_value: ImprovementDirection; - <static>+values: List<ImprovementDirectionFormatted>; - +value: ImprovementDirection; - +string: String; - +icon: IconData?; - +hashCode: int - | - +bool ==(); - +String toString(); - +String toJson(); - <static>+ImprovementDirectionFormatted fromJson() - ] - - [ImprovementDirectionFormatted]o-[ImprovementDirection] - [ImprovementDirectionFormatted]o-[IconData] - - [ReportSectionType - | - +index: int; - <static>+values: List<ReportSectionType>; - <static>+average: ReportSectionType; - <static>+linearRegression: ReportSectionType - ] - - [ReportSectionType]o-[ReportSectionType] - [Enum]<:--[ReportSectionType] - - [AverageSectionFormView - | - +formViewModel: ReportItemFormViewModel; - +studyId: String; - +reportSectionColumnWidth: Map<int, TableColumnWidth> - | - +Widget build() - ] - - [AverageSectionFormView]o-[ReportItemFormViewModel] - [<abstract>ConsumerWidget]<:-[AverageSectionFormView] - - [DataReferenceIdentifier - | - +hashCode: int - | - +bool ==() - ] - - [DataReference]<:-[DataReferenceIdentifier] - - [LinearRegressionSectionFormView - | - +formViewModel: ReportItemFormViewModel; - +studyId: String; - +reportSectionColumnWidth: Map<int, TableColumnWidth> - | - +Widget build() - ] - - [LinearRegressionSectionFormView]o-[ReportItemFormViewModel] - [<abstract>ConsumerWidget]<:-[LinearRegressionSectionFormView] - - [ReportItemFormViewModel - | - <static>+defaultSectionType: ReportSectionType; - +sectionIdControl: FormControl<String>; - +sectionTypeControl: FormControl<ReportSectionType>; - +titleControl: FormControl<String>; - +descriptionControl: FormControl<String>; - +sectionControl: FormControl<ReportSection>; - +dataReferenceControl: FormControl<DataReferenceIdentifier<num>>; - +temporalAggregationControl: FormControl<TemporalAggregationFormatted>; - +improvementDirectionControl: FormControl<ImprovementDirectionFormatted>; - +alphaControl: FormControl<double>; - -_controlsBySectionType: Map<ReportSectionType, FormGroup>; - -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - -_validationConfigsBySectionType: Map<ReportSectionType, Map<FormValidationSetEnum, List<FormControlValidation>>>; - +sectionBaseControls: Map<String, AbstractControl<dynamic>>; - +form: FormGroup; - +sectionId: String; - +sectionType: ReportSectionType; - <static>+sectionTypeControlOptions: List<FormControlOption<ReportSectionType>>; - <static>+temporalAggregationControlOptions: List<FormControlOption<TemporalAggregationFormatted>>; - <static>+improvementDirectionControlOptions: List<FormControlOption<ImprovementDirectionFormatted>>; - +titles: Map<FormMode, String>; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titleRequired: dynamic; - +descriptionRequired: dynamic; - +dataReferenceRequired: dynamic; - +aggregationRequired: dynamic; - +improvementDirectionRequired: dynamic; - +alphaConfidenceRequired: dynamic - | - -List<FormControlValidation> _getValidationConfig(); - +ReportItemFormData buildFormData(); - +ReportItemFormViewModel createDuplicate(); - +dynamic onSectionTypeChanged(); - -void _updateFormControls(); - +void setControlsFrom() - ] - - [ReportItemFormViewModel]o-[ReportSectionType] - [ReportItemFormViewModel]o-[FormControl] - [ReportItemFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[ReportItemFormViewModel] - - [ReportItemFormView - | - +formViewModel: ReportItemFormViewModel; - +studyId: String; - +reportSectionColumnWidth: dynamic; - +sectionTypeBodyBuilder: Widget Function(BuildContext) - | - +Widget build(); - -dynamic _buildSectionText(); - -dynamic _buildSectionTypeHeader() - ] - - [ReportItemFormView]o-[ReportItemFormViewModel] - [ReportItemFormView]o-[Widget Function(BuildContext)] - - [ReportsFormViewModel - | - +study: Study; - +router: GoRouter; - +reportItemDelegate: ReportFormItemDelegate; - +reportItemArray: FormArray<dynamic>; - +reportItemFormViewModels: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData>; - +form: FormGroup; - +reportItemModels: List<ReportItemFormViewModel>; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titles: Map<FormMode, String>; - +canTestConsent: bool - | - +void setControlsFrom(); - +ReportsFormData buildFormData(); - +void read(); - +ReportItemFormRouteArgs buildNewReportItemFormRouteArgs(); - +ReportItemFormRouteArgs buildReportItemFormRouteArgs(); - +dynamic testReport(); - +void onCancel(); - +dynamic onSave(); - +ReportItemFormViewModel provide() - ] - - [ReportsFormViewModel]o-[Study] - [ReportsFormViewModel]o-[GoRouter] - [ReportsFormViewModel]o-[ReportFormItemDelegate] - [ReportsFormViewModel]o-[FormArray] - [ReportsFormViewModel]o-[FormViewModelCollection] - [ReportsFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[ReportsFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[ReportsFormViewModel] - [<abstract>IProviderArgsResolver]<:--[ReportsFormViewModel] - - [ReportFormItemDelegate - | - +formViewModelCollection: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData>; - +owner: ReportsFormViewModel; - +propagateOnSave: bool; - +validationSet: dynamic - | - +void onCancel(); - +dynamic onSave(); - +ReportItemFormViewModel provide(); - +List<ModelAction<dynamic>> availableActions(); - +void onNewItem(); - +void onSelectItem() - ] - - [ReportFormItemDelegate]o-[FormViewModelCollection] - [ReportFormItemDelegate]o-[ReportsFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[ReportFormItemDelegate] - [<abstract>IListActionProvider]<:--[ReportFormItemDelegate] - [<abstract>IProviderArgsResolver]<:--[ReportFormItemDelegate] - - [ReportBadge - | - +status: ReportStatus?; - +type: BadgeType; - +showPrefixIcon: bool; - +showTooltip: bool - | - +Widget build() - ] - - [ReportBadge]o-[ReportStatus] - [ReportBadge]o-[BadgeType] - - [ReportsFormData - | - +reportItems: List<ReportItemFormData>; - +id: String - | - +Study apply(); - +ReportsFormData copy() - ] - - [<abstract>IStudyFormData]<:--[ReportsFormData] - - [ReportStatus - | - +index: int; - <static>+values: List<ReportStatus>; - <static>+primary: ReportStatus; - <static>+secondary: ReportStatus - ] - - [ReportStatus]o-[ReportStatus] - [Enum]<:--[ReportStatus] - - [<abstract>IStudyFormData - | - +Study apply() - ] - - [<abstract>IFormData]<:--[<abstract>IStudyFormData] - - [StudyInfoFormViewModel - | - +study: Study; - +titleControl: FormControl<String>; - +iconControl: FormControl<IconOption>; - +descriptionControl: FormControl<String>; - +organizationControl: FormControl<String>; - +reviewBoardControl: FormControl<String>; - +reviewBoardNumberControl: FormControl<String>; - +researchersControl: FormControl<String>; - +emailControl: FormControl<String>; - +websiteControl: FormControl<String>; - +phoneControl: FormControl<String>; - +additionalInfoControl: FormControl<String>; - +form: FormGroup; - +titles: Map<FormMode, String>; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titleRequired: dynamic; - +descriptionRequired: dynamic; - +iconRequired: dynamic; - +organizationRequired: dynamic; - +reviewBoardRequired: dynamic; - +reviewBoardNumberRequired: dynamic; - +researchersRequired: dynamic; - +emailRequired: dynamic; - +phoneRequired: dynamic; - +emailFormat: dynamic; - +websiteFormat: dynamic - | - +void setControlsFrom(); - +StudyInfoFormData buildFormData() - ] - - [StudyInfoFormViewModel]o-[Study] - [StudyInfoFormViewModel]o-[FormControl] - [StudyInfoFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[StudyInfoFormViewModel] - - [StudyDesignInfoFormView - | - +Widget build() - ] - - [<abstract>StudyDesignPageWidget]<:-[StudyDesignInfoFormView] - - [StudyInfoFormData - | - +title: String; - +description: String?; - +iconName: String; - +contactInfoFormData: StudyContactInfoFormData; - +id: String - | - +Study apply(); - +StudyInfoFormData copy() - ] - - [StudyInfoFormData]o-[StudyContactInfoFormData] - [<abstract>IStudyFormData]<:--[StudyInfoFormData] - - [StudyContactInfoFormData - | - +organization: String?; - +institutionalReviewBoard: String?; - +institutionalReviewBoardNumber: String?; - +researchers: String?; - +email: String?; - +website: String?; - +phone: String?; - +additionalInfo: String?; - +id: String - | - +Study apply(); - +StudyInfoFormData copy() - ] - - [<abstract>IStudyFormData]<:--[StudyContactInfoFormData] - - [StudyFormValidationSet - | - +index: int; - <static>+values: List<StudyFormValidationSet> - ] - - [Enum]<:--[StudyFormValidationSet] - - [MeasurementsFormData - | - +surveyMeasurements: List<MeasurementSurveyFormData>; - +id: String - | - +Study apply(); - +MeasurementsFormData copy() - ] - - [<abstract>IStudyFormData]<:--[MeasurementsFormData] - - [MeasurementSurveyFormView - | - +formViewModel: MeasurementSurveyFormViewModel - ] - - [MeasurementSurveyFormView]o-[MeasurementSurveyFormViewModel] - - [SurveyPreview - | - +routeArgs: MeasurementFormRouteArgs - | - +Widget build() - ] - - [SurveyPreview]o-[MeasurementFormRouteArgs] - [<abstract>ConsumerWidget]<:-[SurveyPreview] - - [MeasurementSurveyFormData - | - +measurementId: String; - +title: String; - +introText: String?; - +outroText: String?; - +questionnaireFormData: QuestionnaireFormData; - <static>+kDefaultTitle: String; - +id: String - | - +QuestionnaireTask toQuestionnaireTask(); - +MeasurementSurveyFormData copy() - ] - - [MeasurementSurveyFormData]o-[QuestionnaireFormData] - [<abstract>IFormDataWithSchedule]<:-[MeasurementSurveyFormData] - - [MeasurementSurveyFormViewModel - | - +study: Study; - +measurementIdControl: FormControl<String>; - +instanceIdControl: FormControl<String>; - +surveyTitleControl: FormControl<String>; - +surveyIntroTextControl: FormControl<String>; - +surveyOutroTextControl: FormControl<String>; - +form: FormGroup; - +measurementId: String; - +instanceId: String; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titleRequired: dynamic; - +atLeastOneQuestion: dynamic; - +breadcrumbsTitle: String; - +titles: Map<FormMode, String> - | - +void setControlsFrom(); - +MeasurementSurveyFormData buildFormData(); - +List<ModelAction<dynamic>> availableActions(); - +List<ModelAction<dynamic>> availablePopupActions(); - +List<ModelAction<dynamic>> availableInlineActions(); - +void onSelectItem(); - +void onNewItem(); - +SurveyQuestionFormRouteArgs buildNewFormRouteArgs(); - +SurveyQuestionFormRouteArgs buildFormRouteArgs(); - +MeasurementSurveyFormViewModel createDuplicate() - ] - - [MeasurementSurveyFormViewModel]o-[Study] - [MeasurementSurveyFormViewModel]o-[FormControl] - [MeasurementSurveyFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[MeasurementSurveyFormViewModel] - [<abstract>WithQuestionnaireControls]<:-[MeasurementSurveyFormViewModel] - [<abstract>WithScheduleControls]<:-[MeasurementSurveyFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[MeasurementSurveyFormViewModel] - [<abstract>IListActionProvider]<:--[MeasurementSurveyFormViewModel] - [<abstract>IProviderArgsResolver]<:--[MeasurementSurveyFormViewModel] - - [StudyDesignMeasurementsFormView - | - +Widget build() - ] - - [<abstract>StudyDesignPageWidget]<:-[StudyDesignMeasurementsFormView] - - [MeasurementsFormViewModel - | - +study: Study; - +router: GoRouter; - +measurementsArray: FormArray<dynamic>; - +surveyMeasurementFormViewModels: FormViewModelCollection<MeasurementSurveyFormViewModel, MeasurementSurveyFormData>; - +form: FormGroup; - +measurementViewModels: List<MeasurementSurveyFormViewModel>; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +measurementRequired: dynamic; - +titles: Map<FormMode, String> - | - +void read(); - +void setControlsFrom(); - +MeasurementsFormData buildFormData(); - +List<ModelAction<dynamic>> availableActions(); - +List<ModelAction<dynamic>> availablePopupActions(); - +List<ModelAction<dynamic>> availableInlineActions(); - +void onSelectItem(); - +void onNewItem(); - +MeasurementSurveyFormViewModel provide(); - +void onCancel(); - +dynamic onSave() - ] - - [MeasurementsFormViewModel]o-[Study] - [MeasurementsFormViewModel]o-[GoRouter] - [MeasurementsFormViewModel]o-[FormArray] - [MeasurementsFormViewModel]o-[FormViewModelCollection] - [MeasurementsFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[MeasurementsFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[MeasurementsFormViewModel] - [<abstract>IListActionProvider]<:--[MeasurementsFormViewModel] - [<abstract>IProviderArgsResolver]<:--[MeasurementsFormViewModel] - - [StudyFormScaffold - | - +studyId: String; - +formViewModelBuilder: T Function(WidgetRef); - +formViewBuilder: Widget Function(T) - | - +Widget build() - ] - - [StudyFormScaffold]o-[T Function(WidgetRef)] - [StudyFormScaffold]o-[Widget Function(T)] - [<abstract>ConsumerWidget]<:-[StudyFormScaffold] - - [ConsentItemFormViewModel - | - +consentIdControl: FormControl<String>; - +titleControl: FormControl<String>; - +descriptionControl: FormControl<String>; - +iconControl: FormControl<IconOption>; - +form: FormGroup; - +consentId: String; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titleRequired: dynamic; - +descriptionRequired: dynamic; - +titles: Map<FormMode, String> - | - +void setControlsFrom(); - +ConsentItemFormData buildFormData(); - +ConsentItemFormViewModel createDuplicate() - ] - - [ConsentItemFormViewModel]o-[FormControl] - [ConsentItemFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[ConsentItemFormViewModel] - - [StudyDesignEnrollmentFormView - | - +Widget build(); - -dynamic _showScreenerQuestionSidesheetWithArgs(); - -dynamic _showConsentItemSidesheetWithArgs() - ] - - [<abstract>StudyDesignPageWidget]<:-[StudyDesignEnrollmentFormView] - - [<abstract>IScreenerQuestionLogicFormViewModel - | - +isDirtyOptionsBannerVisible: bool - ] - - [ScreenerQuestionLogicFormView - | - +formViewModel: ScreenerQuestionFormViewModel - | - +Widget build(); - -dynamic _buildInfoBanner(); - -dynamic _buildAnswerOptionsLogicControls(); - -List<Widget> _buildOptionLogicRow() - ] - - [ScreenerQuestionLogicFormView]o-[ScreenerQuestionFormViewModel] - [<abstract>FormConsumerWidget]<:-[ScreenerQuestionLogicFormView] - - [ConsentItemFormData - | - +consentId: String; - +title: String; - +description: String; - +iconName: String?; - +id: String - | - +ConsentItem toConsentItem(); - +ConsentItemFormData copy() - ] - - [<abstract>IFormData]<:-[ConsentItemFormData] - - [ConsentItemFormView - | - +formViewModel: ConsentItemFormViewModel - ] - - [ConsentItemFormView]o-[ConsentItemFormViewModel] - - [EnrollmentFormData - | - <static>+kDefaultEnrollmentType: Participation; - +enrollmentType: Participation; - +questionnaireFormData: QuestionnaireFormData; - +consentItemsFormData: List<ConsentItemFormData>?; - +id: String - | - +Study apply(); - +EnrollmentFormData copy() - ] - - [EnrollmentFormData]o-[Participation] - [EnrollmentFormData]o-[QuestionnaireFormData] - [<abstract>IStudyFormData]<:--[EnrollmentFormData] - - [ScreenerQuestionFormViewModel - | - <static>+defaultResponseOptionValidity: bool; - +responseOptionsDisabledArray: FormArray<dynamic>; - +responseOptionsLogicControls: FormArray<bool>; - +responseOptionsLogicDescriptionControls: FormArray<String>; - -_questionBaseControls: Map<String, AbstractControl<dynamic>>; - +prevResponseOptionControls: List<AbstractControl<dynamic>>; - +prevResponseOptionValues: List<dynamic>; - +responseOptionsDisabledControls: List<AbstractControl<dynamic>>; - +logicControlOptions: List<FormControlOption<bool>>; - +questionBaseControls: Map<String, AbstractControl<dynamic>>; - +isDirtyOptionsBannerVisible: bool - | - +dynamic onResponseOptionsChanged(); - +void setControlsFrom(); - +QuestionFormData buildFormData(); - -List<FormControl<dynamic>> _copyFormControls(); - -AbstractControl<dynamic>? _findAssociatedLogicControlFor(); - -AbstractControl<dynamic>? _findAssociatedControlFor(); - +ScreenerQuestionFormViewModel createDuplicate() - ] - - [ScreenerQuestionFormViewModel]o-[FormArray] - [QuestionFormViewModel]<:-[ScreenerQuestionFormViewModel] - [<abstract>IScreenerQuestionLogicFormViewModel]<:--[ScreenerQuestionFormViewModel] - - [EnrollmentFormViewModel - | - +study: Study; - +router: GoRouter; - +consentItemDelegate: EnrollmentFormConsentItemDelegate; - +enrollmentTypeControl: FormControl<Participation>; - +consentItemArray: FormArray<dynamic>; - +consentItemFormViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData>; - +form: FormGroup; - +enrollmentTypeControlOptions: List<FormControlOption<Participation>>; - +consentItemModels: List<ConsentItemFormViewModel>; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titles: Map<FormMode, String>; - +canTestScreener: bool; - +canTestConsent: bool; - +questionTitles: Map<FormMode, String Function()> - | - +void setControlsFrom(); - +EnrollmentFormData buildFormData(); - +void read(); - +List<ModelAction<dynamic>> availableActions(); - +List<ModelAction<dynamic>> availablePopupActions(); - +List<ModelAction<dynamic>> availableInlineActions(); - +void onSelectItem(); - +void onNewItem(); - +ScreenerQuestionFormRouteArgs buildNewScreenerQuestionFormRouteArgs(); - +ScreenerQuestionFormRouteArgs buildScreenerQuestionFormRouteArgs(); - +ConsentItemFormRouteArgs buildNewConsentItemFormRouteArgs(); - +ConsentItemFormRouteArgs buildConsentItemFormRouteArgs(); - +dynamic testScreener(); - +dynamic testConsent(); - +ScreenerQuestionFormViewModel provideQuestionFormViewModel() - ] - - [EnrollmentFormViewModel]o-[Study] - [EnrollmentFormViewModel]o-[GoRouter] - [EnrollmentFormViewModel]o-[EnrollmentFormConsentItemDelegate] - [EnrollmentFormViewModel]o-[FormControl] - [EnrollmentFormViewModel]o-[FormArray] - [EnrollmentFormViewModel]o-[FormViewModelCollection] - [EnrollmentFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[EnrollmentFormViewModel] - [<abstract>WithQuestionnaireControls]<:-[EnrollmentFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[EnrollmentFormViewModel] - [<abstract>IListActionProvider]<:--[EnrollmentFormViewModel] - [<abstract>IProviderArgsResolver]<:--[EnrollmentFormViewModel] - - [EnrollmentFormConsentItemDelegate - | - +formViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData>; - +owner: EnrollmentFormViewModel; - +propagateOnSave: bool; - +validationSet: dynamic - | - +void onCancel(); - +dynamic onSave(); - +ConsentItemFormViewModel provide(); - +List<ModelAction<dynamic>> availableActions(); - +void onNewItem(); - +void onSelectItem() - ] - - [EnrollmentFormConsentItemDelegate]o-[FormViewModelCollection] - [EnrollmentFormConsentItemDelegate]o-[EnrollmentFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[EnrollmentFormConsentItemDelegate] - [<abstract>IListActionProvider]<:--[EnrollmentFormConsentItemDelegate] - [<abstract>IProviderArgsResolver]<:--[EnrollmentFormConsentItemDelegate] - - [StudyFormViewModel - | - +studyDirtyCopy: Study?; - +studyRepository: IStudyRepository; - +authRepository: IAuthRepository; - +router: GoRouter; - +studyInfoFormViewModel: StudyInfoFormViewModel; - +enrollmentFormViewModel: EnrollmentFormViewModel; - +measurementsFormViewModel: MeasurementsFormViewModel; - +reportsFormViewModel: ReportsFormViewModel; - +interventionsFormViewModel: InterventionsFormViewModel; - +form: FormGroup; - +isStudyReadonly: bool; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titles: Map<FormMode, String> - | - +void read(); - +void setControlsFrom(); - +Study buildFormData(); - +void dispose(); - +void onCancel(); - +dynamic onSave(); - -dynamic _applyAndSaveSubform() - ] - - [StudyFormViewModel]o-[Study] - [StudyFormViewModel]o-[<abstract>IStudyRepository] - [StudyFormViewModel]o-[<abstract>IAuthRepository] - [StudyFormViewModel]o-[GoRouter] - [StudyFormViewModel]o-[StudyInfoFormViewModel] - [StudyFormViewModel]o-[EnrollmentFormViewModel] - [StudyFormViewModel]o-[MeasurementsFormViewModel] - [StudyFormViewModel]o-[ReportsFormViewModel] - [StudyFormViewModel]o-[InterventionsFormViewModel] - [StudyFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[StudyFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[StudyFormViewModel] - - [<abstract>WithQuestionnaireControls - | - +questionsArray: FormArray<dynamic>; - +questionFormViewModels: FormViewModelCollection<Q, QuestionFormData>; - +questionnaireControls: Map<String, FormArray<dynamic>>; - +propagateOnSave: bool; - +questionModels: List<Q>; - +questionTitles: Map<FormMode, String Function()> - | - +void setQuestionnaireControlsFrom(); - +QuestionnaireFormData buildQuestionnaireFormData(); - +void read(); - +void onCancel(); - +dynamic onSave(); - +Q provide(); - +Q provideQuestionFormViewModel() - ] - - [<abstract>WithQuestionnaireControls]o-[FormArray] - [<abstract>WithQuestionnaireControls]o-[FormViewModelCollection] - [<abstract>IFormViewModelDelegate]<:--[<abstract>WithQuestionnaireControls] - [<abstract>IProviderArgsResolver]<:--[<abstract>WithQuestionnaireControls] - - [QuestionnaireFormData - | - +questionsData: List<QuestionFormData>?; - +id: String - | - +StudyUQuestionnaire toQuestionnaire(); - +List<EligibilityCriterion> toEligibilityCriteria(); - +QuestionnaireFormData copy() - ] - - [<abstract>IFormData]<:--[QuestionnaireFormData] - - [<abstract>QuestionFormData - | - <static>+questionTypeFormDataFactories: Map<SurveyQuestionType, QuestionFormData Function(Question<dynamic>, List<EligibilityCriterion>)>; - +questionId: String; - +questionText: String; - +questionInfoText: String?; - +questionType: SurveyQuestionType; - +responseOptionsValidity: Map<dynamic, bool>; - +responseOptions: List<dynamic>; - +id: String - | - +Question<dynamic> toQuestion(); - +EligibilityCriterion toEligibilityCriterion(); - +Answer<dynamic> constructAnswerFor(); - +dynamic setResponseOptionsValidityFrom(); - +QuestionFormData copy() - ] - - [<abstract>QuestionFormData]o-[SurveyQuestionType] - [<abstract>IFormData]<:--[<abstract>QuestionFormData] - - [ChoiceQuestionFormData - | - +isMultipleChoice: bool; - +answerOptions: List<String>; - +responseOptions: List<String> - | - +Question<dynamic> toQuestion(); - +QuestionFormData copy(); - -Choice _buildChoiceForValue(); - +Answer<dynamic> constructAnswerFor() - ] - - [<abstract>QuestionFormData]<:-[ChoiceQuestionFormData] - - [BoolQuestionFormData - | - <static>+kResponseOptions: Map<String, bool>; - +responseOptions: List<String> - | - +Question<dynamic> toQuestion(); - +BoolQuestionFormData copy(); - +Answer<dynamic> constructAnswerFor() - ] - - [<abstract>QuestionFormData]<:-[BoolQuestionFormData] - - [ImageQuestionFormData - | - <static>+kResponseOptions: Map<String, FutureBlobFile>; - +responseOptions: List<String> - | - +Question<dynamic> toQuestion(); - +ImageQuestionFormData copy(); - +Answer<dynamic> constructAnswerFor() - ] - - [<abstract>QuestionFormData]<:-[ImageQuestionFormData] - - [AudioQuestionFormData - | - +maxRecordingDurationSeconds: int; - <static>+kResponseOptions: Map<String, FutureBlobFile>; - +responseOptions: List<String> - | - +Question<dynamic> toQuestion(); - +AudioQuestionFormData copy(); - +Answer<dynamic> constructAnswerFor() - ] - - [<abstract>QuestionFormData]<:-[AudioQuestionFormData] - - [ScaleQuestionFormData - | - +minValue: double; - +maxValue: double; - +minLabel: String?; - +maxLabel: String?; - +midValues: List<double?>; - +midLabels: List<String?>; - +stepSize: double; - +initialValue: double?; - +minColor: Color?; - +maxColor: Color?; - +responseOptions: List<double>; - +midAnnotations: List<Annotation> - | - +ScaleQuestion toQuestion(); - +QuestionFormData copy(); - +Answer<dynamic> constructAnswerFor() - ] - - [ScaleQuestionFormData]o-[Color] - [<abstract>QuestionFormData]<:-[ScaleQuestionFormData] - - [FreeTextQuestionFormData - | - +textLengthRange: List<int>; - +textType: FreeTextQuestionType; - +textTypeExpression: String?; - +responseOptions: List<String> - | - +Question<dynamic> toQuestion(); - +FreeTextQuestionFormData copy(); - +Answer<dynamic> constructAnswerFor() - ] - - [FreeTextQuestionFormData]o-[FreeTextQuestionType] - [<abstract>QuestionFormData]<:-[FreeTextQuestionFormData] - - [AudioRecordingQuestionFormView - | - +formViewModel: QuestionFormViewModel - | - +Widget build() - ] - - [AudioRecordingQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[AudioRecordingQuestionFormView] - - [FreeTextQuestionFormView - | - +formViewModel: QuestionFormViewModel; - +generateLabelHelpTextMap: dynamic - | - +Widget build(); - +Widget disableOnReadonly(); - +Widget generateRow() - ] - - [FreeTextQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[FreeTextQuestionFormView] - - [SurveyQuestionType - | - +index: int; - <static>+values: List<SurveyQuestionType>; - <static>+choice: SurveyQuestionType; - <static>+bool: SurveyQuestionType; - <static>+scale: SurveyQuestionType; - <static>+image: SurveyQuestionType; - <static>+audio: SurveyQuestionType; - <static>+freeText: SurveyQuestionType - ] - - [SurveyQuestionType]o-[SurveyQuestionType] - [Enum]<:--[SurveyQuestionType] - - [ImageCapturingQuestionFormView - | - +formViewModel: QuestionFormViewModel - | - +Widget build() - ] - - [ImageCapturingQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[ImageCapturingQuestionFormView] - - [<abstract>IScaleQuestionFormViewModel - | - +isMidValuesClearedInfoVisible: bool - ] - - [ScaleQuestionFormView - | - +formViewModel: QuestionFormViewModel - ] - - [ScaleQuestionFormView]o-[QuestionFormViewModel] - - [ChoiceQuestionFormView - | - +formViewModel: QuestionFormViewModel - | - +Widget build() - ] - - [ChoiceQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[ChoiceQuestionFormView] - - [BoolQuestionFormView - | - +formViewModel: QuestionFormViewModel - | - +Widget build() - ] - - [BoolQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[BoolQuestionFormView] - - [QuestionFormViewModel - | - <static>+defaultQuestionType: SurveyQuestionType; - -_titles: Map<FormMode, String Function()>?; - +questionIdControl: FormControl<String>; - +questionTypeControl: FormControl<SurveyQuestionType>; - +questionTextControl: FormControl<String>; - +questionInfoTextControl: FormControl<String>; - +questionBaseControls: Map<String, AbstractControl<dynamic>>; - +isMultipleChoiceControl: FormControl<bool>; - +choiceResponseOptionsArray: FormArray<dynamic>; - +customOptionsMin: int; - +customOptionsMax: int; - +customOptionsInitial: int; - +boolResponseOptionsArray: FormArray<String>; - +imageResponseOptionsArray: FormArray<String>; - <static>+kDefaultMaxRecordingDurationSeconds: int; - <static>+kMaxRecordingDurationSeconds: int; - +audioResponseOptionsArray: FormArray<String>; - +maxRecordingDurationSecondsControl: FormControl<int>; - <static>+kDefaultScaleMinValue: int; - <static>+kDefaultScaleMaxValue: int; - <static>+kNumMidValueControls: int; - <static>+kMidValueDebounceMilliseconds: int; - +scaleMinValueControl: FormControl<int>; - +scaleMaxValueControl: FormControl<int>; - -_scaleRangeControl: FormControl<int>; - +scaleMinLabelControl: FormControl<String>; - +scaleMaxLabelControl: FormControl<String>; - +scaleMidValueControls: FormArray<int>; - +scaleMidLabelControls: FormArray<String?>; - -_scaleResponseOptionsArray: FormArray<int>; - +scaleMinColorControl: FormControl<SerializableColor>; - +scaleMaxColorControl: FormControl<SerializableColor>; - +prevMidValues: List<int?>?; - +freeTextTypeControl: FormControl<FreeTextQuestionType>; - +customRegexControl: FormControl<String>; - +freeTextResponseOptionsArray: FormArray<dynamic>; - +freeTextLengthMin: AbstractControl<int>; - +freeTextLengthMax: AbstractControl<int>; - +freeTextExampleTextControl: FormControl<String>; - <static>+kDefaultFreeTextMinLength: int; - <static>+kDefaultFreeTextMaxLength: int; - +freeTextLengthControl: FormControl<RangeValues>; - -_controlsByQuestionType: Map<SurveyQuestionType, FormGroup>; - -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - -_validationConfigsByQuestionType: Map<SurveyQuestionType, Map<FormValidationSetEnum, List<FormControlValidation>>>; - +form: FormGroup; - +questionId: String; - +questionType: SurveyQuestionType; - +questionTypeControlOptions: List<FormControlOption<SurveyQuestionType>>; - +answerOptionsArray: FormArray<dynamic>; - +answerOptionsControls: List<AbstractControl<dynamic>>; - +validAnswerOptions: List<String>; - +boolOptions: List<AbstractControl<String>>; - +imageOptions: List<AbstractControl<String>>; - +audioOptions: List<AbstractControl<String>>; - +scaleMinValue: int; - +scaleMaxValue: int; - +scaleRange: int; - +scaleAllValueControls: List<AbstractControl<int>>; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +questionTextRequired: dynamic; - +numValidChoiceOptions: dynamic; - +scaleRangeValid: dynamic; - +maxRecordingDurationValid: dynamic; - +titles: Map<FormMode, String>; - +isAddOptionButtonVisible: bool; - +isMidValuesClearedInfoVisible: bool - | - +String? scaleMidLabelAt(); - -dynamic _onScaleRangeChanged(); - -dynamic _applyInputFormatters(); - -dynamic _updateScaleMidValueControls(); - -Map<String, dynamic>? _validateFreeText(); - -dynamic _onFreeTextLengthChanged(); - -List<FormControlValidation> _getValidationConfig(); - +dynamic onQuestionTypeChanged(); - +dynamic onResponseOptionsChanged(); - -void _updateFormControls(); - +void initControls(); - +void setControlsFrom(); - +QuestionFormData buildFormData(); - +List<ModelAction<dynamic>> availableActions(); - +void onNewItem(); - +void onSelectItem(); - +dynamic save(); - +QuestionFormViewModel createDuplicate() - ] - - [QuestionFormViewModel]o-[SurveyQuestionType] - [QuestionFormViewModel]o-[FormControl] - [QuestionFormViewModel]o-[FormArray] - [QuestionFormViewModel]o-[<abstract>AbstractControl] - [QuestionFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[QuestionFormViewModel] - [<abstract>IListActionProvider]<:--[QuestionFormViewModel] - - [SurveyQuestionFormView - | - +formViewModel: QuestionFormViewModel; - +isHtmlStyleable: bool - ] - - [SurveyQuestionFormView]o-[QuestionFormViewModel] - - [<abstract>IFormDataWithSchedule - | - +instanceId: String; - +isTimeLocked: bool; - +timeLockStart: StudyUTimeOfDay?; - +timeLockEnd: StudyUTimeOfDay?; - +hasReminder: bool; - +reminderTime: StudyUTimeOfDay? - | - +Schedule toSchedule() - ] - - [<abstract>IFormDataWithSchedule]o-[StudyUTimeOfDay] - [<abstract>IFormData]<:--[<abstract>IFormDataWithSchedule] - - [ScheduleControls - | - +formViewModel: WithScheduleControls - | - +Widget build(); - -List<FormTableRow> _conditionalTimeRestrictions() - ] - - [ScheduleControls]o-[<abstract>WithScheduleControls] - [<abstract>FormConsumerWidget]<:-[ScheduleControls] - - [<abstract>WithScheduleControls - | - +isTimeRestrictedControl: FormControl<bool>; - +instanceID: FormControl<String>; - +restrictedTimeStartControl: FormControl<Time>; - +restrictedTimeStartPickerControl: FormControl<TimeOfDay>; - +restrictedTimeEndControl: FormControl<Time>; - +restrictedTimeEndPickerControl: FormControl<TimeOfDay>; - +hasReminderControl: FormControl<bool>; - +reminderTimeControl: FormControl<Time>; - +reminderTimePickerControl: FormControl<TimeOfDay>; - -_reminderControlStream: StreamSubscription<dynamic>?; - +scheduleFormControls: Map<String, FormControl<Object>>; - +hasReminder: bool; - +isTimeRestricted: bool; - +timeRestriction: List<Time>? - | - +void setScheduleControlsFrom(); - -dynamic _initReminderControl() - ] - - [<abstract>WithScheduleControls]o-[FormControl] - [<abstract>WithScheduleControls]o-[StreamSubscription] - - [<abstract>StudyDesignPageWidget - | - +Widget? banner() - ] - - [<abstract>StudyPageWidget]<:-[<abstract>StudyDesignPageWidget] - - [StudiesTableColumnHeader - | - +title: String; - +sortable: bool; - +sortAscending: bool; - +sortingActive: bool; - +onSort: void Function()? - ] - - [StudiesTableColumnHeader]o-[void Function()?] - - [DashboardScreen - | - +filter: StudiesFilter? - ] - - [DashboardScreen]o-[StudiesFilter] - - [DashboardScaffold - | - <static>+compactWidthThreshold: double; - +body: Widget - | - +Widget build() - ] - - [DashboardScaffold]o-[<abstract>Widget] - - [DashboardController - | - +studyRepository: IStudyRepository; - +authRepository: IAuthRepository; - +userRepository: IUserRepository; - +router: GoRouter; - -_studiesSubscription: StreamSubscription<List<WrappedModel<Study>>>?; - +searchController: SearchController; - +isSortAscending: bool - | - -dynamic _subscribeStudies(); - +dynamic setSearchText(); - +dynamic setStudiesFilter(); - +dynamic onSelectStudy(); - +dynamic onClickNewStudy(); - +dynamic pinStudy(); - +dynamic pinOffStudy(); - +void setSorting(); - +void filterStudies(); - +void sortStudies(); - +bool isSortingActiveForColumn(); - +bool isPinned(); - +List<ModelAction<dynamic>> availableActions(); - +void dispose() - ] - - [DashboardController]o-[<abstract>IStudyRepository] - [DashboardController]o-[<abstract>IAuthRepository] - [DashboardController]o-[<abstract>IUserRepository] - [DashboardController]o-[GoRouter] - [DashboardController]o-[StreamSubscription] - [DashboardController]o-[SearchController] - [<abstract>IModelActionProvider]<:--[DashboardController] - - [StudiesFilter - | - +index: int; - <static>+values: List<StudiesFilter> - ] - - [Enum]<:--[StudiesFilter] - - [StudiesTableColumnSize - | - +collapsed: bool; - +flex: int?; - +width: double? - | - +Widget createContainer() - ] - - [StudiesTable - | - +itemHeight: double; - +itemPadding: double; - +rowSpacing: double; - +columnSpacing: double; - +compactWidthThreshold: double; - +superCompactWidthThreshold: double; - +compactStatTitleThreshold: double; - +studies: List<Study>; - +onSelect: void Function(Study); - +getActions: List<ModelAction<dynamic>> Function(Study); - +emptyWidget: Widget; - +pinnedStudies: Iterable<String>; - +dashboardController: DashboardController - | - +Widget build(); - -Widget _buildColumnHeader() - ] - - [StudiesTable]o-[void Function(Study)] - [StudiesTable]o-[List<ModelAction<dynamic>> Function(Study)] - [StudiesTable]o-[<abstract>Widget] - [StudiesTable]o-[DashboardController] - - [StudiesTableColumn - | - +index: int; - <static>+values: List<StudiesTableColumn>; - <static>+pin: StudiesTableColumn; - <static>+title: StudiesTableColumn; - <static>+status: StudiesTableColumn; - <static>+participation: StudiesTableColumn; - <static>+createdAt: StudiesTableColumn; - <static>+enrolled: StudiesTableColumn; - <static>+active: StudiesTableColumn; - <static>+completed: StudiesTableColumn; - <static>+action: StudiesTableColumn - ] - - [StudiesTableColumn]o-[StudiesTableColumn] - [Enum]<:--[StudiesTableColumn] - - [StudiesTableItem - | - +study: Study; - +itemHeight: double; - +itemPadding: double; - +rowSpacing: double; - +columnSpacing: double; - +actions: List<ModelAction<dynamic>>; - +columnSizes: List<StudiesTableColumnSize>; - +isPinned: bool; - +onPinnedChanged: void Function(Study, bool)?; - +onTap: void Function(Study)? - ] - - [StudiesTableItem]o-[Study] - [StudiesTableItem]o-[void Function(Study, bool)?] - [StudiesTableItem]o-[void Function(Study)?] - - [App - ] - - [AppContent - ] - - [AccountSettingsDialog - | - +Widget build() - ] - - [<abstract>ConsumerWidget]<:-[AccountSettingsDialog] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IAppDelegate - - - - - - +dynamic onAppStart() - - - - - - - - - - - - - AppController - - - - - - +appDelegates: List<IAppDelegate> - -_delayedFuture: dynamic - +isInitialized: dynamic - - - - - - +dynamic onAppStart() - -dynamic _callDelegates() - - - - - - - - - - - - StudyMonitorScreen - - - - - - +Widget build() - - - - - - - - - - - - - StudyPageWidget - - - - - - +studyId: String - - - - - - +Widget? banner() - - - - - - - - - - - - - LoginForm - - - - - - +formKey: AuthFormKey - - - - - - +Widget build() - - - - - - - - - - - - AuthFormKey - - - - - - +index: int - <static>+values: List<AuthFormKey> - <static>+login: AuthFormKey - <static>+signup: AuthFormKey - <static>+passwordForgot: AuthFormKey - <static>+passwordRecovery: AuthFormKey - <static>-_loginSubmit: AuthFormKey - <static>-_signupSubmit: AuthFormKey - - - - - - - - - - - FormConsumerRefWidget - - - - - - - - - - - - - PasswordRecoveryForm - - - - - - +formKey: AuthFormKey - - - - - - +Widget build() - - - - - - - - - - - - - PasswordForgotForm - - - - - - +formKey: AuthFormKey - - - - - - +Widget build() - - - - - - - - - - - - - SignupForm - - - - - - +formKey: AuthFormKey - - - - - - +Widget build() - -dynamic _onClickTermsOfUse() - -dynamic _onClickPrivacyPolicy() - - - - - - - - - - - - AuthScaffold - - - - - - +body: Widget - +formKey: AuthFormKey - +leftContentMinWidth: double - +leftPanelMinWidth: double - +leftPanelPadding: EdgeInsets - - - - - - - - - - - Widget - - - - - - - - - - - EdgeInsets - - - - - - - - - - - - EmailTextField - - - - - - +labelText: String - +hintText: String? - +formControlName: String? - +formControl: FormControl<dynamic>? - - - - - - - - - - - FormControl - - - - - - - - - - - - PasswordTextField - - - - - - +labelText: String - +hintText: String? - +onSubmitted: dynamic Function(FormControl<dynamic>)? - +formControlName: String? - +formControl: FormControl<dynamic>? - - - - - - - - - - - dynamic Function(FormControl<dynamic>)? - - - - - - - - - - - - StudyUJobsToBeDone - - - - - - +Widget build() - - - - - - - - - - - - - AuthFormController - - - - - - +authRepository: IAuthRepository - +notificationService: INotificationService - +router: GoRouter - +emailControl: FormControl<String> - +passwordControl: FormControl<String> - +passwordConfirmationControl: FormControl<String> - +termsOfServiceControl: FormControl<bool> - <static>+authValidationMessages: Map<String, String Function(dynamic)> - +loginForm: FormGroup - +signupForm: FormGroup - +passwordForgotForm: FormGroup - +passwordRecoveryForm: FormGroup - +controlValidatorsByForm: Map<AuthFormKey, Map<FormControl<dynamic>, List<Validator<dynamic>>>> - -_formKey: AuthFormKey - +formKey: AuthFormKey - +form: FormGroup - - - - - - -dynamic _getFormFor() - -dynamic _onChangeFormKey() - +dynamic resetControlsFor() - -dynamic _forceValidationMessages() - +dynamic signUp() - -dynamic _signUp() - +dynamic signIn() - -dynamic _signInWith() - +dynamic signOut() - +dynamic resetPasswordForEmail() - +dynamic sendPasswordResetLink() - +dynamic recoverPassword() - +dynamic updateUser() - -dynamic _readDebugUser() - - - - - - - - - - - IAuthRepository - - - - - - - - - - - INotificationService - - - - - - - - - - - GoRouter - - - - - - - - - - - FormGroup - - - - - - - - - - - - IFormGroupController - - - - - - +form: FormGroup - - - - - - - - - - - Enum - - - - - - - - - - - - AppStatus - - - - - - +index: int - <static>+values: List<AppStatus> - <static>+initializing: AppStatus - <static>+initialized: AppStatus - - - - - - - - - - - - - FormArrayTable - - - - - - +control: AbstractControl<dynamic> - +items: List<T> - +onSelectItem: void Function(T) - +getActionsAt: List<ModelAction<dynamic>> Function(T, int) - +onNewItem: void Function()? - +rowTitle: String Function(T) - +onNewItemLabel: String - +sectionTitle: String? - +sectionDescription: String? - +emptyIcon: IconData? - +emptyTitle: String? - +emptyDescription: String? - +sectionTitleDivider: bool? - +rowPrefix: Widget Function(BuildContext, T, int)? - +rowSuffix: Widget Function(BuildContext, T, int)? - +leadingWidget: Widget? - +itemsSectionPadding: EdgeInsets? - +hideLeadingTrailingWhenEmpty: bool - <static>+columns: List<StandardTableColumn> - - - - - - +Widget build() - -List<Widget> _buildRow() - -Widget _newItemButton() - - - - - - - - - - - AbstractControl - - - - - - - - - - - void Function(T) - - - - - - - - - - - List<ModelAction<dynamic>> Function(T, int) - - - - - - - - - - - void Function()? - - - - - - - - - - - String Function(T) - - - - - - - - - - - IconData - - - - - - - - - - - Widget Function(BuildContext, T, int)? - - - - - - - - - - - - ManagedFormViewModel - - - - - - +ManagedFormViewModel<T> createDuplicate() - - - - - - - - - - - - - FormViewModel - - - - - - -_formData: T? - -_formMode: FormMode - -_validationSet: FormValidationSetEnum? - +delegate: IFormViewModelDelegate<FormViewModel<dynamic>>? - +autosave: bool - -_immediateFormChildrenSubscriptions: List<StreamSubscription<dynamic>> - -_immediateFormChildrenListenerDebouncer: Debouncer? - -_autosaveOperation: CancelableOperation<dynamic>? - -_defaultControlValidators: Map<String, Tuple<List<Validator<dynamic>>, List<AsyncValidator<dynamic>>>> - +prevFormValue: Map<String, dynamic>? - <static>-_formKey: String - +formData: T? - +formMode: FormMode - +isReadonly: bool - +validationSet: FormValidationSetEnum? - +isDirty: bool - +title: String - +isValid: bool - +titles: Map<FormMode, String> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - - - - - - -dynamic _setFormData() - -dynamic _rememberDefaultControlValidators() - -Tuple<List<Validator<dynamic>>, List<AsyncValidator<dynamic>>>? _getDefaultValidators() - -dynamic _disableAllControls() - -dynamic _formModeUpdated() - -dynamic _restoreControlsFromFormData() - +void revalidate() - -void _applyValidationSet() - +void read() - +dynamic save() - +dynamic cancel() - +void enableAutosave() - +void listenToImmediateFormChildren() - +dynamic markFormGroupChanged() - +void dispose() - +void setControlsFrom() - +T buildFormData() - +void initControls() - - - - - - - - - - - FormViewModelNotFoundException - - - - - - - - - - - Exception - - - - - - - - - - - - - FormViewModelCollection - - - - - - +formViewModels: List<T> - +formArray: FormArray<dynamic> - +stagedViewModels: List<T> - +retrievableViewModels: List<T> - +formData: List<D> - - - - - - +void add() - +T remove() - +T? findWhere() - +T? removeWhere() - +bool contains() - +void stage() - +T commit() - +void reset() - +void read() - - - - - - - - - - - FormArray - - - - - - - - - - - - - CustomFormControl - - - - - - -_onValueChangedDebouncer: Debouncer? - -_onStatusChangedDebouncer: Debouncer? - +onValueChanged: void Function(T?)? - +onStatusChanged: void Function(ControlStatus)? - +onStatusChangedDebounceTime: int? - +onValueChangedDebounceTime: int? - - - - - - +void dispose() - - - - - - - - - - - Debouncer - - - - - - - - - - - void Function(T?)? - - - - - - - - - - - void Function(ControlStatus)? - - - - - - - - - - - - UnsavedChangesDialog - - - - - - +Widget build() - - - - - - - - - - - FormValidationSetEnum - - - - - - - - - - - - - FormControlValidation - - - - - - +control: AbstractControl<dynamic> - +validators: List<Validator<dynamic>> - +asyncValidators: List<AsyncValidator<dynamic>>? - +validationMessages: Map<String, String Function(Object)> - - - - - - +FormControlValidation merge() - - - - - - - - - - - - - IFormData - - - - - - +id: String - - - - - - +IFormData copy() - - - - - - - - - - - FormInvalidException - - - - - - - - - - - - FormConfigException - - - - - - +message: String? - - - - - - - - - - - - IFormViewModelDelegate - - - - - - +dynamic onSave() - +void onCancel() - - - - - - - - - - - - FormControlOption - - - - - - +value: T - +label: String - +description: String? - +props: List<Object?> - - - - - - - - - - - Equatable - - - - - - - - - - - - FormMode - - - - - - +index: int - <static>+values: List<FormMode> - <static>+create: FormMode - <static>+readonly: FormMode - <static>+edit: FormMode - - - - - - - - - - - CancelableOperation - - - - - - - - - - - - - EnrolledBadge - - - - - - +enrolledCount: int - - - - - - +Widget build() - - - - - - - - - - - - - StudyRecruitController - - - - - - +inviteCodeRepository: IInviteCodeRepository - -_invitesSubscription: StreamSubscription<List<WrappedModel<StudyInvite>>>? - - - - - - -dynamic _subscribeInvites() - +Intervention? getIntervention() - +int getParticipantCountForInvite() - +List<ModelAction<dynamic>> availableActions() - +List<ModelAction<dynamic>> availableInlineActions() - +void dispose() - - - - - - - - - - - IInviteCodeRepository - - - - - - - - - - - StreamSubscription - - - - - - - - - - - - - StudyBaseController - - - - - - +studyId: String - +studyRepository: IStudyRepository - +router: GoRouter - +studySubscription: StreamSubscription<WrappedModel<Study>>? - - - - - - +dynamic subscribeStudy() - +dynamic onStudySubscriptionUpdate() - +dynamic onStudySubscriptionError() - +void dispose() - - - - - - - - - - - IModelActionProvider - - - - - - - - - - - - StudyRecruitScreen - - - - - - +Widget build() - -Widget _inviteCodesSectionHeader() - -Widget _newInviteCodeButton() - -dynamic _onSelectInvite() - - - - - - - - - - - - - InviteCodeFormView - - - - - - +formViewModel: InviteCodeFormViewModel - - - - - - +Widget build() - -List<FormTableRow> _conditionalInterventionRows() - - - - - - - - - - - - - InviteCodeFormViewModel - - - - - - +study: Study - +inviteCodeRepository: IInviteCodeRepository - +codeControl: FormControl<String> - +codeControlValidationMessages: Map<String, String Function(dynamic)> - +isPreconfiguredScheduleControl: FormControl<bool> - +preconfiguredScheduleTypeControl: FormControl<PhaseSequence> - +interventionAControl: FormControl<String> - +interventionBControl: FormControl<String> - +form: FormGroup - +titles: Map<FormMode, String> - +interventionControlOptions: List<FormControlOption<String>> - +preconfiguredScheduleTypeOptions: List<FormControlOption<PhaseSequence>> - +isPreconfiguredSchedule: bool - +preconfiguredSchedule: List<String>? - - - - - - +void initControls() - -dynamic _uniqueInviteCode() - +void regenerateCode() - -String _generateCode() - +StudyInvite buildFormData() - +void setControlsFrom() - +dynamic save() - - - - - - - - - - - FormConsumerWidget - - - - - - - - - - - - - StudyInvitesTable - - - - - - +invites: List<StudyInvite> - +onSelect: void Function(StudyInvite) - +getActions: List<ModelAction<dynamic>> Function(StudyInvite) - +getInlineActions: List<ModelAction<dynamic>> Function(StudyInvite) - +getIntervention: Intervention? Function(String) - +getParticipantCountForInvite: int Function(StudyInvite) - - - - - - +Widget build() - -List<Widget> _buildRow() - - - - - - - - - - - void Function(StudyInvite) - - - - - - - - - - - List<ModelAction<dynamic>> Function(StudyInvite) - - - - - - - - - - - Intervention? Function(String) - - - - - - - - - - - int Function(StudyInvite) - - - - - - - - - - - Study - - - - - - - - - - - - PublishSuccessDialog - - - - - - +Widget build() - - - - - - - - - - - - PublishDialog - - - - - - +Widget build() - - - - - - - - - - - - PublishConfirmationDialog - - - - - - +Widget build() - - - - - - - - - - - - - FrameControlsWidget - - - - - - +onRefresh: void Function()? - +onOpenNewTab: void Function()? - +enabled: bool - - - - - - +Widget build() - - - - - - - - - - - ConsumerWidget - - - - - - - - - - - - IStudyStatusBadgeViewModel - - - - - - +studyParticipation: Participation? - +studyStatus: StudyStatus? - - - - - - - - - - - Participation - - - - - - - - - - - StudyStatus - - - - - - - - - - - - - StudyStatusBadge - - - - - - +participation: Participation? - +status: StudyStatus? - +type: BadgeType - +showPrefixIcon: bool - +showTooltip: bool - - - - - - +Widget build() - - - - - - - - - - - BadgeType - - - - - - - - - - - - - RouteInformation - - - - - - +route: String? - +extra: String? - +cmd: String? - +data: String? - - - - - - +String toString() - - - - - - - - - - - - - PlatformController - - - - - - +studyId: String - +baseSrc: String - +previewSrc: String - +routeInformation: RouteInformation - +frameWidget: Widget - - - - - - +void activate() - +void registerViews() - +void generateUrl() - +void navigate() - +void refresh() - +void listen() - +void send() - +void openNewPage() - - - - - - - - - - - - - WebController - - - - - - +iFrameElement: IFrameElement - - - - - - +void activate() - +void registerViews() - +void generateUrl() - +void navigate() - +void refresh() - +void openNewPage() - +void listen() - +void send() - - - - - - - - - - - IFrameElement - - - - - - - - - - - - MobileController - - - - - - +void openNewPage() - +void refresh() - +void registerViews() - +void listen() - +void send() - +void navigate() - +void activate() - +void generateUrl() - - - - - - - - - - - - - StudyController - - - - - - +notificationService: INotificationService - +studyEventsSubscription: StreamSubscription<ModelEvent<Study>>? - +studyActions: List<ModelAction<dynamic>> - - - - - - +dynamic syncStudyStatus() - +dynamic onStudySubscriptionUpdate() - -dynamic _redirectNewToActualStudyID() - +dynamic publishStudy() - +void onChangeStudyParticipation() - +void onAddParticipants() - +void onSettingsPressed() - +void dispose() - - - - - - - - - - - - IStudyNavViewModel - - - - - - +isEditTabEnabled: bool - +isTestTabEnabled: bool - +isRecruitTabEnabled: bool - +isMonitorTabEnabled: bool - +isAnalyzeTabEnabled: bool - +isSettingsEnabled: bool - - - - - - - - - - - - StudyNav - - - - - - <static>+dynamic tabs() - <static>+dynamic edit() - <static>+dynamic test() - <static>+dynamic recruit() - <static>+dynamic monitor() - <static>+dynamic analyze() - - - - - - - - - - - - StudyDesignNav - - - - - - <static>+dynamic tabs() - <static>+dynamic info() - <static>+dynamic enrollment() - <static>+dynamic interventions() - <static>+dynamic measurements() - <static>+dynamic reports() - - - - - - - - - - - IWithBanner - - - - - - - - - - - - - StudyParticipationBadge - - - - - - +participation: Participation - +type: BadgeType - +showPrefixIcon: bool - +center: bool - - - - - - +Widget build() - - - - - - - - - - - IStudyRepository - - - - - - - - - - - - PreviewFrame - - - - - - +studyId: String - +routeArgs: StudyFormRouteArgs? - +route: String? - - - - - - - - - - - StudyFormRouteArgs - - - - - - - - - - - - IStudyAppBarViewModel - - - - - - +isSyncIndicatorVisible: bool - +isStatusBadgeVisible: bool - +isPublishVisible: bool - - - - - - - - - - - - StudyScaffold - - - - - - +studyId: String - +tabs: List<NavbarTab>? - +tabsSubnav: List<NavbarTab>? - +selectedTab: NavbarTab? - +selectedTabSubnav: NavbarTab? - +body: StudyPageWidget - +drawer: Widget? - +disableActions: bool - +actionsSpacing: double - +actionsPadding: double - +layoutType: SingleColumnLayoutType? - +appbarHeight: double - +appbarSubnavHeight: double - - - - - - - - - - - NavbarTab - - - - - - - - - - - SingleColumnLayoutType - - - - - - - - - - - - - WebFrame - - - - - - +previewSrc: String - +studyId: String - - - - - - +Widget build() - - - - - - - - - - - - DisabledFrame - - - - - - +Widget build() - - - - - - - - - - - - - PhoneContainer - - - - - - <static>+defaultWidth: double - <static>+defaultHeight: double - +width: double - +height: double - +borderColor: Color - +borderWidth: double - +borderRadius: double - +innerContent: Widget - +innerContentBackgroundColor: Color? - - - - - - +Widget build() - - - - - - - - - - - Color - - - - - - - - - - - - MobileFrame - - - - - - +Widget build() - - - - - - - - - - - - DesktopFrame - - - - - - +Widget build() - - - - - - - - - - - - - StudyTestScreen - - - - - - +previewRoute: String? - - - - - - +Widget build() - +Widget? banner() - +dynamic load() - +dynamic save() - +dynamic showHelp() - - - - - - - - - - - - - StudySettingsFormViewModel - - - - - - +study: AsyncValue<Study> - +studyRepository: IStudyRepository - <static>+defaultPublishedToRegistry: bool - <static>+defaultPublishedToRegistryResults: bool - +isPublishedToRegistryControl: FormControl<bool> - +isPublishedToRegistryResultsControl: FormControl<bool> - +form: FormGroup - +titles: Map<FormMode, String> - - - - - - +void setControlsFrom() - +Study buildFormData() - +dynamic keepControlsSynced() - +dynamic save() - +dynamic setLaunchDefaults() - - - - - - - - - - - AsyncValue - - - - - - - - - - - - StudySettingsDialog - - - - - - +Widget build() - - - - - - - - - - - - StudyTestController - - - - - - +authRepository: IAuthRepository - +languageCode: String - - - - - - - - - - - - TestAppRoutes - - - - - - <static>+studyOverview: String - <static>+eligibility: String - <static>+intervention: String - <static>+consent: String - <static>+journey: String - <static>+dashboard: String - - - - - - - - - - - - - DrawerEntry - - - - - - +localizedTitle: String Function() - +icon: IconData? - +localizedHelpText: String Function()? - +enabled: bool - +onSelected: void Function(BuildContext, WidgetRef)? - +autoCloseDrawer: bool - +title: String - +helpText: String? - - - - - - +void onClick() - - - - - - - - - - - String Function() - - - - - - - - - - - String Function()? - - - - - - - - - - - void Function(BuildContext, WidgetRef)? - - - - - - - - - - - - - GoRouterDrawerEntry - - - - - - +intent: RoutingIntent - +onNavigated: void Function()? - - - - - - +void onClick() - - - - - - - - - - - RoutingIntent - - - - - - - - - - - - AppDrawer - - - - - - +width: int - +autoCloseDrawer: bool - +leftPaddingEntries: double - +logoPaddingVertical: double - +logoPaddingHorizontal: double - +logoMaxHeight: double - +logoSectionMinHeight: double - +logoSectionMaxHeight: double - - - - - - - - - - - - StudyAnalyzeScreen - - - - - - +Widget? banner() - +Widget build() - - - - - - - - - - - - StudyAnalyzeController - - - - - - +dynamic onExport() - - - - - - - - - - - - StudyDesignInterventionsFormView - - - - - - +Widget build() - - - - - - - - - - - - StudyDesignPageWidget - - - - - - +Widget? banner() - - - - - - - - - - - - InterventionFormView - - - - - - +formViewModel: InterventionFormViewModel - - - - - - - - - - - - - InterventionFormViewModel - - - - - - +study: Study - +interventionIdControl: FormControl<String> - +interventionTitleControl: FormControl<String> - +interventionIconControl: FormControl<IconOption> - +interventionDescriptionControl: FormControl<String> - +interventionTasksArray: FormArray<dynamic> - +tasksCollection: FormViewModelCollection<InterventionTaskFormViewModel, InterventionTaskFormData> - +form: FormGroup - +interventionId: String - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titleRequired: dynamic - +atLeastOneTask: dynamic - +breadcrumbsTitle: String - +titles: Map<FormMode, String> - - - - - - +void setControlsFrom() - +InterventionFormData buildFormData() - +List<ModelAction<dynamic>> availableActions() - +List<ModelAction<dynamic>> availablePopupActions() - +List<ModelAction<dynamic>> availableInlineActions() - +void onSelectItem() - +void onNewItem() - +void onCancel() - +dynamic onSave() - +InterventionTaskFormViewModel provide() - +InterventionTaskFormRouteArgs buildNewFormRouteArgs() - +InterventionTaskFormRouteArgs buildFormRouteArgs() - +InterventionFormViewModel createDuplicate() - - - - - - - - - - - - - InterventionPreview - - - - - - +routeArgs: InterventionFormRouteArgs - - - - - - +Widget build() - - - - - - - - - - - InterventionFormRouteArgs - - - - - - - - - - - - - StudyScheduleFormView - - - - - - +formViewModel: StudyScheduleControls - - - - - - -FormTableRow _renderCustomSequence() - +Widget build() - - - - - - - - - - - - - StudyScheduleControls - - - - - - <static>+defaultScheduleType: PhaseSequence - <static>+defaultScheduleTypeSequence: String - <static>+defaultNumCycles: int - <static>+defaultPeriodLength: int - +sequenceTypeControl: FormControl<PhaseSequence> - +sequenceTypeCustomControl: FormControl<String> - +phaseDurationControl: FormControl<int> - +numCyclesControl: FormControl<int> - +includeBaselineControl: FormControl<bool> - +studyScheduleControls: Map<String, FormControl<Object>> - <static>+kNumCyclesMin: int - <static>+kNumCyclesMax: int - <static>+kPhaseDurationMin: int - <static>+kPhaseDurationMax: int - +sequenceTypeControlOptions: List<FormControlOption<PhaseSequence>> - +studyScheduleValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +numCyclesRange: dynamic - +phaseDurationRange: dynamic - +customSequenceRequired: dynamic - - - - - - +void setStudyScheduleControlsFrom() - +StudyScheduleFormData buildStudyScheduleFormData() - +bool isSequencingCustom() - - - - - - - - - - - - - InterventionTaskFormData - - - - - - +taskId: String - +taskTitle: String - +taskDescription: String? - <static>+kDefaultTitle: String - +id: String - - - - - - +CheckmarkTask toTask() - +InterventionTaskFormData copy() - - - - - - - - - - - - - IFormDataWithSchedule - - - - - - +instanceId: String - +isTimeLocked: bool - +timeLockStart: StudyUTimeOfDay? - +timeLockEnd: StudyUTimeOfDay? - +hasReminder: bool - +reminderTime: StudyUTimeOfDay? - - - - - - +Schedule toSchedule() - - - - - - - - - - - - - InterventionsFormViewModel - - - - - - +study: Study - +router: GoRouter - +interventionsArray: FormArray<dynamic> - +interventionsCollection: FormViewModelCollection<InterventionFormViewModel, InterventionFormData> - +form: FormGroup - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +interventionsRequired: dynamic - +titles: Map<FormMode, String> - +canTestStudySchedule: bool - - - - - - +void setControlsFrom() - +InterventionsFormData buildFormData() - +void read() - +List<ModelAction<dynamic>> availableActions() - +List<ModelAction<dynamic>> availablePopupActions() - +List<ModelAction<dynamic>> availableInlineActions() - +void onSelectItem() - +void onNewItem() - +InterventionFormViewModel provide() - +void onCancel() - +dynamic onSave() - +dynamic testStudySchedule() - - - - - - - - - - - IListActionProvider - - - - - - - - - - - IProviderArgsResolver - - - - - - - - - - - - - InterventionTaskFormViewModel - - - - - - +taskIdControl: FormControl<String> - +instanceIdControl: FormControl<String> - +taskTitleControl: FormControl<String> - +taskDescriptionControl: FormControl<String> - +markAsCompletedControl: FormControl<bool> - +form: FormGroup - +taskId: String - +instanceId: String - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titleRequired: dynamic - +titles: Map<FormMode, String> - - - - - - +void setControlsFrom() - +InterventionTaskFormData buildFormData() - +InterventionTaskFormViewModel createDuplicate() - - - - - - - - - - - - - WithScheduleControls - - - - - - +isTimeRestrictedControl: FormControl<bool> - +instanceID: FormControl<String> - +restrictedTimeStartControl: FormControl<Time> - +restrictedTimeStartPickerControl: FormControl<TimeOfDay> - +restrictedTimeEndControl: FormControl<Time> - +restrictedTimeEndPickerControl: FormControl<TimeOfDay> - +hasReminderControl: FormControl<bool> - +reminderTimeControl: FormControl<Time> - +reminderTimePickerControl: FormControl<TimeOfDay> - -_reminderControlStream: StreamSubscription<dynamic>? - +scheduleFormControls: Map<String, FormControl<Object>> - +hasReminder: bool - +isTimeRestricted: bool - +timeRestriction: List<Time>? - - - - - - +void setScheduleControlsFrom() - -dynamic _initReminderControl() - - - - - - - - - - - PhaseSequence - - - - - - - - - - - - - InterventionFormData - - - - - - +interventionId: String - +title: String - +description: String? - +tasksData: List<InterventionTaskFormData>? - +iconName: String? - <static>+kDefaultTitle: String - +id: String - - - - - - +Intervention toIntervention() - +InterventionFormData copy() - - - - - - - - - - - - - StudyScheduleFormData - - - - - - +sequenceType: PhaseSequence - +sequenceTypeCustom: String - +numCycles: int - +phaseDuration: int - +includeBaseline: bool - +id: String - - - - - - +StudySchedule toStudySchedule() - +Study apply() - +StudyScheduleFormData copy() - - - - - - - - - - - - IStudyFormData - - - - - - +Study apply() - - - - - - - - - - - - InterventionTaskFormView - - - - - - +formViewModel: InterventionTaskFormViewModel - - - - - - - - - - - - - InterventionsFormData - - - - - - +interventionsData: List<InterventionFormData> - +studyScheduleData: StudyScheduleFormData - +id: String - - - - - - +Study apply() - +InterventionsFormData copy() - - - - - - - - - - - - StudyDesignReportsFormView - - - - - - +Widget build() - -dynamic _showReportItemSidesheetWithArgs() - - - - - - - - - - - - - ReportItemFormData - - - - - - +isPrimary: bool - +section: ReportSection - +id: String - - - - - - <static>+dynamic fromDomainModel() - +ReportItemFormData copy() - - - - - - - - - - - ReportSection - - - - - - - - - - - - - DataReferenceEditor - - - - - - +formControl: FormControl<DataReferenceIdentifier<T>> - +availableTasks: List<Task> - +buildReactiveDropdownField: ReactiveDropdownField<dynamic> - - - - - - +FormTableRow buildFormTableRow() - -List<DropdownMenuItem<DataReferenceIdentifier<dynamic>>> _dataReferenceItems() - - - - - - - - - - - ReactiveDropdownField - - - - - - - - - - - - - TemporalAggregationFormatted - - - - - - -_value: TemporalAggregation - <static>+values: List<TemporalAggregationFormatted> - +value: TemporalAggregation - +string: String - +icon: IconData? - +hashCode: int - - - - - - +bool ==() - +String toString() - +String toJson() - <static>+TemporalAggregationFormatted fromJson() - - - - - - - - - - - TemporalAggregation - - - - - - - - - - - - - ImprovementDirectionFormatted - - - - - - -_value: ImprovementDirection - <static>+values: List<ImprovementDirectionFormatted> - +value: ImprovementDirection - +string: String - +icon: IconData? - +hashCode: int - - - - - - +bool ==() - +String toString() - +String toJson() - <static>+ImprovementDirectionFormatted fromJson() - - - - - - - - - - - ImprovementDirection - - - - - - - - - - - - ReportSectionType - - - - - - +index: int - <static>+values: List<ReportSectionType> - <static>+average: ReportSectionType - <static>+linearRegression: ReportSectionType - - - - - - - - - - - - - AverageSectionFormView - - - - - - +formViewModel: ReportItemFormViewModel - +studyId: String - +reportSectionColumnWidth: Map<int, TableColumnWidth> - - - - - - +Widget build() - - - - - - - - - - - - - ReportItemFormViewModel - - - - - - <static>+defaultSectionType: ReportSectionType - +sectionIdControl: FormControl<String> - +sectionTypeControl: FormControl<ReportSectionType> - +titleControl: FormControl<String> - +descriptionControl: FormControl<String> - +sectionControl: FormControl<ReportSection> - +dataReferenceControl: FormControl<DataReferenceIdentifier<num>> - +temporalAggregationControl: FormControl<TemporalAggregationFormatted> - +improvementDirectionControl: FormControl<ImprovementDirectionFormatted> - +alphaControl: FormControl<double> - -_controlsBySectionType: Map<ReportSectionType, FormGroup> - -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - -_validationConfigsBySectionType: Map<ReportSectionType, Map<FormValidationSetEnum, List<FormControlValidation>>> - +sectionBaseControls: Map<String, AbstractControl<dynamic>> - +form: FormGroup - +sectionId: String - +sectionType: ReportSectionType - <static>+sectionTypeControlOptions: List<FormControlOption<ReportSectionType>> - <static>+temporalAggregationControlOptions: List<FormControlOption<TemporalAggregationFormatted>> - <static>+improvementDirectionControlOptions: List<FormControlOption<ImprovementDirectionFormatted>> - +titles: Map<FormMode, String> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titleRequired: dynamic - +descriptionRequired: dynamic - +dataReferenceRequired: dynamic - +aggregationRequired: dynamic - +improvementDirectionRequired: dynamic - +alphaConfidenceRequired: dynamic - - - - - - -List<FormControlValidation> _getValidationConfig() - +ReportItemFormData buildFormData() - +ReportItemFormViewModel createDuplicate() - +dynamic onSectionTypeChanged() - -void _updateFormControls() - +void setControlsFrom() - - - - - - - - - - - - - DataReferenceIdentifier - - - - - - +hashCode: int - - - - - - +bool ==() - - - - - - - - - - - DataReference - - - - - - - - - - - - - LinearRegressionSectionFormView - - - - - - +formViewModel: ReportItemFormViewModel - +studyId: String - +reportSectionColumnWidth: Map<int, TableColumnWidth> - - - - - - +Widget build() - - - - - - - - - - - - - ReportItemFormView - - - - - - +formViewModel: ReportItemFormViewModel - +studyId: String - +reportSectionColumnWidth: dynamic - +sectionTypeBodyBuilder: Widget Function(BuildContext) - - - - - - +Widget build() - -dynamic _buildSectionText() - -dynamic _buildSectionTypeHeader() - - - - - - - - - - - Widget Function(BuildContext) - - - - - - - - - - - - - ReportsFormViewModel - - - - - - +study: Study - +router: GoRouter - +reportItemDelegate: ReportFormItemDelegate - +reportItemArray: FormArray<dynamic> - +reportItemFormViewModels: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData> - +form: FormGroup - +reportItemModels: List<ReportItemFormViewModel> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titles: Map<FormMode, String> - +canTestConsent: bool - - - - - - +void setControlsFrom() - +ReportsFormData buildFormData() - +void read() - +ReportItemFormRouteArgs buildNewReportItemFormRouteArgs() - +ReportItemFormRouteArgs buildReportItemFormRouteArgs() - +dynamic testReport() - +void onCancel() - +dynamic onSave() - +ReportItemFormViewModel provide() - - - - - - - - - - - - - ReportFormItemDelegate - - - - - - +formViewModelCollection: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData> - +owner: ReportsFormViewModel - +propagateOnSave: bool - +validationSet: dynamic - - - - - - +void onCancel() - +dynamic onSave() - +ReportItemFormViewModel provide() - +List<ModelAction<dynamic>> availableActions() - +void onNewItem() - +void onSelectItem() - - - - - - - - - - - - - ReportBadge - - - - - - +status: ReportStatus? - +type: BadgeType - +showPrefixIcon: bool - +showTooltip: bool - - - - - - +Widget build() - - - - - - - - - - - - ReportStatus - - - - - - +index: int - <static>+values: List<ReportStatus> - <static>+primary: ReportStatus - <static>+secondary: ReportStatus - - - - - - - - - - - - - ReportsFormData - - - - - - +reportItems: List<ReportItemFormData> - +id: String - - - - - - +Study apply() - +ReportsFormData copy() - - - - - - - - - - - - - StudyInfoFormViewModel - - - - - - +study: Study - +titleControl: FormControl<String> - +iconControl: FormControl<IconOption> - +descriptionControl: FormControl<String> - +organizationControl: FormControl<String> - +reviewBoardControl: FormControl<String> - +reviewBoardNumberControl: FormControl<String> - +researchersControl: FormControl<String> - +emailControl: FormControl<String> - +websiteControl: FormControl<String> - +phoneControl: FormControl<String> - +additionalInfoControl: FormControl<String> - +form: FormGroup - +titles: Map<FormMode, String> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titleRequired: dynamic - +descriptionRequired: dynamic - +iconRequired: dynamic - +organizationRequired: dynamic - +reviewBoardRequired: dynamic - +reviewBoardNumberRequired: dynamic - +researchersRequired: dynamic - +emailRequired: dynamic - +phoneRequired: dynamic - +emailFormat: dynamic - +websiteFormat: dynamic - - - - - - +void setControlsFrom() - +StudyInfoFormData buildFormData() - - - - - - - - - - - - StudyDesignInfoFormView - - - - - - +Widget build() - - - - - - - - - - - - - StudyInfoFormData - - - - - - +title: String - +description: String? - +iconName: String - +contactInfoFormData: StudyContactInfoFormData - +id: String - - - - - - +Study apply() - +StudyInfoFormData copy() - - - - - - - - - - - - - StudyContactInfoFormData - - - - - - +organization: String? - +institutionalReviewBoard: String? - +institutionalReviewBoardNumber: String? - +researchers: String? - +email: String? - +website: String? - +phone: String? - +additionalInfo: String? - +id: String - - - - - - +Study apply() - +StudyInfoFormData copy() - - - - - - - - - - - - StudyFormValidationSet - - - - - - +index: int - <static>+values: List<StudyFormValidationSet> - - - - - - - - - - - - - MeasurementsFormData - - - - - - +surveyMeasurements: List<MeasurementSurveyFormData> - +id: String - - - - - - +Study apply() - +MeasurementsFormData copy() - - - - - - - - - - - - MeasurementSurveyFormView - - - - - - +formViewModel: MeasurementSurveyFormViewModel - - - - - - - - - - - - - MeasurementSurveyFormViewModel - - - - - - +study: Study - +measurementIdControl: FormControl<String> - +instanceIdControl: FormControl<String> - +surveyTitleControl: FormControl<String> - +surveyIntroTextControl: FormControl<String> - +surveyOutroTextControl: FormControl<String> - +form: FormGroup - +measurementId: String - +instanceId: String - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titleRequired: dynamic - +atLeastOneQuestion: dynamic - +breadcrumbsTitle: String - +titles: Map<FormMode, String> - - - - - - +void setControlsFrom() - +MeasurementSurveyFormData buildFormData() - +List<ModelAction<dynamic>> availableActions() - +List<ModelAction<dynamic>> availablePopupActions() - +List<ModelAction<dynamic>> availableInlineActions() - +void onSelectItem() - +void onNewItem() - +SurveyQuestionFormRouteArgs buildNewFormRouteArgs() - +SurveyQuestionFormRouteArgs buildFormRouteArgs() - +MeasurementSurveyFormViewModel createDuplicate() - - - - - - - - - - - - - SurveyPreview - - - - - - +routeArgs: MeasurementFormRouteArgs - - - - - - +Widget build() - - - - - - - - - - - MeasurementFormRouteArgs - - - - - - - - - - - - - MeasurementSurveyFormData - - - - - - +measurementId: String - +title: String - +introText: String? - +outroText: String? - +questionnaireFormData: QuestionnaireFormData - <static>+kDefaultTitle: String - +id: String - - - - - - +QuestionnaireTask toQuestionnaireTask() - +MeasurementSurveyFormData copy() - - - - - - - - - - - - - QuestionnaireFormData - - - - - - +questionsData: List<QuestionFormData>? - +id: String - - - - - - +StudyUQuestionnaire toQuestionnaire() - +List<EligibilityCriterion> toEligibilityCriteria() - +QuestionnaireFormData copy() - - - - - - - - - - - - - WithQuestionnaireControls - - - - - - +questionsArray: FormArray<dynamic> - +questionFormViewModels: FormViewModelCollection<Q, QuestionFormData> - +questionnaireControls: Map<String, FormArray<dynamic>> - +propagateOnSave: bool - +questionModels: List<Q> - +questionTitles: Map<FormMode, String Function()> - - - - - - +void setQuestionnaireControlsFrom() - +QuestionnaireFormData buildQuestionnaireFormData() - +void read() - +void onCancel() - +dynamic onSave() - +Q provide() - +Q provideQuestionFormViewModel() - - - - - - - - - - - - StudyDesignMeasurementsFormView - - - - - - +Widget build() - - - - - - - - - - - - - MeasurementsFormViewModel - - - - - - +study: Study - +router: GoRouter - +measurementsArray: FormArray<dynamic> - +surveyMeasurementFormViewModels: FormViewModelCollection<MeasurementSurveyFormViewModel, MeasurementSurveyFormData> - +form: FormGroup - +measurementViewModels: List<MeasurementSurveyFormViewModel> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +measurementRequired: dynamic - +titles: Map<FormMode, String> - - - - - - +void read() - +void setControlsFrom() - +MeasurementsFormData buildFormData() - +List<ModelAction<dynamic>> availableActions() - +List<ModelAction<dynamic>> availablePopupActions() - +List<ModelAction<dynamic>> availableInlineActions() - +void onSelectItem() - +void onNewItem() - +MeasurementSurveyFormViewModel provide() - +void onCancel() - +dynamic onSave() - - - - - - - - - - - - - StudyFormScaffold - - - - - - +studyId: String - +formViewModelBuilder: T Function(WidgetRef) - +formViewBuilder: Widget Function(T) - - - - - - +Widget build() - - - - - - - - - - - T Function(WidgetRef) - - - - - - - - - - - Widget Function(T) - - - - - - - - - - - - - ConsentItemFormViewModel - - - - - - +consentIdControl: FormControl<String> - +titleControl: FormControl<String> - +descriptionControl: FormControl<String> - +iconControl: FormControl<IconOption> - +form: FormGroup - +consentId: String - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titleRequired: dynamic - +descriptionRequired: dynamic - +titles: Map<FormMode, String> - - - - - - +void setControlsFrom() - +ConsentItemFormData buildFormData() - +ConsentItemFormViewModel createDuplicate() - - - - - - - - - - - - StudyDesignEnrollmentFormView - - - - - - +Widget build() - -dynamic _showScreenerQuestionSidesheetWithArgs() - -dynamic _showConsentItemSidesheetWithArgs() - - - - - - - - - - - - IScreenerQuestionLogicFormViewModel - - - - - - +isDirtyOptionsBannerVisible: bool - - - - - - - - - - - - - ScreenerQuestionLogicFormView - - - - - - +formViewModel: ScreenerQuestionFormViewModel - - - - - - +Widget build() - -dynamic _buildInfoBanner() - -dynamic _buildAnswerOptionsLogicControls() - -List<Widget> _buildOptionLogicRow() - - - - - - - - - - - - - ScreenerQuestionFormViewModel - - - - - - <static>+defaultResponseOptionValidity: bool - +responseOptionsDisabledArray: FormArray<dynamic> - +responseOptionsLogicControls: FormArray<bool> - +responseOptionsLogicDescriptionControls: FormArray<String> - -_questionBaseControls: Map<String, AbstractControl<dynamic>> - +prevResponseOptionControls: List<AbstractControl<dynamic>> - +prevResponseOptionValues: List<dynamic> - +responseOptionsDisabledControls: List<AbstractControl<dynamic>> - +logicControlOptions: List<FormControlOption<bool>> - +questionBaseControls: Map<String, AbstractControl<dynamic>> - +isDirtyOptionsBannerVisible: bool - - - - - - +dynamic onResponseOptionsChanged() - +void setControlsFrom() - +QuestionFormData buildFormData() - -List<FormControl<dynamic>> _copyFormControls() - -AbstractControl<dynamic>? _findAssociatedLogicControlFor() - -AbstractControl<dynamic>? _findAssociatedControlFor() - +ScreenerQuestionFormViewModel createDuplicate() - - - - - - - - - - - - - ConsentItemFormData - - - - - - +consentId: String - +title: String - +description: String - +iconName: String? - +id: String - - - - - - +ConsentItem toConsentItem() - +ConsentItemFormData copy() - - - - - - - - - - - - ConsentItemFormView - - - - - - +formViewModel: ConsentItemFormViewModel - - - - - - - - - - - - - EnrollmentFormData - - - - - - <static>+kDefaultEnrollmentType: Participation - +enrollmentType: Participation - +questionnaireFormData: QuestionnaireFormData - +consentItemsFormData: List<ConsentItemFormData>? - +id: String - - - - - - +Study apply() - +EnrollmentFormData copy() - - - - - - - - - - - - - QuestionFormViewModel - - - - - - <static>+defaultQuestionType: SurveyQuestionType - -_titles: Map<FormMode, String Function()>? - +questionIdControl: FormControl<String> - +questionTypeControl: FormControl<SurveyQuestionType> - +questionTextControl: FormControl<String> - +questionInfoTextControl: FormControl<String> - +questionBaseControls: Map<String, AbstractControl<dynamic>> - +isMultipleChoiceControl: FormControl<bool> - +choiceResponseOptionsArray: FormArray<dynamic> - +customOptionsMin: int - +customOptionsMax: int - +customOptionsInitial: int - +boolResponseOptionsArray: FormArray<String> - +imageResponseOptionsArray: FormArray<String> - <static>+kDefaultMaxRecordingDurationSeconds: int - <static>+kMaxRecordingDurationSeconds: int - +audioResponseOptionsArray: FormArray<String> - +maxRecordingDurationSecondsControl: FormControl<int> - <static>+kDefaultScaleMinValue: int - <static>+kDefaultScaleMaxValue: int - <static>+kNumMidValueControls: int - <static>+kMidValueDebounceMilliseconds: int - +scaleMinValueControl: FormControl<int> - +scaleMaxValueControl: FormControl<int> - -_scaleRangeControl: FormControl<int> - +scaleMinLabelControl: FormControl<String> - +scaleMaxLabelControl: FormControl<String> - +scaleMidValueControls: FormArray<int> - +scaleMidLabelControls: FormArray<String?> - -_scaleResponseOptionsArray: FormArray<int> - +scaleMinColorControl: FormControl<SerializableColor> - +scaleMaxColorControl: FormControl<SerializableColor> - +prevMidValues: List<int?>? - +freeTextTypeControl: FormControl<FreeTextQuestionType> - +customRegexControl: FormControl<String> - +freeTextResponseOptionsArray: FormArray<dynamic> - +freeTextLengthMin: AbstractControl<int> - +freeTextLengthMax: AbstractControl<int> - +freeTextExampleTextControl: FormControl<String> - <static>+kDefaultFreeTextMinLength: int - <static>+kDefaultFreeTextMaxLength: int - +freeTextLengthControl: FormControl<RangeValues> - -_controlsByQuestionType: Map<SurveyQuestionType, FormGroup> - -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - -_validationConfigsByQuestionType: Map<SurveyQuestionType, Map<FormValidationSetEnum, List<FormControlValidation>>> - +form: FormGroup - +questionId: String - +questionType: SurveyQuestionType - +questionTypeControlOptions: List<FormControlOption<SurveyQuestionType>> - +answerOptionsArray: FormArray<dynamic> - +answerOptionsControls: List<AbstractControl<dynamic>> - +validAnswerOptions: List<String> - +boolOptions: List<AbstractControl<String>> - +imageOptions: List<AbstractControl<String>> - +audioOptions: List<AbstractControl<String>> - +scaleMinValue: int - +scaleMaxValue: int - +scaleRange: int - +scaleAllValueControls: List<AbstractControl<int>> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +questionTextRequired: dynamic - +numValidChoiceOptions: dynamic - +scaleRangeValid: dynamic - +maxRecordingDurationValid: dynamic - +titles: Map<FormMode, String> - +isAddOptionButtonVisible: bool - +isMidValuesClearedInfoVisible: bool - - - - - - +String? scaleMidLabelAt() - -dynamic _onScaleRangeChanged() - -dynamic _applyInputFormatters() - -dynamic _updateScaleMidValueControls() - -Map<String, dynamic>? _validateFreeText() - -dynamic _onFreeTextLengthChanged() - -List<FormControlValidation> _getValidationConfig() - +dynamic onQuestionTypeChanged() - +dynamic onResponseOptionsChanged() - -void _updateFormControls() - +void initControls() - +void setControlsFrom() - +QuestionFormData buildFormData() - +List<ModelAction<dynamic>> availableActions() - +void onNewItem() - +void onSelectItem() - +dynamic save() - +QuestionFormViewModel createDuplicate() - - - - - - - - - - - - - EnrollmentFormViewModel - - - - - - +study: Study - +router: GoRouter - +consentItemDelegate: EnrollmentFormConsentItemDelegate - +enrollmentTypeControl: FormControl<Participation> - +consentItemArray: FormArray<dynamic> - +consentItemFormViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData> - +form: FormGroup - +enrollmentTypeControlOptions: List<FormControlOption<Participation>> - +consentItemModels: List<ConsentItemFormViewModel> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titles: Map<FormMode, String> - +canTestScreener: bool - +canTestConsent: bool - +questionTitles: Map<FormMode, String Function()> - - - - - - +void setControlsFrom() - +EnrollmentFormData buildFormData() - +void read() - +List<ModelAction<dynamic>> availableActions() - +List<ModelAction<dynamic>> availablePopupActions() - +List<ModelAction<dynamic>> availableInlineActions() - +void onSelectItem() - +void onNewItem() - +ScreenerQuestionFormRouteArgs buildNewScreenerQuestionFormRouteArgs() - +ScreenerQuestionFormRouteArgs buildScreenerQuestionFormRouteArgs() - +ConsentItemFormRouteArgs buildNewConsentItemFormRouteArgs() - +ConsentItemFormRouteArgs buildConsentItemFormRouteArgs() - +dynamic testScreener() - +dynamic testConsent() - +ScreenerQuestionFormViewModel provideQuestionFormViewModel() - - - - - - - - - - - - - EnrollmentFormConsentItemDelegate - - - - - - +formViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData> - +owner: EnrollmentFormViewModel - +propagateOnSave: bool - +validationSet: dynamic - - - - - - +void onCancel() - +dynamic onSave() - +ConsentItemFormViewModel provide() - +List<ModelAction<dynamic>> availableActions() - +void onNewItem() - +void onSelectItem() - - - - - - - - - - - - - StudyFormViewModel - - - - - - +studyDirtyCopy: Study? - +studyRepository: IStudyRepository - +authRepository: IAuthRepository - +router: GoRouter - +studyInfoFormViewModel: StudyInfoFormViewModel - +enrollmentFormViewModel: EnrollmentFormViewModel - +measurementsFormViewModel: MeasurementsFormViewModel - +reportsFormViewModel: ReportsFormViewModel - +interventionsFormViewModel: InterventionsFormViewModel - +form: FormGroup - +isStudyReadonly: bool - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titles: Map<FormMode, String> - - - - - - +void read() - +void setControlsFrom() - +Study buildFormData() - +void dispose() - +void onCancel() - +dynamic onSave() - -dynamic _applyAndSaveSubform() - - - - - - - - - - - - - QuestionFormData - - - - - - <static>+questionTypeFormDataFactories: Map<SurveyQuestionType, QuestionFormData Function(Question<dynamic>, List<EligibilityCriterion>)> - +questionId: String - +questionText: String - +questionInfoText: String? - +questionType: SurveyQuestionType - +responseOptionsValidity: Map<dynamic, bool> - +responseOptions: List<dynamic> - +id: String - - - - - - +Question<dynamic> toQuestion() - +EligibilityCriterion toEligibilityCriterion() - +Answer<dynamic> constructAnswerFor() - +dynamic setResponseOptionsValidityFrom() - +QuestionFormData copy() - - - - - - - - - - - - SurveyQuestionType - - - - - - +index: int - <static>+values: List<SurveyQuestionType> - <static>+choice: SurveyQuestionType - <static>+bool: SurveyQuestionType - <static>+scale: SurveyQuestionType - <static>+image: SurveyQuestionType - <static>+audio: SurveyQuestionType - <static>+freeText: SurveyQuestionType - - - - - - - - - - - - - ChoiceQuestionFormData - - - - - - +isMultipleChoice: bool - +answerOptions: List<String> - +responseOptions: List<String> - - - - - - +Question<dynamic> toQuestion() - +QuestionFormData copy() - -Choice _buildChoiceForValue() - +Answer<dynamic> constructAnswerFor() - - - - - - - - - - - - - BoolQuestionFormData - - - - - - <static>+kResponseOptions: Map<String, bool> - +responseOptions: List<String> - - - - - - +Question<dynamic> toQuestion() - +BoolQuestionFormData copy() - +Answer<dynamic> constructAnswerFor() - - - - - - - - - - - - - ImageQuestionFormData - - - - - - <static>+kResponseOptions: Map<String, FutureBlobFile> - +responseOptions: List<String> - - - - - - +Question<dynamic> toQuestion() - +ImageQuestionFormData copy() - +Answer<dynamic> constructAnswerFor() - - - - - - - - - - - - - AudioQuestionFormData - - - - - - +maxRecordingDurationSeconds: int - <static>+kResponseOptions: Map<String, FutureBlobFile> - +responseOptions: List<String> - - - - - - +Question<dynamic> toQuestion() - +AudioQuestionFormData copy() - +Answer<dynamic> constructAnswerFor() - - - - - - - - - - - - - ScaleQuestionFormData - - - - - - +minValue: double - +maxValue: double - +minLabel: String? - +maxLabel: String? - +midValues: List<double?> - +midLabels: List<String?> - +stepSize: double - +initialValue: double? - +minColor: Color? - +maxColor: Color? - +responseOptions: List<double> - +midAnnotations: List<Annotation> - - - - - - +ScaleQuestion toQuestion() - +QuestionFormData copy() - +Answer<dynamic> constructAnswerFor() - - - - - - - - - - - - - FreeTextQuestionFormData - - - - - - +textLengthRange: List<int> - +textType: FreeTextQuestionType - +textTypeExpression: String? - +responseOptions: List<String> - - - - - - +Question<dynamic> toQuestion() - +FreeTextQuestionFormData copy() - +Answer<dynamic> constructAnswerFor() - - - - - - - - - - - FreeTextQuestionType - - - - - - - - - - - - - AudioRecordingQuestionFormView - - - - - - +formViewModel: QuestionFormViewModel - - - - - - +Widget build() - - - - - - - - - - - - - FreeTextQuestionFormView - - - - - - +formViewModel: QuestionFormViewModel - +generateLabelHelpTextMap: dynamic - - - - - - +Widget build() - +Widget disableOnReadonly() - +Widget generateRow() - - - - - - - - - - - - - ImageCapturingQuestionFormView - - - - - - +formViewModel: QuestionFormViewModel - - - - - - +Widget build() - - - - - - - - - - - - IScaleQuestionFormViewModel - - - - - - +isMidValuesClearedInfoVisible: bool - - - - - - - - - - - - ScaleQuestionFormView - - - - - - +formViewModel: QuestionFormViewModel - - - - - - - - - - - - - ChoiceQuestionFormView - - - - - - +formViewModel: QuestionFormViewModel - - - - - - +Widget build() - - - - - - - - - - - - - BoolQuestionFormView - - - - - - +formViewModel: QuestionFormViewModel - - - - - - +Widget build() - - - - - - - - - - - - SurveyQuestionFormView - - - - - - +formViewModel: QuestionFormViewModel - +isHtmlStyleable: bool - - - - - - - - - - - StudyUTimeOfDay - - - - - - - - - - - - - ScheduleControls - - - - - - +formViewModel: WithScheduleControls - - - - - - +Widget build() - -List<FormTableRow> _conditionalTimeRestrictions() - - - - - - - - - - - - StudiesTableColumnHeader - - - - - - +title: String - +sortable: bool - +sortAscending: bool - +sortingActive: bool - +onSort: void Function()? - - - - - - - - - - - - DashboardScreen - - - - - - +filter: StudiesFilter? - - - - - - - - - - - - StudiesFilter - - - - - - +index: int - <static>+values: List<StudiesFilter> - - - - - - - - - - - - - DashboardScaffold - - - - - - <static>+compactWidthThreshold: double - +body: Widget - - - - - - +Widget build() - - - - - - - - - - - - - DashboardController - - - - - - +studyRepository: IStudyRepository - +authRepository: IAuthRepository - +userRepository: IUserRepository - +router: GoRouter - -_studiesSubscription: StreamSubscription<List<WrappedModel<Study>>>? - +searchController: SearchController - +isSortAscending: bool - - - - - - -dynamic _subscribeStudies() - +dynamic setSearchText() - +dynamic setStudiesFilter() - +dynamic onSelectStudy() - +dynamic onClickNewStudy() - +dynamic pinStudy() - +dynamic pinOffStudy() - +void setSorting() - +void filterStudies() - +void sortStudies() - +bool isSortingActiveForColumn() - +bool isPinned() - +List<ModelAction<dynamic>> availableActions() - +void dispose() - - - - - - - - - - - IUserRepository - - - - - - - - - - - SearchController - - - - - - - - - - - - - StudiesTableColumnSize - - - - - - +collapsed: bool - +flex: int? - +width: double? - - - - - - +Widget createContainer() - - - - - - - - - - - - - StudiesTable - - - - - - +itemHeight: double - +itemPadding: double - +rowSpacing: double - +columnSpacing: double - +compactWidthThreshold: double - +superCompactWidthThreshold: double - +compactStatTitleThreshold: double - +studies: List<Study> - +onSelect: void Function(Study) - +getActions: List<ModelAction<dynamic>> Function(Study) - +emptyWidget: Widget - +pinnedStudies: Iterable<String> - +dashboardController: DashboardController - - - - - - +Widget build() - -Widget _buildColumnHeader() - - - - - - - - - - - void Function(Study) - - - - - - - - - - - List<ModelAction<dynamic>> Function(Study) - - - - - - - - - - - - StudiesTableColumn - - - - - - +index: int - <static>+values: List<StudiesTableColumn> - <static>+pin: StudiesTableColumn - <static>+title: StudiesTableColumn - <static>+status: StudiesTableColumn - <static>+participation: StudiesTableColumn - <static>+createdAt: StudiesTableColumn - <static>+enrolled: StudiesTableColumn - <static>+active: StudiesTableColumn - <static>+completed: StudiesTableColumn - <static>+action: StudiesTableColumn - - - - - - - - - - - - StudiesTableItem - - - - - - +study: Study - +itemHeight: double - +itemPadding: double - +rowSpacing: double - +columnSpacing: double - +actions: List<ModelAction<dynamic>> - +columnSizes: List<StudiesTableColumnSize> - +isPinned: bool - +onPinnedChanged: void Function(Study, bool)? - +onTap: void Function(Study)? - - - - - - - - - - - void Function(Study, bool)? - - - - - - - - - - - void Function(Study)? - - - - - - - - - - - App - - - - - - - - - - - AppContent - - - - - - - - - - - - AccountSettingsDialog - - - - - - +Widget build() - - - - - - - - - \ No newline at end of file diff --git a/docs/uml/designer_v2/lib/localization/platform_locale/uml.svg b/docs/uml/designer_v2/lib/localization/platform_locale/uml.svg deleted file mode 100644 index d262765fc..000000000 --- a/docs/uml/designer_v2/lib/localization/platform_locale/uml.svg +++ /dev/null @@ -1,95 +0,0 @@ - - [PlatformLocaleWeb - | - +Locale getPlatformLocale() - ] - - [<abstract>PlatformLocale]<:--[PlatformLocaleWeb] - - [<abstract>PlatformLocale - | - +Locale getPlatformLocale() - ] - - [PlatformLocaleMobile - | - +Locale getPlatformLocale() - ] - - [<abstract>PlatformLocale]<:--[PlatformLocaleMobile] - - - - - - - - - - - - - - - - - - - - - - - - - PlatformLocaleWeb - - - - - - +Locale getPlatformLocale() - - - - - - - - - - - - PlatformLocale - - - - - - +Locale getPlatformLocale() - - - - - - - - - - - - PlatformLocaleMobile - - - - - - +Locale getPlatformLocale() - - - - - - - - - \ No newline at end of file diff --git a/docs/uml/designer_v2/lib/localization/uml.svg b/docs/uml/designer_v2/lib/localization/uml.svg deleted file mode 100644 index 8f5009747..000000000 --- a/docs/uml/designer_v2/lib/localization/uml.svg +++ /dev/null @@ -1,234 +0,0 @@ - - [LanguagePicker - | - +languagePickerType: LanguagePickerType; - +iconColor: Color?; - +offset: Offset? - ] - - [LanguagePicker]o-[LanguagePickerType] - [LanguagePicker]o-[Color] - [LanguagePicker]o-[Offset] - - [LanguagePickerType - | - +index: int; - <static>+values: List<LanguagePickerType>; - <static>+field: LanguagePickerType; - <static>+icon: LanguagePickerType - ] - - [LanguagePickerType]o-[LanguagePickerType] - [Enum]<:--[LanguagePickerType] - - [PlatformLocaleMobile - | - +Locale getPlatformLocale() - ] - - [<abstract>PlatformLocale]<:--[PlatformLocaleMobile] - - [<abstract>PlatformLocale - | - +Locale getPlatformLocale() - ] - - [PlatformLocaleWeb - | - +Locale getPlatformLocale() - ] - - [<abstract>PlatformLocale]<:--[PlatformLocaleWeb] - - [AppTranslation - | - <static>+dynamic init() - ] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LanguagePicker - - - - - - +languagePickerType: LanguagePickerType - +iconColor: Color? - +offset: Offset? - - - - - - - - - - - - LanguagePickerType - - - - - - +index: int - <static>+values: List<LanguagePickerType> - <static>+field: LanguagePickerType - <static>+icon: LanguagePickerType - - - - - - - - - - - Color - - - - - - - - - - - Offset - - - - - - - - - - - Enum - - - - - - - - - - - - PlatformLocaleMobile - - - - - - +Locale getPlatformLocale() - - - - - - - - - - - - PlatformLocale - - - - - - +Locale getPlatformLocale() - - - - - - - - - - - - PlatformLocaleWeb - - - - - - +Locale getPlatformLocale() - - - - - - - - - - - - AppTranslation - - - - - - <static>+dynamic init() - - - - - - - - - \ No newline at end of file diff --git a/docs/uml/designer_v2/lib/repositories/uml.svg b/docs/uml/designer_v2/lib/repositories/uml.svg deleted file mode 100644 index 0274e227c..000000000 --- a/docs/uml/designer_v2/lib/repositories/uml.svg +++ /dev/null @@ -1,1725 +0,0 @@ - - [<abstract>StudyUApi - | - +dynamic saveStudy(); - +dynamic fetchStudy(); - +dynamic getUserStudies(); - +dynamic deleteStudy(); - +dynamic saveStudyInvite(); - +dynamic fetchStudyInvite(); - +dynamic deleteStudyInvite(); - +dynamic deleteParticipants(); - +dynamic fetchAppConfig(); - +dynamic fetchUser(); - +dynamic saveUser() - ] - - [APIException - ] - - [Exception]<:--[APIException] - - [StudyNotFoundException - ] - - [APIException]<:-[StudyNotFoundException] - - [MeasurementNotFoundException - ] - - [APIException]<:-[MeasurementNotFoundException] - - [QuestionNotFoundException - ] - - [APIException]<:-[QuestionNotFoundException] - - [ConsentItemNotFoundException - ] - - [APIException]<:-[ConsentItemNotFoundException] - - [InterventionNotFoundException - ] - - [APIException]<:-[InterventionNotFoundException] - - [InterventionTaskNotFoundException - ] - - [APIException]<:-[InterventionTaskNotFoundException] - - [ReportNotFoundException - ] - - [APIException]<:-[ReportNotFoundException] - - [ReportSectionNotFoundException - ] - - [APIException]<:-[ReportSectionNotFoundException] - - [StudyInviteNotFoundException - ] - - [APIException]<:-[StudyInviteNotFoundException] - - [UserNotFoundException - ] - - [APIException]<:-[UserNotFoundException] - - [StudyUApiClient - | - +supabaseClient: SupabaseClient; - <static>+studyColumns: List<String>; - <static>+studyWithParticipantActivityColumns: List<String>; - +testDelayMilliseconds: int - | - +dynamic deleteParticipants(); - +dynamic getUserStudies(); - +dynamic fetchStudy(); - +dynamic deleteStudy(); - +dynamic saveStudy(); - +dynamic fetchStudyInvite(); - +dynamic saveStudyInvite(); - +dynamic deleteStudyInvite(); - +dynamic fetchAppConfig(); - +dynamic fetchUser(); - +dynamic saveUser(); - -dynamic _awaitGuarded(); - -dynamic _apiException(); - -dynamic _testDelay() - ] - - [StudyUApiClient]o-[SupabaseClient] - [<abstract>SupabaseClientDependant]<:-[StudyUApiClient] - [<abstract>SupabaseQueryMixin]<:-[StudyUApiClient] - [<abstract>StudyUApi]<:--[StudyUApiClient] - - [<abstract>IStudyRepository - | - +dynamic launch(); - +dynamic deleteParticipants() - ] - - [<abstract>ModelRepository]<:--[<abstract>IStudyRepository] - - [StudyRepository - | - +apiClient: StudyUApi; - +authRepository: IAuthRepository; - +ref: ProviderRef<dynamic>; - +sortCallback: void Function()? - | - +String getKey(); - +dynamic deleteParticipants(); - +dynamic launch(); - +List<ModelAction<dynamic>> availableActions() - ] - - [StudyRepository]o-[<abstract>StudyUApi] - [StudyRepository]o-[<abstract>IAuthRepository] - [StudyRepository]o-[<abstract>ProviderRef] - [StudyRepository]o-[void Function()?] - [<abstract>ModelRepository]<:-[StudyRepository] - [<abstract>IStudyRepository]<:--[StudyRepository] - - [StudyRepositoryDelegate - | - +apiClient: StudyUApi; - +authRepository: IAuthRepository - | - +dynamic fetchAll(); - +dynamic fetch(); - +dynamic save(); - +dynamic delete(); - +dynamic onError(); - +Study createNewInstance(); - +Study createDuplicate() - ] - - [StudyRepositoryDelegate]o-[<abstract>StudyUApi] - [StudyRepositoryDelegate]o-[<abstract>IAuthRepository] - [<abstract>IModelRepositoryDelegate]<:-[StudyRepositoryDelegate] - - [<abstract>IAppRepository - | - +dynamic fetchAppConfig(); - +void dispose() - ] - - [AppRepository - | - +apiClient: StudyUApi - | - +dynamic fetchAppConfig(); - +void dispose() - ] - - [AppRepository]o-[<abstract>StudyUApi] - [<abstract>IAppRepository]<:--[AppRepository] - - [WrappedModel - | - -_model: T; - +asyncValue: AsyncValue<T>; - +isLocalOnly: bool; - +isDirty: bool; - +isDeleted: bool; - +lastSaved: DateTime?; - +lastFetched: DateTime?; - +lastUpdated: DateTime?; - +model: T - | - +dynamic markWithError(); - +dynamic markAsLoading(); - +dynamic markAsFetched(); - +dynamic markAsSaved() - ] - - [WrappedModel]o-[<abstract>AsyncValue] - - [ModelRepositoryException - ] - - [Exception]<:--[ModelRepositoryException] - - [ModelNotFoundException - ] - - [ModelRepositoryException]<:--[ModelNotFoundException] - - [<abstract>IModelRepository - | - +String getKey(); - +WrappedModel<T>? get(); - +dynamic fetchAll(); - +dynamic fetch(); - +dynamic save(); - +dynamic delete(); - +dynamic duplicateAndSave(); - +dynamic duplicateAndSaveFromRemote(); - +Stream<WrappedModel<T>> watch(); - +Stream<List<WrappedModel<T>>> watchAll(); - +Stream<ModelEvent<T>> watchChanges(); - +Stream<ModelEvent<T>> watchAllChanges(); - +dynamic ensurePersisted(); - +void dispose() - ] - - [<abstract>IModelActionProvider]<:--[<abstract>IModelRepository] - - [<abstract>IModelRepositoryDelegate - | - +dynamic fetchAll(); - +dynamic fetch(); - +dynamic save(); - +dynamic delete(); - +T createNewInstance(); - +T createDuplicate(); - +dynamic onError() - ] - - [<abstract>ModelRepository - | - +delegate: IModelRepositoryDelegate<T>; - -_allModelsStreamController: BehaviorSubject<List<WrappedModel<T>>>; - -_allModelEventsStreamController: BehaviorSubject<ModelEvent<T>>; - +modelStreamControllers: Map<String, BehaviorSubject<WrappedModel<T>>>; - +modelEventsStreamControllers: Map<String, BehaviorSubject<ModelEvent<T>>>; - -_allModels: Map<String, WrappedModel<T>> - | - +WrappedModel<T>? get(); - +dynamic fetchAll(); - +dynamic fetch(); - +dynamic save(); - +dynamic delete(); - +dynamic duplicateAndSave(); - +dynamic duplicateAndSaveFromRemote(); - +Stream<List<WrappedModel<T>>> watchAll(); - +Stream<WrappedModel<T>> watch(); - +Stream<ModelEvent<T>> watchAllChanges(); - +Stream<ModelEvent<T>> watchChanges(); - -dynamic _buildModelSpecificController(); - +dynamic ensurePersisted(); - +WrappedModel<T> upsertLocally(); - +List<WrappedModel<T>> upsertAllLocally(); - +dynamic emitUpdate(); - +dynamic emitModelEvent(); - +dynamic emitError(); - +void dispose(); - +List<ModelAction<dynamic>> availableActions() - ] - - [<abstract>ModelRepository]o-[<abstract>IModelRepositoryDelegate] - [<abstract>ModelRepository]o-[BehaviorSubject] - [<abstract>IModelRepository]<:-[<abstract>ModelRepository] - - [StudyLaunched - ] - - [<abstract>ModelEvent]<:-[StudyLaunched] - - [<abstract>IInviteCodeRepository - | - +dynamic isCodeAlreadyUsed() - ] - - [<abstract>ModelRepository]<:--[<abstract>IInviteCodeRepository] - - [InviteCodeRepository - | - +studyId: String; - +ref: ProviderRef<dynamic>; - +apiClient: StudyUApi; - +authRepository: IAuthRepository; - +studyRepository: IStudyRepository; - +study: Study - | - +String getKey(); - +dynamic isCodeAlreadyUsed(); - +List<ModelAction<dynamic>> availableActions(); - +dynamic emitUpdate() - ] - - [InviteCodeRepository]o-[<abstract>ProviderRef] - [InviteCodeRepository]o-[<abstract>StudyUApi] - [InviteCodeRepository]o-[<abstract>IAuthRepository] - [InviteCodeRepository]o-[<abstract>IStudyRepository] - [InviteCodeRepository]o-[Study] - [<abstract>ModelRepository]<:-[InviteCodeRepository] - [<abstract>IInviteCodeRepository]<:--[InviteCodeRepository] - - [InviteCodeRepositoryDelegate - | - +study: Study; - +apiClient: StudyUApi; - +studyRepository: IStudyRepository - | - +dynamic fetch(); - +dynamic fetchAll(); - +dynamic save(); - +dynamic delete(); - +dynamic onError(); - +StudyInvite createDuplicate(); - +StudyInvite createNewInstance() - ] - - [InviteCodeRepositoryDelegate]o-[Study] - [InviteCodeRepositoryDelegate]o-[<abstract>StudyUApi] - [InviteCodeRepositoryDelegate]o-[<abstract>IStudyRepository] - [<abstract>IModelRepositoryDelegate]<:-[InviteCodeRepositoryDelegate] - - [<abstract>IAuthRepository - | - +allowPasswordReset: bool; - +currentUser: User?; - +isLoggedIn: bool; - +session: Session?; - +serializedSession: String? - | - +dynamic signUp(); - +dynamic signInWith(); - +dynamic signOut(); - +dynamic resetPasswordForEmail(); - +dynamic updateUser(); - +void dispose() - ] - - [<abstract>IAuthRepository]o-[User] - [<abstract>IAuthRepository]o-[Session] - [<abstract>IAppDelegate]<:-[<abstract>IAuthRepository] - - [AuthRepository - | - +supabaseClient: SupabaseClient; - +sharedPreferences: SharedPreferences; - +allowPasswordReset: bool; - +authClient: GoTrueClient; - +session: Session?; - +serializedSession: String?; - +currentUser: User?; - +isLoggedIn: bool - | - -void _registerAuthListener(); - +dynamic signUp(); - +dynamic signInWith(); - +dynamic signOut(); - +dynamic resetPasswordForEmail(); - +dynamic updateUser(); - +void dispose(); - +dynamic onAppStart() - ] - - [AuthRepository]o-[SupabaseClient] - [AuthRepository]o-[SharedPreferences] - [AuthRepository]o-[GoTrueClient] - [AuthRepository]o-[Session] - [AuthRepository]o-[User] - [<abstract>IAuthRepository]<:--[AuthRepository] - - [<abstract>IUserRepository - | - +user: StudyUUser - | - +dynamic fetchUser(); - +dynamic saveUser(); - +dynamic updatePreferences() - ] - - [<abstract>IUserRepository]o-[StudyUUser] - - [UserRepository - | - +apiClient: StudyUApi; - +authRepository: IAuthRepository; - +ref: Ref<Object?>; - +user: StudyUUser - | - +dynamic fetchUser(); - +dynamic saveUser(); - +dynamic updatePreferences() - ] - - [UserRepository]o-[<abstract>StudyUApi] - [UserRepository]o-[<abstract>IAuthRepository] - [UserRepository]o-[<abstract>Ref] - [UserRepository]o-[StudyUUser] - [<abstract>IUserRepository]<:--[UserRepository] - - [PreferenceAction - | - +index: int; - <static>+values: List<PreferenceAction>; - <static>+pin: PreferenceAction; - <static>+pinOff: PreferenceAction - ] - - [PreferenceAction]o-[PreferenceAction] - [Enum]<:--[PreferenceAction] - - [<abstract>ModelEvent - | - +modelId: String; - +model: T - ] - - [IsFetched - ] - - [<abstract>ModelEvent]<:-[IsFetched] - - [IsSaving - ] - - [<abstract>ModelEvent]<:-[IsSaving] - - [IsSaved - ] - - [<abstract>ModelEvent]<:-[IsSaved] - - [IsDeleted - ] - - [<abstract>ModelEvent]<:-[IsDeleted] - - [<abstract>SupabaseClientDependant - | - +supabaseClient: SupabaseClient - ] - - [<abstract>SupabaseClientDependant]o-[SupabaseClient] - - [SupabaseQueryError - | - +statusCode: String?; - +message: String; - +details: dynamic - ] - - [Exception]<:--[SupabaseQueryError] - - [<abstract>SupabaseQueryMixin - | - +dynamic deleteAll(); - +dynamic getAll(); - +dynamic getById(); - +dynamic getByColumn(); - +List<T> deserializeList(); - +T deserializeObject() - ] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - StudyUApi - - - - - - +dynamic saveStudy() - +dynamic fetchStudy() - +dynamic getUserStudies() - +dynamic deleteStudy() - +dynamic saveStudyInvite() - +dynamic fetchStudyInvite() - +dynamic deleteStudyInvite() - +dynamic deleteParticipants() - +dynamic fetchAppConfig() - +dynamic fetchUser() - +dynamic saveUser() - - - - - - - - - - - APIException - - - - - - - - - - - Exception - - - - - - - - - - - StudyNotFoundException - - - - - - - - - - - MeasurementNotFoundException - - - - - - - - - - - QuestionNotFoundException - - - - - - - - - - - ConsentItemNotFoundException - - - - - - - - - - - InterventionNotFoundException - - - - - - - - - - - InterventionTaskNotFoundException - - - - - - - - - - - ReportNotFoundException - - - - - - - - - - - ReportSectionNotFoundException - - - - - - - - - - - StudyInviteNotFoundException - - - - - - - - - - - UserNotFoundException - - - - - - - - - - - - - StudyUApiClient - - - - - - +supabaseClient: SupabaseClient - <static>+studyColumns: List<String> - <static>+studyWithParticipantActivityColumns: List<String> - +testDelayMilliseconds: int - - - - - - +dynamic deleteParticipants() - +dynamic getUserStudies() - +dynamic fetchStudy() - +dynamic deleteStudy() - +dynamic saveStudy() - +dynamic fetchStudyInvite() - +dynamic saveStudyInvite() - +dynamic deleteStudyInvite() - +dynamic fetchAppConfig() - +dynamic fetchUser() - +dynamic saveUser() - -dynamic _awaitGuarded() - -dynamic _apiException() - -dynamic _testDelay() - - - - - - - - - - - SupabaseClient - - - - - - - - - - - - SupabaseClientDependant - - - - - - +supabaseClient: SupabaseClient - - - - - - - - - - - - SupabaseQueryMixin - - - - - - +dynamic deleteAll() - +dynamic getAll() - +dynamic getById() - +dynamic getByColumn() - +List<T> deserializeList() - +T deserializeObject() - - - - - - - - - - - - IStudyRepository - - - - - - +dynamic launch() - +dynamic deleteParticipants() - - - - - - - - - - - - - ModelRepository - - - - - - +delegate: IModelRepositoryDelegate<T> - -_allModelsStreamController: BehaviorSubject<List<WrappedModel<T>>> - -_allModelEventsStreamController: BehaviorSubject<ModelEvent<T>> - +modelStreamControllers: Map<String, BehaviorSubject<WrappedModel<T>>> - +modelEventsStreamControllers: Map<String, BehaviorSubject<ModelEvent<T>>> - -_allModels: Map<String, WrappedModel<T>> - - - - - - +WrappedModel<T>? get() - +dynamic fetchAll() - +dynamic fetch() - +dynamic save() - +dynamic delete() - +dynamic duplicateAndSave() - +dynamic duplicateAndSaveFromRemote() - +Stream<List<WrappedModel<T>>> watchAll() - +Stream<WrappedModel<T>> watch() - +Stream<ModelEvent<T>> watchAllChanges() - +Stream<ModelEvent<T>> watchChanges() - -dynamic _buildModelSpecificController() - +dynamic ensurePersisted() - +WrappedModel<T> upsertLocally() - +List<WrappedModel<T>> upsertAllLocally() - +dynamic emitUpdate() - +dynamic emitModelEvent() - +dynamic emitError() - +void dispose() - +List<ModelAction<dynamic>> availableActions() - - - - - - - - - - - - - StudyRepository - - - - - - +apiClient: StudyUApi - +authRepository: IAuthRepository - +ref: ProviderRef<dynamic> - +sortCallback: void Function()? - - - - - - +String getKey() - +dynamic deleteParticipants() - +dynamic launch() - +List<ModelAction<dynamic>> availableActions() - - - - - - - - - - - - - IAuthRepository - - - - - - +allowPasswordReset: bool - +currentUser: User? - +isLoggedIn: bool - +session: Session? - +serializedSession: String? - - - - - - +dynamic signUp() - +dynamic signInWith() - +dynamic signOut() - +dynamic resetPasswordForEmail() - +dynamic updateUser() - +void dispose() - - - - - - - - - - - ProviderRef - - - - - - - - - - - void Function()? - - - - - - - - - - - - - StudyRepositoryDelegate - - - - - - +apiClient: StudyUApi - +authRepository: IAuthRepository - - - - - - +dynamic fetchAll() - +dynamic fetch() - +dynamic save() - +dynamic delete() - +dynamic onError() - +Study createNewInstance() - +Study createDuplicate() - - - - - - - - - - - - IModelRepositoryDelegate - - - - - - +dynamic fetchAll() - +dynamic fetch() - +dynamic save() - +dynamic delete() - +T createNewInstance() - +T createDuplicate() - +dynamic onError() - - - - - - - - - - - - IAppRepository - - - - - - +dynamic fetchAppConfig() - +void dispose() - - - - - - - - - - - - - AppRepository - - - - - - +apiClient: StudyUApi - - - - - - +dynamic fetchAppConfig() - +void dispose() - - - - - - - - - - - - - WrappedModel - - - - - - -_model: T - +asyncValue: AsyncValue<T> - +isLocalOnly: bool - +isDirty: bool - +isDeleted: bool - +lastSaved: DateTime? - +lastFetched: DateTime? - +lastUpdated: DateTime? - +model: T - - - - - - +dynamic markWithError() - +dynamic markAsLoading() - +dynamic markAsFetched() - +dynamic markAsSaved() - - - - - - - - - - - AsyncValue - - - - - - - - - - - ModelRepositoryException - - - - - - - - - - - ModelNotFoundException - - - - - - - - - - - - IModelRepository - - - - - - +String getKey() - +WrappedModel<T>? get() - +dynamic fetchAll() - +dynamic fetch() - +dynamic save() - +dynamic delete() - +dynamic duplicateAndSave() - +dynamic duplicateAndSaveFromRemote() - +Stream<WrappedModel<T>> watch() - +Stream<List<WrappedModel<T>>> watchAll() - +Stream<ModelEvent<T>> watchChanges() - +Stream<ModelEvent<T>> watchAllChanges() - +dynamic ensurePersisted() - +void dispose() - - - - - - - - - - - IModelActionProvider - - - - - - - - - - - BehaviorSubject - - - - - - - - - - - StudyLaunched - - - - - - - - - - - - ModelEvent - - - - - - +modelId: String - +model: T - - - - - - - - - - - - IInviteCodeRepository - - - - - - +dynamic isCodeAlreadyUsed() - - - - - - - - - - - - - InviteCodeRepository - - - - - - +studyId: String - +ref: ProviderRef<dynamic> - +apiClient: StudyUApi - +authRepository: IAuthRepository - +studyRepository: IStudyRepository - +study: Study - - - - - - +String getKey() - +dynamic isCodeAlreadyUsed() - +List<ModelAction<dynamic>> availableActions() - +dynamic emitUpdate() - - - - - - - - - - - Study - - - - - - - - - - - - - InviteCodeRepositoryDelegate - - - - - - +study: Study - +apiClient: StudyUApi - +studyRepository: IStudyRepository - - - - - - +dynamic fetch() - +dynamic fetchAll() - +dynamic save() - +dynamic delete() - +dynamic onError() - +StudyInvite createDuplicate() - +StudyInvite createNewInstance() - - - - - - - - - - - User - - - - - - - - - - - Session - - - - - - - - - - - IAppDelegate - - - - - - - - - - - - - AuthRepository - - - - - - +supabaseClient: SupabaseClient - +sharedPreferences: SharedPreferences - +allowPasswordReset: bool - +authClient: GoTrueClient - +session: Session? - +serializedSession: String? - +currentUser: User? - +isLoggedIn: bool - - - - - - -void _registerAuthListener() - +dynamic signUp() - +dynamic signInWith() - +dynamic signOut() - +dynamic resetPasswordForEmail() - +dynamic updateUser() - +void dispose() - +dynamic onAppStart() - - - - - - - - - - - SharedPreferences - - - - - - - - - - - GoTrueClient - - - - - - - - - - - - - IUserRepository - - - - - - +user: StudyUUser - - - - - - +dynamic fetchUser() - +dynamic saveUser() - +dynamic updatePreferences() - - - - - - - - - - - StudyUUser - - - - - - - - - - - - - UserRepository - - - - - - +apiClient: StudyUApi - +authRepository: IAuthRepository - +ref: Ref<Object?> - +user: StudyUUser - - - - - - +dynamic fetchUser() - +dynamic saveUser() - +dynamic updatePreferences() - - - - - - - - - - - Ref - - - - - - - - - - - - PreferenceAction - - - - - - +index: int - <static>+values: List<PreferenceAction> - <static>+pin: PreferenceAction - <static>+pinOff: PreferenceAction - - - - - - - - - - - Enum - - - - - - - - - - - IsFetched - - - - - - - - - - - IsSaving - - - - - - - - - - - IsSaved - - - - - - - - - - - IsDeleted - - - - - - - - - - - - SupabaseQueryError - - - - - - +statusCode: String? - +message: String - +details: dynamic - - - - - - - - - \ No newline at end of file diff --git a/docs/uml/designer_v2/lib/routing/uml.svg b/docs/uml/designer_v2/lib/routing/uml.svg deleted file mode 100644 index 956bf0220..000000000 --- a/docs/uml/designer_v2/lib/routing/uml.svg +++ /dev/null @@ -1,680 +0,0 @@ - - [RouterKeys - | - <static>+studyKey: ValueKey<String>; - <static>+authKey: ValueKey<String> - ] - - [RouterKeys]o-[ValueKey] - - [RouteParams - | - <static>+studiesFilter: String; - <static>+studyId: String; - <static>+measurementId: String; - <static>+interventionId: String; - <static>+testAppRoute: String - ] - - [RouterConf - | - <static>+router: GoRouter; - <static>+routes: List<GoRoute>; - <static>+publicRoutes: List<GoRoute>; - <static>+privateRoutes: List<GoRoute> - | - <static>+GoRoute route() - ] - - [RouterConf]o-[GoRouter] - - [<abstract>StudyFormRouteArgs - | - +studyId: String - ] - - [<abstract>QuestionFormRouteArgs - | - +questionId: String - ] - - [<abstract>StudyFormRouteArgs]<:-[<abstract>QuestionFormRouteArgs] - - [ScreenerQuestionFormRouteArgs - ] - - [<abstract>QuestionFormRouteArgs]<:-[ScreenerQuestionFormRouteArgs] - - [ConsentItemFormRouteArgs - | - +consentId: String - ] - - [<abstract>StudyFormRouteArgs]<:-[ConsentItemFormRouteArgs] - - [MeasurementFormRouteArgs - | - +measurementId: String - ] - - [<abstract>StudyFormRouteArgs]<:-[MeasurementFormRouteArgs] - - [SurveyQuestionFormRouteArgs - | - +questionId: String - ] - - [MeasurementFormRouteArgs]<:-[SurveyQuestionFormRouteArgs] - [<abstract>QuestionFormRouteArgs]<:--[SurveyQuestionFormRouteArgs] - - [InterventionFormRouteArgs - | - +interventionId: String - ] - - [<abstract>StudyFormRouteArgs]<:-[InterventionFormRouteArgs] - - [InterventionTaskFormRouteArgs - | - +taskId: String - ] - - [InterventionFormRouteArgs]<:-[InterventionTaskFormRouteArgs] - - [ReportItemFormRouteArgs - | - +sectionId: String - ] - - [<abstract>StudyFormRouteArgs]<:-[ReportItemFormRouteArgs] - - [<abstract>GoRouteParamEnum - | - +String toRouteParam(); - +String toShortString() - ] - - [RoutingIntents - | - <static>+root: RoutingIntent; - <static>+studies: RoutingIntent; - <static>+studiesShared: RoutingIntent; - <static>+publicRegistry: RoutingIntent; - <static>+study: RoutingIntent Function(String); - <static>+studyEdit: RoutingIntent Function(String); - <static>+studyEditInfo: RoutingIntent Function(String); - <static>+studyEditEnrollment: RoutingIntent Function(String); - <static>+studyEditInterventions: RoutingIntent Function(String); - <static>+studyEditIntervention: RoutingIntent Function(String, String); - <static>+studyEditMeasurements: RoutingIntent Function(String); - <static>+studyEditReports: RoutingIntent Function(String); - <static>+studyEditMeasurement: RoutingIntent Function(String, String); - <static>+studyTest: RoutingIntent Function(String, {String? appRoute}); - <static>+studyRecruit: RoutingIntent Function(String); - <static>+studyMonitor: RoutingIntent Function(String); - <static>+studyAnalyze: RoutingIntent Function(String); - <static>+studySettings: RoutingIntent Function(String); - <static>+accountSettings: RoutingIntent; - <static>+studyNew: RoutingIntent; - <static>+login: RoutingIntent; - <static>+signup: RoutingIntent; - <static>+passwordForgot: RoutingIntent; - <static>+passwordForgot2: RoutingIntent Function(String); - <static>+passwordRecovery: RoutingIntent; - <static>+error: RoutingIntent Function(Exception) - ] - - [RoutingIntents]o-[RoutingIntent] - [RoutingIntents]o-[RoutingIntent Function(String)] - [RoutingIntents]o-[RoutingIntent Function(String, String)] - [RoutingIntents]o-[RoutingIntent Function(String, {String? appRoute})] - [RoutingIntents]o-[RoutingIntent Function(Exception)] - - [RoutingIntent - | - +route: GoRoute; - +params: Map<String, String>; - +queryParams: Map<String, String>; - +dispatch: RoutingIntentDispatch?; - +extra: Object?; - +routeName: String; - +arguments: Map<String, String>; - +props: List<Object?> - | - -dynamic _validateRoute(); - +bool matches() - ] - - [RoutingIntent]o-[GoRoute] - [RoutingIntent]o-[RoutingIntentDispatch] - [<abstract>Equatable]<:-[RoutingIntent] - - [RoutingIntentDispatch - | - +index: int; - <static>+values: List<RoutingIntentDispatch>; - <static>+go: RoutingIntentDispatch; - <static>+push: RoutingIntentDispatch - ] - - [RoutingIntentDispatch]o-[RoutingIntentDispatch] - [Enum]<:--[RoutingIntentDispatch] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - RouterKeys - - - - - - <static>+studyKey: ValueKey<String> - <static>+authKey: ValueKey<String> - - - - - - - - - - - ValueKey - - - - - - - - - - - - RouteParams - - - - - - <static>+studiesFilter: String - <static>+studyId: String - <static>+measurementId: String - <static>+interventionId: String - <static>+testAppRoute: String - - - - - - - - - - - - - RouterConf - - - - - - <static>+router: GoRouter - <static>+routes: List<GoRoute> - <static>+publicRoutes: List<GoRoute> - <static>+privateRoutes: List<GoRoute> - - - - - - <static>+GoRoute route() - - - - - - - - - - - GoRouter - - - - - - - - - - - - StudyFormRouteArgs - - - - - - +studyId: String - - - - - - - - - - - - QuestionFormRouteArgs - - - - - - +questionId: String - - - - - - - - - - - ScreenerQuestionFormRouteArgs - - - - - - - - - - - - ConsentItemFormRouteArgs - - - - - - +consentId: String - - - - - - - - - - - - MeasurementFormRouteArgs - - - - - - +measurementId: String - - - - - - - - - - - - SurveyQuestionFormRouteArgs - - - - - - +questionId: String - - - - - - - - - - - - InterventionFormRouteArgs - - - - - - +interventionId: String - - - - - - - - - - - - InterventionTaskFormRouteArgs - - - - - - +taskId: String - - - - - - - - - - - - ReportItemFormRouteArgs - - - - - - +sectionId: String - - - - - - - - - - - - GoRouteParamEnum - - - - - - +String toRouteParam() - +String toShortString() - - - - - - - - - - - - RoutingIntents - - - - - - <static>+root: RoutingIntent - <static>+studies: RoutingIntent - <static>+studiesShared: RoutingIntent - <static>+publicRegistry: RoutingIntent - <static>+study: RoutingIntent Function(String) - <static>+studyEdit: RoutingIntent Function(String) - <static>+studyEditInfo: RoutingIntent Function(String) - <static>+studyEditEnrollment: RoutingIntent Function(String) - <static>+studyEditInterventions: RoutingIntent Function(String) - <static>+studyEditIntervention: RoutingIntent Function(String, String) - <static>+studyEditMeasurements: RoutingIntent Function(String) - <static>+studyEditReports: RoutingIntent Function(String) - <static>+studyEditMeasurement: RoutingIntent Function(String, String) - <static>+studyTest: RoutingIntent Function(String, {String? appRoute}) - <static>+studyRecruit: RoutingIntent Function(String) - <static>+studyMonitor: RoutingIntent Function(String) - <static>+studyAnalyze: RoutingIntent Function(String) - <static>+studySettings: RoutingIntent Function(String) - <static>+accountSettings: RoutingIntent - <static>+studyNew: RoutingIntent - <static>+login: RoutingIntent - <static>+signup: RoutingIntent - <static>+passwordForgot: RoutingIntent - <static>+passwordForgot2: RoutingIntent Function(String) - <static>+passwordRecovery: RoutingIntent - <static>+error: RoutingIntent Function(Exception) - - - - - - - - - - - - - RoutingIntent - - - - - - +route: GoRoute - +params: Map<String, String> - +queryParams: Map<String, String> - +dispatch: RoutingIntentDispatch? - +extra: Object? - +routeName: String - +arguments: Map<String, String> - +props: List<Object?> - - - - - - -dynamic _validateRoute() - +bool matches() - - - - - - - - - - - RoutingIntent Function(String) - - - - - - - - - - - RoutingIntent Function(String, String) - - - - - - - - - - - RoutingIntent Function(String, {String? appRoute}) - - - - - - - - - - - RoutingIntent Function(Exception) - - - - - - - - - - - GoRoute - - - - - - - - - - - - RoutingIntentDispatch - - - - - - +index: int - <static>+values: List<RoutingIntentDispatch> - <static>+go: RoutingIntentDispatch - <static>+push: RoutingIntentDispatch - - - - - - - - - - - Equatable - - - - - - - - - - - Enum - - - - - - - - - \ No newline at end of file diff --git a/docs/uml/designer_v2/lib/services/uml.svg b/docs/uml/designer_v2/lib/services/uml.svg deleted file mode 100644 index 49812d478..000000000 --- a/docs/uml/designer_v2/lib/services/uml.svg +++ /dev/null @@ -1,518 +0,0 @@ - - [<abstract>IClipboardService - | - +dynamic copy() - ] - - [ClipboardService - | - +dynamic copy() - ] - - [<abstract>IClipboardService]<:--[ClipboardService] - - [<abstract>NotificationIntent - | - +message: String?; - +customContent: Widget?; - +icon: IconData?; - +actions: List<NotificationAction>?; - +type: NotificationType - | - +void register() - ] - - [<abstract>NotificationIntent]o-[<abstract>Widget] - [<abstract>NotificationIntent]o-[IconData] - [<abstract>NotificationIntent]o-[NotificationType] - - [NotificationAction - | - +label: String; - +onSelect: dynamic Function(); - +isDestructive: bool - ] - - [NotificationAction]o-[dynamic Function()] - - [SnackbarIntent - | - +duration: int? - ] - - [<abstract>NotificationIntent]<:-[SnackbarIntent] - - [AlertIntent - | - +title: String; - +dismissOnAction: bool; - +isDestructive: dynamic - ] - - [<abstract>NotificationIntent]<:-[AlertIntent] - - [NotificationType - | - +index: int; - <static>+values: List<NotificationType>; - <static>+snackbar: NotificationType; - <static>+alert: NotificationType; - <static>+custom: NotificationType - ] - - [NotificationType]o-[NotificationType] - [Enum]<:--[NotificationType] - - [NotificationDispatcher - | - +child: Widget?; - +snackbarInnerPadding: double; - +snackbarWidth: double?; - +snackbarBehavior: SnackBarBehavior; - +snackbarDefaultDuration: int - ] - - [NotificationDispatcher]o-[<abstract>Widget] - [NotificationDispatcher]o-[SnackBarBehavior] - - [Notifications - | - <static>+credentialsInvalid: SnackbarIntent; - <static>+userAlreadyRegistered: SnackbarIntent; - <static>+passwordReset: SnackbarIntent; - <static>+passwordResetSuccess: SnackbarIntent; - <static>+studyDeleted: SnackbarIntent; - <static>+inviteCodeDeleted: SnackbarIntent; - <static>+inviteCodeClipped: SnackbarIntent; - <static>+studyDeleteConfirmation: AlertIntent - ] - - [Notifications]o-[SnackbarIntent] - [Notifications]o-[AlertIntent] - - [NotificationDefaultActions - | - <static>+cancel: NotificationAction - ] - - [NotificationDefaultActions]o-[NotificationAction] - - [<abstract>INotificationService - | - +void showMessage(); - +void show(); - +Stream<NotificationIntent> watchNotifications(); - +void dispose() - ] - - [NotificationService - | - -_streamController: BehaviorSubject<NotificationIntent> - | - +Stream<NotificationIntent> watchNotifications(); - +void showMessage(); - +void show(); - +void dispose() - ] - - [NotificationService]o-[BehaviorSubject] - [<abstract>INotificationService]<:--[NotificationService] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IClipboardService - - - - - - +dynamic copy() - - - - - - - - - - - - ClipboardService - - - - - - +dynamic copy() - - - - - - - - - - - - - NotificationIntent - - - - - - +message: String? - +customContent: Widget? - +icon: IconData? - +actions: List<NotificationAction>? - +type: NotificationType - - - - - - +void register() - - - - - - - - - - - Widget - - - - - - - - - - - IconData - - - - - - - - - - - - NotificationType - - - - - - +index: int - <static>+values: List<NotificationType> - <static>+snackbar: NotificationType - <static>+alert: NotificationType - <static>+custom: NotificationType - - - - - - - - - - - - NotificationAction - - - - - - +label: String - +onSelect: dynamic Function() - +isDestructive: bool - - - - - - - - - - - dynamic Function() - - - - - - - - - - - - SnackbarIntent - - - - - - +duration: int? - - - - - - - - - - - - AlertIntent - - - - - - +title: String - +dismissOnAction: bool - +isDestructive: dynamic - - - - - - - - - - - Enum - - - - - - - - - - - - NotificationDispatcher - - - - - - +child: Widget? - +snackbarInnerPadding: double - +snackbarWidth: double? - +snackbarBehavior: SnackBarBehavior - +snackbarDefaultDuration: int - - - - - - - - - - - SnackBarBehavior - - - - - - - - - - - - Notifications - - - - - - <static>+credentialsInvalid: SnackbarIntent - <static>+userAlreadyRegistered: SnackbarIntent - <static>+passwordReset: SnackbarIntent - <static>+passwordResetSuccess: SnackbarIntent - <static>+studyDeleted: SnackbarIntent - <static>+inviteCodeDeleted: SnackbarIntent - <static>+inviteCodeClipped: SnackbarIntent - <static>+studyDeleteConfirmation: AlertIntent - - - - - - - - - - - - NotificationDefaultActions - - - - - - <static>+cancel: NotificationAction - - - - - - - - - - - - INotificationService - - - - - - +void showMessage() - +void show() - +Stream<NotificationIntent> watchNotifications() - +void dispose() - - - - - - - - - - - - - NotificationService - - - - - - -_streamController: BehaviorSubject<NotificationIntent> - - - - - - +Stream<NotificationIntent> watchNotifications() - +void showMessage() - +void show() - +void dispose() - - - - - - - - - - - BehaviorSubject - - - - - - - - - \ No newline at end of file diff --git a/docs/uml/designer_v2/lib/uml.svg b/docs/uml/designer_v2/lib/uml.svg deleted file mode 100644 index 880ed2de2..000000000 --- a/docs/uml/designer_v2/lib/uml.svg +++ /dev/null @@ -1,16246 +0,0 @@ - - [Config - | - <static>+isDebugMode: bool; - <static>+defaultLocale: Set<String>; - <static>+supportedLocales: Map<String, String>; - <static>+newStudyId: String; - <static>+newModelId: String; - <static>+minSplashTime: int; - <static>+formAutosaveDebounce: int - ] - - [<abstract>ResultTypes - ] - - [MeasurementResultTypes - | - <static>+questionnaire: String; - <static>+values: List<String> - ] - - [<abstract>ResultTypes]<:-[MeasurementResultTypes] - - [InterventionResultTypes - | - <static>+checkmarkTask: String; - <static>+values: List<String> - ] - - [<abstract>ResultTypes]<:-[InterventionResultTypes] - - [StudyExportData - | - +study: Study; - +measurementsData: List<Map<String, dynamic>>; - +interventionsData: List<Map<String, dynamic>>; - +mediaData: List<String>; - +isEmpty: bool - ] - - [StudyExportData]o-[Study] - - [StudyTemplates - | - <static>+kUnnamedStudyTitle: String - | - <static>+Study emptyDraft() - ] - - [StudyActionType - | - +index: int; - <static>+values: List<StudyActionType>; - <static>+pin: StudyActionType; - <static>+pinoff: StudyActionType; - <static>+edit: StudyActionType; - <static>+duplicate: StudyActionType; - <static>+duplicateDraft: StudyActionType; - <static>+addCollaborator: StudyActionType; - <static>+export: StudyActionType; - <static>+delete: StudyActionType - ] - - [StudyActionType]o-[StudyActionType] - [Enum]<:--[StudyActionType] - - [Notifications - | - <static>+credentialsInvalid: SnackbarIntent; - <static>+userAlreadyRegistered: SnackbarIntent; - <static>+passwordReset: SnackbarIntent; - <static>+passwordResetSuccess: SnackbarIntent; - <static>+studyDeleted: SnackbarIntent; - <static>+inviteCodeDeleted: SnackbarIntent; - <static>+inviteCodeClipped: SnackbarIntent; - <static>+studyDeleteConfirmation: AlertIntent - ] - - [Notifications]o-[SnackbarIntent] - [Notifications]o-[AlertIntent] - - [NotificationDefaultActions - | - <static>+cancel: NotificationAction - ] - - [NotificationDefaultActions]o-[NotificationAction] - - [<abstract>INotificationService - | - +void showMessage(); - +void show(); - +Stream<NotificationIntent> watchNotifications(); - +void dispose() - ] - - [NotificationService - | - -_streamController: BehaviorSubject<NotificationIntent> - | - +Stream<NotificationIntent> watchNotifications(); - +void showMessage(); - +void show(); - +void dispose() - ] - - [NotificationService]o-[BehaviorSubject] - [<abstract>INotificationService]<:--[NotificationService] - - [<abstract>NotificationIntent - | - +message: String?; - +customContent: Widget?; - +icon: IconData?; - +actions: List<NotificationAction>?; - +type: NotificationType - | - +void register() - ] - - [<abstract>NotificationIntent]o-[<abstract>Widget] - [<abstract>NotificationIntent]o-[IconData] - [<abstract>NotificationIntent]o-[NotificationType] - - [NotificationAction - | - +label: String; - +onSelect: dynamic Function(); - +isDestructive: bool - ] - - [NotificationAction]o-[dynamic Function()] - - [SnackbarIntent - | - +duration: int? - ] - - [<abstract>NotificationIntent]<:-[SnackbarIntent] - - [AlertIntent - | - +title: String; - +dismissOnAction: bool; - +isDestructive: dynamic - ] - - [<abstract>NotificationIntent]<:-[AlertIntent] - - [NotificationType - | - +index: int; - <static>+values: List<NotificationType>; - <static>+snackbar: NotificationType; - <static>+alert: NotificationType; - <static>+custom: NotificationType - ] - - [NotificationType]o-[NotificationType] - [Enum]<:--[NotificationType] - - [<abstract>IClipboardService - | - +dynamic copy() - ] - - [ClipboardService - | - +dynamic copy() - ] - - [<abstract>IClipboardService]<:--[ClipboardService] - - [NotificationDispatcher - | - +child: Widget?; - +snackbarInnerPadding: double; - +snackbarWidth: double?; - +snackbarBehavior: SnackBarBehavior; - +snackbarDefaultDuration: int - ] - - [NotificationDispatcher]o-[<abstract>Widget] - [NotificationDispatcher]o-[SnackBarBehavior] - - [Assets - | - <static>+logoWide: String - ] - - [AsyncValueWidget - | - +value: AsyncValue<T>; - +data: Widget Function(T); - +error: Widget Function(Object, StackTrace?)?; - +loading: Widget Function()?; - +empty: Widget Function()? - | - +Widget build(); - -Widget _buildDataOrEmptyWidget(); - -Widget _defaultError(); - -Widget _defaultLoad() - ] - - [AsyncValueWidget]o-[<abstract>AsyncValue] - [AsyncValueWidget]o-[Widget Function(T)] - [AsyncValueWidget]o-[Widget Function(Object, StackTrace?)?] - [AsyncValueWidget]o-[Widget Function()?] - - [FormControlLabel - | - +formControl: AbstractControl<dynamic>; - +text: String; - +isClickable: bool; - +textStyle: TextStyle?; - +onClick: void Function(AbstractControl<dynamic>)? - | - +Widget build() - ] - - [FormControlLabel]o-[<abstract>AbstractControl] - [FormControlLabel]o-[TextStyle] - [FormControlLabel]o-[void Function(AbstractControl<dynamic>)?] - - [ActionPopUpMenuButton - | - +actions: List<ModelAction<dynamic>>; - +triggerIconColor: Color?; - +triggerIconColorHover: Color?; - +triggerIconSize: double; - +disableSplashEffect: bool; - +hideOnEmpty: bool; - +orientation: Axis; - +elevation: double?; - +splashRadius: double?; - +enabled: bool; - +position: PopupMenuPosition - | - +Widget build(); - -Widget _buildPopupMenu() - ] - - [ActionPopUpMenuButton]o-[Color] - [ActionPopUpMenuButton]o-[Axis] - [ActionPopUpMenuButton]o-[PopupMenuPosition] - - [Search - | - +onQueryChanged: dynamic Function(String); - +searchController: SearchController?; - +hintText: String?; - +initialText: String? - ] - - [Search]o-[dynamic Function(String)] - [Search]o-[SearchController] - - [SearchController - | - +setText: void Function(String) - ] - - [SearchController]o-[void Function(String)] - - [FormScaffold - | - +formViewModel: T; - +actions: List<Widget>?; - +body: Widget; - +drawer: Widget?; - +actionsSpacing: double; - +actionsPadding: double - ] - - [FormScaffold]o-[<abstract>Widget] - - [ConstrainedWidthFlexible - | - +minWidth: double; - +maxWidth: double; - +flex: int; - +flexSum: int; - +child: Widget; - +outerConstraints: BoxConstraints - | - +Widget build(); - -double _getWidth() - ] - - [ConstrainedWidthFlexible]o-[<abstract>Widget] - [ConstrainedWidthFlexible]o-[BoxConstraints] - - [PrimaryButton - | - +text: String; - +icon: IconData?; - +isLoading: bool; - +showLoadingEarliestAfterMs: int; - +onPressed: void Function()?; - +tooltip: String; - +tooltipDisabled: String; - +enabled: bool; - +onPressedFuture: dynamic Function()?; - +innerPadding: EdgeInsets; - +minimumSize: Size?; - +isDisabled: bool - ] - - [PrimaryButton]o-[IconData] - [PrimaryButton]o-[void Function()?] - [PrimaryButton]o-[dynamic Function()?] - [PrimaryButton]o-[EdgeInsets] - [PrimaryButton]o-[Size] - - [FormTableRow - | - +label: String?; - +labelBuilder: Widget Function(BuildContext)?; - +labelStyle: TextStyle?; - +labelHelpText: String?; - +input: Widget; - +control: AbstractControl<dynamic>?; - +layout: FormTableRowLayout? - ] - - [FormTableRow]o-[Widget Function(BuildContext)?] - [FormTableRow]o-[TextStyle] - [FormTableRow]o-[<abstract>Widget] - [FormTableRow]o-[<abstract>AbstractControl] - [FormTableRow]o-[FormTableRowLayout] - - [FormTableLayout - | - +rows: List<FormTableRow>; - +columnWidths: Map<int, TableColumnWidth>; - +rowDivider: Widget?; - +rowLayout: FormTableRowLayout?; - +rowLabelStyle: TextStyle? - | - +Widget build() - ] - - [FormTableLayout]o-[<abstract>Widget] - [FormTableLayout]o-[FormTableRowLayout] - [FormTableLayout]o-[TextStyle] - - [FormSectionHeader - | - +title: String; - +titleTextStyle: TextStyle?; - +helpText: String?; - +divider: bool; - +helpTextDisabled: bool - | - +Widget build() - ] - - [FormSectionHeader]o-[TextStyle] - - [FormLabel - | - +labelText: String?; - +helpText: String?; - +labelTextStyle: TextStyle?; - +layout: FormTableRowLayout? - | - +Widget build() - ] - - [FormLabel]o-[TextStyle] - [FormLabel]o-[FormTableRowLayout] - - [FormTableRowLayout - | - +index: int; - <static>+values: List<FormTableRowLayout>; - <static>+vertical: FormTableRowLayout; - <static>+horizontal: FormTableRowLayout - ] - - [FormTableRowLayout]o-[FormTableRowLayout] - [Enum]<:--[FormTableRowLayout] - - [DismissButton - | - +onPressed: void Function()?; - +text: String? - | - +Widget build() - ] - - [DismissButton]o-[void Function()?] - - [Badge - | - +icon: IconData?; - +color: Color?; - +borderRadius: double; - +label: String; - +type: BadgeType; - +padding: EdgeInsets; - +iconSize: double?; - +labelStyle: TextStyle?; - +center: bool - | - +Widget build(); - -Color? _getBackgroundColor(); - -Color _getBorderColor(); - -Color? _getLabelColor() - ] - - [Badge]o-[IconData] - [Badge]o-[Color] - [Badge]o-[BadgeType] - [Badge]o-[EdgeInsets] - [Badge]o-[TextStyle] - - [BadgeType - | - +index: int; - <static>+values: List<BadgeType>; - <static>+filled: BadgeType; - <static>+outlined: BadgeType; - <static>+outlineFill: BadgeType; - <static>+plain: BadgeType - ] - - [BadgeType]o-[BadgeType] - [Enum]<:--[BadgeType] - - [StandardDialog - | - +title: Widget?; - +titleText: String?; - +body: Widget; - +actionButtons: List<Widget>; - +backgroundColor: Color?; - +borderRadius: double?; - +width: double?; - +height: double?; - +minWidth: double; - +minHeight: double; - +maxWidth: double?; - +maxHeight: double?; - +padding: EdgeInsets - | - +Widget build() - ] - - [StandardDialog]o-[<abstract>Widget] - [StandardDialog]o-[Color] - [StandardDialog]o-[EdgeInsets] - - [<abstract>ISyncIndicatorViewModel - | - +isDirty: bool; - +lastSynced: DateTime? - ] - - [SyncIndicator - | - +state: AsyncValue<T>; - +lastSynced: DateTime?; - +isDirty: bool; - +animationDuration: int; - +iconSize: double - ] - - [SyncIndicator]o-[<abstract>AsyncValue] - - [<abstract>IWithBanner - | - +Widget? banner() - ] - - [BannerBox - | - +prefixIcon: Widget?; - +body: Widget; - +style: BannerStyle; - +padding: EdgeInsets?; - +noPrefix: bool; - +dismissable: bool; - +isDismissed: bool?; - +onDismissed: dynamic Function()?; - +dismissIconSize: double - ] - - [BannerBox]o-[<abstract>Widget] - [BannerBox]o-[BannerStyle] - [BannerBox]o-[EdgeInsets] - [BannerBox]o-[dynamic Function()?] - - [BannerStyle - | - +index: int; - <static>+values: List<BannerStyle>; - <static>+warning: BannerStyle; - <static>+info: BannerStyle; - <static>+error: BannerStyle - ] - - [BannerStyle]o-[BannerStyle] - [Enum]<:--[BannerStyle] - - [ActionMenuInline - | - +actions: List<ModelAction<dynamic>>; - +iconSize: double?; - +visible: bool; - +splashRadius: double?; - +paddingVertical: double?; - +paddingHorizontal: double? - | - +Widget build() - ] - - [Collapsible - | - +contentBuilder: Widget Function(BuildContext, bool); - +headerBuilder: Widget Function(BuildContext, bool)?; - +title: String?; - +isCollapsed: bool - ] - - [Collapsible]o-[Widget Function(BuildContext, bool)] - [Collapsible]o-[Widget Function(BuildContext, bool)?] - - [NavbarTab - | - +title: String; - +intent: RoutingIntent?; - +index: int; - +enabled: bool - ] - - [NavbarTab]o-[RoutingIntent] - - [TabbedNavbar - | - +tabs: List<T>; - +selectedTab: T?; - +indicator: BoxDecoration?; - +height: double?; - +disabledBackgroundColor: Color?; - +disabledTooltipText: String?; - +onSelect: void Function(int, T)?; - +labelPadding: EdgeInsets?; - +labelSpacing: double?; - +indicatorSize: TabBarIndicatorSize?; - +isScrollable: bool; - +backgroundColor: Color?; - +labelColorHover: Color?; - +unselectedLabelColorHover: Color? - ] - - [TabbedNavbar]o-[BoxDecoration] - [TabbedNavbar]o-[Color] - [TabbedNavbar]o-[void Function(int, T)?] - [TabbedNavbar]o-[EdgeInsets] - [TabbedNavbar]o-[TabBarIndicatorSize] - - [SidesheetTab - | - +builder: Widget Function(BuildContext) - ] - - [SidesheetTab]o-[Widget Function(BuildContext)] - [NavbarTab]<:-[SidesheetTab] - - [Sidesheet - | - <static>+kDefaultWidth: double; - +titleText: String; - +body: Widget?; - +tabs: List<SidesheetTab>?; - +actionButtons: List<Widget>?; - +width: double?; - +withCloseButton: bool; - +ignoreAppBar: bool; - +collapseSingleTab: bool; - +bodyPadding: EdgeInsets?; - +wrapContent: Widget Function(Widget)? - ] - - [Sidesheet]o-[<abstract>Widget] - [Sidesheet]o-[EdgeInsets] - [Sidesheet]o-[Widget Function(Widget)?] - - [FormSideSheetTab - | - +formViewBuilder: Widget Function(T) - ] - - [FormSideSheetTab]o-[Widget Function(T)] - [NavbarTab]<:-[FormSideSheetTab] - - [HelpIcon - | - +tooltipText: String? - | - +Widget build() - ] - - [EmptyBody - | - +icon: IconData?; - +leading: Widget?; - +leadingSpacing: double?; - +title: String?; - +description: String?; - +button: Widget? - | - +Widget build() - ] - - [EmptyBody]o-[IconData] - [EmptyBody]o-[<abstract>Widget] - - [IndicatorRangeSliderThumbShape - | - +buildContext: BuildContext; - +start: T; - +end: T - | - +Size getPreferredSize(); - +void paint() - ] - - [IndicatorRangeSliderThumbShape]o-[<abstract>BuildContext] - [<abstract>RangeSliderThumbShape]<:-[IndicatorRangeSliderThumbShape] - - [MouseEventsRegion - | - +onTap: void Function()?; - +onHover: void Function(PointerHoverEvent)?; - +onEnter: void Function(PointerEnterEvent)?; - +onExit: void Function(PointerExitEvent)?; - +autoselectCursor: bool; - +cursor: SystemMouseCursor; - <static>+defaultCursor: SystemMouseCursor; - +autoCursor: SystemMouseCursor - ] - - [MouseEventsRegion]o-[void Function()?] - [MouseEventsRegion]o-[void Function(PointerHoverEvent)?] - [MouseEventsRegion]o-[void Function(PointerEnterEvent)?] - [MouseEventsRegion]o-[void Function(PointerExitEvent)?] - [MouseEventsRegion]o-[SystemMouseCursor] - - [ReactiveCustomColorPicker - ] - - [ReactiveFormField]<:-[ReactiveCustomColorPicker] - - [TextParagraph - | - +text: String?; - +style: TextStyle?; - +selectable: bool; - +span: List<TextSpan>? - | - +Widget build() - ] - - [TextParagraph]o-[TextStyle] - - [UnderConstruction - | - +Widget build() - ] - - [NullHelperDecoration - ] - - [InputDecoration]<:-[NullHelperDecoration] - - [ActionMenuType - | - +index: int; - <static>+values: List<ActionMenuType>; - <static>+inline: ActionMenuType; - <static>+popup: ActionMenuType - ] - - [ActionMenuType]o-[ActionMenuType] - [Enum]<:--[ActionMenuType] - - [HtmlStylingBanner - | - +isDismissed: bool; - +onDismissed: dynamic Function()? - | - +Widget build() - ] - - [HtmlStylingBanner]o-[dynamic Function()?] - - [<abstract>FormConsumerWidget - | - +Widget build() - ] - - [<abstract>FormConsumerRefWidget - | - +Widget build() - ] - - [SplashPage - | - +Widget build() - ] - - [ErrorPage - | - +error: Exception? - | - +Widget build() - ] - - [<abstract>ConsumerWidget]<:-[ErrorPage] - - [StudyULogo - | - +onTap: void Function()? - | - +Widget build() - ] - - [StudyULogo]o-[void Function()?] - - [SingleColumnLayout - | - <static>+defaultConstraints: BoxConstraints; - <static>+defaultConstraintsNarrow: BoxConstraints; - +body: Widget; - +header: Widget?; - +stickyHeader: bool; - +constraints: BoxConstraints?; - +scroll: bool; - +padding: EdgeInsets? - | - <static>+dynamic fromType() - ] - - [SingleColumnLayout]o-[BoxConstraints] - [SingleColumnLayout]o-[<abstract>Widget] - [SingleColumnLayout]o-[EdgeInsets] - - [SingleColumnLayoutType - | - +index: int; - <static>+values: List<SingleColumnLayoutType>; - <static>+boundedWide: SingleColumnLayoutType; - <static>+boundedNarrow: SingleColumnLayoutType; - <static>+stretched: SingleColumnLayoutType; - <static>+split: SingleColumnLayoutType - ] - - [SingleColumnLayoutType]o-[SingleColumnLayoutType] - [Enum]<:--[SingleColumnLayoutType] - - [Hyperlink - | - +text: String; - +url: String?; - +onClick: void Function()?; - +linkColor: Color; - +hoverColor: Color?; - +visitedColor: Color?; - +style: TextStyle?; - +hoverStyle: TextStyle?; - +visitedStyle: TextStyle?; - +icon: IconData?; - +iconSize: double? - ] - - [Hyperlink]o-[void Function()?] - [Hyperlink]o-[Color] - [Hyperlink]o-[TextStyle] - [Hyperlink]o-[IconData] - - [StandardTableColumn - | - +label: String; - +tooltip: String?; - +columnWidth: TableColumnWidth; - +sortable: bool; - +sortAscending: bool?; - +sortableIcon: Widget? - ] - - [StandardTableColumn]o-[<abstract>TableColumnWidth] - [StandardTableColumn]o-[<abstract>Widget] - - [StandardTable - | - +items: List<T>; - +inputColumns: List<StandardTableColumn>; - +onSelectItem: void Function(T); - +trailingActionsAt: List<ModelAction<dynamic>> Function(T, int)?; - +trailingActionsMenuType: ActionMenuType?; - +sortColumnPredicates: List<int Function(T, T)?>?; - +pinnedPredicates: int Function(T, T)?; - +headerRowBuilder: TableRow Function(BuildContext, List<StandardTableColumn>)?; - +dataRowBuilder: TableRow Function(BuildContext, List<StandardTableColumn>)?; - +inputTrailingActionsColumn: StandardTableColumn; - +tableWrapper: Widget Function(Widget)?; - +cellSpacing: double; - +rowSpacing: double; - +minRowHeight: double?; - +showTableHeader: bool; - +hideLeadingTrailingWhenEmpty: bool; - +leadingWidget: Widget?; - +trailingWidget: Widget?; - +leadingWidgetSpacing: double?; - +trailingWidgetSpacing: double?; - +emptyWidget: Widget?; - +rowStyle: StandardTableStyle; - +disableRowInteractions: bool - ] - - [StandardTable]o-[void Function(T)] - [StandardTable]o-[List<ModelAction<dynamic>> Function(T, int)?] - [StandardTable]o-[ActionMenuType] - [StandardTable]o-[int Function(T, T)?] - [StandardTable]o-[TableRow Function(BuildContext, List<StandardTableColumn>)?] - [StandardTable]o-[StandardTableColumn] - [StandardTable]o-[Widget Function(Widget)?] - [StandardTable]o-[<abstract>Widget] - [StandardTable]o-[StandardTableStyle] - - [StandardTableStyle - | - +index: int; - <static>+values: List<StandardTableStyle>; - <static>+plain: StandardTableStyle; - <static>+material: StandardTableStyle - ] - - [StandardTableStyle]o-[StandardTableStyle] - [Enum]<:--[StandardTableStyle] - - [IconPack - | - <static>+defaultPack: List<IconOption>; - <static>+material: List<IconOption> - | - <static>+IconOption? resolveIconByName() - ] - - [IconOption - | - +name: String; - +icon: IconData?; - +isEmpty: bool; - +props: List<Object?> - | - +String toJson(); - <static>+IconOption fromJson() - ] - - [IconOption]o-[IconData] - [<abstract>Equatable]<:-[IconOption] - - [ReactiveIconPicker - ] - - [ReactiveFocusableFormField]<:-[ReactiveIconPicker] - - [IconPicker - | - +iconOptions: List<IconOption>; - +selectedOption: IconOption?; - +onSelect: void Function(IconOption)?; - +galleryIconSize: double?; - +selectedIconSize: double?; - +focusNode: FocusNode?; - +isDisabled: bool - | - +Widget build() - ] - - [IconPicker]o-[IconOption] - [IconPicker]o-[void Function(IconOption)?] - [IconPicker]o-[FocusNode] - - [IconPickerField - | - +iconOptions: List<IconOption>; - +selectedOption: IconOption?; - +selectedIconSize: double?; - +galleryIconSize: double?; - +onSelect: void Function(IconOption)?; - +focusNode: FocusNode?; - +isDisabled: bool - | - +Widget build() - ] - - [IconPickerField]o-[IconOption] - [IconPickerField]o-[void Function(IconOption)?] - [IconPickerField]o-[FocusNode] - - [IconPickerGallery - | - +iconOptions: List<IconOption>; - +onSelect: void Function(IconOption)?; - +iconSize: double - | - +Widget build() - ] - - [IconPickerGallery]o-[void Function(IconOption)?] - - [SecondaryButton - | - +text: String; - +icon: IconData?; - +isLoading: bool; - +onPressed: void Function()? - | - +Widget build() - ] - - [SecondaryButton]o-[IconData] - [SecondaryButton]o-[void Function()?] - - [TwoColumnLayout - | - <static>+defaultDivider: VerticalDivider; - <static>+defaultContentPadding: EdgeInsets; - <static>+slimContentPadding: EdgeInsets; - +leftWidget: Widget; - +rightWidget: Widget; - +dividerWidget: Widget?; - +headerWidget: Widget?; - +flexLeft: int?; - +flexRight: int?; - +constraintsLeft: BoxConstraints?; - +constraintsRight: BoxConstraints?; - +scrollLeft: bool; - +scrollRight: bool; - +paddingLeft: EdgeInsets?; - +paddingRight: EdgeInsets?; - +backgroundColorLeft: Color?; - +backgroundColorRight: Color?; - +stretchHeight: bool - ] - - [TwoColumnLayout]o-[VerticalDivider] - [TwoColumnLayout]o-[EdgeInsets] - [TwoColumnLayout]o-[<abstract>Widget] - [TwoColumnLayout]o-[BoxConstraints] - [TwoColumnLayout]o-[Color] - - [AppTranslation - | - <static>+dynamic init() - ] - - [<abstract>PlatformLocale - | - +Locale getPlatformLocale() - ] - - [PlatformLocaleWeb - | - +Locale getPlatformLocale() - ] - - [<abstract>PlatformLocale]<:--[PlatformLocaleWeb] - - [PlatformLocaleMobile - | - +Locale getPlatformLocale() - ] - - [<abstract>PlatformLocale]<:--[PlatformLocaleMobile] - - [LanguagePicker - | - +languagePickerType: LanguagePickerType; - +iconColor: Color?; - +offset: Offset? - ] - - [LanguagePicker]o-[LanguagePickerType] - [LanguagePicker]o-[Color] - [LanguagePicker]o-[Offset] - - [LanguagePickerType - | - +index: int; - <static>+values: List<LanguagePickerType>; - <static>+field: LanguagePickerType; - <static>+icon: LanguagePickerType - ] - - [LanguagePickerType]o-[LanguagePickerType] - [Enum]<:--[LanguagePickerType] - - [<abstract>GoRouteParamEnum - | - +String toRouteParam(); - +String toShortString() - ] - - [RoutingIntents - | - <static>+root: RoutingIntent; - <static>+studies: RoutingIntent; - <static>+studiesShared: RoutingIntent; - <static>+publicRegistry: RoutingIntent; - <static>+study: RoutingIntent Function(String); - <static>+studyEdit: RoutingIntent Function(String); - <static>+studyEditInfo: RoutingIntent Function(String); - <static>+studyEditEnrollment: RoutingIntent Function(String); - <static>+studyEditInterventions: RoutingIntent Function(String); - <static>+studyEditIntervention: RoutingIntent Function(String, String); - <static>+studyEditMeasurements: RoutingIntent Function(String); - <static>+studyEditReports: RoutingIntent Function(String); - <static>+studyEditMeasurement: RoutingIntent Function(String, String); - <static>+studyTest: RoutingIntent Function(String, {String? appRoute}); - <static>+studyRecruit: RoutingIntent Function(String); - <static>+studyMonitor: RoutingIntent Function(String); - <static>+studyAnalyze: RoutingIntent Function(String); - <static>+studySettings: RoutingIntent Function(String); - <static>+accountSettings: RoutingIntent; - <static>+studyNew: RoutingIntent; - <static>+login: RoutingIntent; - <static>+signup: RoutingIntent; - <static>+passwordForgot: RoutingIntent; - <static>+passwordForgot2: RoutingIntent Function(String); - <static>+passwordRecovery: RoutingIntent; - <static>+error: RoutingIntent Function(Exception) - ] - - [RoutingIntents]o-[RoutingIntent] - [RoutingIntents]o-[RoutingIntent Function(String)] - [RoutingIntents]o-[RoutingIntent Function(String, String)] - [RoutingIntents]o-[RoutingIntent Function(String, {String? appRoute})] - [RoutingIntents]o-[RoutingIntent Function(Exception)] - - [RoutingIntent - | - +route: GoRoute; - +params: Map<String, String>; - +queryParams: Map<String, String>; - +dispatch: RoutingIntentDispatch?; - +extra: Object?; - +routeName: String; - +arguments: Map<String, String>; - +props: List<Object?> - | - -dynamic _validateRoute(); - +bool matches() - ] - - [RoutingIntent]o-[GoRoute] - [RoutingIntent]o-[RoutingIntentDispatch] - [<abstract>Equatable]<:-[RoutingIntent] - - [RoutingIntentDispatch - | - +index: int; - <static>+values: List<RoutingIntentDispatch>; - <static>+go: RoutingIntentDispatch; - <static>+push: RoutingIntentDispatch - ] - - [RoutingIntentDispatch]o-[RoutingIntentDispatch] - [Enum]<:--[RoutingIntentDispatch] - - [RouterKeys - | - <static>+studyKey: ValueKey<String>; - <static>+authKey: ValueKey<String> - ] - - [RouterKeys]o-[ValueKey] - - [RouteParams - | - <static>+studiesFilter: String; - <static>+studyId: String; - <static>+measurementId: String; - <static>+interventionId: String; - <static>+testAppRoute: String - ] - - [RouterConf - | - <static>+router: GoRouter; - <static>+routes: List<GoRoute>; - <static>+publicRoutes: List<GoRoute>; - <static>+privateRoutes: List<GoRoute> - | - <static>+GoRoute route() - ] - - [RouterConf]o-[GoRouter] - - [<abstract>StudyFormRouteArgs - | - +studyId: String - ] - - [<abstract>QuestionFormRouteArgs - | - +questionId: String - ] - - [<abstract>StudyFormRouteArgs]<:-[<abstract>QuestionFormRouteArgs] - - [ScreenerQuestionFormRouteArgs - ] - - [<abstract>QuestionFormRouteArgs]<:-[ScreenerQuestionFormRouteArgs] - - [ConsentItemFormRouteArgs - | - +consentId: String - ] - - [<abstract>StudyFormRouteArgs]<:-[ConsentItemFormRouteArgs] - - [MeasurementFormRouteArgs - | - +measurementId: String - ] - - [<abstract>StudyFormRouteArgs]<:-[MeasurementFormRouteArgs] - - [SurveyQuestionFormRouteArgs - | - +questionId: String - ] - - [MeasurementFormRouteArgs]<:-[SurveyQuestionFormRouteArgs] - [<abstract>QuestionFormRouteArgs]<:--[SurveyQuestionFormRouteArgs] - - [InterventionFormRouteArgs - | - +interventionId: String - ] - - [<abstract>StudyFormRouteArgs]<:-[InterventionFormRouteArgs] - - [InterventionTaskFormRouteArgs - | - +taskId: String - ] - - [InterventionFormRouteArgs]<:-[InterventionTaskFormRouteArgs] - - [ReportItemFormRouteArgs - | - +sectionId: String - ] - - [<abstract>StudyFormRouteArgs]<:-[ReportItemFormRouteArgs] - - [DropdownMenuItemTheme - | - +iconTheme: IconThemeData? - ] - - [DropdownMenuItemTheme]o-[IconThemeData] - [<abstract>Diagnosticable]<:-[DropdownMenuItemTheme] - - [ThemeConfig - | - <static>+kMinContentWidth: double; - <static>+kMaxContentWidth: double; - <static>+kHoverFadeFactor: double; - <static>+kMuteFadeFactor: double - | - <static>+dynamic bodyBackgroundColor(); - <static>+Color modalBarrierColor(); - <static>+Color containerColor(); - <static>+Color colorPickerInitialColor(); - <static>+TextStyle bodyTextMuted(); - <static>+TextStyle bodyTextBackground(); - <static>+double iconSplashRadius(); - <static>+Color sidesheetBackgroundColor(); - <static>+InputDecorationTheme dropdownInputDecorationTheme(); - <static>+DropdownMenuItemTheme dropdownMenuItemTheme() - ] - - [NoAnimationPageTransitionsBuilder - | - +Widget buildTransitions() - ] - - [<abstract>PageTransitionsBuilder]<:-[NoAnimationPageTransitionsBuilder] - - [WebTransitionBuilder - | - +Widget buildTransitions() - ] - - [<abstract>PageTransitionsBuilder]<:-[WebTransitionBuilder] - - [ThemeSettingChange - | - +settings: ThemeSettings - ] - - [ThemeSettingChange]o-[ThemeSettings] - [<abstract>Notification]<:-[ThemeSettingChange] - - [ThemeProvider - | - +settings: ValueNotifier<ThemeSettings>; - +lightDynamic: ColorScheme?; - +darkDynamic: ColorScheme?; - +pageTransitionsTheme: PageTransitionsTheme; - +shapeMedium: ShapeBorder - | - +Color custom(); - +Color blend(); - +Color source(); - +ColorScheme colors(); - +CardTheme cardTheme(); - +ListTileThemeData listTileTheme(); - +AppBarTheme appBarTheme(); - +SnackBarThemeData snackBarThemeData(); - +TabBarTheme tabBarTheme(); - +BottomAppBarTheme bottomAppBarTheme(); - +BottomNavigationBarThemeData bottomNavigationBarTheme(); - +SwitchThemeData switchTheme(); - +InputDecorationTheme inputDecorationTheme(); - +TextTheme textTheme(); - +DividerThemeData dividerTheme(); - +NavigationRailThemeData navigationRailTheme(); - +DrawerThemeData drawerTheme(); - +IconThemeData iconTheme(); - +CheckboxThemeData checkboxTheme(); - +RadioThemeData radioTheme(); - +TooltipThemeData tooltipTheme(); - +ThemeData light(); - +ThemeData dark(); - +ThemeMode themeMode(); - +ThemeData theme(); - <static>+ThemeProvider of(); - +bool updateShouldNotify() - ] - - [ThemeProvider]o-[ValueNotifier] - [ThemeProvider]o-[ColorScheme] - [ThemeProvider]o-[PageTransitionsTheme] - [ThemeProvider]o-[<abstract>ShapeBorder] - [<abstract>InheritedWidget]<:-[ThemeProvider] - - [ThemeSettings - | - +sourceColor: Color; - +themeMode: ThemeMode - ] - - [ThemeSettings]o-[Color] - [ThemeSettings]o-[ThemeMode] - - [CustomColor - | - +name: String; - +color: Color; - +blend: bool - | - +Color value() - ] - - [CustomColor]o-[Color] - - [SuppressedBehaviorSubject - | - +subject: BehaviorSubject<T>; - +didSuppressInitialEvent: bool; - -_controller: StreamController<T> - | - -StreamController<T> _buildDerivedController(); - +dynamic close() - ] - - [SuppressedBehaviorSubject]o-[BehaviorSubject] - [SuppressedBehaviorSubject]o-[StreamController] - - [Time - | - <static>+dynamic fromTimeOfDay(); - +Map<String, dynamic> toJson(); - <static>+Time fromJson() - ] - - [TimeOfDay]<:-[Time] - - [TimeValueAccessor - | - +String modelToViewValue(); - +Time? viewToModelValue(); - -String _addLeadingZeroIfNeeded() - ] - - [<abstract>ControlValueAccessor]<:-[TimeValueAccessor] - - [ModelAction - | - +type: T; - +label: String; - +icon: IconData?; - +onExecute: Function; - +isAvailable: bool; - +isDestructive: bool - ] - - [ModelAction]o-[IconData] - - [<abstract>IModelActionProvider - | - +List<ModelAction<dynamic>> availableActions() - ] - - [<abstract>IListActionProvider - | - +void onSelectItem(); - +void onNewItem() - ] - - [<abstract>IModelActionProvider]<:-[<abstract>IListActionProvider] - - [ModelActionType - | - +index: int; - <static>+values: List<ModelActionType>; - <static>+edit: ModelActionType; - <static>+delete: ModelActionType; - <static>+remove: ModelActionType; - <static>+duplicate: ModelActionType; - <static>+clipboard: ModelActionType; - <static>+primary: ModelActionType - ] - - [ModelActionType]o-[ModelActionType] - [Enum]<:--[ModelActionType] - - [OptimisticUpdate - | - +applyOptimistic: void Function(); - +apply: dynamic Function(); - +rollback: void Function(); - +onUpdate: void Function()?; - +onError: void Function(Object, StackTrace?)?; - +rethrowErrors: bool; - +runOptimistically: bool; - +completeFutureOptimistically: bool - | - +dynamic execute(); - -void _runUpdateHandlerIfAny() - ] - - [OptimisticUpdate]o-[void Function()] - [OptimisticUpdate]o-[dynamic Function()] - [OptimisticUpdate]o-[void Function()?] - [OptimisticUpdate]o-[void Function(Object, StackTrace?)?] - - [<abstract>FileFormatEncoder - | - +dynamic encodeAsync(); - +String encode(); - +dynamic call() - ] - - [CSVStringEncoder - | - +String encode() - ] - - [<abstract>FileFormatEncoder]<:-[CSVStringEncoder] - - [JsonStringEncoder - | - +String encode() - ] - - [<abstract>FileFormatEncoder]<:-[JsonStringEncoder] - - [<abstract>ExecutionLimiter - | - +milliseconds: int; - <static>-_timer: Timer? - | - +void dispose() - ] - - [<abstract>ExecutionLimiter]o-[Timer] - - [Debouncer - | - +leading: bool; - +cancelUncompleted: bool; - -_uncompletedFutureOperation: CancelableOperation<dynamic>? - | - +dynamic call() - ] - - [Debouncer]o-[CancelableOperation] - [<abstract>ExecutionLimiter]<:-[Debouncer] - - [Throttler - | - +dynamic call() - ] - - [<abstract>ExecutionLimiter]<:-[Throttler] - - [SerializableColor - | - +Map<String, dynamic> toJson(); - <static>+SerializableColor fromJson() - ] - - [Color]<:-[SerializableColor] - - [<abstract>IProviderArgsResolver - | - +R provide() - ] - - [CombinedStreamNotifier - | - -_subscriptions: List<StreamSubscription<dynamic>> - | - +void dispose() - ] - - [ChangeNotifier]<:-[CombinedStreamNotifier] - - [CountWhereValidator - | - +predicate: bool Function(T?); - +minCount: int?; - +maxCount: int?; - <static>+kValidationMessageMinCount: String; - <static>+kValidationMessageMaxCount: String - | - +Map<String, dynamic>? validate() - ] - - [CountWhereValidator]o-[bool Function(T?)] - [<abstract>Validator]<:-[CountWhereValidator] - - [Patterns - | - <static>+timeFormatString: String; - <static>+emailFormatString: String; - <static>+url: String - ] - - [NumericalRangeFormatter - | - +min: int?; - +max: int? - | - +TextEditingValue formatEditUpdate() - ] - - [<abstract>TextInputFormatter]<:-[NumericalRangeFormatter] - - [StudySequenceFormatter - | - +TextEditingValue formatEditUpdate() - ] - - [<abstract>TextInputFormatter]<:-[StudySequenceFormatter] - - [Tuple - | - +first: T1; - +second: T2; - +props: List<Object?> - | - +Map<String, dynamic> toJson(); - <static>+Tuple<dynamic, dynamic> fromJson(); - +Tuple<T1, T2> copy(); - +Tuple<T1, T2> copyWith() - ] - - [<abstract>Equatable]<:-[Tuple] - - [<abstract>JsonFileLoader - | - +jsonAssetsPath: String - | - +dynamic loadJson(); - +dynamic parseJsonMapFromAssets(); - +dynamic parseJsonListFromAssets() - ] - - [<abstract>IAppDelegate - | - +dynamic onAppStart() - ] - - [AppController - | - +appDelegates: List<IAppDelegate>; - -_delayedFuture: dynamic; - +isInitialized: dynamic - | - +dynamic onAppStart(); - -dynamic _callDelegates() - ] - - [StudyMonitorScreen - | - +Widget build() - ] - - [<abstract>StudyPageWidget]<:-[StudyMonitorScreen] - - [LoginForm - | - +formKey: AuthFormKey - | - +Widget build() - ] - - [LoginForm]o-[AuthFormKey] - [<abstract>FormConsumerRefWidget]<:-[LoginForm] - - [PasswordRecoveryForm - | - +formKey: AuthFormKey - | - +Widget build() - ] - - [PasswordRecoveryForm]o-[AuthFormKey] - [<abstract>FormConsumerRefWidget]<:-[PasswordRecoveryForm] - - [PasswordForgotForm - | - +formKey: AuthFormKey - | - +Widget build() - ] - - [PasswordForgotForm]o-[AuthFormKey] - [<abstract>FormConsumerRefWidget]<:-[PasswordForgotForm] - - [SignupForm - | - +formKey: AuthFormKey - | - +Widget build(); - -dynamic _onClickTermsOfUse(); - -dynamic _onClickPrivacyPolicy() - ] - - [SignupForm]o-[AuthFormKey] - [<abstract>FormConsumerRefWidget]<:-[SignupForm] - - [AuthScaffold - | - +body: Widget; - +formKey: AuthFormKey; - +leftContentMinWidth: double; - +leftPanelMinWidth: double; - +leftPanelPadding: EdgeInsets - ] - - [AuthScaffold]o-[<abstract>Widget] - [AuthScaffold]o-[AuthFormKey] - [AuthScaffold]o-[EdgeInsets] - - [EmailTextField - | - +labelText: String; - +hintText: String?; - +formControlName: String?; - +formControl: FormControl<dynamic>? - ] - - [EmailTextField]o-[FormControl] - - [PasswordTextField - | - +labelText: String; - +hintText: String?; - +onSubmitted: dynamic Function(FormControl<dynamic>)?; - +formControlName: String?; - +formControl: FormControl<dynamic>? - ] - - [PasswordTextField]o-[dynamic Function(FormControl<dynamic>)?] - [PasswordTextField]o-[FormControl] - - [StudyUJobsToBeDone - | - +Widget build() - ] - - [AuthFormController - | - +authRepository: IAuthRepository; - +notificationService: INotificationService; - +router: GoRouter; - +emailControl: FormControl<String>; - +passwordControl: FormControl<String>; - +passwordConfirmationControl: FormControl<String>; - +termsOfServiceControl: FormControl<bool>; - <static>+authValidationMessages: Map<String, String Function(dynamic)>; - +loginForm: FormGroup; - +signupForm: FormGroup; - +passwordForgotForm: FormGroup; - +passwordRecoveryForm: FormGroup; - +controlValidatorsByForm: Map<AuthFormKey, Map<FormControl<dynamic>, List<Validator<dynamic>>>>; - -_formKey: AuthFormKey; - +formKey: AuthFormKey; - +form: FormGroup - | - -dynamic _getFormFor(); - -dynamic _onChangeFormKey(); - +dynamic resetControlsFor(); - -dynamic _forceValidationMessages(); - +dynamic signUp(); - -dynamic _signUp(); - +dynamic signIn(); - -dynamic _signInWith(); - +dynamic signOut(); - +dynamic resetPasswordForEmail(); - +dynamic sendPasswordResetLink(); - +dynamic recoverPassword(); - +dynamic updateUser(); - -dynamic _readDebugUser() - ] - - [AuthFormController]o-[<abstract>IAuthRepository] - [AuthFormController]o-[<abstract>INotificationService] - [AuthFormController]o-[GoRouter] - [AuthFormController]o-[FormControl] - [AuthFormController]o-[FormGroup] - [AuthFormController]o-[AuthFormKey] - [<abstract>IFormGroupController]<:--[AuthFormController] - - [AuthFormKey - | - +index: int; - <static>+values: List<AuthFormKey>; - <static>+login: AuthFormKey; - <static>+signup: AuthFormKey; - <static>+passwordForgot: AuthFormKey; - <static>+passwordRecovery: AuthFormKey; - <static>-_loginSubmit: AuthFormKey; - <static>-_signupSubmit: AuthFormKey - ] - - [AuthFormKey]o-[AuthFormKey] - [Enum]<:--[AuthFormKey] - - [AppStatus - | - +index: int; - <static>+values: List<AppStatus>; - <static>+initializing: AppStatus; - <static>+initialized: AppStatus - ] - - [AppStatus]o-[AppStatus] - [Enum]<:--[AppStatus] - - [FormArrayTable - | - +control: AbstractControl<dynamic>; - +items: List<T>; - +onSelectItem: void Function(T); - +getActionsAt: List<ModelAction<dynamic>> Function(T, int); - +onNewItem: void Function()?; - +rowTitle: String Function(T); - +onNewItemLabel: String; - +sectionTitle: String?; - +sectionDescription: String?; - +emptyIcon: IconData?; - +emptyTitle: String?; - +emptyDescription: String?; - +sectionTitleDivider: bool?; - +rowPrefix: Widget Function(BuildContext, T, int)?; - +rowSuffix: Widget Function(BuildContext, T, int)?; - +leadingWidget: Widget?; - +itemsSectionPadding: EdgeInsets?; - +hideLeadingTrailingWhenEmpty: bool; - <static>+columns: List<StandardTableColumn> - | - +Widget build(); - -List<Widget> _buildRow(); - -Widget _newItemButton() - ] - - [FormArrayTable]o-[<abstract>AbstractControl] - [FormArrayTable]o-[void Function(T)] - [FormArrayTable]o-[List<ModelAction<dynamic>> Function(T, int)] - [FormArrayTable]o-[void Function()?] - [FormArrayTable]o-[String Function(T)] - [FormArrayTable]o-[IconData] - [FormArrayTable]o-[Widget Function(BuildContext, T, int)?] - [FormArrayTable]o-[<abstract>Widget] - [FormArrayTable]o-[EdgeInsets] - - [<abstract>ManagedFormViewModel - | - +ManagedFormViewModel<T> createDuplicate() - ] - - [<abstract>FormViewModel]<:-[<abstract>ManagedFormViewModel] - - [FormViewModelNotFoundException - ] - - [Exception]<:--[FormViewModelNotFoundException] - - [FormViewModelCollection - | - +formViewModels: List<T>; - +formArray: FormArray<dynamic>; - +stagedViewModels: List<T>; - +retrievableViewModels: List<T>; - +formData: List<D> - | - +void add(); - +T remove(); - +T? findWhere(); - +T? removeWhere(); - +bool contains(); - +void stage(); - +T commit(); - +void reset(); - +void read() - ] - - [FormViewModelCollection]o-[FormArray] - - [CustomFormControl - | - -_onValueChangedDebouncer: Debouncer?; - -_onStatusChangedDebouncer: Debouncer?; - +onValueChanged: void Function(T?)?; - +onStatusChanged: void Function(ControlStatus)?; - +onStatusChangedDebounceTime: int?; - +onValueChangedDebounceTime: int? - | - +void dispose() - ] - - [CustomFormControl]o-[Debouncer] - [CustomFormControl]o-[void Function(T?)?] - [CustomFormControl]o-[void Function(ControlStatus)?] - [FormControl]<:-[CustomFormControl] - - [UnsavedChangesDialog - | - +Widget build() - ] - - [<abstract>FormValidationSetEnum - ] - - [FormControlValidation - | - +control: AbstractControl<dynamic>; - +validators: List<Validator<dynamic>>; - +asyncValidators: List<AsyncValidator<dynamic>>?; - +validationMessages: Map<String, String Function(Object)> - | - +FormControlValidation merge() - ] - - [FormControlValidation]o-[<abstract>AbstractControl] - - [<abstract>IFormData - | - +id: String - | - +IFormData copy() - ] - - [FormInvalidException - ] - - [Exception]<:--[FormInvalidException] - - [FormConfigException - | - +message: String? - ] - - [Exception]<:--[FormConfigException] - - [<abstract>IFormViewModelDelegate - | - +dynamic onSave(); - +void onCancel() - ] - - [<abstract>IFormGroupController - | - +form: FormGroup - ] - - [<abstract>IFormGroupController]o-[FormGroup] - - [FormControlOption - | - +value: T; - +label: String; - +description: String?; - +props: List<Object?> - ] - - [<abstract>Equatable]<:-[FormControlOption] - - [<abstract>FormViewModel - | - -_formData: T?; - -_formMode: FormMode; - -_validationSet: FormValidationSetEnum?; - +delegate: IFormViewModelDelegate<FormViewModel<dynamic>>?; - +autosave: bool; - -_immediateFormChildrenSubscriptions: List<StreamSubscription<dynamic>>; - -_immediateFormChildrenListenerDebouncer: Debouncer?; - -_autosaveOperation: CancelableOperation<dynamic>?; - -_defaultControlValidators: Map<String, Tuple<List<Validator<dynamic>>, List<AsyncValidator<dynamic>>>>; - +prevFormValue: Map<String, dynamic>?; - <static>-_formKey: String; - +formData: T?; - +formMode: FormMode; - +isReadonly: bool; - +validationSet: FormValidationSetEnum?; - +isDirty: bool; - +title: String; - +isValid: bool; - +titles: Map<FormMode, String>; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - | - -dynamic _setFormData(); - -dynamic _rememberDefaultControlValidators(); - -Tuple<List<Validator<dynamic>>, List<AsyncValidator<dynamic>>>? _getDefaultValidators(); - -dynamic _disableAllControls(); - -dynamic _formModeUpdated(); - -dynamic _restoreControlsFromFormData(); - +void revalidate(); - -void _applyValidationSet(); - +void read(); - +dynamic save(); - +dynamic cancel(); - +void enableAutosave(); - +void listenToImmediateFormChildren(); - +dynamic markFormGroupChanged(); - +void dispose(); - +void setControlsFrom(); - +T buildFormData(); - +void initControls() - ] - - [<abstract>FormViewModel]o-[FormMode] - [<abstract>FormViewModel]o-[<abstract>FormValidationSetEnum] - [<abstract>FormViewModel]o-[<abstract>IFormViewModelDelegate] - [<abstract>FormViewModel]o-[Debouncer] - [<abstract>FormViewModel]o-[CancelableOperation] - [<abstract>IFormGroupController]<:--[<abstract>FormViewModel] - - [FormMode - | - +index: int; - <static>+values: List<FormMode>; - <static>+create: FormMode; - <static>+readonly: FormMode; - <static>+edit: FormMode - ] - - [FormMode]o-[FormMode] - [Enum]<:--[FormMode] - - [EnrolledBadge - | - +enrolledCount: int - | - +Widget build() - ] - - [StudyRecruitController - | - +inviteCodeRepository: IInviteCodeRepository; - -_invitesSubscription: StreamSubscription<List<WrappedModel<StudyInvite>>>? - | - -dynamic _subscribeInvites(); - +Intervention? getIntervention(); - +int getParticipantCountForInvite(); - +List<ModelAction<dynamic>> availableActions(); - +List<ModelAction<dynamic>> availableInlineActions(); - +void dispose() - ] - - [StudyRecruitController]o-[<abstract>IInviteCodeRepository] - [StudyRecruitController]o-[StreamSubscription] - [StudyBaseController]<:-[StudyRecruitController] - [<abstract>IModelActionProvider]<:--[StudyRecruitController] - - [StudyRecruitScreen - | - +Widget build(); - -Widget _inviteCodesSectionHeader(); - -Widget _newInviteCodeButton(); - -dynamic _onSelectInvite() - ] - - [<abstract>StudyPageWidget]<:-[StudyRecruitScreen] - - [InviteCodeFormView - | - +formViewModel: InviteCodeFormViewModel - | - +Widget build(); - -List<FormTableRow> _conditionalInterventionRows() - ] - - [InviteCodeFormView]o-[InviteCodeFormViewModel] - [<abstract>FormConsumerWidget]<:-[InviteCodeFormView] - - [StudyInvitesTable - | - +invites: List<StudyInvite>; - +onSelect: void Function(StudyInvite); - +getActions: List<ModelAction<dynamic>> Function(StudyInvite); - +getInlineActions: List<ModelAction<dynamic>> Function(StudyInvite); - +getIntervention: Intervention? Function(String); - +getParticipantCountForInvite: int Function(StudyInvite) - | - +Widget build(); - -List<Widget> _buildRow() - ] - - [StudyInvitesTable]o-[void Function(StudyInvite)] - [StudyInvitesTable]o-[List<ModelAction<dynamic>> Function(StudyInvite)] - [StudyInvitesTable]o-[Intervention? Function(String)] - [StudyInvitesTable]o-[int Function(StudyInvite)] - - [InviteCodeFormViewModel - | - +study: Study; - +inviteCodeRepository: IInviteCodeRepository; - +codeControl: FormControl<String>; - +codeControlValidationMessages: Map<String, String Function(dynamic)>; - +isPreconfiguredScheduleControl: FormControl<bool>; - +preconfiguredScheduleTypeControl: FormControl<PhaseSequence>; - +interventionAControl: FormControl<String>; - +interventionBControl: FormControl<String>; - +form: FormGroup; - +titles: Map<FormMode, String>; - +interventionControlOptions: List<FormControlOption<String>>; - +preconfiguredScheduleTypeOptions: List<FormControlOption<PhaseSequence>>; - +isPreconfiguredSchedule: bool; - +preconfiguredSchedule: List<String>? - | - +void initControls(); - -dynamic _uniqueInviteCode(); - +void regenerateCode(); - -String _generateCode(); - +StudyInvite buildFormData(); - +void setControlsFrom(); - +dynamic save() - ] - - [InviteCodeFormViewModel]o-[Study] - [InviteCodeFormViewModel]o-[<abstract>IInviteCodeRepository] - [InviteCodeFormViewModel]o-[FormControl] - [InviteCodeFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[InviteCodeFormViewModel] - - [PublishSuccessDialog - | - +Widget build() - ] - - [<abstract>StudyPageWidget]<:-[PublishSuccessDialog] - - [PublishDialog - | - +Widget build() - ] - - [<abstract>StudyPageWidget]<:-[PublishDialog] - - [PublishConfirmationDialog - | - +Widget build() - ] - - [<abstract>StudyPageWidget]<:-[PublishConfirmationDialog] - - [FrameControlsWidget - | - +onRefresh: void Function()?; - +onOpenNewTab: void Function()?; - +enabled: bool - | - +Widget build() - ] - - [FrameControlsWidget]o-[void Function()?] - [<abstract>ConsumerWidget]<:-[FrameControlsWidget] - - [<abstract>IStudyStatusBadgeViewModel - | - +studyParticipation: Participation?; - +studyStatus: StudyStatus? - ] - - [<abstract>IStudyStatusBadgeViewModel]o-[Participation] - [<abstract>IStudyStatusBadgeViewModel]o-[StudyStatus] - - [StudyStatusBadge - | - +participation: Participation?; - +status: StudyStatus?; - +type: BadgeType; - +showPrefixIcon: bool; - +showTooltip: bool - | - +Widget build() - ] - - [StudyStatusBadge]o-[Participation] - [StudyStatusBadge]o-[StudyStatus] - [StudyStatusBadge]o-[BadgeType] - - [RouteInformation - | - +route: String?; - +extra: String?; - +cmd: String?; - +data: String? - | - +String toString() - ] - - [<abstract>PlatformController - | - +studyId: String; - +baseSrc: String; - +previewSrc: String; - +routeInformation: RouteInformation; - +frameWidget: Widget - | - +void activate(); - +void registerViews(); - +void generateUrl(); - +void navigate(); - +void refresh(); - +void listen(); - +void send(); - +void openNewPage() - ] - - [<abstract>PlatformController]o-[RouteInformation] - [<abstract>PlatformController]o-[<abstract>Widget] - - [WebController - | - +iFrameElement: IFrameElement - | - +void activate(); - +void registerViews(); - +void generateUrl(); - +void navigate(); - +void refresh(); - +void openNewPage(); - +void listen(); - +void send() - ] - - [WebController]o-[IFrameElement] - [<abstract>PlatformController]<:-[WebController] - - [MobileController - | - +void openNewPage(); - +void refresh(); - +void registerViews(); - +void listen(); - +void send(); - +void navigate(); - +void activate(); - +void generateUrl() - ] - - [<abstract>PlatformController]<:-[MobileController] - - [StudyController - | - +notificationService: INotificationService; - +studyEventsSubscription: StreamSubscription<ModelEvent<Study>>?; - +studyActions: List<ModelAction<dynamic>> - | - +dynamic syncStudyStatus(); - +dynamic onStudySubscriptionUpdate(); - -dynamic _redirectNewToActualStudyID(); - +dynamic publishStudy(); - +void onChangeStudyParticipation(); - +void onAddParticipants(); - +void onSettingsPressed(); - +void dispose() - ] - - [StudyController]o-[<abstract>INotificationService] - [StudyController]o-[StreamSubscription] - [StudyBaseController]<:-[StudyController] - - [<abstract>IStudyNavViewModel - | - +isEditTabEnabled: bool; - +isTestTabEnabled: bool; - +isRecruitTabEnabled: bool; - +isMonitorTabEnabled: bool; - +isAnalyzeTabEnabled: bool; - +isSettingsEnabled: bool - ] - - [StudyNav - | - <static>+dynamic tabs(); - <static>+dynamic edit(); - <static>+dynamic test(); - <static>+dynamic recruit(); - <static>+dynamic monitor(); - <static>+dynamic analyze() - ] - - [StudyDesignNav - | - <static>+dynamic tabs(); - <static>+dynamic info(); - <static>+dynamic enrollment(); - <static>+dynamic interventions(); - <static>+dynamic measurements(); - <static>+dynamic reports() - ] - - [<abstract>StudyPageWidget - | - +studyId: String - | - +Widget? banner() - ] - - [<abstract>ConsumerWidget]<:-[<abstract>StudyPageWidget] - [<abstract>IWithBanner]<:--[<abstract>StudyPageWidget] - - [StudyParticipationBadge - | - +participation: Participation; - +type: BadgeType; - +showPrefixIcon: bool; - +center: bool - | - +Widget build() - ] - - [StudyParticipationBadge]o-[Participation] - [StudyParticipationBadge]o-[BadgeType] - - [StudyBaseController - | - +studyId: String; - +studyRepository: IStudyRepository; - +router: GoRouter; - +studySubscription: StreamSubscription<WrappedModel<Study>>? - | - +dynamic subscribeStudy(); - +dynamic onStudySubscriptionUpdate(); - +dynamic onStudySubscriptionError(); - +void dispose() - ] - - [StudyBaseController]o-[<abstract>IStudyRepository] - [StudyBaseController]o-[GoRouter] - [StudyBaseController]o-[StreamSubscription] - - [PreviewFrame - | - +studyId: String; - +routeArgs: StudyFormRouteArgs?; - +route: String? - ] - - [PreviewFrame]o-[<abstract>StudyFormRouteArgs] - - [<abstract>IStudyAppBarViewModel - | - +isSyncIndicatorVisible: bool; - +isStatusBadgeVisible: bool; - +isPublishVisible: bool - ] - - [<abstract>IStudyStatusBadgeViewModel]<:--[<abstract>IStudyAppBarViewModel] - [<abstract>IStudyNavViewModel]<:--[<abstract>IStudyAppBarViewModel] - - [StudyScaffold - | - +studyId: String; - +tabs: List<NavbarTab>?; - +tabsSubnav: List<NavbarTab>?; - +selectedTab: NavbarTab?; - +selectedTabSubnav: NavbarTab?; - +body: StudyPageWidget; - +drawer: Widget?; - +disableActions: bool; - +actionsSpacing: double; - +actionsPadding: double; - +layoutType: SingleColumnLayoutType?; - +appbarHeight: double; - +appbarSubnavHeight: double - ] - - [StudyScaffold]o-[NavbarTab] - [StudyScaffold]o-[<abstract>StudyPageWidget] - [StudyScaffold]o-[<abstract>Widget] - [StudyScaffold]o-[SingleColumnLayoutType] - - [WebFrame - | - +previewSrc: String; - +studyId: String - | - +Widget build() - ] - - [DisabledFrame - | - +Widget build() - ] - - [PhoneContainer - | - <static>+defaultWidth: double; - <static>+defaultHeight: double; - +width: double; - +height: double; - +borderColor: Color; - +borderWidth: double; - +borderRadius: double; - +innerContent: Widget; - +innerContentBackgroundColor: Color? - | - +Widget build() - ] - - [PhoneContainer]o-[Color] - [PhoneContainer]o-[<abstract>Widget] - - [MobileFrame - | - +Widget build() - ] - - [DesktopFrame - | - +Widget build() - ] - - [StudyTestScreen - | - +previewRoute: String? - | - +Widget build(); - +Widget? banner(); - +dynamic load(); - +dynamic save(); - +dynamic showHelp() - ] - - [<abstract>StudyPageWidget]<:-[StudyTestScreen] - - [StudySettingsFormViewModel - | - +study: AsyncValue<Study>; - +studyRepository: IStudyRepository; - <static>+defaultPublishedToRegistry: bool; - <static>+defaultPublishedToRegistryResults: bool; - +isPublishedToRegistryControl: FormControl<bool>; - +isPublishedToRegistryResultsControl: FormControl<bool>; - +form: FormGroup; - +titles: Map<FormMode, String> - | - +void setControlsFrom(); - +Study buildFormData(); - +dynamic keepControlsSynced(); - +dynamic save(); - +dynamic setLaunchDefaults() - ] - - [StudySettingsFormViewModel]o-[<abstract>AsyncValue] - [StudySettingsFormViewModel]o-[<abstract>IStudyRepository] - [StudySettingsFormViewModel]o-[FormControl] - [StudySettingsFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[StudySettingsFormViewModel] - - [StudySettingsDialog - | - +Widget build() - ] - - [<abstract>StudyPageWidget]<:-[StudySettingsDialog] - - [StudyTestController - | - +authRepository: IAuthRepository; - +languageCode: String - ] - - [StudyTestController]o-[<abstract>IAuthRepository] - [StudyBaseController]<:-[StudyTestController] - - [TestAppRoutes - | - <static>+studyOverview: String; - <static>+eligibility: String; - <static>+intervention: String; - <static>+consent: String; - <static>+journey: String; - <static>+dashboard: String - ] - - [DrawerEntry - | - +localizedTitle: String Function(); - +icon: IconData?; - +localizedHelpText: String Function()?; - +enabled: bool; - +onSelected: void Function(BuildContext, WidgetRef)?; - +autoCloseDrawer: bool; - +title: String; - +helpText: String? - | - +void onClick() - ] - - [DrawerEntry]o-[String Function()] - [DrawerEntry]o-[IconData] - [DrawerEntry]o-[String Function()?] - [DrawerEntry]o-[void Function(BuildContext, WidgetRef)?] - - [GoRouterDrawerEntry - | - +intent: RoutingIntent; - +onNavigated: void Function()? - | - +void onClick() - ] - - [GoRouterDrawerEntry]o-[RoutingIntent] - [GoRouterDrawerEntry]o-[void Function()?] - [DrawerEntry]<:-[GoRouterDrawerEntry] - - [AppDrawer - | - +width: int; - +autoCloseDrawer: bool; - +leftPaddingEntries: double; - +logoPaddingVertical: double; - +logoPaddingHorizontal: double; - +logoMaxHeight: double; - +logoSectionMinHeight: double; - +logoSectionMaxHeight: double - ] - - [StudyAnalyzeScreen - | - +Widget? banner(); - +Widget build() - ] - - [<abstract>StudyPageWidget]<:-[StudyAnalyzeScreen] - - [StudyAnalyzeController - | - +dynamic onExport() - ] - - [StudyBaseController]<:-[StudyAnalyzeController] - - [StudyDesignInterventionsFormView - | - +Widget build() - ] - - [<abstract>StudyDesignPageWidget]<:-[StudyDesignInterventionsFormView] - - [InterventionFormView - | - +formViewModel: InterventionFormViewModel - ] - - [InterventionFormView]o-[InterventionFormViewModel] - - [InterventionPreview - | - +routeArgs: InterventionFormRouteArgs - | - +Widget build() - ] - - [InterventionPreview]o-[InterventionFormRouteArgs] - [<abstract>ConsumerWidget]<:-[InterventionPreview] - - [StudyScheduleFormView - | - +formViewModel: StudyScheduleControls - | - -FormTableRow _renderCustomSequence(); - +Widget build() - ] - - [StudyScheduleFormView]o-[<abstract>StudyScheduleControls] - [<abstract>FormConsumerWidget]<:-[StudyScheduleFormView] - - [InterventionTaskFormData - | - +taskId: String; - +taskTitle: String; - +taskDescription: String?; - <static>+kDefaultTitle: String; - +id: String - | - +CheckmarkTask toTask(); - +InterventionTaskFormData copy() - ] - - [<abstract>IFormDataWithSchedule]<:-[InterventionTaskFormData] - - [InterventionsFormViewModel - | - +study: Study; - +router: GoRouter; - +interventionsArray: FormArray<dynamic>; - +interventionsCollection: FormViewModelCollection<InterventionFormViewModel, InterventionFormData>; - +form: FormGroup; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +interventionsRequired: dynamic; - +titles: Map<FormMode, String>; - +canTestStudySchedule: bool - | - +void setControlsFrom(); - +InterventionsFormData buildFormData(); - +void read(); - +List<ModelAction<dynamic>> availableActions(); - +List<ModelAction<dynamic>> availablePopupActions(); - +List<ModelAction<dynamic>> availableInlineActions(); - +void onSelectItem(); - +void onNewItem(); - +InterventionFormViewModel provide(); - +void onCancel(); - +dynamic onSave(); - +dynamic testStudySchedule() - ] - - [InterventionsFormViewModel]o-[Study] - [InterventionsFormViewModel]o-[GoRouter] - [InterventionsFormViewModel]o-[FormArray] - [InterventionsFormViewModel]o-[FormViewModelCollection] - [InterventionsFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[InterventionsFormViewModel] - [<abstract>StudyScheduleControls]<:-[InterventionsFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[InterventionsFormViewModel] - [<abstract>IListActionProvider]<:--[InterventionsFormViewModel] - [<abstract>IProviderArgsResolver]<:--[InterventionsFormViewModel] - - [InterventionTaskFormViewModel - | - +taskIdControl: FormControl<String>; - +instanceIdControl: FormControl<String>; - +taskTitleControl: FormControl<String>; - +taskDescriptionControl: FormControl<String>; - +markAsCompletedControl: FormControl<bool>; - +form: FormGroup; - +taskId: String; - +instanceId: String; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titleRequired: dynamic; - +titles: Map<FormMode, String> - | - +void setControlsFrom(); - +InterventionTaskFormData buildFormData(); - +InterventionTaskFormViewModel createDuplicate() - ] - - [InterventionTaskFormViewModel]o-[FormControl] - [InterventionTaskFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[InterventionTaskFormViewModel] - [<abstract>WithScheduleControls]<:-[InterventionTaskFormViewModel] - - [<abstract>StudyScheduleControls - | - <static>+defaultScheduleType: PhaseSequence; - <static>+defaultScheduleTypeSequence: String; - <static>+defaultNumCycles: int; - <static>+defaultPeriodLength: int; - +sequenceTypeControl: FormControl<PhaseSequence>; - +sequenceTypeCustomControl: FormControl<String>; - +phaseDurationControl: FormControl<int>; - +numCyclesControl: FormControl<int>; - +includeBaselineControl: FormControl<bool>; - +studyScheduleControls: Map<String, FormControl<Object>>; - <static>+kNumCyclesMin: int; - <static>+kNumCyclesMax: int; - <static>+kPhaseDurationMin: int; - <static>+kPhaseDurationMax: int; - +sequenceTypeControlOptions: List<FormControlOption<PhaseSequence>>; - +studyScheduleValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +numCyclesRange: dynamic; - +phaseDurationRange: dynamic; - +customSequenceRequired: dynamic - | - +void setStudyScheduleControlsFrom(); - +StudyScheduleFormData buildStudyScheduleFormData(); - +bool isSequencingCustom() - ] - - [<abstract>StudyScheduleControls]o-[PhaseSequence] - [<abstract>StudyScheduleControls]o-[FormControl] - - [InterventionFormData - | - +interventionId: String; - +title: String; - +description: String?; - +tasksData: List<InterventionTaskFormData>?; - +iconName: String?; - <static>+kDefaultTitle: String; - +id: String - | - +Intervention toIntervention(); - +InterventionFormData copy() - ] - - [<abstract>IFormData]<:-[InterventionFormData] - - [StudyScheduleFormData - | - +sequenceType: PhaseSequence; - +sequenceTypeCustom: String; - +numCycles: int; - +phaseDuration: int; - +includeBaseline: bool; - +id: String - | - +StudySchedule toStudySchedule(); - +Study apply(); - +StudyScheduleFormData copy() - ] - - [StudyScheduleFormData]o-[PhaseSequence] - [<abstract>IStudyFormData]<:--[StudyScheduleFormData] - - [InterventionTaskFormView - | - +formViewModel: InterventionTaskFormViewModel - ] - - [InterventionTaskFormView]o-[InterventionTaskFormViewModel] - - [InterventionsFormData - | - +interventionsData: List<InterventionFormData>; - +studyScheduleData: StudyScheduleFormData; - +id: String - | - +Study apply(); - +InterventionsFormData copy() - ] - - [InterventionsFormData]o-[StudyScheduleFormData] - [<abstract>IStudyFormData]<:--[InterventionsFormData] - - [InterventionFormViewModel - | - +study: Study; - +interventionIdControl: FormControl<String>; - +interventionTitleControl: FormControl<String>; - +interventionIconControl: FormControl<IconOption>; - +interventionDescriptionControl: FormControl<String>; - +interventionTasksArray: FormArray<dynamic>; - +tasksCollection: FormViewModelCollection<InterventionTaskFormViewModel, InterventionTaskFormData>; - +form: FormGroup; - +interventionId: String; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titleRequired: dynamic; - +atLeastOneTask: dynamic; - +breadcrumbsTitle: String; - +titles: Map<FormMode, String> - | - +void setControlsFrom(); - +InterventionFormData buildFormData(); - +List<ModelAction<dynamic>> availableActions(); - +List<ModelAction<dynamic>> availablePopupActions(); - +List<ModelAction<dynamic>> availableInlineActions(); - +void onSelectItem(); - +void onNewItem(); - +void onCancel(); - +dynamic onSave(); - +InterventionTaskFormViewModel provide(); - +InterventionTaskFormRouteArgs buildNewFormRouteArgs(); - +InterventionTaskFormRouteArgs buildFormRouteArgs(); - +InterventionFormViewModel createDuplicate() - ] - - [InterventionFormViewModel]o-[Study] - [InterventionFormViewModel]o-[FormControl] - [InterventionFormViewModel]o-[FormArray] - [InterventionFormViewModel]o-[FormViewModelCollection] - [InterventionFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[InterventionFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[InterventionFormViewModel] - [<abstract>IListActionProvider]<:--[InterventionFormViewModel] - [<abstract>IProviderArgsResolver]<:--[InterventionFormViewModel] - - [StudyDesignReportsFormView - | - +Widget build(); - -dynamic _showReportItemSidesheetWithArgs() - ] - - [<abstract>StudyDesignPageWidget]<:-[StudyDesignReportsFormView] - - [ReportItemFormData - | - +isPrimary: bool; - +section: ReportSection; - +id: String - | - <static>+dynamic fromDomainModel(); - +ReportItemFormData copy() - ] - - [ReportItemFormData]o-[<abstract>ReportSection] - [<abstract>IFormData]<:-[ReportItemFormData] - - [DataReferenceEditor - | - +formControl: FormControl<DataReferenceIdentifier<T>>; - +availableTasks: List<Task>; - +buildReactiveDropdownField: ReactiveDropdownField<dynamic> - | - +FormTableRow buildFormTableRow(); - -List<DropdownMenuItem<DataReferenceIdentifier<dynamic>>> _dataReferenceItems() - ] - - [DataReferenceEditor]o-[FormControl] - [DataReferenceEditor]o-[ReactiveDropdownField] - - [TemporalAggregationFormatted - | - -_value: TemporalAggregation; - <static>+values: List<TemporalAggregationFormatted>; - +value: TemporalAggregation; - +string: String; - +icon: IconData?; - +hashCode: int - | - +bool ==(); - +String toString(); - +String toJson(); - <static>+TemporalAggregationFormatted fromJson() - ] - - [TemporalAggregationFormatted]o-[TemporalAggregation] - [TemporalAggregationFormatted]o-[IconData] - - [ImprovementDirectionFormatted - | - -_value: ImprovementDirection; - <static>+values: List<ImprovementDirectionFormatted>; - +value: ImprovementDirection; - +string: String; - +icon: IconData?; - +hashCode: int - | - +bool ==(); - +String toString(); - +String toJson(); - <static>+ImprovementDirectionFormatted fromJson() - ] - - [ImprovementDirectionFormatted]o-[ImprovementDirection] - [ImprovementDirectionFormatted]o-[IconData] - - [ReportSectionType - | - +index: int; - <static>+values: List<ReportSectionType>; - <static>+average: ReportSectionType; - <static>+linearRegression: ReportSectionType - ] - - [ReportSectionType]o-[ReportSectionType] - [Enum]<:--[ReportSectionType] - - [AverageSectionFormView - | - +formViewModel: ReportItemFormViewModel; - +studyId: String; - +reportSectionColumnWidth: Map<int, TableColumnWidth> - | - +Widget build() - ] - - [AverageSectionFormView]o-[ReportItemFormViewModel] - [<abstract>ConsumerWidget]<:-[AverageSectionFormView] - - [DataReferenceIdentifier - | - +hashCode: int - | - +bool ==() - ] - - [DataReference]<:-[DataReferenceIdentifier] - - [LinearRegressionSectionFormView - | - +formViewModel: ReportItemFormViewModel; - +studyId: String; - +reportSectionColumnWidth: Map<int, TableColumnWidth> - | - +Widget build() - ] - - [LinearRegressionSectionFormView]o-[ReportItemFormViewModel] - [<abstract>ConsumerWidget]<:-[LinearRegressionSectionFormView] - - [ReportItemFormViewModel - | - <static>+defaultSectionType: ReportSectionType; - +sectionIdControl: FormControl<String>; - +sectionTypeControl: FormControl<ReportSectionType>; - +titleControl: FormControl<String>; - +descriptionControl: FormControl<String>; - +sectionControl: FormControl<ReportSection>; - +dataReferenceControl: FormControl<DataReferenceIdentifier<num>>; - +temporalAggregationControl: FormControl<TemporalAggregationFormatted>; - +improvementDirectionControl: FormControl<ImprovementDirectionFormatted>; - +alphaControl: FormControl<double>; - -_controlsBySectionType: Map<ReportSectionType, FormGroup>; - -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - -_validationConfigsBySectionType: Map<ReportSectionType, Map<FormValidationSetEnum, List<FormControlValidation>>>; - +sectionBaseControls: Map<String, AbstractControl<dynamic>>; - +form: FormGroup; - +sectionId: String; - +sectionType: ReportSectionType; - <static>+sectionTypeControlOptions: List<FormControlOption<ReportSectionType>>; - <static>+temporalAggregationControlOptions: List<FormControlOption<TemporalAggregationFormatted>>; - <static>+improvementDirectionControlOptions: List<FormControlOption<ImprovementDirectionFormatted>>; - +titles: Map<FormMode, String>; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titleRequired: dynamic; - +descriptionRequired: dynamic; - +dataReferenceRequired: dynamic; - +aggregationRequired: dynamic; - +improvementDirectionRequired: dynamic; - +alphaConfidenceRequired: dynamic - | - -List<FormControlValidation> _getValidationConfig(); - +ReportItemFormData buildFormData(); - +ReportItemFormViewModel createDuplicate(); - +dynamic onSectionTypeChanged(); - -void _updateFormControls(); - +void setControlsFrom() - ] - - [ReportItemFormViewModel]o-[ReportSectionType] - [ReportItemFormViewModel]o-[FormControl] - [ReportItemFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[ReportItemFormViewModel] - - [ReportItemFormView - | - +formViewModel: ReportItemFormViewModel; - +studyId: String; - +reportSectionColumnWidth: dynamic; - +sectionTypeBodyBuilder: Widget Function(BuildContext) - | - +Widget build(); - -dynamic _buildSectionText(); - -dynamic _buildSectionTypeHeader() - ] - - [ReportItemFormView]o-[ReportItemFormViewModel] - [ReportItemFormView]o-[Widget Function(BuildContext)] - - [ReportsFormViewModel - | - +study: Study; - +router: GoRouter; - +reportItemDelegate: ReportFormItemDelegate; - +reportItemArray: FormArray<dynamic>; - +reportItemFormViewModels: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData>; - +form: FormGroup; - +reportItemModels: List<ReportItemFormViewModel>; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titles: Map<FormMode, String>; - +canTestConsent: bool - | - +void setControlsFrom(); - +ReportsFormData buildFormData(); - +void read(); - +ReportItemFormRouteArgs buildNewReportItemFormRouteArgs(); - +ReportItemFormRouteArgs buildReportItemFormRouteArgs(); - +dynamic testReport(); - +void onCancel(); - +dynamic onSave(); - +ReportItemFormViewModel provide() - ] - - [ReportsFormViewModel]o-[Study] - [ReportsFormViewModel]o-[GoRouter] - [ReportsFormViewModel]o-[ReportFormItemDelegate] - [ReportsFormViewModel]o-[FormArray] - [ReportsFormViewModel]o-[FormViewModelCollection] - [ReportsFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[ReportsFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[ReportsFormViewModel] - [<abstract>IProviderArgsResolver]<:--[ReportsFormViewModel] - - [ReportFormItemDelegate - | - +formViewModelCollection: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData>; - +owner: ReportsFormViewModel; - +propagateOnSave: bool; - +validationSet: dynamic - | - +void onCancel(); - +dynamic onSave(); - +ReportItemFormViewModel provide(); - +List<ModelAction<dynamic>> availableActions(); - +void onNewItem(); - +void onSelectItem() - ] - - [ReportFormItemDelegate]o-[FormViewModelCollection] - [ReportFormItemDelegate]o-[ReportsFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[ReportFormItemDelegate] - [<abstract>IListActionProvider]<:--[ReportFormItemDelegate] - [<abstract>IProviderArgsResolver]<:--[ReportFormItemDelegate] - - [ReportBadge - | - +status: ReportStatus?; - +type: BadgeType; - +showPrefixIcon: bool; - +showTooltip: bool - | - +Widget build() - ] - - [ReportBadge]o-[ReportStatus] - [ReportBadge]o-[BadgeType] - - [ReportsFormData - | - +reportItems: List<ReportItemFormData>; - +id: String - | - +Study apply(); - +ReportsFormData copy() - ] - - [<abstract>IStudyFormData]<:--[ReportsFormData] - - [ReportStatus - | - +index: int; - <static>+values: List<ReportStatus>; - <static>+primary: ReportStatus; - <static>+secondary: ReportStatus - ] - - [ReportStatus]o-[ReportStatus] - [Enum]<:--[ReportStatus] - - [<abstract>IStudyFormData - | - +Study apply() - ] - - [<abstract>IFormData]<:--[<abstract>IStudyFormData] - - [StudyInfoFormViewModel - | - +study: Study; - +titleControl: FormControl<String>; - +iconControl: FormControl<IconOption>; - +descriptionControl: FormControl<String>; - +organizationControl: FormControl<String>; - +reviewBoardControl: FormControl<String>; - +reviewBoardNumberControl: FormControl<String>; - +researchersControl: FormControl<String>; - +emailControl: FormControl<String>; - +websiteControl: FormControl<String>; - +phoneControl: FormControl<String>; - +additionalInfoControl: FormControl<String>; - +form: FormGroup; - +titles: Map<FormMode, String>; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titleRequired: dynamic; - +descriptionRequired: dynamic; - +iconRequired: dynamic; - +organizationRequired: dynamic; - +reviewBoardRequired: dynamic; - +reviewBoardNumberRequired: dynamic; - +researchersRequired: dynamic; - +emailRequired: dynamic; - +phoneRequired: dynamic; - +emailFormat: dynamic; - +websiteFormat: dynamic - | - +void setControlsFrom(); - +StudyInfoFormData buildFormData() - ] - - [StudyInfoFormViewModel]o-[Study] - [StudyInfoFormViewModel]o-[FormControl] - [StudyInfoFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[StudyInfoFormViewModel] - - [StudyDesignInfoFormView - | - +Widget build() - ] - - [<abstract>StudyDesignPageWidget]<:-[StudyDesignInfoFormView] - - [StudyInfoFormData - | - +title: String; - +description: String?; - +iconName: String; - +contactInfoFormData: StudyContactInfoFormData; - +id: String - | - +Study apply(); - +StudyInfoFormData copy() - ] - - [StudyInfoFormData]o-[StudyContactInfoFormData] - [<abstract>IStudyFormData]<:--[StudyInfoFormData] - - [StudyContactInfoFormData - | - +organization: String?; - +institutionalReviewBoard: String?; - +institutionalReviewBoardNumber: String?; - +researchers: String?; - +email: String?; - +website: String?; - +phone: String?; - +additionalInfo: String?; - +id: String - | - +Study apply(); - +StudyInfoFormData copy() - ] - - [<abstract>IStudyFormData]<:--[StudyContactInfoFormData] - - [StudyFormValidationSet - | - +index: int; - <static>+values: List<StudyFormValidationSet> - ] - - [Enum]<:--[StudyFormValidationSet] - - [MeasurementsFormData - | - +surveyMeasurements: List<MeasurementSurveyFormData>; - +id: String - | - +Study apply(); - +MeasurementsFormData copy() - ] - - [<abstract>IStudyFormData]<:--[MeasurementsFormData] - - [MeasurementSurveyFormView - | - +formViewModel: MeasurementSurveyFormViewModel - ] - - [MeasurementSurveyFormView]o-[MeasurementSurveyFormViewModel] - - [SurveyPreview - | - +routeArgs: MeasurementFormRouteArgs - | - +Widget build() - ] - - [SurveyPreview]o-[MeasurementFormRouteArgs] - [<abstract>ConsumerWidget]<:-[SurveyPreview] - - [MeasurementSurveyFormData - | - +measurementId: String; - +title: String; - +introText: String?; - +outroText: String?; - +questionnaireFormData: QuestionnaireFormData; - <static>+kDefaultTitle: String; - +id: String - | - +QuestionnaireTask toQuestionnaireTask(); - +MeasurementSurveyFormData copy() - ] - - [MeasurementSurveyFormData]o-[QuestionnaireFormData] - [<abstract>IFormDataWithSchedule]<:-[MeasurementSurveyFormData] - - [MeasurementSurveyFormViewModel - | - +study: Study; - +measurementIdControl: FormControl<String>; - +instanceIdControl: FormControl<String>; - +surveyTitleControl: FormControl<String>; - +surveyIntroTextControl: FormControl<String>; - +surveyOutroTextControl: FormControl<String>; - +form: FormGroup; - +measurementId: String; - +instanceId: String; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titleRequired: dynamic; - +atLeastOneQuestion: dynamic; - +breadcrumbsTitle: String; - +titles: Map<FormMode, String> - | - +void setControlsFrom(); - +MeasurementSurveyFormData buildFormData(); - +List<ModelAction<dynamic>> availableActions(); - +List<ModelAction<dynamic>> availablePopupActions(); - +List<ModelAction<dynamic>> availableInlineActions(); - +void onSelectItem(); - +void onNewItem(); - +SurveyQuestionFormRouteArgs buildNewFormRouteArgs(); - +SurveyQuestionFormRouteArgs buildFormRouteArgs(); - +MeasurementSurveyFormViewModel createDuplicate() - ] - - [MeasurementSurveyFormViewModel]o-[Study] - [MeasurementSurveyFormViewModel]o-[FormControl] - [MeasurementSurveyFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[MeasurementSurveyFormViewModel] - [<abstract>WithQuestionnaireControls]<:-[MeasurementSurveyFormViewModel] - [<abstract>WithScheduleControls]<:-[MeasurementSurveyFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[MeasurementSurveyFormViewModel] - [<abstract>IListActionProvider]<:--[MeasurementSurveyFormViewModel] - [<abstract>IProviderArgsResolver]<:--[MeasurementSurveyFormViewModel] - - [StudyDesignMeasurementsFormView - | - +Widget build() - ] - - [<abstract>StudyDesignPageWidget]<:-[StudyDesignMeasurementsFormView] - - [MeasurementsFormViewModel - | - +study: Study; - +router: GoRouter; - +measurementsArray: FormArray<dynamic>; - +surveyMeasurementFormViewModels: FormViewModelCollection<MeasurementSurveyFormViewModel, MeasurementSurveyFormData>; - +form: FormGroup; - +measurementViewModels: List<MeasurementSurveyFormViewModel>; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +measurementRequired: dynamic; - +titles: Map<FormMode, String> - | - +void read(); - +void setControlsFrom(); - +MeasurementsFormData buildFormData(); - +List<ModelAction<dynamic>> availableActions(); - +List<ModelAction<dynamic>> availablePopupActions(); - +List<ModelAction<dynamic>> availableInlineActions(); - +void onSelectItem(); - +void onNewItem(); - +MeasurementSurveyFormViewModel provide(); - +void onCancel(); - +dynamic onSave() - ] - - [MeasurementsFormViewModel]o-[Study] - [MeasurementsFormViewModel]o-[GoRouter] - [MeasurementsFormViewModel]o-[FormArray] - [MeasurementsFormViewModel]o-[FormViewModelCollection] - [MeasurementsFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[MeasurementsFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[MeasurementsFormViewModel] - [<abstract>IListActionProvider]<:--[MeasurementsFormViewModel] - [<abstract>IProviderArgsResolver]<:--[MeasurementsFormViewModel] - - [StudyFormScaffold - | - +studyId: String; - +formViewModelBuilder: T Function(WidgetRef); - +formViewBuilder: Widget Function(T) - | - +Widget build() - ] - - [StudyFormScaffold]o-[T Function(WidgetRef)] - [StudyFormScaffold]o-[Widget Function(T)] - [<abstract>ConsumerWidget]<:-[StudyFormScaffold] - - [ConsentItemFormViewModel - | - +consentIdControl: FormControl<String>; - +titleControl: FormControl<String>; - +descriptionControl: FormControl<String>; - +iconControl: FormControl<IconOption>; - +form: FormGroup; - +consentId: String; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titleRequired: dynamic; - +descriptionRequired: dynamic; - +titles: Map<FormMode, String> - | - +void setControlsFrom(); - +ConsentItemFormData buildFormData(); - +ConsentItemFormViewModel createDuplicate() - ] - - [ConsentItemFormViewModel]o-[FormControl] - [ConsentItemFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[ConsentItemFormViewModel] - - [StudyDesignEnrollmentFormView - | - +Widget build(); - -dynamic _showScreenerQuestionSidesheetWithArgs(); - -dynamic _showConsentItemSidesheetWithArgs() - ] - - [<abstract>StudyDesignPageWidget]<:-[StudyDesignEnrollmentFormView] - - [<abstract>IScreenerQuestionLogicFormViewModel - | - +isDirtyOptionsBannerVisible: bool - ] - - [ScreenerQuestionLogicFormView - | - +formViewModel: ScreenerQuestionFormViewModel - | - +Widget build(); - -dynamic _buildInfoBanner(); - -dynamic _buildAnswerOptionsLogicControls(); - -List<Widget> _buildOptionLogicRow() - ] - - [ScreenerQuestionLogicFormView]o-[ScreenerQuestionFormViewModel] - [<abstract>FormConsumerWidget]<:-[ScreenerQuestionLogicFormView] - - [ConsentItemFormData - | - +consentId: String; - +title: String; - +description: String; - +iconName: String?; - +id: String - | - +ConsentItem toConsentItem(); - +ConsentItemFormData copy() - ] - - [<abstract>IFormData]<:-[ConsentItemFormData] - - [ConsentItemFormView - | - +formViewModel: ConsentItemFormViewModel - ] - - [ConsentItemFormView]o-[ConsentItemFormViewModel] - - [EnrollmentFormData - | - <static>+kDefaultEnrollmentType: Participation; - +enrollmentType: Participation; - +questionnaireFormData: QuestionnaireFormData; - +consentItemsFormData: List<ConsentItemFormData>?; - +id: String - | - +Study apply(); - +EnrollmentFormData copy() - ] - - [EnrollmentFormData]o-[Participation] - [EnrollmentFormData]o-[QuestionnaireFormData] - [<abstract>IStudyFormData]<:--[EnrollmentFormData] - - [ScreenerQuestionFormViewModel - | - <static>+defaultResponseOptionValidity: bool; - +responseOptionsDisabledArray: FormArray<dynamic>; - +responseOptionsLogicControls: FormArray<bool>; - +responseOptionsLogicDescriptionControls: FormArray<String>; - -_questionBaseControls: Map<String, AbstractControl<dynamic>>; - +prevResponseOptionControls: List<AbstractControl<dynamic>>; - +prevResponseOptionValues: List<dynamic>; - +responseOptionsDisabledControls: List<AbstractControl<dynamic>>; - +logicControlOptions: List<FormControlOption<bool>>; - +questionBaseControls: Map<String, AbstractControl<dynamic>>; - +isDirtyOptionsBannerVisible: bool - | - +dynamic onResponseOptionsChanged(); - +void setControlsFrom(); - +QuestionFormData buildFormData(); - -List<FormControl<dynamic>> _copyFormControls(); - -AbstractControl<dynamic>? _findAssociatedLogicControlFor(); - -AbstractControl<dynamic>? _findAssociatedControlFor(); - +ScreenerQuestionFormViewModel createDuplicate() - ] - - [ScreenerQuestionFormViewModel]o-[FormArray] - [QuestionFormViewModel]<:-[ScreenerQuestionFormViewModel] - [<abstract>IScreenerQuestionLogicFormViewModel]<:--[ScreenerQuestionFormViewModel] - - [EnrollmentFormViewModel - | - +study: Study; - +router: GoRouter; - +consentItemDelegate: EnrollmentFormConsentItemDelegate; - +enrollmentTypeControl: FormControl<Participation>; - +consentItemArray: FormArray<dynamic>; - +consentItemFormViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData>; - +form: FormGroup; - +enrollmentTypeControlOptions: List<FormControlOption<Participation>>; - +consentItemModels: List<ConsentItemFormViewModel>; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titles: Map<FormMode, String>; - +canTestScreener: bool; - +canTestConsent: bool; - +questionTitles: Map<FormMode, String Function()> - | - +void setControlsFrom(); - +EnrollmentFormData buildFormData(); - +void read(); - +List<ModelAction<dynamic>> availableActions(); - +List<ModelAction<dynamic>> availablePopupActions(); - +List<ModelAction<dynamic>> availableInlineActions(); - +void onSelectItem(); - +void onNewItem(); - +ScreenerQuestionFormRouteArgs buildNewScreenerQuestionFormRouteArgs(); - +ScreenerQuestionFormRouteArgs buildScreenerQuestionFormRouteArgs(); - +ConsentItemFormRouteArgs buildNewConsentItemFormRouteArgs(); - +ConsentItemFormRouteArgs buildConsentItemFormRouteArgs(); - +dynamic testScreener(); - +dynamic testConsent(); - +ScreenerQuestionFormViewModel provideQuestionFormViewModel() - ] - - [EnrollmentFormViewModel]o-[Study] - [EnrollmentFormViewModel]o-[GoRouter] - [EnrollmentFormViewModel]o-[EnrollmentFormConsentItemDelegate] - [EnrollmentFormViewModel]o-[FormControl] - [EnrollmentFormViewModel]o-[FormArray] - [EnrollmentFormViewModel]o-[FormViewModelCollection] - [EnrollmentFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[EnrollmentFormViewModel] - [<abstract>WithQuestionnaireControls]<:-[EnrollmentFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[EnrollmentFormViewModel] - [<abstract>IListActionProvider]<:--[EnrollmentFormViewModel] - [<abstract>IProviderArgsResolver]<:--[EnrollmentFormViewModel] - - [EnrollmentFormConsentItemDelegate - | - +formViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData>; - +owner: EnrollmentFormViewModel; - +propagateOnSave: bool; - +validationSet: dynamic - | - +void onCancel(); - +dynamic onSave(); - +ConsentItemFormViewModel provide(); - +List<ModelAction<dynamic>> availableActions(); - +void onNewItem(); - +void onSelectItem() - ] - - [EnrollmentFormConsentItemDelegate]o-[FormViewModelCollection] - [EnrollmentFormConsentItemDelegate]o-[EnrollmentFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[EnrollmentFormConsentItemDelegate] - [<abstract>IListActionProvider]<:--[EnrollmentFormConsentItemDelegate] - [<abstract>IProviderArgsResolver]<:--[EnrollmentFormConsentItemDelegate] - - [StudyFormViewModel - | - +studyDirtyCopy: Study?; - +studyRepository: IStudyRepository; - +authRepository: IAuthRepository; - +router: GoRouter; - +studyInfoFormViewModel: StudyInfoFormViewModel; - +enrollmentFormViewModel: EnrollmentFormViewModel; - +measurementsFormViewModel: MeasurementsFormViewModel; - +reportsFormViewModel: ReportsFormViewModel; - +interventionsFormViewModel: InterventionsFormViewModel; - +form: FormGroup; - +isStudyReadonly: bool; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titles: Map<FormMode, String> - | - +void read(); - +void setControlsFrom(); - +Study buildFormData(); - +void dispose(); - +void onCancel(); - +dynamic onSave(); - -dynamic _applyAndSaveSubform() - ] - - [StudyFormViewModel]o-[Study] - [StudyFormViewModel]o-[<abstract>IStudyRepository] - [StudyFormViewModel]o-[<abstract>IAuthRepository] - [StudyFormViewModel]o-[GoRouter] - [StudyFormViewModel]o-[StudyInfoFormViewModel] - [StudyFormViewModel]o-[EnrollmentFormViewModel] - [StudyFormViewModel]o-[MeasurementsFormViewModel] - [StudyFormViewModel]o-[ReportsFormViewModel] - [StudyFormViewModel]o-[InterventionsFormViewModel] - [StudyFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[StudyFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[StudyFormViewModel] - - [<abstract>WithQuestionnaireControls - | - +questionsArray: FormArray<dynamic>; - +questionFormViewModels: FormViewModelCollection<Q, QuestionFormData>; - +questionnaireControls: Map<String, FormArray<dynamic>>; - +propagateOnSave: bool; - +questionModels: List<Q>; - +questionTitles: Map<FormMode, String Function()> - | - +void setQuestionnaireControlsFrom(); - +QuestionnaireFormData buildQuestionnaireFormData(); - +void read(); - +void onCancel(); - +dynamic onSave(); - +Q provide(); - +Q provideQuestionFormViewModel() - ] - - [<abstract>WithQuestionnaireControls]o-[FormArray] - [<abstract>WithQuestionnaireControls]o-[FormViewModelCollection] - [<abstract>IFormViewModelDelegate]<:--[<abstract>WithQuestionnaireControls] - [<abstract>IProviderArgsResolver]<:--[<abstract>WithQuestionnaireControls] - - [QuestionnaireFormData - | - +questionsData: List<QuestionFormData>?; - +id: String - | - +StudyUQuestionnaire toQuestionnaire(); - +List<EligibilityCriterion> toEligibilityCriteria(); - +QuestionnaireFormData copy() - ] - - [<abstract>IFormData]<:--[QuestionnaireFormData] - - [<abstract>QuestionFormData - | - <static>+questionTypeFormDataFactories: Map<SurveyQuestionType, QuestionFormData Function(Question<dynamic>, List<EligibilityCriterion>)>; - +questionId: String; - +questionText: String; - +questionInfoText: String?; - +questionType: SurveyQuestionType; - +responseOptionsValidity: Map<dynamic, bool>; - +responseOptions: List<dynamic>; - +id: String - | - +Question<dynamic> toQuestion(); - +EligibilityCriterion toEligibilityCriterion(); - +Answer<dynamic> constructAnswerFor(); - +dynamic setResponseOptionsValidityFrom(); - +QuestionFormData copy() - ] - - [<abstract>QuestionFormData]o-[SurveyQuestionType] - [<abstract>IFormData]<:--[<abstract>QuestionFormData] - - [ChoiceQuestionFormData - | - +isMultipleChoice: bool; - +answerOptions: List<String>; - +responseOptions: List<String> - | - +Question<dynamic> toQuestion(); - +QuestionFormData copy(); - -Choice _buildChoiceForValue(); - +Answer<dynamic> constructAnswerFor() - ] - - [<abstract>QuestionFormData]<:-[ChoiceQuestionFormData] - - [BoolQuestionFormData - | - <static>+kResponseOptions: Map<String, bool>; - +responseOptions: List<String> - | - +Question<dynamic> toQuestion(); - +BoolQuestionFormData copy(); - +Answer<dynamic> constructAnswerFor() - ] - - [<abstract>QuestionFormData]<:-[BoolQuestionFormData] - - [ImageQuestionFormData - | - <static>+kResponseOptions: Map<String, FutureBlobFile>; - +responseOptions: List<String> - | - +Question<dynamic> toQuestion(); - +ImageQuestionFormData copy(); - +Answer<dynamic> constructAnswerFor() - ] - - [<abstract>QuestionFormData]<:-[ImageQuestionFormData] - - [AudioQuestionFormData - | - +maxRecordingDurationSeconds: int; - <static>+kResponseOptions: Map<String, FutureBlobFile>; - +responseOptions: List<String> - | - +Question<dynamic> toQuestion(); - +AudioQuestionFormData copy(); - +Answer<dynamic> constructAnswerFor() - ] - - [<abstract>QuestionFormData]<:-[AudioQuestionFormData] - - [ScaleQuestionFormData - | - +minValue: double; - +maxValue: double; - +minLabel: String?; - +maxLabel: String?; - +midValues: List<double?>; - +midLabels: List<String?>; - +stepSize: double; - +initialValue: double?; - +minColor: Color?; - +maxColor: Color?; - +responseOptions: List<double>; - +midAnnotations: List<Annotation> - | - +ScaleQuestion toQuestion(); - +QuestionFormData copy(); - +Answer<dynamic> constructAnswerFor() - ] - - [ScaleQuestionFormData]o-[Color] - [<abstract>QuestionFormData]<:-[ScaleQuestionFormData] - - [FreeTextQuestionFormData - | - +textLengthRange: List<int>; - +textType: FreeTextQuestionType; - +textTypeExpression: String?; - +responseOptions: List<String> - | - +Question<dynamic> toQuestion(); - +FreeTextQuestionFormData copy(); - +Answer<dynamic> constructAnswerFor() - ] - - [FreeTextQuestionFormData]o-[FreeTextQuestionType] - [<abstract>QuestionFormData]<:-[FreeTextQuestionFormData] - - [AudioRecordingQuestionFormView - | - +formViewModel: QuestionFormViewModel - | - +Widget build() - ] - - [AudioRecordingQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[AudioRecordingQuestionFormView] - - [FreeTextQuestionFormView - | - +formViewModel: QuestionFormViewModel; - +generateLabelHelpTextMap: dynamic - | - +Widget build(); - +Widget disableOnReadonly(); - +Widget generateRow() - ] - - [FreeTextQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[FreeTextQuestionFormView] - - [SurveyQuestionType - | - +index: int; - <static>+values: List<SurveyQuestionType>; - <static>+choice: SurveyQuestionType; - <static>+bool: SurveyQuestionType; - <static>+scale: SurveyQuestionType; - <static>+image: SurveyQuestionType; - <static>+audio: SurveyQuestionType; - <static>+freeText: SurveyQuestionType - ] - - [SurveyQuestionType]o-[SurveyQuestionType] - [Enum]<:--[SurveyQuestionType] - - [ImageCapturingQuestionFormView - | - +formViewModel: QuestionFormViewModel - | - +Widget build() - ] - - [ImageCapturingQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[ImageCapturingQuestionFormView] - - [<abstract>IScaleQuestionFormViewModel - | - +isMidValuesClearedInfoVisible: bool - ] - - [ScaleQuestionFormView - | - +formViewModel: QuestionFormViewModel - ] - - [ScaleQuestionFormView]o-[QuestionFormViewModel] - - [ChoiceQuestionFormView - | - +formViewModel: QuestionFormViewModel - | - +Widget build() - ] - - [ChoiceQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[ChoiceQuestionFormView] - - [BoolQuestionFormView - | - +formViewModel: QuestionFormViewModel - | - +Widget build() - ] - - [BoolQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[BoolQuestionFormView] - - [QuestionFormViewModel - | - <static>+defaultQuestionType: SurveyQuestionType; - -_titles: Map<FormMode, String Function()>?; - +questionIdControl: FormControl<String>; - +questionTypeControl: FormControl<SurveyQuestionType>; - +questionTextControl: FormControl<String>; - +questionInfoTextControl: FormControl<String>; - +questionBaseControls: Map<String, AbstractControl<dynamic>>; - +isMultipleChoiceControl: FormControl<bool>; - +choiceResponseOptionsArray: FormArray<dynamic>; - +customOptionsMin: int; - +customOptionsMax: int; - +customOptionsInitial: int; - +boolResponseOptionsArray: FormArray<String>; - +imageResponseOptionsArray: FormArray<String>; - <static>+kDefaultMaxRecordingDurationSeconds: int; - <static>+kMaxRecordingDurationSeconds: int; - +audioResponseOptionsArray: FormArray<String>; - +maxRecordingDurationSecondsControl: FormControl<int>; - <static>+kDefaultScaleMinValue: int; - <static>+kDefaultScaleMaxValue: int; - <static>+kNumMidValueControls: int; - <static>+kMidValueDebounceMilliseconds: int; - +scaleMinValueControl: FormControl<int>; - +scaleMaxValueControl: FormControl<int>; - -_scaleRangeControl: FormControl<int>; - +scaleMinLabelControl: FormControl<String>; - +scaleMaxLabelControl: FormControl<String>; - +scaleMidValueControls: FormArray<int>; - +scaleMidLabelControls: FormArray<String?>; - -_scaleResponseOptionsArray: FormArray<int>; - +scaleMinColorControl: FormControl<SerializableColor>; - +scaleMaxColorControl: FormControl<SerializableColor>; - +prevMidValues: List<int?>?; - +freeTextTypeControl: FormControl<FreeTextQuestionType>; - +customRegexControl: FormControl<String>; - +freeTextResponseOptionsArray: FormArray<dynamic>; - +freeTextLengthMin: AbstractControl<int>; - +freeTextLengthMax: AbstractControl<int>; - +freeTextExampleTextControl: FormControl<String>; - <static>+kDefaultFreeTextMinLength: int; - <static>+kDefaultFreeTextMaxLength: int; - +freeTextLengthControl: FormControl<RangeValues>; - -_controlsByQuestionType: Map<SurveyQuestionType, FormGroup>; - -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - -_validationConfigsByQuestionType: Map<SurveyQuestionType, Map<FormValidationSetEnum, List<FormControlValidation>>>; - +form: FormGroup; - +questionId: String; - +questionType: SurveyQuestionType; - +questionTypeControlOptions: List<FormControlOption<SurveyQuestionType>>; - +answerOptionsArray: FormArray<dynamic>; - +answerOptionsControls: List<AbstractControl<dynamic>>; - +validAnswerOptions: List<String>; - +boolOptions: List<AbstractControl<String>>; - +imageOptions: List<AbstractControl<String>>; - +audioOptions: List<AbstractControl<String>>; - +scaleMinValue: int; - +scaleMaxValue: int; - +scaleRange: int; - +scaleAllValueControls: List<AbstractControl<int>>; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +questionTextRequired: dynamic; - +numValidChoiceOptions: dynamic; - +scaleRangeValid: dynamic; - +maxRecordingDurationValid: dynamic; - +titles: Map<FormMode, String>; - +isAddOptionButtonVisible: bool; - +isMidValuesClearedInfoVisible: bool - | - +String? scaleMidLabelAt(); - -dynamic _onScaleRangeChanged(); - -dynamic _applyInputFormatters(); - -dynamic _updateScaleMidValueControls(); - -Map<String, dynamic>? _validateFreeText(); - -dynamic _onFreeTextLengthChanged(); - -List<FormControlValidation> _getValidationConfig(); - +dynamic onQuestionTypeChanged(); - +dynamic onResponseOptionsChanged(); - -void _updateFormControls(); - +void initControls(); - +void setControlsFrom(); - +QuestionFormData buildFormData(); - +List<ModelAction<dynamic>> availableActions(); - +void onNewItem(); - +void onSelectItem(); - +dynamic save(); - +QuestionFormViewModel createDuplicate() - ] - - [QuestionFormViewModel]o-[SurveyQuestionType] - [QuestionFormViewModel]o-[FormControl] - [QuestionFormViewModel]o-[FormArray] - [QuestionFormViewModel]o-[<abstract>AbstractControl] - [QuestionFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[QuestionFormViewModel] - [<abstract>IListActionProvider]<:--[QuestionFormViewModel] - - [SurveyQuestionFormView - | - +formViewModel: QuestionFormViewModel; - +isHtmlStyleable: bool - ] - - [SurveyQuestionFormView]o-[QuestionFormViewModel] - - [<abstract>IFormDataWithSchedule - | - +instanceId: String; - +isTimeLocked: bool; - +timeLockStart: StudyUTimeOfDay?; - +timeLockEnd: StudyUTimeOfDay?; - +hasReminder: bool; - +reminderTime: StudyUTimeOfDay? - | - +Schedule toSchedule() - ] - - [<abstract>IFormDataWithSchedule]o-[StudyUTimeOfDay] - [<abstract>IFormData]<:--[<abstract>IFormDataWithSchedule] - - [ScheduleControls - | - +formViewModel: WithScheduleControls - | - +Widget build(); - -List<FormTableRow> _conditionalTimeRestrictions() - ] - - [ScheduleControls]o-[<abstract>WithScheduleControls] - [<abstract>FormConsumerWidget]<:-[ScheduleControls] - - [<abstract>WithScheduleControls - | - +isTimeRestrictedControl: FormControl<bool>; - +instanceID: FormControl<String>; - +restrictedTimeStartControl: FormControl<Time>; - +restrictedTimeStartPickerControl: FormControl<TimeOfDay>; - +restrictedTimeEndControl: FormControl<Time>; - +restrictedTimeEndPickerControl: FormControl<TimeOfDay>; - +hasReminderControl: FormControl<bool>; - +reminderTimeControl: FormControl<Time>; - +reminderTimePickerControl: FormControl<TimeOfDay>; - -_reminderControlStream: StreamSubscription<dynamic>?; - +scheduleFormControls: Map<String, FormControl<Object>>; - +hasReminder: bool; - +isTimeRestricted: bool; - +timeRestriction: List<Time>? - | - +void setScheduleControlsFrom(); - -dynamic _initReminderControl() - ] - - [<abstract>WithScheduleControls]o-[FormControl] - [<abstract>WithScheduleControls]o-[StreamSubscription] - - [<abstract>StudyDesignPageWidget - | - +Widget? banner() - ] - - [<abstract>StudyPageWidget]<:-[<abstract>StudyDesignPageWidget] - - [StudiesTableColumnHeader - | - +title: String; - +sortable: bool; - +sortAscending: bool; - +sortingActive: bool; - +onSort: void Function()? - ] - - [StudiesTableColumnHeader]o-[void Function()?] - - [DashboardScreen - | - +filter: StudiesFilter? - ] - - [DashboardScreen]o-[StudiesFilter] - - [DashboardScaffold - | - <static>+compactWidthThreshold: double; - +body: Widget - | - +Widget build() - ] - - [DashboardScaffold]o-[<abstract>Widget] - - [DashboardController - | - +studyRepository: IStudyRepository; - +authRepository: IAuthRepository; - +userRepository: IUserRepository; - +router: GoRouter; - -_studiesSubscription: StreamSubscription<List<WrappedModel<Study>>>?; - +searchController: SearchController; - +isSortAscending: bool - | - -dynamic _subscribeStudies(); - +dynamic setSearchText(); - +dynamic setStudiesFilter(); - +dynamic onSelectStudy(); - +dynamic onClickNewStudy(); - +dynamic pinStudy(); - +dynamic pinOffStudy(); - +void setSorting(); - +void filterStudies(); - +void sortStudies(); - +bool isSortingActiveForColumn(); - +bool isPinned(); - +List<ModelAction<dynamic>> availableActions(); - +void dispose() - ] - - [DashboardController]o-[<abstract>IStudyRepository] - [DashboardController]o-[<abstract>IAuthRepository] - [DashboardController]o-[<abstract>IUserRepository] - [DashboardController]o-[GoRouter] - [DashboardController]o-[StreamSubscription] - [DashboardController]o-[SearchController] - [<abstract>IModelActionProvider]<:--[DashboardController] - - [StudiesFilter - | - +index: int; - <static>+values: List<StudiesFilter> - ] - - [Enum]<:--[StudiesFilter] - - [StudiesTableColumnSize - | - +collapsed: bool; - +flex: int?; - +width: double? - | - +Widget createContainer() - ] - - [StudiesTable - | - +itemHeight: double; - +itemPadding: double; - +rowSpacing: double; - +columnSpacing: double; - +compactWidthThreshold: double; - +superCompactWidthThreshold: double; - +compactStatTitleThreshold: double; - +studies: List<Study>; - +onSelect: void Function(Study); - +getActions: List<ModelAction<dynamic>> Function(Study); - +emptyWidget: Widget; - +pinnedStudies: Iterable<String>; - +dashboardController: DashboardController - | - +Widget build(); - -Widget _buildColumnHeader() - ] - - [StudiesTable]o-[void Function(Study)] - [StudiesTable]o-[List<ModelAction<dynamic>> Function(Study)] - [StudiesTable]o-[<abstract>Widget] - [StudiesTable]o-[DashboardController] - - [StudiesTableColumn - | - +index: int; - <static>+values: List<StudiesTableColumn>; - <static>+pin: StudiesTableColumn; - <static>+title: StudiesTableColumn; - <static>+status: StudiesTableColumn; - <static>+participation: StudiesTableColumn; - <static>+createdAt: StudiesTableColumn; - <static>+enrolled: StudiesTableColumn; - <static>+active: StudiesTableColumn; - <static>+completed: StudiesTableColumn; - <static>+action: StudiesTableColumn - ] - - [StudiesTableColumn]o-[StudiesTableColumn] - [Enum]<:--[StudiesTableColumn] - - [StudiesTableItem - | - +study: Study; - +itemHeight: double; - +itemPadding: double; - +rowSpacing: double; - +columnSpacing: double; - +actions: List<ModelAction<dynamic>>; - +columnSizes: List<StudiesTableColumnSize>; - +isPinned: bool; - +onPinnedChanged: void Function(Study, bool)?; - +onTap: void Function(Study)? - ] - - [StudiesTableItem]o-[Study] - [StudiesTableItem]o-[void Function(Study, bool)?] - [StudiesTableItem]o-[void Function(Study)?] - - [App - ] - - [AppContent - ] - - [AccountSettingsDialog - | - +Widget build() - ] - - [<abstract>ConsumerWidget]<:-[AccountSettingsDialog] - - [<abstract>IInviteCodeRepository - | - +dynamic isCodeAlreadyUsed() - ] - - [<abstract>ModelRepository]<:--[<abstract>IInviteCodeRepository] - - [InviteCodeRepository - | - +studyId: String; - +ref: ProviderRef<dynamic>; - +apiClient: StudyUApi; - +authRepository: IAuthRepository; - +studyRepository: IStudyRepository; - +study: Study - | - +String getKey(); - +dynamic isCodeAlreadyUsed(); - +List<ModelAction<dynamic>> availableActions(); - +dynamic emitUpdate() - ] - - [InviteCodeRepository]o-[<abstract>ProviderRef] - [InviteCodeRepository]o-[<abstract>StudyUApi] - [InviteCodeRepository]o-[<abstract>IAuthRepository] - [InviteCodeRepository]o-[<abstract>IStudyRepository] - [InviteCodeRepository]o-[Study] - [<abstract>ModelRepository]<:-[InviteCodeRepository] - [<abstract>IInviteCodeRepository]<:--[InviteCodeRepository] - - [InviteCodeRepositoryDelegate - | - +study: Study; - +apiClient: StudyUApi; - +studyRepository: IStudyRepository - | - +dynamic fetch(); - +dynamic fetchAll(); - +dynamic save(); - +dynamic delete(); - +dynamic onError(); - +StudyInvite createDuplicate(); - +StudyInvite createNewInstance() - ] - - [InviteCodeRepositoryDelegate]o-[Study] - [InviteCodeRepositoryDelegate]o-[<abstract>StudyUApi] - [InviteCodeRepositoryDelegate]o-[<abstract>IStudyRepository] - [<abstract>IModelRepositoryDelegate]<:-[InviteCodeRepositoryDelegate] - - [<abstract>IStudyRepository - | - +dynamic launch(); - +dynamic deleteParticipants() - ] - - [<abstract>ModelRepository]<:--[<abstract>IStudyRepository] - - [StudyRepository - | - +apiClient: StudyUApi; - +authRepository: IAuthRepository; - +ref: ProviderRef<dynamic>; - +sortCallback: void Function()? - | - +String getKey(); - +dynamic deleteParticipants(); - +dynamic launch(); - +List<ModelAction<dynamic>> availableActions() - ] - - [StudyRepository]o-[<abstract>StudyUApi] - [StudyRepository]o-[<abstract>IAuthRepository] - [StudyRepository]o-[<abstract>ProviderRef] - [StudyRepository]o-[void Function()?] - [<abstract>ModelRepository]<:-[StudyRepository] - [<abstract>IStudyRepository]<:--[StudyRepository] - - [StudyRepositoryDelegate - | - +apiClient: StudyUApi; - +authRepository: IAuthRepository - | - +dynamic fetchAll(); - +dynamic fetch(); - +dynamic save(); - +dynamic delete(); - +dynamic onError(); - +Study createNewInstance(); - +Study createDuplicate() - ] - - [StudyRepositoryDelegate]o-[<abstract>StudyUApi] - [StudyRepositoryDelegate]o-[<abstract>IAuthRepository] - [<abstract>IModelRepositoryDelegate]<:-[StudyRepositoryDelegate] - - [<abstract>StudyUApi - | - +dynamic saveStudy(); - +dynamic fetchStudy(); - +dynamic getUserStudies(); - +dynamic deleteStudy(); - +dynamic saveStudyInvite(); - +dynamic fetchStudyInvite(); - +dynamic deleteStudyInvite(); - +dynamic deleteParticipants(); - +dynamic fetchAppConfig(); - +dynamic fetchUser(); - +dynamic saveUser() - ] - - [APIException - ] - - [Exception]<:--[APIException] - - [StudyNotFoundException - ] - - [APIException]<:-[StudyNotFoundException] - - [MeasurementNotFoundException - ] - - [APIException]<:-[MeasurementNotFoundException] - - [QuestionNotFoundException - ] - - [APIException]<:-[QuestionNotFoundException] - - [ConsentItemNotFoundException - ] - - [APIException]<:-[ConsentItemNotFoundException] - - [InterventionNotFoundException - ] - - [APIException]<:-[InterventionNotFoundException] - - [InterventionTaskNotFoundException - ] - - [APIException]<:-[InterventionTaskNotFoundException] - - [ReportNotFoundException - ] - - [APIException]<:-[ReportNotFoundException] - - [ReportSectionNotFoundException - ] - - [APIException]<:-[ReportSectionNotFoundException] - - [StudyInviteNotFoundException - ] - - [APIException]<:-[StudyInviteNotFoundException] - - [UserNotFoundException - ] - - [APIException]<:-[UserNotFoundException] - - [StudyUApiClient - | - +supabaseClient: SupabaseClient; - <static>+studyColumns: List<String>; - <static>+studyWithParticipantActivityColumns: List<String>; - +testDelayMilliseconds: int - | - +dynamic deleteParticipants(); - +dynamic getUserStudies(); - +dynamic fetchStudy(); - +dynamic deleteStudy(); - +dynamic saveStudy(); - +dynamic fetchStudyInvite(); - +dynamic saveStudyInvite(); - +dynamic deleteStudyInvite(); - +dynamic fetchAppConfig(); - +dynamic fetchUser(); - +dynamic saveUser(); - -dynamic _awaitGuarded(); - -dynamic _apiException(); - -dynamic _testDelay() - ] - - [StudyUApiClient]o-[SupabaseClient] - [<abstract>SupabaseClientDependant]<:-[StudyUApiClient] - [<abstract>SupabaseQueryMixin]<:-[StudyUApiClient] - [<abstract>StudyUApi]<:--[StudyUApiClient] - - [<abstract>IAppRepository - | - +dynamic fetchAppConfig(); - +void dispose() - ] - - [AppRepository - | - +apiClient: StudyUApi - | - +dynamic fetchAppConfig(); - +void dispose() - ] - - [AppRepository]o-[<abstract>StudyUApi] - [<abstract>IAppRepository]<:--[AppRepository] - - [<abstract>IUserRepository - | - +user: StudyUUser - | - +dynamic fetchUser(); - +dynamic saveUser(); - +dynamic updatePreferences() - ] - - [<abstract>IUserRepository]o-[StudyUUser] - - [UserRepository - | - +apiClient: StudyUApi; - +authRepository: IAuthRepository; - +ref: Ref<Object?>; - +user: StudyUUser - | - +dynamic fetchUser(); - +dynamic saveUser(); - +dynamic updatePreferences() - ] - - [UserRepository]o-[<abstract>StudyUApi] - [UserRepository]o-[<abstract>IAuthRepository] - [UserRepository]o-[<abstract>Ref] - [UserRepository]o-[StudyUUser] - [<abstract>IUserRepository]<:--[UserRepository] - - [PreferenceAction - | - +index: int; - <static>+values: List<PreferenceAction>; - <static>+pin: PreferenceAction; - <static>+pinOff: PreferenceAction - ] - - [PreferenceAction]o-[PreferenceAction] - [Enum]<:--[PreferenceAction] - - [<abstract>IAuthRepository - | - +allowPasswordReset: bool; - +currentUser: User?; - +isLoggedIn: bool; - +session: Session?; - +serializedSession: String? - | - +dynamic signUp(); - +dynamic signInWith(); - +dynamic signOut(); - +dynamic resetPasswordForEmail(); - +dynamic updateUser(); - +void dispose() - ] - - [<abstract>IAuthRepository]o-[User] - [<abstract>IAuthRepository]o-[Session] - [<abstract>IAppDelegate]<:-[<abstract>IAuthRepository] - - [AuthRepository - | - +supabaseClient: SupabaseClient; - +allowPasswordReset: bool; - +authClient: GoTrueClient; - +session: Session?; - +serializedSession: String?; - +currentUser: User?; - +isLoggedIn: bool - | - -void _registerAuthListener(); - +dynamic signUp(); - +dynamic signInWith(); - +dynamic signOut(); - +dynamic resetPasswordForEmail(); - +dynamic updateUser(); - +void dispose(); - +dynamic onAppStart() - ] - - [AuthRepository]o-[SupabaseClient] - [AuthRepository]o-[GoTrueClient] - [AuthRepository]o-[Session] - [AuthRepository]o-[User] - [<abstract>IAuthRepository]<:--[AuthRepository] - - [StudyLaunched - ] - - [<abstract>ModelEvent]<:-[StudyLaunched] - - [<abstract>SupabaseClientDependant - | - +supabaseClient: SupabaseClient - ] - - [<abstract>SupabaseClientDependant]o-[SupabaseClient] - - [SupabaseQueryError - | - +statusCode: String?; - +message: String; - +details: dynamic - ] - - [Exception]<:--[SupabaseQueryError] - - [<abstract>SupabaseQueryMixin - | - +dynamic deleteAll(); - +dynamic getAll(); - +dynamic getById(); - +dynamic getByColumn(); - +List<T> deserializeList(); - +T deserializeObject() - ] - - [WrappedModel - | - -_model: T; - +asyncValue: AsyncValue<T>; - +isLocalOnly: bool; - +isDirty: bool; - +isDeleted: bool; - +lastSaved: DateTime?; - +lastFetched: DateTime?; - +lastUpdated: DateTime?; - +model: T - | - +dynamic markWithError(); - +dynamic markAsLoading(); - +dynamic markAsFetched(); - +dynamic markAsSaved() - ] - - [WrappedModel]o-[<abstract>AsyncValue] - - [ModelRepositoryException - ] - - [Exception]<:--[ModelRepositoryException] - - [ModelNotFoundException - ] - - [ModelRepositoryException]<:--[ModelNotFoundException] - - [<abstract>IModelRepository - | - +String getKey(); - +WrappedModel<T>? get(); - +dynamic fetchAll(); - +dynamic fetch(); - +dynamic save(); - +dynamic delete(); - +dynamic duplicateAndSave(); - +dynamic duplicateAndSaveFromRemote(); - +Stream<WrappedModel<T>> watch(); - +Stream<List<WrappedModel<T>>> watchAll(); - +Stream<ModelEvent<T>> watchChanges(); - +Stream<ModelEvent<T>> watchAllChanges(); - +dynamic ensurePersisted(); - +void dispose() - ] - - [<abstract>IModelActionProvider]<:--[<abstract>IModelRepository] - - [<abstract>IModelRepositoryDelegate - | - +dynamic fetchAll(); - +dynamic fetch(); - +dynamic save(); - +dynamic delete(); - +T createNewInstance(); - +T createDuplicate(); - +dynamic onError() - ] - - [<abstract>ModelRepository - | - +delegate: IModelRepositoryDelegate<T>; - -_allModelsStreamController: BehaviorSubject<List<WrappedModel<T>>>; - -_allModelEventsStreamController: BehaviorSubject<ModelEvent<T>>; - +modelStreamControllers: Map<String, BehaviorSubject<WrappedModel<T>>>; - +modelEventsStreamControllers: Map<String, BehaviorSubject<ModelEvent<T>>>; - -_allModels: Map<String, WrappedModel<T>> - | - +WrappedModel<T>? get(); - +dynamic fetchAll(); - +dynamic fetch(); - +dynamic save(); - +dynamic delete(); - +dynamic duplicateAndSave(); - +dynamic duplicateAndSaveFromRemote(); - +Stream<List<WrappedModel<T>>> watchAll(); - +Stream<WrappedModel<T>> watch(); - +Stream<ModelEvent<T>> watchAllChanges(); - +Stream<ModelEvent<T>> watchChanges(); - -dynamic _buildModelSpecificController(); - +dynamic ensurePersisted(); - +WrappedModel<T> upsertLocally(); - +List<WrappedModel<T>> upsertAllLocally(); - +dynamic emitUpdate(); - +dynamic emitModelEvent(); - +dynamic emitError(); - +void dispose(); - +List<ModelAction<dynamic>> availableActions() - ] - - [<abstract>ModelRepository]o-[<abstract>IModelRepositoryDelegate] - [<abstract>ModelRepository]o-[BehaviorSubject] - [<abstract>IModelRepository]<:-[<abstract>ModelRepository] - - [<abstract>ModelEvent - | - +modelId: String; - +model: T - ] - - [IsFetched - ] - - [<abstract>ModelEvent]<:-[IsFetched] - - [IsSaving - ] - - [<abstract>ModelEvent]<:-[IsSaving] - - [IsSaved - ] - - [<abstract>ModelEvent]<:-[IsSaved] - - [IsDeleted - ] - - [<abstract>ModelEvent]<:-[IsDeleted] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Config - - - - - - <static>+isDebugMode: bool - <static>+defaultLocale: Set<String> - <static>+supportedLocales: Map<String, String> - <static>+newStudyId: String - <static>+newModelId: String - <static>+minSplashTime: int - <static>+formAutosaveDebounce: int - - - - - - - - - - - ResultTypes - - - - - - - - - - - - MeasurementResultTypes - - - - - - <static>+questionnaire: String - <static>+values: List<String> - - - - - - - - - - - - InterventionResultTypes - - - - - - <static>+checkmarkTask: String - <static>+values: List<String> - - - - - - - - - - - - StudyExportData - - - - - - +study: Study - +measurementsData: List<Map<String, dynamic>> - +interventionsData: List<Map<String, dynamic>> - +mediaData: List<String> - +isEmpty: bool - - - - - - - - - - - Study - - - - - - - - - - - - - StudyTemplates - - - - - - <static>+kUnnamedStudyTitle: String - - - - - - <static>+Study emptyDraft() - - - - - - - - - - - - StudyActionType - - - - - - +index: int - <static>+values: List<StudyActionType> - <static>+pin: StudyActionType - <static>+pinoff: StudyActionType - <static>+edit: StudyActionType - <static>+duplicate: StudyActionType - <static>+duplicateDraft: StudyActionType - <static>+addCollaborator: StudyActionType - <static>+export: StudyActionType - <static>+delete: StudyActionType - - - - - - - - - - - Enum - - - - - - - - - - - - Notifications - - - - - - <static>+credentialsInvalid: SnackbarIntent - <static>+userAlreadyRegistered: SnackbarIntent - <static>+passwordReset: SnackbarIntent - <static>+passwordResetSuccess: SnackbarIntent - <static>+studyDeleted: SnackbarIntent - <static>+inviteCodeDeleted: SnackbarIntent - <static>+inviteCodeClipped: SnackbarIntent - <static>+studyDeleteConfirmation: AlertIntent - - - - - - - - - - - - SnackbarIntent - - - - - - +duration: int? - - - - - - - - - - - - AlertIntent - - - - - - +title: String - +dismissOnAction: bool - +isDestructive: dynamic - - - - - - - - - - - - NotificationDefaultActions - - - - - - <static>+cancel: NotificationAction - - - - - - - - - - - - NotificationAction - - - - - - +label: String - +onSelect: dynamic Function() - +isDestructive: bool - - - - - - - - - - - - INotificationService - - - - - - +void showMessage() - +void show() - +Stream<NotificationIntent> watchNotifications() - +void dispose() - - - - - - - - - - - - - NotificationService - - - - - - -_streamController: BehaviorSubject<NotificationIntent> - - - - - - +Stream<NotificationIntent> watchNotifications() - +void showMessage() - +void show() - +void dispose() - - - - - - - - - - - BehaviorSubject - - - - - - - - - - - - - NotificationIntent - - - - - - +message: String? - +customContent: Widget? - +icon: IconData? - +actions: List<NotificationAction>? - +type: NotificationType - - - - - - +void register() - - - - - - - - - - - Widget - - - - - - - - - - - IconData - - - - - - - - - - - - NotificationType - - - - - - +index: int - <static>+values: List<NotificationType> - <static>+snackbar: NotificationType - <static>+alert: NotificationType - <static>+custom: NotificationType - - - - - - - - - - - dynamic Function() - - - - - - - - - - - - IClipboardService - - - - - - +dynamic copy() - - - - - - - - - - - - ClipboardService - - - - - - +dynamic copy() - - - - - - - - - - - - NotificationDispatcher - - - - - - +child: Widget? - +snackbarInnerPadding: double - +snackbarWidth: double? - +snackbarBehavior: SnackBarBehavior - +snackbarDefaultDuration: int - - - - - - - - - - - SnackBarBehavior - - - - - - - - - - - - Assets - - - - - - <static>+logoWide: String - - - - - - - - - - - - - AsyncValueWidget - - - - - - +value: AsyncValue<T> - +data: Widget Function(T) - +error: Widget Function(Object, StackTrace?)? - +loading: Widget Function()? - +empty: Widget Function()? - - - - - - +Widget build() - -Widget _buildDataOrEmptyWidget() - -Widget _defaultError() - -Widget _defaultLoad() - - - - - - - - - - - AsyncValue - - - - - - - - - - - Widget Function(T) - - - - - - - - - - - Widget Function(Object, StackTrace?)? - - - - - - - - - - - Widget Function()? - - - - - - - - - - - - - FormControlLabel - - - - - - +formControl: AbstractControl<dynamic> - +text: String - +isClickable: bool - +textStyle: TextStyle? - +onClick: void Function(AbstractControl<dynamic>)? - - - - - - +Widget build() - - - - - - - - - - - AbstractControl - - - - - - - - - - - TextStyle - - - - - - - - - - - void Function(AbstractControl<dynamic>)? - - - - - - - - - - - - - ActionPopUpMenuButton - - - - - - +actions: List<ModelAction<dynamic>> - +triggerIconColor: Color? - +triggerIconColorHover: Color? - +triggerIconSize: double - +disableSplashEffect: bool - +hideOnEmpty: bool - +orientation: Axis - +elevation: double? - +splashRadius: double? - +enabled: bool - +position: PopupMenuPosition - - - - - - +Widget build() - -Widget _buildPopupMenu() - - - - - - - - - - - Color - - - - - - - - - - - Axis - - - - - - - - - - - PopupMenuPosition - - - - - - - - - - - - Search - - - - - - +onQueryChanged: dynamic Function(String) - +searchController: SearchController? - +hintText: String? - +initialText: String? - - - - - - - - - - - dynamic Function(String) - - - - - - - - - - - - SearchController - - - - - - +setText: void Function(String) - - - - - - - - - - - void Function(String) - - - - - - - - - - - - FormScaffold - - - - - - +formViewModel: T - +actions: List<Widget>? - +body: Widget - +drawer: Widget? - +actionsSpacing: double - +actionsPadding: double - - - - - - - - - - - - - ConstrainedWidthFlexible - - - - - - +minWidth: double - +maxWidth: double - +flex: int - +flexSum: int - +child: Widget - +outerConstraints: BoxConstraints - - - - - - +Widget build() - -double _getWidth() - - - - - - - - - - - BoxConstraints - - - - - - - - - - - - PrimaryButton - - - - - - +text: String - +icon: IconData? - +isLoading: bool - +showLoadingEarliestAfterMs: int - +onPressed: void Function()? - +tooltip: String - +tooltipDisabled: String - +enabled: bool - +onPressedFuture: dynamic Function()? - +innerPadding: EdgeInsets - +minimumSize: Size? - +isDisabled: bool - - - - - - - - - - - void Function()? - - - - - - - - - - - dynamic Function()? - - - - - - - - - - - EdgeInsets - - - - - - - - - - - Size - - - - - - - - - - - - FormTableRow - - - - - - +label: String? - +labelBuilder: Widget Function(BuildContext)? - +labelStyle: TextStyle? - +labelHelpText: String? - +input: Widget - +control: AbstractControl<dynamic>? - +layout: FormTableRowLayout? - - - - - - - - - - - Widget Function(BuildContext)? - - - - - - - - - - - - FormTableRowLayout - - - - - - +index: int - <static>+values: List<FormTableRowLayout> - <static>+vertical: FormTableRowLayout - <static>+horizontal: FormTableRowLayout - - - - - - - - - - - - - FormTableLayout - - - - - - +rows: List<FormTableRow> - +columnWidths: Map<int, TableColumnWidth> - +rowDivider: Widget? - +rowLayout: FormTableRowLayout? - +rowLabelStyle: TextStyle? - - - - - - +Widget build() - - - - - - - - - - - - - FormSectionHeader - - - - - - +title: String - +titleTextStyle: TextStyle? - +helpText: String? - +divider: bool - +helpTextDisabled: bool - - - - - - +Widget build() - - - - - - - - - - - - - FormLabel - - - - - - +labelText: String? - +helpText: String? - +labelTextStyle: TextStyle? - +layout: FormTableRowLayout? - - - - - - +Widget build() - - - - - - - - - - - - - DismissButton - - - - - - +onPressed: void Function()? - +text: String? - - - - - - +Widget build() - - - - - - - - - - - - - Badge - - - - - - +icon: IconData? - +color: Color? - +borderRadius: double - +label: String - +type: BadgeType - +padding: EdgeInsets - +iconSize: double? - +labelStyle: TextStyle? - +center: bool - - - - - - +Widget build() - -Color? _getBackgroundColor() - -Color _getBorderColor() - -Color? _getLabelColor() - - - - - - - - - - - - BadgeType - - - - - - +index: int - <static>+values: List<BadgeType> - <static>+filled: BadgeType - <static>+outlined: BadgeType - <static>+outlineFill: BadgeType - <static>+plain: BadgeType - - - - - - - - - - - - - StandardDialog - - - - - - +title: Widget? - +titleText: String? - +body: Widget - +actionButtons: List<Widget> - +backgroundColor: Color? - +borderRadius: double? - +width: double? - +height: double? - +minWidth: double - +minHeight: double - +maxWidth: double? - +maxHeight: double? - +padding: EdgeInsets - - - - - - +Widget build() - - - - - - - - - - - - ISyncIndicatorViewModel - - - - - - +isDirty: bool - +lastSynced: DateTime? - - - - - - - - - - - - SyncIndicator - - - - - - +state: AsyncValue<T> - +lastSynced: DateTime? - +isDirty: bool - +animationDuration: int - +iconSize: double - - - - - - - - - - - - IWithBanner - - - - - - +Widget? banner() - - - - - - - - - - - - BannerBox - - - - - - +prefixIcon: Widget? - +body: Widget - +style: BannerStyle - +padding: EdgeInsets? - +noPrefix: bool - +dismissable: bool - +isDismissed: bool? - +onDismissed: dynamic Function()? - +dismissIconSize: double - - - - - - - - - - - - BannerStyle - - - - - - +index: int - <static>+values: List<BannerStyle> - <static>+warning: BannerStyle - <static>+info: BannerStyle - <static>+error: BannerStyle - - - - - - - - - - - - - ActionMenuInline - - - - - - +actions: List<ModelAction<dynamic>> - +iconSize: double? - +visible: bool - +splashRadius: double? - +paddingVertical: double? - +paddingHorizontal: double? - - - - - - +Widget build() - - - - - - - - - - - - Collapsible - - - - - - +contentBuilder: Widget Function(BuildContext, bool) - +headerBuilder: Widget Function(BuildContext, bool)? - +title: String? - +isCollapsed: bool - - - - - - - - - - - Widget Function(BuildContext, bool) - - - - - - - - - - - Widget Function(BuildContext, bool)? - - - - - - - - - - - - NavbarTab - - - - - - +title: String - +intent: RoutingIntent? - +index: int - +enabled: bool - - - - - - - - - - - - - RoutingIntent - - - - - - +route: GoRoute - +params: Map<String, String> - +queryParams: Map<String, String> - +dispatch: RoutingIntentDispatch? - +extra: Object? - +routeName: String - +arguments: Map<String, String> - +props: List<Object?> - - - - - - -dynamic _validateRoute() - +bool matches() - - - - - - - - - - - - TabbedNavbar - - - - - - +tabs: List<T> - +selectedTab: T? - +indicator: BoxDecoration? - +height: double? - +disabledBackgroundColor: Color? - +disabledTooltipText: String? - +onSelect: void Function(int, T)? - +labelPadding: EdgeInsets? - +labelSpacing: double? - +indicatorSize: TabBarIndicatorSize? - +isScrollable: bool - +backgroundColor: Color? - +labelColorHover: Color? - +unselectedLabelColorHover: Color? - - - - - - - - - - - BoxDecoration - - - - - - - - - - - void Function(int, T)? - - - - - - - - - - - TabBarIndicatorSize - - - - - - - - - - - - SidesheetTab - - - - - - +builder: Widget Function(BuildContext) - - - - - - - - - - - Widget Function(BuildContext) - - - - - - - - - - - - Sidesheet - - - - - - <static>+kDefaultWidth: double - +titleText: String - +body: Widget? - +tabs: List<SidesheetTab>? - +actionButtons: List<Widget>? - +width: double? - +withCloseButton: bool - +ignoreAppBar: bool - +collapseSingleTab: bool - +bodyPadding: EdgeInsets? - +wrapContent: Widget Function(Widget)? - - - - - - - - - - - Widget Function(Widget)? - - - - - - - - - - - - FormSideSheetTab - - - - - - +formViewBuilder: Widget Function(T) - - - - - - - - - - - - - HelpIcon - - - - - - +tooltipText: String? - - - - - - +Widget build() - - - - - - - - - - - - - EmptyBody - - - - - - +icon: IconData? - +leading: Widget? - +leadingSpacing: double? - +title: String? - +description: String? - +button: Widget? - - - - - - +Widget build() - - - - - - - - - - - - - IndicatorRangeSliderThumbShape - - - - - - +buildContext: BuildContext - +start: T - +end: T - - - - - - +Size getPreferredSize() - +void paint() - - - - - - - - - - - BuildContext - - - - - - - - - - - RangeSliderThumbShape - - - - - - - - - - - - MouseEventsRegion - - - - - - +onTap: void Function()? - +onHover: void Function(PointerHoverEvent)? - +onEnter: void Function(PointerEnterEvent)? - +onExit: void Function(PointerExitEvent)? - +autoselectCursor: bool - +cursor: SystemMouseCursor - <static>+defaultCursor: SystemMouseCursor - +autoCursor: SystemMouseCursor - - - - - - - - - - - void Function(PointerHoverEvent)? - - - - - - - - - - - void Function(PointerEnterEvent)? - - - - - - - - - - - void Function(PointerExitEvent)? - - - - - - - - - - - SystemMouseCursor - - - - - - - - - - - ReactiveCustomColorPicker - - - - - - - - - - - ReactiveFormField - - - - - - - - - - - - - TextParagraph - - - - - - +text: String? - +style: TextStyle? - +selectable: bool - +span: List<TextSpan>? - - - - - - +Widget build() - - - - - - - - - - - - UnderConstruction - - - - - - +Widget build() - - - - - - - - - - - NullHelperDecoration - - - - - - - - - - - InputDecoration - - - - - - - - - - - - ActionMenuType - - - - - - +index: int - <static>+values: List<ActionMenuType> - <static>+inline: ActionMenuType - <static>+popup: ActionMenuType - - - - - - - - - - - - - HtmlStylingBanner - - - - - - +isDismissed: bool - +onDismissed: dynamic Function()? - - - - - - +Widget build() - - - - - - - - - - - - FormConsumerWidget - - - - - - +Widget build() - - - - - - - - - - - - FormConsumerRefWidget - - - - - - +Widget build() - - - - - - - - - - - - SplashPage - - - - - - +Widget build() - - - - - - - - - - - - - ErrorPage - - - - - - +error: Exception? - - - - - - +Widget build() - - - - - - - - - - - ConsumerWidget - - - - - - - - - - - - - StudyULogo - - - - - - +onTap: void Function()? - - - - - - +Widget build() - - - - - - - - - - - - - SingleColumnLayout - - - - - - <static>+defaultConstraints: BoxConstraints - <static>+defaultConstraintsNarrow: BoxConstraints - +body: Widget - +header: Widget? - +stickyHeader: bool - +constraints: BoxConstraints? - +scroll: bool - +padding: EdgeInsets? - - - - - - <static>+dynamic fromType() - - - - - - - - - - - - SingleColumnLayoutType - - - - - - +index: int - <static>+values: List<SingleColumnLayoutType> - <static>+boundedWide: SingleColumnLayoutType - <static>+boundedNarrow: SingleColumnLayoutType - <static>+stretched: SingleColumnLayoutType - <static>+split: SingleColumnLayoutType - - - - - - - - - - - - Hyperlink - - - - - - +text: String - +url: String? - +onClick: void Function()? - +linkColor: Color - +hoverColor: Color? - +visitedColor: Color? - +style: TextStyle? - +hoverStyle: TextStyle? - +visitedStyle: TextStyle? - +icon: IconData? - +iconSize: double? - - - - - - - - - - - - StandardTableColumn - - - - - - +label: String - +tooltip: String? - +columnWidth: TableColumnWidth - +sortable: bool - +sortAscending: bool? - +sortableIcon: Widget? - - - - - - - - - - - TableColumnWidth - - - - - - - - - - - - StandardTable - - - - - - +items: List<T> - +inputColumns: List<StandardTableColumn> - +onSelectItem: void Function(T) - +trailingActionsAt: List<ModelAction<dynamic>> Function(T, int)? - +trailingActionsMenuType: ActionMenuType? - +sortColumnPredicates: List<int Function(T, T)?>? - +pinnedPredicates: int Function(T, T)? - +headerRowBuilder: TableRow Function(BuildContext, List<StandardTableColumn>)? - +dataRowBuilder: TableRow Function(BuildContext, List<StandardTableColumn>)? - +inputTrailingActionsColumn: StandardTableColumn - +tableWrapper: Widget Function(Widget)? - +cellSpacing: double - +rowSpacing: double - +minRowHeight: double? - +showTableHeader: bool - +hideLeadingTrailingWhenEmpty: bool - +leadingWidget: Widget? - +trailingWidget: Widget? - +leadingWidgetSpacing: double? - +trailingWidgetSpacing: double? - +emptyWidget: Widget? - +rowStyle: StandardTableStyle - +disableRowInteractions: bool - - - - - - - - - - - void Function(T) - - - - - - - - - - - List<ModelAction<dynamic>> Function(T, int)? - - - - - - - - - - - int Function(T, T)? - - - - - - - - - - - TableRow Function(BuildContext, List<StandardTableColumn>)? - - - - - - - - - - - - StandardTableStyle - - - - - - +index: int - <static>+values: List<StandardTableStyle> - <static>+plain: StandardTableStyle - <static>+material: StandardTableStyle - - - - - - - - - - - - - IconPack - - - - - - <static>+defaultPack: List<IconOption> - <static>+material: List<IconOption> - - - - - - <static>+IconOption? resolveIconByName() - - - - - - - - - - - - - IconOption - - - - - - +name: String - +icon: IconData? - +isEmpty: bool - +props: List<Object?> - - - - - - +String toJson() - <static>+IconOption fromJson() - - - - - - - - - - - Equatable - - - - - - - - - - - ReactiveIconPicker - - - - - - - - - - - ReactiveFocusableFormField - - - - - - - - - - - - - IconPicker - - - - - - +iconOptions: List<IconOption> - +selectedOption: IconOption? - +onSelect: void Function(IconOption)? - +galleryIconSize: double? - +selectedIconSize: double? - +focusNode: FocusNode? - +isDisabled: bool - - - - - - +Widget build() - - - - - - - - - - - void Function(IconOption)? - - - - - - - - - - - FocusNode - - - - - - - - - - - - - IconPickerField - - - - - - +iconOptions: List<IconOption> - +selectedOption: IconOption? - +selectedIconSize: double? - +galleryIconSize: double? - +onSelect: void Function(IconOption)? - +focusNode: FocusNode? - +isDisabled: bool - - - - - - +Widget build() - - - - - - - - - - - - - IconPickerGallery - - - - - - +iconOptions: List<IconOption> - +onSelect: void Function(IconOption)? - +iconSize: double - - - - - - +Widget build() - - - - - - - - - - - - - SecondaryButton - - - - - - +text: String - +icon: IconData? - +isLoading: bool - +onPressed: void Function()? - - - - - - +Widget build() - - - - - - - - - - - - TwoColumnLayout - - - - - - <static>+defaultDivider: VerticalDivider - <static>+defaultContentPadding: EdgeInsets - <static>+slimContentPadding: EdgeInsets - +leftWidget: Widget - +rightWidget: Widget - +dividerWidget: Widget? - +headerWidget: Widget? - +flexLeft: int? - +flexRight: int? - +constraintsLeft: BoxConstraints? - +constraintsRight: BoxConstraints? - +scrollLeft: bool - +scrollRight: bool - +paddingLeft: EdgeInsets? - +paddingRight: EdgeInsets? - +backgroundColorLeft: Color? - +backgroundColorRight: Color? - +stretchHeight: bool - - - - - - - - - - - VerticalDivider - - - - - - - - - - - - AppTranslation - - - - - - <static>+dynamic init() - - - - - - - - - - - - PlatformLocale - - - - - - +Locale getPlatformLocale() - - - - - - - - - - - - PlatformLocaleWeb - - - - - - +Locale getPlatformLocale() - - - - - - - - - - - - PlatformLocaleMobile - - - - - - +Locale getPlatformLocale() - - - - - - - - - - - - LanguagePicker - - - - - - +languagePickerType: LanguagePickerType - +iconColor: Color? - +offset: Offset? - - - - - - - - - - - - LanguagePickerType - - - - - - +index: int - <static>+values: List<LanguagePickerType> - <static>+field: LanguagePickerType - <static>+icon: LanguagePickerType - - - - - - - - - - - Offset - - - - - - - - - - - - GoRouteParamEnum - - - - - - +String toRouteParam() - +String toShortString() - - - - - - - - - - - - RoutingIntents - - - - - - <static>+root: RoutingIntent - <static>+studies: RoutingIntent - <static>+studiesShared: RoutingIntent - <static>+publicRegistry: RoutingIntent - <static>+study: RoutingIntent Function(String) - <static>+studyEdit: RoutingIntent Function(String) - <static>+studyEditInfo: RoutingIntent Function(String) - <static>+studyEditEnrollment: RoutingIntent Function(String) - <static>+studyEditInterventions: RoutingIntent Function(String) - <static>+studyEditIntervention: RoutingIntent Function(String, String) - <static>+studyEditMeasurements: RoutingIntent Function(String) - <static>+studyEditReports: RoutingIntent Function(String) - <static>+studyEditMeasurement: RoutingIntent Function(String, String) - <static>+studyTest: RoutingIntent Function(String, {String? appRoute}) - <static>+studyRecruit: RoutingIntent Function(String) - <static>+studyMonitor: RoutingIntent Function(String) - <static>+studyAnalyze: RoutingIntent Function(String) - <static>+studySettings: RoutingIntent Function(String) - <static>+accountSettings: RoutingIntent - <static>+studyNew: RoutingIntent - <static>+login: RoutingIntent - <static>+signup: RoutingIntent - <static>+passwordForgot: RoutingIntent - <static>+passwordForgot2: RoutingIntent Function(String) - <static>+passwordRecovery: RoutingIntent - <static>+error: RoutingIntent Function(Exception) - - - - - - - - - - - RoutingIntent Function(String) - - - - - - - - - - - RoutingIntent Function(String, String) - - - - - - - - - - - RoutingIntent Function(String, {String? appRoute}) - - - - - - - - - - - RoutingIntent Function(Exception) - - - - - - - - - - - GoRoute - - - - - - - - - - - - RoutingIntentDispatch - - - - - - +index: int - <static>+values: List<RoutingIntentDispatch> - <static>+go: RoutingIntentDispatch - <static>+push: RoutingIntentDispatch - - - - - - - - - - - - RouterKeys - - - - - - <static>+studyKey: ValueKey<String> - <static>+authKey: ValueKey<String> - - - - - - - - - - - ValueKey - - - - - - - - - - - - RouteParams - - - - - - <static>+studiesFilter: String - <static>+studyId: String - <static>+measurementId: String - <static>+interventionId: String - <static>+testAppRoute: String - - - - - - - - - - - - - RouterConf - - - - - - <static>+router: GoRouter - <static>+routes: List<GoRoute> - <static>+publicRoutes: List<GoRoute> - <static>+privateRoutes: List<GoRoute> - - - - - - <static>+GoRoute route() - - - - - - - - - - - GoRouter - - - - - - - - - - - - StudyFormRouteArgs - - - - - - +studyId: String - - - - - - - - - - - - QuestionFormRouteArgs - - - - - - +questionId: String - - - - - - - - - - - ScreenerQuestionFormRouteArgs - - - - - - - - - - - - ConsentItemFormRouteArgs - - - - - - +consentId: String - - - - - - - - - - - - MeasurementFormRouteArgs - - - - - - +measurementId: String - - - - - - - - - - - - SurveyQuestionFormRouteArgs - - - - - - +questionId: String - - - - - - - - - - - - InterventionFormRouteArgs - - - - - - +interventionId: String - - - - - - - - - - - - InterventionTaskFormRouteArgs - - - - - - +taskId: String - - - - - - - - - - - - ReportItemFormRouteArgs - - - - - - +sectionId: String - - - - - - - - - - - - DropdownMenuItemTheme - - - - - - +iconTheme: IconThemeData? - - - - - - - - - - - IconThemeData - - - - - - - - - - - Diagnosticable - - - - - - - - - - - - - ThemeConfig - - - - - - <static>+kMinContentWidth: double - <static>+kMaxContentWidth: double - <static>+kHoverFadeFactor: double - <static>+kMuteFadeFactor: double - - - - - - <static>+dynamic bodyBackgroundColor() - <static>+Color modalBarrierColor() - <static>+Color containerColor() - <static>+Color colorPickerInitialColor() - <static>+TextStyle bodyTextMuted() - <static>+TextStyle bodyTextBackground() - <static>+double iconSplashRadius() - <static>+Color sidesheetBackgroundColor() - <static>+InputDecorationTheme dropdownInputDecorationTheme() - <static>+DropdownMenuItemTheme dropdownMenuItemTheme() - - - - - - - - - - - - NoAnimationPageTransitionsBuilder - - - - - - +Widget buildTransitions() - - - - - - - - - - - PageTransitionsBuilder - - - - - - - - - - - - WebTransitionBuilder - - - - - - +Widget buildTransitions() - - - - - - - - - - - - ThemeSettingChange - - - - - - +settings: ThemeSettings - - - - - - - - - - - - ThemeSettings - - - - - - +sourceColor: Color - +themeMode: ThemeMode - - - - - - - - - - - Notification - - - - - - - - - - - - - ThemeProvider - - - - - - +settings: ValueNotifier<ThemeSettings> - +lightDynamic: ColorScheme? - +darkDynamic: ColorScheme? - +pageTransitionsTheme: PageTransitionsTheme - +shapeMedium: ShapeBorder - - - - - - +Color custom() - +Color blend() - +Color source() - +ColorScheme colors() - +CardTheme cardTheme() - +ListTileThemeData listTileTheme() - +AppBarTheme appBarTheme() - +SnackBarThemeData snackBarThemeData() - +TabBarTheme tabBarTheme() - +BottomAppBarTheme bottomAppBarTheme() - +BottomNavigationBarThemeData bottomNavigationBarTheme() - +SwitchThemeData switchTheme() - +InputDecorationTheme inputDecorationTheme() - +TextTheme textTheme() - +DividerThemeData dividerTheme() - +NavigationRailThemeData navigationRailTheme() - +DrawerThemeData drawerTheme() - +IconThemeData iconTheme() - +CheckboxThemeData checkboxTheme() - +RadioThemeData radioTheme() - +TooltipThemeData tooltipTheme() - +ThemeData light() - +ThemeData dark() - +ThemeMode themeMode() - +ThemeData theme() - <static>+ThemeProvider of() - +bool updateShouldNotify() - - - - - - - - - - - ValueNotifier - - - - - - - - - - - ColorScheme - - - - - - - - - - - PageTransitionsTheme - - - - - - - - - - - ShapeBorder - - - - - - - - - - - InheritedWidget - - - - - - - - - - - ThemeMode - - - - - - - - - - - - - CustomColor - - - - - - +name: String - +color: Color - +blend: bool - - - - - - +Color value() - - - - - - - - - - - - - SuppressedBehaviorSubject - - - - - - +subject: BehaviorSubject<T> - +didSuppressInitialEvent: bool - -_controller: StreamController<T> - - - - - - -StreamController<T> _buildDerivedController() - +dynamic close() - - - - - - - - - - - StreamController - - - - - - - - - - - - Time - - - - - - <static>+dynamic fromTimeOfDay() - +Map<String, dynamic> toJson() - <static>+Time fromJson() - - - - - - - - - - - TimeOfDay - - - - - - - - - - - - TimeValueAccessor - - - - - - +String modelToViewValue() - +Time? viewToModelValue() - -String _addLeadingZeroIfNeeded() - - - - - - - - - - - ControlValueAccessor - - - - - - - - - - - - ModelAction - - - - - - +type: T - +label: String - +icon: IconData? - +onExecute: Function - +isAvailable: bool - +isDestructive: bool - - - - - - - - - - - - IModelActionProvider - - - - - - +List<ModelAction<dynamic>> availableActions() - - - - - - - - - - - - IListActionProvider - - - - - - +void onSelectItem() - +void onNewItem() - - - - - - - - - - - - ModelActionType - - - - - - +index: int - <static>+values: List<ModelActionType> - <static>+edit: ModelActionType - <static>+delete: ModelActionType - <static>+remove: ModelActionType - <static>+duplicate: ModelActionType - <static>+clipboard: ModelActionType - <static>+primary: ModelActionType - - - - - - - - - - - - - OptimisticUpdate - - - - - - +applyOptimistic: void Function() - +apply: dynamic Function() - +rollback: void Function() - +onUpdate: void Function()? - +onError: void Function(Object, StackTrace?)? - +rethrowErrors: bool - +runOptimistically: bool - +completeFutureOptimistically: bool - - - - - - +dynamic execute() - -void _runUpdateHandlerIfAny() - - - - - - - - - - - void Function() - - - - - - - - - - - void Function(Object, StackTrace?)? - - - - - - - - - - - - FileFormatEncoder - - - - - - +dynamic encodeAsync() - +String encode() - +dynamic call() - - - - - - - - - - - - CSVStringEncoder - - - - - - +String encode() - - - - - - - - - - - - JsonStringEncoder - - - - - - +String encode() - - - - - - - - - - - - - ExecutionLimiter - - - - - - +milliseconds: int - <static>-_timer: Timer? - - - - - - +void dispose() - - - - - - - - - - - Timer - - - - - - - - - - - - - Debouncer - - - - - - +leading: bool - +cancelUncompleted: bool - -_uncompletedFutureOperation: CancelableOperation<dynamic>? - - - - - - +dynamic call() - - - - - - - - - - - CancelableOperation - - - - - - - - - - - - Throttler - - - - - - +dynamic call() - - - - - - - - - - - - SerializableColor - - - - - - +Map<String, dynamic> toJson() - <static>+SerializableColor fromJson() - - - - - - - - - - - - IProviderArgsResolver - - - - - - +R provide() - - - - - - - - - - - - - CombinedStreamNotifier - - - - - - -_subscriptions: List<StreamSubscription<dynamic>> - - - - - - +void dispose() - - - - - - - - - - - ChangeNotifier - - - - - - - - - - - - - CountWhereValidator - - - - - - +predicate: bool Function(T?) - +minCount: int? - +maxCount: int? - <static>+kValidationMessageMinCount: String - <static>+kValidationMessageMaxCount: String - - - - - - +Map<String, dynamic>? validate() - - - - - - - - - - - bool Function(T?) - - - - - - - - - - - Validator - - - - - - - - - - - - Patterns - - - - - - <static>+timeFormatString: String - <static>+emailFormatString: String - <static>+url: String - - - - - - - - - - - - - NumericalRangeFormatter - - - - - - +min: int? - +max: int? - - - - - - +TextEditingValue formatEditUpdate() - - - - - - - - - - - TextInputFormatter - - - - - - - - - - - - StudySequenceFormatter - - - - - - +TextEditingValue formatEditUpdate() - - - - - - - - - - - - - Tuple - - - - - - +first: T1 - +second: T2 - +props: List<Object?> - - - - - - +Map<String, dynamic> toJson() - <static>+Tuple<dynamic, dynamic> fromJson() - +Tuple<T1, T2> copy() - +Tuple<T1, T2> copyWith() - - - - - - - - - - - - - JsonFileLoader - - - - - - +jsonAssetsPath: String - - - - - - +dynamic loadJson() - +dynamic parseJsonMapFromAssets() - +dynamic parseJsonListFromAssets() - - - - - - - - - - - - IAppDelegate - - - - - - +dynamic onAppStart() - - - - - - - - - - - - - AppController - - - - - - +appDelegates: List<IAppDelegate> - -_delayedFuture: dynamic - +isInitialized: dynamic - - - - - - +dynamic onAppStart() - -dynamic _callDelegates() - - - - - - - - - - - - StudyMonitorScreen - - - - - - +Widget build() - - - - - - - - - - - - - StudyPageWidget - - - - - - +studyId: String - - - - - - +Widget? banner() - - - - - - - - - - - - - LoginForm - - - - - - +formKey: AuthFormKey - - - - - - +Widget build() - - - - - - - - - - - - AuthFormKey - - - - - - +index: int - <static>+values: List<AuthFormKey> - <static>+login: AuthFormKey - <static>+signup: AuthFormKey - <static>+passwordForgot: AuthFormKey - <static>+passwordRecovery: AuthFormKey - <static>-_loginSubmit: AuthFormKey - <static>-_signupSubmit: AuthFormKey - - - - - - - - - - - - - PasswordRecoveryForm - - - - - - +formKey: AuthFormKey - - - - - - +Widget build() - - - - - - - - - - - - - PasswordForgotForm - - - - - - +formKey: AuthFormKey - - - - - - +Widget build() - - - - - - - - - - - - - SignupForm - - - - - - +formKey: AuthFormKey - - - - - - +Widget build() - -dynamic _onClickTermsOfUse() - -dynamic _onClickPrivacyPolicy() - - - - - - - - - - - - AuthScaffold - - - - - - +body: Widget - +formKey: AuthFormKey - +leftContentMinWidth: double - +leftPanelMinWidth: double - +leftPanelPadding: EdgeInsets - - - - - - - - - - - - EmailTextField - - - - - - +labelText: String - +hintText: String? - +formControlName: String? - +formControl: FormControl<dynamic>? - - - - - - - - - - - FormControl - - - - - - - - - - - - PasswordTextField - - - - - - +labelText: String - +hintText: String? - +onSubmitted: dynamic Function(FormControl<dynamic>)? - +formControlName: String? - +formControl: FormControl<dynamic>? - - - - - - - - - - - dynamic Function(FormControl<dynamic>)? - - - - - - - - - - - - StudyUJobsToBeDone - - - - - - +Widget build() - - - - - - - - - - - - - AuthFormController - - - - - - +authRepository: IAuthRepository - +notificationService: INotificationService - +router: GoRouter - +emailControl: FormControl<String> - +passwordControl: FormControl<String> - +passwordConfirmationControl: FormControl<String> - +termsOfServiceControl: FormControl<bool> - <static>+authValidationMessages: Map<String, String Function(dynamic)> - +loginForm: FormGroup - +signupForm: FormGroup - +passwordForgotForm: FormGroup - +passwordRecoveryForm: FormGroup - +controlValidatorsByForm: Map<AuthFormKey, Map<FormControl<dynamic>, List<Validator<dynamic>>>> - -_formKey: AuthFormKey - +formKey: AuthFormKey - +form: FormGroup - - - - - - -dynamic _getFormFor() - -dynamic _onChangeFormKey() - +dynamic resetControlsFor() - -dynamic _forceValidationMessages() - +dynamic signUp() - -dynamic _signUp() - +dynamic signIn() - -dynamic _signInWith() - +dynamic signOut() - +dynamic resetPasswordForEmail() - +dynamic sendPasswordResetLink() - +dynamic recoverPassword() - +dynamic updateUser() - -dynamic _readDebugUser() - - - - - - - - - - - - - IAuthRepository - - - - - - +allowPasswordReset: bool - +currentUser: User? - +isLoggedIn: bool - +session: Session? - +serializedSession: String? - - - - - - +dynamic signUp() - +dynamic signInWith() - +dynamic signOut() - +dynamic resetPasswordForEmail() - +dynamic updateUser() - +void dispose() - - - - - - - - - - - FormGroup - - - - - - - - - - - - IFormGroupController - - - - - - +form: FormGroup - - - - - - - - - - - - AppStatus - - - - - - +index: int - <static>+values: List<AppStatus> - <static>+initializing: AppStatus - <static>+initialized: AppStatus - - - - - - - - - - - - - FormArrayTable - - - - - - +control: AbstractControl<dynamic> - +items: List<T> - +onSelectItem: void Function(T) - +getActionsAt: List<ModelAction<dynamic>> Function(T, int) - +onNewItem: void Function()? - +rowTitle: String Function(T) - +onNewItemLabel: String - +sectionTitle: String? - +sectionDescription: String? - +emptyIcon: IconData? - +emptyTitle: String? - +emptyDescription: String? - +sectionTitleDivider: bool? - +rowPrefix: Widget Function(BuildContext, T, int)? - +rowSuffix: Widget Function(BuildContext, T, int)? - +leadingWidget: Widget? - +itemsSectionPadding: EdgeInsets? - +hideLeadingTrailingWhenEmpty: bool - <static>+columns: List<StandardTableColumn> - - - - - - +Widget build() - -List<Widget> _buildRow() - -Widget _newItemButton() - - - - - - - - - - - List<ModelAction<dynamic>> Function(T, int) - - - - - - - - - - - String Function(T) - - - - - - - - - - - Widget Function(BuildContext, T, int)? - - - - - - - - - - - - ManagedFormViewModel - - - - - - +ManagedFormViewModel<T> createDuplicate() - - - - - - - - - - - - - FormViewModel - - - - - - -_formData: T? - -_formMode: FormMode - -_validationSet: FormValidationSetEnum? - +delegate: IFormViewModelDelegate<FormViewModel<dynamic>>? - +autosave: bool - -_immediateFormChildrenSubscriptions: List<StreamSubscription<dynamic>> - -_immediateFormChildrenListenerDebouncer: Debouncer? - -_autosaveOperation: CancelableOperation<dynamic>? - -_defaultControlValidators: Map<String, Tuple<List<Validator<dynamic>>, List<AsyncValidator<dynamic>>>> - +prevFormValue: Map<String, dynamic>? - <static>-_formKey: String - +formData: T? - +formMode: FormMode - +isReadonly: bool - +validationSet: FormValidationSetEnum? - +isDirty: bool - +title: String - +isValid: bool - +titles: Map<FormMode, String> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - - - - - - -dynamic _setFormData() - -dynamic _rememberDefaultControlValidators() - -Tuple<List<Validator<dynamic>>, List<AsyncValidator<dynamic>>>? _getDefaultValidators() - -dynamic _disableAllControls() - -dynamic _formModeUpdated() - -dynamic _restoreControlsFromFormData() - +void revalidate() - -void _applyValidationSet() - +void read() - +dynamic save() - +dynamic cancel() - +void enableAutosave() - +void listenToImmediateFormChildren() - +dynamic markFormGroupChanged() - +void dispose() - +void setControlsFrom() - +T buildFormData() - +void initControls() - - - - - - - - - - - FormViewModelNotFoundException - - - - - - - - - - - Exception - - - - - - - - - - - - - FormViewModelCollection - - - - - - +formViewModels: List<T> - +formArray: FormArray<dynamic> - +stagedViewModels: List<T> - +retrievableViewModels: List<T> - +formData: List<D> - - - - - - +void add() - +T remove() - +T? findWhere() - +T? removeWhere() - +bool contains() - +void stage() - +T commit() - +void reset() - +void read() - - - - - - - - - - - FormArray - - - - - - - - - - - - - CustomFormControl - - - - - - -_onValueChangedDebouncer: Debouncer? - -_onStatusChangedDebouncer: Debouncer? - +onValueChanged: void Function(T?)? - +onStatusChanged: void Function(ControlStatus)? - +onStatusChangedDebounceTime: int? - +onValueChangedDebounceTime: int? - - - - - - +void dispose() - - - - - - - - - - - void Function(T?)? - - - - - - - - - - - void Function(ControlStatus)? - - - - - - - - - - - - UnsavedChangesDialog - - - - - - +Widget build() - - - - - - - - - - - FormValidationSetEnum - - - - - - - - - - - - - FormControlValidation - - - - - - +control: AbstractControl<dynamic> - +validators: List<Validator<dynamic>> - +asyncValidators: List<AsyncValidator<dynamic>>? - +validationMessages: Map<String, String Function(Object)> - - - - - - +FormControlValidation merge() - - - - - - - - - - - - - IFormData - - - - - - +id: String - - - - - - +IFormData copy() - - - - - - - - - - - FormInvalidException - - - - - - - - - - - - FormConfigException - - - - - - +message: String? - - - - - - - - - - - - IFormViewModelDelegate - - - - - - +dynamic onSave() - +void onCancel() - - - - - - - - - - - - FormControlOption - - - - - - +value: T - +label: String - +description: String? - +props: List<Object?> - - - - - - - - - - - - FormMode - - - - - - +index: int - <static>+values: List<FormMode> - <static>+create: FormMode - <static>+readonly: FormMode - <static>+edit: FormMode - - - - - - - - - - - - - EnrolledBadge - - - - - - +enrolledCount: int - - - - - - +Widget build() - - - - - - - - - - - - - StudyRecruitController - - - - - - +inviteCodeRepository: IInviteCodeRepository - -_invitesSubscription: StreamSubscription<List<WrappedModel<StudyInvite>>>? - - - - - - -dynamic _subscribeInvites() - +Intervention? getIntervention() - +int getParticipantCountForInvite() - +List<ModelAction<dynamic>> availableActions() - +List<ModelAction<dynamic>> availableInlineActions() - +void dispose() - - - - - - - - - - - - IInviteCodeRepository - - - - - - +dynamic isCodeAlreadyUsed() - - - - - - - - - - - StreamSubscription - - - - - - - - - - - - - StudyBaseController - - - - - - +studyId: String - +studyRepository: IStudyRepository - +router: GoRouter - +studySubscription: StreamSubscription<WrappedModel<Study>>? - - - - - - +dynamic subscribeStudy() - +dynamic onStudySubscriptionUpdate() - +dynamic onStudySubscriptionError() - +void dispose() - - - - - - - - - - - - StudyRecruitScreen - - - - - - +Widget build() - -Widget _inviteCodesSectionHeader() - -Widget _newInviteCodeButton() - -dynamic _onSelectInvite() - - - - - - - - - - - - - InviteCodeFormView - - - - - - +formViewModel: InviteCodeFormViewModel - - - - - - +Widget build() - -List<FormTableRow> _conditionalInterventionRows() - - - - - - - - - - - - - InviteCodeFormViewModel - - - - - - +study: Study - +inviteCodeRepository: IInviteCodeRepository - +codeControl: FormControl<String> - +codeControlValidationMessages: Map<String, String Function(dynamic)> - +isPreconfiguredScheduleControl: FormControl<bool> - +preconfiguredScheduleTypeControl: FormControl<PhaseSequence> - +interventionAControl: FormControl<String> - +interventionBControl: FormControl<String> - +form: FormGroup - +titles: Map<FormMode, String> - +interventionControlOptions: List<FormControlOption<String>> - +preconfiguredScheduleTypeOptions: List<FormControlOption<PhaseSequence>> - +isPreconfiguredSchedule: bool - +preconfiguredSchedule: List<String>? - - - - - - +void initControls() - -dynamic _uniqueInviteCode() - +void regenerateCode() - -String _generateCode() - +StudyInvite buildFormData() - +void setControlsFrom() - +dynamic save() - - - - - - - - - - - - - StudyInvitesTable - - - - - - +invites: List<StudyInvite> - +onSelect: void Function(StudyInvite) - +getActions: List<ModelAction<dynamic>> Function(StudyInvite) - +getInlineActions: List<ModelAction<dynamic>> Function(StudyInvite) - +getIntervention: Intervention? Function(String) - +getParticipantCountForInvite: int Function(StudyInvite) - - - - - - +Widget build() - -List<Widget> _buildRow() - - - - - - - - - - - void Function(StudyInvite) - - - - - - - - - - - List<ModelAction<dynamic>> Function(StudyInvite) - - - - - - - - - - - Intervention? Function(String) - - - - - - - - - - - int Function(StudyInvite) - - - - - - - - - - - - PublishSuccessDialog - - - - - - +Widget build() - - - - - - - - - - - - PublishDialog - - - - - - +Widget build() - - - - - - - - - - - - PublishConfirmationDialog - - - - - - +Widget build() - - - - - - - - - - - - - FrameControlsWidget - - - - - - +onRefresh: void Function()? - +onOpenNewTab: void Function()? - +enabled: bool - - - - - - +Widget build() - - - - - - - - - - - - IStudyStatusBadgeViewModel - - - - - - +studyParticipation: Participation? - +studyStatus: StudyStatus? - - - - - - - - - - - Participation - - - - - - - - - - - StudyStatus - - - - - - - - - - - - - StudyStatusBadge - - - - - - +participation: Participation? - +status: StudyStatus? - +type: BadgeType - +showPrefixIcon: bool - +showTooltip: bool - - - - - - +Widget build() - - - - - - - - - - - - - RouteInformation - - - - - - +route: String? - +extra: String? - +cmd: String? - +data: String? - - - - - - +String toString() - - - - - - - - - - - - - PlatformController - - - - - - +studyId: String - +baseSrc: String - +previewSrc: String - +routeInformation: RouteInformation - +frameWidget: Widget - - - - - - +void activate() - +void registerViews() - +void generateUrl() - +void navigate() - +void refresh() - +void listen() - +void send() - +void openNewPage() - - - - - - - - - - - - - WebController - - - - - - +iFrameElement: IFrameElement - - - - - - +void activate() - +void registerViews() - +void generateUrl() - +void navigate() - +void refresh() - +void openNewPage() - +void listen() - +void send() - - - - - - - - - - - IFrameElement - - - - - - - - - - - - MobileController - - - - - - +void openNewPage() - +void refresh() - +void registerViews() - +void listen() - +void send() - +void navigate() - +void activate() - +void generateUrl() - - - - - - - - - - - - - StudyController - - - - - - +notificationService: INotificationService - +studyEventsSubscription: StreamSubscription<ModelEvent<Study>>? - +studyActions: List<ModelAction<dynamic>> - - - - - - +dynamic syncStudyStatus() - +dynamic onStudySubscriptionUpdate() - -dynamic _redirectNewToActualStudyID() - +dynamic publishStudy() - +void onChangeStudyParticipation() - +void onAddParticipants() - +void onSettingsPressed() - +void dispose() - - - - - - - - - - - - IStudyNavViewModel - - - - - - +isEditTabEnabled: bool - +isTestTabEnabled: bool - +isRecruitTabEnabled: bool - +isMonitorTabEnabled: bool - +isAnalyzeTabEnabled: bool - +isSettingsEnabled: bool - - - - - - - - - - - - StudyNav - - - - - - <static>+dynamic tabs() - <static>+dynamic edit() - <static>+dynamic test() - <static>+dynamic recruit() - <static>+dynamic monitor() - <static>+dynamic analyze() - - - - - - - - - - - - StudyDesignNav - - - - - - <static>+dynamic tabs() - <static>+dynamic info() - <static>+dynamic enrollment() - <static>+dynamic interventions() - <static>+dynamic measurements() - <static>+dynamic reports() - - - - - - - - - - - - - StudyParticipationBadge - - - - - - +participation: Participation - +type: BadgeType - +showPrefixIcon: bool - +center: bool - - - - - - +Widget build() - - - - - - - - - - - - IStudyRepository - - - - - - +dynamic launch() - +dynamic deleteParticipants() - - - - - - - - - - - - PreviewFrame - - - - - - +studyId: String - +routeArgs: StudyFormRouteArgs? - +route: String? - - - - - - - - - - - - IStudyAppBarViewModel - - - - - - +isSyncIndicatorVisible: bool - +isStatusBadgeVisible: bool - +isPublishVisible: bool - - - - - - - - - - - - StudyScaffold - - - - - - +studyId: String - +tabs: List<NavbarTab>? - +tabsSubnav: List<NavbarTab>? - +selectedTab: NavbarTab? - +selectedTabSubnav: NavbarTab? - +body: StudyPageWidget - +drawer: Widget? - +disableActions: bool - +actionsSpacing: double - +actionsPadding: double - +layoutType: SingleColumnLayoutType? - +appbarHeight: double - +appbarSubnavHeight: double - - - - - - - - - - - - - WebFrame - - - - - - +previewSrc: String - +studyId: String - - - - - - +Widget build() - - - - - - - - - - - - DisabledFrame - - - - - - +Widget build() - - - - - - - - - - - - - PhoneContainer - - - - - - <static>+defaultWidth: double - <static>+defaultHeight: double - +width: double - +height: double - +borderColor: Color - +borderWidth: double - +borderRadius: double - +innerContent: Widget - +innerContentBackgroundColor: Color? - - - - - - +Widget build() - - - - - - - - - - - - MobileFrame - - - - - - +Widget build() - - - - - - - - - - - - DesktopFrame - - - - - - +Widget build() - - - - - - - - - - - - - StudyTestScreen - - - - - - +previewRoute: String? - - - - - - +Widget build() - +Widget? banner() - +dynamic load() - +dynamic save() - +dynamic showHelp() - - - - - - - - - - - - - StudySettingsFormViewModel - - - - - - +study: AsyncValue<Study> - +studyRepository: IStudyRepository - <static>+defaultPublishedToRegistry: bool - <static>+defaultPublishedToRegistryResults: bool - +isPublishedToRegistryControl: FormControl<bool> - +isPublishedToRegistryResultsControl: FormControl<bool> - +form: FormGroup - +titles: Map<FormMode, String> - - - - - - +void setControlsFrom() - +Study buildFormData() - +dynamic keepControlsSynced() - +dynamic save() - +dynamic setLaunchDefaults() - - - - - - - - - - - - StudySettingsDialog - - - - - - +Widget build() - - - - - - - - - - - - StudyTestController - - - - - - +authRepository: IAuthRepository - +languageCode: String - - - - - - - - - - - - TestAppRoutes - - - - - - <static>+studyOverview: String - <static>+eligibility: String - <static>+intervention: String - <static>+consent: String - <static>+journey: String - <static>+dashboard: String - - - - - - - - - - - - - DrawerEntry - - - - - - +localizedTitle: String Function() - +icon: IconData? - +localizedHelpText: String Function()? - +enabled: bool - +onSelected: void Function(BuildContext, WidgetRef)? - +autoCloseDrawer: bool - +title: String - +helpText: String? - - - - - - +void onClick() - - - - - - - - - - - String Function() - - - - - - - - - - - String Function()? - - - - - - - - - - - void Function(BuildContext, WidgetRef)? - - - - - - - - - - - - - GoRouterDrawerEntry - - - - - - +intent: RoutingIntent - +onNavigated: void Function()? - - - - - - +void onClick() - - - - - - - - - - - - AppDrawer - - - - - - +width: int - +autoCloseDrawer: bool - +leftPaddingEntries: double - +logoPaddingVertical: double - +logoPaddingHorizontal: double - +logoMaxHeight: double - +logoSectionMinHeight: double - +logoSectionMaxHeight: double - - - - - - - - - - - - StudyAnalyzeScreen - - - - - - +Widget? banner() - +Widget build() - - - - - - - - - - - - StudyAnalyzeController - - - - - - +dynamic onExport() - - - - - - - - - - - - StudyDesignInterventionsFormView - - - - - - +Widget build() - - - - - - - - - - - - StudyDesignPageWidget - - - - - - +Widget? banner() - - - - - - - - - - - - InterventionFormView - - - - - - +formViewModel: InterventionFormViewModel - - - - - - - - - - - - - InterventionFormViewModel - - - - - - +study: Study - +interventionIdControl: FormControl<String> - +interventionTitleControl: FormControl<String> - +interventionIconControl: FormControl<IconOption> - +interventionDescriptionControl: FormControl<String> - +interventionTasksArray: FormArray<dynamic> - +tasksCollection: FormViewModelCollection<InterventionTaskFormViewModel, InterventionTaskFormData> - +form: FormGroup - +interventionId: String - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titleRequired: dynamic - +atLeastOneTask: dynamic - +breadcrumbsTitle: String - +titles: Map<FormMode, String> - - - - - - +void setControlsFrom() - +InterventionFormData buildFormData() - +List<ModelAction<dynamic>> availableActions() - +List<ModelAction<dynamic>> availablePopupActions() - +List<ModelAction<dynamic>> availableInlineActions() - +void onSelectItem() - +void onNewItem() - +void onCancel() - +dynamic onSave() - +InterventionTaskFormViewModel provide() - +InterventionTaskFormRouteArgs buildNewFormRouteArgs() - +InterventionTaskFormRouteArgs buildFormRouteArgs() - +InterventionFormViewModel createDuplicate() - - - - - - - - - - - - - InterventionPreview - - - - - - +routeArgs: InterventionFormRouteArgs - - - - - - +Widget build() - - - - - - - - - - - - - StudyScheduleFormView - - - - - - +formViewModel: StudyScheduleControls - - - - - - -FormTableRow _renderCustomSequence() - +Widget build() - - - - - - - - - - - - - StudyScheduleControls - - - - - - <static>+defaultScheduleType: PhaseSequence - <static>+defaultScheduleTypeSequence: String - <static>+defaultNumCycles: int - <static>+defaultPeriodLength: int - +sequenceTypeControl: FormControl<PhaseSequence> - +sequenceTypeCustomControl: FormControl<String> - +phaseDurationControl: FormControl<int> - +numCyclesControl: FormControl<int> - +includeBaselineControl: FormControl<bool> - +studyScheduleControls: Map<String, FormControl<Object>> - <static>+kNumCyclesMin: int - <static>+kNumCyclesMax: int - <static>+kPhaseDurationMin: int - <static>+kPhaseDurationMax: int - +sequenceTypeControlOptions: List<FormControlOption<PhaseSequence>> - +studyScheduleValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +numCyclesRange: dynamic - +phaseDurationRange: dynamic - +customSequenceRequired: dynamic - - - - - - +void setStudyScheduleControlsFrom() - +StudyScheduleFormData buildStudyScheduleFormData() - +bool isSequencingCustom() - - - - - - - - - - - - - InterventionTaskFormData - - - - - - +taskId: String - +taskTitle: String - +taskDescription: String? - <static>+kDefaultTitle: String - +id: String - - - - - - +CheckmarkTask toTask() - +InterventionTaskFormData copy() - - - - - - - - - - - - - IFormDataWithSchedule - - - - - - +instanceId: String - +isTimeLocked: bool - +timeLockStart: StudyUTimeOfDay? - +timeLockEnd: StudyUTimeOfDay? - +hasReminder: bool - +reminderTime: StudyUTimeOfDay? - - - - - - +Schedule toSchedule() - - - - - - - - - - - - - InterventionsFormViewModel - - - - - - +study: Study - +router: GoRouter - +interventionsArray: FormArray<dynamic> - +interventionsCollection: FormViewModelCollection<InterventionFormViewModel, InterventionFormData> - +form: FormGroup - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +interventionsRequired: dynamic - +titles: Map<FormMode, String> - +canTestStudySchedule: bool - - - - - - +void setControlsFrom() - +InterventionsFormData buildFormData() - +void read() - +List<ModelAction<dynamic>> availableActions() - +List<ModelAction<dynamic>> availablePopupActions() - +List<ModelAction<dynamic>> availableInlineActions() - +void onSelectItem() - +void onNewItem() - +InterventionFormViewModel provide() - +void onCancel() - +dynamic onSave() - +dynamic testStudySchedule() - - - - - - - - - - - - - InterventionTaskFormViewModel - - - - - - +taskIdControl: FormControl<String> - +instanceIdControl: FormControl<String> - +taskTitleControl: FormControl<String> - +taskDescriptionControl: FormControl<String> - +markAsCompletedControl: FormControl<bool> - +form: FormGroup - +taskId: String - +instanceId: String - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titleRequired: dynamic - +titles: Map<FormMode, String> - - - - - - +void setControlsFrom() - +InterventionTaskFormData buildFormData() - +InterventionTaskFormViewModel createDuplicate() - - - - - - - - - - - - - WithScheduleControls - - - - - - +isTimeRestrictedControl: FormControl<bool> - +instanceID: FormControl<String> - +restrictedTimeStartControl: FormControl<Time> - +restrictedTimeStartPickerControl: FormControl<TimeOfDay> - +restrictedTimeEndControl: FormControl<Time> - +restrictedTimeEndPickerControl: FormControl<TimeOfDay> - +hasReminderControl: FormControl<bool> - +reminderTimeControl: FormControl<Time> - +reminderTimePickerControl: FormControl<TimeOfDay> - -_reminderControlStream: StreamSubscription<dynamic>? - +scheduleFormControls: Map<String, FormControl<Object>> - +hasReminder: bool - +isTimeRestricted: bool - +timeRestriction: List<Time>? - - - - - - +void setScheduleControlsFrom() - -dynamic _initReminderControl() - - - - - - - - - - - PhaseSequence - - - - - - - - - - - - - InterventionFormData - - - - - - +interventionId: String - +title: String - +description: String? - +tasksData: List<InterventionTaskFormData>? - +iconName: String? - <static>+kDefaultTitle: String - +id: String - - - - - - +Intervention toIntervention() - +InterventionFormData copy() - - - - - - - - - - - - - StudyScheduleFormData - - - - - - +sequenceType: PhaseSequence - +sequenceTypeCustom: String - +numCycles: int - +phaseDuration: int - +includeBaseline: bool - +id: String - - - - - - +StudySchedule toStudySchedule() - +Study apply() - +StudyScheduleFormData copy() - - - - - - - - - - - - IStudyFormData - - - - - - +Study apply() - - - - - - - - - - - - InterventionTaskFormView - - - - - - +formViewModel: InterventionTaskFormViewModel - - - - - - - - - - - - - InterventionsFormData - - - - - - +interventionsData: List<InterventionFormData> - +studyScheduleData: StudyScheduleFormData - +id: String - - - - - - +Study apply() - +InterventionsFormData copy() - - - - - - - - - - - - StudyDesignReportsFormView - - - - - - +Widget build() - -dynamic _showReportItemSidesheetWithArgs() - - - - - - - - - - - - - ReportItemFormData - - - - - - +isPrimary: bool - +section: ReportSection - +id: String - - - - - - <static>+dynamic fromDomainModel() - +ReportItemFormData copy() - - - - - - - - - - - ReportSection - - - - - - - - - - - - - DataReferenceEditor - - - - - - +formControl: FormControl<DataReferenceIdentifier<T>> - +availableTasks: List<Task> - +buildReactiveDropdownField: ReactiveDropdownField<dynamic> - - - - - - +FormTableRow buildFormTableRow() - -List<DropdownMenuItem<DataReferenceIdentifier<dynamic>>> _dataReferenceItems() - - - - - - - - - - - ReactiveDropdownField - - - - - - - - - - - - - TemporalAggregationFormatted - - - - - - -_value: TemporalAggregation - <static>+values: List<TemporalAggregationFormatted> - +value: TemporalAggregation - +string: String - +icon: IconData? - +hashCode: int - - - - - - +bool ==() - +String toString() - +String toJson() - <static>+TemporalAggregationFormatted fromJson() - - - - - - - - - - - TemporalAggregation - - - - - - - - - - - - - ImprovementDirectionFormatted - - - - - - -_value: ImprovementDirection - <static>+values: List<ImprovementDirectionFormatted> - +value: ImprovementDirection - +string: String - +icon: IconData? - +hashCode: int - - - - - - +bool ==() - +String toString() - +String toJson() - <static>+ImprovementDirectionFormatted fromJson() - - - - - - - - - - - ImprovementDirection - - - - - - - - - - - - ReportSectionType - - - - - - +index: int - <static>+values: List<ReportSectionType> - <static>+average: ReportSectionType - <static>+linearRegression: ReportSectionType - - - - - - - - - - - - - AverageSectionFormView - - - - - - +formViewModel: ReportItemFormViewModel - +studyId: String - +reportSectionColumnWidth: Map<int, TableColumnWidth> - - - - - - +Widget build() - - - - - - - - - - - - - ReportItemFormViewModel - - - - - - <static>+defaultSectionType: ReportSectionType - +sectionIdControl: FormControl<String> - +sectionTypeControl: FormControl<ReportSectionType> - +titleControl: FormControl<String> - +descriptionControl: FormControl<String> - +sectionControl: FormControl<ReportSection> - +dataReferenceControl: FormControl<DataReferenceIdentifier<num>> - +temporalAggregationControl: FormControl<TemporalAggregationFormatted> - +improvementDirectionControl: FormControl<ImprovementDirectionFormatted> - +alphaControl: FormControl<double> - -_controlsBySectionType: Map<ReportSectionType, FormGroup> - -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - -_validationConfigsBySectionType: Map<ReportSectionType, Map<FormValidationSetEnum, List<FormControlValidation>>> - +sectionBaseControls: Map<String, AbstractControl<dynamic>> - +form: FormGroup - +sectionId: String - +sectionType: ReportSectionType - <static>+sectionTypeControlOptions: List<FormControlOption<ReportSectionType>> - <static>+temporalAggregationControlOptions: List<FormControlOption<TemporalAggregationFormatted>> - <static>+improvementDirectionControlOptions: List<FormControlOption<ImprovementDirectionFormatted>> - +titles: Map<FormMode, String> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titleRequired: dynamic - +descriptionRequired: dynamic - +dataReferenceRequired: dynamic - +aggregationRequired: dynamic - +improvementDirectionRequired: dynamic - +alphaConfidenceRequired: dynamic - - - - - - -List<FormControlValidation> _getValidationConfig() - +ReportItemFormData buildFormData() - +ReportItemFormViewModel createDuplicate() - +dynamic onSectionTypeChanged() - -void _updateFormControls() - +void setControlsFrom() - - - - - - - - - - - - - DataReferenceIdentifier - - - - - - +hashCode: int - - - - - - +bool ==() - - - - - - - - - - - DataReference - - - - - - - - - - - - - LinearRegressionSectionFormView - - - - - - +formViewModel: ReportItemFormViewModel - +studyId: String - +reportSectionColumnWidth: Map<int, TableColumnWidth> - - - - - - +Widget build() - - - - - - - - - - - - - ReportItemFormView - - - - - - +formViewModel: ReportItemFormViewModel - +studyId: String - +reportSectionColumnWidth: dynamic - +sectionTypeBodyBuilder: Widget Function(BuildContext) - - - - - - +Widget build() - -dynamic _buildSectionText() - -dynamic _buildSectionTypeHeader() - - - - - - - - - - - - - ReportsFormViewModel - - - - - - +study: Study - +router: GoRouter - +reportItemDelegate: ReportFormItemDelegate - +reportItemArray: FormArray<dynamic> - +reportItemFormViewModels: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData> - +form: FormGroup - +reportItemModels: List<ReportItemFormViewModel> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titles: Map<FormMode, String> - +canTestConsent: bool - - - - - - +void setControlsFrom() - +ReportsFormData buildFormData() - +void read() - +ReportItemFormRouteArgs buildNewReportItemFormRouteArgs() - +ReportItemFormRouteArgs buildReportItemFormRouteArgs() - +dynamic testReport() - +void onCancel() - +dynamic onSave() - +ReportItemFormViewModel provide() - - - - - - - - - - - - - ReportFormItemDelegate - - - - - - +formViewModelCollection: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData> - +owner: ReportsFormViewModel - +propagateOnSave: bool - +validationSet: dynamic - - - - - - +void onCancel() - +dynamic onSave() - +ReportItemFormViewModel provide() - +List<ModelAction<dynamic>> availableActions() - +void onNewItem() - +void onSelectItem() - - - - - - - - - - - - - ReportBadge - - - - - - +status: ReportStatus? - +type: BadgeType - +showPrefixIcon: bool - +showTooltip: bool - - - - - - +Widget build() - - - - - - - - - - - - ReportStatus - - - - - - +index: int - <static>+values: List<ReportStatus> - <static>+primary: ReportStatus - <static>+secondary: ReportStatus - - - - - - - - - - - - - ReportsFormData - - - - - - +reportItems: List<ReportItemFormData> - +id: String - - - - - - +Study apply() - +ReportsFormData copy() - - - - - - - - - - - - - StudyInfoFormViewModel - - - - - - +study: Study - +titleControl: FormControl<String> - +iconControl: FormControl<IconOption> - +descriptionControl: FormControl<String> - +organizationControl: FormControl<String> - +reviewBoardControl: FormControl<String> - +reviewBoardNumberControl: FormControl<String> - +researchersControl: FormControl<String> - +emailControl: FormControl<String> - +websiteControl: FormControl<String> - +phoneControl: FormControl<String> - +additionalInfoControl: FormControl<String> - +form: FormGroup - +titles: Map<FormMode, String> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titleRequired: dynamic - +descriptionRequired: dynamic - +iconRequired: dynamic - +organizationRequired: dynamic - +reviewBoardRequired: dynamic - +reviewBoardNumberRequired: dynamic - +researchersRequired: dynamic - +emailRequired: dynamic - +phoneRequired: dynamic - +emailFormat: dynamic - +websiteFormat: dynamic - - - - - - +void setControlsFrom() - +StudyInfoFormData buildFormData() - - - - - - - - - - - - StudyDesignInfoFormView - - - - - - +Widget build() - - - - - - - - - - - - - StudyInfoFormData - - - - - - +title: String - +description: String? - +iconName: String - +contactInfoFormData: StudyContactInfoFormData - +id: String - - - - - - +Study apply() - +StudyInfoFormData copy() - - - - - - - - - - - - - StudyContactInfoFormData - - - - - - +organization: String? - +institutionalReviewBoard: String? - +institutionalReviewBoardNumber: String? - +researchers: String? - +email: String? - +website: String? - +phone: String? - +additionalInfo: String? - +id: String - - - - - - +Study apply() - +StudyInfoFormData copy() - - - - - - - - - - - - StudyFormValidationSet - - - - - - +index: int - <static>+values: List<StudyFormValidationSet> - - - - - - - - - - - - - MeasurementsFormData - - - - - - +surveyMeasurements: List<MeasurementSurveyFormData> - +id: String - - - - - - +Study apply() - +MeasurementsFormData copy() - - - - - - - - - - - - MeasurementSurveyFormView - - - - - - +formViewModel: MeasurementSurveyFormViewModel - - - - - - - - - - - - - MeasurementSurveyFormViewModel - - - - - - +study: Study - +measurementIdControl: FormControl<String> - +instanceIdControl: FormControl<String> - +surveyTitleControl: FormControl<String> - +surveyIntroTextControl: FormControl<String> - +surveyOutroTextControl: FormControl<String> - +form: FormGroup - +measurementId: String - +instanceId: String - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titleRequired: dynamic - +atLeastOneQuestion: dynamic - +breadcrumbsTitle: String - +titles: Map<FormMode, String> - - - - - - +void setControlsFrom() - +MeasurementSurveyFormData buildFormData() - +List<ModelAction<dynamic>> availableActions() - +List<ModelAction<dynamic>> availablePopupActions() - +List<ModelAction<dynamic>> availableInlineActions() - +void onSelectItem() - +void onNewItem() - +SurveyQuestionFormRouteArgs buildNewFormRouteArgs() - +SurveyQuestionFormRouteArgs buildFormRouteArgs() - +MeasurementSurveyFormViewModel createDuplicate() - - - - - - - - - - - - - SurveyPreview - - - - - - +routeArgs: MeasurementFormRouteArgs - - - - - - +Widget build() - - - - - - - - - - - - - MeasurementSurveyFormData - - - - - - +measurementId: String - +title: String - +introText: String? - +outroText: String? - +questionnaireFormData: QuestionnaireFormData - <static>+kDefaultTitle: String - +id: String - - - - - - +QuestionnaireTask toQuestionnaireTask() - +MeasurementSurveyFormData copy() - - - - - - - - - - - - - QuestionnaireFormData - - - - - - +questionsData: List<QuestionFormData>? - +id: String - - - - - - +StudyUQuestionnaire toQuestionnaire() - +List<EligibilityCriterion> toEligibilityCriteria() - +QuestionnaireFormData copy() - - - - - - - - - - - - - WithQuestionnaireControls - - - - - - +questionsArray: FormArray<dynamic> - +questionFormViewModels: FormViewModelCollection<Q, QuestionFormData> - +questionnaireControls: Map<String, FormArray<dynamic>> - +propagateOnSave: bool - +questionModels: List<Q> - +questionTitles: Map<FormMode, String Function()> - - - - - - +void setQuestionnaireControlsFrom() - +QuestionnaireFormData buildQuestionnaireFormData() - +void read() - +void onCancel() - +dynamic onSave() - +Q provide() - +Q provideQuestionFormViewModel() - - - - - - - - - - - - StudyDesignMeasurementsFormView - - - - - - +Widget build() - - - - - - - - - - - - - MeasurementsFormViewModel - - - - - - +study: Study - +router: GoRouter - +measurementsArray: FormArray<dynamic> - +surveyMeasurementFormViewModels: FormViewModelCollection<MeasurementSurveyFormViewModel, MeasurementSurveyFormData> - +form: FormGroup - +measurementViewModels: List<MeasurementSurveyFormViewModel> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +measurementRequired: dynamic - +titles: Map<FormMode, String> - - - - - - +void read() - +void setControlsFrom() - +MeasurementsFormData buildFormData() - +List<ModelAction<dynamic>> availableActions() - +List<ModelAction<dynamic>> availablePopupActions() - +List<ModelAction<dynamic>> availableInlineActions() - +void onSelectItem() - +void onNewItem() - +MeasurementSurveyFormViewModel provide() - +void onCancel() - +dynamic onSave() - - - - - - - - - - - - - StudyFormScaffold - - - - - - +studyId: String - +formViewModelBuilder: T Function(WidgetRef) - +formViewBuilder: Widget Function(T) - - - - - - +Widget build() - - - - - - - - - - - T Function(WidgetRef) - - - - - - - - - - - - - ConsentItemFormViewModel - - - - - - +consentIdControl: FormControl<String> - +titleControl: FormControl<String> - +descriptionControl: FormControl<String> - +iconControl: FormControl<IconOption> - +form: FormGroup - +consentId: String - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titleRequired: dynamic - +descriptionRequired: dynamic - +titles: Map<FormMode, String> - - - - - - +void setControlsFrom() - +ConsentItemFormData buildFormData() - +ConsentItemFormViewModel createDuplicate() - - - - - - - - - - - - StudyDesignEnrollmentFormView - - - - - - +Widget build() - -dynamic _showScreenerQuestionSidesheetWithArgs() - -dynamic _showConsentItemSidesheetWithArgs() - - - - - - - - - - - - IScreenerQuestionLogicFormViewModel - - - - - - +isDirtyOptionsBannerVisible: bool - - - - - - - - - - - - - ScreenerQuestionLogicFormView - - - - - - +formViewModel: ScreenerQuestionFormViewModel - - - - - - +Widget build() - -dynamic _buildInfoBanner() - -dynamic _buildAnswerOptionsLogicControls() - -List<Widget> _buildOptionLogicRow() - - - - - - - - - - - - - ScreenerQuestionFormViewModel - - - - - - <static>+defaultResponseOptionValidity: bool - +responseOptionsDisabledArray: FormArray<dynamic> - +responseOptionsLogicControls: FormArray<bool> - +responseOptionsLogicDescriptionControls: FormArray<String> - -_questionBaseControls: Map<String, AbstractControl<dynamic>> - +prevResponseOptionControls: List<AbstractControl<dynamic>> - +prevResponseOptionValues: List<dynamic> - +responseOptionsDisabledControls: List<AbstractControl<dynamic>> - +logicControlOptions: List<FormControlOption<bool>> - +questionBaseControls: Map<String, AbstractControl<dynamic>> - +isDirtyOptionsBannerVisible: bool - - - - - - +dynamic onResponseOptionsChanged() - +void setControlsFrom() - +QuestionFormData buildFormData() - -List<FormControl<dynamic>> _copyFormControls() - -AbstractControl<dynamic>? _findAssociatedLogicControlFor() - -AbstractControl<dynamic>? _findAssociatedControlFor() - +ScreenerQuestionFormViewModel createDuplicate() - - - - - - - - - - - - - ConsentItemFormData - - - - - - +consentId: String - +title: String - +description: String - +iconName: String? - +id: String - - - - - - +ConsentItem toConsentItem() - +ConsentItemFormData copy() - - - - - - - - - - - - ConsentItemFormView - - - - - - +formViewModel: ConsentItemFormViewModel - - - - - - - - - - - - - EnrollmentFormData - - - - - - <static>+kDefaultEnrollmentType: Participation - +enrollmentType: Participation - +questionnaireFormData: QuestionnaireFormData - +consentItemsFormData: List<ConsentItemFormData>? - +id: String - - - - - - +Study apply() - +EnrollmentFormData copy() - - - - - - - - - - - - - QuestionFormViewModel - - - - - - <static>+defaultQuestionType: SurveyQuestionType - -_titles: Map<FormMode, String Function()>? - +questionIdControl: FormControl<String> - +questionTypeControl: FormControl<SurveyQuestionType> - +questionTextControl: FormControl<String> - +questionInfoTextControl: FormControl<String> - +questionBaseControls: Map<String, AbstractControl<dynamic>> - +isMultipleChoiceControl: FormControl<bool> - +choiceResponseOptionsArray: FormArray<dynamic> - +customOptionsMin: int - +customOptionsMax: int - +customOptionsInitial: int - +boolResponseOptionsArray: FormArray<String> - +imageResponseOptionsArray: FormArray<String> - <static>+kDefaultMaxRecordingDurationSeconds: int - <static>+kMaxRecordingDurationSeconds: int - +audioResponseOptionsArray: FormArray<String> - +maxRecordingDurationSecondsControl: FormControl<int> - <static>+kDefaultScaleMinValue: int - <static>+kDefaultScaleMaxValue: int - <static>+kNumMidValueControls: int - <static>+kMidValueDebounceMilliseconds: int - +scaleMinValueControl: FormControl<int> - +scaleMaxValueControl: FormControl<int> - -_scaleRangeControl: FormControl<int> - +scaleMinLabelControl: FormControl<String> - +scaleMaxLabelControl: FormControl<String> - +scaleMidValueControls: FormArray<int> - +scaleMidLabelControls: FormArray<String?> - -_scaleResponseOptionsArray: FormArray<int> - +scaleMinColorControl: FormControl<SerializableColor> - +scaleMaxColorControl: FormControl<SerializableColor> - +prevMidValues: List<int?>? - +freeTextTypeControl: FormControl<FreeTextQuestionType> - +customRegexControl: FormControl<String> - +freeTextResponseOptionsArray: FormArray<dynamic> - +freeTextLengthMin: AbstractControl<int> - +freeTextLengthMax: AbstractControl<int> - +freeTextExampleTextControl: FormControl<String> - <static>+kDefaultFreeTextMinLength: int - <static>+kDefaultFreeTextMaxLength: int - +freeTextLengthControl: FormControl<RangeValues> - -_controlsByQuestionType: Map<SurveyQuestionType, FormGroup> - -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - -_validationConfigsByQuestionType: Map<SurveyQuestionType, Map<FormValidationSetEnum, List<FormControlValidation>>> - +form: FormGroup - +questionId: String - +questionType: SurveyQuestionType - +questionTypeControlOptions: List<FormControlOption<SurveyQuestionType>> - +answerOptionsArray: FormArray<dynamic> - +answerOptionsControls: List<AbstractControl<dynamic>> - +validAnswerOptions: List<String> - +boolOptions: List<AbstractControl<String>> - +imageOptions: List<AbstractControl<String>> - +audioOptions: List<AbstractControl<String>> - +scaleMinValue: int - +scaleMaxValue: int - +scaleRange: int - +scaleAllValueControls: List<AbstractControl<int>> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +questionTextRequired: dynamic - +numValidChoiceOptions: dynamic - +scaleRangeValid: dynamic - +maxRecordingDurationValid: dynamic - +titles: Map<FormMode, String> - +isAddOptionButtonVisible: bool - +isMidValuesClearedInfoVisible: bool - - - - - - +String? scaleMidLabelAt() - -dynamic _onScaleRangeChanged() - -dynamic _applyInputFormatters() - -dynamic _updateScaleMidValueControls() - -Map<String, dynamic>? _validateFreeText() - -dynamic _onFreeTextLengthChanged() - -List<FormControlValidation> _getValidationConfig() - +dynamic onQuestionTypeChanged() - +dynamic onResponseOptionsChanged() - -void _updateFormControls() - +void initControls() - +void setControlsFrom() - +QuestionFormData buildFormData() - +List<ModelAction<dynamic>> availableActions() - +void onNewItem() - +void onSelectItem() - +dynamic save() - +QuestionFormViewModel createDuplicate() - - - - - - - - - - - - - EnrollmentFormViewModel - - - - - - +study: Study - +router: GoRouter - +consentItemDelegate: EnrollmentFormConsentItemDelegate - +enrollmentTypeControl: FormControl<Participation> - +consentItemArray: FormArray<dynamic> - +consentItemFormViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData> - +form: FormGroup - +enrollmentTypeControlOptions: List<FormControlOption<Participation>> - +consentItemModels: List<ConsentItemFormViewModel> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titles: Map<FormMode, String> - +canTestScreener: bool - +canTestConsent: bool - +questionTitles: Map<FormMode, String Function()> - - - - - - +void setControlsFrom() - +EnrollmentFormData buildFormData() - +void read() - +List<ModelAction<dynamic>> availableActions() - +List<ModelAction<dynamic>> availablePopupActions() - +List<ModelAction<dynamic>> availableInlineActions() - +void onSelectItem() - +void onNewItem() - +ScreenerQuestionFormRouteArgs buildNewScreenerQuestionFormRouteArgs() - +ScreenerQuestionFormRouteArgs buildScreenerQuestionFormRouteArgs() - +ConsentItemFormRouteArgs buildNewConsentItemFormRouteArgs() - +ConsentItemFormRouteArgs buildConsentItemFormRouteArgs() - +dynamic testScreener() - +dynamic testConsent() - +ScreenerQuestionFormViewModel provideQuestionFormViewModel() - - - - - - - - - - - - - EnrollmentFormConsentItemDelegate - - - - - - +formViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData> - +owner: EnrollmentFormViewModel - +propagateOnSave: bool - +validationSet: dynamic - - - - - - +void onCancel() - +dynamic onSave() - +ConsentItemFormViewModel provide() - +List<ModelAction<dynamic>> availableActions() - +void onNewItem() - +void onSelectItem() - - - - - - - - - - - - - StudyFormViewModel - - - - - - +studyDirtyCopy: Study? - +studyRepository: IStudyRepository - +authRepository: IAuthRepository - +router: GoRouter - +studyInfoFormViewModel: StudyInfoFormViewModel - +enrollmentFormViewModel: EnrollmentFormViewModel - +measurementsFormViewModel: MeasurementsFormViewModel - +reportsFormViewModel: ReportsFormViewModel - +interventionsFormViewModel: InterventionsFormViewModel - +form: FormGroup - +isStudyReadonly: bool - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titles: Map<FormMode, String> - - - - - - +void read() - +void setControlsFrom() - +Study buildFormData() - +void dispose() - +void onCancel() - +dynamic onSave() - -dynamic _applyAndSaveSubform() - - - - - - - - - - - - - QuestionFormData - - - - - - <static>+questionTypeFormDataFactories: Map<SurveyQuestionType, QuestionFormData Function(Question<dynamic>, List<EligibilityCriterion>)> - +questionId: String - +questionText: String - +questionInfoText: String? - +questionType: SurveyQuestionType - +responseOptionsValidity: Map<dynamic, bool> - +responseOptions: List<dynamic> - +id: String - - - - - - +Question<dynamic> toQuestion() - +EligibilityCriterion toEligibilityCriterion() - +Answer<dynamic> constructAnswerFor() - +dynamic setResponseOptionsValidityFrom() - +QuestionFormData copy() - - - - - - - - - - - - SurveyQuestionType - - - - - - +index: int - <static>+values: List<SurveyQuestionType> - <static>+choice: SurveyQuestionType - <static>+bool: SurveyQuestionType - <static>+scale: SurveyQuestionType - <static>+image: SurveyQuestionType - <static>+audio: SurveyQuestionType - <static>+freeText: SurveyQuestionType - - - - - - - - - - - - - ChoiceQuestionFormData - - - - - - +isMultipleChoice: bool - +answerOptions: List<String> - +responseOptions: List<String> - - - - - - +Question<dynamic> toQuestion() - +QuestionFormData copy() - -Choice _buildChoiceForValue() - +Answer<dynamic> constructAnswerFor() - - - - - - - - - - - - - BoolQuestionFormData - - - - - - <static>+kResponseOptions: Map<String, bool> - +responseOptions: List<String> - - - - - - +Question<dynamic> toQuestion() - +BoolQuestionFormData copy() - +Answer<dynamic> constructAnswerFor() - - - - - - - - - - - - - ImageQuestionFormData - - - - - - <static>+kResponseOptions: Map<String, FutureBlobFile> - +responseOptions: List<String> - - - - - - +Question<dynamic> toQuestion() - +ImageQuestionFormData copy() - +Answer<dynamic> constructAnswerFor() - - - - - - - - - - - - - AudioQuestionFormData - - - - - - +maxRecordingDurationSeconds: int - <static>+kResponseOptions: Map<String, FutureBlobFile> - +responseOptions: List<String> - - - - - - +Question<dynamic> toQuestion() - +AudioQuestionFormData copy() - +Answer<dynamic> constructAnswerFor() - - - - - - - - - - - - - ScaleQuestionFormData - - - - - - +minValue: double - +maxValue: double - +minLabel: String? - +maxLabel: String? - +midValues: List<double?> - +midLabels: List<String?> - +stepSize: double - +initialValue: double? - +minColor: Color? - +maxColor: Color? - +responseOptions: List<double> - +midAnnotations: List<Annotation> - - - - - - +ScaleQuestion toQuestion() - +QuestionFormData copy() - +Answer<dynamic> constructAnswerFor() - - - - - - - - - - - - - FreeTextQuestionFormData - - - - - - +textLengthRange: List<int> - +textType: FreeTextQuestionType - +textTypeExpression: String? - +responseOptions: List<String> - - - - - - +Question<dynamic> toQuestion() - +FreeTextQuestionFormData copy() - +Answer<dynamic> constructAnswerFor() - - - - - - - - - - - FreeTextQuestionType - - - - - - - - - - - - - AudioRecordingQuestionFormView - - - - - - +formViewModel: QuestionFormViewModel - - - - - - +Widget build() - - - - - - - - - - - - - FreeTextQuestionFormView - - - - - - +formViewModel: QuestionFormViewModel - +generateLabelHelpTextMap: dynamic - - - - - - +Widget build() - +Widget disableOnReadonly() - +Widget generateRow() - - - - - - - - - - - - - ImageCapturingQuestionFormView - - - - - - +formViewModel: QuestionFormViewModel - - - - - - +Widget build() - - - - - - - - - - - - IScaleQuestionFormViewModel - - - - - - +isMidValuesClearedInfoVisible: bool - - - - - - - - - - - - ScaleQuestionFormView - - - - - - +formViewModel: QuestionFormViewModel - - - - - - - - - - - - - ChoiceQuestionFormView - - - - - - +formViewModel: QuestionFormViewModel - - - - - - +Widget build() - - - - - - - - - - - - - BoolQuestionFormView - - - - - - +formViewModel: QuestionFormViewModel - - - - - - +Widget build() - - - - - - - - - - - - SurveyQuestionFormView - - - - - - +formViewModel: QuestionFormViewModel - +isHtmlStyleable: bool - - - - - - - - - - - StudyUTimeOfDay - - - - - - - - - - - - - ScheduleControls - - - - - - +formViewModel: WithScheduleControls - - - - - - +Widget build() - -List<FormTableRow> _conditionalTimeRestrictions() - - - - - - - - - - - - StudiesTableColumnHeader - - - - - - +title: String - +sortable: bool - +sortAscending: bool - +sortingActive: bool - +onSort: void Function()? - - - - - - - - - - - - DashboardScreen - - - - - - +filter: StudiesFilter? - - - - - - - - - - - - StudiesFilter - - - - - - +index: int - <static>+values: List<StudiesFilter> - - - - - - - - - - - - - DashboardScaffold - - - - - - <static>+compactWidthThreshold: double - +body: Widget - - - - - - +Widget build() - - - - - - - - - - - - - DashboardController - - - - - - +studyRepository: IStudyRepository - +authRepository: IAuthRepository - +userRepository: IUserRepository - +router: GoRouter - -_studiesSubscription: StreamSubscription<List<WrappedModel<Study>>>? - +searchController: SearchController - +isSortAscending: bool - - - - - - -dynamic _subscribeStudies() - +dynamic setSearchText() - +dynamic setStudiesFilter() - +dynamic onSelectStudy() - +dynamic onClickNewStudy() - +dynamic pinStudy() - +dynamic pinOffStudy() - +void setSorting() - +void filterStudies() - +void sortStudies() - +bool isSortingActiveForColumn() - +bool isPinned() - +List<ModelAction<dynamic>> availableActions() - +void dispose() - - - - - - - - - - - - - IUserRepository - - - - - - +user: StudyUUser - - - - - - +dynamic fetchUser() - +dynamic saveUser() - +dynamic updatePreferences() - - - - - - - - - - - - - StudiesTableColumnSize - - - - - - +collapsed: bool - +flex: int? - +width: double? - - - - - - +Widget createContainer() - - - - - - - - - - - - - StudiesTable - - - - - - +itemHeight: double - +itemPadding: double - +rowSpacing: double - +columnSpacing: double - +compactWidthThreshold: double - +superCompactWidthThreshold: double - +compactStatTitleThreshold: double - +studies: List<Study> - +onSelect: void Function(Study) - +getActions: List<ModelAction<dynamic>> Function(Study) - +emptyWidget: Widget - +pinnedStudies: Iterable<String> - +dashboardController: DashboardController - - - - - - +Widget build() - -Widget _buildColumnHeader() - - - - - - - - - - - void Function(Study) - - - - - - - - - - - List<ModelAction<dynamic>> Function(Study) - - - - - - - - - - - - StudiesTableColumn - - - - - - +index: int - <static>+values: List<StudiesTableColumn> - <static>+pin: StudiesTableColumn - <static>+title: StudiesTableColumn - <static>+status: StudiesTableColumn - <static>+participation: StudiesTableColumn - <static>+createdAt: StudiesTableColumn - <static>+enrolled: StudiesTableColumn - <static>+active: StudiesTableColumn - <static>+completed: StudiesTableColumn - <static>+action: StudiesTableColumn - - - - - - - - - - - - StudiesTableItem - - - - - - +study: Study - +itemHeight: double - +itemPadding: double - +rowSpacing: double - +columnSpacing: double - +actions: List<ModelAction<dynamic>> - +columnSizes: List<StudiesTableColumnSize> - +isPinned: bool - +onPinnedChanged: void Function(Study, bool)? - +onTap: void Function(Study)? - - - - - - - - - - - void Function(Study, bool)? - - - - - - - - - - - void Function(Study)? - - - - - - - - - - - App - - - - - - - - - - - AppContent - - - - - - - - - - - - AccountSettingsDialog - - - - - - +Widget build() - - - - - - - - - - - - - ModelRepository - - - - - - +delegate: IModelRepositoryDelegate<T> - -_allModelsStreamController: BehaviorSubject<List<WrappedModel<T>>> - -_allModelEventsStreamController: BehaviorSubject<ModelEvent<T>> - +modelStreamControllers: Map<String, BehaviorSubject<WrappedModel<T>>> - +modelEventsStreamControllers: Map<String, BehaviorSubject<ModelEvent<T>>> - -_allModels: Map<String, WrappedModel<T>> - - - - - - +WrappedModel<T>? get() - +dynamic fetchAll() - +dynamic fetch() - +dynamic save() - +dynamic delete() - +dynamic duplicateAndSave() - +dynamic duplicateAndSaveFromRemote() - +Stream<List<WrappedModel<T>>> watchAll() - +Stream<WrappedModel<T>> watch() - +Stream<ModelEvent<T>> watchAllChanges() - +Stream<ModelEvent<T>> watchChanges() - -dynamic _buildModelSpecificController() - +dynamic ensurePersisted() - +WrappedModel<T> upsertLocally() - +List<WrappedModel<T>> upsertAllLocally() - +dynamic emitUpdate() - +dynamic emitModelEvent() - +dynamic emitError() - +void dispose() - +List<ModelAction<dynamic>> availableActions() - - - - - - - - - - - - - InviteCodeRepository - - - - - - +studyId: String - +ref: ProviderRef<dynamic> - +apiClient: StudyUApi - +authRepository: IAuthRepository - +studyRepository: IStudyRepository - +study: Study - - - - - - +String getKey() - +dynamic isCodeAlreadyUsed() - +List<ModelAction<dynamic>> availableActions() - +dynamic emitUpdate() - - - - - - - - - - - ProviderRef - - - - - - - - - - - - StudyUApi - - - - - - +dynamic saveStudy() - +dynamic fetchStudy() - +dynamic getUserStudies() - +dynamic deleteStudy() - +dynamic saveStudyInvite() - +dynamic fetchStudyInvite() - +dynamic deleteStudyInvite() - +dynamic deleteParticipants() - +dynamic fetchAppConfig() - +dynamic fetchUser() - +dynamic saveUser() - - - - - - - - - - - - - InviteCodeRepositoryDelegate - - - - - - +study: Study - +apiClient: StudyUApi - +studyRepository: IStudyRepository - - - - - - +dynamic fetch() - +dynamic fetchAll() - +dynamic save() - +dynamic delete() - +dynamic onError() - +StudyInvite createDuplicate() - +StudyInvite createNewInstance() - - - - - - - - - - - - IModelRepositoryDelegate - - - - - - +dynamic fetchAll() - +dynamic fetch() - +dynamic save() - +dynamic delete() - +T createNewInstance() - +T createDuplicate() - +dynamic onError() - - - - - - - - - - - - - StudyRepository - - - - - - +apiClient: StudyUApi - +authRepository: IAuthRepository - +ref: ProviderRef<dynamic> - +sortCallback: void Function()? - - - - - - +String getKey() - +dynamic deleteParticipants() - +dynamic launch() - +List<ModelAction<dynamic>> availableActions() - - - - - - - - - - - - - StudyRepositoryDelegate - - - - - - +apiClient: StudyUApi - +authRepository: IAuthRepository - - - - - - +dynamic fetchAll() - +dynamic fetch() - +dynamic save() - +dynamic delete() - +dynamic onError() - +Study createNewInstance() - +Study createDuplicate() - - - - - - - - - - - APIException - - - - - - - - - - - StudyNotFoundException - - - - - - - - - - - MeasurementNotFoundException - - - - - - - - - - - QuestionNotFoundException - - - - - - - - - - - ConsentItemNotFoundException - - - - - - - - - - - InterventionNotFoundException - - - - - - - - - - - InterventionTaskNotFoundException - - - - - - - - - - - ReportNotFoundException - - - - - - - - - - - ReportSectionNotFoundException - - - - - - - - - - - StudyInviteNotFoundException - - - - - - - - - - - UserNotFoundException - - - - - - - - - - - - - StudyUApiClient - - - - - - +supabaseClient: SupabaseClient - <static>+studyColumns: List<String> - <static>+studyWithParticipantActivityColumns: List<String> - +testDelayMilliseconds: int - - - - - - +dynamic deleteParticipants() - +dynamic getUserStudies() - +dynamic fetchStudy() - +dynamic deleteStudy() - +dynamic saveStudy() - +dynamic fetchStudyInvite() - +dynamic saveStudyInvite() - +dynamic deleteStudyInvite() - +dynamic fetchAppConfig() - +dynamic fetchUser() - +dynamic saveUser() - -dynamic _awaitGuarded() - -dynamic _apiException() - -dynamic _testDelay() - - - - - - - - - - - SupabaseClient - - - - - - - - - - - - SupabaseClientDependant - - - - - - +supabaseClient: SupabaseClient - - - - - - - - - - - - SupabaseQueryMixin - - - - - - +dynamic deleteAll() - +dynamic getAll() - +dynamic getById() - +dynamic getByColumn() - +List<T> deserializeList() - +T deserializeObject() - - - - - - - - - - - - IAppRepository - - - - - - +dynamic fetchAppConfig() - +void dispose() - - - - - - - - - - - - - AppRepository - - - - - - +apiClient: StudyUApi - - - - - - +dynamic fetchAppConfig() - +void dispose() - - - - - - - - - - - StudyUUser - - - - - - - - - - - - - UserRepository - - - - - - +apiClient: StudyUApi - +authRepository: IAuthRepository - +ref: Ref<Object?> - +user: StudyUUser - - - - - - +dynamic fetchUser() - +dynamic saveUser() - +dynamic updatePreferences() - - - - - - - - - - - Ref - - - - - - - - - - - - PreferenceAction - - - - - - +index: int - <static>+values: List<PreferenceAction> - <static>+pin: PreferenceAction - <static>+pinOff: PreferenceAction - - - - - - - - - - - User - - - - - - - - - - - Session - - - - - - - - - - - - - AuthRepository - - - - - - +supabaseClient: SupabaseClient - +allowPasswordReset: bool - +authClient: GoTrueClient - +session: Session? - +serializedSession: String? - +currentUser: User? - +isLoggedIn: bool - - - - - - -void _registerAuthListener() - +dynamic signUp() - +dynamic signInWith() - +dynamic signOut() - +dynamic resetPasswordForEmail() - +dynamic updateUser() - +void dispose() - +dynamic onAppStart() - - - - - - - - - - - GoTrueClient - - - - - - - - - - - StudyLaunched - - - - - - - - - - - - ModelEvent - - - - - - +modelId: String - +model: T - - - - - - - - - - - - SupabaseQueryError - - - - - - +statusCode: String? - +message: String - +details: dynamic - - - - - - - - - - - - - WrappedModel - - - - - - -_model: T - +asyncValue: AsyncValue<T> - +isLocalOnly: bool - +isDirty: bool - +isDeleted: bool - +lastSaved: DateTime? - +lastFetched: DateTime? - +lastUpdated: DateTime? - +model: T - - - - - - +dynamic markWithError() - +dynamic markAsLoading() - +dynamic markAsFetched() - +dynamic markAsSaved() - - - - - - - - - - - ModelRepositoryException - - - - - - - - - - - ModelNotFoundException - - - - - - - - - - - - IModelRepository - - - - - - +String getKey() - +WrappedModel<T>? get() - +dynamic fetchAll() - +dynamic fetch() - +dynamic save() - +dynamic delete() - +dynamic duplicateAndSave() - +dynamic duplicateAndSaveFromRemote() - +Stream<WrappedModel<T>> watch() - +Stream<List<WrappedModel<T>>> watchAll() - +Stream<ModelEvent<T>> watchChanges() - +Stream<ModelEvent<T>> watchAllChanges() - +dynamic ensurePersisted() - +void dispose() - - - - - - - - - - - IsFetched - - - - - - - - - - - IsSaving - - - - - - - - - - - IsSaved - - - - - - - - - - - IsDeleted - - - - - - - - - \ No newline at end of file diff --git a/docs/uml/designer_v2/lib/utils/uml.svg b/docs/uml/designer_v2/lib/utils/uml.svg deleted file mode 100644 index 69a23ca7f..000000000 --- a/docs/uml/designer_v2/lib/utils/uml.svg +++ /dev/null @@ -1,1035 +0,0 @@ - - [SerializableColor - | - +Map<String, dynamic> toJson(); - <static>+SerializableColor fromJson() - ] - - [Color]<:-[SerializableColor] - - [<abstract>FileFormatEncoder - | - +dynamic encodeAsync(); - +String encode(); - +dynamic call() - ] - - [CSVStringEncoder - | - +String encode() - ] - - [<abstract>FileFormatEncoder]<:-[CSVStringEncoder] - - [JsonStringEncoder - | - +String encode() - ] - - [<abstract>FileFormatEncoder]<:-[JsonStringEncoder] - - [<abstract>ExecutionLimiter - | - +milliseconds: int; - <static>-_timer: Timer? - | - +void dispose() - ] - - [<abstract>ExecutionLimiter]o-[Timer] - - [Debouncer - | - +leading: bool; - +cancelUncompleted: bool; - -_uncompletedFutureOperation: CancelableOperation<dynamic>? - | - +dynamic call() - ] - - [Debouncer]o-[CancelableOperation] - [<abstract>ExecutionLimiter]<:-[Debouncer] - - [Throttler - | - +dynamic call() - ] - - [<abstract>ExecutionLimiter]<:-[Throttler] - - [OptimisticUpdate - | - +applyOptimistic: void Function(); - +apply: dynamic Function(); - +rollback: void Function(); - +onUpdate: void Function()?; - +onError: void Function(Object, StackTrace?)?; - +rethrowErrors: bool; - +runOptimistically: bool; - +completeFutureOptimistically: bool - | - +dynamic execute(); - -void _runUpdateHandlerIfAny() - ] - - [OptimisticUpdate]o-[void Function()] - [OptimisticUpdate]o-[dynamic Function()] - [OptimisticUpdate]o-[void Function()?] - [OptimisticUpdate]o-[void Function(Object, StackTrace?)?] - - [CountWhereValidator - | - +predicate: bool Function(T?); - +minCount: int?; - +maxCount: int?; - <static>+kValidationMessageMinCount: String; - <static>+kValidationMessageMaxCount: String - | - +Map<String, dynamic>? validate() - ] - - [CountWhereValidator]o-[bool Function(T?)] - [<abstract>Validator]<:-[CountWhereValidator] - - [Patterns - | - <static>+timeFormatString: String; - <static>+emailFormatString: String; - <static>+url: String - ] - - [ModelAction - | - +type: T; - +label: String; - +icon: IconData?; - +onExecute: Function; - +isAvailable: bool; - +isDestructive: bool - ] - - [ModelAction]o-[IconData] - - [<abstract>IModelActionProvider - | - +List<ModelAction<dynamic>> availableActions() - ] - - [<abstract>IListActionProvider - | - +void onSelectItem(); - +void onNewItem() - ] - - [<abstract>IModelActionProvider]<:-[<abstract>IListActionProvider] - - [ModelActionType - | - +index: int; - <static>+values: List<ModelActionType>; - <static>+edit: ModelActionType; - <static>+delete: ModelActionType; - <static>+remove: ModelActionType; - <static>+duplicate: ModelActionType; - <static>+clipboard: ModelActionType; - <static>+primary: ModelActionType - ] - - [ModelActionType]o-[ModelActionType] - [Enum]<:--[ModelActionType] - - [<abstract>IProviderArgsResolver - | - +R provide() - ] - - [Tuple - | - +first: T1; - +second: T2; - +props: List<Object?> - | - +Map<String, dynamic> toJson(); - <static>+Tuple<dynamic, dynamic> fromJson(); - +Tuple<T1, T2> copy(); - +Tuple<T1, T2> copyWith() - ] - - [<abstract>Equatable]<:-[Tuple] - - [SuppressedBehaviorSubject - | - +subject: BehaviorSubject<T>; - +didSuppressInitialEvent: bool; - -_controller: StreamController<T> - | - -StreamController<T> _buildDerivedController(); - +dynamic close() - ] - - [SuppressedBehaviorSubject]o-[BehaviorSubject] - [SuppressedBehaviorSubject]o-[StreamController] - - [<abstract>JsonFileLoader - | - +jsonAssetsPath: String - | - +dynamic loadJson(); - +dynamic parseJsonMapFromAssets(); - +dynamic parseJsonListFromAssets() - ] - - [CombinedStreamNotifier - | - -_subscriptions: List<StreamSubscription<dynamic>> - | - +void dispose() - ] - - [ChangeNotifier]<:-[CombinedStreamNotifier] - - [Time - | - <static>+dynamic fromTimeOfDay(); - +Map<String, dynamic> toJson(); - <static>+Time fromJson() - ] - - [TimeOfDay]<:-[Time] - - [TimeValueAccessor - | - +String modelToViewValue(); - +Time? viewToModelValue(); - -String _addLeadingZeroIfNeeded() - ] - - [<abstract>ControlValueAccessor]<:-[TimeValueAccessor] - - [NumericalRangeFormatter - | - +min: int?; - +max: int? - | - +TextEditingValue formatEditUpdate() - ] - - [<abstract>TextInputFormatter]<:-[NumericalRangeFormatter] - - [StudySequenceFormatter - | - +TextEditingValue formatEditUpdate() - ] - - [<abstract>TextInputFormatter]<:-[StudySequenceFormatter] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - SerializableColor - - - - - - +Map<String, dynamic> toJson() - <static>+SerializableColor fromJson() - - - - - - - - - - - Color - - - - - - - - - - - - FileFormatEncoder - - - - - - +dynamic encodeAsync() - +String encode() - +dynamic call() - - - - - - - - - - - - CSVStringEncoder - - - - - - +String encode() - - - - - - - - - - - - JsonStringEncoder - - - - - - +String encode() - - - - - - - - - - - - - ExecutionLimiter - - - - - - +milliseconds: int - <static>-_timer: Timer? - - - - - - +void dispose() - - - - - - - - - - - Timer - - - - - - - - - - - - - Debouncer - - - - - - +leading: bool - +cancelUncompleted: bool - -_uncompletedFutureOperation: CancelableOperation<dynamic>? - - - - - - +dynamic call() - - - - - - - - - - - CancelableOperation - - - - - - - - - - - - Throttler - - - - - - +dynamic call() - - - - - - - - - - - - - OptimisticUpdate - - - - - - +applyOptimistic: void Function() - +apply: dynamic Function() - +rollback: void Function() - +onUpdate: void Function()? - +onError: void Function(Object, StackTrace?)? - +rethrowErrors: bool - +runOptimistically: bool - +completeFutureOptimistically: bool - - - - - - +dynamic execute() - -void _runUpdateHandlerIfAny() - - - - - - - - - - - void Function() - - - - - - - - - - - dynamic Function() - - - - - - - - - - - void Function()? - - - - - - - - - - - void Function(Object, StackTrace?)? - - - - - - - - - - - - - CountWhereValidator - - - - - - +predicate: bool Function(T?) - +minCount: int? - +maxCount: int? - <static>+kValidationMessageMinCount: String - <static>+kValidationMessageMaxCount: String - - - - - - +Map<String, dynamic>? validate() - - - - - - - - - - - bool Function(T?) - - - - - - - - - - - Validator - - - - - - - - - - - - Patterns - - - - - - <static>+timeFormatString: String - <static>+emailFormatString: String - <static>+url: String - - - - - - - - - - - - ModelAction - - - - - - +type: T - +label: String - +icon: IconData? - +onExecute: Function - +isAvailable: bool - +isDestructive: bool - - - - - - - - - - - IconData - - - - - - - - - - - - IModelActionProvider - - - - - - +List<ModelAction<dynamic>> availableActions() - - - - - - - - - - - - IListActionProvider - - - - - - +void onSelectItem() - +void onNewItem() - - - - - - - - - - - - ModelActionType - - - - - - +index: int - <static>+values: List<ModelActionType> - <static>+edit: ModelActionType - <static>+delete: ModelActionType - <static>+remove: ModelActionType - <static>+duplicate: ModelActionType - <static>+clipboard: ModelActionType - <static>+primary: ModelActionType - - - - - - - - - - - Enum - - - - - - - - - - - - IProviderArgsResolver - - - - - - +R provide() - - - - - - - - - - - - - Tuple - - - - - - +first: T1 - +second: T2 - +props: List<Object?> - - - - - - +Map<String, dynamic> toJson() - <static>+Tuple<dynamic, dynamic> fromJson() - +Tuple<T1, T2> copy() - +Tuple<T1, T2> copyWith() - - - - - - - - - - - Equatable - - - - - - - - - - - - - SuppressedBehaviorSubject - - - - - - +subject: BehaviorSubject<T> - +didSuppressInitialEvent: bool - -_controller: StreamController<T> - - - - - - -StreamController<T> _buildDerivedController() - +dynamic close() - - - - - - - - - - - BehaviorSubject - - - - - - - - - - - StreamController - - - - - - - - - - - - - JsonFileLoader - - - - - - +jsonAssetsPath: String - - - - - - +dynamic loadJson() - +dynamic parseJsonMapFromAssets() - +dynamic parseJsonListFromAssets() - - - - - - - - - - - - - CombinedStreamNotifier - - - - - - -_subscriptions: List<StreamSubscription<dynamic>> - - - - - - +void dispose() - - - - - - - - - - - ChangeNotifier - - - - - - - - - - - - Time - - - - - - <static>+dynamic fromTimeOfDay() - +Map<String, dynamic> toJson() - <static>+Time fromJson() - - - - - - - - - - - TimeOfDay - - - - - - - - - - - - TimeValueAccessor - - - - - - +String modelToViewValue() - +Time? viewToModelValue() - -String _addLeadingZeroIfNeeded() - - - - - - - - - - - ControlValueAccessor - - - - - - - - - - - - - NumericalRangeFormatter - - - - - - +min: int? - +max: int? - - - - - - +TextEditingValue formatEditUpdate() - - - - - - - - - - - TextInputFormatter - - - - - - - - - - - - StudySequenceFormatter - - - - - - +TextEditingValue formatEditUpdate() - - - - - - - - - \ No newline at end of file diff --git a/docs/uml/flutter_common/lib/src/uml.svg b/docs/uml/flutter_common/lib/src/uml.svg deleted file mode 100644 index df7946745..000000000 --- a/docs/uml/flutter_common/lib/src/uml.svg +++ /dev/null @@ -1,299 +0,0 @@ - - [AppLanguage - | - <static>+keyLanguageCode: String; - +supportedLocales: List<Locale>; - -_appLocale: Locale?; - +appLocal: Locale? - | - +dynamic fetchLocale(); - +dynamic changeLanguage() - ] - - [AppLanguage]o-[Locale] - [ChangeNotifier]<:-[AppLanguage] - - [RetryFutureBuilder - | - +tryFunction: dynamic Function(); - +successBuilder: Widget Function(BuildContext, T?); - +initialData: T?; - +loadingBuilder: Widget Function(BuildContext)?; - +errorWidgetBuilder: Widget Function(BuildContext, dynamic, void Function())?; - +extraWidgets: List<Widget> - | - <static>+RetryFutureBuilderState<dynamic>? of() - ] - - [RetryFutureBuilder]o-[dynamic Function()] - [RetryFutureBuilder]o-[Widget Function(BuildContext, T?)] - [RetryFutureBuilder]o-[Widget Function(BuildContext)?] - [RetryFutureBuilder]o-[Widget Function(BuildContext, dynamic, void Function())?] - - [SupabaseStorage - | - +dynamic initialize(); - +dynamic hasAccessToken(); - +dynamic accessToken(); - +dynamic persistSession(); - +dynamic removePersistedSession() - ] - - [<abstract>LocalStorage]<:-[SupabaseStorage] - - [SecureStorage - | - <static>+storage: FlutterSecureStorage - | - <static>+dynamic containsKey(); - <static>+dynamic write(); - <static>+dynamic read(); - <static>+dynamic readBool(); - <static>+dynamic delete(); - <static>+dynamic deleteAll(); - <static>+dynamic migrateSharedPreferencesToSecureStorage() - ] - - [SecureStorage]o-[FlutterSecureStorage] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AppLanguage - - - - - - <static>+keyLanguageCode: String - +supportedLocales: List<Locale> - -_appLocale: Locale? - +appLocal: Locale? - - - - - - +dynamic fetchLocale() - +dynamic changeLanguage() - - - - - - - - - - - Locale - - - - - - - - - - - ChangeNotifier - - - - - - - - - - - - - RetryFutureBuilder - - - - - - +tryFunction: dynamic Function() - +successBuilder: Widget Function(BuildContext, T?) - +initialData: T? - +loadingBuilder: Widget Function(BuildContext)? - +errorWidgetBuilder: Widget Function(BuildContext, dynamic, void Function())? - +extraWidgets: List<Widget> - - - - - - <static>+RetryFutureBuilderState<dynamic>? of() - - - - - - - - - - - dynamic Function() - - - - - - - - - - - Widget Function(BuildContext, T?) - - - - - - - - - - - Widget Function(BuildContext)? - - - - - - - - - - - Widget Function(BuildContext, dynamic, void Function())? - - - - - - - - - - - - SupabaseStorage - - - - - - +dynamic initialize() - +dynamic hasAccessToken() - +dynamic accessToken() - +dynamic persistSession() - +dynamic removePersistedSession() - - - - - - - - - - - LocalStorage - - - - - - - - - - - - - SecureStorage - - - - - - <static>+storage: FlutterSecureStorage - - - - - - <static>+dynamic containsKey() - <static>+dynamic write() - <static>+dynamic read() - <static>+dynamic readBool() - <static>+dynamic delete() - <static>+dynamic deleteAll() - <static>+dynamic migrateSharedPreferencesToSecureStorage() - - - - - - - - - - - FlutterSecureStorage - - - - - - - - - \ No newline at end of file diff --git a/docs/uml/flutter_common/lib/src/utils/uml.svg b/docs/uml/flutter_common/lib/src/utils/uml.svg deleted file mode 100644 index df7946745..000000000 --- a/docs/uml/flutter_common/lib/src/utils/uml.svg +++ /dev/null @@ -1,299 +0,0 @@ - - [AppLanguage - | - <static>+keyLanguageCode: String; - +supportedLocales: List<Locale>; - -_appLocale: Locale?; - +appLocal: Locale? - | - +dynamic fetchLocale(); - +dynamic changeLanguage() - ] - - [AppLanguage]o-[Locale] - [ChangeNotifier]<:-[AppLanguage] - - [RetryFutureBuilder - | - +tryFunction: dynamic Function(); - +successBuilder: Widget Function(BuildContext, T?); - +initialData: T?; - +loadingBuilder: Widget Function(BuildContext)?; - +errorWidgetBuilder: Widget Function(BuildContext, dynamic, void Function())?; - +extraWidgets: List<Widget> - | - <static>+RetryFutureBuilderState<dynamic>? of() - ] - - [RetryFutureBuilder]o-[dynamic Function()] - [RetryFutureBuilder]o-[Widget Function(BuildContext, T?)] - [RetryFutureBuilder]o-[Widget Function(BuildContext)?] - [RetryFutureBuilder]o-[Widget Function(BuildContext, dynamic, void Function())?] - - [SupabaseStorage - | - +dynamic initialize(); - +dynamic hasAccessToken(); - +dynamic accessToken(); - +dynamic persistSession(); - +dynamic removePersistedSession() - ] - - [<abstract>LocalStorage]<:-[SupabaseStorage] - - [SecureStorage - | - <static>+storage: FlutterSecureStorage - | - <static>+dynamic containsKey(); - <static>+dynamic write(); - <static>+dynamic read(); - <static>+dynamic readBool(); - <static>+dynamic delete(); - <static>+dynamic deleteAll(); - <static>+dynamic migrateSharedPreferencesToSecureStorage() - ] - - [SecureStorage]o-[FlutterSecureStorage] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AppLanguage - - - - - - <static>+keyLanguageCode: String - +supportedLocales: List<Locale> - -_appLocale: Locale? - +appLocal: Locale? - - - - - - +dynamic fetchLocale() - +dynamic changeLanguage() - - - - - - - - - - - Locale - - - - - - - - - - - ChangeNotifier - - - - - - - - - - - - - RetryFutureBuilder - - - - - - +tryFunction: dynamic Function() - +successBuilder: Widget Function(BuildContext, T?) - +initialData: T? - +loadingBuilder: Widget Function(BuildContext)? - +errorWidgetBuilder: Widget Function(BuildContext, dynamic, void Function())? - +extraWidgets: List<Widget> - - - - - - <static>+RetryFutureBuilderState<dynamic>? of() - - - - - - - - - - - dynamic Function() - - - - - - - - - - - Widget Function(BuildContext, T?) - - - - - - - - - - - Widget Function(BuildContext)? - - - - - - - - - - - Widget Function(BuildContext, dynamic, void Function())? - - - - - - - - - - - - SupabaseStorage - - - - - - +dynamic initialize() - +dynamic hasAccessToken() - +dynamic accessToken() - +dynamic persistSession() - +dynamic removePersistedSession() - - - - - - - - - - - LocalStorage - - - - - - - - - - - - - SecureStorage - - - - - - <static>+storage: FlutterSecureStorage - - - - - - <static>+dynamic containsKey() - <static>+dynamic write() - <static>+dynamic read() - <static>+dynamic readBool() - <static>+dynamic delete() - <static>+dynamic deleteAll() - <static>+dynamic migrateSharedPreferencesToSecureStorage() - - - - - - - - - - - FlutterSecureStorage - - - - - - - - - \ No newline at end of file diff --git a/docs/uml/flutter_common/lib/uml.svg b/docs/uml/flutter_common/lib/uml.svg deleted file mode 100644 index df7946745..000000000 --- a/docs/uml/flutter_common/lib/uml.svg +++ /dev/null @@ -1,299 +0,0 @@ - - [AppLanguage - | - <static>+keyLanguageCode: String; - +supportedLocales: List<Locale>; - -_appLocale: Locale?; - +appLocal: Locale? - | - +dynamic fetchLocale(); - +dynamic changeLanguage() - ] - - [AppLanguage]o-[Locale] - [ChangeNotifier]<:-[AppLanguage] - - [RetryFutureBuilder - | - +tryFunction: dynamic Function(); - +successBuilder: Widget Function(BuildContext, T?); - +initialData: T?; - +loadingBuilder: Widget Function(BuildContext)?; - +errorWidgetBuilder: Widget Function(BuildContext, dynamic, void Function())?; - +extraWidgets: List<Widget> - | - <static>+RetryFutureBuilderState<dynamic>? of() - ] - - [RetryFutureBuilder]o-[dynamic Function()] - [RetryFutureBuilder]o-[Widget Function(BuildContext, T?)] - [RetryFutureBuilder]o-[Widget Function(BuildContext)?] - [RetryFutureBuilder]o-[Widget Function(BuildContext, dynamic, void Function())?] - - [SupabaseStorage - | - +dynamic initialize(); - +dynamic hasAccessToken(); - +dynamic accessToken(); - +dynamic persistSession(); - +dynamic removePersistedSession() - ] - - [<abstract>LocalStorage]<:-[SupabaseStorage] - - [SecureStorage - | - <static>+storage: FlutterSecureStorage - | - <static>+dynamic containsKey(); - <static>+dynamic write(); - <static>+dynamic read(); - <static>+dynamic readBool(); - <static>+dynamic delete(); - <static>+dynamic deleteAll(); - <static>+dynamic migrateSharedPreferencesToSecureStorage() - ] - - [SecureStorage]o-[FlutterSecureStorage] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AppLanguage - - - - - - <static>+keyLanguageCode: String - +supportedLocales: List<Locale> - -_appLocale: Locale? - +appLocal: Locale? - - - - - - +dynamic fetchLocale() - +dynamic changeLanguage() - - - - - - - - - - - Locale - - - - - - - - - - - ChangeNotifier - - - - - - - - - - - - - RetryFutureBuilder - - - - - - +tryFunction: dynamic Function() - +successBuilder: Widget Function(BuildContext, T?) - +initialData: T? - +loadingBuilder: Widget Function(BuildContext)? - +errorWidgetBuilder: Widget Function(BuildContext, dynamic, void Function())? - +extraWidgets: List<Widget> - - - - - - <static>+RetryFutureBuilderState<dynamic>? of() - - - - - - - - - - - dynamic Function() - - - - - - - - - - - Widget Function(BuildContext, T?) - - - - - - - - - - - Widget Function(BuildContext)? - - - - - - - - - - - Widget Function(BuildContext, dynamic, void Function())? - - - - - - - - - - - - SupabaseStorage - - - - - - +dynamic initialize() - +dynamic hasAccessToken() - +dynamic accessToken() - +dynamic persistSession() - +dynamic removePersistedSession() - - - - - - - - - - - LocalStorage - - - - - - - - - - - - - SecureStorage - - - - - - <static>+storage: FlutterSecureStorage - - - - - - <static>+dynamic containsKey() - <static>+dynamic write() - <static>+dynamic read() - <static>+dynamic readBool() - <static>+dynamic delete() - <static>+dynamic deleteAll() - <static>+dynamic migrateSharedPreferencesToSecureStorage() - - - - - - - - - - - FlutterSecureStorage - - - - - - - - - \ No newline at end of file From b33c518e92dc81f1892bb3decc77634acb787150 Mon Sep 17 00:00:00 2001 From: Johannes Vedder Date: Thu, 23 May 2024 10:39:52 +0200 Subject: [PATCH 044/314] chore: remove docs from ci --- .github/workflows/mega-linter.yml | 3 --- .github/workflows/ready_to_merge.yml | 1 - 2 files changed, 4 deletions(-) diff --git a/.github/workflows/mega-linter.yml b/.github/workflows/mega-linter.yml index 68b464354..231402212 100644 --- a/.github/workflows/mega-linter.yml +++ b/.github/workflows/mega-linter.yml @@ -9,9 +9,6 @@ on: # Comment this line to trigger action only on pull-requests # (not recommended if you don't pay for GH Actions) push: - paths-ignore: - - 'docs/database/**' - - 'docs/uml/**' workflow_dispatch: # Comment env block if you do not want to apply fixes diff --git a/.github/workflows/ready_to_merge.yml b/.github/workflows/ready_to_merge.yml index 6e2cf9133..9da546d6f 100644 --- a/.github/workflows/ready_to_merge.yml +++ b/.github/workflows/ready_to_merge.yml @@ -22,7 +22,6 @@ jobs: "mega-linter.yml", "e2e_tests.yml", "supabase-test.yml", - "uml-docs.yml", ]; console.log("Initializing with workflows to check: " + workflows_to_check); const { owner, repo } = context.repo; From 0e0a098dded9d7620127ba312bd18e3e006a7ce6 Mon Sep 17 00:00:00 2001 From: Johannes Vedder Date: Thu, 23 May 2024 10:40:53 +0200 Subject: [PATCH 045/314] chore: remove docs directory --- docs/uml/app/lib/uml.svg | 4439 --------------- docs/uml/app/lib/util/uml.svg | 448 -- .../shared/questionnaire/question/uml.svg | 1066 ---- .../design/shared/questionnaire/uml.svg | 1218 ----- .../lib/features/design/shared/uml.svg | 1418 ----- .../designer_v2/lib/features/design/uml.svg | 4822 ----------------- 6 files changed, 13411 deletions(-) delete mode 100644 docs/uml/app/lib/uml.svg delete mode 100644 docs/uml/app/lib/util/uml.svg delete mode 100644 docs/uml/designer_v2/lib/features/design/shared/questionnaire/question/uml.svg delete mode 100644 docs/uml/designer_v2/lib/features/design/shared/questionnaire/uml.svg delete mode 100644 docs/uml/designer_v2/lib/features/design/shared/uml.svg delete mode 100644 docs/uml/designer_v2/lib/features/design/uml.svg diff --git a/docs/uml/app/lib/uml.svg b/docs/uml/app/lib/uml.svg deleted file mode 100644 index befab00ad..000000000 --- a/docs/uml/app/lib/uml.svg +++ /dev/null @@ -1,4439 +0,0 @@ - - [AboutScreen - | - +Widget build() - ] - - [WelcomeScreen - | - +Widget build() - ] - - [Preview - | - +queryParameters: Map<String, String>?; - +appLanguage: AppLanguage; - +selectedRoute: String?; - +extra: String?; - +study: Study?; - +selectedStudyObjectId: String?; - +subject: StudySubject? - | - +bool hasRoute(); - +void handleQueries(); - +dynamic init(); - +dynamic handleAuthorization(); - +dynamic runCommands(); - +String? getSelectedRoute(); - +bool containsQuery(); - +bool containsQueryPair(); - +dynamic getStudySubject(); - -dynamic _createFakeSubject(); - +List<String> getInterventionIds() - ] - - [Preview]o-[AppLanguage] - [Preview]o-[Study] - [Preview]o-[StudySubject] - - [IFrameHelper - | - +void postRouteFinished(); - +void listen() - ] - - [TermsScreen - ] - - [LegalSection - | - +title: String?; - +description: String?; - +icon: Icon?; - +pdfUrl: String?; - +pdfUrlLabel: String?; - +acknowledgment: String?; - +isChecked: bool?; - +onChange: void Function(bool?)? - | - +Widget build() - ] - - [LegalSection]o-[Icon] - [LegalSection]o-[void Function(bool?)?] - - [AppOutdatedScreen - | - +Widget build() - ] - - [LoadingScreen - | - +sessionString: String?; - +queryParameters: Map<String, String>? - ] - - [QuestionnaireTaskWidget - | - +task: QuestionnaireTask; - +completionPeriod: CompletionPeriod - ] - - [QuestionnaireTaskWidget]o-[QuestionnaireTask] - [QuestionnaireTaskWidget]o-[CompletionPeriod] - - [TaskScreen - | - +taskInstance: TaskInstance - | - <static>+MaterialPageRoute<bool> routeFor() - ] - - [TaskScreen]o-[TaskInstance] - - [CheckmarkTaskWidget - | - +task: CheckmarkTask?; - +completionPeriod: CompletionPeriod? - ] - - [CheckmarkTaskWidget]o-[CheckmarkTask] - [CheckmarkTaskWidget]o-[CompletionPeriod] - - [CapturePictureScreen - | - +userId: String; - +studyId: String - ] - - [EligibilityResult - | - +eligible: bool; - +firstFailed: EligibilityCriterion? - ] - - [EligibilityResult]o-[EligibilityCriterion] - - [EligibilityScreen - | - +study: Study? - | - <static>+MaterialPageRoute<EligibilityResult> routeFor() - ] - - [EligibilityScreen]o-[Study] - - [InterventionSelectionScreen - ] - - [StudyOverviewScreen - ] - - [_StudyOverviewScreen - | - +study: Study? - | - +dynamic navigateToJourney(); - +dynamic navigateToEligibilityCheck(); - +Widget build() - ] - - [_StudyOverviewScreen]o-[Study] - - [StudyDetailsView - | - +study: Study?; - +iconSize: double - | - +Widget build() - ] - - [StudyDetailsView]o-[Study] - - [JourneyOverviewScreen - ] - - [_JourneyOverviewScreen - | - +subject: StudySubject? - | - +dynamic getConsentAndNavigateToDashboard(); - +Widget build() - ] - - [_JourneyOverviewScreen]o-[StudySubject] - - [Timeline - | - +subject: StudySubject? - | - +Widget build() - ] - - [Timeline]o-[StudySubject] - - [InterventionTile - | - +title: String?; - +iconName: String; - +date: DateTime; - +color: Color?; - +isFirst: bool; - +isLast: bool - | - +Widget build() - ] - - [InterventionTile]o-[Color] - - [IconIndicator - | - +iconName: String; - +color: Color? - | - +Widget build() - ] - - [IconIndicator]o-[Color] - - [TimelineChild - | - +child: Widget? - | - +Widget build() - ] - - [TimelineChild]o-[<abstract>Widget] - - [KickoffScreen - ] - - [_KickoffScreen - | - +subject: StudySubject?; - +ready: bool - | - -dynamic _storeUserStudy(); - -Widget _constructStatusIcon(); - -String _getStatusText(); - +Widget build() - ] - - [_KickoffScreen]o-[StudySubject] - - [ConsentScreen - ] - - [ConsentCard - | - +consent: ConsentItem?; - +index: int?; - +onTapped: dynamic Function(int); - +isChecked: bool? - | - +Widget build() - ] - - [ConsentCard]o-[ConsentItem] - [ConsentCard]o-[dynamic Function(int)] - - [ConsentElement - | - +title: String; - +descriptionText: String; - +acknowledgmentText: String; - +icon: IconData - ] - - [ConsentElement]o-[IconData] - - [StudySelectionScreen - ] - - [InviteCodeDialog - ] - - [OnboardingProgress - | - +stage: int; - +progress: double - | - -double _getProgressForStage(); - +Widget build() - ] - - [ReportDetailsScreen - | - +subject: StudySubject - | - <static>+MaterialPageRoute<dynamic> routeFor(); - +Widget build() - ] - - [ReportDetailsScreen]o-[StudySubject] - - [GeneralDetailsSection - | - +Widget buildContent() - ] - - [<abstract>GenericSection]<:-[GeneralDetailsSection] - - [ReportHistoryScreen - | - +Widget build() - ] - - [ReportHistoryItem - | - +subject: StudySubject - | - +Widget build() - ] - - [ReportHistoryItem]o-[StudySubject] - - [LegendWidget - | - +name: String; - +color: Color - | - +Widget build() - ] - - [LegendWidget]o-[Color] - - [LegendsListWidget - | - +legends: List<Legend> - | - +Widget build() - ] - - [Legend - | - +name: String; - +color: Color - ] - - [Legend]o-[Color] - - [PerformanceDetailsScreen - | - +reportSubject: StudySubject? - | - <static>+MaterialPageRoute<dynamic> routeFor(); - +Widget build() - ] - - [PerformanceDetailsScreen]o-[StudySubject] - - [InterventionPerformanceBar - | - +intervention: Intervention; - +subject: StudySubject? - | - +Widget build() - ] - - [InterventionPerformanceBar]o-[Intervention] - [InterventionPerformanceBar]o-[StudySubject] - - [ObservationPerformanceBar - | - +observation: Observation; - +subject: StudySubject? - | - +Widget build() - ] - - [ObservationPerformanceBar]o-[<abstract>Observation] - [ObservationPerformanceBar]o-[StudySubject] - - [PerformanceBar - | - +task: Task; - +completed: int; - +total: int - | - +Widget build() - ] - - [PerformanceBar]o-[<abstract>Task] - - [PerformanceSection - | - +minimumRatio: double; - +maximum: double - | - +Widget buildContent(); - +String getPowerLevelDescription(); - +int getCountableObservationAmount() - ] - - [<abstract>GenericSection]<:-[PerformanceSection] - - [PerformanceBar - | - +progress: double; - +minimum: double? - | - +Widget build() - ] - - [<abstract>ReportSectionWidget - | - +subject: StudySubject - ] - - [<abstract>ReportSectionWidget]o-[StudySubject] - - [<abstract>GenericSection - | - +subject: StudySubject?; - +onTap: void Function()? - | - +Widget buildContent(); - +Widget build() - ] - - [<abstract>GenericSection]o-[StudySubject] - [<abstract>GenericSection]o-[void Function()?] - - [AverageSectionWidget - | - +section: AverageSection; - +titlePos: List<int>; - +phasePos: List<int> - | - +Widget build(); - +Widget getLegend(); - +Widget getDiagram(); - +BarChartData getChartData(); - +Widget getTitles(); - +Widget getValues(); - +List<BarChartGroupData> getBarGroups(); - +FlGridData getGridData(); - +MaterialColor getColor(); - +int getDayIndex(); - +Iterable<DiagramDatum> getAggregatedData(); - +Map<String, String?> getInterventionNames() - ] - - [AverageSectionWidget]o-[AverageSection] - [<abstract>ReportSectionWidget]<:-[AverageSectionWidget] - - [DiagramDatum - | - +x: num; - +value: num; - +timestamp: DateTime?; - +intervention: String - ] - - [LinearRegressionSectionWidget - | - +section: LinearRegressionSection - | - +Widget build() - ] - - [LinearRegressionSectionWidget]o-[LinearRegressionSection] - [<abstract>ReportSectionWidget]<:-[LinearRegressionSectionWidget] - - [ReportSectionContainer - | - +section: ReportSection; - +subject: StudySubject; - +primary: bool; - +onTap: void Function()? - | - +ReportSectionWidget buildContents(); - +dynamic (); - +List<Widget> buildPrimaryHeader(); - +Widget build() - ] - - [ReportSectionContainer]o-[<abstract>ReportSection] - [ReportSectionContainer]o-[StudySubject] - [ReportSectionContainer]o-[void Function()?] - - [DisclaimerSection - | - +Widget buildContent() - ] - - [<abstract>GenericSection]<:-[DisclaimerSection] - - [Settings - ] - - [OptOutAlertDialog - | - +subject: StudySubject? - | - +Widget build() - ] - - [OptOutAlertDialog]o-[StudySubject] - - [DeleteAlertDialog - | - +subject: StudySubject? - | - +Widget build() - ] - - [DeleteAlertDialog]o-[StudySubject] - - [FAQ - | - +Widget build() - ] - - [Entry - | - +title: String; - +children: List<Entry> - ] - - [EntryItem - | - +entry: Entry - | - -Widget _buildTiles(); - +Widget build() - ] - - [EntryItem]o-[Entry] - - [ContactScreen - ] - - [ContactWidget - | - +contact: Contact?; - +title: String; - +subtitle: String?; - +color: Color - | - +Widget build() - ] - - [ContactWidget]o-[Contact] - [ContactWidget]o-[Color] - - [ContactItem - | - +iconData: IconData; - +itemName: String; - +itemValue: String?; - +type: ContactItemType?; - +iconColor: Color? - | - +dynamic launchContact(); - +Widget build() - ] - - [ContactItem]o-[IconData] - [ContactItem]o-[ContactItemType] - [ContactItem]o-[Color] - - [ContactItemType - | - +index: int; - <static>+values: List<ContactItemType>; - <static>+website: ContactItemType; - <static>+email: ContactItemType; - <static>+phone: ContactItemType - ] - - [ContactItemType]o-[ContactItemType] - [Enum]<:--[ContactItemType] - - [DashboardScreen - | - +error: String? - ] - - [OverflowMenuItem - | - +name: String; - +icon: IconData; - +routeName: String?; - +onTap: dynamic Function()? - ] - - [OverflowMenuItem]o-[IconData] - [OverflowMenuItem]o-[dynamic Function()?] - - [StudyFinishedPlaceholder - | - <static>+space: SizedBox - | - +Widget build() - ] - - [StudyFinishedPlaceholder]o-[SizedBox] - - [TaskOverview - | - +subject: StudySubject?; - +scheduleToday: List<TaskInstance>?; - +interventionIcon: String? - ] - - [TaskOverview]o-[StudySubject] - - [ProgressRow - | - +subject: StudySubject? - ] - - [ProgressRow]o-[StudySubject] - - [InterventionSegment - | - +intervention: Intervention; - +percentCompleted: double; - +percentMissed: double; - +isCurrent: bool; - +isFuture: bool; - +phaseDuration: int - | - +List<Widget> buildSeparators(); - +Widget build() - ] - - [InterventionSegment]o-[Intervention] - - [TaskBox - | - +taskInstance: TaskInstance; - +icon: Icon; - +onCompleted: dynamic Function() - ] - - [TaskBox]o-[TaskInstance] - [TaskBox]o-[Icon] - [TaskBox]o-[dynamic Function()] - - [Routes - | - <static>+loading: String; - <static>+preview: String; - <static>+appOutdated: String; - <static>+dashboard: String; - <static>+welcome: String; - <static>+about: String; - <static>+terms: String; - <static>+studySelection: String; - <static>+studyOverview: String; - <static>+interventionSelection: String; - <static>+journey: String; - <static>+consent: String; - <static>+kickoff: String; - <static>+contact: String; - <static>+faq: String; - <static>+appSettings: String; - <static>+questionnaire: String; - <static>+reportHistory: String; - <static>+reportDetails: String; - <static>+performanceDetails: String - | - <static>+Route<dynamic> unknownRoute(); - <static>+Route<dynamic>? generateRoute() - ] - - [NotificationValidators - | - +didNotificationLaunchApp: bool; - +wasNotificationActionHandled: bool; - +wasNotificationActionCompleted: bool - ] - - [StudyNotifications - | - +subject: StudySubject?; - +flutterLocalNotificationsPlugin: FlutterLocalNotificationsPlugin; - +context: BuildContext; - +didReceiveLocalNotificationStream: StreamController<ReceivedNotification>; - +selectNotificationStream: StreamController<String?>; - <static>+validator: NotificationValidators; - <static>+debug: bool; - <static>+scheduledNotificationsDebug: String? - | - <static>+dynamic create(); - -dynamic _isAndroidPermissionGranted(); - -dynamic _requestPermissions(); - -void _configureDidReceiveLocalNotificationSubject(); - -void _configureSelectNotificationSubject(); - -void _initNotificationsPlugin(); - +dynamic handleNotificationResponse() - ] - - [StudyNotifications]o-[StudySubject] - [StudyNotifications]o-[FlutterLocalNotificationsPlugin] - [StudyNotifications]o-[<abstract>BuildContext] - [StudyNotifications]o-[StreamController] - [StudyNotifications]o-[NotificationValidators] - - [ReceivedNotification - | - +id: int?; - +title: String?; - +body: String?; - +payload: String? - ] - - [StudyNotification - | - +taskInstance: TaskInstance; - +date: DateTime - ] - - [StudyNotification]o-[TaskInstance] - - [TemporaryStorageHandler - | - <static>-_stagingBaseNamePrefix: String; - <static>-_audioFileType: String; - <static>-_imageFileType: String; - -_userId: String; - -_studyId: String - | - -String _buildFileName(); - <static>-dynamic _getMultimodalTempDirectory(); - <static>-dynamic _getMultimodalUploadDirectory(); - <static>+dynamic moveStagingFileToUploadDirectory(); - <static>+dynamic getFutureBlobFiles(); - +dynamic getStagingAudio(); - +dynamic getStagingImage(); - <static>+dynamic deleteAllStagingFiles() - ] - - [GroupedIterable - | - +data: Map<K, Iterable<V>>; - +iterator: Iterator<MapEntry<K, Iterable<V>>> - | - +Iterable<MapEntry<K, R>> aggregate(); - +Iterable<MapEntry<K, R>> aggregateWithKey() - ] - - [Iterable]<:-[GroupedIterable] - - [Cache - | - <static>+isSynchronizing: bool - | - <static>+dynamic storeSubject(); - <static>+dynamic loadSubject(); - <static>+dynamic storeAnalytics(); - <static>+dynamic loadAnalytics(); - <static>+dynamic delete(); - <static>+dynamic uploadBlobFiles(); - <static>+dynamic synchronize() - ] - - [AppAnalytics - | - <static>-_userEnabled: bool?; - <static>+keyAnalyticsUserEnable: String; - +context: BuildContext; - +subject: StudySubject?; - <static>+isUserEnabled: dynamic - | - <static>+dynamic init(); - <static>+dynamic start(); - <static>+void setEnabled(); - +dynamic initBasic(); - +void initAdvanced() - ] - - [AppAnalytics]o-[<abstract>BuildContext] - [AppAnalytics]o-[StudySubject] - - [ThemeConfig - | - <static>+SliderThemeData coloredSliderTheme() - ] - - [ScaleQuestionWidget - | - +question: ScaleQuestion; - +onDone: dynamic Function(Answer<dynamic>)? - ] - - [ScaleQuestionWidget]o-[ScaleQuestion] - [ScaleQuestionWidget]o-[dynamic Function(Answer<dynamic>)?] - [<abstract>QuestionWidget]<:-[ScaleQuestionWidget] - - [VisualAnalogueQuestionWidget - | - +question: VisualAnalogueQuestion; - +onDone: dynamic Function(Answer<dynamic>)? - ] - - [VisualAnalogueQuestionWidget]o-[VisualAnalogueQuestion] - [VisualAnalogueQuestionWidget]o-[dynamic Function(Answer<dynamic>)?] - [<abstract>QuestionWidget]<:-[VisualAnalogueQuestionWidget] - - [AnnotatedScaleQuestionWidget - | - +question: AnnotatedScaleQuestion; - +onDone: dynamic Function(Answer<dynamic>)? - ] - - [AnnotatedScaleQuestionWidget]o-[AnnotatedScaleQuestion] - [AnnotatedScaleQuestionWidget]o-[dynamic Function(Answer<dynamic>)?] - [<abstract>QuestionWidget]<:-[AnnotatedScaleQuestionWidget] - - [BooleanQuestionWidget - | - +question: BooleanQuestion; - +onDone: dynamic Function(Answer<dynamic>)? - ] - - [BooleanQuestionWidget]o-[BooleanQuestion] - [BooleanQuestionWidget]o-[dynamic Function(Answer<dynamic>)?] - [<abstract>QuestionWidget]<:-[BooleanQuestionWidget] - - [FreeTextQuestionWidget - | - +question: FreeTextQuestion; - +onDone: dynamic Function(Answer<dynamic>)? - ] - - [FreeTextQuestionWidget]o-[FreeTextQuestion] - [FreeTextQuestionWidget]o-[dynamic Function(Answer<dynamic>)?] - [<abstract>QuestionWidget]<:-[FreeTextQuestionWidget] - - [<abstract>QuestionWidget - | - +subtitle: String? - ] - - [ChoiceQuestionWidget - | - +question: ChoiceQuestion; - +onDone: dynamic Function(Answer<dynamic>); - +multiSelectionText: String; - +subtitle: String? - ] - - [ChoiceQuestionWidget]o-[ChoiceQuestion] - [ChoiceQuestionWidget]o-[dynamic Function(Answer<dynamic>)] - [<abstract>QuestionWidget]<:-[ChoiceQuestionWidget] - - [AudioRecordingQuestionWidget - | - +question: AudioRecordingQuestion; - +onDone: dynamic Function(Answer<FutureBlobFile>)? - ] - - [AudioRecordingQuestionWidget]o-[AudioRecordingQuestion] - [AudioRecordingQuestionWidget]o-[dynamic Function(Answer<FutureBlobFile>)?] - [<abstract>QuestionWidget]<:-[AudioRecordingQuestionWidget] - - [QuestionnaireWidget - | - +title: String?; - +header: String?; - +footer: String?; - +questions: List<Question<dynamic>> - ] - - [HtmlTextBox - | - +text: String? - | - +Widget build() - ] - - [ImageCapturingQuestionWidget - | - +question: ImageCapturingQuestion; - +onDone: dynamic Function(Answer<FutureBlobFile>)? - ] - - [ImageCapturingQuestionWidget]o-[ImageCapturingQuestion] - [ImageCapturingQuestionWidget]o-[dynamic Function(Answer<FutureBlobFile>)?] - [<abstract>QuestionWidget]<:-[ImageCapturingQuestionWidget] - - [QuestionContainer - | - +onDone: dynamic Function(Answer<dynamic>, int); - +question: Question<dynamic>; - +index: int - ] - - [QuestionContainer]o-[dynamic Function(Answer<dynamic>, int)] - [QuestionContainer]o-[<abstract>Question] - - [QuestionHeader - | - +prompt: String?; - +subtitle: String?; - +rationale: String? - | - -List<Widget> _buildSubtitle(); - -List<Widget> _buildRationaleButton(); - +Widget build() - ] - - [CustomSlider - | - +value: double?; - +minValue: double?; - +maxValue: double?; - +minorTick: int?; - +onChanged: dynamic Function(double)?; - +onChangeEnd: dynamic Function(double)?; - +activeColor: Color?; - +inactiveColor: Color?; - +minColor: Color?; - +maxColor: Color?; - +thumbColor: Color?; - +isColored: bool; - +labelValuePrecision: int; - +tickValuePrecision: int; - +linearStep: bool; - +steps: AnnotatedScaleQuestion? - | - +Widget build() - ] - - [CustomSlider]o-[dynamic Function(double)?] - [CustomSlider]o-[Color] - [CustomSlider]o-[AnnotatedScaleQuestion] - - [CustomTrackShape - | - +Rect getPreferredRect() - ] - - [RoundedRectSliderTrackShape]<:-[CustomTrackShape] - - [BottomOnboardingNavigation - | - +onBack: void Function()?; - +onNext: void Function()?; - +backLabel: String?; - +nextLabel: String?; - +hideNext: bool; - +nextIcon: Icon?; - +backIcon: Icon?; - +progress: Widget? - | - +Widget build() - ] - - [BottomOnboardingNavigation]o-[void Function()?] - [BottomOnboardingNavigation]o-[Icon] - [BottomOnboardingNavigation]o-[<abstract>Widget] - - [InterventionCard - | - +intervention: Intervention; - +selected: bool; - +showCheckbox: bool; - +showTasks: bool; - +showDescription: bool; - +onTap: dynamic Function()? - | - +Widget build() - ] - - [InterventionCard]o-[Intervention] - [InterventionCard]o-[dynamic Function()?] - - [InterventionCardTitle - | - +intervention: Intervention?; - +selected: bool; - +showCheckbox: bool; - +showDescriptionButton: bool; - +onTap: dynamic Function()? - | - +Widget build() - ] - - [InterventionCardTitle]o-[Intervention] - [InterventionCardTitle]o-[dynamic Function()?] - - [InterventionCardDescription - | - +intervention: Intervention - | - +Widget build() - ] - - [InterventionCardDescription]o-[Intervention] - - [_TaskList - | - +tasks: List<InterventionTask> - | - +String scheduleString(); - +Widget build() - ] - - [StudyTile - | - +title: String?; - +description: String?; - +iconName: String; - +onTap: dynamic Function()?; - +contentPadding: EdgeInsetsGeometry - | - +Widget build() - ] - - [StudyTile]o-[dynamic Function()?] - [StudyTile]o-[<abstract>EdgeInsetsGeometry] - - [RoundCheckbox - | - +onChanged: dynamic Function(bool)?; - +value: bool? - | - +Widget build() - ] - - [RoundCheckbox]o-[dynamic Function(bool)?] - - [SelectableButton - | - +child: Widget; - +selected: bool; - +onTap: dynamic Function()? - | - -Color _getFillColor(); - -Color _getTextColor(); - +Widget build() - ] - - [SelectableButton]o-[<abstract>Widget] - [SelectableButton]o-[dynamic Function()?] - - [HtmlText - | - +text: String?; - +style: TextStyle?; - +centered: bool - | - +Widget build() - ] - - [HtmlText]o-[TextStyle] - - [MyApp - | - +queryParameters: Map<String, String>; - +appConfig: AppConfig?; - +initialRoute: String - ] - - [MyApp]o-[AppConfig] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AboutScreen - - - - - - +Widget build() - - - - - - - - - - - - WelcomeScreen - - - - - - +Widget build() - - - - - - - - - - - - - Preview - - - - - - +queryParameters: Map<String, String>? - +appLanguage: AppLanguage - +selectedRoute: String? - +extra: String? - +study: Study? - +selectedStudyObjectId: String? - +subject: StudySubject? - - - - - - +bool hasRoute() - +void handleQueries() - +dynamic init() - +dynamic handleAuthorization() - +dynamic runCommands() - +String? getSelectedRoute() - +bool containsQuery() - +bool containsQueryPair() - +dynamic getStudySubject() - -dynamic _createFakeSubject() - +List<String> getInterventionIds() - - - - - - - - - - - AppLanguage - - - - - - - - - - - Study - - - - - - - - - - - StudySubject - - - - - - - - - - - - IFrameHelper - - - - - - +void postRouteFinished() - +void listen() - - - - - - - - - - - TermsScreen - - - - - - - - - - - - - LegalSection - - - - - - +title: String? - +description: String? - +icon: Icon? - +pdfUrl: String? - +pdfUrlLabel: String? - +acknowledgment: String? - +isChecked: bool? - +onChange: void Function(bool?)? - - - - - - +Widget build() - - - - - - - - - - - Icon - - - - - - - - - - - void Function(bool?)? - - - - - - - - - - - - AppOutdatedScreen - - - - - - +Widget build() - - - - - - - - - - - - LoadingScreen - - - - - - +sessionString: String? - +queryParameters: Map<String, String>? - - - - - - - - - - - - QuestionnaireTaskWidget - - - - - - +task: QuestionnaireTask - +completionPeriod: CompletionPeriod - - - - - - - - - - - QuestionnaireTask - - - - - - - - - - - CompletionPeriod - - - - - - - - - - - - - TaskScreen - - - - - - +taskInstance: TaskInstance - - - - - - <static>+MaterialPageRoute<bool> routeFor() - - - - - - - - - - - TaskInstance - - - - - - - - - - - - CheckmarkTaskWidget - - - - - - +task: CheckmarkTask? - +completionPeriod: CompletionPeriod? - - - - - - - - - - - CheckmarkTask - - - - - - - - - - - - CapturePictureScreen - - - - - - +userId: String - +studyId: String - - - - - - - - - - - - EligibilityResult - - - - - - +eligible: bool - +firstFailed: EligibilityCriterion? - - - - - - - - - - - EligibilityCriterion - - - - - - - - - - - - - EligibilityScreen - - - - - - +study: Study? - - - - - - <static>+MaterialPageRoute<EligibilityResult> routeFor() - - - - - - - - - - - InterventionSelectionScreen - - - - - - - - - - - StudyOverviewScreen - - - - - - - - - - - - - _StudyOverviewScreen - - - - - - +study: Study? - - - - - - +dynamic navigateToJourney() - +dynamic navigateToEligibilityCheck() - +Widget build() - - - - - - - - - - - - - StudyDetailsView - - - - - - +study: Study? - +iconSize: double - - - - - - +Widget build() - - - - - - - - - - - JourneyOverviewScreen - - - - - - - - - - - - - _JourneyOverviewScreen - - - - - - +subject: StudySubject? - - - - - - +dynamic getConsentAndNavigateToDashboard() - +Widget build() - - - - - - - - - - - - - Timeline - - - - - - +subject: StudySubject? - - - - - - +Widget build() - - - - - - - - - - - - - InterventionTile - - - - - - +title: String? - +iconName: String - +date: DateTime - +color: Color? - +isFirst: bool - +isLast: bool - - - - - - +Widget build() - - - - - - - - - - - Color - - - - - - - - - - - - - IconIndicator - - - - - - +iconName: String - +color: Color? - - - - - - +Widget build() - - - - - - - - - - - - - TimelineChild - - - - - - +child: Widget? - - - - - - +Widget build() - - - - - - - - - - - Widget - - - - - - - - - - - KickoffScreen - - - - - - - - - - - - - _KickoffScreen - - - - - - +subject: StudySubject? - +ready: bool - - - - - - -dynamic _storeUserStudy() - -Widget _constructStatusIcon() - -String _getStatusText() - +Widget build() - - - - - - - - - - - ConsentScreen - - - - - - - - - - - - - ConsentCard - - - - - - +consent: ConsentItem? - +index: int? - +onTapped: dynamic Function(int) - +isChecked: bool? - - - - - - +Widget build() - - - - - - - - - - - ConsentItem - - - - - - - - - - - dynamic Function(int) - - - - - - - - - - - - ConsentElement - - - - - - +title: String - +descriptionText: String - +acknowledgmentText: String - +icon: IconData - - - - - - - - - - - IconData - - - - - - - - - - - StudySelectionScreen - - - - - - - - - - - InviteCodeDialog - - - - - - - - - - - - - OnboardingProgress - - - - - - +stage: int - +progress: double - - - - - - -double _getProgressForStage() - +Widget build() - - - - - - - - - - - - - ReportDetailsScreen - - - - - - +subject: StudySubject - - - - - - <static>+MaterialPageRoute<dynamic> routeFor() - +Widget build() - - - - - - - - - - - - GeneralDetailsSection - - - - - - +Widget buildContent() - - - - - - - - - - - - - GenericSection - - - - - - +subject: StudySubject? - +onTap: void Function()? - - - - - - +Widget buildContent() - +Widget build() - - - - - - - - - - - - ReportHistoryScreen - - - - - - +Widget build() - - - - - - - - - - - - - ReportHistoryItem - - - - - - +subject: StudySubject - - - - - - +Widget build() - - - - - - - - - - - - - LegendWidget - - - - - - +name: String - +color: Color - - - - - - +Widget build() - - - - - - - - - - - - - LegendsListWidget - - - - - - +legends: List<Legend> - - - - - - +Widget build() - - - - - - - - - - - - Legend - - - - - - +name: String - +color: Color - - - - - - - - - - - - - PerformanceDetailsScreen - - - - - - +reportSubject: StudySubject? - - - - - - <static>+MaterialPageRoute<dynamic> routeFor() - +Widget build() - - - - - - - - - - - - - InterventionPerformanceBar - - - - - - +intervention: Intervention - +subject: StudySubject? - - - - - - +Widget build() - - - - - - - - - - - Intervention - - - - - - - - - - - - - ObservationPerformanceBar - - - - - - +observation: Observation - +subject: StudySubject? - - - - - - +Widget build() - - - - - - - - - - - Observation - - - - - - - - - - - - - PerformanceBar - - - - - - +task: Task - +completed: int - +total: int - - - - - - +Widget build() - - - - - - - - - - - Task - - - - - - - - - - - - - PerformanceSection - - - - - - +minimumRatio: double - +maximum: double - - - - - - +Widget buildContent() - +String getPowerLevelDescription() - +int getCountableObservationAmount() - - - - - - - - - - - - ReportSectionWidget - - - - - - +subject: StudySubject - - - - - - - - - - - void Function()? - - - - - - - - - - - - - AverageSectionWidget - - - - - - +section: AverageSection - +titlePos: List<int> - +phasePos: List<int> - - - - - - +Widget build() - +Widget getLegend() - +Widget getDiagram() - +BarChartData getChartData() - +Widget getTitles() - +Widget getValues() - +List<BarChartGroupData> getBarGroups() - +FlGridData getGridData() - +MaterialColor getColor() - +int getDayIndex() - +Iterable<DiagramDatum> getAggregatedData() - +Map<String, String?> getInterventionNames() - - - - - - - - - - - AverageSection - - - - - - - - - - - - DiagramDatum - - - - - - +x: num - +value: num - +timestamp: DateTime? - +intervention: String - - - - - - - - - - - - - LinearRegressionSectionWidget - - - - - - +section: LinearRegressionSection - - - - - - +Widget build() - - - - - - - - - - - LinearRegressionSection - - - - - - - - - - - - - ReportSectionContainer - - - - - - +section: ReportSection - +subject: StudySubject - +primary: bool - +onTap: void Function()? - - - - - - +ReportSectionWidget buildContents() - +dynamic () - +List<Widget> buildPrimaryHeader() - +Widget build() - - - - - - - - - - - ReportSection - - - - - - - - - - - - DisclaimerSection - - - - - - +Widget buildContent() - - - - - - - - - - - Settings - - - - - - - - - - - - - OptOutAlertDialog - - - - - - +subject: StudySubject? - - - - - - +Widget build() - - - - - - - - - - - - - DeleteAlertDialog - - - - - - +subject: StudySubject? - - - - - - +Widget build() - - - - - - - - - - - - FAQ - - - - - - +Widget build() - - - - - - - - - - - - Entry - - - - - - +title: String - +children: List<Entry> - - - - - - - - - - - - - EntryItem - - - - - - +entry: Entry - - - - - - -Widget _buildTiles() - +Widget build() - - - - - - - - - - - ContactScreen - - - - - - - - - - - - - ContactWidget - - - - - - +contact: Contact? - +title: String - +subtitle: String? - +color: Color - - - - - - +Widget build() - - - - - - - - - - - Contact - - - - - - - - - - - - - ContactItem - - - - - - +iconData: IconData - +itemName: String - +itemValue: String? - +type: ContactItemType? - +iconColor: Color? - - - - - - +dynamic launchContact() - +Widget build() - - - - - - - - - - - - ContactItemType - - - - - - +index: int - <static>+values: List<ContactItemType> - <static>+website: ContactItemType - <static>+email: ContactItemType - <static>+phone: ContactItemType - - - - - - - - - - - Enum - - - - - - - - - - - - DashboardScreen - - - - - - +error: String? - - - - - - - - - - - - OverflowMenuItem - - - - - - +name: String - +icon: IconData - +routeName: String? - +onTap: dynamic Function()? - - - - - - - - - - - dynamic Function()? - - - - - - - - - - - - - StudyFinishedPlaceholder - - - - - - <static>+space: SizedBox - - - - - - +Widget build() - - - - - - - - - - - SizedBox - - - - - - - - - - - - TaskOverview - - - - - - +subject: StudySubject? - +scheduleToday: List<TaskInstance>? - +interventionIcon: String? - - - - - - - - - - - - ProgressRow - - - - - - +subject: StudySubject? - - - - - - - - - - - - - InterventionSegment - - - - - - +intervention: Intervention - +percentCompleted: double - +percentMissed: double - +isCurrent: bool - +isFuture: bool - +phaseDuration: int - - - - - - +List<Widget> buildSeparators() - +Widget build() - - - - - - - - - - - - TaskBox - - - - - - +taskInstance: TaskInstance - +icon: Icon - +onCompleted: dynamic Function() - - - - - - - - - - - dynamic Function() - - - - - - - - - - - - - Routes - - - - - - <static>+loading: String - <static>+preview: String - <static>+appOutdated: String - <static>+dashboard: String - <static>+welcome: String - <static>+about: String - <static>+terms: String - <static>+studySelection: String - <static>+studyOverview: String - <static>+interventionSelection: String - <static>+journey: String - <static>+consent: String - <static>+kickoff: String - <static>+contact: String - <static>+faq: String - <static>+appSettings: String - <static>+questionnaire: String - <static>+reportHistory: String - <static>+reportDetails: String - <static>+performanceDetails: String - - - - - - <static>+Route<dynamic> unknownRoute() - <static>+Route<dynamic>? generateRoute() - - - - - - - - - - - - NotificationValidators - - - - - - +didNotificationLaunchApp: bool - +wasNotificationActionHandled: bool - +wasNotificationActionCompleted: bool - - - - - - - - - - - - - StudyNotifications - - - - - - +subject: StudySubject? - +flutterLocalNotificationsPlugin: FlutterLocalNotificationsPlugin - +context: BuildContext - +didReceiveLocalNotificationStream: StreamController<ReceivedNotification> - +selectNotificationStream: StreamController<String?> - <static>+validator: NotificationValidators - <static>+debug: bool - <static>+scheduledNotificationsDebug: String? - - - - - - <static>+dynamic create() - -dynamic _isAndroidPermissionGranted() - -dynamic _requestPermissions() - -void _configureDidReceiveLocalNotificationSubject() - -void _configureSelectNotificationSubject() - -void _initNotificationsPlugin() - +dynamic handleNotificationResponse() - - - - - - - - - - - FlutterLocalNotificationsPlugin - - - - - - - - - - - BuildContext - - - - - - - - - - - StreamController - - - - - - - - - - - - ReceivedNotification - - - - - - +id: int? - +title: String? - +body: String? - +payload: String? - - - - - - - - - - - - StudyNotification - - - - - - +taskInstance: TaskInstance - +date: DateTime - - - - - - - - - - - - - TemporaryStorageHandler - - - - - - <static>-_stagingBaseNamePrefix: String - <static>-_audioFileType: String - <static>-_imageFileType: String - -_userId: String - -_studyId: String - - - - - - -String _buildFileName() - <static>-dynamic _getMultimodalTempDirectory() - <static>-dynamic _getMultimodalUploadDirectory() - <static>+dynamic moveStagingFileToUploadDirectory() - <static>+dynamic getFutureBlobFiles() - +dynamic getStagingAudio() - +dynamic getStagingImage() - <static>+dynamic deleteAllStagingFiles() - - - - - - - - - - - - - GroupedIterable - - - - - - +data: Map<K, Iterable<V>> - +iterator: Iterator<MapEntry<K, Iterable<V>>> - - - - - - +Iterable<MapEntry<K, R>> aggregate() - +Iterable<MapEntry<K, R>> aggregateWithKey() - - - - - - - - - - - Iterable - - - - - - - - - - - - - Cache - - - - - - <static>+isSynchronizing: bool - - - - - - <static>+dynamic storeSubject() - <static>+dynamic loadSubject() - <static>+dynamic storeAnalytics() - <static>+dynamic loadAnalytics() - <static>+dynamic delete() - <static>+dynamic uploadBlobFiles() - <static>+dynamic synchronize() - - - - - - - - - - - - - AppAnalytics - - - - - - <static>-_userEnabled: bool? - <static>+keyAnalyticsUserEnable: String - +context: BuildContext - +subject: StudySubject? - <static>+isUserEnabled: dynamic - - - - - - <static>+dynamic init() - <static>+dynamic start() - <static>+void setEnabled() - +dynamic initBasic() - +void initAdvanced() - - - - - - - - - - - - ThemeConfig - - - - - - <static>+SliderThemeData coloredSliderTheme() - - - - - - - - - - - - ScaleQuestionWidget - - - - - - +question: ScaleQuestion - +onDone: dynamic Function(Answer<dynamic>)? - - - - - - - - - - - ScaleQuestion - - - - - - - - - - - dynamic Function(Answer<dynamic>)? - - - - - - - - - - - - QuestionWidget - - - - - - +subtitle: String? - - - - - - - - - - - - VisualAnalogueQuestionWidget - - - - - - +question: VisualAnalogueQuestion - +onDone: dynamic Function(Answer<dynamic>)? - - - - - - - - - - - VisualAnalogueQuestion - - - - - - - - - - - - AnnotatedScaleQuestionWidget - - - - - - +question: AnnotatedScaleQuestion - +onDone: dynamic Function(Answer<dynamic>)? - - - - - - - - - - - AnnotatedScaleQuestion - - - - - - - - - - - - BooleanQuestionWidget - - - - - - +question: BooleanQuestion - +onDone: dynamic Function(Answer<dynamic>)? - - - - - - - - - - - BooleanQuestion - - - - - - - - - - - - FreeTextQuestionWidget - - - - - - +question: FreeTextQuestion - +onDone: dynamic Function(Answer<dynamic>)? - - - - - - - - - - - FreeTextQuestion - - - - - - - - - - - - ChoiceQuestionWidget - - - - - - +question: ChoiceQuestion - +onDone: dynamic Function(Answer<dynamic>) - +multiSelectionText: String - +subtitle: String? - - - - - - - - - - - ChoiceQuestion - - - - - - - - - - - dynamic Function(Answer<dynamic>) - - - - - - - - - - - - AudioRecordingQuestionWidget - - - - - - +question: AudioRecordingQuestion - +onDone: dynamic Function(Answer<FutureBlobFile>)? - - - - - - - - - - - AudioRecordingQuestion - - - - - - - - - - - dynamic Function(Answer<FutureBlobFile>)? - - - - - - - - - - - - QuestionnaireWidget - - - - - - +title: String? - +header: String? - +footer: String? - +questions: List<Question<dynamic>> - - - - - - - - - - - - - HtmlTextBox - - - - - - +text: String? - - - - - - +Widget build() - - - - - - - - - - - - ImageCapturingQuestionWidget - - - - - - +question: ImageCapturingQuestion - +onDone: dynamic Function(Answer<FutureBlobFile>)? - - - - - - - - - - - ImageCapturingQuestion - - - - - - - - - - - - QuestionContainer - - - - - - +onDone: dynamic Function(Answer<dynamic>, int) - +question: Question<dynamic> - +index: int - - - - - - - - - - - dynamic Function(Answer<dynamic>, int) - - - - - - - - - - - Question - - - - - - - - - - - - - QuestionHeader - - - - - - +prompt: String? - +subtitle: String? - +rationale: String? - - - - - - -List<Widget> _buildSubtitle() - -List<Widget> _buildRationaleButton() - +Widget build() - - - - - - - - - - - - - CustomSlider - - - - - - +value: double? - +minValue: double? - +maxValue: double? - +minorTick: int? - +onChanged: dynamic Function(double)? - +onChangeEnd: dynamic Function(double)? - +activeColor: Color? - +inactiveColor: Color? - +minColor: Color? - +maxColor: Color? - +thumbColor: Color? - +isColored: bool - +labelValuePrecision: int - +tickValuePrecision: int - +linearStep: bool - +steps: AnnotatedScaleQuestion? - - - - - - +Widget build() - - - - - - - - - - - dynamic Function(double)? - - - - - - - - - - - - CustomTrackShape - - - - - - +Rect getPreferredRect() - - - - - - - - - - - RoundedRectSliderTrackShape - - - - - - - - - - - - - BottomOnboardingNavigation - - - - - - +onBack: void Function()? - +onNext: void Function()? - +backLabel: String? - +nextLabel: String? - +hideNext: bool - +nextIcon: Icon? - +backIcon: Icon? - +progress: Widget? - - - - - - +Widget build() - - - - - - - - - - - - - InterventionCard - - - - - - +intervention: Intervention - +selected: bool - +showCheckbox: bool - +showTasks: bool - +showDescription: bool - +onTap: dynamic Function()? - - - - - - +Widget build() - - - - - - - - - - - - - InterventionCardTitle - - - - - - +intervention: Intervention? - +selected: bool - +showCheckbox: bool - +showDescriptionButton: bool - +onTap: dynamic Function()? - - - - - - +Widget build() - - - - - - - - - - - - - InterventionCardDescription - - - - - - +intervention: Intervention - - - - - - +Widget build() - - - - - - - - - - - - - _TaskList - - - - - - +tasks: List<InterventionTask> - - - - - - +String scheduleString() - +Widget build() - - - - - - - - - - - - - StudyTile - - - - - - +title: String? - +description: String? - +iconName: String - +onTap: dynamic Function()? - +contentPadding: EdgeInsetsGeometry - - - - - - +Widget build() - - - - - - - - - - - EdgeInsetsGeometry - - - - - - - - - - - - - RoundCheckbox - - - - - - +onChanged: dynamic Function(bool)? - +value: bool? - - - - - - +Widget build() - - - - - - - - - - - dynamic Function(bool)? - - - - - - - - - - - - - SelectableButton - - - - - - +child: Widget - +selected: bool - +onTap: dynamic Function()? - - - - - - -Color _getFillColor() - -Color _getTextColor() - +Widget build() - - - - - - - - - - - - - HtmlText - - - - - - +text: String? - +style: TextStyle? - +centered: bool - - - - - - +Widget build() - - - - - - - - - - - TextStyle - - - - - - - - - - - - MyApp - - - - - - +queryParameters: Map<String, String> - +appConfig: AppConfig? - +initialRoute: String - - - - - - - - - - - AppConfig - - - - - - - - - \ No newline at end of file diff --git a/docs/uml/app/lib/util/uml.svg b/docs/uml/app/lib/util/uml.svg deleted file mode 100644 index d4be4e904..000000000 --- a/docs/uml/app/lib/util/uml.svg +++ /dev/null @@ -1,448 +0,0 @@ - - [NotificationValidators - | - +didNotificationLaunchApp: bool; - +wasNotificationActionHandled: bool; - +wasNotificationActionCompleted: bool - ] - - [StudyNotifications - | - +subject: StudySubject?; - +flutterLocalNotificationsPlugin: FlutterLocalNotificationsPlugin; - +context: BuildContext; - +didReceiveLocalNotificationStream: StreamController<ReceivedNotification>; - +selectNotificationStream: StreamController<String?>; - <static>+validator: NotificationValidators; - <static>+debug: bool; - <static>+scheduledNotificationsDebug: String? - | - <static>+dynamic create(); - -dynamic _isAndroidPermissionGranted(); - -dynamic _requestPermissions(); - -void _configureDidReceiveLocalNotificationSubject(); - -void _configureSelectNotificationSubject(); - -void _initNotificationsPlugin(); - +dynamic handleNotificationResponse() - ] - - [StudyNotifications]o-[StudySubject] - [StudyNotifications]o-[FlutterLocalNotificationsPlugin] - [StudyNotifications]o-[<abstract>BuildContext] - [StudyNotifications]o-[StreamController] - [StudyNotifications]o-[NotificationValidators] - - [ReceivedNotification - | - +id: int?; - +title: String?; - +body: String?; - +payload: String? - ] - - [StudyNotification - | - +taskInstance: TaskInstance; - +date: DateTime - ] - - [StudyNotification]o-[TaskInstance] - - [TemporaryStorageHandler - | - <static>-_stagingBaseNamePrefix: String; - <static>-_audioFileType: String; - <static>-_imageFileType: String; - -_userId: String; - -_studyId: String - | - -String _buildFileName(); - <static>-dynamic _getMultimodalTempDirectory(); - <static>-dynamic _getMultimodalUploadDirectory(); - <static>+dynamic moveStagingFileToUploadDirectory(); - <static>+dynamic getFutureBlobFiles(); - +dynamic getStagingAudio(); - +dynamic getStagingImage(); - <static>+dynamic deleteAllStagingFiles() - ] - - [GroupedIterable - | - +data: Map<K, Iterable<V>>; - +iterator: Iterator<MapEntry<K, Iterable<V>>> - | - +Iterable<MapEntry<K, R>> aggregate(); - +Iterable<MapEntry<K, R>> aggregateWithKey() - ] - - [Iterable]<:-[GroupedIterable] - - [Cache - | - <static>+isSynchronizing: bool - | - <static>+dynamic storeSubject(); - <static>+dynamic loadSubject(); - <static>+dynamic storeAnalytics(); - <static>+dynamic loadAnalytics(); - <static>+dynamic delete(); - <static>+dynamic uploadBlobFiles(); - <static>+dynamic synchronize() - ] - - [AppAnalytics - | - <static>-_userEnabled: bool?; - <static>+keyAnalyticsUserEnable: String; - +context: BuildContext; - +subject: StudySubject?; - <static>+isUserEnabled: dynamic - | - <static>+dynamic init(); - <static>+dynamic start(); - <static>+void setEnabled(); - +dynamic initBasic(); - +void initAdvanced() - ] - - [AppAnalytics]o-[<abstract>BuildContext] - [AppAnalytics]o-[StudySubject] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - NotificationValidators - - - - - - +didNotificationLaunchApp: bool - +wasNotificationActionHandled: bool - +wasNotificationActionCompleted: bool - - - - - - - - - - - - - StudyNotifications - - - - - - +subject: StudySubject? - +flutterLocalNotificationsPlugin: FlutterLocalNotificationsPlugin - +context: BuildContext - +didReceiveLocalNotificationStream: StreamController<ReceivedNotification> - +selectNotificationStream: StreamController<String?> - <static>+validator: NotificationValidators - <static>+debug: bool - <static>+scheduledNotificationsDebug: String? - - - - - - <static>+dynamic create() - -dynamic _isAndroidPermissionGranted() - -dynamic _requestPermissions() - -void _configureDidReceiveLocalNotificationSubject() - -void _configureSelectNotificationSubject() - -void _initNotificationsPlugin() - +dynamic handleNotificationResponse() - - - - - - - - - - - StudySubject - - - - - - - - - - - FlutterLocalNotificationsPlugin - - - - - - - - - - - BuildContext - - - - - - - - - - - StreamController - - - - - - - - - - - - ReceivedNotification - - - - - - +id: int? - +title: String? - +body: String? - +payload: String? - - - - - - - - - - - - StudyNotification - - - - - - +taskInstance: TaskInstance - +date: DateTime - - - - - - - - - - - TaskInstance - - - - - - - - - - - - - TemporaryStorageHandler - - - - - - <static>-_stagingBaseNamePrefix: String - <static>-_audioFileType: String - <static>-_imageFileType: String - -_userId: String - -_studyId: String - - - - - - -String _buildFileName() - <static>-dynamic _getMultimodalTempDirectory() - <static>-dynamic _getMultimodalUploadDirectory() - <static>+dynamic moveStagingFileToUploadDirectory() - <static>+dynamic getFutureBlobFiles() - +dynamic getStagingAudio() - +dynamic getStagingImage() - <static>+dynamic deleteAllStagingFiles() - - - - - - - - - - - - - GroupedIterable - - - - - - +data: Map<K, Iterable<V>> - +iterator: Iterator<MapEntry<K, Iterable<V>>> - - - - - - +Iterable<MapEntry<K, R>> aggregate() - +Iterable<MapEntry<K, R>> aggregateWithKey() - - - - - - - - - - - Iterable - - - - - - - - - - - - - Cache - - - - - - <static>+isSynchronizing: bool - - - - - - <static>+dynamic storeSubject() - <static>+dynamic loadSubject() - <static>+dynamic storeAnalytics() - <static>+dynamic loadAnalytics() - <static>+dynamic delete() - <static>+dynamic uploadBlobFiles() - <static>+dynamic synchronize() - - - - - - - - - - - - - AppAnalytics - - - - - - <static>-_userEnabled: bool? - <static>+keyAnalyticsUserEnable: String - +context: BuildContext - +subject: StudySubject? - <static>+isUserEnabled: dynamic - - - - - - <static>+dynamic init() - <static>+dynamic start() - <static>+void setEnabled() - +dynamic initBasic() - +void initAdvanced() - - - - - - - - - \ No newline at end of file diff --git a/docs/uml/designer_v2/lib/features/design/shared/questionnaire/question/uml.svg b/docs/uml/designer_v2/lib/features/design/shared/questionnaire/question/uml.svg deleted file mode 100644 index 557598554..000000000 --- a/docs/uml/designer_v2/lib/features/design/shared/questionnaire/question/uml.svg +++ /dev/null @@ -1,1066 +0,0 @@ - - [<abstract>QuestionFormData - | - <static>+questionTypeFormDataFactories: Map<SurveyQuestionType, QuestionFormData Function(Question<dynamic>, List<EligibilityCriterion>)>; - +questionId: String; - +questionText: String; - +questionInfoText: String?; - +questionType: SurveyQuestionType; - +responseOptionsValidity: Map<dynamic, bool>; - +responseOptions: List<dynamic>; - +id: String - | - +Question<dynamic> toQuestion(); - +EligibilityCriterion toEligibilityCriterion(); - +Answer<dynamic> constructAnswerFor(); - +dynamic setResponseOptionsValidityFrom(); - +QuestionFormData copy() - ] - - [<abstract>QuestionFormData]o-[SurveyQuestionType] - [<abstract>IFormData]<:--[<abstract>QuestionFormData] - - [ChoiceQuestionFormData - | - +isMultipleChoice: bool; - +answerOptions: List<String>; - +responseOptions: List<String> - | - +Question<dynamic> toQuestion(); - +QuestionFormData copy(); - -Choice _buildChoiceForValue(); - +Answer<dynamic> constructAnswerFor() - ] - - [<abstract>QuestionFormData]<:-[ChoiceQuestionFormData] - - [BoolQuestionFormData - | - <static>+kResponseOptions: Map<String, bool>; - +responseOptions: List<String> - | - +Question<dynamic> toQuestion(); - +BoolQuestionFormData copy(); - +Answer<dynamic> constructAnswerFor() - ] - - [<abstract>QuestionFormData]<:-[BoolQuestionFormData] - - [ImageQuestionFormData - | - <static>+kResponseOptions: Map<String, FutureBlobFile>; - +responseOptions: List<String> - | - +Question<dynamic> toQuestion(); - +ImageQuestionFormData copy(); - +Answer<dynamic> constructAnswerFor() - ] - - [<abstract>QuestionFormData]<:-[ImageQuestionFormData] - - [AudioQuestionFormData - | - +maxRecordingDurationSeconds: int; - <static>+kResponseOptions: Map<String, FutureBlobFile>; - +responseOptions: List<String> - | - +Question<dynamic> toQuestion(); - +AudioQuestionFormData copy(); - +Answer<dynamic> constructAnswerFor() - ] - - [<abstract>QuestionFormData]<:-[AudioQuestionFormData] - - [ScaleQuestionFormData - | - +minValue: double; - +maxValue: double; - +minLabel: String?; - +maxLabel: String?; - +midValues: List<double?>; - +midLabels: List<String?>; - +stepSize: double; - +initialValue: double?; - +minColor: Color?; - +maxColor: Color?; - +responseOptions: List<double>; - +midAnnotations: List<Annotation> - | - +ScaleQuestion toQuestion(); - +QuestionFormData copy(); - +Answer<dynamic> constructAnswerFor() - ] - - [ScaleQuestionFormData]o-[Color] - [<abstract>QuestionFormData]<:-[ScaleQuestionFormData] - - [FreeTextQuestionFormData - | - +textLengthRange: List<int>; - +textType: FreeTextQuestionType; - +textTypeExpression: String?; - +responseOptions: List<String> - | - +Question<dynamic> toQuestion(); - +FreeTextQuestionFormData copy(); - +Answer<dynamic> constructAnswerFor() - ] - - [FreeTextQuestionFormData]o-[FreeTextQuestionType] - [<abstract>QuestionFormData]<:-[FreeTextQuestionFormData] - - [AudioRecordingQuestionFormView - | - +formViewModel: QuestionFormViewModel - | - +Widget build() - ] - - [AudioRecordingQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[AudioRecordingQuestionFormView] - - [FreeTextQuestionFormView - | - +formViewModel: QuestionFormViewModel; - +generateLabelHelpTextMap: dynamic - | - +Widget build(); - +Widget disableOnReadonly(); - +Widget generateRow() - ] - - [FreeTextQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[FreeTextQuestionFormView] - - [SurveyQuestionType - | - +index: int; - <static>+values: List<SurveyQuestionType>; - <static>+choice: SurveyQuestionType; - <static>+bool: SurveyQuestionType; - <static>+scale: SurveyQuestionType; - <static>+image: SurveyQuestionType; - <static>+audio: SurveyQuestionType; - <static>+freeText: SurveyQuestionType - ] - - [SurveyQuestionType]o-[SurveyQuestionType] - [Enum]<:--[SurveyQuestionType] - - [ImageCapturingQuestionFormView - | - +formViewModel: QuestionFormViewModel - | - +Widget build() - ] - - [ImageCapturingQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[ImageCapturingQuestionFormView] - - [<abstract>IScaleQuestionFormViewModel - | - +isMidValuesClearedInfoVisible: bool - ] - - [ScaleQuestionFormView - | - +formViewModel: QuestionFormViewModel - ] - - [ScaleQuestionFormView]o-[QuestionFormViewModel] - - [ChoiceQuestionFormView - | - +formViewModel: QuestionFormViewModel - | - +Widget build() - ] - - [ChoiceQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[ChoiceQuestionFormView] - - [BoolQuestionFormView - | - +formViewModel: QuestionFormViewModel - | - +Widget build() - ] - - [BoolQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[BoolQuestionFormView] - - [QuestionFormViewModel - | - <static>+defaultQuestionType: SurveyQuestionType; - -_titles: Map<FormMode, String Function()>?; - +questionIdControl: FormControl<String>; - +questionTypeControl: FormControl<SurveyQuestionType>; - +questionTextControl: FormControl<String>; - +questionInfoTextControl: FormControl<String>; - +questionBaseControls: Map<String, AbstractControl<dynamic>>; - +isMultipleChoiceControl: FormControl<bool>; - +choiceResponseOptionsArray: FormArray<dynamic>; - +customOptionsMin: int; - +customOptionsMax: int; - +customOptionsInitial: int; - +boolResponseOptionsArray: FormArray<String>; - +imageResponseOptionsArray: FormArray<String>; - <static>+kDefaultMaxRecordingDurationSeconds: int; - <static>+kMaxRecordingDurationSeconds: int; - +audioResponseOptionsArray: FormArray<String>; - +maxRecordingDurationSecondsControl: FormControl<int>; - <static>+kDefaultScaleMinValue: int; - <static>+kDefaultScaleMaxValue: int; - <static>+kNumMidValueControls: int; - <static>+kMidValueDebounceMilliseconds: int; - +scaleMinValueControl: FormControl<int>; - +scaleMaxValueControl: FormControl<int>; - -_scaleRangeControl: FormControl<int>; - +scaleMinLabelControl: FormControl<String>; - +scaleMaxLabelControl: FormControl<String>; - +scaleMidValueControls: FormArray<int>; - +scaleMidLabelControls: FormArray<String?>; - -_scaleResponseOptionsArray: FormArray<int>; - +scaleMinColorControl: FormControl<SerializableColor>; - +scaleMaxColorControl: FormControl<SerializableColor>; - +prevMidValues: List<int?>?; - +freeTextTypeControl: FormControl<FreeTextQuestionType>; - +customRegexControl: FormControl<String>; - +freeTextResponseOptionsArray: FormArray<dynamic>; - +freeTextLengthMin: AbstractControl<int>; - +freeTextLengthMax: AbstractControl<int>; - +freeTextExampleTextControl: FormControl<String>; - <static>+kDefaultFreeTextMinLength: int; - <static>+kDefaultFreeTextMaxLength: int; - +freeTextLengthControl: FormControl<RangeValues>; - -_controlsByQuestionType: Map<SurveyQuestionType, FormGroup>; - -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - -_validationConfigsByQuestionType: Map<SurveyQuestionType, Map<FormValidationSetEnum, List<FormControlValidation>>>; - +form: FormGroup; - +questionId: String; - +questionType: SurveyQuestionType; - +questionTypeControlOptions: List<FormControlOption<SurveyQuestionType>>; - +answerOptionsArray: FormArray<dynamic>; - +answerOptionsControls: List<AbstractControl<dynamic>>; - +validAnswerOptions: List<String>; - +boolOptions: List<AbstractControl<String>>; - +imageOptions: List<AbstractControl<String>>; - +audioOptions: List<AbstractControl<String>>; - +scaleMinValue: int; - +scaleMaxValue: int; - +scaleRange: int; - +scaleAllValueControls: List<AbstractControl<int>>; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +questionTextRequired: dynamic; - +numValidChoiceOptions: dynamic; - +scaleRangeValid: dynamic; - +maxRecordingDurationValid: dynamic; - +titles: Map<FormMode, String>; - +isAddOptionButtonVisible: bool; - +isMidValuesClearedInfoVisible: bool - | - +String? scaleMidLabelAt(); - -dynamic _onScaleRangeChanged(); - -dynamic _applyInputFormatters(); - -dynamic _updateScaleMidValueControls(); - -Map<String, dynamic>? _validateFreeText(); - -dynamic _onFreeTextLengthChanged(); - -List<FormControlValidation> _getValidationConfig(); - +dynamic onQuestionTypeChanged(); - +dynamic onResponseOptionsChanged(); - -void _updateFormControls(); - +void initControls(); - +void setControlsFrom(); - +QuestionFormData buildFormData(); - +List<ModelAction<dynamic>> availableActions(); - +void onNewItem(); - +void onSelectItem(); - +dynamic save(); - +QuestionFormViewModel createDuplicate() - ] - - [QuestionFormViewModel]o-[SurveyQuestionType] - [QuestionFormViewModel]o-[FormControl] - [QuestionFormViewModel]o-[FormArray] - [QuestionFormViewModel]o-[<abstract>AbstractControl] - [QuestionFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[QuestionFormViewModel] - [<abstract>IListActionProvider]<:--[QuestionFormViewModel] - - [SurveyQuestionFormView - | - +formViewModel: QuestionFormViewModel; - +isHtmlStyleable: bool - ] - - [SurveyQuestionFormView]o-[QuestionFormViewModel] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - QuestionFormData - - - - - - <static>+questionTypeFormDataFactories: Map<SurveyQuestionType, QuestionFormData Function(Question<dynamic>, List<EligibilityCriterion>)> - +questionId: String - +questionText: String - +questionInfoText: String? - +questionType: SurveyQuestionType - +responseOptionsValidity: Map<dynamic, bool> - +responseOptions: List<dynamic> - +id: String - - - - - - +Question<dynamic> toQuestion() - +EligibilityCriterion toEligibilityCriterion() - +Answer<dynamic> constructAnswerFor() - +dynamic setResponseOptionsValidityFrom() - +QuestionFormData copy() - - - - - - - - - - - - SurveyQuestionType - - - - - - +index: int - <static>+values: List<SurveyQuestionType> - <static>+choice: SurveyQuestionType - <static>+bool: SurveyQuestionType - <static>+scale: SurveyQuestionType - <static>+image: SurveyQuestionType - <static>+audio: SurveyQuestionType - <static>+freeText: SurveyQuestionType - - - - - - - - - - - IFormData - - - - - - - - - - - - - ChoiceQuestionFormData - - - - - - +isMultipleChoice: bool - +answerOptions: List<String> - +responseOptions: List<String> - - - - - - +Question<dynamic> toQuestion() - +QuestionFormData copy() - -Choice _buildChoiceForValue() - +Answer<dynamic> constructAnswerFor() - - - - - - - - - - - - - BoolQuestionFormData - - - - - - <static>+kResponseOptions: Map<String, bool> - +responseOptions: List<String> - - - - - - +Question<dynamic> toQuestion() - +BoolQuestionFormData copy() - +Answer<dynamic> constructAnswerFor() - - - - - - - - - - - - - ImageQuestionFormData - - - - - - <static>+kResponseOptions: Map<String, FutureBlobFile> - +responseOptions: List<String> - - - - - - +Question<dynamic> toQuestion() - +ImageQuestionFormData copy() - +Answer<dynamic> constructAnswerFor() - - - - - - - - - - - - - AudioQuestionFormData - - - - - - +maxRecordingDurationSeconds: int - <static>+kResponseOptions: Map<String, FutureBlobFile> - +responseOptions: List<String> - - - - - - +Question<dynamic> toQuestion() - +AudioQuestionFormData copy() - +Answer<dynamic> constructAnswerFor() - - - - - - - - - - - - - ScaleQuestionFormData - - - - - - +minValue: double - +maxValue: double - +minLabel: String? - +maxLabel: String? - +midValues: List<double?> - +midLabels: List<String?> - +stepSize: double - +initialValue: double? - +minColor: Color? - +maxColor: Color? - +responseOptions: List<double> - +midAnnotations: List<Annotation> - - - - - - +ScaleQuestion toQuestion() - +QuestionFormData copy() - +Answer<dynamic> constructAnswerFor() - - - - - - - - - - - Color - - - - - - - - - - - - - FreeTextQuestionFormData - - - - - - +textLengthRange: List<int> - +textType: FreeTextQuestionType - +textTypeExpression: String? - +responseOptions: List<String> - - - - - - +Question<dynamic> toQuestion() - +FreeTextQuestionFormData copy() - +Answer<dynamic> constructAnswerFor() - - - - - - - - - - - FreeTextQuestionType - - - - - - - - - - - - - AudioRecordingQuestionFormView - - - - - - +formViewModel: QuestionFormViewModel - - - - - - +Widget build() - - - - - - - - - - - - - QuestionFormViewModel - - - - - - <static>+defaultQuestionType: SurveyQuestionType - -_titles: Map<FormMode, String Function()>? - +questionIdControl: FormControl<String> - +questionTypeControl: FormControl<SurveyQuestionType> - +questionTextControl: FormControl<String> - +questionInfoTextControl: FormControl<String> - +questionBaseControls: Map<String, AbstractControl<dynamic>> - +isMultipleChoiceControl: FormControl<bool> - +choiceResponseOptionsArray: FormArray<dynamic> - +customOptionsMin: int - +customOptionsMax: int - +customOptionsInitial: int - +boolResponseOptionsArray: FormArray<String> - +imageResponseOptionsArray: FormArray<String> - <static>+kDefaultMaxRecordingDurationSeconds: int - <static>+kMaxRecordingDurationSeconds: int - +audioResponseOptionsArray: FormArray<String> - +maxRecordingDurationSecondsControl: FormControl<int> - <static>+kDefaultScaleMinValue: int - <static>+kDefaultScaleMaxValue: int - <static>+kNumMidValueControls: int - <static>+kMidValueDebounceMilliseconds: int - +scaleMinValueControl: FormControl<int> - +scaleMaxValueControl: FormControl<int> - -_scaleRangeControl: FormControl<int> - +scaleMinLabelControl: FormControl<String> - +scaleMaxLabelControl: FormControl<String> - +scaleMidValueControls: FormArray<int> - +scaleMidLabelControls: FormArray<String?> - -_scaleResponseOptionsArray: FormArray<int> - +scaleMinColorControl: FormControl<SerializableColor> - +scaleMaxColorControl: FormControl<SerializableColor> - +prevMidValues: List<int?>? - +freeTextTypeControl: FormControl<FreeTextQuestionType> - +customRegexControl: FormControl<String> - +freeTextResponseOptionsArray: FormArray<dynamic> - +freeTextLengthMin: AbstractControl<int> - +freeTextLengthMax: AbstractControl<int> - +freeTextExampleTextControl: FormControl<String> - <static>+kDefaultFreeTextMinLength: int - <static>+kDefaultFreeTextMaxLength: int - +freeTextLengthControl: FormControl<RangeValues> - -_controlsByQuestionType: Map<SurveyQuestionType, FormGroup> - -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - -_validationConfigsByQuestionType: Map<SurveyQuestionType, Map<FormValidationSetEnum, List<FormControlValidation>>> - +form: FormGroup - +questionId: String - +questionType: SurveyQuestionType - +questionTypeControlOptions: List<FormControlOption<SurveyQuestionType>> - +answerOptionsArray: FormArray<dynamic> - +answerOptionsControls: List<AbstractControl<dynamic>> - +validAnswerOptions: List<String> - +boolOptions: List<AbstractControl<String>> - +imageOptions: List<AbstractControl<String>> - +audioOptions: List<AbstractControl<String>> - +scaleMinValue: int - +scaleMaxValue: int - +scaleRange: int - +scaleAllValueControls: List<AbstractControl<int>> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +questionTextRequired: dynamic - +numValidChoiceOptions: dynamic - +scaleRangeValid: dynamic - +maxRecordingDurationValid: dynamic - +titles: Map<FormMode, String> - +isAddOptionButtonVisible: bool - +isMidValuesClearedInfoVisible: bool - - - - - - +String? scaleMidLabelAt() - -dynamic _onScaleRangeChanged() - -dynamic _applyInputFormatters() - -dynamic _updateScaleMidValueControls() - -Map<String, dynamic>? _validateFreeText() - -dynamic _onFreeTextLengthChanged() - -List<FormControlValidation> _getValidationConfig() - +dynamic onQuestionTypeChanged() - +dynamic onResponseOptionsChanged() - -void _updateFormControls() - +void initControls() - +void setControlsFrom() - +QuestionFormData buildFormData() - +List<ModelAction<dynamic>> availableActions() - +void onNewItem() - +void onSelectItem() - +dynamic save() - +QuestionFormViewModel createDuplicate() - - - - - - - - - - - ConsumerWidget - - - - - - - - - - - - - FreeTextQuestionFormView - - - - - - +formViewModel: QuestionFormViewModel - +generateLabelHelpTextMap: dynamic - - - - - - +Widget build() - +Widget disableOnReadonly() - +Widget generateRow() - - - - - - - - - - - Enum - - - - - - - - - - - - - ImageCapturingQuestionFormView - - - - - - +formViewModel: QuestionFormViewModel - - - - - - +Widget build() - - - - - - - - - - - - IScaleQuestionFormViewModel - - - - - - +isMidValuesClearedInfoVisible: bool - - - - - - - - - - - - ScaleQuestionFormView - - - - - - +formViewModel: QuestionFormViewModel - - - - - - - - - - - - - ChoiceQuestionFormView - - - - - - +formViewModel: QuestionFormViewModel - - - - - - +Widget build() - - - - - - - - - - - - - BoolQuestionFormView - - - - - - +formViewModel: QuestionFormViewModel - - - - - - +Widget build() - - - - - - - - - - - FormControl - - - - - - - - - - - FormArray - - - - - - - - - - - AbstractControl - - - - - - - - - - - FormGroup - - - - - - - - - - - ManagedFormViewModel - - - - - - - - - - - IListActionProvider - - - - - - - - - - - - SurveyQuestionFormView - - - - - - +formViewModel: QuestionFormViewModel - +isHtmlStyleable: bool - - - - - - - - - \ No newline at end of file diff --git a/docs/uml/designer_v2/lib/features/design/shared/questionnaire/uml.svg b/docs/uml/designer_v2/lib/features/design/shared/questionnaire/uml.svg deleted file mode 100644 index c2db0b180..000000000 --- a/docs/uml/designer_v2/lib/features/design/shared/questionnaire/uml.svg +++ /dev/null @@ -1,1218 +0,0 @@ - - [<abstract>WithQuestionnaireControls - | - +questionsArray: FormArray<dynamic>; - +questionFormViewModels: FormViewModelCollection<Q, QuestionFormData>; - +questionnaireControls: Map<String, FormArray<dynamic>>; - +propagateOnSave: bool; - +questionModels: List<Q>; - +questionTitles: Map<FormMode, String Function()> - | - +void setQuestionnaireControlsFrom(); - +QuestionnaireFormData buildQuestionnaireFormData(); - +void read(); - +void onCancel(); - +dynamic onSave(); - +Q provide(); - +Q provideQuestionFormViewModel() - ] - - [<abstract>WithQuestionnaireControls]o-[FormArray] - [<abstract>WithQuestionnaireControls]o-[FormViewModelCollection] - [<abstract>IFormViewModelDelegate]<:--[<abstract>WithQuestionnaireControls] - [<abstract>IProviderArgsResolver]<:--[<abstract>WithQuestionnaireControls] - - [QuestionnaireFormData - | - +questionsData: List<QuestionFormData>?; - +id: String - | - +StudyUQuestionnaire toQuestionnaire(); - +List<EligibilityCriterion> toEligibilityCriteria(); - +QuestionnaireFormData copy() - ] - - [<abstract>IFormData]<:--[QuestionnaireFormData] - - [<abstract>QuestionFormData - | - <static>+questionTypeFormDataFactories: Map<SurveyQuestionType, QuestionFormData Function(Question<dynamic>, List<EligibilityCriterion>)>; - +questionId: String; - +questionText: String; - +questionInfoText: String?; - +questionType: SurveyQuestionType; - +responseOptionsValidity: Map<dynamic, bool>; - +responseOptions: List<dynamic>; - +id: String - | - +Question<dynamic> toQuestion(); - +EligibilityCriterion toEligibilityCriterion(); - +Answer<dynamic> constructAnswerFor(); - +dynamic setResponseOptionsValidityFrom(); - +QuestionFormData copy() - ] - - [<abstract>QuestionFormData]o-[SurveyQuestionType] - [<abstract>IFormData]<:--[<abstract>QuestionFormData] - - [ChoiceQuestionFormData - | - +isMultipleChoice: bool; - +answerOptions: List<String>; - +responseOptions: List<String> - | - +Question<dynamic> toQuestion(); - +QuestionFormData copy(); - -Choice _buildChoiceForValue(); - +Answer<dynamic> constructAnswerFor() - ] - - [<abstract>QuestionFormData]<:-[ChoiceQuestionFormData] - - [BoolQuestionFormData - | - <static>+kResponseOptions: Map<String, bool>; - +responseOptions: List<String> - | - +Question<dynamic> toQuestion(); - +BoolQuestionFormData copy(); - +Answer<dynamic> constructAnswerFor() - ] - - [<abstract>QuestionFormData]<:-[BoolQuestionFormData] - - [ImageQuestionFormData - | - <static>+kResponseOptions: Map<String, FutureBlobFile>; - +responseOptions: List<String> - | - +Question<dynamic> toQuestion(); - +ImageQuestionFormData copy(); - +Answer<dynamic> constructAnswerFor() - ] - - [<abstract>QuestionFormData]<:-[ImageQuestionFormData] - - [AudioQuestionFormData - | - +maxRecordingDurationSeconds: int; - <static>+kResponseOptions: Map<String, FutureBlobFile>; - +responseOptions: List<String> - | - +Question<dynamic> toQuestion(); - +AudioQuestionFormData copy(); - +Answer<dynamic> constructAnswerFor() - ] - - [<abstract>QuestionFormData]<:-[AudioQuestionFormData] - - [ScaleQuestionFormData - | - +minValue: double; - +maxValue: double; - +minLabel: String?; - +maxLabel: String?; - +midValues: List<double?>; - +midLabels: List<String?>; - +stepSize: double; - +initialValue: double?; - +minColor: Color?; - +maxColor: Color?; - +responseOptions: List<double>; - +midAnnotations: List<Annotation> - | - +ScaleQuestion toQuestion(); - +QuestionFormData copy(); - +Answer<dynamic> constructAnswerFor() - ] - - [ScaleQuestionFormData]o-[Color] - [<abstract>QuestionFormData]<:-[ScaleQuestionFormData] - - [FreeTextQuestionFormData - | - +textLengthRange: List<int>; - +textType: FreeTextQuestionType; - +textTypeExpression: String?; - +responseOptions: List<String> - | - +Question<dynamic> toQuestion(); - +FreeTextQuestionFormData copy(); - +Answer<dynamic> constructAnswerFor() - ] - - [FreeTextQuestionFormData]o-[FreeTextQuestionType] - [<abstract>QuestionFormData]<:-[FreeTextQuestionFormData] - - [AudioRecordingQuestionFormView - | - +formViewModel: QuestionFormViewModel - | - +Widget build() - ] - - [AudioRecordingQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[AudioRecordingQuestionFormView] - - [FreeTextQuestionFormView - | - +formViewModel: QuestionFormViewModel; - +generateLabelHelpTextMap: dynamic - | - +Widget build(); - +Widget disableOnReadonly(); - +Widget generateRow() - ] - - [FreeTextQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[FreeTextQuestionFormView] - - [SurveyQuestionType - | - +index: int; - <static>+values: List<SurveyQuestionType>; - <static>+choice: SurveyQuestionType; - <static>+bool: SurveyQuestionType; - <static>+scale: SurveyQuestionType; - <static>+image: SurveyQuestionType; - <static>+audio: SurveyQuestionType; - <static>+freeText: SurveyQuestionType - ] - - [SurveyQuestionType]o-[SurveyQuestionType] - [Enum]<:--[SurveyQuestionType] - - [ImageCapturingQuestionFormView - | - +formViewModel: QuestionFormViewModel - | - +Widget build() - ] - - [ImageCapturingQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[ImageCapturingQuestionFormView] - - [<abstract>IScaleQuestionFormViewModel - | - +isMidValuesClearedInfoVisible: bool - ] - - [ScaleQuestionFormView - | - +formViewModel: QuestionFormViewModel - ] - - [ScaleQuestionFormView]o-[QuestionFormViewModel] - - [ChoiceQuestionFormView - | - +formViewModel: QuestionFormViewModel - | - +Widget build() - ] - - [ChoiceQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[ChoiceQuestionFormView] - - [BoolQuestionFormView - | - +formViewModel: QuestionFormViewModel - | - +Widget build() - ] - - [BoolQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[BoolQuestionFormView] - - [QuestionFormViewModel - | - <static>+defaultQuestionType: SurveyQuestionType; - -_titles: Map<FormMode, String Function()>?; - +questionIdControl: FormControl<String>; - +questionTypeControl: FormControl<SurveyQuestionType>; - +questionTextControl: FormControl<String>; - +questionInfoTextControl: FormControl<String>; - +questionBaseControls: Map<String, AbstractControl<dynamic>>; - +isMultipleChoiceControl: FormControl<bool>; - +choiceResponseOptionsArray: FormArray<dynamic>; - +customOptionsMin: int; - +customOptionsMax: int; - +customOptionsInitial: int; - +boolResponseOptionsArray: FormArray<String>; - +imageResponseOptionsArray: FormArray<String>; - <static>+kDefaultMaxRecordingDurationSeconds: int; - <static>+kMaxRecordingDurationSeconds: int; - +audioResponseOptionsArray: FormArray<String>; - +maxRecordingDurationSecondsControl: FormControl<int>; - <static>+kDefaultScaleMinValue: int; - <static>+kDefaultScaleMaxValue: int; - <static>+kNumMidValueControls: int; - <static>+kMidValueDebounceMilliseconds: int; - +scaleMinValueControl: FormControl<int>; - +scaleMaxValueControl: FormControl<int>; - -_scaleRangeControl: FormControl<int>; - +scaleMinLabelControl: FormControl<String>; - +scaleMaxLabelControl: FormControl<String>; - +scaleMidValueControls: FormArray<int>; - +scaleMidLabelControls: FormArray<String?>; - -_scaleResponseOptionsArray: FormArray<int>; - +scaleMinColorControl: FormControl<SerializableColor>; - +scaleMaxColorControl: FormControl<SerializableColor>; - +prevMidValues: List<int?>?; - +freeTextTypeControl: FormControl<FreeTextQuestionType>; - +customRegexControl: FormControl<String>; - +freeTextResponseOptionsArray: FormArray<dynamic>; - +freeTextLengthMin: AbstractControl<int>; - +freeTextLengthMax: AbstractControl<int>; - +freeTextExampleTextControl: FormControl<String>; - <static>+kDefaultFreeTextMinLength: int; - <static>+kDefaultFreeTextMaxLength: int; - +freeTextLengthControl: FormControl<RangeValues>; - -_controlsByQuestionType: Map<SurveyQuestionType, FormGroup>; - -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - -_validationConfigsByQuestionType: Map<SurveyQuestionType, Map<FormValidationSetEnum, List<FormControlValidation>>>; - +form: FormGroup; - +questionId: String; - +questionType: SurveyQuestionType; - +questionTypeControlOptions: List<FormControlOption<SurveyQuestionType>>; - +answerOptionsArray: FormArray<dynamic>; - +answerOptionsControls: List<AbstractControl<dynamic>>; - +validAnswerOptions: List<String>; - +boolOptions: List<AbstractControl<String>>; - +imageOptions: List<AbstractControl<String>>; - +audioOptions: List<AbstractControl<String>>; - +scaleMinValue: int; - +scaleMaxValue: int; - +scaleRange: int; - +scaleAllValueControls: List<AbstractControl<int>>; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +questionTextRequired: dynamic; - +numValidChoiceOptions: dynamic; - +scaleRangeValid: dynamic; - +maxRecordingDurationValid: dynamic; - +titles: Map<FormMode, String>; - +isAddOptionButtonVisible: bool; - +isMidValuesClearedInfoVisible: bool - | - +String? scaleMidLabelAt(); - -dynamic _onScaleRangeChanged(); - -dynamic _applyInputFormatters(); - -dynamic _updateScaleMidValueControls(); - -Map<String, dynamic>? _validateFreeText(); - -dynamic _onFreeTextLengthChanged(); - -List<FormControlValidation> _getValidationConfig(); - +dynamic onQuestionTypeChanged(); - +dynamic onResponseOptionsChanged(); - -void _updateFormControls(); - +void initControls(); - +void setControlsFrom(); - +QuestionFormData buildFormData(); - +List<ModelAction<dynamic>> availableActions(); - +void onNewItem(); - +void onSelectItem(); - +dynamic save(); - +QuestionFormViewModel createDuplicate() - ] - - [QuestionFormViewModel]o-[SurveyQuestionType] - [QuestionFormViewModel]o-[FormControl] - [QuestionFormViewModel]o-[FormArray] - [QuestionFormViewModel]o-[<abstract>AbstractControl] - [QuestionFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[QuestionFormViewModel] - [<abstract>IListActionProvider]<:--[QuestionFormViewModel] - - [SurveyQuestionFormView - | - +formViewModel: QuestionFormViewModel; - +isHtmlStyleable: bool - ] - - [SurveyQuestionFormView]o-[QuestionFormViewModel] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - WithQuestionnaireControls - - - - - - +questionsArray: FormArray<dynamic> - +questionFormViewModels: FormViewModelCollection<Q, QuestionFormData> - +questionnaireControls: Map<String, FormArray<dynamic>> - +propagateOnSave: bool - +questionModels: List<Q> - +questionTitles: Map<FormMode, String Function()> - - - - - - +void setQuestionnaireControlsFrom() - +QuestionnaireFormData buildQuestionnaireFormData() - +void read() - +void onCancel() - +dynamic onSave() - +Q provide() - +Q provideQuestionFormViewModel() - - - - - - - - - - - FormArray - - - - - - - - - - - FormViewModelCollection - - - - - - - - - - - IFormViewModelDelegate - - - - - - - - - - - IProviderArgsResolver - - - - - - - - - - - - - QuestionnaireFormData - - - - - - +questionsData: List<QuestionFormData>? - +id: String - - - - - - +StudyUQuestionnaire toQuestionnaire() - +List<EligibilityCriterion> toEligibilityCriteria() - +QuestionnaireFormData copy() - - - - - - - - - - - IFormData - - - - - - - - - - - - - QuestionFormData - - - - - - <static>+questionTypeFormDataFactories: Map<SurveyQuestionType, QuestionFormData Function(Question<dynamic>, List<EligibilityCriterion>)> - +questionId: String - +questionText: String - +questionInfoText: String? - +questionType: SurveyQuestionType - +responseOptionsValidity: Map<dynamic, bool> - +responseOptions: List<dynamic> - +id: String - - - - - - +Question<dynamic> toQuestion() - +EligibilityCriterion toEligibilityCriterion() - +Answer<dynamic> constructAnswerFor() - +dynamic setResponseOptionsValidityFrom() - +QuestionFormData copy() - - - - - - - - - - - - SurveyQuestionType - - - - - - +index: int - <static>+values: List<SurveyQuestionType> - <static>+choice: SurveyQuestionType - <static>+bool: SurveyQuestionType - <static>+scale: SurveyQuestionType - <static>+image: SurveyQuestionType - <static>+audio: SurveyQuestionType - <static>+freeText: SurveyQuestionType - - - - - - - - - - - - - ChoiceQuestionFormData - - - - - - +isMultipleChoice: bool - +answerOptions: List<String> - +responseOptions: List<String> - - - - - - +Question<dynamic> toQuestion() - +QuestionFormData copy() - -Choice _buildChoiceForValue() - +Answer<dynamic> constructAnswerFor() - - - - - - - - - - - - - BoolQuestionFormData - - - - - - <static>+kResponseOptions: Map<String, bool> - +responseOptions: List<String> - - - - - - +Question<dynamic> toQuestion() - +BoolQuestionFormData copy() - +Answer<dynamic> constructAnswerFor() - - - - - - - - - - - - - ImageQuestionFormData - - - - - - <static>+kResponseOptions: Map<String, FutureBlobFile> - +responseOptions: List<String> - - - - - - +Question<dynamic> toQuestion() - +ImageQuestionFormData copy() - +Answer<dynamic> constructAnswerFor() - - - - - - - - - - - - - AudioQuestionFormData - - - - - - +maxRecordingDurationSeconds: int - <static>+kResponseOptions: Map<String, FutureBlobFile> - +responseOptions: List<String> - - - - - - +Question<dynamic> toQuestion() - +AudioQuestionFormData copy() - +Answer<dynamic> constructAnswerFor() - - - - - - - - - - - - - ScaleQuestionFormData - - - - - - +minValue: double - +maxValue: double - +minLabel: String? - +maxLabel: String? - +midValues: List<double?> - +midLabels: List<String?> - +stepSize: double - +initialValue: double? - +minColor: Color? - +maxColor: Color? - +responseOptions: List<double> - +midAnnotations: List<Annotation> - - - - - - +ScaleQuestion toQuestion() - +QuestionFormData copy() - +Answer<dynamic> constructAnswerFor() - - - - - - - - - - - Color - - - - - - - - - - - - - FreeTextQuestionFormData - - - - - - +textLengthRange: List<int> - +textType: FreeTextQuestionType - +textTypeExpression: String? - +responseOptions: List<String> - - - - - - +Question<dynamic> toQuestion() - +FreeTextQuestionFormData copy() - +Answer<dynamic> constructAnswerFor() - - - - - - - - - - - FreeTextQuestionType - - - - - - - - - - - - - AudioRecordingQuestionFormView - - - - - - +formViewModel: QuestionFormViewModel - - - - - - +Widget build() - - - - - - - - - - - - - QuestionFormViewModel - - - - - - <static>+defaultQuestionType: SurveyQuestionType - -_titles: Map<FormMode, String Function()>? - +questionIdControl: FormControl<String> - +questionTypeControl: FormControl<SurveyQuestionType> - +questionTextControl: FormControl<String> - +questionInfoTextControl: FormControl<String> - +questionBaseControls: Map<String, AbstractControl<dynamic>> - +isMultipleChoiceControl: FormControl<bool> - +choiceResponseOptionsArray: FormArray<dynamic> - +customOptionsMin: int - +customOptionsMax: int - +customOptionsInitial: int - +boolResponseOptionsArray: FormArray<String> - +imageResponseOptionsArray: FormArray<String> - <static>+kDefaultMaxRecordingDurationSeconds: int - <static>+kMaxRecordingDurationSeconds: int - +audioResponseOptionsArray: FormArray<String> - +maxRecordingDurationSecondsControl: FormControl<int> - <static>+kDefaultScaleMinValue: int - <static>+kDefaultScaleMaxValue: int - <static>+kNumMidValueControls: int - <static>+kMidValueDebounceMilliseconds: int - +scaleMinValueControl: FormControl<int> - +scaleMaxValueControl: FormControl<int> - -_scaleRangeControl: FormControl<int> - +scaleMinLabelControl: FormControl<String> - +scaleMaxLabelControl: FormControl<String> - +scaleMidValueControls: FormArray<int> - +scaleMidLabelControls: FormArray<String?> - -_scaleResponseOptionsArray: FormArray<int> - +scaleMinColorControl: FormControl<SerializableColor> - +scaleMaxColorControl: FormControl<SerializableColor> - +prevMidValues: List<int?>? - +freeTextTypeControl: FormControl<FreeTextQuestionType> - +customRegexControl: FormControl<String> - +freeTextResponseOptionsArray: FormArray<dynamic> - +freeTextLengthMin: AbstractControl<int> - +freeTextLengthMax: AbstractControl<int> - +freeTextExampleTextControl: FormControl<String> - <static>+kDefaultFreeTextMinLength: int - <static>+kDefaultFreeTextMaxLength: int - +freeTextLengthControl: FormControl<RangeValues> - -_controlsByQuestionType: Map<SurveyQuestionType, FormGroup> - -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - -_validationConfigsByQuestionType: Map<SurveyQuestionType, Map<FormValidationSetEnum, List<FormControlValidation>>> - +form: FormGroup - +questionId: String - +questionType: SurveyQuestionType - +questionTypeControlOptions: List<FormControlOption<SurveyQuestionType>> - +answerOptionsArray: FormArray<dynamic> - +answerOptionsControls: List<AbstractControl<dynamic>> - +validAnswerOptions: List<String> - +boolOptions: List<AbstractControl<String>> - +imageOptions: List<AbstractControl<String>> - +audioOptions: List<AbstractControl<String>> - +scaleMinValue: int - +scaleMaxValue: int - +scaleRange: int - +scaleAllValueControls: List<AbstractControl<int>> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +questionTextRequired: dynamic - +numValidChoiceOptions: dynamic - +scaleRangeValid: dynamic - +maxRecordingDurationValid: dynamic - +titles: Map<FormMode, String> - +isAddOptionButtonVisible: bool - +isMidValuesClearedInfoVisible: bool - - - - - - +String? scaleMidLabelAt() - -dynamic _onScaleRangeChanged() - -dynamic _applyInputFormatters() - -dynamic _updateScaleMidValueControls() - -Map<String, dynamic>? _validateFreeText() - -dynamic _onFreeTextLengthChanged() - -List<FormControlValidation> _getValidationConfig() - +dynamic onQuestionTypeChanged() - +dynamic onResponseOptionsChanged() - -void _updateFormControls() - +void initControls() - +void setControlsFrom() - +QuestionFormData buildFormData() - +List<ModelAction<dynamic>> availableActions() - +void onNewItem() - +void onSelectItem() - +dynamic save() - +QuestionFormViewModel createDuplicate() - - - - - - - - - - - ConsumerWidget - - - - - - - - - - - - - FreeTextQuestionFormView - - - - - - +formViewModel: QuestionFormViewModel - +generateLabelHelpTextMap: dynamic - - - - - - +Widget build() - +Widget disableOnReadonly() - +Widget generateRow() - - - - - - - - - - - Enum - - - - - - - - - - - - - ImageCapturingQuestionFormView - - - - - - +formViewModel: QuestionFormViewModel - - - - - - +Widget build() - - - - - - - - - - - - IScaleQuestionFormViewModel - - - - - - +isMidValuesClearedInfoVisible: bool - - - - - - - - - - - - ScaleQuestionFormView - - - - - - +formViewModel: QuestionFormViewModel - - - - - - - - - - - - - ChoiceQuestionFormView - - - - - - +formViewModel: QuestionFormViewModel - - - - - - +Widget build() - - - - - - - - - - - - - BoolQuestionFormView - - - - - - +formViewModel: QuestionFormViewModel - - - - - - +Widget build() - - - - - - - - - - - FormControl - - - - - - - - - - - AbstractControl - - - - - - - - - - - FormGroup - - - - - - - - - - - ManagedFormViewModel - - - - - - - - - - - IListActionProvider - - - - - - - - - - - - SurveyQuestionFormView - - - - - - +formViewModel: QuestionFormViewModel - +isHtmlStyleable: bool - - - - - - - - - \ No newline at end of file diff --git a/docs/uml/designer_v2/lib/features/design/shared/uml.svg b/docs/uml/designer_v2/lib/features/design/shared/uml.svg deleted file mode 100644 index cb3e53617..000000000 --- a/docs/uml/designer_v2/lib/features/design/shared/uml.svg +++ /dev/null @@ -1,1418 +0,0 @@ - - [<abstract>WithQuestionnaireControls - | - +questionsArray: FormArray<dynamic>; - +questionFormViewModels: FormViewModelCollection<Q, QuestionFormData>; - +questionnaireControls: Map<String, FormArray<dynamic>>; - +propagateOnSave: bool; - +questionModels: List<Q>; - +questionTitles: Map<FormMode, String Function()> - | - +void setQuestionnaireControlsFrom(); - +QuestionnaireFormData buildQuestionnaireFormData(); - +void read(); - +void onCancel(); - +dynamic onSave(); - +Q provide(); - +Q provideQuestionFormViewModel() - ] - - [<abstract>WithQuestionnaireControls]o-[FormArray] - [<abstract>WithQuestionnaireControls]o-[FormViewModelCollection] - [<abstract>IFormViewModelDelegate]<:--[<abstract>WithQuestionnaireControls] - [<abstract>IProviderArgsResolver]<:--[<abstract>WithQuestionnaireControls] - - [QuestionnaireFormData - | - +questionsData: List<QuestionFormData>?; - +id: String - | - +StudyUQuestionnaire toQuestionnaire(); - +List<EligibilityCriterion> toEligibilityCriteria(); - +QuestionnaireFormData copy() - ] - - [<abstract>IFormData]<:--[QuestionnaireFormData] - - [<abstract>QuestionFormData - | - <static>+questionTypeFormDataFactories: Map<SurveyQuestionType, QuestionFormData Function(Question<dynamic>, List<EligibilityCriterion>)>; - +questionId: String; - +questionText: String; - +questionInfoText: String?; - +questionType: SurveyQuestionType; - +responseOptionsValidity: Map<dynamic, bool>; - +responseOptions: List<dynamic>; - +id: String - | - +Question<dynamic> toQuestion(); - +EligibilityCriterion toEligibilityCriterion(); - +Answer<dynamic> constructAnswerFor(); - +dynamic setResponseOptionsValidityFrom(); - +QuestionFormData copy() - ] - - [<abstract>QuestionFormData]o-[SurveyQuestionType] - [<abstract>IFormData]<:--[<abstract>QuestionFormData] - - [ChoiceQuestionFormData - | - +isMultipleChoice: bool; - +answerOptions: List<String>; - +responseOptions: List<String> - | - +Question<dynamic> toQuestion(); - +QuestionFormData copy(); - -Choice _buildChoiceForValue(); - +Answer<dynamic> constructAnswerFor() - ] - - [<abstract>QuestionFormData]<:-[ChoiceQuestionFormData] - - [BoolQuestionFormData - | - <static>+kResponseOptions: Map<String, bool>; - +responseOptions: List<String> - | - +Question<dynamic> toQuestion(); - +BoolQuestionFormData copy(); - +Answer<dynamic> constructAnswerFor() - ] - - [<abstract>QuestionFormData]<:-[BoolQuestionFormData] - - [ImageQuestionFormData - | - <static>+kResponseOptions: Map<String, FutureBlobFile>; - +responseOptions: List<String> - | - +Question<dynamic> toQuestion(); - +ImageQuestionFormData copy(); - +Answer<dynamic> constructAnswerFor() - ] - - [<abstract>QuestionFormData]<:-[ImageQuestionFormData] - - [AudioQuestionFormData - | - +maxRecordingDurationSeconds: int; - <static>+kResponseOptions: Map<String, FutureBlobFile>; - +responseOptions: List<String> - | - +Question<dynamic> toQuestion(); - +AudioQuestionFormData copy(); - +Answer<dynamic> constructAnswerFor() - ] - - [<abstract>QuestionFormData]<:-[AudioQuestionFormData] - - [ScaleQuestionFormData - | - +minValue: double; - +maxValue: double; - +minLabel: String?; - +maxLabel: String?; - +midValues: List<double?>; - +midLabels: List<String?>; - +stepSize: double; - +initialValue: double?; - +minColor: Color?; - +maxColor: Color?; - +responseOptions: List<double>; - +midAnnotations: List<Annotation> - | - +ScaleQuestion toQuestion(); - +QuestionFormData copy(); - +Answer<dynamic> constructAnswerFor() - ] - - [ScaleQuestionFormData]o-[Color] - [<abstract>QuestionFormData]<:-[ScaleQuestionFormData] - - [FreeTextQuestionFormData - | - +textLengthRange: List<int>; - +textType: FreeTextQuestionType; - +textTypeExpression: String?; - +responseOptions: List<String> - | - +Question<dynamic> toQuestion(); - +FreeTextQuestionFormData copy(); - +Answer<dynamic> constructAnswerFor() - ] - - [FreeTextQuestionFormData]o-[FreeTextQuestionType] - [<abstract>QuestionFormData]<:-[FreeTextQuestionFormData] - - [AudioRecordingQuestionFormView - | - +formViewModel: QuestionFormViewModel - | - +Widget build() - ] - - [AudioRecordingQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[AudioRecordingQuestionFormView] - - [FreeTextQuestionFormView - | - +formViewModel: QuestionFormViewModel; - +generateLabelHelpTextMap: dynamic - | - +Widget build(); - +Widget disableOnReadonly(); - +Widget generateRow() - ] - - [FreeTextQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[FreeTextQuestionFormView] - - [SurveyQuestionType - | - +index: int; - <static>+values: List<SurveyQuestionType>; - <static>+choice: SurveyQuestionType; - <static>+bool: SurveyQuestionType; - <static>+scale: SurveyQuestionType; - <static>+image: SurveyQuestionType; - <static>+audio: SurveyQuestionType; - <static>+freeText: SurveyQuestionType - ] - - [SurveyQuestionType]o-[SurveyQuestionType] - [Enum]<:--[SurveyQuestionType] - - [ImageCapturingQuestionFormView - | - +formViewModel: QuestionFormViewModel - | - +Widget build() - ] - - [ImageCapturingQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[ImageCapturingQuestionFormView] - - [<abstract>IScaleQuestionFormViewModel - | - +isMidValuesClearedInfoVisible: bool - ] - - [ScaleQuestionFormView - | - +formViewModel: QuestionFormViewModel - ] - - [ScaleQuestionFormView]o-[QuestionFormViewModel] - - [ChoiceQuestionFormView - | - +formViewModel: QuestionFormViewModel - | - +Widget build() - ] - - [ChoiceQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[ChoiceQuestionFormView] - - [BoolQuestionFormView - | - +formViewModel: QuestionFormViewModel - | - +Widget build() - ] - - [BoolQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[BoolQuestionFormView] - - [QuestionFormViewModel - | - <static>+defaultQuestionType: SurveyQuestionType; - -_titles: Map<FormMode, String Function()>?; - +questionIdControl: FormControl<String>; - +questionTypeControl: FormControl<SurveyQuestionType>; - +questionTextControl: FormControl<String>; - +questionInfoTextControl: FormControl<String>; - +questionBaseControls: Map<String, AbstractControl<dynamic>>; - +isMultipleChoiceControl: FormControl<bool>; - +choiceResponseOptionsArray: FormArray<dynamic>; - +customOptionsMin: int; - +customOptionsMax: int; - +customOptionsInitial: int; - +boolResponseOptionsArray: FormArray<String>; - +imageResponseOptionsArray: FormArray<String>; - <static>+kDefaultMaxRecordingDurationSeconds: int; - <static>+kMaxRecordingDurationSeconds: int; - +audioResponseOptionsArray: FormArray<String>; - +maxRecordingDurationSecondsControl: FormControl<int>; - <static>+kDefaultScaleMinValue: int; - <static>+kDefaultScaleMaxValue: int; - <static>+kNumMidValueControls: int; - <static>+kMidValueDebounceMilliseconds: int; - +scaleMinValueControl: FormControl<int>; - +scaleMaxValueControl: FormControl<int>; - -_scaleRangeControl: FormControl<int>; - +scaleMinLabelControl: FormControl<String>; - +scaleMaxLabelControl: FormControl<String>; - +scaleMidValueControls: FormArray<int>; - +scaleMidLabelControls: FormArray<String?>; - -_scaleResponseOptionsArray: FormArray<int>; - +scaleMinColorControl: FormControl<SerializableColor>; - +scaleMaxColorControl: FormControl<SerializableColor>; - +prevMidValues: List<int?>?; - +freeTextTypeControl: FormControl<FreeTextQuestionType>; - +customRegexControl: FormControl<String>; - +freeTextResponseOptionsArray: FormArray<dynamic>; - +freeTextLengthMin: AbstractControl<int>; - +freeTextLengthMax: AbstractControl<int>; - +freeTextExampleTextControl: FormControl<String>; - <static>+kDefaultFreeTextMinLength: int; - <static>+kDefaultFreeTextMaxLength: int; - +freeTextLengthControl: FormControl<RangeValues>; - -_controlsByQuestionType: Map<SurveyQuestionType, FormGroup>; - -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - -_validationConfigsByQuestionType: Map<SurveyQuestionType, Map<FormValidationSetEnum, List<FormControlValidation>>>; - +form: FormGroup; - +questionId: String; - +questionType: SurveyQuestionType; - +questionTypeControlOptions: List<FormControlOption<SurveyQuestionType>>; - +answerOptionsArray: FormArray<dynamic>; - +answerOptionsControls: List<AbstractControl<dynamic>>; - +validAnswerOptions: List<String>; - +boolOptions: List<AbstractControl<String>>; - +imageOptions: List<AbstractControl<String>>; - +audioOptions: List<AbstractControl<String>>; - +scaleMinValue: int; - +scaleMaxValue: int; - +scaleRange: int; - +scaleAllValueControls: List<AbstractControl<int>>; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +questionTextRequired: dynamic; - +numValidChoiceOptions: dynamic; - +scaleRangeValid: dynamic; - +maxRecordingDurationValid: dynamic; - +titles: Map<FormMode, String>; - +isAddOptionButtonVisible: bool; - +isMidValuesClearedInfoVisible: bool - | - +String? scaleMidLabelAt(); - -dynamic _onScaleRangeChanged(); - -dynamic _applyInputFormatters(); - -dynamic _updateScaleMidValueControls(); - -Map<String, dynamic>? _validateFreeText(); - -dynamic _onFreeTextLengthChanged(); - -List<FormControlValidation> _getValidationConfig(); - +dynamic onQuestionTypeChanged(); - +dynamic onResponseOptionsChanged(); - -void _updateFormControls(); - +void initControls(); - +void setControlsFrom(); - +QuestionFormData buildFormData(); - +List<ModelAction<dynamic>> availableActions(); - +void onNewItem(); - +void onSelectItem(); - +dynamic save(); - +QuestionFormViewModel createDuplicate() - ] - - [QuestionFormViewModel]o-[SurveyQuestionType] - [QuestionFormViewModel]o-[FormControl] - [QuestionFormViewModel]o-[FormArray] - [QuestionFormViewModel]o-[<abstract>AbstractControl] - [QuestionFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[QuestionFormViewModel] - [<abstract>IListActionProvider]<:--[QuestionFormViewModel] - - [SurveyQuestionFormView - | - +formViewModel: QuestionFormViewModel; - +isHtmlStyleable: bool - ] - - [SurveyQuestionFormView]o-[QuestionFormViewModel] - - [<abstract>IFormDataWithSchedule - | - +instanceId: String; - +isTimeLocked: bool; - +timeLockStart: StudyUTimeOfDay?; - +timeLockEnd: StudyUTimeOfDay?; - +hasReminder: bool; - +reminderTime: StudyUTimeOfDay? - | - +Schedule toSchedule() - ] - - [<abstract>IFormDataWithSchedule]o-[StudyUTimeOfDay] - [<abstract>IFormData]<:--[<abstract>IFormDataWithSchedule] - - [ScheduleControls - | - +formViewModel: WithScheduleControls - | - +Widget build(); - -List<FormTableRow> _conditionalTimeRestrictions() - ] - - [ScheduleControls]o-[<abstract>WithScheduleControls] - [<abstract>FormConsumerWidget]<:-[ScheduleControls] - - [<abstract>WithScheduleControls - | - +isTimeRestrictedControl: FormControl<bool>; - +instanceID: FormControl<String>; - +restrictedTimeStartControl: FormControl<Time>; - +restrictedTimeStartPickerControl: FormControl<TimeOfDay>; - +restrictedTimeEndControl: FormControl<Time>; - +restrictedTimeEndPickerControl: FormControl<TimeOfDay>; - +hasReminderControl: FormControl<bool>; - +reminderTimeControl: FormControl<Time>; - +reminderTimePickerControl: FormControl<TimeOfDay>; - -_reminderControlStream: StreamSubscription<dynamic>?; - +scheduleFormControls: Map<String, FormControl<Object>>; - +hasReminder: bool; - +isTimeRestricted: bool; - +timeRestriction: List<Time>? - | - +void setScheduleControlsFrom(); - -dynamic _initReminderControl() - ] - - [<abstract>WithScheduleControls]o-[FormControl] - [<abstract>WithScheduleControls]o-[StreamSubscription] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - WithQuestionnaireControls - - - - - - +questionsArray: FormArray<dynamic> - +questionFormViewModels: FormViewModelCollection<Q, QuestionFormData> - +questionnaireControls: Map<String, FormArray<dynamic>> - +propagateOnSave: bool - +questionModels: List<Q> - +questionTitles: Map<FormMode, String Function()> - - - - - - +void setQuestionnaireControlsFrom() - +QuestionnaireFormData buildQuestionnaireFormData() - +void read() - +void onCancel() - +dynamic onSave() - +Q provide() - +Q provideQuestionFormViewModel() - - - - - - - - - - - FormArray - - - - - - - - - - - FormViewModelCollection - - - - - - - - - - - IFormViewModelDelegate - - - - - - - - - - - IProviderArgsResolver - - - - - - - - - - - - - QuestionnaireFormData - - - - - - +questionsData: List<QuestionFormData>? - +id: String - - - - - - +StudyUQuestionnaire toQuestionnaire() - +List<EligibilityCriterion> toEligibilityCriteria() - +QuestionnaireFormData copy() - - - - - - - - - - - IFormData - - - - - - - - - - - - - QuestionFormData - - - - - - <static>+questionTypeFormDataFactories: Map<SurveyQuestionType, QuestionFormData Function(Question<dynamic>, List<EligibilityCriterion>)> - +questionId: String - +questionText: String - +questionInfoText: String? - +questionType: SurveyQuestionType - +responseOptionsValidity: Map<dynamic, bool> - +responseOptions: List<dynamic> - +id: String - - - - - - +Question<dynamic> toQuestion() - +EligibilityCriterion toEligibilityCriterion() - +Answer<dynamic> constructAnswerFor() - +dynamic setResponseOptionsValidityFrom() - +QuestionFormData copy() - - - - - - - - - - - - SurveyQuestionType - - - - - - +index: int - <static>+values: List<SurveyQuestionType> - <static>+choice: SurveyQuestionType - <static>+bool: SurveyQuestionType - <static>+scale: SurveyQuestionType - <static>+image: SurveyQuestionType - <static>+audio: SurveyQuestionType - <static>+freeText: SurveyQuestionType - - - - - - - - - - - - - ChoiceQuestionFormData - - - - - - +isMultipleChoice: bool - +answerOptions: List<String> - +responseOptions: List<String> - - - - - - +Question<dynamic> toQuestion() - +QuestionFormData copy() - -Choice _buildChoiceForValue() - +Answer<dynamic> constructAnswerFor() - - - - - - - - - - - - - BoolQuestionFormData - - - - - - <static>+kResponseOptions: Map<String, bool> - +responseOptions: List<String> - - - - - - +Question<dynamic> toQuestion() - +BoolQuestionFormData copy() - +Answer<dynamic> constructAnswerFor() - - - - - - - - - - - - - ImageQuestionFormData - - - - - - <static>+kResponseOptions: Map<String, FutureBlobFile> - +responseOptions: List<String> - - - - - - +Question<dynamic> toQuestion() - +ImageQuestionFormData copy() - +Answer<dynamic> constructAnswerFor() - - - - - - - - - - - - - AudioQuestionFormData - - - - - - +maxRecordingDurationSeconds: int - <static>+kResponseOptions: Map<String, FutureBlobFile> - +responseOptions: List<String> - - - - - - +Question<dynamic> toQuestion() - +AudioQuestionFormData copy() - +Answer<dynamic> constructAnswerFor() - - - - - - - - - - - - - ScaleQuestionFormData - - - - - - +minValue: double - +maxValue: double - +minLabel: String? - +maxLabel: String? - +midValues: List<double?> - +midLabels: List<String?> - +stepSize: double - +initialValue: double? - +minColor: Color? - +maxColor: Color? - +responseOptions: List<double> - +midAnnotations: List<Annotation> - - - - - - +ScaleQuestion toQuestion() - +QuestionFormData copy() - +Answer<dynamic> constructAnswerFor() - - - - - - - - - - - Color - - - - - - - - - - - - - FreeTextQuestionFormData - - - - - - +textLengthRange: List<int> - +textType: FreeTextQuestionType - +textTypeExpression: String? - +responseOptions: List<String> - - - - - - +Question<dynamic> toQuestion() - +FreeTextQuestionFormData copy() - +Answer<dynamic> constructAnswerFor() - - - - - - - - - - - FreeTextQuestionType - - - - - - - - - - - - - AudioRecordingQuestionFormView - - - - - - +formViewModel: QuestionFormViewModel - - - - - - +Widget build() - - - - - - - - - - - - - QuestionFormViewModel - - - - - - <static>+defaultQuestionType: SurveyQuestionType - -_titles: Map<FormMode, String Function()>? - +questionIdControl: FormControl<String> - +questionTypeControl: FormControl<SurveyQuestionType> - +questionTextControl: FormControl<String> - +questionInfoTextControl: FormControl<String> - +questionBaseControls: Map<String, AbstractControl<dynamic>> - +isMultipleChoiceControl: FormControl<bool> - +choiceResponseOptionsArray: FormArray<dynamic> - +customOptionsMin: int - +customOptionsMax: int - +customOptionsInitial: int - +boolResponseOptionsArray: FormArray<String> - +imageResponseOptionsArray: FormArray<String> - <static>+kDefaultMaxRecordingDurationSeconds: int - <static>+kMaxRecordingDurationSeconds: int - +audioResponseOptionsArray: FormArray<String> - +maxRecordingDurationSecondsControl: FormControl<int> - <static>+kDefaultScaleMinValue: int - <static>+kDefaultScaleMaxValue: int - <static>+kNumMidValueControls: int - <static>+kMidValueDebounceMilliseconds: int - +scaleMinValueControl: FormControl<int> - +scaleMaxValueControl: FormControl<int> - -_scaleRangeControl: FormControl<int> - +scaleMinLabelControl: FormControl<String> - +scaleMaxLabelControl: FormControl<String> - +scaleMidValueControls: FormArray<int> - +scaleMidLabelControls: FormArray<String?> - -_scaleResponseOptionsArray: FormArray<int> - +scaleMinColorControl: FormControl<SerializableColor> - +scaleMaxColorControl: FormControl<SerializableColor> - +prevMidValues: List<int?>? - +freeTextTypeControl: FormControl<FreeTextQuestionType> - +customRegexControl: FormControl<String> - +freeTextResponseOptionsArray: FormArray<dynamic> - +freeTextLengthMin: AbstractControl<int> - +freeTextLengthMax: AbstractControl<int> - +freeTextExampleTextControl: FormControl<String> - <static>+kDefaultFreeTextMinLength: int - <static>+kDefaultFreeTextMaxLength: int - +freeTextLengthControl: FormControl<RangeValues> - -_controlsByQuestionType: Map<SurveyQuestionType, FormGroup> - -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - -_validationConfigsByQuestionType: Map<SurveyQuestionType, Map<FormValidationSetEnum, List<FormControlValidation>>> - +form: FormGroup - +questionId: String - +questionType: SurveyQuestionType - +questionTypeControlOptions: List<FormControlOption<SurveyQuestionType>> - +answerOptionsArray: FormArray<dynamic> - +answerOptionsControls: List<AbstractControl<dynamic>> - +validAnswerOptions: List<String> - +boolOptions: List<AbstractControl<String>> - +imageOptions: List<AbstractControl<String>> - +audioOptions: List<AbstractControl<String>> - +scaleMinValue: int - +scaleMaxValue: int - +scaleRange: int - +scaleAllValueControls: List<AbstractControl<int>> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +questionTextRequired: dynamic - +numValidChoiceOptions: dynamic - +scaleRangeValid: dynamic - +maxRecordingDurationValid: dynamic - +titles: Map<FormMode, String> - +isAddOptionButtonVisible: bool - +isMidValuesClearedInfoVisible: bool - - - - - - +String? scaleMidLabelAt() - -dynamic _onScaleRangeChanged() - -dynamic _applyInputFormatters() - -dynamic _updateScaleMidValueControls() - -Map<String, dynamic>? _validateFreeText() - -dynamic _onFreeTextLengthChanged() - -List<FormControlValidation> _getValidationConfig() - +dynamic onQuestionTypeChanged() - +dynamic onResponseOptionsChanged() - -void _updateFormControls() - +void initControls() - +void setControlsFrom() - +QuestionFormData buildFormData() - +List<ModelAction<dynamic>> availableActions() - +void onNewItem() - +void onSelectItem() - +dynamic save() - +QuestionFormViewModel createDuplicate() - - - - - - - - - - - ConsumerWidget - - - - - - - - - - - - - FreeTextQuestionFormView - - - - - - +formViewModel: QuestionFormViewModel - +generateLabelHelpTextMap: dynamic - - - - - - +Widget build() - +Widget disableOnReadonly() - +Widget generateRow() - - - - - - - - - - - Enum - - - - - - - - - - - - - ImageCapturingQuestionFormView - - - - - - +formViewModel: QuestionFormViewModel - - - - - - +Widget build() - - - - - - - - - - - - IScaleQuestionFormViewModel - - - - - - +isMidValuesClearedInfoVisible: bool - - - - - - - - - - - - ScaleQuestionFormView - - - - - - +formViewModel: QuestionFormViewModel - - - - - - - - - - - - - ChoiceQuestionFormView - - - - - - +formViewModel: QuestionFormViewModel - - - - - - +Widget build() - - - - - - - - - - - - - BoolQuestionFormView - - - - - - +formViewModel: QuestionFormViewModel - - - - - - +Widget build() - - - - - - - - - - - FormControl - - - - - - - - - - - AbstractControl - - - - - - - - - - - FormGroup - - - - - - - - - - - ManagedFormViewModel - - - - - - - - - - - IListActionProvider - - - - - - - - - - - - SurveyQuestionFormView - - - - - - +formViewModel: QuestionFormViewModel - +isHtmlStyleable: bool - - - - - - - - - - - - - IFormDataWithSchedule - - - - - - +instanceId: String - +isTimeLocked: bool - +timeLockStart: StudyUTimeOfDay? - +timeLockEnd: StudyUTimeOfDay? - +hasReminder: bool - +reminderTime: StudyUTimeOfDay? - - - - - - +Schedule toSchedule() - - - - - - - - - - - StudyUTimeOfDay - - - - - - - - - - - - - ScheduleControls - - - - - - +formViewModel: WithScheduleControls - - - - - - +Widget build() - -List<FormTableRow> _conditionalTimeRestrictions() - - - - - - - - - - - - - WithScheduleControls - - - - - - +isTimeRestrictedControl: FormControl<bool> - +instanceID: FormControl<String> - +restrictedTimeStartControl: FormControl<Time> - +restrictedTimeStartPickerControl: FormControl<TimeOfDay> - +restrictedTimeEndControl: FormControl<Time> - +restrictedTimeEndPickerControl: FormControl<TimeOfDay> - +hasReminderControl: FormControl<bool> - +reminderTimeControl: FormControl<Time> - +reminderTimePickerControl: FormControl<TimeOfDay> - -_reminderControlStream: StreamSubscription<dynamic>? - +scheduleFormControls: Map<String, FormControl<Object>> - +hasReminder: bool - +isTimeRestricted: bool - +timeRestriction: List<Time>? - - - - - - +void setScheduleControlsFrom() - -dynamic _initReminderControl() - - - - - - - - - - - FormConsumerWidget - - - - - - - - - - - StreamSubscription - - - - - - - - - \ No newline at end of file diff --git a/docs/uml/designer_v2/lib/features/design/uml.svg b/docs/uml/designer_v2/lib/features/design/uml.svg deleted file mode 100644 index e752ee322..000000000 --- a/docs/uml/designer_v2/lib/features/design/uml.svg +++ /dev/null @@ -1,4822 +0,0 @@ - - [StudyDesignInterventionsFormView - | - +Widget build() - ] - - [<abstract>StudyDesignPageWidget]<:-[StudyDesignInterventionsFormView] - - [InterventionFormView - | - +formViewModel: InterventionFormViewModel - ] - - [InterventionFormView]o-[InterventionFormViewModel] - - [InterventionPreview - | - +routeArgs: InterventionFormRouteArgs - | - +Widget build() - ] - - [InterventionPreview]o-[InterventionFormRouteArgs] - [<abstract>ConsumerWidget]<:-[InterventionPreview] - - [StudyScheduleFormView - | - +formViewModel: StudyScheduleControls - | - -FormTableRow _renderCustomSequence(); - +Widget build() - ] - - [StudyScheduleFormView]o-[<abstract>StudyScheduleControls] - [<abstract>FormConsumerWidget]<:-[StudyScheduleFormView] - - [InterventionTaskFormData - | - +taskId: String; - +taskTitle: String; - +taskDescription: String?; - <static>+kDefaultTitle: String; - +id: String - | - +CheckmarkTask toTask(); - +InterventionTaskFormData copy() - ] - - [<abstract>IFormDataWithSchedule]<:-[InterventionTaskFormData] - - [InterventionsFormViewModel - | - +study: Study; - +router: GoRouter; - +interventionsArray: FormArray<dynamic>; - +interventionsCollection: FormViewModelCollection<InterventionFormViewModel, InterventionFormData>; - +form: FormGroup; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +interventionsRequired: dynamic; - +titles: Map<FormMode, String>; - +canTestStudySchedule: bool - | - +void setControlsFrom(); - +InterventionsFormData buildFormData(); - +void read(); - +List<ModelAction<dynamic>> availableActions(); - +List<ModelAction<dynamic>> availablePopupActions(); - +List<ModelAction<dynamic>> availableInlineActions(); - +void onSelectItem(); - +void onNewItem(); - +InterventionFormViewModel provide(); - +void onCancel(); - +dynamic onSave(); - +dynamic testStudySchedule() - ] - - [InterventionsFormViewModel]o-[Study] - [InterventionsFormViewModel]o-[GoRouter] - [InterventionsFormViewModel]o-[FormArray] - [InterventionsFormViewModel]o-[FormViewModelCollection] - [InterventionsFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[InterventionsFormViewModel] - [<abstract>StudyScheduleControls]<:-[InterventionsFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[InterventionsFormViewModel] - [<abstract>IListActionProvider]<:--[InterventionsFormViewModel] - [<abstract>IProviderArgsResolver]<:--[InterventionsFormViewModel] - - [InterventionTaskFormViewModel - | - +taskIdControl: FormControl<String>; - +instanceIdControl: FormControl<String>; - +taskTitleControl: FormControl<String>; - +taskDescriptionControl: FormControl<String>; - +markAsCompletedControl: FormControl<bool>; - +form: FormGroup; - +taskId: String; - +instanceId: String; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titleRequired: dynamic; - +titles: Map<FormMode, String> - | - +void setControlsFrom(); - +InterventionTaskFormData buildFormData(); - +InterventionTaskFormViewModel createDuplicate() - ] - - [InterventionTaskFormViewModel]o-[FormControl] - [InterventionTaskFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[InterventionTaskFormViewModel] - [<abstract>WithScheduleControls]<:-[InterventionTaskFormViewModel] - - [<abstract>StudyScheduleControls - | - <static>+defaultScheduleType: PhaseSequence; - <static>+defaultScheduleTypeSequence: String; - <static>+defaultNumCycles: int; - <static>+defaultPeriodLength: int; - +sequenceTypeControl: FormControl<PhaseSequence>; - +sequenceTypeCustomControl: FormControl<String>; - +phaseDurationControl: FormControl<int>; - +numCyclesControl: FormControl<int>; - +includeBaselineControl: FormControl<bool>; - +studyScheduleControls: Map<String, FormControl<Object>>; - <static>+kNumCyclesMin: int; - <static>+kNumCyclesMax: int; - <static>+kPhaseDurationMin: int; - <static>+kPhaseDurationMax: int; - +sequenceTypeControlOptions: List<FormControlOption<PhaseSequence>>; - +studyScheduleValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +numCyclesRange: dynamic; - +phaseDurationRange: dynamic; - +customSequenceRequired: dynamic - | - +void setStudyScheduleControlsFrom(); - +StudyScheduleFormData buildStudyScheduleFormData(); - +bool isSequencingCustom() - ] - - [<abstract>StudyScheduleControls]o-[PhaseSequence] - [<abstract>StudyScheduleControls]o-[FormControl] - - [InterventionFormData - | - +interventionId: String; - +title: String; - +description: String?; - +tasksData: List<InterventionTaskFormData>?; - +iconName: String?; - <static>+kDefaultTitle: String; - +id: String - | - +Intervention toIntervention(); - +InterventionFormData copy() - ] - - [<abstract>IFormData]<:-[InterventionFormData] - - [StudyScheduleFormData - | - +sequenceType: PhaseSequence; - +sequenceTypeCustom: String; - +numCycles: int; - +phaseDuration: int; - +includeBaseline: bool; - +id: String - | - +StudySchedule toStudySchedule(); - +Study apply(); - +StudyScheduleFormData copy() - ] - - [StudyScheduleFormData]o-[PhaseSequence] - [<abstract>IStudyFormData]<:--[StudyScheduleFormData] - - [InterventionTaskFormView - | - +formViewModel: InterventionTaskFormViewModel - ] - - [InterventionTaskFormView]o-[InterventionTaskFormViewModel] - - [InterventionsFormData - | - +interventionsData: List<InterventionFormData>; - +studyScheduleData: StudyScheduleFormData; - +id: String - | - +Study apply(); - +InterventionsFormData copy() - ] - - [InterventionsFormData]o-[StudyScheduleFormData] - [<abstract>IStudyFormData]<:--[InterventionsFormData] - - [InterventionFormViewModel - | - +study: Study; - +interventionIdControl: FormControl<String>; - +interventionTitleControl: FormControl<String>; - +interventionIconControl: FormControl<IconOption>; - +interventionDescriptionControl: FormControl<String>; - +interventionTasksArray: FormArray<dynamic>; - +tasksCollection: FormViewModelCollection<InterventionTaskFormViewModel, InterventionTaskFormData>; - +form: FormGroup; - +interventionId: String; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titleRequired: dynamic; - +atLeastOneTask: dynamic; - +breadcrumbsTitle: String; - +titles: Map<FormMode, String> - | - +void setControlsFrom(); - +InterventionFormData buildFormData(); - +List<ModelAction<dynamic>> availableActions(); - +List<ModelAction<dynamic>> availablePopupActions(); - +List<ModelAction<dynamic>> availableInlineActions(); - +void onSelectItem(); - +void onNewItem(); - +void onCancel(); - +dynamic onSave(); - +InterventionTaskFormViewModel provide(); - +InterventionTaskFormRouteArgs buildNewFormRouteArgs(); - +InterventionTaskFormRouteArgs buildFormRouteArgs(); - +InterventionFormViewModel createDuplicate() - ] - - [InterventionFormViewModel]o-[Study] - [InterventionFormViewModel]o-[FormControl] - [InterventionFormViewModel]o-[FormArray] - [InterventionFormViewModel]o-[FormViewModelCollection] - [InterventionFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[InterventionFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[InterventionFormViewModel] - [<abstract>IListActionProvider]<:--[InterventionFormViewModel] - [<abstract>IProviderArgsResolver]<:--[InterventionFormViewModel] - - [StudyDesignReportsFormView - | - +Widget build(); - -dynamic _showReportItemSidesheetWithArgs() - ] - - [<abstract>StudyDesignPageWidget]<:-[StudyDesignReportsFormView] - - [ReportItemFormData - | - +isPrimary: bool; - +section: ReportSection; - +id: String - | - <static>+dynamic fromDomainModel(); - +ReportItemFormData copy() - ] - - [ReportItemFormData]o-[<abstract>ReportSection] - [<abstract>IFormData]<:-[ReportItemFormData] - - [DataReferenceEditor - | - +formControl: FormControl<DataReferenceIdentifier<T>>; - +availableTasks: List<Task>; - +buildReactiveDropdownField: ReactiveDropdownField<dynamic> - | - +FormTableRow buildFormTableRow(); - -List<DropdownMenuItem<DataReferenceIdentifier<dynamic>>> _dataReferenceItems() - ] - - [DataReferenceEditor]o-[FormControl] - [DataReferenceEditor]o-[ReactiveDropdownField] - - [TemporalAggregationFormatted - | - -_value: TemporalAggregation; - <static>+values: List<TemporalAggregationFormatted>; - +value: TemporalAggregation; - +string: String; - +icon: IconData?; - +hashCode: int - | - +bool ==(); - +String toString(); - +String toJson(); - <static>+TemporalAggregationFormatted fromJson() - ] - - [TemporalAggregationFormatted]o-[TemporalAggregation] - [TemporalAggregationFormatted]o-[IconData] - - [ImprovementDirectionFormatted - | - -_value: ImprovementDirection; - <static>+values: List<ImprovementDirectionFormatted>; - +value: ImprovementDirection; - +string: String; - +icon: IconData?; - +hashCode: int - | - +bool ==(); - +String toString(); - +String toJson(); - <static>+ImprovementDirectionFormatted fromJson() - ] - - [ImprovementDirectionFormatted]o-[ImprovementDirection] - [ImprovementDirectionFormatted]o-[IconData] - - [ReportSectionType - | - +index: int; - <static>+values: List<ReportSectionType>; - <static>+average: ReportSectionType; - <static>+linearRegression: ReportSectionType - ] - - [ReportSectionType]o-[ReportSectionType] - [Enum]<:--[ReportSectionType] - - [AverageSectionFormView - | - +formViewModel: ReportItemFormViewModel; - +studyId: String; - +reportSectionColumnWidth: Map<int, TableColumnWidth> - | - +Widget build() - ] - - [AverageSectionFormView]o-[ReportItemFormViewModel] - [<abstract>ConsumerWidget]<:-[AverageSectionFormView] - - [DataReferenceIdentifier - | - +hashCode: int - | - +bool ==() - ] - - [DataReference]<:-[DataReferenceIdentifier] - - [LinearRegressionSectionFormView - | - +formViewModel: ReportItemFormViewModel; - +studyId: String; - +reportSectionColumnWidth: Map<int, TableColumnWidth> - | - +Widget build() - ] - - [LinearRegressionSectionFormView]o-[ReportItemFormViewModel] - [<abstract>ConsumerWidget]<:-[LinearRegressionSectionFormView] - - [ReportItemFormViewModel - | - <static>+defaultSectionType: ReportSectionType; - +sectionIdControl: FormControl<String>; - +sectionTypeControl: FormControl<ReportSectionType>; - +titleControl: FormControl<String>; - +descriptionControl: FormControl<String>; - +sectionControl: FormControl<ReportSection>; - +dataReferenceControl: FormControl<DataReferenceIdentifier<num>>; - +temporalAggregationControl: FormControl<TemporalAggregationFormatted>; - +improvementDirectionControl: FormControl<ImprovementDirectionFormatted>; - +alphaControl: FormControl<double>; - -_controlsBySectionType: Map<ReportSectionType, FormGroup>; - -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - -_validationConfigsBySectionType: Map<ReportSectionType, Map<FormValidationSetEnum, List<FormControlValidation>>>; - +sectionBaseControls: Map<String, AbstractControl<dynamic>>; - +form: FormGroup; - +sectionId: String; - +sectionType: ReportSectionType; - <static>+sectionTypeControlOptions: List<FormControlOption<ReportSectionType>>; - <static>+temporalAggregationControlOptions: List<FormControlOption<TemporalAggregationFormatted>>; - <static>+improvementDirectionControlOptions: List<FormControlOption<ImprovementDirectionFormatted>>; - +titles: Map<FormMode, String>; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titleRequired: dynamic; - +descriptionRequired: dynamic; - +dataReferenceRequired: dynamic; - +aggregationRequired: dynamic; - +improvementDirectionRequired: dynamic; - +alphaConfidenceRequired: dynamic - | - -List<FormControlValidation> _getValidationConfig(); - +ReportItemFormData buildFormData(); - +ReportItemFormViewModel createDuplicate(); - +dynamic onSectionTypeChanged(); - -void _updateFormControls(); - +void setControlsFrom() - ] - - [ReportItemFormViewModel]o-[ReportSectionType] - [ReportItemFormViewModel]o-[FormControl] - [ReportItemFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[ReportItemFormViewModel] - - [ReportItemFormView - | - +formViewModel: ReportItemFormViewModel; - +studyId: String; - +reportSectionColumnWidth: dynamic; - +sectionTypeBodyBuilder: Widget Function(BuildContext) - | - +Widget build(); - -dynamic _buildSectionText(); - -dynamic _buildSectionTypeHeader() - ] - - [ReportItemFormView]o-[ReportItemFormViewModel] - [ReportItemFormView]o-[Widget Function(BuildContext)] - - [ReportsFormViewModel - | - +study: Study; - +router: GoRouter; - +reportItemDelegate: ReportFormItemDelegate; - +reportItemArray: FormArray<dynamic>; - +reportItemFormViewModels: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData>; - +form: FormGroup; - +reportItemModels: List<ReportItemFormViewModel>; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titles: Map<FormMode, String>; - +canTestConsent: bool - | - +void setControlsFrom(); - +ReportsFormData buildFormData(); - +void read(); - +ReportItemFormRouteArgs buildNewReportItemFormRouteArgs(); - +ReportItemFormRouteArgs buildReportItemFormRouteArgs(); - +dynamic testReport(); - +void onCancel(); - +dynamic onSave(); - +ReportItemFormViewModel provide() - ] - - [ReportsFormViewModel]o-[Study] - [ReportsFormViewModel]o-[GoRouter] - [ReportsFormViewModel]o-[ReportFormItemDelegate] - [ReportsFormViewModel]o-[FormArray] - [ReportsFormViewModel]o-[FormViewModelCollection] - [ReportsFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[ReportsFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[ReportsFormViewModel] - [<abstract>IProviderArgsResolver]<:--[ReportsFormViewModel] - - [ReportFormItemDelegate - | - +formViewModelCollection: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData>; - +owner: ReportsFormViewModel; - +propagateOnSave: bool; - +validationSet: dynamic - | - +void onCancel(); - +dynamic onSave(); - +ReportItemFormViewModel provide(); - +List<ModelAction<dynamic>> availableActions(); - +void onNewItem(); - +void onSelectItem() - ] - - [ReportFormItemDelegate]o-[FormViewModelCollection] - [ReportFormItemDelegate]o-[ReportsFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[ReportFormItemDelegate] - [<abstract>IListActionProvider]<:--[ReportFormItemDelegate] - [<abstract>IProviderArgsResolver]<:--[ReportFormItemDelegate] - - [ReportBadge - | - +status: ReportStatus?; - +type: BadgeType; - +showPrefixIcon: bool; - +showTooltip: bool - | - +Widget build() - ] - - [ReportBadge]o-[ReportStatus] - [ReportBadge]o-[BadgeType] - - [ReportsFormData - | - +reportItems: List<ReportItemFormData>; - +id: String - | - +Study apply(); - +ReportsFormData copy() - ] - - [<abstract>IStudyFormData]<:--[ReportsFormData] - - [ReportStatus - | - +index: int; - <static>+values: List<ReportStatus>; - <static>+primary: ReportStatus; - <static>+secondary: ReportStatus - ] - - [ReportStatus]o-[ReportStatus] - [Enum]<:--[ReportStatus] - - [<abstract>IStudyFormData - | - +Study apply() - ] - - [<abstract>IFormData]<:--[<abstract>IStudyFormData] - - [StudyInfoFormViewModel - | - +study: Study; - +titleControl: FormControl<String>; - +iconControl: FormControl<IconOption>; - +descriptionControl: FormControl<String>; - +organizationControl: FormControl<String>; - +reviewBoardControl: FormControl<String>; - +reviewBoardNumberControl: FormControl<String>; - +researchersControl: FormControl<String>; - +emailControl: FormControl<String>; - +websiteControl: FormControl<String>; - +phoneControl: FormControl<String>; - +additionalInfoControl: FormControl<String>; - +form: FormGroup; - +titles: Map<FormMode, String>; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titleRequired: dynamic; - +descriptionRequired: dynamic; - +iconRequired: dynamic; - +organizationRequired: dynamic; - +reviewBoardRequired: dynamic; - +reviewBoardNumberRequired: dynamic; - +researchersRequired: dynamic; - +emailRequired: dynamic; - +phoneRequired: dynamic; - +emailFormat: dynamic; - +websiteFormat: dynamic - | - +void setControlsFrom(); - +StudyInfoFormData buildFormData() - ] - - [StudyInfoFormViewModel]o-[Study] - [StudyInfoFormViewModel]o-[FormControl] - [StudyInfoFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[StudyInfoFormViewModel] - - [StudyDesignInfoFormView - | - +Widget build() - ] - - [<abstract>StudyDesignPageWidget]<:-[StudyDesignInfoFormView] - - [StudyInfoFormData - | - +title: String; - +description: String?; - +iconName: String; - +contactInfoFormData: StudyContactInfoFormData; - +id: String - | - +Study apply(); - +StudyInfoFormData copy() - ] - - [StudyInfoFormData]o-[StudyContactInfoFormData] - [<abstract>IStudyFormData]<:--[StudyInfoFormData] - - [StudyContactInfoFormData - | - +organization: String?; - +institutionalReviewBoard: String?; - +institutionalReviewBoardNumber: String?; - +researchers: String?; - +email: String?; - +website: String?; - +phone: String?; - +additionalInfo: String?; - +id: String - | - +Study apply(); - +StudyInfoFormData copy() - ] - - [<abstract>IStudyFormData]<:--[StudyContactInfoFormData] - - [StudyFormValidationSet - | - +index: int; - <static>+values: List<StudyFormValidationSet> - ] - - [Enum]<:--[StudyFormValidationSet] - - [MeasurementsFormData - | - +surveyMeasurements: List<MeasurementSurveyFormData>; - +id: String - | - +Study apply(); - +MeasurementsFormData copy() - ] - - [<abstract>IStudyFormData]<:--[MeasurementsFormData] - - [MeasurementSurveyFormView - | - +formViewModel: MeasurementSurveyFormViewModel - ] - - [MeasurementSurveyFormView]o-[MeasurementSurveyFormViewModel] - - [SurveyPreview - | - +routeArgs: MeasurementFormRouteArgs - | - +Widget build() - ] - - [SurveyPreview]o-[MeasurementFormRouteArgs] - [<abstract>ConsumerWidget]<:-[SurveyPreview] - - [MeasurementSurveyFormData - | - +measurementId: String; - +title: String; - +introText: String?; - +outroText: String?; - +questionnaireFormData: QuestionnaireFormData; - <static>+kDefaultTitle: String; - +id: String - | - +QuestionnaireTask toQuestionnaireTask(); - +MeasurementSurveyFormData copy() - ] - - [MeasurementSurveyFormData]o-[QuestionnaireFormData] - [<abstract>IFormDataWithSchedule]<:-[MeasurementSurveyFormData] - - [MeasurementSurveyFormViewModel - | - +study: Study; - +measurementIdControl: FormControl<String>; - +instanceIdControl: FormControl<String>; - +surveyTitleControl: FormControl<String>; - +surveyIntroTextControl: FormControl<String>; - +surveyOutroTextControl: FormControl<String>; - +form: FormGroup; - +measurementId: String; - +instanceId: String; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titleRequired: dynamic; - +atLeastOneQuestion: dynamic; - +breadcrumbsTitle: String; - +titles: Map<FormMode, String> - | - +void setControlsFrom(); - +MeasurementSurveyFormData buildFormData(); - +List<ModelAction<dynamic>> availableActions(); - +List<ModelAction<dynamic>> availablePopupActions(); - +List<ModelAction<dynamic>> availableInlineActions(); - +void onSelectItem(); - +void onNewItem(); - +SurveyQuestionFormRouteArgs buildNewFormRouteArgs(); - +SurveyQuestionFormRouteArgs buildFormRouteArgs(); - +MeasurementSurveyFormViewModel createDuplicate() - ] - - [MeasurementSurveyFormViewModel]o-[Study] - [MeasurementSurveyFormViewModel]o-[FormControl] - [MeasurementSurveyFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[MeasurementSurveyFormViewModel] - [<abstract>WithQuestionnaireControls]<:-[MeasurementSurveyFormViewModel] - [<abstract>WithScheduleControls]<:-[MeasurementSurveyFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[MeasurementSurveyFormViewModel] - [<abstract>IListActionProvider]<:--[MeasurementSurveyFormViewModel] - [<abstract>IProviderArgsResolver]<:--[MeasurementSurveyFormViewModel] - - [StudyDesignMeasurementsFormView - | - +Widget build() - ] - - [<abstract>StudyDesignPageWidget]<:-[StudyDesignMeasurementsFormView] - - [MeasurementsFormViewModel - | - +study: Study; - +router: GoRouter; - +measurementsArray: FormArray<dynamic>; - +surveyMeasurementFormViewModels: FormViewModelCollection<MeasurementSurveyFormViewModel, MeasurementSurveyFormData>; - +form: FormGroup; - +measurementViewModels: List<MeasurementSurveyFormViewModel>; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +measurementRequired: dynamic; - +titles: Map<FormMode, String> - | - +void read(); - +void setControlsFrom(); - +MeasurementsFormData buildFormData(); - +List<ModelAction<dynamic>> availableActions(); - +List<ModelAction<dynamic>> availablePopupActions(); - +List<ModelAction<dynamic>> availableInlineActions(); - +void onSelectItem(); - +void onNewItem(); - +MeasurementSurveyFormViewModel provide(); - +void onCancel(); - +dynamic onSave() - ] - - [MeasurementsFormViewModel]o-[Study] - [MeasurementsFormViewModel]o-[GoRouter] - [MeasurementsFormViewModel]o-[FormArray] - [MeasurementsFormViewModel]o-[FormViewModelCollection] - [MeasurementsFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[MeasurementsFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[MeasurementsFormViewModel] - [<abstract>IListActionProvider]<:--[MeasurementsFormViewModel] - [<abstract>IProviderArgsResolver]<:--[MeasurementsFormViewModel] - - [StudyFormScaffold - | - +studyId: String; - +formViewModelBuilder: T Function(WidgetRef); - +formViewBuilder: Widget Function(T) - | - +Widget build() - ] - - [StudyFormScaffold]o-[T Function(WidgetRef)] - [StudyFormScaffold]o-[Widget Function(T)] - [<abstract>ConsumerWidget]<:-[StudyFormScaffold] - - [ConsentItemFormViewModel - | - +consentIdControl: FormControl<String>; - +titleControl: FormControl<String>; - +descriptionControl: FormControl<String>; - +iconControl: FormControl<IconOption>; - +form: FormGroup; - +consentId: String; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titleRequired: dynamic; - +descriptionRequired: dynamic; - +titles: Map<FormMode, String> - | - +void setControlsFrom(); - +ConsentItemFormData buildFormData(); - +ConsentItemFormViewModel createDuplicate() - ] - - [ConsentItemFormViewModel]o-[FormControl] - [ConsentItemFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[ConsentItemFormViewModel] - - [StudyDesignEnrollmentFormView - | - +Widget build(); - -dynamic _showScreenerQuestionSidesheetWithArgs(); - -dynamic _showConsentItemSidesheetWithArgs() - ] - - [<abstract>StudyDesignPageWidget]<:-[StudyDesignEnrollmentFormView] - - [<abstract>IScreenerQuestionLogicFormViewModel - | - +isDirtyOptionsBannerVisible: bool - ] - - [ScreenerQuestionLogicFormView - | - +formViewModel: ScreenerQuestionFormViewModel - | - +Widget build(); - -dynamic _buildInfoBanner(); - -dynamic _buildAnswerOptionsLogicControls(); - -List<Widget> _buildOptionLogicRow() - ] - - [ScreenerQuestionLogicFormView]o-[ScreenerQuestionFormViewModel] - [<abstract>FormConsumerWidget]<:-[ScreenerQuestionLogicFormView] - - [ConsentItemFormData - | - +consentId: String; - +title: String; - +description: String; - +iconName: String?; - +id: String - | - +ConsentItem toConsentItem(); - +ConsentItemFormData copy() - ] - - [<abstract>IFormData]<:-[ConsentItemFormData] - - [ConsentItemFormView - | - +formViewModel: ConsentItemFormViewModel - ] - - [ConsentItemFormView]o-[ConsentItemFormViewModel] - - [EnrollmentFormData - | - <static>+kDefaultEnrollmentType: Participation; - +enrollmentType: Participation; - +questionnaireFormData: QuestionnaireFormData; - +consentItemsFormData: List<ConsentItemFormData>?; - +id: String - | - +Study apply(); - +EnrollmentFormData copy() - ] - - [EnrollmentFormData]o-[Participation] - [EnrollmentFormData]o-[QuestionnaireFormData] - [<abstract>IStudyFormData]<:--[EnrollmentFormData] - - [ScreenerQuestionFormViewModel - | - <static>+defaultResponseOptionValidity: bool; - +responseOptionsDisabledArray: FormArray<dynamic>; - +responseOptionsLogicControls: FormArray<bool>; - +responseOptionsLogicDescriptionControls: FormArray<String>; - -_questionBaseControls: Map<String, AbstractControl<dynamic>>; - +prevResponseOptionControls: List<AbstractControl<dynamic>>; - +prevResponseOptionValues: List<dynamic>; - +responseOptionsDisabledControls: List<AbstractControl<dynamic>>; - +logicControlOptions: List<FormControlOption<bool>>; - +questionBaseControls: Map<String, AbstractControl<dynamic>>; - +isDirtyOptionsBannerVisible: bool - | - +dynamic onResponseOptionsChanged(); - +void setControlsFrom(); - +QuestionFormData buildFormData(); - -List<FormControl<dynamic>> _copyFormControls(); - -AbstractControl<dynamic>? _findAssociatedLogicControlFor(); - -AbstractControl<dynamic>? _findAssociatedControlFor(); - +ScreenerQuestionFormViewModel createDuplicate() - ] - - [ScreenerQuestionFormViewModel]o-[FormArray] - [QuestionFormViewModel]<:-[ScreenerQuestionFormViewModel] - [<abstract>IScreenerQuestionLogicFormViewModel]<:--[ScreenerQuestionFormViewModel] - - [EnrollmentFormViewModel - | - +study: Study; - +router: GoRouter; - +consentItemDelegate: EnrollmentFormConsentItemDelegate; - +enrollmentTypeControl: FormControl<Participation>; - +consentItemArray: FormArray<dynamic>; - +consentItemFormViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData>; - +form: FormGroup; - +enrollmentTypeControlOptions: List<FormControlOption<Participation>>; - +consentItemModels: List<ConsentItemFormViewModel>; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titles: Map<FormMode, String>; - +canTestScreener: bool; - +canTestConsent: bool; - +questionTitles: Map<FormMode, String Function()> - | - +void setControlsFrom(); - +EnrollmentFormData buildFormData(); - +void read(); - +List<ModelAction<dynamic>> availableActions(); - +List<ModelAction<dynamic>> availablePopupActions(); - +List<ModelAction<dynamic>> availableInlineActions(); - +void onSelectItem(); - +void onNewItem(); - +ScreenerQuestionFormRouteArgs buildNewScreenerQuestionFormRouteArgs(); - +ScreenerQuestionFormRouteArgs buildScreenerQuestionFormRouteArgs(); - +ConsentItemFormRouteArgs buildNewConsentItemFormRouteArgs(); - +ConsentItemFormRouteArgs buildConsentItemFormRouteArgs(); - +dynamic testScreener(); - +dynamic testConsent(); - +ScreenerQuestionFormViewModel provideQuestionFormViewModel() - ] - - [EnrollmentFormViewModel]o-[Study] - [EnrollmentFormViewModel]o-[GoRouter] - [EnrollmentFormViewModel]o-[EnrollmentFormConsentItemDelegate] - [EnrollmentFormViewModel]o-[FormControl] - [EnrollmentFormViewModel]o-[FormArray] - [EnrollmentFormViewModel]o-[FormViewModelCollection] - [EnrollmentFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[EnrollmentFormViewModel] - [<abstract>WithQuestionnaireControls]<:-[EnrollmentFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[EnrollmentFormViewModel] - [<abstract>IListActionProvider]<:--[EnrollmentFormViewModel] - [<abstract>IProviderArgsResolver]<:--[EnrollmentFormViewModel] - - [EnrollmentFormConsentItemDelegate - | - +formViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData>; - +owner: EnrollmentFormViewModel; - +propagateOnSave: bool; - +validationSet: dynamic - | - +void onCancel(); - +dynamic onSave(); - +ConsentItemFormViewModel provide(); - +List<ModelAction<dynamic>> availableActions(); - +void onNewItem(); - +void onSelectItem() - ] - - [EnrollmentFormConsentItemDelegate]o-[FormViewModelCollection] - [EnrollmentFormConsentItemDelegate]o-[EnrollmentFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[EnrollmentFormConsentItemDelegate] - [<abstract>IListActionProvider]<:--[EnrollmentFormConsentItemDelegate] - [<abstract>IProviderArgsResolver]<:--[EnrollmentFormConsentItemDelegate] - - [StudyFormViewModel - | - +studyDirtyCopy: Study?; - +studyRepository: IStudyRepository; - +authRepository: IAuthRepository; - +router: GoRouter; - +studyInfoFormViewModel: StudyInfoFormViewModel; - +enrollmentFormViewModel: EnrollmentFormViewModel; - +measurementsFormViewModel: MeasurementsFormViewModel; - +reportsFormViewModel: ReportsFormViewModel; - +interventionsFormViewModel: InterventionsFormViewModel; - +form: FormGroup; - +isStudyReadonly: bool; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titles: Map<FormMode, String> - | - +void read(); - +void setControlsFrom(); - +Study buildFormData(); - +void dispose(); - +void onCancel(); - +dynamic onSave(); - -dynamic _applyAndSaveSubform() - ] - - [StudyFormViewModel]o-[Study] - [StudyFormViewModel]o-[<abstract>IStudyRepository] - [StudyFormViewModel]o-[<abstract>IAuthRepository] - [StudyFormViewModel]o-[GoRouter] - [StudyFormViewModel]o-[StudyInfoFormViewModel] - [StudyFormViewModel]o-[EnrollmentFormViewModel] - [StudyFormViewModel]o-[MeasurementsFormViewModel] - [StudyFormViewModel]o-[ReportsFormViewModel] - [StudyFormViewModel]o-[InterventionsFormViewModel] - [StudyFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[StudyFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[StudyFormViewModel] - - [<abstract>WithQuestionnaireControls - | - +questionsArray: FormArray<dynamic>; - +questionFormViewModels: FormViewModelCollection<Q, QuestionFormData>; - +questionnaireControls: Map<String, FormArray<dynamic>>; - +propagateOnSave: bool; - +questionModels: List<Q>; - +questionTitles: Map<FormMode, String Function()> - | - +void setQuestionnaireControlsFrom(); - +QuestionnaireFormData buildQuestionnaireFormData(); - +void read(); - +void onCancel(); - +dynamic onSave(); - +Q provide(); - +Q provideQuestionFormViewModel() - ] - - [<abstract>WithQuestionnaireControls]o-[FormArray] - [<abstract>WithQuestionnaireControls]o-[FormViewModelCollection] - [<abstract>IFormViewModelDelegate]<:--[<abstract>WithQuestionnaireControls] - [<abstract>IProviderArgsResolver]<:--[<abstract>WithQuestionnaireControls] - - [QuestionnaireFormData - | - +questionsData: List<QuestionFormData>?; - +id: String - | - +StudyUQuestionnaire toQuestionnaire(); - +List<EligibilityCriterion> toEligibilityCriteria(); - +QuestionnaireFormData copy() - ] - - [<abstract>IFormData]<:--[QuestionnaireFormData] - - [<abstract>QuestionFormData - | - <static>+questionTypeFormDataFactories: Map<SurveyQuestionType, QuestionFormData Function(Question<dynamic>, List<EligibilityCriterion>)>; - +questionId: String; - +questionText: String; - +questionInfoText: String?; - +questionType: SurveyQuestionType; - +responseOptionsValidity: Map<dynamic, bool>; - +responseOptions: List<dynamic>; - +id: String - | - +Question<dynamic> toQuestion(); - +EligibilityCriterion toEligibilityCriterion(); - +Answer<dynamic> constructAnswerFor(); - +dynamic setResponseOptionsValidityFrom(); - +QuestionFormData copy() - ] - - [<abstract>QuestionFormData]o-[SurveyQuestionType] - [<abstract>IFormData]<:--[<abstract>QuestionFormData] - - [ChoiceQuestionFormData - | - +isMultipleChoice: bool; - +answerOptions: List<String>; - +responseOptions: List<String> - | - +Question<dynamic> toQuestion(); - +QuestionFormData copy(); - -Choice _buildChoiceForValue(); - +Answer<dynamic> constructAnswerFor() - ] - - [<abstract>QuestionFormData]<:-[ChoiceQuestionFormData] - - [BoolQuestionFormData - | - <static>+kResponseOptions: Map<String, bool>; - +responseOptions: List<String> - | - +Question<dynamic> toQuestion(); - +BoolQuestionFormData copy(); - +Answer<dynamic> constructAnswerFor() - ] - - [<abstract>QuestionFormData]<:-[BoolQuestionFormData] - - [ImageQuestionFormData - | - <static>+kResponseOptions: Map<String, FutureBlobFile>; - +responseOptions: List<String> - | - +Question<dynamic> toQuestion(); - +ImageQuestionFormData copy(); - +Answer<dynamic> constructAnswerFor() - ] - - [<abstract>QuestionFormData]<:-[ImageQuestionFormData] - - [AudioQuestionFormData - | - +maxRecordingDurationSeconds: int; - <static>+kResponseOptions: Map<String, FutureBlobFile>; - +responseOptions: List<String> - | - +Question<dynamic> toQuestion(); - +AudioQuestionFormData copy(); - +Answer<dynamic> constructAnswerFor() - ] - - [<abstract>QuestionFormData]<:-[AudioQuestionFormData] - - [ScaleQuestionFormData - | - +minValue: double; - +maxValue: double; - +minLabel: String?; - +maxLabel: String?; - +midValues: List<double?>; - +midLabels: List<String?>; - +stepSize: double; - +initialValue: double?; - +minColor: Color?; - +maxColor: Color?; - +responseOptions: List<double>; - +midAnnotations: List<Annotation> - | - +ScaleQuestion toQuestion(); - +QuestionFormData copy(); - +Answer<dynamic> constructAnswerFor() - ] - - [ScaleQuestionFormData]o-[Color] - [<abstract>QuestionFormData]<:-[ScaleQuestionFormData] - - [FreeTextQuestionFormData - | - +textLengthRange: List<int>; - +textType: FreeTextQuestionType; - +textTypeExpression: String?; - +responseOptions: List<String> - | - +Question<dynamic> toQuestion(); - +FreeTextQuestionFormData copy(); - +Answer<dynamic> constructAnswerFor() - ] - - [FreeTextQuestionFormData]o-[FreeTextQuestionType] - [<abstract>QuestionFormData]<:-[FreeTextQuestionFormData] - - [AudioRecordingQuestionFormView - | - +formViewModel: QuestionFormViewModel - | - +Widget build() - ] - - [AudioRecordingQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[AudioRecordingQuestionFormView] - - [FreeTextQuestionFormView - | - +formViewModel: QuestionFormViewModel; - +generateLabelHelpTextMap: dynamic - | - +Widget build(); - +Widget disableOnReadonly(); - +Widget generateRow() - ] - - [FreeTextQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[FreeTextQuestionFormView] - - [SurveyQuestionType - | - +index: int; - <static>+values: List<SurveyQuestionType>; - <static>+choice: SurveyQuestionType; - <static>+bool: SurveyQuestionType; - <static>+scale: SurveyQuestionType; - <static>+image: SurveyQuestionType; - <static>+audio: SurveyQuestionType; - <static>+freeText: SurveyQuestionType - ] - - [SurveyQuestionType]o-[SurveyQuestionType] - [Enum]<:--[SurveyQuestionType] - - [ImageCapturingQuestionFormView - | - +formViewModel: QuestionFormViewModel - | - +Widget build() - ] - - [ImageCapturingQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[ImageCapturingQuestionFormView] - - [<abstract>IScaleQuestionFormViewModel - | - +isMidValuesClearedInfoVisible: bool - ] - - [ScaleQuestionFormView - | - +formViewModel: QuestionFormViewModel - ] - - [ScaleQuestionFormView]o-[QuestionFormViewModel] - - [ChoiceQuestionFormView - | - +formViewModel: QuestionFormViewModel - | - +Widget build() - ] - - [ChoiceQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[ChoiceQuestionFormView] - - [BoolQuestionFormView - | - +formViewModel: QuestionFormViewModel - | - +Widget build() - ] - - [BoolQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[BoolQuestionFormView] - - [QuestionFormViewModel - | - <static>+defaultQuestionType: SurveyQuestionType; - -_titles: Map<FormMode, String Function()>?; - +questionIdControl: FormControl<String>; - +questionTypeControl: FormControl<SurveyQuestionType>; - +questionTextControl: FormControl<String>; - +questionInfoTextControl: FormControl<String>; - +questionBaseControls: Map<String, AbstractControl<dynamic>>; - +isMultipleChoiceControl: FormControl<bool>; - +choiceResponseOptionsArray: FormArray<dynamic>; - +customOptionsMin: int; - +customOptionsMax: int; - +customOptionsInitial: int; - +boolResponseOptionsArray: FormArray<String>; - +imageResponseOptionsArray: FormArray<String>; - <static>+kDefaultMaxRecordingDurationSeconds: int; - <static>+kMaxRecordingDurationSeconds: int; - +audioResponseOptionsArray: FormArray<String>; - +maxRecordingDurationSecondsControl: FormControl<int>; - <static>+kDefaultScaleMinValue: int; - <static>+kDefaultScaleMaxValue: int; - <static>+kNumMidValueControls: int; - <static>+kMidValueDebounceMilliseconds: int; - +scaleMinValueControl: FormControl<int>; - +scaleMaxValueControl: FormControl<int>; - -_scaleRangeControl: FormControl<int>; - +scaleMinLabelControl: FormControl<String>; - +scaleMaxLabelControl: FormControl<String>; - +scaleMidValueControls: FormArray<int>; - +scaleMidLabelControls: FormArray<String?>; - -_scaleResponseOptionsArray: FormArray<int>; - +scaleMinColorControl: FormControl<SerializableColor>; - +scaleMaxColorControl: FormControl<SerializableColor>; - +prevMidValues: List<int?>?; - +freeTextTypeControl: FormControl<FreeTextQuestionType>; - +customRegexControl: FormControl<String>; - +freeTextResponseOptionsArray: FormArray<dynamic>; - +freeTextLengthMin: AbstractControl<int>; - +freeTextLengthMax: AbstractControl<int>; - +freeTextExampleTextControl: FormControl<String>; - <static>+kDefaultFreeTextMinLength: int; - <static>+kDefaultFreeTextMaxLength: int; - +freeTextLengthControl: FormControl<RangeValues>; - -_controlsByQuestionType: Map<SurveyQuestionType, FormGroup>; - -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - -_validationConfigsByQuestionType: Map<SurveyQuestionType, Map<FormValidationSetEnum, List<FormControlValidation>>>; - +form: FormGroup; - +questionId: String; - +questionType: SurveyQuestionType; - +questionTypeControlOptions: List<FormControlOption<SurveyQuestionType>>; - +answerOptionsArray: FormArray<dynamic>; - +answerOptionsControls: List<AbstractControl<dynamic>>; - +validAnswerOptions: List<String>; - +boolOptions: List<AbstractControl<String>>; - +imageOptions: List<AbstractControl<String>>; - +audioOptions: List<AbstractControl<String>>; - +scaleMinValue: int; - +scaleMaxValue: int; - +scaleRange: int; - +scaleAllValueControls: List<AbstractControl<int>>; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +questionTextRequired: dynamic; - +numValidChoiceOptions: dynamic; - +scaleRangeValid: dynamic; - +maxRecordingDurationValid: dynamic; - +titles: Map<FormMode, String>; - +isAddOptionButtonVisible: bool; - +isMidValuesClearedInfoVisible: bool - | - +String? scaleMidLabelAt(); - -dynamic _onScaleRangeChanged(); - -dynamic _applyInputFormatters(); - -dynamic _updateScaleMidValueControls(); - -Map<String, dynamic>? _validateFreeText(); - -dynamic _onFreeTextLengthChanged(); - -List<FormControlValidation> _getValidationConfig(); - +dynamic onQuestionTypeChanged(); - +dynamic onResponseOptionsChanged(); - -void _updateFormControls(); - +void initControls(); - +void setControlsFrom(); - +QuestionFormData buildFormData(); - +List<ModelAction<dynamic>> availableActions(); - +void onNewItem(); - +void onSelectItem(); - +dynamic save(); - +QuestionFormViewModel createDuplicate() - ] - - [QuestionFormViewModel]o-[SurveyQuestionType] - [QuestionFormViewModel]o-[FormControl] - [QuestionFormViewModel]o-[FormArray] - [QuestionFormViewModel]o-[<abstract>AbstractControl] - [QuestionFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[QuestionFormViewModel] - [<abstract>IListActionProvider]<:--[QuestionFormViewModel] - - [SurveyQuestionFormView - | - +formViewModel: QuestionFormViewModel; - +isHtmlStyleable: bool - ] - - [SurveyQuestionFormView]o-[QuestionFormViewModel] - - [<abstract>IFormDataWithSchedule - | - +instanceId: String; - +isTimeLocked: bool; - +timeLockStart: StudyUTimeOfDay?; - +timeLockEnd: StudyUTimeOfDay?; - +hasReminder: bool; - +reminderTime: StudyUTimeOfDay? - | - +Schedule toSchedule() - ] - - [<abstract>IFormDataWithSchedule]o-[StudyUTimeOfDay] - [<abstract>IFormData]<:--[<abstract>IFormDataWithSchedule] - - [ScheduleControls - | - +formViewModel: WithScheduleControls - | - +Widget build(); - -List<FormTableRow> _conditionalTimeRestrictions() - ] - - [ScheduleControls]o-[<abstract>WithScheduleControls] - [<abstract>FormConsumerWidget]<:-[ScheduleControls] - - [<abstract>WithScheduleControls - | - +isTimeRestrictedControl: FormControl<bool>; - +instanceID: FormControl<String>; - +restrictedTimeStartControl: FormControl<Time>; - +restrictedTimeStartPickerControl: FormControl<TimeOfDay>; - +restrictedTimeEndControl: FormControl<Time>; - +restrictedTimeEndPickerControl: FormControl<TimeOfDay>; - +hasReminderControl: FormControl<bool>; - +reminderTimeControl: FormControl<Time>; - +reminderTimePickerControl: FormControl<TimeOfDay>; - -_reminderControlStream: StreamSubscription<dynamic>?; - +scheduleFormControls: Map<String, FormControl<Object>>; - +hasReminder: bool; - +isTimeRestricted: bool; - +timeRestriction: List<Time>? - | - +void setScheduleControlsFrom(); - -dynamic _initReminderControl() - ] - - [<abstract>WithScheduleControls]o-[FormControl] - [<abstract>WithScheduleControls]o-[StreamSubscription] - - [<abstract>StudyDesignPageWidget - | - +Widget? banner() - ] - - [<abstract>StudyPageWidget]<:-[<abstract>StudyDesignPageWidget] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - StudyDesignInterventionsFormView - - - - - - +Widget build() - - - - - - - - - - - - StudyDesignPageWidget - - - - - - +Widget? banner() - - - - - - - - - - - - InterventionFormView - - - - - - +formViewModel: InterventionFormViewModel - - - - - - - - - - - - - InterventionFormViewModel - - - - - - +study: Study - +interventionIdControl: FormControl<String> - +interventionTitleControl: FormControl<String> - +interventionIconControl: FormControl<IconOption> - +interventionDescriptionControl: FormControl<String> - +interventionTasksArray: FormArray<dynamic> - +tasksCollection: FormViewModelCollection<InterventionTaskFormViewModel, InterventionTaskFormData> - +form: FormGroup - +interventionId: String - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titleRequired: dynamic - +atLeastOneTask: dynamic - +breadcrumbsTitle: String - +titles: Map<FormMode, String> - - - - - - +void setControlsFrom() - +InterventionFormData buildFormData() - +List<ModelAction<dynamic>> availableActions() - +List<ModelAction<dynamic>> availablePopupActions() - +List<ModelAction<dynamic>> availableInlineActions() - +void onSelectItem() - +void onNewItem() - +void onCancel() - +dynamic onSave() - +InterventionTaskFormViewModel provide() - +InterventionTaskFormRouteArgs buildNewFormRouteArgs() - +InterventionTaskFormRouteArgs buildFormRouteArgs() - +InterventionFormViewModel createDuplicate() - - - - - - - - - - - - - InterventionPreview - - - - - - +routeArgs: InterventionFormRouteArgs - - - - - - +Widget build() - - - - - - - - - - - InterventionFormRouteArgs - - - - - - - - - - - ConsumerWidget - - - - - - - - - - - - - StudyScheduleFormView - - - - - - +formViewModel: StudyScheduleControls - - - - - - -FormTableRow _renderCustomSequence() - +Widget build() - - - - - - - - - - - - - StudyScheduleControls - - - - - - <static>+defaultScheduleType: PhaseSequence - <static>+defaultScheduleTypeSequence: String - <static>+defaultNumCycles: int - <static>+defaultPeriodLength: int - +sequenceTypeControl: FormControl<PhaseSequence> - +sequenceTypeCustomControl: FormControl<String> - +phaseDurationControl: FormControl<int> - +numCyclesControl: FormControl<int> - +includeBaselineControl: FormControl<bool> - +studyScheduleControls: Map<String, FormControl<Object>> - <static>+kNumCyclesMin: int - <static>+kNumCyclesMax: int - <static>+kPhaseDurationMin: int - <static>+kPhaseDurationMax: int - +sequenceTypeControlOptions: List<FormControlOption<PhaseSequence>> - +studyScheduleValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +numCyclesRange: dynamic - +phaseDurationRange: dynamic - +customSequenceRequired: dynamic - - - - - - +void setStudyScheduleControlsFrom() - +StudyScheduleFormData buildStudyScheduleFormData() - +bool isSequencingCustom() - - - - - - - - - - - FormConsumerWidget - - - - - - - - - - - - - InterventionTaskFormData - - - - - - +taskId: String - +taskTitle: String - +taskDescription: String? - <static>+kDefaultTitle: String - +id: String - - - - - - +CheckmarkTask toTask() - +InterventionTaskFormData copy() - - - - - - - - - - - - - IFormDataWithSchedule - - - - - - +instanceId: String - +isTimeLocked: bool - +timeLockStart: StudyUTimeOfDay? - +timeLockEnd: StudyUTimeOfDay? - +hasReminder: bool - +reminderTime: StudyUTimeOfDay? - - - - - - +Schedule toSchedule() - - - - - - - - - - - - - InterventionsFormViewModel - - - - - - +study: Study - +router: GoRouter - +interventionsArray: FormArray<dynamic> - +interventionsCollection: FormViewModelCollection<InterventionFormViewModel, InterventionFormData> - +form: FormGroup - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +interventionsRequired: dynamic - +titles: Map<FormMode, String> - +canTestStudySchedule: bool - - - - - - +void setControlsFrom() - +InterventionsFormData buildFormData() - +void read() - +List<ModelAction<dynamic>> availableActions() - +List<ModelAction<dynamic>> availablePopupActions() - +List<ModelAction<dynamic>> availableInlineActions() - +void onSelectItem() - +void onNewItem() - +InterventionFormViewModel provide() - +void onCancel() - +dynamic onSave() - +dynamic testStudySchedule() - - - - - - - - - - - Study - - - - - - - - - - - GoRouter - - - - - - - - - - - FormArray - - - - - - - - - - - FormViewModelCollection - - - - - - - - - - - FormGroup - - - - - - - - - - - FormViewModel - - - - - - - - - - - IFormViewModelDelegate - - - - - - - - - - - IListActionProvider - - - - - - - - - - - IProviderArgsResolver - - - - - - - - - - - - - InterventionTaskFormViewModel - - - - - - +taskIdControl: FormControl<String> - +instanceIdControl: FormControl<String> - +taskTitleControl: FormControl<String> - +taskDescriptionControl: FormControl<String> - +markAsCompletedControl: FormControl<bool> - +form: FormGroup - +taskId: String - +instanceId: String - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titleRequired: dynamic - +titles: Map<FormMode, String> - - - - - - +void setControlsFrom() - +InterventionTaskFormData buildFormData() - +InterventionTaskFormViewModel createDuplicate() - - - - - - - - - - - FormControl - - - - - - - - - - - ManagedFormViewModel - - - - - - - - - - - - - WithScheduleControls - - - - - - +isTimeRestrictedControl: FormControl<bool> - +instanceID: FormControl<String> - +restrictedTimeStartControl: FormControl<Time> - +restrictedTimeStartPickerControl: FormControl<TimeOfDay> - +restrictedTimeEndControl: FormControl<Time> - +restrictedTimeEndPickerControl: FormControl<TimeOfDay> - +hasReminderControl: FormControl<bool> - +reminderTimeControl: FormControl<Time> - +reminderTimePickerControl: FormControl<TimeOfDay> - -_reminderControlStream: StreamSubscription<dynamic>? - +scheduleFormControls: Map<String, FormControl<Object>> - +hasReminder: bool - +isTimeRestricted: bool - +timeRestriction: List<Time>? - - - - - - +void setScheduleControlsFrom() - -dynamic _initReminderControl() - - - - - - - - - - - PhaseSequence - - - - - - - - - - - - - InterventionFormData - - - - - - +interventionId: String - +title: String - +description: String? - +tasksData: List<InterventionTaskFormData>? - +iconName: String? - <static>+kDefaultTitle: String - +id: String - - - - - - +Intervention toIntervention() - +InterventionFormData copy() - - - - - - - - - - - IFormData - - - - - - - - - - - - - StudyScheduleFormData - - - - - - +sequenceType: PhaseSequence - +sequenceTypeCustom: String - +numCycles: int - +phaseDuration: int - +includeBaseline: bool - +id: String - - - - - - +StudySchedule toStudySchedule() - +Study apply() - +StudyScheduleFormData copy() - - - - - - - - - - - - IStudyFormData - - - - - - +Study apply() - - - - - - - - - - - - InterventionTaskFormView - - - - - - +formViewModel: InterventionTaskFormViewModel - - - - - - - - - - - - - InterventionsFormData - - - - - - +interventionsData: List<InterventionFormData> - +studyScheduleData: StudyScheduleFormData - +id: String - - - - - - +Study apply() - +InterventionsFormData copy() - - - - - - - - - - - - StudyDesignReportsFormView - - - - - - +Widget build() - -dynamic _showReportItemSidesheetWithArgs() - - - - - - - - - - - - - ReportItemFormData - - - - - - +isPrimary: bool - +section: ReportSection - +id: String - - - - - - <static>+dynamic fromDomainModel() - +ReportItemFormData copy() - - - - - - - - - - - ReportSection - - - - - - - - - - - - - DataReferenceEditor - - - - - - +formControl: FormControl<DataReferenceIdentifier<T>> - +availableTasks: List<Task> - +buildReactiveDropdownField: ReactiveDropdownField<dynamic> - - - - - - +FormTableRow buildFormTableRow() - -List<DropdownMenuItem<DataReferenceIdentifier<dynamic>>> _dataReferenceItems() - - - - - - - - - - - ReactiveDropdownField - - - - - - - - - - - - - TemporalAggregationFormatted - - - - - - -_value: TemporalAggregation - <static>+values: List<TemporalAggregationFormatted> - +value: TemporalAggregation - +string: String - +icon: IconData? - +hashCode: int - - - - - - +bool ==() - +String toString() - +String toJson() - <static>+TemporalAggregationFormatted fromJson() - - - - - - - - - - - TemporalAggregation - - - - - - - - - - - IconData - - - - - - - - - - - - - ImprovementDirectionFormatted - - - - - - -_value: ImprovementDirection - <static>+values: List<ImprovementDirectionFormatted> - +value: ImprovementDirection - +string: String - +icon: IconData? - +hashCode: int - - - - - - +bool ==() - +String toString() - +String toJson() - <static>+ImprovementDirectionFormatted fromJson() - - - - - - - - - - - ImprovementDirection - - - - - - - - - - - - ReportSectionType - - - - - - +index: int - <static>+values: List<ReportSectionType> - <static>+average: ReportSectionType - <static>+linearRegression: ReportSectionType - - - - - - - - - - - Enum - - - - - - - - - - - - - AverageSectionFormView - - - - - - +formViewModel: ReportItemFormViewModel - +studyId: String - +reportSectionColumnWidth: Map<int, TableColumnWidth> - - - - - - +Widget build() - - - - - - - - - - - - - ReportItemFormViewModel - - - - - - <static>+defaultSectionType: ReportSectionType - +sectionIdControl: FormControl<String> - +sectionTypeControl: FormControl<ReportSectionType> - +titleControl: FormControl<String> - +descriptionControl: FormControl<String> - +sectionControl: FormControl<ReportSection> - +dataReferenceControl: FormControl<DataReferenceIdentifier<num>> - +temporalAggregationControl: FormControl<TemporalAggregationFormatted> - +improvementDirectionControl: FormControl<ImprovementDirectionFormatted> - +alphaControl: FormControl<double> - -_controlsBySectionType: Map<ReportSectionType, FormGroup> - -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - -_validationConfigsBySectionType: Map<ReportSectionType, Map<FormValidationSetEnum, List<FormControlValidation>>> - +sectionBaseControls: Map<String, AbstractControl<dynamic>> - +form: FormGroup - +sectionId: String - +sectionType: ReportSectionType - <static>+sectionTypeControlOptions: List<FormControlOption<ReportSectionType>> - <static>+temporalAggregationControlOptions: List<FormControlOption<TemporalAggregationFormatted>> - <static>+improvementDirectionControlOptions: List<FormControlOption<ImprovementDirectionFormatted>> - +titles: Map<FormMode, String> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titleRequired: dynamic - +descriptionRequired: dynamic - +dataReferenceRequired: dynamic - +aggregationRequired: dynamic - +improvementDirectionRequired: dynamic - +alphaConfidenceRequired: dynamic - - - - - - -List<FormControlValidation> _getValidationConfig() - +ReportItemFormData buildFormData() - +ReportItemFormViewModel createDuplicate() - +dynamic onSectionTypeChanged() - -void _updateFormControls() - +void setControlsFrom() - - - - - - - - - - - - - DataReferenceIdentifier - - - - - - +hashCode: int - - - - - - +bool ==() - - - - - - - - - - - DataReference - - - - - - - - - - - - - LinearRegressionSectionFormView - - - - - - +formViewModel: ReportItemFormViewModel - +studyId: String - +reportSectionColumnWidth: Map<int, TableColumnWidth> - - - - - - +Widget build() - - - - - - - - - - - - - ReportItemFormView - - - - - - +formViewModel: ReportItemFormViewModel - +studyId: String - +reportSectionColumnWidth: dynamic - +sectionTypeBodyBuilder: Widget Function(BuildContext) - - - - - - +Widget build() - -dynamic _buildSectionText() - -dynamic _buildSectionTypeHeader() - - - - - - - - - - - Widget Function(BuildContext) - - - - - - - - - - - - - ReportsFormViewModel - - - - - - +study: Study - +router: GoRouter - +reportItemDelegate: ReportFormItemDelegate - +reportItemArray: FormArray<dynamic> - +reportItemFormViewModels: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData> - +form: FormGroup - +reportItemModels: List<ReportItemFormViewModel> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titles: Map<FormMode, String> - +canTestConsent: bool - - - - - - +void setControlsFrom() - +ReportsFormData buildFormData() - +void read() - +ReportItemFormRouteArgs buildNewReportItemFormRouteArgs() - +ReportItemFormRouteArgs buildReportItemFormRouteArgs() - +dynamic testReport() - +void onCancel() - +dynamic onSave() - +ReportItemFormViewModel provide() - - - - - - - - - - - - - ReportFormItemDelegate - - - - - - +formViewModelCollection: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData> - +owner: ReportsFormViewModel - +propagateOnSave: bool - +validationSet: dynamic - - - - - - +void onCancel() - +dynamic onSave() - +ReportItemFormViewModel provide() - +List<ModelAction<dynamic>> availableActions() - +void onNewItem() - +void onSelectItem() - - - - - - - - - - - - - ReportBadge - - - - - - +status: ReportStatus? - +type: BadgeType - +showPrefixIcon: bool - +showTooltip: bool - - - - - - +Widget build() - - - - - - - - - - - - ReportStatus - - - - - - +index: int - <static>+values: List<ReportStatus> - <static>+primary: ReportStatus - <static>+secondary: ReportStatus - - - - - - - - - - - BadgeType - - - - - - - - - - - - - ReportsFormData - - - - - - +reportItems: List<ReportItemFormData> - +id: String - - - - - - +Study apply() - +ReportsFormData copy() - - - - - - - - - - - - - StudyInfoFormViewModel - - - - - - +study: Study - +titleControl: FormControl<String> - +iconControl: FormControl<IconOption> - +descriptionControl: FormControl<String> - +organizationControl: FormControl<String> - +reviewBoardControl: FormControl<String> - +reviewBoardNumberControl: FormControl<String> - +researchersControl: FormControl<String> - +emailControl: FormControl<String> - +websiteControl: FormControl<String> - +phoneControl: FormControl<String> - +additionalInfoControl: FormControl<String> - +form: FormGroup - +titles: Map<FormMode, String> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titleRequired: dynamic - +descriptionRequired: dynamic - +iconRequired: dynamic - +organizationRequired: dynamic - +reviewBoardRequired: dynamic - +reviewBoardNumberRequired: dynamic - +researchersRequired: dynamic - +emailRequired: dynamic - +phoneRequired: dynamic - +emailFormat: dynamic - +websiteFormat: dynamic - - - - - - +void setControlsFrom() - +StudyInfoFormData buildFormData() - - - - - - - - - - - - StudyDesignInfoFormView - - - - - - +Widget build() - - - - - - - - - - - - - StudyInfoFormData - - - - - - +title: String - +description: String? - +iconName: String - +contactInfoFormData: StudyContactInfoFormData - +id: String - - - - - - +Study apply() - +StudyInfoFormData copy() - - - - - - - - - - - - - StudyContactInfoFormData - - - - - - +organization: String? - +institutionalReviewBoard: String? - +institutionalReviewBoardNumber: String? - +researchers: String? - +email: String? - +website: String? - +phone: String? - +additionalInfo: String? - +id: String - - - - - - +Study apply() - +StudyInfoFormData copy() - - - - - - - - - - - - StudyFormValidationSet - - - - - - +index: int - <static>+values: List<StudyFormValidationSet> - - - - - - - - - - - - - MeasurementsFormData - - - - - - +surveyMeasurements: List<MeasurementSurveyFormData> - +id: String - - - - - - +Study apply() - +MeasurementsFormData copy() - - - - - - - - - - - - MeasurementSurveyFormView - - - - - - +formViewModel: MeasurementSurveyFormViewModel - - - - - - - - - - - - - MeasurementSurveyFormViewModel - - - - - - +study: Study - +measurementIdControl: FormControl<String> - +instanceIdControl: FormControl<String> - +surveyTitleControl: FormControl<String> - +surveyIntroTextControl: FormControl<String> - +surveyOutroTextControl: FormControl<String> - +form: FormGroup - +measurementId: String - +instanceId: String - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titleRequired: dynamic - +atLeastOneQuestion: dynamic - +breadcrumbsTitle: String - +titles: Map<FormMode, String> - - - - - - +void setControlsFrom() - +MeasurementSurveyFormData buildFormData() - +List<ModelAction<dynamic>> availableActions() - +List<ModelAction<dynamic>> availablePopupActions() - +List<ModelAction<dynamic>> availableInlineActions() - +void onSelectItem() - +void onNewItem() - +SurveyQuestionFormRouteArgs buildNewFormRouteArgs() - +SurveyQuestionFormRouteArgs buildFormRouteArgs() - +MeasurementSurveyFormViewModel createDuplicate() - - - - - - - - - - - - - SurveyPreview - - - - - - +routeArgs: MeasurementFormRouteArgs - - - - - - +Widget build() - - - - - - - - - - - MeasurementFormRouteArgs - - - - - - - - - - - - - MeasurementSurveyFormData - - - - - - +measurementId: String - +title: String - +introText: String? - +outroText: String? - +questionnaireFormData: QuestionnaireFormData - <static>+kDefaultTitle: String - +id: String - - - - - - +QuestionnaireTask toQuestionnaireTask() - +MeasurementSurveyFormData copy() - - - - - - - - - - - - - QuestionnaireFormData - - - - - - +questionsData: List<QuestionFormData>? - +id: String - - - - - - +StudyUQuestionnaire toQuestionnaire() - +List<EligibilityCriterion> toEligibilityCriteria() - +QuestionnaireFormData copy() - - - - - - - - - - - - - WithQuestionnaireControls - - - - - - +questionsArray: FormArray<dynamic> - +questionFormViewModels: FormViewModelCollection<Q, QuestionFormData> - +questionnaireControls: Map<String, FormArray<dynamic>> - +propagateOnSave: bool - +questionModels: List<Q> - +questionTitles: Map<FormMode, String Function()> - - - - - - +void setQuestionnaireControlsFrom() - +QuestionnaireFormData buildQuestionnaireFormData() - +void read() - +void onCancel() - +dynamic onSave() - +Q provide() - +Q provideQuestionFormViewModel() - - - - - - - - - - - - StudyDesignMeasurementsFormView - - - - - - +Widget build() - - - - - - - - - - - - - MeasurementsFormViewModel - - - - - - +study: Study - +router: GoRouter - +measurementsArray: FormArray<dynamic> - +surveyMeasurementFormViewModels: FormViewModelCollection<MeasurementSurveyFormViewModel, MeasurementSurveyFormData> - +form: FormGroup - +measurementViewModels: List<MeasurementSurveyFormViewModel> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +measurementRequired: dynamic - +titles: Map<FormMode, String> - - - - - - +void read() - +void setControlsFrom() - +MeasurementsFormData buildFormData() - +List<ModelAction<dynamic>> availableActions() - +List<ModelAction<dynamic>> availablePopupActions() - +List<ModelAction<dynamic>> availableInlineActions() - +void onSelectItem() - +void onNewItem() - +MeasurementSurveyFormViewModel provide() - +void onCancel() - +dynamic onSave() - - - - - - - - - - - - - StudyFormScaffold - - - - - - +studyId: String - +formViewModelBuilder: T Function(WidgetRef) - +formViewBuilder: Widget Function(T) - - - - - - +Widget build() - - - - - - - - - - - T Function(WidgetRef) - - - - - - - - - - - Widget Function(T) - - - - - - - - - - - - - ConsentItemFormViewModel - - - - - - +consentIdControl: FormControl<String> - +titleControl: FormControl<String> - +descriptionControl: FormControl<String> - +iconControl: FormControl<IconOption> - +form: FormGroup - +consentId: String - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titleRequired: dynamic - +descriptionRequired: dynamic - +titles: Map<FormMode, String> - - - - - - +void setControlsFrom() - +ConsentItemFormData buildFormData() - +ConsentItemFormViewModel createDuplicate() - - - - - - - - - - - - StudyDesignEnrollmentFormView - - - - - - +Widget build() - -dynamic _showScreenerQuestionSidesheetWithArgs() - -dynamic _showConsentItemSidesheetWithArgs() - - - - - - - - - - - - IScreenerQuestionLogicFormViewModel - - - - - - +isDirtyOptionsBannerVisible: bool - - - - - - - - - - - - - ScreenerQuestionLogicFormView - - - - - - +formViewModel: ScreenerQuestionFormViewModel - - - - - - +Widget build() - -dynamic _buildInfoBanner() - -dynamic _buildAnswerOptionsLogicControls() - -List<Widget> _buildOptionLogicRow() - - - - - - - - - - - - - ScreenerQuestionFormViewModel - - - - - - <static>+defaultResponseOptionValidity: bool - +responseOptionsDisabledArray: FormArray<dynamic> - +responseOptionsLogicControls: FormArray<bool> - +responseOptionsLogicDescriptionControls: FormArray<String> - -_questionBaseControls: Map<String, AbstractControl<dynamic>> - +prevResponseOptionControls: List<AbstractControl<dynamic>> - +prevResponseOptionValues: List<dynamic> - +responseOptionsDisabledControls: List<AbstractControl<dynamic>> - +logicControlOptions: List<FormControlOption<bool>> - +questionBaseControls: Map<String, AbstractControl<dynamic>> - +isDirtyOptionsBannerVisible: bool - - - - - - +dynamic onResponseOptionsChanged() - +void setControlsFrom() - +QuestionFormData buildFormData() - -List<FormControl<dynamic>> _copyFormControls() - -AbstractControl<dynamic>? _findAssociatedLogicControlFor() - -AbstractControl<dynamic>? _findAssociatedControlFor() - +ScreenerQuestionFormViewModel createDuplicate() - - - - - - - - - - - - - ConsentItemFormData - - - - - - +consentId: String - +title: String - +description: String - +iconName: String? - +id: String - - - - - - +ConsentItem toConsentItem() - +ConsentItemFormData copy() - - - - - - - - - - - - ConsentItemFormView - - - - - - +formViewModel: ConsentItemFormViewModel - - - - - - - - - - - - - EnrollmentFormData - - - - - - <static>+kDefaultEnrollmentType: Participation - +enrollmentType: Participation - +questionnaireFormData: QuestionnaireFormData - +consentItemsFormData: List<ConsentItemFormData>? - +id: String - - - - - - +Study apply() - +EnrollmentFormData copy() - - - - - - - - - - - Participation - - - - - - - - - - - - - QuestionFormViewModel - - - - - - <static>+defaultQuestionType: SurveyQuestionType - -_titles: Map<FormMode, String Function()>? - +questionIdControl: FormControl<String> - +questionTypeControl: FormControl<SurveyQuestionType> - +questionTextControl: FormControl<String> - +questionInfoTextControl: FormControl<String> - +questionBaseControls: Map<String, AbstractControl<dynamic>> - +isMultipleChoiceControl: FormControl<bool> - +choiceResponseOptionsArray: FormArray<dynamic> - +customOptionsMin: int - +customOptionsMax: int - +customOptionsInitial: int - +boolResponseOptionsArray: FormArray<String> - +imageResponseOptionsArray: FormArray<String> - <static>+kDefaultMaxRecordingDurationSeconds: int - <static>+kMaxRecordingDurationSeconds: int - +audioResponseOptionsArray: FormArray<String> - +maxRecordingDurationSecondsControl: FormControl<int> - <static>+kDefaultScaleMinValue: int - <static>+kDefaultScaleMaxValue: int - <static>+kNumMidValueControls: int - <static>+kMidValueDebounceMilliseconds: int - +scaleMinValueControl: FormControl<int> - +scaleMaxValueControl: FormControl<int> - -_scaleRangeControl: FormControl<int> - +scaleMinLabelControl: FormControl<String> - +scaleMaxLabelControl: FormControl<String> - +scaleMidValueControls: FormArray<int> - +scaleMidLabelControls: FormArray<String?> - -_scaleResponseOptionsArray: FormArray<int> - +scaleMinColorControl: FormControl<SerializableColor> - +scaleMaxColorControl: FormControl<SerializableColor> - +prevMidValues: List<int?>? - +freeTextTypeControl: FormControl<FreeTextQuestionType> - +customRegexControl: FormControl<String> - +freeTextResponseOptionsArray: FormArray<dynamic> - +freeTextLengthMin: AbstractControl<int> - +freeTextLengthMax: AbstractControl<int> - +freeTextExampleTextControl: FormControl<String> - <static>+kDefaultFreeTextMinLength: int - <static>+kDefaultFreeTextMaxLength: int - +freeTextLengthControl: FormControl<RangeValues> - -_controlsByQuestionType: Map<SurveyQuestionType, FormGroup> - -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - -_validationConfigsByQuestionType: Map<SurveyQuestionType, Map<FormValidationSetEnum, List<FormControlValidation>>> - +form: FormGroup - +questionId: String - +questionType: SurveyQuestionType - +questionTypeControlOptions: List<FormControlOption<SurveyQuestionType>> - +answerOptionsArray: FormArray<dynamic> - +answerOptionsControls: List<AbstractControl<dynamic>> - +validAnswerOptions: List<String> - +boolOptions: List<AbstractControl<String>> - +imageOptions: List<AbstractControl<String>> - +audioOptions: List<AbstractControl<String>> - +scaleMinValue: int - +scaleMaxValue: int - +scaleRange: int - +scaleAllValueControls: List<AbstractControl<int>> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +questionTextRequired: dynamic - +numValidChoiceOptions: dynamic - +scaleRangeValid: dynamic - +maxRecordingDurationValid: dynamic - +titles: Map<FormMode, String> - +isAddOptionButtonVisible: bool - +isMidValuesClearedInfoVisible: bool - - - - - - +String? scaleMidLabelAt() - -dynamic _onScaleRangeChanged() - -dynamic _applyInputFormatters() - -dynamic _updateScaleMidValueControls() - -Map<String, dynamic>? _validateFreeText() - -dynamic _onFreeTextLengthChanged() - -List<FormControlValidation> _getValidationConfig() - +dynamic onQuestionTypeChanged() - +dynamic onResponseOptionsChanged() - -void _updateFormControls() - +void initControls() - +void setControlsFrom() - +QuestionFormData buildFormData() - +List<ModelAction<dynamic>> availableActions() - +void onNewItem() - +void onSelectItem() - +dynamic save() - +QuestionFormViewModel createDuplicate() - - - - - - - - - - - - - EnrollmentFormViewModel - - - - - - +study: Study - +router: GoRouter - +consentItemDelegate: EnrollmentFormConsentItemDelegate - +enrollmentTypeControl: FormControl<Participation> - +consentItemArray: FormArray<dynamic> - +consentItemFormViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData> - +form: FormGroup - +enrollmentTypeControlOptions: List<FormControlOption<Participation>> - +consentItemModels: List<ConsentItemFormViewModel> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titles: Map<FormMode, String> - +canTestScreener: bool - +canTestConsent: bool - +questionTitles: Map<FormMode, String Function()> - - - - - - +void setControlsFrom() - +EnrollmentFormData buildFormData() - +void read() - +List<ModelAction<dynamic>> availableActions() - +List<ModelAction<dynamic>> availablePopupActions() - +List<ModelAction<dynamic>> availableInlineActions() - +void onSelectItem() - +void onNewItem() - +ScreenerQuestionFormRouteArgs buildNewScreenerQuestionFormRouteArgs() - +ScreenerQuestionFormRouteArgs buildScreenerQuestionFormRouteArgs() - +ConsentItemFormRouteArgs buildNewConsentItemFormRouteArgs() - +ConsentItemFormRouteArgs buildConsentItemFormRouteArgs() - +dynamic testScreener() - +dynamic testConsent() - +ScreenerQuestionFormViewModel provideQuestionFormViewModel() - - - - - - - - - - - - - EnrollmentFormConsentItemDelegate - - - - - - +formViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData> - +owner: EnrollmentFormViewModel - +propagateOnSave: bool - +validationSet: dynamic - - - - - - +void onCancel() - +dynamic onSave() - +ConsentItemFormViewModel provide() - +List<ModelAction<dynamic>> availableActions() - +void onNewItem() - +void onSelectItem() - - - - - - - - - - - - - StudyFormViewModel - - - - - - +studyDirtyCopy: Study? - +studyRepository: IStudyRepository - +authRepository: IAuthRepository - +router: GoRouter - +studyInfoFormViewModel: StudyInfoFormViewModel - +enrollmentFormViewModel: EnrollmentFormViewModel - +measurementsFormViewModel: MeasurementsFormViewModel - +reportsFormViewModel: ReportsFormViewModel - +interventionsFormViewModel: InterventionsFormViewModel - +form: FormGroup - +isStudyReadonly: bool - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titles: Map<FormMode, String> - - - - - - +void read() - +void setControlsFrom() - +Study buildFormData() - +void dispose() - +void onCancel() - +dynamic onSave() - -dynamic _applyAndSaveSubform() - - - - - - - - - - - IStudyRepository - - - - - - - - - - - IAuthRepository - - - - - - - - - - - - - QuestionFormData - - - - - - <static>+questionTypeFormDataFactories: Map<SurveyQuestionType, QuestionFormData Function(Question<dynamic>, List<EligibilityCriterion>)> - +questionId: String - +questionText: String - +questionInfoText: String? - +questionType: SurveyQuestionType - +responseOptionsValidity: Map<dynamic, bool> - +responseOptions: List<dynamic> - +id: String - - - - - - +Question<dynamic> toQuestion() - +EligibilityCriterion toEligibilityCriterion() - +Answer<dynamic> constructAnswerFor() - +dynamic setResponseOptionsValidityFrom() - +QuestionFormData copy() - - - - - - - - - - - - SurveyQuestionType - - - - - - +index: int - <static>+values: List<SurveyQuestionType> - <static>+choice: SurveyQuestionType - <static>+bool: SurveyQuestionType - <static>+scale: SurveyQuestionType - <static>+image: SurveyQuestionType - <static>+audio: SurveyQuestionType - <static>+freeText: SurveyQuestionType - - - - - - - - - - - - - ChoiceQuestionFormData - - - - - - +isMultipleChoice: bool - +answerOptions: List<String> - +responseOptions: List<String> - - - - - - +Question<dynamic> toQuestion() - +QuestionFormData copy() - -Choice _buildChoiceForValue() - +Answer<dynamic> constructAnswerFor() - - - - - - - - - - - - - BoolQuestionFormData - - - - - - <static>+kResponseOptions: Map<String, bool> - +responseOptions: List<String> - - - - - - +Question<dynamic> toQuestion() - +BoolQuestionFormData copy() - +Answer<dynamic> constructAnswerFor() - - - - - - - - - - - - - ImageQuestionFormData - - - - - - <static>+kResponseOptions: Map<String, FutureBlobFile> - +responseOptions: List<String> - - - - - - +Question<dynamic> toQuestion() - +ImageQuestionFormData copy() - +Answer<dynamic> constructAnswerFor() - - - - - - - - - - - - - AudioQuestionFormData - - - - - - +maxRecordingDurationSeconds: int - <static>+kResponseOptions: Map<String, FutureBlobFile> - +responseOptions: List<String> - - - - - - +Question<dynamic> toQuestion() - +AudioQuestionFormData copy() - +Answer<dynamic> constructAnswerFor() - - - - - - - - - - - - - ScaleQuestionFormData - - - - - - +minValue: double - +maxValue: double - +minLabel: String? - +maxLabel: String? - +midValues: List<double?> - +midLabels: List<String?> - +stepSize: double - +initialValue: double? - +minColor: Color? - +maxColor: Color? - +responseOptions: List<double> - +midAnnotations: List<Annotation> - - - - - - +ScaleQuestion toQuestion() - +QuestionFormData copy() - +Answer<dynamic> constructAnswerFor() - - - - - - - - - - - Color - - - - - - - - - - - - - FreeTextQuestionFormData - - - - - - +textLengthRange: List<int> - +textType: FreeTextQuestionType - +textTypeExpression: String? - +responseOptions: List<String> - - - - - - +Question<dynamic> toQuestion() - +FreeTextQuestionFormData copy() - +Answer<dynamic> constructAnswerFor() - - - - - - - - - - - FreeTextQuestionType - - - - - - - - - - - - - AudioRecordingQuestionFormView - - - - - - +formViewModel: QuestionFormViewModel - - - - - - +Widget build() - - - - - - - - - - - - - FreeTextQuestionFormView - - - - - - +formViewModel: QuestionFormViewModel - +generateLabelHelpTextMap: dynamic - - - - - - +Widget build() - +Widget disableOnReadonly() - +Widget generateRow() - - - - - - - - - - - - - ImageCapturingQuestionFormView - - - - - - +formViewModel: QuestionFormViewModel - - - - - - +Widget build() - - - - - - - - - - - - IScaleQuestionFormViewModel - - - - - - +isMidValuesClearedInfoVisible: bool - - - - - - - - - - - - ScaleQuestionFormView - - - - - - +formViewModel: QuestionFormViewModel - - - - - - - - - - - - - ChoiceQuestionFormView - - - - - - +formViewModel: QuestionFormViewModel - - - - - - +Widget build() - - - - - - - - - - - - - BoolQuestionFormView - - - - - - +formViewModel: QuestionFormViewModel - - - - - - +Widget build() - - - - - - - - - - - AbstractControl - - - - - - - - - - - - SurveyQuestionFormView - - - - - - +formViewModel: QuestionFormViewModel - +isHtmlStyleable: bool - - - - - - - - - - - StudyUTimeOfDay - - - - - - - - - - - - - ScheduleControls - - - - - - +formViewModel: WithScheduleControls - - - - - - +Widget build() - -List<FormTableRow> _conditionalTimeRestrictions() - - - - - - - - - - - StreamSubscription - - - - - - - - - - - StudyPageWidget - - - - - - - - - \ No newline at end of file From b241d3788fa8ab9ea4f4500d95ee7ff4602444f3 Mon Sep 17 00:00:00 2001 From: Johannes Vedder Date: Mon, 13 May 2024 14:37:12 +0200 Subject: [PATCH 046/314] chore: remove outdated cli --- .gitignore | 2 - CONTRIBUTING.md | 3 - docker/.gitignore | 3 - docker/README.md | 118 ------ docker/load-test/k6.js | 27 -- docker/manual_config_instructions.md | 252 ------------- docker/nginx/proxy/01_common.conf.template | 8 - .../proxy/02_common_location.conf.template | 6 - docker/nginx/proxy/03_supabase.conf.template | 121 ------ docker/nginx/proxy/04_studyu.conf.template | 40 -- docker/nginx/proxy/ssl.conf.example.template | 9 - docker/nginx/studyu/component.conf.template | 28 -- docker/proxy/.env.example | 10 - docker/proxy/docker-compose-proxy.yml | 21 -- docker/studyu/Dockerfile | 41 -- docker/studyu/docker-compose-app.yml | 23 -- docker/studyu/docker-compose-designer.yml | 23 -- docker/studyu/init_studyu.sh | 7 - docker/supabase/.env.example | 104 ------ docker/supabase/.gitignore | 5 - docker/supabase/README.md | 6 - docker/supabase/config.toml | 108 ------ docker/supabase/docker-compose-db.yml | 50 --- docker/supabase/docker-compose.yml | 268 -------------- docker/supabase/scripts/.gitignore | 2 - docker/supabase/scripts/dump_data.sh | 38 -- docker/supabase/scripts/dump_schema.sh | 56 --- docker/supabase/scripts/execute_sql.sh | 46 --- .../tests/000-supabase_test_helpers.sql | 267 ------------- .../tests/001_generic_test_helpers.sql | 45 --- docker/supabase/tests/010-study.sql | 350 ------------------ docker/supabase/volumes/api/kong.yml | 223 ----------- docker/supabase/volumes/db/init/data.sql | 0 docker/supabase/volumes/db/jwt.sql | 5 - docker/supabase/volumes/db/logs.sql | 4 - docker/supabase/volumes/db/realtime.sql | 4 - docker/supabase/volumes/db/roles.sql | 8 - docker/supabase/volumes/db/webhooks.sql | 208 ----------- .../supabase/volumes/functions/hello/index.ts | 16 - .../supabase/volumes/functions/main/index.ts | 94 ----- docker/supabase/volumes/logs/vector.yml | 232 ------------ 41 files changed, 2881 deletions(-) delete mode 100644 docker/.gitignore delete mode 100644 docker/README.md delete mode 100644 docker/load-test/k6.js delete mode 100644 docker/manual_config_instructions.md delete mode 100644 docker/nginx/proxy/01_common.conf.template delete mode 100644 docker/nginx/proxy/02_common_location.conf.template delete mode 100644 docker/nginx/proxy/03_supabase.conf.template delete mode 100644 docker/nginx/proxy/04_studyu.conf.template delete mode 100644 docker/nginx/proxy/ssl.conf.example.template delete mode 100644 docker/nginx/studyu/component.conf.template delete mode 100644 docker/proxy/.env.example delete mode 100644 docker/proxy/docker-compose-proxy.yml delete mode 100644 docker/studyu/Dockerfile delete mode 100644 docker/studyu/docker-compose-app.yml delete mode 100644 docker/studyu/docker-compose-designer.yml delete mode 100644 docker/studyu/init_studyu.sh delete mode 100644 docker/supabase/.env.example delete mode 100644 docker/supabase/.gitignore delete mode 100644 docker/supabase/README.md delete mode 100644 docker/supabase/config.toml delete mode 100644 docker/supabase/docker-compose-db.yml delete mode 100644 docker/supabase/docker-compose.yml delete mode 100644 docker/supabase/scripts/.gitignore delete mode 100755 docker/supabase/scripts/dump_data.sh delete mode 100755 docker/supabase/scripts/dump_schema.sh delete mode 100755 docker/supabase/scripts/execute_sql.sh delete mode 100644 docker/supabase/tests/000-supabase_test_helpers.sql delete mode 100644 docker/supabase/tests/001_generic_test_helpers.sql delete mode 100644 docker/supabase/tests/010-study.sql delete mode 100644 docker/supabase/volumes/api/kong.yml delete mode 100644 docker/supabase/volumes/db/init/data.sql delete mode 100644 docker/supabase/volumes/db/jwt.sql delete mode 100644 docker/supabase/volumes/db/logs.sql delete mode 100644 docker/supabase/volumes/db/realtime.sql delete mode 100644 docker/supabase/volumes/db/roles.sql delete mode 100644 docker/supabase/volumes/db/webhooks.sql delete mode 100644 docker/supabase/volumes/functions/hello/index.ts delete mode 100644 docker/supabase/volumes/functions/main/index.ts delete mode 100644 docker/supabase/volumes/logs/vector.yml diff --git a/.gitignore b/.gitignore index 31b83767e..be6206318 100644 --- a/.gitignore +++ b/.gitignore @@ -144,8 +144,6 @@ app.*.symbols pubspec_overrides.yaml # Selfhost -backup/ -.cli_config flutter_common/lib/envs/.env.local # generated git project files diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index fe7f35f17..b14ab8853 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -21,9 +21,6 @@ executing Melos scripts. Use `melos - - - + diff --git a/designer_v2/web/index.html b/designer_v2/web/index.html index 40041af31..9d3acfe06 100644 --- a/designer_v2/web/index.html +++ b/designer_v2/web/index.html @@ -35,31 +35,8 @@ Designer | StudyU Health - - - - - + From 59af4ec47aa242a3d7238bf1ff983a51ec695b9b Mon Sep 17 00:00:00 2001 From: Johannes Vedder Date: Mon, 13 May 2024 23:55:29 +0200 Subject: [PATCH 110/314] chore: upgrade deps --- app/pubspec.lock | 36 ++++++++++++++--------------- app/pubspec.yaml | 2 +- designer_v2/pubspec.lock | 45 +++++++++++++++++++------------------ designer_v2/pubspec.yaml | 6 +++++ flutter_common/pubspec.lock | 24 ++++++++++---------- 5 files changed, 60 insertions(+), 53 deletions(-) diff --git a/app/pubspec.lock b/app/pubspec.lock index 8fda1fbd1..4dcbdb9b8 100644 --- a/app/pubspec.lock +++ b/app/pubspec.lock @@ -93,18 +93,18 @@ packages: dependency: "direct main" description: name: camera - sha256: dfa8fc5a1adaeb95e7a54d86a5bd56f4bb0e035515354c8ac6d262e35cec2ec8 + sha256: cf8ed1789aa244392cfc49d13e97879700476ba641c92500e01f630e109c0f6c url: "https://pub.dev" source: hosted - version: "0.10.6" - camera_android: + version: "0.11.0" + camera_android_camerax: dependency: transitive description: - name: camera_android - sha256: "7b0aba6398afa8475e2bc9115d976efb49cf8db781e922572d443795c04a4f4f" + name: camera_android_camerax + sha256: a2aac9505259a86d5eb6b0a14116b9a64f34a4735009f47731e59834218a5a29 url: "https://pub.dev" source: hosted - version: "0.10.9+1" + version: "0.6.5+1" camera_avfoundation: dependency: transitive description: @@ -625,26 +625,26 @@ packages: dependency: transitive description: name: leak_tracker - sha256: "78eb209deea09858f5269f5a5b02be4049535f568c07b275096836f01ea323fa" + sha256: "7f0df31977cb2c0b88585095d168e689669a2cc9b97c309665e3386f3e9d341a" url: "https://pub.dev" source: hosted - version: "10.0.0" + version: "10.0.4" leak_tracker_flutter_testing: dependency: transitive description: name: leak_tracker_flutter_testing - sha256: b46c5e37c19120a8a01918cfaf293547f47269f7cb4b0058f21531c2465d6ef0 + sha256: "06e98f569d004c1315b991ded39924b21af84cf14cc94791b8aea337d25b57f8" url: "https://pub.dev" source: hosted - version: "2.0.1" + version: "3.0.3" leak_tracker_testing: dependency: transitive description: name: leak_tracker_testing - sha256: a597f72a664dbd293f3bfc51f9ba69816f84dcd403cdac7066cb3f6003f3ab47 + sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3" url: "https://pub.dev" source: hosted - version: "2.0.1" + version: "3.0.1" lints: dependency: transitive description: @@ -697,10 +697,10 @@ packages: dependency: transitive description: name: meta - sha256: d584fa6707a52763a52446f02cc621b077888fb63b93bbcb1143a7be5a0c0c04 + sha256: "7687075e408b093f36e6bbf6c91878cc0d4cd10f409506f7bc996f68220b9136" url: "https://pub.dev" source: hosted - version: "1.11.0" + version: "1.12.0" mime: dependency: transitive description: @@ -1220,10 +1220,10 @@ packages: dependency: transitive description: name: test_api - sha256: "5c2f730018264d276c20e4f1503fd1308dfbbae39ec8ee63c5236311ac06954b" + sha256: "9955ae474176f7ac8ee4e989dadfb411a58c30415bcfb648fa04b2b8a03afa7f" url: "https://pub.dev" source: hosted - version: "0.6.1" + version: "0.7.0" timeline_tile: dependency: "direct main" description: @@ -1412,10 +1412,10 @@ packages: dependency: transitive description: name: vm_service - sha256: b3d56ff4341b8f182b96aceb2fa20e3dcb336b9f867bc0eafc0de10f1048e957 + sha256: "3923c89304b715fb1eb6423f017651664a03bf5f4b29983627c4da791f74a4ec" url: "https://pub.dev" source: hosted - version: "13.0.0" + version: "14.2.1" wakelock_plus: dependency: "direct main" description: diff --git a/app/pubspec.yaml b/app/pubspec.yaml index 8599dffca..41a7b0e33 100644 --- a/app/pubspec.yaml +++ b/app/pubspec.yaml @@ -8,7 +8,7 @@ repository: https://github.com/hpi-studyu/studyu environment: sdk: '>=3.2.0 <4.0.0' dependencies: - camera: ^0.10.6 + camera: ^0.11.0 collection: ^1.18.0 cross_file: ^0.3.4+1 cupertino_icons: ^1.0.8 diff --git a/designer_v2/pubspec.lock b/designer_v2/pubspec.lock index d76411159..899f3dd47 100644 --- a/designer_v2/pubspec.lock +++ b/designer_v2/pubspec.lock @@ -241,10 +241,11 @@ packages: flutter_colorpicker: dependency: "direct main" description: - name: flutter_colorpicker - sha256: "458a6ed8ea480eb16ff892aedb4b7092b2804affd7e046591fb03127e8d8ef8b" - url: "https://pub.dev" - source: hosted + path: "." + ref: master + resolved-ref: "92bdb69a313a56c391ef148c12ef6539bd31253d" + url: "https://github.com/mchome/flutter_colorpicker" + source: git version: "1.0.3" flutter_dotenv: dependency: transitive @@ -456,10 +457,10 @@ packages: dependency: transitive description: name: intl - sha256: "3bc132a9dbce73a7e4a21a17d06e1878839ffbf975568bc875c60537824b0c4d" + sha256: d6f56758b7d3014a48af9701c085700aac781a92a87a62b1333b46d8879661cf url: "https://pub.dev" source: hosted - version: "0.18.1" + version: "0.19.0" io: dependency: transitive description: @@ -496,26 +497,26 @@ packages: dependency: transitive description: name: leak_tracker - sha256: "78eb209deea09858f5269f5a5b02be4049535f568c07b275096836f01ea323fa" + sha256: "7f0df31977cb2c0b88585095d168e689669a2cc9b97c309665e3386f3e9d341a" url: "https://pub.dev" source: hosted - version: "10.0.0" + version: "10.0.4" leak_tracker_flutter_testing: dependency: transitive description: name: leak_tracker_flutter_testing - sha256: b46c5e37c19120a8a01918cfaf293547f47269f7cb4b0058f21531c2465d6ef0 + sha256: "06e98f569d004c1315b991ded39924b21af84cf14cc94791b8aea337d25b57f8" url: "https://pub.dev" source: hosted - version: "2.0.1" + version: "3.0.3" leak_tracker_testing: dependency: transitive description: name: leak_tracker_testing - sha256: a597f72a664dbd293f3bfc51f9ba69816f84dcd403cdac7066cb3f6003f3ab47 + sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3" url: "https://pub.dev" source: hosted - version: "2.0.1" + version: "3.0.1" lints: dependency: transitive description: @@ -568,10 +569,10 @@ packages: dependency: transitive description: name: meta - sha256: d584fa6707a52763a52446f02cc621b077888fb63b93bbcb1143a7be5a0c0c04 + sha256: "7687075e408b093f36e6bbf6c91878cc0d4cd10f409506f7bc996f68220b9136" url: "https://pub.dev" source: hosted - version: "1.11.0" + version: "1.12.0" mime: dependency: transitive description: @@ -1091,26 +1092,26 @@ packages: dependency: "direct dev" description: name: test - sha256: a1f7595805820fcc05e5c52e3a231aedd0b72972cb333e8c738a8b1239448b6f + sha256: "7ee446762c2c50b3bd4ea96fe13ffac69919352bd3b4b17bac3f3465edc58073" url: "https://pub.dev" source: hosted - version: "1.24.9" + version: "1.25.2" test_api: dependency: transitive description: name: test_api - sha256: "5c2f730018264d276c20e4f1503fd1308dfbbae39ec8ee63c5236311ac06954b" + sha256: "9955ae474176f7ac8ee4e989dadfb411a58c30415bcfb648fa04b2b8a03afa7f" url: "https://pub.dev" source: hosted - version: "0.6.1" + version: "0.7.0" test_core: dependency: transitive description: name: test_core - sha256: a757b14fc47507060a162cc2530d9a4a2f92f5100a952c7443b5cad5ef5b106a + sha256: "2bc4b4ecddd75309300d8096f781c0e3280ca1ef85beda558d33fcbedc2eead4" url: "https://pub.dev" source: hosted - version: "0.5.9" + version: "0.6.0" typed_data: dependency: transitive description: @@ -1203,10 +1204,10 @@ packages: dependency: transitive description: name: vm_service - sha256: b3d56ff4341b8f182b96aceb2fa20e3dcb336b9f867bc0eafc0de10f1048e957 + sha256: "3923c89304b715fb1eb6423f017651664a03bf5f4b29983627c4da791f74a4ec" url: "https://pub.dev" source: hosted - version: "13.0.0" + version: "14.2.1" watcher: dependency: transitive description: diff --git a/designer_v2/pubspec.yaml b/designer_v2/pubspec.yaml index 4beebd13e..6fe718a08 100644 --- a/designer_v2/pubspec.yaml +++ b/designer_v2/pubspec.yaml @@ -39,6 +39,12 @@ dependencies: url_launcher: ^6.2.6 uuid: ^4.4.0 +dependency_overrides: + flutter_colorpicker: # todo this package is outdated and should be replaced, if possible because reactive_color_picker depends on it + git: + url: https://github.com/mchome/flutter_colorpicker + ref: master # or 786d04363f587b818ce585d25b9c2bb62de95aba + dev_dependencies: custom_lint: flutter_launcher_icons: ^0.13.1 diff --git a/flutter_common/pubspec.lock b/flutter_common/pubspec.lock index bfe5e83fe..816c0d9aa 100644 --- a/flutter_common/pubspec.lock +++ b/flutter_common/pubspec.lock @@ -244,26 +244,26 @@ packages: dependency: transitive description: name: leak_tracker - sha256: "78eb209deea09858f5269f5a5b02be4049535f568c07b275096836f01ea323fa" + sha256: "7f0df31977cb2c0b88585095d168e689669a2cc9b97c309665e3386f3e9d341a" url: "https://pub.dev" source: hosted - version: "10.0.0" + version: "10.0.4" leak_tracker_flutter_testing: dependency: transitive description: name: leak_tracker_flutter_testing - sha256: b46c5e37c19120a8a01918cfaf293547f47269f7cb4b0058f21531c2465d6ef0 + sha256: "06e98f569d004c1315b991ded39924b21af84cf14cc94791b8aea337d25b57f8" url: "https://pub.dev" source: hosted - version: "2.0.1" + version: "3.0.3" leak_tracker_testing: dependency: transitive description: name: leak_tracker_testing - sha256: a597f72a664dbd293f3bfc51f9ba69816f84dcd403cdac7066cb3f6003f3ab47 + sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3" url: "https://pub.dev" source: hosted - version: "2.0.1" + version: "3.0.1" lints: dependency: transitive description: @@ -300,10 +300,10 @@ packages: dependency: transitive description: name: meta - sha256: d584fa6707a52763a52446f02cc621b077888fb63b93bbcb1143a7be5a0c0c04 + sha256: "7687075e408b093f36e6bbf6c91878cc0d4cd10f409506f7bc996f68220b9136" url: "https://pub.dev" source: hosted - version: "1.11.0" + version: "1.12.0" mime: dependency: transitive description: @@ -584,10 +584,10 @@ packages: dependency: transitive description: name: test_api - sha256: "5c2f730018264d276c20e4f1503fd1308dfbbae39ec8ee63c5236311ac06954b" + sha256: "9955ae474176f7ac8ee4e989dadfb411a58c30415bcfb648fa04b2b8a03afa7f" url: "https://pub.dev" source: hosted - version: "0.6.1" + version: "0.7.0" typed_data: dependency: transitive description: @@ -680,10 +680,10 @@ packages: dependency: transitive description: name: vm_service - sha256: b3d56ff4341b8f182b96aceb2fa20e3dcb336b9f867bc0eafc0de10f1048e957 + sha256: "3923c89304b715fb1eb6423f017651664a03bf5f4b29983627c4da791f74a4ec" url: "https://pub.dev" source: hosted - version: "13.0.0" + version: "14.2.1" web: dependency: transitive description: From 0446baf5e878517cc87b7763eb3afc5817193ff7 Mon Sep 17 00:00:00 2001 From: Johannes Vedder Date: Tue, 14 May 2024 17:12:47 +0200 Subject: [PATCH 111/314] style: visual fixes for flutter 3.22 --- designer_v2/lib/theme.dart | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/designer_v2/lib/theme.dart b/designer_v2/lib/theme.dart index 73e44ebd0..1cceba685 100644 --- a/designer_v2/lib/theme.dart +++ b/designer_v2/lib/theme.dart @@ -131,10 +131,18 @@ class ThemeProvider extends InheritedWidget { ColorScheme colors(Brightness brightness, Color? targetColor) { final dynamicPrimary = brightness == Brightness.light ? lightDynamic?.primary : darkDynamic?.primary; - return ColorScheme.fromSeed( + final scheme = SchemeFidelity(sourceColorHct: dynamicPrimary != null + ? Hct.fromInt(dynamicPrimary.value) + : Hct.fromInt(source(targetColor).value), isDark: false, contrastLevel: 0.0); + final colorScheme = ColorScheme.fromSeed( seedColor: dynamicPrimary ?? source(targetColor), + // todo use dynamicSchemeVariant once its in the flutter stable channel + // dynamicSchemeVariant: DynamicSchemeVariant.fidelity, brightness: brightness, ); + return colorScheme.copyWith( + primary: Color(MaterialDynamicColors.primary.getArgb(scheme)), + ); } ShapeBorder get shapeMedium => RoundedRectangleBorder( @@ -255,7 +263,7 @@ class ThemeProvider extends InheritedWidget { focusColor: Colors.white, isDense: true, hintStyle: TextStyle(color: colors.onSurfaceVariant.withOpacity(0.4)), - //contentPadding: EdgeInsets.fromLTRB(16.0, 16.0, 16.0, 16.0), + contentPadding: const EdgeInsets.fromLTRB(16.0, 16.0, 16.0, 16.0), disabledBorder: OutlineInputBorder( borderRadius: BorderRadius.circular(5), borderSide: BorderSide( @@ -326,9 +334,7 @@ class ThemeProvider extends InheritedWidget { } DrawerThemeData drawerTheme(ColorScheme colors) { - return const DrawerThemeData( - backgroundColor: Colors.white, - ); + return const DrawerThemeData(); } IconThemeData iconTheme(ColorScheme colors) { From 8755ba903c17158ab84b2b9da1c4503b75b23801 Mon Sep 17 00:00:00 2001 From: Johannes Vedder Date: Tue, 14 May 2024 17:13:59 +0200 Subject: [PATCH 112/314] fix: Flutter 3.22 arg error --- designer_v2/lib/repositories/supabase_client.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/designer_v2/lib/repositories/supabase_client.dart b/designer_v2/lib/repositories/supabase_client.dart index 1d92f8e10..146bde635 100644 --- a/designer_v2/lib/repositories/supabase_client.dart +++ b/designer_v2/lib/repositories/supabase_client.dart @@ -31,7 +31,7 @@ typedef PostgrestDataCallback = Object Function(dynamic data); mixin SupabaseQueryMixin on SupabaseClientDependant { // - Networking - Future> deleteAll(Map selectionCriteria) async { + Future> deleteAll(Map selectionCriteria) async { try { final data = await supabaseClient.from(tableName(T)).delete().match(selectionCriteria); if (data == null) return []; From ee9d454c6be130798df393bcfbbe42f238426ccc Mon Sep 17 00:00:00 2001 From: Johannes Vedder Date: Tue, 14 May 2024 17:16:19 +0200 Subject: [PATCH 113/314] chore: upgrade deps --- app/pubspec.lock | 72 ++++++++++++++++++------------------- app/pubspec.yaml | 8 ++--- core/pubspec.lock | 55 +++++++++++++++++----------- core/pubspec.yaml | 4 +-- designer_v2/pubspec.lock | 56 ++++++++++++++--------------- designer_v2/pubspec.yaml | 10 +++--- flutter_common/pubspec.lock | 44 +++++++++++------------ flutter_common/pubspec.yaml | 2 +- 8 files changed, 132 insertions(+), 119 deletions(-) diff --git a/app/pubspec.lock b/app/pubspec.lock index 4dcbdb9b8..c5eb46f26 100644 --- a/app/pubspec.lock +++ b/app/pubspec.lock @@ -5,18 +5,18 @@ packages: dependency: transitive description: name: app_links - sha256: "0fd41f0501f131d931251e0942ac63d6216096a0052aeca037915c2c1deeb121" + sha256: "8c6ef5ba9e26b720d4c9073826befb87df2ab5e7a81c22b6c3145080b5e736c9" url: "https://pub.dev" source: hosted - version: "5.0.0" + version: "6.0.2" archive: dependency: transitive description: name: archive - sha256: "0763b45fa9294197a2885c8567927e2830ade852e5c896fd4ab7e0e348d0f373" + sha256: ecf4273855368121b1caed0d10d4513c7241dfc813f7d3c8933b36622ae9b265 url: "https://pub.dev" source: hosted - version: "3.5.0" + version: "3.5.1" args: dependency: transitive description: @@ -457,10 +457,10 @@ packages: dependency: transitive description: name: functions_client - sha256: a70b0dd9a1c35d05d1141557f7e49ffe4de5f450ffde31755a9eeeadca03b8ee + sha256: "48659e5c6a4bbe02659102bf6406a0cf39142202deae65aacfa78688f2e68946" url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.2.0" fwfh_cached_network_image: dependency: transitive description: @@ -513,10 +513,10 @@ packages: dependency: transitive description: name: gotrue - sha256: c9c984f088320a5c5e87c7a34571e3de3982cca4cbd8b978e59d36baf748edfb + sha256: aaefc58b168723f8b5ca2a70ee8c0a051cba16f112be50f41c1ff8fb96b6a6df url: "https://pub.dev" source: hosted - version: "2.6.1" + version: "2.7.0" gtk: dependency: transitive description: @@ -777,10 +777,10 @@ packages: dependency: transitive description: name: path_provider_foundation - sha256: "5a7999be66e000916500be4f15a3633ebceb8302719b47b9cc49ce924125350f" + sha256: f234384a3fdd67f989b4d54a5d73ca2a6c422fa55ae694381ae0f4375cd1ea16 url: "https://pub.dev" source: hosted - version: "2.3.2" + version: "2.4.0" path_provider_linux: dependency: transitive description: @@ -825,10 +825,10 @@ packages: dependency: transitive description: name: permission_handler_android - sha256: "1acac6bae58144b442f11e66621c062aead9c99841093c38f5bcdcc24c1c3474" + sha256: "8bb852cd759488893805c3161d0b2b5db55db52f773dbb014420b304055ba2c5" url: "https://pub.dev" source: hosted - version: "12.0.5" + version: "12.0.6" permission_handler_apple: dependency: transitive description: @@ -889,10 +889,10 @@ packages: dependency: transitive description: name: postgrest - sha256: "9a3b590cf123f8d323b6a918702e037f037027d12a01902f9dc6ee38fdc05d6c" + sha256: f1f78470a74c611811132ff12acdef9c08b3ec65b61e88161a057d6cc5fbbd83 url: "https://pub.dev" source: hosted - version: "2.1.1" + version: "2.1.2" provider: dependency: "direct main" description: @@ -1017,26 +1017,26 @@ packages: dependency: transitive description: name: sentry - sha256: "1d2952d40b99da0dc4bf3ba4797e3985dd60cc61a13d0a1d2c62b02f6528441a" + sha256: fd1fbfe860c05f5c52820ec4dbf2b6473789e83ead26cfc18bca4fe80bf3f008 url: "https://pub.dev" source: hosted - version: "8.1.0" + version: "8.2.0" sentry_flutter: dependency: "direct main" description: name: sentry_flutter - sha256: "848aaccfc75f1d35d5f7e5230770761f1b2a33e604f24498200566443da1470a" + sha256: c64f0aec5332bec87083b61514d1b6b29e435b9045d03ce1575861192b9a5680 url: "https://pub.dev" source: hosted - version: "8.1.0" + version: "8.2.0" sentry_logging: dependency: "direct main" description: name: sentry_logging - sha256: "86a0b30a868cd9738694ddde4b82a2ac60b1e33abdff04216dfc556ef6d56fb1" + sha256: edfc054d65f0257303540f9fe76820005a710440eee062052efdff5252ecc121 url: "https://pub.dev" source: hosted - version: "8.1.0" + version: "8.2.0" shared_preferences: dependency: "direct main" description: @@ -1057,10 +1057,10 @@ packages: dependency: transitive description: name: shared_preferences_foundation - sha256: "7708d83064f38060c7b39db12aefe449cb8cdc031d6062280087bc4cdb988f5c" + sha256: "0a8a893bf4fd1152f93fec03a415d11c27c74454d96e2318a7ac38dd18683ab7" url: "https://pub.dev" source: hosted - version: "2.3.5" + version: "2.4.0" shared_preferences_linux: dependency: transitive description: @@ -1118,10 +1118,10 @@ packages: dependency: transitive description: name: sqflite - sha256: "5ce2e1a15e822c3b4bfb5400455775e421da7098eed8adc8f26298ada7c9308c" + sha256: a43e5a27235518c03ca238e7b4732cf35eabe863a369ceba6cbefa537a66f16d url: "https://pub.dev" source: hosted - version: "2.3.3" + version: "2.3.3+1" sqflite_common: dependency: transitive description: @@ -1188,18 +1188,18 @@ packages: dependency: "direct main" description: name: supabase - sha256: ef407187b18c440f4a5c3f3cf30eb5cc1daadd4ff5616febf445a37e0e0ed34e + sha256: cd3d6bcc6b15ffd6eacea92ec2a2d9f09bf72c8a95c09a14f3b523ae9ee99cb6 url: "https://pub.dev" source: hosted - version: "2.1.2" + version: "2.1.3" supabase_flutter: dependency: "direct main" description: name: supabase_flutter - sha256: "6a77bd6ef6dc451bb2561de0334d68d620b84d7df1de1448dd7962ed5d1a79ea" + sha256: "7f552ddddb2f1ac2925dc70af655b39bb64f8d3c1ca6dda58685d1fb4eec447c" url: "https://pub.dev" source: hosted - version: "2.5.2" + version: "2.5.3" synchronized: dependency: transitive description: @@ -1284,10 +1284,10 @@ packages: dependency: transitive description: name: url_launcher_ios - sha256: "9149d493b075ed740901f3ee844a38a00b33116c7c5c10d7fb27df8987fb51d5" + sha256: "7068716403343f6ba4969b4173cbf3b84fc768042124bc2c011e5d782b24fe89" url: "https://pub.dev" source: hosted - version: "6.2.5" + version: "6.3.0" url_launcher_linux: dependency: transitive description: @@ -1300,10 +1300,10 @@ packages: dependency: transitive description: name: url_launcher_macos - sha256: b7244901ea3cf489c5335bdacda07264a6e960b1c1b1a9f91e4bc371d9e68234 + sha256: "9a1a42d5d2d95400c795b2914c36fdcb525870c752569438e4ebb09a2b5d90de" url: "https://pub.dev" source: hosted - version: "3.1.0" + version: "3.2.0" url_launcher_platform_interface: dependency: transitive description: @@ -1388,10 +1388,10 @@ packages: dependency: transitive description: name: video_player_avfoundation - sha256: "00c49b1d68071341397cf760b982c1e26ed9232464c8506ee08378a5cca5070d" + sha256: d1e9a824f2b324000dc8fb2dcb2a3285b6c1c7c487521c63306cc5b394f68a7c url: "https://pub.dev" source: hosted - version: "2.5.7" + version: "2.6.1" video_player_platform_interface: dependency: transitive description: @@ -1460,10 +1460,10 @@ packages: dependency: transitive description: name: webview_flutter_android - sha256: f038ee2fae73b509dde1bc9d2c5a50ca92054282de17631a9a3d515883740934 + sha256: dad3313c9ead95517bb1cae5e1c9d20ba83729d5a59e5e83c0a2d66203f27f91 url: "https://pub.dev" source: hosted - version: "3.16.0" + version: "3.16.1" webview_flutter_platform_interface: dependency: transitive description: diff --git a/app/pubspec.yaml b/app/pubspec.yaml index 41a7b0e33..1cd9333f1 100644 --- a/app/pubspec.yaml +++ b/app/pubspec.yaml @@ -35,13 +35,13 @@ dependencies: quiver: ^3.2.1 rainbow_color: ^2.0.1 record: ^5.0.5 - sentry_flutter: ^8.1.0 - sentry_logging: ^8.1.0 + sentry_flutter: ^8.2.0 + sentry_logging: ^8.2.0 shared_preferences: ^2.2.3 studyu_core: ^4.4.2 studyu_flutter_common: ^1.8.3 - supabase: ^2.1.2 - supabase_flutter: ^2.5.2 + supabase: ^2.1.3 + supabase_flutter: ^2.5.3 timeline_tile: ^2.0.0 timezone: ^0.9.3 universal_html: ^2.2.4 diff --git a/core/pubspec.lock b/core/pubspec.lock index e5bb2e1a2..8d05cbe27 100644 --- a/core/pubspec.lock +++ b/core/pubspec.lock @@ -5,18 +5,23 @@ packages: dependency: transitive description: name: _fe_analyzer_shared - sha256: "0b2f2bd91ba804e53a61d757b986f89f1f9eaed5b11e4b2f5a2468d86d6c9fc7" + sha256: "5aaf60d96c4cd00fe7f21594b5ad6a1b699c80a27420f8a837f4d68473ef09e3" url: "https://pub.dev" source: hosted - version: "67.0.0" + version: "68.0.0" + _macros: + dependency: transitive + description: dart + source: sdk + version: "0.1.0" analyzer: dependency: transitive description: name: analyzer - sha256: "37577842a27e4338429a1cbc32679d508836510b056f1eedf0c8d20e39c1383d" + sha256: "21f1d3720fd1c70316399d5e2bccaebb415c434592d778cce8acb967b8578808" url: "https://pub.dev" source: hosted - version: "6.4.1" + version: "6.5.0" args: dependency: transitive description: @@ -141,10 +146,10 @@ packages: dependency: transitive description: name: coverage - sha256: "8acabb8306b57a409bf4c83522065672ee13179297a6bb0cb9ead73948df7c76" + sha256: "3945034e86ea203af7a056d98e98e42a5518fff200d6e8e6647e1886b07e936e" url: "https://pub.dev" source: hosted - version: "1.7.2" + version: "1.8.0" crypto: dependency: transitive description: @@ -197,10 +202,10 @@ packages: dependency: transitive description: name: functions_client - sha256: a70b0dd9a1c35d05d1141557f7e49ffe4de5f450ffde31755a9eeeadca03b8ee + sha256: "48659e5c6a4bbe02659102bf6406a0cf39142202deae65aacfa78688f2e68946" url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.2.0" glob: dependency: transitive description: @@ -213,10 +218,10 @@ packages: dependency: transitive description: name: gotrue - sha256: c9c984f088320a5c5e87c7a34571e3de3982cca4cbd8b978e59d36baf748edfb + sha256: aaefc58b168723f8b5ca2a70ee8c0a051cba16f112be50f41c1ff8fb96b6a6df url: "https://pub.dev" source: hosted - version: "2.6.1" + version: "2.7.0" graphs: dependency: transitive description: @@ -313,6 +318,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.2.0" + macros: + dependency: transitive + description: + name: macros + sha256: "12e8a9842b5a7390de7a781ec63d793527582398d16ea26c60fed58833c9ae79" + url: "https://pub.dev" + source: hosted + version: "0.1.0-main.0" matcher: dependency: transitive description: @@ -325,10 +338,10 @@ packages: dependency: transitive description: name: meta - sha256: "25dfcaf170a0190f47ca6355bdd4552cb8924b430512ff0cafb8db9bd41fe33b" + sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7 url: "https://pub.dev" source: hosted - version: "1.14.0" + version: "1.15.0" mime: dependency: transitive description: @@ -373,10 +386,10 @@ packages: dependency: transitive description: name: postgrest - sha256: "9a3b590cf123f8d323b6a918702e037f037027d12a01902f9dc6ee38fdc05d6c" + sha256: f1f78470a74c611811132ff12acdef9c08b3ec65b61e88161a057d6cc5fbbd83 url: "https://pub.dev" source: hosted - version: "2.1.1" + version: "2.1.2" pub_semver: dependency: transitive description: @@ -429,10 +442,10 @@ packages: dependency: "direct main" description: name: sentry - sha256: "1d2952d40b99da0dc4bf3ba4797e3985dd60cc61a13d0a1d2c62b02f6528441a" + sha256: fd1fbfe860c05f5c52820ec4dbf2b6473789e83ead26cfc18bca4fe80bf3f008 url: "https://pub.dev" source: hosted - version: "8.1.0" + version: "8.2.0" shelf: dependency: transitive description: @@ -557,10 +570,10 @@ packages: dependency: "direct main" description: name: supabase - sha256: ef407187b18c440f4a5c3f3cf30eb5cc1daadd4ff5616febf445a37e0e0ed34e + sha256: cd3d6bcc6b15ffd6eacea92ec2a2d9f09bf72c8a95c09a14f3b523ae9ee99cb6 url: "https://pub.dev" source: hosted - version: "2.1.2" + version: "2.1.3" term_glyph: dependency: transitive description: @@ -621,10 +634,10 @@ packages: dependency: transitive description: name: vm_service - sha256: "3923c89304b715fb1eb6423f017651664a03bf5f4b29983627c4da791f74a4ec" + sha256: "7475cb4dd713d57b6f7464c0e13f06da0d535d8b2067e188962a59bac2cf280b" url: "https://pub.dev" source: hosted - version: "14.2.1" + version: "14.2.2" watcher: dependency: transitive description: @@ -674,4 +687,4 @@ packages: source: hosted version: "2.0.0" sdks: - dart: ">=3.3.0 <4.0.0" + dart: ">=3.4.0-256.0.dev <4.0.0" diff --git a/core/pubspec.yaml b/core/pubspec.yaml index c5361ac52..f92a32290 100644 --- a/core/pubspec.yaml +++ b/core/pubspec.yaml @@ -13,8 +13,8 @@ dependencies: json_annotation: ^4.9.0 logger: ^2.3.0 quiver: ^3.2.1 - sentry: ^8.1.0 - supabase: ^2.1.2 + sentry: ^8.2.0 + supabase: ^2.1.3 uuid: ^4.4.0 dev_dependencies: diff --git a/designer_v2/pubspec.lock b/designer_v2/pubspec.lock index 899f3dd47..039347595 100644 --- a/designer_v2/pubspec.lock +++ b/designer_v2/pubspec.lock @@ -29,10 +29,10 @@ packages: dependency: transitive description: name: app_links - sha256: "0fd41f0501f131d931251e0942ac63d6216096a0052aeca037915c2c1deeb121" + sha256: "8c6ef5ba9e26b720d4c9073826befb87df2ab5e7a81c22b6c3145080b5e736c9" url: "https://pub.dev" source: hosted - version: "5.0.0" + version: "6.0.2" archive: dependency: "direct main" description: @@ -125,10 +125,10 @@ packages: dependency: transitive description: name: coverage - sha256: "8acabb8306b57a409bf4c83522065672ee13179297a6bb0cb9ead73948df7c76" + sha256: "3945034e86ea203af7a056d98e98e42a5518fff200d6e8e6647e1886b07e936e" url: "https://pub.dev" source: hosted - version: "1.7.2" + version: "1.8.0" crypto: dependency: transitive description: @@ -359,10 +359,10 @@ packages: dependency: transitive description: name: frontend_server_client - sha256: "408e3ca148b31c20282ad6f37ebfa6f4bdc8fede5b74bc2f08d9d92b55db3612" + sha256: f64a0333a82f30b0cca061bc3d143813a486dc086b574bfb233b7c1372427694 url: "https://pub.dev" source: hosted - version: "3.2.0" + version: "4.0.0" fuchsia_remote_debug_protocol: dependency: transitive description: flutter @@ -372,10 +372,10 @@ packages: dependency: transitive description: name: functions_client - sha256: a70b0dd9a1c35d05d1141557f7e49ffe4de5f450ffde31755a9eeeadca03b8ee + sha256: "48659e5c6a4bbe02659102bf6406a0cf39142202deae65aacfa78688f2e68946" url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.2.0" glob: dependency: transitive description: @@ -388,18 +388,18 @@ packages: dependency: "direct main" description: name: go_router - sha256: "81f94e16d7063b60f0da3a79f872e140d6518f306749303bf981abd7d6b46734" + sha256: "7685acd06244ba4be60f455c5cafe5790c63dc91fc03f7385b1e922a6b85b17c" url: "https://pub.dev" source: hosted - version: "14.1.0" + version: "14.1.1" gotrue: dependency: transitive description: name: gotrue - sha256: c9c984f088320a5c5e87c7a34571e3de3982cca4cbd8b978e59d36baf748edfb + sha256: aaefc58b168723f8b5ca2a70ee8c0a051cba16f112be50f41c1ff8fb96b6a6df url: "https://pub.dev" source: hosted - version: "2.6.1" + version: "2.7.0" gtk: dependency: transitive description: @@ -633,10 +633,10 @@ packages: dependency: transitive description: name: path_provider_foundation - sha256: "5a7999be66e000916500be4f15a3633ebceb8302719b47b9cc49ce924125350f" + sha256: f234384a3fdd67f989b4d54a5d73ca2a6c422fa55ae694381ae0f4375cd1ea16 url: "https://pub.dev" source: hosted - version: "2.3.2" + version: "2.4.0" path_provider_linux: dependency: transitive description: @@ -737,10 +737,10 @@ packages: dependency: transitive description: name: postgrest - sha256: "9a3b590cf123f8d323b6a918702e037f037027d12a01902f9dc6ee38fdc05d6c" + sha256: f1f78470a74c611811132ff12acdef9c08b3ec65b61e88161a057d6cc5fbbd83 url: "https://pub.dev" source: hosted - version: "2.1.1" + version: "2.1.2" process: dependency: transitive description: @@ -857,10 +857,10 @@ packages: dependency: transitive description: name: sentry - sha256: "1d2952d40b99da0dc4bf3ba4797e3985dd60cc61a13d0a1d2c62b02f6528441a" + sha256: fd1fbfe860c05f5c52820ec4dbf2b6473789e83ead26cfc18bca4fe80bf3f008 url: "https://pub.dev" source: hosted - version: "8.1.0" + version: "8.2.0" shared_preferences: dependency: transitive description: @@ -881,10 +881,10 @@ packages: dependency: transitive description: name: shared_preferences_foundation - sha256: "7708d83064f38060c7b39db12aefe449cb8cdc031d6062280087bc4cdb988f5c" + sha256: "0a8a893bf4fd1152f93fec03a415d11c27c74454d96e2318a7ac38dd18683ab7" url: "https://pub.dev" source: hosted - version: "2.3.5" + version: "2.4.0" shared_preferences_linux: dependency: transitive description: @@ -1052,18 +1052,18 @@ packages: dependency: "direct main" description: name: supabase - sha256: ef407187b18c440f4a5c3f3cf30eb5cc1daadd4ff5616febf445a37e0e0ed34e + sha256: cd3d6bcc6b15ffd6eacea92ec2a2d9f09bf72c8a95c09a14f3b523ae9ee99cb6 url: "https://pub.dev" source: hosted - version: "2.1.2" + version: "2.1.3" supabase_flutter: dependency: "direct main" description: name: supabase_flutter - sha256: "6a77bd6ef6dc451bb2561de0334d68d620b84d7df1de1448dd7962ed5d1a79ea" + sha256: "7f552ddddb2f1ac2925dc70af655b39bb64f8d3c1ca6dda58685d1fb4eec447c" url: "https://pub.dev" source: hosted - version: "2.5.2" + version: "2.5.3" sync_http: dependency: transitive description: @@ -1140,10 +1140,10 @@ packages: dependency: transitive description: name: url_launcher_ios - sha256: "9149d493b075ed740901f3ee844a38a00b33116c7c5c10d7fb27df8987fb51d5" + sha256: "7068716403343f6ba4969b4173cbf3b84fc768042124bc2c011e5d782b24fe89" url: "https://pub.dev" source: hosted - version: "6.2.5" + version: "6.3.0" url_launcher_linux: dependency: transitive description: @@ -1156,10 +1156,10 @@ packages: dependency: transitive description: name: url_launcher_macos - sha256: b7244901ea3cf489c5335bdacda07264a6e960b1c1b1a9f91e4bc371d9e68234 + sha256: "9a1a42d5d2d95400c795b2914c36fdcb525870c752569438e4ebb09a2b5d90de" url: "https://pub.dev" source: hosted - version: "3.1.0" + version: "3.2.0" url_launcher_platform_interface: dependency: transitive description: diff --git a/designer_v2/pubspec.yaml b/designer_v2/pubspec.yaml index 6fe718a08..7bfefb175 100644 --- a/designer_v2/pubspec.yaml +++ b/designer_v2/pubspec.yaml @@ -13,7 +13,7 @@ dependencies: async: ^2.11.0 csv: ^6.0.0 cupertino_icons: ^1.0.8 - dynamic_color: + dynamic_color: ^1.7.0 equatable: ^2.0.5 flutter: sdk: flutter @@ -23,8 +23,8 @@ dependencies: flutter_riverpod: ^2.5.1 flutter_web_plugins: sdk: flutter - go_router: ^14.1.0 - material_color_utilities: + go_router: ^14.1.1 + material_color_utilities: 0.8.0 # integration_test material_design_icons_flutter: ^7.0.7296 pointer_interceptor: ^0.10.1+1 reactive_color_picker: ^2.0.1 @@ -34,8 +34,8 @@ dependencies: rxdart: ^0.27.7 studyu_core: ^4.4.2 studyu_flutter_common: ^1.8.3 - supabase: ^2.1.2 - supabase_flutter: ^2.5.2 + supabase: ^2.1.3 + supabase_flutter: ^2.5.3 url_launcher: ^6.2.6 uuid: ^4.4.0 diff --git a/flutter_common/pubspec.lock b/flutter_common/pubspec.lock index 816c0d9aa..ab9f57d9a 100644 --- a/flutter_common/pubspec.lock +++ b/flutter_common/pubspec.lock @@ -5,10 +5,10 @@ packages: dependency: transitive description: name: app_links - sha256: "0fd41f0501f131d931251e0942ac63d6216096a0052aeca037915c2c1deeb121" + sha256: "8c6ef5ba9e26b720d4c9073826befb87df2ab5e7a81c22b6c3145080b5e736c9" url: "https://pub.dev" source: hosted - version: "5.0.0" + version: "6.0.2" async: dependency: transitive description: @@ -180,18 +180,18 @@ packages: dependency: transitive description: name: functions_client - sha256: a70b0dd9a1c35d05d1141557f7e49ffe4de5f450ffde31755a9eeeadca03b8ee + sha256: "48659e5c6a4bbe02659102bf6406a0cf39142202deae65aacfa78688f2e68946" url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.2.0" gotrue: dependency: transitive description: name: gotrue - sha256: c9c984f088320a5c5e87c7a34571e3de3982cca4cbd8b978e59d36baf748edfb + sha256: aaefc58b168723f8b5ca2a70ee8c0a051cba16f112be50f41c1ff8fb96b6a6df url: "https://pub.dev" source: hosted - version: "2.6.1" + version: "2.7.0" gtk: dependency: transitive description: @@ -340,10 +340,10 @@ packages: dependency: transitive description: name: path_provider_foundation - sha256: "5a7999be66e000916500be4f15a3633ebceb8302719b47b9cc49ce924125350f" + sha256: f234384a3fdd67f989b4d54a5d73ca2a6c422fa55ae694381ae0f4375cd1ea16 url: "https://pub.dev" source: hosted - version: "2.3.2" + version: "2.4.0" path_provider_linux: dependency: transitive description: @@ -388,10 +388,10 @@ packages: dependency: transitive description: name: postgrest - sha256: "9a3b590cf123f8d323b6a918702e037f037027d12a01902f9dc6ee38fdc05d6c" + sha256: f1f78470a74c611811132ff12acdef9c08b3ec65b61e88161a057d6cc5fbbd83 url: "https://pub.dev" source: hosted - version: "2.1.1" + version: "2.1.2" quiver: dependency: transitive description: @@ -428,10 +428,10 @@ packages: dependency: transitive description: name: sentry - sha256: "1d2952d40b99da0dc4bf3ba4797e3985dd60cc61a13d0a1d2c62b02f6528441a" + sha256: fd1fbfe860c05f5c52820ec4dbf2b6473789e83ead26cfc18bca4fe80bf3f008 url: "https://pub.dev" source: hosted - version: "8.1.0" + version: "8.2.0" shared_preferences: dependency: "direct main" description: @@ -452,10 +452,10 @@ packages: dependency: transitive description: name: shared_preferences_foundation - sha256: "7708d83064f38060c7b39db12aefe449cb8cdc031d6062280087bc4cdb988f5c" + sha256: "0a8a893bf4fd1152f93fec03a415d11c27c74454d96e2318a7ac38dd18683ab7" url: "https://pub.dev" source: hosted - version: "2.3.5" + version: "2.4.0" shared_preferences_linux: dependency: transitive description: @@ -552,18 +552,18 @@ packages: dependency: transitive description: name: supabase - sha256: ef407187b18c440f4a5c3f3cf30eb5cc1daadd4ff5616febf445a37e0e0ed34e + sha256: cd3d6bcc6b15ffd6eacea92ec2a2d9f09bf72c8a95c09a14f3b523ae9ee99cb6 url: "https://pub.dev" source: hosted - version: "2.1.2" + version: "2.1.3" supabase_flutter: dependency: "direct main" description: name: supabase_flutter - sha256: "6a77bd6ef6dc451bb2561de0334d68d620b84d7df1de1448dd7962ed5d1a79ea" + sha256: "7f552ddddb2f1ac2925dc70af655b39bb64f8d3c1ca6dda58685d1fb4eec447c" url: "https://pub.dev" source: hosted - version: "2.5.2" + version: "2.5.3" synchronized: dependency: "direct main" description: @@ -616,10 +616,10 @@ packages: dependency: transitive description: name: url_launcher_ios - sha256: "9149d493b075ed740901f3ee844a38a00b33116c7c5c10d7fb27df8987fb51d5" + sha256: "7068716403343f6ba4969b4173cbf3b84fc768042124bc2c011e5d782b24fe89" url: "https://pub.dev" source: hosted - version: "6.2.5" + version: "6.3.0" url_launcher_linux: dependency: transitive description: @@ -632,10 +632,10 @@ packages: dependency: transitive description: name: url_launcher_macos - sha256: b7244901ea3cf489c5335bdacda07264a6e960b1c1b1a9f91e4bc371d9e68234 + sha256: "9a1a42d5d2d95400c795b2914c36fdcb525870c752569438e4ebb09a2b5d90de" url: "https://pub.dev" source: hosted - version: "3.1.0" + version: "3.2.0" url_launcher_platform_interface: dependency: transitive description: diff --git a/flutter_common/pubspec.yaml b/flutter_common/pubspec.yaml index 6f11ec370..175af286c 100644 --- a/flutter_common/pubspec.yaml +++ b/flutter_common/pubspec.yaml @@ -14,7 +14,7 @@ dependencies: flutter_secure_storage: ^9.1.1 shared_preferences: ^2.2.3 # Can be removed after migrating phase studyu_core: ^4.4.2 - supabase_flutter: ^2.5.2 + supabase_flutter: ^2.5.3 synchronized: ^3.1.0+1 uuid: ^4.4.0 From 588e533a23bf46fe269721b3ded6d6fcd1b6cf22 Mon Sep 17 00:00:00 2001 From: Johannes Vedder Date: Thu, 23 May 2024 08:51:38 +0200 Subject: [PATCH 114/314] chore: upgrade deps --- app/pubspec.lock | 78 ++++++++++++++++++------------------- app/pubspec.yaml | 2 +- core/pubspec.lock | 14 +++---- core/pubspec.yaml | 2 +- designer_v2/pubspec.lock | 53 +++++++++++++------------ designer_v2/pubspec.yaml | 14 ++----- flutter_common/pubspec.lock | 26 ++++++------- flutter_common/pubspec.yaml | 2 +- 8 files changed, 92 insertions(+), 99 deletions(-) diff --git a/app/pubspec.lock b/app/pubspec.lock index c5eb46f26..9b334c456 100644 --- a/app/pubspec.lock +++ b/app/pubspec.lock @@ -5,18 +5,18 @@ packages: dependency: transitive description: name: app_links - sha256: "8c6ef5ba9e26b720d4c9073826befb87df2ab5e7a81c22b6c3145080b5e736c9" + sha256: "96e677810b83707ff5e10fac11e4839daa0ea4e0123c35864c092699165eb3db" url: "https://pub.dev" source: hosted - version: "6.0.2" + version: "6.1.1" archive: dependency: transitive description: name: archive - sha256: ecf4273855368121b1caed0d10d4513c7241dfc813f7d3c8933b36622ae9b265 + sha256: "6bd38d335f0954f5fad9c79e614604fbf03a0e5b975923dd001b6ea965ef5b4b" url: "https://pub.dev" source: hosted - version: "3.5.1" + version: "3.6.0" args: dependency: transitive description: @@ -101,10 +101,10 @@ packages: dependency: transitive description: name: camera_android_camerax - sha256: a2aac9505259a86d5eb6b0a14116b9a64f34a4735009f47731e59834218a5a29 + sha256: "59967e6d80df9d682a33b86f228cc524e6b52d6184b84f6ac62151dd98bd1ea0" url: "https://pub.dev" source: hosted - version: "0.6.5+1" + version: "0.6.5+2" camera_avfoundation: dependency: transitive description: @@ -367,10 +367,10 @@ packages: dependency: transitive description: name: flutter_secure_storage - sha256: c0f402067fb0498934faa6bddd670de0a3db45222e2ca9a068c6177c9a2360a4 + sha256: "165164745e6afb5c0e3e3fcc72a012fb9e58496fb26ffb92cf22e16a821e85d0" url: "https://pub.dev" source: hosted - version: "9.1.1" + version: "9.2.2" flutter_secure_storage_linux: dependency: transitive description: @@ -383,18 +383,18 @@ packages: dependency: transitive description: name: flutter_secure_storage_macos - sha256: "8cfa53010a294ff095d7be8fa5bb15f2252c50018d69c5104851303f3ff92510" + sha256: "1693ab11121a5f925bbea0be725abfcfbbcf36c1e29e571f84a0c0f436147a81" url: "https://pub.dev" source: hosted - version: "3.1.0" + version: "3.1.2" flutter_secure_storage_platform_interface: dependency: transitive description: name: flutter_secure_storage_platform_interface - sha256: "301f67ee9b87f04aef227f57f13f126fa7b13543c8e7a93f25c5d2d534c28a4a" + sha256: cf91ad32ce5adef6fba4d736a542baca9daf3beac4db2d04be350b87f69ac4a8 url: "https://pub.dev" source: hosted - version: "1.1.1" + version: "1.1.2" flutter_secure_storage_web: dependency: transitive description: @@ -553,10 +553,10 @@ packages: dependency: transitive description: name: image - sha256: "4c68bfd5ae83e700b5204c1e74451e7bf3cf750e6843c6e158289cf56bda018e" + sha256: "2237616a36c0d69aef7549ab439b833fb7f9fb9fc861af2cc9ac3eedddd69ca8" url: "https://pub.dev" source: hosted - version: "4.1.7" + version: "4.2.0" intersperse: dependency: "direct main" description: @@ -593,26 +593,26 @@ packages: dependency: transitive description: name: just_audio - sha256: b7cb6bbf3750caa924d03f432ba401ec300fd90936b3f73a9b33d58b1e96286b + sha256: "5abfab1d199e01ab5beffa61b3e782350df5dad036cb8c83b79fa45fc656614e" url: "https://pub.dev" source: hosted - version: "0.9.37" + version: "0.9.38" just_audio_platform_interface: dependency: transitive description: name: just_audio_platform_interface - sha256: c3dee0014248c97c91fe6299edb73dc4d6c6930a2f4f713579cd692d9e47f4a1 + sha256: "0243828cce503c8366cc2090cefb2b3c871aa8ed2f520670d76fd47aa1ab2790" url: "https://pub.dev" source: hosted - version: "4.2.2" + version: "4.3.0" just_audio_web: dependency: transitive description: name: just_audio_web - sha256: "134356b0fe3d898293102b33b5fd618831ffdc72bb7a1b726140abdf22772b70" + sha256: "0edb481ad4aa1ff38f8c40f1a3576013c3420bf6669b686fe661627d49bc606c" url: "https://pub.dev" source: hosted - version: "0.4.9" + version: "0.4.11" jwt_decode: dependency: transitive description: @@ -945,26 +945,26 @@ packages: dependency: "direct main" description: name: record - sha256: "113b368168c49c78902ab37c2b354dea30a0aec5bdeca434073826b6ea73eca1" + sha256: "90dae13f3edb582c19e148a32dae9f643f03ab368d70ec7d0b872014018a94da" url: "https://pub.dev" source: hosted - version: "5.0.5" + version: "5.1.0" record_android: dependency: transitive description: name: record_android - sha256: "0df98e05873b22b443309e289bf1eb3b5b9a60e7779134334e2073eb0763a992" + sha256: bc36a2b33fd920a0f92d208500f879dd03c6db1aa91da72232d897f73b689033 url: "https://pub.dev" source: hosted - version: "1.1.0" + version: "1.2.0" record_darwin: dependency: transitive description: name: record_darwin - sha256: ee8cb1bb1712d7ce38140ecabe70e5c286c02f05296d66043bee865ace7eb1b9 + sha256: "2210da0fde7c86b4048cccfe2cd19b25fc7adf1ada7d50ec4a5ab4af2a863739" url: "https://pub.dev" source: hosted - version: "1.0.1" + version: "1.1.0" record_linux: dependency: transitive description: @@ -977,18 +977,18 @@ packages: dependency: transitive description: name: record_platform_interface - sha256: "3a4b56e94ecd2a0b2b43eb1fa6f94c5b8484334f5d38ef43959c4bf97fb374cf" + sha256: "11f8b03ea8a0e279b0e306571dbe0db0202c0b8e866495c9fa1ad2281d5e4c15" url: "https://pub.dev" source: hosted - version: "1.0.2" + version: "1.1.0" record_web: dependency: transitive description: name: record_web - sha256: "24847cdbcf999f7a5762170792f622ac844858766becd0f2370ec8ae22f7526e" + sha256: "0ef370d1e6553ad33c39dd03103b374e7861f3518b0533e64c94d73f988a5ffa" url: "https://pub.dev" source: hosted - version: "1.0.5" + version: "1.1.0" record_windows: dependency: transitive description: @@ -1276,10 +1276,10 @@ packages: dependency: transitive description: name: url_launcher_android - sha256: "360a6ed2027f18b73c8d98e159dda67a61b7f2e0f6ec26e86c3ada33b0621775" + sha256: "17cd5e205ea615e2c6ea7a77323a11712dffa0720a8a90540db57a01347f9ad9" url: "https://pub.dev" source: hosted - version: "6.3.1" + version: "6.3.2" url_launcher_ios: dependency: transitive description: @@ -1460,10 +1460,10 @@ packages: dependency: transitive description: name: webview_flutter_android - sha256: dad3313c9ead95517bb1cae5e1c9d20ba83729d5a59e5e83c0a2d66203f27f91 + sha256: "2282ba2320af34b2bd5320156c664d73f3f022341ed78847bc87723bf88c142f" url: "https://pub.dev" source: hosted - version: "3.16.1" + version: "3.16.2" webview_flutter_platform_interface: dependency: transitive description: @@ -1476,18 +1476,18 @@ packages: dependency: transitive description: name: webview_flutter_wkwebview - sha256: f12f8d8a99784b863e8b85e4a9a5e3cf1839d6803d2c0c3e0533a8f3c5a992a7 + sha256: "7affdf9d680c015b11587181171d3cad8093e449db1f7d9f0f08f4f33d24f9a0" url: "https://pub.dev" source: hosted - version: "3.13.0" + version: "3.13.1" win32: dependency: transitive description: name: win32 - sha256: "0eaf06e3446824099858367950a813472af675116bf63f008a4c2a75ae13e9cb" + sha256: a79dbe579cb51ecd6d30b17e0cae4e0ea15e2c0e66f69ad4198f22a6789e94f4 url: "https://pub.dev" source: hosted - version: "5.5.0" + version: "5.5.1" xdg_directories: dependency: transitive description: @@ -1521,5 +1521,5 @@ packages: source: hosted version: "2.0.0" sdks: - dart: ">=3.3.0 <4.0.0" + dart: ">=3.4.0 <4.0.0" flutter: ">=3.19.0" diff --git a/app/pubspec.yaml b/app/pubspec.yaml index 1cd9333f1..75839e146 100644 --- a/app/pubspec.yaml +++ b/app/pubspec.yaml @@ -34,7 +34,7 @@ dependencies: provider: ^6.1.2 quiver: ^3.2.1 rainbow_color: ^2.0.1 - record: ^5.0.5 + record: ^5.1.0 sentry_flutter: ^8.2.0 sentry_logging: ^8.2.0 shared_preferences: ^2.2.3 diff --git a/core/pubspec.lock b/core/pubspec.lock index 8d05cbe27..bd4f27141 100644 --- a/core/pubspec.lock +++ b/core/pubspec.lock @@ -66,10 +66,10 @@ packages: dependency: transitive description: name: build_daemon - sha256: "0343061a33da9c5810b2d6cee51945127d8f4c060b7fbdd9d54917f0a3feaaa1" + sha256: "79b2aef6ac2ed00046867ed354c88778c9c0f029df8a20fe10b5436826721ef9" url: "https://pub.dev" source: hosted - version: "4.0.1" + version: "4.0.2" build_resolvers: dependency: transitive description: @@ -82,10 +82,10 @@ packages: dependency: "direct dev" description: name: build_runner - sha256: "3ac61a79bfb6f6cc11f693591063a7f19a7af628dc52f141743edac5c16e8c22" + sha256: "1414d6d733a85d8ad2f1dfcb3ea7945759e35a123cb99ccfac75d0758f75edfa" url: "https://pub.dev" source: hosted - version: "2.4.9" + version: "2.4.10" build_runner_core: dependency: transitive description: @@ -474,10 +474,10 @@ packages: dependency: transitive description: name: shelf_web_socket - sha256: "9ca081be41c60190ebcb4766b2486a7d50261db7bd0f5d9615f2d653637a84c1" + sha256: "073c147238594ecd0d193f3456a5fe91c4b0abbcc68bf5cd95b36c4e194ac611" url: "https://pub.dev" source: hosted - version: "1.0.4" + version: "2.0.0" source_gen: dependency: transitive description: @@ -687,4 +687,4 @@ packages: source: hosted version: "2.0.0" sdks: - dart: ">=3.4.0-256.0.dev <4.0.0" + dart: ">=3.4.0 <4.0.0" diff --git a/core/pubspec.yaml b/core/pubspec.yaml index f92a32290..da2ed499f 100644 --- a/core/pubspec.yaml +++ b/core/pubspec.yaml @@ -18,7 +18,7 @@ dependencies: uuid: ^4.4.0 dev_dependencies: - build_runner: ^2.4.9 + build_runner: ^2.4.10 json_serializable: ^6.8.0 lint: ^2.3.0 test: ^1.25.5 diff --git a/designer_v2/pubspec.lock b/designer_v2/pubspec.lock index 039347595..2f32d7681 100644 --- a/designer_v2/pubspec.lock +++ b/designer_v2/pubspec.lock @@ -29,18 +29,18 @@ packages: dependency: transitive description: name: app_links - sha256: "8c6ef5ba9e26b720d4c9073826befb87df2ab5e7a81c22b6c3145080b5e736c9" + sha256: "96e677810b83707ff5e10fac11e4839daa0ea4e0123c35864c092699165eb3db" url: "https://pub.dev" source: hosted - version: "6.0.2" + version: "6.1.1" archive: dependency: "direct main" description: name: archive - sha256: ecf4273855368121b1caed0d10d4513c7241dfc813f7d3c8933b36622ae9b265 + sha256: "6bd38d335f0954f5fad9c79e614604fbf03a0e5b975923dd001b6ea965ef5b4b" url: "https://pub.dev" source: hosted - version: "3.5.1" + version: "3.6.0" args: dependency: transitive description: @@ -241,12 +241,11 @@ packages: flutter_colorpicker: dependency: "direct main" description: - path: "." - ref: master - resolved-ref: "92bdb69a313a56c391ef148c12ef6539bd31253d" - url: "https://github.com/mchome/flutter_colorpicker" - source: git - version: "1.0.3" + name: flutter_colorpicker + sha256: "969de5f6f9e2a570ac660fb7b501551451ea2a1ab9e2097e89475f60e07816ea" + url: "https://pub.dev" + source: hosted + version: "1.1.0" flutter_dotenv: dependency: transitive description: @@ -293,10 +292,10 @@ packages: dependency: transitive description: name: flutter_secure_storage - sha256: c0f402067fb0498934faa6bddd670de0a3db45222e2ca9a068c6177c9a2360a4 + sha256: "165164745e6afb5c0e3e3fcc72a012fb9e58496fb26ffb92cf22e16a821e85d0" url: "https://pub.dev" source: hosted - version: "9.1.1" + version: "9.2.2" flutter_secure_storage_linux: dependency: transitive description: @@ -309,18 +308,18 @@ packages: dependency: transitive description: name: flutter_secure_storage_macos - sha256: "8cfa53010a294ff095d7be8fa5bb15f2252c50018d69c5104851303f3ff92510" + sha256: "1693ab11121a5f925bbea0be725abfcfbbcf36c1e29e571f84a0c0f436147a81" url: "https://pub.dev" source: hosted - version: "3.1.0" + version: "3.1.2" flutter_secure_storage_platform_interface: dependency: transitive description: name: flutter_secure_storage_platform_interface - sha256: "301f67ee9b87f04aef227f57f13f126fa7b13543c8e7a93f25c5d2d534c28a4a" + sha256: cf91ad32ce5adef6fba4d736a542baca9daf3beac4db2d04be350b87f69ac4a8 url: "https://pub.dev" source: hosted - version: "1.1.1" + version: "1.1.2" flutter_secure_storage_web: dependency: transitive description: @@ -388,10 +387,10 @@ packages: dependency: "direct main" description: name: go_router - sha256: "7685acd06244ba4be60f455c5cafe5790c63dc91fc03f7385b1e922a6b85b17c" + sha256: "6ad5662b014c06c20fa46ab78715c96b2222a7fe4f87bf77e0289592c2539e86" url: "https://pub.dev" source: hosted - version: "14.1.1" + version: "14.1.3" gotrue: dependency: transitive description: @@ -444,10 +443,10 @@ packages: dependency: transitive description: name: image - sha256: "4c68bfd5ae83e700b5204c1e74451e7bf3cf750e6843c6e158289cf56bda018e" + sha256: "2237616a36c0d69aef7549ab439b833fb7f9fb9fc861af2cc9ac3eedddd69ca8" url: "https://pub.dev" source: hosted - version: "4.1.7" + version: "4.2.0" integration_test: dependency: "direct dev" description: flutter @@ -665,10 +664,10 @@ packages: dependency: "direct dev" description: name: patrol_finders - sha256: ac33527cc1b63e3aa131dbd7107cfda8ee2df0fb4a4a423c067174a2e60db77b + sha256: e14214e88c84d34a1d7c89778ddf5c5a913bfc0a6a308da47d3ebca374a1f5f4 url: "https://pub.dev" source: hosted - version: "2.0.2" + version: "2.1.0" petitparser: dependency: transitive description: @@ -1132,10 +1131,10 @@ packages: dependency: transitive description: name: url_launcher_android - sha256: "360a6ed2027f18b73c8d98e159dda67a61b7f2e0f6ec26e86c3ada33b0621775" + sha256: "17cd5e205ea615e2c6ea7a77323a11712dffa0720a8a90540db57a01347f9ad9" url: "https://pub.dev" source: hosted - version: "6.3.1" + version: "6.3.2" url_launcher_ios: dependency: transitive description: @@ -1252,10 +1251,10 @@ packages: dependency: transitive description: name: win32 - sha256: "0eaf06e3446824099858367950a813472af675116bf63f008a4c2a75ae13e9cb" + sha256: a79dbe579cb51ecd6d30b17e0cae4e0ea15e2c0e66f69ad4198f22a6789e94f4 url: "https://pub.dev" source: hosted - version: "5.5.0" + version: "5.5.1" xdg_directories: dependency: transitive description: @@ -1289,5 +1288,5 @@ packages: source: hosted version: "2.0.0" sdks: - dart: ">=3.3.0 <4.0.0" + dart: ">=3.4.0 <4.0.0" flutter: ">=3.19.0" diff --git a/designer_v2/pubspec.yaml b/designer_v2/pubspec.yaml index 7bfefb175..1b61424f4 100644 --- a/designer_v2/pubspec.yaml +++ b/designer_v2/pubspec.yaml @@ -9,7 +9,7 @@ environment: sdk: '>=3.0.0 <4.0.0' dependencies: - archive: ^3.5.1 + archive: ^3.6.0 async: ^2.11.0 csv: ^6.0.0 cupertino_icons: ^1.0.8 @@ -17,13 +17,13 @@ dependencies: equatable: ^2.0.5 flutter: sdk: flutter - flutter_colorpicker: ^1.0.3 + flutter_colorpicker: ^1.1.0 flutter_localizations: sdk: flutter flutter_riverpod: ^2.5.1 flutter_web_plugins: sdk: flutter - go_router: ^14.1.1 + go_router: ^14.1.3 material_color_utilities: 0.8.0 # integration_test material_design_icons_flutter: ^7.0.7296 pointer_interceptor: ^0.10.1+1 @@ -39,12 +39,6 @@ dependencies: url_launcher: ^6.2.6 uuid: ^4.4.0 -dependency_overrides: - flutter_colorpicker: # todo this package is outdated and should be replaced, if possible because reactive_color_picker depends on it - git: - url: https://github.com/mchome/flutter_colorpicker - ref: master # or 786d04363f587b818ce585d25b9c2bb62de95aba - dev_dependencies: custom_lint: flutter_launcher_icons: ^0.13.1 @@ -53,7 +47,7 @@ dev_dependencies: sdk: flutter integration_test: sdk: flutter - patrol_finders: ^2.0.2 + patrol_finders: ^2.1.0 riverpod_lint: test: ^1.24.9 # integration_test diff --git a/flutter_common/pubspec.lock b/flutter_common/pubspec.lock index ab9f57d9a..186714fa5 100644 --- a/flutter_common/pubspec.lock +++ b/flutter_common/pubspec.lock @@ -5,10 +5,10 @@ packages: dependency: transitive description: name: app_links - sha256: "8c6ef5ba9e26b720d4c9073826befb87df2ab5e7a81c22b6c3145080b5e736c9" + sha256: "96e677810b83707ff5e10fac11e4839daa0ea4e0123c35864c092699165eb3db" url: "https://pub.dev" source: hosted - version: "6.0.2" + version: "6.1.1" async: dependency: transitive description: @@ -122,10 +122,10 @@ packages: dependency: "direct main" description: name: flutter_secure_storage - sha256: c0f402067fb0498934faa6bddd670de0a3db45222e2ca9a068c6177c9a2360a4 + sha256: "165164745e6afb5c0e3e3fcc72a012fb9e58496fb26ffb92cf22e16a821e85d0" url: "https://pub.dev" source: hosted - version: "9.1.1" + version: "9.2.2" flutter_secure_storage_linux: dependency: transitive description: @@ -138,18 +138,18 @@ packages: dependency: transitive description: name: flutter_secure_storage_macos - sha256: "8cfa53010a294ff095d7be8fa5bb15f2252c50018d69c5104851303f3ff92510" + sha256: "1693ab11121a5f925bbea0be725abfcfbbcf36c1e29e571f84a0c0f436147a81" url: "https://pub.dev" source: hosted - version: "3.1.0" + version: "3.1.2" flutter_secure_storage_platform_interface: dependency: transitive description: name: flutter_secure_storage_platform_interface - sha256: "301f67ee9b87f04aef227f57f13f126fa7b13543c8e7a93f25c5d2d534c28a4a" + sha256: cf91ad32ce5adef6fba4d736a542baca9daf3beac4db2d04be350b87f69ac4a8 url: "https://pub.dev" source: hosted - version: "1.1.1" + version: "1.1.2" flutter_secure_storage_web: dependency: transitive description: @@ -608,10 +608,10 @@ packages: dependency: transitive description: name: url_launcher_android - sha256: "360a6ed2027f18b73c8d98e159dda67a61b7f2e0f6ec26e86c3ada33b0621775" + sha256: "17cd5e205ea615e2c6ea7a77323a11712dffa0720a8a90540db57a01347f9ad9" url: "https://pub.dev" source: hosted - version: "6.3.1" + version: "6.3.2" url_launcher_ios: dependency: transitive description: @@ -704,10 +704,10 @@ packages: dependency: transitive description: name: win32 - sha256: "0eaf06e3446824099858367950a813472af675116bf63f008a4c2a75ae13e9cb" + sha256: a79dbe579cb51ecd6d30b17e0cae4e0ea15e2c0e66f69ad4198f22a6789e94f4 url: "https://pub.dev" source: hosted - version: "5.5.0" + version: "5.5.1" xdg_directories: dependency: transitive description: @@ -725,5 +725,5 @@ packages: source: hosted version: "2.0.0" sdks: - dart: ">=3.3.0 <4.0.0" + dart: ">=3.4.0 <4.0.0" flutter: ">=3.19.0" diff --git a/flutter_common/pubspec.yaml b/flutter_common/pubspec.yaml index 175af286c..d805948b0 100644 --- a/flutter_common/pubspec.yaml +++ b/flutter_common/pubspec.yaml @@ -11,7 +11,7 @@ dependencies: flutter: sdk: flutter flutter_dotenv: ^5.1.0 - flutter_secure_storage: ^9.1.1 + flutter_secure_storage: ^9.2.2 shared_preferences: ^2.2.3 # Can be removed after migrating phase studyu_core: ^4.4.2 supabase_flutter: ^2.5.3 From 3a408290b05a6b913c868fea943539c389bb01aa Mon Sep 17 00:00:00 2001 From: Johannes Vedder Date: Thu, 23 May 2024 09:12:43 +0200 Subject: [PATCH 115/314] fix: add compatibility for emoji font with flutter >= 3.22 --- designer_v2/web/flutter_bootstrap.js | 12 ++++++++++++ designer_v2/web/index.html | 4 +++- 2 files changed, 15 insertions(+), 1 deletion(-) create mode 100644 designer_v2/web/flutter_bootstrap.js diff --git a/designer_v2/web/flutter_bootstrap.js b/designer_v2/web/flutter_bootstrap.js new file mode 100644 index 000000000..6f8c03d44 --- /dev/null +++ b/designer_v2/web/flutter_bootstrap.js @@ -0,0 +1,12 @@ +{{flutter_js}} +{{flutter_build_config}} + +_flutter.loader.load({ + onEntrypointLoaded: async function(engineInitializer) { + const appRunner = await engineInitializer.initializeEngine({ + useColorEmoji: true, + }); + + await appRunner.runApp(); + } +}); diff --git a/designer_v2/web/index.html b/designer_v2/web/index.html index 9d3acfe06..0b31d0f8f 100644 --- a/designer_v2/web/index.html +++ b/designer_v2/web/index.html @@ -37,6 +37,8 @@ - + From d864470f7e9916be3e535b1b10bbda79702892a0 Mon Sep 17 00:00:00 2001 From: Johannes Vedder Date: Thu, 23 May 2024 09:17:48 +0200 Subject: [PATCH 116/314] chore: rename studyu-packages to studyu --- melos.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/melos.yaml b/melos.yaml index 395ae5c53..295c6bb6a 100644 --- a/melos.yaml +++ b/melos.yaml @@ -1,4 +1,4 @@ -name: studyu-packages +name: studyu repository: https://github.com/hpi-studyu/studyu From ab6c76f071146beb084c5fe822ffa3f1ac23d951 Mon Sep 17 00:00:00 2001 From: Johannes Vedder Date: Thu, 23 May 2024 09:21:05 +0200 Subject: [PATCH 117/314] chore: bundle update --- app/android/Gemfile.lock | 18 ++++++++++-------- app/ios/Gemfile.lock | 18 ++++++++++-------- app/ios/Podfile.lock | 18 +++++++++--------- 3 files changed, 29 insertions(+), 25 deletions(-) diff --git a/app/android/Gemfile.lock b/app/android/Gemfile.lock index cb09ef947..a785ea5d2 100644 --- a/app/android/Gemfile.lock +++ b/app/android/Gemfile.lock @@ -10,17 +10,17 @@ GEM artifactory (3.0.17) atomos (0.1.3) aws-eventstream (1.3.0) - aws-partitions (1.914.0) - aws-sdk-core (3.192.0) + aws-partitions (1.933.0) + aws-sdk-core (3.196.1) aws-eventstream (~> 1, >= 1.3.0) aws-partitions (~> 1, >= 1.651.0) aws-sigv4 (~> 1.8) jmespath (~> 1, >= 1.6.1) - aws-sdk-kms (1.79.0) - aws-sdk-core (~> 3, >= 3.191.0) + aws-sdk-kms (1.82.0) + aws-sdk-core (~> 3, >= 3.193.0) aws-sigv4 (~> 1.1) - aws-sdk-s3 (1.147.0) - aws-sdk-core (~> 3, >= 3.192.0) + aws-sdk-s3 (1.151.0) + aws-sdk-core (~> 3, >= 3.194.0) aws-sdk-kms (~> 1) aws-sigv4 (~> 1.8) aws-sigv4 (1.8.0) @@ -157,7 +157,7 @@ GEM mini_magick (4.12.0) mini_mime (1.1.5) multi_json (1.15.0) - multipart-post (2.4.0) + multipart-post (2.4.1) nanaimo (0.3.0) naturally (2.2.1) nkf (0.2.0) @@ -171,7 +171,8 @@ GEM trailblazer-option (>= 0.1.1, < 0.2.0) uber (< 0.2.0) retriable (3.1.2) - rexml (3.2.6) + rexml (3.2.8) + strscan (>= 3.0.9) rouge (2.0.7) ruby2_keywords (0.0.5) rubyzip (2.3.2) @@ -184,6 +185,7 @@ GEM simctl (1.6.10) CFPropertyList naturally + strscan (3.1.0) terminal-notifier (2.0.0) terminal-table (3.0.2) unicode-display_width (>= 1.1.1, < 3) diff --git a/app/ios/Gemfile.lock b/app/ios/Gemfile.lock index cb09ef947..a785ea5d2 100644 --- a/app/ios/Gemfile.lock +++ b/app/ios/Gemfile.lock @@ -10,17 +10,17 @@ GEM artifactory (3.0.17) atomos (0.1.3) aws-eventstream (1.3.0) - aws-partitions (1.914.0) - aws-sdk-core (3.192.0) + aws-partitions (1.933.0) + aws-sdk-core (3.196.1) aws-eventstream (~> 1, >= 1.3.0) aws-partitions (~> 1, >= 1.651.0) aws-sigv4 (~> 1.8) jmespath (~> 1, >= 1.6.1) - aws-sdk-kms (1.79.0) - aws-sdk-core (~> 3, >= 3.191.0) + aws-sdk-kms (1.82.0) + aws-sdk-core (~> 3, >= 3.193.0) aws-sigv4 (~> 1.1) - aws-sdk-s3 (1.147.0) - aws-sdk-core (~> 3, >= 3.192.0) + aws-sdk-s3 (1.151.0) + aws-sdk-core (~> 3, >= 3.194.0) aws-sdk-kms (~> 1) aws-sigv4 (~> 1.8) aws-sigv4 (1.8.0) @@ -157,7 +157,7 @@ GEM mini_magick (4.12.0) mini_mime (1.1.5) multi_json (1.15.0) - multipart-post (2.4.0) + multipart-post (2.4.1) nanaimo (0.3.0) naturally (2.2.1) nkf (0.2.0) @@ -171,7 +171,8 @@ GEM trailblazer-option (>= 0.1.1, < 0.2.0) uber (< 0.2.0) retriable (3.1.2) - rexml (3.2.6) + rexml (3.2.8) + strscan (>= 3.0.9) rouge (2.0.7) ruby2_keywords (0.0.5) rubyzip (2.3.2) @@ -184,6 +185,7 @@ GEM simctl (1.6.10) CFPropertyList naturally + strscan (3.1.0) terminal-notifier (2.0.0) terminal-table (3.0.2) unicode-display_width (>= 1.1.1, < 3) diff --git a/app/ios/Podfile.lock b/app/ios/Podfile.lock index bf4adfc7d..209989e65 100644 --- a/app/ios/Podfile.lock +++ b/app/ios/Podfile.lock @@ -26,11 +26,11 @@ PODS: - record_darwin (1.0.0): - Flutter - FlutterMacOS - - Sentry/HybridSDK (8.25.0) - - sentry_flutter (8.1.0): + - Sentry/HybridSDK (8.25.2) + - sentry_flutter (8.2.0): - Flutter - FlutterMacOS - - Sentry/HybridSDK (= 8.25.0) + - Sentry/HybridSDK (= 8.25.2) - shared_preferences_foundation (0.0.1): - Flutter - FlutterMacOS @@ -126,15 +126,15 @@ SPEC CHECKSUMS: flutter_timezone: ffb07bdad3c6276af8dada0f11978d8a1f8a20bb just_audio: baa7252489dbcf47a4c7cc9ca663e9661c99aafa package_info_plus: 58f0028419748fad15bf008b270aaa8e54380b1c - path_provider_foundation: 3784922295ac71e43754bd15e0653ccfd36a147c + path_provider_foundation: 2b6b4c569c0fb62ec74538f866245ac84301af46 permission_handler_apple: 9878588469a2b0d0fc1e048d9f43605f92e6cec2 record_darwin: 1f6619f2abac4d1ca91d3eeab038c980d76f1517 - Sentry: cd86fc55628f5b7c572cabe66cc8f95a9d2f165a - sentry_flutter: ca7760fc008dc3bc2981730dc0c1d2f892178370 - shared_preferences_foundation: b4c3b4cddf1c21f02770737f147a3f5da9d39695 + Sentry: 51b056d96914a741f63eca774d118678b1eb05a1 + sentry_flutter: e8397d13e297a5d4b6be8a752e33140b21c5cc97 + shared_preferences_foundation: fcdcbc04712aee1108ac7fda236f363274528f78 sqflite: 673a0e54cc04b7d6dba8d24fb8095b31c3a99eec - url_launcher_ios: 6116280ddcfe98ab8820085d8d76ae7449447586 - video_player_avfoundation: 2b4384f3b157206b5e150a0083cdc0c905d260d3 + url_launcher_ios: 5334b05cef931de560670eeae103fd3e431ac3fe + video_player_avfoundation: 7c6c11d8470e1675df7397027218274b6d2360b3 wakelock_plus: 78ec7c5b202cab7761af8e2b2b3d0671be6c4ae1 webview_flutter_wkwebview: be0f0d33777f1bfd0c9fdcb594786704dbf65f36 From 7811d5d41e0c379bc69b7c6237bb62876956928a Mon Sep 17 00:00:00 2001 From: Johannes Vedder Date: Thu, 23 May 2024 09:30:15 +0200 Subject: [PATCH 118/314] chore: format --- designer_v2/lib/theme.dart | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/designer_v2/lib/theme.dart b/designer_v2/lib/theme.dart index 1cceba685..e74e7c97b 100644 --- a/designer_v2/lib/theme.dart +++ b/designer_v2/lib/theme.dart @@ -131,9 +131,11 @@ class ThemeProvider extends InheritedWidget { ColorScheme colors(Brightness brightness, Color? targetColor) { final dynamicPrimary = brightness == Brightness.light ? lightDynamic?.primary : darkDynamic?.primary; - final scheme = SchemeFidelity(sourceColorHct: dynamicPrimary != null - ? Hct.fromInt(dynamicPrimary.value) - : Hct.fromInt(source(targetColor).value), isDark: false, contrastLevel: 0.0); + final scheme = SchemeFidelity( + sourceColorHct: + dynamicPrimary != null ? Hct.fromInt(dynamicPrimary.value) : Hct.fromInt(source(targetColor).value), + isDark: false, + contrastLevel: 0.0); final colorScheme = ColorScheme.fromSeed( seedColor: dynamicPrimary ?? source(targetColor), // todo use dynamicSchemeVariant once its in the flutter stable channel From cc4552aafcc621f20a4a54a7c7c25a50980c37d8 Mon Sep 17 00:00:00 2001 From: Johannes Vedder Date: Thu, 23 May 2024 23:26:26 +0200 Subject: [PATCH 119/314] ci: bump flutter version --- .github/workflows/init-workspace/action.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/init-workspace/action.yml b/.github/workflows/init-workspace/action.yml index 5b4d32b82..565c0c76e 100644 --- a/.github/workflows/init-workspace/action.yml +++ b/.github/workflows/init-workspace/action.yml @@ -10,7 +10,7 @@ runs: with: channel: stable # Increase this version manually when we add support for a new Flutter release - flutter-version: '3.19.6' + flutter-version: '3.22.x' - name: Install melos run: dart pub global activate melos From 7b023223fbab5468bd3d0a3234b1535b38650ee3 Mon Sep 17 00:00:00 2001 From: Johannes Vedder Date: Thu, 23 May 2024 22:28:55 +0200 Subject: [PATCH 120/314] style(designer_v2): add loading screen --- .../lib/common_views/pages/splash_page.dart | 10 +-- designer_v2/web/flutter_bootstrap.js | 78 +++++++++++++++++-- 2 files changed, 72 insertions(+), 16 deletions(-) diff --git a/designer_v2/lib/common_views/pages/splash_page.dart b/designer_v2/lib/common_views/pages/splash_page.dart index 88a8c41e8..64368c9a2 100644 --- a/designer_v2/lib/common_views/pages/splash_page.dart +++ b/designer_v2/lib/common_views/pages/splash_page.dart @@ -1,18 +1,10 @@ import 'package:flutter/material.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; -// import 'package:studyu_designer_v2/localization/app_translation.dart'; class SplashPage extends StatelessWidget { const SplashPage({super.key}); @override Widget build(BuildContext context) { - return Scaffold( - body: Center( - child: Text(AppLocalizations.of(context)!.loading_message), - // tr leads to unexpected null value, splash screen probably skips too fast - // child: Text(tr.loading_message), - ), - ); + return Container(); } } diff --git a/designer_v2/web/flutter_bootstrap.js b/designer_v2/web/flutter_bootstrap.js index 6f8c03d44..ce61faf42 100644 --- a/designer_v2/web/flutter_bootstrap.js +++ b/designer_v2/web/flutter_bootstrap.js @@ -1,12 +1,76 @@ {{flutter_js}} {{flutter_build_config}} -_flutter.loader.load({ - onEntrypointLoaded: async function(engineInitializer) { - const appRunner = await engineInitializer.initializeEngine({ - useColorEmoji: true, - }); +// Create the loading indicator element +var loadingDiv = document.createElement('div'); +loadingDiv.id = 'loading'; +loadingDiv.innerHTML = ` + + Loading indicator... +`; + +// Append the loading indicator to the document body +document.body.appendChild(loadingDiv); +// Loading entrypoint +_flutter.loader.load({ + onEntrypointLoaded: async function(engineInitializer) { + // Initializing engine + loadingDiv.classList.add('main_done'); + const appRunner = await engineInitializer.initializeEngine(); + + // Running app + loadingDiv.classList.add('init_done'); + await appRunner.runApp(); + } +}); \ No newline at end of file From 12f7bac745357b20b57df8cccf126ea0963806f8 Mon Sep 17 00:00:00 2001 From: Johannes Vedder Date: Thu, 23 May 2024 23:21:19 +0200 Subject: [PATCH 121/314] style(designer_v2): prettify animation --- designer_v2/web/flutter_bootstrap.js | 33 ++++++++++++++++++---------- 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/designer_v2/web/flutter_bootstrap.js b/designer_v2/web/flutter_bootstrap.js index ce61faf42..8f0d40aea 100644 --- a/designer_v2/web/flutter_bootstrap.js +++ b/designer_v2/web/flutter_bootstrap.js @@ -4,6 +4,7 @@ // Create the loading indicator element var loadingDiv = document.createElement('div'); loadingDiv.id = 'loading'; + loadingDiv.innerHTML = ` - Loading indicator... +
+ Loading indicator... +
`; // Append the loading indicator to the document body document.body.appendChild(loadingDiv); + // Loading entrypoint _flutter.loader.load({ onEntrypointLoaded: async function(engineInitializer) { - // Initializing engine - loadingDiv.classList.add('main_done'); const appRunner = await engineInitializer.initializeEngine(); - // Running app loadingDiv.classList.add('init_done'); + // Hide the loading indicator after the animation is done + loadingDiv.addEventListener('animationend', function() { + document.getElementById('loading').style.visibility = 'hidden'; + }); + await appRunner.runApp(); } }); \ No newline at end of file From 72ed147c9c703b247d52d08a66ba5bff934b3f7d Mon Sep 17 00:00:00 2001 From: Johannes Vedder Date: Fri, 24 May 2024 10:35:11 +0200 Subject: [PATCH 122/314] chore: linebreak --- designer_v2/web/flutter_bootstrap.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/designer_v2/web/flutter_bootstrap.js b/designer_v2/web/flutter_bootstrap.js index 8f0d40aea..45f76ee49 100644 --- a/designer_v2/web/flutter_bootstrap.js +++ b/designer_v2/web/flutter_bootstrap.js @@ -82,4 +82,4 @@ _flutter.loader.load({ await appRunner.runApp(); } -}); \ No newline at end of file +}); From 0980eb2a108fdf2f87fc76f64a94a76d54b0bc4e Mon Sep 17 00:00:00 2001 From: Johannes Vedder Date: Fri, 7 Jun 2024 11:23:00 +0200 Subject: [PATCH 123/314] fix: upgrade deps --- app/pubspec.lock | 86 ++++++++++++++++++------------------- app/pubspec.yaml | 10 ++--- core/pubspec.lock | 40 ++++++++--------- core/pubspec.yaml | 6 +-- designer_v2/pubspec.lock | 54 +++++++++++------------ designer_v2/pubspec.yaml | 12 +++--- flutter_common/pubspec.lock | 34 +++++++-------- flutter_common/pubspec.yaml | 2 +- pubspec.lock | 4 +- 9 files changed, 124 insertions(+), 124 deletions(-) diff --git a/app/pubspec.lock b/app/pubspec.lock index 9b334c456..6e0484250 100644 --- a/app/pubspec.lock +++ b/app/pubspec.lock @@ -13,10 +13,10 @@ packages: dependency: transitive description: name: archive - sha256: "6bd38d335f0954f5fad9c79e614604fbf03a0e5b975923dd001b6ea965ef5b4b" + sha256: cb6a278ef2dbb298455e1a713bda08524a175630ec643a242c399c932a0a1f7d url: "https://pub.dev" source: hosted - version: "3.6.0" + version: "3.6.1" args: dependency: transitive description: @@ -93,18 +93,18 @@ packages: dependency: "direct main" description: name: camera - sha256: cf8ed1789aa244392cfc49d13e97879700476ba641c92500e01f630e109c0f6c + sha256: "2170a943dcb67be2af2c6bcda8775e74b41d4c02d6a4eb10bdc832ee185c4eea" url: "https://pub.dev" source: hosted - version: "0.11.0" + version: "0.11.0+1" camera_android_camerax: dependency: transitive description: name: camera_android_camerax - sha256: "59967e6d80df9d682a33b86f228cc524e6b52d6184b84f6ac62151dd98bd1ea0" + sha256: "7d84815edbb8304b51c10deba3c20f44eef80aa46ff156ec45428ed16600b49a" url: "https://pub.dev" source: hosted - version: "0.6.5+2" + version: "0.6.5+5" camera_avfoundation: dependency: transitive description: @@ -359,10 +359,10 @@ packages: dependency: transitive description: name: flutter_plugin_android_lifecycle - sha256: "8cf40eebf5dec866a6d1956ad7b4f7016e6c0cc69847ab946833b7d43743809f" + sha256: c6b0b4c05c458e1c01ad9bcc14041dd7b1f6783d487be4386f793f47a8a4d03e url: "https://pub.dev" source: hosted - version: "2.0.19" + version: "2.0.20" flutter_secure_storage: dependency: transitive description: @@ -769,10 +769,10 @@ packages: dependency: transitive description: name: path_provider_android - sha256: a248d8146ee5983446bf03ed5ea8f6533129a12b11f12057ad1b4a67a2b3b41d + sha256: "9c96da072b421e98183f9ea7464898428e764bc0ce5567f27ec8693442e72514" url: "https://pub.dev" source: hosted - version: "2.2.4" + version: "2.2.5" path_provider_foundation: dependency: transitive description: @@ -833,10 +833,10 @@ packages: dependency: transitive description: name: permission_handler_apple - sha256: e9ad66020b89ff1b63908f247c2c6f931c6e62699b756ef8b3c4569350cd8662 + sha256: e6f6d73b12438ef13e648c4ae56bd106ec60d17e90a59c4545db6781229082a0 url: "https://pub.dev" source: hosted - version: "9.4.4" + version: "9.4.5" permission_handler_html: dependency: transitive description: @@ -937,26 +937,26 @@ packages: dependency: transitive description: name: realtime_client - sha256: "492a1ab568b3812cb345aad8dd09b3936877edba81a6ab6f5fdf365c155797e1" + sha256: cd44fa21407a2e217d674f1c1a33b36c49ad0d8aea0349bf5b66594db06c80fb url: "https://pub.dev" source: hosted - version: "2.0.4" + version: "2.1.0" record: dependency: "direct main" description: name: record - sha256: "90dae13f3edb582c19e148a32dae9f643f03ab368d70ec7d0b872014018a94da" + sha256: "78353d3d55fa145ffe1db1f63232ad0a0cd4c773e9f7d161210ce796ba1c94f9" url: "https://pub.dev" source: hosted - version: "5.1.0" + version: "5.1.1" record_android: dependency: transitive description: name: record_android - sha256: bc36a2b33fd920a0f92d208500f879dd03c6db1aa91da72232d897f73b689033 + sha256: fe83beefc8ac81b9dd02ca9365e8685755e3f12be1d442964082f1d5b618183d url: "https://pub.dev" source: hosted - version: "1.2.0" + version: "1.2.2" record_darwin: dependency: transitive description: @@ -985,18 +985,18 @@ packages: dependency: transitive description: name: record_web - sha256: "0ef370d1e6553ad33c39dd03103b374e7861f3518b0533e64c94d73f988a5ffa" + sha256: "703adb626d31e2dd86a8f6b34e306e03cd323e0c5e16e11bbc0385b07a8df97e" url: "https://pub.dev" source: hosted - version: "1.1.0" + version: "1.1.1" record_windows: dependency: transitive description: name: record_windows - sha256: "39998b3ea7d8d28b04159d82220e6e5e32a7c357c6fb2794f5736beea272f6c3" + sha256: e653555aa3fda168aded7c34e11bd82baf0c6ac84e7624553def3c77ffefd36f url: "https://pub.dev" source: hosted - version: "1.0.2" + version: "1.0.3" retry: dependency: transitive description: @@ -1049,10 +1049,10 @@ packages: dependency: transitive description: name: shared_preferences_android - sha256: "1ee8bf911094a1b592de7ab29add6f826a7331fb854273d55918693d5364a1f2" + sha256: "93d0ec9dd902d85f326068e6a899487d1f65ffcd5798721a95330b26c8131577" url: "https://pub.dev" source: hosted - version: "2.2.2" + version: "2.2.3" shared_preferences_foundation: dependency: transitive description: @@ -1142,10 +1142,10 @@ packages: dependency: transitive description: name: storage_client - sha256: bf5589d5de61a2451edb1b8960a0e673d4bb5c42ecc4dddf7c051a93789ced34 + sha256: e37f1b9d40f43078d12bd2d1b6b08c2c16fbdbafc58b57bc44922da6ea3f5625 url: "https://pub.dev" source: hosted - version: "2.0.1" + version: "2.0.2" stream_channel: dependency: transitive description: @@ -1188,18 +1188,18 @@ packages: dependency: "direct main" description: name: supabase - sha256: cd3d6bcc6b15ffd6eacea92ec2a2d9f09bf72c8a95c09a14f3b523ae9ee99cb6 + sha256: "4555658031af0a8b38c7375f28e4b35312291f4aab0ca504dd76661381ce134f" url: "https://pub.dev" source: hosted - version: "2.1.3" + version: "2.2.0" supabase_flutter: dependency: "direct main" description: name: supabase_flutter - sha256: "7f552ddddb2f1ac2925dc70af655b39bb64f8d3c1ca6dda58685d1fb4eec447c" + sha256: "1d6fb4ffaf50fc6f60507ab8ebf0b7dedbe6fabfbd8066db6f2a6552ddd0ea8c" url: "https://pub.dev" source: hosted - version: "2.5.3" + version: "2.5.4" synchronized: dependency: transitive description: @@ -1268,18 +1268,18 @@ packages: dependency: "direct main" description: name: url_launcher - sha256: "6ce1e04375be4eed30548f10a315826fd933c1e493206eab82eed01f438c8d2e" + sha256: "21b704ce5fa560ea9f3b525b43601c678728ba46725bab9b01187b4831377ed3" url: "https://pub.dev" source: hosted - version: "6.2.6" + version: "6.3.0" url_launcher_android: dependency: transitive description: name: url_launcher_android - sha256: "17cd5e205ea615e2c6ea7a77323a11712dffa0720a8a90540db57a01347f9ad9" + sha256: ceb2625f0c24ade6ef6778d1de0b2e44f2db71fded235eb52295247feba8c5cf url: "https://pub.dev" source: hosted - version: "6.3.2" + version: "6.3.3" url_launcher_ios: dependency: transitive description: @@ -1380,10 +1380,10 @@ packages: dependency: transitive description: name: video_player_android - sha256: "134e1ad410d67e18a19486ed9512c72dfc6d8ffb284d0e8f2e99e903d1ba8fa3" + sha256: b7ee816fc517d4029dbeb4ff3a124fb30e644f059abe3ec88b7a1138d487d735 url: "https://pub.dev" source: hosted - version: "2.4.14" + version: "2.4.17" video_player_avfoundation: dependency: transitive description: @@ -1404,10 +1404,10 @@ packages: dependency: transitive description: name: video_player_web - sha256: "41245cef5ef29c4585dbabcbcbe9b209e34376642c7576cabf11b4ad9289d6e4" + sha256: ff4d69a6614b03f055397c27a71c9d3ddea2b2a23d71b2ba0164f59ca32b8fe2 url: "https://pub.dev" source: hosted - version: "2.3.0" + version: "2.3.1" vm_service: dependency: transitive description: @@ -1452,18 +1452,18 @@ packages: dependency: transitive description: name: webview_flutter - sha256: "25e1b6e839e8cbfbd708abc6f85ed09d1727e24e08e08c6b8590d7c65c9a8932" + sha256: "6869c8786d179f929144b4a1f86e09ac0eddfe475984951ea6c634774c16b522" url: "https://pub.dev" source: hosted - version: "4.7.0" + version: "4.8.0" webview_flutter_android: dependency: transitive description: name: webview_flutter_android - sha256: "2282ba2320af34b2bd5320156c664d73f3f022341ed78847bc87723bf88c142f" + sha256: f42447ca49523f11d8f70abea55ea211b3cafe172dd7a0e7ac007bb35dd356dc url: "https://pub.dev" source: hosted - version: "3.16.2" + version: "3.16.4" webview_flutter_platform_interface: dependency: transitive description: @@ -1522,4 +1522,4 @@ packages: version: "2.0.0" sdks: dart: ">=3.4.0 <4.0.0" - flutter: ">=3.19.0" + flutter: ">=3.22.0" diff --git a/app/pubspec.yaml b/app/pubspec.yaml index 75839e146..f17b4a2d6 100644 --- a/app/pubspec.yaml +++ b/app/pubspec.yaml @@ -8,7 +8,7 @@ repository: https://github.com/hpi-studyu/studyu environment: sdk: '>=3.2.0 <4.0.0' dependencies: - camera: ^0.11.0 + camera: ^0.11.0+1 collection: ^1.18.0 cross_file: ^0.3.4+1 cupertino_icons: ^1.0.8 @@ -34,18 +34,18 @@ dependencies: provider: ^6.1.2 quiver: ^3.2.1 rainbow_color: ^2.0.1 - record: ^5.1.0 + record: ^5.1.1 sentry_flutter: ^8.2.0 sentry_logging: ^8.2.0 shared_preferences: ^2.2.3 studyu_core: ^4.4.2 studyu_flutter_common: ^1.8.3 - supabase: ^2.1.3 - supabase_flutter: ^2.5.3 + supabase: ^2.2.0 + supabase_flutter: ^2.5.4 timeline_tile: ^2.0.0 timezone: ^0.9.3 universal_html: ^2.2.4 - url_launcher: ^6.2.6 + url_launcher: ^6.3.0 uuid: ^4.4.0 wakelock_plus: ^1.2.5 diff --git a/core/pubspec.lock b/core/pubspec.lock index bd4f27141..bd10eb6d5 100644 --- a/core/pubspec.lock +++ b/core/pubspec.lock @@ -82,18 +82,18 @@ packages: dependency: "direct dev" description: name: build_runner - sha256: "1414d6d733a85d8ad2f1dfcb3ea7945759e35a123cb99ccfac75d0758f75edfa" + sha256: "644dc98a0f179b872f612d3eb627924b578897c629788e858157fa5e704ca0c7" url: "https://pub.dev" source: hosted - version: "2.4.10" + version: "2.4.11" build_runner_core: dependency: transitive description: name: build_runner_core - sha256: "4ae8ffe5ac758da294ecf1802f2aff01558d8b1b00616aa7538ea9a8a5d50799" + sha256: e3c79f69a64bdfcd8a776a3c28db4eb6e3fb5356d013ae5eb2e52007706d5dbe url: "https://pub.dev" source: hosted - version: "7.3.0" + version: "7.3.1" built_collection: dependency: transitive description: @@ -402,10 +402,10 @@ packages: dependency: transitive description: name: pubspec_parse - sha256: c63b2876e58e194e4b0828fcb080ad0e06d051cb607a6be51a9e084f47cb9367 + sha256: c799b721d79eb6ee6fa56f00c04b472dcd44a30d258fac2174a6ec57302678f8 url: "https://pub.dev" source: hosted - version: "1.2.3" + version: "1.3.0" quiver: dependency: "direct main" description: @@ -418,10 +418,10 @@ packages: dependency: transitive description: name: realtime_client - sha256: "492a1ab568b3812cb345aad8dd09b3936877edba81a6ab6f5fdf365c155797e1" + sha256: cd44fa21407a2e217d674f1c1a33b36c49ad0d8aea0349bf5b66594db06c80fb url: "https://pub.dev" source: hosted - version: "2.0.4" + version: "2.1.0" retry: dependency: transitive description: @@ -538,10 +538,10 @@ packages: dependency: transitive description: name: storage_client - sha256: bf5589d5de61a2451edb1b8960a0e673d4bb5c42ecc4dddf7c051a93789ced34 + sha256: e37f1b9d40f43078d12bd2d1b6b08c2c16fbdbafc58b57bc44922da6ea3f5625 url: "https://pub.dev" source: hosted - version: "2.0.1" + version: "2.0.2" stream_channel: dependency: transitive description: @@ -570,10 +570,10 @@ packages: dependency: "direct main" description: name: supabase - sha256: cd3d6bcc6b15ffd6eacea92ec2a2d9f09bf72c8a95c09a14f3b523ae9ee99cb6 + sha256: "4555658031af0a8b38c7375f28e4b35312291f4aab0ca504dd76661381ce134f" url: "https://pub.dev" source: hosted - version: "2.1.3" + version: "2.2.0" term_glyph: dependency: transitive description: @@ -586,26 +586,26 @@ packages: dependency: "direct dev" description: name: test - sha256: d11b55850c68c1f6c0cf00eabded4e66c4043feaf6c0d7ce4a36785137df6331 + sha256: "7ee44229615f8f642b68120165ae4c2a75fe77ae2065b1e55ae4711f6cf0899e" url: "https://pub.dev" source: hosted - version: "1.25.5" + version: "1.25.7" test_api: dependency: transitive description: name: test_api - sha256: "2419f20b0c8677b2d67c8ac4d1ac7372d862dc6c460cdbb052b40155408cd794" + sha256: "5b8a98dafc4d5c4c9c72d8b31ab2b23fc13422348d2997120294d3bac86b4ddb" url: "https://pub.dev" source: hosted - version: "0.7.1" + version: "0.7.2" test_core: dependency: transitive description: name: test_core - sha256: "4d070a6bc36c1c4e89f20d353bfd71dc30cdf2bd0e14349090af360a029ab292" + sha256: "55ea5a652e38a1dfb32943a7973f3681a60f872f8c3a05a14664ad54ef9c6696" url: "https://pub.dev" source: hosted - version: "0.6.2" + version: "0.6.4" timing: dependency: transitive description: @@ -634,10 +634,10 @@ packages: dependency: transitive description: name: vm_service - sha256: "7475cb4dd713d57b6f7464c0e13f06da0d535d8b2067e188962a59bac2cf280b" + sha256: "360c4271613beb44db559547d02f8b0dc044741d0eeb9aa6ccdb47e8ec54c63a" url: "https://pub.dev" source: hosted - version: "14.2.2" + version: "14.2.3" watcher: dependency: transitive description: diff --git a/core/pubspec.yaml b/core/pubspec.yaml index da2ed499f..79cb2380c 100644 --- a/core/pubspec.yaml +++ b/core/pubspec.yaml @@ -14,11 +14,11 @@ dependencies: logger: ^2.3.0 quiver: ^3.2.1 sentry: ^8.2.0 - supabase: ^2.1.3 + supabase: ^2.2.0 uuid: ^4.4.0 dev_dependencies: - build_runner: ^2.4.10 + build_runner: ^2.4.11 json_serializable: ^6.8.0 lint: ^2.3.0 - test: ^1.25.5 + test: ^1.25.7 diff --git a/designer_v2/pubspec.lock b/designer_v2/pubspec.lock index 2f32d7681..2249506b0 100644 --- a/designer_v2/pubspec.lock +++ b/designer_v2/pubspec.lock @@ -37,10 +37,10 @@ packages: dependency: "direct main" description: name: archive - sha256: "6bd38d335f0954f5fad9c79e614604fbf03a0e5b975923dd001b6ea965ef5b4b" + sha256: cb6a278ef2dbb298455e1a713bda08524a175630ec643a242c399c932a0a1f7d url: "https://pub.dev" source: hosted - version: "3.6.0" + version: "3.6.1" args: dependency: transitive description: @@ -387,10 +387,10 @@ packages: dependency: "direct main" description: name: go_router - sha256: "6ad5662b014c06c20fa46ab78715c96b2222a7fe4f87bf77e0289592c2539e86" + sha256: abec47eb8c8c36ebf41d0a4c64dbbe7f956e39a012b3aafc530e951bdc12fe3f url: "https://pub.dev" source: hosted - version: "14.1.3" + version: "14.1.4" gotrue: dependency: transitive description: @@ -624,10 +624,10 @@ packages: dependency: transitive description: name: path_provider_android - sha256: a248d8146ee5983446bf03ed5ea8f6533129a12b11f12057ad1b4a67a2b3b41d + sha256: "9c96da072b421e98183f9ea7464898428e764bc0ce5567f27ec8693442e72514" url: "https://pub.dev" source: hosted - version: "2.2.4" + version: "2.2.5" path_provider_foundation: dependency: transitive description: @@ -664,10 +664,10 @@ packages: dependency: "direct dev" description: name: patrol_finders - sha256: e14214e88c84d34a1d7c89778ddf5c5a913bfc0a6a308da47d3ebca374a1f5f4 + sha256: "6bf2c3093fbccd02f80f73fafc1bd021d76410cbab6e329be220b5e3bc58f072" url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.1.2" petitparser: dependency: transitive description: @@ -704,10 +704,10 @@ packages: dependency: transitive description: name: pointer_interceptor_ios - sha256: "2e73c39452830adc4695757130676a39412a3b7f3c34e3f752791b5384770877" + sha256: a6906772b3205b42c44614fcea28f818b1e5fdad73a4ca742a7bd49818d9c917 url: "https://pub.dev" source: hosted - version: "0.10.0+2" + version: "0.10.1" pointer_interceptor_platform_interface: dependency: transitive description: @@ -760,10 +760,10 @@ packages: dependency: transitive description: name: pubspec_parse - sha256: c63b2876e58e194e4b0828fcb080ad0e06d051cb607a6be51a9e084f47cb9367 + sha256: c799b721d79eb6ee6fa56f00c04b472dcd44a30d258fac2174a6ec57302678f8 url: "https://pub.dev" source: hosted - version: "1.2.3" + version: "1.3.0" quiver: dependency: transitive description: @@ -808,10 +808,10 @@ packages: dependency: transitive description: name: realtime_client - sha256: "492a1ab568b3812cb345aad8dd09b3936877edba81a6ab6f5fdf365c155797e1" + sha256: cd44fa21407a2e217d674f1c1a33b36c49ad0d8aea0349bf5b66594db06c80fb url: "https://pub.dev" source: hosted - version: "2.0.4" + version: "2.1.0" retry: dependency: transitive description: @@ -872,10 +872,10 @@ packages: dependency: transitive description: name: shared_preferences_android - sha256: "1ee8bf911094a1b592de7ab29add6f826a7331fb854273d55918693d5364a1f2" + sha256: "93d0ec9dd902d85f326068e6a899487d1f65ffcd5798721a95330b26c8131577" url: "https://pub.dev" source: hosted - version: "2.2.2" + version: "2.2.3" shared_preferences_foundation: dependency: transitive description: @@ -1005,10 +1005,10 @@ packages: dependency: transitive description: name: storage_client - sha256: bf5589d5de61a2451edb1b8960a0e673d4bb5c42ecc4dddf7c051a93789ced34 + sha256: e37f1b9d40f43078d12bd2d1b6b08c2c16fbdbafc58b57bc44922da6ea3f5625 url: "https://pub.dev" source: hosted - version: "2.0.1" + version: "2.0.2" stream_channel: dependency: transitive description: @@ -1051,18 +1051,18 @@ packages: dependency: "direct main" description: name: supabase - sha256: cd3d6bcc6b15ffd6eacea92ec2a2d9f09bf72c8a95c09a14f3b523ae9ee99cb6 + sha256: "4555658031af0a8b38c7375f28e4b35312291f4aab0ca504dd76661381ce134f" url: "https://pub.dev" source: hosted - version: "2.1.3" + version: "2.2.0" supabase_flutter: dependency: "direct main" description: name: supabase_flutter - sha256: "7f552ddddb2f1ac2925dc70af655b39bb64f8d3c1ca6dda58685d1fb4eec447c" + sha256: "1d6fb4ffaf50fc6f60507ab8ebf0b7dedbe6fabfbd8066db6f2a6552ddd0ea8c" url: "https://pub.dev" source: hosted - version: "2.5.3" + version: "2.5.4" sync_http: dependency: transitive description: @@ -1123,18 +1123,18 @@ packages: dependency: "direct main" description: name: url_launcher - sha256: "6ce1e04375be4eed30548f10a315826fd933c1e493206eab82eed01f438c8d2e" + sha256: "21b704ce5fa560ea9f3b525b43601c678728ba46725bab9b01187b4831377ed3" url: "https://pub.dev" source: hosted - version: "6.2.6" + version: "6.3.0" url_launcher_android: dependency: transitive description: name: url_launcher_android - sha256: "17cd5e205ea615e2c6ea7a77323a11712dffa0720a8a90540db57a01347f9ad9" + sha256: ceb2625f0c24ade6ef6778d1de0b2e44f2db71fded235eb52295247feba8c5cf url: "https://pub.dev" source: hosted - version: "6.3.2" + version: "6.3.3" url_launcher_ios: dependency: transitive description: @@ -1289,4 +1289,4 @@ packages: version: "2.0.0" sdks: dart: ">=3.4.0 <4.0.0" - flutter: ">=3.19.0" + flutter: ">=3.22.0" diff --git a/designer_v2/pubspec.yaml b/designer_v2/pubspec.yaml index 1b61424f4..0433e7fb8 100644 --- a/designer_v2/pubspec.yaml +++ b/designer_v2/pubspec.yaml @@ -9,7 +9,7 @@ environment: sdk: '>=3.0.0 <4.0.0' dependencies: - archive: ^3.6.0 + archive: ^3.6.1 async: ^2.11.0 csv: ^6.0.0 cupertino_icons: ^1.0.8 @@ -23,7 +23,7 @@ dependencies: flutter_riverpod: ^2.5.1 flutter_web_plugins: sdk: flutter - go_router: ^14.1.3 + go_router: ^14.1.4 material_color_utilities: 0.8.0 # integration_test material_design_icons_flutter: ^7.0.7296 pointer_interceptor: ^0.10.1+1 @@ -34,9 +34,9 @@ dependencies: rxdart: ^0.27.7 studyu_core: ^4.4.2 studyu_flutter_common: ^1.8.3 - supabase: ^2.1.3 - supabase_flutter: ^2.5.3 - url_launcher: ^6.2.6 + supabase: ^2.2.0 + supabase_flutter: ^2.5.4 + url_launcher: ^6.3.0 uuid: ^4.4.0 dev_dependencies: @@ -47,7 +47,7 @@ dev_dependencies: sdk: flutter integration_test: sdk: flutter - patrol_finders: ^2.1.0 + patrol_finders: ^2.1.2 riverpod_lint: test: ^1.24.9 # integration_test diff --git a/flutter_common/pubspec.lock b/flutter_common/pubspec.lock index 186714fa5..8b36fee9e 100644 --- a/flutter_common/pubspec.lock +++ b/flutter_common/pubspec.lock @@ -332,10 +332,10 @@ packages: dependency: transitive description: name: path_provider_android - sha256: a248d8146ee5983446bf03ed5ea8f6533129a12b11f12057ad1b4a67a2b3b41d + sha256: "9c96da072b421e98183f9ea7464898428e764bc0ce5567f27ec8693442e72514" url: "https://pub.dev" source: hosted - version: "2.2.4" + version: "2.2.5" path_provider_foundation: dependency: transitive description: @@ -404,10 +404,10 @@ packages: dependency: transitive description: name: realtime_client - sha256: "492a1ab568b3812cb345aad8dd09b3936877edba81a6ab6f5fdf365c155797e1" + sha256: cd44fa21407a2e217d674f1c1a33b36c49ad0d8aea0349bf5b66594db06c80fb url: "https://pub.dev" source: hosted - version: "2.0.4" + version: "2.1.0" retry: dependency: transitive description: @@ -444,10 +444,10 @@ packages: dependency: transitive description: name: shared_preferences_android - sha256: "1ee8bf911094a1b592de7ab29add6f826a7331fb854273d55918693d5364a1f2" + sha256: "93d0ec9dd902d85f326068e6a899487d1f65ffcd5798721a95330b26c8131577" url: "https://pub.dev" source: hosted - version: "2.2.2" + version: "2.2.3" shared_preferences_foundation: dependency: transitive description: @@ -521,10 +521,10 @@ packages: dependency: transitive description: name: storage_client - sha256: bf5589d5de61a2451edb1b8960a0e673d4bb5c42ecc4dddf7c051a93789ced34 + sha256: e37f1b9d40f43078d12bd2d1b6b08c2c16fbdbafc58b57bc44922da6ea3f5625 url: "https://pub.dev" source: hosted - version: "2.0.1" + version: "2.0.2" stream_channel: dependency: transitive description: @@ -552,18 +552,18 @@ packages: dependency: transitive description: name: supabase - sha256: cd3d6bcc6b15ffd6eacea92ec2a2d9f09bf72c8a95c09a14f3b523ae9ee99cb6 + sha256: "4555658031af0a8b38c7375f28e4b35312291f4aab0ca504dd76661381ce134f" url: "https://pub.dev" source: hosted - version: "2.1.3" + version: "2.2.0" supabase_flutter: dependency: "direct main" description: name: supabase_flutter - sha256: "7f552ddddb2f1ac2925dc70af655b39bb64f8d3c1ca6dda58685d1fb4eec447c" + sha256: "1d6fb4ffaf50fc6f60507ab8ebf0b7dedbe6fabfbd8066db6f2a6552ddd0ea8c" url: "https://pub.dev" source: hosted - version: "2.5.3" + version: "2.5.4" synchronized: dependency: "direct main" description: @@ -600,18 +600,18 @@ packages: dependency: transitive description: name: url_launcher - sha256: "6ce1e04375be4eed30548f10a315826fd933c1e493206eab82eed01f438c8d2e" + sha256: "21b704ce5fa560ea9f3b525b43601c678728ba46725bab9b01187b4831377ed3" url: "https://pub.dev" source: hosted - version: "6.2.6" + version: "6.3.0" url_launcher_android: dependency: transitive description: name: url_launcher_android - sha256: "17cd5e205ea615e2c6ea7a77323a11712dffa0720a8a90540db57a01347f9ad9" + sha256: ceb2625f0c24ade6ef6778d1de0b2e44f2db71fded235eb52295247feba8c5cf url: "https://pub.dev" source: hosted - version: "6.3.2" + version: "6.3.3" url_launcher_ios: dependency: transitive description: @@ -726,4 +726,4 @@ packages: version: "2.0.0" sdks: dart: ">=3.4.0 <4.0.0" - flutter: ">=3.19.0" + flutter: ">=3.22.0" diff --git a/flutter_common/pubspec.yaml b/flutter_common/pubspec.yaml index d805948b0..087c68c8b 100644 --- a/flutter_common/pubspec.yaml +++ b/flutter_common/pubspec.yaml @@ -14,7 +14,7 @@ dependencies: flutter_secure_storage: ^9.2.2 shared_preferences: ^2.2.3 # Can be removed after migrating phase studyu_core: ^4.4.2 - supabase_flutter: ^2.5.3 + supabase_flutter: ^2.5.4 synchronized: ^3.1.0+1 uuid: ^4.4.0 diff --git a/pubspec.lock b/pubspec.lock index fc4a0080a..ca3ec2ce5 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -301,10 +301,10 @@ packages: dependency: transitive description: name: test_api - sha256: "2419f20b0c8677b2d67c8ac4d1ac7372d862dc6c460cdbb052b40155408cd794" + sha256: "5b8a98dafc4d5c4c9c72d8b31ab2b23fc13422348d2997120294d3bac86b4ddb" url: "https://pub.dev" source: hosted - version: "0.7.1" + version: "0.7.2" typed_data: dependency: transitive description: From 72226c65476c12dcc07bdedee726ae6fea01f30c Mon Sep 17 00:00:00 2001 From: Johannes Vedder Date: Fri, 7 Jun 2024 13:57:49 +0200 Subject: [PATCH 124/314] fix: check if canPop --- designer_v2/lib/common_views/form_scaffold.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/designer_v2/lib/common_views/form_scaffold.dart b/designer_v2/lib/common_views/form_scaffold.dart index 5b8577374..279ffd02f 100644 --- a/designer_v2/lib/common_views/form_scaffold.dart +++ b/designer_v2/lib/common_views/form_scaffold.dart @@ -65,7 +65,7 @@ class _FormScaffoldState extends ConsumerState Date: Fri, 7 Jun 2024 13:58:12 +0200 Subject: [PATCH 125/314] fix: integration test sign out --- designer_v2/integration_test/app_test.dart | 4 ++-- designer_v2/integration_test/robots/studies_robot.dart | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/designer_v2/integration_test/app_test.dart b/designer_v2/integration_test/app_test.dart index 32c695770..1dc1673e5 100644 --- a/designer_v2/integration_test/app_test.dart +++ b/designer_v2/integration_test/app_test.dart @@ -120,7 +120,7 @@ void main() { */ // We start with a new account and study here, since tests run asynchronously and // previous tests might not have been completed when running this one - patrolWidgetTest('Publish a study', semanticsEnabled: false, ($) async { + patrolWidgetTest('Publish a study', (PatrolTester $) async { final appRobot = AppRobot($); // RM final authRobot = AuthRobot($); // RM final studiesRobot = StudiesRobot($); @@ -231,7 +231,7 @@ void main() { await studyDesignRobot.tapMyStudiesButton(); await studiesRobot.validateOnStudiesScreen(); - // await studiesRobot.tapSignOutButton(); // does not work + await studiesRobot.tapSignOutButton(); // todo dump database data and validate its state }); diff --git a/designer_v2/integration_test/robots/studies_robot.dart b/designer_v2/integration_test/robots/studies_robot.dart index e21634498..56e32f8a2 100644 --- a/designer_v2/integration_test/robots/studies_robot.dart +++ b/designer_v2/integration_test/robots/studies_robot.dart @@ -1,3 +1,4 @@ +import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:patrol_finders/patrol_finders.dart'; import 'package:studyu_designer_v2/localization/app_translation.dart'; @@ -32,6 +33,6 @@ class StudiesRobot { } Future tapSignOutButton() async { - await $(tr.navlink_logout).tap(); + await $(Icons.logout_rounded).tap(); } } From 7f03dd541bd8af254179cc8197a42c973d14becf Mon Sep 17 00:00:00 2001 From: Johannes Vedder Date: Fri, 7 Jun 2024 14:04:17 +0200 Subject: [PATCH 126/314] chore(release): publish packages - studyu_app@2.7.6-dev.0 - studyu_core@4.4.3-dev.0 - studyu_designer_v2@1.8.1-dev.0 - studyu_flutter_common@1.8.4-dev.0 --- CHANGELOG.md | 42 +++++++++++++++++++++++++++++++++++++ app/CHANGELOG.md | 5 +++++ app/pubspec.yaml | 6 +++--- core/CHANGELOG.md | 4 ++++ core/pubspec.yaml | 2 +- designer_v2/CHANGELOG.md | 8 +++++++ designer_v2/pubspec.yaml | 6 +++--- flutter_common/CHANGELOG.md | 5 +++++ flutter_common/pubspec.yaml | 4 ++-- 9 files changed, 73 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 23f3fc9b7..1db85e632 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,48 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## 2024-06-07 + +### Changes + +--- + +Packages with breaking changes: + + - There are no breaking changes in this release. + +Packages with other changes: + + - [`studyu_app` - `v2.7.6-dev.0`](#studyu_app---v276-dev0) + - [`studyu_core` - `v4.4.3-dev.0`](#studyu_core---v443-dev0) + - [`studyu_designer_v2` - `v1.8.1-dev.0`](#studyu_designer_v2---v181-dev0) + - [`studyu_flutter_common` - `v1.8.4-dev.0`](#studyu_flutter_common---v184-dev0) + +--- + +#### `studyu_app` - `v2.7.6-dev.0` + + - **FIX**: upgrade deps. + - **FIX**: UI overflows. + +#### `studyu_core` - `v4.4.3-dev.0` + + - **FIX**: upgrade deps. + +#### `studyu_designer_v2` - `v1.8.1-dev.0` + + - **FIX**: integration test sign out. + - **FIX**: check if canPop. + - **FIX**: upgrade deps. + - **FIX**: add compatibility for emoji font with flutter >= 3.22. + - **FIX**: Flutter 3.22 arg error. + +#### `studyu_flutter_common` - `v1.8.4-dev.0` + + - **FIX**: upgrade deps. + - **FIX**: put supabase cli default anon key in env.local.example. + + ## 2024-05-13 ### Changes diff --git a/app/CHANGELOG.md b/app/CHANGELOG.md index cc511277d..04fa5959a 100644 --- a/app/CHANGELOG.md +++ b/app/CHANGELOG.md @@ -1,3 +1,8 @@ +## 2.7.6-dev.0 + + - **FIX**: upgrade deps. + - **FIX**: UI overflows. + ## 2.7.5 - **FIX**: update podfile. diff --git a/app/pubspec.yaml b/app/pubspec.yaml index f17b4a2d6..d8a506c33 100644 --- a/app/pubspec.yaml +++ b/app/pubspec.yaml @@ -1,5 +1,5 @@ name: studyu_app -version: 2.7.5 +version: 2.7.6-dev.0 description: Partake in digital N-of-1 trials with the innovative StudyU Health App publish_to: none homepage: https://studyu.health @@ -38,8 +38,8 @@ dependencies: sentry_flutter: ^8.2.0 sentry_logging: ^8.2.0 shared_preferences: ^2.2.3 - studyu_core: ^4.4.2 - studyu_flutter_common: ^1.8.3 + studyu_core: ^4.4.3-dev.0 + studyu_flutter_common: ^1.8.4-dev.0 supabase: ^2.2.0 supabase_flutter: ^2.5.4 timeline_tile: ^2.0.0 diff --git a/core/CHANGELOG.md b/core/CHANGELOG.md index 7b8d97130..e0bc5355a 100644 --- a/core/CHANGELOG.md +++ b/core/CHANGELOG.md @@ -1,3 +1,7 @@ +## 4.4.3-dev.0 + + - **FIX**: upgrade deps. + ## 4.4.2 - Graduate package to a stable release. See pre-releases prior to this version for changelog entries. diff --git a/core/pubspec.yaml b/core/pubspec.yaml index 79cb2380c..71b920c99 100644 --- a/core/pubspec.yaml +++ b/core/pubspec.yaml @@ -1,5 +1,5 @@ name: studyu_core -version: 4.4.2 +version: 4.4.3-dev.0 description: This package contains StudyU models and common functions for the app and designer packages homepage: https://studyu.health repository: https://github.com/hpi-studyu/studyu diff --git a/designer_v2/CHANGELOG.md b/designer_v2/CHANGELOG.md index dbe71f863..8c8e14f82 100644 --- a/designer_v2/CHANGELOG.md +++ b/designer_v2/CHANGELOG.md @@ -1,3 +1,11 @@ +## 1.8.1-dev.0 + + - **FIX**: integration test sign out. + - **FIX**: check if canPop. + - **FIX**: upgrade deps. + - **FIX**: add compatibility for emoji font with flutter >= 3.22. + - **FIX**: Flutter 3.22 arg error. + ## 1.8.0 - Graduate package to a stable release. See pre-releases prior to this version for changelog entries. diff --git a/designer_v2/pubspec.yaml b/designer_v2/pubspec.yaml index 0433e7fb8..11e6e4b0e 100644 --- a/designer_v2/pubspec.yaml +++ b/designer_v2/pubspec.yaml @@ -1,5 +1,5 @@ name: studyu_designer_v2 -version: 1.8.0 +version: 1.8.1-dev.0 description: Implement digital N-of-1 studies seamlessly with the StudyU Health Designer publish_to: none homepage: https://studyu.health @@ -32,8 +32,8 @@ dependencies: reactive_multi_select_flutter: ^2.0.1 reactive_range_slider: ^2.1.0 rxdart: ^0.27.7 - studyu_core: ^4.4.2 - studyu_flutter_common: ^1.8.3 + studyu_core: ^4.4.3-dev.0 + studyu_flutter_common: ^1.8.4-dev.0 supabase: ^2.2.0 supabase_flutter: ^2.5.4 url_launcher: ^6.3.0 diff --git a/flutter_common/CHANGELOG.md b/flutter_common/CHANGELOG.md index e15cea9e6..aed61c52d 100644 --- a/flutter_common/CHANGELOG.md +++ b/flutter_common/CHANGELOG.md @@ -1,3 +1,8 @@ +## 1.8.4-dev.0 + + - **FIX**: upgrade deps. + - **FIX**: put supabase cli default anon key in env.local.example. + ## 1.8.3 - Graduate package to a stable release. See pre-releases prior to this version for changelog entries. diff --git a/flutter_common/pubspec.yaml b/flutter_common/pubspec.yaml index 087c68c8b..97e4a4f30 100644 --- a/flutter_common/pubspec.yaml +++ b/flutter_common/pubspec.yaml @@ -1,5 +1,5 @@ name: studyu_flutter_common -version: 1.8.3 +version: 1.8.4-dev.0 description: StudyU common flutter components and functions for app and designer homepage: https://studyu.health repository: https://github.com/hpi-studyu/studyu @@ -13,7 +13,7 @@ dependencies: flutter_dotenv: ^5.1.0 flutter_secure_storage: ^9.2.2 shared_preferences: ^2.2.3 # Can be removed after migrating phase - studyu_core: ^4.4.2 + studyu_core: ^4.4.3-dev.0 supabase_flutter: ^2.5.4 synchronized: ^3.1.0+1 uuid: ^4.4.0 From 3bfeb3c05ccbddea0524a1cfe10eee0dcb09d20f Mon Sep 17 00:00:00 2001 From: Johannes Vedder Date: Fri, 7 Jun 2024 14:05:05 +0200 Subject: [PATCH 127/314] chore: lock files --- app/pubspec.lock | 4 ++-- designer_v2/pubspec.lock | 4 ++-- flutter_common/pubspec.lock | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/app/pubspec.lock b/app/pubspec.lock index 6e0484250..f1b37c873 100644 --- a/app/pubspec.lock +++ b/app/pubspec.lock @@ -1176,14 +1176,14 @@ packages: path: "../core" relative: true source: path - version: "4.4.2" + version: "4.4.3-dev.0" studyu_flutter_common: dependency: "direct main" description: path: "../flutter_common" relative: true source: path - version: "1.8.3" + version: "1.8.4-dev.0" supabase: dependency: "direct main" description: diff --git a/designer_v2/pubspec.lock b/designer_v2/pubspec.lock index 2249506b0..699474e79 100644 --- a/designer_v2/pubspec.lock +++ b/designer_v2/pubspec.lock @@ -1039,14 +1039,14 @@ packages: path: "../core" relative: true source: path - version: "4.4.2" + version: "4.4.3-dev.0" studyu_flutter_common: dependency: "direct main" description: path: "../flutter_common" relative: true source: path - version: "1.8.3" + version: "1.8.4-dev.0" supabase: dependency: "direct main" description: diff --git a/flutter_common/pubspec.lock b/flutter_common/pubspec.lock index 8b36fee9e..4a88183fe 100644 --- a/flutter_common/pubspec.lock +++ b/flutter_common/pubspec.lock @@ -547,7 +547,7 @@ packages: path: "../core" relative: true source: path - version: "4.4.2" + version: "4.4.3-dev.0" supabase: dependency: transitive description: From 0178db42746f1944c428175ff48743472d33132c Mon Sep 17 00:00:00 2001 From: Johannes Vedder Date: Fri, 7 Jun 2024 14:31:06 +0200 Subject: [PATCH 128/314] fix: add emojis again --- designer_v2/web/flutter_bootstrap.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/designer_v2/web/flutter_bootstrap.js b/designer_v2/web/flutter_bootstrap.js index 45f76ee49..3951307ec 100644 --- a/designer_v2/web/flutter_bootstrap.js +++ b/designer_v2/web/flutter_bootstrap.js @@ -72,7 +72,9 @@ document.body.appendChild(loadingDiv); // Loading entrypoint _flutter.loader.load({ onEntrypointLoaded: async function(engineInitializer) { - const appRunner = await engineInitializer.initializeEngine(); + const appRunner = await engineInitializer.initializeEngine({ + useColorEmoji: true, + }); loadingDiv.classList.add('init_done'); // Hide the loading indicator after the animation is done From e11704d917a8f7dd29d3f97c6f0ad6494c4c00c8 Mon Sep 17 00:00:00 2001 From: Johannes Vedder Date: Sun, 9 Jun 2024 18:23:45 +0200 Subject: [PATCH 129/314] chore: bump minSdkVersion --- app/android/app/build.gradle | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/android/app/build.gradle b/app/android/app/build.gradle index 0d97d49a1..cf6010963 100644 --- a/app/android/app/build.gradle +++ b/app/android/app/build.gradle @@ -63,8 +63,7 @@ android { applicationId "health.studyu.app" // You can update the following values to match your application needs. // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration - // camera_android requires at least sdk 21 - minSdkVersion Math.max(flutter.minSdkVersion, 21) + minSdkVersion Math.max(flutter.minSdkVersion, 23) targetSdkVersion flutter.targetSdkVersion versionCode flutterVersionCode.toInteger() versionName flutterVersionName From 7dc5c076c91f3f45fe091d2488330249cb6693c1 Mon Sep 17 00:00:00 2001 From: Johannes Vedder Date: Sun, 9 Jun 2024 21:31:08 +0200 Subject: [PATCH 130/314] chore: fix melos package filter --- melos.yaml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/melos.yaml b/melos.yaml index 295c6bb6a..975cdf402 100644 --- a/melos.yaml +++ b/melos.yaml @@ -56,7 +56,7 @@ scripts: "flutter test" description: Run `flutter test` for a specific package. packageFilters: - dir-exists: test + dirExists: test generate: run: | @@ -125,10 +125,10 @@ scripts: build:android: run: | melos exec -c 2 --fail-fast -- \ - "flutter build apk --multidex" + "flutter build apk" description: Build app for Android. packageFilters: - dir-exists: android + dirExists: android build:ios: run: | @@ -136,7 +136,7 @@ scripts: "flutter build ipa --no-codesign" description: Build app for iOS. packageFilters: - dir-exists: ios + dirExists: ios build:web: run: | @@ -145,7 +145,7 @@ scripts: description: Build app for Web. packageFilters: scope: [studyu_app, studyu_designer_v2] - dir-exists: web + dirExists: web build:web:app: run: | @@ -170,7 +170,7 @@ scripts: description: Build web dev. packageFilters: scope: [studyu_app, studyu_designer_v2] - dir-exists: web + dirExists: web build:web:app:dev: run: | @@ -179,7 +179,7 @@ scripts: description: Build web app dev. packageFilters: scope: studyu_app - dir-exists: web + dirExists: web build:web:designer_v2:dev: run: | @@ -188,4 +188,4 @@ scripts: description: Build web designer_v2 dev. packageFilters: scope: studyu_designer_v2 - dir-exists: web + dirExists: web From 75a5efd3d9c9aad0f3ebc0729590f76ed3fe31c5 Mon Sep 17 00:00:00 2001 From: Johannes Vedder Date: Sun, 9 Jun 2024 22:09:09 +0200 Subject: [PATCH 131/314] fix(app): update android deployment --- app/.metadata | 30 +++++------ app/android/Gemfile.lock | 18 +++---- app/android/app/build.gradle | 52 +++++++++---------- app/android/app/src/main/AndroidManifest.xml | 12 +++++ .../app/{studyu_app => }/MainActivity.kt | 3 +- app/android/build.gradle | 16 +----- app/android/gradle.properties | 2 +- .../gradle/wrapper/gradle-wrapper.properties | 2 +- app/android/settings.gradle | 12 ++--- 9 files changed, 69 insertions(+), 78 deletions(-) rename app/android/app/src/main/kotlin/health/studyu/app/{studyu_app => }/MainActivity.kt (65%) diff --git a/app/.metadata b/app/.metadata index eea2802f1..6eb54a17b 100644 --- a/app/.metadata +++ b/app/.metadata @@ -4,7 +4,7 @@ # This file should be version controlled and should not be manually edited. version: - revision: "67457e669f79e9f8d13d7a68fe09775fefbb79f4" + revision: "761747bfc538b5af34aa0d3fac380f1bc331ec49" channel: "stable" project_type: app @@ -13,26 +13,26 @@ project_type: app migration: platforms: - platform: root - create_revision: 67457e669f79e9f8d13d7a68fe09775fefbb79f4 - base_revision: 67457e669f79e9f8d13d7a68fe09775fefbb79f4 + create_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49 + base_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49 - platform: android - create_revision: 67457e669f79e9f8d13d7a68fe09775fefbb79f4 - base_revision: 67457e669f79e9f8d13d7a68fe09775fefbb79f4 + create_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49 + base_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49 - platform: ios - create_revision: 67457e669f79e9f8d13d7a68fe09775fefbb79f4 - base_revision: 67457e669f79e9f8d13d7a68fe09775fefbb79f4 + create_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49 + base_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49 - platform: linux - create_revision: 67457e669f79e9f8d13d7a68fe09775fefbb79f4 - base_revision: 67457e669f79e9f8d13d7a68fe09775fefbb79f4 + create_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49 + base_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49 - platform: macos - create_revision: 67457e669f79e9f8d13d7a68fe09775fefbb79f4 - base_revision: 67457e669f79e9f8d13d7a68fe09775fefbb79f4 + create_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49 + base_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49 - platform: web - create_revision: 67457e669f79e9f8d13d7a68fe09775fefbb79f4 - base_revision: 67457e669f79e9f8d13d7a68fe09775fefbb79f4 + create_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49 + base_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49 - platform: windows - create_revision: 67457e669f79e9f8d13d7a68fe09775fefbb79f4 - base_revision: 67457e669f79e9f8d13d7a68fe09775fefbb79f4 + create_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49 + base_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49 # User provided section diff --git a/app/android/Gemfile.lock b/app/android/Gemfile.lock index a785ea5d2..6102ebb87 100644 --- a/app/android/Gemfile.lock +++ b/app/android/Gemfile.lock @@ -10,17 +10,17 @@ GEM artifactory (3.0.17) atomos (0.1.3) aws-eventstream (1.3.0) - aws-partitions (1.933.0) - aws-sdk-core (3.196.1) + aws-partitions (1.941.0) + aws-sdk-core (3.197.0) aws-eventstream (~> 1, >= 1.3.0) aws-partitions (~> 1, >= 1.651.0) aws-sigv4 (~> 1.8) jmespath (~> 1, >= 1.6.1) - aws-sdk-kms (1.82.0) - aws-sdk-core (~> 3, >= 3.193.0) + aws-sdk-kms (1.83.0) + aws-sdk-core (~> 3, >= 3.197.0) aws-sigv4 (~> 1.1) - aws-sdk-s3 (1.151.0) - aws-sdk-core (~> 3, >= 3.194.0) + aws-sdk-s3 (1.152.0) + aws-sdk-core (~> 3, >= 3.197.0) aws-sdk-kms (~> 1) aws-sigv4 (~> 1.8) aws-sigv4 (1.8.0) @@ -147,7 +147,7 @@ GEM os (>= 0.9, < 2.0) signet (>= 0.16, < 2.a) highline (2.0.3) - http-cookie (1.0.5) + http-cookie (1.0.6) domain_name (~> 0.5) httpclient (2.8.3) jmespath (1.6.2) @@ -171,8 +171,8 @@ GEM trailblazer-option (>= 0.1.1, < 0.2.0) uber (< 0.2.0) retriable (3.1.2) - rexml (3.2.8) - strscan (>= 3.0.9) + rexml (3.2.9) + strscan rouge (2.0.7) ruby2_keywords (0.0.5) rubyzip (2.3.2) diff --git a/app/android/app/build.gradle b/app/android/app/build.gradle index cf6010963..dbbbe5092 100644 --- a/app/android/app/build.gradle +++ b/app/android/app/build.gradle @@ -1,25 +1,26 @@ plugins { id "com.android.application" id "kotlin-android" + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. id "dev.flutter.flutter-gradle-plugin" } def localProperties = new Properties() -def localPropertiesFile = rootProject.file('local.properties') +def localPropertiesFile = rootProject.file("local.properties") if (localPropertiesFile.exists()) { - localPropertiesFile.withReader('UTF-8') { reader -> + localPropertiesFile.withReader("UTF-8") { reader -> localProperties.load(reader) } } -def flutterVersionCode = localProperties.getProperty('flutter.versionCode') +def flutterVersionCode = localProperties.getProperty("flutter.versionCode") if (flutterVersionCode == null) { - flutterVersionCode = '1' + flutterVersionCode = "1" } -def flutterVersionName = localProperties.getProperty('flutter.versionName') +def flutterVersionName = localProperties.getProperty("flutter.versionName") if (flutterVersionName == null) { - flutterVersionName = '1.0' + flutterVersionName = "1.0" } def keystoreProperties = new Properties() @@ -29,44 +30,39 @@ if (keystorePropertiesFile.exists()) { } android { - namespace "health.studyu.app" + namespace = "health.studyu.app" // Start flutter_local_notifications - compileSdkVersion Math.max(flutter.compileSdkVersion, 34) + compileSdkVersion = Math.max(flutter.compileSdkVersion, 34) // End flutter_local_notifications - - ndkVersion flutter.ndkVersion + // temp fix for record_audio package instead of "flutter.ndkVersion" + ndkVersion = "26.1.10909125" // Start flutter_local_notifications defaultConfig { - multiDexEnabled true + multiDexEnabled = true } // End flutter_local_notifications compileOptions { // Start flutter_local_notifications // Flag to enable support for the new language APIs - coreLibraryDesugaringEnabled true + coreLibraryDesugaringEnabled = true // End flutter_local_notifications - sourceCompatibility JavaVersion.VERSION_1_8 - targetCompatibility JavaVersion.VERSION_1_8 + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 } - kotlinOptions { - jvmTarget = '1.8' - } - - sourceSets { - main.java.srcDirs += 'src/main/kotlin' + jvmTarget = '17' } defaultConfig { - applicationId "health.studyu.app" + applicationId = "health.studyu.app" // You can update the following values to match your application needs. - // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration - minSdkVersion Math.max(flutter.minSdkVersion, 23) - targetSdkVersion flutter.targetSdkVersion - versionCode flutterVersionCode.toInteger() - versionName flutterVersionName + // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration. + minSdk = Math.max(flutter.minSdkVersion, 23) + targetSdk = flutter.targetSdkVersion + versionCode = flutterVersionCode.toInteger() + versionName = flutterVersionName } signingConfigs { @@ -79,13 +75,13 @@ android { } buildTypes { release { - signingConfig keystorePropertiesFile.exists() ? signingConfigs.release : null + signingConfig = keystorePropertiesFile.exists() ? signingConfigs.release : null } } } flutter { - source '../..' + source = "../.." } dependencies { diff --git a/app/android/app/src/main/AndroidManifest.xml b/app/android/app/src/main/AndroidManifest.xml index 9a2bf234f..f195e55a9 100644 --- a/app/android/app/src/main/AndroidManifest.xml +++ b/app/android/app/src/main/AndroidManifest.xml @@ -34,6 +34,7 @@ android:name=".MainActivity" android:exported="true" android:launchMode="singleTop" + android:taskAffinity="" android:theme="@style/LaunchTheme" android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode" android:hardwareAccelerated="true" @@ -68,4 +69,15 @@ android:name="flutterEmbedding" android:value="2" /> + + + + + + + diff --git a/app/android/app/src/main/kotlin/health/studyu/app/studyu_app/MainActivity.kt b/app/android/app/src/main/kotlin/health/studyu/app/MainActivity.kt similarity index 65% rename from app/android/app/src/main/kotlin/health/studyu/app/studyu_app/MainActivity.kt rename to app/android/app/src/main/kotlin/health/studyu/app/MainActivity.kt index fdeb24d36..2e44fe3cb 100644 --- a/app/android/app/src/main/kotlin/health/studyu/app/studyu_app/MainActivity.kt +++ b/app/android/app/src/main/kotlin/health/studyu/app/MainActivity.kt @@ -2,5 +2,4 @@ package health.studyu.app import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() { -} +class MainActivity: FlutterActivity() diff --git a/app/android/build.gradle b/app/android/build.gradle index e83fb5dac..d2ffbffa4 100644 --- a/app/android/build.gradle +++ b/app/android/build.gradle @@ -1,15 +1,3 @@ -buildscript { - ext.kotlin_version = '1.7.10' - repositories { - google() - mavenCentral() - } - - dependencies { - classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" - } -} - allprojects { repositories { google() @@ -17,12 +5,12 @@ allprojects { } } -rootProject.buildDir = '../build' +rootProject.buildDir = "../build" subprojects { project.buildDir = "${rootProject.buildDir}/${project.name}" } subprojects { - project.evaluationDependsOn(':app') + project.evaluationDependsOn(":app") } tasks.register("clean", Delete) { diff --git a/app/android/gradle.properties b/app/android/gradle.properties index 598d13fee..3b5b324f6 100644 --- a/app/android/gradle.properties +++ b/app/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G +org.gradle.jvmargs=-Xmx4G -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/app/android/gradle/wrapper/gradle-wrapper.properties b/app/android/gradle/wrapper/gradle-wrapper.properties index 3c472b99c..5af0f539c 100644 --- a/app/android/gradle/wrapper/gradle-wrapper.properties +++ b/app/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.8-all.zip diff --git a/app/android/settings.gradle b/app/android/settings.gradle index 7cd712855..2054f554f 100644 --- a/app/android/settings.gradle +++ b/app/android/settings.gradle @@ -5,25 +5,21 @@ pluginManagement { def flutterSdkPath = properties.getProperty("flutter.sdk") assert flutterSdkPath != null, "flutter.sdk not set in local.properties" return flutterSdkPath - } - settings.ext.flutterSdkPath = flutterSdkPath() + }() - includeBuild("${settings.ext.flutterSdkPath}/packages/flutter_tools/gradle") + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") repositories { google() mavenCentral() gradlePluginPortal() } - - plugins { - id "dev.flutter.flutter-gradle-plugin" version "1.0.0" apply false - } } plugins { id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "7.3.0" apply false + id "com.android.application" version "8.4.0" apply false + id "org.jetbrains.kotlin.android" version "1.9.23" apply false } include ":app" From f85b9705a1f44efd2ced3a6d93cac1f22b6557cb Mon Sep 17 00:00:00 2001 From: Johannes Vedder Date: Sun, 9 Jun 2024 22:37:01 +0200 Subject: [PATCH 132/314] fix(app): update ios deployment --- app/ios/Flutter/AppFrameworkInfo.plist | 40 ++-- app/ios/Gemfile.lock | 18 +- app/ios/Runner.xcodeproj/project.pbxproj | 203 +++++++++--------- .../WorkspaceSettings.xcsettings} | 4 +- app/ios/Runner/AppDelegate.swift | 2 +- app/ios/Runner/Info.plist | 10 +- 6 files changed, 133 insertions(+), 144 deletions(-) rename app/ios/{Runner/Runner.entitlements => Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings} (76%) diff --git a/app/ios/Flutter/AppFrameworkInfo.plist b/app/ios/Flutter/AppFrameworkInfo.plist index 658d8c43c..7c5696400 100644 --- a/app/ios/Flutter/AppFrameworkInfo.plist +++ b/app/ios/Flutter/AppFrameworkInfo.plist @@ -2,25 +2,25 @@ - CFBundleDevelopmentRegion - en - CFBundleExecutable - App - CFBundleIdentifier - io.flutter.flutter.app - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - App - CFBundlePackageType - FMWK - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1.0 - MinimumOSVersion - 12.0 + CFBundleDevelopmentRegion + en + CFBundleExecutable + App + CFBundleIdentifier + io.flutter.flutter.app + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + App + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1.0 + MinimumOSVersion + 12.0 diff --git a/app/ios/Gemfile.lock b/app/ios/Gemfile.lock index a785ea5d2..6102ebb87 100644 --- a/app/ios/Gemfile.lock +++ b/app/ios/Gemfile.lock @@ -10,17 +10,17 @@ GEM artifactory (3.0.17) atomos (0.1.3) aws-eventstream (1.3.0) - aws-partitions (1.933.0) - aws-sdk-core (3.196.1) + aws-partitions (1.941.0) + aws-sdk-core (3.197.0) aws-eventstream (~> 1, >= 1.3.0) aws-partitions (~> 1, >= 1.651.0) aws-sigv4 (~> 1.8) jmespath (~> 1, >= 1.6.1) - aws-sdk-kms (1.82.0) - aws-sdk-core (~> 3, >= 3.193.0) + aws-sdk-kms (1.83.0) + aws-sdk-core (~> 3, >= 3.197.0) aws-sigv4 (~> 1.1) - aws-sdk-s3 (1.151.0) - aws-sdk-core (~> 3, >= 3.194.0) + aws-sdk-s3 (1.152.0) + aws-sdk-core (~> 3, >= 3.197.0) aws-sdk-kms (~> 1) aws-sigv4 (~> 1.8) aws-sigv4 (1.8.0) @@ -147,7 +147,7 @@ GEM os (>= 0.9, < 2.0) signet (>= 0.16, < 2.a) highline (2.0.3) - http-cookie (1.0.5) + http-cookie (1.0.6) domain_name (~> 0.5) httpclient (2.8.3) jmespath (1.6.2) @@ -171,8 +171,8 @@ GEM trailblazer-option (>= 0.1.1, < 0.2.0) uber (< 0.2.0) retriable (3.1.2) - rexml (3.2.8) - strscan (>= 3.0.9) + rexml (3.2.9) + strscan rouge (2.0.7) ruby2_keywords (0.0.5) rubyzip (2.3.2) diff --git a/app/ios/Runner.xcodeproj/project.pbxproj b/app/ios/Runner.xcodeproj/project.pbxproj index 277b82799..32da88680 100644 --- a/app/ios/Runner.xcodeproj/project.pbxproj +++ b/app/ios/Runner.xcodeproj/project.pbxproj @@ -8,14 +8,14 @@ /* Begin PBXBuildFile section */ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; + 2C0B37CAA7639B0F0E17EC9E /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4054400FD08195D6D039426B /* Pods_RunnerTests.framework */; }; 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; - DE4118BD26316093944BB547 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DCE547177D29B8D213743F79 /* Pods_RunnerTests.framework */; }; - FC481FC0442D5BFCD045B2A4 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 08D7BE2B1AE5B4F163FA205D /* Pods_Runner.framework */; }; + B4D3D9481EDF0C2BD0964E3E /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F115AD174C4ABDE2642BA57E /* Pods_Runner.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -42,36 +42,37 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 0478E8710A337E13C25553BB /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; - 08D7BE2B1AE5B4F163FA205D /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 068983464CF7CDD3590832BA /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; - 24A7CEAF7A5088D16B69966D /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; + 4054400FD08195D6D039426B /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 53C2C7121DC855633D5FEB06 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + 5DB7F232F74A09A72F6AD57F /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; + 8AA78B79C4823734C6A0AE13 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + 9011E63D7F66016CEDA6A1F7 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; + 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - A2DFB344666DB82893BA7FC6 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; - B460FAC5445920DDC9850928 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; - BA7676A230E68AD3052DD1FC /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; - DCE547177D29B8D213743F79 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - EECA26449F4B4D025A92396E /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + E8DED1FBAADC53ADE2681E37 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + F115AD174C4ABDE2642BA57E /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 5E6821C3162E0BA77F37A0B6 /* Frameworks */ = { + 526870A4F4835F50D09866E7 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - DE4118BD26316093944BB547 /* Pods_RunnerTests.framework in Frameworks */, + 2C0B37CAA7639B0F0E17EC9E /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -79,22 +80,13 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - FC481FC0442D5BFCD045B2A4 /* Pods_Runner.framework in Frameworks */, + B4D3D9481EDF0C2BD0964E3E /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 23971B813AD3D63C4CE72982 /* Frameworks */ = { - isa = PBXGroup; - children = ( - 08D7BE2B1AE5B4F163FA205D /* Pods_Runner.framework */, - DCE547177D29B8D213743F79 /* Pods_RunnerTests.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; 331C8082294A63A400263BE5 /* RunnerTests */ = { isa = PBXGroup; children = ( @@ -103,25 +95,13 @@ path = RunnerTests; sourceTree = ""; }; - 6502177C35D2F3021D741B69 /* Pods */ = { - isa = PBXGroup; - children = ( - 24A7CEAF7A5088D16B69966D /* Pods-Runner.debug.xcconfig */, - 0478E8710A337E13C25553BB /* Pods-Runner.release.xcconfig */, - A2DFB344666DB82893BA7FC6 /* Pods-Runner.profile.xcconfig */, - BA7676A230E68AD3052DD1FC /* Pods-RunnerTests.debug.xcconfig */, - B460FAC5445920DDC9850928 /* Pods-RunnerTests.release.xcconfig */, - EECA26449F4B4D025A92396E /* Pods-RunnerTests.profile.xcconfig */, - ); - path = Pods; - sourceTree = ""; - }; 9740EEB11CF90186004384FC /* Flutter */ = { isa = PBXGroup; children = ( 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, 9740EEB21CF90195004384FC /* Debug.xcconfig */, 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, + 9740EEB31CF90195004384FC /* Generated.xcconfig */, ); name = Flutter; sourceTree = ""; @@ -133,8 +113,8 @@ 97C146F01CF9000F007C117D /* Runner */, 97C146EF1CF9000F007C117D /* Products */, 331C8082294A63A400263BE5 /* RunnerTests */, - 6502177C35D2F3021D741B69 /* Pods */, - 23971B813AD3D63C4CE72982 /* Frameworks */, + C4FA2E59E94821951CF50F29 /* Pods */, + CFDC1B1E68702D22D28FF4A6 /* Frameworks */, ); sourceTree = ""; }; @@ -162,6 +142,29 @@ path = Runner; sourceTree = ""; }; + C4FA2E59E94821951CF50F29 /* Pods */ = { + isa = PBXGroup; + children = ( + 068983464CF7CDD3590832BA /* Pods-Runner.debug.xcconfig */, + 5DB7F232F74A09A72F6AD57F /* Pods-Runner.release.xcconfig */, + 53C2C7121DC855633D5FEB06 /* Pods-Runner.profile.xcconfig */, + E8DED1FBAADC53ADE2681E37 /* Pods-RunnerTests.debug.xcconfig */, + 9011E63D7F66016CEDA6A1F7 /* Pods-RunnerTests.release.xcconfig */, + 8AA78B79C4823734C6A0AE13 /* Pods-RunnerTests.profile.xcconfig */, + ); + name = Pods; + path = Pods; + sourceTree = ""; + }; + CFDC1B1E68702D22D28FF4A6 /* Frameworks */ = { + isa = PBXGroup; + children = ( + F115AD174C4ABDE2642BA57E /* Pods_Runner.framework */, + 4054400FD08195D6D039426B /* Pods_RunnerTests.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -169,10 +172,10 @@ isa = PBXNativeTarget; buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - 981263AE3167A46D87159B77 /* [CP] Check Pods Manifest.lock */, + 2DE1FE9399C152E151A275B9 /* [CP] Check Pods Manifest.lock */, 331C807D294A63A400263BE5 /* Sources */, 331C807F294A63A400263BE5 /* Resources */, - 5E6821C3162E0BA77F37A0B6 /* Frameworks */, + 526870A4F4835F50D09866E7 /* Frameworks */, ); buildRules = ( ); @@ -188,15 +191,15 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 4D1CF857AD8F68E56E755C00 /* [CP] Check Pods Manifest.lock */, + 9629C3DEB1E88775B661C61C /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, 97C146EC1CF9000F007C117D /* Resources */, 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - C2C30BD0C13D89C7E793B3B1 /* [CP] Embed Pods Frameworks */, - C5D6FA130EE6A24643B63C2A /* [CP] Copy Pods Resources */, + 6F4EA73A919628CAFDE30C92 /* [CP] Embed Pods Frameworks */, + 860B6597EF246AC3E75A1AFB /* [CP] Copy Pods Resources */, ); buildRules = ( ); @@ -228,7 +231,7 @@ }; }; buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; - compatibilityVersion = "Xcode 15.0"; + compatibilityVersion = "Xcode 9.3"; developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( @@ -268,23 +271,7 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { - isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", - ); - name = "Thin Binary"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; - }; - 4D1CF857AD8F68E56E755C00 /* [CP] Check Pods Manifest.lock */ = { + 2DE1FE9399C152E151A275B9 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -299,84 +286,100 @@ outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; - 9740EEB61CF901F6004384FC /* Run Script */ = { + 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { isa = PBXShellScriptBuildPhase; alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); inputPaths = ( + "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", ); - name = "Run Script"; + name = "Thin Binary"; outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; - 981263AE3167A46D87159B77 /* [CP] Check Pods Manifest.lock */ = { + 6F4EA73A919628CAFDE30C92 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; + name = "[CP] Embed Pods Frameworks"; outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; - C2C30BD0C13D89C7E793B3B1 /* [CP] Embed Pods Frameworks */ = { + 860B6597EF246AC3E75A1AFB /* [CP] Copy Pods Resources */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-input-files.xcfilelist", ); - name = "[CP] Embed Pods Frameworks"; + name = "[CP] Copy Pods Resources"; outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-output-files.xcfilelist", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n"; showEnvVarsInLog = 0; }; - C5D6FA130EE6A24643B63C2A /* [CP] Copy Pods Resources */ = { + 9629C3DEB1E88775B661C61C /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-input-files.xcfilelist", ); - name = "[CP] Copy Pods Resources"; + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-output-files.xcfilelist", + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; + 9740EEB61CF901F6004384FC /* Run Script */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Run Script"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; + }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -431,6 +434,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; @@ -460,6 +464,7 @@ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_NO_COMMON_BLOCKS = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; @@ -483,23 +488,15 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; - CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; - CODE_SIGN_IDENTITY = "iPhone Distribution"; - CODE_SIGN_STYLE = Manual; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; - DEVELOPMENT_TEAM = PG566C9XUK; - "DEVELOPMENT_TEAM[sdk=iphoneos*]" = PG566C9XUK; ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", ); PRODUCT_BUNDLE_IDENTIFIER = health.studyu.app; PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE_SPECIFIER = "match AppStore health.studyu.app"; - "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "match AppStore health.studyu.app"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_VERSION = 5.0; VERSIONING_SYSTEM = "apple-generic"; @@ -508,7 +505,7 @@ }; 331C8088294A63A400263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = BA7676A230E68AD3052DD1FC /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = E8DED1FBAADC53ADE2681E37 /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -526,7 +523,7 @@ }; 331C8089294A63A400263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = B460FAC5445920DDC9850928 /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = 9011E63D7F66016CEDA6A1F7 /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -542,7 +539,7 @@ }; 331C808A294A63A400263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = EECA26449F4B4D025A92396E /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = 8AA78B79C4823734C6A0AE13 /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -560,6 +557,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; @@ -589,6 +587,7 @@ DEBUG_INFORMATION_FORMAT = dwarf; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; GCC_NO_COMMON_BLOCKS = YES; @@ -615,6 +614,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; @@ -644,6 +644,7 @@ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_NO_COMMON_BLOCKS = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; @@ -669,21 +670,15 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; - CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; - CODE_SIGN_IDENTITY = "iPhone Distribution"; - CODE_SIGN_STYLE = Manual; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; - DEVELOPMENT_TEAM = PG566C9XUK; ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", ); PRODUCT_BUNDLE_IDENTIFIER = health.studyu.app; PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE_SPECIFIER = "match AppStore health.studyu.app"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; @@ -697,21 +692,15 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; - CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; - CODE_SIGN_IDENTITY = "iPhone Distribution"; - CODE_SIGN_STYLE = Manual; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; - DEVELOPMENT_TEAM = PG566C9XUK; ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", ); PRODUCT_BUNDLE_IDENTIFIER = health.studyu.app; PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE_SPECIFIER = "match AppStore health.studyu.app"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_VERSION = 5.0; VERSIONING_SYSTEM = "apple-generic"; diff --git a/app/ios/Runner/Runner.entitlements b/app/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings similarity index 76% rename from app/ios/Runner/Runner.entitlements rename to app/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings index 28c29bf6d..f9b0d7c5e 100644 --- a/app/ios/Runner/Runner.entitlements +++ b/app/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -2,7 +2,7 @@ - aps-environment - production + PreviewsEnabled + diff --git a/app/ios/Runner/AppDelegate.swift b/app/ios/Runner/AppDelegate.swift index f0630aa0c..aa0522ca0 100644 --- a/app/ios/Runner/AppDelegate.swift +++ b/app/ios/Runner/AppDelegate.swift @@ -1,5 +1,5 @@ -import UIKit import Flutter +import UIKit import flutter_local_notifications @UIApplicationMain diff --git a/app/ios/Runner/Info.plist b/app/ios/Runner/Info.plist index 752966c2e..391233a29 100644 --- a/app/ios/Runner/Info.plist +++ b/app/ios/Runner/Info.plist @@ -2,8 +2,6 @@ - CADisableMinimumFrameDurationOnPhone - CFBundleDevelopmentRegion $(DEVELOPMENT_LANGUAGE) CFBundleDisplayName @@ -71,9 +69,11 @@ UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight - UIViewControllerBasedStatusBarAppearance - - NSCameraUsageDescription + CADisableMinimumFrameDurationOnPhone + + UIApplicationSupportsIndirectInputEvents + + NSCameraUsageDescription Need to access your camera to capture a photo for trial observations. From dfe3e741fa4f89fe69a2bcda2e7a0ad7602c2e59 Mon Sep 17 00:00:00 2001 From: Johannes Vedder Date: Sun, 9 Jun 2024 22:46:50 +0200 Subject: [PATCH 133/314] style: remove dynamicSchemeVariant todo --- designer_v2/lib/theme.dart | 2 -- 1 file changed, 2 deletions(-) diff --git a/designer_v2/lib/theme.dart b/designer_v2/lib/theme.dart index e74e7c97b..957020312 100644 --- a/designer_v2/lib/theme.dart +++ b/designer_v2/lib/theme.dart @@ -138,8 +138,6 @@ class ThemeProvider extends InheritedWidget { contrastLevel: 0.0); final colorScheme = ColorScheme.fromSeed( seedColor: dynamicPrimary ?? source(targetColor), - // todo use dynamicSchemeVariant once its in the flutter stable channel - // dynamicSchemeVariant: DynamicSchemeVariant.fidelity, brightness: brightness, ); return colorScheme.copyWith( From 5c0f04ff8f5f2abf1ed890d4ca5b1257b0eacc47 Mon Sep 17 00:00:00 2001 From: Johannes Vedder Date: Sat, 25 May 2024 21:52:02 +0200 Subject: [PATCH 134/314] chore: translation --- designer_v2/lib/localization/app_en.arb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/designer_v2/lib/localization/app_en.arb b/designer_v2/lib/localization/app_en.arb index 87421f050..fa8539822 100644 --- a/designer_v2/lib/localization/app_en.arb +++ b/designer_v2/lib/localization/app_en.arb @@ -68,7 +68,7 @@ "study_status_running": "Live", "study_status_running_description": "This study is currently in progress.", "study_status_closed": "Closed", - "study_status_closed_description": "This study has been completed.\nNo new participants will be able to enroll.", + "study_status_closed_description": "This study has been completed.\nNew participants can no longer enroll.", "participation_open_who": "Everyone", "participation_open_who_description": "All StudyU users may enroll to the study in the StudyU app.", "participation_invite_who": "Invite-only", @@ -121,7 +121,7 @@ "notification_study_deleted": "Study was deleted", "notification_study_closed": "Study was closed", "dialog_study_close_title": "Close participation?", - "dialog_study_close_description": "Are you sure that you want to close participation for this study? No new participants will be able to enroll.", + "dialog_study_close_description": "Are you sure that you want to close participation for this study? New participants can no longer enroll.", "dialog_study_delete_title": "Permanently delete?", "dialog_study_delete_description": "Are you sure you want to delete this study? You will permanently lose the study and all data that has been collected.", "@__________________STUDYPAGE_DESIGN_SHARED__________________": {}, @@ -245,7 +245,7 @@ "banner_study_readonly_title": "This study cannot be edited.", "banner_study_readonly_description": "You can only make changes to studies where you are an owner or collaborator. Studies that have been launched cannot be changed by anyone.", "banner_study_closed_title": "This study is closed.", - "banner_study_closed_description": "No new participants will be able to enroll in this study.", + "banner_study_closed_description": "New participants can no longer enroll in this study.", "form_section_scheduling": "Scheduling and Compliance", "form_section_scheduling_description": "To improve compliance, you can set a limited window of time for participants to complete the task & send a reminder notification at the specified time.", "form_field_has_reminder": "App reminder", From 3cf8804463bb10d8e5d8a25aa5cd99664e0a7cee Mon Sep 17 00:00:00 2001 From: Johannes Vedder Date: Sat, 25 May 2024 21:54:20 +0200 Subject: [PATCH 135/314] feat: deprecate published for study_status --- .../study/onboarding/study_selection.dart | 4 - core/lib/src/models/tables/study.dart | 19 +-- .../20240526_migrate_close_study.sql | 146 ++++++++++++++++++ database/migration/migrate-close_study.sql | 12 -- database/studyu-schema.sql | 16 +- designer_v2/lib/domain/study.dart | 5 +- .../features/recruit/study_recruit_page.dart | 3 +- .../study/study_controller_state.dart | 2 +- .../lib/repositories/model_repository.dart | 2 +- .../lib/repositories/study_repository.dart | 2 +- 10 files changed, 158 insertions(+), 53 deletions(-) create mode 100644 database/migration/20240526_migrate_close_study.sql delete mode 100644 database/migration/migrate-close_study.sql diff --git a/app/lib/screens/study/onboarding/study_selection.dart b/app/lib/screens/study/onboarding/study_selection.dart index 3a1d36769..ce40c7461 100644 --- a/app/lib/screens/study/onboarding/study_selection.dart +++ b/app/lib/screens/study/onboarding/study_selection.dart @@ -159,10 +159,6 @@ class _StudySelectionScreenState extends State { child: StudyTile.fromStudy( study: study, onTap: () async { - if (study.isClosed) { - await showStudyClosedDialog(context); - return; - } await navigateToStudyOverview(context, study); }, ), diff --git a/core/lib/src/models/tables/study.dart b/core/lib/src/models/tables/study.dart index 04f28354d..b2d37d748 100644 --- a/core/lib/src/models/tables/study.dart +++ b/core/lib/src/models/tables/study.dart @@ -54,10 +54,10 @@ class Study extends SupabaseObjectFunctions implements Comparable late Contact contact = Contact(); @JsonKey(name: 'icon_name', defaultValue: 'accountHeart') late String iconName = 'accountHeart'; + @Deprecated('Use status instead') @JsonKey(defaultValue: false) late bool published = false; - @JsonKey(name: 'is_closed', defaultValue: false) - bool isClosed = false; + late StudyStatus status = StudyStatus.draft; @JsonKey(fromJson: _questionnaireFromJson) late StudyUQuestionnaire questionnaire = StudyUQuestionnaire(); @JsonKey(name: 'eligibility_criteria', fromJson: _eligibilityCriteriaFromJson) @@ -231,7 +231,7 @@ class Study extends SupabaseObjectFunctions implements Comparable static Future> publishedPublicStudies() async { ExtractionResult result; try { - final response = await env.client.from(tableName).select().eq('participation', 'open').eq("is_closed", false); + final response = await env.client.from(tableName).select().eq('participation', 'open').eq("closed", false); final extracted = SupabaseQuery.extractSupabaseList(List>.from(response)); result = ExtractionSuccess(extracted); } on ExtractionFailedException catch (error) { @@ -292,18 +292,9 @@ class Study extends SupabaseObjectFunctions implements Comparable // - Status - StudyStatus get status { - if (isClosed) { - return StudyStatus.closed; - } - if (published) { - return StudyStatus.running; - } - return StudyStatus.draft; - } - bool get isDraft => status == StudyStatus.draft; bool get isRunning => status == StudyStatus.running; + bool get isClosed => status == StudyStatus.closed; bool isReadonly(User user) { return status != StudyStatus.draft || !canEdit(user); @@ -311,7 +302,7 @@ class Study extends SupabaseObjectFunctions implements Comparable @override String toString() { - return 'Study{id: $id, title: $title, description: $description, userId: $userId, participation: $participation, resultSharing: $resultSharing, contact: $contact, iconName: $iconName, published: $published, questionnaire: $questionnaire, eligibilityCriteria: $eligibilityCriteria, consent: $consent, interventions: $interventions, observations: $observations, schedule: $schedule, reportSpecification: $reportSpecification, results: $results, collaboratorEmails: $collaboratorEmails, registryPublished: $registryPublished, participantCount: $participantCount, endedCount: $endedCount, activeSubjectCount: $activeSubjectCount, missedDays: $missedDays, repo: $repo, invites: $invites, participants: $participants, participantsProgress: $participantsProgress, createdAt: $createdAt}'; + return 'Study{id: $id, title: $title, description: $description, userId: $userId, participation: $participation, resultSharing: $resultSharing, contact: $contact, iconName: $iconName, published: , status: $status, questionnaire: $questionnaire, eligibilityCriteria: $eligibilityCriteria, consent: $consent, interventions: $interventions, observations: $observations, schedule: $schedule, reportSpecification: $reportSpecification, results: $results, collaboratorEmails: $collaboratorEmails, registryPublished: $registryPublished, participantCount: $participantCount, endedCount: $endedCount, activeSubjectCount: $activeSubjectCount, missedDays: $missedDays, repo: $repo, invites: $invites, participants: $participants, participantsProgress: $participantsProgress, createdAt: $createdAt}'; } @override diff --git a/database/migration/20240526_migrate_close_study.sql b/database/migration/20240526_migrate_close_study.sql new file mode 100644 index 000000000..99953068d --- /dev/null +++ b/database/migration/20240526_migrate_close_study.sql @@ -0,0 +1,146 @@ +-- todo move to studyu-schema.sql + +CREATE TYPE public.study_status AS ENUM ( + 'draft', + 'running', + 'closed' +); + +ALTER TABLE public.study +ADD COLUMN status public.study_status DEFAULT 'draft'::public.study_status NOT NULL; + +-- Migrate existing studies from published to study_status +UPDATE public.study SET status = CASE + WHEN status != 'draft'::public.study_status THEN status + WHEN published THEN 'running'::public.study_status + ELSE status +END; + +-- Migrate policy +DROP POLICY "Editors can do everything with their studies" ON public.study; + +CREATE POLICY "Editors can view their studies" ON public.study FOR SELECT USING (auth.uid() = user_id); + +CREATE POLICY "Editor can control their draft studies" ON public.study + USING (public.can_edit(auth.uid(), study.*) AND status = 'draft'::public.study_status); + +-- Editors can only update registry_published and resultSharing +--grant update (registry_published, result_sharing) on public.study USING (public.can_edit(auth.uid(), study.*); +--CREATE POLICY "Editors can only update registry_published and resultSharing" ON public.study +-- FOR UPDATE +-- USING (public.can_edit(auth.uid(), study.*)) +-- WITH CHECK ((new.*) IS NOT DISTINCT FROM (old.* EXCEPT registry_published, result_sharing)); +-- todo solve with trigger or function +-- or create view with only updatable columns and provide permission on view see https://dba.stackexchange.com/questions/298931/allow-users-to-modify-only-some-but-not-all-fields-in-a-postgresql-table-with + +-- https://stackoverflow.com/questions/72756376/supabase-solutions-for-column-level-security + +-- https://github.com/orgs/supabase/discussions/656#discussioncomment-5594653 +CREATE OR REPLACE FUNCTION public.allow_updating_only() + RETURNS trigger + LANGUAGE plpgsql +AS $function$ +DECLARE + whitelist TEXT[] := TG_ARGV::TEXT[]; + schema_table TEXT; + column_name TEXT; + rec RECORD; + new_value TEXT; + old_value TEXT; +BEGIN + schema_table := concat(TG_TABLE_SCHEMA, '.', TG_TABLE_NAME); + + -- If RLS is not active on current table for function invoker, early return + IF NOT row_security_active(schema_table) THEN + RETURN NEW; + END IF; + + -- Otherwise, loop on all columns of the table schema + FOR rec IN ( + SELECT col.column_name + FROM information_schema.columns as col + WHERE table_schema = TG_TABLE_SCHEMA + AND table_name = TG_TABLE_NAME + ) LOOP + -- If the current column is whitelisted, early continue + column_name := rec.column_name; + IF column_name = ANY(whitelist) THEN + CONTINUE; + END IF; + + -- If not whitelisted, execute dynamic SQL to get column value from OLD and NEW records + EXECUTE format('SELECT ($1).%I, ($2).%I', column_name, column_name) + INTO new_value, old_value + USING NEW, OLD; + + -- Raise exception if column value changed + IF new_value IS DISTINCT FROM old_value THEN + RAISE EXCEPTION 'Unauthorized change to "%"', column_name; + END IF; + END LOOP; + + -- RLS active, but no exception encountered, clear to proceed. + RETURN NEW; +END; +$function$; + +CREATE OR REPLACE FUNCTION public.check_study_update_permissions() + RETURNS trigger + LANGUAGE plpgsql +AS $function$ +BEGIN + -- todo check if this is needed, because the policy should already prevent modification of foreign studies + --IF study_param.user_id != auth.uid() THEN + -- RAISE EXCEPTION 'Only the owner can update the status'; + --END IF; + + -- check if old.status is not draft and if yes check if allow_updating_only includes registry_published and result_sharing otherwise raise exception + IF OLD.status != 'draft'::public.study_status THEN + PERFORM public.allow_updating_only(ARRAY['registry_published', 'result_sharing']); + -- dont allow to update status directly + IF NEW.status != OLD.status THEN + RAISE EXCEPTION 'Study.status can only be updated using the `public.update_study_status` function'; + END IF; + END IF; + + RETURN NEW; +END; +$function$; + +CREATE OR REPLACE TRIGGER study_status_update_permissions + BEFORE UPDATE + ON public.study + FOR EACH ROW + EXECUTE FUNCTION public.check_study_update_permissions(); + +-- todo use this function to update status in designer +-- Owners can update status +CREATE FUNCTION public.update_study_status(study_param public.study) RETURNS VOID + LANGUAGE plpgsql -- SECURITY DEFINER + AS $$ +BEGIN + --IF study_param.user_id != auth.uid() THEN + -- RAISE EXCEPTION 'Only the owner can update the status'; + --END IF; + -- Increment the study.status + UPDATE public.study + SET status = CASE + WHEN study_param.status = 'draft'::public.study_status THEN 'running'::public.study_status + WHEN study_param.status = 'running'::public.study_status THEN 'closed'::public.study_status + ELSE study_param.status + END + WHERE id = study_param.id; +END; +$$; + +ALTER FUNCTION public.update_study_status(public.study) OWNER TO postgres; + +CREATE POLICY "Joining a closed study should not be possible" ON public.study_subject + AS RESTRICTIVE + FOR INSERT + WITH CHECK (NOT EXISTS ( + SELECT 1 + FROM public.study + WHERE study.id = study_subject.study_id + AND study.status = 'closed'::public.study_status +)); diff --git a/database/migration/migrate-close_study.sql b/database/migration/migrate-close_study.sql deleted file mode 100644 index f887f3652..000000000 --- a/database/migration/migrate-close_study.sql +++ /dev/null @@ -1,12 +0,0 @@ -ALTER TABLE public.study - ADD COLUMN is_closed boolean DEFAULT false NOT NULL; - -CREATE POLICY "Joining a closed study should not be possible" ON public.study_subject - AS RESTRICTIVE - FOR INSERT - WITH CHECK (NOT EXISTS ( - SELECT 1 - FROM public.study - WHERE study.id = study_subject.study_id - AND study.is_closed -)); diff --git a/database/studyu-schema.sql b/database/studyu-schema.sql index dd7a7f95e..b202d5ef4 100644 --- a/database/studyu-schema.sql +++ b/database/studyu-schema.sql @@ -80,8 +80,8 @@ CREATE TABLE public.study ( title text NOT NULL, description text NOT NULL, icon_name text NOT NULL, + -- published is deprecated, use status instead published boolean DEFAULT false NOT NULL, - is_closed boolean DEFAULT false NOT NULL, registry_published boolean DEFAULT false NOT NULL, questionnaire jsonb NOT NULL, eligibility_criteria jsonb NOT NULL, @@ -836,20 +836,6 @@ CREATE POLICY "Editors can see subjects from their studies" ON public.study_subj CREATE POLICY "Invite code needs to be valid (not possible in the app)" ON public.study_subject AS RESTRICTIVE FOR INSERT WITH CHECK (((invite_code IS NULL) OR (study_id IN ( SELECT code_fun.study_id FROM public.get_study_from_invite(study_subject.invite_code) code_fun(study_id, preselected_intervention_ids))))); --- --- Name: study_subject Joining a closed study should not be possible; Type: POLICY; Schema: public; Owner: postgres --- - -CREATE POLICY "Joining a closed study should not be possible" ON public.study_subject -AS RESTRICTIVE -FOR INSERT -WITH CHECK (NOT EXISTS ( - SELECT 1 - FROM public.study - WHERE study.id = study_subject.study_id - AND study.is_closed -)); - -- -- Name: subject_progress Editors can see their study subjects progress; Type: POLICY; Schema: public; Owner: postgres -- diff --git a/designer_v2/lib/domain/study.dart b/designer_v2/lib/domain/study.dart index 26ca0c72f..4c3cedfd0 100644 --- a/designer_v2/lib/domain/study.dart +++ b/designer_v2/lib/domain/study.dart @@ -113,8 +113,7 @@ extension StudyDuplicateX on Study { copy.resetJsonIgnoredAttributes(); copy.title = (copy.title ?? '').withDuplicateLabel(); copy.userId = userId; - copy.published = false; - copy.isClosed = false; + copy.status = StudyStatus.draft; copy.resultSharing = ResultSharing.private; copy.registryPublished = false; copy.results = []; @@ -141,7 +140,7 @@ extension StudyDuplicateX on Study { final copy = Study.fromJson(toJson()); copy.copyJsonIgnoredAttributes(from: this, createdAt: true); copy.resetParticipantData(); - copy.published = true; + copy.status = StudyStatus.running; return copy; } diff --git a/designer_v2/lib/features/recruit/study_recruit_page.dart b/designer_v2/lib/features/recruit/study_recruit_page.dart index 42774a979..c9f886496 100644 --- a/designer_v2/lib/features/recruit/study_recruit_page.dart +++ b/designer_v2/lib/features/recruit/study_recruit_page.dart @@ -55,7 +55,7 @@ class StudyRecruitScreen extends StudyPageWidget { @override Widget? banner(BuildContext context, WidgetRef ref) { final state = ref.watch(studyRecruitControllerProvider(studyId)); - final isStudyClosed = state.studyWithMetadata?.model.isClosed == true; + final isStudyClosed = state.studyWithMetadata!.model.isClosed; if (isStudyClosed) { return BannerBox( @@ -74,7 +74,6 @@ class StudyRecruitScreen extends StudyPageWidget { ]), style: BannerStyle.info); } - return null; } diff --git a/designer_v2/lib/features/study/study_controller_state.dart b/designer_v2/lib/features/study/study_controller_state.dart index 3c41c6566..483b9b61c 100644 --- a/designer_v2/lib/features/study/study_controller_state.dart +++ b/designer_v2/lib/features/study/study_controller_state.dart @@ -15,7 +15,7 @@ class StudyControllerState extends StudyControllerBaseState implements IStudyApp this.lastSynced, }); - bool get isPublished => study.value != null && study.value!.published; + bool get isPublished => study.value != null && study.value!.status == StudyStatus.running; // - ISyncIndicatorViewModel diff --git a/designer_v2/lib/repositories/model_repository.dart b/designer_v2/lib/repositories/model_repository.dart index c2415a57f..d910bd2f3 100644 --- a/designer_v2/lib/repositories/model_repository.dart +++ b/designer_v2/lib/repositories/model_repository.dart @@ -304,7 +304,7 @@ abstract class ModelRepository extends IModelRepository { if (fetchOnSubscribe) { if (!(wrappedModel != null && wrappedModel.isLocalOnly)) { fetch(modelId).catchError((e) { - if (!modelController.isClosed) { + if (!modelController.closed) { modelController.addError(e); } return e; diff --git a/designer_v2/lib/repositories/study_repository.dart b/designer_v2/lib/repositories/study_repository.dart index e0625f53f..8c523ca9b 100644 --- a/designer_v2/lib/repositories/study_repository.dart +++ b/designer_v2/lib/repositories/study_repository.dart @@ -106,7 +106,7 @@ class StudyRepository extends ModelRepository implements IStudyRepository } Future onCloseCallback() { - model.isClosed = true; + model.status = StudyStatus.closed; return save(model).then((value) => ref.read(routerProvider).dispatch(RoutingIntents.studies)).then((value) => Future.delayed(const Duration(milliseconds: 200), () => ref.read(notificationServiceProvider).show(Notifications.studyClosed))); From 29310b78019518a2063836125fced614bd2c6823 Mon Sep 17 00:00:00 2001 From: Johannes Vedder Date: Sun, 26 May 2024 08:01:09 +0200 Subject: [PATCH 136/314] chore: create migration temporarily --- supabase/migrations/20240526_migrate_close_study.sql | 1 + 1 file changed, 1 insertion(+) create mode 120000 supabase/migrations/20240526_migrate_close_study.sql diff --git a/supabase/migrations/20240526_migrate_close_study.sql b/supabase/migrations/20240526_migrate_close_study.sql new file mode 120000 index 000000000..5cfba03e0 --- /dev/null +++ b/supabase/migrations/20240526_migrate_close_study.sql @@ -0,0 +1 @@ +../../database/migration/20240526_migrate_close_study.sql \ No newline at end of file From 9aba30c686abb5b89ffa8df3fb68d741ccf509c1 Mon Sep 17 00:00:00 2001 From: Johannes Vedder Date: Sun, 26 May 2024 16:54:51 +0200 Subject: [PATCH 137/314] fix: improve status transition rules --- .../20240526_migrate_close_study.sql | 83 ++++++++++--------- 1 file changed, 42 insertions(+), 41 deletions(-) diff --git a/database/migration/20240526_migrate_close_study.sql b/database/migration/20240526_migrate_close_study.sql index 99953068d..c6cf982cd 100644 --- a/database/migration/20240526_migrate_close_study.sql +++ b/database/migration/20240526_migrate_close_study.sql @@ -22,7 +22,8 @@ DROP POLICY "Editors can do everything with their studies" ON public.study; CREATE POLICY "Editors can view their studies" ON public.study FOR SELECT USING (auth.uid() = user_id); CREATE POLICY "Editor can control their draft studies" ON public.study - USING (public.can_edit(auth.uid(), study.*) AND status = 'draft'::public.study_status); + --USING (public.can_edit(auth.uid(), study.*) AND status = 'draft'::public.study_status); + USING (public.can_edit(auth.uid(), study.*)); -- Editors can only update registry_published and resultSharing --grant update (registry_published, result_sharing) on public.study USING (public.can_edit(auth.uid(), study.*); @@ -36,6 +37,8 @@ CREATE POLICY "Editor can control their draft studies" ON public.study -- https://stackoverflow.com/questions/72756376/supabase-solutions-for-column-level-security -- https://github.com/orgs/supabase/discussions/656#discussioncomment-5594653 + +-- todo document this function CREATE OR REPLACE FUNCTION public.allow_updating_only() RETURNS trigger LANGUAGE plpgsql @@ -48,6 +51,27 @@ DECLARE new_value TEXT; old_value TEXT; BEGIN + + -- If the current user is 'postgres', return NEW without making any changes + IF CURRENT_USER = 'postgres' THEN + RETURN NEW; + END IF; + + -- If the status is draft, return NEW without making any changes + IF OLD.status = 'draft'::public.study_status THEN + RETURN NEW; + END IF; + + -- Don't allow invalid status transitions + IF OLD.status != NEW.status THEN + IF NOT ( + (OLD.status = 'draft'::public.study_status AND NEW.status = 'running'::public.study_status) + OR (OLD.status = 'running'::public.study_status AND NEW.status = 'closed'::public.study_status) + ) THEN + RAISE EXCEPTION 'Invalid status transition'; + END IF; + END IF; + schema_table := concat(TG_TABLE_SCHEMA, '.', TG_TABLE_NAME); -- If RLS is not active on current table for function invoker, early return @@ -84,56 +108,33 @@ BEGIN END; $function$; -CREATE OR REPLACE FUNCTION public.check_study_update_permissions() - RETURNS trigger - LANGUAGE plpgsql -AS $function$ -BEGIN - -- todo check if this is needed, because the policy should already prevent modification of foreign studies - --IF study_param.user_id != auth.uid() THEN - -- RAISE EXCEPTION 'Only the owner can update the status'; - --END IF; - - -- check if old.status is not draft and if yes check if allow_updating_only includes registry_published and result_sharing otherwise raise exception - IF OLD.status != 'draft'::public.study_status THEN - PERFORM public.allow_updating_only(ARRAY['registry_published', 'result_sharing']); - -- dont allow to update status directly - IF NEW.status != OLD.status THEN - RAISE EXCEPTION 'Study.status can only be updated using the `public.update_study_status` function'; - END IF; - END IF; - - RETURN NEW; -END; -$function$; - CREATE OR REPLACE TRIGGER study_status_update_permissions BEFORE UPDATE ON public.study FOR EACH ROW - EXECUTE FUNCTION public.check_study_update_permissions(); + EXECUTE FUNCTION public.allow_updating_only('updated_at', 'status', 'registry_published', 'result_sharing'); + -- todo also add participation? --- todo use this function to update status in designer -- Owners can update status -CREATE FUNCTION public.update_study_status(study_param public.study) RETURNS VOID - LANGUAGE plpgsql -- SECURITY DEFINER - AS $$ -BEGIN +--CREATE FUNCTION public.update_study_status(study_param public.study) RETURNS VOID +-- LANGUAGE plpgsql -- SECURITY DEFINER +-- AS $$ +--BEGIN --IF study_param.user_id != auth.uid() THEN -- RAISE EXCEPTION 'Only the owner can update the status'; --END IF; -- Increment the study.status - UPDATE public.study - SET status = CASE - WHEN study_param.status = 'draft'::public.study_status THEN 'running'::public.study_status - WHEN study_param.status = 'running'::public.study_status THEN 'closed'::public.study_status - ELSE study_param.status - END - WHERE id = study_param.id; -END; -$$; - -ALTER FUNCTION public.update_study_status(public.study) OWNER TO postgres; +-- UPDATE public.study +-- SET status = CASE +-- WHEN study_param.status = 'draft'::public.study_status THEN 'running'::public.study_status +-- WHEN study_param.status = 'running'::public.study_status THEN 'closed'::public.study_status +-- ELSE study_param.status +-- END +-- WHERE id = study_param.id; +--END; +--$$; + +--ALTER FUNCTION public.update_study_status(public.study) OWNER TO postgres; CREATE POLICY "Joining a closed study should not be possible" ON public.study_subject AS RESTRICTIVE From 15a72e5e8ffb9c8a7251fcd4eeefe8b5713d5d49 Mon Sep 17 00:00:00 2001 From: Johannes Vedder Date: Fri, 7 Jun 2024 16:33:11 +0200 Subject: [PATCH 138/314] feat: study close button --- .../20240526_migrate_close_study.sql | 2 +- designer_v2/lib/domain/study.dart | 3 - .../close/study_close_dialog_confirm.dart | 64 +++++++++++++++++++ .../close/study_close_dialog_success.dart | 42 ++++++++++++ .../publish/study_publish_dialog_confirm.dart | 0 .../publish/study_publish_dialog_success.dart | 0 .../lib/features/dialogs/study_dialogs.dart | 39 +++++++++++ .../publish/study_publish_dialog.dart | 31 --------- .../features/recruit/study_recruit_page.dart | 4 +- .../lib/features/study/study_actions.dart | 1 - .../lib/features/study/study_controller.dart | 6 +- .../study/study_controller_state.dart | 2 + .../lib/features/study/study_scaffold.dart | 23 ++++++- designer_v2/lib/localization/app_de.arb | 2 +- designer_v2/lib/localization/app_en.arb | 2 +- .../lib/repositories/study_repository.dart | 39 ++++++----- designer_v2/lib/services/notifications.dart | 3 - 17 files changed, 200 insertions(+), 63 deletions(-) create mode 100644 designer_v2/lib/features/dialogs/close/study_close_dialog_confirm.dart create mode 100644 designer_v2/lib/features/dialogs/close/study_close_dialog_success.dart rename designer_v2/lib/features/{ => dialogs}/publish/study_publish_dialog_confirm.dart (100%) rename designer_v2/lib/features/{ => dialogs}/publish/study_publish_dialog_success.dart (100%) create mode 100644 designer_v2/lib/features/dialogs/study_dialogs.dart delete mode 100644 designer_v2/lib/features/publish/study_publish_dialog.dart diff --git a/database/migration/20240526_migrate_close_study.sql b/database/migration/20240526_migrate_close_study.sql index c6cf982cd..b5d44e7e8 100644 --- a/database/migration/20240526_migrate_close_study.sql +++ b/database/migration/20240526_migrate_close_study.sql @@ -31,7 +31,7 @@ CREATE POLICY "Editor can control their draft studies" ON public.study -- FOR UPDATE -- USING (public.can_edit(auth.uid(), study.*)) -- WITH CHECK ((new.*) IS NOT DISTINCT FROM (old.* EXCEPT registry_published, result_sharing)); --- todo solve with trigger or function +-- t odo solve with trigger or function -- or create view with only updatable columns and provide permission on view see https://dba.stackexchange.com/questions/298931/allow-users-to-modify-only-some-but-not-all-fields-in-a-postgresql-table-with -- https://stackoverflow.com/questions/72756376/supabase-solutions-for-column-level-security diff --git a/designer_v2/lib/domain/study.dart b/designer_v2/lib/domain/study.dart index 4c3cedfd0..27c25ba3a 100644 --- a/designer_v2/lib/domain/study.dart +++ b/designer_v2/lib/domain/study.dart @@ -14,7 +14,6 @@ enum StudyActionType { duplicateDraft, addCollaborator, export, - close, delete, } @@ -28,8 +27,6 @@ extension StudyActionTypeFormatted on StudyActionType { return tr.action_unpin; case StudyActionType.edit: return tr.action_edit; - case StudyActionType.close: - return tr.action_close; case StudyActionType.delete: return tr.action_delete; case StudyActionType.duplicate: diff --git a/designer_v2/lib/features/dialogs/close/study_close_dialog_confirm.dart b/designer_v2/lib/features/dialogs/close/study_close_dialog_confirm.dart new file mode 100644 index 000000000..ab3aa2d6b --- /dev/null +++ b/designer_v2/lib/features/dialogs/close/study_close_dialog_confirm.dart @@ -0,0 +1,64 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:reactive_forms/reactive_forms.dart'; +import 'package:studyu_designer_v2/common_views/dialog.dart'; +import 'package:studyu_designer_v2/common_views/form_buttons.dart'; +import 'package:studyu_designer_v2/common_views/primary_button.dart'; +import 'package:studyu_designer_v2/features/study/settings/study_settings_form_controller.dart'; +import 'package:studyu_designer_v2/features/study/study_controller.dart'; +import 'package:studyu_designer_v2/features/study/study_page_view.dart'; +import 'package:studyu_designer_v2/localization/app_translation.dart'; + +class CloseConfirmationDialog extends StudyPageWidget { + const CloseConfirmationDialog(super.studyId, {super.key}); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final controller = ref.watch(studyControllerProvider(studyId).notifier); + final formViewModel = + ref.watch(studySettingsFormViewModelProvider(studyId)); + + return ReactiveForm( + formGroup: formViewModel.form, + child: StandardDialog( + titleText: tr.dialog_study_close_title, + body: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Flexible( + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + RichText( + text: TextSpan( + text: tr.dialog_study_close_description, + ), + ), + ], + )), + ], + ), + ], + ), + actionButtons: [ + const DismissButton(), + ReactiveFormConsumer(builder: (context, form, child) { + return PrimaryButton( + text: tr.dialog_close, + icon: null, + onPressedFuture: () => controller.closeStudy(), + ); + }), + ], + maxWidth: 650, + minWidth: 610, + minHeight: 200, + ), + ); + } +} diff --git a/designer_v2/lib/features/dialogs/close/study_close_dialog_success.dart b/designer_v2/lib/features/dialogs/close/study_close_dialog_success.dart new file mode 100644 index 000000000..c08726a0e --- /dev/null +++ b/designer_v2/lib/features/dialogs/close/study_close_dialog_success.dart @@ -0,0 +1,42 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:studyu_designer_v2/common_views/dialog.dart'; +import 'package:studyu_designer_v2/common_views/empty_body.dart'; +import 'package:studyu_designer_v2/common_views/primary_button.dart'; +import 'package:studyu_designer_v2/features/study/study_page_view.dart'; +import 'package:studyu_designer_v2/localization/app_translation.dart'; +import 'package:studyu_designer_v2/localization/string_hardcoded.dart'; + +class CloseSuccessDialog extends StudyPageWidget { + const CloseSuccessDialog(super.studyId, {super.key}); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final theme = Theme.of(context); + + return StandardDialog( + body: Column( + children: [ + const SizedBox(height: 24.0), + EmptyBody( + leading: Text("\u{1f512}".hardcoded, + style: theme.textTheme.displayLarge?.copyWith( + fontSize: (theme.textTheme.displayLarge?.fontSize ?? 48.0) * 1.5, + )), + title: tr.notification_study_closed, + description: '', + ), + const SizedBox(height: 8.0), + ], + ), + actionButtons: [ + PrimaryButton( + text: tr.action_button_study_close, + icon: null, + onPressedFuture: () => Navigator.maybePop(context), + ), + ], + maxWidth: 450, + ); + } +} diff --git a/designer_v2/lib/features/publish/study_publish_dialog_confirm.dart b/designer_v2/lib/features/dialogs/publish/study_publish_dialog_confirm.dart similarity index 100% rename from designer_v2/lib/features/publish/study_publish_dialog_confirm.dart rename to designer_v2/lib/features/dialogs/publish/study_publish_dialog_confirm.dart diff --git a/designer_v2/lib/features/publish/study_publish_dialog_success.dart b/designer_v2/lib/features/dialogs/publish/study_publish_dialog_success.dart similarity index 100% rename from designer_v2/lib/features/publish/study_publish_dialog_success.dart rename to designer_v2/lib/features/dialogs/publish/study_publish_dialog_success.dart diff --git a/designer_v2/lib/features/dialogs/study_dialogs.dart b/designer_v2/lib/features/dialogs/study_dialogs.dart new file mode 100644 index 000000000..8ecee70f9 --- /dev/null +++ b/designer_v2/lib/features/dialogs/study_dialogs.dart @@ -0,0 +1,39 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:studyu_designer_v2/domain/study.dart'; +import 'package:studyu_designer_v2/features/dialogs/close/study_close_dialog_confirm.dart'; +import 'package:studyu_designer_v2/features/dialogs/close/study_close_dialog_success.dart'; +import 'package:studyu_designer_v2/features/dialogs/publish/study_publish_dialog_confirm.dart'; +import 'package:studyu_designer_v2/features/dialogs/publish/study_publish_dialog_success.dart'; +import 'package:studyu_designer_v2/features/study/study_controller.dart'; +import 'package:studyu_designer_v2/features/study/study_page_view.dart'; +import 'package:studyu_designer_v2/theme.dart'; + +enum StudyDialogType { publish, close } + +class StudyDialog extends StudyPageWidget { + final StudyDialogType dialogType; + + const StudyDialog(this.dialogType, super.studyId, {super.key}); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final state = ref.watch(studyControllerProvider(studyId)); + + switch(dialogType) { + case StudyDialogType.publish: + return state.isPublished ? PublishSuccessDialog(studyId) : PublishConfirmationDialog(studyId); + case StudyDialogType.close: + return state.isClosed ? CloseSuccessDialog(studyId) : CloseConfirmationDialog(studyId); + } + } +} + +showStudyDialog(BuildContext context, StudyID studyId, StudyDialogType dialogType) { + final theme = Theme.of(context); + return showDialog( + context: context, + barrierColor: ThemeConfig.modalBarrierColor(theme), + builder: (context) => StudyDialog(dialogType, studyId), + ); +} diff --git a/designer_v2/lib/features/publish/study_publish_dialog.dart b/designer_v2/lib/features/publish/study_publish_dialog.dart deleted file mode 100644 index d9efd69c1..000000000 --- a/designer_v2/lib/features/publish/study_publish_dialog.dart +++ /dev/null @@ -1,31 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:studyu_designer_v2/domain/study.dart'; -import 'package:studyu_designer_v2/features/publish/study_publish_dialog_confirm.dart'; -import 'package:studyu_designer_v2/features/publish/study_publish_dialog_success.dart'; -import 'package:studyu_designer_v2/features/study/study_controller.dart'; -import 'package:studyu_designer_v2/features/study/study_page_view.dart'; -import 'package:studyu_designer_v2/theme.dart'; - -class PublishDialog extends StudyPageWidget { - const PublishDialog(super.studyId, {super.key}); - - @override - Widget build(BuildContext context, WidgetRef ref) { - final state = ref.watch(studyControllerProvider(studyId)); - - if (state.isPublished) { - return PublishSuccessDialog(studyId); - } - return PublishConfirmationDialog(studyId); - } -} - -showPublishDialog(BuildContext context, StudyID studyId) { - final theme = Theme.of(context); - return showDialog( - context: context, - barrierColor: ThemeConfig.modalBarrierColor(theme), - builder: (context) => PublishDialog(studyId), - ); -} diff --git a/designer_v2/lib/features/recruit/study_recruit_page.dart b/designer_v2/lib/features/recruit/study_recruit_page.dart index c9f886496..5b89866a8 100644 --- a/designer_v2/lib/features/recruit/study_recruit_page.dart +++ b/designer_v2/lib/features/recruit/study_recruit_page.dart @@ -55,9 +55,9 @@ class StudyRecruitScreen extends StudyPageWidget { @override Widget? banner(BuildContext context, WidgetRef ref) { final state = ref.watch(studyRecruitControllerProvider(studyId)); - final isStudyClosed = state.studyWithMetadata!.model.isClosed; + final isStudyClosed = state.studyWithMetadata?.model.isClosed; - if (isStudyClosed) { + if (isStudyClosed ?? false) { return BannerBox( noPrefix: true, body: Column( diff --git a/designer_v2/lib/features/study/study_actions.dart b/designer_v2/lib/features/study/study_actions.dart index 8b38692cd..cbd257fcb 100644 --- a/designer_v2/lib/features/study/study_actions.dart +++ b/designer_v2/lib/features/study/study_actions.dart @@ -11,5 +11,4 @@ Map studyActionIcons = { StudyActionType.addCollaborator: Icons.person_add_rounded, StudyActionType.export: Icons.download_rounded, StudyActionType.delete: Icons.delete_rounded, - StudyActionType.close: MdiIcons.accountLock, }; diff --git a/designer_v2/lib/features/study/study_controller.dart b/designer_v2/lib/features/study/study_controller.dart index 2edbd13dd..3091f8350 100644 --- a/designer_v2/lib/features/study/study_controller.dart +++ b/designer_v2/lib/features/study/study_controller.dart @@ -82,6 +82,11 @@ class StudyController extends StudyBaseController { return studyRepository.launch(study); } + Future closeStudy() { + final study = state.study.value!; + return studyRepository.close(study); + } + void onChangeStudyParticipation() { router.dispatch(RoutingIntents.studyEditEnrollment(studyId)); } @@ -111,7 +116,6 @@ final studyControllerProvider = currentUser: ref.watch(authRepositoryProvider).currentUser, router: ref.watch(routerProvider), notificationService: ref.watch(notificationServiceProvider), - //ref: ref, ); controller.addListener((state) { print("studyController.state updated"); diff --git a/designer_v2/lib/features/study/study_controller_state.dart b/designer_v2/lib/features/study/study_controller_state.dart index 483b9b61c..bd31b0813 100644 --- a/designer_v2/lib/features/study/study_controller_state.dart +++ b/designer_v2/lib/features/study/study_controller_state.dart @@ -17,6 +17,8 @@ class StudyControllerState extends StudyControllerBaseState implements IStudyApp bool get isPublished => study.value != null && study.value!.status == StudyStatus.running; + bool get isClosed => study.value != null && study.value!.status == StudyStatus.closed; + // - ISyncIndicatorViewModel @override diff --git a/designer_v2/lib/features/study/study_scaffold.dart b/designer_v2/lib/features/study/study_scaffold.dart index 0a12c7c03..4536e38bc 100644 --- a/designer_v2/lib/features/study/study_scaffold.dart +++ b/designer_v2/lib/features/study/study_scaffold.dart @@ -6,13 +6,13 @@ import 'package:studyu_designer_v2/common_views/async_value_widget.dart'; import 'package:studyu_designer_v2/common_views/layout_single_column.dart'; import 'package:studyu_designer_v2/common_views/navbar_tabbed.dart'; import 'package:studyu_designer_v2/common_views/primary_button.dart'; +import 'package:studyu_designer_v2/common_views/secondary_button.dart'; import 'package:studyu_designer_v2/common_views/sync_indicator.dart'; import 'package:studyu_designer_v2/common_views/utils.dart'; import 'package:studyu_designer_v2/constants.dart'; import 'package:studyu_designer_v2/features/app_drawer.dart'; import 'package:studyu_designer_v2/features/design/study_form_providers.dart'; import 'package:studyu_designer_v2/features/forms/form_validation.dart'; -import 'package:studyu_designer_v2/features/publish/study_publish_dialog.dart'; import 'package:studyu_designer_v2/features/study/study_controller.dart'; import 'package:studyu_designer_v2/features/study/study_controller_state.dart'; import 'package:studyu_designer_v2/features/study/study_navbar.dart'; @@ -20,6 +20,7 @@ import 'package:studyu_designer_v2/features/study/study_page_view.dart'; import 'package:studyu_designer_v2/features/study/study_status_badge.dart'; import 'package:studyu_designer_v2/localization/app_translation.dart'; import 'package:studyu_designer_v2/theme.dart'; +import 'package:studyu_designer_v2/features/dialogs/study_dialogs.dart'; abstract class IStudyAppBarViewModel implements IStudyStatusBadgeViewModel, IStudyNavViewModel { bool get isSyncIndicatorVisible; @@ -228,7 +229,7 @@ class _StudyScaffoldState extends ConsumerState { tooltipDisabled: "${tr.form_invalid_prompt}\n\n${form.validationErrorSummary}", icon: null, enabled: formViewModel.isValid, - onPressed: () => showPublishDialog(context, widget.studyId), + onPressed: () => showStudyDialog(context, widget.studyId, StudyDialogType.publish), ); }), ); @@ -236,6 +237,24 @@ class _StudyScaffoldState extends ConsumerState { actionButtons.add(const SizedBox(width: 12.0)); // padding } + if (state.isPublished) { + final formViewModel = ref.watch(studyPublishValidatorProvider(widget.studyId)); + final closeButton = ReactiveForm( + formGroup: formViewModel.form, + child: ReactiveFormConsumer( + // enable re-rendering based on form validation status + builder: (context, form, child) { + return SecondaryButton( + text: tr.action_button_study_close, + icon: null, + onPressed: () => showStudyDialog(context, widget.studyId, StudyDialogType.close), + ); + }), + ); + actionButtons.add(closeButton); + actionButtons.add(const SizedBox(width: 12.0)); // padding + } + if (state.isSettingsEnabled) { actionButtons.add(IconButton( onPressed: controller.onSettingsPressed, diff --git a/designer_v2/lib/localization/app_de.arb b/designer_v2/lib/localization/app_de.arb index ded5ffe6a..e19eebf00 100644 --- a/designer_v2/lib/localization/app_de.arb +++ b/designer_v2/lib/localization/app_de.arb @@ -118,6 +118,7 @@ "study_settings_publish_results": "Ergebnisse veröffentlichen", "study_settings_publish_results_tooltip": "Andere Forscher und Kliniker können auf die anonymisierten Ergebnisdaten einer Studie zugreifen, \nsie exportieren und analysieren (die Analysieren-Unterseite deiner Studie ist zugänglich). Die Studie \nselbst wird dadurch automatisch auch für andere Forscher und Kliniker im Studienregister veröffentlicht.", "action_button_study_launch": "Studie starten", + "action_button_study_close": "Studie schließen", "notification_study_deleted": "Die Studie wurde gelöscht", "notification_study_closed": "Die Studie wurde geschlossen", "dialog_study_close_title": "Teilnahme schließen?", @@ -550,7 +551,6 @@ "action_pin": "Anheften", "action_unpin": "Nicht mehr anheften", "action_edit": "Bearbeiten", - "action_close": "Schließen", "action_delete": "Löschen", "action_remove": "Entfernen", "action_duplicate": "Duplizieren", diff --git a/designer_v2/lib/localization/app_en.arb b/designer_v2/lib/localization/app_en.arb index fa8539822..12b88af00 100644 --- a/designer_v2/lib/localization/app_en.arb +++ b/designer_v2/lib/localization/app_en.arb @@ -118,6 +118,7 @@ "study_settings_publish_results": "Publish results", "study_settings_publish_results_tooltip": "Make your anonymized study results & data available in the study registry. \nOther researchers & clinicians will be able to access, export and \nanalyze the results from your study (the Analyze page will be available). \n This will automatically publish your study design to the registry.", "action_button_study_launch": "Launch", + "action_button_study_close": "Close study", "notification_study_deleted": "Study was deleted", "notification_study_closed": "Study was closed", "dialog_study_close_title": "Close participation?", @@ -599,7 +600,6 @@ "action_pin": "Pin", "action_unpin": "Remove pin", "action_delete": "Delete", - "action_close": "Close", "action_remove": "Remove", "action_duplicate": "Duplicate", "action_clipboard": "Copy to clipboard", diff --git a/designer_v2/lib/repositories/study_repository.dart b/designer_v2/lib/repositories/study_repository.dart index 8c523ca9b..10980492b 100644 --- a/designer_v2/lib/repositories/study_repository.dart +++ b/designer_v2/lib/repositories/study_repository.dart @@ -20,6 +20,7 @@ import 'package:studyu_designer_v2/utils/performance.dart'; abstract class IStudyRepository implements ModelRepository { Future launch(Study study); Future deleteParticipants(Study study); + Future close(Study study); // Future deleteProgress(Study study); } @@ -97,6 +98,27 @@ class StudyRepository extends ModelRepository implements IStudyRepository return publishOperation.execute(); } + @override + Future close(Study study) async { + final wrappedModel = get(study.id); + if (wrappedModel == null) { + throw ModelNotFoundException(); + } + study.status = StudyStatus.closed; + + final publishOperation = OptimisticUpdate( + applyOptimistic: () => {}, // nothing to do here + apply: () => save(study, runOptimistically: false), + rollback: () {}, // nothing to do here + onUpdate: () => emitUpdate(), + onError: (e, stackTrace) { + emitError(modelStreamControllers[study.id], e, stackTrace); + }, + ); + + return publishOperation.execute(); + } + @override List availableActions(Study model) { Future onDeleteCallback() { @@ -105,13 +127,6 @@ class StudyRepository extends ModelRepository implements IStudyRepository () => ref.read(notificationServiceProvider).show(Notifications.studyDeleted))); } - Future onCloseCallback() { - model.status = StudyStatus.closed; - return save(model).then((value) => ref.read(routerProvider).dispatch(RoutingIntents.studies)).then((value) => - Future.delayed(const Duration(milliseconds: 200), - () => ref.read(notificationServiceProvider).show(Notifications.studyClosed))); - } - final currentUser = authRepository.currentUser!; // TODO: review Postgres policies to match [ModelAction.isAvailable] @@ -161,16 +176,6 @@ class StudyRepository extends ModelRepository implements IStudyRepository isAvailable: model.canExport(currentUser), ), ModelAction.addSeparator(), - ModelAction( - type: StudyActionType.close, - label: StudyActionType.close.string, - onExecute: () { - return ref.read(notificationServiceProvider).show(Notifications.studyCloseConfirmation, actions: [ - NotificationAction(label: StudyActionType.close.string, onSelect: onCloseCallback, isDestructive: true), - ]); - }, - isAvailable: model.canClose(currentUser) && model.status == StudyStatus.running, - ), ModelAction( type: StudyActionType.delete, label: StudyActionType.delete.string, diff --git a/designer_v2/lib/services/notifications.dart b/designer_v2/lib/services/notifications.dart index 40eeb7abe..adcc3b239 100644 --- a/designer_v2/lib/services/notifications.dart +++ b/designer_v2/lib/services/notifications.dart @@ -19,9 +19,6 @@ class Notifications { static final studyDeleted = SnackbarIntent( message: tr.notification_study_deleted, ); - static final studyClosed = SnackbarIntent( - message: tr.notification_study_closed, - ); static final inviteCodeDeleted = SnackbarIntent( message: tr.notification_code_deleted, ); From 881f856fe5a2a039fb9de2d0f90d744ad717c322 Mon Sep 17 00:00:00 2001 From: Johannes Vedder Date: Fri, 7 Jun 2024 16:38:32 +0200 Subject: [PATCH 139/314] chore: format --- .../dialogs/close/study_close_dialog_confirm.dart | 15 +++++++-------- .../lib/features/dialogs/study_dialogs.dart | 2 +- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/designer_v2/lib/features/dialogs/close/study_close_dialog_confirm.dart b/designer_v2/lib/features/dialogs/close/study_close_dialog_confirm.dart index ab3aa2d6b..d0ddf8ca9 100644 --- a/designer_v2/lib/features/dialogs/close/study_close_dialog_confirm.dart +++ b/designer_v2/lib/features/dialogs/close/study_close_dialog_confirm.dart @@ -15,8 +15,7 @@ class CloseConfirmationDialog extends StudyPageWidget { @override Widget build(BuildContext context, WidgetRef ref) { final controller = ref.watch(studyControllerProvider(studyId).notifier); - final formViewModel = - ref.watch(studySettingsFormViewModelProvider(studyId)); + final formViewModel = ref.watch(studySettingsFormViewModelProvider(studyId)); return ReactiveForm( formGroup: formViewModel.form, @@ -31,12 +30,12 @@ class CloseConfirmationDialog extends StudyPageWidget { children: [ Flexible( child: Column( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - RichText( - text: TextSpan( - text: tr.dialog_study_close_description, + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + RichText( + text: TextSpan( + text: tr.dialog_study_close_description, ), ), ], diff --git a/designer_v2/lib/features/dialogs/study_dialogs.dart b/designer_v2/lib/features/dialogs/study_dialogs.dart index 8ecee70f9..bd22ccf7e 100644 --- a/designer_v2/lib/features/dialogs/study_dialogs.dart +++ b/designer_v2/lib/features/dialogs/study_dialogs.dart @@ -20,7 +20,7 @@ class StudyDialog extends StudyPageWidget { Widget build(BuildContext context, WidgetRef ref) { final state = ref.watch(studyControllerProvider(studyId)); - switch(dialogType) { + switch (dialogType) { case StudyDialogType.publish: return state.isPublished ? PublishSuccessDialog(studyId) : PublishConfirmationDialog(studyId); case StudyDialogType.close: From acdbb1c2c1274dc4f6bbb6e89156b83326cd4afc Mon Sep 17 00:00:00 2001 From: Johannes Vedder Date: Mon, 10 Jun 2024 09:55:22 +0200 Subject: [PATCH 140/314] chore: copy migration to schema --- core/lib/src/models/tables/study.g.dart | 10 +- .../20240526_migrate_close_study.sql | 24 ++- database/studyu-schema.sql | 173 ++++++++++++++---- .../20240526_migrate_close_study.sql | 1 - 4 files changed, 158 insertions(+), 50 deletions(-) delete mode 120000 supabase/migrations/20240526_migrate_close_study.sql diff --git a/core/lib/src/models/tables/study.g.dart b/core/lib/src/models/tables/study.g.dart index 78f3de9de..85629996b 100644 --- a/core/lib/src/models/tables/study.g.dart +++ b/core/lib/src/models/tables/study.g.dart @@ -19,7 +19,7 @@ Study _$StudyFromJson(Map json) => Study( ..contact = Study._contactFromJson(json['contact']) ..iconName = json['icon_name'] as String? ?? 'accountHeart' ..published = json['published'] as bool? ?? false - ..isClosed = json['is_closed'] as bool? ?? false + ..status = $enumDecode(_$StudyStatusEnumMap, json['status']) ..questionnaire = Study._questionnaireFromJson(json['questionnaire']) ..eligibilityCriteria = Study._eligibilityCriteriaFromJson(json['eligibility_criteria']) @@ -67,7 +67,7 @@ Map _$StudyToJson(Study instance) { val['contact'] = instance.contact.toJson(); val['icon_name'] = instance.iconName; val['published'] = instance.published; - val['is_closed'] = instance.isClosed; + val['status'] = instance.status.toJson(); val['questionnaire'] = instance.questionnaire.toJson(); val['eligibility_criteria'] = instance.eligibilityCriteria.map((e) => e.toJson()).toList(); @@ -92,3 +92,9 @@ const _$ResultSharingEnumMap = { ResultSharing.private: 'private', ResultSharing.organization: 'organization', }; + +const _$StudyStatusEnumMap = { + StudyStatus.draft: 'draft', + StudyStatus.running: 'running', + StudyStatus.closed: 'closed', +}; diff --git a/database/migration/20240526_migrate_close_study.sql b/database/migration/20240526_migrate_close_study.sql index b5d44e7e8..dd5d804c8 100644 --- a/database/migration/20240526_migrate_close_study.sql +++ b/database/migration/20240526_migrate_close_study.sql @@ -6,6 +6,8 @@ CREATE TYPE public.study_status AS ENUM ( 'closed' ); +ALTER TYPE public.study_status OWNER TO postgres; + ALTER TABLE public.study ADD COLUMN status public.study_status DEFAULT 'draft'::public.study_status NOT NULL; @@ -17,13 +19,13 @@ UPDATE public.study SET status = CASE END; -- Migrate policy -DROP POLICY "Editors can do everything with their studies" ON public.study; +--DROP POLICY "Editors can do everything with their studies" ON public.study; CREATE POLICY "Editors can view their studies" ON public.study FOR SELECT USING (auth.uid() = user_id); -CREATE POLICY "Editor can control their draft studies" ON public.study - --USING (public.can_edit(auth.uid(), study.*) AND status = 'draft'::public.study_status); - USING (public.can_edit(auth.uid(), study.*)); +--CREATE POLICY "Editor can control their draft studies" ON public.study + -- old --USING (public.can_edit(auth.uid(), study.*) AND status = 'draft'::public.study_status); +-- USING (public.can_edit(auth.uid(), study.*)); -- Editors can only update registry_published and resultSharing --grant update (registry_published, result_sharing) on public.study USING (public.can_edit(auth.uid(), study.*); @@ -38,8 +40,7 @@ CREATE POLICY "Editor can control their draft studies" ON public.study -- https://github.com/orgs/supabase/discussions/656#discussioncomment-5594653 --- todo document this function -CREATE OR REPLACE FUNCTION public.allow_updating_only() +CREATE OR REPLACE FUNCTION public.allow_updating_only_study() RETURNS trigger LANGUAGE plpgsql AS $function$ @@ -52,17 +53,17 @@ DECLARE old_value TEXT; BEGIN - -- If the current user is 'postgres', return NEW without making any changes + -- The user 'postgres' should be able to update any record, e.g. when using Supabase Studio IF CURRENT_USER = 'postgres' THEN RETURN NEW; END IF; - -- If the status is draft, return NEW without making any changes + -- In draft status allow update of all columns IF OLD.status = 'draft'::public.study_status THEN RETURN NEW; END IF; - -- Don't allow invalid status transitions + -- Only allow status to be updated from draft to running and from running to closed IF OLD.status != NEW.status THEN IF NOT ( (OLD.status = 'draft'::public.study_status AND NEW.status = 'running'::public.study_status) @@ -108,11 +109,14 @@ BEGIN END; $function$; +ALTER FUNCTION public.allow_updating_only_study() OWNER TO postgres; + +-- Only allow updating status, registry_published and result_sharing of the study table when in draft mode CREATE OR REPLACE TRIGGER study_status_update_permissions BEFORE UPDATE ON public.study FOR EACH ROW - EXECUTE FUNCTION public.allow_updating_only('updated_at', 'status', 'registry_published', 'result_sharing'); + EXECUTE FUNCTION public.allow_updating_only_study('updated_at', 'status', 'registry_published', 'result_sharing'); -- todo also add participation? -- Owners can update status diff --git a/database/studyu-schema.sql b/database/studyu-schema.sql index b202d5ef4..083ece6dc 100644 --- a/database/studyu-schema.sql +++ b/database/studyu-schema.sql @@ -66,6 +66,14 @@ CREATE TYPE public.result_sharing AS ENUM ( ALTER TYPE public.result_sharing OWNER TO postgres; +CREATE TYPE public.study_status AS ENUM ( + 'draft', + 'running', + 'closed' +); + +ALTER TYPE public.study_status OWNER TO postgres; + SET default_tablespace = ''; SET default_table_access_method = heap; @@ -82,6 +90,7 @@ CREATE TABLE public.study ( icon_name text NOT NULL, -- published is deprecated, use status instead published boolean DEFAULT false NOT NULL, + status public.study_status DEFAULT 'draft'::public.study_status NOT NULL, registry_published boolean DEFAULT false NOT NULL, questionnaire jsonb NOT NULL, eligibility_criteria jsonb NOT NULL, @@ -486,6 +495,78 @@ $$; ALTER FUNCTION public.user_email(user_id uuid) OWNER TO postgres; + +CREATE OR REPLACE FUNCTION public.allow_updating_only_study() + RETURNS trigger + LANGUAGE plpgsql +AS $function$ +DECLARE + whitelist TEXT[] := TG_ARGV::TEXT[]; + schema_table TEXT; + column_name TEXT; + rec RECORD; + new_value TEXT; + old_value TEXT; +BEGIN + + -- The user 'postgres' should be able to update any record, e.g. when using Supabase Studio + IF CURRENT_USER = 'postgres' THEN + RETURN NEW; + END IF; + + -- In draft status allow update of all columns + IF OLD.status = 'draft'::public.study_status THEN + RETURN NEW; + END IF; + + -- Only allow status to be updated from draft to running and from running to closed + IF OLD.status != NEW.status THEN + IF NOT ( + (OLD.status = 'draft'::public.study_status AND NEW.status = 'running'::public.study_status) + OR (OLD.status = 'running'::public.study_status AND NEW.status = 'closed'::public.study_status) + ) THEN + RAISE EXCEPTION 'Invalid status transition'; + END IF; + END IF; + + schema_table := concat(TG_TABLE_SCHEMA, '.', TG_TABLE_NAME); + + -- If RLS is not active on current table for function invoker, early return + IF NOT row_security_active(schema_table) THEN + RETURN NEW; + END IF; + + -- Otherwise, loop on all columns of the table schema + FOR rec IN ( + SELECT col.column_name + FROM information_schema.columns as col + WHERE table_schema = TG_TABLE_SCHEMA + AND table_name = TG_TABLE_NAME + ) LOOP + -- If the current column is whitelisted, early continue + column_name := rec.column_name; + IF column_name = ANY(whitelist) THEN + CONTINUE; + END IF; + + -- If not whitelisted, execute dynamic SQL to get column value from OLD and NEW records + EXECUTE format('SELECT ($1).%I, ($2).%I', column_name, column_name) + INTO new_value, old_value + USING NEW, OLD; + + -- Raise exception if column value changed + IF new_value IS DISTINCT FROM old_value THEN + RAISE EXCEPTION 'Unauthorized change to "%"', column_name; + END IF; + END LOOP; + + -- RLS active, but no exception encountered, clear to proceed. + RETURN NEW; +END; +$function$; + +ALTER FUNCTION public.allow_updating_only_study() OWNER TO postgres; + -- -- Name: app_config; Type: TABLE; Schema: public; Owner: postgres -- @@ -686,6 +767,12 @@ CREATE TRIGGER on_auth_user_created AFTER INSERT ON auth.users FOR EACH ROW EXEC CREATE TRIGGER handle_updated_at BEFORE UPDATE ON public.study FOR EACH ROW EXECUTE FUNCTION extensions.moddatetime('updated_at'); +-- Only allow updating status, registry_published and result_sharing of the study table when in draft mode +CREATE OR REPLACE TRIGGER study_status_update_permissions + BEFORE UPDATE + ON public.study + FOR EACH ROW + EXECUTE FUNCTION public.allow_updating_only_study('updated_at', 'status', 'registry_published', 'result_sharing'); -- -- Name: subject_progress participant_progress_subjectId_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres @@ -781,6 +868,8 @@ CREATE POLICY "Study creators can do everything with repos from their studies" O CREATE POLICY "Study subjects can view their joined study" ON public.study FOR SELECT USING (public.is_study_subject_of(auth.uid(), id)); +CREATE POLICY "Editors can view their studies" ON public.study FOR SELECT USING (auth.uid() = user_id); + -- -- Name: study Editors can do everything with their studies; Type: POLICY; Schema: public; Owner: postgres -- @@ -876,92 +965,102 @@ USING (public.has_results_public(id)); CREATE POLICY "Allow users to manage their own user" ON public."user" FOR ALL USING (auth.uid() = id); -- --- Name: app_config; Type: ROW SECURITY; Schema: public; Owner: postgres +-- Name: create blob storage bucket for observations; Type: value; Schema: storage; Owner: postgres -- -ALTER TABLE public.app_config ENABLE ROW LEVEL SECURITY; +INSERT INTO storage.buckets (id, name) VALUES ('observations', 'observations'); -- --- Name: repo; Type: ROW SECURITY; Schema: public; Owner: postgres +-- Name: authenticated Users can view their uploaded data; Type: POLICY, Schema: storage -- -ALTER TABLE public.repo ENABLE ROW LEVEL SECURITY; +CREATE POLICY "Allow authenticated Users to view own observations" ON storage.objects FOR +SELECT +TO authenticated USING (((bucket_id = 'observations'::text) AND (owner = auth.uid()))); -- --- Name: study; Type: ROW SECURITY; Schema: public; Owner: postgres +-- Name: authenticated Users can upload observations to storage; Type: POLICY, Schema: storage -- -ALTER TABLE public.study ENABLE ROW LEVEL SECURITY; +CREATE POLICY "Allow authenticated Users to upload observations" ON storage.objects FOR +INSERT +TO authenticated WITH CHECK ((bucket_id = 'observations'::text)); -- --- Name: study_invite; Type: ROW SECURITY; Schema: public; Owner: postgres +-- Name: authenticated Users can delete own observations; Type: POLICY, Schema: storage -- -ALTER TABLE public.study_invite ENABLE ROW LEVEL SECURITY; +CREATE POLICY "Allow authenticated Users to delete own observations" ON storage.objects FOR +DELETE +TO authenticated USING (((bucket_id = 'observations'::text) AND (owner = auth.uid()))); -- --- Name: study_subject; Type: ROW SECURITY; Schema: public; Owner: postgres +-- Name: Researchers can view observations of studies which they created; Type: POLICY, Schema: storage -- -ALTER TABLE public.study_subject ENABLE ROW LEVEL SECURITY; +CREATE POLICY "Allow Researchers to view observations of own studies" ON storage.objects FOR +SELECT +TO public USING (((bucket_id = 'observations'::text) AND + (name ~~ ANY (SELECT ('%'::text || ((public.study.id)::text || '%'::text)) AS study_id + FROM public.study + WHERE ((public.study.user_id)::text = (auth.uid())::text))))); + +CREATE POLICY "Joining a closed study should not be possible" ON public.study_subject + AS RESTRICTIVE + FOR INSERT + WITH CHECK (NOT EXISTS ( + SELECT 1 + FROM public.study + WHERE study.id = study_subject.study_id + AND study.status = 'closed'::public.study_status +)); -- --- Name: subject_progress; Type: ROW SECURITY; Schema: public; Owner: postgres +-- Name: app_config; Type: ROW SECURITY; Schema: public; Owner: postgres -- -ALTER TABLE public.subject_progress ENABLE ROW LEVEL SECURITY; +ALTER TABLE public.app_config ENABLE ROW LEVEL SECURITY; -- --- Name: user; Type: ROW SECURITY; Schema: public; Owner: postgres +-- Name: repo; Type: ROW SECURITY; Schema: public; Owner: postgres -- -ALTER TABLE public."user" ENABLE ROW LEVEL SECURITY; +ALTER TABLE public.repo ENABLE ROW LEVEL SECURITY; -- --- Name: study_progress_export; Type: ROW SECURITY; Schema: public; Owner: postgres +-- Name: study; Type: ROW SECURITY; Schema: public; Owner: postgres -- -ALTER VIEW public.study_progress_export SET (security_invoker = on); +ALTER TABLE public.study ENABLE ROW LEVEL SECURITY; -- --- Name: create blob storage bucket for observations; Type: value; Schema: storage; Owner: postgres +-- Name: study_invite; Type: ROW SECURITY; Schema: public; Owner: postgres -- -INSERT INTO storage.buckets (id, name) VALUES ('observations', 'observations'); +ALTER TABLE public.study_invite ENABLE ROW LEVEL SECURITY; -- --- Name: authenticated Users can view their uploaded data; Type: POLICY, Schema: storage +-- Name: study_subject; Type: ROW SECURITY; Schema: public; Owner: postgres -- -CREATE POLICY "Allow authenticated Users to view own observations" ON storage.objects FOR -SELECT -TO authenticated USING (((bucket_id = 'observations'::text) AND (owner = auth.uid()))); +ALTER TABLE public.study_subject ENABLE ROW LEVEL SECURITY; -- --- Name: authenticated Users can upload observations to storage; Type: POLICY, Schema: storage +-- Name: subject_progress; Type: ROW SECURITY; Schema: public; Owner: postgres -- -CREATE POLICY "Allow authenticated Users to upload observations" ON storage.objects FOR -INSERT -TO authenticated WITH CHECK ((bucket_id = 'observations'::text)); +ALTER TABLE public.subject_progress ENABLE ROW LEVEL SECURITY; -- --- Name: authenticated Users can delete own observations; Type: POLICY, Schema: storage +-- Name: user; Type: ROW SECURITY; Schema: public; Owner: postgres -- -CREATE POLICY "Allow authenticated Users to delete own observations" ON storage.objects FOR -DELETE -TO authenticated USING (((bucket_id = 'observations'::text) AND (owner = auth.uid()))); +ALTER TABLE public."user" ENABLE ROW LEVEL SECURITY; -- --- Name: Researchers can view observations of studies which they created; Type: POLICY, Schema: storage +-- Name: study_progress_export; Type: ROW SECURITY; Schema: public; Owner: postgres -- -CREATE POLICY "Allow Researchers to view observations of own studies" ON storage.objects FOR -SELECT -TO public USING (((bucket_id = 'observations'::text) AND - (name ~~ ANY (SELECT ('%'::text || ((public.study.id)::text || '%'::text)) AS study_id - FROM public.study - WHERE ((public.study.user_id)::text = (auth.uid())::text))))); +ALTER VIEW public.study_progress_export SET (security_invoker = on); COMMIT; diff --git a/supabase/migrations/20240526_migrate_close_study.sql b/supabase/migrations/20240526_migrate_close_study.sql deleted file mode 120000 index 5cfba03e0..000000000 --- a/supabase/migrations/20240526_migrate_close_study.sql +++ /dev/null @@ -1 +0,0 @@ -../../database/migration/20240526_migrate_close_study.sql \ No newline at end of file From aed1effbb5cd2e7fba01872514908b0255b12528 Mon Sep 17 00:00:00 2001 From: Johannes Vedder Date: Tue, 11 Jun 2024 17:23:17 +0200 Subject: [PATCH 141/314] fix: merge dashboard refactor pr --- designer_v2/lib/repositories/api_client.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/designer_v2/lib/repositories/api_client.dart b/designer_v2/lib/repositories/api_client.dart index 0a6971a18..8348c0cb3 100644 --- a/designer_v2/lib/repositories/api_client.dart +++ b/designer_v2/lib/repositories/api_client.dart @@ -78,7 +78,7 @@ class StudyUApiClient extends SupabaseClientDependant with SupabaseQueryMixin im 'user_id', 'participation', 'result_sharing', - 'published', + 'status', 'registry_published', 'study_participant_count', 'study_ended_count', From 051552d259ab28ebda107cc9fa75f78923883ff5 Mon Sep 17 00:00:00 2001 From: Johannes Vedder Date: Tue, 11 Jun 2024 17:23:59 +0200 Subject: [PATCH 142/314] chore: fix seed --- supabase/seed.sql | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/supabase/seed.sql b/supabase/seed.sql index 672244d29..c4f606cdc 100644 --- a/supabase/seed.sql +++ b/supabase/seed.sql @@ -28,7 +28,7 @@ BEGIN title, description, icon_name, - published, + status, registry_published, questionnaire, eligibility_criteria, @@ -49,8 +49,8 @@ BEGIN 'Public demo study of user1', 'This is a Demo Study. This study helps you find out which treatment is more effective for you.', 'accountHeart', - -- published - true, + -- status + 'running', -- registry_published true, '[{"id": "recent_back_pain", "type": "boolean", "prompt": "Have you had back pain in the last 12 weeks?", "rationale": ""}, {"id": "f70386c8-f517-4e62-a5fa-ca4badfd4b60", "type": "boolean", "prompt": "Are you pregnant?", "rationale": ""}, {"id": "afeac253-4bfe-47fe-9384-4236ded1bd50", "type": "choice", "prompt": "Does any of the following apply to you and has not been examined by a doctor yet?", "choices": [{"id": "start_of_symptoms_after_spinal_surgery", "text": "Start of symptoms after spinal surgery"}, {"id": "start_of_symptoms_after_diagnosis_of_cancer", "text": "Start of symptoms after diagnosis of cancer"}, {"id": "unexpected_significant_weight_loss", "text": "Unexpected significant weight loss"}, {"id": "start_of_symptoms_after_trauma", "text": "Start of symptoms after trauma"}, {"id": "accompanying_numbness_of_your_legs", "text": "Accompanying numbness of your legs"}], "multiple": true, "rationale": "This question is asked to ensure that you are not suffering from any critical illness."}]','[{"id": "b47d07d8-eb98-4fce-86ab-945bc7c2f2d0", "condition": {"type": "choice", "target": "recent_back_pain", "choices": [true]}}, {"id": "acb368b0-0ca2-496d-98e1-be9fefbe5e89", "condition": {"type": "choice", "target": "f70386c8-f517-4e62-a5fa-ca4badfd4b60", "choices": [false]}}, {"id": "d7c3445e-b5b1-43d1-93a6-5637e0cfd44f", "condition": {"type": "choice", "target": "afeac253-4bfe-47fe-9384-4236ded1bd50", "choices": []}}]','[{"id": "rate_your_day", "type": "questionnaire", "title": "Rate your day", "footer": "", "header": "", "schedule": {"reminders": ["19:00"], "completionPeriods": [{"id": "50d114f3-e692-4283-9610-17e23edf8f70", "lockTime": "20:00", "unlockTime": "8:00"}]}, "questions": [{"id": "pain", "step": 1, "type": "visualAnalogue", "prompt": "Rate your pain.", "initial": 0, "maximum": 10, "minimum": 0, "maximumColor": 4294901760, "minimumColor": 4294967295, "maximumAnnotation": "Well, guess I die now", "minimumAnnotation": "no pain"}, {"id": "painkillers", "type": "boolean", "prompt": "Have you taken any painkillers in the last 24 hours?"}, {"id": "sleep", "step": 1, "type": "visualAnalogue", "prompt": "Rate your sleep.", "initial": 0, "maximum": 10, "minimum": 0, "maximumColor": 4294901760, "minimumColor": 4294967295, "maximumAnnotation": "terrible", "minimumAnnotation": "no problems"}, {"id": "mood", "step": 1, "type": "annotatedScale", "prompt": "Rate your mood.", "initial": 5, "maximum": 10, "minimum": 0, "annotations": [{"value": 0, "annotation": "☠"}, {"value": 5, "annotation": "😐"}, {"value": 10, "annotation": "😀"}]}]}]','[{"id": "willow_bark_tea", "icon": "coffee", "name": "Willow-Bark tea", "tasks": [{"id": "drink_tea", "type": "checkmark", "title": "Drink a cup of Willow-Bark tea twice a day.", "schedule": {"reminders": ["18:00"], "completionPeriods": [{"id": "54d114f3-e692-4283-9610-17e23edf8f70", "lockTime": "20:00", "unlockTime": "6:00"}]}}], "description": "Willow bark contains powerful anti-inflamatory compunds such as flavonoids and salicin that help relieve the pain."}, {"id": "arnika", "icon": "leaf", "name": "Arnika", "tasks": [{"id": "apply_arnika", "type": "checkmark", "title": "Apply a dime sized amount of Arnica gel to your lower back and massage for 10 mins.", "schedule": {"reminders": ["18:00"], "completionPeriods": [{"id": "55d114f3-e692-4283-9610-17e23edf8f70", "lockTime": "20:00", "unlockTime": "6:00"}]}}], "description": "Arnika gel has been proven to soothe muscle soreness, strain and reduce swelling when rubbed on the affected area."}, {"id": "warming_pad", "icon": "car-seat-heater", "name": "Warming Pad", "tasks": [{"id": "use_pad", "type": "checkmark", "title": "Apply warming pad to your lower back for 5 minutes.", "schedule": {"reminders": ["18:00"], "completionPeriods": [{"id": "56d114f3-e692-4283-9610-17e23edf8f70", "lockTime": "20:00", "unlockTime": "6:00"}]}}], "description": "Applying a warming pad is a quick and easy way to soothe sore muscles and joints."}]','[{"id": "Need", "title": "Why Consent Is Needed", "iconName": "featureSearch", "description": "We need your explicit consent because you are going to enroll to a research study. Therefore, we have to provide you all the information that could potentially have an impact on your decision whether or not you take part in the study. This is study-specific so please go through it carefully. Participation is entirely voluntary."}, {"id": "Risk_benefit", "title": "Risks & Benefits", "iconName": "signCaution", "description": "The main risks to you if you choose to participate are allergic reactions to one of the interventions you are going to apply. If you feel uncomfortable, suffer from itching or rash please pause the study until you have seen a doctor. It is important to know that you may not get any benefit from taking part in this research. Others may not benefit either. However, study results may help you to understand if one of the offered interventions has a positive effect on one of the investigated observations for you."}, {"id": "Data", "title": "Data Handling & Use", "iconName": "databaseExport", "description": "By giving your consent you accept that researchers are allowed to process anonymized data collected from you during this study for research purposes. If you stop being in the research study, already transmitted information may not be removed from the research study database because re-identification is not possible. It will continue to be used to complete the research analysis."}, {"id": "Issues", "title": "Issues to Consider", "iconName": "mapClock", "description": "For being able to use your results for research we need you to actively participate for the indicated minimum study duration. After reaching this you will be able to unlock results but we encourage you to take part at least until you reach the recommended level on the progress bar. Otherwise it might be the case that results can indeed be used for research but are not meaningful for you personally. Note that if you decide to take part in this research study you will be responsible for buying the needed aids."}, {"id": "Rights", "title": "Participant Rights", "iconName": "gavel", "description": "You may stop taking part in this research study at any time without any penalty. If you have any questions, concerns, or complaints at any time about this research, or you think the research has harmed you, please contact the office of the research team. You can find the contact details in your personal study dashboard."}, {"id": "Future", "title": "Future Research", "iconName": "binoculars", "description": "The purpose of this research study is to help you find the most effective supporting agent or behavior. The aim is not to treat your symptom causally. In a broader perspective the purpose of this study is also to get insights which group of persons benefits most from which intervention."}]','{"sequence": "alternating", "phaseDuration": 7, "numberOfCycles": 2, "sequenceCustom": "ABAB", "includeBaseline": true}','{"primary": {"id": "average", "type": "average", "title": "Average", "aggregate": "day", "description": "Average", "resultProperty": {"task": "rate_your_day", "property": "pain"}}, "secondary": []}', From dbd18102117af3768a7452e5585126f75ca0f5f1 Mon Sep 17 00:00:00 2001 From: Johannes Vedder Date: Tue, 11 Jun 2024 17:24:40 +0200 Subject: [PATCH 143/314] fix: study visibility policy no longer uses published field --- database/migration/20240526_migrate_close_study.sql | 7 +++++++ database/studyu-schema.sql | 6 ++++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/database/migration/20240526_migrate_close_study.sql b/database/migration/20240526_migrate_close_study.sql index dd5d804c8..5451cbfa7 100644 --- a/database/migration/20240526_migrate_close_study.sql +++ b/database/migration/20240526_migrate_close_study.sql @@ -21,6 +21,13 @@ END; -- Migrate policy --DROP POLICY "Editors can do everything with their studies" ON public.study; +DROP POLICY "Everybody can view designated published studies" ON public.study; + +CREATE POLICY "Study visibility" ON public.study FOR SELECT +USING ((status = 'running'::public.study_status OR status = 'closed'::public.study_status) +AND (registry_published = true OR participation = 'open'::public.participation OR result_sharing = 'public'::public.result_sharing)); +-- todo should we allow draft studies in registry if they have been published? + CREATE POLICY "Editors can view their studies" ON public.study FOR SELECT USING (auth.uid() = user_id); --CREATE POLICY "Editor can control their draft studies" ON public.study diff --git a/database/studyu-schema.sql b/database/studyu-schema.sql index 083ece6dc..b57a283b5 100644 --- a/database/studyu-schema.sql +++ b/database/studyu-schema.sql @@ -878,10 +878,12 @@ CREATE POLICY "Editors can do everything with their studies" ON public.study USI -- --- Name: study Everybody can view (published and registry_published) studies; Type: POLICY; Schema: public; Owner: postgres +-- Name: study Study visibility; Type: POLICY; Schema: public; Owner: postgres -- -CREATE POLICY "Everybody can view designated published studies" ON public.study FOR SELECT USING (((published = true) AND (registry_published = true OR participation = 'open'::public.participation OR result_sharing = 'public'::public.result_sharing))); +CREATE POLICY "Study visibility" ON public.study FOR SELECT +USING ((status = 'running'::public.study_status OR status = 'closed'::public.study_status) +AND (registry_published = true OR participation = 'open'::public.participation OR result_sharing = 'public'::public.result_sharing)); -- From 1ce2f78c9866b0b2869ec9485071e8e3e65fa50f Mon Sep 17 00:00:00 2001 From: Johannes Vedder Date: Tue, 11 Jun 2024 18:12:07 +0200 Subject: [PATCH 144/314] fix: potential isClosed error --- designer_v2/lib/repositories/model_repository.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/designer_v2/lib/repositories/model_repository.dart b/designer_v2/lib/repositories/model_repository.dart index d910bd2f3..c2415a57f 100644 --- a/designer_v2/lib/repositories/model_repository.dart +++ b/designer_v2/lib/repositories/model_repository.dart @@ -304,7 +304,7 @@ abstract class ModelRepository extends IModelRepository { if (fetchOnSubscribe) { if (!(wrappedModel != null && wrappedModel.isLocalOnly)) { fetch(modelId).catchError((e) { - if (!modelController.closed) { + if (!modelController.isClosed) { modelController.addError(e); } return e; From 7dcc928442a2bd2a3e8358802857459f5896f984 Mon Sep 17 00:00:00 2001 From: Johannes Vedder Date: Tue, 11 Jun 2024 18:12:26 +0200 Subject: [PATCH 145/314] fix: migrate app to status --- core/lib/src/models/tables/study.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/lib/src/models/tables/study.dart b/core/lib/src/models/tables/study.dart index b2d37d748..382eccb05 100644 --- a/core/lib/src/models/tables/study.dart +++ b/core/lib/src/models/tables/study.dart @@ -231,7 +231,7 @@ class Study extends SupabaseObjectFunctions implements Comparable static Future> publishedPublicStudies() async { ExtractionResult result; try { - final response = await env.client.from(tableName).select().eq('participation', 'open').eq("closed", false); + final response = await env.client.from(tableName).select().eq('participation', 'open').neq('status', StudyStatus.closed.name); final extracted = SupabaseQuery.extractSupabaseList(List>.from(response)); result = ExtractionSuccess(extracted); } on ExtractionFailedException catch (error) { From 1cb7740c89337ef20b2c6570cffa6643cfbc6bfd Mon Sep 17 00:00:00 2001 From: Johannes Vedder Date: Tue, 11 Jun 2024 18:12:52 +0200 Subject: [PATCH 146/314] fix: do not show separator if no delete item shown --- designer_v2/lib/repositories/study_repository.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/designer_v2/lib/repositories/study_repository.dart b/designer_v2/lib/repositories/study_repository.dart index 10980492b..8515f6470 100644 --- a/designer_v2/lib/repositories/study_repository.dart +++ b/designer_v2/lib/repositories/study_repository.dart @@ -175,7 +175,7 @@ class StudyRepository extends ModelRepository implements IStudyRepository }, isAvailable: model.canExport(currentUser), ), - ModelAction.addSeparator(), + if (model.canDelete(currentUser)) ModelAction.addSeparator(), ModelAction( type: StudyActionType.delete, label: StudyActionType.delete.string, From b6dad92a4e0f0dc2a17c9b201fb233de17acd127 Mon Sep 17 00:00:00 2001 From: Johannes Vedder Date: Tue, 11 Jun 2024 18:13:24 +0200 Subject: [PATCH 147/314] fix: only show close button for editors --- designer_v2/lib/features/study/study_controller_state.dart | 3 +++ designer_v2/lib/features/study/study_scaffold.dart | 3 ++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/designer_v2/lib/features/study/study_controller_state.dart b/designer_v2/lib/features/study/study_controller_state.dart index bd31b0813..ddae66487 100644 --- a/designer_v2/lib/features/study/study_controller_state.dart +++ b/designer_v2/lib/features/study/study_controller_state.dart @@ -69,6 +69,9 @@ class StudyControllerState extends StudyControllerBaseState implements IStudyApp @override bool get isPublishVisible => studyWithMetadata?.model.status == StudyStatus.draft; + @override + bool get isClosedVisible => studyWithMetadata?.model.status == StudyStatus.running && studyWithMetadata!.model.canEdit(super.currentUser); + @override StudyStatus? get studyStatus => study.value?.status; diff --git a/designer_v2/lib/features/study/study_scaffold.dart b/designer_v2/lib/features/study/study_scaffold.dart index 4536e38bc..b261601f2 100644 --- a/designer_v2/lib/features/study/study_scaffold.dart +++ b/designer_v2/lib/features/study/study_scaffold.dart @@ -26,6 +26,7 @@ abstract class IStudyAppBarViewModel implements IStudyStatusBadgeViewModel, IStu bool get isSyncIndicatorVisible; bool get isStatusBadgeVisible; bool get isPublishVisible; + bool get isClosedVisible; } /// Custom scaffold shared between all pages for an individual [Study] @@ -237,7 +238,7 @@ class _StudyScaffoldState extends ConsumerState { actionButtons.add(const SizedBox(width: 12.0)); // padding } - if (state.isPublished) { + if (state.isClosedVisible) { final formViewModel = ref.watch(studyPublishValidatorProvider(widget.studyId)); final closeButton = ReactiveForm( formGroup: formViewModel.form, From 547c468c2c5e52912bb7cc8a9833d4534a07556a Mon Sep 17 00:00:00 2001 From: Johannes Vedder Date: Tue, 11 Jun 2024 18:30:52 +0200 Subject: [PATCH 148/314] fix: add closed success description --- .../lib/features/dialogs/close/study_close_dialog_success.dart | 2 +- designer_v2/lib/localization/app_de.arb | 3 ++- designer_v2/lib/localization/app_en.arb | 3 ++- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/designer_v2/lib/features/dialogs/close/study_close_dialog_success.dart b/designer_v2/lib/features/dialogs/close/study_close_dialog_success.dart index c08726a0e..47e852758 100644 --- a/designer_v2/lib/features/dialogs/close/study_close_dialog_success.dart +++ b/designer_v2/lib/features/dialogs/close/study_close_dialog_success.dart @@ -24,7 +24,7 @@ class CloseSuccessDialog extends StudyPageWidget { fontSize: (theme.textTheme.displayLarge?.fontSize ?? 48.0) * 1.5, )), title: tr.notification_study_closed, - description: '', + description: tr.notification_study_closed_description, ), const SizedBox(height: 8.0), ], diff --git a/designer_v2/lib/localization/app_de.arb b/designer_v2/lib/localization/app_de.arb index e19eebf00..b69ad6487 100644 --- a/designer_v2/lib/localization/app_de.arb +++ b/designer_v2/lib/localization/app_de.arb @@ -121,8 +121,9 @@ "action_button_study_close": "Studie schließen", "notification_study_deleted": "Die Studie wurde gelöscht", "notification_study_closed": "Die Studie wurde geschlossen", + "notification_study_closed_description": "Neue Teilnehmer können sich nicht mehr einschreiben", "dialog_study_close_title": "Teilnahme schließen?", - "dialog_study_close_description": "Bist du sicher, dass die Teilnahme an der Studie geschlossen werden soll? Es können keine neuen Teilnehmer mehr eingeschrieben werden.", + "dialog_study_close_description": "Bist du sicher, dass die Teilnahme an der Studie geschlossen werden soll? Es können keine neuen Teilnehmer mehr eingeschrieben werden, aber bereits angemeldete Teilnehmer können die Studie weiterhin durchführen.", "dialog_study_delete_title": "Dauerhaft löschen?", "dialog_study_delete_description": "Bist du sicher, dass die Studie gelöscht werden soll? Die Studie und alle gesammelten Daten gehen dabei unwiderruflich verloren.", "@__________________STUDYPAGE_DESIGN_SHARED__________________": {}, diff --git a/designer_v2/lib/localization/app_en.arb b/designer_v2/lib/localization/app_en.arb index 12b88af00..8e428367a 100644 --- a/designer_v2/lib/localization/app_en.arb +++ b/designer_v2/lib/localization/app_en.arb @@ -121,8 +121,9 @@ "action_button_study_close": "Close study", "notification_study_deleted": "Study was deleted", "notification_study_closed": "Study was closed", + "notification_study_closed_description": "New participants can no longer enroll in this study.", "dialog_study_close_title": "Close participation?", - "dialog_study_close_description": "Are you sure that you want to close participation for this study? New participants can no longer enroll.", + "dialog_study_close_description": "Are you sure that you want to close participation for this study? New participants can no longer enroll, but enrolled participants can continue to participate.", "dialog_study_delete_title": "Permanently delete?", "dialog_study_delete_description": "Are you sure you want to delete this study? You will permanently lose the study and all data that has been collected.", "@__________________STUDYPAGE_DESIGN_SHARED__________________": {}, From 4beb796aae314ec8bcc27d7f1f738c6866698993 Mon Sep 17 00:00:00 2001 From: Johannes Vedder Date: Tue, 11 Jun 2024 18:37:07 +0200 Subject: [PATCH 149/314] style: format --- core/lib/src/models/tables/study.dart | 3 ++- designer_v2/lib/features/study/study_controller_state.dart | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/core/lib/src/models/tables/study.dart b/core/lib/src/models/tables/study.dart index 382eccb05..1267c6f17 100644 --- a/core/lib/src/models/tables/study.dart +++ b/core/lib/src/models/tables/study.dart @@ -231,7 +231,8 @@ class Study extends SupabaseObjectFunctions implements Comparable static Future> publishedPublicStudies() async { ExtractionResult result; try { - final response = await env.client.from(tableName).select().eq('participation', 'open').neq('status', StudyStatus.closed.name); + final response = + await env.client.from(tableName).select().eq('participation', 'open').neq('status', StudyStatus.closed.name); final extracted = SupabaseQuery.extractSupabaseList(List>.from(response)); result = ExtractionSuccess(extracted); } on ExtractionFailedException catch (error) { diff --git a/designer_v2/lib/features/study/study_controller_state.dart b/designer_v2/lib/features/study/study_controller_state.dart index ddae66487..13f02e1e2 100644 --- a/designer_v2/lib/features/study/study_controller_state.dart +++ b/designer_v2/lib/features/study/study_controller_state.dart @@ -70,7 +70,8 @@ class StudyControllerState extends StudyControllerBaseState implements IStudyApp bool get isPublishVisible => studyWithMetadata?.model.status == StudyStatus.draft; @override - bool get isClosedVisible => studyWithMetadata?.model.status == StudyStatus.running && studyWithMetadata!.model.canEdit(super.currentUser); + bool get isClosedVisible => + studyWithMetadata?.model.status == StudyStatus.running && studyWithMetadata!.model.canEdit(super.currentUser); @override StudyStatus? get studyStatus => study.value?.status; From 9ffc7ce1fdebf2605fdd7970d519e05288aae7a0 Mon Sep 17 00:00:00 2001 From: Johannes Vedder Date: Tue, 11 Jun 2024 18:52:21 +0200 Subject: [PATCH 150/314] tests: migrate db test to status --- supabase/tests/010-study.sql | 58 ++++++++++++++++++------------------ 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/supabase/tests/010-study.sql b/supabase/tests/010-study.sql index b7e9ee6ae..bf235df24 100644 --- a/supabase/tests/010-study.sql +++ b/supabase/tests/010-study.sql @@ -20,7 +20,7 @@ INSERT INTO public.study ( title, description, icon_name, - published, + status, registry_published, questionnaire, eligibility_criteria, @@ -38,11 +38,11 @@ INSERT INTO public.study ( collaborator_emails ) VALUES( '{"email":"example@example.com","phone":"0123456789","website":"https://studyu.health","researchers":"StudyU Researcher","organization":"StudyU","institutionalReviewBoard":"This study has not been submitted to the IRB Board. It is for illustration purposes of StudyU only.","institutionalReviewBoardNumber":"N/A"}', - 'Study: published=true, registry_published=true, participation=open, result_sharing=public', + 'Study: status=running, registry_published=true, participation=open, result_sharing=public', 'This is a Demo Study. This study helps you find out which treatment is more effective for you.', 'accountHeart', - -- published - true, + -- status + 'running', -- registry_published true, '[{"id": "recent_back_pain", "type": "boolean", "prompt": "Have you had back pain in the last 12 weeks?", "rationale": ""}, {"id": "f70386c8-f517-4e62-a5fa-ca4badfd4b60", "type": "boolean", "prompt": "Are you pregnant?", "rationale": ""}, {"id": "afeac253-4bfe-47fe-9384-4236ded1bd50", "type": "choice", "prompt": "Does any of the following apply to you and has not been examined by a doctor yet?", "choices": [{"id": "start_of_symptoms_after_spinal_surgery", "text": "Start of symptoms after spinal surgery"}, {"id": "start_of_symptoms_after_diagnosis_of_cancer", "text": "Start of symptoms after diagnosis of cancer"}, {"id": "unexpected_significant_weight_loss", "text": "Unexpected significant weight loss"}, {"id": "start_of_symptoms_after_trauma", "text": "Start of symptoms after trauma"}, {"id": "accompanying_numbness_of_your_legs", "text": "Accompanying numbness of your legs"}], "multiple": true, "rationale": "This question is asked to ensure that you are not suffering from any critical illness."}]','[{"id": "b47d07d8-eb98-4fce-86ab-945bc7c2f2d0", "condition": {"type": "choice", "target": "recent_back_pain", "choices": [true]}}, {"id": "acb368b0-0ca2-496d-98e1-be9fefbe5e89", "condition": {"type": "choice", "target": "f70386c8-f517-4e62-a5fa-ca4badfd4b60", "choices": [false]}}, {"id": "d7c3445e-b5b1-43d1-93a6-5637e0cfd44f", "condition": {"type": "choice", "target": "afeac253-4bfe-47fe-9384-4236ded1bd50", "choices": []}}]','[{"id": "rate_your_day", "type": "questionnaire", "title": "Rate your day", "footer": "", "header": "", "schedule": {"reminders": ["19:00"], "completionPeriods": [{"id": "50d114f3-e692-4283-9610-17e23edf8f70", "lockTime": "20:00", "unlockTime": "8:00"}]}, "questions": [{"id": "pain", "step": 1, "type": "visualAnalogue", "prompt": "Rate your pain.", "initial": 0, "maximum": 10, "minimum": 0, "maximumColor": 4294901760, "minimumColor": 4294967295, "maximumAnnotation": "Well, guess I die now", "minimumAnnotation": "no pain"}, {"id": "painkillers", "type": "boolean", "prompt": "Have you taken any painkillers in the last 24 hours?"}, {"id": "sleep", "step": 1, "type": "visualAnalogue", "prompt": "Rate your sleep.", "initial": 0, "maximum": 10, "minimum": 0, "maximumColor": 4294901760, "minimumColor": 4294967295, "maximumAnnotation": "terrible", "minimumAnnotation": "no problems"}, {"id": "mood", "step": 1, "type": "annotatedScale", "prompt": "Rate your mood.", "initial": 5, "maximum": 10, "minimum": 0, "annotations": [{"value": 0, "annotation": "☠"}, {"value": 5, "annotation": "😐"}, {"value": 10, "annotation": "😀"}]}]}]','[{"id": "willow_bark_tea", "icon": "coffee", "name": "Willow-Bark tea", "tasks": [{"id": "drink_tea", "type": "checkmark", "title": "Drink a cup of Willow-Bark tea twice a day.", "schedule": {"reminders": ["18:00"], "completionPeriods": [{"id": "54d114f3-e692-4283-9610-17e23edf8f70", "lockTime": "20:00", "unlockTime": "6:00"}]}}], "description": "Willow bark contains powerful anti-inflamatory compunds such as flavonoids and salicin that help relieve the pain."}, {"id": "arnika", "icon": "leaf", "name": "Arnika", "tasks": [{"id": "apply_arnika", "type": "checkmark", "title": "Apply a dime sized amount of Arnica gel to your lower back and massage for 10 mins.", "schedule": {"reminders": ["18:00"], "completionPeriods": [{"id": "55d114f3-e692-4283-9610-17e23edf8f70", "lockTime": "20:00", "unlockTime": "6:00"}]}}], "description": "Arnika gel has been proven to soothe muscle soreness, strain and reduce swelling when rubbed on the affected area."}, {"id": "warming_pad", "icon": "car-seat-heater", "name": "Warming Pad", "tasks": [{"id": "use_pad", "type": "checkmark", "title": "Apply warming pad to your lower back for 5 minutes.", "schedule": {"reminders": ["18:00"], "completionPeriods": [{"id": "56d114f3-e692-4283-9610-17e23edf8f70", "lockTime": "20:00", "unlockTime": "6:00"}]}}], "description": "Applying a warming pad is a quick and easy way to soothe sore muscles and joints."}]','[{"id": "Need", "title": "Why Consent Is Needed", "iconName": "featureSearch", "description": "We need your explicit consent because you are going to enroll to a research study. Therefore, we have to provide you all the information that could potentially have an impact on your decision whether or not you take part in the study. This is study-specific so please go through it carefully. Participation is entirely voluntary."}, {"id": "Risk_benefit", "title": "Risks & Benefits", "iconName": "signCaution", "description": "The main risks to you if you choose to participate are allergic reactions to one of the interventions you are going to apply. If you feel uncomfortable, suffer from itching or rash please pause the study until you have seen a doctor. It is important to know that you may not get any benefit from taking part in this research. Others may not benefit either. However, study results may help you to understand if one of the offered interventions has a positive effect on one of the investigated observations for you."}, {"id": "Data", "title": "Data Handling & Use", "iconName": "databaseExport", "description": "By giving your consent you accept that researchers are allowed to process anonymized data collected from you during this study for research purposes. If you stop being in the research study, already transmitted information may not be removed from the research study database because re-identification is not possible. It will continue to be used to complete the research analysis."}, {"id": "Issues", "title": "Issues to Consider", "iconName": "mapClock", "description": "For being able to use your results for research we need you to actively participate for the indicated minimum study duration. After reaching this you will be able to unlock results but we encourage you to take part at least until you reach the recommended level on the progress bar. Otherwise it might be the case that results can indeed be used for research but are not meaningful for you personally. Note that if you decide to take part in this research study you will be responsible for buying the needed aids."}, {"id": "Rights", "title": "Participant Rights", "iconName": "gavel", "description": "You may stop taking part in this research study at any time without any penalty. If you have any questions, concerns, or complaints at any time about this research, or you think the research has harmed you, please contact the office of the research team. You can find the contact details in your personal study dashboard."}, {"id": "Future", "title": "Future Research", "iconName": "binoculars", "description": "The purpose of this research study is to help you find the most effective supporting agent or behavior. The aim is not to treat your symptom causally. In a broader perspective the purpose of this study is also to get insights which group of persons benefits most from which intervention."}]','{"sequence": "alternating", "phaseDuration": 7, "numberOfCycles": 2, "sequenceCustom": "ABAB", "includeBaseline": true}','{"primary": {"id": "average", "type": "average", "title": "Average", "aggregate": "day", "description": "Average", "resultProperty": {"task": "rate_your_day", "property": "pain"}}, "secondary": []}', @@ -63,7 +63,7 @@ INSERT INTO public.study ( title, description, icon_name, - published, + status, registry_published, questionnaire, eligibility_criteria, @@ -81,11 +81,11 @@ INSERT INTO public.study ( collaborator_emails ) VALUES( '{"email":"example@example.com","phone":"0123456789","website":"https://studyu.health","researchers":"StudyU Researcher","organization":"StudyU","institutionalReviewBoard":"This study has not been submitted to the IRB Board. It is for illustration purposes of StudyU only.","institutionalReviewBoardNumber":"N/A"}', - 'Study: published=true, registry_published=false, participation=open, result_sharing=public', + 'Study: status=running, registry_published=false, participation=open, result_sharing=public', 'This is a Demo Study. This study helps you find out which treatment is more effective for you.', 'accountHeart', - -- published - true, + -- status + 'running', -- registry_published false, '[{"id": "recent_back_pain", "type": "boolean", "prompt": "Have you had back pain in the last 12 weeks?", "rationale": ""}, {"id": "f70386c8-f517-4e62-a5fa-ca4badfd4b60", "type": "boolean", "prompt": "Are you pregnant?", "rationale": ""}, {"id": "afeac253-4bfe-47fe-9384-4236ded1bd50", "type": "choice", "prompt": "Does any of the following apply to you and has not been examined by a doctor yet?", "choices": [{"id": "start_of_symptoms_after_spinal_surgery", "text": "Start of symptoms after spinal surgery"}, {"id": "start_of_symptoms_after_diagnosis_of_cancer", "text": "Start of symptoms after diagnosis of cancer"}, {"id": "unexpected_significant_weight_loss", "text": "Unexpected significant weight loss"}, {"id": "start_of_symptoms_after_trauma", "text": "Start of symptoms after trauma"}, {"id": "accompanying_numbness_of_your_legs", "text": "Accompanying numbness of your legs"}], "multiple": true, "rationale": "This question is asked to ensure that you are not suffering from any critical illness."}]','[{"id": "b47d07d8-eb98-4fce-86ab-945bc7c2f2d0", "condition": {"type": "choice", "target": "recent_back_pain", "choices": [true]}}, {"id": "acb368b0-0ca2-496d-98e1-be9fefbe5e89", "condition": {"type": "choice", "target": "f70386c8-f517-4e62-a5fa-ca4badfd4b60", "choices": [false]}}, {"id": "d7c3445e-b5b1-43d1-93a6-5637e0cfd44f", "condition": {"type": "choice", "target": "afeac253-4bfe-47fe-9384-4236ded1bd50", "choices": []}}]','[{"id": "rate_your_day", "type": "questionnaire", "title": "Rate your day", "footer": "", "header": "", "schedule": {"reminders": ["19:00"], "completionPeriods": [{"id": "50d114f3-e692-4283-9610-17e23edf8f70", "lockTime": "20:00", "unlockTime": "8:00"}]}, "questions": [{"id": "pain", "step": 1, "type": "visualAnalogue", "prompt": "Rate your pain.", "initial": 0, "maximum": 10, "minimum": 0, "maximumColor": 4294901760, "minimumColor": 4294967295, "maximumAnnotation": "Well, guess I die now", "minimumAnnotation": "no pain"}, {"id": "painkillers", "type": "boolean", "prompt": "Have you taken any painkillers in the last 24 hours?"}, {"id": "sleep", "step": 1, "type": "visualAnalogue", "prompt": "Rate your sleep.", "initial": 0, "maximum": 10, "minimum": 0, "maximumColor": 4294901760, "minimumColor": 4294967295, "maximumAnnotation": "terrible", "minimumAnnotation": "no problems"}, {"id": "mood", "step": 1, "type": "annotatedScale", "prompt": "Rate your mood.", "initial": 5, "maximum": 10, "minimum": 0, "annotations": [{"value": 0, "annotation": "☠"}, {"value": 5, "annotation": "😐"}, {"value": 10, "annotation": "😀"}]}]}]','[{"id": "willow_bark_tea", "icon": "coffee", "name": "Willow-Bark tea", "tasks": [{"id": "drink_tea", "type": "checkmark", "title": "Drink a cup of Willow-Bark tea twice a day.", "schedule": {"reminders": ["18:00"], "completionPeriods": [{"id": "54d114f3-e692-4283-9610-17e23edf8f70", "lockTime": "20:00", "unlockTime": "6:00"}]}}], "description": "Willow bark contains powerful anti-inflamatory compunds such as flavonoids and salicin that help relieve the pain."}, {"id": "arnika", "icon": "leaf", "name": "Arnika", "tasks": [{"id": "apply_arnika", "type": "checkmark", "title": "Apply a dime sized amount of Arnica gel to your lower back and massage for 10 mins.", "schedule": {"reminders": ["18:00"], "completionPeriods": [{"id": "55d114f3-e692-4283-9610-17e23edf8f70", "lockTime": "20:00", "unlockTime": "6:00"}]}}], "description": "Arnika gel has been proven to soothe muscle soreness, strain and reduce swelling when rubbed on the affected area."}, {"id": "warming_pad", "icon": "car-seat-heater", "name": "Warming Pad", "tasks": [{"id": "use_pad", "type": "checkmark", "title": "Apply warming pad to your lower back for 5 minutes.", "schedule": {"reminders": ["18:00"], "completionPeriods": [{"id": "56d114f3-e692-4283-9610-17e23edf8f70", "lockTime": "20:00", "unlockTime": "6:00"}]}}], "description": "Applying a warming pad is a quick and easy way to soothe sore muscles and joints."}]','[{"id": "Need", "title": "Why Consent Is Needed", "iconName": "featureSearch", "description": "We need your explicit consent because you are going to enroll to a research study. Therefore, we have to provide you all the information that could potentially have an impact on your decision whether or not you take part in the study. This is study-specific so please go through it carefully. Participation is entirely voluntary."}, {"id": "Risk_benefit", "title": "Risks & Benefits", "iconName": "signCaution", "description": "The main risks to you if you choose to participate are allergic reactions to one of the interventions you are going to apply. If you feel uncomfortable, suffer from itching or rash please pause the study until you have seen a doctor. It is important to know that you may not get any benefit from taking part in this research. Others may not benefit either. However, study results may help you to understand if one of the offered interventions has a positive effect on one of the investigated observations for you."}, {"id": "Data", "title": "Data Handling & Use", "iconName": "databaseExport", "description": "By giving your consent you accept that researchers are allowed to process anonymized data collected from you during this study for research purposes. If you stop being in the research study, already transmitted information may not be removed from the research study database because re-identification is not possible. It will continue to be used to complete the research analysis."}, {"id": "Issues", "title": "Issues to Consider", "iconName": "mapClock", "description": "For being able to use your results for research we need you to actively participate for the indicated minimum study duration. After reaching this you will be able to unlock results but we encourage you to take part at least until you reach the recommended level on the progress bar. Otherwise it might be the case that results can indeed be used for research but are not meaningful for you personally. Note that if you decide to take part in this research study you will be responsible for buying the needed aids."}, {"id": "Rights", "title": "Participant Rights", "iconName": "gavel", "description": "You may stop taking part in this research study at any time without any penalty. If you have any questions, concerns, or complaints at any time about this research, or you think the research has harmed you, please contact the office of the research team. You can find the contact details in your personal study dashboard."}, {"id": "Future", "title": "Future Research", "iconName": "binoculars", "description": "The purpose of this research study is to help you find the most effective supporting agent or behavior. The aim is not to treat your symptom causally. In a broader perspective the purpose of this study is also to get insights which group of persons benefits most from which intervention."}]','{"sequence": "alternating", "phaseDuration": 7, "numberOfCycles": 2, "sequenceCustom": "ABAB", "includeBaseline": true}','{"primary": {"id": "average", "type": "average", "title": "Average", "aggregate": "day", "description": "Average", "resultProperty": {"task": "rate_your_day", "property": "pain"}}, "secondary": []}', @@ -106,7 +106,7 @@ INSERT INTO public.study ( title, description, icon_name, - published, + status, registry_published, questionnaire, eligibility_criteria, @@ -124,11 +124,11 @@ INSERT INTO public.study ( collaborator_emails ) VALUES( '{"email":"example@example.com","phone":"0123456789","website":"https://studyu.health","researchers":"StudyU Researcher","organization":"StudyU","institutionalReviewBoard":"This study has not been submitted to the IRB Board. It is for illustration purposes of StudyU only.","institutionalReviewBoardNumber":"N/A"}', - 'Study: published=true, registry_published=false, participation=invite, result_sharing=public', + 'Study: status=running, registry_published=false, participation=invite, result_sharing=public', 'This is a Demo Study. This study helps you find out which treatment is more effective for you.', 'accountHeart', - -- published - true, + -- status + 'running', -- registry_published false, '[{"id": "recent_back_pain", "type": "boolean", "prompt": "Have you had back pain in the last 12 weeks?", "rationale": ""}, {"id": "f70386c8-f517-4e62-a5fa-ca4badfd4b60", "type": "boolean", "prompt": "Are you pregnant?", "rationale": ""}, {"id": "afeac253-4bfe-47fe-9384-4236ded1bd50", "type": "choice", "prompt": "Does any of the following apply to you and has not been examined by a doctor yet?", "choices": [{"id": "start_of_symptoms_after_spinal_surgery", "text": "Start of symptoms after spinal surgery"}, {"id": "start_of_symptoms_after_diagnosis_of_cancer", "text": "Start of symptoms after diagnosis of cancer"}, {"id": "unexpected_significant_weight_loss", "text": "Unexpected significant weight loss"}, {"id": "start_of_symptoms_after_trauma", "text": "Start of symptoms after trauma"}, {"id": "accompanying_numbness_of_your_legs", "text": "Accompanying numbness of your legs"}], "multiple": true, "rationale": "This question is asked to ensure that you are not suffering from any critical illness."}]','[{"id": "b47d07d8-eb98-4fce-86ab-945bc7c2f2d0", "condition": {"type": "choice", "target": "recent_back_pain", "choices": [true]}}, {"id": "acb368b0-0ca2-496d-98e1-be9fefbe5e89", "condition": {"type": "choice", "target": "f70386c8-f517-4e62-a5fa-ca4badfd4b60", "choices": [false]}}, {"id": "d7c3445e-b5b1-43d1-93a6-5637e0cfd44f", "condition": {"type": "choice", "target": "afeac253-4bfe-47fe-9384-4236ded1bd50", "choices": []}}]','[{"id": "rate_your_day", "type": "questionnaire", "title": "Rate your day", "footer": "", "header": "", "schedule": {"reminders": ["19:00"], "completionPeriods": [{"id": "50d114f3-e692-4283-9610-17e23edf8f70", "lockTime": "20:00", "unlockTime": "8:00"}]}, "questions": [{"id": "pain", "step": 1, "type": "visualAnalogue", "prompt": "Rate your pain.", "initial": 0, "maximum": 10, "minimum": 0, "maximumColor": 4294901760, "minimumColor": 4294967295, "maximumAnnotation": "Well, guess I die now", "minimumAnnotation": "no pain"}, {"id": "painkillers", "type": "boolean", "prompt": "Have you taken any painkillers in the last 24 hours?"}, {"id": "sleep", "step": 1, "type": "visualAnalogue", "prompt": "Rate your sleep.", "initial": 0, "maximum": 10, "minimum": 0, "maximumColor": 4294901760, "minimumColor": 4294967295, "maximumAnnotation": "terrible", "minimumAnnotation": "no problems"}, {"id": "mood", "step": 1, "type": "annotatedScale", "prompt": "Rate your mood.", "initial": 5, "maximum": 10, "minimum": 0, "annotations": [{"value": 0, "annotation": "☠"}, {"value": 5, "annotation": "😐"}, {"value": 10, "annotation": "😀"}]}]}]','[{"id": "willow_bark_tea", "icon": "coffee", "name": "Willow-Bark tea", "tasks": [{"id": "drink_tea", "type": "checkmark", "title": "Drink a cup of Willow-Bark tea twice a day.", "schedule": {"reminders": ["18:00"], "completionPeriods": [{"id": "54d114f3-e692-4283-9610-17e23edf8f70", "lockTime": "20:00", "unlockTime": "6:00"}]}}], "description": "Willow bark contains powerful anti-inflamatory compunds such as flavonoids and salicin that help relieve the pain."}, {"id": "arnika", "icon": "leaf", "name": "Arnika", "tasks": [{"id": "apply_arnika", "type": "checkmark", "title": "Apply a dime sized amount of Arnica gel to your lower back and massage for 10 mins.", "schedule": {"reminders": ["18:00"], "completionPeriods": [{"id": "55d114f3-e692-4283-9610-17e23edf8f70", "lockTime": "20:00", "unlockTime": "6:00"}]}}], "description": "Arnika gel has been proven to soothe muscle soreness, strain and reduce swelling when rubbed on the affected area."}, {"id": "warming_pad", "icon": "car-seat-heater", "name": "Warming Pad", "tasks": [{"id": "use_pad", "type": "checkmark", "title": "Apply warming pad to your lower back for 5 minutes.", "schedule": {"reminders": ["18:00"], "completionPeriods": [{"id": "56d114f3-e692-4283-9610-17e23edf8f70", "lockTime": "20:00", "unlockTime": "6:00"}]}}], "description": "Applying a warming pad is a quick and easy way to soothe sore muscles and joints."}]','[{"id": "Need", "title": "Why Consent Is Needed", "iconName": "featureSearch", "description": "We need your explicit consent because you are going to enroll to a research study. Therefore, we have to provide you all the information that could potentially have an impact on your decision whether or not you take part in the study. This is study-specific so please go through it carefully. Participation is entirely voluntary."}, {"id": "Risk_benefit", "title": "Risks & Benefits", "iconName": "signCaution", "description": "The main risks to you if you choose to participate are allergic reactions to one of the interventions you are going to apply. If you feel uncomfortable, suffer from itching or rash please pause the study until you have seen a doctor. It is important to know that you may not get any benefit from taking part in this research. Others may not benefit either. However, study results may help you to understand if one of the offered interventions has a positive effect on one of the investigated observations for you."}, {"id": "Data", "title": "Data Handling & Use", "iconName": "databaseExport", "description": "By giving your consent you accept that researchers are allowed to process anonymized data collected from you during this study for research purposes. If you stop being in the research study, already transmitted information may not be removed from the research study database because re-identification is not possible. It will continue to be used to complete the research analysis."}, {"id": "Issues", "title": "Issues to Consider", "iconName": "mapClock", "description": "For being able to use your results for research we need you to actively participate for the indicated minimum study duration. After reaching this you will be able to unlock results but we encourage you to take part at least until you reach the recommended level on the progress bar. Otherwise it might be the case that results can indeed be used for research but are not meaningful for you personally. Note that if you decide to take part in this research study you will be responsible for buying the needed aids."}, {"id": "Rights", "title": "Participant Rights", "iconName": "gavel", "description": "You may stop taking part in this research study at any time without any penalty. If you have any questions, concerns, or complaints at any time about this research, or you think the research has harmed you, please contact the office of the research team. You can find the contact details in your personal study dashboard."}, {"id": "Future", "title": "Future Research", "iconName": "binoculars", "description": "The purpose of this research study is to help you find the most effective supporting agent or behavior. The aim is not to treat your symptom causally. In a broader perspective the purpose of this study is also to get insights which group of persons benefits most from which intervention."}]','{"sequence": "alternating", "phaseDuration": 7, "numberOfCycles": 2, "sequenceCustom": "ABAB", "includeBaseline": true}','{"primary": {"id": "average", "type": "average", "title": "Average", "aggregate": "day", "description": "Average", "resultProperty": {"task": "rate_your_day", "property": "pain"}}, "secondary": []}', @@ -150,7 +150,7 @@ INSERT INTO public.study ( title, description, icon_name, - published, + status, registry_published, questionnaire, eligibility_criteria, @@ -168,11 +168,11 @@ INSERT INTO public.study ( collaborator_emails ) VALUES( '{"email":"example@example.com","phone":"0123456789","website":"https://studyu.health","researchers":"StudyU Researcher","organization":"StudyU","institutionalReviewBoard":"This study has not been submitted to the IRB Board. It is for illustration purposes of StudyU only.","institutionalReviewBoardNumber":"N/A"}', - 'Study: published=true, registry_published=false, participation=invite, result_sharing=private', + 'Study: status=running, registry_published=false, participation=invite, result_sharing=private', 'This is a Demo Study. This study helps you find out which treatment is more effective for you.', 'accountHeart', - -- published - true, + -- status + 'running', -- registry_published false, '[{"id": "recent_back_pain", "type": "boolean", "prompt": "Have you had back pain in the last 12 weeks?", "rationale": ""}, {"id": "f70386c8-f517-4e62-a5fa-ca4badfd4b60", "type": "boolean", "prompt": "Are you pregnant?", "rationale": ""}, {"id": "afeac253-4bfe-47fe-9384-4236ded1bd50", "type": "choice", "prompt": "Does any of the following apply to you and has not been examined by a doctor yet?", "choices": [{"id": "start_of_symptoms_after_spinal_surgery", "text": "Start of symptoms after spinal surgery"}, {"id": "start_of_symptoms_after_diagnosis_of_cancer", "text": "Start of symptoms after diagnosis of cancer"}, {"id": "unexpected_significant_weight_loss", "text": "Unexpected significant weight loss"}, {"id": "start_of_symptoms_after_trauma", "text": "Start of symptoms after trauma"}, {"id": "accompanying_numbness_of_your_legs", "text": "Accompanying numbness of your legs"}], "multiple": true, "rationale": "This question is asked to ensure that you are not suffering from any critical illness."}]','[{"id": "b47d07d8-eb98-4fce-86ab-945bc7c2f2d0", "condition": {"type": "choice", "target": "recent_back_pain", "choices": [true]}}, {"id": "acb368b0-0ca2-496d-98e1-be9fefbe5e89", "condition": {"type": "choice", "target": "f70386c8-f517-4e62-a5fa-ca4badfd4b60", "choices": [false]}}, {"id": "d7c3445e-b5b1-43d1-93a6-5637e0cfd44f", "condition": {"type": "choice", "target": "afeac253-4bfe-47fe-9384-4236ded1bd50", "choices": []}}]','[{"id": "rate_your_day", "type": "questionnaire", "title": "Rate your day", "footer": "", "header": "", "schedule": {"reminders": ["19:00"], "completionPeriods": [{"id": "50d114f3-e692-4283-9610-17e23edf8f70", "lockTime": "20:00", "unlockTime": "8:00"}]}, "questions": [{"id": "pain", "step": 1, "type": "visualAnalogue", "prompt": "Rate your pain.", "initial": 0, "maximum": 10, "minimum": 0, "maximumColor": 4294901760, "minimumColor": 4294967295, "maximumAnnotation": "Well, guess I die now", "minimumAnnotation": "no pain"}, {"id": "painkillers", "type": "boolean", "prompt": "Have you taken any painkillers in the last 24 hours?"}, {"id": "sleep", "step": 1, "type": "visualAnalogue", "prompt": "Rate your sleep.", "initial": 0, "maximum": 10, "minimum": 0, "maximumColor": 4294901760, "minimumColor": 4294967295, "maximumAnnotation": "terrible", "minimumAnnotation": "no problems"}, {"id": "mood", "step": 1, "type": "annotatedScale", "prompt": "Rate your mood.", "initial": 5, "maximum": 10, "minimum": 0, "annotations": [{"value": 0, "annotation": "☠"}, {"value": 5, "annotation": "😐"}, {"value": 10, "annotation": "😀"}]}]}]','[{"id": "willow_bark_tea", "icon": "coffee", "name": "Willow-Bark tea", "tasks": [{"id": "drink_tea", "type": "checkmark", "title": "Drink a cup of Willow-Bark tea twice a day.", "schedule": {"reminders": ["18:00"], "completionPeriods": [{"id": "54d114f3-e692-4283-9610-17e23edf8f70", "lockTime": "20:00", "unlockTime": "6:00"}]}}], "description": "Willow bark contains powerful anti-inflamatory compunds such as flavonoids and salicin that help relieve the pain."}, {"id": "arnika", "icon": "leaf", "name": "Arnika", "tasks": [{"id": "apply_arnika", "type": "checkmark", "title": "Apply a dime sized amount of Arnica gel to your lower back and massage for 10 mins.", "schedule": {"reminders": ["18:00"], "completionPeriods": [{"id": "55d114f3-e692-4283-9610-17e23edf8f70", "lockTime": "20:00", "unlockTime": "6:00"}]}}], "description": "Arnika gel has been proven to soothe muscle soreness, strain and reduce swelling when rubbed on the affected area."}, {"id": "warming_pad", "icon": "car-seat-heater", "name": "Warming Pad", "tasks": [{"id": "use_pad", "type": "checkmark", "title": "Apply warming pad to your lower back for 5 minutes.", "schedule": {"reminders": ["18:00"], "completionPeriods": [{"id": "56d114f3-e692-4283-9610-17e23edf8f70", "lockTime": "20:00", "unlockTime": "6:00"}]}}], "description": "Applying a warming pad is a quick and easy way to soothe sore muscles and joints."}]','[{"id": "Need", "title": "Why Consent Is Needed", "iconName": "featureSearch", "description": "We need your explicit consent because you are going to enroll to a research study. Therefore, we have to provide you all the information that could potentially have an impact on your decision whether or not you take part in the study. This is study-specific so please go through it carefully. Participation is entirely voluntary."}, {"id": "Risk_benefit", "title": "Risks & Benefits", "iconName": "signCaution", "description": "The main risks to you if you choose to participate are allergic reactions to one of the interventions you are going to apply. If you feel uncomfortable, suffer from itching or rash please pause the study until you have seen a doctor. It is important to know that you may not get any benefit from taking part in this research. Others may not benefit either. However, study results may help you to understand if one of the offered interventions has a positive effect on one of the investigated observations for you."}, {"id": "Data", "title": "Data Handling & Use", "iconName": "databaseExport", "description": "By giving your consent you accept that researchers are allowed to process anonymized data collected from you during this study for research purposes. If you stop being in the research study, already transmitted information may not be removed from the research study database because re-identification is not possible. It will continue to be used to complete the research analysis."}, {"id": "Issues", "title": "Issues to Consider", "iconName": "mapClock", "description": "For being able to use your results for research we need you to actively participate for the indicated minimum study duration. After reaching this you will be able to unlock results but we encourage you to take part at least until you reach the recommended level on the progress bar. Otherwise it might be the case that results can indeed be used for research but are not meaningful for you personally. Note that if you decide to take part in this research study you will be responsible for buying the needed aids."}, {"id": "Rights", "title": "Participant Rights", "iconName": "gavel", "description": "You may stop taking part in this research study at any time without any penalty. If you have any questions, concerns, or complaints at any time about this research, or you think the research has harmed you, please contact the office of the research team. You can find the contact details in your personal study dashboard."}, {"id": "Future", "title": "Future Research", "iconName": "binoculars", "description": "The purpose of this research study is to help you find the most effective supporting agent or behavior. The aim is not to treat your symptom causally. In a broader perspective the purpose of this study is also to get insights which group of persons benefits most from which intervention."}]','{"sequence": "alternating", "phaseDuration": 7, "numberOfCycles": 2, "sequenceCustom": "ABAB", "includeBaseline": true}','{"primary": {"id": "average", "type": "average", "title": "Average", "aggregate": "day", "description": "Average", "resultProperty": {"task": "rate_your_day", "property": "pain"}}, "secondary": []}', @@ -198,7 +198,7 @@ INSERT INTO public.study ( title, description, icon_name, - published, + status, registry_published, questionnaire, eligibility_criteria, @@ -216,11 +216,11 @@ INSERT INTO public.study ( collaborator_emails ) VALUES( '{"email":"example@example.com","phone":"0123456789","website":"https://studyu.health","researchers":"StudyU Researcher","organization":"StudyU","institutionalReviewBoard":"This study has not been submitted to the IRB Board. It is for illustration purposes of StudyU only.","institutionalReviewBoardNumber":"N/A"}', - 'Study: published=false, registry_published=true, participation=open, result_sharing=public', + 'Study: status=draft, registry_published=true, participation=open, result_sharing=public', 'This is a Demo Study. This study helps you find out which treatment is more effective for you.', 'accountHeart', - -- published - false, + -- status + 'draft', -- registry_published true, '[{"id": "recent_back_pain", "type": "boolean", "prompt": "Have you had back pain in the last 12 weeks?", "rationale": ""}, {"id": "f70386c8-f517-4e62-a5fa-ca4badfd4b60", "type": "boolean", "prompt": "Are you pregnant?", "rationale": ""}, {"id": "afeac253-4bfe-47fe-9384-4236ded1bd50", "type": "choice", "prompt": "Does any of the following apply to you and has not been examined by a doctor yet?", "choices": [{"id": "start_of_symptoms_after_spinal_surgery", "text": "Start of symptoms after spinal surgery"}, {"id": "start_of_symptoms_after_diagnosis_of_cancer", "text": "Start of symptoms after diagnosis of cancer"}, {"id": "unexpected_significant_weight_loss", "text": "Unexpected significant weight loss"}, {"id": "start_of_symptoms_after_trauma", "text": "Start of symptoms after trauma"}, {"id": "accompanying_numbness_of_your_legs", "text": "Accompanying numbness of your legs"}], "multiple": true, "rationale": "This question is asked to ensure that you are not suffering from any critical illness."}]','[{"id": "b47d07d8-eb98-4fce-86ab-945bc7c2f2d0", "condition": {"type": "choice", "target": "recent_back_pain", "choices": [true]}}, {"id": "acb368b0-0ca2-496d-98e1-be9fefbe5e89", "condition": {"type": "choice", "target": "f70386c8-f517-4e62-a5fa-ca4badfd4b60", "choices": [false]}}, {"id": "d7c3445e-b5b1-43d1-93a6-5637e0cfd44f", "condition": {"type": "choice", "target": "afeac253-4bfe-47fe-9384-4236ded1bd50", "choices": []}}]','[{"id": "rate_your_day", "type": "questionnaire", "title": "Rate your day", "footer": "", "header": "", "schedule": {"reminders": ["19:00"], "completionPeriods": [{"id": "50d114f3-e692-4283-9610-17e23edf8f70", "lockTime": "20:00", "unlockTime": "8:00"}]}, "questions": [{"id": "pain", "step": 1, "type": "visualAnalogue", "prompt": "Rate your pain.", "initial": 0, "maximum": 10, "minimum": 0, "maximumColor": 4294901760, "minimumColor": 4294967295, "maximumAnnotation": "Well, guess I die now", "minimumAnnotation": "no pain"}, {"id": "painkillers", "type": "boolean", "prompt": "Have you taken any painkillers in the last 24 hours?"}, {"id": "sleep", "step": 1, "type": "visualAnalogue", "prompt": "Rate your sleep.", "initial": 0, "maximum": 10, "minimum": 0, "maximumColor": 4294901760, "minimumColor": 4294967295, "maximumAnnotation": "terrible", "minimumAnnotation": "no problems"}, {"id": "mood", "step": 1, "type": "annotatedScale", "prompt": "Rate your mood.", "initial": 5, "maximum": 10, "minimum": 0, "annotations": [{"value": 0, "annotation": "☠"}, {"value": 5, "annotation": "😐"}, {"value": 10, "annotation": "😀"}]}]}]','[{"id": "willow_bark_tea", "icon": "coffee", "name": "Willow-Bark tea", "tasks": [{"id": "drink_tea", "type": "checkmark", "title": "Drink a cup of Willow-Bark tea twice a day.", "schedule": {"reminders": ["18:00"], "completionPeriods": [{"id": "54d114f3-e692-4283-9610-17e23edf8f70", "lockTime": "20:00", "unlockTime": "6:00"}]}}], "description": "Willow bark contains powerful anti-inflamatory compunds such as flavonoids and salicin that help relieve the pain."}, {"id": "arnika", "icon": "leaf", "name": "Arnika", "tasks": [{"id": "apply_arnika", "type": "checkmark", "title": "Apply a dime sized amount of Arnica gel to your lower back and massage for 10 mins.", "schedule": {"reminders": ["18:00"], "completionPeriods": [{"id": "55d114f3-e692-4283-9610-17e23edf8f70", "lockTime": "20:00", "unlockTime": "6:00"}]}}], "description": "Arnika gel has been proven to soothe muscle soreness, strain and reduce swelling when rubbed on the affected area."}, {"id": "warming_pad", "icon": "car-seat-heater", "name": "Warming Pad", "tasks": [{"id": "use_pad", "type": "checkmark", "title": "Apply warming pad to your lower back for 5 minutes.", "schedule": {"reminders": ["18:00"], "completionPeriods": [{"id": "56d114f3-e692-4283-9610-17e23edf8f70", "lockTime": "20:00", "unlockTime": "6:00"}]}}], "description": "Applying a warming pad is a quick and easy way to soothe sore muscles and joints."}]','[{"id": "Need", "title": "Why Consent Is Needed", "iconName": "featureSearch", "description": "We need your explicit consent because you are going to enroll to a research study. Therefore, we have to provide you all the information that could potentially have an impact on your decision whether or not you take part in the study. This is study-specific so please go through it carefully. Participation is entirely voluntary."}, {"id": "Risk_benefit", "title": "Risks & Benefits", "iconName": "signCaution", "description": "The main risks to you if you choose to participate are allergic reactions to one of the interventions you are going to apply. If you feel uncomfortable, suffer from itching or rash please pause the study until you have seen a doctor. It is important to know that you may not get any benefit from taking part in this research. Others may not benefit either. However, study results may help you to understand if one of the offered interventions has a positive effect on one of the investigated observations for you."}, {"id": "Data", "title": "Data Handling & Use", "iconName": "databaseExport", "description": "By giving your consent you accept that researchers are allowed to process anonymized data collected from you during this study for research purposes. If you stop being in the research study, already transmitted information may not be removed from the research study database because re-identification is not possible. It will continue to be used to complete the research analysis."}, {"id": "Issues", "title": "Issues to Consider", "iconName": "mapClock", "description": "For being able to use your results for research we need you to actively participate for the indicated minimum study duration. After reaching this you will be able to unlock results but we encourage you to take part at least until you reach the recommended level on the progress bar. Otherwise it might be the case that results can indeed be used for research but are not meaningful for you personally. Note that if you decide to take part in this research study you will be responsible for buying the needed aids."}, {"id": "Rights", "title": "Participant Rights", "iconName": "gavel", "description": "You may stop taking part in this research study at any time without any penalty. If you have any questions, concerns, or complaints at any time about this research, or you think the research has harmed you, please contact the office of the research team. You can find the contact details in your personal study dashboard."}, {"id": "Future", "title": "Future Research", "iconName": "binoculars", "description": "The purpose of this research study is to help you find the most effective supporting agent or behavior. The aim is not to treat your symptom causally. In a broader perspective the purpose of this study is also to get insights which group of persons benefits most from which intervention."}]','{"sequence": "alternating", "phaseDuration": 7, "numberOfCycles": 2, "sequenceCustom": "ABAB", "includeBaseline": true}','{"primary": {"id": "average", "type": "average", "title": "Average", "aggregate": "day", "description": "Average", "resultProperty": {"task": "rate_your_day", "property": "pain"}}, "secondary": []}', @@ -241,7 +241,7 @@ INSERT INTO public.study ( title, description, icon_name, - published, + status, registry_published, questionnaire, eligibility_criteria, @@ -259,11 +259,11 @@ INSERT INTO public.study ( collaborator_emails ) VALUES( '{"email":"example@example.com","phone":"0123456789","website":"https://studyu.health","researchers":"StudyU Researcher","organization":"StudyU","institutionalReviewBoard":"This study has not been submitted to the IRB Board. It is for illustration purposes of StudyU only.","institutionalReviewBoardNumber":"N/A"}', - 'Study: published=false, registry_published=false, participation=invite, result_sharing=private', + 'Study: status=draft, registry_published=false, participation=invite, result_sharing=private', 'This is a Demo Study. This study helps you find out which treatment is more effective for you.', 'accountHeart', - -- published - false, + -- status + 'draft', -- registry_published false, '[{"id": "recent_back_pain", "type": "boolean", "prompt": "Have you had back pain in the last 12 weeks?", "rationale": ""}, {"id": "f70386c8-f517-4e62-a5fa-ca4badfd4b60", "type": "boolean", "prompt": "Are you pregnant?", "rationale": ""}, {"id": "afeac253-4bfe-47fe-9384-4236ded1bd50", "type": "choice", "prompt": "Does any of the following apply to you and has not been examined by a doctor yet?", "choices": [{"id": "start_of_symptoms_after_spinal_surgery", "text": "Start of symptoms after spinal surgery"}, {"id": "start_of_symptoms_after_diagnosis_of_cancer", "text": "Start of symptoms after diagnosis of cancer"}, {"id": "unexpected_significant_weight_loss", "text": "Unexpected significant weight loss"}, {"id": "start_of_symptoms_after_trauma", "text": "Start of symptoms after trauma"}, {"id": "accompanying_numbness_of_your_legs", "text": "Accompanying numbness of your legs"}], "multiple": true, "rationale": "This question is asked to ensure that you are not suffering from any critical illness."}]','[{"id": "b47d07d8-eb98-4fce-86ab-945bc7c2f2d0", "condition": {"type": "choice", "target": "recent_back_pain", "choices": [true]}}, {"id": "acb368b0-0ca2-496d-98e1-be9fefbe5e89", "condition": {"type": "choice", "target": "f70386c8-f517-4e62-a5fa-ca4badfd4b60", "choices": [false]}}, {"id": "d7c3445e-b5b1-43d1-93a6-5637e0cfd44f", "condition": {"type": "choice", "target": "afeac253-4bfe-47fe-9384-4236ded1bd50", "choices": []}}]','[{"id": "rate_your_day", "type": "questionnaire", "title": "Rate your day", "footer": "", "header": "", "schedule": {"reminders": ["19:00"], "completionPeriods": [{"id": "50d114f3-e692-4283-9610-17e23edf8f70", "lockTime": "20:00", "unlockTime": "8:00"}]}, "questions": [{"id": "pain", "step": 1, "type": "visualAnalogue", "prompt": "Rate your pain.", "initial": 0, "maximum": 10, "minimum": 0, "maximumColor": 4294901760, "minimumColor": 4294967295, "maximumAnnotation": "Well, guess I die now", "minimumAnnotation": "no pain"}, {"id": "painkillers", "type": "boolean", "prompt": "Have you taken any painkillers in the last 24 hours?"}, {"id": "sleep", "step": 1, "type": "visualAnalogue", "prompt": "Rate your sleep.", "initial": 0, "maximum": 10, "minimum": 0, "maximumColor": 4294901760, "minimumColor": 4294967295, "maximumAnnotation": "terrible", "minimumAnnotation": "no problems"}, {"id": "mood", "step": 1, "type": "annotatedScale", "prompt": "Rate your mood.", "initial": 5, "maximum": 10, "minimum": 0, "annotations": [{"value": 0, "annotation": "☠"}, {"value": 5, "annotation": "😐"}, {"value": 10, "annotation": "😀"}]}]}]','[{"id": "willow_bark_tea", "icon": "coffee", "name": "Willow-Bark tea", "tasks": [{"id": "drink_tea", "type": "checkmark", "title": "Drink a cup of Willow-Bark tea twice a day.", "schedule": {"reminders": ["18:00"], "completionPeriods": [{"id": "54d114f3-e692-4283-9610-17e23edf8f70", "lockTime": "20:00", "unlockTime": "6:00"}]}}], "description": "Willow bark contains powerful anti-inflamatory compunds such as flavonoids and salicin that help relieve the pain."}, {"id": "arnika", "icon": "leaf", "name": "Arnika", "tasks": [{"id": "apply_arnika", "type": "checkmark", "title": "Apply a dime sized amount of Arnica gel to your lower back and massage for 10 mins.", "schedule": {"reminders": ["18:00"], "completionPeriods": [{"id": "55d114f3-e692-4283-9610-17e23edf8f70", "lockTime": "20:00", "unlockTime": "6:00"}]}}], "description": "Arnika gel has been proven to soothe muscle soreness, strain and reduce swelling when rubbed on the affected area."}, {"id": "warming_pad", "icon": "car-seat-heater", "name": "Warming Pad", "tasks": [{"id": "use_pad", "type": "checkmark", "title": "Apply warming pad to your lower back for 5 minutes.", "schedule": {"reminders": ["18:00"], "completionPeriods": [{"id": "56d114f3-e692-4283-9610-17e23edf8f70", "lockTime": "20:00", "unlockTime": "6:00"}]}}], "description": "Applying a warming pad is a quick and easy way to soothe sore muscles and joints."}]','[{"id": "Need", "title": "Why Consent Is Needed", "iconName": "featureSearch", "description": "We need your explicit consent because you are going to enroll to a research study. Therefore, we have to provide you all the information that could potentially have an impact on your decision whether or not you take part in the study. This is study-specific so please go through it carefully. Participation is entirely voluntary."}, {"id": "Risk_benefit", "title": "Risks & Benefits", "iconName": "signCaution", "description": "The main risks to you if you choose to participate are allergic reactions to one of the interventions you are going to apply. If you feel uncomfortable, suffer from itching or rash please pause the study until you have seen a doctor. It is important to know that you may not get any benefit from taking part in this research. Others may not benefit either. However, study results may help you to understand if one of the offered interventions has a positive effect on one of the investigated observations for you."}, {"id": "Data", "title": "Data Handling & Use", "iconName": "databaseExport", "description": "By giving your consent you accept that researchers are allowed to process anonymized data collected from you during this study for research purposes. If you stop being in the research study, already transmitted information may not be removed from the research study database because re-identification is not possible. It will continue to be used to complete the research analysis."}, {"id": "Issues", "title": "Issues to Consider", "iconName": "mapClock", "description": "For being able to use your results for research we need you to actively participate for the indicated minimum study duration. After reaching this you will be able to unlock results but we encourage you to take part at least until you reach the recommended level on the progress bar. Otherwise it might be the case that results can indeed be used for research but are not meaningful for you personally. Note that if you decide to take part in this research study you will be responsible for buying the needed aids."}, {"id": "Rights", "title": "Participant Rights", "iconName": "gavel", "description": "You may stop taking part in this research study at any time without any penalty. If you have any questions, concerns, or complaints at any time about this research, or you think the research has harmed you, please contact the office of the research team. You can find the contact details in your personal study dashboard."}, {"id": "Future", "title": "Future Research", "iconName": "binoculars", "description": "The purpose of this research study is to help you find the most effective supporting agent or behavior. The aim is not to treat your symptom causally. In a broader perspective the purpose of this study is also to get insights which group of persons benefits most from which intervention."}]','{"sequence": "alternating", "phaseDuration": 7, "numberOfCycles": 2, "sequenceCustom": "ABAB", "includeBaseline": true}','{"primary": {"id": "average", "type": "average", "title": "Average", "aggregate": "day", "description": "Average", "resultProperty": {"task": "rate_your_day", "property": "pain"}}, "secondary": []}', @@ -299,7 +299,7 @@ SELECT is(count(*)::int, 3, 'Check if users were created and can be accessed') F SELECT tests.clear_authentication(); SELECT is(count(*)::int, 0, 'Check if users cannot be accessed anonymously') FROM public.user; -SELECT is(published, true, 'Check if all anonymously accessed studies are published') FROM public.study; +SELECT is(status, 'running', 'Check if all anonymously accessed studies are running') FROM public.study; -- CREATOR 1 TESTS @@ -315,12 +315,12 @@ SELECT is(email, 'test_creator_2@studyu.health', 'Check if a user can only retri SELECT tests.authenticate_as('test_consumer'); --- test specific: all published studies are created by test_creator_1 -SELECT is(user_id, (tests.get_supabase_user('test_creator_1') ->> 'id')::uuid, 'All published studies are created by test_creator_1') FROM public.study; +-- test specific: all running studies are created by test_creator_1 +SELECT is(user_id, (tests.get_supabase_user('test_creator_1') ->> 'id')::uuid, 'All running studies are created by test_creator_1') FROM public.study; SELECT is(count(*)::int, 3, 'Verify number of accessible studies') FROM public.study; --- check if the consumer can only access designated published studies -SELECT is(published, true, 'Check if test_consumer can only access studies that are published') FROM public.study; +-- check if the consumer can only access designated running studies +SELECT is(status, 'running', 'Check if test_consumer can only access studies that are running') FROM public.study; SELECT tests.is_either_true( 'Check if test_consumer can only retrieve designated studies', tests.is_equal(registry_published, true), From 7c5b8aeebb08f1a14c1ca9f591ba18899347589d Mon Sep 17 00:00:00 2001 From: Johannes Vedder Date: Tue, 11 Jun 2024 18:54:11 +0200 Subject: [PATCH 151/314] tests: fix workflow trigger --- .github/workflows/supabase-test.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/supabase-test.yml b/.github/workflows/supabase-test.yml index 54eccfa7a..1635a5d56 100644 --- a/.github/workflows/supabase-test.yml +++ b/.github/workflows/supabase-test.yml @@ -2,8 +2,9 @@ name: Test Supabase on: push: paths: - - ".github/workflows/supabase-test.yml" - "database/**" + - "supabase/**" + - ".github/workflows/supabase-test.yml" workflow_dispatch: jobs: From 6824d841f791e013d64feed311a11bc2eb6bea65 Mon Sep 17 00:00:00 2001 From: Md Raju Ahmed Date: Tue, 11 Jun 2024 23:49:57 +0200 Subject: [PATCH 152/314] chore: Updated dropout logic documentation --- designer_v2/lib/domain/study_monitoring.dart | 1 + 1 file changed, 1 insertion(+) diff --git a/designer_v2/lib/domain/study_monitoring.dart b/designer_v2/lib/domain/study_monitoring.dart index d9dc4531a..7750c0334 100644 --- a/designer_v2/lib/domain/study_monitoring.dart +++ b/designer_v2/lib/domain/study_monitoring.dart @@ -10,6 +10,7 @@ class StudyMonitorData { /// Number of participants who dropped out of the study before the study ended /// Hint: The is_deleted flag in the study_subject database table marks a participant as dropped out + /// Note: If the participant's last activity exceeds 7 days, they will also be counted as a dropout final int dropoutParticipants; /// Number of participants who completed the study From d101225d7fb025ece5e66fe79b912723a70a5a84 Mon Sep 17 00:00:00 2001 From: Md Raju Ahmed Date: Tue, 11 Jun 2024 23:58:33 +0200 Subject: [PATCH 153/314] chore: replaced icons with unicodes --- .../lib/features/monitor/participant_details_view.dart | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/designer_v2/lib/features/monitor/participant_details_view.dart b/designer_v2/lib/features/monitor/participant_details_view.dart index 63823c83d..f65209b71 100644 --- a/designer_v2/lib/features/monitor/participant_details_view.dart +++ b/designer_v2/lib/features/monitor/participant_details_view.dart @@ -116,17 +116,17 @@ class ParticipantDetailsView extends ConsumerWidget { for (final intervention in interventions) { for (final task in intervention.tasks) { if (missedTaskIds.contains(task.id)) { - sb.writeln('❌ ${intervention.name} - ${task.title}'); + sb.writeln('\u{274C} ${intervention.name} - ${task.title}'); } else if (completedTaskIds.contains(task.id)) { - sb.writeln('✅ ${intervention.name} - ${task.title}'); + sb.writeln('\u{2705} ${intervention.name} - ${task.title}'); } } } for (final observation in observations) { if (missedTaskIds.contains(observation.id)) { - sb.writeln('❌ ${observation.title}'); + sb.writeln('\u{274C} ${observation.title}'); } else if (completedTaskIds.contains(observation.id)) { - sb.writeln('✅ ${observation.title}'); + sb.writeln('\u{2705} ${observation.title}'); } } return sb.toString(); From 2901d719e9e372d07d99be0ab4ce0851abc23117 Mon Sep 17 00:00:00 2001 From: Md Raju Ahmed Date: Wed, 12 Jun 2024 00:22:30 +0200 Subject: [PATCH 154/314] chore: translation changed --- designer_v2/lib/localization/app_de.arb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/designer_v2/lib/localization/app_de.arb b/designer_v2/lib/localization/app_de.arb index ccec9ce21..4072827fe 100644 --- a/designer_v2/lib/localization/app_de.arb +++ b/designer_v2/lib/localization/app_de.arb @@ -508,7 +508,7 @@ "monitoring_table_column_completed_interventions": "Abgeschlossene\nInterventionen", "monitoring_table_column_completed_surveys": "Abgeschlossene\nFragebögen", "monitoring_table_row_tooltip_dropout": "Dieser Teilnehmer ist ausgeschieden und es wird keine neue Aktivität hinzugefügt", - "monitoring_table_completed_interventions_header_tooltip": "Der Eingriff ist erst abgeschlossen, wenn alle Aufgaben erledigt sind", + "monitoring_table_completed_interventions_header_tooltip": "Die Intervention ist erst abgeschlossen, wenn alle Aufgaben erledigt sind", "@__________________STUDYPAGE_ANALYZE__________________": {}, "banner_text_study_analyze_draft": "Solange die Studie noch nicht live ist, basieren die Ergebnisse hier auf dem letzten Testlauf der Studie (siehe Testmodus).\nDie Ergebnisdaten werden automatisch zurückgesetzt sobald die Studie mit echten Teilnehmern startet.", "action_button_study_export": "Daten exportieren", From 39a320ebc9ebbff99f24af763cb6f92fca661af1 Mon Sep 17 00:00:00 2001 From: Md Raju Ahmed Date: Wed, 12 Jun 2024 00:32:25 +0200 Subject: [PATCH 155/314] chore: participantDropoutDuration moved to constant file --- designer_v2/lib/constants.dart | 2 ++ designer_v2/lib/domain/study_monitoring.dart | 8 +++----- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/designer_v2/lib/constants.dart b/designer_v2/lib/constants.dart index 0443bca8c..91a22c62c 100644 --- a/designer_v2/lib/constants.dart +++ b/designer_v2/lib/constants.dart @@ -46,3 +46,5 @@ const String signupRouteName = 'signup'; const String forgotPasswordRouteName = 'forgotPassword'; const String recoverPasswordRouteName = 'recoverPassword'; const String errorRouteName = 'error'; +final DateTime participantDropoutDuration = DateTime.now().subtract(const Duration(days: 7)); + diff --git a/designer_v2/lib/domain/study_monitoring.dart b/designer_v2/lib/domain/study_monitoring.dart index 7750c0334..ad49fca9a 100644 --- a/designer_v2/lib/domain/study_monitoring.dart +++ b/designer_v2/lib/domain/study_monitoring.dart @@ -2,6 +2,7 @@ import 'dart:math'; import 'package:equatable/equatable.dart'; import 'package:studyu_core/core.dart'; +import 'package:studyu_designer_v2/constants.dart'; class StudyMonitorData { /// Number of participants who are currently active in the study @@ -163,16 +164,13 @@ extension StudyMonitoringX on Study { )); } - final now = DateTime.now(); - final sevenDaysAgo = now.subtract(const Duration(days: 7)); //dropout time - final activeParticipants = items.where((item) { return !item.droppedOut && item.currentDayOfStudy < item.studyDurationInDays && - item.lastActivityAt.isAfter(sevenDaysAgo); + item.lastActivityAt.isAfter(participantDropoutDuration); }).length; final dropoutParticipants = items.where((item) { - return item.droppedOut && item.lastActivityAt.isBefore(sevenDaysAgo); + return item.droppedOut && item.lastActivityAt.isBefore(participantDropoutDuration); }).length; final completedParticipants = items .where((item) => item.currentDayOfStudy >= item.studyDurationInDays) From eb4ae038b62b977f33188705df9d5943e9a6b4d4 Mon Sep 17 00:00:00 2001 From: Johannes Vedder Date: Sun, 9 Jun 2024 13:22:00 +0200 Subject: [PATCH 156/314] chore: use same lint for all packages --- app/analysis_options.yaml | 1 - core/analysis_options.yaml | 1 - designer_v2/analysis_options.yaml | 2 +- designer_v2/pubspec.yaml | 1 + flutter_analysis_options.yaml | 52 ---------------------------- flutter_common/analysis_options.yaml | 1 - pubspec.lock | 16 --------- pubspec.yaml | 1 - 8 files changed, 2 insertions(+), 73 deletions(-) delete mode 100644 app/analysis_options.yaml delete mode 100644 core/analysis_options.yaml delete mode 100644 flutter_analysis_options.yaml delete mode 100644 flutter_common/analysis_options.yaml diff --git a/app/analysis_options.yaml b/app/analysis_options.yaml deleted file mode 100644 index ca8edeaa3..000000000 --- a/app/analysis_options.yaml +++ /dev/null @@ -1 +0,0 @@ -include: ../flutter_analysis_options.yaml diff --git a/core/analysis_options.yaml b/core/analysis_options.yaml deleted file mode 100644 index 5e2133eb6..000000000 --- a/core/analysis_options.yaml +++ /dev/null @@ -1 +0,0 @@ -include: ../analysis_options.yaml diff --git a/designer_v2/analysis_options.yaml b/designer_v2/analysis_options.yaml index 3d0cfc1ee..0310d91c6 100644 --- a/designer_v2/analysis_options.yaml +++ b/designer_v2/analysis_options.yaml @@ -1,4 +1,4 @@ -include: ../flutter_analysis_options.yaml +include: ../analysis_options.yaml analyzer: plugins: diff --git a/designer_v2/pubspec.yaml b/designer_v2/pubspec.yaml index 11e6e4b0e..6d917e59b 100644 --- a/designer_v2/pubspec.yaml +++ b/designer_v2/pubspec.yaml @@ -47,6 +47,7 @@ dev_dependencies: sdk: flutter integration_test: sdk: flutter + lint: ^2.3.0 patrol_finders: ^2.1.2 riverpod_lint: test: ^1.24.9 # integration_test diff --git a/flutter_analysis_options.yaml b/flutter_analysis_options.yaml deleted file mode 100644 index 6ca7f76a2..000000000 --- a/flutter_analysis_options.yaml +++ /dev/null @@ -1,52 +0,0 @@ -# This file is used by all flutter projects in this monorepo. - -# This file configures the analyzer, which statically analyzes Dart code to -# check for errors, warnings, and lints. -# -# The issues identified by the analyzer are surfaced in the UI of Dart-enabled -# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be -# invoked from the command line by running `flutter analyze`. - -# The following line activates a set of recommended lints for Flutter apps, -# packages, and plugins designed to encourage good coding practices. -include: package:flutter_lints/flutter.yaml - -analyzer: - exclude: - - "**/*.g.dart" - -linter: - # The lint rules applied to this project can be customized in the - # section below to disable rules from the `package:flutter_lints/flutter.yaml` - # included above or to enable additional rules. A list of all available lints - # and their documentation is published at - # https://dart-lang.github.io/linter/lints/index.html. - # - # Instead of disabling a lint rule for the entire project in the - # section below, it can also be suppressed for a single line of code - # or a specific dart file by using the `// ignore: name_of_lint` and - # `// ignore_for_file: name_of_lint` syntax on the line or in the file - # producing the lint. - rules: - # STYLE - # cascade_invocations: true # May has issues: https://github.com/dart-lang/linter/issues/1589 - # prefer_foreach: true - # prefer_int_literals: true - # prefer_single_quotes: true - # use_raw_strings: true - - # prefer_single_quotes: true - - # DISABLE - # We have prints for better debugging. Maybe not the best option. - avoid_print: false - # Highlights localization imports and others which are annoying to fix - # depend_on_referenced_packages: false - # I prefer the distinction between local source files and imported packages. - # Apparently package imports are preferred because they allow for easy find and replace - # always_use_package_imports: false - - sort_pub_dependencies: true - -# Additional information about this file can be found at -# https://dart.dev/guides/language/analysis-options \ No newline at end of file diff --git a/flutter_common/analysis_options.yaml b/flutter_common/analysis_options.yaml deleted file mode 100644 index ca8edeaa3..000000000 --- a/flutter_common/analysis_options.yaml +++ /dev/null @@ -1 +0,0 @@ -include: ../flutter_analysis_options.yaml diff --git a/pubspec.lock b/pubspec.lock index ca3ec2ce5..255782ece 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -81,14 +81,6 @@ packages: url: "https://pub.dev" source: hosted version: "7.0.0" - flutter_lints: - dependency: "direct dev" - description: - name: flutter_lints - sha256: "3f41d009ba7172d5ff9be5f6e6e6abb4300e263aab8866d2a0842ed2a70f8f0c" - url: "https://pub.dev" - source: hosted - version: "4.0.0" glob: dependency: transitive description: @@ -145,14 +137,6 @@ packages: url: "https://pub.dev" source: hosted version: "2.3.0" - lints: - dependency: transitive - description: - name: lints - sha256: "976c774dd944a42e83e2467f4cc670daef7eed6295b10b36ae8c85bcbf828235" - url: "https://pub.dev" - source: hosted - version: "4.0.0" matcher: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index b8592b1e2..7e9cec361 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -7,6 +7,5 @@ environment: sdk: ">=2.18.0 <3.0.0" dev_dependencies: - flutter_lints: ^4.0.0 lint: ^2.3.0 melos: ^6.0.0 From 8169e201e1770952dd6bd275aeda8bf925613b9b Mon Sep 17 00:00:00 2001 From: Johannes Vedder Date: Sun, 9 Jun 2024 13:25:58 +0200 Subject: [PATCH 157/314] chore: use default dart format code style --- melos.yaml | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/melos.yaml b/melos.yaml index 975cdf402..4ce51f49b 100644 --- a/melos.yaml +++ b/melos.yaml @@ -23,18 +23,16 @@ scripts: "dart fix --apply" description: Fix auto-fixable lint errors - # todo revert to default line length format: run: | melos exec -c 6 -- \ - "dart format -l 120 ." + "dart format ." description: Format all code and markdown files - # todo do not exclude files anymore when line length is set to default format:ci: run: | melos exec -c 6 -- \ - "find . -type f -name '*.dart' ! -name '*.g.dart' ! -path '**/.dart_tool/**' | tr '\n' ' ' | xargs dart format -l 120 --set-exit-if-changed" + "dart format . --set-exit-if-changed" description: Format all code without generated files outdated: From d49d217008e5d61c4855a95cb09f3d0b21cc51a7 Mon Sep 17 00:00:00 2001 From: Johannes Vedder Date: Sun, 9 Jun 2024 16:35:11 +0200 Subject: [PATCH 158/314] chore: analysis lint fixes --- app/pubspec.yaml | 1 + .../src/models/consent/consent_item.g.dart | 23 +- core/lib/src/models/contact.g.dart | 31 +- .../eligibility/eligibility_criterion.g.dart | 21 +- .../types/boolean_expression.g.dart | 18 +- .../types/choice_expression.g.dart | 20 +- .../expressions/types/not_expression.g.dart | 18 +- .../models/interventions/intervention.g.dart | 25 +- .../interventions/tasks/checkmark_task.g.dart | 27 +- .../tasks/questionnaire_task.g.dart | 29 +- .../questionnaire/question_conditional.g.dart | 2 +- .../questions/annotated_scale_question.g.dart | 35 +- .../questions/audio_recording_question.g.dart | 27 +- .../questions/boolean_question.g.dart | 25 +- .../questions/choice_question.g.dart | 29 +- .../questions/free_text_question.g.dart | 31 +- .../questions/image_capturing_question.g.dart | 25 +- .../questions/scale_question.g.dart | 39 +-- .../questions/visual_analogue_question.g.dart | 41 +-- .../models/report/report_specification.g.dart | 19 +- .../report/sections/average_section.g.dart | 27 +- .../sections/linear_regression_section.g.dart | 30 +- core/lib/src/models/results/result.g.dart | 18 +- .../results/numeric_result.g.dart | 2 +- .../study_schedule/study_schedule.g.dart | 2 +- core/lib/src/models/tables/app_config.g.dart | 32 +- core/lib/src/models/tables/repo.g.dart | 26 +- core/lib/src/models/tables/study.g.dart | 53 ++- .../lib/src/models/tables/study_invite.g.dart | 22 +- .../src/models/tables/study_subject.g.dart | 29 +- .../src/models/tables/subject_progress.g.dart | 26 +- core/lib/src/models/tables/user.g.dart | 2 +- core/lib/src/models/tasks/schedule.g.dart | 9 +- core/lib/src/util/analytics.g.dart | 21 +- designer_v2/analysis_options.yaml | 3 + designer_v2/integration_test/app_test.dart | 8 +- .../robots/study_info_robot.dart | 18 +- .../robots/study_interventions_robot.dart | 8 +- .../robots/study_measurements_robot.dart | 12 +- .../lib/common_views/action_inline_menu.dart | 56 +-- .../lib/common_views/action_popup_menu.dart | 14 +- designer_v2/lib/common_views/badge.dart | 13 +- designer_v2/lib/common_views/banner.dart | 54 +-- designer_v2/lib/common_views/collapse.dart | 8 +- .../common_views/constrained_flexible.dart | 2 +- designer_v2/lib/common_views/dialog.dart | 7 +- designer_v2/lib/common_views/empty_body.dart | 78 +++-- .../lib/common_views/form_buttons.dart | 16 +- .../common_views/form_consumer_widget.dart | 4 +- .../lib/common_views/form_control_label.dart | 29 +- .../lib/common_views/form_scaffold.dart | 63 ++-- .../lib/common_views/form_table_layout.dart | 24 +- designer_v2/lib/common_views/icon_picker.dart | 158 +++++---- .../common_views/layout_single_column.dart | 11 +- .../lib/common_views/layout_two_column.dart | 173 +++++----- .../lib/common_views/mouse_events.dart | 61 ++-- .../lib/common_views/navbar_tabbed.dart | 72 ++-- .../lib/common_views/primary_button.dart | 76 +++-- .../common_views/reactive_color_picker.dart | 45 ++- designer_v2/lib/common_views/search.dart | 2 +- .../lib/common_views/sidesheet/sidesheet.dart | 27 +- .../sidesheet/sidesheet_form.dart | 18 +- .../lib/common_views/standard_table.dart | 278 +++++++++------ designer_v2/lib/common_views/studyu_logo.dart | 2 +- .../lib/common_views/styling_information.dart | 21 +- .../lib/common_views/sync_indicator.dart | 5 +- .../lib/common_views/text_hyperlink.dart | 5 +- .../lib/common_views/under_construction.dart | 2 +- designer_v2/lib/domain/schedule.dart | 2 +- designer_v2/lib/domain/study.dart | 14 +- designer_v2/lib/domain/study_export.dart | 27 +- .../features/account/account_settings.dart | 4 +- .../analyze/study_analyze_controller.dart | 8 +- .../features/analyze/study_analyze_page.dart | 7 +- .../features/analyze/study_export_zip.dart | 2 +- designer_v2/lib/features/app.dart | 2 +- designer_v2/lib/features/app_controller.dart | 36 +- designer_v2/lib/features/app_drawer.dart | 46 +-- .../features/auth/auth_form_controller.dart | 92 ++--- .../lib/features/auth/auth_form_fields.dart | 59 ++-- .../lib/features/auth/auth_scaffold.dart | 48 +-- .../lib/features/auth/login_form_view.dart | 51 +-- .../auth/password_forgot_form_view.dart | 42 ++- .../auth/password_recovery_form_view.dart | 49 +-- .../lib/features/auth/signup_form_view.dart | 73 ++-- .../lib/features/auth/studyu_jtbd.dart | 20 +- .../dashboard/dashboard_controller.dart | 67 ++-- .../features/dashboard/dashboard_page.dart | 10 +- .../dashboard/dashboard_scaffold.dart | 3 +- .../features/dashboard/dashboard_state.dart | 9 +- .../lib/features/dashboard/studies_table.dart | 14 +- .../studies_table_column_header.dart | 8 +- .../dashboard/studies_table_item.dart | 249 ++++++++------ .../consent_item_form_controller.dart | 16 +- .../enrollment/consent_item_form_view.dart | 7 +- .../enrollment_form_controller.dart | 81 +++-- .../enrollment/enrollment_form_view.dart | 191 +++++++---- .../screener_question_form_controller.dart | 6 +- .../screener_question_logic_form_view.dart | 12 +- .../info/study_info_form_controller.dart | 206 +++++++---- .../design/info/study_info_form_view.dart | 11 +- .../intervention_form_controller.dart | 92 +++-- .../interventions/intervention_form_data.dart | 6 +- .../interventions/intervention_form_view.dart | 105 +++--- .../intervention_preview_view.dart | 11 +- .../intervention_task_form_controller.dart | 8 +- .../intervention_task_form_view.dart | 9 +- .../interventions_form_controller.dart | 90 +++-- .../interventions_form_view.dart | 13 +- .../study_schedule_form_controller_mixin.dart | 10 +- .../study_schedule_form_data.dart | 2 +- .../study_schedule_form_view.dart | 4 +- .../measurements_form_controller.dart | 80 +++-- .../measurements/measurements_form_data.dart | 4 +- .../measurements/measurements_form_view.dart | 5 +- .../survey/survey_form_controller.dart | 66 ++-- .../measurements/survey/survey_form_view.dart | 293 ++++++++-------- .../survey/survey_preview_view.dart | 11 +- .../features/design/reports/report_badge.dart | 6 +- .../reports/reports_form_controller.dart | 59 ++-- .../design/reports/reports_form_data.dart | 2 +- .../design/reports/reports_form_view.dart | 68 ++-- .../section/report_item_form_controller.dart | 228 +++++++++---- .../section/report_item_form_data.dart | 8 +- .../section/report_item_form_view.dart | 20 +- .../types/average_section_form_view.dart | 8 +- .../section/types/data_reference_editor.dart | 3 +- .../linear_regression_section_form_view.dart | 10 +- .../reports/section/types/section_type.dart | 29 +- .../question/question_form_controller.dart | 322 +++++++++++------- .../question/question_form_data.dart | 100 ++++-- .../question/question_form_view.dart | 246 +++++++------ .../types/bool_question_form_view.dart | 8 +- .../types/choice_question_form_view.dart | 34 +- .../types/free_text_question_form_view.dart | 24 +- .../types/scale_question_form_view.dart | 17 +- .../questionnaire_form_data.dart | 2 +- .../schedule/schedule_controls_view.dart | 20 +- .../schedule_form_controller_mixin.dart | 26 +- .../shared/schedule/schedule_form_data.dart | 6 +- .../design/study_design_page_view.dart | 5 +- .../design/study_form_controller.dart | 29 +- .../lib/features/design/study_form_data.dart | 2 +- .../features/design/study_form_scaffold.dart | 4 +- .../lib/features/forms/form_array_table.dart | 113 +++--- .../lib/features/forms/form_control.dart | 21 +- .../lib/features/forms/form_validation.dart | 50 ++- .../lib/features/forms/form_view_model.dart | 98 ++++-- .../forms/form_view_model_collection.dart | 2 +- .../form_view_model_collection_actions.dart | 22 +- .../publish/study_publish_dialog.dart | 2 +- .../publish/study_publish_dialog_confirm.dart | 120 ++++--- .../publish/study_publish_dialog_success.dart | 7 +- .../lib/features/recruit/enrolled_badge.dart | 2 +- .../recruit/invite_code_form_controller.dart | 80 +++-- .../recruit/invite_code_form_view.dart | 14 +- .../features/recruit/invite_codes_table.dart | 11 +- .../recruit/study_recruit_controller.dart | 12 +- .../features/recruit/study_recruit_page.dart | 8 +- .../study/settings/study_settings_dialog.dart | 7 +- .../study_settings_form_controller.dart | 23 +- .../features/study/study_base_controller.dart | 20 +- .../lib/features/study/study_controller.dart | 25 +- .../study/study_controller_state.dart | 2 +- .../lib/features/study/study_navbar.dart | 49 ++- .../study/study_participation_badge.dart | 6 +- .../lib/features/study/study_scaffold.dart | 130 +++---- .../features/study/study_status_badge.dart | 10 +- .../features/study/study_test_controller.dart | 2 +- .../lib/features/study/study_test_frame.dart | 104 +++--- .../study/study_test_frame_controllers.dart | 6 +- .../study/study_test_frame_views.dart | 14 +- .../lib/features/study/study_test_page.dart | 169 ++++----- .../lib/localization/app_translation.dart | 4 +- .../lib/localization/language_picker.dart | 14 +- .../lib/localization/locale_providers.dart | 5 +- .../lib/localization/locale_state.dart | 25 +- .../platform_locale_interface.dart | 2 +- .../platform_locale_mobile.dart | 8 +- .../platform_locale/platform_locale_stub.dart | 2 +- .../platform_locale/platform_locale_web.dart | 8 +- designer_v2/lib/main.dart | 13 +- designer_v2/lib/repositories/api_client.dart | 91 +++-- .../lib/repositories/auth_repository.dart | 12 +- .../repositories/invite_code_repository.dart | 62 ++-- .../lib/repositories/model_repository.dart | 99 ++++-- .../lib/repositories/study_repository.dart | 10 +- .../lib/repositories/supabase_client.dart | 6 +- .../lib/repositories/user_repository.dart | 22 +- designer_v2/lib/routing/router.dart | 13 +- designer_v2/lib/routing/router_config.dart | 77 ++--- designer_v2/lib/routing/router_intent.dart | 86 +++-- designer_v2/lib/routing/router_utils.dart | 2 +- .../lib/services/notification_dispatcher.dart | 152 +++++---- .../lib/services/notification_types.dart | 22 +- designer_v2/lib/services/notifications.dart | 2 +- designer_v2/lib/theme.dart | 18 +- designer_v2/lib/utils/behaviour_subject.dart | 2 +- designer_v2/lib/utils/color.dart | 2 +- designer_v2/lib/utils/debouncer.dart | 18 +- designer_v2/lib/utils/extensions.dart | 38 ++- designer_v2/lib/utils/file_download.dart | 18 +- designer_v2/lib/utils/font.dart | 10 +- designer_v2/lib/utils/json_file_loader.dart | 7 +- designer_v2/lib/utils/json_format.dart | 4 +- designer_v2/lib/utils/model_action.dart | 22 +- designer_v2/lib/utils/optimistic_update.dart | 8 +- designer_v2/lib/utils/performance.dart | 27 +- designer_v2/lib/utils/time_of_day.dart | 12 +- designer_v2/pubspec.lock | 8 + 210 files changed, 4397 insertions(+), 3388 deletions(-) diff --git a/app/pubspec.yaml b/app/pubspec.yaml index d8a506c33..efb8e574b 100644 --- a/app/pubspec.yaml +++ b/app/pubspec.yaml @@ -7,6 +7,7 @@ repository: https://github.com/hpi-studyu/studyu environment: sdk: '>=3.2.0 <4.0.0' + dependencies: camera: ^0.11.0+1 collection: ^1.18.0 diff --git a/core/lib/src/models/consent/consent_item.g.dart b/core/lib/src/models/consent/consent_item.g.dart index ab84c211e..5adf71a9a 100644 --- a/core/lib/src/models/consent/consent_item.g.dart +++ b/core/lib/src/models/consent/consent_item.g.dart @@ -13,19 +13,10 @@ ConsentItem _$ConsentItemFromJson(Map json) => ConsentItem( ..description = json['description'] as String? ..iconName = json['iconName'] as String; -Map _$ConsentItemToJson(ConsentItem instance) { - final val = { - 'id': instance.id, - }; - - void writeNotNull(String key, dynamic value) { - if (value != null) { - val[key] = value; - } - } - - writeNotNull('title', instance.title); - writeNotNull('description', instance.description); - val['iconName'] = instance.iconName; - return val; -} +Map _$ConsentItemToJson(ConsentItem instance) => + { + 'id': instance.id, + 'title': instance.title, + 'description': instance.description, + 'iconName': instance.iconName, + }; diff --git a/core/lib/src/models/contact.g.dart b/core/lib/src/models/contact.g.dart index 9ce399e8d..3dec28717 100644 --- a/core/lib/src/models/contact.g.dart +++ b/core/lib/src/models/contact.g.dart @@ -17,24 +17,13 @@ Contact _$ContactFromJson(Map json) => Contact() ..phone = json['phone'] as String ..additionalInfo = json['additionalInfo'] as String?; -Map _$ContactToJson(Contact instance) { - final val = { - 'organization': instance.organization, - }; - - void writeNotNull(String key, dynamic value) { - if (value != null) { - val[key] = value; - } - } - - writeNotNull('institutionalReviewBoard', instance.institutionalReviewBoard); - writeNotNull('institutionalReviewBoardNumber', - instance.institutionalReviewBoardNumber); - writeNotNull('researchers', instance.researchers); - val['email'] = instance.email; - val['website'] = instance.website; - val['phone'] = instance.phone; - writeNotNull('additionalInfo', instance.additionalInfo); - return val; -} +Map _$ContactToJson(Contact instance) => { + 'organization': instance.organization, + 'institutionalReviewBoard': instance.institutionalReviewBoard, + 'institutionalReviewBoardNumber': instance.institutionalReviewBoardNumber, + 'researchers': instance.researchers, + 'email': instance.email, + 'website': instance.website, + 'phone': instance.phone, + 'additionalInfo': instance.additionalInfo, + }; diff --git a/core/lib/src/models/eligibility/eligibility_criterion.g.dart b/core/lib/src/models/eligibility/eligibility_criterion.g.dart index ad35bd974..9b7681a7a 100644 --- a/core/lib/src/models/eligibility/eligibility_criterion.g.dart +++ b/core/lib/src/models/eligibility/eligibility_criterion.g.dart @@ -16,18 +16,9 @@ EligibilityCriterion _$EligibilityCriterionFromJson( Expression.fromJson(json['condition'] as Map); Map _$EligibilityCriterionToJson( - EligibilityCriterion instance) { - final val = { - 'id': instance.id, - }; - - void writeNotNull(String key, dynamic value) { - if (value != null) { - val[key] = value; - } - } - - writeNotNull('reason', instance.reason); - val['condition'] = instance.condition.toJson(); - return val; -} + EligibilityCriterion instance) => + { + 'id': instance.id, + 'reason': instance.reason, + 'condition': instance.condition, + }; diff --git a/core/lib/src/models/expressions/types/boolean_expression.g.dart b/core/lib/src/models/expressions/types/boolean_expression.g.dart index 3328aae56..d1e111774 100644 --- a/core/lib/src/models/expressions/types/boolean_expression.g.dart +++ b/core/lib/src/models/expressions/types/boolean_expression.g.dart @@ -11,16 +11,8 @@ BooleanExpression _$BooleanExpressionFromJson(Map json) => ..type = json['type'] as String? ..target = json['target'] as String?; -Map _$BooleanExpressionToJson(BooleanExpression instance) { - final val = {}; - - void writeNotNull(String key, dynamic value) { - if (value != null) { - val[key] = value; - } - } - - writeNotNull('type', instance.type); - writeNotNull('target', instance.target); - return val; -} +Map _$BooleanExpressionToJson(BooleanExpression instance) => + { + 'type': instance.type, + 'target': instance.target, + }; diff --git a/core/lib/src/models/expressions/types/choice_expression.g.dart b/core/lib/src/models/expressions/types/choice_expression.g.dart index 3e1c40902..e8da4fa7e 100644 --- a/core/lib/src/models/expressions/types/choice_expression.g.dart +++ b/core/lib/src/models/expressions/types/choice_expression.g.dart @@ -12,17 +12,9 @@ ChoiceExpression _$ChoiceExpressionFromJson(Map json) => ..target = json['target'] as String? ..choices = (json['choices'] as List).toSet(); -Map _$ChoiceExpressionToJson(ChoiceExpression instance) { - final val = {}; - - void writeNotNull(String key, dynamic value) { - if (value != null) { - val[key] = value; - } - } - - writeNotNull('type', instance.type); - writeNotNull('target', instance.target); - val['choices'] = instance.choices.toList(); - return val; -} +Map _$ChoiceExpressionToJson(ChoiceExpression instance) => + { + 'type': instance.type, + 'target': instance.target, + 'choices': instance.choices.toList(), + }; diff --git a/core/lib/src/models/expressions/types/not_expression.g.dart b/core/lib/src/models/expressions/types/not_expression.g.dart index 84704e8cf..34a584147 100644 --- a/core/lib/src/models/expressions/types/not_expression.g.dart +++ b/core/lib/src/models/expressions/types/not_expression.g.dart @@ -12,16 +12,8 @@ NotExpression _$NotExpressionFromJson(Map json) => ..expression = Expression.fromJson(json['expression'] as Map); -Map _$NotExpressionToJson(NotExpression instance) { - final val = {}; - - void writeNotNull(String key, dynamic value) { - if (value != null) { - val[key] = value; - } - } - - writeNotNull('type', instance.type); - val['expression'] = instance.expression.toJson(); - return val; -} +Map _$NotExpressionToJson(NotExpression instance) => + { + 'type': instance.type, + 'expression': instance.expression, + }; diff --git a/core/lib/src/models/interventions/intervention.g.dart b/core/lib/src/models/interventions/intervention.g.dart index 6e62e92fa..e561962b8 100644 --- a/core/lib/src/models/interventions/intervention.g.dart +++ b/core/lib/src/models/interventions/intervention.g.dart @@ -16,20 +16,11 @@ Intervention _$InterventionFromJson(Map json) => Intervention( .map((e) => InterventionTask.fromJson(e as Map)) .toList(); -Map _$InterventionToJson(Intervention instance) { - final val = { - 'id': instance.id, - }; - - void writeNotNull(String key, dynamic value) { - if (value != null) { - val[key] = value; - } - } - - writeNotNull('name', instance.name); - writeNotNull('description', instance.description); - val['icon'] = instance.icon; - val['tasks'] = instance.tasks.map((e) => e.toJson()).toList(); - return val; -} +Map _$InterventionToJson(Intervention instance) => + { + 'id': instance.id, + 'name': instance.name, + 'description': instance.description, + 'icon': instance.icon, + 'tasks': instance.tasks, + }; diff --git a/core/lib/src/models/interventions/tasks/checkmark_task.g.dart b/core/lib/src/models/interventions/tasks/checkmark_task.g.dart index d7db031af..1539d81c2 100644 --- a/core/lib/src/models/interventions/tasks/checkmark_task.g.dart +++ b/core/lib/src/models/interventions/tasks/checkmark_task.g.dart @@ -15,21 +15,12 @@ CheckmarkTask _$CheckmarkTaskFromJson(Map json) => ..footer = json['footer'] as String? ..schedule = Schedule.fromJson(json['schedule'] as Map); -Map _$CheckmarkTaskToJson(CheckmarkTask instance) { - final val = { - 'type': instance.type, - 'id': instance.id, - }; - - void writeNotNull(String key, dynamic value) { - if (value != null) { - val[key] = value; - } - } - - writeNotNull('title', instance.title); - writeNotNull('header', instance.header); - writeNotNull('footer', instance.footer); - val['schedule'] = instance.schedule.toJson(); - return val; -} +Map _$CheckmarkTaskToJson(CheckmarkTask instance) => + { + 'type': instance.type, + 'id': instance.id, + 'title': instance.title, + 'header': instance.header, + 'footer': instance.footer, + 'schedule': instance.schedule, + }; diff --git a/core/lib/src/models/observations/tasks/questionnaire_task.g.dart b/core/lib/src/models/observations/tasks/questionnaire_task.g.dart index 9f86bb97a..a4cc3590f 100644 --- a/core/lib/src/models/observations/tasks/questionnaire_task.g.dart +++ b/core/lib/src/models/observations/tasks/questionnaire_task.g.dart @@ -17,22 +17,13 @@ QuestionnaireTask _$QuestionnaireTaskFromJson(Map json) => ..questions = StudyUQuestionnaire.fromJson(json['questions'] as List); -Map _$QuestionnaireTaskToJson(QuestionnaireTask instance) { - final val = { - 'type': instance.type, - 'id': instance.id, - }; - - void writeNotNull(String key, dynamic value) { - if (value != null) { - val[key] = value; - } - } - - writeNotNull('title', instance.title); - writeNotNull('header', instance.header); - writeNotNull('footer', instance.footer); - val['schedule'] = instance.schedule.toJson(); - val['questions'] = instance.questions.toJson(); - return val; -} +Map _$QuestionnaireTaskToJson(QuestionnaireTask instance) => + { + 'type': instance.type, + 'id': instance.id, + 'title': instance.title, + 'header': instance.header, + 'footer': instance.footer, + 'schedule': instance.schedule, + 'questions': instance.questions, + }; diff --git a/core/lib/src/models/questionnaire/question_conditional.g.dart b/core/lib/src/models/questionnaire/question_conditional.g.dart index 4a9effa84..eb7704d09 100644 --- a/core/lib/src/models/questionnaire/question_conditional.g.dart +++ b/core/lib/src/models/questionnaire/question_conditional.g.dart @@ -15,5 +15,5 @@ QuestionConditional _$QuestionConditionalFromJson( Map _$QuestionConditionalToJson( QuestionConditional instance) => { - 'condition': instance.condition.toJson(), + 'condition': instance.condition, }; diff --git a/core/lib/src/models/questionnaire/questions/annotated_scale_question.g.dart b/core/lib/src/models/questionnaire/questions/annotated_scale_question.g.dart index 1de91484b..e8ec497c2 100644 --- a/core/lib/src/models/questionnaire/questions/annotated_scale_question.g.dart +++ b/core/lib/src/models/questionnaire/questions/annotated_scale_question.g.dart @@ -26,28 +26,19 @@ AnnotatedScaleQuestion _$AnnotatedScaleQuestionFromJson( .toList(); Map _$AnnotatedScaleQuestionToJson( - AnnotatedScaleQuestion instance) { - final val = { - 'type': instance.type, - 'id': instance.id, - }; - - void writeNotNull(String key, dynamic value) { - if (value != null) { - val[key] = value; - } - } - - writeNotNull('prompt', instance.prompt); - writeNotNull('rationale', instance.rationale); - writeNotNull('conditional', instance.conditional?.toJson()); - val['minimum'] = instance.minimum; - val['maximum'] = instance.maximum; - val['step'] = instance.step; - val['initial'] = instance.initial; - val['annotations'] = instance.annotations.map((e) => e.toJson()).toList(); - return val; -} + AnnotatedScaleQuestion instance) => + { + 'type': instance.type, + 'id': instance.id, + 'prompt': instance.prompt, + 'rationale': instance.rationale, + 'conditional': instance.conditional, + 'minimum': instance.minimum, + 'maximum': instance.maximum, + 'step': instance.step, + 'initial': instance.initial, + 'annotations': instance.annotations, + }; Annotation _$AnnotationFromJson(Map json) => Annotation() ..value = (json['value'] as num).toInt() diff --git a/core/lib/src/models/questionnaire/questions/audio_recording_question.g.dart b/core/lib/src/models/questionnaire/questions/audio_recording_question.g.dart index c09581df9..08c0d5af8 100644 --- a/core/lib/src/models/questionnaire/questions/audio_recording_question.g.dart +++ b/core/lib/src/models/questionnaire/questions/audio_recording_question.g.dart @@ -22,21 +22,12 @@ AudioRecordingQuestion _$AudioRecordingQuestionFromJson( json['conditional'] as Map); Map _$AudioRecordingQuestionToJson( - AudioRecordingQuestion instance) { - final val = { - 'type': instance.type, - 'id': instance.id, - }; - - void writeNotNull(String key, dynamic value) { - if (value != null) { - val[key] = value; - } - } - - writeNotNull('prompt', instance.prompt); - writeNotNull('rationale', instance.rationale); - writeNotNull('conditional', instance.conditional?.toJson()); - val['maxRecordingDurationSeconds'] = instance.maxRecordingDurationSeconds; - return val; -} + AudioRecordingQuestion instance) => + { + 'type': instance.type, + 'id': instance.id, + 'prompt': instance.prompt, + 'rationale': instance.rationale, + 'conditional': instance.conditional, + 'maxRecordingDurationSeconds': instance.maxRecordingDurationSeconds, + }; diff --git a/core/lib/src/models/questionnaire/questions/boolean_question.g.dart b/core/lib/src/models/questionnaire/questions/boolean_question.g.dart index c20af6101..b052d3105 100644 --- a/core/lib/src/models/questionnaire/questions/boolean_question.g.dart +++ b/core/lib/src/models/questionnaire/questions/boolean_question.g.dart @@ -17,20 +17,11 @@ BooleanQuestion _$BooleanQuestionFromJson(Map json) => : QuestionConditional.fromJson( json['conditional'] as Map); -Map _$BooleanQuestionToJson(BooleanQuestion instance) { - final val = { - 'type': instance.type, - 'id': instance.id, - }; - - void writeNotNull(String key, dynamic value) { - if (value != null) { - val[key] = value; - } - } - - writeNotNull('prompt', instance.prompt); - writeNotNull('rationale', instance.rationale); - writeNotNull('conditional', instance.conditional?.toJson()); - return val; -} +Map _$BooleanQuestionToJson(BooleanQuestion instance) => + { + 'type': instance.type, + 'id': instance.id, + 'prompt': instance.prompt, + 'rationale': instance.rationale, + 'conditional': instance.conditional, + }; diff --git a/core/lib/src/models/questionnaire/questions/choice_question.g.dart b/core/lib/src/models/questionnaire/questions/choice_question.g.dart index 6fd59f733..e8ada08fd 100644 --- a/core/lib/src/models/questionnaire/questions/choice_question.g.dart +++ b/core/lib/src/models/questionnaire/questions/choice_question.g.dart @@ -21,25 +21,16 @@ ChoiceQuestion _$ChoiceQuestionFromJson(Map json) => .map((e) => Choice.fromJson(e as Map)) .toList(); -Map _$ChoiceQuestionToJson(ChoiceQuestion instance) { - final val = { - 'type': instance.type, - 'id': instance.id, - }; - - void writeNotNull(String key, dynamic value) { - if (value != null) { - val[key] = value; - } - } - - writeNotNull('prompt', instance.prompt); - writeNotNull('rationale', instance.rationale); - writeNotNull('conditional', instance.conditional?.toJson()); - val['multiple'] = instance.multiple; - val['choices'] = instance.choices.map((e) => e.toJson()).toList(); - return val; -} +Map _$ChoiceQuestionToJson(ChoiceQuestion instance) => + { + 'type': instance.type, + 'id': instance.id, + 'prompt': instance.prompt, + 'rationale': instance.rationale, + 'conditional': instance.conditional, + 'multiple': instance.multiple, + 'choices': instance.choices, + }; Choice _$ChoiceFromJson(Map json) => Choice( json['id'] as String, diff --git a/core/lib/src/models/questionnaire/questions/free_text_question.g.dart b/core/lib/src/models/questionnaire/questions/free_text_question.g.dart index 4a6865334..322c5845b 100644 --- a/core/lib/src/models/questionnaire/questions/free_text_question.g.dart +++ b/core/lib/src/models/questionnaire/questions/free_text_question.g.dart @@ -23,26 +23,17 @@ FreeTextQuestion _$FreeTextQuestionFromJson(Map json) => : QuestionConditional.fromJson( json['conditional'] as Map); -Map _$FreeTextQuestionToJson(FreeTextQuestion instance) { - final val = { - 'type': instance.type, - 'id': instance.id, - }; - - void writeNotNull(String key, dynamic value) { - if (value != null) { - val[key] = value; - } - } - - writeNotNull('prompt', instance.prompt); - writeNotNull('rationale', instance.rationale); - writeNotNull('conditional', instance.conditional?.toJson()); - val['lengthRange'] = instance.lengthRange; - val['textType'] = instance.textType.toJson(); - writeNotNull('customTypeExpression', instance.customTypeExpression); - return val; -} +Map _$FreeTextQuestionToJson(FreeTextQuestion instance) => + { + 'type': instance.type, + 'id': instance.id, + 'prompt': instance.prompt, + 'rationale': instance.rationale, + 'conditional': instance.conditional, + 'lengthRange': instance.lengthRange, + 'textType': instance.textType, + 'customTypeExpression': instance.customTypeExpression, + }; const _$FreeTextQuestionTypeEnumMap = { FreeTextQuestionType.any: 'any', diff --git a/core/lib/src/models/questionnaire/questions/image_capturing_question.g.dart b/core/lib/src/models/questionnaire/questions/image_capturing_question.g.dart index b06b088d5..6858d4e64 100644 --- a/core/lib/src/models/questionnaire/questions/image_capturing_question.g.dart +++ b/core/lib/src/models/questionnaire/questions/image_capturing_question.g.dart @@ -19,20 +19,11 @@ ImageCapturingQuestion _$ImageCapturingQuestionFromJson( json['conditional'] as Map); Map _$ImageCapturingQuestionToJson( - ImageCapturingQuestion instance) { - final val = { - 'type': instance.type, - 'id': instance.id, - }; - - void writeNotNull(String key, dynamic value) { - if (value != null) { - val[key] = value; - } - } - - writeNotNull('prompt', instance.prompt); - writeNotNull('rationale', instance.rationale); - writeNotNull('conditional', instance.conditional?.toJson()); - return val; -} + ImageCapturingQuestion instance) => + { + 'type': instance.type, + 'id': instance.id, + 'prompt': instance.prompt, + 'rationale': instance.rationale, + 'conditional': instance.conditional, + }; diff --git a/core/lib/src/models/questionnaire/questions/scale_question.g.dart b/core/lib/src/models/questionnaire/questions/scale_question.g.dart index e69c71d08..ef62e5eaa 100644 --- a/core/lib/src/models/questionnaire/questions/scale_question.g.dart +++ b/core/lib/src/models/questionnaire/questions/scale_question.g.dart @@ -26,27 +26,18 @@ ScaleQuestion _$ScaleQuestionFromJson(Map json) => ..maxColor = (json['max_color'] as num?)?.toInt() ..step = (json['step'] as num).toDouble(); -Map _$ScaleQuestionToJson(ScaleQuestion instance) { - final val = { - 'type': instance.type, - 'id': instance.id, - }; - - void writeNotNull(String key, dynamic value) { - if (value != null) { - val[key] = value; - } - } - - writeNotNull('prompt', instance.prompt); - writeNotNull('rationale', instance.rationale); - writeNotNull('conditional', instance.conditional?.toJson()); - val['minimum'] = instance.minimum; - val['maximum'] = instance.maximum; - val['initial'] = instance.initial; - val['annotations'] = instance.annotations.map((e) => e.toJson()).toList(); - writeNotNull('min_color', instance.minColor); - writeNotNull('max_color', instance.maxColor); - val['step'] = instance.step; - return val; -} +Map _$ScaleQuestionToJson(ScaleQuestion instance) => + { + 'type': instance.type, + 'id': instance.id, + 'prompt': instance.prompt, + 'rationale': instance.rationale, + 'conditional': instance.conditional, + 'minimum': instance.minimum, + 'maximum': instance.maximum, + 'initial': instance.initial, + 'annotations': instance.annotations, + 'min_color': instance.minColor, + 'max_color': instance.maxColor, + 'step': instance.step, + }; diff --git a/core/lib/src/models/questionnaire/questions/visual_analogue_question.g.dart b/core/lib/src/models/questionnaire/questions/visual_analogue_question.g.dart index 2c2a2b505..8c0a83a93 100644 --- a/core/lib/src/models/questionnaire/questions/visual_analogue_question.g.dart +++ b/core/lib/src/models/questionnaire/questions/visual_analogue_question.g.dart @@ -27,28 +27,19 @@ VisualAnalogueQuestion _$VisualAnalogueQuestionFromJson( ..maximumAnnotation = json['maximumAnnotation'] as String; Map _$VisualAnalogueQuestionToJson( - VisualAnalogueQuestion instance) { - final val = { - 'type': instance.type, - 'id': instance.id, - }; - - void writeNotNull(String key, dynamic value) { - if (value != null) { - val[key] = value; - } - } - - writeNotNull('prompt', instance.prompt); - writeNotNull('rationale', instance.rationale); - writeNotNull('conditional', instance.conditional?.toJson()); - val['minimum'] = instance.minimum; - val['maximum'] = instance.maximum; - val['step'] = instance.step; - val['initial'] = instance.initial; - val['minimumColor'] = instance.minimumColor; - val['maximumColor'] = instance.maximumColor; - val['minimumAnnotation'] = instance.minimumAnnotation; - val['maximumAnnotation'] = instance.maximumAnnotation; - return val; -} + VisualAnalogueQuestion instance) => + { + 'type': instance.type, + 'id': instance.id, + 'prompt': instance.prompt, + 'rationale': instance.rationale, + 'conditional': instance.conditional, + 'minimum': instance.minimum, + 'maximum': instance.maximum, + 'step': instance.step, + 'initial': instance.initial, + 'minimumColor': instance.minimumColor, + 'maximumColor': instance.maximumColor, + 'minimumAnnotation': instance.minimumAnnotation, + 'maximumAnnotation': instance.maximumAnnotation, + }; diff --git a/core/lib/src/models/report/report_specification.g.dart b/core/lib/src/models/report/report_specification.g.dart index ed596a611..70634fb92 100644 --- a/core/lib/src/models/report/report_specification.g.dart +++ b/core/lib/src/models/report/report_specification.g.dart @@ -15,16 +15,9 @@ ReportSpecification _$ReportSpecificationFromJson(Map json) => .map((e) => ReportSection.fromJson(e as Map)) .toList(); -Map _$ReportSpecificationToJson(ReportSpecification instance) { - final val = {}; - - void writeNotNull(String key, dynamic value) { - if (value != null) { - val[key] = value; - } - } - - writeNotNull('primary', instance.primary?.toJson()); - val['secondary'] = instance.secondary.map((e) => e.toJson()).toList(); - return val; -} +Map _$ReportSpecificationToJson( + ReportSpecification instance) => + { + 'primary': instance.primary, + 'secondary': instance.secondary, + }; diff --git a/core/lib/src/models/report/sections/average_section.g.dart b/core/lib/src/models/report/sections/average_section.g.dart index 21fd5f5f4..e646742a8 100644 --- a/core/lib/src/models/report/sections/average_section.g.dart +++ b/core/lib/src/models/report/sections/average_section.g.dart @@ -19,24 +19,15 @@ AverageSection _$AverageSectionFromJson(Map json) => : DataReference.fromJson( json['resultProperty'] as Map); -Map _$AverageSectionToJson(AverageSection instance) { - final val = { - 'type': instance.type, - 'id': instance.id, - }; - - void writeNotNull(String key, dynamic value) { - if (value != null) { - val[key] = value; - } - } - - writeNotNull('title', instance.title); - writeNotNull('description', instance.description); - writeNotNull('aggregate', _$TemporalAggregationEnumMap[instance.aggregate]); - writeNotNull('resultProperty', instance.resultProperty?.toJson()); - return val; -} +Map _$AverageSectionToJson(AverageSection instance) => + { + 'type': instance.type, + 'id': instance.id, + 'title': instance.title, + 'description': instance.description, + 'aggregate': _$TemporalAggregationEnumMap[instance.aggregate], + 'resultProperty': instance.resultProperty, + }; const _$TemporalAggregationEnumMap = { TemporalAggregation.day: 'day', diff --git a/core/lib/src/models/report/sections/linear_regression_section.g.dart b/core/lib/src/models/report/sections/linear_regression_section.g.dart index 977a7209b..0ee0c7645 100644 --- a/core/lib/src/models/report/sections/linear_regression_section.g.dart +++ b/core/lib/src/models/report/sections/linear_regression_section.g.dart @@ -22,26 +22,16 @@ LinearRegressionSection _$LinearRegressionSectionFromJson( _$ImprovementDirectionEnumMap, json['improvement']); Map _$LinearRegressionSectionToJson( - LinearRegressionSection instance) { - final val = { - 'type': instance.type, - 'id': instance.id, - }; - - void writeNotNull(String key, dynamic value) { - if (value != null) { - val[key] = value; - } - } - - writeNotNull('title', instance.title); - writeNotNull('description', instance.description); - writeNotNull('resultProperty', instance.resultProperty?.toJson()); - val['alpha'] = instance.alpha; - writeNotNull( - 'improvement', _$ImprovementDirectionEnumMap[instance.improvement]); - return val; -} + LinearRegressionSection instance) => + { + 'type': instance.type, + 'id': instance.id, + 'title': instance.title, + 'description': instance.description, + 'resultProperty': instance.resultProperty, + 'alpha': instance.alpha, + 'improvement': _$ImprovementDirectionEnumMap[instance.improvement], + }; const _$ImprovementDirectionEnumMap = { ImprovementDirection.positive: 'positive', diff --git a/core/lib/src/models/results/result.g.dart b/core/lib/src/models/results/result.g.dart index ce6de6834..836732dd8 100644 --- a/core/lib/src/models/results/result.g.dart +++ b/core/lib/src/models/results/result.g.dart @@ -10,17 +10,7 @@ Result _$ResultFromJson(Map json) => Result( json['type'] as String, )..periodId = json['periodId'] as String?; -Map _$ResultToJson(Result instance) { - final val = { - 'type': instance.type, - }; - - void writeNotNull(String key, dynamic value) { - if (value != null) { - val[key] = value; - } - } - - writeNotNull('periodId', instance.periodId); - return val; -} +Map _$ResultToJson(Result instance) => { + 'type': instance.type, + 'periodId': instance.periodId, + }; diff --git a/core/lib/src/models/study_results/results/numeric_result.g.dart b/core/lib/src/models/study_results/results/numeric_result.g.dart index b6a5fd1d0..449f4ba30 100644 --- a/core/lib/src/models/study_results/results/numeric_result.g.dart +++ b/core/lib/src/models/study_results/results/numeric_result.g.dart @@ -19,5 +19,5 @@ Map _$NumericResultToJson(NumericResult instance) => 'type': instance.type, 'id': instance.id, 'filename': instance.filename, - 'resultProperty': instance.resultProperty.toJson(), + 'resultProperty': instance.resultProperty, }; diff --git a/core/lib/src/models/study_schedule/study_schedule.g.dart b/core/lib/src/models/study_schedule/study_schedule.g.dart index ae103a19d..abb4ffa92 100644 --- a/core/lib/src/models/study_schedule/study_schedule.g.dart +++ b/core/lib/src/models/study_schedule/study_schedule.g.dart @@ -20,7 +20,7 @@ Map _$StudyScheduleToJson(StudySchedule instance) => 'numberOfCycles': instance.numberOfCycles, 'phaseDuration': instance.phaseDuration, 'includeBaseline': instance.includeBaseline, - 'sequence': instance.sequence.toJson(), + 'sequence': instance.sequence, 'sequenceCustom': instance.sequenceCustom, }; diff --git a/core/lib/src/models/tables/app_config.g.dart b/core/lib/src/models/tables/app_config.g.dart index 34f42d78b..7f1e01df8 100644 --- a/core/lib/src/models/tables/app_config.g.dart +++ b/core/lib/src/models/tables/app_config.g.dart @@ -21,24 +21,14 @@ AppConfig _$AppConfigFromJson(Map json) => AppConfig( : StudyUAnalytics.fromJson(json['analytics'] as Map), ); -Map _$AppConfigToJson(AppConfig instance) { - final val = { - 'id': instance.id, - 'app_min_version': instance.appMinVersion, - 'app_privacy': instance.appPrivacy, - 'app_terms': instance.appTerms, - 'designer_privacy': instance.designerPrivacy, - 'designer_terms': instance.designerTerms, - 'imprint': instance.imprint, - 'contact': instance.contact.toJson(), - }; - - void writeNotNull(String key, dynamic value) { - if (value != null) { - val[key] = value; - } - } - - writeNotNull('analytics', instance.analytics?.toJson()); - return val; -} +Map _$AppConfigToJson(AppConfig instance) => { + 'id': instance.id, + 'app_min_version': instance.appMinVersion, + 'app_privacy': instance.appPrivacy, + 'app_terms': instance.appTerms, + 'designer_privacy': instance.designerPrivacy, + 'designer_terms': instance.designerTerms, + 'imprint': instance.imprint, + 'contact': instance.contact, + 'analytics': instance.analytics, + }; diff --git a/core/lib/src/models/tables/repo.g.dart b/core/lib/src/models/tables/repo.g.dart index 1f653769c..55f466f3b 100644 --- a/core/lib/src/models/tables/repo.g.dart +++ b/core/lib/src/models/tables/repo.g.dart @@ -15,24 +15,14 @@ Repo _$RepoFromJson(Map json) => Repo( json['git_url'] as String?, ); -Map _$RepoToJson(Repo instance) { - final val = { - 'project_id': instance.projectId, - 'user_id': instance.userId, - 'study_id': instance.studyId, - 'provider': _$GitProviderEnumMap[instance.provider]!, - }; - - void writeNotNull(String key, dynamic value) { - if (value != null) { - val[key] = value; - } - } - - writeNotNull('web_url', instance.webUrl); - writeNotNull('git_url', instance.gitUrl); - return val; -} +Map _$RepoToJson(Repo instance) => { + 'project_id': instance.projectId, + 'user_id': instance.userId, + 'study_id': instance.studyId, + 'provider': _$GitProviderEnumMap[instance.provider]!, + 'web_url': instance.webUrl, + 'git_url': instance.gitUrl, + }; const _$GitProviderEnumMap = { GitProvider.gitlab: 'gitlab', diff --git a/core/lib/src/models/tables/study.g.dart b/core/lib/src/models/tables/study.g.dart index e1b6daece..99cb0e329 100644 --- a/core/lib/src/models/tables/study.g.dart +++ b/core/lib/src/models/tables/study.g.dart @@ -47,38 +47,27 @@ Study _$StudyFromJson(Map json) => Study( [] ..registryPublished = json['registry_published'] as bool? ?? false; -Map _$StudyToJson(Study instance) { - final val = { - 'id': instance.id, - }; - - void writeNotNull(String key, dynamic value) { - if (value != null) { - val[key] = value; - } - } - - writeNotNull('title', instance.title); - writeNotNull('description', instance.description); - val['user_id'] = instance.userId; - val['participation'] = instance.participation.toJson(); - val['result_sharing'] = instance.resultSharing.toJson(); - val['contact'] = instance.contact.toJson(); - val['icon_name'] = instance.iconName; - val['published'] = instance.published; - val['questionnaire'] = instance.questionnaire.toJson(); - val['eligibility_criteria'] = - instance.eligibilityCriteria.map((e) => e.toJson()).toList(); - val['consent'] = instance.consent.map((e) => e.toJson()).toList(); - val['interventions'] = instance.interventions.map((e) => e.toJson()).toList(); - val['observations'] = instance.observations.map((e) => e.toJson()).toList(); - val['schedule'] = instance.schedule.toJson(); - val['report_specification'] = instance.reportSpecification.toJson(); - val['results'] = instance.results.map((e) => e.toJson()).toList(); - val['collaborator_emails'] = instance.collaboratorEmails; - val['registry_published'] = instance.registryPublished; - return val; -} +Map _$StudyToJson(Study instance) => { + 'id': instance.id, + 'title': instance.title, + 'description': instance.description, + 'user_id': instance.userId, + 'participation': instance.participation, + 'result_sharing': instance.resultSharing, + 'contact': instance.contact, + 'icon_name': instance.iconName, + 'published': instance.published, + 'questionnaire': instance.questionnaire, + 'eligibility_criteria': instance.eligibilityCriteria, + 'consent': instance.consent, + 'interventions': instance.interventions, + 'observations': instance.observations, + 'schedule': instance.schedule, + 'report_specification': instance.reportSpecification, + 'results': instance.results, + 'collaborator_emails': instance.collaboratorEmails, + 'registry_published': instance.registryPublished, + }; const _$ParticipationEnumMap = { Participation.open: 'open', diff --git a/core/lib/src/models/tables/study_invite.g.dart b/core/lib/src/models/tables/study_invite.g.dart index 006ba6254..4a9c8102a 100644 --- a/core/lib/src/models/tables/study_invite.g.dart +++ b/core/lib/src/models/tables/study_invite.g.dart @@ -15,19 +15,9 @@ StudyInvite _$StudyInviteFromJson(Map json) => StudyInvite( .toList(), ); -Map _$StudyInviteToJson(StudyInvite instance) { - final val = { - 'code': instance.code, - 'study_id': instance.studyId, - }; - - void writeNotNull(String key, dynamic value) { - if (value != null) { - val[key] = value; - } - } - - writeNotNull( - 'preselected_intervention_ids', instance.preselectedInterventionIds); - return val; -} +Map _$StudyInviteToJson(StudyInvite instance) => + { + 'code': instance.code, + 'study_id': instance.studyId, + 'preselected_intervention_ids': instance.preselectedInterventionIds, + }; diff --git a/core/lib/src/models/tables/study_subject.g.dart b/core/lib/src/models/tables/study_subject.g.dart index bf851a5a8..d36af0389 100644 --- a/core/lib/src/models/tables/study_subject.g.dart +++ b/core/lib/src/models/tables/study_subject.g.dart @@ -20,22 +20,13 @@ StudySubject _$StudySubjectFromJson(Map json) => StudySubject( ..inviteCode = json['invite_code'] as String? ..isDeleted = json['is_deleted'] as bool; -Map _$StudySubjectToJson(StudySubject instance) { - final val = { - 'id': instance.id, - 'study_id': instance.studyId, - 'user_id': instance.userId, - }; - - void writeNotNull(String key, dynamic value) { - if (value != null) { - val[key] = value; - } - } - - writeNotNull('started_at', instance.startedAt?.toIso8601String()); - val['selected_intervention_ids'] = instance.selectedInterventionIds; - writeNotNull('invite_code', instance.inviteCode); - val['is_deleted'] = instance.isDeleted; - return val; -} +Map _$StudySubjectToJson(StudySubject instance) => + { + 'id': instance.id, + 'study_id': instance.studyId, + 'user_id': instance.userId, + 'started_at': instance.startedAt?.toIso8601String(), + 'selected_intervention_ids': instance.selectedInterventionIds, + 'invite_code': instance.inviteCode, + 'is_deleted': instance.isDeleted, + }; diff --git a/core/lib/src/models/tables/subject_progress.g.dart b/core/lib/src/models/tables/subject_progress.g.dart index 0b5d8ff49..47d7fb451 100644 --- a/core/lib/src/models/tables/subject_progress.g.dart +++ b/core/lib/src/models/tables/subject_progress.g.dart @@ -17,20 +17,12 @@ SubjectProgress _$SubjectProgressFromJson(Map json) => ? null : DateTime.parse(json['completed_at'] as String); -Map _$SubjectProgressToJson(SubjectProgress instance) { - final val = {}; - - void writeNotNull(String key, dynamic value) { - if (value != null) { - val[key] = value; - } - } - - writeNotNull('completed_at', instance.completedAt?.toIso8601String()); - val['subject_id'] = instance.subjectId; - val['intervention_id'] = instance.interventionId; - val['task_id'] = instance.taskId; - val['result_type'] = instance.resultType; - val['result'] = instance.result.toJson(); - return val; -} +Map _$SubjectProgressToJson(SubjectProgress instance) => + { + 'completed_at': instance.completedAt?.toIso8601String(), + 'subject_id': instance.subjectId, + 'intervention_id': instance.interventionId, + 'task_id': instance.taskId, + 'result_type': instance.resultType, + 'result': instance.result, + }; diff --git a/core/lib/src/models/tables/user.g.dart b/core/lib/src/models/tables/user.g.dart index fe2299aa4..54c1d0f1d 100644 --- a/core/lib/src/models/tables/user.g.dart +++ b/core/lib/src/models/tables/user.g.dart @@ -18,7 +18,7 @@ Map _$StudyUUserToJson(StudyUUser instance) => { 'id': instance.id, 'email': instance.email, - 'preferences': instance.preferences.toJson(), + 'preferences': instance.preferences, }; Preferences _$PreferencesFromJson(Map json) => Preferences( diff --git a/core/lib/src/models/tasks/schedule.g.dart b/core/lib/src/models/tasks/schedule.g.dart index b9645deb8..371ee3aed 100644 --- a/core/lib/src/models/tasks/schedule.g.dart +++ b/core/lib/src/models/tasks/schedule.g.dart @@ -15,9 +15,8 @@ Schedule _$ScheduleFromJson(Map json) => Schedule() .toList(); Map _$ScheduleToJson(Schedule instance) => { - 'completionPeriods': - instance.completionPeriods.map((e) => e.toJson()).toList(), - 'reminders': instance.reminders.map((e) => e.toJson()).toList(), + 'completionPeriods': instance.completionPeriods, + 'reminders': instance.reminders, }; CompletionPeriod _$CompletionPeriodFromJson(Map json) => @@ -30,6 +29,6 @@ CompletionPeriod _$CompletionPeriodFromJson(Map json) => Map _$CompletionPeriodToJson(CompletionPeriod instance) => { 'id': instance.id, - 'unlockTime': instance.unlockTime.toJson(), - 'lockTime': instance.lockTime.toJson(), + 'unlockTime': instance.unlockTime, + 'lockTime': instance.lockTime, }; diff --git a/core/lib/src/util/analytics.g.dart b/core/lib/src/util/analytics.g.dart index c512b03a3..139c61ba4 100644 --- a/core/lib/src/util/analytics.g.dart +++ b/core/lib/src/util/analytics.g.dart @@ -13,18 +13,9 @@ StudyUAnalytics _$StudyUAnalyticsFromJson(Map json) => (json['samplingRate'] as num?)?.toDouble(), ); -Map _$StudyUAnalyticsToJson(StudyUAnalytics instance) { - final val = { - 'enabled': instance.enabled, - 'dsn': instance.dsn, - }; - - void writeNotNull(String key, dynamic value) { - if (value != null) { - val[key] = value; - } - } - - writeNotNull('samplingRate', instance.samplingRate); - return val; -} +Map _$StudyUAnalyticsToJson(StudyUAnalytics instance) => + { + 'enabled': instance.enabled, + 'dsn': instance.dsn, + 'samplingRate': instance.samplingRate, + }; diff --git a/designer_v2/analysis_options.yaml b/designer_v2/analysis_options.yaml index 0310d91c6..76e535897 100644 --- a/designer_v2/analysis_options.yaml +++ b/designer_v2/analysis_options.yaml @@ -1,5 +1,8 @@ include: ../analysis_options.yaml analyzer: + errors: + avoid_classes_with_only_static_members: ignore + unsafe_html: ignore plugins: - custom_lint diff --git a/designer_v2/integration_test/app_test.dart b/designer_v2/integration_test/app_test.dart index 1dc1673e5..de622cd95 100644 --- a/designer_v2/integration_test/app_test.dart +++ b/designer_v2/integration_test/app_test.dart @@ -1,13 +1,13 @@ import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_test/flutter_test.dart'; -import 'package:patrol_finders/patrol_finders.dart'; +import 'package:flutter_web_plugins/url_strategy.dart'; import 'package:integration_test/integration_test.dart'; +import 'package:patrol_finders/patrol_finders.dart'; import 'package:studyu_designer_v2/features/app.dart'; -import 'package:studyu_flutter_common/studyu_flutter_common.dart'; import 'package:studyu_designer_v2/utils/performance.dart'; -import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:flutter_web_plugins/url_strategy.dart'; +import 'package:studyu_flutter_common/studyu_flutter_common.dart'; import 'robots/robots.dart'; diff --git a/designer_v2/integration_test/robots/study_info_robot.dart b/designer_v2/integration_test/robots/study_info_robot.dart index 15eb8f9a4..85944e89b 100644 --- a/designer_v2/integration_test/robots/study_info_robot.dart +++ b/designer_v2/integration_test/robots/study_info_robot.dart @@ -17,7 +17,7 @@ class StudyInfoRobot { .which((widget) => widget.decoration is InputDecoration && widget.decoration!.hintText != null && - widget.decoration!.hintText! == tr.form_field_study_title) + widget.decoration!.hintText! == tr.form_field_study_title,) .scrollTo() .enterText(studyName); } @@ -27,7 +27,7 @@ class StudyInfoRobot { .which((widget) => widget.decoration is InputDecoration && widget.decoration!.hintText != null && - widget.decoration!.hintText! == tr.form_field_study_description_hint) + widget.decoration!.hintText! == tr.form_field_study_description_hint,) .scrollTo() .enterText(studyDescription); } @@ -37,7 +37,7 @@ class StudyInfoRobot { .which((widget) => widget.decoration is InputDecoration && widget.decoration!.hintText != null && - widget.decoration!.hintText! == tr.form_field_organization) + widget.decoration!.hintText! == tr.form_field_organization,) .scrollTo() .enterText(orgName); } @@ -47,7 +47,7 @@ class StudyInfoRobot { .which((widget) => widget.decoration is InputDecoration && widget.decoration!.hintText != null && - widget.decoration!.hintText! == tr.form_field_review_board) + widget.decoration!.hintText! == tr.form_field_review_board,) .scrollTo() .enterText(irbName); } @@ -57,7 +57,7 @@ class StudyInfoRobot { .which((widget) => widget.decoration is InputDecoration && widget.decoration!.hintText != null && - widget.decoration!.hintText! == tr.form_field_review_board_number) + widget.decoration!.hintText! == tr.form_field_review_board_number,) .scrollTo() .enterText(irbNumber); } @@ -67,7 +67,7 @@ class StudyInfoRobot { .which((widget) => widget.decoration is InputDecoration && widget.decoration!.hintText != null && - widget.decoration!.hintText! == tr.form_field_researchers) + widget.decoration!.hintText! == tr.form_field_researchers,) .scrollTo() .enterText(personName); } @@ -77,7 +77,7 @@ class StudyInfoRobot { .which((widget) => widget.decoration is InputDecoration && widget.decoration!.hintText != null && - widget.decoration!.hintText! == tr.form_field_website) + widget.decoration!.hintText! == tr.form_field_website,) .scrollTo() .enterText(website); } @@ -87,7 +87,7 @@ class StudyInfoRobot { .which((widget) => widget.decoration is InputDecoration && widget.decoration!.hintText != null && - widget.decoration!.hintText! == tr.form_field_contact_email) + widget.decoration!.hintText! == tr.form_field_contact_email,) .scrollTo() .enterText(emailAddress); } @@ -97,7 +97,7 @@ class StudyInfoRobot { .which((widget) => widget.decoration is InputDecoration && widget.decoration!.hintText != null && - widget.decoration!.hintText! == tr.form_field_contact_phone) + widget.decoration!.hintText! == tr.form_field_contact_phone,) .scrollTo() .enterText(phoneNumber); } diff --git a/designer_v2/integration_test/robots/study_interventions_robot.dart b/designer_v2/integration_test/robots/study_interventions_robot.dart index ccc3bbc0a..ebbeebb8d 100644 --- a/designer_v2/integration_test/robots/study_interventions_robot.dart +++ b/designer_v2/integration_test/robots/study_interventions_robot.dart @@ -29,7 +29,7 @@ class StudyInterventionsRobot { .which((widget) => widget.decoration is InputDecoration && widget.decoration!.hintText != null && - widget.decoration!.hintText! == tr.form_field_intervention_title) + widget.decoration!.hintText! == tr.form_field_intervention_title,) .scrollTo() .enterText(interventionName); } @@ -39,7 +39,7 @@ class StudyInterventionsRobot { .which((widget) => widget.decoration is InputDecoration && widget.decoration!.hintText != null && - widget.decoration!.hintText! == tr.form_field_intervention_description_hint) + widget.decoration!.hintText! == tr.form_field_intervention_description_hint,) .scrollTo() .enterText(interventionDescription); } @@ -49,7 +49,7 @@ class StudyInterventionsRobot { .which((widget) => widget.decoration is InputDecoration && widget.decoration!.hintText != null && - widget.decoration!.hintText! == tr.form_field_intervention_task_title) + widget.decoration!.hintText! == tr.form_field_intervention_task_title,) .scrollTo() .enterText(taskName); } @@ -59,7 +59,7 @@ class StudyInterventionsRobot { .which((widget) => widget.decoration is InputDecoration && widget.decoration!.hintText != null && - widget.decoration!.hintText! == tr.form_field_intervention_task_description_hint) + widget.decoration!.hintText! == tr.form_field_intervention_task_description_hint,) .scrollTo() .enterText(taskDescription); } diff --git a/designer_v2/integration_test/robots/study_measurements_robot.dart b/designer_v2/integration_test/robots/study_measurements_robot.dart index 929c76add..900d34327 100644 --- a/designer_v2/integration_test/robots/study_measurements_robot.dart +++ b/designer_v2/integration_test/robots/study_measurements_robot.dart @@ -29,7 +29,7 @@ class StudyMeasurementsRobot { .which((widget) => widget.decoration is InputDecoration && widget.decoration!.hintText != null && - widget.decoration!.hintText! == tr.form_field_measurement_survey_title) + widget.decoration!.hintText! == tr.form_field_measurement_survey_title,) .scrollTo() .enterText(surveyName); } @@ -39,7 +39,7 @@ class StudyMeasurementsRobot { .which((widget) => widget.decoration is InputDecoration && widget.decoration!.hintText != null && - widget.decoration!.hintText! == tr.form_field_measurement_survey_intro_text_hint) + widget.decoration!.hintText! == tr.form_field_measurement_survey_intro_text_hint,) .scrollTo() .enterText(introText); } @@ -49,7 +49,7 @@ class StudyMeasurementsRobot { .which((widget) => widget.decoration is InputDecoration && widget.decoration!.hintText != null && - widget.decoration!.hintText! == tr.form_field_measurement_survey_outro_text_hint) + widget.decoration!.hintText! == tr.form_field_measurement_survey_outro_text_hint,) .scrollTo() .enterText(outroText); } @@ -59,7 +59,7 @@ class StudyMeasurementsRobot { .which((widget) => widget.decoration is InputDecoration && widget.decoration!.hintText != null && - widget.decoration!.hintText! == tr.form_field_question) + widget.decoration!.hintText! == tr.form_field_question,) .scrollTo() .enterText(questionText); } @@ -69,7 +69,7 @@ class StudyMeasurementsRobot { .which((widget) => widget.decoration is InputDecoration && widget.decoration!.hintText != null && - widget.decoration!.hintText! == tr.form_array_response_options_choice_hint) + widget.decoration!.hintText! == tr.form_array_response_options_choice_hint,) .at(0) .scrollTo() .enterText(optionText); @@ -80,7 +80,7 @@ class StudyMeasurementsRobot { .which((widget) => widget.decoration is InputDecoration && widget.decoration!.hintText != null && - widget.decoration!.hintText! == tr.form_array_response_options_choice_hint) + widget.decoration!.hintText! == tr.form_array_response_options_choice_hint,) .at(1) .scrollTo() .enterText(optionText); diff --git a/designer_v2/lib/common_views/action_inline_menu.dart b/designer_v2/lib/common_views/action_inline_menu.dart index fb60e19d5..009f00fc5 100644 --- a/designer_v2/lib/common_views/action_inline_menu.dart +++ b/designer_v2/lib/common_views/action_inline_menu.dart @@ -3,15 +3,16 @@ import 'package:studyu_designer_v2/common_views/mouse_events.dart'; import 'package:studyu_designer_v2/utils/model_action.dart'; class ActionMenuInline extends StatelessWidget { - const ActionMenuInline( - {required this.actions, - this.splashRadius = 18.0, - this.iconSize, - this.iconColor, - this.visible = true, - this.paddingHorizontal = 2.0, - this.paddingVertical = 0.0, - super.key}); + const ActionMenuInline({ + required this.actions, + this.splashRadius = 18.0, + this.iconSize, + this.iconColor, + this.visible = true, + this.paddingHorizontal = 2.0, + this.paddingVertical = 0.0, + super.key, + }); final List actions; final WidgetStateProperty? iconColor; @@ -30,31 +31,42 @@ class ActionMenuInline extends StatelessWidget { final theme = Theme.of(context); - defaultIconColor(Set states) { + Color defaultIconColor(Set states) { if (states.contains(WidgetState.hovered)) { return theme.colorScheme.secondary.withOpacity(0.8); } return theme.colorScheme.secondary.withOpacity(0.4); } - final actionButtons = actions.map((action) { + final actionButtons = actions.map((ModelAction action) { return Tooltip( - message: action.label, - child: MouseEventsRegion(builder: (context, state) { + message: action.label, + child: MouseEventsRegion( + builder: (context, state) { return IconButton( - padding: EdgeInsets.zero, - splashRadius: splashRadius, - onPressed: () => action.onExecute(), - iconSize: iconSize ?? theme.iconTheme.size ?? 16.0, - icon: Icon(action.icon, - color: iconColor?.resolve(state) ?? (action.isDestructive ? Colors.red : defaultIconColor(state)))); - })); + padding: EdgeInsets.zero, + splashRadius: splashRadius, + onPressed: () => action.onExecute(), + iconSize: iconSize ?? theme.iconTheme.size ?? 16.0, + icon: Icon( + action.icon, + color: iconColor?.resolve(state) ?? + (action.isDestructive + ? Colors.red + : defaultIconColor(state)), + ), + ); + }, + ), + ); }).toList(); return Padding( - padding: EdgeInsets.symmetric(horizontal: paddingHorizontal ?? 0, vertical: paddingVertical ?? 0), + padding: EdgeInsets.symmetric( + horizontal: paddingHorizontal ?? 0, + vertical: paddingVertical ?? 0, + ), child: Row( - crossAxisAlignment: CrossAxisAlignment.center, children: actionButtons, ), ); diff --git a/designer_v2/lib/common_views/action_popup_menu.dart b/designer_v2/lib/common_views/action_popup_menu.dart index f9f0df2fd..b312f89b8 100644 --- a/designer_v2/lib/common_views/action_popup_menu.dart +++ b/designer_v2/lib/common_views/action_popup_menu.dart @@ -19,7 +19,7 @@ class ActionPopUpMenuButton extends StatelessWidget { this.disableSplashEffect = false, this.hideOnEmpty = true, this.enabled = true, - super.key}); + super.key,}); final List actions; final Color? triggerIconColor; @@ -50,11 +50,11 @@ class ActionPopUpMenuButton extends StatelessWidget { highlightColor: Colors.transparent, hoverColor: Colors.transparent, ), - child: popupMenu); + child: popupMenu,); } return widget; - }); + },); } Widget _buildPopupMenu(BuildContext context, Set state) { @@ -65,7 +65,7 @@ class ActionPopUpMenuButton extends StatelessWidget { final triggerIcon = (orientation == Axis.vertical) ? Icons.more_vert_rounded : Icons.more_horiz_rounded; return PopupMenuButton( - icon: Icon(triggerIcon, size: triggerIconSize, color: (isHovered) ? iconColorHover : iconColorDefault), + icon: Icon(triggerIcon, size: triggerIconSize, color: isHovered ? iconColorHover : iconColorDefault), enabled: enabled, elevation: elevation, splashRadius: splashRadius, @@ -77,19 +77,19 @@ class ActionPopUpMenuButton extends StatelessWidget { return PopupMenuItem( value: action, child: ListTile( - contentPadding: const EdgeInsets.symmetric(horizontal: 8.0, vertical: 0), + contentPadding: const EdgeInsets.symmetric(horizontal: 8.0), horizontalTitleGap: 4.0, leading: (action.icon == null) ? const SizedBox.shrink() : Icon(action.icon, size: theme.iconTheme.size ?? 14.0, - color: action.isDestructive ? Colors.red : iconColorDefault), + color: action.isDestructive ? Colors.red : iconColorDefault,), title: action.isDestructive ? Text(action.label, style: textTheme.copyWith(color: Colors.red)) : Text(action.label, style: textTheme), ), ); }).toList(); - }); + },); } } diff --git a/designer_v2/lib/common_views/badge.dart b/designer_v2/lib/common_views/badge.dart index 547e2720a..de46b62d3 100644 --- a/designer_v2/lib/common_views/badge.dart +++ b/designer_v2/lib/common_views/badge.dart @@ -47,16 +47,13 @@ class Badge extends StatelessWidget { padding: padding, child: Row( mainAxisAlignment: center ? MainAxisAlignment.center : MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.center, children: [ - (icon != null) - ? Icon( + if (icon != null) Icon( icon, size: iconSize ?? ((theme.iconTheme.size ?? 14.0) * 0.8), color: _getLabelColor(theme)?.faded(0.65), - ) - : const SizedBox.shrink(), - (icon != null) ? const SizedBox(width: 8.0) : const SizedBox.shrink(), + ) else const SizedBox.shrink(), + if (icon != null) const SizedBox(width: 8.0) else const SizedBox.shrink(), Expanded( child: Text( label, @@ -70,12 +67,12 @@ class Badge extends StatelessWidget { fontWeight: FontWeight.bold, ) .merge(labelStyle), - )), + ),), ], ), ), ), - )); + ),); } Color? _getBackgroundColor(ThemeData theme) { diff --git a/designer_v2/lib/common_views/banner.dart b/designer_v2/lib/common_views/banner.dart index 4b072f78b..5a98ad01f 100644 --- a/designer_v2/lib/common_views/banner.dart +++ b/designer_v2/lib/common_views/banner.dart @@ -10,17 +10,18 @@ abstract class IWithBanner { enum BannerStyle { warning, info, error } class BannerBox extends StatefulWidget { - const BannerBox( - {required this.body, - required this.style, - this.padding = const EdgeInsets.symmetric(vertical: 18.0, horizontal: 48.0), - this.prefixIcon, - this.noPrefix = false, - this.isDismissed, - this.dismissable = true, - this.onDismissed, - this.dismissIconSize = 24.0, - super.key}); + const BannerBox({ + required this.body, + required this.style, + this.padding = const EdgeInsets.symmetric(vertical: 18.0, horizontal: 48.0), + this.prefixIcon, + this.noPrefix = false, + this.isDismissed, + this.dismissable = true, + this.onDismissed, + this.dismissIconSize = 24.0, + super.key, + }); final Widget? prefixIcon; final Widget body; @@ -73,26 +74,31 @@ class _BannerBoxState extends State { child: Row( children: [ Expanded( - child: Wrap( - crossAxisAlignment: WrapCrossAlignment.center, - children: [ - (widget.noPrefix) ? const SizedBox.shrink() : icon, - (widget.noPrefix) ? const SizedBox.shrink() : const SizedBox(width: 24.0), - Opacity( - opacity: 0.85, - child: widget.body, - ), - ], - )), + child: Wrap( + crossAxisAlignment: WrapCrossAlignment.center, + children: [ + if (widget.noPrefix) const SizedBox.shrink() else icon, + if (widget.noPrefix) + const SizedBox.shrink() + else + const SizedBox(width: 24.0), + Opacity( + opacity: 0.85, + child: widget.body, + ), + ], + ), + ), SizedBox( height: double.infinity, child: Opacity( opacity: 0.5, child: IconButton( - icon: Icon(Icons.close_rounded, size: widget.dismissIconSize), + icon: + Icon(Icons.close_rounded, size: widget.dismissIconSize), splashRadius: widget.dismissIconSize, onPressed: () => setState(() { - if (widget.onDismissed != null) widget.onDismissed!(); + widget.onDismissed?.call(); isDismissed = true; }), ), diff --git a/designer_v2/lib/common_views/collapse.dart b/designer_v2/lib/common_views/collapse.dart index 76627f837..d1940047f 100644 --- a/designer_v2/lib/common_views/collapse.dart +++ b/designer_v2/lib/common_views/collapse.dart @@ -3,7 +3,7 @@ import 'package:studyu_designer_v2/common_views/form_table_layout.dart'; import 'package:studyu_designer_v2/common_views/mouse_events.dart'; import 'package:studyu_designer_v2/common_views/utils.dart'; -import '../theme.dart'; +import 'package:studyu_designer_v2/theme.dart'; typedef CollapsibleSectionBuilder = Widget Function(BuildContext context, bool isCollapsed); @@ -22,7 +22,7 @@ class Collapsible extends StatefulWidget { this.maintainState = true, super.key, }) : assert((headerBuilder != null && title == null) || (headerBuilder == null && title != null), - "Must provide either headerBuilder or title"); + "Must provide either headerBuilder or title",); final CollapsibleSectionBuilder contentBuilder; final CollapsibleSectionBuilder? headerBuilder; @@ -57,7 +57,7 @@ class _CollapsibleState extends State { child: Row( children: [ FormLabel( - labelText: widget.title!, + labelText: widget.title, //labelTextStyle: TextStyle(color: actualColor), ), const SizedBox(width: 4.0), @@ -80,7 +80,7 @@ class _CollapsibleState extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ headerWidget, - !isCollapsed ? contentWidget : const SizedBox.shrink(), + if (!isCollapsed) contentWidget else const SizedBox.shrink(), ], ); } diff --git a/designer_v2/lib/common_views/constrained_flexible.dart b/designer_v2/lib/common_views/constrained_flexible.dart index fcec8cdac..0441f9033 100644 --- a/designer_v2/lib/common_views/constrained_flexible.dart +++ b/designer_v2/lib/common_views/constrained_flexible.dart @@ -10,7 +10,7 @@ class ConstrainedWidthFlexible extends StatelessWidget { required this.flexSum, required this.outerConstraints, required this.child, - super.key}); + super.key,}); final double minWidth; final double maxWidth; diff --git a/designer_v2/lib/common_views/dialog.dart b/designer_v2/lib/common_views/dialog.dart index 431fa4500..579200342 100644 --- a/designer_v2/lib/common_views/dialog.dart +++ b/designer_v2/lib/common_views/dialog.dart @@ -63,10 +63,9 @@ class StandardDialog extends StatelessWidget { boxShadow: [ BoxShadow( color: theme.shadowColor, - spreadRadius: 0, blurRadius: 3, offset: const Offset(1, 1), - ) + ), ], ), child: Container( @@ -94,8 +93,8 @@ class StandardDialog extends StatelessWidget { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - (titleWidget != null) ? titleWidget : const SizedBox.shrink(), - (titleWidget != null) ? SizedBox(height: padding.top * 2 / 3) : const SizedBox.shrink(), + if (titleWidget != null) titleWidget else const SizedBox.shrink(), + if (titleWidget != null) SizedBox(height: padding.top * 2 / 3) else const SizedBox.shrink(), Expanded( child: SingleChildScrollView(child: body), ), diff --git a/designer_v2/lib/common_views/empty_body.dart b/designer_v2/lib/common_views/empty_body.dart index bff2fd096..75fb3a296 100644 --- a/designer_v2/lib/common_views/empty_body.dart +++ b/designer_v2/lib/common_views/empty_body.dart @@ -26,40 +26,50 @@ class EmptyBody extends StatelessWidget { child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ - (leading != null) ? leading! : const SizedBox.shrink(), - (leading != null) ? SizedBox(height: leadingSpacing!) : const SizedBox.shrink(), - (icon != null) - ? Padding( - padding: const EdgeInsets.only(bottom: 0.0), - child: Icon( - icon, - size: 96.0, - color: theme.colorScheme.secondary, - )) - : const SizedBox.shrink(), - (title != null) - ? Padding( - padding: const EdgeInsets.symmetric(vertical: 6.0), - child: SelectableText( - title!, - textAlign: TextAlign.center, - style: theme.textTheme.headlineMedium, - ), - ) - : const SizedBox.shrink(), - (description != null) - ? SelectableText(description!, - textAlign: TextAlign.center, - style: theme.textTheme.bodyMedium?.copyWith( - color: theme.textTheme.bodyMedium?.color?.faded(0.9), - )) - : const SizedBox.shrink(), - (button != null) - ? Padding( - padding: const EdgeInsets.fromLTRB(0, 20.0, 0, 16.0), - child: button, - ) - : const SizedBox.shrink(), + if (leading != null) leading! else const SizedBox.shrink(), + if (leading != null) + SizedBox(height: leadingSpacing) + else + const SizedBox.shrink(), + if (icon != null) + Padding( + padding: EdgeInsets.zero, + child: Icon( + icon, + size: 96.0, + color: theme.colorScheme.secondary, + ), + ) + else + const SizedBox.shrink(), + if (title != null) + Padding( + padding: const EdgeInsets.symmetric(vertical: 6.0), + child: SelectableText( + title!, + textAlign: TextAlign.center, + style: theme.textTheme.headlineMedium, + ), + ) + else + const SizedBox.shrink(), + if (description != null) + SelectableText( + description!, + textAlign: TextAlign.center, + style: theme.textTheme.bodyMedium?.copyWith( + color: theme.textTheme.bodyMedium?.color?.faded(0.9), + ), + ) + else + const SizedBox.shrink(), + if (button != null) + Padding( + padding: const EdgeInsets.fromLTRB(0, 20.0, 0, 16.0), + child: button, + ) + else + const SizedBox.shrink(), ], ), ); diff --git a/designer_v2/lib/common_views/form_buttons.dart b/designer_v2/lib/common_views/form_buttons.dart index d859da87b..fdcb9a72b 100644 --- a/designer_v2/lib/common_views/form_buttons.dart +++ b/designer_v2/lib/common_views/form_buttons.dart @@ -46,7 +46,7 @@ class DismissButton extends StatelessWidget { Navigator.maybePop(context); } }, - )); + ),); } } @@ -56,8 +56,8 @@ List buildFormButtons(FormViewModel formViewModel, FormMode formMode) { builder: (context, form, child) { return retainSizeInAppBar(DismissButton( onPressed: () => formViewModel.cancel().then((_) => Navigator.maybePop(context)), - )); - }), + ),); + },), ReactiveFormConsumer(// enable re-rendering based on form validation status builder: (context, form, child) { return retainSizeInAppBar(PrimaryButton( @@ -68,9 +68,9 @@ List buildFormButtons(FormViewModel formViewModel, FormMode formMode) { onPressedFuture: (formViewModel.isValid) ? () => formViewModel.save().then( // Close the form (side sheet or scaffold route) if future // completed successfully - (value) => Navigator.maybePop(context)) : null, - )); - }), + (value) => Navigator.maybePop(context),) : null, + ),); + },), ]; final readonlyActionButtons = [ ReactiveFormConsumer(// enable re-rendering based on form validation status @@ -78,8 +78,8 @@ List buildFormButtons(FormViewModel formViewModel, FormMode formMode) { return retainSizeInAppBar(DismissButton( text: tr.dialog_close, onPressed: () => Navigator.maybePop(context), - )); - }), + ),); + },), ]; final defaultActionButtons = { diff --git a/designer_v2/lib/common_views/form_consumer_widget.dart b/designer_v2/lib/common_views/form_consumer_widget.dart index 02e5dfa7a..82319ac42 100644 --- a/designer_v2/lib/common_views/form_consumer_widget.dart +++ b/designer_v2/lib/common_views/form_consumer_widget.dart @@ -35,7 +35,7 @@ class _FormConsumerWidgetState extends State { Widget build(BuildContext context) { return ReactiveFormConsumer(builder: (context, form, _) { return widget.build(context, form); - }); + },); } } @@ -55,6 +55,6 @@ class _FormConsumerRefWidgetState extends ConsumerState { Widget build(BuildContext context) { return ReactiveFormConsumer(builder: (context, form, _) { return widget.build(context, form, ref); - }); + },); } } diff --git a/designer_v2/lib/common_views/form_control_label.dart b/designer_v2/lib/common_views/form_control_label.dart index f8aa37554..38d9d2f4b 100644 --- a/designer_v2/lib/common_views/form_control_label.dart +++ b/designer_v2/lib/common_views/form_control_label.dart @@ -2,16 +2,19 @@ import 'package:flutter/material.dart'; import 'package:reactive_forms/reactive_forms.dart'; import 'package:studyu_designer_v2/common_views/mouse_events.dart'; -typedef FormControlVoidCallback = void Function(AbstractControl formControl); +typedef FormControlVoidCallback = void Function( + AbstractControl formControl, +); class FormControlLabel extends StatelessWidget { - const FormControlLabel( - {required this.formControl, - required this.text, - this.textStyle, - this.isClickable = true, - this.onClick, - super.key}); + const FormControlLabel({ + required this.formControl, + required this.text, + this.textStyle, + this.isClickable = true, + this.onClick, + super.key, + }); final AbstractControl formControl; final String text; @@ -22,13 +25,16 @@ class FormControlLabel extends StatelessWidget { @override Widget build(BuildContext context) { final theme = Theme.of(context); - final stateColorStyle = (formControl.disabled) ? TextStyle(color: theme.disabledColor) : null; + final stateColorStyle = + (formControl.disabled) ? TextStyle(color: theme.disabledColor) : null; return MouseEventsRegion( builder: (context, states) { return Text( text, - style: theme.textTheme.bodySmall?.merge(textStyle).merge(stateColorStyle), + style: theme.textTheme.bodySmall + ?.merge(textStyle) + .merge(stateColorStyle), overflow: TextOverflow.clip, ); }, @@ -40,7 +46,8 @@ class FormControlLabel extends StatelessWidget { } else { if (formControl is AbstractControl) { // Auto-toggle boolean controls - formControl.value = (formControl.value != null) ? !(formControl.value!) : true; + formControl.value = + formControl.value == null || !(formControl.value as bool); formControl.markAsDirty(); } else { // Otherwise just focus the control diff --git a/designer_v2/lib/common_views/form_scaffold.dart b/designer_v2/lib/common_views/form_scaffold.dart index 279ffd02f..7d8e09bb6 100644 --- a/designer_v2/lib/common_views/form_scaffold.dart +++ b/designer_v2/lib/common_views/form_scaffold.dart @@ -10,21 +10,24 @@ import 'package:studyu_designer_v2/theme.dart'; /// Signature for a builder that renders the widget corresponding to the /// [FormViewModel] of type [T] -typedef FormViewBuilder = Widget Function(T formViewModel); +typedef FormViewBuilder = Widget Function( + T formViewModel,); /// Signature for a builder that resolves the [FormViewModel] of type [T] /// via a Riverpod [WidgetRef] -typedef FormViewModelBuilder = T Function(WidgetRef ref); +typedef FormViewModelBuilder = T Function( + WidgetRef ref,); class FormScaffold extends ConsumerStatefulWidget { - const FormScaffold( - {required this.formViewModel, - required this.body, - this.actions, - this.drawer, - this.actionsSpacing = 8.0, - this.actionsPadding = 24.0, - super.key}); + const FormScaffold({ + required this.formViewModel, + required this.body, + this.actions, + this.drawer, + this.actionsSpacing = 8.0, + this.actionsPadding = 24.0, + super.key, + }); final T formViewModel; final List? actions; @@ -37,7 +40,8 @@ class FormScaffold extends ConsumerStatefulWidget { ConsumerState> createState() => _FormScaffoldState(); } -class _FormScaffoldState extends ConsumerState> implements PopEntry { +class _FormScaffoldState + extends ConsumerState> implements PopEntry { T get formViewModel => widget.formViewModel; ModalRoute? _route; @@ -87,36 +91,41 @@ class _FormScaffoldState extends ConsumerState? iconPack}) { + static IconOption? resolveIconByName( + String? name, { + List? iconPack, + }) { iconPack ??= IconPack.defaultPack; if (name == null || name.isEmpty) { return null; @@ -48,14 +51,15 @@ class IconOption extends Equatable { List get props => [name]; String toJson() => name; - static IconOption fromJson(String json) => IconOption(json); + IconOption fromJson(String json) => IconOption(json); } -class ReactiveIconPicker extends ReactiveFocusableFormField { +class ReactiveIconPicker + extends ReactiveFocusableFormField { ReactiveIconPicker({ - required iconOptions, - selectedIconSize = 20.0, - galleryIconSize = 28.0, + required List iconOptions, + double? selectedIconSize = 20.0, + double? galleryIconSize = 28.0, bool readOnly = false, ReactiveFormFieldCallback? onSelect, super.formControl, @@ -64,11 +68,12 @@ class ReactiveIconPicker extends ReactiveFocusableFormField field) { - // Unsupported: showErrors, validationMessages - final isDisabled = readOnly || field.control.disabled; + }) : super( + builder: (ReactiveFormFieldState field) { + // Unsupported: showErrors, validationMessages + final isDisabled = readOnly || field.control.disabled; - return IconPicker( + return IconPicker( iconOptions: iconOptions, isDisabled: isDisabled, focusNode: focusNode, @@ -79,8 +84,10 @@ class ReactiveIconPicker extends ReactiveFocusableFormField iconOptions; @@ -144,25 +152,36 @@ class IconPickerField extends StatelessWidget { @override Widget build(BuildContext context) { - final actualGalleryIconSize = galleryIconSize ?? Theme.of(context).iconTheme.size ?? 24.0; - final actualSelectedIconSize = selectedIconSize ?? Theme.of(context).iconTheme.size ?? 16.0; - - openIconPicker() => showIconPickerDialog(context, - iconOptions: iconOptions, galleryIconSize: actualGalleryIconSize, onSelect: onSelect); + final actualGalleryIconSize = + galleryIconSize ?? Theme.of(context).iconTheme.size ?? 24.0; + final actualSelectedIconSize = + selectedIconSize ?? Theme.of(context).iconTheme.size ?? 16.0; + + Future openIconPicker() => showIconPickerDialog( + context, + iconOptions: iconOptions, + galleryIconSize: actualGalleryIconSize, + onSelect: onSelect, + ); if (selectedOption != null && !selectedOption!.isEmpty) { - final selectedIcon = - selectedOption?.icon ?? IconPack.resolveIconByName(selectedOption!.name, iconPack: iconOptions)!.icon; + final selectedIcon = selectedOption?.icon ?? + IconPack.resolveIconByName( + selectedOption!.name, + iconPack: iconOptions, + )! + .icon; return IconButton( - tooltip: tr.iconpicker_nonempty_prompt, - splashRadius: actualSelectedIconSize, - onPressed: (isDisabled) ? null : openIconPicker, - focusNode: focusNode, - icon: Icon(selectedIcon, size: actualSelectedIconSize)); + tooltip: tr.iconpicker_nonempty_prompt, + splashRadius: actualSelectedIconSize, + onPressed: isDisabled ? null : openIconPicker, + focusNode: focusNode, + icon: Icon(selectedIcon, size: actualSelectedIconSize), + ); } return TextButton( - onPressed: (isDisabled) ? null : openIconPicker, + onPressed: isDisabled ? null : openIconPicker, focusNode: focusNode, child: Text(tr.iconpicker_empty_prompt), ); @@ -170,7 +189,12 @@ class IconPickerField extends StatelessWidget { } class IconPickerGallery extends StatelessWidget { - const IconPickerGallery({required this.iconOptions, required this.iconSize, this.onSelect, super.key}); + const IconPickerGallery({ + required this.iconOptions, + required this.iconSize, + this.onSelect, + super.key, + }); final List iconOptions; final VoidCallbackOn? onSelect; @@ -181,24 +205,28 @@ class IconPickerGallery extends StatelessWidget { final List iconWidgets = []; for (final iconOption in iconOptions) { final iconWidget = MouseEventsRegion( - builder: (context, state) { - final isHovered = state.contains(WidgetState.hovered); - return Container( - color: isHovered ? Theme.of(context).colorScheme.primary.withOpacity(0.2) : null, - child: Icon(iconOption.icon!, size: iconSize), - ); - }, - onTap: () => Navigator.pop(context, iconOption)); + builder: (context, state) { + final isHovered = state.contains(WidgetState.hovered); + return Container( + color: isHovered + ? Theme.of(context).colorScheme.primary.withOpacity(0.2) + : null, + child: Icon(iconOption.icon, size: iconSize), + ); + }, + onTap: () => Navigator.pop(context, iconOption), + ); iconWidgets.add(iconWidget); } return GridView.extent( - primary: false, - maxCrossAxisExtent: iconSize * 2, - crossAxisSpacing: 4.0, - mainAxisSpacing: 4.0, - //padding: const EdgeInsets.all(12.0), - children: iconWidgets); + primary: false, + maxCrossAxisExtent: iconSize * 2, + crossAxisSpacing: 4.0, + mainAxisSpacing: 4.0, + //padding: const EdgeInsets.all(12.0), + children: iconWidgets, + ); } } @@ -207,10 +235,10 @@ Future showIconPickerDialog( required List iconOptions, double? galleryIconSize, VoidCallbackOn? onSelect, - minWidth = 300, - minHeight = 300, + double minWidth = 300, + double minHeight = 300, }) async { - IconOption? iconPicked = await showDialog( + final IconOption? iconPicked = await showDialog( context: context, builder: (BuildContext context) { final theme = Theme.of(context); @@ -218,18 +246,22 @@ Future showIconPickerDialog( final dialogHeight = MediaQuery.of(context).size.height * 0.4; return StandardDialog( - body: SizedBox( - width: max(dialogWidth, minWidth), - height: max(dialogHeight, minHeight), - child: IconPickerGallery(iconOptions: iconOptions, iconSize: galleryIconSize ?? 48.0), + body: SizedBox( + width: max(dialogWidth, minWidth), + height: max(dialogHeight, minHeight), + child: IconPickerGallery( + iconOptions: iconOptions, + iconSize: galleryIconSize ?? 48.0, + ), + ), + title: SelectableText( + tr.iconpicker_dialog_title, + style: theme.textTheme.headlineSmall?.copyWith( + fontWeight: FontWeight.normal, + color: theme.colorScheme.onPrimaryContainer, ), - title: SelectableText( - tr.iconpicker_dialog_title, - style: theme.textTheme.headlineSmall?.copyWith( - fontWeight: FontWeight.normal, - color: theme.colorScheme.onPrimaryContainer, - ), - )); + ), + ); }, ); diff --git a/designer_v2/lib/common_views/layout_single_column.dart b/designer_v2/lib/common_views/layout_single_column.dart index 62b68d5af..43317d269 100644 --- a/designer_v2/lib/common_views/layout_single_column.dart +++ b/designer_v2/lib/common_views/layout_single_column.dart @@ -1,4 +1,5 @@ import 'dart:math'; + import 'package:flutter/material.dart'; import 'package:studyu_designer_v2/common_views/layout_two_column.dart'; import 'package:studyu_designer_v2/theme.dart'; @@ -38,11 +39,11 @@ class SingleColumnLayout extends StatefulWidget { final bool scroll; final EdgeInsets? padding; - static fromType({ + factory SingleColumnLayout.fromType({ required SingleColumnLayoutType type, required Widget body, required BuildContext context, - stickyHeader = false, + bool stickyHeader = false, Widget? header, }) { switch (type) { @@ -75,7 +76,6 @@ class SingleColumnLayout extends StatefulWidget { body: body, header: header, stickyHeader: stickyHeader, - constraints: defaultConstraints, ); case SingleColumnLayoutType.boundedNarrow: return SingleColumnLayout( @@ -126,7 +126,8 @@ class _SingleColumnLayoutState extends State { return Scrollbar( thumbVisibility: true, controller: _scrollController, - child: SingleChildScrollView(controller: _scrollController, child: child), + child: + SingleChildScrollView(controller: _scrollController, child: child), ); } @@ -136,7 +137,6 @@ class _SingleColumnLayoutState extends State { } if (widget.header != null) { body = Column( - mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.stretch, children: [ widget.header!, @@ -150,7 +150,6 @@ class _SingleColumnLayoutState extends State { // non-sticky header if (widget.header != null) { body = Column( - mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.stretch, children: [ widget.header!, diff --git a/designer_v2/lib/common_views/layout_two_column.dart b/designer_v2/lib/common_views/layout_two_column.dart index 9d2d854a4..9fb86c0d6 100644 --- a/designer_v2/lib/common_views/layout_two_column.dart +++ b/designer_v2/lib/common_views/layout_two_column.dart @@ -8,7 +8,8 @@ class TwoColumnLayout extends StatefulWidget { this.headerWidget, this.dividerWidget = defaultDivider, this.flexLeft, - this.flexRight = 1, // expand right column to fill available space by default + this.flexRight = + 1, // expand right column to fill available space by default this.constraintsLeft, this.constraintsRight, this.scrollLeft = true, @@ -69,8 +70,8 @@ class TwoColumnLayout extends StatefulWidget { BoxConstraints? constraintsRight, bool scrollLeft = true, bool scrollRight = true, - final EdgeInsets? paddingLeft = TwoColumnLayout.defaultContentPadding, - final EdgeInsets? paddingRight = TwoColumnLayout.defaultContentPadding, + EdgeInsets? paddingLeft = TwoColumnLayout.defaultContentPadding, + EdgeInsets? paddingRight = TwoColumnLayout.defaultContentPadding, }) { return TwoColumnLayout( leftWidget: leftWidget, @@ -112,101 +113,107 @@ class _TwoColumnLayoutState extends State { } if (widget.backgroundColorLeft != null) { - leftWidget = Material(color: widget.backgroundColorLeft, child: leftWidget); + leftWidget = + Material(color: widget.backgroundColorLeft, child: leftWidget); } if (widget.backgroundColorRight != null) { - rightWidget = Material(color: widget.backgroundColorRight, child: rightWidget); + rightWidget = + Material(color: widget.backgroundColorRight, child: rightWidget); } - return LayoutBuilder(builder: (context, constraints) { - if (widget.stretchHeight) { - leftWidget = SizedBox( - height: constraints.maxHeight, - child: leftWidget, - ); - rightWidget = SizedBox( - height: constraints.maxHeight, - child: rightWidget, - ); - } + return LayoutBuilder( + builder: (context, constraints) { + if (widget.stretchHeight) { + leftWidget = SizedBox( + height: constraints.maxHeight, + child: leftWidget, + ); + rightWidget = SizedBox( + height: constraints.maxHeight, + child: rightWidget, + ); + } - if (widget.scrollLeft) { - leftWidget = Scrollbar( - thumbVisibility: true, - controller: _scrollControllerLeft, - child: SingleChildScrollView(controller: _scrollControllerLeft, child: leftWidget), - ); - } - if (widget.scrollRight) { - rightWidget = Scrollbar( - thumbVisibility: true, - controller: _scrollControllerRight, - child: SingleChildScrollView(controller: _scrollControllerRight, child: rightWidget), - ); - } + if (widget.scrollLeft) { + leftWidget = Scrollbar( + thumbVisibility: true, + controller: _scrollControllerLeft, + child: SingleChildScrollView( + controller: _scrollControllerLeft, child: leftWidget,), + ); + } + if (widget.scrollRight) { + rightWidget = Scrollbar( + thumbVisibility: true, + controller: _scrollControllerRight, + child: SingleChildScrollView( + controller: _scrollControllerRight, child: rightWidget,), + ); + } - if (!(widget.constraintsLeft != null && widget.flexLeft != null)) { - if (widget.constraintsLeft != null) { - leftWidget = Container(constraints: widget.constraintsLeft!, child: leftWidget); + if (!(widget.constraintsLeft != null && widget.flexLeft != null)) { + if (widget.constraintsLeft != null) { + leftWidget = Container( + constraints: widget.constraintsLeft, child: leftWidget,); + } + if (widget.flexLeft != null) { + leftWidget = Flexible(flex: widget.flexLeft!, child: leftWidget); + } } - if (widget.flexLeft != null) { - leftWidget = Flexible(flex: widget.flexLeft!, child: leftWidget); + + if (!(widget.constraintsRight != null && widget.flexRight != null)) { + if (widget.constraintsRight != null) { + rightWidget = Container( + constraints: widget.constraintsRight, child: rightWidget,); + } + if (widget.flexRight != null) { + rightWidget = Flexible(flex: widget.flexRight!, child: rightWidget); + } } - } - if (!(widget.constraintsRight != null && widget.flexRight != null)) { - if (widget.constraintsRight != null) { - rightWidget = Container(constraints: widget.constraintsRight!, child: rightWidget); + if (widget.constraintsLeft != null && widget.flexLeft != null) { + leftWidget = ConstrainedWidthFlexible( + minWidth: widget.constraintsLeft?.minWidth ?? double.infinity, + maxWidth: widget.constraintsLeft?.maxWidth ?? double.infinity, + flex: widget.flexLeft!, + flexSum: widget.flexLeft! + (widget.flexRight ?? 0), + outerConstraints: constraints, + child: leftWidget, + ); } - if (widget.flexRight != null) { - rightWidget = Flexible(flex: widget.flexRight!, child: rightWidget); + + if (widget.constraintsRight != null && widget.flexRight != null) { + rightWidget = ConstrainedWidthFlexible( + minWidth: widget.constraintsRight?.minWidth ?? double.infinity, + maxWidth: widget.constraintsRight?.maxWidth ?? double.infinity, + flex: widget.flexRight!, + flexSum: widget.flexRight! + (widget.flexLeft ?? 0), + outerConstraints: constraints, + child: rightWidget, + ); } - } - - if (widget.constraintsLeft != null && widget.flexLeft != null) { - leftWidget = ConstrainedWidthFlexible( - minWidth: widget.constraintsLeft?.minWidth ?? double.infinity, - maxWidth: widget.constraintsLeft?.maxWidth ?? double.infinity, - flex: widget.flexLeft!, - flexSum: widget.flexLeft! + (widget.flexRight ?? 0), - outerConstraints: constraints, - child: leftWidget, - ); - } - - if (widget.constraintsRight != null && widget.flexRight != null) { - rightWidget = ConstrainedWidthFlexible( - minWidth: widget.constraintsRight?.minWidth ?? double.infinity, - maxWidth: widget.constraintsRight?.maxWidth ?? double.infinity, - flex: widget.flexRight!, - flexSum: widget.flexRight! + (widget.flexLeft ?? 0), - outerConstraints: constraints, - child: rightWidget, - ); - } - - Widget body = Row( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - leftWidget, - widget.dividerWidget ?? const SizedBox.shrink(), - rightWidget, - ], - ); - - if (widget.headerWidget != null) { - body = Column( - mainAxisAlignment: MainAxisAlignment.start, + + Widget body = Row( crossAxisAlignment: CrossAxisAlignment.stretch, children: [ - widget.headerWidget!, - body, + leftWidget, + widget.dividerWidget ?? const SizedBox.shrink(), + rightWidget, ], ); - } - return body; - }); + if (widget.headerWidget != null) { + body = Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + widget.headerWidget!, + body, + ], + ); + } + + return body; + }, + ); } } diff --git a/designer_v2/lib/common_views/mouse_events.dart b/designer_v2/lib/common_views/mouse_events.dart index c5306de59..cbcdfcbe1 100644 --- a/designer_v2/lib/common_views/mouse_events.dart +++ b/designer_v2/lib/common_views/mouse_events.dart @@ -1,7 +1,8 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; -typedef MouseEventsRegionBuilder = Widget Function(BuildContext context, Set state); +typedef MouseEventsRegionBuilder = Widget Function( + BuildContext context, Set state); typedef MaterialStatesChangedCallback = void Function(Set state); @@ -9,16 +10,17 @@ typedef MaterialStatesChangedCallback = void Function(Set state); /// for the widget it contains while exposing the current interaction state /// as a [WidgetInteractionState] to the child widget [builder] class MouseEventsRegion extends StatefulWidget { - const MouseEventsRegion( - {required this.builder, - this.onStateChanged, - this.onHover, - this.onTap, - this.onEnter, - this.onExit, - this.cursor = defaultCursor, - this.autoselectCursor = true, - super.key}); + const MouseEventsRegion({ + required this.builder, + this.onStateChanged, + this.onHover, + this.onTap, + this.onEnter, + this.onExit, + this.cursor = defaultCursor, + this.autoselectCursor = true, + super.key, + }); final MouseEventsRegionBuilder builder; final MaterialStatesChangedCallback? onStateChanged; @@ -50,9 +52,7 @@ class _MouseEventsRegionState extends State { late final WidgetStatesController statesController; void handleStatesControllerChange() { - if (widget.onStateChanged != null) { - widget.onStateChanged!(statesController.value); - } + widget.onStateChanged?.call(statesController.value); // Force a rebuild to resolve MaterialStateProperty properties setState(() {}); } @@ -72,25 +72,20 @@ class _MouseEventsRegionState extends State { onTapUp: (_) => statesController.update(WidgetState.pressed, false), onTapCancel: () => statesController.update(WidgetState.pressed, false), child: MouseRegion( - cursor: widget.autoCursor, - onHover: (e) { - if (widget.onHover != null) { - widget.onHover!(e); - } - }, - onEnter: (e) { - statesController.update(WidgetState.hovered, true); - if (widget.onExit != null) { - widget.onEnter!(e); - } - }, - onExit: (e) { - statesController.update(WidgetState.hovered, false); - if (widget.onExit != null) { - widget.onExit!(e); - } - }, - child: widget.builder(context, statesController.value)), + cursor: widget.autoCursor, + onHover: (e) { + widget.onHover?.call(e); + }, + onEnter: (e) { + statesController.update(WidgetState.hovered, true); + widget.onEnter?.call(e); + }, + onExit: (e) { + statesController.update(WidgetState.hovered, false); + widget.onExit?.call(e); + }, + child: widget.builder(context, statesController.value), + ), ); } diff --git a/designer_v2/lib/common_views/navbar_tabbed.dart b/designer_v2/lib/common_views/navbar_tabbed.dart index 0e4a530e8..e54b77608 100644 --- a/designer_v2/lib/common_views/navbar_tabbed.dart +++ b/designer_v2/lib/common_views/navbar_tabbed.dart @@ -25,7 +25,10 @@ class NavbarTab { final bool enabled; } -typedef OnTabSelectCallback = void Function(int tabIdx, T tab); +typedef OnTabSelectCallback = void Function( + int tabIdx, + T tab, +); class TabbedNavbar extends ConsumerStatefulWidget { const TabbedNavbar({ @@ -64,10 +67,12 @@ class TabbedNavbar extends ConsumerStatefulWidget { final Color? unselectedLabelColorHover; @override - ConsumerState createState() => _TabbedNavbarState(); + ConsumerState createState() => + _TabbedNavbarState(); } -class _TabbedNavbarState extends ConsumerState +class _TabbedNavbarState + extends ConsumerState with TickerProviderStateMixin implements Listenable { /// A [TabController] that has its index synced to the currently selected @@ -75,7 +80,8 @@ class _TabbedNavbarState extends ConsumerState _selectedTabIndex; set selectedTabIndex(int idx) { final tab = widget.tabs[idx]; @@ -116,7 +122,7 @@ class _TabbedNavbarState extends ConsumerState extends ConsumerState tabContent, - cursor: SystemMouseCursors.basic, ); if (widget.disabledTooltipText != null) { - return Tooltip(message: widget.disabledTooltipText!, child: disablePointerCursor); + return Tooltip( + message: widget.disabledTooltipText, + child: disablePointerCursor, + ); } return disablePointerCursor; } @@ -195,7 +203,7 @@ class _TabbedNavbarState extends ConsumerState extends ConsumerState extends ConsumerState _onSelectTab(t.index), // pass through on-tap event ), - MouseEventsRegion(builder: (context, states) { - // wrap spacer in mouse region to disable pointer mouse cursor - return Container( - width: widget.labelSpacing, - ); - }), + MouseEventsRegion( + builder: (context, states) { + // wrap spacer in mouse region to disable pointer mouse cursor + return Container( + width: widget.labelSpacing, + ); + }, + ), ], ), ); diff --git a/designer_v2/lib/common_views/primary_button.dart b/designer_v2/lib/common_views/primary_button.dart index 6fb9bc09d..49bae0478 100644 --- a/designer_v2/lib/common_views/primary_button.dart +++ b/designer_v2/lib/common_views/primary_button.dart @@ -12,7 +12,8 @@ class PrimaryButton extends StatefulWidget { this.onPressedFuture, this.enabled = true, this.showLoadingEarliestAfterMs = 100, - this.innerPadding = const EdgeInsets.symmetric(horizontal: 4.0, vertical: 8.0), + this.innerPadding = + const EdgeInsets.symmetric(horizontal: 4.0, vertical: 8.0), this.minimumSize, super.key, }); @@ -39,7 +40,8 @@ class PrimaryButton extends StatefulWidget { final EdgeInsets innerPadding; - bool get isDisabled => !enabled || (onPressed == null && onPressedFuture == null); + bool get isDisabled => + !enabled || (onPressed == null && onPressedFuture == null); final Size? minimumSize; @@ -48,7 +50,7 @@ class PrimaryButton extends StatefulWidget { } class _PrimaryButtonState extends State { - Future trackedFuture = Future.value(null); + Future trackedFuture = Future.value(); @override Widget build(BuildContext context) { @@ -59,19 +61,21 @@ class _PrimaryButtonState extends State { minimumSize: widget.minimumSize, ).copyWith(elevation: ButtonStyleButton.allOrNull(0.0)); - final tooltipMessage = (!widget.isDisabled) ? widget.tooltip : widget.tooltipDisabled; + final tooltipMessage = + (!widget.isDisabled) ? widget.tooltip : widget.tooltipDisabled; - onButtonPressed() { + void onButtonPressed() { widget.onPressed?.call(); if (widget.onPressedFuture != null) { final future = widget.onPressedFuture!().whenComplete(() { if (mounted) { setState(() { - trackedFuture = Future.value(null); + trackedFuture = Future.value(); }); } }); - Future.delayed(Duration(milliseconds: widget.showLoadingEarliestAfterMs), () { + Future.delayed( + Duration(milliseconds: widget.showLoadingEarliestAfterMs), () { if (mounted) { setState(() { trackedFuture = future; @@ -92,16 +96,17 @@ class _PrimaryButtonState extends State { child: Row( mainAxisSize: MainAxisSize.min, children: [ - widget.isLoading - ? SizedBox( - width: theme.iconTheme.size ?? 14.0, - height: theme.iconTheme.size ?? 14.0, - child: const CircularProgressIndicator( - color: Colors.white, - strokeWidth: 2.0, - ), - ) - : Icon(widget.icon), + if (widget.isLoading) + SizedBox( + width: theme.iconTheme.size ?? 14.0, + height: theme.iconTheme.size ?? 14.0, + child: const CircularProgressIndicator( + color: Colors.white, + strokeWidth: 2.0, + ), + ) + else + Icon(widget.icon), const SizedBox(width: 6.0), Text(widget.text, textAlign: TextAlign.center), ], @@ -112,23 +117,24 @@ class _PrimaryButtonState extends State { } return Tooltip( - message: tooltipMessage, - child: ElevatedButton( - style: primaryStyle, - onPressed: widget.isDisabled ? null : onButtonPressed, - child: Padding( - padding: widget.innerPadding, - child: widget.isLoading - ? SizedBox( - width: theme.iconTheme.size ?? 14.0, - height: theme.iconTheme.size ?? 14.0, - child: const CircularProgressIndicator( - color: Colors.white, - strokeWidth: 2.0, - ), - ) - : Text(widget.text, textAlign: TextAlign.center), - ), - )); + message: tooltipMessage, + child: ElevatedButton( + style: primaryStyle, + onPressed: widget.isDisabled ? null : onButtonPressed, + child: Padding( + padding: widget.innerPadding, + child: widget.isLoading + ? SizedBox( + width: theme.iconTheme.size ?? 14.0, + height: theme.iconTheme.size ?? 14.0, + child: const CircularProgressIndicator( + color: Colors.white, + strokeWidth: 2.0, + ), + ) + : Text(widget.text, textAlign: TextAlign.center), + ), + ), + ); } } diff --git a/designer_v2/lib/common_views/reactive_color_picker.dart b/designer_v2/lib/common_views/reactive_color_picker.dart index c03f79245..5e949711e 100644 --- a/designer_v2/lib/common_views/reactive_color_picker.dart +++ b/designer_v2/lib/common_views/reactive_color_picker.dart @@ -1,7 +1,6 @@ import 'package:flutter/material.dart'; -import 'package:reactive_forms/reactive_forms.dart'; - import 'package:flutter_colorpicker/flutter_colorpicker.dart'; +import 'package:reactive_forms/reactive_forms.dart'; import 'package:studyu_designer_v2/utils/color.dart'; /// Adaption of [ReactiveColorPicker] from 'reactive_color_picker' package @@ -38,25 +37,31 @@ class ReactiveCustomColorPicker extends ReactiveFormField { super.formControlName, super.formControl, super.validationMessages, - ControlValueAccessor? valueAccessor, - ShowErrorsFunction? showErrors, //////////////////////////////////////////////////////////////////////////// Color? contrastIconColorLight, Color contrastIconColorDark = Colors.white, InputDecoration? decoration, PaletteType paletteType = PaletteType.hsv, bool enableAlpha = true, - @Deprecated('Use empty list in [labelTypes] to disable label.') bool showLabel = true, - @Deprecated('Use Theme.of(context).textTheme.bodyText1 & 2 to alter text style.') TextStyle? labelTextStyle, + @Deprecated('Use empty list in [labelTypes] to disable label.') + bool showLabel = true, + @Deprecated( + 'Use Theme.of(context).textTheme.bodyText1 & 2 to alter text style.', + ) + TextStyle? labelTextStyle, bool displayThumbColor = false, bool portraitOnly = false, bool hexInputBar = false, double colorPickerWidth = 300.0, double pickerAreaHeightPercent = 1.0, - BorderRadius pickerAreaBorderRadius = const BorderRadius.all(Radius.zero), + BorderRadius pickerAreaBorderRadius = BorderRadius.zero, double disabledOpacity = 0.5, HSVColor? pickerHsvColor, - List labelTypes = const [ColorLabelType.rgb, ColorLabelType.hsv, ColorLabelType.hsl], + List labelTypes = const [ + ColorLabelType.rgb, + ColorLabelType.hsv, + ColorLabelType.hsl, + ], TextEditingController? hexInputController, List? colorHistory, ValueChanged>? onHistoryChanged, @@ -71,8 +76,8 @@ class ReactiveCustomColorPicker extends ReactiveFormField { context: context, builder: (BuildContext context) { return AlertDialog( - titlePadding: const EdgeInsets.all(0.0), - contentPadding: const EdgeInsets.all(0.0), + titlePadding: EdgeInsets.zero, + contentPadding: EdgeInsets.zero, content: SingleChildScrollView( child: ColorPicker( pickerColor: pickerColor, @@ -97,13 +102,16 @@ class ReactiveCustomColorPicker extends ReactiveFormField { ); } - final isEmptyValue = field.value == null || field.value.toString().isEmpty; + final isEmptyValue = + field.value == null || field.value.toString().isEmpty; - final InputDecoration effectiveDecoration = - (decoration ?? const InputDecoration()).applyDefaults(Theme.of(field.context).inputDecorationTheme); + final InputDecoration effectiveDecoration = (decoration ?? + const InputDecoration()) + .applyDefaults(Theme.of(field.context).inputDecorationTheme); - final iconColor = - (field.value?.computeLuminance() ?? 0) < 0.2 ? contrastIconColorDark : contrastIconColorLight; + final iconColor = (field.value?.computeLuminance() ?? 0) < 0.2 + ? contrastIconColorDark + : contrastIconColorLight; return IgnorePointer( ignoring: !field.control.enabled, @@ -131,7 +139,9 @@ class ReactiveCustomColorPicker extends ReactiveFormField { // Convert between non-serializable [Color] // superclass that color_picker expects & // the [SerializableColor] type of the control - field.didChange(SerializableColor(color.value)); + field.didChange( + SerializableColor(color.value), + ); }, ); }, @@ -149,7 +159,8 @@ class ReactiveCustomColorPicker extends ReactiveFormField { ], ), ), - isEmpty: isEmptyValue && effectiveDecoration.hintText == null, + isEmpty: + isEmptyValue && effectiveDecoration.hintText == null, child: Container( color: field.value, ), diff --git a/designer_v2/lib/common_views/search.dart b/designer_v2/lib/common_views/search.dart index 8bbcdee16..b77130b32 100644 --- a/designer_v2/lib/common_views/search.dart +++ b/designer_v2/lib/common_views/search.dart @@ -35,7 +35,7 @@ class SearchState extends State { } void _onSearchPressed() { - String query = _searchController.text.toLowerCase(); + final String query = _searchController.text.toLowerCase(); widget.onQueryChanged(query); } diff --git a/designer_v2/lib/common_views/sidesheet/sidesheet.dart b/designer_v2/lib/common_views/sidesheet/sidesheet.dart index d89ca4c2d..ee84b5861 100644 --- a/designer_v2/lib/common_views/sidesheet/sidesheet.dart +++ b/designer_v2/lib/common_views/sidesheet/sidesheet.dart @@ -31,7 +31,7 @@ class Sidesheet extends StatefulWidget { this.wrapContent, super.key, }) : assert((body != null && tabs == null) || (body == null && tabs != null), - "Must provide either body or tabs to build sidesheet content"), + "Must provide either body or tabs to build sidesheet content",), assert(tabs == null || tabs.length >= 1, "Must provide at least one tab to build sidesheet content"); final String titleText; @@ -83,13 +83,11 @@ class _SidesheetState extends State { return Align( alignment: Alignment.bottomLeft, child: Material( - elevation: 0, color: Colors.white, child: SizedBox( width: actualWidth, height: actualHeight, child: Scaffold( - appBar: null, backgroundColor: backgroundColor, body: widget.withCloseButton ? Stack( @@ -99,7 +97,7 @@ class _SidesheetState extends State { top: 5, right: 5, child: CloseButton(), - ) + ), ], ) : _build(context, widget.body, widget.tabs), @@ -109,7 +107,7 @@ class _SidesheetState extends State { ); } - _build(BuildContext context, Widget? body, List? tabs) { + Container _build(BuildContext context, Widget? body, List? tabs) { final theme = Theme.of(context); final backgroundColor = ThemeConfig.sidesheetBackgroundColor(Theme.of(context)); @@ -137,7 +135,6 @@ class _SidesheetState extends State { ), child: actualWrapContent( Column( - mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: [ Padding( @@ -154,14 +151,11 @@ class _SidesheetState extends State { widget.titleText, style: theme.textTheme.headlineSmall!.copyWith(fontWeight: FontWeight.normal), ), - (widget.actionButtons != null) - ? Wrap(spacing: 8.0, children: widget.actionButtons!) - : const SizedBox.shrink(), + if (widget.actionButtons != null) Wrap(spacing: 8.0, children: widget.actionButtons!) else const SizedBox.shrink(), ], ), ), - (hasTabs && !isCollapsed) - ? Padding( + if (hasTabs && !isCollapsed) Padding( padding: EdgeInsets.symmetric(horizontal: (widget.bodyPadding?.horizontal ?? 0) * 0.5), child: TabbedNavbar( tabs: tabs, @@ -178,16 +172,13 @@ class _SidesheetState extends State { labelColorHover: tabBarLabelHoverColor, unselectedLabelColorHover: tabBarLabelHoverColor, ), - ) - : const SizedBox.shrink(), - (hasTabs && !isCollapsed) ? const Divider(height: 1) : const Divider(), + ) else const SizedBox.shrink(), + if (hasTabs && !isCollapsed) const Divider(height: 1) else const Divider(), Flexible( child: SingleChildScrollView( child: Column( children: [ - (hasTabs && !isCollapsed) // compensate for divider height loss - ? const SizedBox(height: 12.0) - : const SizedBox.shrink(), + if (hasTabs && !isCollapsed) const SizedBox(height: 12.0) else const SizedBox.shrink(), Padding( padding: EdgeInsets.fromLTRB( (widget.bodyPadding?.horizontal ?? 0) * 0.5, @@ -196,7 +187,7 @@ class _SidesheetState extends State { (widget.bodyPadding?.vertical ?? 0) * 0.5, ), child: innerBody, - ) + ), ], ), ), diff --git a/designer_v2/lib/common_views/sidesheet/sidesheet_form.dart b/designer_v2/lib/common_views/sidesheet/sidesheet_form.dart index de3fed73f..c74cc5bba 100644 --- a/designer_v2/lib/common_views/sidesheet/sidesheet_form.dart +++ b/designer_v2/lib/common_views/sidesheet/sidesheet_form.dart @@ -20,7 +20,7 @@ class FormSideSheetTab extends NavbarTab { FormViewBuilder formViewBuilder; } -showFormSideSheet({ +Future showFormSideSheet({ required BuildContext context, required T formViewModel, FormViewBuilder? formViewBuilder, @@ -35,7 +35,7 @@ showFormSideSheet({ barrierColor ??= ThemeConfig.modalBarrierColor(Theme.of(context)); // Wraps the whole side sheet in a [ReactiveForm] widget - Widget wrapInForm(widget) { + Widget wrapInForm(Widget widget) { return ReactiveForm( formGroup: formViewModel.form, child: widget, @@ -44,12 +44,14 @@ showFormSideSheet({ // Bind the [formViewModel] to the [SidesheetTab]s' widget builder final List? boundTabs = tabs - ?.map((t) => SidesheetTab( - title: t.title, - index: t.index, - enabled: t.enabled, - builder: (BuildContext context) => t.formViewBuilder(formViewModel), - )) + ?.map( + (t) => SidesheetTab( + title: t.title, + index: t.index, + enabled: t.enabled, + builder: (BuildContext context) => t.formViewBuilder(formViewModel), + ), + ) .toList(); return showModalSideSheet( diff --git a/designer_v2/lib/common_views/standard_table.dart b/designer_v2/lib/common_views/standard_table.dart index eb7190ac5..485bcc38d 100644 --- a/designer_v2/lib/common_views/standard_table.dart +++ b/designer_v2/lib/common_views/standard_table.dart @@ -11,10 +11,17 @@ import 'package:studyu_designer_v2/utils/model_action.dart'; typedef OnSelectHandler = void Function(T item); -typedef StandardTableRowBuilder = TableRow Function(BuildContext context, List columns); +typedef StandardTableRowBuilder = TableRow Function( + BuildContext context, + List columns, +); typedef StandardTableCellsBuilder = List Function( - BuildContext context, T item, int rowIdx, Set states); + BuildContext context, + T item, + int rowIdx, + Set states, +); enum StandardTableStyle { plain, material } @@ -66,7 +73,10 @@ class StandardTable extends StatefulWidget { }) { if (trailingActionsColumn == null) { this.inputTrailingActionsColumn = StandardTableColumn( - label: '', columnWidth: const MaxColumnWidth(IntrinsicColumnWidth(), FixedColumnWidth(65))); + label: '', + columnWidth: + const MaxColumnWidth(IntrinsicColumnWidth(), FixedColumnWidth(65)), + ); } else { this.inputTrailingActionsColumn = trailingActionsColumn; } @@ -150,14 +160,14 @@ class _StandardTableState extends State> { super.didUpdateWidget(oldWidget); } - _initRowStates() { + void _initRowStates() { _rowStates.clear(); - for (var _ in widget.items) { + for (final _ in widget.items) { _rowStates.add({}); } } - _onRowStateChanged(int rowIdx, Set states) { + void _onRowStateChanged(int rowIdx, Set states) { setState(() { _rowStates[rowIdx] = states; // flag row for rebuild to reflect its current set of [MaterialStatus] @@ -175,20 +185,24 @@ class _StandardTableState extends State> { } final headerRow = _buildHeaderRow(); - final tableHeaderRows = (widget.showTableHeader) ? [headerRow, paddingRow, paddingRow] : []; + final List tableHeaderRows = + (widget.showTableHeader) ? [headerRow, paddingRow, paddingRow] : []; final tableDataRows = _tableRows(theme); Widget tableWidget = Table( - columnWidths: columnWidths, - defaultVerticalAlignment: TableCellVerticalAlignment.middle, - children: [...tableHeaderRows, ...tableDataRows]); + columnWidths: columnWidths, + defaultVerticalAlignment: TableCellVerticalAlignment.middle, + children: [...tableHeaderRows, ...tableDataRows], + ); if (widget.tableWrapper != null) { tableWidget = widget.tableWrapper!(tableWidget); } final isTableVisible = !(tableHeaderRows.isEmpty && tableDataRows.isEmpty); - if (tableDataRows.isEmpty && widget.emptyWidget != null && widget.hideLeadingTrailingWhenEmpty) { + if (tableDataRows.isEmpty && + widget.emptyWidget != null && + widget.hideLeadingTrailingWhenEmpty) { return widget.emptyWidget!; } @@ -197,16 +211,23 @@ class _StandardTableState extends State> { crossAxisAlignment: CrossAxisAlignment.start, children: [ widget.leadingWidget ?? const SizedBox.shrink(), - (widget.leadingWidget != null && widget.leadingWidgetSpacing != null) - ? SizedBox(height: widget.leadingWidgetSpacing!) - : const SizedBox.shrink(), - (isTableVisible) ? tableWidget : Container(), - (!isTableVisible && widget.emptyWidget != null && !widget.hideLeadingTrailingWhenEmpty) - ? widget.emptyWidget! - : const SizedBox.shrink(), - (widget.trailingWidget != null && widget.trailingWidgetSpacing != null) - ? SizedBox(height: widget.trailingWidgetSpacing!) - : const SizedBox.shrink(), + if (widget.leadingWidget != null && + widget.leadingWidgetSpacing != null) + SizedBox(height: widget.leadingWidgetSpacing) + else + const SizedBox.shrink(), + if (isTableVisible) tableWidget else Container(), + if (!isTableVisible && + widget.emptyWidget != null && + !widget.hideLeadingTrailingWhenEmpty) + widget.emptyWidget! + else + const SizedBox.shrink(), + if (widget.trailingWidget != null && + widget.trailingWidgetSpacing != null) + SizedBox(height: widget.trailingWidgetSpacing) + else + const SizedBox.shrink(), widget.trailingWidget ?? const SizedBox.shrink(), ], ); @@ -219,15 +240,25 @@ class _StandardTableState extends State> { final sortAscending = widget.inputColumns[columnIndex].sortAscending; // Save default order to restore later - if (sortDefaultOrder == null || sortDefaultOrder!.length != widget.items.length) { + if (sortDefaultOrder == null || + sortDefaultOrder!.length != widget.items.length) { sortDefaultOrder = List.from(widget.items); } if (sortAscending != null) { widget.items.sort((a, b) { - return _sortLogic(a, b, columnIndex: columnIndex, sortAscending: sortAscending); + return _sortLogic( + a, + b, + columnIndex: columnIndex, + sortAscending: sortAscending, + ); }); - _sortPinnedStudies(widget.items, columnIndex: columnIndex, sortAscending: sortAscending); + _sortPinnedStudies( + widget.items, + columnIndex: columnIndex, + sortAscending: sortAscending, + ); } else { widget.items.clear(); widget.items.addAll(sortDefaultOrder!); @@ -236,20 +267,40 @@ class _StandardTableState extends State> { _cachedRows.clear(); } - void _sortPinnedStudies(List items, {required int columnIndex, bool? sortAscending}) { + void _sortPinnedStudies( + List items, { + required int columnIndex, + bool? sortAscending, + }) { // Extract and insert pinned items at the top if (widget.pinnedPredicates != null) { items.sort((a, b) { - int ret = widget.pinnedPredicates!(a, b); + final int ret = widget.pinnedPredicates!(a, b); // Fallback to default sorting algorithm - return ret == 0 ? _sortLogic(a, b, columnIndex: columnIndex, sortAscending: sortAscending) : ret; + return ret == 0 + ? _sortLogic( + a, + b, + columnIndex: columnIndex, + sortAscending: sortAscending, + ) + : ret; }); } } - int _sortLogic(T a, T b, {required int columnIndex, required bool? sortAscending, bool? useSortPredicate}) { + int _sortLogic( + T a, + T b, { + required int columnIndex, + required bool? sortAscending, + bool? useSortPredicate, + }) { final sortPredicate = widget.sortColumnPredicates; - if (useSortPredicate != null && useSortPredicate && sortPredicate != null && sortPredicate[columnIndex] != null) { + if (useSortPredicate != null && + useSortPredicate && + sortPredicate != null && + sortPredicate[columnIndex] != null) { final int res; if (sortAscending ?? true) { res = sortPredicate[columnIndex]!(a, b); @@ -258,12 +309,20 @@ class _StandardTableState extends State> { } if (res == 0) { // Fallback to default sorting algorithm - return _sortLogic(a, b, columnIndex: columnIndex, sortAscending: sortAscending, useSortPredicate: false); + return _sortLogic( + a, + b, + columnIndex: columnIndex, + sortAscending: sortAscending, + useSortPredicate: false, + ); } return res; } else if (a is Comparable && b is Comparable) { // If sortPredicate is not provided, use default comparison logic - return sortAscending ?? true ? Comparable.compare(a, b) : Comparable.compare(b, a); + return sortAscending ?? true + ? Comparable.compare(a, b) + : Comparable.compare(b, a); } else { return 0; } @@ -282,10 +341,13 @@ class _StandardTableState extends State> { _cachedRows.addAll(rows); // Add padding after each row - return rows.map((dataRow) => [dataRow, paddingRow]).expand((element) => element).toList(); + return rows + .map((dataRow) => [dataRow, paddingRow]) + .expand((element) => element) + .toList(); } - TableRow _useCachedOrRebuildRow(rowIdx) { + TableRow _useCachedOrRebuildRow(int rowIdx) { if (rowIdx >= _cachedRows.length) { // [_cachedRows] is empty when building for the first time return _buildDataRow(rowIdx); @@ -299,8 +361,11 @@ class _StandardTableState extends State> { } TableRow _buildPaddingRow() { - TableRow rowSpacer = - TableRow(children: widget.inputColumns.map((_) => SizedBox(height: widget.rowSpacing)).toList()); + final TableRow rowSpacer = TableRow( + children: widget.inputColumns + .map((_) => SizedBox(height: widget.rowSpacing)) + .toList(), + ); return rowSpacer; } @@ -309,21 +374,30 @@ class _StandardTableState extends State> { return headerRowBuilder(context, widget.inputColumns); } - TableRow _defaultHeader(BuildContext context, List columns) { + TableRow _defaultHeader( + BuildContext context, + List columns, + ) { final theme = Theme.of(context); final List headerCells = []; for (var i = 0; i < columns.length; i++) { final isLeading = i == 0; final isTrailing = i == columns.length - 1; - headerCells.add(MouseEventsRegion( - builder: (context, state) { - return Padding( + headerCells.add( + MouseEventsRegion( + builder: (context, state) { + return Padding( padding: EdgeInsets.fromLTRB( - (isLeading || isTrailing) ? 2 * widget.cellSpacing : widget.cellSpacing, - widget.cellSpacing, - (isLeading || isTrailing) ? 2 * widget.cellSpacing : widget.cellSpacing, - widget.cellSpacing), + (isLeading || isTrailing) + ? 2 * widget.cellSpacing + : widget.cellSpacing, + widget.cellSpacing, + (isLeading || isTrailing) + ? 2 * widget.cellSpacing + : widget.cellSpacing, + widget.cellSpacing, + ), child: Row( children: [ Text( @@ -335,16 +409,20 @@ class _StandardTableState extends State> { color: theme.colorScheme.onSurface.withOpacity(0.8), ), ), - widget.inputColumns[i].sortable - ? widget.inputColumns[i].sortableIcon ?? const SizedBox(width: 17) - : const SizedBox.shrink(), + if (widget.inputColumns[i].sortable) + widget.inputColumns[i].sortableIcon ?? + const SizedBox(width: 17) + else + const SizedBox.shrink(), ], - )); - }, - onEnter: (event) => setState(() => sortAction(i, hover: event)), - onExit: (event) => setState(() => sortAction(i, hover: event)), - onTap: () => setState(() => sortAction(i)), - )); + ), + ); + }, + onEnter: (event) => setState(() => sortAction(i, hover: event)), + onExit: (event) => setState(() => sortAction(i, hover: event)), + onTap: () => setState(() => sortAction(i)), + ), + ); } return TableRow(children: headerCells); } @@ -362,21 +440,18 @@ class _StandardTableState extends State> { switch (widget.inputColumns[i].sortAscending) { case null: // Reset all column sorting - for (StandardTableColumn c in widget.inputColumns) { + for (final StandardTableColumn c in widget.inputColumns) { c.sortAscending = null; c.sortableIcon = null; } widget.inputColumns[i].sortAscending = true; widget.inputColumns[i].sortableIcon = ascendingIcon; - break; case true: widget.inputColumns[i].sortAscending = false; widget.inputColumns[i].sortableIcon = descendingIcon; - break; case false: widget.inputColumns[i].sortAscending = null; widget.inputColumns[i].sortableIcon = null; - break; } _sortColumn(i); // No sorting icon is active or hovered @@ -392,10 +467,11 @@ class _StandardTableState extends State> { TableRow _buildDataRow(int rowIdx) { final item = widget.items[rowIdx]; - final dataRowBuilder = widget.dataRowBuilder ?? _defaultDataRow; final rowStates = _rowStates[rowIdx]; - return dataRowBuilder(context, item, rowIdx, rowStates); + return widget.dataRowBuilder != null + ? widget.dataRowBuilder!(context, widget.inputColumns) + : _defaultDataRow(context, item, rowIdx, rowStates); } TableRow _defaultDataRow( @@ -407,12 +483,13 @@ class _StandardTableState extends State> { final theme = Theme.of(context); final rowIsHovered = states.contains(WidgetState.hovered); final rowIsPressed = states.contains(WidgetState.pressed); - final rowColor = - (widget.rowStyle == StandardTableStyle.material) ? theme.colorScheme.onPrimary : Colors.transparent; + final rowColor = (widget.rowStyle == StandardTableStyle.material) + ? theme.colorScheme.onPrimary + : Colors.transparent; - Widget decorateCellInteractions(Widget child, {disableOnTap = false}) { + Widget decorateCellInteractions(Widget child, {bool disableOnTap = false}) { return MouseEventsRegion( - onTap: (disableOnTap) ? null : (() => widget.onSelectItem(item)), + onTap: disableOnTap ? null : (() => widget.onSelectItem(item)), onStateChanged: (states) => _onRowStateChanged(rowIdx, states), builder: (context, mouseEventState) => child, ); @@ -420,48 +497,57 @@ class _StandardTableState extends State> { Widget decorateCell( Widget child, { - alignment = Alignment.centerLeft, - isLeading = false, - isTrailing = false, - disableOnTap = false, + Alignment alignment = Alignment.centerLeft, + bool isLeading = false, + bool isTrailing = false, + bool disableOnTap = false, }) { final content = Align( alignment: alignment, child: child, ); final styledCell = Material( - color: rowColor, - child: Padding( - padding: EdgeInsets.fromLTRB( - (isLeading || isTrailing) ? 2 * widget.cellSpacing : widget.cellSpacing, - widget.cellSpacing, - (isLeading || isTrailing) ? 2 * widget.cellSpacing : widget.cellSpacing, - widget.cellSpacing), - child: (widget.minRowHeight != null) - ? SizedBox( - height: widget.minRowHeight, - child: content, - ) - : content, - )); + color: rowColor, + child: Padding( + padding: EdgeInsets.fromLTRB( + (isLeading || isTrailing) + ? 2 * widget.cellSpacing + : widget.cellSpacing, + widget.cellSpacing, + (isLeading || isTrailing) + ? 2 * widget.cellSpacing + : widget.cellSpacing, + widget.cellSpacing, + ), + child: (widget.minRowHeight != null) + ? SizedBox( + height: widget.minRowHeight, + child: content, + ) + : content, + ), + ); return (!widget.disableRowInteractions) ? decorateCellInteractions(styledCell, disableOnTap: disableOnTap) : styledCell; } - Widget applyColumnConfiguration(Widget cellWidget, StandardTableColumn column) { + Widget applyColumnConfiguration( + Widget cellWidget, + StandardTableColumn column, + ) { if (column.tooltip != null) { - cellWidget = Tooltip( - message: column.tooltip!, + return Tooltip( + message: column.tooltip, child: cellWidget, ); } - return cellWidget; } - final List rawCells = widget.buildCellsAt(context, item, rowIdx, states); + final List rawCells = + widget.buildCellsAt(context, item, rowIdx, states); if (widget.trailingActionsAt != null) { // Insert additional table cell to hold actions menu @@ -482,7 +568,6 @@ class _StandardTableState extends State> { cell, isLeading: isLeading, isTrailing: isTrailing, - disableOnTap: false, ); cell = applyColumnConfiguration(cell, cellColumnConfig); dataCells.add(cell); @@ -494,21 +579,22 @@ class _StandardTableState extends State> { children: dataCells, decoration: BoxDecoration( border: Border.all( - color: (rowIsPressed) + color: rowIsPressed ? theme.colorScheme.primary.withOpacity(0.7) : theme.colorScheme.primaryContainer.withOpacity(0.9), ), borderRadius: const BorderRadius.all(Radius.circular(4)), boxShadow: [ BoxShadow( - color: (rowIsPressed) - ? theme.colorScheme.primary.withOpacity(0.15) - : ((rowIsHovered) - ? theme.colorScheme.onSurface.withOpacity(0.2) - : theme.colorScheme.onSurface.withOpacity(0.1)), - spreadRadius: 0, - blurRadius: (rowIsHovered) ? 3 : 2, - offset: (rowIsHovered) ? const Offset(1, 1) : const Offset(0, 1)) + color: rowIsPressed + ? theme.colorScheme.primary.withOpacity(0.15) + : (rowIsHovered + ? theme.colorScheme.onSurface.withOpacity(0.2) + : theme.colorScheme.onSurface.withOpacity(0.1)), + blurRadius: rowIsHovered ? 3 : 2, + offset: + rowIsHovered ? const Offset(1, 1) : const Offset(0, 1), + ), ], color: theme.colorScheme.onPrimary, ), @@ -516,7 +602,6 @@ class _StandardTableState extends State> { : TableRow( key: ObjectKey(item), children: dataCells, - decoration: null, ); } @@ -531,7 +616,6 @@ class _StandardTableState extends State> { final theme = Theme.of(context); actionMenuWidget = ActionPopUpMenuButton( actions: actions, - orientation: Axis.horizontal, triggerIconColor: ThemeConfig.bodyTextMuted(theme).color?.faded(0.6), triggerIconColorHover: theme.colorScheme.primary, disableSplashEffect: true, diff --git a/designer_v2/lib/common_views/studyu_logo.dart b/designer_v2/lib/common_views/studyu_logo.dart index 421460ba4..b0cd65472 100644 --- a/designer_v2/lib/common_views/studyu_logo.dart +++ b/designer_v2/lib/common_views/studyu_logo.dart @@ -25,6 +25,6 @@ class StudyULogo extends StatelessWidget { ), ); }, - onTap: onTap); + onTap: onTap,); } } diff --git a/designer_v2/lib/common_views/styling_information.dart b/designer_v2/lib/common_views/styling_information.dart index e435fcd54..2c51b3b2e 100644 --- a/designer_v2/lib/common_views/styling_information.dart +++ b/designer_v2/lib/common_views/styling_information.dart @@ -1,10 +1,9 @@ import 'package:flutter/material.dart'; +import 'package:studyu_designer_v2/common_views/banner.dart'; import 'package:studyu_designer_v2/common_views/text_hyperlink.dart'; import 'package:studyu_designer_v2/common_views/text_paragraph.dart'; import 'package:studyu_designer_v2/theme.dart'; -import 'banner.dart'; - class HtmlStylingBanner extends StatelessWidget { const HtmlStylingBanner({this.isDismissed = false, this.onDismissed, super.key}); @@ -43,43 +42,43 @@ class HtmlStylingBanner extends StatelessWidget { children: [ TableRow(children: [ const Text('Make your text bold'), - Text('Bold text', style: ThemeConfig.bodyTextMuted(theme)) - ]), + Text('Bold text', style: ThemeConfig.bodyTextMuted(theme)), + ],), TableRow(children: [ const Text('Add a hyperlink'), Text( 'A hyperlink', style: ThemeConfig.bodyTextMuted(theme), - ) - ]), + ), + ],), TableRow(children: [ const Text('Make your text colorful'), Text( 'Red text', style: ThemeConfig.bodyTextMuted(theme), ), - ]), + ],), TableRow(children: [ const Text('Add an image'), Text( '', style: ThemeConfig.bodyTextMuted(theme), - ) - ]), + ), + ],), TableRow(children: [ const Text('Add a video'), Text( '