diff --git a/app/lib/screens/study/tasks/observation/questionnaire_task_widget.dart b/app/lib/screens/study/tasks/observation/questionnaire_task_widget.dart index 23820af18..3a1144e87 100644 --- a/app/lib/screens/study/tasks/observation/questionnaire_task_widget.dart +++ b/app/lib/screens/study/tasks/observation/questionnaire_task_widget.dart @@ -40,51 +40,49 @@ class _QuestionnaireTaskWidgetState extends State { @override Widget build(BuildContext context) { - final questionnaireWidget = QuestionnaireWidget( - widget.task.questions.questions, - header: widget.task.header, - footer: widget.task.footer, - onChange: _responseValidator, - onComplete: (qs) => setState(() { - response = qs; - }), - ); - return Expanded( - child: Column( - children: [ - Expanded( - child: Form( - key: formKey, - child: questionnaireWidget, + return Column( + children: [ + Expanded( + child: Form( + key: formKey, + child: QuestionnaireWidget( + widget.task.questions.questions, + header: widget.task.header, + footer: widget.task.footer, + onChange: _responseValidator, + onComplete: (qs) => setState(() { + response = qs; + }), ), ), - if (response != null && responseValidator) - ElevatedButton.icon( - style: ButtonStyle(backgroundColor: MaterialStateProperty.all(Colors.green)), - onPressed: () async { - if (isRedundantClick(loginClickTime)) { - return; - } - if (!formKey.currentState!.validate()) { - return; - } - setState(() { - _isLoading = true; - }); - switch (response) { - case QuestionnaireState questionnaireState: - await _addQuestionnaireResult(questionnaireState, context); - break; - } - setState(() { - _isLoading = false; - }); - }, - icon: _isLoading ? const CircularProgressIndicator(color: Colors.white) : const Icon(Icons.check), - label: Text(AppLocalizations.of(context)!.complete), - ), - ], - ), + ), + response != null && responseValidator + ? ElevatedButton.icon( + style: ButtonStyle(backgroundColor: MaterialStateProperty.all(Colors.green)), + onPressed: () async { + if (isRedundantClick(loginClickTime)) { + return; + } + if (!formKey.currentState!.validate()) { + return; + } + setState(() { + _isLoading = true; + }); + switch (response) { + case QuestionnaireState questionnaireState: + await _addQuestionnaireResult(questionnaireState, context); + break; + } + setState(() { + _isLoading = false; + }); + }, + icon: _isLoading ? const CircularProgressIndicator(color: Colors.white) : const Icon(Icons.check), + label: Text(AppLocalizations.of(context)!.complete), + ) + : const SizedBox.shrink(), + ], ); } diff --git a/app/lib/screens/study/tasks/task_screen.dart b/app/lib/screens/study/tasks/task_screen.dart index a5fe00d84..04a66b34d 100644 --- a/app/lib/screens/study/tasks/task_screen.dart +++ b/app/lib/screens/study/tasks/task_screen.dart @@ -37,10 +37,22 @@ class _TaskScreenState extends State { Widget _buildTask() { switch (taskInstance.task) { case CheckmarkTask checkmarkTask: - return CheckmarkTaskWidget( - task: checkmarkTask, - key: UniqueKey(), - completionPeriod: taskInstance.completionPeriod, + return SingleChildScrollView( + child: SizedBox( + width: MediaQuery.of(context).size.width, + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + HtmlText(taskInstance.task.header, centered: true), + const SizedBox(height: 20), + CheckmarkTaskWidget( + task: checkmarkTask, + key: UniqueKey(), + completionPeriod: taskInstance.completionPeriod, + ) + ], + ), + ), ); case QuestionnaireTask questionnaireTask: return QuestionnaireTaskWidget( @@ -55,47 +67,11 @@ class _TaskScreenState extends State { @override Widget build(BuildContext context) { - final theme = Theme.of(context); return Scaffold( - appBar: AppBar( - title: Text(taskInstance.task.title ?? ''), - ), + appBar: AppBar(title: Text(taskInstance.task.title ?? '')), body: Padding( padding: const EdgeInsets.all(16), - child: Center( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Row(mainAxisAlignment: MainAxisAlignment.center, children: [ - Flexible( - child: Text( - taskInstance.task.title ?? '', - style: theme.textTheme.headlineMedium!.copyWith(fontSize: 24), - overflow: TextOverflow.ellipsis, - maxLines: 3, - ), - ), - IconButton( - icon: const Icon(Icons.info_outline, color: Colors.grey), - onPressed: () => showDialog( - context: context, - builder: (context) { - return AlertDialog( - title: ListTile( - dense: true, - title: Text(taskInstance.task.title!, style: theme.textTheme.titleLarge), - ), - content: HtmlText(taskInstance.task.header), - ); - }, - ), - ), - ]), - const SizedBox(height: 20), - _buildTask(), - ], - ), - ), + child: _buildTask(), ), ); } diff --git a/app/lib/widgets/html_text.dart b/app/lib/widgets/html_text.dart index 2a33f835d..e0e455778 100644 --- a/app/lib/widgets/html_text.dart +++ b/app/lib/widgets/html_text.dart @@ -5,27 +5,30 @@ class HtmlText extends StatelessWidget { const HtmlText( this.text, { this.style, + this.centered = false, super.key, }); final String? text; final TextStyle? style; + final bool centered; @override Widget build(BuildContext context) { + Widget htmlWidget = HtmlWidget( + text ?? '', + textStyle: style, + // these callbacks are called when a complicated element is loading + // or failed to render allowing the app to render progress indicator + // and fallback widget + onErrorBuilder: (context, element, error) => Text('$element Error: $error'), + onLoadingBuilder: (context, element, loadingProgress) => const CircularProgressIndicator(), + ); + return SingleChildScrollView( child: SizedBox( width: double.maxFinite, - child: HtmlWidget( - text ?? '', - textStyle: style, - - // these callbacks are called when a complicated element is loading - // or failed to render allowing the app to render progress indicator - // and fallback widget - onErrorBuilder: (context, element, error) => Text('$element Error: $error'), - onLoadingBuilder: (context, element, loadingProgress) => const CircularProgressIndicator(), - ), + child: centered ? Center(child: htmlWidget) : htmlWidget, ), ); } diff --git a/docs/uml/app/lib/screens/study/tasks/uml.svg b/docs/uml/app/lib/screens/study/tasks/uml.svg index 097c825aa..49428166b 100644 --- a/docs/uml/app/lib/screens/study/tasks/uml.svg +++ b/docs/uml/app/lib/screens/study/tasks/uml.svg @@ -1,14 +1,5 @@ - [CheckmarkTaskWidget - | - +task: CheckmarkTask?; - +completionPeriod: CompletionPeriod? - ] - - [CheckmarkTaskWidget]o-[CheckmarkTask] - [CheckmarkTaskWidget]o-[CompletionPeriod] - - [QuestionnaireTaskWidget + [QuestionnaireTaskWidget | +task: QuestionnaireTask; +completionPeriod: CompletionPeriod @@ -26,6 +17,15 @@ [TaskScreen]o-[TaskInstance] + [CheckmarkTaskWidget + | + +task: CheckmarkTask?; + +completionPeriod: CompletionPeriod? + ] + + [CheckmarkTaskWidget]o-[CheckmarkTask] + [CheckmarkTaskWidget]o-[CompletionPeriod] + @@ -34,79 +34,38 @@ - + - + - + - + - + - + - + - + - + - - - - - - - - - - CheckmarkTaskWidget - - - - - - +task: CheckmarkTask? - +completionPeriod: CompletionPeriod? - - - - - - - - - - - CheckmarkTask - - - - - - - - - - - CompletionPeriod - - - + - - + + - + QuestionnaireTaskWidget - + +task: QuestionnaireTask +completionPeriod: CompletionPeriod @@ -116,34 +75,45 @@ - + - + QuestionnaireTask + + + + + + + CompletionPeriod + + + + - - - + + + - + TaskScreen - + +taskInstance: TaskInstance - + <static>+MaterialPageRoute<bool> routeFor() @@ -152,15 +122,45 @@ - + - + TaskInstance + + + + + + + + CheckmarkTaskWidget + + + + + + +task: CheckmarkTask? + +completionPeriod: CompletionPeriod? + + + + + + + + + + + CheckmarkTask + + + + diff --git a/docs/uml/app/lib/screens/study/uml.svg b/docs/uml/app/lib/screens/study/uml.svg index 7c220fd37..5476a482f 100644 --- a/docs/uml/app/lib/screens/study/uml.svg +++ b/docs/uml/app/lib/screens/study/uml.svg @@ -1,28 +1,5 @@ - - [StudySelectionScreen - ] - - [InviteCodeDialog - ] - - [EligibilityResult - | - +eligible: bool; - +firstFailed: EligibilityCriterion? - ] - - [EligibilityResult]o-[EligibilityCriterion] - - [EligibilityScreen - | - +study: Study? - | - <static>+MaterialPageRoute<EligibilityResult> routeFor() - ] - - [EligibilityScreen]o-[Study] - - [ConsentScreen + + [ConsentScreen ] [ConsentCard @@ -48,6 +25,30 @@ [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 ] @@ -64,9 +65,23 @@ [_KickoffScreen]o-[StudySubject] - [InterventionSelectionScreen + [EligibilityResult + | + +eligible: bool; + +firstFailed: EligibilityCriterion? + ] + + [EligibilityResult]o-[EligibilityCriterion] + + [EligibilityScreen + | + +study: Study? + | + <static>+MaterialPageRoute<EligibilityResult> routeFor() ] + [EligibilityScreen]o-[Study] + [OnboardingProgress | +stage: int; @@ -76,30 +91,15 @@ +Widget build() ] - [StudyOverviewScreen + [StudySelectionScreen ] - [_StudyOverviewScreen - | - +study: Study? - | - +dynamic navigateToJourney(); - +dynamic navigateToEligibilityCheck(); - +Widget build() + [InviteCodeDialog ] - [_StudyOverviewScreen]o-[Study] - - [StudyDetailsView - | - +study: Study?; - +iconSize: double - | - +Widget build() + [InterventionSelectionScreen ] - [StudyDetailsView]o-[Study] - [JourneyOverviewScreen ] @@ -155,720 +155,632 @@ [TimelineChild]o-[<abstract>Widget] - [Settings - ] - - [OptOutAlertDialog + [AverageSectionWidget | - +subject: StudySubject? + +section: AverageSection; + +titlePos: List<int>; + +phasePos: List<int> | - +Widget build() + +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() ] - [OptOutAlertDialog]o-[StudySubject] + [AverageSectionWidget]o-[AverageSection] + [<abstract>ReportSectionWidget]<:-[AverageSectionWidget] - [DeleteAlertDialog + [DiagramDatum | - +subject: StudySubject? + +x: num; + +value: num; + +timestamp: DateTime?; + +intervention: String + ] + + [LinearRegressionSectionWidget + | + +section: LinearRegressionSection | +Widget build() ] - [DeleteAlertDialog]o-[StudySubject] + [LinearRegressionSectionWidget]o-[LinearRegressionSection] + [<abstract>ReportSectionWidget]<:-[LinearRegressionSectionWidget] - [DashboardScreen + [ReportHistoryScreen | - +error: String? + +Widget build() ] - [OverflowMenuItem + [ReportHistoryItem | - +name: String; - +icon: IconData; - +routeName: String?; - +onTap: dynamic Function()? + +subject: StudySubject + | + +Widget build() ] - [OverflowMenuItem]o-[IconData] - [OverflowMenuItem]o-[dynamic Function()?] + [ReportHistoryItem]o-[StudySubject] - [StudyFinishedPlaceholder + [ReportDetailsScreen | - <static>+space: SizedBox + +subject: StudySubject | + <static>+MaterialPageRoute<dynamic> routeFor(); +Widget build() ] - [StudyFinishedPlaceholder]o-[SizedBox] + [ReportDetailsScreen]o-[StudySubject] - [ProgressRow + [GeneralDetailsSection | - +subject: StudySubject? + +Widget buildContent() ] - [ProgressRow]o-[StudySubject] + [<abstract>GenericSection]<:-[GeneralDetailsSection] - [InterventionSegment + [<abstract>GenericSection | - +intervention: Intervention; - +percentCompleted: double; - +percentMissed: double; - +isCurrent: bool; - +isFuture: bool; - +phaseDuration: int + +subject: StudySubject?; + +onTap: void Function()? | - +List<Widget> buildSeparators(); + +Widget buildContent(); +Widget build() ] - [InterventionSegment]o-[Intervention] + [<abstract>GenericSection]o-[StudySubject] + [<abstract>GenericSection]o-[void Function()?] - [TaskBox + [DisclaimerSection | - +taskInstance: TaskInstance; - +icon: Icon; - +onCompleted: dynamic Function() + +Widget buildContent() ] - [TaskBox]o-[TaskInstance] - [TaskBox]o-[Icon] - [TaskBox]o-[dynamic Function()] + [<abstract>GenericSection]<:-[DisclaimerSection] - [TaskOverview + [<abstract>ReportSectionWidget | - +subject: StudySubject?; - +scheduleToday: List<TaskInstance>?; - +interventionIcon: String? + +subject: StudySubject ] - [TaskOverview]o-[StudySubject] + [<abstract>ReportSectionWidget]o-[StudySubject] - [FAQ + [LegendWidget + | + +name: String; + +color: Color | +Widget build() ] - [Entry - | - +title: String; - +children: List<Entry> - ] + [LegendWidget]o-[Color] - [EntryItem + [LegendsListWidget | - +entry: Entry + +legends: List<Legend> | - -Widget _buildTiles(); +Widget build() ] - [EntryItem]o-[Entry] - - [ContactScreen + [Legend + | + +name: String; + +color: Color ] - [ContactWidget + [Legend]o-[Color] + + [PerformanceDetailsScreen | - +contact: Contact?; - +title: String; - +subtitle: String?; - +color: Color + +reportSubject: StudySubject? | + <static>+MaterialPageRoute<dynamic> routeFor(); +Widget build() ] - [ContactWidget]o-[Contact] - [ContactWidget]o-[Color] + [PerformanceDetailsScreen]o-[StudySubject] - [ContactItem + [InterventionPerformanceBar | - +iconData: IconData; - +itemName: String; - +itemValue: String?; - +type: ContactItemType?; - +iconColor: Color? + +intervention: Intervention; + +subject: StudySubject? | - +dynamic launchContact(); +Widget build() ] - [ContactItem]o-[IconData] - [ContactItem]o-[ContactItemType] - [ContactItem]o-[Color] + [InterventionPerformanceBar]o-[Intervention] + [InterventionPerformanceBar]o-[StudySubject] - [ContactItemType + [ObservationPerformanceBar | - +index: int; - <static>+values: List<ContactItemType>; - <static>+website: ContactItemType; - <static>+email: ContactItemType; - <static>+phone: ContactItemType + +observation: Observation; + +subject: StudySubject? + | + +Widget build() ] - [ContactItemType]o-[ContactItemType] - [Enum]<:--[ContactItemType] + [ObservationPerformanceBar]o-[<abstract>Observation] + [ObservationPerformanceBar]o-[StudySubject] - [CheckmarkTaskWidget + [PerformanceBar | - +task: CheckmarkTask?; - +completionPeriod: CompletionPeriod? - ] - - [CheckmarkTaskWidget]o-[CheckmarkTask] - [CheckmarkTaskWidget]o-[CompletionPeriod] - - [QuestionnaireTaskWidget + +task: Task; + +completed: int; + +total: int | - +task: QuestionnaireTask; - +completionPeriod: CompletionPeriod + +Widget build() ] - [QuestionnaireTaskWidget]o-[QuestionnaireTask] - [QuestionnaireTaskWidget]o-[CompletionPeriod] + [PerformanceBar]o-[<abstract>Task] - [TaskScreen + [PerformanceSection | - +taskInstance: TaskInstance + +minimumRatio: double; + +maximum: double | - <static>+MaterialPageRoute<bool> routeFor() + +Widget buildContent(); + +String getPowerLevelDescription(); + +int getCountableObservationAmount() ] - [TaskScreen]o-[TaskInstance] + [<abstract>GenericSection]<:-[PerformanceSection] - [LegendWidget + [PerformanceBar | - +name: String; - +color: Color + +progress: double; + +minimum: double? | +Widget build() ] - [LegendWidget]o-[Color] - - [LegendsListWidget + [ReportSectionContainer | - +legends: List<Legend> + +section: ReportSection; + +subject: StudySubject; + +primary: bool; + +onTap: void Function()? | + +ReportSectionWidget buildContents(); + +dynamic (); + +List<Widget> buildPrimaryHeader(); +Widget build() ] - [Legend + [ReportSectionContainer]o-[<abstract>ReportSection] + [ReportSectionContainer]o-[StudySubject] + [ReportSectionContainer]o-[void Function()?] + + [Settings + ] + + [OptOutAlertDialog | - +name: String; - +color: Color + +subject: StudySubject? + | + +Widget build() ] - [Legend]o-[Color] + [OptOutAlertDialog]o-[StudySubject] - [GeneralDetailsSection + [DeleteAlertDialog | - +Widget buildContent() + +subject: StudySubject? + | + +Widget build() ] - [<abstract>GenericSection]<:-[GeneralDetailsSection] + [DeleteAlertDialog]o-[StudySubject] - [<abstract>ReportSectionWidget + [TaskBox | - +subject: StudySubject + +taskInstance: TaskInstance; + +icon: Icon; + +onCompleted: dynamic Function() ] - [<abstract>ReportSectionWidget]o-[StudySubject] + [TaskBox]o-[TaskInstance] + [TaskBox]o-[Icon] + [TaskBox]o-[dynamic Function()] - [PerformanceSection - | - +minimumRatio: double; - +maximum: double + [ProgressRow | - +Widget buildContent(); - +String getPowerLevelDescription(); - +int getCountableObservationAmount() + +subject: StudySubject? ] - [<abstract>GenericSection]<:-[PerformanceSection] + [ProgressRow]o-[StudySubject] - [PerformanceBar + [InterventionSegment | - +progress: double; - +minimum: double? + +intervention: Intervention; + +percentCompleted: double; + +percentMissed: double; + +isCurrent: bool; + +isFuture: bool; + +phaseDuration: int | + +List<Widget> buildSeparators(); +Widget build() ] - [PerformanceDetailsScreen - | - +reportSubject: StudySubject? + [InterventionSegment]o-[Intervention] + + [TaskOverview | - <static>+MaterialPageRoute<dynamic> routeFor(); - +Widget build() + +subject: StudySubject?; + +scheduleToday: List<TaskInstance>?; + +interventionIcon: String? ] - [PerformanceDetailsScreen]o-[StudySubject] + [TaskOverview]o-[StudySubject] - [InterventionPerformanceBar + [ContactScreen + ] + + [ContactWidget | - +intervention: Intervention; - +subject: StudySubject? + +contact: Contact?; + +title: String; + +subtitle: String?; + +color: Color | +Widget build() ] - [InterventionPerformanceBar]o-[Intervention] - [InterventionPerformanceBar]o-[StudySubject] + [ContactWidget]o-[Contact] + [ContactWidget]o-[Color] - [ObservationPerformanceBar + [ContactItem | - +observation: Observation; - +subject: StudySubject? + +iconData: IconData; + +itemName: String; + +itemValue: String?; + +type: ContactItemType?; + +iconColor: Color? | + +dynamic launchContact(); +Widget build() ] - [ObservationPerformanceBar]o-[<abstract>Observation] - [ObservationPerformanceBar]o-[StudySubject] + [ContactItem]o-[IconData] + [ContactItem]o-[ContactItemType] + [ContactItem]o-[Color] - [PerformanceBar - | - +task: Task; - +completed: int; - +total: int + [ContactItemType | - +Widget build() + +index: int; + <static>+values: List<ContactItemType>; + <static>+website: ContactItemType; + <static>+email: ContactItemType; + <static>+phone: ContactItemType ] - [PerformanceBar]o-[<abstract>Task] + [ContactItemType]o-[ContactItemType] + [Enum]<:--[ContactItemType] - [ReportHistoryScreen + [FAQ | +Widget build() ] - [ReportHistoryItem - | - +subject: StudySubject + [Entry | - +Widget build() + +title: String; + +children: List<Entry> ] - [ReportHistoryItem]o-[StudySubject] - - [ReportSectionContainer + [EntryItem | - +section: ReportSection; - +subject: StudySubject; - +primary: bool; - +onTap: void Function()? + +entry: Entry | - +ReportSectionWidget buildContents(); - +dynamic (); - +List<Widget> buildPrimaryHeader(); + -Widget _buildTiles(); +Widget build() ] - [ReportSectionContainer]o-[<abstract>ReportSection] - [ReportSectionContainer]o-[StudySubject] - [ReportSectionContainer]o-[void Function()?] + [EntryItem]o-[Entry] - [DisclaimerSection + [DashboardScreen | - +Widget buildContent() + +error: String? ] - [<abstract>GenericSection]<:-[DisclaimerSection] - - [<abstract>GenericSection - | - +subject: StudySubject?; - +onTap: void Function()? + [OverflowMenuItem | - +Widget buildContent(); - +Widget build() + +name: String; + +icon: IconData; + +routeName: String?; + +onTap: dynamic Function()? ] - [<abstract>GenericSection]o-[StudySubject] - [<abstract>GenericSection]o-[void Function()?] + [OverflowMenuItem]o-[IconData] + [OverflowMenuItem]o-[dynamic Function()?] - [ReportDetailsScreen + [StudyFinishedPlaceholder | - +subject: StudySubject + <static>+space: SizedBox | - <static>+MaterialPageRoute<dynamic> routeFor(); +Widget build() ] - [ReportDetailsScreen]o-[StudySubject] + [StudyFinishedPlaceholder]o-[SizedBox] - [LinearRegressionSectionWidget - | - +section: LinearRegressionSection + [QuestionnaireTaskWidget | - +Widget build() + +task: QuestionnaireTask; + +completionPeriod: CompletionPeriod ] - [LinearRegressionSectionWidget]o-[LinearRegressionSection] - [<abstract>ReportSectionWidget]<:-[LinearRegressionSectionWidget] + [QuestionnaireTaskWidget]o-[QuestionnaireTask] + [QuestionnaireTaskWidget]o-[CompletionPeriod] - [AverageSectionWidget + [TaskScreen | - +section: AverageSection; - +titlePos: List<int>; - +phasePos: List<int> + +taskInstance: TaskInstance | - +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() + <static>+MaterialPageRoute<bool> routeFor() ] - [AverageSectionWidget]o-[AverageSection] - [<abstract>ReportSectionWidget]<:-[AverageSectionWidget] + [TaskScreen]o-[TaskInstance] - [DiagramDatum + [CheckmarkTaskWidget | - +x: num; - +value: num; - +timestamp: DateTime?; - +intervention: String + +task: CheckmarkTask?; + +completionPeriod: CompletionPeriod? ] + [CheckmarkTaskWidget]o-[CheckmarkTask] + [CheckmarkTaskWidget]o-[CompletionPeriod] + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + - + - + + + - + - + - + - + + + - + - + - + - + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + - + - + - + - + - - - - + - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - + - + - - - + - + - + - + - + - + - + - + - + - + - + - + - - - + + - + + - + - + - + - + - + - - - + - + - + - + - + - + - + - + - - - + - - - - - - - - - - - StudySelectionScreen - - - - - - - - - - - InviteCodeDialog - - - - - - - - - - - - EligibilityResult - - - - - - +eligible: bool - +firstFailed: EligibilityCriterion? - - - - - - - - - - - EligibilityCriterion - - - - - - - - - - - - - EligibilityScreen - - - - - - +study: Study? - - - - - - <static>+MaterialPageRoute<EligibilityResult> routeFor() - - - + - - - - - - - Study - - - + + + - + - + ConsentScreen @@ -877,17 +789,17 @@ - - - + + + - + ConsentCard - + +consent: ConsentItem? +index: int? @@ -896,7 +808,7 @@ - + +Widget build() @@ -905,9 +817,9 @@ - + - + ConsentItem @@ -916,9 +828,9 @@ - + - + dynamic Function(int) @@ -927,16 +839,16 @@ - - + + - + ConsentElement - + +title: String +descriptionText: String @@ -948,20 +860,95 @@ - + - + IconData + + + + + + + StudyOverviewScreen + + + + + + + + + + + + + _StudyOverviewScreen + + + + + + +study: Study? + + + + + + +dynamic navigateToJourney() + +dynamic navigateToEligibilityCheck() + +Widget build() + + + + + + + + + + + Study + + + + + + + + + + + + + StudyDetailsView + + + + + + +study: Study? + +iconSize: double + + + + + + +Widget build() + + + + - + - + KickoffScreen @@ -970,24 +957,24 @@ - - - + + + - + _KickoffScreen - + +subject: StudySubject? +ready: bool - + -dynamic _storeUserStudy() -Widget _constructStatusIcon() @@ -999,122 +986,135 @@ - + - + StudySubject - - - + + + + - - - InterventionSelectionScreen + + + EligibilityResult + + + + + + +eligible: bool + +firstFailed: EligibilityCriterion? - - - - - + + + - - - OnboardingProgress + + + EligibilityCriterion - - - +stage: int - +progress: double + + + + + + + + + + EligibilityScreen - - - -double _getProgressForStage() - +Widget build() + + + +study: Study? - - - - - - - - StudyOverviewScreen + + + <static>+MaterialPageRoute<EligibilityResult> routeFor() - - - - - + + + + + - - - _StudyOverviewScreen + + + OnboardingProgress - - - +study: Study? + + + +stage: int + +progress: double - - - +dynamic navigateToJourney() - +dynamic navigateToEligibilityCheck() - +Widget build() + + + -double _getProgressForStage() + +Widget build() - - - - - + + + - - - StudyDetailsView + + + StudySelectionScreen - - - +study: Study? - +iconSize: double + + + + + + + + InviteCodeDialog - - - +Widget build() + + + + + + + + InterventionSelectionScreen - + - + JourneyOverviewScreen @@ -1123,23 +1123,23 @@ - - - + + + - + _JourneyOverviewScreen - + +subject: StudySubject? - + +dynamic getConsentAndNavigateToDashboard() +Widget build() @@ -1149,23 +1149,23 @@ - - - + + + - + Timeline - + +subject: StudySubject? - + +Widget build() @@ -1174,17 +1174,17 @@ - - - + + + - + InterventionTile - + +title: String? +iconName: String @@ -1195,7 +1195,7 @@ - + +Widget build() @@ -1204,9 +1204,9 @@ - + - + Color @@ -1215,24 +1215,24 @@ - - - + + + - + IconIndicator - + +iconName: String +color: Color? - + +Widget build() @@ -1241,23 +1241,23 @@ - - - + + + - + TimelineChild - + +child: Widget? - + +Widget build() @@ -1266,1096 +1266,1097 @@ - + - + Widget - - - + + + + + - - - Settings + + + AverageSectionWidget - - - - - - - - - - OptOutAlertDialog + + + +section: AverageSection + +titlePos: List<int> + +phasePos: List<int> - - - +subject: StudySubject? - - - - - - +Widget build() + + + +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() - - - - - + + + - - - DeleteAlertDialog + + + AverageSection - - - +subject: StudySubject? + + + + + + + + + ReportSectionWidget - - - +Widget build() + + + +subject: StudySubject - - - - + + + + - - - DashboardScreen + + + DiagramDatum - - - +error: String? + + + +x: num + +value: num + +timestamp: DateTime? + +intervention: String - - - - + + + + + - - - OverflowMenuItem + + + LinearRegressionSectionWidget - - - +name: String - +icon: IconData - +routeName: String? - +onTap: dynamic Function()? + + + +section: LinearRegressionSection - - - - - - - - dynamic Function()? + + + +Widget build() - - - - - + + + - - - StudyFinishedPlaceholder + + + LinearRegressionSection - - - <static>+space: SizedBox + + + + + + + + + ReportHistoryScreen - - - +Widget build() + + + +Widget build() - - - + + + + + - - - SizedBox + + + ReportHistoryItem - - - - - - - - - ProgressRow + + + +subject: StudySubject - - - +subject: StudySubject? + + + +Widget build() - - - - - + + + + + - - - InterventionSegment + + + ReportDetailsScreen - - - +intervention: Intervention - +percentCompleted: double - +percentMissed: double - +isCurrent: bool - +isFuture: bool - +phaseDuration: int + + + +subject: StudySubject - - - +List<Widget> buildSeparators() - +Widget build() + + + <static>+MaterialPageRoute<dynamic> routeFor() + +Widget build() - - - + + + + - - - Intervention + + + GeneralDetailsSection + + + + + + +Widget buildContent() - - - - + + + + + - - - TaskBox + + + GenericSection - - - +taskInstance: TaskInstance - +icon: Icon - +onCompleted: dynamic Function() + + + +subject: StudySubject? + +onTap: void Function()? - - - - - - - - TaskInstance + + + +Widget buildContent() + +Widget build() - - - + + + - - - Icon + + + void Function()? - - - + + + + - - - dynamic Function() + + + DisclaimerSection + + + + + + +Widget buildContent() - - - - + + + + + - - - TaskOverview + + + LegendWidget - - - +subject: StudySubject? - +scheduleToday: List<TaskInstance>? - +interventionIcon: String? + + + +name: String + +color: Color + + + + + + +Widget build() - - - - + + + + + - - - FAQ + + + LegendsListWidget - - - +Widget build() + + + +legends: List<Legend> + + + + + + +Widget build() - - - - + + + + - - - Entry + + + Legend - - - +title: String - +children: List<Entry> + + + +name: String + +color: Color - - - - - + + + + + - - - EntryItem + + + PerformanceDetailsScreen - - - +entry: Entry + + + +reportSubject: StudySubject? - - - -Widget _buildTiles() - +Widget build() + + + <static>+MaterialPageRoute<dynamic> routeFor() + +Widget build() - - - + + + + + - - - ContactScreen - - - - - - - - - - - - - ContactWidget + + + InterventionPerformanceBar - - - +contact: Contact? - +title: String - +subtitle: String? - +color: Color + + + +intervention: Intervention + +subject: StudySubject? - - - +Widget build() + + + +Widget build() - - - + + + - - - Contact + + + Intervention - - - - - + + + + + - - - ContactItem + + + ObservationPerformanceBar - - - +iconData: IconData - +itemName: String - +itemValue: String? - +type: ContactItemType? - +iconColor: Color? + + + +observation: Observation + +subject: StudySubject? - - - +dynamic launchContact() - +Widget build() + + + +Widget build() - - - - - - - - ContactItemType - - + + + - - - +index: int - <static>+values: List<ContactItemType> - <static>+website: ContactItemType - <static>+email: ContactItemType - <static>+phone: ContactItemType + + + Observation - - - + + + + + - - - Enum + + + PerformanceBar - - - - - - - - - CheckmarkTaskWidget + + + +task: Task + +completed: int + +total: int - - - +task: CheckmarkTask? - +completionPeriod: CompletionPeriod? + + + +Widget build() - - - + + + - - - CheckmarkTask + + + Task - - - + + + + + - - - CompletionPeriod + + + PerformanceSection - - - - - - - - - QuestionnaireTaskWidget + + + +minimumRatio: double + +maximum: double - - - +task: QuestionnaireTask - +completionPeriod: CompletionPeriod + + + +Widget buildContent() + +String getPowerLevelDescription() + +int getCountableObservationAmount() - - - + + + + + - - - QuestionnaireTask + + + ReportSectionContainer - - - - - - + + + +section: ReportSection + +subject: StudySubject + +primary: bool + +onTap: void Function()? + + - - - TaskScreen + + + +ReportSectionWidget buildContents() + +dynamic () + +List<Widget> buildPrimaryHeader() + +Widget build() - - - +taskInstance: TaskInstance + + + + + + + + ReportSection - - - <static>+MaterialPageRoute<bool> routeFor() + + + + + + + + Settings - - - - - + + + + + - - - LegendWidget + + + OptOutAlertDialog - - - +name: String - +color: Color + + + +subject: StudySubject? - - - +Widget build() + + + +Widget build() - - - - - + + + + + - - - LegendsListWidget + + + DeleteAlertDialog - - - +legends: List<Legend> + + + +subject: StudySubject? - - - +Widget build() + + + +Widget build() - - - - + + + + - - - Legend + + + TaskBox - - - +name: String - +color: Color + + + +taskInstance: TaskInstance + +icon: Icon + +onCompleted: dynamic Function() - - - - + + + - - - GeneralDetailsSection + + + TaskInstance - - - +Widget buildContent() + + + + + + + + Icon - - - - - + + + - - - GenericSection + + + dynamic Function() - - - +subject: StudySubject? - +onTap: void Function()? + + + + + + + + + ProgressRow - - - +Widget buildContent() - +Widget build() + + + +subject: StudySubject? - - - - + + + + + - - - ReportSectionWidget + + + InterventionSegment - - - +subject: StudySubject + + + +intervention: Intervention + +percentCompleted: double + +percentMissed: double + +isCurrent: bool + +isFuture: bool + +phaseDuration: int - - - - - - - - - - PerformanceSection + + + +List<Widget> buildSeparators() + +Widget build() - - - +minimumRatio: double - +maximum: double + + + + + + + + + TaskOverview - - - +Widget buildContent() - +String getPowerLevelDescription() - +int getCountableObservationAmount() + + + +subject: StudySubject? + +scheduleToday: List<TaskInstance>? + +interventionIcon: String? - - - - - + + + - - - PerformanceBar + + + ContactScreen - - - +progress: double - +minimum: double? - - + + + + + + - - - +Widget build() + + + ContactWidget - - - - - - - - - - PerformanceDetailsScreen + + + +contact: Contact? + +title: String + +subtitle: String? + +color: Color - - - +reportSubject: StudySubject? + + + +Widget build() - - - <static>+MaterialPageRoute<dynamic> routeFor() - +Widget build() + + + + + + + + Contact - - - - - + + + + + - - - InterventionPerformanceBar + + + ContactItem - - - +intervention: Intervention - +subject: StudySubject? + + + +iconData: IconData + +itemName: String + +itemValue: String? + +type: ContactItemType? + +iconColor: Color? - - - +Widget build() + + + +dynamic launchContact() + +Widget build() - - - - - + + + + - - - ObservationPerformanceBar + + + ContactItemType - - - +observation: Observation - +subject: StudySubject? + + + +index: int + <static>+values: List<ContactItemType> + <static>+website: ContactItemType + <static>+email: ContactItemType + <static>+phone: ContactItemType - - - +Widget build() + + + + + + + + Enum - - - + + + + - - - Observation + + + FAQ - - - - - - - - Task + + + +Widget build() - - - - + + + + - - - ReportHistoryScreen + + + Entry - - - +Widget build() + + + +title: String + +children: List<Entry> - - - - - + + + + + - - - ReportHistoryItem + + + EntryItem - - - +subject: StudySubject + + + +entry: Entry - - - +Widget build() + + + -Widget _buildTiles() + +Widget build() - - - - - + + + + - - - ReportSectionContainer + + + DashboardScreen - - - +section: ReportSection - +subject: StudySubject - +primary: bool - +onTap: void Function()? + + + +error: String? - - - +ReportSectionWidget buildContents() - +dynamic () - +List<Widget> buildPrimaryHeader() - +Widget build() + + + + + + + + + OverflowMenuItem - - - - - - - - ReportSection + + + +name: String + +icon: IconData + +routeName: String? + +onTap: dynamic Function()? - - - + + + - - - void Function()? + + + dynamic Function()? - - - - + + + + + - - - DisclaimerSection + + + StudyFinishedPlaceholder - - - +Widget buildContent() + + + <static>+space: SizedBox - - - - - - - - - - ReportDetailsScreen + + + +Widget build() - - - +subject: StudySubject - - + + + + - - - <static>+MaterialPageRoute<dynamic> routeFor() - +Widget build() + + + SizedBox - - - - - + + + + - - - LinearRegressionSectionWidget + + + QuestionnaireTaskWidget - - - +section: LinearRegressionSection + + + +task: QuestionnaireTask + +completionPeriod: CompletionPeriod - - - +Widget build() + + + + + + + + QuestionnaireTask - - - + + + - - - LinearRegressionSection + + + CompletionPeriod - - - - - + + + + + - - - AverageSectionWidget + + + TaskScreen - - - +section: AverageSection - +titlePos: List<int> - +phasePos: List<int> + + + +taskInstance: TaskInstance - - - +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() + + + <static>+MaterialPageRoute<bool> routeFor() - - - + + + + - - - AverageSection + + + CheckmarkTaskWidget - - - - - - - - - DiagramDatum + + + +task: CheckmarkTask? + +completionPeriod: CompletionPeriod? - - - +x: num - +value: num - +timestamp: DateTime? - +intervention: String + + + + + + + + CheckmarkTask diff --git a/docs/uml/app/lib/screens/uml.svg b/docs/uml/app/lib/screens/uml.svg index d58e92730..7e5967908 100644 --- a/docs/uml/app/lib/screens/uml.svg +++ b/docs/uml/app/lib/screens/uml.svg @@ -1,28 +1,5 @@ - - [StudySelectionScreen - ] - - [InviteCodeDialog - ] - - [EligibilityResult - | - +eligible: bool; - +firstFailed: EligibilityCriterion? - ] - - [EligibilityResult]o-[EligibilityCriterion] - - [EligibilityScreen - | - +study: Study? - | - <static>+MaterialPageRoute<EligibilityResult> routeFor() - ] - - [EligibilityScreen]o-[Study] - - [ConsentScreen + + [ConsentScreen ] [ConsentCard @@ -48,6 +25,30 @@ [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 ] @@ -64,9 +65,23 @@ [_KickoffScreen]o-[StudySubject] - [InterventionSelectionScreen + [EligibilityResult + | + +eligible: bool; + +firstFailed: EligibilityCriterion? + ] + + [EligibilityResult]o-[EligibilityCriterion] + + [EligibilityScreen + | + +study: Study? + | + <static>+MaterialPageRoute<EligibilityResult> routeFor() ] + [EligibilityScreen]o-[Study] + [OnboardingProgress | +stage: int; @@ -76,30 +91,15 @@ +Widget build() ] - [StudyOverviewScreen + [StudySelectionScreen ] - [_StudyOverviewScreen - | - +study: Study? - | - +dynamic navigateToJourney(); - +dynamic navigateToEligibilityCheck(); - +Widget build() + [InviteCodeDialog ] - [_StudyOverviewScreen]o-[Study] - - [StudyDetailsView - | - +study: Study?; - +iconSize: double - | - +Widget build() + [InterventionSelectionScreen ] - [StudyDetailsView]o-[Study] - [JourneyOverviewScreen ] @@ -155,224 +155,171 @@ [TimelineChild]o-[<abstract>Widget] - [Settings - ] - - [OptOutAlertDialog + [AverageSectionWidget | - +subject: StudySubject? + +section: AverageSection; + +titlePos: List<int>; + +phasePos: List<int> | - +Widget build() + +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() ] - [OptOutAlertDialog]o-[StudySubject] + [AverageSectionWidget]o-[AverageSection] + [<abstract>ReportSectionWidget]<:-[AverageSectionWidget] - [DeleteAlertDialog + [DiagramDatum | - +subject: StudySubject? + +x: num; + +value: num; + +timestamp: DateTime?; + +intervention: String + ] + + [LinearRegressionSectionWidget + | + +section: LinearRegressionSection | +Widget build() ] - [DeleteAlertDialog]o-[StudySubject] + [LinearRegressionSectionWidget]o-[LinearRegressionSection] + [<abstract>ReportSectionWidget]<:-[LinearRegressionSectionWidget] - [DashboardScreen + [ReportHistoryScreen | - +error: String? + +Widget build() ] - [OverflowMenuItem + [ReportHistoryItem | - +name: String; - +icon: IconData; - +routeName: String?; - +onTap: dynamic Function()? + +subject: StudySubject + | + +Widget build() ] - [OverflowMenuItem]o-[IconData] - [OverflowMenuItem]o-[dynamic Function()?] + [ReportHistoryItem]o-[StudySubject] - [StudyFinishedPlaceholder + [ReportDetailsScreen | - <static>+space: SizedBox + +subject: StudySubject | + <static>+MaterialPageRoute<dynamic> routeFor(); +Widget build() ] - [StudyFinishedPlaceholder]o-[SizedBox] + [ReportDetailsScreen]o-[StudySubject] - [ProgressRow + [GeneralDetailsSection | - +subject: StudySubject? + +Widget buildContent() ] - [ProgressRow]o-[StudySubject] + [<abstract>GenericSection]<:-[GeneralDetailsSection] - [InterventionSegment + [<abstract>GenericSection | - +intervention: Intervention; - +percentCompleted: double; - +percentMissed: double; - +isCurrent: bool; - +isFuture: bool; - +phaseDuration: int + +subject: StudySubject?; + +onTap: void Function()? | - +List<Widget> buildSeparators(); + +Widget buildContent(); +Widget build() ] - [InterventionSegment]o-[Intervention] + [<abstract>GenericSection]o-[StudySubject] + [<abstract>GenericSection]o-[void Function()?] - [TaskBox + [DisclaimerSection | - +taskInstance: TaskInstance; - +icon: Icon; - +onCompleted: dynamic Function() + +Widget buildContent() ] - [TaskBox]o-[TaskInstance] - [TaskBox]o-[Icon] - [TaskBox]o-[dynamic Function()] + [<abstract>GenericSection]<:-[DisclaimerSection] - [TaskOverview + [<abstract>ReportSectionWidget | - +subject: StudySubject?; - +scheduleToday: List<TaskInstance>?; - +interventionIcon: String? + +subject: StudySubject ] - [TaskOverview]o-[StudySubject] + [<abstract>ReportSectionWidget]o-[StudySubject] - [FAQ + [LegendWidget + | + +name: String; + +color: Color | +Widget build() ] - [Entry - | - +title: String; - +children: List<Entry> - ] + [LegendWidget]o-[Color] - [EntryItem + [LegendsListWidget | - +entry: Entry + +legends: List<Legend> | - -Widget _buildTiles(); +Widget build() ] - [EntryItem]o-[Entry] - - [ContactScreen + [Legend + | + +name: String; + +color: Color ] - [ContactWidget + [Legend]o-[Color] + + [PerformanceDetailsScreen | - +contact: Contact?; - +title: String; - +subtitle: String?; - +color: Color + +reportSubject: StudySubject? | + <static>+MaterialPageRoute<dynamic> routeFor(); +Widget build() ] - [ContactWidget]o-[Contact] - [ContactWidget]o-[Color] + [PerformanceDetailsScreen]o-[StudySubject] - [ContactItem + [InterventionPerformanceBar | - +iconData: IconData; - +itemName: String; - +itemValue: String?; - +type: ContactItemType?; - +iconColor: Color? + +intervention: Intervention; + +subject: StudySubject? | - +dynamic launchContact(); +Widget build() ] - [ContactItem]o-[IconData] - [ContactItem]o-[ContactItemType] - [ContactItem]o-[Color] + [InterventionPerformanceBar]o-[Intervention] + [InterventionPerformanceBar]o-[StudySubject] - [ContactItemType + [ObservationPerformanceBar | - +index: int; - <static>+values: List<ContactItemType>; - <static>+website: ContactItemType; - <static>+email: ContactItemType; - <static>+phone: ContactItemType + +observation: Observation; + +subject: StudySubject? + | + +Widget build() ] - [ContactItemType]o-[ContactItemType] - [Enum]<:--[ContactItemType] + [ObservationPerformanceBar]o-[<abstract>Observation] + [ObservationPerformanceBar]o-[StudySubject] - [CheckmarkTaskWidget + [PerformanceBar | - +task: CheckmarkTask?; - +completionPeriod: CompletionPeriod? - ] - - [CheckmarkTaskWidget]o-[CheckmarkTask] - [CheckmarkTaskWidget]o-[CompletionPeriod] - - [QuestionnaireTaskWidget - | - +task: QuestionnaireTask; - +completionPeriod: CompletionPeriod - ] - - [QuestionnaireTaskWidget]o-[QuestionnaireTask] - [QuestionnaireTaskWidget]o-[CompletionPeriod] - - [TaskScreen - | - +taskInstance: TaskInstance - | - <static>+MaterialPageRoute<bool> routeFor() - ] - - [TaskScreen]o-[TaskInstance] - - [LegendWidget - | - +name: String; - +color: Color - | - +Widget build() - ] - - [LegendWidget]o-[Color] - - [LegendsListWidget - | - +legends: List<Legend> + +task: Task; + +completed: int; + +total: int | +Widget build() ] - [Legend - | - +name: String; - +color: Color - ] - - [Legend]o-[Color] - - [GeneralDetailsSection - | - +Widget buildContent() - ] - - [<abstract>GenericSection]<:-[GeneralDetailsSection] - - [<abstract>ReportSectionWidget - | - +subject: StudySubject - ] - - [<abstract>ReportSectionWidget]o-[StudySubject] + [PerformanceBar]o-[<abstract>Task] [PerformanceSection | @@ -394,162 +341,204 @@ +Widget build() ] - [PerformanceDetailsScreen + [ReportSectionContainer | - +reportSubject: StudySubject? + +section: ReportSection; + +subject: StudySubject; + +primary: bool; + +onTap: void Function()? | - <static>+MaterialPageRoute<dynamic> routeFor(); + +ReportSectionWidget buildContents(); + +dynamic (); + +List<Widget> buildPrimaryHeader(); +Widget build() ] - [PerformanceDetailsScreen]o-[StudySubject] + [ReportSectionContainer]o-[<abstract>ReportSection] + [ReportSectionContainer]o-[StudySubject] + [ReportSectionContainer]o-[void Function()?] - [InterventionPerformanceBar + [Settings + ] + + [OptOutAlertDialog | - +intervention: Intervention; +subject: StudySubject? | +Widget build() ] - [InterventionPerformanceBar]o-[Intervention] - [InterventionPerformanceBar]o-[StudySubject] + [OptOutAlertDialog]o-[StudySubject] - [ObservationPerformanceBar + [DeleteAlertDialog | - +observation: Observation; +subject: StudySubject? | +Widget build() ] - [ObservationPerformanceBar]o-[<abstract>Observation] - [ObservationPerformanceBar]o-[StudySubject] + [DeleteAlertDialog]o-[StudySubject] - [PerformanceBar + [TaskBox | - +task: Task; - +completed: int; - +total: int + +taskInstance: TaskInstance; + +icon: Icon; + +onCompleted: dynamic Function() + ] + + [TaskBox]o-[TaskInstance] + [TaskBox]o-[Icon] + [TaskBox]o-[dynamic Function()] + + [ProgressRow | - +Widget build() + +subject: StudySubject? ] - [PerformanceBar]o-[<abstract>Task] + [ProgressRow]o-[StudySubject] - [ReportHistoryScreen + [InterventionSegment | + +intervention: Intervention; + +percentCompleted: double; + +percentMissed: double; + +isCurrent: bool; + +isFuture: bool; + +phaseDuration: int + | + +List<Widget> buildSeparators(); +Widget build() ] - [ReportHistoryItem + [InterventionSegment]o-[Intervention] + + [TaskOverview | - +subject: StudySubject + +subject: StudySubject?; + +scheduleToday: List<TaskInstance>?; + +interventionIcon: String? + ] + + [TaskOverview]o-[StudySubject] + + [ContactScreen + ] + + [ContactWidget + | + +contact: Contact?; + +title: String; + +subtitle: String?; + +color: Color | +Widget build() ] - [ReportHistoryItem]o-[StudySubject] + [ContactWidget]o-[Contact] + [ContactWidget]o-[Color] - [ReportSectionContainer + [ContactItem | - +section: ReportSection; - +subject: StudySubject; - +primary: bool; - +onTap: void Function()? + +iconData: IconData; + +itemName: String; + +itemValue: String?; + +type: ContactItemType?; + +iconColor: Color? | - +ReportSectionWidget buildContents(); - +dynamic (); - +List<Widget> buildPrimaryHeader(); + +dynamic launchContact(); +Widget build() ] - [ReportSectionContainer]o-[<abstract>ReportSection] - [ReportSectionContainer]o-[StudySubject] - [ReportSectionContainer]o-[void Function()?] + [ContactItem]o-[IconData] + [ContactItem]o-[ContactItemType] + [ContactItem]o-[Color] - [DisclaimerSection + [ContactItemType | - +Widget buildContent() + +index: int; + <static>+values: List<ContactItemType>; + <static>+website: ContactItemType; + <static>+email: ContactItemType; + <static>+phone: ContactItemType ] - [<abstract>GenericSection]<:-[DisclaimerSection] + [ContactItemType]o-[ContactItemType] + [Enum]<:--[ContactItemType] - [<abstract>GenericSection - | - +subject: StudySubject?; - +onTap: void Function()? + [FAQ | - +Widget buildContent(); +Widget build() ] - [<abstract>GenericSection]o-[StudySubject] - [<abstract>GenericSection]o-[void Function()?] + [Entry + | + +title: String; + +children: List<Entry> + ] - [ReportDetailsScreen + [EntryItem | - +subject: StudySubject + +entry: Entry | - <static>+MaterialPageRoute<dynamic> routeFor(); + -Widget _buildTiles(); +Widget build() ] - [ReportDetailsScreen]o-[StudySubject] + [EntryItem]o-[Entry] - [LinearRegressionSectionWidget + [DashboardScreen | - +section: LinearRegressionSection + +error: String? + ] + + [OverflowMenuItem | - +Widget build() + +name: String; + +icon: IconData; + +routeName: String?; + +onTap: dynamic Function()? ] - [LinearRegressionSectionWidget]o-[LinearRegressionSection] - [<abstract>ReportSectionWidget]<:-[LinearRegressionSectionWidget] + [OverflowMenuItem]o-[IconData] + [OverflowMenuItem]o-[dynamic Function()?] - [AverageSectionWidget + [StudyFinishedPlaceholder | - +section: AverageSection; - +titlePos: List<int>; - +phasePos: List<int> + <static>+space: SizedBox | - +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() + +Widget build() ] - [AverageSectionWidget]o-[AverageSection] - [<abstract>ReportSectionWidget]<:-[AverageSectionWidget] + [StudyFinishedPlaceholder]o-[SizedBox] - [DiagramDatum + [QuestionnaireTaskWidget | - +x: num; - +value: num; - +timestamp: DateTime?; - +intervention: String + +task: QuestionnaireTask; + +completionPeriod: CompletionPeriod ] - [LoadingScreen + [QuestionnaireTaskWidget]o-[QuestionnaireTask] + [QuestionnaireTaskWidget]o-[CompletionPeriod] + + [TaskScreen | - +sessionString: String?; - +queryParameters: Map<String, String>? + +taskInstance: TaskInstance + | + <static>+MaterialPageRoute<bool> routeFor() ] - [AppOutdatedScreen + [TaskScreen]o-[TaskInstance] + + [CheckmarkTaskWidget | - +Widget build() + +task: CheckmarkTask?; + +completionPeriod: CompletionPeriod? ] - [WelcomeScreen + [CheckmarkTaskWidget]o-[CheckmarkTask] + [CheckmarkTaskWidget]o-[CompletionPeriod] + + [AppOutdatedScreen | +Widget build() ] @@ -580,6 +569,17 @@ +void listen() ] + [LoadingScreen + | + +sessionString: String?; + +queryParameters: Map<String, String>? + ] + + [AboutScreen + | + +Widget build() + ] + [Preview | +queryParameters: Map<String, String>?; @@ -607,7 +607,7 @@ [Preview]o-[Study] [Preview]o-[StudySubject] - [AboutScreen + [WelcomeScreen | +Widget build() ] @@ -616,353 +616,265 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + - + - + + + - + - + - + - + + + - + - + - + - + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + - + - + - + - + - - - - + - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - + - + - - - + - + - + - + - + - + - + - + - + - + - + - + - - - + + - + + - + - + - + - + - + - - - + - + - + - + - + - + - + - + - - - + - + - - - + - + - + - + - + - + - + - + - + - - - - - - - - - StudySelectionScreen - - - - - - - - - - - InviteCodeDialog - - - + - - - - - - - - EligibilityResult - - - - - - +eligible: bool - +firstFailed: EligibilityCriterion? - - - - - - - - - - - EligibilityCriterion - - - - - - - - - - - - - EligibilityScreen - - - - - - +study: Study? - - - - - - <static>+MaterialPageRoute<EligibilityResult> routeFor() - - - - - - - - - - - Study - - - + + + - + - + ConsentScreen @@ -971,17 +883,17 @@ - - - + + + - + ConsentCard - + +consent: ConsentItem? +index: int? @@ -990,7 +902,7 @@ - + +Widget build() @@ -999,9 +911,9 @@ - + - + ConsentItem @@ -1010,9 +922,9 @@ - + - + dynamic Function(int) @@ -1021,16 +933,16 @@ - - + + - + ConsentElement - + +title: String +descriptionText: String @@ -1042,20 +954,95 @@ - + - + IconData + + + + + + + StudyOverviewScreen + + + + + + + + + + + + + _StudyOverviewScreen + + + + + + +study: Study? + + + + + + +dynamic navigateToJourney() + +dynamic navigateToEligibilityCheck() + +Widget build() + + + + + + + + + + + Study + + + + + + + + + + + + + StudyDetailsView + + + + + + +study: Study? + +iconSize: double + + + + + + +Widget build() + + + + - + - + KickoffScreen @@ -1064,75 +1051,119 @@ - - - + + + - + _KickoffScreen - + +subject: StudySubject? +ready: bool - - - -dynamic _storeUserStudy() - -Widget _constructStatusIcon() - -String _getStatusText() - +Widget build() + + + -dynamic _storeUserStudy() + -Widget _constructStatusIcon() + -String _getStatusText() + +Widget build() + + + + + + + + + + + StudySubject + + + + + + + + + + + + EligibilityResult + + + + + + +eligible: bool + +firstFailed: EligibilityCriterion? + + + + + + + + + + + EligibilityCriterion - - - + + + + + - - - StudySubject + + + EligibilityScreen - - - - + + + +study: Study? + + - - - InterventionSelectionScreen + + + <static>+MaterialPageRoute<EligibilityResult> routeFor() - - - + + + - + OnboardingProgress - + +stage: int +progress: double - + -double _getProgressForStage() +Widget build() @@ -1140,75 +1171,44 @@ - - - + + + - - - StudyOverviewScreen + + + StudySelectionScreen - - - - - - - - - _StudyOverviewScreen - - - - - - +study: Study? - - + + + - - - +dynamic navigateToJourney() - +dynamic navigateToEligibilityCheck() - +Widget build() + + + InviteCodeDialog - - - - - - - - - StudyDetailsView - - - - - - +study: Study? - +iconSize: double - - + + + - - - +Widget build() + + + InterventionSelectionScreen - + - + JourneyOverviewScreen @@ -1217,23 +1217,23 @@ - - - + + + - + _JourneyOverviewScreen - + +subject: StudySubject? - + +dynamic getConsentAndNavigateToDashboard() +Widget build() @@ -1243,23 +1243,23 @@ - - - + + + - + Timeline - + +subject: StudySubject? - + +Widget build() @@ -1268,17 +1268,17 @@ - - - + + + - + InterventionTile - + +title: String? +iconName: String @@ -1289,7 +1289,7 @@ - + +Widget build() @@ -1298,9 +1298,9 @@ - + - + Color @@ -1309,24 +1309,24 @@ - - - + + + - + IconIndicator - + +iconName: String +color: Color? - + +Widget build() @@ -1335,23 +1335,23 @@ - - - + + + - + TimelineChild - + +child: Widget? - + +Widget build() @@ -1360,1160 +1360,1124 @@ - + - + Widget - - - - - - - Settings - - - - - - - - - + + + + + - - - OptOutAlertDialog + + + AverageSectionWidget - - - +subject: StudySubject? + + + +section: AverageSection + +titlePos: List<int> + +phasePos: List<int> - - - +Widget build() + + + +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() - - - - - - - - - DeleteAlertDialog - - - - - - +subject: StudySubject? - - + + + - - - +Widget build() + + + AverageSection - - - - + + + + - - - DashboardScreen + + + ReportSectionWidget - - - +error: String? + + + +subject: StudySubject - - - - - - - - OverflowMenuItem - - + + + + - - - +name: String - +icon: IconData - +routeName: String? - +onTap: dynamic Function()? + + + DiagramDatum - - - - - - - - dynamic Function()? + + + +x: num + +value: num + +timestamp: DateTime? + +intervention: String - - - - - + + + + + - - - StudyFinishedPlaceholder + + + LinearRegressionSectionWidget - - - <static>+space: SizedBox + + + +section: LinearRegressionSection - - - +Widget build() + + + +Widget build() - - - + + + - - - SizedBox + + + LinearRegressionSection - - - - + + + + - - - ProgressRow + + + ReportHistoryScreen - - - +subject: StudySubject? + + + +Widget build() - - - - - + + + + + - - - InterventionSegment + + + ReportHistoryItem - - - +intervention: Intervention - +percentCompleted: double - +percentMissed: double - +isCurrent: bool - +isFuture: bool - +phaseDuration: int + + + +subject: StudySubject - - - +List<Widget> buildSeparators() - +Widget build() + + + +Widget build() - - - + + + + + - - - Intervention + + + ReportDetailsScreen - - - - - - - - - TaskBox + + + +subject: StudySubject - - - +taskInstance: TaskInstance - +icon: Icon - +onCompleted: dynamic Function() + + + <static>+MaterialPageRoute<dynamic> routeFor() + +Widget build() - - - + + + + - - - TaskInstance + + + GeneralDetailsSection - - - - - - - - Icon + + + +Widget buildContent() - - - + + + + + - - - dynamic Function() + + + GenericSection - - - - - - - - - TaskOverview + + + +subject: StudySubject? + +onTap: void Function()? - - - +subject: StudySubject? - +scheduleToday: List<TaskInstance>? - +interventionIcon: String? + + + +Widget buildContent() + +Widget build() - - - - - - - - FAQ - - + + + - - - +Widget build() + + + void Function()? - - - - + + + + - - - Entry + + + DisclaimerSection - - - +title: String - +children: List<Entry> + + + +Widget buildContent() - - - - - + + + + + - - - EntryItem + + + LegendWidget - - - +entry: Entry + + + +name: String + +color: Color - - - -Widget _buildTiles() - +Widget build() + + + +Widget build() - - - + + + + + - - - ContactScreen + + + LegendsListWidget - - - - - - - - - - ContactWidget + + + +legends: List<Legend> - - - +contact: Contact? - +title: String - +subtitle: String? - +color: Color + + + +Widget build() - - - +Widget build() + + + + + + + + + Legend - - - - - - - - Contact + + + +name: String + +color: Color - - - - - + + + + + - - - ContactItem + + + PerformanceDetailsScreen - - - +iconData: IconData - +itemName: String - +itemValue: String? - +type: ContactItemType? - +iconColor: Color? + + + +reportSubject: StudySubject? - - - +dynamic launchContact() - +Widget build() + + + <static>+MaterialPageRoute<dynamic> routeFor() + +Widget build() - - - - + + + + + - - - ContactItemType + + + InterventionPerformanceBar - - - +index: int - <static>+values: List<ContactItemType> - <static>+website: ContactItemType - <static>+email: ContactItemType - <static>+phone: ContactItemType + + + +intervention: Intervention + +subject: StudySubject? + + + + + + +Widget build() - - - + + + - - - Enum + + + Intervention - - - - + + + + + - - - CheckmarkTaskWidget + + + ObservationPerformanceBar - - - +task: CheckmarkTask? - +completionPeriod: CompletionPeriod? + + + +observation: Observation + +subject: StudySubject? - - - - - - - - CheckmarkTask + + + +Widget build() - - - + + + - - - CompletionPeriod + + + Observation - - - - + + + + + - - - QuestionnaireTaskWidget + + + PerformanceBar - - - +task: QuestionnaireTask - +completionPeriod: CompletionPeriod + + + +task: Task + +completed: int + +total: int - - - - - - - - QuestionnaireTask + + + +Widget build() - - - - - - - - - TaskScreen - - - - - - +taskInstance: TaskInstance - - + + + - - - <static>+MaterialPageRoute<bool> routeFor() + + + Task - - - - - + + + + + - - - LegendWidget + + + PerformanceSection - - - +name: String - +color: Color + + + +minimumRatio: double + +maximum: double - - - +Widget build() + + + +Widget buildContent() + +String getPowerLevelDescription() + +int getCountableObservationAmount() - - - - - + + + + + - - - LegendsListWidget + + + ReportSectionContainer - - - +legends: List<Legend> + + + +section: ReportSection + +subject: StudySubject + +primary: bool + +onTap: void Function()? - - - +Widget build() + + + +ReportSectionWidget buildContents() + +dynamic () + +List<Widget> buildPrimaryHeader() + +Widget build() - - - - + + + - - - Legend + + + ReportSection - - - +name: String - +color: Color + + + + + + + + Settings - - - - + + + + + - - - GeneralDetailsSection + + + OptOutAlertDialog - - - +Widget buildContent() + + + +subject: StudySubject? + + + + + + +Widget build() - - - - - + + + + + - - - GenericSection + + + DeleteAlertDialog - - - +subject: StudySubject? - +onTap: void Function()? + + + +subject: StudySubject? - - - +Widget buildContent() - +Widget build() + + + +Widget build() - - - - + + + + - - - ReportSectionWidget + + + TaskBox - - - +subject: StudySubject + + + +taskInstance: TaskInstance + +icon: Icon + +onCompleted: dynamic Function() - - - - - + + + - - - PerformanceSection + + + TaskInstance - - - +minimumRatio: double - +maximum: double - - + + + + - - - +Widget buildContent() - +String getPowerLevelDescription() - +int getCountableObservationAmount() + + + Icon - - - - - + + + - - - PerformanceBar + + + dynamic Function() - - - +progress: double - +minimum: double? + + + + + + + + + ProgressRow - - - +Widget build() + + + +subject: StudySubject? - - - - - + + + + + - - - PerformanceDetailsScreen + + + InterventionSegment - - - +reportSubject: StudySubject? + + + +intervention: Intervention + +percentCompleted: double + +percentMissed: double + +isCurrent: bool + +isFuture: bool + +phaseDuration: int - - - <static>+MaterialPageRoute<dynamic> routeFor() - +Widget build() + + + +List<Widget> buildSeparators() + +Widget build() - - - - - + + + + - - - InterventionPerformanceBar + + + TaskOverview - - - +intervention: Intervention - +subject: StudySubject? + + + +subject: StudySubject? + +scheduleToday: List<TaskInstance>? + +interventionIcon: String? - - - +Widget build() + + + + + + + + ContactScreen - - - - - + + + + + - - - ObservationPerformanceBar + + + ContactWidget - - - +observation: Observation - +subject: StudySubject? + + + +contact: Contact? + +title: String + +subtitle: String? + +color: Color - - - +Widget build() + + + +Widget build() - - - + + + - - - Observation + + + Contact - - - + + + + + - - - Task + + + ContactItem + + + + + + +iconData: IconData + +itemName: String + +itemValue: String? + +type: ContactItemType? + +iconColor: Color? + + + + + + +dynamic launchContact() + +Widget build() - - - - + + + + - - - ReportHistoryScreen + + + ContactItemType - - - +Widget build() + + + +index: int + <static>+values: List<ContactItemType> + <static>+website: ContactItemType + <static>+email: ContactItemType + <static>+phone: ContactItemType - - - - - + + + - - - ReportHistoryItem + + + Enum - - - +subject: StudySubject + + + + + + + + + FAQ - - - +Widget build() + + + +Widget build() - - - - - - - - - ReportSectionContainer - - + + + + - - - +section: ReportSection - +subject: StudySubject - +primary: bool - +onTap: void Function()? + + + Entry - - - +ReportSectionWidget buildContents() - +dynamic () - +List<Widget> buildPrimaryHeader() - +Widget build() + + + +title: String + +children: List<Entry> - - - + + + + + - - - ReportSection + + + EntryItem - - - - + + + +entry: Entry + + - - - void Function()? + + + -Widget _buildTiles() + +Widget build() - - - - + + + + - - - DisclaimerSection + + + DashboardScreen - - - +Widget buildContent() + + + +error: String? - - - - - + + + + - - - ReportDetailsScreen + + + OverflowMenuItem - - - +subject: StudySubject + + + +name: String + +icon: IconData + +routeName: String? + +onTap: dynamic Function()? - - - <static>+MaterialPageRoute<dynamic> routeFor() - +Widget build() + + + + + + + + dynamic Function()? - - - - - + + + + + - - - LinearRegressionSectionWidget + + + StudyFinishedPlaceholder - - - +section: LinearRegressionSection + + + <static>+space: SizedBox - - - +Widget build() + + + +Widget build() - - - + + + - - - LinearRegressionSection + + + SizedBox - - - - - + + + + - - - AverageSectionWidget + + + QuestionnaireTaskWidget - - - +section: AverageSection - +titlePos: List<int> - +phasePos: List<int> + + + +task: QuestionnaireTask + +completionPeriod: CompletionPeriod - - - +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() + + + + + + + + QuestionnaireTask - - - + + + - - - AverageSection + + + CompletionPeriod - - - - + + + + + - - - DiagramDatum + + + TaskScreen - - - +x: num - +value: num - +timestamp: DateTime? - +intervention: String + + + +taskInstance: TaskInstance + + + + + + <static>+MaterialPageRoute<bool> routeFor() - - - - + + + + - - - LoadingScreen + + + CheckmarkTaskWidget - - - +sessionString: String? - +queryParameters: Map<String, String>? + + + +task: CheckmarkTask? + +completionPeriod: CompletionPeriod? + + + + + + + + + + + CheckmarkTask - - + + - + AppOutdatedScreen - + +Widget build() - - - - - - - - WelcomeScreen - - - - - - +Widget build() - - - - - + - + TermsScreen @@ -2522,17 +2486,17 @@ - - - + + + - + LegalSection - + +title: String? +description: String? @@ -2545,7 +2509,7 @@ - + +Widget build() @@ -2554,9 +2518,9 @@ - + - + void Function(bool?)? @@ -2565,16 +2529,16 @@ - - + + - + IFrameHelper - + +void postRouteFinished() +void listen() @@ -2582,19 +2546,56 @@ + + + + + + + + LoadingScreen + + + + + + +sessionString: String? + +queryParameters: Map<String, String>? + + + + + + + + + + + + AboutScreen + + + + + + +Widget build() + + + + - - - + + + - + Preview - + +queryParameters: Map<String, String>? +appLanguage: AppLanguage @@ -2606,7 +2607,7 @@ - + +bool hasRoute() +void handleQueries() @@ -2625,29 +2626,29 @@ - + - + AppLanguage - - - - + + + + - - - AboutScreen + + + WelcomeScreen - - - +Widget build() + + + +Widget build() diff --git a/docs/uml/app/lib/uml.svg b/docs/uml/app/lib/uml.svg index 97a13db01..b774303a4 100644 --- a/docs/uml/app/lib/uml.svg +++ b/docs/uml/app/lib/uml.svg @@ -1,26 +1,103 @@ - - [StudySelectionScreen + + [MyApp + | + +queryParameters: Map<String, String>; + +appConfig: AppConfig?; + +initialRoute: String ] - [InviteCodeDialog + [MyApp]o-[AppConfig] + + [NotificationValidators + | + +didNotificationLaunchApp: bool; + +wasNotificationActionHandled: bool; + +wasNotificationActionCompleted: bool ] - [EligibilityResult + [StudyNotifications | - +eligible: bool; - +firstFailed: EligibilityCriterion? + +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() ] - [EligibilityResult]o-[EligibilityCriterion] + [StudyNotifications]o-[StudySubject] + [StudyNotifications]o-[FlutterLocalNotificationsPlugin] + [StudyNotifications]o-[<abstract>BuildContext] + [StudyNotifications]o-[StreamController] + [StudyNotifications]o-[NotificationValidators] - [EligibilityScreen + [ReceivedNotification | - +study: Study? + +id: int?; + +title: String?; + +body: String?; + +payload: String? + ] + + [StudyNotification | - <static>+MaterialPageRoute<EligibilityResult> routeFor() + +taskInstance: TaskInstance; + +date: DateTime ] - [EligibilityScreen]o-[Study] + [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() + ] + + [AppAnalytics]o-[<abstract>BuildContext] + [AppAnalytics]o-[StudySubject] + + [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>+sharedPrefs: dynamic + | + <static>+dynamic storeSubject(); + <static>+dynamic loadSubject(); + <static>+dynamic storeAnalytics(); + <static>+dynamic loadAnalytics(); + <static>+dynamic delete(); + <static>+dynamic synchronize() + ] [ConsentScreen ] @@ -48,6 +125,30 @@ [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 ] @@ -64,9 +165,23 @@ [_KickoffScreen]o-[StudySubject] - [InterventionSelectionScreen + [EligibilityResult + | + +eligible: bool; + +firstFailed: EligibilityCriterion? + ] + + [EligibilityResult]o-[EligibilityCriterion] + + [EligibilityScreen + | + +study: Study? + | + <static>+MaterialPageRoute<EligibilityResult> routeFor() ] + [EligibilityScreen]o-[Study] + [OnboardingProgress | +stage: int; @@ -76,30 +191,15 @@ +Widget build() ] - [StudyOverviewScreen + [StudySelectionScreen ] - [_StudyOverviewScreen - | - +study: Study? - | - +dynamic navigateToJourney(); - +dynamic navigateToEligibilityCheck(); - +Widget build() + [InviteCodeDialog ] - [_StudyOverviewScreen]o-[Study] - - [StudyDetailsView - | - +study: Study?; - +iconSize: double - | - +Widget build() + [InterventionSelectionScreen ] - [StudyDetailsView]o-[Study] - [JourneyOverviewScreen ] @@ -155,185 +255,103 @@ [TimelineChild]o-[<abstract>Widget] - [Settings - ] - - [OptOutAlertDialog + [AverageSectionWidget | - +subject: StudySubject? + +section: AverageSection; + +titlePos: List<int>; + +phasePos: List<int> | - +Widget build() + +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() ] - [OptOutAlertDialog]o-[StudySubject] + [AverageSectionWidget]o-[AverageSection] + [<abstract>ReportSectionWidget]<:-[AverageSectionWidget] - [DeleteAlertDialog + [DiagramDatum | - +subject: StudySubject? + +x: num; + +value: num; + +timestamp: DateTime?; + +intervention: String + ] + + [LinearRegressionSectionWidget + | + +section: LinearRegressionSection | +Widget build() ] - [DeleteAlertDialog]o-[StudySubject] + [LinearRegressionSectionWidget]o-[LinearRegressionSection] + [<abstract>ReportSectionWidget]<:-[LinearRegressionSectionWidget] - [DashboardScreen + [ReportHistoryScreen | - +error: String? + +Widget build() ] - [OverflowMenuItem + [ReportHistoryItem | - +name: String; - +icon: IconData; - +routeName: String?; - +onTap: dynamic Function()? + +subject: StudySubject + | + +Widget build() ] - [OverflowMenuItem]o-[IconData] - [OverflowMenuItem]o-[dynamic Function()?] + [ReportHistoryItem]o-[StudySubject] - [StudyFinishedPlaceholder + [ReportDetailsScreen | - <static>+space: SizedBox + +subject: StudySubject | + <static>+MaterialPageRoute<dynamic> routeFor(); +Widget build() ] - [StudyFinishedPlaceholder]o-[SizedBox] + [ReportDetailsScreen]o-[StudySubject] - [ProgressRow + [GeneralDetailsSection | - +subject: StudySubject? + +Widget buildContent() ] - [ProgressRow]o-[StudySubject] + [<abstract>GenericSection]<:-[GeneralDetailsSection] - [InterventionSegment + [<abstract>GenericSection | - +intervention: Intervention; - +percentCompleted: double; - +percentMissed: double; - +isCurrent: bool; - +isFuture: bool; - +phaseDuration: int + +subject: StudySubject?; + +onTap: void Function()? | - +List<Widget> buildSeparators(); + +Widget buildContent(); +Widget build() ] - [InterventionSegment]o-[Intervention] + [<abstract>GenericSection]o-[StudySubject] + [<abstract>GenericSection]o-[void Function()?] - [TaskBox + [DisclaimerSection | - +taskInstance: TaskInstance; - +icon: Icon; - +onCompleted: dynamic Function() + +Widget buildContent() ] - [TaskBox]o-[TaskInstance] - [TaskBox]o-[Icon] - [TaskBox]o-[dynamic Function()] + [<abstract>GenericSection]<:-[DisclaimerSection] - [TaskOverview + [<abstract>ReportSectionWidget | - +subject: StudySubject?; - +scheduleToday: List<TaskInstance>?; - +interventionIcon: String? + +subject: StudySubject ] - [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] - - [CheckmarkTaskWidget - | - +task: CheckmarkTask?; - +completionPeriod: CompletionPeriod? - ] - - [CheckmarkTaskWidget]o-[CheckmarkTask] - [CheckmarkTaskWidget]o-[CompletionPeriod] - - [QuestionnaireTaskWidget - | - +task: QuestionnaireTask; - +completionPeriod: CompletionPeriod - ] - - [QuestionnaireTaskWidget]o-[QuestionnaireTask] - [QuestionnaireTaskWidget]o-[CompletionPeriod] - - [TaskScreen - | - +taskInstance: TaskInstance - | - <static>+MaterialPageRoute<bool> routeFor() - ] - - [TaskScreen]o-[TaskInstance] + [<abstract>ReportSectionWidget]o-[StudySubject] [LegendWidget | @@ -360,40 +378,6 @@ [Legend]o-[Color] - [GeneralDetailsSection - | - +Widget buildContent() - ] - - [<abstract>GenericSection]<:-[GeneralDetailsSection] - - [<abstract>ReportSectionWidget - | - +subject: StudySubject - ] - - [<abstract>ReportSectionWidget]o-[StudySubject] - - [PerformanceSection - | - +minimumRatio: double; - +maximum: double - | - +Widget buildContent(); - +String getPowerLevelDescription(); - +int getCountableObservationAmount() - ] - - [<abstract>GenericSection]<:-[PerformanceSection] - - [PerformanceBar - | - +progress: double; - +minimum: double? - | - +Widget build() - ] - [PerformanceDetailsScreen | +reportSubject: StudySubject? @@ -437,20 +421,26 @@ [PerformanceBar]o-[<abstract>Task] - [ReportHistoryScreen + [PerformanceSection | - +Widget build() + +minimumRatio: double; + +maximum: double + | + +Widget buildContent(); + +String getPowerLevelDescription(); + +int getCountableObservationAmount() ] - [ReportHistoryItem + [<abstract>GenericSection]<:-[PerformanceSection] + + [PerformanceBar | - +subject: StudySubject + +progress: double; + +minimum: double? | +Widget build() ] - [ReportHistoryItem]o-[StudySubject] - [ReportSectionContainer | +section: ReportSection; @@ -468,263 +458,285 @@ [ReportSectionContainer]o-[StudySubject] [ReportSectionContainer]o-[void Function()?] - [DisclaimerSection - | - +Widget buildContent() + [Settings ] - [<abstract>GenericSection]<:-[DisclaimerSection] - - [<abstract>GenericSection + [OptOutAlertDialog | - +subject: StudySubject?; - +onTap: void Function()? + +subject: StudySubject? | - +Widget buildContent(); +Widget build() ] - [<abstract>GenericSection]o-[StudySubject] - [<abstract>GenericSection]o-[void Function()?] + [OptOutAlertDialog]o-[StudySubject] - [ReportDetailsScreen + [DeleteAlertDialog | - +subject: StudySubject + +subject: StudySubject? | - <static>+MaterialPageRoute<dynamic> routeFor(); +Widget build() ] - [ReportDetailsScreen]o-[StudySubject] + [DeleteAlertDialog]o-[StudySubject] - [LinearRegressionSectionWidget - | - +section: LinearRegressionSection + [TaskBox | - +Widget build() + +taskInstance: TaskInstance; + +icon: Icon; + +onCompleted: dynamic Function() ] - [LinearRegressionSectionWidget]o-[LinearRegressionSection] - [<abstract>ReportSectionWidget]<:-[LinearRegressionSectionWidget] + [TaskBox]o-[TaskInstance] + [TaskBox]o-[Icon] + [TaskBox]o-[dynamic Function()] - [AverageSectionWidget - | - +section: AverageSection; - +titlePos: List<int>; - +phasePos: List<int> + [ProgressRow | - +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? ] - [AverageSectionWidget]o-[AverageSection] - [<abstract>ReportSectionWidget]<:-[AverageSectionWidget] - - [DiagramDatum - | - +x: num; - +value: num; - +timestamp: DateTime?; - +intervention: String - ] + [ProgressRow]o-[StudySubject] - [LoadingScreen + [InterventionSegment | - +sessionString: String?; - +queryParameters: Map<String, String>? - ] - - [AppOutdatedScreen + +intervention: Intervention; + +percentCompleted: double; + +percentMissed: double; + +isCurrent: bool; + +isFuture: bool; + +phaseDuration: int | + +List<Widget> buildSeparators(); +Widget build() ] - [WelcomeScreen + [InterventionSegment]o-[Intervention] + + [TaskOverview | - +Widget build() + +subject: StudySubject?; + +scheduleToday: List<TaskInstance>?; + +interventionIcon: String? ] - [TermsScreen + [TaskOverview]o-[StudySubject] + + [ContactScreen ] - [LegalSection + [ContactWidget | - +title: String?; - +description: String?; - +icon: Icon?; - +pdfUrl: String?; - +pdfUrlLabel: String?; - +acknowledgment: String?; - +isChecked: bool?; - +onChange: void Function(bool?)? + +contact: Contact?; + +title: String; + +subtitle: String?; + +color: Color | +Widget build() ] - [LegalSection]o-[Icon] - [LegalSection]o-[void Function(bool?)?] + [ContactWidget]o-[Contact] + [ContactWidget]o-[Color] - [IFrameHelper + [ContactItem | - +void postRouteFinished(); - +void listen() + +iconData: IconData; + +itemName: String; + +itemValue: String?; + +type: ContactItemType?; + +iconColor: Color? + | + +dynamic launchContact(); + +Widget build() ] - [Preview - | - +queryParameters: Map<String, String>?; - +appLanguage: AppLanguage; - +selectedRoute: String?; - +extra: String?; - +study: Study?; - +selectedStudyObjectId: String?; - +subject: StudySubject? + [ContactItem]o-[IconData] + [ContactItem]o-[ContactItemType] + [ContactItem]o-[Color] + + [ContactItemType | - +bool hasRoute(); - +void handleQueries(); - +dynamic init(); - +dynamic handleAuthorization(); - +dynamic runCommands(); - +String? getSelectedRoute(); - +bool containsQuery(); - +bool containsQueryPair(); - +dynamic getStudySubject(); - -dynamic _createFakeSubject(); - +List<String> getInterventionIds() + +index: int; + <static>+values: List<ContactItemType>; + <static>+website: ContactItemType; + <static>+email: ContactItemType; + <static>+phone: ContactItemType ] - [Preview]o-[AppLanguage] - [Preview]o-[Study] - [Preview]o-[StudySubject] + [ContactItemType]o-[ContactItemType] + [Enum]<:--[ContactItemType] - [AboutScreen + [FAQ | +Widget build() ] - [StudyNotification + [Entry | - +taskInstance: TaskInstance; - +date: DateTime + +title: String; + +children: List<Entry> ] - [StudyNotification]o-[TaskInstance] + [EntryItem + | + +entry: Entry + | + -Widget _buildTiles(); + +Widget build() + ] - [GroupedIterable + [EntryItem]o-[Entry] + + [DashboardScreen | - +data: Map<K, Iterable<V>>; - +iterator: Iterator<MapEntry<K, Iterable<V>>> + +error: String? + ] + + [OverflowMenuItem | - +Iterable<MapEntry<K, R>> aggregate(); - +Iterable<MapEntry<K, R>> aggregateWithKey() + +name: String; + +icon: IconData; + +routeName: String?; + +onTap: dynamic Function()? ] - [Iterable]<:-[GroupedIterable] + [OverflowMenuItem]o-[IconData] + [OverflowMenuItem]o-[dynamic Function()?] - [Cache + [StudyFinishedPlaceholder | - <static>+isSynchronizing: bool; - <static>+sharedPrefs: dynamic + <static>+space: SizedBox | - <static>+dynamic storeSubject(); - <static>+dynamic loadSubject(); - <static>+dynamic storeAnalytics(); - <static>+dynamic loadAnalytics(); - <static>+dynamic delete(); - <static>+dynamic synchronize() + +Widget build() ] - [NotificationValidators + [StudyFinishedPlaceholder]o-[SizedBox] + + [QuestionnaireTaskWidget | - +didNotificationLaunchApp: bool; - +wasNotificationActionHandled: bool; - +wasNotificationActionCompleted: bool + +task: QuestionnaireTask; + +completionPeriod: CompletionPeriod ] - [StudyNotifications + [QuestionnaireTaskWidget]o-[QuestionnaireTask] + [QuestionnaireTaskWidget]o-[CompletionPeriod] + + [TaskScreen | - +subject: StudySubject?; - +flutterLocalNotificationsPlugin: FlutterLocalNotificationsPlugin; - +context: BuildContext; - +didReceiveLocalNotificationStream: StreamController<ReceivedNotification>; - +selectNotificationStream: StreamController<String?>; - <static>+validator: NotificationValidators; - <static>+debug: bool; - <static>+scheduledNotificationsDebug: String? + +taskInstance: TaskInstance | - <static>+dynamic create(); - -dynamic _isAndroidPermissionGranted(); - -dynamic _requestPermissions(); - -void _configureDidReceiveLocalNotificationSubject(); - -void _configureSelectNotificationSubject(); - -void _initNotificationsPlugin(); - +dynamic handleNotificationResponse() + <static>+MaterialPageRoute<bool> routeFor() ] - [StudyNotifications]o-[StudySubject] - [StudyNotifications]o-[FlutterLocalNotificationsPlugin] - [StudyNotifications]o-[<abstract>BuildContext] - [StudyNotifications]o-[StreamController] - [StudyNotifications]o-[NotificationValidators] + [TaskScreen]o-[TaskInstance] - [ReceivedNotification + [CheckmarkTaskWidget + | + +task: CheckmarkTask?; + +completionPeriod: CompletionPeriod? + ] + + [CheckmarkTaskWidget]o-[CheckmarkTask] + [CheckmarkTaskWidget]o-[CompletionPeriod] + + [AppOutdatedScreen + | + +Widget build() + ] + + [TermsScreen + ] + + [LegalSection | - +id: int?; +title: String?; - +body: String?; - +payload: String? + +description: String?; + +icon: Icon?; + +pdfUrl: String?; + +pdfUrlLabel: String?; + +acknowledgment: String?; + +isChecked: bool?; + +onChange: void Function(bool?)? + | + +Widget build() ] - [AppAnalytics + [LegalSection]o-[Icon] + [LegalSection]o-[void Function(bool?)?] + + [IFrameHelper | - <static>-_userEnabled: bool?; - <static>+keyAnalyticsUserEnable: String; - +context: BuildContext; - +subject: StudySubject?; - <static>+isUserEnabled: dynamic + +void postRouteFinished(); + +void listen() + ] + + [LoadingScreen | - <static>+dynamic init(); - <static>+dynamic start(); - <static>+void setEnabled(); - +dynamic initBasic(); - +void initAdvanced() + +sessionString: String?; + +queryParameters: Map<String, String>? ] - [AppAnalytics]o-[<abstract>BuildContext] - [AppAnalytics]o-[StudySubject] + [AboutScreen + | + +Widget build() + ] - [MyApp + [Preview | - +queryParameters: Map<String, String>; - +appConfig: AppConfig?; - +initialRoute: String + +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() ] - [MyApp]o-[AppConfig] + [Preview]o-[AppLanguage] + [Preview]o-[Study] + [Preview]o-[StudySubject] - [SelectableButton + [WelcomeScreen | - +child: Widget; - +selected: bool; - +onTap: dynamic Function()? + +Widget build() + ] + + [ThemeConfig + | + <static>+SliderThemeData coloredSliderTheme() + ] + + [HtmlText + | + +text: String?; + +style: TextStyle?; + +centered: bool | - -Color _getFillColor(); - -Color _getTextColor(); +Widget build() ] - [SelectableButton]o-[<abstract>Widget] - [SelectableButton]o-[dynamic Function()?] + [HtmlText]o-[TextStyle] + + [RoundCheckbox + | + +onChanged: dynamic Function(bool)?; + +value: bool? + | + +Widget build() + ] + + [RoundCheckbox]o-[dynamic Function(bool)?] [CustomSlider | @@ -759,6 +771,17 @@ [RoundedRectSliderTrackShape]<:-[CustomTrackShape] + [QuestionHeader + | + +prompt: String?; + +subtitle: String?; + +rationale: String? + | + -List<Widget> _buildSubtitle(); + -List<Widget> _buildRationaleButton(); + +Widget build() + ] + [QuestionnaireWidget | +title: String?; @@ -774,39 +797,21 @@ +Widget build() ] - [QuestionContainer + [BooleanQuestionWidget | - +onDone: dynamic Function(Answer<dynamic>, int); - +question: Question<dynamic>; - +index: int + +question: BooleanQuestion; + +onDone: dynamic Function(Answer<dynamic>)? ] - [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() - ] + [BooleanQuestionWidget]o-[BooleanQuestion] + [BooleanQuestionWidget]o-[dynamic Function(Answer<dynamic>)?] + [<abstract>QuestionWidget]<:-[BooleanQuestionWidget] - [ChoiceQuestionWidget + [<abstract>QuestionWidget | - +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; @@ -817,15 +822,15 @@ [FreeTextQuestionWidget]o-[dynamic Function(Answer<dynamic>)?] [<abstract>QuestionWidget]<:-[FreeTextQuestionWidget] - [AnnotatedScaleQuestionWidget + [ScaleQuestionWidget | - +question: AnnotatedScaleQuestion; + +question: ScaleQuestion; +onDone: dynamic Function(Answer<dynamic>)? ] - [AnnotatedScaleQuestionWidget]o-[AnnotatedScaleQuestion] - [AnnotatedScaleQuestionWidget]o-[dynamic Function(Answer<dynamic>)?] - [<abstract>QuestionWidget]<:-[AnnotatedScaleQuestionWidget] + [ScaleQuestionWidget]o-[ScaleQuestion] + [ScaleQuestionWidget]o-[dynamic Function(Answer<dynamic>)?] + [<abstract>QuestionWidget]<:-[ScaleQuestionWidget] [VisualAnalogueQuestionWidget | @@ -837,54 +842,37 @@ [VisualAnalogueQuestionWidget]o-[dynamic Function(Answer<dynamic>)?] [<abstract>QuestionWidget]<:-[VisualAnalogueQuestionWidget] - [<abstract>QuestionWidget + [ChoiceQuestionWidget | + +question: ChoiceQuestion; + +onDone: dynamic Function(Answer<dynamic>); + +multiSelectionText: String; +subtitle: String? ] - [BooleanQuestionWidget - | - +question: BooleanQuestion; - +onDone: dynamic Function(Answer<dynamic>)? - ] - - [BooleanQuestionWidget]o-[BooleanQuestion] - [BooleanQuestionWidget]o-[dynamic Function(Answer<dynamic>)?] - [<abstract>QuestionWidget]<:-[BooleanQuestionWidget] + [ChoiceQuestionWidget]o-[ChoiceQuestion] + [ChoiceQuestionWidget]o-[dynamic Function(Answer<dynamic>)] + [<abstract>QuestionWidget]<:-[ChoiceQuestionWidget] - [ScaleQuestionWidget + [AnnotatedScaleQuestionWidget | - +question: ScaleQuestion; + +question: AnnotatedScaleQuestion; +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] + [AnnotatedScaleQuestionWidget]o-[AnnotatedScaleQuestion] + [AnnotatedScaleQuestionWidget]o-[dynamic Function(Answer<dynamic>)?] + [<abstract>QuestionWidget]<:-[AnnotatedScaleQuestionWidget] - [RoundCheckbox - | - +onChanged: dynamic Function(bool)?; - +value: bool? + [QuestionContainer | - +Widget build() + +onDone: dynamic Function(Answer<dynamic>, int); + +question: Question<dynamic>; + +index: int ] - [RoundCheckbox]o-[dynamic Function(bool)?] + [QuestionContainer]o-[dynamic Function(Answer<dynamic>, int)] + [QuestionContainer]o-[<abstract>Question] [InterventionCard | @@ -932,15 +920,33 @@ +Widget build() ] - [HtmlText + [SelectableButton | - +text: String?; - +style: TextStyle? + +child: Widget; + +selected: bool; + +onTap: dynamic Function()? | + -Color _getFillColor(); + -Color _getTextColor(); +Widget build() ] - [HtmlText]o-[TextStyle] + [SelectableButton]o-[<abstract>Widget] + [SelectableButton]o-[dynamic Function()?] + + [StudyTile + | + +title: String?; + +description: String?; + +iconName: String; + +onTap: dynamic Function()?; + +contentPadding: EdgeInsetsGeometry + | + +Widget build() + ] + + [StudyTile]o-[dynamic Function()?] + [StudyTile]o-[<abstract>EdgeInsetsGeometry] [BottomOnboardingNavigation | @@ -960,11 +966,6 @@ [BottomOnboardingNavigation]o-[Icon] [BottomOnboardingNavigation]o-[<abstract>Widget] - [ThemeConfig - | - <static>+SliderThemeData coloredSliderTheme() - ] - [Routes | <static>+loading: String; @@ -996,529 +997,727 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + - + - + + + - + - + - + - + + + - + - + - + - + + + - + - + - + - + - - - - + - - + - + - + - + - + - + - + - + - + - + - + - + - + + + - + - - - + - + - - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - + - + - + - + - + - + - + - + - - - + - + + + + - - - + + - + - + - + - + - + - + - + - + - + - + - + - - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - + + + - + - + - + - + + + - + - + - + - - - + + + - + - + - + - - - + + + - + - + - + - - - + + + - + - + - + - - - + + + - + - + - + - - - + + + - + - + - + - - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + + + + + + + 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() + + + + + + + + + + + StudySubject + + + + + + + + + + + FlutterLocalNotificationsPlugin + + + + + + + + + + + BuildContext + + + - - - + + + - - - StudySelectionScreen + + + StreamController - - - + + + + - - - InviteCodeDialog + + + ReceivedNotification + + + + + + +id: int? + +title: String? + +body: String? + +payload: String? - - - - + + + + - - - EligibilityResult + + + StudyNotification - - - +eligible: bool - +firstFailed: EligibilityCriterion? + + + +taskInstance: TaskInstance + +date: DateTime - - - + + + - - - EligibilityCriterion + + + TaskInstance - - - - - + + + + + - - - EligibilityScreen + + + AppAnalytics - - - +study: Study? + + + <static>-_userEnabled: bool? + <static>+keyAnalyticsUserEnable: String + +context: BuildContext + +subject: StudySubject? + <static>+isUserEnabled: dynamic - - - <static>+MaterialPageRoute<EligibilityResult> routeFor() + + + <static>+dynamic init() + <static>+dynamic start() + <static>+void setEnabled() + +dynamic initBasic() + +void initAdvanced() - - - + + + + + - - - Study + + + 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>+sharedPrefs: dynamic + + + + + + <static>+dynamic storeSubject() + <static>+dynamic loadSubject() + <static>+dynamic storeAnalytics() + <static>+dynamic loadAnalytics() + <static>+dynamic delete() + <static>+dynamic synchronize() - + - + ConsentScreen @@ -1527,17 +1726,17 @@ - - - + + + - + ConsentCard - + +consent: ConsentItem? +index: int? @@ -1546,7 +1745,7 @@ - + +Widget build() @@ -1555,9 +1754,9 @@ - + - + ConsentItem @@ -1566,9 +1765,9 @@ - + - + dynamic Function(int) @@ -1577,16 +1776,16 @@ - - + + - + ConsentElement - + +title: String +descriptionText: String @@ -1598,20 +1797,95 @@ - + - + IconData + + + + + + + StudyOverviewScreen + + + + + + + + + + + + + _StudyOverviewScreen + + + + + + +study: Study? + + + + + + +dynamic navigateToJourney() + +dynamic navigateToEligibilityCheck() + +Widget build() + + + + + + + + + + + Study + + + + + + + + + + + + + StudyDetailsView + + + + + + +study: Study? + +iconSize: double + + + + + + +Widget build() + + + + - + - + KickoffScreen @@ -1620,24 +1894,24 @@ - - - + + + - + _KickoffScreen - + +subject: StudySubject? +ready: bool - + -dynamic _storeUserStudy() -Widget _constructStatusIcon() @@ -1647,124 +1921,126 @@ - - - + + + + - - - StudySubject + + + EligibilityResult - - - - - - - - InterventionSelectionScreen + + + +eligible: bool + +firstFailed: EligibilityCriterion? - - - - - + + + - - - OnboardingProgress + + + EligibilityCriterion - - - +stage: int - +progress: double + + + + + + + + + + EligibilityScreen - - - -double _getProgressForStage() - +Widget build() + + + +study: Study? - - - - - - - - StudyOverviewScreen + + + <static>+MaterialPageRoute<EligibilityResult> routeFor() - - - - - + + + + + - - - _StudyOverviewScreen + + + OnboardingProgress - - - +study: Study? + + + +stage: int + +progress: double - - - +dynamic navigateToJourney() - +dynamic navigateToEligibilityCheck() - +Widget build() + + + -double _getProgressForStage() + +Widget build() - - - - - + + + - - - StudyDetailsView + + + StudySelectionScreen - - - +study: Study? - +iconSize: double + + + + + + + + InviteCodeDialog - - - +Widget build() + + + + + + + + InterventionSelectionScreen - + - + JourneyOverviewScreen @@ -1773,23 +2049,23 @@ - - - + + + - + _JourneyOverviewScreen - + +subject: StudySubject? - + +dynamic getConsentAndNavigateToDashboard() +Widget build() @@ -1799,23 +2075,23 @@ - - - + + + - + Timeline - + +subject: StudySubject? - + +Widget build() @@ -1824,17 +2100,17 @@ - - - + + + - + InterventionTile - + +title: String? +iconName: String @@ -1845,7 +2121,7 @@ - + +Widget build() @@ -1854,9 +2130,9 @@ - + - + Color @@ -1865,24 +2141,24 @@ - - - + + + - + IconIndicator - + +iconName: String +color: Color? - + +Widget build() @@ -1891,23 +2167,23 @@ - - - + + + - + TimelineChild - + +child: Widget? - + +Widget build() @@ -1916,1160 +2192,1113 @@ - + - + Widget - - - - - - - Settings - - - - - - - - - + + + + + - - - OptOutAlertDialog + + + AverageSectionWidget - - - +subject: StudySubject? + + + +section: AverageSection + +titlePos: List<int> + +phasePos: List<int> - - - +Widget build() + + + +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() - - - - - + + + - - - DeleteAlertDialog + + + AverageSection - - - +subject: StudySubject? + + + + + + + + + ReportSectionWidget - - - +Widget build() + + + +subject: StudySubject - - - - + + + + - - - DashboardScreen + + + DiagramDatum - - - +error: String? + + + +x: num + +value: num + +timestamp: DateTime? + +intervention: String - - - - + + + + + - - - OverflowMenuItem + + + LinearRegressionSectionWidget - - - +name: String - +icon: IconData - +routeName: String? - +onTap: dynamic Function()? + + + +section: LinearRegressionSection - - - - - - - - dynamic Function()? + + + +Widget build() - - - - - + + + - - - StudyFinishedPlaceholder + + + LinearRegressionSection - - - <static>+space: SizedBox + + + + + + + + + ReportHistoryScreen - - - +Widget build() + + + +Widget build() - - - + + + + + - - - SizedBox + + + ReportHistoryItem - - - - - - - - - ProgressRow + + + +subject: StudySubject - - - +subject: StudySubject? + + + +Widget build() - - - - - - - - - InterventionSegment - - + + + + + - - - +intervention: Intervention - +percentCompleted: double - +percentMissed: double - +isCurrent: bool - +isFuture: bool - +phaseDuration: int + + + ReportDetailsScreen - - - +List<Widget> buildSeparators() - +Widget build() + + + +subject: StudySubject - - - - - - - - Intervention + + + <static>+MaterialPageRoute<dynamic> routeFor() + +Widget build() - - - - + + + + - - - TaskBox + + + GeneralDetailsSection - - - +taskInstance: TaskInstance - +icon: Icon - +onCompleted: dynamic Function() + + + +Widget buildContent() - - - + + + + + - - - TaskInstance + + + GenericSection - - - - + + + +subject: StudySubject? + +onTap: void Function()? + + - - - Icon + + + +Widget buildContent() + +Widget build() - - - + + + - - - dynamic Function() + + + void Function()? - - - - + + + + - - - TaskOverview + + + DisclaimerSection - - - +subject: StudySubject? - +scheduleToday: List<TaskInstance>? - +interventionIcon: String? + + + +Widget buildContent() - - - - - - - - FAQ - - + + + + + - - - +Widget build() + + + LegendWidget - - - - - - - - - Entry + + + +name: String + +color: Color - - - +title: String - +children: List<Entry> + + + +Widget build() - - - - - + + + + + - - - EntryItem + + + LegendsListWidget - - - +entry: Entry + + + +legends: List<Legend> - - - -Widget _buildTiles() - +Widget build() + + + +Widget build() - - - + + + + - - - ContactScreen + + + Legend + + + + + + +name: String + +color: Color - - - - - + + + + + - - - ContactWidget + + + PerformanceDetailsScreen - - - +contact: Contact? - +title: String - +subtitle: String? - +color: Color + + + +reportSubject: StudySubject? - - - +Widget build() + + + <static>+MaterialPageRoute<dynamic> routeFor() + +Widget build() - - - + + + + + - - - Contact + + + InterventionPerformanceBar - - - - - - - - - - ContactItem + + + +intervention: Intervention + +subject: StudySubject? - - - +iconData: IconData - +itemName: String - +itemValue: String? - +type: ContactItemType? - +iconColor: Color? + + + +Widget build() - - - +dynamic launchContact() - +Widget build() + + + + + + + + Intervention - - - - + + + + + - - - ContactItemType + + + ObservationPerformanceBar - - - +index: int - <static>+values: List<ContactItemType> - <static>+website: ContactItemType - <static>+email: ContactItemType - <static>+phone: ContactItemType + + + +observation: Observation + +subject: StudySubject? + + + + + + +Widget build() - - - + + + - - - Enum + + + Observation - - - - + + + + + - - - CheckmarkTaskWidget + + + PerformanceBar - - - +task: CheckmarkTask? - +completionPeriod: CompletionPeriod? + + + +task: Task + +completed: int + +total: int - - - - - - - - CheckmarkTask + + + +Widget build() - - - + + + - - - CompletionPeriod + + + Task - - - - + + + + + - - - QuestionnaireTaskWidget + + + PerformanceSection - - - +task: QuestionnaireTask - +completionPeriod: CompletionPeriod + + + +minimumRatio: double + +maximum: double - - - - - - - - QuestionnaireTask + + + +Widget buildContent() + +String getPowerLevelDescription() + +int getCountableObservationAmount() - - - - - + + + + + - - - TaskScreen + + + ReportSectionContainer - - - +taskInstance: TaskInstance + + + +section: ReportSection + +subject: StudySubject + +primary: bool + +onTap: void Function()? - - - <static>+MaterialPageRoute<bool> routeFor() + + + +ReportSectionWidget buildContents() + +dynamic () + +List<Widget> buildPrimaryHeader() + +Widget build() - - - - - + + + - - - LegendWidget + + + ReportSection - - - +name: String - +color: Color - - + + + + - - - +Widget build() + + + Settings - - - - - + + + + + - - - LegendsListWidget + + + OptOutAlertDialog - - - +legends: List<Legend> + + + +subject: StudySubject? - - - +Widget build() + + + +Widget build() - - - - + + + + + - - - Legend + + + DeleteAlertDialog - - - +name: String - +color: Color + + + +subject: StudySubject? + + + + + + +Widget build() - - - - + + + + - - - GeneralDetailsSection + + + TaskBox - - - +Widget buildContent() + + + +taskInstance: TaskInstance + +icon: Icon + +onCompleted: dynamic Function() - - - - - + + + - - - GenericSection + + + Icon - - - +subject: StudySubject? - +onTap: void Function()? - - + + + + - - - +Widget buildContent() - +Widget build() + + + dynamic Function() - - - - + + + + - - - ReportSectionWidget + + + ProgressRow - - - +subject: StudySubject + + + +subject: StudySubject? - - - - - + + + + + - - - PerformanceSection + + + InterventionSegment - - - +minimumRatio: double - +maximum: double + + + +intervention: Intervention + +percentCompleted: double + +percentMissed: double + +isCurrent: bool + +isFuture: bool + +phaseDuration: int - - - +Widget buildContent() - +String getPowerLevelDescription() - +int getCountableObservationAmount() + + + +List<Widget> buildSeparators() + +Widget build() - - - - - + + + + - - - PerformanceBar + + + TaskOverview - - - +progress: double - +minimum: double? + + + +subject: StudySubject? + +scheduleToday: List<TaskInstance>? + +interventionIcon: String? - - - +Widget build() + + + + + + + + ContactScreen - - - - - + + + + + - - - PerformanceDetailsScreen + + + ContactWidget - - - +reportSubject: StudySubject? + + + +contact: Contact? + +title: String + +subtitle: String? + +color: Color - - - <static>+MaterialPageRoute<dynamic> routeFor() - +Widget build() + + + +Widget build() - - - - - + + + - - - InterventionPerformanceBar + + + Contact - - - +intervention: Intervention - +subject: StudySubject? + + + + + + + + + + ContactItem - - - +Widget build() + + + +iconData: IconData + +itemName: String + +itemValue: String? + +type: ContactItemType? + +iconColor: Color? - - - - - - - - - - ObservationPerformanceBar + + + +dynamic launchContact() + +Widget build() - - - +observation: Observation - +subject: StudySubject? + + + + + + + + + ContactItemType - - - +Widget build() + + + +index: int + <static>+values: List<ContactItemType> + <static>+website: ContactItemType + <static>+email: ContactItemType + <static>+phone: ContactItemType - - - + + + - - - Observation + + + Enum - - - + + + + - - - Task + + + FAQ + + + + + + +Widget build() - - - - + + + + - - - ReportHistoryScreen + + + Entry - - - +Widget build() + + + +title: String + +children: List<Entry> - - - - - + + + + + - - - ReportHistoryItem + + + EntryItem - - - +subject: StudySubject + + + +entry: Entry - - - +Widget build() + + + -Widget _buildTiles() + +Widget build() - - - - - - - - - ReportSectionContainer - - + + + + - - - +section: ReportSection - +subject: StudySubject - +primary: bool - +onTap: void Function()? + + + DashboardScreen - - - +ReportSectionWidget buildContents() - +dynamic () - +List<Widget> buildPrimaryHeader() - +Widget build() + + + +error: String? - - - + + + + - - - ReportSection + + + OverflowMenuItem - - - - - - - - void Function()? + + + +name: String + +icon: IconData + +routeName: String? + +onTap: dynamic Function()? - - - - - - - - DisclaimerSection - - + + + - - - +Widget buildContent() + + + dynamic Function()? - - - - - + + + + + - - - ReportDetailsScreen + + + StudyFinishedPlaceholder - - - +subject: StudySubject + + + <static>+space: SizedBox - - - <static>+MaterialPageRoute<dynamic> routeFor() - +Widget build() + + + +Widget build() - - - - - + + + - - - LinearRegressionSectionWidget + + + SizedBox - - - +section: LinearRegressionSection + + + + + + + + + QuestionnaireTaskWidget - - - +Widget build() + + + +task: QuestionnaireTask + +completionPeriod: CompletionPeriod - - - + + + - - - LinearRegressionSection + + + QuestionnaireTask - - - - - + + + - - - AverageSectionWidget + + + CompletionPeriod - - - +section: AverageSection - +titlePos: List<int> - +phasePos: List<int> + + + + + + + + + + TaskScreen - - - +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() + + + +taskInstance: TaskInstance - - - - - - - - AverageSection + + + <static>+MaterialPageRoute<bool> routeFor() - - - - + + + + - - - DiagramDatum + + + CheckmarkTaskWidget - - - +x: num - +value: num - +timestamp: DateTime? - +intervention: String + + + +task: CheckmarkTask? + +completionPeriod: CompletionPeriod? - - - - - - - - LoadingScreen - - + + + - - - +sessionString: String? - +queryParameters: Map<String, String>? + + + CheckmarkTask - - + + - + AppOutdatedScreen - + +Widget build() - - - - - - - - WelcomeScreen - - - - - - +Widget build() - - - - - + - + TermsScreen @@ -3078,17 +3307,17 @@ - - - + + + - + LegalSection - + +title: String? +description: String? @@ -3101,7 +3330,7 @@ - + +Widget build() @@ -3110,9 +3339,9 @@ - + - + void Function(bool?)? @@ -3121,399 +3350,236 @@ - - + + - + 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 - - - - - - - - - - - - AboutScreen - - - - - - +Widget build() - - - - - - - - - - - - StudyNotification - - - - - - +taskInstance: TaskInstance - +date: DateTime - - - - - - - - - - - - - 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>+sharedPrefs: dynamic + + + LoadingScreen - - - <static>+dynamic storeSubject() - <static>+dynamic loadSubject() - <static>+dynamic storeAnalytics() - <static>+dynamic loadAnalytics() - <static>+dynamic delete() - <static>+dynamic synchronize() + + + +sessionString: String? + +queryParameters: Map<String, String>? - - - - + + + + - - - NotificationValidators + + + AboutScreen - - - +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() - - - + + + - - - FlutterLocalNotificationsPlugin + + + AppLanguage - - - + + + + - - - BuildContext + + + WelcomeScreen - - - - - - - - StreamController + + + +Widget build() - - - - + + + + - - - ReceivedNotification + + + ThemeConfig - - - +id: int? - +title: String? - +body: String? - +payload: String? + + + <static>+SliderThemeData coloredSliderTheme() - - - - - + + + + + - - - AppAnalytics + + + HtmlText - - - <static>-_userEnabled: bool? - <static>+keyAnalyticsUserEnable: String - +context: BuildContext - +subject: StudySubject? - <static>+isUserEnabled: dynamic + + + +text: String? + +style: TextStyle? + +centered: bool - - - <static>+dynamic init() - <static>+dynamic start() - <static>+void setEnabled() - +dynamic initBasic() - +void initAdvanced() + + + +Widget build() - - - - - - - - MyApp - - + + + - - - +queryParameters: Map<String, String> - +appConfig: AppConfig? - +initialRoute: String + + + TextStyle - - - + + + + + - - - AppConfig + + + RoundCheckbox - - - - - - - - - - SelectableButton + + + +onChanged: dynamic Function(bool)? + +value: bool? - - - +child: Widget - +selected: bool - +onTap: dynamic Function()? + + + +Widget build() - - - -Color _getFillColor() - -Color _getTextColor() - +Widget build() + + + + + + + + dynamic Function(bool)? - - - + + + - + CustomSlider - + +value: double? +minValue: double? @@ -3534,7 +3600,7 @@ - + +Widget build() @@ -3543,9 +3609,9 @@ - + - + dynamic Function(double)? @@ -3554,9 +3620,9 @@ - + - + AnnotatedScaleQuestion @@ -3565,16 +3631,16 @@ - - + + - + CustomTrackShape - + +Rect getPreferredRect() @@ -3583,187 +3649,143 @@ - + - + RoundedRectSliderTrackShape - - - - - - - - QuestionnaireWidget - - - - - - +title: String? - +header: String? - +footer: String? - +questions: List<Question<dynamic>> - - - - - - - - - - - - - HtmlTextBox - - - - - - +text: String? - - + + + + + - - - +Widget build() + + + QuestionHeader - - - - - - - - - QuestionContainer + + + +prompt: String? + +subtitle: String? + +rationale: String? - - - +onDone: dynamic Function(Answer<dynamic>, int) - +question: Question<dynamic> - +index: int + + + -List<Widget> _buildSubtitle() + -List<Widget> _buildRationaleButton() + +Widget build() - - - + + + + - - - dynamic Function(Answer<dynamic>, int) + + + QuestionnaireWidget - - - - - - - - Question + + + +title: String? + +header: String? + +footer: String? + +questions: List<Question<dynamic>> - - - - - + + + + + - - - QuestionHeader + + + HtmlTextBox - - - +prompt: String? - +subtitle: String? - +rationale: String? + + + +text: String? - - - -List<Widget> _buildSubtitle() - -List<Widget> _buildRationaleButton() - +Widget build() + + + +Widget build() - - - - + + + + - - - ChoiceQuestionWidget + + + BooleanQuestionWidget - - - +question: ChoiceQuestion - +onDone: dynamic Function(Answer<dynamic>) - +multiSelectionText: String - +subtitle: String? + + + +question: BooleanQuestion + +onDone: dynamic Function(Answer<dynamic>)? - - - + + + - - - ChoiceQuestion + + + BooleanQuestion - - - + + + - - - dynamic Function(Answer<dynamic>) + + + dynamic Function(Answer<dynamic>)? - - + + - + QuestionWidget - + +subtitle: String? @@ -3772,16 +3794,16 @@ - - + + - + FreeTextQuestionWidget - + +question: FreeTextQuestion +onDone: dynamic Function(Answer<dynamic>)? @@ -3791,57 +3813,57 @@ - + - + FreeTextQuestion - - - + + + + - - - dynamic Function(Answer<dynamic>)? + + + ScaleQuestionWidget - - - - - - - - - AnnotatedScaleQuestionWidget + + + +question: ScaleQuestion + +onDone: dynamic Function(Answer<dynamic>)? - - - +question: AnnotatedScaleQuestion - +onDone: dynamic Function(Answer<dynamic>)? + + + + + + + + ScaleQuestion - - + + - + VisualAnalogueQuestionWidget - + +question: VisualAnalogueQuestion +onDone: dynamic Function(Answer<dynamic>)? @@ -3851,165 +3873,132 @@ - + - + VisualAnalogueQuestion - - - - - - - - BooleanQuestionWidget - - + + + + - - - +question: BooleanQuestion - +onDone: dynamic Function(Answer<dynamic>)? + + + ChoiceQuestionWidget - - - - - - - - BooleanQuestion + + + +question: ChoiceQuestion + +onDone: dynamic Function(Answer<dynamic>) + +multiSelectionText: String + +subtitle: String? - - - - - - - - ScaleQuestionWidget - - + + + - - - +question: ScaleQuestion - +onDone: dynamic Function(Answer<dynamic>)? + + + ChoiceQuestion - - - + + + - - - ScaleQuestion + + + dynamic Function(Answer<dynamic>) - - - - - - - - - StudyTile - - + + + + - - - +title: String? - +description: String? - +iconName: String - +onTap: dynamic Function()? - +contentPadding: EdgeInsetsGeometry + + + AnnotatedScaleQuestionWidget - - - +Widget build() + + + +question: AnnotatedScaleQuestion + +onDone: dynamic Function(Answer<dynamic>)? - - - + + + + - - - EdgeInsetsGeometry + + + QuestionContainer - - - - - - - - - - RoundCheckbox + + + +onDone: dynamic Function(Answer<dynamic>, int) + +question: Question<dynamic> + +index: int - - - +onChanged: dynamic Function(bool)? - +value: bool? - - + + + + - - - +Widget build() + + + dynamic Function(Answer<dynamic>, int) - - - + + + - - - dynamic Function(bool)? + + + Question - - - + + + - + InterventionCard - + +intervention: Intervention +selected: bool @@ -4020,7 +4009,7 @@ - + +Widget build() @@ -4029,17 +4018,17 @@ - - - + + + - + InterventionCardTitle - + +intervention: Intervention? +selected: bool @@ -4049,7 +4038,7 @@ - + +Widget build() @@ -4058,23 +4047,23 @@ - - - + + + - + InterventionCardDescription - + +intervention: Intervention - + +Widget build() @@ -4083,23 +4072,23 @@ - - - + + + - + _TaskList - + +tasks: List<InterventionTask> - + +String scheduleString() +Widget build() @@ -4107,56 +4096,88 @@ - - - - - + + + + + - - - HtmlText + + + SelectableButton - - - +text: String? - +style: TextStyle? + + + +child: Widget + +selected: bool + +onTap: dynamic Function()? - - - +Widget build() + + + -Color _getFillColor() + -Color _getTextColor() + +Widget build() - - - + + + + + - - - TextStyle + + + StudyTile + + + + + + +title: String? + +description: String? + +iconName: String + +onTap: dynamic Function()? + +contentPadding: EdgeInsetsGeometry + + + + + + +Widget build() + + + + + + + + + + + EdgeInsetsGeometry - - - + + + - + BottomOnboardingNavigation - + +onBack: void Function()? +onNext: void Function()? @@ -4169,44 +4190,26 @@ - + +Widget build() - - - - - - - - ThemeConfig - - - - - - <static>+SliderThemeData coloredSliderTheme() - - - - - - - + + + - + Routes - + <static>+loading: String <static>+preview: String @@ -4231,7 +4234,7 @@ - + <static>+Route<dynamic> unknownRoute() <static>+Route<dynamic>? generateRoute() diff --git a/docs/uml/app/lib/widgets/uml.svg b/docs/uml/app/lib/widgets/uml.svg index 4994d8d9c..81d54b744 100644 --- a/docs/uml/app/lib/widgets/uml.svg +++ b/docs/uml/app/lib/widgets/uml.svg @@ -1,15 +1,5 @@ - - [HtmlText - | - +text: String?; - +style: TextStyle? - | - +Widget build() - ] - - [HtmlText]o-[TextStyle] - - [SelectableButton + + [SelectableButton | +child: Widget; +selected: bool; @@ -23,20 +13,6 @@ [SelectableButton]o-[<abstract>Widget] [SelectableButton]o-[dynamic Function()?] - [StudyTile - | - +title: String?; - +description: String?; - +iconName: String; - +onTap: dynamic Function()?; - +contentPadding: EdgeInsetsGeometry - | - +Widget build() - ] - - [StudyTile]o-[dynamic Function()?] - [StudyTile]o-[<abstract>EdgeInsetsGeometry] - [CustomSlider | +value: double?; @@ -85,6 +61,16 @@ +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?; @@ -96,16 +82,6 @@ +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] - [ChoiceQuestionWidget | +question: ChoiceQuestion; @@ -118,11 +94,16 @@ [ChoiceQuestionWidget]o-[dynamic Function(Answer<dynamic>)] [<abstract>QuestionWidget]<:-[ChoiceQuestionWidget] - [<abstract>QuestionWidget + [FreeTextQuestionWidget | - +subtitle: String? + +question: FreeTextQuestion; + +onDone: dynamic Function(Answer<dynamic>)? ] + [FreeTextQuestionWidget]o-[FreeTextQuestion] + [FreeTextQuestionWidget]o-[dynamic Function(Answer<dynamic>)?] + [<abstract>QuestionWidget]<:-[FreeTextQuestionWidget] + [AnnotatedScaleQuestionWidget | +question: AnnotatedScaleQuestion; @@ -133,25 +114,30 @@ [AnnotatedScaleQuestionWidget]o-[dynamic Function(Answer<dynamic>)?] [<abstract>QuestionWidget]<:-[AnnotatedScaleQuestionWidget] - [BooleanQuestionWidget + [VisualAnalogueQuestionWidget | - +question: BooleanQuestion; + +question: VisualAnalogueQuestion; +onDone: dynamic Function(Answer<dynamic>)? ] - [BooleanQuestionWidget]o-[BooleanQuestion] - [BooleanQuestionWidget]o-[dynamic Function(Answer<dynamic>)?] - [<abstract>QuestionWidget]<:-[BooleanQuestionWidget] + [VisualAnalogueQuestionWidget]o-[VisualAnalogueQuestion] + [VisualAnalogueQuestionWidget]o-[dynamic Function(Answer<dynamic>)?] + [<abstract>QuestionWidget]<:-[VisualAnalogueQuestionWidget] - [FreeTextQuestionWidget + [<abstract>QuestionWidget | - +question: FreeTextQuestion; + +subtitle: String? + ] + + [BooleanQuestionWidget + | + +question: BooleanQuestion; +onDone: dynamic Function(Answer<dynamic>)? ] - [FreeTextQuestionWidget]o-[FreeTextQuestion] - [FreeTextQuestionWidget]o-[dynamic Function(Answer<dynamic>)?] - [<abstract>QuestionWidget]<:-[FreeTextQuestionWidget] + [BooleanQuestionWidget]o-[BooleanQuestion] + [BooleanQuestionWidget]o-[dynamic Function(Answer<dynamic>)?] + [<abstract>QuestionWidget]<:-[BooleanQuestionWidget] [ScaleQuestionWidget | @@ -163,33 +149,19 @@ [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] - - [BottomOnboardingNavigation + [StudyTile | - +onBack: void Function()?; - +onNext: void Function()?; - +backLabel: String?; - +nextLabel: String?; - +hideNext: bool; - +nextIcon: Icon?; - +backIcon: Icon?; - +progress: Widget? + +title: String?; + +description: String?; + +iconName: String; + +onTap: dynamic Function()?; + +contentPadding: EdgeInsetsGeometry | +Widget build() ] - [BottomOnboardingNavigation]o-[void Function()?] - [BottomOnboardingNavigation]o-[Icon] - [BottomOnboardingNavigation]o-[<abstract>Widget] + [StudyTile]o-[dynamic Function()?] + [StudyTile]o-[<abstract>EdgeInsetsGeometry] [RoundCheckbox | @@ -247,202 +219,194 @@ +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] + - + - + - + - + - + - + - + - + - + - + - + - + - + + + - + - + - + - + - + - - - + - + - + + + - + - + - + - + + + - + - - - + - + - + + + - + - - - + - + - + + + - + - - - + - + - + + + - + - - - + - + - + + + - + - - - + - + - + - + - - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - - - - - - - - HtmlText - - - - - - +text: String? - +style: TextStyle? - - - - - - +Widget build() - - - - - - - - - - - TextStyle - - - + - - - + + + - + SelectableButton - + +child: Widget +selected: bool @@ -450,7 +414,7 @@ - + -Color _getFillColor() -Color _getTextColor() @@ -461,9 +425,9 @@ - + - + Widget @@ -472,68 +436,28 @@ - + - + dynamic Function()? - - - - - - - - - StudyTile - - - - - - +title: String? - +description: String? - +iconName: String - +onTap: dynamic Function()? - +contentPadding: EdgeInsetsGeometry - - - - - - +Widget build() - - - - - - - - - - - EdgeInsetsGeometry - - - - - - - + + + - + CustomSlider - + +value: double? +minValue: double? @@ -554,7 +478,7 @@ - + +Widget build() @@ -563,9 +487,9 @@ - + - + dynamic Function(double)? @@ -574,9 +498,9 @@ - + - + Color @@ -585,9 +509,9 @@ - + - + AnnotatedScaleQuestion @@ -596,16 +520,16 @@ - - + + - + CustomTrackShape - + +Rect getPreferredRect() @@ -614,9 +538,9 @@ - + - + RoundedRectSliderTrackShape @@ -625,16 +549,16 @@ - - + + - + QuestionnaireWidget - + +title: String? +header: String? @@ -646,70 +570,41 @@ - - - + + + - + HtmlTextBox - + +text: String? - + +Widget build() - - - - - - - - - QuestionHeader - - - - - - +prompt: String? - +subtitle: String? - +rationale: String? - - - - - - -List<Widget> _buildSubtitle() - -List<Widget> _buildRationaleButton() - +Widget build() - - - - - - + + - + QuestionContainer - + +onDone: dynamic Function(Answer<dynamic>, int) +question: Question<dynamic> @@ -720,9 +615,9 @@ - + - + dynamic Function(Answer<dynamic>, int) @@ -731,27 +626,56 @@ - + - + Question + + + + + + + + + QuestionHeader + + + + + + +prompt: String? + +subtitle: String? + +rationale: String? + + + + + + -List<Widget> _buildSubtitle() + -List<Widget> _buildRationaleButton() + +Widget build() + + + + - - + + - + ChoiceQuestionWidget - + +question: ChoiceQuestion +onDone: dynamic Function(Answer<dynamic>) @@ -763,9 +687,9 @@ - + - + ChoiceQuestion @@ -774,9 +698,9 @@ - + - + dynamic Function(Answer<dynamic>) @@ -785,34 +709,75 @@ - - + + - + QuestionWidget - + +subtitle: String? + + + + + + + + FreeTextQuestionWidget + + + + + + +question: FreeTextQuestion + +onDone: dynamic Function(Answer<dynamic>)? + + + + + + + + + + + FreeTextQuestion + + + + + + + + + + + dynamic Function(Answer<dynamic>)? + + + + - - + + - + AnnotatedScaleQuestionWidget - + +question: AnnotatedScaleQuestion +onDone: dynamic Function(Answer<dynamic>)? @@ -820,29 +785,48 @@ - - - + + + + - - - dynamic Function(Answer<dynamic>)? + + + VisualAnalogueQuestionWidget + + + + + + +question: VisualAnalogueQuestion + +onDone: dynamic Function(Answer<dynamic>)? + + + + + + + + + + + VisualAnalogueQuestion - - + + - + BooleanQuestionWidget - + +question: BooleanQuestion +onDone: dynamic Function(Answer<dynamic>)? @@ -852,57 +836,27 @@ - + - + BooleanQuestion - - - - - - - - FreeTextQuestionWidget - - - - - - +question: FreeTextQuestion - +onDone: dynamic Function(Answer<dynamic>)? - - - - - - - - - - - FreeTextQuestion - - - - - - + + - + ScaleQuestionWidget - + +question: ScaleQuestion +onDone: dynamic Function(Answer<dynamic>)? @@ -912,119 +866,75 @@ - + - + ScaleQuestion - - - - - - - - VisualAnalogueQuestionWidget - - - - - - +question: VisualAnalogueQuestion - +onDone: dynamic Function(Answer<dynamic>)? - - - - - - - - - - - VisualAnalogueQuestion - - - - - - - - - - - - - BottomOnboardingNavigation - - + + + + + - - - +onBack: void Function()? - +onNext: void Function()? - +backLabel: String? - +nextLabel: String? - +hideNext: bool - +nextIcon: Icon? - +backIcon: Icon? - +progress: Widget? + + + StudyTile - - - +Widget build() + + + +title: String? + +description: String? + +iconName: String + +onTap: dynamic Function()? + +contentPadding: EdgeInsetsGeometry - - - - - - - - void Function()? + + + +Widget build() - - - + + + - - - Icon + + + EdgeInsetsGeometry - - - + + + - + RoundCheckbox - + +onChanged: dynamic Function(bool)? +value: bool? - + +Widget build() @@ -1033,9 +943,9 @@ - + - + dynamic Function(bool)? @@ -1044,17 +954,17 @@ - - - + + + - + InterventionCard - + +intervention: Intervention +selected: bool @@ -1065,7 +975,7 @@ - + +Widget build() @@ -1074,9 +984,9 @@ - + - + Intervention @@ -1085,17 +995,17 @@ - - - + + + - + InterventionCardTitle - + +intervention: Intervention? +selected: bool @@ -1105,7 +1015,7 @@ - + +Widget build() @@ -1114,23 +1024,23 @@ - - - + + + - + InterventionCardDescription - + +intervention: Intervention - + +Widget build() @@ -1139,23 +1049,23 @@ - - - + + + - + _TaskList - + +tasks: List<InterventionTask> - + +String scheduleString() +Widget build() @@ -1163,6 +1073,98 @@ + + + + + + + + + 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 + + + +