From 50c8e42dd9264190bc546e31b80a77b573fa9263 Mon Sep 17 00:00:00 2001 From: Johannes Vedder Date: Fri, 17 Nov 2023 15:08:33 +0100 Subject: [PATCH 1/4] fix: add required manifest entries for notifications to work again --- app/android/app/src/main/AndroidManifest.xml | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/app/android/app/src/main/AndroidManifest.xml b/app/android/app/src/main/AndroidManifest.xml index 20f98835e..bced939bd 100644 --- a/app/android/app/src/main/AndroidManifest.xml +++ b/app/android/app/src/main/AndroidManifest.xml @@ -1,6 +1,10 @@ + + + + @@ -49,6 +53,17 @@ + + + + + + + + + + + Date: Fri, 17 Nov 2023 15:10:30 +0100 Subject: [PATCH 2/4] fix: refresh dashboard on app resume --- .../screens/study/dashboard/dashboard.dart | 34 ++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/app/lib/screens/study/dashboard/dashboard.dart b/app/lib/screens/study/dashboard/dashboard.dart index a01b82bce..3d8214fa2 100644 --- a/app/lib/screens/study/dashboard/dashboard.dart +++ b/app/lib/screens/study/dashboard/dashboard.dart @@ -37,12 +37,38 @@ class OverflowMenuItem { OverflowMenuItem(this.name, this.icon, {this.routeName, this.onTap}); } -class _DashboardScreenState extends State { +class _DashboardScreenState extends State with WidgetsBindingObserver { StudySubject? subject; List? scheduleToday; get showNextDay => (kDebugMode || context.read().isPreview) && !subject!.completedStudy; + + @override + void initState() { + super.initState(); + WidgetsBinding.instance.addObserver(this); + } + + @override + void didChangeAppLifecycleState(AppLifecycleState state) { + switch (state) { + case AppLifecycleState.resumed: + setState(() { + scheduleToday = subject!.scheduleFor(DateTime.now()); + }); + break; + case AppLifecycleState.inactive: + break; + case AppLifecycleState.paused: + break; + case AppLifecycleState.detached: + break; + case AppLifecycleState.hidden: + break; + } + } + @override void didChangeDependencies() { super.didChangeDependencies(); @@ -57,6 +83,12 @@ class _DashboardScreenState extends State { } } + @override + void dispose() { + WidgetsBinding.instance.removeObserver(this); + super.dispose(); + } + Future receivePermission() async { return await Permission.ignoreBatteryOptimizations.request().isGranted; } From 9a15691f76438014d076d771e23525b5ad02a69f Mon Sep 17 00:00:00 2001 From: Johannes Vedder Date: Fri, 17 Nov 2023 15:25:57 +0100 Subject: [PATCH 3/4] chore: format --- app/lib/screens/study/dashboard/dashboard.dart | 1 - 1 file changed, 1 deletion(-) diff --git a/app/lib/screens/study/dashboard/dashboard.dart b/app/lib/screens/study/dashboard/dashboard.dart index 3d8214fa2..8de9c02e6 100644 --- a/app/lib/screens/study/dashboard/dashboard.dart +++ b/app/lib/screens/study/dashboard/dashboard.dart @@ -43,7 +43,6 @@ class _DashboardScreenState extends State with WidgetsBindingOb get showNextDay => (kDebugMode || context.read().isPreview) && !subject!.completedStudy; - @override void initState() { super.initState(); From 7d480881ef8b64cd0e66d142754cec5a2309fef8 Mon Sep 17 00:00:00 2001 From: StudyU Documenter Date: Fri, 17 Nov 2023 14:32:26 +0000 Subject: [PATCH 4/4] docs: update UML documentation --- .../app/lib/screens/app_onboarding/uml.svg | 296 +- .../app/lib/screens/study/dashboard/uml.svg | 640 +- docs/uml/app/lib/screens/study/uml.svg | 2826 +-- docs/uml/app/lib/screens/uml.svg | 3146 +-- docs/uml/app/lib/uml.svg | 4984 ++-- docs/uml/app/lib/util/uml.svg | 364 +- .../core/lib/src/models/expressions/uml.svg | 213 +- .../lib/src/models/observations/tasks/uml.svg | 81 +- .../core/lib/src/models/observations/uml.svg | 108 +- docs/uml/core/lib/src/models/tables/uml.svg | 928 +- docs/uml/core/lib/src/models/tasks/uml.svg | 239 +- docs/uml/core/lib/src/models/uml.svg | 2774 +-- docs/uml/core/lib/src/uml.svg | 2965 +-- docs/uml/core/lib/uml.svg | 2965 +-- .../uml/designer_v2/lib/features/auth/uml.svg | 496 +- .../lib/features/design/reports/uml.svg | 1120 +- .../designer_v2/lib/features/design/uml.svg | 4930 ++-- docs/uml/designer_v2/lib/features/uml.svg | 10982 ++++----- docs/uml/designer_v2/lib/uml.svg | 19970 ++++++++-------- docs/uml/designer_v2/lib/utils/uml.svg | 1254 +- 20 files changed, 25536 insertions(+), 35745 deletions(-) diff --git a/docs/uml/app/lib/screens/app_onboarding/uml.svg b/docs/uml/app/lib/screens/app_onboarding/uml.svg index f59a3e173..3bb93fdb0 100644 --- a/docs/uml/app/lib/screens/app_onboarding/uml.svg +++ b/docs/uml/app/lib/screens/app_onboarding/uml.svg @@ -1,36 +1,20 @@ - - [Preview + + [AboutScreen | - +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() + +Widget build() ] - [Preview]o-[AppLanguage] - [Preview]o-[Study] - [Preview]o-[StudySubject] - [WelcomeScreen | +Widget build() ] + [IFrameHelper + | + +void postRouteFinished(); + +void listen() + ] + [TermsScreen ] @@ -51,17 +35,33 @@ [LegalSection]o-[Icon] [LegalSection]o-[void Function(bool?)?] - [IFrameHelper + [Preview | - +void postRouteFinished(); - +void listen() - ] - - [AboutScreen + +queryParameters: Map<String, String>?; + +appLanguage: AppLanguage; + +selectedRoute: String?; + +extra: String?; + +study: Study?; + +selectedStudyObjectId: String?; + +subject: StudySubject? | - +Widget build() + +bool hasRoute(); + +void handleQueries(); + +dynamic init(); + +dynamic handleAuthorization(); + +dynamic runCommands(); + +String? getSelectedRoute(); + +bool containsQuery(); + +bool containsQueryPair(); + +dynamic getStudySubject(); + -dynamic _createFakeSubject(); + +List<String> getInterventionIds() ] + [Preview]o-[AppLanguage] + [Preview]o-[Study] + [Preview]o-[StudySubject] + [LoadingScreen | +sessionString: String?; @@ -72,127 +72,90 @@ - + - + - + - + - + - + - + - + - + - + - + - - - - - - - - - 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() + + + AboutScreen - - - - - - - - AppLanguage + + + +Widget build() - - - + + + + - - - Study + + + WelcomeScreen - - - - - - - - StudySubject + + + +Widget build() - - - - + + + + - - - WelcomeScreen + + + IFrameHelper - - - +Widget build() + + + +void postRouteFinished() + +void listen() - + - + TermsScreen @@ -201,17 +164,17 @@ - - - + + + - + LegalSection - + +title: String? +description: String? @@ -224,7 +187,7 @@ - + +Widget build() @@ -233,9 +196,9 @@ - + - + Icon @@ -244,64 +207,101 @@ - + - + void Function(bool?)? - - - - + + + + + - - - IFrameHelper + + + Preview - - - +void postRouteFinished() - +void listen() + + + +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() - - - - + + + - - - AboutScreen + + + AppLanguage - - - +Widget build() + + + + + + + + Study + + + + + + + + + + + StudySubject - - + + - + LoadingScreen - + +sessionString: String? +queryParameters: Map<String, String>? diff --git a/docs/uml/app/lib/screens/study/dashboard/uml.svg b/docs/uml/app/lib/screens/study/dashboard/uml.svg index 05a1220ca..6b1196e7d 100644 --- a/docs/uml/app/lib/screens/study/dashboard/uml.svg +++ b/docs/uml/app/lib/screens/study/dashboard/uml.svg @@ -1,4 +1,4 @@ - + [TaskOverview | +subject: StudySubject?; @@ -8,6 +8,17 @@ [TaskOverview]o-[StudySubject] + [TaskBox + | + +taskInstance: TaskInstance; + +icon: Icon; + +onCompleted: dynamic Function() + ] + + [TaskBox]o-[TaskInstance] + [TaskBox]o-[Icon] + [TaskBox]o-[dynamic Function()] + [ProgressRow | +subject: StudySubject? @@ -30,37 +41,51 @@ [InterventionSegment]o-[Intervention] - [TaskBox + [DashboardScreen | - +taskInstance: TaskInstance; - +icon: Icon; - +onCompleted: dynamic Function() + +error: String? ] - [TaskBox]o-[TaskInstance] - [TaskBox]o-[Icon] - [TaskBox]o-[dynamic Function()] - - [Settings + [OverflowMenuItem + | + +name: String; + +icon: IconData; + +routeName: String?; + +onTap: dynamic Function()? ] - [OptOutAlertDialog + [OverflowMenuItem]o-[IconData] + [OverflowMenuItem]o-[dynamic Function()?] + + [StudyFinishedPlaceholder | - +subject: StudySubject? + <static>+space: SizedBox | +Widget build() ] - [OptOutAlertDialog]o-[StudySubject] + [StudyFinishedPlaceholder]o-[SizedBox] - [DeleteAlertDialog + [FAQ | - +subject: StudySubject? + +Widget build() + ] + + [Entry + | + +title: String; + +children: List<Entry> + ] + + [EntryItem + | + +entry: Entry | + -Widget _buildTiles(); +Widget build() ] - [DeleteAlertDialog]o-[StudySubject] + [EntryItem]o-[Entry] [ContactScreen ] @@ -106,135 +131,110 @@ [ContactItemType]o-[ContactItemType] [Enum]<:--[ContactItemType] - [FAQ - | - +Widget build() - ] - - [Entry - | - +title: String; - +children: List<Entry> + [Settings ] - [EntryItem + [OptOutAlertDialog | - +entry: Entry + +subject: StudySubject? | - -Widget _buildTiles(); +Widget build() ] - [EntryItem]o-[Entry] - - [DashboardScreen - | - +error: String? - ] - - [OverflowMenuItem - | - +name: String; - +icon: IconData; - +routeName: String?; - +onTap: dynamic Function()? - ] - - [OverflowMenuItem]o-[IconData] - [OverflowMenuItem]o-[dynamic Function()?] + [OptOutAlertDialog]o-[StudySubject] - [StudyFinishedPlaceholder + [DeleteAlertDialog | - <static>+space: SizedBox + +subject: StudySubject? | +Widget build() ] - [StudyFinishedPlaceholder]o-[SizedBox] + [DeleteAlertDialog]o-[StudySubject] - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - + - - + - + - + - + + + + - + + - + - + - + @@ -258,15 +258,68 @@ - + - + StudySubject + + + + + + + + TaskBox + + + + + + +taskInstance: TaskInstance + +icon: Icon + +onCompleted: dynamic Function() + + + + + + + + + + + TaskInstance + + + + + + + + + + + Icon + + + + + + + + + + + dynamic Function() + + + + @@ -287,17 +340,17 @@ - - - + + + - + InterventionSegment - + +intervention: Intervention +percentCompleted: double @@ -308,7 +361,7 @@ - + +List<Widget> buildSeparators() +Widget build() @@ -318,134 +371,180 @@ - + - + Intervention - - - - + + + + - - - TaskBox + + + DashboardScreen - - - +taskInstance: TaskInstance - +icon: Icon - +onCompleted: dynamic Function() + + + +error: String? - - - + + + + - - - TaskInstance + + + OverflowMenuItem + + + + + + +name: String + +icon: IconData + +routeName: String? + +onTap: dynamic Function()? - - - + + + - - - Icon + + + IconData - - - + + + - - - dynamic Function() + + + dynamic Function()? - - - + + + + + - - - Settings + + + StudyFinishedPlaceholder + + + + + + <static>+space: SizedBox + + + + + + +Widget build() - - - - - + + + - - - OptOutAlertDialog + + + SizedBox - - - +subject: StudySubject? + + + + + + + + + FAQ - - - +Widget build() + + + +Widget build() - - - - - + + + + - - - DeleteAlertDialog + + + Entry - - - +subject: StudySubject? + + + +title: String + +children: List<Entry> - - - +Widget build() + + + + + + + + + + EntryItem + + + + + + +entry: Entry + + + + + + -Widget _buildTiles() + +Widget build() - + - + ContactScreen @@ -454,17 +553,17 @@ - - - + + + - + ContactWidget - + +contact: Contact? +title: String @@ -473,7 +572,7 @@ - + +Widget build() @@ -482,9 +581,9 @@ - + - + Contact @@ -493,9 +592,9 @@ - + - + Color @@ -504,17 +603,17 @@ - - - + + + - + ContactItem - + +iconData: IconData +itemName: String @@ -524,7 +623,7 @@ - + +dynamic launchContact() +Widget build() @@ -532,29 +631,18 @@ - - - - - - - IconData - - - - - - + + - + ContactItemType - + +index: int <static>+values: List<ContactItemType> @@ -567,160 +655,72 @@ - + - + Enum - - - - - - - - FAQ - - - - - - +Widget build() - - - - - - - - - - - - Entry - - - - - - +title: String - +children: List<Entry> - - - - - - - - - - - - - EntryItem - - - - - - +entry: Entry - - - - - - -Widget _buildTiles() - +Widget build() - - - - - - - - - - - - DashboardScreen - - + + + - - - +error: String? + + + Settings - - - - + + + + + - - - OverflowMenuItem + + + OptOutAlertDialog - - - +name: String - +icon: IconData - +routeName: String? - +onTap: dynamic Function()? + + + +subject: StudySubject? - - - - - - - - dynamic Function()? + + + +Widget build() - - - - - - - - - StudyFinishedPlaceholder - - + + + + + - - - <static>+space: SizedBox + + + DeleteAlertDialog - - - +Widget build() + + + +subject: StudySubject? - - - - - - - - SizedBox + + + +Widget build() diff --git a/docs/uml/app/lib/screens/study/uml.svg b/docs/uml/app/lib/screens/study/uml.svg index de851de58..bc9965dff 100644 --- a/docs/uml/app/lib/screens/study/uml.svg +++ b/docs/uml/app/lib/screens/study/uml.svg @@ -1,161 +1,13 @@ - - [InterventionSelectionScreen - ] - - [JourneyOverviewScreen - ] - - [_JourneyOverviewScreen - | - +subject: StudySubject? - | - +dynamic getConsentAndNavigateToDashboard(); - +Widget build() - ] - - [_JourneyOverviewScreen]o-[StudySubject] - - [Timeline - | - +subject: StudySubject? - | - +Widget build() - ] - - [Timeline]o-[StudySubject] - - [InterventionTile - | - +title: String?; - +iconName: String; - +date: DateTime; - +color: Color?; - +isFirst: bool; - +isLast: bool - | - +Widget build() - ] - - [InterventionTile]o-[Color] - - [IconIndicator - | - +iconName: String; - +color: Color? - | - +Widget build() - ] - - [IconIndicator]o-[Color] - - [TimelineChild - | - +child: Widget? - | - +Widget build() - ] - - [TimelineChild]o-[<abstract>Widget] - - [StudySelectionScreen - | - +Widget build() - ] - - [InviteCodeDialog - ] - - [KickoffScreen - ] - - [_KickoffScreen - | - +subject: StudySubject?; - +ready: bool - | - -dynamic _storeUserStudy(); - -Widget _constructStatusIcon(); - -String _getStatusText(); - +Widget build() - ] - - [_KickoffScreen]o-[StudySubject] - - [ConsentScreen - ] - - [ConsentCard - | - +consent: ConsentItem?; - +index: int?; - +onTapped: dynamic Function(int); - +isChecked: bool? - | - +Widget build() - ] - - [ConsentCard]o-[ConsentItem] - [ConsentCard]o-[dynamic Function(int)] - - [ConsentElement - | - +title: String; - +descriptionText: String; - +acknowledgmentText: String; - +icon: IconData - ] - - [ConsentElement]o-[IconData] - - [EligibilityResult - | - +eligible: bool; - +firstFailed: EligibilityCriterion? - ] - - [EligibilityResult]o-[EligibilityCriterion] - - [EligibilityScreen - | - +study: Study? - | - <static>+MaterialPageRoute<EligibilityResult> routeFor() - ] - - [EligibilityScreen]o-[Study] - - [StudyOverviewScreen - ] - - [_StudyOverviewScreen + + [ReportDetailsScreen | - +study: Study? - | - +dynamic navigateToJourney(); - +dynamic navigateToEligibilityCheck(); - +Widget build() - ] - - [_StudyOverviewScreen]o-[Study] - - [StudyDetailsView - | - +study: Study?; - +iconSize: double + +subject: StudySubject | + <static>+MaterialPageRoute<dynamic> routeFor(); +Widget build() ] - [StudyDetailsView]o-[Study] - - [OnboardingProgress - | - +stage: int; - +progress: double - | - -double _getProgressForStage(); - +Widget build() - ] + [ReportDetailsScreen]o-[StudySubject] [PerformanceDetailsScreen | @@ -220,6 +72,23 @@ +Widget build() ] + [GeneralDetailsSection + | + +Widget buildContent() + ] + + [<abstract>GenericSection]<:-[GeneralDetailsSection] + + [LinearRegressionSectionWidget + | + +section: LinearRegressionSection + | + +Widget build() + ] + + [LinearRegressionSectionWidget]o-[LinearRegressionSection] + [<abstract>ReportSectionWidget]<:-[LinearRegressionSectionWidget] + [AverageSectionWidget | +section: AverageSection; @@ -251,55 +120,29 @@ +intervention: String ] - [LinearRegressionSectionWidget - | - +section: LinearRegressionSection - | - +Widget build() - ] - - [LinearRegressionSectionWidget]o-[LinearRegressionSection] - [<abstract>ReportSectionWidget]<:-[LinearRegressionSectionWidget] - - [<abstract>ReportSectionWidget + [DisclaimerSection | - +subject: StudySubject + +Widget buildContent() ] - [<abstract>ReportSectionWidget]o-[StudySubject] + [<abstract>GenericSection]<:-[DisclaimerSection] - [<abstract>GenericSection + [ReportSectionContainer | - +subject: StudySubject?; + <static>+sectionTypes: Map<Type, ReportSectionWidget Function(ReportSection, StudySubject)>; + +section: ReportSection; + +subject: StudySubject; + +primary: bool; +onTap: void Function()? | - +Widget buildContent(); - +Widget build() - ] - - [<abstract>GenericSection]o-[StudySubject] - [<abstract>GenericSection]o-[void Function()?] - - [ReportHistoryScreen - | - +Widget build() - ] - - [ReportHistoryItem - | - +subject: StudySubject - | + +ReportSectionWidget buildContents(); + +List<Widget> buildPrimaryHeader(); +Widget build() ] - [ReportHistoryItem]o-[StudySubject] - - [GeneralDetailsSection - | - +Widget buildContent() - ] - - [<abstract>GenericSection]<:-[GeneralDetailsSection] + [ReportSectionContainer]o-[<abstract>ReportSection] + [ReportSectionContainer]o-[StudySubject] + [ReportSectionContainer]o-[void Function()?] [LegendWidget | @@ -326,49 +169,57 @@ [Legend]o-[Color] - [ReportDetailsScreen - | - +subject: StudySubject + [ReportHistoryScreen | - <static>+MaterialPageRoute<dynamic> routeFor(); +Widget build() ] - [ReportDetailsScreen]o-[StudySubject] - - [ReportSectionContainer + [ReportHistoryItem | - <static>+sectionTypes: Map<Type, ReportSectionWidget Function(ReportSection, StudySubject)>; - +section: ReportSection; - +subject: StudySubject; - +primary: bool; - +onTap: void Function()? + +subject: StudySubject | - +ReportSectionWidget buildContents(); - +List<Widget> buildPrimaryHeader(); +Widget build() ] - [ReportSectionContainer]o-[<abstract>ReportSection] - [ReportSectionContainer]o-[StudySubject] - [ReportSectionContainer]o-[void Function()?] + [ReportHistoryItem]o-[StudySubject] - [DisclaimerSection + [<abstract>ReportSectionWidget | - +Widget buildContent() + +subject: StudySubject ] - [<abstract>GenericSection]<:-[DisclaimerSection] + [<abstract>ReportSectionWidget]o-[StudySubject] - [TaskScreen + [<abstract>GenericSection | - +taskInstance: TaskInstance + +subject: StudySubject?; + +onTap: void Function()? | - <static>+MaterialPageRoute<bool> routeFor() - ] + +Widget buildContent(); + +Widget build() + ] + + [<abstract>GenericSection]o-[StudySubject] + [<abstract>GenericSection]o-[void Function()?] + + [TaskScreen + | + +taskInstance: TaskInstance + | + <static>+MaterialPageRoute<bool> routeFor() + ] [TaskScreen]o-[TaskInstance] + [QuestionnaireTaskWidget + | + +task: QuestionnaireTask; + +completionPeriod: CompletionPeriod + ] + + [QuestionnaireTaskWidget]o-[QuestionnaireTask] + [QuestionnaireTaskWidget]o-[CompletionPeriod] + [CheckmarkTaskWidget | +task: CheckmarkTask?; @@ -378,14 +229,72 @@ [CheckmarkTaskWidget]o-[CheckmarkTask] [CheckmarkTaskWidget]o-[CompletionPeriod] - [QuestionnaireTaskWidget + [TaskOverview | - +task: QuestionnaireTask; - +completionPeriod: CompletionPeriod + +subject: StudySubject?; + +scheduleToday: List<TaskInstance>?; + +interventionIcon: String? ] - [QuestionnaireTaskWidget]o-[QuestionnaireTask] - [QuestionnaireTaskWidget]o-[CompletionPeriod] + [TaskOverview]o-[StudySubject] + + [TaskBox + | + +taskInstance: TaskInstance; + +icon: Icon; + +onCompleted: dynamic Function() + ] + + [TaskBox]o-[TaskInstance] + [TaskBox]o-[Icon] + [TaskBox]o-[dynamic Function()] + + [ProgressRow + | + +subject: StudySubject? + ] + + [ProgressRow]o-[StudySubject] + + [InterventionSegment + | + +intervention: Intervention; + +percentCompleted: double; + +percentMissed: double; + +isCurrent: bool; + +isFuture: bool; + +phaseDuration: int + | + +List<Widget> buildSeparators(); + +Widget build() + ] + + [InterventionSegment]o-[Intervention] + + [DashboardScreen + | + +error: String? + ] + + [OverflowMenuItem + | + +name: String; + +icon: IconData; + +routeName: String?; + +onTap: dynamic Function()? + ] + + [OverflowMenuItem]o-[IconData] + [OverflowMenuItem]o-[dynamic Function()?] + + [StudyFinishedPlaceholder + | + <static>+space: SizedBox + | + +Widget build() + ] + + [StudyFinishedPlaceholder]o-[SizedBox] [FAQ | @@ -452,1502 +361,1317 @@ [ContactItemType]o-[ContactItemType] [Enum]<:--[ContactItemType] - [ProgressRow + [Settings + ] + + [OptOutAlertDialog | +subject: StudySubject? + | + +Widget build() ] - [ProgressRow]o-[StudySubject] + [OptOutAlertDialog]o-[StudySubject] - [InterventionSegment + [DeleteAlertDialog | - +intervention: Intervention; - +percentCompleted: double; - +percentMissed: double; - +isCurrent: bool; - +isFuture: bool; - +phaseDuration: int + +subject: StudySubject? | - +List<Widget> buildSeparators(); +Widget build() ] - [InterventionSegment]o-[Intervention] + [DeleteAlertDialog]o-[StudySubject] - [TaskBox + [EligibilityResult | - +taskInstance: TaskInstance; - +icon: Icon; - +onCompleted: dynamic Function() + +eligible: bool; + +firstFailed: EligibilityCriterion? ] - [TaskBox]o-[TaskInstance] - [TaskBox]o-[Icon] - [TaskBox]o-[dynamic Function()] + [EligibilityResult]o-[EligibilityCriterion] - [TaskOverview + [EligibilityScreen | - +subject: StudySubject?; - +scheduleToday: List<TaskInstance>?; - +interventionIcon: String? + +study: Study? + | + <static>+MaterialPageRoute<EligibilityResult> routeFor() ] - [TaskOverview]o-[StudySubject] + [EligibilityScreen]o-[Study] - [DashboardScreen + [StudySelectionScreen | - +error: String? + +Widget build() ] - [OverflowMenuItem + [InviteCodeDialog + ] + + [StudyOverviewScreen + ] + + [_StudyOverviewScreen | - +name: String; - +icon: IconData; - +routeName: String?; - +onTap: dynamic Function()? + +study: Study? + | + +dynamic navigateToJourney(); + +dynamic navigateToEligibilityCheck(); + +Widget build() ] - [OverflowMenuItem]o-[IconData] - [OverflowMenuItem]o-[dynamic Function()?] + [_StudyOverviewScreen]o-[Study] - [StudyFinishedPlaceholder + [StudyDetailsView | - <static>+space: SizedBox + +study: Study?; + +iconSize: double | +Widget build() ] - [StudyFinishedPlaceholder]o-[SizedBox] + [StudyDetailsView]o-[Study] - [Settings + [KickoffScreen ] - [OptOutAlertDialog + [_KickoffScreen + | + +subject: StudySubject?; + +ready: bool + | + -dynamic _storeUserStudy(); + -Widget _constructStatusIcon(); + -String _getStatusText(); + +Widget build() + ] + + [_KickoffScreen]o-[StudySubject] + + [OnboardingProgress + | + +stage: int; + +progress: double + | + -double _getProgressForStage(); + +Widget build() + ] + + [ConsentScreen + ] + + [ConsentCard + | + +consent: ConsentItem?; + +index: int?; + +onTapped: dynamic Function(int); + +isChecked: bool? + | + +Widget build() + ] + + [ConsentCard]o-[ConsentItem] + [ConsentCard]o-[dynamic Function(int)] + + [ConsentElement + | + +title: String; + +descriptionText: String; + +acknowledgmentText: String; + +icon: IconData + ] + + [ConsentElement]o-[IconData] + + [InterventionSelectionScreen + ] + + [JourneyOverviewScreen + ] + + [_JourneyOverviewScreen | +subject: StudySubject? | + +dynamic getConsentAndNavigateToDashboard(); +Widget build() ] - [OptOutAlertDialog]o-[StudySubject] + [_JourneyOverviewScreen]o-[StudySubject] - [DeleteAlertDialog + [Timeline | +subject: StudySubject? | +Widget build() ] - [DeleteAlertDialog]o-[StudySubject] + [Timeline]o-[StudySubject] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + [InterventionTile + | + +title: String?; + +iconName: String; + +date: DateTime; + +color: Color?; + +isFirst: bool; + +isLast: bool + | + +Widget build() + ] + + [InterventionTile]o-[Color] + + [IconIndicator + | + +iconName: String; + +color: Color? + | + +Widget build() + ] + + [IconIndicator]o-[Color] + + [TimelineChild + | + +child: Widget? + | + +Widget build() + ] + + [TimelineChild]o-[<abstract>Widget] + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - + - + - + + + + + - + - + + + - + - + + + + + - + - + - + - + - + - - - + - + - - - + - + - - - + - + - + - + - + - + - + - + - - - + - + - + - + - + - + - + - + - + - + - + - + - - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + + + + + + + + + + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - - - - InterventionSelectionScreen - - - + + + - - - - - - - JourneyOverviewScreen - - - + + + - - - - - + + + + + + + + + + + + + - - - _JourneyOverviewScreen + + + ReportDetailsScreen - - - +subject: StudySubject? + + + +subject: StudySubject - - - +dynamic getConsentAndNavigateToDashboard() - +Widget build() + + + <static>+MaterialPageRoute<dynamic> routeFor() + +Widget build() - + - + StudySubject - - - - - + + + + + - - - Timeline + + + PerformanceDetailsScreen - - - +subject: StudySubject? + + + +reportSubject: StudySubject? - - - +Widget build() + + + <static>+MaterialPageRoute<dynamic> routeFor() + +Widget build() - - - - - + + + + + - - - InterventionTile + + + InterventionPerformanceBar - - - +title: String? - +iconName: String - +date: DateTime - +color: Color? - +isFirst: bool - +isLast: bool + + + +intervention: Intervention + +subject: StudySubject? - - - +Widget build() + + + +Widget build() - - - + + + - - - Color + + + Intervention - - - - - + + + + + - - - IconIndicator + + + ObservationPerformanceBar - - - +iconName: String - +color: Color? + + + +observation: Observation + +subject: StudySubject? - - - +Widget build() + + + +Widget build() - - - - - + + + - - - TimelineChild + + + Observation - - - +child: Widget? + + + + + + + + + + PerformanceBar - - - +Widget build() + + + +task: Task + +completed: int + +total: int - - - - - - - - Widget + + + +Widget build() - - - - - - - - StudySelectionScreen - - + + + - - - +Widget build() + + + Task - - - + + + + + - - - InviteCodeDialog + + + PerformanceSection - - - - + + + +minimumRatio: double + +maximum: double + + - - - KickoffScreen + + + +Widget buildContent() + +String getPowerLevelDescription() + +int getCountableObservationAmount() - - - - - + + + + + - - - _KickoffScreen + + + GenericSection - - - +subject: StudySubject? - +ready: bool + + + +subject: StudySubject? + +onTap: void Function()? - - - -dynamic _storeUserStudy() - -Widget _constructStatusIcon() - -String _getStatusText() - +Widget build() + + + +Widget buildContent() + +Widget build() - - - + + + + - - - ConsentScreen + + + GeneralDetailsSection - - - - - - + + + +Widget buildContent() + + - - - ConsentCard + + + + + + + + + + LinearRegressionSectionWidget - - - +consent: ConsentItem? - +index: int? - +onTapped: dynamic Function(int) - +isChecked: bool? + + + +section: LinearRegressionSection - - - +Widget build() + + + +Widget build() - - - + + + - - - ConsentItem + + + LinearRegressionSection - - - + + + + - - - dynamic Function(int) + + + ReportSectionWidget + + + + + + +subject: StudySubject - - - - + + + + + - - - ConsentElement + + + AverageSectionWidget - - - +title: String - +descriptionText: String - +acknowledgmentText: String - +icon: IconData + + + +section: AverageSection + +titlePos: List<int> + +phasePos: List<int> + + + + + + +Widget build() + +Widget getLegend() + +Widget getDiagram() + +BarChartData getChartData() + +Widget getTitles() + +Widget getValues() + +List<BarChartGroupData> getBarGroups() + +FlGridData getGridData() + +MaterialColor getColor() + +int getDayIndex() + +Iterable<DiagramDatum> getAggregatedData() + +Map<String, String?> getInterventionNames() - - - + + + - - - IconData + + + AverageSection - - - - + + + + - - - EligibilityResult + + + DiagramDatum - - - +eligible: bool - +firstFailed: EligibilityCriterion? + + + +x: num + +value: num + +timestamp: DateTime? + +intervention: String - - - + + + + - - - EligibilityCriterion + + + DisclaimerSection + + + + + + +Widget buildContent() - - - - - + + + + + - - - EligibilityScreen + + + ReportSectionContainer - - - +study: Study? + + + <static>+sectionTypes: Map<Type, ReportSectionWidget Function(ReportSection, StudySubject)> + +section: ReportSection + +subject: StudySubject + +primary: bool + +onTap: void Function()? - - - <static>+MaterialPageRoute<EligibilityResult> routeFor() + + + +ReportSectionWidget buildContents() + +List<Widget> buildPrimaryHeader() + +Widget build() - - - + + + - - - Study + + + ReportSection - - - + + + - - - StudyOverviewScreen + + + void Function()? - - - - - + + + + + - - - _StudyOverviewScreen + + + LegendWidget - - - +study: Study? + + + +name: String + +color: Color - - - +dynamic navigateToJourney() - +dynamic navigateToEligibilityCheck() - +Widget build() + + + +Widget build() - - - - - + + + - - - StudyDetailsView + + + Color - - - +study: Study? - +iconSize: double + + + + + + + + + + LegendsListWidget - - - +Widget build() + + + +legends: List<Legend> - - - - - - - - - - OnboardingProgress + + + +Widget build() - - - +stage: int - +progress: double + + + + + + + + + Legend - - - -double _getProgressForStage() - +Widget build() + + + +name: String + +color: Color - - - - - - - - - PerformanceDetailsScreen - - + + + + - - - +reportSubject: StudySubject? + + + ReportHistoryScreen - - - <static>+MaterialPageRoute<dynamic> routeFor() - +Widget build() + + + +Widget build() - - - - - + + + + + - - - InterventionPerformanceBar + + + ReportHistoryItem - - - +intervention: Intervention - +subject: StudySubject? + + + +subject: StudySubject - - - +Widget build() + + + +Widget build() - - - + + + + + - - - Intervention - - - - - - - - - - - - - ObservationPerformanceBar + + + TaskScreen - - - +observation: Observation - +subject: StudySubject? + + + +taskInstance: TaskInstance - - - +Widget build() + + + <static>+MaterialPageRoute<bool> routeFor() - - - + + + - - - Observation + + + TaskInstance - - - - - - - - - PerformanceBar - - + + + + - - - +task: Task - +completed: int - +total: int + + + QuestionnaireTaskWidget - - - +Widget build() + + + +task: QuestionnaireTask + +completionPeriod: CompletionPeriod - - - + + + - - - Task + + + QuestionnaireTask - - - - - + + + - - - PerformanceSection + + + CompletionPeriod - - - +minimumRatio: double - +maximum: double + + + + + + + + + CheckmarkTaskWidget - - - +Widget buildContent() - +String getPowerLevelDescription() - +int getCountableObservationAmount() + + + +task: CheckmarkTask? + +completionPeriod: CompletionPeriod? - - - - - + + + - - - GenericSection + + + CheckmarkTask - - - +subject: StudySubject? - +onTap: void Function()? + + + + + + + + + TaskOverview - - - +Widget buildContent() - +Widget build() + + + +subject: StudySubject? + +scheduleToday: List<TaskInstance>? + +interventionIcon: String? - - - - - + + + + - - - AverageSectionWidget + + + TaskBox - - - +section: AverageSection - +titlePos: List<int> - +phasePos: List<int> + + + +taskInstance: TaskInstance + +icon: Icon + +onCompleted: dynamic Function() - - - +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() + + + + + + + + Icon - - - + + + - - - AverageSection + + + dynamic Function() - - - - + + + + - - - ReportSectionWidget + + + ProgressRow - - - +subject: StudySubject + + + +subject: StudySubject? - - - - + + + + + - - - DiagramDatum + + + InterventionSegment - - - +x: num - +value: num - +timestamp: DateTime? - +intervention: String + + + +intervention: Intervention + +percentCompleted: double + +percentMissed: double + +isCurrent: bool + +isFuture: bool + +phaseDuration: int - - - - - - - - - - LinearRegressionSectionWidget + + + +List<Widget> buildSeparators() + +Widget build() - - - +section: LinearRegressionSection + + + + + + + + + DashboardScreen - - - +Widget build() + + + +error: String? - - - + + + + - - - LinearRegressionSection + + + OverflowMenuItem - - - - - - - - void Function()? + + + +name: String + +icon: IconData + +routeName: String? + +onTap: dynamic Function()? - - - - + + + - - - ReportHistoryScreen + + + IconData - - - +Widget build() + + + + + + + + dynamic Function()? - - - - - + + + + + - - - ReportHistoryItem + + + StudyFinishedPlaceholder - - - +subject: StudySubject + + + <static>+space: SizedBox - - - +Widget build() + + + +Widget build() - - - - + + + - - - GeneralDetailsSection - - - - - - +Widget buildContent() - - - - - - - - - - - - - LegendWidget - - - - - - +name: String - +color: Color - - - - - - +Widget build() - - - - - - - - - - - - - LegendsListWidget - - - - - - +legends: List<Legend> - - - - - - +Widget build() - - - - - - - - - - - - Legend - - - - - - +name: String - +color: Color - - - - - - - - - - - - - ReportDetailsScreen - - - - - - +subject: StudySubject - - - - - - <static>+MaterialPageRoute<dynamic> routeFor() - +Widget build() - - - - - - - - - - - - - ReportSectionContainer - - - - - - <static>+sectionTypes: Map<Type, ReportSectionWidget Function(ReportSection, StudySubject)> - +section: ReportSection - +subject: StudySubject - +primary: bool - +onTap: void Function()? - - - - - - +ReportSectionWidget buildContents() - +List<Widget> buildPrimaryHeader() - +Widget build() - - - - - - - - - - - ReportSection - - - - - - - - - - - - DisclaimerSection - - - - - - +Widget buildContent() - - - - - - - - - - - - - TaskScreen - - - - - - +taskInstance: TaskInstance - - - - - - <static>+MaterialPageRoute<bool> routeFor() - - - - - - - - - - - TaskInstance - - - - - - - - - - - - CheckmarkTaskWidget - - - - - - +task: CheckmarkTask? - +completionPeriod: CompletionPeriod? - - - - - - - - - - - CheckmarkTask - - - - - - - - - - - CompletionPeriod - - - - - - - - - - - - QuestionnaireTaskWidget - - - - - - +task: QuestionnaireTask - +completionPeriod: CompletionPeriod - - - - - - - - - - - QuestionnaireTask + + + SizedBox - - + + - + FAQ - + +Widget build() @@ -1956,16 +1680,16 @@ - - + + - + Entry - + +title: String +children: List<Entry> @@ -1975,23 +1699,23 @@ - - - + + + - + EntryItem - + +entry: Entry - + -Widget _buildTiles() +Widget build() @@ -2001,9 +1725,9 @@ - + - + ContactScreen @@ -2012,17 +1736,17 @@ - - - + + + - + ContactWidget - + +contact: Contact? +title: String @@ -2031,7 +1755,7 @@ - + +Widget build() @@ -2040,9 +1764,9 @@ - + - + Contact @@ -2051,17 +1775,17 @@ - - - + + + - + ContactItem - + +iconData: IconData +itemName: String @@ -2071,7 +1795,7 @@ - + +dynamic launchContact() +Widget build() @@ -2081,16 +1805,16 @@ - - + + - + ContactItemType - + +index: int <static>+values: List<ContactItemType> @@ -2103,269 +1827,545 @@ - + - + Enum - - - - - - - - ProgressRow - - + + + - - - +subject: StudySubject? + + + Settings - - - - - + + + + + - - - InterventionSegment + + + OptOutAlertDialog - - - +intervention: Intervention - +percentCompleted: double - +percentMissed: double - +isCurrent: bool - +isFuture: bool - +phaseDuration: int + + + +subject: StudySubject? - - - +List<Widget> buildSeparators() - +Widget build() + + + +Widget build() - - - - + + + + + - - - TaskBox + + + DeleteAlertDialog - - - +taskInstance: TaskInstance - +icon: Icon - +onCompleted: dynamic Function() + + + +subject: StudySubject? + + + + + + +Widget build() - - - + + + + - - - Icon + + + EligibilityResult + + + + + + +eligible: bool + +firstFailed: EligibilityCriterion? - - - + + + - - - dynamic Function() + + + EligibilityCriterion - - - - + + + + + - - - TaskOverview + + + EligibilityScreen - - - +subject: StudySubject? - +scheduleToday: List<TaskInstance>? - +interventionIcon: String? + + + +study: Study? + + + + + + <static>+MaterialPageRoute<EligibilityResult> routeFor() - - - - + + + - - - DashboardScreen + + + Study - - - +error: String? + + + + + + + + + StudySelectionScreen + + + + + + +Widget build() - - - - + + + - - - OverflowMenuItem + + + InviteCodeDialog - - - +name: String - +icon: IconData - +routeName: String? - +onTap: dynamic Function()? + + + + + + + + StudyOverviewScreen - - - + + + + + - - - dynamic Function()? + + + _StudyOverviewScreen + + + + + + +study: Study? + + + + + + +dynamic navigateToJourney() + +dynamic navigateToEligibilityCheck() + +Widget build() - - - - - + + + + + - - - StudyFinishedPlaceholder + + + StudyDetailsView - - - <static>+space: SizedBox + + + +study: Study? + +iconSize: double - - - +Widget build() + + + +Widget build() - - - + + + - - - SizedBox + + + KickoffScreen - - - + + + + + - - - Settings + + + _KickoffScreen + + + + + + +subject: StudySubject? + +ready: bool + + + + + + -dynamic _storeUserStudy() + -Widget _constructStatusIcon() + -String _getStatusText() + +Widget build() - - - - - + + + + + - - - OptOutAlertDialog + + + OnboardingProgress - - - +subject: StudySubject? + + + +stage: int + +progress: double - - - +Widget build() + + + -double _getProgressForStage() + +Widget build() - - - - - + + + - - - DeleteAlertDialog + + + ConsentScreen - - - +subject: StudySubject? + + + + + + + + + + ConsentCard - - - +Widget build() + + + +consent: ConsentItem? + +index: int? + +onTapped: dynamic Function(int) + +isChecked: bool? + + + + + + +Widget build() + + + + + + + + + + + ConsentItem + + + + + + + + + + + dynamic Function(int) + + + + + + + + + + + + ConsentElement + + + + + + +title: String + +descriptionText: String + +acknowledgmentText: String + +icon: IconData + + + + + + + + + + + InterventionSelectionScreen + + + + + + + + + + + JourneyOverviewScreen + + + + + + + + + + + + + _JourneyOverviewScreen + + + + + + +subject: StudySubject? + + + + + + +dynamic getConsentAndNavigateToDashboard() + +Widget build() + + + + + + + + + + + + + Timeline + + + + + + +subject: StudySubject? + + + + + + +Widget build() + + + + + + + + + + + + + InterventionTile + + + + + + +title: String? + +iconName: String + +date: DateTime + +color: Color? + +isFirst: bool + +isLast: bool + + + + + + +Widget build() + + + + + + + + + + + + + IconIndicator + + + + + + +iconName: String + +color: Color? + + + + + + +Widget build() + + + + + + + + + + + + + TimelineChild + + + + + + +child: Widget? + + + + + + +Widget build() + + + + + + + + + + + Widget diff --git a/docs/uml/app/lib/screens/uml.svg b/docs/uml/app/lib/screens/uml.svg index 1a281e28b..20abf5968 100644 --- a/docs/uml/app/lib/screens/uml.svg +++ b/docs/uml/app/lib/screens/uml.svg @@ -1,2640 +1,2640 @@ - - [Preview + + [ReportDetailsScreen | - +queryParameters: Map<String, String>?; - +appLanguage: AppLanguage; - +selectedRoute: String?; - +extra: String?; - +study: Study?; - +selectedStudyObjectId: String?; - +subject: StudySubject? - | - +bool hasRoute(); - +void handleQueries(); - +dynamic init(); - +dynamic handleAuthorization(); - +dynamic runCommands(); - +String? getSelectedRoute(); - +bool containsQuery(); - +bool containsQueryPair(); - +dynamic getStudySubject(); - -dynamic _createFakeSubject(); - +List<String> getInterventionIds() - ] - - [Preview]o-[AppLanguage] - [Preview]o-[Study] - [Preview]o-[StudySubject] - - [WelcomeScreen - | - +Widget build() - ] - - [TermsScreen - ] - - [LegalSection - | - +title: String?; - +description: String?; - +icon: Icon?; - +pdfUrl: String?; - +pdfUrlLabel: String?; - +acknowledgment: String?; - +isChecked: bool?; - +onChange: void Function(bool?)? + +subject: StudySubject | + <static>+MaterialPageRoute<dynamic> routeFor(); +Widget build() ] - [LegalSection]o-[Icon] - [LegalSection]o-[void Function(bool?)?] + [ReportDetailsScreen]o-[StudySubject] - [IFrameHelper + [PerformanceDetailsScreen | - +void postRouteFinished(); - +void listen() - ] - - [AboutScreen + +reportSubject: StudySubject? | + <static>+MaterialPageRoute<dynamic> routeFor(); +Widget build() ] - [LoadingScreen - | - +sessionString: String?; - +queryParameters: Map<String, String>? - ] - - [InterventionSelectionScreen - ] - - [JourneyOverviewScreen - ] + [PerformanceDetailsScreen]o-[StudySubject] - [_JourneyOverviewScreen + [InterventionPerformanceBar | + +intervention: Intervention; +subject: StudySubject? | - +dynamic getConsentAndNavigateToDashboard(); +Widget build() ] - [_JourneyOverviewScreen]o-[StudySubject] + [InterventionPerformanceBar]o-[Intervention] + [InterventionPerformanceBar]o-[StudySubject] - [Timeline + [ObservationPerformanceBar | + +observation: Observation; +subject: StudySubject? | +Widget build() ] - [Timeline]o-[StudySubject] + [ObservationPerformanceBar]o-[<abstract>Observation] + [ObservationPerformanceBar]o-[StudySubject] - [InterventionTile + [PerformanceBar | - +title: String?; - +iconName: String; - +date: DateTime; - +color: Color?; - +isFirst: bool; - +isLast: bool + +task: Task; + +completed: int; + +total: int | +Widget build() ] - [InterventionTile]o-[Color] + [PerformanceBar]o-[<abstract>Task] - [IconIndicator + [PerformanceSection | - +iconName: String; - +color: Color? + +minimumRatio: double; + +maximum: double | - +Widget build() + +Widget buildContent(); + +String getPowerLevelDescription(); + +int getCountableObservationAmount() ] - [IconIndicator]o-[Color] + [<abstract>GenericSection]<:-[PerformanceSection] - [TimelineChild + [PerformanceBar | - +child: Widget? + +progress: double; + +minimum: double? | +Widget build() ] - [TimelineChild]o-[<abstract>Widget] - - [StudySelectionScreen + [GeneralDetailsSection | - +Widget build() - ] - - [InviteCodeDialog + +Widget buildContent() ] - [KickoffScreen - ] + [<abstract>GenericSection]<:-[GeneralDetailsSection] - [_KickoffScreen + [LinearRegressionSectionWidget | - +subject: StudySubject?; - +ready: bool + +section: LinearRegressionSection | - -dynamic _storeUserStudy(); - -Widget _constructStatusIcon(); - -String _getStatusText(); +Widget build() ] - [_KickoffScreen]o-[StudySubject] - - [ConsentScreen - ] + [LinearRegressionSectionWidget]o-[LinearRegressionSection] + [<abstract>ReportSectionWidget]<:-[LinearRegressionSectionWidget] - [ConsentCard + [AverageSectionWidget | - +consent: ConsentItem?; - +index: int?; - +onTapped: dynamic Function(int); - +isChecked: bool? + +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() ] - [ConsentCard]o-[ConsentItem] - [ConsentCard]o-[dynamic Function(int)] + [AverageSectionWidget]o-[AverageSection] + [<abstract>ReportSectionWidget]<:-[AverageSectionWidget] - [ConsentElement + [DiagramDatum | - +title: String; - +descriptionText: String; - +acknowledgmentText: String; - +icon: IconData + +x: num; + +value: num; + +timestamp: DateTime?; + +intervention: String ] - [ConsentElement]o-[IconData] - - [EligibilityResult + [DisclaimerSection | - +eligible: bool; - +firstFailed: EligibilityCriterion? + +Widget buildContent() ] - [EligibilityResult]o-[EligibilityCriterion] + [<abstract>GenericSection]<:-[DisclaimerSection] - [EligibilityScreen + [ReportSectionContainer | - +study: Study? + <static>+sectionTypes: Map<Type, ReportSectionWidget Function(ReportSection, StudySubject)>; + +section: ReportSection; + +subject: StudySubject; + +primary: bool; + +onTap: void Function()? | - <static>+MaterialPageRoute<EligibilityResult> routeFor() + +ReportSectionWidget buildContents(); + +List<Widget> buildPrimaryHeader(); + +Widget build() ] - [EligibilityScreen]o-[Study] - - [StudyOverviewScreen - ] + [ReportSectionContainer]o-[<abstract>ReportSection] + [ReportSectionContainer]o-[StudySubject] + [ReportSectionContainer]o-[void Function()?] - [_StudyOverviewScreen + [LegendWidget | - +study: Study? + +name: String; + +color: Color | - +dynamic navigateToJourney(); - +dynamic navigateToEligibilityCheck(); +Widget build() ] - [_StudyOverviewScreen]o-[Study] + [LegendWidget]o-[Color] - [StudyDetailsView + [LegendsListWidget | - +study: Study?; - +iconSize: double + +legends: List<Legend> | +Widget build() ] - [StudyDetailsView]o-[Study] - - [OnboardingProgress + [Legend | - +stage: int; - +progress: double + +name: String; + +color: Color + ] + + [Legend]o-[Color] + + [ReportHistoryScreen | - -double _getProgressForStage(); +Widget build() ] - [PerformanceDetailsScreen + [ReportHistoryItem | - +reportSubject: StudySubject? + +subject: StudySubject | - <static>+MaterialPageRoute<dynamic> routeFor(); +Widget build() ] - [PerformanceDetailsScreen]o-[StudySubject] + [ReportHistoryItem]o-[StudySubject] - [InterventionPerformanceBar - | - +intervention: Intervention; - +subject: StudySubject? + [<abstract>ReportSectionWidget | - +Widget build() + +subject: StudySubject ] - [InterventionPerformanceBar]o-[Intervention] - [InterventionPerformanceBar]o-[StudySubject] + [<abstract>ReportSectionWidget]o-[StudySubject] - [ObservationPerformanceBar + [<abstract>GenericSection | - +observation: Observation; - +subject: StudySubject? + +subject: StudySubject?; + +onTap: void Function()? | + +Widget buildContent(); +Widget build() ] - [ObservationPerformanceBar]o-[<abstract>Observation] - [ObservationPerformanceBar]o-[StudySubject] + [<abstract>GenericSection]o-[StudySubject] + [<abstract>GenericSection]o-[void Function()?] - [PerformanceBar + [TaskScreen | - +task: Task; - +completed: int; - +total: int + +taskInstance: TaskInstance | - +Widget build() + <static>+MaterialPageRoute<bool> routeFor() ] - [PerformanceBar]o-[<abstract>Task] + [TaskScreen]o-[TaskInstance] - [PerformanceSection - | - +minimumRatio: double; - +maximum: double + [QuestionnaireTaskWidget | - +Widget buildContent(); - +String getPowerLevelDescription(); - +int getCountableObservationAmount() + +task: QuestionnaireTask; + +completionPeriod: CompletionPeriod ] - [<abstract>GenericSection]<:-[PerformanceSection] + [QuestionnaireTaskWidget]o-[QuestionnaireTask] + [QuestionnaireTaskWidget]o-[CompletionPeriod] - [PerformanceBar - | - +progress: double; - +minimum: double? + [CheckmarkTaskWidget | - +Widget build() + +task: CheckmarkTask?; + +completionPeriod: CompletionPeriod? ] - [AverageSectionWidget + [CheckmarkTaskWidget]o-[CheckmarkTask] + [CheckmarkTaskWidget]o-[CompletionPeriod] + + [TaskOverview | - +section: AverageSection; - +titlePos: List<int>; - +phasePos: List<int> + +subject: StudySubject?; + +scheduleToday: List<TaskInstance>?; + +interventionIcon: String? + ] + + [TaskOverview]o-[StudySubject] + + [TaskBox | - +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; + +icon: Icon; + +onCompleted: dynamic Function() ] - [AverageSectionWidget]o-[AverageSection] - [<abstract>ReportSectionWidget]<:-[AverageSectionWidget] + [TaskBox]o-[TaskInstance] + [TaskBox]o-[Icon] + [TaskBox]o-[dynamic Function()] - [DiagramDatum + [ProgressRow | - +x: num; - +value: num; - +timestamp: DateTime?; - +intervention: String + +subject: StudySubject? ] - [LinearRegressionSectionWidget + [ProgressRow]o-[StudySubject] + + [InterventionSegment | - +section: LinearRegressionSection + +intervention: Intervention; + +percentCompleted: double; + +percentMissed: double; + +isCurrent: bool; + +isFuture: bool; + +phaseDuration: int + | + +List<Widget> buildSeparators(); + +Widget build() + ] + + [InterventionSegment]o-[Intervention] + + [DashboardScreen | - +Widget build() + +error: String? ] - [LinearRegressionSectionWidget]o-[LinearRegressionSection] - [<abstract>ReportSectionWidget]<:-[LinearRegressionSectionWidget] - - [<abstract>ReportSectionWidget + [OverflowMenuItem | - +subject: StudySubject + +name: String; + +icon: IconData; + +routeName: String?; + +onTap: dynamic Function()? ] - [<abstract>ReportSectionWidget]o-[StudySubject] + [OverflowMenuItem]o-[IconData] + [OverflowMenuItem]o-[dynamic Function()?] - [<abstract>GenericSection + [StudyFinishedPlaceholder | - +subject: StudySubject?; - +onTap: void Function()? + <static>+space: SizedBox | - +Widget buildContent(); +Widget build() ] - [<abstract>GenericSection]o-[StudySubject] - [<abstract>GenericSection]o-[void Function()?] + [StudyFinishedPlaceholder]o-[SizedBox] - [ReportHistoryScreen + [FAQ | +Widget build() ] - [ReportHistoryItem + [Entry | - +subject: StudySubject + +title: String; + +children: List<Entry> + ] + + [EntryItem + | + +entry: Entry | + -Widget _buildTiles(); +Widget build() ] - [ReportHistoryItem]o-[StudySubject] + [EntryItem]o-[Entry] - [GeneralDetailsSection - | - +Widget buildContent() + [ContactScreen ] - [<abstract>GenericSection]<:-[GeneralDetailsSection] - - [LegendWidget + [ContactWidget | - +name: String; + +contact: Contact?; + +title: String; + +subtitle: String?; +color: Color | +Widget build() ] - [LegendWidget]o-[Color] + [ContactWidget]o-[Contact] + [ContactWidget]o-[Color] - [LegendsListWidget + [ContactItem | - +legends: List<Legend> + +iconData: IconData; + +itemName: String; + +itemValue: String?; + +type: ContactItemType?; + +iconColor: Color? | + +dynamic launchContact(); +Widget build() ] - [Legend + [ContactItem]o-[IconData] + [ContactItem]o-[ContactItemType] + [ContactItem]o-[Color] + + [ContactItemType | - +name: String; - +color: Color + +index: int; + <static>+values: List<ContactItemType>; + <static>+website: ContactItemType; + <static>+email: ContactItemType; + <static>+phone: ContactItemType ] - [Legend]o-[Color] + [ContactItemType]o-[ContactItemType] + [Enum]<:--[ContactItemType] - [ReportDetailsScreen + [Settings + ] + + [OptOutAlertDialog | - +subject: StudySubject + +subject: StudySubject? | - <static>+MaterialPageRoute<dynamic> routeFor(); +Widget build() ] - [ReportDetailsScreen]o-[StudySubject] + [OptOutAlertDialog]o-[StudySubject] - [ReportSectionContainer + [DeleteAlertDialog | - <static>+sectionTypes: Map<Type, ReportSectionWidget Function(ReportSection, StudySubject)>; - +section: ReportSection; - +subject: StudySubject; - +primary: bool; - +onTap: void Function()? + +subject: StudySubject? | - +ReportSectionWidget buildContents(); - +List<Widget> buildPrimaryHeader(); +Widget build() ] - [ReportSectionContainer]o-[<abstract>ReportSection] - [ReportSectionContainer]o-[StudySubject] - [ReportSectionContainer]o-[void Function()?] + [DeleteAlertDialog]o-[StudySubject] - [DisclaimerSection + [EligibilityResult | - +Widget buildContent() + +eligible: bool; + +firstFailed: EligibilityCriterion? ] - [<abstract>GenericSection]<:-[DisclaimerSection] + [EligibilityResult]o-[EligibilityCriterion] - [TaskScreen + [EligibilityScreen | - +taskInstance: TaskInstance + +study: Study? | - <static>+MaterialPageRoute<bool> routeFor() + <static>+MaterialPageRoute<EligibilityResult> routeFor() ] - [TaskScreen]o-[TaskInstance] + [EligibilityScreen]o-[Study] - [CheckmarkTaskWidget + [StudySelectionScreen | - +task: CheckmarkTask?; - +completionPeriod: CompletionPeriod? + +Widget build() ] - [CheckmarkTaskWidget]o-[CheckmarkTask] - [CheckmarkTaskWidget]o-[CompletionPeriod] + [InviteCodeDialog + ] - [QuestionnaireTaskWidget + [StudyOverviewScreen + ] + + [_StudyOverviewScreen | - +task: QuestionnaireTask; - +completionPeriod: CompletionPeriod + +study: Study? + | + +dynamic navigateToJourney(); + +dynamic navigateToEligibilityCheck(); + +Widget build() ] - [QuestionnaireTaskWidget]o-[QuestionnaireTask] - [QuestionnaireTaskWidget]o-[CompletionPeriod] + [_StudyOverviewScreen]o-[Study] - [FAQ + [StudyDetailsView + | + +study: Study?; + +iconSize: double | +Widget build() ] - [Entry - | - +title: String; - +children: List<Entry> + [StudyDetailsView]o-[Study] + + [KickoffScreen ] - [EntryItem + [_KickoffScreen | - +entry: Entry + +subject: StudySubject?; + +ready: bool | - -Widget _buildTiles(); + -dynamic _storeUserStudy(); + -Widget _constructStatusIcon(); + -String _getStatusText(); +Widget build() ] - [EntryItem]o-[Entry] + [_KickoffScreen]o-[StudySubject] - [ContactScreen + [OnboardingProgress + | + +stage: int; + +progress: double + | + -double _getProgressForStage(); + +Widget build() ] - [ContactWidget + [ConsentScreen + ] + + [ConsentCard | - +contact: Contact?; - +title: String; - +subtitle: String?; - +color: Color + +consent: ConsentItem?; + +index: int?; + +onTapped: dynamic Function(int); + +isChecked: bool? | +Widget build() ] - [ContactWidget]o-[Contact] - [ContactWidget]o-[Color] + [ConsentCard]o-[ConsentItem] + [ConsentCard]o-[dynamic Function(int)] - [ContactItem + [ConsentElement | - +iconData: IconData; - +itemName: String; - +itemValue: String?; - +type: ContactItemType?; - +iconColor: Color? + +title: String; + +descriptionText: String; + +acknowledgmentText: String; + +icon: IconData + ] + + [ConsentElement]o-[IconData] + + [InterventionSelectionScreen + ] + + [JourneyOverviewScreen + ] + + [_JourneyOverviewScreen | - +dynamic launchContact(); + +subject: StudySubject? + | + +dynamic getConsentAndNavigateToDashboard(); +Widget build() ] - [ContactItem]o-[IconData] - [ContactItem]o-[ContactItemType] - [ContactItem]o-[Color] + [_JourneyOverviewScreen]o-[StudySubject] - [ContactItemType + [Timeline | - +index: int; - <static>+values: List<ContactItemType>; - <static>+website: ContactItemType; - <static>+email: ContactItemType; - <static>+phone: ContactItemType + +subject: StudySubject? + | + +Widget build() ] - [ContactItemType]o-[ContactItemType] - [Enum]<:--[ContactItemType] + [Timeline]o-[StudySubject] - [ProgressRow + [InterventionTile | - +subject: StudySubject? + +title: String?; + +iconName: String; + +date: DateTime; + +color: Color?; + +isFirst: bool; + +isLast: bool + | + +Widget build() ] - [ProgressRow]o-[StudySubject] + [InterventionTile]o-[Color] - [InterventionSegment + [IconIndicator | - +intervention: Intervention; - +percentCompleted: double; - +percentMissed: double; - +isCurrent: bool; - +isFuture: bool; - +phaseDuration: int + +iconName: String; + +color: Color? | - +List<Widget> buildSeparators(); +Widget build() ] - [InterventionSegment]o-[Intervention] + [IconIndicator]o-[Color] - [TaskBox + [TimelineChild | - +taskInstance: TaskInstance; - +icon: Icon; - +onCompleted: dynamic Function() + +child: Widget? + | + +Widget build() ] - [TaskBox]o-[TaskInstance] - [TaskBox]o-[Icon] - [TaskBox]o-[dynamic Function()] + [TimelineChild]o-[<abstract>Widget] - [TaskOverview + [AboutScreen | - +subject: StudySubject?; - +scheduleToday: List<TaskInstance>?; - +interventionIcon: String? + +Widget build() ] - [TaskOverview]o-[StudySubject] - - [DashboardScreen + [WelcomeScreen | - +error: String? + +Widget build() ] - [OverflowMenuItem + [IFrameHelper | - +name: String; - +icon: IconData; - +routeName: String?; - +onTap: dynamic Function()? + +void postRouteFinished(); + +void listen() ] - [OverflowMenuItem]o-[IconData] - [OverflowMenuItem]o-[dynamic Function()?] + [TermsScreen + ] - [StudyFinishedPlaceholder + [LegalSection | - <static>+space: SizedBox + +title: String?; + +description: String?; + +icon: Icon?; + +pdfUrl: String?; + +pdfUrlLabel: String?; + +acknowledgment: String?; + +isChecked: bool?; + +onChange: void Function(bool?)? | +Widget build() ] - [StudyFinishedPlaceholder]o-[SizedBox] - - [Settings - ] + [LegalSection]o-[Icon] + [LegalSection]o-[void Function(bool?)?] - [OptOutAlertDialog + [Preview | + +queryParameters: Map<String, String>?; + +appLanguage: AppLanguage; + +selectedRoute: String?; + +extra: String?; + +study: Study?; + +selectedStudyObjectId: String?; +subject: StudySubject? | - +Widget build() + +bool hasRoute(); + +void handleQueries(); + +dynamic init(); + +dynamic handleAuthorization(); + +dynamic runCommands(); + +String? getSelectedRoute(); + +bool containsQuery(); + +bool containsQueryPair(); + +dynamic getStudySubject(); + -dynamic _createFakeSubject(); + +List<String> getInterventionIds() ] - [OptOutAlertDialog]o-[StudySubject] + [Preview]o-[AppLanguage] + [Preview]o-[Study] + [Preview]o-[StudySubject] - [DeleteAlertDialog - | - +subject: StudySubject? + [LoadingScreen | - +Widget build() + +sessionString: String?; + +queryParameters: Map<String, String>? ] - [DeleteAlertDialog]o-[StudySubject] - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + + - + - + + + - + - + + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - + - + - - - + - + - - - + - + - + - + - + - + - + - + - - - + - + - + - + - + - + - + - + - + - + - + - + - - - + - + - + - + - + - + - - - + + - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + + - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - - - - - - 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() + + + ReportDetailsScreen - - - - - - - - AppLanguage + + + +subject: StudySubject - - - - - - - - Study + + + <static>+MaterialPageRoute<dynamic> routeFor() + +Widget build() - + - + StudySubject - - - - + + + + + - - - WelcomeScreen + + + PerformanceDetailsScreen - - - +Widget build() + + + +reportSubject: StudySubject? - - - - - - - - TermsScreen + + + <static>+MaterialPageRoute<dynamic> routeFor() + +Widget build() - - - - - + + + + + - - - LegalSection + + + InterventionPerformanceBar - - - +title: String? - +description: String? - +icon: Icon? - +pdfUrl: String? - +pdfUrlLabel: String? - +acknowledgment: String? - +isChecked: bool? - +onChange: void Function(bool?)? + + + +intervention: Intervention + +subject: StudySubject? - - - +Widget build() + + + +Widget build() - - - + + + - - - Icon + + + Intervention - - - + + + + + - - - void Function(bool?)? + + + ObservationPerformanceBar - - - - - - - - - IFrameHelper + + + +observation: Observation + +subject: StudySubject? - - - +void postRouteFinished() - +void listen() + + + +Widget build() - - - - - - - - AboutScreen - - + + + - - - +Widget build() + + + Observation - - - - + + + + + - - - LoadingScreen + + + PerformanceBar - - - +sessionString: String? - +queryParameters: Map<String, String>? + + + +task: Task + +completed: int + +total: int - - - - - - - - InterventionSelectionScreen + + + +Widget build() - - - + + + - - - JourneyOverviewScreen + + + Task - - - - - + + + + + - - - _JourneyOverviewScreen + + + PerformanceSection - - - +subject: StudySubject? + + + +minimumRatio: double + +maximum: double - - - +dynamic getConsentAndNavigateToDashboard() - +Widget build() + + + +Widget buildContent() + +String getPowerLevelDescription() + +int getCountableObservationAmount() - - - - - + + + + + - - - Timeline + + + GenericSection - - - +subject: StudySubject? + + + +subject: StudySubject? + +onTap: void Function()? - - - +Widget build() + + + +Widget buildContent() + +Widget build() - - - - - + + + + - - - InterventionTile + + + GeneralDetailsSection - - - +title: String? - +iconName: String - +date: DateTime - +color: Color? - +isFirst: bool - +isLast: bool + + + +Widget buildContent() - - - +Widget build() + + + + + + + + + + LinearRegressionSectionWidget - - - - + + + +section: LinearRegressionSection + + - - - Color + + + +Widget build() - - - - - + + + - - - IconIndicator + + + LinearRegressionSection - - - +iconName: String - +color: Color? + + + + + + + + + ReportSectionWidget - - - +Widget build() + + + +subject: StudySubject - - - - - + + + + + - - - TimelineChild + + + AverageSectionWidget - - - +child: Widget? + + + +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() - - - + + + - - - Widget + + + AverageSection - - - - + + + + - - - StudySelectionScreen + + + DiagramDatum - - - +Widget build() + + + +x: num + +value: num + +timestamp: DateTime? + +intervention: String - - - + + + + - - - InviteCodeDialog + + + DisclaimerSection - - - - - - - - KickoffScreen + + + +Widget buildContent() - - - - - + + + + + - - - _KickoffScreen + + + ReportSectionContainer - - - +subject: StudySubject? - +ready: bool + + + <static>+sectionTypes: Map<Type, ReportSectionWidget Function(ReportSection, StudySubject)> + +section: ReportSection + +subject: StudySubject + +primary: bool + +onTap: void Function()? - - - -dynamic _storeUserStudy() - -Widget _constructStatusIcon() - -String _getStatusText() - +Widget build() + + + +ReportSectionWidget buildContents() + +List<Widget> buildPrimaryHeader() + +Widget build() - - - + + + - - - ConsentScreen + + + ReportSection - - - - - + + + - - - ConsentCard + + + void Function()? - - - +consent: ConsentItem? - +index: int? - +onTapped: dynamic Function(int) - +isChecked: bool? + + + + + + + + + + LegendWidget - - - +Widget build() + + + +name: String + +color: Color + + + + + + +Widget build() - - - + + + - - - ConsentItem + + + Color - - - + + + + + - - - dynamic Function(int) + + + LegendsListWidget + + + + + + +legends: List<Legend> + + + + + + +Widget build() - - - - + + + + - - - ConsentElement + + + Legend - - - +title: String - +descriptionText: String - +acknowledgmentText: String - +icon: IconData + + + +name: String + +color: Color - - - + + + + - - - IconData + + + ReportHistoryScreen + + + + + + +Widget build() - - - - + + + + + - - - EligibilityResult + + + ReportHistoryItem - - - +eligible: bool - +firstFailed: EligibilityCriterion? + + + +subject: StudySubject - - - - - - - - EligibilityCriterion + + + +Widget build() - - - - - + + + + + - - - EligibilityScreen + + + TaskScreen - - - +study: Study? + + + +taskInstance: TaskInstance - - - <static>+MaterialPageRoute<EligibilityResult> routeFor() + + + <static>+MaterialPageRoute<bool> routeFor() - - - + + + - - - StudyOverviewScreen + + + TaskInstance - - - - - + + + + - - - _StudyOverviewScreen + + + QuestionnaireTaskWidget - - - +study: Study? + + + +task: QuestionnaireTask + +completionPeriod: CompletionPeriod - - - +dynamic navigateToJourney() - +dynamic navigateToEligibilityCheck() - +Widget build() + + + + + + + + QuestionnaireTask - - - - - + + + - - - StudyDetailsView + + + CompletionPeriod - - - +study: Study? - +iconSize: double + + + + + + + + + CheckmarkTaskWidget - - - +Widget build() + + + +task: CheckmarkTask? + +completionPeriod: CompletionPeriod? - - - - - + + + - - - OnboardingProgress + + + CheckmarkTask - - - +stage: int - +progress: double + + + + + + + + + TaskOverview - - - -double _getProgressForStage() - +Widget build() + + + +subject: StudySubject? + +scheduleToday: List<TaskInstance>? + +interventionIcon: String? - - - - - + + + + - - - PerformanceDetailsScreen + + + TaskBox - - - +reportSubject: StudySubject? + + + +taskInstance: TaskInstance + +icon: Icon + +onCompleted: dynamic Function() - - - <static>+MaterialPageRoute<dynamic> routeFor() - +Widget build() + + + + + + + + Icon - - - - - + + + - - - InterventionPerformanceBar + + + dynamic Function() - - - +intervention: Intervention - +subject: StudySubject? - - + + + + + - - - +Widget build() + + + ProgressRow - - - - - - - - Intervention + + + +subject: StudySubject? - - - - - + + + + + - - - ObservationPerformanceBar + + + InterventionSegment - - - +observation: Observation - +subject: StudySubject? + + + +intervention: Intervention + +percentCompleted: double + +percentMissed: double + +isCurrent: bool + +isFuture: bool + +phaseDuration: int - - - +Widget build() + + + +List<Widget> buildSeparators() + +Widget build() - - - + + + + - - - Observation + + + DashboardScreen + + + + + + +error: String? - - - - - + + + + - - - PerformanceBar + + + OverflowMenuItem - - - +task: Task - +completed: int - +total: int + + + +name: String + +icon: IconData + +routeName: String? + +onTap: dynamic Function()? - - - +Widget build() + + + + + + + + IconData - - - + + + - - - Task + + + dynamic Function()? - - - - - + + + + + - - - PerformanceSection + + + StudyFinishedPlaceholder - - - +minimumRatio: double - +maximum: double + + + <static>+space: SizedBox - - - +Widget buildContent() - +String getPowerLevelDescription() - +int getCountableObservationAmount() + + + +Widget build() - - - - - + + + - - - GenericSection + + + SizedBox - - - +subject: StudySubject? - +onTap: void Function()? + + + + + + + + + FAQ - - - +Widget buildContent() - +Widget build() + + + +Widget build() - - - - - - - - - AverageSectionWidget - - + + + + - - - +section: AverageSection - +titlePos: List<int> - +phasePos: List<int> + + + Entry - - - +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() + + + +title: String + +children: List<Entry> - - - + + + + + - - - AverageSection + + + EntryItem - - - - - - - - - ReportSectionWidget + + + +entry: Entry - - - +subject: StudySubject + + + -Widget _buildTiles() + +Widget build() - - - - - - - - DiagramDatum - - + + + - - - +x: num - +value: num - +timestamp: DateTime? - +intervention: String + + + ContactScreen - - - - - + + + + + - - - LinearRegressionSectionWidget + + + ContactWidget - - - +section: LinearRegressionSection + + + +contact: Contact? + +title: String + +subtitle: String? + +color: Color - - - +Widget build() + + + +Widget build() - - - + + + - - - LinearRegressionSection + + + Contact - - - + + + + + - - - void Function()? + + + ContactItem - - - - - - - - - ReportHistoryScreen + + + +iconData: IconData + +itemName: String + +itemValue: String? + +type: ContactItemType? + +iconColor: Color? - - - +Widget build() + + + +dynamic launchContact() + +Widget build() - - - - - - - - - ReportHistoryItem - - + + + + - - - +subject: StudySubject + + + ContactItemType - - - +Widget build() + + + +index: int + <static>+values: List<ContactItemType> + <static>+website: ContactItemType + <static>+email: ContactItemType + <static>+phone: ContactItemType - - - - + + + - - - GeneralDetailsSection + + + Enum - - - +Widget buildContent() + + + + + + + + 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 + + + EligibilityResult - - - +name: String - +color: Color + + + +eligible: bool + +firstFailed: EligibilityCriterion? + + + + + + + + + + + EligibilityCriterion - - - - - + + + + + - - - ReportDetailsScreen + + + EligibilityScreen - - - +subject: StudySubject + + + +study: Study? - - - <static>+MaterialPageRoute<dynamic> routeFor() - +Widget build() + + + <static>+MaterialPageRoute<EligibilityResult> routeFor() - - - - - + + + - - - ReportSectionContainer + + + Study - - - <static>+sectionTypes: Map<Type, ReportSectionWidget Function(ReportSection, StudySubject)> - +section: ReportSection - +subject: StudySubject - +primary: bool - +onTap: void Function()? + + + + + + + + + StudySelectionScreen - - - +ReportSectionWidget buildContents() - +List<Widget> buildPrimaryHeader() - +Widget build() + + + +Widget build() - - - + + + - - - ReportSection + + + InviteCodeDialog - - - - - - - - DisclaimerSection - - + + + - - - +Widget buildContent() + + + StudyOverviewScreen - - - - - + + + + + - - - TaskScreen + + + _StudyOverviewScreen - - - +taskInstance: TaskInstance + + + +study: Study? - - - <static>+MaterialPageRoute<bool> routeFor() + + + +dynamic navigateToJourney() + +dynamic navigateToEligibilityCheck() + +Widget build() - - - + + + + + - - - TaskInstance + + + StudyDetailsView - - - - - - - - - CheckmarkTaskWidget + + + +study: Study? + +iconSize: double - - - +task: CheckmarkTask? - +completionPeriod: CompletionPeriod? + + + +Widget build() - - - + + + - - - CheckmarkTask + + + KickoffScreen - - - + + + + + - - - CompletionPeriod + + + _KickoffScreen - - - - - - - - - QuestionnaireTaskWidget + + + +subject: StudySubject? + +ready: bool - - - +task: QuestionnaireTask - +completionPeriod: CompletionPeriod + + + -dynamic _storeUserStudy() + -Widget _constructStatusIcon() + -String _getStatusText() + +Widget build() - - - + + + + + - - - QuestionnaireTask + + + OnboardingProgress - - - - - - - - - FAQ + + + +stage: int + +progress: double - - - +Widget build() + + + -double _getProgressForStage() + +Widget build() - - - - - - - - Entry - - + + + - - - +title: String - +children: List<Entry> + + + ConsentScreen - - - - - + + + + + - - - EntryItem + + + ConsentCard - - - +entry: Entry + + + +consent: ConsentItem? + +index: int? + +onTapped: dynamic Function(int) + +isChecked: bool? - - - -Widget _buildTiles() - +Widget build() + + + +Widget build() - - - + + + - - - ContactScreen + + + ConsentItem - - - - - + + + - - - ContactWidget + + + dynamic Function(int) - - - +contact: Contact? - +title: String - +subtitle: String? - +color: Color + + + + + + + + + ConsentElement - - - +Widget build() + + + +title: String + +descriptionText: String + +acknowledgmentText: String + +icon: IconData - - - + + + - - - Contact + + + InterventionSelectionScreen - - - - - + + + - - - ContactItem + + + JourneyOverviewScreen + + + + + + + + + + + + + _JourneyOverviewScreen - - - +iconData: IconData - +itemName: String - +itemValue: String? - +type: ContactItemType? - +iconColor: Color? + + + +subject: StudySubject? - - - +dynamic launchContact() - +Widget build() + + + +dynamic getConsentAndNavigateToDashboard() + +Widget build() - - - - + + + + + - - - ContactItemType + + + Timeline - - - +index: int - <static>+values: List<ContactItemType> - <static>+website: ContactItemType - <static>+email: ContactItemType - <static>+phone: ContactItemType + + + +subject: StudySubject? - - - - - - - - Enum + + + +Widget build() - - - - + + + + + - - - ProgressRow + + + InterventionTile - - - +subject: StudySubject? + + + +title: String? + +iconName: String + +date: DateTime + +color: Color? + +isFirst: bool + +isLast: bool + + + + + + +Widget build() - - - - - + + + + + - - - InterventionSegment + + + IconIndicator - - - +intervention: Intervention - +percentCompleted: double - +percentMissed: double - +isCurrent: bool - +isFuture: bool - +phaseDuration: int + + + +iconName: String + +color: Color? - - - +List<Widget> buildSeparators() - +Widget build() + + + +Widget build() - - - - + + + + + - - - TaskBox + + + TimelineChild - - - +taskInstance: TaskInstance - +icon: Icon - +onCompleted: dynamic Function() + + + +child: Widget? + + + + + + +Widget build() - - - + + + - - - dynamic Function() + + + Widget - - - - + + + + - - - TaskOverview + + + AboutScreen - - - +subject: StudySubject? - +scheduleToday: List<TaskInstance>? - +interventionIcon: String? + + + +Widget build() - - - - + + + + - - - DashboardScreen + + + WelcomeScreen - - - +error: String? + + + +Widget build() - - - - + + + + - - - OverflowMenuItem + + + IFrameHelper - - - +name: String - +icon: IconData - +routeName: String? - +onTap: dynamic Function()? + + + +void postRouteFinished() + +void listen() - - - + + + - - - dynamic Function()? + + + TermsScreen - - - - - - - - - StudyFinishedPlaceholder - - + + + + + - - - <static>+space: SizedBox + + + LegalSection - - - +Widget build() + + + +title: String? + +description: String? + +icon: Icon? + +pdfUrl: String? + +pdfUrlLabel: String? + +acknowledgment: String? + +isChecked: bool? + +onChange: void Function(bool?)? - - - - - - - - SizedBox + + + +Widget build() - - - + + + - - - Settings + + + void Function(bool?)? - - - - - + + + + + - - - OptOutAlertDialog + + + Preview - - - +subject: StudySubject? + + + +queryParameters: Map<String, String>? + +appLanguage: AppLanguage + +selectedRoute: String? + +extra: String? + +study: Study? + +selectedStudyObjectId: String? + +subject: StudySubject? - - - +Widget build() + + + +bool hasRoute() + +void handleQueries() + +dynamic init() + +dynamic handleAuthorization() + +dynamic runCommands() + +String? getSelectedRoute() + +bool containsQuery() + +bool containsQueryPair() + +dynamic getStudySubject() + -dynamic _createFakeSubject() + +List<String> getInterventionIds() - - - - - + + + - - - DeleteAlertDialog + + + AppLanguage - - - +subject: StudySubject? + + + + + + + + + LoadingScreen - - - +Widget build() + + + +sessionString: String? + +queryParameters: Map<String, String>? diff --git a/docs/uml/app/lib/uml.svg b/docs/uml/app/lib/uml.svg index 032c49798..61037f978 100644 --- a/docs/uml/app/lib/uml.svg +++ b/docs/uml/app/lib/uml.svg @@ -1,238 +1,18 @@ - - [MyApp + + [ThemeConfig | - +queryParameters: Map<String, String>; - +appConfig: AppConfig? - ] - - [MyApp]o-[AppConfig] - - [Preview - | - +queryParameters: Map<String, String>?; - +appLanguage: AppLanguage; - +selectedRoute: String?; - +extra: String?; - +study: Study?; - +selectedStudyObjectId: String?; - +subject: StudySubject? - | - +bool hasRoute(); - +void handleQueries(); - +dynamic init(); - +dynamic handleAuthorization(); - +dynamic runCommands(); - +String? getSelectedRoute(); - +bool containsQuery(); - +bool containsQueryPair(); - +dynamic getStudySubject(); - -dynamic _createFakeSubject(); - +List<String> getInterventionIds() - ] - - [Preview]o-[AppLanguage] - [Preview]o-[Study] - [Preview]o-[StudySubject] - - [WelcomeScreen - | - +Widget build() - ] - - [TermsScreen - ] - - [LegalSection - | - +title: String?; - +description: String?; - +icon: Icon?; - +pdfUrl: String?; - +pdfUrlLabel: String?; - +acknowledgment: String?; - +isChecked: bool?; - +onChange: void Function(bool?)? - | - +Widget build() - ] - - [LegalSection]o-[Icon] - [LegalSection]o-[void Function(bool?)?] - - [IFrameHelper - | - +void postRouteFinished(); - +void listen() - ] - - [AboutScreen - | - +Widget build() - ] - - [LoadingScreen - | - +sessionString: String?; - +queryParameters: Map<String, String>? - ] - - [InterventionSelectionScreen - ] - - [JourneyOverviewScreen - ] - - [_JourneyOverviewScreen - | - +subject: StudySubject? - | - +dynamic getConsentAndNavigateToDashboard(); - +Widget build() - ] - - [_JourneyOverviewScreen]o-[StudySubject] - - [Timeline - | - +subject: StudySubject? - | - +Widget build() - ] - - [Timeline]o-[StudySubject] - - [InterventionTile - | - +title: String?; - +iconName: String; - +date: DateTime; - +color: Color?; - +isFirst: bool; - +isLast: bool - | - +Widget build() - ] - - [InterventionTile]o-[Color] - - [IconIndicator - | - +iconName: String; - +color: Color? - | - +Widget build() - ] - - [IconIndicator]o-[Color] - - [TimelineChild - | - +child: Widget? - | - +Widget build() - ] - - [TimelineChild]o-[<abstract>Widget] - - [StudySelectionScreen - | - +Widget build() - ] - - [InviteCodeDialog - ] - - [KickoffScreen - ] - - [_KickoffScreen - | - +subject: StudySubject?; - +ready: bool - | - -dynamic _storeUserStudy(); - -Widget _constructStatusIcon(); - -String _getStatusText(); - +Widget build() - ] - - [_KickoffScreen]o-[StudySubject] - - [ConsentScreen - ] - - [ConsentCard - | - +consent: ConsentItem?; - +index: int?; - +onTapped: dynamic Function(int); - +isChecked: bool? - | - +Widget build() - ] - - [ConsentCard]o-[ConsentItem] - [ConsentCard]o-[dynamic Function(int)] - - [ConsentElement - | - +title: String; - +descriptionText: String; - +acknowledgmentText: String; - +icon: IconData - ] - - [ConsentElement]o-[IconData] - - [EligibilityResult - | - +eligible: bool; - +firstFailed: EligibilityCriterion? - ] - - [EligibilityResult]o-[EligibilityCriterion] - - [EligibilityScreen - | - +study: Study? - | - <static>+MaterialPageRoute<EligibilityResult> routeFor() - ] - - [EligibilityScreen]o-[Study] - - [StudyOverviewScreen - ] - - [_StudyOverviewScreen - | - +study: Study? - | - +dynamic navigateToJourney(); - +dynamic navigateToEligibilityCheck(); - +Widget build() + <static>+SliderThemeData coloredSliderTheme() ] - [_StudyOverviewScreen]o-[Study] - - [StudyDetailsView + [ReportDetailsScreen | - +study: Study?; - +iconSize: double + +subject: StudySubject | + <static>+MaterialPageRoute<dynamic> routeFor(); +Widget build() ] - [StudyDetailsView]o-[Study] - - [OnboardingProgress - | - +stage: int; - +progress: double - | - -double _getProgressForStage(); - +Widget build() - ] + [ReportDetailsScreen]o-[StudySubject] [PerformanceDetailsScreen | @@ -297,6 +77,23 @@ +Widget build() ] + [GeneralDetailsSection + | + +Widget buildContent() + ] + + [<abstract>GenericSection]<:-[GeneralDetailsSection] + + [LinearRegressionSectionWidget + | + +section: LinearRegressionSection + | + +Widget build() + ] + + [LinearRegressionSectionWidget]o-[LinearRegressionSection] + [<abstract>ReportSectionWidget]<:-[LinearRegressionSectionWidget] + [AverageSectionWidget | +section: AverageSection; @@ -328,55 +125,29 @@ +intervention: String ] - [LinearRegressionSectionWidget - | - +section: LinearRegressionSection + [DisclaimerSection | - +Widget build() + +Widget buildContent() ] - [LinearRegressionSectionWidget]o-[LinearRegressionSection] - [<abstract>ReportSectionWidget]<:-[LinearRegressionSectionWidget] + [<abstract>GenericSection]<:-[DisclaimerSection] - [<abstract>ReportSectionWidget - | - +subject: StudySubject - ] - - [<abstract>ReportSectionWidget]o-[StudySubject] - - [<abstract>GenericSection + [ReportSectionContainer | - +subject: StudySubject?; + <static>+sectionTypes: Map<Type, ReportSectionWidget Function(ReportSection, StudySubject)>; + +section: ReportSection; + +subject: StudySubject; + +primary: bool; +onTap: void Function()? | - +Widget buildContent(); - +Widget build() - ] - - [<abstract>GenericSection]o-[StudySubject] - [<abstract>GenericSection]o-[void Function()?] - - [ReportHistoryScreen - | - +Widget build() - ] - - [ReportHistoryItem - | - +subject: StudySubject - | + +ReportSectionWidget buildContents(); + +List<Widget> buildPrimaryHeader(); +Widget build() ] - [ReportHistoryItem]o-[StudySubject] - - [GeneralDetailsSection - | - +Widget buildContent() - ] - - [<abstract>GenericSection]<:-[GeneralDetailsSection] + [ReportSectionContainer]o-[<abstract>ReportSection] + [ReportSectionContainer]o-[StudySubject] + [ReportSectionContainer]o-[void Function()?] [LegendWidget | @@ -403,39 +174,38 @@ [Legend]o-[Color] - [ReportDetailsScreen + [ReportHistoryScreen + | + +Widget build() + ] + + [ReportHistoryItem | +subject: StudySubject | - <static>+MaterialPageRoute<dynamic> routeFor(); +Widget build() ] - [ReportDetailsScreen]o-[StudySubject] + [ReportHistoryItem]o-[StudySubject] - [ReportSectionContainer - | - <static>+sectionTypes: Map<Type, ReportSectionWidget Function(ReportSection, StudySubject)>; - +section: ReportSection; - +subject: StudySubject; - +primary: bool; - +onTap: void Function()? + [<abstract>ReportSectionWidget | - +ReportSectionWidget buildContents(); - +List<Widget> buildPrimaryHeader(); - +Widget build() + +subject: StudySubject ] - [ReportSectionContainer]o-[<abstract>ReportSection] - [ReportSectionContainer]o-[StudySubject] - [ReportSectionContainer]o-[void Function()?] + [<abstract>ReportSectionWidget]o-[StudySubject] - [DisclaimerSection + [<abstract>GenericSection | - +Widget buildContent() + +subject: StudySubject?; + +onTap: void Function()? + | + +Widget buildContent(); + +Widget build() ] - [<abstract>GenericSection]<:-[DisclaimerSection] + [<abstract>GenericSection]o-[StudySubject] + [<abstract>GenericSection]o-[void Function()?] [TaskScreen | @@ -446,6 +216,15 @@ [TaskScreen]o-[TaskInstance] + [QuestionnaireTaskWidget + | + +task: QuestionnaireTask; + +completionPeriod: CompletionPeriod + ] + + [QuestionnaireTaskWidget]o-[QuestionnaireTask] + [QuestionnaireTaskWidget]o-[CompletionPeriod] + [CheckmarkTaskWidget | +task: CheckmarkTask?; @@ -455,14 +234,72 @@ [CheckmarkTaskWidget]o-[CheckmarkTask] [CheckmarkTaskWidget]o-[CompletionPeriod] - [QuestionnaireTaskWidget + [TaskOverview | - +task: QuestionnaireTask; - +completionPeriod: CompletionPeriod + +subject: StudySubject?; + +scheduleToday: List<TaskInstance>?; + +interventionIcon: String? ] - [QuestionnaireTaskWidget]o-[QuestionnaireTask] - [QuestionnaireTaskWidget]o-[CompletionPeriod] + [TaskOverview]o-[StudySubject] + + [TaskBox + | + +taskInstance: TaskInstance; + +icon: Icon; + +onCompleted: dynamic Function() + ] + + [TaskBox]o-[TaskInstance] + [TaskBox]o-[Icon] + [TaskBox]o-[dynamic Function()] + + [ProgressRow + | + +subject: StudySubject? + ] + + [ProgressRow]o-[StudySubject] + + [InterventionSegment + | + +intervention: Intervention; + +percentCompleted: double; + +percentMissed: double; + +isCurrent: bool; + +isFuture: bool; + +phaseDuration: int + | + +List<Widget> buildSeparators(); + +Widget build() + ] + + [InterventionSegment]o-[Intervention] + + [DashboardScreen + | + +error: String? + ] + + [OverflowMenuItem + | + +name: String; + +icon: IconData; + +routeName: String?; + +onTap: dynamic Function()? + ] + + [OverflowMenuItem]o-[IconData] + [OverflowMenuItem]o-[dynamic Function()?] + + [StudyFinishedPlaceholder + | + <static>+space: SizedBox + | + +Widget build() + ] + + [StudyFinishedPlaceholder]o-[SizedBox] [FAQ | @@ -529,413 +366,435 @@ [ContactItemType]o-[ContactItemType] [Enum]<:--[ContactItemType] - [ProgressRow + [Settings + ] + + [OptOutAlertDialog | +subject: StudySubject? + | + +Widget build() ] - [ProgressRow]o-[StudySubject] + [OptOutAlertDialog]o-[StudySubject] - [InterventionSegment + [DeleteAlertDialog | - +intervention: Intervention; - +percentCompleted: double; - +percentMissed: double; - +isCurrent: bool; - +isFuture: bool; - +phaseDuration: int + +subject: StudySubject? | - +List<Widget> buildSeparators(); +Widget build() ] - [InterventionSegment]o-[Intervention] + [DeleteAlertDialog]o-[StudySubject] - [TaskBox + [EligibilityResult | - +taskInstance: TaskInstance; - +icon: Icon; - +onCompleted: dynamic Function() + +eligible: bool; + +firstFailed: EligibilityCriterion? ] - [TaskBox]o-[TaskInstance] - [TaskBox]o-[Icon] - [TaskBox]o-[dynamic Function()] + [EligibilityResult]o-[EligibilityCriterion] - [TaskOverview + [EligibilityScreen | - +subject: StudySubject?; - +scheduleToday: List<TaskInstance>?; - +interventionIcon: String? + +study: Study? + | + <static>+MaterialPageRoute<EligibilityResult> routeFor() ] - [TaskOverview]o-[StudySubject] + [EligibilityScreen]o-[Study] - [DashboardScreen + [StudySelectionScreen | - +error: String? + +Widget build() ] - [OverflowMenuItem + [InviteCodeDialog + ] + + [StudyOverviewScreen + ] + + [_StudyOverviewScreen | - +name: String; - +icon: IconData; - +routeName: String?; - +onTap: dynamic Function()? + +study: Study? + | + +dynamic navigateToJourney(); + +dynamic navigateToEligibilityCheck(); + +Widget build() ] - [OverflowMenuItem]o-[IconData] - [OverflowMenuItem]o-[dynamic Function()?] + [_StudyOverviewScreen]o-[Study] - [StudyFinishedPlaceholder + [StudyDetailsView | - <static>+space: SizedBox + +study: Study?; + +iconSize: double | +Widget build() ] - [StudyFinishedPlaceholder]o-[SizedBox] + [StudyDetailsView]o-[Study] - [Settings + [KickoffScreen ] - [OptOutAlertDialog + [_KickoffScreen | - +subject: StudySubject? + +subject: StudySubject?; + +ready: bool | + -dynamic _storeUserStudy(); + -Widget _constructStatusIcon(); + -String _getStatusText(); +Widget build() ] - [OptOutAlertDialog]o-[StudySubject] + [_KickoffScreen]o-[StudySubject] - [DeleteAlertDialog + [OnboardingProgress | - +subject: StudySubject? + +stage: int; + +progress: double | + -double _getProgressForStage(); +Widget build() ] - [DeleteAlertDialog]o-[StudySubject] - - [ThemeConfig - | - <static>+SliderThemeData coloredSliderTheme() + [ConsentScreen ] - [Cache + [ConsentCard | - <static>+isSynchronizing: bool; - <static>+sharedPrefs: dynamic - | - <static>+dynamic storeSubject(); - <static>+dynamic loadSubject(); - <static>+dynamic storeAnalytics(); - <static>+dynamic loadAnalytics(); - <static>+dynamic delete(); - <static>+dynamic synchronize() - ] - - [StudyNotification + +consent: ConsentItem?; + +index: int?; + +onTapped: dynamic Function(int); + +isChecked: bool? | - +taskInstance: TaskInstance; - +date: DateTime + +Widget build() ] - [StudyNotification]o-[TaskInstance] + [ConsentCard]o-[ConsentItem] + [ConsentCard]o-[dynamic Function(int)] - [NotificationValidators + [ConsentElement | - +didNotificationLaunchApp: bool; - +wasNotificationActionHandled: bool; - +wasNotificationActionCompleted: bool + +title: String; + +descriptionText: String; + +acknowledgmentText: String; + +icon: IconData ] - [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() - ] + [ConsentElement]o-[IconData] - [StudyNotifications]o-[StudySubject] - [StudyNotifications]o-[FlutterLocalNotificationsPlugin] - [StudyNotifications]o-[<abstract>BuildContext] - [StudyNotifications]o-[StreamController] - [StudyNotifications]o-[NotificationValidators] + [InterventionSelectionScreen + ] - [ReceivedNotification - | - +id: int?; - +title: String?; - +body: String?; - +payload: String? + [JourneyOverviewScreen ] - [GroupedIterable + [_JourneyOverviewScreen | - +data: Map<K, Iterable<V>>; - +iterator: Iterator<MapEntry<K, Iterable<V>>> + +subject: StudySubject? | - +Iterable<MapEntry<K, R>> aggregate(); - +Iterable<MapEntry<K, R>> aggregateWithKey() + +dynamic getConsentAndNavigateToDashboard(); + +Widget build() ] - [Iterable]<:-[GroupedIterable] + [_JourneyOverviewScreen]o-[StudySubject] - [AppAnalytics + [Timeline | - <static>-_userEnabled: bool?; - <static>+keyAnalyticsUserEnable: String; - +context: BuildContext; - +subject: StudySubject?; - <static>+isUserEnabled: dynamic + +subject: StudySubject? | - <static>+dynamic init(); - <static>+dynamic start(); - <static>+void setEnabled(); - +dynamic initBasic(); - +void initAdvanced() + +Widget build() ] - [AppAnalytics]o-[<abstract>BuildContext] - [AppAnalytics]o-[StudySubject] + [Timeline]o-[StudySubject] - [CustomSlider + [InterventionTile | - +value: double?; - +minValue: double?; - +maxValue: double?; - +minorTick: int?; - +onChanged: dynamic Function(double)?; - +onChangeEnd: dynamic Function(double)?; - +activeColor: Color?; - +inactiveColor: Color?; - +minColor: Color?; - +maxColor: Color?; - +thumbColor: Color?; - +isColored: bool; - +labelValuePrecision: int; - +tickValuePrecision: int; - +linearStep: bool; - +steps: AnnotatedScaleQuestion? + +title: String?; + +iconName: String; + +date: DateTime; + +color: Color?; + +isFirst: bool; + +isLast: bool | +Widget build() ] - [CustomSlider]o-[dynamic Function(double)?] - [CustomSlider]o-[Color] - [CustomSlider]o-[AnnotatedScaleQuestion] + [InterventionTile]o-[Color] - [CustomTrackShape + [IconIndicator | - +Rect getPreferredRect() + +iconName: String; + +color: Color? + | + +Widget build() ] - [RoundedRectSliderTrackShape]<:-[CustomTrackShape] + [IconIndicator]o-[Color] - [QuestionHeader + [TimelineChild | - +prompt: String?; - +subtitle: String?; - +rationale: String? + +child: Widget? | - -List<Widget> _buildSubtitle(); - -List<Widget> _buildRationaleButton(); +Widget build() ] - [<abstract>QuestionWidget - | - +subtitle: String? - ] + [TimelineChild]o-[<abstract>Widget] - [VisualAnalogueQuestionWidget + [AboutScreen | - +question: VisualAnalogueQuestion; - +onDone: dynamic Function(Answer<dynamic>)? + +Widget build() ] - [VisualAnalogueQuestionWidget]o-[VisualAnalogueQuestion] - [VisualAnalogueQuestionWidget]o-[dynamic Function(Answer<dynamic>)?] - [<abstract>QuestionWidget]<:-[VisualAnalogueQuestionWidget] - - [AnnotatedScaleQuestionWidget + [WelcomeScreen | - +question: AnnotatedScaleQuestion; - +onDone: dynamic Function(Answer<dynamic>)? + +Widget build() ] - [AnnotatedScaleQuestionWidget]o-[AnnotatedScaleQuestion] - [AnnotatedScaleQuestionWidget]o-[dynamic Function(Answer<dynamic>)?] - [<abstract>QuestionWidget]<:-[AnnotatedScaleQuestionWidget] - - [ScaleQuestionWidget + [IFrameHelper | - +question: ScaleQuestion; - +onDone: dynamic Function(Answer<dynamic>)? + +void postRouteFinished(); + +void listen() ] - [ScaleQuestionWidget]o-[ScaleQuestion] - [ScaleQuestionWidget]o-[dynamic Function(Answer<dynamic>)?] - [<abstract>QuestionWidget]<:-[ScaleQuestionWidget] - - [BooleanQuestionWidget - | - +question: BooleanQuestion; - +onDone: dynamic Function(Answer<dynamic>)? + [TermsScreen ] - [BooleanQuestionWidget]o-[BooleanQuestion] - [BooleanQuestionWidget]o-[dynamic Function(Answer<dynamic>)?] - [<abstract>QuestionWidget]<:-[BooleanQuestionWidget] - - [ChoiceQuestionWidget + [LegalSection | - +question: ChoiceQuestion; - +onDone: dynamic Function(Answer<dynamic>); - +multiSelectionText: String; - +subtitle: String? + +title: String?; + +description: String?; + +icon: Icon?; + +pdfUrl: String?; + +pdfUrlLabel: String?; + +acknowledgment: String?; + +isChecked: bool?; + +onChange: void Function(bool?)? + | + +Widget build() ] - [ChoiceQuestionWidget]o-[ChoiceQuestion] - [ChoiceQuestionWidget]o-[dynamic Function(Answer<dynamic>)] - [<abstract>QuestionWidget]<:-[ChoiceQuestionWidget] + [LegalSection]o-[Icon] + [LegalSection]o-[void Function(bool?)?] - [QuestionContainer + [Preview | - +onDone: dynamic Function(Answer<dynamic>, int); - +question: Question<dynamic>; - +index: int + +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() ] - [QuestionContainer]o-[dynamic Function(Answer<dynamic>, int)] - [QuestionContainer]o-[<abstract>Question] + [Preview]o-[AppLanguage] + [Preview]o-[Study] + [Preview]o-[StudySubject] - [QuestionnaireWidget + [LoadingScreen | - +title: String?; - +header: String?; - +footer: String?; - +questions: List<Question<dynamic>> + +sessionString: String?; + +queryParameters: Map<String, String>? ] - [HtmlTextBox + [InterventionCard | - +text: String? + +intervention: Intervention; + +selected: bool; + +showCheckbox: bool; + +showTasks: bool; + +showDescription: bool; + +onTap: dynamic Function()? | +Widget build() ] - [SelectableButton + [InterventionCard]o-[Intervention] + [InterventionCard]o-[dynamic Function()?] + + [InterventionCardTitle | - +child: Widget; + +intervention: Intervention?; +selected: bool; + +showCheckbox: bool; + +showDescriptionButton: bool; +onTap: dynamic Function()? | - -Color _getFillColor(); - -Color _getTextColor(); +Widget build() ] - [SelectableButton]o-[<abstract>Widget] - [SelectableButton]o-[dynamic Function()?] + [InterventionCardTitle]o-[Intervention] + [InterventionCardTitle]o-[dynamic Function()?] - [BottomOnboardingNavigation + [InterventionCardDescription | - +onBack: void Function()?; - +onNext: void Function()?; - +backLabel: String?; - +nextLabel: String?; - +hideNext: bool; - +nextIcon: Icon?; - +backIcon: Icon?; - +progress: Widget? + +intervention: Intervention | +Widget build() ] - [BottomOnboardingNavigation]o-[void Function()?] - [BottomOnboardingNavigation]o-[Icon] - [BottomOnboardingNavigation]o-[<abstract>Widget] + [InterventionCardDescription]o-[Intervention] - [InterventionCard + [_TaskList | - +intervention: Intervention; - +selected: bool; - +showCheckbox: bool; - +showTasks: bool; - +showDescription: bool; - +onTap: dynamic Function()? + +tasks: List<InterventionTask> | + +String scheduleString(); +Widget build() ] - [InterventionCard]o-[Intervention] - [InterventionCard]o-[dynamic Function()?] - - [InterventionCardTitle + [RoundCheckbox | - +intervention: Intervention?; - +selected: bool; - +showCheckbox: bool; - +showDescriptionButton: bool; - +onTap: dynamic Function()? + +onChanged: dynamic Function(bool)?; + +value: bool? | +Widget build() ] - [InterventionCardTitle]o-[Intervention] - [InterventionCardTitle]o-[dynamic Function()?] + [RoundCheckbox]o-[dynamic Function(bool)?] - [InterventionCardDescription + [AnnotatedScaleQuestionWidget | - +intervention: Intervention + +question: AnnotatedScaleQuestion; + +onDone: dynamic Function(Answer<dynamic>)? + ] + + [AnnotatedScaleQuestionWidget]o-[AnnotatedScaleQuestion] + [AnnotatedScaleQuestionWidget]o-[dynamic Function(Answer<dynamic>)?] + [<abstract>QuestionWidget]<:-[AnnotatedScaleQuestionWidget] + + [VisualAnalogueQuestionWidget | - +Widget build() + +question: VisualAnalogueQuestion; + +onDone: dynamic Function(Answer<dynamic>)? ] - [InterventionCardDescription]o-[Intervention] + [VisualAnalogueQuestionWidget]o-[VisualAnalogueQuestion] + [VisualAnalogueQuestionWidget]o-[dynamic Function(Answer<dynamic>)?] + [<abstract>QuestionWidget]<:-[VisualAnalogueQuestionWidget] - [_TaskList + [CustomSlider | - +tasks: List<InterventionTask> + +value: double?; + +minValue: double?; + +maxValue: double?; + +minorTick: int?; + +onChanged: dynamic Function(double)?; + +onChangeEnd: dynamic Function(double)?; + +activeColor: Color?; + +inactiveColor: Color?; + +minColor: Color?; + +maxColor: Color?; + +thumbColor: Color?; + +isColored: bool; + +labelValuePrecision: int; + +tickValuePrecision: int; + +linearStep: bool; + +steps: AnnotatedScaleQuestion? | - +String scheduleString(); +Widget build() ] - [HtmlText + [CustomSlider]o-[dynamic Function(double)?] + [CustomSlider]o-[Color] + [CustomSlider]o-[AnnotatedScaleQuestion] + + [CustomTrackShape | - +text: String?; - +style: TextStyle? + +Rect getPreferredRect() + ] + + [RoundedRectSliderTrackShape]<:-[CustomTrackShape] + + [ChoiceQuestionWidget + | + +question: ChoiceQuestion; + +onDone: dynamic Function(Answer<dynamic>); + +multiSelectionText: String; + +subtitle: String? + ] + + [ChoiceQuestionWidget]o-[ChoiceQuestion] + [ChoiceQuestionWidget]o-[dynamic Function(Answer<dynamic>)] + [<abstract>QuestionWidget]<:-[ChoiceQuestionWidget] + + [ScaleQuestionWidget + | + +question: ScaleQuestion; + +onDone: dynamic Function(Answer<dynamic>)? + ] + + [ScaleQuestionWidget]o-[ScaleQuestion] + [ScaleQuestionWidget]o-[dynamic Function(Answer<dynamic>)?] + [<abstract>QuestionWidget]<:-[ScaleQuestionWidget] + + [QuestionHeader | + +prompt: String?; + +subtitle: String?; + +rationale: String? + | + -List<Widget> _buildSubtitle(); + -List<Widget> _buildRationaleButton(); +Widget build() ] - [HtmlText]o-[TextStyle] + [<abstract>QuestionWidget + | + +subtitle: String? + ] - [RoundCheckbox + [QuestionnaireWidget | - +onChanged: dynamic Function(bool)?; - +value: bool? + +title: String?; + +header: String?; + +footer: String?; + +questions: List<Question<dynamic>> + ] + + [HtmlTextBox + | + +text: String? | +Widget build() ] - [RoundCheckbox]o-[dynamic Function(bool)?] + [BooleanQuestionWidget + | + +question: BooleanQuestion; + +onDone: dynamic Function(Answer<dynamic>)? + ] + + [BooleanQuestionWidget]o-[BooleanQuestion] + [BooleanQuestionWidget]o-[dynamic Function(Answer<dynamic>)?] + [<abstract>QuestionWidget]<:-[BooleanQuestionWidget] + + [QuestionContainer + | + +onDone: dynamic Function(Answer<dynamic>, int); + +question: Question<dynamic>; + +index: int + ] + + [QuestionContainer]o-[dynamic Function(Answer<dynamic>, int)] + [QuestionContainer]o-[<abstract>Question] [StudyTile | @@ -951,6 +810,56 @@ [StudyTile]o-[dynamic Function()?] [StudyTile]o-[<abstract>EdgeInsetsGeometry] + [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() + ] + + [HtmlText]o-[TextStyle] + + [SelectableButton + | + +child: Widget; + +selected: bool; + +onTap: dynamic Function()? + | + -Color _getFillColor(); + -Color _getTextColor(); + +Widget build() + ] + + [SelectableButton]o-[<abstract>Widget] + [SelectableButton]o-[dynamic Function()?] + + [MyApp + | + +queryParameters: Map<String, String>; + +appConfig: AppConfig? + ] + + [MyApp]o-[AppConfig] + [Routes | <static>+loading: String; @@ -977,1176 +886,595 @@ <static>+Route<dynamic>? generateRoute() ] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + [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() + ] + + [StudyNotification + | + +taskInstance: TaskInstance; + +date: DateTime + ] + + [StudyNotification]o-[TaskInstance] + + [NotificationValidators + | + +didNotificationLaunchApp: bool; + +wasNotificationActionHandled: bool; + +wasNotificationActionCompleted: bool + ] + + [StudyNotifications + | + +subject: StudySubject?; + +flutterLocalNotificationsPlugin: FlutterLocalNotificationsPlugin; + +context: BuildContext; + +didReceiveLocalNotificationStream: StreamController<ReceivedNotification>; + +selectNotificationStream: StreamController<String?>; + <static>+validator: NotificationValidators; + <static>+debug: bool; + <static>+scheduledNotificationsDebug: String? + | + <static>+dynamic create(); + -dynamic _isAndroidPermissionGranted(); + -dynamic _requestPermissions(); + -void _configureDidReceiveLocalNotificationSubject(); + -void _configureSelectNotificationSubject(); + -void _initNotificationsPlugin(); + +dynamic handleNotificationResponse() + ] + + [StudyNotifications]o-[StudySubject] + [StudyNotifications]o-[FlutterLocalNotificationsPlugin] + [StudyNotifications]o-[<abstract>BuildContext] + [StudyNotifications]o-[StreamController] + [StudyNotifications]o-[NotificationValidators] + + [ReceivedNotification + | + +id: int?; + +title: String?; + +body: String?; + +payload: String? + ] + + [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] + + + + + + + + + + - + - + - + - + - + - + - + - + - + - + - + - - - + - + - - - + + + + + - + - - - + + + - + - + + + + + - + - + - + - + - + - - - + - + - + - + - + - + - + - + - + - + - + - + - - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + + - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - + - + - + - + - + - + - + - + - + - + - - - + - + - + - + - - - + - + - + - + - - - + - + - + - + - - - + - + - + - + - - - + - + - + - + - - - + - + - + - + - + - + - + - + - + + + - + - + - + - + + + - + - + - + - + - + - + + + - + - + - + - + + + - + - + - + - + + + - + - + - + - + + + - + - - - - - - - - MyApp - - - - - - +queryParameters: Map<String, String> - +appConfig: AppConfig? - - - + + + - - - - - - - AppConfig - - - + + + - - - - - - - - - Preview - - - - - - +queryParameters: Map<String, String>? - +appLanguage: AppLanguage - +selectedRoute: String? - +extra: String? - +study: Study? - +selectedStudyObjectId: String? - +subject: StudySubject? - - - - - - +bool hasRoute() - +void handleQueries() - +dynamic init() - +dynamic handleAuthorization() - +dynamic runCommands() - +String? getSelectedRoute() - +bool containsQuery() - +bool containsQueryPair() - +dynamic getStudySubject() - -dynamic _createFakeSubject() - +List<String> getInterventionIds() - - - + + + - - - - - - - AppLanguage - - - + + + - - - - - - - Study - - - + + + - - - - - - - StudySubject - - - + + + - - - - - - - - WelcomeScreen - - - - - - +Widget build() - - - + + + - - - - - - - TermsScreen - - - + + + - - - - - - - - - LegalSection - - - - - - +title: String? - +description: String? - +icon: Icon? - +pdfUrl: String? - +pdfUrlLabel: String? - +acknowledgment: String? - +isChecked: bool? - +onChange: void Function(bool?)? - - - - - - +Widget build() - - - + + + - - - - - - - Icon - - - + + + - - - - - - - void Function(bool?)? - - - + + + - - - - - - - - IFrameHelper - - - - - - +void postRouteFinished() - +void listen() - - - - - - - - - - - - AboutScreen - - - - - - +Widget build() - - - - - - - - - - - - LoadingScreen - - - - - - +sessionString: String? - +queryParameters: Map<String, String>? - - - - - - - - - - - InterventionSelectionScreen - - - - - - - - - - - JourneyOverviewScreen - - - - - - - - - - - - - _JourneyOverviewScreen - - - - - - +subject: StudySubject? - - - - - - +dynamic getConsentAndNavigateToDashboard() - +Widget build() - - - - - - - - - - - - - Timeline - - - - - - +subject: StudySubject? - - - - - - +Widget build() - - - - - - - - - - - - - InterventionTile - - - - - - +title: String? - +iconName: String - +date: DateTime - +color: Color? - +isFirst: bool - +isLast: bool - - - - - - +Widget build() - - - - - - - - - - - Color - - - - - - - - - - - - - IconIndicator - - - - - - +iconName: String - +color: Color? - - - - - - +Widget build() - - - - - - - - - - - - - TimelineChild - - - - - - +child: Widget? - - - - - - +Widget build() - - - - - - - - - - - Widget - - - - - - - - - - - - StudySelectionScreen - - - - - - +Widget build() - - - - - - - - - - - InviteCodeDialog - - - - - - - - - - - KickoffScreen - - - - - - - - - - - - - _KickoffScreen - - - - - - +subject: StudySubject? - +ready: bool - - - - - - -dynamic _storeUserStudy() - -Widget _constructStatusIcon() - -String _getStatusText() - +Widget build() - - - - - - - - - - - ConsentScreen - - - - - - - - - - - - - ConsentCard - - - - - - +consent: ConsentItem? - +index: int? - +onTapped: dynamic Function(int) - +isChecked: bool? - - - - - - +Widget build() - - - - - - - - - - - ConsentItem - - - - - - - - - - - dynamic Function(int) - - - - - - - - - - - - ConsentElement - - - - - - +title: String - +descriptionText: String - +acknowledgmentText: String - +icon: IconData - - - + + + - - - - - - - IconData - - - + + + - - - - - - - - EligibilityResult - - - - - - +eligible: bool - +firstFailed: EligibilityCriterion? - - - + + + - - - - - - - EligibilityCriterion - - - + + + - - - - - - - - - EligibilityScreen - - - - - - +study: Study? - - - - - - <static>+MaterialPageRoute<EligibilityResult> routeFor() - - - + + + - - - - - - - StudyOverviewScreen - - - + + + - - - - - - - - - _StudyOverviewScreen - - + + + + + + + + + + - - - +study: Study? + + + ThemeConfig - - - +dynamic navigateToJourney() - +dynamic navigateToEligibilityCheck() - +Widget build() + + + <static>+SliderThemeData coloredSliderTheme() - - - - - + + + + + - - - StudyDetailsView + + + ReportDetailsScreen - - - +study: Study? - +iconSize: double + + + +subject: StudySubject - - - +Widget build() + + + <static>+MaterialPageRoute<dynamic> routeFor() + +Widget build() - - - - - - - - - OnboardingProgress - - - - - - +stage: int - +progress: double - - + + + - - - -double _getProgressForStage() - +Widget build() + + + StudySubject - - - + + + - + PerformanceDetailsScreen - + +reportSubject: StudySubject? - + <static>+MaterialPageRoute<dynamic> routeFor() +Widget build() @@ -2156,24 +1484,24 @@ - - - + + + - + InterventionPerformanceBar - + +intervention: Intervention +subject: StudySubject? - + +Widget build() @@ -2182,9 +1510,9 @@ - + - + Intervention @@ -2193,24 +1521,24 @@ - - - + + + - + ObservationPerformanceBar - + +observation: Observation +subject: StudySubject? - + +Widget build() @@ -2219,9 +1547,9 @@ - + - + Observation @@ -2230,17 +1558,17 @@ - - - + + + - + PerformanceBar - + +task: Task +completed: int @@ -2248,7 +1576,7 @@ - + +Widget build() @@ -2257,9 +1585,9 @@ - + - + Task @@ -2268,24 +1596,24 @@ - - - + + + - + PerformanceSection - + +minimumRatio: double +maximum: double - + +Widget buildContent() +String getPowerLevelDescription() @@ -2296,24 +1624,24 @@ - - - + + + - + GenericSection - + +subject: StudySubject? +onTap: void Function()? - + +Widget buildContent() +Widget build() @@ -2321,19 +1649,91 @@ + + + + + + + + GeneralDetailsSection + + + + + + +Widget buildContent() + + + + + + + + + + + + + LinearRegressionSectionWidget + + + + + + +section: LinearRegressionSection + + + + + + +Widget build() + + + + + + + + + + + LinearRegressionSection + + + + + + + + + + + + ReportSectionWidget + + + + + + +subject: StudySubject + + + + - - - + + + - + AverageSectionWidget - + +section: AverageSection +titlePos: List<int> @@ -2341,7 +1741,7 @@ - + +Widget build() +Widget getLegend() @@ -2361,45 +1761,27 @@ - + - + AverageSection - - - - - - - - ReportSectionWidget - - - - - - +subject: StudySubject - - - - - - + + - + DiagramDatum - + +x: num +value: num @@ -2409,65 +1791,170 @@ - - - - - + + + + - - - LinearRegressionSectionWidget + + + DisclaimerSection - - - +section: LinearRegressionSection + + + +Widget buildContent() + + + + + + + + + + + + + ReportSectionContainer + + + + + + <static>+sectionTypes: Map<Type, ReportSectionWidget Function(ReportSection, StudySubject)> + +section: ReportSection + +subject: StudySubject + +primary: bool + +onTap: void Function()? + + + + + + +ReportSectionWidget buildContents() + +List<Widget> buildPrimaryHeader() + +Widget build() + + + + + + + + + + + ReportSection + + + + + + + + + + + void Function()? + + + + + + + + + + + + + LegendWidget + + + + + + +name: String + +color: Color + + + + + + +Widget build() + + + + + + + + + + + Color + + + + + + + + + + + + + LegendsListWidget + + + + + + +legends: List<Legend> - - - +Widget build() + + + +Widget build() - - - + + + + - - - LinearRegressionSection + + + Legend - - - - - - - - void Function()? + + + +name: String + +color: Color - - + + - + ReportHistoryScreen - + +Widget build() @@ -2476,322 +1963,356 @@ - - - + + + - + ReportHistoryItem - + +subject: StudySubject - + +Widget build() - - - - + + + + + - - - GeneralDetailsSection + + + TaskScreen - - - +Widget buildContent() + + + +taskInstance: TaskInstance + + + + + + <static>+MaterialPageRoute<bool> routeFor() - - - - - + + + - - - LegendWidget + + + TaskInstance - - - +name: String - +color: Color + + + + + + + + + QuestionnaireTaskWidget - - - +Widget build() + + + +task: QuestionnaireTask + +completionPeriod: CompletionPeriod - - - - - + + + - - - LegendsListWidget + + + QuestionnaireTask - - - +legends: List<Legend> - - + + + + - - - +Widget build() + + + CompletionPeriod - - - - + + + + - - - Legend + + + CheckmarkTaskWidget - - - +name: String - +color: Color + + + +task: CheckmarkTask? + +completionPeriod: CompletionPeriod? - - - - - + + + - - - ReportDetailsScreen + + + CheckmarkTask - - - +subject: StudySubject + + + + + + + + + TaskOverview - - - <static>+MaterialPageRoute<dynamic> routeFor() - +Widget build() + + + +subject: StudySubject? + +scheduleToday: List<TaskInstance>? + +interventionIcon: String? - - - - - + + + + - - - ReportSectionContainer + + + TaskBox - - - <static>+sectionTypes: Map<Type, ReportSectionWidget Function(ReportSection, StudySubject)> - +section: ReportSection - +subject: StudySubject - +primary: bool - +onTap: void Function()? + + + +taskInstance: TaskInstance + +icon: Icon + +onCompleted: dynamic Function() - - - +ReportSectionWidget buildContents() - +List<Widget> buildPrimaryHeader() - +Widget build() + + + + + + + + Icon - - - + + + - - - ReportSection + + + dynamic Function() - - - - + + + + - - - DisclaimerSection + + + ProgressRow - - - +Widget buildContent() + + + +subject: StudySubject? - - - - - + + + + + - - - TaskScreen + + + InterventionSegment - - - +taskInstance: TaskInstance + + + +intervention: Intervention + +percentCompleted: double + +percentMissed: double + +isCurrent: bool + +isFuture: bool + +phaseDuration: int - - - <static>+MaterialPageRoute<bool> routeFor() + + + +List<Widget> buildSeparators() + +Widget build() - - - + + + + - - - TaskInstance + + + DashboardScreen + + + + + + +error: String? - - - - + + + + - - - CheckmarkTaskWidget + + + OverflowMenuItem - - - +task: CheckmarkTask? - +completionPeriod: CompletionPeriod? + + + +name: String + +icon: IconData + +routeName: String? + +onTap: dynamic Function()? - - - + + + - - - CheckmarkTask + + + IconData - - - + + + - - - CompletionPeriod + + + dynamic Function()? - - - - + + + + + - - - QuestionnaireTaskWidget + + + StudyFinishedPlaceholder - - - +task: QuestionnaireTask - +completionPeriod: CompletionPeriod + + + <static>+space: SizedBox + + + + + + +Widget build() - - - + + + - - - QuestionnaireTask + + + SizedBox - - + + - + FAQ - + +Widget build() @@ -2800,16 +2321,16 @@ - - + + - + Entry - + +title: String +children: List<Entry> @@ -2819,23 +2340,23 @@ - - - + + + - + EntryItem - + +entry: Entry - + -Widget _buildTiles() +Widget build() @@ -2845,9 +2366,9 @@ - + - + ContactScreen @@ -2856,17 +2377,17 @@ - - - + + + - + ContactWidget - + +contact: Contact? +title: String @@ -2875,7 +2396,7 @@ - + +Widget build() @@ -2884,9 +2405,9 @@ - + - + Contact @@ -2895,17 +2416,17 @@ - - - + + + - + ContactItem - + +iconData: IconData +itemName: String @@ -2915,7 +2436,7 @@ - + +dynamic launchContact() +Widget build() @@ -2925,16 +2446,16 @@ - - + + - + ContactItemType - + +index: int <static>+values: List<ContactItemType> @@ -2947,645 +2468,929 @@ - + - + Enum - - - - + + + - - - ProgressRow + + + Settings - - - +subject: StudySubject? + + + + + + + + + + OptOutAlertDialog + + + + + + +subject: StudySubject? + + + + + + +Widget build() - - - - - + + + + + - - - InterventionSegment + + + DeleteAlertDialog - - - +intervention: Intervention - +percentCompleted: double - +percentMissed: double - +isCurrent: bool - +isFuture: bool - +phaseDuration: int + + + +subject: StudySubject? - - - +List<Widget> buildSeparators() - +Widget build() + + + +Widget build() - - - - + + + + - - - TaskBox + + + EligibilityResult + + + + + + +eligible: bool + +firstFailed: EligibilityCriterion? + + + + + + + + + + + EligibilityCriterion + + + + + + + + + + + + + EligibilityScreen + + + + + + +study: Study? + + + + + + <static>+MaterialPageRoute<EligibilityResult> routeFor() + + + + + + + + + + + Study + + + + + + + + + + + + StudySelectionScreen + + + + + + +Widget build() + + + + + + + + + + + InviteCodeDialog + + + + + + + + + + + StudyOverviewScreen + + + + + + + + + + + + + _StudyOverviewScreen + + + + + + +study: Study? + + + + + + +dynamic navigateToJourney() + +dynamic navigateToEligibilityCheck() + +Widget build() + + + + + + + + + + + + + StudyDetailsView + + + + + + +study: Study? + +iconSize: double + + + + + + +Widget build() + + + + + + + + + + + KickoffScreen + + + + + + + + + + + + + _KickoffScreen + + + + + + +subject: StudySubject? + +ready: bool + + + + + + -dynamic _storeUserStudy() + -Widget _constructStatusIcon() + -String _getStatusText() + +Widget build() + + + + + + + + + + + + + OnboardingProgress + + + + + + +stage: int + +progress: double + + + + + + -double _getProgressForStage() + +Widget build() + + + + + + + + + + + ConsentScreen + + + + + + + + + + + + + ConsentCard + + + + + + +consent: ConsentItem? + +index: int? + +onTapped: dynamic Function(int) + +isChecked: bool? + + + + + + +Widget build() - - - +taskInstance: TaskInstance - +icon: Icon - +onCompleted: dynamic Function() + + + + + + + + ConsentItem - - - + + + - - - dynamic Function() + + + dynamic Function(int) - - - - + + + + - - - TaskOverview + + + ConsentElement - - - +subject: StudySubject? - +scheduleToday: List<TaskInstance>? - +interventionIcon: String? + + + +title: String + +descriptionText: String + +acknowledgmentText: String + +icon: IconData - - - - + + + - - - DashboardScreen + + + InterventionSelectionScreen - - - +error: String? + + + + + + + + JourneyOverviewScreen - - - - + + + + + - - - OverflowMenuItem + + + _JourneyOverviewScreen - - - +name: String - +icon: IconData - +routeName: String? - +onTap: dynamic Function()? + + + +subject: StudySubject? - - - - - - - - dynamic Function()? + + + +dynamic getConsentAndNavigateToDashboard() + +Widget build() - - - - - + + + + + - - - StudyFinishedPlaceholder + + + Timeline - - - <static>+space: SizedBox + + + +subject: StudySubject? - - - +Widget build() + + + +Widget build() - - - + + + + + - - - SizedBox + + + InterventionTile - - - - + + + +title: String? + +iconName: String + +date: DateTime + +color: Color? + +isFirst: bool + +isLast: bool + + - - - Settings + + + +Widget build() - - - - - + + + + + - - - OptOutAlertDialog + + + IconIndicator - - - +subject: StudySubject? + + + +iconName: String + +color: Color? - - - +Widget build() + + + +Widget build() - - - - - + + + + + - - - DeleteAlertDialog + + + TimelineChild - - - +subject: StudySubject? + + + +child: Widget? - - - +Widget build() + + + +Widget build() - - - - + + + - - - ThemeConfig + + + Widget - - - <static>+SliderThemeData coloredSliderTheme() + + + + + + + + + AboutScreen - - - - - - - - - - Cache + + + +Widget build() - - - <static>+isSynchronizing: bool - <static>+sharedPrefs: dynamic + + + + + + + + + WelcomeScreen - - - <static>+dynamic storeSubject() - <static>+dynamic loadSubject() - <static>+dynamic storeAnalytics() - <static>+dynamic loadAnalytics() - <static>+dynamic delete() - <static>+dynamic synchronize() + + + +Widget build() - - - - + + + + - - - StudyNotification + + + IFrameHelper - - - +taskInstance: TaskInstance - +date: DateTime + + + +void postRouteFinished() + +void listen() - - - - - - - - NotificationValidators - - + + + - - - +didNotificationLaunchApp: bool - +wasNotificationActionHandled: bool - +wasNotificationActionCompleted: bool + + + TermsScreen - - - - - + + + + + - - - StudyNotifications + + + LegalSection - - - +subject: StudySubject? - +flutterLocalNotificationsPlugin: FlutterLocalNotificationsPlugin - +context: BuildContext - +didReceiveLocalNotificationStream: StreamController<ReceivedNotification> - +selectNotificationStream: StreamController<String?> - <static>+validator: NotificationValidators - <static>+debug: bool - <static>+scheduledNotificationsDebug: String? + + + +title: String? + +description: String? + +icon: Icon? + +pdfUrl: String? + +pdfUrlLabel: String? + +acknowledgment: String? + +isChecked: bool? + +onChange: void Function(bool?)? - - - <static>+dynamic create() - -dynamic _isAndroidPermissionGranted() - -dynamic _requestPermissions() - -void _configureDidReceiveLocalNotificationSubject() - -void _configureSelectNotificationSubject() - -void _initNotificationsPlugin() - +dynamic handleNotificationResponse() + + + +Widget build() - - - + + + - - - FlutterLocalNotificationsPlugin + + + void Function(bool?)? - - - + + + + + - - - BuildContext + + + 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() - - - + + + - - - StreamController + + + AppLanguage - - - - + + + + - - - ReceivedNotification + + + LoadingScreen - - - +id: int? - +title: String? - +body: String? - +payload: String? + + + +sessionString: String? + +queryParameters: Map<String, String>? - - - - - + + + + + - - - GroupedIterable + + + InterventionCard - - - +data: Map<K, Iterable<V>> - +iterator: Iterator<MapEntry<K, Iterable<V>>> + + + +intervention: Intervention + +selected: bool + +showCheckbox: bool + +showTasks: bool + +showDescription: bool + +onTap: dynamic Function()? - - - +Iterable<MapEntry<K, R>> aggregate() - +Iterable<MapEntry<K, R>> aggregateWithKey() + + + +Widget build() - - - + + + + + - - - Iterable + + + InterventionCardTitle + + + + + + +intervention: Intervention? + +selected: bool + +showCheckbox: bool + +showDescriptionButton: bool + +onTap: dynamic Function()? + + + + + + +Widget build() - - - - - + + + + + - - - AppAnalytics + + + InterventionCardDescription - - - <static>-_userEnabled: bool? - <static>+keyAnalyticsUserEnable: String - +context: BuildContext - +subject: StudySubject? - <static>+isUserEnabled: dynamic + + + +intervention: Intervention - - - <static>+dynamic init() - <static>+dynamic start() - <static>+void setEnabled() - +dynamic initBasic() - +void initAdvanced() + + + +Widget build() - - - - - + + + + + - - - CustomSlider + + + _TaskList - - - +value: double? - +minValue: double? - +maxValue: double? - +minorTick: int? - +onChanged: dynamic Function(double)? - +onChangeEnd: dynamic Function(double)? - +activeColor: Color? - +inactiveColor: Color? - +minColor: Color? - +maxColor: Color? - +thumbColor: Color? - +isColored: bool - +labelValuePrecision: int - +tickValuePrecision: int - +linearStep: bool - +steps: AnnotatedScaleQuestion? + + + +tasks: List<InterventionTask> - - - +Widget build() + + + +String scheduleString() + +Widget build() - - - + + + + + - - - dynamic Function(double)? + + + RoundCheckbox - - - - + + + +onChanged: dynamic Function(bool)? + +value: bool? + + - - - AnnotatedScaleQuestion + + + +Widget build() - - - - + + + - - - CustomTrackShape + + + dynamic Function(bool)? - - - +Rect getPreferredRect() + + + + + + + + + AnnotatedScaleQuestionWidget - - - - - - - - RoundedRectSliderTrackShape + + + +question: AnnotatedScaleQuestion + +onDone: dynamic Function(Answer<dynamic>)? - - - - - + + + - - - QuestionHeader + + + AnnotatedScaleQuestion - - - +prompt: String? - +subtitle: String? - +rationale: String? - - + + + + - - - -List<Widget> _buildSubtitle() - -List<Widget> _buildRationaleButton() - +Widget build() + + + dynamic Function(Answer<dynamic>)? - - + + - + QuestionWidget - + +subtitle: String? @@ -3594,136 +3399,126 @@ - - + + - + VisualAnalogueQuestionWidget - - - +question: VisualAnalogueQuestion - +onDone: dynamic Function(Answer<dynamic>)? - - - - - - - - - - - VisualAnalogueQuestion - - - - - - - - - - - dynamic Function(Answer<dynamic>)? + + + +question: VisualAnalogueQuestion + +onDone: dynamic Function(Answer<dynamic>)? - - - - + + + - - - AnnotatedScaleQuestionWidget + + + VisualAnalogueQuestion - - - +question: AnnotatedScaleQuestion - +onDone: dynamic Function(Answer<dynamic>)? + + + + + + + + + + CustomSlider - - - - - - - - - ScaleQuestionWidget + + + +value: double? + +minValue: double? + +maxValue: double? + +minorTick: int? + +onChanged: dynamic Function(double)? + +onChangeEnd: dynamic Function(double)? + +activeColor: Color? + +inactiveColor: Color? + +minColor: Color? + +maxColor: Color? + +thumbColor: Color? + +isColored: bool + +labelValuePrecision: int + +tickValuePrecision: int + +linearStep: bool + +steps: AnnotatedScaleQuestion? - - - +question: ScaleQuestion - +onDone: dynamic Function(Answer<dynamic>)? + + + +Widget build() - - - + + + - - - ScaleQuestion + + + dynamic Function(double)? - - - - + + + + - - - BooleanQuestionWidget + + + CustomTrackShape - - - +question: BooleanQuestion - +onDone: dynamic Function(Answer<dynamic>)? + + + +Rect getPreferredRect() - - - + + + - - - BooleanQuestion + + + RoundedRectSliderTrackShape - - + + - + ChoiceQuestionWidget - + +question: ChoiceQuestion +onDone: dynamic Function(Answer<dynamic>) @@ -3735,9 +3530,9 @@ - + - + ChoiceQuestion @@ -3746,69 +3541,86 @@ - + - + dynamic Function(Answer<dynamic>) - - - - + + + + - - - QuestionContainer + + + ScaleQuestionWidget - - - +onDone: dynamic Function(Answer<dynamic>, int) - +question: Question<dynamic> - +index: int + + + +question: ScaleQuestion + +onDone: dynamic Function(Answer<dynamic>)? - - - + + + - - - dynamic Function(Answer<dynamic>, int) + + + ScaleQuestion - - - + + + + + - - - Question + + + QuestionHeader + + + + + + +prompt: String? + +subtitle: String? + +rationale: String? + + + + + + -List<Widget> _buildSubtitle() + -List<Widget> _buildRationaleButton() + +Widget build() - - + + - + QuestionnaireWidget - + +title: String? +header: String? @@ -3820,220 +3632,193 @@ - - - + + + - + HtmlTextBox - + +text: String? - + +Widget build() - - - - - - - - - SelectableButton - - + + + + - - - +child: Widget - +selected: bool - +onTap: dynamic Function()? + + + BooleanQuestionWidget - - - -Color _getFillColor() - -Color _getTextColor() - +Widget build() + + + +question: BooleanQuestion + +onDone: dynamic Function(Answer<dynamic>)? - - - - - + + + - - - BottomOnboardingNavigation + + + BooleanQuestion - - - +onBack: void Function()? - +onNext: void Function()? - +backLabel: String? - +nextLabel: String? - +hideNext: bool - +nextIcon: Icon? - +backIcon: Icon? - +progress: Widget? + + + + + + + + + QuestionContainer - - - +Widget build() + + + +onDone: dynamic Function(Answer<dynamic>, int) + +question: Question<dynamic> + +index: int - - - - - + + + - - - InterventionCard + + + dynamic Function(Answer<dynamic>, int) - - - +intervention: Intervention - +selected: bool - +showCheckbox: bool - +showTasks: bool - +showDescription: bool - +onTap: dynamic Function()? - - + + + + - - - +Widget build() + + + Question - - - - - + + + + + - - - InterventionCardTitle + + + StudyTile - - - +intervention: Intervention? - +selected: bool - +showCheckbox: bool - +showDescriptionButton: bool - +onTap: dynamic Function()? + + + +title: String? + +description: String? + +iconName: String + +onTap: dynamic Function()? + +contentPadding: EdgeInsetsGeometry - - - +Widget build() + + + +Widget build() - - - - - - - - - InterventionCardDescription - - - - - - +intervention: Intervention - - + + + - - - +Widget build() + + + EdgeInsetsGeometry - - - - - + + + + + - - - _TaskList + + + BottomOnboardingNavigation - - - +tasks: List<InterventionTask> + + + +onBack: void Function()? + +onNext: void Function()? + +backLabel: String? + +nextLabel: String? + +hideNext: bool + +nextIcon: Icon? + +backIcon: Icon? + +progress: Widget? - - - +String scheduleString() - +Widget build() + + + +Widget build() - - - + + + - + HtmlText - + +text: String? +style: TextStyle? - + +Widget build() @@ -4042,105 +3827,87 @@ - + - + TextStyle - - - - - - - - - RoundCheckbox - - + + + + + - - - +onChanged: dynamic Function(bool)? - +value: bool? + + + SelectableButton - - - +Widget build() + + + +child: Widget + +selected: bool + +onTap: dynamic Function()? - - - - - - - - dynamic Function(bool)? + + + -Color _getFillColor() + -Color _getTextColor() + +Widget build() - - - - - - - - - StudyTile - - + + + + - - - +title: String? - +description: String? - +iconName: String - +onTap: dynamic Function()? - +contentPadding: EdgeInsetsGeometry + + + MyApp - - - +Widget build() + + + +queryParameters: Map<String, String> + +appConfig: AppConfig? - - - + + + - - - EdgeInsetsGeometry + + + AppConfig - - - + + + - + Routes - + <static>+loading: String <static>+preview: String @@ -4164,7 +3931,7 @@ - + <static>+Route<dynamic> unknownRoute() <static>+Route<dynamic>? generateRoute() @@ -4172,6 +3939,239 @@ + + + + + + + + + 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() + + + + + + + + + + + + StudyNotification + + + + + + +taskInstance: TaskInstance + +date: DateTime + + + + + + + + + + + + NotificationValidators + + + + + + +didNotificationLaunchApp: bool + +wasNotificationActionHandled: bool + +wasNotificationActionCompleted: bool + + + + + + + + + + + + + StudyNotifications + + + + + + +subject: StudySubject? + +flutterLocalNotificationsPlugin: FlutterLocalNotificationsPlugin + +context: BuildContext + +didReceiveLocalNotificationStream: StreamController<ReceivedNotification> + +selectNotificationStream: StreamController<String?> + <static>+validator: NotificationValidators + <static>+debug: bool + <static>+scheduledNotificationsDebug: String? + + + + + + <static>+dynamic create() + -dynamic _isAndroidPermissionGranted() + -dynamic _requestPermissions() + -void _configureDidReceiveLocalNotificationSubject() + -void _configureSelectNotificationSubject() + -void _initNotificationsPlugin() + +dynamic handleNotificationResponse() + + + + + + + + + + + FlutterLocalNotificationsPlugin + + + + + + + + + + + BuildContext + + + + + + + + + + + StreamController + + + + + + + + + + + + ReceivedNotification + + + + + + +id: int? + +title: String? + +body: String? + +payload: String? + + + + + + + + + + + + + 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() + + + + + + + + + + + + + GroupedIterable + + + + + + +data: Map<K, Iterable<V>> + +iterator: Iterator<MapEntry<K, Iterable<V>>> + + + + + + +Iterable<MapEntry<K, R>> aggregate() + +Iterable<MapEntry<K, R>> aggregateWithKey() + + + + + + + + + + + Iterable + + + + diff --git a/docs/uml/app/lib/util/uml.svg b/docs/uml/app/lib/util/uml.svg index 10b59fa58..87fe8afac 100644 --- a/docs/uml/app/lib/util/uml.svg +++ b/docs/uml/app/lib/util/uml.svg @@ -1,22 +1,17 @@ - - [AppAnalytics + + [Cache | - <static>-_userEnabled: bool?; - <static>+keyAnalyticsUserEnable: String; - +context: BuildContext; - +subject: StudySubject?; - <static>+isUserEnabled: dynamic + <static>+isSynchronizing: bool; + <static>+sharedPrefs: dynamic | - <static>+dynamic init(); - <static>+dynamic start(); - <static>+void setEnabled(); - +dynamic initBasic(); - +void initAdvanced() + <static>+dynamic storeSubject(); + <static>+dynamic loadSubject(); + <static>+dynamic storeAnalytics(); + <static>+dynamic loadAnalytics(); + <static>+dynamic delete(); + <static>+dynamic synchronize() ] - [AppAnalytics]o-[<abstract>BuildContext] - [AppAnalytics]o-[StudySubject] - [StudyNotification | +taskInstance: TaskInstance; @@ -25,17 +20,6 @@ [StudyNotification]o-[TaskInstance] - [GroupedIterable - | - +data: Map<K, Iterable<V>>; - +iterator: Iterator<MapEntry<K, Iterable<V>>> - | - +Iterable<MapEntry<K, R>> aggregate(); - +Iterable<MapEntry<K, R>> aggregateWithKey() - ] - - [Iterable]<:-[GroupedIterable] - [NotificationValidators | +didNotificationLaunchApp: bool; @@ -77,128 +61,120 @@ +payload: String? ] - [Cache + [AppAnalytics | - <static>+isSynchronizing: bool; - <static>+sharedPrefs: dynamic + <static>-_userEnabled: bool?; + <static>+keyAnalyticsUserEnable: String; + +context: BuildContext; + +subject: StudySubject?; + <static>+isUserEnabled: dynamic | - <static>+dynamic storeSubject(); - <static>+dynamic loadSubject(); - <static>+dynamic storeAnalytics(); - <static>+dynamic loadAnalytics(); - <static>+dynamic delete(); - <static>+dynamic synchronize() + <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] + - + - + - - + + - + - + - + - + - + - - - + - + - + - + - + - + - + - + - + - + - - - - - - - - - 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() + + + Cache - - - - - - - - BuildContext + + + <static>+isSynchronizing: bool + <static>+sharedPrefs: dynamic - - - - - - - - StudySubject + + + <static>+dynamic storeSubject() + <static>+dynamic loadSubject() + <static>+dynamic storeAnalytics() + <static>+dynamic loadAnalytics() + <static>+dynamic delete() + <static>+dynamic synchronize() - - + + - + StudyNotification - + +taskInstance: TaskInstance +date: DateTime @@ -208,65 +184,27 @@ - + - + TaskInstance - - - - - - - - - GroupedIterable - - - - - - +data: Map<K, Iterable<V>> - +iterator: Iterator<MapEntry<K, Iterable<V>>> - - - - - - +Iterable<MapEntry<K, R>> aggregate() - +Iterable<MapEntry<K, R>> aggregateWithKey() - - - - - - - - - - - Iterable - - - - - - + + - + NotificationValidators - + +didNotificationLaunchApp: bool +wasNotificationActionHandled: bool @@ -277,17 +215,17 @@ - - - + + + - + StudyNotifications - + +subject: StudySubject? +flutterLocalNotificationsPlugin: FlutterLocalNotificationsPlugin @@ -300,7 +238,7 @@ - + <static>+dynamic create() -dynamic _isAndroidPermissionGranted() @@ -313,22 +251,44 @@ + + + + + + + StudySubject + + + + - + - + FlutterLocalNotificationsPlugin + + + + + + + BuildContext + + + + - + - + StreamController @@ -337,16 +297,16 @@ - - + + - + ReceivedNotification - + +id: int? +title: String? @@ -356,33 +316,73 @@ - - - - - + + + + + - - - Cache + + + AppAnalytics - - - <static>+isSynchronizing: bool - <static>+sharedPrefs: dynamic + + + <static>-_userEnabled: bool? + <static>+keyAnalyticsUserEnable: String + +context: BuildContext + +subject: StudySubject? + <static>+isUserEnabled: dynamic - - - <static>+dynamic storeSubject() - <static>+dynamic loadSubject() - <static>+dynamic storeAnalytics() - <static>+dynamic loadAnalytics() - <static>+dynamic delete() - <static>+dynamic synchronize() + + + <static>+dynamic init() + <static>+dynamic start() + <static>+void setEnabled() + +dynamic initBasic() + +void initAdvanced() + + + + + + + + + + + + + GroupedIterable + + + + + + +data: Map<K, Iterable<V>> + +iterator: Iterator<MapEntry<K, Iterable<V>>> + + + + + + +Iterable<MapEntry<K, R>> aggregate() + +Iterable<MapEntry<K, R>> aggregateWithKey() + + + + + + + + + + + Iterable diff --git a/docs/uml/core/lib/src/models/expressions/uml.svg b/docs/uml/core/lib/src/models/expressions/uml.svg index 24cad1b05..32b5afd1e 100644 --- a/docs/uml/core/lib/src/models/expressions/uml.svg +++ b/docs/uml/core/lib/src/models/expressions/uml.svg @@ -1,216 +1,11 @@ - - [<abstract>ValueExpression - | - <static>+expressionType: String; - +target: String? - | - +bool checkValue(); - +bool? evaluate() - ] - - [<abstract>Expression]<:-[<abstract>ValueExpression] - - [BooleanExpression - | - <static>+expressionType: String - | - +Map<String, dynamic> toJson(); - +bool checkValue() - ] - - [<abstract>ValueExpression]<:-[BooleanExpression] - - [ChoiceExpression - | - <static>+expressionType: String; - +choices: Set<dynamic> - | - +Map<String, dynamic> toJson(); - +bool checkValue() - ] - - [<abstract>ValueExpression]<:-[ChoiceExpression] - - [NotExpression - | - <static>+expressionType: String; - +expression: Expression - | - +Map<String, dynamic> toJson(); - +bool? evaluate() - ] - - [NotExpression]o-[<abstract>Expression] - [<abstract>Expression]<:-[NotExpression] - - [<abstract>Expression - | - <static>+expressionTypes: Map<String, Expression Function(Map<String, dynamic>)>; - <static>+keyType: String; - +type: String? - | - +Map<String, dynamic> toJson(); - +String toString(); - +bool? evaluate() - ] - - - + + - + - - - - - - - - - - - - - - - - - - - - - - ValueExpression - - - - - - <static>+expressionType: String - +target: String? - - - - - - +bool checkValue() - +bool? evaluate() - - - - - - - - - - - - - Expression - - - - - - <static>+expressionTypes: Map<String, Expression Function(Map<String, dynamic>)> - <static>+keyType: String - +type: String? - - - - - - +Map<String, dynamic> toJson() - +String toString() - +bool? evaluate() - - - - - - - - - - - - - BooleanExpression - - - - - - <static>+expressionType: String - - - - - - +Map<String, dynamic> toJson() - +bool checkValue() - - - - - - - - - - - - - ChoiceExpression - - - - - - <static>+expressionType: String - +choices: Set<dynamic> - - - - - - +Map<String, dynamic> toJson() - +bool checkValue() - - - - - - - - - - - - - NotExpression - - - - - - <static>+expressionType: String - +expression: Expression - - - - - - +Map<String, dynamic> toJson() - +bool? evaluate() - - - - - + diff --git a/docs/uml/core/lib/src/models/observations/tasks/uml.svg b/docs/uml/core/lib/src/models/observations/tasks/uml.svg index 46eb3f1f2..32b5afd1e 100644 --- a/docs/uml/core/lib/src/models/observations/tasks/uml.svg +++ b/docs/uml/core/lib/src/models/observations/tasks/uml.svg @@ -1,84 +1,11 @@ - - [QuestionnaireTask - | - <static>+taskType: String; - +questions: StudyUQuestionnaire - | - +Map<String, dynamic> toJson(); - +Map<DateTime, T> extractPropertyResults(); - +Map<String, Type> getAvailableProperties(); - +String? getHumanReadablePropertyName() - ] - - [QuestionnaireTask]o-[StudyUQuestionnaire] - [<abstract>Observation]<:-[QuestionnaireTask] - - - + + - + - - - - - - - - - - - - - - - - QuestionnaireTask - - - - - - <static>+taskType: String - +questions: StudyUQuestionnaire - - - - - - +Map<String, dynamic> toJson() - +Map<DateTime, T> extractPropertyResults() - +Map<String, Type> getAvailableProperties() - +String? getHumanReadablePropertyName() - - - - - - - - - - - StudyUQuestionnaire - - - - - - - - - - - Observation - - - - - + diff --git a/docs/uml/core/lib/src/models/observations/uml.svg b/docs/uml/core/lib/src/models/observations/uml.svg index b2144a014..32b5afd1e 100644 --- a/docs/uml/core/lib/src/models/observations/uml.svg +++ b/docs/uml/core/lib/src/models/observations/uml.svg @@ -1,111 +1,11 @@ - - [QuestionnaireTask - | - <static>+taskType: String; - +questions: StudyUQuestionnaire - | - +Map<String, dynamic> toJson(); - +Map<DateTime, T> extractPropertyResults(); - +Map<String, Type> getAvailableProperties(); - +String? getHumanReadablePropertyName() - ] - - [QuestionnaireTask]o-[StudyUQuestionnaire] - [<abstract>Observation]<:-[QuestionnaireTask] - - [<abstract>Observation - | - <static>+taskTypes: Map<String, Observation Function(Map<String, dynamic>)> - ] - - [<abstract>Task]<:-[<abstract>Observation] - - - + + - + - - - - - - - - - - - - - - - - - - QuestionnaireTask - - - - - - <static>+taskType: String - +questions: StudyUQuestionnaire - - - - - - +Map<String, dynamic> toJson() - +Map<DateTime, T> extractPropertyResults() - +Map<String, Type> getAvailableProperties() - +String? getHumanReadablePropertyName() - - - - - - - - - - - StudyUQuestionnaire - - - - - - - - - - - - Observation - - - - - - <static>+taskTypes: Map<String, Observation Function(Map<String, dynamic>)> - - - - - - - - - - - Task - - - - - + diff --git a/docs/uml/core/lib/src/models/tables/uml.svg b/docs/uml/core/lib/src/models/tables/uml.svg index b88c99600..32b5afd1e 100644 --- a/docs/uml/core/lib/src/models/tables/uml.svg +++ b/docs/uml/core/lib/src/models/tables/uml.svg @@ -1,931 +1,11 @@ - - [Study - | - <static>+tableName: String; - <static>+baselineID: String; - +id: String; - +title: String?; - +description: String?; - +userId: String; - +participation: Participation; - +resultSharing: ResultSharing; - +contact: Contact; - +iconName: String; - +published: bool; - +questionnaire: StudyUQuestionnaire; - +eligibilityCriteria: List<EligibilityCriterion>; - +consent: List<ConsentItem>; - +interventions: List<Intervention>; - +observations: List<Observation>; - +schedule: StudySchedule; - +reportSpecification: ReportSpecification; - +results: List<StudyResult>; - +collaboratorEmails: List<String>; - +registryPublished: bool; - +participantCount: int; - +endedCount: int; - +activeSubjectCount: int; - +missedDays: List<int>; - +repo: Repo?; - +invites: List<StudyInvite>?; - +participants: List<StudySubject>?; - +participantsProgress: List<SubjectProgress>?; - +createdAt: DateTime?; - +primaryKeys: Map<String, dynamic>; - +hasEligibilityCheck: bool; - +hasConsentCheck: bool; - +totalMissedDays: int; - +percentageMissedDays: double; - +status: StudyStatus; - +isDraft: bool; - +isRunning: bool; - +isClosed: bool - | - +Map<String, dynamic> toJson(); - <static>+dynamic getResearcherDashboardStudies(); - <static>+dynamic publishedPublicStudies(); - +bool isOwner(); - +bool isEditor(); - +bool canEdit(); - <static>+dynamic fetchResultsCSVTable(); - +bool isReadonly(); - +String toString(); - +int compareTo() - ] - - [Study]o-[Participation] - [Study]o-[ResultSharing] - [Study]o-[Contact] - [Study]o-[StudyUQuestionnaire] - [Study]o-[StudySchedule] - [Study]o-[ReportSpecification] - [Study]o-[Repo] - [Study]o-[StudyStatus] - [<abstract>SupabaseObjectFunctions]<:-[Study] - [Comparable]<:--[Study] - - [StudyStatus - | - +index: int; - <static>+values: List<StudyStatus>; - <static>+draft: StudyStatus; - <static>+running: StudyStatus; - <static>+closed: StudyStatus - ] - - [StudyStatus]o-[StudyStatus] - [Enum]<:--[StudyStatus] - - [Participation - | - +index: int; - <static>+values: List<Participation>; - <static>+open: Participation; - <static>+invite: Participation - ] - - [Participation]o-[Participation] - [Enum]<:--[Participation] - - [ResultSharing - | - +index: int; - <static>+values: List<ResultSharing>; - <static>+public: ResultSharing; - <static>+private: ResultSharing; - <static>+organization: ResultSharing - ] - - [ResultSharing]o-[ResultSharing] - [Enum]<:--[ResultSharing] - - [AppConfig - | - <static>+tableName: String; - +id: String; - +contact: Contact; - +appPrivacy: Map<String, String>; - +appTerms: Map<String, String>; - +designerPrivacy: Map<String, String>; - +designerTerms: Map<String, String>; - +imprint: Map<String, String>; - +analytics: StudyUAnalytics; - +primaryKeys: Map<String, dynamic> - | - +Map<String, dynamic> toJson(); - <static>+dynamic getAppConfig(); - <static>+dynamic getAppContact() - ] - - [AppConfig]o-[Contact] - [AppConfig]o-[StudyUAnalytics] - [<abstract>SupabaseObjectFunctions]<:-[AppConfig] - - [SubjectProgress - | - <static>+tableName: String; - +completedAt: DateTime?; - +subjectId: String; - +interventionId: String; - +taskId: String; - +resultType: String; - +result: Result<dynamic>; - +startedAt: DateTime?; - +primaryKeys: Map<String, dynamic>; - +hashCode: int - | - +Map<String, dynamic> toJson(); - +SubjectProgress setStartDateBackBy(); - +bool ==() - ] - - [SubjectProgress]o-[Result] - [<abstract>SupabaseObjectFunctions]<:-[SubjectProgress] - - [StudyInvite - | - <static>+tableName: String; - +code: String; - +studyId: String; - +preselectedInterventionIds: List<String>?; - +primaryKeys: Map<String, dynamic> - | - +Map<String, dynamic> toJson() - ] - - [<abstract>SupabaseObjectFunctions]<:-[StudyInvite] - - [StudyUUser - | - <static>+tableName: String; - +id: String; - +email: String; - +preferences: Preferences; - +primaryKeys: Map<String, dynamic> - | - +Map<String, dynamic> toJson() - ] - - [StudyUUser]o-[Preferences] - [<abstract>SupabaseObjectFunctions]<:-[StudyUUser] - - [Preferences - | - +language: String; - +pinnedStudies: Set<String> - | - +Map<String, dynamic> toJson() - ] - - [Repo - | - <static>+tableName: String; - +projectId: String; - +userId: String; - +studyId: String; - +provider: GitProvider; - +webUrl: String?; - +gitUrl: String?; - +primaryKeys: Map<String, dynamic> - | - +Map<String, dynamic> toJson() - ] - - [Repo]o-[GitProvider] - [<abstract>SupabaseObjectFunctions]<:-[Repo] - - [GitProvider - | - +index: int; - <static>+values: List<GitProvider>; - <static>+gitlab: GitProvider - ] - - [GitProvider]o-[GitProvider] - [Enum]<:--[GitProvider] - - [StudySubject - | - <static>+tableName: String; - -_controller: StreamController<StudySubject>; - +id: String; - +studyId: String; - +userId: String; - +startedAt: DateTime?; - +selectedInterventionIds: List<String>; - +inviteCode: String?; - +isDeleted: bool; - +study: Study; - +progress: List<SubjectProgress>; - +primaryKeys: Map<String, dynamic>; - +interventionOrder: List<String>; - +selectedInterventions: List<Intervention>; - +daysPerIntervention: int; - +minimumStudyLengthCompleted: bool; - +completedStudy: bool; - +onSave: Stream<StudySubject>; - +hashCode: int - | - +Map<String, dynamic> toJson(); - +dynamic addResult(); - +Map<DateTime, List<SubjectProgress>> getResultsByDate(); - +DateTime endDate(); - +int getDayOfStudyFor(); - +int getInterventionIndexForDate(); - +Intervention? getInterventionForDate(); - +List<Intervention> getInterventionsInOrder(); - +DateTime startOfPhase(); - +DateTime dayAfterEndOfPhase(); - +List<SubjectProgress> resultsFor(); - +int completedForPhase(); - +int daysLeftForPhase(); - +double percentCompletedForPhase(); - +double percentMissedForPhase(); - +List<SubjectProgress> getTaskProgressForDay(); - +bool completedTaskInstanceForDay(); - +bool completedTaskForDay(); - +int completedTasksFor(); - +bool allTasksCompletedFor(); - +int totalTaskCountFor(); - +List<TaskInstance> scheduleFor(); - +dynamic setStartDateBackBy(); - +dynamic save(); - +Map<String, dynamic> toFullJson(); - +dynamic deleteProgress(); - +dynamic delete(); - +dynamic softDelete(); - <static>+dynamic getStudyHistory(); - +bool ==(); - +String toString() - ] - - [StudySubject]o-[StreamController] - [StudySubject]o-[Study] - [StudySubject]o-[Stream] - [<abstract>SupabaseObjectFunctions]<:-[StudySubject] - - - + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Study - - - - - - <static>+tableName: String - <static>+baselineID: String - +id: String - +title: String? - +description: String? - +userId: String - +participation: Participation - +resultSharing: ResultSharing - +contact: Contact - +iconName: String - +published: bool - +questionnaire: StudyUQuestionnaire - +eligibilityCriteria: List<EligibilityCriterion> - +consent: List<ConsentItem> - +interventions: List<Intervention> - +observations: List<Observation> - +schedule: StudySchedule - +reportSpecification: ReportSpecification - +results: List<StudyResult> - +collaboratorEmails: List<String> - +registryPublished: bool - +participantCount: int - +endedCount: int - +activeSubjectCount: int - +missedDays: List<int> - +repo: Repo? - +invites: List<StudyInvite>? - +participants: List<StudySubject>? - +participantsProgress: List<SubjectProgress>? - +createdAt: DateTime? - +primaryKeys: Map<String, dynamic> - +hasEligibilityCheck: bool - +hasConsentCheck: bool - +totalMissedDays: int - +percentageMissedDays: double - +status: StudyStatus - +isDraft: bool - +isRunning: bool - +isClosed: bool - - - - - - +Map<String, dynamic> toJson() - <static>+dynamic getResearcherDashboardStudies() - <static>+dynamic publishedPublicStudies() - +bool isOwner() - +bool isEditor() - +bool canEdit() - <static>+dynamic fetchResultsCSVTable() - +bool isReadonly() - +String toString() - +int compareTo() - - - - - - - - - - - - Participation - - - - - - +index: int - <static>+values: List<Participation> - <static>+open: Participation - <static>+invite: Participation - - - - - - - - - - - - ResultSharing - - - - - - +index: int - <static>+values: List<ResultSharing> - <static>+public: ResultSharing - <static>+private: ResultSharing - <static>+organization: ResultSharing - - - - - - - - - - - Contact - - - - - - - - - - - StudyUQuestionnaire - - - - - - - - - - - StudySchedule - - - - - - - - - - - ReportSpecification - - - - - - - - - - - - - Repo - - - - - - <static>+tableName: String - +projectId: String - +userId: String - +studyId: String - +provider: GitProvider - +webUrl: String? - +gitUrl: String? - +primaryKeys: Map<String, dynamic> - - - - - - +Map<String, dynamic> toJson() - - - - - - - - - - - - StudyStatus - - - - - - +index: int - <static>+values: List<StudyStatus> - <static>+draft: StudyStatus - <static>+running: StudyStatus - <static>+closed: StudyStatus - - - - - - - - - - - SupabaseObjectFunctions - - - - - - - - - - - Comparable - - - - - - - - - - - Enum - - - - - - - - - - - - - AppConfig - - - - - - <static>+tableName: String - +id: String - +contact: Contact - +appPrivacy: Map<String, String> - +appTerms: Map<String, String> - +designerPrivacy: Map<String, String> - +designerTerms: Map<String, String> - +imprint: Map<String, String> - +analytics: StudyUAnalytics - +primaryKeys: Map<String, dynamic> - - - - - - +Map<String, dynamic> toJson() - <static>+dynamic getAppConfig() - <static>+dynamic getAppContact() - - - - - - - - - - - StudyUAnalytics - - - - - - - - - - - - - SubjectProgress - - - - - - <static>+tableName: String - +completedAt: DateTime? - +subjectId: String - +interventionId: String - +taskId: String - +resultType: String - +result: Result<dynamic> - +startedAt: DateTime? - +primaryKeys: Map<String, dynamic> - +hashCode: int - - - - - - +Map<String, dynamic> toJson() - +SubjectProgress setStartDateBackBy() - +bool ==() - - - - - - - - - - - Result - - - - - - - - - - - - - StudyInvite - - - - - - <static>+tableName: String - +code: String - +studyId: String - +preselectedInterventionIds: List<String>? - +primaryKeys: Map<String, dynamic> - - - - - - +Map<String, dynamic> toJson() - - - - - - - - - - - - - StudyUUser - - - - - - <static>+tableName: String - +id: String - +email: String - +preferences: Preferences - +primaryKeys: Map<String, dynamic> - - - - - - +Map<String, dynamic> toJson() - - - - - - - - - - - - - Preferences - - - - - - +language: String - +pinnedStudies: Set<String> - - - - - - +Map<String, dynamic> toJson() - - - - - - - - - - - - GitProvider - - - - - - +index: int - <static>+values: List<GitProvider> - <static>+gitlab: GitProvider - - - - - - - - - - - - - StudySubject - - - - - - <static>+tableName: String - -_controller: StreamController<StudySubject> - +id: String - +studyId: String - +userId: String - +startedAt: DateTime? - +selectedInterventionIds: List<String> - +inviteCode: String? - +isDeleted: bool - +study: Study - +progress: List<SubjectProgress> - +primaryKeys: Map<String, dynamic> - +interventionOrder: List<String> - +selectedInterventions: List<Intervention> - +daysPerIntervention: int - +minimumStudyLengthCompleted: bool - +completedStudy: bool - +onSave: Stream<StudySubject> - +hashCode: int - - - - - - +Map<String, dynamic> toJson() - +dynamic addResult() - +Map<DateTime, List<SubjectProgress>> getResultsByDate() - +DateTime endDate() - +int getDayOfStudyFor() - +int getInterventionIndexForDate() - +Intervention? getInterventionForDate() - +List<Intervention> getInterventionsInOrder() - +DateTime startOfPhase() - +DateTime dayAfterEndOfPhase() - +List<SubjectProgress> resultsFor() - +int completedForPhase() - +int daysLeftForPhase() - +double percentCompletedForPhase() - +double percentMissedForPhase() - +List<SubjectProgress> getTaskProgressForDay() - +bool completedTaskInstanceForDay() - +bool completedTaskForDay() - +int completedTasksFor() - +bool allTasksCompletedFor() - +int totalTaskCountFor() - +List<TaskInstance> scheduleFor() - +dynamic setStartDateBackBy() - +dynamic save() - +Map<String, dynamic> toFullJson() - +dynamic deleteProgress() - +dynamic delete() - +dynamic softDelete() - <static>+dynamic getStudyHistory() - +bool ==() - +String toString() - - - - - - - - - - - StreamController - - - - - - - - - - - Stream - - - - - + diff --git a/docs/uml/core/lib/src/models/tasks/uml.svg b/docs/uml/core/lib/src/models/tasks/uml.svg index 3494ae9af..32b5afd1e 100644 --- a/docs/uml/core/lib/src/models/tasks/uml.svg +++ b/docs/uml/core/lib/src/models/tasks/uml.svg @@ -1,242 +1,11 @@ - - [Schedule - | - +completionPeriods: List<CompletionPeriod>; - +reminders: List<StudyUTimeOfDay> - | - +Map<String, dynamic> toJson(); - +String toString() - ] - - [CompletionPeriod - | - +id: String; - +unlockTime: StudyUTimeOfDay; - +lockTime: StudyUTimeOfDay - | - +Map<String, dynamic> toJson(); - +String formatted(); - +String toString(); - +bool contains() - ] - - [CompletionPeriod]o-[StudyUTimeOfDay] - - [StudyUTimeOfDay - | - +hour: int; - +minute: int - | - +String toJson(); - +String toString(); - +bool earlierThan() - ] - - [TaskInstance - | - +task: Task; - +id: String; - +completionPeriod: CompletionPeriod - | - <static>-Task _taskFromStudy(); - <static>-Task _taskFromSubject() - ] - - [TaskInstance]o-[<abstract>Task] - [TaskInstance]o-[CompletionPeriod] - - [<abstract>Task - | - <static>+keyType: String; - +type: String; - +id: String; - +title: String?; - +header: String?; - +footer: String?; - +schedule: Schedule - | - +Map<String, dynamic> toJson(); - +String toString(); - +Map<DateTime, T> extractPropertyResults(); - +Map<String, Type> getAvailableProperties(); - +String? getHumanReadablePropertyName() - ] - - [<abstract>Task]o-[Schedule] - - - + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - Schedule - - - - - - +completionPeriods: List<CompletionPeriod> - +reminders: List<StudyUTimeOfDay> - - - - - - +Map<String, dynamic> toJson() - +String toString() - - - - - - - - - - - - - CompletionPeriod - - - - - - +id: String - +unlockTime: StudyUTimeOfDay - +lockTime: StudyUTimeOfDay - - - - - - +Map<String, dynamic> toJson() - +String formatted() - +String toString() - +bool contains() - - - - - - - - - - - - - StudyUTimeOfDay - - - - - - +hour: int - +minute: int - - - - - - +String toJson() - +String toString() - +bool earlierThan() - - - - - - - - - - - - - TaskInstance - - - - - - +task: Task - +id: String - +completionPeriod: CompletionPeriod - - - - - - <static>-Task _taskFromStudy() - <static>-Task _taskFromSubject() - - - - - - - - - - - - - Task - - - - - - <static>+keyType: String - +type: String - +id: String - +title: String? - +header: String? - +footer: String? - +schedule: Schedule - - - - - - +Map<String, dynamic> toJson() - +String toString() - +Map<DateTime, T> extractPropertyResults() - +Map<String, Type> getAvailableProperties() - +String? getHumanReadablePropertyName() - - - - - + diff --git a/docs/uml/core/lib/src/models/uml.svg b/docs/uml/core/lib/src/models/uml.svg index 095b3594d..32b5afd1e 100644 --- a/docs/uml/core/lib/src/models/uml.svg +++ b/docs/uml/core/lib/src/models/uml.svg @@ -1,2777 +1,11 @@ - - [DataReference - | - +task: String; - +property: String - | - +Map<String, dynamic> toJson(); - +String toString(); - +Map<DateTime, T> retrieveFromResults() - ] - - [AverageSection - | - <static>+sectionType: String; - +aggregate: TemporalAggregation?; - +resultProperty: DataReference<num>? - | - +Map<String, dynamic> toJson() - ] - - [AverageSection]o-[TemporalAggregation] - [AverageSection]o-[DataReference] - [<abstract>ReportSection]<:-[AverageSection] - - [LinearRegressionSection - | - <static>+sectionType: String; - +resultProperty: DataReference<num>?; - +alpha: double; - +improvement: ImprovementDirection? - | - +Map<String, dynamic> toJson() - ] - - [LinearRegressionSection]o-[DataReference] - [LinearRegressionSection]o-[ImprovementDirection] - [<abstract>ReportSection]<:-[LinearRegressionSection] - - [ImprovementDirection - | - +index: int; - <static>+values: List<ImprovementDirection>; - <static>+positive: ImprovementDirection; - <static>+negative: ImprovementDirection - ] - - [ImprovementDirection]o-[ImprovementDirection] - [Enum]<:--[ImprovementDirection] - - [TemporalAggregation - | - +index: int; - <static>+values: List<TemporalAggregation>; - <static>+day: TemporalAggregation; - <static>+phase: TemporalAggregation; - <static>+intervention: TemporalAggregation - ] - - [TemporalAggregation]o-[TemporalAggregation] - [Enum]<:--[TemporalAggregation] - - [ReportSpecification - | - +primary: ReportSection?; - +secondary: List<ReportSection> - | - +Map<String, dynamic> toJson(); - +String toString() - ] - - [ReportSpecification]o-[<abstract>ReportSection] - - [<abstract>ReportSection - | - <static>+sectionTypes: Map<String, ReportSection Function(Map<String, dynamic>)>; - <static>+keyType: String; - +type: String; - +id: String; - +title: String?; - +description: String? - | - +Map<String, dynamic> toJson(); - +String toString() - ] - - [NotExpression - | - <static>+expressionType: String; - +expression: Expression - | - +Map<String, dynamic> toJson(); - +bool? evaluate() - ] - - [NotExpression]o-[<abstract>Expression] - [<abstract>Expression]<:-[NotExpression] - - [BooleanExpression - | - <static>+expressionType: String - | - +Map<String, dynamic> toJson(); - +bool checkValue() - ] - - [<abstract>ValueExpression]<:-[BooleanExpression] - - [<abstract>ValueExpression - | - <static>+expressionType: String; - +target: String? - | - +bool checkValue(); - +bool? evaluate() - ] - - [<abstract>Expression]<:-[<abstract>ValueExpression] - - [ChoiceExpression - | - <static>+expressionType: String; - +choices: Set<dynamic> - | - +Map<String, dynamic> toJson(); - +bool checkValue() - ] - - [<abstract>ValueExpression]<:-[ChoiceExpression] - - [<abstract>Expression - | - <static>+expressionTypes: Map<String, Expression Function(Map<String, dynamic>)>; - <static>+keyType: String; - +type: String? - | - +Map<String, dynamic> toJson(); - +String toString(); - +bool? evaluate() - ] - - [<abstract>StudyResult - | - <static>+studyResultTypes: Map<String, StudyResult Function(Map<String, dynamic>)>; - <static>+keyType: String; - +type: String; - +id: String; - +filename: String - | - +Map<String, dynamic> toJson(); - +List<String> getHeaders(); - +List<dynamic> getValues() - ] - - [InterventionResult - | - <static>+studyResultType: String - | - +Map<String, dynamic> toJson(); - +List<String> getHeaders(); - +List<dynamic> getValues() - ] - - [<abstract>StudyResult]<:-[InterventionResult] - - [NumericResult - | - <static>+studyResultType: String; - +resultProperty: DataReference<num> - | - +Map<String, dynamic> toJson(); - +List<String> getHeaders(); - +List<dynamic> getValues() - ] - - [NumericResult]o-[DataReference] - [<abstract>StudyResult]<:-[NumericResult] - - [ConsentItem - | - +id: String; - +title: String?; - +description: String?; - +iconName: String - | - +Map<String, dynamic> toJson(); - +String toString() - ] - - [QuestionConditional - | - <static>+keyDefaultValue: String; - +defaultValue: V?; - +condition: Expression - | - <static>-QuestionConditional<V> _fromJson(); - +Map<String, dynamic> toJson() - ] - - [QuestionConditional]o-[<abstract>Expression] - - [<abstract>Question - | - <static>+questionTypes: Map<String, Question<dynamic> Function(Map<String, dynamic>)>; - <static>+keyType: String; - +type: String; - +id: String; - +prompt: String?; - +rationale: String?; - <static>+keyConditional: String; - +conditional: QuestionConditional<V>? - | - +Map<String, dynamic> toJson(); - +bool shouldBeShown(); - +Answer<V>? getDefaultAnswer(); - +Type getAnswerType(); - +String toString() - ] - - [<abstract>Question]o-[QuestionConditional] - - [ChoiceQuestion - | - <static>+questionType: String; - +multiple: bool; - +choices: List<Choice> - | - +Map<String, dynamic> toJson(); - +Answer<List<String>> constructAnswer() - ] - - [<abstract>Question]<:-[ChoiceQuestion] - - [Choice - | - +id: String; - +text: String - | - +Map<String, dynamic> toJson(); - +String toString() - ] - - [BooleanQuestion - | - <static>+questionType: String - | - +Map<String, dynamic> toJson(); - +Answer<bool> constructAnswer() - ] - - [<abstract>Question]<:-[BooleanQuestion] - - [<abstract>SliderQuestion - | - +minimum: double; - +maximum: double; - -_initial: double; - +step: double; - +initial: double - | - +Answer<num> constructAnswer() - ] - - [<abstract>Question]<:-[<abstract>SliderQuestion] - - [ScaleQuestion - | - <static>+questionType: String; - +annotations: List<Annotation>; - +minColor: int?; - +maxColor: int?; - -_step: double; - +step: double; - +isAutostep: bool; - +autostep: int; - +annotationsSorted: List<Annotation>; - +minAnnotation: Annotation?; - +maxAnnotation: Annotation?; - +minLabel: String?; - +maxLabel: String?; - +midAnnotations: List<Annotation>; - +midLabels: List<String>; - +midValues: List<double>; - +values: List<double>; - +minimumAnnotation: String; - +maximumAnnotation: String; - +maximumColor: int; - +minimumColor: int - | - +Map<String, dynamic> toJson(); - +Annotation addAnnotation(); - -void _setAnnotationLabel(); - <static>+int getAutostepSize(); - <static>+List<int> generateMidValues() - ] - - [ScaleQuestion]o-[Annotation] - [<abstract>SliderQuestion]<:-[ScaleQuestion] - [AnnotatedScaleQuestion]<:--[ScaleQuestion] - [VisualAnalogueQuestion]<:--[ScaleQuestion] - - [AnnotatedScaleQuestion - | - <static>+questionType: String; - +annotations: List<Annotation> - | - +Map<String, dynamic> toJson() - ] - - [<abstract>SliderQuestion]<:-[AnnotatedScaleQuestion] - - [Annotation - | - +value: int; - +annotation: String - | - +Map<String, dynamic> toJson() - ] - - [VisualAnalogueQuestion - | - <static>+questionType: String; - +minimumColor: int; - +maximumColor: int; - +minimumAnnotation: String; - +maximumAnnotation: String - | - +Map<String, dynamic> toJson() - ] - - [<abstract>SliderQuestion]<:-[VisualAnalogueQuestion] - - [Answer - | - +question: String; - +timestamp: DateTime; - <static>+keyResponse: String; - +response: V - | - +Map<String, dynamic> toJson(); - <static>+Answer<dynamic> fromJson(); - +String toString() - ] - - [StudyUQuestionnaire - | - +questions: List<Question<dynamic>> - | - +List<dynamic> toJson() - ] - - [EligibilityCriterion - | - +id: String; - +reason: String?; - +condition: Expression - | - +Map<String, dynamic> toJson(); - +bool isSatisfied(); - +bool isViolated() - ] - - [EligibilityCriterion]o-[<abstract>Expression] - - [StudySchedule - | - <static>+numberOfInterventions: int; - +numberOfCycles: int; - +phaseDuration: int; - +includeBaseline: bool; - +sequence: PhaseSequence; - +sequenceCustom: String; - +length: int; - +nameOfSequence: String - | - +Map<String, dynamic> toJson(); - +int getNumberOfPhases(); - +List<int> generateWith(); - -int _nextIntervention(); - -List<int> _generateCycle(); - -List<int> _generateAlternatingCycle(); - -List<int> _generateCounterBalancedCycle(); - -List<int> _generateRandomizedCycle(); - -List<int> _generateCustomizedCycle(); - +String toString() - ] - - [StudySchedule]o-[PhaseSequence] - - [PhaseSequence - | - +index: int; - <static>+values: List<PhaseSequence>; - <static>+alternating: PhaseSequence; - <static>+counterBalanced: PhaseSequence; - <static>+randomized: PhaseSequence; - <static>+customized: PhaseSequence - ] - - [PhaseSequence]o-[PhaseSequence] - [Enum]<:--[PhaseSequence] - - [QuestionnaireTask - | - <static>+taskType: String; - +questions: StudyUQuestionnaire - | - +Map<String, dynamic> toJson(); - +Map<DateTime, T> extractPropertyResults(); - +Map<String, Type> getAvailableProperties(); - +String? getHumanReadablePropertyName() - ] - - [QuestionnaireTask]o-[StudyUQuestionnaire] - [<abstract>Observation]<:-[QuestionnaireTask] - - [<abstract>Observation - | - <static>+taskTypes: Map<String, Observation Function(Map<String, dynamic>)> - ] - - [<abstract>Task]<:-[<abstract>Observation] - - [Schedule - | - +completionPeriods: List<CompletionPeriod>; - +reminders: List<StudyUTimeOfDay> - | - +Map<String, dynamic> toJson(); - +String toString() - ] - - [CompletionPeriod - | - +id: String; - +unlockTime: StudyUTimeOfDay; - +lockTime: StudyUTimeOfDay - | - +Map<String, dynamic> toJson(); - +String formatted(); - +String toString(); - +bool contains() - ] - - [CompletionPeriod]o-[StudyUTimeOfDay] - - [StudyUTimeOfDay - | - +hour: int; - +minute: int - | - +String toJson(); - +String toString(); - +bool earlierThan() - ] - - [TaskInstance - | - +task: Task; - +id: String; - +completionPeriod: CompletionPeriod - | - <static>-Task _taskFromStudy(); - <static>-Task _taskFromSubject() - ] - - [TaskInstance]o-[<abstract>Task] - [TaskInstance]o-[CompletionPeriod] - - [<abstract>Task - | - <static>+keyType: String; - +type: String; - +id: String; - +title: String?; - +header: String?; - +footer: String?; - +schedule: Schedule - | - +Map<String, dynamic> toJson(); - +String toString(); - +Map<DateTime, T> extractPropertyResults(); - +Map<String, Type> getAvailableProperties(); - +String? getHumanReadablePropertyName() - ] - - [<abstract>Task]o-[Schedule] - - [Result - | - <static>+keyType: String; - +type: String; - +periodId: String?; - <static>+keyResult: String; - +result: T - | - +Map<String, dynamic> toJson(); - <static>-Result<dynamic> _fromJson() - ] - - [Study - | - <static>+tableName: String; - <static>+baselineID: String; - +id: String; - +title: String?; - +description: String?; - +userId: String; - +participation: Participation; - +resultSharing: ResultSharing; - +contact: Contact; - +iconName: String; - +published: bool; - +questionnaire: StudyUQuestionnaire; - +eligibilityCriteria: List<EligibilityCriterion>; - +consent: List<ConsentItem>; - +interventions: List<Intervention>; - +observations: List<Observation>; - +schedule: StudySchedule; - +reportSpecification: ReportSpecification; - +results: List<StudyResult>; - +collaboratorEmails: List<String>; - +registryPublished: bool; - +participantCount: int; - +endedCount: int; - +activeSubjectCount: int; - +missedDays: List<int>; - +repo: Repo?; - +invites: List<StudyInvite>?; - +participants: List<StudySubject>?; - +participantsProgress: List<SubjectProgress>?; - +createdAt: DateTime?; - +primaryKeys: Map<String, dynamic>; - +hasEligibilityCheck: bool; - +hasConsentCheck: bool; - +totalMissedDays: int; - +percentageMissedDays: double; - +status: StudyStatus; - +isDraft: bool; - +isRunning: bool; - +isClosed: bool - | - +Map<String, dynamic> toJson(); - <static>+dynamic getResearcherDashboardStudies(); - <static>+dynamic publishedPublicStudies(); - +bool isOwner(); - +bool isEditor(); - +bool canEdit(); - <static>+dynamic fetchResultsCSVTable(); - +bool isReadonly(); - +String toString(); - +int compareTo() - ] - - [Study]o-[Participation] - [Study]o-[ResultSharing] - [Study]o-[Contact] - [Study]o-[StudyUQuestionnaire] - [Study]o-[StudySchedule] - [Study]o-[ReportSpecification] - [Study]o-[Repo] - [Study]o-[StudyStatus] - [<abstract>SupabaseObjectFunctions]<:-[Study] - [Comparable]<:--[Study] - - [StudyStatus - | - +index: int; - <static>+values: List<StudyStatus>; - <static>+draft: StudyStatus; - <static>+running: StudyStatus; - <static>+closed: StudyStatus - ] - - [StudyStatus]o-[StudyStatus] - [Enum]<:--[StudyStatus] - - [Participation - | - +index: int; - <static>+values: List<Participation>; - <static>+open: Participation; - <static>+invite: Participation - ] - - [Participation]o-[Participation] - [Enum]<:--[Participation] - - [ResultSharing - | - +index: int; - <static>+values: List<ResultSharing>; - <static>+public: ResultSharing; - <static>+private: ResultSharing; - <static>+organization: ResultSharing - ] - - [ResultSharing]o-[ResultSharing] - [Enum]<:--[ResultSharing] - - [AppConfig - | - <static>+tableName: String; - +id: String; - +contact: Contact; - +appPrivacy: Map<String, String>; - +appTerms: Map<String, String>; - +designerPrivacy: Map<String, String>; - +designerTerms: Map<String, String>; - +imprint: Map<String, String>; - +analytics: StudyUAnalytics; - +primaryKeys: Map<String, dynamic> - | - +Map<String, dynamic> toJson(); - <static>+dynamic getAppConfig(); - <static>+dynamic getAppContact() - ] - - [AppConfig]o-[Contact] - [AppConfig]o-[StudyUAnalytics] - [<abstract>SupabaseObjectFunctions]<:-[AppConfig] - - [SubjectProgress - | - <static>+tableName: String; - +completedAt: DateTime?; - +subjectId: String; - +interventionId: String; - +taskId: String; - +resultType: String; - +result: Result<dynamic>; - +startedAt: DateTime?; - +primaryKeys: Map<String, dynamic>; - +hashCode: int - | - +Map<String, dynamic> toJson(); - +SubjectProgress setStartDateBackBy(); - +bool ==() - ] - - [SubjectProgress]o-[Result] - [<abstract>SupabaseObjectFunctions]<:-[SubjectProgress] - - [StudyInvite - | - <static>+tableName: String; - +code: String; - +studyId: String; - +preselectedInterventionIds: List<String>?; - +primaryKeys: Map<String, dynamic> - | - +Map<String, dynamic> toJson() - ] - - [<abstract>SupabaseObjectFunctions]<:-[StudyInvite] - - [StudyUUser - | - <static>+tableName: String; - +id: String; - +email: String; - +preferences: Preferences; - +primaryKeys: Map<String, dynamic> - | - +Map<String, dynamic> toJson() - ] - - [StudyUUser]o-[Preferences] - [<abstract>SupabaseObjectFunctions]<:-[StudyUUser] - - [Preferences - | - +language: String; - +pinnedStudies: Set<String> - | - +Map<String, dynamic> toJson() - ] - - [Repo - | - <static>+tableName: String; - +projectId: String; - +userId: String; - +studyId: String; - +provider: GitProvider; - +webUrl: String?; - +gitUrl: String?; - +primaryKeys: Map<String, dynamic> - | - +Map<String, dynamic> toJson() - ] - - [Repo]o-[GitProvider] - [<abstract>SupabaseObjectFunctions]<:-[Repo] - - [GitProvider - | - +index: int; - <static>+values: List<GitProvider>; - <static>+gitlab: GitProvider - ] - - [GitProvider]o-[GitProvider] - [Enum]<:--[GitProvider] - - [StudySubject - | - <static>+tableName: String; - -_controller: StreamController<StudySubject>; - +id: String; - +studyId: String; - +userId: String; - +startedAt: DateTime?; - +selectedInterventionIds: List<String>; - +inviteCode: String?; - +isDeleted: bool; - +study: Study; - +progress: List<SubjectProgress>; - +primaryKeys: Map<String, dynamic>; - +interventionOrder: List<String>; - +selectedInterventions: List<Intervention>; - +daysPerIntervention: int; - +minimumStudyLengthCompleted: bool; - +completedStudy: bool; - +onSave: Stream<StudySubject>; - +hashCode: int - | - +Map<String, dynamic> toJson(); - +dynamic addResult(); - +Map<DateTime, List<SubjectProgress>> getResultsByDate(); - +DateTime endDate(); - +int getDayOfStudyFor(); - +int getInterventionIndexForDate(); - +Intervention? getInterventionForDate(); - +List<Intervention> getInterventionsInOrder(); - +DateTime startOfPhase(); - +DateTime dayAfterEndOfPhase(); - +List<SubjectProgress> resultsFor(); - +int completedForPhase(); - +int daysLeftForPhase(); - +double percentCompletedForPhase(); - +double percentMissedForPhase(); - +List<SubjectProgress> getTaskProgressForDay(); - +bool completedTaskInstanceForDay(); - +bool completedTaskForDay(); - +int completedTasksFor(); - +bool allTasksCompletedFor(); - +int totalTaskCountFor(); - +List<TaskInstance> scheduleFor(); - +dynamic setStartDateBackBy(); - +dynamic save(); - +Map<String, dynamic> toFullJson(); - +dynamic deleteProgress(); - +dynamic delete(); - +dynamic softDelete(); - <static>+dynamic getStudyHistory(); - +bool ==(); - +String toString() - ] - - [StudySubject]o-[StreamController] - [StudySubject]o-[Study] - [StudySubject]o-[Stream] - [<abstract>SupabaseObjectFunctions]<:-[StudySubject] - - [<abstract>InterventionTask - | - <static>+taskTypes: Map<String, InterventionTask Function(Map<String, dynamic>)> - ] - - [<abstract>Task]<:-[<abstract>InterventionTask] - - [Intervention - | - +id: String; - +name: String?; - +description: String?; - +icon: String; - +tasks: List<InterventionTask> - | - +Map<String, dynamic> toJson(); - +bool isBaseline() - ] - - [CheckmarkTask - | - <static>+taskType: String - | - +Map<String, dynamic> toJson(); - +Map<DateTime, T> extractPropertyResults(); - +Map<String, Type> getAvailableProperties(); - +String? getHumanReadablePropertyName() - ] - - [<abstract>InterventionTask]<:-[CheckmarkTask] - - [Contact - | - +organization: String; - +institutionalReviewBoard: String?; - +institutionalReviewBoardNumber: String?; - +researchers: String?; - +email: String; - +website: String; - +phone: String; - +additionalInfo: String? - | - +Map<String, dynamic> toJson(); - +String toString() - ] - - - + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - DataReference - - - - - - +task: String - +property: String - - - - - - +Map<String, dynamic> toJson() - +String toString() - +Map<DateTime, T> retrieveFromResults() - - - - - - - - - - - - - AverageSection - - - - - - <static>+sectionType: String - +aggregate: TemporalAggregation? - +resultProperty: DataReference<num>? - - - - - - +Map<String, dynamic> toJson() - - - - - - - - - - - - TemporalAggregation - - - - - - +index: int - <static>+values: List<TemporalAggregation> - <static>+day: TemporalAggregation - <static>+phase: TemporalAggregation - <static>+intervention: TemporalAggregation - - - - - - - - - - - - - ReportSection - - - - - - <static>+sectionTypes: Map<String, ReportSection Function(Map<String, dynamic>)> - <static>+keyType: String - +type: String - +id: String - +title: String? - +description: String? - - - - - - +Map<String, dynamic> toJson() - +String toString() - - - - - - - - - - - - - LinearRegressionSection - - - - - - <static>+sectionType: String - +resultProperty: DataReference<num>? - +alpha: double - +improvement: ImprovementDirection? - - - - - - +Map<String, dynamic> toJson() - - - - - - - - - - - - ImprovementDirection - - - - - - +index: int - <static>+values: List<ImprovementDirection> - <static>+positive: ImprovementDirection - <static>+negative: ImprovementDirection - - - - - - - - - - - Enum - - - - - - - - - - - - - ReportSpecification - - - - - - +primary: ReportSection? - +secondary: List<ReportSection> - - - - - - +Map<String, dynamic> toJson() - +String toString() - - - - - - - - - - - - - NotExpression - - - - - - <static>+expressionType: String - +expression: Expression - - - - - - +Map<String, dynamic> toJson() - +bool? evaluate() - - - - - - - - - - - - - Expression - - - - - - <static>+expressionTypes: Map<String, Expression Function(Map<String, dynamic>)> - <static>+keyType: String - +type: String? - - - - - - +Map<String, dynamic> toJson() - +String toString() - +bool? evaluate() - - - - - - - - - - - - - BooleanExpression - - - - - - <static>+expressionType: String - - - - - - +Map<String, dynamic> toJson() - +bool checkValue() - - - - - - - - - - - - - ValueExpression - - - - - - <static>+expressionType: String - +target: String? - - - - - - +bool checkValue() - +bool? evaluate() - - - - - - - - - - - - - ChoiceExpression - - - - - - <static>+expressionType: String - +choices: Set<dynamic> - - - - - - +Map<String, dynamic> toJson() - +bool checkValue() - - - - - - - - - - - - - StudyResult - - - - - - <static>+studyResultTypes: Map<String, StudyResult Function(Map<String, dynamic>)> - <static>+keyType: String - +type: String - +id: String - +filename: String - - - - - - +Map<String, dynamic> toJson() - +List<String> getHeaders() - +List<dynamic> getValues() - - - - - - - - - - - - - InterventionResult - - - - - - <static>+studyResultType: String - - - - - - +Map<String, dynamic> toJson() - +List<String> getHeaders() - +List<dynamic> getValues() - - - - - - - - - - - - - NumericResult - - - - - - <static>+studyResultType: String - +resultProperty: DataReference<num> - - - - - - +Map<String, dynamic> toJson() - +List<String> getHeaders() - +List<dynamic> getValues() - - - - - - - - - - - - - ConsentItem - - - - - - +id: String - +title: String? - +description: String? - +iconName: String - - - - - - +Map<String, dynamic> toJson() - +String toString() - - - - - - - - - - - - - QuestionConditional - - - - - - <static>+keyDefaultValue: String - +defaultValue: V? - +condition: Expression - - - - - - <static>-QuestionConditional<V> _fromJson() - +Map<String, dynamic> toJson() - - - - - - - - - - - - - Question - - - - - - <static>+questionTypes: Map<String, Question<dynamic> Function(Map<String, dynamic>)> - <static>+keyType: String - +type: String - +id: String - +prompt: String? - +rationale: String? - <static>+keyConditional: String - +conditional: QuestionConditional<V>? - - - - - - +Map<String, dynamic> toJson() - +bool shouldBeShown() - +Answer<V>? getDefaultAnswer() - +Type getAnswerType() - +String toString() - - - - - - - - - - - - - ChoiceQuestion - - - - - - <static>+questionType: String - +multiple: bool - +choices: List<Choice> - - - - - - +Map<String, dynamic> toJson() - +Answer<List<String>> constructAnswer() - - - - - - - - - - - - - Choice - - - - - - +id: String - +text: String - - - - - - +Map<String, dynamic> toJson() - +String toString() - - - - - - - - - - - - - BooleanQuestion - - - - - - <static>+questionType: String - - - - - - +Map<String, dynamic> toJson() - +Answer<bool> constructAnswer() - - - - - - - - - - - - - SliderQuestion - - - - - - +minimum: double - +maximum: double - -_initial: double - +step: double - +initial: double - - - - - - +Answer<num> constructAnswer() - - - - - - - - - - - - - ScaleQuestion - - - - - - <static>+questionType: String - +annotations: List<Annotation> - +minColor: int? - +maxColor: int? - -_step: double - +step: double - +isAutostep: bool - +autostep: int - +annotationsSorted: List<Annotation> - +minAnnotation: Annotation? - +maxAnnotation: Annotation? - +minLabel: String? - +maxLabel: String? - +midAnnotations: List<Annotation> - +midLabels: List<String> - +midValues: List<double> - +values: List<double> - +minimumAnnotation: String - +maximumAnnotation: String - +maximumColor: int - +minimumColor: int - - - - - - +Map<String, dynamic> toJson() - +Annotation addAnnotation() - -void _setAnnotationLabel() - <static>+int getAutostepSize() - <static>+List<int> generateMidValues() - - - - - - - - - - - - - Annotation - - - - - - +value: int - +annotation: String - - - - - - +Map<String, dynamic> toJson() - - - - - - - - - - - - - AnnotatedScaleQuestion - - - - - - <static>+questionType: String - +annotations: List<Annotation> - - - - - - +Map<String, dynamic> toJson() - - - - - - - - - - - - - VisualAnalogueQuestion - - - - - - <static>+questionType: String - +minimumColor: int - +maximumColor: int - +minimumAnnotation: String - +maximumAnnotation: String - - - - - - +Map<String, dynamic> toJson() - - - - - - - - - - - - - Answer - - - - - - +question: String - +timestamp: DateTime - <static>+keyResponse: String - +response: V - - - - - - +Map<String, dynamic> toJson() - <static>+Answer<dynamic> fromJson() - +String toString() - - - - - - - - - - - - - StudyUQuestionnaire - - - - - - +questions: List<Question<dynamic>> - - - - - - +List<dynamic> toJson() - - - - - - - - - - - - - EligibilityCriterion - - - - - - +id: String - +reason: String? - +condition: Expression - - - - - - +Map<String, dynamic> toJson() - +bool isSatisfied() - +bool isViolated() - - - - - - - - - - - - - StudySchedule - - - - - - <static>+numberOfInterventions: int - +numberOfCycles: int - +phaseDuration: int - +includeBaseline: bool - +sequence: PhaseSequence - +sequenceCustom: String - +length: int - +nameOfSequence: String - - - - - - +Map<String, dynamic> toJson() - +int getNumberOfPhases() - +List<int> generateWith() - -int _nextIntervention() - -List<int> _generateCycle() - -List<int> _generateAlternatingCycle() - -List<int> _generateCounterBalancedCycle() - -List<int> _generateRandomizedCycle() - -List<int> _generateCustomizedCycle() - +String toString() - - - - - - - - - - - - PhaseSequence - - - - - - +index: int - <static>+values: List<PhaseSequence> - <static>+alternating: PhaseSequence - <static>+counterBalanced: PhaseSequence - <static>+randomized: PhaseSequence - <static>+customized: PhaseSequence - - - - - - - - - - - - - QuestionnaireTask - - - - - - <static>+taskType: String - +questions: StudyUQuestionnaire - - - - - - +Map<String, dynamic> toJson() - +Map<DateTime, T> extractPropertyResults() - +Map<String, Type> getAvailableProperties() - +String? getHumanReadablePropertyName() - - - - - - - - - - - - Observation - - - - - - <static>+taskTypes: Map<String, Observation Function(Map<String, dynamic>)> - - - - - - - - - - - - - Task - - - - - - <static>+keyType: String - +type: String - +id: String - +title: String? - +header: String? - +footer: String? - +schedule: Schedule - - - - - - +Map<String, dynamic> toJson() - +String toString() - +Map<DateTime, T> extractPropertyResults() - +Map<String, Type> getAvailableProperties() - +String? getHumanReadablePropertyName() - - - - - - - - - - - - - Schedule - - - - - - +completionPeriods: List<CompletionPeriod> - +reminders: List<StudyUTimeOfDay> - - - - - - +Map<String, dynamic> toJson() - +String toString() - - - - - - - - - - - - - CompletionPeriod - - - - - - +id: String - +unlockTime: StudyUTimeOfDay - +lockTime: StudyUTimeOfDay - - - - - - +Map<String, dynamic> toJson() - +String formatted() - +String toString() - +bool contains() - - - - - - - - - - - - - StudyUTimeOfDay - - - - - - +hour: int - +minute: int - - - - - - +String toJson() - +String toString() - +bool earlierThan() - - - - - - - - - - - - - TaskInstance - - - - - - +task: Task - +id: String - +completionPeriod: CompletionPeriod - - - - - - <static>-Task _taskFromStudy() - <static>-Task _taskFromSubject() - - - - - - - - - - - - - Result - - - - - - <static>+keyType: String - +type: String - +periodId: String? - <static>+keyResult: String - +result: T - - - - - - +Map<String, dynamic> toJson() - <static>-Result<dynamic> _fromJson() - - - - - - - - - - - - - Study - - - - - - <static>+tableName: String - <static>+baselineID: String - +id: String - +title: String? - +description: String? - +userId: String - +participation: Participation - +resultSharing: ResultSharing - +contact: Contact - +iconName: String - +published: bool - +questionnaire: StudyUQuestionnaire - +eligibilityCriteria: List<EligibilityCriterion> - +consent: List<ConsentItem> - +interventions: List<Intervention> - +observations: List<Observation> - +schedule: StudySchedule - +reportSpecification: ReportSpecification - +results: List<StudyResult> - +collaboratorEmails: List<String> - +registryPublished: bool - +participantCount: int - +endedCount: int - +activeSubjectCount: int - +missedDays: List<int> - +repo: Repo? - +invites: List<StudyInvite>? - +participants: List<StudySubject>? - +participantsProgress: List<SubjectProgress>? - +createdAt: DateTime? - +primaryKeys: Map<String, dynamic> - +hasEligibilityCheck: bool - +hasConsentCheck: bool - +totalMissedDays: int - +percentageMissedDays: double - +status: StudyStatus - +isDraft: bool - +isRunning: bool - +isClosed: bool - - - - - - +Map<String, dynamic> toJson() - <static>+dynamic getResearcherDashboardStudies() - <static>+dynamic publishedPublicStudies() - +bool isOwner() - +bool isEditor() - +bool canEdit() - <static>+dynamic fetchResultsCSVTable() - +bool isReadonly() - +String toString() - +int compareTo() - - - - - - - - - - - - Participation - - - - - - +index: int - <static>+values: List<Participation> - <static>+open: Participation - <static>+invite: Participation - - - - - - - - - - - - ResultSharing - - - - - - +index: int - <static>+values: List<ResultSharing> - <static>+public: ResultSharing - <static>+private: ResultSharing - <static>+organization: ResultSharing - - - - - - - - - - - - - Contact - - - - - - +organization: String - +institutionalReviewBoard: String? - +institutionalReviewBoardNumber: String? - +researchers: String? - +email: String - +website: String - +phone: String - +additionalInfo: String? - - - - - - +Map<String, dynamic> toJson() - +String toString() - - - - - - - - - - - - - Repo - - - - - - <static>+tableName: String - +projectId: String - +userId: String - +studyId: String - +provider: GitProvider - +webUrl: String? - +gitUrl: String? - +primaryKeys: Map<String, dynamic> - - - - - - +Map<String, dynamic> toJson() - - - - - - - - - - - - StudyStatus - - - - - - +index: int - <static>+values: List<StudyStatus> - <static>+draft: StudyStatus - <static>+running: StudyStatus - <static>+closed: StudyStatus - - - - - - - - - - - SupabaseObjectFunctions - - - - - - - - - - - Comparable - - - - - - - - - - - - - AppConfig - - - - - - <static>+tableName: String - +id: String - +contact: Contact - +appPrivacy: Map<String, String> - +appTerms: Map<String, String> - +designerPrivacy: Map<String, String> - +designerTerms: Map<String, String> - +imprint: Map<String, String> - +analytics: StudyUAnalytics - +primaryKeys: Map<String, dynamic> - - - - - - +Map<String, dynamic> toJson() - <static>+dynamic getAppConfig() - <static>+dynamic getAppContact() - - - - - - - - - - - StudyUAnalytics - - - - - - - - - - - - - SubjectProgress - - - - - - <static>+tableName: String - +completedAt: DateTime? - +subjectId: String - +interventionId: String - +taskId: String - +resultType: String - +result: Result<dynamic> - +startedAt: DateTime? - +primaryKeys: Map<String, dynamic> - +hashCode: int - - - - - - +Map<String, dynamic> toJson() - +SubjectProgress setStartDateBackBy() - +bool ==() - - - - - - - - - - - - - StudyInvite - - - - - - <static>+tableName: String - +code: String - +studyId: String - +preselectedInterventionIds: List<String>? - +primaryKeys: Map<String, dynamic> - - - - - - +Map<String, dynamic> toJson() - - - - - - - - - - - - - StudyUUser - - - - - - <static>+tableName: String - +id: String - +email: String - +preferences: Preferences - +primaryKeys: Map<String, dynamic> - - - - - - +Map<String, dynamic> toJson() - - - - - - - - - - - - - Preferences - - - - - - +language: String - +pinnedStudies: Set<String> - - - - - - +Map<String, dynamic> toJson() - - - - - - - - - - - - GitProvider - - - - - - +index: int - <static>+values: List<GitProvider> - <static>+gitlab: GitProvider - - - - - - - - - - - - - StudySubject - - - - - - <static>+tableName: String - -_controller: StreamController<StudySubject> - +id: String - +studyId: String - +userId: String - +startedAt: DateTime? - +selectedInterventionIds: List<String> - +inviteCode: String? - +isDeleted: bool - +study: Study - +progress: List<SubjectProgress> - +primaryKeys: Map<String, dynamic> - +interventionOrder: List<String> - +selectedInterventions: List<Intervention> - +daysPerIntervention: int - +minimumStudyLengthCompleted: bool - +completedStudy: bool - +onSave: Stream<StudySubject> - +hashCode: int - - - - - - +Map<String, dynamic> toJson() - +dynamic addResult() - +Map<DateTime, List<SubjectProgress>> getResultsByDate() - +DateTime endDate() - +int getDayOfStudyFor() - +int getInterventionIndexForDate() - +Intervention? getInterventionForDate() - +List<Intervention> getInterventionsInOrder() - +DateTime startOfPhase() - +DateTime dayAfterEndOfPhase() - +List<SubjectProgress> resultsFor() - +int completedForPhase() - +int daysLeftForPhase() - +double percentCompletedForPhase() - +double percentMissedForPhase() - +List<SubjectProgress> getTaskProgressForDay() - +bool completedTaskInstanceForDay() - +bool completedTaskForDay() - +int completedTasksFor() - +bool allTasksCompletedFor() - +int totalTaskCountFor() - +List<TaskInstance> scheduleFor() - +dynamic setStartDateBackBy() - +dynamic save() - +Map<String, dynamic> toFullJson() - +dynamic deleteProgress() - +dynamic delete() - +dynamic softDelete() - <static>+dynamic getStudyHistory() - +bool ==() - +String toString() - - - - - - - - - - - StreamController - - - - - - - - - - - Stream - - - - - - - - - - - - InterventionTask - - - - - - <static>+taskTypes: Map<String, InterventionTask Function(Map<String, dynamic>)> - - - - - - - - - - - - - Intervention - - - - - - +id: String - +name: String? - +description: String? - +icon: String - +tasks: List<InterventionTask> - - - - - - +Map<String, dynamic> toJson() - +bool isBaseline() - - - - - - - - - - - - - CheckmarkTask - - - - - - <static>+taskType: String - - - - - - +Map<String, dynamic> toJson() - +Map<DateTime, T> extractPropertyResults() - +Map<String, Type> getAvailableProperties() - +String? getHumanReadablePropertyName() - - - - - + diff --git a/docs/uml/core/lib/src/uml.svg b/docs/uml/core/lib/src/uml.svg index 2e673cef6..32b5afd1e 100644 --- a/docs/uml/core/lib/src/uml.svg +++ b/docs/uml/core/lib/src/uml.svg @@ -1,2968 +1,11 @@ - - [DataReference - | - +task: String; - +property: String - | - +Map<String, dynamic> toJson(); - +String toString(); - +Map<DateTime, T> retrieveFromResults() - ] - - [AverageSection - | - <static>+sectionType: String; - +aggregate: TemporalAggregation?; - +resultProperty: DataReference<num>? - | - +Map<String, dynamic> toJson() - ] - - [AverageSection]o-[TemporalAggregation] - [AverageSection]o-[DataReference] - [<abstract>ReportSection]<:-[AverageSection] - - [LinearRegressionSection - | - <static>+sectionType: String; - +resultProperty: DataReference<num>?; - +alpha: double; - +improvement: ImprovementDirection? - | - +Map<String, dynamic> toJson() - ] - - [LinearRegressionSection]o-[DataReference] - [LinearRegressionSection]o-[ImprovementDirection] - [<abstract>ReportSection]<:-[LinearRegressionSection] - - [ImprovementDirection - | - +index: int; - <static>+values: List<ImprovementDirection>; - <static>+positive: ImprovementDirection; - <static>+negative: ImprovementDirection - ] - - [ImprovementDirection]o-[ImprovementDirection] - [Enum]<:--[ImprovementDirection] - - [TemporalAggregation - | - +index: int; - <static>+values: List<TemporalAggregation>; - <static>+day: TemporalAggregation; - <static>+phase: TemporalAggregation; - <static>+intervention: TemporalAggregation - ] - - [TemporalAggregation]o-[TemporalAggregation] - [Enum]<:--[TemporalAggregation] - - [ReportSpecification - | - +primary: ReportSection?; - +secondary: List<ReportSection> - | - +Map<String, dynamic> toJson(); - +String toString() - ] - - [ReportSpecification]o-[<abstract>ReportSection] - - [<abstract>ReportSection - | - <static>+sectionTypes: Map<String, ReportSection Function(Map<String, dynamic>)>; - <static>+keyType: String; - +type: String; - +id: String; - +title: String?; - +description: String? - | - +Map<String, dynamic> toJson(); - +String toString() - ] - - [NotExpression - | - <static>+expressionType: String; - +expression: Expression - | - +Map<String, dynamic> toJson(); - +bool? evaluate() - ] - - [NotExpression]o-[<abstract>Expression] - [<abstract>Expression]<:-[NotExpression] - - [BooleanExpression - | - <static>+expressionType: String - | - +Map<String, dynamic> toJson(); - +bool checkValue() - ] - - [<abstract>ValueExpression]<:-[BooleanExpression] - - [<abstract>ValueExpression - | - <static>+expressionType: String; - +target: String? - | - +bool checkValue(); - +bool? evaluate() - ] - - [<abstract>Expression]<:-[<abstract>ValueExpression] - - [ChoiceExpression - | - <static>+expressionType: String; - +choices: Set<dynamic> - | - +Map<String, dynamic> toJson(); - +bool checkValue() - ] - - [<abstract>ValueExpression]<:-[ChoiceExpression] - - [<abstract>Expression - | - <static>+expressionTypes: Map<String, Expression Function(Map<String, dynamic>)>; - <static>+keyType: String; - +type: String? - | - +Map<String, dynamic> toJson(); - +String toString(); - +bool? evaluate() - ] - - [<abstract>StudyResult - | - <static>+studyResultTypes: Map<String, StudyResult Function(Map<String, dynamic>)>; - <static>+keyType: String; - +type: String; - +id: String; - +filename: String - | - +Map<String, dynamic> toJson(); - +List<String> getHeaders(); - +List<dynamic> getValues() - ] - - [InterventionResult - | - <static>+studyResultType: String - | - +Map<String, dynamic> toJson(); - +List<String> getHeaders(); - +List<dynamic> getValues() - ] - - [<abstract>StudyResult]<:-[InterventionResult] - - [NumericResult - | - <static>+studyResultType: String; - +resultProperty: DataReference<num> - | - +Map<String, dynamic> toJson(); - +List<String> getHeaders(); - +List<dynamic> getValues() - ] - - [NumericResult]o-[DataReference] - [<abstract>StudyResult]<:-[NumericResult] - - [ConsentItem - | - +id: String; - +title: String?; - +description: String?; - +iconName: String - | - +Map<String, dynamic> toJson(); - +String toString() - ] - - [QuestionConditional - | - <static>+keyDefaultValue: String; - +defaultValue: V?; - +condition: Expression - | - <static>-QuestionConditional<V> _fromJson(); - +Map<String, dynamic> toJson() - ] - - [QuestionConditional]o-[<abstract>Expression] - - [<abstract>Question - | - <static>+questionTypes: Map<String, Question<dynamic> Function(Map<String, dynamic>)>; - <static>+keyType: String; - +type: String; - +id: String; - +prompt: String?; - +rationale: String?; - <static>+keyConditional: String; - +conditional: QuestionConditional<V>? - | - +Map<String, dynamic> toJson(); - +bool shouldBeShown(); - +Answer<V>? getDefaultAnswer(); - +Type getAnswerType(); - +String toString() - ] - - [<abstract>Question]o-[QuestionConditional] - - [ChoiceQuestion - | - <static>+questionType: String; - +multiple: bool; - +choices: List<Choice> - | - +Map<String, dynamic> toJson(); - +Answer<List<String>> constructAnswer() - ] - - [<abstract>Question]<:-[ChoiceQuestion] - - [Choice - | - +id: String; - +text: String - | - +Map<String, dynamic> toJson(); - +String toString() - ] - - [BooleanQuestion - | - <static>+questionType: String - | - +Map<String, dynamic> toJson(); - +Answer<bool> constructAnswer() - ] - - [<abstract>Question]<:-[BooleanQuestion] - - [<abstract>SliderQuestion - | - +minimum: double; - +maximum: double; - -_initial: double; - +step: double; - +initial: double - | - +Answer<num> constructAnswer() - ] - - [<abstract>Question]<:-[<abstract>SliderQuestion] - - [ScaleQuestion - | - <static>+questionType: String; - +annotations: List<Annotation>; - +minColor: int?; - +maxColor: int?; - -_step: double; - +step: double; - +isAutostep: bool; - +autostep: int; - +annotationsSorted: List<Annotation>; - +minAnnotation: Annotation?; - +maxAnnotation: Annotation?; - +minLabel: String?; - +maxLabel: String?; - +midAnnotations: List<Annotation>; - +midLabels: List<String>; - +midValues: List<double>; - +values: List<double>; - +minimumAnnotation: String; - +maximumAnnotation: String; - +maximumColor: int; - +minimumColor: int - | - +Map<String, dynamic> toJson(); - +Annotation addAnnotation(); - -void _setAnnotationLabel(); - <static>+int getAutostepSize(); - <static>+List<int> generateMidValues() - ] - - [ScaleQuestion]o-[Annotation] - [<abstract>SliderQuestion]<:-[ScaleQuestion] - [AnnotatedScaleQuestion]<:--[ScaleQuestion] - [VisualAnalogueQuestion]<:--[ScaleQuestion] - - [AnnotatedScaleQuestion - | - <static>+questionType: String; - +annotations: List<Annotation> - | - +Map<String, dynamic> toJson() - ] - - [<abstract>SliderQuestion]<:-[AnnotatedScaleQuestion] - - [Annotation - | - +value: int; - +annotation: String - | - +Map<String, dynamic> toJson() - ] - - [VisualAnalogueQuestion - | - <static>+questionType: String; - +minimumColor: int; - +maximumColor: int; - +minimumAnnotation: String; - +maximumAnnotation: String - | - +Map<String, dynamic> toJson() - ] - - [<abstract>SliderQuestion]<:-[VisualAnalogueQuestion] - - [Answer - | - +question: String; - +timestamp: DateTime; - <static>+keyResponse: String; - +response: V - | - +Map<String, dynamic> toJson(); - <static>+Answer<dynamic> fromJson(); - +String toString() - ] - - [StudyUQuestionnaire - | - +questions: List<Question<dynamic>> - | - +List<dynamic> toJson() - ] - - [EligibilityCriterion - | - +id: String; - +reason: String?; - +condition: Expression - | - +Map<String, dynamic> toJson(); - +bool isSatisfied(); - +bool isViolated() - ] - - [EligibilityCriterion]o-[<abstract>Expression] - - [StudySchedule - | - <static>+numberOfInterventions: int; - +numberOfCycles: int; - +phaseDuration: int; - +includeBaseline: bool; - +sequence: PhaseSequence; - +sequenceCustom: String; - +length: int; - +nameOfSequence: String - | - +Map<String, dynamic> toJson(); - +int getNumberOfPhases(); - +List<int> generateWith(); - -int _nextIntervention(); - -List<int> _generateCycle(); - -List<int> _generateAlternatingCycle(); - -List<int> _generateCounterBalancedCycle(); - -List<int> _generateRandomizedCycle(); - -List<int> _generateCustomizedCycle(); - +String toString() - ] - - [StudySchedule]o-[PhaseSequence] - - [PhaseSequence - | - +index: int; - <static>+values: List<PhaseSequence>; - <static>+alternating: PhaseSequence; - <static>+counterBalanced: PhaseSequence; - <static>+randomized: PhaseSequence; - <static>+customized: PhaseSequence - ] - - [PhaseSequence]o-[PhaseSequence] - [Enum]<:--[PhaseSequence] - - [QuestionnaireTask - | - <static>+taskType: String; - +questions: StudyUQuestionnaire - | - +Map<String, dynamic> toJson(); - +Map<DateTime, T> extractPropertyResults(); - +Map<String, Type> getAvailableProperties(); - +String? getHumanReadablePropertyName() - ] - - [QuestionnaireTask]o-[StudyUQuestionnaire] - [<abstract>Observation]<:-[QuestionnaireTask] - - [<abstract>Observation - | - <static>+taskTypes: Map<String, Observation Function(Map<String, dynamic>)> - ] - - [<abstract>Task]<:-[<abstract>Observation] - - [Schedule - | - +completionPeriods: List<CompletionPeriod>; - +reminders: List<StudyUTimeOfDay> - | - +Map<String, dynamic> toJson(); - +String toString() - ] - - [CompletionPeriod - | - +id: String; - +unlockTime: StudyUTimeOfDay; - +lockTime: StudyUTimeOfDay - | - +Map<String, dynamic> toJson(); - +String formatted(); - +String toString(); - +bool contains() - ] - - [CompletionPeriod]o-[StudyUTimeOfDay] - - [StudyUTimeOfDay - | - +hour: int; - +minute: int - | - +String toJson(); - +String toString(); - +bool earlierThan() - ] - - [TaskInstance - | - +task: Task; - +id: String; - +completionPeriod: CompletionPeriod - | - <static>-Task _taskFromStudy(); - <static>-Task _taskFromSubject() - ] - - [TaskInstance]o-[<abstract>Task] - [TaskInstance]o-[CompletionPeriod] - - [<abstract>Task - | - <static>+keyType: String; - +type: String; - +id: String; - +title: String?; - +header: String?; - +footer: String?; - +schedule: Schedule - | - +Map<String, dynamic> toJson(); - +String toString(); - +Map<DateTime, T> extractPropertyResults(); - +Map<String, Type> getAvailableProperties(); - +String? getHumanReadablePropertyName() - ] - - [<abstract>Task]o-[Schedule] - - [Result - | - <static>+keyType: String; - +type: String; - +periodId: String?; - <static>+keyResult: String; - +result: T - | - +Map<String, dynamic> toJson(); - <static>-Result<dynamic> _fromJson() - ] - - [Study - | - <static>+tableName: String; - <static>+baselineID: String; - +id: String; - +title: String?; - +description: String?; - +userId: String; - +participation: Participation; - +resultSharing: ResultSharing; - +contact: Contact; - +iconName: String; - +published: bool; - +questionnaire: StudyUQuestionnaire; - +eligibilityCriteria: List<EligibilityCriterion>; - +consent: List<ConsentItem>; - +interventions: List<Intervention>; - +observations: List<Observation>; - +schedule: StudySchedule; - +reportSpecification: ReportSpecification; - +results: List<StudyResult>; - +collaboratorEmails: List<String>; - +registryPublished: bool; - +participantCount: int; - +endedCount: int; - +activeSubjectCount: int; - +missedDays: List<int>; - +repo: Repo?; - +invites: List<StudyInvite>?; - +participants: List<StudySubject>?; - +participantsProgress: List<SubjectProgress>?; - +createdAt: DateTime?; - +primaryKeys: Map<String, dynamic>; - +hasEligibilityCheck: bool; - +hasConsentCheck: bool; - +totalMissedDays: int; - +percentageMissedDays: double; - +status: StudyStatus; - +isDraft: bool; - +isRunning: bool; - +isClosed: bool - | - +Map<String, dynamic> toJson(); - <static>+dynamic getResearcherDashboardStudies(); - <static>+dynamic publishedPublicStudies(); - +bool isOwner(); - +bool isEditor(); - +bool canEdit(); - <static>+dynamic fetchResultsCSVTable(); - +bool isReadonly(); - +String toString(); - +int compareTo() - ] - - [Study]o-[Participation] - [Study]o-[ResultSharing] - [Study]o-[Contact] - [Study]o-[StudyUQuestionnaire] - [Study]o-[StudySchedule] - [Study]o-[ReportSpecification] - [Study]o-[Repo] - [Study]o-[StudyStatus] - [<abstract>SupabaseObjectFunctions]<:-[Study] - [Comparable]<:--[Study] - - [StudyStatus - | - +index: int; - <static>+values: List<StudyStatus>; - <static>+draft: StudyStatus; - <static>+running: StudyStatus; - <static>+closed: StudyStatus - ] - - [StudyStatus]o-[StudyStatus] - [Enum]<:--[StudyStatus] - - [Participation - | - +index: int; - <static>+values: List<Participation>; - <static>+open: Participation; - <static>+invite: Participation - ] - - [Participation]o-[Participation] - [Enum]<:--[Participation] - - [ResultSharing - | - +index: int; - <static>+values: List<ResultSharing>; - <static>+public: ResultSharing; - <static>+private: ResultSharing; - <static>+organization: ResultSharing - ] - - [ResultSharing]o-[ResultSharing] - [Enum]<:--[ResultSharing] - - [AppConfig - | - <static>+tableName: String; - +id: String; - +contact: Contact; - +appPrivacy: Map<String, String>; - +appTerms: Map<String, String>; - +designerPrivacy: Map<String, String>; - +designerTerms: Map<String, String>; - +imprint: Map<String, String>; - +analytics: StudyUAnalytics; - +primaryKeys: Map<String, dynamic> - | - +Map<String, dynamic> toJson(); - <static>+dynamic getAppConfig(); - <static>+dynamic getAppContact() - ] - - [AppConfig]o-[Contact] - [AppConfig]o-[StudyUAnalytics] - [<abstract>SupabaseObjectFunctions]<:-[AppConfig] - - [SubjectProgress - | - <static>+tableName: String; - +completedAt: DateTime?; - +subjectId: String; - +interventionId: String; - +taskId: String; - +resultType: String; - +result: Result<dynamic>; - +startedAt: DateTime?; - +primaryKeys: Map<String, dynamic>; - +hashCode: int - | - +Map<String, dynamic> toJson(); - +SubjectProgress setStartDateBackBy(); - +bool ==() - ] - - [SubjectProgress]o-[Result] - [<abstract>SupabaseObjectFunctions]<:-[SubjectProgress] - - [StudyInvite - | - <static>+tableName: String; - +code: String; - +studyId: String; - +preselectedInterventionIds: List<String>?; - +primaryKeys: Map<String, dynamic> - | - +Map<String, dynamic> toJson() - ] - - [<abstract>SupabaseObjectFunctions]<:-[StudyInvite] - - [StudyUUser - | - <static>+tableName: String; - +id: String; - +email: String; - +preferences: Preferences; - +primaryKeys: Map<String, dynamic> - | - +Map<String, dynamic> toJson() - ] - - [StudyUUser]o-[Preferences] - [<abstract>SupabaseObjectFunctions]<:-[StudyUUser] - - [Preferences - | - +language: String; - +pinnedStudies: Set<String> - | - +Map<String, dynamic> toJson() - ] - - [Repo - | - <static>+tableName: String; - +projectId: String; - +userId: String; - +studyId: String; - +provider: GitProvider; - +webUrl: String?; - +gitUrl: String?; - +primaryKeys: Map<String, dynamic> - | - +Map<String, dynamic> toJson() - ] - - [Repo]o-[GitProvider] - [<abstract>SupabaseObjectFunctions]<:-[Repo] - - [GitProvider - | - +index: int; - <static>+values: List<GitProvider>; - <static>+gitlab: GitProvider - ] - - [GitProvider]o-[GitProvider] - [Enum]<:--[GitProvider] - - [StudySubject - | - <static>+tableName: String; - -_controller: StreamController<StudySubject>; - +id: String; - +studyId: String; - +userId: String; - +startedAt: DateTime?; - +selectedInterventionIds: List<String>; - +inviteCode: String?; - +isDeleted: bool; - +study: Study; - +progress: List<SubjectProgress>; - +primaryKeys: Map<String, dynamic>; - +interventionOrder: List<String>; - +selectedInterventions: List<Intervention>; - +daysPerIntervention: int; - +minimumStudyLengthCompleted: bool; - +completedStudy: bool; - +onSave: Stream<StudySubject>; - +hashCode: int - | - +Map<String, dynamic> toJson(); - +dynamic addResult(); - +Map<DateTime, List<SubjectProgress>> getResultsByDate(); - +DateTime endDate(); - +int getDayOfStudyFor(); - +int getInterventionIndexForDate(); - +Intervention? getInterventionForDate(); - +List<Intervention> getInterventionsInOrder(); - +DateTime startOfPhase(); - +DateTime dayAfterEndOfPhase(); - +List<SubjectProgress> resultsFor(); - +int completedForPhase(); - +int daysLeftForPhase(); - +double percentCompletedForPhase(); - +double percentMissedForPhase(); - +List<SubjectProgress> getTaskProgressForDay(); - +bool completedTaskInstanceForDay(); - +bool completedTaskForDay(); - +int completedTasksFor(); - +bool allTasksCompletedFor(); - +int totalTaskCountFor(); - +List<TaskInstance> scheduleFor(); - +dynamic setStartDateBackBy(); - +dynamic save(); - +Map<String, dynamic> toFullJson(); - +dynamic deleteProgress(); - +dynamic delete(); - +dynamic softDelete(); - <static>+dynamic getStudyHistory(); - +bool ==(); - +String toString() - ] - - [StudySubject]o-[StreamController] - [StudySubject]o-[Study] - [StudySubject]o-[Stream] - [<abstract>SupabaseObjectFunctions]<:-[StudySubject] - - [<abstract>InterventionTask - | - <static>+taskTypes: Map<String, InterventionTask Function(Map<String, dynamic>)> - ] - - [<abstract>Task]<:-[<abstract>InterventionTask] - - [Intervention - | - +id: String; - +name: String?; - +description: String?; - +icon: String; - +tasks: List<InterventionTask> - | - +Map<String, dynamic> toJson(); - +bool isBaseline() - ] - - [CheckmarkTask - | - <static>+taskType: String - | - +Map<String, dynamic> toJson(); - +Map<DateTime, T> extractPropertyResults(); - +Map<String, Type> getAvailableProperties(); - +String? getHumanReadablePropertyName() - ] - - [<abstract>InterventionTask]<:-[CheckmarkTask] - - [Contact - | - +organization: String; - +institutionalReviewBoard: String?; - +institutionalReviewBoardNumber: String?; - +researchers: String?; - +email: String; - +website: String; - +phone: String; - +additionalInfo: String? - | - +Map<String, dynamic> toJson(); - +String toString() - ] - - [<abstract>SupabaseObject - | - +primaryKeys: Map<String, dynamic> - | - +Map<String, dynamic> toJson() - ] - - [<abstract>SupabaseObjectFunctions - | - <static>+T fromJson(); - +dynamic delete(); - +dynamic save() - ] - - [<abstract>SupabaseObject]<:--[<abstract>SupabaseObjectFunctions] - - [SupabaseQuery - | - <static>+dynamic getAll(); - <static>+dynamic getById(); - <static>+dynamic batchUpsert(); - <static>+List<T> extractSupabaseList(); - <static>+T extractSupabaseSingleRow(); - <static>+void catchSupabaseException() - ] - - [Analytics - | - <static>+logger: Logger; - <static>+onLog: StreamSubscription<LogRecord> - | - <static>+void init(); - <static>+void dispose(); - <static>+dynamic captureEvent(); - <static>+dynamic captureException(); - <static>+dynamic captureMessage(); - <static>+void addBreadcrumb() - ] - - [Analytics]o-[Logger] - [Analytics]o-[StreamSubscription] - - [StudyUAnalytics - | - +enabled: bool; - +dsn: String; - +samplingRate: double?; - <static>+keyStudyUAnalytics: String - | - +Map<String, dynamic> toJson() - ] - - - + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - DataReference - - - - - - +task: String - +property: String - - - - - - +Map<String, dynamic> toJson() - +String toString() - +Map<DateTime, T> retrieveFromResults() - - - - - - - - - - - - - AverageSection - - - - - - <static>+sectionType: String - +aggregate: TemporalAggregation? - +resultProperty: DataReference<num>? - - - - - - +Map<String, dynamic> toJson() - - - - - - - - - - - - TemporalAggregation - - - - - - +index: int - <static>+values: List<TemporalAggregation> - <static>+day: TemporalAggregation - <static>+phase: TemporalAggregation - <static>+intervention: TemporalAggregation - - - - - - - - - - - - - ReportSection - - - - - - <static>+sectionTypes: Map<String, ReportSection Function(Map<String, dynamic>)> - <static>+keyType: String - +type: String - +id: String - +title: String? - +description: String? - - - - - - +Map<String, dynamic> toJson() - +String toString() - - - - - - - - - - - - - LinearRegressionSection - - - - - - <static>+sectionType: String - +resultProperty: DataReference<num>? - +alpha: double - +improvement: ImprovementDirection? - - - - - - +Map<String, dynamic> toJson() - - - - - - - - - - - - ImprovementDirection - - - - - - +index: int - <static>+values: List<ImprovementDirection> - <static>+positive: ImprovementDirection - <static>+negative: ImprovementDirection - - - - - - - - - - - Enum - - - - - - - - - - - - - ReportSpecification - - - - - - +primary: ReportSection? - +secondary: List<ReportSection> - - - - - - +Map<String, dynamic> toJson() - +String toString() - - - - - - - - - - - - - NotExpression - - - - - - <static>+expressionType: String - +expression: Expression - - - - - - +Map<String, dynamic> toJson() - +bool? evaluate() - - - - - - - - - - - - - Expression - - - - - - <static>+expressionTypes: Map<String, Expression Function(Map<String, dynamic>)> - <static>+keyType: String - +type: String? - - - - - - +Map<String, dynamic> toJson() - +String toString() - +bool? evaluate() - - - - - - - - - - - - - BooleanExpression - - - - - - <static>+expressionType: String - - - - - - +Map<String, dynamic> toJson() - +bool checkValue() - - - - - - - - - - - - - ValueExpression - - - - - - <static>+expressionType: String - +target: String? - - - - - - +bool checkValue() - +bool? evaluate() - - - - - - - - - - - - - ChoiceExpression - - - - - - <static>+expressionType: String - +choices: Set<dynamic> - - - - - - +Map<String, dynamic> toJson() - +bool checkValue() - - - - - - - - - - - - - StudyResult - - - - - - <static>+studyResultTypes: Map<String, StudyResult Function(Map<String, dynamic>)> - <static>+keyType: String - +type: String - +id: String - +filename: String - - - - - - +Map<String, dynamic> toJson() - +List<String> getHeaders() - +List<dynamic> getValues() - - - - - - - - - - - - - InterventionResult - - - - - - <static>+studyResultType: String - - - - - - +Map<String, dynamic> toJson() - +List<String> getHeaders() - +List<dynamic> getValues() - - - - - - - - - - - - - NumericResult - - - - - - <static>+studyResultType: String - +resultProperty: DataReference<num> - - - - - - +Map<String, dynamic> toJson() - +List<String> getHeaders() - +List<dynamic> getValues() - - - - - - - - - - - - - ConsentItem - - - - - - +id: String - +title: String? - +description: String? - +iconName: String - - - - - - +Map<String, dynamic> toJson() - +String toString() - - - - - - - - - - - - - QuestionConditional - - - - - - <static>+keyDefaultValue: String - +defaultValue: V? - +condition: Expression - - - - - - <static>-QuestionConditional<V> _fromJson() - +Map<String, dynamic> toJson() - - - - - - - - - - - - - Question - - - - - - <static>+questionTypes: Map<String, Question<dynamic> Function(Map<String, dynamic>)> - <static>+keyType: String - +type: String - +id: String - +prompt: String? - +rationale: String? - <static>+keyConditional: String - +conditional: QuestionConditional<V>? - - - - - - +Map<String, dynamic> toJson() - +bool shouldBeShown() - +Answer<V>? getDefaultAnswer() - +Type getAnswerType() - +String toString() - - - - - - - - - - - - - ChoiceQuestion - - - - - - <static>+questionType: String - +multiple: bool - +choices: List<Choice> - - - - - - +Map<String, dynamic> toJson() - +Answer<List<String>> constructAnswer() - - - - - - - - - - - - - Choice - - - - - - +id: String - +text: String - - - - - - +Map<String, dynamic> toJson() - +String toString() - - - - - - - - - - - - - BooleanQuestion - - - - - - <static>+questionType: String - - - - - - +Map<String, dynamic> toJson() - +Answer<bool> constructAnswer() - - - - - - - - - - - - - SliderQuestion - - - - - - +minimum: double - +maximum: double - -_initial: double - +step: double - +initial: double - - - - - - +Answer<num> constructAnswer() - - - - - - - - - - - - - ScaleQuestion - - - - - - <static>+questionType: String - +annotations: List<Annotation> - +minColor: int? - +maxColor: int? - -_step: double - +step: double - +isAutostep: bool - +autostep: int - +annotationsSorted: List<Annotation> - +minAnnotation: Annotation? - +maxAnnotation: Annotation? - +minLabel: String? - +maxLabel: String? - +midAnnotations: List<Annotation> - +midLabels: List<String> - +midValues: List<double> - +values: List<double> - +minimumAnnotation: String - +maximumAnnotation: String - +maximumColor: int - +minimumColor: int - - - - - - +Map<String, dynamic> toJson() - +Annotation addAnnotation() - -void _setAnnotationLabel() - <static>+int getAutostepSize() - <static>+List<int> generateMidValues() - - - - - - - - - - - - - Annotation - - - - - - +value: int - +annotation: String - - - - - - +Map<String, dynamic> toJson() - - - - - - - - - - - - - AnnotatedScaleQuestion - - - - - - <static>+questionType: String - +annotations: List<Annotation> - - - - - - +Map<String, dynamic> toJson() - - - - - - - - - - - - - VisualAnalogueQuestion - - - - - - <static>+questionType: String - +minimumColor: int - +maximumColor: int - +minimumAnnotation: String - +maximumAnnotation: String - - - - - - +Map<String, dynamic> toJson() - - - - - - - - - - - - - Answer - - - - - - +question: String - +timestamp: DateTime - <static>+keyResponse: String - +response: V - - - - - - +Map<String, dynamic> toJson() - <static>+Answer<dynamic> fromJson() - +String toString() - - - - - - - - - - - - - StudyUQuestionnaire - - - - - - +questions: List<Question<dynamic>> - - - - - - +List<dynamic> toJson() - - - - - - - - - - - - - EligibilityCriterion - - - - - - +id: String - +reason: String? - +condition: Expression - - - - - - +Map<String, dynamic> toJson() - +bool isSatisfied() - +bool isViolated() - - - - - - - - - - - - - StudySchedule - - - - - - <static>+numberOfInterventions: int - +numberOfCycles: int - +phaseDuration: int - +includeBaseline: bool - +sequence: PhaseSequence - +sequenceCustom: String - +length: int - +nameOfSequence: String - - - - - - +Map<String, dynamic> toJson() - +int getNumberOfPhases() - +List<int> generateWith() - -int _nextIntervention() - -List<int> _generateCycle() - -List<int> _generateAlternatingCycle() - -List<int> _generateCounterBalancedCycle() - -List<int> _generateRandomizedCycle() - -List<int> _generateCustomizedCycle() - +String toString() - - - - - - - - - - - - PhaseSequence - - - - - - +index: int - <static>+values: List<PhaseSequence> - <static>+alternating: PhaseSequence - <static>+counterBalanced: PhaseSequence - <static>+randomized: PhaseSequence - <static>+customized: PhaseSequence - - - - - - - - - - - - - QuestionnaireTask - - - - - - <static>+taskType: String - +questions: StudyUQuestionnaire - - - - - - +Map<String, dynamic> toJson() - +Map<DateTime, T> extractPropertyResults() - +Map<String, Type> getAvailableProperties() - +String? getHumanReadablePropertyName() - - - - - - - - - - - - Observation - - - - - - <static>+taskTypes: Map<String, Observation Function(Map<String, dynamic>)> - - - - - - - - - - - - - Task - - - - - - <static>+keyType: String - +type: String - +id: String - +title: String? - +header: String? - +footer: String? - +schedule: Schedule - - - - - - +Map<String, dynamic> toJson() - +String toString() - +Map<DateTime, T> extractPropertyResults() - +Map<String, Type> getAvailableProperties() - +String? getHumanReadablePropertyName() - - - - - - - - - - - - - Schedule - - - - - - +completionPeriods: List<CompletionPeriod> - +reminders: List<StudyUTimeOfDay> - - - - - - +Map<String, dynamic> toJson() - +String toString() - - - - - - - - - - - - - CompletionPeriod - - - - - - +id: String - +unlockTime: StudyUTimeOfDay - +lockTime: StudyUTimeOfDay - - - - - - +Map<String, dynamic> toJson() - +String formatted() - +String toString() - +bool contains() - - - - - - - - - - - - - StudyUTimeOfDay - - - - - - +hour: int - +minute: int - - - - - - +String toJson() - +String toString() - +bool earlierThan() - - - - - - - - - - - - - TaskInstance - - - - - - +task: Task - +id: String - +completionPeriod: CompletionPeriod - - - - - - <static>-Task _taskFromStudy() - <static>-Task _taskFromSubject() - - - - - - - - - - - - - Result - - - - - - <static>+keyType: String - +type: String - +periodId: String? - <static>+keyResult: String - +result: T - - - - - - +Map<String, dynamic> toJson() - <static>-Result<dynamic> _fromJson() - - - - - - - - - - - - - Study - - - - - - <static>+tableName: String - <static>+baselineID: String - +id: String - +title: String? - +description: String? - +userId: String - +participation: Participation - +resultSharing: ResultSharing - +contact: Contact - +iconName: String - +published: bool - +questionnaire: StudyUQuestionnaire - +eligibilityCriteria: List<EligibilityCriterion> - +consent: List<ConsentItem> - +interventions: List<Intervention> - +observations: List<Observation> - +schedule: StudySchedule - +reportSpecification: ReportSpecification - +results: List<StudyResult> - +collaboratorEmails: List<String> - +registryPublished: bool - +participantCount: int - +endedCount: int - +activeSubjectCount: int - +missedDays: List<int> - +repo: Repo? - +invites: List<StudyInvite>? - +participants: List<StudySubject>? - +participantsProgress: List<SubjectProgress>? - +createdAt: DateTime? - +primaryKeys: Map<String, dynamic> - +hasEligibilityCheck: bool - +hasConsentCheck: bool - +totalMissedDays: int - +percentageMissedDays: double - +status: StudyStatus - +isDraft: bool - +isRunning: bool - +isClosed: bool - - - - - - +Map<String, dynamic> toJson() - <static>+dynamic getResearcherDashboardStudies() - <static>+dynamic publishedPublicStudies() - +bool isOwner() - +bool isEditor() - +bool canEdit() - <static>+dynamic fetchResultsCSVTable() - +bool isReadonly() - +String toString() - +int compareTo() - - - - - - - - - - - - Participation - - - - - - +index: int - <static>+values: List<Participation> - <static>+open: Participation - <static>+invite: Participation - - - - - - - - - - - - ResultSharing - - - - - - +index: int - <static>+values: List<ResultSharing> - <static>+public: ResultSharing - <static>+private: ResultSharing - <static>+organization: ResultSharing - - - - - - - - - - - - - Contact - - - - - - +organization: String - +institutionalReviewBoard: String? - +institutionalReviewBoardNumber: String? - +researchers: String? - +email: String - +website: String - +phone: String - +additionalInfo: String? - - - - - - +Map<String, dynamic> toJson() - +String toString() - - - - - - - - - - - - - Repo - - - - - - <static>+tableName: String - +projectId: String - +userId: String - +studyId: String - +provider: GitProvider - +webUrl: String? - +gitUrl: String? - +primaryKeys: Map<String, dynamic> - - - - - - +Map<String, dynamic> toJson() - - - - - - - - - - - - StudyStatus - - - - - - +index: int - <static>+values: List<StudyStatus> - <static>+draft: StudyStatus - <static>+running: StudyStatus - <static>+closed: StudyStatus - - - - - - - - - - - - SupabaseObjectFunctions - - - - - - <static>+T fromJson() - +dynamic delete() - +dynamic save() - - - - - - - - - - - Comparable - - - - - - - - - - - - - AppConfig - - - - - - <static>+tableName: String - +id: String - +contact: Contact - +appPrivacy: Map<String, String> - +appTerms: Map<String, String> - +designerPrivacy: Map<String, String> - +designerTerms: Map<String, String> - +imprint: Map<String, String> - +analytics: StudyUAnalytics - +primaryKeys: Map<String, dynamic> - - - - - - +Map<String, dynamic> toJson() - <static>+dynamic getAppConfig() - <static>+dynamic getAppContact() - - - - - - - - - - - - - StudyUAnalytics - - - - - - +enabled: bool - +dsn: String - +samplingRate: double? - <static>+keyStudyUAnalytics: String - - - - - - +Map<String, dynamic> toJson() - - - - - - - - - - - - - SubjectProgress - - - - - - <static>+tableName: String - +completedAt: DateTime? - +subjectId: String - +interventionId: String - +taskId: String - +resultType: String - +result: Result<dynamic> - +startedAt: DateTime? - +primaryKeys: Map<String, dynamic> - +hashCode: int - - - - - - +Map<String, dynamic> toJson() - +SubjectProgress setStartDateBackBy() - +bool ==() - - - - - - - - - - - - - StudyInvite - - - - - - <static>+tableName: String - +code: String - +studyId: String - +preselectedInterventionIds: List<String>? - +primaryKeys: Map<String, dynamic> - - - - - - +Map<String, dynamic> toJson() - - - - - - - - - - - - - StudyUUser - - - - - - <static>+tableName: String - +id: String - +email: String - +preferences: Preferences - +primaryKeys: Map<String, dynamic> - - - - - - +Map<String, dynamic> toJson() - - - - - - - - - - - - - Preferences - - - - - - +language: String - +pinnedStudies: Set<String> - - - - - - +Map<String, dynamic> toJson() - - - - - - - - - - - - GitProvider - - - - - - +index: int - <static>+values: List<GitProvider> - <static>+gitlab: GitProvider - - - - - - - - - - - - - StudySubject - - - - - - <static>+tableName: String - -_controller: StreamController<StudySubject> - +id: String - +studyId: String - +userId: String - +startedAt: DateTime? - +selectedInterventionIds: List<String> - +inviteCode: String? - +isDeleted: bool - +study: Study - +progress: List<SubjectProgress> - +primaryKeys: Map<String, dynamic> - +interventionOrder: List<String> - +selectedInterventions: List<Intervention> - +daysPerIntervention: int - +minimumStudyLengthCompleted: bool - +completedStudy: bool - +onSave: Stream<StudySubject> - +hashCode: int - - - - - - +Map<String, dynamic> toJson() - +dynamic addResult() - +Map<DateTime, List<SubjectProgress>> getResultsByDate() - +DateTime endDate() - +int getDayOfStudyFor() - +int getInterventionIndexForDate() - +Intervention? getInterventionForDate() - +List<Intervention> getInterventionsInOrder() - +DateTime startOfPhase() - +DateTime dayAfterEndOfPhase() - +List<SubjectProgress> resultsFor() - +int completedForPhase() - +int daysLeftForPhase() - +double percentCompletedForPhase() - +double percentMissedForPhase() - +List<SubjectProgress> getTaskProgressForDay() - +bool completedTaskInstanceForDay() - +bool completedTaskForDay() - +int completedTasksFor() - +bool allTasksCompletedFor() - +int totalTaskCountFor() - +List<TaskInstance> scheduleFor() - +dynamic setStartDateBackBy() - +dynamic save() - +Map<String, dynamic> toFullJson() - +dynamic deleteProgress() - +dynamic delete() - +dynamic softDelete() - <static>+dynamic getStudyHistory() - +bool ==() - +String toString() - - - - - - - - - - - StreamController - - - - - - - - - - - Stream - - - - - - - - - - - - InterventionTask - - - - - - <static>+taskTypes: Map<String, InterventionTask Function(Map<String, dynamic>)> - - - - - - - - - - - - - Intervention - - - - - - +id: String - +name: String? - +description: String? - +icon: String - +tasks: List<InterventionTask> - - - - - - +Map<String, dynamic> toJson() - +bool isBaseline() - - - - - - - - - - - - - CheckmarkTask - - - - - - <static>+taskType: String - - - - - - +Map<String, dynamic> toJson() - +Map<DateTime, T> extractPropertyResults() - +Map<String, Type> getAvailableProperties() - +String? getHumanReadablePropertyName() - - - - - - - - - - - - - SupabaseObject - - - - - - +primaryKeys: Map<String, dynamic> - - - - - - +Map<String, dynamic> toJson() - - - - - - - - - - - - SupabaseQuery - - - - - - <static>+dynamic getAll() - <static>+dynamic getById() - <static>+dynamic batchUpsert() - <static>+List<T> extractSupabaseList() - <static>+T extractSupabaseSingleRow() - <static>+void catchSupabaseException() - - - - - - - - - - - - - Analytics - - - - - - <static>+logger: Logger - <static>+onLog: StreamSubscription<LogRecord> - - - - - - <static>+void init() - <static>+void dispose() - <static>+dynamic captureEvent() - <static>+dynamic captureException() - <static>+dynamic captureMessage() - <static>+void addBreadcrumb() - - - - - - - - - - - Logger - - - - - - - - - - - StreamSubscription - - - - - + diff --git a/docs/uml/core/lib/uml.svg b/docs/uml/core/lib/uml.svg index 2e673cef6..32b5afd1e 100644 --- a/docs/uml/core/lib/uml.svg +++ b/docs/uml/core/lib/uml.svg @@ -1,2968 +1,11 @@ - - [DataReference - | - +task: String; - +property: String - | - +Map<String, dynamic> toJson(); - +String toString(); - +Map<DateTime, T> retrieveFromResults() - ] - - [AverageSection - | - <static>+sectionType: String; - +aggregate: TemporalAggregation?; - +resultProperty: DataReference<num>? - | - +Map<String, dynamic> toJson() - ] - - [AverageSection]o-[TemporalAggregation] - [AverageSection]o-[DataReference] - [<abstract>ReportSection]<:-[AverageSection] - - [LinearRegressionSection - | - <static>+sectionType: String; - +resultProperty: DataReference<num>?; - +alpha: double; - +improvement: ImprovementDirection? - | - +Map<String, dynamic> toJson() - ] - - [LinearRegressionSection]o-[DataReference] - [LinearRegressionSection]o-[ImprovementDirection] - [<abstract>ReportSection]<:-[LinearRegressionSection] - - [ImprovementDirection - | - +index: int; - <static>+values: List<ImprovementDirection>; - <static>+positive: ImprovementDirection; - <static>+negative: ImprovementDirection - ] - - [ImprovementDirection]o-[ImprovementDirection] - [Enum]<:--[ImprovementDirection] - - [TemporalAggregation - | - +index: int; - <static>+values: List<TemporalAggregation>; - <static>+day: TemporalAggregation; - <static>+phase: TemporalAggregation; - <static>+intervention: TemporalAggregation - ] - - [TemporalAggregation]o-[TemporalAggregation] - [Enum]<:--[TemporalAggregation] - - [ReportSpecification - | - +primary: ReportSection?; - +secondary: List<ReportSection> - | - +Map<String, dynamic> toJson(); - +String toString() - ] - - [ReportSpecification]o-[<abstract>ReportSection] - - [<abstract>ReportSection - | - <static>+sectionTypes: Map<String, ReportSection Function(Map<String, dynamic>)>; - <static>+keyType: String; - +type: String; - +id: String; - +title: String?; - +description: String? - | - +Map<String, dynamic> toJson(); - +String toString() - ] - - [NotExpression - | - <static>+expressionType: String; - +expression: Expression - | - +Map<String, dynamic> toJson(); - +bool? evaluate() - ] - - [NotExpression]o-[<abstract>Expression] - [<abstract>Expression]<:-[NotExpression] - - [BooleanExpression - | - <static>+expressionType: String - | - +Map<String, dynamic> toJson(); - +bool checkValue() - ] - - [<abstract>ValueExpression]<:-[BooleanExpression] - - [<abstract>ValueExpression - | - <static>+expressionType: String; - +target: String? - | - +bool checkValue(); - +bool? evaluate() - ] - - [<abstract>Expression]<:-[<abstract>ValueExpression] - - [ChoiceExpression - | - <static>+expressionType: String; - +choices: Set<dynamic> - | - +Map<String, dynamic> toJson(); - +bool checkValue() - ] - - [<abstract>ValueExpression]<:-[ChoiceExpression] - - [<abstract>Expression - | - <static>+expressionTypes: Map<String, Expression Function(Map<String, dynamic>)>; - <static>+keyType: String; - +type: String? - | - +Map<String, dynamic> toJson(); - +String toString(); - +bool? evaluate() - ] - - [<abstract>StudyResult - | - <static>+studyResultTypes: Map<String, StudyResult Function(Map<String, dynamic>)>; - <static>+keyType: String; - +type: String; - +id: String; - +filename: String - | - +Map<String, dynamic> toJson(); - +List<String> getHeaders(); - +List<dynamic> getValues() - ] - - [InterventionResult - | - <static>+studyResultType: String - | - +Map<String, dynamic> toJson(); - +List<String> getHeaders(); - +List<dynamic> getValues() - ] - - [<abstract>StudyResult]<:-[InterventionResult] - - [NumericResult - | - <static>+studyResultType: String; - +resultProperty: DataReference<num> - | - +Map<String, dynamic> toJson(); - +List<String> getHeaders(); - +List<dynamic> getValues() - ] - - [NumericResult]o-[DataReference] - [<abstract>StudyResult]<:-[NumericResult] - - [ConsentItem - | - +id: String; - +title: String?; - +description: String?; - +iconName: String - | - +Map<String, dynamic> toJson(); - +String toString() - ] - - [QuestionConditional - | - <static>+keyDefaultValue: String; - +defaultValue: V?; - +condition: Expression - | - <static>-QuestionConditional<V> _fromJson(); - +Map<String, dynamic> toJson() - ] - - [QuestionConditional]o-[<abstract>Expression] - - [<abstract>Question - | - <static>+questionTypes: Map<String, Question<dynamic> Function(Map<String, dynamic>)>; - <static>+keyType: String; - +type: String; - +id: String; - +prompt: String?; - +rationale: String?; - <static>+keyConditional: String; - +conditional: QuestionConditional<V>? - | - +Map<String, dynamic> toJson(); - +bool shouldBeShown(); - +Answer<V>? getDefaultAnswer(); - +Type getAnswerType(); - +String toString() - ] - - [<abstract>Question]o-[QuestionConditional] - - [ChoiceQuestion - | - <static>+questionType: String; - +multiple: bool; - +choices: List<Choice> - | - +Map<String, dynamic> toJson(); - +Answer<List<String>> constructAnswer() - ] - - [<abstract>Question]<:-[ChoiceQuestion] - - [Choice - | - +id: String; - +text: String - | - +Map<String, dynamic> toJson(); - +String toString() - ] - - [BooleanQuestion - | - <static>+questionType: String - | - +Map<String, dynamic> toJson(); - +Answer<bool> constructAnswer() - ] - - [<abstract>Question]<:-[BooleanQuestion] - - [<abstract>SliderQuestion - | - +minimum: double; - +maximum: double; - -_initial: double; - +step: double; - +initial: double - | - +Answer<num> constructAnswer() - ] - - [<abstract>Question]<:-[<abstract>SliderQuestion] - - [ScaleQuestion - | - <static>+questionType: String; - +annotations: List<Annotation>; - +minColor: int?; - +maxColor: int?; - -_step: double; - +step: double; - +isAutostep: bool; - +autostep: int; - +annotationsSorted: List<Annotation>; - +minAnnotation: Annotation?; - +maxAnnotation: Annotation?; - +minLabel: String?; - +maxLabel: String?; - +midAnnotations: List<Annotation>; - +midLabels: List<String>; - +midValues: List<double>; - +values: List<double>; - +minimumAnnotation: String; - +maximumAnnotation: String; - +maximumColor: int; - +minimumColor: int - | - +Map<String, dynamic> toJson(); - +Annotation addAnnotation(); - -void _setAnnotationLabel(); - <static>+int getAutostepSize(); - <static>+List<int> generateMidValues() - ] - - [ScaleQuestion]o-[Annotation] - [<abstract>SliderQuestion]<:-[ScaleQuestion] - [AnnotatedScaleQuestion]<:--[ScaleQuestion] - [VisualAnalogueQuestion]<:--[ScaleQuestion] - - [AnnotatedScaleQuestion - | - <static>+questionType: String; - +annotations: List<Annotation> - | - +Map<String, dynamic> toJson() - ] - - [<abstract>SliderQuestion]<:-[AnnotatedScaleQuestion] - - [Annotation - | - +value: int; - +annotation: String - | - +Map<String, dynamic> toJson() - ] - - [VisualAnalogueQuestion - | - <static>+questionType: String; - +minimumColor: int; - +maximumColor: int; - +minimumAnnotation: String; - +maximumAnnotation: String - | - +Map<String, dynamic> toJson() - ] - - [<abstract>SliderQuestion]<:-[VisualAnalogueQuestion] - - [Answer - | - +question: String; - +timestamp: DateTime; - <static>+keyResponse: String; - +response: V - | - +Map<String, dynamic> toJson(); - <static>+Answer<dynamic> fromJson(); - +String toString() - ] - - [StudyUQuestionnaire - | - +questions: List<Question<dynamic>> - | - +List<dynamic> toJson() - ] - - [EligibilityCriterion - | - +id: String; - +reason: String?; - +condition: Expression - | - +Map<String, dynamic> toJson(); - +bool isSatisfied(); - +bool isViolated() - ] - - [EligibilityCriterion]o-[<abstract>Expression] - - [StudySchedule - | - <static>+numberOfInterventions: int; - +numberOfCycles: int; - +phaseDuration: int; - +includeBaseline: bool; - +sequence: PhaseSequence; - +sequenceCustom: String; - +length: int; - +nameOfSequence: String - | - +Map<String, dynamic> toJson(); - +int getNumberOfPhases(); - +List<int> generateWith(); - -int _nextIntervention(); - -List<int> _generateCycle(); - -List<int> _generateAlternatingCycle(); - -List<int> _generateCounterBalancedCycle(); - -List<int> _generateRandomizedCycle(); - -List<int> _generateCustomizedCycle(); - +String toString() - ] - - [StudySchedule]o-[PhaseSequence] - - [PhaseSequence - | - +index: int; - <static>+values: List<PhaseSequence>; - <static>+alternating: PhaseSequence; - <static>+counterBalanced: PhaseSequence; - <static>+randomized: PhaseSequence; - <static>+customized: PhaseSequence - ] - - [PhaseSequence]o-[PhaseSequence] - [Enum]<:--[PhaseSequence] - - [QuestionnaireTask - | - <static>+taskType: String; - +questions: StudyUQuestionnaire - | - +Map<String, dynamic> toJson(); - +Map<DateTime, T> extractPropertyResults(); - +Map<String, Type> getAvailableProperties(); - +String? getHumanReadablePropertyName() - ] - - [QuestionnaireTask]o-[StudyUQuestionnaire] - [<abstract>Observation]<:-[QuestionnaireTask] - - [<abstract>Observation - | - <static>+taskTypes: Map<String, Observation Function(Map<String, dynamic>)> - ] - - [<abstract>Task]<:-[<abstract>Observation] - - [Schedule - | - +completionPeriods: List<CompletionPeriod>; - +reminders: List<StudyUTimeOfDay> - | - +Map<String, dynamic> toJson(); - +String toString() - ] - - [CompletionPeriod - | - +id: String; - +unlockTime: StudyUTimeOfDay; - +lockTime: StudyUTimeOfDay - | - +Map<String, dynamic> toJson(); - +String formatted(); - +String toString(); - +bool contains() - ] - - [CompletionPeriod]o-[StudyUTimeOfDay] - - [StudyUTimeOfDay - | - +hour: int; - +minute: int - | - +String toJson(); - +String toString(); - +bool earlierThan() - ] - - [TaskInstance - | - +task: Task; - +id: String; - +completionPeriod: CompletionPeriod - | - <static>-Task _taskFromStudy(); - <static>-Task _taskFromSubject() - ] - - [TaskInstance]o-[<abstract>Task] - [TaskInstance]o-[CompletionPeriod] - - [<abstract>Task - | - <static>+keyType: String; - +type: String; - +id: String; - +title: String?; - +header: String?; - +footer: String?; - +schedule: Schedule - | - +Map<String, dynamic> toJson(); - +String toString(); - +Map<DateTime, T> extractPropertyResults(); - +Map<String, Type> getAvailableProperties(); - +String? getHumanReadablePropertyName() - ] - - [<abstract>Task]o-[Schedule] - - [Result - | - <static>+keyType: String; - +type: String; - +periodId: String?; - <static>+keyResult: String; - +result: T - | - +Map<String, dynamic> toJson(); - <static>-Result<dynamic> _fromJson() - ] - - [Study - | - <static>+tableName: String; - <static>+baselineID: String; - +id: String; - +title: String?; - +description: String?; - +userId: String; - +participation: Participation; - +resultSharing: ResultSharing; - +contact: Contact; - +iconName: String; - +published: bool; - +questionnaire: StudyUQuestionnaire; - +eligibilityCriteria: List<EligibilityCriterion>; - +consent: List<ConsentItem>; - +interventions: List<Intervention>; - +observations: List<Observation>; - +schedule: StudySchedule; - +reportSpecification: ReportSpecification; - +results: List<StudyResult>; - +collaboratorEmails: List<String>; - +registryPublished: bool; - +participantCount: int; - +endedCount: int; - +activeSubjectCount: int; - +missedDays: List<int>; - +repo: Repo?; - +invites: List<StudyInvite>?; - +participants: List<StudySubject>?; - +participantsProgress: List<SubjectProgress>?; - +createdAt: DateTime?; - +primaryKeys: Map<String, dynamic>; - +hasEligibilityCheck: bool; - +hasConsentCheck: bool; - +totalMissedDays: int; - +percentageMissedDays: double; - +status: StudyStatus; - +isDraft: bool; - +isRunning: bool; - +isClosed: bool - | - +Map<String, dynamic> toJson(); - <static>+dynamic getResearcherDashboardStudies(); - <static>+dynamic publishedPublicStudies(); - +bool isOwner(); - +bool isEditor(); - +bool canEdit(); - <static>+dynamic fetchResultsCSVTable(); - +bool isReadonly(); - +String toString(); - +int compareTo() - ] - - [Study]o-[Participation] - [Study]o-[ResultSharing] - [Study]o-[Contact] - [Study]o-[StudyUQuestionnaire] - [Study]o-[StudySchedule] - [Study]o-[ReportSpecification] - [Study]o-[Repo] - [Study]o-[StudyStatus] - [<abstract>SupabaseObjectFunctions]<:-[Study] - [Comparable]<:--[Study] - - [StudyStatus - | - +index: int; - <static>+values: List<StudyStatus>; - <static>+draft: StudyStatus; - <static>+running: StudyStatus; - <static>+closed: StudyStatus - ] - - [StudyStatus]o-[StudyStatus] - [Enum]<:--[StudyStatus] - - [Participation - | - +index: int; - <static>+values: List<Participation>; - <static>+open: Participation; - <static>+invite: Participation - ] - - [Participation]o-[Participation] - [Enum]<:--[Participation] - - [ResultSharing - | - +index: int; - <static>+values: List<ResultSharing>; - <static>+public: ResultSharing; - <static>+private: ResultSharing; - <static>+organization: ResultSharing - ] - - [ResultSharing]o-[ResultSharing] - [Enum]<:--[ResultSharing] - - [AppConfig - | - <static>+tableName: String; - +id: String; - +contact: Contact; - +appPrivacy: Map<String, String>; - +appTerms: Map<String, String>; - +designerPrivacy: Map<String, String>; - +designerTerms: Map<String, String>; - +imprint: Map<String, String>; - +analytics: StudyUAnalytics; - +primaryKeys: Map<String, dynamic> - | - +Map<String, dynamic> toJson(); - <static>+dynamic getAppConfig(); - <static>+dynamic getAppContact() - ] - - [AppConfig]o-[Contact] - [AppConfig]o-[StudyUAnalytics] - [<abstract>SupabaseObjectFunctions]<:-[AppConfig] - - [SubjectProgress - | - <static>+tableName: String; - +completedAt: DateTime?; - +subjectId: String; - +interventionId: String; - +taskId: String; - +resultType: String; - +result: Result<dynamic>; - +startedAt: DateTime?; - +primaryKeys: Map<String, dynamic>; - +hashCode: int - | - +Map<String, dynamic> toJson(); - +SubjectProgress setStartDateBackBy(); - +bool ==() - ] - - [SubjectProgress]o-[Result] - [<abstract>SupabaseObjectFunctions]<:-[SubjectProgress] - - [StudyInvite - | - <static>+tableName: String; - +code: String; - +studyId: String; - +preselectedInterventionIds: List<String>?; - +primaryKeys: Map<String, dynamic> - | - +Map<String, dynamic> toJson() - ] - - [<abstract>SupabaseObjectFunctions]<:-[StudyInvite] - - [StudyUUser - | - <static>+tableName: String; - +id: String; - +email: String; - +preferences: Preferences; - +primaryKeys: Map<String, dynamic> - | - +Map<String, dynamic> toJson() - ] - - [StudyUUser]o-[Preferences] - [<abstract>SupabaseObjectFunctions]<:-[StudyUUser] - - [Preferences - | - +language: String; - +pinnedStudies: Set<String> - | - +Map<String, dynamic> toJson() - ] - - [Repo - | - <static>+tableName: String; - +projectId: String; - +userId: String; - +studyId: String; - +provider: GitProvider; - +webUrl: String?; - +gitUrl: String?; - +primaryKeys: Map<String, dynamic> - | - +Map<String, dynamic> toJson() - ] - - [Repo]o-[GitProvider] - [<abstract>SupabaseObjectFunctions]<:-[Repo] - - [GitProvider - | - +index: int; - <static>+values: List<GitProvider>; - <static>+gitlab: GitProvider - ] - - [GitProvider]o-[GitProvider] - [Enum]<:--[GitProvider] - - [StudySubject - | - <static>+tableName: String; - -_controller: StreamController<StudySubject>; - +id: String; - +studyId: String; - +userId: String; - +startedAt: DateTime?; - +selectedInterventionIds: List<String>; - +inviteCode: String?; - +isDeleted: bool; - +study: Study; - +progress: List<SubjectProgress>; - +primaryKeys: Map<String, dynamic>; - +interventionOrder: List<String>; - +selectedInterventions: List<Intervention>; - +daysPerIntervention: int; - +minimumStudyLengthCompleted: bool; - +completedStudy: bool; - +onSave: Stream<StudySubject>; - +hashCode: int - | - +Map<String, dynamic> toJson(); - +dynamic addResult(); - +Map<DateTime, List<SubjectProgress>> getResultsByDate(); - +DateTime endDate(); - +int getDayOfStudyFor(); - +int getInterventionIndexForDate(); - +Intervention? getInterventionForDate(); - +List<Intervention> getInterventionsInOrder(); - +DateTime startOfPhase(); - +DateTime dayAfterEndOfPhase(); - +List<SubjectProgress> resultsFor(); - +int completedForPhase(); - +int daysLeftForPhase(); - +double percentCompletedForPhase(); - +double percentMissedForPhase(); - +List<SubjectProgress> getTaskProgressForDay(); - +bool completedTaskInstanceForDay(); - +bool completedTaskForDay(); - +int completedTasksFor(); - +bool allTasksCompletedFor(); - +int totalTaskCountFor(); - +List<TaskInstance> scheduleFor(); - +dynamic setStartDateBackBy(); - +dynamic save(); - +Map<String, dynamic> toFullJson(); - +dynamic deleteProgress(); - +dynamic delete(); - +dynamic softDelete(); - <static>+dynamic getStudyHistory(); - +bool ==(); - +String toString() - ] - - [StudySubject]o-[StreamController] - [StudySubject]o-[Study] - [StudySubject]o-[Stream] - [<abstract>SupabaseObjectFunctions]<:-[StudySubject] - - [<abstract>InterventionTask - | - <static>+taskTypes: Map<String, InterventionTask Function(Map<String, dynamic>)> - ] - - [<abstract>Task]<:-[<abstract>InterventionTask] - - [Intervention - | - +id: String; - +name: String?; - +description: String?; - +icon: String; - +tasks: List<InterventionTask> - | - +Map<String, dynamic> toJson(); - +bool isBaseline() - ] - - [CheckmarkTask - | - <static>+taskType: String - | - +Map<String, dynamic> toJson(); - +Map<DateTime, T> extractPropertyResults(); - +Map<String, Type> getAvailableProperties(); - +String? getHumanReadablePropertyName() - ] - - [<abstract>InterventionTask]<:-[CheckmarkTask] - - [Contact - | - +organization: String; - +institutionalReviewBoard: String?; - +institutionalReviewBoardNumber: String?; - +researchers: String?; - +email: String; - +website: String; - +phone: String; - +additionalInfo: String? - | - +Map<String, dynamic> toJson(); - +String toString() - ] - - [<abstract>SupabaseObject - | - +primaryKeys: Map<String, dynamic> - | - +Map<String, dynamic> toJson() - ] - - [<abstract>SupabaseObjectFunctions - | - <static>+T fromJson(); - +dynamic delete(); - +dynamic save() - ] - - [<abstract>SupabaseObject]<:--[<abstract>SupabaseObjectFunctions] - - [SupabaseQuery - | - <static>+dynamic getAll(); - <static>+dynamic getById(); - <static>+dynamic batchUpsert(); - <static>+List<T> extractSupabaseList(); - <static>+T extractSupabaseSingleRow(); - <static>+void catchSupabaseException() - ] - - [Analytics - | - <static>+logger: Logger; - <static>+onLog: StreamSubscription<LogRecord> - | - <static>+void init(); - <static>+void dispose(); - <static>+dynamic captureEvent(); - <static>+dynamic captureException(); - <static>+dynamic captureMessage(); - <static>+void addBreadcrumb() - ] - - [Analytics]o-[Logger] - [Analytics]o-[StreamSubscription] - - [StudyUAnalytics - | - +enabled: bool; - +dsn: String; - +samplingRate: double?; - <static>+keyStudyUAnalytics: String - | - +Map<String, dynamic> toJson() - ] - - - + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - DataReference - - - - - - +task: String - +property: String - - - - - - +Map<String, dynamic> toJson() - +String toString() - +Map<DateTime, T> retrieveFromResults() - - - - - - - - - - - - - AverageSection - - - - - - <static>+sectionType: String - +aggregate: TemporalAggregation? - +resultProperty: DataReference<num>? - - - - - - +Map<String, dynamic> toJson() - - - - - - - - - - - - TemporalAggregation - - - - - - +index: int - <static>+values: List<TemporalAggregation> - <static>+day: TemporalAggregation - <static>+phase: TemporalAggregation - <static>+intervention: TemporalAggregation - - - - - - - - - - - - - ReportSection - - - - - - <static>+sectionTypes: Map<String, ReportSection Function(Map<String, dynamic>)> - <static>+keyType: String - +type: String - +id: String - +title: String? - +description: String? - - - - - - +Map<String, dynamic> toJson() - +String toString() - - - - - - - - - - - - - LinearRegressionSection - - - - - - <static>+sectionType: String - +resultProperty: DataReference<num>? - +alpha: double - +improvement: ImprovementDirection? - - - - - - +Map<String, dynamic> toJson() - - - - - - - - - - - - ImprovementDirection - - - - - - +index: int - <static>+values: List<ImprovementDirection> - <static>+positive: ImprovementDirection - <static>+negative: ImprovementDirection - - - - - - - - - - - Enum - - - - - - - - - - - - - ReportSpecification - - - - - - +primary: ReportSection? - +secondary: List<ReportSection> - - - - - - +Map<String, dynamic> toJson() - +String toString() - - - - - - - - - - - - - NotExpression - - - - - - <static>+expressionType: String - +expression: Expression - - - - - - +Map<String, dynamic> toJson() - +bool? evaluate() - - - - - - - - - - - - - Expression - - - - - - <static>+expressionTypes: Map<String, Expression Function(Map<String, dynamic>)> - <static>+keyType: String - +type: String? - - - - - - +Map<String, dynamic> toJson() - +String toString() - +bool? evaluate() - - - - - - - - - - - - - BooleanExpression - - - - - - <static>+expressionType: String - - - - - - +Map<String, dynamic> toJson() - +bool checkValue() - - - - - - - - - - - - - ValueExpression - - - - - - <static>+expressionType: String - +target: String? - - - - - - +bool checkValue() - +bool? evaluate() - - - - - - - - - - - - - ChoiceExpression - - - - - - <static>+expressionType: String - +choices: Set<dynamic> - - - - - - +Map<String, dynamic> toJson() - +bool checkValue() - - - - - - - - - - - - - StudyResult - - - - - - <static>+studyResultTypes: Map<String, StudyResult Function(Map<String, dynamic>)> - <static>+keyType: String - +type: String - +id: String - +filename: String - - - - - - +Map<String, dynamic> toJson() - +List<String> getHeaders() - +List<dynamic> getValues() - - - - - - - - - - - - - InterventionResult - - - - - - <static>+studyResultType: String - - - - - - +Map<String, dynamic> toJson() - +List<String> getHeaders() - +List<dynamic> getValues() - - - - - - - - - - - - - NumericResult - - - - - - <static>+studyResultType: String - +resultProperty: DataReference<num> - - - - - - +Map<String, dynamic> toJson() - +List<String> getHeaders() - +List<dynamic> getValues() - - - - - - - - - - - - - ConsentItem - - - - - - +id: String - +title: String? - +description: String? - +iconName: String - - - - - - +Map<String, dynamic> toJson() - +String toString() - - - - - - - - - - - - - QuestionConditional - - - - - - <static>+keyDefaultValue: String - +defaultValue: V? - +condition: Expression - - - - - - <static>-QuestionConditional<V> _fromJson() - +Map<String, dynamic> toJson() - - - - - - - - - - - - - Question - - - - - - <static>+questionTypes: Map<String, Question<dynamic> Function(Map<String, dynamic>)> - <static>+keyType: String - +type: String - +id: String - +prompt: String? - +rationale: String? - <static>+keyConditional: String - +conditional: QuestionConditional<V>? - - - - - - +Map<String, dynamic> toJson() - +bool shouldBeShown() - +Answer<V>? getDefaultAnswer() - +Type getAnswerType() - +String toString() - - - - - - - - - - - - - ChoiceQuestion - - - - - - <static>+questionType: String - +multiple: bool - +choices: List<Choice> - - - - - - +Map<String, dynamic> toJson() - +Answer<List<String>> constructAnswer() - - - - - - - - - - - - - Choice - - - - - - +id: String - +text: String - - - - - - +Map<String, dynamic> toJson() - +String toString() - - - - - - - - - - - - - BooleanQuestion - - - - - - <static>+questionType: String - - - - - - +Map<String, dynamic> toJson() - +Answer<bool> constructAnswer() - - - - - - - - - - - - - SliderQuestion - - - - - - +minimum: double - +maximum: double - -_initial: double - +step: double - +initial: double - - - - - - +Answer<num> constructAnswer() - - - - - - - - - - - - - ScaleQuestion - - - - - - <static>+questionType: String - +annotations: List<Annotation> - +minColor: int? - +maxColor: int? - -_step: double - +step: double - +isAutostep: bool - +autostep: int - +annotationsSorted: List<Annotation> - +minAnnotation: Annotation? - +maxAnnotation: Annotation? - +minLabel: String? - +maxLabel: String? - +midAnnotations: List<Annotation> - +midLabels: List<String> - +midValues: List<double> - +values: List<double> - +minimumAnnotation: String - +maximumAnnotation: String - +maximumColor: int - +minimumColor: int - - - - - - +Map<String, dynamic> toJson() - +Annotation addAnnotation() - -void _setAnnotationLabel() - <static>+int getAutostepSize() - <static>+List<int> generateMidValues() - - - - - - - - - - - - - Annotation - - - - - - +value: int - +annotation: String - - - - - - +Map<String, dynamic> toJson() - - - - - - - - - - - - - AnnotatedScaleQuestion - - - - - - <static>+questionType: String - +annotations: List<Annotation> - - - - - - +Map<String, dynamic> toJson() - - - - - - - - - - - - - VisualAnalogueQuestion - - - - - - <static>+questionType: String - +minimumColor: int - +maximumColor: int - +minimumAnnotation: String - +maximumAnnotation: String - - - - - - +Map<String, dynamic> toJson() - - - - - - - - - - - - - Answer - - - - - - +question: String - +timestamp: DateTime - <static>+keyResponse: String - +response: V - - - - - - +Map<String, dynamic> toJson() - <static>+Answer<dynamic> fromJson() - +String toString() - - - - - - - - - - - - - StudyUQuestionnaire - - - - - - +questions: List<Question<dynamic>> - - - - - - +List<dynamic> toJson() - - - - - - - - - - - - - EligibilityCriterion - - - - - - +id: String - +reason: String? - +condition: Expression - - - - - - +Map<String, dynamic> toJson() - +bool isSatisfied() - +bool isViolated() - - - - - - - - - - - - - StudySchedule - - - - - - <static>+numberOfInterventions: int - +numberOfCycles: int - +phaseDuration: int - +includeBaseline: bool - +sequence: PhaseSequence - +sequenceCustom: String - +length: int - +nameOfSequence: String - - - - - - +Map<String, dynamic> toJson() - +int getNumberOfPhases() - +List<int> generateWith() - -int _nextIntervention() - -List<int> _generateCycle() - -List<int> _generateAlternatingCycle() - -List<int> _generateCounterBalancedCycle() - -List<int> _generateRandomizedCycle() - -List<int> _generateCustomizedCycle() - +String toString() - - - - - - - - - - - - PhaseSequence - - - - - - +index: int - <static>+values: List<PhaseSequence> - <static>+alternating: PhaseSequence - <static>+counterBalanced: PhaseSequence - <static>+randomized: PhaseSequence - <static>+customized: PhaseSequence - - - - - - - - - - - - - QuestionnaireTask - - - - - - <static>+taskType: String - +questions: StudyUQuestionnaire - - - - - - +Map<String, dynamic> toJson() - +Map<DateTime, T> extractPropertyResults() - +Map<String, Type> getAvailableProperties() - +String? getHumanReadablePropertyName() - - - - - - - - - - - - Observation - - - - - - <static>+taskTypes: Map<String, Observation Function(Map<String, dynamic>)> - - - - - - - - - - - - - Task - - - - - - <static>+keyType: String - +type: String - +id: String - +title: String? - +header: String? - +footer: String? - +schedule: Schedule - - - - - - +Map<String, dynamic> toJson() - +String toString() - +Map<DateTime, T> extractPropertyResults() - +Map<String, Type> getAvailableProperties() - +String? getHumanReadablePropertyName() - - - - - - - - - - - - - Schedule - - - - - - +completionPeriods: List<CompletionPeriod> - +reminders: List<StudyUTimeOfDay> - - - - - - +Map<String, dynamic> toJson() - +String toString() - - - - - - - - - - - - - CompletionPeriod - - - - - - +id: String - +unlockTime: StudyUTimeOfDay - +lockTime: StudyUTimeOfDay - - - - - - +Map<String, dynamic> toJson() - +String formatted() - +String toString() - +bool contains() - - - - - - - - - - - - - StudyUTimeOfDay - - - - - - +hour: int - +minute: int - - - - - - +String toJson() - +String toString() - +bool earlierThan() - - - - - - - - - - - - - TaskInstance - - - - - - +task: Task - +id: String - +completionPeriod: CompletionPeriod - - - - - - <static>-Task _taskFromStudy() - <static>-Task _taskFromSubject() - - - - - - - - - - - - - Result - - - - - - <static>+keyType: String - +type: String - +periodId: String? - <static>+keyResult: String - +result: T - - - - - - +Map<String, dynamic> toJson() - <static>-Result<dynamic> _fromJson() - - - - - - - - - - - - - Study - - - - - - <static>+tableName: String - <static>+baselineID: String - +id: String - +title: String? - +description: String? - +userId: String - +participation: Participation - +resultSharing: ResultSharing - +contact: Contact - +iconName: String - +published: bool - +questionnaire: StudyUQuestionnaire - +eligibilityCriteria: List<EligibilityCriterion> - +consent: List<ConsentItem> - +interventions: List<Intervention> - +observations: List<Observation> - +schedule: StudySchedule - +reportSpecification: ReportSpecification - +results: List<StudyResult> - +collaboratorEmails: List<String> - +registryPublished: bool - +participantCount: int - +endedCount: int - +activeSubjectCount: int - +missedDays: List<int> - +repo: Repo? - +invites: List<StudyInvite>? - +participants: List<StudySubject>? - +participantsProgress: List<SubjectProgress>? - +createdAt: DateTime? - +primaryKeys: Map<String, dynamic> - +hasEligibilityCheck: bool - +hasConsentCheck: bool - +totalMissedDays: int - +percentageMissedDays: double - +status: StudyStatus - +isDraft: bool - +isRunning: bool - +isClosed: bool - - - - - - +Map<String, dynamic> toJson() - <static>+dynamic getResearcherDashboardStudies() - <static>+dynamic publishedPublicStudies() - +bool isOwner() - +bool isEditor() - +bool canEdit() - <static>+dynamic fetchResultsCSVTable() - +bool isReadonly() - +String toString() - +int compareTo() - - - - - - - - - - - - Participation - - - - - - +index: int - <static>+values: List<Participation> - <static>+open: Participation - <static>+invite: Participation - - - - - - - - - - - - ResultSharing - - - - - - +index: int - <static>+values: List<ResultSharing> - <static>+public: ResultSharing - <static>+private: ResultSharing - <static>+organization: ResultSharing - - - - - - - - - - - - - Contact - - - - - - +organization: String - +institutionalReviewBoard: String? - +institutionalReviewBoardNumber: String? - +researchers: String? - +email: String - +website: String - +phone: String - +additionalInfo: String? - - - - - - +Map<String, dynamic> toJson() - +String toString() - - - - - - - - - - - - - Repo - - - - - - <static>+tableName: String - +projectId: String - +userId: String - +studyId: String - +provider: GitProvider - +webUrl: String? - +gitUrl: String? - +primaryKeys: Map<String, dynamic> - - - - - - +Map<String, dynamic> toJson() - - - - - - - - - - - - StudyStatus - - - - - - +index: int - <static>+values: List<StudyStatus> - <static>+draft: StudyStatus - <static>+running: StudyStatus - <static>+closed: StudyStatus - - - - - - - - - - - - SupabaseObjectFunctions - - - - - - <static>+T fromJson() - +dynamic delete() - +dynamic save() - - - - - - - - - - - Comparable - - - - - - - - - - - - - AppConfig - - - - - - <static>+tableName: String - +id: String - +contact: Contact - +appPrivacy: Map<String, String> - +appTerms: Map<String, String> - +designerPrivacy: Map<String, String> - +designerTerms: Map<String, String> - +imprint: Map<String, String> - +analytics: StudyUAnalytics - +primaryKeys: Map<String, dynamic> - - - - - - +Map<String, dynamic> toJson() - <static>+dynamic getAppConfig() - <static>+dynamic getAppContact() - - - - - - - - - - - - - StudyUAnalytics - - - - - - +enabled: bool - +dsn: String - +samplingRate: double? - <static>+keyStudyUAnalytics: String - - - - - - +Map<String, dynamic> toJson() - - - - - - - - - - - - - SubjectProgress - - - - - - <static>+tableName: String - +completedAt: DateTime? - +subjectId: String - +interventionId: String - +taskId: String - +resultType: String - +result: Result<dynamic> - +startedAt: DateTime? - +primaryKeys: Map<String, dynamic> - +hashCode: int - - - - - - +Map<String, dynamic> toJson() - +SubjectProgress setStartDateBackBy() - +bool ==() - - - - - - - - - - - - - StudyInvite - - - - - - <static>+tableName: String - +code: String - +studyId: String - +preselectedInterventionIds: List<String>? - +primaryKeys: Map<String, dynamic> - - - - - - +Map<String, dynamic> toJson() - - - - - - - - - - - - - StudyUUser - - - - - - <static>+tableName: String - +id: String - +email: String - +preferences: Preferences - +primaryKeys: Map<String, dynamic> - - - - - - +Map<String, dynamic> toJson() - - - - - - - - - - - - - Preferences - - - - - - +language: String - +pinnedStudies: Set<String> - - - - - - +Map<String, dynamic> toJson() - - - - - - - - - - - - GitProvider - - - - - - +index: int - <static>+values: List<GitProvider> - <static>+gitlab: GitProvider - - - - - - - - - - - - - StudySubject - - - - - - <static>+tableName: String - -_controller: StreamController<StudySubject> - +id: String - +studyId: String - +userId: String - +startedAt: DateTime? - +selectedInterventionIds: List<String> - +inviteCode: String? - +isDeleted: bool - +study: Study - +progress: List<SubjectProgress> - +primaryKeys: Map<String, dynamic> - +interventionOrder: List<String> - +selectedInterventions: List<Intervention> - +daysPerIntervention: int - +minimumStudyLengthCompleted: bool - +completedStudy: bool - +onSave: Stream<StudySubject> - +hashCode: int - - - - - - +Map<String, dynamic> toJson() - +dynamic addResult() - +Map<DateTime, List<SubjectProgress>> getResultsByDate() - +DateTime endDate() - +int getDayOfStudyFor() - +int getInterventionIndexForDate() - +Intervention? getInterventionForDate() - +List<Intervention> getInterventionsInOrder() - +DateTime startOfPhase() - +DateTime dayAfterEndOfPhase() - +List<SubjectProgress> resultsFor() - +int completedForPhase() - +int daysLeftForPhase() - +double percentCompletedForPhase() - +double percentMissedForPhase() - +List<SubjectProgress> getTaskProgressForDay() - +bool completedTaskInstanceForDay() - +bool completedTaskForDay() - +int completedTasksFor() - +bool allTasksCompletedFor() - +int totalTaskCountFor() - +List<TaskInstance> scheduleFor() - +dynamic setStartDateBackBy() - +dynamic save() - +Map<String, dynamic> toFullJson() - +dynamic deleteProgress() - +dynamic delete() - +dynamic softDelete() - <static>+dynamic getStudyHistory() - +bool ==() - +String toString() - - - - - - - - - - - StreamController - - - - - - - - - - - Stream - - - - - - - - - - - - InterventionTask - - - - - - <static>+taskTypes: Map<String, InterventionTask Function(Map<String, dynamic>)> - - - - - - - - - - - - - Intervention - - - - - - +id: String - +name: String? - +description: String? - +icon: String - +tasks: List<InterventionTask> - - - - - - +Map<String, dynamic> toJson() - +bool isBaseline() - - - - - - - - - - - - - CheckmarkTask - - - - - - <static>+taskType: String - - - - - - +Map<String, dynamic> toJson() - +Map<DateTime, T> extractPropertyResults() - +Map<String, Type> getAvailableProperties() - +String? getHumanReadablePropertyName() - - - - - - - - - - - - - SupabaseObject - - - - - - +primaryKeys: Map<String, dynamic> - - - - - - +Map<String, dynamic> toJson() - - - - - - - - - - - - SupabaseQuery - - - - - - <static>+dynamic getAll() - <static>+dynamic getById() - <static>+dynamic batchUpsert() - <static>+List<T> extractSupabaseList() - <static>+T extractSupabaseSingleRow() - <static>+void catchSupabaseException() - - - - - - - - - - - - - Analytics - - - - - - <static>+logger: Logger - <static>+onLog: StreamSubscription<LogRecord> - - - - - - <static>+void init() - <static>+void dispose() - <static>+dynamic captureEvent() - <static>+dynamic captureException() - <static>+dynamic captureMessage() - <static>+void addBreadcrumb() - - - - - - - - - - - Logger - - - - - - - - - - - StreamSubscription - - - - - + diff --git a/docs/uml/designer_v2/lib/features/auth/uml.svg b/docs/uml/designer_v2/lib/features/auth/uml.svg index 1774ab483..d9a0e85ee 100644 --- a/docs/uml/designer_v2/lib/features/auth/uml.svg +++ b/docs/uml/designer_v2/lib/features/auth/uml.svg @@ -1,16 +1,28 @@ - - [AuthScaffold + + [StudyUJobsToBeDone | - +body: Widget; - +formKey: AuthFormKey; - +leftContentMinWidth: double; - +leftPanelMinWidth: double; - +leftPanelPadding: EdgeInsets + +Widget build() ] - [AuthScaffold]o-[<abstract>Widget] - [AuthScaffold]o-[AuthFormKey] - [AuthScaffold]o-[EdgeInsets] + [EmailTextField + | + +labelText: String; + +hintText: String?; + +formControlName: String?; + +formControl: FormControl<dynamic>? + ] + + [EmailTextField]o-[FormControl] + + [PasswordTextField + | + +labelText: String; + +hintText: String?; + +formControlName: String?; + +formControl: FormControl<dynamic>? + ] + + [PasswordTextField]o-[FormControl] [SignupForm | @@ -24,16 +36,6 @@ [SignupForm]o-[AuthFormKey] [<abstract>FormConsumerRefWidget]<:-[SignupForm] - [PasswordRecoveryForm - | - +formKey: AuthFormKey - | - +Widget build() - ] - - [PasswordRecoveryForm]o-[AuthFormKey] - [<abstract>FormConsumerRefWidget]<:-[PasswordRecoveryForm] - [PasswordForgotForm | +formKey: AuthFormKey @@ -107,221 +109,221 @@ [AuthFormKey]o-[AuthFormKey] [Enum]<:--[AuthFormKey] - [EmailTextField + [AuthScaffold | - +labelText: String; - +hintText: String?; - +formControlName: String?; - +formControl: FormControl<dynamic>? + +body: Widget; + +formKey: AuthFormKey; + +leftContentMinWidth: double; + +leftPanelMinWidth: double; + +leftPanelPadding: EdgeInsets ] - [EmailTextField]o-[FormControl] + [AuthScaffold]o-[<abstract>Widget] + [AuthScaffold]o-[AuthFormKey] + [AuthScaffold]o-[EdgeInsets] - [PasswordTextField + [LoginForm | - +labelText: String; - +hintText: String?; - +formControlName: String?; - +formControl: FormControl<dynamic>? - ] - - [PasswordTextField]o-[FormControl] - - [StudyUJobsToBeDone + +formKey: AuthFormKey | +Widget build() ] - [LoginForm + [LoginForm]o-[AuthFormKey] + [<abstract>FormConsumerRefWidget]<:-[LoginForm] + + [PasswordRecoveryForm | +formKey: AuthFormKey | +Widget build() ] - [LoginForm]o-[AuthFormKey] - [<abstract>FormConsumerRefWidget]<:-[LoginForm] + [PasswordRecoveryForm]o-[AuthFormKey] + [<abstract>FormConsumerRefWidget]<:-[PasswordRecoveryForm] - + - + - + - + - + - + - + - + + + - + - - - + + + - + - - - + - + - - - + - + - + - + - + - + - + - + - + - + - - - + + - + + - + - + - - + + - + - - + + + - - + - + - + - + - + + + - + - - - - - - + + + + + + - - - AuthScaffold + + + StudyUJobsToBeDone - - - +body: Widget - +formKey: AuthFormKey - +leftContentMinWidth: double - +leftPanelMinWidth: double - +leftPanelPadding: EdgeInsets + + + +Widget build() - - - + + + + - - - Widget + + + EmailTextField - - - - - - - - - AuthFormKey + + + +labelText: String + +hintText: String? + +formControlName: String? + +formControl: FormControl<dynamic>? - - - +index: int - <static>+values: List<AuthFormKey> - <static>+login: AuthFormKey - <static>+signup: AuthFormKey - <static>+passwordForgot: AuthFormKey - <static>+passwordRecovery: AuthFormKey - <static>-_loginSubmit: AuthFormKey - <static>-_signupSubmit: AuthFormKey + + + + + + + + FormControl - - - + + + + - - - EdgeInsets + + + PasswordTextField + + + + + + +labelText: String + +hintText: String? + +formControlName: String? + +formControl: FormControl<dynamic>? - - - + + + - + SignupForm - + +formKey: AuthFormKey - + +Widget build() -dynamic _onClickTermsOfUse() @@ -330,61 +332,61 @@ - - - + + + + - - - FormConsumerRefWidget + + + AuthFormKey - - - - - - - - - - PasswordRecoveryForm + + + +index: int + <static>+values: List<AuthFormKey> + <static>+login: AuthFormKey + <static>+signup: AuthFormKey + <static>+passwordForgot: AuthFormKey + <static>+passwordRecovery: AuthFormKey + <static>-_loginSubmit: AuthFormKey + <static>-_signupSubmit: AuthFormKey - - - +formKey: AuthFormKey - - + + + + - - - +Widget build() + + + FormConsumerRefWidget - - - + + + - + PasswordForgotForm - + +formKey: AuthFormKey - + +Widget build() @@ -393,17 +395,17 @@ - - - + + + - + AuthFormController - + +authRepository: IAuthRepository +sharedPreferences: SharedPreferences @@ -427,7 +429,7 @@ - + -dynamic _onChangeFormKey() +dynamic resetControlsFor() @@ -450,9 +452,9 @@ - + - + IAuthRepository @@ -461,9 +463,9 @@ - + - + SharedPreferences @@ -472,9 +474,9 @@ - + - + INotificationService @@ -483,31 +485,20 @@ - + - + GoRouter - - - - - - - FormControl - - - - - + - + FormGroup @@ -516,9 +507,9 @@ - + - + IFormGroupController @@ -527,100 +518,109 @@ - + - + Enum - - - - + + + + - - - EmailTextField + + + AuthScaffold - - - +labelText: String - +hintText: String? - +formControlName: String? - +formControl: FormControl<dynamic>? + + + +body: Widget + +formKey: AuthFormKey + +leftContentMinWidth: double + +leftPanelMinWidth: double + +leftPanelPadding: EdgeInsets - - - - - - - - PasswordTextField - - + + + - - - +labelText: String - +hintText: String? - +formControlName: String? - +formControl: FormControl<dynamic>? + + + Widget - - - - - - - - StudyUJobsToBeDone - - + + + - - - +Widget build() + + + EdgeInsets - - - + + + - + LoginForm - + +formKey: AuthFormKey - + +Widget build() + + + + + + + + + PasswordRecoveryForm + + + + + + +formKey: AuthFormKey + + + + + + +Widget build() + + + + diff --git a/docs/uml/designer_v2/lib/features/design/reports/uml.svg b/docs/uml/designer_v2/lib/features/design/reports/uml.svg index 728c51043..c1d5b37ce 100644 --- a/docs/uml/designer_v2/lib/features/design/reports/uml.svg +++ b/docs/uml/designer_v2/lib/features/design/reports/uml.svg @@ -1,11 +1,16 @@ - - [StudyDesignReportsFormView + + [ReportBadge | - +Widget build(); - -dynamic _showReportItemSidesheetWithArgs() + +status: ReportStatus?; + +type: BadgeType; + +showPrefixIcon: bool; + +showTooltip: bool + | + +Widget build() ] - [<abstract>StudyDesignPageWidget]<:-[StudyDesignReportsFormView] + [ReportBadge]o-[ReportStatus] + [ReportBadge]o-[BadgeType] [ReportsFormViewModel | @@ -62,6 +67,93 @@ [<abstract>IListActionProvider]<:--[ReportFormItemDelegate] [<abstract>IProviderArgsResolver]<:--[ReportFormItemDelegate] + [StudyDesignReportsFormView + | + +Widget build(); + -dynamic _showReportItemSidesheetWithArgs() + ] + + [<abstract>StudyDesignPageWidget]<:-[StudyDesignReportsFormView] + + [ReportsFormData + | + +reportItems: List<ReportItemFormData>; + +id: String + | + +Study apply(); + +ReportsFormData copy() + ] + + [<abstract>IStudyFormData]<:--[ReportsFormData] + + [ReportStatus + | + +index: int; + <static>+values: List<ReportStatus>; + <static>+primary: ReportStatus; + <static>+secondary: ReportStatus + ] + + [ReportStatus]o-[ReportStatus] + [Enum]<:--[ReportStatus] + + [ReportItemFormViewModel + | + <static>+defaultSectionType: ReportSectionType; + +sectionIdControl: FormControl<String>; + +sectionTypeControl: FormControl<ReportSectionType>; + +titleControl: FormControl<String>; + +descriptionControl: FormControl<String>; + +sectionControl: FormControl<ReportSection>; + +dataReferenceControl: FormControl<DataReferenceIdentifier<num>>; + +temporalAggregationControl: FormControl<TemporalAggregationFormatted>; + +improvementDirectionControl: FormControl<ImprovementDirectionFormatted>; + +alphaControl: FormControl<double>; + -_controlsBySectionType: Map<ReportSectionType, FormGroup>; + -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + -_validationConfigsBySectionType: Map<ReportSectionType, Map<FormValidationSetEnum, List<FormControlValidation>>>; + +sectionBaseControls: Map<String, AbstractControl<dynamic>>; + +form: FormGroup; + +sectionId: String; + +sectionType: ReportSectionType; + <static>+sectionTypeControlOptions: List<FormControlOption<ReportSectionType>>; + <static>+temporalAggregationControlOptions: List<FormControlOption<TemporalAggregationFormatted>>; + <static>+improvementDirectionControlOptions: List<FormControlOption<ImprovementDirectionFormatted>>; + +titles: Map<FormMode, String>; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +titleRequired: dynamic; + +descriptionRequired: dynamic; + +dataReferenceRequired: dynamic; + +aggregationRequired: dynamic; + +improvementDirectionRequired: dynamic; + +alphaConfidenceRequired: dynamic + | + -List<FormControlValidation> _getValidationConfig(); + +ReportItemFormData buildFormData(); + +ReportItemFormViewModel createDuplicate(); + +dynamic onSectionTypeChanged(); + -void _updateFormControls(); + +void setControlsFrom() + ] + + [ReportItemFormViewModel]o-[ReportSectionType] + [ReportItemFormViewModel]o-[FormControl] + [ReportItemFormViewModel]o-[FormGroup] + [<abstract>ManagedFormViewModel]<:-[ReportItemFormViewModel] + + [ReportItemFormData + | + +isPrimary: bool; + +section: ReportSection; + +id: String + | + <static>+dynamic fromDomainModel(); + +ReportItemFormData copy() + ] + + [ReportItemFormData]o-[<abstract>ReportSection] + [<abstract>IFormData]<:-[ReportItemFormData] + [ReportItemFormView | +formViewModel: ReportItemFormViewModel; @@ -133,6 +225,18 @@ [DataReference]<:-[DataReferenceIdentifier] + [LinearRegressionSectionFormView + | + +formViewModel: ReportItemFormViewModel; + +studyId: String; + +reportSectionColumnWidth: Map<int, TableColumnWidth> + | + +Widget build() + ] + + [LinearRegressionSectionFormView]o-[ReportItemFormViewModel] + [<abstract>ConsumerWidget]<:-[LinearRegressionSectionFormView] + [DataReferenceEditor | +formControl: FormControl<DataReferenceIdentifier<T>>; @@ -158,311 +262,237 @@ [AverageSectionFormView]o-[ReportItemFormViewModel] [<abstract>ConsumerWidget]<:-[AverageSectionFormView] - [LinearRegressionSectionFormView - | - +formViewModel: ReportItemFormViewModel; - +studyId: String; - +reportSectionColumnWidth: Map<int, TableColumnWidth> - | - +Widget build() - ] - - [LinearRegressionSectionFormView]o-[ReportItemFormViewModel] - [<abstract>ConsumerWidget]<:-[LinearRegressionSectionFormView] - - [ReportItemFormData - | - +isPrimary: bool; - +section: ReportSection; - +id: String - | - <static>+dynamic fromDomainModel(); - +ReportItemFormData copy() - ] - - [ReportItemFormData]o-[<abstract>ReportSection] - [<abstract>IFormData]<:-[ReportItemFormData] - - [ReportItemFormViewModel - | - <static>+defaultSectionType: ReportSectionType; - +sectionIdControl: FormControl<String>; - +sectionTypeControl: FormControl<ReportSectionType>; - +titleControl: FormControl<String>; - +descriptionControl: FormControl<String>; - +sectionControl: FormControl<ReportSection>; - +dataReferenceControl: FormControl<DataReferenceIdentifier<num>>; - +temporalAggregationControl: FormControl<TemporalAggregationFormatted>; - +improvementDirectionControl: FormControl<ImprovementDirectionFormatted>; - +alphaControl: FormControl<double>; - -_controlsBySectionType: Map<ReportSectionType, FormGroup>; - -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - -_validationConfigsBySectionType: Map<ReportSectionType, Map<FormValidationSetEnum, List<FormControlValidation>>>; - +sectionBaseControls: Map<String, AbstractControl<dynamic>>; - +form: FormGroup; - +sectionId: String; - +sectionType: ReportSectionType; - <static>+sectionTypeControlOptions: List<FormControlOption<ReportSectionType>>; - <static>+temporalAggregationControlOptions: List<FormControlOption<TemporalAggregationFormatted>>; - <static>+improvementDirectionControlOptions: List<FormControlOption<ImprovementDirectionFormatted>>; - +titles: Map<FormMode, String>; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titleRequired: dynamic; - +descriptionRequired: dynamic; - +dataReferenceRequired: dynamic; - +aggregationRequired: dynamic; - +improvementDirectionRequired: dynamic; - +alphaConfidenceRequired: dynamic - | - -List<FormControlValidation> _getValidationConfig(); - +ReportItemFormData buildFormData(); - +ReportItemFormViewModel createDuplicate(); - +dynamic onSectionTypeChanged(); - -void _updateFormControls(); - +void setControlsFrom() - ] - - [ReportItemFormViewModel]o-[ReportSectionType] - [ReportItemFormViewModel]o-[FormControl] - [ReportItemFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[ReportItemFormViewModel] - - [ReportsFormData - | - +reportItems: List<ReportItemFormData>; - +id: String - | - +Study apply(); - +ReportsFormData copy() - ] - - [<abstract>IStudyFormData]<:--[ReportsFormData] - - [ReportStatus - | - +index: int; - <static>+values: List<ReportStatus>; - <static>+primary: ReportStatus; - <static>+secondary: ReportStatus - ] - - [ReportStatus]o-[ReportStatus] - [Enum]<:--[ReportStatus] - - [ReportBadge - | - +status: ReportStatus?; - +type: BadgeType; - +showPrefixIcon: bool; - +showTooltip: bool - | - +Widget build() - ] - - [ReportBadge]o-[ReportStatus] - [ReportBadge]o-[BadgeType] - - + - + - - - - + + + + + + + + + + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - - + + - + - + - + - + - + - + - + - + - - - - - - - - + + + + + - + + - + - - - + + - + + - + - + - + - + - - - - + - - - - + + + - + - + + + - + - + - + - - - + - + - - - + - + - - - + - + - + - + - + - + - - - + - - + + + + - + - - + + + + + - - + - + - + - + - - - - + + + + + + + - - - StudyDesignReportsFormView + + + ReportBadge - - - +Widget build() - -dynamic _showReportItemSidesheetWithArgs() + + + +status: ReportStatus? + +type: BadgeType + +showPrefixIcon: bool + +showTooltip: bool - - - - - - - - StudyDesignPageWidget + + + +Widget build() - - - - - + + + + - - - ReportsFormViewModel + + + ReportStatus + + + + + + +index: int + <static>+values: List<ReportStatus> + <static>+primary: ReportStatus + <static>+secondary: ReportStatus + + + + + + + + + + + BadgeType + + + + + + + + + + + + + ReportsFormViewModel - + +study: Study +router: GoRouter @@ -477,7 +507,7 @@ - + +void setControlsFrom() +ReportsFormData buildFormData() @@ -494,9 +524,9 @@ - + - + Study @@ -505,9 +535,9 @@ - + - + GoRouter @@ -516,17 +546,17 @@ - - - + + + - + ReportFormItemDelegate - + +formViewModelCollection: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData> +owner: ReportsFormViewModel @@ -535,7 +565,7 @@ - + +void onCancel() +dynamic onSave() @@ -549,9 +579,9 @@ - + - + FormArray @@ -560,9 +590,9 @@ - + - + FormViewModelCollection @@ -571,9 +601,9 @@ - + - + FormGroup @@ -582,9 +612,9 @@ - + - + FormViewModel @@ -593,9 +623,9 @@ - + - + IFormViewModelDelegate @@ -604,9 +634,9 @@ - + - + IProviderArgsResolver @@ -615,58 +645,107 @@ - + - + IListActionProvider - - - - - + + + + - - - ReportItemFormView + + + StudyDesignReportsFormView - - - +formViewModel: ReportItemFormViewModel - +studyId: String - +reportSectionColumnWidth: dynamic - +sectionTypeBodyBuilder: Widget Function(BuildContext) + + + +Widget build() + -dynamic _showReportItemSidesheetWithArgs() - - - +Widget build() - -dynamic _buildSectionText() - -dynamic _buildSectionTypeHeader() + + + + + + + + StudyDesignPageWidget + + + + + + + + + + + + + ReportsFormData + + + + + + +reportItems: List<ReportItemFormData> + +id: String + + + + + + +Study apply() + +ReportsFormData copy() + + + + + + + + + + + IStudyFormData + + + + + + + + + + + Enum - - - + + + - + ReportItemFormViewModel - + <static>+defaultSectionType: ReportSectionType +sectionIdControl: FormControl<String> @@ -699,7 +778,7 @@ - + -List<FormControlValidation> _getValidationConfig() +ReportItemFormData buildFormData() @@ -711,11 +790,134 @@ + + + + + + + + ReportSectionType + + + + + + +index: int + <static>+values: List<ReportSectionType> + <static>+average: ReportSectionType + <static>+linearRegression: ReportSectionType + + + + + + + + + + + FormControl + + + + + + + + + + + ManagedFormViewModel + + + + + + + + + + + + + ReportItemFormData + + + + + + +isPrimary: bool + +section: ReportSection + +id: String + + + + + + <static>+dynamic fromDomainModel() + +ReportItemFormData copy() + + + + + + + + + + + ReportSection + + + + + + + + + + + IFormData + + + + + + + + + + + + + ReportItemFormView + + + + + + +formViewModel: ReportItemFormViewModel + +studyId: String + +reportSectionColumnWidth: dynamic + +sectionTypeBodyBuilder: Widget Function(BuildContext) + + + + + + +Widget build() + -dynamic _buildSectionText() + -dynamic _buildSectionTypeHeader() + + + + - + - + Widget Function(BuildContext) @@ -724,17 +926,17 @@ - - - + + + - + TemporalAggregationFormatted - + -_value: TemporalAggregation <static>+values: List<TemporalAggregationFormatted> @@ -745,7 +947,7 @@ - + +bool ==() +String toString() @@ -757,9 +959,9 @@ - + - + TemporalAggregation @@ -768,9 +970,9 @@ - + - + IconData @@ -779,17 +981,17 @@ - - - + + + - + ImprovementDirectionFormatted - + -_value: ImprovementDirection <static>+values: List<ImprovementDirectionFormatted> @@ -800,7 +1002,7 @@ - + +bool ==() +String toString() @@ -812,66 +1014,34 @@ - + - + ImprovementDirection - - - - - - - - ReportSectionType - - - - - - +index: int - <static>+values: List<ReportSectionType> - <static>+average: ReportSectionType - <static>+linearRegression: ReportSectionType - - - - - - - - - - - Enum - - - - - - - + + + - + DataReferenceIdentifier - + +hashCode: int - + +bool ==() @@ -880,116 +1050,28 @@ - + - + DataReference - - - - - - - - - DataReferenceEditor - - - - - - +formControl: FormControl<DataReferenceIdentifier<T>> - +availableTasks: List<Task> - +buildReactiveDropdownField: ReactiveDropdownField<dynamic> - - - - - - +FormTableRow buildFormTableRow() - -List<DropdownMenuItem<DataReferenceIdentifier<dynamic>>> _dataReferenceItems() - - - - - - - - - - - FormControl - - - - - - - - - - - ReactiveDropdownField - - - - - - - - - - - - - AverageSectionFormView - - - - - - +formViewModel: ReportItemFormViewModel - +studyId: String - +reportSectionColumnWidth: Map<int, TableColumnWidth> - - - - - - +Widget build() - - - - - - - - - - - ConsumerWidget - - - - - - - + + + - + LinearRegressionSectionFormView - + +formViewModel: ReportItemFormViewModel +studyId: String @@ -997,168 +1079,86 @@ - + +Widget build() - - - - - - - - - ReportItemFormData - - - - - - +isPrimary: bool - +section: ReportSection - +id: String - - - - - - <static>+dynamic fromDomainModel() - +ReportItemFormData copy() - - - - - - - - - - - ReportSection - - - - - - - - - - - IFormData - - - - - - - + + + - - - ManagedFormViewModel + + + ConsumerWidget - - - - - - - - - ReportsFormData - - + + + + + - - - +reportItems: List<ReportItemFormData> - +id: String + + + DataReferenceEditor - - - +Study apply() - +ReportsFormData copy() + + + +formControl: FormControl<DataReferenceIdentifier<T>> + +availableTasks: List<Task> + +buildReactiveDropdownField: ReactiveDropdownField<dynamic> - - - - - - - - IStudyFormData + + + +FormTableRow buildFormTableRow() + -List<DropdownMenuItem<DataReferenceIdentifier<dynamic>>> _dataReferenceItems() - - - - - - - - ReportStatus - - + + + - - - +index: int - <static>+values: List<ReportStatus> - <static>+primary: ReportStatus - <static>+secondary: ReportStatus + + + ReactiveDropdownField - - - - - - - - - ReportBadge - - + + + + + - - - +status: ReportStatus? - +type: BadgeType - +showPrefixIcon: bool - +showTooltip: bool + + + AverageSectionFormView - - - +Widget build() + + + +formViewModel: ReportItemFormViewModel + +studyId: String + +reportSectionColumnWidth: Map<int, TableColumnWidth> - - - - - - - - BadgeType + + + +Widget build() diff --git a/docs/uml/designer_v2/lib/features/design/uml.svg b/docs/uml/designer_v2/lib/features/design/uml.svg index 91b4cb16e..30f89480d 100644 --- a/docs/uml/designer_v2/lib/features/design/uml.svg +++ b/docs/uml/designer_v2/lib/features/design/uml.svg @@ -1,235 +1,264 @@ - - [StudyDesignInfoFormView + + [StudyFormScaffold + | + +studyId: String; + +formViewModelBuilder: T Function(WidgetRef); + +formViewBuilder: Widget Function(T) | +Widget build() ] - [<abstract>StudyDesignPageWidget]<:-[StudyDesignInfoFormView] + [StudyFormScaffold]o-[T Function(WidgetRef)] + [StudyFormScaffold]o-[Widget Function(T)] + [<abstract>ConsumerWidget]<:-[StudyFormScaffold] - [StudyInfoFormViewModel + [InterventionsFormViewModel | +study: Study; - +titleControl: FormControl<String>; - +iconControl: FormControl<IconOption>; - +descriptionControl: FormControl<String>; - +organizationControl: FormControl<String>; - +reviewBoardControl: FormControl<String>; - +reviewBoardNumberControl: FormControl<String>; - +researchersControl: FormControl<String>; - +emailControl: FormControl<String>; - +websiteControl: FormControl<String>; - +phoneControl: FormControl<String>; - +additionalInfoControl: FormControl<String>; + +router: GoRouter; + +interventionsArray: FormArray<dynamic>; + +interventionsCollection: FormViewModelCollection<InterventionFormViewModel, InterventionFormData>; +form: FormGroup; - +titles: Map<FormMode, String>; +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titleRequired: dynamic; - +descriptionRequired: dynamic; - +iconRequired: dynamic; - +organizationRequired: dynamic; - +reviewBoardRequired: dynamic; - +reviewBoardNumberRequired: dynamic; - +researchersRequired: dynamic; - +emailRequired: dynamic; - +phoneRequired: dynamic; - +emailFormat: dynamic; - +websiteFormat: dynamic + +interventionsRequired: dynamic; + +titles: Map<FormMode, String>; + +canTestStudySchedule: bool | +void setControlsFrom(); - +StudyInfoFormData buildFormData() + +InterventionsFormData buildFormData(); + +void read(); + +List<ModelAction<dynamic>> availableActions(); + +List<ModelAction<dynamic>> availablePopupActions(); + +List<ModelAction<dynamic>> availableInlineActions(); + +void onSelectItem(); + +void onNewItem(); + +InterventionFormViewModel provide(); + +void onCancel(); + +dynamic onSave(); + +dynamic testStudySchedule() ] - [StudyInfoFormViewModel]o-[Study] - [StudyInfoFormViewModel]o-[FormControl] - [StudyInfoFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[StudyInfoFormViewModel] + [InterventionsFormViewModel]o-[Study] + [InterventionsFormViewModel]o-[GoRouter] + [InterventionsFormViewModel]o-[FormArray] + [InterventionsFormViewModel]o-[FormViewModelCollection] + [InterventionsFormViewModel]o-[FormGroup] + [<abstract>FormViewModel]<:-[InterventionsFormViewModel] + [<abstract>StudyScheduleControls]<:-[InterventionsFormViewModel] + [<abstract>IFormViewModelDelegate]<:--[InterventionsFormViewModel] + [<abstract>IListActionProvider]<:--[InterventionsFormViewModel] + [<abstract>IProviderArgsResolver]<:--[InterventionsFormViewModel] - [StudyInfoFormData - | - +title: String; - +description: String?; - +iconName: String; - +contactInfoFormData: StudyContactInfoFormData; - +id: String + [InterventionTaskFormView | - +Study apply(); - +StudyInfoFormData copy() + +formViewModel: InterventionTaskFormViewModel ] - [StudyInfoFormData]o-[StudyContactInfoFormData] - [<abstract>IStudyFormData]<:--[StudyInfoFormData] + [InterventionTaskFormView]o-[InterventionTaskFormViewModel] - [StudyContactInfoFormData + [InterventionPreview | - +organization: String?; - +institutionalReviewBoard: String?; - +institutionalReviewBoardNumber: String?; - +researchers: String?; - +email: String?; - +website: String?; - +phone: String?; - +additionalInfo: String?; - +id: String + +routeArgs: InterventionFormRouteArgs | - +Study apply(); - +StudyInfoFormData copy() + +Widget build() ] - [<abstract>IStudyFormData]<:--[StudyContactInfoFormData] + [InterventionPreview]o-[InterventionFormRouteArgs] + [<abstract>ConsumerWidget]<:-[InterventionPreview] - [StudyFormScaffold + [StudyScheduleFormView | - +studyId: String; - +formViewModelBuilder: T Function(WidgetRef); - +formViewBuilder: Widget Function(T) + +formViewModel: StudyScheduleControls | + -FormTableRow _renderCustomSequence(); +Widget build() ] - [StudyFormScaffold]o-[T Function(WidgetRef)] - [StudyFormScaffold]o-[Widget Function(T)] - [<abstract>ConsumerWidget]<:-[StudyFormScaffold] + [StudyScheduleFormView]o-[<abstract>StudyScheduleControls] + [<abstract>FormConsumerWidget]<:-[StudyScheduleFormView] - [StudyFormValidationSet + [InterventionFormView | - +index: int; - <static>+values: List<StudyFormValidationSet> + +formViewModel: InterventionFormViewModel ] - [Enum]<:--[StudyFormValidationSet] + [InterventionFormView]o-[InterventionFormViewModel] - [StudyDesignMeasurementsFormView + [InterventionFormData | - +Widget build() + +interventionId: String; + +title: String; + +description: String?; + +tasksData: List<InterventionTaskFormData>?; + +iconName: String?; + <static>+kDefaultTitle: String; + +id: String + | + +Intervention toIntervention(); + +InterventionFormData copy() ] - [<abstract>StudyDesignPageWidget]<:-[StudyDesignMeasurementsFormView] + [<abstract>IFormData]<:-[InterventionFormData] - [MeasurementsFormViewModel + [StudyScheduleFormData | - +study: Study; - +router: GoRouter; - +measurementsArray: FormArray<dynamic>; - +surveyMeasurementFormViewModels: FormViewModelCollection<MeasurementSurveyFormViewModel, MeasurementSurveyFormData>; - +form: FormGroup; - +measurementViewModels: List<MeasurementSurveyFormViewModel>; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +measurementRequired: dynamic; - +titles: Map<FormMode, String> + +sequenceType: PhaseSequence; + +sequenceTypeCustom: String; + +numCycles: int; + +phaseDuration: int; + +includeBaseline: bool; + +id: String | - +void read(); - +void setControlsFrom(); - +MeasurementsFormData buildFormData(); - +List<ModelAction<dynamic>> availableActions(); - +List<ModelAction<dynamic>> availablePopupActions(); - +List<ModelAction<dynamic>> availableInlineActions(); - +void onSelectItem(); - +void onNewItem(); - +MeasurementSurveyFormViewModel provide(); - +void onCancel(); - +dynamic onSave() + +StudySchedule toStudySchedule(); + +Study apply(); + +StudyScheduleFormData copy() ] - [MeasurementsFormViewModel]o-[Study] - [MeasurementsFormViewModel]o-[GoRouter] - [MeasurementsFormViewModel]o-[FormArray] - [MeasurementsFormViewModel]o-[FormViewModelCollection] - [MeasurementsFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[MeasurementsFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[MeasurementsFormViewModel] - [<abstract>IListActionProvider]<:--[MeasurementsFormViewModel] - [<abstract>IProviderArgsResolver]<:--[MeasurementsFormViewModel] + [StudyScheduleFormData]o-[PhaseSequence] + [<abstract>IStudyFormData]<:--[StudyScheduleFormData] - [MeasurementsFormData + [<abstract>StudyScheduleControls | - +surveyMeasurements: List<MeasurementSurveyFormData>; - +id: String + <static>+defaultScheduleType: PhaseSequence; + <static>+defaultScheduleTypeSequence: String; + <static>+defaultNumCycles: int; + <static>+defaultPeriodLength: int; + +sequenceTypeControl: FormControl<PhaseSequence>; + +sequenceTypeCustomControl: FormControl<String>; + +phaseDurationControl: FormControl<int>; + +numCyclesControl: FormControl<int>; + +includeBaselineControl: FormControl<bool>; + +studyScheduleControls: Map<String, FormControl<Object>>; + <static>+kNumCyclesMin: int; + <static>+kNumCyclesMax: int; + <static>+kPhaseDurationMin: int; + <static>+kPhaseDurationMax: int; + +sequenceTypeControlOptions: List<FormControlOption<PhaseSequence>>; + +studyScheduleValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +numCyclesRange: dynamic; + +phaseDurationRange: dynamic; + +customSequenceRequired: dynamic | - +Study apply(); - +MeasurementsFormData copy() + +void setStudyScheduleControlsFrom(); + +StudyScheduleFormData buildStudyScheduleFormData(); + +bool isSequencingCustom() ] - [<abstract>IStudyFormData]<:--[MeasurementsFormData] + [<abstract>StudyScheduleControls]o-[PhaseSequence] + [<abstract>StudyScheduleControls]o-[FormControl] - [MeasurementSurveyFormViewModel + [InterventionTaskFormViewModel | - +study: Study; - +measurementIdControl: FormControl<String>; + +taskIdControl: FormControl<String>; +instanceIdControl: FormControl<String>; - +surveyTitleControl: FormControl<String>; - +surveyIntroTextControl: FormControl<String>; - +surveyOutroTextControl: FormControl<String>; + +taskTitleControl: FormControl<String>; + +taskDescriptionControl: FormControl<String>; + +markAsCompletedControl: FormControl<bool>; +form: FormGroup; - +measurementId: String; + +taskId: String; +instanceId: String; +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; +titleRequired: dynamic; - +atLeastOneQuestion: dynamic; + +titles: Map<FormMode, String> + | + +void setControlsFrom(); + +InterventionTaskFormData buildFormData(); + +InterventionTaskFormViewModel createDuplicate() + ] + + [InterventionTaskFormViewModel]o-[FormControl] + [InterventionTaskFormViewModel]o-[FormGroup] + [<abstract>ManagedFormViewModel]<:-[InterventionTaskFormViewModel] + [<abstract>WithScheduleControls]<:-[InterventionTaskFormViewModel] + + [InterventionFormViewModel + | + +study: Study; + +interventionIdControl: FormControl<String>; + +interventionTitleControl: FormControl<String>; + +interventionIconControl: FormControl<IconOption>; + +interventionDescriptionControl: FormControl<String>; + +interventionTasksArray: FormArray<dynamic>; + +tasksCollection: FormViewModelCollection<InterventionTaskFormViewModel, InterventionTaskFormData>; + +form: FormGroup; + +interventionId: String; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +titleRequired: dynamic; + +atLeastOneTask: dynamic; +breadcrumbsTitle: String; +titles: Map<FormMode, String> | +void setControlsFrom(); - +MeasurementSurveyFormData buildFormData(); + +InterventionFormData buildFormData(); +List<ModelAction<dynamic>> availableActions(); +List<ModelAction<dynamic>> availablePopupActions(); +List<ModelAction<dynamic>> availableInlineActions(); +void onSelectItem(); +void onNewItem(); - +SurveyQuestionFormRouteArgs buildNewFormRouteArgs(); - +SurveyQuestionFormRouteArgs buildFormRouteArgs(); - +MeasurementSurveyFormViewModel createDuplicate() + +void onCancel(); + +dynamic onSave(); + +InterventionTaskFormViewModel provide(); + +InterventionTaskFormRouteArgs buildNewFormRouteArgs(); + +InterventionTaskFormRouteArgs buildFormRouteArgs(); + +InterventionFormViewModel createDuplicate() ] - [MeasurementSurveyFormViewModel]o-[Study] - [MeasurementSurveyFormViewModel]o-[FormControl] - [MeasurementSurveyFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[MeasurementSurveyFormViewModel] - [<abstract>WithQuestionnaireControls]<:-[MeasurementSurveyFormViewModel] - [<abstract>WithScheduleControls]<:-[MeasurementSurveyFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[MeasurementSurveyFormViewModel] - [<abstract>IListActionProvider]<:--[MeasurementSurveyFormViewModel] - [<abstract>IProviderArgsResolver]<:--[MeasurementSurveyFormViewModel] + [InterventionFormViewModel]o-[Study] + [InterventionFormViewModel]o-[FormControl] + [InterventionFormViewModel]o-[FormArray] + [InterventionFormViewModel]o-[FormViewModelCollection] + [InterventionFormViewModel]o-[FormGroup] + [<abstract>ManagedFormViewModel]<:-[InterventionFormViewModel] + [<abstract>IFormViewModelDelegate]<:--[InterventionFormViewModel] + [<abstract>IListActionProvider]<:--[InterventionFormViewModel] + [<abstract>IProviderArgsResolver]<:--[InterventionFormViewModel] - [MeasurementSurveyFormData + [InterventionsFormData | - +measurementId: String; - +title: String; - +introText: String?; - +outroText: String?; - +questionnaireFormData: QuestionnaireFormData; - <static>+kDefaultTitle: String; + +interventionsData: List<InterventionFormData>; + +studyScheduleData: StudyScheduleFormData; +id: String | - +QuestionnaireTask toQuestionnaireTask(); - +MeasurementSurveyFormData copy() + +Study apply(); + +InterventionsFormData copy() ] - [MeasurementSurveyFormData]o-[QuestionnaireFormData] - [<abstract>IFormDataWithSchedule]<:-[MeasurementSurveyFormData] + [InterventionsFormData]o-[StudyScheduleFormData] + [<abstract>IStudyFormData]<:--[InterventionsFormData] - [SurveyPreview - | - +routeArgs: MeasurementFormRouteArgs + [StudyDesignInterventionsFormView | +Widget build() ] - [SurveyPreview]o-[MeasurementFormRouteArgs] - [<abstract>ConsumerWidget]<:-[SurveyPreview] + [<abstract>StudyDesignPageWidget]<:-[StudyDesignInterventionsFormView] - [MeasurementSurveyFormView + [InterventionTaskFormData | - +formViewModel: MeasurementSurveyFormViewModel + +taskId: String; + +taskTitle: String; + +taskDescription: String?; + <static>+kDefaultTitle: String; + +id: String + | + +CheckmarkTask toTask(); + +InterventionTaskFormData copy() ] - [MeasurementSurveyFormView]o-[MeasurementSurveyFormViewModel] + [<abstract>IFormDataWithSchedule]<:-[InterventionTaskFormData] - [<abstract>IStudyFormData + [ReportBadge | - +Study apply() + +status: ReportStatus?; + +type: BadgeType; + +showPrefixIcon: bool; + +showTooltip: bool + | + +Widget build() ] - [<abstract>IFormData]<:--[<abstract>IStudyFormData] + [ReportBadge]o-[ReportStatus] + [ReportBadge]o-[BadgeType] [ReportsFormViewModel | @@ -286,54 +315,107 @@ [<abstract>IListActionProvider]<:--[ReportFormItemDelegate] [<abstract>IProviderArgsResolver]<:--[ReportFormItemDelegate] - [ReportItemFormView - | - +formViewModel: ReportItemFormViewModel; - +studyId: String; - +reportSectionColumnWidth: dynamic; - +sectionTypeBodyBuilder: Widget Function(BuildContext) + [StudyDesignReportsFormView | +Widget build(); - -dynamic _buildSectionText(); - -dynamic _buildSectionTypeHeader() + -dynamic _showReportItemSidesheetWithArgs() ] - [ReportItemFormView]o-[ReportItemFormViewModel] - [ReportItemFormView]o-[Widget Function(BuildContext)] + [<abstract>StudyDesignPageWidget]<:-[StudyDesignReportsFormView] - [LinearRegressionSectionFormView + [ReportsFormData | - +formViewModel: ReportItemFormViewModel; - +studyId: String; - +reportSectionColumnWidth: Map<int, TableColumnWidth> + +reportItems: List<ReportItemFormData>; + +id: String | - +Widget build() + +Study apply(); + +ReportsFormData copy() ] - [LinearRegressionSectionFormView]o-[ReportItemFormViewModel] - [<abstract>ConsumerWidget]<:-[LinearRegressionSectionFormView] + [<abstract>IStudyFormData]<:--[ReportsFormData] - [DataReferenceIdentifier + [ReportStatus | - +hashCode: int + +index: int; + <static>+values: List<ReportStatus>; + <static>+primary: ReportStatus; + <static>+secondary: ReportStatus + ] + + [ReportStatus]o-[ReportStatus] + [Enum]<:--[ReportStatus] + + [ReportItemFormViewModel | - +bool ==() + <static>+defaultSectionType: ReportSectionType; + +sectionIdControl: FormControl<String>; + +sectionTypeControl: FormControl<ReportSectionType>; + +titleControl: FormControl<String>; + +descriptionControl: FormControl<String>; + +sectionControl: FormControl<ReportSection>; + +dataReferenceControl: FormControl<DataReferenceIdentifier<num>>; + +temporalAggregationControl: FormControl<TemporalAggregationFormatted>; + +improvementDirectionControl: FormControl<ImprovementDirectionFormatted>; + +alphaControl: FormControl<double>; + -_controlsBySectionType: Map<ReportSectionType, FormGroup>; + -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + -_validationConfigsBySectionType: Map<ReportSectionType, Map<FormValidationSetEnum, List<FormControlValidation>>>; + +sectionBaseControls: Map<String, AbstractControl<dynamic>>; + +form: FormGroup; + +sectionId: String; + +sectionType: ReportSectionType; + <static>+sectionTypeControlOptions: List<FormControlOption<ReportSectionType>>; + <static>+temporalAggregationControlOptions: List<FormControlOption<TemporalAggregationFormatted>>; + <static>+improvementDirectionControlOptions: List<FormControlOption<ImprovementDirectionFormatted>>; + +titles: Map<FormMode, String>; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +titleRequired: dynamic; + +descriptionRequired: dynamic; + +dataReferenceRequired: dynamic; + +aggregationRequired: dynamic; + +improvementDirectionRequired: dynamic; + +alphaConfidenceRequired: dynamic + | + -List<FormControlValidation> _getValidationConfig(); + +ReportItemFormData buildFormData(); + +ReportItemFormViewModel createDuplicate(); + +dynamic onSectionTypeChanged(); + -void _updateFormControls(); + +void setControlsFrom() ] - [DataReference]<:-[DataReferenceIdentifier] + [ReportItemFormViewModel]o-[ReportSectionType] + [ReportItemFormViewModel]o-[FormControl] + [ReportItemFormViewModel]o-[FormGroup] + [<abstract>ManagedFormViewModel]<:-[ReportItemFormViewModel] - [DataReferenceEditor + [ReportItemFormData + | + +isPrimary: bool; + +section: ReportSection; + +id: String + | + <static>+dynamic fromDomainModel(); + +ReportItemFormData copy() + ] + + [ReportItemFormData]o-[<abstract>ReportSection] + [<abstract>IFormData]<:-[ReportItemFormData] + + [ReportItemFormView | - +formControl: FormControl<DataReferenceIdentifier<T>>; - +availableTasks: List<Task>; - +buildReactiveDropdownField: ReactiveDropdownField<dynamic> + +formViewModel: ReportItemFormViewModel; + +studyId: String; + +reportSectionColumnWidth: dynamic; + +sectionTypeBodyBuilder: Widget Function(BuildContext) | - +FormTableRow buildFormTableRow(); - -List<DropdownMenuItem<DataReferenceIdentifier<dynamic>>> _dataReferenceItems() + +Widget build(); + -dynamic _buildSectionText(); + -dynamic _buildSectionTypeHeader() ] - [DataReferenceEditor]o-[FormControl] - [DataReferenceEditor]o-[ReactiveDropdownField] + [ReportItemFormView]o-[ReportItemFormViewModel] + [ReportItemFormView]o-[Widget Function(BuildContext)] [TemporalAggregationFormatted | @@ -382,6 +464,40 @@ [ReportSectionType]o-[ReportSectionType] [Enum]<:--[ReportSectionType] + [DataReferenceIdentifier + | + +hashCode: int + | + +bool ==() + ] + + [DataReference]<:-[DataReferenceIdentifier] + + [LinearRegressionSectionFormView + | + +formViewModel: ReportItemFormViewModel; + +studyId: String; + +reportSectionColumnWidth: Map<int, TableColumnWidth> + | + +Widget build() + ] + + [LinearRegressionSectionFormView]o-[ReportItemFormViewModel] + [<abstract>ConsumerWidget]<:-[LinearRegressionSectionFormView] + + [DataReferenceEditor + | + +formControl: FormControl<DataReferenceIdentifier<T>>; + +availableTasks: List<Task>; + +buildReactiveDropdownField: ReactiveDropdownField<dynamic> + | + +FormTableRow buildFormTableRow(); + -List<DropdownMenuItem<DataReferenceIdentifier<dynamic>>> _dataReferenceItems() + ] + + [DataReferenceEditor]o-[FormControl] + [DataReferenceEditor]o-[ReactiveDropdownField] + [AverageSectionFormView | +formViewModel: ReportItemFormViewModel; @@ -394,105 +510,98 @@ [AverageSectionFormView]o-[ReportItemFormViewModel] [<abstract>ConsumerWidget]<:-[AverageSectionFormView] - [ReportItemFormViewModel - | - <static>+defaultSectionType: ReportSectionType; - +sectionIdControl: FormControl<String>; - +sectionTypeControl: FormControl<ReportSectionType>; - +titleControl: FormControl<String>; - +descriptionControl: FormControl<String>; - +sectionControl: FormControl<ReportSection>; - +dataReferenceControl: FormControl<DataReferenceIdentifier<num>>; - +temporalAggregationControl: FormControl<TemporalAggregationFormatted>; - +improvementDirectionControl: FormControl<ImprovementDirectionFormatted>; - +alphaControl: FormControl<double>; - -_controlsBySectionType: Map<ReportSectionType, FormGroup>; - -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - -_validationConfigsBySectionType: Map<ReportSectionType, Map<FormValidationSetEnum, List<FormControlValidation>>>; - +sectionBaseControls: Map<String, AbstractControl<dynamic>>; - +form: FormGroup; - +sectionId: String; - +sectionType: ReportSectionType; - <static>+sectionTypeControlOptions: List<FormControlOption<ReportSectionType>>; - <static>+temporalAggregationControlOptions: List<FormControlOption<TemporalAggregationFormatted>>; - <static>+improvementDirectionControlOptions: List<FormControlOption<ImprovementDirectionFormatted>>; - +titles: Map<FormMode, String>; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titleRequired: dynamic; - +descriptionRequired: dynamic; - +dataReferenceRequired: dynamic; - +aggregationRequired: dynamic; - +improvementDirectionRequired: dynamic; - +alphaConfidenceRequired: dynamic + [<abstract>IStudyFormData | - -List<FormControlValidation> _getValidationConfig(); - +ReportItemFormData buildFormData(); - +ReportItemFormViewModel createDuplicate(); - +dynamic onSectionTypeChanged(); - -void _updateFormControls(); - +void setControlsFrom() + +Study apply() ] - [ReportItemFormViewModel]o-[ReportSectionType] - [ReportItemFormViewModel]o-[FormControl] - [ReportItemFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[ReportItemFormViewModel] + [<abstract>IFormData]<:--[<abstract>IStudyFormData] - [ReportItemFormData + [StudyInfoFormData | - +isPrimary: bool; - +section: ReportSection; + +title: String; + +description: String?; + +iconName: String; + +contactInfoFormData: StudyContactInfoFormData; +id: String | - <static>+dynamic fromDomainModel(); - +ReportItemFormData copy() + +Study apply(); + +StudyInfoFormData copy() ] - [ReportItemFormData]o-[<abstract>ReportSection] - [<abstract>IFormData]<:-[ReportItemFormData] + [StudyInfoFormData]o-[StudyContactInfoFormData] + [<abstract>IStudyFormData]<:--[StudyInfoFormData] - [ReportsFormData + [StudyContactInfoFormData | - +reportItems: List<ReportItemFormData>; + +organization: String?; + +institutionalReviewBoard: String?; + +institutionalReviewBoardNumber: String?; + +researchers: String?; + +email: String?; + +website: String?; + +phone: String?; + +additionalInfo: String?; +id: String | +Study apply(); - +ReportsFormData copy() + +StudyInfoFormData copy() ] - [<abstract>IStudyFormData]<:--[ReportsFormData] + [<abstract>IStudyFormData]<:--[StudyContactInfoFormData] - [ReportStatus + [StudyInfoFormViewModel | - +index: int; - <static>+values: List<ReportStatus>; - <static>+primary: ReportStatus; - <static>+secondary: ReportStatus + +study: Study; + +titleControl: FormControl<String>; + +iconControl: FormControl<IconOption>; + +descriptionControl: FormControl<String>; + +organizationControl: FormControl<String>; + +reviewBoardControl: FormControl<String>; + +reviewBoardNumberControl: FormControl<String>; + +researchersControl: FormControl<String>; + +emailControl: FormControl<String>; + +websiteControl: FormControl<String>; + +phoneControl: FormControl<String>; + +additionalInfoControl: FormControl<String>; + +form: FormGroup; + +titles: Map<FormMode, String>; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +titleRequired: dynamic; + +descriptionRequired: dynamic; + +iconRequired: dynamic; + +organizationRequired: dynamic; + +reviewBoardRequired: dynamic; + +reviewBoardNumberRequired: dynamic; + +researchersRequired: dynamic; + +emailRequired: dynamic; + +phoneRequired: dynamic; + +emailFormat: dynamic; + +websiteFormat: dynamic + | + +void setControlsFrom(); + +StudyInfoFormData buildFormData() ] - [ReportStatus]o-[ReportStatus] - [Enum]<:--[ReportStatus] + [StudyInfoFormViewModel]o-[Study] + [StudyInfoFormViewModel]o-[FormControl] + [StudyInfoFormViewModel]o-[FormGroup] + [<abstract>FormViewModel]<:-[StudyInfoFormViewModel] - [StudyDesignReportsFormView + [StudyDesignInfoFormView | - +Widget build(); - -dynamic _showReportItemSidesheetWithArgs() + +Widget build() ] - [<abstract>StudyDesignPageWidget]<:-[StudyDesignReportsFormView] + [<abstract>StudyDesignPageWidget]<:-[StudyDesignInfoFormView] - [ReportBadge - | - +status: ReportStatus?; - +type: BadgeType; - +showPrefixIcon: bool; - +showTooltip: bool + [StudyFormValidationSet | - +Widget build() + +index: int; + <static>+values: List<StudyFormValidationSet> ] - [ReportBadge]o-[ReportStatus] - [ReportBadge]o-[BadgeType] + [Enum]<:--[StudyFormValidationSet] [StudyDesignEnrollmentFormView | @@ -503,20 +612,6 @@ [<abstract>StudyDesignPageWidget]<:-[StudyDesignEnrollmentFormView] - [ConsentItemFormData - | - +consentId: String; - +title: String; - +description: String; - +iconName: String?; - +id: String - | - +ConsentItem toConsentItem(); - +ConsentItemFormData copy() - ] - - [<abstract>IFormData]<:-[ConsentItemFormData] - [EnrollmentFormData | <static>+kDefaultEnrollmentType: Participation; @@ -555,24 +650,6 @@ [ConsentItemFormViewModel]o-[FormGroup] [<abstract>ManagedFormViewModel]<:-[ConsentItemFormViewModel] - [<abstract>IScreenerQuestionLogicFormViewModel - | - +isDirtyOptionsBannerVisible: bool - ] - - [ScreenerQuestionLogicFormView - | - +formViewModel: ScreenerQuestionFormViewModel - | - +Widget build(); - -dynamic _buildInfoBanner(); - -dynamic _buildAnswerOptionsLogicControls(); - -List<Widget> _buildOptionLogicRow() - ] - - [ScreenerQuestionLogicFormView]o-[ScreenerQuestionFormViewModel] - [<abstract>FormConsumerWidget]<:-[ScreenerQuestionLogicFormView] - [ScreenerQuestionFormViewModel | <static>+defaultResponseOptionValidity: bool; @@ -600,6 +677,45 @@ [QuestionFormViewModel]<:-[ScreenerQuestionFormViewModel] [<abstract>IScreenerQuestionLogicFormViewModel]<:--[ScreenerQuestionFormViewModel] + [ConsentItemFormView + | + +formViewModel: ConsentItemFormViewModel + ] + + [ConsentItemFormView]o-[ConsentItemFormViewModel] + + [ConsentItemFormData + | + +consentId: String; + +title: String; + +description: String; + +iconName: String?; + +id: String + | + +ConsentItem toConsentItem(); + +ConsentItemFormData copy() + ] + + [<abstract>IFormData]<:-[ConsentItemFormData] + + [<abstract>IScreenerQuestionLogicFormViewModel + | + +isDirtyOptionsBannerVisible: bool + ] + + [ScreenerQuestionLogicFormView + | + +formViewModel: ScreenerQuestionFormViewModel + | + +Widget build(); + -dynamic _buildInfoBanner(); + -dynamic _buildAnswerOptionsLogicControls(); + -List<Widget> _buildOptionLogicRow() + ] + + [ScreenerQuestionLogicFormView]o-[ScreenerQuestionFormViewModel] + [<abstract>FormConsumerWidget]<:-[ScreenerQuestionLogicFormView] + [EnrollmentFormViewModel | +study: Study; @@ -668,176 +784,48 @@ [<abstract>IListActionProvider]<:--[EnrollmentFormConsentItemDelegate] [<abstract>IProviderArgsResolver]<:--[EnrollmentFormConsentItemDelegate] - [ConsentItemFormView - | - +formViewModel: ConsentItemFormViewModel - ] - - [ConsentItemFormView]o-[ConsentItemFormViewModel] - - [<abstract>WithScheduleControls - | - +isTimeRestrictedControl: FormControl<bool>; - +instanceID: FormControl<String>; - +restrictedTimeStartControl: FormControl<Time>; - +restrictedTimeStartPickerControl: FormControl<TimeOfDay>; - +restrictedTimeEndControl: FormControl<Time>; - +restrictedTimeEndPickerControl: FormControl<TimeOfDay>; - +hasReminderControl: FormControl<bool>; - +reminderTimeControl: FormControl<Time>; - +reminderTimePickerControl: FormControl<TimeOfDay>; - -_reminderControlStream: StreamSubscription<dynamic>?; - +scheduleFormControls: Map<String, FormControl<Object>>; - +hasReminder: bool; - +isTimeRestricted: bool; - +timeRestriction: List<Time>? - | - +void setScheduleControlsFrom(); - -dynamic _initReminderControl() - ] - - [<abstract>WithScheduleControls]o-[FormControl] - [<abstract>WithScheduleControls]o-[StreamSubscription] - - [<abstract>IFormDataWithSchedule - | - +instanceId: String; - +isTimeLocked: bool; - +timeLockStart: StudyUTimeOfDay?; - +timeLockEnd: StudyUTimeOfDay?; - +hasReminder: bool; - +reminderTime: StudyUTimeOfDay? - | - +Schedule toSchedule() - ] - - [<abstract>IFormDataWithSchedule]o-[StudyUTimeOfDay] - [<abstract>IFormData]<:--[<abstract>IFormDataWithSchedule] - - [ScheduleControls - | - +formViewModel: WithScheduleControls - | - +Widget build(); - -List<FormTableRow> _conditionalTimeRestrictions() - ] - - [ScheduleControls]o-[<abstract>WithScheduleControls] - [<abstract>FormConsumerWidget]<:-[ScheduleControls] - - [SurveyQuestionType - | - +index: int; - <static>+values: List<SurveyQuestionType>; - <static>+choice: SurveyQuestionType; - <static>+bool: SurveyQuestionType; - <static>+scale: SurveyQuestionType - ] - - [SurveyQuestionType]o-[SurveyQuestionType] - [Enum]<:--[SurveyQuestionType] - - [ChoiceQuestionFormView - | - +formViewModel: QuestionFormViewModel - | - +Widget build() - ] - - [ChoiceQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[ChoiceQuestionFormView] - - [BoolQuestionFormView - | - +formViewModel: QuestionFormViewModel - | - +Widget build() - ] - - [BoolQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[BoolQuestionFormView] - - [<abstract>IScaleQuestionFormViewModel - | - +isMidValuesClearedInfoVisible: bool - ] - - [ScaleQuestionFormView - | - +formViewModel: QuestionFormViewModel - ] - - [ScaleQuestionFormView]o-[QuestionFormViewModel] - - [<abstract>QuestionFormData + [QuestionnaireFormData | - <static>+questionTypeFormDataFactories: Map<SurveyQuestionType, QuestionFormData Function(Question<dynamic>, List<EligibilityCriterion>)>; - +questionId: String; - +questionText: String; - +questionInfoText: String?; - +questionType: SurveyQuestionType; - +responseOptionsValidity: Map<dynamic, bool>; - +responseOptions: List<dynamic>; + +questionsData: List<QuestionFormData>?; +id: String | - +Question<dynamic> toQuestion(); - +EligibilityCriterion toEligibilityCriterion(); - +Answer<dynamic> constructAnswerFor(); - +dynamic setResponseOptionsValidityFrom(); - +QuestionFormData copy() - ] - - [<abstract>QuestionFormData]o-[SurveyQuestionType] - [<abstract>IFormData]<:--[<abstract>QuestionFormData] - - [ChoiceQuestionFormData - | - +isMultipleChoice: bool; - +answerOptions: List<String>; - +responseOptions: List<String> - | - +Question<dynamic> toQuestion(); - +QuestionFormData copy(); - -Choice _buildChoiceForValue(); - +Answer<dynamic> constructAnswerFor() + +StudyUQuestionnaire toQuestionnaire(); + +List<EligibilityCriterion> toEligibilityCriteria(); + +QuestionnaireFormData copy() ] - [<abstract>QuestionFormData]<:-[ChoiceQuestionFormData] + [<abstract>IFormData]<:--[QuestionnaireFormData] - [BoolQuestionFormData + [<abstract>WithQuestionnaireControls | - <static>+kResponseOptions: Map<String, bool>; - +responseOptions: List<String> + +questionsArray: FormArray<dynamic>; + +questionFormViewModels: FormViewModelCollection<Q, QuestionFormData>; + +questionnaireControls: Map<String, FormArray<dynamic>>; + +propagateOnSave: bool; + +questionModels: List<Q>; + +questionTitles: Map<FormMode, String Function()> | - +Question<dynamic> toQuestion(); - +BoolQuestionFormData copy(); - +Answer<dynamic> constructAnswerFor() + +void setQuestionnaireControlsFrom(); + +QuestionnaireFormData buildQuestionnaireFormData(); + +void read(); + +void onCancel(); + +dynamic onSave(); + +Q provide(); + +Q provideQuestionFormViewModel() ] - [<abstract>QuestionFormData]<:-[BoolQuestionFormData] + [<abstract>WithQuestionnaireControls]o-[FormArray] + [<abstract>WithQuestionnaireControls]o-[FormViewModelCollection] + [<abstract>IFormViewModelDelegate]<:--[<abstract>WithQuestionnaireControls] + [<abstract>IProviderArgsResolver]<:--[<abstract>WithQuestionnaireControls] - [ScaleQuestionFormData - | - +minValue: double; - +maxValue: double; - +minLabel: String?; - +maxLabel: String?; - +midValues: List<double?>; - +midLabels: List<String?>; - +stepSize: double; - +initialValue: double?; - +minColor: Color?; - +maxColor: Color?; - +responseOptions: List<double>; - +midAnnotations: List<Annotation> + [SurveyQuestionFormView | - +ScaleQuestion toQuestion(); - +QuestionFormData copy(); - +Answer<dynamic> constructAnswerFor() + +formViewModel: QuestionFormViewModel; + +isHtmlStyleable: bool ] - [ScaleQuestionFormData]o-[Color] - [<abstract>QuestionFormData]<:-[ScaleQuestionFormData] + [SurveyQuestionFormView]o-[QuestionFormViewModel] [QuestionFormViewModel | @@ -892,79 +880,193 @@ +isAddOptionButtonVisible: bool; +isMidValuesClearedInfoVisible: bool | - +String? scaleMidLabelAt(); - -dynamic _onScaleRangeChanged(); - -dynamic _applyInputFormatters(); - -dynamic _updateScaleMidValueControls(); - -List<FormControlValidation> _getValidationConfig(); - +dynamic onQuestionTypeChanged(); - +dynamic onResponseOptionsChanged(); - -void _updateFormControls(); - +void initControls(); - +void setControlsFrom(); - +QuestionFormData buildFormData(); - +List<ModelAction<dynamic>> availableActions(); - +void onNewItem(); - +void onSelectItem(); - +QuestionFormViewModel createDuplicate() + +String? scaleMidLabelAt(); + -dynamic _onScaleRangeChanged(); + -dynamic _applyInputFormatters(); + -dynamic _updateScaleMidValueControls(); + -List<FormControlValidation> _getValidationConfig(); + +dynamic onQuestionTypeChanged(); + +dynamic onResponseOptionsChanged(); + -void _updateFormControls(); + +void initControls(); + +void setControlsFrom(); + +QuestionFormData buildFormData(); + +List<ModelAction<dynamic>> availableActions(); + +void onNewItem(); + +void onSelectItem(); + +QuestionFormViewModel createDuplicate() + ] + + [QuestionFormViewModel]o-[SurveyQuestionType] + [QuestionFormViewModel]o-[FormControl] + [QuestionFormViewModel]o-[FormArray] + [QuestionFormViewModel]o-[FormGroup] + [<abstract>ManagedFormViewModel]<:-[QuestionFormViewModel] + [<abstract>IListActionProvider]<:--[QuestionFormViewModel] + + [<abstract>QuestionFormData + | + <static>+questionTypeFormDataFactories: Map<SurveyQuestionType, QuestionFormData Function(Question<dynamic>, List<EligibilityCriterion>)>; + +questionId: String; + +questionText: String; + +questionInfoText: String?; + +questionType: SurveyQuestionType; + +responseOptionsValidity: Map<dynamic, bool>; + +responseOptions: List<dynamic>; + +id: String + | + +Question<dynamic> toQuestion(); + +EligibilityCriterion toEligibilityCriterion(); + +Answer<dynamic> constructAnswerFor(); + +dynamic setResponseOptionsValidityFrom(); + +QuestionFormData copy() + ] + + [<abstract>QuestionFormData]o-[SurveyQuestionType] + [<abstract>IFormData]<:--[<abstract>QuestionFormData] + + [ChoiceQuestionFormData + | + +isMultipleChoice: bool; + +answerOptions: List<String>; + +responseOptions: List<String> + | + +Question<dynamic> toQuestion(); + +QuestionFormData copy(); + -Choice _buildChoiceForValue(); + +Answer<dynamic> constructAnswerFor() + ] + + [<abstract>QuestionFormData]<:-[ChoiceQuestionFormData] + + [BoolQuestionFormData + | + <static>+kResponseOptions: Map<String, bool>; + +responseOptions: List<String> + | + +Question<dynamic> toQuestion(); + +BoolQuestionFormData copy(); + +Answer<dynamic> constructAnswerFor() + ] + + [<abstract>QuestionFormData]<:-[BoolQuestionFormData] + + [ScaleQuestionFormData + | + +minValue: double; + +maxValue: double; + +minLabel: String?; + +maxLabel: String?; + +midValues: List<double?>; + +midLabels: List<String?>; + +stepSize: double; + +initialValue: double?; + +minColor: Color?; + +maxColor: Color?; + +responseOptions: List<double>; + +midAnnotations: List<Annotation> + | + +ScaleQuestion toQuestion(); + +QuestionFormData copy(); + +Answer<dynamic> constructAnswerFor() + ] + + [ScaleQuestionFormData]o-[Color] + [<abstract>QuestionFormData]<:-[ScaleQuestionFormData] + + [<abstract>IScaleQuestionFormViewModel + | + +isMidValuesClearedInfoVisible: bool + ] + + [ScaleQuestionFormView + | + +formViewModel: QuestionFormViewModel ] - [QuestionFormViewModel]o-[SurveyQuestionType] - [QuestionFormViewModel]o-[FormControl] - [QuestionFormViewModel]o-[FormArray] - [QuestionFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[QuestionFormViewModel] - [<abstract>IListActionProvider]<:--[QuestionFormViewModel] + [ScaleQuestionFormView]o-[QuestionFormViewModel] - [SurveyQuestionFormView + [SurveyQuestionType | - +formViewModel: QuestionFormViewModel; - +isHtmlStyleable: bool + +index: int; + <static>+values: List<SurveyQuestionType>; + <static>+choice: SurveyQuestionType; + <static>+bool: SurveyQuestionType; + <static>+scale: SurveyQuestionType ] - [SurveyQuestionFormView]o-[QuestionFormViewModel] + [SurveyQuestionType]o-[SurveyQuestionType] + [Enum]<:--[SurveyQuestionType] - [<abstract>WithQuestionnaireControls + [BoolQuestionFormView | - +questionsArray: FormArray<dynamic>; - +questionFormViewModels: FormViewModelCollection<Q, QuestionFormData>; - +questionnaireControls: Map<String, FormArray<dynamic>>; - +propagateOnSave: bool; - +questionModels: List<Q>; - +questionTitles: Map<FormMode, String Function()> + +formViewModel: QuestionFormViewModel | - +void setQuestionnaireControlsFrom(); - +QuestionnaireFormData buildQuestionnaireFormData(); - +void read(); - +void onCancel(); - +dynamic onSave(); - +Q provide(); - +Q provideQuestionFormViewModel() + +Widget build() ] - [<abstract>WithQuestionnaireControls]o-[FormArray] - [<abstract>WithQuestionnaireControls]o-[FormViewModelCollection] - [<abstract>IFormViewModelDelegate]<:--[<abstract>WithQuestionnaireControls] - [<abstract>IProviderArgsResolver]<:--[<abstract>WithQuestionnaireControls] + [BoolQuestionFormView]o-[QuestionFormViewModel] + [<abstract>ConsumerWidget]<:-[BoolQuestionFormView] - [QuestionnaireFormData + [ChoiceQuestionFormView | - +questionsData: List<QuestionFormData>?; - +id: String + +formViewModel: QuestionFormViewModel | - +StudyUQuestionnaire toQuestionnaire(); - +List<EligibilityCriterion> toEligibilityCriteria(); - +QuestionnaireFormData copy() + +Widget build() ] - [<abstract>IFormData]<:--[QuestionnaireFormData] + [ChoiceQuestionFormView]o-[QuestionFormViewModel] + [<abstract>ConsumerWidget]<:-[ChoiceQuestionFormView] - [<abstract>StudyDesignPageWidget + [ScheduleControls | - +Widget? banner() + +formViewModel: WithScheduleControls + | + +Widget build(); + -List<FormTableRow> _conditionalTimeRestrictions() ] - [<abstract>StudyPageWidget]<:-[<abstract>StudyDesignPageWidget] + [ScheduleControls]o-[<abstract>WithScheduleControls] + [<abstract>FormConsumerWidget]<:-[ScheduleControls] + + [<abstract>WithScheduleControls + | + +isTimeRestrictedControl: FormControl<bool>; + +instanceID: FormControl<String>; + +restrictedTimeStartControl: FormControl<Time>; + +restrictedTimeStartPickerControl: FormControl<TimeOfDay>; + +restrictedTimeEndControl: FormControl<Time>; + +restrictedTimeEndPickerControl: FormControl<TimeOfDay>; + +hasReminderControl: FormControl<bool>; + +reminderTimeControl: FormControl<Time>; + +reminderTimePickerControl: FormControl<TimeOfDay>; + -_reminderControlStream: StreamSubscription<dynamic>?; + +scheduleFormControls: Map<String, FormControl<Object>>; + +hasReminder: bool; + +isTimeRestricted: bool; + +timeRestriction: List<Time>? + | + +void setScheduleControlsFrom(); + -dynamic _initReminderControl() + ] + + [<abstract>WithScheduleControls]o-[FormControl] + [<abstract>WithScheduleControls]o-[StreamSubscription] + + [<abstract>IFormDataWithSchedule + | + +instanceId: String; + +isTimeLocked: bool; + +timeLockStart: StudyUTimeOfDay?; + +timeLockEnd: StudyUTimeOfDay?; + +hasReminder: bool; + +reminderTime: StudyUTimeOfDay? + | + +Schedule toSchedule() + ] + + [<abstract>IFormDataWithSchedule]o-[StudyUTimeOfDay] + [<abstract>IFormData]<:--[<abstract>IFormDataWithSchedule] [StudyFormViewModel | @@ -1004,1495 +1106,1412 @@ [<abstract>FormViewModel]<:-[StudyFormViewModel] [<abstract>IFormViewModelDelegate]<:--[StudyFormViewModel] - [<abstract>StudyScheduleControls - | - <static>+defaultScheduleType: PhaseSequence; - <static>+defaultScheduleTypeSequence: String; - <static>+defaultNumCycles: int; - <static>+defaultPeriodLength: int; - +sequenceTypeControl: FormControl<PhaseSequence>; - +sequenceTypeCustomControl: FormControl<String>; - +phaseDurationControl: FormControl<int>; - +numCyclesControl: FormControl<int>; - +includeBaselineControl: FormControl<bool>; - +studyScheduleControls: Map<String, FormControl<Object>>; - <static>+kNumCyclesMin: int; - <static>+kNumCyclesMax: int; - <static>+kPhaseDurationMin: int; - <static>+kPhaseDurationMax: int; - +sequenceTypeControlOptions: List<FormControlOption<PhaseSequence>>; - +studyScheduleValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +numCyclesRange: dynamic; - +phaseDurationRange: dynamic; - +customSequenceRequired: dynamic - | - +void setStudyScheduleControlsFrom(); - +StudyScheduleFormData buildStudyScheduleFormData(); - +bool isSequencingCustom() - ] - - [<abstract>StudyScheduleControls]o-[PhaseSequence] - [<abstract>StudyScheduleControls]o-[FormControl] - - [StudyDesignInterventionsFormView - | - +Widget build() - ] - - [<abstract>StudyDesignPageWidget]<:-[StudyDesignInterventionsFormView] - - [InterventionFormViewModel - | - +study: Study; - +interventionIdControl: FormControl<String>; - +interventionTitleControl: FormControl<String>; - +interventionIconControl: FormControl<IconOption>; - +interventionDescriptionControl: FormControl<String>; - +interventionTasksArray: FormArray<dynamic>; - +tasksCollection: FormViewModelCollection<InterventionTaskFormViewModel, InterventionTaskFormData>; - +form: FormGroup; - +interventionId: String; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titleRequired: dynamic; - +atLeastOneTask: dynamic; - +breadcrumbsTitle: String; - +titles: Map<FormMode, String> - | - +void setControlsFrom(); - +InterventionFormData buildFormData(); - +List<ModelAction<dynamic>> availableActions(); - +List<ModelAction<dynamic>> availablePopupActions(); - +List<ModelAction<dynamic>> availableInlineActions(); - +void onSelectItem(); - +void onNewItem(); - +void onCancel(); - +dynamic onSave(); - +InterventionTaskFormViewModel provide(); - +InterventionTaskFormRouteArgs buildNewFormRouteArgs(); - +InterventionTaskFormRouteArgs buildFormRouteArgs(); - +InterventionFormViewModel createDuplicate() - ] - - [InterventionFormViewModel]o-[Study] - [InterventionFormViewModel]o-[FormControl] - [InterventionFormViewModel]o-[FormArray] - [InterventionFormViewModel]o-[FormViewModelCollection] - [InterventionFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[InterventionFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[InterventionFormViewModel] - [<abstract>IListActionProvider]<:--[InterventionFormViewModel] - [<abstract>IProviderArgsResolver]<:--[InterventionFormViewModel] - - [StudyScheduleFormView - | - +formViewModel: StudyScheduleControls + [<abstract>StudyDesignPageWidget | - -FormTableRow _renderCustomSequence(); - +Widget build() + +Widget? banner() ] - [StudyScheduleFormView]o-[<abstract>StudyScheduleControls] - [<abstract>FormConsumerWidget]<:-[StudyScheduleFormView] + [<abstract>StudyPageWidget]<:-[<abstract>StudyDesignPageWidget] - [StudyScheduleFormData - | - +sequenceType: PhaseSequence; - +sequenceTypeCustom: String; - +numCycles: int; - +phaseDuration: int; - +includeBaseline: bool; - +id: String + [MeasurementSurveyFormData | - +StudySchedule toStudySchedule(); - +Study apply(); - +StudyScheduleFormData copy() - ] - - [StudyScheduleFormData]o-[PhaseSequence] - [<abstract>IStudyFormData]<:--[StudyScheduleFormData] - - [InterventionFormView + +measurementId: String; + +title: String; + +introText: String?; + +outroText: String?; + +questionnaireFormData: QuestionnaireFormData; + <static>+kDefaultTitle: String; + +id: String | - +formViewModel: InterventionFormViewModel + +QuestionnaireTask toQuestionnaireTask(); + +MeasurementSurveyFormData copy() ] - [InterventionFormView]o-[InterventionFormViewModel] + [MeasurementSurveyFormData]o-[QuestionnaireFormData] + [<abstract>IFormDataWithSchedule]<:-[MeasurementSurveyFormData] - [InterventionsFormViewModel + [MeasurementSurveyFormViewModel | +study: Study; - +router: GoRouter; - +interventionsArray: FormArray<dynamic>; - +interventionsCollection: FormViewModelCollection<InterventionFormViewModel, InterventionFormData>; + +measurementIdControl: FormControl<String>; + +instanceIdControl: FormControl<String>; + +surveyTitleControl: FormControl<String>; + +surveyIntroTextControl: FormControl<String>; + +surveyOutroTextControl: FormControl<String>; +form: FormGroup; + +measurementId: String; + +instanceId: String; +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +interventionsRequired: dynamic; - +titles: Map<FormMode, String>; - +canTestStudySchedule: bool + +titleRequired: dynamic; + +atLeastOneQuestion: dynamic; + +breadcrumbsTitle: String; + +titles: Map<FormMode, String> | +void setControlsFrom(); - +InterventionsFormData buildFormData(); - +void read(); + +MeasurementSurveyFormData buildFormData(); +List<ModelAction<dynamic>> availableActions(); +List<ModelAction<dynamic>> availablePopupActions(); +List<ModelAction<dynamic>> availableInlineActions(); +void onSelectItem(); +void onNewItem(); - +InterventionFormViewModel provide(); - +void onCancel(); - +dynamic onSave(); - +dynamic testStudySchedule() - ] - - [InterventionsFormViewModel]o-[Study] - [InterventionsFormViewModel]o-[GoRouter] - [InterventionsFormViewModel]o-[FormArray] - [InterventionsFormViewModel]o-[FormViewModelCollection] - [InterventionsFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[InterventionsFormViewModel] - [<abstract>StudyScheduleControls]<:-[InterventionsFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[InterventionsFormViewModel] - [<abstract>IListActionProvider]<:--[InterventionsFormViewModel] - [<abstract>IProviderArgsResolver]<:--[InterventionsFormViewModel] - - [InterventionTaskFormData - | - +taskId: String; - +taskTitle: String; - +taskDescription: String?; - <static>+kDefaultTitle: String; - +id: String - | - +CheckmarkTask toTask(); - +InterventionTaskFormData copy() + +SurveyQuestionFormRouteArgs buildNewFormRouteArgs(); + +SurveyQuestionFormRouteArgs buildFormRouteArgs(); + +MeasurementSurveyFormViewModel createDuplicate() ] - [<abstract>IFormDataWithSchedule]<:-[InterventionTaskFormData] + [MeasurementSurveyFormViewModel]o-[Study] + [MeasurementSurveyFormViewModel]o-[FormControl] + [MeasurementSurveyFormViewModel]o-[FormGroup] + [<abstract>ManagedFormViewModel]<:-[MeasurementSurveyFormViewModel] + [<abstract>WithQuestionnaireControls]<:-[MeasurementSurveyFormViewModel] + [<abstract>WithScheduleControls]<:-[MeasurementSurveyFormViewModel] + [<abstract>IFormViewModelDelegate]<:--[MeasurementSurveyFormViewModel] + [<abstract>IListActionProvider]<:--[MeasurementSurveyFormViewModel] + [<abstract>IProviderArgsResolver]<:--[MeasurementSurveyFormViewModel] - [InterventionPreview + [SurveyPreview | - +routeArgs: InterventionFormRouteArgs + +routeArgs: MeasurementFormRouteArgs | +Widget build() ] - [InterventionPreview]o-[InterventionFormRouteArgs] - [<abstract>ConsumerWidget]<:-[InterventionPreview] + [SurveyPreview]o-[MeasurementFormRouteArgs] + [<abstract>ConsumerWidget]<:-[SurveyPreview] - [InterventionTaskFormView + [MeasurementSurveyFormView | - +formViewModel: InterventionTaskFormViewModel + +formViewModel: MeasurementSurveyFormViewModel ] - [InterventionTaskFormView]o-[InterventionTaskFormViewModel] + [MeasurementSurveyFormView]o-[MeasurementSurveyFormViewModel] - [InterventionsFormData - | - +interventionsData: List<InterventionFormData>; - +studyScheduleData: StudyScheduleFormData; - +id: String + [StudyDesignMeasurementsFormView | - +Study apply(); - +InterventionsFormData copy() + +Widget build() ] - [InterventionsFormData]o-[StudyScheduleFormData] - [<abstract>IStudyFormData]<:--[InterventionsFormData] + [<abstract>StudyDesignPageWidget]<:-[StudyDesignMeasurementsFormView] - [InterventionTaskFormViewModel + [MeasurementsFormViewModel | - +taskIdControl: FormControl<String>; - +instanceIdControl: FormControl<String>; - +taskTitleControl: FormControl<String>; - +taskDescriptionControl: FormControl<String>; - +markAsCompletedControl: FormControl<bool>; + +study: Study; + +router: GoRouter; + +measurementsArray: FormArray<dynamic>; + +surveyMeasurementFormViewModels: FormViewModelCollection<MeasurementSurveyFormViewModel, MeasurementSurveyFormData>; +form: FormGroup; - +taskId: String; - +instanceId: String; + +measurementViewModels: List<MeasurementSurveyFormViewModel>; +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titleRequired: dynamic; + +measurementRequired: dynamic; +titles: Map<FormMode, String> | + +void read(); +void setControlsFrom(); - +InterventionTaskFormData buildFormData(); - +InterventionTaskFormViewModel createDuplicate() + +MeasurementsFormData buildFormData(); + +List<ModelAction<dynamic>> availableActions(); + +List<ModelAction<dynamic>> availablePopupActions(); + +List<ModelAction<dynamic>> availableInlineActions(); + +void onSelectItem(); + +void onNewItem(); + +MeasurementSurveyFormViewModel provide(); + +void onCancel(); + +dynamic onSave() ] - [InterventionTaskFormViewModel]o-[FormControl] - [InterventionTaskFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[InterventionTaskFormViewModel] - [<abstract>WithScheduleControls]<:-[InterventionTaskFormViewModel] + [MeasurementsFormViewModel]o-[Study] + [MeasurementsFormViewModel]o-[GoRouter] + [MeasurementsFormViewModel]o-[FormArray] + [MeasurementsFormViewModel]o-[FormViewModelCollection] + [MeasurementsFormViewModel]o-[FormGroup] + [<abstract>FormViewModel]<:-[MeasurementsFormViewModel] + [<abstract>IFormViewModelDelegate]<:--[MeasurementsFormViewModel] + [<abstract>IListActionProvider]<:--[MeasurementsFormViewModel] + [<abstract>IProviderArgsResolver]<:--[MeasurementsFormViewModel] - [InterventionFormData + [MeasurementsFormData | - +interventionId: String; - +title: String; - +description: String?; - +tasksData: List<InterventionTaskFormData>?; - +iconName: String?; - <static>+kDefaultTitle: String; + +surveyMeasurements: List<MeasurementSurveyFormData>; +id: String | - +Intervention toIntervention(); - +InterventionFormData copy() + +Study apply(); + +MeasurementsFormData copy() ] - [<abstract>IFormData]<:-[InterventionFormData] + [<abstract>IStudyFormData]<:--[MeasurementsFormData] - + - - - + - + - + - + - + + + - + - - - + - + - - - - - - + + + - - + - + - + - + - - + + + + - + - - - - + + + + + + + + + + - + - + - + - + + + - + - + + + - + - + + + - + - - - + - - - + + + + - - - + + + - - - + + + + + + + + + + + + + + + + + + + - - + - + - + - + - + - - - - - - - - + + + + - + - + - + - + - + - - + + - + - - - + + + + + + + + + - + - - - + - - - - + - - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - - + + - + - + - + - + - + - + - + - + - - + + + + + + + + - + + + + - + + - + - + - + - - - - - + - + - + + + - + - + + + - + - + - + - + - + - + - + - + - + - - + + + - - + - + + + + - - - + + + + - + - + + + - + - + - + - - - + - + - - + + - + - - + + - + - + - - - - - - + + + - + + - + - - - - - + - + - + - + + + + + - + + + + + + + + - - + - + - + + + + + - + - - - + - + - - - + + + - + - - + + - + + + + + + - - + + + - + - + + + - + - + - + - + - + - + - + - + - + - + - + - - - - + + + + + + + + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - - - - - - + - - - + + + - + + - + - + - + - + - - - - + + + - - - + + - + - - - - - + - + - - - + - + - - - + - + - + - + + + - - - - - - - - - - + - - - + + - + - + + + + + + + + + - + - + + + - + - + - + - - - + - - + + - + - + + + - + - + + + - + - - - - - - - - - - - - - - - + + + - + - + - + - + - + - - - + + - + + - + - + - + - + - + - + - + - + - + - + - + - - - - - - - + - + - + - + - - - + - + - + - + + + + + + - + + + + - + - + + + - + - + - + - - + + + + + + + + + + - + - + - + - + - - - - - - + - - - + + - - - - + - - + + + - + - + + + - + - + - + - + - + - + - + - + - + - - - - + + - + - + - + - + - - - - - - - - - - - - - - - - - - + + - - - - - - + - - - - - - - - - - - - - - + + + + + + - - - StudyDesignInfoFormView + + + StudyFormScaffold + + + + + + +studyId: String + +formViewModelBuilder: T Function(WidgetRef) + +formViewBuilder: Widget Function(T) + + + + + + +Widget build() - - - +Widget build() + + + + + + + + T Function(WidgetRef) - - - - + + + - - - StudyDesignPageWidget + + + Widget Function(T) - - - +Widget? banner() + + + + + + + + ConsumerWidget - - - - - + + + + + - - - StudyInfoFormViewModel + + + InterventionsFormViewModel - - - +study: Study - +titleControl: FormControl<String> - +iconControl: FormControl<IconOption> - +descriptionControl: FormControl<String> - +organizationControl: FormControl<String> - +reviewBoardControl: FormControl<String> - +reviewBoardNumberControl: FormControl<String> - +researchersControl: FormControl<String> - +emailControl: FormControl<String> - +websiteControl: FormControl<String> - +phoneControl: FormControl<String> - +additionalInfoControl: FormControl<String> - +form: FormGroup - +titles: Map<FormMode, String> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titleRequired: dynamic - +descriptionRequired: dynamic - +iconRequired: dynamic - +organizationRequired: dynamic - +reviewBoardRequired: dynamic - +reviewBoardNumberRequired: dynamic - +researchersRequired: dynamic - +emailRequired: dynamic - +phoneRequired: dynamic - +emailFormat: dynamic - +websiteFormat: dynamic + + + +study: Study + +router: GoRouter + +interventionsArray: FormArray<dynamic> + +interventionsCollection: FormViewModelCollection<InterventionFormViewModel, InterventionFormData> + +form: FormGroup + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +interventionsRequired: dynamic + +titles: Map<FormMode, String> + +canTestStudySchedule: bool - - - +void setControlsFrom() - +StudyInfoFormData buildFormData() + + + +void setControlsFrom() + +InterventionsFormData buildFormData() + +void read() + +List<ModelAction<dynamic>> availableActions() + +List<ModelAction<dynamic>> availablePopupActions() + +List<ModelAction<dynamic>> availableInlineActions() + +void onSelectItem() + +void onNewItem() + +InterventionFormViewModel provide() + +void onCancel() + +dynamic onSave() + +dynamic testStudySchedule() - + - + Study - - - + + + - - - FormControl + + + GoRouter - - - + + + - - - FormGroup + + + FormArray - - - + + + - - - FormViewModel + + + FormViewModelCollection - - - - - + + + - - - StudyInfoFormData + + + FormGroup - - - +title: String - +description: String? - +iconName: String - +contactInfoFormData: StudyContactInfoFormData - +id: String - - + + + + - - - +Study apply() - +StudyInfoFormData copy() + + + FormViewModel - - - - - + + + + + - - - StudyContactInfoFormData + + + StudyScheduleControls - - - +organization: String? - +institutionalReviewBoard: String? - +institutionalReviewBoardNumber: String? - +researchers: String? - +email: String? - +website: String? - +phone: String? - +additionalInfo: String? - +id: String + + + <static>+defaultScheduleType: PhaseSequence + <static>+defaultScheduleTypeSequence: String + <static>+defaultNumCycles: int + <static>+defaultPeriodLength: int + +sequenceTypeControl: FormControl<PhaseSequence> + +sequenceTypeCustomControl: FormControl<String> + +phaseDurationControl: FormControl<int> + +numCyclesControl: FormControl<int> + +includeBaselineControl: FormControl<bool> + +studyScheduleControls: Map<String, FormControl<Object>> + <static>+kNumCyclesMin: int + <static>+kNumCyclesMax: int + <static>+kPhaseDurationMin: int + <static>+kPhaseDurationMax: int + +sequenceTypeControlOptions: List<FormControlOption<PhaseSequence>> + +studyScheduleValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +numCyclesRange: dynamic + +phaseDurationRange: dynamic + +customSequenceRequired: dynamic - - - +Study apply() - +StudyInfoFormData copy() + + + +void setStudyScheduleControlsFrom() + +StudyScheduleFormData buildStudyScheduleFormData() + +bool isSequencingCustom() - - - - - - - - IStudyFormData - - + + + - - - +Study apply() + + + IFormViewModelDelegate - - - - - + + + - - - StudyFormScaffold + + + IListActionProvider - - - +studyId: String - +formViewModelBuilder: T Function(WidgetRef) - +formViewBuilder: Widget Function(T) - - + + + + - - - +Widget build() + + + IProviderArgsResolver - - - + + + + - - - T Function(WidgetRef) + + + InterventionTaskFormView - - - - - - - - Widget Function(T) + + + +formViewModel: InterventionTaskFormViewModel - - - + + + + + - - - ConsumerWidget + + + InterventionTaskFormViewModel - - - - - - - - - StudyFormValidationSet + + + +taskIdControl: FormControl<String> + +instanceIdControl: FormControl<String> + +taskTitleControl: FormControl<String> + +taskDescriptionControl: FormControl<String> + +markAsCompletedControl: FormControl<bool> + +form: FormGroup + +taskId: String + +instanceId: String + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titleRequired: dynamic + +titles: Map<FormMode, String> - - - - +index: int - <static>+values: List<StudyFormValidationSet> + + + + +void setControlsFrom() + +InterventionTaskFormData buildFormData() + +InterventionTaskFormViewModel createDuplicate() - - - + + + + + - - - Enum + + + InterventionPreview - - - - - + + + +routeArgs: InterventionFormRouteArgs + + - - - StudyDesignMeasurementsFormView + + + +Widget build() - - - +Widget build() + + + + + + + + InterventionFormRouteArgs - - - - - + + + + + - - - MeasurementsFormViewModel + + + StudyScheduleFormView - - - +study: Study - +router: GoRouter - +measurementsArray: FormArray<dynamic> - +surveyMeasurementFormViewModels: FormViewModelCollection<MeasurementSurveyFormViewModel, MeasurementSurveyFormData> - +form: FormGroup - +measurementViewModels: List<MeasurementSurveyFormViewModel> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +measurementRequired: dynamic - +titles: Map<FormMode, String> + + + +formViewModel: StudyScheduleControls - - - +void read() - +void setControlsFrom() - +MeasurementsFormData buildFormData() - +List<ModelAction<dynamic>> availableActions() - +List<ModelAction<dynamic>> availablePopupActions() - +List<ModelAction<dynamic>> availableInlineActions() - +void onSelectItem() - +void onNewItem() - +MeasurementSurveyFormViewModel provide() - +void onCancel() - +dynamic onSave() + + + -FormTableRow _renderCustomSequence() + +Widget build() - - - + + + - - - GoRouter + + + FormConsumerWidget - - - + + + + - - - FormArray + + + InterventionFormView - - - - - - - - FormViewModelCollection + + + +formViewModel: InterventionFormViewModel - - - + + + + + - - - IFormViewModelDelegate + + + InterventionFormViewModel - - - - + + + +study: Study + +interventionIdControl: FormControl<String> + +interventionTitleControl: FormControl<String> + +interventionIconControl: FormControl<IconOption> + +interventionDescriptionControl: FormControl<String> + +interventionTasksArray: FormArray<dynamic> + +tasksCollection: FormViewModelCollection<InterventionTaskFormViewModel, InterventionTaskFormData> + +form: FormGroup + +interventionId: String + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titleRequired: dynamic + +atLeastOneTask: dynamic + +breadcrumbsTitle: String + +titles: Map<FormMode, String> + + - - - IListActionProvider + + + +void setControlsFrom() + +InterventionFormData buildFormData() + +List<ModelAction<dynamic>> availableActions() + +List<ModelAction<dynamic>> availablePopupActions() + +List<ModelAction<dynamic>> availableInlineActions() + +void onSelectItem() + +void onNewItem() + +void onCancel() + +dynamic onSave() + +InterventionTaskFormViewModel provide() + +InterventionTaskFormRouteArgs buildNewFormRouteArgs() + +InterventionTaskFormRouteArgs buildFormRouteArgs() + +InterventionFormViewModel createDuplicate() - - - + + + + + - - - IProviderArgsResolver + + + InterventionFormData - - - - - - - - - - MeasurementsFormData + + + +interventionId: String + +title: String + +description: String? + +tasksData: List<InterventionTaskFormData>? + +iconName: String? + <static>+kDefaultTitle: String + +id: String - - - +surveyMeasurements: List<MeasurementSurveyFormData> - +id: String + + + +Intervention toIntervention() + +InterventionFormData copy() - - - +Study apply() - +MeasurementsFormData copy() + + + + + + + + IFormData - - - - - + + + + + - - - MeasurementSurveyFormViewModel + + + StudyScheduleFormData - - - +study: Study - +measurementIdControl: FormControl<String> - +instanceIdControl: FormControl<String> - +surveyTitleControl: FormControl<String> - +surveyIntroTextControl: FormControl<String> - +surveyOutroTextControl: FormControl<String> - +form: FormGroup - +measurementId: String - +instanceId: String - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titleRequired: dynamic - +atLeastOneQuestion: dynamic - +breadcrumbsTitle: String - +titles: Map<FormMode, String> + + + +sequenceType: PhaseSequence + +sequenceTypeCustom: String + +numCycles: int + +phaseDuration: int + +includeBaseline: bool + +id: String - - - +void setControlsFrom() - +MeasurementSurveyFormData buildFormData() - +List<ModelAction<dynamic>> availableActions() - +List<ModelAction<dynamic>> availablePopupActions() - +List<ModelAction<dynamic>> availableInlineActions() - +void onSelectItem() - +void onNewItem() - +SurveyQuestionFormRouteArgs buildNewFormRouteArgs() - +SurveyQuestionFormRouteArgs buildFormRouteArgs() - +MeasurementSurveyFormViewModel createDuplicate() + + + +StudySchedule toStudySchedule() + +Study apply() + +StudyScheduleFormData copy() - - - + + + - - - ManagedFormViewModel + + + PhaseSequence - - - - - + + + + - - - WithQuestionnaireControls + + + IStudyFormData - - - +questionsArray: FormArray<dynamic> - +questionFormViewModels: FormViewModelCollection<Q, QuestionFormData> - +questionnaireControls: Map<String, FormArray<dynamic>> - +propagateOnSave: bool - +questionModels: List<Q> - +questionTitles: Map<FormMode, String Function()> + + + +Study apply() - - - +void setQuestionnaireControlsFrom() - +QuestionnaireFormData buildQuestionnaireFormData() - +void read() - +void onCancel() - +dynamic onSave() - +Q provide() - +Q provideQuestionFormViewModel() + + + + + + + + FormControl + + + + + + + + + + + ManagedFormViewModel - - - + + + - + WithScheduleControls - + +isTimeRestrictedControl: FormControl<bool> +instanceID: FormControl<String> @@ -2511,7 +2530,7 @@ - + +void setScheduleControlsFrom() -dynamic _initReminderControl() @@ -2519,79 +2538,113 @@ - - - - - + + + + + - - - MeasurementSurveyFormData + + + InterventionsFormData - - - +measurementId: String - +title: String - +introText: String? - +outroText: String? - +questionnaireFormData: QuestionnaireFormData - <static>+kDefaultTitle: String - +id: String + + + +interventionsData: List<InterventionFormData> + +studyScheduleData: StudyScheduleFormData + +id: String - - - +QuestionnaireTask toQuestionnaireTask() - +MeasurementSurveyFormData copy() + + + +Study apply() + +InterventionsFormData copy() - - - - - + + + + - - - QuestionnaireFormData + + + StudyDesignInterventionsFormView - - - +questionsData: List<QuestionFormData>? - +id: String + + + +Widget build() - - - +StudyUQuestionnaire toQuestionnaire() - +List<EligibilityCriterion> toEligibilityCriteria() - +QuestionnaireFormData copy() + + + + + + + + + StudyDesignPageWidget + + + + + + +Widget? banner() + + + + + + + + + + + + + InterventionTaskFormData + + + + + + +taskId: String + +taskTitle: String + +taskDescription: String? + <static>+kDefaultTitle: String + +id: String + + + + + + +CheckmarkTask toTask() + +InterventionTaskFormData copy() - - - + + + - + IFormDataWithSchedule - + +instanceId: String +isTimeLocked: bool @@ -2602,91 +2655,86 @@ - + +Schedule toSchedule() - - - - - - - - - SurveyPreview - - + + + + + - - - +routeArgs: MeasurementFormRouteArgs + + + ReportBadge - - - +Widget build() + + + +status: ReportStatus? + +type: BadgeType + +showPrefixIcon: bool + +showTooltip: bool - - - - - - - - MeasurementFormRouteArgs + + + +Widget build() - - - - + + + + - - - MeasurementSurveyFormView + + + ReportStatus - - - +formViewModel: MeasurementSurveyFormViewModel + + + +index: int + <static>+values: List<ReportStatus> + <static>+primary: ReportStatus + <static>+secondary: ReportStatus - - - + + + - - - IFormData + + + BadgeType - - - + + + - + ReportsFormViewModel - + +study: Study +router: GoRouter @@ -2701,7 +2749,7 @@ - + +void setControlsFrom() +ReportsFormData buildFormData() @@ -2718,17 +2766,17 @@ - - - + + + - + ReportFormItemDelegate - + +formViewModelCollection: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData> +owner: ReportsFormViewModel @@ -2737,7 +2785,7 @@ - + +void onCancel() +dynamic onSave() @@ -2749,49 +2797,76 @@ - - - - - + + + + - - - ReportItemFormView + + + StudyDesignReportsFormView - - - +formViewModel: ReportItemFormViewModel - +studyId: String - +reportSectionColumnWidth: dynamic - +sectionTypeBodyBuilder: Widget Function(BuildContext) + + + +Widget build() + -dynamic _showReportItemSidesheetWithArgs() - - - +Widget build() - -dynamic _buildSectionText() - -dynamic _buildSectionTypeHeader() + + + + + + + + + + ReportsFormData + + + + + + +reportItems: List<ReportItemFormData> + +id: String + + + + + + +Study apply() + +ReportsFormData copy() + + + + + + + + + + + Enum - - - + + + - + ReportItemFormViewModel - + <static>+defaultSectionType: ReportSectionType +sectionIdControl: FormControl<String> @@ -2824,7 +2899,7 @@ - + -List<FormControlValidation> _getValidationConfig() +ReportItemFormData buildFormData() @@ -2836,132 +2911,120 @@ - - - - - - - Widget Function(BuildContext) - - - - - - - - - - - - - LinearRegressionSectionFormView - - + + + + - - - +formViewModel: ReportItemFormViewModel - +studyId: String - +reportSectionColumnWidth: Map<int, TableColumnWidth> + + + ReportSectionType - - - +Widget build() + + + +index: int + <static>+values: List<ReportSectionType> + <static>+average: ReportSectionType + <static>+linearRegression: ReportSectionType - - - - - + + + + + - - - DataReferenceIdentifier + + + ReportItemFormData - - - +hashCode: int + + + +isPrimary: bool + +section: ReportSection + +id: String - - - +bool ==() + + + <static>+dynamic fromDomainModel() + +ReportItemFormData copy() - - - + + + - - - DataReference + + + ReportSection - - - - - + + + + + - - - DataReferenceEditor + + + ReportItemFormView - - - +formControl: FormControl<DataReferenceIdentifier<T>> - +availableTasks: List<Task> - +buildReactiveDropdownField: ReactiveDropdownField<dynamic> + + + +formViewModel: ReportItemFormViewModel + +studyId: String + +reportSectionColumnWidth: dynamic + +sectionTypeBodyBuilder: Widget Function(BuildContext) - - - +FormTableRow buildFormTableRow() - -List<DropdownMenuItem<DataReferenceIdentifier<dynamic>>> _dataReferenceItems() + + + +Widget build() + -dynamic _buildSectionText() + -dynamic _buildSectionTypeHeader() - - - + + + - - - ReactiveDropdownField + + + Widget Function(BuildContext) - - - + + + - + TemporalAggregationFormatted - + -_value: TemporalAggregation <static>+values: List<TemporalAggregationFormatted> @@ -2972,7 +3035,7 @@ - + +bool ==() +String toString() @@ -2984,9 +3047,9 @@ - + - + TemporalAggregation @@ -2995,9 +3058,9 @@ - + - + IconData @@ -3006,17 +3069,17 @@ - - - + + + - + ImprovementDirectionFormatted - + -_value: ImprovementDirection <static>+values: List<ImprovementDirectionFormatted> @@ -3027,7 +3090,7 @@ - + +bool ==() +String toString() @@ -3039,271 +3102,329 @@ - + - + ImprovementDirection - - - - + + + + + - - - ReportSectionType + + + DataReferenceIdentifier - - - +index: int - <static>+values: List<ReportSectionType> - <static>+average: ReportSectionType - <static>+linearRegression: ReportSectionType + + + +hashCode: int + + + + + + +bool ==() - - - - - + + + - - - AverageSectionFormView + + + DataReference - - - +formViewModel: ReportItemFormViewModel - +studyId: String - +reportSectionColumnWidth: Map<int, TableColumnWidth> + + + + + + + + + + LinearRegressionSectionFormView - - - +Widget build() + + + +formViewModel: ReportItemFormViewModel + +studyId: String + +reportSectionColumnWidth: Map<int, TableColumnWidth> + + + + + + +Widget build() - - - - - + + + + + - - - ReportItemFormData + + + DataReferenceEditor - - - +isPrimary: bool - +section: ReportSection - +id: String + + + +formControl: FormControl<DataReferenceIdentifier<T>> + +availableTasks: List<Task> + +buildReactiveDropdownField: ReactiveDropdownField<dynamic> - - - <static>+dynamic fromDomainModel() - +ReportItemFormData copy() + + + +FormTableRow buildFormTableRow() + -List<DropdownMenuItem<DataReferenceIdentifier<dynamic>>> _dataReferenceItems() - - - + + + - - - ReportSection + + + ReactiveDropdownField - - - - - + + + + + - - - ReportsFormData + + + AverageSectionFormView - - - +reportItems: List<ReportItemFormData> - +id: String + + + +formViewModel: ReportItemFormViewModel + +studyId: String + +reportSectionColumnWidth: Map<int, TableColumnWidth> - - - +Study apply() - +ReportsFormData copy() + + + +Widget build() - - - - + + + + + - - - ReportStatus + + + StudyInfoFormData - - - +index: int - <static>+values: List<ReportStatus> - <static>+primary: ReportStatus - <static>+secondary: ReportStatus + + + +title: String + +description: String? + +iconName: String + +contactInfoFormData: StudyContactInfoFormData + +id: String + + + + + + +Study apply() + +StudyInfoFormData copy() - - - - + + + + + - - - StudyDesignReportsFormView + + + StudyContactInfoFormData - - - +Widget build() - -dynamic _showReportItemSidesheetWithArgs() + + + +organization: String? + +institutionalReviewBoard: String? + +institutionalReviewBoardNumber: String? + +researchers: String? + +email: String? + +website: String? + +phone: String? + +additionalInfo: String? + +id: String - - - - - - - - - - ReportBadge + + + +Study apply() + +StudyInfoFormData copy() - - - +status: ReportStatus? - +type: BadgeType - +showPrefixIcon: bool - +showTooltip: bool + + + + + + + + + + StudyInfoFormViewModel - - - +Widget build() + + + +study: Study + +titleControl: FormControl<String> + +iconControl: FormControl<IconOption> + +descriptionControl: FormControl<String> + +organizationControl: FormControl<String> + +reviewBoardControl: FormControl<String> + +reviewBoardNumberControl: FormControl<String> + +researchersControl: FormControl<String> + +emailControl: FormControl<String> + +websiteControl: FormControl<String> + +phoneControl: FormControl<String> + +additionalInfoControl: FormControl<String> + +form: FormGroup + +titles: Map<FormMode, String> + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titleRequired: dynamic + +descriptionRequired: dynamic + +iconRequired: dynamic + +organizationRequired: dynamic + +reviewBoardRequired: dynamic + +reviewBoardNumberRequired: dynamic + +researchersRequired: dynamic + +emailRequired: dynamic + +phoneRequired: dynamic + +emailFormat: dynamic + +websiteFormat: dynamic - - - - - - - - BadgeType + + + +void setControlsFrom() + +StudyInfoFormData buildFormData() - - - - + + + + - - - StudyDesignEnrollmentFormView + + + StudyDesignInfoFormView - - - +Widget build() - -dynamic _showScreenerQuestionSidesheetWithArgs() - -dynamic _showConsentItemSidesheetWithArgs() + + + +Widget build() - - - - - + + + + - - - ConsentItemFormData + + + StudyFormValidationSet - - - +consentId: String - +title: String - +description: String - +iconName: String? - +id: String + + + +index: int + <static>+values: List<StudyFormValidationSet> + + + + + + + + + + + + StudyDesignEnrollmentFormView - - - +ConsentItem toConsentItem() - +ConsentItemFormData copy() + + + +Widget build() + -dynamic _showScreenerQuestionSidesheetWithArgs() + -dynamic _showConsentItemSidesheetWithArgs() - - - + + + - + EnrollmentFormData - + <static>+kDefaultEnrollmentType: Participation +enrollmentType: Participation @@ -3313,7 +3434,7 @@ - + +Study apply() +EnrollmentFormData copy() @@ -3323,28 +3444,56 @@ - + - + Participation + + + + + + + + + QuestionnaireFormData + + + + + + +questionsData: List<QuestionFormData>? + +id: String + + + + + + +StudyUQuestionnaire toQuestionnaire() + +List<EligibilityCriterion> toEligibilityCriteria() + +QuestionnaireFormData copy() + + + + - - - + + + - + ConsentItemFormViewModel - + +consentIdControl: FormControl<String> +titleControl: FormControl<String> @@ -3359,7 +3508,7 @@ - + +void setControlsFrom() +ConsentItemFormData buildFormData() @@ -3368,65 +3517,19 @@ - - - - - - - - IScreenerQuestionLogicFormViewModel - - - - - - +isDirtyOptionsBannerVisible: bool - - - - - - - - - - - - - ScreenerQuestionLogicFormView - - - - - - +formViewModel: ScreenerQuestionFormViewModel - - - - - - +Widget build() - -dynamic _buildInfoBanner() - -dynamic _buildAnswerOptionsLogicControls() - -List<Widget> _buildOptionLogicRow() - - - - - - - + + + - + ScreenerQuestionFormViewModel - + <static>+defaultResponseOptionValidity: bool +responseOptionsDisabledArray: FormArray<dynamic> @@ -3442,7 +3545,7 @@ - + +dynamic onResponseOptionsChanged() +void setControlsFrom() @@ -3455,30 +3558,19 @@ - - - - - - - FormConsumerWidget - - - - - - - + + + - + QuestionFormViewModel - + <static>+defaultQuestionType: SurveyQuestionType -_titles: Map<FormMode, String Function()>? @@ -3533,7 +3625,7 @@ - + +String? scaleMidLabelAt() -dynamic _onScaleRangeChanged() @@ -3554,19 +3646,113 @@ + + + + + + + + IScreenerQuestionLogicFormViewModel + + + + + + +isDirtyOptionsBannerVisible: bool + + + + + + + + + + + + ConsentItemFormView + + + + + + +formViewModel: ConsentItemFormViewModel + + + + + + + + + + + + + ConsentItemFormData + + + + + + +consentId: String + +title: String + +description: String + +iconName: String? + +id: String + + + + + + +ConsentItem toConsentItem() + +ConsentItemFormData copy() + + + + + + + + + + + + + ScreenerQuestionLogicFormView + + + + + + +formViewModel: ScreenerQuestionFormViewModel + + + + + + +Widget build() + -dynamic _buildInfoBanner() + -dynamic _buildAnswerOptionsLogicControls() + -List<Widget> _buildOptionLogicRow() + + + + - - - + + + - + EnrollmentFormViewModel - + +study: Study +router: GoRouter @@ -3585,7 +3771,7 @@ - + +void setControlsFrom() +EnrollmentFormData buildFormData() @@ -3608,17 +3794,17 @@ - - - + + + - + EnrollmentFormConsentItemDelegate - + +formViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData> +owner: EnrollmentFormViewModel @@ -3627,7 +3813,7 @@ - + +void onCancel() +dynamic onSave() @@ -3639,193 +3825,96 @@ - - - - - - - - ConsentItemFormView - - - - - - +formViewModel: ConsentItemFormViewModel - - - - - - - - - - - StreamSubscription - - - - - - - - - - - StudyUTimeOfDay - - - - - - - - - - - - - ScheduleControls - - - - - - +formViewModel: WithScheduleControls - - - - - - +Widget build() - -List<FormTableRow> _conditionalTimeRestrictions() - - - - - - - - - - - - SurveyQuestionType - - - - - - +index: int - <static>+values: List<SurveyQuestionType> - <static>+choice: SurveyQuestionType - <static>+bool: SurveyQuestionType - <static>+scale: SurveyQuestionType - - - - - - - - - - - - - ChoiceQuestionFormView - - - - - - +formViewModel: QuestionFormViewModel - - - - - - +Widget build() - - - - - - - - - + + + + + - - - BoolQuestionFormView + + + WithQuestionnaireControls - - - +formViewModel: QuestionFormViewModel + + + +questionsArray: FormArray<dynamic> + +questionFormViewModels: FormViewModelCollection<Q, QuestionFormData> + +questionnaireControls: Map<String, FormArray<dynamic>> + +propagateOnSave: bool + +questionModels: List<Q> + +questionTitles: Map<FormMode, String Function()> - - - +Widget build() + + + +void setQuestionnaireControlsFrom() + +QuestionnaireFormData buildQuestionnaireFormData() + +void read() + +void onCancel() + +dynamic onSave() + +Q provide() + +Q provideQuestionFormViewModel() - - - - + + + + - - - IScaleQuestionFormViewModel + + + SurveyQuestionFormView - - - +isMidValuesClearedInfoVisible: bool + + + +formViewModel: QuestionFormViewModel + +isHtmlStyleable: bool - - - - + + + + - - - ScaleQuestionFormView + + + SurveyQuestionType - - - +formViewModel: QuestionFormViewModel + + + +index: int + <static>+values: List<SurveyQuestionType> + <static>+choice: SurveyQuestionType + <static>+bool: SurveyQuestionType + <static>+scale: SurveyQuestionType - - - + + + - + QuestionFormData - + <static>+questionTypeFormDataFactories: Map<SurveyQuestionType, QuestionFormData Function(Question<dynamic>, List<EligibilityCriterion>)> +questionId: String @@ -3838,7 +3927,7 @@ - + +Question<dynamic> toQuestion() +EligibilityCriterion toEligibilityCriterion() @@ -3851,17 +3940,17 @@ - - - + + + - + ChoiceQuestionFormData - + +isMultipleChoice: bool +answerOptions: List<String> @@ -3869,7 +3958,7 @@ - + +Question<dynamic> toQuestion() +QuestionFormData copy() @@ -3881,24 +3970,24 @@ - - - + + + - + BoolQuestionFormData - + <static>+kResponseOptions: Map<String, bool> +responseOptions: List<String> - + +Question<dynamic> toQuestion() +BoolQuestionFormData copy() @@ -3909,17 +3998,17 @@ - - - + + + - + ScaleQuestionFormData - + +minValue: double +maxValue: double @@ -3936,7 +4025,7 @@ - + +ScaleQuestion toQuestion() +QuestionFormData copy() @@ -3947,531 +4036,442 @@ - + - + Color - - - - + + + + - - - SurveyQuestionFormView + + + IScaleQuestionFormViewModel - - - +formViewModel: QuestionFormViewModel - +isHtmlStyleable: bool + + + +isMidValuesClearedInfoVisible: bool - - - + + + + - - - StudyPageWidget + + + ScaleQuestionFormView - - - - - - - - - - StudyFormViewModel + + + +formViewModel: QuestionFormViewModel - - - +studyDirtyCopy: Study? - +studyRepository: IStudyRepository - +authRepository: IAuthRepository - +router: GoRouter - +studyInfoFormViewModel: StudyInfoFormViewModel - +enrollmentFormViewModel: EnrollmentFormViewModel - +measurementsFormViewModel: MeasurementsFormViewModel - +reportsFormViewModel: ReportsFormViewModel - +interventionsFormViewModel: InterventionsFormViewModel - +form: FormGroup - +isStudyReadonly: bool - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titles: Map<FormMode, String> - - + + + + + + - - - +void read() - +void setControlsFrom() - +Study buildFormData() - +void dispose() - +void onCancel() - +dynamic onSave() - -dynamic _applyAndSaveSubform() + + + BoolQuestionFormView - - - - - - - - IStudyRepository + + + +formViewModel: QuestionFormViewModel - - - - - - - - IAuthRepository + + + +Widget build() - - - - - + + + + + - - - InterventionsFormViewModel + + + ChoiceQuestionFormView - - - +study: Study - +router: GoRouter - +interventionsArray: FormArray<dynamic> - +interventionsCollection: FormViewModelCollection<InterventionFormViewModel, InterventionFormData> - +form: FormGroup - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +interventionsRequired: dynamic - +titles: Map<FormMode, String> - +canTestStudySchedule: bool + + + +formViewModel: QuestionFormViewModel - - - +void setControlsFrom() - +InterventionsFormData buildFormData() - +void read() - +List<ModelAction<dynamic>> availableActions() - +List<ModelAction<dynamic>> availablePopupActions() - +List<ModelAction<dynamic>> availableInlineActions() - +void onSelectItem() - +void onNewItem() - +InterventionFormViewModel provide() - +void onCancel() - +dynamic onSave() - +dynamic testStudySchedule() + + + +Widget build() - - - - - + + + + + - - - StudyScheduleControls + + + ScheduleControls - - - <static>+defaultScheduleType: PhaseSequence - <static>+defaultScheduleTypeSequence: String - <static>+defaultNumCycles: int - <static>+defaultPeriodLength: int - +sequenceTypeControl: FormControl<PhaseSequence> - +sequenceTypeCustomControl: FormControl<String> - +phaseDurationControl: FormControl<int> - +numCyclesControl: FormControl<int> - +includeBaselineControl: FormControl<bool> - +studyScheduleControls: Map<String, FormControl<Object>> - <static>+kNumCyclesMin: int - <static>+kNumCyclesMax: int - <static>+kPhaseDurationMin: int - <static>+kPhaseDurationMax: int - +sequenceTypeControlOptions: List<FormControlOption<PhaseSequence>> - +studyScheduleValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +numCyclesRange: dynamic - +phaseDurationRange: dynamic - +customSequenceRequired: dynamic + + + +formViewModel: WithScheduleControls - - - +void setStudyScheduleControlsFrom() - +StudyScheduleFormData buildStudyScheduleFormData() - +bool isSequencingCustom() + + + +Widget build() + -List<FormTableRow> _conditionalTimeRestrictions() - - - + + + - - - PhaseSequence + + + StreamSubscription - - - - - - - - StudyDesignInterventionsFormView - - + + + - - - +Widget build() + + + StudyUTimeOfDay - - - - - - - - - InterventionFormViewModel - - + + + + + - - - +study: Study - +interventionIdControl: FormControl<String> - +interventionTitleControl: FormControl<String> - +interventionIconControl: FormControl<IconOption> - +interventionDescriptionControl: FormControl<String> - +interventionTasksArray: FormArray<dynamic> - +tasksCollection: FormViewModelCollection<InterventionTaskFormViewModel, InterventionTaskFormData> - +form: FormGroup - +interventionId: String - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titleRequired: dynamic - +atLeastOneTask: dynamic - +breadcrumbsTitle: String - +titles: Map<FormMode, String> + + + StudyFormViewModel - - - +void setControlsFrom() - +InterventionFormData buildFormData() - +List<ModelAction<dynamic>> availableActions() - +List<ModelAction<dynamic>> availablePopupActions() - +List<ModelAction<dynamic>> availableInlineActions() - +void onSelectItem() - +void onNewItem() - +void onCancel() - +dynamic onSave() - +InterventionTaskFormViewModel provide() - +InterventionTaskFormRouteArgs buildNewFormRouteArgs() - +InterventionTaskFormRouteArgs buildFormRouteArgs() - +InterventionFormViewModel createDuplicate() + + + +studyDirtyCopy: Study? + +studyRepository: IStudyRepository + +authRepository: IAuthRepository + +router: GoRouter + +studyInfoFormViewModel: StudyInfoFormViewModel + +enrollmentFormViewModel: EnrollmentFormViewModel + +measurementsFormViewModel: MeasurementsFormViewModel + +reportsFormViewModel: ReportsFormViewModel + +interventionsFormViewModel: InterventionsFormViewModel + +form: FormGroup + +isStudyReadonly: bool + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titles: Map<FormMode, String> - - - - - - - - - - StudyScheduleFormView + + + +void read() + +void setControlsFrom() + +Study buildFormData() + +void dispose() + +void onCancel() + +dynamic onSave() + -dynamic _applyAndSaveSubform() - - - +formViewModel: StudyScheduleControls + + + + + + + + IStudyRepository - - - -FormTableRow _renderCustomSequence() - +Widget build() + + + + + + + + IAuthRepository - - - - - + + + + + - - - StudyScheduleFormData + + + MeasurementsFormViewModel - - - +sequenceType: PhaseSequence - +sequenceTypeCustom: String - +numCycles: int - +phaseDuration: int - +includeBaseline: bool - +id: String + + + +study: Study + +router: GoRouter + +measurementsArray: FormArray<dynamic> + +surveyMeasurementFormViewModels: FormViewModelCollection<MeasurementSurveyFormViewModel, MeasurementSurveyFormData> + +form: FormGroup + +measurementViewModels: List<MeasurementSurveyFormViewModel> + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +measurementRequired: dynamic + +titles: Map<FormMode, String> - - - +StudySchedule toStudySchedule() - +Study apply() - +StudyScheduleFormData copy() + + + +void read() + +void setControlsFrom() + +MeasurementsFormData buildFormData() + +List<ModelAction<dynamic>> availableActions() + +List<ModelAction<dynamic>> availablePopupActions() + +List<ModelAction<dynamic>> availableInlineActions() + +void onSelectItem() + +void onNewItem() + +MeasurementSurveyFormViewModel provide() + +void onCancel() + +dynamic onSave() - - - - - - - - InterventionFormView - - + + + - - - +formViewModel: InterventionFormViewModel + + + StudyPageWidget - - - - - + + + + + - - - InterventionTaskFormData + + + MeasurementSurveyFormData - - - +taskId: String - +taskTitle: String - +taskDescription: String? - <static>+kDefaultTitle: String - +id: String + + + +measurementId: String + +title: String + +introText: String? + +outroText: String? + +questionnaireFormData: QuestionnaireFormData + <static>+kDefaultTitle: String + +id: String - - - +CheckmarkTask toTask() - +InterventionTaskFormData copy() + + + +QuestionnaireTask toQuestionnaireTask() + +MeasurementSurveyFormData copy() - - - - - + + + + + - - - InterventionPreview + + + MeasurementSurveyFormViewModel - - - +routeArgs: InterventionFormRouteArgs + + + +study: Study + +measurementIdControl: FormControl<String> + +instanceIdControl: FormControl<String> + +surveyTitleControl: FormControl<String> + +surveyIntroTextControl: FormControl<String> + +surveyOutroTextControl: FormControl<String> + +form: FormGroup + +measurementId: String + +instanceId: String + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titleRequired: dynamic + +atLeastOneQuestion: dynamic + +breadcrumbsTitle: String + +titles: Map<FormMode, String> - - - +Widget build() + + + +void setControlsFrom() + +MeasurementSurveyFormData buildFormData() + +List<ModelAction<dynamic>> availableActions() + +List<ModelAction<dynamic>> availablePopupActions() + +List<ModelAction<dynamic>> availableInlineActions() + +void onSelectItem() + +void onNewItem() + +SurveyQuestionFormRouteArgs buildNewFormRouteArgs() + +SurveyQuestionFormRouteArgs buildFormRouteArgs() + +MeasurementSurveyFormViewModel createDuplicate() - - - + + + + + - - - InterventionFormRouteArgs + + + SurveyPreview - - - - - - - - - InterventionTaskFormView + + + +routeArgs: MeasurementFormRouteArgs - - - +formViewModel: InterventionTaskFormViewModel + + + +Widget build() - - - - - + + + - - - InterventionTaskFormViewModel + + + MeasurementFormRouteArgs - - - +taskIdControl: FormControl<String> - +instanceIdControl: FormControl<String> - +taskTitleControl: FormControl<String> - +taskDescriptionControl: FormControl<String> - +markAsCompletedControl: FormControl<bool> - +form: FormGroup - +taskId: String - +instanceId: String - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titleRequired: dynamic - +titles: Map<FormMode, String> + + + + + + + + + MeasurementSurveyFormView - - - +void setControlsFrom() - +InterventionTaskFormData buildFormData() - +InterventionTaskFormViewModel createDuplicate() + + + +formViewModel: MeasurementSurveyFormViewModel - - - - - - - - - InterventionsFormData - - + + + + - - - +interventionsData: List<InterventionFormData> - +studyScheduleData: StudyScheduleFormData - +id: String + + + StudyDesignMeasurementsFormView - - - +Study apply() - +InterventionsFormData copy() + + + +Widget build() - - - - - + + + + + - - - InterventionFormData + + + MeasurementsFormData - - - +interventionId: String - +title: String - +description: String? - +tasksData: List<InterventionTaskFormData>? - +iconName: String? - <static>+kDefaultTitle: String - +id: String + + + +surveyMeasurements: List<MeasurementSurveyFormData> + +id: String - - - +Intervention toIntervention() - +InterventionFormData copy() + + + +Study apply() + +MeasurementsFormData copy() diff --git a/docs/uml/designer_v2/lib/features/uml.svg b/docs/uml/designer_v2/lib/features/uml.svg index 9147976a1..497ca34c0 100644 --- a/docs/uml/designer_v2/lib/features/uml.svg +++ b/docs/uml/designer_v2/lib/features/uml.svg @@ -1,1102 +1,1277 @@ - - [DrawerEntry + + [PublishConfirmationDialog | - +localizedTitle: String Function(); - +icon: IconData?; - +localizedHelpText: String Function()?; - +enabled: bool; - +onSelected: void Function(BuildContext, WidgetRef)?; - +title: String; - +helpText: String? + +Widget build() + ] + + [<abstract>StudyPageWidget]<:-[PublishConfirmationDialog] + + [PublishSuccessDialog | - +void onClick() + +Widget build() ] - [DrawerEntry]o-[String Function()] - [DrawerEntry]o-[IconData] - [DrawerEntry]o-[String Function()?] - [DrawerEntry]o-[void Function(BuildContext, WidgetRef)?] + [<abstract>StudyPageWidget]<:-[PublishSuccessDialog] - [GoRouterDrawerEntry + [PublishDialog | - +intent: RoutingIntent + +Widget build() + ] + + [<abstract>StudyPageWidget]<:-[PublishDialog] + + [StudyAnalyzeScreen | - +void onClick() + +Widget? banner(); + +Widget build() ] - [GoRouterDrawerEntry]o-[RoutingIntent] - [DrawerEntry]<:-[GoRouterDrawerEntry] + [<abstract>StudyPageWidget]<:-[StudyAnalyzeScreen] - [AppDrawer + [StudyAnalyzeController | - +title: String; - +width: int; - +leftPaddingEntries: double; - +logoPaddingVertical: double; - +logoPaddingHorizontal: double; - +logoMaxHeight: double; - +logoSectionMinHeight: double; - +logoSectionMaxHeight: double + +dynamic onExport() ] - [DashboardController + [StudyBaseController]<:-[StudyAnalyzeController] + + [InviteCodeFormViewModel | - +studyRepository: IStudyRepository; - +authRepository: IAuthRepository; - +userRepository: IUserRepository; - +router: GoRouter; - -_studiesSubscription: StreamSubscription<List<WrappedModel<Study>>>?; - +searchController: SearchController + +study: Study; + +inviteCodeRepository: IInviteCodeRepository; + +codeControl: FormControl<String>; + +codeControlValidationMessages: Map<String, String Function(dynamic)>; + +isPreconfiguredScheduleControl: FormControl<bool>; + +preconfiguredScheduleTypeControl: FormControl<PhaseSequence>; + +interventionAControl: FormControl<String>; + +interventionBControl: FormControl<String>; + +form: FormGroup; + +titles: Map<FormMode, String>; + +interventionControlOptions: List<FormControlOption<String>>; + +preconfiguredScheduleTypeOptions: List<FormControlOption<PhaseSequence>>; + +isPreconfiguredSchedule: bool; + +preconfiguredSchedule: List<String>? | - -dynamic _subscribeStudies(); - +dynamic setSearchText(); - +dynamic setStudiesFilter(); - +dynamic onSelectStudy(); - +dynamic onClickNewStudy(); - +dynamic pinStudy(); - +dynamic pinOffStudy(); - +void filterStudies(); - +void sortStudies(); - +bool isPinned(); + +void initControls(); + -dynamic _uniqueInviteCode(); + +void regenerateCode(); + -String _generateCode(); + +StudyInvite buildFormData(); + +void setControlsFrom(); + +dynamic save() + ] + + [InviteCodeFormViewModel]o-[Study] + [InviteCodeFormViewModel]o-[<abstract>IInviteCodeRepository] + [InviteCodeFormViewModel]o-[FormControl] + [InviteCodeFormViewModel]o-[FormGroup] + [<abstract>FormViewModel]<:-[InviteCodeFormViewModel] + + [StudyRecruitController + | + +inviteCodeRepository: IInviteCodeRepository; + -_invitesSubscription: StreamSubscription<List<WrappedModel<StudyInvite>>>? + | + -dynamic _subscribeInvites(); + +Intervention? getIntervention(); + +int getParticipantCountForInvite(); +List<ModelAction<dynamic>> availableActions(); + +List<ModelAction<dynamic>> availableInlineActions(); +void dispose() ] - [DashboardController]o-[<abstract>IStudyRepository] - [DashboardController]o-[<abstract>IAuthRepository] - [DashboardController]o-[<abstract>IUserRepository] - [DashboardController]o-[GoRouter] - [DashboardController]o-[StreamSubscription] - [DashboardController]o-[SearchController] - [<abstract>IModelActionProvider]<:--[DashboardController] + [StudyRecruitController]o-[<abstract>IInviteCodeRepository] + [StudyRecruitController]o-[StreamSubscription] + [StudyBaseController]<:-[StudyRecruitController] + [<abstract>IModelActionProvider]<:--[StudyRecruitController] - [StudiesTable + [EnrolledBadge | - +studies: List<Study>; - +onSelect: void Function(Study); - +getActions: List<ModelAction<dynamic>> Function(Study); - +emptyWidget: Widget; - +pinnedStudies: Iterable<String>; - +dashboardController: DashboardController; - +pinnedPredicates: int Function(Study, Study); - -_sortColumns: List<int Function(Study, Study)?> + +enrolledCount: int + | + +Widget build() + ] + + [StudyRecruitScreen | +Widget build(); - -List<Widget> _buildRow() + -Widget _inviteCodesSectionHeader(); + -Widget _newInviteCodeButton(); + -dynamic _onSelectInvite() ] - [StudiesTable]o-[void Function(Study)] - [StudiesTable]o-[List<ModelAction<dynamic>> Function(Study)] - [StudiesTable]o-[<abstract>Widget] - [StudiesTable]o-[DashboardController] - [StudiesTable]o-[int Function(Study, Study)] + [<abstract>StudyPageWidget]<:-[StudyRecruitScreen] - [DashboardScaffold + [InviteCodeFormView | - +body: Widget + +formViewModel: InviteCodeFormViewModel | - +Widget build() + +Widget build(); + -List<FormTableRow> _conditionalInterventionRows() ] - [DashboardScaffold]o-[<abstract>Widget] + [InviteCodeFormView]o-[InviteCodeFormViewModel] + [<abstract>FormConsumerWidget]<:-[InviteCodeFormView] - [StudiesFilter + [StudyInvitesTable | - +index: int; - <static>+values: List<StudiesFilter> + +invites: List<StudyInvite>; + +onSelect: void Function(StudyInvite); + +getActions: List<ModelAction<dynamic>> Function(StudyInvite); + +getInlineActions: List<ModelAction<dynamic>> Function(StudyInvite); + +getIntervention: Intervention? Function(String); + +getParticipantCountForInvite: int Function(StudyInvite) + | + +Widget build(); + -List<Widget> _buildRow() ] - [Enum]<:--[StudiesFilter] + [StudyInvitesTable]o-[void Function(StudyInvite)] + [StudyInvitesTable]o-[List<ModelAction<dynamic>> Function(StudyInvite)] + [StudyInvitesTable]o-[Intervention? Function(String)] + [StudyInvitesTable]o-[int Function(StudyInvite)] - [DashboardScreen + [AppStatus | - +filter: StudiesFilter? + +index: int; + <static>+values: List<AppStatus>; + <static>+initializing: AppStatus; + <static>+initialized: AppStatus ] - [DashboardScreen]o-[StudiesFilter] + [AppStatus]o-[AppStatus] + [Enum]<:--[AppStatus] - [StudyMonitorScreen + [StudyFormScaffold + | + +studyId: String; + +formViewModelBuilder: T Function(WidgetRef); + +formViewBuilder: Widget Function(T) | +Widget build() ] - [<abstract>StudyPageWidget]<:-[StudyMonitorScreen] + [StudyFormScaffold]o-[T Function(WidgetRef)] + [StudyFormScaffold]o-[Widget Function(T)] + [<abstract>ConsumerWidget]<:-[StudyFormScaffold] - [CustomFormControl + [InterventionsFormViewModel | - -_onValueChangedDebouncer: Debouncer?; - -_onStatusChangedDebouncer: Debouncer?; - +onValueChanged: void Function(T?)?; - +onStatusChanged: void Function(ControlStatus)?; - +onStatusChangedDebounceTime: int?; - +onValueChangedDebounceTime: int? + +study: Study; + +router: GoRouter; + +interventionsArray: FormArray<dynamic>; + +interventionsCollection: FormViewModelCollection<InterventionFormViewModel, InterventionFormData>; + +form: FormGroup; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +interventionsRequired: dynamic; + +titles: Map<FormMode, String>; + +canTestStudySchedule: bool | - +void dispose() + +void setControlsFrom(); + +InterventionsFormData buildFormData(); + +void read(); + +List<ModelAction<dynamic>> availableActions(); + +List<ModelAction<dynamic>> availablePopupActions(); + +List<ModelAction<dynamic>> availableInlineActions(); + +void onSelectItem(); + +void onNewItem(); + +InterventionFormViewModel provide(); + +void onCancel(); + +dynamic onSave(); + +dynamic testStudySchedule() ] - [CustomFormControl]o-[Debouncer] - [CustomFormControl]o-[void Function(T?)?] - [CustomFormControl]o-[void Function(ControlStatus)?] - [FormControl]<:-[CustomFormControl] + [InterventionsFormViewModel]o-[Study] + [InterventionsFormViewModel]o-[GoRouter] + [InterventionsFormViewModel]o-[FormArray] + [InterventionsFormViewModel]o-[FormViewModelCollection] + [InterventionsFormViewModel]o-[FormGroup] + [<abstract>FormViewModel]<:-[InterventionsFormViewModel] + [<abstract>StudyScheduleControls]<:-[InterventionsFormViewModel] + [<abstract>IFormViewModelDelegate]<:--[InterventionsFormViewModel] + [<abstract>IListActionProvider]<:--[InterventionsFormViewModel] + [<abstract>IProviderArgsResolver]<:--[InterventionsFormViewModel] - [FormInvalidException + [InterventionTaskFormView + | + +formViewModel: InterventionTaskFormViewModel ] - [Exception]<:--[FormInvalidException] + [InterventionTaskFormView]o-[InterventionTaskFormViewModel] - [FormConfigException + [InterventionPreview | - +message: String? + +routeArgs: InterventionFormRouteArgs + | + +Widget build() ] - [Exception]<:--[FormConfigException] + [InterventionPreview]o-[InterventionFormRouteArgs] + [<abstract>ConsumerWidget]<:-[InterventionPreview] - [<abstract>IFormViewModelDelegate + [StudyScheduleFormView | - +dynamic onSave(); - +void onCancel() + +formViewModel: StudyScheduleControls + | + -FormTableRow _renderCustomSequence(); + +Widget build() ] - [<abstract>IFormGroupController + [StudyScheduleFormView]o-[<abstract>StudyScheduleControls] + [<abstract>FormConsumerWidget]<:-[StudyScheduleFormView] + + [InterventionFormView | - +form: FormGroup + +formViewModel: InterventionFormViewModel ] - [<abstract>IFormGroupController]o-[FormGroup] + [InterventionFormView]o-[InterventionFormViewModel] - [FormControlOption + [InterventionFormData | - +value: T; - +label: String; + +interventionId: String; + +title: String; +description: String?; - +props: List<Object?> + +tasksData: List<InterventionTaskFormData>?; + +iconName: String?; + <static>+kDefaultTitle: String; + +id: String + | + +Intervention toIntervention(); + +InterventionFormData copy() ] - [<abstract>Equatable]<:-[FormControlOption] + [<abstract>IFormData]<:-[InterventionFormData] - [<abstract>FormViewModel + [StudyScheduleFormData | - -_formData: T?; - -_formMode: FormMode; - -_validationSet: FormValidationSetEnum?; - +delegate: IFormViewModelDelegate<FormViewModel<dynamic>>?; - +autosave: bool; - -_immediateFormChildrenSubscriptions: List<StreamSubscription<dynamic>>; - -_immediateFormChildrenListenerDebouncer: Debouncer?; - -_autosaveOperation: CancelableOperation<dynamic>?; - -_defaultControlValidators: Map<String, Tuple<List<Validator<dynamic>>, List<AsyncValidator<dynamic>>>>; - +prevFormValue: Map<String, dynamic>?; - <static>-_formKey: String; - +formData: T?; - +formMode: FormMode; - +isReadonly: bool; - +validationSet: FormValidationSetEnum?; - +isDirty: bool; - +title: String; - +isValid: bool; - +titles: Map<FormMode, String>; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +sequenceType: PhaseSequence; + +sequenceTypeCustom: String; + +numCycles: int; + +phaseDuration: int; + +includeBaseline: bool; + +id: String | - -dynamic _setFormData(); - -dynamic _rememberDefaultControlValidators(); - -Tuple<List<Validator<dynamic>>, List<AsyncValidator<dynamic>>>? _getDefaultValidators(); - -dynamic _disableAllControls(); - -dynamic _formModeUpdated(); - -dynamic _restoreControlsFromFormData(); - +void revalidate(); - -void _applyValidationSet(); - +void read(); - +dynamic save(); - +dynamic cancel(); - +void enableAutosave(); - +void listenToImmediateFormChildren(); - +dynamic markFormGroupChanged(); - +void dispose(); - +void setControlsFrom(); - +T buildFormData(); - +void initControls() + +StudySchedule toStudySchedule(); + +Study apply(); + +StudyScheduleFormData copy() ] - [<abstract>FormViewModel]o-[FormMode] - [<abstract>FormViewModel]o-[<abstract>FormValidationSetEnum] - [<abstract>FormViewModel]o-[<abstract>IFormViewModelDelegate] - [<abstract>FormViewModel]o-[Debouncer] - [<abstract>FormViewModel]o-[CancelableOperation] - [<abstract>IFormGroupController]<:--[<abstract>FormViewModel] + [StudyScheduleFormData]o-[PhaseSequence] + [<abstract>IStudyFormData]<:--[StudyScheduleFormData] - [FormMode + [<abstract>StudyScheduleControls | - +index: int; - <static>+values: List<FormMode>; - <static>+create: FormMode; - <static>+readonly: FormMode; - <static>+edit: FormMode + <static>+defaultScheduleType: PhaseSequence; + <static>+defaultScheduleTypeSequence: String; + <static>+defaultNumCycles: int; + <static>+defaultPeriodLength: int; + +sequenceTypeControl: FormControl<PhaseSequence>; + +sequenceTypeCustomControl: FormControl<String>; + +phaseDurationControl: FormControl<int>; + +numCyclesControl: FormControl<int>; + +includeBaselineControl: FormControl<bool>; + +studyScheduleControls: Map<String, FormControl<Object>>; + <static>+kNumCyclesMin: int; + <static>+kNumCyclesMax: int; + <static>+kPhaseDurationMin: int; + <static>+kPhaseDurationMax: int; + +sequenceTypeControlOptions: List<FormControlOption<PhaseSequence>>; + +studyScheduleValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +numCyclesRange: dynamic; + +phaseDurationRange: dynamic; + +customSequenceRequired: dynamic + | + +void setStudyScheduleControlsFrom(); + +StudyScheduleFormData buildStudyScheduleFormData(); + +bool isSequencingCustom() ] - [FormMode]o-[FormMode] - [Enum]<:--[FormMode] + [<abstract>StudyScheduleControls]o-[PhaseSequence] + [<abstract>StudyScheduleControls]o-[FormControl] - [<abstract>ManagedFormViewModel + [InterventionTaskFormViewModel | - +ManagedFormViewModel<T> createDuplicate() + +taskIdControl: FormControl<String>; + +instanceIdControl: FormControl<String>; + +taskTitleControl: FormControl<String>; + +taskDescriptionControl: FormControl<String>; + +markAsCompletedControl: FormControl<bool>; + +form: FormGroup; + +taskId: String; + +instanceId: String; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +titleRequired: dynamic; + +titles: Map<FormMode, String> + | + +void setControlsFrom(); + +InterventionTaskFormData buildFormData(); + +InterventionTaskFormViewModel createDuplicate() ] - [<abstract>FormViewModel]<:-[<abstract>ManagedFormViewModel] + [InterventionTaskFormViewModel]o-[FormControl] + [InterventionTaskFormViewModel]o-[FormGroup] + [<abstract>ManagedFormViewModel]<:-[InterventionTaskFormViewModel] + [<abstract>WithScheduleControls]<:-[InterventionTaskFormViewModel] - [FormViewModelNotFoundException + [InterventionFormViewModel + | + +study: Study; + +interventionIdControl: FormControl<String>; + +interventionTitleControl: FormControl<String>; + +interventionIconControl: FormControl<IconOption>; + +interventionDescriptionControl: FormControl<String>; + +interventionTasksArray: FormArray<dynamic>; + +tasksCollection: FormViewModelCollection<InterventionTaskFormViewModel, InterventionTaskFormData>; + +form: FormGroup; + +interventionId: String; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +titleRequired: dynamic; + +atLeastOneTask: dynamic; + +breadcrumbsTitle: String; + +titles: Map<FormMode, String> + | + +void setControlsFrom(); + +InterventionFormData buildFormData(); + +List<ModelAction<dynamic>> availableActions(); + +List<ModelAction<dynamic>> availablePopupActions(); + +List<ModelAction<dynamic>> availableInlineActions(); + +void onSelectItem(); + +void onNewItem(); + +void onCancel(); + +dynamic onSave(); + +InterventionTaskFormViewModel provide(); + +InterventionTaskFormRouteArgs buildNewFormRouteArgs(); + +InterventionTaskFormRouteArgs buildFormRouteArgs(); + +InterventionFormViewModel createDuplicate() ] - [Exception]<:--[FormViewModelNotFoundException] + [InterventionFormViewModel]o-[Study] + [InterventionFormViewModel]o-[FormControl] + [InterventionFormViewModel]o-[FormArray] + [InterventionFormViewModel]o-[FormViewModelCollection] + [InterventionFormViewModel]o-[FormGroup] + [<abstract>ManagedFormViewModel]<:-[InterventionFormViewModel] + [<abstract>IFormViewModelDelegate]<:--[InterventionFormViewModel] + [<abstract>IListActionProvider]<:--[InterventionFormViewModel] + [<abstract>IProviderArgsResolver]<:--[InterventionFormViewModel] - [FormViewModelCollection + [InterventionsFormData | - +formViewModels: List<T>; - +formArray: FormArray<dynamic>; - +stagedViewModels: List<T>; - +retrievableViewModels: List<T>; - +formData: List<D> + +interventionsData: List<InterventionFormData>; + +studyScheduleData: StudyScheduleFormData; + +id: String | - +void add(); - +T remove(); - +T? findWhere(); - +T? removeWhere(); - +bool contains(); - +void stage(); - +T commit(); - +void reset(); - +void read() + +Study apply(); + +InterventionsFormData copy() ] - [FormViewModelCollection]o-[FormArray] + [InterventionsFormData]o-[StudyScheduleFormData] + [<abstract>IStudyFormData]<:--[InterventionsFormData] - [UnsavedChangesDialog + [StudyDesignInterventionsFormView | +Widget build() ] - [<abstract>IFormData + [<abstract>StudyDesignPageWidget]<:-[StudyDesignInterventionsFormView] + + [InterventionTaskFormData | + +taskId: String; + +taskTitle: String; + +taskDescription: String?; + <static>+kDefaultTitle: String; +id: String | - +IFormData copy() + +CheckmarkTask toTask(); + +InterventionTaskFormData copy() ] - [FormArrayTable + [<abstract>IFormDataWithSchedule]<:-[InterventionTaskFormData] + + [ReportBadge | - +control: AbstractControl<dynamic>; - +items: List<T>; - +onSelectItem: void Function(T); - +getActionsAt: List<ModelAction<dynamic>> Function(T, int); - +onNewItem: void Function()?; - +rowTitle: String Function(T); - +onNewItemLabel: String; - +sectionTitle: String?; - +sectionDescription: String?; - +emptyIcon: IconData?; - +emptyTitle: String?; - +emptyDescription: String?; - +sectionTitleDivider: bool?; - +rowPrefix: Widget Function(BuildContext, T, int)?; - +rowSuffix: Widget Function(BuildContext, T, int)?; - +leadingWidget: Widget?; - +itemsSectionPadding: EdgeInsets?; - +hideLeadingTrailingWhenEmpty: bool; - <static>+columns: List<StandardTableColumn> + +status: ReportStatus?; + +type: BadgeType; + +showPrefixIcon: bool; + +showTooltip: bool | - +Widget build(); - -List<Widget> _buildRow(); - -Widget _newItemButton() + +Widget build() ] - [FormArrayTable]o-[<abstract>AbstractControl] - [FormArrayTable]o-[void Function(T)] - [FormArrayTable]o-[List<ModelAction<dynamic>> Function(T, int)] - [FormArrayTable]o-[void Function()?] - [FormArrayTable]o-[String Function(T)] - [FormArrayTable]o-[IconData] - [FormArrayTable]o-[Widget Function(BuildContext, T, int)?] - [FormArrayTable]o-[<abstract>Widget] - [FormArrayTable]o-[EdgeInsets] - - [<abstract>FormValidationSetEnum - ] - - [FormControlValidation - | - +control: AbstractControl<dynamic>; - +validators: List<Validator<dynamic>>; - +asyncValidators: List<AsyncValidator<dynamic>>?; - +validationMessages: Map<String, String Function(Object)> - | - +FormControlValidation merge() - ] - - [FormControlValidation]o-[<abstract>AbstractControl] + [ReportBadge]o-[ReportStatus] + [ReportBadge]o-[BadgeType] - [InviteCodeFormViewModel + [ReportsFormViewModel | +study: Study; - +inviteCodeRepository: IInviteCodeRepository; - +codeControl: FormControl<String>; - +codeControlValidationMessages: Map<String, String Function(dynamic)>; - +isPreconfiguredScheduleControl: FormControl<bool>; - +preconfiguredScheduleTypeControl: FormControl<PhaseSequence>; - +interventionAControl: FormControl<String>; - +interventionBControl: FormControl<String>; + +router: GoRouter; + +reportItemDelegate: ReportFormItemDelegate; + +reportItemArray: FormArray<dynamic>; + +reportItemFormViewModels: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData>; +form: FormGroup; + +reportItemModels: List<ReportItemFormViewModel>; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; +titles: Map<FormMode, String>; - +interventionControlOptions: List<FormControlOption<String>>; - +preconfiguredScheduleTypeOptions: List<FormControlOption<PhaseSequence>>; - +isPreconfiguredSchedule: bool; - +preconfiguredSchedule: List<String>? + +canTestConsent: bool | - +void initControls(); - -dynamic _uniqueInviteCode(); - +void regenerateCode(); - -String _generateCode(); - +StudyInvite buildFormData(); +void setControlsFrom(); - +dynamic save() + +ReportsFormData buildFormData(); + +void read(); + +ReportItemFormRouteArgs buildNewReportItemFormRouteArgs(); + +ReportItemFormRouteArgs buildReportItemFormRouteArgs(); + +dynamic testReport(); + +void onCancel(); + +dynamic onSave(); + +ReportItemFormViewModel provide() ] - [InviteCodeFormViewModel]o-[Study] - [InviteCodeFormViewModel]o-[<abstract>IInviteCodeRepository] - [InviteCodeFormViewModel]o-[FormControl] - [InviteCodeFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[InviteCodeFormViewModel] + [ReportsFormViewModel]o-[Study] + [ReportsFormViewModel]o-[GoRouter] + [ReportsFormViewModel]o-[ReportFormItemDelegate] + [ReportsFormViewModel]o-[FormArray] + [ReportsFormViewModel]o-[FormViewModelCollection] + [ReportsFormViewModel]o-[FormGroup] + [<abstract>FormViewModel]<:-[ReportsFormViewModel] + [<abstract>IFormViewModelDelegate]<:--[ReportsFormViewModel] + [<abstract>IProviderArgsResolver]<:--[ReportsFormViewModel] - [EnrolledBadge + [ReportFormItemDelegate | - +enrolledCount: int + +formViewModelCollection: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData>; + +owner: ReportsFormViewModel; + +propagateOnSave: bool; + +validationSet: dynamic | - +Widget build() + +void onCancel(); + +dynamic onSave(); + +ReportItemFormViewModel provide(); + +List<ModelAction<dynamic>> availableActions(); + +void onNewItem(); + +void onSelectItem() ] - [InviteCodeFormView - | - +formViewModel: InviteCodeFormViewModel + [ReportFormItemDelegate]o-[FormViewModelCollection] + [ReportFormItemDelegate]o-[ReportsFormViewModel] + [<abstract>IFormViewModelDelegate]<:--[ReportFormItemDelegate] + [<abstract>IListActionProvider]<:--[ReportFormItemDelegate] + [<abstract>IProviderArgsResolver]<:--[ReportFormItemDelegate] + + [StudyDesignReportsFormView | +Widget build(); - -List<FormTableRow> _conditionalInterventionRows() + -dynamic _showReportItemSidesheetWithArgs() ] - [InviteCodeFormView]o-[InviteCodeFormViewModel] - [<abstract>FormConsumerWidget]<:-[InviteCodeFormView] + [<abstract>StudyDesignPageWidget]<:-[StudyDesignReportsFormView] - [StudyRecruitScreen + [ReportsFormData | - +Widget build(); - -Widget _inviteCodesSectionHeader(); - -Widget _newInviteCodeButton(); - -dynamic _onSelectInvite() + +reportItems: List<ReportItemFormData>; + +id: String + | + +Study apply(); + +ReportsFormData copy() ] - [<abstract>StudyPageWidget]<:-[StudyRecruitScreen] + [<abstract>IStudyFormData]<:--[ReportsFormData] - [StudyRecruitController - | - +inviteCodeRepository: IInviteCodeRepository; - -_invitesSubscription: StreamSubscription<List<WrappedModel<StudyInvite>>>? + [ReportStatus | - -dynamic _subscribeInvites(); - +Intervention? getIntervention(); - +int getParticipantCountForInvite(); - +List<ModelAction<dynamic>> availableActions(); - +List<ModelAction<dynamic>> availableInlineActions(); - +void dispose() + +index: int; + <static>+values: List<ReportStatus>; + <static>+primary: ReportStatus; + <static>+secondary: ReportStatus ] - [StudyRecruitController]o-[<abstract>IInviteCodeRepository] - [StudyRecruitController]o-[StreamSubscription] - [StudyBaseController]<:-[StudyRecruitController] - [<abstract>IModelActionProvider]<:--[StudyRecruitController] + [ReportStatus]o-[ReportStatus] + [Enum]<:--[ReportStatus] - [StudyInvitesTable + [ReportItemFormViewModel | - +invites: List<StudyInvite>; - +onSelect: void Function(StudyInvite); - +getActions: List<ModelAction<dynamic>> Function(StudyInvite); - +getInlineActions: List<ModelAction<dynamic>> Function(StudyInvite); - +getIntervention: Intervention? Function(String); - +getParticipantCountForInvite: int Function(StudyInvite) + <static>+defaultSectionType: ReportSectionType; + +sectionIdControl: FormControl<String>; + +sectionTypeControl: FormControl<ReportSectionType>; + +titleControl: FormControl<String>; + +descriptionControl: FormControl<String>; + +sectionControl: FormControl<ReportSection>; + +dataReferenceControl: FormControl<DataReferenceIdentifier<num>>; + +temporalAggregationControl: FormControl<TemporalAggregationFormatted>; + +improvementDirectionControl: FormControl<ImprovementDirectionFormatted>; + +alphaControl: FormControl<double>; + -_controlsBySectionType: Map<ReportSectionType, FormGroup>; + -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + -_validationConfigsBySectionType: Map<ReportSectionType, Map<FormValidationSetEnum, List<FormControlValidation>>>; + +sectionBaseControls: Map<String, AbstractControl<dynamic>>; + +form: FormGroup; + +sectionId: String; + +sectionType: ReportSectionType; + <static>+sectionTypeControlOptions: List<FormControlOption<ReportSectionType>>; + <static>+temporalAggregationControlOptions: List<FormControlOption<TemporalAggregationFormatted>>; + <static>+improvementDirectionControlOptions: List<FormControlOption<ImprovementDirectionFormatted>>; + +titles: Map<FormMode, String>; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +titleRequired: dynamic; + +descriptionRequired: dynamic; + +dataReferenceRequired: dynamic; + +aggregationRequired: dynamic; + +improvementDirectionRequired: dynamic; + +alphaConfidenceRequired: dynamic | - +Widget build(); - -List<Widget> _buildRow() + -List<FormControlValidation> _getValidationConfig(); + +ReportItemFormData buildFormData(); + +ReportItemFormViewModel createDuplicate(); + +dynamic onSectionTypeChanged(); + -void _updateFormControls(); + +void setControlsFrom() ] - [StudyInvitesTable]o-[void Function(StudyInvite)] - [StudyInvitesTable]o-[List<ModelAction<dynamic>> Function(StudyInvite)] - [StudyInvitesTable]o-[Intervention? Function(String)] - [StudyInvitesTable]o-[int Function(StudyInvite)] + [ReportItemFormViewModel]o-[ReportSectionType] + [ReportItemFormViewModel]o-[FormControl] + [ReportItemFormViewModel]o-[FormGroup] + [<abstract>ManagedFormViewModel]<:-[ReportItemFormViewModel] - [AuthScaffold + [ReportItemFormData | - +body: Widget; - +formKey: AuthFormKey; - +leftContentMinWidth: double; - +leftPanelMinWidth: double; - +leftPanelPadding: EdgeInsets + +isPrimary: bool; + +section: ReportSection; + +id: String + | + <static>+dynamic fromDomainModel(); + +ReportItemFormData copy() ] - [AuthScaffold]o-[<abstract>Widget] - [AuthScaffold]o-[AuthFormKey] - [AuthScaffold]o-[EdgeInsets] + [ReportItemFormData]o-[<abstract>ReportSection] + [<abstract>IFormData]<:-[ReportItemFormData] - [SignupForm + [ReportItemFormView | - +formKey: AuthFormKey + +formViewModel: ReportItemFormViewModel; + +studyId: String; + +reportSectionColumnWidth: dynamic; + +sectionTypeBodyBuilder: Widget Function(BuildContext) | +Widget build(); - -dynamic _onClickTermsOfUse(); - -dynamic _onClickPrivacyPolicy() + -dynamic _buildSectionText(); + -dynamic _buildSectionTypeHeader() ] - [SignupForm]o-[AuthFormKey] - [<abstract>FormConsumerRefWidget]<:-[SignupForm] + [ReportItemFormView]o-[ReportItemFormViewModel] + [ReportItemFormView]o-[Widget Function(BuildContext)] - [PasswordRecoveryForm + [TemporalAggregationFormatted | - +formKey: AuthFormKey + -_value: TemporalAggregation; + <static>+values: List<TemporalAggregationFormatted>; + +value: TemporalAggregation; + +string: String; + +icon: IconData?; + +hashCode: int | - +Widget build() + +bool ==(); + +String toString(); + +String toJson(); + <static>+TemporalAggregationFormatted fromJson() ] - [PasswordRecoveryForm]o-[AuthFormKey] - [<abstract>FormConsumerRefWidget]<:-[PasswordRecoveryForm] + [TemporalAggregationFormatted]o-[TemporalAggregation] + [TemporalAggregationFormatted]o-[IconData] - [PasswordForgotForm + [ImprovementDirectionFormatted | - +formKey: AuthFormKey + -_value: ImprovementDirection; + <static>+values: List<ImprovementDirectionFormatted>; + +value: ImprovementDirection; + +string: String; + +icon: IconData?; + +hashCode: int | - +Widget build() + +bool ==(); + +String toString(); + +String toJson(); + <static>+ImprovementDirectionFormatted fromJson() ] - [PasswordForgotForm]o-[AuthFormKey] - [<abstract>FormConsumerRefWidget]<:-[PasswordForgotForm] + [ImprovementDirectionFormatted]o-[ImprovementDirection] + [ImprovementDirectionFormatted]o-[IconData] - [AuthFormController - | - +authRepository: IAuthRepository; - +sharedPreferences: SharedPreferences; - +notificationService: INotificationService; - +router: GoRouter; - +emailControl: FormControl<String>; - +passwordControl: FormControl<String>; - +passwordConfirmationControl: FormControl<String>; - +rememberMeControl: FormControl<bool>; - +termsOfServiceControl: FormControl<bool>; - <static>+authValidationMessages: Map<String, String Function(dynamic)>; - +loginForm: FormGroup; - +signupForm: FormGroup; - +passwordForgotForm: FormGroup; - +passwordRecoveryForm: FormGroup; - +controlValidatorsByForm: Map<AuthFormKey, Map<FormControl<dynamic>, List<Validator<dynamic>>>>; - -_formKey: AuthFormKey; - +shouldRemember: bool; - +formKey: AuthFormKey; - +form: FormGroup - | - -dynamic _onChangeFormKey(); - +dynamic resetControlsFor(); - -dynamic _forceValidationMessages(); - +dynamic signUp(); - -dynamic _signUp(); - +dynamic signIn(); - -dynamic _signInWith(); - +dynamic signOut(); - +dynamic resetPasswordForEmail(); - +dynamic sendPasswordResetLink(); - +dynamic recoverPassword(); - +dynamic updateUser(); - -void _setRememberMe(); - -void _delRememberMe(); - -void _initRememberMe() - ] - - [AuthFormController]o-[<abstract>IAuthRepository] - [AuthFormController]o-[SharedPreferences] - [AuthFormController]o-[<abstract>INotificationService] - [AuthFormController]o-[GoRouter] - [AuthFormController]o-[FormControl] - [AuthFormController]o-[FormGroup] - [AuthFormController]o-[AuthFormKey] - [<abstract>IFormGroupController]<:--[AuthFormController] - - [AuthFormKey + [ReportSectionType | +index: int; - <static>+values: List<AuthFormKey>; - <static>+login: AuthFormKey; - <static>+signup: AuthFormKey; - <static>+passwordForgot: AuthFormKey; - <static>+passwordRecovery: AuthFormKey; - <static>-_loginSubmit: AuthFormKey; - <static>-_signupSubmit: AuthFormKey + <static>+values: List<ReportSectionType>; + <static>+average: ReportSectionType; + <static>+linearRegression: ReportSectionType ] - [AuthFormKey]o-[AuthFormKey] - [Enum]<:--[AuthFormKey] + [ReportSectionType]o-[ReportSectionType] + [Enum]<:--[ReportSectionType] - [EmailTextField + [DataReferenceIdentifier | - +labelText: String; - +hintText: String?; - +formControlName: String?; - +formControl: FormControl<dynamic>? - ] - - [EmailTextField]o-[FormControl] - - [PasswordTextField + +hashCode: int | - +labelText: String; - +hintText: String?; - +formControlName: String?; - +formControl: FormControl<dynamic>? + +bool ==() ] - [PasswordTextField]o-[FormControl] - - [StudyUJobsToBeDone - | - +Widget build() - ] + [DataReference]<:-[DataReferenceIdentifier] - [LoginForm + [LinearRegressionSectionFormView | - +formKey: AuthFormKey + +formViewModel: ReportItemFormViewModel; + +studyId: String; + +reportSectionColumnWidth: Map<int, TableColumnWidth> | +Widget build() ] - [LoginForm]o-[AuthFormKey] - [<abstract>FormConsumerRefWidget]<:-[LoginForm] + [LinearRegressionSectionFormView]o-[ReportItemFormViewModel] + [<abstract>ConsumerWidget]<:-[LinearRegressionSectionFormView] - [StudyAnalyzeController + [DataReferenceEditor | - +dynamic onExport() - ] - - [StudyBaseController]<:-[StudyAnalyzeController] - - [StudyAnalyzeScreen + +formControl: FormControl<DataReferenceIdentifier<T>>; + +availableTasks: List<Task>; + +buildReactiveDropdownField: ReactiveDropdownField<dynamic> | - +Widget? banner(); - +Widget build() + +FormTableRow buildFormTableRow(); + -List<DropdownMenuItem<DataReferenceIdentifier<dynamic>>> _dataReferenceItems() ] - [<abstract>StudyPageWidget]<:-[StudyAnalyzeScreen] + [DataReferenceEditor]o-[FormControl] + [DataReferenceEditor]o-[ReactiveDropdownField] - [PublishDialog + [AverageSectionFormView + | + +formViewModel: ReportItemFormViewModel; + +studyId: String; + +reportSectionColumnWidth: Map<int, TableColumnWidth> | +Widget build() ] - [<abstract>StudyPageWidget]<:-[PublishDialog] + [AverageSectionFormView]o-[ReportItemFormViewModel] + [<abstract>ConsumerWidget]<:-[AverageSectionFormView] - [PublishSuccessDialog + [<abstract>IStudyFormData | - +Widget build() + +Study apply() ] - [<abstract>StudyPageWidget]<:-[PublishSuccessDialog] + [<abstract>IFormData]<:--[<abstract>IStudyFormData] - [PublishConfirmationDialog + [StudyInfoFormData | - +Widget build() + +title: String; + +description: String?; + +iconName: String; + +contactInfoFormData: StudyContactInfoFormData; + +id: String + | + +Study apply(); + +StudyInfoFormData copy() ] - [<abstract>StudyPageWidget]<:-[PublishConfirmationDialog] + [StudyInfoFormData]o-[StudyContactInfoFormData] + [<abstract>IStudyFormData]<:--[StudyInfoFormData] - [App + [StudyContactInfoFormData + | + +organization: String?; + +institutionalReviewBoard: String?; + +institutionalReviewBoardNumber: String?; + +researchers: String?; + +email: String?; + +website: String?; + +phone: String?; + +additionalInfo: String?; + +id: String + | + +Study apply(); + +StudyInfoFormData copy() ] - [AppContent - ] + [<abstract>IStudyFormData]<:--[StudyContactInfoFormData] - [<abstract>IStudyAppBarViewModel + [StudyInfoFormViewModel | - +isSyncIndicatorVisible: bool; - +isStatusBadgeVisible: bool; - +isPublishVisible: bool + +study: Study; + +titleControl: FormControl<String>; + +iconControl: FormControl<IconOption>; + +descriptionControl: FormControl<String>; + +organizationControl: FormControl<String>; + +reviewBoardControl: FormControl<String>; + +reviewBoardNumberControl: FormControl<String>; + +researchersControl: FormControl<String>; + +emailControl: FormControl<String>; + +websiteControl: FormControl<String>; + +phoneControl: FormControl<String>; + +additionalInfoControl: FormControl<String>; + +form: FormGroup; + +titles: Map<FormMode, String>; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +titleRequired: dynamic; + +descriptionRequired: dynamic; + +iconRequired: dynamic; + +organizationRequired: dynamic; + +reviewBoardRequired: dynamic; + +reviewBoardNumberRequired: dynamic; + +researchersRequired: dynamic; + +emailRequired: dynamic; + +phoneRequired: dynamic; + +emailFormat: dynamic; + +websiteFormat: dynamic + | + +void setControlsFrom(); + +StudyInfoFormData buildFormData() ] - [<abstract>IStudyStatusBadgeViewModel]<:--[<abstract>IStudyAppBarViewModel] - [<abstract>IStudyNavViewModel]<:--[<abstract>IStudyAppBarViewModel] + [StudyInfoFormViewModel]o-[Study] + [StudyInfoFormViewModel]o-[FormControl] + [StudyInfoFormViewModel]o-[FormGroup] + [<abstract>FormViewModel]<:-[StudyInfoFormViewModel] - [StudyScaffold + [StudyDesignInfoFormView | - +studyId: String; - +tabs: List<NavbarTab>?; - +tabsSubnav: List<NavbarTab>?; - +selectedTab: NavbarTab?; - +selectedTabSubnav: NavbarTab?; - +body: StudyPageWidget; - +drawer: Widget?; - +disableActions: bool; - +actionsSpacing: double; - +actionsPadding: double; - +layoutType: SingleColumnLayoutType?; - +appbarHeight: double; - +appbarSubnavHeight: double + +Widget build() ] - [StudyScaffold]o-[NavbarTab] - [StudyScaffold]o-[<abstract>StudyPageWidget] - [StudyScaffold]o-[<abstract>Widget] - [StudyScaffold]o-[SingleColumnLayoutType] + [<abstract>StudyDesignPageWidget]<:-[StudyDesignInfoFormView] - [PreviewFrame + [StudyFormValidationSet | - +studyId: String; - +routeArgs: StudyFormRouteArgs?; - +route: String? + +index: int; + <static>+values: List<StudyFormValidationSet> ] - [PreviewFrame]o-[<abstract>StudyFormRouteArgs] + [Enum]<:--[StudyFormValidationSet] - [StudyParticipationBadge - | - +participation: Participation; - +type: BadgeType; - +showPrefixIcon: bool + [StudyDesignEnrollmentFormView | - +Widget build() + +Widget build(); + -dynamic _showScreenerQuestionSidesheetWithArgs(); + -dynamic _showConsentItemSidesheetWithArgs() ] - [StudyParticipationBadge]o-[Participation] - [StudyParticipationBadge]o-[BadgeType] + [<abstract>StudyDesignPageWidget]<:-[StudyDesignEnrollmentFormView] - [<abstract>StudyPageWidget + [EnrollmentFormData | - +studyId: String + <static>+kDefaultEnrollmentType: Participation; + +enrollmentType: Participation; + +questionnaireFormData: QuestionnaireFormData; + +consentItemsFormData: List<ConsentItemFormData>?; + +id: String | - +Widget? banner() + +Study apply(); + +EnrollmentFormData copy() ] - [<abstract>ConsumerWidget]<:-[<abstract>StudyPageWidget] - [<abstract>IWithBanner]<:--[<abstract>StudyPageWidget] + [EnrollmentFormData]o-[Participation] + [EnrollmentFormData]o-[QuestionnaireFormData] + [<abstract>IStudyFormData]<:--[EnrollmentFormData] - [<abstract>IStudyStatusBadgeViewModel + [ConsentItemFormViewModel | - +studyParticipation: Participation?; - +studyStatus: StudyStatus? + +consentIdControl: FormControl<String>; + +titleControl: FormControl<String>; + +descriptionControl: FormControl<String>; + +iconControl: FormControl<IconOption>; + +form: FormGroup; + +consentId: String; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +titleRequired: dynamic; + +descriptionRequired: dynamic; + +titles: Map<FormMode, String> + | + +void setControlsFrom(); + +ConsentItemFormData buildFormData(); + +ConsentItemFormViewModel createDuplicate() ] - [<abstract>IStudyStatusBadgeViewModel]o-[Participation] - [<abstract>IStudyStatusBadgeViewModel]o-[StudyStatus] + [ConsentItemFormViewModel]o-[FormControl] + [ConsentItemFormViewModel]o-[FormGroup] + [<abstract>ManagedFormViewModel]<:-[ConsentItemFormViewModel] - [StudyStatusBadge + [ScreenerQuestionFormViewModel | - +participation: Participation?; - +status: StudyStatus?; - +type: BadgeType; - +showPrefixIcon: bool; - +showTooltip: bool + <static>+defaultResponseOptionValidity: bool; + +responseOptionsDisabledArray: FormArray<dynamic>; + +responseOptionsLogicControls: FormArray<bool>; + +responseOptionsLogicDescriptionControls: FormArray<String>; + -_questionBaseControls: Map<String, AbstractControl<dynamic>>; + +prevResponseOptionControls: List<AbstractControl<dynamic>>; + +prevResponseOptionValues: List<dynamic>; + +responseOptionsDisabledControls: List<AbstractControl<dynamic>>; + +logicControlOptions: List<FormControlOption<bool>>; + +questionBaseControls: Map<String, AbstractControl<dynamic>>; + +isDirtyOptionsBannerVisible: bool | - +Widget build() + +dynamic onResponseOptionsChanged(); + +void setControlsFrom(); + +QuestionFormData buildFormData(); + -List<FormControl<dynamic>> _copyFormControls(); + -AbstractControl<dynamic>? _findAssociatedLogicControlFor(); + -AbstractControl<dynamic>? _findAssociatedControlFor(); + +ScreenerQuestionFormViewModel createDuplicate() ] - [StudyStatusBadge]o-[Participation] - [StudyStatusBadge]o-[StudyStatus] - [StudyStatusBadge]o-[BadgeType] + [ScreenerQuestionFormViewModel]o-[FormArray] + [QuestionFormViewModel]<:-[ScreenerQuestionFormViewModel] + [<abstract>IScreenerQuestionLogicFormViewModel]<:--[ScreenerQuestionFormViewModel] - [FrameControlsWidget - | - +onRefresh: void Function()?; - +onOpenNewTab: void Function()?; - +enabled: bool + [ConsentItemFormView | - +Widget build() + +formViewModel: ConsentItemFormViewModel ] - [FrameControlsWidget]o-[void Function()?] - [<abstract>ConsumerWidget]<:-[FrameControlsWidget] + [ConsentItemFormView]o-[ConsentItemFormViewModel] - [StudyTestScreen + [ConsentItemFormData | - +previewRoute: String? + +consentId: String; + +title: String; + +description: String; + +iconName: String?; + +id: String | - +Widget build(); - +Widget? banner(); - +dynamic load(); - +dynamic save(); - +dynamic showHelp() + +ConsentItem toConsentItem(); + +ConsentItemFormData copy() ] - [<abstract>StudyPageWidget]<:-[StudyTestScreen] + [<abstract>IFormData]<:-[ConsentItemFormData] - [<abstract>IStudyNavViewModel + [<abstract>IScreenerQuestionLogicFormViewModel | - +isEditTabEnabled: bool; - +isTestTabEnabled: bool; - +isRecruitTabEnabled: bool; - +isMonitorTabEnabled: bool; - +isAnalyzeTabEnabled: bool; - +isSettingsEnabled: bool + +isDirtyOptionsBannerVisible: bool ] - [StudyNav + [ScreenerQuestionLogicFormView | - <static>+dynamic tabs(); - <static>+dynamic edit(); - <static>+dynamic test(); - <static>+dynamic recruit(); - <static>+dynamic monitor(); - <static>+dynamic analyze() + +formViewModel: ScreenerQuestionFormViewModel + | + +Widget build(); + -dynamic _buildInfoBanner(); + -dynamic _buildAnswerOptionsLogicControls(); + -List<Widget> _buildOptionLogicRow() ] - [StudyDesignNav + [ScreenerQuestionLogicFormView]o-[ScreenerQuestionFormViewModel] + [<abstract>FormConsumerWidget]<:-[ScreenerQuestionLogicFormView] + + [EnrollmentFormViewModel | - <static>+dynamic tabs(); - <static>+dynamic info(); - <static>+dynamic enrollment(); - <static>+dynamic interventions(); - <static>+dynamic measurements(); - <static>+dynamic reports() + +study: Study; + +router: GoRouter; + +consentItemDelegate: EnrollmentFormConsentItemDelegate; + +enrollmentTypeControl: FormControl<Participation>; + +consentItemArray: FormArray<dynamic>; + +consentItemFormViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData>; + +form: FormGroup; + +enrollmentTypeControlOptions: List<FormControlOption<Participation>>; + +consentItemModels: List<ConsentItemFormViewModel>; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +titles: Map<FormMode, String>; + +canTestScreener: bool; + +canTestConsent: bool; + +questionTitles: Map<FormMode, String Function()> + | + +void setControlsFrom(); + +EnrollmentFormData buildFormData(); + +void read(); + +List<ModelAction<dynamic>> availableActions(); + +List<ModelAction<dynamic>> availablePopupActions(); + +List<ModelAction<dynamic>> availableInlineActions(); + +void onSelectItem(); + +void onNewItem(); + +ScreenerQuestionFormRouteArgs buildNewScreenerQuestionFormRouteArgs(); + +ScreenerQuestionFormRouteArgs buildScreenerQuestionFormRouteArgs(); + +ConsentItemFormRouteArgs buildNewConsentItemFormRouteArgs(); + +ConsentItemFormRouteArgs buildConsentItemFormRouteArgs(); + +dynamic testScreener(); + +dynamic testConsent(); + +ScreenerQuestionFormViewModel provideQuestionFormViewModel() ] - [RouteInformation + [EnrollmentFormViewModel]o-[Study] + [EnrollmentFormViewModel]o-[GoRouter] + [EnrollmentFormViewModel]o-[EnrollmentFormConsentItemDelegate] + [EnrollmentFormViewModel]o-[FormControl] + [EnrollmentFormViewModel]o-[FormArray] + [EnrollmentFormViewModel]o-[FormViewModelCollection] + [EnrollmentFormViewModel]o-[FormGroup] + [<abstract>FormViewModel]<:-[EnrollmentFormViewModel] + [<abstract>WithQuestionnaireControls]<:-[EnrollmentFormViewModel] + [<abstract>IFormViewModelDelegate]<:--[EnrollmentFormViewModel] + [<abstract>IListActionProvider]<:--[EnrollmentFormViewModel] + [<abstract>IProviderArgsResolver]<:--[EnrollmentFormViewModel] + + [EnrollmentFormConsentItemDelegate | - +route: String?; - +extra: String?; - +cmd: String?; - +data: String? + +formViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData>; + +owner: EnrollmentFormViewModel; + +propagateOnSave: bool; + +validationSet: dynamic | - +String toString() + +void onCancel(); + +dynamic onSave(); + +ConsentItemFormViewModel provide(); + +List<ModelAction<dynamic>> availableActions(); + +void onNewItem(); + +void onSelectItem() ] - [<abstract>PlatformController + [EnrollmentFormConsentItemDelegate]o-[FormViewModelCollection] + [EnrollmentFormConsentItemDelegate]o-[EnrollmentFormViewModel] + [<abstract>IFormViewModelDelegate]<:--[EnrollmentFormConsentItemDelegate] + [<abstract>IListActionProvider]<:--[EnrollmentFormConsentItemDelegate] + [<abstract>IProviderArgsResolver]<:--[EnrollmentFormConsentItemDelegate] + + [QuestionnaireFormData | - +studyId: String; - +baseSrc: String; - +previewSrc: String; - +routeInformation: RouteInformation; - +frameWidget: Widget + +questionsData: List<QuestionFormData>?; + +id: String | - +void activate(); - +void registerViews(); - +void generateUrl(); - +void navigate(); - +void refresh(); - +void listen(); - +void send(); - +void openNewPage() + +StudyUQuestionnaire toQuestionnaire(); + +List<EligibilityCriterion> toEligibilityCriteria(); + +QuestionnaireFormData copy() ] - [<abstract>PlatformController]o-[RouteInformation] - [<abstract>PlatformController]o-[<abstract>Widget] + [<abstract>IFormData]<:--[QuestionnaireFormData] - [WebController + [<abstract>WithQuestionnaireControls | - +iFrameElement: IFrameElement + +questionsArray: FormArray<dynamic>; + +questionFormViewModels: FormViewModelCollection<Q, QuestionFormData>; + +questionnaireControls: Map<String, FormArray<dynamic>>; + +propagateOnSave: bool; + +questionModels: List<Q>; + +questionTitles: Map<FormMode, String Function()> | - +void activate(); - +void registerViews(); - +void generateUrl(); - +void navigate(); - +void refresh(); - +void openNewPage(); - +void listen(); - +void send() + +void setQuestionnaireControlsFrom(); + +QuestionnaireFormData buildQuestionnaireFormData(); + +void read(); + +void onCancel(); + +dynamic onSave(); + +Q provide(); + +Q provideQuestionFormViewModel() ] - [WebController]o-[IFrameElement] - [<abstract>PlatformController]<:-[WebController] + [<abstract>WithQuestionnaireControls]o-[FormArray] + [<abstract>WithQuestionnaireControls]o-[FormViewModelCollection] + [<abstract>IFormViewModelDelegate]<:--[<abstract>WithQuestionnaireControls] + [<abstract>IProviderArgsResolver]<:--[<abstract>WithQuestionnaireControls] - [MobileController + [SurveyQuestionFormView | - +void openNewPage(); - +void refresh(); - +void registerViews(); - +void listen(); - +void send(); - +void navigate(); - +void activate(); - +void generateUrl() + +formViewModel: QuestionFormViewModel; + +isHtmlStyleable: bool ] - [<abstract>PlatformController]<:-[MobileController] + [SurveyQuestionFormView]o-[QuestionFormViewModel] - [StudySettingsFormViewModel + [QuestionFormViewModel | - +study: AsyncValue<Study>; - +studyRepository: IStudyRepository; - <static>+defaultPublishedToRegistry: bool; - <static>+defaultPublishedToRegistryResults: bool; - +isPublishedToRegistryControl: FormControl<bool>; - +isPublishedToRegistryResultsControl: FormControl<bool>; + <static>+defaultQuestionType: SurveyQuestionType; + -_titles: Map<FormMode, String Function()>?; + +questionIdControl: FormControl<String>; + +questionTypeControl: FormControl<SurveyQuestionType>; + +questionTextControl: FormControl<String>; + +questionInfoTextControl: FormControl<String>; + +questionBaseControls: Map<String, AbstractControl<dynamic>>; + +isMultipleChoiceControl: FormControl<bool>; + +choiceResponseOptionsArray: FormArray<dynamic>; + +customOptionsMin: int; + +customOptionsMax: int; + +customOptionsInitial: int; + +boolResponseOptionsArray: FormArray<String>; + <static>+kDefaultScaleMinValue: int; + <static>+kDefaultScaleMaxValue: int; + <static>+kNumMidValueControls: int; + <static>+kMidValueDebounceMilliseconds: int; + +scaleMinValueControl: FormControl<int>; + +scaleMaxValueControl: FormControl<int>; + -_scaleRangeControl: FormControl<int>; + +scaleMinLabelControl: FormControl<String>; + +scaleMaxLabelControl: FormControl<String>; + +scaleMidValueControls: FormArray<int>; + +scaleMidLabelControls: FormArray<String?>; + -_scaleResponseOptionsArray: FormArray<int>; + +scaleMinColorControl: FormControl<SerializableColor>; + +scaleMaxColorControl: FormControl<SerializableColor>; + +prevMidValues: List<int?>?; + -_controlsByQuestionType: Map<SurveyQuestionType, FormGroup>; + -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + -_validationConfigsByQuestionType: Map<SurveyQuestionType, Map<FormValidationSetEnum, List<FormControlValidation>>>; +form: FormGroup; - +titles: Map<FormMode, String> + +questionId: String; + +questionType: SurveyQuestionType; + +questionTypeControlOptions: List<FormControlOption<SurveyQuestionType>>; + +answerOptionsArray: FormArray<dynamic>; + +answerOptionsControls: List<AbstractControl<dynamic>>; + +validAnswerOptions: List<String>; + +boolOptions: List<AbstractControl<String>>; + +scaleMinValue: int; + +scaleMaxValue: int; + +scaleRange: int; + +scaleAllValueControls: List<AbstractControl<int>>; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +questionTextRequired: dynamic; + +numValidChoiceOptions: dynamic; + +scaleRangeValid: dynamic; + +titles: Map<FormMode, String>; + +isAddOptionButtonVisible: bool; + +isMidValuesClearedInfoVisible: bool | + +String? scaleMidLabelAt(); + -dynamic _onScaleRangeChanged(); + -dynamic _applyInputFormatters(); + -dynamic _updateScaleMidValueControls(); + -List<FormControlValidation> _getValidationConfig(); + +dynamic onQuestionTypeChanged(); + +dynamic onResponseOptionsChanged(); + -void _updateFormControls(); + +void initControls(); +void setControlsFrom(); - +Study buildFormData(); - +dynamic keepControlsSynced(); - +dynamic save(); - +dynamic setLaunchDefaults() + +QuestionFormData buildFormData(); + +List<ModelAction<dynamic>> availableActions(); + +void onNewItem(); + +void onSelectItem(); + +QuestionFormViewModel createDuplicate() ] - [StudySettingsFormViewModel]o-[<abstract>AsyncValue] - [StudySettingsFormViewModel]o-[<abstract>IStudyRepository] - [StudySettingsFormViewModel]o-[FormControl] - [StudySettingsFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[StudySettingsFormViewModel] + [QuestionFormViewModel]o-[SurveyQuestionType] + [QuestionFormViewModel]o-[FormControl] + [QuestionFormViewModel]o-[FormArray] + [QuestionFormViewModel]o-[FormGroup] + [<abstract>ManagedFormViewModel]<:-[QuestionFormViewModel] + [<abstract>IListActionProvider]<:--[QuestionFormViewModel] - [StudySettingsDialog + [<abstract>QuestionFormData | - +Widget build() + <static>+questionTypeFormDataFactories: Map<SurveyQuestionType, QuestionFormData Function(Question<dynamic>, List<EligibilityCriterion>)>; + +questionId: String; + +questionText: String; + +questionInfoText: String?; + +questionType: SurveyQuestionType; + +responseOptionsValidity: Map<dynamic, bool>; + +responseOptions: List<dynamic>; + +id: String + | + +Question<dynamic> toQuestion(); + +EligibilityCriterion toEligibilityCriterion(); + +Answer<dynamic> constructAnswerFor(); + +dynamic setResponseOptionsValidityFrom(); + +QuestionFormData copy() ] - [<abstract>StudyPageWidget]<:-[StudySettingsDialog] + [<abstract>QuestionFormData]o-[SurveyQuestionType] + [<abstract>IFormData]<:--[<abstract>QuestionFormData] - [StudyBaseController + [ChoiceQuestionFormData | - +studyId: String; - +studyRepository: IStudyRepository; - +router: GoRouter; - +studySubscription: StreamSubscription<WrappedModel<Study>>? + +isMultipleChoice: bool; + +answerOptions: List<String>; + +responseOptions: List<String> | - +dynamic subscribeStudy(); - +dynamic onStudySubscriptionUpdate(); - +dynamic onStudySubscriptionError(); - +void dispose() + +Question<dynamic> toQuestion(); + +QuestionFormData copy(); + -Choice _buildChoiceForValue(); + +Answer<dynamic> constructAnswerFor() ] - [StudyBaseController]o-[<abstract>IStudyRepository] - [StudyBaseController]o-[GoRouter] - [StudyBaseController]o-[StreamSubscription] + [<abstract>QuestionFormData]<:-[ChoiceQuestionFormData] - [WebFrame + [BoolQuestionFormData | - +previewSrc: String; - +studyId: String + <static>+kResponseOptions: Map<String, bool>; + +responseOptions: List<String> | - +Widget build() + +Question<dynamic> toQuestion(); + +BoolQuestionFormData copy(); + +Answer<dynamic> constructAnswerFor() ] - [DisabledFrame - | - +Widget build() - ] + [<abstract>QuestionFormData]<:-[BoolQuestionFormData] - [PhoneContainer + [ScaleQuestionFormData | - <static>+defaultWidth: double; - <static>+defaultHeight: double; - +width: double; - +height: double; - +borderColor: Color; - +borderWidth: double; - +borderRadius: double; - +innerContent: Widget; - +innerContentBackgroundColor: Color? + +minValue: double; + +maxValue: double; + +minLabel: String?; + +maxLabel: String?; + +midValues: List<double?>; + +midLabels: List<String?>; + +stepSize: double; + +initialValue: double?; + +minColor: Color?; + +maxColor: Color?; + +responseOptions: List<double>; + +midAnnotations: List<Annotation> | - +Widget build() + +ScaleQuestion toQuestion(); + +QuestionFormData copy(); + +Answer<dynamic> constructAnswerFor() ] - [PhoneContainer]o-[Color] - [PhoneContainer]o-[<abstract>Widget] + [ScaleQuestionFormData]o-[Color] + [<abstract>QuestionFormData]<:-[ScaleQuestionFormData] - [MobileFrame + [<abstract>IScaleQuestionFormViewModel | - +Widget build() + +isMidValuesClearedInfoVisible: bool ] - [DesktopFrame + [ScaleQuestionFormView | - +Widget build() + +formViewModel: QuestionFormViewModel ] - [StudyTestController + [ScaleQuestionFormView]o-[QuestionFormViewModel] + + [SurveyQuestionType | - +authRepository: IAuthRepository; - +languageCode: String + +index: int; + <static>+values: List<SurveyQuestionType>; + <static>+choice: SurveyQuestionType; + <static>+bool: SurveyQuestionType; + <static>+scale: SurveyQuestionType ] - [StudyTestController]o-[<abstract>IAuthRepository] - [StudyBaseController]<:-[StudyTestController] + [SurveyQuestionType]o-[SurveyQuestionType] + [Enum]<:--[SurveyQuestionType] - [StudyController + [BoolQuestionFormView | - +notificationService: INotificationService; - +studyEventsSubscription: StreamSubscription<ModelEvent<Study>>?; - +studyActions: List<ModelAction<dynamic>> + +formViewModel: QuestionFormViewModel | - +dynamic syncStudyStatus(); - +dynamic onStudySubscriptionUpdate(); - -dynamic _redirectNewToActualStudyID(); - +dynamic publishStudy(); - +void onChangeStudyParticipation(); - +void onAddParticipants(); - +void onSettingsPressed(); - +void dispose() + +Widget build() ] - [StudyController]o-[<abstract>INotificationService] - [StudyController]o-[StreamSubscription] - [StudyBaseController]<:-[StudyController] + [BoolQuestionFormView]o-[QuestionFormViewModel] + [<abstract>ConsumerWidget]<:-[BoolQuestionFormView] - [TestAppRoutes + [ChoiceQuestionFormView | - <static>+studyOverview: String; - <static>+eligibility: String; - <static>+intervention: String; - <static>+consent: String; - <static>+journey: String; - <static>+dashboard: String - ] - - [StudyDesignInfoFormView + +formViewModel: QuestionFormViewModel | +Widget build() ] - [<abstract>StudyDesignPageWidget]<:-[StudyDesignInfoFormView] + [ChoiceQuestionFormView]o-[QuestionFormViewModel] + [<abstract>ConsumerWidget]<:-[ChoiceQuestionFormView] - [StudyInfoFormViewModel + [ScheduleControls | - +study: Study; - +titleControl: FormControl<String>; - +iconControl: FormControl<IconOption>; - +descriptionControl: FormControl<String>; - +organizationControl: FormControl<String>; - +reviewBoardControl: FormControl<String>; - +reviewBoardNumberControl: FormControl<String>; - +researchersControl: FormControl<String>; - +emailControl: FormControl<String>; - +websiteControl: FormControl<String>; - +phoneControl: FormControl<String>; - +additionalInfoControl: FormControl<String>; - +form: FormGroup; - +titles: Map<FormMode, String>; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titleRequired: dynamic; - +descriptionRequired: dynamic; - +iconRequired: dynamic; - +organizationRequired: dynamic; - +reviewBoardRequired: dynamic; - +reviewBoardNumberRequired: dynamic; - +researchersRequired: dynamic; - +emailRequired: dynamic; - +phoneRequired: dynamic; - +emailFormat: dynamic; - +websiteFormat: dynamic + +formViewModel: WithScheduleControls | - +void setControlsFrom(); - +StudyInfoFormData buildFormData() - ] - - [StudyInfoFormViewModel]o-[Study] - [StudyInfoFormViewModel]o-[FormControl] - [StudyInfoFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[StudyInfoFormViewModel] - - [StudyInfoFormData - | - +title: String; - +description: String?; - +iconName: String; - +contactInfoFormData: StudyContactInfoFormData; - +id: String - | - +Study apply(); - +StudyInfoFormData copy() - ] - - [StudyInfoFormData]o-[StudyContactInfoFormData] - [<abstract>IStudyFormData]<:--[StudyInfoFormData] - - [StudyContactInfoFormData - | - +organization: String?; - +institutionalReviewBoard: String?; - +institutionalReviewBoardNumber: String?; - +researchers: String?; - +email: String?; - +website: String?; - +phone: String?; - +additionalInfo: String?; - +id: String - | - +Study apply(); - +StudyInfoFormData copy() + +Widget build(); + -List<FormTableRow> _conditionalTimeRestrictions() ] - [<abstract>IStudyFormData]<:--[StudyContactInfoFormData] + [ScheduleControls]o-[<abstract>WithScheduleControls] + [<abstract>FormConsumerWidget]<:-[ScheduleControls] - [StudyFormScaffold + [<abstract>WithScheduleControls | - +studyId: String; - +formViewModelBuilder: T Function(WidgetRef); - +formViewBuilder: Widget Function(T) + +isTimeRestrictedControl: FormControl<bool>; + +instanceID: FormControl<String>; + +restrictedTimeStartControl: FormControl<Time>; + +restrictedTimeStartPickerControl: FormControl<TimeOfDay>; + +restrictedTimeEndControl: FormControl<Time>; + +restrictedTimeEndPickerControl: FormControl<TimeOfDay>; + +hasReminderControl: FormControl<bool>; + +reminderTimeControl: FormControl<Time>; + +reminderTimePickerControl: FormControl<TimeOfDay>; + -_reminderControlStream: StreamSubscription<dynamic>?; + +scheduleFormControls: Map<String, FormControl<Object>>; + +hasReminder: bool; + +isTimeRestricted: bool; + +timeRestriction: List<Time>? | - +Widget build() + +void setScheduleControlsFrom(); + -dynamic _initReminderControl() ] - [StudyFormScaffold]o-[T Function(WidgetRef)] - [StudyFormScaffold]o-[Widget Function(T)] - [<abstract>ConsumerWidget]<:-[StudyFormScaffold] + [<abstract>WithScheduleControls]o-[FormControl] + [<abstract>WithScheduleControls]o-[StreamSubscription] - [StudyFormValidationSet + [<abstract>IFormDataWithSchedule | - +index: int; - <static>+values: List<StudyFormValidationSet> - ] - - [Enum]<:--[StudyFormValidationSet] - - [StudyDesignMeasurementsFormView + +instanceId: String; + +isTimeLocked: bool; + +timeLockStart: StudyUTimeOfDay?; + +timeLockEnd: StudyUTimeOfDay?; + +hasReminder: bool; + +reminderTime: StudyUTimeOfDay? | - +Widget build() + +Schedule toSchedule() ] - [<abstract>StudyDesignPageWidget]<:-[StudyDesignMeasurementsFormView] + [<abstract>IFormDataWithSchedule]o-[StudyUTimeOfDay] + [<abstract>IFormData]<:--[<abstract>IFormDataWithSchedule] - [MeasurementsFormViewModel + [StudyFormViewModel | - +study: Study; + +studyDirtyCopy: Study?; + +studyRepository: IStudyRepository; + +authRepository: IAuthRepository; +router: GoRouter; - +measurementsArray: FormArray<dynamic>; - +surveyMeasurementFormViewModels: FormViewModelCollection<MeasurementSurveyFormViewModel, MeasurementSurveyFormData>; + +studyInfoFormViewModel: StudyInfoFormViewModel; + +enrollmentFormViewModel: EnrollmentFormViewModel; + +measurementsFormViewModel: MeasurementsFormViewModel; + +reportsFormViewModel: ReportsFormViewModel; + +interventionsFormViewModel: InterventionsFormViewModel; +form: FormGroup; - +measurementViewModels: List<MeasurementSurveyFormViewModel>; + +isStudyReadonly: bool; +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +measurementRequired: dynamic; +titles: Map<FormMode, String> | +void read(); +void setControlsFrom(); - +MeasurementsFormData buildFormData(); - +List<ModelAction<dynamic>> availableActions(); - +List<ModelAction<dynamic>> availablePopupActions(); - +List<ModelAction<dynamic>> availableInlineActions(); - +void onSelectItem(); - +void onNewItem(); - +MeasurementSurveyFormViewModel provide(); + +Study buildFormData(); + +void dispose(); +void onCancel(); - +dynamic onSave() + +dynamic onSave(); + -dynamic _applyAndSaveSubform() ] - [MeasurementsFormViewModel]o-[Study] - [MeasurementsFormViewModel]o-[GoRouter] - [MeasurementsFormViewModel]o-[FormArray] - [MeasurementsFormViewModel]o-[FormViewModelCollection] - [MeasurementsFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[MeasurementsFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[MeasurementsFormViewModel] - [<abstract>IListActionProvider]<:--[MeasurementsFormViewModel] - [<abstract>IProviderArgsResolver]<:--[MeasurementsFormViewModel] + [StudyFormViewModel]o-[Study] + [StudyFormViewModel]o-[<abstract>IStudyRepository] + [StudyFormViewModel]o-[<abstract>IAuthRepository] + [StudyFormViewModel]o-[GoRouter] + [StudyFormViewModel]o-[StudyInfoFormViewModel] + [StudyFormViewModel]o-[EnrollmentFormViewModel] + [StudyFormViewModel]o-[MeasurementsFormViewModel] + [StudyFormViewModel]o-[ReportsFormViewModel] + [StudyFormViewModel]o-[InterventionsFormViewModel] + [StudyFormViewModel]o-[FormGroup] + [<abstract>FormViewModel]<:-[StudyFormViewModel] + [<abstract>IFormViewModelDelegate]<:--[StudyFormViewModel] - [MeasurementsFormData + [<abstract>StudyDesignPageWidget | - +surveyMeasurements: List<MeasurementSurveyFormData>; + +Widget? banner() + ] + + [<abstract>StudyPageWidget]<:-[<abstract>StudyDesignPageWidget] + + [MeasurementSurveyFormData + | + +measurementId: String; + +title: String; + +introText: String?; + +outroText: String?; + +questionnaireFormData: QuestionnaireFormData; + <static>+kDefaultTitle: String; +id: String | - +Study apply(); - +MeasurementsFormData copy() + +QuestionnaireTask toQuestionnaireTask(); + +MeasurementSurveyFormData copy() ] - [<abstract>IStudyFormData]<:--[MeasurementsFormData] + [MeasurementSurveyFormData]o-[QuestionnaireFormData] + [<abstract>IFormDataWithSchedule]<:-[MeasurementSurveyFormData] [MeasurementSurveyFormViewModel | @@ -1137,23 +1312,6 @@ [<abstract>IListActionProvider]<:--[MeasurementSurveyFormViewModel] [<abstract>IProviderArgsResolver]<:--[MeasurementSurveyFormViewModel] - [MeasurementSurveyFormData - | - +measurementId: String; - +title: String; - +introText: String?; - +outroText: String?; - +questionnaireFormData: QuestionnaireFormData; - <static>+kDefaultTitle: String; - +id: String - | - +QuestionnaireTask toQuestionnaireTask(); - +MeasurementSurveyFormData copy() - ] - - [MeasurementSurveyFormData]o-[QuestionnaireFormData] - [<abstract>IFormDataWithSchedule]<:-[MeasurementSurveyFormData] - [SurveyPreview | +routeArgs: MeasurementFormRouteArgs @@ -1171,266 +1329,199 @@ [MeasurementSurveyFormView]o-[MeasurementSurveyFormViewModel] - [<abstract>IStudyFormData + [StudyDesignMeasurementsFormView | - +Study apply() + +Widget build() ] - [<abstract>IFormData]<:--[<abstract>IStudyFormData] + [<abstract>StudyDesignPageWidget]<:-[StudyDesignMeasurementsFormView] - [ReportsFormViewModel + [MeasurementsFormViewModel | +study: Study; +router: GoRouter; - +reportItemDelegate: ReportFormItemDelegate; - +reportItemArray: FormArray<dynamic>; - +reportItemFormViewModels: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData>; + +measurementsArray: FormArray<dynamic>; + +surveyMeasurementFormViewModels: FormViewModelCollection<MeasurementSurveyFormViewModel, MeasurementSurveyFormData>; +form: FormGroup; - +reportItemModels: List<ReportItemFormViewModel>; + +measurementViewModels: List<MeasurementSurveyFormViewModel>; +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titles: Map<FormMode, String>; - +canTestConsent: bool + +measurementRequired: dynamic; + +titles: Map<FormMode, String> | - +void setControlsFrom(); - +ReportsFormData buildFormData(); +void read(); - +ReportItemFormRouteArgs buildNewReportItemFormRouteArgs(); - +ReportItemFormRouteArgs buildReportItemFormRouteArgs(); - +dynamic testReport(); + +void setControlsFrom(); + +MeasurementsFormData buildFormData(); + +List<ModelAction<dynamic>> availableActions(); + +List<ModelAction<dynamic>> availablePopupActions(); + +List<ModelAction<dynamic>> availableInlineActions(); + +void onSelectItem(); + +void onNewItem(); + +MeasurementSurveyFormViewModel provide(); +void onCancel(); - +dynamic onSave(); - +ReportItemFormViewModel provide() + +dynamic onSave() ] - [ReportsFormViewModel]o-[Study] - [ReportsFormViewModel]o-[GoRouter] - [ReportsFormViewModel]o-[ReportFormItemDelegate] - [ReportsFormViewModel]o-[FormArray] - [ReportsFormViewModel]o-[FormViewModelCollection] - [ReportsFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[ReportsFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[ReportsFormViewModel] - [<abstract>IProviderArgsResolver]<:--[ReportsFormViewModel] + [MeasurementsFormViewModel]o-[Study] + [MeasurementsFormViewModel]o-[GoRouter] + [MeasurementsFormViewModel]o-[FormArray] + [MeasurementsFormViewModel]o-[FormViewModelCollection] + [MeasurementsFormViewModel]o-[FormGroup] + [<abstract>FormViewModel]<:-[MeasurementsFormViewModel] + [<abstract>IFormViewModelDelegate]<:--[MeasurementsFormViewModel] + [<abstract>IListActionProvider]<:--[MeasurementsFormViewModel] + [<abstract>IProviderArgsResolver]<:--[MeasurementsFormViewModel] - [ReportFormItemDelegate + [MeasurementsFormData | - +formViewModelCollection: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData>; - +owner: ReportsFormViewModel; - +propagateOnSave: bool; - +validationSet: dynamic + +surveyMeasurements: List<MeasurementSurveyFormData>; + +id: String | - +void onCancel(); - +dynamic onSave(); - +ReportItemFormViewModel provide(); - +List<ModelAction<dynamic>> availableActions(); - +void onNewItem(); - +void onSelectItem() + +Study apply(); + +MeasurementsFormData copy() ] - [ReportFormItemDelegate]o-[FormViewModelCollection] - [ReportFormItemDelegate]o-[ReportsFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[ReportFormItemDelegate] - [<abstract>IListActionProvider]<:--[ReportFormItemDelegate] - [<abstract>IProviderArgsResolver]<:--[ReportFormItemDelegate] + [<abstract>IStudyFormData]<:--[MeasurementsFormData] - [ReportItemFormView + [StudyTestScreen | - +formViewModel: ReportItemFormViewModel; - +studyId: String; - +reportSectionColumnWidth: dynamic; - +sectionTypeBodyBuilder: Widget Function(BuildContext) + +previewRoute: String? | +Widget build(); - -dynamic _buildSectionText(); - -dynamic _buildSectionTypeHeader() + +Widget? banner(); + +dynamic load(); + +dynamic save(); + +dynamic showHelp() ] - [ReportItemFormView]o-[ReportItemFormViewModel] - [ReportItemFormView]o-[Widget Function(BuildContext)] + [<abstract>StudyPageWidget]<:-[StudyTestScreen] - [LinearRegressionSectionFormView - | - +formViewModel: ReportItemFormViewModel; - +studyId: String; - +reportSectionColumnWidth: Map<int, TableColumnWidth> + [StudySettingsDialog | +Widget build() ] - [LinearRegressionSectionFormView]o-[ReportItemFormViewModel] - [<abstract>ConsumerWidget]<:-[LinearRegressionSectionFormView] + [<abstract>StudyPageWidget]<:-[StudySettingsDialog] - [DataReferenceIdentifier + [StudySettingsFormViewModel | - +hashCode: int + +study: AsyncValue<Study>; + +studyRepository: IStudyRepository; + <static>+defaultPublishedToRegistry: bool; + <static>+defaultPublishedToRegistryResults: bool; + +isPublishedToRegistryControl: FormControl<bool>; + +isPublishedToRegistryResultsControl: FormControl<bool>; + +form: FormGroup; + +titles: Map<FormMode, String> | - +bool ==() + +void setControlsFrom(); + +Study buildFormData(); + +dynamic keepControlsSynced(); + +dynamic save(); + +dynamic setLaunchDefaults() ] - [DataReference]<:-[DataReferenceIdentifier] + [StudySettingsFormViewModel]o-[<abstract>AsyncValue] + [StudySettingsFormViewModel]o-[<abstract>IStudyRepository] + [StudySettingsFormViewModel]o-[FormControl] + [StudySettingsFormViewModel]o-[FormGroup] + [<abstract>FormViewModel]<:-[StudySettingsFormViewModel] - [DataReferenceEditor - | - +formControl: FormControl<DataReferenceIdentifier<T>>; - +availableTasks: List<Task>; - +buildReactiveDropdownField: ReactiveDropdownField<dynamic> + [<abstract>IStudyNavViewModel | - +FormTableRow buildFormTableRow(); - -List<DropdownMenuItem<DataReferenceIdentifier<dynamic>>> _dataReferenceItems() + +isEditTabEnabled: bool; + +isTestTabEnabled: bool; + +isRecruitTabEnabled: bool; + +isMonitorTabEnabled: bool; + +isAnalyzeTabEnabled: bool; + +isSettingsEnabled: bool ] - [DataReferenceEditor]o-[FormControl] - [DataReferenceEditor]o-[ReactiveDropdownField] - - [TemporalAggregationFormatted - | - -_value: TemporalAggregation; - <static>+values: List<TemporalAggregationFormatted>; - +value: TemporalAggregation; - +string: String; - +icon: IconData?; - +hashCode: int + [StudyNav | - +bool ==(); - +String toString(); - +String toJson(); - <static>+TemporalAggregationFormatted fromJson() + <static>+dynamic tabs(); + <static>+dynamic edit(); + <static>+dynamic test(); + <static>+dynamic recruit(); + <static>+dynamic monitor(); + <static>+dynamic analyze() ] - [TemporalAggregationFormatted]o-[TemporalAggregation] - [TemporalAggregationFormatted]o-[IconData] - - [ImprovementDirectionFormatted - | - -_value: ImprovementDirection; - <static>+values: List<ImprovementDirectionFormatted>; - +value: ImprovementDirection; - +string: String; - +icon: IconData?; - +hashCode: int + [StudyDesignNav | - +bool ==(); - +String toString(); - +String toJson(); - <static>+ImprovementDirectionFormatted fromJson() + <static>+dynamic tabs(); + <static>+dynamic info(); + <static>+dynamic enrollment(); + <static>+dynamic interventions(); + <static>+dynamic measurements(); + <static>+dynamic reports() ] - [ImprovementDirectionFormatted]o-[ImprovementDirection] - [ImprovementDirectionFormatted]o-[IconData] - - [ReportSectionType + [WebFrame | - +index: int; - <static>+values: List<ReportSectionType>; - <static>+average: ReportSectionType; - <static>+linearRegression: ReportSectionType + +previewSrc: String; + +studyId: String + | + +Widget build() ] - [ReportSectionType]o-[ReportSectionType] - [Enum]<:--[ReportSectionType] - - [AverageSectionFormView - | - +formViewModel: ReportItemFormViewModel; - +studyId: String; - +reportSectionColumnWidth: Map<int, TableColumnWidth> + [DisabledFrame | +Widget build() ] - [AverageSectionFormView]o-[ReportItemFormViewModel] - [<abstract>ConsumerWidget]<:-[AverageSectionFormView] - - [ReportItemFormViewModel + [PhoneContainer | - <static>+defaultSectionType: ReportSectionType; - +sectionIdControl: FormControl<String>; - +sectionTypeControl: FormControl<ReportSectionType>; - +titleControl: FormControl<String>; - +descriptionControl: FormControl<String>; - +sectionControl: FormControl<ReportSection>; - +dataReferenceControl: FormControl<DataReferenceIdentifier<num>>; - +temporalAggregationControl: FormControl<TemporalAggregationFormatted>; - +improvementDirectionControl: FormControl<ImprovementDirectionFormatted>; - +alphaControl: FormControl<double>; - -_controlsBySectionType: Map<ReportSectionType, FormGroup>; - -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - -_validationConfigsBySectionType: Map<ReportSectionType, Map<FormValidationSetEnum, List<FormControlValidation>>>; - +sectionBaseControls: Map<String, AbstractControl<dynamic>>; - +form: FormGroup; - +sectionId: String; - +sectionType: ReportSectionType; - <static>+sectionTypeControlOptions: List<FormControlOption<ReportSectionType>>; - <static>+temporalAggregationControlOptions: List<FormControlOption<TemporalAggregationFormatted>>; - <static>+improvementDirectionControlOptions: List<FormControlOption<ImprovementDirectionFormatted>>; - +titles: Map<FormMode, String>; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titleRequired: dynamic; - +descriptionRequired: dynamic; - +dataReferenceRequired: dynamic; - +aggregationRequired: dynamic; - +improvementDirectionRequired: dynamic; - +alphaConfidenceRequired: dynamic + <static>+defaultWidth: double; + <static>+defaultHeight: double; + +width: double; + +height: double; + +borderColor: Color; + +borderWidth: double; + +borderRadius: double; + +innerContent: Widget; + +innerContentBackgroundColor: Color? | - -List<FormControlValidation> _getValidationConfig(); - +ReportItemFormData buildFormData(); - +ReportItemFormViewModel createDuplicate(); - +dynamic onSectionTypeChanged(); - -void _updateFormControls(); - +void setControlsFrom() + +Widget build() ] - [ReportItemFormViewModel]o-[ReportSectionType] - [ReportItemFormViewModel]o-[FormControl] - [ReportItemFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[ReportItemFormViewModel] + [PhoneContainer]o-[Color] + [PhoneContainer]o-[<abstract>Widget] - [ReportItemFormData - | - +isPrimary: bool; - +section: ReportSection; - +id: String + [MobileFrame | - <static>+dynamic fromDomainModel(); - +ReportItemFormData copy() + +Widget build() ] - [ReportItemFormData]o-[<abstract>ReportSection] - [<abstract>IFormData]<:-[ReportItemFormData] - - [ReportsFormData - | - +reportItems: List<ReportItemFormData>; - +id: String + [DesktopFrame | - +Study apply(); - +ReportsFormData copy() + +Widget build() ] - [<abstract>IStudyFormData]<:--[ReportsFormData] - - [ReportStatus + [StudyParticipationBadge | - +index: int; - <static>+values: List<ReportStatus>; - <static>+primary: ReportStatus; - <static>+secondary: ReportStatus + +participation: Participation; + +type: BadgeType; + +showPrefixIcon: bool + | + +Widget build() ] - [ReportStatus]o-[ReportStatus] - [Enum]<:--[ReportStatus] + [StudyParticipationBadge]o-[Participation] + [StudyParticipationBadge]o-[BadgeType] - [StudyDesignReportsFormView + [<abstract>IStudyStatusBadgeViewModel | - +Widget build(); - -dynamic _showReportItemSidesheetWithArgs() + +studyParticipation: Participation?; + +studyStatus: StudyStatus? ] - [<abstract>StudyDesignPageWidget]<:-[StudyDesignReportsFormView] + [<abstract>IStudyStatusBadgeViewModel]o-[Participation] + [<abstract>IStudyStatusBadgeViewModel]o-[StudyStatus] - [ReportBadge + [StudyStatusBadge | - +status: ReportStatus?; + +participation: Participation?; + +status: StudyStatus?; +type: BadgeType; +showPrefixIcon: bool; +showTooltip: bool @@ -1438,2768 +1529,2567 @@ +Widget build() ] - [ReportBadge]o-[ReportStatus] - [ReportBadge]o-[BadgeType] + [StudyStatusBadge]o-[Participation] + [StudyStatusBadge]o-[StudyStatus] + [StudyStatusBadge]o-[BadgeType] - [StudyDesignEnrollmentFormView + [StudyBaseController | - +Widget build(); - -dynamic _showScreenerQuestionSidesheetWithArgs(); - -dynamic _showConsentItemSidesheetWithArgs() + +studyId: String; + +studyRepository: IStudyRepository; + +router: GoRouter; + +studySubscription: StreamSubscription<WrappedModel<Study>>? + | + +dynamic subscribeStudy(); + +dynamic onStudySubscriptionUpdate(); + +dynamic onStudySubscriptionError(); + +void dispose() ] - [<abstract>StudyDesignPageWidget]<:-[StudyDesignEnrollmentFormView] + [StudyBaseController]o-[<abstract>IStudyRepository] + [StudyBaseController]o-[GoRouter] + [StudyBaseController]o-[StreamSubscription] - [ConsentItemFormData + [<abstract>StudyPageWidget | - +consentId: String; - +title: String; - +description: String; - +iconName: String?; - +id: String + +studyId: String | - +ConsentItem toConsentItem(); - +ConsentItemFormData copy() + +Widget? banner() ] - [<abstract>IFormData]<:-[ConsentItemFormData] + [<abstract>ConsumerWidget]<:-[<abstract>StudyPageWidget] + [<abstract>IWithBanner]<:--[<abstract>StudyPageWidget] - [EnrollmentFormData - | - <static>+kDefaultEnrollmentType: Participation; - +enrollmentType: Participation; - +questionnaireFormData: QuestionnaireFormData; - +consentItemsFormData: List<ConsentItemFormData>?; - +id: String + [PreviewFrame | - +Study apply(); - +EnrollmentFormData copy() + +studyId: String; + +routeArgs: StudyFormRouteArgs?; + +route: String? ] - [EnrollmentFormData]o-[Participation] - [EnrollmentFormData]o-[QuestionnaireFormData] - [<abstract>IStudyFormData]<:--[EnrollmentFormData] + [PreviewFrame]o-[<abstract>StudyFormRouteArgs] - [ConsentItemFormViewModel + [StudyController | - +consentIdControl: FormControl<String>; - +titleControl: FormControl<String>; - +descriptionControl: FormControl<String>; - +iconControl: FormControl<IconOption>; - +form: FormGroup; - +consentId: String; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titleRequired: dynamic; - +descriptionRequired: dynamic; - +titles: Map<FormMode, String> + +notificationService: INotificationService; + +studyEventsSubscription: StreamSubscription<ModelEvent<Study>>?; + +studyActions: List<ModelAction<dynamic>> | - +void setControlsFrom(); - +ConsentItemFormData buildFormData(); - +ConsentItemFormViewModel createDuplicate() + +dynamic syncStudyStatus(); + +dynamic onStudySubscriptionUpdate(); + -dynamic _redirectNewToActualStudyID(); + +dynamic publishStudy(); + +void onChangeStudyParticipation(); + +void onAddParticipants(); + +void onSettingsPressed(); + +void dispose() ] - [ConsentItemFormViewModel]o-[FormControl] - [ConsentItemFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[ConsentItemFormViewModel] - - [<abstract>IScreenerQuestionLogicFormViewModel - | - +isDirtyOptionsBannerVisible: bool - ] + [StudyController]o-[<abstract>INotificationService] + [StudyController]o-[StreamSubscription] + [StudyBaseController]<:-[StudyController] - [ScreenerQuestionLogicFormView + [FrameControlsWidget | - +formViewModel: ScreenerQuestionFormViewModel + +onRefresh: void Function()?; + +onOpenNewTab: void Function()?; + +enabled: bool | - +Widget build(); - -dynamic _buildInfoBanner(); - -dynamic _buildAnswerOptionsLogicControls(); - -List<Widget> _buildOptionLogicRow() + +Widget build() ] - [ScreenerQuestionLogicFormView]o-[ScreenerQuestionFormViewModel] - [<abstract>FormConsumerWidget]<:-[ScreenerQuestionLogicFormView] + [FrameControlsWidget]o-[void Function()?] + [<abstract>ConsumerWidget]<:-[FrameControlsWidget] - [ScreenerQuestionFormViewModel + [RouteInformation | - <static>+defaultResponseOptionValidity: bool; - +responseOptionsDisabledArray: FormArray<dynamic>; - +responseOptionsLogicControls: FormArray<bool>; - +responseOptionsLogicDescriptionControls: FormArray<String>; - -_questionBaseControls: Map<String, AbstractControl<dynamic>>; - +prevResponseOptionControls: List<AbstractControl<dynamic>>; - +prevResponseOptionValues: List<dynamic>; - +responseOptionsDisabledControls: List<AbstractControl<dynamic>>; - +logicControlOptions: List<FormControlOption<bool>>; - +questionBaseControls: Map<String, AbstractControl<dynamic>>; - +isDirtyOptionsBannerVisible: bool + +route: String?; + +extra: String?; + +cmd: String?; + +data: String? | - +dynamic onResponseOptionsChanged(); - +void setControlsFrom(); - +QuestionFormData buildFormData(); - -List<FormControl<dynamic>> _copyFormControls(); - -AbstractControl<dynamic>? _findAssociatedLogicControlFor(); - -AbstractControl<dynamic>? _findAssociatedControlFor(); - +ScreenerQuestionFormViewModel createDuplicate() + +String toString() ] - [ScreenerQuestionFormViewModel]o-[FormArray] - [QuestionFormViewModel]<:-[ScreenerQuestionFormViewModel] - [<abstract>IScreenerQuestionLogicFormViewModel]<:--[ScreenerQuestionFormViewModel] - - [EnrollmentFormViewModel + [<abstract>PlatformController | - +study: Study; - +router: GoRouter; - +consentItemDelegate: EnrollmentFormConsentItemDelegate; - +enrollmentTypeControl: FormControl<Participation>; - +consentItemArray: FormArray<dynamic>; - +consentItemFormViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData>; - +form: FormGroup; - +enrollmentTypeControlOptions: List<FormControlOption<Participation>>; - +consentItemModels: List<ConsentItemFormViewModel>; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titles: Map<FormMode, String>; - +canTestScreener: bool; - +canTestConsent: bool; - +questionTitles: Map<FormMode, String Function()> + +studyId: String; + +baseSrc: String; + +previewSrc: String; + +routeInformation: RouteInformation; + +frameWidget: Widget | - +void setControlsFrom(); - +EnrollmentFormData buildFormData(); - +void read(); - +List<ModelAction<dynamic>> availableActions(); - +List<ModelAction<dynamic>> availablePopupActions(); - +List<ModelAction<dynamic>> availableInlineActions(); - +void onSelectItem(); - +void onNewItem(); - +ScreenerQuestionFormRouteArgs buildNewScreenerQuestionFormRouteArgs(); - +ScreenerQuestionFormRouteArgs buildScreenerQuestionFormRouteArgs(); - +ConsentItemFormRouteArgs buildNewConsentItemFormRouteArgs(); - +ConsentItemFormRouteArgs buildConsentItemFormRouteArgs(); - +dynamic testScreener(); - +dynamic testConsent(); - +ScreenerQuestionFormViewModel provideQuestionFormViewModel() + +void activate(); + +void registerViews(); + +void generateUrl(); + +void navigate(); + +void refresh(); + +void listen(); + +void send(); + +void openNewPage() ] - [EnrollmentFormViewModel]o-[Study] - [EnrollmentFormViewModel]o-[GoRouter] - [EnrollmentFormViewModel]o-[EnrollmentFormConsentItemDelegate] - [EnrollmentFormViewModel]o-[FormControl] - [EnrollmentFormViewModel]o-[FormArray] - [EnrollmentFormViewModel]o-[FormViewModelCollection] - [EnrollmentFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[EnrollmentFormViewModel] - [<abstract>WithQuestionnaireControls]<:-[EnrollmentFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[EnrollmentFormViewModel] - [<abstract>IListActionProvider]<:--[EnrollmentFormViewModel] - [<abstract>IProviderArgsResolver]<:--[EnrollmentFormViewModel] + [<abstract>PlatformController]o-[RouteInformation] + [<abstract>PlatformController]o-[<abstract>Widget] - [EnrollmentFormConsentItemDelegate + [WebController | - +formViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData>; - +owner: EnrollmentFormViewModel; - +propagateOnSave: bool; - +validationSet: dynamic + +iFrameElement: IFrameElement | - +void onCancel(); - +dynamic onSave(); - +ConsentItemFormViewModel provide(); - +List<ModelAction<dynamic>> availableActions(); - +void onNewItem(); - +void onSelectItem() + +void activate(); + +void registerViews(); + +void generateUrl(); + +void navigate(); + +void refresh(); + +void openNewPage(); + +void listen(); + +void send() ] - [EnrollmentFormConsentItemDelegate]o-[FormViewModelCollection] - [EnrollmentFormConsentItemDelegate]o-[EnrollmentFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[EnrollmentFormConsentItemDelegate] - [<abstract>IListActionProvider]<:--[EnrollmentFormConsentItemDelegate] - [<abstract>IProviderArgsResolver]<:--[EnrollmentFormConsentItemDelegate] + [WebController]o-[IFrameElement] + [<abstract>PlatformController]<:-[WebController] - [ConsentItemFormView + [MobileController | - +formViewModel: ConsentItemFormViewModel + +void openNewPage(); + +void refresh(); + +void registerViews(); + +void listen(); + +void send(); + +void navigate(); + +void activate(); + +void generateUrl() ] - [ConsentItemFormView]o-[ConsentItemFormViewModel] + [<abstract>PlatformController]<:-[MobileController] - [<abstract>WithScheduleControls - | - +isTimeRestrictedControl: FormControl<bool>; - +instanceID: FormControl<String>; - +restrictedTimeStartControl: FormControl<Time>; - +restrictedTimeStartPickerControl: FormControl<TimeOfDay>; - +restrictedTimeEndControl: FormControl<Time>; - +restrictedTimeEndPickerControl: FormControl<TimeOfDay>; - +hasReminderControl: FormControl<bool>; - +reminderTimeControl: FormControl<Time>; - +reminderTimePickerControl: FormControl<TimeOfDay>; - -_reminderControlStream: StreamSubscription<dynamic>?; - +scheduleFormControls: Map<String, FormControl<Object>>; - +hasReminder: bool; - +isTimeRestricted: bool; - +timeRestriction: List<Time>? + [TestAppRoutes | - +void setScheduleControlsFrom(); - -dynamic _initReminderControl() + <static>+studyOverview: String; + <static>+eligibility: String; + <static>+intervention: String; + <static>+consent: String; + <static>+journey: String; + <static>+dashboard: String ] - [<abstract>WithScheduleControls]o-[FormControl] - [<abstract>WithScheduleControls]o-[StreamSubscription] - - [<abstract>IFormDataWithSchedule - | - +instanceId: String; - +isTimeLocked: bool; - +timeLockStart: StudyUTimeOfDay?; - +timeLockEnd: StudyUTimeOfDay?; - +hasReminder: bool; - +reminderTime: StudyUTimeOfDay? + [<abstract>IStudyAppBarViewModel | - +Schedule toSchedule() + +isSyncIndicatorVisible: bool; + +isStatusBadgeVisible: bool; + +isPublishVisible: bool ] - [<abstract>IFormDataWithSchedule]o-[StudyUTimeOfDay] - [<abstract>IFormData]<:--[<abstract>IFormDataWithSchedule] + [<abstract>IStudyStatusBadgeViewModel]<:--[<abstract>IStudyAppBarViewModel] + [<abstract>IStudyNavViewModel]<:--[<abstract>IStudyAppBarViewModel] - [ScheduleControls + [StudyScaffold | - +formViewModel: WithScheduleControls - | - +Widget build(); - -List<FormTableRow> _conditionalTimeRestrictions() + +studyId: String; + +tabs: List<NavbarTab>?; + +tabsSubnav: List<NavbarTab>?; + +selectedTab: NavbarTab?; + +selectedTabSubnav: NavbarTab?; + +body: StudyPageWidget; + +drawer: Widget?; + +disableActions: bool; + +actionsSpacing: double; + +actionsPadding: double; + +layoutType: SingleColumnLayoutType?; + +appbarHeight: double; + +appbarSubnavHeight: double ] - [ScheduleControls]o-[<abstract>WithScheduleControls] - [<abstract>FormConsumerWidget]<:-[ScheduleControls] + [StudyScaffold]o-[NavbarTab] + [StudyScaffold]o-[<abstract>StudyPageWidget] + [StudyScaffold]o-[<abstract>Widget] + [StudyScaffold]o-[SingleColumnLayoutType] - [SurveyQuestionType + [StudyTestController | - +index: int; - <static>+values: List<SurveyQuestionType>; - <static>+choice: SurveyQuestionType; - <static>+bool: SurveyQuestionType; - <static>+scale: SurveyQuestionType + +authRepository: IAuthRepository; + +languageCode: String ] - [SurveyQuestionType]o-[SurveyQuestionType] - [Enum]<:--[SurveyQuestionType] + [StudyTestController]o-[<abstract>IAuthRepository] + [StudyBaseController]<:-[StudyTestController] - [ChoiceQuestionFormView + [DashboardScaffold | - +formViewModel: QuestionFormViewModel + +body: Widget | +Widget build() ] - [ChoiceQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[ChoiceQuestionFormView] + [DashboardScaffold]o-[<abstract>Widget] - [BoolQuestionFormView + [DashboardController | - +formViewModel: QuestionFormViewModel + +studyRepository: IStudyRepository; + +authRepository: IAuthRepository; + +userRepository: IUserRepository; + +router: GoRouter; + -_studiesSubscription: StreamSubscription<List<WrappedModel<Study>>>?; + +searchController: SearchController | - +Widget build() + -dynamic _subscribeStudies(); + +dynamic setSearchText(); + +dynamic setStudiesFilter(); + +dynamic onSelectStudy(); + +dynamic onClickNewStudy(); + +dynamic pinStudy(); + +dynamic pinOffStudy(); + +void filterStudies(); + +void sortStudies(); + +bool isPinned(); + +List<ModelAction<dynamic>> availableActions(); + +void dispose() ] - [BoolQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[BoolQuestionFormView] + [DashboardController]o-[<abstract>IStudyRepository] + [DashboardController]o-[<abstract>IAuthRepository] + [DashboardController]o-[<abstract>IUserRepository] + [DashboardController]o-[GoRouter] + [DashboardController]o-[StreamSubscription] + [DashboardController]o-[SearchController] + [<abstract>IModelActionProvider]<:--[DashboardController] - [<abstract>IScaleQuestionFormViewModel + [StudiesFilter | - +isMidValuesClearedInfoVisible: bool + +index: int; + <static>+values: List<StudiesFilter> ] - [ScaleQuestionFormView + [Enum]<:--[StudiesFilter] + + [StudiesTable | - +formViewModel: QuestionFormViewModel + +studies: List<Study>; + +onSelect: void Function(Study); + +getActions: List<ModelAction<dynamic>> Function(Study); + +emptyWidget: Widget; + +pinnedStudies: Iterable<String>; + +dashboardController: DashboardController; + +pinnedPredicates: int Function(Study, Study); + -_sortColumns: List<int Function(Study, Study)?> + | + +Widget build(); + -List<Widget> _buildRow() ] - [ScaleQuestionFormView]o-[QuestionFormViewModel] + [StudiesTable]o-[void Function(Study)] + [StudiesTable]o-[List<ModelAction<dynamic>> Function(Study)] + [StudiesTable]o-[<abstract>Widget] + [StudiesTable]o-[DashboardController] + [StudiesTable]o-[int Function(Study, Study)] - [<abstract>QuestionFormData - | - <static>+questionTypeFormDataFactories: Map<SurveyQuestionType, QuestionFormData Function(Question<dynamic>, List<EligibilityCriterion>)>; - +questionId: String; - +questionText: String; - +questionInfoText: String?; - +questionType: SurveyQuestionType; - +responseOptionsValidity: Map<dynamic, bool>; - +responseOptions: List<dynamic>; - +id: String + [DashboardScreen | - +Question<dynamic> toQuestion(); - +EligibilityCriterion toEligibilityCriterion(); - +Answer<dynamic> constructAnswerFor(); - +dynamic setResponseOptionsValidityFrom(); - +QuestionFormData copy() + +filter: StudiesFilter? ] - [<abstract>QuestionFormData]o-[SurveyQuestionType] - [<abstract>IFormData]<:--[<abstract>QuestionFormData] + [DashboardScreen]o-[StudiesFilter] - [ChoiceQuestionFormData - | - +isMultipleChoice: bool; - +answerOptions: List<String>; - +responseOptions: List<String> + [AccountSettingsDialog | - +Question<dynamic> toQuestion(); - +QuestionFormData copy(); - -Choice _buildChoiceForValue(); - +Answer<dynamic> constructAnswerFor() + +Widget build() ] - [<abstract>QuestionFormData]<:-[ChoiceQuestionFormData] + [<abstract>ConsumerWidget]<:-[AccountSettingsDialog] - [BoolQuestionFormData + [StudyUJobsToBeDone | - <static>+kResponseOptions: Map<String, bool>; - +responseOptions: List<String> + +Widget build() + ] + + [EmailTextField | - +Question<dynamic> toQuestion(); - +BoolQuestionFormData copy(); - +Answer<dynamic> constructAnswerFor() + +labelText: String; + +hintText: String?; + +formControlName: String?; + +formControl: FormControl<dynamic>? ] - [<abstract>QuestionFormData]<:-[BoolQuestionFormData] + [EmailTextField]o-[FormControl] - [ScaleQuestionFormData - | - +minValue: double; - +maxValue: double; - +minLabel: String?; - +maxLabel: String?; - +midValues: List<double?>; - +midLabels: List<String?>; - +stepSize: double; - +initialValue: double?; - +minColor: Color?; - +maxColor: Color?; - +responseOptions: List<double>; - +midAnnotations: List<Annotation> + [PasswordTextField | - +ScaleQuestion toQuestion(); - +QuestionFormData copy(); - +Answer<dynamic> constructAnswerFor() + +labelText: String; + +hintText: String?; + +formControlName: String?; + +formControl: FormControl<dynamic>? ] - [ScaleQuestionFormData]o-[Color] - [<abstract>QuestionFormData]<:-[ScaleQuestionFormData] + [PasswordTextField]o-[FormControl] - [QuestionFormViewModel + [SignupForm | - <static>+defaultQuestionType: SurveyQuestionType; - -_titles: Map<FormMode, String Function()>?; - +questionIdControl: FormControl<String>; - +questionTypeControl: FormControl<SurveyQuestionType>; - +questionTextControl: FormControl<String>; - +questionInfoTextControl: FormControl<String>; - +questionBaseControls: Map<String, AbstractControl<dynamic>>; - +isMultipleChoiceControl: FormControl<bool>; - +choiceResponseOptionsArray: FormArray<dynamic>; - +customOptionsMin: int; - +customOptionsMax: int; - +customOptionsInitial: int; - +boolResponseOptionsArray: FormArray<String>; - <static>+kDefaultScaleMinValue: int; - <static>+kDefaultScaleMaxValue: int; - <static>+kNumMidValueControls: int; - <static>+kMidValueDebounceMilliseconds: int; - +scaleMinValueControl: FormControl<int>; - +scaleMaxValueControl: FormControl<int>; - -_scaleRangeControl: FormControl<int>; - +scaleMinLabelControl: FormControl<String>; - +scaleMaxLabelControl: FormControl<String>; - +scaleMidValueControls: FormArray<int>; - +scaleMidLabelControls: FormArray<String?>; - -_scaleResponseOptionsArray: FormArray<int>; - +scaleMinColorControl: FormControl<SerializableColor>; - +scaleMaxColorControl: FormControl<SerializableColor>; - +prevMidValues: List<int?>?; - -_controlsByQuestionType: Map<SurveyQuestionType, FormGroup>; - -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - -_validationConfigsByQuestionType: Map<SurveyQuestionType, Map<FormValidationSetEnum, List<FormControlValidation>>>; - +form: FormGroup; - +questionId: String; - +questionType: SurveyQuestionType; - +questionTypeControlOptions: List<FormControlOption<SurveyQuestionType>>; - +answerOptionsArray: FormArray<dynamic>; - +answerOptionsControls: List<AbstractControl<dynamic>>; - +validAnswerOptions: List<String>; - +boolOptions: List<AbstractControl<String>>; - +scaleMinValue: int; - +scaleMaxValue: int; - +scaleRange: int; - +scaleAllValueControls: List<AbstractControl<int>>; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +questionTextRequired: dynamic; - +numValidChoiceOptions: dynamic; - +scaleRangeValid: dynamic; - +titles: Map<FormMode, String>; - +isAddOptionButtonVisible: bool; - +isMidValuesClearedInfoVisible: bool + +formKey: AuthFormKey | - +String? scaleMidLabelAt(); - -dynamic _onScaleRangeChanged(); - -dynamic _applyInputFormatters(); - -dynamic _updateScaleMidValueControls(); - -List<FormControlValidation> _getValidationConfig(); - +dynamic onQuestionTypeChanged(); - +dynamic onResponseOptionsChanged(); - -void _updateFormControls(); - +void initControls(); - +void setControlsFrom(); - +QuestionFormData buildFormData(); - +List<ModelAction<dynamic>> availableActions(); - +void onNewItem(); - +void onSelectItem(); - +QuestionFormViewModel createDuplicate() + +Widget build(); + -dynamic _onClickTermsOfUse(); + -dynamic _onClickPrivacyPolicy() ] - [QuestionFormViewModel]o-[SurveyQuestionType] - [QuestionFormViewModel]o-[FormControl] - [QuestionFormViewModel]o-[FormArray] - [QuestionFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[QuestionFormViewModel] - [<abstract>IListActionProvider]<:--[QuestionFormViewModel] + [SignupForm]o-[AuthFormKey] + [<abstract>FormConsumerRefWidget]<:-[SignupForm] - [SurveyQuestionFormView + [PasswordForgotForm | - +formViewModel: QuestionFormViewModel; - +isHtmlStyleable: bool + +formKey: AuthFormKey + | + +Widget build() ] - [SurveyQuestionFormView]o-[QuestionFormViewModel] + [PasswordForgotForm]o-[AuthFormKey] + [<abstract>FormConsumerRefWidget]<:-[PasswordForgotForm] - [<abstract>WithQuestionnaireControls + [AuthFormController | - +questionsArray: FormArray<dynamic>; - +questionFormViewModels: FormViewModelCollection<Q, QuestionFormData>; - +questionnaireControls: Map<String, FormArray<dynamic>>; - +propagateOnSave: bool; - +questionModels: List<Q>; - +questionTitles: Map<FormMode, String Function()> + +authRepository: IAuthRepository; + +sharedPreferences: SharedPreferences; + +notificationService: INotificationService; + +router: GoRouter; + +emailControl: FormControl<String>; + +passwordControl: FormControl<String>; + +passwordConfirmationControl: FormControl<String>; + +rememberMeControl: FormControl<bool>; + +termsOfServiceControl: FormControl<bool>; + <static>+authValidationMessages: Map<String, String Function(dynamic)>; + +loginForm: FormGroup; + +signupForm: FormGroup; + +passwordForgotForm: FormGroup; + +passwordRecoveryForm: FormGroup; + +controlValidatorsByForm: Map<AuthFormKey, Map<FormControl<dynamic>, List<Validator<dynamic>>>>; + -_formKey: AuthFormKey; + +shouldRemember: bool; + +formKey: AuthFormKey; + +form: FormGroup | - +void setQuestionnaireControlsFrom(); - +QuestionnaireFormData buildQuestionnaireFormData(); - +void read(); - +void onCancel(); - +dynamic onSave(); - +Q provide(); - +Q provideQuestionFormViewModel() + -dynamic _onChangeFormKey(); + +dynamic resetControlsFor(); + -dynamic _forceValidationMessages(); + +dynamic signUp(); + -dynamic _signUp(); + +dynamic signIn(); + -dynamic _signInWith(); + +dynamic signOut(); + +dynamic resetPasswordForEmail(); + +dynamic sendPasswordResetLink(); + +dynamic recoverPassword(); + +dynamic updateUser(); + -void _setRememberMe(); + -void _delRememberMe(); + -void _initRememberMe() ] - [<abstract>WithQuestionnaireControls]o-[FormArray] - [<abstract>WithQuestionnaireControls]o-[FormViewModelCollection] - [<abstract>IFormViewModelDelegate]<:--[<abstract>WithQuestionnaireControls] - [<abstract>IProviderArgsResolver]<:--[<abstract>WithQuestionnaireControls] + [AuthFormController]o-[<abstract>IAuthRepository] + [AuthFormController]o-[SharedPreferences] + [AuthFormController]o-[<abstract>INotificationService] + [AuthFormController]o-[GoRouter] + [AuthFormController]o-[FormControl] + [AuthFormController]o-[FormGroup] + [AuthFormController]o-[AuthFormKey] + [<abstract>IFormGroupController]<:--[AuthFormController] - [QuestionnaireFormData + [AuthFormKey | - +questionsData: List<QuestionFormData>?; - +id: String + +index: int; + <static>+values: List<AuthFormKey>; + <static>+login: AuthFormKey; + <static>+signup: AuthFormKey; + <static>+passwordForgot: AuthFormKey; + <static>+passwordRecovery: AuthFormKey; + <static>-_loginSubmit: AuthFormKey; + <static>-_signupSubmit: AuthFormKey + ] + + [AuthFormKey]o-[AuthFormKey] + [Enum]<:--[AuthFormKey] + + [AuthScaffold | - +StudyUQuestionnaire toQuestionnaire(); - +List<EligibilityCriterion> toEligibilityCriteria(); - +QuestionnaireFormData copy() + +body: Widget; + +formKey: AuthFormKey; + +leftContentMinWidth: double; + +leftPanelMinWidth: double; + +leftPanelPadding: EdgeInsets ] - [<abstract>IFormData]<:--[QuestionnaireFormData] + [AuthScaffold]o-[<abstract>Widget] + [AuthScaffold]o-[AuthFormKey] + [AuthScaffold]o-[EdgeInsets] - [<abstract>StudyDesignPageWidget + [LoginForm | - +Widget? banner() + +formKey: AuthFormKey + | + +Widget build() ] - [<abstract>StudyPageWidget]<:-[<abstract>StudyDesignPageWidget] + [LoginForm]o-[AuthFormKey] + [<abstract>FormConsumerRefWidget]<:-[LoginForm] - [StudyFormViewModel + [PasswordRecoveryForm | - +studyDirtyCopy: Study?; - +studyRepository: IStudyRepository; - +authRepository: IAuthRepository; - +router: GoRouter; - +studyInfoFormViewModel: StudyInfoFormViewModel; - +enrollmentFormViewModel: EnrollmentFormViewModel; - +measurementsFormViewModel: MeasurementsFormViewModel; - +reportsFormViewModel: ReportsFormViewModel; - +interventionsFormViewModel: InterventionsFormViewModel; - +form: FormGroup; - +isStudyReadonly: bool; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titles: Map<FormMode, String> + +formKey: AuthFormKey | - +void read(); - +void setControlsFrom(); - +Study buildFormData(); - +void dispose(); - +void onCancel(); - +dynamic onSave(); - -dynamic _applyAndSaveSubform() + +Widget build() ] - [StudyFormViewModel]o-[Study] - [StudyFormViewModel]o-[<abstract>IStudyRepository] - [StudyFormViewModel]o-[<abstract>IAuthRepository] - [StudyFormViewModel]o-[GoRouter] - [StudyFormViewModel]o-[StudyInfoFormViewModel] - [StudyFormViewModel]o-[EnrollmentFormViewModel] - [StudyFormViewModel]o-[MeasurementsFormViewModel] - [StudyFormViewModel]o-[ReportsFormViewModel] - [StudyFormViewModel]o-[InterventionsFormViewModel] - [StudyFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[StudyFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[StudyFormViewModel] + [PasswordRecoveryForm]o-[AuthFormKey] + [<abstract>FormConsumerRefWidget]<:-[PasswordRecoveryForm] - [<abstract>StudyScheduleControls + [<abstract>IAppDelegate | - <static>+defaultScheduleType: PhaseSequence; - <static>+defaultScheduleTypeSequence: String; - <static>+defaultNumCycles: int; - <static>+defaultPeriodLength: int; - +sequenceTypeControl: FormControl<PhaseSequence>; - +sequenceTypeCustomControl: FormControl<String>; - +phaseDurationControl: FormControl<int>; - +numCyclesControl: FormControl<int>; - +includeBaselineControl: FormControl<bool>; - +studyScheduleControls: Map<String, FormControl<Object>>; - <static>+kNumCyclesMin: int; - <static>+kNumCyclesMax: int; - <static>+kPhaseDurationMin: int; - <static>+kPhaseDurationMax: int; - +sequenceTypeControlOptions: List<FormControlOption<PhaseSequence>>; - +studyScheduleValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +numCyclesRange: dynamic; - +phaseDurationRange: dynamic; - +customSequenceRequired: dynamic + +dynamic onAppStart() + ] + + [AppController | - +void setStudyScheduleControlsFrom(); - +StudyScheduleFormData buildStudyScheduleFormData(); - +bool isSequencingCustom() + +sharedPreferences: SharedPreferences; + +appDelegates: List<IAppDelegate>; + -_delayedFuture: dynamic; + +isInitialized: dynamic + | + +dynamic onAppStart(); + -dynamic _callDelegates() ] - [<abstract>StudyScheduleControls]o-[PhaseSequence] - [<abstract>StudyScheduleControls]o-[FormControl] + [AppController]o-[SharedPreferences] - [StudyDesignInterventionsFormView + [<abstract>ManagedFormViewModel | - +Widget build() + +ManagedFormViewModel<T> createDuplicate() ] - [<abstract>StudyDesignPageWidget]<:-[StudyDesignInterventionsFormView] + [<abstract>FormViewModel]<:-[<abstract>ManagedFormViewModel] - [InterventionFormViewModel - | - +study: Study; - +interventionIdControl: FormControl<String>; - +interventionTitleControl: FormControl<String>; - +interventionIconControl: FormControl<IconOption>; - +interventionDescriptionControl: FormControl<String>; - +interventionTasksArray: FormArray<dynamic>; - +tasksCollection: FormViewModelCollection<InterventionTaskFormViewModel, InterventionTaskFormData>; - +form: FormGroup; - +interventionId: String; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titleRequired: dynamic; - +atLeastOneTask: dynamic; - +breadcrumbsTitle: String; - +titles: Map<FormMode, String> - | - +void setControlsFrom(); - +InterventionFormData buildFormData(); - +List<ModelAction<dynamic>> availableActions(); - +List<ModelAction<dynamic>> availablePopupActions(); - +List<ModelAction<dynamic>> availableInlineActions(); - +void onSelectItem(); - +void onNewItem(); - +void onCancel(); - +dynamic onSave(); - +InterventionTaskFormViewModel provide(); - +InterventionTaskFormRouteArgs buildNewFormRouteArgs(); - +InterventionTaskFormRouteArgs buildFormRouteArgs(); - +InterventionFormViewModel createDuplicate() + [FormViewModelNotFoundException ] - [InterventionFormViewModel]o-[Study] - [InterventionFormViewModel]o-[FormControl] - [InterventionFormViewModel]o-[FormArray] - [InterventionFormViewModel]o-[FormViewModelCollection] - [InterventionFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[InterventionFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[InterventionFormViewModel] - [<abstract>IListActionProvider]<:--[InterventionFormViewModel] - [<abstract>IProviderArgsResolver]<:--[InterventionFormViewModel] + [Exception]<:--[FormViewModelNotFoundException] - [StudyScheduleFormView + [FormViewModelCollection | - +formViewModel: StudyScheduleControls + +formViewModels: List<T>; + +formArray: FormArray<dynamic>; + +stagedViewModels: List<T>; + +retrievableViewModels: List<T>; + +formData: List<D> | - -FormTableRow _renderCustomSequence(); - +Widget build() + +void add(); + +T remove(); + +T? findWhere(); + +T? removeWhere(); + +bool contains(); + +void stage(); + +T commit(); + +void reset(); + +void read() ] - [StudyScheduleFormView]o-[<abstract>StudyScheduleControls] - [<abstract>FormConsumerWidget]<:-[StudyScheduleFormView] + [FormViewModelCollection]o-[FormArray] - [StudyScheduleFormData + [<abstract>FormValidationSetEnum + ] + + [FormControlValidation | - +sequenceType: PhaseSequence; - +sequenceTypeCustom: String; - +numCycles: int; - +phaseDuration: int; - +includeBaseline: bool; - +id: String + +control: AbstractControl<dynamic>; + +validators: List<Validator<dynamic>>; + +asyncValidators: List<AsyncValidator<dynamic>>?; + +validationMessages: Map<String, String Function(Object)> | - +StudySchedule toStudySchedule(); - +Study apply(); - +StudyScheduleFormData copy() + +FormControlValidation merge() ] - [StudyScheduleFormData]o-[PhaseSequence] - [<abstract>IStudyFormData]<:--[StudyScheduleFormData] + [FormControlValidation]o-[<abstract>AbstractControl] - [InterventionFormView - | - +formViewModel: InterventionFormViewModel + [FormInvalidException ] - [InterventionFormView]o-[InterventionFormViewModel] + [Exception]<:--[FormInvalidException] - [InterventionsFormViewModel + [FormConfigException | - +study: Study; - +router: GoRouter; - +interventionsArray: FormArray<dynamic>; - +interventionsCollection: FormViewModelCollection<InterventionFormViewModel, InterventionFormData>; - +form: FormGroup; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +interventionsRequired: dynamic; - +titles: Map<FormMode, String>; - +canTestStudySchedule: bool + +message: String? + ] + + [Exception]<:--[FormConfigException] + + [<abstract>IFormViewModelDelegate | - +void setControlsFrom(); - +InterventionsFormData buildFormData(); - +void read(); - +List<ModelAction<dynamic>> availableActions(); - +List<ModelAction<dynamic>> availablePopupActions(); - +List<ModelAction<dynamic>> availableInlineActions(); - +void onSelectItem(); - +void onNewItem(); - +InterventionFormViewModel provide(); - +void onCancel(); +dynamic onSave(); - +dynamic testStudySchedule() + +void onCancel() ] - [InterventionsFormViewModel]o-[Study] - [InterventionsFormViewModel]o-[GoRouter] - [InterventionsFormViewModel]o-[FormArray] - [InterventionsFormViewModel]o-[FormViewModelCollection] - [InterventionsFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[InterventionsFormViewModel] - [<abstract>StudyScheduleControls]<:-[InterventionsFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[InterventionsFormViewModel] - [<abstract>IListActionProvider]<:--[InterventionsFormViewModel] - [<abstract>IProviderArgsResolver]<:--[InterventionsFormViewModel] - - [InterventionTaskFormData + [<abstract>IFormGroupController | - +taskId: String; - +taskTitle: String; - +taskDescription: String?; - <static>+kDefaultTitle: String; - +id: String + +form: FormGroup + ] + + [<abstract>IFormGroupController]o-[FormGroup] + + [FormControlOption | - +CheckmarkTask toTask(); - +InterventionTaskFormData copy() + +value: T; + +label: String; + +description: String?; + +props: List<Object?> ] - [<abstract>IFormDataWithSchedule]<:-[InterventionTaskFormData] + [<abstract>Equatable]<:-[FormControlOption] - [InterventionPreview + [<abstract>FormViewModel | - +routeArgs: InterventionFormRouteArgs + -_formData: T?; + -_formMode: FormMode; + -_validationSet: FormValidationSetEnum?; + +delegate: IFormViewModelDelegate<FormViewModel<dynamic>>?; + +autosave: bool; + -_immediateFormChildrenSubscriptions: List<StreamSubscription<dynamic>>; + -_immediateFormChildrenListenerDebouncer: Debouncer?; + -_autosaveOperation: CancelableOperation<dynamic>?; + -_defaultControlValidators: Map<String, Tuple<List<Validator<dynamic>>, List<AsyncValidator<dynamic>>>>; + +prevFormValue: Map<String, dynamic>?; + <static>-_formKey: String; + +formData: T?; + +formMode: FormMode; + +isReadonly: bool; + +validationSet: FormValidationSetEnum?; + +isDirty: bool; + +title: String; + +isValid: bool; + +titles: Map<FormMode, String>; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> | - +Widget build() + -dynamic _setFormData(); + -dynamic _rememberDefaultControlValidators(); + -Tuple<List<Validator<dynamic>>, List<AsyncValidator<dynamic>>>? _getDefaultValidators(); + -dynamic _disableAllControls(); + -dynamic _formModeUpdated(); + -dynamic _restoreControlsFromFormData(); + +void revalidate(); + -void _applyValidationSet(); + +void read(); + +dynamic save(); + +dynamic cancel(); + +void enableAutosave(); + +void listenToImmediateFormChildren(); + +dynamic markFormGroupChanged(); + +void dispose(); + +void setControlsFrom(); + +T buildFormData(); + +void initControls() ] - [InterventionPreview]o-[InterventionFormRouteArgs] - [<abstract>ConsumerWidget]<:-[InterventionPreview] + [<abstract>FormViewModel]o-[FormMode] + [<abstract>FormViewModel]o-[<abstract>FormValidationSetEnum] + [<abstract>FormViewModel]o-[<abstract>IFormViewModelDelegate] + [<abstract>FormViewModel]o-[Debouncer] + [<abstract>FormViewModel]o-[CancelableOperation] + [<abstract>IFormGroupController]<:--[<abstract>FormViewModel] - [InterventionTaskFormView + [FormMode | - +formViewModel: InterventionTaskFormViewModel + +index: int; + <static>+values: List<FormMode>; + <static>+create: FormMode; + <static>+readonly: FormMode; + <static>+edit: FormMode ] - [InterventionTaskFormView]o-[InterventionTaskFormViewModel] + [FormMode]o-[FormMode] + [Enum]<:--[FormMode] - [InterventionsFormData + [CustomFormControl + | + -_onValueChangedDebouncer: Debouncer?; + -_onStatusChangedDebouncer: Debouncer?; + +onValueChanged: void Function(T?)?; + +onStatusChanged: void Function(ControlStatus)?; + +onStatusChangedDebounceTime: int?; + +onValueChangedDebounceTime: int? + | + +void dispose() + ] + + [CustomFormControl]o-[Debouncer] + [CustomFormControl]o-[void Function(T?)?] + [CustomFormControl]o-[void Function(ControlStatus)?] + [FormControl]<:-[CustomFormControl] + + [<abstract>IFormData | - +interventionsData: List<InterventionFormData>; - +studyScheduleData: StudyScheduleFormData; +id: String | - +Study apply(); - +InterventionsFormData copy() + +IFormData copy() ] - [InterventionsFormData]o-[StudyScheduleFormData] - [<abstract>IStudyFormData]<:--[InterventionsFormData] + [UnsavedChangesDialog + | + +Widget build() + ] - [InterventionTaskFormViewModel + [FormArrayTable | - +taskIdControl: FormControl<String>; - +instanceIdControl: FormControl<String>; - +taskTitleControl: FormControl<String>; - +taskDescriptionControl: FormControl<String>; - +markAsCompletedControl: FormControl<bool>; - +form: FormGroup; - +taskId: String; - +instanceId: String; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titleRequired: dynamic; - +titles: Map<FormMode, String> + +control: AbstractControl<dynamic>; + +items: List<T>; + +onSelectItem: void Function(T); + +getActionsAt: List<ModelAction<dynamic>> Function(T, int); + +onNewItem: void Function()?; + +rowTitle: String Function(T); + +onNewItemLabel: String; + +sectionTitle: String?; + +sectionDescription: String?; + +emptyIcon: IconData?; + +emptyTitle: String?; + +emptyDescription: String?; + +sectionTitleDivider: bool?; + +rowPrefix: Widget Function(BuildContext, T, int)?; + +rowSuffix: Widget Function(BuildContext, T, int)?; + +leadingWidget: Widget?; + +itemsSectionPadding: EdgeInsets?; + +hideLeadingTrailingWhenEmpty: bool; + <static>+columns: List<StandardTableColumn> | - +void setControlsFrom(); - +InterventionTaskFormData buildFormData(); - +InterventionTaskFormViewModel createDuplicate() + +Widget build(); + -List<Widget> _buildRow(); + -Widget _newItemButton() ] - [InterventionTaskFormViewModel]o-[FormControl] - [InterventionTaskFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[InterventionTaskFormViewModel] - [<abstract>WithScheduleControls]<:-[InterventionTaskFormViewModel] + [FormArrayTable]o-[<abstract>AbstractControl] + [FormArrayTable]o-[void Function(T)] + [FormArrayTable]o-[List<ModelAction<dynamic>> Function(T, int)] + [FormArrayTable]o-[void Function()?] + [FormArrayTable]o-[String Function(T)] + [FormArrayTable]o-[IconData] + [FormArrayTable]o-[Widget Function(BuildContext, T, int)?] + [FormArrayTable]o-[<abstract>Widget] + [FormArrayTable]o-[EdgeInsets] - [InterventionFormData - | - +interventionId: String; - +title: String; - +description: String?; - +tasksData: List<InterventionTaskFormData>?; - +iconName: String?; - <static>+kDefaultTitle: String; - +id: String - | - +Intervention toIntervention(); - +InterventionFormData copy() + [App ] - [<abstract>IFormData]<:-[InterventionFormData] + [AppContent + ] - [AccountSettingsDialog + [StudyMonitorScreen | +Widget build() ] - [<abstract>ConsumerWidget]<:-[AccountSettingsDialog] + [<abstract>StudyPageWidget]<:-[StudyMonitorScreen] - [AppStatus + [DrawerEntry | - +index: int; - <static>+values: List<AppStatus>; - <static>+initializing: AppStatus; - <static>+initialized: AppStatus + +localizedTitle: String Function(); + +icon: IconData?; + +localizedHelpText: String Function()?; + +enabled: bool; + +onSelected: void Function(BuildContext, WidgetRef)?; + +title: String; + +helpText: String? + | + +void onClick() ] - [AppStatus]o-[AppStatus] - [Enum]<:--[AppStatus] + [DrawerEntry]o-[String Function()] + [DrawerEntry]o-[IconData] + [DrawerEntry]o-[String Function()?] + [DrawerEntry]o-[void Function(BuildContext, WidgetRef)?] - [<abstract>IAppDelegate + [GoRouterDrawerEntry | - +dynamic onAppStart() + +intent: RoutingIntent + | + +void onClick() ] - [AppController - | - +sharedPreferences: SharedPreferences; - +appDelegates: List<IAppDelegate>; - -_delayedFuture: dynamic; - +isInitialized: dynamic + [GoRouterDrawerEntry]o-[RoutingIntent] + [DrawerEntry]<:-[GoRouterDrawerEntry] + + [AppDrawer | - +dynamic onAppStart(); - -dynamic _callDelegates() + +title: String; + +width: int; + +leftPaddingEntries: double; + +logoPaddingVertical: double; + +logoPaddingHorizontal: double; + +logoMaxHeight: double; + +logoSectionMinHeight: double; + +logoSectionMaxHeight: double ] - [AppController]o-[SharedPreferences] - - + - - + + + + + + + + + + + + - + - + - + - + - + - + - + - + + + - + - - - + - + - - - + + + + - + + + + - + - + + + - + - + - + - + - - - - + - - + - + - + - + - - - + + - + + - + - + - + - + + + - - - - + - - + - + - - - + - + - + - + - + - + - - + + + + - + - + - + - - - - + + + - - - + + - + - + - + - + + + - + - + + + - + - + + + - + - + - - + + - - - - + - - - - - - - - + - + - + - + - + - + - + + + + + - + - + - + - + - + - + - + - + - + - - - + + + + - + + + + + + + + + + - + - + + + + + + + + + - + - + - + - + - + - + - + - + - + - - - + - + - - - - - + - + - + - + - - + + - + - - - - + + + - + + - + - + - + - - - + + - - - + + + + + + + + + + + + + - + + - + - + + + + + - + - + - + - - - + - + - - - + + + - + - - - + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + + + - - - - + - - + + + - + - + - + - + - + - - - - - - - - - - - - + + - + + + + + + - - + - - - - + + + - + + - + - + - + - + - + - - - + + + + + + - + + + + - + - + - + - - - - - - - - + - + + - + - + - + - + + + - + - - - + + + + - + + - + - - - - - + + + - + - + + + - + - + - + - - - - - + - + - + - + - + - + - + - + - - - - - + - + - - - + + + + + + - - - + + + - - - + + + - + + - + - + - + - - - - - + + - - - + + + - - - - - - - + + + - - - + + + - + + - + - - - + - + - + - + - + - - + + - + - + - + - - - - - - - - - + - + - + - + - + - + - - - + + + + - + + - + - - - + - - - + + + + + + + + - - - + + + + + + + + + - - + - - + + - + - + + + - + - + + + - + - - - - - - - - + + + + + - - - + + + + + + + - - + - - + + - + - - - + - + - - - + - + - - + + + - - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - - - + + + + + + - - + + + - + - + - + + + + + + + + + + + - + - + - + - + - + - - + + - + - + + + - + - + + + - + - - - - - + - + - + - + - + - + - + - + - - - + + + + - - - + + + - - - + + + + - + - - + + + + + + - + - - - + - + - + - + - + - + - - - + + + - + - - - - - - - + - + - - + + + - - - - + - + - + - + - - - - - + - + - + - + - - + + + - - + - + - + - + - - - + - + - - - + - + - - + + - + - - + + - + - + - + - + - + - + + + - + - + + + - + - + - + - + - - - - - - - - + - + + + + - + - + - + - - + + - + - + - + - - + + + - - - + + + - - - + + + - - + + + - + - + - + - + - + - + - + - - + + + - - + - + - - - + - + - + - - + + + + + + - + - - - + - + - - - + - + - + - + - - + + + - - - - - - + - + - - - + + + - + - + - + - + - + - + + + - + - - - - + + + + + - - + - + - + - + - + - + - - + + + - - - + + + + + + + - - + - - - - + + - + - - - + + - + + - + - + - + - + - + - + - + - + + + - + - + + + - + + + + + + - + + - + - + - + - - - + - - - - + + + - + + - + - - - + + + - + - + - + - + - + - + - + - + - - - - - - + - - - - - - - - - - - + - - - + + - + - + - - + + - + - + - + - + - + - + + + - + - + - + - + - + - - - - - - - - - - - - - - - - - - - + - + - - - + - + - + - - - - + - - + - + - + - + - - - - - - - - - + - + - - + + + + + - - + - + - - - - - - - - - DrawerEntry - - - - - - +localizedTitle: String Function() - +icon: IconData? - +localizedHelpText: String Function()? - +enabled: bool - +onSelected: void Function(BuildContext, WidgetRef)? - +title: String - +helpText: String? - - - - - - +void onClick() - - - + + + - - - - - - - String Function() - - - + + + - - - - - - - IconData - - - + + + - - - + + + + + + - - - String Function()? + + + PublishConfirmationDialog - - - - - - - - void Function(BuildContext, WidgetRef)? + + + +Widget build() - - - - - - - - - GoRouterDrawerEntry - - + + + + + - - - +intent: RoutingIntent + + + StudyPageWidget - - - +void onClick() + + + +studyId: String - - - - - - - - RoutingIntent + + + +Widget? banner() - - - - + + + + - - - AppDrawer + + + PublishSuccessDialog - - - +title: String - +width: int - +leftPaddingEntries: double - +logoPaddingVertical: double - +logoPaddingHorizontal: double - +logoMaxHeight: double - +logoSectionMinHeight: double - +logoSectionMaxHeight: double + + + +Widget build() - - - - - - - - - DashboardController - - + + + + - - - +studyRepository: IStudyRepository - +authRepository: IAuthRepository - +userRepository: IUserRepository - +router: GoRouter - -_studiesSubscription: StreamSubscription<List<WrappedModel<Study>>>? - +searchController: SearchController + + + PublishDialog - - - -dynamic _subscribeStudies() - +dynamic setSearchText() - +dynamic setStudiesFilter() - +dynamic onSelectStudy() - +dynamic onClickNewStudy() - +dynamic pinStudy() - +dynamic pinOffStudy() - +void filterStudies() - +void sortStudies() - +bool isPinned() - +List<ModelAction<dynamic>> availableActions() - +void dispose() + + + +Widget build() - - - + + + + - - - IStudyRepository + + + StudyAnalyzeScreen - - - - - - - - IAuthRepository + + + +Widget? banner() + +Widget build() - - - + + + + - - - IUserRepository + + + StudyAnalyzeController - - - - - - - - GoRouter + + + +dynamic onExport() - - - + + + + + - - - StreamSubscription + + + StudyBaseController - - - - - - - - SearchController + + + +studyId: String + +studyRepository: IStudyRepository + +router: GoRouter + +studySubscription: StreamSubscription<WrappedModel<Study>>? - - - - - - - - IModelActionProvider + + + +dynamic subscribeStudy() + +dynamic onStudySubscriptionUpdate() + +dynamic onStudySubscriptionError() + +void dispose() - - - - - - - - - StudiesTable - - - - - - +studies: List<Study> - +onSelect: void Function(Study) - +getActions: List<ModelAction<dynamic>> Function(Study) - +emptyWidget: Widget - +pinnedStudies: Iterable<String> - +dashboardController: DashboardController - +pinnedPredicates: int Function(Study, Study) - -_sortColumns: List<int Function(Study, Study)?> - - + + + + + - - - +Widget build() - -List<Widget> _buildRow() + + + InviteCodeFormViewModel - - - - - - - - void Function(Study) + + + +study: Study + +inviteCodeRepository: IInviteCodeRepository + +codeControl: FormControl<String> + +codeControlValidationMessages: Map<String, String Function(dynamic)> + +isPreconfiguredScheduleControl: FormControl<bool> + +preconfiguredScheduleTypeControl: FormControl<PhaseSequence> + +interventionAControl: FormControl<String> + +interventionBControl: FormControl<String> + +form: FormGroup + +titles: Map<FormMode, String> + +interventionControlOptions: List<FormControlOption<String>> + +preconfiguredScheduleTypeOptions: List<FormControlOption<PhaseSequence>> + +isPreconfiguredSchedule: bool + +preconfiguredSchedule: List<String>? - - - - - - - - List<ModelAction<dynamic>> Function(Study) + + + +void initControls() + -dynamic _uniqueInviteCode() + +void regenerateCode() + -String _generateCode() + +StudyInvite buildFormData() + +void setControlsFrom() + +dynamic save() - - - + + + - - - Widget + + + Study - - - + + + - - - int Function(Study, Study) + + + IInviteCodeRepository - - - - - + + + - - - DashboardScaffold + + + FormControl - - - +body: Widget - - + + + + - - - +Widget build() + + + FormGroup - - - - + + + + + - - - StudiesFilter + + + FormViewModel - - - +index: int - <static>+values: List<StudiesFilter> + + + -_formData: T? + -_formMode: FormMode + -_validationSet: FormValidationSetEnum? + +delegate: IFormViewModelDelegate<FormViewModel<dynamic>>? + +autosave: bool + -_immediateFormChildrenSubscriptions: List<StreamSubscription<dynamic>> + -_immediateFormChildrenListenerDebouncer: Debouncer? + -_autosaveOperation: CancelableOperation<dynamic>? + -_defaultControlValidators: Map<String, Tuple<List<Validator<dynamic>>, List<AsyncValidator<dynamic>>>> + +prevFormValue: Map<String, dynamic>? + <static>-_formKey: String + +formData: T? + +formMode: FormMode + +isReadonly: bool + +validationSet: FormValidationSetEnum? + +isDirty: bool + +title: String + +isValid: bool + +titles: Map<FormMode, String> + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - - - - - - - - Enum + + + -dynamic _setFormData() + -dynamic _rememberDefaultControlValidators() + -Tuple<List<Validator<dynamic>>, List<AsyncValidator<dynamic>>>? _getDefaultValidators() + -dynamic _disableAllControls() + -dynamic _formModeUpdated() + -dynamic _restoreControlsFromFormData() + +void revalidate() + -void _applyValidationSet() + +void read() + +dynamic save() + +dynamic cancel() + +void enableAutosave() + +void listenToImmediateFormChildren() + +dynamic markFormGroupChanged() + +void dispose() + +void setControlsFrom() + +T buildFormData() + +void initControls() - - - - - - - - DashboardScreen - - + + + + + - - - +filter: StudiesFilter? + + + StudyRecruitController - - - - - - - - - StudyMonitorScreen + + + +inviteCodeRepository: IInviteCodeRepository + -_invitesSubscription: StreamSubscription<List<WrappedModel<StudyInvite>>>? - - - +Widget build() + + + -dynamic _subscribeInvites() + +Intervention? getIntervention() + +int getParticipantCountForInvite() + +List<ModelAction<dynamic>> availableActions() + +List<ModelAction<dynamic>> availableInlineActions() + +void dispose() - - - - - + + + - - - StudyPageWidget + + + StreamSubscription - - - +studyId: String - - + + + + - - - +Widget? banner() + + + IModelActionProvider - - - - - + + + + + - - - CustomFormControl + + + EnrolledBadge - - - -_onValueChangedDebouncer: Debouncer? - -_onStatusChangedDebouncer: Debouncer? - +onValueChanged: void Function(T?)? - +onStatusChanged: void Function(ControlStatus)? - +onStatusChangedDebounceTime: int? - +onValueChangedDebounceTime: int? + + + +enrolledCount: int - - - +void dispose() + + + +Widget build() - - - + + + + - - - Debouncer + + + StudyRecruitScreen - - - - - - - - void Function(T?)? + + + +Widget build() + -Widget _inviteCodesSectionHeader() + -Widget _newInviteCodeButton() + -dynamic _onSelectInvite() - - - + + + + + - - - void Function(ControlStatus)? + + + InviteCodeFormView - - - - - - - - FormControl + + + +formViewModel: InviteCodeFormViewModel - - - - - - - - FormInvalidException + + + +Widget build() + -List<FormTableRow> _conditionalInterventionRows() - - - + + + - - - Exception + + + FormConsumerWidget - - - - + + + + + - - - FormConfigException + + + StudyInvitesTable - - - +message: String? + + + +invites: List<StudyInvite> + +onSelect: void Function(StudyInvite) + +getActions: List<ModelAction<dynamic>> Function(StudyInvite) + +getInlineActions: List<ModelAction<dynamic>> Function(StudyInvite) + +getIntervention: Intervention? Function(String) + +getParticipantCountForInvite: int Function(StudyInvite) - - - - - - - - - IFormViewModelDelegate + + + +Widget build() + -List<Widget> _buildRow() - - - +dynamic onSave() - +void onCancel() + + + + + + + + void Function(StudyInvite) - - - - + + + - - - IFormGroupController + + + List<ModelAction<dynamic>> Function(StudyInvite) - - - +form: FormGroup + + + + + + + + Intervention? Function(String) - - - + + + - - - FormGroup + + + int Function(StudyInvite) - - - - + + + + - - - FormControlOption + + + AppStatus - - - +value: T - +label: String - +description: String? - +props: List<Object?> + + + +index: int + <static>+values: List<AppStatus> + <static>+initializing: AppStatus + <static>+initialized: AppStatus - - - + + + - - - Equatable + + + Enum - - - - - + + + + + - - - FormViewModel + + + StudyFormScaffold - - - -_formData: T? - -_formMode: FormMode - -_validationSet: FormValidationSetEnum? - +delegate: IFormViewModelDelegate<FormViewModel<dynamic>>? - +autosave: bool - -_immediateFormChildrenSubscriptions: List<StreamSubscription<dynamic>> - -_immediateFormChildrenListenerDebouncer: Debouncer? - -_autosaveOperation: CancelableOperation<dynamic>? - -_defaultControlValidators: Map<String, Tuple<List<Validator<dynamic>>, List<AsyncValidator<dynamic>>>> - +prevFormValue: Map<String, dynamic>? - <static>-_formKey: String - +formData: T? - +formMode: FormMode - +isReadonly: bool - +validationSet: FormValidationSetEnum? - +isDirty: bool - +title: String - +isValid: bool - +titles: Map<FormMode, String> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + + + +studyId: String + +formViewModelBuilder: T Function(WidgetRef) + +formViewBuilder: Widget Function(T) - - - -dynamic _setFormData() - -dynamic _rememberDefaultControlValidators() - -Tuple<List<Validator<dynamic>>, List<AsyncValidator<dynamic>>>? _getDefaultValidators() - -dynamic _disableAllControls() - -dynamic _formModeUpdated() - -dynamic _restoreControlsFromFormData() - +void revalidate() - -void _applyValidationSet() - +void read() - +dynamic save() - +dynamic cancel() - +void enableAutosave() - +void listenToImmediateFormChildren() - +dynamic markFormGroupChanged() - +void dispose() - +void setControlsFrom() - +T buildFormData() - +void initControls() + + + +Widget build() - - - - + + + - - - FormMode + + + T Function(WidgetRef) - - - +index: int - <static>+values: List<FormMode> - <static>+create: FormMode - <static>+readonly: FormMode - <static>+edit: FormMode + + + + + + + + Widget Function(T) - - - + + + - - - FormValidationSetEnum + + + ConsumerWidget - - - + + + + + - - - CancelableOperation + + + InterventionsFormViewModel - - - - - + + + +study: Study + +router: GoRouter + +interventionsArray: FormArray<dynamic> + +interventionsCollection: FormViewModelCollection<InterventionFormViewModel, InterventionFormData> + +form: FormGroup + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +interventionsRequired: dynamic + +titles: Map<FormMode, String> + +canTestStudySchedule: bool + + - - - ManagedFormViewModel + + + +void setControlsFrom() + +InterventionsFormData buildFormData() + +void read() + +List<ModelAction<dynamic>> availableActions() + +List<ModelAction<dynamic>> availablePopupActions() + +List<ModelAction<dynamic>> availableInlineActions() + +void onSelectItem() + +void onNewItem() + +InterventionFormViewModel provide() + +void onCancel() + +dynamic onSave() + +dynamic testStudySchedule() - - - +ManagedFormViewModel<T> createDuplicate() + + + + + + + + GoRouter - - - + + + - - - FormViewModelNotFoundException + + + FormArray - - - + + + - + FormViewModelCollection - + +formViewModels: List<T> +formArray: FormArray<dynamic> @@ -4209,7 +4099,7 @@ - + +void add() +T remove() @@ -4224,1931 +4114,2149 @@ - - - + + + + + + + + + StudyScheduleControls + + + + + + <static>+defaultScheduleType: PhaseSequence + <static>+defaultScheduleTypeSequence: String + <static>+defaultNumCycles: int + <static>+defaultPeriodLength: int + +sequenceTypeControl: FormControl<PhaseSequence> + +sequenceTypeCustomControl: FormControl<String> + +phaseDurationControl: FormControl<int> + +numCyclesControl: FormControl<int> + +includeBaselineControl: FormControl<bool> + +studyScheduleControls: Map<String, FormControl<Object>> + <static>+kNumCyclesMin: int + <static>+kNumCyclesMax: int + <static>+kPhaseDurationMin: int + <static>+kPhaseDurationMax: int + +sequenceTypeControlOptions: List<FormControlOption<PhaseSequence>> + +studyScheduleValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +numCyclesRange: dynamic + +phaseDurationRange: dynamic + +customSequenceRequired: dynamic + + + + + + +void setStudyScheduleControlsFrom() + +StudyScheduleFormData buildStudyScheduleFormData() + +bool isSequencingCustom() + + + + + + + + + + + + IFormViewModelDelegate + + + + + + +dynamic onSave() + +void onCancel() + + + + + + + + + + + IListActionProvider + + + + + + + - - - FormArray + + + IProviderArgsResolver - - - - + + + + - - - UnsavedChangesDialog + + + InterventionTaskFormView - - - +Widget build() + + + +formViewModel: InterventionTaskFormViewModel - - - - - + + + + + - - - IFormData + + + InterventionTaskFormViewModel - - - +id: String + + + +taskIdControl: FormControl<String> + +instanceIdControl: FormControl<String> + +taskTitleControl: FormControl<String> + +taskDescriptionControl: FormControl<String> + +markAsCompletedControl: FormControl<bool> + +form: FormGroup + +taskId: String + +instanceId: String + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titleRequired: dynamic + +titles: Map<FormMode, String> - - - +IFormData copy() + + + +void setControlsFrom() + +InterventionTaskFormData buildFormData() + +InterventionTaskFormViewModel createDuplicate() - - - - - - - - - FormArrayTable - - + + + + + - - - +control: AbstractControl<dynamic> - +items: List<T> - +onSelectItem: void Function(T) - +getActionsAt: List<ModelAction<dynamic>> Function(T, int) - +onNewItem: void Function()? - +rowTitle: String Function(T) - +onNewItemLabel: String - +sectionTitle: String? - +sectionDescription: String? - +emptyIcon: IconData? - +emptyTitle: String? - +emptyDescription: String? - +sectionTitleDivider: bool? - +rowPrefix: Widget Function(BuildContext, T, int)? - +rowSuffix: Widget Function(BuildContext, T, int)? - +leadingWidget: Widget? - +itemsSectionPadding: EdgeInsets? - +hideLeadingTrailingWhenEmpty: bool - <static>+columns: List<StandardTableColumn> + + + InterventionPreview - - - +Widget build() - -List<Widget> _buildRow() - -Widget _newItemButton() + + + +routeArgs: InterventionFormRouteArgs - - - - - - - - AbstractControl + + + +Widget build() - - - + + + - - - void Function(T) + + + InterventionFormRouteArgs - - - + + + + + - - - List<ModelAction<dynamic>> Function(T, int) + + + StudyScheduleFormView - - - - - - - - void Function()? + + + +formViewModel: StudyScheduleControls - - - - - - - - String Function(T) + + + -FormTableRow _renderCustomSequence() + +Widget build() - - - + + + + - - - Widget Function(BuildContext, T, int)? + + + InterventionFormView - - - - - - - - EdgeInsets + + + +formViewModel: InterventionFormViewModel - - - - - + + + + + - - - FormControlValidation + + + InterventionFormViewModel - - - +control: AbstractControl<dynamic> - +validators: List<Validator<dynamic>> - +asyncValidators: List<AsyncValidator<dynamic>>? - +validationMessages: Map<String, String Function(Object)> + + + +study: Study + +interventionIdControl: FormControl<String> + +interventionTitleControl: FormControl<String> + +interventionIconControl: FormControl<IconOption> + +interventionDescriptionControl: FormControl<String> + +interventionTasksArray: FormArray<dynamic> + +tasksCollection: FormViewModelCollection<InterventionTaskFormViewModel, InterventionTaskFormData> + +form: FormGroup + +interventionId: String + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titleRequired: dynamic + +atLeastOneTask: dynamic + +breadcrumbsTitle: String + +titles: Map<FormMode, String> - - - +FormControlValidation merge() + + + +void setControlsFrom() + +InterventionFormData buildFormData() + +List<ModelAction<dynamic>> availableActions() + +List<ModelAction<dynamic>> availablePopupActions() + +List<ModelAction<dynamic>> availableInlineActions() + +void onSelectItem() + +void onNewItem() + +void onCancel() + +dynamic onSave() + +InterventionTaskFormViewModel provide() + +InterventionTaskFormRouteArgs buildNewFormRouteArgs() + +InterventionTaskFormRouteArgs buildFormRouteArgs() + +InterventionFormViewModel createDuplicate() - - - - - + + + + + - - - InviteCodeFormViewModel + + + InterventionFormData - - - +study: Study - +inviteCodeRepository: IInviteCodeRepository - +codeControl: FormControl<String> - +codeControlValidationMessages: Map<String, String Function(dynamic)> - +isPreconfiguredScheduleControl: FormControl<bool> - +preconfiguredScheduleTypeControl: FormControl<PhaseSequence> - +interventionAControl: FormControl<String> - +interventionBControl: FormControl<String> - +form: FormGroup - +titles: Map<FormMode, String> - +interventionControlOptions: List<FormControlOption<String>> - +preconfiguredScheduleTypeOptions: List<FormControlOption<PhaseSequence>> - +isPreconfiguredSchedule: bool - +preconfiguredSchedule: List<String>? + + + +interventionId: String + +title: String + +description: String? + +tasksData: List<InterventionTaskFormData>? + +iconName: String? + <static>+kDefaultTitle: String + +id: String - - - +void initControls() - -dynamic _uniqueInviteCode() - +void regenerateCode() - -String _generateCode() - +StudyInvite buildFormData() - +void setControlsFrom() - +dynamic save() + + + +Intervention toIntervention() + +InterventionFormData copy() - - - + + + + + - - - Study + + + IFormData - - - - + + + +id: String + + - - - IInviteCodeRepository + + + +IFormData copy() - - - - - + + + + + - - - EnrolledBadge + + + StudyScheduleFormData - - - +enrolledCount: int + + + +sequenceType: PhaseSequence + +sequenceTypeCustom: String + +numCycles: int + +phaseDuration: int + +includeBaseline: bool + +id: String - - - +Widget build() + + + +StudySchedule toStudySchedule() + +Study apply() + +StudyScheduleFormData copy() - - - - - + + + - - - InviteCodeFormView + + + PhaseSequence - - - +formViewModel: InviteCodeFormViewModel - - + + + + + - - - +Widget build() - -List<FormTableRow> _conditionalInterventionRows() + + + IStudyFormData - - - - - - - - FormConsumerWidget + + + +Study apply() - - - - + + + + - - - StudyRecruitScreen + + + ManagedFormViewModel - - - +Widget build() - -Widget _inviteCodesSectionHeader() - -Widget _newInviteCodeButton() - -dynamic _onSelectInvite() + + + +ManagedFormViewModel<T> createDuplicate() - - - - - + + + + + - - - StudyRecruitController + + + WithScheduleControls - - - +inviteCodeRepository: IInviteCodeRepository - -_invitesSubscription: StreamSubscription<List<WrappedModel<StudyInvite>>>? + + + +isTimeRestrictedControl: FormControl<bool> + +instanceID: FormControl<String> + +restrictedTimeStartControl: FormControl<Time> + +restrictedTimeStartPickerControl: FormControl<TimeOfDay> + +restrictedTimeEndControl: FormControl<Time> + +restrictedTimeEndPickerControl: FormControl<TimeOfDay> + +hasReminderControl: FormControl<bool> + +reminderTimeControl: FormControl<Time> + +reminderTimePickerControl: FormControl<TimeOfDay> + -_reminderControlStream: StreamSubscription<dynamic>? + +scheduleFormControls: Map<String, FormControl<Object>> + +hasReminder: bool + +isTimeRestricted: bool + +timeRestriction: List<Time>? - - - -dynamic _subscribeInvites() - +Intervention? getIntervention() - +int getParticipantCountForInvite() - +List<ModelAction<dynamic>> availableActions() - +List<ModelAction<dynamic>> availableInlineActions() - +void dispose() + + + +void setScheduleControlsFrom() + -dynamic _initReminderControl() - - - - - + + + + + - - - StudyBaseController + + + InterventionsFormData - - - +studyId: String - +studyRepository: IStudyRepository - +router: GoRouter - +studySubscription: StreamSubscription<WrappedModel<Study>>? + + + +interventionsData: List<InterventionFormData> + +studyScheduleData: StudyScheduleFormData + +id: String - - - +dynamic subscribeStudy() - +dynamic onStudySubscriptionUpdate() - +dynamic onStudySubscriptionError() - +void dispose() + + + +Study apply() + +InterventionsFormData copy() - - - - - + + + + - - - StudyInvitesTable + + + StudyDesignInterventionsFormView - - - +invites: List<StudyInvite> - +onSelect: void Function(StudyInvite) - +getActions: List<ModelAction<dynamic>> Function(StudyInvite) - +getInlineActions: List<ModelAction<dynamic>> Function(StudyInvite) - +getIntervention: Intervention? Function(String) - +getParticipantCountForInvite: int Function(StudyInvite) + + + +Widget build() - - - +Widget build() - -List<Widget> _buildRow() + + + + + + + + + StudyDesignPageWidget - - - - - - - - void Function(StudyInvite) + + + +Widget? banner() - - - + + + + + - - - List<ModelAction<dynamic>> Function(StudyInvite) + + + InterventionTaskFormData - - - - + + + +taskId: String + +taskTitle: String + +taskDescription: String? + <static>+kDefaultTitle: String + +id: String + + - - - Intervention? Function(String) + + + +CheckmarkTask toTask() + +InterventionTaskFormData copy() - - - + + + + + - - - int Function(StudyInvite) + + + IFormDataWithSchedule - - - - - - - - - AuthScaffold + + + +instanceId: String + +isTimeLocked: bool + +timeLockStart: StudyUTimeOfDay? + +timeLockEnd: StudyUTimeOfDay? + +hasReminder: bool + +reminderTime: StudyUTimeOfDay? - - - +body: Widget - +formKey: AuthFormKey - +leftContentMinWidth: double - +leftPanelMinWidth: double - +leftPanelPadding: EdgeInsets + + + +Schedule toSchedule() - - - - + + + + + - - - AuthFormKey + + + ReportBadge - - - +index: int - <static>+values: List<AuthFormKey> - <static>+login: AuthFormKey - <static>+signup: AuthFormKey - <static>+passwordForgot: AuthFormKey - <static>+passwordRecovery: AuthFormKey - <static>-_loginSubmit: AuthFormKey - <static>-_signupSubmit: AuthFormKey + + + +status: ReportStatus? + +type: BadgeType + +showPrefixIcon: bool + +showTooltip: bool - - - - - - - - - - SignupForm + + + +Widget build() - - - +formKey: AuthFormKey + + + + + + + + + ReportStatus - - - +Widget build() - -dynamic _onClickTermsOfUse() - -dynamic _onClickPrivacyPolicy() + + + +index: int + <static>+values: List<ReportStatus> + <static>+primary: ReportStatus + <static>+secondary: ReportStatus - - - + + + - - - FormConsumerRefWidget + + + BadgeType - - - - - + + + + + - - - PasswordRecoveryForm + + + ReportsFormViewModel - - - +formKey: AuthFormKey + + + +study: Study + +router: GoRouter + +reportItemDelegate: ReportFormItemDelegate + +reportItemArray: FormArray<dynamic> + +reportItemFormViewModels: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData> + +form: FormGroup + +reportItemModels: List<ReportItemFormViewModel> + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titles: Map<FormMode, String> + +canTestConsent: bool - - - +Widget build() + + + +void setControlsFrom() + +ReportsFormData buildFormData() + +void read() + +ReportItemFormRouteArgs buildNewReportItemFormRouteArgs() + +ReportItemFormRouteArgs buildReportItemFormRouteArgs() + +dynamic testReport() + +void onCancel() + +dynamic onSave() + +ReportItemFormViewModel provide() - - - - - + + + + + - - - PasswordForgotForm + + + ReportFormItemDelegate - - - +formKey: AuthFormKey + + + +formViewModelCollection: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData> + +owner: ReportsFormViewModel + +propagateOnSave: bool + +validationSet: dynamic - - - +Widget build() + + + +void onCancel() + +dynamic onSave() + +ReportItemFormViewModel provide() + +List<ModelAction<dynamic>> availableActions() + +void onNewItem() + +void onSelectItem() - - - - - + + + + - - - AuthFormController + + + StudyDesignReportsFormView - - - +authRepository: IAuthRepository - +sharedPreferences: SharedPreferences - +notificationService: INotificationService - +router: GoRouter - +emailControl: FormControl<String> - +passwordControl: FormControl<String> - +passwordConfirmationControl: FormControl<String> - +rememberMeControl: FormControl<bool> - +termsOfServiceControl: FormControl<bool> - <static>+authValidationMessages: Map<String, String Function(dynamic)> - +loginForm: FormGroup - +signupForm: FormGroup - +passwordForgotForm: FormGroup - +passwordRecoveryForm: FormGroup - +controlValidatorsByForm: Map<AuthFormKey, Map<FormControl<dynamic>, List<Validator<dynamic>>>> - -_formKey: AuthFormKey - +shouldRemember: bool - +formKey: AuthFormKey - +form: FormGroup + + + +Widget build() + -dynamic _showReportItemSidesheetWithArgs() - - - -dynamic _onChangeFormKey() - +dynamic resetControlsFor() - -dynamic _forceValidationMessages() - +dynamic signUp() - -dynamic _signUp() - +dynamic signIn() - -dynamic _signInWith() - +dynamic signOut() - +dynamic resetPasswordForEmail() - +dynamic sendPasswordResetLink() - +dynamic recoverPassword() - +dynamic updateUser() - -void _setRememberMe() - -void _delRememberMe() - -void _initRememberMe() + + + + + + + + + + ReportsFormData - - - - + + + +reportItems: List<ReportItemFormData> + +id: String + + - - - SharedPreferences + + + +Study apply() + +ReportsFormData copy() - - - + + + + + - - - INotificationService + + + ReportItemFormViewModel - - - - - - - - - EmailTextField + + + <static>+defaultSectionType: ReportSectionType + +sectionIdControl: FormControl<String> + +sectionTypeControl: FormControl<ReportSectionType> + +titleControl: FormControl<String> + +descriptionControl: FormControl<String> + +sectionControl: FormControl<ReportSection> + +dataReferenceControl: FormControl<DataReferenceIdentifier<num>> + +temporalAggregationControl: FormControl<TemporalAggregationFormatted> + +improvementDirectionControl: FormControl<ImprovementDirectionFormatted> + +alphaControl: FormControl<double> + -_controlsBySectionType: Map<ReportSectionType, FormGroup> + -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + -_validationConfigsBySectionType: Map<ReportSectionType, Map<FormValidationSetEnum, List<FormControlValidation>>> + +sectionBaseControls: Map<String, AbstractControl<dynamic>> + +form: FormGroup + +sectionId: String + +sectionType: ReportSectionType + <static>+sectionTypeControlOptions: List<FormControlOption<ReportSectionType>> + <static>+temporalAggregationControlOptions: List<FormControlOption<TemporalAggregationFormatted>> + <static>+improvementDirectionControlOptions: List<FormControlOption<ImprovementDirectionFormatted>> + +titles: Map<FormMode, String> + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titleRequired: dynamic + +descriptionRequired: dynamic + +dataReferenceRequired: dynamic + +aggregationRequired: dynamic + +improvementDirectionRequired: dynamic + +alphaConfidenceRequired: dynamic - - - +labelText: String - +hintText: String? - +formControlName: String? - +formControl: FormControl<dynamic>? + + + -List<FormControlValidation> _getValidationConfig() + +ReportItemFormData buildFormData() + +ReportItemFormViewModel createDuplicate() + +dynamic onSectionTypeChanged() + -void _updateFormControls() + +void setControlsFrom() - - - - + + + + - - - PasswordTextField + + + ReportSectionType - - - +labelText: String - +hintText: String? - +formControlName: String? - +formControl: FormControl<dynamic>? + + + +index: int + <static>+values: List<ReportSectionType> + <static>+average: ReportSectionType + <static>+linearRegression: ReportSectionType - - - - + + + + + - - - StudyUJobsToBeDone + + + ReportItemFormData - - - +Widget build() + + + +isPrimary: bool + +section: ReportSection + +id: String - - - - - - - - - - LoginForm + + + <static>+dynamic fromDomainModel() + +ReportItemFormData copy() - - - +formKey: AuthFormKey - - + + + + - - - +Widget build() + + + ReportSection - - - - + + + + + - - - StudyAnalyzeController + + + ReportItemFormView - - - +dynamic onExport() + + + +formViewModel: ReportItemFormViewModel + +studyId: String + +reportSectionColumnWidth: dynamic + +sectionTypeBodyBuilder: Widget Function(BuildContext) + + + + + + +Widget build() + -dynamic _buildSectionText() + -dynamic _buildSectionTypeHeader() - - - - + + + - - - StudyAnalyzeScreen + + + Widget Function(BuildContext) - - - +Widget? banner() - +Widget build() + + + + + + + + + + TemporalAggregationFormatted - - - - - - - - - PublishDialog + + + -_value: TemporalAggregation + <static>+values: List<TemporalAggregationFormatted> + +value: TemporalAggregation + +string: String + +icon: IconData? + +hashCode: int - - - +Widget build() + + + +bool ==() + +String toString() + +String toJson() + <static>+TemporalAggregationFormatted fromJson() - - - - + + + - - - PublishSuccessDialog + + + TemporalAggregation - - - +Widget build() + + + + + + + + IconData - - - - + + + + + - - - PublishConfirmationDialog + + + ImprovementDirectionFormatted - - - +Widget build() + + + -_value: ImprovementDirection + <static>+values: List<ImprovementDirectionFormatted> + +value: ImprovementDirection + +string: String + +icon: IconData? + +hashCode: int - - - - - - - - App + + + +bool ==() + +String toString() + +String toJson() + <static>+ImprovementDirectionFormatted fromJson() - - - + + + - - - AppContent + + + ImprovementDirection - - - - - - - - IStudyAppBarViewModel - - + + + + + - - - +isSyncIndicatorVisible: bool - +isStatusBadgeVisible: bool - +isPublishVisible: bool + + + DataReferenceIdentifier - - - - - - - - - IStudyStatusBadgeViewModel + + + +hashCode: int - - - +studyParticipation: Participation? - +studyStatus: StudyStatus? + + + +bool ==() - - - - - - - - IStudyNavViewModel - - + + + - - - +isEditTabEnabled: bool - +isTestTabEnabled: bool - +isRecruitTabEnabled: bool - +isMonitorTabEnabled: bool - +isAnalyzeTabEnabled: bool - +isSettingsEnabled: bool + + + DataReference - - - - + + + + + - - - StudyScaffold + + + LinearRegressionSectionFormView - - - +studyId: String - +tabs: List<NavbarTab>? - +tabsSubnav: List<NavbarTab>? - +selectedTab: NavbarTab? - +selectedTabSubnav: NavbarTab? - +body: StudyPageWidget - +drawer: Widget? - +disableActions: bool - +actionsSpacing: double - +actionsPadding: double - +layoutType: SingleColumnLayoutType? - +appbarHeight: double - +appbarSubnavHeight: double + + + +formViewModel: ReportItemFormViewModel + +studyId: String + +reportSectionColumnWidth: Map<int, TableColumnWidth> - - - - - - - - NavbarTab + + + +Widget build() - - - + + + + + - - - SingleColumnLayoutType + + + DataReferenceEditor - - - - - - - - - PreviewFrame + + + +formControl: FormControl<DataReferenceIdentifier<T>> + +availableTasks: List<Task> + +buildReactiveDropdownField: ReactiveDropdownField<dynamic> - - - +studyId: String - +routeArgs: StudyFormRouteArgs? - +route: String? + + + +FormTableRow buildFormTableRow() + -List<DropdownMenuItem<DataReferenceIdentifier<dynamic>>> _dataReferenceItems() - - - + + + - - - StudyFormRouteArgs + + + ReactiveDropdownField - - - - - + + + + + - - - StudyParticipationBadge + + + AverageSectionFormView - - - +participation: Participation - +type: BadgeType - +showPrefixIcon: bool + + + +formViewModel: ReportItemFormViewModel + +studyId: String + +reportSectionColumnWidth: Map<int, TableColumnWidth> - - - +Widget build() + + + +Widget build() - - - + + + + + - - - Participation + + + StudyInfoFormData - - - - - - - - BadgeType + + + +title: String + +description: String? + +iconName: String + +contactInfoFormData: StudyContactInfoFormData + +id: String - - - - - - - - ConsumerWidget + + + +Study apply() + +StudyInfoFormData copy() - - - + + + + + - - - IWithBanner + + + StudyContactInfoFormData - - - - + + + +organization: String? + +institutionalReviewBoard: String? + +institutionalReviewBoardNumber: String? + +researchers: String? + +email: String? + +website: String? + +phone: String? + +additionalInfo: String? + +id: String + + - - - StudyStatus + + + +Study apply() + +StudyInfoFormData copy() - - - - - + + + + + - - - StudyStatusBadge + + + StudyInfoFormViewModel - - - +participation: Participation? - +status: StudyStatus? - +type: BadgeType - +showPrefixIcon: bool - +showTooltip: bool + + + +study: Study + +titleControl: FormControl<String> + +iconControl: FormControl<IconOption> + +descriptionControl: FormControl<String> + +organizationControl: FormControl<String> + +reviewBoardControl: FormControl<String> + +reviewBoardNumberControl: FormControl<String> + +researchersControl: FormControl<String> + +emailControl: FormControl<String> + +websiteControl: FormControl<String> + +phoneControl: FormControl<String> + +additionalInfoControl: FormControl<String> + +form: FormGroup + +titles: Map<FormMode, String> + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titleRequired: dynamic + +descriptionRequired: dynamic + +iconRequired: dynamic + +organizationRequired: dynamic + +reviewBoardRequired: dynamic + +reviewBoardNumberRequired: dynamic + +researchersRequired: dynamic + +emailRequired: dynamic + +phoneRequired: dynamic + +emailFormat: dynamic + +websiteFormat: dynamic - - - +Widget build() + + + +void setControlsFrom() + +StudyInfoFormData buildFormData() - - - - - + + + + - - - FrameControlsWidget + + + StudyDesignInfoFormView - - - +onRefresh: void Function()? - +onOpenNewTab: void Function()? - +enabled: bool + + + +Widget build() - - - +Widget build() + + + + + + + + + StudyFormValidationSet - - - - - - - - - - StudyTestScreen + + + +index: int + <static>+values: List<StudyFormValidationSet> - - - +previewRoute: String? + + + + + + + + + StudyDesignEnrollmentFormView - - - +Widget build() - +Widget? banner() - +dynamic load() - +dynamic save() - +dynamic showHelp() + + + +Widget build() + -dynamic _showScreenerQuestionSidesheetWithArgs() + -dynamic _showConsentItemSidesheetWithArgs() - - - - + + + + + - - - StudyNav + + + EnrollmentFormData - - - <static>+dynamic tabs() - <static>+dynamic edit() - <static>+dynamic test() - <static>+dynamic recruit() - <static>+dynamic monitor() - <static>+dynamic analyze() + + + <static>+kDefaultEnrollmentType: Participation + +enrollmentType: Participation + +questionnaireFormData: QuestionnaireFormData + +consentItemsFormData: List<ConsentItemFormData>? + +id: String - - - - - - - - - StudyDesignNav + + + +Study apply() + +EnrollmentFormData copy() - - - <static>+dynamic tabs() - <static>+dynamic info() - <static>+dynamic enrollment() - <static>+dynamic interventions() - <static>+dynamic measurements() - <static>+dynamic reports() + + + + + + + + Participation - - - - - + + + + + - - - RouteInformation + + + QuestionnaireFormData - - - +route: String? - +extra: String? - +cmd: String? - +data: String? + + + +questionsData: List<QuestionFormData>? + +id: String - - - +String toString() + + + +StudyUQuestionnaire toQuestionnaire() + +List<EligibilityCriterion> toEligibilityCriteria() + +QuestionnaireFormData copy() - - - - - + + + + + - - - PlatformController + + + ConsentItemFormViewModel - - - +studyId: String - +baseSrc: String - +previewSrc: String - +routeInformation: RouteInformation - +frameWidget: Widget + + + +consentIdControl: FormControl<String> + +titleControl: FormControl<String> + +descriptionControl: FormControl<String> + +iconControl: FormControl<IconOption> + +form: FormGroup + +consentId: String + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titleRequired: dynamic + +descriptionRequired: dynamic + +titles: Map<FormMode, String> - - - +void activate() - +void registerViews() - +void generateUrl() - +void navigate() - +void refresh() - +void listen() - +void send() - +void openNewPage() + + + +void setControlsFrom() + +ConsentItemFormData buildFormData() + +ConsentItemFormViewModel createDuplicate() - - - - - + + + + + - - - WebController + + + ScreenerQuestionFormViewModel - - - +iFrameElement: IFrameElement + + + <static>+defaultResponseOptionValidity: bool + +responseOptionsDisabledArray: FormArray<dynamic> + +responseOptionsLogicControls: FormArray<bool> + +responseOptionsLogicDescriptionControls: FormArray<String> + -_questionBaseControls: Map<String, AbstractControl<dynamic>> + +prevResponseOptionControls: List<AbstractControl<dynamic>> + +prevResponseOptionValues: List<dynamic> + +responseOptionsDisabledControls: List<AbstractControl<dynamic>> + +logicControlOptions: List<FormControlOption<bool>> + +questionBaseControls: Map<String, AbstractControl<dynamic>> + +isDirtyOptionsBannerVisible: bool - - - +void activate() - +void registerViews() - +void generateUrl() - +void navigate() - +void refresh() - +void openNewPage() - +void listen() - +void send() + + + +dynamic onResponseOptionsChanged() + +void setControlsFrom() + +QuestionFormData buildFormData() + -List<FormControl<dynamic>> _copyFormControls() + -AbstractControl<dynamic>? _findAssociatedLogicControlFor() + -AbstractControl<dynamic>? _findAssociatedControlFor() + +ScreenerQuestionFormViewModel createDuplicate() - - - + + + + + - - - IFrameElement + + + QuestionFormViewModel - - - - - - - - - MobileController + + + <static>+defaultQuestionType: SurveyQuestionType + -_titles: Map<FormMode, String Function()>? + +questionIdControl: FormControl<String> + +questionTypeControl: FormControl<SurveyQuestionType> + +questionTextControl: FormControl<String> + +questionInfoTextControl: FormControl<String> + +questionBaseControls: Map<String, AbstractControl<dynamic>> + +isMultipleChoiceControl: FormControl<bool> + +choiceResponseOptionsArray: FormArray<dynamic> + +customOptionsMin: int + +customOptionsMax: int + +customOptionsInitial: int + +boolResponseOptionsArray: FormArray<String> + <static>+kDefaultScaleMinValue: int + <static>+kDefaultScaleMaxValue: int + <static>+kNumMidValueControls: int + <static>+kMidValueDebounceMilliseconds: int + +scaleMinValueControl: FormControl<int> + +scaleMaxValueControl: FormControl<int> + -_scaleRangeControl: FormControl<int> + +scaleMinLabelControl: FormControl<String> + +scaleMaxLabelControl: FormControl<String> + +scaleMidValueControls: FormArray<int> + +scaleMidLabelControls: FormArray<String?> + -_scaleResponseOptionsArray: FormArray<int> + +scaleMinColorControl: FormControl<SerializableColor> + +scaleMaxColorControl: FormControl<SerializableColor> + +prevMidValues: List<int?>? + -_controlsByQuestionType: Map<SurveyQuestionType, FormGroup> + -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + -_validationConfigsByQuestionType: Map<SurveyQuestionType, Map<FormValidationSetEnum, List<FormControlValidation>>> + +form: FormGroup + +questionId: String + +questionType: SurveyQuestionType + +questionTypeControlOptions: List<FormControlOption<SurveyQuestionType>> + +answerOptionsArray: FormArray<dynamic> + +answerOptionsControls: List<AbstractControl<dynamic>> + +validAnswerOptions: List<String> + +boolOptions: List<AbstractControl<String>> + +scaleMinValue: int + +scaleMaxValue: int + +scaleRange: int + +scaleAllValueControls: List<AbstractControl<int>> + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +questionTextRequired: dynamic + +numValidChoiceOptions: dynamic + +scaleRangeValid: dynamic + +titles: Map<FormMode, String> + +isAddOptionButtonVisible: bool + +isMidValuesClearedInfoVisible: bool - - - +void openNewPage() - +void refresh() - +void registerViews() - +void listen() - +void send() - +void navigate() - +void activate() - +void generateUrl() + + + +String? scaleMidLabelAt() + -dynamic _onScaleRangeChanged() + -dynamic _applyInputFormatters() + -dynamic _updateScaleMidValueControls() + -List<FormControlValidation> _getValidationConfig() + +dynamic onQuestionTypeChanged() + +dynamic onResponseOptionsChanged() + -void _updateFormControls() + +void initControls() + +void setControlsFrom() + +QuestionFormData buildFormData() + +List<ModelAction<dynamic>> availableActions() + +void onNewItem() + +void onSelectItem() + +QuestionFormViewModel createDuplicate() - - - - - + + + + - - - StudySettingsFormViewModel + + + IScreenerQuestionLogicFormViewModel - - - +study: AsyncValue<Study> - +studyRepository: IStudyRepository - <static>+defaultPublishedToRegistry: bool - <static>+defaultPublishedToRegistryResults: bool - +isPublishedToRegistryControl: FormControl<bool> - +isPublishedToRegistryResultsControl: FormControl<bool> - +form: FormGroup - +titles: Map<FormMode, String> + + + +isDirtyOptionsBannerVisible: bool - - - +void setControlsFrom() - +Study buildFormData() - +dynamic keepControlsSynced() - +dynamic save() - +dynamic setLaunchDefaults() + + + + + + + + + ConsentItemFormView - - - - - - - - AsyncValue + + + +formViewModel: ConsentItemFormViewModel - - - - + + + + + - - - StudySettingsDialog + + + ConsentItemFormData - - - +Widget build() + + + +consentId: String + +title: String + +description: String + +iconName: String? + +id: String + + + + + + +ConsentItem toConsentItem() + +ConsentItemFormData copy() - - - - - + + + + + - - - WebFrame + + + ScreenerQuestionLogicFormView - - - +previewSrc: String - +studyId: String + + + +formViewModel: ScreenerQuestionFormViewModel - - - +Widget build() + + + +Widget build() + -dynamic _buildInfoBanner() + -dynamic _buildAnswerOptionsLogicControls() + -List<Widget> _buildOptionLogicRow() - - - - + + + + + - - - DisabledFrame + + + EnrollmentFormViewModel - - - +Widget build() + + + +study: Study + +router: GoRouter + +consentItemDelegate: EnrollmentFormConsentItemDelegate + +enrollmentTypeControl: FormControl<Participation> + +consentItemArray: FormArray<dynamic> + +consentItemFormViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData> + +form: FormGroup + +enrollmentTypeControlOptions: List<FormControlOption<Participation>> + +consentItemModels: List<ConsentItemFormViewModel> + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titles: Map<FormMode, String> + +canTestScreener: bool + +canTestConsent: bool + +questionTitles: Map<FormMode, String Function()> + + + + + + +void setControlsFrom() + +EnrollmentFormData buildFormData() + +void read() + +List<ModelAction<dynamic>> availableActions() + +List<ModelAction<dynamic>> availablePopupActions() + +List<ModelAction<dynamic>> availableInlineActions() + +void onSelectItem() + +void onNewItem() + +ScreenerQuestionFormRouteArgs buildNewScreenerQuestionFormRouteArgs() + +ScreenerQuestionFormRouteArgs buildScreenerQuestionFormRouteArgs() + +ConsentItemFormRouteArgs buildNewConsentItemFormRouteArgs() + +ConsentItemFormRouteArgs buildConsentItemFormRouteArgs() + +dynamic testScreener() + +dynamic testConsent() + +ScreenerQuestionFormViewModel provideQuestionFormViewModel() - - - - - + + + + + - - - PhoneContainer + + + EnrollmentFormConsentItemDelegate - - - <static>+defaultWidth: double - <static>+defaultHeight: double - +width: double - +height: double - +borderColor: Color - +borderWidth: double - +borderRadius: double - +innerContent: Widget - +innerContentBackgroundColor: Color? + + + +formViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData> + +owner: EnrollmentFormViewModel + +propagateOnSave: bool + +validationSet: dynamic - - - +Widget build() + + + +void onCancel() + +dynamic onSave() + +ConsentItemFormViewModel provide() + +List<ModelAction<dynamic>> availableActions() + +void onNewItem() + +void onSelectItem() - - - + + + + + - - - Color + + + WithQuestionnaireControls - - - - - - - - - MobileFrame + + + +questionsArray: FormArray<dynamic> + +questionFormViewModels: FormViewModelCollection<Q, QuestionFormData> + +questionnaireControls: Map<String, FormArray<dynamic>> + +propagateOnSave: bool + +questionModels: List<Q> + +questionTitles: Map<FormMode, String Function()> - - - +Widget build() + + + +void setQuestionnaireControlsFrom() + +QuestionnaireFormData buildQuestionnaireFormData() + +void read() + +void onCancel() + +dynamic onSave() + +Q provide() + +Q provideQuestionFormViewModel() - - - - + + + + - - - DesktopFrame + + + SurveyQuestionFormView - - - +Widget build() + + + +formViewModel: QuestionFormViewModel + +isHtmlStyleable: bool - - - - + + + + - - - StudyTestController + + + SurveyQuestionType - - - +authRepository: IAuthRepository - +languageCode: String + + + +index: int + <static>+values: List<SurveyQuestionType> + <static>+choice: SurveyQuestionType + <static>+bool: SurveyQuestionType + <static>+scale: SurveyQuestionType - - - - - + + + + + - - - StudyController + + + QuestionFormData - - - +notificationService: INotificationService - +studyEventsSubscription: StreamSubscription<ModelEvent<Study>>? - +studyActions: List<ModelAction<dynamic>> + + + <static>+questionTypeFormDataFactories: Map<SurveyQuestionType, QuestionFormData Function(Question<dynamic>, List<EligibilityCriterion>)> + +questionId: String + +questionText: String + +questionInfoText: String? + +questionType: SurveyQuestionType + +responseOptionsValidity: Map<dynamic, bool> + +responseOptions: List<dynamic> + +id: String - - - +dynamic syncStudyStatus() - +dynamic onStudySubscriptionUpdate() - -dynamic _redirectNewToActualStudyID() - +dynamic publishStudy() - +void onChangeStudyParticipation() - +void onAddParticipants() - +void onSettingsPressed() - +void dispose() + + + +Question<dynamic> toQuestion() + +EligibilityCriterion toEligibilityCriterion() + +Answer<dynamic> constructAnswerFor() + +dynamic setResponseOptionsValidityFrom() + +QuestionFormData copy() - - - - + + + + + - - - TestAppRoutes + + + ChoiceQuestionFormData - - - <static>+studyOverview: String - <static>+eligibility: String - <static>+intervention: String - <static>+consent: String - <static>+journey: String - <static>+dashboard: String + + + +isMultipleChoice: bool + +answerOptions: List<String> + +responseOptions: List<String> - - - - - - - - - StudyDesignInfoFormView + + + +Question<dynamic> toQuestion() + +QuestionFormData copy() + -Choice _buildChoiceForValue() + +Answer<dynamic> constructAnswerFor() - - - +Widget build() + + + + + + + + + + BoolQuestionFormData - - - - - - - - - StudyDesignPageWidget + + + <static>+kResponseOptions: Map<String, bool> + +responseOptions: List<String> - - - +Widget? banner() + + + +Question<dynamic> toQuestion() + +BoolQuestionFormData copy() + +Answer<dynamic> constructAnswerFor() - - - - - + + + + + - - - StudyInfoFormViewModel + + + ScaleQuestionFormData - - - +study: Study - +titleControl: FormControl<String> - +iconControl: FormControl<IconOption> - +descriptionControl: FormControl<String> - +organizationControl: FormControl<String> - +reviewBoardControl: FormControl<String> - +reviewBoardNumberControl: FormControl<String> - +researchersControl: FormControl<String> - +emailControl: FormControl<String> - +websiteControl: FormControl<String> - +phoneControl: FormControl<String> - +additionalInfoControl: FormControl<String> - +form: FormGroup - +titles: Map<FormMode, String> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titleRequired: dynamic - +descriptionRequired: dynamic - +iconRequired: dynamic - +organizationRequired: dynamic - +reviewBoardRequired: dynamic - +reviewBoardNumberRequired: dynamic - +researchersRequired: dynamic - +emailRequired: dynamic - +phoneRequired: dynamic - +emailFormat: dynamic - +websiteFormat: dynamic + + + +minValue: double + +maxValue: double + +minLabel: String? + +maxLabel: String? + +midValues: List<double?> + +midLabels: List<String?> + +stepSize: double + +initialValue: double? + +minColor: Color? + +maxColor: Color? + +responseOptions: List<double> + +midAnnotations: List<Annotation> - - - +void setControlsFrom() - +StudyInfoFormData buildFormData() + + + +ScaleQuestion toQuestion() + +QuestionFormData copy() + +Answer<dynamic> constructAnswerFor() - - - - - + + + - - - StudyInfoFormData + + + Color - - - +title: String - +description: String? - +iconName: String - +contactInfoFormData: StudyContactInfoFormData - +id: String + + + + + + + + + IScaleQuestionFormViewModel - - - +Study apply() - +StudyInfoFormData copy() + + + +isMidValuesClearedInfoVisible: bool - - - - - + + + + - - - StudyContactInfoFormData + + + ScaleQuestionFormView - - - +organization: String? - +institutionalReviewBoard: String? - +institutionalReviewBoardNumber: String? - +researchers: String? - +email: String? - +website: String? - +phone: String? - +additionalInfo: String? - +id: String + + + +formViewModel: QuestionFormViewModel + + + + + + + + + + + + + BoolQuestionFormView + + + + + + +formViewModel: QuestionFormViewModel - - - +Study apply() - +StudyInfoFormData copy() + + + +Widget build() - - - - + + + + + - - - IStudyFormData + + + ChoiceQuestionFormView - - - +Study apply() + + + +formViewModel: QuestionFormViewModel + + + + + + +Widget build() - - - - - + + + + + - - - StudyFormScaffold + + + ScheduleControls - - - +studyId: String - +formViewModelBuilder: T Function(WidgetRef) - +formViewBuilder: Widget Function(T) + + + +formViewModel: WithScheduleControls - - - +Widget build() + + + +Widget build() + -List<FormTableRow> _conditionalTimeRestrictions() - - - + + + - - - T Function(WidgetRef) + + + StudyUTimeOfDay - - - + + + + + - - - Widget Function(T) + + + StudyFormViewModel - - - - - - - - - StudyFormValidationSet + + + +studyDirtyCopy: Study? + +studyRepository: IStudyRepository + +authRepository: IAuthRepository + +router: GoRouter + +studyInfoFormViewModel: StudyInfoFormViewModel + +enrollmentFormViewModel: EnrollmentFormViewModel + +measurementsFormViewModel: MeasurementsFormViewModel + +reportsFormViewModel: ReportsFormViewModel + +interventionsFormViewModel: InterventionsFormViewModel + +form: FormGroup + +isStudyReadonly: bool + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titles: Map<FormMode, String> - - - +index: int - <static>+values: List<StudyFormValidationSet> + + + +void read() + +void setControlsFrom() + +Study buildFormData() + +void dispose() + +void onCancel() + +dynamic onSave() + -dynamic _applyAndSaveSubform() - - - - + + + - - - StudyDesignMeasurementsFormView + + + IStudyRepository - - - +Widget build() + + + + + + + + IAuthRepository - - - + + + - + MeasurementsFormViewModel - + +study: Study +router: GoRouter @@ -6162,7 +6270,7 @@ - + +void read() +void setControlsFrom() @@ -6179,68 +6287,51 @@ - - - - - - - IListActionProvider - - - - - - - - - - - IProviderArgsResolver - - - - - - - - - + + + + + - - - MeasurementsFormData + + + MeasurementSurveyFormData - - - +surveyMeasurements: List<MeasurementSurveyFormData> - +id: String + + + +measurementId: String + +title: String + +introText: String? + +outroText: String? + +questionnaireFormData: QuestionnaireFormData + <static>+kDefaultTitle: String + +id: String - - - +Study apply() - +MeasurementsFormData copy() + + + +QuestionnaireTask toQuestionnaireTask() + +MeasurementSurveyFormData copy() - - - + + + - + MeasurementSurveyFormViewModel - + +study: Study +measurementIdControl: FormControl<String> @@ -6259,7 +6350,7 @@ - + +void setControlsFrom() +MeasurementSurveyFormData buildFormData() @@ -6275,2010 +6366,1919 @@ - - - - - + + + + + - - - WithQuestionnaireControls + + + SurveyPreview - - - +questionsArray: FormArray<dynamic> - +questionFormViewModels: FormViewModelCollection<Q, QuestionFormData> - +questionnaireControls: Map<String, FormArray<dynamic>> - +propagateOnSave: bool - +questionModels: List<Q> - +questionTitles: Map<FormMode, String Function()> + + + +routeArgs: MeasurementFormRouteArgs - - - +void setQuestionnaireControlsFrom() - +QuestionnaireFormData buildQuestionnaireFormData() - +void read() - +void onCancel() - +dynamic onSave() - +Q provide() - +Q provideQuestionFormViewModel() + + + +Widget build() - - - - - + + + - - - WithScheduleControls + + + MeasurementFormRouteArgs + + + + + + + + + + + + MeasurementSurveyFormView + + + + + + +formViewModel: MeasurementSurveyFormViewModel + + + + + + + + + + + + StudyDesignMeasurementsFormView + + + + + + +Widget build() + + + + + + + + + + + + + MeasurementsFormData + + + + + + +surveyMeasurements: List<MeasurementSurveyFormData> + +id: String + + + + + + +Study apply() + +MeasurementsFormData copy() + + + + + + + + + + + + + StudyTestScreen + + + + + + +previewRoute: String? + + + + + + +Widget build() + +Widget? banner() + +dynamic load() + +dynamic save() + +dynamic showHelp() - - - +isTimeRestrictedControl: FormControl<bool> - +instanceID: FormControl<String> - +restrictedTimeStartControl: FormControl<Time> - +restrictedTimeStartPickerControl: FormControl<TimeOfDay> - +restrictedTimeEndControl: FormControl<Time> - +restrictedTimeEndPickerControl: FormControl<TimeOfDay> - +hasReminderControl: FormControl<bool> - +reminderTimeControl: FormControl<Time> - +reminderTimePickerControl: FormControl<TimeOfDay> - -_reminderControlStream: StreamSubscription<dynamic>? - +scheduleFormControls: Map<String, FormControl<Object>> - +hasReminder: bool - +isTimeRestricted: bool - +timeRestriction: List<Time>? + + + + + + + + + StudySettingsDialog - - - +void setScheduleControlsFrom() - -dynamic _initReminderControl() + + + +Widget build() - - - - - + + + + + - - - MeasurementSurveyFormData + + + StudySettingsFormViewModel - - - +measurementId: String - +title: String - +introText: String? - +outroText: String? - +questionnaireFormData: QuestionnaireFormData - <static>+kDefaultTitle: String - +id: String + + + +study: AsyncValue<Study> + +studyRepository: IStudyRepository + <static>+defaultPublishedToRegistry: bool + <static>+defaultPublishedToRegistryResults: bool + +isPublishedToRegistryControl: FormControl<bool> + +isPublishedToRegistryResultsControl: FormControl<bool> + +form: FormGroup + +titles: Map<FormMode, String> - - - +QuestionnaireTask toQuestionnaireTask() - +MeasurementSurveyFormData copy() + + + +void setControlsFrom() + +Study buildFormData() + +dynamic keepControlsSynced() + +dynamic save() + +dynamic setLaunchDefaults() - - - - - + + + - - - QuestionnaireFormData + + + AsyncValue - - - +questionsData: List<QuestionFormData>? - +id: String + + + + + + + + + IStudyNavViewModel - - - +StudyUQuestionnaire toQuestionnaire() - +List<EligibilityCriterion> toEligibilityCriteria() - +QuestionnaireFormData copy() + + + +isEditTabEnabled: bool + +isTestTabEnabled: bool + +isRecruitTabEnabled: bool + +isMonitorTabEnabled: bool + +isAnalyzeTabEnabled: bool + +isSettingsEnabled: bool - - - - - - - - - IFormDataWithSchedule - - + + + + - - - +instanceId: String - +isTimeLocked: bool - +timeLockStart: StudyUTimeOfDay? - +timeLockEnd: StudyUTimeOfDay? - +hasReminder: bool - +reminderTime: StudyUTimeOfDay? + + + StudyNav - - - +Schedule toSchedule() + + + <static>+dynamic tabs() + <static>+dynamic edit() + <static>+dynamic test() + <static>+dynamic recruit() + <static>+dynamic monitor() + <static>+dynamic analyze() - - - - - + + + + - - - SurveyPreview + + + StudyDesignNav - - - +routeArgs: MeasurementFormRouteArgs + + + <static>+dynamic tabs() + <static>+dynamic info() + <static>+dynamic enrollment() + <static>+dynamic interventions() + <static>+dynamic measurements() + <static>+dynamic reports() - - - +Widget build() + + + + + + + + + + WebFrame - - - - + + + +previewSrc: String + +studyId: String + + - - - MeasurementFormRouteArgs + + + +Widget build() - - - - + + + + - - - MeasurementSurveyFormView + + + DisabledFrame - - - +formViewModel: MeasurementSurveyFormViewModel + + + +Widget build() - - - - - + + + + + - - - ReportsFormViewModel + + + PhoneContainer - - - +study: Study - +router: GoRouter - +reportItemDelegate: ReportFormItemDelegate - +reportItemArray: FormArray<dynamic> - +reportItemFormViewModels: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData> - +form: FormGroup - +reportItemModels: List<ReportItemFormViewModel> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titles: Map<FormMode, String> - +canTestConsent: bool + + + <static>+defaultWidth: double + <static>+defaultHeight: double + +width: double + +height: double + +borderColor: Color + +borderWidth: double + +borderRadius: double + +innerContent: Widget + +innerContentBackgroundColor: Color? - - - +void setControlsFrom() - +ReportsFormData buildFormData() - +void read() - +ReportItemFormRouteArgs buildNewReportItemFormRouteArgs() - +ReportItemFormRouteArgs buildReportItemFormRouteArgs() - +dynamic testReport() - +void onCancel() - +dynamic onSave() - +ReportItemFormViewModel provide() + + + +Widget build() - - - - - + + + - - - ReportFormItemDelegate + + + Widget - - - +formViewModelCollection: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData> - +owner: ReportsFormViewModel - +propagateOnSave: bool - +validationSet: dynamic + + + + + + + + + MobileFrame - - - +void onCancel() - +dynamic onSave() - +ReportItemFormViewModel provide() - +List<ModelAction<dynamic>> availableActions() - +void onNewItem() - +void onSelectItem() + + + +Widget build() - - - - - - - - - ReportItemFormView - - + + + + - - - +formViewModel: ReportItemFormViewModel - +studyId: String - +reportSectionColumnWidth: dynamic - +sectionTypeBodyBuilder: Widget Function(BuildContext) + + + DesktopFrame - - - - +Widget build() - -dynamic _buildSectionText() - -dynamic _buildSectionTypeHeader() + + + + +Widget build() - - - - - + + + + + - - - ReportItemFormViewModel + + + StudyParticipationBadge - - - <static>+defaultSectionType: ReportSectionType - +sectionIdControl: FormControl<String> - +sectionTypeControl: FormControl<ReportSectionType> - +titleControl: FormControl<String> - +descriptionControl: FormControl<String> - +sectionControl: FormControl<ReportSection> - +dataReferenceControl: FormControl<DataReferenceIdentifier<num>> - +temporalAggregationControl: FormControl<TemporalAggregationFormatted> - +improvementDirectionControl: FormControl<ImprovementDirectionFormatted> - +alphaControl: FormControl<double> - -_controlsBySectionType: Map<ReportSectionType, FormGroup> - -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - -_validationConfigsBySectionType: Map<ReportSectionType, Map<FormValidationSetEnum, List<FormControlValidation>>> - +sectionBaseControls: Map<String, AbstractControl<dynamic>> - +form: FormGroup - +sectionId: String - +sectionType: ReportSectionType - <static>+sectionTypeControlOptions: List<FormControlOption<ReportSectionType>> - <static>+temporalAggregationControlOptions: List<FormControlOption<TemporalAggregationFormatted>> - <static>+improvementDirectionControlOptions: List<FormControlOption<ImprovementDirectionFormatted>> - +titles: Map<FormMode, String> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titleRequired: dynamic - +descriptionRequired: dynamic - +dataReferenceRequired: dynamic - +aggregationRequired: dynamic - +improvementDirectionRequired: dynamic - +alphaConfidenceRequired: dynamic + + + +participation: Participation + +type: BadgeType + +showPrefixIcon: bool - - - -List<FormControlValidation> _getValidationConfig() - +ReportItemFormData buildFormData() - +ReportItemFormViewModel createDuplicate() - +dynamic onSectionTypeChanged() - -void _updateFormControls() - +void setControlsFrom() + + + +Widget build() - - - + + + + - - - Widget Function(BuildContext) + + + IStudyStatusBadgeViewModel - - - - - - - - - - LinearRegressionSectionFormView + + + +studyParticipation: Participation? + +studyStatus: StudyStatus? - - - +formViewModel: ReportItemFormViewModel - +studyId: String - +reportSectionColumnWidth: Map<int, TableColumnWidth> - - + + + + - - - +Widget build() + + + StudyStatus - - - - - + + + + + - - - DataReferenceIdentifier + + + StudyStatusBadge - - - +hashCode: int + + + +participation: Participation? + +status: StudyStatus? + +type: BadgeType + +showPrefixIcon: bool + +showTooltip: bool - - - +bool ==() + + + +Widget build() - - - + + + - - - DataReference + + + IWithBanner - - - - - - - - - DataReferenceEditor - - + + + + - - - +formControl: FormControl<DataReferenceIdentifier<T>> - +availableTasks: List<Task> - +buildReactiveDropdownField: ReactiveDropdownField<dynamic> + + + PreviewFrame - - - +FormTableRow buildFormTableRow() - -List<DropdownMenuItem<DataReferenceIdentifier<dynamic>>> _dataReferenceItems() + + + +studyId: String + +routeArgs: StudyFormRouteArgs? + +route: String? - - - + + + - - - ReactiveDropdownField + + + StudyFormRouteArgs - - - - - + + + + + - - - TemporalAggregationFormatted + + + StudyController - - - -_value: TemporalAggregation - <static>+values: List<TemporalAggregationFormatted> - +value: TemporalAggregation - +string: String - +icon: IconData? - +hashCode: int + + + +notificationService: INotificationService + +studyEventsSubscription: StreamSubscription<ModelEvent<Study>>? + +studyActions: List<ModelAction<dynamic>> - - - +bool ==() - +String toString() - +String toJson() - <static>+TemporalAggregationFormatted fromJson() + + + +dynamic syncStudyStatus() + +dynamic onStudySubscriptionUpdate() + -dynamic _redirectNewToActualStudyID() + +dynamic publishStudy() + +void onChangeStudyParticipation() + +void onAddParticipants() + +void onSettingsPressed() + +void dispose() - - - + + + - - - TemporalAggregation + + + INotificationService - - - - - + + + + + - - - ImprovementDirectionFormatted + + + FrameControlsWidget - - - -_value: ImprovementDirection - <static>+values: List<ImprovementDirectionFormatted> - +value: ImprovementDirection - +string: String - +icon: IconData? - +hashCode: int + + + +onRefresh: void Function()? + +onOpenNewTab: void Function()? + +enabled: bool - - - +bool ==() - +String toString() - +String toJson() - <static>+ImprovementDirectionFormatted fromJson() + + + +Widget build() - - - + + + - - - ImprovementDirection + + + void Function()? - - - - + + + + + - - - ReportSectionType + + + RouteInformation - - - +index: int - <static>+values: List<ReportSectionType> - <static>+average: ReportSectionType - <static>+linearRegression: ReportSectionType + + + +route: String? + +extra: String? + +cmd: String? + +data: String? + + + + + + +String toString() - - - - - + + + + + - - - AverageSectionFormView + + + PlatformController - - - +formViewModel: ReportItemFormViewModel - +studyId: String - +reportSectionColumnWidth: Map<int, TableColumnWidth> + + + +studyId: String + +baseSrc: String + +previewSrc: String + +routeInformation: RouteInformation + +frameWidget: Widget - - - +Widget build() + + + +void activate() + +void registerViews() + +void generateUrl() + +void navigate() + +void refresh() + +void listen() + +void send() + +void openNewPage() - - - - - + + + + + - - - ReportItemFormData + + + WebController - - - +isPrimary: bool - +section: ReportSection - +id: String + + + +iFrameElement: IFrameElement - - - <static>+dynamic fromDomainModel() - +ReportItemFormData copy() + + + +void activate() + +void registerViews() + +void generateUrl() + +void navigate() + +void refresh() + +void openNewPage() + +void listen() + +void send() - - - + + + - - - ReportSection + + + IFrameElement - - - - - + + + + - - - ReportsFormData + + + MobileController - - - +reportItems: List<ReportItemFormData> - +id: String + + + +void openNewPage() + +void refresh() + +void registerViews() + +void listen() + +void send() + +void navigate() + +void activate() + +void generateUrl() - - - +Study apply() - +ReportsFormData copy() + + + + + + + + + TestAppRoutes + + + + + + <static>+studyOverview: String + <static>+eligibility: String + <static>+intervention: String + <static>+consent: String + <static>+journey: String + <static>+dashboard: String - - - - + + + + - - - ReportStatus + + + IStudyAppBarViewModel - - - +index: int - <static>+values: List<ReportStatus> - <static>+primary: ReportStatus - <static>+secondary: ReportStatus + + + +isSyncIndicatorVisible: bool + +isStatusBadgeVisible: bool + +isPublishVisible: bool - - - - + + + + - - - StudyDesignReportsFormView + + + StudyScaffold - - - +Widget build() - -dynamic _showReportItemSidesheetWithArgs() + + + +studyId: String + +tabs: List<NavbarTab>? + +tabsSubnav: List<NavbarTab>? + +selectedTab: NavbarTab? + +selectedTabSubnav: NavbarTab? + +body: StudyPageWidget + +drawer: Widget? + +disableActions: bool + +actionsSpacing: double + +actionsPadding: double + +layoutType: SingleColumnLayoutType? + +appbarHeight: double + +appbarSubnavHeight: double - - - - - + + + - - - ReportBadge + + + NavbarTab - - - +status: ReportStatus? - +type: BadgeType - +showPrefixIcon: bool - +showTooltip: bool - - + + + + - - - +Widget build() + + + SingleColumnLayoutType - - - - + + + + - - - StudyDesignEnrollmentFormView + + + StudyTestController - - - +Widget build() - -dynamic _showScreenerQuestionSidesheetWithArgs() - -dynamic _showConsentItemSidesheetWithArgs() + + + +authRepository: IAuthRepository + +languageCode: String - - - - - + + + + + - - - ConsentItemFormData + + + DashboardScaffold - - - +consentId: String - +title: String - +description: String - +iconName: String? - +id: String + + + +body: Widget - - - +ConsentItem toConsentItem() - +ConsentItemFormData copy() + + + +Widget build() - - - - - + + + + + - - - EnrollmentFormData + + + DashboardController - - - <static>+kDefaultEnrollmentType: Participation - +enrollmentType: Participation - +questionnaireFormData: QuestionnaireFormData - +consentItemsFormData: List<ConsentItemFormData>? - +id: String + + + +studyRepository: IStudyRepository + +authRepository: IAuthRepository + +userRepository: IUserRepository + +router: GoRouter + -_studiesSubscription: StreamSubscription<List<WrappedModel<Study>>>? + +searchController: SearchController - - - +Study apply() - +EnrollmentFormData copy() + + + -dynamic _subscribeStudies() + +dynamic setSearchText() + +dynamic setStudiesFilter() + +dynamic onSelectStudy() + +dynamic onClickNewStudy() + +dynamic pinStudy() + +dynamic pinOffStudy() + +void filterStudies() + +void sortStudies() + +bool isPinned() + +List<ModelAction<dynamic>> availableActions() + +void dispose() - - - - - + + + - - - ConsentItemFormViewModel + + + IUserRepository - - - +consentIdControl: FormControl<String> - +titleControl: FormControl<String> - +descriptionControl: FormControl<String> - +iconControl: FormControl<IconOption> - +form: FormGroup - +consentId: String - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titleRequired: dynamic - +descriptionRequired: dynamic - +titles: Map<FormMode, String> - - + + + + - - - +void setControlsFrom() - +ConsentItemFormData buildFormData() - +ConsentItemFormViewModel createDuplicate() + + + SearchController - - - - + + + + - - - IScreenerQuestionLogicFormViewModel + + + StudiesFilter - - - +isDirtyOptionsBannerVisible: bool + + + +index: int + <static>+values: List<StudiesFilter> - - - - - + + + + + - - - ScreenerQuestionLogicFormView + + + StudiesTable - - - +formViewModel: ScreenerQuestionFormViewModel + + + +studies: List<Study> + +onSelect: void Function(Study) + +getActions: List<ModelAction<dynamic>> Function(Study) + +emptyWidget: Widget + +pinnedStudies: Iterable<String> + +dashboardController: DashboardController + +pinnedPredicates: int Function(Study, Study) + -_sortColumns: List<int Function(Study, Study)?> - - - +Widget build() - -dynamic _buildInfoBanner() - -dynamic _buildAnswerOptionsLogicControls() - -List<Widget> _buildOptionLogicRow() + + + +Widget build() + -List<Widget> _buildRow() - - - - - + + + - - - ScreenerQuestionFormViewModel + + + void Function(Study) - - - <static>+defaultResponseOptionValidity: bool - +responseOptionsDisabledArray: FormArray<dynamic> - +responseOptionsLogicControls: FormArray<bool> - +responseOptionsLogicDescriptionControls: FormArray<String> - -_questionBaseControls: Map<String, AbstractControl<dynamic>> - +prevResponseOptionControls: List<AbstractControl<dynamic>> - +prevResponseOptionValues: List<dynamic> - +responseOptionsDisabledControls: List<AbstractControl<dynamic>> - +logicControlOptions: List<FormControlOption<bool>> - +questionBaseControls: Map<String, AbstractControl<dynamic>> - +isDirtyOptionsBannerVisible: bool - - + + + + - - - +dynamic onResponseOptionsChanged() - +void setControlsFrom() - +QuestionFormData buildFormData() - -List<FormControl<dynamic>> _copyFormControls() - -AbstractControl<dynamic>? _findAssociatedLogicControlFor() - -AbstractControl<dynamic>? _findAssociatedControlFor() - +ScreenerQuestionFormViewModel createDuplicate() + + + List<ModelAction<dynamic>> Function(Study) - - - - - + + + - - - QuestionFormViewModel + + + int Function(Study, Study) - - - <static>+defaultQuestionType: SurveyQuestionType - -_titles: Map<FormMode, String Function()>? - +questionIdControl: FormControl<String> - +questionTypeControl: FormControl<SurveyQuestionType> - +questionTextControl: FormControl<String> - +questionInfoTextControl: FormControl<String> - +questionBaseControls: Map<String, AbstractControl<dynamic>> - +isMultipleChoiceControl: FormControl<bool> - +choiceResponseOptionsArray: FormArray<dynamic> - +customOptionsMin: int - +customOptionsMax: int - +customOptionsInitial: int - +boolResponseOptionsArray: FormArray<String> - <static>+kDefaultScaleMinValue: int - <static>+kDefaultScaleMaxValue: int - <static>+kNumMidValueControls: int - <static>+kMidValueDebounceMilliseconds: int - +scaleMinValueControl: FormControl<int> - +scaleMaxValueControl: FormControl<int> - -_scaleRangeControl: FormControl<int> - +scaleMinLabelControl: FormControl<String> - +scaleMaxLabelControl: FormControl<String> - +scaleMidValueControls: FormArray<int> - +scaleMidLabelControls: FormArray<String?> - -_scaleResponseOptionsArray: FormArray<int> - +scaleMinColorControl: FormControl<SerializableColor> - +scaleMaxColorControl: FormControl<SerializableColor> - +prevMidValues: List<int?>? - -_controlsByQuestionType: Map<SurveyQuestionType, FormGroup> - -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - -_validationConfigsByQuestionType: Map<SurveyQuestionType, Map<FormValidationSetEnum, List<FormControlValidation>>> - +form: FormGroup - +questionId: String - +questionType: SurveyQuestionType - +questionTypeControlOptions: List<FormControlOption<SurveyQuestionType>> - +answerOptionsArray: FormArray<dynamic> - +answerOptionsControls: List<AbstractControl<dynamic>> - +validAnswerOptions: List<String> - +boolOptions: List<AbstractControl<String>> - +scaleMinValue: int - +scaleMaxValue: int - +scaleRange: int - +scaleAllValueControls: List<AbstractControl<int>> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +questionTextRequired: dynamic - +numValidChoiceOptions: dynamic - +scaleRangeValid: dynamic - +titles: Map<FormMode, String> - +isAddOptionButtonVisible: bool - +isMidValuesClearedInfoVisible: bool + + + + + + + + + DashboardScreen - - - +String? scaleMidLabelAt() - -dynamic _onScaleRangeChanged() - -dynamic _applyInputFormatters() - -dynamic _updateScaleMidValueControls() - -List<FormControlValidation> _getValidationConfig() - +dynamic onQuestionTypeChanged() - +dynamic onResponseOptionsChanged() - -void _updateFormControls() - +void initControls() - +void setControlsFrom() - +QuestionFormData buildFormData() - +List<ModelAction<dynamic>> availableActions() - +void onNewItem() - +void onSelectItem() - +QuestionFormViewModel createDuplicate() + + + +filter: StudiesFilter? - - - - - - - - - EnrollmentFormViewModel - - + + + + - - - +study: Study - +router: GoRouter - +consentItemDelegate: EnrollmentFormConsentItemDelegate - +enrollmentTypeControl: FormControl<Participation> - +consentItemArray: FormArray<dynamic> - +consentItemFormViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData> - +form: FormGroup - +enrollmentTypeControlOptions: List<FormControlOption<Participation>> - +consentItemModels: List<ConsentItemFormViewModel> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titles: Map<FormMode, String> - +canTestScreener: bool - +canTestConsent: bool - +questionTitles: Map<FormMode, String Function()> + + + AccountSettingsDialog - - - +void setControlsFrom() - +EnrollmentFormData buildFormData() - +void read() - +List<ModelAction<dynamic>> availableActions() - +List<ModelAction<dynamic>> availablePopupActions() - +List<ModelAction<dynamic>> availableInlineActions() - +void onSelectItem() - +void onNewItem() - +ScreenerQuestionFormRouteArgs buildNewScreenerQuestionFormRouteArgs() - +ScreenerQuestionFormRouteArgs buildScreenerQuestionFormRouteArgs() - +ConsentItemFormRouteArgs buildNewConsentItemFormRouteArgs() - +ConsentItemFormRouteArgs buildConsentItemFormRouteArgs() - +dynamic testScreener() - +dynamic testConsent() - +ScreenerQuestionFormViewModel provideQuestionFormViewModel() + + + +Widget build() - - - - - - - - - EnrollmentFormConsentItemDelegate - - + + + + - - - +formViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData> - +owner: EnrollmentFormViewModel - +propagateOnSave: bool - +validationSet: dynamic + + + StudyUJobsToBeDone - - - +void onCancel() - +dynamic onSave() - +ConsentItemFormViewModel provide() - +List<ModelAction<dynamic>> availableActions() - +void onNewItem() - +void onSelectItem() + + + +Widget build() - - - - + + + + - - - ConsentItemFormView + + + EmailTextField - - - +formViewModel: ConsentItemFormViewModel + + + +labelText: String + +hintText: String? + +formControlName: String? + +formControl: FormControl<dynamic>? - - - + + + + - - - StudyUTimeOfDay + + + PasswordTextField + + + + + + +labelText: String + +hintText: String? + +formControlName: String? + +formControl: FormControl<dynamic>? - - - - - + + + + + - - - ScheduleControls + + + SignupForm - - - +formViewModel: WithScheduleControls + + + +formKey: AuthFormKey - - - +Widget build() - -List<FormTableRow> _conditionalTimeRestrictions() + + + +Widget build() + -dynamic _onClickTermsOfUse() + -dynamic _onClickPrivacyPolicy() - - - - + + + + - - - SurveyQuestionType + + + AuthFormKey - - - +index: int - <static>+values: List<SurveyQuestionType> - <static>+choice: SurveyQuestionType - <static>+bool: SurveyQuestionType - <static>+scale: SurveyQuestionType + + + +index: int + <static>+values: List<AuthFormKey> + <static>+login: AuthFormKey + <static>+signup: AuthFormKey + <static>+passwordForgot: AuthFormKey + <static>+passwordRecovery: AuthFormKey + <static>-_loginSubmit: AuthFormKey + <static>-_signupSubmit: AuthFormKey - - - - - + + + - - - ChoiceQuestionFormView + + + FormConsumerRefWidget - - - +formViewModel: QuestionFormViewModel + + + + + + + + + + PasswordForgotForm - - - +Widget build() + + + +formKey: AuthFormKey + + + + + + +Widget build() - - - - - + + + + + - - - BoolQuestionFormView + + + AuthFormController - - - +formViewModel: QuestionFormViewModel + + + +authRepository: IAuthRepository + +sharedPreferences: SharedPreferences + +notificationService: INotificationService + +router: GoRouter + +emailControl: FormControl<String> + +passwordControl: FormControl<String> + +passwordConfirmationControl: FormControl<String> + +rememberMeControl: FormControl<bool> + +termsOfServiceControl: FormControl<bool> + <static>+authValidationMessages: Map<String, String Function(dynamic)> + +loginForm: FormGroup + +signupForm: FormGroup + +passwordForgotForm: FormGroup + +passwordRecoveryForm: FormGroup + +controlValidatorsByForm: Map<AuthFormKey, Map<FormControl<dynamic>, List<Validator<dynamic>>>> + -_formKey: AuthFormKey + +shouldRemember: bool + +formKey: AuthFormKey + +form: FormGroup - - - +Widget build() + + + -dynamic _onChangeFormKey() + +dynamic resetControlsFor() + -dynamic _forceValidationMessages() + +dynamic signUp() + -dynamic _signUp() + +dynamic signIn() + -dynamic _signInWith() + +dynamic signOut() + +dynamic resetPasswordForEmail() + +dynamic sendPasswordResetLink() + +dynamic recoverPassword() + +dynamic updateUser() + -void _setRememberMe() + -void _delRememberMe() + -void _initRememberMe() - - - - - - - - IScaleQuestionFormViewModel - - + + + - - - +isMidValuesClearedInfoVisible: bool + + + SharedPreferences - - - - + + + + - - - ScaleQuestionFormView + + + IFormGroupController - - - +formViewModel: QuestionFormViewModel + + + +form: FormGroup - - - - - + + + + - - - QuestionFormData + + + AuthScaffold - - - <static>+questionTypeFormDataFactories: Map<SurveyQuestionType, QuestionFormData Function(Question<dynamic>, List<EligibilityCriterion>)> - +questionId: String - +questionText: String - +questionInfoText: String? - +questionType: SurveyQuestionType - +responseOptionsValidity: Map<dynamic, bool> - +responseOptions: List<dynamic> - +id: String + + + +body: Widget + +formKey: AuthFormKey + +leftContentMinWidth: double + +leftPanelMinWidth: double + +leftPanelPadding: EdgeInsets - - - +Question<dynamic> toQuestion() - +EligibilityCriterion toEligibilityCriterion() - +Answer<dynamic> constructAnswerFor() - +dynamic setResponseOptionsValidityFrom() - +QuestionFormData copy() + + + + + + + + EdgeInsets - - - - - + + + + + - - - ChoiceQuestionFormData + + + LoginForm - - - +isMultipleChoice: bool - +answerOptions: List<String> - +responseOptions: List<String> + + + +formKey: AuthFormKey - - - +Question<dynamic> toQuestion() - +QuestionFormData copy() - -Choice _buildChoiceForValue() - +Answer<dynamic> constructAnswerFor() + + + +Widget build() - - - - - + + + + + - - - BoolQuestionFormData + + + PasswordRecoveryForm - - - <static>+kResponseOptions: Map<String, bool> - +responseOptions: List<String> + + + +formKey: AuthFormKey - - - +Question<dynamic> toQuestion() - +BoolQuestionFormData copy() - +Answer<dynamic> constructAnswerFor() + + + +Widget build() - - - - - + + + + - - - ScaleQuestionFormData + + + IAppDelegate - - - +minValue: double - +maxValue: double - +minLabel: String? - +maxLabel: String? - +midValues: List<double?> - +midLabels: List<String?> - +stepSize: double - +initialValue: double? - +minColor: Color? - +maxColor: Color? - +responseOptions: List<double> - +midAnnotations: List<Annotation> + + + +dynamic onAppStart() - - - +ScaleQuestion toQuestion() - +QuestionFormData copy() - +Answer<dynamic> constructAnswerFor() + + + + + + + + + + AppController - - - - - - - - - SurveyQuestionFormView + + + +sharedPreferences: SharedPreferences + +appDelegates: List<IAppDelegate> + -_delayedFuture: dynamic + +isInitialized: dynamic - - - +formViewModel: QuestionFormViewModel - +isHtmlStyleable: bool + + + +dynamic onAppStart() + -dynamic _callDelegates() - - - - - + + + - - - StudyFormViewModel + + + FormViewModelNotFoundException - - - +studyDirtyCopy: Study? - +studyRepository: IStudyRepository - +authRepository: IAuthRepository - +router: GoRouter - +studyInfoFormViewModel: StudyInfoFormViewModel - +enrollmentFormViewModel: EnrollmentFormViewModel - +measurementsFormViewModel: MeasurementsFormViewModel - +reportsFormViewModel: ReportsFormViewModel - +interventionsFormViewModel: InterventionsFormViewModel - +form: FormGroup - +isStudyReadonly: bool - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titles: Map<FormMode, String> - - + + + + - - - +void read() - +void setControlsFrom() - +Study buildFormData() - +void dispose() - +void onCancel() - +dynamic onSave() - -dynamic _applyAndSaveSubform() + + + Exception - - - - - + + + - - - InterventionsFormViewModel + + + FormValidationSetEnum - - - +study: Study - +router: GoRouter - +interventionsArray: FormArray<dynamic> - +interventionsCollection: FormViewModelCollection<InterventionFormViewModel, InterventionFormData> - +form: FormGroup - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +interventionsRequired: dynamic - +titles: Map<FormMode, String> - +canTestStudySchedule: bool - - + + + + + + - - - +void setControlsFrom() - +InterventionsFormData buildFormData() - +void read() - +List<ModelAction<dynamic>> availableActions() - +List<ModelAction<dynamic>> availablePopupActions() - +List<ModelAction<dynamic>> availableInlineActions() - +void onSelectItem() - +void onNewItem() - +InterventionFormViewModel provide() - +void onCancel() - +dynamic onSave() - +dynamic testStudySchedule() + + + FormControlValidation - - - - - - - - - - StudyScheduleControls + + + +control: AbstractControl<dynamic> + +validators: List<Validator<dynamic>> + +asyncValidators: List<AsyncValidator<dynamic>>? + +validationMessages: Map<String, String Function(Object)> - - - <static>+defaultScheduleType: PhaseSequence - <static>+defaultScheduleTypeSequence: String - <static>+defaultNumCycles: int - <static>+defaultPeriodLength: int - +sequenceTypeControl: FormControl<PhaseSequence> - +sequenceTypeCustomControl: FormControl<String> - +phaseDurationControl: FormControl<int> - +numCyclesControl: FormControl<int> - +includeBaselineControl: FormControl<bool> - +studyScheduleControls: Map<String, FormControl<Object>> - <static>+kNumCyclesMin: int - <static>+kNumCyclesMax: int - <static>+kPhaseDurationMin: int - <static>+kPhaseDurationMax: int - +sequenceTypeControlOptions: List<FormControlOption<PhaseSequence>> - +studyScheduleValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +numCyclesRange: dynamic - +phaseDurationRange: dynamic - +customSequenceRequired: dynamic + + + +FormControlValidation merge() - - - +void setStudyScheduleControlsFrom() - +StudyScheduleFormData buildStudyScheduleFormData() - +bool isSequencingCustom() + + + + + + + + AbstractControl - - - + + + - - - PhaseSequence + + + FormInvalidException - - - - + + + + - - - StudyDesignInterventionsFormView + + + FormConfigException - - - +Widget build() + + + +message: String? - - - - - + + + + - - - InterventionFormViewModel + + + FormControlOption - - - +study: Study - +interventionIdControl: FormControl<String> - +interventionTitleControl: FormControl<String> - +interventionIconControl: FormControl<IconOption> - +interventionDescriptionControl: FormControl<String> - +interventionTasksArray: FormArray<dynamic> - +tasksCollection: FormViewModelCollection<InterventionTaskFormViewModel, InterventionTaskFormData> - +form: FormGroup - +interventionId: String - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titleRequired: dynamic - +atLeastOneTask: dynamic - +breadcrumbsTitle: String - +titles: Map<FormMode, String> + + + +value: T + +label: String + +description: String? + +props: List<Object?> - - - +void setControlsFrom() - +InterventionFormData buildFormData() - +List<ModelAction<dynamic>> availableActions() - +List<ModelAction<dynamic>> availablePopupActions() - +List<ModelAction<dynamic>> availableInlineActions() - +void onSelectItem() - +void onNewItem() - +void onCancel() - +dynamic onSave() - +InterventionTaskFormViewModel provide() - +InterventionTaskFormRouteArgs buildNewFormRouteArgs() - +InterventionTaskFormRouteArgs buildFormRouteArgs() - +InterventionFormViewModel createDuplicate() + + + + + + + + Equatable - - - - - + + + + - - - StudyScheduleFormView + + + FormMode - - - +formViewModel: StudyScheduleControls + + + +index: int + <static>+values: List<FormMode> + <static>+create: FormMode + <static>+readonly: FormMode + <static>+edit: FormMode - - - -FormTableRow _renderCustomSequence() - +Widget build() + + + + + + + + Debouncer - - - - - + + + - - - StudyScheduleFormData + + + CancelableOperation - - - +sequenceType: PhaseSequence - +sequenceTypeCustom: String - +numCycles: int - +phaseDuration: int - +includeBaseline: bool - +id: String + + + + + + + + + + CustomFormControl - - - +StudySchedule toStudySchedule() - +Study apply() - +StudyScheduleFormData copy() + + + -_onValueChangedDebouncer: Debouncer? + -_onStatusChangedDebouncer: Debouncer? + +onValueChanged: void Function(T?)? + +onStatusChanged: void Function(ControlStatus)? + +onStatusChangedDebounceTime: int? + +onValueChangedDebounceTime: int? - - - - - - - - - InterventionFormView + + + +void dispose() - - - +formViewModel: InterventionFormViewModel + + + + + + + + void Function(T?)? - - - - - + + + - - - InterventionTaskFormData + + + void Function(ControlStatus)? - - - +taskId: String - +taskTitle: String - +taskDescription: String? - <static>+kDefaultTitle: String - +id: String + + + + + + + + + UnsavedChangesDialog - - - +CheckmarkTask toTask() - +InterventionTaskFormData copy() + + + +Widget build() - - - - - + + + + + - - - InterventionPreview + + + FormArrayTable - - - +routeArgs: InterventionFormRouteArgs + + + +control: AbstractControl<dynamic> + +items: List<T> + +onSelectItem: void Function(T) + +getActionsAt: List<ModelAction<dynamic>> Function(T, int) + +onNewItem: void Function()? + +rowTitle: String Function(T) + +onNewItemLabel: String + +sectionTitle: String? + +sectionDescription: String? + +emptyIcon: IconData? + +emptyTitle: String? + +emptyDescription: String? + +sectionTitleDivider: bool? + +rowPrefix: Widget Function(BuildContext, T, int)? + +rowSuffix: Widget Function(BuildContext, T, int)? + +leadingWidget: Widget? + +itemsSectionPadding: EdgeInsets? + +hideLeadingTrailingWhenEmpty: bool + <static>+columns: List<StandardTableColumn> - - - +Widget build() + + + +Widget build() + -List<Widget> _buildRow() + -Widget _newItemButton() - - - + + + - - - InterventionFormRouteArgs + + + void Function(T) - - - - + + + - - - InterventionTaskFormView + + + List<ModelAction<dynamic>> Function(T, int) - - - +formViewModel: InterventionTaskFormViewModel + + + + + + + + String Function(T) - - - - - + + + - - - InterventionTaskFormViewModel + + + Widget Function(BuildContext, T, int)? - - - +taskIdControl: FormControl<String> - +instanceIdControl: FormControl<String> - +taskTitleControl: FormControl<String> - +taskDescriptionControl: FormControl<String> - +markAsCompletedControl: FormControl<bool> - +form: FormGroup - +taskId: String - +instanceId: String - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titleRequired: dynamic - +titles: Map<FormMode, String> - - + + + + - - - +void setControlsFrom() - +InterventionTaskFormData buildFormData() - +InterventionTaskFormViewModel createDuplicate() + + + App - - - - - + + + - - - InterventionsFormData + + + AppContent - - - +interventionsData: List<InterventionFormData> - +studyScheduleData: StudyScheduleFormData - +id: String + + + + + + + + + StudyMonitorScreen - - - +Study apply() - +InterventionsFormData copy() + + + +Widget build() - - - - - + + + + + - - - InterventionFormData + + + DrawerEntry - - - +interventionId: String - +title: String - +description: String? - +tasksData: List<InterventionTaskFormData>? - +iconName: String? - <static>+kDefaultTitle: String - +id: String + + + +localizedTitle: String Function() + +icon: IconData? + +localizedHelpText: String Function()? + +enabled: bool + +onSelected: void Function(BuildContext, WidgetRef)? + +title: String + +helpText: String? - - - +Intervention toIntervention() - +InterventionFormData copy() + + + +void onClick() - - - - + + + - - - AccountSettingsDialog + + + String Function() - - - +Widget build() + + + + + + + + String Function()? - - - - + + + - - - AppStatus + + + void Function(BuildContext, WidgetRef)? - - - +index: int - <static>+values: List<AppStatus> - <static>+initializing: AppStatus - <static>+initialized: AppStatus + + + + + + + + + + GoRouterDrawerEntry - - - - - - - - - IAppDelegate + + + +intent: RoutingIntent - - - +dynamic onAppStart() + + + +void onClick() - - - - - + + + - - - AppController + + + RoutingIntent - - - +sharedPreferences: SharedPreferences - +appDelegates: List<IAppDelegate> - -_delayedFuture: dynamic - +isInitialized: dynamic + + + + + + + + + AppDrawer - - - +dynamic onAppStart() - -dynamic _callDelegates() + + + +title: String + +width: int + +leftPaddingEntries: double + +logoPaddingVertical: double + +logoPaddingHorizontal: double + +logoMaxHeight: double + +logoSectionMinHeight: double + +logoSectionMaxHeight: double diff --git a/docs/uml/designer_v2/lib/uml.svg b/docs/uml/designer_v2/lib/uml.svg index caf4b1968..d471e6d24 100644 --- a/docs/uml/designer_v2/lib/uml.svg +++ b/docs/uml/designer_v2/lib/uml.svg @@ -1,189 +1,447 @@ - - [Notifications + + [LanguagePicker | - <static>+passwordReset: SnackbarIntent; - <static>+passwordResetSuccess: SnackbarIntent; - <static>+studyDeleted: SnackbarIntent; - <static>+inviteCodeDeleted: SnackbarIntent; - <static>+inviteCodeClipped: SnackbarIntent; - <static>+studyDeleteConfirmation: AlertIntent + +languagePickerType: LanguagePickerType; + +iconColor: Color?; + +offset: Offset? ] - [Notifications]o-[SnackbarIntent] - [Notifications]o-[AlertIntent] + [LanguagePicker]o-[LanguagePickerType] + [LanguagePicker]o-[Color] + [LanguagePicker]o-[Offset] - [NotificationDefaultActions + [LanguagePickerType | - <static>+cancel: NotificationAction + +index: int; + <static>+values: List<LanguagePickerType>; + <static>+field: LanguagePickerType; + <static>+icon: LanguagePickerType ] - [NotificationDefaultActions]o-[NotificationAction] + [LanguagePickerType]o-[LanguagePickerType] + [Enum]<:--[LanguagePickerType] - [<abstract>INotificationService + [PlatformLocaleMobile | - +void showMessage(); - +void show(); - +Stream<NotificationIntent> watchNotifications(); - +void dispose() + +Locale getPlatformLocale() ] - [NotificationService + [<abstract>PlatformLocale]<:--[PlatformLocaleMobile] + + [<abstract>PlatformLocale | - -_streamController: BehaviorSubject<NotificationIntent> + +Locale getPlatformLocale() + ] + + [PlatformLocaleWeb | - +Stream<NotificationIntent> watchNotifications(); - +void showMessage(); - +void show(); - +void dispose() + +Locale getPlatformLocale() ] - [NotificationService]o-[BehaviorSubject] - [<abstract>INotificationService]<:--[NotificationService] + [<abstract>PlatformLocale]<:--[PlatformLocaleWeb] - [NotificationDispatcher + [AppTranslation | - +child: Widget?; - +snackbarInnerPadding: double; - +snackbarWidth: double?; - +snackbarBehavior: SnackBarBehavior; - +snackbarDefaultDuration: int + <static>+dynamic init() ] - [NotificationDispatcher]o-[<abstract>Widget] - [NotificationDispatcher]o-[SnackBarBehavior] + [<abstract>ResultTypes + ] - [<abstract>NotificationIntent - | - +message: String?; - +customContent: Widget?; - +icon: IconData?; - +actions: List<NotificationAction>?; - +type: NotificationType + [MeasurementResultTypes | - +void register() + <static>+questionnaire: String; + <static>+values: List<String> ] - [<abstract>NotificationIntent]o-[<abstract>Widget] - [<abstract>NotificationIntent]o-[IconData] - [<abstract>NotificationIntent]o-[NotificationType] + [<abstract>ResultTypes]<:-[MeasurementResultTypes] - [NotificationAction + [InterventionResultTypes | - +label: String; - +onSelect: dynamic Function(); - +isDestructive: bool + <static>+checkmarkTask: String; + <static>+values: List<String> ] - [NotificationAction]o-[dynamic Function()] + [<abstract>ResultTypes]<:-[InterventionResultTypes] - [SnackbarIntent + [StudyExportData | - +duration: int? + +study: Study; + +measurementsData: List<Map<String, dynamic>>; + +interventionsData: List<Map<String, dynamic>>; + +isEmpty: bool ] - [<abstract>NotificationIntent]<:-[SnackbarIntent] + [StudyExportData]o-[Study] - [AlertIntent + [StudyTemplates | - +title: String; - +dismissOnAction: bool; - +isDestructive: dynamic + <static>+kUnnamedStudyTitle: String + | + <static>+Study emptyDraft() ] - [<abstract>NotificationIntent]<:-[AlertIntent] - - [NotificationType + [StudyActionType | +index: int; - <static>+values: List<NotificationType>; - <static>+snackbar: NotificationType; - <static>+alert: NotificationType; - <static>+custom: NotificationType + <static>+values: List<StudyActionType>; + <static>+pin: StudyActionType; + <static>+pinoff: StudyActionType; + <static>+edit: StudyActionType; + <static>+duplicate: StudyActionType; + <static>+duplicateDraft: StudyActionType; + <static>+addCollaborator: StudyActionType; + <static>+export: StudyActionType; + <static>+delete: StudyActionType ] - [NotificationType]o-[NotificationType] - [Enum]<:--[NotificationType] + [StudyActionType]o-[StudyActionType] + [Enum]<:--[StudyActionType] - [<abstract>IClipboardService + [DropdownMenuItemTheme | - +dynamic copy() + +iconTheme: IconThemeData? ] - [ClipboardService + [DropdownMenuItemTheme]o-[IconThemeData] + [<abstract>Diagnosticable]<:-[DropdownMenuItemTheme] + + [ThemeConfig | - +dynamic copy() + <static>+kMinContentWidth: double; + <static>+kMaxContentWidth: double; + <static>+kHoverFadeFactor: double; + <static>+kMuteFadeFactor: double + | + <static>+dynamic bodyBackgroundColor(); + <static>+Color modalBarrierColor(); + <static>+Color containerColor(); + <static>+Color colorPickerInitialColor(); + <static>+TextStyle bodyTextMuted(); + <static>+TextStyle bodyTextBackground(); + <static>+double iconSplashRadius(); + <static>+Color sidesheetBackgroundColor(); + <static>+InputDecorationTheme dropdownInputDecorationTheme(); + <static>+DropdownMenuItemTheme dropdownMenuItemTheme() ] - [<abstract>IClipboardService]<:--[ClipboardService] + [NoAnimationPageTransitionsBuilder + | + +Widget buildTransitions() + ] - [<abstract>IAppRepository + [<abstract>PageTransitionsBuilder]<:-[NoAnimationPageTransitionsBuilder] + + [WebTransitionBuilder | - +dynamic fetchAppConfig(); - +void dispose() + +Widget buildTransitions() ] - [AppRepository + [<abstract>PageTransitionsBuilder]<:-[WebTransitionBuilder] + + [ThemeSettingChange | - +apiClient: StudyUApi + +settings: ThemeSettings + ] + + [ThemeSettingChange]o-[ThemeSettings] + [<abstract>Notification]<:-[ThemeSettingChange] + + [ThemeProvider | - +dynamic fetchAppConfig(); - +void dispose() + +settings: ValueNotifier<ThemeSettings>; + +lightDynamic: ColorScheme?; + +darkDynamic: ColorScheme?; + +pageTransitionsTheme: PageTransitionsTheme; + +shapeMedium: ShapeBorder + | + +Color custom(); + +Color blend(); + +Color source(); + +ColorScheme colors(); + +CardTheme cardTheme(); + +ListTileThemeData listTileTheme(); + +AppBarTheme appBarTheme(); + +SnackBarThemeData snackBarThemeData(); + +TabBarTheme tabBarTheme(); + +BottomAppBarTheme bottomAppBarTheme(); + +BottomNavigationBarThemeData bottomNavigationBarTheme(); + +SwitchThemeData switchTheme(); + +InputDecorationTheme inputDecorationTheme(); + +TextTheme textTheme(); + +DividerThemeData dividerTheme(); + +NavigationRailThemeData navigationRailTheme(); + +DrawerThemeData drawerTheme(); + +IconThemeData iconTheme(); + +CheckboxThemeData checkboxTheme(); + +RadioThemeData radioTheme(); + +TooltipThemeData tooltipTheme(); + +ThemeData light(); + +ThemeData dark(); + +ThemeMode themeMode(); + +ThemeData theme(); + <static>+ThemeProvider of(); + +bool updateShouldNotify() ] - [AppRepository]o-[<abstract>StudyUApi] - [<abstract>IAppRepository]<:--[AppRepository] + [ThemeProvider]o-[ValueNotifier] + [ThemeProvider]o-[ColorScheme] + [ThemeProvider]o-[PageTransitionsTheme] + [ThemeProvider]o-[<abstract>ShapeBorder] + [<abstract>InheritedWidget]<:-[ThemeProvider] - [<abstract>SupabaseClientDependant + [ThemeSettings | - +supabaseClient: SupabaseClient + +sourceColor: Color; + +themeMode: ThemeMode ] - [<abstract>SupabaseClientDependant]o-[SupabaseClient] + [ThemeSettings]o-[Color] + [ThemeSettings]o-[ThemeMode] - [SupabaseQueryError + [CustomColor | - +statusCode: String?; - +message: String; - +details: dynamic + +name: String; + +color: Color; + +blend: bool + | + +Color value() ] - [Exception]<:--[SupabaseQueryError] + [CustomColor]o-[Color] - [<abstract>SupabaseQueryMixin + [Config | - +dynamic deleteAll(); - +dynamic getAll(); - +dynamic getById(); - +dynamic getByColumn(); - +List<T> deserializeList(); - +T deserializeObject() + <static>+isDebugMode: bool; + <static>+defaultLocale: Set<String>; + <static>+supportedLocales: Map<String, String>; + <static>+newStudyId: String; + <static>+newModelId: String; + <static>+minSplashTime: int; + <static>+formAutosaveDebounce: int ] - [<abstract>ModelEvent + [Assets | - +modelId: String; - +model: T + <static>+logoWide: String ] - [IsFetched + [StudyLaunched ] - [<abstract>ModelEvent]<:-[IsFetched] + [<abstract>ModelEvent]<:-[StudyLaunched] - [IsSaving + [<abstract>IInviteCodeRepository + | + +dynamic isCodeAlreadyUsed() ] - [<abstract>ModelEvent]<:-[IsSaving] + [<abstract>ModelRepository]<:--[<abstract>IInviteCodeRepository] - [IsSaved + [InviteCodeRepository + | + +studyId: String; + +ref: ProviderRef<dynamic>; + +apiClient: StudyUApi; + +authRepository: IAuthRepository; + +studyRepository: IStudyRepository; + +study: Study + | + +String getKey(); + +dynamic isCodeAlreadyUsed(); + +List<ModelAction<dynamic>> availableActions(); + +dynamic emitUpdate() ] - [<abstract>ModelEvent]<:-[IsSaved] + [InviteCodeRepository]o-[<abstract>ProviderRef] + [InviteCodeRepository]o-[<abstract>StudyUApi] + [InviteCodeRepository]o-[<abstract>IAuthRepository] + [InviteCodeRepository]o-[<abstract>IStudyRepository] + [InviteCodeRepository]o-[Study] + [<abstract>ModelRepository]<:-[InviteCodeRepository] + [<abstract>IInviteCodeRepository]<:--[InviteCodeRepository] - [IsDeleted + [InviteCodeRepositoryDelegate + | + +study: Study; + +apiClient: StudyUApi; + +studyRepository: IStudyRepository + | + +dynamic fetch(); + +dynamic fetchAll(); + +dynamic save(); + +dynamic delete(); + +dynamic onError(); + +StudyInvite createDuplicate(); + +StudyInvite createNewInstance() ] - [<abstract>ModelEvent]<:-[IsDeleted] + [InviteCodeRepositoryDelegate]o-[Study] + [InviteCodeRepositoryDelegate]o-[<abstract>StudyUApi] + [InviteCodeRepositoryDelegate]o-[<abstract>IStudyRepository] + [<abstract>IModelRepositoryDelegate]<:-[InviteCodeRepositoryDelegate] + + [<abstract>IAuthRepository + | + +allowPasswordReset: bool; + +currentUser: User?; + +isLoggedIn: bool; + +session: Session? + | + +dynamic signUp(); + +dynamic signInWith(); + +dynamic signOut(); + +dynamic resetPasswordForEmail(); + +dynamic updateUser(); + +void dispose() + ] + + [<abstract>IAuthRepository]o-[User] + [<abstract>IAuthRepository]o-[Session] + [<abstract>IAppDelegate]<:-[<abstract>IAuthRepository] + + [AuthRepository + | + <static>+PERSIST_SESSION_KEY: String; + +supabaseClient: SupabaseClient; + +sharedPreferences: SharedPreferences; + +allowPasswordReset: bool; + +authClient: GoTrueClient; + +session: Session?; + +currentUser: User?; + +isLoggedIn: bool + | + -void _registerAuthListener(); + +dynamic signUp(); + +dynamic signInWith(); + +dynamic signOut(); + +dynamic resetPasswordForEmail(); + +dynamic updateUser(); + -dynamic _persistSession(); + -dynamic _resetPersistedSession(); + -dynamic _recoverSession(); + +void dispose(); + +dynamic onAppStart() + ] + + [AuthRepository]o-[SupabaseClient] + [AuthRepository]o-[SharedPreferences] + [AuthRepository]o-[GoTrueClient] + [AuthRepository]o-[Session] + [AuthRepository]o-[User] + [<abstract>IAuthRepository]<:--[AuthRepository] + + [<abstract>IUserRepository + | + +user: StudyUUser + | + +dynamic fetchUser(); + +dynamic saveUser(); + +dynamic updatePreferences() + ] + + [<abstract>IUserRepository]o-[StudyUUser] + + [UserRepository + | + +apiClient: StudyUApi; + +authRepository: IAuthRepository; + +ref: Ref<Object?>; + +user: StudyUUser + | + +dynamic fetchUser(); + +dynamic saveUser(); + +dynamic updatePreferences() + ] + + [UserRepository]o-[<abstract>StudyUApi] + [UserRepository]o-[<abstract>IAuthRepository] + [UserRepository]o-[<abstract>Ref] + [UserRepository]o-[StudyUUser] + [<abstract>IUserRepository]<:--[UserRepository] + + [PreferenceAction + | + +index: int; + <static>+values: List<PreferenceAction>; + <static>+pin: PreferenceAction; + <static>+pinOff: PreferenceAction + ] + + [PreferenceAction]o-[PreferenceAction] + [Enum]<:--[PreferenceAction] + + [<abstract>SupabaseClientDependant + | + +supabaseClient: SupabaseClient + ] + + [<abstract>SupabaseClientDependant]o-[SupabaseClient] + + [SupabaseQueryError + | + +statusCode: String?; + +message: String; + +details: dynamic + ] + + [Exception]<:--[SupabaseQueryError] + + [<abstract>SupabaseQueryMixin + | + +dynamic deleteAll(); + +dynamic getAll(); + +dynamic getById(); + +dynamic getByColumn(); + +List<T> deserializeList(); + +T deserializeObject() + ] + + [<abstract>IStudyRepository + | + +dynamic launch(); + +dynamic deleteParticipants() + ] + + [<abstract>ModelRepository]<:--[<abstract>IStudyRepository] + + [StudyRepository + | + +apiClient: StudyUApi; + +authRepository: IAuthRepository; + +ref: ProviderRef<dynamic>; + +sortCallback: void Function()? + | + +String getKey(); + +dynamic deleteParticipants(); + +dynamic launch(); + +List<ModelAction<dynamic>> availableActions() + ] + + [StudyRepository]o-[<abstract>StudyUApi] + [StudyRepository]o-[<abstract>IAuthRepository] + [StudyRepository]o-[<abstract>ProviderRef] + [StudyRepository]o-[void Function()?] + [<abstract>ModelRepository]<:-[StudyRepository] + [<abstract>IStudyRepository]<:--[StudyRepository] + + [StudyRepositoryDelegate + | + +apiClient: StudyUApi; + +authRepository: IAuthRepository + | + +dynamic fetchAll(); + +dynamic fetch(); + +dynamic save(); + +dynamic delete(); + +dynamic onError(); + +Study createNewInstance(); + +Study createDuplicate() + ] + + [StudyRepositoryDelegate]o-[<abstract>StudyUApi] + [StudyRepositoryDelegate]o-[<abstract>IAuthRepository] + [<abstract>IModelRepositoryDelegate]<:-[StudyRepositoryDelegate] [WrappedModel | @@ -379,675 +637,600 @@ [<abstract>SupabaseQueryMixin]<:-[StudyUApiClient] [<abstract>StudyUApi]<:--[StudyUApiClient] - [StudyLaunched + [<abstract>ModelEvent + | + +modelId: String; + +model: T ] - [<abstract>ModelEvent]<:-[StudyLaunched] + [IsFetched + ] - [<abstract>IInviteCodeRepository - | - +dynamic isCodeAlreadyUsed() + [<abstract>ModelEvent]<:-[IsFetched] + + [IsSaving ] - [<abstract>ModelRepository]<:--[<abstract>IInviteCodeRepository] + [<abstract>ModelEvent]<:-[IsSaving] - [InviteCodeRepository - | - +studyId: String; - +ref: ProviderRef<dynamic>; - +apiClient: StudyUApi; - +authRepository: IAuthRepository; - +studyRepository: IStudyRepository; - +study: Study - | - +String getKey(); - +dynamic isCodeAlreadyUsed(); - +List<ModelAction<dynamic>> availableActions(); - +dynamic emitUpdate() + [IsSaved ] - [InviteCodeRepository]o-[<abstract>ProviderRef] - [InviteCodeRepository]o-[<abstract>StudyUApi] - [InviteCodeRepository]o-[<abstract>IAuthRepository] - [InviteCodeRepository]o-[<abstract>IStudyRepository] - [InviteCodeRepository]o-[Study] - [<abstract>ModelRepository]<:-[InviteCodeRepository] - [<abstract>IInviteCodeRepository]<:--[InviteCodeRepository] + [<abstract>ModelEvent]<:-[IsSaved] - [InviteCodeRepositoryDelegate + [IsDeleted + ] + + [<abstract>ModelEvent]<:-[IsDeleted] + + [<abstract>IAppRepository | - +study: Study; - +apiClient: StudyUApi; - +studyRepository: IStudyRepository + +dynamic fetchAppConfig(); + +void dispose() + ] + + [AppRepository | - +dynamic fetch(); - +dynamic fetchAll(); - +dynamic save(); - +dynamic delete(); - +dynamic onError(); - +StudyInvite createDuplicate(); - +StudyInvite createNewInstance() + +apiClient: StudyUApi + | + +dynamic fetchAppConfig(); + +void dispose() ] - [InviteCodeRepositoryDelegate]o-[Study] - [InviteCodeRepositoryDelegate]o-[<abstract>StudyUApi] - [InviteCodeRepositoryDelegate]o-[<abstract>IStudyRepository] - [<abstract>IModelRepositoryDelegate]<:-[InviteCodeRepositoryDelegate] + [AppRepository]o-[<abstract>StudyUApi] + [<abstract>IAppRepository]<:--[AppRepository] - [<abstract>IStudyRepository + [RoutingIntents | - +dynamic launch(); - +dynamic deleteParticipants() + <static>+root: RoutingIntent; + <static>+studies: RoutingIntent; + <static>+studiesShared: RoutingIntent; + <static>+publicRegistry: RoutingIntent; + <static>+study: RoutingIntent Function(String); + <static>+studyEdit: RoutingIntent Function(String); + <static>+studyEditInfo: RoutingIntent Function(String); + <static>+studyEditEnrollment: RoutingIntent Function(String); + <static>+studyEditInterventions: RoutingIntent Function(String); + <static>+studyEditIntervention: RoutingIntent Function(String, String); + <static>+studyEditMeasurements: RoutingIntent Function(String); + <static>+studyEditReports: RoutingIntent Function(String); + <static>+studyEditMeasurement: RoutingIntent Function(String, String); + <static>+studyTest: RoutingIntent Function(String, {String? appRoute}); + <static>+studyRecruit: RoutingIntent Function(String); + <static>+studyMonitor: RoutingIntent Function(String); + <static>+studyAnalyze: RoutingIntent Function(String); + <static>+studySettings: RoutingIntent Function(String); + <static>+accountSettings: RoutingIntent; + <static>+studyNew: RoutingIntent; + <static>+login: RoutingIntent; + <static>+signup: RoutingIntent; + <static>+passwordForgot: RoutingIntent; + <static>+passwordForgot2: RoutingIntent Function(String); + <static>+passwordRecovery: RoutingIntent; + <static>+error: RoutingIntent Function(Exception) ] - [<abstract>ModelRepository]<:--[<abstract>IStudyRepository] + [RoutingIntents]o-[RoutingIntent] + [RoutingIntents]o-[RoutingIntent Function(String)] + [RoutingIntents]o-[RoutingIntent Function(String, String)] + [RoutingIntents]o-[RoutingIntent Function(String, {String? appRoute})] + [RoutingIntents]o-[RoutingIntent Function(Exception)] - [StudyRepository + [RoutingIntent | - +apiClient: StudyUApi; - +authRepository: IAuthRepository; - +ref: ProviderRef<dynamic>; - +sortCallback: void Function()? + +route: GoRoute; + +params: Map<String, String>; + +queryParams: Map<String, String>; + +dispatch: RoutingIntentDispatch?; + +extra: Object?; + +routeName: String; + +arguments: Map<String, String>; + +props: List<Object?> | - +String getKey(); - +dynamic deleteParticipants(); - +dynamic launch(); - +List<ModelAction<dynamic>> availableActions() + -dynamic _validateRoute(); + +bool matches() ] - [StudyRepository]o-[<abstract>StudyUApi] - [StudyRepository]o-[<abstract>IAuthRepository] - [StudyRepository]o-[<abstract>ProviderRef] - [StudyRepository]o-[void Function()?] - [<abstract>ModelRepository]<:-[StudyRepository] - [<abstract>IStudyRepository]<:--[StudyRepository] + [RoutingIntent]o-[GoRoute] + [RoutingIntent]o-[RoutingIntentDispatch] + [<abstract>Equatable]<:-[RoutingIntent] - [StudyRepositoryDelegate - | - +apiClient: StudyUApi; - +authRepository: IAuthRepository + [RoutingIntentDispatch | - +dynamic fetchAll(); - +dynamic fetch(); - +dynamic save(); - +dynamic delete(); - +dynamic onError(); - +Study createNewInstance(); - +Study createDuplicate() + +index: int; + <static>+values: List<RoutingIntentDispatch>; + <static>+go: RoutingIntentDispatch; + <static>+push: RoutingIntentDispatch ] - [StudyRepositoryDelegate]o-[<abstract>StudyUApi] - [StudyRepositoryDelegate]o-[<abstract>IAuthRepository] - [<abstract>IModelRepositoryDelegate]<:-[StudyRepositoryDelegate] + [RoutingIntentDispatch]o-[RoutingIntentDispatch] + [Enum]<:--[RoutingIntentDispatch] - [<abstract>IAuthRepository - | - +allowPasswordReset: bool; - +currentUser: User?; - +isLoggedIn: bool; - +session: Session? + [RouterKeys | - +dynamic signUp(); - +dynamic signInWith(); - +dynamic signOut(); - +dynamic resetPasswordForEmail(); - +dynamic updateUser(); - +void dispose() + <static>+studyKey: ValueKey<String>; + <static>+authKey: ValueKey<String> ] - [<abstract>IAuthRepository]o-[User] - [<abstract>IAuthRepository]o-[Session] - [<abstract>IAppDelegate]<:-[<abstract>IAuthRepository] + [RouterKeys]o-[ValueKey] - [AuthRepository - | - <static>+PERSIST_SESSION_KEY: String; - +supabaseClient: SupabaseClient; - +sharedPreferences: SharedPreferences; - +allowPasswordReset: bool; - +authClient: GoTrueClient; - +session: Session?; - +currentUser: User?; - +isLoggedIn: bool + [RouteParams | - -void _registerAuthListener(); - +dynamic signUp(); - +dynamic signInWith(); - +dynamic signOut(); - +dynamic resetPasswordForEmail(); - +dynamic updateUser(); - -dynamic _persistSession(); - -dynamic _resetPersistedSession(); - -dynamic _recoverSession(); - +void dispose(); - +dynamic onAppStart() + <static>+studiesFilter: String; + <static>+studyId: String; + <static>+measurementId: String; + <static>+interventionId: String; + <static>+testAppRoute: String ] - [AuthRepository]o-[SupabaseClient] - [AuthRepository]o-[SharedPreferences] - [AuthRepository]o-[GoTrueClient] - [AuthRepository]o-[Session] - [AuthRepository]o-[User] - [<abstract>IAuthRepository]<:--[AuthRepository] - - [<abstract>IUserRepository + [RouterConf | - +user: StudyUUser + <static>+router: GoRouter; + <static>+routes: List<GoRoute>; + <static>+publicRoutes: List<GoRoute>; + <static>+privateRoutes: List<GoRoute> | - +dynamic fetchUser(); - +dynamic saveUser(); - +dynamic updatePreferences() + <static>+GoRoute route() ] - [<abstract>IUserRepository]o-[StudyUUser] + [RouterConf]o-[GoRouter] - [UserRepository - | - +apiClient: StudyUApi; - +authRepository: IAuthRepository; - +ref: Ref<Object?>; - +user: StudyUUser + [<abstract>StudyFormRouteArgs | - +dynamic fetchUser(); - +dynamic saveUser(); - +dynamic updatePreferences() + +studyId: String ] - [UserRepository]o-[<abstract>StudyUApi] - [UserRepository]o-[<abstract>IAuthRepository] - [UserRepository]o-[<abstract>Ref] - [UserRepository]o-[StudyUUser] - [<abstract>IUserRepository]<:--[UserRepository] - - [PreferenceAction + [<abstract>QuestionFormRouteArgs | - +index: int; - <static>+values: List<PreferenceAction>; - <static>+pin: PreferenceAction; - <static>+pinOff: PreferenceAction + +questionId: String ] - [PreferenceAction]o-[PreferenceAction] - [Enum]<:--[PreferenceAction] + [<abstract>StudyFormRouteArgs]<:-[<abstract>QuestionFormRouteArgs] - [<abstract>ResultTypes + [ScreenerQuestionFormRouteArgs ] - [MeasurementResultTypes + [<abstract>QuestionFormRouteArgs]<:-[ScreenerQuestionFormRouteArgs] + + [ConsentItemFormRouteArgs | - <static>+questionnaire: String; - <static>+values: List<String> + +consentId: String ] - [<abstract>ResultTypes]<:-[MeasurementResultTypes] + [<abstract>StudyFormRouteArgs]<:-[ConsentItemFormRouteArgs] - [InterventionResultTypes + [MeasurementFormRouteArgs | - <static>+checkmarkTask: String; - <static>+values: List<String> + +measurementId: String ] - [<abstract>ResultTypes]<:-[InterventionResultTypes] + [<abstract>StudyFormRouteArgs]<:-[MeasurementFormRouteArgs] - [StudyExportData + [SurveyQuestionFormRouteArgs | - +study: Study; - +measurementsData: List<Map<String, dynamic>>; - +interventionsData: List<Map<String, dynamic>>; - +isEmpty: bool + +questionId: String ] - [StudyExportData]o-[Study] + [MeasurementFormRouteArgs]<:-[SurveyQuestionFormRouteArgs] + [<abstract>QuestionFormRouteArgs]<:--[SurveyQuestionFormRouteArgs] - [StudyTemplates - | - <static>+kUnnamedStudyTitle: String + [InterventionFormRouteArgs | - <static>+Study emptyDraft() + +interventionId: String ] - [StudyActionType + [<abstract>StudyFormRouteArgs]<:-[InterventionFormRouteArgs] + + [InterventionTaskFormRouteArgs | - +index: int; - <static>+values: List<StudyActionType>; - <static>+pin: StudyActionType; - <static>+pinoff: StudyActionType; - <static>+edit: StudyActionType; - <static>+duplicate: StudyActionType; - <static>+duplicateDraft: StudyActionType; - <static>+addCollaborator: StudyActionType; - <static>+export: StudyActionType; - <static>+delete: StudyActionType + +taskId: String ] - [StudyActionType]o-[StudyActionType] - [Enum]<:--[StudyActionType] + [InterventionFormRouteArgs]<:-[InterventionTaskFormRouteArgs] - [DropdownMenuItemTheme + [ReportItemFormRouteArgs | - +iconTheme: IconThemeData? + +sectionId: String ] - [DropdownMenuItemTheme]o-[IconThemeData] - [<abstract>Diagnosticable]<:-[DropdownMenuItemTheme] + [<abstract>StudyFormRouteArgs]<:-[ReportItemFormRouteArgs] - [ThemeConfig - | - <static>+kMinContentWidth: double; - <static>+kMaxContentWidth: double; - <static>+kHoverFadeFactor: double; - <static>+kMuteFadeFactor: double + [<abstract>GoRouteParamEnum | - <static>+dynamic bodyBackgroundColor(); - <static>+Color modalBarrierColor(); - <static>+Color containerColor(); - <static>+Color colorPickerInitialColor(); - <static>+TextStyle bodyTextMuted(); - <static>+TextStyle bodyTextBackground(); - <static>+double iconSplashRadius(); - <static>+Color sidesheetBackgroundColor(); - <static>+InputDecorationTheme dropdownInputDecorationTheme(); - <static>+DropdownMenuItemTheme dropdownMenuItemTheme() + +String toRouteParam(); + +String toShortString() ] - [NoAnimationPageTransitionsBuilder + [PublishConfirmationDialog | - +Widget buildTransitions() + +Widget build() ] - [<abstract>PageTransitionsBuilder]<:-[NoAnimationPageTransitionsBuilder] + [<abstract>StudyPageWidget]<:-[PublishConfirmationDialog] - [WebTransitionBuilder + [PublishSuccessDialog | - +Widget buildTransitions() + +Widget build() ] - [<abstract>PageTransitionsBuilder]<:-[WebTransitionBuilder] + [<abstract>StudyPageWidget]<:-[PublishSuccessDialog] - [ThemeSettingChange + [PublishDialog | - +settings: ThemeSettings + +Widget build() ] - [ThemeSettingChange]o-[ThemeSettings] - [<abstract>Notification]<:-[ThemeSettingChange] + [<abstract>StudyPageWidget]<:-[PublishDialog] - [ThemeProvider - | - +settings: ValueNotifier<ThemeSettings>; - +lightDynamic: ColorScheme?; - +darkDynamic: ColorScheme?; - +pageTransitionsTheme: PageTransitionsTheme; - +shapeMedium: ShapeBorder + [StudyAnalyzeScreen | - +Color custom(); - +Color blend(); - +Color source(); - +ColorScheme colors(); - +CardTheme cardTheme(); - +ListTileThemeData listTileTheme(); - +AppBarTheme appBarTheme(); - +SnackBarThemeData snackBarThemeData(); - +TabBarTheme tabBarTheme(); - +BottomAppBarTheme bottomAppBarTheme(); - +BottomNavigationBarThemeData bottomNavigationBarTheme(); - +SwitchThemeData switchTheme(); - +InputDecorationTheme inputDecorationTheme(); - +TextTheme textTheme(); - +DividerThemeData dividerTheme(); - +NavigationRailThemeData navigationRailTheme(); - +DrawerThemeData drawerTheme(); - +IconThemeData iconTheme(); - +CheckboxThemeData checkboxTheme(); - +RadioThemeData radioTheme(); - +TooltipThemeData tooltipTheme(); - +ThemeData light(); - +ThemeData dark(); - +ThemeMode themeMode(); - +ThemeData theme(); - <static>+ThemeProvider of(); - +bool updateShouldNotify() + +Widget? banner(); + +Widget build() ] - [ThemeProvider]o-[ValueNotifier] - [ThemeProvider]o-[ColorScheme] - [ThemeProvider]o-[PageTransitionsTheme] - [ThemeProvider]o-[<abstract>ShapeBorder] - [<abstract>InheritedWidget]<:-[ThemeProvider] + [<abstract>StudyPageWidget]<:-[StudyAnalyzeScreen] - [ThemeSettings + [StudyAnalyzeController | - +sourceColor: Color; - +themeMode: ThemeMode + +dynamic onExport() ] - [ThemeSettings]o-[Color] - [ThemeSettings]o-[ThemeMode] + [StudyBaseController]<:-[StudyAnalyzeController] - [CustomColor + [InviteCodeFormViewModel | - +name: String; - +color: Color; - +blend: bool + +study: Study; + +inviteCodeRepository: IInviteCodeRepository; + +codeControl: FormControl<String>; + +codeControlValidationMessages: Map<String, String Function(dynamic)>; + +isPreconfiguredScheduleControl: FormControl<bool>; + +preconfiguredScheduleTypeControl: FormControl<PhaseSequence>; + +interventionAControl: FormControl<String>; + +interventionBControl: FormControl<String>; + +form: FormGroup; + +titles: Map<FormMode, String>; + +interventionControlOptions: List<FormControlOption<String>>; + +preconfiguredScheduleTypeOptions: List<FormControlOption<PhaseSequence>>; + +isPreconfiguredSchedule: bool; + +preconfiguredSchedule: List<String>? | - +Color value() + +void initControls(); + -dynamic _uniqueInviteCode(); + +void regenerateCode(); + -String _generateCode(); + +StudyInvite buildFormData(); + +void setControlsFrom(); + +dynamic save() ] - [CustomColor]o-[Color] + [InviteCodeFormViewModel]o-[Study] + [InviteCodeFormViewModel]o-[<abstract>IInviteCodeRepository] + [InviteCodeFormViewModel]o-[FormControl] + [InviteCodeFormViewModel]o-[FormGroup] + [<abstract>FormViewModel]<:-[InviteCodeFormViewModel] - [App + [StudyRecruitController + | + +inviteCodeRepository: IInviteCodeRepository; + -_invitesSubscription: StreamSubscription<List<WrappedModel<StudyInvite>>>? + | + -dynamic _subscribeInvites(); + +Intervention? getIntervention(); + +int getParticipantCountForInvite(); + +List<ModelAction<dynamic>> availableActions(); + +List<ModelAction<dynamic>> availableInlineActions(); + +void dispose() ] - [AppContent - ] + [StudyRecruitController]o-[<abstract>IInviteCodeRepository] + [StudyRecruitController]o-[StreamSubscription] + [StudyBaseController]<:-[StudyRecruitController] + [<abstract>IModelActionProvider]<:--[StudyRecruitController] - [SignupForm + [EnrolledBadge | - +formKey: AuthFormKey + +enrolledCount: int | - +Widget build(); - -dynamic _onClickTermsOfUse(); - -dynamic _onClickPrivacyPolicy() + +Widget build() ] - [SignupForm]o-[AuthFormKey] - [<abstract>FormConsumerRefWidget]<:-[SignupForm] - - [StudyUJobsToBeDone + [StudyRecruitScreen | - +Widget build() + +Widget build(); + -Widget _inviteCodesSectionHeader(); + -Widget _newInviteCodeButton(); + -dynamic _onSelectInvite() ] - [LoginForm + [<abstract>StudyPageWidget]<:-[StudyRecruitScreen] + + [InviteCodeFormView | - +formKey: AuthFormKey + +formViewModel: InviteCodeFormViewModel | - +Widget build() + +Widget build(); + -List<FormTableRow> _conditionalInterventionRows() ] - [LoginForm]o-[AuthFormKey] - [<abstract>FormConsumerRefWidget]<:-[LoginForm] + [InviteCodeFormView]o-[InviteCodeFormViewModel] + [<abstract>FormConsumerWidget]<:-[InviteCodeFormView] - [PasswordForgotForm + [StudyInvitesTable | - +formKey: AuthFormKey + +invites: List<StudyInvite>; + +onSelect: void Function(StudyInvite); + +getActions: List<ModelAction<dynamic>> Function(StudyInvite); + +getInlineActions: List<ModelAction<dynamic>> Function(StudyInvite); + +getIntervention: Intervention? Function(String); + +getParticipantCountForInvite: int Function(StudyInvite) | - +Widget build() + +Widget build(); + -List<Widget> _buildRow() ] - [PasswordForgotForm]o-[AuthFormKey] - [<abstract>FormConsumerRefWidget]<:-[PasswordForgotForm] + [StudyInvitesTable]o-[void Function(StudyInvite)] + [StudyInvitesTable]o-[List<ModelAction<dynamic>> Function(StudyInvite)] + [StudyInvitesTable]o-[Intervention? Function(String)] + [StudyInvitesTable]o-[int Function(StudyInvite)] - [EmailTextField + [AppStatus | - +labelText: String; - +hintText: String?; - +formControlName: String?; - +formControl: FormControl<dynamic>? + +index: int; + <static>+values: List<AppStatus>; + <static>+initializing: AppStatus; + <static>+initialized: AppStatus ] - [EmailTextField]o-[FormControl] + [AppStatus]o-[AppStatus] + [Enum]<:--[AppStatus] - [PasswordTextField + [StudyFormScaffold | - +labelText: String; - +hintText: String?; - +formControlName: String?; - +formControl: FormControl<dynamic>? + +studyId: String; + +formViewModelBuilder: T Function(WidgetRef); + +formViewBuilder: Widget Function(T) + | + +Widget build() ] - [PasswordTextField]o-[FormControl] + [StudyFormScaffold]o-[T Function(WidgetRef)] + [StudyFormScaffold]o-[Widget Function(T)] + [<abstract>ConsumerWidget]<:-[StudyFormScaffold] - [AuthFormController + [InterventionsFormViewModel | - +authRepository: IAuthRepository; - +sharedPreferences: SharedPreferences; - +notificationService: INotificationService; + +study: Study; +router: GoRouter; - +emailControl: FormControl<String>; - +passwordControl: FormControl<String>; - +passwordConfirmationControl: FormControl<String>; - +rememberMeControl: FormControl<bool>; - +termsOfServiceControl: FormControl<bool>; - <static>+authValidationMessages: Map<String, String Function(dynamic)>; - +loginForm: FormGroup; - +signupForm: FormGroup; - +passwordForgotForm: FormGroup; - +passwordRecoveryForm: FormGroup; - +controlValidatorsByForm: Map<AuthFormKey, Map<FormControl<dynamic>, List<Validator<dynamic>>>>; - -_formKey: AuthFormKey; - +shouldRemember: bool; - +formKey: AuthFormKey; - +form: FormGroup + +interventionsArray: FormArray<dynamic>; + +interventionsCollection: FormViewModelCollection<InterventionFormViewModel, InterventionFormData>; + +form: FormGroup; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +interventionsRequired: dynamic; + +titles: Map<FormMode, String>; + +canTestStudySchedule: bool | - -dynamic _onChangeFormKey(); - +dynamic resetControlsFor(); - -dynamic _forceValidationMessages(); - +dynamic signUp(); - -dynamic _signUp(); - +dynamic signIn(); - -dynamic _signInWith(); - +dynamic signOut(); - +dynamic resetPasswordForEmail(); - +dynamic sendPasswordResetLink(); - +dynamic recoverPassword(); - +dynamic updateUser(); - -void _setRememberMe(); - -void _delRememberMe(); - -void _initRememberMe() + +void setControlsFrom(); + +InterventionsFormData buildFormData(); + +void read(); + +List<ModelAction<dynamic>> availableActions(); + +List<ModelAction<dynamic>> availablePopupActions(); + +List<ModelAction<dynamic>> availableInlineActions(); + +void onSelectItem(); + +void onNewItem(); + +InterventionFormViewModel provide(); + +void onCancel(); + +dynamic onSave(); + +dynamic testStudySchedule() ] - [AuthFormController]o-[<abstract>IAuthRepository] - [AuthFormController]o-[SharedPreferences] - [AuthFormController]o-[<abstract>INotificationService] - [AuthFormController]o-[GoRouter] - [AuthFormController]o-[FormControl] - [AuthFormController]o-[FormGroup] - [AuthFormController]o-[AuthFormKey] - [<abstract>IFormGroupController]<:--[AuthFormController] + [InterventionsFormViewModel]o-[Study] + [InterventionsFormViewModel]o-[GoRouter] + [InterventionsFormViewModel]o-[FormArray] + [InterventionsFormViewModel]o-[FormViewModelCollection] + [InterventionsFormViewModel]o-[FormGroup] + [<abstract>FormViewModel]<:-[InterventionsFormViewModel] + [<abstract>StudyScheduleControls]<:-[InterventionsFormViewModel] + [<abstract>IFormViewModelDelegate]<:--[InterventionsFormViewModel] + [<abstract>IListActionProvider]<:--[InterventionsFormViewModel] + [<abstract>IProviderArgsResolver]<:--[InterventionsFormViewModel] - [AuthFormKey + [InterventionTaskFormView | - +index: int; - <static>+values: List<AuthFormKey>; - <static>+login: AuthFormKey; - <static>+signup: AuthFormKey; - <static>+passwordForgot: AuthFormKey; - <static>+passwordRecovery: AuthFormKey; - <static>-_loginSubmit: AuthFormKey; - <static>-_signupSubmit: AuthFormKey + +formViewModel: InterventionTaskFormViewModel ] - [AuthFormKey]o-[AuthFormKey] - [Enum]<:--[AuthFormKey] + [InterventionTaskFormView]o-[InterventionTaskFormViewModel] - [PasswordRecoveryForm + [InterventionPreview | - +formKey: AuthFormKey + +routeArgs: InterventionFormRouteArgs | +Widget build() ] - [PasswordRecoveryForm]o-[AuthFormKey] - [<abstract>FormConsumerRefWidget]<:-[PasswordRecoveryForm] - - [AuthScaffold - | - +body: Widget; - +formKey: AuthFormKey; - +leftContentMinWidth: double; - +leftPanelMinWidth: double; - +leftPanelPadding: EdgeInsets - ] - - [AuthScaffold]o-[<abstract>Widget] - [AuthScaffold]o-[AuthFormKey] - [AuthScaffold]o-[EdgeInsets] + [InterventionPreview]o-[InterventionFormRouteArgs] + [<abstract>ConsumerWidget]<:-[InterventionPreview] - [DrawerEntry + [StudyScheduleFormView | - +localizedTitle: String Function(); - +icon: IconData?; - +localizedHelpText: String Function()?; - +enabled: bool; - +onSelected: void Function(BuildContext, WidgetRef)?; - +title: String; - +helpText: String? + +formViewModel: StudyScheduleControls | - +void onClick() + -FormTableRow _renderCustomSequence(); + +Widget build() ] - [DrawerEntry]o-[String Function()] - [DrawerEntry]o-[IconData] - [DrawerEntry]o-[String Function()?] - [DrawerEntry]o-[void Function(BuildContext, WidgetRef)?] + [StudyScheduleFormView]o-[<abstract>StudyScheduleControls] + [<abstract>FormConsumerWidget]<:-[StudyScheduleFormView] - [GoRouterDrawerEntry - | - +intent: RoutingIntent + [InterventionFormView | - +void onClick() + +formViewModel: InterventionFormViewModel ] - [GoRouterDrawerEntry]o-[RoutingIntent] - [DrawerEntry]<:-[GoRouterDrawerEntry] + [InterventionFormView]o-[InterventionFormViewModel] - [AppDrawer + [InterventionFormData | + +interventionId: String; +title: String; - +width: int; - +leftPaddingEntries: double; - +logoPaddingVertical: double; - +logoPaddingHorizontal: double; - +logoMaxHeight: double; - +logoSectionMinHeight: double; - +logoSectionMaxHeight: double - ] - - [PublishDialog + +description: String?; + +tasksData: List<InterventionTaskFormData>?; + +iconName: String?; + <static>+kDefaultTitle: String; + +id: String | - +Widget build() + +Intervention toIntervention(); + +InterventionFormData copy() ] - [<abstract>StudyPageWidget]<:-[PublishDialog] + [<abstract>IFormData]<:-[InterventionFormData] - [PublishSuccessDialog + [StudyScheduleFormData | - +Widget build() + +sequenceType: PhaseSequence; + +sequenceTypeCustom: String; + +numCycles: int; + +phaseDuration: int; + +includeBaseline: bool; + +id: String + | + +StudySchedule toStudySchedule(); + +Study apply(); + +StudyScheduleFormData copy() ] - [<abstract>StudyPageWidget]<:-[PublishSuccessDialog] + [StudyScheduleFormData]o-[PhaseSequence] + [<abstract>IStudyFormData]<:--[StudyScheduleFormData] - [PublishConfirmationDialog + [<abstract>StudyScheduleControls | - +Widget build() + <static>+defaultScheduleType: PhaseSequence; + <static>+defaultScheduleTypeSequence: String; + <static>+defaultNumCycles: int; + <static>+defaultPeriodLength: int; + +sequenceTypeControl: FormControl<PhaseSequence>; + +sequenceTypeCustomControl: FormControl<String>; + +phaseDurationControl: FormControl<int>; + +numCyclesControl: FormControl<int>; + +includeBaselineControl: FormControl<bool>; + +studyScheduleControls: Map<String, FormControl<Object>>; + <static>+kNumCyclesMin: int; + <static>+kNumCyclesMax: int; + <static>+kPhaseDurationMin: int; + <static>+kPhaseDurationMax: int; + +sequenceTypeControlOptions: List<FormControlOption<PhaseSequence>>; + +studyScheduleValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +numCyclesRange: dynamic; + +phaseDurationRange: dynamic; + +customSequenceRequired: dynamic + | + +void setStudyScheduleControlsFrom(); + +StudyScheduleFormData buildStudyScheduleFormData(); + +bool isSequencingCustom() ] - [<abstract>StudyPageWidget]<:-[PublishConfirmationDialog] + [<abstract>StudyScheduleControls]o-[PhaseSequence] + [<abstract>StudyScheduleControls]o-[FormControl] - [InviteCodeFormView + [InterventionTaskFormViewModel | - +formViewModel: InviteCodeFormViewModel + +taskIdControl: FormControl<String>; + +instanceIdControl: FormControl<String>; + +taskTitleControl: FormControl<String>; + +taskDescriptionControl: FormControl<String>; + +markAsCompletedControl: FormControl<bool>; + +form: FormGroup; + +taskId: String; + +instanceId: String; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +titleRequired: dynamic; + +titles: Map<FormMode, String> | - +Widget build(); - -List<FormTableRow> _conditionalInterventionRows() + +void setControlsFrom(); + +InterventionTaskFormData buildFormData(); + +InterventionTaskFormViewModel createDuplicate() ] - [InviteCodeFormView]o-[InviteCodeFormViewModel] - [<abstract>FormConsumerWidget]<:-[InviteCodeFormView] + [InterventionTaskFormViewModel]o-[FormControl] + [InterventionTaskFormViewModel]o-[FormGroup] + [<abstract>ManagedFormViewModel]<:-[InterventionTaskFormViewModel] + [<abstract>WithScheduleControls]<:-[InterventionTaskFormViewModel] - [StudyInvitesTable + [InterventionFormViewModel | - +invites: List<StudyInvite>; - +onSelect: void Function(StudyInvite); - +getActions: List<ModelAction<dynamic>> Function(StudyInvite); - +getInlineActions: List<ModelAction<dynamic>> Function(StudyInvite); - +getIntervention: Intervention? Function(String); - +getParticipantCountForInvite: int Function(StudyInvite) + +study: Study; + +interventionIdControl: FormControl<String>; + +interventionTitleControl: FormControl<String>; + +interventionIconControl: FormControl<IconOption>; + +interventionDescriptionControl: FormControl<String>; + +interventionTasksArray: FormArray<dynamic>; + +tasksCollection: FormViewModelCollection<InterventionTaskFormViewModel, InterventionTaskFormData>; + +form: FormGroup; + +interventionId: String; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +titleRequired: dynamic; + +atLeastOneTask: dynamic; + +breadcrumbsTitle: String; + +titles: Map<FormMode, String> | - +Widget build(); - -List<Widget> _buildRow() + +void setControlsFrom(); + +InterventionFormData buildFormData(); + +List<ModelAction<dynamic>> availableActions(); + +List<ModelAction<dynamic>> availablePopupActions(); + +List<ModelAction<dynamic>> availableInlineActions(); + +void onSelectItem(); + +void onNewItem(); + +void onCancel(); + +dynamic onSave(); + +InterventionTaskFormViewModel provide(); + +InterventionTaskFormRouteArgs buildNewFormRouteArgs(); + +InterventionTaskFormRouteArgs buildFormRouteArgs(); + +InterventionFormViewModel createDuplicate() ] - [StudyInvitesTable]o-[void Function(StudyInvite)] - [StudyInvitesTable]o-[List<ModelAction<dynamic>> Function(StudyInvite)] - [StudyInvitesTable]o-[Intervention? Function(String)] - [StudyInvitesTable]o-[int Function(StudyInvite)] + [InterventionFormViewModel]o-[Study] + [InterventionFormViewModel]o-[FormControl] + [InterventionFormViewModel]o-[FormArray] + [InterventionFormViewModel]o-[FormViewModelCollection] + [InterventionFormViewModel]o-[FormGroup] + [<abstract>ManagedFormViewModel]<:-[InterventionFormViewModel] + [<abstract>IFormViewModelDelegate]<:--[InterventionFormViewModel] + [<abstract>IListActionProvider]<:--[InterventionFormViewModel] + [<abstract>IProviderArgsResolver]<:--[InterventionFormViewModel] - [EnrolledBadge + [InterventionsFormData | - +enrolledCount: int + +interventionsData: List<InterventionFormData>; + +studyScheduleData: StudyScheduleFormData; + +id: String | - +Widget build() + +Study apply(); + +InterventionsFormData copy() ] - [StudyRecruitController - | - +inviteCodeRepository: IInviteCodeRepository; - -_invitesSubscription: StreamSubscription<List<WrappedModel<StudyInvite>>>? - | - -dynamic _subscribeInvites(); - +Intervention? getIntervention(); - +int getParticipantCountForInvite(); - +List<ModelAction<dynamic>> availableActions(); - +List<ModelAction<dynamic>> availableInlineActions(); - +void dispose() - ] - - [StudyRecruitController]o-[<abstract>IInviteCodeRepository] - [StudyRecruitController]o-[StreamSubscription] - [StudyBaseController]<:-[StudyRecruitController] - [<abstract>IModelActionProvider]<:--[StudyRecruitController] + [InterventionsFormData]o-[StudyScheduleFormData] + [<abstract>IStudyFormData]<:--[InterventionsFormData] - [InviteCodeFormViewModel - | - +study: Study; - +inviteCodeRepository: IInviteCodeRepository; - +codeControl: FormControl<String>; - +codeControlValidationMessages: Map<String, String Function(dynamic)>; - +isPreconfiguredScheduleControl: FormControl<bool>; - +preconfiguredScheduleTypeControl: FormControl<PhaseSequence>; - +interventionAControl: FormControl<String>; - +interventionBControl: FormControl<String>; - +form: FormGroup; - +titles: Map<FormMode, String>; - +interventionControlOptions: List<FormControlOption<String>>; - +preconfiguredScheduleTypeOptions: List<FormControlOption<PhaseSequence>>; - +isPreconfiguredSchedule: bool; - +preconfiguredSchedule: List<String>? + [StudyDesignInterventionsFormView | - +void initControls(); - -dynamic _uniqueInviteCode(); - +void regenerateCode(); - -String _generateCode(); - +StudyInvite buildFormData(); - +void setControlsFrom(); - +dynamic save() + +Widget build() ] - [InviteCodeFormViewModel]o-[Study] - [InviteCodeFormViewModel]o-[<abstract>IInviteCodeRepository] - [InviteCodeFormViewModel]o-[FormControl] - [InviteCodeFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[InviteCodeFormViewModel] + [<abstract>StudyDesignPageWidget]<:-[StudyDesignInterventionsFormView] - [StudyRecruitScreen + [InterventionTaskFormData | - +Widget build(); - -Widget _inviteCodesSectionHeader(); - -Widget _newInviteCodeButton(); - -dynamic _onSelectInvite() - ] - - [<abstract>StudyPageWidget]<:-[StudyRecruitScreen] - - [StudyDesignReportsFormView + +taskId: String; + +taskTitle: String; + +taskDescription: String?; + <static>+kDefaultTitle: String; + +id: String | - +Widget build(); - -dynamic _showReportItemSidesheetWithArgs() + +CheckmarkTask toTask(); + +InterventionTaskFormData copy() ] - [<abstract>StudyDesignPageWidget]<:-[StudyDesignReportsFormView] + [<abstract>IFormDataWithSchedule]<:-[InterventionTaskFormData] [ReportBadge | @@ -1117,6 +1300,14 @@ [<abstract>IListActionProvider]<:--[ReportFormItemDelegate] [<abstract>IProviderArgsResolver]<:--[ReportFormItemDelegate] + [StudyDesignReportsFormView + | + +Widget build(); + -dynamic _showReportItemSidesheetWithArgs() + ] + + [<abstract>StudyDesignPageWidget]<:-[StudyDesignReportsFormView] + [ReportsFormData | +reportItems: List<ReportItemFormData>; @@ -1211,40 +1402,6 @@ [ReportItemFormView]o-[ReportItemFormViewModel] [ReportItemFormView]o-[Widget Function(BuildContext)] - [DataReferenceIdentifier - | - +hashCode: int - | - +bool ==() - ] - - [DataReference]<:-[DataReferenceIdentifier] - - [LinearRegressionSectionFormView - | - +formViewModel: ReportItemFormViewModel; - +studyId: String; - +reportSectionColumnWidth: Map<int, TableColumnWidth> - | - +Widget build() - ] - - [LinearRegressionSectionFormView]o-[ReportItemFormViewModel] - [<abstract>ConsumerWidget]<:-[LinearRegressionSectionFormView] - - [DataReferenceEditor - | - +formControl: FormControl<DataReferenceIdentifier<T>>; - +availableTasks: List<Task>; - +buildReactiveDropdownField: ReactiveDropdownField<dynamic> - | - +FormTableRow buildFormTableRow(); - -List<DropdownMenuItem<DataReferenceIdentifier<dynamic>>> _dataReferenceItems() - ] - - [DataReferenceEditor]o-[FormControl] - [DataReferenceEditor]o-[ReactiveDropdownField] - [TemporalAggregationFormatted | -_value: TemporalAggregation; @@ -1292,7 +1449,16 @@ [ReportSectionType]o-[ReportSectionType] [Enum]<:--[ReportSectionType] - [AverageSectionFormView + [DataReferenceIdentifier + | + +hashCode: int + | + +bool ==() + ] + + [DataReference]<:-[DataReferenceIdentifier] + + [LinearRegressionSectionFormView | +formViewModel: ReportItemFormViewModel; +studyId: String; @@ -1301,53 +1467,40 @@ +Widget build() ] - [AverageSectionFormView]o-[ReportItemFormViewModel] - [<abstract>ConsumerWidget]<:-[AverageSectionFormView] + [LinearRegressionSectionFormView]o-[ReportItemFormViewModel] + [<abstract>ConsumerWidget]<:-[LinearRegressionSectionFormView] - [StudyFormViewModel + [DataReferenceEditor | - +studyDirtyCopy: Study?; - +studyRepository: IStudyRepository; - +authRepository: IAuthRepository; - +router: GoRouter; - +studyInfoFormViewModel: StudyInfoFormViewModel; - +enrollmentFormViewModel: EnrollmentFormViewModel; - +measurementsFormViewModel: MeasurementsFormViewModel; - +reportsFormViewModel: ReportsFormViewModel; - +interventionsFormViewModel: InterventionsFormViewModel; - +form: FormGroup; - +isStudyReadonly: bool; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titles: Map<FormMode, String> + +formControl: FormControl<DataReferenceIdentifier<T>>; + +availableTasks: List<Task>; + +buildReactiveDropdownField: ReactiveDropdownField<dynamic> | - +void read(); - +void setControlsFrom(); - +Study buildFormData(); - +void dispose(); - +void onCancel(); - +dynamic onSave(); - -dynamic _applyAndSaveSubform() + +FormTableRow buildFormTableRow(); + -List<DropdownMenuItem<DataReferenceIdentifier<dynamic>>> _dataReferenceItems() ] - [StudyFormViewModel]o-[Study] - [StudyFormViewModel]o-[<abstract>IStudyRepository] - [StudyFormViewModel]o-[<abstract>IAuthRepository] - [StudyFormViewModel]o-[GoRouter] - [StudyFormViewModel]o-[StudyInfoFormViewModel] - [StudyFormViewModel]o-[EnrollmentFormViewModel] - [StudyFormViewModel]o-[MeasurementsFormViewModel] - [StudyFormViewModel]o-[ReportsFormViewModel] - [StudyFormViewModel]o-[InterventionsFormViewModel] - [StudyFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[StudyFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[StudyFormViewModel] + [DataReferenceEditor]o-[FormControl] + [DataReferenceEditor]o-[ReactiveDropdownField] - [StudyDesignInfoFormView + [AverageSectionFormView + | + +formViewModel: ReportItemFormViewModel; + +studyId: String; + +reportSectionColumnWidth: Map<int, TableColumnWidth> | +Widget build() ] - [<abstract>StudyDesignPageWidget]<:-[StudyDesignInfoFormView] + [AverageSectionFormView]o-[ReportItemFormViewModel] + [<abstract>ConsumerWidget]<:-[AverageSectionFormView] + + [<abstract>IStudyFormData + | + +Study apply() + ] + + [<abstract>IFormData]<:--[<abstract>IStudyFormData] [StudyInfoFormData | @@ -1420,945 +1573,998 @@ [StudyInfoFormViewModel]o-[FormGroup] [<abstract>FormViewModel]<:-[StudyInfoFormViewModel] - [MeasurementsFormData + [StudyDesignInfoFormView | - +surveyMeasurements: List<MeasurementSurveyFormData>; - +id: String + +Widget build() + ] + + [<abstract>StudyDesignPageWidget]<:-[StudyDesignInfoFormView] + + [StudyFormValidationSet | - +Study apply(); - +MeasurementsFormData copy() + +index: int; + <static>+values: List<StudyFormValidationSet> ] - [<abstract>IStudyFormData]<:--[MeasurementsFormData] + [Enum]<:--[StudyFormValidationSet] - [StudyDesignMeasurementsFormView + [StudyDesignEnrollmentFormView | - +Widget build() + +Widget build(); + -dynamic _showScreenerQuestionSidesheetWithArgs(); + -dynamic _showConsentItemSidesheetWithArgs() ] - [<abstract>StudyDesignPageWidget]<:-[StudyDesignMeasurementsFormView] + [<abstract>StudyDesignPageWidget]<:-[StudyDesignEnrollmentFormView] - [MeasurementSurveyFormViewModel + [EnrollmentFormData | - +study: Study; - +measurementIdControl: FormControl<String>; - +instanceIdControl: FormControl<String>; - +surveyTitleControl: FormControl<String>; - +surveyIntroTextControl: FormControl<String>; - +surveyOutroTextControl: FormControl<String>; + <static>+kDefaultEnrollmentType: Participation; + +enrollmentType: Participation; + +questionnaireFormData: QuestionnaireFormData; + +consentItemsFormData: List<ConsentItemFormData>?; + +id: String + | + +Study apply(); + +EnrollmentFormData copy() + ] + + [EnrollmentFormData]o-[Participation] + [EnrollmentFormData]o-[QuestionnaireFormData] + [<abstract>IStudyFormData]<:--[EnrollmentFormData] + + [ConsentItemFormViewModel + | + +consentIdControl: FormControl<String>; + +titleControl: FormControl<String>; + +descriptionControl: FormControl<String>; + +iconControl: FormControl<IconOption>; +form: FormGroup; - +measurementId: String; - +instanceId: String; + +consentId: String; +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; +titleRequired: dynamic; - +atLeastOneQuestion: dynamic; - +breadcrumbsTitle: String; + +descriptionRequired: dynamic; +titles: Map<FormMode, String> | +void setControlsFrom(); - +MeasurementSurveyFormData buildFormData(); - +List<ModelAction<dynamic>> availableActions(); - +List<ModelAction<dynamic>> availablePopupActions(); - +List<ModelAction<dynamic>> availableInlineActions(); - +void onSelectItem(); - +void onNewItem(); - +SurveyQuestionFormRouteArgs buildNewFormRouteArgs(); - +SurveyQuestionFormRouteArgs buildFormRouteArgs(); - +MeasurementSurveyFormViewModel createDuplicate() + +ConsentItemFormData buildFormData(); + +ConsentItemFormViewModel createDuplicate() ] - [MeasurementSurveyFormViewModel]o-[Study] - [MeasurementSurveyFormViewModel]o-[FormControl] - [MeasurementSurveyFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[MeasurementSurveyFormViewModel] - [<abstract>WithQuestionnaireControls]<:-[MeasurementSurveyFormViewModel] - [<abstract>WithScheduleControls]<:-[MeasurementSurveyFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[MeasurementSurveyFormViewModel] - [<abstract>IListActionProvider]<:--[MeasurementSurveyFormViewModel] - [<abstract>IProviderArgsResolver]<:--[MeasurementSurveyFormViewModel] + [ConsentItemFormViewModel]o-[FormControl] + [ConsentItemFormViewModel]o-[FormGroup] + [<abstract>ManagedFormViewModel]<:-[ConsentItemFormViewModel] - [MeasurementSurveyFormView + [ScreenerQuestionFormViewModel | - +formViewModel: MeasurementSurveyFormViewModel + <static>+defaultResponseOptionValidity: bool; + +responseOptionsDisabledArray: FormArray<dynamic>; + +responseOptionsLogicControls: FormArray<bool>; + +responseOptionsLogicDescriptionControls: FormArray<String>; + -_questionBaseControls: Map<String, AbstractControl<dynamic>>; + +prevResponseOptionControls: List<AbstractControl<dynamic>>; + +prevResponseOptionValues: List<dynamic>; + +responseOptionsDisabledControls: List<AbstractControl<dynamic>>; + +logicControlOptions: List<FormControlOption<bool>>; + +questionBaseControls: Map<String, AbstractControl<dynamic>>; + +isDirtyOptionsBannerVisible: bool + | + +dynamic onResponseOptionsChanged(); + +void setControlsFrom(); + +QuestionFormData buildFormData(); + -List<FormControl<dynamic>> _copyFormControls(); + -AbstractControl<dynamic>? _findAssociatedLogicControlFor(); + -AbstractControl<dynamic>? _findAssociatedControlFor(); + +ScreenerQuestionFormViewModel createDuplicate() ] - [MeasurementSurveyFormView]o-[MeasurementSurveyFormViewModel] + [ScreenerQuestionFormViewModel]o-[FormArray] + [QuestionFormViewModel]<:-[ScreenerQuestionFormViewModel] + [<abstract>IScreenerQuestionLogicFormViewModel]<:--[ScreenerQuestionFormViewModel] - [MeasurementSurveyFormData + [ConsentItemFormView | - +measurementId: String; + +formViewModel: ConsentItemFormViewModel + ] + + [ConsentItemFormView]o-[ConsentItemFormViewModel] + + [ConsentItemFormData + | + +consentId: String; +title: String; - +introText: String?; - +outroText: String?; - +questionnaireFormData: QuestionnaireFormData; - <static>+kDefaultTitle: String; + +description: String; + +iconName: String?; +id: String | - +QuestionnaireTask toQuestionnaireTask(); - +MeasurementSurveyFormData copy() + +ConsentItem toConsentItem(); + +ConsentItemFormData copy() ] - [MeasurementSurveyFormData]o-[QuestionnaireFormData] - [<abstract>IFormDataWithSchedule]<:-[MeasurementSurveyFormData] + [<abstract>IFormData]<:-[ConsentItemFormData] - [SurveyPreview + [<abstract>IScreenerQuestionLogicFormViewModel | - +routeArgs: MeasurementFormRouteArgs + +isDirtyOptionsBannerVisible: bool + ] + + [ScreenerQuestionLogicFormView | - +Widget build() + +formViewModel: ScreenerQuestionFormViewModel + | + +Widget build(); + -dynamic _buildInfoBanner(); + -dynamic _buildAnswerOptionsLogicControls(); + -List<Widget> _buildOptionLogicRow() ] - [SurveyPreview]o-[MeasurementFormRouteArgs] - [<abstract>ConsumerWidget]<:-[SurveyPreview] + [ScreenerQuestionLogicFormView]o-[ScreenerQuestionFormViewModel] + [<abstract>FormConsumerWidget]<:-[ScreenerQuestionLogicFormView] - [MeasurementsFormViewModel + [EnrollmentFormViewModel | +study: Study; +router: GoRouter; - +measurementsArray: FormArray<dynamic>; - +surveyMeasurementFormViewModels: FormViewModelCollection<MeasurementSurveyFormViewModel, MeasurementSurveyFormData>; + +consentItemDelegate: EnrollmentFormConsentItemDelegate; + +enrollmentTypeControl: FormControl<Participation>; + +consentItemArray: FormArray<dynamic>; + +consentItemFormViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData>; +form: FormGroup; - +measurementViewModels: List<MeasurementSurveyFormViewModel>; + +enrollmentTypeControlOptions: List<FormControlOption<Participation>>; + +consentItemModels: List<ConsentItemFormViewModel>; +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +measurementRequired: dynamic; - +titles: Map<FormMode, String> + +titles: Map<FormMode, String>; + +canTestScreener: bool; + +canTestConsent: bool; + +questionTitles: Map<FormMode, String Function()> | - +void read(); +void setControlsFrom(); - +MeasurementsFormData buildFormData(); + +EnrollmentFormData buildFormData(); + +void read(); +List<ModelAction<dynamic>> availableActions(); +List<ModelAction<dynamic>> availablePopupActions(); +List<ModelAction<dynamic>> availableInlineActions(); +void onSelectItem(); +void onNewItem(); - +MeasurementSurveyFormViewModel provide(); - +void onCancel(); - +dynamic onSave() + +ScreenerQuestionFormRouteArgs buildNewScreenerQuestionFormRouteArgs(); + +ScreenerQuestionFormRouteArgs buildScreenerQuestionFormRouteArgs(); + +ConsentItemFormRouteArgs buildNewConsentItemFormRouteArgs(); + +ConsentItemFormRouteArgs buildConsentItemFormRouteArgs(); + +dynamic testScreener(); + +dynamic testConsent(); + +ScreenerQuestionFormViewModel provideQuestionFormViewModel() ] - [MeasurementsFormViewModel]o-[Study] - [MeasurementsFormViewModel]o-[GoRouter] - [MeasurementsFormViewModel]o-[FormArray] - [MeasurementsFormViewModel]o-[FormViewModelCollection] - [MeasurementsFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[MeasurementsFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[MeasurementsFormViewModel] - [<abstract>IListActionProvider]<:--[MeasurementsFormViewModel] - [<abstract>IProviderArgsResolver]<:--[MeasurementsFormViewModel] + [EnrollmentFormViewModel]o-[Study] + [EnrollmentFormViewModel]o-[GoRouter] + [EnrollmentFormViewModel]o-[EnrollmentFormConsentItemDelegate] + [EnrollmentFormViewModel]o-[FormControl] + [EnrollmentFormViewModel]o-[FormArray] + [EnrollmentFormViewModel]o-[FormViewModelCollection] + [EnrollmentFormViewModel]o-[FormGroup] + [<abstract>FormViewModel]<:-[EnrollmentFormViewModel] + [<abstract>WithQuestionnaireControls]<:-[EnrollmentFormViewModel] + [<abstract>IFormViewModelDelegate]<:--[EnrollmentFormViewModel] + [<abstract>IListActionProvider]<:--[EnrollmentFormViewModel] + [<abstract>IProviderArgsResolver]<:--[EnrollmentFormViewModel] - [InterventionTaskFormView + [EnrollmentFormConsentItemDelegate | - +formViewModel: InterventionTaskFormViewModel + +formViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData>; + +owner: EnrollmentFormViewModel; + +propagateOnSave: bool; + +validationSet: dynamic + | + +void onCancel(); + +dynamic onSave(); + +ConsentItemFormViewModel provide(); + +List<ModelAction<dynamic>> availableActions(); + +void onNewItem(); + +void onSelectItem() ] - [InterventionTaskFormView]o-[InterventionTaskFormViewModel] + [EnrollmentFormConsentItemDelegate]o-[FormViewModelCollection] + [EnrollmentFormConsentItemDelegate]o-[EnrollmentFormViewModel] + [<abstract>IFormViewModelDelegate]<:--[EnrollmentFormConsentItemDelegate] + [<abstract>IListActionProvider]<:--[EnrollmentFormConsentItemDelegate] + [<abstract>IProviderArgsResolver]<:--[EnrollmentFormConsentItemDelegate] - [InterventionFormData + [QuestionnaireFormData | - +interventionId: String; - +title: String; - +description: String?; - +tasksData: List<InterventionTaskFormData>?; - +iconName: String?; - <static>+kDefaultTitle: String; + +questionsData: List<QuestionFormData>?; +id: String | - +Intervention toIntervention(); - +InterventionFormData copy() + +StudyUQuestionnaire toQuestionnaire(); + +List<EligibilityCriterion> toEligibilityCriteria(); + +QuestionnaireFormData copy() ] - [<abstract>IFormData]<:-[InterventionFormData] + [<abstract>IFormData]<:--[QuestionnaireFormData] - [StudyScheduleFormData + [<abstract>WithQuestionnaireControls | - +sequenceType: PhaseSequence; - +sequenceTypeCustom: String; - +numCycles: int; - +phaseDuration: int; - +includeBaseline: bool; - +id: String + +questionsArray: FormArray<dynamic>; + +questionFormViewModels: FormViewModelCollection<Q, QuestionFormData>; + +questionnaireControls: Map<String, FormArray<dynamic>>; + +propagateOnSave: bool; + +questionModels: List<Q>; + +questionTitles: Map<FormMode, String Function()> | - +StudySchedule toStudySchedule(); - +Study apply(); - +StudyScheduleFormData copy() + +void setQuestionnaireControlsFrom(); + +QuestionnaireFormData buildQuestionnaireFormData(); + +void read(); + +void onCancel(); + +dynamic onSave(); + +Q provide(); + +Q provideQuestionFormViewModel() ] - [StudyScheduleFormData]o-[PhaseSequence] - [<abstract>IStudyFormData]<:--[StudyScheduleFormData] + [<abstract>WithQuestionnaireControls]o-[FormArray] + [<abstract>WithQuestionnaireControls]o-[FormViewModelCollection] + [<abstract>IFormViewModelDelegate]<:--[<abstract>WithQuestionnaireControls] + [<abstract>IProviderArgsResolver]<:--[<abstract>WithQuestionnaireControls] - [InterventionFormView + [SurveyQuestionFormView | - +formViewModel: InterventionFormViewModel + +formViewModel: QuestionFormViewModel; + +isHtmlStyleable: bool ] - [InterventionFormView]o-[InterventionFormViewModel] + [SurveyQuestionFormView]o-[QuestionFormViewModel] - [InterventionTaskFormViewModel + [QuestionFormViewModel | - +taskIdControl: FormControl<String>; - +instanceIdControl: FormControl<String>; - +taskTitleControl: FormControl<String>; - +taskDescriptionControl: FormControl<String>; - +markAsCompletedControl: FormControl<bool>; + <static>+defaultQuestionType: SurveyQuestionType; + -_titles: Map<FormMode, String Function()>?; + +questionIdControl: FormControl<String>; + +questionTypeControl: FormControl<SurveyQuestionType>; + +questionTextControl: FormControl<String>; + +questionInfoTextControl: FormControl<String>; + +questionBaseControls: Map<String, AbstractControl<dynamic>>; + +isMultipleChoiceControl: FormControl<bool>; + +choiceResponseOptionsArray: FormArray<dynamic>; + +customOptionsMin: int; + +customOptionsMax: int; + +customOptionsInitial: int; + +boolResponseOptionsArray: FormArray<String>; + <static>+kDefaultScaleMinValue: int; + <static>+kDefaultScaleMaxValue: int; + <static>+kNumMidValueControls: int; + <static>+kMidValueDebounceMilliseconds: int; + +scaleMinValueControl: FormControl<int>; + +scaleMaxValueControl: FormControl<int>; + -_scaleRangeControl: FormControl<int>; + +scaleMinLabelControl: FormControl<String>; + +scaleMaxLabelControl: FormControl<String>; + +scaleMidValueControls: FormArray<int>; + +scaleMidLabelControls: FormArray<String?>; + -_scaleResponseOptionsArray: FormArray<int>; + +scaleMinColorControl: FormControl<SerializableColor>; + +scaleMaxColorControl: FormControl<SerializableColor>; + +prevMidValues: List<int?>?; + -_controlsByQuestionType: Map<SurveyQuestionType, FormGroup>; + -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + -_validationConfigsByQuestionType: Map<SurveyQuestionType, Map<FormValidationSetEnum, List<FormControlValidation>>>; +form: FormGroup; - +taskId: String; - +instanceId: String; + +questionId: String; + +questionType: SurveyQuestionType; + +questionTypeControlOptions: List<FormControlOption<SurveyQuestionType>>; + +answerOptionsArray: FormArray<dynamic>; + +answerOptionsControls: List<AbstractControl<dynamic>>; + +validAnswerOptions: List<String>; + +boolOptions: List<AbstractControl<String>>; + +scaleMinValue: int; + +scaleMaxValue: int; + +scaleRange: int; + +scaleAllValueControls: List<AbstractControl<int>>; +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titleRequired: dynamic; - +titles: Map<FormMode, String> - | - +void setControlsFrom(); - +InterventionTaskFormData buildFormData(); - +InterventionTaskFormViewModel createDuplicate() - ] - - [InterventionTaskFormViewModel]o-[FormControl] - [InterventionTaskFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[InterventionTaskFormViewModel] - [<abstract>WithScheduleControls]<:-[InterventionTaskFormViewModel] - - [InterventionsFormViewModel - | - +study: Study; - +router: GoRouter; - +interventionsArray: FormArray<dynamic>; - +interventionsCollection: FormViewModelCollection<InterventionFormViewModel, InterventionFormData>; - +form: FormGroup; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +interventionsRequired: dynamic; + +questionTextRequired: dynamic; + +numValidChoiceOptions: dynamic; + +scaleRangeValid: dynamic; +titles: Map<FormMode, String>; - +canTestStudySchedule: bool + +isAddOptionButtonVisible: bool; + +isMidValuesClearedInfoVisible: bool | + +String? scaleMidLabelAt(); + -dynamic _onScaleRangeChanged(); + -dynamic _applyInputFormatters(); + -dynamic _updateScaleMidValueControls(); + -List<FormControlValidation> _getValidationConfig(); + +dynamic onQuestionTypeChanged(); + +dynamic onResponseOptionsChanged(); + -void _updateFormControls(); + +void initControls(); +void setControlsFrom(); - +InterventionsFormData buildFormData(); - +void read(); + +QuestionFormData buildFormData(); +List<ModelAction<dynamic>> availableActions(); - +List<ModelAction<dynamic>> availablePopupActions(); - +List<ModelAction<dynamic>> availableInlineActions(); - +void onSelectItem(); +void onNewItem(); - +InterventionFormViewModel provide(); - +void onCancel(); - +dynamic onSave(); - +dynamic testStudySchedule() + +void onSelectItem(); + +QuestionFormViewModel createDuplicate() ] - [InterventionsFormViewModel]o-[Study] - [InterventionsFormViewModel]o-[GoRouter] - [InterventionsFormViewModel]o-[FormArray] - [InterventionsFormViewModel]o-[FormViewModelCollection] - [InterventionsFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[InterventionsFormViewModel] - [<abstract>StudyScheduleControls]<:-[InterventionsFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[InterventionsFormViewModel] - [<abstract>IListActionProvider]<:--[InterventionsFormViewModel] - [<abstract>IProviderArgsResolver]<:--[InterventionsFormViewModel] + [QuestionFormViewModel]o-[SurveyQuestionType] + [QuestionFormViewModel]o-[FormControl] + [QuestionFormViewModel]o-[FormArray] + [QuestionFormViewModel]o-[FormGroup] + [<abstract>ManagedFormViewModel]<:-[QuestionFormViewModel] + [<abstract>IListActionProvider]<:--[QuestionFormViewModel] - [InterventionTaskFormData + [<abstract>QuestionFormData | - +taskId: String; - +taskTitle: String; - +taskDescription: String?; - <static>+kDefaultTitle: String; + <static>+questionTypeFormDataFactories: Map<SurveyQuestionType, QuestionFormData Function(Question<dynamic>, List<EligibilityCriterion>)>; + +questionId: String; + +questionText: String; + +questionInfoText: String?; + +questionType: SurveyQuestionType; + +responseOptionsValidity: Map<dynamic, bool>; + +responseOptions: List<dynamic>; +id: String | - +CheckmarkTask toTask(); - +InterventionTaskFormData copy() + +Question<dynamic> toQuestion(); + +EligibilityCriterion toEligibilityCriterion(); + +Answer<dynamic> constructAnswerFor(); + +dynamic setResponseOptionsValidityFrom(); + +QuestionFormData copy() ] - [<abstract>IFormDataWithSchedule]<:-[InterventionTaskFormData] + [<abstract>QuestionFormData]o-[SurveyQuestionType] + [<abstract>IFormData]<:--[<abstract>QuestionFormData] - [InterventionFormViewModel + [ChoiceQuestionFormData | - +study: Study; - +interventionIdControl: FormControl<String>; - +interventionTitleControl: FormControl<String>; - +interventionIconControl: FormControl<IconOption>; - +interventionDescriptionControl: FormControl<String>; - +interventionTasksArray: FormArray<dynamic>; - +tasksCollection: FormViewModelCollection<InterventionTaskFormViewModel, InterventionTaskFormData>; - +form: FormGroup; - +interventionId: String; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titleRequired: dynamic; - +atLeastOneTask: dynamic; - +breadcrumbsTitle: String; - +titles: Map<FormMode, String> + +isMultipleChoice: bool; + +answerOptions: List<String>; + +responseOptions: List<String> | - +void setControlsFrom(); - +InterventionFormData buildFormData(); - +List<ModelAction<dynamic>> availableActions(); - +List<ModelAction<dynamic>> availablePopupActions(); - +List<ModelAction<dynamic>> availableInlineActions(); - +void onSelectItem(); - +void onNewItem(); - +void onCancel(); - +dynamic onSave(); - +InterventionTaskFormViewModel provide(); - +InterventionTaskFormRouteArgs buildNewFormRouteArgs(); - +InterventionTaskFormRouteArgs buildFormRouteArgs(); - +InterventionFormViewModel createDuplicate() + +Question<dynamic> toQuestion(); + +QuestionFormData copy(); + -Choice _buildChoiceForValue(); + +Answer<dynamic> constructAnswerFor() ] - [InterventionFormViewModel]o-[Study] - [InterventionFormViewModel]o-[FormControl] - [InterventionFormViewModel]o-[FormArray] - [InterventionFormViewModel]o-[FormViewModelCollection] - [InterventionFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[InterventionFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[InterventionFormViewModel] - [<abstract>IListActionProvider]<:--[InterventionFormViewModel] - [<abstract>IProviderArgsResolver]<:--[InterventionFormViewModel] + [<abstract>QuestionFormData]<:-[ChoiceQuestionFormData] - [<abstract>StudyScheduleControls + [BoolQuestionFormData | - <static>+defaultScheduleType: PhaseSequence; - <static>+defaultScheduleTypeSequence: String; - <static>+defaultNumCycles: int; - <static>+defaultPeriodLength: int; - +sequenceTypeControl: FormControl<PhaseSequence>; - +sequenceTypeCustomControl: FormControl<String>; - +phaseDurationControl: FormControl<int>; - +numCyclesControl: FormControl<int>; - +includeBaselineControl: FormControl<bool>; - +studyScheduleControls: Map<String, FormControl<Object>>; - <static>+kNumCyclesMin: int; - <static>+kNumCyclesMax: int; - <static>+kPhaseDurationMin: int; - <static>+kPhaseDurationMax: int; - +sequenceTypeControlOptions: List<FormControlOption<PhaseSequence>>; - +studyScheduleValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +numCyclesRange: dynamic; - +phaseDurationRange: dynamic; - +customSequenceRequired: dynamic + <static>+kResponseOptions: Map<String, bool>; + +responseOptions: List<String> | - +void setStudyScheduleControlsFrom(); - +StudyScheduleFormData buildStudyScheduleFormData(); - +bool isSequencingCustom() + +Question<dynamic> toQuestion(); + +BoolQuestionFormData copy(); + +Answer<dynamic> constructAnswerFor() ] - [<abstract>StudyScheduleControls]o-[PhaseSequence] - [<abstract>StudyScheduleControls]o-[FormControl] + [<abstract>QuestionFormData]<:-[BoolQuestionFormData] - [InterventionsFormData + [ScaleQuestionFormData | - +interventionsData: List<InterventionFormData>; - +studyScheduleData: StudyScheduleFormData; - +id: String + +minValue: double; + +maxValue: double; + +minLabel: String?; + +maxLabel: String?; + +midValues: List<double?>; + +midLabels: List<String?>; + +stepSize: double; + +initialValue: double?; + +minColor: Color?; + +maxColor: Color?; + +responseOptions: List<double>; + +midAnnotations: List<Annotation> | - +Study apply(); - +InterventionsFormData copy() + +ScaleQuestion toQuestion(); + +QuestionFormData copy(); + +Answer<dynamic> constructAnswerFor() ] - [InterventionsFormData]o-[StudyScheduleFormData] - [<abstract>IStudyFormData]<:--[InterventionsFormData] + [ScaleQuestionFormData]o-[Color] + [<abstract>QuestionFormData]<:-[ScaleQuestionFormData] - [InterventionPreview - | - +routeArgs: InterventionFormRouteArgs + [<abstract>IScaleQuestionFormViewModel | - +Widget build() + +isMidValuesClearedInfoVisible: bool ] - [InterventionPreview]o-[InterventionFormRouteArgs] - [<abstract>ConsumerWidget]<:-[InterventionPreview] - - [StudyScheduleFormView - | - +formViewModel: StudyScheduleControls + [ScaleQuestionFormView | - -FormTableRow _renderCustomSequence(); - +Widget build() + +formViewModel: QuestionFormViewModel ] - [StudyScheduleFormView]o-[<abstract>StudyScheduleControls] - [<abstract>FormConsumerWidget]<:-[StudyScheduleFormView] + [ScaleQuestionFormView]o-[QuestionFormViewModel] - [StudyDesignInterventionsFormView + [SurveyQuestionType | - +Widget build() + +index: int; + <static>+values: List<SurveyQuestionType>; + <static>+choice: SurveyQuestionType; + <static>+bool: SurveyQuestionType; + <static>+scale: SurveyQuestionType ] - [<abstract>StudyDesignPageWidget]<:-[StudyDesignInterventionsFormView] + [SurveyQuestionType]o-[SurveyQuestionType] + [Enum]<:--[SurveyQuestionType] - [<abstract>StudyDesignPageWidget + [BoolQuestionFormView | - +Widget? banner() + +formViewModel: QuestionFormViewModel + | + +Widget build() ] - [<abstract>StudyPageWidget]<:-[<abstract>StudyDesignPageWidget] + [BoolQuestionFormView]o-[QuestionFormViewModel] + [<abstract>ConsumerWidget]<:-[BoolQuestionFormView] - [ConsentItemFormView + [ChoiceQuestionFormView | - +formViewModel: ConsentItemFormViewModel + +formViewModel: QuestionFormViewModel + | + +Widget build() ] - [ConsentItemFormView]o-[ConsentItemFormViewModel] + [ChoiceQuestionFormView]o-[QuestionFormViewModel] + [<abstract>ConsumerWidget]<:-[ChoiceQuestionFormView] - [ConsentItemFormData + [ScheduleControls | - +consentId: String; - +title: String; - +description: String; - +iconName: String?; - +id: String + +formViewModel: WithScheduleControls | - +ConsentItem toConsentItem(); - +ConsentItemFormData copy() + +Widget build(); + -List<FormTableRow> _conditionalTimeRestrictions() ] - [<abstract>IFormData]<:-[ConsentItemFormData] + [ScheduleControls]o-[<abstract>WithScheduleControls] + [<abstract>FormConsumerWidget]<:-[ScheduleControls] - [EnrollmentFormViewModel + [<abstract>WithScheduleControls | - +study: Study; - +router: GoRouter; - +consentItemDelegate: EnrollmentFormConsentItemDelegate; - +enrollmentTypeControl: FormControl<Participation>; - +consentItemArray: FormArray<dynamic>; - +consentItemFormViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData>; - +form: FormGroup; - +enrollmentTypeControlOptions: List<FormControlOption<Participation>>; - +consentItemModels: List<ConsentItemFormViewModel>; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titles: Map<FormMode, String>; - +canTestScreener: bool; - +canTestConsent: bool; - +questionTitles: Map<FormMode, String Function()> + +isTimeRestrictedControl: FormControl<bool>; + +instanceID: FormControl<String>; + +restrictedTimeStartControl: FormControl<Time>; + +restrictedTimeStartPickerControl: FormControl<TimeOfDay>; + +restrictedTimeEndControl: FormControl<Time>; + +restrictedTimeEndPickerControl: FormControl<TimeOfDay>; + +hasReminderControl: FormControl<bool>; + +reminderTimeControl: FormControl<Time>; + +reminderTimePickerControl: FormControl<TimeOfDay>; + -_reminderControlStream: StreamSubscription<dynamic>?; + +scheduleFormControls: Map<String, FormControl<Object>>; + +hasReminder: bool; + +isTimeRestricted: bool; + +timeRestriction: List<Time>? | - +void setControlsFrom(); - +EnrollmentFormData buildFormData(); - +void read(); - +List<ModelAction<dynamic>> availableActions(); - +List<ModelAction<dynamic>> availablePopupActions(); - +List<ModelAction<dynamic>> availableInlineActions(); - +void onSelectItem(); - +void onNewItem(); - +ScreenerQuestionFormRouteArgs buildNewScreenerQuestionFormRouteArgs(); - +ScreenerQuestionFormRouteArgs buildScreenerQuestionFormRouteArgs(); - +ConsentItemFormRouteArgs buildNewConsentItemFormRouteArgs(); - +ConsentItemFormRouteArgs buildConsentItemFormRouteArgs(); - +dynamic testScreener(); - +dynamic testConsent(); - +ScreenerQuestionFormViewModel provideQuestionFormViewModel() + +void setScheduleControlsFrom(); + -dynamic _initReminderControl() ] - [EnrollmentFormViewModel]o-[Study] - [EnrollmentFormViewModel]o-[GoRouter] - [EnrollmentFormViewModel]o-[EnrollmentFormConsentItemDelegate] - [EnrollmentFormViewModel]o-[FormControl] - [EnrollmentFormViewModel]o-[FormArray] - [EnrollmentFormViewModel]o-[FormViewModelCollection] - [EnrollmentFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[EnrollmentFormViewModel] - [<abstract>WithQuestionnaireControls]<:-[EnrollmentFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[EnrollmentFormViewModel] - [<abstract>IListActionProvider]<:--[EnrollmentFormViewModel] - [<abstract>IProviderArgsResolver]<:--[EnrollmentFormViewModel] + [<abstract>WithScheduleControls]o-[FormControl] + [<abstract>WithScheduleControls]o-[StreamSubscription] - [EnrollmentFormConsentItemDelegate + [<abstract>IFormDataWithSchedule | - +formViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData>; - +owner: EnrollmentFormViewModel; - +propagateOnSave: bool; - +validationSet: dynamic + +instanceId: String; + +isTimeLocked: bool; + +timeLockStart: StudyUTimeOfDay?; + +timeLockEnd: StudyUTimeOfDay?; + +hasReminder: bool; + +reminderTime: StudyUTimeOfDay? | - +void onCancel(); - +dynamic onSave(); - +ConsentItemFormViewModel provide(); - +List<ModelAction<dynamic>> availableActions(); - +void onNewItem(); - +void onSelectItem() + +Schedule toSchedule() ] - [EnrollmentFormConsentItemDelegate]o-[FormViewModelCollection] - [EnrollmentFormConsentItemDelegate]o-[EnrollmentFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[EnrollmentFormConsentItemDelegate] - [<abstract>IListActionProvider]<:--[EnrollmentFormConsentItemDelegate] - [<abstract>IProviderArgsResolver]<:--[EnrollmentFormConsentItemDelegate] + [<abstract>IFormDataWithSchedule]o-[StudyUTimeOfDay] + [<abstract>IFormData]<:--[<abstract>IFormDataWithSchedule] - [ConsentItemFormViewModel + [StudyFormViewModel | - +consentIdControl: FormControl<String>; - +titleControl: FormControl<String>; - +descriptionControl: FormControl<String>; - +iconControl: FormControl<IconOption>; + +studyDirtyCopy: Study?; + +studyRepository: IStudyRepository; + +authRepository: IAuthRepository; + +router: GoRouter; + +studyInfoFormViewModel: StudyInfoFormViewModel; + +enrollmentFormViewModel: EnrollmentFormViewModel; + +measurementsFormViewModel: MeasurementsFormViewModel; + +reportsFormViewModel: ReportsFormViewModel; + +interventionsFormViewModel: InterventionsFormViewModel; +form: FormGroup; - +consentId: String; + +isStudyReadonly: bool; +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titleRequired: dynamic; - +descriptionRequired: dynamic; +titles: Map<FormMode, String> | + +void read(); +void setControlsFrom(); - +ConsentItemFormData buildFormData(); - +ConsentItemFormViewModel createDuplicate() + +Study buildFormData(); + +void dispose(); + +void onCancel(); + +dynamic onSave(); + -dynamic _applyAndSaveSubform() ] - [ConsentItemFormViewModel]o-[FormControl] - [ConsentItemFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[ConsentItemFormViewModel] + [StudyFormViewModel]o-[Study] + [StudyFormViewModel]o-[<abstract>IStudyRepository] + [StudyFormViewModel]o-[<abstract>IAuthRepository] + [StudyFormViewModel]o-[GoRouter] + [StudyFormViewModel]o-[StudyInfoFormViewModel] + [StudyFormViewModel]o-[EnrollmentFormViewModel] + [StudyFormViewModel]o-[MeasurementsFormViewModel] + [StudyFormViewModel]o-[ReportsFormViewModel] + [StudyFormViewModel]o-[InterventionsFormViewModel] + [StudyFormViewModel]o-[FormGroup] + [<abstract>FormViewModel]<:-[StudyFormViewModel] + [<abstract>IFormViewModelDelegate]<:--[StudyFormViewModel] - [EnrollmentFormData + [<abstract>StudyDesignPageWidget | - <static>+kDefaultEnrollmentType: Participation; - +enrollmentType: Participation; + +Widget? banner() + ] + + [<abstract>StudyPageWidget]<:-[<abstract>StudyDesignPageWidget] + + [MeasurementSurveyFormData + | + +measurementId: String; + +title: String; + +introText: String?; + +outroText: String?; +questionnaireFormData: QuestionnaireFormData; - +consentItemsFormData: List<ConsentItemFormData>?; + <static>+kDefaultTitle: String; +id: String | - +Study apply(); - +EnrollmentFormData copy() + +QuestionnaireTask toQuestionnaireTask(); + +MeasurementSurveyFormData copy() ] - [EnrollmentFormData]o-[Participation] - [EnrollmentFormData]o-[QuestionnaireFormData] - [<abstract>IStudyFormData]<:--[EnrollmentFormData] + [MeasurementSurveyFormData]o-[QuestionnaireFormData] + [<abstract>IFormDataWithSchedule]<:-[MeasurementSurveyFormData] - [<abstract>IScreenerQuestionLogicFormViewModel + [MeasurementSurveyFormViewModel | - +isDirtyOptionsBannerVisible: bool + +study: Study; + +measurementIdControl: FormControl<String>; + +instanceIdControl: FormControl<String>; + +surveyTitleControl: FormControl<String>; + +surveyIntroTextControl: FormControl<String>; + +surveyOutroTextControl: FormControl<String>; + +form: FormGroup; + +measurementId: String; + +instanceId: String; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +titleRequired: dynamic; + +atLeastOneQuestion: dynamic; + +breadcrumbsTitle: String; + +titles: Map<FormMode, String> + | + +void setControlsFrom(); + +MeasurementSurveyFormData buildFormData(); + +List<ModelAction<dynamic>> availableActions(); + +List<ModelAction<dynamic>> availablePopupActions(); + +List<ModelAction<dynamic>> availableInlineActions(); + +void onSelectItem(); + +void onNewItem(); + +SurveyQuestionFormRouteArgs buildNewFormRouteArgs(); + +SurveyQuestionFormRouteArgs buildFormRouteArgs(); + +MeasurementSurveyFormViewModel createDuplicate() ] - [ScreenerQuestionLogicFormView + [MeasurementSurveyFormViewModel]o-[Study] + [MeasurementSurveyFormViewModel]o-[FormControl] + [MeasurementSurveyFormViewModel]o-[FormGroup] + [<abstract>ManagedFormViewModel]<:-[MeasurementSurveyFormViewModel] + [<abstract>WithQuestionnaireControls]<:-[MeasurementSurveyFormViewModel] + [<abstract>WithScheduleControls]<:-[MeasurementSurveyFormViewModel] + [<abstract>IFormViewModelDelegate]<:--[MeasurementSurveyFormViewModel] + [<abstract>IListActionProvider]<:--[MeasurementSurveyFormViewModel] + [<abstract>IProviderArgsResolver]<:--[MeasurementSurveyFormViewModel] + + [SurveyPreview | - +formViewModel: ScreenerQuestionFormViewModel + +routeArgs: MeasurementFormRouteArgs | - +Widget build(); - -dynamic _buildInfoBanner(); - -dynamic _buildAnswerOptionsLogicControls(); - -List<Widget> _buildOptionLogicRow() + +Widget build() ] - [ScreenerQuestionLogicFormView]o-[ScreenerQuestionFormViewModel] - [<abstract>FormConsumerWidget]<:-[ScreenerQuestionLogicFormView] + [SurveyPreview]o-[MeasurementFormRouteArgs] + [<abstract>ConsumerWidget]<:-[SurveyPreview] - [ScreenerQuestionFormViewModel - | - <static>+defaultResponseOptionValidity: bool; - +responseOptionsDisabledArray: FormArray<dynamic>; - +responseOptionsLogicControls: FormArray<bool>; - +responseOptionsLogicDescriptionControls: FormArray<String>; - -_questionBaseControls: Map<String, AbstractControl<dynamic>>; - +prevResponseOptionControls: List<AbstractControl<dynamic>>; - +prevResponseOptionValues: List<dynamic>; - +responseOptionsDisabledControls: List<AbstractControl<dynamic>>; - +logicControlOptions: List<FormControlOption<bool>>; - +questionBaseControls: Map<String, AbstractControl<dynamic>>; - +isDirtyOptionsBannerVisible: bool + [MeasurementSurveyFormView | - +dynamic onResponseOptionsChanged(); - +void setControlsFrom(); - +QuestionFormData buildFormData(); - -List<FormControl<dynamic>> _copyFormControls(); - -AbstractControl<dynamic>? _findAssociatedLogicControlFor(); - -AbstractControl<dynamic>? _findAssociatedControlFor(); - +ScreenerQuestionFormViewModel createDuplicate() + +formViewModel: MeasurementSurveyFormViewModel ] - [ScreenerQuestionFormViewModel]o-[FormArray] - [QuestionFormViewModel]<:-[ScreenerQuestionFormViewModel] - [<abstract>IScreenerQuestionLogicFormViewModel]<:--[ScreenerQuestionFormViewModel] + [MeasurementSurveyFormView]o-[MeasurementSurveyFormViewModel] - [StudyDesignEnrollmentFormView + [StudyDesignMeasurementsFormView | - +Widget build(); - -dynamic _showScreenerQuestionSidesheetWithArgs(); - -dynamic _showConsentItemSidesheetWithArgs() + +Widget build() ] - [<abstract>StudyDesignPageWidget]<:-[StudyDesignEnrollmentFormView] + [<abstract>StudyDesignPageWidget]<:-[StudyDesignMeasurementsFormView] - [<abstract>WithQuestionnaireControls + [MeasurementsFormViewModel | - +questionsArray: FormArray<dynamic>; - +questionFormViewModels: FormViewModelCollection<Q, QuestionFormData>; - +questionnaireControls: Map<String, FormArray<dynamic>>; - +propagateOnSave: bool; - +questionModels: List<Q>; - +questionTitles: Map<FormMode, String Function()> + +study: Study; + +router: GoRouter; + +measurementsArray: FormArray<dynamic>; + +surveyMeasurementFormViewModels: FormViewModelCollection<MeasurementSurveyFormViewModel, MeasurementSurveyFormData>; + +form: FormGroup; + +measurementViewModels: List<MeasurementSurveyFormViewModel>; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +measurementRequired: dynamic; + +titles: Map<FormMode, String> | - +void setQuestionnaireControlsFrom(); - +QuestionnaireFormData buildQuestionnaireFormData(); +void read(); + +void setControlsFrom(); + +MeasurementsFormData buildFormData(); + +List<ModelAction<dynamic>> availableActions(); + +List<ModelAction<dynamic>> availablePopupActions(); + +List<ModelAction<dynamic>> availableInlineActions(); + +void onSelectItem(); + +void onNewItem(); + +MeasurementSurveyFormViewModel provide(); +void onCancel(); - +dynamic onSave(); - +Q provide(); - +Q provideQuestionFormViewModel() + +dynamic onSave() ] - [<abstract>WithQuestionnaireControls]o-[FormArray] - [<abstract>WithQuestionnaireControls]o-[FormViewModelCollection] - [<abstract>IFormViewModelDelegate]<:--[<abstract>WithQuestionnaireControls] - [<abstract>IProviderArgsResolver]<:--[<abstract>WithQuestionnaireControls] + [MeasurementsFormViewModel]o-[Study] + [MeasurementsFormViewModel]o-[GoRouter] + [MeasurementsFormViewModel]o-[FormArray] + [MeasurementsFormViewModel]o-[FormViewModelCollection] + [MeasurementsFormViewModel]o-[FormGroup] + [<abstract>FormViewModel]<:-[MeasurementsFormViewModel] + [<abstract>IFormViewModelDelegate]<:--[MeasurementsFormViewModel] + [<abstract>IListActionProvider]<:--[MeasurementsFormViewModel] + [<abstract>IProviderArgsResolver]<:--[MeasurementsFormViewModel] - [QuestionFormViewModel + [MeasurementsFormData | - <static>+defaultQuestionType: SurveyQuestionType; - -_titles: Map<FormMode, String Function()>?; - +questionIdControl: FormControl<String>; - +questionTypeControl: FormControl<SurveyQuestionType>; - +questionTextControl: FormControl<String>; - +questionInfoTextControl: FormControl<String>; - +questionBaseControls: Map<String, AbstractControl<dynamic>>; - +isMultipleChoiceControl: FormControl<bool>; - +choiceResponseOptionsArray: FormArray<dynamic>; - +customOptionsMin: int; - +customOptionsMax: int; - +customOptionsInitial: int; - +boolResponseOptionsArray: FormArray<String>; - <static>+kDefaultScaleMinValue: int; - <static>+kDefaultScaleMaxValue: int; - <static>+kNumMidValueControls: int; - <static>+kMidValueDebounceMilliseconds: int; - +scaleMinValueControl: FormControl<int>; - +scaleMaxValueControl: FormControl<int>; - -_scaleRangeControl: FormControl<int>; - +scaleMinLabelControl: FormControl<String>; - +scaleMaxLabelControl: FormControl<String>; - +scaleMidValueControls: FormArray<int>; - +scaleMidLabelControls: FormArray<String?>; - -_scaleResponseOptionsArray: FormArray<int>; - +scaleMinColorControl: FormControl<SerializableColor>; - +scaleMaxColorControl: FormControl<SerializableColor>; - +prevMidValues: List<int?>?; - -_controlsByQuestionType: Map<SurveyQuestionType, FormGroup>; - -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - -_validationConfigsByQuestionType: Map<SurveyQuestionType, Map<FormValidationSetEnum, List<FormControlValidation>>>; - +form: FormGroup; - +questionId: String; - +questionType: SurveyQuestionType; - +questionTypeControlOptions: List<FormControlOption<SurveyQuestionType>>; - +answerOptionsArray: FormArray<dynamic>; - +answerOptionsControls: List<AbstractControl<dynamic>>; - +validAnswerOptions: List<String>; - +boolOptions: List<AbstractControl<String>>; - +scaleMinValue: int; - +scaleMaxValue: int; - +scaleRange: int; - +scaleAllValueControls: List<AbstractControl<int>>; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +questionTextRequired: dynamic; - +numValidChoiceOptions: dynamic; - +scaleRangeValid: dynamic; - +titles: Map<FormMode, String>; - +isAddOptionButtonVisible: bool; - +isMidValuesClearedInfoVisible: bool + +surveyMeasurements: List<MeasurementSurveyFormData>; + +id: String | - +String? scaleMidLabelAt(); - -dynamic _onScaleRangeChanged(); - -dynamic _applyInputFormatters(); - -dynamic _updateScaleMidValueControls(); - -List<FormControlValidation> _getValidationConfig(); - +dynamic onQuestionTypeChanged(); - +dynamic onResponseOptionsChanged(); - -void _updateFormControls(); - +void initControls(); - +void setControlsFrom(); - +QuestionFormData buildFormData(); - +List<ModelAction<dynamic>> availableActions(); - +void onNewItem(); - +void onSelectItem(); - +QuestionFormViewModel createDuplicate() + +Study apply(); + +MeasurementsFormData copy() ] - [QuestionFormViewModel]o-[SurveyQuestionType] - [QuestionFormViewModel]o-[FormControl] - [QuestionFormViewModel]o-[FormArray] - [QuestionFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[QuestionFormViewModel] - [<abstract>IListActionProvider]<:--[QuestionFormViewModel] + [<abstract>IStudyFormData]<:--[MeasurementsFormData] - [SurveyQuestionFormView + [StudyTestScreen | - +formViewModel: QuestionFormViewModel; - +isHtmlStyleable: bool + +previewRoute: String? + | + +Widget build(); + +Widget? banner(); + +dynamic load(); + +dynamic save(); + +dynamic showHelp() ] - [SurveyQuestionFormView]o-[QuestionFormViewModel] + [<abstract>StudyPageWidget]<:-[StudyTestScreen] - [<abstract>QuestionFormData - | - <static>+questionTypeFormDataFactories: Map<SurveyQuestionType, QuestionFormData Function(Question<dynamic>, List<EligibilityCriterion>)>; - +questionId: String; - +questionText: String; - +questionInfoText: String?; - +questionType: SurveyQuestionType; - +responseOptionsValidity: Map<dynamic, bool>; - +responseOptions: List<dynamic>; - +id: String + [StudySettingsDialog | - +Question<dynamic> toQuestion(); - +EligibilityCriterion toEligibilityCriterion(); - +Answer<dynamic> constructAnswerFor(); - +dynamic setResponseOptionsValidityFrom(); - +QuestionFormData copy() + +Widget build() ] - [<abstract>QuestionFormData]o-[SurveyQuestionType] - [<abstract>IFormData]<:--[<abstract>QuestionFormData] + [<abstract>StudyPageWidget]<:-[StudySettingsDialog] - [ChoiceQuestionFormData + [StudySettingsFormViewModel | - +isMultipleChoice: bool; - +answerOptions: List<String>; - +responseOptions: List<String> + +study: AsyncValue<Study>; + +studyRepository: IStudyRepository; + <static>+defaultPublishedToRegistry: bool; + <static>+defaultPublishedToRegistryResults: bool; + +isPublishedToRegistryControl: FormControl<bool>; + +isPublishedToRegistryResultsControl: FormControl<bool>; + +form: FormGroup; + +titles: Map<FormMode, String> | - +Question<dynamic> toQuestion(); - +QuestionFormData copy(); - -Choice _buildChoiceForValue(); - +Answer<dynamic> constructAnswerFor() + +void setControlsFrom(); + +Study buildFormData(); + +dynamic keepControlsSynced(); + +dynamic save(); + +dynamic setLaunchDefaults() ] - [<abstract>QuestionFormData]<:-[ChoiceQuestionFormData] + [StudySettingsFormViewModel]o-[<abstract>AsyncValue] + [StudySettingsFormViewModel]o-[<abstract>IStudyRepository] + [StudySettingsFormViewModel]o-[FormControl] + [StudySettingsFormViewModel]o-[FormGroup] + [<abstract>FormViewModel]<:-[StudySettingsFormViewModel] - [BoolQuestionFormData + [<abstract>IStudyNavViewModel | - <static>+kResponseOptions: Map<String, bool>; - +responseOptions: List<String> + +isEditTabEnabled: bool; + +isTestTabEnabled: bool; + +isRecruitTabEnabled: bool; + +isMonitorTabEnabled: bool; + +isAnalyzeTabEnabled: bool; + +isSettingsEnabled: bool + ] + + [StudyNav | - +Question<dynamic> toQuestion(); - +BoolQuestionFormData copy(); - +Answer<dynamic> constructAnswerFor() + <static>+dynamic tabs(); + <static>+dynamic edit(); + <static>+dynamic test(); + <static>+dynamic recruit(); + <static>+dynamic monitor(); + <static>+dynamic analyze() ] - [<abstract>QuestionFormData]<:-[BoolQuestionFormData] + [StudyDesignNav + | + <static>+dynamic tabs(); + <static>+dynamic info(); + <static>+dynamic enrollment(); + <static>+dynamic interventions(); + <static>+dynamic measurements(); + <static>+dynamic reports() + ] - [ScaleQuestionFormData + [WebFrame | - +minValue: double; - +maxValue: double; - +minLabel: String?; - +maxLabel: String?; - +midValues: List<double?>; - +midLabels: List<String?>; - +stepSize: double; - +initialValue: double?; - +minColor: Color?; - +maxColor: Color?; - +responseOptions: List<double>; - +midAnnotations: List<Annotation> + +previewSrc: String; + +studyId: String | - +ScaleQuestion toQuestion(); - +QuestionFormData copy(); - +Answer<dynamic> constructAnswerFor() + +Widget build() ] - [ScaleQuestionFormData]o-[Color] - [<abstract>QuestionFormData]<:-[ScaleQuestionFormData] + [DisabledFrame + | + +Widget build() + ] - [ChoiceQuestionFormView + [PhoneContainer | - +formViewModel: QuestionFormViewModel + <static>+defaultWidth: double; + <static>+defaultHeight: double; + +width: double; + +height: double; + +borderColor: Color; + +borderWidth: double; + +borderRadius: double; + +innerContent: Widget; + +innerContentBackgroundColor: Color? | +Widget build() ] - [ChoiceQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[ChoiceQuestionFormView] + [PhoneContainer]o-[Color] + [PhoneContainer]o-[<abstract>Widget] - [<abstract>IScaleQuestionFormViewModel + [MobileFrame | - +isMidValuesClearedInfoVisible: bool + +Widget build() ] - [ScaleQuestionFormView + [DesktopFrame | - +formViewModel: QuestionFormViewModel + +Widget build() ] - [ScaleQuestionFormView]o-[QuestionFormViewModel] - - [BoolQuestionFormView + [StudyParticipationBadge | - +formViewModel: QuestionFormViewModel + +participation: Participation; + +type: BadgeType; + +showPrefixIcon: bool | +Widget build() ] - [BoolQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[BoolQuestionFormView] + [StudyParticipationBadge]o-[Participation] + [StudyParticipationBadge]o-[BadgeType] - [SurveyQuestionType + [<abstract>IStudyStatusBadgeViewModel | - +index: int; - <static>+values: List<SurveyQuestionType>; - <static>+choice: SurveyQuestionType; - <static>+bool: SurveyQuestionType; - <static>+scale: SurveyQuestionType + +studyParticipation: Participation?; + +studyStatus: StudyStatus? ] - [SurveyQuestionType]o-[SurveyQuestionType] - [Enum]<:--[SurveyQuestionType] + [<abstract>IStudyStatusBadgeViewModel]o-[Participation] + [<abstract>IStudyStatusBadgeViewModel]o-[StudyStatus] - [QuestionnaireFormData + [StudyStatusBadge | - +questionsData: List<QuestionFormData>?; - +id: String + +participation: Participation?; + +status: StudyStatus?; + +type: BadgeType; + +showPrefixIcon: bool; + +showTooltip: bool | - +StudyUQuestionnaire toQuestionnaire(); - +List<EligibilityCriterion> toEligibilityCriteria(); - +QuestionnaireFormData copy() + +Widget build() ] - [<abstract>IFormData]<:--[QuestionnaireFormData] + [StudyStatusBadge]o-[Participation] + [StudyStatusBadge]o-[StudyStatus] + [StudyStatusBadge]o-[BadgeType] - [ScheduleControls + [StudyBaseController | - +formViewModel: WithScheduleControls + +studyId: String; + +studyRepository: IStudyRepository; + +router: GoRouter; + +studySubscription: StreamSubscription<WrappedModel<Study>>? | - +Widget build(); - -List<FormTableRow> _conditionalTimeRestrictions() + +dynamic subscribeStudy(); + +dynamic onStudySubscriptionUpdate(); + +dynamic onStudySubscriptionError(); + +void dispose() ] - [ScheduleControls]o-[<abstract>WithScheduleControls] - [<abstract>FormConsumerWidget]<:-[ScheduleControls] + [StudyBaseController]o-[<abstract>IStudyRepository] + [StudyBaseController]o-[GoRouter] + [StudyBaseController]o-[StreamSubscription] - [<abstract>IFormDataWithSchedule + [<abstract>StudyPageWidget | - +instanceId: String; - +isTimeLocked: bool; - +timeLockStart: StudyUTimeOfDay?; - +timeLockEnd: StudyUTimeOfDay?; - +hasReminder: bool; - +reminderTime: StudyUTimeOfDay? + +studyId: String | - +Schedule toSchedule() + +Widget? banner() ] - [<abstract>IFormDataWithSchedule]o-[StudyUTimeOfDay] - [<abstract>IFormData]<:--[<abstract>IFormDataWithSchedule] + [<abstract>ConsumerWidget]<:-[<abstract>StudyPageWidget] + [<abstract>IWithBanner]<:--[<abstract>StudyPageWidget] - [<abstract>WithScheduleControls - | - +isTimeRestrictedControl: FormControl<bool>; - +instanceID: FormControl<String>; - +restrictedTimeStartControl: FormControl<Time>; - +restrictedTimeStartPickerControl: FormControl<TimeOfDay>; - +restrictedTimeEndControl: FormControl<Time>; - +restrictedTimeEndPickerControl: FormControl<TimeOfDay>; - +hasReminderControl: FormControl<bool>; - +reminderTimeControl: FormControl<Time>; - +reminderTimePickerControl: FormControl<TimeOfDay>; - -_reminderControlStream: StreamSubscription<dynamic>?; - +scheduleFormControls: Map<String, FormControl<Object>>; - +hasReminder: bool; - +isTimeRestricted: bool; - +timeRestriction: List<Time>? + [PreviewFrame | - +void setScheduleControlsFrom(); - -dynamic _initReminderControl() + +studyId: String; + +routeArgs: StudyFormRouteArgs?; + +route: String? ] - [<abstract>WithScheduleControls]o-[FormControl] - [<abstract>WithScheduleControls]o-[StreamSubscription] + [PreviewFrame]o-[<abstract>StudyFormRouteArgs] - [<abstract>IStudyFormData + [StudyController | - +Study apply() - ] - - [<abstract>IFormData]<:--[<abstract>IStudyFormData] - - [StudyFormValidationSet + +notificationService: INotificationService; + +studyEventsSubscription: StreamSubscription<ModelEvent<Study>>?; + +studyActions: List<ModelAction<dynamic>> | - +index: int; - <static>+values: List<StudyFormValidationSet> + +dynamic syncStudyStatus(); + +dynamic onStudySubscriptionUpdate(); + -dynamic _redirectNewToActualStudyID(); + +dynamic publishStudy(); + +void onChangeStudyParticipation(); + +void onAddParticipants(); + +void onSettingsPressed(); + +void dispose() ] - [Enum]<:--[StudyFormValidationSet] + [StudyController]o-[<abstract>INotificationService] + [StudyController]o-[StreamSubscription] + [StudyBaseController]<:-[StudyController] - [StudyFormScaffold + [FrameControlsWidget | - +studyId: String; - +formViewModelBuilder: T Function(WidgetRef); - +formViewBuilder: Widget Function(T) + +onRefresh: void Function()?; + +onOpenNewTab: void Function()?; + +enabled: bool | +Widget build() ] - [StudyFormScaffold]o-[T Function(WidgetRef)] - [StudyFormScaffold]o-[Widget Function(T)] - [<abstract>ConsumerWidget]<:-[StudyFormScaffold] + [FrameControlsWidget]o-[void Function()?] + [<abstract>ConsumerWidget]<:-[FrameControlsWidget] - [<abstract>IAppDelegate + [RouteInformation | - +dynamic onAppStart() + +route: String?; + +extra: String?; + +cmd: String?; + +data: String? + | + +String toString() ] - [AppController + [<abstract>PlatformController | - +sharedPreferences: SharedPreferences; - +appDelegates: List<IAppDelegate>; - -_delayedFuture: dynamic; - +isInitialized: dynamic + +studyId: String; + +baseSrc: String; + +previewSrc: String; + +routeInformation: RouteInformation; + +frameWidget: Widget | - +dynamic onAppStart(); - -dynamic _callDelegates() + +void activate(); + +void registerViews(); + +void generateUrl(); + +void navigate(); + +void refresh(); + +void listen(); + +void send(); + +void openNewPage() ] - [AppController]o-[SharedPreferences] + [<abstract>PlatformController]o-[RouteInformation] + [<abstract>PlatformController]o-[<abstract>Widget] - [StudyAnalyzeScreen + [WebController | - +Widget? banner(); - +Widget build() + +iFrameElement: IFrameElement + | + +void activate(); + +void registerViews(); + +void generateUrl(); + +void navigate(); + +void refresh(); + +void openNewPage(); + +void listen(); + +void send() ] - [<abstract>StudyPageWidget]<:-[StudyAnalyzeScreen] + [WebController]o-[IFrameElement] + [<abstract>PlatformController]<:-[WebController] - [StudyAnalyzeController + [MobileController | - +dynamic onExport() + +void openNewPage(); + +void refresh(); + +void registerViews(); + +void listen(); + +void send(); + +void navigate(); + +void activate(); + +void generateUrl() ] - [StudyBaseController]<:-[StudyAnalyzeController] + [<abstract>PlatformController]<:-[MobileController] - [DashboardScaffold - | - +body: Widget + [TestAppRoutes | - +Widget build() + <static>+studyOverview: String; + <static>+eligibility: String; + <static>+intervention: String; + <static>+consent: String; + <static>+journey: String; + <static>+dashboard: String ] - [DashboardScaffold]o-[<abstract>Widget] - - [StudiesTable - | - +studies: List<Study>; - +onSelect: void Function(Study); - +getActions: List<ModelAction<dynamic>> Function(Study); - +emptyWidget: Widget; - +pinnedStudies: Iterable<String>; - +dashboardController: DashboardController; - +pinnedPredicates: int Function(Study, Study); - -_sortColumns: List<int Function(Study, Study)?> + [<abstract>IStudyAppBarViewModel | - +Widget build(); - -List<Widget> _buildRow() + +isSyncIndicatorVisible: bool; + +isStatusBadgeVisible: bool; + +isPublishVisible: bool ] - [StudiesTable]o-[void Function(Study)] - [StudiesTable]o-[List<ModelAction<dynamic>> Function(Study)] - [StudiesTable]o-[<abstract>Widget] - [StudiesTable]o-[DashboardController] - [StudiesTable]o-[int Function(Study, Study)] + [<abstract>IStudyStatusBadgeViewModel]<:--[<abstract>IStudyAppBarViewModel] + [<abstract>IStudyNavViewModel]<:--[<abstract>IStudyAppBarViewModel] - [StudiesFilter + [StudyScaffold | - +index: int; - <static>+values: List<StudiesFilter> + +studyId: String; + +tabs: List<NavbarTab>?; + +tabsSubnav: List<NavbarTab>?; + +selectedTab: NavbarTab?; + +selectedTabSubnav: NavbarTab?; + +body: StudyPageWidget; + +drawer: Widget?; + +disableActions: bool; + +actionsSpacing: double; + +actionsPadding: double; + +layoutType: SingleColumnLayoutType?; + +appbarHeight: double; + +appbarSubnavHeight: double ] - [Enum]<:--[StudiesFilter] + [StudyScaffold]o-[NavbarTab] + [StudyScaffold]o-[<abstract>StudyPageWidget] + [StudyScaffold]o-[<abstract>Widget] + [StudyScaffold]o-[SingleColumnLayoutType] - [DashboardScreen + [StudyTestController | - +filter: StudiesFilter? + +authRepository: IAuthRepository; + +languageCode: String ] - [DashboardScreen]o-[StudiesFilter] - + [StudyTestController]o-[<abstract>IAuthRepository] + [StudyBaseController]<:-[StudyTestController] + + [DashboardScaffold + | + +body: Widget + | + +Widget build() + ] + + [DashboardScaffold]o-[<abstract>Widget] + [DashboardController | +studyRepository: IStudyRepository; @@ -2390,6 +2596,42 @@ [DashboardController]o-[SearchController] [<abstract>IModelActionProvider]<:--[DashboardController] + [StudiesFilter + | + +index: int; + <static>+values: List<StudiesFilter> + ] + + [Enum]<:--[StudiesFilter] + + [StudiesTable + | + +studies: List<Study>; + +onSelect: void Function(Study); + +getActions: List<ModelAction<dynamic>> Function(Study); + +emptyWidget: Widget; + +pinnedStudies: Iterable<String>; + +dashboardController: DashboardController; + +pinnedPredicates: int Function(Study, Study); + -_sortColumns: List<int Function(Study, Study)?> + | + +Widget build(); + -List<Widget> _buildRow() + ] + + [StudiesTable]o-[void Function(Study)] + [StudiesTable]o-[List<ModelAction<dynamic>> Function(Study)] + [StudiesTable]o-[<abstract>Widget] + [StudiesTable]o-[DashboardController] + [StudiesTable]o-[int Function(Study, Study)] + + [DashboardScreen + | + +filter: StudiesFilter? + ] + + [DashboardScreen]o-[StudiesFilter] + [AccountSettingsDialog | +Widget build() @@ -2397,23 +2639,214 @@ [<abstract>ConsumerWidget]<:-[AccountSettingsDialog] - [StudyMonitorScreen + [StudyUJobsToBeDone | +Widget build() ] - [<abstract>StudyPageWidget]<:-[StudyMonitorScreen] + [EmailTextField + | + +labelText: String; + +hintText: String?; + +formControlName: String?; + +formControl: FormControl<dynamic>? + ] - [AppStatus + [EmailTextField]o-[FormControl] + + [PasswordTextField + | + +labelText: String; + +hintText: String?; + +formControlName: String?; + +formControl: FormControl<dynamic>? + ] + + [PasswordTextField]o-[FormControl] + + [SignupForm + | + +formKey: AuthFormKey + | + +Widget build(); + -dynamic _onClickTermsOfUse(); + -dynamic _onClickPrivacyPolicy() + ] + + [SignupForm]o-[AuthFormKey] + [<abstract>FormConsumerRefWidget]<:-[SignupForm] + + [PasswordForgotForm + | + +formKey: AuthFormKey + | + +Widget build() + ] + + [PasswordForgotForm]o-[AuthFormKey] + [<abstract>FormConsumerRefWidget]<:-[PasswordForgotForm] + + [AuthFormController + | + +authRepository: IAuthRepository; + +sharedPreferences: SharedPreferences; + +notificationService: INotificationService; + +router: GoRouter; + +emailControl: FormControl<String>; + +passwordControl: FormControl<String>; + +passwordConfirmationControl: FormControl<String>; + +rememberMeControl: FormControl<bool>; + +termsOfServiceControl: FormControl<bool>; + <static>+authValidationMessages: Map<String, String Function(dynamic)>; + +loginForm: FormGroup; + +signupForm: FormGroup; + +passwordForgotForm: FormGroup; + +passwordRecoveryForm: FormGroup; + +controlValidatorsByForm: Map<AuthFormKey, Map<FormControl<dynamic>, List<Validator<dynamic>>>>; + -_formKey: AuthFormKey; + +shouldRemember: bool; + +formKey: AuthFormKey; + +form: FormGroup + | + -dynamic _onChangeFormKey(); + +dynamic resetControlsFor(); + -dynamic _forceValidationMessages(); + +dynamic signUp(); + -dynamic _signUp(); + +dynamic signIn(); + -dynamic _signInWith(); + +dynamic signOut(); + +dynamic resetPasswordForEmail(); + +dynamic sendPasswordResetLink(); + +dynamic recoverPassword(); + +dynamic updateUser(); + -void _setRememberMe(); + -void _delRememberMe(); + -void _initRememberMe() + ] + + [AuthFormController]o-[<abstract>IAuthRepository] + [AuthFormController]o-[SharedPreferences] + [AuthFormController]o-[<abstract>INotificationService] + [AuthFormController]o-[GoRouter] + [AuthFormController]o-[FormControl] + [AuthFormController]o-[FormGroup] + [AuthFormController]o-[AuthFormKey] + [<abstract>IFormGroupController]<:--[AuthFormController] + + [AuthFormKey | +index: int; - <static>+values: List<AppStatus>; - <static>+initializing: AppStatus; - <static>+initialized: AppStatus + <static>+values: List<AuthFormKey>; + <static>+login: AuthFormKey; + <static>+signup: AuthFormKey; + <static>+passwordForgot: AuthFormKey; + <static>+passwordRecovery: AuthFormKey; + <static>-_loginSubmit: AuthFormKey; + <static>-_signupSubmit: AuthFormKey ] - [AppStatus]o-[AppStatus] - [Enum]<:--[AppStatus] + [AuthFormKey]o-[AuthFormKey] + [Enum]<:--[AuthFormKey] + + [AuthScaffold + | + +body: Widget; + +formKey: AuthFormKey; + +leftContentMinWidth: double; + +leftPanelMinWidth: double; + +leftPanelPadding: EdgeInsets + ] + + [AuthScaffold]o-[<abstract>Widget] + [AuthScaffold]o-[AuthFormKey] + [AuthScaffold]o-[EdgeInsets] + + [LoginForm + | + +formKey: AuthFormKey + | + +Widget build() + ] + + [LoginForm]o-[AuthFormKey] + [<abstract>FormConsumerRefWidget]<:-[LoginForm] + + [PasswordRecoveryForm + | + +formKey: AuthFormKey + | + +Widget build() + ] + + [PasswordRecoveryForm]o-[AuthFormKey] + [<abstract>FormConsumerRefWidget]<:-[PasswordRecoveryForm] + + [<abstract>IAppDelegate + | + +dynamic onAppStart() + ] + + [AppController + | + +sharedPreferences: SharedPreferences; + +appDelegates: List<IAppDelegate>; + -_delayedFuture: dynamic; + +isInitialized: dynamic + | + +dynamic onAppStart(); + -dynamic _callDelegates() + ] + + [AppController]o-[SharedPreferences] + + [<abstract>ManagedFormViewModel + | + +ManagedFormViewModel<T> createDuplicate() + ] + + [<abstract>FormViewModel]<:-[<abstract>ManagedFormViewModel] + + [FormViewModelNotFoundException + ] + + [Exception]<:--[FormViewModelNotFoundException] + + [FormViewModelCollection + | + +formViewModels: List<T>; + +formArray: FormArray<dynamic>; + +stagedViewModels: List<T>; + +retrievableViewModels: List<T>; + +formData: List<D> + | + +void add(); + +T remove(); + +T? findWhere(); + +T? removeWhere(); + +bool contains(); + +void stage(); + +T commit(); + +void reset(); + +void read() + ] + + [FormViewModelCollection]o-[FormArray] + + [<abstract>FormValidationSetEnum + ] + + [FormControlValidation + | + +control: AbstractControl<dynamic>; + +validators: List<Validator<dynamic>>; + +asyncValidators: List<AsyncValidator<dynamic>>?; + +validationMessages: Map<String, String Function(Object)> + | + +FormControlValidation merge() + ] + + [FormControlValidation]o-[<abstract>AbstractControl] [FormInvalidException ] @@ -2512,66 +2945,35 @@ [FormMode]o-[FormMode] [Enum]<:--[FormMode] - [<abstract>IFormData + [CustomFormControl | - +id: String + -_onValueChangedDebouncer: Debouncer?; + -_onStatusChangedDebouncer: Debouncer?; + +onValueChanged: void Function(T?)?; + +onStatusChanged: void Function(ControlStatus)?; + +onStatusChangedDebounceTime: int?; + +onValueChangedDebounceTime: int? | - +IFormData copy() + +void dispose() ] - [<abstract>FormValidationSetEnum - ] + [CustomFormControl]o-[Debouncer] + [CustomFormControl]o-[void Function(T?)?] + [CustomFormControl]o-[void Function(ControlStatus)?] + [FormControl]<:-[CustomFormControl] - [FormControlValidation + [<abstract>IFormData | - +control: AbstractControl<dynamic>; - +validators: List<Validator<dynamic>>; - +asyncValidators: List<AsyncValidator<dynamic>>?; - +validationMessages: Map<String, String Function(Object)> + +id: String | - +FormControlValidation merge() + +IFormData copy() ] - [FormControlValidation]o-[<abstract>AbstractControl] - [UnsavedChangesDialog | +Widget build() ] - [<abstract>ManagedFormViewModel - | - +ManagedFormViewModel<T> createDuplicate() - ] - - [<abstract>FormViewModel]<:-[<abstract>ManagedFormViewModel] - - [FormViewModelNotFoundException - ] - - [Exception]<:--[FormViewModelNotFoundException] - - [FormViewModelCollection - | - +formViewModels: List<T>; - +formArray: FormArray<dynamic>; - +stagedViewModels: List<T>; - +retrievableViewModels: List<T>; - +formData: List<D> - | - +void add(); - +T remove(); - +T? findWhere(); - +T? removeWhere(); - +bool contains(); - +void stage(); - +T commit(); - +void reset(); - +void read() - ] - - [FormViewModelCollection]o-[FormArray] - [FormArrayTable | +control: AbstractControl<dynamic>; @@ -2609,727 +3011,856 @@ [FormArrayTable]o-[<abstract>Widget] [FormArrayTable]o-[EdgeInsets] - [CustomFormControl - | - -_onValueChangedDebouncer: Debouncer?; - -_onStatusChangedDebouncer: Debouncer?; - +onValueChanged: void Function(T?)?; - +onStatusChanged: void Function(ControlStatus)?; - +onStatusChangedDebounceTime: int?; - +onValueChangedDebounceTime: int? - | - +void dispose() + [App ] - [CustomFormControl]o-[Debouncer] - [CustomFormControl]o-[void Function(T?)?] - [CustomFormControl]o-[void Function(ControlStatus)?] - [FormControl]<:-[CustomFormControl] + [AppContent + ] - [<abstract>IStudyNavViewModel + [StudyMonitorScreen | - +isEditTabEnabled: bool; - +isTestTabEnabled: bool; - +isRecruitTabEnabled: bool; - +isMonitorTabEnabled: bool; - +isAnalyzeTabEnabled: bool; - +isSettingsEnabled: bool + +Widget build() ] - [StudyNav + [<abstract>StudyPageWidget]<:-[StudyMonitorScreen] + + [DrawerEntry | - <static>+dynamic tabs(); - <static>+dynamic edit(); - <static>+dynamic test(); - <static>+dynamic recruit(); - <static>+dynamic monitor(); - <static>+dynamic analyze() + +localizedTitle: String Function(); + +icon: IconData?; + +localizedHelpText: String Function()?; + +enabled: bool; + +onSelected: void Function(BuildContext, WidgetRef)?; + +title: String; + +helpText: String? + | + +void onClick() ] - [StudyDesignNav + [DrawerEntry]o-[String Function()] + [DrawerEntry]o-[IconData] + [DrawerEntry]o-[String Function()?] + [DrawerEntry]o-[void Function(BuildContext, WidgetRef)?] + + [GoRouterDrawerEntry | - <static>+dynamic tabs(); - <static>+dynamic info(); - <static>+dynamic enrollment(); - <static>+dynamic interventions(); - <static>+dynamic measurements(); - <static>+dynamic reports() + +intent: RoutingIntent + | + +void onClick() ] - [WebFrame + [GoRouterDrawerEntry]o-[RoutingIntent] + [DrawerEntry]<:-[GoRouterDrawerEntry] + + [AppDrawer | - +previewSrc: String; - +studyId: String + +title: String; + +width: int; + +leftPaddingEntries: double; + +logoPaddingVertical: double; + +logoPaddingHorizontal: double; + +logoMaxHeight: double; + +logoSectionMinHeight: double; + +logoSectionMaxHeight: double + ] + + [PrimaryButton | - +Widget build() + +text: String; + +icon: IconData?; + +isLoading: bool; + +showLoadingEarliestAfterMs: int; + +onPressed: void Function()?; + +tooltip: String; + +tooltipDisabled: String; + +enabled: bool; + +onPressedFuture: dynamic Function()?; + +innerPadding: EdgeInsets; + +minimumSize: Size?; + +isDisabled: bool ] - [DisabledFrame + [PrimaryButton]o-[IconData] + [PrimaryButton]o-[void Function()?] + [PrimaryButton]o-[dynamic Function()?] + [PrimaryButton]o-[EdgeInsets] + [PrimaryButton]o-[Size] + + [DismissButton + | + +onPressed: void Function()?; + +text: String? | +Widget build() ] - [PhoneContainer + [DismissButton]o-[void Function()?] + + [EmptyBody | - <static>+defaultWidth: double; - <static>+defaultHeight: double; - +width: double; - +height: double; - +borderColor: Color; - +borderWidth: double; - +borderRadius: double; - +innerContent: Widget; - +innerContentBackgroundColor: Color? + +icon: IconData?; + +leading: Widget?; + +leadingSpacing: double?; + +title: String?; + +description: String?; + +button: Widget? | +Widget build() ] - [PhoneContainer]o-[Color] - [PhoneContainer]o-[<abstract>Widget] + [EmptyBody]o-[IconData] + [EmptyBody]o-[<abstract>Widget] - [MobileFrame + [SplashPage | +Widget build() ] - [DesktopFrame + [ErrorPage + | + +error: Exception? | +Widget build() ] - [TestAppRoutes + [<abstract>ConsumerWidget]<:-[ErrorPage] + + [Search | - <static>+studyOverview: String; - <static>+eligibility: String; - <static>+intervention: String; - <static>+consent: String; - <static>+journey: String; - <static>+dashboard: String + +onQueryChanged: dynamic Function(String); + +searchController: SearchController?; + +hintText: String?; + +initialText: String? ] - [PreviewFrame + [Search]o-[dynamic Function(String)] + [Search]o-[SearchController] + + [SearchController | - +studyId: String; - +routeArgs: StudyFormRouteArgs?; - +route: String? + +setText: void Function(String) ] - [PreviewFrame]o-[<abstract>StudyFormRouteArgs] + [SearchController]o-[void Function(String)] - [FrameControlsWidget + [TextParagraph | - +onRefresh: void Function()?; - +onOpenNewTab: void Function()?; - +enabled: bool + +text: String?; + +style: TextStyle?; + +selectable: bool; + +span: List<TextSpan>? | +Widget build() ] - [FrameControlsWidget]o-[void Function()?] - [<abstract>ConsumerWidget]<:-[FrameControlsWidget] + [TextParagraph]o-[TextStyle] - [StudyBaseController + [FormControlLabel | - +studyId: String; - +studyRepository: IStudyRepository; - +router: GoRouter; - +studySubscription: StreamSubscription<WrappedModel<Study>>? + +formControl: AbstractControl<dynamic>; + +text: String; + +isClickable: bool; + +textStyle: TextStyle?; + +onClick: void Function(AbstractControl<dynamic>)? | - +dynamic subscribeStudy(); - +dynamic onStudySubscriptionUpdate(); - +dynamic onStudySubscriptionError(); - +void dispose() + +Widget build() ] - [StudyBaseController]o-[<abstract>IStudyRepository] - [StudyBaseController]o-[GoRouter] - [StudyBaseController]o-[StreamSubscription] + [FormControlLabel]o-[<abstract>AbstractControl] + [FormControlLabel]o-[TextStyle] + [FormControlLabel]o-[void Function(AbstractControl<dynamic>)?] - [StudyTestScreen + [HelpIcon | - +previewRoute: String? + +tooltipText: String? | - +Widget build(); - +Widget? banner(); - +dynamic load(); - +dynamic save(); - +dynamic showHelp() + +Widget build() ] - [<abstract>StudyPageWidget]<:-[StudyTestScreen] - - [RouteInformation + [ActionMenuInline | - +route: String?; - +extra: String?; - +cmd: String?; - +data: String? + +actions: List<ModelAction<dynamic>>; + +iconSize: double?; + +visible: bool; + +splashRadius: double?; + +paddingVertical: double?; + +paddingHorizontal: double? | - +String toString() + +Widget build() ] - [<abstract>PlatformController - | - +studyId: String; - +baseSrc: String; - +previewSrc: String; - +routeInformation: RouteInformation; - +frameWidget: Widget - | - +void activate(); - +void registerViews(); - +void generateUrl(); - +void navigate(); - +void refresh(); - +void listen(); - +void send(); - +void openNewPage() + [ReactiveCustomColorPicker ] - [<abstract>PlatformController]o-[RouteInformation] - [<abstract>PlatformController]o-[<abstract>Widget] + [ReactiveFormField]<:-[ReactiveCustomColorPicker] - [WebController + [SecondaryButton | - +iFrameElement: IFrameElement + +text: String; + +icon: IconData?; + +isLoading: bool; + +onPressed: void Function()? | - +void activate(); - +void registerViews(); - +void generateUrl(); - +void navigate(); - +void refresh(); - +void openNewPage(); - +void listen(); - +void send() + +Widget build() ] - [WebController]o-[IFrameElement] - [<abstract>PlatformController]<:-[WebController] + [SecondaryButton]o-[IconData] + [SecondaryButton]o-[void Function()?] - [MobileController + [StandardTableColumn | - +void openNewPage(); - +void refresh(); - +void registerViews(); - +void listen(); - +void send(); - +void navigate(); - +void activate(); - +void generateUrl() + +label: String; + +tooltip: String?; + +columnWidth: TableColumnWidth; + +sortable: bool; + +sortAscending: bool?; + +sortableIcon: Widget? ] - [<abstract>PlatformController]<:-[MobileController] + [StandardTableColumn]o-[<abstract>TableColumnWidth] + [StandardTableColumn]o-[<abstract>Widget] - [StudyTestController + [StandardTable | - +authRepository: IAuthRepository; - +languageCode: String + +items: List<T>; + +inputColumns: List<StandardTableColumn>; + +onSelectItem: void Function(T); + +trailingActionsAt: List<ModelAction<dynamic>> Function(T, int)?; + +trailingActionsMenuType: ActionMenuType?; + +sortColumnPredicates: List<int Function(T, T)?>?; + +pinnedPredicates: int Function(T, T)?; + +headerRowBuilder: TableRow Function(BuildContext, List<StandardTableColumn>)?; + +dataRowBuilder: TableRow Function(BuildContext, List<StandardTableColumn>)?; + +inputTrailingActionsColumn: StandardTableColumn; + +tableWrapper: Widget Function(Widget)?; + +cellSpacing: double; + +rowSpacing: double; + +minRowHeight: double?; + +showTableHeader: bool; + +hideLeadingTrailingWhenEmpty: bool; + +leadingWidget: Widget?; + +trailingWidget: Widget?; + +leadingWidgetSpacing: double?; + +trailingWidgetSpacing: double?; + +emptyWidget: Widget?; + +rowStyle: StandardTableStyle; + +disableRowInteractions: bool ] - [StudyTestController]o-[<abstract>IAuthRepository] - [StudyBaseController]<:-[StudyTestController] + [StandardTable]o-[void Function(T)] + [StandardTable]o-[List<ModelAction<dynamic>> Function(T, int)?] + [StandardTable]o-[ActionMenuType] + [StandardTable]o-[int Function(T, T)?] + [StandardTable]o-[TableRow Function(BuildContext, List<StandardTableColumn>)?] + [StandardTable]o-[StandardTableColumn] + [StandardTable]o-[Widget Function(Widget)?] + [StandardTable]o-[<abstract>Widget] + [StandardTable]o-[StandardTableStyle] - [<abstract>IStudyStatusBadgeViewModel + [StandardTableStyle | - +studyParticipation: Participation?; - +studyStatus: StudyStatus? + +index: int; + <static>+values: List<StandardTableStyle>; + <static>+plain: StandardTableStyle; + <static>+material: StandardTableStyle ] - [<abstract>IStudyStatusBadgeViewModel]o-[Participation] - [<abstract>IStudyStatusBadgeViewModel]o-[StudyStatus] + [StandardTableStyle]o-[StandardTableStyle] + [Enum]<:--[StandardTableStyle] - [StudyStatusBadge + [Badge | - +participation: Participation?; - +status: StudyStatus?; + +icon: IconData?; + +color: Color?; + +borderRadius: double; + +label: String; +type: BadgeType; - +showPrefixIcon: bool; - +showTooltip: bool + +padding: EdgeInsets; + +iconSize: double?; + +labelStyle: TextStyle? | - +Widget build() + +Widget build(); + -Color? _getBackgroundColor(); + -Color _getBorderColor(); + -Color? _getLabelColor() ] - [StudyStatusBadge]o-[Participation] - [StudyStatusBadge]o-[StudyStatus] - [StudyStatusBadge]o-[BadgeType] + [Badge]o-[IconData] + [Badge]o-[Color] + [Badge]o-[BadgeType] + [Badge]o-[EdgeInsets] + [Badge]o-[TextStyle] - [StudyController - | - +notificationService: INotificationService; - +studyEventsSubscription: StreamSubscription<ModelEvent<Study>>?; - +studyActions: List<ModelAction<dynamic>> + [BadgeType | - +dynamic syncStudyStatus(); - +dynamic onStudySubscriptionUpdate(); - -dynamic _redirectNewToActualStudyID(); - +dynamic publishStudy(); - +void onChangeStudyParticipation(); - +void onAddParticipants(); - +void onSettingsPressed(); - +void dispose() + +index: int; + <static>+values: List<BadgeType>; + <static>+filled: BadgeType; + <static>+outlined: BadgeType; + <static>+outlineFill: BadgeType; + <static>+plain: BadgeType ] - [StudyController]o-[<abstract>INotificationService] - [StudyController]o-[StreamSubscription] - [StudyBaseController]<:-[StudyController] + [BadgeType]o-[BadgeType] + [Enum]<:--[BadgeType] - [<abstract>IStudyAppBarViewModel + [Collapsible | - +isSyncIndicatorVisible: bool; - +isStatusBadgeVisible: bool; - +isPublishVisible: bool + +contentBuilder: Widget Function(BuildContext, bool); + +headerBuilder: Widget Function(BuildContext, bool)?; + +title: String?; + +isCollapsed: bool ] - [<abstract>IStudyStatusBadgeViewModel]<:--[<abstract>IStudyAppBarViewModel] - [<abstract>IStudyNavViewModel]<:--[<abstract>IStudyAppBarViewModel] + [Collapsible]o-[Widget Function(BuildContext, bool)] + [Collapsible]o-[Widget Function(BuildContext, bool)?] - [StudyScaffold + [FormSideSheetTab | - +studyId: String; - +tabs: List<NavbarTab>?; - +tabsSubnav: List<NavbarTab>?; - +selectedTab: NavbarTab?; - +selectedTabSubnav: NavbarTab?; - +body: StudyPageWidget; - +drawer: Widget?; - +disableActions: bool; - +actionsSpacing: double; - +actionsPadding: double; - +layoutType: SingleColumnLayoutType?; - +appbarHeight: double; - +appbarSubnavHeight: double + +formViewBuilder: Widget Function(T) ] - [StudyScaffold]o-[NavbarTab] - [StudyScaffold]o-[<abstract>StudyPageWidget] - [StudyScaffold]o-[<abstract>Widget] - [StudyScaffold]o-[SingleColumnLayoutType] + [FormSideSheetTab]o-[Widget Function(T)] + [NavbarTab]<:-[FormSideSheetTab] - [<abstract>StudyPageWidget + [SidesheetTab | - +studyId: String + +builder: Widget Function(BuildContext) + ] + + [SidesheetTab]o-[Widget Function(BuildContext)] + [NavbarTab]<:-[SidesheetTab] + + [Sidesheet | - +Widget? banner() + <static>+kDefaultWidth: double; + +titleText: String; + +body: Widget?; + +tabs: List<SidesheetTab>?; + +actionButtons: List<Widget>?; + +width: double?; + +withCloseButton: bool; + +ignoreAppBar: bool; + +collapseSingleTab: bool; + +bodyPadding: EdgeInsets?; + +wrapContent: Widget Function(Widget)? ] - [<abstract>ConsumerWidget]<:-[<abstract>StudyPageWidget] - [<abstract>IWithBanner]<:--[<abstract>StudyPageWidget] + [Sidesheet]o-[<abstract>Widget] + [Sidesheet]o-[EdgeInsets] + [Sidesheet]o-[Widget Function(Widget)?] - [StudySettingsDialog + [NullHelperDecoration + ] + + [InputDecoration]<:-[NullHelperDecoration] + + [StudyULogo + | + +onTap: void Function()? | +Widget build() ] - [<abstract>StudyPageWidget]<:-[StudySettingsDialog] + [StudyULogo]o-[void Function()?] - [StudySettingsFormViewModel + [Hyperlink | - +study: AsyncValue<Study>; - +studyRepository: IStudyRepository; - <static>+defaultPublishedToRegistry: bool; - <static>+defaultPublishedToRegistryResults: bool; - +isPublishedToRegistryControl: FormControl<bool>; - +isPublishedToRegistryResultsControl: FormControl<bool>; - +form: FormGroup; - +titles: Map<FormMode, String> - | - +void setControlsFrom(); - +Study buildFormData(); - +dynamic keepControlsSynced(); - +dynamic save(); - +dynamic setLaunchDefaults() + +text: String; + +url: String?; + +onClick: void Function()?; + +linkColor: Color; + +hoverColor: Color?; + +visitedColor: Color?; + +style: TextStyle?; + +hoverStyle: TextStyle?; + +visitedStyle: TextStyle?; + +icon: IconData?; + +iconSize: double? ] - [StudySettingsFormViewModel]o-[<abstract>AsyncValue] - [StudySettingsFormViewModel]o-[<abstract>IStudyRepository] - [StudySettingsFormViewModel]o-[FormControl] - [StudySettingsFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[StudySettingsFormViewModel] + [Hyperlink]o-[void Function()?] + [Hyperlink]o-[Color] + [Hyperlink]o-[TextStyle] + [Hyperlink]o-[IconData] - [StudyParticipationBadge + [ActionPopUpMenuButton | - +participation: Participation; - +type: BadgeType; - +showPrefixIcon: bool + +actions: List<ModelAction<dynamic>>; + +triggerIconColor: Color?; + +triggerIconColorHover: Color?; + +triggerIconSize: double; + +disableSplashEffect: bool; + +hideOnEmpty: bool; + +orientation: Axis; + +elevation: double?; + +splashRadius: double?; + +enabled: bool; + +position: PopupMenuPosition | - +Widget build() + +Widget build(); + -Widget _buildPopupMenu() ] - [StudyParticipationBadge]o-[Participation] - [StudyParticipationBadge]o-[BadgeType] + [ActionPopUpMenuButton]o-[Color] + [ActionPopUpMenuButton]o-[Axis] + [ActionPopUpMenuButton]o-[PopupMenuPosition] - [Config + [ActionMenuType | - <static>+isDebugMode: bool; - <static>+defaultLocale: Set<String>; - <static>+supportedLocales: Map<String, String>; - <static>+newStudyId: String; - <static>+newModelId: String; - <static>+minSplashTime: int; - <static>+formAutosaveDebounce: int + +index: int; + <static>+values: List<ActionMenuType>; + <static>+inline: ActionMenuType; + <static>+popup: ActionMenuType ] - [<abstract>GoRouteParamEnum - | - +String toRouteParam(); - +String toShortString() - ] + [ActionMenuType]o-[ActionMenuType] + [Enum]<:--[ActionMenuType] - [RouterKeys + [MouseEventsRegion | - <static>+studyKey: ValueKey<String>; - <static>+authKey: ValueKey<String> + +onTap: void Function()?; + +onHover: void Function(PointerHoverEvent)?; + +onEnter: void Function(PointerEnterEvent)?; + +onExit: void Function(PointerExitEvent)?; + +autoselectCursor: bool; + +cursor: SystemMouseCursor; + <static>+defaultCursor: SystemMouseCursor; + +autoCursor: SystemMouseCursor ] - [RouterKeys]o-[ValueKey] + [MouseEventsRegion]o-[void Function()?] + [MouseEventsRegion]o-[void Function(PointerHoverEvent)?] + [MouseEventsRegion]o-[void Function(PointerEnterEvent)?] + [MouseEventsRegion]o-[void Function(PointerExitEvent)?] + [MouseEventsRegion]o-[SystemMouseCursor] - [RouteParams + [FormTableRow | - <static>+studiesFilter: String; - <static>+studyId: String; - <static>+measurementId: String; - <static>+interventionId: String; - <static>+testAppRoute: String + +label: String?; + +labelBuilder: Widget Function(BuildContext)?; + +labelStyle: TextStyle?; + +labelHelpText: String?; + +input: Widget; + +control: AbstractControl<dynamic>?; + +layout: FormTableRowLayout? ] - [RouterConf + [FormTableRow]o-[Widget Function(BuildContext)?] + [FormTableRow]o-[TextStyle] + [FormTableRow]o-[<abstract>Widget] + [FormTableRow]o-[<abstract>AbstractControl] + [FormTableRow]o-[FormTableRowLayout] + + [FormTableLayout | - <static>+router: GoRouter; - <static>+routes: List<GoRoute>; - <static>+publicRoutes: List<GoRoute>; - <static>+privateRoutes: List<GoRoute> + +rows: List<FormTableRow>; + +columnWidths: Map<int, TableColumnWidth>; + +rowDivider: Widget?; + +rowLayout: FormTableRowLayout?; + +rowLabelStyle: TextStyle? | - <static>+GoRoute route() + +Widget build() ] - [RouterConf]o-[GoRouter] + [FormTableLayout]o-[<abstract>Widget] + [FormTableLayout]o-[FormTableRowLayout] + [FormTableLayout]o-[TextStyle] - [<abstract>StudyFormRouteArgs + [FormSectionHeader | - +studyId: String + +title: String; + +titleTextStyle: TextStyle?; + +helpText: String?; + +divider: bool; + +helpTextDisabled: bool + | + +Widget build() ] - [<abstract>QuestionFormRouteArgs + [FormSectionHeader]o-[TextStyle] + + [FormLabel | - +questionId: String + +labelText: String?; + +helpText: String?; + +labelTextStyle: TextStyle?; + +layout: FormTableRowLayout? + | + +Widget build() ] - [<abstract>StudyFormRouteArgs]<:-[<abstract>QuestionFormRouteArgs] + [FormLabel]o-[TextStyle] + [FormLabel]o-[FormTableRowLayout] - [ScreenerQuestionFormRouteArgs + [FormTableRowLayout + | + +index: int; + <static>+values: List<FormTableRowLayout>; + <static>+vertical: FormTableRowLayout; + <static>+horizontal: FormTableRowLayout ] - [<abstract>QuestionFormRouteArgs]<:-[ScreenerQuestionFormRouteArgs] + [FormTableRowLayout]o-[FormTableRowLayout] + [Enum]<:--[FormTableRowLayout] - [ConsentItemFormRouteArgs + [AsyncValueWidget | - +consentId: String + +value: AsyncValue<T>; + +data: Widget Function(T); + +error: Widget Function(Object, StackTrace?)?; + +loading: Widget Function()?; + +empty: Widget Function()? + | + +Widget build(); + -Widget _buildDataOrEmptyWidget(); + -Widget _defaultError(); + -Widget _defaultLoad() ] - [<abstract>StudyFormRouteArgs]<:-[ConsentItemFormRouteArgs] + [AsyncValueWidget]o-[<abstract>AsyncValue] + [AsyncValueWidget]o-[Widget Function(T)] + [AsyncValueWidget]o-[Widget Function(Object, StackTrace?)?] + [AsyncValueWidget]o-[Widget Function()?] - [MeasurementFormRouteArgs + [NavbarTab | - +measurementId: String + +title: String; + +intent: RoutingIntent?; + +index: int; + +enabled: bool ] - [<abstract>StudyFormRouteArgs]<:-[MeasurementFormRouteArgs] + [NavbarTab]o-[RoutingIntent] - [SurveyQuestionFormRouteArgs + [TabbedNavbar | - +questionId: String + +tabs: List<T>; + +selectedTab: T?; + +indicator: BoxDecoration?; + +height: double?; + +disabledBackgroundColor: Color?; + +disabledTooltipText: String?; + +onSelect: void Function(int, T)?; + +labelPadding: EdgeInsets?; + +labelSpacing: double?; + +indicatorSize: TabBarIndicatorSize?; + +isScrollable: bool; + +backgroundColor: Color?; + +labelColorHover: Color?; + +unselectedLabelColorHover: Color? ] - [MeasurementFormRouteArgs]<:-[SurveyQuestionFormRouteArgs] - [<abstract>QuestionFormRouteArgs]<:--[SurveyQuestionFormRouteArgs] + [TabbedNavbar]o-[BoxDecoration] + [TabbedNavbar]o-[Color] + [TabbedNavbar]o-[void Function(int, T)?] + [TabbedNavbar]o-[EdgeInsets] + [TabbedNavbar]o-[TabBarIndicatorSize] - [InterventionFormRouteArgs + [SingleColumnLayout | - +interventionId: String + <static>+defaultConstraints: BoxConstraints; + <static>+defaultConstraintsNarrow: BoxConstraints; + +body: Widget; + +header: Widget?; + +stickyHeader: bool; + +constraints: BoxConstraints?; + +scroll: bool; + +padding: EdgeInsets? + | + <static>+dynamic fromType() ] - [<abstract>StudyFormRouteArgs]<:-[InterventionFormRouteArgs] + [SingleColumnLayout]o-[BoxConstraints] + [SingleColumnLayout]o-[<abstract>Widget] + [SingleColumnLayout]o-[EdgeInsets] - [InterventionTaskFormRouteArgs + [SingleColumnLayoutType | - +taskId: String + +index: int; + <static>+values: List<SingleColumnLayoutType>; + <static>+boundedWide: SingleColumnLayoutType; + <static>+boundedNarrow: SingleColumnLayoutType; + <static>+stretched: SingleColumnLayoutType; + <static>+split: SingleColumnLayoutType ] - [InterventionFormRouteArgs]<:-[InterventionTaskFormRouteArgs] + [SingleColumnLayoutType]o-[SingleColumnLayoutType] + [Enum]<:--[SingleColumnLayoutType] - [ReportItemFormRouteArgs + [<abstract>IWithBanner | - +sectionId: String + +Widget? banner() ] - [<abstract>StudyFormRouteArgs]<:-[ReportItemFormRouteArgs] - - [RoutingIntents + [BannerBox | - <static>+root: RoutingIntent; - <static>+studies: RoutingIntent; - <static>+studiesShared: RoutingIntent; - <static>+publicRegistry: RoutingIntent; - <static>+study: RoutingIntent Function(String); - <static>+studyEdit: RoutingIntent Function(String); - <static>+studyEditInfo: RoutingIntent Function(String); - <static>+studyEditEnrollment: RoutingIntent Function(String); - <static>+studyEditInterventions: RoutingIntent Function(String); - <static>+studyEditIntervention: RoutingIntent Function(String, String); - <static>+studyEditMeasurements: RoutingIntent Function(String); - <static>+studyEditReports: RoutingIntent Function(String); - <static>+studyEditMeasurement: RoutingIntent Function(String, String); - <static>+studyTest: RoutingIntent Function(String, {String? appRoute}); - <static>+studyRecruit: RoutingIntent Function(String); - <static>+studyMonitor: RoutingIntent Function(String); - <static>+studyAnalyze: RoutingIntent Function(String); - <static>+studySettings: RoutingIntent Function(String); - <static>+accountSettings: RoutingIntent; - <static>+studyNew: RoutingIntent; - <static>+login: RoutingIntent; - <static>+signup: RoutingIntent; - <static>+passwordForgot: RoutingIntent; - <static>+passwordForgot2: RoutingIntent Function(String); - <static>+passwordRecovery: RoutingIntent; - <static>+error: RoutingIntent Function(Exception) + +prefixIcon: Widget?; + +body: Widget; + +style: BannerStyle; + +padding: EdgeInsets?; + +noPrefix: bool; + +dismissable: bool; + +isDismissed: bool?; + +onDismissed: dynamic Function()?; + +dismissIconSize: double ] - [RoutingIntents]o-[RoutingIntent] - [RoutingIntents]o-[RoutingIntent Function(String)] - [RoutingIntents]o-[RoutingIntent Function(String, String)] - [RoutingIntents]o-[RoutingIntent Function(String, {String? appRoute})] - [RoutingIntents]o-[RoutingIntent Function(Exception)] + [BannerBox]o-[<abstract>Widget] + [BannerBox]o-[BannerStyle] + [BannerBox]o-[EdgeInsets] + [BannerBox]o-[dynamic Function()?] - [RoutingIntent - | - +route: GoRoute; - +params: Map<String, String>; - +queryParams: Map<String, String>; - +dispatch: RoutingIntentDispatch?; - +extra: Object?; - +routeName: String; - +arguments: Map<String, String>; - +props: List<Object?> + [BannerStyle | - -dynamic _validateRoute(); - +bool matches() + +index: int; + <static>+values: List<BannerStyle>; + <static>+warning: BannerStyle; + <static>+info: BannerStyle; + <static>+error: BannerStyle ] - [RoutingIntent]o-[GoRoute] - [RoutingIntent]o-[RoutingIntentDispatch] - [<abstract>Equatable]<:-[RoutingIntent] + [BannerStyle]o-[BannerStyle] + [Enum]<:--[BannerStyle] - [RoutingIntentDispatch + [<abstract>FormConsumerWidget | - +index: int; - <static>+values: List<RoutingIntentDispatch>; - <static>+go: RoutingIntentDispatch; - <static>+push: RoutingIntentDispatch + +Widget build() ] - [RoutingIntentDispatch]o-[RoutingIntentDispatch] - [Enum]<:--[RoutingIntentDispatch] - - [PlatformLocaleWeb + [<abstract>FormConsumerRefWidget | - +Locale getPlatformLocale() + +Widget build() ] - [<abstract>PlatformLocale]<:--[PlatformLocaleWeb] - - [PlatformLocaleMobile + [HtmlStylingBanner | - +Locale getPlatformLocale() + +isDismissed: bool; + +onDismissed: dynamic Function()? + | + +Widget build() ] - [<abstract>PlatformLocale]<:--[PlatformLocaleMobile] + [HtmlStylingBanner]o-[dynamic Function()?] - [<abstract>PlatformLocale + [UnderConstruction | - +Locale getPlatformLocale() + +Widget build() ] - [AppTranslation + [IconPack | - <static>+dynamic init() + <static>+defaultPack: List<IconOption>; + <static>+material: List<IconOption> + | + <static>+IconOption? resolveIconByName() ] - [LanguagePicker + [IconOption | - +languagePickerType: LanguagePickerType; - +iconColor: Color?; - +offset: Offset? + +name: String; + +icon: IconData?; + +isEmpty: bool; + +props: List<Object?> + | + +String toJson(); + <static>+IconOption fromJson() ] - [LanguagePicker]o-[LanguagePickerType] - [LanguagePicker]o-[Color] - [LanguagePicker]o-[Offset] + [IconOption]o-[IconData] + [<abstract>Equatable]<:-[IconOption] - [LanguagePickerType - | - +index: int; - <static>+values: List<LanguagePickerType>; - <static>+field: LanguagePickerType; - <static>+icon: LanguagePickerType + [ReactiveIconPicker ] - [LanguagePickerType]o-[LanguagePickerType] - [Enum]<:--[LanguagePickerType] + [ReactiveFocusableFormField]<:-[ReactiveIconPicker] - [Tuple + [IconPicker | - +first: T1; - +second: T2; - +props: List<Object?> + +iconOptions: List<IconOption>; + +selectedOption: IconOption?; + +onSelect: void Function(IconOption)?; + +galleryIconSize: double?; + +selectedIconSize: double?; + +focusNode: FocusNode?; + +isDisabled: bool | - +Map<String, dynamic> toJson(); - <static>+Tuple<dynamic, dynamic> fromJson(); - +Tuple<T1, T2> copy(); - +Tuple<T1, T2> copyWith() + +Widget build() ] - [<abstract>Equatable]<:-[Tuple] + [IconPicker]o-[IconOption] + [IconPicker]o-[void Function(IconOption)?] + [IconPicker]o-[FocusNode] - [<abstract>FileFormatEncoder + [IconPickerField | - +dynamic encodeAsync(); - +String encode(); - +dynamic call() - ] - - [CSVStringEncoder + +iconOptions: List<IconOption>; + +selectedOption: IconOption?; + +selectedIconSize: double?; + +galleryIconSize: double?; + +onSelect: void Function(IconOption)?; + +focusNode: FocusNode?; + +isDisabled: bool | - +String encode() + +Widget build() ] - [<abstract>FileFormatEncoder]<:-[CSVStringEncoder] + [IconPickerField]o-[IconOption] + [IconPickerField]o-[void Function(IconOption)?] + [IconPickerField]o-[FocusNode] - [JsonStringEncoder + [IconPickerGallery | - +String encode() + +iconOptions: List<IconOption>; + +onSelect: void Function(IconOption)?; + +iconSize: double + | + +Widget build() ] - [<abstract>FileFormatEncoder]<:-[JsonStringEncoder] + [IconPickerGallery]o-[void Function(IconOption)?] - [CountWhereValidator + [StandardDialog | - +predicate: bool Function(T?); - +minCount: int?; - +maxCount: int?; - <static>+kValidationMessageMinCount: String; - <static>+kValidationMessageMaxCount: String + +title: Widget?; + +titleText: String?; + +body: Widget; + +actionButtons: List<Widget>; + +backgroundColor: Color?; + +borderRadius: double?; + +width: double?; + +height: double?; + +minWidth: double; + +minHeight: double; + +maxWidth: double?; + +maxHeight: double?; + +padding: EdgeInsets | - +Map<String, dynamic>? validate() + +Widget build() ] - [CountWhereValidator]o-[bool Function(T?)] - [<abstract>Validator]<:-[CountWhereValidator] + [StandardDialog]o-[<abstract>Widget] + [StandardDialog]o-[Color] + [StandardDialog]o-[EdgeInsets] - [MustMatchValidator - | - +control: AbstractControl<dynamic>?; - +matchingControl: AbstractControl<dynamic>? + [TwoColumnLayout | - +Map<String, dynamic>? validate() + <static>+defaultDivider: VerticalDivider; + <static>+defaultContentPadding: EdgeInsets; + <static>+slimContentPadding: EdgeInsets; + +leftWidget: Widget; + +rightWidget: Widget; + +dividerWidget: Widget?; + +headerWidget: Widget?; + +flexLeft: int?; + +flexRight: int?; + +constraintsLeft: BoxConstraints?; + +constraintsRight: BoxConstraints?; + +scrollLeft: bool; + +scrollRight: bool; + +paddingLeft: EdgeInsets?; + +paddingRight: EdgeInsets?; + +backgroundColorLeft: Color?; + +backgroundColorRight: Color?; + +stretchHeight: bool ] - [MustMatchValidator]o-[<abstract>AbstractControl] - [<abstract>Validator]<:-[MustMatchValidator] + [TwoColumnLayout]o-[VerticalDivider] + [TwoColumnLayout]o-[EdgeInsets] + [TwoColumnLayout]o-[<abstract>Widget] + [TwoColumnLayout]o-[BoxConstraints] + [TwoColumnLayout]o-[Color] - [FieldValidators + [FormScaffold | - <static>+String? emailValidator() + +formViewModel: T; + +actions: List<Widget>?; + +body: Widget; + +drawer: Widget?; + +actionsSpacing: double; + +actionsPadding: double ] - [Patterns - | - <static>+timeFormatString: String; - <static>+emailFormatString: String; - <static>+url: String - ] + [FormScaffold]o-[<abstract>Widget] - [StudyUException - | - +message: String + [ConstrainedWidthFlexible | - +String toString() + +minWidth: double; + +maxWidth: double; + +flex: int; + +flexSum: int; + +child: Widget; + +outerConstraints: BoxConstraints + | + +Widget build(); + -double _getWidth() ] - [Exception]<:--[StudyUException] + [ConstrainedWidthFlexible]o-[<abstract>Widget] + [ConstrainedWidthFlexible]o-[BoxConstraints] - [<abstract>IProviderArgsResolver + [<abstract>ISyncIndicatorViewModel | - +R provide() + +isDirty: bool; + +lastSynced: DateTime? ] - [ModelAction + [SyncIndicator | - +type: T; - +label: String; - +icon: IconData?; - +onExecute: Function; - +isAvailable: bool; - +isDestructive: bool + +state: AsyncValue<T>; + +lastSynced: DateTime?; + +isDirty: bool; + +animationDuration: int; + +iconSize: double ] - [ModelAction]o-[IconData] + [SyncIndicator]o-[<abstract>AsyncValue] - [<abstract>IModelActionProvider + [StudyUException | - +List<ModelAction<dynamic>> availableActions() - ] - - [<abstract>IListActionProvider + +message: String | - +void onSelectItem(); - +void onNewItem() + +String toString() ] - [<abstract>IModelActionProvider]<:-[<abstract>IListActionProvider] + [Exception]<:--[StudyUException] - [ModelActionType + [CountWhereValidator | - +index: int; - <static>+values: List<ModelActionType>; - <static>+edit: ModelActionType; - <static>+delete: ModelActionType; - <static>+remove: ModelActionType; - <static>+duplicate: ModelActionType; - <static>+clipboard: ModelActionType; - <static>+primary: ModelActionType + +predicate: bool Function(T?); + +minCount: int?; + +maxCount: int?; + <static>+kValidationMessageMinCount: String; + <static>+kValidationMessageMaxCount: String + | + +Map<String, dynamic>? validate() ] - [ModelActionType]o-[ModelActionType] - [Enum]<:--[ModelActionType] + [CountWhereValidator]o-[bool Function(T?)] + [<abstract>Validator]<:-[CountWhereValidator] - [CombinedStreamNotifier + [StudyUMustMatchValidator | - -_subscriptions: List<StreamSubscription<dynamic>> + +control: AbstractControl<dynamic>?; + +matchingControl: AbstractControl<dynamic>? | - +void dispose() + +Map<String, dynamic>? validate() ] - [ChangeNotifier]<:-[CombinedStreamNotifier] + [StudyUMustMatchValidator]o-[<abstract>AbstractControl] + [<abstract>Validator]<:-[StudyUMustMatchValidator] - [OptimisticUpdate - | - +applyOptimistic: void Function(); - +apply: dynamic Function(); - +rollback: void Function(); - +onUpdate: void Function()?; - +onError: void Function(Object, StackTrace?)?; - +rethrowErrors: bool; - +runOptimistically: bool; - +completeFutureOptimistically: bool + [FieldValidators | - +dynamic execute(); - -void _runUpdateHandlerIfAny() + <static>+String? emailValidator() ] - [OptimisticUpdate]o-[void Function()] - [OptimisticUpdate]o-[dynamic Function()] - [OptimisticUpdate]o-[void Function()?] - [OptimisticUpdate]o-[void Function(Object, StackTrace?)?] + [Patterns + | + <static>+timeFormatString: String; + <static>+emailFormatString: String; + <static>+url: String + ] [NumericalRangeFormatter | @@ -3348,24 +3879,6 @@ [<abstract>TextInputFormatter]<:-[StudySequenceFormatter] - [Time - | - <static>+dynamic fromTimeOfDay(); - +Map<String, dynamic> toJson(); - <static>+Time fromJson() - ] - - [TimeOfDay]<:-[Time] - - [TimeValueAccessor - | - +String modelToViewValue(); - +Time? viewToModelValue(); - -String _addLeadingZeroIfNeeded() - ] - - [<abstract>ControlValueAccessor]<:-[TimeValueAccessor] - [SuppressedBehaviorSubject | +subject: BehaviorSubject<T>; @@ -3379,6 +3892,20 @@ [SuppressedBehaviorSubject]o-[BehaviorSubject] [SuppressedBehaviorSubject]o-[StreamController] + [Tuple + | + +first: T1; + +second: T2; + +props: List<Object?> + | + +Map<String, dynamic> toJson(); + <static>+Tuple<dynamic, dynamic> fromJson(); + +Tuple<T1, T2> copy(); + +Tuple<T1, T2> copyWith() + ] + + [<abstract>Equatable]<:-[Tuple] + [<abstract>ExecutionLimiter | +milliseconds: int; @@ -3408,15 +3935,6 @@ [<abstract>ExecutionLimiter]<:-[Throttler] - [<abstract>JsonFileLoader - | - +jsonAssetsPath: String - | - +dynamic loadJson(); - +dynamic parseJsonMapFromAssets(); - +dynamic parseJsonListFromAssets() - ] - [SerializableColor | +Map<String, dynamic> toJson(); @@ -3425,6907 +3943,5605 @@ [Color]<:-[SerializableColor] - [StandardTableColumn + [CombinedStreamNotifier | - +label: String; - +tooltip: String?; - +columnWidth: TableColumnWidth; - +sortable: bool; - +sortAscending: bool?; - +sortableIcon: Widget? + -_subscriptions: List<StreamSubscription<dynamic>> + | + +void dispose() ] - [StandardTableColumn]o-[<abstract>TableColumnWidth] - [StandardTableColumn]o-[<abstract>Widget] + [ChangeNotifier]<:-[CombinedStreamNotifier] - [StandardTable + [Time | - +items: List<T>; - +inputColumns: List<StandardTableColumn>; - +onSelectItem: void Function(T); - +trailingActionsAt: List<ModelAction<dynamic>> Function(T, int)?; - +trailingActionsMenuType: ActionMenuType?; - +sortColumnPredicates: List<int Function(T, T)?>?; - +pinnedPredicates: int Function(T, T)?; - +headerRowBuilder: TableRow Function(BuildContext, List<StandardTableColumn>)?; - +dataRowBuilder: TableRow Function(BuildContext, List<StandardTableColumn>)?; - +inputTrailingActionsColumn: StandardTableColumn; - +tableWrapper: Widget Function(Widget)?; - +cellSpacing: double; - +rowSpacing: double; - +minRowHeight: double?; - +showTableHeader: bool; - +hideLeadingTrailingWhenEmpty: bool; - +leadingWidget: Widget?; - +trailingWidget: Widget?; - +leadingWidgetSpacing: double?; - +trailingWidgetSpacing: double?; - +emptyWidget: Widget?; - +rowStyle: StandardTableStyle; - +disableRowInteractions: bool + <static>+dynamic fromTimeOfDay(); + +Map<String, dynamic> toJson(); + <static>+Time fromJson() ] - [StandardTable]o-[void Function(T)] - [StandardTable]o-[List<ModelAction<dynamic>> Function(T, int)?] - [StandardTable]o-[ActionMenuType] - [StandardTable]o-[int Function(T, T)?] - [StandardTable]o-[TableRow Function(BuildContext, List<StandardTableColumn>)?] - [StandardTable]o-[StandardTableColumn] - [StandardTable]o-[Widget Function(Widget)?] - [StandardTable]o-[<abstract>Widget] - [StandardTable]o-[StandardTableStyle] + [TimeOfDay]<:-[Time] - [StandardTableStyle + [TimeValueAccessor | - +index: int; - <static>+values: List<StandardTableStyle>; - <static>+plain: StandardTableStyle; - <static>+material: StandardTableStyle + +String modelToViewValue(); + +Time? viewToModelValue(); + -String _addLeadingZeroIfNeeded() ] - [StandardTableStyle]o-[StandardTableStyle] - [Enum]<:--[StandardTableStyle] + [<abstract>ControlValueAccessor]<:-[TimeValueAccessor] - [AsyncValueWidget - | - +value: AsyncValue<T>; - +data: Widget Function(T); - +error: Widget Function(Object, StackTrace?)?; - +loading: Widget Function()?; - +empty: Widget Function()? + [<abstract>FileFormatEncoder | - +Widget build(); - -Widget _buildDataOrEmptyWidget(); - -Widget _defaultError(); - -Widget _defaultLoad() + +dynamic encodeAsync(); + +String encode(); + +dynamic call() ] - [AsyncValueWidget]o-[<abstract>AsyncValue] - [AsyncValueWidget]o-[Widget Function(T)] - [AsyncValueWidget]o-[Widget Function(Object, StackTrace?)?] - [AsyncValueWidget]o-[Widget Function()?] - - [TwoColumnLayout + [CSVStringEncoder | - <static>+defaultDivider: VerticalDivider; - <static>+defaultContentPadding: EdgeInsets; - <static>+slimContentPadding: EdgeInsets; - +leftWidget: Widget; - +rightWidget: Widget; - +dividerWidget: Widget?; - +headerWidget: Widget?; - +flexLeft: int?; - +flexRight: int?; - +constraintsLeft: BoxConstraints?; - +constraintsRight: BoxConstraints?; - +scrollLeft: bool; - +scrollRight: bool; - +paddingLeft: EdgeInsets?; - +paddingRight: EdgeInsets?; - +backgroundColorLeft: Color?; - +backgroundColorRight: Color?; - +stretchHeight: bool + +String encode() ] - [TwoColumnLayout]o-[VerticalDivider] - [TwoColumnLayout]o-[EdgeInsets] - [TwoColumnLayout]o-[<abstract>Widget] - [TwoColumnLayout]o-[BoxConstraints] - [TwoColumnLayout]o-[Color] + [<abstract>FileFormatEncoder]<:-[CSVStringEncoder] - [UnderConstruction + [JsonStringEncoder | - +Widget build() + +String encode() ] - [FormTableRow + [<abstract>FileFormatEncoder]<:-[JsonStringEncoder] + + [OptimisticUpdate | - +label: String?; - +labelBuilder: Widget Function(BuildContext)?; - +labelStyle: TextStyle?; - +labelHelpText: String?; - +input: Widget; - +control: AbstractControl<dynamic>?; - +layout: FormTableRowLayout? + +applyOptimistic: void Function(); + +apply: dynamic Function(); + +rollback: void Function(); + +onUpdate: void Function()?; + +onError: void Function(Object, StackTrace?)?; + +rethrowErrors: bool; + +runOptimistically: bool; + +completeFutureOptimistically: bool + | + +dynamic execute(); + -void _runUpdateHandlerIfAny() ] - [FormTableRow]o-[Widget Function(BuildContext)?] - [FormTableRow]o-[TextStyle] - [FormTableRow]o-[<abstract>Widget] - [FormTableRow]o-[<abstract>AbstractControl] - [FormTableRow]o-[FormTableRowLayout] + [OptimisticUpdate]o-[void Function()] + [OptimisticUpdate]o-[dynamic Function()] + [OptimisticUpdate]o-[void Function()?] + [OptimisticUpdate]o-[void Function(Object, StackTrace?)?] - [FormTableLayout - | - +rows: List<FormTableRow>; - +columnWidths: Map<int, TableColumnWidth>; - +rowDivider: Widget?; - +rowLayout: FormTableRowLayout?; - +rowLabelStyle: TextStyle? + [<abstract>IProviderArgsResolver | - +Widget build() + +R provide() ] - [FormTableLayout]o-[<abstract>Widget] - [FormTableLayout]o-[FormTableRowLayout] - [FormTableLayout]o-[TextStyle] - - [FormSectionHeader - | - +title: String; - +titleTextStyle: TextStyle?; - +helpText: String?; - +divider: bool; - +helpTextDisabled: bool + [ModelAction | - +Widget build() + +type: T; + +label: String; + +icon: IconData?; + +onExecute: Function; + +isAvailable: bool; + +isDestructive: bool ] - [FormSectionHeader]o-[TextStyle] + [ModelAction]o-[IconData] - [FormLabel + [<abstract>IModelActionProvider | - +labelText: String?; - +helpText: String?; - +labelTextStyle: TextStyle?; - +layout: FormTableRowLayout? + +List<ModelAction<dynamic>> availableActions() + ] + + [<abstract>IListActionProvider | - +Widget build() + +void onSelectItem(); + +void onNewItem() ] - [FormLabel]o-[TextStyle] - [FormLabel]o-[FormTableRowLayout] + [<abstract>IModelActionProvider]<:-[<abstract>IListActionProvider] - [FormTableRowLayout + [ModelActionType | +index: int; - <static>+values: List<FormTableRowLayout>; - <static>+vertical: FormTableRowLayout; - <static>+horizontal: FormTableRowLayout + <static>+values: List<ModelActionType>; + <static>+edit: ModelActionType; + <static>+delete: ModelActionType; + <static>+remove: ModelActionType; + <static>+duplicate: ModelActionType; + <static>+clipboard: ModelActionType; + <static>+primary: ModelActionType ] - [FormTableRowLayout]o-[FormTableRowLayout] - [Enum]<:--[FormTableRowLayout] + [ModelActionType]o-[ModelActionType] + [Enum]<:--[ModelActionType] - [<abstract>ISyncIndicatorViewModel + [<abstract>JsonFileLoader | - +isDirty: bool; - +lastSynced: DateTime? + +jsonAssetsPath: String + | + +dynamic loadJson(); + +dynamic parseJsonMapFromAssets(); + +dynamic parseJsonListFromAssets() ] - [SyncIndicator + [<abstract>IClipboardService | - +state: AsyncValue<T>; - +lastSynced: DateTime?; - +isDirty: bool; - +animationDuration: int; - +iconSize: double + +dynamic copy() ] - [SyncIndicator]o-[<abstract>AsyncValue] - - [ConstrainedWidthFlexible - | - +minWidth: double; - +maxWidth: double; - +flex: int; - +flexSum: int; - +child: Widget; - +outerConstraints: BoxConstraints + [ClipboardService | - +Widget build(); - -double _getWidth() + +dynamic copy() ] - [ConstrainedWidthFlexible]o-[<abstract>Widget] - [ConstrainedWidthFlexible]o-[BoxConstraints] + [<abstract>IClipboardService]<:--[ClipboardService] - [HelpIcon - | - +tooltipText: String? + [Notifications | - +Widget build() - ] - - [NullHelperDecoration + <static>+passwordReset: SnackbarIntent; + <static>+passwordResetSuccess: SnackbarIntent; + <static>+studyDeleted: SnackbarIntent; + <static>+inviteCodeDeleted: SnackbarIntent; + <static>+inviteCodeClipped: SnackbarIntent; + <static>+studyDeleteConfirmation: AlertIntent ] - [InputDecoration]<:-[NullHelperDecoration] + [Notifications]o-[SnackbarIntent] + [Notifications]o-[AlertIntent] - [ReactiveCustomColorPicker + [NotificationDefaultActions + | + <static>+cancel: NotificationAction ] - [ReactiveFormField]<:-[ReactiveCustomColorPicker] + [NotificationDefaultActions]o-[NotificationAction] - [PrimaryButton + [<abstract>NotificationIntent | - +text: String; + +message: String?; + +customContent: Widget?; +icon: IconData?; - +isLoading: bool; - +showLoadingEarliestAfterMs: int; - +onPressed: void Function()?; - +tooltip: String; - +tooltipDisabled: String; - +enabled: bool; - +onPressedFuture: dynamic Function()?; - +innerPadding: EdgeInsets; - +minimumSize: Size?; - +isDisabled: bool + +actions: List<NotificationAction>?; + +type: NotificationType + | + +void register() ] - [PrimaryButton]o-[IconData] - [PrimaryButton]o-[void Function()?] - [PrimaryButton]o-[dynamic Function()?] - [PrimaryButton]o-[EdgeInsets] - [PrimaryButton]o-[Size] + [<abstract>NotificationIntent]o-[<abstract>Widget] + [<abstract>NotificationIntent]o-[IconData] + [<abstract>NotificationIntent]o-[NotificationType] - [StandardDialog - | - +title: Widget?; - +titleText: String?; - +body: Widget; - +actionButtons: List<Widget>; - +backgroundColor: Color?; - +borderRadius: double?; - +width: double?; - +height: double?; - +minWidth: double; - +minHeight: double; - +maxWidth: double?; - +maxHeight: double?; - +padding: EdgeInsets + [NotificationAction | - +Widget build() + +label: String; + +onSelect: dynamic Function(); + +isDestructive: bool ] - [StandardDialog]o-[<abstract>Widget] - [StandardDialog]o-[Color] - [StandardDialog]o-[EdgeInsets] + [NotificationAction]o-[dynamic Function()] - [FormControlLabel - | - +formControl: AbstractControl<dynamic>; - +text: String; - +isClickable: bool; - +textStyle: TextStyle?; - +onClick: void Function(AbstractControl<dynamic>)? + [SnackbarIntent | - +Widget build() + +duration: int? ] - [FormControlLabel]o-[<abstract>AbstractControl] - [FormControlLabel]o-[TextStyle] - [FormControlLabel]o-[void Function(AbstractControl<dynamic>)?] + [<abstract>NotificationIntent]<:-[SnackbarIntent] - [Search + [AlertIntent | - +onQueryChanged: dynamic Function(String); - +searchController: SearchController?; - +hintText: String?; - +initialText: String? + +title: String; + +dismissOnAction: bool; + +isDestructive: dynamic ] - [Search]o-[dynamic Function(String)] - [Search]o-[SearchController] + [<abstract>NotificationIntent]<:-[AlertIntent] - [SearchController + [NotificationType | - +setText: void Function(String) + +index: int; + <static>+values: List<NotificationType>; + <static>+snackbar: NotificationType; + <static>+alert: NotificationType; + <static>+custom: NotificationType ] - [SearchController]o-[void Function(String)] + [NotificationType]o-[NotificationType] + [Enum]<:--[NotificationType] - [Badge - | - +icon: IconData?; - +color: Color?; - +borderRadius: double; - +label: String; - +type: BadgeType; - +padding: EdgeInsets; - +iconSize: double?; - +labelStyle: TextStyle? + [<abstract>INotificationService | - +Widget build(); - -Color? _getBackgroundColor(); - -Color _getBorderColor(); - -Color? _getLabelColor() + +void showMessage(); + +void show(); + +Stream<NotificationIntent> watchNotifications(); + +void dispose() ] - [Badge]o-[IconData] - [Badge]o-[Color] - [Badge]o-[BadgeType] - [Badge]o-[EdgeInsets] - [Badge]o-[TextStyle] - - [BadgeType - | - +index: int; - <static>+values: List<BadgeType>; - <static>+filled: BadgeType; - <static>+outlined: BadgeType; - <static>+outlineFill: BadgeType; - <static>+plain: BadgeType - ] - - [BadgeType]o-[BadgeType] - [Enum]<:--[BadgeType] - - [<abstract>IWithBanner - | - +Widget? banner() - ] - - [BannerBox - | - +prefixIcon: Widget?; - +body: Widget; - +style: BannerStyle; - +padding: EdgeInsets?; - +noPrefix: bool; - +dismissable: bool; - +isDismissed: bool?; - +onDismissed: dynamic Function()?; - +dismissIconSize: double - ] - - [BannerBox]o-[<abstract>Widget] - [BannerBox]o-[BannerStyle] - [BannerBox]o-[EdgeInsets] - [BannerBox]o-[dynamic Function()?] - - [BannerStyle - | - +index: int; - <static>+values: List<BannerStyle>; - <static>+warning: BannerStyle; - <static>+info: BannerStyle; - <static>+error: BannerStyle - ] - - [BannerStyle]o-[BannerStyle] - [Enum]<:--[BannerStyle] - - [SplashPage - | - +Widget build() - ] - - [ErrorPage - | - +error: Exception? - | - +Widget build() - ] - - [<abstract>ConsumerWidget]<:-[ErrorPage] - - [EmptyBody - | - +icon: IconData?; - +leading: Widget?; - +leadingSpacing: double?; - +title: String?; - +description: String?; - +button: Widget? - | - +Widget build() - ] - - [EmptyBody]o-[IconData] - [EmptyBody]o-[<abstract>Widget] - - [NavbarTab - | - +title: String; - +intent: RoutingIntent?; - +index: int; - +enabled: bool - ] - - [NavbarTab]o-[RoutingIntent] - - [TabbedNavbar - | - +tabs: List<T>; - +selectedTab: T?; - +indicator: BoxDecoration?; - +height: double?; - +disabledBackgroundColor: Color?; - +disabledTooltipText: String?; - +onSelect: void Function(int, T)?; - +labelPadding: EdgeInsets?; - +labelSpacing: double?; - +indicatorSize: TabBarIndicatorSize?; - +isScrollable: bool; - +backgroundColor: Color?; - +labelColorHover: Color?; - +unselectedLabelColorHover: Color? - ] - - [TabbedNavbar]o-[BoxDecoration] - [TabbedNavbar]o-[Color] - [TabbedNavbar]o-[void Function(int, T)?] - [TabbedNavbar]o-[EdgeInsets] - [TabbedNavbar]o-[TabBarIndicatorSize] - - [MouseEventsRegion - | - +onTap: void Function()?; - +onHover: void Function(PointerHoverEvent)?; - +onEnter: void Function(PointerEnterEvent)?; - +onExit: void Function(PointerExitEvent)?; - +autoselectCursor: bool; - +cursor: SystemMouseCursor; - <static>+defaultCursor: SystemMouseCursor; - +autoCursor: SystemMouseCursor - ] - - [MouseEventsRegion]o-[void Function()?] - [MouseEventsRegion]o-[void Function(PointerHoverEvent)?] - [MouseEventsRegion]o-[void Function(PointerEnterEvent)?] - [MouseEventsRegion]o-[void Function(PointerExitEvent)?] - [MouseEventsRegion]o-[SystemMouseCursor] - - [Collapsible - | - +contentBuilder: Widget Function(BuildContext, bool); - +headerBuilder: Widget Function(BuildContext, bool)?; - +title: String?; - +isCollapsed: bool - ] - - [Collapsible]o-[Widget Function(BuildContext, bool)] - [Collapsible]o-[Widget Function(BuildContext, bool)?] - - [SidesheetTab - | - +builder: Widget Function(BuildContext) - ] - - [SidesheetTab]o-[Widget Function(BuildContext)] - [NavbarTab]<:-[SidesheetTab] - - [Sidesheet - | - <static>+kDefaultWidth: double; - +titleText: String; - +body: Widget?; - +tabs: List<SidesheetTab>?; - +actionButtons: List<Widget>?; - +width: double?; - +withCloseButton: bool; - +ignoreAppBar: bool; - +collapseSingleTab: bool; - +bodyPadding: EdgeInsets?; - +wrapContent: Widget Function(Widget)? - ] - - [Sidesheet]o-[<abstract>Widget] - [Sidesheet]o-[EdgeInsets] - [Sidesheet]o-[Widget Function(Widget)?] - - [FormSideSheetTab - | - +formViewBuilder: Widget Function(T) - ] - - [FormSideSheetTab]o-[Widget Function(T)] - [NavbarTab]<:-[FormSideSheetTab] - - [ActionMenuType - | - +index: int; - <static>+values: List<ActionMenuType>; - <static>+inline: ActionMenuType; - <static>+popup: ActionMenuType - ] - - [ActionMenuType]o-[ActionMenuType] - [Enum]<:--[ActionMenuType] - - [SingleColumnLayout - | - <static>+defaultConstraints: BoxConstraints; - <static>+defaultConstraintsNarrow: BoxConstraints; - +body: Widget; - +header: Widget?; - +stickyHeader: bool; - +constraints: BoxConstraints?; - +scroll: bool; - +padding: EdgeInsets? - | - <static>+dynamic fromType() - ] - - [SingleColumnLayout]o-[BoxConstraints] - [SingleColumnLayout]o-[<abstract>Widget] - [SingleColumnLayout]o-[EdgeInsets] - - [SingleColumnLayoutType - | - +index: int; - <static>+values: List<SingleColumnLayoutType>; - <static>+boundedWide: SingleColumnLayoutType; - <static>+boundedNarrow: SingleColumnLayoutType; - <static>+stretched: SingleColumnLayoutType; - <static>+split: SingleColumnLayoutType - ] - - [SingleColumnLayoutType]o-[SingleColumnLayoutType] - [Enum]<:--[SingleColumnLayoutType] - - [StudyULogo - | - +onTap: void Function()? - | - +Widget build() - ] - - [StudyULogo]o-[void Function()?] - - [ActionMenuInline - | - +actions: List<ModelAction<dynamic>>; - +iconSize: double?; - +visible: bool; - +splashRadius: double?; - +paddingVertical: double?; - +paddingHorizontal: double? - | - +Widget build() - ] - - [IconPack - | - <static>+defaultPack: List<IconOption>; - <static>+material: List<IconOption> - | - <static>+IconOption? resolveIconByName() - ] - - [IconOption - | - +name: String; - +icon: IconData?; - +isEmpty: bool; - +props: List<Object?> - | - +String toJson(); - <static>+IconOption fromJson() - ] - - [IconOption]o-[IconData] - [<abstract>Equatable]<:-[IconOption] - - [ReactiveIconPicker - ] - - [ReactiveFocusableFormField]<:-[ReactiveIconPicker] - - [IconPicker - | - +iconOptions: List<IconOption>; - +selectedOption: IconOption?; - +onSelect: void Function(IconOption)?; - +galleryIconSize: double?; - +selectedIconSize: double?; - +focusNode: FocusNode?; - +isDisabled: bool - | - +Widget build() - ] - - [IconPicker]o-[IconOption] - [IconPicker]o-[void Function(IconOption)?] - [IconPicker]o-[FocusNode] - - [IconPickerField - | - +iconOptions: List<IconOption>; - +selectedOption: IconOption?; - +selectedIconSize: double?; - +galleryIconSize: double?; - +onSelect: void Function(IconOption)?; - +focusNode: FocusNode?; - +isDisabled: bool - | - +Widget build() - ] - - [IconPickerField]o-[IconOption] - [IconPickerField]o-[void Function(IconOption)?] - [IconPickerField]o-[FocusNode] - - [IconPickerGallery - | - +iconOptions: List<IconOption>; - +onSelect: void Function(IconOption)?; - +iconSize: double - | - +Widget build() - ] - - [IconPickerGallery]o-[void Function(IconOption)?] - - [TextParagraph - | - +text: String?; - +style: TextStyle?; - +selectable: bool; - +span: List<TextSpan>? - | - +Widget build() - ] - - [TextParagraph]o-[TextStyle] - - [<abstract>FormConsumerWidget - | - +Widget build() - ] - - [<abstract>FormConsumerRefWidget - | - +Widget build() - ] - - [ActionPopUpMenuButton - | - +actions: List<ModelAction<dynamic>>; - +triggerIconColor: Color?; - +triggerIconColorHover: Color?; - +triggerIconSize: double; - +disableSplashEffect: bool; - +hideOnEmpty: bool; - +orientation: Axis; - +elevation: double?; - +splashRadius: double?; - +enabled: bool; - +position: PopupMenuPosition - | - +Widget build(); - -Widget _buildPopupMenu() - ] - - [ActionPopUpMenuButton]o-[Color] - [ActionPopUpMenuButton]o-[Axis] - [ActionPopUpMenuButton]o-[PopupMenuPosition] - - [FormScaffold - | - +formViewModel: T; - +actions: List<Widget>?; - +body: Widget; - +drawer: Widget?; - +actionsSpacing: double; - +actionsPadding: double - ] - - [FormScaffold]o-[<abstract>Widget] - - [Hyperlink - | - +text: String; - +url: String?; - +onClick: void Function()?; - +linkColor: Color; - +hoverColor: Color?; - +visitedColor: Color?; - +style: TextStyle?; - +hoverStyle: TextStyle?; - +visitedStyle: TextStyle?; - +icon: IconData?; - +iconSize: double? - ] - - [Hyperlink]o-[void Function()?] - [Hyperlink]o-[Color] - [Hyperlink]o-[TextStyle] - [Hyperlink]o-[IconData] - - [SecondaryButton - | - +text: String; - +icon: IconData?; - +isLoading: bool; - +onPressed: void Function()? - | - +Widget build() - ] - - [SecondaryButton]o-[IconData] - [SecondaryButton]o-[void Function()?] - - [HtmlStylingBanner + [NotificationService | - +isDismissed: bool; - +onDismissed: dynamic Function()? + -_streamController: BehaviorSubject<NotificationIntent> | - +Widget build() + +Stream<NotificationIntent> watchNotifications(); + +void showMessage(); + +void show(); + +void dispose() ] - [HtmlStylingBanner]o-[dynamic Function()?] + [NotificationService]o-[BehaviorSubject] + [<abstract>INotificationService]<:--[NotificationService] - [DismissButton - | - +onPressed: void Function()?; - +text: String? + [NotificationDispatcher | - +Widget build() + +child: Widget?; + +snackbarInnerPadding: double; + +snackbarWidth: double?; + +snackbarBehavior: SnackBarBehavior; + +snackbarDefaultDuration: int ] - [DismissButton]o-[void Function()?] - - [Assets - | - <static>+logoWide: String - ] + [NotificationDispatcher]o-[<abstract>Widget] + [NotificationDispatcher]o-[SnackBarBehavior] - + - + - + - + - + - + - + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - + - + - + - - + + + + + + - - - - + - - + - + - + - - - - - - - - - - + + - + - - - - - - - - - - - - - + + + + + + + - + - + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - + + + - - + - + - + - + - + + + - + - + - + - + - + - - + + - + - - + + - + - + - + - + - - - - - - + - - + - + - + - + - - - + + + + - + + - - - - - - + - - + - + - + - + - - - + + + - + - + - + - - - + + + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - - + + - + - - - - - - - - - - + - + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - + + + - + + - + - + - + - - - + - + - - - + - + - - - - - + + + + - + + - + - + - + - + + + - + - - - + + - - - + + + - - - + + + - + + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - - + + + + + + + + + + - + - + - - + + - + - - - + - + - + - + - + - + - + - + - + - + - + - + - + + + - + - + + + + + - + - - - - - - - - - + - + + + + + + + + + + + + + + - - - + + + + + + + + + + + + + + + + + + - + - + - + - + - + - + - + - + + + - + - + - + - - + + - + - - + + + + - + - + + + - + - + - + - + - + - - - - - - - + - + - + - + - - - + + - + + - + - + - + - + + + - + - + - + - + - - - - - - + - - - - - - + - + - + - - - - + - + + + + - + - + - + - + - + - - + + - + - - - - - + - + - + + + - + - + + + - + - - - + + + - + - - - - - + + - + + - + - - - + - + - - - + - + - + - + - + + + + + - + - + - + - + - + - + - + - + - + + + - + - - - - + + + - - - - - + + + - + + - + - - - + + - + + + + + + - + - + - + - + - + - + - + - + - + - + - + - + - - - - - - + - - - - + - + + + - + - + - + - - + + - + - + - + - - - - - - - - - - - - - - + - - - - - - - - - - - - - - + - + - + - + - + + + - + - - + + - + - - - + + - - - + + - + - - - + - + - + - + - + + + - + - + + + - + - + - - - - - - + - - - - - - - - - - + - + - - - + - + - - - - - + - + - + - + - + - + - - - - - - - + + - + + + + - + - + + + - + - + - + - + - + - - - - + + - + + + + + + - - + - + - + - - - - + + - + - + - + - + - + - - - + + + + + + - + + + + - + - - - - - - - - + + + - - + - - + + - + - + - + - + + + - + + + - + - - + + - + - - - + + + - + - - - - - - - + + + - + - - - + - + - + - + - + - + - + - + - + - + - + - + - - - - - - - - + + + + - + - + - + - + - + - - + + - + - + - - - - + - - + - + - - - - - - - - - - - - - - - - - - - - + + - - - - - - - - - - - - + - - + - + - - - - + + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - - - - - - - - - - - + - + + + - + - - - - - - + + - + - - - - - + + - - - + + + + + + - + - + + + - + - - - + - - - - + - - + - - + + - + - - - + + + - + - - + + + + + - - + + + - + - + - + - - + + + - - + - - + + - + - + - + - - - + - + - - - - - + - + - + - + - + - + - + - + - + - - - - - - - - + - - + - + - + - + - - - + + + + - + + + + - + - + + + - + - + - + - + - + + + + + + + - - - - - - - - - - + + - + - + - + - - - + + + + - - + + + - + - - - + + + - + - + - + - + - + - + - + - + - + + + - - - - - - + + - + - - - - + + + - - + - + - - + + + + + + - + - + - + - + - + - + - + - + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - + - + - + - + - + - + - - - + + + + - - - + + - + - + - + - + - + - - - + + + - + - + + + - + - + - + - - - - - + - + - - - - - + + + + + + + + + + - + + - + - + - + - + - + - + - + - + - + - + + + - + - - - - + + + - - - + + + - - + - + - + - + - + - + - + - + - - - + - - - - + + + + + + - + - + - + - + - + - + - + - - - + - + - + - + - + + + - + - + - + - - - - - - - - - - - - + + + - - - - - - - - + + + - + - + + + - + - + - + - + - + - + - + - + - + - + - + - - - + - + - + - - - + + + + - - + - - + + - + - + - + - + - + - + - - - - + - - - - - - - - + + + - + - - - + + + - + - - + + - + - - + + - + - - - + - + - + - - - - - - - - - - + + + - + + - + - + + + - + - - - - - - - - - + - + - + - + - + - + - + - + - - - - - - - - - + + - + + - + - - - + + - + + - + - + - + - + - + - + + + - + - + - + - + - + - + - + - + - + - + - + - - - - - + - + - + - + - + - + - + + + - + - + - + - + - + - + - + - + - + - + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + - + - + - + - + - + - + - + - + - - - - + - - + - + - + - + - + + + - + - - - - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - + + - + + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + + + - + - + + + - - - - + - - - - + - + - + - + - + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - + + - + + - + - + - + - + - + - + - + - - - + - + - + - + - + - + - + - + - - - + - - - - + - - + - + - + - + - + - + - + - + - - - - - + - + - + - + - - - - - + - + - + - + - - - + + - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + + - + - + - + - + - + - - - - - - - - Notifications - - - - - - <static>+passwordReset: SnackbarIntent - <static>+passwordResetSuccess: SnackbarIntent - <static>+studyDeleted: SnackbarIntent - <static>+inviteCodeDeleted: SnackbarIntent - <static>+inviteCodeClipped: SnackbarIntent - <static>+studyDeleteConfirmation: AlertIntent - - - + + + - - - - - - - - SnackbarIntent - - - - - - +duration: int? - - - + + + - - - - - - - - AlertIntent - - - - - - +title: String - +dismissOnAction: bool - +isDestructive: dynamic - - - + + - - - - - - - - NotificationDefaultActions - - - - - - <static>+cancel: NotificationAction - - - + + + + - - - - - - - - NotificationAction - - - - - - +label: String - +onSelect: dynamic Function() - +isDestructive: bool - - - + + + - - - - - - - - INotificationService - - - - - - +void showMessage() - +void show() - +Stream<NotificationIntent> watchNotifications() - +void dispose() - - - + + + + + + + - - - - - - - - - NotificationService - - - - - - -_streamController: BehaviorSubject<NotificationIntent> - - - - - - +Stream<NotificationIntent> watchNotifications() - +void showMessage() - +void show() - +void dispose() - - - + + + - - - - - - - BehaviorSubject - - - + + + - - - - - - - - NotificationDispatcher - - - - - - +child: Widget? - +snackbarInnerPadding: double - +snackbarWidth: double? - +snackbarBehavior: SnackBarBehavior - +snackbarDefaultDuration: int - - - + + + - - - - - - - Widget - - - + + + - - - - - - - SnackBarBehavior - - - + + + - - - - - - - - - NotificationIntent - - - - - - +message: String? - +customContent: Widget? - +icon: IconData? - +actions: List<NotificationAction>? - +type: NotificationType - - - - - - +void register() - - - + + + - - - - - - - IconData - - - + + + - - - - - - - - NotificationType - - - - - - +index: int - <static>+values: List<NotificationType> - <static>+snackbar: NotificationType - <static>+alert: NotificationType - <static>+custom: NotificationType - - - + + + - - - - - - - dynamic Function() - - - + + + - - - - - - - Enum - - - + + + - - - - - - - - IClipboardService - - - - - - +dynamic copy() - - - + + + - - - - - - - - ClipboardService - - - - - - +dynamic copy() - - - + + + - - - - - - - - IAppRepository - - - - - - +dynamic fetchAppConfig() - +void dispose() - - - + + + - - - - - - - - - AppRepository - - - - - - +apiClient: StudyUApi - - - - - - +dynamic fetchAppConfig() - +void dispose() - - - + + + - - - - - - - - StudyUApi - - - - - - +dynamic saveStudy() - +dynamic fetchStudy() - +dynamic getUserStudies() - +dynamic deleteStudy() - +dynamic saveStudyInvite() - +dynamic fetchStudyInvite() - +dynamic deleteStudyInvite() - +dynamic deleteParticipants() - +dynamic fetchAppConfig() - +dynamic fetchUser() - +dynamic saveUser() - - - + + + - - - - - - - - SupabaseClientDependant - - - - - - +supabaseClient: SupabaseClient - - - + + + - - - - - - - SupabaseClient - - - + + + - - - - - - - - SupabaseQueryError - - - - - - +statusCode: String? - +message: String - +details: dynamic - - - + + + - - - - - - - Exception - - - + + - - - - - - - - SupabaseQueryMixin - - - - - - +dynamic deleteAll() - +dynamic getAll() - +dynamic getById() - +dynamic getByColumn() - +List<T> deserializeList() - +T deserializeObject() - - - + + + + - - - - - - - - ModelEvent - - - - - - +modelId: String - +model: T - - - + + + + + - - - - - - - IsFetched - - - + + + + + + + + + - - - - - - - IsSaving - - - + + + - - - - - - - IsSaved - - - + + + + + - - - - - - - IsDeleted - - - + + + - - - - - - - - - WrappedModel - - - - - - -_model: T - +asyncValue: AsyncValue<T> - +isLocalOnly: bool - +isDirty: bool - +isDeleted: bool - +lastSaved: DateTime? - +lastFetched: DateTime? - +lastUpdated: DateTime? - +model: T - - - - - - +dynamic markWithError() - +dynamic markAsLoading() - +dynamic markAsFetched() - +dynamic markAsSaved() - - - + + + + + + + + + + + + + + + + + + + - - - - - - - AsyncValue - - - + + + - - - - - - - ModelRepositoryException - - - + + + - - - - - - - ModelNotFoundException - - - + + + - - - - - - - - IModelRepository - - - - - - +String getKey() - +WrappedModel<T>? get() - +dynamic fetchAll() - +dynamic fetch() - +dynamic save() - +dynamic delete() - +dynamic duplicateAndSave() - +dynamic duplicateAndSaveFromRemote() - +Stream<WrappedModel<T>> watch() - +Stream<List<WrappedModel<T>>> watchAll() - +Stream<ModelEvent<T>> watchChanges() - +Stream<ModelEvent<T>> watchAllChanges() - +dynamic ensurePersisted() - +void dispose() - - - + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - IModelActionProvider - - - - - - +List<ModelAction<dynamic>> availableActions() - - - + + + - - - - - - - - IModelRepositoryDelegate - - - - - - +dynamic fetchAll() - +dynamic fetch() - +dynamic save() - +dynamic delete() - +T createNewInstance() - +T createDuplicate() - +dynamic onError() - - - + + + - - - - - - - - - ModelRepository - - - - - - +delegate: IModelRepositoryDelegate<T> - -_allModelsStreamController: BehaviorSubject<List<WrappedModel<T>>> - -_allModelEventsStreamController: BehaviorSubject<ModelEvent<T>> - +modelStreamControllers: Map<String, BehaviorSubject<WrappedModel<T>>> - +modelEventsStreamControllers: Map<String, BehaviorSubject<ModelEvent<T>>> - -_allModels: Map<String, WrappedModel<T>> - - - - - - +WrappedModel<T>? get() - +dynamic fetchAll() - +dynamic fetch() - +dynamic save() - +dynamic delete() - +dynamic duplicateAndSave() - +dynamic duplicateAndSaveFromRemote() - +Stream<List<WrappedModel<T>>> watchAll() - +Stream<WrappedModel<T>> watch() - +Stream<ModelEvent<T>> watchAllChanges() - +Stream<ModelEvent<T>> watchChanges() - -dynamic _buildModelSpecificController() - +dynamic ensurePersisted() - +WrappedModel<T> upsertLocally() - +List<WrappedModel<T>> upsertAllLocally() - +dynamic emitUpdate() - +dynamic emitModelEvent() - +dynamic emitError() - +void dispose() - +List<ModelAction<dynamic>> availableActions() - - - + + + - - - - - - - APIException - - - + + + - - - - - - - StudyNotFoundException - - - + + + - - - - - - - MeasurementNotFoundException - - - + + + + + + + - - - - - - - QuestionNotFoundException - - - + + - - - + + + + + + + + + + + + + + + + + + + + + - - - ConsentItemNotFoundException + + + LanguagePicker - - - - - - - - InterventionNotFoundException + + + +languagePickerType: LanguagePickerType + +iconColor: Color? + +offset: Offset? - - - + + + + - - - InterventionTaskNotFoundException + + + LanguagePickerType - - - - - - - - ReportNotFoundException + + + +index: int + <static>+values: List<LanguagePickerType> + <static>+field: LanguagePickerType + <static>+icon: LanguagePickerType - - - + + + - - - ReportSectionNotFoundException + + + Color - - - + + + - - - StudyInviteNotFoundException + + + Offset - - - + + + - - - UserNotFoundException + + + Enum - - - - - + + + + - - - StudyUApiClient + + + PlatformLocaleMobile - - - +supabaseClient: SupabaseClient - <static>+studyColumns: List<String> - <static>+studyWithParticipantActivityColumns: List<String> - +testDelayMilliseconds: int + + + +Locale getPlatformLocale() - - - +dynamic deleteParticipants() - +dynamic getUserStudies() - +dynamic fetchStudy() - +dynamic deleteStudy() - +dynamic saveStudy() - +dynamic fetchStudyInvite() - +dynamic saveStudyInvite() - +dynamic deleteStudyInvite() - +dynamic fetchAppConfig() - +dynamic fetchUser() - +dynamic saveUser() - -dynamic _awaitGuarded() - -dynamic _apiException() - -dynamic _testDelay() + + + + + + + + + PlatformLocale - - - - - - - - StudyLaunched + + + +Locale getPlatformLocale() - - - - + + + + - - - IInviteCodeRepository + + + PlatformLocaleWeb - - - +dynamic isCodeAlreadyUsed() + + + +Locale getPlatformLocale() - - - - - - - - - InviteCodeRepository - - + + + + - - - +studyId: String - +ref: ProviderRef<dynamic> - +apiClient: StudyUApi - +authRepository: IAuthRepository - +studyRepository: IStudyRepository - +study: Study + + + AppTranslation - - - +String getKey() - +dynamic isCodeAlreadyUsed() - +List<ModelAction<dynamic>> availableActions() - +dynamic emitUpdate() + + + <static>+dynamic init() - - - + + + - - - ProviderRef + + + ResultTypes - - - - - + + + + - - - IAuthRepository + + + MeasurementResultTypes - - - +allowPasswordReset: bool - +currentUser: User? - +isLoggedIn: bool - +session: Session? + + + <static>+questionnaire: String + <static>+values: List<String> - - - +dynamic signUp() - +dynamic signInWith() - +dynamic signOut() - +dynamic resetPasswordForEmail() - +dynamic updateUser() - +void dispose() + + + + + + + + + InterventionResultTypes + + + + + + <static>+checkmarkTask: String + <static>+values: List<String> - - - - + + + + - - - IStudyRepository + + + StudyExportData - - - +dynamic launch() - +dynamic deleteParticipants() + + + +study: Study + +measurementsData: List<Map<String, dynamic>> + +interventionsData: List<Map<String, dynamic>> + +isEmpty: bool - + - + Study - - - - - + + + + + - - - InviteCodeRepositoryDelegate + + + StudyTemplates - - - +study: Study - +apiClient: StudyUApi - +studyRepository: IStudyRepository + + + <static>+kUnnamedStudyTitle: String - - - +dynamic fetch() - +dynamic fetchAll() - +dynamic save() - +dynamic delete() - +dynamic onError() - +StudyInvite createDuplicate() - +StudyInvite createNewInstance() + + + <static>+Study emptyDraft() - - - - - + + + + - - - StudyRepository + + + StudyActionType - - - +apiClient: StudyUApi - +authRepository: IAuthRepository - +ref: ProviderRef<dynamic> - +sortCallback: void Function()? + + + +index: int + <static>+values: List<StudyActionType> + <static>+pin: StudyActionType + <static>+pinoff: StudyActionType + <static>+edit: StudyActionType + <static>+duplicate: StudyActionType + <static>+duplicateDraft: StudyActionType + <static>+addCollaborator: StudyActionType + <static>+export: StudyActionType + <static>+delete: StudyActionType - - - +String getKey() - +dynamic deleteParticipants() - +dynamic launch() - +List<ModelAction<dynamic>> availableActions() + + + + + + + + + DropdownMenuItemTheme + + + + + + +iconTheme: IconThemeData? - - - + + + - - - void Function()? + + + IconThemeData - - - - - + + + - - - StudyRepositoryDelegate + + + Diagnosticable - - - +apiClient: StudyUApi - +authRepository: IAuthRepository + + + + + + + + + + ThemeConfig - - - +dynamic fetchAll() - +dynamic fetch() - +dynamic save() - +dynamic delete() - +dynamic onError() - +Study createNewInstance() - +Study createDuplicate() + + + <static>+kMinContentWidth: double + <static>+kMaxContentWidth: double + <static>+kHoverFadeFactor: double + <static>+kMuteFadeFactor: double + + + + + + <static>+dynamic bodyBackgroundColor() + <static>+Color modalBarrierColor() + <static>+Color containerColor() + <static>+Color colorPickerInitialColor() + <static>+TextStyle bodyTextMuted() + <static>+TextStyle bodyTextBackground() + <static>+double iconSplashRadius() + <static>+Color sidesheetBackgroundColor() + <static>+InputDecorationTheme dropdownInputDecorationTheme() + <static>+DropdownMenuItemTheme dropdownMenuItemTheme() - - - + + + + - - - User + + + NoAnimationPageTransitionsBuilder + + + + + + +Widget buildTransitions() - - - + + + - - - Session + + + PageTransitionsBuilder - - - - + + + + - - - IAppDelegate + + + WebTransitionBuilder - - - +dynamic onAppStart() + + + +Widget buildTransitions() - - - - - + + + + - - - AuthRepository + + + ThemeSettingChange - - - <static>+PERSIST_SESSION_KEY: String - +supabaseClient: SupabaseClient - +sharedPreferences: SharedPreferences - +allowPasswordReset: bool - +authClient: GoTrueClient - +session: Session? - +currentUser: User? - +isLoggedIn: bool + + + +settings: ThemeSettings - - - -void _registerAuthListener() - +dynamic signUp() - +dynamic signInWith() - +dynamic signOut() - +dynamic resetPasswordForEmail() - +dynamic updateUser() - -dynamic _persistSession() - -dynamic _resetPersistedSession() - -dynamic _recoverSession() - +void dispose() - +dynamic onAppStart() + + + + + + + + + ThemeSettings - - - - - - - - SharedPreferences + + + +sourceColor: Color + +themeMode: ThemeMode - - - + + + - - - GoTrueClient + + + Notification - - - - - + + + + + - - - IUserRepository + + + ThemeProvider - - - +user: StudyUUser + + + +settings: ValueNotifier<ThemeSettings> + +lightDynamic: ColorScheme? + +darkDynamic: ColorScheme? + +pageTransitionsTheme: PageTransitionsTheme + +shapeMedium: ShapeBorder - - - +dynamic fetchUser() - +dynamic saveUser() - +dynamic updatePreferences() + + + +Color custom() + +Color blend() + +Color source() + +ColorScheme colors() + +CardTheme cardTheme() + +ListTileThemeData listTileTheme() + +AppBarTheme appBarTheme() + +SnackBarThemeData snackBarThemeData() + +TabBarTheme tabBarTheme() + +BottomAppBarTheme bottomAppBarTheme() + +BottomNavigationBarThemeData bottomNavigationBarTheme() + +SwitchThemeData switchTheme() + +InputDecorationTheme inputDecorationTheme() + +TextTheme textTheme() + +DividerThemeData dividerTheme() + +NavigationRailThemeData navigationRailTheme() + +DrawerThemeData drawerTheme() + +IconThemeData iconTheme() + +CheckboxThemeData checkboxTheme() + +RadioThemeData radioTheme() + +TooltipThemeData tooltipTheme() + +ThemeData light() + +ThemeData dark() + +ThemeMode themeMode() + +ThemeData theme() + <static>+ThemeProvider of() + +bool updateShouldNotify() - - - + + + - - - StudyUUser + + + ValueNotifier - - - - - + + + - - - UserRepository + + + ColorScheme - - - +apiClient: StudyUApi - +authRepository: IAuthRepository - +ref: Ref<Object?> - +user: StudyUUser - - + + + + - - - +dynamic fetchUser() - +dynamic saveUser() - +dynamic updatePreferences() + + + PageTransitionsTheme - - - + + + - - - Ref + + + ShapeBorder - - - - + + + - - - PreferenceAction + + + InheritedWidget - - - +index: int - <static>+values: List<PreferenceAction> - <static>+pin: PreferenceAction - <static>+pinOff: PreferenceAction + + + + + + + + ThemeMode - - - + + + + + - - - ResultTypes + + + CustomColor - - - - - - - - - MeasurementResultTypes + + + +name: String + +color: Color + +blend: bool - - - <static>+questionnaire: String - <static>+values: List<String> + + + +Color value() - - - - + + + + - - - InterventionResultTypes + + + Config - - - <static>+checkmarkTask: String - <static>+values: List<String> + + + <static>+isDebugMode: bool + <static>+defaultLocale: Set<String> + <static>+supportedLocales: Map<String, String> + <static>+newStudyId: String + <static>+newModelId: String + <static>+minSplashTime: int + <static>+formAutosaveDebounce: int - - - - + + + + - - - StudyExportData + + + Assets - - - +study: Study - +measurementsData: List<Map<String, dynamic>> - +interventionsData: List<Map<String, dynamic>> - +isEmpty: bool + + + <static>+logoWide: String - - - - - + + + - - - StudyTemplates + + + StudyLaunched - - - <static>+kUnnamedStudyTitle: String + + + + + + + + + ModelEvent - - - <static>+Study emptyDraft() + + + +modelId: String + +model: T - - - - + + + + - - - StudyActionType + + + IInviteCodeRepository - - - +index: int - <static>+values: List<StudyActionType> - <static>+pin: StudyActionType - <static>+pinoff: StudyActionType - <static>+edit: StudyActionType - <static>+duplicate: StudyActionType - <static>+duplicateDraft: StudyActionType - <static>+addCollaborator: StudyActionType - <static>+export: StudyActionType - <static>+delete: StudyActionType + + + +dynamic isCodeAlreadyUsed() - - - - + + + + + - - - DropdownMenuItemTheme + + + ModelRepository - - - +iconTheme: IconThemeData? + + + +delegate: IModelRepositoryDelegate<T> + -_allModelsStreamController: BehaviorSubject<List<WrappedModel<T>>> + -_allModelEventsStreamController: BehaviorSubject<ModelEvent<T>> + +modelStreamControllers: Map<String, BehaviorSubject<WrappedModel<T>>> + +modelEventsStreamControllers: Map<String, BehaviorSubject<ModelEvent<T>>> + -_allModels: Map<String, WrappedModel<T>> + + + + + + +WrappedModel<T>? get() + +dynamic fetchAll() + +dynamic fetch() + +dynamic save() + +dynamic delete() + +dynamic duplicateAndSave() + +dynamic duplicateAndSaveFromRemote() + +Stream<List<WrappedModel<T>>> watchAll() + +Stream<WrappedModel<T>> watch() + +Stream<ModelEvent<T>> watchAllChanges() + +Stream<ModelEvent<T>> watchChanges() + -dynamic _buildModelSpecificController() + +dynamic ensurePersisted() + +WrappedModel<T> upsertLocally() + +List<WrappedModel<T>> upsertAllLocally() + +dynamic emitUpdate() + +dynamic emitModelEvent() + +dynamic emitError() + +void dispose() + +List<ModelAction<dynamic>> availableActions() - - - + + + + + - - - IconThemeData + + + InviteCodeRepository - - - - - - - - Diagnosticable + + + +studyId: String + +ref: ProviderRef<dynamic> + +apiClient: StudyUApi + +authRepository: IAuthRepository + +studyRepository: IStudyRepository + +study: Study - - - - - - - - - - ThemeConfig + + + +String getKey() + +dynamic isCodeAlreadyUsed() + +List<ModelAction<dynamic>> availableActions() + +dynamic emitUpdate() - - - <static>+kMinContentWidth: double - <static>+kMaxContentWidth: double - <static>+kHoverFadeFactor: double - <static>+kMuteFadeFactor: double - - + + + + - - - <static>+dynamic bodyBackgroundColor() - <static>+Color modalBarrierColor() - <static>+Color containerColor() - <static>+Color colorPickerInitialColor() - <static>+TextStyle bodyTextMuted() - <static>+TextStyle bodyTextBackground() - <static>+double iconSplashRadius() - <static>+Color sidesheetBackgroundColor() - <static>+InputDecorationTheme dropdownInputDecorationTheme() - <static>+DropdownMenuItemTheme dropdownMenuItemTheme() + + + ProviderRef - - - - + + + + - - - NoAnimationPageTransitionsBuilder + + + StudyUApi - - - +Widget buildTransitions() + + + +dynamic saveStudy() + +dynamic fetchStudy() + +dynamic getUserStudies() + +dynamic deleteStudy() + +dynamic saveStudyInvite() + +dynamic fetchStudyInvite() + +dynamic deleteStudyInvite() + +dynamic deleteParticipants() + +dynamic fetchAppConfig() + +dynamic fetchUser() + +dynamic saveUser() - - - + + + + + - - - PageTransitionsBuilder + + + IAuthRepository - - - - - - - - - WebTransitionBuilder + + + +allowPasswordReset: bool + +currentUser: User? + +isLoggedIn: bool + +session: Session? - - - +Widget buildTransitions() + + + +dynamic signUp() + +dynamic signInWith() + +dynamic signOut() + +dynamic resetPasswordForEmail() + +dynamic updateUser() + +void dispose() - - - - + + + + - - - ThemeSettingChange + + + IStudyRepository - - - +settings: ThemeSettings + + + +dynamic launch() + +dynamic deleteParticipants() - - - - + + + + + - - - ThemeSettings + + + InviteCodeRepositoryDelegate - - - +sourceColor: Color - +themeMode: ThemeMode + + + +study: Study + +apiClient: StudyUApi + +studyRepository: IStudyRepository - - - - - - - - Notification + + + +dynamic fetch() + +dynamic fetchAll() + +dynamic save() + +dynamic delete() + +dynamic onError() + +StudyInvite createDuplicate() + +StudyInvite createNewInstance() - - - - - + + + + - - - ThemeProvider + + + IModelRepositoryDelegate - - - +settings: ValueNotifier<ThemeSettings> - +lightDynamic: ColorScheme? - +darkDynamic: ColorScheme? - +pageTransitionsTheme: PageTransitionsTheme - +shapeMedium: ShapeBorder + + + +dynamic fetchAll() + +dynamic fetch() + +dynamic save() + +dynamic delete() + +T createNewInstance() + +T createDuplicate() + +dynamic onError() - - - +Color custom() - +Color blend() - +Color source() - +ColorScheme colors() - +CardTheme cardTheme() - +ListTileThemeData listTileTheme() - +AppBarTheme appBarTheme() - +SnackBarThemeData snackBarThemeData() - +TabBarTheme tabBarTheme() - +BottomAppBarTheme bottomAppBarTheme() - +BottomNavigationBarThemeData bottomNavigationBarTheme() - +SwitchThemeData switchTheme() - +InputDecorationTheme inputDecorationTheme() - +TextTheme textTheme() - +DividerThemeData dividerTheme() - +NavigationRailThemeData navigationRailTheme() - +DrawerThemeData drawerTheme() - +IconThemeData iconTheme() - +CheckboxThemeData checkboxTheme() - +RadioThemeData radioTheme() - +TooltipThemeData tooltipTheme() - +ThemeData light() - +ThemeData dark() - +ThemeMode themeMode() - +ThemeData theme() - <static>+ThemeProvider of() - +bool updateShouldNotify() + + + + + + + + User - - - + + + - - - ValueNotifier + + + Session - - - + + + + - - - ColorScheme + + + IAppDelegate + + + + + + +dynamic onAppStart() - - - + + + + + - - - PageTransitionsTheme + + + AuthRepository - - - - + + + <static>+PERSIST_SESSION_KEY: String + +supabaseClient: SupabaseClient + +sharedPreferences: SharedPreferences + +allowPasswordReset: bool + +authClient: GoTrueClient + +session: Session? + +currentUser: User? + +isLoggedIn: bool + + - - - ShapeBorder + + + -void _registerAuthListener() + +dynamic signUp() + +dynamic signInWith() + +dynamic signOut() + +dynamic resetPasswordForEmail() + +dynamic updateUser() + -dynamic _persistSession() + -dynamic _resetPersistedSession() + -dynamic _recoverSession() + +void dispose() + +dynamic onAppStart() - - - + + + - - - InheritedWidget + + + SupabaseClient - - - + + + - - - Color + + + SharedPreferences - - - + + + - - - ThemeMode + + + GoTrueClient - - - - - + + + + + - - - CustomColor + + + IUserRepository - - - +name: String - +color: Color - +blend: bool + + + +user: StudyUUser - - - +Color value() + + + +dynamic fetchUser() + +dynamic saveUser() + +dynamic updatePreferences() - - - + + + - - - App + + + StudyUUser - - - + + + + + - - - AppContent + + + UserRepository - - - - - - - - - - SignupForm + + + +apiClient: StudyUApi + +authRepository: IAuthRepository + +ref: Ref<Object?> + +user: StudyUUser - - - +formKey: AuthFormKey + + + +dynamic fetchUser() + +dynamic saveUser() + +dynamic updatePreferences() - - - +Widget build() - -dynamic _onClickTermsOfUse() - -dynamic _onClickPrivacyPolicy() + + + + + + + + Ref - - - - + + + + - - - AuthFormKey + + + PreferenceAction - - - +index: int - <static>+values: List<AuthFormKey> - <static>+login: AuthFormKey - <static>+signup: AuthFormKey - <static>+passwordForgot: AuthFormKey - <static>+passwordRecovery: AuthFormKey - <static>-_loginSubmit: AuthFormKey - <static>-_signupSubmit: AuthFormKey + + + +index: int + <static>+values: List<PreferenceAction> + <static>+pin: PreferenceAction + <static>+pinOff: PreferenceAction - - - - + + + + - - - FormConsumerRefWidget + + + SupabaseClientDependant - - - +Widget build() + + + +supabaseClient: SupabaseClient - - - - + + + + - - - StudyUJobsToBeDone + + + SupabaseQueryError - - - +Widget build() + + + +statusCode: String? + +message: String + +details: dynamic - - - - - + + + - - - LoginForm + + + Exception - - - +formKey: AuthFormKey + + + + + + + + + SupabaseQueryMixin - - - +Widget build() + + + +dynamic deleteAll() + +dynamic getAll() + +dynamic getById() + +dynamic getByColumn() + +List<T> deserializeList() + +T deserializeObject() - - - - - + + + + + - - - PasswordForgotForm + + + StudyRepository - - - +formKey: AuthFormKey + + + +apiClient: StudyUApi + +authRepository: IAuthRepository + +ref: ProviderRef<dynamic> + +sortCallback: void Function()? - - - +Widget build() + + + +String getKey() + +dynamic deleteParticipants() + +dynamic launch() + +List<ModelAction<dynamic>> availableActions() - - - - - - - - EmailTextField - - + + + - - - +labelText: String - +hintText: String? - +formControlName: String? - +formControl: FormControl<dynamic>? + + + void Function()? - - - + + + + + - - - FormControl + + + StudyRepositoryDelegate - - - - - - - - - PasswordTextField + + + +apiClient: StudyUApi + +authRepository: IAuthRepository - - - +labelText: String - +hintText: String? - +formControlName: String? - +formControl: FormControl<dynamic>? + + + +dynamic fetchAll() + +dynamic fetch() + +dynamic save() + +dynamic delete() + +dynamic onError() + +Study createNewInstance() + +Study createDuplicate() - - - - - + + + + + - - - AuthFormController + + + WrappedModel + + + + + + -_model: T + +asyncValue: AsyncValue<T> + +isLocalOnly: bool + +isDirty: bool + +isDeleted: bool + +lastSaved: DateTime? + +lastFetched: DateTime? + +lastUpdated: DateTime? + +model: T - - - +authRepository: IAuthRepository - +sharedPreferences: SharedPreferences - +notificationService: INotificationService - +router: GoRouter - +emailControl: FormControl<String> - +passwordControl: FormControl<String> - +passwordConfirmationControl: FormControl<String> - +rememberMeControl: FormControl<bool> - +termsOfServiceControl: FormControl<bool> - <static>+authValidationMessages: Map<String, String Function(dynamic)> - +loginForm: FormGroup - +signupForm: FormGroup - +passwordForgotForm: FormGroup - +passwordRecoveryForm: FormGroup - +controlValidatorsByForm: Map<AuthFormKey, Map<FormControl<dynamic>, List<Validator<dynamic>>>> - -_formKey: AuthFormKey - +shouldRemember: bool - +formKey: AuthFormKey - +form: FormGroup + + + +dynamic markWithError() + +dynamic markAsLoading() + +dynamic markAsFetched() + +dynamic markAsSaved() - - - -dynamic _onChangeFormKey() - +dynamic resetControlsFor() - -dynamic _forceValidationMessages() - +dynamic signUp() - -dynamic _signUp() - +dynamic signIn() - -dynamic _signInWith() - +dynamic signOut() - +dynamic resetPasswordForEmail() - +dynamic sendPasswordResetLink() - +dynamic recoverPassword() - +dynamic updateUser() - -void _setRememberMe() - -void _delRememberMe() - -void _initRememberMe() + + + + + + + + AsyncValue - - - + + + - - - GoRouter + + + ModelRepositoryException - - - + + + - - - FormGroup + + + ModelNotFoundException - - - - + + + + - - - IFormGroupController + + + IModelRepository - - - +form: FormGroup + + + +String getKey() + +WrappedModel<T>? get() + +dynamic fetchAll() + +dynamic fetch() + +dynamic save() + +dynamic delete() + +dynamic duplicateAndSave() + +dynamic duplicateAndSaveFromRemote() + +Stream<WrappedModel<T>> watch() + +Stream<List<WrappedModel<T>>> watchAll() + +Stream<ModelEvent<T>> watchChanges() + +Stream<ModelEvent<T>> watchAllChanges() + +dynamic ensurePersisted() + +void dispose() - - - - - + + + + - - - PasswordRecoveryForm + + + IModelActionProvider - - - +formKey: AuthFormKey + + + +List<ModelAction<dynamic>> availableActions() - - - +Widget build() + + + + + + + + BehaviorSubject - - - - + + + - - - AuthScaffold + + + APIException - - - +body: Widget - +formKey: AuthFormKey - +leftContentMinWidth: double - +leftPanelMinWidth: double - +leftPanelPadding: EdgeInsets + + + + + + + + StudyNotFoundException - - - + + + - - - EdgeInsets + + + MeasurementNotFoundException - - - - - + + + - - - DrawerEntry + + + QuestionNotFoundException - - - +localizedTitle: String Function() - +icon: IconData? - +localizedHelpText: String Function()? - +enabled: bool - +onSelected: void Function(BuildContext, WidgetRef)? - +title: String - +helpText: String? - - + + + + - - - +void onClick() + + + ConsentItemNotFoundException - - - + + + - - - String Function() + + + InterventionNotFoundException - - - + + + - - - String Function()? + + + InterventionTaskNotFoundException - - - + + + - - - void Function(BuildContext, WidgetRef)? + + + ReportNotFoundException - - - - - + + + - - - GoRouterDrawerEntry + + + ReportSectionNotFoundException - - - +intent: RoutingIntent - - + + + + - - - +void onClick() + + + StudyInviteNotFoundException - - - - - + + + - - - RoutingIntent + + + UserNotFoundException - - - +route: GoRoute - +params: Map<String, String> - +queryParams: Map<String, String> - +dispatch: RoutingIntentDispatch? - +extra: Object? - +routeName: String - +arguments: Map<String, String> - +props: List<Object?> + + + + + + + + + + StudyUApiClient - - - -dynamic _validateRoute() - +bool matches() + + + +supabaseClient: SupabaseClient + <static>+studyColumns: List<String> + <static>+studyWithParticipantActivityColumns: List<String> + +testDelayMilliseconds: int - - - - - - - - - AppDrawer + + + +dynamic deleteParticipants() + +dynamic getUserStudies() + +dynamic fetchStudy() + +dynamic deleteStudy() + +dynamic saveStudy() + +dynamic fetchStudyInvite() + +dynamic saveStudyInvite() + +dynamic deleteStudyInvite() + +dynamic fetchAppConfig() + +dynamic fetchUser() + +dynamic saveUser() + -dynamic _awaitGuarded() + -dynamic _apiException() + -dynamic _testDelay() - - - +title: String - +width: int - +leftPaddingEntries: double - +logoPaddingVertical: double - +logoPaddingHorizontal: double - +logoMaxHeight: double - +logoSectionMinHeight: double - +logoSectionMaxHeight: double + + + + + + + + IsFetched - - - - + + + - - - PublishDialog + + + IsSaving - - - +Widget build() + + + + + + + + IsSaved - - - - - + + + - - - StudyPageWidget + + + IsDeleted - - - +studyId: String + + + + + + + + + IAppRepository - - - +Widget? banner() + + + +dynamic fetchAppConfig() + +void dispose() - - - - + + + + + - - - PublishSuccessDialog + + + AppRepository - - - +Widget build() + + + +apiClient: StudyUApi + + + + + + +dynamic fetchAppConfig() + +void dispose() - - - - + + + + - - - PublishConfirmationDialog + + + RoutingIntents - - - +Widget build() + + + <static>+root: RoutingIntent + <static>+studies: RoutingIntent + <static>+studiesShared: RoutingIntent + <static>+publicRegistry: RoutingIntent + <static>+study: RoutingIntent Function(String) + <static>+studyEdit: RoutingIntent Function(String) + <static>+studyEditInfo: RoutingIntent Function(String) + <static>+studyEditEnrollment: RoutingIntent Function(String) + <static>+studyEditInterventions: RoutingIntent Function(String) + <static>+studyEditIntervention: RoutingIntent Function(String, String) + <static>+studyEditMeasurements: RoutingIntent Function(String) + <static>+studyEditReports: RoutingIntent Function(String) + <static>+studyEditMeasurement: RoutingIntent Function(String, String) + <static>+studyTest: RoutingIntent Function(String, {String? appRoute}) + <static>+studyRecruit: RoutingIntent Function(String) + <static>+studyMonitor: RoutingIntent Function(String) + <static>+studyAnalyze: RoutingIntent Function(String) + <static>+studySettings: RoutingIntent Function(String) + <static>+accountSettings: RoutingIntent + <static>+studyNew: RoutingIntent + <static>+login: RoutingIntent + <static>+signup: RoutingIntent + <static>+passwordForgot: RoutingIntent + <static>+passwordForgot2: RoutingIntent Function(String) + <static>+passwordRecovery: RoutingIntent + <static>+error: RoutingIntent Function(Exception) - - - - - + + + + + - - - InviteCodeFormView + + + RoutingIntent - - - +formViewModel: InviteCodeFormViewModel + + + +route: GoRoute + +params: Map<String, String> + +queryParams: Map<String, String> + +dispatch: RoutingIntentDispatch? + +extra: Object? + +routeName: String + +arguments: Map<String, String> + +props: List<Object?> - - - +Widget build() - -List<FormTableRow> _conditionalInterventionRows() + + + -dynamic _validateRoute() + +bool matches() - - - - - + + + - - - InviteCodeFormViewModel + + + RoutingIntent Function(String) - - - +study: Study - +inviteCodeRepository: IInviteCodeRepository - +codeControl: FormControl<String> - +codeControlValidationMessages: Map<String, String Function(dynamic)> - +isPreconfiguredScheduleControl: FormControl<bool> - +preconfiguredScheduleTypeControl: FormControl<PhaseSequence> - +interventionAControl: FormControl<String> - +interventionBControl: FormControl<String> - +form: FormGroup - +titles: Map<FormMode, String> - +interventionControlOptions: List<FormControlOption<String>> - +preconfiguredScheduleTypeOptions: List<FormControlOption<PhaseSequence>> - +isPreconfiguredSchedule: bool - +preconfiguredSchedule: List<String>? - - + + + + - - - +void initControls() - -dynamic _uniqueInviteCode() - +void regenerateCode() - -String _generateCode() - +StudyInvite buildFormData() - +void setControlsFrom() - +dynamic save() + + + RoutingIntent Function(String, String) - - - - + + + - - - FormConsumerWidget + + + RoutingIntent Function(String, {String? appRoute}) - - - +Widget build() + + + + + + + + RoutingIntent Function(Exception) - - - - - + + + - - - StudyInvitesTable + + + GoRoute - - - +invites: List<StudyInvite> - +onSelect: void Function(StudyInvite) - +getActions: List<ModelAction<dynamic>> Function(StudyInvite) - +getInlineActions: List<ModelAction<dynamic>> Function(StudyInvite) - +getIntervention: Intervention? Function(String) - +getParticipantCountForInvite: int Function(StudyInvite) + + + + + + + + + RoutingIntentDispatch - - - +Widget build() - -List<Widget> _buildRow() + + + +index: int + <static>+values: List<RoutingIntentDispatch> + <static>+go: RoutingIntentDispatch + <static>+push: RoutingIntentDispatch - - - + + + - - - void Function(StudyInvite) + + + Equatable - - - + + + + - - - List<ModelAction<dynamic>> Function(StudyInvite) + + + RouterKeys - - - - - - - - Intervention? Function(String) + + + <static>+studyKey: ValueKey<String> + <static>+authKey: ValueKey<String> - - - + + + - - - int Function(StudyInvite) + + + ValueKey - - - - - - - - - EnrolledBadge - - + + + + - - - +enrolledCount: int + + + RouteParams - - - +Widget build() + + + <static>+studiesFilter: String + <static>+studyId: String + <static>+measurementId: String + <static>+interventionId: String + <static>+testAppRoute: String - - - - - + + + + + - - - StudyRecruitController + + + RouterConf - - - +inviteCodeRepository: IInviteCodeRepository - -_invitesSubscription: StreamSubscription<List<WrappedModel<StudyInvite>>>? + + + <static>+router: GoRouter + <static>+routes: List<GoRoute> + <static>+publicRoutes: List<GoRoute> + <static>+privateRoutes: List<GoRoute> - - - -dynamic _subscribeInvites() - +Intervention? getIntervention() - +int getParticipantCountForInvite() - +List<ModelAction<dynamic>> availableActions() - +List<ModelAction<dynamic>> availableInlineActions() - +void dispose() + + + <static>+GoRoute route() - - - + + + - - - StreamSubscription + + + GoRouter - - - - - - - - - StudyBaseController - - + + + + - - - +studyId: String - +studyRepository: IStudyRepository - +router: GoRouter - +studySubscription: StreamSubscription<WrappedModel<Study>>? + + + StudyFormRouteArgs - - - +dynamic subscribeStudy() - +dynamic onStudySubscriptionUpdate() - +dynamic onStudySubscriptionError() - +void dispose() + + + +studyId: String - - - - - + + + + - - - FormViewModel + + + QuestionFormRouteArgs - - - -_formData: T? - -_formMode: FormMode - -_validationSet: FormValidationSetEnum? - +delegate: IFormViewModelDelegate<FormViewModel<dynamic>>? - +autosave: bool - -_immediateFormChildrenSubscriptions: List<StreamSubscription<dynamic>> - -_immediateFormChildrenListenerDebouncer: Debouncer? - -_autosaveOperation: CancelableOperation<dynamic>? - -_defaultControlValidators: Map<String, Tuple<List<Validator<dynamic>>, List<AsyncValidator<dynamic>>>> - +prevFormValue: Map<String, dynamic>? - <static>-_formKey: String - +formData: T? - +formMode: FormMode - +isReadonly: bool - +validationSet: FormValidationSetEnum? - +isDirty: bool - +title: String - +isValid: bool - +titles: Map<FormMode, String> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + + + +questionId: String - - - -dynamic _setFormData() - -dynamic _rememberDefaultControlValidators() - -Tuple<List<Validator<dynamic>>, List<AsyncValidator<dynamic>>>? _getDefaultValidators() - -dynamic _disableAllControls() - -dynamic _formModeUpdated() - -dynamic _restoreControlsFromFormData() - +void revalidate() - -void _applyValidationSet() - +void read() - +dynamic save() - +dynamic cancel() - +void enableAutosave() - +void listenToImmediateFormChildren() - +dynamic markFormGroupChanged() - +void dispose() - +void setControlsFrom() - +T buildFormData() - +void initControls() + + + + + + + + ScreenerQuestionFormRouteArgs - - - - + + + + - - - StudyRecruitScreen + + + ConsentItemFormRouteArgs - - - +Widget build() - -Widget _inviteCodesSectionHeader() - -Widget _newInviteCodeButton() - -dynamic _onSelectInvite() + + + +consentId: String - - - - + + + + - - - StudyDesignReportsFormView + + + MeasurementFormRouteArgs - - - +Widget build() - -dynamic _showReportItemSidesheetWithArgs() + + + +measurementId: String - - - - + + + + - - - StudyDesignPageWidget + + + SurveyQuestionFormRouteArgs - - - +Widget? banner() + + + +questionId: String - - - - - - - - - ReportBadge - - + + + + - - - +status: ReportStatus? - +type: BadgeType - +showPrefixIcon: bool - +showTooltip: bool + + + InterventionFormRouteArgs - - - +Widget build() + + + +interventionId: String - - - - + + + + - - - ReportStatus + + + InterventionTaskFormRouteArgs - - - +index: int - <static>+values: List<ReportStatus> - <static>+primary: ReportStatus - <static>+secondary: ReportStatus + + + +taskId: String - - - - + + + + - - - BadgeType + + + ReportItemFormRouteArgs - - - +index: int - <static>+values: List<BadgeType> - <static>+filled: BadgeType - <static>+outlined: BadgeType - <static>+outlineFill: BadgeType - <static>+plain: BadgeType + + + +sectionId: String - - - - - + + + + - - - ReportsFormViewModel + + + GoRouteParamEnum - - - +study: Study - +router: GoRouter - +reportItemDelegate: ReportFormItemDelegate - +reportItemArray: FormArray<dynamic> - +reportItemFormViewModels: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData> - +form: FormGroup - +reportItemModels: List<ReportItemFormViewModel> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titles: Map<FormMode, String> - +canTestConsent: bool + + + +String toRouteParam() + +String toShortString() - - - +void setControlsFrom() - +ReportsFormData buildFormData() - +void read() - +ReportItemFormRouteArgs buildNewReportItemFormRouteArgs() - +ReportItemFormRouteArgs buildReportItemFormRouteArgs() - +dynamic testReport() - +void onCancel() - +dynamic onSave() - +ReportItemFormViewModel provide() + + + + + + + + + PublishConfirmationDialog + + + + + + +Widget build() - - - - - + + + + + - - - ReportFormItemDelegate + + + StudyPageWidget - - - +formViewModelCollection: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData> - +owner: ReportsFormViewModel - +propagateOnSave: bool - +validationSet: dynamic + + + +studyId: String - - - +void onCancel() - +dynamic onSave() - +ReportItemFormViewModel provide() - +List<ModelAction<dynamic>> availableActions() - +void onNewItem() - +void onSelectItem() + + + +Widget? banner() - - - + + + + - - - FormArray + + + PublishSuccessDialog - - - - - - - - - - FormViewModelCollection + + + +Widget build() - - - +formViewModels: List<T> - +formArray: FormArray<dynamic> - +stagedViewModels: List<T> - +retrievableViewModels: List<T> - +formData: List<D> + + + + + + + + + PublishDialog - - - +void add() - +T remove() - +T? findWhere() - +T? removeWhere() - +bool contains() - +void stage() - +T commit() - +void reset() - +void read() + + + +Widget build() - - - - + + + + - - - IFormViewModelDelegate + + + StudyAnalyzeScreen - - - +dynamic onSave() - +void onCancel() + + + +Widget? banner() + +Widget build() - - - - + + + + - - - IProviderArgsResolver + + + StudyAnalyzeController - - - +R provide() + + + +dynamic onExport() - - - - + + + + + - - - IListActionProvider + + + StudyBaseController - - - +void onSelectItem() - +void onNewItem() + + + +studyId: String + +studyRepository: IStudyRepository + +router: GoRouter + +studySubscription: StreamSubscription<WrappedModel<Study>>? + + + + + + +dynamic subscribeStudy() + +dynamic onStudySubscriptionUpdate() + +dynamic onStudySubscriptionError() + +void dispose() - - - - - + + + + + - - - ReportsFormData + + + InviteCodeFormViewModel - - - +reportItems: List<ReportItemFormData> - +id: String + + + +study: Study + +inviteCodeRepository: IInviteCodeRepository + +codeControl: FormControl<String> + +codeControlValidationMessages: Map<String, String Function(dynamic)> + +isPreconfiguredScheduleControl: FormControl<bool> + +preconfiguredScheduleTypeControl: FormControl<PhaseSequence> + +interventionAControl: FormControl<String> + +interventionBControl: FormControl<String> + +form: FormGroup + +titles: Map<FormMode, String> + +interventionControlOptions: List<FormControlOption<String>> + +preconfiguredScheduleTypeOptions: List<FormControlOption<PhaseSequence>> + +isPreconfiguredSchedule: bool + +preconfiguredSchedule: List<String>? - - - +Study apply() - +ReportsFormData copy() + + + +void initControls() + -dynamic _uniqueInviteCode() + +void regenerateCode() + -String _generateCode() + +StudyInvite buildFormData() + +void setControlsFrom() + +dynamic save() - - - - + + + - - - IStudyFormData + + + FormControl - - - +Study apply() + + + + + + + + FormGroup - - - - - + + + + + - - - ReportItemFormViewModel + + + FormViewModel - - - <static>+defaultSectionType: ReportSectionType - +sectionIdControl: FormControl<String> - +sectionTypeControl: FormControl<ReportSectionType> - +titleControl: FormControl<String> - +descriptionControl: FormControl<String> - +sectionControl: FormControl<ReportSection> - +dataReferenceControl: FormControl<DataReferenceIdentifier<num>> - +temporalAggregationControl: FormControl<TemporalAggregationFormatted> - +improvementDirectionControl: FormControl<ImprovementDirectionFormatted> - +alphaControl: FormControl<double> - -_controlsBySectionType: Map<ReportSectionType, FormGroup> - -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - -_validationConfigsBySectionType: Map<ReportSectionType, Map<FormValidationSetEnum, List<FormControlValidation>>> - +sectionBaseControls: Map<String, AbstractControl<dynamic>> - +form: FormGroup - +sectionId: String - +sectionType: ReportSectionType - <static>+sectionTypeControlOptions: List<FormControlOption<ReportSectionType>> - <static>+temporalAggregationControlOptions: List<FormControlOption<TemporalAggregationFormatted>> - <static>+improvementDirectionControlOptions: List<FormControlOption<ImprovementDirectionFormatted>> - +titles: Map<FormMode, String> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titleRequired: dynamic - +descriptionRequired: dynamic - +dataReferenceRequired: dynamic - +aggregationRequired: dynamic - +improvementDirectionRequired: dynamic - +alphaConfidenceRequired: dynamic + + + -_formData: T? + -_formMode: FormMode + -_validationSet: FormValidationSetEnum? + +delegate: IFormViewModelDelegate<FormViewModel<dynamic>>? + +autosave: bool + -_immediateFormChildrenSubscriptions: List<StreamSubscription<dynamic>> + -_immediateFormChildrenListenerDebouncer: Debouncer? + -_autosaveOperation: CancelableOperation<dynamic>? + -_defaultControlValidators: Map<String, Tuple<List<Validator<dynamic>>, List<AsyncValidator<dynamic>>>> + +prevFormValue: Map<String, dynamic>? + <static>-_formKey: String + +formData: T? + +formMode: FormMode + +isReadonly: bool + +validationSet: FormValidationSetEnum? + +isDirty: bool + +title: String + +isValid: bool + +titles: Map<FormMode, String> + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + + + + + + -dynamic _setFormData() + -dynamic _rememberDefaultControlValidators() + -Tuple<List<Validator<dynamic>>, List<AsyncValidator<dynamic>>>? _getDefaultValidators() + -dynamic _disableAllControls() + -dynamic _formModeUpdated() + -dynamic _restoreControlsFromFormData() + +void revalidate() + -void _applyValidationSet() + +void read() + +dynamic save() + +dynamic cancel() + +void enableAutosave() + +void listenToImmediateFormChildren() + +dynamic markFormGroupChanged() + +void dispose() + +void setControlsFrom() + +T buildFormData() + +void initControls() + + + + + + + + + + + + + StudyRecruitController - - - -List<FormControlValidation> _getValidationConfig() - +ReportItemFormData buildFormData() - +ReportItemFormViewModel createDuplicate() - +dynamic onSectionTypeChanged() - -void _updateFormControls() - +void setControlsFrom() + + + +inviteCodeRepository: IInviteCodeRepository + -_invitesSubscription: StreamSubscription<List<WrappedModel<StudyInvite>>>? + + + + + + -dynamic _subscribeInvites() + +Intervention? getIntervention() + +int getParticipantCountForInvite() + +List<ModelAction<dynamic>> availableActions() + +List<ModelAction<dynamic>> availableInlineActions() + +void dispose() - - - - + + + - - - ReportSectionType + + + StreamSubscription - - - +index: int - <static>+values: List<ReportSectionType> - <static>+average: ReportSectionType - <static>+linearRegression: ReportSectionType + + + + + + + + + + EnrolledBadge + + + + + + +enrolledCount: int + + + + + + +Widget build() - - - - + + + + - - - ManagedFormViewModel + + + StudyRecruitScreen - - - +ManagedFormViewModel<T> createDuplicate() + + + +Widget build() + -Widget _inviteCodesSectionHeader() + -Widget _newInviteCodeButton() + -dynamic _onSelectInvite() - - - - - + + + + + - - - ReportItemFormData + + + InviteCodeFormView - - - +isPrimary: bool - +section: ReportSection - +id: String + + + +formViewModel: InviteCodeFormViewModel - - - <static>+dynamic fromDomainModel() - +ReportItemFormData copy() + + + +Widget build() + -List<FormTableRow> _conditionalInterventionRows() - - - + + + + - - - ReportSection + + + FormConsumerWidget + + + + + + +Widget build() - - - - - + + + + + - - - IFormData + + + StudyInvitesTable - - - +id: String + + + +invites: List<StudyInvite> + +onSelect: void Function(StudyInvite) + +getActions: List<ModelAction<dynamic>> Function(StudyInvite) + +getInlineActions: List<ModelAction<dynamic>> Function(StudyInvite) + +getIntervention: Intervention? Function(String) + +getParticipantCountForInvite: int Function(StudyInvite) - - - +IFormData copy() + + + +Widget build() + -List<Widget> _buildRow() - - - - - + + + - - - ReportItemFormView + + + void Function(StudyInvite) - - - +formViewModel: ReportItemFormViewModel - +studyId: String - +reportSectionColumnWidth: dynamic - +sectionTypeBodyBuilder: Widget Function(BuildContext) - - + + + + - - - +Widget build() - -dynamic _buildSectionText() - -dynamic _buildSectionTypeHeader() + + + List<ModelAction<dynamic>> Function(StudyInvite) - - - + + + - - - Widget Function(BuildContext) + + + Intervention? Function(String) - - - - - + + + - - - DataReferenceIdentifier + + + int Function(StudyInvite) - - - +hashCode: int + + + + + + + + + AppStatus - - - +bool ==() + + + +index: int + <static>+values: List<AppStatus> + <static>+initializing: AppStatus + <static>+initialized: AppStatus - - - + + + + + - - - DataReference + + + StudyFormScaffold - - - - - - + + + +studyId: String + +formViewModelBuilder: T Function(WidgetRef) + +formViewBuilder: Widget Function(T) + + - - - LinearRegressionSectionFormView + + + +Widget build() - - - +formViewModel: ReportItemFormViewModel - +studyId: String - +reportSectionColumnWidth: Map<int, TableColumnWidth> + + + + + + + + T Function(WidgetRef) - - - +Widget build() + + + + + + + + Widget Function(T) - + - + ConsumerWidget - - - - - + + + + + - - - DataReferenceEditor + + + InterventionsFormViewModel - - - +formControl: FormControl<DataReferenceIdentifier<T>> - +availableTasks: List<Task> - +buildReactiveDropdownField: ReactiveDropdownField<dynamic> + + + +study: Study + +router: GoRouter + +interventionsArray: FormArray<dynamic> + +interventionsCollection: FormViewModelCollection<InterventionFormViewModel, InterventionFormData> + +form: FormGroup + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +interventionsRequired: dynamic + +titles: Map<FormMode, String> + +canTestStudySchedule: bool - - - +FormTableRow buildFormTableRow() - -List<DropdownMenuItem<DataReferenceIdentifier<dynamic>>> _dataReferenceItems() + + + +void setControlsFrom() + +InterventionsFormData buildFormData() + +void read() + +List<ModelAction<dynamic>> availableActions() + +List<ModelAction<dynamic>> availablePopupActions() + +List<ModelAction<dynamic>> availableInlineActions() + +void onSelectItem() + +void onNewItem() + +InterventionFormViewModel provide() + +void onCancel() + +dynamic onSave() + +dynamic testStudySchedule() - - - + + + - - - ReactiveDropdownField + + + FormArray - - - - - - - - - TemporalAggregationFormatted - - + + + + + - - - -_value: TemporalAggregation - <static>+values: List<TemporalAggregationFormatted> - +value: TemporalAggregation - +string: String - +icon: IconData? - +hashCode: int + + + FormViewModelCollection - - - +bool ==() - +String toString() - +String toJson() - <static>+TemporalAggregationFormatted fromJson() + + + +formViewModels: List<T> + +formArray: FormArray<dynamic> + +stagedViewModels: List<T> + +retrievableViewModels: List<T> + +formData: List<D> - - - - - - - - TemporalAggregation + + + +void add() + +T remove() + +T? findWhere() + +T? removeWhere() + +bool contains() + +void stage() + +T commit() + +void reset() + +void read() - - - - - + + + + + - - - ImprovementDirectionFormatted + + + StudyScheduleControls - - - -_value: ImprovementDirection - <static>+values: List<ImprovementDirectionFormatted> - +value: ImprovementDirection - +string: String - +icon: IconData? - +hashCode: int + + + <static>+defaultScheduleType: PhaseSequence + <static>+defaultScheduleTypeSequence: String + <static>+defaultNumCycles: int + <static>+defaultPeriodLength: int + +sequenceTypeControl: FormControl<PhaseSequence> + +sequenceTypeCustomControl: FormControl<String> + +phaseDurationControl: FormControl<int> + +numCyclesControl: FormControl<int> + +includeBaselineControl: FormControl<bool> + +studyScheduleControls: Map<String, FormControl<Object>> + <static>+kNumCyclesMin: int + <static>+kNumCyclesMax: int + <static>+kPhaseDurationMin: int + <static>+kPhaseDurationMax: int + +sequenceTypeControlOptions: List<FormControlOption<PhaseSequence>> + +studyScheduleValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +numCyclesRange: dynamic + +phaseDurationRange: dynamic + +customSequenceRequired: dynamic - - - +bool ==() - +String toString() - +String toJson() - <static>+ImprovementDirectionFormatted fromJson() + + + +void setStudyScheduleControlsFrom() + +StudyScheduleFormData buildStudyScheduleFormData() + +bool isSequencingCustom() - - - + + + + - - - ImprovementDirection + + + IFormViewModelDelegate - - - - - - - - - - AverageSectionFormView + + + +dynamic onSave() + +void onCancel() - - - +formViewModel: ReportItemFormViewModel - +studyId: String - +reportSectionColumnWidth: Map<int, TableColumnWidth> + + + + + + + + + IListActionProvider - - - +Widget build() + + + +void onSelectItem() + +void onNewItem() - - - - - - - - - StudyFormViewModel - - + + + + - - - +studyDirtyCopy: Study? - +studyRepository: IStudyRepository - +authRepository: IAuthRepository - +router: GoRouter - +studyInfoFormViewModel: StudyInfoFormViewModel - +enrollmentFormViewModel: EnrollmentFormViewModel - +measurementsFormViewModel: MeasurementsFormViewModel - +reportsFormViewModel: ReportsFormViewModel - +interventionsFormViewModel: InterventionsFormViewModel - +form: FormGroup - +isStudyReadonly: bool - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titles: Map<FormMode, String> + + + IProviderArgsResolver - - - +void read() - +void setControlsFrom() - +Study buildFormData() - +void dispose() - +void onCancel() - +dynamic onSave() - -dynamic _applyAndSaveSubform() + + + +R provide() - - - - - - - - - StudyInfoFormViewModel - - + + + + - - - +study: Study - +titleControl: FormControl<String> - +iconControl: FormControl<IconOption> - +descriptionControl: FormControl<String> - +organizationControl: FormControl<String> - +reviewBoardControl: FormControl<String> - +reviewBoardNumberControl: FormControl<String> - +researchersControl: FormControl<String> - +emailControl: FormControl<String> - +websiteControl: FormControl<String> - +phoneControl: FormControl<String> - +additionalInfoControl: FormControl<String> - +form: FormGroup - +titles: Map<FormMode, String> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titleRequired: dynamic - +descriptionRequired: dynamic - +iconRequired: dynamic - +organizationRequired: dynamic - +reviewBoardRequired: dynamic - +reviewBoardNumberRequired: dynamic - +researchersRequired: dynamic - +emailRequired: dynamic - +phoneRequired: dynamic - +emailFormat: dynamic - +websiteFormat: dynamic + + + InterventionTaskFormView - - - +void setControlsFrom() - +StudyInfoFormData buildFormData() + + + +formViewModel: InterventionTaskFormViewModel - - - - - - - - - EnrollmentFormViewModel - - + + + + + - - - +study: Study - +router: GoRouter - +consentItemDelegate: EnrollmentFormConsentItemDelegate - +enrollmentTypeControl: FormControl<Participation> - +consentItemArray: FormArray<dynamic> - +consentItemFormViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData> - +form: FormGroup - +enrollmentTypeControlOptions: List<FormControlOption<Participation>> - +consentItemModels: List<ConsentItemFormViewModel> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titles: Map<FormMode, String> - +canTestScreener: bool - +canTestConsent: bool - +questionTitles: Map<FormMode, String Function()> + + + InterventionTaskFormViewModel - - - +void setControlsFrom() - +EnrollmentFormData buildFormData() - +void read() - +List<ModelAction<dynamic>> availableActions() - +List<ModelAction<dynamic>> availablePopupActions() - +List<ModelAction<dynamic>> availableInlineActions() - +void onSelectItem() - +void onNewItem() - +ScreenerQuestionFormRouteArgs buildNewScreenerQuestionFormRouteArgs() - +ScreenerQuestionFormRouteArgs buildScreenerQuestionFormRouteArgs() - +ConsentItemFormRouteArgs buildNewConsentItemFormRouteArgs() - +ConsentItemFormRouteArgs buildConsentItemFormRouteArgs() - +dynamic testScreener() - +dynamic testConsent() - +ScreenerQuestionFormViewModel provideQuestionFormViewModel() + + + +taskIdControl: FormControl<String> + +instanceIdControl: FormControl<String> + +taskTitleControl: FormControl<String> + +taskDescriptionControl: FormControl<String> + +markAsCompletedControl: FormControl<bool> + +form: FormGroup + +taskId: String + +instanceId: String + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titleRequired: dynamic + +titles: Map<FormMode, String> + + + + + + +void setControlsFrom() + +InterventionTaskFormData buildFormData() + +InterventionTaskFormViewModel createDuplicate() - - - - - + + + + + - - - MeasurementsFormViewModel + + + InterventionPreview - - - +study: Study - +router: GoRouter - +measurementsArray: FormArray<dynamic> - +surveyMeasurementFormViewModels: FormViewModelCollection<MeasurementSurveyFormViewModel, MeasurementSurveyFormData> - +form: FormGroup - +measurementViewModels: List<MeasurementSurveyFormViewModel> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +measurementRequired: dynamic - +titles: Map<FormMode, String> + + + +routeArgs: InterventionFormRouteArgs - - - +void read() - +void setControlsFrom() - +MeasurementsFormData buildFormData() - +List<ModelAction<dynamic>> availableActions() - +List<ModelAction<dynamic>> availablePopupActions() - +List<ModelAction<dynamic>> availableInlineActions() - +void onSelectItem() - +void onNewItem() - +MeasurementSurveyFormViewModel provide() - +void onCancel() - +dynamic onSave() + + + +Widget build() - - - - - + + + + + - - - InterventionsFormViewModel + + + StudyScheduleFormView - - - +study: Study - +router: GoRouter - +interventionsArray: FormArray<dynamic> - +interventionsCollection: FormViewModelCollection<InterventionFormViewModel, InterventionFormData> - +form: FormGroup - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +interventionsRequired: dynamic - +titles: Map<FormMode, String> - +canTestStudySchedule: bool + + + +formViewModel: StudyScheduleControls - - - +void setControlsFrom() - +InterventionsFormData buildFormData() - +void read() - +List<ModelAction<dynamic>> availableActions() - +List<ModelAction<dynamic>> availablePopupActions() - +List<ModelAction<dynamic>> availableInlineActions() - +void onSelectItem() - +void onNewItem() - +InterventionFormViewModel provide() - +void onCancel() - +dynamic onSave() - +dynamic testStudySchedule() + + + -FormTableRow _renderCustomSequence() + +Widget build() - - - - + + + + - - - StudyDesignInfoFormView + + + InterventionFormView - - - +Widget build() + + + +formViewModel: InterventionFormViewModel - - - - - + + + + + - - - StudyInfoFormData + + + InterventionFormViewModel - - - +title: String - +description: String? - +iconName: String - +contactInfoFormData: StudyContactInfoFormData - +id: String + + + +study: Study + +interventionIdControl: FormControl<String> + +interventionTitleControl: FormControl<String> + +interventionIconControl: FormControl<IconOption> + +interventionDescriptionControl: FormControl<String> + +interventionTasksArray: FormArray<dynamic> + +tasksCollection: FormViewModelCollection<InterventionTaskFormViewModel, InterventionTaskFormData> + +form: FormGroup + +interventionId: String + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titleRequired: dynamic + +atLeastOneTask: dynamic + +breadcrumbsTitle: String + +titles: Map<FormMode, String> - - - +Study apply() - +StudyInfoFormData copy() + + + +void setControlsFrom() + +InterventionFormData buildFormData() + +List<ModelAction<dynamic>> availableActions() + +List<ModelAction<dynamic>> availablePopupActions() + +List<ModelAction<dynamic>> availableInlineActions() + +void onSelectItem() + +void onNewItem() + +void onCancel() + +dynamic onSave() + +InterventionTaskFormViewModel provide() + +InterventionTaskFormRouteArgs buildNewFormRouteArgs() + +InterventionTaskFormRouteArgs buildFormRouteArgs() + +InterventionFormViewModel createDuplicate() - - - - - + + + + + - - - StudyContactInfoFormData + + + InterventionFormData - - - +organization: String? - +institutionalReviewBoard: String? - +institutionalReviewBoardNumber: String? - +researchers: String? - +email: String? - +website: String? - +phone: String? - +additionalInfo: String? - +id: String + + + +interventionId: String + +title: String + +description: String? + +tasksData: List<InterventionTaskFormData>? + +iconName: String? + <static>+kDefaultTitle: String + +id: String - - - +Study apply() - +StudyInfoFormData copy() + + + +Intervention toIntervention() + +InterventionFormData copy() - - - - - + + + + + - - - MeasurementsFormData + + + IFormData - - - +surveyMeasurements: List<MeasurementSurveyFormData> - +id: String + + + +id: String - - - +Study apply() - +MeasurementsFormData copy() + + + +IFormData copy() - - - - + + + + + - - - StudyDesignMeasurementsFormView + + + StudyScheduleFormData - - - +Widget build() + + + +sequenceType: PhaseSequence + +sequenceTypeCustom: String + +numCycles: int + +phaseDuration: int + +includeBaseline: bool + +id: String + + + + + + +StudySchedule toStudySchedule() + +Study apply() + +StudyScheduleFormData copy() - - - - - + + + - - - MeasurementSurveyFormViewModel + + + PhaseSequence - - - +study: Study - +measurementIdControl: FormControl<String> - +instanceIdControl: FormControl<String> - +surveyTitleControl: FormControl<String> - +surveyIntroTextControl: FormControl<String> - +surveyOutroTextControl: FormControl<String> - +form: FormGroup - +measurementId: String - +instanceId: String - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titleRequired: dynamic - +atLeastOneQuestion: dynamic - +breadcrumbsTitle: String - +titles: Map<FormMode, String> + + + + + + + + + IStudyFormData - - - +void setControlsFrom() - +MeasurementSurveyFormData buildFormData() - +List<ModelAction<dynamic>> availableActions() - +List<ModelAction<dynamic>> availablePopupActions() - +List<ModelAction<dynamic>> availableInlineActions() - +void onSelectItem() - +void onNewItem() - +SurveyQuestionFormRouteArgs buildNewFormRouteArgs() - +SurveyQuestionFormRouteArgs buildFormRouteArgs() - +MeasurementSurveyFormViewModel createDuplicate() + + + +Study apply() - - - - - - - - - WithQuestionnaireControls - - + + + + - - - +questionsArray: FormArray<dynamic> - +questionFormViewModels: FormViewModelCollection<Q, QuestionFormData> - +questionnaireControls: Map<String, FormArray<dynamic>> - +propagateOnSave: bool - +questionModels: List<Q> - +questionTitles: Map<FormMode, String Function()> + + + ManagedFormViewModel - - - +void setQuestionnaireControlsFrom() - +QuestionnaireFormData buildQuestionnaireFormData() - +void read() - +void onCancel() - +dynamic onSave() - +Q provide() - +Q provideQuestionFormViewModel() + + + +ManagedFormViewModel<T> createDuplicate() - - - + + + - + WithScheduleControls - + +isTimeRestrictedControl: FormControl<bool> +instanceID: FormControl<String> @@ -10344,7 +9560,7 @@ - + +void setScheduleControlsFrom() -dynamic _initReminderControl() @@ -10352,97 +9568,113 @@ - - - - + + + + + - - - MeasurementSurveyFormView + + + InterventionsFormData - - - +formViewModel: MeasurementSurveyFormViewModel + + + +interventionsData: List<InterventionFormData> + +studyScheduleData: StudyScheduleFormData + +id: String + + + + + + +Study apply() + +InterventionsFormData copy() - - - - - + + + + - - - MeasurementSurveyFormData + + + StudyDesignInterventionsFormView - - - +measurementId: String - +title: String - +introText: String? - +outroText: String? - +questionnaireFormData: QuestionnaireFormData - <static>+kDefaultTitle: String - +id: String + + + +Widget build() - - - +QuestionnaireTask toQuestionnaireTask() - +MeasurementSurveyFormData copy() + + + + + + + + + StudyDesignPageWidget + + + + + + +Widget? banner() - - - - - + + + + + - - - QuestionnaireFormData + + + InterventionTaskFormData - - - +questionsData: List<QuestionFormData>? - +id: String + + + +taskId: String + +taskTitle: String + +taskDescription: String? + <static>+kDefaultTitle: String + +id: String - - - +StudyUQuestionnaire toQuestionnaire() - +List<EligibilityCriterion> toEligibilityCriteria() - +QuestionnaireFormData copy() + + + +CheckmarkTask toTask() + +InterventionTaskFormData copy() - - - + + + - + IFormDataWithSchedule - + +instanceId: String +isTimeLocked: bool @@ -10453,574 +9685,777 @@ - + +Schedule toSchedule() - - - - - + + + + + - - - SurveyPreview + + + ReportBadge - - - +routeArgs: MeasurementFormRouteArgs + + + +status: ReportStatus? + +type: BadgeType + +showPrefixIcon: bool + +showTooltip: bool - - - +Widget build() + + + +Widget build() + + + + + + + + + + + + ReportStatus + + + + + + +index: int + <static>+values: List<ReportStatus> + <static>+primary: ReportStatus + <static>+secondary: ReportStatus + + + + + + + + + + + + BadgeType + + + + + + +index: int + <static>+values: List<BadgeType> + <static>+filled: BadgeType + <static>+outlined: BadgeType + <static>+outlineFill: BadgeType + <static>+plain: BadgeType + + + + + + + + + + + + + ReportsFormViewModel + + + + + + +study: Study + +router: GoRouter + +reportItemDelegate: ReportFormItemDelegate + +reportItemArray: FormArray<dynamic> + +reportItemFormViewModels: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData> + +form: FormGroup + +reportItemModels: List<ReportItemFormViewModel> + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titles: Map<FormMode, String> + +canTestConsent: bool + + + + + + +void setControlsFrom() + +ReportsFormData buildFormData() + +void read() + +ReportItemFormRouteArgs buildNewReportItemFormRouteArgs() + +ReportItemFormRouteArgs buildReportItemFormRouteArgs() + +dynamic testReport() + +void onCancel() + +dynamic onSave() + +ReportItemFormViewModel provide() + + + + + + + + + + + + + ReportFormItemDelegate + + + + + + +formViewModelCollection: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData> + +owner: ReportsFormViewModel + +propagateOnSave: bool + +validationSet: dynamic + + + + + + +void onCancel() + +dynamic onSave() + +ReportItemFormViewModel provide() + +List<ModelAction<dynamic>> availableActions() + +void onNewItem() + +void onSelectItem() + + + + + + + + + + + + StudyDesignReportsFormView + + + + + + +Widget build() + -dynamic _showReportItemSidesheetWithArgs() + + + + + + + + + + + + + ReportsFormData + + + + + + +reportItems: List<ReportItemFormData> + +id: String + + + + + + +Study apply() + +ReportsFormData copy() - - - - + + + + + - - - MeasurementFormRouteArgs + + + ReportItemFormViewModel - - - +measurementId: String + + + <static>+defaultSectionType: ReportSectionType + +sectionIdControl: FormControl<String> + +sectionTypeControl: FormControl<ReportSectionType> + +titleControl: FormControl<String> + +descriptionControl: FormControl<String> + +sectionControl: FormControl<ReportSection> + +dataReferenceControl: FormControl<DataReferenceIdentifier<num>> + +temporalAggregationControl: FormControl<TemporalAggregationFormatted> + +improvementDirectionControl: FormControl<ImprovementDirectionFormatted> + +alphaControl: FormControl<double> + -_controlsBySectionType: Map<ReportSectionType, FormGroup> + -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + -_validationConfigsBySectionType: Map<ReportSectionType, Map<FormValidationSetEnum, List<FormControlValidation>>> + +sectionBaseControls: Map<String, AbstractControl<dynamic>> + +form: FormGroup + +sectionId: String + +sectionType: ReportSectionType + <static>+sectionTypeControlOptions: List<FormControlOption<ReportSectionType>> + <static>+temporalAggregationControlOptions: List<FormControlOption<TemporalAggregationFormatted>> + <static>+improvementDirectionControlOptions: List<FormControlOption<ImprovementDirectionFormatted>> + +titles: Map<FormMode, String> + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titleRequired: dynamic + +descriptionRequired: dynamic + +dataReferenceRequired: dynamic + +aggregationRequired: dynamic + +improvementDirectionRequired: dynamic + +alphaConfidenceRequired: dynamic + + + + + + -List<FormControlValidation> _getValidationConfig() + +ReportItemFormData buildFormData() + +ReportItemFormViewModel createDuplicate() + +dynamic onSectionTypeChanged() + -void _updateFormControls() + +void setControlsFrom() - - - - + + + + - - - InterventionTaskFormView + + + ReportSectionType - - - +formViewModel: InterventionTaskFormViewModel + + + +index: int + <static>+values: List<ReportSectionType> + <static>+average: ReportSectionType + <static>+linearRegression: ReportSectionType - - - - - + + + + + - - - InterventionTaskFormViewModel + + + ReportItemFormData - - - +taskIdControl: FormControl<String> - +instanceIdControl: FormControl<String> - +taskTitleControl: FormControl<String> - +taskDescriptionControl: FormControl<String> - +markAsCompletedControl: FormControl<bool> - +form: FormGroup - +taskId: String - +instanceId: String - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titleRequired: dynamic - +titles: Map<FormMode, String> + + + +isPrimary: bool + +section: ReportSection + +id: String - - - +void setControlsFrom() - +InterventionTaskFormData buildFormData() - +InterventionTaskFormViewModel createDuplicate() + + + <static>+dynamic fromDomainModel() + +ReportItemFormData copy() - - - - - - - - - InterventionFormData - - - - - - +interventionId: String - +title: String - +description: String? - +tasksData: List<InterventionTaskFormData>? - +iconName: String? - <static>+kDefaultTitle: String - +id: String - - + + + - - - +Intervention toIntervention() - +InterventionFormData copy() + + + ReportSection - - - - - + + + + + - - - StudyScheduleFormData + + + ReportItemFormView - - - +sequenceType: PhaseSequence - +sequenceTypeCustom: String - +numCycles: int - +phaseDuration: int - +includeBaseline: bool - +id: String + + + +formViewModel: ReportItemFormViewModel + +studyId: String + +reportSectionColumnWidth: dynamic + +sectionTypeBodyBuilder: Widget Function(BuildContext) - - - +StudySchedule toStudySchedule() - +Study apply() - +StudyScheduleFormData copy() + + + +Widget build() + -dynamic _buildSectionText() + -dynamic _buildSectionTypeHeader() - - - + + + - - - PhaseSequence + + + Widget Function(BuildContext) - - - - + + + + + - - - InterventionFormView + + + TemporalAggregationFormatted - - - +formViewModel: InterventionFormViewModel + + + -_value: TemporalAggregation + <static>+values: List<TemporalAggregationFormatted> + +value: TemporalAggregation + +string: String + +icon: IconData? + +hashCode: int - - - - - - - - - - InterventionFormViewModel + + + +bool ==() + +String toString() + +String toJson() + <static>+TemporalAggregationFormatted fromJson() - - - +study: Study - +interventionIdControl: FormControl<String> - +interventionTitleControl: FormControl<String> - +interventionIconControl: FormControl<IconOption> - +interventionDescriptionControl: FormControl<String> - +interventionTasksArray: FormArray<dynamic> - +tasksCollection: FormViewModelCollection<InterventionTaskFormViewModel, InterventionTaskFormData> - +form: FormGroup - +interventionId: String - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titleRequired: dynamic - +atLeastOneTask: dynamic - +breadcrumbsTitle: String - +titles: Map<FormMode, String> - - + + + + - - - +void setControlsFrom() - +InterventionFormData buildFormData() - +List<ModelAction<dynamic>> availableActions() - +List<ModelAction<dynamic>> availablePopupActions() - +List<ModelAction<dynamic>> availableInlineActions() - +void onSelectItem() - +void onNewItem() - +void onCancel() - +dynamic onSave() - +InterventionTaskFormViewModel provide() - +InterventionTaskFormRouteArgs buildNewFormRouteArgs() - +InterventionTaskFormRouteArgs buildFormRouteArgs() - +InterventionFormViewModel createDuplicate() + + + TemporalAggregation - - - - - + + + - - - StudyScheduleControls + + + IconData - - - <static>+defaultScheduleType: PhaseSequence - <static>+defaultScheduleTypeSequence: String - <static>+defaultNumCycles: int - <static>+defaultPeriodLength: int - +sequenceTypeControl: FormControl<PhaseSequence> - +sequenceTypeCustomControl: FormControl<String> - +phaseDurationControl: FormControl<int> - +numCyclesControl: FormControl<int> - +includeBaselineControl: FormControl<bool> - +studyScheduleControls: Map<String, FormControl<Object>> - <static>+kNumCyclesMin: int - <static>+kNumCyclesMax: int - <static>+kPhaseDurationMin: int - <static>+kPhaseDurationMax: int - +sequenceTypeControlOptions: List<FormControlOption<PhaseSequence>> - +studyScheduleValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +numCyclesRange: dynamic - +phaseDurationRange: dynamic - +customSequenceRequired: dynamic + + + + + + + + + + ImprovementDirectionFormatted - - - +void setStudyScheduleControlsFrom() - +StudyScheduleFormData buildStudyScheduleFormData() - +bool isSequencingCustom() + + + -_value: ImprovementDirection + <static>+values: List<ImprovementDirectionFormatted> + +value: ImprovementDirection + +string: String + +icon: IconData? + +hashCode: int + + + + + + +bool ==() + +String toString() + +String toJson() + <static>+ImprovementDirectionFormatted fromJson() - - - - - + + + - - - InterventionTaskFormData + + + ImprovementDirection - - - +taskId: String - +taskTitle: String - +taskDescription: String? - <static>+kDefaultTitle: String - +id: String + + + + + + + + + + DataReferenceIdentifier - - - +CheckmarkTask toTask() - +InterventionTaskFormData copy() + + + +hashCode: int + + + + + + +bool ==() - - - - - + + + - - - InterventionsFormData + + + DataReference - - - +interventionsData: List<InterventionFormData> - +studyScheduleData: StudyScheduleFormData - +id: String + + + + + + + + + + LinearRegressionSectionFormView - - - +Study apply() - +InterventionsFormData copy() + + + +formViewModel: ReportItemFormViewModel + +studyId: String + +reportSectionColumnWidth: Map<int, TableColumnWidth> + + + + + + +Widget build() - - - - - + + + + + - - - InterventionPreview + + + DataReferenceEditor - - - +routeArgs: InterventionFormRouteArgs + + + +formControl: FormControl<DataReferenceIdentifier<T>> + +availableTasks: List<Task> + +buildReactiveDropdownField: ReactiveDropdownField<dynamic> - - - +Widget build() + + + +FormTableRow buildFormTableRow() + -List<DropdownMenuItem<DataReferenceIdentifier<dynamic>>> _dataReferenceItems() - - - - - - - - InterventionFormRouteArgs - - + + + - - - +interventionId: String + + + ReactiveDropdownField - - - - - + + + + + - - - StudyScheduleFormView + + + AverageSectionFormView - - - +formViewModel: StudyScheduleControls + + + +formViewModel: ReportItemFormViewModel + +studyId: String + +reportSectionColumnWidth: Map<int, TableColumnWidth> - - - -FormTableRow _renderCustomSequence() - +Widget build() + + + +Widget build() - - - - + + + + + - - - StudyDesignInterventionsFormView + + + StudyInfoFormData - - - +Widget build() + + + +title: String + +description: String? + +iconName: String + +contactInfoFormData: StudyContactInfoFormData + +id: String + + + + + + +Study apply() + +StudyInfoFormData copy() - - - - + + + + + - - - ConsentItemFormView + + + StudyContactInfoFormData - - - +formViewModel: ConsentItemFormViewModel + + + +organization: String? + +institutionalReviewBoard: String? + +institutionalReviewBoardNumber: String? + +researchers: String? + +email: String? + +website: String? + +phone: String? + +additionalInfo: String? + +id: String + + + + + + +Study apply() + +StudyInfoFormData copy() - - - - - + + + + + - - - ConsentItemFormViewModel + + + StudyInfoFormViewModel - - - +consentIdControl: FormControl<String> - +titleControl: FormControl<String> - +descriptionControl: FormControl<String> - +iconControl: FormControl<IconOption> - +form: FormGroup - +consentId: String - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titleRequired: dynamic - +descriptionRequired: dynamic - +titles: Map<FormMode, String> + + + +study: Study + +titleControl: FormControl<String> + +iconControl: FormControl<IconOption> + +descriptionControl: FormControl<String> + +organizationControl: FormControl<String> + +reviewBoardControl: FormControl<String> + +reviewBoardNumberControl: FormControl<String> + +researchersControl: FormControl<String> + +emailControl: FormControl<String> + +websiteControl: FormControl<String> + +phoneControl: FormControl<String> + +additionalInfoControl: FormControl<String> + +form: FormGroup + +titles: Map<FormMode, String> + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titleRequired: dynamic + +descriptionRequired: dynamic + +iconRequired: dynamic + +organizationRequired: dynamic + +reviewBoardRequired: dynamic + +reviewBoardNumberRequired: dynamic + +researchersRequired: dynamic + +emailRequired: dynamic + +phoneRequired: dynamic + +emailFormat: dynamic + +websiteFormat: dynamic - - - +void setControlsFrom() - +ConsentItemFormData buildFormData() - +ConsentItemFormViewModel createDuplicate() + + + +void setControlsFrom() + +StudyInfoFormData buildFormData() - - - - - + + + + - - - ConsentItemFormData + + + StudyDesignInfoFormView - - - +consentId: String - +title: String - +description: String - +iconName: String? - +id: String + + + +Widget build() - - - +ConsentItem toConsentItem() - +ConsentItemFormData copy() + + + + + + + + + StudyFormValidationSet - - - - - - - - - - EnrollmentFormConsentItemDelegate + + + +index: int + <static>+values: List<StudyFormValidationSet> - - - +formViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData> - +owner: EnrollmentFormViewModel - +propagateOnSave: bool - +validationSet: dynamic + + + + + + + + + StudyDesignEnrollmentFormView - - - +void onCancel() - +dynamic onSave() - +ConsentItemFormViewModel provide() - +List<ModelAction<dynamic>> availableActions() - +void onNewItem() - +void onSelectItem() + + + +Widget build() + -dynamic _showScreenerQuestionSidesheetWithArgs() + -dynamic _showConsentItemSidesheetWithArgs() - - - + + + - + EnrollmentFormData - + <static>+kDefaultEnrollmentType: Participation +enrollmentType: Participation @@ -11030,7 +10465,7 @@ - + +Study apply() +EnrollmentFormData copy() @@ -11040,74 +10475,92 @@ - + - + Participation - - - - + + + + + - - - IScreenerQuestionLogicFormViewModel + + + QuestionnaireFormData - - - +isDirtyOptionsBannerVisible: bool + + + +questionsData: List<QuestionFormData>? + +id: String + + + + + + +StudyUQuestionnaire toQuestionnaire() + +List<EligibilityCriterion> toEligibilityCriteria() + +QuestionnaireFormData copy() - - - - - + + + + + - - - ScreenerQuestionLogicFormView + + + ConsentItemFormViewModel - - - +formViewModel: ScreenerQuestionFormViewModel + + + +consentIdControl: FormControl<String> + +titleControl: FormControl<String> + +descriptionControl: FormControl<String> + +iconControl: FormControl<IconOption> + +form: FormGroup + +consentId: String + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titleRequired: dynamic + +descriptionRequired: dynamic + +titles: Map<FormMode, String> - - - +Widget build() - -dynamic _buildInfoBanner() - -dynamic _buildAnswerOptionsLogicControls() - -List<Widget> _buildOptionLogicRow() + + + +void setControlsFrom() + +ConsentItemFormData buildFormData() + +ConsentItemFormViewModel createDuplicate() - - - + + + - + ScreenerQuestionFormViewModel - + <static>+defaultResponseOptionValidity: bool +responseOptionsDisabledArray: FormArray<dynamic> @@ -11123,7 +10576,7 @@ - + +dynamic onResponseOptionsChanged() +void setControlsFrom() @@ -11138,17 +10591,17 @@ - - - + + + - + QuestionFormViewModel - + <static>+defaultQuestionType: SurveyQuestionType -_titles: Map<FormMode, String Function()>? @@ -11203,7 +10656,7 @@ - + +String? scaleMidLabelAt() -dynamic _onScaleRangeChanged() @@ -11224,38 +10677,252 @@ - - - - + + + + + + + + IScreenerQuestionLogicFormViewModel + + + + + + +isDirtyOptionsBannerVisible: bool + + + + + + + + + + + + ConsentItemFormView + + + + + + +formViewModel: ConsentItemFormViewModel + + + + + + + + + + + + + ConsentItemFormData + + + + + + +consentId: String + +title: String + +description: String + +iconName: String? + +id: String + + + + + + +ConsentItem toConsentItem() + +ConsentItemFormData copy() + + + + + + + + + + + + + ScreenerQuestionLogicFormView + + + + + + +formViewModel: ScreenerQuestionFormViewModel + + + + + + +Widget build() + -dynamic _buildInfoBanner() + -dynamic _buildAnswerOptionsLogicControls() + -List<Widget> _buildOptionLogicRow() + + + + + + + + + + + + + EnrollmentFormViewModel + + + + + + +study: Study + +router: GoRouter + +consentItemDelegate: EnrollmentFormConsentItemDelegate + +enrollmentTypeControl: FormControl<Participation> + +consentItemArray: FormArray<dynamic> + +consentItemFormViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData> + +form: FormGroup + +enrollmentTypeControlOptions: List<FormControlOption<Participation>> + +consentItemModels: List<ConsentItemFormViewModel> + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titles: Map<FormMode, String> + +canTestScreener: bool + +canTestConsent: bool + +questionTitles: Map<FormMode, String Function()> + + + + + + +void setControlsFrom() + +EnrollmentFormData buildFormData() + +void read() + +List<ModelAction<dynamic>> availableActions() + +List<ModelAction<dynamic>> availablePopupActions() + +List<ModelAction<dynamic>> availableInlineActions() + +void onSelectItem() + +void onNewItem() + +ScreenerQuestionFormRouteArgs buildNewScreenerQuestionFormRouteArgs() + +ScreenerQuestionFormRouteArgs buildScreenerQuestionFormRouteArgs() + +ConsentItemFormRouteArgs buildNewConsentItemFormRouteArgs() + +ConsentItemFormRouteArgs buildConsentItemFormRouteArgs() + +dynamic testScreener() + +dynamic testConsent() + +ScreenerQuestionFormViewModel provideQuestionFormViewModel() + + + + + + + + + + + + + EnrollmentFormConsentItemDelegate + + + + + + +formViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData> + +owner: EnrollmentFormViewModel + +propagateOnSave: bool + +validationSet: dynamic + + + + + + +void onCancel() + +dynamic onSave() + +ConsentItemFormViewModel provide() + +List<ModelAction<dynamic>> availableActions() + +void onNewItem() + +void onSelectItem() + + + + + + + + + + + + + WithQuestionnaireControls + + + + + + +questionsArray: FormArray<dynamic> + +questionFormViewModels: FormViewModelCollection<Q, QuestionFormData> + +questionnaireControls: Map<String, FormArray<dynamic>> + +propagateOnSave: bool + +questionModels: List<Q> + +questionTitles: Map<FormMode, String Function()> + + + + + + +void setQuestionnaireControlsFrom() + +QuestionnaireFormData buildQuestionnaireFormData() + +void read() + +void onCancel() + +dynamic onSave() + +Q provide() + +Q provideQuestionFormViewModel() + + + + + + + + - - - StudyDesignEnrollmentFormView + + + SurveyQuestionFormView - - - +Widget build() - -dynamic _showScreenerQuestionSidesheetWithArgs() - -dynamic _showConsentItemSidesheetWithArgs() + + + +formViewModel: QuestionFormViewModel + +isHtmlStyleable: bool - - + + - + SurveyQuestionType - + +index: int <static>+values: List<SurveyQuestionType> @@ -11266,38 +10933,19 @@ - - - - - - - - SurveyQuestionFormView - - - - - - +formViewModel: QuestionFormViewModel - +isHtmlStyleable: bool - - - - - - - + + + - + QuestionFormData - + <static>+questionTypeFormDataFactories: Map<SurveyQuestionType, QuestionFormData Function(Question<dynamic>, List<EligibilityCriterion>)> +questionId: String @@ -11310,7 +10958,7 @@ - + +Question<dynamic> toQuestion() +EligibilityCriterion toEligibilityCriterion() @@ -11323,17 +10971,17 @@ - - - + + + - + ChoiceQuestionFormData - + +isMultipleChoice: bool +answerOptions: List<String> @@ -11341,7 +10989,7 @@ - + +Question<dynamic> toQuestion() +QuestionFormData copy() @@ -11353,24 +11001,24 @@ - - - + + + - + BoolQuestionFormData - + <static>+kResponseOptions: Map<String, bool> +responseOptions: List<String> - + +Question<dynamic> toQuestion() +BoolQuestionFormData copy() @@ -11381,17 +11029,17 @@ - - - + + + - + ScaleQuestionFormData - + +minValue: double +maxValue: double @@ -11408,2855 +11056,3208 @@ - - - +ScaleQuestion toQuestion() - +QuestionFormData copy() - +Answer<dynamic> constructAnswerFor() + + + +ScaleQuestion toQuestion() + +QuestionFormData copy() + +Answer<dynamic> constructAnswerFor() + + + + + + + + + + + + IScaleQuestionFormViewModel + + + + + + +isMidValuesClearedInfoVisible: bool + + + + + + + + + + + + ScaleQuestionFormView + + + + + + +formViewModel: QuestionFormViewModel + + + + + + + + + + + + + BoolQuestionFormView + + + + + + +formViewModel: QuestionFormViewModel + + + + + + +Widget build() + + + + + + + + + + + + + ChoiceQuestionFormView + + + + + + +formViewModel: QuestionFormViewModel + + + + + + +Widget build() + + + + + + + + + + + + + ScheduleControls + + + + + + +formViewModel: WithScheduleControls + + + + + + +Widget build() + -List<FormTableRow> _conditionalTimeRestrictions() + + + + + + + + + + + StudyUTimeOfDay + + + + + + + + + + + + + StudyFormViewModel + + + + + + +studyDirtyCopy: Study? + +studyRepository: IStudyRepository + +authRepository: IAuthRepository + +router: GoRouter + +studyInfoFormViewModel: StudyInfoFormViewModel + +enrollmentFormViewModel: EnrollmentFormViewModel + +measurementsFormViewModel: MeasurementsFormViewModel + +reportsFormViewModel: ReportsFormViewModel + +interventionsFormViewModel: InterventionsFormViewModel + +form: FormGroup + +isStudyReadonly: bool + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titles: Map<FormMode, String> + + + + + + +void read() + +void setControlsFrom() + +Study buildFormData() + +void dispose() + +void onCancel() + +dynamic onSave() + -dynamic _applyAndSaveSubform() + + + + + + + + + + + + + MeasurementsFormViewModel + + + + + + +study: Study + +router: GoRouter + +measurementsArray: FormArray<dynamic> + +surveyMeasurementFormViewModels: FormViewModelCollection<MeasurementSurveyFormViewModel, MeasurementSurveyFormData> + +form: FormGroup + +measurementViewModels: List<MeasurementSurveyFormViewModel> + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +measurementRequired: dynamic + +titles: Map<FormMode, String> + + + + + + +void read() + +void setControlsFrom() + +MeasurementsFormData buildFormData() + +List<ModelAction<dynamic>> availableActions() + +List<ModelAction<dynamic>> availablePopupActions() + +List<ModelAction<dynamic>> availableInlineActions() + +void onSelectItem() + +void onNewItem() + +MeasurementSurveyFormViewModel provide() + +void onCancel() + +dynamic onSave() + + + + + + + + + + + + + MeasurementSurveyFormData + + + + + + +measurementId: String + +title: String + +introText: String? + +outroText: String? + +questionnaireFormData: QuestionnaireFormData + <static>+kDefaultTitle: String + +id: String + + + + + + +QuestionnaireTask toQuestionnaireTask() + +MeasurementSurveyFormData copy() + + + + + + + + + + + + + MeasurementSurveyFormViewModel + + + + + + +study: Study + +measurementIdControl: FormControl<String> + +instanceIdControl: FormControl<String> + +surveyTitleControl: FormControl<String> + +surveyIntroTextControl: FormControl<String> + +surveyOutroTextControl: FormControl<String> + +form: FormGroup + +measurementId: String + +instanceId: String + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titleRequired: dynamic + +atLeastOneQuestion: dynamic + +breadcrumbsTitle: String + +titles: Map<FormMode, String> + + + + + + +void setControlsFrom() + +MeasurementSurveyFormData buildFormData() + +List<ModelAction<dynamic>> availableActions() + +List<ModelAction<dynamic>> availablePopupActions() + +List<ModelAction<dynamic>> availableInlineActions() + +void onSelectItem() + +void onNewItem() + +SurveyQuestionFormRouteArgs buildNewFormRouteArgs() + +SurveyQuestionFormRouteArgs buildFormRouteArgs() + +MeasurementSurveyFormViewModel createDuplicate() - - - - - + + + + + - - - ChoiceQuestionFormView + + + SurveyPreview - - - +formViewModel: QuestionFormViewModel + + + +routeArgs: MeasurementFormRouteArgs - - - +Widget build() + + + +Widget build() - - - - + + + + - - - IScaleQuestionFormViewModel + + + MeasurementSurveyFormView - - - +isMidValuesClearedInfoVisible: bool + + + +formViewModel: MeasurementSurveyFormViewModel - - - - + + + + - - - ScaleQuestionFormView + + + StudyDesignMeasurementsFormView - - - +formViewModel: QuestionFormViewModel + + + +Widget build() - - - - - + + + + + - - - BoolQuestionFormView + + + MeasurementsFormData - - - +formViewModel: QuestionFormViewModel + + + +surveyMeasurements: List<MeasurementSurveyFormData> + +id: String - - - +Widget build() + + + +Study apply() + +MeasurementsFormData copy() - - - - - + + + + + - - - ScheduleControls + + + StudyTestScreen - - - +formViewModel: WithScheduleControls + + + +previewRoute: String? - - - +Widget build() - -List<FormTableRow> _conditionalTimeRestrictions() + + + +Widget build() + +Widget? banner() + +dynamic load() + +dynamic save() + +dynamic showHelp() - - - + + + + - - - StudyUTimeOfDay + + + StudySettingsDialog + + + + + + +Widget build() - - - - + + + + + - - - StudyFormValidationSet + + + StudySettingsFormViewModel - - - +index: int - <static>+values: List<StudyFormValidationSet> + + + +study: AsyncValue<Study> + +studyRepository: IStudyRepository + <static>+defaultPublishedToRegistry: bool + <static>+defaultPublishedToRegistryResults: bool + +isPublishedToRegistryControl: FormControl<bool> + +isPublishedToRegistryResultsControl: FormControl<bool> + +form: FormGroup + +titles: Map<FormMode, String> - - - - - - - - - - StudyFormScaffold + + + +void setControlsFrom() + +Study buildFormData() + +dynamic keepControlsSynced() + +dynamic save() + +dynamic setLaunchDefaults() - - - +studyId: String - +formViewModelBuilder: T Function(WidgetRef) - +formViewBuilder: Widget Function(T) + + + + + + + + + IStudyNavViewModel - - - +Widget build() + + + +isEditTabEnabled: bool + +isTestTabEnabled: bool + +isRecruitTabEnabled: bool + +isMonitorTabEnabled: bool + +isAnalyzeTabEnabled: bool + +isSettingsEnabled: bool - - - + + + + - - - T Function(WidgetRef) + + + StudyNav - - - - - - - - Widget Function(T) + + + <static>+dynamic tabs() + <static>+dynamic edit() + <static>+dynamic test() + <static>+dynamic recruit() + <static>+dynamic monitor() + <static>+dynamic analyze() - - - - - + + + + - - - AppController + + + StudyDesignNav - - - +sharedPreferences: SharedPreferences - +appDelegates: List<IAppDelegate> - -_delayedFuture: dynamic - +isInitialized: dynamic + + + <static>+dynamic tabs() + <static>+dynamic info() + <static>+dynamic enrollment() + <static>+dynamic interventions() + <static>+dynamic measurements() + <static>+dynamic reports() - - - +dynamic onAppStart() - -dynamic _callDelegates() + + + + + + + + + + WebFrame - - - - - - - - - StudyAnalyzeScreen + + + +previewSrc: String + +studyId: String - - - +Widget? banner() - +Widget build() + + + +Widget build() - - - - + + + + - - - StudyAnalyzeController + + + DisabledFrame - - - +dynamic onExport() + + + +Widget build() - - - - - + + + + + - - - DashboardScaffold + + + PhoneContainer - - - +body: Widget + + + <static>+defaultWidth: double + <static>+defaultHeight: double + +width: double + +height: double + +borderColor: Color + +borderWidth: double + +borderRadius: double + +innerContent: Widget + +innerContentBackgroundColor: Color? - - - +Widget build() + + + +Widget build() - - - - - + + + - - - StudiesTable + + + Widget - - - +studies: List<Study> - +onSelect: void Function(Study) - +getActions: List<ModelAction<dynamic>> Function(Study) - +emptyWidget: Widget - +pinnedStudies: Iterable<String> - +dashboardController: DashboardController - +pinnedPredicates: int Function(Study, Study) - -_sortColumns: List<int Function(Study, Study)?> + + + + + + + + + MobileFrame - - - +Widget build() - -List<Widget> _buildRow() + + + +Widget build() - - - + + + + - - - void Function(Study) + + + DesktopFrame - - - - - - - - List<ModelAction<dynamic>> Function(Study) + + + +Widget build() - - - - - + + + + + - - - DashboardController + + + StudyParticipationBadge - - - +studyRepository: IStudyRepository - +authRepository: IAuthRepository - +userRepository: IUserRepository - +router: GoRouter - -_studiesSubscription: StreamSubscription<List<WrappedModel<Study>>>? - +searchController: SearchController + + + +participation: Participation + +type: BadgeType + +showPrefixIcon: bool - - - -dynamic _subscribeStudies() - +dynamic setSearchText() - +dynamic setStudiesFilter() - +dynamic onSelectStudy() - +dynamic onClickNewStudy() - +dynamic pinStudy() - +dynamic pinOffStudy() - +void filterStudies() - +void sortStudies() - +bool isPinned() - +List<ModelAction<dynamic>> availableActions() - +void dispose() + + + +Widget build() - - - + + + + - - - int Function(Study, Study) + + + IStudyStatusBadgeViewModel - - - - - - - - - StudiesFilter + + + +studyParticipation: Participation? + +studyStatus: StudyStatus? - - - +index: int - <static>+values: List<StudiesFilter> + + + + + + + + StudyStatus - - - - + + + + + - - - DashboardScreen + + + StudyStatusBadge - - - +filter: StudiesFilter? + + + +participation: Participation? + +status: StudyStatus? + +type: BadgeType + +showPrefixIcon: bool + +showTooltip: bool + + + + + + +Widget build() - - - - + + + + - - - SearchController + + + IWithBanner - - - +setText: void Function(String) + + + +Widget? banner() - - - - + + + + - - - AccountSettingsDialog + + + PreviewFrame - - - +Widget build() + + + +studyId: String + +routeArgs: StudyFormRouteArgs? + +route: String? - - - - + + + + + - - - StudyMonitorScreen + + + StudyController - - - +Widget build() + + + +notificationService: INotificationService + +studyEventsSubscription: StreamSubscription<ModelEvent<Study>>? + +studyActions: List<ModelAction<dynamic>> + + + + + + +dynamic syncStudyStatus() + +dynamic onStudySubscriptionUpdate() + -dynamic _redirectNewToActualStudyID() + +dynamic publishStudy() + +void onChangeStudyParticipation() + +void onAddParticipants() + +void onSettingsPressed() + +void dispose() - - - - + + + + - - - AppStatus + + + INotificationService - - - +index: int - <static>+values: List<AppStatus> - <static>+initializing: AppStatus - <static>+initialized: AppStatus + + + +void showMessage() + +void show() + +Stream<NotificationIntent> watchNotifications() + +void dispose() - - - + + + + + - - - FormInvalidException + + + FrameControlsWidget - - - - - - - - - FormConfigException + + + +onRefresh: void Function()? + +onOpenNewTab: void Function()? + +enabled: bool - - - +message: String? + + + +Widget build() - - - - + + + + + - - - FormControlOption + + + RouteInformation - - - +value: T - +label: String - +description: String? - +props: List<Object?> + + + +route: String? + +extra: String? + +cmd: String? + +data: String? - - - - - - - - Equatable + + + +String toString() - - - - + + + + + - - - FormMode + + + PlatformController - - - +index: int - <static>+values: List<FormMode> - <static>+create: FormMode - <static>+readonly: FormMode - <static>+edit: FormMode + + + +studyId: String + +baseSrc: String + +previewSrc: String + +routeInformation: RouteInformation + +frameWidget: Widget - - - - - - - - FormValidationSetEnum + + + +void activate() + +void registerViews() + +void generateUrl() + +void navigate() + +void refresh() + +void listen() + +void send() + +void openNewPage() - - - - - + + + + + - - - Debouncer + + + WebController - - - +leading: bool - +cancelUncompleted: bool - -_uncompletedFutureOperation: CancelableOperation<dynamic>? + + + +iFrameElement: IFrameElement - - - +dynamic call() + + + +void activate() + +void registerViews() + +void generateUrl() + +void navigate() + +void refresh() + +void openNewPage() + +void listen() + +void send() - - - + + + - - - CancelableOperation + + + IFrameElement - - - - - + + + + - - - FormControlValidation + + + MobileController - - - +control: AbstractControl<dynamic> - +validators: List<Validator<dynamic>> - +asyncValidators: List<AsyncValidator<dynamic>>? - +validationMessages: Map<String, String Function(Object)> + + + +void openNewPage() + +void refresh() + +void registerViews() + +void listen() + +void send() + +void navigate() + +void activate() + +void generateUrl() - - - +FormControlValidation merge() + + + + + + + + + TestAppRoutes - - - - - - - - AbstractControl + + + <static>+studyOverview: String + <static>+eligibility: String + <static>+intervention: String + <static>+consent: String + <static>+journey: String + <static>+dashboard: String - - - - + + + + - - - UnsavedChangesDialog + + + IStudyAppBarViewModel - - - +Widget build() + + + +isSyncIndicatorVisible: bool + +isStatusBadgeVisible: bool + +isPublishVisible: bool - - - + + + + - - - FormViewModelNotFoundException + + + StudyScaffold - - - - - - - - - - FormArrayTable + + + +studyId: String + +tabs: List<NavbarTab>? + +tabsSubnav: List<NavbarTab>? + +selectedTab: NavbarTab? + +selectedTabSubnav: NavbarTab? + +body: StudyPageWidget + +drawer: Widget? + +disableActions: bool + +actionsSpacing: double + +actionsPadding: double + +layoutType: SingleColumnLayoutType? + +appbarHeight: double + +appbarSubnavHeight: double - - - +control: AbstractControl<dynamic> - +items: List<T> - +onSelectItem: void Function(T) - +getActionsAt: List<ModelAction<dynamic>> Function(T, int) - +onNewItem: void Function()? - +rowTitle: String Function(T) - +onNewItemLabel: String - +sectionTitle: String? - +sectionDescription: String? - +emptyIcon: IconData? - +emptyTitle: String? - +emptyDescription: String? - +sectionTitleDivider: bool? - +rowPrefix: Widget Function(BuildContext, T, int)? - +rowSuffix: Widget Function(BuildContext, T, int)? - +leadingWidget: Widget? - +itemsSectionPadding: EdgeInsets? - +hideLeadingTrailingWhenEmpty: bool - <static>+columns: List<StandardTableColumn> + + + + + + + + + NavbarTab - - - +Widget build() - -List<Widget> _buildRow() - -Widget _newItemButton() + + + +title: String + +intent: RoutingIntent? + +index: int + +enabled: bool - - - + + + + - - - void Function(T) + + + SingleColumnLayoutType - - - - - - - - List<ModelAction<dynamic>> Function(T, int) + + + +index: int + <static>+values: List<SingleColumnLayoutType> + <static>+boundedWide: SingleColumnLayoutType + <static>+boundedNarrow: SingleColumnLayoutType + <static>+stretched: SingleColumnLayoutType + <static>+split: SingleColumnLayoutType - - - + + + + - - - String Function(T) + + + StudyTestController - - - - - - - - Widget Function(BuildContext, T, int)? + + + +authRepository: IAuthRepository + +languageCode: String - - - - - - - - - CustomFormControl - - + + + + + - - - -_onValueChangedDebouncer: Debouncer? - -_onStatusChangedDebouncer: Debouncer? - +onValueChanged: void Function(T?)? - +onStatusChanged: void Function(ControlStatus)? - +onStatusChangedDebounceTime: int? - +onValueChangedDebounceTime: int? + + + DashboardScaffold - - - +void dispose() + + + +body: Widget - - - - - - - - void Function(T?)? + + + +Widget build() - - - + + + + + - - - void Function(ControlStatus)? + + + DashboardController - - - - - - - - - IStudyNavViewModel + + + +studyRepository: IStudyRepository + +authRepository: IAuthRepository + +userRepository: IUserRepository + +router: GoRouter + -_studiesSubscription: StreamSubscription<List<WrappedModel<Study>>>? + +searchController: SearchController - - - +isEditTabEnabled: bool - +isTestTabEnabled: bool - +isRecruitTabEnabled: bool - +isMonitorTabEnabled: bool - +isAnalyzeTabEnabled: bool - +isSettingsEnabled: bool + + + -dynamic _subscribeStudies() + +dynamic setSearchText() + +dynamic setStudiesFilter() + +dynamic onSelectStudy() + +dynamic onClickNewStudy() + +dynamic pinStudy() + +dynamic pinOffStudy() + +void filterStudies() + +void sortStudies() + +bool isPinned() + +List<ModelAction<dynamic>> availableActions() + +void dispose() - - - - + + + + - - - StudyNav + + + SearchController - - - <static>+dynamic tabs() - <static>+dynamic edit() - <static>+dynamic test() - <static>+dynamic recruit() - <static>+dynamic monitor() - <static>+dynamic analyze() + + + +setText: void Function(String) - - - - + + + + - - - StudyDesignNav + + + StudiesFilter - - - <static>+dynamic tabs() - <static>+dynamic info() - <static>+dynamic enrollment() - <static>+dynamic interventions() - <static>+dynamic measurements() - <static>+dynamic reports() + + + +index: int + <static>+values: List<StudiesFilter> - - - - - + + + + + - - - WebFrame + + + StudiesTable - - - +previewSrc: String - +studyId: String + + + +studies: List<Study> + +onSelect: void Function(Study) + +getActions: List<ModelAction<dynamic>> Function(Study) + +emptyWidget: Widget + +pinnedStudies: Iterable<String> + +dashboardController: DashboardController + +pinnedPredicates: int Function(Study, Study) + -_sortColumns: List<int Function(Study, Study)?> - - - +Widget build() + + + +Widget build() + -List<Widget> _buildRow() - - - - - - - - DisabledFrame - - + + + - - - +Widget build() + + + void Function(Study) - - - - - + + + - - - PhoneContainer + + + List<ModelAction<dynamic>> Function(Study) - - - <static>+defaultWidth: double - <static>+defaultHeight: double - +width: double - +height: double - +borderColor: Color - +borderWidth: double - +borderRadius: double - +innerContent: Widget - +innerContentBackgroundColor: Color? - - + + + + - - - +Widget build() + + + int Function(Study, Study) - - - - + + + + - - - MobileFrame + + + DashboardScreen - - - +Widget build() + + + +filter: StudiesFilter? - - - - + + + + - - - DesktopFrame + + + AccountSettingsDialog - - - +Widget build() + + + +Widget build() - - - - + + + + - - - TestAppRoutes + + + StudyUJobsToBeDone - - - <static>+studyOverview: String - <static>+eligibility: String - <static>+intervention: String - <static>+consent: String - <static>+journey: String - <static>+dashboard: String + + + +Widget build() - - - - + + + + - - - PreviewFrame + + + EmailTextField - - - +studyId: String - +routeArgs: StudyFormRouteArgs? - +route: String? + + + +labelText: String + +hintText: String? + +formControlName: String? + +formControl: FormControl<dynamic>? - - - - + + + + - - - StudyFormRouteArgs + + + PasswordTextField - - - +studyId: String + + + +labelText: String + +hintText: String? + +formControlName: String? + +formControl: FormControl<dynamic>? - - - - - + + + + + - - - FrameControlsWidget + + + SignupForm - - - +onRefresh: void Function()? - +onOpenNewTab: void Function()? - +enabled: bool + + + +formKey: AuthFormKey - - - +Widget build() + + + +Widget build() + -dynamic _onClickTermsOfUse() + -dynamic _onClickPrivacyPolicy() - - - - - + + + + - - - StudyTestScreen + + + AuthFormKey - - - +previewRoute: String? + + + +index: int + <static>+values: List<AuthFormKey> + <static>+login: AuthFormKey + <static>+signup: AuthFormKey + <static>+passwordForgot: AuthFormKey + <static>+passwordRecovery: AuthFormKey + <static>-_loginSubmit: AuthFormKey + <static>-_signupSubmit: AuthFormKey + + + + + + + + + + + + FormConsumerRefWidget - - - +Widget build() - +Widget? banner() - +dynamic load() - +dynamic save() - +dynamic showHelp() + + + +Widget build() - - - - - + + + + + - - - RouteInformation + + + PasswordForgotForm - - - +route: String? - +extra: String? - +cmd: String? - +data: String? + + + +formKey: AuthFormKey - - - +String toString() + + + +Widget build() - - - - - + + + + + - - - PlatformController + + + AuthFormController - - - +studyId: String - +baseSrc: String - +previewSrc: String - +routeInformation: RouteInformation - +frameWidget: Widget + + + +authRepository: IAuthRepository + +sharedPreferences: SharedPreferences + +notificationService: INotificationService + +router: GoRouter + +emailControl: FormControl<String> + +passwordControl: FormControl<String> + +passwordConfirmationControl: FormControl<String> + +rememberMeControl: FormControl<bool> + +termsOfServiceControl: FormControl<bool> + <static>+authValidationMessages: Map<String, String Function(dynamic)> + +loginForm: FormGroup + +signupForm: FormGroup + +passwordForgotForm: FormGroup + +passwordRecoveryForm: FormGroup + +controlValidatorsByForm: Map<AuthFormKey, Map<FormControl<dynamic>, List<Validator<dynamic>>>> + -_formKey: AuthFormKey + +shouldRemember: bool + +formKey: AuthFormKey + +form: FormGroup - - - +void activate() - +void registerViews() - +void generateUrl() - +void navigate() - +void refresh() - +void listen() - +void send() - +void openNewPage() + + + -dynamic _onChangeFormKey() + +dynamic resetControlsFor() + -dynamic _forceValidationMessages() + +dynamic signUp() + -dynamic _signUp() + +dynamic signIn() + -dynamic _signInWith() + +dynamic signOut() + +dynamic resetPasswordForEmail() + +dynamic sendPasswordResetLink() + +dynamic recoverPassword() + +dynamic updateUser() + -void _setRememberMe() + -void _delRememberMe() + -void _initRememberMe() - - - - - + + + + - - - WebController + + + IFormGroupController - - - +iFrameElement: IFrameElement + + + +form: FormGroup - - - +void activate() - +void registerViews() - +void generateUrl() - +void navigate() - +void refresh() - +void openNewPage() - +void listen() - +void send() + + + + + + + + + AuthScaffold + + + + + + +body: Widget + +formKey: AuthFormKey + +leftContentMinWidth: double + +leftPanelMinWidth: double + +leftPanelPadding: EdgeInsets - - - + + + - - - IFrameElement + + + EdgeInsets - - - - + + + + + - - - MobileController + + + LoginForm - - - +void openNewPage() - +void refresh() - +void registerViews() - +void listen() - +void send() - +void navigate() - +void activate() - +void generateUrl() + + + +formKey: AuthFormKey + + + + + + +Widget build() - - - - + + + + + - - - StudyTestController + + + PasswordRecoveryForm - - - +authRepository: IAuthRepository - +languageCode: String + + + +formKey: AuthFormKey + + + + + + +Widget build() - - - - + + + + + - - - IStudyStatusBadgeViewModel + + + AppController - - - +studyParticipation: Participation? - +studyStatus: StudyStatus? + + + +sharedPreferences: SharedPreferences + +appDelegates: List<IAppDelegate> + -_delayedFuture: dynamic + +isInitialized: dynamic - - - - - - - - StudyStatus + + + +dynamic onAppStart() + -dynamic _callDelegates() - - - - - + + + - - - StudyStatusBadge + + + FormViewModelNotFoundException - - - +participation: Participation? - +status: StudyStatus? - +type: BadgeType - +showPrefixIcon: bool - +showTooltip: bool - - + + + + - - - +Widget build() + + + FormValidationSetEnum - - - - - + + + + + - - - StudyController + + + FormControlValidation - - - +notificationService: INotificationService - +studyEventsSubscription: StreamSubscription<ModelEvent<Study>>? - +studyActions: List<ModelAction<dynamic>> + + + +control: AbstractControl<dynamic> + +validators: List<Validator<dynamic>> + +asyncValidators: List<AsyncValidator<dynamic>>? + +validationMessages: Map<String, String Function(Object)> - - - +dynamic syncStudyStatus() - +dynamic onStudySubscriptionUpdate() - -dynamic _redirectNewToActualStudyID() - +dynamic publishStudy() - +void onChangeStudyParticipation() - +void onAddParticipants() - +void onSettingsPressed() - +void dispose() + + + +FormControlValidation merge() - - - - + + + - - - IStudyAppBarViewModel + + + AbstractControl - - - +isSyncIndicatorVisible: bool - +isStatusBadgeVisible: bool - +isPublishVisible: bool + + + + + + + + FormInvalidException - - - - + + + + - - - StudyScaffold + + + FormConfigException - - - +studyId: String - +tabs: List<NavbarTab>? - +tabsSubnav: List<NavbarTab>? - +selectedTab: NavbarTab? - +selectedTabSubnav: NavbarTab? - +body: StudyPageWidget - +drawer: Widget? - +disableActions: bool - +actionsSpacing: double - +actionsPadding: double - +layoutType: SingleColumnLayoutType? - +appbarHeight: double - +appbarSubnavHeight: double + + + +message: String? - - - - + + + + - - - NavbarTab + + + FormControlOption - - - +title: String - +intent: RoutingIntent? - +index: int - +enabled: bool + + + +value: T + +label: String + +description: String? + +props: List<Object?> - - - - + + + + - - - SingleColumnLayoutType + + + FormMode - - - +index: int - <static>+values: List<SingleColumnLayoutType> - <static>+boundedWide: SingleColumnLayoutType - <static>+boundedNarrow: SingleColumnLayoutType - <static>+stretched: SingleColumnLayoutType - <static>+split: SingleColumnLayoutType + + + +index: int + <static>+values: List<FormMode> + <static>+create: FormMode + <static>+readonly: FormMode + <static>+edit: FormMode - - - - + + + + + - - - IWithBanner + + + Debouncer - - - +Widget? banner() + + + +leading: bool + +cancelUncompleted: bool + -_uncompletedFutureOperation: CancelableOperation<dynamic>? - - - - - - - - - StudySettingsDialog + + + +dynamic call() - - - +Widget build() + + + + + + + + CancelableOperation - - - - - + + + + + - - - StudySettingsFormViewModel + + + CustomFormControl - - - +study: AsyncValue<Study> - +studyRepository: IStudyRepository - <static>+defaultPublishedToRegistry: bool - <static>+defaultPublishedToRegistryResults: bool - +isPublishedToRegistryControl: FormControl<bool> - +isPublishedToRegistryResultsControl: FormControl<bool> - +form: FormGroup - +titles: Map<FormMode, String> + + + -_onValueChangedDebouncer: Debouncer? + -_onStatusChangedDebouncer: Debouncer? + +onValueChanged: void Function(T?)? + +onStatusChanged: void Function(ControlStatus)? + +onStatusChangedDebounceTime: int? + +onValueChangedDebounceTime: int? - - - +void setControlsFrom() - +Study buildFormData() - +dynamic keepControlsSynced() - +dynamic save() - +dynamic setLaunchDefaults() + + + +void dispose() - - - - - + + + - - - StudyParticipationBadge + + + void Function(T?)? - - - +participation: Participation - +type: BadgeType - +showPrefixIcon: bool - - + + + + - - - +Widget build() + + + void Function(ControlStatus)? - - - - + + + + - - - Config + + + UnsavedChangesDialog - - - <static>+isDebugMode: bool - <static>+defaultLocale: Set<String> - <static>+supportedLocales: Map<String, String> - <static>+newStudyId: String - <static>+newModelId: String - <static>+minSplashTime: int - <static>+formAutosaveDebounce: int + + + +Widget build() - - - - + + + + + - - - GoRouteParamEnum + + + FormArrayTable - - - +String toRouteParam() - +String toShortString() + + + +control: AbstractControl<dynamic> + +items: List<T> + +onSelectItem: void Function(T) + +getActionsAt: List<ModelAction<dynamic>> Function(T, int) + +onNewItem: void Function()? + +rowTitle: String Function(T) + +onNewItemLabel: String + +sectionTitle: String? + +sectionDescription: String? + +emptyIcon: IconData? + +emptyTitle: String? + +emptyDescription: String? + +sectionTitleDivider: bool? + +rowPrefix: Widget Function(BuildContext, T, int)? + +rowSuffix: Widget Function(BuildContext, T, int)? + +leadingWidget: Widget? + +itemsSectionPadding: EdgeInsets? + +hideLeadingTrailingWhenEmpty: bool + <static>+columns: List<StandardTableColumn> + + + + + + +Widget build() + -List<Widget> _buildRow() + -Widget _newItemButton() - - - - + + + - - - RouterKeys + + + void Function(T) - - - <static>+studyKey: ValueKey<String> - <static>+authKey: ValueKey<String> + + + + + + + + List<ModelAction<dynamic>> Function(T, int) - - - + + + - - - ValueKey + + + String Function(T) - - - - + + + - - - RouteParams + + + Widget Function(BuildContext, T, int)? - - - <static>+studiesFilter: String - <static>+studyId: String - <static>+measurementId: String - <static>+interventionId: String - <static>+testAppRoute: String + + + + + + + + App - - - - - + + + - - - RouterConf + + + AppContent - - - <static>+router: GoRouter - <static>+routes: List<GoRoute> - <static>+publicRoutes: List<GoRoute> - <static>+privateRoutes: List<GoRoute> + + + + + + + + + StudyMonitorScreen - - - <static>+GoRoute route() + + + +Widget build() - - - - + + + + + - - - QuestionFormRouteArgs + + + DrawerEntry - - - +questionId: String + + + +localizedTitle: String Function() + +icon: IconData? + +localizedHelpText: String Function()? + +enabled: bool + +onSelected: void Function(BuildContext, WidgetRef)? + +title: String + +helpText: String? - - - - - - - - ScreenerQuestionFormRouteArgs + + + +void onClick() - - - - + + + - - - ConsentItemFormRouteArgs + + + String Function() - - - +consentId: String + + + + + + + + String Function()? - - - - + + + - - - SurveyQuestionFormRouteArgs + + + void Function(BuildContext, WidgetRef)? - - - +questionId: String + + + + + + + + + + GoRouterDrawerEntry - - - - - - - - - InterventionTaskFormRouteArgs + + + +intent: RoutingIntent - - - +taskId: String + + + +void onClick() - - - - + + + + - - - ReportItemFormRouteArgs + + + AppDrawer - - - +sectionId: String + + + +title: String + +width: int + +leftPaddingEntries: double + +logoPaddingVertical: double + +logoPaddingHorizontal: double + +logoMaxHeight: double + +logoSectionMinHeight: double + +logoSectionMaxHeight: double - - - - + + + + - - - RoutingIntents + + + PrimaryButton - - - <static>+root: RoutingIntent - <static>+studies: RoutingIntent - <static>+studiesShared: RoutingIntent - <static>+publicRegistry: RoutingIntent - <static>+study: RoutingIntent Function(String) - <static>+studyEdit: RoutingIntent Function(String) - <static>+studyEditInfo: RoutingIntent Function(String) - <static>+studyEditEnrollment: RoutingIntent Function(String) - <static>+studyEditInterventions: RoutingIntent Function(String) - <static>+studyEditIntervention: RoutingIntent Function(String, String) - <static>+studyEditMeasurements: RoutingIntent Function(String) - <static>+studyEditReports: RoutingIntent Function(String) - <static>+studyEditMeasurement: RoutingIntent Function(String, String) - <static>+studyTest: RoutingIntent Function(String, {String? appRoute}) - <static>+studyRecruit: RoutingIntent Function(String) - <static>+studyMonitor: RoutingIntent Function(String) - <static>+studyAnalyze: RoutingIntent Function(String) - <static>+studySettings: RoutingIntent Function(String) - <static>+accountSettings: RoutingIntent - <static>+studyNew: RoutingIntent - <static>+login: RoutingIntent - <static>+signup: RoutingIntent - <static>+passwordForgot: RoutingIntent - <static>+passwordForgot2: RoutingIntent Function(String) - <static>+passwordRecovery: RoutingIntent - <static>+error: RoutingIntent Function(Exception) + + + +text: String + +icon: IconData? + +isLoading: bool + +showLoadingEarliestAfterMs: int + +onPressed: void Function()? + +tooltip: String + +tooltipDisabled: String + +enabled: bool + +onPressedFuture: dynamic Function()? + +innerPadding: EdgeInsets + +minimumSize: Size? + +isDisabled: bool - - - + + + - - - RoutingIntent Function(String) + + + dynamic Function()? - - - + + + - - - RoutingIntent Function(String, String) + + + Size - - - + + + + + - - - RoutingIntent Function(String, {String? appRoute}) + + + DismissButton - - - - + + + +onPressed: void Function()? + +text: String? + + - - - RoutingIntent Function(Exception) + + + +Widget build() - - - + + + + + - - - GoRoute + + + EmptyBody - - - - - - - - - RoutingIntentDispatch + + + +icon: IconData? + +leading: Widget? + +leadingSpacing: double? + +title: String? + +description: String? + +button: Widget? - - - +index: int - <static>+values: List<RoutingIntentDispatch> - <static>+go: RoutingIntentDispatch - <static>+push: RoutingIntentDispatch + + + +Widget build() - - - - + + + + - - - PlatformLocaleWeb + + + SplashPage - - - +Locale getPlatformLocale() + + + +Widget build() - - - - - - - - PlatformLocale - - + + + + + - - - +Locale getPlatformLocale() + + + ErrorPage - - - - - - - - - PlatformLocaleMobile + + + +error: Exception? - - - +Locale getPlatformLocale() + + + +Widget build() - - - - + + + + - - - AppTranslation + + + Search - - - <static>+dynamic init() + + + +onQueryChanged: dynamic Function(String) + +searchController: SearchController? + +hintText: String? + +initialText: String? - - - - + + + - - - LanguagePicker + + + dynamic Function(String) - - - +languagePickerType: LanguagePickerType - +iconColor: Color? - +offset: Offset? + + + + + + + + void Function(String) - - - - + + + + + - - - LanguagePickerType + + + TextParagraph - - - +index: int - <static>+values: List<LanguagePickerType> - <static>+field: LanguagePickerType - <static>+icon: LanguagePickerType + + + +text: String? + +style: TextStyle? + +selectable: bool + +span: List<TextSpan>? - - - - - - - - Offset + + + +Widget build() - - - - - + + + - - - Tuple + + + TextStyle - - - +first: T1 - +second: T2 - +props: List<Object?> - - + + + + + + - - - +Map<String, dynamic> toJson() - <static>+Tuple<dynamic, dynamic> fromJson() - +Tuple<T1, T2> copy() - +Tuple<T1, T2> copyWith() + + + FormControlLabel - - - - - - - - - FileFormatEncoder + + + +formControl: AbstractControl<dynamic> + +text: String + +isClickable: bool + +textStyle: TextStyle? + +onClick: void Function(AbstractControl<dynamic>)? - - - +dynamic encodeAsync() - +String encode() - +dynamic call() + + + +Widget build() - - - - + + + - - - CSVStringEncoder + + + void Function(AbstractControl<dynamic>)? - - - +String encode() + + + + + + + + + + HelpIcon - - - - - - - - - JsonStringEncoder + + + +tooltipText: String? - - - +String encode() + + + +Widget build() - - - - - + + + + + - - - CountWhereValidator + + + ActionMenuInline - - - +predicate: bool Function(T?) - +minCount: int? - +maxCount: int? - <static>+kValidationMessageMinCount: String - <static>+kValidationMessageMaxCount: String + + + +actions: List<ModelAction<dynamic>> + +iconSize: double? + +visible: bool + +splashRadius: double? + +paddingVertical: double? + +paddingHorizontal: double? - - - +Map<String, dynamic>? validate() + + + +Widget build() - - - + + + - - - bool Function(T?) + + + ReactiveCustomColorPicker - - - + + + - - - Validator + + + ReactiveFormField - - - - - + + + + + - - - MustMatchValidator + + + SecondaryButton - - - +control: AbstractControl<dynamic>? - +matchingControl: AbstractControl<dynamic>? + + + +text: String + +icon: IconData? + +isLoading: bool + +onPressed: void Function()? - - - +Map<String, dynamic>? validate() + + + +Widget build() - - - - + + + + - - - FieldValidators + + + StandardTableColumn - - - <static>+String? emailValidator() + + + +label: String + +tooltip: String? + +columnWidth: TableColumnWidth + +sortable: bool + +sortAscending: bool? + +sortableIcon: Widget? - - - - - - - - Patterns - - + + + - - - <static>+timeFormatString: String - <static>+emailFormatString: String - <static>+url: String + + + TableColumnWidth - - - - - + + + + - - - StudyUException + + + StandardTable - - - +message: String + + + +items: List<T> + +inputColumns: List<StandardTableColumn> + +onSelectItem: void Function(T) + +trailingActionsAt: List<ModelAction<dynamic>> Function(T, int)? + +trailingActionsMenuType: ActionMenuType? + +sortColumnPredicates: List<int Function(T, T)?>? + +pinnedPredicates: int Function(T, T)? + +headerRowBuilder: TableRow Function(BuildContext, List<StandardTableColumn>)? + +dataRowBuilder: TableRow Function(BuildContext, List<StandardTableColumn>)? + +inputTrailingActionsColumn: StandardTableColumn + +tableWrapper: Widget Function(Widget)? + +cellSpacing: double + +rowSpacing: double + +minRowHeight: double? + +showTableHeader: bool + +hideLeadingTrailingWhenEmpty: bool + +leadingWidget: Widget? + +trailingWidget: Widget? + +leadingWidgetSpacing: double? + +trailingWidgetSpacing: double? + +emptyWidget: Widget? + +rowStyle: StandardTableStyle + +disableRowInteractions: bool - - - +String toString() + + + + + + + + List<ModelAction<dynamic>> Function(T, int)? - - - - + + + + - - - ModelAction + + + ActionMenuType - - - +type: T - +label: String - +icon: IconData? - +onExecute: Function - +isAvailable: bool - +isDestructive: bool + + + +index: int + <static>+values: List<ActionMenuType> + <static>+inline: ActionMenuType + <static>+popup: ActionMenuType - - - - + + + - - - ModelActionType + + + int Function(T, T)? - - - +index: int - <static>+values: List<ModelActionType> - <static>+edit: ModelActionType - <static>+delete: ModelActionType - <static>+remove: ModelActionType - <static>+duplicate: ModelActionType - <static>+clipboard: ModelActionType - <static>+primary: ModelActionType + + + + + + + + TableRow Function(BuildContext, List<StandardTableColumn>)? - - - - - + + + - - - CombinedStreamNotifier + + + Widget Function(Widget)? - - - -_subscriptions: List<StreamSubscription<dynamic>> + + + + + + + + + StandardTableStyle - - - +void dispose() + + + +index: int + <static>+values: List<StandardTableStyle> + <static>+plain: StandardTableStyle + <static>+material: StandardTableStyle - - - + + + + + - - - ChangeNotifier + + + Badge - - - - - - + + + +icon: IconData? + +color: Color? + +borderRadius: double + +label: String + +type: BadgeType + +padding: EdgeInsets + +iconSize: double? + +labelStyle: TextStyle? + + - - - OptimisticUpdate + + + +Widget build() + -Color? _getBackgroundColor() + -Color _getBorderColor() + -Color? _getLabelColor() - - - +applyOptimistic: void Function() - +apply: dynamic Function() - +rollback: void Function() - +onUpdate: void Function()? - +onError: void Function(Object, StackTrace?)? - +rethrowErrors: bool - +runOptimistically: bool - +completeFutureOptimistically: bool + + + + + + + + + Collapsible - - - +dynamic execute() - -void _runUpdateHandlerIfAny() + + + +contentBuilder: Widget Function(BuildContext, bool) + +headerBuilder: Widget Function(BuildContext, bool)? + +title: String? + +isCollapsed: bool - - - + + + - - - void Function() + + + Widget Function(BuildContext, bool) - - - + + + - - - void Function(Object, StackTrace?)? + + + Widget Function(BuildContext, bool)? - - - - - + + + + - - - NumericalRangeFormatter + + + FormSideSheetTab - - - +min: int? - +max: int? + + + +formViewBuilder: Widget Function(T) - - - +TextEditingValue formatEditUpdate() + + + + + + + + + SidesheetTab - - - - - - - - TextInputFormatter + + + +builder: Widget Function(BuildContext) - - - - + + + + - - - StudySequenceFormatter + + + Sidesheet - - - +TextEditingValue formatEditUpdate() + + + <static>+kDefaultWidth: double + +titleText: String + +body: Widget? + +tabs: List<SidesheetTab>? + +actionButtons: List<Widget>? + +width: double? + +withCloseButton: bool + +ignoreAppBar: bool + +collapseSingleTab: bool + +bodyPadding: EdgeInsets? + +wrapContent: Widget Function(Widget)? - - - - - - - - Time - - + + + - - - <static>+dynamic fromTimeOfDay() - +Map<String, dynamic> toJson() - <static>+Time fromJson() + + + NullHelperDecoration - - - + + + - - - TimeOfDay + + + InputDecoration - - - - + + + + + - - - TimeValueAccessor + + + StudyULogo - - - +String modelToViewValue() - +Time? viewToModelValue() - -String _addLeadingZeroIfNeeded() + + + +onTap: void Function()? - - - - - - - - ControlValueAccessor + + + +Widget build() - - - - - - - - - SuppressedBehaviorSubject - - + + + + - - - +subject: BehaviorSubject<T> - +didSuppressInitialEvent: bool - -_controller: StreamController<T> + + + Hyperlink - - - -StreamController<T> _buildDerivedController() - +dynamic close() + + + +text: String + +url: String? + +onClick: void Function()? + +linkColor: Color + +hoverColor: Color? + +visitedColor: Color? + +style: TextStyle? + +hoverStyle: TextStyle? + +visitedStyle: TextStyle? + +icon: IconData? + +iconSize: double? - - - + + + + + - - - StreamController + + + ActionPopUpMenuButton - - - - - - - - - - ExecutionLimiter + + + +actions: List<ModelAction<dynamic>> + +triggerIconColor: Color? + +triggerIconColorHover: Color? + +triggerIconSize: double + +disableSplashEffect: bool + +hideOnEmpty: bool + +orientation: Axis + +elevation: double? + +splashRadius: double? + +enabled: bool + +position: PopupMenuPosition - - - +milliseconds: int - <static>-_timer: Timer? + + + +Widget build() + -Widget _buildPopupMenu() - - - +void dispose() + + + + + + + + Axis - - - + + + - - - Timer + + + PopupMenuPosition - - - - + + + + - - - Throttler + + + MouseEventsRegion - - - +dynamic call() + + + +onTap: void Function()? + +onHover: void Function(PointerHoverEvent)? + +onEnter: void Function(PointerEnterEvent)? + +onExit: void Function(PointerExitEvent)? + +autoselectCursor: bool + +cursor: SystemMouseCursor + <static>+defaultCursor: SystemMouseCursor + +autoCursor: SystemMouseCursor - - - - - + + + - - - JsonFileLoader + + + void Function(PointerHoverEvent)? - - - +jsonAssetsPath: String - - + + + + - - - +dynamic loadJson() - +dynamic parseJsonMapFromAssets() - +dynamic parseJsonListFromAssets() + + + void Function(PointerEnterEvent)? - - - - + + + - - - SerializableColor + + + void Function(PointerExitEvent)? - - - +Map<String, dynamic> toJson() - <static>+SerializableColor fromJson() + + + + + + + + SystemMouseCursor - - - - + + + + - - - StandardTableColumn + + + FormTableRow - - - +label: String - +tooltip: String? - +columnWidth: TableColumnWidth - +sortable: bool - +sortAscending: bool? - +sortableIcon: Widget? + + + +label: String? + +labelBuilder: Widget Function(BuildContext)? + +labelStyle: TextStyle? + +labelHelpText: String? + +input: Widget + +control: AbstractControl<dynamic>? + +layout: FormTableRowLayout? - - - + + + - - - TableColumnWidth + + + Widget Function(BuildContext)? - - - - + + + + - - - StandardTable + + + FormTableRowLayout - - - +items: List<T> - +inputColumns: List<StandardTableColumn> - +onSelectItem: void Function(T) - +trailingActionsAt: List<ModelAction<dynamic>> Function(T, int)? - +trailingActionsMenuType: ActionMenuType? - +sortColumnPredicates: List<int Function(T, T)?>? - +pinnedPredicates: int Function(T, T)? - +headerRowBuilder: TableRow Function(BuildContext, List<StandardTableColumn>)? - +dataRowBuilder: TableRow Function(BuildContext, List<StandardTableColumn>)? - +inputTrailingActionsColumn: StandardTableColumn - +tableWrapper: Widget Function(Widget)? - +cellSpacing: double - +rowSpacing: double - +minRowHeight: double? - +showTableHeader: bool - +hideLeadingTrailingWhenEmpty: bool - +leadingWidget: Widget? - +trailingWidget: Widget? - +leadingWidgetSpacing: double? - +trailingWidgetSpacing: double? - +emptyWidget: Widget? - +rowStyle: StandardTableStyle - +disableRowInteractions: bool + + + +index: int + <static>+values: List<FormTableRowLayout> + <static>+vertical: FormTableRowLayout + <static>+horizontal: FormTableRowLayout - - - + + + + + - - - List<ModelAction<dynamic>> Function(T, int)? + + + FormTableLayout - - - - - - - - - ActionMenuType + + + +rows: List<FormTableRow> + +columnWidths: Map<int, TableColumnWidth> + +rowDivider: Widget? + +rowLayout: FormTableRowLayout? + +rowLabelStyle: TextStyle? - - - +index: int - <static>+values: List<ActionMenuType> - <static>+inline: ActionMenuType - <static>+popup: ActionMenuType + + + +Widget build() - - - + + + + + - - - int Function(T, T)? + + + FormSectionHeader - - - - - - - - TableRow Function(BuildContext, List<StandardTableColumn>)? + + + +title: String + +titleTextStyle: TextStyle? + +helpText: String? + +divider: bool + +helpTextDisabled: bool - - - - - - - - Widget Function(Widget)? + + + +Widget build() - - - - + + + + + - - - StandardTableStyle + + + FormLabel - - - +index: int - <static>+values: List<StandardTableStyle> - <static>+plain: StandardTableStyle - <static>+material: StandardTableStyle + + + +labelText: String? + +helpText: String? + +labelTextStyle: TextStyle? + +layout: FormTableRowLayout? + + + + + + +Widget build() - - - + + + - + AsyncValueWidget - + +value: AsyncValue<T> +data: Widget Function(T) @@ -14266,7 +14267,7 @@ - + +Widget build() -Widget _buildDataOrEmptyWidget() @@ -14278,9 +14279,9 @@ - + - + Widget Function(Object, StackTrace?)? @@ -14289,448 +14290,415 @@ - + - + Widget Function()? - - - - + + + + - - - TwoColumnLayout + + + TabbedNavbar - - - <static>+defaultDivider: VerticalDivider - <static>+defaultContentPadding: EdgeInsets - <static>+slimContentPadding: EdgeInsets - +leftWidget: Widget - +rightWidget: Widget - +dividerWidget: Widget? - +headerWidget: Widget? - +flexLeft: int? - +flexRight: int? - +constraintsLeft: BoxConstraints? - +constraintsRight: BoxConstraints? - +scrollLeft: bool - +scrollRight: bool - +paddingLeft: EdgeInsets? - +paddingRight: EdgeInsets? - +backgroundColorLeft: Color? - +backgroundColorRight: Color? - +stretchHeight: bool + + + +tabs: List<T> + +selectedTab: T? + +indicator: BoxDecoration? + +height: double? + +disabledBackgroundColor: Color? + +disabledTooltipText: String? + +onSelect: void Function(int, T)? + +labelPadding: EdgeInsets? + +labelSpacing: double? + +indicatorSize: TabBarIndicatorSize? + +isScrollable: bool + +backgroundColor: Color? + +labelColorHover: Color? + +unselectedLabelColorHover: Color? - - - + + + - - - VerticalDivider + + + BoxDecoration - - - + + + - - - BoxConstraints + + + void Function(int, T)? - - - - - - - - UnderConstruction - - + + + - - - +Widget build() + + + TabBarIndicatorSize - - - - + + + + + - - - FormTableRow + + + SingleColumnLayout - - - +label: String? - +labelBuilder: Widget Function(BuildContext)? - +labelStyle: TextStyle? - +labelHelpText: String? - +input: Widget - +control: AbstractControl<dynamic>? - +layout: FormTableRowLayout? + + + <static>+defaultConstraints: BoxConstraints + <static>+defaultConstraintsNarrow: BoxConstraints + +body: Widget + +header: Widget? + +stickyHeader: bool + +constraints: BoxConstraints? + +scroll: bool + +padding: EdgeInsets? - - - - - - - - Widget Function(BuildContext)? + + + <static>+dynamic fromType() - - - + + + - - - TextStyle + + + BoxConstraints - - - - + + + + - - - FormTableRowLayout + + + BannerBox - - - +index: int - <static>+values: List<FormTableRowLayout> - <static>+vertical: FormTableRowLayout - <static>+horizontal: FormTableRowLayout + + + +prefixIcon: Widget? + +body: Widget + +style: BannerStyle + +padding: EdgeInsets? + +noPrefix: bool + +dismissable: bool + +isDismissed: bool? + +onDismissed: dynamic Function()? + +dismissIconSize: double - - - - - - - - - FormTableLayout - - + + + + - - - +rows: List<FormTableRow> - +columnWidths: Map<int, TableColumnWidth> - +rowDivider: Widget? - +rowLayout: FormTableRowLayout? - +rowLabelStyle: TextStyle? + + + BannerStyle - - - +Widget build() + + + +index: int + <static>+values: List<BannerStyle> + <static>+warning: BannerStyle + <static>+info: BannerStyle + <static>+error: BannerStyle - - - - - + + + + + - - - FormSectionHeader + + + HtmlStylingBanner - - - +title: String - +titleTextStyle: TextStyle? - +helpText: String? - +divider: bool - +helpTextDisabled: bool + + + +isDismissed: bool + +onDismissed: dynamic Function()? - - - +Widget build() + + + +Widget build() - - - - - - - - - FormLabel - - + + + + - - - +labelText: String? - +helpText: String? - +labelTextStyle: TextStyle? - +layout: FormTableRowLayout? + + + UnderConstruction - - - +Widget build() + + + +Widget build() - - - - - - - - ISyncIndicatorViewModel - - + + + + + - - - +isDirty: bool - +lastSynced: DateTime? + + + IconPack - - - - - - - - - SyncIndicator + + + <static>+defaultPack: List<IconOption> + <static>+material: List<IconOption> - - - +state: AsyncValue<T> - +lastSynced: DateTime? - +isDirty: bool - +animationDuration: int - +iconSize: double + + + <static>+IconOption? resolveIconByName() - - - - - + + + + + - - - ConstrainedWidthFlexible + + + IconOption - - - +minWidth: double - +maxWidth: double - +flex: int - +flexSum: int - +child: Widget - +outerConstraints: BoxConstraints + + + +name: String + +icon: IconData? + +isEmpty: bool + +props: List<Object?> - - - +Widget build() - -double _getWidth() + + + +String toJson() + <static>+IconOption fromJson() - - - - - + + + - - - HelpIcon + + + ReactiveIconPicker - - - +tooltipText: String? - - + + + + - - - +Widget build() + + + ReactiveFocusableFormField - - - + + + + + - - - NullHelperDecoration + + + IconPicker - - - - + + + +iconOptions: List<IconOption> + +selectedOption: IconOption? + +onSelect: void Function(IconOption)? + +galleryIconSize: double? + +selectedIconSize: double? + +focusNode: FocusNode? + +isDisabled: bool + + - - - InputDecoration + + + +Widget build() - - - + + + - - - ReactiveCustomColorPicker + + + void Function(IconOption)? - - - + + + - - - ReactiveFormField + + + FocusNode - - - - + + + + + - - - PrimaryButton + + + IconPickerField - - - +text: String - +icon: IconData? - +isLoading: bool - +showLoadingEarliestAfterMs: int - +onPressed: void Function()? - +tooltip: String - +tooltipDisabled: String - +enabled: bool - +onPressedFuture: dynamic Function()? - +innerPadding: EdgeInsets - +minimumSize: Size? - +isDisabled: bool + + + +iconOptions: List<IconOption> + +selectedOption: IconOption? + +selectedIconSize: double? + +galleryIconSize: double? + +onSelect: void Function(IconOption)? + +focusNode: FocusNode? + +isDisabled: bool + + + + + + +Widget build() - - - + + + + + - - - dynamic Function()? + + + IconPickerGallery - - - - + + + +iconOptions: List<IconOption> + +onSelect: void Function(IconOption)? + +iconSize: double + + - - - Size + + + +Widget build() - - - + + + - + StandardDialog - + +title: Widget? +titleText: String? @@ -14748,998 +14716,1030 @@ - + +Widget build() - - - - - + + + + - - - FormControlLabel + + + TwoColumnLayout - - - +formControl: AbstractControl<dynamic> - +text: String - +isClickable: bool - +textStyle: TextStyle? - +onClick: void Function(AbstractControl<dynamic>)? + + + <static>+defaultDivider: VerticalDivider + <static>+defaultContentPadding: EdgeInsets + <static>+slimContentPadding: EdgeInsets + +leftWidget: Widget + +rightWidget: Widget + +dividerWidget: Widget? + +headerWidget: Widget? + +flexLeft: int? + +flexRight: int? + +constraintsLeft: BoxConstraints? + +constraintsRight: BoxConstraints? + +scrollLeft: bool + +scrollRight: bool + +paddingLeft: EdgeInsets? + +paddingRight: EdgeInsets? + +backgroundColorLeft: Color? + +backgroundColorRight: Color? + +stretchHeight: bool - - - +Widget build() + + + + + + + + VerticalDivider - - - + + + + - - - void Function(AbstractControl<dynamic>)? + + + FormScaffold + + + + + + +formViewModel: T + +actions: List<Widget>? + +body: Widget + +drawer: Widget? + +actionsSpacing: double + +actionsPadding: double - - - - + + + + + - - - Search + + + ConstrainedWidthFlexible - - - +onQueryChanged: dynamic Function(String) - +searchController: SearchController? - +hintText: String? - +initialText: String? + + + +minWidth: double + +maxWidth: double + +flex: int + +flexSum: int + +child: Widget + +outerConstraints: BoxConstraints + + + + + + +Widget build() + -double _getWidth() - - - + + + + - - - dynamic Function(String) + + + ISyncIndicatorViewModel + + + + + + +isDirty: bool + +lastSynced: DateTime? - - - + + + + - - - void Function(String) + + + SyncIndicator + + + + + + +state: AsyncValue<T> + +lastSynced: DateTime? + +isDirty: bool + +animationDuration: int + +iconSize: double + + + + + + + + + + + + + StudyUException + + + + + + +message: String + + + + + + +String toString() - - - - - + + + + + - - - Badge + + + CountWhereValidator - - - +icon: IconData? - +color: Color? - +borderRadius: double - +label: String - +type: BadgeType - +padding: EdgeInsets - +iconSize: double? - +labelStyle: TextStyle? + + + +predicate: bool Function(T?) + +minCount: int? + +maxCount: int? + <static>+kValidationMessageMinCount: String + <static>+kValidationMessageMaxCount: String - - - +Widget build() - -Color? _getBackgroundColor() - -Color _getBorderColor() - -Color? _getLabelColor() + + + +Map<String, dynamic>? validate() - - - - + + + - - - BannerBox + + + bool Function(T?) - - - +prefixIcon: Widget? - +body: Widget - +style: BannerStyle - +padding: EdgeInsets? - +noPrefix: bool - +dismissable: bool - +isDismissed: bool? - +onDismissed: dynamic Function()? - +dismissIconSize: double + + + + + + + + Validator - - - - + + + + + - - - BannerStyle + + + StudyUMustMatchValidator - - - +index: int - <static>+values: List<BannerStyle> - <static>+warning: BannerStyle - <static>+info: BannerStyle - <static>+error: BannerStyle + + + +control: AbstractControl<dynamic>? + +matchingControl: AbstractControl<dynamic>? + + + + + + +Map<String, dynamic>? validate() - - - - + + + + - - - SplashPage + + + FieldValidators - - - +Widget build() + + + <static>+String? emailValidator() - - - - - - - - - ErrorPage - - + + + + - - - +error: Exception? + + + Patterns - - - +Widget build() + + + <static>+timeFormatString: String + <static>+emailFormatString: String + <static>+url: String - - - - - + + + + + - - - EmptyBody + + + NumericalRangeFormatter - - - +icon: IconData? - +leading: Widget? - +leadingSpacing: double? - +title: String? - +description: String? - +button: Widget? + + + +min: int? + +max: int? - - - +Widget build() + + + +TextEditingValue formatEditUpdate() - - - - - - - - TabbedNavbar - - + + + - - - +tabs: List<T> - +selectedTab: T? - +indicator: BoxDecoration? - +height: double? - +disabledBackgroundColor: Color? - +disabledTooltipText: String? - +onSelect: void Function(int, T)? - +labelPadding: EdgeInsets? - +labelSpacing: double? - +indicatorSize: TabBarIndicatorSize? - +isScrollable: bool - +backgroundColor: Color? - +labelColorHover: Color? - +unselectedLabelColorHover: Color? + + + TextInputFormatter - - - + + + + - - - BoxDecoration + + + StudySequenceFormatter - - - - - - - - void Function(int, T)? + + + +TextEditingValue formatEditUpdate() - - - + + + + + - - - TabBarIndicatorSize + + + SuppressedBehaviorSubject - - - - - - - - - MouseEventsRegion + + + +subject: BehaviorSubject<T> + +didSuppressInitialEvent: bool + -_controller: StreamController<T> - - - +onTap: void Function()? - +onHover: void Function(PointerHoverEvent)? - +onEnter: void Function(PointerEnterEvent)? - +onExit: void Function(PointerExitEvent)? - +autoselectCursor: bool - +cursor: SystemMouseCursor - <static>+defaultCursor: SystemMouseCursor - +autoCursor: SystemMouseCursor + + + -StreamController<T> _buildDerivedController() + +dynamic close() - - - + + + - - - void Function(PointerHoverEvent)? + + + StreamController - - - + + + + + - - - void Function(PointerEnterEvent)? + + + Tuple - - - - - - - - void Function(PointerExitEvent)? + + + +first: T1 + +second: T2 + +props: List<Object?> - - - - - - - - SystemMouseCursor + + + +Map<String, dynamic> toJson() + <static>+Tuple<dynamic, dynamic> fromJson() + +Tuple<T1, T2> copy() + +Tuple<T1, T2> copyWith() - - - - + + + + + - - - Collapsible + + + ExecutionLimiter - - - +contentBuilder: Widget Function(BuildContext, bool) - +headerBuilder: Widget Function(BuildContext, bool)? - +title: String? - +isCollapsed: bool + + + +milliseconds: int + <static>-_timer: Timer? - - - - - - - - Widget Function(BuildContext, bool) + + + +void dispose() - - - - + + + + - - - Widget Function(BuildContext, bool)? + + + Timer - - - - + + + + - - - SidesheetTab + + + Throttler - - - +builder: Widget Function(BuildContext) + + + +dynamic call() - - - - + + + + - - - Sidesheet + + + SerializableColor - - - <static>+kDefaultWidth: double - +titleText: String - +body: Widget? - +tabs: List<SidesheetTab>? - +actionButtons: List<Widget>? - +width: double? - +withCloseButton: bool - +ignoreAppBar: bool - +collapseSingleTab: bool - +bodyPadding: EdgeInsets? - +wrapContent: Widget Function(Widget)? + + + +Map<String, dynamic> toJson() + <static>+SerializableColor fromJson() - - - - + + + + + - - - FormSideSheetTab + + + CombinedStreamNotifier - - - +formViewBuilder: Widget Function(T) + + + -_subscriptions: List<StreamSubscription<dynamic>> + + + + + + +void dispose() - - - - - + + + - - - SingleColumnLayout + + + ChangeNotifier - - - <static>+defaultConstraints: BoxConstraints - <static>+defaultConstraintsNarrow: BoxConstraints - +body: Widget - +header: Widget? - +stickyHeader: bool - +constraints: BoxConstraints? - +scroll: bool - +padding: EdgeInsets? + + + + + + + + + Time - - - <static>+dynamic fromType() + + + <static>+dynamic fromTimeOfDay() + +Map<String, dynamic> toJson() + <static>+Time fromJson() - - - - - + + + - - - StudyULogo + + + TimeOfDay - - - +onTap: void Function()? + + + + + + + + + TimeValueAccessor - - - +Widget build() + + + +String modelToViewValue() + +Time? viewToModelValue() + -String _addLeadingZeroIfNeeded() - - - - - + + + - - - ActionMenuInline + + + ControlValueAccessor - - - +actions: List<ModelAction<dynamic>> - +iconSize: double? - +visible: bool - +splashRadius: double? - +paddingVertical: double? - +paddingHorizontal: double? + + + + + + + + + FileFormatEncoder - - - +Widget build() + + + +dynamic encodeAsync() + +String encode() + +dynamic call() - - - - - + + + + - - - IconPack + + + CSVStringEncoder - - - <static>+defaultPack: List<IconOption> - <static>+material: List<IconOption> + + + +String encode() - - - <static>+IconOption? resolveIconByName() + + + + + + + + + JsonStringEncoder + + + + + + +String encode() - - - - - + + + + + - - - IconOption + + + OptimisticUpdate - - - +name: String - +icon: IconData? - +isEmpty: bool - +props: List<Object?> + + + +applyOptimistic: void Function() + +apply: dynamic Function() + +rollback: void Function() + +onUpdate: void Function()? + +onError: void Function(Object, StackTrace?)? + +rethrowErrors: bool + +runOptimistically: bool + +completeFutureOptimistically: bool - - - +String toJson() - <static>+IconOption fromJson() + + + +dynamic execute() + -void _runUpdateHandlerIfAny() - - - + + + - - - ReactiveIconPicker + + + void Function() - - - + + + - - - ReactiveFocusableFormField + + + dynamic Function() - - - - - + + + - - - IconPicker + + + void Function(Object, StackTrace?)? - - - +iconOptions: List<IconOption> - +selectedOption: IconOption? - +onSelect: void Function(IconOption)? - +galleryIconSize: double? - +selectedIconSize: double? - +focusNode: FocusNode? - +isDisabled: bool + + + + + + + + + ModelAction - - - +Widget build() + + + +type: T + +label: String + +icon: IconData? + +onExecute: Function + +isAvailable: bool + +isDestructive: bool - - - + + + + - - - void Function(IconOption)? + + + ModelActionType - - - - - - - - FocusNode + + + +index: int + <static>+values: List<ModelActionType> + <static>+edit: ModelActionType + <static>+delete: ModelActionType + <static>+remove: ModelActionType + <static>+duplicate: ModelActionType + <static>+clipboard: ModelActionType + <static>+primary: ModelActionType - - - - - + + + + + - - - IconPickerField + + + JsonFileLoader - - - +iconOptions: List<IconOption> - +selectedOption: IconOption? - +selectedIconSize: double? - +galleryIconSize: double? - +onSelect: void Function(IconOption)? - +focusNode: FocusNode? - +isDisabled: bool + + + +jsonAssetsPath: String - - - +Widget build() + + + +dynamic loadJson() + +dynamic parseJsonMapFromAssets() + +dynamic parseJsonListFromAssets() - - - - - - - - - IconPickerGallery - - + + + + - - - +iconOptions: List<IconOption> - +onSelect: void Function(IconOption)? - +iconSize: double + + + IClipboardService - - - +Widget build() + + + +dynamic copy() - - - - - + + + + - - - TextParagraph + + + ClipboardService - - - +text: String? - +style: TextStyle? - +selectable: bool - +span: List<TextSpan>? + + + +dynamic copy() - - - +Widget build() + + + + + + + + + Notifications - - - - - - - - - - ActionPopUpMenuButton + + + <static>+passwordReset: SnackbarIntent + <static>+passwordResetSuccess: SnackbarIntent + <static>+studyDeleted: SnackbarIntent + <static>+inviteCodeDeleted: SnackbarIntent + <static>+inviteCodeClipped: SnackbarIntent + <static>+studyDeleteConfirmation: AlertIntent - - - +actions: List<ModelAction<dynamic>> - +triggerIconColor: Color? - +triggerIconColorHover: Color? - +triggerIconSize: double - +disableSplashEffect: bool - +hideOnEmpty: bool - +orientation: Axis - +elevation: double? - +splashRadius: double? - +enabled: bool - +position: PopupMenuPosition + + + + + + + + + SnackbarIntent - - - +Widget build() - -Widget _buildPopupMenu() + + + +duration: int? - - - + + + + - - - Axis + + + AlertIntent - - - - - - - - PopupMenuPosition + + + +title: String + +dismissOnAction: bool + +isDestructive: dynamic - - - - + + + + - - - FormScaffold + + + NotificationDefaultActions - - - +formViewModel: T - +actions: List<Widget>? - +body: Widget - +drawer: Widget? - +actionsSpacing: double - +actionsPadding: double + + + <static>+cancel: NotificationAction - - - - + + + + - - - Hyperlink + + + NotificationAction - - - +text: String - +url: String? - +onClick: void Function()? - +linkColor: Color - +hoverColor: Color? - +visitedColor: Color? - +style: TextStyle? - +hoverStyle: TextStyle? - +visitedStyle: TextStyle? - +icon: IconData? - +iconSize: double? + + + +label: String + +onSelect: dynamic Function() + +isDestructive: bool - - - - - + + + + + - - - SecondaryButton + + + NotificationIntent - - - +text: String - +icon: IconData? - +isLoading: bool - +onPressed: void Function()? + + + +message: String? + +customContent: Widget? + +icon: IconData? + +actions: List<NotificationAction>? + +type: NotificationType - - - +Widget build() + + + +void register() - - - - - - - - - HtmlStylingBanner - - + + + + - - - +isDismissed: bool - +onDismissed: dynamic Function()? + + + NotificationType - - - +Widget build() + + + +index: int + <static>+values: List<NotificationType> + <static>+snackbar: NotificationType + <static>+alert: NotificationType + <static>+custom: NotificationType - - - - - + + + + + - - - DismissButton + + + NotificationService - - - +onPressed: void Function()? - +text: String? + + + -_streamController: BehaviorSubject<NotificationIntent> - - - +Widget build() + + + +Stream<NotificationIntent> watchNotifications() + +void showMessage() + +void show() + +void dispose() - - - - + + + + - - - Assets + + + NotificationDispatcher - - - <static>+logoWide: String + + + +child: Widget? + +snackbarInnerPadding: double + +snackbarWidth: double? + +snackbarBehavior: SnackBarBehavior + +snackbarDefaultDuration: int + + + + + + + + + + + SnackBarBehavior diff --git a/docs/uml/designer_v2/lib/utils/uml.svg b/docs/uml/designer_v2/lib/utils/uml.svg index 265b70913..a33ec4722 100644 --- a/docs/uml/designer_v2/lib/utils/uml.svg +++ b/docs/uml/designer_v2/lib/utils/uml.svg @@ -1,12 +1,79 @@ - - [CombinedStreamNotifier + + [StudyUException | - -_subscriptions: List<StreamSubscription<dynamic>> + +message: String | - +void dispose() + +String toString() ] - [ChangeNotifier]<:-[CombinedStreamNotifier] + [Exception]<:--[StudyUException] + + [CountWhereValidator + | + +predicate: bool Function(T?); + +minCount: int?; + +maxCount: int?; + <static>+kValidationMessageMinCount: String; + <static>+kValidationMessageMaxCount: String + | + +Map<String, dynamic>? validate() + ] + + [CountWhereValidator]o-[bool Function(T?)] + [<abstract>Validator]<:-[CountWhereValidator] + + [StudyUMustMatchValidator + | + +control: AbstractControl<dynamic>?; + +matchingControl: AbstractControl<dynamic>? + | + +Map<String, dynamic>? validate() + ] + + [StudyUMustMatchValidator]o-[<abstract>AbstractControl] + [<abstract>Validator]<:-[StudyUMustMatchValidator] + + [FieldValidators + | + <static>+String? emailValidator() + ] + + [Patterns + | + <static>+timeFormatString: String; + <static>+emailFormatString: String; + <static>+url: String + ] + + [NumericalRangeFormatter + | + +min: int?; + +max: int? + | + +TextEditingValue formatEditUpdate() + ] + + [<abstract>TextInputFormatter]<:-[NumericalRangeFormatter] + + [StudySequenceFormatter + | + +TextEditingValue formatEditUpdate() + ] + + [<abstract>TextInputFormatter]<:-[StudySequenceFormatter] + + [SuppressedBehaviorSubject + | + +subject: BehaviorSubject<T>; + +didSuppressInitialEvent: bool; + -_controller: StreamController<T> + | + -StreamController<T> _buildDerivedController(); + +dynamic close() + ] + + [SuppressedBehaviorSubject]o-[BehaviorSubject] + [SuppressedBehaviorSubject]o-[StreamController] [Tuple | @@ -22,26 +89,6 @@ [<abstract>Equatable]<:-[Tuple] - [OptimisticUpdate - | - +applyOptimistic: void Function(); - +apply: dynamic Function(); - +rollback: void Function(); - +onUpdate: void Function()?; - +onError: void Function(Object, StackTrace?)?; - +rethrowErrors: bool; - +runOptimistically: bool; - +completeFutureOptimistically: bool - | - +dynamic execute(); - -void _runUpdateHandlerIfAny() - ] - - [OptimisticUpdate]o-[void Function()] - [OptimisticUpdate]o-[dynamic Function()] - [OptimisticUpdate]o-[void Function()?] - [OptimisticUpdate]o-[void Function(Object, StackTrace?)?] - [<abstract>ExecutionLimiter | +milliseconds: int; @@ -71,63 +118,22 @@ [<abstract>ExecutionLimiter]<:-[Throttler] - [<abstract>FileFormatEncoder - | - +dynamic encodeAsync(); - +String encode(); - +dynamic call() - ] - - [CSVStringEncoder - | - +String encode() - ] - - [<abstract>FileFormatEncoder]<:-[CSVStringEncoder] - - [JsonStringEncoder - | - +String encode() - ] - - [<abstract>FileFormatEncoder]<:-[JsonStringEncoder] - - [CountWhereValidator - | - +predicate: bool Function(T?); - +minCount: int?; - +maxCount: int?; - <static>+kValidationMessageMinCount: String; - <static>+kValidationMessageMaxCount: String + [SerializableColor | - +Map<String, dynamic>? validate() + +Map<String, dynamic> toJson(); + <static>+SerializableColor fromJson() ] - [CountWhereValidator]o-[bool Function(T?)] - [<abstract>Validator]<:-[CountWhereValidator] + [Color]<:-[SerializableColor] - [MustMatchValidator - | - +control: AbstractControl<dynamic>?; - +matchingControl: AbstractControl<dynamic>? + [CombinedStreamNotifier | - +Map<String, dynamic>? validate() - ] - - [MustMatchValidator]o-[<abstract>AbstractControl] - [<abstract>Validator]<:-[MustMatchValidator] - - [FieldValidators + -_subscriptions: List<StreamSubscription<dynamic>> | - <static>+String? emailValidator() + +void dispose() ] - [Patterns - | - <static>+timeFormatString: String; - <static>+emailFormatString: String; - <static>+url: String - ] + [ChangeNotifier]<:-[CombinedStreamNotifier] [Time | @@ -147,35 +153,50 @@ [<abstract>ControlValueAccessor]<:-[TimeValueAccessor] - [NumericalRangeFormatter + [<abstract>FileFormatEncoder | - +min: int?; - +max: int? + +dynamic encodeAsync(); + +String encode(); + +dynamic call() + ] + + [CSVStringEncoder | - +TextEditingValue formatEditUpdate() + +String encode() ] - [<abstract>TextInputFormatter]<:-[NumericalRangeFormatter] + [<abstract>FileFormatEncoder]<:-[CSVStringEncoder] - [StudySequenceFormatter + [JsonStringEncoder | - +TextEditingValue formatEditUpdate() + +String encode() ] - [<abstract>TextInputFormatter]<:-[StudySequenceFormatter] + [<abstract>FileFormatEncoder]<:-[JsonStringEncoder] - [<abstract>IProviderArgsResolver + [OptimisticUpdate | - +R provide() + +applyOptimistic: void Function(); + +apply: dynamic Function(); + +rollback: void Function(); + +onUpdate: void Function()?; + +onError: void Function(Object, StackTrace?)?; + +rethrowErrors: bool; + +runOptimistically: bool; + +completeFutureOptimistically: bool + | + +dynamic execute(); + -void _runUpdateHandlerIfAny() ] - [<abstract>JsonFileLoader - | - +jsonAssetsPath: String + [OptimisticUpdate]o-[void Function()] + [OptimisticUpdate]o-[dynamic Function()] + [OptimisticUpdate]o-[void Function()?] + [OptimisticUpdate]o-[void Function(Object, StackTrace?)?] + + [<abstract>IProviderArgsResolver | - +dynamic loadJson(); - +dynamic parseJsonMapFromAssets(); - +dynamic parseJsonListFromAssets() + +R provide() ] [ModelAction @@ -218,569 +239,586 @@ [ModelActionType]o-[ModelActionType] [Enum]<:--[ModelActionType] - [SuppressedBehaviorSubject - | - +subject: BehaviorSubject<T>; - +didSuppressInitialEvent: bool; - -_controller: StreamController<T> - | - -StreamController<T> _buildDerivedController(); - +dynamic close() - ] - - [SuppressedBehaviorSubject]o-[BehaviorSubject] - [SuppressedBehaviorSubject]o-[StreamController] - - [SerializableColor - | - +Map<String, dynamic> toJson(); - <static>+SerializableColor fromJson() - ] - - [Color]<:-[SerializableColor] - - [StudyUException + [<abstract>JsonFileLoader | - +message: String + +jsonAssetsPath: String | - +String toString() + +dynamic loadJson(); + +dynamic parseJsonMapFromAssets(); + +dynamic parseJsonListFromAssets() ] - [Exception]<:--[StudyUException] - - + - + - - - - - - - + + - + + - + - + + + - + - + + + + + + + - + - + - + - + + + - + - - - - - - - - - + - + - - - + + + + + + + + + + + + + + + + + - + - - - - - - - - - - - + - + - - - + - + - - + + + - - + - + - + + + - + - - - + - - - - - - + + + + + + - - - CombinedStreamNotifier + + + StudyUException - - - -_subscriptions: List<StreamSubscription<dynamic>> + + + +message: String - - - +void dispose() + + + +String toString() - - - + + + - - - ChangeNotifier + + + Exception - - - - - + + + + + - - - Tuple + + + CountWhereValidator - - - +first: T1 - +second: T2 - +props: List<Object?> + + + +predicate: bool Function(T?) + +minCount: int? + +maxCount: int? + <static>+kValidationMessageMinCount: String + <static>+kValidationMessageMaxCount: String - - - +Map<String, dynamic> toJson() - <static>+Tuple<dynamic, dynamic> fromJson() - +Tuple<T1, T2> copy() - +Tuple<T1, T2> copyWith() + + + +Map<String, dynamic>? validate() - - - + + + - - - Equatable + + + bool Function(T?) - - - - - + + + - - - OptimisticUpdate + + + Validator - - - +applyOptimistic: void Function() - +apply: dynamic Function() - +rollback: void Function() - +onUpdate: void Function()? - +onError: void Function(Object, StackTrace?)? - +rethrowErrors: bool - +runOptimistically: bool - +completeFutureOptimistically: bool + + + + + + + + + + StudyUMustMatchValidator - - - +dynamic execute() - -void _runUpdateHandlerIfAny() + + + +control: AbstractControl<dynamic>? + +matchingControl: AbstractControl<dynamic>? - - - - - - - - void Function() + + + +Map<String, dynamic>? validate() - - - + + + - - - dynamic Function() + + + AbstractControl - - - + + + + - - - void Function()? + + + FieldValidators + + + + + + <static>+String? emailValidator() - - - + + + + - - - void Function(Object, StackTrace?)? + + + Patterns + + + + + + <static>+timeFormatString: String + <static>+emailFormatString: String + <static>+url: String - - - - - + + + + + - - - ExecutionLimiter + + + NumericalRangeFormatter - - - +milliseconds: int - <static>-_timer: Timer? + + + +min: int? + +max: int? - - - +void dispose() + + + +TextEditingValue formatEditUpdate() - - - + + + - - - Timer + + + TextInputFormatter - - - - - + + + + - - - Debouncer + + + StudySequenceFormatter - - - +leading: bool - +cancelUncompleted: bool - -_uncompletedFutureOperation: CancelableOperation<dynamic>? + + + +TextEditingValue formatEditUpdate() - - - +dynamic call() + + + + + + + + + + SuppressedBehaviorSubject - - - - + + + +subject: BehaviorSubject<T> + +didSuppressInitialEvent: bool + -_controller: StreamController<T> + + - - - CancelableOperation + + + -StreamController<T> _buildDerivedController() + +dynamic close() - - - - + + + - - - Throttler + + + BehaviorSubject - - - +dynamic call() + + + + + + + + StreamController - - - - + + + + + - - - FileFormatEncoder + + + Tuple - - - +dynamic encodeAsync() - +String encode() - +dynamic call() + + + +first: T1 + +second: T2 + +props: List<Object?> + + + + + + +Map<String, dynamic> toJson() + <static>+Tuple<dynamic, dynamic> fromJson() + +Tuple<T1, T2> copy() + +Tuple<T1, T2> copyWith() - - - - + + + - - - CSVStringEncoder + + + Equatable - - - +String encode() + + + + + + + + + + ExecutionLimiter - - - - - + + + +milliseconds: int + <static>-_timer: Timer? + + - - - JsonStringEncoder + + + +void dispose() - - - +String encode() + + + + + + + + Timer - - - - - + + + + + - - - CountWhereValidator + + + Debouncer - - - +predicate: bool Function(T?) - +minCount: int? - +maxCount: int? - <static>+kValidationMessageMinCount: String - <static>+kValidationMessageMaxCount: String + + + +leading: bool + +cancelUncompleted: bool + -_uncompletedFutureOperation: CancelableOperation<dynamic>? - - - +Map<String, dynamic>? validate() + + + +dynamic call() - - - + + + - - - bool Function(T?) + + + CancelableOperation - - - + + + + - - - Validator + + + Throttler - - - - - - - - - - MustMatchValidator + + + +dynamic call() - - - +control: AbstractControl<dynamic>? - +matchingControl: AbstractControl<dynamic>? + + + + + + + + + SerializableColor - - - +Map<String, dynamic>? validate() + + + +Map<String, dynamic> toJson() + <static>+SerializableColor fromJson() - - - + + + - - - AbstractControl + + + Color - - - - + + + + + - - - FieldValidators + + + CombinedStreamNotifier - - - <static>+String? emailValidator() + + + -_subscriptions: List<StreamSubscription<dynamic>> - - - - - - - - - Patterns + + + +void dispose() - - - <static>+timeFormatString: String - <static>+emailFormatString: String - <static>+url: String + + + + + + + + ChangeNotifier - - + + - + Time - + <static>+dynamic fromTimeOfDay() +Map<String, dynamic> toJson() @@ -791,9 +829,9 @@ - + - + TimeOfDay @@ -802,16 +840,16 @@ - - + + - + TimeValueAccessor - + +String modelToViewValue() +Time? viewToModelValue() @@ -822,127 +860,178 @@ - + - + ControlValueAccessor - - - - - + + + + - - - NumericalRangeFormatter + + + FileFormatEncoder - - - +min: int? - +max: int? + + + +dynamic encodeAsync() + +String encode() + +dynamic call() - - - +TextEditingValue formatEditUpdate() + + + + + + + + + CSVStringEncoder + + + + + + +String encode() - - - + + + + - - - TextInputFormatter + + + JsonStringEncoder + + + + + + +String encode() - - - - + + + + + - - - StudySequenceFormatter + + + OptimisticUpdate - - - +TextEditingValue formatEditUpdate() + + + +applyOptimistic: void Function() + +apply: dynamic Function() + +rollback: void Function() + +onUpdate: void Function()? + +onError: void Function(Object, StackTrace?)? + +rethrowErrors: bool + +runOptimistically: bool + +completeFutureOptimistically: bool + + + + + + +dynamic execute() + -void _runUpdateHandlerIfAny() - - - - + + + - - - IProviderArgsResolver + + + void Function() - - - +R provide() + + + + + + + + dynamic Function() - - - - - + + + - - - JsonFileLoader + + + void Function()? - - - +jsonAssetsPath: String + + + + + + + + void Function(Object, StackTrace?)? - - - +dynamic loadJson() - +dynamic parseJsonMapFromAssets() - +dynamic parseJsonListFromAssets() + + + + + + + + + IProviderArgsResolver + + + + + + +R provide() - - + + - + ModelAction - + +type: T +label: String @@ -956,9 +1045,9 @@ - + - + IconData @@ -967,16 +1056,16 @@ - - + + - + IModelActionProvider - + +List<ModelAction<dynamic>> availableActions() @@ -985,16 +1074,16 @@ - - + + - + IListActionProvider - + +void onSelectItem() +void onNewItem() @@ -1004,16 +1093,16 @@ - - + + - + ModelActionType - + +index: int <static>+values: List<ModelActionType> @@ -1029,127 +1118,38 @@ - + - + Enum - - - - - - - - - SuppressedBehaviorSubject - - - - - - +subject: BehaviorSubject<T> - +didSuppressInitialEvent: bool - -_controller: StreamController<T> - - - - - - -StreamController<T> _buildDerivedController() - +dynamic close() - - - - - - - - - - - BehaviorSubject - - - - - - - - - - - StreamController - - - - - - - - - - - - SerializableColor - - - - - - +Map<String, dynamic> toJson() - <static>+SerializableColor fromJson() - - - - - - - - - - - Color - - - - - - - - - - - - - StudyUException - - + + + + + - - - +message: String + + + JsonFileLoader - - - +String toString() + + + +jsonAssetsPath: String - - - - - - - - Exception + + + +dynamic loadJson() + +dynamic parseJsonMapFromAssets() + +dynamic parseJsonListFromAssets()